2009年7月7日火曜日

PHPとJavaScriptでひらがなカナタカチェック!

まずは下ごしらえから

今回はUTF-8とUTF-16でのチェックです。ちなみにJavaScriptはUCSモデルで内部的に文字コードをUTF-16で扱います。PHP5はCSIモデル?なので、文字コードが混在しますので、各文字コード用には下記リンクを参照に作ってみて下さい。 PHP6からはUCSになります(UTF-16)。

今回は伸ばし棒(「ー」U+30FC)も入れます。この文字はKatakana Hiragana prolonged sound markという名でUnicodeに登録されてます。

PHP

クラス実装版。PHP5用でUTF-8の場合です。

class Valio{
 /**
  * UTF-8で全角カタカナと「ー」だけか調べます
  *
  * @param string $string
  * @return bool
  * @static
  * @access public
  */
 public static function isKatakanaOnly($string)
 {
  return preg_match('/^(\xe3(\x82[\xa1-\xbf]|\x83[\x80-\xb6]|\x83\xbc))+$/', $string) > 0 ? true : false;
 }
 
 /**
  * UTF-8で全角ひらがなと「ー」だけか調べます
  *
  * @param string $string
  * @return bool
  * @static
  * @access public
  */
 static public function isHiraganaOnly($string)
 {
  return preg_match('/^(\xe3(\x81[\x81-\xBF]|\x82[\x80-\x93]|\x83\xbc))+$/', $string) > 0 ? true : false; 
 }
}
Valio::isHiraganaOnly('どーぴん'); # => true

JavaScript

今回はカタカナは実装しなかったのでひらがなだけ。カタカナも同じように作れます。

/^([\u3040-\u309Fー]+)$/.test('チェックしたい文字列')

僕の場合、よくフォームはtable要素と組んで、jQuery UIを使って制御するので、こんな感じのチェック用関数を用意して、keyupにバインドさせてます。

function hiraganaOnly()
{
 var ele = $(this);
 var pEle = $('th,td',ele.parent().parent())
 if(/^([\u3040-\u309Fー]+)$/.test(ele.val())){
  clearUserErrorMessage(ele.attr('id'))
  pEle.removeClass('ui-state-error ui-corner-all');
 }else {
  addUserErrorMessage(ele.attr('id'),$('label[for="'+ ele.attr('id') +'"]').html().replace(/^\*/,'') + 'はひらがなと「ー」で入力して下さい');
  pEle.addClass('ui-state-error ui-corner-all');
 }
}

PHPでサムネイル

ネイリストDopinがおすすめするライブラリ

PHP THUMBがcool!

MITライセンスなので商用も可。I ♥ MIT lisence!!

ちなみにこれを独自のSmartyプラグインと融合させて使っているので、もう自分で言うのもなんだけど、うまくMVCを分けることができて、あぁ素敵!このライブラリを使えばたった数行でそれが実装できます。ありがとうオープンソース!Thank you Ian!

2009年7月6日月曜日

Redmineのおすすめプラグイン

意外と知らないRedmineのプラグイン

Redmineの印象というと、Tracの後発で、Tracより(デフォルトが)高機能で最初からマルチプロジェクト対応しているということ。逆にTracはプラグインによる対応が可能という印象。でもRedmineにもプラグインはあるんです!Redmineのデフォルトの機能で満足しているようではダメよっ!求めよ、さらば与えられん。Redmineをもっともっと使いやすいものにしましょう!

まずどれだけプラグインがあるか

Redmine Pluginsにまとめられていますが、GitHubにもあります。Redmineで検索してみてください。Redmine ForumのPluginにも情報があります。

チケットの増加と終了状況が確認できるGraphs

Graphsは文字通りグラフ系。何のグラフかというと、プロジェクトの新規チケットと終了チケットのグラフを見れたり、全てのプロジェクトが今どれだけチケットが発生してるかを見れます。

このプラグインの便利なところは、バージョン(ロードマップ)毎にグラフが見れ、今どれくらいチケットが終わっていて、このペースで間に合うのかが感覚的に分かります。

