[PHP] : SimpleXMLElement Objectの参照 内容 久しぶりにxmlをパースする処理を書いていたんだけど、SimpleXMLElement Objectの参照方法を忘れていたのでメモをしておく。(20120416追記) 今まではサンプルプログラム中のforeachで$resultに添字$iでインクリメントして値を代入していましたが、$iを使わずに配列の[]を使って右辺のarray型を代入するように修正しました。
xmlサンプル xml version="1.0"encoding="Shift-Jis"? ソフトバンク株式会社 http://www.softbank.co.jp/ 楽天株式会社 http://www.rakuten.co.jp/info/ simplexml_load_string関数 PHPの関数によりSimpleXMLElement ObjectとしてParseを行う。SimpleXMLElement Objectを更にPHP配列に整形してゆく。
$xml = XML ソフトバンク株式会社 http://www.softbank.co.jp/ 楽天株式会社 http://www.rakuten.co.jp/info/ XML; print( $xml . "\n" ); $data = simplexml_load_string( $xml ); print_r( $data ); simplexml_load_string関数の実行結果 xmlがSimpleXMLElement Objectに変換されていることが分かる。
SimpleXMLElement Object ( [company] = Array ( [0] = SimpleXMLElement Object ( [name] = ソフトバンク株式会社 [url] = http://www.
[PHP] : 超簡単なインスタンスコンテナ 動的編 概要 以前のエントリで超簡単なインスタンスコンテナというタイトルで記事を書きましたが、
コンテナに格納できるインスタンスが静的に呼び出されるものだったので、
動的に呼び出されるように修正してみました。以前のエントリは以下のものです。
http://d.hatena.ne.jp/yutakikuchi/20100907/1283877423
改良したインスタンスコンテナ class Container { static private $instance_ = array(); private function __construct() {} static public function get( $class, $path = null ) { if( isset( self::$instance_[ $path ] ) ) { return self::$instance_[ $path ]; } if( !is_readable( $path ) ) { throw new Exception(); } require_once $path; $instance = new $class; self::add( $path, $instance ); return $instance; } static public function add( $path, $instance ) { if( !
[PHP] : SQLのQUERY生成でsprintfを使いたくない 内容 sprintfは見た長い文字列を書き足しやすくするための関数で、SQLの生成ではできるだけ使いたくない。 sprintfは型の指定が入るので、特にnullなどの扱いに気をつけないといけない。 sprintf + LIKE文を作ろうとすると %を多用するので、LIKE "%%%s%%"といった指定になり、見づらい。 例 $sql = sprintf( "INERT INTO %s.%s (%s,%s) value(%s,%s) WHERE id = %s ", "mysql", "test", "name", "key", null, null, 7 ); echo $sql . "\n"; $sql = sprintf( "SELECT * FROM %s.%s WHERE id = %d AND name LIKE '%%%s%%' ", "mysql", "test", 1, "hoge" ); echo $sql . "\n"; 出力SQL文 INERT INTO mysql.
[Python] : Google app engineでBeautifulsoupを使う 概要 GAEでHTMLをパースして加工したいのでBeautifulsoupというモジュールをインストールして使う。 デフォルトGAE環境では利用できないのでBeautifulsoupファイルをアップして使う。 環境 System環境 : iMac.local 10.4.0 Darwin Kernel Version 10.4.0: Fri Apr 23 18:28:53 PDT 2010; root:xnu-1504.7.4~1/RELEASE_I386 i386 python : Python 2.5.5 ダウンロード 圧縮ファイルダウンロードおよび解凍 fetch 'http://www.crummy.com/software/BeautifulSoup/download/3.x/BeautifulSoup-3.0.8.tar.gz' tar -xzf BeautifulSoup-3.0.8.tar.gz インストール 解凍したディレクトリに移動し以下のコマンドを実行
$ python setup.py install running install running build running build_py running install_lib running install_egg_info Removing /opt/local/Library/Frameworks/Python.framework/Versions/2.5/lib/python2.5/site-packages/BeautifulSoup-3.0.8-py2.5.egg-info Beautifulsoup.
[Mysql] : Mysqlのメモ 概要 学生の課題みたいだけど、学校の成績管理表を作成してみる。
外部KEYの使い方についてのメモです。
tableの定義 # 生徒管理テーブル(student)
# 科目管理テーブル(subject)
# 成績管理テーブル(score)
ER図
やりたい事 # 1つのテーブルでデータの重複をさせない制約をつける。
# 生徒管理テーブルからデータがUPDATE/DELETEされたら、成績管理テーブルからもデータをUPDATE/DELETE。
# 科目管理テーブルからデータがUPDATE/DELETEされたら、成績管理テーブルからもデータをUPDATE/DELETE。
データの重複をさせない(UNIQUEな値を入れる) カラム定義の最後にUNIQUEを指定します。そうすると一意な値のみ登録が可能になります。例えば科目名とか。
CREATE TABLE IF NOT EXISTS `Subject` ( `id` INT NOT NULL , `subject` VARCHAR(45) NULL UNIQUE , 外部KEY制約を利用する。 Engine TypeをInnoDBに設定する。必ず外部KEY制約を設けるtableの両方をInnoDBに設定する。
両方InnoDBに設定しないとtableをcreateする際にエラーが出る。Can't create table './mysql/table.frm' (errno: 150)
FOREIGN KEY(a) REFERENCE parent(b)を利用する。
※error:150の原因は他にもあるようです。Mysqlのリファレンスに書いてあります。
http://dev.mysql.com/doc/refman/4.1/ja/innodb-foreign-key-constraints.html
SHOW WARNINGS; CREATE TABLE IF NOT EXISTS `score` ( `id` INT NOT NULL AUTO_INCREMENT , `studentid` INT NULL , `subjectid` INT NULL , `score` INT NULL , PRIMARY KEY (`id`), FOREIGN KEY( `studentid` ) REFERENCE student( `id` ) ON UPDATE CASCADE ON DELETE CASCADE FOREIGN KEY( `subjectid` ) REFERENCE subject( `id` ) ON UPDATE CASCADE ON DELETE CASCADE 外部KEY制約のオプション ON UPDATE CASCADE ON DELETE CASCADE
[PHP] : serializeとjson関数の比較 概要 serializeとjson_encodeのどちらの利用が望ましいかを調べます。理由はWebAPIを作成するときにどのレスポンス形式が最適なのかを検証する必要がでてきたためです。事前に上がった意見としては”json_encodeの方がデータ容量少なくなるから速いっしょ”、”serializeの方がphpをそのまま扱っているんだから変換処理コストが少ないはず”などの意見がありましたが、どれが正確か分からないので実際に試してみます。
サンプルするデータ 50回実行して処理時間の平均値をサンプリングします。
php配列から各エンコード処理を施した時の処理コスト シングルバイト文字列を含む配列を変換するコスト マルチバイト文字列を含む配列を変換するコスト エンコードしたデータからphp配列への復元処理コスト シングルバイト文字列を含む配列エンコードしたデータをデコード マルチバイト文字列を含む配列をエンコードしたデータをデコード エンコード ソースコード $data = array(); for( $i=0; $i10000; $i ++ ) { $data[] = "test"; //ここを適宜変えます。 } $start = microtime(); //PHP serialize $string = serialize( $data ); //JSON encode //$string = json_encode( $data ); $end = microtime(); echo $end - $start . "
[Linux] : findとsedを利用した一行野郎のファイル名変換 概要 X系環境で特定文字を含んだ大量ファイルを一気に特定のルールに従ったファイル名変換したいことってよくあります。
ファイル名変換用のスクリプトをperlやphpなんかで組んでそれを特定のディレクトリに流してもいいけど、
シェルスクリプトだけでやる方法を記述しておきます。
(例) : 例えば以下のファイルのように"Test"などの特定文字列を含んだファイルが複数存在し、
PHPTestというファイルだけに変換を加えたい時。"Test"を"Stab"に変更します。
-rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestAction.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestCode1.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:19 PHPTestModule.php -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestAction.pl -rw-r--r-- 1 YutaKikuchi staff 0 2010-10-14 23:20 PerlTestCode1.pl 実行コマンド 確認 find . -name "*PHPTest*" | sed -e 's/\(\(.*\)Test\(.*\)\)/mv \1 \2Stab\3/g' 実行 find . -name "
[network] : IPアドレスのまとめ 大事なこと ・IPv4では32ビットの整数値。2進数の8ビットずつを4つの組みに分ける。分かりやすいように10進数で表現されることが多い。
・IPv6では128ビット長になる。
・IPアドレスはネットワーク部とホスト部から成り立つ。
・IPアドレスの分類はクラスAからクラスEの5つに分類可能。クラスEは使われていない。※詳細は以下を参照
・ブロードキャストアドレスとはホスト部のビットを全部1としたもの。種類は2つあって自分が所属するローカルブロードキャストアドレスと異なるIPネットワークのダイレクトブロードキャストアドレスがある。
・クラスAやクラスBをそのまま使うのは非効率なので、サブネットマスクの導入により小さく分割する方法がある。
・例えばクラスBのサブネットマスクを255.255.255.192とすると上位26ビットをネットワークアドレスとして利用出来る。
・CIDRとはクラスA,クラスB,クラスCの8ビット単位のクラス分けをなくしたアドレス付けのこと。
・CIDRを利用して、クラスCの連続するネットワークアドレスを1つのアドレスとして利用する事ができる。
・私的なネットワーク内部で利用できるプライベートIPアドレスというものがあり、自由に利用することができる。※詳細は以下を参照
クラスA ・クラスAは先頭の1ビットが0で始まり、ネットワークアドレス部は戦闘から8ビットとなる。(0.0.0.0-127.255.255.255)
・残りの24ビットがホスト部となる。2の24乗−2(全て0や1は予約IP)なので割り当て可能数は16777214個となる。
クラスB ・クラスBは先頭の2ビットが10で始まり、ネットワークアドレス部は先頭から16ビットとなる。(128.0.0.0-191.255.255.255)
・残りの16ビットがホスト部となる。2の16乗-2(全て0や1は予約IP)なので割り当て可能数は65534個となる。
クラスC ・クラスCは先頭の3ビットが110で始まり、ネットワークアドレス部は先頭から24ビットとなる。(192.0.0.0-223.255.255.255)
・残りの8ビットがホスト部となる。2の8乗-2(全て0や1は予約IP)なので割り当て可能数は254個となる。
サブネットマスク クラス サブネットマスク A 255.0.0.0 B 255.255.0.0 C 255.255.255.0 プライベートIPアドレス クラス プライベートアドレス A 10.
[PHP] : Strategyパターン 概要 このパターンはアルゴリズムをクラス化してクライアントからクラスの切り替えで処理を行うパターンになります。
クライアントからのアクセス用の共通メソッド(API)を用意してあげて、別々のクラスのメソッドにアクセスをして
完全に処理クラスに委譲することができます。
またこのパターンを利用するとContext内部でif else分などの条件文をすっきりさせることができます。
Strategyクラス //Strategy interface interface Strategy { public function calculate( array $array ); } //Strategy interfaceの実装 class SumCalculator implements Strategy { //計算の実行 public function calculate( array $data ) { $sum = 0; foreach( $data as $value ) { $sum += $value; } return $sum; } } //Strategy interfaceの実装 class MultiplyCalculator implements Strategy { //計算の実行 public function calculate( array $data ) { $sum = array_shift( $data ); foreach( $data as $value ) { $sum *= $value; } return $sum; } } このように共通Interfaceを用いて計算処理を行う個別クラスにアルゴリズムを記述します。
[design pattern] : Observerパターン 概要 このパターンは監視するクラス/監視されるクラスから成り立ち、監視されるクラスで特定の処理が入ったときに
監視クラスにメッセージを送信することができるというもの。例えば監視されるクラスで処理が終わったときに
監視クラスに通知を行ない、監視側で処理を動かしたい時になど利用出来る。ここで重要なことは監視されるクラスは
監視クラスの状態を知る必要はなく、自身の状態を監視クラスに伝えることのみを行えばよいためクラス関係は疎結合
になる。
監視クラス //監視を行うクラスinterface interface Observer { public static function update( $subject, $args ); } //監視クラスの実装 class ObserverClass implements Observer { public static function update( $subject, $args ) { echo( "$subjectis update . args = $args" ); } } 監視するクラスは監視されるクラス側から呼び出される通知用のメソッドのみを用意してあげます。
監視されるクラス //監視をされるクラスinterface interface Subject { public static function addObserver( Observer $observer ); } //監視をされるクラスの実装 class TestSubject implements Subject { private static $_observers = array(); //メソッドが呼び出される度に監視クラスに通知 public static function addCustomer( $name ) { foreach( self::$_observers as $obs ) { $obs::update( __CLASS__, $name ); } } //監視クラスの追加 public static function addObserver( Observer $observer ) { self::$_observers[] = $observer; } } 監視されるクラスは監視するObserverクラスを登録するようにします。登録している監視クラス全てに対して