2010-12-31
映画「ノルウェイの森」の感想
2010-12-23
小室淑恵 / 6時に帰るチーム術
ただし、就業時間と残業時間の区分はしっかりしておきましょう。残業ではどんな業務が多いのか、なぜ残業にずれ込んでしまうのかを意識させると、次のステップにつなげやすくなります。(p.90)
一つの業務を一人で担当すると、自分にしかわからないことばかりですから、「休みたくても休めない」という状況に陥ります。(p.117)
業務上のタスクには締め切りがあるはずですが、締め切りまでの間にさらにいくつか「チェックを入れるタイミング=締め切り」を設定するのです。
マネジャーからメンバーに仕事を依頼するときにも、「何を、いつまで、何時間ぐらいかけて」と指示するとともに、「こことここの段階で見せて」と言っておきます。 (p.177 )
2010-12-07
Python 3.x 対応のフレームワーク QP
$ python3.2 setup.py install
つづいて、
$ easy_install-3.2 durus $ easy_install-3.2 qpy $ easy_install-3.2 qp
- qp_sites/hello/__init__.py ... からっぽで OK
- qp_sites/hello/var ... 空っぽのディレクトリ。pid ファイルとかが置かれる。
- qp_sites/hello/slash.py ... ここにコードかく
2010-11-24
web3ref PEP444 の実装例
読んでみたコードは、http://github.com/mcdonc/web3 です。Pyramid フレームワークの開発者だそうで。
サンプルコードとして simple_server.py というのがあります。ここで簡単な web3 アプリが定義されています。
def demo_app(environ): result = b'Hello world!' headers = [ (b'Content-Length', to_bytes(len(result))), (b'Content-Type', b'text/plain'), ] return (b'200 OK', headers, [result])
戻り値の各要素は、bytes 型、bytes 型、bytes型の配列になっています。これは PEP444 と PEP333 の違いのひとつで、web3 アプリのレスポンスは bytes 型で返すこと、となっています。ステータスコードも bytes 型です。PEP444 でもいくつか理由があげられていますが、Python 2.x 系列の str 型はそれが文字列なのかバイト列なのかが不定である、サーバにエンコーディングをさせたくない、などの理由でこうなっているとのことです。
この簡単なサンプルだけみると、Content-Type の指定なんかで、わざわざ bytes にするのってどうよ、って思いましたが、多くの場合ここには Django とか Pylons なんかのフレームワークがのっかってくるので、アプリ(web3 アプリではなくて、web サービス的な意味でのアプリケーション)で気にしなくてよいでしょう。
ちなみに、to_bytes() 関数は、
def to_bytes(data): str(data).encode('ascii')
です。
サーバとハンドラはまた今度。socketserver モジュールで定義されているテンプレート的な基底クラスを、何段階か継承しているので、ゆっくり見てみようかと。いつになるんだろ。
2010-11-20
(第3回)Python mini Hack-a-thon
2010-11-14
村上龍「歌うクジラ」の感想
大勢の人が笑顔をつくっている乳製品の宣伝映像を父親のデータベースではじめて見たとき、目まいと吐き気を覚えた。害悪だと子供にもわかった。 (p.207)
歩いて老人施設まで行くのかとアンジョウに聞いても意味がない。アンジョウに付いていく以外に老人施設を目指す方法はないからだ。 (p.332)
あの小型のドーム内にはガラスのグラスで飲みものを飲んでいる特別な人たちがいる。だが外を眺めるためのものではない。あれは自分たちが特別だと示すための施設なのだ。(p.149)
人口の減少および労働力の移民への依存度は幾何級数的に高まり生産性は劇的に下がり幾度となく円は暴落してやがて燃料と職労が欠乏するようになるが一般大衆の政治意識はゼロに等しかった。(p.238)
2010-11-07
Python 3.2 を調べ始めてみた
@atsuoishimoto に教えてもらったファイル名の取り扱いに変更があります。UTF-8 決め打ちじゃなくて、システムロケール使うぜ、と。os.fsencode() と os.fsdecode() でシステムロケールに合わせた、エンコード/デコードができます。
コンパイル済みコードの置き場が変わります。これまでは、foo.py が foo.pyc になってました。が、これだと複数の Python があったりすると、インタプリタが変わるごとに結局再コンパイルでした。てなわけで、__cahced__/foo.cpython-32.pyc みたいなファイル名で保存されます。
Logging の設定を、API 経由だけじゃなくて、辞書で指定できます。
3.1 では hasattr() があらゆる例外を握りつぶしていたのですが、AttributeError 以外はちゃんと伝搬してくれます。
などなど。あと全体的にパフォーマンスが上がっているようです。
個々の変更が、どういう影響があるかは、Python の使い方によって違うと思います。logging 使ってない人にしてみたらどうでもいいわけです。
個人的な印象としては、ものすごく大きな変更ではないようです。が、見逃していることは多々あるでしょうね。
2010-10-10
東京・江戸前トライアスロン 2010
2010-07-05
須磨海水浴場アクアスロンと、村上春樹「走ることについて語るときに僕の語ること」
昨年、このレースに参加したとき、スイムでパニクってしまって、棄権しました。今年は大丈夫なように万全の練習をした、わけではなくて、実は今年に入ってから、のべ1km しか泳いでいません。内緒ですけど。ちなみにこのレースは、スイム 1km 、ラン 10km です。
スタート前にちょろっと泳いでみたら、いきなり怖くなって「あーもう、だめ。むり。もう帰る」っていう気分になりました。
[...] 恐怖が身体を支配して、筋肉がこわばってしまう。胸がわけもなくどきどきして、手足が言うことを聞いてくれない。顔が水につけられない。(村上春樹「走ることについて語るときに僕の語ること」p.233)
しばらく浮いていて、ぶくぶくぱーしていたら、慣れてきて、泳げるようになりました。ふう。というわけで、最後尾からスタート。1km のスイムを22分くらいで終えて、トランジションに数分を使い、ランに入りました。
ここのランコースはちょっと複雑で、「己」字型のコースレイアウトになっていて、しかも下半分を二往復してから、元の書き出し位置に戻るみたいなレイアウトです。で、「『」みたいなところで給水なのですが、復路でしか給水してはいけません。昨年は往復路で水をとれたと思うんですが、往路で水を取ろうといたら、とくに説明もなく「帰りにとれ」と怒鳴られてしまいました。
走るのは、スピーチなんかを暗記する作業に向いているような気がする。ほとんど無意識に脚を運びながら、頭の中で順番に言葉を並べていく。文章のリズムを測り、言葉の響きを想定する。[...] ただ頭の中で話をしながら、つい表情をつけたり、ジェスチャーを交えたりしてしまうことがあって、走りながらこれをやっていると、向かいから走ってくる人に不思議な顔をされる。(村上春樹「走ることについて語るときに僕の語ること」p.154)
暗記ではないけれど、私は組み立てをしていることが多いです。プレゼン、面接、主催者への抗議(実際に抗議することは、ない)、素敵な女性への告白(同じく)なんかを考えています。なので、身振りとかしていることや、ニヤニヤしていることがあって、キモいだろうなぁと思います。
今の職場に転職するときに、面接をする日、昼間にトレッドミルで走っているときには、自己PRをどうやって話そうか考えていました。
そんなこんなで、ラン 10km を55分ほどで終わりました。おもったより早かったです。あーたのしかった。
いずれにせよ、ここまで休むことなく走り続けてきてよかったなと思う。なぜなら、僕は自分が今書いている小説が、自分でも好きだからだ。(村上春樹「走ることについて語るときに僕の語ること」p.122)「がんばりますね」と言われるんですが、まあ、頑張っていないとは言わないまでも、やっぱり私にとって、スイム、バイク、ランは純粋にエンターテイメントです。やっている最中が楽しいです。フィニッシュしても感動しないし、達成感も大したことないです。思うには私は、生き方がかなり刹那的で、「そのとき」が楽しくないと嫌なんですよね。ごほうびのために頑張るとかも、無理です。やっていること自体に楽しみがないと、とてもじゃないとできません。そしてこういうメンタリティは、スキルを身につける上で、非常にやっかいだという自覚はあります。でも、そうおもうんだからしょうがない。
ってなことを考えながらストレッチです。ストレッチもあんまり好きじゃないので、そろそろやめよっと。
2010-06-03
Evernote につぶやく monolog-evernote for Mac OS X
Evernote になんでもかんでもメモするんですが、いちいち Evenote を開くと、ウインドウが大きいのが嫌なのとで、ちっちゃいのを作りました。ツイッターみたいに1行入力するだけの手軽さ。
http://code.google.com/p/monolog-evernote/
タイトルは「monolog」で、時刻とテキストが入ります。タイトルには monolog とだけ入れてあります。時刻は created ad フィールドに入るの冗長だと思ったのですが、日記に書き抜くときにまるごとコピペできて便利なので、そのままにしてあります。
あと、Leopard の AppleScript エディタと、Snow Leopard の AppleScript エディタで、それぞれアプリケーションを作ったときの、出来上がるものが違います。ってなわけで、別々のバイナリを作りました。
ちなみに @myen という twitter アカウントに D すると、自分の Evernote に入るというサービスがあります。「d myen 」を書き損じると公開されちゃう、ネットに繋がっていないことだってある、という理由から、ローカルのアプリに書き込むことにしました。あと、AppleScript つかえると、何かと自動化できるかなってことで、習作です。
2010-06-02
エキスパート Python プログラミング
アスキーメディアアートより、「エキスパート Python プログラミング」の見本本(みほんぼん)を頂きました。Python でひととおりコードが書けるようになって、次にステップアップしたいけど、これからどうしよう、みたいな人にオススメだと思います。即物的な知識、たとえばライブラリやフレームワーク固有の知識ではなくて、もうちょっとこう一般的な知識として身につける、とか。
たとえば、4章「良い名前を選ぶ」の132ページ。PEP 8 に則って、Python では、プライベートなメソッド、関数、変数には _lowercase をつけましょうという慣例があります。で、__init__ とか __eq__ みたいに、アンダースコアが2つつくメソッドもあるわけです。Python では、__my_method みたいな命名をすることは文法的には禁じられていません。しかしながら、これはなかなかに落とし穴があります。
>>> class Foo:
... def _hoge(self):
... print "_"
... def __fuga(self):
... print "*******"
... def hello(self):
... self._hoge()
... self.__fuga()
...
>>> f = Foo()
>>> f._hoge()
_
>>> f.__fuga()
Traceback (most recent call last):
File "<stdin>", line 1, in
AttributeError: Foo instance has no attribute '__fuga'
>>> f.hello()
_
*******
>>> Foo.__dict__
{'__module__': '__main__', '__doc__': None, '_Foo__fuga': <function __fuga="" at="" 0xc5730="">, '_hoge': <function _hoge="" at="" 0xc57b0="">, 'hello': <function hello="" at="" 0xc5630="">}
アンダースコアをひとつ接頭したメソッドには外部からアクセスできますが、アンダースコアをふたつ接頭したメソッドにはアクセスできません。この動作だけ見ると、プライベートメソッドには、アンダースコアをふたつ接頭するのかなぁと思ってしまいます。そう思っていた時期が私にもありました。
けど、違うんですね。そういう情報って、PEP とか dev のメーリングリストを読めば分かるのですが、情報が分散していますし、なかなか背景となる理由も分かりにくいです。
そういうところを抑えたのが、本書です。他にもテスト、文書系のアプリやモジュール、パッケージの書き方など、ちょっと気合いの入った開発に役立つ知識がいっぱいです。Code Complete や Pragmatic Programmer とかに近い内容です。
ちなみに上記については「Python には動作を強制するようなプライベートメソッドはない。アンスコ2つの挙動は別の理由」です。
2010-03-03
東京マラソンに出てきました
東京マラソンを完走しました。15年ぶりくらいのマラソンで、しかも、さんざんなタイムでした。
いろんなひとに「すごい」とか「根性ある」とか言われますが、少なくとも私にとって、マラソンは純粋にエンターテイメントですし、マラソンは我慢大会というようりもフィジカルな体験です。
前提として、私の走力は、10km のレースで 55分くらいのものです。これはたぶん週に1回くらい、数キロのジョギングをしていれば出せるタイムです。レースだと後ろから数えたほうが早いです。
この位の走力だと、ペース配分、膝の痛み、補給に気をつければ、東京マラソン6時間くらいでフィニッシュできるんじゃないでしょうか。
まず、ペース配分。息切れするようなペースで走ってはいけません。後半で脚の筋肉が疲れてしまって、走れなくなるからです。ウォームアップなしで、スタートはちんたら歩いて、早歩きを経て、ゆっくり駆け足くらいのペースでちょうどいいです。
膝の痛み。筋肉よりも、私の場合は、膝の(おそらくは)腱が痛くなるほうが問題です。腱はが痛いと、ほぐすことも、だましだまし走ることもできなくなります。痛くなったら躊躇わずに歩きました。それから、5km 走ったら、必ず 100m 歩くみたいな感じで。40km も走るとなると、ちょっとした痛みが効いてくるのです。半分から痛くなったとしても、20km も痛い思いをしないといけません。なので、痛くならないように、フォームに気をつける、歩く、を心がけるわけです。
最後に、補給。エンデュランス競技はどれもそうなのですが、遅い方が大変です。練習している人なら、ほとんど息切れしないペースだと4時間くらいでしょう。ですが私は6時間ですから、似たような負荷で 50 % も長い時間運動を続けます。9時スタートで、15時ゴールですから、おやつの時間まで運動続けるわけですよ。何もしないと、当然、エネルギー切れになってしまいます。東京マラソンでは後半まで補給食がでないのですが、それだとたぶん遅いんですね。なので、パワーバージェルなどを携帯して、最初から 5km ごとに補給しました。それでも足りないくらいでした。おそいと人形焼きとかの補給食がなくなっているんです。というわけで、かなりな勢いで沿道の方からチョコレートもらいました。
東京マラソンはギャラリーが多くて楽しいです。それはそれで勇気づけられますが、おそらくは、ポテンシャルぎりぎりまで実力がでるという効果しかないんですよね。ギャラリーがいるからポテンシャルを超えるのではなくて、ギャラリーがいないからポテンシャルまで実力が出ない、というのが真実に近そうです。
それよりもギャラリーにもらうチョコレートですよ。ほんとのところ、大会が提供する以外のサポート受けるのは失格なのかも知れません。
とまあ、そんなわけで、なんとか完走しました。6時間ちかくかかりました。そして、体力を消耗する体験ですが、同時にこれは私にとっては、やっぱり純粋にエンターテイメントです。あーたのしかった。来年も出たいなぁ。
2010-01-22
Python 3 ハンズオン資料 for Python Hack-a-thon #3
概要
このハンズオンでは、Python 2.x のコードを 3.x に移植するときの簡単な手順を体験します。願わくば午前中に終わらせて、午後は自由に時間を使ってもらうつもりでいます。
使用するソフトウェア
- Python 2.6
- Python 3.1
- pyhack3py3ex.zipをダウンロード
Python 3 のポイント
別の勉強会(BP Study)で使った資料
2.x 版で動作確認
foo.py は Yahoo! の検索 API の結果を受け取って、テキストファイルに保存するプログラムです。そして tests.py は、一部の昨日のユニットテストです。これらが動作することを確認してみましょう。
$ python2.6 2/tests.py
...
----------------------------------------------------------------------
Ran 4 tests in 0.330s
OK
$ python2.6 2/foo.py
$
2to3 の実行
Python 3.x には 2to3 という変換ツールが付属します。これを使って、コードを変換してみましょう。
$ mkdir 3
$ cp -r 2/*.py 3/.
$ 2to3-3.1 -w 3/
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
RefactoringTool: Refactored 3/foo.py
--- 3/foo.py (original)
+++ 3/foo.py (refactored)
@@ -1,10 +1,10 @@
# -*- encoding: utf-8 -*-
-import urllib
+import urllib.request, urllib.parse, urllib.error
from xml.dom.minidom import parseString
from utils import get_text
def main():
- query = u'ほげ'
+ query = 'ほげ'
count = 10
response = open_yahoo(query, count).read()
dom = parseString(response)
@@ -18,10 +18,10 @@
def open_yahoo(query, count):
api = 'http://search.yahooapis.jp/WebSearchService/V1/webSearch'
appid='CDU9keOxg67iAhAcNjcEjZbj25HFcV2DkA62bAxhQn_4FUoPJN2lFQdP5MfnIksh75e650BR.A--'
- params = urllib.urlencode({'appid':appid,
+ params = urllib.parse.urlencode({'appid':appid,
'query':str(query.encode('utf-8', 'ignore')),
'result':count})
- response = urllib.urlopen(api+'?'+params)
+ response = urllib.request.urlopen(api+'?'+params)
return response
class Result:
RefactoringTool: Refactored 3/tests.py
--- 3/tests.py (original)
+++ 3/tests.py (refactored)
@@ -14,8 +14,8 @@
get_text(dom.getElementsByTagName('bar')[0].childNodes))
def testJp(self):
- dom = parseString(u"".encode('utf-8')); こんにちは
- self.assertEqual(u"こんにちは",
+ dom = parseString("".encode('utf-8')); こんにちは
+ self.assertEqual("こんにちは",
get_text(dom.getElementsByTagName('bar')[0].childNodes))
class AskYahooTest(unittest.TestCase):
RefactoringTool: No changes to 3/utils.py
RefactoringTool: Files that were modified:
RefactoringTool: 3/foo.py
RefactoringTool: 3/tests.py
RefactoringTool: 3/utils.py
ここで 2to3 がやっていることは以下のとおりです。
- u'...' → '...'
- print 文 → print 関数
- urllib の階層変更
3.x 版のユニットテスト
では 3.x 版のユニットテストをしてみましょう。
$ python3.1 3/tests.py
FF..
======================================================================
FAIL: test (__main__.AskYahooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "3/tests.py", line 29, in test
self.assertEqual(count, len(dom.getElementsByTagName('Result')))
AssertionError: 10 != 7
======================================================================
FAIL: testURL (__main__.AskYahooTest)
----------------------------------------------------------------------
Traceback (most recent call last):
File "3/tests.py", line 36, in testURL
'http://search.yahooapis.jp/WebSearchService/V1/webSearch?query=yahoo&result=10&appid=CDU9keOxg67iAhAcNjcEjZbj25HFcV2DkA62bAxhQn_4FUoPJN2lFQdP5MfnIksh75e650BR.A--')
AssertionError: 'http://search.yahooapis.jp/WebSearchService/V1/webSearch?query=b%27yahoo%27&result=10&appid=CDU9keOxg67iAhAcNjcEjZbj25HFcV2DkA62bAxhQn_4FUoPJN2lFQdP5MfnIksh75e650BR.A--' != 'http://search.yahooapis.jp/WebSearchService/V1/webSearch?query=yahoo&result=10&appid=CDU9keOxg67iAhAcNjcEjZbj25HFcV2DkA62bAxhQn_4FUoPJN2lFQdP5MfnIksh75e650BR.A--'
----------------------------------------------------------------------
Ran 4 tests in 0.986s
FAILED (failures=2)
2つテストが失敗しています。ひとつめは結果のエントリ数が10であるはずが、7件しか返ってきていないこと。もうひとつは、URL として生成した文字列が一致していないことです。
実は、この場合は URL が間違っているので、件数が期待通りになりません。
3.x 版のユニットテストを通す
fout = file("result.txt", "w")
for result in results:
fout.write(("%s\n" % result.url).encode("utf-8"))
fout.write(("%s: %s\n"%(result.title, result.summary)).encode("utf8"))
fout.write("\n")
Python 2.6 では、urlencode() 関数に与える辞書の value は、ASCII 文字列 str 型でなければなりません。なので、このコードでは明示的にエンコードしています。
一方、Python 3.1 で、.encode() メソッドの戻り値は bytes 型というバイトシーケンスです。それを str() すると 「b'...'」のようなユニコード文字列に変換されます。前後に不必要な文字がついてしまうのです。また 3.1 の urlencode() 関数はユニコード文字列を受け取ると、UTF-8 で自動的にエンコードします。
というわけで、ここは 2.x と 3.x の非互換な関数を使っていますので、コードを修正しましょう。
fout = open("result.txt", "w", encoding="utf-8")
for result in results:
fout.write("%s\n" % result.url)
fout.write("%s: %s\n"%(result.title, result.summary))
fout.write("\n")
で、テスト実行。
$ python3.1 3/tests.py
....
----------------------------------------------------------------------
Ran 4 tests in 0.474s
OK
テストがとおりました。オレ、できたよ、かーちゃん。
3.x 版の動作確認
ではアプリのほうを実行してみましょう。
$ python3.1 3/foo.py
Traceback (most recent call last):
File "3/foo.py", line 36, inmain()
File "3/foo.py", line 12, in main
fout = file("result.txt", "w")
NameError: global name 'file' is not defined
がーん。またもやエラーです。Python 3.x では file() 関数が廃止され、open() 関数を使うことになっています。というわけで foo.py を以下のように修正します。ついでにエンコード方法を指定しておきましょう。
fout = open("result.txt", "w", encoding="utf-8") # ここ
これでどうでしょう。
$ python3.1 3/foo.py
Traceback (most recent call last):
File "3/foo.py", line 36, in
main()
File "3/foo.py", line 14, in main
fout.write(("%s\n" % result.url).encode("utf-8"))
TypeError: must be str, not bytes
またもやエラーです。fout はテキストモードで開いているので、write するときには必ず str つまりユニコード文字列を渡さないといけません。
fout.write("%s\n" % result.url)
fout.write("%s: %s\n"%(result.title, result.summary))
fout.write("\n")
これで完成です。
というわけで...
What's New in Python 3.x のガイドのとおりの手順で、2.x から 3.x への移植作業をしてみました。ガイドにも書かれているように、ユニットテストは重要です。2to3 はそこそこやってくれますが、いろいろと細かい修正作業が必要で、とくに文字列周りはアプリケーションが何をしているのか知らないといけません。
また、この例ではサードパーティのライブラリを使っていません。Django のようなおおきなライブラリやフレームワークを使う場合には、ライブラリ側が 3.x 対応していないと、Python 3 への以降は難しいと思います。
さらにここではアプリケーションの移植でしたが、ライブラリの移植では工夫が必要になります。 Python 2.x と Python 3.x の両方をサポートしたいのであれば、できれば 2to3 だけで変換できるようにしておくのが得策でしょう。
というわけで、Happy Hacking!!
メモ
参考資料
記事や解説
- Python 3 Porting /Co-Existence Resources
- Python Tutorial 3.1.1
- Porting your code to Python3 (PDF)
- Python 3 への移植: すべきこととすべきでないこと
- Dive into Python - APPENDIX A Porting Code to Python 3 with 2to3
- Porting SimpleTAL to Python 3
- Python 3 porting workflow?
- Python Python Python (aka Python 3)
- Porting Python Code to 3.0 (PythonInfo Wiki)
- Dive Into Python ch 15
- porting setuptools to py3k
- 2to3
- Porting Durus/QP/Qpy to py3k
- Porting Django to 3k
ツール
- Python Incompatibility tests
- 2to3 Automated Python 2 to 3 translation manual
- lib3to2 lib3to2 is a set of fixers to refactor code written for Python 3.x into code that can run on a 2.x interpreter.
Python 3 用ライブラリの開発プロジェクト
- cherrymuffin_py3
- virtualenv3
- youtube-dl
- pip3
- vlastic Vlastic is a pretty RESTful web framework for Python 3.0. It (is going to) implements WSGI interface.
- eenvoudig Python 3 Web Framework modeled after Sinatra
- mysql-python
- SQLAlchemy
- Beautiful Soup
- PyPdf
- Universal Feed Parser
- python-oauth
- PyPI
- Python 3 Porting /Co-Existence Resources
2010-01-08
2009年ふりかえり
人に見せられないノートには、いろいろ書いてあるのですが、それとは別に。
- 1月 記事や文章をたくさん書いた。
- 2月 コーチングを受けつつ、マーケティング業務に集中。
- 3月 社内の部署間調整。Python code reading 08 で話す。
- 4月 たまには技術的な問題解決に当たる。
- 5月 BP Study に行ってみる。
- 6月 覚えていない
- 7月 新製品のマーケティング戦略/戦術に没頭。夜は運動。よく体こわさなかった。
- 8月 10年ぶりのトライアスロン中島大会完踏。テレビ愛媛に家族ごと取材される。
- 9月 残業務を片付けつつ、引き継ぎ。
- 10月 有給休暇の消化、引っ越し。初めてドイツに行くが、ビールの写真しか残っていない。
- 11月 新しい職場で働き始める。プロジェクト管理。
- 12月 プロジェクト管理と PHP 案件引き継ぎなど。
7月の全力投球っぷりに、我ながらびびります。退社0時、出社3時とか、もうやらないですけど。この活動が成功だったか失敗だったかは、市場が決めることですが、いずれにせよ、結果は私自身の実力を反映したものだと思っています。
Python 界隈での活動が増えました。Python Code Reading 08 では初めて勉強会の講師で参加しました。そこで @atusi さんや IanMLewis さんから、BP Study の存在を教えてもらって、そっちにも行ってみたり。LLTV にも呼んでもらいました。そして、NI から Be Proud に転職。Python hack-a-thon #2 も楽しかったです。今年は Hack-a-thon で、ハンズオンさせてもらうことになりました。わーい。
転職してみて自分にとっての強みや弱みも浮き彫りになりました。今年はそれらの課題を克服していきたいな、と。
2010-01-02
「一九八四年」と「五分後の世界」の略語に関する対称性
ジョージ・オーウェルの「一九八四年」と言えば、村上春樹の「1Q84」ですが、それはおいといて(おいとくのかよ)、村上龍の「五分後の世界」です。
「一九八四年」も「五分後の世界」も全体主義となった自国のパラレルワールドが描かれているのですが、こまごまとした設定が対照的です。
一九八四年のオセアニアでは、元の意味が分からなくなるような略語が使われます。たとえば、English Communism の代わりに Engsoc、Ministry of Love の代わりに Miniluv など。
一方、五分後の世界の日本では、正確な意味を忘れないようにという動機から、略語は奨励されません。たとえば、CNN と言った生徒が、Cable News Network と言い直させられるシーンがあります。
前者の政府は国民が無知であることを強く望んでいて、後者の政府は国民が無知であることを危機であると考えています。その根本的な違いの表れとして、略語の扱いが全く逆であるな、と思いました。