ページ

2011年12月27日

今年一年間とか


年の瀬なので、今年一年間を3分で振り返ります。今年は何かいろいろ会ったような気がします。

一月は平凡な年の幕開けだったのか、その後いろいろありすぎたせいか、あまり印象にありません。2月は健康診断がありました。これが、今年前半のいろいろの始まりでした。膵臓に腫瘍があるって言われて病院に行くと腫瘍があるのは膵臓じゃないよ〜、と。で、しばらくして検査入院するんですが、それが3月の震災の翌週でした。通勤が大変だ! 計画停電だ! って騒いでいるときに、病院でのんびりしていました。4月を飛ばして5月に手術しました。それは、ブログにおもしろげに書いたので、手術が終わっても笑ったと言われても、誰も心配してくれないという、喜劇のような現実を目の当たりにしました。手術すると健康について考えるようになるって聞いた気がしますが、それは僕には当てはまらなかったようです。6月は、震災の経済的な影響は大きかった、と。

さて、後半です。後半は、前半ほどは何もありませんでした。夏は、今年は、初めて子供を近所のプールに連れて行きました。今まではお金がかからないので海に連れて行っていましたが、今年はプールです。何故って? 放射線を気にしたわけじゃないです。砂が熱かったからです。秋から冬にかけて朝組のせいでだんだん朝が早くなりました。でも、クリスマスでもとの生活に戻ってしまった僕は、来年も早起きできるか心配です。 

それでは、来年は? なるようになるんでないかな?





2011年12月24日

猛獣がやってきた

猛獣を飼うことになりました。

IMG_0041.jpg 

生後二ヶ月になるベンガルネコです。ヒョウのような模様が特徴のネコです。先祖はヤマネコです。そのため、優れた運動性能らしいです。2m近くジャンプするネコもいるらしいです。今日、やって来ました。まだ、新しい環境に慣れていないようで、マガジンラックと壁の5cmぐらいの隙間に隠れています。

こやつ、どれぐらい猛獣かというと、肩の上にのって主人の口を食べようとします。それだけじゃなく、主人のにおいをかいで、いつ食べようか考えているようでした。恐ろしや。

僕の子供の頃もいろいろ動物を飼っていたので、子供の教育上いいんじゃないか?と言う名目ですが、単純に僕が飼いたかったらですね。 

プログラマが飼うネコは、ガジェットに興味があるのかもしれません。iPhoneをしげしげと見て、「これ、食える?」って感じでにおいをかいでいました。そして、タッチして操作しようとします。そのうち、勝手にiMacを操作しそうで、怖いです。僕の代わりにコードを書いてくれるかもしれませんね。

 

でわでわ 



2011年12月23日

これがバーガーキングのピザサイズバーガーだった

会社の同僚たちがランチをどこで食べようか?っていう話題で盛りあがっていました。まあ、僕が発端だったのかもしれません。それで、最初は巨大餃子を食べに行こうと言うことになったのですが、残念ながら巨大餃子は夜のメニューでランチではやっていません。巨大料理にとりつかれてしまった男たちは、次の白羽の矢がたったのがバーガーキングのピザサイズバーガーです。ピザサイズバーガーは期間限定のメニューでたぶん、明日か明後日ぐらいまでです。

まずは、男4人が六本木のバーガーキングに突撃です。時間は午後一時にオフィスを旅立ち、店舗に向かいます。店舗によって数両限定なので、最悪売れ切れすらあり得ます。男たちは冷静を装いつつ、心臓の鼓動は速くなっていました。 

店舗につくと、いわががさんがきれいなおねーさん店員に「ピザサイズバーガー一つ」と男らしく注文します。 店員の選択からもう、抜け目がありません。自然と期待が膨らみます。今日はピザサイズバーガーを食べるために男たちは集まりました。サイドメニューなんかでバーガーを楽しみがそがれるのは得策ではありません。おのおのドリンクを注文して、バーガーができあがるのを席で待ちます。

IMG_0035.jpg 5分ほどでバーガーが運ばれてきました。ピザサイズだけあって、ピザを連想する入れ物に入って出てきました。この演出に男たちの期待は最高に高まります。期待にさらに胸を膨らませながら、開封の儀を行います。

IMG_0037.jpgそして、その全貌があらわになります。 比較のために置いてあるドリンクはLサイズです。ドリンクがとても小さく見えます。

バーガーはすでに4等分された状態で入っています。肉は・・・。巨大な一枚の肉の塊を期待していたのですが、普通サイズのハンバーグが4つのっているだけでした。これは少し残念感が漂います。しかし、巨大なハンバーグを作る機械がないのでしょう。これは仕方ないですね。

写真撮影会も終わって試食です。男たちはおのおのバーガーをもって食べ始めます。はっきり言って、食べにくいです。さらに、お皿がないのでひたすら食べ続けるしかありません。袋もないので、油断するとレタスなどが下に落ちます。一心不乱に食べ続けます。その時間、およそ3分。食べ尽くしました。黙々と食べ尽くしました。食べている間、誰もしゃべろうとはしません。それは男たちの戦いが熾烈を極めたことを意味します。一気に食べ尽くすと、一瞬の達成感の後に、むなしさが漂います。短期決戦だったためによりむなしさがつのります。

このむなしさを解決するには、もう、あれしかありません。むなしさを残しつつ店を経ちます。しかし、オフィスにもどる男たちには、出陣のときになかったものが手にされています。男たちは、オフィスでの第2戦のために、さらなるピザサイズバーガーを手にしていたのです。

もしも店員さんがTwitterをやっていて、この光景をtweetしていたら

「ピザサイズバーガー キタ━━━」

「店の中でぼろぼろこぼしながら黙々と食っているよ」 

「帰りにもう一個ピザサイズバーバー買って帰ったよ、プッ」

って感じになるはず。

 

さあ、明日は休みだし、早く食べに行ってください

 

でわでわ 

 

 

 



2011年12月22日

おこづかい制にしてみた

無駄遣いは全然していないんですが、一月にどれくらいお金を使っているかちゃんとは把握していなかったので、数ヶ月前からおこづかい制にしてみました。と言っても、嫁から「おこづかいよ」って貰うわけじゃなく、給料日に、自分でおこづかいと決めた額をおろして、次の給料日まではATMに近づかない、って言うだけです。朝組で訓練されているので、自律の精神のもと、他のヒト(嫁)に強制されなくても守ることができます。

このページによると、 30代、40代の人たちのお小遣いは4万円台です。思ったより沢山貰っています。漠然と流れ去るニュースを眺めていると3万円ぐらいだと思っていたので、それよりは多いです。他の会社に移った昔の同僚はかなりおこづかいが少なかったようですが、本当の実体は分かりません。

とりあえず、僕が勝手に想像するサラリーマンの平均おこづかいは、35000円なので、とりあえず、それにしています。それで困ることもないし、むしろ少し余るので、もともとほとんど現金を使わなかったのかもしれません。

クレジットカードのことは聞かないでください。 



2011年12月21日

とある開発の風景

これは、アドベントカレンダーとは一切関係ありません。では、アリエルじゃどんな風に開発しているのか、ってお話です。開発と言ってもプログラマに限ったお話です。めんどいのでプログラマによる機能の追加とバグの修正を開発って書きます。

開発は基本的にすべてチケットを通して行います。チケットの粒度は様々です。大きな粒度のチケットはプログラマの判断で細分化されて行きます。大元になるチケットは、プロジェクトの開始の時に偉いヒトによって各プログラマに割り振られます。開発者によってある程度の持ち場が決まっているので、割り振られるときはその持ち場と今後の進んでいって欲しい方向とスキルによって分けられます。偉いヒトがざっとした工数見積もりも済ませているので、プロジェクトの工数があふれない程度の量です。

バグ修正的なチケットは、バグを直せばいいだけです。大きな機能追加は全く違った開発プロセスを歩むので、ここでは書きません。適切な粒度の機能追加的なチケットは、大まかな方向性は決まっていますが、詳細は決まっていません。基本は担当開発者がまず、外部仕様策定から始めます。仕様は、チケットをあげたヒトやプロジェクトマネージャ、プロダクトマネージャと相談しながら決まっていきます。プロダクトマネージャがこうしたいと思っても、表向きは担当開発者が決める形になっています。ただ、あまりにも紛糾していて物事が進まないときは、偉いヒトの強権が発動されます。

機能の合意が取れると開発が始まります。プロジェクトの開始の時に、大体の締め切りを決めてそれにむけて開発を行います。2点見積もり(だっけ?)にした方がいいと僕は思うのですが、プロジェクトマネージャがうんといわないので、その締め切りに間に合うように開発します。

開発中の質疑応答などはほぼチケットを通して行われるので、ログとして機能します。実装が終わると単体テストを開発者が行って問題ないと、コードレビューが行われます。これは、大体横にいる人にやって貰います。コードレビューを通さずにコミットするヒトもいますが・・・。レビューが通ればコミットします。

コミットするとJenkinsさんとか自動テストととか、いろいろチェックされます。問題があるとチケットは差し戻されます。それ以外にも、大量のコミットをピンポイントで眺めている変人がいて、変なモノをコミットするとチケットが差し戻されたり、勝手に修正されたりします。怖いですね。 

それからドキュメントがチケットに書かれます。 レビューや実装前にドキュメントを書くヒトもいますが、それは人それぞれです。書かないといけない内容は、リリースノートに書く機能の説明とそれに付随する情報、テスターさんがテストするための情報とさらに詳細にテストした方がいいところ、実装方法のまとめとか、バグであればその原因とか。

そして、チケットが閉じられるとテスターさんが再度いろいろテストします。開発者とテスターさんの境界線上のことはいいたいこともありますが、それは別の機会に。テスターさんがテストを行って問題があると差し戻されてまた、修正します。テストがクリアすると、ドキュメントに不備がないかチェックされ、それが終わると本当の終了となります。ふー。

至って普通でおもしろみがないですね。 

 



2011年12月16日

アリエルの朝の変遷

こんにちは、アリエル1の女性好きの大谷です。ウソです。僕は至って普通の紳士です。キリッ。しかも、女子供が飲むようなお酒しか飲まない軟弱モノです。そんな僕でもアリエルにいることを許してください。ごめんなさい。ごめんなさい。

と言うことでsodexからAriel Advent Calendarのバトンが回ってきました。これはそのエントリです。おそらくこれが、僕の最後のAdvent Calendarになると思います。Python3のエントリpypyのエントリをすでに書いています。Python3の方がよく読まれているらしいです。pypyの方は手を抜きすぎたせいかもしれません。いや、しょーまたんのpypyのプレゼンを聞いていて、rpythonでフィボナッチ数列の計算をやれば、楽にエントリが書けると思っていたら渋川さんに先を越されたので、ネタが・・・。

さて、 本題です。今は朝組の組長がアリエルの朝を支配していますが、アリエルの朝ってどんな感じだったのでしょうか?勤務時間とかお話を交えて振り返ってみましょう。

時はさかのぼること十年ほど前、2000年にアリエルができました。僕が働き始めたのは7月からです。僕が外人らしきヒトと道ばたで「It's your fault」とか言い合ってから一ヶ月後のことです。あの頃は若かった。 入ったときはオフィスはないので、勤務時間はありません。子供を保育園に追いやってから夜に迎えに行くまでが働いていた時間です。それから、いろいろやって夜の9時か10時ぐらいから仕事の第2部がはじまります。CTOにはあのころは朝はなかったと思います。 

それからオフィスができます。最初はまだ勤務時間がなかったと思います。オフィスができてもすぐには通勤しなかったような気が・・・。派遣のヒトとか、新しい人が入ってきて仕方なく会社に行くようになりました。そして、新しい人が入ってくると勤務時間もちゃんとしなくてはいけないので、何も考えずにロータスのコアタイムをそのまま使って11時開始になりました。でも、この頃はコアタイムはありますが、遅刻してもペナルティはありません。めんどいので誰もチェック付けていません。多分、有給休暇も正確に何日休んだかなんて記録をとっていなかったかもしれません。まだ、牧歌的な時代のお話です。そのころはみんな11時間際にやってきていました。10時頃はオフィスは真っ暗です。

さて、そんな時代も長くは続きません。CTOが大量のお金を浪費しつつ、製品は売れません。売れないといろいろなところにしわ寄せが行きます。売れない原因はいろいろ考えらますが、一部の人たちの間では開発の勤務態勢とか、だらしなさが売れない原因だとささやかれたりします。まあ、言いがかりもいいところですね。そんな感じでコアタイムが1時間早くなって10時からになりました。でも、そんなの納得できる理由じゃないですね。なので、みんな守らなかった・・・、じゃなく、11時になれた体は10時には適応できなかったのです。それで、僕は10時30分ぐらいに来ていました。この頃も大きな罰則はないです。なので、誰も守らない10時からのコアタイムはなし崩し的に11時に戻りました。大衆の勝利の瞬間です。このころもまだ、牧歌的な名残があります。

それから、買収とか2006年ぐらいから会社の成長とかがあります。買収はどうでもいいのですが、会社が大きくなり始めると牧歌的な運営では会社の秩序が崩壊します。最初のメンバーのように一日十数時間働くのが当たり前の人たちばかりじゃなくなります。そういうこともあって、今までのいい加減な体質じゃダメだと言うことで、11時に少しでも遅れてたら遅刻としてカウントするようになりました。でも、このころには僕は10時ぐらいに会社に来るようになっていました。

そして、2011年秋、アリエルの朝のインフレが起こり、朝組が誕生しました。アリエルの朝は、自律の精神のもと、7時から自発的に働き始める異端の集団の誕生です。アリエルは自律をむねとし、日夜修行に励むのです。

次は、アリエルの天才ハッカーのm2yaさんです。おそらくCTO以上の大物です。

でわでわ 



2011年12月15日

朝組の危機

アリエルには朝組という秘密結社があります。以前書きましたがアリエルの開発の朝はとっても早いのです。朝組は8時までに出社することを命題に@t2y が中心となって結成されました。@t2y 組長の7時の出社から朝組の一日は始まります。朝組の主要メンバーは現在4人です。組長はもっと勢力を拡大したいようですが、なかなか難しいようです。CTOを朝組に引きづりこもうとしていますが、生活のスタイルを変えるのは大変なようです。

さて、朝組にとって今はとてもつらい季節です。@kawanoshinobu は寒さのあまり、朝組に遅刻してきます。遅刻するたびに@t2y に謝っています。朝組は強権体制なのです。おそらく・・・。一度入ると、朝組を抜けることはできないという噂もあります。

僕も起きるのがつらいです。「あと1時間布団の中にいてもいいよ」と悪魔のささやきが毎朝聞こえます。しかし、ここで2度寝してしまうと、組長のおしかりが怖いので、がんばって起きて出社します。多分、年内は大丈夫だと思いますが、正月休み明けが心が折れそうで、怖いです。おしかりがなくても、朝組は自分で自分を律するという心構えがあります。修行の道は険しいのです。

でも、朝早くから活動し始めると一日がとても長く感じられるので、それはとてもいいです。

 

でわでわ 



2011年12月13日

pypyのスレッドとかgreenletとか何か

pypy advent calendarのエントリです。ごめんなさい。ネコを飼うのでそのことに関心が向いて、pypyのこと、すっかり忘れていました。なので、いつにも増して、とってもうすーいエントリをだらだらと書きます。pypy闇の軍団長兼会長様、許してください。

まずは、昔のフィボナッチ数列の計算するコードを持ち出します。
import time

def fibonacci(n):
    value = 0
    f1 = 1
    f2 = -1
    for i in range(n+1):
        value = f1 + f2
        f2 = f1
        f1 = value
    
    return value

if __name__ == "__main__":
    for x in range(3):
        fibonacci(3)
    time.sleep(0)
    start = time.time()
    for x in range(4000, 5000):
        fibonacci(x)
    end = time.time()
    print end - start

これを実行すると、僕のMacBook Airだと今日は大体1.11秒です。Java(Jython?)などのちゃんとしたスレッドを持ってる人たちは、ループの中をスレッドにするともっと高速になるんじゃないか?って考えます。なので、スレッドにしちゃいましょう。
import time
import threading

def fibonacci(n):
    value = 0
    f1 = 1
    f2 = -1
    for i in range(n+1):
        value = f1 + f2
        f2 = f1
        f1 = value
    
    return value

if __name__ == "__main__":
    for x in range(3):
        fibonacci(3)
    time.sleep(0)
    thread_list = []
    start = time.time()
    for x in range(4000, 5000):
        thrd = threading.Thread(target=fibonacci, args=(x,))
        thread_list.append(thrd)
        thrd.start()
    for thrd in thread_list:
        thrd.join()
    end = time.time()
    print end - start

さて、これを実行すると1.7秒ぐらいです。参考までにCPythonで実行すると2.01秒でした。さらに参考までにPython3で実行すると2.37秒でした。Python3ダメダメじゃん。
(;゜〇゜)はっ!これはPython3のエントリじゃないからこれ以上Python3のことを書いたら団長に怒られる!
さて、スレッドにした方が遅いですね。まあ、何も不思議じゃなくって、GILとかあるので、想定の範囲内です。ちなみに、1000個スレッドがあると、LinuxやMacはメモリは見かけ上8Gぐらいなります。まあ、単純な計算だけならスレッドにするより何も考えずにシーケンシャルに行った方が良いと言うことですね。もしくはプロセスのフォークで・・・。でも、途中でネットワークとかブロックするような処理があると、シーケンシャルにやると遅くなっちゃいます。

ここまでが前置きです。結論はないです。Application-level Stackless featuresにcontinuletとgreenletについて書かれています。どっちもマイクロスレッドですね。continuletのレイヤの上にgreenletと同じAPIのモジュールを実装しているようです。32bit環境ではスレッドあたり4KBのメモリ使用量だって書いています。本物のスレッドに比べると遙かに少ないです。
と言うことで、こんなコードを書いてみました。
import time
from greenlet import greenlet

def fibonacci(n):
    value = 0
    f1 = 1
    f2 = -1
    for i in range(n+1):
        value = f1 + f2
        f2 = f1
        f1 = value

    return value

if __name__ == "__main__":
    parent = greenlet()
    start = time.time()
    grs = [greenlet(fibonacci, parent) for _ in range(1000)]
    i = 4000
    for gr in grs:
        gr.switch(i)
        i += 1
    end = time.time()
    print end - start
実行すると1.2秒ぐらいです。最初のコードが1.1秒ぐらいなので0.1秒ぐらいのオーバーヘッドですね。まあ、待ちがないマイクロスレッドでスレッドの途中でコンテキストの切り替えがないので、つまんないですね。

