インラインにて失礼します

インラインにて(モイモラ)

「インラインにて失礼します。」メールのやりとりで使用します。相手が送ってきたメールの文中で、先方の文章を引用として残しつつ、それに対してコメントしたい場合(よくある)に何故そういった事をするのか断りをいれる意味があるっぽいです。

先日、仕事でもらったメールで初めてこの言葉を目にした時に、とても違和感を感じたのを覚えている。昔は全文引用の文章を末尾に付けるのがマナーが悪いとされていたけど、いつの間にか逆になっているらしい。

これがナウいらしいので、僕もいつか意味もなく使ってみよう。

『The Man Who Planted Trees』フレデリック・バック

中学生か高校生くらいの時に見た短編アニメーションを突然思い出した。

無性に見たくなってYouTubeで探したけど、みつからなかった。

今見ても、あの頃のように純粋な気持ちで感動できるだろうか…


【追記】

DVDが発売されているらしい。これ欲しいなぁ。

「木を植えた男」他/フレデリック・バック作品集

安倍晋三ホームページはPythonで動いている

http://img.simpleapi.net/small/http://www.s-abe.or.jp/

少し前にトップページのUNIXコマンドが話題になった 安倍晋三氏のホームページ ですが、Pythonで書かれたPloneで動いています。実は5年前くらいからウオッチしているのですが、ここのシステム担当者の方とは気が合いそうです。

というのも、2001年、僕がXoopsを使いだしてしばらくした後に、安倍晋三ホームページはXoopsを使ったサイトに変わりました。そして、僕がPloneに移行してまたしばらくした後の2004年に、Ploneベースに変わりました。当時はまだXoopsもそんなに流行っていなかったし、Ploneは今でこそ大学の研究室等で人気があるみたいですが知名度は言わずもがな。これは偶然とかのレベルではないような気がします。運命の糸?

安倍晋三サイトのシステム担当者の方、もしこのブログを読んでいられたら、一度お会いして情報交換させて頂きたいです。ご連絡お待ちしています。

僕は、次はDjangoを使ったサイトにしようと思っているので、安倍晋三氏のホームページがDjangoベースになる日も近いのではないでしょうか(結構本気)。新聞社のサイトで使われているので、スピードと安定性には実績がありますし。

# ところで、まだ内閣官房長官のままになってますね…


【10:52 追記】

って、よく見たら、これ寺田さんの会社じゃん。どうも失礼しましたw

職場でベトナムコーヒーが流行っている件

ベトナムコーヒー
ベトナムコーヒー posted from フォト蔵

大流行中。

あれっ?タイだったかも…

『シリコンバレー精神』梅田望夫

JTPAシリコンバレーツアーに参加したり、先日の刊行記念対談イベントのお手伝いなんかもしている同僚のnaoyaくんに借りて読んだ。
梅田さんの肌で感じたシリコンバレーの雰囲気がよく伝わってきて、非常に面白かった。以下、印象に残った部分をメモ。

  • 才能を発掘するメカニズム、プロスポーツ化が進行中
  • 下請け受託型の企業は、ベンチャーではない
  • IT化とIT革命は違う 本当のIT革命はこれから
  • 戦争するよりも戦争をしている連中に武器を売る事業のほうが絶対確実
     → 儲かっている会社を相手にした商売のこと
  • プログラムを書いているだけで幸せな人種、ナード(ギーク)を搾取しないのがシリコンバレー
  • 価値を生み出すのは会社ではなく個人、個人としてのストーリーが重要
  • 目先の小金にこだわって働きすぎるな 身体を壊したら元も子もない
  • 40過ぎたら仕事のポートフォリオを考える(リスクヘッジ)
  • Muddle throughの状態を楽しむことができるか
  • The only way to do great work is to love what you do.
  • Web3.0を目指す若者を支援するのがシリコンバレー精神
  • 仮の成功と本当の成功 (IPOやバイアウト)
  • 「自分のことを何かの理由で大切に思ってくれる人」がどれだけいるかが重要

