iwasaki.yusuke の紹介

金融システムエンジニア

[Book]ポケット図解 行動経済学の基本がわかる本

要約

行動経済学の背景、概要と射程がわかる。直感による間違いやバイアスがわかる。アノマリーを解くプロスペクト理論とは。フレーミングによる判断の違いがわかる。インセンティブ、コミットメント理論とは。経済行動の心理的な側面と根拠がわかる。

Amazonより

目次

第1章 行動経済学とは何か
第2章 ヒューリスティック
第3章 プロスペクト理論
第4章 フレーミング
第5章 選好の逆転
第6章 お金と公正



感想

実社会の人間がどのように思考し行動するかを織り込んだ、経済学のひとつである行動経済学について図解された本です。
従来の経済学と言われたものは、経済人を前提とした学問ですが、実社会では感情を持った人間が経済に関わっています。
例えば、「天気が晴れたら株価が上がる」等の従来の経済学では説明のつかないことも行動経済学によって説明することができます。

行動経済学の観点からは人間は、情報の表現方法(フレーミング)や前提条件(ヒューリスティック)によって、意味合い的には同じことを表現しているようなことでも、不合理な判断を行います。その事象を例を交えながら学ぶことができます。

身の回りの小さな人間の判断も、行動経済学で説明できますので、学んでおいて損はないかと思います。

写真 (2)

[Book]マッキンゼー流入社1年目ロジカルシンキングの教科書

要約

大事なことはマッキンゼーが教えてくれた!

なぜ、マッキンゼー出身者は各業界で活躍できるのか?
その秘密はマッキンゼーの新入社員研修にあった。
本書ではマッキンゼーの厳しい新人研修を著者のエピソードと共に紹介しながら、
そこで叩き込まれるマッキンゼー流問題解決の基本を解説する。

実績、ブランド力ともに世界最強のコンサルティングファームであるマッキンゼー&カンパニー。
企業としての知名度もさることながら、各界で活躍するマッキンゼー出身者の多さでもよく知られている。
大前研一氏はもちろんのこと、勝間和代氏(経済評論家)、南場智子(ディー・エヌ・エー前代表取締役兼CEO) 、
高橋俊介氏(慶應義塾大学大学院教授) 、茂木敏充氏(衆議院議員)など、数え上げたらきりがないほどだ。
また、マッキンゼー出身者に共通するのは、その在籍年数の少なさだ。
社員の平均在籍年数は3年~5年とも言われる。
つまり、マッキンゼーに入社した社員は、数年以内にビジネススキルをマスターし、
結果を出し、独立・起業など次のステップに進む風土の会社なのである。

しかし、なぜたった数年のコンサルティング経験しかないのに、
マッキンゼー出身者は独立後、各業界で活躍するほどの能力を身につけることができるのだろうか?
その秘密は、マッキンゼーの新入社員研修やその後のOJT(実地研修)にあった。

本書では、このマッキンゼーの「新人研修」で叩き込まれる問題解決のエッセンスを紹介しつつ、
マッキンゼー出身者が各業界で大活躍している秘密を解明していく。
本書を読むことで、誰もが短期間で「問題解決手法」をマスターすることができるだろう。
また、記念受験にも拘わらずマッキンゼーに入社してしまった著者が、
様々な失敗を経験しながらも一流コンサルタントに成長していくエピソードと共に解説してあるため、
数あるマッキンゼー本の中でも、最も敷居が低く、「これなら私にもできる! 」思える一冊である。

Amazonより

目次

第1講義 マッキンゼー流 プロフェッショナルの流儀
第2講義 マッキンゼー流 問題解決の基本プロセス
特別講義 マッキンゼー流 フレームワーク入門キット
第3講義 マッキンゼー流 情報の取扱い力
第4講義 マッキンゼー流 問題解決力を高める思考術
第5講義 マッキンゼー流 自分力の高め方
第6講義 マッキンゼー流 プロジェクトで結果を出す力
第7講義 マッキンゼー流 プレゼンの技術



感想

マッキンゼー流の本物の論理的思考とは「クリティカルに考え(深い洞察による自分の考えを持ち)、ロジカルに展開する(わかりやすく伝える)」
上記を実現するための3つのステップとして、
1. 前提を自分でちゃんと確認する(それは本当?)
2. 深く根拠を調べて伝える(〜だからそうだよ)
3. 自分だけの深い意見を持つ(それ、いいね)

の基本動作に関する必要性や実行方法を具体例を交えて紹介している。

また、論理的思考能力を高めることの重要性とともに、非論理的思考能力もビジネスにおいては必要であると述べている。本書では、一瞬のひらめきやビジネスのアイディアを非論理的思考、そのひらめきやアイディアをビジネス化するために周りを巻きこみ説明する力を論理的思考としている。

あまり、ビジネスにおいて、「論理的思考能力を働かせ・・・」と意識することはないだろうが、ある程度基本動作として身につけることで、仕事の役に立つのではないかと思う。

写真

[Book]爆速経営 新生ヤフーの500日

要約

高収益だがつまらない会社ーー。そんなヤフーを変えた若き経営陣の改革の軌跡。
201X年までに営業利益2倍。その目標に「高速」を超えた「爆速」で挑む。

