Silverlightなかなか面白い

 タイトルの通りで、Silverlightはなかなか面白いです。

 今はXAMLで書いたオブジェクトを多少JavaScriptで動かして遊んでいる(?)段階ですが、Ajaxを組み合わせればいろんなことが出来そう。少なくとも、画像ビュアー系は、いろんなエフェクトを追加できそうです。
 ちょっと面白いサービスのアイデアが浮かんだので、作ってみたいと思うのですが…JavaScriptではちょっと苦い思い出があって、マウスイベント系ではまってお蔵入りしているサービスを思い出してしまいます(涙)。でもなんかマウスイベントの種類が増えているので、その時の不具合は解決出来そうな気がしています(といっても、お蔵入りしているサービスはSilverlightで実現できないのが残念)。

 制作していく上で注意点が。
 XAMLを編集した場合、ブラウザをリロードしても更新されないみたいです。ブラウザを立ち上げ直さないと、新しいXAMLを取りに行かない模様。注意されたし。
 それから、マウスイベントをCanvasに置いても、オブジェクトがない部分でイベントが発生しないのも注意。イベントをCanvas全体で取りたい場合は、Canvasを覆ったレクタングル等を配置する必要あります。そしてイベントを受け取るのはCanvasで。レクタングルの方にしてしまうと、ほかのオブジェクトを配置した場合に、その覆われた部分でイベントがとれません。
 Silverlightで描画した部分は、プリントアウトしてもちゃんと印刷されます。ただ、フォントはビットマップ化されてしまい、アンチエイリアスがかかっているとはいえギザギザします。まあこの辺は仕方がないですかね。

Flash player10の新機能も気になるところですが(CS4が出るのは間違いなさそうですね)、Silverlightも負けていないようです。Flash player10が出るまで、ちょっと使ってみたいなと思っています。

縦書きアプリケーションの難しさ

 たまにはPHPやCakePHPとは違う話題でも。

 現在、とある案件でで縦書きの入力フォームが必要になり、いろいろと研究しています。

 横書きに慣れてしまっているため、あまり気にしていなかったのですが、やはり日本語を扱う日本人としては、縦書きの入力が分かりやすい場合もあり、今回はそんなニーズに応えるためのUI改善ということで研究しているのですが……

 いや、世の中にIE7しかないのであれば、この問題はとても簡単です。CSSに縦書きに関する設定があり、それをテキストボックス等に指定するだけで縦書き対応になります(多少並びが汚いですが)。
 少し前なら、FirefoxやMacのシェアがそれほどでもなかったので、ばっさりと切り捨てることも出来たのですが、今ではばっさりというわけにはいきません。つまり、現状この方法を使うことが出来なくなってしまっているのです。

 そこで思いつくのが、ブラウザにプラグインとして導入できる、クロスプラットホームな「何か」です。

 真っ先に思い浮かぶのはFlashでしょう。PCだけではなく、携帯やPSPなんかでも動く、非常に幅広い対応が可能なプラグインです。最近では「Flex」という、プログラミングでの扱いが容易なプラットホームが出ていて、XMLでオブジェクトを編集することで最終的にswfファイルになり、大変に良い感じです。
 ところが残念なことに、Flashには肝心の縦書きの仕組みが備わっていません。ネットで検索すると、かなり強引な方法で仕組みを作っている方(会社?)もいらっしゃるようですが、利便性が損なわれていたり(縦書きフォントでないと使えなかったり、ちょっとした改変でコードまで変えなければいけなそうだったり)、複雑なコーディングをしていそうだったりで、実用的ではない印象です。

 次に注目したのがSilverlight。
 Windows+IEでしか動かないのかなと思っていたのですが、MacはもちろんFirefox, Safariもプラグインが出ていて、意外にターゲットが広い! モバイルもそのうち対応らしく、あと携帯に載れば言うこと無しというレベルにまで来ています。
 そして、Silverlightは現在バージョン2がベータ版になっているようですが、バージョン2から縦書き対応とのこと!
 こっ、これはっ! と思ったのですが…でもベータ版を使うわけにはいかないか。即戦力にはならず。う~ん、残念。
 さらに残念なのは、Silverlightは基本的にXAML形式の可読性のあるファイルをやりとりするため、ソースコードを隠せないという難点が。バイナリコードをはき出せれば言うこと無かったのですが…… あと、フォントの埋め込みとかも出来なそうなのも。
 逆に利点としては、VisualStudioと連携すれば、かなりあっけなくexe形式のファイルになり、ローカルアプリの開発には便利、ということでしょうか。データのやりとりだけサーバを介し、処理そのものをローカルでやらせてサーバ負担を減らす、なんて技も可能かも。

 もう少しこの案件が遅かったのなら、Silverlightを使っていたかもしれません。でも、今回は仕様そのものを諦めてもらうことになりそうです。期間的にも、コスト的にも難しい……
 でも、将来的にはSilverlightは面白そう。グラフィカルに編集するにはVisualStudioのバージョンを上げてExpressionStudioを購入しなければなりませんが。Vistaアプリケーションを作る機会があるのなら、これもいいかな。
 でも現実的には、Adobeにも頑張ってもらって、Flashが縦書き対応になってもらうのが一番良いのかも。所持しているPhotoshop7とFlashMXのバージョンをCS3に上げる口実になるし。

 まあツールのアップデート云々は置いておくとして、縦書きUIの実現は本当にハードルが高いですね。結構需要はあると思うんですけどね。

#追記
Silverlight2の縦書きについては幻想だったようです。
MSは将来的に縦書き対応を検討しているものの、実装には至っていませんでした。
なおSilverlight2では、外部フォントの使用が出来るので、埋め込みと同じような、ローカル環境に依存しない表示が出来るようです。

逆に、FlashについてはFlash Player 10で縦書き対応をするとのこと。現在ベータ版らしいので、近い将来で縦書きが出来そうです。
そうなると問題はツールですね。FlashCS4とか出るんでしょうか? Flex3でプロパティがいじれるのであればそれでなんとかなりそうですが、とはいえグラフィカルツールが欲しいところ。ところが、手持ちのPhotoshopやFlashのバージョンを上げないとサポート切れになってしまうため、出来ればCS3のアップデータなどで追加されてくれると嬉しい…でないと10万くらい余分に出費することになってしまうなぁ(涙)。

CakePHPフォーラムを見ていて最近思うこと

 最近滞り気味のブログ更新ですが、仕事が忙しいのもあるのですが、CakePHPのバージョンが近々上がりそうなので、それを待っている状況です。特に、次のバージョンからwebservice関連が廃止されるようなので、SmartyViewもTplcutterも大幅な変更が予想されます。nightlyビルドから開発を進める方法もあるのですが、正式版が出てからの方が2度手間にならないと思うので…(^^; というわけで、もうしばらくお待ちいただけると。

 そんなわけで、つなぎではないのですが、少し思ったことを。

 CakePHPフォーラムの話なのですが、最近レベルの低い質問が多い気が。
 誰とは言いませんけど、少し考察したり、Cakeのソースを追ってみたり、はき出されたHTMLを観察したりすれば分かりそうな問題を、簡単に人に頼っている気がする。しかも、節操なく何度も何度も。それに該当する人に対して一度アドバイスをしたことがありますが、それに対するコメントから察するに、結果しか求めていないような素振りだったので、労力の無駄と思い、それ以降は無視することにしました。可哀想かもしれませんけど、その人のためにせっかく時間を割いて書いた情報を、ググって検索した情報程度に思われてもなんか癪なので。

 これらの人に限った話ではないですが、分からなかったら人に聞く…確かにそれが一番早いですが、もう少し人に頼らない方法で解決出来ないものか、と思います。基本的に人に聞くだけでは、自分のスキルは育たない。「何故そうなるのか?」を自分なりに導き出すことが、結果を知る以上に大事なことだと思います。問題に対しての結果を100%を知らなくても、「何故」の部分さえしっかり覚えていれば対処が出来るし、他の問題が出てきても、沢山の「何故」を覚えていれば、その組み合わせで解決の糸口を探すことが出来る場合もあるのです。

 私は、Cakeを使い始めてそんなに経ってはいませんが、大きな問題に直面することなく、なんとか使えています。今まで蓄積してきた「何故」のおかげで、大抵は問題が解決できるためです。

 一つアドバイスをするのなら、CakeはまがりなりにもPHPのプログラムな訳ですから、大抵はシステムのソースコードを読むことが一番早い問題解決になると思います。

 この「何故」の話は、話しだすと長くなるので今はこのくらいにしておきたいと思いますが、そのうちコラムにでもして書きたいと思います。

【CakePHP】アソシエーションの図解

すみません。最近とっても忙しくて、更新どころではありませんでした。

予定していた連載も出来る状態ではなかったため、フェードアウト気味でした。まだちょっと出来るような状況ではないため、こちらの方はもうしばらくお待ちください。
それから、SmartyViewのアップデートもしなければならないのですが、こちらもなかなかアーカイブを作る暇が無く(というか、こちらの方はただ単に面倒くさくてやっていないだけだと思う(大汗))、まだ更新していません。ごめんなさい。近日中には上げます。

さて、本題にはいりますが…
今更なんですが、業務としてCakeを使い始めています。
安定性重視で1.1でやっていくつもりでいたのですが、1.2でも問題がなさそうなので(PostgreSQLを扱うために、bdo_source.phpだけはアップデートしています)、こちらの方で開発しています。
また、デザイン等を考慮する必要もないため、勉強も兼ねてSmartyViewは使わず純正でやっています。

だいぶCakeのことが分かってきたのですが、「アソシエーション」の基本的なことがイマイチ理解できていなかったのですが、図を書いてようやく分かりました。つまりこういうことだったのですね!

hasOneとhasManyは単数か複数かの違い、belongsToはhasOneの逆方向の意味だというのは何となく分かっていたのですが、hasAndBelongsToManyの意味が理解できなかったんです。上図の例でいくと、BookmarkとKeywordだけで、両方向から複数のつながりを表すのかと思っていたのですが、bookmark_keywordsという別テーブルを作ってそれぞれのidを定義することで双方向で複数形を表すんですね。Cakeを使う前も、もちろんこういう考え方はしていましたが、Cakeではテーブルさえ用意すれば、特にモデルで定義する必要はなく、BookmarkにKeywordを、KeywordにBookmarkをhasAndBelongsToMany定義するだけで動かすことが出来る、ということなんですね。

今回の案件ではbookmark_keywordsにも意味を持たせたかったりとか、登録方法が若干特殊なため、hasManyを双方向でかけているのですが、通常時では楽できそうです。

あとはバリデーションがうまく使いこなせるようになりたいです。
なんか1.1とやり方が変わっているみたいで、随時バリデートをかけながら登録するのなら問題ないのですが、まとめてバリデートをかけて、全部問題ないことを確認してから登録するような仕組みには使えなくなってしまったようなので、今回はとりあえずControllerのなかでチェックしてしまっています。この辺は1.1の仕様に戻して欲しいなぁ…

AZASの会勉強会

以前の記事で書きましたが、ローカルな勉強会に参加しました。
AZASの会と命名されたそうで、私もメンバー入りさせていただきました。

勉強会の内容は、今回は私の方で提供させていただきまして、タイトルは「フレームワークのフレームワークを作ろう(α版)」。まあ簡単に内容解説しますと「CakePHPベースで自分の使いたい機能をあらかじめつっこんでおいて、それを流用しましょう」的な内容で、その「つっこむ機能」に、当方制作の「SmartyView」、そして「TinyMCE」「モバイル対応のコンポーネントおよびヘルパー」を例に挙げ、機能追加の方法を一通りなめた感じです。
「α版」という表記は何かといいますと、予定しています連載の中で、同様の解説を行うつもりだったため、その先行版という意味合いです。今回急いで資料を作成したため、勉強会の内容をそのままこちらに持ってくることが出来ないため、練り直したものを紹介させていただきますのでお楽しみに(?)。

終了後はそのまま食事会になり、麻布にある店(名前忘れました)で歓談。
半月後にまたやりましょうということで解散になりました。
CakePHP勉強会はいろいろと無理があった部分があったと思いますが、少人数だと緩やかに出来て良いですね。楽しかったです。

ちなみに解散後なんですが、メタボ対策の一環で渋谷まで歩いて帰ろうと思っていたのですが、何を血迷ったか道路標識の「←恵比寿300m」に惹かれ、方向転換。その300mは「恵比寿方向に行く道に出るまで300m」という意味合いだったらしく、渋谷を行って半分帰ってくるくらいの距離を歩きました(涙)。とにかく疲れた!

仕事の方の難所がクリア出来たっぽいので、来月あたりからCake関連を本格的にやっていけそうです。次の案件もCakeでやれそうですし。頑張っていきたいと思います。

PostgreSQLでMySQLの「auto increment」に対抗する方法

PostgreSQL使いがCakePHPでいろいろなサンプルを試していて、乗り越えなければいけない壁がいくつかあります。前述の記事で、bdo_source.phpの不具合を挙げましたが、それを解決したとしても、MySQLとの仕様の違いを克服する必要が多分にあります。

初っぱなでまず解決しなければならないのが「auto increment」です。CakePHPでは、idカラムを作りそれを主キーとして利用するのが一般的ですが、MySQLのようなauto incrementのオプションがありません。同機能を実現するには、若干工夫しなければなりません。

基本的にPostgreSQLでは、idに関しては次のようにテーブルを定義します。

DROP TABLE IF EXISTS users;
DROP SEQUENCE IF EXISTS users_id_seq;
CREATE SEQUENCE users_id_seq;
CREATE TABLE users (
  id    INTEGER  DEFAULT nextval('users_id_seq') PRIMARY KEY,
  created    TIMESTAMP NOT NULL,
  modified    TIMESTAMP NOT NULL, 
 
  name    VARCHAR(255) NOT NULL
);

ちなみにシーケンス名は、テーブル名と同じく複数形でないと、CakePHP側でうまくいかないようです。

CakePHP1.2.0.6311+PostgreSQLでの注意点

仕事が大変に忙しくて、連載どころではない状況です。
お楽しみにされている方はおそらくいないと思いますが(汗)、それでもやると言った以上まだ出来てない点については大変に申し訳ないと思っています。
とりあえず来週末までが山場です。それを超えればある程度余裕が出ると思いますので、ようやく始められるかな、といった感じです。なので、もうしばらくお待ちいただければ…

さて、そんな忙しい中、先日の「第二回CakePHP勉強会」でお知り合いになれた方が自社内で主催するCakePHPの勉強会にお誘いを受けまして現在楽しみにしています。予習をしていかないと落ちこぼれになりそうですので、現在慌ててやっているところですが、その際に一つ問題を解決しなければいけないところがありましたので、それをメモ書きしておきます。

先日の記事「CakePHP1.2+PostgreSQL8.3」で、問題なく動く事を書いてしまったのですが、実は注釈がありまして、「CakePHP1.2.0.6311には不具合があり、modelのfindは出来てもsave(更新)とdelが出来ない」のです。これはbdo_source.phpに不具合があり、発行するSQLがMySQLのみで有効な文法で出てくるためです。こちらにその情報がありますので、それに従いbdo_source.phpを入れ替えれば動作するようになります(ただし、findAll deleteAll(※) が効かないという報告があります。scaffoldを使う分には問題なさそうですが)。
まあ情報が出ていますので次のバージョンでは修正されそうですから、今回はファイルをそのまま入れ替えてしまいましたけど、一般的には新しいクラスでextendしてパッチを当てる方法もありかもしれません。cake領域に技術介入してしまうと、アップデートが大変になりますから…

※「findAll」ではなく「deleteAll」の間違いでした。訂正いたします。
※CakePHPのバージョン表記が間違っていました。正しくは1.2.0.6311です。

CakePHP勉強会に行ってきました

昨日開催されました「第2回CakePHP勉強会」に参加しました。

とにかく大人数で圧倒されっぱなしでしたが、大変に為になりました。
関係者・参加者の皆様、どうもありがとうございました。

さて、勉強会の内容での要点および感想を超簡単に書きますと…

■yando氏:「addons.mozilla.org@CakePHP」
 memcacheがかなり有効である。
 Smartyは前バージョンで使われていたが、現バージョンで削除された(高負荷では不利?)

■寺本氏&北村氏:「@ニフティトピックイット」
 短期間でのサイト構築ができた。
 規模が大きくなると、負荷対策への考慮が必要になる。

■すずき氏:「CakePHP Mail Conponent」
 日本語環境ではバグが多く現時点では実装に向かない。

■たぐち氏:「初心者がはまりやすいCakePHPのうっかりポイントまとめ」
 自分のつまづいた点と同じだったので共感できた。

■s-yo-ko氏: 「CakePHP+Oracle」
 PostgreSQLと同じくauto increment問題の解決をしなければならない。
 1.2では動作するが、最新版はdeleteが再度動かなくなっている。

■ttsuruoka氏:「あのオープンソースソフトウェアを CakePHP に移植する 」
 Railsからの移植は比較的簡単である。

という感じです。

全体的な感想としては、ちっと自分的に予習不足で勉強会に望んでしまったかなと後悔しています(汗)
全体的にある程度触っていないと辛い内容で、どちらかというと個人では扱わないような規模を対象とした開発をしている方には役に立つような内容が多かった印象でした。次回開催でネタが何になるかにもよりますが、それまでに精進しておかないと…

また、内容がかなり駆け足だったため、メモをとるので精一杯だった状況でした。出来れば手元に資料が欲しかったです(プリント代等の費用が発生しても構わないので)。時間も足りなかった印象で、平日開催の難しさも少し感じました。

懇親会でご挨拶できなかった方も大勢いまして、残念です。
次回も参加したいと思っておりますので、その際には是非よろしくお願いいたします。

CakePHP勉強会

本日20:30から開催とのことで、本日はウキウキ気分です(謎)。

今回初めてなので遠慮してしまったんですが、なんかLTネタ提供すれば良かったかな?
とりあえずってことならSmartyネタなんだけど…ちょっと開発中のサポートツールなんかとか。
次回もしそういう機会があるのなら、やっぱり連載ネタでしょうね。
その頃には良いところまで進んでいるか、完結しているかもしれませんし…いや、それはないかも(汗)。

というわけで、連載ネタは順調に遅れています(汗)。
しかも「第0回」でイントロダクション的な内容なのに…
なんというか、本編にいくまでの段取りがとてもいろいろあるため、なかなかまとめきれません。
しかも本業の方がテンパっちゃっている状況でもありまして(大汗)。
週末目処で頑張りますので、もうしばらくお待ちください。

あ、あと勉強会の様子もですね(笑)。

全然関係ないのですが、bakesaleを動かそうと思ったけどうまくいかなかった。
MySQLのSQLを無理矢理PostgreSQL用に書き換えてDBを作ったのだけど、それがまずいのかな?
でも、良く分からない403エラーが出ている(でもエラー画面があるはずなのにそれが呼ばれていない)っぽいので、リダイレクト関連かもしれない。
これがダメだったら自作かなーなんて思っていたりもします(涙)。
以上、ひとりごとでした。

「CakePHPで作るWEBサイト」連載を予定しています

 表題の通り、CakePHPを用いてWEBサイトを制作する一連の流れを、連載してご紹介していくことを現在検討しています。

 当初からの当ブログの開設目的である「CakePHP等に関するドキュメントを残す」目標をさらに一歩進め、一つのWEBサイトを開設するまでを、How Toとして残していきたいと思います。
 また、CakePHP本を含めて、現在発売されている参考書籍は実践的なものが少なくサンプル的なものばかりなので、より実践に近い形で書いていこうと思います。このため、サイト制作の経験のない方、もしくは個人的に多少制作の経験がある程度の方にとって、多少ハードルの高い読み物になるかもしれません。

 掲載スケジュールですが、残念なことに大変多忙な状況の中でやろうと考えていますので、現時点で目処は全く立っていません。また、掲載回数も全く決定しておらず、くだけた表現で言うなら「行き当たりばったり」でいこうと思っています。何故かというと、上記多忙な状況下でやるという理由もありますが、一番の理由は「自分自身がまだCakePHPについて理解度が少ない」点があること、また、自分が「無計画好き」という、システム開発者としてあるまじき性格の持ち主だからです(大汗)。大まかなガイドラインは頭の中にあるものの、現時点でどのようなボリュームになるか全く見当がつきませんので、書いていきながら臨機応変にいきたいと思っています。
 どちらかというと、連載が完結してからこれをベースに推敲し、書籍化したものを提供した方が皆様にとってためになるのかもしれません。まあでも書籍化なんて夢物語ですし、リアルタイム感があって面白いかなとも思いますし、現状やはり参考になるサイト等も少ないですから、少しでも早く提供できた方が良いかなと思っています。

 そんなわけで、先行き不安な企画ですが、とりあえず生温かく見守っていただけますと幸いです