戦略思考コンプリートブック

"自分で課題を定義し、仮説を立てる"。
筋道立ててやり方解説した本は、自身の考え方を鑑みる際に有益。
キーワードや手法が数多く出てくるゆえに頭に入りきってはいない。
折を見て見返したいなと思っている。

ピックアップ

空雨傘紙

  • 「空」→ファクト(=情報・事実・データ)を集め
  • 「雨」→ファクトの分析結果を出
  • 「傘」→具体的な提言をす
  • 「紙」→行動(アクト)の具体的なプランを作
  • 日々の仕事や会社での議論の中で、“待てよ、今は「空・雨・傘・紙」の、どの段階かな”と自問しよう。そして、「空」や「雨」のステップで議論が空回りしているなら、あなたがイニシャチブをとって、どんどん「傘」、そして「紙」のステップまで引っ張ろう
    • at location 355

戦略思考

  • 戦略思考は、創造力の源泉である右脳と、論理力を司る左脳を同時に動かし、課題を解決していく
    • at location 200
  • 左脳でロジックを組み立てるには“イシューツリー”というツールを使う。右脳の創造力は“仮説”としてまとめあげる。この左脳のロジックと右脳のクリエイティビティとをいかにコラボレーションしていくかが、戦略思考の最もキモとなる頭の動かし方だ
    • at location 211

読んだら忘れない読書術

  • 自身の読書習慣を後押しするために読むサプリメントのような役割を果たしてくれた
  • マーカーで線を引くことを脳科学を論拠に説明してるの、新鮮

ピックアップ

○ 1. 記憶に残る読書術
★最初のインプットから、7~10日以内に3~4回アウトプットする
1. 本を読みながらメモをとる、マーカーでラインを引く
2. 本の内容を人に話す、人に勧める
3. 本の感想や気付きを、SNSでシェアする
4. メルマガ等に書評、レビューを書く

○ 2. スキマ時間読書術
★私は月30冊本を読みますが、全てスキマ時間だけで読んでいます。
私の場合は「移動時間」がほとんど。「電車に乗っている時間」「電車を待っている時間」です。
人生の1割を占めるスキマ時間を「浪費」に使うか「自己投資」に使うのか。
この時間の使い方次第で、あなたの人生は変わります。

○ アウトプット読書術1: 深く記憶に残す ~ マーカー読書術 ~
脳科学的には、ラインを引くことは間違いなく脳を活性化します。

関数型プログラミングとscala

「実践Scala」では1章とって関数型プログラミングについて解説されているので、そこのサンプルコードを則ってscalaの文法を追う。

再帰。

def count(input:String, ch:Char) : Int = {
    var result = 0
  var i = 0
  while(i < input.length) {
    if(input(i) == ch) result += 1
    i += 1
  }
  result
}

末尾再帰(最後に自分自身を再帰呼び出しする)。

def fact(n: Int): BigInt = {
  def f(n: Int, acc: BigInt): BigInt = if (n < 1) acc else f(n - 1, BigInt(n) * acc)
  f(n, 1);
}

リストのメソッド、プレースホルダー構文、遅延評価の線形リストStream。

val nums = List(1, 2, 3, 4, 5)
println(nums.flatMap(x => List(x, x)))
println(nums.flatMap(x => nums.map( y => (x,y)) ))

var list = List("AAAA", "bbbb", "ccc", "DD","e", "Abcde")

println(list.filter(e => e.startsWith("A")))

list.find(e => e.startsWith("A")) match {
  case Some(n) => println(n)
  case one => None
}

nums.span(e => e < 3) match {
  case (x,y) => println(y)
  case _ => None
}

// カリー化の代替としてのプレースホルダー構文
def add(x:Int, y:Int) = x + y
println(List(1, 2, 3).map(add(2, _)))

// 遅延評価される線形リストStream
val lines = Stream.continually(readLine())
for(line <- lines.takeWhile(_ != null)) println(line)

CommonLispをかじってた頃を思い出して少し懐かしくなった…

Scala

Scalaについて触ってみようと思い立ちました。 さしあたっては基本的なところとWebフレームワークを触るところまでを考えています。
参考: EclipseでScalaプログラミングを始めるための基礎知識 (2/3) - @IT

インストール

Scala ダウンロード

msiがあった。

C:\scalaにインストール。

環境変数の設定

PATHは通ってた。

REPL

C:\Users\qnzm>scala -version
Scala code runner version 2.9.2 -- Copyright 2002-2011, LAMP/EPFL
C:\Users\qnzm>scala
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_22).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println("Hello Scala World!!!!")
Hello Scala World!!!!

バージョンは2.9.2。

Scala IDE for Eclipse

eclipseはもともと入っていたので。

全てインストール。

情報


変数

  • var : 再代入可。普通の変数
  • val : 再代入不可。代入のことを「束縛(bind)」ということも。(関数型っぽい)
  • 可能な限りvalを使うのが良い。

データ型

  • ルートはAny型
  • その下に値型AnyValと参照型AnyRef。
  • 値型AnyValはプリミティブ型。
    • Boolean
    • Byte
    • Short
    • Char
    • Int
    • Long
  • 参照型AnyRefはSystem.lang.Object相当。
    • 文字列String
    • List
    • Map
  • Unit(voidに相当)