ちょっとこれはいろいろやり過ぎているので、もっと単純なコードでやってみましょう。
import threading
import time


def test2():
    pass

start = time.time()
thrds = [threading.Thread(target=test2) for i in range(1000)]
for thrd in thrds:
    thrd.start()
for thrd in thrds:
    thrd.join()
end = time.time()

print end - start

単にスレッドを作って空の関数を実行しているだけです。これだけのコードで0.29秒です。感想としては、遅い・・・。CPython2.7だと0.14秒です。うっ、pypy負けてる。と言うかJITがうまく動かなさそうなコードなのでいいです。ちなみにPython3でも0.14秒ぐらいでした。
それではgreenletで。
from greenlet import greenlet
import time

def test1(x, y):
    for gr in grs:
        z = gr.switch(2)

def test2(u):
    #print id(greenlet.getcurrent())
    gr1.switch(42)

start = time.time()
gr1 = greenlet(test1)
grs = [greenlet(test2) for x in range(1000)]
gr1.switch(1, 2)
end = time.time()

print end - start

このヒトを実行すると0.07秒です。スレッド重いですね。

2011年12月12日

年末は今年を振り返るモノらしいけど・・・

だらだらと、いろいろ見たり調べたり横道にそれたりしていると、このブログを書き始めて5年が経過していることに気づいてしまいました。早いものです。年末は今年を振り替えったりするモノですが、5年前を振り替えって見ます。

5年前はアリエルはまだ中目黒にいました。このブログを書き始めた頃はまだ、毎月順調に CTOがまだ、資金を浪費していた 赤字を垂れ流していた時期です。それでも、書き始めた半年前、僕が潜行して行っていた調査期間とかを含めると1年前から新しいプロジェクト、と言うか現行の製品を作っていたときです。あの時はまだ、狂気の中でした。ダメだといっていたのにCTOが勝手にリリースを3ヶ月早めちゃうし・・・。

その後、紆余曲折があってその製品はとりあえず会社を黒字にしてくれたし、まあ、数億、と言うかそれ以上の売り上げがあるようになりました。まあ、不思議です。でも、成功したか?って言われると、うーん、この程度の売り上げじゃ失敗じゃなかった、って言う程度ですね。 二番目につまらないパターンかもしれません。一番つまらないパターンじゃないです。

まあ、5年前はそんな感じです。5年前の狂気が終わると、僕も30代後半になっていました。中目黒にいた最後の辺りぐらいにテストチームを作りました。作るの、大変だったんですよ。CTOは頑固者なので・・・。テストチームを作ったのはどうでもいい話ですが、その頃から僕が丸くなったって誰かが言っていました。僕は昔から優しいんですがね。アリエルではCTOが一番怖いですよ。

それからは、まあ、いろいろありましたが、本当に大変だったのは中目黒にいたころまでだったと思います。それ以降もいろいろありましたが、まあ、中目黒にいたころに比べたらそれほどでもないです。多分、多少の失敗が許されるか、許されないかの違いかもしれません。

過去は美化されるのでどこまでが本当かは不明です。でも、今でも十分楽しいですけどね。



2011年12月9日

Python3のconcurrentパッケージ

こんな経緯Python Advent Calendarに参加させられてしまいました。まずは、言い訳から。僕がPython3を触ったことがあるのは2,3年前で、それも数日だけです。それ以降全く触っていません。はい。Python3初心者です。笑いたければ笑ってください。そんな僕がPython3で何を書こうか、と言うことで、あのみんなが大好きなJavaからぱくったと名高いconcurrentパッケージについて書きます。
まず、まっとうなPythonプログラマならあのレガシーなJavaぐらい分かるよね。Javaが分かるんだったらJavaのjava.util.concurrentパッケージぐらいは知っていて、concurrentて常識だよね、と言うことで、concurrentについての説明は多分、省略です。

PythonのconcurrentパッケージはJavaのconcurrentパッケージのほんの一部です。って言うか、executer関連しかないじゃん・・・。concurrentパッケージの下にはfuturesしかいないし・・・。でも、今後増えそうな感じがして頼もしくはあります。Python3でGILがどうなっているか知りませんが、pypyやjythonなどもあるので、スレッド周りの安全性を実装系に依存しちゃうのはあまりうれしくありません。なので、スレッドの安全性は意識した方が良いと思うわけです。でも、そんな能書きはいいのでゆっくりとコードと戯れてみましょう。

まずは、concurrentを使わないコードです。もっと最初はスレッドを使わないモノが必要ですが、めんどいのでごめんなさい。
import threading
import time

def thread_func():
    ident = threading.currentThread().ident
    print("start")
    for i in range(4):
        print("waiting " + str(i))
        print("current thread: " + str(ident))
        time.sleep(0)
    print("done")

l = [threading.Thread(target = thread_func) for i in range(4)]
for thrd in l:
    thrd.start()
for thrd in l:
    thrd.join()

スレッドをぐるぐる回して、最後にjoinしてすべてのスレッドが終わるのを待っています。これを実行するとスレッドが切り替わっているのが分かります。ループ内でちょっと重い処理をして、お互いに依存関係がないときに、こんな感じのコードは便利です。

でも、今回はスレッドというかループ数が4だから良いけど、もっと多いと一瞬で破綻しちゃうかもしれません。LinuxとかMacはデフォルトのままだとスレッド一つにつきメモリを8M消費します。こんなところで大量にメモリを消費すると困っちゃいます。と言うことで、大体スレッドプールとかを実装するわけです。まあ、みんな同じことを考えます。と言うことでDRYって怒られそうです。怒られてしょぼくれているあなたにconcurrent.futuresのexecuterです。まずは、ThreadPoolExecuterです。名前からしてそれっぽいでしょ。実行して貰えれば、スレッドが最大二つ(max_worker=2)しか動かないです。そして、別のスレッドで動いているのが分かると思います。でも、workerが一つしかいないよ!って言う人は、もっと沢山submitしてあげれば大丈夫です。

import threading
import concurrent.futures
import time

def executer_func():
    ident = threading.currentThread().ident
    print("start")
    for i in range(4):
        print("waiting " + str(i))
        print("current thread: " + str(ident))
        time.sleep(0)
    print("done")
    return ident


with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executer:
    l = [executer.submit(executer_func) for i in range(4)]
    for future in l:
        print("=== result: " + str(future.result()))

ThreadPoolExecutorを使うとスレッド数を制御・プールできて使い回せます。スレッドが終了したら、未来のオブジェクト(future)から結果を取り出せます。えっ、PythonはGILがあるから本当に重い処理はコアを生かしきれないって?わがままだな。そんなにCPUを発熱させたければ、ProcessPoolExecuterです。
import threading
import os
import concurrent.futures
import time

def executer_func():
    ident = threading.currentThread().ident
    print("start")
    for i in range(4):
        print("waiting " + str(i))
        print("current thread: " + str(ident))
        time.sleep(0)
    print("done")
    return os.getpid()


with concurrent.futures.ProcessPoolExecutor(max_workers=2) as executer:
    l = [executer.submit(executer_func) for i in range(4)]
    for future in l:
        print("=== result: " + str(future.result()))
ほら、これでスレッドじゃなくプロセスとして実行されます。CPUをこき使ってください。
でもなー、まあ、待たなくてもいいので、実行した結果がだけをもうちょっと処理したいんだけど・・・、って誰かが文句をたれています。Javaだと・・・、ってすぐにJavaを引き合いに出す人がいます。大丈夫です。タスクが終わったらコールバックを呼ぶことができます。Javaだと何かとオブジェクトを作ってめんどいですが、Pythonはそんなことは在りません。
import threading
import concurrent.futures
import time

def executer_func():
    ident = threading.currentThread().ident
    print("start")
    for i in range(4):
        print("waiting " + str(i))
        print("current thread: " + str(ident))
        time.sleep(0)
    print("done")
    return ident

def done_callback(future):
    print("=== result: " + str(future.result()))

with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executer:
    for i in range(4):
        future = executer.submit(executer_func)
        future.add_done_callback(done_callback)

futureにadd_done_callbackで処理が終わったときに実行する処理を指定できます。
まあ、大体分かったけど、発行したタスクが全部がちゃんと終わってから何かをしたいって?じゃあ、waitすればいいじゃん。と言うことで、

import threading
import concurrent.futures
import time

def executer_func():
    ident = threading.currentThread().ident
    print("start")
    for i in range(4):
        print("waiting " + str(i))
        print("current thread: " + str(ident))
        time.sleep(0)
    print("done")
    return ident


with concurrent.futures.ThreadPoolExecutor(max_workers=2) as executer:
    l = [executer.submit(executer_func) for i in range(4)]
    results = concurrent.futures.wait(l)
    for result in results.done:
        print("=== result: " + str(result.result()))
concurrent.futures.waitですべてが終わるのを待ってくれます。その後、処理が終わったものを取り出して(result.done)、結果を処理するよろし。

executerのmapについても書こうかと思ったのですが、pythonの組み込み関数のmapと大体同じで面白くないのでやめました。
終わったモノから順番になるべく速く処理するときはconcurrent.futures.as_completedで取り出せます。

と言うことで、concurrentでした。本音を言えば、ループをみてJITがスレッドにできるところは勝手にスレッドにしてくれて、何もしていないのにある日突然、アプリケーションが高速化してくれるのが理想です。インテルのスレッディングビルディングブロックみたいに・・・。まあ、そこまで行かなくてもヒント(アノテーションとか)を書いておけばJITが解釈しやすくなるとかでも・・・。

次はaodag先生です。
でわでわ

2011年12月8日

Python Advent Calendar


Ariel Advent Calendarが始まって、順番が回ってきたら何を書こう?と戦々恐々としている毎日です。そんなことをよそ目に、@t2y がランチの時に英語で(僕の心象風景も含む)、

@t2y 「Hey, Ohtani-san. Please write something for Python Advent Calendar, or You'll be banished from "Asagumi".」

と脅してきます。僕が

@liris 「Oh, no! I haven't used Python 3 for a long time. I don't have antyhing to write.」

って言っても、聞き入れてもらえません。

@t2y 「This is a good opportunity to learn Python 3. You're over as a programmer if you stop studying. Huh?」

と薄ら笑いを浮かべています。 @t2y は朝組初代組長です。組長には逆らえません。渋々、参加することにしました。本当に触るのは久しぶりで、Python3のインストールから始まります。ざっと、モジュールのインデックスとか、新機能の説明とかを眺めて(眺めただけなのでかなり見落としています)、javaのconcurrentパッケージをぱくったと名高いpythonのconcurrentパッケージについて何か書くでしょう。

で、僕はいつ書くんだ?一通りサンプルコードも書いたので、後はエントリを書くだけです。

でわでわ

 

====

追記:一緒にいた@sasagon の証言によるとbanishじゃなくpunishと聞き間違えてないですか?と。まあ、どっちにしても怖いです。






2011年12月6日

Webページからファイルをデスクトップにドラッグアウトする

Gmailは、ChromeやFirefoxだと添付ファイルをデスクトップにドラッグアンドドロップで保存できます。IE? 何それ? おいしいの? なので、IEのことはよく知りません。IE8だと動いてくれませんでした。(Firefoxもウソだ。やっぱり動かなかった。)このページにその方法が書かれています。Drag and Drop APIっていうのを使うらしいです。とりあえず、サンプルコード。

<html>
  <body>
    <a href="some.png"
       draggable="true"
       ondragstart="event.dataTransfer.setData('DownloadURL',
        'image/png:some.png:http://localhost:8080/some.png');">
      file link
    </a>
  </body>
</html>

これだけです。リンクをドラッグアンドドロップえきるようにして、ondragstartイベントでdataTransferにsetDataするだけです。セットするのはmime typeとファイル名、ファイルへのリンクです。mime-typeはapplication/octet-streamでも大丈夫です。ファイルへのリンクは相対パスではダメで、絶対パスで書かないと行けないのがめんどいです。でも、これだけでデスクトップへのドラッグアンドドロップでの保存ができるので、簡単です。
でも、僕はドラッグアンドドロップではほとんど保存しないですが…

でわでわ

Ariel Advent Calendar

早いもので今年ももう12月です。12月と言えば、冬休み! ではなく、クリスマスです。クリスマスはみなさん、どのように過ごすのでしょうか?有り余る時間があるので、技術者ならハッキングして過ごすでしょjk、って誰かが言っていました。残念ながら僕は結婚しているので、そんなことはしません。

クリスマスを迎えるに当たり、はてなさんがAdvent Calendarを始めました。えっ、先を越されました。アリエルも負けてはいられません。いや、先を越されたので、負けています。いや、まだ、敗北を宣言するのは早いです。gihyoさんがAdvent Calendarをまとめたページを見てください。 会社の人が行う部門でHatenaさんより上です。ABC順だとか負け惜しみは言わせません。会社の名前を決めるとき、アルファベットでもあいうえおでも上位にくるようにわざわざ決めたのです。すべてはこの時のためです。

それでも、まだ、文句を言うんですか?Hatenaさんのページの画像とアリエルのページの画像を見比べてください。アリエルのCTOの許可も取らず、CTOをネタに遊んでいます。部下が上司をこけにするのはアリエルの文化です。アリエルでは会長ですらネタにされます。怖い会社です。

まあ、そんな感じで楽しんでください。

ちなみに、このエントリはAriel Advent Calendarとは全く関係のないエントリです。

でわでわ



2011年11月30日

MintLinux 12にバージョンアップ!

先週、Mint Linux 11をインストールしたばかりですが、その翌日にMint Linux 12がリリースされ、とほほ感が強いです。まあ、でちゃったものは仕方ないし、待ちきれない僕も悪いし、複雑な心境のお年頃です。

さて、とりあえず、バージョンアップ!と言うことで、何を間違えたかクリーンなインストールになってしまいました。まあ、emacsしかセットアップしていなかったので、なんでもいいです。

さて、12にすると、Gnome 3のunityと並んで悲しみのUIになっています。一気にMint Linuxの評価が下がります。11のまま、とどめておけば良かったと。まあ、それでも、素のUbuntuよりは幾分ましなんですけど。いや、かなりまし?

と、後悔にうちひしがれていると、Mint LinuxにはMateなるものが存在するというお達しが・・・。スクリーンショットを見る限りだと、いい感じに見えます。余分なものもなく、起動したいモノもすぐに見つけられます。必要としていたカスタマイズ項目もそろっています。まあ、高度なことをしたいわけでも無いので、デスクトップはGnome2相当のままでいいのかもしません。あっ、Mateのインストールはsudo apt-get install mint-meta-mateで。日本語の入力はibusでmozcで動いています。メニューとかその辺は、英語のまま使っています。フォントはRicty入れています。

Gnome3とかUnityは慣れの問題とまだ、こなれていないっていう問題があるんだと思います。慣れはまあ仕方ないんですが、それに加えてこなれてない感があまりにもひどかったので、みんな嫌っているんじゃなかろうか?あと、一年とか長い目で見ないとダメだと思う。それまでは、Gnome3もUnityも使わない。

そんな感じ。でわでわ。



2011年11月28日

Python mini Hack-a-thon 13なるものに連行される

土曜日はPython mini Hack-a-thonなるものに連行されました。紆余曲折あった末、アリエルが会場を提供することになってしまいました。以前はDartsのなんかで会場を提供したりしているので、Pythonに限らず会場を提供するのは大丈夫です。でも、家族がいたりすると土曜日に会社にくるのはいろいろとつらかったりします。家族がいるのに土曜日のイベントに来る人はすごいと思います。

で、会場を提供したと言うこともあって、Hack-a-thonに参加しました。そういえば、募集ページの参加ボタンを押していなかったのですが、押さずに参加しても良かったのでしょうか?今となっては、もう遅いです。他の人たちはなんだか、黙々と作業しています。 僕は午前中というか、お昼前にちょっとブログを書いて、あとはうだうだ、ぐだぐだしていました。参加ボタンを押していないので、黙々と作業しなくてもいいのです。きっと。

で、午後はみんな静かに作業しています。 今回はシアトルからたまたま日本に来ていた人が参加しました。日本語、上手です。で、この人はお喋りをしに来たらしいです。えーと、それっぽく言うと情報交換って言うやつです。で、他の人は黙々と作業しているので、しゃべりたくてうずうずしているようです。なので、午後はしばらくその人とお喋りしていました。

彼のお仕事のお話をいろいろ聞きました。SQL Serverは「すきゅーるさーば」って発音するらしいです。うーん、これからは僕もそう呼びます。「えすきゅーえる」なんて呼びません。そういえば、QTを「きゅーと」って発音しているひとがいました。僕は2000年の手前頃からずっと「きゅーてぃー」って呼んでいました。これからは、今時の呼び方をするように気をつけます。

発音の話はどうでもいいのですが、その人は中央のサーバから"箱"の中へファイルを配信するシステムを作っています。あまり大規模なものじゃないらしいです。箱は、マンションとかそういうところにあるらしいです。で、変なところとしては、船にその箱があるそうです。船とかあるあたりがアメリカっぽいですね。船の場合は無線でデータが転送されます。でも、無線でもデータが遅れないケースがあるそうです。その場合は、データパケット転送の物理レイヤは人になります。適当なメディアにデータをコピーして、人が船まで運ぶそうです。残念ながらpigeonじゃないよー、って言っていました。いや、人がpigeonだって言っていたかな。 

 

まあ、そんなこんなで楽しかったです。でわでわ 

 



2011年11月26日

Solr始めました その2

前回からの続きになります。今回はexampleディレクトリのsolr/conf/schema.xmlを見ていきます。schema.xmlについてのマニュアルはこれ

schema.xmlは名前の通りインデックスファイルのスキーマを定義しています。これは、schema要素の直下にtypes要素とfields要素があります。types要素は、フィールドが取りうる型fieldTypeで定義します。一番最初の要素を見るのが分かりやすいと思います。
<fieldtype class="solr.StrField" name="string" omitnorms="true" sortmissinglast="true">

ここでは、stringと言う型を定義しています。それに対応するclassがsolr.StrFieldになっています。classの値はjavaのクラスファイルです。solrはsolrのパッケージへのエイリアスです。

各型の定義でインデクシングに使用するアナライザを"analyzer"で指定します。analyzerの中では大文字を小文字に正規化したり、シノニムに対応したりもできるようです。Luceneを見れば分かりますが、日本語を処理するanalyzerはいくつかありますが、CJKAnalyzerを使いたい場合は、次のように書きます。こういう風に書けば日本語で検索できるようになるってことですね。

