2013年1月26日土曜日

Webフレームワークがカバーすべきこと


まず素のPHP・CGIで作ろうと思えば作れる

それで困らないら問題はない。特にPHPに至っては、クリエストリングのパースやセッションやファイルアップロードに関する関数が充実しており、フレームワークがないと困る度合いが他言語に比べると少ない。

エントリポイントの一元化

ほとんどの場合、画面全体で共通の処理が走る。例えばデータベースの接続や、必要なライブラリのrequire。特に開発環境と本番環境での設定の切り替えをここでやっとくといいエラーの画面出力を、開発環境と本番環境でON/OFFを切り替えたりとかね。

イグジットポイントの一元化

途中までは同じであっても、最後には必ず通って欲しい処理というのがある。
例えば、携帯サイトでは、機種に応じて文字コードや絵文字の変換処理が入る。さすがに最近はそこまでするケースが減ってきた。ログの出力とかはここで共通でやっておくといい。

controllerとviewの組みあわせ

「どう機能して欲しいか?」「どんな画面を見せたいか」というのが、controllerとviewの分離ということ。
これが機能するのは、こういう画面遷移。

  •  フォームに入力→送信
  •  エラーがあれば、元のフォームの画面、エラーがなければ確認画面
  •  確認画面から、更新でデータ更新、戻るボタンで元のフォーム
この画面遷移で、同じ入力フォームに「入力を受け付ける」「エラーを表示させながら再度入力を受け付ける」「確認画面から戻りながら再度入力を受け付ける」という3つのルートがある。コントローラーはそのルートを別扱いで判断をするが、ユーザから見える画面はほぼ同じものなのだ。

さらに、PCとスマートフォンの両方をカバーするようなプログラムになると、同じURLで別のHTMLを表示するようになる。この場合はcontrollerが同じでviewが違うというケース。

これがフレームワークで最も必要な機能。

処理の分岐で別画面を表示するときに、リダイレクトを使うという手もあるが、リダイレクトはGETリクエストなので、ユーザが入力したPOSTデータを引き継げない。さらにhttpヘッダの出力で画面を切り替えるために、うっかりデバッグ用の出力をすると機能しない。

モデルの抽象化

モデルという概念がある。大概の場合には,データベースに対する接続を抽象化したものである。モデルの処理は、必ずしもデータベースに実在するものでなくともよく、
 「従業員クラス」の「男女」メソッドは、DB上は、1,2という数字で入っているものを、メソッドでは「男、女」と返すみたいなことをしてもいい。
 ただ、そこまで使いこなしている人も一部で、単にデータベースの接続便利ツールとして使ってる人も多い。

「このテーブルを更新するときには、かならずこのテーブルも更新しとく」みたいなデータの整合性も、モデルが担保しておくといいが、その処理をコントローラーに書いちゃう人もいる。「必ずやってほしいこと」はモデルのクラスでカプセル化して欲しいが、このあたりは保守性の問題であって、ロジックの大きな違いにはならない。

まとめ

ということで、Webアプリケーションフレームワークでいろいろありがたいことはあるが、その価値のかなりの部分をcontrollerとviewの分離が教授しているということ。逆にcontrollerとviewが分離できないフレームワークは、結構しんどい。

2013年1月5日土曜日

授業をクイズ番組にする

学生の時に塾講師をしていた。個人で経営されている塾で、割と自由にやらせてもらえた。

最初は普通に授業をしていたのだが、中学生にもなるとなめてかかってくる。宿題もやってこない。宿題をやってこない子には居残りをさせいてたが、敵もさるもので、適当な答えを埋めて「やってきたふり」をする。

ゴリゴリの進学塾ではないので、中くらいの成績から高校進学から悩んでいる子まで来ていた。

基本的には勉強をする気はない。ちょうど稲中が全盛期だったので、キャッキャしながら休憩時間に卓球をしていた。私も変に卓球は上達した。

