Software Design (ソフトウエア デザイン) 2007年 08月号 [雑誌]

””安い”“、”“字が多い”“、”“CD付いて無い”“と飯食いながらや電車のなかなど手持ちぶさたなときの”“読む本”“にぴったりなことで有名なSoftware Designの8月号買いました。

特にレコメンデーションエンジンの連載がためになりました。人と人やモノとモノの相関を求める関数っていっぱいあるんですな。またスパム判定で有名なベイズ推定をレコメンデーションに使うっていうのもその分野の人にとっては普通なのかもしれませんが、まさにその発想はなかったわ。

次回は実装編だそうで超楽しみなんですが、言語はPython。最近色んなところでPythonにぶちあたります。Python読めないと損してる感が高まってきてる・・・。

ヒストリエ 4 (4) (アフタヌーンKC)

マンガをあまり読まない友達でさえも、「4巻はいつ出るんだ!」と怒らせたヒストリエの4巻が出てました。これ読んでAoEシリーズがやりたくなった人がいっぱいいると見た!(含む俺)

AoKのシナリオ作れるヤツで誰か再現して!(暗黒の時代 vs 領主の時代で)

Microsoft Age of Empires 2 Gold Edition
ユメのチカラ: 人月の神話

Brooksはプログラミングがなぜ楽しいかという事も記している。

  • 物を作り上げる純粋な喜び
  • 他の人々に役立つものを作ることの楽しさ
  • 複雑なパズルのような組み立て部品を完成させ、それが巧妙に転回するのを眺めるおもしろさ
  • つねに新しいことを学ぶという喜び
  • 非常に扱いやすいメディア(媒体)で作業する喜び。その上、プログラムというのは、詩人の言葉と違って、現実に動いて働きだす

俺がプログラミング関連書籍の古典の中でも一番好きなのがこの人月の神話です。

先見性があり普遍的な教訓の数々が素晴らしいですがここであげられているように、何より”“プログラミングは何故楽しいのか”“という根本的な点に触れているところが大好きです。

既にIT業界にかかわっている人も自分がどの要素に強い喜びを感じるかで自分のキャリアを見直すことが出来ると思います。また、この業種と関わり合いがある人も相手が何にモチベーションを感じているのかを知るとスムーズに仕事が進むんじゃないかと思います。

逆に、デザイナーや営業の人は何に喜びを感じてやっているのか気になります。(そういう本が知りたい)

人月の神話―狼人間を撃つ銀の弾はない
  • 人月の神話―狼人間を撃つ銀の弾はない
  • ピアソンエデュケーション(2002-11)
  • ピアソンエデュケーション
  • (著)Jr.,フレデリック・P. ブルックス
  • (原著)Frederick Phillips,Jr. Brooks
  • (翻訳)滝沢 徹
  • (翻訳)富沢 昇
  • (翻訳)牧野 祐子
  • 定価:¥ 3,045
  • 新品価格:¥ 3,045
  • 中古価格:¥ 2,374
  • ASIN:4894716658
ひげぽん OSとか作っちゃうかMona – TaPLを買うか迷い中

追記

計算論 計算可能性とラムダ計算、借りてきた。これは厳しい。。

買っといて挫折済みの俺が来ましたよ。

一緒に買ったSchemeによる記号処理入門はスゴイ良かったので・・・ん~~~引き分けっ!!

計算論 計算可能性とラムダ計算 (コンピュータサイエンス大学講座)
Schemeによる記号処理入門
  • Schemeによる記号処理入門
  • 森北出版(1994-04)
  • 森北出版
  • (著)猪股 俊光
  • (著)益崎 真治
  • 定価:¥ 2,835
  • 新品価格:¥ 2,835
  • 中古価格:¥ 4,970
  • ASIN:4627836708
とあるはてな社員の日記 – まっさらなサーバを30分で本番投入できるようにする

アプリケーションのデプロイは、ずいぶん前から、switchtower(現capistrano)で、ほぼコマンド一発で済んでおり、これはすぐに終わります。

残りの「アプリケーションの動作に必要なライブラリ等のインストール・設定」と「監視などインフラの一部として動作するための設定」の部分は、以前は相当の時間と人手がかかっていた部分なのでした。が、「なんでもrpmパッケージ化 & yum で一発インストール」と最近、話題に登っていた「設定自動化ツールpuppet」を導入することで、ほぼ自動化されるようになり、大幅な時間短縮ができるようになりました。

