デベロッパーズサミット2011に登壇します

ご無沙汰してます。何をしていたかというと、Jiemamy作ってました。意外と形になってきていますが、まだちとバグがあるかな、という状況です。(αテスター募集中! 詳しくは @daisuke_m に@なりDなり)

で、ですね。デブサミJiemamyについてお話させて頂けることになりました。枠番は17-E-1です。Jiemamy Projectでは、このデブサミに合わせて新バージョン(v0.3.0)のリリースを予定しています。新バージョンのご紹介をいち早くお伝えできることを嬉しく思います。

http://codezine.jp/devsumi/2011/

初日の朝一のセッションですが、もしよろしければ会場までお越し頂ければと思います。

# 新春一発目に「MacbookAirが欲しい」とかエントリを投げつつ放置しすぎでしたすみません。

互換性維持とリファクタリング

互換性とは

ソフトウェアは、広く使われれば使われる程、互換性が大事になってきます。ここでは、ソフトウェアライブラリ・フレームワーク等の互換性を考えてみまよう。互換性は以下の2つに分けて考えることができるようです。

  • 上位互換性:ライブラリのバージョンを新しくしても、このライブラリに依存したソフトウェア(クライアント)が正しく動くこと
  • 下位互換性:ライブラリのバージョンを古くしても、このライブラリに依存したソフトウェア(クライアント)が正しく動くこと

ライブラリ等のバージョンにおいては、古いバージョンに切り替える機会よりも、新しいものに切り替える機会(とモチベーション)の方が多いため、一般的に上位互換性の方が重要視されます。(ただ、Excel等のアプリケーションが吐き出すデータファイルは、下位互換性が求められることも多いです。つまり、Excel2000で作ったデータはExcel97でも読める、等)

互換性が重要なケース

広く一般に使われるライブラリ(API)は、なるべく上位互換性を維持しようと務める必要があります。例えば、commons-langが互換性を失ったら、バージョンアップした時に、かなり多くのクライアントが壊れるでしょう。

ちなみに、commons-httpclient は、v4系のリリースのタイミングで、互換性を捨てました。v3系を使って組んだアプリケーションはv4系にバージョンアップするのに大きなコストが掛かります。まぁ、互換性が重要とは言え、一定のタイミングで互換性を捨てる、という作戦もあるのです。これは「技術的負債の返済」とも言えるでしょう。

そして仮に、Java自体が互換性を失ったら、もっと大変なことになります。従って、Javaは「上位互換性を大事にしている」と言われています。Java1.0時代に書いたコードやコンパイルしたクラスが、Java6でも普通にコンパイルできる・実行できるのは、互換性が最大限に考慮されているからです。「バージョンを上げても壊れない」という実績の積み重ねが信用につながり、これがJavaの利用領域拡大に一役買っているのは間違いないでしょう。

互換性が重要ではないケース

しかし、互換性を維持する、というのはコストのかかる作業です。例えば、一度リリースしたライブラリについて「このクラス名、よくなかったなー。名前変更のリファクタリングを掛けよう」ということは、おいそれと出来なくなるのです。名前が変わったら、クライアントのコンパイルは通らなくなりますからね。

そんなわけで、個人的に使うようなライブラリや、特定の狭い範囲のみで使うことを想定したものであれば、互換性はそこまで重要視されません。というのも、バージョンを切り替えた結果、クライアントが正しく動かなくなったとしても、それに対応するようにクライアント側を修正すれば済むからです。また、範囲が狭ければ狭いほど、なぜ互換性を失ったのか、どのように直せばいいのか、というナレッジが共有しやすい為、という理由もあります。

このように「互換性の維持(=信用の積み重ね)」と「リファクタリング(=設計の改善)」はトレードオフです。そのソフトウェアの性格や、開発方針、リファクタリングの重要度等を検討して、互換性を維持するかどうかを決定しなければいけません。

Jiemamyはどっちだ?

いやー、Jiemamyでも長い間「互換性維持」を意識してきました。しかしまぁ、毎度のバージョンアップで「ごめんなさい、やっぱり互換性維持はできませんでした」ということになるのですが。最近は気持ちを切り替えています。Jiemamyの本質はバージョン互換(安定したAPI)ではなく、開発プロセスにあることを再確認しています。だから、互換性を意識しすぎて開発が進まないのは、ちょっと本末転倒だったな、と。こだわりすぎるのも良くない。

という気持ちで。現在新しいAPIを鋭意開発中です。

baseunitsはどっちだ?

逆に、baseunitsに関しては「互換性維持」は重要なことだと思っています。APIを広く使ってもらいた、と考えていますし、初期から「安心して広く使ってください」と喧伝しているプロダクトです。厳しく考えれば、「MavenのgroupIdを変更する」だけでも、見知らぬ誰かのプロダクトを壊すことができるんです。

というわけでbaseunitsでは、このようなことがないように、以下のポリシーに従います。

  • 一度リリースしたバージョンは、その内容を一切変更(修正)や削除(公開停止)しない。
  • なるべく互換性を失わないバージョンアップを心がける。
  • 互換性を失う場合は、@Deprecated等で事前に警告する。
  • 互換性を失うタイミングはメジャーバージョンアップのタイミングに限る。