そんな塾とはいえ、親御さんは成績アップを願ってお金を払ってくれている。成績の下降を食い止めなくちゃいけない。

最初は宿題の不正解数に応じた居残りをやらせていた。やってこなかった場合も、適当な答えを書いていた場合も居残り対象。

しかしその居残り勉強も、6割の正答率でよしとする子が結構いた。逆に、中くらいの塾にきてる賢い奴ほど、プライドが高いので、知らない問題に取り組まない。6割の理解でよしとしてしまう。因数分解で解ける方程式はやるけど、解の公式は彼の美学に反するのでやらない。共感はできるが、それではギリギリ合格しない。

その対応策として、居残り勉強も、連続で3問正解しないと終われないようにした。途中からは居残りではなく全員が参加にした。要は小テストなのだが、クイズ番組のフォーマットにしている。


  1. 黒板に全員の名前を書いて、ポイントを書く
  2. 一問出す。1分まつ(それくらいの小さな問題)
  3. 10秒前からコールする
  4. 回答を発表する
  5. 正解するとポイントが上がり、間違うとゼロに戻る
  6. 1分間の復習タイム
この繰り返しで、3問連続正解すると、一抜けになる。一抜けのファンファーレはアメリカ横断ウルトラクイズ。

こうすることでいろいろ効果が出てくる。
  1. 見直しをするようになった
    • 「見直し」は苦痛でしかない。その気持は分かる。しかしながら、「一問でも間違うとリセット」なら、見直す方が得なのだ
  2. 途中計算を書くようになった
    • 賢い奴ほど途中の計算を書かない。ただそれだと見直しがしんどい。だから途中計算を書いた方が有利になる
  3. 苦手を放置しなくなる
    • 2問までとんとんといくと、3問目は彼が苦手としている分野を出す。彼がそこで問題を捨てたとしても、次の3問目も同じ問題をだす。本人は気付いてないだろうが、こちらは全員の苦手を知ってる。言われなくても、このパターンを克服しないとダメだなってことに気付く。
    • 回答を出した後の復習タイム(と言っても1分で十分だが)で正しい解き方を覚えてもらう。
  4. 下克上が起こる
    • 子供達にもヒエラルキーがある。成績の序列はみんな分かってる。ただ、連続三問方式は、ケアレスミスも命取りになる。低位安定していたコツコツタイプがトップに立つこともある。天才タイプは負けると悔しい。中学生と言えど、「賢くありたい」という気持はあるのだ。かけっこが楽しいのと同様に、テストを通じて一番を決めるのは楽しい。
  5. 緊張する
    • 普通、塾でまず緊張はしないのだが、一問ずつ時間制限があって、一問ずつ答え合わせをするので、数分ごとに結構な緊張感が出てくる。それを乗り越えて、小さく勝ち負けが決まり、ランキングがダイナミックに変わる。賢くてなめてる奴も、賢くなくて諦めている奴も、そこではプライドをテーブルの上にBETしているのだ。
そんな感じ。

まとめると、「頻繁なフィードバック」が超大事。ゲームで言えば、プレーヤーが死ぬ場面。スポーツで言えば勝ち負け。学習においても「僕って賢いの?」という問いに頻繁に答えることができる場作りが大事。


2012年11月18日日曜日

いろいろ試したがgPadというテキストエディタがいい

テキストエディタに悩み始めるとあっという間に時間が過ぎる。

そしてどのエディタもとても良くできてるので、凄く悩む。

古いタイプのWindowsユーザなら秀丸エディタがエディタの代名詞だっただろう。しかし、秀丸はシェアウェア。企業内できちんとライセンス管理できるかどうかは不安だ。また、シェアウェアは人に勧めにくい。

vimというマッチョな人もいるだろう。プログラミングをする上ではよく出来ているのだが、日本語をたくさん書くときには、コマンドモードの切り替えが煩雑だ。何よりも非プログラマーには操作が複雑すぎる。自分がいくら慣れても、職種の違う人にナレッジが共有できないと、戦力増強フェーズでは厳しい。