以前書いたように、Webサービス作る時ってサーバーの設定って基本、何かと面倒で時間がかかりますよね。この間の取材の時にもその話をしたんですが、田口さんは、

「サーバー?そうっすか?適当なレンタルサーバーで小一時間で終わんないっすか?」

「監視とか、ログの設定とかそういう面倒なのはサービスが流行ってからでいいんじゃないっすか?」

とあっさり。確かにひとりで作るWebサービスの場合。まったくその通りだと思いました。たとえばDreamHostの場合、FastCGIも設定されてるし、ローカルでRailsで作ったらfreezeしてどっかにおけば済む話。DBもsqlite3でいいじゃないかと。もし流行ったらMySQLとかに移行すればいいじゃないかと。サーバー設定は困った課題リストから外すことにしよ。(仕事でつくるWebサービスの場合は別なので勉強はしてきますよ!)

ヘンシュウチョさんの、

「RailsだとWeb APIとか自動生成できるってホント?俺に教えてよ!つーか勉強会やろうぜ」

という発言を切欠に小勉強会をやってきました。

ヘンシュウチョさんはオープンソースXML DB eXistの話。XPathやXQueryなどXML関連は仕様の分裂や議論が絶えないので深追いや混乱が楽しいですね。eXistの日本語ドキュメントは殆どなさそうなので是非公開してほしいです。

yoshukiさんはvimやscreen関係の開発環境の話でした。俺なんかはすぐ開発環境をおそろかにして生産性を下げてしまうので非常に参考になりました。

俺は「土日でサービス作れるようになる」を目指しているので、RESTfulアプリケーションの簡単作成方法を話ました。

スライドだけだとさっぱりなので手順とソースも上げとこうと思います。

ソース:

rest-todo.tar.bz2

手順:

プロジェクトを作成。(面倒なのでsqliteを使います)

$ rails rest-todo -d sqlite3
$ cd rest-todo

scaffold_resourceジェネレーターを使って、Controller, Migrationファイル, route.rbファイルへの設定追加をします。

$ ruby script/generate scaffold_resource Task name:string completed:boolean created_at:timestamp updated_at:timestamp
$ tree app
app
|-- controllers
| |-- application.rb
| `-- tasks_controller.rb
|-- helpers
| |-- application_helper.rb
| `-- tasks_helper.rb
|-- models
| `-- task.rb
`-- views
|-- layouts
| `-- tasks.rhtml
`-- tasks
|-- edit.rhtml
|-- index.rhtml
|-- new.rhtml
`-- show.rhtml

migrateしてからサーバーを起動します。

$ rake db:migrate
$ ruby script/server

生成された一覧画面。

easy_restful_app_01

Web APIでのCRUDをirbから確認。

$ irb -r 'net/http'
> http = Net::HTTP.start('dev', 3000)
> puts http.get('/tasks.xml').body
> puts http.get('/tasks/1.xml').body
> http.post('/tasks.xml', 'task[name]=task3')
> puts http.get('/tasks.xml').body
> http.put('/tasks/3.xml', 'task[name]=task3...!!??')
> puts http.get('/tasks/3.xml').body
> http.delete '/tasks/3.xml'
> puts http.get('/tasks.xml').body

認証機能を追加。authenticatedジェネレーターでuserモデルを使ってaccountコントローラーを生成します。

$ ruby script/plugin install http://svn.techno-weenie.net/projects/plugins/acts_as_authenticated
$ ruby script/generate authenticated user account
$ rake db:migrate

出来たDBを確認。

$ sqlite3 db/development.sqlite3
SQLite version 3.3.8
Enter ".help" for instructions
sqlite
> .tables
schema_info tasks users
sqlite
> .schema tasks
CREATE TABLE tasks ("id" INTEGER PRIMARY KEY NOT NULL, "name" varchar(255) DEFAULT NULL, "completed" boolean DEFAULT NULL, "created_at" datetime DEFAULT NULL, "updated_at" datetime DEFAULT NULL);
sqlite> .schema users
CREATE TABLE users ("id" INTEGER PRIMARY KEY NOT NULL, "login" varchar(255) DEFAULT NULL, "email" varchar(255) DEFAULT NULL, "crypted_password" varchar(40) DEFAULT NULL, "salt" varchar(40) DEFAULT NULL, "created_at" datetime DEFAULT NULL, "updated_at" datetime DEFAULT NULL, "remember_token" varchar(255) DEFAULT NULL, "remember_token_expires_at" datetime DEFAULT NULL);

login_requiredメソッドがおかしくて(Basic認証の方だけ)100%認証が通らないのでオーバーライドします。

$ vim app/controllers/application.rb
include AuthenticatedSystem

def login_required
username, passwd = get_auth_data
if self.current_user == :false && username && passwd
self.current_user = User.authenticate(username, passwd) || :false
end
logged_in? && authorized? ? true : access_denied
end

タスクのCRUD全部に認証をかけます。

$ vim app/controllers/tasks_controller.rb
class TasksController < ApplicationController
before_filter :login_required
(略)
end

Jester.jsを使ってJavaScriptからWeb APIと認証の動作を確認します。

$ wget 'http://svn.thoughtbot.com/jester/tags/rel-1.3/jester.js' -O public/javascripts/jester.js
$ vim app/views/layouts/tasks.rhtml
<%= javascript_include_tag :defaults %>
<%= javascript_include_tag 'jester' %>
$ mv app/views/layouts/tasks.rhtml app/views/layouts/application.rhtml

FireBugsから確認します。認証が必要なリソースにアクセスしようとするとBasic認証のWindowが表示されます。

easy_restful_app_02

Jester.jsでCRUDの確認。(実際には_methodパラメータによるメソッドエミュレーションを使っているのでPUTやDELETEがPOSTになっています。)

easy_restful_app_03

通常のページとWeb APIを同じロジックで認証できるのはシンプルですっきりした感じがします。派生する話題も色々ありそうで今後も手っ取り早い作り方をチェックしていきたいと思います。

田口元の「ひとりで作るネットサービス」探訪: 【番外編】カップルで作るネットサービス──うわさメーカー

カップルでネットサービスを作った2人がいる。ネット企業に勤め、開発のスキルも持つ者同士。普段からシステムの話で盛り上がる2人が、力を合わせてサービス開発を始めた事の始まりは……。

       ,.ィ , - 、._     、
.      ,イ/ l/       ̄ ̄`ヽ!__
     ト/ |' {              `ヽ.            ,ヘ
    N│ ヽ. `                 ヽ         /ヽ /  ∨
   N.ヽ.ヽ、            ,        }    l\/  `′
