主夫ときどきプログラマ

データベース、Webエンジニアリング、コミュニティ、etc

UNIX設計思想に学ぶ、3つの現代サッカーの楽しみ方 : 【UNIXという考え方―その設計思想と哲学】


このエントリーは「UNIXという考え方―その設計思想と哲学 」のブックレビューです。


UNIXというオペレーティングシステムの設計思想とその哲学について解説されている。
その考え方はアプリケーション開発だけでなく日常の様々な問題解決にもおおいに手助けしてくれる。
それでは現代フットボールに見えかくれるすUNIX哲学との共通点について紹介しよう。


Small is beautiful

フットボールというスポーツの最大の目的はゴールを挙げることだ。しかしプレーの90%以上は直接ゴールとは関係がない。
本当だろうか?ゴールを奪うまでのプロセスを考えてみよう。
ゴールへのスタートは相手ボールを奪うディフェスから始まる。それにより奪ったボールをゴール前に運び、
ラストパスに反応したプレイヤーが相手ゴールにボールを突き刺すことで得点となる。
ボールを奪ったりパスでつないで運んだり、という行為は必要ではあるが
ゴールに直接関係するプレーはフィニッシャーの放つシュート以外にはないのだ。(オウンゴールという天の恵はまれにあるが。)


そして注意深い人は気づいているだろう、シュート以外の行為はゲーム中随所にあらわれるプレーだということに。
パス、トラップ、ダイレクトプレー、デコイラン、一つ一つのプレーだけではゴールを奪うことはできない。味方の間でボールを受け渡すのみだ。
しかしこれらを様々に組み合わせゴールに向かうことで大きなチャンスとなり得点が生まれる。
まさにUNIXの設計思想「Small is beautiful」そのものだ。

小さなプログラムは、単独では大したことはできない。ほんの一つか二つの機能を実行するだけだ。
しかし、それらを様々に組み合わせることで、真のパワーを発揮する。
部分の総和は全体よりも大きくなり、大きくて複雑な作業も簡単に処理できる。

一つのプログラムには一つのことをうまくやらせる

ガットゥーゾというイタリア人選手がいる。
彼は名門ACミランに所属する選手で、W杯と欧州CLの優勝も経験もある成功しているフットボールプレーヤーの一人だ。
しかしそんな彼もテクニック関してはセリエBレベルと言われるほどヘタクソだという。
ではヘタクソ呼ばわりされる彼が、なぜクラブや代表チームでレギュラーに定着し様々な舞台に立てているのだろうか。


ガットゥーゾという選手を語る時、真っ先にでてくる事と言えばフィジカルの強さだろう。
無尽蔵ともいえるスタミナで誰よりもピッチ上を駆け回り、敵の攻撃の芽をことごとくつぶしていく。
そして生まれ持った闘争心がそのプレーに拍車をかけ、狂犬とも呼ばれほどだ。
たとえテクニックが劣ろうとも、それを補ってあまりあるフィジカルの強さでチームに大きな力を与える。
指揮官たちが彼を使い続ける理由はそこにある。


一つの事をうまくやる、それを追求する事で大きな成果を収めることができるといういい例だろう。

最良のプログラムはクストーのレイクフライのように、生涯において一つの事をうまくやるプログラムだ。
ソフトウェア開発者たちが単一機能プログラムを作り上げることだけを追求し続けること、これがいかに難しいかを知ったら驚くかもしれない。

過度の対話的インターフェースをさける

インターフェースとは何か?IT用語辞典では以下のように解説されている。

二つのものの間に立って、情報のやり取りを仲介するもの。また、その規格。「IF」「I/F」の略号で示されることもある。
インターフェースとは|interface|I/F|IF - 意味/定義 : IT用語辞典

ではフットボールにおけるインターフェースとは何だろうか。
フットボールでは選手間でボールを受け渡す。
その時ボールを出す相手、ボールの早さ、タイミングなどを対話によって伝えるだろうか。
そんな事はありえない。そうしている間にボールを奪われあっさりゴールを与えてしまうだろう。


その伝達方法こそ「動き」でありインターフェースだと言える。ボールの動きであり、プレイヤーの動きでもある。
選手は動きによってお互いの意思をやり取りするのだ。
スペースに出されたボールには「走れ」という意思が込められているし、
スピードの遅いパスには「相手を引付けろ」という意思が込められている。
「動き」に対する意味を明確に簡略にして試合に臨む事で、流れるようなパスワークからの得点、
ということを実現できるのだ。

