2007-12-06 [長年日記]
■iFox Grapite よ。さようなら
Firefoxのテーマの話なんですがね、iFox Graphiteの最新バージョンが Google Toolbar と見た目がマッチしないわけで使うの止めました、と。
まぁ、自分で直すとかできないこともないんですが、継続的なアップデートがないというのは不安があるってことで、昨日の話ともつながって終わり。
■無限リストの無限リストから要素を全部列挙する
というか、「どんな要素もいつかは出てくる」列挙法を考えよう、という話題。
リストのリストの全要素を列挙したリストを作ろうと思ったら、まあ適当に全部結合すると思います。
d.y.d.
(略)
無限リストの無限リストだとどうでしょう。 単純にflattenしてしまうと、先頭にあったリストの要素以外は永遠に出てきません。
(略)
これだと不便なこともあります。というわけでお題。順番はどう変えてもいいから、とにかく『どの要素もいつかは出てくる(有限ステップ以内には出てくる)』ように列挙したリストを返す関数を作ってみてください。
考え方自体は簡単で、カントールが有理数の濃度が自然数の濃度に等しいことを証明した手法でよいわけだ(リンク先エントリにも当然書かれています)。
あとはプログラミング言語にやらせるには? という話で、
無限オブ無限:反応リンク集
d.y.d.
から、この問題へのレスポンスが紹介されている。
これは面白い。
■色分けされたカーソルで視認性を高める
ほうほう。
私のカーソル設定はこんなん。
通常のカーソルは10年来、このデザイン/大きさのものを使ってきた(ファイル日付が1996年だもんなぁ)。
これを一歩進化させたアイデアになるほどと頷いた。
■能力の罠(Competency Trap)
思い当たる節ありまくり。
プロジェクトリーダーも、プロジェクトメンバーも、どちらの立場でもこのエントリは読んでおくべき。
これは、「正しいプロセスを省いて誤った学習を積み重ねるうちに、能力が頭打ちになる」という内容のこと。
プログラマの思索: 能力の罠(Competency Trap)
「能力の罠」とはつまり「自分が自分自身のできることを知ってしまうことで生まれる限界」みたいなものか。
悪循環に陥った時、その状況を根底から覆さなければ何も変わらない。
そして変化させた時、結局、「機能を新規に作るよりもバグを潰して品質を高めることを優先する」ような正攻法に戻している。
(略)
プロジェクトリーダーとしては、アサインする開発者に、プログラミングを経験させながら1ヶ月前よりも今日、昨日よりも今日、成長することを期待している。
理由は、システムのアーキテクチャや仕様も慣れてくるだろうから、最終的にはもっと工数を短く出来るでしょ、と。でも実際は、同じような失敗を繰り返し、成長しない開発者も多い。
そうすると、プロジェクトリーダーとしては、プロジェクト後半になると工数計算できなくなるからすごく苦しい。
(略)
このとき、プロジェクトリーダーは、ディレクティブ・リーダーではなく、ファシリタティブ・リーダーになってくる。
プロジェクトマネジメント(PM)とプロジェクトファシリテーション(PF)は、プロジェクトを回す両輪。
今回は引用だけですみません。いつか、これを受けて自分なりに考えたことを書きたいです(と宣言しておくことで自分を追い詰める)。
■Javaのアクセス指定の謎
これでメソッドfはOKでメソッドgがNGなのはなんで?
2007-12-06 - きしだのはてな
むしろfがOKな方にびっくり。
継承を外すとg()が駄目なのは当たり前。
public class N{ class A{ private int a; } class B { void f(A ar){ System.out.println(ar.a);//OK } void g(){ System.out.println(a);//コンパイルエラー } } }
class B の中で、a と書くと、自身→スーパークラスのprotected, publicメンバ→アウタークラスのメンバの順に探すのかな?
例えば、アウタークラスの方にprivateメンバを置けば、
public class N{ private int a; class A{ private int a; } class B { void f(A ar){ System.out.println(ar.a);//OK } void g(){ System.out.println(a);//OK } } }
はい。コンパイル通る。
継承を戻して、this.a でアクセスすると、
public class N{ private int a; class A{ private int a; } class B extends A { void f(){ System.out.println(this.a);//コンパイルエラー } void g(){ System.out.println(a);//OK } } }
となる。ふむ。まぁそうかも。
B は A のサブクラスだから、Aにアップキャストすると……。
public class N{ private int a; class A{ private int a; } class B extends A { void f(){ System.out.println(((A)this).a);//OK } void g(){ System.out.println(a);//OK } } }
あ。コンパイル通った。
と、いうことは当然。
public class N{ private int a; class A{ private int a; } class B extends A { void f(){ A ar = this; System.out.println(ar.a);//OK } void g(){ System.out.println(a);//OK } } }
この書き方でも通るな。
へー……。