面白かったのは、会議後にチケットが発生するということがグラフであからさまに出たのを見た時でした。分かってはいることですが、グラフで見ると面白いものですw 締め切りまでの緩やかな上り坂が、会議を増す毎に急斜面になっていく、まぁなんと会議の恐ろしいことw 話が逸れましたが、坂マニアでなくても、このグラフは見ていて面白いかもしれません。メンテナンス(保守)系プロジェクトには向きませんが。

そのコードの書き方ちょっとまずいんじゃ...

そんなこと思ったこと、思われたこと、あるんじゃないでしょうかw 実は僕はまだ使ってませんが(チーム開発らしいチーム開発をしていないので)、Code Reviewはリポジトリのコードに対してコメントを付けられるプラグインです。リンク先のサンプルの通り、指摘してみたり、賞賛してみるのもいいんじゃないでしょうか。プログラミングの場合、書く時間より読む時間の方が圧倒的に長いですし、何かあったらすぐメモったりしておきたい。その書き方だとIE6でメモリリークになるリスクないですか?とか、ifの条件のところがちょっと甘かったりとか、HTMLとCSSもそれリストでできるじゃんとか。あまり指摘し合っても雰囲気が悪くなりそうですが、みんなでレビューして、お互いに切磋琢磨する方がいい製品がより早く作れる環境になれそうです。このプラグインはお互い同じ場所で仕事をしない、SOHOやオープンソース開発なんかで役立ちそうですね。

まだまだ全然あるけど

次にやるべきチケットを自動的に割り出してくれたりするプラグインや、FLASHを使ったグラフ系の面白いプラグインやら結構あります。中にはバグがあったり、バージョンの互換性の問題で動かなかったりもしますが、気になったプラグインは片っ端から入れて、このブログで取り上げて行こうと思います。

Redmineの語源はRed Lineじゃないのか

レッドラインとは

それは越えてはならない一線。締め切りという意味じゃないけど、ある意味チケット終了予定日は絶対かもしれない。0か1ですから!

なぜ思いついたのか

Redmineのガントチャートの色で、まだ終わっていないもので、開始日より後のものでまだ終了していないものが赤いから。実際どうなんでしょう。Langさんに直接聞きたいけど、忙しいだろうし、前田剛さんが知ってるかな?? 気になるよねー。実はフランス語だったりして

Red + mine = 赤色の宝庫説

Rubyで作られているから赤というのは連想できますね。Wikiやリポジトリやチケット駆動開発でいろいろと貯め込むから宝庫という表現もできなくはないし。鉱山を掘ってRubyのような宝石を取るって意味かなー。間違って地雷を踏む可能性もあるから? でもリポジトリがあるからやっぱり宝庫説が有力か...

2009年7月1日水曜日

WEBの高速化に本気だぜモード

Googleが本気らしい

Google Code Let's make the web fasterのArticlesがいい!読まなきゃね。

JavaScriptの部分に関しては、それ図解で。・・・tohokuaikiのチラシの裏さんとこの、JavaScriptの最適化について、code.google.comの記事の適当訳、で読めます。参考になります。ありがとー!

ブラウザも高速化している世の中ですもの

YahooのWeb高速化のための14プラクティスみたいなのがありましたが、その頃からブラウザも高速化の競争が激しくなっています。IEはおいといて。Chrome2は速い。狐が遅く感じる。Safari4ですらちょっと遅く感じる気もするってくらいChrome2速い。環境によるのかもしれないけど。でも、表示もとのサーバ側の処理やHTMLに問題があって、その速さを殺すこともできるので、なるべく殺さないように頑張ろうと思う今日この頃。しかし、覚えることが多いねー... サーバの設定、HTTPのやりとり、プログラムの書き方。

プログラムの高速化は結構充実感のある仕事ですが、実際高速化したことによるメリットがあるのかをちゃんと計った方がいいってのもありますね。人件費の1秒の単位と、高速化によって何秒減るかを計算して、そのプログラムを何回実行して初めて元が取れるのかってのも大事です。でも、遅すぎて誰も使わないってのは問題外なので対処しないといかんです。昔書いた某地図系ライブラリ、Adobe Spryの書き方を真似しててよかったw this.prototype.fooとかでも良さそうな気がするんだけど、だめなのかなぁ。あの書き方は実行が速いとしても、書き方がちょっと面倒で好きじゃない... 高速化はトレードオフですね。