拘束的(対話的)プログラムは、他のプログラムと結合するのが難しい。
UNIXの長所の一つは、プログラム同士が効果的に対話する事にある。

さいごに

今回紹介したもの以外にも様々な定理が存在する。
その本質は「柔軟であり続ける」とういことだろう。
まだ見ぬ未来へのアプローチの一助としてこれらを取り入れてみるのはいかがだろうか。

5分で簡単セッティング、MacでLet's GAE

MacでGoogleAppEngineの開発環境を構築する手順のまとめ
Mac OS X 10.6.6

1.pythonをインストールする

OS X には標準でpythonはインストールされていますがこのバージョンは2.6なのでGAEでは利用できません。
GAEで利用できるpythonのバージョンは2.5なのでpython2.5をインストールする必要があります。

1.1 MacPorts からインストールする

MacではMacPortsというパッケージ管理システムを利用していろいろなソフトウェアを手軽にインストールすることができます。
これを利用してpython2.5をインストールします。

まずはMacPortsをインストールしましょう。
http://www.macports.org/
MacPortsの詳しいインストール方法はこちら
http://blog.soi33.org/archives/17

1.2 python2.5 と python_selectのインストール

MacPortsをインストールすることで、python2.5を簡単にインストールできるようになりますが、
そのままでは2.5と2.6が混在しバージョンの切り替えが困難になってしまいます。
そこで、登場するのがpython_select。pythonのバージョンを簡単に切り替えてくれます。
ではMacPortsを使ってインストールしましょう。

$ sudo port install python25
$ sudo port install python_select

これでpythonの準備完了です。

# pythonのバージョン確認
$ python --version
Python 2.6.6
 
# pythonの切り替え
$ sudo python_select python25
Selecting version "python25" for python
$ python --version
Python 2.5.5

2. GoogleAppEngine SDKのインストール

GoogleAppEngineの開発には App Engine Python ソフトウェア開発キット(SDK)を使用します。
http://code.google.com/intl/ja/appengine/downloads.html
ここからMac OS X 用のパッケージをダウンロードしインストールします。

ダウンロードしたファイルをダブルクリックし展開すると、GoogleAppEngineLancher.app が現れます。
これをアプリケーションフォルダにドラッグ&ドロップしてインストール完了です。

2.1 実行してみよう

インストールしたGAELancherを実行してみます。
はじめて実行する際は以下のようなウィンドウでリンク作成を聞かれるのでOKをクリックしてください。
(出ない場合は[Google App Engine Lancher]メニューから[Make Symlinks]を選択します)

dev_appserver.py, appcfg.py の2つのコマンドが実行できるようになります。

$ dev_appserver.py
$ appcfg.py
# このまま実行するとヘルプが表示されます

これでGAEPythonの開発環境が整いました!

3. eclipse 環境のセットアップ

引き続きeclipse での環境をセットアップしましょう。

3.1 eclipse のインストール

ここからeclipseをダウンロードします。
http://eclipse.org/downloads/
いろいろなパッケージがありますが、Eclipse IDE for Java Developersでよいでしょう。
プロセッサが Intel Core 2 Duo の場合は64bitを選択しましょう。
(これはシステムプロファイラから確認できます)

ダウンロードしたファイルを解凍し、作成されたフォルダにeclipse本体が入っているので
そのまま使いたい任意のディレクトリに配置してください。
早速 Eclipse.app を実行しましょう。

3.2 pluginのインストール

eclipsepythonを利用するには PyDev plugin のインストールが必要です。
[Help] > [Install New Software ...] をクリックします。

表示されたウィンドウの Work with: に以下のURLを入力します。
http://pydev.org/updates
表示される [PyDev] [PyDev Mylyn Integration (optional)] をチェックし Next ボタンをクリックし
そのまま進んでいけばインストールが完了します。

3.3 PyDevの設定

引き続きPyDevの設定を行います。
[Eclipse] > [環境設定...] をクリックします。
左のパネルから [Pydev] > [Interpreter - Python] を選び、[New...]ボタンから登録します。
Interpreter Name: には Python
Interpreter Executable: には /usr/bin/python を指定しましょう。
あわせてpython2.5も設定するとpythonのバージョンを切り替えられる用になります。



