2017 6/25

『Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語』★★★

 石川洋資著、西山勇世著。自分で使うあては当面ないが。Scalaで見覚えある機能が多く、普通にアプリ作るのにこれ使えるなら、いいなあ、という印象。

『自己変革するDNA』★★★

 太田邦史著。ビジネス系自己啓発本と間違われそうなタイトルだが、これは文字通りに生物のDNAの本。結構面白い。

『イノベーションはなぜ途絶えたか ──科学立国日本の危機』★

 山口栄一著。

『失敗の科学 失敗から学習する組織、学習できない組織』★★★★

 マシュー・サイド著。今や見慣れた内容な気もするが、啓蒙書としてまとまり良い。

『ソシオパスの告白』★★★

 M・E・トーマス著。自らソシオパス(サイコパス)を名乗る人の本。この本自体に演技が入っていることは確実であろうことから、引いて読む必要はあるかも知れないが、面白かった。

『戦争にチャンスを与えよ』★★

 エドワード・ルトワック著。放言オヤジの無茶苦茶と言えばそれまでなのだが、ただの無茶苦茶ではなく、真理の一面に考えを向けさせる、価値ある無茶苦茶ではあると思う。

『六三四の剣』★★★★★

 村上もとか著。古いのはどうしようもないけど、これはおもろいわ。

『脳のパフォーマンスを最大まで引き出す 神・時間術』★★★★★

 樺沢紫苑著。個別には知ってることばかりなのだが、著者のYoutube見て「こんな胡散臭いおっさんにできてることが私にできないなんて許せん!」と一念発起して、ついに朝型化に成功したので、悔しいけど星5つ。いわゆるゲーム脳の概念に好意的な記述があるのは残念。

by 木戸孝紀 tags:

2016 7/1

『研究不正 – 科学者の捏造、改竄、盗用』★

 黒木登志夫著。流行り(?)もの。いいんじゃない?

『ザ・セカンド・マシン・エイジ』★

 エリック・ブリニョルフソン著、アンドリュー・マカフィー著。ありがちな話題と内容だけど。これも流行りもの。

『記憶に自信のなかった私が世界記憶力選手権で8回優勝した最強のテクニック』★

 ドミニク・オブライエン著。興味深くはあるけど「曲芸」でしかないかもねえ。

『坂の途中の家』★

 角田光代著。妻経由。これも小説として面白いというより女性(母親)心理としてなんか参考になる。

『スターティングGo言語』★★★★

 松尾愛賀著。Go言語けっこう好きになれそう。プログラミング経験者のGo言語最初の一冊としておすすめ。

『競争優位で勝つ統計学 —わずかな差を大きな勝利に変える方法』★

 ジェフリー・マー著。面白そうな話題なのに、やや散漫。

『こじらせない離婚』★★★★

 原口未緒著。女性視点。どこかで著者の記事を見て。離婚する気なくても非常にいいこと書いてる。

『プログラミング言語Go』★★★

 Alan A.A. Donovan著、Brian W. Kernighan著、柴田芳樹訳。訳者のブログ経由。同著者の有名なC本同様、内容はいいけど取っつきにくい雰囲気。『スターティングGo言語』の方を先にどうぞ。

by 木戸孝紀 tags:

2014 5/19

プログラマの数学

 珍しくCodeIQの問題をやってみたので回答期限と同時にここでも発表。コードは以下。

見積もり

 ダブりを考慮しない場合、ありうるプランの総数は、


2^162 ≒ 5.8 * 10^48

 もある。いくらダブりを省けるといっても、可能なプランを全て作って互いに比較していくようなやり方で正解を見つけるのは難しそう。

下準備

 まず計算しやすいように日付を整数に変換しておく。とりあえず1/1からの経過日数で表すことにする。2/29日はデータ中に存在するようなので、うるう年が存在する366日基準で。


1/1 => 0
12/31 => 365

 名前・出国日・帰国日を保持する国クラスを作っておこう。


case class Country(name:String, start:Int, end:Int)

考え方

 可能なチケットが有限である以上、ある日xまでに行ける国の数には上限がある。それを


mc(x)

 と書くことにする。

 問題の条件は12/31までに多くの国に行かせることだから、最終的に求めたいのは、


mc(365)

 であり、1/1の時点ではまだどこにも行ってないので


mc(0) = 0

である。

 一般のmc(x)を求めたい。帰国日がxの国がA, Bの2国あるとしよう、xの日に起こることは、以下の3パターンがありうる。

1.前日からすでに日本にいる
2.A国から帰国する
3.B国から帰国する

1.前日からすでに日本にいる場合

 今日はどこからも帰国していないので「今日までに行ける数」は「昨日までに行けた数」と同じ。


mc(x) = mc(x-1)

2.A国から帰国する場合

 A国に出国する前日(出国日と帰国日が同日になれない条件のため)までに行けた国の数は、


mc(A.start-1)

 と書ける。それにA国に行ってきたので1を足す。


mc(x) = mc(A.start-1) + 1

3.B国から帰国する場合

 2.と同様に、


mc(x) = mc(B.start-1) + 1

 となる。以下同一の帰国日が3ヶ国以上あっても同じ。

 実際のmc(x)はこれらのうち最大の場合の結果なので、擬似コードで書けばこうなる。