<fieldType name="text_cjk" class="solr.TextField">
  <analyzer type="index">
    <tokenizer class="solr.CJKTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
    <tokenizer class="solr.CJKTokenizerFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>


次にfieldsでschemaが取り得るフィールドを定義していきます。こっちは、fieldの名前とfieldTypeで定義した型を指定します。それ以外にインデクシングの対象にするためにindex=trueを指定します。

Luceneで高速にハイライトするFastVectorHightlighterを使いたい場合は、termVectors="true" termPositions="true" termOffsets="trueを指定します。これを指定しないと以前のHighlighterが使われちゃいます。こんな感じになります。

<field name="content" type="text_cjk" indexed="true" stored="true"
 termVectors="true" termPositions="true" termOffsets="true" />

こんな風に書いておけば、fieldを指定できます。

僕は使っていないのですが、dynamicFieldと言うモノがあります。名前を*_textの用に書いておけば、フィールド名が_textで終わるフィールドは特定の型に対応づけることができます。fieldだけだと堅いスキーマになりますが、簡単なパターンマッチで動的にフィールドが定義できます。

dynamicFieldを使えば、実行時にフィールドが増えていきますが、管理が煩雑になります。全文検索でなんでもいいから引っかけたいよ、と言う場合は、copyFieldが便利です。特定のフィールドは、指定したフィールド、たとえばcontentフィールドに値をコピーすることができます。*を指定すれば、未知のフィールドの値をとりあず、特定のフィールドにコピーして検索の対象にできます。こっちはちょっと便利かもしれません

次回はsolrconfig.xmlと言うことで。

でわでわ

pypy1.7は本当に速いのか?もう一度試してみた

pypy1.7がリリースされました。かなり速くなったって噂があります。と言うことで、もう一度試してみました。今回も前回と同じフィボナッチ数列の計算の計算によるベンチマークです。前回の結果はこれです。前回はiMacで計測していますが、今回はMacBook Airです。なので、絶対値の比較は無いです。

ベンチマークで使ったコードは下のモノです。


まずは、再帰での計算結果です。
pypy1.5では再帰の場合、CPythonより遅い結果に鳴っていましたが、1.7では性能が改善されて速くなっています。
CPythonよりpypy1.7の方が速いのはいいのですが、java1.6より2倍ぐらい速いです。Javaより速いケースがあるって言うのは驚きです。JavaはJITが動いていたのかな?



次が再帰じゃなくってループでの場合です。
こちらは予想通りの結果になっています。CPythonよりpypyの方が速いし、javaは期待通りに速いです。


まとめると、pypy1.7は噂通り速くなっています。場合によってはJavaより速いです。

でわでわ

MintLinux始めて見た

Ubuntu11.10になってからいろいろ不満がたまって、会社のUbuntuはXubuntuもどきに化けてしまいました。まあ、Xfce自体は悪くありません。でも、「今時のLinux使いたちはみんあMintLinux使っているんだぜ。Ubuntu? ぷっ」って言う声が聞こえてきました。

そんな声が聞こえてきても、「MintLinuxもUbuntuベースだから、Ubuntuの親戚でしょ」と思っても声に出して言うことはできません。すると、僕の心の声を第六感で聞き取ったのか、「Ubuntuのデスクトップの不満を独自のカスタマイズで取り除いたんだ。開発者なら絶対に不満はないよ。ベイビー。」って。ベイビーって何時の時代の人よ?

20111125.png

会社のデスクトップはあまり弄りたくはないので、MacBook Airの中のVMWareの中に入れてみます。タイトルバーの辺りが少しメリハリがないような気がしますが、それ以外は良さげです。でも、家のiMacとかだと画面がでかいのでパネルなどはそのまま表示させていますが、MacBook Airは画面が小さいのでパネルはauto hideにしています。うーん、何だか、デスクトップ環境はなんでもいいような気がしてきました。でも、やっぱり以前できていたカスタマイズが普通にできることが大事なんです。

まあUbuntuのunityも画面がある程度の大きさなら悪くはないと思うよ。それ以上になってくると、不満が噴出するんだと思う。

 

でわでわ



2011年11月22日

これが、ゆるふわ系ありえる社内勉強会だ


アリエルでは、社外向けの「ありえるえりあ勉強会」の他にも、社内勉強会が定期的に開催されています。社内勉強会は今までずっと、閉ざされていました。社内勉強会はゆるふわ系なのですが、どんなことをやっているのか社外に見せてもいいかな〜、とか、単に面白そうでやってみたくなったとか、そんな理由で、前々回からustreamでの配信を始めてみました。

平日の昼間からやっているので、さすがにリアルタイムでの視聴は少ないです。まあ、ちゃんとアナウンスできていなかったりとか、準備不足も否めません。でも、そこはゆるふわ系の社内勉強会と言うことで・・・。

 前々回は「闇の軍団員によるおっ!?、pypy」です。発表内容などはここから辿れます。この会は、Ustream、録画されていないですね。ごめんなさい。pypyのブートストラップの辺りとか、とても面白いです。あれ? 勝手に脳内補完されているかも。

前回は、「通称エキパイ翻訳者によるSphinx」です。発表内容は、これ。そして、今回はUstream、ちゃんと録画できました。証拠はこれです。

本当はもっとゆるふわ系だったのですが、かなり気合いが入っていますね。そして、次回は「いわががのlombok」です。「What's lombok? You should ask me after reading this.」 って発表予定者のいわががさんが言っていました。次回は今度の金曜日(25日)、15時からね。日本語で話すように依頼していますが、英語でも我慢して聞いてください。

 

でわでわ 




2011年11月17日

あれからWiMAXはどうなったか?

今までは7.2Mのイーモバを使っていました。でも、人口密度が高い都会だとスピードがとっても遅くてイライラします。嘘です。イライラはしません。そこそこ遅くなっちゃうのは事実なので、同じ値段を出すなら速いほうがいいと言うことで、WiMAXに乗り換えました。それから、実家のど田舎も年内にはWiMAXがくるらしいと言うこともあってね。BicCameraで契約したので、丸っこいルータのやつです。

まず、行き帰りの東海道線の電車でやっぱりHuluでどうなの?って言うことでiPhoneでHuluを見続けます。 以前にも書きましたが、HuluのiPhoneアプリはかなりバッファリングします。なので、実際はスピードが遅くなっている地点とか、接続がこっそり切れていても短い時間であれば分かりません。

と言うことで、東京方面から田舎に向かって東海道線の旅です。とりあえず、今回も東京駅からスタートです。東京駅の東海道線の電車の中はちょっと電波は弱いです。きっと新幹線に電波を吸い取られているのでしょう。と言っても電波は弱いだけでつながります。このあたりはソフトバンクとかイーモバとは違います。電車が走り出しても、映像は途切れることはありません。新橋をでて品川の間で少しの時間、映像が途切れてバッファリングをがんばっていました。わりかし短い時間なのでそれほどストレスになりません。ソフトバンクやイーモバとの格の違いを見せつけます。

横浜まで、一瞬途切れることもありましたが、大体不満はありません。以前試したときはかなり長い区間電波がつかめなかったりしていましたが、もう、大丈夫そうです。横浜をでてからトンネルのあたりは電波が弱かったりきていなかったりします。ここはもう、どうしようもないですね。そこから先も一瞬切れることはありますが、大体すぐに復活してくれます。東海道線に限って言えば、スピードもエリアと言うか、つながりやすさもソフトバンクやイーモバよりもいいです。イーモバも42Mのやつであればまた変わってくるのかもしれません。でも、パケットの転送量も気にしなくていいのでWiMAXの方がいいかも。 

それから、ルータですが、大容量バッテリーだと7時間持つそうです。それともう一個3時間のバッテリもあります。7時間持つととってもすごく持つんだろうと思って、会社で忘れて電源をonのまま放置していると帰る頃には電池がなくなっています。15時間ぐらい電池が持たないと、いい加減な人は使いたいときに使えなくなる危険があります。

 

でわでわ 



Solr始めました その1

最近、Solrで遊んでいます。Solrと言うのは、Luceneをベースに全文検索機能や分散処理、フェイルオーバーとなどの機能を提供してくれるはずです。Luceneで検索システムを作り込んでいくと、ある規模に達するとSolrが提供してくれているような機能が必要になってきます。それらを自分たちで作り込んでもいいのですが、それは単にSolrの再発明に他なりません。と言うことで、Solrの検討に入りました。

何はともあれ、第一印象としては、「わかんね〜」。Solrのトップページはそれなりすごいことを書いていますが、体系立てたドキュメントがありません。すべてを網羅されているようにも見えません。日本語のドキュメントがないのは別にどうでもいいのですが、英語のドキュメントも少ないです。僕はApacheのプロジェクトはドキュメントがしっかりしているっていう印象も持っていたので、残念です。さらにLuceneでは、自分に必要そうなドキュメントはすぐに見つけられましたが、Luceneの子供のSolrはまだ、ちゃんとしていません。成長期だから仕方ないのです。

さて、わかんないもはわかんないなりに少しづつ始めます。とりあえず、チュートリアルです。これを参考に触ってみましょう。

公式サイトからSolrのパッケージをダウンロードします。パッケージの直下は
CHANGES.txt  NOTICE.txt  client   dist  example
LICENSE.txt  README.txt  contrib  docs
となっています。とりあえず、今回はexampleのディレクトリで作業します。これは、exampleというよりskeltonのような気がします。とりあえず、java -jar start.jarでsolrを起動します。チュートリアル通りexampledocsのディレクトリに行ってjava -jar post.jar *.xmlでサンプルのドキュメントを登録します。xmlやjsonなど、いろいろな形式でサーバとお喋りするようです。

次に http://localhost:8983/solr/admin/ をブラウザで開きます。検索画面が表示されます。統計情報へのリンクや、schemaやconfigへのリンクがあります。schemaやconfigはXMLが表示されるだけです。

schemaの中を見ていると、大きく分けてフィールドのタイプ定義とフィールドの定義があります。Luceneは基本的にスキーマ構造はいい加減(ドキュメントごとに設定できる)でしたが、Solrはある程度スキーマ構造を定義した堅物です。実際には、動的フィールドやフィールド値のコピーができるので、ある程度の柔軟性は持っています。

configの方法は、highlighterの設定やいろいろなhandlerの設定などSolrに関わるschema以外の設定が記述されています。そして、ここはカオスです。まともなドキュメントを僕はまだ、見つけられずにいます。分かる人にはこれだけでも十分分かるのかもしれませんが、僕にはまだ、無理でした。

Javaは難しいです。クラスタリングへの道はまだまだ遠い。

と言うことで、ここから先、設定を変更しながら自分に必要そうな設定を試行錯誤していくのはまた今度。


でわでわ

2011年11月14日

テラスモール湘南に行ってきた

IMG_0019.jpg

2011年11月11日11時というベタな時間に、あんなに寂れていたはずの辻堂にテラスモール湘南がオープンしました。今行って話をすれば女子持てるって嫁に騙されて土曜に行ってきました。広大な土地にでかいものができるな、とずっと思っていたのですが、やっぱりでかかったです。しかも、中の通路は少し斜めっている上に少し波うっているので、実際よりさらに広く感じます。

オープンの翌日と言うこともあってか、かつて知らないぐらい辻堂は込んでいました。まあ、辻堂で降りたことはほとんどないんですがね。 辻堂って言うのは藤沢(江ノ島のあるところ)の隣で、湘南です。湘南って言うのは、夏には水着のおねーちゃんがそこらへんを歩いているようなところです。

全部で300店舗近くあるらしく、しかも、おされなお店が多いらしいです。女の人が行けば危険、じゃなくってすごく楽しいところかもしれません。男性が行くと・・・。まあ、でかくていろんなものがありますが、15分で飽きます。僕はまた行きたいとは思いません。あっ、109シネマがあって、IMAXで見られるのでそれはいいかも。ここは混んでいるのかな?近所の映画館はすいているし、嫁が2ヶ月か3ヶ月に一度は映画の無料券を仕入れてくるのはいいのですが・・・。きっと、女性はショッピングに行って、男性は映画見て時間をつぶせということに違いない。子供は、と言うか、男の子供はおもちゃやさんがないところは興味ないらしいです。

テラスモールから東へちょっと行ったところにショッピングセンターがあるんですが、駅からちょっと離れていて不便です。行ったことないけどね。駅前にこんなでかいものができてやっていけるんでしょうか?

まあ、よっぽどのことがない限り、僕はもう行かないかも。

 

でわでわ 



2011年11月9日

LuceneのFastVectorHighlighterを使う

Luceneで検索結果のハイライト表示はorg.apache.lucene.search.highlight.Highlighterを使っていました。このヒトは、CJKAnalyzerとかN-Gramのアナライザと一緒に使うと、ハイライト部分が直感に反するモノになっていました。下の図は、「アリエル」と「情報」で検索したときのハイライト表示です。FastVectorHighlighterを使えば、このようなハイライトの仕方はなくなるって噂では聞いていました。ハイライトが変わるだけじゃなくスピードも改善するらしいです。けれども、使い方がよく分かりませんでした。でも、そんなことも言っていられないのでちょっとまじめに調べてみました。

まずは、FastVectorHighlighterを使うためのimportです。
import org.apache.lucene.search.vectorhighlight.*; 

Javaはタイピングの練習にちょうどいいですね。ウソです。Eclipseに補完してもらいました。楽ちんです。
FastVectorHighlighterを使ってハイライト表示するためには、インデックス作成時に各termの位置情報を保存するように指定しなければいけません。つまり、既存のインデックスはアップデートしないとFastVectorHighlighterのハイライト表示は使えません。
位置情報を保存するには、FieldにField.TermVectorで指定します。このひとは、NO,とWITH_POSITION, WITH_POSITION_OFFSET, YESってあります。YESを指定しておけばいいだろうと、安易に考えてはいけません。YESだとFastVectorHighlighterは使用できません。ここは、WITH_POSITION_OFFSETを指定します。これで、位置情報がちゃんと保存されます。WITH_POSITIONだけで大丈夫なのかどうかは試していません。Javaのコードはこんな感じ。
document.add(new Field("content", content, Store.YES, Field.Index.ANALYZED, Field.TermVector.WITH_POSITIONS_OFFSETS)); 

さて、インデックスに必要な情報が保存されたので、実際にスニペットを取得します。
FastVectorHighlighter highlighter = new FastVectorHighlighter(); 
String[] snippet_fragments = highlighter.getBestFragments(highlighter.getFieldQuery(query), indexReader, documentId, "content", 32, 5);

あらかじめインデックスに位置情報を保存するっていうことを知っていれば大したことないコードです。位置情報を保存していないと、フラグメントが取得できなくって、なぜだろうってはまります。
取得した断片はハイライト部分はbタグで囲まれています。FragmentBuilderで指定することでハイライト部分のタグをカスタマイズできます。でも、めんどいので書きません。

でわでわ


2011年11月7日

オライリーの「入門HTML5」読んだ

週末にオライリーの入門 HTML5
を読みました。ちょっと前に買ったのですが、ずっと机の上にほったらかしにされていました。この本を買った理由ですが、アマゾンのダンボールがちょっと必要になって、そのために本を買いました。でも、送られてきたモノは、立方体のダンボールではなく、でかい封筒を薄めのダンボールでつくったようなモノでした。残念です。これじゃ、なんのために本を買ったのか、分かりません。かつてのアマゾンはどこに行ってしまったのでしょう。

欲しかったダンボールが手に入らないまま、本も読まないでほったらかしにしていると、何の為に本をかったのか分かりません。悔しいので週末に読んでみました。雑誌に書いてある程度のことは読んでいたのですが、この分量のhtml5のお話は読んだことがないので、いろいろと新しい発見があって新鮮でした。html5でタグの階層が意味を持つことは純粋に知らなかったです。

でも、何だかビデオに関する説明が長すぎます。これ、そんなに説明する必要ないでしょう。でも、真ん中ぐらいの位置しているビデオの説明を乗り越えると、ローカルストレージとかオフラインとか、わくわくしそうなモノが待ち構えています。ビデオの無駄な(?)説明を我慢して読んだ後にこれらの面白そうなモノがとてもチラ見せ状態でもっと知りたいと思っても、この本はあざ笑うだけです。まあ、Using the HTML5 Filesystem API
を読め、ってことなのかもしれません。

軽く読み流せるので、雑誌に書いてある以上の概要を知るにはいいかも。で、Gearとか出てきて和みます。

 

でわでわ




2011年11月5日

早起き生活、始めました

アリエルはフレックスなので、コアタイムさえ会社にいればいつ来て、いつ帰ってもいいです。まあ、ちょっとした障害さえ乗り越えれば、コアタイムさえなくすことができます。

僕は、オフィスが中目黒の頃は10時前ぐらいに会社に着ていました。オフィスが五反田に移ってからもほぼ10時ぐらいだったと思います。六本木に移ってからは、ちょっと前までは9時頃に着ていました。

9月に新しい人が入ってきました。その人は、男の人で朝早く起きて毎日自分お弁当を作っています。その人が、微妙に僕より早く来て、心の中で勝ち誇っているのが見えます。負けてはいけないと思って8時30分ぐらいに出社するようになりました。

そうこうすると、10月にもう一人入ってきました。その人が8時すぎぐらいに出社してきて、「I am No.1」と心の中で叫んでいます。売られたけんかは買わなければならないってCTOが言っていたような気がするので、負けずに8時前に出社するようにしました。すると、彼は7時30分頃に出社するようになりました。仕方がないので、僕は7時20分ぐらいに出社するようにしました。すると彼は7時に出社します。ここで僕は敗北を認めて7時30分頃に出社するようになりました。アリエルの早朝出社インフレはこうして一旦収束しました。

 

さて、7時30分から働くと、10時間会社にいても17時30分です。まず、午前中の仕事する時間がとてつもなく長いです。しかも静かです。意外と仕事ははかどります。午後の仕事が終わって、18時前に会社を出ると、まだ、時間が沢山あるような気がして、一日が長く感じます。わりといいかもです。

ちなみに、朝は7時ぐらいに新橋に着きますが、東海道線はとても混んでます。横浜からすごく混みます。横浜の人はすごく早起きなんですね。

 

でわでわ 



2011年11月3日

あれからソフトバンクの電波はどうなったのか?

「あれから」って言うのが「いつから」なのか分かりませんが、ソフトバンクの回線はどれくらい快適に使えるんでしょう?と言うことで、東京駅から平塚のあたりまで、Huluでビデオストリーミングという回線事業者にとってはきっと、とてつもない迷惑なもの(たぶんスピードテストよりは実利ある分迷惑じゃないはず)をiPhone4sで見ながら試してみました。ちなみに、Huluはかなりバッファリングするので、電波が完全に届かないトンネルの中でも数十秒ぐらいであれば動画は途切れることなく見れます。

