「eclipseたん」とのリンクがあったので、軽い気持で読んみた。
虎塚

ただ、読んでいるうちに「torazuka さん(中の人)はすごい」と思ってしまった。

trazuka さんは職業で IT に携っているようなので、私と似た環境にいるのかもしれない。
でも、私と違い、勉強会で交流を広げて、自分の勉強もして、その output を blog に頻繁で行い、
趣味もしっかり持っている。

自分も、今の会社に就職した頃は、こんなエンジニアを目指していた。
(まあ、自分の勉強については負けずに頑張ているつもりだが。)

私は大学で情報系の専攻をしていたわけでは無ので、始めは社外に IT エンジニアの知り合いもいなかったし、
勉強会も、どうやって参加すれば良いかわからなかった。

そんな中、最初の第 1 歩を踏出すために Ruby を勉強したりもした。
(日本では Ruby が盛んなので、勉強会が多いし、参加の敷居が低いと感じたから。)

ただ、勉強会もいつしか参加しなくなったし、やっとの思で始めた Blog も更新頻度は低い。
あと、自分メモであり他人が見てもつまらないと思う。
仕事が忙しいと、つい手を抜いてしまうから。

でも、そんな事は言い訳なんだよね。
現に、torazuka さんは出来ているんだから。

そんな反省もこめて、Blog を更新してみた。
次は、勉強会の参加かな。
最近、「ツールを作成する時は、原則 Python を使うこと」というお達しが会社から来た。
各個人がツール作成に使用する言語を統一して、会社としての効率を上げることが目的らしい。

今まではツール作成には Ruby を使用していたが、そんな分けで Python の勉強を始めた今日この頃。
そして、早速だが class の多重継承時の挙動について壁にぶつかった。
いわゆる、「菱形の継承」というやつだ。

菱形の問題に入る前に、Python の継承について確認。

まず、Python は多重継承が可能だ。
クラス A と B を継承するクラス C を作成するには、クラス定義の際に以下のようにすれば良い。
class C( A, B ):


この時、C のインスタンスは、C -> A -> B の順にメソッドを探す。
( class C( B, A ): となっていれば、C -> B -> A の順 )
例えば、以下のように

クラス C でメソッド met1 を、
クラス A でメソッド met2, met3 を、
クラス B でメソッド met3 を実装した場合、
simple


クラス C のインスタンス ins_C では、
  ins_C.met1() -> クラス C で実装された met1 を実行
  ins_C.met2() -> クラス A で実装された met2 を実行
  ins_C.met3() -> クラス A で実装された met3 を実行
する。
(クラス B よりクラス A を先に探すので、クラス B の met3 は実行されない。)

また、メソッドの検索は再帰的に行われる。
以下のように、
class D( B, C ): と実装した場合、
recursive

D のインスタンスは始めに D -> B の順で method を探す。
そして、B を探す際に再帰的に A も探す。
A にも無い場合、B にはないと判断し、次の C を探す。
結果として、D -> B -> A -> C の順で探す。
D のインスタンスで met1 を実行すると、A で実装されたメソッドが実行される。

以上をまとめると、検索は以下の優先順位で行われる。
  1.自分自身
  2.上のクラス(上のクラスが複数有るばあい、その中の最も左の物)
  3.右のクラス(右のクラスが複数有るばあい、その中の最も左の物)

では、菱形の場合、どうなるだろう。
以下のような場合、
diamond

Python の古いバージョンでは、上記の規則に乗っ取り
D のインスタンスは D -> B -> A -> C の順にメソッドを探す。
つまり、A の met1 を C でオーバーライトしたにも関らず、C を継承している D で met1 を
実行した際に A の met1 が実行されてしまう。

しかし、Python 2.3 以降では新スタイルのクラスを定義できるようになった。
新スタイルクラスは、object というクラスを継承することで適用される。
そして、上記のクラスを新スタイルクラスで実装すると、
D のインスタンスは D -> B -> C -> A の順にメソッドを検索する。

新スタイルクラスでは、検索規則の 4番目に但書が加わるようだ。
  1.自分自身
  2.上のクラス(上のクラスが複数有るばあい、その中の最も左の物)
  3.右のクラス(右のクラスが複数有るばあい、その中の最も左の物)
  4.ただし、そのクラスが、後で検索に再度 hit する場合は後回しにする

つまり、検索規則の 1-3 のみを馬鹿正直に適用場合、D のインスタンスの検索順序は以下になる。
D -> B -> A -> C -> A
A が 2 回出てくるが、規則 4 により最後に hit した物のみ有効にする。
つまり、D -> B -> C -> A
の順になる。

この方法だと、D で met1 を実行した際に、C でオーバーライトした物を使用できる。

と、言うことを、時間をかけて実験しながら推測したが、ググったら同じことが書いてあった。
Python 2.6.4 documentation
Python 2.3 Method Resolution Order





IT業界で仕事をしていると、否が応でも今後のスマートフォンについての話題を耳にする。
特に、情報漏洩に敏感になりながらシンクライアントを導入していない企業が多い昨今では、
PC の持ち出しに厳しくなり、必然的にスマートフォンの需要が高まる。

現在の話題の中心は Android と iPhone の今後のシェア争いについて。
大方の意見として一致していることは、
・現在は iPhone が突き放しており、この傾向はしばらく続く
・しかし、いずれ Android が iPhone を追い抜く


本日、PM 兼 営業の先輩が、面白い事を言っていた。
曰く、
ソフトバンクと Apple の契約には、必ず期限がある。
その期限が切れる前後で、大勢が大きく変わるのではないか

とのこと。

「なるほど」と思った。

以上、職場の日記

まあ、私の意見(希望)は少し違う。

Android が iPhone を抜くころには別の技術が出来ており、Android の時代が
来ないまま終わることだ。

私は、モバイル(スマートフォンに限らず)のソフトウェアの進化を、ハードウェアから切り離すことを
Android に期待している。

一般に、コーディングには多くのエラー処理や、それに付随するフレームワーク処理があり、
さらに商用のソフトウェア開発には検証(テスト)やドキュメント作成が加わり、
プロジェクト全体で見ると打ち合わせ、プロジェクト管理(WBS作成など)が加わる。
そのために、やれ「デスマーチだ」、「人月だ」と言っているが、
純粋に技術的な意味で「創造」している時間は非常に短い。

ソフトウェア技術の進化は、ハードウェア技術の進化と比べて速度が圧倒的に速いのだ。

PC 市場において、進化のボトルネックは「技術」ではなく「人間」だと思っている。
サーバー市場においては、仮想化と複数台のサーバーを用いて運用することで
ソフトウェアの進歩はハードウェアのボトルネックを切り離した。

これに引きかえ、つい最近までモバイル市場のソフトウェア進歩は
ハードウェアの進歩に足を引っ張られ続けていた。

この状況を一定のレベルにおいて改善してくれたのが iPhone だ。
Mac が 1台あれば誰でもアプリケーションを開発でき、PC 用のソフトウェアを
簡単にモバイルに移植できるようにしてくれた。

しかし、まだ足りない。
iPhone のソフトウェアは「端末」というハードウェアに縛られている。

Android ならば、その束縛を破ってくれるのではないか。
そして、Android の時代が来る前に別の進化が追いついてしまうほど、
ソフトウェアの進化を速めてくれはしないか。

以上、学生時代にで基礎物理を専攻し、現在 SE の私が抱く夢物語。

多分、夢は夢で終わるけどね。
エンジニアが夢を見て何が悪い。