■5000人の成熟企業が1年で変貌を遂げた
「お前が社長になったら、ヤフーをどうしたい?」。それは、あまりにも唐突な打診だった。
2012年1月、当時執行役員だった宮坂学はソフトバンク社長の孫正義に呼ばれ、ヤフー社長就任の打診を
受ける。

「今のヤフーは守りに入り過ぎている。若い世代で再び攻めの姿勢を取り戻してほしい」
孫が当時の社長、井上雅博と話し合った末の提案だった。
逡巡した宮坂だったが、最終的には要請を受け入れる。
そして、すぐに改革の仲間集めに走り出した――。

それから1年。新体制として初めて迎えた2013年3月期決算は、6年ぶりの2ケタ増益を記録。サービス開始以来
続く増収増益記録を16に伸ばした。時価総額は約3兆円(10月9日時点)と、宮坂のCEO就任時に比べて約2倍に増加。
ポータルサイト「Yahoo! JAPAN」の月間総ページビュー(PV)は536億と、国内トップを快走している。
今年10月には、ショッピング事業で出血覚悟の「無料化」施策をぶち上げ、楽天やアマゾンが先行する電子商取引(EC)
市場に殴りこみをかけた。
スピードを超える「爆速」を掲げて突っ走る平均年齡41歳(発足時)の新経営陣は、ヤフーに完全に攻めの姿勢を
取り戻したと言っていい。

本書は、日経ビジネスの記者が2012年4月から約1年半にわたって取材を続けてきた、
新生ヤフーの改革を追った記録である。
なぜ宮坂がヤフーの改革を任されるようになったのか。
その理由については、ぜひ本書を読み進めていただきたい。
恐らく、ヤフーが直面した問題は企業組織が規模を拡大させていくうえで常に内在し得る構造問題である。
そして、それにどう向き合い、どう回避しようとしているかという過程を辿っていく作業は、
同様の問題に悩む企業に多くの示唆を与えるだろう。

■組織の指導者に向けた、生きたケーススタディ
本書は組織を活性化したいと考えているリーダーに向けた、生きたケーススタディとも言える。
ある日唐突に、「明日から、社長をやってほしい」と指名を受けたら、あなたならどうするだろうか。
この問いがあまりにも非現実なら、「社長」を「課長」「マネージャー」「リーダー」に置き換えてもいい。
おそらく、宮坂氏が社長指名を受けた状況も、これに近いものだった。

組織を変えるということは、つまるところ、人の向上心をどう引き出すかにある。
熾烈な競争に勝ち抜くためには、綿密な事業戦略や卓抜なサービスはもちろん必要だ。
だが、それらを担い、生み出していくのは社員に他ならない。
であるならば、社員が生き生きと活躍できる環境を用意し、思う存分力を発揮してもらうことが
経営者として一番重要な役割ではないか――。宮坂の言葉は、変革を志向する多くのリーダーに響くはずだ。

■組織を変えるワンフレーズ
本書に登場する、数々の改革のキーワード

「脱皮できない蛇は死ぬ」
「10倍挑戦して、5倍失敗して、2倍成功する」
「大切なのは、誰をバスに乗せるか」
「経営は軍議長くすべからず」
「経営者が自分の判断に迷うのは、目標が明確ではないからだ」
「まず、登るべき山を決める」
「改革とは、組織の中で浮くこと」
「組織は原理原則で動かす」
「見られるからこそ社員は輝く」
「アサインよりもチョイスを増やす」
「イノベーションには会議より会話」

Amazonより

目次

Chapter1 改革前夜 ヤフーが一番つまらない!
Chapter2 電撃指名 53番目の社員に託された運命
Chapter3 改革始動 まず、登る山を決める
Chapter4 前例破壊 異業種タッグが既成概念を壊す
Chapter5 爆速誕生 ”言霊”が組織を動かす
Chapter6 再活性化 見られるからこそ社員は輝く
Chapter7 試行錯誤 「!」を生み続ける組織へ



感想

十数年連続で増収増益を続けながら、大企業化するに従って企業としてのスピード感を失いつつあったYahoo!の経営課題に対して、
刷新された経営陣の試行錯誤を実際の取り組みを交えながら、紹介してくれています。

実際のビジネスに生かせるエッセンスがたくさんつまっています。

「ナンバーワンになるためには、ゲームのルールを変えていかないといけない」

写真

[Book]PMO導入フレームワーク プロジェクトを成功に導く 人・組織・プロセス・ツール

要約

プロジェクトを成功に導く司令塔、プロジェクトマネジメントオフィス(PMO)には何が必要か。 PMOの必須知識を、人、組織、プロセス、ツールの4つに分けて解説しています。 組織については、「参謀型」「管理実行型」「事務局型」に分類。 人材については、コンサルタント、コントローラー、アドミニストレーターなどのスキルについて解説。 プロセスについては、プロジェクトをコントロールする24の事例を紹介。 ツールについては、選定基準とその例が示されています。 必要な人材とスキルを確保し、最適な組織を定め、状況に応じて機敏に対処する、新しいPMO像を提供します。
内容(「BOOK」データベースより)
プロジェクトマネジャーの補佐だけでなくときには率先して事に当たるプロジェクトマネジメントオフィスの必須知識。

Amazonより

目次

第1章 PMOの現状と課題
第2章 PMOの組織と役割
第3章 PMOの人材とスキル
第4章 PMOの実行とコントロール
第5章 PMO効率化のためのツール
第6章 PMOのレッスンズ・ラーンド