.  ヽヽ.\         ,.ィイハ       |   _|
   ヾニー __ _ -=_彡ソノ u_\ヽ、   |  \         つまりこの連載自体、
.      ゙̄r=<‐モミ、ニr;==ェ;ュ<_ゞ-=7´ヽ   >  独り者にダメージをあたえるために
.       l    ̄リーh ` ー‐‐' l‐''´冫)'./ ∠__   始めから仕組まれたものだったんだよ!!
       ゙iー- イ'__ ヽ、..___ノ   トr‐'    /
       l   `___,.、      ./│    /_
.        ヽ.  }z‐r--|     /  ト,        |  ,、
           >、`ー-- '  ./  / |ヽ     l/ ヽ   ,ヘ
      _,./| ヽ`ー--‐ _´.. ‐''´   ./  \、       \/ ヽ/
-‐ '''"  ̄ /  :|   ,ゝ=<      /    | `'''‐- 、.._
     /   !./l    .\    ./    │   _
      _,> '´|l. ミ:ゝ、  _/,´\  ./|._ , --、 | i´!⌒!l  r:,=i
.     |     | l. /    |=  ヽ/ | .|l⌒l lニ._ | ゙ー=':| |. L._」
      l.    | l./     .!    / | i´|.ー‐' | / |    |. !   l
