2008年5月アーカイブ

早く読み終わらなければ...第2版が出てしまう!

前回からの続き。

--------------
19.Cの構造体をクラスで置き換え
要するにアクセサ無しのpublicなインスタンスフィールドを持つクラスについて。
パッケージプライベートやprivateなネストクラスなら使っても良いんじゃない?というお話。

--------------
20.共用体をクラス階層で置き換え
そもそも共用体ってなんだっけと思ってしまった。かなり忘れてる。同じメモリ領域を複数の型で扱えるようする型のことなんだけど、{列挙型によるタグ+共用体}を持つ構造体をタグ付き共用体と呼ぶらしい。この項目では、タグ付き共用体でJavaの多態性を実現するのは難しいという点を挙げ(Javaで言うところのinstanceof地獄)、このタグ付き共用体をクラス階層に置き換える話をしている。

タグ付き共用体を構成しているものはそれぞれ
タグ付き共用体→abstractクラス
タグが表すモノ、つまり共用体の要素となるのもの→上記のabstractクラスを継承する具象クラス ...に置換できる。

最後にCのタグ付き共用体とJavaの方で実現したクラス階層の比較検討。
(型の安全性、大量のswitch文がJVMによるメソッドディスパッチによってスッキリ消えるという点で後者の方が優れてる。)

--------------
21.intによる列挙型をタイプセーフ列挙型に
1.5からJavaでもenumが導入されたので陳腐化してしまった項目。というかこの項目で説明している内容が本家に取り込まれたといっていい。

それでも内容はなかなか面白い。
無名クラスを活用して列挙型の各要素に振る舞いを持たせて挙げてる例とか。
 →singletonにしてパフォーマンスを向上させている。
  →更に発展してシリアライズによるオブジェクトの重複をreadResolve()を使って防ぐコード例の提示。(でも列挙型をシリアライズなんかする場合ってあるのか?)
   →更に更に継承とかして拡張する例も。

この項目の最後では「列挙型はそんな使うモノじゃない。項目20のようにswitch文を大量に書くならoopによるメソッドディスパッチに置き換えるべきだ」というなんか掌を思いっきり返されたような結論で終わってる。

[おまけ]
|演算のおいしい使い方

フルーツ2種、野菜2種あったとして
int melon = 1; //メロン
int grape = 2; //グレープ
int cabbage = 4; //キャベツ
int cucumber = 8; //きゅうり

int fruit = melon | grape ;
ってやればintだけで集合が表せる!しかも高速!
BinaryHackとか読んでいたときもこの手の書き方って出ていたけど具体的にどんな感じに使うのかしらんかったのでビットのor演算による集合の表し方の話は参考になった。各要素が全部2のベキ乗なのがミソですね。

ちなみに1.5以降のenum要素を使って集合体を表現したかったらjava.util.EnumSet クラスか java.util.EnumMap クラスを使う。この辺は「J2SE 5.0 Tiger 虎の穴 Typesafe Enum」参照。

--------------
22.Cの関数ポインタをクラスとインタフェースで置換

状態を持たず(stateless)、メソッド1つだけなクラスのオブジェクト→Cの関数ポインタと実質同じ。
Cのqsortに渡すcomparator相当はインタフェース(strategy interface)と具象戦略クラス(concrete strategy)に分離させる(GoFのStrategyパターン)

具象戦略クラスは状態を持たないので、大抵singletonになれる。

p108-109にコード例(ただし、JDK1.5以降はgenericsにより、引数の型をObjectにするのは古い書き方になる。キャストで実行時エラーを発生させる可能性を残すよりも、コンパイルの段階ではじいた方がイイだろう。)

例えばsortメソッドに渡す具象戦略クラス(comparator)を作るとしたらどうやってつくろうか?
 -ソートする場所が限られてるならソートを行うクラスのprivate static メンバークラスに。
 -場所に加えて回数も限られてるならソートする箇所で無名クラスとして宣言しちゃってもいいカモね。
 -そうでないなら、comparatorはpublicなトップレベルのクラスの分離すべき。