感想

大規模プロジェクトになればなるほど、現場の管理業務・ドキュメントの標準化やリスクマネジメントの観点から、PMOの配置か推奨される。

自身も、数億規模のプロジェクトを担当しており、関連会社だけでも約6社・自社内も3つのチームに分かれている。
チームのリーダーも異なる粒度・自分が解釈したようにしかPMレベルに報告しないため、「本当にスケジュールにコミットできるのか」、「潜在的なリスクは存在しないのか」
の妥当性を検証できない。
そのプロセスを標準化することにより、スケジュールの妥当性を明らかにし、潜在的なリスクに対して事前に策をうつPMOのバリューは計り知れない。

そんな、大規模プロジェクトにおけるPMOの重要性を感じる今日この頃です。

[Windows]Windows7 Home Premium のリモートデスクトップのホストになれるようにする

Windows7 Home Premium

デフォルトではリモートデスクトップのホスト側になれません。

Professional
スクリーンショット 2013-06-16 21.10.06

Home Premium
スクリーンショット 2013-06-16 21.11.13

※プロフェッショナルで設定できる項目がHome Premiumにはありません。

解決策

Concurrent RDP Patcher.exe をダウンロードして、パッチをあててください。
※SP1とそれ以外で実行ファイルが異なるので注意してください。

[NoSQL]Cassandra入門③ – コンソールから利用してみる

Cassandraのコンソールを起動してみる

前回まででCassandraの起動まで行いました。インストールと起動方法はこちら

コンソールからCassandraにアクセスしてみたいと思います。

$CASSANDRA_HOME/bin/cassandra-cli
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 1.2.5

Type 'help;' or '?' for help.
Type 'quit;' or 'exit;' to quit.

[default@unknown]

筐体が別のホストに接続したい場合は「-host」オプションを、別ポートで起動させている場合は「-port」オプションを指定して接続してください。

終了するには「exit or quit」

[default@unknown] exit;

キースペースを作成してみる

以下のコマンドを実行してください。DEMOという名前でレプリカ配置戦略をSimpleStrategyにしてキースペースを作成しています。

[default@unknown] CREATE KEYSPACE demo
with placement_strategy = 'org.apache.cassandra.locator.SimpleStrategy'
and strategy_options = [{replication_factor:1}];
ab7604a3-456e-39dd-842d-91425c9072cf

レプリカ配置戦略とは、ノード間のレプリケーション戦略をさします。

レプリカ配置戦略 概要
Simple Strategy ネットワークトポロジを意識せずにデータセンター内にレプリカを配置する
Old Network Topology Strategy 主に同一データセンター内の異なるラックをまたがってデータを分散させるために利用されます。やや高いレイテンシを許容範囲として、その代わりに高可用性を保証したい場合にこのストラテジーを利用します。
Network Topology Strategy 異なるデータセンターをまたがってデータを分散させるために利用されます。

カラムファミリを作成してみる

[default@unknown] USE demo;
Authenticated to keyspace: demo
[default@demo] CREATE COLUMN FAMILY users with comparator = UTF8Type and default_validation_class = UTF8Type and key_validation_class = UTF8Type;
81ca1c3f-3557-3a31-aeb3-981fe297016c

カラムのソートとして、Cassandraではデフォルトでカラムファミリに設定を行います。それが、comparator項目です。

comparator 概要
UTF8Type UTF-8をエンコードとして文字列です。
AsciiType バイトを直接ソートして、入力をUS-ASCIIとしてパースして検証します。
BytesType デフォルトのタイプで、検証のステップはスキップされ、バイトを直接比較することによってソートします。
LexicalUUIDType 128ビットのUUIDを使ってバイト値を字句順序で比較します。
IntegerType LongTypeよりも高速で、LongTypeで提供している64ビットよりも少ないビットでも多いビットでも扱えます。
LongType 64ビットのlongの数値としてソートします。
TimeUUIDType 128ビットのタイムスタンプでソートします。

システムの要件によっては、上記に示したデフォルトのソート群では足りない場合がありますが、カスタムでソートクラスを作成することが可能です。
その場合は「org.apache.cassandra.db.marshal.AbstractType」を敬称して自前のソートクラスを作成してください。

作成したキースペースの定義情報を以下のコマンドで出力してみます。

[default@demo] describe demo;

WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details.

Keyspace: demo:
  Replication Strategy: org.apache.cassandra.locator.SimpleStrategy
  Durable Writes: true
    Options: [replication_factor:1]
  Column Families:
    ColumnFamily: user
      Key Validation Class: org.apache.cassandra.db.marshal.BytesType
      Default column value validator: org.apache.cassandra.db.marshal.BytesType
      Columns sorted by: org.apache.cassandra.db.marshal.UTF8Type
      GC grace seconds: 864000
      Compaction min/max thresholds: 4/32
      Read repair chance: 0.1
      DC Local Read repair chance: 0.0
      Populate IO Cache on flush: false
      Replicate on write: true
      Caching: KEYS_ONLY
      Bloom Filter FP chance: default
      Built indexes: []
      Compaction Strategy: org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy
      Compression Options:
        sstable_compression: org.apache.cassandra.io.compress.SnappyCompressor

データを投入してみる

