2009年3月31日火曜日

ハッカーと画家

「ThroughtWorksアンソロジー」 を読み終えた後、今読んでいるのが「ハッカーと画家」。

この本は初版が平成17年1月なので、4年前の本です。
著者はPaulGraham

読み本としては凄く面白くて、眠い朝の通勤電車でもバッチリ読めます。
ThoughtWorksアンソロジーのDSL部分はダメだった私でも(笑)

4年も前に書かれているのに、いやぁ...ほんとグレアムって頭ってどーなんてるんだろ?って思ってしまう。
素直に、グレアムって凄いと思う。小学校の頃までは、人の差なんてそんなに無いんじゃ?って思ってたけど、やっぱり人って差があるよなぁ〜。運動神経に差があるように。
文章で書かれたものを読むと、”あーそーだよなー”って思ってしまうけど、それを文章で起こすのはその一歩、二歩先にいってないと無理ですよね。

中で気に入った話は、

色んな事を考えることで頭の運動になる。でも頭で考える事と、口に出して言う事には一線がある。

格差社会で裕福な人から受ける恩恵は、雇用が増えたこぼれをもらうことじゃなく、「富」を受けること。「富」はお金とは限らない。
たとえば、ビル・ゲイツ(裕福な人)が、便利なOSを作成してくれ、私たちはそれを使う事で生活が便利になる。 とか。

まだ10章までしか読んでないですのですが、その後に「普通のやつらの上を行け」も控えているので楽しみです〜
• • •

2009年3月26日木曜日

ASlimTimer 1.1.4リリース

ASlimTimer 1.1.4リリースしましたー。
http://sites.google.com/site/aslimtimer/

久しぶりの更新ですが、内容はバグ修正です

いまさらですが、AIRのUpdaterの仕組みは便利ですねー。
Desktopアプリはどんなものであれ、Updaterの仕組みは必須ですな。
• • •

2009年3月22日日曜日

開発用のマシン

Macを買ってから、ちょーど1年が経ちました。
それまではずーっと、Windowsだった私。

大学ではMacでベンゼン環なんて書いてましたが、その後開発をしよー!と始めて購入したマシンはWindows95。もちろん会社でもずーっとWindows。

そんな私が去年からMacを自宅で使って、Google先生に大変お世話になりながらやってます。
とくにコマンド操作が苦手なので触る機会があるといいかなぁーというのもあって。

んでー、今年からは会社でもMacを持ち込んで開発してたりしてみたのですが、これからどーしようかちょっと悩んでます。
仕事で作るアプリは、やっぱり最終的にはWindowsでのチェックがいる。
お客様に送るメールにTextファイルを添付する時には文字コードも忘れないようにチェックしないといけないなど、つぃうっかり...ってのもやってしまいそう。

複数のOSが同時に起動できるようなマシンがあればいいなーって思うんですが、今持っているMacAirもスペックのいいものじゃないからちょっと無理。
夏になったら本体が暑くなって悲鳴を多分あげるよな。家で使っててもたまにアイスノンで冷やしてる状態だし。
以前の会社で持ち込みしていた8年前のWindowsデスクトップはあるけど、もそんなにスペックは良くないしー。しかもマルチディスプレイ対応のディスプレイカードじゃない。
マルチディスプレイできない時点でなんかもぅヤダ(笑)

そんな中、今日秋葉原をうろうろしていた時にみたParallelDesktopやBootCamp。
あーなんだかめっちゃ惹かれます...が、そんなのに耐えれそうなMacBookProはやっぱり重そうで、日々会社と家との持ち帰りは辛そうです。

となると、やっぱり会社ではWindows使って、家でMacかなぁー。
会社のWindowsマシンにボチボチ開発できる環境を整えていくかな...んー。
• • •

2009年3月19日木曜日

ボーリング

会社での部活動、「動く部」
栄えある第二回としてボーリングをやってきました。

ヌーラボ(東京)アズシーツーのメンバーの7人で、シブヤボーリングへ。

結果は....
もし、会社対抗ボーリング大会なんぞがあれば、最下位はまぁ固いでしょうww

スコアが3桁いったら、上手いなぁ〜 と皆に褒められます。
150までいったら、尊敬されます。
180までいったら、神になれます。
200までいったら...神を乗り越え、変態かなw

