サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
大谷翔平
fbis.hatenablog.com
3年ぶりの更新というわけで、まさしく3年寝太郎状態なわけですが。 今日は今巷を賑わせているJSON SQL Injectionについてです。 DeNA Engineers' Blog [ Technology of DeNA ] JSON SQL Injection、PHPならJSONなしでもできるよ | 徳丸浩の日記 徳丸さんの記事で紹介されていたように、僕が作ったSQL_Abstractでも同様の問題が発生するとのことです。 SQL::Makerのようにstrictモードを導入するかどうかも一応考えたのですが、PHP版SQL_Abstract自体PHP5でも動作はしますがPHP4時代のコードですし、そもそもそんなに使われてないだろう(泣)いうことで今回は見送ることにしました。(ちょっと今すぐ時間が取れないという状況もありまして・・・) またstrictモードを導入したとしてもSQL_A
MDB2を使って複数のDB接続したいなんてことあるよね。 ところがどっこい、実際にコードを書いてみると恐ろしいことが起きた。それは二つ目のDB接続をすると一つ目のDB接続が二つ目のDB接続に乗っ取られてしまうという! <?php // fooというデータベースへ接続し、hoge_tblのカウントする $dbh = MDB2::factory('mysql://user:pass@localhost/foo?charset=utf8'); $res = $dbh->query('SELECT COUNT(*) FROM hoge_tbl'); $row = $res->fetchRow(); $res->free(); print $row[0]; // 5件 // で次にbarへ接続し同様の処理 $dbh2 = MDB2::factory('mysql://user:pass@localh
<?php class Foo { const BAR = 1; const BAZ = 2; } get_defined_constantsを使えば全ての定数が取れると思いきや、上記のようなクラス内で定義した定数は取れなかった。 どうやったら取れるのか。PHPお得意の大量の関数の中に一覧取れるヤツが必ずあるはず!と思いきや、なかった。 諦めかけたその時、ReflectionClassというクラスを使えば取れることがわかったのだ! <?php class Foo { const BAR = 1; const BAZ = 2; } $reflect = new ReflectionClass('Foo'); print_r( $reflect->getConstants() ); $ php test.php Array ( [BAR] => 1 [BAZ] => 2 )PHP5になってから
MySQLの出力結果みたいなのが必要になったのでCPAN漁ってたらこんなの発見。 Text::ASCIITable - Create a nice formatted table using ASCII characters. - metacpan.org 地味に凄いめちゃ便利 use Text::ASCIITable; my @rows = ( [1,'foo','2011-03-16 11:22:33'], [2,'hogehogehoge','2011-03-17 11:22:33'], [3,'uwaaaaa','2011-03-18 11:22:33'], [4,'dio','2011-03-19 11:22:33'], [5,'jojo','2011-03-20 11:22:33'], ); my $t = Text::ASCIITable->new(); $t->setCol
ハマッタのでメモ。 <?php $a = new ArrayObject(array('test' => 1)); print_r($a); これをPHP5.2とPHP5.3で実行すると以下のようになる # PHP5.2 ArrayObject Object ( [test] => 1 ) # PHP5.3 ArrayObject Object ( [storage:ArrayObject:private] => Array ( [test] => 1 ) )PHP5.3の場合、なにやらデータの持ち方が新しくなったのかstorage:ArrayObject:privateとか言うのが増えてる。 これはおそらくstorageというprivate変数に配列のデータを持つようになったという感じか。まぁそれ自体は問題ない。 問題は以下のコード <?php $a = new ArrayObject(
久しぶりに本を読みませうと神の意思が降りてきたので第一弾は「Webを支える技術」を読むことに。 Webを支える技術 -HTTP、URI、HTML、そしてREST (WEB+DB PRESS plus) 作者: 山本陽平出版社/メーカー: 技術評論社発売日: 2010/04/08メディア: 単行本(ソフトカバー)購入: 143人 クリック: 4,320回この商品を含むブログ (183件) を見る なんせ前評判は高かったし、発売後も高評価続出だしとずっと読まなきゃなーと思ってた一冊です。 いやーーーー、ようやく読み終わった。 なかなか読み応えのある素晴らしい書籍でした。これは素晴らしいとしか言いようがないね。うん素晴らしい。 個人的に一番面白かったのが第2章のWebの歴史。 今までまったく意識してなかったのでなるほどなるほどそういう歴史的理由があったのかとかブツブツ独り言言いながら楽しく読めま
事の発端はぽけーっとはてブのお気に入りを見ていたらClass::Accessor::Liteの記事が目に付いた事でした。 お、新しいモジュールか?と思いさっそく実装を拝見させてもらったわけです。 なるほどなるほど、超が付くほどの超シンプル。超々シンプル。実際問題Class::Accessor::Fast使うよりも、Liteのように自分で超軽量のアクセサ定義することの方が多かったりします。 しかし一点気になったところがありました。 @_のリファレンスを保存している部分があったのです。 # Class::Accessor::Lite-0.02 sub __m { my $n = shift; sub { return $_[0]->{$n} if @_ == 1; return $_[0]->{$n} = $_[1] if @_ == 2; shift->{$n} = \@_; ### ← こ
久々にPerl。いや、ほんと久しぶりよね。 printf '%d年%d月%d日', 2010, 12, 22; # 2010年12月22日 上記のような処理の時に、引数の数は変更せずに年を削って「12月22日」と表示したい場合、以下のようにすれば可能。 printf '%2$d月%3$d日', 2010, 12, 22; # 12月22日 「%」と「d」の間に「数値$」を追加することで使用する引数を直指定できる。上記の場合だと2番目と3番目の引数を使うという感じになる。 こんなsprintfの使い方なんて滅多なことではしないと思うけど、その滅多が来ちゃったので滅多ごめん。 滅多ごめん。 # ちなみにPHPでも可能。 参考:sprintf - perldoc.perl.org
Smartyのテンプレートでは配列や連想配列を定義できない。そんな風に考えていた時期が俺にもありました。 さてググってみるとプラグインを利用する方法を発見しました。 Smartyで配列を定義するプラグイン - Lism.in * blog - nekoya (id:studio-m) Smarty のテンプレートで配列を定義する - XCL Labo 前者は自作プラグインを作る方法、後者はsplitプラグインを利用する方法ですね。 しかしプラグインを利用する方法には以下の三つの問題点があります。 文字列の配列しか生成できない 多次元配列を生成できない メソッドに引数にそのまま渡せない あくまで文字列を分割して配列を生成してるだけなのでオブジェクトの配列や多次元配列を生成できません。 またメソッドに渡せないというのは以下のようなケース エラー。メソッドの引数にプラグインを使用できない {$f
PHPのDateTimeクラスは標準装備なのでお手軽で便利なのだけど、若干使い勝手が悪い。 なのでDateTimeを継承してちょっとした拡張をしとくと便利かと。 <?php class MyDateTime extends DateTime { function year () { return $this->format('Y'); } function month () { return $this->format('n'); } function day () { return $this->format('j'); } function hour () { return $this->format('H'); } function minute () { return $this->format('i'); } function second () { return $this->
先日の記事だけを見ると、Perlを使ったこと無い人からすれば何がどう便利なのか良く分からないと思うのでここらでPath_Classの解説。 まずPath_Classの大きな特徴として、引数で与えたパスが、実際にファイルとして存在してなくても良いというところがあげられるでしょう。 <?php require_once 'Path/Class.class.php'; // 存在しないパスを与えてもまったく問題なく動く $dir = cdir('/foo/bar/baz'); // 一個戻ったり $dir->parent(); # /foo/bar // 一個進んだり $dir->subdir('hoge'); # /foo/bar/baz/hoge // ディレクトリ生成しちゃったり $dir->mkpath(); # /foo/bar/baz/というディレクトリが作られる。 // ファイルの
え?あぁ。Perlerなら皆さんご存知のPath::Classですが、それのPHP版です。欲しかったので作りました。 以下使い方例。 <?php require_once 'Path/Class.class.php'; $dir = cdir(array('foo', 'bar')); # Path_Class_Dirオブジェクト $file = cfile(array('bob','file.txt')); # Path_Class_Fileオブジェクト print "dir: $dir\n"; # foo/bar print "dir: $file\n"; # bob/file.txt $subdir = $dir->subdir('baz'); # foo/bar/baz $parent = $subdir->parent(); # foo/bar $parent2 = $paren
ひょんなことからhtmltemplate.incというHTMLテンプレートエンジンを触ることになった。 どんな感じのテンプレートなのかは http://hokori.net/2008/03/01/thmltemplate_for_php/ http://d.hatena.ne.jp/atyks/20090830/1251641112 あたりで詳しく書かれている。 Smartyに慣れている人間からすると非常に使いにくい。オブジェクトが渡せなかったり、テンプレート内でHTMLエスケープ等のフィルター処理ができなかったりする。 で機能追加をしたいわけなのですが、これがなかなかhtmltemplate.incというやつは短いコードながら設計が優れていてとても機能拡張がしやすい。 というわけでやっちゃいました。 <?php require_once 'htmltemplate.inc'; class
大分昔に書いたHashを使って配列をユニークにしようという記事のブコメにてList::MoreUtilsのuniq関数の実装が変わったというコメントを頂きました。 List::MoreUtils 0.25_02 では少々変更されていた。 http://cpansearch.perl.org/src/VPARSEVAL/List-MoreUtils-0.25_02/lib/List/MoreUtils.pm はてなブックマーク - kitsのブックマーク / 2009年11月17日 さっそくどう変わったのか確認したところ、なんともアンビリーバボーな実装になってました。 # List::MoreUtils-0.22 sub uniq (@) { my %h; map { $h{$_}++ == 0 ? $_ : () } @_; } # List::MoreUtils-0.25_02 sub
PHPにおいて、ある配列が連想配列として使われているのかどうかを判別したい場合どうすればいいのか。 色々調べてたらこんな記事を発見しました。 <?php function is_hash(&$array) { return array_keys($array) !== range(0, count($array) - 1); } テレパス・ラボ : 連想配列 判定関数(is_hash) なるほど。 array_keysで配列のキー一覧を取得し、そのキー一覧が0からの連番になっているかどうかを比較すれば、対象の配列が配列なのか連想配列なのかを判別できるという理屈ですね。 確かにこれで判別ができそうです。 ですがひとつだけ気になる部分があって、array_keysやrangeを使って一時的な配列を確保しているのは無駄が多いのではないかと。 対象となる配列が大きければ大きいほどメモリ効率が悪くな
PHP5やり始めたばっかでまだ右も左もわからずに右往左往してます。 色々調べてたら、PHP5になってSPL(Standard PHP Library)ってのが導入されたということを知った。へー。 そのSPLの中にArrayObjectという物がありまして、オブジェクトを配列っぽく扱えるようにしたものなのですよ。今日はコレを取り上げてみたいと思います。 とりあえず使用例。 <?php $foo = new ArrayObject; $foo['foo'] = 100; $foo['foo-bar'] = 200; print_r((array)$foo); Array ( [foo] => 100 [foo-bar] => 200 )おお、面白い。オブジェクトなのに配列のように扱えています。 そして更に面白いのがオブジェクトのプロパティに設定した値と同期させることもできるところです。 以下の
最近ようやくPHP5をちょこちょこと触ってるわけなんですが、折角メソッドチェーンサポートされたのに何故かnewと同時にできない罠。 これなんか動いても良さそうなのになぁ。直感的だし。 <?php (new Foo)->bar(); 嘆いてもしょうがない。動かないものは動かないので、ちょこちょこと調べてたらこんなのが そこで以下のような関数を定義する。 <?php function ref($obj) { return $obj; } この関数はみたとおり渡された値をそのまま返す関数だが、これを使うことで以下のようにメソッドチェーンできるようになる。 <?php ref(new Hoge)->doSomething(); というバッドノウハウっぽい話。 PHPでコンストラクタからメソッドチェーンする方法 - id:anatooのブログ やっぱこれくらいしかないよねー。 でも標準関数だけでやり
Smartyってオブジェクトのメソッドチェーンサポートしてないんだね。 -- foo.tpl -- { $foo->setdata(88)->setdata('a','b')->getdata() }Fatal error: Smarty error: [in foo.tpl line 2]: syntax error: unrecognized tag: $foo->setdata(88)->setdata('a':'b')->getdata() (Smarty_Compiler.class.php, line 455) in C:\php\includes\Smarty.class.php on line 1092ということなので仕方なくプラグインでそれっぽいことをできるようなの作ってみた。 -- modifier.chain.php -- <?php function smarty_
PHPが何で扱いやすいかわかったよ!PHPタグに真理があったんだよ! <html> <body> <?php $name = "fbis" ?> 僕の名前は<?php print $name; ?>です。 年齢は<?php print $_REQUEST['age']; ?>歳です。 </body> </html> これだけで動くんだもんそりゃ便利だし分かりやすいよ。 なのでPerlでもPHPタグ使えるようにしてみました。 package PHP::Block; use strict; use warnings; use Module::Compile -base; sub conver_print { my $str = shift; return '' unless $str; $str =~ s{\x27}{\x5C\x27}g; $str = ';header() if @_HEA
閉じタグってのは「?>」のことね。未だに閉じタグ使ってるコードを見ると一瞬ドキッとするんだよね。(自分の昔のコードも含むw) いや、ちゃんとわかってて確実に使いこなしてるならいいんだけどたまに -- ここがファイルの先頭 -- <?php class Foo { // いろいろ } ?> -- ここがファイルの後尾 -- みたいな感じで閉じタグの後に改行コードが一つ入ってたりするのを見ると「あわわわ」ってなっちゃう。 実際には改行一つだけなら問題は出ない、PHPは閉じタグの直後の改行を消してくれるからね。 問題は改行が二つ以上あった場合だ。これは悲惨なことになる。PHPは閉じタグ以降のデータ(というか範囲外のデータ)は全部HTMLとして出力される仕様なので、改行コードが表示されちゃう事態に。 表示されちゃうっていうのは語弊があるか、元々PHPはHTMLに埋め込むための言語なのでの範囲外の文
MySQLで等しくないを表す比較演算子 - Unknown::Programming さて昨日の記事で「!=」使えお!言ったのは訂正させていただきます。やっぱ時代は「<>」だよね。 ・・・所変わって今日はPHPの話でもしようかな。 とある環境でPEAR::DBを使っておるのですがこんなコードを書くと何故かエラーになるの。 <?php $data = $db->getAll("SELECT * FROM foo WHERE id != ?",array(2)); エラー内容 SELECT * FROM foo WHERE id = [DB Error: mismatch]プレースホルダを使って値を設定したいわけだけど何故か上記のエラーが出てコケる。おっかすぃーなーと思って実装覗いてみたらこんなドキュメントを発見 * Example 1. * <code> * $sth = $db->prep
メモ。 今日見たコードにこんな物が SELECT hoge FROM foo WHERE bar <> 0; ___ ━┓ / ―\ ┏┛ /ノ (●)\ ・ . | (●) ⌒)\ . | (__ノ ̄ | \ / \ _ノ /´ `\ | | | | なんだ「<>」って。 MySQL :: MySQL 5.6 リファレンスマニュアル :: 12.3.2 比較関数と演算子 SQL文のwhere条件文で使う <> の意味はなんですか - SELECT * FROM - その他(データベース) | 教えて!goo なるほど、「!=」と同じ意味なんですね。ひとつ勉強になりました、って「!=」使えよ!わかりにくいっちゃられらッ!!! ちなみにVBでも<>使うんだって。昔VBやってたのに全然覚えてない。
とりあえずPerl限定のお話で。 まぁ皆同じようなことは多分してると思うのでぐだぐだと何か言うことも無いんだけど、自分流のやり方を覚書程度にメモするという意味でここに残しておきます。 まず以下のようなfoo.plを用意します。 #!/usr/local/bin/perl -w use strict; use warnings; use Data::Dumper; use YAML(); sub p (@) { local $Data::Dumper::Indent = 1; print Dumper(@_) } sub P (@) { print YAML::Dump(@_) } use Perl6::Say; use Path::Class; __END__ 自分の環境にあわせてお好みのuse文を入れておきましょう。Perl 5.10とかならPerl6::Sayはいらないですね。 ちなみ
ぼく「えっ」 PHP「"0x0A" == "10"はTRUEになりますが」 ぼく「いえFALSEです」 PHP「えっ」 ぼく「えっ」 PHP「まだ比較したことがないということでしょうか」 ぼく「えっ」 PHP「えっ」 ぼく「変化するってことですか」 PHP「なにがですか」 ぼく「型が」 PHP「ああ文字列でも整数っぽい文字列なら自動で型変換されますよ」 ぼく「そうなんだすごい」 PHP「では比較いたしましょうかTRUEですよ」 ぼく「でも"0x0A"は明示的にキャストしたら0になりますよね」 PHP「えっ」 ぼく「えっ」 PHP「ああ16進数のことなら比較の場合のみ10進数に自動で変換してから比較するんですよ」 ぼく「なにそれこわい」 PHP「"0x0A" == "+000010.0000000000000001"の場合もTRUEになります」 ぼく「なにそれもこわい」 PHP「えっ」 ぼく
とりあえずググルと以下のような記事が。 しかし、それもコードが冗長になるので、以下の方法で対応しました。 MyApp.pm %HTML::Entities::char2entity = ( '&' => '&' , # ampersand '>' => '>' , # greater than '<' => '<' , # less than '"' => '"', # double quote ); http://www.craft-works.co.jp/blog/archives/226 まさしく同じ症状だったので上記の対処法をそのまま試したのですがそれでも化けてしまい、しぶしぶHTML::Entitiesのコードを覗いてみたところ $$ref =~ s/([^\n\r\t !\#\$%\(-;=?-~])/$char2entity{$1} || num
Path::Classが約2年半ぶりくらいにバージョンアップされました。 Path-Class-0.17 - Cross-platform path specification manipulation - metacpan.org いくつかのバグ修正や最適化が行われたようです。 そして!!! 先日僕が指摘した Path::Class::Dir-0.16のchildrenが「0」で止まる件 - Unknown::Programming この件に関してもRTチケットの方で返事があり、「Fixed in 0.17 added」と書かれていたのでキタキタキタキタ━━━(゚∀゚≡(゚∀゚≡゚∀゚)≡゚∀゚)━━━━!!ということで喜び勇んで実行させてみたところ見事に「0」で止まってしまいましたorz 工エエェェ(´д`)ェェエエ工 Fixedって言ったじゃん。 どうしよ・・・・。 またチケット追加
正直言いますと、個人的には定数って殆ど使わないんですよね。 昔はちょこちょこ使ってたんですが、最近は定数となりうる物は基本的にYAML等外部ファイルに持たせて変更可能にすることが多いのでまったく使ってません。 ですがそれでもPerlで定数を使いたい時にはどーすんの?っていう時のために軽くここにまとめておきます。 言わずもかなPerl5.8にはconstantという定数を定義できる標準モジュールがあります。 use strict; use constant PI => 3.14; # 表示 print PI; # 3.14 # 上書きしようとすると・・・ PI = 3; # Can't modify constant item in scalar assignment とこのように上書きしようとするとエラーを吐いて死にます。 しかも実行時ではなく、コンパイル時にエラーを吐きます。 実はこのc
ハッシュと配列の参照が入り交じったような複雑なデータ構造の、全value を均等に加工したかったので次の様にしてみました。 (中略) すでに似たモジュールがある気が激しくしています! ご存知でしたらぜひ教えてくださいませ。 [perl] 複雑なデータ構造のvalue を一気に書き換える方法 - harupiyoの日記 ということでData::Visitor::Callbackがズバリそれにあたるものじゃないかなーと。 use strict; use warnings; use Data::Dumper; use Data::Visitor::Callback; my $rh_testdata = { 'a' => 1, 'b' => { 'aa' => 1, 'ab' => [ 1, 2, 3, \ 'test', 5 ], 'ac' => 3, }, 'c' => 3, 'd' => 4
…というか3gpファイルのヘッダを解析して再生時間の取得を試みるわけなので延いてはmp4の解析ということになりますが故、結局のところMP4::Infoを使うことで万事OKだろっていう話ですね。 use MP4::Info; # v1.12 use Path::Class; my $file = file '/foo/bar/movie.3gp'; my $mp4 = MP4::Info->new($file->openr); printf "total second is %s", $mp4->SECS; このようにすれば動画のトータル秒数が取得できます。 他にも色々とメソッドがありまして、様々な情報を取得できるわけですがそれらはドキュメントに書いてるのでここでは触れませぬ。 が、実装部分でひとつ気になる部分がありまして、各種メソッドの挙動をAUTOLOAD様に任せておられるようなのでそこ
次のページ
このページを最初にブックマークしてみませんか?
『Unknown::Programming』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く