SET users['yusuke']['full_name']='Yusuke Iwasaki';
Value inserted.
Elapsed time: 17 msec(s).
[default@demo] get users['yusuke'];
=> (column=full_name, value=Yusuke Iwasaki, timestamp=1371368738745000)
Returned 1 results.
Elapsed time: 3.5 msec(s).
[default@demo] SET users['yusuke']['email']='yusuke6287@gmail.com';
Value inserted.
Elapsed time: 1.96 msec(s).
[default@demo] SET users['yusuke']['gender']='M';
Value inserted.
Elapsed time: 2.14 msec(s).
# ロウキーを指定して取得
[default@demo] get users['yusuke'];
=> (column=email, value=yusuke6287@gmail.com, timestamp=1371369400080000)
=> (column=full_name, value=Yusuke Iwasaki, timestamp=1371368738745000)
=> (column=gender, value=M, timestamp=1371369405461000)
Returned 3 results.
Elapsed time: 2.7 msec(s).
# full_nameを指定して取得
[default@demo] get users['yusuke']['full_name'];
=> (column=full_name, value=Yusuke Iwasaki, timestamp=1371368738745000)
Elapsed time: 12 msec(s).

リレーショナルデータベースユーザとしては少し違和感があるかもしれないが、カラムファミリーを生成した時点では定義情報(カラム)は定義していなかったが、データを投入したときには、full_name, email, generのカラムを指定してINSERTしている。定義情報はかなりゆるく、これがスタートアップの変更が激しいアプリケーションに向いているといわれる所以なのである。

そのほかコマンド群については以下のページが参考になるので参照されたい。
cassandra CLI

[NoSQL]Cassandra入門② – Cassandraのインストールと起動・停止

Cassandraのセットアップ

まずCassandraのダウンロードを以下のサイトから行います。
The Apache Cassandra Projecrt

2013/6/15時点の最新モジュールは以下のリンクからダウンロード可能です。
こちら

以下は/opt/local下にインストールする手順となります。まず、/tmp下にダウンロードしたモジュールを配置してください。

$ cd /tmp
$ mkdir -p /opt/local
$ gzip -dc apache-cassandra-1.2.5-bin.tar.gz | tar xvf -
$ mv apache-cassandra-1.2.5 apache-cassandra
$ cd /opt/local
$ ln -s apache-cassandra-1.2.5 apache-cassandra

ポイントこれで、配置は完了です。最新バージョンへのUpdateが容易にできるように、シンボリックリンクでapache-cassandra-1.2.5へリンクさせています。

ロギング用のディレクトリ作成を行います。

$ mkdir -p /var/lib/cassandra/commitlog
$ mkdir -p /var/lib/cassandra/data
$ mkdir -p /var/log/cassandra
$ chown -R `whoami` /var/lib/cassandra
$ chwon -R `whoami` /var/log/cassandra

Cassandのクラスパス設定

以下の通り、2つの変数をエクスポートします。

$ vi ~/.bashrc
export CASSANDRA_HOME="/opt/local/apache-cassandra"
export CASSANDRA_CONF="$CASSANDRA_HOME/conf"

Cassandの起動(フォアグラウンド)