次回は何をやりましょうかー。
卓球はまだハードルが高い気がするので、ビリヤードぐらいからリハビリですね♪

しかし...少ししか動いてないのにこの眠気はなんだ。
子供の頃にこぅいぅ感じ...あったなぁ...
• • •

2009年3月14日土曜日

Seasar Conference 2009 Whiteにいって来た

Seasar Conference 2009 Whiteに行ってきました!
朝から小雨...とあいにくの天気でしたが、そこそこ人は来ていたんじゃないかなぁー?
去年もそうだったけど、他のイベントに比べて若い人が多い! よいよねー。
まぁ女性比率はやっぱり低いですがww


13:00-13:45 Wicketとシステム開発の現場

さて一発目はWicketを見てきました。
Cubbyのセッションともかぶっていたのですが、相方が行くということだったので...お任せして..行かなくてスイマセン..

前半部はWicket概要説明でした。
"見慣れない技法" (新しいフレームワーク) を始めるには確かにリスクもあるけど、自分の知っている技法に留まることもリスク。
"技術的に難しい" と "やった事がない" を混同してない?
という事を話されていたのは、心に残りましたー。

後半はDwangoの案件でWicket開発をしている話でした。
案件の内容としては、社内システムで請求/支払をするようなものらしいです。
組み合わせは Wicket + Guice.

HTML先行で開発し、画面部分の仕様を始めに決めたらしい。
詳しい内容は分からなかったんですが、始めはHTMLで全て書いておき、実装時にWicketコンポーネントへ置き換えて行く作業って事なのかな..

プロジェクト用にカスタマイズ/自動化した部分は聞きごたえがありました。
マスタ登録部分はscaffoldのようにパパっと作るためにVelocityでコード生成。
リクエストパラメータの処理は
@Param("username")
protected String username
な感じ。
受け取る方がEntityの場合は、パラメータがIDのKeyにしてEntity情報を設定までしてくれる形になる。

@ObjectContextName("name")
で複数のPageで同じエンティティを共有する仕組み。
これは 検索-入力-確認-完了 という一連のアプリケーショントランザクションの間で共有するもの。名前で単純に一致して判断するようにしていたらしい。

バリデーションは、なんと!Excel記述されている内容を読み込みしてバリデータを自動追加。
なぜExcel?というのは、結局Excelで資料の提出が必要だったからということ。
Excelとコードと同じものを2回書くなんて...ってヤツですね。

確認画面は、入力画面と同じ項目でTextをLabelにしただけ...ってパターンは結構あるのですが、これも別に作るのは面倒! ということで、確認画面は、前画面(入力画面)のコンポーネントを走査してラベルとして貼付け で作ったとの事。

これに限らず...ですが、その案件にとってめっちゃ生産性が上がる事って、案件独自のルールに基づいたカスタマイズですよね。それをぱぱっと作れてストレスフリーな開発できたら、カッチョ良いです!

んでー 最後に、WicketTester.
結構Wicketの良さってこのTestでないの?と思ってしまうくらい良さそうーって思ってしまうんですがww
画面でのテストって、絶対必要な所なんだけど結構面倒だったり、作るのに時間かかったりしません?
でも最近出て来たものは テストをする という前提でちゃんと作られてるんちゃぅ?とも思うし、GUIのテストの観点から見て、WicketはHTMLとSwingの間のいい所の路線いってんちゃぅ?とか思うんですけどー。


14:00-14:45 最新のDI&AOP


・コンポーネントの依存が減ると、分担しやすい ... といわれていたが、"結構一人でやった方が効率が良かったりする
・DIで依存部分のコードが減る...が、減った部分は結局設定ファイルへ。しかもコンパイルエラーにならなくなっちゃってイマイチ。
・実装部分をDIで入替できる...が、入れ替えしたいものって結局すくない。殆どのクラスの実装が一つだったりする。
・依存が減ってテストしやすい...けど、単体テストの時でなくて結合テストの時にはそこまでメリットがない。

んでー、結局ここらへんは生産性向上には思ったよりも貢献してない。それよりもHotDeployの方が貢献してるよね...でSlim3!
というお話でした。