2006年9月25日という日

  • Python Developer's Campスプリントお題策定委員会
  • 不具合対策に追われる
  • アルバイトの東大生に仕事が楽しくなってきたと言われて喜ぶ
  • 楽しみながら作ってないサービスなんて使ってもらえるはずがない
  • 近所で事件があったためか、深夜タクシーが多い
  • センスってどうやって磨くものなのか
  • 僕の見ている世界と天才が見ている世界は違うのかもしれない
  • 海外から日本へのアクセスは重いらしい
  • あっという間だったけど楽しかった

当たり前だけど、今日という日は2度と戻ってこないんだなぁ

cron jobからDjangoフレームワークを利用する

Webシステムを作っていると、ブラウザからのアクセスとは別に非同期で処理を実行したい場面って結構あります。例えば、cronにジョブを設定して定期的に行う処理などです。

データベースに直接アクセスするなら何も考えなくてもできます。でも、せっかくだからDjangoのモデルを利用して楽をしたいですよね? 試しにmodelをimportしてみたけど、それだけではうまくいかない。で、どうやるのかなぁと調べてたら、下記のサイトに情報がありました。環境変数'DJANGO_SETTING_MODULE'を設定してあげれば良いらしいです。

Slowchop Studios » Blog Archive » Creating a Django cron job

こういうview.pyがあって、このdaily_job()をcronから呼び出したいとき。

import urllib2
from models import WebSite
def daily_job():
    for site in WebSite.objects.all():
        page_html = urllib2.urlopen(site.url).read()
        do_something_with_page_html(page_html)

こんな感じでプロジェクトのトップにスクリプトを置いてあげると、cronからDjangoフレームワークを呼び出して使うことができます。

#!/usr/bin/env python
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'
from mytestapp.views import daily_job
daily_job()

♪コントラスト − クラムボン

最近気になる人

最近、近所に出没するおじさんがとても気になる。

休日に交差点の真ん中で交通整理をしている。ピー、ピピピとか笛を吹いて、行けとか、止まれとかの合図をしている。車庫から出ようとしている車があれば、ガソリンスタンドの店員さんのように車の流れを止めてくれる。

最初は、アルバイトでやっているのかなと思っていたけど、どうも違うみたい。ガーディアンエンジェルみたいに、ベレー帽を被っていて、アーミーっぽいパンツとブーツを履いている。たぶん、ボランティアでやっているっぽい。

また、平日はごみ置き場のゴミ袋を一つずつ開けて中身をチェックしているようだ。こないだ、その現場に遭遇してしまって気まずい雰囲気になった。とりあえず、挨拶してそそくさと逃げたけど、ゴミ袋チェックに引っかかって呼び止められないか、内心ビクビクだった。

おじさんが現れたのは、ここ1ヶ月くらいなので、ここが終わったら次は○○町みたいな感じで定期的にいろいろな場所を回っているんだろうか。すげー気になる…

飲み会と反省会

新宿で、某メンバによる某飲み会。

ギャグ道の話で盛り上がる。やっぱり、有名ブロガーの人達は面白いなー

お酒を飲んだ後は、ポカリスエットをいっぱい飲むと二日酔いにならないらしい。カーディガンカップビー系も分かるような気がする。

Django 勉強会 Disc 0

半蔵門のお洒落なオフィスで開催された「Django 勉強会 Disc 0」に参加してきました。

主催の露木さんも人が集まるか心配していたようですが、蓋を開けてみると参加者は20人、しかもDjangoに目をつけるだけあって、皆さんかなりの腕前。初回なので、皆さんのレベルを推し量るという意味でチュートリアルを2,3人ずつのチームに別れて行うという内容でしたが、これは次回からかなり期待できそうです。

勉強会のトピックス

  • admin画面の自動生成ドキュメントがすごい
  • ブラウザのAccept-Languageによって言語切り替えをするには、MIDDLEWARE_CLASSESのsessionの後に'django.middleware.locale.LocaleMiddleware'を1行追加するだけ
  • モデル定義がPython的、メタクラス定義
  • Mac率高い、60%くらい