また反対方向の電車に本を読みながら乗ってた。
気づくのに6駅ぐらいかかったorz

24才かぁ。

| コメント(2) | トラックバック(0)

いや、今年の誕生日は同期から色々とスイーツ類を大量に頂いたので、幸せでした。
去年は土曜で自宅だし、あまり祝って貰えなかったしな( つД`)

これで風邪さえ最高だったのだが...なんか毎月風邪ひいてね?歳なのか?(´Д`;
とりあえずそんなひどい風邪ではなさそうなので、さっさと治します。具体的にどうするのかというと、ニコニコ動画は見ずにもう寝ます。

暇つぶしに見ていたEnumクラスのcompareToメソッド。

    public int compareTo(E o) {
        Enum other = (Enum)o;
        Enum self = this;
        if (self.getDeclaringClass() != other.getDeclaringClass())
            throw new ClassCastException();
        return self.ordinal - other.ordinal;
    }

敢えてthisじゃなくselfにしてる点が面白いと思った。

なんか今日はイベントが多すぎて大変だった。
Oracle Bronze SQL基礎Iを朝から受験。2問落として受かった。できれば全問正解したいところだったがまぁ、しょうがない。

ここ最近、研修でSQLに触れる時間が爆発的に増えたのだが、よーやく副問合わせやグループ関数に関する苦手意識が払拭できたと思う。今まで自分が やってきたことに対する研修での落ち穂拾い効果はかなりでかい気がする。ネットワークとかネットワークとかネットワークとか。研修期間万歳ですね。

遂に配属先の発表があった。多数派からはぐれたっぽい( ;´Д`)
自宅から遠めの勤務地です。調べてみるとだいたい1時間10分ぐらい。思っていたよりは時間はかからないみたいだが、一番近い寮だと2駅分しかないらしいので寮にしようか激しく悩む...むぅ。

---
どうか~ください。という文を見るとどうしても頭の中が折田先生で一杯になってしまいます。困ったもんです。

前回のパッチ「微妙に新しくなったtumblrで動くようにするためのパッチを適用したReblogCommandにキー操作一発でprivateなreblogもできるような機能を追加した」ではtombloo経由で頑張っていたわけですが、tomblooの更新の度にパッチあてなくてはいけないのと、最近ReblogCommandのRevision logを参照したら単体でもまた動かせるように改造されていたので、また単体系に戻ろうかなと思い、作り直しました。

ReblogCommand@11618を元に作成しています。インストールはこちらから。


[2008/06/15追記]
cxx氏にreblogされていたので、ReblogCommand@12526対応版作った。基本的に本家同様isTumblrUserURL部分の修正のみ。

インストールはこちらから。

[2009/02/21追記]
→Tumblrの仕様変更によって再び使えなくなりました。最新版はこちら

#追記
書き忘れていましたが、今までと同様にyキーでprivate reblogになります。

以下、修正点(patch)

vimの設定

| コメント(0) | トラックバック(0)

このwikiがすごい
ずんWiki - vim

vimの設定をいじりたいなぁと思っていたので、参考にする。

孤独のグルメ (新装版)
kodokunogurume.jpg
最近気になっていた本。ゴローちゃんで反応した方は正解です。
結局近所の本屋では見かけなかった為、amazonを利用。

基本的に主人公のゴローちゃんがその辺にあるような(というか実在のお店がモデルらしい)メシ屋に行き、そこでメニュー選びに葛藤し、んで大抵失敗 するというお話なのだが、絵が実に味わい深くて良い。いっつも一人で飯を食っているのに、何故か心地よい孤独さ。日常系漫画が好きならおすすめ。

描写もすげー細かい。1コマ1日とか当たり前らしい。

---
Armour Modelling (アーマーモデリング) 2008年 05月号
Armour_Modelling_2008_05.jpg
表紙のフェルディナントに魅せられ、気づいたら買っていた。
大学生のモデラーとか居る!すげー。読んでるうちにオレもまた久々に作りたいなぁと思った。

巻末に載ってる対戦末期のPanther Fとか赤褐色でカコイイ。

---
Rozen Maiden 1 新装版
rozen_1.jpg
まだ買ってません。
買おうかなぁと思ったら売り切れ中。ネットで調べてみるとどこ行っても品切れだとか。密かにrozenブームなのだろうか?増刷されるまで気長に待つかのーと思っていたが、さっきamazon見たら品切れが解消されてた。
完全にamazon注文のタイミングを間違えた(*´A`)

履歴書としてのブログと日記としてのブログは完璧に別の場所でやる必要がある」を読んで。

オレはごっちゃまぜでいいんじゃないの?派だな。どーでもイイ話題とかはカテゴリーやタグ、そーしゃるなんとかつーるでフィルタリング出来るだろうし。別にドメインレベルで切り分けなくてもいいんじゃないかい?

とは言っても気づいたらいくつかの複数のサイトを管理(というかアカウントを持ってたり)している状態になっている。院生時代の暇つぶし産物。修論からの逃避行動とも言う。

ネットの人格でblogを切り分ける...というよりは機能で使い分けてるな。

日々の日常や技術的なメモ→ココ(Movable Type)
どーでもよい一言 → Twitter
ネタ、画像、破壊力の強いtext → Tumblr
ニコニコ動画専用 → はてな ニコニコ部

投稿のし易さはTextならTwitter、画像も含めるならTumblrがさいきょー。でもこれらは後でもう一度見たいってときには向いてない。自分で文章書いて後で読み直したいってときはココのblogを使う感じ。

ただ、mixiが絡むとちょっとやっかい。よくお前のページにアクセスするのがメンドイとか言われちゃう。自分は外部blogに関しては確認ページを自動ですっ飛ばすようなtool(mixiから外部リンクへの移行を簡単にするスクリプト AutomaticMoving@Mixi 0.1)を入れてるのであまり意識してなかったのだが、あの確認ページは確かにメンドイ。マイミクの外部blogに関しての確認は毎回しなくてもいいだろ、常識的に考えて...。

あとmixi内からすると外部のblogだとコメントしづらいってのもあるかもねぇ。外部ブログでも、コメントはmixi内で閉じていても良いような気はするのだが。ちょうどSMBのコメントのようなイメージ。

なんかmixiのシステムに対する愚痴になってきたので今日はそろそろ寝る。

某人に勧められたのでやってみまふ。
http://make.vis.ne.jp/i/moteta2/imoteta.cgi

「Lyo」さんのモテモテのタイミング
(モテミング)は
★第1回目:「11歳」!!
★第2回目:「24歳」!!
★第3回目:「58歳」!!

「モテモテのチャンスをゲットしてきたかな!?でも、モテるのは、まだまだこれからだよ!運命は自分で切り開くもの!!」
「Lyo」さんには
「あと2回もモテモテのチャンスがありますよ!!」

☆恋の性(さが)
★第1回目:「11歳」!!
・実は、かなり強い正義感が人気だね!
★第2回目:「24歳」!!
・サディズム的な欲求が、凄い刺激を与えていそうだね!
★第3回目:「58歳」!!
・少年・少女のような純粋な心を持ち、"自分の世界を守る"ところが逆に新鮮だね!
☆恋のラッキーアイテム
「時計」
☆恋のライバル
「時間」


実質残り1回じゃねぇか!( #゚Д゚)

スラッシュドット・ジャパン | ほぼすべてのBSDに存在してきたseekdir()のバグが25歳で死すという記事があったので、どんなbugでどんな修正をしたのか見てみた。個人的にLine48あたりがすげー気になった。(文法的な意味で)

例えば2つのint値を受け取り、足し算をし、その結果を返すような関数を定義するとしたら普通
int add(int a, int b) {/* 処理 */}と宣言するだろう。
ところが上記のソースを見ると
int add(a,b)
int a, b;
{/* 処理 */}
といった感じで宣言している。これはアリなのか?と思い確かめてみた。

#gcc -W test.c
#./a.out
6

コンパイル通ったし、しかも動いた...(´Д`)
こういう書き方初めて知ったー。なんか名前ついてるのかなぁ?

やっぱり、出来る人のソースを読むのは新しい発見が多いので為になる。

SJC-Pに追われて読むペースががた落ちです。これはいかん。

前回からの続きです。

--------------
12.クラスのメンバーへのアクセス可能性は最小限に抑える
まぁ、ですよねー的な内容。特に目新しいことはなかった。

Serializableなクラスだと、privateなメンバーでも公開APIの一部になり、変更の柔軟性が失われる。
public static finalな配列は×。配列の要素は変えたい放題なのでprivateにしてアクセサを作る。

--------------
13.Immutable(不変)クラス
-不変クラスを作るには
 1.オブジェクトを変更するメソッド(mutator)を提供しない
 2.全てのメソッドでオーバライドされないようにする
 3.全てのフィールドをprivate finalに
 4.可変オブジェクトの参照を持っていたとしても外部からアクセスされないようにする(これは上の1,2,3に含まれるよなぁ)

p62. 引数でうけとった不変オブジェクトの演算結果を不変オブジェクトで返すfunctionalなコード例

不変オブジェクトはスレッドセーフ。同期を吊る必要がない。よく使われる不変オブジェクトはキャッシュ化。例:Boolean
cloneやコピーコンストラクタは作らない。(Stringさん...)

-不変クラスのインスタンス生成コストがでかく、異なる個々のオブジェクトをあまり作りたくない場合の対処方法
 1stepで済んじゃうようなちょっとした操作。良い例かワカランが、ものすごい生成コストがでかいIntegerクラスがあったとして、そのオブジェクトにnを加算させたいみたいな場合→加算させるmutatorを作っちゃう。ただし不変で無くなる。

 1stepで済まないような操作→(複数stepを1メソッドにまとめて)可変コンパニオンクラスを使用。
 例:BigIntegerのdivide() 内部でMutableBigIntegerを使用。不変クラスの中で可変オブジェクトを低コストで生成して、これらをいじって演算結果を返している。

ソース見た方が早いかも。MutableBigIntegerなんてあったんだね。パッケージプライベートだからapiには出てないのか。
コンパニオンクラスなんて表現は初めて知ったのだが、これは不変クラスと一緒に使う補助的なクラスと考えればよいのか?

 そもそもどんな操作をされるのかワカラン場合→publicなコンパニオンクラスを提供。例:StringBuffer

2.全てのメソッドでオーバライドされないようにする の捕捉
全てのメソッドがオーバライドされないようにする為には...
classをfinal指定 or コンストラクタをprivate, コレの代わりに項目1で取り上げたstatic factory mehod。
柔軟性の面からEffective Javaでは後者の方が良いだろうと記述している。

-可変クラスのとりうる状態は少ない方が分かり易い
 →再初期化メソッドは作らない方がイイ?パフォーマンスは?
  →複雑さが増す方が厄介だし、再初期化メソッドによるパフォーマンス改善はあまりない。


---
ノートにメモってのは13章までか。現在18章辺りを読んでるが、はやくも14章あたりのことを忘れてるので明日からまた14章読み直して気になった部分をメモるかな。

続き。

--------------
14.extendsよりもコンポジションによる拡張
まぁ、これも12章同様、既に知っていたのですんなりと読めたかな。

p69-72
既存のコレクションクラスをextendsして無理矢理拡張したオレオレHashSetをコンポジション(いわゆるGoF23パターンの1つであるデコレータパターン)に書き換えた例の紹介。

extendsによる拡張は脆い。
 →親が自己利用(self-use)していると親クラス内部の実装に依存するため、親クラスの細かい修正でも子に影響が出る。
自己利用の例:本ではHashSetのaddAll()を挙げている。addAllは親クラスのAbstractCollectionで定義されており、その中でadd()を使っている。

コンポジションによる拡張は?
 →外部公開APIを使っているのでそうそう振る舞いは変わらないはず。

この項目で知らなかったのは委譲と転送の違いだ。
どうやら今まで自分が委譲だと思っていたものは転送と呼ぶらしい
参考:What is (Not) Delegation
(consultationで転送?Effective Java原文ではなんと書いてあるんだろう?)

委譲の場合、ラップする側の情報をラップされる側が把握できないとダメらしい。
だからラップされる側にラップする側のthis/selfを渡して初めて委譲と呼ぶことになるそうな。調べてみると更に真の委譲(true delegation)と呼ばれるモノがあり、これはラップされた側のthis/selfがラップしている側を参照している場合のことらしい。だから上のリンク先の図で表現してるのはtrue delegationの方だね。Javaのthisは常にそのクラスのオブジェクトへの参照なので、真の委譲は表現できないって事になる。ほへー( ´p`)

--------------
15.継承される事を意識した設計、ドキュメント作り。でなきゃ継承できないようにしてしまへ
項目14の続きみたいな感じかな?項目14にあったようなオーバライド可能メソッドの自己利用はちゃんとドキュメント化する。どこどこのメソッドでコイツを呼んでます。みたいな。
本ではドキュメントの良い例としてAbstractCollectionのremove()を挙げている。

継承される事を意識した設計
 →protectedでフックメソッドを提供。
GoFで言うところのTemplate Methodパターンだね。

 →項目10のcloneと被る内容だけど、コンストラクタ内でオーバライド可能なメソッド呼び出しはしない。もしオーバライドされてしまったら、子クラスのメソッドの方に遷移してしまうため。子クラスのインスタンスが出来てない状態で子クラスの(オーバライドされた)インスタンスメソッドが呼ばれると変な挙動をする可能性が大。

一般的なの具象クラスは?
 →どこでオーバライドされるか分からないからfinal class指定か、お馴染みのコンストラクタをprivate&static factory methodの提供。

--------------
16.継承クラスよりインタフェース
インターフェースを用いた多重継承について言及している。
自分の中ではクラスを継承するやり方はカテゴリー分け、振る舞いをインターフェースにより追加するやり方はタグ付けに近いというイメージかな。使い勝手の良さからインタフェースの方が良いと述べている。

インターフェースと抽象クラスをうまく組み合わせている例:AbstractInterfaseclass
→骨格を実装。最終的なインタフェースの実装社にとって便利なクラス。コレクション系クラスにいっぱいある。

抽象クラスの方がインタフェースよりより優れている点→メソッド増やすのが楽。逆にインタフェースでは一度外部公開したらもう後戻りは出来ない。インタフェースの設計は慎重に。

--------------
17.定数のみのインタフェースは×
クラス内で定数かenumか、又はpublic static finalにしてutilクラスに移す。

定数の為だけにimplementsを増やすのはデメリットしかない。
 -広く公開している場合、一回implementsしたら(バイナリ互換の為)もう容易には変えられない。
 -実装の詳細が外部公開APIとして漏れる(例:javadoc等)

--------------
18.ネストクラス
SJC-Pの勉強でもネストクラス辺りは難しかったなぁと思いつつ、読み進める。

+-----------------+
| クラス          |→このクラスのインスタンスをエンクロージングインスタンスと呼ぶらしい。
|   +----------+  |
|   |ネストクラス |  |
|   +----------+  |
+-----------------+

ネストクラスは4種類ある。
 1.非staticメンバークラス
 2.staticメンバークラス
 3.無名クラス
 4.ローカルクラス

外側のクラスの補助クラスとして使いたいが、限定されたメソッドの外からも参照したいし、メソッド内に定義するには長すぎる場合→メンバークラスに。

エンクロージングインスタンスにネストクラスがアクセスする必要がない場合→staticなメンバークラスに。(ネストクラスの個々のオブジェクトがエンクロージングインスタンスを参照しないようにメモリを節約する効果がある。)

クラスを定義しても、そのクラスの利用箇所が1つのメソッドに限定、クラスの内容も短いし、名前も付けづらい場合→無名クラス

名前は付けやすい場合→ローカルクラス(でも使うの?)

p89.Comparatorを実装した無名クラスのコード例。
自分が見た感じだとソート回数が限られてるのなら毎回無名クラスをnewするのもアリだが、頻繁にソートするのならばcomparator相当のクラスはSingletonにして使い回すのがベターだろう。(これについては項目22で言及されている)

でもそーすると無名クラスにしてはでかいクラスになってしまう。
-クロージャ使えたっけ?→JDK7かららしい
-クロージャはPerlでいうところの無名サブルーチン。でもJavaだとクラスになってしまうのでちょっとおおげさ。

---
4章はだいたいこんな感じか。次章に続きます。

今年も後輩の実家に行き、食ってきました。

先輩がNintendo DSを持っており、しかもDS Linuxが入ってるとのことだったのでちょっと触らせてもらった。

DSで真っ黒い画面いいよーいいよー。(画面はこんな感じ)

man
→man:command not found
diff
→diff:command not found

全然コマンドが使えないので、ほんとにLinuxかいなヽ(`Д´)ノ
とも思ったのだが、なんとPerl5.8.8が入ってるじゃないか!
しかもviまで入ってる。頑張れば通勤中にプログラミングとか出来そうだな、と思った。

...ただあのキーボードにはどうも慣れん。ケータイと同じ打ちにくさを感じる。

wikiを見てみると他にもsshとか使えるらしい。Wi-Fi通信できるらしいので夢が膨らむなぁ...。DS対応のキーボードとかあれば、DSってすげー安価な端末かもしんない。ちょっと欲しくなってきてしまった。

本日のTC:E

| コメント(0) | トラックバック(0)

休みの日ぐらいFPSで遊ぶ!

tce_20080502.jpg

最近CTF Custom Map CTF Server 0.49bってサーバが賑わってて良いです。30人越えとか久々に見た。
画像は0.48時代のNorth_Port。曇り空が懐かしい。

相変わらず伯爵の死にっぷりはトラウマもんだよなぁ。圧死だけはごめんです。

映画の途中、叔父さんを車で駅まで送っていったが、しばらく運転していないとこうも感覚が違うのか。なんかやたらとブレーキペダルがやわらかくなった気がする。

--
1,2日がお休みだったので平日しかできないことをやってた。
今までお世話になっていた銀行からお金をおろして、4月から使い始めた銀行口座に移動したり、薬がなくなりかけていたのでまた耳鼻科に行ってアクディーム90もらってきたり。2週間前の風邪がなかなか治らなくてトシかな?と思ったが2年前にも同じ事書いていた。がふん。

夏用スーツ2着買った!2ボタンスーツって1ボタンしか使わないらしい。初めて知った。

--
SJC-P 310-055を受けた。何その型番?って感じの資格名だが、Sunが認定するJavaの資格。自分は正答率87%で受かった。9問ミス。解いている最中、なんだかよくわからんと思っていた問題が11問ぐらいあったのでついていたな。バイトでJava使ったこともあるし、本当は100%取ってやろうと意気込んでいたが無理だった。悪意に満ちたコードが大杉だろ。

Effective Java3章の内容が割と役に立った。最近放置気味だったので休みの間読まないとねぇ。

このアーカイブについて

このページには、2008年5月に書かれたブログ記事が新しい順に公開されています。

前のアーカイブは2008年4月です。

次のアーカイブは2008年6月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 7.9.3