主夫ときどきプログラマ

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

「自分は仕事が好きじゃない」ということに気づいてしまった。

学校を卒業してからIT関係の業界で9年間働いてきました。
大企業で3年間、ベンチャーの小企業で4年間、フリーランスになって2年間という
よく分からないキャリアです。
これまでの自分は
「仕事好き?楽しい?」
と聞かれれば
「けっこう好きだよ。やってて楽しいし。」
と答える、どちらかと言えば『仕事好きな俺かっこいい』とか思っちゃってる痛いヤツだったかもしれません。
でもやっぱりちゃんと考えると「仕事は好きじゃない」ということに気づいてしまいました。

何を好きだと思っていたのか。

では今までは何を好きだと思っていたのでしょうか。
これまで「仕事は好きだし、楽しい」と思っていたのには理由があるはずです。
実際に好きなことといえば
 ・プログラムを書くこと
 ・新しい仕組みやものを考える事(計画すること)
 ・問題解決
が主に挙げられると思います。

つまり仕事の中にちらほらと出てくる「プログラミング」や
新しい「サーバー構成、プログラム構成を考えること」や
パフォーマンスを調査しての「サーバーチューニング」などを
好きだ、楽しい、と思っていたことになります。

それってほんとに仕事だろうか

ではもう一つ掘り下げてみます。
前述の「好きなこと」それってほんとに仕事なんでしょうか。

(ちょっと面倒な表現をすると)
「雇用主に拘束されている時間内で行っている行為」のあいだ
「自分のやっていることはすべて仕事だ」と思っているなんて事はありません。
ディスカッションから新しいアイディアが思いついたり、
自分に今必要な情報を探していたり、新しいものを作っていたり、
わくわくするような事をしている時は「仕事をしてる」なんて意識はありません。

ただ「興味の対象にまっすぐ向かっているだけ」です。

それは傍から見たら「仕事をしている」ように見えるかもしれませんが、
自分の心のなかでは「楽しいんでいる」だけなんです。
たったそれだけ。

つまり、ゲームしたり漫画読んだりと
好きなことやってる時と同じような「心の状態」なので、
けっして「仕事を楽しんでいる」訳ではなかったのです。

「仕事のカラを被った楽しいこと」をやっているだけでした。
だから仕事なんてしてなかったんです。

もう仕事なんてしない

これに気づくのに9年もかかってしまいました。
だから僕は仕事なんて嫌いです。
仕事は好きじゃないし、楽しくないし、ずっと遊んでいたいです。

しかし収入を得る必要はあるので「収入を得る行為」は行いますが、
「仕事」をしないで人生を送る方法を考えていきます。
そして「楽しいこと・好きなこと」をして収入を得ていきます。

まずは「働くこと」について真剣に考えてみようと思います。

補足

「仕事」というと人によっていろんな意味や解釈が含まれるので
今回のエントリーについては変に想う部分もあるかと思います。
私の中では「仕事」とはおもしろくもない、つまらない、ただやらされているだけのこと
という感じの位置づけです。そこに自分の意志がない行為、とでも言えばいいでしょうか。
そういうことを本文で読み取っていただけると幸いです。

GoogleAppEngineで構築する簡単RestfulServer


WebServiceに保存されているデータを外部に公開したい場合、WebAPIという形で公開するケースがあります。
しかし、実際にWebAPIを作成しようと思うと、リクエストパラメータを解析して処理を決めたり、XMLJsonフォーマットに変換するなど手間がかかります。


今回はそんなWebAPIをGoogleAppEngineを使って公開する方法を紹介します。
GoogleAppEngineのDataStoreに保存されているデータをModelの構造のまま取得したり、
更新したりすることが簡単にできます。

appengine-rest-server を使う

GoogleAppEngineには「appengine-rest-server」というフレームワークがあります。
GoogleCodeで開発されていて、これを使うことで簡単にRestfulなWebAPIを作成することができます。

ではダウンロードして設置してみましょう。
本記事の執筆時には1.0.5が最新のようですが、以下のコードは1.0.4で作成されています。

appengine-rest-server を設置する

ダウンロードしたファイルを解凍すると、READMEやLICENSEなどのテキストとsrcフォルダが展開されます。
srcフォルダの階層下にrestというフォルダがあるのでそれをGoogleAppEngineのアプリケーションフォルダにコピーします。

$ unzip appengine-rest-server-1.0.4.zip
$ cd appengine-rest-server-1.0.4/src/main/python/
$ cp -rf rest /path/to/appengine/app

これで設置は完了です。
SDKコンソールのInteractive Console で

import rest

が実行できたら問題なくインストール出来ています。

動かしてみよう

今回はアプリケーションのルートにapiというフォルダを作成し、その中のsample.pyにappengine-rest-serverを実装します。
まずは、app.yamlにURLを登録しましょう。以下のようにURLを登録してください。

-url: /api/.*
  script: /api/sample.py

つぎはsample.pyです。rest.Dispatcherというオブジェクトに公開したいModelを登録するだけです。

from google.appengine.ext import db
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
import rest

# 公開したいModel
class Task(db.Model):
    title = db.StringProperty()
    author = db.StringProperty()
    achieved = db.BooleanProperty(default=False)
    created = db.DateTimeProperty(auto_now_add=True)