.     l.   |. .!    .|  /  .!.|"'|.   l'  │-==:|. ! ==l   ,. -‐;
     l   |  l.    .| /   | i=!ー=;: l   |    l. |   | /   //
       l  |   l    .|/     !│ l    l、 :|    | } _|,.{::  7
        l  |   l   ./     .| |__,.ヽ、__,. ヽ._」 ー=:::レ'  ::::::|;   7
.      l |     l  /     .|. \:::::\::::: ヽ  ::::::!′ :::|   .:/
.       l |    .∨      !   /ヽ::: `:::    ::::  ...
         ナ ゝ   ナ ゝ /    十_"    ー;=‐         |! |!
          cト    cト /^、_ノ  | 、.__ つ  (.__    ̄ ̄ ̄ ̄   ・ ・
ミミ:::;,!      u       `゙"~´   ヾ彡::l/VvVw、 ,yvヾNヽ  ゞヾ  ,. ,. ,. 、、ヾゝヽr=ヾ
ミ::::;/   ゙̄`ー-.、     u  ;,,;   j   ヾk'! ' l / 'レ ^ヽヘ\   ,r゙ゞ゙-"、ノ / l! !ヽ 、、 |
ミ/    J   ゙`ー、   " ;, ;;; ,;; ゙  u ヾi    ,,./ , ,、ヾヾ   | '-- 、..,,ヽ  j  ! | Nヾ|
'"       _,,.. -─ゝ.、   ;, " ;;   _,,..._ゞイ__//〃 i.! ilヾゞヽ  | 、  .r. ヾ-、;;ノ,.:-一'"i
  j    /   ,.- 、  ヾヽ、 ;; ;; _,-<  //_,,\' "' !| :l ゙i !_,,ヽ.l `ー─--  エィ' (. 7 /
      :    ' ・丿   ̄≠Ξイ´,-、 ヽ /イ´ r. `ー-'メ ,.-´、  i     u  ヾ``ー' イ
       \_    _,,......::   ´゙i、 `¨ / i ヽ.__,,... '  u ゙l´.i・j.冫,イ゙l  / ``-、..- ノ :u l
   u      ̄ ̄  彡"   、ヾ ̄``ミ::.l  u   j  i、`ー' .i / /、._    `'y   /
              u      `ヽ  ゙:l   ,.::- 、,, ,. ノ ゙ u ! /_   ̄ ー/ u /
           _,,..,,_    ,.ィ、  /   |  /__   ``- 、_    l l  ``ーt、_ /  /
  ゙   u  ,./´ "  ``- 、_J r'´  u 丿 .l,... `ー一''/   ノ  ト 、,,_____ ゙/ /
        ./__        ー7    /、 l   '゙ ヽ/  ,. '"  \`ー--- ",.::く、
       /;;;''"  ̄ ̄ ───/  ゙  ,::'  \ヾニ==='"/ `- 、   ゙ー┬ '´ / \..,,__
、      .i:⌒`─-、_,....    l   /     `ー┬一'      ヽ    :l  /  , ' `ソヽ
ヾヽ     l      `  `ヽ、 l  ./  ヽ      l         )  ,; /   ,'    '

参照: 田口元の「ひとりで作るネットサービス」探訪: シンプルなツールをシンプルな生き方で──Plnet.jp・駒形さん

d01nx.jpg

E-Mobileのデータ通信用の端末(CF)買いました。

しばらく使ってみたところいい感じなので、家の固定回線とか公衆無線LANサービスとか携帯のパケホーダイとかWorld of Warcraftとか全部解約しようと思います。(WoW関係無い)

外で作業するのに今の糞PC用の大容量バッテリーでも買おうかと思ったんですが、3時間ぐらいでバッテリーが切れるぐらいが疲れなくて丁度良いので止めました。

iPhoneとかが当たり前になって公衆無線LANが23区カバーするようになるまではこれで頑張りたいです。

昨日、知合いのデスマ(ーチ)案件でポスグレが急に遅くなるトラブルが発生したという話を聞きました。(他人事)

そういえば2005年に勉強会でPostgreSQLのチューニングの話をやったなと思って、探したら資料が出てきました。

65536倍速いSQL

とてもまじめな勉強会のタイトルには見えませんが、自分自身Query Planの見方など、ポスグレを久しぶりに使うときは見直すところではあります。

内容自体はシーラカンス本などを全部読めば載っていることばかりですが、実際は業務に追われてなかなか把握する暇が無い人も多いと思います。ですがこのくらいの内容で休日出勤が無くなるならお得です。

PC UNIXユーザのためのPostgreSQL完全攻略ガイド―豊富な機能と高い信頼性を誇るオープンソースデータベース
「PHP 4」のサポートが2007年末で終了へ:ニュース – CNET Japan

「PHPの開発チームは、PHP 4のサポートを2007年末で打ち切ることをここに発表する」と、PHPプロジェクトの事務局は、米国時間7月13日にPHPのウェブサイト上に掲載した。ただし、「重大なセキュリティ上の修正については、ケースバイケースで引き続き2008年8月まで対応する」としている。

ひぃぃ、PHP4のサポートが終了!?

UbuntuもFeisty FawnからPHP4入ってねーし、Plnet.jpはPHP4で作ってるのに困ったな?。

だからみんなAwesomeFrameworkで作れとあれほど・・・。(言ってない)

awesome_framework.png