まずは、東京駅です。時間は夜の7時ぐらいです。何故、東京駅?っていうのは、ちょっと電器屋さんに行ったからです。東京駅では、電波はちゃんときています。ネットワークにはつながりますが、10分待っても動画は再生が開始しません。と言うことで、再生が開始されないまま、電車は発進しました。新橋についてもまだ再生はされません。新橋を発車直後ぐらいから再生が始まりました。でも、品川駅に着くまで動画は途切れ途切れです。まあ、そんなものです。

驚いたのは品川駅で停車中に電波が入って動画が再生されたことです。何を驚くかって?一年前は品川駅はソフトバンクの電波の暗黒地帯だったので、電波があることだけじゃなく、動画まで再生されるのは驚きなのです。品川駅を出発すると、ちょっとの間、広い線路になります。このあたりは電波が弱くて途切れます。でも、広い線路のエリアを抜けるとそこそこ、動画を再生できます。多摩川とか、横浜駅の手前、大船駅とそれからちょっとだけの区間ぐらいで動画が止まったりしましたが、それ以外はほぼ動画は再生され続けました。驚きです。

東京 - 横浜間は割と画質は悪い状態が続きました。でも、横浜を過ぎて"都会"じゃなくなると、画質もよくなります。山手線は苦手らしいですが、予想以上にソフトバンクの電波いいんじゃないでしょうか? まあ、東京人大杉ってことなのかもしれません。

 

でわでわ 



Google Developer Day 2011 Japan

昨日は横浜でGoogle Developer Day 2011でした。なんだかんだ言って、最初の年以外は参加している気がします。

僕の価値基準では、食べ物をくれる会社はいい会社です。その思想の元、アリエルではかつておやつが出ていました。そして、今回のGDDですが、朝、9時30分頃に行くと、パンとオレンジジュース、コーヒーがありました。さすがに9時40分ぐらいになると、大量の人が来るので食べるのは無理かもしれませんが・・・。とりあえずこれで、Googleへの好感度が倍増です。いい会社です。 それから、お昼ご飯が出ます。キャンディーとかのおやつもあります。夕方に僕は帰っちゃいましたが、最後までいれば炭酸入り麦茶(酵素の働きによりアセトアルデヒドになるものの混入済み)が振る舞われたそうです。うん、素敵な会社です。

さてさて内容ですが、 午前中の分はすっ飛ばして、午後のやつです。基本は僕はhtml5関連のもの、いろいろを聞きました。最初はhtml5最前線と言うモノでした。お弁当を食べた後の眠気と戦いながらです。audio関係とか、僕があまり興味がない方面の話が多かったので、ちょっと残念です。知識ベースでは、僕の知らないことが沢山ありました。

その後、ディベロッパーツールの話でした。普通は僕はこの手の話はあまり興味がありません。 でも、午前中のお話を聞いて、もうちょっと聞いて見たいと思ってしまったわけです。で、ChromeのディベロッパーツールはJavaScriptとかで出来ていて、ディベロッパーツールをディベロッパーツールでデバッグ出来るそうな。これは、まあ、面白いな〜。です。で、Webアプリケーションみたいに出来ているので、Chromeをリモートデバッグ出来るらしいです。まあ、Chromeをリモートデバッグできて何が売れ真だというと、将来MobileWebkitにリモートデバッグする機能が入れば、スマフォ上のインスタンスを直接PCからデバッグ出来るって、素敵な世界が未来にはあるそうです。

その後、HTMLのオフライン機能のお話です。あれ?アプリキャッシュの話は、こっちだったか、別の奴だったか?まあ、オフラインはデータの同期をどうすればよいかはよく分かりませんでした。

いくつかすっ飛ばした感じがしますが、去年と違って今年は楽しかったような気がします。きっと、お弁当の差でしょう。

 

でわでわ 



2011年10月30日

node.js/socket.ioをインストール

JavaScriptは好きではないのですが、諸般の事情でちょっとだけ触る羽目になりました。まあ、websocketのちょとした調査です。のメモ。

node.jsのインストール
brew install node.js

npmのインストール
curl http://npmjs.org/install.sh | sh

socket.ioのインストール
npm install socket.io

chatを動かすための諸々のインストール
npm install express
npm install stylus
npm install nib
npm install jade

socket.ioのサンプルのchatを動かす
cd node_modules/socket.io/example/chat
node app.js

ブラウザでhttp://localhost:3000/にアクセスしてチャット開始。開発ツールでネットワークをモニタするとhttp://localhost:3000/socket.io/1/websocket とお喋りしているらしい。

今日はここまで。

2011年10月26日

Ubuntu 11.04に入れたOracle XE 11gを11.10で動かす方法

Ubuntu 11.04にOracle XE 11gに入れて、Ubuntuを11.10にバージョンアップすると、Oracleは動かなくなります。このフォーラムによると、バイナリエディタでバイナリを書き換えれば大丈夫だよ、って恐ろしいことを書いています。ありえないです。なので、会社の@buzztaikiの指導のもと、動くようにしました。

症状
まず、11.10にアップグレードした状態でsqlplusで接続すると
ERROR:
ORA-12514: TNS:
リスナーは接続記述子でリクエストされたサービスを現在認識していません


ユーザー名を入力してください:
と表示されます。oracleユーザになって、sqlplus / as sysdbaとすると、
アイドル・インスタンスに接続しました。
と表示されます。そのままstartupと実行すると
ORA-00845: MEMORY_TARGET not supported on this system
とエラーになります。

対策
sqlplus / as sysdbaで接続して、次の文を実行します。
create pfile='/tmp/iyan.pfile' from spfile;
/tmpにiyan.pfileが出来ているので、*.memory_targetの値を0に変更して保存します。sqlplus / as sysdbaで接続して、次を実行して起動できるか確認します。
startup pfile='/tmp/iyan.pfile'
無事起動できたら、shutdown immediateして一旦、Oracleを落とします。そして、次を実行します。
create spfile from pfile='/tmp/iyan.pfile';
さて、これでstartupすると、ちゃんと起動できます。めでたしめでたし。

でわでわ

2011年10月22日

今更Googleの音声認識を試す

Siriのせいで音声認識が流行っている今日この頃ですが、みなさん、いかがおすごしでしょうか? Siriの盛り上がりも、みんなそろそろ飽きてきた頃だと思いますが、音声認識で英語の発音の練習が密かなブームらしいです。どこでブームになっているかは知りません。

さて、今日はCTOとランチを食べているとき、音声認識の話になりました。 Googleの音声認識でちゃんと認識してくれないとか。ちなみに、僕は通じればいいやと思っているので下手くそな発音です。子供にも「ママの英語はうまいけど、パパの英語はいまいちだね」って言われます。で、CTOは僕と違って発音に気を遣っているのでちゃんとしています。で、彼が言うには"take"がちゃんと認識するとか、しないとか・・・。で、家で試してみるとGoogleの音声認識でちゃんと認識してくれます。たぶん、CTOは何かを誤解しているんだと思います。

さてさて、それで僕は「シー」の発音が苦手です。歯並びが悪いせいだと学生の頃に達観してしまったので、上手くなるはずもありません。で、「rice」って言うと、うーん、認識してくれないですね。「rights」になっちゃいます。おかしいですね。「lice」って言うと「lights」になっちゃいます。何かがおかしい。「see」っていうと「c」になります。これはいいです。で、「nice」って言うと、「night」ってなちゃうことを期待しましたが、これは、「nice」です。訳わかんなくなってきました。「rice」は10回ぐらいがんばると、やっと認識してくれました。うーん、難しいですね。

印象としては、Siriの方が僕の英語を認識してくれるようですが、単語単位か文として認識するかの違いかもしれません。愛の違いかもしれません。 Siriに「I want to eat rice」って言うとちゃんと認識してくれましたが、Googleの方だとriceはrightsになっちゃいました。まあ何にせよ、ちょっと離れて見てみると区別がつかないかもしれませんが、liceにならないのでいいですね。変なものが好きなCTOならliceも食べちゃうかもしれませんが、僕はriceしか食べません。

そんなこんなで、英語の勉強と称して海外ドラマを見るのでした。英語の勉強だって言っているのに嫁には「ヒマだね」って言われます。とほほ。

 

でわでわ



2011年10月20日

お得なWeb+DB Press総集編

発売前に届いていたのですが、書くのを忘れていました。技評からWEB+DB PRESS 総集編 [Vol.1~60]
を貰いました。一度でも記事を書いておくと総集編をタダで貰えるので、とってもウハウハになります。

さて、この本は10年分の記事がpdfでDVD-ROMに入っています。 pdfが手に入れば、本棚の雑誌は一気に処分できて、本棚的にもうれしいです。技評はWeb+DB Pressに限らず定期的に総集編とかで記事をpdfにしてくれるので、とってもいいです。

僕はDVDにあるpdfをMacの中にコピーしています。さすがに、pdfになったものを何もないときに読み返すことはないですが、spotlightの検索対象になるので、それだけでも便利です。紙の媒体だと埋もれてしまう情報にもアクセスできます。まあ、現実にはアクセスして読むことはたまにしかないんですが、 それでも読むのは簡単に見つけられるからです。しかも、それを持ち歩けます。

総集編の雑誌の中に何か記事が載っていたような気もしますが、DVDからpdfをコピーして、それで満足してその何かの記事は読んでいません。ごめんなさい。

もうちょっと言えば、僕はDVDはiMacからしかアクセスできないので、できればネットワークからダウンロードできるとうれしいかな。

Web-DB PressやSoftware Design(こっちは1年ぐらいごとにpdfにしたものが雑誌に付いてきている気がする)の総集編はとってもお得なので、 それだけでも買っといた方がいいんじゃないかな?

 

でわでわ 



2011年10月19日

Ubuntu 11.10にバージョンアップ

会社の開発環境はUbuntuを使っています。一応、このご時世ですのでIEは無視できないです。そのためIEの動作確認用にWindowsはVirtualBoxの中で動いています。

Ubuntuはつい先日11.10っていうリリースがありました。僕はリリースされたその日にアップデートして使っています。仕事の環境が壊れても、本当に必要なデータはローカルにはないので、数時間で復旧できます。そのため、何も考えずに作業しちゃいます。

で、11.10。 このリリースからUnityと言うのがすべての人に強制されます。11.04の頃は、最初は喜んで使っていましたが、いまいち使いにくいので昔の表示に戻してしまっていました。そして、11.10はその昔の表示のやつがいなくなってUnityだけになってしまいました。デフォルトはね。

このUnity。Ubuntuを全否定したくなるほど中途半端というか、使い勝手が良くないというか・・・。Ubuntuを含めたLinuxのデスクトップ環境を使うのは変態だけです。いやいや、コンピュータに詳しい人だけです。それでもgconf-editor(Windowsでいうレジストリエディタ)とか使わずに普通に設定を行いたいわけです。でも、ほとんどの設定項目がありません。デスクトップのフォントを変更すらgconf-editorを通してでないと出来ません。Unityのランチャのバー(なんて言うのかしらない)のサイズ変更も位置の移動も簡単には無理です。10年以上前に戻った錯覚すら憶えます。

メニューの位置はまあいいとして、通常の状態ではメニューの項目が隠れています。僕は隠さないで欲しいです。 それから、アプリの起動の方法も中途半端だし・・・。

ちょっと前まで普通に出来ていたことが出来なくなります。あまりにも悲しいです。本当の初心者を相手にするなら、フォントの項目は入らないかもしれませんが、大多数のユーザは変態です。そんな変態たちにいろいろな設定項目を隠すのは間違っています。

ちょっとだけ我慢して使いましたが、あまりにも使いにくいので、xfceにしちゃいました。快適です。

でわでわ。 



2011年10月18日

pythonでhttpのファイルアップロード

とりあえず、何も書かずにどんどん過ぎたってしまうので、Pythonでファイルをアップロードするコード。日本語のファイル名もそこそこちゃんと扱ってくれるはず。

#! /usr/bin/env python

import mimetypes
import os.path
import random
import sys
import urllib
import urllib2

OS_FILESYSTEM_ENCODING = sys.getfilesystemencoding()

FORMENCODE_HEADERS = {
     "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
     "Accept-Language": "ja",
     "Accept-Charset": "utf-8"}

MULTIPART_HEADERS = {
     "Content-Type": 'multipart/form-data; boundary=',
     "Accept-Language": "ja",}


        
def is_multipart(postdata):
    for value in postdata.values():
        if isinstance(value, file):
            return True
    return False

def encode_postdata(postdata):
    getRandomChar = lambda: chr(random.choice(range(97, 123)))
    randomChar = [getRandomChar() for x in xrange(20)]
    boundary = "----------%s" % ("".join(randomChar))
    lines = ["--" + boundary]
    for key, value in postdata.iteritems():
        header = 'Content-Disposition: form-data; name="%s"' % key
        if hasattr(value, "name"):
            name = value.name
            if isinstance(name, str):
                name = name.decode(OS_FILESYSTEM_ENCODING)
            header += '; filename="%s"' % os.path.split(name.encode("utf-8"))[-1]
            lines.append(header)
            mtypes = mimetypes.guess_type(value.name)
            if mtypes:
                contentType = mtypes[0]
                header = "Content-Type: %s" % contentType
                lines.append(header)
            lines.append("Content-Transfer-Encoding: binary")
        else:
            lines.append(header)

        lines.append("")
        if hasattr(value, "read"):
            lines.append(value.read())
        elif isinstance(value, unicode):
            lines.append(value.encode("utf-8"))
        else:
            lines.append(value)
        lines.append("--" + boundary)
    lines[-1] += "--"

    return "\r\n".join(lines), boundary



def open_url(url, postdata=None, headers = None):
    encoded = None
    _headers = None
    if postdata:
        if is_multipart(postdata):
            encoded, boundary = encode_postdata(postdata)
            _headers = MULTIPART_HEADERS.copy()
            _headers["Content-Type"] = _headers["Content-Type"] + boundary
        else:
            encoded = urllib.urlencode(postdata)
            _headers = FORMENCODE_HEADERS

    request = urllib2.Request(url, encoded)
    if _headers:
        for key, value in _headers.iteritems():
            request.add_header(key, value)
    if headers:
        for key, value in headers.iteritems():
            request.add_header(key, value)
    opener = urllib2.build_opener()
    response = opener.open(request)

    return response


if __name__ == "__main__":
    url = "http://example.com/post"
    postdata = {"key": "value",
                "file1": open("somefile.txt", "r+b")}
    resp = open_url(url, postdata)
    print resp.read()

2011年10月15日

おっ! Siriを試す

iPhone4sのセットアップも一通り終わったので、噂のSiriを試してみました。とりあえず、リストされている言語の中で使えそうな英語なので、英語(アメリカ合衆国)に設定します。ちなみに、僕はJapanese accentな英語です。

 まず、「I love you.」って言うと浮気するな、みたいなことを返してくれるらしいので、ここから始めます。すると、「I hope you don't say that to those other mobile phones, Hiroki.」って言ってました。Hirokiっていうのは僕の名前ね。もう一度「I love you」って言うと、「Oh, stop.」って言います。ちょっとはいろいろ考えているみたいです。

「I love you.」で通じたので、僕がいつも音声認識で試す「I want to eat Hambargar.」って言います。あんまり意味はないです。大昔のロータス時代の名残です。すると、「Sorry, Hiroki. I can't look for restrants in Japan.」 っていわれます。日本語を認識しないだけじゃなくって、日本に関する情報が登録されていないようです。「How can I go to XXX station?」って言うとやっぱり、 「Sorry, Hiroki. I can't look for placesin Japan.」って言われます。日本語がわかってくれないだけじゃなく、Siriは日本を知らないらしいです。道に迷ったときに渡辺謙に話しかけるみたいに話すと案内してくれると思ったのに、ダメそうです。

で、Siriって何ができるの?そんなことは彼女に聞いてみます。「What can you do?」すると、「You can ask things like:」ってでて、いろんな例文が出ています。それじゃ、と言うことで、例文通り「How can I get home?」って言うと、Which home for Ohtani Hiroki?ってでてアドレス帳にある僕の住所から、どっちかを選べ、って出ます。なぜ、僕にhomeが二つあるんだ?と思いつつ片方を選択すると、I can't find xxxって言われて、やっぱり僕の家を見つけてもらえません。

とりあえず、日本語だけじゃなく日本じゃまだ、使えなさそうなので、Siriをオフにします。電気もたくさん食いそうだし・・・。

 

でわでわ 



iPhone4sを手に入れる


周りにせかされて、先週予約したiPhone4sですが、今日、入手しました。

昨日の夕方、受取時間の確認の電話が来て、受け取れる一番早い時間を聞くと9時と言うことでした。と言うことで、その時間に予約を入れました。場所は川崎のビックカメラです。この時間につくためには、いつもより遅い時間に家を出ないといけません。なので、いつもよりゆっくり家でくつろぎました。

到着すると、「システムが8時20分頃に止まってしまって、30分には復旧するはずが、まだ、何の連絡もありません。いつ復旧するかわからず、前の人がいるので復旧してから30分はまたないといけません。」って言われました。サーバが悲しい悲鳴を上げるのはいつものことです。その辺の期待値は地に落ちているのでなんとも思いません。いつ普及するかわからないので、夕方に予約を入れ直して、会社に行きました。ちなみに、ソフトバンクの方は賑やかでしたが、auのほうはほとんど人がいませんでした。

サーバがまだ普及していだろうと思いつつ4時30分ぐらいに再度来店しました。やっぱりまだ、システム障害中です。予約の段階ですらトラブルがあったのに、実際の販売でシステムにトラブルが起きないはずはありません。期待を裏切りません。顧客の期待通りにするソフトバンクは優秀です。 サーバが落ちているので、実際の開通は後日と言うことで、ぶつだけを支払いとともに受け取りました。開通は「明日ぐらいになります。ひょっとしら明後日になるかもしれません」と。まもりに入ったいいわけです。「その間、電話は古い方にかかってきます」って言われます。友達がいないので、電話はかかってきません。大丈夫です。「ネットワーク機能も使えません」って説明されます。Pocket Wifiがいるので大丈夫です。ちなみい、3GSにはSIMは刺さったままです。いえーい。

ビックカメラ川崎ではソフトバンクの方は当日発売分はありませんでした。でも、auは優秀です。僕の行った5時前後の時には、au iPhone4sは白はすべてのモデル、黒は32Gのモデルが在庫ありの状態です。手続きの窓口も2,3人並んでいるだけです。SoftbankからSoftbankへの移行ならわかるんですが、docomoからSoftbankにやってくる人もいます。auの方が速いらしいので、みんなauにいってソフトバンクの回線を開けてあげましょう。 

と言うことで、うきうきしながら帰りました。 

でわでわ 




2011年10月13日

初めてのIkeaに一人でお使い

嫁がしょちゅうIkeaに行って何かを買ってきます。なぜ、そんなにIkeaに行きたがるのか、ずっと疑問でした。かなり前にこんな記事が載っていたのですが、そうは行ってもついつい何かを買ってしまうのは意思が弱いからだと思っていました。行ったこと、なかったんですけどね。一緒に行くと速く帰りたがるので連れて行ってもらえませんでした。

まあ、そんなこんなだったのですが、PC用の机を買い換えたくなり、さらに諸般の事情で僕が一人で買いに行くことになりました。横浜の港北のIkeaです。車で大体1時間ぐらいの距離です。

開店と同時ぐらいに店に着きました。必要なものだけを買って帰ろうかと思ったのですが、どんなところか一通り見て回りました。ただ、おっさんが一人でじろじろ見て回ると怪しまれるんじゃないかとか、いらぬ心配をしながらさっさと歩いて見て回りました。まあ、もともとじっくり見るつもりはないですが・・・。 そして、必要なものをさっと買って帰りました。途中、サボテンを買っちゃいそうになりましたが、そんなことをしたら嫁になんて言われることか・・・。負けちゃいけない(何に?)と思ってじっと我慢です。

まあ、ざっと見てまわった感想は、「これは女の人が好きなはずだ! ついつい買っちゃうよね」と。きっととっても楽しんでしょう。僕は楽しめても10分ぐらいですが・・・。

さて、そんなこんなで、おうちのお仕事(?)スペースはこんな感じになりました。机と横のキャビネットで1万6千円ぐらいです。

IMG_1163.jpg 

でわでわ。 



2011年10月11日

RX-8生産終了なのか・・・

先週はiPhone4sの発表があったかと思うと、ジョブズの訃報でニュースがリンゴ一色になったりしましたが、その陰でこっそりRX-8が生産終了というニュースがありました。多分、車が好きじゃない人にはなんのことかわからないと思いますが・・・。僕にとってはこちらのほうが悲しいお知らせです。ロータリーエンジンって子供の頃の憧れだったので、将来は乗ってみたいエンジンでした。20代ころはそんなにお金がなかったし、あっても東京に住んでいたので車は必要なかったり。30代になると、子供がいて4人しか乗れない車は必然的に対象から外れます。だから憧れだけでした。

まあ、世の中の流れ的には仕方ないのはわかるんですが、ロータリーエンジンを市販している会社だから多少安っぽくても(値段相応とも言いますが・・・)Mazdaの車を乗っていたのですが、うーん、残念です。まあ、Mazdaにはまだ、ロードスターがいるのでそれで我慢しましょう。あと、15年ぐらいは買えないけど・・・。 まあ、そのころには、水素エンジンの車として復活しているかもしれません。

なんか、一つでもとんがったところがあると、他の多少悪いところにも目をつぶったりすることもあるものです。とんがったところがあるから、ファンが増えたり、裾野が広がったりすると思うんですが、それがなくなるとどうなるんでしょう?まあ、そのとんがったところのファンって実はそんなに多くなかったりして・・・。

それはそれとして、今週末はちゃんとiPhone4sは手に入るんでしょうか?また、ソフトバンクのサーバは悲鳴を上げるんでしょうか?

でわでわ 



2011年10月8日

iPhone4sとUltra Speed


iPhone4sの予約が始まりました。周りからの「もちろん予約するんでしょ!」という無言の圧力?に屈して、予約してしまいました。僕の使ってきた3GSの電池の持ちが悪くなってきたと言うこと以外は、本音としては特に不満があるわけでもなく、iPhone5を待ちたいところです。そうは言っても買ってから2年を過ぎれば割高感があるわけで、乗り換えたいというのもあります。

まあ、そんなこんなで予約しました。最初はBicCameraの有楽町で予約しようと思っていたのですが、すごく並んでいるとか、予約は開始早々終わってしまったとか、ウソか本当か分からない情報があって、結局帰り道にある川崎のBic Cameraで予約しました。藤沢にするかも迷ったのですが、なるべく会社に近いところ、と言うことで。

で、金曜の夕方に行ってみると予約するための予約券だけを配っています(Softbankの方ね)。「今日の手続きは終わりました」って。と言うか、サーバが混みすぎて出来ないとか・・・。おいおい。予約ごときで・・・。回線だけじゃなくサーバも弱いのか?ちなみに、auの方は3人ぐらいならんでいるだけで、粛々と予約しているようです。渋谷などは至る所で並んでいるって聞いていたのですが、川崎は穴場なんでしょうか? 

と言うことで、日があけて今日、予約の予約券をもって予約しに行きました。ソフトバンクの売り場は予約の予約券を持った人で一杯です。そして、予約の手続きで忙しそうです。当日は200台ぐらいは、入荷するそうです。それ以上はよく分からないらしい。auは、「発売日当日にはお渡しできないかもしれません」という張り紙とともにがらがらです。想像していたのとは全然違いました。

さて、そんなことはどうでも良くって、パケット定額の話を聞いていると、2段階定額の方だと、Ultra Speedが月額2500円ぐらい + 最初に9000円ぐらいで利用できるらしいです。Ultra Speedって42Mのサービスで1.5G Hzの方を使うので、まだ、がらがらに空いているやつです。iPhone4sに4G的なものが付かなかったので、これはとっても魅力的です。WiMAXより素敵かも。エリアもemobileのやつも3Gも使えるし。auよりはるかにお得じゃないか?これならiPhoneでテザリングがなくても許せます。まあ、都会じゃ3Gは速度が遅くって使い物にならないって言うことの代替だとは思いますが・・・。これだけ見ると、auって全く魅力がなくなります。あっ、僕はほとんど電話はしないので、そこの品質はどうでもいいです。

auに全く魅力を感じませんが、みんなauに行きましょう。

 




2011年10月6日

iPhone4sでしかなかったけれど・・・

事前の噂で勝手に大きく期待して、直前の噂でなかばあきらめ、正式発表で「結局iPhone5はいつなんだよ? iPhone4s買っていいの?」という微妙な状況になりました。でも、僕が持っているのは3GSなので2年も過ぎているので買い換え時です。iPhone5がでたらまた検討すればいいので、iPhone4sは買うことになります。

iPhone4sは順当なバージョンアップですが、4Gと呼ばれているモノが載っていないのが残念です。他のAndroidがWiMAXなりUltra Speed(?)が載っているので、それに比べるとすごく見劣りがします。Androidにはなじめないので、iPhoneを使い続けることになります。

今回はSoftbankとauから出ます。こんな記事もありますが、 auはこんなに素敵な回線速度らしいので、惑わされずにみんながauに行けば、Softbankの回線があいて快適になるはずです。みんなauに乗り換えましょう。僕はいろいろめんどいので、Softbankのままです。どうせ、イーモバイルのWifiルータもあるしね。 



2011年10月5日

在宅勤務するとき、どんな感じ?

以前、何回か書いていますが、僕の働いている会社では在宅勤務できます。と言っても、ずっとじゃなくって週何回かと言うルールはあったかもしれません。それ以外にも若干のルールはあります。自宅で働いた翌日に作業時間を報告しないといけません。これは社員を信用していないとか、そういう話じゃなくって、社員を働かせすぎないようにするためものです。あとは、メールなどで連絡がとりやす状況にすることとか。僕も時々自宅で働きます。子供がいると仕事が出来ないので、子供の夏休みなどはしませんが・・・。ただ、かなりの開発の人は自宅である程度働くことができるのですが、一部の人を除いて自宅で作業しようとしません。みんな、会社が好きなんでしょうか?

週末にテレビを見ていたらテレワークとかに関する番組をやっていました。 内容は、まあ、それなりです。slashdotにも在宅勤務についての話題がありました。アリエルが出来たときは、数ヶ月はずっと自宅で働いていたりしたので、そのとき分かったことです。

まず、平日の昼間に自宅の周辺をうろちょろしていると近所の住民に怪しまれます。大体、失業中って思われます。おばちゃんと立ち話をすると、段々主婦の気持ちなるかもです。

最近は自宅で働くときはお昼ご飯は自分で作りますが、10年前は食事に外に出かけていました。ほとんど外に出なくなるので、外にでて気分転換するのは大切です。

で、先の記事だと、在宅勤務するとあまり働かなくなるんじゃ?と。一般的なことは知りませんが、僕の知っている限られた世界ではあまりは働かなくなるんじゃなくって、 働きすぎるように思います。自宅で働く場合、僕は8時ぐらいから働き始めて、18時ぐらいまで。それから子供が寝てから12時ぐらいまで働きます。まあ、働いているのか遊んでいるのかは微妙なんですが・・・。

それから、服装。まあ、会社に行くような服装で働きます。とは言っても、会社に行くのもばっちい服なので、どれくらいちゃんとしているかは疑問ですね。外にそのまま出てもいいような格好じゃないと、僕は仕事をするっていう気分がのらないです。

それから、残念なところは家の方が会社より開発環境がちゃんとしていたり、快適だったりすることです。で、机がいまいちかっこ悪いので、今は新しい机を物色中です。

でわでわ 



2011年10月1日

今度のありえるえりあ勉強会はJavaScriptです


会場の都合がつかず、ちょっと間が開いてしまいましたが、今度のアリエルエリア勉強会はJavaScriptです。多分、サーバサイドのマニアックなものじゃなく、クライアントサイドの方です。それ以上詳しいことはまだ、未定だったりもしますが・・・。10月13日の19時開始です。こちらから申し込みください。 

今回は、しゃべる人もほぼ決まっているんですが、講演して貰う人の講演内容はまだ決まっていません。この状態で申し込めって言われても困るかもです。タイトルに「大規模開発」って書いていますが、あんまり関係ありません。ある程度のコード規模(たとえば数千行とか)の開発はどうなのか?とか、どう設計するのか?とか、メンテナンスしやすいコードにするにはどうすればいいのか?とか、複数人での分業はどうなるのか?とか、かもしれません。もしくはなんかのライブラリの紹介かもしれません。

さて、今回はアリエルのCTOが「パーフェクトJavaScript (PERFECT SERIES 4)
」 を出版したらしいので、それにあわせています。僕は読んでいませんが、ちまたの噂ではいい本らしいので、買ってあげてください。でも、CTOは「JavaScript嫌いなんです。静的型付け言語がいいです」って宣っていました。この本を書いた人はJavaScriptが嫌いなんだと思いながら読むと、また別の感想を持ているかもしれません。

JavaScript勉強会を開いておきながら、僕もJavaScript嫌いです。でも、大きな声で言うと若者にバカにされるので、秘密です。

 

でわでわ 





2011年9月30日

iPhone5が待ち遠しい・・・

Softbankの新製品の発表でAndroidが一杯出てきました。Androidは買うつもりはないですが、このAndroidにはhspa+とかいうものが使えるらしく、21Mbpsの通信速度らしいです。これはちょっと羨ましいですね。で、先日の噂ではiPhone5がhspa+に対応するとかしないとか・・・。最近は電車の中でhuluで英語の勉強と称して海外ドラマを見ているので、これがもっと快適になればうれしいです。テザリングできれば、もう、文句の付けようがないというか、イーモバイルがいらなくなりそうです。きっと1.5GHzなので空いているはず・・・。

まあ、それはそれとして、僕はiPhone4は買わなかったので3GSのままです。2年縛り、って言ってもそんなこと気にせずに買い換えるわけですが、まあ、気分的に2年も経ってしまったので、早く新しいモノに乗り換えたいわけです。 iPhoneはauからもでるって言う噂もありますが、WiMAXが載っていれば、auへの移行も考えますが、多分そんなものはまだ載らないので、Softbankのままだと思います。電波の問題をよく言われますが、通話に関しては、電波が来なかったりしてもそんなに気になりません。データ通信は、きっとhspa+になれば・・・。

それ以外の機能は、実を言えばiPhone4にもあるFaceTimeが使いたいのです。それだけです。最近は、iPhoneはHuluを見るか、RSSを読む、ぐらいなので・・・。Twitterとかは、最近はあんまりiPhoneでは見ないですね。多分、Macでみるときと未読のデータが同期しないせいだと思います。

来週が待ち遠しいと言うか、iPhone4の白を待っていて買うタイミングを逸しただけなので、早くiPhone5が欲しいです。 

 

でわでわ 



2011年9月29日

Ubuntu 11.10 βを入れてみた


早いもので、Ubuntuの6ヶ月ごと次のリリースももうすぐです。6ヶ月で何が大きく変わるんだ?って言う気もしなくもないですが、それと同時に6ヶ月あればいろんなことも出来るっていうのも事実で、まったくオタク以外は興味が無いところだと思います。

で、最近はUbuntuのリリースの一ヶ月ぐらい前からバーチャルマシンにいれて遊んでみたりします。機能的なまとめとかは、どこかにちゃんと出ているので、単なる感想だけ。

実は、一ヶ月ぐらい前から入れて遊んだりしていましたが、そのときはまだ全然安定していなくって、いろんなモノがすぐに落っこちていました。あまりにも落っこちるので放置していてい、2,3日前にもう一度見てみたのです。以前よりは安定していますが、まだ、時々いろんなアプリが落ちます。その辺は仕方ないですね。

さて、バーチャルマシンの中で3D機能は使えません。使えたとしても使わないですが・・・。噂通りunity-2dが標準で入ったので、3Dが利用できる・できないでUIが大きく変わることはありません。11.04をunityで使っていた感じかるすると、少しづつこなれてきている感じを一瞬与えてくれます。まあ、着実に進化している感じがします。

でも、ちょっといろいろ設定しようとすると、どこで設定していいのか分かりません。シャットダウンするのも、以前は右上の方をクリックすれば メニューが出てきましたが、僕のUbuntu君は出てきません。一定時間経てば画面がロックされますが、バーチャルマシンの中なのでそんな機能はホスト側がやってくれるのでオフにしたいのですがやり方が分かりません。

全体として良くなっているのか、悪くなっているのか分かりません。バージョンアップでのいろいろ変わるのは構わないのですが、やっぱり愛がない分、敷居が高くなります。まあ、emacsとコンソールとブラウザとメーラ、Eclipseが動けばいいだけなので、気にしないと言えば気にしないのですが・・・。

まあ、最終的にどうなるのか分からないのですが、早く正式版になって欲しかったりもします。

 

でわでわ 

----

再起動してみたらいろいろ直っていた。でも、設定できる範囲が少なくなっているような気がする・・・。 




2011年9月27日

Huluが始まってもうすぐ一ヶ月ですが・・・

日本でHuluが始まってもうすぐ一ヶ月です。最初の一月は無料になので、サービスが始まってすぐに登録しました。映画の絶対量はまだまだ少ないし、もっと新しめの映画も欲しいです。海外ドラマはまあ、それなりにあります。でも、ワーナー・オンデマンドのコンテンツを見ていると、やっぱりもっと充実して欲しいです。Fringeもファーストシーズンしかないし・・・。

ただ、コンテンツをもっと充実して欲しいですが、iPhoneなどで見られるのはいいです。僕は通勤時間が比較的長いので、電車の中で十分楽しめます。イーモバイルの回線だけど・・・。それだけでも、実はかなり満足します。無料期間が終わったあとどうするかは未定ですが・・・。

さて、まあ、それとは別に中々面白いサービスです。まず、ストリーミング系のモノって、ネットワーク環境が悪い時って、映像がとまって音だけが流れるものだって言う固定観念がありましたが、このサービスはまず、音が無くなってその後、映像が止まります。なので、音が無くても楽しめるように字幕は必須アイテムです。

ただし、この字幕もくせ者です。まあ、サービスイン直後ほどひどくは内ですが、字幕が音声より数秒遅れて出ることがありました。そのことを認識しないと、いいやつと悪いやつの会話が逆転して、いいやつが悪いやつになって、悪いやつがいいやつになって楽しいことになります。

まあ、そういうことがあるものだと思っていたら今度は、実際の会話よりも字幕の方が早く出ます。「こんなことを言うんだぞ!」っていう準備があらかじめできる便利なサービスです。まあ、時々、気がついたら字幕が無かったりするので、きっと英語の勉強用の教材なのです。でも、そうした問題も段々なくなってきているようです。 

それから、時々、字幕にタグみたいなものが表示されることがありました。字幕のデータ自体はXMLみたいなものなんでしょうか?まあ、そんなことを妄想しながらみるのも楽しいものです。 

ソフトについて言えば、10秒の巻き戻しが欲しいな。それさえあれば、英語の勉強のサービスだって自分を納得させられるんですが・・・。

 

でわでわ 



2011年9月22日

台風去った

昨日は久しぶりの直撃台風でした。まあ、朝からソワソワしていました。帰る頃には台風は過ぎ去って普通の生活が戻っているだろうと思っていたので、普通に会社に来てしまいました。後になって考えてみると、自宅勤務すればよかった・・・。

3時ぐらいに帰ろうと思ったら、東海道線が止まりました。それでもいけるところまで行けば良かったかもしれませんが、8時ぐらいには普通に電車が動くだろうと思うと、その時間まで会社で待った方が良さげです。

台風も7時ぐらいには過ぎ去り、電車が動くのを待つばかりです。9時ぐらいに運転再開っていう情報があったので、じっと待っていました。でも、なんだか様子が変です。他の路線はどんどん動き出しているのに、東海道線は動く気配がありません。しばらく動いたかと思うとすぐに止まったって言う報告が・・・。会社を出るに出られません。

夜も11時を過ぎた頃、これ、帰れても家に着くのは2時とかになるんじゃ無かろうか?と思って、完全に会社にお泊まりモードです。まあ、地震のときに耐性が付いちゃったのかもしれません。実は、9時ぐらいにはもう、会社で夜を明かす気になっていましたが・・・ 。

Twitterで見ていると、2時とか3時に家に着いた人とかいるみたいです。しかも、満員電車で寿司詰め状態で。そこまでして家に帰りたいとも思わないので、まあ、会社にお泊まりでもいいかな。

まあ、こういう理由で会社に泊まったのって、地震の時と今回だけなので、今年は何だか、変です。

 

でわでわ 



2011年9月21日

MacBook AirでVMWare Fusion