# サンプルデータの登録
Task.get_or_insert('task1', title='Foo', author='Tom')
Task.get_or_insert('task2', title='Bar', author='Jhon', acheved=True)

# ベースアドレスを登録し、公開するモデルを登録します
rest.Dispatcher.base_url = '/api'
rest.Dispatcher.add_models({
    'task'   : (Task, ['META_DATA', 'POST', 'GET']),
    })  

application = webapp.WSGIApplication([
    ('/api/.*', rest.Dispatcher)
    ], debug=True)

def main():
    run_wsgi_app(application)

if __name__ == '__main__':
    main()

rest.Dispatcher.add_modelsに公開したいModelを登録します。複数登録できますが、今回は1つだけ。
また、対応するHttpMethodも指定することができます。

ブラウザからアクセスしてみよう

GoogleAppEngineLauncherを起動してアクセスしたのが以下の画面です。
一覧表示 http://localhost:8080/api/task


Key指定表示 http://localhost:8080/api/task/agxrYXdhaWljcnVpc2VyDwsSBFRhc2siBXRhc2sxDA


その他metadataなどを表示することができます。
また、FirefoxのRESTClientアドオンを使うことで、データ登録の動作確認ができます。
POSTメソッドでデータをXMLで送信することで登録できます。


GoogleAppEngine Python でIPアドレスを操作する方法

GoogleAppEngineでアクセス元のIPアドレスによって処理を分けたい場合があります。(主にガラケー対応)
その場合IPアドレスを表現するオブジェクトを使いたいところですが、その用途にあったPythonモジュールなかなか見つかりません。
そこで今回は

  • IP Address をオブジェクトとして扱う
  • IP Address をCIDR表記で範囲として扱う

という2点をPythonでクリアするための方法を紹介します。

IPy モジュールを使う

Freeで公開されているIPyというモジュールを使います。

IPy - A python Module for handling IP-Addresses and Networks
http://c0re.23.nu/c0de/IPy/

こちらで紹介されているモジュールはPerlのNet::IPに似たモジュールで、IPv6にも対応しています。
最新版をダウンロードしましょう
IPy-0.42.tar.gz

まずはPythonインタプリタで動作確認

解凍すると IPy-0.42/build/lib/IPy.py が得られるので lib ディレクトリの階層でPythonインタプリタを起動します。

$ tar xzvf IPy-0.42.tar.gz
$ IPy-0.42/build/lib
$ python

IPy.pyはそのままではunicode errorが起こるので、762, 763の特殊文字を消します。
(コピーライトの文字が入っていました。)

では試しにOverviewにあるようにIPyを使ってみましょう。

>>> import IPy
>>> ip = IPy.IP('120.3.4.5/1')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "IPy.py", line 294, in __init__
    raise ValueError, "%s goes not well with prefixlen %d" % (hex(self.ip), self._prefixlen)
ValueError: 0x78030405L goes not well with prefixlen 1

するとこのようにエラーが起こってしまいます。
すこしソースコードを編集してみましょう。1220行目をコメントアウトし、1221行目のようにします。

1218 def _checkNetaddrWorksWithPrefixlen(net, prefixlen, version):
1219     """Check if a base addess of e network is compatible with a prefixlen"""
1220     #if net & _prefixlenToNetmask(prefixlen, version) == net:
1221     if net:
1222         return 1
1223     else:
1224         return 0
1225 

これで準備完了!
Pythonインタプリタで動作確認をしましょう。

GoogleAppEngine での利用

IPy モジュールを GoogleAppEngine で使うためにソースファイルのIPy.py をGoogleAppEngieのルートディレクトリに配置します。
(GoogleAppEngineLaunchdr の Path に表示されているところにコピーします。)

$ mv IPy.py /path/to/gae/root

では、SDK Console の Interactive Console で動作確認をしよう。
Textareaに

import IPy
ip = IPy.IP('192.168.1.100')

と打って [Run Program] ボタンを押し、右側にエラーが表示されなければ成功。
この状態になれば、下層の*.pyでもimportすることができます。


では実際のコードで使ってみましょう。
サンプルとして、携帯キャリアのIP帯域からのアクセスかを判定するメソッドを作ります。

import IPy
from google.appengine.ext import webapp

class Main(webapp.RequestHandler):
'''
  中略
'''

    def include(self):
        # 簡素化するためにRequestParameterでキャリアとIPが送られてくる前提です^_^;
        carrier = self.request.get('carrier')
        remote_ip = IPy.IP(self.request.get('ip'))
        elif carrier == 'softbank':
            soft_ip = [
                IPy.IP('123.108.237.0/27'),   IPy.IP('202.253.96.224/27'),  IPy.IP('210.146.7.192/26'),  IPy.IP('123.108.237.224/27'),
                IPy.IP('202.253.96.0/27')]
            # CIDRで範囲指定されたIP群の中に含まれているかを判断します
            for ip in soft_ip:
                if remote_ip in ip:
                    return True
            return false
        else:
            return False

こんな感じでIPyを使う事でIPアドレスにより制御をGoogleAppEngineで実現できます。



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/