ページ

2010年9月30日

Magic Trackpadを買って、Magic Mouseがいらなくなる

7月の終わり頃にiMacを買いました。そのときからトラックパッドが欲しかったのですが、ずっと品薄で手に入りませんでした。で、やっと手に入れたのが2週間ほど前です。それ以来、使っています。

ポインティングデバイスは、僕が物心ついた頃にはマウスはあって、普通に使っていたと信じています。そのあと、初期のLets Noteを買って、 トラックボールを使うようになりました。トラックボールは熱狂的なファンがいるようですが、僕はそれほどのファンではありません。Letsを使うときはトラックボールで、デスクトップを使うときはマウスを使っていました。

そして時代は変わって、一部の熱狂的なファンに惜しまれつつも、Letsはまるいトラックパッドになりました。僕はこだわりがなかったので、普通にトラックパッドを使っていました。でも、Letsのトラックパッドは小さいので、オフィスにいるときはマウスをつないでいました。

どこかのタイミングでお仕事で使っていたノートPCがIBMのマメポッチみたいなやつだったのですが、あれは慣れなかったです。あれだけは、ダメでした。

で、LetsのあとにMacBookを買ったのですが、トラックパッドが広いです。広いと使いやすいです。で、マウスは僕にとっては使いにくいものになりました。多分、Letsもパッドがもっと大きければ、マウスをつなげなかったと思います。

で、デスクトップを使うときもいつしかトラックパッドが使えないかなー、と思うようになりました。できればキーボードとトラックパッドの一体型がいいんですが、リンゴの会社は作ってくれなさそうですね。

でも、マジックトラックパッドがきて、iMacに付いてきたMagic Mouseはいらないものになりました。店頭で使ったときはMagic Mouseも結構いい感じだと思っていたのですが、長時間使うと重くて疲れるので、いつしか普通のマウスより使いにくいマウスになっていました。マイティーマウスも使いにくかったので、アップルの作るマウスはダメなのかも知れません。

マジックトラックパッドになって、とても快適です。やっぱり、トラックパッドはいいです。まあ、慣れの問題と言うか、個人の趣味なんですが。

でも、マジックトラックパッドにフィルムをはる人がいるらしいですが、なんでフィルムを貼る必要があるか、よく分かりません。 

さて、使わなくなったマジックマウス、どうしよう? 



2010年9月29日

Google Developer Days 2010に行ってきた

今日はGoogle Developer Days 2010があったので行ってきました。実は行くかどうか、直前まで迷っていたのですが、行くことにしました。今回は3回目の参加です。前回と前々回はGoogle IOの直後でそれをトレースする感じなので、目新しいことはあまりありませんでした。今回はGoogle IOからかなり間があいているので、どうなるんだろうと思っていましたが、良くも悪くも、予想通りかな?

午前中の基調講演は、今日のことをすべてまとめている感じもするので、これだけでもういいかな〜、と感じたりもします。オーストラリアっぽい訛りの人がいました。僕はオーストラリア人の知り合いはいないので、本当にオーストラリアかはわかりません。最初はちょっと戸惑いました。 

お昼を食べながらパネルディスカッションで「未来のソーシャルウェブを占う」というのを聞いていました。まあ、徳力さんがモデレータだったので聞いていただけです。僕はあんまりソーシャルとかは興味がなかったりします。ご飯を食べながらだったので、気軽に聞いていました。感想は、モデレータがいまいちだったような気がします。ごめんなさい、徳力さん。

その後は、「プログラミング言語Go」というのを聞きました。これが残念でした。僕の期待と全く違っただけですが・・・。登場して一年が経つので、成長の軌跡みたいなことかな、と勝手に想像していましたが、Goで簡単なアプリを作って勉強する、みたいな感じでした。一年前であればスライスがどうメモリを扱っているかとか、そこそこ面白かったのかもしれませんが、今更感があります。goroutineとかそういう話もないし・・・。まあ、勝手に期待して勝手に裏切られただけなんですが。でも、goを知らない人にはよかったと思うし、むしろ難しいかも。

そのあと、Google Storage、Prediction API、BigQueryのお話でした。これはそこそこ楽しめました。Google Storageはeventually consistencyじゃなくって、"Read-your-writes" consistencyだと言っていました。eventually consistencyはいい加減さをかっこ良く言ってごまかそうとしているものだと思っていたのですが、それに対抗しているのでしょうか?Read-your-write consistencyってあまり聞いたことがなかったのですが、ググると結構ヒットします。この記事のタイトルはこれです。