家のiMacにVMWare Fusion4をインストールしましたが、勢い余ってMacBook Airにもインストールしました。まずは、MacBook Airにお仕事の開発環境を整えることです。今まではiMacにしか仕事用の開発環境を構築していませんでした(えーと、アリエルは在宅勤務ができるのです)。でも、ちょっと外で何かしたいと思ってもできなかったので、同じように開発できる環境が欲しかったのです。

家のiMacのVMのイメージをコピーしてくればすぐに開発環境ができあがるのですが、そのVMの中にはOracle 10g XEが入っています。そろそろ11gの季節なので、11g XEを入れたいです。11gは64bitですでにあるVMは32bit OSです。と言うことで、Ubuntu 11.04の64bitをインストールするところから初めてOracle 11g XEをインストールしました。Oracle 11g XEはrpmしかないので、Ubuntuにインストールするのはちょっとめんどいですね。

そのあと、Eclipseとかいれます。メモリは最初は1Gしか割り当てていませんでしたが、さすがにきついので2Gを割り当てます。iMacのVMには6Gぐらい割り当てていました。 なので、2Gだとかなり心配です。でも、Oracleを動かしつつ、Eclipseが動きつつ、tomcatが動いていますが、なんとかストレスあまりなく動いていくれます。きっとSSDが凄いんでしょう。ちなみに、MacBook AirのCPUはCore i7ね。

ただ、Eclipseを動かすのは大丈夫なんですが、画面サイズが小さいのでそっちの方は不満です。VMとは関係ないけど・・・。デスクトップのモニタや27インチのiMacになれていると、ノートPCでEclipseは・・・。それでも隠せるところを隠して、エディタ部分を最大化して使えばなんとかなりそうです。

 

でわでわ 



2011年9月20日

Oracle 11g XEをUbuntuにインストール

Oracleは大好きです。ウソです。でもOracle 11g XEをubuntuにインストールしたです。ここには、くどくどと説明があります。カーネルのパラメータとかを調整したりしています。そんなにがんばらなくてもいいので、とりあえず動くようにします。

まずは、依存関係があるものとrpmをいじくるためのパッケージをインストール。
sudo apt-get install alien libaio1 unixodbc

次にoracle-xe-11.2.0-1.0.x86_64.rpm.zipをダウンロードしてきて、展開します。次のコマンドでrpmからdebパッケージに変換します。変換には若干の時間がかかります。
sudo alien --to-deb --scripts oracle-xe-11.2.0-1.0.x86_64.rpm

/sbin/chkconfigファイルを次の内容で作ります。
#!/sbin/bash
# Oracle 11gR2 XE installer chkconfig hack for Debian by Dude
file=/etc/init.d/oracle-xe
if [[ ! `tail -n1 $file | grep INIT` ]]; then
   echo >> $file
   echo '### BEGIN INIT INFO' >> $file
   echo '# Provides:             OracleXE' >> $file
   echo '# Required-Start:       $remote_fs $syslog' >> $file
   echo '# Required-Stop:        $remote_fs $syslog' >> $file
   echo '# Default-Start:        2 3 4 5' >> $file
   echo '# Default-Stop:         0 1 6' >> $file
   echo '# Short-Description:    Oracle 11g Express Edition' >> $file
   echo '### END INIT INFO' >> $file
fi
update-rc.d oracle-xe defaults 80 01

編集が終わったらsudo chmod 755 /sbin/chkconfigします。それから次のコマンドを実行して、Oracle 11g XEのインストールと初期セットアップします。/bin/awkが必要なので、次のコマンドの実行前にsudo ln -s /usr/bin/awk /bin/awkしておきます。
sudo dpkg --install ./oracle-xe_11.2.0-1.5_amd64.deb
sudo /etc/init.d/oracle-xe configure

途中、いろいろ聞かれますが優しく答えてあげてください。そのあと、/sbin/chkconfigを削除して、とりあえず再起動しちゃいましょう。

コンソールでsource /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.shすると、sqlplusとか使えるはず。sqlplus system/oracleとかでログインすると・・・、大丈夫そうです。

でわでわ

追記
====
ubuntu 11.10は若干手順が変わるので、こちら(Oracle 11g XE を Ubuntu 11.10 にインストールする)を読むべし。

2011年9月19日

VMWare Fusion 4をインストール

以前キャンペーンで10ドルぐらいでVMWare Fusion 3を買いました。当時のレートで800円ぐらいだった思います。でも、それ以降、VMWare Fusionがバージョンせず、このまま無料になることを期待していたら、バージョン4がでてしまいました。100ドルぐらいから50ドルぐらいに実質値下がりみたいな感じです。でも、僕は10ドルで買ったので、50ドルはとても高く感じます。

それはさておき、バージョン3でも特に不満はないのですが、バージョン4にしないとWIndows 8 Developer Previewはインストールできないらしいので、 バージョンアップしました。ついでに、購入もしました。VMWareのサイトを日本語で表示すると、日本円でしか買えません。英語で表示すると、右上のところにCurrencyを選択できるようになっています。USドルだと、50ドルぐらいです。日本円だと4600円ぐらいです。今のレートだと、暴利です。なので、ドルで買います。4000円もしません。日本円で買うのがばからしいです。騙されないようにしましょう。

使ってみた感想は、UI的なところはまあ、ほとんどの場合気にならないです。速度が速くなっているらしいですが、あまり体感できないです。基本的には、会社のお仕事を家でするときの開発環境なんですが、まあ、ちゃんと使えます。と言うぐらいかな。

Windows 8は・・・。まだ、インストールしていません。

 

でわでわ 



2011年9月16日

Windows 8をVirtualBoxで始めました

Windows 8のDeveloper Previewが出ました。Windows XPの時代が長かった印象があるだけにVista以降は普通のペースに戻った印象があります。まあ、Windowsはこっから先、本当に変わる必要があるのかは疑問だったりしますが・・・。それはさておき、会社のメインマシンのUbuntuのVirtualBox 4.1にインストールしてみました。インストールしたイメージは64bitのほうです。Windows 8のインストーラはダウンロードになんの登録も求められず、うれしいです。

VMにはメモリを1Gしか割り当てません。マシン全体では一応8Gのメモリを積んでいるのですが、ちょっと触る程度なのでそんなもんです。 気分的にCPUは2個割り当てています。それでインストール。まあ、特に問題もなくインストールできました。わりかし速くインストールされた気がしますが、インストール中はディスクIOが激しくってUbuntu君でお仕事ができなくなりました。Windows 8は関係ないけどね。

インストールが終わってログインします。まず、VirtualBox Tools(名前あっている?)が使えません。まあ、これは仕方ないです。そのせいか、ネットワークが使えません。VirtualBoxのネットワークアダプタをIntelにするとネットワークが使えるようになりました。VirtualBox Toolsが使えないので、画面サイズが動的に変更できません。ディスプレーの設定で変更はできるので、SXGAぐらいのサイズをとってあげます。VirtualBox Toolsが使えない分の多少の不便はありますが、触って遊ぶには十分です。IE10も何が変わったか知りませんが、会社の製品とか普通に動きます。

評判がいいのか悪いのか分からないメトロUIですが、タッチスクリーンだったらいい感じなのかもしれません。でも、僕が使っているのはタッチスクリーンではないので、うざいだけです。会社で無理矢理使わされるOSとしては、メトロUIってどうなんでしょう?

しばらく触った感じは、新しいものと古いモノが入り交じっていて、お互いが戦っている感じです。もしくは、マウスとタッチスクリーンが縄張り争いをしている感じ? 

 

でわでわ 



2011年9月15日

アップグレードしたMacのライオンはクリーンインストールできないと思っていたけど・・・

MacでSnow LeopardからLionにアップグレードしたのは遙か過去のことのように感じます。スクロール方向の変更も3日でなれました。時々Winodwsのノートを使ってトラックパッドだと、スクロール方向にいらつくぐらい慣れます。Lionにしてからずっと、アップグレードしたライオンはクリーンインストールできないと信じていました。少なくとも、何とかディスクを作らないとできないものだと思っていました。もっとも、そんなことしないだろう、と思っていたからです。

でも、訳あってクリーンインストールする必要がでました。オプションキーを押しながら起動すると、起動するディスクの選択画面がでます。普通のハードディスクとリカバリーディスクがあります。リカバリディスクは6Gぐらいあるので、ほぼ、DVDと同じサイズです。リカバリディスクを選択すると、よく分からないインストーラの画面になります。ディスクユーティリティを使って既存のハードディスクのデータを消去するのは以前と同じです。そのあとWifiの設定を済ませてインストールを始めると、追加のコンポーネントのダウンロードが始まります。何をダウンロードしているのか、どこからダウンロードしているのか知りませんが、大量のデータを落としているようです。1時間ぐらいかかっているような気がします。家の環境だと1Gぐらいだと10分かからずにダウンロードできるような気がします。

あとは、昔と同じようにインストールが始まります。なんとかディスクが必要なのは、リカバリディスクもないような状態の時だけみたいですね。めでたしめでたし。

 

でわでわ。 



2011年9月10日

Macの移行アシスタントも危険である

Macには移行アシスタントと言う危険な機能が付いています。多分Windowsではサードバーティが似たような機能を持っていたりするかもしれません。VMWareだと、今動いているマシンからVMのイメージを作れたと思うので、それも似たような機能かもしれません。

移行アシスタントは、今動いているマシンやバックアップをもとに別のマシンに復元してくれることです。基本的にはぼくは、スクラッチからやり直す方が好きで、後は自分のホームディレクトリをコピってくるだけです。でも、わけあって、MacBookからAirに乗り換える必要があって、と言うか自分のマシンじゃなくって嫁と子供のマシンなんですが、めんどいのでタイムマシンのバックアップから全部移行してみました。やっぱり便利です。5時間ぐらい放置しておけば、そっくり同じ環境ができあがっちゃいます。

そのあと、僕のAirのデータをもう一台のAirに移し替えるだけでした。こっちも5時間ぐらい放置しておくだけです。こっちは本当はホームディレクトリだけ復元したかったのですが、時間がなくってできませんでした。まあ、ATOKがデフォルトでオフになっていたり、App Storeから入れたモノが一部バージョンアップできなくって、一旦削除してからインストールし直しとか、そんなんはありましたが、まあ、大きなそうなトラブルもなく移行できました。



2011年9月5日

iPhoneとMacのVPNの設定

忘れそうなのでメモ。リンゴたちのVPNの設定。

iPhone

  1. [設定]から[一般] - [ネットワーク] - [VPN]を開く
  2. [VPN構成を追加...]で
    1. PPTPを選択
    2. [説明]に名前を書く(「オフィス」とか)
    3. [サーバ]にVPNのサーバ名を
    4. [アカウント]にVPNのユーザ名を
    5. [パスワード]にパスワードを。入力しないと接続のたびに聞かれるので、より安全になる。きっと。
  3. [設定]を開くと上から3つめぐらいに[VPN]がいるので、接続するときに[オン]にする。
  4. 接続中は、上の方にVPNって表示される

Mac(Lion)

  1. [システム環境設定] - [ネットワーク]を開く
  2. 左下の[+]ボタンを押す
  3. 表示されたダイアログで
    1. インタフェースにVPNを
    2. VPNタイプにPPTPを
  4. インタフェースの設定で
    1. サーバアドレスにVPNサーバのアドレスを
    2. アカウント名にVPNのユーザIDを
    3. パスワードを覚えさせたいときは、[認証設定]でパスワードでパスワードを入力
    4. 場合によっては[詳細]の[オプション]で[すべてのトラフィックをVPN接続経由で送信]にチェックを入れる
    5. [メニューバーにVPNの状況表示]にチェックを入れるとメニューバーにアイコンが出現する。ただし、アイコンの意味不明。
    6. アイコンをクリックして接続を選択すれば接続できるん。



2011年9月2日

Huluは危険である

世の中には危険なモノが沢山あります。そういう危険なモノには近づかないのがいいですが、もし間違って近づいて触れてしまうと、取り返しの付かないモノが沢山あります。怖い世の中です。そんな危険なモノの一つに、昨日からサービスインしたHuluがあります。こいつは危険でした。

動画のオンデマンドは、アメリカだといくつかあります。定額制で有名なものは二つあったと思いますが、Huluはその一つです。それが日本でサービスインしたのはうれしいです。値段はアメリカの2倍の値段の1500円ほどです。さて、これは高いのかやすいのか・・・。ワーナー・オンデマンドは海外ドラマが一本200円です。なので、一月7時間か8時間以上見るならHuluの方がお得になりますね。 定額であればそのぐらいは見そうな気もします。

さて、最初の一ヶ月は無料なので登録しました。コンテンツは、映画は若干古め、と言うか最新のものはありません。数自体もちょっと少なめですが、これは順次増えていくのでしょう。まあ、古めのものはHuluで見ればいいし、最新のものでどうしてもすぐに見たいモノはiTunesで買えばいいので、 棲み分けできそうです。

僕がHuluで見たかったモノは映画じゃなくって、海外ドラマです。Fringeはファーストシーズンしかまだなかったり、残念なところもありますが、他にも見たかったモノがあるので、十分楽しめそうです。しかも、普通の日本のドラマだと時間の無駄感がありますが、海外ドラマだと英語の勉強だと自分を納得させてしまえる危険があります。特に最近英語を使わないのでほとんど聞き取れなくなってきたし・・・。そんな名目をもって見続けることになります。

見るのは・・・、テレビで見たかったのですが、僕のiPadだとテレビに出力できませんでした。iPad2なら大丈夫かな?iPad2が欲しくなりますが、テレビは子供に占有されやすいので、iPadで見られれば十分です。もう少し大きなディスプレーだと、27インチのiMacがいるので問題なし。ノートPCは・・・。必要ないですね。まあ、家にいるときはそんな感じです。

さて、通勤時間が長いので、iPhoneで通勤時間に見れるか・・・?ちなみにSoftbankの回線じゃなくイーモバイルです。東京に近づくと画質はちょっと悪くなりますが、ちゃんと見えます。バッファリングされるので、一分ぐらいのトンネルの中も途切れません。そうは言っても回線の状況で一瞬止まることはありますが、すぐに復活します。十分モバイルでも楽しめます。場所を選ばないと、楽しみ方、じゃなくって英語の勉強の仕方が広がります。

まあ、どうでもいいところとしては、途中まで見ていたモノはデバイスを変えても続きからすぐ再生できるとかあります。直接再生できるテレビとかもあります。一瞬、買ってもいいかな?と思っちゃいましたが、買うことはないでしょう。

まあ、海外ドラマを見始めて、そのドラマは全部で100話ぐらいあるので、うーん、いつ見終わるんでしょう?英語の勉強なのでがんばらないといけないです。でも、怖いです。Huluは危険ですた。 

 

でわでわ 



2011年9月1日

スマフォ用のJavaScriptライブラリ

以前、どこかで書いたかもしれませんが、会社の製品では、WebアプリケーションのJavaScriptのライブラリはGoogle Closureを使っています。もっと前はprototypes.js + なんかというとても素敵な感じでした。それが、一年ほど前にGoogle Closureを使うように変更されました。会社のもう一つのものは、Extを使っています。これは豆知識です。Google Closureを選択するときに検討したモノがjQueryです。ExtはIE6とかあり得ないブラウザでのパフォーマンスなどの問題で選考から落ちました。

JavaScriptのライブラリに求めていることの一つがUI系のウィジェットの充実です。jQuery UIも充実度は十分だったのですが、成熟度・APIの安定度で不安がありました。かっこいいUIのウィジェットもjQueryには沢山ありますが、安定した開発体制なのか僕は疑問でした。コアの機能としては十分でした。

Google Closure?これは、Googleの製品に使われているだけあって、安心感があります。ウィジェットも安定・充実しています。コードもおいやすくとてもいいライブラリです。ただ、使い続けていると、世の中の流れはhtml5ですがClosureはその流れに取り残されている感があります。NotificationのAPIやファイルのドラッグ&ドロップ、ローカルストレージなどの機能がないだけじゃなく、今後の方向性がよく分かりません。分かっていないのは僕だけかもしれませんが。ただ、このあたりは我慢できます。

もう一つの大きな不満がモバイル対応、と言うかスマフォやタブレットなどのデバイスへの対応です。このあたりの対応が全くないです。jQuery Mobileなど注目を浴び始めているのに・・・。まったく対応していないかと言えば、ローレベルなところでは痕跡はあるのですが、それだけではうれしいことはありません。
かくして、モバイル用のJavaScriptのライブラリを調べることになったのです。前置き、長!


モバイル用のライブラリですが、それほど種類が多くありません。簡単に紹介。と言うか、一覧。

jQuery Mobile: このヒトはもう説明の必要がないくらい有名人になってしまいました。今のところ、僕が求めているモノと方向性が少し違う気もします。

jQTouch: このヒトは、会社の製品をはじめてiPhoneに対応させる秘密プロジェクトをこっそり立ち上げたときに@m2ymが検討していました。でも、Sencha Touchに開発元が移行したので、僕の中では終わったプロジェクトです。

Sencha Touch: jQTouchからExtベースで書き直されたモノみたいです。欲しい機能は一通り持っていて、サイズもコンパクトらしいです。最有力候補の一つです。

Web 2.0 Touch: こんなぐらい思い切ったものは、需要があるところにはありそうです。

これ以外にはあまり見かけませんが、もう一つの選択肢がGoogle Closureをモバイル対応させたものを作ることですね。本当はこれを一番やりたいのですが、ヒトがいません(リソースがない・・・)。やりたいヒトがいたら来てください。ちなみに、やるとしたらオープンソースで公開すると思います。

まあ、そんな感じですね。


2011年8月31日

パンダを見た


20110831.jpg まあ、いろいろあってパンダを見ました。上野にやってきたパンダです。そろそろ空いているって信じ込んでいました。

パンダのところは、子供用の入り口と大人用の入り口が分かれていました。大人用は2メートルほど離れたところからしかパンダをみれません。子供用はもうちょっとだけ近くで見られます。

大人用の入り口は空いていますが、子供用は込んでいてすごく並んでいます。多分30分ぐらい並びました。パンダの前に来ると、写真を一枚だけ撮ってさっさと出て行け、って案内しています。まあ、混んでいるので仕方ないとはいえ、写真一枚って…。パンダを見るためのはずなのに、パンダと記念撮影って…。

一頭は写真のように笹を食っていました。もう一頭は机みたいなものの前に座ってだれていました。まあ、子供は喜んでいたのでいいとします。コアラと違ってパンダは動くのでいいです。コアラは動かないので、見ていてすぐにあきます。