$ /opt/local/apache-cassandra/bin/cassandra -f
xss = -ea -javaagent:./bin/../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms501M -Xmx501M -Xmn125M -XX:+HeapDumpOnOutOfMemoryError -Xss180k
INFO 18:38:40,430 Logging initialized
INFO 18:38:40,444 JVM vendor/version: Java HotSpot(TM) 64-Bit Server VM/1.6.0_25
ERROR 18:38:40,447 Your JVM is out of date. Please upgrade to the newest Oracle Java 6.
INFO 18:38:40,447 Heap size: 512229376/513277952
INFO 18:38:40,448 Classpath: ./bin/../conf:./bin/../build/classes/main:./bin/../build/classes/thrift:./bin/../lib/antlr-3.2.jar:./bin/../lib/apache-cassandra-1.2.5.jar:./bin/../lib/apache-cassandra-clientutil-1.2.5.jar:./bin/../lib/apache-cassandra-thrift-1.2.5.jar:./bin/../lib/avro-1.4.0-fixes.jar:./bin/../lib/avro-1.4.0-sources-fixes.jar:./bin/../lib/commons-cli-1.1.jar:./bin/../lib/commons-codec-1.2.jar:./bin/../lib/commons-lang-2.6.jar:./bin/../lib/compress-lzf-0.8.4.jar:./bin/../lib/concurrentlinkedhashmap-lru-1.3.jar:./bin/../lib/guava-13.0.1.jar:./bin/../lib/high-scale-lib-1.1.2.jar:./bin/../lib/jackson-core-asl-1.9.2.jar:./bin/../lib/jackson-mapper-asl-1.9.2.jar:./bin/../lib/jamm-0.2.5.jar:./bin/../lib/jbcrypt-0.3m.jar:./bin/../lib/jline-1.0.jar:./bin/../lib/json-simple-1.1.jar:./bin/../lib/libthrift-0.7.0.jar:./bin/../lib/log4j-1.2.16.jar:./bin/../lib/lz4-1.1.0.jar:./bin/../lib/metrics-core-2.0.3.jar:./bin/../lib/netty-3.5.9.Final.jar:./bin/../lib/servlet-api-2.5-20081211.jar:./bin/../lib/slf4j-api-1.7.2.jar:./bin/../lib/slf4j-log4j12-1.7.2.jar:./bin/../lib/snakeyaml-1.6.jar:./bin/../lib/snappy-java-1.0.4.1.jar:./bin/../lib/snaptree-0.1.jar:./bin/../lib/jamm-0.2.5.jar
INFO 18:38:40,450 JNA not found. Native methods will be disabled.
INFO 18:38:40,462 Loading settings from file:/opt/local/apache-cassandra-1.2.5/conf/cassandra.yaml
INFO 18:38:40,860 Data files directories: [/var/lib/cassandra/data]
INFO 18:38:40,860 Commit log directory: /var/lib/cassandra/commitlog
INFO 18:38:40,861 DiskAccessMode 'auto' determined to be mmap, indexAccessMode is mmap
INFO 18:38:40,861 disk_failure_policy is stop
INFO 18:38:40,867 Global memtable threshold is enabled at 163MB
INFO 18:38:41,014 Not using multi-threaded compaction
INFO 18:38:41,546 Initializing key cache with capacity of 24 MBs.
INFO 18:38:41,559 Scheduling key cache save to each 14400 seconds (going to save all keys).
INFO 18:38:41,560 Initializing row cache with capacity of 0 MBs and provider org.apache.cassandra.cache.SerializingCacheProvider
INFO 18:38:41,572 Scheduling row cache save to each 0 seconds (going to save all keys).
INFO 18:38:42,069 Couldn't detect any schema definitions in local storage.
INFO 18:38:42,070 To create keyspaces and column families, see 'help create keyspace' in the CLI, or set up a schema using the thrift system_* calls.
INFO 18:38:42,176 No commitlog files found; skipping replay
INFO 18:38:42,445 Cassandra version: 1.2.5
INFO 18:38:42,445 Thrift API version: 19.36.0
INFO 18:38:42,446 CQL supported versions: 2.0.0,3.0.3 (default: 3.0.3)
INFO 18:38:42,485 Loading persisted ring state
INFO 18:38:42,489 Starting up server gossip
WARN 18:38:42,495 No host ID found, created 15bc5418-8502-4bda-a3ad-0ce2849358d2 (Note: This should happen exactly once per node).
INFO 18:38:42,511 Enqueuing flush of Memtable-local@954564833(361/361 serialized/live bytes, 15 ops)
INFO 18:38:42,514 Writing Memtable-local@954564833(361/361 serialized/live bytes, 15 ops)
INFO 18:38:42,590 Completed flushing /var/lib/cassandra/data/system/local/system-local-ic-1-Data.db (353 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=50413)
INFO 18:38:42,689 Starting Messaging Service on port 7000
WARN 18:38:42,754 Generated random token [-7233050428828279550]. Random tokens will result in an unbalanced ring; see http://wiki.apache.org/cassandra/Operations
INFO 18:38:42,755 Enqueuing flush of Memtable-local@1443443454(84/84 serialized/live bytes, 4 ops)
INFO 18:38:42,756 Writing Memtable-local@1443443454(84/84 serialized/live bytes, 4 ops)
INFO 18:38:42,773 Completed flushing /var/lib/cassandra/data/system/local/system-local-ic-2-Data.db (120 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=50688)
INFO 18:38:42,783 Enqueuing flush of Memtable-local@747621499(51/51 serialized/live bytes, 2 ops)
INFO 18:38:42,784 Writing Memtable-local@747621499(51/51 serialized/live bytes, 2 ops)
INFO 18:38:42,797 Completed flushing /var/lib/cassandra/data/system/local/system-local-ic-3-Data.db (110 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=50863)
INFO 18:38:42,815 Node localhost/127.0.0.1 state jump to normal
INFO 18:38:42,817 Startup completed! Now serving reads.
INFO 18:38:42,819 Create new Keyspace: system_auth, rep strategy:SimpleStrategy{}, strategy_options: {replication_factor=1}, durable_writes: true
INFO 18:38:42,865 Enqueuing flush of Memtable-schema_keyspaces@1498906841(389/389 serialized/live bytes, 11 ops)
INFO 18:38:42,867 Writing Memtable-schema_keyspaces@1498906841(389/389 serialized/live bytes, 11 ops)
INFO 18:38:42,879 Completed flushing /var/lib/cassandra/data/system/schema_keyspaces/system-schema_keyspaces-ic-1-Data.db (260 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=51104)
INFO 18:38:42,880 Enqueuing flush of Memtable-schema_columnfamilies@1147066451(21775/21775 serialized/live bytes, 352 ops)
INFO 18:38:42,881 Writing Memtable-schema_columnfamilies@1147066451(21775/21775 serialized/live bytes, 352 ops)
INFO 18:38:42,909 Completed flushing /var/lib/cassandra/data/system/schema_columnfamilies/system-schema_columnfamilies-ic-1-Data.db (4474 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=51104)
INFO 18:38:42,911 Enqueuing flush of Memtable-schema_columns@163450945(21903/21903 serialized/live bytes, 332 ops)
INFO 18:38:42,912 Writing Memtable-schema_columns@163450945(21903/21903 serialized/live bytes, 332 ops)
INFO 18:38:42,939 Completed flushing /var/lib/cassandra/data/system/schema_columns/system-schema_columns-ic-1-Data.db (3772 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=51104)
INFO 18:38:43,106 Create new ColumnFamily: org.apache.cassandra.config.CFMetaData@2fbef1ac[cfId=473588ad-9c79-38be-8b59-e06c10456ba0,ksName=system_auth,cfName=users,cfType=Standard,comparator=org.apache.cassandra.db.marshal.CompositeType(org.apache.cassandra.db.marshal.UTF8Type),subcolumncomparator=<null>,comment=,readRepairChance=0.1,dclocalReadRepairChance=0.0,replicateOnWrite=true,gcGraceSeconds=7776000,defaultValidator=org.apache.cassandra.db.marshal.BytesType,keyValidator=org.apache.cassandra.db.marshal.UTF8Type,minCompactionThreshold=4,maxCompactionThreshold=32,keyAliases=[java.nio.HeapByteBuffer[pos=0 lim=4 cap=4]],columnAliases=[],valueAlias=<null>,column_metadata={java.nio.HeapByteBuffer[pos=0 lim=5 cap=5]=ColumnDefinition{name=7375706572, validator=org.apache.cassandra.db.marshal.BooleanType, index_type=null, index_name='null', component_index=0}},compactionStrategyClass=class org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy,compactionStrategyOptions={},compressionOptions={sstable_compression=org.apache.cassandra.io.compress.SnappyCompressor},bloomFilterFpChance=0.01,caching=KEYS_ONLY,populateIoCacheOnFlush=false]
INFO 18:38:43,126 Enqueuing flush of Memtable-schema_columnfamilies@26362458(1097/1097 serialized/live bytes, 20 ops)
INFO 18:38:43,127 Writing Memtable-schema_columnfamilies@26362458(1097/1097 serialized/live bytes, 20 ops)
INFO 18:38:43,137 Completed flushing /var/lib/cassandra/data/system/schema_columnfamilies/system-schema_columnfamilies-ic-2-Data.db (698 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=52888)
INFO 18:38:43,138 Enqueuing flush of Memtable-schema_columns@1226090823(251/251 serialized/live bytes, 5 ops)
INFO 18:38:43,139 Writing Memtable-schema_columns@1226090823(251/251 serialized/live bytes, 5 ops)
INFO 18:38:43,152 Completed flushing /var/lib/cassandra/data/system/schema_columns/system-schema_columns-ic-2-Data.db (209 bytes) for commitlog position ReplayPosition(segmentId=1371289121990, position=52888)
INFO 18:38:43,314 Starting listening for CQL clients on localhost/127.0.0.1:9042...
INFO 18:38:43,334 Binding thrift service to localhost/127.0.0.1:9160
INFO 18:38:43,377 Using TFramedTransport with a max frame size of 15728640 bytes.
INFO 18:38:43,386 Using synchronous/threadpool thrift server on localhost : 9160
INFO 18:38:43,386 Listening for thrift clients...

