PHPにてXML形式の内容をファイルに保存 [備忘録]
< PHP XML >
[PHP] APIで取得したXMLの内容をファイルに保存する |
APIで取得したXML形式のデータをXMLファイルに保存する方法のメモ [1] APIで下記のようなXMLを取得し変数に入れる $xml = ' <?xml version="1.0" encoding="utf-8"?> <Title> <Value> <Name>記事のタイトル</Name> <Time>2012-11-15 02:22:59</Time> <ID>0e444</ID> <Content>記事の内容</Content> <Url>so-net.ne.jp</Url> </Value> </Title> '; [2] XMLファイルに書き込む $fileName = 'test.xml'; $dom = new domDocument; $dom->loadXML($xml); $dom->save($fileName); |
WinSCP [備忘録]
< WinSCP >
■秘密鍵変換方法 |
ログイン時に秘密キーを設定する場合 WinSCPではPuTTY形式でしか設定できない。 もし秘密キーがOpenSSH SSH-2形式の場合、PuTTY形式に変換する必要がある。 変換方法はC:/Program Files/WinSCP/PuTTYディレクトリにあるputtygen.exeを実行し Fileから「Load Privet key」を選択し、キーファイルを選択する。 選択後、パスワードを入力すると変換される。 変換した内容をFileの「Save private key」を選んで保存する。 WinSCPを実行後、キーを変換したファイルを指定してログインするとログインできるようになる。 |
PHP・ディレクトリ配下にあるファイルを取得 [備忘録]
< PHP・ディレクトリ配下にあるファイルを取得 >
■実装例 /*********************************** * ディレクトリ配下のファイルを取得 ***********************************/ function getFileList(){ $list = array(); $list_dir = "./playlist"; /*-------------------------------- * ディレクトリ指定 *--------------------------------*/ $root = getcwd(); // 現在のディレクトリを取得 $path = $root.$list_dir; chdir($path); // ファイルのあるディレクトリに移動 /*-------------------------------- * ディレクトリ配下のファイルを取得 *--------------------------------*/ $strDir = @opendir($path); while(false !== ($file = readdir($strDir))){ if(is_file($file)){ // ファイル名取得 $file_name = basename($file, '.csv'); // 拡張子を取る $list[$file] = $file_name; } } @closedir($strDir); return($list); } |
タグ:PHP
PHP・複数の多次元の配列をソートする [備忘録]
< PHP・連想配列のキーでソート >
以下のような連想配列があった場合に特定のキーでソートを実行させたい $album = array(0 => array('album_name' => 'realtime to paradaise', 'cnt' => 1, 'music_title' => 'さよならのオーシャン', 'artist' => '杉山清貴', 'time' => '5:23'), 1 => array('album_name' => 'realtime to paradaise', 'cnt' => 2, 'music_title' => 'shadow', 'artist' => '杉山清貴', 'time' => '4:09') ) |
■曲名でソートをさせたい場合はキーである'music_title'にて配列を定義する foreach($album as $cnt => $val){ $data[$cnt] = $val['music_title']; // 曲名でソート } if($sort == "asc"){ array_multisort($data, SORT_ASC, SORT_STRING, $album); } else { array_multisort($data, SORT_DESC, SORT_STRING, $album); } var_dump($album); |
タグ:PHP
perlでの並列処理(fork編) [備忘録]
< perlでの並列処理(fork編) >
・子プロセスが終了するまで親は待つバージョン |
#!/usr/bin/perl use strict; # 親プロセスの処理 if (my $pid = fork()) { wait(); # 子プロセスの終了を待つ # 子プロセスの処理 } else { my $rtn = sub_test($i); exit(0); } print "End.\n"; ※これだと子プロセス処理の結果が親には分からない。 |
・子プロセスの処理結果を見たい場合は下記のようにするといいみたい |
#!/usr/bin/perl use strict ; $SIG{CHLD} = \&reaper; $SIG{PIPE} = 'IGNORE'; # fork処理を3回実行 for (my $i = 0; $i < 3; $i++ ){ # 親プロセスの処理 if (my $pid = fork()) { print "Oya process pid = ".$pid."\n"; # 子プロセスの処理 } else { $SIG{CHLD} = 'DEFAULT'; my $rtn = sub_test($i); if( $rtn == 0 ){ exit(0); # 成功 } else { exit(1); # 失敗 } } } # sleepしている間に子プロセスが終了するようにし、 # repearにて子プロセスの結果を取得する # sub_test($i)の結果取得 for (my $i = 0; $i < 3; $i++ ){ sleep(10); } print "main end \n"; # $SIG{CHILD}に対するハンドラー # (親プロセスに置ける処理) sub reaper() { $SIG{CHLD} = 'IGNORE'; my ( $pid ); while( ( $pid = waitpid( -1, WNOHANG ) ) > 0 ){ # 子プロセスの結果を取得(exit値) my $result = $?; print "[ transaction child status ]: $result \n"; } $SIG{CHLD} = \&reaper; } |
・子プロセスの処理結果を見たい場合は下記のようにするといいみたい
(連想配列に結果を設定)
|
#!/usr/bin/perl
use strict; # グローバル定義 my %hash = ( 1 => { PID => 0, STATUS => -1 }, 2 => { PID => 0, STATUS => -1 }, 3 => { PID => 0, STATUS => -1 } ); $SIG{CHLD} = \&reaper; $SIG{PIPE} = 'IGNORE'; # fork処理を3回実行 for (my $i = 0; $i < 3; $i++ ){ # 親プロセスの処理 if (my $pid = fork()) { print "Oya process pid = ".$pid."\n"; # 子プロセスの処理 } else { $SIG{CHLD} = 'DEFAULT'; my $rtn = sub_test($i); if( $rtn == 0 ){ exit(0); # 成功 } else { exit(1); # 失敗 } } } # 子プロセスが終了する前に親プロセスが終了してしまうので # その対策 # 無限ループにし親のプロセスを生かせておく while(1){ # 子プロセスが終了しているかチェック if( $hash{1}->{STATUS} != -1 && $hash{2}->{STATUS} != -1 && $hash{3}->{STATUS} != -1 ){ last; } } # 子プロセスの処理結果を確認 for ( $i = 1; $i < 4; $i++ ){ unless ( $hash{$i}->{STATUS} == 0 ){ $status = -30 - $i; return ( { STATUS => $status } ); } } |
タグ:perl
perlでの構文チェックとデバッグ [備忘録]
< perl 構文チェックとデバッグ >
・構文チェック |
perl -wc file c:構文チェック w:スペルミスや一度しか使わない変数などに警告を出す |
・デバッグ |
perl -d [file名] 上の文、実行後、 l:リスト表示 b:ブレークポイントの設定 p:値を表示 r:実行 s:行ごと実行 p:値表示 q:終了 h:ヘルプ |
タグ:perl
perlでファイル検査 [備忘録]
< perlでファイル検査 >
■ファイル検査 |
-d # ディレクトリであれば -f # 通常ファイルであれば $$ # プロセスID $! # エラー番号、もしくはエラー文字列 -e # 存在すれば -r # 読み込み可能であれば -w # 書き込み可能であれば -x # 実行可能であれば -o # 自分のものであれば -R # 実uid/gidで読み込み可能であれば -W # 実uid/gidで書き込み可能であれば -X # 実uid/gidで実行可能であれば -O # 実uidのものであれば -e # 存在すれば -z # サイズが0であれば -s # サイズが0でなければ(ファイルサイズを返す) -f # 通常ファイルであれば -d # ディレクトリであれば -l # シンボリックリンクであれば -p # 名前付きパイプであれば -S # ソケットであれば -b # ブロック型スペシャルファイルであれば -c # キャラクタ型スペシャルファイルであれば -u # setuidビットが立っていれば -g # setgifビットが立っていれば -k # stickyビットが立っていれば -t # ファイルハンドルが tty としてオープンされていれば -T # ファイルがテキストファイルであれば -B # ファイルがバイナリファイルであれば -M # perl起動時における、ファイルの更新時刻からの日数 -A # perl起動時における、ファイルの参照時刻からの日数 -C # perl起動時における、ファイルの作成時刻からの日数 |
タグ:perl
perlで変数の中身を表示 [備忘録]
< perlで変数の中身を表示 >
参照:http://fleur.hio.jp/perldoc/mix/lib/Data/Dumper.ja.html
■Dumper 変数の中身を表示 |
use Data::Dumper; print Dumper($data); print Dumper(@data); print Dumper(%data); |
参照:http://fleur.hio.jp/perldoc/mix/lib/Data/Dumper.ja.html
タグ:perl
perlでホスト名取得 [備忘録]
< perlでホスト名取得 >
■ホスト名取得 |
$addr = "127.0.0.1"; $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); |
■リモートホスト名を取得 |
$addr = $ENV{'REMOTE_ADDR'}; $host = gethostbyaddr(pack("C4", split(/\./, $addr)), 2); |
タグ:perl
perlでの並列処理・threadsモジュール使用 [備忘録]
< perlでの並列処理(threads編) >
■threadsモジュールを使って並列処理を実施 |
#!/usr/bin/perl use strict; use threads; # モジュール定義 my @threads; my $i; my $rtn; # 3並列させる場合 for ( $i = 0; $i < 3; $i++ ){ # threads->new():スレッドを生成する。 # 第1引数はそのスレッド内で動作させる関数(thread_test)を、 # 第2引数以降は第1引数で指定した関数にわたるパラメータ($i)となります。 $threads[$i] = threads->new(\&thread_test, $i); } for ( $i = 0; $i < 3; $i++ ){ # join:スレッドを実行します。 $rtn = $thread[$i]->join; print "rtn = ".$rtn."\n"; } # スレッドの実行権を別のスレッドに渡します。 threads->yield(); # 並列処理をさせる関数 sub thread_test(){ my $num = shift; print "num = ".$num."\n"; return( $num ); } |
#-------------------------------------------- # threadsにもいろいろオプションがあるようだ #-------------------------------------------- 参照:http://docs.activestate.com/activeperl/5.10/lib/threads.html 参照:http://fleur.hio.jp/perldoc/mix/pragma/threads.html |
タグ:perl
Linuxコマンド・cron関連 [備忘録]
< Linux cron関連 >
・cron |
■■cat /etc/cron.d/bk_opt_script ■■ls -ltr /var/log/cron* ■■view /var/log/cron ■■ls -l /var/log/cron ■■ps -eaf | grep cron ■■chkconfig --list | grep cron ■■ls -ltr /var/log/boot.log ■■ps -eaf ■■/etc/rc.d/init.d/crond restart |
タグ:linux
Linuxコマンド・パッケージ関連 [備忘録]
< Linux パッケージ関連 >
・パッケージは確かにインストールされているか? |
■■rpm -q make |
・本当に /usr/bin/makeはあるか? |
■■ls /usr/bin/make |
・which コマンドで認識されるか? |
■■which make |
・フルパスで実行したらどうなるか? |
■■/usr/bin/make |
タグ:linux
Linuxコマンド・ディスク使用量確認関連 [備忘録]
< ディスク使用量確認関連 >
・ディレクトリ配下の使用量を確認する |
■■du -sh /vservers/v152/* |grep G ■■du -h |
・ディレクトリ使用量を確認する |
■■ls -shl 1020144/etc/httpd/logs/ ■■total 17G ■■14G -rw-r--r-- 1 root root 14G Mar 25 20:09 access_log ■■2.7G -rw-r--r-- 1 root root 2.7G Mar 25 20:09 access_log_talewiki.com ■■174M -rw-r--r-- 1 root root 174M Mar 25 20:09 error_log |
・システム系使用量を確認する |
■■df -h ■■Filesystem Size Used Avail Use% Mounted on ■■/dev/cciss/c0d0p2 12G 4.0G 7.8G 34% / ■■/dev/cciss/c0d0p8 5.9G 2.2G 3.7G 37% /opt ■■/dev/cciss/c0d0p7 12G 1.4G 11G 12% /usr ■■/dev/cciss/c0d0p6 24G 61M 24G 1% /tmp ■■/dev/cciss/c0d0p3 60G 48G 11G 82% /var ■■/dev/cciss/c0d0p1 1.2G 73M 1.1G 7% /boot ■■tmpfs 12G 0 12G 0% /dev/shm |
タグ:linux
Linuxコマンド・ファイル or ディレクトリ情報取得方法 [備忘録]
< ファイル・ディレクトリ情報取得 >
属性
表示 8進数 説明
- 010 一般のファイル
d 004 ディレクトリ
l 012 シンボリックリンクファイル
c 002 文字型デバイスファイル
b 006 ブロック方デバイスファイル
s 014 ソケット
p 001 名前つきパイプ
参照:http://d.hatena.ne.jp/shibainu55/20081201/1228143691
参照:http://itpro.nikkeibp.co.jp/article/Keyword/20070420/269052/
・find・grep |
■■find . -type f -name "*" | xargs grep "検索名" |
・タイムスタンプも表示 |
■■ls -ltrc |
・時間の出力に秒単位の情報を含んでいる |
■■ls -ltr --full-time |
・ディレクトリ配下のファイルも表示 |
■■ls -lR |
・ディレクトリ+ファイルを表示したい!! |
■■find /tmp -exec ls -ld --full-time {} \; ■■tree -s > /tmp/hoge.txt |
・ドット・ファイル(ファイル名の先頭にピリオドがあるファイル)を含んだすべてのファイルを表示する |
■■ls -a, --all |
属性
表示 8進数 説明
- 010 一般のファイル
d 004 ディレクトリ
l 012 シンボリックリンクファイル
c 002 文字型デバイスファイル
b 006 ブロック方デバイスファイル
s 014 ソケット
p 001 名前つきパイプ
参照:http://d.hatena.ne.jp/shibainu55/20081201/1228143691
参照:http://itpro.nikkeibp.co.jp/article/Keyword/20070420/269052/
タグ:linux
Perl DBアクセス結果がハッシュだった場合の定義方法・その1 [備忘録]
#===============================================================
# 変数="key"=>[配列A]、配列A={連想配列}の定義の仕方
#
# ※DBアクセスしてその結果を取得する手段として利用
#
#===============================================================
# 変数="key"=>[配列A]、配列A={連想配列}の定義の仕方
#
# ※DBアクセスしてその結果を取得する手段として利用
#
#===============================================================
my ($db_ref); # DBアクセス結果が「key=>[配列{配列の中身は連想配列}]だった場合、 # 下記のような結果が返ってくる $db_ref = {"/file-01-01"=>[{"ID"=>"7005218","OSID"=>005}], "/file-01-02"=>[{"ID"=>"7005248","OSID"=>003}], "/file01-03"=>[{"ID"=>"7005246","OSID"=>001}], "STATUS"=>"0"}; # $db_refがハッシュであることを確認 print "db_ref = ".$db_ref."\n"; # HASH # キーを取得しループする foreach $key ( keys ( %{ $db_ref } ) ) { # キーの値を確認 print "key = ".$key."\n"; # ARRAYであることを確認 print "db_ref->{key} = ".$db_ref->{$key}."\n"; # {"/backup701-01-01"=>[ここがARRAY]} # キーの値が配列だった場合ループする if( ref( $db_ref->{$key} ) eq 'ARRAY' ){ foreach $arr( @{ $db_ref->{$key} } ){ # 配列の中身はハッシュなのでそれぞれ表示させる print "ID = ".$arr->{ID}." || OSID =".$arr->{OSID}."\n"; $list = sprintf( "%s,%s,%03d", $key, $arr->{ID},$arr->{OSID} ); push( @all_list, $list ); } } } # 最後にSTATUSの値を確認 print "db_ref->{STATUS} = ".$db_ref->{'STATUS'}."\n"; exit; |
Perl > Getopt [備忘録]
http://www.booran.com/menu/perl/getopt.html
パラメータの受け取り
Getoptを使って、実行するスクリプトのパラメータの判定が容易にできる。モジュールは、
Getopt::Std, Getopt::Longがあり、若干使いかたが異なる。
Getopt::Std;
Getopt::Stdでロードする利点は、各パラメータを容易に指定できる。
与えるパラメータは一字である。(-m, -nとか)。パラメータを指定するには、getoptとgetoptsの二2つがある。
getoptもgetoptsも引数にオプション名を指定する。
getopt "sn";
getoptとgetoptsの違いは、getoptはオプションの後には引数を必ずともない、getopts は引数を受け取るオプションか引数のいらないオプションかを指定できる。getoptsのオプションの後にコロンをつけると、そのオプションは引数を受け取るという意味になる。オプションが引数を受け取らない設定をし、オプションをONにした時は1となる
また、getoptsは指定していないオプションをつけて実行すると、警告を出す。
オプションで指定された値は、$opt_*(*は、オプション名)にセットされる。
getoptの例
use Getopt::Std;
getopt "mln";
#オプションs,m,lは、$opt_*に入る
print "opt_m = $opt_m\n";
print "opt_l = $opt_l\n";
print "opt_n = $opt_n\n";
実行例
#./test.pl -l 123 -m 5
opt_m = 5
opt_l = 123
opt_n =
#./test.pl -l123 --mn -n=3
opt_m = n
opt_l = 123
opt_n = =3
getoptsの例
use Getopt::Std;
%opts = ();
#ハッシュに格納
#m, lは引数を受け取らない
#nは引数を受け取る
#ちなみに、getoptでもハッシュ指定できる
getopts ("mln:", \%opts);
foreach $key(keys %opts ) {
print "$key = $opts{$key}\n";
}
実行例
#./test.pl -lm
l = 1
m = 1
#./test.pl -l -m 3
l = 1
m = 3
#./test.pl -k
l =
Unknown option: k
パラメータの受け取り
Getoptを使って、実行するスクリプトのパラメータの判定が容易にできる。モジュールは、
Getopt::Std, Getopt::Longがあり、若干使いかたが異なる。
Getopt::Std;
Getopt::Stdでロードする利点は、各パラメータを容易に指定できる。
与えるパラメータは一字である。(-m, -nとか)。パラメータを指定するには、getoptとgetoptsの二2つがある。
getoptもgetoptsも引数にオプション名を指定する。
getopt "sn";
getoptとgetoptsの違いは、getoptはオプションの後には引数を必ずともない、getopts は引数を受け取るオプションか引数のいらないオプションかを指定できる。getoptsのオプションの後にコロンをつけると、そのオプションは引数を受け取るという意味になる。オプションが引数を受け取らない設定をし、オプションをONにした時は1となる
また、getoptsは指定していないオプションをつけて実行すると、警告を出す。
オプションで指定された値は、$opt_*(*は、オプション名)にセットされる。
getoptの例
use Getopt::Std;
getopt "mln";
#オプションs,m,lは、$opt_*に入る
print "opt_m = $opt_m\n";
print "opt_l = $opt_l\n";
print "opt_n = $opt_n\n";
実行例
#./test.pl -l 123 -m 5
opt_m = 5
opt_l = 123
opt_n =
#./test.pl -l123 --mn -n=3
opt_m = n
opt_l = 123
opt_n = =3
getoptsの例
use Getopt::Std;
%opts = ();
#ハッシュに格納
#m, lは引数を受け取らない
#nは引数を受け取る
#ちなみに、getoptでもハッシュ指定できる
getopts ("mln:", \%opts);
foreach $key(keys %opts ) {
print "$key = $opts{$key}\n";
}
実行例
#./test.pl -lm
l = 1
m = 1
#./test.pl -l -m 3
l = 1
m = 3
#./test.pl -k
l =
Unknown option: k
Perl qw クォート [備忘録]
「リスト」の要素として文字列を指定する場合にクォートを用いるが,
qw/ / を用いると,スペースで区切られた文字列をリストの各要素として扱ってくれるので,
すべての要素を引用符で囲み,コンマで区切る必要がなくなる。
qw/Sun Mon Tue Wed Thu Fri Sat/
← "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" に相当
文脈によっては,qw/ / 全体を ( ) で括る必要がある。
( ) が不要な例
--------------------------------------------------
@array = qw/Sun Mon Tue Wed Thu Fri Sat/;
print $array[1]; #Mon を出力
--------------------------------------------------
( ) が必要な例
--------------------------------------------------
print (qw/Sun Mon Tue Wed Thu Fri Sat/)[1]; #Mon を出力
#!/usr/bin/perl
use strict;
use warnings;
my @nums1 = ('one', 'two', 'three');
my @nums2 = qw/one two three/;
print "@nums1\n";
print "@nums2\n";
qw/ / を用いると,スペースで区切られた文字列をリストの各要素として扱ってくれるので,
すべての要素を引用符で囲み,コンマで区切る必要がなくなる。
qw/Sun Mon Tue Wed Thu Fri Sat/
← "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" に相当
文脈によっては,qw/ / 全体を ( ) で括る必要がある。
( ) が不要な例
--------------------------------------------------
@array = qw/Sun Mon Tue Wed Thu Fri Sat/;
print $array[1]; #Mon を出力
--------------------------------------------------
( ) が必要な例
--------------------------------------------------
print (qw/Sun Mon Tue Wed Thu Fri Sat/)[1]; #Mon を出力
#!/usr/bin/perl
use strict;
use warnings;
my @nums1 = ('one', 'two', 'three');
my @nums2 = qw/one two three/;
print "@nums1\n";
print "@nums2\n";
forkとは [備忘録]
親プロセスが,子プロセスを生成するときに発行するシステム・コール。プロセスがforkシステム・コールを呼び出すと,そのプロセスのコピーができ子プロセスとして実行されます。子プロセスは親プロセスから,オープンしているファイル・ディスクリプタなどを受け継ぎます。
例えば,シェル上でコマンド(アプリケーション)を実行すると,シェルがそのコマンドの親となります。シェルがforkを発行して,子プロセスができますが,このときの子プロセスはシェルのコピーです。子プロセスがexecシステム・コールを発行することで,本来のコマンドとして独立して動くようになります。
なおLinuxで稼動するすべてのプロセスには一人の祖先がいます。この偉大なる母は「init」というプロセスです。
fork の活用例。
この状態でブラウザから簡易 HTTP サーバへ接続を試みると,画面2のブラウザのようにページがいつまで経っても表示されない。 TELNET 接続が1つ目のクライアント接続で,ブラウザからの接続が2つ目のクライアント接続となる。簡易 HTTP サーバは同時に1つのクライアント接続しか処理できないため,1つ目のクライアント接続が終了しない限り,2つ目以降のクライアントへのサービスを提供できない。この状態が DoS 状態(サービス不能状態)である。
例えば,シェル上でコマンド(アプリケーション)を実行すると,シェルがそのコマンドの親となります。シェルがforkを発行して,子プロセスができますが,このときの子プロセスはシェルのコピーです。子プロセスがexecシステム・コールを発行することで,本来のコマンドとして独立して動くようになります。
なおLinuxで稼動するすべてのプロセスには一人の祖先がいます。この偉大なる母は「init」というプロセスです。
fork の活用例。
この状態でブラウザから簡易 HTTP サーバへ接続を試みると,画面2のブラウザのようにページがいつまで経っても表示されない。 TELNET 接続が1つ目のクライアント接続で,ブラウザからの接続が2つ目のクライアント接続となる。簡易 HTTP サーバは同時に1つのクライアント接続しか処理できないため,1つ目のクライアント接続が終了しない限り,2つ目以降のクライアントへのサービスを提供できない。この状態が DoS 状態(サービス不能状態)である。