僕はヒョウを見たかったのですが、上野動物園にはいないようです。残念。そのかわり、ベンガルヤマネコとその子供がいました。これはよかったのですが、暗いところにいたので、iPhoneじゃ撮影できません。悲しすぎます。思ったより小さくって、猫でした。ヤマネコなので、当たり前か…。もうちょっと大きなやつを想像していたのでちょっとだけ残念です。 

ということで、夏の動物園は暑いのでやっぱりお勧めしません。

 

でわでわ 



2011年8月30日

pycon.jp 2011に行った

世間の流れ的には民主党の代表戦で次期首相があついかもしれませんが、先週の土曜日はPyCon.jp 2011がありました。僕の働いているアリエルもスポンサーの一つになっていて、それで行ってきました。正直に言うと、土日は家でのんびり子供と過ごしたいですが、たまにはそういうのもいいかもしません。

家庭があると、週末にずっと外出するのは大変なので、夕方には帰路につきました。最後まで入れなくてごめんなさい。まあ、その中でも、あまり会わない人とか、時々会う人とか、ちょっとお話ししたり、挨拶したりでした。発表の内容はいろいろな人が感想を書いているので、そっちをみてください。

主催者側の発表によると200人以上が来たそうです。無料のイベントならともかく、有料の週末のイベントにこんなに沢山集まるのはちょっとした驚きです。5年ぐらい前であれば、イベントに顔を出す人はだいたい顔見知りだったと年寄りっぽく誰かが言っていました。年々イベントの規模は大きくなって知らない人も沢山いますね。

コミュニティが大きくなると、少し寂しさも感じます。 

それから、別の誰かが「女性が沢山いる」って言ってました。僕は数人しか見かけなかったのですが、言語のイベントはむさ苦しい男たちの集まりって偏見がありましたが、時代の流れでしょうか?

楽しいイベントだったのですが、やっぱり週末は家でのんびりしたいです。

 

でわでわ 



2011年8月27日

スマフォって結局暇つぶしの道具だよね

スマフォというか、iPhoneは日本で発売されてから使っています。とても便利なおもちゃです。道案内はしてくれるし、すぐに調べ物はできるし、写真をとったらすぐに他の人と共有できるし・・・。そうやって、便利に楽しく使えますね。つまりは情報を見るための道具です。

とっても便利で楽しいですが、それだけです。それで何かが大きく変わったという訳ではありません。情報を受け取るのが多少早くなったり、道に迷いにくくなったり・・・。えーと、iPhoneに道案内させていてもたまに道に迷うので困ったものです。

で、結局暇つぶしの道具でしかありません。僕は電車に乗る時間がそこそこ長いので、その間に使いますが、もし、移動時間が短かったり、通勤に車を使うような生活だったら、スマフォなんていらないかもです。

まあ、それというのもiPhoneと一緒にMacBook AirとPocket Wifiがあるからかもしれません。PCでもネットワークが常時使えて、PCだとコードを書いたり大きな画面で調べ物をできたり・・・。調べ物はどうでもいいですが、コードを書ける環境というのは大きいです。PCがあればやりたいことがすべてできるので、iPhoneがいらなくなり始めたのかもしません。

まあ、ちょっとした隙間の時間つぶしには最適なツールですがね。時間つぶしのツールを使うのをありがたがるのもどうなのかな?って。

 

そと、雨が凄い・・・・。

 

でわでわ 



2011年8月26日

周回遅れのスマフォ

ジョブズがCEOを辞任したとかで世の中を騒がせていますが、世間は移ろいやすいモノです。そんな中、僕の知り合いの40才を目前にした開発者が最近、「スマフォでモバゲー」と叫んだかどうかは分かりませんが、Andoridのスマフォを買いました。彼は絶対に買わないと信じていたので、これほどショックなことはありません。使いこなす、と言うか、文字を入力できるか、とても心配です。

それは、先月のことでした。いきなり「Android携帯を買おうと思っているんですけど、何がいいですか?」っと。僕は一瞬、耳を疑いました。彼は、スマフォどころか携帯すら持ったことがありません。どんな心境の変化があったのかは分かりません。まあ、普通の人にそんなこと聞かれても興味がないので、なんでもいいでしょ、と答えます。しかし、今回は違います。

「最近のAndoridはいろいろできます。 テレビも見れるし、おサイフケータイも使えます。それらの機能をもった最新式を買いましょう」とアドバイスしました。僕はiPhoneのほうが好きですが、自分でAndroidを買うとしたら絶対に買わないスペックです。彼はテレビが見られることに食いついてきました。

お昼ご飯が終わった後に、近くのショップに行って物色しました。販売のおねーさんが、「今持っている携帯は何ですか?MNPをすると端末代がやすくなります」とか説明すると、彼は「携帯は持っていません」って。おねーさんは一瞬不思議そうに彼を見てから、ありえない、っていう笑みを浮かべたのを僕は見逃しません。いろいろ、機種について彼は質問をしているようです。3Dカメラが付いているのを僕がすすめると、「目が疲れる」と言って却下されました。ろっ、ろうが○×△。

結局その場では買わずに、週末にこっそり買ったようです。今、一体、何に使っているか興味があります。時々、Googleの音声認識でちゃんと認識してくれない、って嘆いています。

スマフォのお話はまた、続くかも。 

でわでわ 



2011年8月25日

チケットの数とモチベーション

昨日の夜は島田紳助の突然の引退でびっくりしました。まあ、引退はどうでもいいですが、引退の理由とか警察からの証拠とか、陰謀論好きにはたまらないネタですね。そんなゴシップが飛び交う中、数ヶ月前に会社にやってきたヒトが夏休みから復帰してきました。

彼は初めてちょっと大きめの機能を任されて、わくわくドキドキで開発していました(僕の主観)。夏休みから帰ってくると、その機能に関するバグ報告が沢山です。ちなみにその機能に集中できるように、それ以外の彼が持っているチケットはこっそり直してあげたり、他の人にふり直すなりしておきます。その機能関係のものも、まあ、それなりに。

それでもそこそこの量のチケットになります。僕の場合、一度に把握できるチケットの量って10個ぐらいです。適当にカテゴリ分けできればもう少し対応できますが・・・。簡単なチケットも難しいモノも粒度は関係なく数が重要な気がします。なので、そのぐらいにチケットの量をどうコントロールするかです。

チケットを消化するときに、重要なものからやるのが大事です。重要じゃないものは後回しにできます。でも、数が多すぎると無力感にさいなまれます。なので、簡単なものなどを、適当なタイミング(気分転換とか、特定の日とか)で消化するのがよいです。見かけ上の数が減ると安心感が得られますが、それ以上に、こんなにやれた、っていう達成感が得られて、難しいモノもモチベーション高く対応できたりします。まあ、難しいからそれ自体でモチベーションがあがるって人もいますが・・・。

まあ、どうやって楽しんで気分よく仕事できるか?じゃないかな。

初めて任された機能が自分の手で製品になっていくのは楽しいので、横からニタニタしながら眺めています。 

でわでわ 



2011年8月23日

2対8の機能のうちの2


何かの既に先行製品があって、その後を追うようなケース。

一番簡単なのはその先行製品のクローンを作ることです。外部仕様を借りてくることです。先行製品がすでに市場を開拓してくれているので、値段次第でそこそこの市場を狙えるかもしれません。ただし、クローンなので、機能的に同等レベルにならないといけません。そこまでの開発工数をどうするのか、っていう問題はあります。

クローンが10割の機能のうちの10割すべてを実装するのはコストがかなり高く付きます。まあ、それで売れる保証があればいいのですが、機能だけではどうしようもないこともあるので、売れる保証はありません。

ソフトウェアでよく言われる10の機能のうち、ほとんどのユーザは2割ぐらいの機能しか使っていない法則があります。それはおそらく真でしょう。でも、その2割がくせ者です。かなりの機能はすべて共通に使われレますが、各ユーザがどうしても欲しい機能がすべて2割の中に収まっているかと言えば、そんなことはありません。結局、最初は2割ほどで始めたソフトウェアもいつのまにか10割の機能を目指しています。それをソフトウェアの肥大化と言うのかもしれません。

ソフトウェアを2割の機能だけにとどめておくためには、一つだけ他には負けない素敵な機能、魅力があればいいってVCのヒトが言っていました。それが見つかれば幸せになれますが、簡単に見つかるものでもありません。

実験的にリリースしながら試行錯誤的にその機能を見つけるのもいいですし、10割の機能を実装するにしてもそこそこの収入を得ながら優先順位を付ける方法もあります。一気に全部をやらずに、ユーザの反応を見ながら軌道修正する方法です。かっこいい言い方をすればアジャイルです。後追いで新しい製品を作るならこの方法がいいと思っています。最初に2割の機能を作って、魅力的な機能を探す。見つからなくても、顧客の要望から優先順位を付けて機能を追加していくことです。10割の機能を作るときに、簡単に軌道修正できるようにしておかないと、永遠に先行製品とは対等に渡り合えないです。

まあ、最初の製品の機能スペックを考えるときは、どうやってその2割の機能を見つけ出すかです。それだけでもそこそこ大変です。どうやって、機能を削るか?ですね。

 

でわでわ。 




2011年8月20日

Time Capsuleをインターネットからのリモートディスクにしてみた


先日、我が家にTime Capsuleがやってきました。せっかく大きな容量をもっているので、インターネットからTime Capsuleにアクセスして大きなディスクを使いたいです。

Time Capsuleのディスクをインターネットから使うには、もうすぐなくなるMobileMeのアカウントをAirMac ユーティリティの手動設定の詳細のMobileMeから入力します。これで簡単にアクセスできるようになったと安心してはいけません。僕は安心してしまいました。そのあとに、ディスクっていうところを表示してWAN経由でディスクを共有をチェックしてあげます。これしないと、インターネット経由では見えませんでした。

 設定が終わるとMacの共有からTime Capsuleが見ているので接続してあげれば、めでたしめでしでした。

Appleのファイルやデータの同期(MobileMeね)は全く信用できませんが、これはMountするだけなので、多分、心配しなくてもいいんじゃないかな?と信じています。 

でわでわ 





2011年8月17日

今年のお盆の東名高速道路はどうだったか?

暑い日が続きます。夏です。夏と言えば、お盆と夏休みです。と言うことで、お盆に夏休みで実家に車で帰りました。今年から片道1000円はなくなってしまいました。それで高速道路はどうなんだろう?と、とてもわくわくしていました。

参考までに、去年は行きは大体9時間ぐらいかかりました。帰りは何故か混んでいなくって、とても空いていたので、休憩を入れて6時間ぐらいです。まあ、休日料金1000円だと1.5倍ぐらいの時間がかかっていました。

さて、今年はどうだったかというと、割とずっと空いていました。 11日に移動したのですが、ちょっと早かったせいなのか、1000円がなくなったせいなのか、工場などの節電のための夏休みの分散化のためなのか・・・。とにかく、わりとすいすい移動できました。渋滞があったところは、何も無くても時間帯によって渋滞するところだったり、横で工事をしていてそれで速度が落ちて渋滞になったところのようです。

高速料金は僕が利用する区間だとだいたい7000円ぐらいです。1000円に比べると高いです。でも、渋滞している時間を時給に換算するとそんなに高いって言うほどでもないんです。まあ、1000円で渋滞しないなら1000円の方がいいですが・・・。まあ、東北の方はかなり渋滞したみたいなので、値段がかなり効いているのでしょう。1000円になる以前のことはあまり思い出せません。

さて、車での渋滞がなくなるのはいいとして、その分、みんな移動しなくなっているはずですが、経済効果としてはどうなんでしょう?休日料金をなくせば、本当に税収が増えるのか、やっぱり、地方に落とすお金が減って税収が減るのか、教えてください。

でわでわ 



2011年8月11日

Time Machineにお願い

デジタルなデータは増加の一途をたどります。写真だけであればまだ、100Gぐらいでなんとかなるかもしれませんが、HDな動画を含めると数百Gにもなります。と言っても僕が持っているのは、実際は300Gぐらいです。

今まではバックアップは、rsyncなど複数のMacに同じデータを持たせて冗長性を高めていましたが、 僕のメインのiMacはまだディスクに余裕がありますが、ノートPCは256Gしかないのですでにバックアップとしての機能アー破綻していました。

失ったらどうなんだ?っていう疑問もあったりもしますが、やっぱりバックアップはとっておいて失いたくはありません。NASを買ってそこにバックアップすればいいのです。Macなので、Time Machineを使って何も考えなくてもバックアップがとれているのがうれしいです。もう、40前なのでコマンドでちまちまとか、がんばって環境を整えるとかは嫌です。ということで、NASでTimeMachineが使えるものと言うことで、BUFFALO ネットワーク対応HDD LinkStation 2.0TB LS-CH2.0TL
があります。この人を使えばよさげです。でも、Liionさんと一緒に使えないとか言う情報もあります。家の無線LANのルータは調子が悪くなってきて、一月に一度ぐらいはリブートしないと使えません。ということ、Time Capsuleを買いました

セットアップは楽ちんでAir Mac ユーティリティというのを使えば簡単にセットアップが終わってしまいます。でも、悲しいことにアクセスポイントの名前が「hogeのネットワーク」みたいに、デフォルトだと日本語がはいります。Windowsからみると文字化けするので名前は英語にあとで修正しました。

すぐにバックアップがとられ初めて、満足満足。それから、ネットへの接続が早くなった気がします。前のルータもスループットは悪くなかったのですが、レイテンシーが悪かったのかもしれません。まあ、これで安心です。




2011年8月10日

MacのHomebrewでpip/virtualenvが使えるまで

最初にセットアップしてから、実は最近はあんまり、Homebrewのパッケージのアップデートかはしてません。めんどいので。でも、油断をしてアップデートしたらPythonのバージョンが上がってしまいました。まあ、それはいいのですが、そしたらvirtualenvとか使えなくなってしまいました。ちょっと悲しいです。brew install pipってしてもpipをインストールできません。easy_installを使ってインストールしろって、冷たく突き放されます。easy_installはPythonと一緒にインストールされたらしいので、
ln -sf /usr/local/share/python/easy_install /usr/local/bin/easy_install
ln -sf /usr/local/share/python/easy_install-2.7 /usr/local/bin/easy_install-2.7
とシンボリックリンクを張れば使えるようになります。でも、easy_installでインストールするのはpipだけなので、シンボリックリンクは必要なかったかも。

easy_installさえ使えれば、easy_install pipでpipをインストール。なんでも/usr/local/share/pythonの下にブツがあるらしいです。pipもPATHのある日のあたるところへ。
n -s /usr/local/share/python/pip /usr/local/bin/pip
ln -s /usr/local/share/python/pip-2.7 /usr/local/bin/pip-2.7

これで、pipが使えます。pipさえ使えれば、pip install virtualenv virtualenvwapperでvirtualenvをインストールします。/usr/local/share/pythonの下のvirtualenvも日のあたるところへ。それから、.bashrcとかにsource /usr/local/share/python/virtualenvwrapper.shしておけばめでたしめでたし。

でわでわ

マックのMade for you


僕はマックが好きです。味はまあ、それなりですが、食べても手がバッチ区はなりません。高級なハンバーガーはやっぱりおいしいですが、それはもう、ファストではありません。

さて、マックはやっぱり子供たちも大好きです。で、ハッピーセットなるおもちゃ付きのセットをほしがります。携帯クーポンだと、チーズバーガーのセットがハンバーガーのクーポンなしのセットよりやすくなります。そして、残念なことにハンバーガーのセットのクーポンはありません。

うちの末の娘はハンバーガーは好きですが、中に挟まっているチーズは食べません。 なぜ食べないかはよく分かりません。でもハンバーガーのセットを注文すると高くなると言うジレンマがあります。

そこで、チーズバーガーのセットのチーズ抜きを注文するのです。マックって、追加の具を入れては貰えませんが、今あるものから余分なものを抜き取ってはくれます。それが、Made for youです。チーズバーガーのチーズ抜きなので、ハンバーガーがそのまま出てくると思ったら大間違いです。チーズバーガーの袋に入って、Made for youのシールが貼ってあります。ハンバーガーをそのまま出せばいいのに・・・。

昔外国のベジタリアンをマクドナルドに連れて行ったときに、チーズハンバーガーのハンバーグ抜きをやってきて、このサービスを知りました。

娘はハンバーグすら食べないこともあるので、パンだけを注文してもちゃんとパンだけで出てきました。このときは店員さんが何回も確認して笑っていました。

マクドナルドも中々侮れません。 




2011年7月28日

ライオンのスクロール方向ぐらい慣れるモノ・・・

MacOS Lionがリリースされて一週間ぐらいが立ちました。まあ、はるか昔のような気もします。オタクなのでリリースされるとすぐにインストールして使っています。Lionになって、二本指でのスクロール方向が以前と反対になったのはみんな知っています。設定画面ではこの方向が「ナチュラル」って呼ばれています。スマートフォントやタブレットからすると自然な方向ですね。このスクロール方向はすぐになれると思ってそのまま使っていました。まあ、数日で慣れました。Lionにしていない(できない)悲しい人たちは、Better Touch Toolを使ってスクロール方向をライオンにあわせて、自分を慰めているようです。

あすなろブログのよこたんは何故かMac Book Airを買ってしまいました。彼にはWindowsが似合っていると思っていたのですが、残念です。彼には是非とも、スクロール方向はナチュラルじゃない方を使って欲しいとというか、そっちの方が似合っていると思います。

さて、Appleのこうした思いっきりの良さは凄くて見習いたいです。でも、実際にはこうしたことは中々できません。既存のユーザを見捨てるとか、互換性を簡単に棄てちゃうとか言うけど、そんな簡単な決断じゃないです。きっと。

で、見習いたいですが、見習えないです。Windowsだったらこうした変更は受け入れられないと思います。Appleの文化というか、それを使っている今のユーザたちだから何とかなっているんじゃないかな?と。って考えると、思い切った変更ができるかどうかって、製品がユーザの方を向いているかとかじゃなくって、ユーザがその製品をどれだけ好きなのかに依存しているのかもね。なので、思い切った変更ができないのは、ユーザに十分に愛されていないということかも。

とは言っても、自分の意思とは関係ないところで使用を強制される状況では愛なんて持てるはずもないのかな。 

 

ちなみに、ライオンさんはもう少しがんばって作り込んで欲しかった・・・。 

でわでわ 



2011年6月23日

tomcat7のEL式でsomeObj.class.name eq "soma.classname"でエラー