僕たちは、htmlも書けば、議事録も書く。議事録も書けば議事録も書く。

そんな分けで、Web制作する会社人がとりあえず持っておくテキストエディタを探し求めていて、たどりついがのが、gPad。以下、見所。

1.タブが保存&復帰できる
タブエディタはたくさんあるが、タブが保存できるというのは珍しい。アプリを終了しても、再度立ち上げた時には、前回開いてくれていたファイルをもう一回開いてくれるのだ。会議の議事録いっぱいと、HTMLとPerlとPHPとってやつが、せーので開いてくれるのはありがたい。

2.フォントサイズがぬるぬる変えれる
議事録をとるときいには、プロジェクターに映しながらということを良くやる。そうなると、大きな文字でタイプしたい。Windowsアプリには、コントロールキーをおしながらホイールを回すと、拡大ができるという機能を備えたアプリが多いが、gPadもこの機能をサポートしている。ホイールでぐりぐりやりながら拡大するので、ちょうどいいサイズに拡大できる。

3.DIFFツールとの連携がいい
ファイルの比較機能はどのエディタもがんばっては居るが、gPadは外部のファイル比較ツールを呼び出すことができる。Windowsを使っているWeb制作者なら、ほとんどの人が、TortiseSVNを使っているだろう。TortiseSVNに組み込まれている、TortiseMergeを呼び出すことができるので、いつも使っているファイル比較ツールをテキストエディタからでも呼び出せるのだ。

4.マクロがある
秀丸の時には大量にマクロを作っていて悦に至っていた。プログラマーとしての母国語は秀丸マクロだと言ってもいいくらいだった。ところがいくら作ってもシェアウェアだと人に勧めるのが難しい。gPadもJavaScriptでマクロがかける。私は「一行目の文字列をファイル名にして、固定フォルダに保存」というマクロを自作して使っている。保存フォルダをDropBoxとかにすれば、なんちゃってエバーノートのできあがり、メモがどんどんクラウド化される。超便利。

5.最近使ったファイルだけじゃない
最近使ったファイルという機能は、どのアプリでもよくあるが、gPadは「最近閉じたファイル」というメニューと、最近使ったフォルダという機能がある。さっき閉じたファイルを開きたいというニーズはあるし、よく使うフォルダをダイレクトに開くことができるというのも便利。

そんな感じ。逆に、gPadの売りとなってる、csv、tsv編集機能は試しに使ってみたが、そんなにしっくりこなかった。話だけ聞くと、それは便利だと思うのだけれど、表っぽいUIでエクセルのようでエクセルでないというのは、違和感が最後まで抜けなかったのだ。そもそもエクセルのないPCなどない。

アウトライン機能も使いそうで使わなかった。本格的なプログラミングはEclipseでやっているからかも知れない。

また、サクラエディタもかなり便利で、ほとんどのことはできるのだが、僅差でgPadが便利かなという感じ。

相場からみたセキュリティ対策

ITセキュリティには一定のルールがあって、業務上はそれに従わなくてはならないことがほとんど。

ただ、漫然とルールに従っているだけでは、ユーザサービスにおいては競合優位性は作れない。「簡単ログイン」やFaceBookのいいねボタンなどは、一般的なITセキュリティレギュレーションからは離れているが、圧倒的な利便性から普及した。

逆に言えば、「ユーザを守りながらも」「利便性の高い」セキュリティ指針であれば、競争優位に立てるということ。

ということで、ルールではなく「相場」としてのセキュリティを示す。

1.究極はセッションなんて無くてもいい
図書館の貸し出しシステムをご存じだろうか。東京都の中央区の図書館システムと渋谷区の図書館システムは両方とも「セッション」という概念がない。検索まではログインせずに使えて、貸し出し依頼をする瞬間に、IDとパスワードを入力する。貸し出し依頼という行為の数がそもそも限られているのだから、その瞬間で十分なのだ。セッションがなければセッションが乗っ取られるリスクも少ない。