(停止)Ctrl + C

INFO 18:40:50,458 Stop listening to thrift clients
INFO 18:40:50,476 Stop listening for CQL clients
INFO 18:40:50,481 Announcing shutdown
INFO 18:40:52,487 Waiting for messaging service to quiesce
INFO 18:40:52,489 MessagingService shutting down server thread.

Cassandの起動(バックグラウンド)

まず、/etc/init.d下に起動スクリプトを作成します。

$ touch /etc/init.d/cassandra
$ chmod 755 /etc/init.d/cassandra
$ vi /etc/init.d/cassandra

起動スクリプトは以下のとおりです。

# description: cassandra
# processname: cassandra
#!/bin/sh

CASSANDRA_BIN=/opt/local/apache-cassandra/bin/cassandra
CASSANDRA_PID=/var/run/cassandra.pid

case "$1" in
  start)
     $CASSANDRA_BIN -p $CASSANDRA_PID
     echo "Running Cassandra"
     ;;
  stop)
     kill `cat $CASSANDRA_PID`
     rm -f $CASSANDRA_PID
     echo "Stopped Cassandra"
     ;;
  status)
     ls $CASSANDRA_PID >/dev/null 2>&1
     case "$?" in
       0)
         echo "Running Cassandra"
         ;;
       2)
         echo "Stopped Cassandra"
         ;;
       *)
         echo "Unknow status Cassandra"
         exit 1
     esac
     ;;
  *)
     echo "Usage: $0 {start|stop|status}"
     exit 1
esac
exit 0

起動テスト・停止テスト

$ /etc/init.d/cassandra start
$/etc/init.d/cassandra status
 Running Cassandra
