開発環境を刷新したら、あまりに爆速・快適すぎて逆に不安感がすごい。

はてなインターンで頂いたお給料とギフト券は、この夏日本に帰って来た時にはまったく予定していなかった臨時収入なので、せっかくだから自分の生産性を上げることのために使おうと決めていました。


結局、何を買ったかというと・・・。。


まず、Realforceを買いました。これ、すごいよ。一日中ペーパー書き続けても全然手が疲れないよ。キーボードで人生観変わるとは創造だにしなかった。


次に電子辞書。日本に帰ってきてる間に買おうと思っていたので、丁度いい機会でした。Thesaurus入ってたらペーパー書くの楽だよなぁということで、そんな感じのを購入。


それから、プレゼン用のポインター。プレゼンがクラス毎に1,2個はあるので、持ってたら頻繁に使い道あるよな〜と。


そして、ディスプレイ。はてなの24インチモニターの快適さが忘れられず、あといろいろと平行して作業を進めなきゃいけない身としては大型のディスプレイ絶対必要だよね、ってことでひとまずリストに入れてみました。それで、適当にいーべいで探したら、中古で$200くらいだったので適当に購入。


いままで、12.1の小さなモニタか、CRTのモニタしか経験したことがなかった僕は、この大型LCDモニタの快適さに打ちのめされました。目が疲れない。前かがみになる必要がない。スクロールしなくても全体が見渡せる。本当にいいこと尽くし。


そしてそして、なんとなんと、遂にメインPCを買い換えました!!僕のパソコンのスペックの低さは、僕と関わったほとんどの方の知るところであり、度重なる皆様のdisのおかげでその切り返しの返答もテンプレート化してしまった感も既にあるんですが、遂に彼も勇退の日を迎えました。わ〜、パチパチ。


結局買ったのはThinkPad X61。スペックは前のPCと比較すると、
CPU: Pentium M 1.3GHz -> Core 2 Duo T7500(2.0GHz)
メモリ: 768MB -> 4GB (うち1GBはramdiskとして使用)
と劇的ビフォーアフターとなりました。あまりの変貌に僕自身うろたえています。メモリはギフト券が余ってたので、それを使って無駄に4GB積んでみました。Firefoxを立ち上げただけで、フリーズして30分動かなくなるなんてことがなくなったよ〜。すごいよ、iTunesが動くんだよ〜。


でもこれだけ一気に環境を変えて困ったことが一つでてきました。快適すぎることです。それによる不安感がすごい。今までだと、例えばFirefoxがうんうん唸って頑張って読み込みしてる間に『こっからあれしてこれしてこうやって』みたいに考えをめぐらせる時間がありました。


それが今の環境だと、『えっ、もう終わっちゃったの?えっ?えっ?ちょっと待って。いや、まだ心の準備が。てか、あれ?えっ、もう次?ちょっと、マジ待って。ほんと待って。』という状態です。まさに、今までトロッコに乗ってた少年が、ジェットコースターにいきなり乗るようなもんです。思考が追いつく暇も何もあったもんじゃありません。


ひとまず、当面の目標は、環境のスペックに自分の思考をできるだけ早くフィットさせることです。ただ、ポテンシャルはかなり向上したのを肌で実感しています。


人々がすなるといふ衝動買いといふものを、僕もしてみんとて今回生まれて初めてやりました。この機会逃したら絶対一生しないだろうなぁと思って。でも、いい機会だったけど、やっぱり僕には会わないかな。何だか、すごい後ろめたさがありました。結局、当初はインターンで頂いた分を全部充てる心意気で挑んだのに、10万円弱余ってしまいました。


もうこれ以上使うあてもないので、あとは学費に充てることにします。なんか個人のポテンシャルというかパフォーマンスって、自分の能力以上に環境にものすごく大きく左右されるんだなぁと、しみじみと感じる出来事でした。


これだけ生産性があがって浮いた時間で、一つ仕事を余分にこなせば、もうそれだけでペイするもんなぁ。そう考えるとコストパフォーマンス高いよなぁ。すごい世の中になったもんだ。

はてなインターンを終えて道が一つ開けた気がする日曜の朝・・・と書いてたら昼になってた

先日の金曜日にはてなインターンが終了しました。この目に焼き付けたのは、慢心することなく学び続ける一流のエンジニアの姿でした。そういった前向きなエネルギーに溢れる人達をきちんと見ておくことで、自分が目指すべき一本の道がくっきりと見えた気がします。きっと僕だって、これからもっともっと成長できる。そんな実感を得た4週間でした。