Tomcat7がでてしばらくたつので、そろそろ安定し始めるころかと思います。と言っても、実際に安定しているかどうかはともかく、そう信じ込みたいころです。もっと言えば、今から検討し始めるので、半年後に安定していればいいのですが・・・。ちなみに、僕はJavaはあんまり好きじゃない上に、ばかでかいTomcatとよりコンパクトなJettyを推しているのですが、会社の「いわがが」こと、id:kirisにjettyの検討をお願いしてもう、二年近くたちます。彼の知り合いの人は、是非「仕事をちゃんとするように」としかってあげてください。

どうでもよい前置きはこのぐらいにして、Tomcat7で会社の製品を動かすとJSPのEL式でsomaObj.class.nameとオブジェクトのクラス名を取得しようとしているところでエラーがでます。一言でいうと、会社の製品が全く動きません。ログには、

org.apache.jasper.JasperException: /WEB-INF/jsp/some.jsp (line: 4, column: 509) "${someObj.class.name eq 'java.lang.String'}" は無効な式を含んでいます: javax.el.ELException: The identifier [class] is not a valid Java identifier as required by section 1.19 of the EL specification (Identifier ::= Java language identifier). This check can be disabled by setting the system property org.apache.el.parser.SKIP_IDENTIFIER_CHECK to true.

と出ています。ログを見れば対処方法がわかりますが、org.apache.el.parser.SKIP_IDENTIFIER_CHECKをtrueにして起動すればいいようです。以前のバージョンのTomcat6ではこの値がtrueになっていて、デフォルト値が変わったらしいです。経緯はしりませんが、パフォーマンスかセキュリティの事情なんでしょう。

ということで、linuxとかmacであれば、

CATALINA_OPTS="-Dorg.apache.el.parser.SKIP_IDENTIFIER_CHECK=true"
export CATALINA_OPTS
./catalina.sh run

で動きます。Windowsは知りません。

2011年6月15日

RabbitMQのJavaクライアントをdisる

会社のプロダクトではRabbitMQを使い始めています。製品自体はJavaで作られているので、当然、RabbitMQへのアクセスはJavaのライブラリを使っています。幸い、本家でもJavaのライブラリは開発しているようで、ありがたく使わせてていただいています。でも、でもです。最初に製品にRabbitMQを組み込んだのは「いわがが」こと、id:kirisです。彼はまじめそうなそぶりを見せながら・・・。これ以上書くと怒られるので自重します。そして、このJavaのライブラリについてdisりまくります。挙げ句の果てに、「もう、こんなライブラリ、使っていられません!スクラッチから書き直します。nioで非同期処理して、結果はconcurrentのfutere使って取り出せるようにします。○×△※・・・」残念ながら、彼が言ったことをそのまま、インターネットで公開できないのが残念ですが、あまりにも・・・。さて、今回は彼がdisりまくったことのまとめです。

RabbitMQというか、MQのプロトコル自体のお話は以前書いたので、そっちを見てください。ある程度プロトコルを知っている、という前提です。RabbitMQのライブラリはcom.rabbitmq.clientのパッケージの中でインターフェースが定義されています。ネットワーク周りを中心に言うと、アプリケーションは最初にConnectionオブジェクトを作ります。ConnectionオブジェクトはTCP/IPのコネクションを管理するヒトです。仕様としてConnectionオブジェクトはスレッドセーフです。Connectionオブジェクトが実在するコネクションを管理するのに対して、ChannelオブジェクトはConnection上で論理的な接続を管理します。この辺りの概念はちょっとややこしいですね。実際にアプリケーションがMQとやりとりをするのはChannelオブジェクトを通してです。Channelオブジェクトもスレッドセーフということになっています。

アプリケーションに近いところから見ていくと、Channelの実装は、implの下にあるChannelNです。ネットワークへの送信だけにフォーカスすると、ChannelNの基底クラスのAMQChannelにある、transmitメソッドです。この中でchannelに対してsynchronizedしているので、channelがスレッドセーフと言うことになっています。さらにその先の、quiescingTrans内でネットワークの送受信が行われるので、channelを複数スレッドで使い回してそこそこの書き込みを行うと、ここの同期でブロックされます。なので、Channelって実は、書き込みがそこそこある場合は、スレッド間で共有しない方がいいです。

それじゃ、もう少しおっていきます。その後の処理はAMQCommandのtransmitメソッド中に入っていきます。このメソッドでAMQConnectionオブジェクト、一番最初に出てきたConnectionの実体ですね、その人のwriteFrameメソッドをコールして何回かに分けて書き込みを行っています。AMQCommandはAMQChannelのtransmitをコールするごとに作られたりするので、アトミックです。なので、AMQChannelのsynchronizedが本当に何を守ろうとしているのか、微妙です。しかもtransmit自体はvoidなので、送った後に何かする訳じゃないです。

で、面白いのはここじゃないのです。AMQConnectionの中で実際にTCPのコネクションを管理しているわけではなく、FrameHandlerが管理しています。正確にはこの人はインターフェースで、実体はSocketFrameHandlerです。たぶん、TCP/IPだけじゃなくUnixソケットとかをあつかう壮大な計画の一部なのでしょう。
複数のChannelで複数のスレッドからConnectionオブジェクトのwriteFrameが呼び出されます。なので、当然ネットワークへの書き込みは同期しないと悲しいことになります。SocketFrameHandlerのネットワークへの書き込みは、writeFrameです。このヒト、outputstreamをsynchronizedしています。えーと、ChannelでブロックするのでChannelを複数スレッドで使い回さないようにして、スレッドごとに一つのChannelで処理をしようとしても、悲しい現実につきあたります。結局複数のスレッドで書き込みを行っても、最終的に実際のネットワークへの書き込みでブロックされちゃいます。もっと悲しいことはvoidで結果を意識していないにもかかわらずです。これをサーブレットのRequstのスレッドの中でやると、負荷が集中し始めると世界がとまるんですねん。

本当にスループットを得たいなら、スレッドごとに一つのコネクションを管理する必要があります。でも、それはちょっとやり過ぎじゃ?僕たちの欲しいモノはブロッキングしないモノです。まあ、解の一つはスレッドを一つ作って、その中でゆっくりとデータを送信することです。そして、もう一つがid:kirisが作っているはず、僕はそう信じている高速でノンブロッキングなライブラリを待つことです。

でわでわ

2011年6月9日

IronPythonって速かったのね

普段はあまりWindowsは使わず、ほとんどの作業はMacとUbuntuで済ませています。積極的にWindowsを使う理由も見当たらない生活を送っていました。でも、動作確認をするためだったり、間違ってボタンを押してしまったりしてVMの中にいるWindowsが立ち上がってしまうことがあります。今日は間違ってVIrtualBoxの中にいるWindowsを起動しちゃいました。ついでなので、IronPython2.7をインストールして先日pypyで遊んだときのフィボナッチで計測しました。

結果はこんな感じです。
再帰するほうでは、2.2倍もCPythonより速いです。Javaには及びませんが、3割ぐらい遅くなる程度です。

ループ版では再帰版ほど速度差はです、1.4倍程度速くなりました。みんなが大好きなJavaとの速度差ですが、ループ版でも3割ぐらいの落ち込みなので、わりと安定したスピードです。

まあ、これらの結果をどう見るのかは微妙ですが、Windows環境ではCのライブラリを呼び出さない限り、IronPythonを使うのがいいのかな?

でわでわ

2011年6月6日

Re-render Tweet button via JS

stackoverflowの記事にあるように、以前はTweetButtonがあってJavaScirptで後からロードしたHTMLに対してTweetButtonをレンダリングすることができました。でも、気がついたらこれができなくなっています。@anywhereっていうライブラリを使えば、Tweet Boxっていうのは表示できるらしいですが、Tweet Buttonは表示できません。ちなみに僕はTweet Boxが何なのか知りません。で、いろいろ調べると、情報がありません。以前の方法でやるのはあきらめます。Tweet Buttonを表示するのはJavaScriptでやる方法とiframeを使う方法の二つがあります。JavaScriptを使うのはあきらめたので、iframeでがんばります。

JavaScriptはtwitter-share-buttonというクラスを当てたaタグをボタンに変身させる技を使っていました。iframeを使う方はもっと簡単です。次のhtmlの断片で実現できます。

<iframe allowtransparency="true" frameborder="0" scrolling="no"
        src="http://platform.twitter.com/widgets/tweet_button.html?url=エスケープしたURL"
        style="width:130px; height:20px;"></iframe>

これをDOM要素にあとから追加していけば、TweetButtonがあとからあとからどんどん現れていきます。めでたしめでたし。
タイトルにvia JSとあるのに、JavaScriptが全然書いていないので、ちょっとだけ書くと、jquery使っていれば上の断片をfragmentっていう変数に入れているとして、
$("#どこかの要素").append(fragment)
ほら、via JSになった。

これ、http://twwweet.liris.org/で使っているんですが、まだ、本番環境には入れていない・・・。


でわでわ

2011年6月1日

CentOS 5.4にmemcachedとRabbitMQをインストールするメモ

「CentOS 5.4にmemcachedとRabbitMQがインストールできません」って泣きつかれたので、数年ぶりにRedHat系のLinuxを触りました。で、CentOS 5.4にmemcachedとうさぎ年なのでRabbitMQをインストールするまでのメモです。

CentOS 5.4はServerとしてインストールしました。理由はGUIはいらんから、というだけです。以下、めんどいのですべてrootでの作業です。
インストール後、何はともあれ、「yum update」します。次にRPMForgeのパッケージを入れられるようにします。
curl -O http://apt.sw.be/redhat/el5/en/x86_64/rpmforge/RPMS/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
rpm -ivh rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm

それではmemcachedです。最近何かとはやりのstackoverflowのお告げによると
yum --enablerepo=rpmforge,rpmforge-extras install memcached

とインストールします。これだけです。

次にうさぎ年のRabbitMQです。まずは、Erlangをインストールします。RabbitMQのサイトによると、素の状態で入るR12Bは遅くてつかいものにならないので、最新版を入れろって書いています。なので、
wget -O /etc/yum.repos.d/epel-erlang.repo http://repos.fedorapeople.org/repos/peter/erlang/epel-erlang.repo
yum update
yum info erlang
yum install erlang

として、最新版っぽいヒトをインストールします。yum infoによるとR14Bって言うのがインストールされました。次に、RabbitMQのRPMを落としてきて、インストールです。
curl -O http://www.rabbitmq.com/releases/rabbitmq-server/v2.4.1/rabbitmq-server-2.4.1-1.noarch.rpm
rpm -ivh rabbitmq-server-2.4.1-1.noarch.rpm

終わりです。難しくないですが、Erlangのインストールにとっても時間がかかります。まあ、そんな感じ。


でわでわ


ちょっとどうでもいいことでは、SRPMのビルドの仕方。
yum install rpm-build
yum install gcc

として、ビルド環境を整えてから、「rpmbuild --rebuild なんとか.srpm」ってします。

2011年5月31日

今更ながらcookieのあれこれ

cookieについて初めて知ってからもう、10年以上経っていますが、分からないこととか、忘れてしまっていることが沢山あって、とても楽しいですね。さて、そんなクッキーですが、お仕事でいろいろやっていると、あるWebアプリケーションから発行されるクッキーがどんどん増えていく現象がありました。そのWebアプリケーションは自分たちの製品じゃないのですが、自分たちのアプリケーションと同一ドメイン上で動きます。それで自分たちの製品のクッキーが追い出される、っていう現象がでていました。まあ、そんな現象はどうでもいいのですが、それでクッキーってどういう単位で保持されて、どれくらいのサイズが限界なんだろう?っていうことで、調べてみました。

今回調べたブラウザはIE8です。他のブラウザはIE8より制限が緩いので上限にぶちあたるのに時間がかかるので・・・、という消極的理由です。いずれにせよ、制限があるのは事実です。ということで、サーバのコードはいつものようにgithubにいます。サーバは何も考えずにFlaskでかいちゃったあとに、なぜ、標準ライブラリだけで書かなかったんだろう?と反省するも、めんどいのでそのまま。

さて、IEでの結果ですが、クッキーを50個セットしたあとに、次からは古いものから順番に追い出されていきます。サイズ制限もあるはずですが、今回は、それにひかからなかったです。「クッキーの個数の上限」という記事に詳しく書かれていますね。それによると、ドメイン、ホスト単位で数の上限があるようです。僕が試したときにも同じでした。pathを指定すればその単位で個数を制御できると思っていたのですが、違っていました。

各クッキーのサイズ制限については、4kか余裕をみて5kぐらいの制限がありますが、そんなでっかいものはそうそうセットしないので、しらべてません。

というわけで、今更ながらクッキーを調べてみた結果です。

でわでわ

※ クッキーを増殖させるWebアプリって、とってもキモイですが、そんなことは今は言わないであげてください。

2011年5月28日

VisitorsでApacheのログ解析

最近はそれほどログ解析に興味はありませんが、時々、ログを見てみたい時があります。昔はanalogやawstatsを使っていました。どう設定していたかは覚えてないですが、そこそこめんどうだったと思います。時々見たいだけなので、もっと簡潔やりたいとおもってググるとVisitorsと言う人がいます。Gigazineでも使っているとか・・・。と言うことで、設定してみました。

graphvizを一部使うようなので、homebrewでインストールしておきます。次に公式サイトから最新版をダウンロードします。最新版は0.7です。tarballをダウンロードして展開して、makeをするだけです。makeだけ?やっぱりmakeだけです。シンプルすぎますねwww。./configureとかないんですね。ビルドが終わると./visitors access_log > report htmlとすれば、htmlで出力されます。いろいろオプションがあるようです。
./visitors -A --prefix http://servername > report.html
のようにすれば、すべてのオプション付きでレポートされます。graphvizが使われるのは、転送量などをグラフで出力するためみたいです。
動作自体はとても高速で、簡単に使えるのがいいですね。

でわでわ

2011年5月27日

mod_wsgiをセットアップしたときのメモ

最近はgeventを使ってコードを書いています。当然Webサーバもgeventをそのまま使っていました。今回もそれでもよかったのですが、久しぶりにフロントエンドにApacheをつかって、mod_wsgiを使ってPythonのアプリを動かしました。まあ、規模は極めて小さいですが・・・。ちなみに、今回って言うのは、この廃人養成サービス「Twwweet」のことです。で、mod_wsgiをセットアップしたときのメモです。サーバはubuntuのサポートが長いやつの最新です。

まずは、何はともあれmod_wsgiをインストールせねばなりません。いつもの「apt-get install libapache2-mod-wsgi」の召喚呪文を唱えます。召喚が完了すると、/var/www/の下にmyappっていうディレクトリをつくって、そこに自分のアプリを置きます。次に、/etc/apache2/mods-enabled/wsgi.confを開いて次の行を追加します。

WSGIPythonPath /var/www/myapps
WSGIRestrictStdout Off
WSGIDaemonProcess myapps threads=4
WSGIScriptAlias / /var/www/myapps/myapps.wsgi
<Directory /var/www/myapps>
    WSGIProcessGroup myapps
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>

なんだか、僕が昔使っていたときとかなり違っているような気がします。WSGIPythonPathで自分の作ったモノへPythonPathが通るようにするはずだったんですが、うまく動かなかったので、あとで、wsgiのファイルで変更しています。WSGIRestrictStdoutは、僕のコードはログをloggingを通して標準エラーに出力しているんですが、これをやると例外が発生しちゃうので、標準エラーにはき出してもいいように設定してます。
WSGIDaemonProcessはスレッド数や実行するユーザやグループを制御できます。WSGIScriptAliasで実行するスクリプトを指定しています。

/var/www/myappにもどって、そこのディレクトリにmyapp.wsgiを作って次のようにかきます。

import sys
sys.path.insert(0, "/var/www/myapp")

from main import app as application

sys.pathに追加しているのはWSGIPythonPathが動かなかったせいです。appはwsgiアプリケーションですね。

でわでわ

2011年5月20日

GAE for Goをセットアップ

GAE for Goがでたので、試してみました。Golangはとっても好きな言語ではあるんですが、まだ、それでちゃんとしたモノを作る、っていう気にはなれませんでした。僕はわりと言語には保守的なんです。でもGAE for Goがでたので、この用途にはちょうどいいかな?と。Google App Engineの日本語のサイトではGoの情報はまだ、でていません。SDKのリンクすら見当たりません。なので、英語のサイトをみます。

まずは、DownloadのページからGoogle App Engine SDK for GoをCPU/OSにあったものをダウンロードします。僕はMacの64bitです。GolangのWindowsの対応状況はしらないし、興味もありませんが、SDKはLinuxとMacしかありません。きっと普通の開発者ならWindowsなんて使わないよね、っていうことです。

ダウンロードしたモノを展開します。展開したディレクトリをみると、Golangのコンパイラと標準ライブラリが同梱されています。別途Golangの環境を整える必要はないのはすばらしいことです。もっと言えば、自分でコンパイルすることすら必要ないです。Pythonのように、コードを書けばすぐに反映されて実行されます。dev_appserverを再起動する必要がないです。GAE for Javaは全く興味がないので、どうなっているかは知りません。それからGAE上で使えるライブラリしか同梱していません。
GolangのGoroutineも使えるらしいですが、本当に"並列"には動作はしないらしいです。一つのスレッド上でタイムシェアリングのように動くだけです。

さて、僕のMacの環境ですが、.bashrcに次のように書いています。ごめんね、僕は未だにbashを使い続けています。若者は内緒です。シェルの中でgae-goってやれば、gae用にpython2.5と展開したgoogle_appengeへのパスをPATHにセットされます。わかりやすいようにプロンプトも変えてます(僕の昔からの流儀です)。

gae-go() {
 export PATH=/System/Library/Frameworks/Python.framework/Versions/2.5/bin:$HOME/proj/google_appengine:$PATH
  PS1='(gae-go) \W\$ '
}

テスト用サーバは「dev_appserver.py ディレクトリ」で起動します。プロジェクトの構成は
+ appname
   - app.yaml
   + appname
      - appname.go
      - somename.go
          :

のようにすればいいです。goのソースコードの名前は何でもいいんだけど・・・。golangではWebアプリケーションのフレームワークとしてコアパッケージのhttpを利用します。テンプレートもコアパッケージのtemplateを使います。テンプレートファイルは一番上のappname直下において、template.MustParseFile(template_file_name, nil)でロードして利用できます。
SDKのdemosの下にいくつかのサンプルアプリがあるので、それ見れば大体分かります。

開発するときに、基本的には明示的に自分でコンパイルする必要はないです。スクリプトの感覚で使えます。でも、GolangはJavaとかと違ってコンパイルが一瞬なので、やっぱり実行前に一瞬で分かるものはコンパイルして見つけておきたいよね。

ということで、やっと生きる道を見いだした感があるgolangでした。また、golangで遊べそうです。

でわでわ