懇親会のトピックス

  • Weboo meets Twisted Mind . ついに会えた、握手した、かなり熱い人だった。
  • 『みんなのPython』 増刷が決定
  • 外人がYellow Submarineを熱唱してた
  • 壁と脱力系

プログラミングをしながら聴く音楽

会社では音楽を聴きながら仕事をしているんですが、そろそろ自分のライブラリに飽きてきたので、iTunesの共有機能を使って同僚のnaoyaくんの曲を聴かせてもらいました。

で、驚いたんだけど、全曲クラシックだよ!本人に聴いてみたところ、普段は普通の曲も聴くらしいんだけど、プログラミングの時は集中したいのでクラシックにしてるんだそう。しかも、眠気防止のためか、ほとんどがバロック調のものでした。いやー、世の中、いろんな人がいるもんですね。

僕は、プログラミング中でもジャンル関係なく何でも聴きます。集中していると、歌とか全然耳に入ってこないし。気づいたら、好きな曲が終わってたってこともしばしばあります。プログラミング中はこういうジャンルにしたほうがいいとかあるんですかねー

# 最近は、なぜか懐メロ系のMy Little Loverばっかり聴いてる…

Wanderlustで添付した画像ファイルが携帯で見えない問題

Wanderlust で画像ファイルを添付して携帯電話に送信しても、何も添付されていないように見える問題が発生して困っていた。いろいろ試行錯誤して、やっと原因が分かった。

Wanderlust(正確にはSEMI)で作成したMIMEヘッダはこのようになっている。

Content-Type: image/jpeg
Content-Disposition: inline; filename="hoge.jpg"
Content-Transfer-Encoding: base64

一方、ちゃんと添付画像が見えるメールは、こうなっている。

Content-Type: image/jpeg; name="hoge.jpg"
Content-Disposition: attachment; filename="hoge.jpg"
Content-Transfer-Encoding: base64

Content-Typeの name parameter が怪しい。しかし、どうやってこれを追加するんだろう?

フォト蔵APIライブラリ for Python

だいぶ前に書いたんだけど、すっかり公開するのを忘れていました。

実行には、 MultipartPostHandler.py が必要ですので、同じディレクトリに置いてください。他に ElementTree も必要ですが、Python 2.5から標準機能に組み込まれるので、最初からインストールされていることが多いのではないかと思います。FedoraだとPRMパッケージが用意されています。

#!/usr/bin/env python
import base64
import urllib2
import MultipartPostHandler
from elementtree import ElementTree

class Photozou:
    API_HOST = "http://api.photozou.jp"
    API_URL = API_HOST + "/rest/"

    def __init__(self, userid, password):
        self.userid = userid
        self.password = password
        auth_handler = urllib2.HTTPBasicAuthHandler()
        auth_handler.add_password("photo", self.API_HOST,
                                  self.userid, self.password)
        self.opener = urllib2.build_opener(auth_handler,
                        MultipartPostHandler.MultipartPostHandler)
        urllib2.install_opener(self.opener)

    def check(self):
        return self.nop()

    def nop(self):
        url = self.API_URL + "nop"
        return self._sendRequest(url)

    def photo_add(self, photo_file, album_id, photo_title="",
                  tag="", comment="", **args):
        url = self.API_URL + "photo_add"
        photo_title2 = photo_title[:]
        tag2 = tag[:]
        comment2 = comment[:]
        params = {"photo"      : open(photo_file, "rb"),
                  "album_id"   : album_id,
                  "photo_title": photo_title2,
                  "date_type"  : 'exif',
                  "tag"        : tag2,
                  "comment"    : comment2}
        return self._sendRequest(url, params)

    def photo_add_album(self, name, description=""):
        url = self.API_URL + "photo_add_album"
        params = {"name": name, "description": description}
        return = self._sendRequest(url, params)

    def photo_album(self):
        url = self.API_URL + "photo_album"
        retxml = self._sendRequest(url)
        albums = [album for album in retxml.findall('info/album')]
        return albums

    def user_group(self):
        url = self.API_URL + "user_group"
        retxml = self._sendRequest(url)
        groups = [group for group in retxml.findall('info/user_group')]
        return groups

    def _sendRequest(self, url, params=None):
        try:
            ret = self.opener.open(url, params)
            xml = ElementTree.parse(ret)
            return xml
        except urllib2.HTTPError:
            return False
        except IndexError:
            print "Error! -> ", xml.find('err').attrib['msg']


