コグノスケ


link 未来から過去へ表示(*)  link 過去から未来へ表示

link もっと前
2014年5月3日 >>> 2014年4月20日
link もっと後

2014年5月3日

無責任

ソ連型システム崩壊から何を汲み取るか──コルナイの理論からを読んで。

役所の税金無駄遣い、失敗だらけの第三セクター、銀行の公的資金注入、赤字企業の経営陣…、などを見る度に感じるイライラは何だろうと思っていたのですが、この記事が見事に説明してくれました。

上記いずれも、決断者はリスクを伴う決断をしますが、生じたリスクは他人に押し付けるという構造になっている、という指摘です。

要するに全員「偉そうに指示したくせに、しくじったらトンズラする無責任野郎」なのです。

見ていて腹が立つわそりゃ。非常にスッキリしました。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 19:44)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年5月2日

判断ミス

今の偉い人が現役だった1990年くらいから、現在2010年で見たら、ハード規模の増加率と、ソフト規模の増加率はどっちが上なんでしょう(組み込み系で)。

開発人員の割り振りを見る限り、日本の老舗メーカーはどうもハード規模の増加率が上だと判断し、海外のメーカーはその逆だと判断した、ように見えるのです。

どちらの判断が正解か私にはわかりませんが、今の日本メーカーの傾きっぷりを見るに、海外勢が正解だったように思えて仕方ありません。

ハード復権の時代は来るでしょうか…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 19:42)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年5月1日

イテレータ

Javaを始めたときにコケたので思い出深いのですが、C++ とJavaってイテレータの概念が全然違いますね。

C++ のイテレータはコレクションの要素そのものを指しています。N個要素を持つ配列aのイテレータitであれば、a.begin() はa[0] を指し、itはa[0] からa[N - 1] の間まで有効な要素を指し続けます。a.end() は存在しないa[N] を指します。

C++ のイテレータ

begin()                                        end()
|                                              |
a[0]   a[1]   a[2]   ... a[N - 2]   a[N - 1]   a[N]
|      コレクションの有効範囲       |

C++ 方式の利点は、イテレータが何を指すのか直感的に理解しやすく、イテレータ経由での要素の書き換えや削除のイメージが沸きやすいことです。

欠点はbegin() は参照して良いのに、end() は参照してはいけない、という非対称な仕様になってしまうことです。例えば、逆転イテレータ(reverse_iterator)を実装するとbegin() をend(), ++ を -- として扱うだけでは作れずに、悲しい思いをします。

Javaのイテレータは要素と要素の「間」を指しています。Javaにbegin(), end() はありませんが、対比のため無理やり書くと下記のようなイメージです。

Javaのイテレータ

 begin() = iterator()                           end() = hasNext() がfalse
 |                                              |
   a[0]   a[1]   a[2]   ... a[N - 2]   a[N - 1]
   |      コレクションの有効範囲       |

Java方式の利点はbeginとendが対称的になることです。もうbeginとendで悲しい思いをすることはありません。

欠点は書き換えや削除の対象がわかりづらいことです。特に双方向イテレータ(ListIterator)が顕著なので、もう少し詳しくご紹介しましょうか。

Javaコレクションの仕様ではイテレータが「最後に返した要素」が書き換え(set)や削除(remove)の対象、となります。ListIteratorは進む/戻るのどちらもできますから、イテレータの現在位置の「直前」あるいは「直後」どちらかの要素が対象となります。下記に図示します。

JavaのListIteratorのset()/remove() の対象

最後の操作がnext() だった場合
------------------------------
       set()/remove() の対象
       |    現在位置
       |    |
a[0]   a[1]   a[2]   ...


最後の操作がprevious() だった場合
----------------------------------
            現在位置
            | set()/remove() の対象
            | |
a[0]   a[1]   a[2]   ...

現在位置が全く同じでもset()/remove() の対象が変わる、この動きは正直ややこしいです。

利点の両立は難しいでしょうから、あとは皆さんの好みでしょうか。私は対称性を取ってJava方式に一票かなあ…。

編集者:すずき(2014/05/01 12:03)

コメント一覧

  • IKeJIさん(2014/05/02 13:04)
    常に内部イテレータを使うべき(極論)
  • すずきさん(2014/05/06 00:51)
    >IKeJIさん
    内部イテレータって foreach ですか?
    コレクションの要素が多すぎて単純な全列挙→フィルタで処理できないときや、イテレータを飛ばしたり戻したりするのが難しそうです。
  • IKeJIさん(2014/05/11 04:11)
    foreachに限らず、eachとかmapとかfoldとかそういうのも含めて考えてました。

    > コレクションの要素が多すぎて単純な全列挙→フィルタで処理できないときや、イテレータを飛ばしたり戻したりするのが難しそうです。

    どういう処理でしょう?何か例がありますか?

    俺みたいな低能力プログラマには外部イテレータは難しすぎる気がします。
    もし、for文を書かないといけない時は、椅子に座りなおして、コーラを取ってきてから、気合を入れてかきます。
  • すずきさん(2014/05/11 17:53)
    >IKeJI さん

    >どういう処理でしょう?何か例がありますか?

    特殊すぎる処理で申し訳ないですが、現に困ってるのは、
    「最初の 4バイトがタイプで、最初の 4バイトがサイズ、そのあとサイズ分だけのデータが続く」
    というバイナリを見るとき、もし A, B, C と並んでいれば頭から順に解析できますが、A, C, B と並んでいる場合は頭から順に解析することができない、という構造です。

    さらに C は数 GB あったりして、とにかく全部メモリに置くという作戦もとれません。

    今は外部イテレータにして、わからない部分は飛ばして、位置だけ「仮 C」として覚えておき、後で読む、としていますが、それを foreach や map や fold でどうやって書くのか思いつきませんでした。

    特に Scala の場合、map や fold を List に対してぶちかますと、List の全要素に対して述語の評価を行うので、List の要素が数 GB 以上になると map や fold が現実的な時間で帰ってきません。


    >俺みたいな低能力プログラマには外部イテレータは難しすぎる気がします。
    >もし、for文を書かないといけない時は、椅子に座りなおして、コーラを取ってきてから、気合を入れてかきます。

    たしかに for + 外部イテレータは面倒くさいです。
    外部イテレータ以外の方法があれば使ってみたいんですけど…。
open/close この記事にコメントする



2014年4月28日

神の一手

コンピュータ将棋の電王戦が非常に話題になっていました。盛り上がりについて行けていませんが、結果だけ聞くとプロと勝負できるまでになったとか、こりゃすごい。

チェッカーは神の一手(全手読み切った上での、最善の一手)がわかるそうですが、チェス、将棋、囲碁は探索範囲が広すぎるのでほぼ不可能でしょう…。神の一手は興味深いですが、わからないからと言ってコンピュータ将棋が弱くなるわけでもなく、今後、コンピュータ将棋はもっと盛り上がることでしょう。

将棋の探索範囲の広さは1局面にざっと80通り(※)指せて、終局まで110〜120手くらい指すので、探索空間は80^120程度です。10のべき乗がお好きなら、
10^x = 80^120の自然対数取って、
x * ln10 = 120 * ln80
x = 120 * ln80 / ln10 = 228.5
となって10の228乗くらい、と見積もれます。調べてみると一般的には10^220と言われているようです。ややズレたのは、なんでだろ…。

(※)歩が9枚(1通り * 9)飛(16通り)角(最も動けて16、動けなくて8なので、間を取って12通り)王(8通り)金(6通り * 2)銀(5通り * 2)桂(2通り * 2)香(最も動けて9、動けなくて0なので、間取って4.5通り * 2)として、1局面80通り、駒を取られても再び置けるため、指せる手の平均値はほぼ変わらない、とした。

囲碁はどうか?

コンピュータ囲碁はどうだろう?と調べてみると、2006年にモンテカルロ法(1手ずつデタラメに置いて、勝ちの確率が高い手を探す)を採用した強いソフトが出て、今やアマ有段者並の強さとのこと。こちらもすごいですね…。

モンテカルロ法はリバーシや囲碁などの性質を非常に上手く使っています。リバーシや囲碁は1手指せば1つ空きマスが減るため、メチャクチャに打っても必ず終局にたどり着ける、という性質があります。これを上手く利用して、メチャクチャに打った手の中で勝率が高い手はどれか?を探すそうです。

囲碁では有効なモンテカルロ法ですが、将棋への適応は難しいようです。なぜなら将棋はデタラメに指しても終局に近づかない(ループして盤面が戻ってしまう)ためです。

並べられることの多い、将棋と囲碁ですが、探索方法一つとっても違いがハッキリ出ていて面白いですなー。

編集者:すずき(2014/04/29 16:47)

コメント一覧

  • よしだあさん(2014/04/29 22:24)
    囲碁はモンテカルロ法なんて使ってるんやね。
    将棋にしても囲碁にしても、ぜんぜん分野違いの理論が取り入れられて強くなってるってのは、とてもおもしろいなー。
  • すずきさん(2014/05/01 07:13)
    >よしだあ さん
    専門外のことでも深く理解しておくと良いことありそうだね。
    ただ知っているだけじゃ応用効かないから、どれくらいやるべきかは難しそうだけど…。
open/close この記事にコメントする



2014年4月27日

何も解決しない結論

なぜなぜ分析は、危険だ - タイム・コンサルタントの日誌からを読んで。

会社のなぜなぜ分析も、この記事の「悪い方の例」とそっくりです。

大の大人が何時間も掛けて分析した結論が「以降、ミスしないように気をつけます」ですからね。

まさか小学生じゃあるまいし、そんなのありえないよ!って思うかも知れませんが、悲しいことに現実なんですわ…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 20:01)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



2014年4月21日

好き嫌い?優劣?

プログラミング言語の優秀さと道具としての評価は別 - kなんとかの日記を読んで。

本文に異論は無いんですが、タイトルの「プログラミング言語の優秀さ」って何だろう?と思った。

言語屋さんから見て、明確に優劣が決まる基準があるのかなあ?変な言語に手を出す前に、その基準で見てみたい…。

メモ: 技術系の話はFacebookから転記しておくことにした。

編集者:すずき(2015/11/29 20:07)

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
2014年5月3日 >>> 2014年4月20日
link もっと後

管理用メニュー

link 記事を新規作成

<2014>
<<<05>>>
----123
45678910
11121314151617
18192021222324
25262728293031

最近のコメント5件

  • link 21年9月20日
    すずきさん (11/19 01:04)
    「It was my pleasure.」
  • link 21年9月20日
    whtさん (11/17 23:41)
    「This blog solves my ...」
  • link 24年10月1日
    すずきさん (10/06 03:41)
    「xrdpで十分動作しているので、Wayl...」
  • link 24年10月1日
    hdkさん (10/03 19:05)
    「GNOMEをお使いでしたら今はWayla...」
  • link 24年10月1日
    すずきさん (10/03 10:12)
    「私は逆にVNCサーバーに繋ぐ使い方をした...」

最近の記事3件

  • link 23年4月10日
    すずき (11/15 23:48)
    「[Linux - まとめリンク] 目次: Linux関係の深いまとめリンク。目次: RISC-V目次: ROCK64/ROCK...」
  • link 24年11月6日
    すずき (11/15 23:47)
    「[Ubuntu 24.04 LTS on ThinkPad X1 Carbon Gen 12] 目次: Linux会社ではTh...」
  • link 24年11月11日
    すずき (11/15 23:26)
    「[Pythonのテストフレームワーク] 目次: Python最近Pythonを触ることが増えたのでテストについて調べようと思い...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 11/19 01:04