これで環境設定はおしまいです。
Googleチュートリアルで Let's GAE Python!!
http://code.google.com/intl/ja/appengine/docs/python/gettingstarted/


組織で使える、仕事の効率を5倍アップさせる9のメール術


現代のビジネスでEmailというのは欠くことのできない連絡ツールとなっていますが、
その活用方法はまだまだ個人任せになっているのが現状で、
組織の中にあっても有効に使われていない場合が数多く見られます。

そこで、組織で使うことで全体の生産性を向上させる9のメール術を考えました。


メールを開かずに判断できるようにするために

1. 件名はラベリングし内容を予想しやすくする

【重要】【緊急】などメールの件名にラベル付けをして件名を見た時点で内容を判断できるようにします。
集中して作業をしている時など、メールを開く前に内容を予想できれば、メールを読む手間を省くことができます。
どういう時にどのラベルを使うのかは組織にあったものを事前に定義しましょう。

例)
【緊急】 :即時対応が必要なものに付ける
【重要】 :対応は必要だが急ぎではないものに付ける
【連絡】 :連絡事項につける
【進捗】 :進捗報告時に付ける
2. 件名に「Re:~」を連続させない

件名に「Re:~」が連続すると件名が分からなくなってしまいますね。
メーラーの設定やメーリングリストなどを利用する際に気をつけましょう。

3. 差出人名は名前の後に会社名

メーラーに表示された時に差出人が隠れないようにするために差出人を「名前 組織名」の順にしましょう。
また、組織内でフォーマットが揃っていれば、外部からのメールかどうかも判断しやすくなります。

良い例)田中太郎 (株)大日本商事
悪い例)株式会社大日本商事 田中太郎
4. 件名だけで用件を終わらせる

件名だけで内容が伝われば、受信者の時間節約につながります。
書く方も長々とメールを考える必要もなくなりますね。

例)
【連絡】7月19日14時からMTGしましょう。1Fのスタバにて。

メールを情報源として活用するために

5. メールスレッドを意識する

メールのやり取りで返信を続けると1つのスレッドが作成されます。
メールを後から見返す際にスレッドとなっていると振り返りが容易になります。
関係のないメールに返信をしたり、件名を途中で変えたりしてはいけません。

6. 1つの話題に特化した内容にする

話題が一つであれば一つのメールスレッドで内容がまとまりますし、
話が脱線することも少なくなります。

7. 最後にはまとめメールを

メールでの議論を行った場合は最後にまとめメールを送りましょう。
後から内容を見返す際にすべてを読み返す手間が省けます。
長くなる場合は途中にもまとめメールを送りましょう。


セキュリティ性を高めるために

8. 重要なファイルはパスワードを付けて圧縮する

サーバ接続情報など、重要なファイルはパスワードを付けて圧縮しましょう。
解凍用のパスワードは電話で連絡するなど方法を選びましょう。
インターネット経由で伝える場合にはセキュアな通信路を選択しましょう。
googledocsのシェアドキュメントなどが有効に利用できます。

9. メールの容量は1M以下にする

添付ファイルを送信する場合は1M以下に抑えるようにしましょう。
大きいフィイルをダウンロードするには時間がかかってしまいます。
もし1Mを越える場合は、添付ファイルを圧縮するか、複数のメールに分けてファイルを添付しましょう。



いかがでしょうか。
ぜひ試してみてください。

ruby プログラムから ActiveRecord を使う

ruby から activerecord をつかう。

  1 require "rubygems"
  2 require "active_record"
  3 require "logger"
  4 
  5 ActiveRecord::Base.logger = Logger.new("debug.log")
  6 ActiveRecord::Base.establish_connection(
  7   :adapter  => "mysql",
  8   :host     => "localhost",
  9   :username => "foo",
 10   :password => "bar",
 11   :database => "test",
 12   :socket   => "/var/lib/mysql/mysql.sock",
 13   :encording  => "utf8"
 15 )
 16
 17 class Article < ActiveRecord::Base
 18   belongs_to :user
 19 end
 20
 21 class User < ActiveRecord::Base
 22   has_many :articles
 23 end

これでrailsと同じようにActiveRecordを通常のrubyプログラムで利用できます。
5行目はロガーの設定。

# UserId:10 のユーザーの記事を取得する
User.find(10).articles.each { |article|
  puts article.titlte
  puts article.body
}

こんな感じで使えます.