話聞いての感想ですが、DIってそもそもどんなタイミングでどう使えば利点が生きるんだろ?..って思ってしまいました。私自身、業務で始めてDIContainer(S2)を使っている所なんですが、小さいプロジェクトというのもあり...イマイチあんまり利点がまだ理解できてないです。
確かに、DIは後で実装を入れ替えたり出来るのは便利だとは思うんですが、入れ替えたい!ってタイミングって、テスト時のモックとかなので運用に乗ってしまったらそぅ変えないですよね。
それだったら、入替したいクラスはFactory作るなりしてちょっとカスタマイズできるようにすればいいよーな気もする。入替するのがテストのタイミングだけなのであれば、それらの処理はmainのコードでなくてtestのコードで書きたい気がする。(テストの為だけに使いたい仕組みならば、その仕組みを本番環境に持って行きたくないという意味で)
まぁ、良くわかってないのだろうと思うのでナンですがww


15:00-15:45 T2でつなごう!-つなぐつながる Web フレームワーク

T2のキャラクタがキュート! テツとイーダ。あぅいぅキャラクタが出てくるだけでなんだか優しい感じになっていいですねー。キャラクタ偉大です。カネウチカズコさん偉大です。

T2はステートレスなシンプルなフレームワーク。
@Page("/hello")
@ActionPath("/world")
@ActionPath("/world/{id}")
  @Var("id") String id
  @RequestParam("name") String name
...のようなアノテーションでの指定をして行く感じ。Cubbyと結構カブっている?
でもユーザが独自で拡張しやすいように...って前提で作られているようです。

DIコンテナ非依存ということで、Guice,Spring,Lucy,Seasar2などで動作可能!
インスタンスの生成はDIコンテナに任せて、T2はそれ以降の処理についての制御って感じ。

こういうのっていいですね。
使い慣れているS2と組み合わせて使ってみるのもよし、Guice使ってみたいから...というのもよし。しかも拡張前提で作られている(=拡張できる窓口が大きい)のであれば、あー!ってなった時もゴリゴリ組み込んだらなんとかなるんじゃ?って安心感もちょっとある。

あと、Ajax, Flex, AMF の対応ということでしたが...イメージがちょっと掴めなかったけど
HTTP, XMLHttpRequest, AMF などの各リクエスト/レスポンス をT2が切り分けて、対象の型が指定されているものにマッピングしてくれる..みたいな?

そういう部分は確かにフレームワークでやって欲しー感じww


16:00-16:45 差のつく勉強法200-35歳定年説を乗り越えるために何をすればいいのか

きしださんワールド満載で凄く面白かったです。

なんで定年になっちゃぅか?というと、「ついていけない」というのもあるけど「全部やっちゃった感」というのも出てくる。
んでも、全部やった...なんて事はないはずで、「知らない事がまだまだいっぱいある」 ということを勉強して知るのだ! という内容でした。

勉強の内容として出て来た言葉を羅列してみると、
離散数学/ 集合 / グラフ理論 / 論理学 / 不完全定理 / 組合せ理論

プログラムを作るというのは、多くの言語やテクノロジを知っているだけだといいものは作れない。当然ながら、頭の中でどんな風に作るかなぁーって考える必要がある。
実はその「どんな風に」ってのが難しい/面白い所で、人との差が出てくる所だと思います。

実現できないと思った事も、実は発想次第で出来ちゃう事ってありません?
数百行のコードが、発想次第で数十行になっちゃう事ってありません?

オープンソースのコードを読め!と良くいわれる中の一つにこぅいぅ技術以外の所を学ぶよい機会だって事なんだろぅって思います。
昔からある ○○理論 ってのも、そんな力を身につける一つだと思う。
難しいだろーなーって思うけど、基本だけでも知っておくだけで随分違うのかも。
プログラムの事を中心に考えつつ読むと、結構面白いのかも。

おすすめされていた「論理学」っていう本を読んで、きしださんは日本語が良くなったそうです。私もこの本は読んでみます! ニホンゴムズカシイノデ...


17:00-17:45 ライトニングトークス

これは観客いっぱいでしたねー。という事で内容は省略ww


最後に。
あんなに人がいっぱいいたのに、知っている人に偶然に会う機会が多くて嬉しかった。
カンファレンスのパンフレットで手を3回切りました。次回は切れない紙でお願いします...
• • •

2009年3月11日水曜日