if __name__ == '__main__':
    pz = Photozou('mail', 'password')
    if pz.check():
        print "Auth OK!"
    else:
        print "Auth Failed."

最後の if __name__ == '__main__': っていうのは、このファイルが直接実行された際に実行される処理です。他のプログラムからimportされた場合には、実行されません。クラス定義にもこれを書いておくことで、簡単な使い方が分かったりしてけっこう便利。

ECS3.0+SOAPでAWSが文字化けしている

サイドに表示しているAmazon売れ筋ランキングが、2,3日前から文字化けしています。他のサイトでも同様の現象が発生していて、サービス側に問題があるっぽい。ウォッチしておく。

Thread: ECS3.0における受信データの文字化け

それPy

先日、 Rubyのホームページ がリニューアルしました。上のほうに“エレガントな文法を持ち、自然に読み書きができます。”とあって、特徴的なサンプルコードが載っています。 それPythonだとこうなるよ! ってことで、書いてみました。やっぱり、RubyとPythonって似てるなぁ…

(1)Rubyの場合

# The Greeter class
class Greeter
  def initialize(name)
    @name = name.capitalize
  end

  def salute
    puts "Hello #{@name}!"
  end
end

# Create a new object
g = Greeter.new("world")

# Output "Hello World!"
g.salute

(1)Pythonの場合

# The Greeter class
class Greeter:
    def __init__(self, name):
        self.name = name.capitalize()

    def salute(self):
        print "Hello %s!" % self.name

# Create a new object
g = Greeter('world')

# Output "Hello World!"
g.salute()

(2)Rubyの場合

cities  = %w[ London
              Oslo
              Paris
              Amsterdam
              Berlin ]
visited = %w[Berlin Oslo]

puts "I still need " +
     "to visit the " +
     "following cities:",
     cities - visited

(2)Pythonの場合

cities = set(['London',
              'Oslo',
              'Paris',
              'Amsterdam',
              'Berlin'])
visited = set(['Berlin', 'Oslo'])

print "I still need to visit the following cities:", \
      cities - visited

(3)Rubyの場合

# Output "I love Ruby"
say = "I love Ruby"
puts say

# Output "I *LOVE* RUBY"
say['love'] = "*love*"
puts say.upcase

# Output "I *love* Ruby"
# five times
5.times { puts say }

(3)Pythonの場合

# Output "I love Python"
say = "I love Python"
print say

# Output "I *LOVE* PYTHON"
say = say.replace("love", "*love*")
print say.upper()

# Output "I *love* Python"
# five times
print say * 5

今日はMacの布教活動に勤しむ

今日は、ラボブログでMacの布教活動をしてみました。

http://labs.unoh.net/2006/09/webmac_os_x.html

でも、自分が宣伝なんかしなくてもWeb系エンジニア界隈では、本当にマカーが増えてますよ。次期LeopardにRailsが載るのもそうだけど、Appleの「まず開発者を取り込もう」という戦略は、かなり当たっている気がする。

Django三兄弟もマカーだし(謎)

Python布教活動、未遂に終わる

今日はウノウの社内勉強会でした。自分が当番だったので、簡単な資料を用意して、PythonとDjangoを紹介するつもりでした。

ところが、MacBookとプロジェクタの相性が良くないらしく、画面をスクリーンに写すことができません。Mac側ではバッチリ認識しているのにプロジェクタが認識してくれない模様。完全に一方通行で、まるで自分の姿を見ているようです。普通にアナログVGAで繋いでるだけなんですが…