つまり、こちらは名前の変更などよりも、互換性が大事なプロダクトです。余程のことがない限り、互換性の維持に努めます。安心してご利用ください。

「区間」のソートあれこれ

註:本エントリは等幅フォントで見ないと訳の分からない部分があります。Firefoxではきちんと見えるのですが、Google Chromeではなぜかmonospaceが等幅になりません…。というわけで、本エントリはFirefox推奨。SafariでもOKでした。IEは知らん。

さて、昨日の続きです。昨日は区間とは何かということを主に書いてきたのだが、今日はこれをどのようにソートしたらいいのか。あれこれ考えた結果、むしろ多分数学的に優位(有意?)なソートロジックってのは多分存在しないので、主観的にどれが一番理に適っていると感じるのかなぁ、というところをつついてみたい。

そんなわけで、解答はないので、ブクマとか※で、どれが一番イケてると感じたか*1、教えてほしいなぁ。今日は技術とか理屈の紹介じゃなくて、読者をアンケートに付き合わせて俺が考えを整理したいだけです、すみませんがお付き合いをば…。

*1:つまり、主観だ。

続きを読む

数学的な「区間」の話を分かりやすく書いてみる

数学用語に「区間」ってのがある。wikipediaによる解説はこちら

ちなみに、wikipediaって数学系の事しらべると、もう意味わかんないよね、正直w 自分も数学の下地がある人種ではないので、正直数学系の話第だけはwikipediaをアテにできない。まぁ、誰でも分かるように書いてみよう。

わかりやすい「区間

まぁ、簡単に言えば「5〜8まで」とか、そういう範囲をあらわす概念。で、6はこの区間に含まれるよね。7.5とかもこの区間に含まれる。10は含まれないし、-2も含まれない。じゃあ、5は? 8は?

となった時に出てくるのが「開区間」とか「閉区間」ってやつ。境界値を含むのが閉区間で、含まないのが開区間。半開区間ってのもあって、片側だけ開いてて、もう片側は閉じてる奴。

さて、そろそろ言葉で表しづらくなってきたら記号の出番だ。記号は(自分を含め)数学アレルギーには苦手なものだけど、今回ばかりは簡単。5〜8までの開区間(境界含まない奴)は「(5, 8)」って書く。で、5〜8までの閉区間(境界含む奴)は「[5, 8]」って書く。丸括弧より角括弧の方が、広い範囲を括り取っているように感じるだろうから、直感的でもあると思う。

んじゃ半開区間はどうやって書くのか。まぁ大方の予想通り「[5, 8)」とか「(5, 8]」とか書く。括弧が一致してなくて一般的には気持ち悪いところだけど、そういうモンだと割り切り重要。

ちなみに、開いてるとか閉じてるとか、言葉が覚えにくい。含む方はどっちだっけ? なんていつも混乱する。そんな時は図を頭に浮かべよう(下図)。数直線上にこんな感じで範囲を明示すると考える。塗りつぶしたのは境界を含むって意味。白抜きは境界を含まないって意味。塗りつぶした方は閉じてて、白抜きは開いてる。穴がね。覚えられただろうか。

続きを読む

最近やってること

  • レコメンドエンジンMahoutを使ってみたい → Hadoopを理解したい → HadoopをEC2の上で動かしたい(イマココ)
  • Python書けるようになってみたい → 開発環境はEclipseじゃないだろうからEmacsにしてみる → 版管理にはGitつかってみたいな(イマココ)

という流れで、なんか色々やってます。この流れで先日Hadoopとかの話をちょろっと。そのうち他の話も書いてみるかもしれない。

で、学習は、とりあえず、上の流れは一人でなんとかなりそう。下の流れはなかなか追いつかないすねw

Pythonについてtwitterでつぶやいていたら、以外と身近にPythonスターターなJavaエンジニアが多かった。JavaエンジニアのためのPython入門勉強会あったら絶対行く、という意見も。

しかし、勉強会とか本格的にやると大変だからなーー。。。

独身終了のお知らせ

突然ですが9/20に結婚することになりましたー。相方は、薬屋時代の同僚です。

目立つイベントが苦手な相方なので披露宴やパーティなど、ましてやid:yoshioriのようにkecconしたりはしないと思いますが、暖かく見守っていただければ幸いです。

そうそう、お約束で欲しいものリスト貼っておきますね:P

今後とも、よろしくお願いします。

追記:ありがとうございます。

@yamashiroさんより

「デコンパイリングJava」を贈って頂きました。大事に読ませていただきます。ありがとう!

デコンパイリングJava ―逆解析技術とコードの難読化 (Art Of Reversing)

デコンパイリングJava ―逆解析技術とコードの難読化 (Art Of Reversing)

@setoazusaさんより

最初は贈り主不明でしたが、判明。洋書を贈ってくれるマッチョな方が。ありがとうございました!せとさん、ありがとうございます。…がんばって読む><