同世代のインターン生にもたくさん優秀な方がいました。そして大変刺激を受けました。中には僕のような平々凡々とした能力しか持たない者とは違う、稀有な輝きを放つ方もいました。その人が社会から評価を得られないならば、社会の方が絶対に間違ってる。そう断言できるほどの存在感でした。心から尊敬できる同世代の人を見つけることができ、その人の一挙手一投足を観察することができたのは、とても良い経験でした。


果たして僕は、彼らから得た刺激に見合うだけのものを彼らにもたらすことはできたのだろうか。そう考え始めると、首をかしげざるをえません。往々にしてベストを尽くしている状態における自己評価は、他者の自分に対する評価より低くなりがちであるとい言われます。たとえその言葉を鵜呑みにし、贔屓目プレミアムをつけてみたとしても、現在の自分と他者の貢献度の差の絶対的な隔たりを無視することはできませんでした。


ただ、それは悲壮的な色合いを持つ感情ではなくて、逆に彼らに対する憧れと尊敬の念を持って、前向きにそこにたどり着くべく行動を開始する前向きな意志として昇華できたように感じます。


# うーん・・・言ってることが抽象的でわかりにくい。
# 自分の説明の下手さに失望・・・。


今回のインターンでは、自分が待望していた機能の実装に携わることができて、そして無事リリースすることができてこれ以上ない喜びを感じることができました。それに加えて最後のおまけとして最優秀賞まで頂いて、恐縮する気持ちでいっぱいです。本当にありがとうございました。良い思い出になりました。


優秀な方々に囲まれて1ヶ月を過ごす経験を経て、自分の弱い部分や足りない部分など、目を背けてはいけない部分を直視することができるだけの強さを得たような気がします。そして逆に、自分自身の中に誇れる部分が存在したという感覚も得ることができました。自分の強さと弱さをきちんと切り分けることができて意識化に置くことができたという意味で、僕の今後の人生に確かな影響力を持つイベントとなったと確信しています。


はてなスタッフの皆様、1ヶ月間お世話になりました。はてなのような魅力的な環境で何の不安もなく、最大限の自分をさらけ出すことができたことが、自分自身の成長につながったと感じています。支えて頂いたスタッフの皆様には本当に感謝の気持ちでいっぱいです。


これからも、外から一人のユーザーとしてはてなを盛り上げていくことができたら嬉しいです。

はてなインターンでダイアリー下書き機能とその場削除機能作ったよー\(^o^)/

どもども。今日でインターンも最終日です。大変実り豊かなインターンになっています。


どうにか昨日、僕が所属するはてなダイアリーチームから、いくつかの新機能を出すことができました。


プレスリリース - 株式会社はてな
下書きを保存できる機能を追加しました - はてなダイアリー日記
はてなダイアリーAtomPubを公開しました(開発者向け情報) - はてなダイアリー日記
その場編集モードから記事を削除する機能をリリースしました - はてなダイアリー日記


僕のダイアリーをRSS登録している皆様すみません。ご迷惑をおかけしました。あのテストエントリーの山は、下書き機能やその場削除機能のテストだったのです。こんな辺境の地をRSS登録している人なんていないと思ってたんですよ。


そう。僕は下書き機能の実装をメインで担当しました。あと、その場のノリでその場削除機能も実装して公開しました。ええ、昔から自分自身欲しかった機能でしたので。おだてられて一晩でやりました。はてなのためならブタと比べられても恥ずかしくなんかないよ。ほんとだよ。バグ報告がいつ来るのかビクビクしてるよ。


AtomPubのほうはチームメートのid:hakobe932がメインで頑張って実装しました。はこべさん、ぐっじょぶ。
[はてな]AtomPub APIとか下書き機能とかをつくりました - はこべにっき ♨


あと、さまざまな所ではてなスタッフid:onishiに助けて頂きました。id:onishiのマルチコアでハイパフォーマンスなヘルプがなければ、今回の機能は実装できなかったと思います。本当にありがとうございました。


今回のインターンで、はてなダイアリーの内部を把握したことで、いろいろと夢が広がっています。公開されている範囲で、はてなの外からでもさまざまなことができるということに気づきました。たとえば、どんなことができるのか?

  • Hatena Diary + Greasemonkeyで・・・
    • CSSEZ for Hatena Diary
      • Hatena Diary上でリアルタイムにデザインをマウス操作で編集できる機能。イメージの挿入やカラーの変更、ベーステンプレートやレイアウトのリアルタイム変更などなど。
    • 下書き挿入機能
      • その場編集モードの下書き一覧から、下書きリストを呼び出して、formに挿入して編集。
    • その場編集モードにリッチエディタ。

等々。


要約すると、はてなダイアリーというのはよくできていて、既に大体の情報が今回公開したAPIなどを使うと取得できるのです。ですので、javascriptからでも、さまざまな機能拡張をすることができると。いい感じ、いい感じ。