はてなのnaoyaさんから、ほぼ同じ構成で使えているとの情報ももらいましたが(進太郎さん経由で)、こちらはいろいろ試してもだめでした。

というわけで、Pythonの布教活動は未遂に終わってしまいました。とりあえず、来週に持ち越しです。今、プロジェクタのメーカーに問い合わせているのですが、簡単には解決しなそうな予感。資料をKeynoteで作っちゃったのと、ローカルにDjangoの環境を作ってあるので、最悪VNC経由でプレゼンとかになるのかなぁ。なんかやだな…

スタートページにWikipediaを設定して少しだけ賢くなろう

ブラウザを立ち上げる度にWikipediaのページをランダムに表示して、毎日見ていれば少しずつ賢くなれるかもしれない。次のページをブラウザのスタートページに設定するだけでOK。

http://ja.wikipedia.org/wiki/Special:Randompage


まだ設定してから2日しか経ってないけど、へーと感心すること多し。同じようにPythonのヘルプから毎日ランダムに1ページ表示するっていうのはどうだろう。 ネタ元


♪Don't Know Why - Norah Jones

Python合宿 2006 夏

9/29(金)〜10/1(日)にPython Developer's Camp 2006 Summerというのが開催されます。Python初学者向けのものから、最近注目のWebフレームワークを題材としたスプリントなど、多くの人が楽しんで頂ける内容です。平日含む2泊3日という日程にも関わらず、現時点で35名もの参加者がいるとか… すごいなぁ。

空きは残りわずかとのことなので、参加したい方はお早めに。

なんか8月はスカウトがいっぱい来ていた件

転職活動中に登録したリクナビNEXTなんですけど、退会するのをすっかり忘れていました。転職する気は全くないのですが、スカウトメールとか頂いてとても恐縮です。条件的にもっといい会社は沢山あるのだろうけど、“会社の環境に左右されず、興味を持った技術を 突き詰めていける、そんな自由度が高い仕事環境”というのが何よりも重要です。自分的には。

僕より若い人たちへのアドバイスをすると、転職する気の有無に関わらず、こういうサイトに登録しておくのは良いことだと思いますよ。自己アピールする文章を書くことで、今までやってきた仕事を棚卸しできるし、自分は何が得意で、何が足りないのかを見直すきっかけにもなります。こういう棚卸しは、最低でも1年に1回は行うべきです。また、検索キーワードで企業が注目しているスキルが分かったり、業種ごとの求人数の増減を見ることで景気の状況も予測することができます。

こういう転職サイトっていろいろありますが、とりあえず登録するなら、規模的にも大きいので リクナビNEXT がお勧めです。ただし、自分が所属している会社からはレジュメが見えないようにちゃんと参照制限するのを忘れないように。

百式の田口さんとサイドフィードの赤松さん

昨日、 百式の田口さんサイドフィードの赤松さん が出張オフィスでウノウにやって来ました。

仕事中はお話しする機会がなかったのですが、ランチと夜の飲み会でいろいろな話を聞くことができました。やっぱりクレバーという言葉がピッタリなお二人でした。「同じようなアイデアを思い付く人は世の中にたくさんいるけど、実際に行動する人は一握り」ということをどこかで読んだのですが、まさにその一握りに入る人は、一味違うように感じました。いや、アイデアも一味違いますけど。


   実際に実行する >>>>> (越えられない壁) >>>>> アイデアを思いつく > 不便さに気づく


それから、PHPのPEARはバグが多いし、フレームワークなんて使わないよ、っていう話も興味深かったです。確かに「おれおれフレームワーク」があれば、それが一番かも。


(おまけ)

一時期、このブログも feed meter のブログランキングに入っていたのですが、今はすっかり圏外なので、赤松さんからランキングアルゴリズムを聞き出してズルしようとしたけど、教えてもらえませんでした。残念w

del.icio.us APIは、URLが変わってたのね…