Javaでランダムで一意な文字列を生成したい

Javaでランダムで一意な文字列を生成したい...って時、どんなものを使ってますか??
そういう場面になったので見てみたものをちょっとマトメ。


桁数が長くてもいいから一意に 系

UUID

JDK1.5 で導入された java.util.UUID で UUID.randomUUID().toString(); をする。
取得される文字列(16進)は ffbac078-8cf0-483f-817d-184a5e812613 のような感じ。

これをMath.absで10進数にすると 2080304300 のような感じ

ナノ秒

これまたJDK1.5で導入された System.nanoTime() を使う。
取得される値は 1236777382401532000 て感じ。
複数Threadの場合には、ThreadIdをプラスしないと重複しちゃう事もあるだろうし...そうでなくても本当に重複しないって保証はあんまりないので、重複チェックの処理がいるかも。

MD5などでハッシュにする

idなど一意な文字列を元として、MD5やSHAなどでハッシュにする。
こうすると、ある文字列に対して常に同じ値が取得できるし、結果から元の値は想定しにくいものが作れる。(不可逆なので一方向関数というらしい)

Javaの場合、java.security.MessageDigest を使います。
  String value = "なんか";
  MessageDigest md5 = MessageDigest.getInstance("MD5");
  md5.update(value.getBytes());
  byte[] hash = md5.digest();

これを以下で文字列に
public static String hexString(byte[] bin) {
String s = "";
int size = bin.length;
for (int i = 0; i < size; i++) {
int n = bin[i];
if (n < 0) {
n += 256;
}
String hex = Integer.toHexString(n);
if (hex.length() == 1) {
hex = "0" + hex;
}
s += hex;
}
return s;
}

すると結果の文字列は 61c35ef8a6adc245e00a563a0627898b な感じ。
同じく "なんか" の文字列を
SHAでやってみると、9523f8f6accb5e1c7eda7ff087f771a7015efcc2。

今回私が欲しかったのは、あるシステムのログインIDを自動生成したいけど、想定できるようなものにはしたくない(連番はNG)
というものだったのでこれが目的に近いし、生成した文字列を保存する必要もなくて良い! だったんですが、んー長さが...長過ぎる...


ランダムで取得して重複チェックをする系

一意になるような文字列って長くなるのはしょうがないので...文字数を少なくしたいのであれば自前で重複チェックするしかないですよねー。多分。
という事で重複チェックをする前提で、ランダムで値を取得する方法です。

Math.random


おなじみ java.lang.Math で randomな数値を取得する
取得される値は 0.42089385157588244 な感じ。


RandomStringUtils


Commonsにこんな便利がものが!
org.apache.commons.lang.RandomStringUtils

用意されているメソッドは以下のようなものがあります。

public static String random(int count)
public static String randomAscii(int count)
public static String randomAlphabetic(int count)
public static String randomAlphanumeric(int count)
public static String randomNumeric(int count)

引数は文字の長さ。
Asciiだけで...英字だけで...英数字だけで...数字だけで...って指定ができる優れモノ!
英数字で6桁ものもが欲しければ RandomStringUtils.randomAlphanumeric(6) と記述し、結果は eW8awR な感じ。

結局今はコレに落ち着いたww
• • •

2009年3月8日日曜日

FlexSDK3.3のadlが実行できなくてハマる

FlexSDK3.3がリリースされたという事で早速ダウンロードしてみました。
でー AIR GEARで試してみようとしたらAirApplicationの実行(launch)ができない。
エラーもなにも発生せず、実行プロセスが単に終了しちゃう。

コマンドラインから adlを直接叩いても同じ。

えー!!

FlexBuilderでも内部でadl使ってるんだったら一緒なんちゃぅかなぁ?
Google先生にお聞きした所、Flex 3.3 can't run or debug AIR apps on Macというのを発見。
どうやら内部で貼られているシンボリックリンクの位置がおかしいらしい。
修正するスクリプトを流したら確かに実行できるようになりました〜

ですが、現在のFlexSDK Downloadサイトのものであればこの件は解決しているらしい。ぐはっ!

問題が起きたモジュールは 2009/3/6 2:19 にダウンロードしたもので、118MB.
現時点でダウンロードされるモジュールは 121MB.

つーことで、いまだにダウンロードページでは
Download the Flex 3.3 SDK for all Platforms (ZIP, 118 MB)

って書いてあるけどこれは嘘(笑)
慌てて更新したんでしょーね。

まぁミスったのはいいとしても、納得いかないのがバージョン。
どっちのモジュールでも 中に入っているflex-sdk-description.xml の内容が同じ。
<?xml version="1.0"?>
<flex-sdk-description>
<name>Flex 3.3</name>
<version>3.3.0</version>
<build>4852</build>
</flex-sdk-description>
もともとダウンードされるzipも flex_sdk_3.zip ってファイル名で細かいバージョンが含まれていない時点で私は嫌だったけど、中身までこれだとねぇー
プログラマを敵にまわすとおもうよーww

-- 追記 --
ApplicationDescriptorの名前空間の指定も微妙なのが判明。
2009/3/6 2:19 にダウンロードしたモジュールでは
xmlns="http://ns.adobe.com/air/application/1.5.1"
ってなっていたんだけど、今ダウンロードしたものは
xmlns="http://ns.adobe.com/air/application/1.5"
になってる。
んで、最新のモジュールでは 1.5.1 で動かしても動かない...と。
おーぃ!! 2009/3/6 2:19 のモジュールは一体どんなモジュールだったんだよー!!
• • •

2009年3月7日土曜日

iPhoneのカレンダーをGoogleCalendarに!

もう何ヶ月単位で古い話題で恐縮ですが。。。

カレンダーって携帯で見る事が多いですが、携帯用のカレンダーアプリだとPCと共有できなかったりしてちょっと不便。
んが! GoogleCalendar であれば携帯で使えるようになる〜!
これも、Googleが自腹を切ってMicrosoftにライセンス料を払ってくれてるおかげです。すばらしぃー。

んで、私は iPhone で設定してみました。
iPhoneカレンダーの情報は削除されてしまうので、GoogleCalendarに移行してからやる必要はあります〜。

設定方法はこんな感じ。


1. 設定 → メール/連絡先/カレンダー で アカウントを追加... を選択。
2. Microsoft Exchangeを選択
3. ドメインは空白のままにしてそれ以外は、Googleのアカウント情報を入れる。
4. [次へ]をタップ
5. 認証云々のダイアログが出るので[了解]をタップ
6. サーバーの入力欄が増えるので、m.google.comを入力

これで、同期取れる状態になって、
iPhoneカレンダーにGoogleCalendarの情報が入ってきます。
もちろんiPhoneカレンダーで編集した内容はGoogleCalendarに自動的に反映されます。

超簡単&便利。

んー、これでGoogleCalendar一本にするかなぁー って気分。
• • •

2009年3月2日月曜日

Macで開発用SMTPサーバをたてたい!

メール送信をするSMTPサーバを簡単にローカルでたてたい!
(メール送信をするプログラム作成時の時など用に...)
ということで少しみてました。

MacOSXではpostFixというのが予め入っているみたいで、これを使うと出来るようです。

/etc/hostconfig に

MAILSERVER=-YES-


という行を追加。

で、ターミナルで
> postfix start
ってすればいけるみたいー。

ログは /var/log/mail.log に出てます。
でも、これだけの設定だとGmailへの送信は蹴られちゃうみたい。
ログをみるとこんな感じ。

connect to gmail-smtp-in.l.google.com[209.85.199.27]: Connection refused (port 25)
connect to alt1.gmail-smtp-in.l.google.com[209.85.133.27]: Connection refused (port 25)
connect to alt2.gmail-smtp-in.l.google.com[209.85.135.27]: Connection refused (port 25)
connect to alt3.gmail-smtp-in.l.google.com[209.85.220.10]: Connection refused (port 25)
connect to alt4.gmail-smtp-in.l.google.com[209.85.221.72]: Connection refused (port 25)
650B49BE09: to=<*****@gmail.com>, relay=none, delay=2667, delays=2660/0.02/7/0, dsn=4.4.1, status=deferred (connect to alt4.gmail-smtp-in.l.google.com[209.85.221.72]: Connection refused)



多分、スパムよけでなんかしてるんでしょうーね。。
MacのマシンからPostfixでGmailに送信できるようにするという記事のを反映したら上手くいくのかも。(まだ試してないですww)
• • •