2.情報が取り出せなければ、緩くても大丈夫
誰かにメールを送るのに、相手側のメールサーバへのログインは必要ない。鍵をかけなくちゃいけないのは、情報の取り出しであって、送信にはさしたるセキュリティは必要無いのだ。例えば「出前」という仕組みは、電話一本でできる。(気を利かせて会員登録させようとするのは野暮)
図書館の貸し出しシステムも、デフォルトのパスワードが緩くて、初期パスワードのままでも使えるケースがあるが、いたずらで予約をいっぱいされるくらいの被害で、何か情報を盗まれるという心配は無い。

3.同一セッションだけを対象にするのならログインの概念は必要無い
国税庁がe-taxという仕組みを提供している。確定申告の電子申請まで全て行うには、そのための手続きに何度も役所に足を運ばなくてはいけない(意味が無い)。ところが、確定申告の書類をつくるだけなら、ログインしなくても、必要な情報を記入すれば、確定申告のための生類は生成される。一次情報はサーバ上にあるのだが、永続化はされないし、別の端末からのアクセスもできない。データを保持したいというニーズに対しては、「今作りかけの確定申告情報をファイルとしてダウンロード」という機能が提供されている。PCのファイルをアップロードすれば続きから再開できる。

4.大事な情報の前にはログインしっぱなしでいい
Amazonの仕組みがよくできているのは、基本ログインしっぱなしであるということ。だから、再訪問したときにも、ずっと私を覚えていてくれていて、商品をレコメンドしてくれる。じゃぁ、パソコンを盗まれたら、物が買い放題じゃないかと言う心配があるかもしれない。しかし、商品を実際に購入するときには、パスワードを入れ直さなくちゃいけない。さらにさらに、万一パスワードが盗まれて居たとしても、届け先の住所を変えるには、クレジットカード番号をもう一回いれなおさなくちゃいけない。クレジットカード番号を入れ直すということは、もはや何も盗めてないのと一緒。

レコメンドから素性がばれるのはそれはもう情報流出として被害がでかいのだ!って人もいるだろうが、このあたりが利便性とのバランスだろう。

5.リアルな住所に届けるという認証
クレジットカード番号だけで物が買えてしまうという通販の仕組みは、酷いセキュリティのようにも見えるが、最終的には荷物を受け取るときに住所がばれるので、なりすましがやりにくい。ここにうまく目をつけているのが、オンラインバンク。窓口で対応する銀行に比べて、全て郵送で手続きをするため、なりすましがやりにくくなっている。

まとめ

セキュリティというのは、「今アクセスしている人が本人かどうかの確認」ができているかどうかに尽きる。
  1. 同一クッキーを送ってくる人は同じ人だろう
  2. パスワードは本人しか知らないだろう
  3. メールの受信箱は本人しか見れないだろう
  4. ショートメッセージの受信箱は本人しか見れないだろう
  5. 電話は本人しか受け取れないだろう
  6. 郵便物は本人しか受け取れないだろう
という感じ。パスワードが一番メジャーだが、すぐ忘れるし不便。メールはとてもメジャーだが、一人で複数人を名乗れる。ショートメッセージや電話は、大量に取得するには契約が面倒なので、本人かつ一人だけという特定をするのには便利。郵送物は本人確認ができる上に、電話に比べてもさらに複数の受信BOXを作りにくい。

一般的な、Webサービスは、会員登録時にメールで、ログイン時はパスワードという組み合わせが多い。セキュリティを強化する場合にはショートメッセージを組み合わせている。AmazonのEC2なんかは電話のコールバックを入れている。メルマガサービスなんかはメールだけで購読の登録解除ができるようになってる。

2012年11月3日土曜日

非デザイナーがイラストレーターをインストールしておいた方がいい理由

自身はデザイナーではないので、イラストレーターはあまり使ってなかったのだが、やっぱり観念してインストールした。

実際にはイラストは書かない。しかしイラストレーターには、「画像形式のコンバーター」としての機能がある。

こんなシーンに使える。

1.年賀状を写真屋さんで印刷してもらうために大きなJPEGファイルを作りたい

PCで年賀状を作れても、印刷はとても面倒。自宅のプリンターでは時間がかかる。何よりもインク代がかなりかかる。何色のインクが足りなくなるかは、やってみてからでないと分からない。来年にインクジェットのノズルが詰まっているかも知れない。

一方で、写真屋さんに持ち込めば、一気に解決。印刷ミスもない。ところが写真屋さんでは写真を印刷するフローしかなく、PDFなどを印刷はしてくれない。ということで、Wordで作った印刷データをPDFに変換し、それをイラストレーターに取り込んで、高解像度のJPEGファイルにすれば、写真屋さんで印刷してもらえる。

最初からイラストレーターで年賀状を作ってもいいのだが、Wordの方がテンプレートが充実していたり、何よりも、Officeの操作なら誰でも文字組ができる。行間の調整なんて、イラストレータの初心者ではまるで分からないだろう。

2.PDFの一部をエクセルやパワポに取り込みたい

企業内では、PDFでの情報のやりとりが多い。特に会社をまたがる情報は、再編集可能なOfficeドキュメントではなく、PDFでやりとりされる。発注先からの提案資料の一部を取り出して、自分の企画書に取り込んで、吹き出しでコメントしたいというようなケースはある。

そういうときも、イラストレーター!PDFをイラストレータに取り込んで、WMF(ウィンドウズメタファイル)に書き出す。WMFはオフィスのオートシェイプの形式だから、拡大してもキレイ。

つまり、PDFやWMFなどのドロー系のフォーマットと、JPEGなどのラスタイメージのコンバーターとしてイラストレータは優秀なのだ。

「パスとしてコピー」を使えば、作業効率がめちゃくちゃ上がる

マウスを使ったグラフィカルインターフェースには、「ドラッグ&ドロップ」という操作がある。ところが、実際にはこのオペレーション、「掴む」「掴んだまま移動させる」「別のウィンドウに落とす」という一連の作業を途切れることなくやらなくちゃいけないので、小さなマウスパッド・小さな画面では難しい。

だから、ファイルの移動でさえも、ファイルを右クリック→切り取り→対象のウィンドウをアクティブに→右クリック→貼り付け、ということの方が「確実」なオペレーションになる。割とやってる人は多い。

ウィンドウズのフォルダ上でのファイル操作では、ファイルのカット&ペーストの概念があるが、アプリをまたがるとそうは行かない。

例えば、できないのだけれど、理想としてはこういうことをしたい。

  1. デスクトップ上のファイルをコピー
  2. gmailを開いて、ファイルを添付したいので、ペースト
  3. 送信
みたいなことをしたい。企業内のメールなんて、ほとんどファイル共有ツール。ファイル添付をなんぼほど確実にするかが仕事の精度みたいなもん。でもできない。メールソフトとが、OUTLOOKだったりすると、Officeソフトの「送信」機能で、一気に添付ファイル登録まで行けるが、このご時世、なんでもかんでも、ファイルを開くダイアログからのファイル選択。

てことで、発明したのが、このフロー。
  1. 対象のファイルをシフト+右クリック→パスとしてコピー
  2. gmailのファイルを開くダイアログでペースト
  3. 送信

「パスとしてコピー」機能は、ファイルのフルパスをコピーしてくれる。ファイルを開くダイアログは、フルパスを入れると、直接指定が可能。だから、フォルダを探し回る必要がない。文字通り、目をつむってもファイルが添付できる。

さてこの、パスとしてコピー機能。フォルダでなくても使える。ウィンドウズキーから、ファイルを検索しても、シフト右クリックでパスとしてコピーできる。それだけではなく、「ファイルの保存ダイアログ」でも可能なのだ。

まさにこのブログを書いているときにも使っている。画像を加工して、それを添付するのに、Paint.netというお手軽ペイントソフトを使っている。まず、保存する。もう一回「名前をつけて保存」をすると、さっき保存したこのファイルがダイアログに出てくる。それをシフト右クリックで、パスとしてコピーを選ぶと、「今編集中のフルパス」がクリップボードにコピーされる。

あとは、そのフルパスを、ブログのファイルアップロードダイアログにペーストすればよい。

この作業工程でいいのは、「今のフォルダの位置」を一切意識しないということ。だからこのブログにアップしているファイルは、無題.pngをデスクトップに上書きで作ってはアップしている。ファイル名さえ自分では着けてない。パーマリンクとしてのファイル名フルパスがやりとりできさえすれば、コンピュータ様は満足なのだ。

フォルダを探し回っている時間は無駄でしかない。間違ったファイルを公開してしまうというミスはとんでもなく大きい。だから、「今僕が触っているファイルのフルパスを確実に伝える」ということは、時間もリスクも減らす上で大事なのだ。

エクセルのWebクエリでログインまでしちゃう方法

昔に比べると、社内業務システムも柔軟になってきて、Webブラウザだけで入出力ができるようになり、会計上のルールで印刷が必要な場合にはPDFで出力できるようになってる。

しかしながら、グラフに出力してみたり、分析の軸をあれこれ変えてみたいというニーズに対しては、サーバーサイドエンジニアリングは、「素のエクセル」の前には手出しができない。やりたいことがエクセルならエクセルでやってもらうのが一番。

ところが、エクセルには情報を収集する仕組みがなく、情報システムのDBに格納されている。間をとって、CSV出力機能を設けているところが多いだろうが、Webシステムからのダウンロードは、PCのダウンロードフォルダを汚す。何よりも重要な情報が暗号化されてない中間ファイルが存在することがよろしくない。

そこで、最もエクセルと情報システムとを最短距離で結ぶのが、エクセルのWebクエリ機能。機能としてはシンプルで、ブラウザにHTMLのTABLEとして出力されているものが、そのままエクセルのセルにセットされる。

中間ファイルがなく、さらに情報システムも特殊なことをしないでよい。

ところがこのWebクエリ、画面遷移ができない。とあるURLをGETするだけ。だから、ログインが必要な深い画面で、Webクエリを使うと単にログインフォームを取得するだけになる。

じゃぁってことで、エクセルの別の昨日で、ログインをしておけば、きっと同じセッションを使えるはずだから、Webクエリでもログイン後の画面が見えるはず。

ということで長くなったけど、手順。

1.開発ツールから挿入→AnctiveXコントロール→コントロールの選択を選ぶ
2.MicroSoft Web Brouser を選択

3.そのままだと、どこにもナビゲートできないので、マクロで画面を遷移させる
この例では、シートがアクティブになった瞬間に、フェースブックのトップページに移動している。

あとは、デザインモードを解除して、シートをアクティブにすると、ログインフォームが画面上に出てくるので、手動でログインすればよい。オートメーションでログインまするという方法もできそうではあるが、それはセキュリティの穴を作ることになるので、要求があってもやらない。

これで、ログイン後にしか見れない画面のTABLEをWebクエリで取得ができる。Webクエリそのものの説明はあちこちにあるのでそちらを参照。

ちなみに、表のデータなのにがんばってDIVで表現しているページがあったりすると、Webクエリは使えない。いやいや表なんだからTABLEで表現しなさいよと。Tableタグを排除するのがモダンなHTMLなんだと勘違いしている先進的コーダ-はちと困る。

ログイン機能付きWebクエリつきエクセルファイルは、位置づけとしては、「分析機能の付いたブラウザ」。データを保存しなければ、セキュアだし、仮に保存したとしても、エクセルには暗号化機能があるので、CSVよりはセキュリティ的にまし(少なくとも内容が検索インデックスされることはない)。