del.icio.usに登録したものを毎日、はてなブックマークに自動でインポートしてるんだけど、ここのところうまく動いていませんでした。で、昨日URLが変わったということを知って納得。

pydelicious というライブラリを利用しているのですが、pydelicious.pyを次のように変更すると動作するようになりました。

DWS_HOSTNAME = 'https://api.del.icio.us/'
DWS_API = 'https://api.del.icio.us/v1/'

GNU Screenの中でCtrl+aやCtrl+rが使えなくて困ってました

GNU Screenの中で Ctrl+a (行頭に移動)や Ctrl+r (ヒストリを検索)などのよく使うキーバインドが使えなくて非常に困っていたんですが、いろいろ調べてやっと原因が判明。

Subversionのコミットログ編集用に環境変数EDITOR=viを設定していたので、zshがviキーバインドになっていたためでした。原因が分かれば何てことはないのですが、しばし悩みました。次のどちらかを設定すれば解決します。

1.zshのキーバインドを明示的に指定する方法

.zshrcに以下を記述

bindkey -e

2.環境変数SVN_EDITORを使う方法

EDITOR=viの代わりに以下を設定

export SVN_EDITOR=vi

あ〜、スッキリ


♪白いカイト - My Little Lover

Mac OS XにDjangoの開発環境を構築する

OS X Tigerには標準でPython 2.3が組み込まれているのですが、ちと古いので Darwin Ports から2.4をインストールします。

1./opt/local/bin:/opt/local/sbinを$PATHに追加します。

2.Python 2.4をインストールします。

$ sudo port install python24

3.SQLiteをインストールします。

$ sudo port install sqlite3
$ sudo port install py-sqlite2

4.Djangoの開発版をリポジトリからチェックアウトします。

$ svn co http://code.djangoproject.com/svn/django/trunk/ ~/django/django_src

5.$HOME/django/django_src/django/bin を$PATHに追加します。


これで準備が整いました。あとは普通に開発環境を作成していきます。

$ django-admin.py startproject <project_name>
$ vi settings.py
$ python manage.py startapp <app_name>

LiveCodingの集いに参加してきた

都内某所で行われたエンジニアの集いに参加してきました。美味しいお酒と食事に囲まれて幸せだったのですが、メインイベントはライブコーディング!! コーディングって普通はひとりで黙々とするものなんですが、ユニットテストをPassすると周りから拍手が沸いたり、Syntax Errorなんか出そうものなら厳しい野次が飛んだり、と非日常的な感じで楽しかったです。普段の開発でもテストに失敗すると、緒川たまきがダメ出ししてくれるようなツールがあると面白いかも…

内容は、RubyでCursesを使ったAAのウィンドウをブラウザ画面に表示するフレームワーク構築、日本語プログラミング言語「なでしこ」でゲームを作る、RubyとFlashでサーバプッシュ型のチャットを作るの3つ。他の人がどんな環境でプログラムをしているのかとかが分かって面白かったんですが、「なでしこ」のライブコーディングはインパクトがありましたよ。日本語で普通に文章書いてるのが、プログラムとして実行されるんですからね。

宴は朝まで続いてたみたいですけど、僕はやっぱり自分でプログラムが書きたくなって終電前には帰って来ました。といっても、酒が入ってたのですぐ寝たけど。


関連リンク:
Think and Win » Blog Archive » ライブコーディング 第2回

Railsの洗脳を受ける

開発合宿 で作成したツールをジュンヤさんがウノウ社内で利用できるように設定していました。残念ながら、当面は社内限定で一般公開はまだ未定なんですが、このRails製ツールのソースコードを解説付きで見せてもらいました。

  • まず、ソースが読みやすい。
  • テンプレートに書いたおまじないで、JavaScriptを自動生成
  • HyperEstraierの検索も2時間あれば実装可能
  • DBもルールに従うことでリレーションを自動生成
  • タグ機能の追加もとっても簡単

だいぶ洗脳されてきた…


♪YES - My Little Lover