$ ps -ef | grep cassandra
 root     20745     1  7 14:52 pts/0    00:00:03 /usr/java/default/bin/java -ea -javaagent:/opt/local/apache-cassandra/bin/../lib/jamm-0.2.5.jar -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms501M -Xmx501M -Xmn125M -XX:+HeapDumpOnOutOfMemoryError -Xss180k -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:SurvivorRatio=8 -XX:MaxTenuringThreshold=1 -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseTLAB -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote.port=7199 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dlog4j.configuration=log4j-server.properties -Dlog4j.defaultInitOverride=true -Dcassandra-pidfile=/var/run/cassandra.pid -cp /opt/local/apache-cassandra/bin/../conf:/opt/local/apache-cassandra/bin/../build/classes/main:/opt/local/apache-cassandra/bin/../build/classes/thrift:/opt/local/apache-cassandra/bin/../lib/antlr-3.2.jar:/opt/local/apache-cassandra/bin/../lib/apache-cassandra-1.2.5.jar:/opt/local/apache-cassandra/bin/../lib/apache-cassandra-clientutil-1.2.5.jar:/opt/local/apache-cassandra/bin/../lib/apache-cassandra-thrift-1.2.5.jar:/opt/local/apache-cassandra/bin/../lib/avro-1.4.0-fixes.jar:/opt/local/apache-cassandra/bin/../lib/avro-1.4.0-sources-fixes.jar:/opt/local/apache-cassandra/bin/../lib/commons-cli-1.1.jar:/opt/local/apache-cassandra/bin/../lib/commons-codec-1.2.jar:/opt/local/apache-cassandra/bin/../lib/commons-lang-2.6.jar:/opt/local/apache-cassandra/bin/../lib/compress-lzf-0.8.4.jar:/opt/local/apache-cassandra/bin/../lib/concurrentlinkedhashmap-lru-1.3.jar:/opt/local/apache-cassandra/bin/../lib/guava-13.0.1.jar:/opt/local/apache-cassandra/bin/../lib/high-scale-lib-1.1.2.jar:/opt/local/apache-cassandra/bin/../lib/jackson-core-asl-1.9.2.jar:/opt/local/apache-cassandra/bin/../lib/jackson-mapper-asl-1.9.2.jar:/opt/local/apache-cassandra/bin/../lib/jamm-0.2.5.jar:/opt/local/apache-cassandra/bin/../lib/jbcrypt-0.3m.jar:/opt/local/apache-cassandra/bin/../lib/jline-1.0.jar:/opt/local/apache-cassandra/bin/../lib/json-simple-1.1.jar:/opt/local/apache-cassandra/bin/../lib/libthrift-0.7.0.jar:/opt/local/apache-cassandra/bin/../lib/log4j-1.2.16.jar:/opt/local/apache-cassandra/bin/../lib/lz4-1.1.0.jar:/opt/local/apache-cassandra/bin/../lib/metrics-core-2.0.3.jar:/opt/local/apache-cassandra/bin/../lib/netty-3.5.9.Final.jar:/opt/local/apache-cassandra/bin/../lib/servlet-api-2.5-20081211.jar:/opt/local/apache-cassandra/bin/../lib/slf4j-api-1.7.2.jar:/opt/local/apache-cassandra/bin/../lib/slf4j-log4j12-1.7.2.jar:/opt/local/apache-cassandra/bin/../lib/snakeyaml-1.6.jar:/opt/local/apache-cassandra/bin/../lib/snappy-java-1.0.4.1.jar:/opt/local/apache-cassandra/bin/../lib/snaptree-0.1.jar org.apache.cassandra.service.CassandraDaemon
$ /etc/init.d/cassandra stop
 Stopped Cassandra
$ /etc/init.d/cassandra status
 Stopped Cassandra

必要に応じてサービスにも登録してください。(ここでは割愛します。)

[NoSQL]Cassandra入門①

Cassandraとは

シェアードナッシングアーキテクチャ(分割できないならスケールできない)をポリシーとして、従来の分散方法であるマスター/スレーブ方式から脱した非集中管理型アーキテクチャを実現した、すべてのクラスタノードが強調して動作するデータベース。
このアーキテクチャはシングルポイントが少なく、障害発生時の影響もほとんどない一方、トランザクションはリレーショナルデータベースに比べ劣っており、一貫性は弱一貫性と呼ばれる、頻繁に更新がなければ最終的に全ノードは同期されるというレベルの一貫性になっている。

Cassandrの構造

端的に言うとjsonのような構造をしている。

Musician:							カラムファミリ1
	bootsy:							ロウキー
		email: bootsy@pfunk.com,	カラム名:値
		instrument: bass			カラム名:値
	george:							ロウキー
	email: bass						カラム名:値
Band:								カラムファミリ2
	george:							ロウキー
		pfunk: 1968-2010			カラム名:値

用語定義

項目 意味
キースペース データベース。ひとつのアプリケーションにおいて複数のキースペースを利用することは推奨されていない。ただし、後述のレプリカ配置戦略はキースペース毎に定義されるため、データの構造上にレプリケーションレベルは分けた場合は例外です。
カラムファミリ 論理的なデータの分割単位をあらわす。リレーショナルデータベースにおけるテーブルの単位となる。
カラム 名前と値のセット
ロウ カラムの集合を持つ独立したエンティティ
ロウキー 各ロウのユニークな識別子

各カラムはタイムスタンプを保持し、サーバーサイドでのコンフリクトを避けるために利用されます。(検索条件に含めることは不可)

データベースの世界とCAP定理

分散コンピュータシステムのマシン間の情報複製に関する定理である。CAPとは
C・・・Consistency(一貫性)
A・・・Availability(可用性)
P・・・Partition-toleranc(分断耐性)
の頭文字であり、この三つを同時に満たすことを保証することはできないことを示した定理である。

具体例をあげると
C+A(一貫性+可用性) ・・・MySQL, SQL Server, Postgres等のリレーショナルデータベース
C+P(一貫性+分断耐性)・・・Neo4J, Google Bigtable, MongoDB, HBase, Hypertable, Redis
A+P(可用性+分断耐性)・・・Cassandra, Voldemort, CouchDB, Riak