比較

  • 同値性は「==」演算子(javaのequalsとは異なる)
    • 両辺がnullでないかも見てくれる。

ヒアドキュメント

"""で囲むとエスケープシーケンスや改行もそのまま記述できる。

scala> var str = """aaa
     | bbb
     | ccc
     | ddd"""
str: java.lang.String =
aaa
bbb
ccc
ddd

Symbolリテラル

識別子の前に「'」(クォート)を付けることで、その文字を表すSymbolリテラルになる。 Symbolリテラルは必ず同一。 比較が高速(同じオブジェクトを指しているかを見るのみだから) マップのキー等で活用。

XMLリテラル

整形式(well-formed)であることが保証される。「&」「<」「>」などの文字は自動で適切にエスケープされる。 XMLを使えば、エスケープ処理を気にしなくて良い。

scala> val title:String = "aaa"
title: String = aaa

scala> val html =
     | <html>
     |  <head><title>{title}</title></head>
     | <body>
     |   <h1>{title}{new java.util.Date}</h1>
     | </body>
     | </html>
html: scala.xml.Elem =
<html>
 <head><title>aaa</title></head>
<body>
  <h1>aaa Sat Oct 13 15:59:18 JST 2012</h1>
</body>
</html>

配列

javaと異なり、配列もオブジェクト。

scala> val arr:Array[Int] = Array(1, 2, 3, 4, 5)
arr: Array[Int] = Array(1, 2, 3, 4, 5)

scala> arr
res8: Array[Int] = Array(1, 2, 3, 4, 5)

scala> arr(2)
res9: Int = 3

List

線形リスト。不変データ構造。

scala> var lst:List[Int] = List(1,2,3)
lst: List[Int] = List(1, 2, 3)

scala> lst
res11: List[Int] = List(1, 2, 3)

scala> lst(2)
res12: Int = 3

Map

ハッシュ/連想配列/辞書型。デフォルトでは不変。

scala> val map = Map("a" -> 1, "b" -> 2)
map: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2)

scala> map
res13: scala.collection.immutable.Map[java.lang.String,Int] = Map(a -> 1, b -> 2)

scala> map("b")
res14: Int = 2

タプル

scala> (1, 2)
res15: (Int, Int) = (1,2)

scala> ("a", "b", "c")
res16: (java.lang.String, java.lang.String, java.lang.String) = (a,b,c)

scala> ("a", 1)
res17: (java.lang.String, Int) = (a,1)

制御構造

scala> if( i % 2 == 0 ) println("even") else println("odd")
even
scala> var cnt = 0
cnt: Int = 0

scala> while(cnt <= 5){
     |   println(cnt)
     |  cnt = cnt + 1
     | }
0
1
2
3
4
5

scala> for( n <- 0 to 3){ println(n) }
0
1
2
3

scala> var xs = List(0,2,4,6,8)
xs: List[Int] = List(0, 2, 4, 6, 8)

scala> var ys = List(1,3,5,7,9)
ys: List[Int] = List(1, 3, 5, 7, 9)

scala> for(x <- xs; y <- ys; if x > 3; if y > 4) yield x + ":" + y
res24: List[java.lang.String] = List(4:5, 4:7, 4:9, 6:5, 6:7, 6:9, 8:5, 8:7, 8:9)

for文で、リスト内包表記が書ける。(Scalaでは、for内包表記と呼ばれている) for文の「一時変数 <- 配列etc」の部分はジェネレータ部と呼ばれ、;(セミコロン)区切りでいくつでも指定できる。

例外

パターンマッチに従い例外を捕捉。

scala> val n = try{ "99".toInt } catch { case e:Exception => -99 }
n: Int = 99

関数

scala> def foo(x:String):String = { x + ":" + x }
foo: (x: String)String

scala> foo("bar")
res27: String = bar:bar
  • returnは書かない(式を評価した結果の値が、関数の結果)
  • 括弧は省略可能
  • ただし、副作用を伴うなら括弧を付けて宣言することが推奨されている

アンダースコアを末尾につければ、関数を取り出せる。 (関数はファーストクラスオブジェクト)

scala> val func = foo _
func: String => String = <function1>

scala> func("2")
res32: String = 2:2

関数を引数に取る、関数リテラル

scala> def evenOrOdd( f:(Int) => Boolean, n:Int ) = {
     |   if( f(n) ) "even" else "odd"
     | }
evenOrOdd: (f: Int => Boolean, n: Int)java.lang.String

scala> evenOrOdd( n => n % 2 == 0, 9)
res33: java.lang.String = odd

プレースホルダー構文(引数省略時、アンダースコアで引数を受け取る)

scala> evenOrOdd( _ % 2 == 0, 9)
res34: java.lang.String = odd

高階関数

scala> def rep( n:Int ) = { (s:String) => s * n }
rep: (n: Int)String => String
scala> rep(2)("foo")
res37: String = foofoo

型推論

  • 変数宣言での型指定
  • 関数の返り値型の型指定

雑感

  • 細かく気を配って綺麗で短い構文を心がけている印象。
  • 関数型のエッセンスがなんだか懐かしい…最近触ってなかったからな、そういうの。
  • はてなブログのMarkdown書きやすい。