そんな感じで僕もこのインターンが終わってからも、いろいろと外部からはてなダイアリーを盛り上げることができれば嬉しいなと思います。


そんな感じで、もうインターンが終わったかのような口ぶりになっていますが、まだまだ仕事はたくさん残っています。ひとまず、今日は下書き機能のバグフィックス祭りが開催されるのではないかと覚悟しつつひやひやしています。そう。お家に帰るまでがインターンです。

はてなインターン参加中の文系男子が空気を読まずに本音を書くよ

# インターン参加者のレポが少ないと嘆くid:naoyaid:onishiの会話が横耳に・・・じゃなかった、
# はてなインターン関連の記事を挙げればほっとエントリに入ると聞いて・・・でもなかった、
外向けのはてなインターンレポート(はてなインターン1週間のまとめ - Gemmaの日記,http://eighteentillidie.com/2008/08/entry-919.html)が賑わっているようなので、この辺境の地でひっそりとはてなインターンに関する本音を書きます。


大学で政治学を学ぶバリバリ文系の僕が、はてなインターンに参加しているわけですが、実際のところインターンってどんな感じなのだろうと気になる人も多いでしょう。専門的な知識がほぼ皆無な僕が、一般ぴーぽーから見たはてなインターンを紹介するのもまあいい感じでしょう。


たとえば、「なんで毎日毎日講義やってるんだ」問題について。これは、まさに僕のようなプログラミングのabcも知らない馬鹿者が2週間でプロダクトレベルのコードをひとまず書けるようになるためですよ。昨日も夜中2時くらいまで残って課題やってたのは、ええ僕ですよ。


もう来週からチームに配属されてプロダクト開発が始まりますよ。僕のコードがプロダクトに入っちゃいますよ。リリースしちゃいますよ。そもそも初日でOOPに躓いたのは内緒ですよ。viを初めてきちんと使ったということは心に閉まってますよ。周りは優秀な人だらけでしかも優しく教えてくれて助かりますよ。はてなの人は夜中まで残って課題やる僕に付き合ってくれますよ。質問攻めでも嫌な顔一つしませんよ。はてなに来てドクターペッパーを一日何缶も飲んでますよ。オフィスランチおいしいですよ。京都は美人が多いですよ。


はてなインターンに参加することが、参加者にとって暇つぶし以上のものになるのはほぼ間違いないでしょう。むしろ得るものが多すぎて、そして何もリターンを返せていない自分に辟易して凹むことは間違いないでしょう。


1ヶ月のホテル代と往復交通費に加えて給料も出してもらってるし、毎日のカリキュラムは濃くて勉強になるし、オフィス環境は超快適だし、インターン終わって自分のウェブアプリ開発にすぐ応用できそうな即戦力的知識のオンパレードだし・・・と、はてなが僕に与えるものと僕がはてなにもたらすものの差がありすぎて恐縮せざるをえません。なので、後半2週間で少しでも多くはてなに貢献できるように頑張りたいと思わずにはいられません。


# これがはてな流の、ソフトパワーでエンジニアを縛る手法か!


はてなインターンの何がすごいかって、ウェブアプリ開発に必要な知識を網羅的に学べるところですよ。一人で学ぶのとはてなで学ぶのじゃ、やる気が違う。モチベーションが違う。プレッシャーが違う。


たとえばオブジェクト指向やO/Rマッパなんかの基本的なことはいいとしても、大規模な運用を前提とした時に必要とされる知識なんていつ学びますか?JSの知識はありますか?デザインはそんなしょぼいのでいいんですか?ASは終わったと思い込んでいないですか?フレームワークの使い方間違ってませんか?非効率的なオレオレ実装に走ってませんか?自分のプログラミングの最高速度を測り間違えていませんか?人気ウェブサービスを自分でも作りたいとは思いませんか?


そんな問いが頭の中を駆け巡ります。答えははてなインターンで。個人で数百万UU/monthとかのウェブサービス作ってみたくないですか?はてなインターンにはそのヒントが散りばめられています。実際にその規模のウェブアプリケーションを運営しているのをこの目で確かめるのは、その実現性を目に焼き付ける意味でも大変意味深いことです。


ウェブアプリケーション開発に興味があって悶々としているそこのあなた。
思い切って第二回のはてなインターンに応募してみるのが吉です。
もちろん、応募書類は[後でやる]タグをつけずに早めに出すべきです。


続きはwebで。
http://www.hatena.ne.jp/company/staff/intern

はてなサマーインターン2008に受かったよ、ひゃっほい。

はてなサマーインターン2008に参加することになりました!!

id:naoyaさんのはてなでインターンシップ - naoyaのはてなダイアリーを読んで、その日にてきと−に履歴書とか作って応募したら通った!
やった!はてな!!はてな!!!

せっかく頂いた機会なので、しっかり京都を満喫して来たいと思います。

ひとまず、Perlの勉強やんなきゃだ。PHP, Python, Java, Ruby, Prolog, Scheme, C, Adaは程度はあれど一度は勉強したことあるけど、意外にPerlはこれがはじめての学ぶ機会だ。がんばろっと。

同じくはてなサマーインターン参加する方々、よろしくお願いします。切磋琢磨しましょう。

DjangoでJavascriptとCSSを簡単に圧縮する方法

この前公開されたDjango用のJavascriptCSS圧縮ツール「django-compress」がとてもいい感じで使いやすいです。複数のJavascriptCSSを一つにまとめるのはもちろん、難読化や無駄なスペースや改行の削除を自動で行ってくれます。


圧縮に使用するソフトウェアは、デフォルトではJsminとCSSTidyを使用する設定になっているのですが、他のツールを自分で設定すれば何でも使えます。なので、Javascript圧縮ツールとして超有名な/packer/を代わりに使うことも簡単にできます。


今回は、デフォルトのJsminとCSSTidyを用いた圧縮方法を説明します。

  1. まず、Subversionでコードをチェックアウトしてください。
  2. 次にdjango-compressをインストールします。
    • python setup.py install
    • ダウンロードしたディレクトリ内で上のコードを実行すれば自動でインストールされますが、もし手動でインストールしたい場合はPYTHONPATHが通るところへ適当に設置すればよいです。(たとえばdjangoを置いてるsite-packagesとか)
  3. djangoのsettings.pyのINSTALLED_APPSに'compress'を追加してください。

これで下準備完了。


次に、以下のコード参考に圧縮したいコードの情報をsettings.pyに挿入。
場所はどこでもいいです。一番下とかどうでしょう。

COMPRESS = True
CSSTIDY_BINARY = 'C:/htdocs/csstidy-1.3-exe/csstidy.exe'

COMPRESS_CSS = {
    'demo_css': {
        'source_filenames': ('css/style.css', 'css/foo.css'
        , 'css/bar.css'),
        'output_filename': 'css/demo_compressed.css',
        'bump_filename': True,
        'extra_context': {
            'media': 'screen,projection',
        },
    },
    
    # other CSS groups goes here
}

COMPRESS_JS = {
    'demo_js': {
        'source_filenames': ('js/jquery-1.2.3.js', 
        'js/jquery-preload.js', 'js/jquery.pngFix.js',
        'js/my_script.js', 'js/my_other_script.js'),
        'output_filename': 'js/all_compressed.js',
        'bump_filename': True,
    }
}

コードの中身で理解しておきたい部分を解説します。


まず、CSSTIDY_BINARY。これはCSSTidyのバイナリファイルへのパスです。もしまだダウンロードしていなければ、予めダウンロードして適当な所へ設置しておいてください。上の例は、ローカル開発環境でWindowsを使っていると想定しています。


COMPRESS_CSSは、圧縮したいCSSの情報を記載する場所です。demo_cssの部分はグループ名なので適当な名前をつけてください。source_filenamesってのは必須のパラメタ−で、一つにまとめて圧縮したいCSSファイルへのパスを羅列します。


ここで注意しておきたいのは、パスはメディアファイルの設定からのパスという点です。


なので、予めMEDIA_ROOTとMEDIA_URLはきちんと設定しておいてください。


output_filenameというのは、まとめたファイルの出力名です。既存のファイルと重複しない粋な名前をつけてあげてください。


同じように、COMPRESS_JSも適当に設定してください。Jsminはダウンロードしなくても使えるので、設定する必要は特にありません。


最後に、テンプレートファイルの読み込みたい箇所に以下のように書き込みます。

{% load compressed %}
{% compressed_css 'demo_css' %}
{% compressed_js 'demo_js' %}

ここで、予め設定したグループ名を使っているわけです。複数のグループを設定してページによって使いわけたりすることも簡単ですね。


これで、Djangoが自動的に複数のJavascriptCSSを一つにまとめて且つ圧縮して表示してくれるようになります。圧縮ファイルの更新は自動判別で、グループ内のファイルで圧縮されたファイルよりも新しいものがあれば自動更新、なければ圧縮済みのものをそのまま表示と勝手に判断してくれます。超優れもの。


手動で圧縮したい場合は?

python manage.py synccompress

自分で設定ファイルを書いて、Jsminの代わりにpackerを使うのも簡単なんですが、これは長くなったのでニーズがありそうだったら追記します。