OSGi and Equinox: Creating Highly Modular Java Systems (Eclipse Series)

OSGi and Equinox: Creating Highly Modular Java Systems (Eclipse Series)

  • 作者: Jeff VanderLei, Paul Archer, Simon McAffer
  • 出版社/メーカー: Addison-Wesley Professional
  • 発売日: 2010/02/14
  • メディア: ペーパーバック
  • 購入: 1人 クリック: 44回
  • この商品を含むブログ (1件) を見る

@yoshioriさんより

「Java による RESTful システム構築」 が超勉強になる!! - 宇宙行きたいという書評エントリが、最近話題な@yoshioriより、その本を頂きました。APIの設計等についても色々書いてあるようなので、非常におもしろそうです。

ギフト包装のメッセージカードで「ちんこ」頂きました! ありがとう!

JavaによるRESTfulシステム構築

JavaによるRESTfulシステム構築

@yuroyoroさんより

よろよろ先輩からは、防災セット頂きました。引っ越したので、新居の下駄箱付近に設置させてもらいました! 万が一地震でも起きたら、命の恩人となるわけですw ありがとう!

@t_yanoさんより

キッチン用品いただきましたー。メッセージカードで「これでばっちり料理をキメて!」とのことなので、キメさせて頂きます。どうもありがとうございます!

グローバル 牛刀 刃渡り 20cm G-2

グローバル 牛刀 刃渡り 20cm G-2

@shin1ogawaさんより

小川さんからはなんと二点! キッチン用品とSlim3本です。どうもありがとうございます!

ローストスライサー。ってことはロースト作らなきゃ。うふふ。メッセージカードで「これで奥様とも対等に戦えるかもしれません」いただきましたー。しかし、どれだけ強力に武装しても、勝てる気がしないのはなぜですか?

グローバル ローストスライサー 刃渡り 22cm G-8

グローバル ローストスライサー 刃渡り 22cm G-8

実はSlim3どころかGAE/Jにもマトモに触れていない現状なので、良い機会を頂いたと思います。写経してみようっと。読んだら再びブログで紹介させてください。

オープンソース徹底活用Slim3onGoogleAppEngineforJava

オープンソース徹底活用Slim3onGoogleAppEngineforJava

@j5ik2oさんより

これまた、強力な二本立ていただきました。さすが我が上官。手下のツボを押さえていますw これがまた分厚い本の二本立てなので、じっくり読ませていただきます。どうもありがとうございました!

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 原則・コンセプト (IT Architect’Archive クラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

オブジェクト指向入門 第2版 方法論・実践 (IT Architects' Archiveクラシックモダン・コンピューティング)

@bose999さんより

欲しい物リストに載せた覚えがないeneloopは、和尚の仕業*1ですね。充電器はその昔、id:kacchi123にもらったので、とっても実用的です。ありがとうございます。

SANYO NEW eneloop 充電式ニッケル水素電池(単3形8個パック) [HR-3UTGA-8BP]

SANYO NEW eneloop 充電式ニッケル水素電池(単3形8個パック) [HR-3UTGA-8BP]

@kenchanさんより

未だに、仕事でもプライベートでもSubversionがメインな俺。世間では分散リポジトリが流行っているというのに、いまだに理解ができていない寂しさがあり、勉強したいなー、と思っていました。どうもありがとう!

入門git

入門git

@at_nswさんより

現在連載中の日経ソフトウエア編集長様より。いろいろお世話になりっぱなしな上に、お祝いまで頂いてしまって恐縮です。ありがとうございました。

HTML5&API入門

HTML5&API入門

津田さんより

薬局時代の同僚の津田さんより。圧力鍋いただきましたー。キッチン用品が充実してきます。牛スジの煮込みとか作れるなぁ〜。

小林さんとちむちむより

同じく薬局時代の同僚…っていうか、俺がエンジニアになった後の薬局メンバーなんだけどなぜかたまに顔を合わせてて、相方の同僚で、相方がお世話になっておりますな人たちより。

「パンツ食ってくださいね」っていわれました。

@imai78さんより

最初、贈り主不明でしたが、判明しました。早速イーモバとAndroidなんぞを繋いでおります。

レイアウト MacBook Air専用 3ポートUSBハブ RT-MBA3H1/S

レイアウト MacBook Air専用 3ポートUSBハブ RT-MBA3H1/S

@rokujyouhitomaさんより

最初は贈り主不明でしたが、判明。これからも暑苦しく行きたいとおもいますw

情熱プログラマー ソフトウェア開発者の幸せな生き方

情熱プログラマー ソフトウェア開発者の幸せな生き方

贈り主不明

現在、以下の贈り主不明です。どなたかはまだ分かりませんが、どうもありがとう!

サンワサプライ LANケーブルテスター LAN-TST3N

サンワサプライ LANケーブルテスター LAN-TST3N

その他

その他、コメント・ブコメTwitter・メール等を通じて、多くの方に祝福の言葉を頂きました。どうもありがとうございます。

っていうか、こんなにギフト頂けると思っていませんでした。もっとくれ(ぉ