Cassandraの利用メリット

Cassandraは以下のアプリケーションに向いています。
・巨大なデプロイメント
・大量の書き込み
・統計
・解析
・地域分散
・変更が大量に発生するスタートアップアプリケーション

Cassandraのアーキテクチャ

代表するものを列挙します。

ピアツーピア(P2P)、アクルーアル故障検出、ヒントハンドオフ、トゥームストーン、ステージイベントデオリブンアーキテクチャ(SEDA)

Cassandraのセットアップについては[NoSQL]Cassandra入門② – Cassandraのインストールと起動・停止を参照。

[Mashup]jQueryプラグインで無限スクロールページをつくる(NAVERまとめのマッシュアップ)

今回使うjQueryプラグイン

Wookmark

使用方法はこちらです。

このプラグインを利用することでグリッドレイアウトをベースとした、無限スクロールのページが作成できます。

スクリーンショット 2013-05-30 23.57.07

サンプル

サンプルはこちら

NAVERまとめのページから、画像とタイトルとURLをスクレイピングで取得。

スクロールに応じて、非同期に画像ファイル等を取得して、どんどん表示してきます。

ページングがだるい、一つのページでより多くのコンテンツをみたいという方は是非。

実行環境/言語

実装には以下のものを利用しました。

言語:PHP
フレームワーク:Symfony , jQuery, Wookmark, htmlSQL, Snoopy

htmlSQL

htmlSQLはSQLベースでHTMLの要素を取得できるライブラリです。スクレイピングをするさいに利用しました。
慣れ親しんだSQLベースで要素の取得ができる便利なライブラリです。

GitHub htmlSQL

以下のような記法で配列形式のデータが取得可能となります。

SELECT (取得したい属性) FROM (タグ) WHERE $(属性) == (属性の値);

[Apache]modpagespeedでWEBサービスを爆速化する

modpagespeedとは

modpagespeedとはApacheモジュールとして提供されているWEBのベストプラクティスを自動的に適用してくれるオープンソースのモジュールです。
このモジュールのよいところは、現在動いているプログラムに対して何も変更を加えなくても最適化してくれるところにあります。

現在10万以上のサイトに適用され、その数も日々増えていることでしょう。

具体的なベストプラクティスは以下のページで紹介されています。

modpagespeed

modpagespeedをサイトに適用してみた

適用前後のパフォーマンス検証を行うために、スピード測定ができるWEBサービスのGTmetrixを利用しました。
※GTmetrixとは、GoogleのPage Speed InsightsとYahoo のYSlowのスコアを同時に計測することができるWEBサービス
スクリーンショット 2013-05-18 20.48.34

[BEFORE]まず、適用前です。
スクリーンショット 2013-05-18 20.49.01

[AFTER]つぎに、適用後です。
スクリーンショット 2013-05-18 20.53.09

簡単なページでのテストですが、劇的に改善されています。

Page Speed Insights F grade B Grade
YSlow C grade A Grade
読み込み時間 1.39sec 1.05sec
ページサイズ 243KB 84.7KB
リクエスト数 11 8

modpagespeedのベストプラクティス

○画像ファイルの圧縮、最適化
○スタイル、スクリプトの結合、最小か
○外部ファイルの遅延ロード
などなど

modpagespeedをインストールしてみる

まずは、以下のリンクからサーバのOSやビット数別のrpmモジュールをダウンロードします。
https://developers.google.com/speed/docs/mod_pagespeed/download

ダウンロードしたら適用するサーバに配置しrpmコマンドをたたきます。

[root@www.web.server]# rpm   -Uvh    --test    mod-pagespeed-stable_current_x86_64.rpm 
警告: mod-pagespeed-stable_current_x86_64.rpm: ヘッダ V4 DSA signature: NOKEY, key ID 7fac5991
準備中...                ########################################### [100%]
[root@www.web.server]# rpm   -Uvh  mod-pagespeed-stable_current_x86_64.rpm 
警告: mod-pagespeed-stable_current_x86_64.rpm: ヘッダ V4 DSA signature: NOKEY, key ID 7fac5991
準備中...                ########################################### [100%]
   1:mod-pagespeed-stable   ########################################### [100%]
job 1 at 2013-05-18 20:52

そして、modpagespeedの設定ファイルが追加されていることを確認します。
※httpd.confでconf.d配下のconf拡張子がIncludeされていること、これがない場合は個別にIncludeしてください。

[root@www.web.server]# ls -ltr /etc/httpd/conf.d/
合計 80
-rw-r--r-- 1 root root   674  2月  3  2012 php.conf
-rw-r--r-- 1 root root   560  2月 16  2012 proxy_ajp.conf
-rw-r--r-- 1 root root   299  2月 24  2012 welcome.conf
-rw-r--r-- 1 root root   392  2月 24  2012 README
-rw-r--r-- 1 root root 45859  5月  2 04:41 pagespeed_libraries.conf
-rw-r--r-- 1 root root 15338  5月  2 04:41 pagespeed.conf

Apacheを再起動します。

[root@www.web.server]# /etc/init.d/httpd configtest
[root@www.web.server]# /etc/init.d/httpd restart

なんて簡単なの。