Read-your-writes (RYW), aka immediate, consistency 

うーん、タイトルからして面白いですね。Predictionはあまり興味ないのでスルーして、BigQueryは後日遊んでみます。

そのあと、何回か聞いたような気もしますが、「グーグルエンジニアの日常」と言うのを聞きました。これはまた、別のエントリにするかも。で、感想はグーグルは天国のようにも感じないし、グーグルで働きたいとも思わない、かな。確かにすごい環境だとは思うんですよね。おやつと飲み物が無料なのは当たり前として、御飯まで出るとは・・・。ちなみに、アリエルもおやつが毎日でます。 

 



2010年9月28日

電子教科書とかIT教育とか・・・

いろいろなものをかなり周回遅れで書いている気がしないでもないですが・・・。

ちょっと前に電子教科書で教育が云々という話がありました。僕は新しい者好きなので、子供が乱暴に扱っても壊れない電子教科書であればあってもいいと思います。ただ、電子教科書で何が変わるか、と言われると、変わらないんじゃないかな・・・、と。媒体が変わるだけで、そこに本質的な変化はないと思います。双方向とか、コミュニケーションとかメリットを並べ立てることもできると思いますが、今のところ僕には幻想にしかみえません。電子教科書に反対じゃなくって、積極的に賛成じゃないだけです。

さて、電子教科書はそんな感じですが、IT教育とか言うのは、基本的に反対です。 そんなものはなくても全く困りません。まあ、僕の家には変なガジェットであふれかえっていて、それらがパパのおもちゃから子供のおもちゃに変わって言っている特殊な環境だからかも知れません。そうは言っても、たいていのガジェットなりPCは、特に教えなくても勝手に遊んでいるし、いろいろな技も発見しているようです。なので、便利なものであれば学校なんかでわざわざ教えなくても、勝手に使い方を覚える者です。

それから、そういう環境で使うものがWindowsと言うのも良くないです。もっと言えば、その上でOfficeとかホームページを作るためのソフトとか使うのがよくありません。特定の環境をわざわざ学校でうわっつらだけ教えても意味がないです。そんな知識はすぐに役に立たなくなります。そんなものにわざわざコストを払ってまで今更一生懸命やる意味がありません。何かの教育の一環というか、手段で使う分にはいいですが、それが目的化してもあまり意味がないかな。

で、基本的に反対なんですが、ネット上や携帯のマナーや危険を教えることは、 ちゃんとやるべきです。それ以外は、必要ないんじゃないかな?

で、そんなことやる暇があったら、論理的に考える方法とかを勉強すればいいと思っていたんだけど、何かにつけて論理的に反抗されたら嫌だな〜、と。 教育は難しいです。



2010年9月27日

gdataのCalendar APIのメモ

最近、わりかし長い時間gdataのCalendar APIで遊んでいます。まあ、何を作っているかは想像できる人には想像できるかな。
さてそのgdataで終日の予定を作るのはどうすればいいのだろう?ということで、結論から言えば日付データの文字列で時刻がないものということらしいです(ここ)。Python的には、