mc(x) = max(
	mc(x-1),
	(mc(A.start-1) + 1),
	(mc(B.start-1) + 1)
)

 再帰的なパターンに何か見覚えがある。動的計画法のメモ化再帰にできそうだ。これで最大国数が計算できる。しかも数字の1ではなく国名をリストに追加する計算をすれば、国数だけでなく直接旅程リストが出る。

コード

 本質的な部分は、こうなる。


package com.tkido.ticketgobble

object main extends App {
  import scala.collection.mutable.{Map => MMap}
  
  val countries = Parser("data/tickets.txt")
  val emap = countries.groupBy(_.end)
  
  val memo = MMap[Int, List[Country]]()
  def mc(day:Int) :List[Country] = {
    if(memo.contains(day)){
      memo(day)
    }else{
      val rst =
        if(day < 0)
          List()
        else if(emap.contains(day))
          ( mc(day-1) :: emap(day).map(c => c :: mc(c.start - 1)) ).maxBy(_.size)
        else
          mc(day-1)
      memo(day) = rst
      rst
    }
  }
  val list = mc(365)
  
  println("%d %s".format(list.size, list.map(_.name).sorted.mkString(" ")))

}

 中でも最も重要なのはこの行


( mc(day-1) :: emap(day).map(c => c :: mc(c.start - 1)) ).maxBy(_.size)

 その日が帰国日の国ごとに「その国の出国日の前日の最高のリストにその国を付け加えたリスト」を作成し、さらに前日の最高のリストをそれに追加し、そこからサイズ最大のリストを選択する。

 ちなみにemapは帰国日からその帰国日を持つ国のリストを引けるようにするマップ。

 これで可能な最大の国に行けるリストが出る。最大の国数になるリストは複数ありそうだが、少なくともそのうちどれかになるはず。もう少しいじれば最大の国に行けるリストを全て出すようにもできそうだが、

あなた「もしも、枚数が同じ複数のプランがあった場合にはどうしましょうか」
依頼者「プランはひとつだけ作っていただければ結構です」

 という問題の条件なので、ここまでで十分のはず。

by 木戸孝紀 tags:

2013 10/31

Jenkins実践入門 〜ビルド・テスト・デプロイを自動化する技術 (WEB+DB PRESS plus)

 すでに何ヶ月も前だが、有名なJenkins氏を導入した。

 Scalaで書いているプライベートプロジェクトなどで活躍中。

 他にも、英語脳の過去ログを本体と同じ時間に送ってこさせるとか、ちょっとした用途にも使用中。

 今は単純にcronで回っているニコニコ大百科IME辞書も、次に手を入れる機会があったら、こっちにやらせようか。

おまけ

 おっさんの画像を咲夜さんに変更してくれるプラグインとかないかね?

by 木戸孝紀 tags:

2013 7/31

Scala逆引きレシピ (PROGRAMMER’S RECiPE)

 ちょっと前の話だが、趣味の日曜プログラミングでScalaの並列コレクションを初めて実用する機会があった。

 要素数が多いが、それぞれは独立で、なおかつ一つの処理にかかる時間が長い、という条件にピッタリだということに気づいたので試してみたのだが、元のコードに


.par

 の4文字追加しただけで、速度が5倍(所要時間が1/5)になって、いい意味で狐につままれたような気分だ。ちなみに8コア条件。

 しかし、遊びレベルとはいえこんなにあっさり並行処理が実用できるとは文明の進歩はすごいな。

by 木戸孝紀 tags:

2013 3/6

Scalaスケーラブルプログラミング第2版

 最近Scalaが面白いので、久しぶりにこういうイベントを見てきました。

 とはいうものの、届いたばかりの『昨日までの世界』を電車で読もうと思って持って行ったら、そっちが面白すぎてあまり真面目に聞いてませんでしたが……。

by 木戸孝紀 tags:

2012 10/12

Scalaスケーラブルプログラミング第2版

 しばらく前からだが、Scalaを勉強中。

 頭の中にあるロジックを上からするすると書いていくことができ、Eclipseがエラーを出さなくなったと思ったらもう完成している、ということが多くて実に気持ちよい。こんな感触は初めてだ。

 記述量もスクリプト言語並かそれ以下だし、速いし、Java資産が直接使えるので「〇〇のライブラリがないので結局実用にならない」というありがちな事態も絶対に起きない。

 現時点では最高のバランスではないか。

おまけ

by 木戸孝紀 tags:

2012 7/6

テスト駆動開発入門

 TDD:テスト駆動開発の考え方はプログラミング以外にも広く応用が効きそうだと最近――と言っても年単位の話だが――思い始めた。


↓仕様(目標)
綺麗だけど動かない
↓実装する
汚くて動かない
↓とりあえずの修正
汚いけど動く
↓リファクタリング
綺麗で動く
↓次の仕様(目標)
綺麗だけど動かない
↓(繰り返し)

 昔からPDCAサイクルとか言うが、それに加えてTDDから参考にできそうなのは、まずは仕様≒理想・目標を定めたら、どんなに不格好でも不完全でもとりあえず動くように持っていくのが大事ということだ。

 綺麗でなくても全然構わない。どんなことも最初から上手くやることはできない。最初から綺麗にしようとすると挫折する。綺麗にするのは動いてからでもできるので、動いてからでよい。

 英語の勉強・体力トレーニング・家計簿・etc.、これを意識するようになってからそれ以前よりうまく行くようになった気がする事柄は多い。気がするだけかもしれんが。

おまけ

 ジョジョゲーム化だと!? これだけのためにPS3は買わないかなあ。

by 木戸孝紀 tags: