53件中 26-30件目     [ 1 2 3 4 5 6 7 8 9 10 ... ]

最近、サーバサイドJava(Tomcat+Struts+MySQL)を触ることになり、いろいろと調べていくうちに、AjaxTagsというものを知った。

AjaxTagsは「AjaxTags・AjaxFacesを利用したサーバーサイドプログラミング」にあるように、Autocomplete(オートコンプリート)やSelect/Dropdown(2つのプルダウンの関連付け)、Update Field(複数フィールドの更新)、Toggle(クリックによる内容の書き換え)など、通常はJavaScriptを書いて作るような機能を、カスタムタグを書くだけで簡単に実装するものだ。 リンク先の記事では5つの機能しか書かれてはいないが、その他にもタブ表示やツリー表示などもできる。
AjaxFaces(有料)も同じようにタブ表示やカレンダーをカスタムタグで簡単に実装できるようだ。(公式ページ消滅してる?)

これらのようなサーバサイドのフレームワークやライブラリで、簡単にAjaxアプリを作るというのは、今のところ実装されている機能が少なく実用にはまだ早い感じがするが、この考えは面白い。

このようなサーバサイドのAjaxプログラミングをサーバサイドAjaxと表現しているを見付けた。

PHPでも同じようなものがあるのだろうか?と考え、調べてみるといくつかそれらしいものが出てきた。 一つ目はPEAR::HTML_AJAX。(ver0.5.2) 二つ目はSAJAX。(ver0.12) 三つ目はxajax。(ver0.5)
いずれもまだ未完成という感じで、機能は上記のAjaxTagsやAjaxFacesとは違い、PHPの関数をJavaScriptから呼び出すライブラリという感じ。 この中では、xajaxが導入も簡単で、JavaScriptを全く知らない人でもコーディングできそうで、一番良さそうだった。 これは近いうちに試してみたい。

調べてるときに見付けたPHPによるJavaScriptを書かないAjaxが、そのxajaxについても書かれているようでなかなか面白そうだった。 暇があれば読んでみたい。


PHPでは、標準でsimilar_text関数levenshtein関数という文字列の類似度を計算する関数があり、簡単に類似した文字列を探すことができる。

int similar_text ( string $first, string $second [, float &$percent] )
int levenshtein ( string $str1, string $str2 [, int $cost_ins, int $cost_rep, int $cost_del] )

どちらの関数も2つの文字列を引数に取り比較する。 similar_text関数3番目の引数は類似度をパーセントで取得するための引数、levenshtein関数の3つ目以降の引数は、挿入、置換、削除にかかるコストを定義するための引数となっている。

注意したいのは、similar_text関数は返り値が大きいほど類似しているのに対して、levenshtein関数は返り値が小さいほど類似しているという点だ。

サンプルソース表示

similar_text関数の$percentは、(返り値*2)/(2つの文字列の長さの合計)という計算で出しているようだ。 一見、あまり似ていないように見える「htmlspe」と「dbmclose」もm,l,s,eの4文字が共通しているために類似度が高くなっている。 日本語の比較は、おそらく2バイト文字として見ていないため、文字によっては変な結果が返ってくるようだが、似ていれば高い類似度が返されている。

どちらの関数も計算コストが高いという欠点はあるが、全ての文字列との類似度を計算することで、「もしかして検索」のようなものを簡単に実装できる。

(※実際の検索エンジンで表示されるものは、おそらく過去の入力から判断しているもので、類似度から判断しているものではないと思われる。)


PHPには不可逆な暗号化を行う関数(ハッシュ関数)としてmd5関数sha1関数crc32関数の3つがあるが、md5やsha1などのアルゴリズムは今では危険と言われ、逆変換されてしまう危険性がある。 できれば比較的安全なsha512などのアルゴリズムを使いたいが、PHPにsha512という名前の関数はない。

しかし、PHPにはハッシュ拡張モジュールというものがあり、それを使うことによりsha512やRIPEMD160、 whirlpool、 tiger192,4、 snefru、 gost、 Adler32、 crc32b、 haval256,5など様々なハッシュアルゴリズムを利用することができる。 この拡張モジュールはPHP 5.1.2以降ではデフォルトで有効となっている。


今のところ、当サイトで公開してるソースコードは、highlight_string関数preg_replace関数を使っていい加減な色分けをして表示している。 PHP以外のソースコードは、文法を見ていないからうまく色分けできないこともあるし、行数の表示などにも対応していない。 これを多くの言語に対応させていこうとするのはなかなか大変だ。

そこでいくつかあるソースコードを色分け表示するライブラリの一つであるGeSHiを試してみた。

GeSHiは、PHPで作られたライブラリで、拡張モジュールのようにインストールする必要はない。 使うときは、サーバにアップロードしてincludeすればいい。 対応する言語は、よく似た言語が含まれていたりするが、以下の70もの言語に対応する。

ActionscriptADAApache LogAppleScriptASMASPAutoIT
Backus-Naur formBashBlitzBasicCC for MacsC#C++
CAD DCLCadLispCFDGColdFusionCSSDelphiDIV
DOSEiffelFortranFortranFreeBasicGMLGroovy
HTMLInnoIOJavaJava 5JavascriptLaTeX
LispLuaMicroprocessor ASMmIRCMySQLNSISObjective C
OCamlOpenOffice BASICOracle 8 SQLPascalPerlPHPPL/SQL
PythonQ(uick)BASICrobots.txtRubySASSchemeSDLBasic
SmalltalkSmartySQLT-SQLTCLthinBasicUno IDL
VB.NETVisual BASICVisual Fox ProWinbatchX++XMLZ80 ASM

PHPでは、= =演算子でデータの比較をしたとき、0とfalse、0とnull、数値の0と文字列の"0"などは、trueが返される。 つまり、= =演算子による比較ではそれらは区別できない。 こういった仕様は、strpos関数の返り値のように0とfalseを区別しなければならないときに困ったことになる。

そんなときのために、= = =演算子というものがある。 = =演算子が緩やか比較をするのに対して、= = =演算子は厳密な比較をする。 具体的には、データの型(int, string, floatなど)が一致するかどうかもチェックする。

既に、いくつかのデータでそれぞれの比較をした結果表がマニュアルにあるのだが、その表にないデータを追加したものを作ってみた。 さらに、マニュアルの表は、結果をTRUE,FALSEで書いているのに対して、比較の結果としてtrueが返されるところに○、falseが返されるところに空白( )を出力するようにしたり、JavaScriptでマウスがある行、列に色を付けて見やすくしてみた。

厳密なデータの比較表ソース表示

この結果で特に注目すべき点は
  • "0"と""は、trueと緩やかな比較をした結果がfalseになる。
  • (false = = array())と(false = = "")がtrueでも、(array() = = "")はtrueにならない。
  • (array(0) = = array(null))がtrueになるあたりから、おそらく配列内の値でも緩やかな比較が行われている。
  • (0.0 = = true)や("0" = = true)はfalseだが、("0.0" = = true)はtrueである。
  • (0 = = = 0.0)はfalseである。
  • INF同士またはNAN同士は、= =ではfalseになるが、= = =はtrueになる。
の6つだ。

この点を頭に入れておかないと、バグにはまったり、セキュリティホールを作ることもありえるので注意したい。


53件中 26-30件目     [ 1 2 3 4 5 6 7 8 9 10 ... ]