event.when.append(gdata.calendar.When(start_time="2010-09-27")

のようになります。一日だけの終日の予定は、start_timeだけを記述すればいいようです。では、複数日にわたる終日の予定ってどうなんでしょう?ということで、それは、end_timeを時刻なしで設定すればよいようです。上の一日だけの予定は、次の記述と同義です。

event.when.append(gdata.calendar.When(start_time="2010-09-27",
                                                                  end_time="2010-09-28"))

なので、例えば二日間の終日の予定は、次のようになります。


event.when.append(gdata.calendar.When(start_time="2010-09-27",
                                                                  end_time="2010-09-29"))

つまり、end_timeは終日の日数+1の日付ということになります。まあ、当たり前ですね。

さて、普通の予定はGMTで指定しました。でも、終日の予定には日付しかないです。タイムゾーンを指定するところがありません。終日の予定はその予定に設定されているタイムゾーン、通常はカレンダーの設定でしていしてあるタイムゾーンになります。時刻指定がある場合とない場合で、タイムゾーンの意識の仕方が変わるのはちょっとややこしいですね。

2010年9月23日

個人のブログもちゃんと書くように決意した

個人のブログは多分、2000年頃から書いています。2008年の暑い夏に自宅サーバがお亡くなりになって、それ以降はbloggerで書いています。残念なことは、サーバがお亡くなりになるときにデータがなくなっちゃことですが、まあ、仕方ありません。

その個人のブログですが、最近はなかなか更新できませんでした。理由は、忙しいからではないです。最も、忙しいからと言うのを理由にしたくないだけかも知れません。

さて、理由は多分、疲れたからです。年のせいかもしれません。別の言い方をすれば、ネタがなくなったです。よほど引き出しが多い人じゃない限り、ネタはそのうち底をつくので、ネタを探し続けないといけません。ネタを探して、それで遊んで、と言うところまではそこそこやるんですが、そこから先がめんどーになります。 で、一人で遊ぶだけで満足しちゃって、外にさっぱりアウトプットしなくなります。もったいないです。

アウトプットしないでインプットばかりするのは自慰だと思っているし、アウトプットしないとインプットの量が増えないです。 

なので、まあ、今後は頻度はそれほどあげないで、細々とアウトプットし続けるようにします。 まあ、とりあえず、自分のメモ的なものはなるべく書くようにしようと思う今日この頃です。 

で、個人のブログとこのブログと二つ書いていますが、どちらか片方だけならほぼ毎日書く自信はあるんだけど・・・。 



2010年9月21日

MacPortsのcassandraを一般ユーザで動かそうとしたら困ったよ、の巻

やっぱりMongo DBにしようかな、と迷いつつもcassandraをちまちま動かしたりしていました。今まではルートユーザで動かしていたんですが、めんどいので一般ユーザで動かそうとやっと思うようになりました。タイトルにも書いたように、環境はMacPortsで入れたものです。
環境変数のCASSANDRA_CONFを設定すれば、confのディレクトリが変更されると信じていました。CASSANDRA_CONFをホームディレクトリの下に設定して起動しても/opt/local/share/java/cassandraの下を参照します。/opt/local/bin/cassandraを見ると、次の順にファイルを読み込んで環境変数を設定しています。

/usr/share/cassandra/cassandra.in.sh \
/usr/local/share/cassandra/cassandra.in.sh \
/opt/local/share/java/cassandra/cassandra.in.sh \
~/.cassandra.in.sh \
`dirname $0`/cassandra.in.sh; do

ちゃんと読んでいなかったのですが、後優先で設定を上書きしていくと思ったら、最初に見つかった設定を読み込んでbreakしています。MacPortsでいれると、/opt/local/share/java/cassandra/cassandra.in.shを読み込んでbreakしています。どうりで、カレントディレクトリにcassandara.in.shを置いても読み込んでくれないはずです。

cassandraを使うときに使用する環境変数で、変更しそうなものはCASSANDRA_CONFだけだと思うのですが、/opt/local/share/java/cassandra/cassandra.in.shでは

# The directory where Cassandra's configs live (required)
CASSANDRA_CONF=$cassandra_home/conf

と見事に上書きしてくれています。もう一度/opt/local/bin/cassandraをみると、環境変数でCASSANDRA_INCLUDEを指定していると上の環境変数を指定したファイルは読み込まないので、/opt/local/share/java/cassandra/cassandra.in.shをホームディレクトリのどこかにファイルをおいて、CASSANDRA_INCLUDEでそこを指定します。次にcassandra.in.shのCASSANDRA_CONFをホームディレクトリのconfの置き場所を指定すれば、めでたしめでたし。

ちなみに、confディレクトリのlog4j.propretiesのlog4j.appender.R.Fileとstorage.xmlのCommitLogDirectoryとDataFileDirectoryは正しく設定し直すのは忘れないでね。

最後に、cassandra.in.shで、環境変数にCASSANDRA_CONFが設定されていれば、CASSANDRA_CONFを上書きしないようにすれば、みんなハッピーになれると思うんですが・・・。

2010年9月17日

IE9 betaとその誕生日会と・・・

昨日はIE9 betaが生まれました。家ではWindowsは使わないので、会社に来てからインストールしました。Preview版と同様に軽快に動いてすばらしいです。感想を一言で言うと「IE6,7,8爆発しろ!」と。

さて、そんなIE9ですが、ひっそりと誕生日会が新宿のマイクロソフトであったので行ってきました。行く前に新宿のビックカメラに行ったらMagic Trackpadが沢山売っていたので買ってきました。それはまた、別の機会に。


 

さて、 IE9 betaですが、自分の会社の製品にアクセスすると・・・。JavaScriptが動いてくれませんORZ。プレビュー版では動いていたので悲しい限りです。で、とりあえず互換モードで動かすと、快適です。快適と言っても体感的にはFirefoxとかChromeとか、Safariとかと変わらないです。IE6,7,8が遅いだけなので・・・。

誕生日会ではIE9のUIについてマイクロソフトの人が自慢げに喋っていましたが、普段Chromeを使っているので、すごさを全く感じないです。まあ、それもあるけど、やっぱりIE9のすごさはデモサイトをみせるだけでいいような気もします。スピードのベンチマークは誰かが、自分たちで作ったベンチマークだから自分たちの製品が一番速くなるのはあたりまえとか、1ms速くなったってどうでもいいでしょ!と言っていました。まあ、そんなものです。なので、スピードとかは僕もある一定上であれば気になりません。IE6,7,8がそのラインを越えていないので問題なだけです。

IE9はネットワークキャッシュを最適化しているみたいなことを少し言っていました。興味はあるんですが、言っていることがさっぱり分かりませんでした。まあ、紹介程度の内容なので仕方ないんです。

CanvasがIE9では使えます。これは嬉しいです。でもWebSocketsは残念なことになりそうですが、まあ、仕様の確定とかを考えるといた仕方ないことです。で、一番の驚きは、開発ツールはF12 developer toolという名前らしいです。F12って・・・。

で、IE9はHTML5に向けていろいろできるようになってきますが、ChromeとかFirefoxと違って数ヶ月単位でリリースできないIEは不利なようで、他のブラウザに実験させて仕様が安定したあたりで取り込めばいいので、悪くない戦略かも知れません。でも、多分ギークにとってはちょっとだけ古くさいブラウザと感じるのでしょう。

まあ、HTML5を抜きにしても、速いと言うだけでIEはやればできる子だったのです。もう一度まとめると、「IE6,7,8は爆発しろ」



Flask-Babelのメモ

python界のWebフレームワークと言えばDjangoばかりがもてはやされていますが、僕はFlaskが好きで使っています。いろんなものがgeventベースで動いているので、Djangoは重すぎるのです。さて、国際化についてはTracを作っているところが作っているBabelがありますが、それをFlaskから使いやすくしたものがFlask-Babelです。Flask-Babel関係のメモです。

1. インストール
$ pip install Flask-Bable
です。インストールの仕方って必要?

2. コマンドを使ってメッセージの抽出とか翻訳とか

次の設定ファイルを作ります。pythonのファイルとjinjaのhtmlテンプレートから翻訳するためのメッセージを抜き出すための設定です。

[python: **.py]
[jinja2: **/templates/**.html]
extensions=jinja2.ext.autoescape,jinja2.ext.with_
これをbabel.cfgとして保存します。次にこの設定ファイルをつかって、翻訳すべきメッセージをmessages.potファイルに抜き出します。
$ pybabel extract -F babel.cfg  -o messages.pot .
これはテンプレートなので、ここから各言語ごとにpoファイルをつくります。gettextの国のお話なのでその辺は割愛。最初は初期化します。
$ pybabel init -i messages.pot -d translations -l ja
これは、初期化するものなので、テンプレートを更新したら次のコマンドでpoをアップデートします。
$ pybabel update -i messages.pot -d translations
で、translations/ja/LC_MESSAGESにmessages.poがいるので、この人を翻訳してから、上の方にコメントアウトしてあるLazyの行を削除して、コンパイルします。
$ pybabel compile -d translations
これでmoができます。

3. pythonのコードの変更

話は前後しますが、pythonのコードでgettextを使えるようにしないといけません。まずはbabelをセットアップします。

from flaskext.babel import Babel, gettext
app = Flask(__name__)
app.config.from_pyfile('mybabel.cfg')
babel = Babel(app)

セットアップが終わったので、コードの中で翻訳が必要なところをgettextのメソッドを経由するようにします。

gettext(u"Hello, world!")

さて、言語設定はブラウザから言語を優先する場合は、次のコードを書いてあげます。

@babel.localeselector
def get_locale():
    return request.accept_languages.best_match(['ja', 'ja_JP', 'en'])

これを書かないと、英語しか表示してくれませんでした。セッションの情報が使えるので、セッションからユーザが指定した言語で表示することもできます。それから、jaだけでうまくいくと思っていたのに、IEはja_JPじゃないと日本語なってくれませんでしたIEの言語設定でjaだけのものを追加してあげれば大丈夫なんだけど。

pythonのコードはおしまい

4. jinjaのhtmlテンプレートの変更

jinjaのテンプレートは翻訳が必要な場所を次のように書きます。すでにおまじないをかけているので、何も考えなくてもgettextが使えます。

{{ gettext('Hello, world from jijna html template.') }}

全部、おしまい。


2010年9月16日

ブログのデザインを変えてみた

今までは横幅がちょっと狭くて、もう少し広げたいと思っていましたが、ずーっとそのままになっていました。で、デザインに飽きてきたこともあって、新しいデザインにしてみました。まあ、作業は30分もかかならない程度ですが・・・。ヘッダーの画像の切り取りがちょこっと大変でしたが、まあ、そのぐらいです。画像もどこかに落ちているのを使えばいいのですが、自分で撮った写真を使っています。ちなみに写真の場所は夏休みに泊まったパラオのホテルです。明るめの画像を使ってみました。下が切り取り前の画像です。

ありえるたんをOAuthに対応させたときのメモ

twitterがOAuthになって、今まで使っていたTwythonが使えなくなりました。twythonの中にoauth.pyとかいるので対応していると信じていたのですが、しかたありません。それで別のライブラリ、tweepyを使うことにしました。

1. インストール

easy_install tweepy

ちなみに、僕が会社で使っているtweepyはgithubからとってきて、ちょこっと修正を加えているものです。

2. Twitterへのアプリケーションの登録

OAuthを使ってTwitterのAPIを操作するためにはtwitterにアプリケーションを登録しないといけません。認証に必要なtokenとかを取得するためですね。登録画面から登録します。必要な項目を埋めると、Consumer key、Consumer secretなどが出力されます。

次に認証に使うTokenを取得します。Tokenの取得には、tweepy-exampleにあるgetaccesstoken.pyを使います。この人を実行すると、Consumer keyとConsumer secretの入力を求められます。先ほど取得したものを入力するとブラウザが立ち上がり、pinナンバーが表示されます。コンソール上にはpinナンバーの入力が促されているので、そこにpinナンバーを入力すると、tokenのkeyとsecretが出力されます。これらはメモっておいてください。ちなみに、ブラウザを立ち上げずに、自分でwebにアクセスしてpinナンバーを取得できそうな気がしますが、一回きりしか使わないので、割り切りでしょう。

3. tweepyのオブジェクトを作る

次にtweepyのoauthを使ってTwitter APIを利用できるようにします。

import tweepy

access_key="2で取得したアクセスキー"
access_secret="2で取得したシークレットキー"


auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_key, access_secret)
api = tweepy.API(auth_handler=auth)

これで、OAuthを使って認証できるようになりました。ちなみに、この人は、Proxyを通らないので、Proxyがある環境は僕のgithubから持って行ってください。

4.  とりあえず、投稿する

api.update_status("Hello, world!")

5. 効率は無視したfollowしてくれている人をfollowしかえすコード

人数が増えると悲しいことになるコードですが、それはサンプルと言うことで・・・

me = api.me()
friends = me.friends()
followers = me.followers()
for follower in followers:
    if not is_friend(follower, friends):
        api.create_friendship(follower.id)

def is_friend(self, follower, friends):
    follower_id = follower.id
    for f in friends:
        if follower_id == f.id:
            return True
    return False

でわでわ

2010年9月15日

Google Calendarのgdata(python)の雑多なメモ

1. イベントの日付の変更

event.when[0].start_time = "2010-09-15T15:00:00.000Z"
event.when[0].end_time = "2010-09-15T16:00:00.000Z"
2. authorとか人の登録

event.author = atom.Author(email=atom.Email("myaddress@example.com"))

※ cnで表示用の名前とか登録できる

3. 登録とかで例外がでたら・・・

gdata.service.RequestErrorが送出される。配列になっている。で、データは辞書(?)になっていてstatus, reason, bodyからなる。reasonで失敗の原因が書かれている。statusはステータスコードね。大体400番台。bodyはConflictしていればコンフリクトした予定とかがatomの文字列で書かれている。

4. 文字列からイベントのオブジェクトへの変換

まあ、3で発生した例外でConflictしていたイベントの詳細を知るためにやったのですが・・・

event = gdata.calendar.CalendarEventEntryFromString(error["body"])

多分、これで全部。

27インチディスプレーは最狂かもしれない

いつ嫁が新しいiPod nanoを買ってくれと言うか、恐怖の日々を過ごしていますが、それとは関係なく我が家に27inch iMacがやってきたのが一ヶ月ぐらい前です。店頭ではあまり思わなかったのですが、家にもって変える途中や家に設置した後につくづく「でかいな〜」と感じます。子供も嫁もでかいでかいと言います。スペース的には一応、もう一代27inch iMacをおけそうです。

27inch iMacが欲しかったのは、速いMacが欲しかった訳ではなく、でかいディスプレーが欲しかったからです。まあ、そのディスプレーを使うためにはそれなりのハードも必要な訳ですが・・・。さて、そのディスプレーの中で何を表示しているかと言えば、まあ、横に3つに区切られていて、半分弱のスペースにブラウザがいます。リファレンスの参照とか、いろいろですね。のこりのスペースを2分する形で、ブラウザの隣に大きな声では言えませんが、Emacsがいます。Aquamacsはすぐに落ちたりするので、普通のCocoa Emacsです。その隣にターミナルがいます。それらが重なることなく閲覧、作業できるので、とても快適です。ちょっと高い買い物でしたが、とても満足です。会社のディスプレーを一番長くみるので、会社のディスプレーもでかくしたくなります。いや、会社のディスプレーこそでかくするべきです。でも、こんなでかいディスプレーがならんでいるオフィスの威圧感を想像すると、うーん。難しいですね。

さて、でかいディスプレーは快適なんですが、今の僕の能力ではこれ以上のでかいディスプレーは必要ありません。サブディスプレーとかで何か表示をしても処理しきれそうにありません。まあ、それもEmacsを使っているからそう感じるだけかもしれません。Eclipseを使えばまた、違った感想を持つかもしれませんが、潔癖性の僕は家のiMacにEclipseを入れる気はしません。

あとは、メモリを8Gにしたいのですが、メモリを買っても取り付けるのが大変そうなので、躊躇しています。まあ、Virtual Machineを動かさなければメモリが足りなくなることもなさそうだし(多分)、もう少し我慢の子です。

iMacの不満は・・・、Magic Mouseです。まあ、もともとTrackpad派で、なおかつ家電量販店でTrackpadが入荷されてこないという不満もありますが、Magic Mouseは重いです。重いのでしばらく使っているとフラストレーションがたまります。画面がでかい分、移動距離が増えて、重さがなにげに効いてきます。多分、電池が重いんだと思うけど・・・。Apple StoreからTrackpadを買っちゃいそうな自分がいます。



2010年9月14日

コンビニに負けないようにチキンライスを作った

先先週末のこと、お昼にコンビニのオムライスを買って公園で食べさせました。コンビニと言ってもローカルのコンビニで、裏に厨房があってそこで料理を作っています。ひょっとしてコンビニじゃないのかな?まあ、そのようなところでオムライスを買って食べさせました。子供が一口食べると、「うわっ!おいしい」と言います。 ちょっともらって食べると、そこそこおいしいのですが、コンビニごときに負けているようで悔しいです。子供には、コンビニの味覚より、我が家の味(そんなものがあるかは疑問ですが・・・)を覚えさせないといけない!と義憤に駆られて先週末に、チキンライスを作りました。えーと、冷蔵庫の中のもので作ったのですが、オムライスを人数分作ろうとすると、冷蔵庫の中の卵の大部分を消費してしまうので、チキンライスだけです。

とりあえず、ご飯を堅めに炊いて、タマネギと肉とウィンナーソーセージやらを炒めて、ご飯を入れて秘伝の調味料で味付けして、トマトケチャップいれて炒めて・・・。と、普通のチキンライスを作ります。で、「どうだ!」って出すと、「熱いけどおいしい。」「でも、ウィンナーソーセージいらない」って。子供はウィンナーソーセージが好きだと思って入れたのに、自分で全部食べました。オムライスの卵は、卵をふわっ、ってすることに神経を集中しますが、チキンライスだけだと楽でいいです。

まあ、よかった、よかった。きっと、コンビニには勝ったに違いないです。



2010年9月10日

いつの間にか新卒採用をしようとしていた

僕は新卒の採用には積極的ではないのですが、それは、プログラマにとっては新卒とか中途とかの区分けはそれほど重要じゃないと思っているからです。いい人がいるからとったら、たまたま新卒だったと言うだけです。今月号のSoftware Designでインタビューを受けているうさみみも、ぶらぶらしていて面白そうだからとったら、たまたま大学を卒業したばかりだったと言うだけです。

そうは言っても世の中、就職難らしいです。大学生の3割とか4割も就職できない人がいるらしいです。まわりに困っている人はいないので、どれほど大変なのかはわかりません。一部では起業しろとか、海外に行けとか言う意見もあるようですが、それは極端に走りすぎです。そんな状況と関係あるのかないのか、さっぱり分かりませんが、アリエルでも正式に新卒の募集を始めたらしいです。しかも、12年度の話じゃなくって11年度、今度の4月に向けてです。遅いですね。ただ、時間が短いのでアリエルのホームページ上でしか応募していません。リクルートのサイトとにらめっこしても出てこないと思います。

募集ページにいろいろ書いていますが、まあ、一通りの職種は募集しているみたいです。開発も募集しています。でも、開発だけはすでにプログラマの人しかとるつもりはないので、プログラマじゃない人はごめんなさい。あんまり書くと、「そんなこと言わないでください!」と怒られるので、このぐらいで。

それと、夏休みにやってきた飯田さんも紹介されています。まあ、就職まではちょっと、と言う人も、学生の間、バイトでくるのもいいかも。ちなみに、年内に六本木に引っ越すので、五反田で見かけなくなっても夜逃げではないので安心してください。

 



2010年9月7日

遅刻はよくない。でも・・・

ちょっと前に知り合いが会社の人が遅刻してくるのをブログで嘆いていました。ちなみに、知り合いは、同じ会社の人じゃないよ。本人は、立場的にも深刻なんだろうけど、他人事としては笑ってしまいました。まあ、どこも同じだな〜、と。で、多分、ロータスはさらにひどかった・・・。それに比べたら、今の人たちはまじめです。偉いです。

と、まあ、悪いところと比較しても意味がないですが・・・。さらに悪いところ(もうない会社なので、悪かったところ)を知っていると、その辺の感覚におおらかになるものです。でも、やっぱり、ルールはルールなので、守らないといけません。単純に人数が増えてくると、あるところでリミッターをつけないと組織が機能しなくなるのも事実です。それが遅刻しないことを厳守することかも知れないし、別の方法かも知れません。どの方法がベストかは企業の文化などによるので何とも言えません。で、それとは別に、周りに影響することもあります。それは、そのせいでミーティングができなかったり、心理的な影響です。心理的な影響は受ける方が悪いと言う人もいますが、人間はロボットではないので、影響を受けて当たり前だと思うし、何らかの形で企業の空気を変えていくものです。

と、年寄り臭いことを思う反面、僕が社会人になって、最初に遅刻したのは、入社して一週間もたっていない頃だったと思います。僕の同期で、入社式に遅刻してくる人もいたような・・・。まあ、僕は常習犯ではない(ではなかった)ですが、 やっぱり偉そうなことは言えないな〜。なので、心の中で葛藤しますが、やっぱりダメなものはダメです。 

ちなみに、僕は今は心を入れ替えたのか、年のせいなのか、他の人よりは早めに出社しています。 



2010年9月3日

コンソールだらけの驚愕の事実

9月になったことだし、会社に新しい人が入ってきました。入って最初にすることは、開発環境の構築です。もともとの開発環境の大本を作ったのは僕ですが、その後、誰かに引き継いだ後、どうなったのか見てきませんでした。僕が作ったときは、Eclipseからすべてを行う手順になっていました。

新しい人が困ったように作業しているのを後ろから眺めていると、黒いDOS窓が見えます。何をやっているのか不思議です。新しい人の隣に座っている人にちょっと作業をお願いして、作業が終わるの待っている間に新しい人が何をしているのか見ていました。

「でぃぷろいって言うのがエラーが出てできないんですぅ」と。「どれどれ見せてみ」 と見てみると、TomcatがProgram Files以下にあって、パーミッションではじかれています。まあ、誰でも書き込めるように設定して終わりなんですが、製品のビルドとかディプロイをコマンドラインからやっています。ビックリです。今でも僕はEclipse上からすべて作業しています。まあ、僕の場合は、インストーラでtomcatをインストールしないし、Program Filesの下にはいれないし、そもそも、tomcatが5匹ぐらいいるし・・・。まあそれは置いておいても、コマンドで操作しているのは驚きです。

数年ぶりにドキュメントをみると、おー、コマンドラインからビルドしろって書いてある(僕が書いたんじゃないよ)。しかも、DOS窓は管理者権限で起動しろだと・・・。 あり得ない・・・。Eclipseからビルドすれば、エラーがあればすぐに修正できるし、そのままデバッグもできるし。

まわりを見回してみると、みんなコマンドラインからビルドしているらしい。変態の集団だ。まあ、時々Eclipseが遅くなったりするので、それを回避してさっさと開発できるようにするためらしいですが・・・。 



2010年9月1日

gdataでGoogle Calendarにイベントの登録

登録は後で書こうと思っていて、プログラムができてしまうといつしか忘れるものです。なので、ちょっとだけメモ。コードはめんどいので実際の僕の書いたコードをそのまま。

1. 登録

container = "/calendar/feeds/%s/private/full" % cal_id
GDATA_DATETIME_FORMAT = "%Y-%m-%dT%H:%M:%S.000Z"

new_evt = gdata.calendar.CalendarEventEntry()
new_evt.title = atom.Title(text=cal["summary"])
new_evt.content = atom.Content(text=cal["description"])
new_evt.where.append(gdata.calendar.Where(value_string=cal["location"]))
new_evt.uid = gdata.calendar.UID(value=cal["uid"])

dts = cal["dtstart"]
dte = cal["dtend"]
# TimeZoneをごにょごにょしてdtstartとdtendをGMTでセット
    
start_time = dtstart.strftime(GDATA_DATETIME_FORMAT)
end_time =  dtend.strftime(GDATA_DATETIME_FORMAT)
new_evt.when.append(
    gdata.calendar.When(
        start_time = start_time,
        end_time = end_time))
evt = self.client.InsertEvent(new_evt, container)



containerのcal_idでどのカレンダーにイベントを登録するか指定できます。defaultにしとけば、デフォルトのカレンダーに登録されます。あとは、うーん、あんまり面白くないです。

startとendのフォーマット指定がよくわかりません。なにも考えないとGMTになります。フォーマットの000Zのところをいじくれば、ローカルタイムになってくれそうな気もしますが、自前でGMTに変換する方が楽だったのでGMTで指定しています。

で、uidですが、ドキュメントには、

Indicates the globally unique identifier (UID) of the event as defined in Section 4.8.4.7 of RFC 2445.

Must be a globally unique string and must follow specifications in Section 4.8.4.7 of RFC 2445.

とあります。多分、外部のツールが識別用に与えてもいいものだと信じて使っています。

2. 更新

InsertEventがUpdateEvent(event.GetEditLink().href, event)になるだけです。eventは検索したりして取得したイベントのオブジェクトです。それだけです。


あとは、処理をするときに緑色のスレッドを複数動かして並立すれば、とりあえずの目標は達成だな。次はexchangeだ。

ServerMan@VPSのメモリが増えた!

僕がこっそり使っているServerMan@VPSのメモリが増えました。だましだまし使っても、256Mのメモリは割とつらいものがありました。何もチューニングしないで使うと、256Mをわずかにはみ出ることがあったので、うれしいです。

でも、常に512M使える訳じゃなくって、利用状況によって使えるメモリ量がかわるみたいです。ちょっと不思議。増える分にはいいですが、減る時って使っていたメモリはどこに行くのかな?単にディスクに追いやられるだけのような気もしますが。

それ以外にも少し変更になっていますが、メモリ以外は僕にとってはどうでもいい機能です。