エッセンシャル思考-最少の時間で成果を最大にする を読んだ

この資料を見て、エッセンシャル思考-最少の時間で成果を最大にするを読んだ。
印象に残ったことをメモしておく。

Part1 エッセンシャル思考とは何か

・非エッセンシャル思考からエッセンシャル思考へ
 ・どの方向にも少しづつしか進めない ⇒ 一直線に遠くに進む
・エッセンシャル思考の人は、自分の時間とエネルギーを効果的に配分し、重要な仕事で最大の成果をあげることができる
・以下のような成功のパラドクスに陥らないためにも、エッセンシャル思考が必要
 目標を定め、成功へ一直線 ⇒ 成功し、頼れる人に。その結果多様な仕事が振られる
 ⇒ やることが増えすぎ、時間とエネルギーが拡散され、すべてが中途半端に ⇒ 本質を見失う
・エッセンシャル思考の基礎となる考え方は以下の3つ
 ・選択 – 自分で時間とエネルギーの使いみちを決める
もしたったひとつのことしかできない場合に何をするのか?という観点で選択する
選択しないことは他人に判断をゆだねるということであり、何一つ選べないとすべて引き受けることになる
悪くない程度の選択肢は、すべて拒否したほうが良い
 ・ノイズ – 世の中はノイズが大半であることを理解し、本質を見極める
重要な少数は、瑣末な多数に勝る。重要な少数を選択すること。ノイズの中のシグナルに気が付けるように意識すること
 ・トレードオフ – 何かを得ることは、何かを捨てることを理解する
トレードオフを理解していないとすべてできると勘違いし、すべてが中途半端になる
そのためには優先順位を明確にしておくこと

Part2 見極める技術

・エッセンシャル思考の人は、何かに手を出す前に幅広い選択肢を慎重に検討して、一番重要なものだけを実行する
・深い孤独がなければ、まともな作品は作れない by ピカソ
 ・ニュートンも万有引力の論文執筆にあたり、2年間ほとんどひとりで引きこもっていた。そのことだけをひたすら考えていた
 ・LinkendInのCEOも毎日合計2時間の空白時間をスケジュールに組み込んでいる
 ・ビルゲイツも1週間の考える週を定期的にとっている
・睡眠は生産性の敵ではなく、パフォーマンスを最大に高めてくれるもの
 1週間の4,5時間睡眠によって「血中アルコール濃度0.1%に相当する機能低下」が起こる
 優先順位付けの能力をキープするためにも睡眠は欠かせない

Part3 捨てる技術

・最終的な目標を明確にすること。具体的で魅力的で測定可能な本質目標を定める
 例えば「2012年までにイギリスのあらゆる人がインターネットを使えるようにする」など
 考えるときに必要なのは、たったひとつのことしかできないなら何をするか
・周囲の期待とプレッシャーに負けて、ノーと言えば数分間嫌な気持ちになる。イエスと言えば長期間後悔する
・ゆっくりイエスを言い、もっとすばやくノーを言うことを意識する
・サンクコストバイアスを切り捨てるためには、「もしまだ1円も払っていないとしたらこの企画に投資するか」という観点で考える
・逆プロトタイプしてみる。試しに辞めてみて、不都合があるか確かめる
・不要な細部を切り捨てることで、重要なものを生かす余地が生まれる
・仕事とプライベートの境界線を引くこと。自分で線を引かなければ、誰かに引かれ、一番守りたいものを守れなくなる
 また境界線があることで最大のパフォーマンスを出すことができる

Part4 しくみ化の技術

・努力と根性ではなく、自動的にうまくいく仕組みを整えること
・日々のささやかな進歩がやる気を引き出し、パフォーマンスを向上させる
・悪い習慣を変えるためには、行動を見直すよりもそのトリガーを見直すべし
・未来のことを考えながらではなく、今に集中すること

Google流資料作成術を読んだ

Google流資料作成術を読んだ。その際のメモ。

第1章 – コンテキストを理解する

・誰に、何を、どのように伝えるかを明確にする

そのために

・自信のある態度で伝えること
 ・「相手は自分より多くのことを知り、どう行動するかは相手次第」と思い込んでいる人が多いがそれは勘違い
  データを分析し、伝えるのであれば、そのテーマについて一番知っているのはあなたであり、人々を行動に導かなければならない
・必要な情報を把握する
 ・背景、意思決定者が先入観があるか、データをみたことがあるか、賛成しそうかどうか、こちらの主張にリスクがあるか、などなど
・3分ストーリーとビックアイデアを用意する
 ・ビックアイデアとは伝えたいことを1分にまとめたもの。つぎの3つの要素がある
  1.あなたの独自の視点を明確にしている
  2.何が危機にさらされているかを伝えている
  3.完全な文章である

第2章 – 相手に伝わりやすい表現を選ぶ

・データを表現する最善の方法を考える
 ・線グラフか、棒グラフか、表か、テキストが一番良い場合もある
・円グラフ、3Dグラフ、第2縦軸は正確な数値が読みとりにくいため、使うべからず

第3章 – 不必要な要素を取りのぞく

・情報を追加すればするほど、相手に認知的負荷を与える。不要な要素を取り除いていくことで、データがより目立つ
・視覚認知のゲシュタルトの法則を理解して、クラター(認知的負荷の原因)を識別する
・認知的負荷を与える記載をしない
 ・中央揃えは、2行以上ある場合は右側も左側もそろわずだらしない印象を与えるためなるべく避ける
 ・なるべく横書きに統一すること
  45度の方向に回転された文章は、傾きのない文章を比較して 52%読む速度が遅くなる
  90度の方向に回転された文章は、傾きのない文章を比較して205%読む速度が遅くなる
 ・空白を適切に利用すること。息継ぎもなしに早口での話は理解しにくい。文章も同じ

第4章 – 相手の注意をひきつける

・サイズ、色、配置など無意識的視覚情報を戦略的に利用する
・相手の注意を意図するところに集め、意図通りに読んでもらう
・スクリーンやページを読み取る際、人は左からZの形で見ていく
・どこを注目させるか考える際は、一度グラフのすべての色をグレーにしてみるとよい
・色覚障害にも配慮したほうがよい(色覚障害シミュレーターのサイトやアプリがあるため、利用するべし)

第5章 – デザイナーのように考える

・「形式は機能に従う」と同様に、データで何を伝えたいかを考えてから、表現方法を考えるべし
・「足すべきものがなくなった時ではなく、減らすものが何もなくなったとき、それが完璧になったとわかる」(サンテグジュペリ)
・人々が新しいものに抵抗を示すのは、古いものに親しんでいるから
 変化させるときはメリットを明確にする、比較できるようにする、キーマンを巻き込むといった対応が必要

第7章 – ストーリーを伝える

・よい物語は人をひきつけ、旅に連れ出し、感情に直接働きかけ、記憶に残る力を持っている。そしてその物語を友人に話して聞かせる
・理論だけでは人は行動する気にならない。ストーリーをつくることで人々の心に響き、行動につながる
・ストーリーには「始まり、中間、結末」がある。まずは物語の設定から始まる。主人公や登場人物の紹介や関係性や世界観を紹介し
 その後主人公は事件に直面する。この事件を対処しようとする中で自分を理解し、より一段高い気づきに到達する
 そして最後に、事件を解決し主人公やほかの登場人物が、新たな感覚を通じて自分が何者か理解する

Team Geek ―Googleのギークたちはいかにしてチームを作るのか を読んだ

Team Geek ―Googleのギークたちはいかにしてチームを作るのかを読んだときのメモ。

0章 – まえがき

・エンジニアリングの重要な要素であるが、忘れがちな存在の「人間」に焦点を当てている。
・技術集団を率いる人間は、技術への深い愛と造詣が必要。

1章 – 天才プログラマの神話

・リーナスもビル・ゲイツもチームとうまくやる才能があった。
・人は作業途中のコードは見せたがらず、完璧にしてから見せようとする。
 しかし、作業を隠すことで失敗のリスクが高くなる。すでに誰かが対応していたり、簡単なミスに気が付かなかったり、不要なものを作成している可能性がある。
 何度もコンパイルしながらプログラムするように、フィードバックされながら作業したほうがよい。
・チームで働くときのポイントはHRT。謙虚(Humility)・尊敬(Respect)・信頼(Trust)。尊敬は思いやり、その人を高く評価すること。信頼は正しいと信じ、仕事を任せること。
・世の中の関心は常に動く。専門家として新しいことを学ばないと置いていかれる。謙虚に常に学んでいかなければならない。
・弱さ(わからないこと)を見せることは信用を失うことではない。謙虚を見せて、他人の意見を信頼することで、その正直さと強さによって周りが尊敬してくれるようになる。

2章 – 素晴らしいチーム文化を作る

・文化はリーダーではなくチームメンバが作る。そのため強烈な個性をもった新人が現れると、彼の文化がチームに根付くことになる。それが健全な文化になることはとても少ない。
・エンジニアはコミュニケーションをできるだけ排除してコードを書こうとするが、コミュニケーションがないと自分が正しいコードを書いているという保証はない。
(チームと違う方向に進んでいるかもしれない)
・ミッションコミットメントは方向性と、制限されたスコープが必須。
・バグ管理ツールは優先度をつける必要がある。そうしないと、どうでもよいバグを修正して、重大なバグは放置される。
・コードコメントには「なに」は記載せず、「なぜ」を記載する。
・ソースコードは完成してからもさまざまな人によって変化を続けるため、作成者の名前を記載するべきではない。

3章 – 船にはキャプテンが必要

・伝統的なマネージャーはどうやって仕事を完了させるかを考える。リーダーは何ができるかを考える。(どうやって仕事を完了させるかはチームが考える)
・部下を子供として扱えば、部下は子供のように振る舞う。エンジニアを大人として扱うべし。
・マネジメントの仕事はチームの幸せと生産性を高めること。
・マネージャーとしていちばん大事なのは、執事や召使のようにチームに奉仕すること。HRTの雰囲気を出す必要がある。
・パフォーマンスが低い人は高い人の時間を奪う。結果としてパフォーマンスが高い人は流出し、どこにも行けない人たちチームに残る。
・パフォーマンスの低い人は早めに対策する必要がある。そのチームで仕事できなくても、違うチームだと役に立つ能力を持っているかもしれない。
 また向き合う場合は、目標と期日を設定して、毎週進捗確認をする必要がある。
・チームをマイクロマネジメントしなくなれば、メンバのほうがリーダーよりも仕事に詳しくなる。つまり、リーダーは合意形成や方向性の決定を支援することになり
 目標の達成方法はメンバが決定すべきこととなっていく。
・リーダーとしてチームを長期に渡って生産的にするには、チームの幸せを計測したほうがよい。
 1対1のミーティングの後に「何か必要なものある?」という質問をすると、そのメンバが生産的で幸せになるために必要なものを簡単に把握できる。

4章 – 有害な人に対処する

・相手にする価値のない人は無視がオススメ。リソースを食われてしまうため、言葉で言いくるめるよりも無視がよい。
・善人と悪人で分類して悪人を追い出すのではなく、問題ある振る舞いを追い出す必要がある。
・有害な振る舞いに対応する前に、短期的にチームの注意や集中を無駄にしても長期的にプロジェクトにメリットがあるか、衝突は有益な方法で解決できるかを考える。
・無能で十分説明されることに悪意を見出すな。よくわからない人を追放するのではなく、破壊的な振る舞いを受け入れず、HRTに対しての期待を明確にすることが仕事。
 (例えば、ある製品に欠陥が見つかった場合、製造した企業が無能であるか愚かであるということを示しているのであって
 消費者を困らせるために企業が悪意を持って欠陥を忍ばせたわけではない、という考え方のこと。)

6章 – ユーザも人間

・成功しているプロダクトは問題を限定して、それをうまく解決したもの。
 トースター(多くの食材を調理でき、ほぼすべての人が利用できる。ただしラジオ機能(余計な機能)はついていない。)のようなプロダクトを目指すこと。
・プロダクトのユーザが増えると、機能が増えることで複雑性が増す。しかしユーザの平均的な技術能力は低下するため、ユーザの不満が増えていく。
 開発者がユーザの声を聞けるような環境を用意しておくこと。またユーザはシンジられないかもしれないが、開発チームと関係を築きたいと考えている。

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ

プログラムはなぜ動くのか 知っておきたいプログラムの基礎知識を読んだ。
あまりPGしないので深くまでは理解できなかったが、良かった。知らなかったことをメモ。

・プログラムが実行される仕組みは、プログラムがコンパイルされてマシン語(レジスタを利用した演算処理)になり、マシン語がCPUによって実行される。
・アセンブリとマシン語は1対1で対応している。(マシン語にエイリアスとして英字を割り当てたものがアセンブリ)
・8桁の2進数をバイト(byte)と呼び、メモリやディスクはバイト単位で処理される。
・ICのもつピンは直流電流0Vか5Vのいずれかの状態になっている。
・マイナスは補数で表される。補数は反転して1を足した数。マイナスは同じ絶対値の正の数を足すと0になるという考え方。
・0.1という2進数は10進数だと0.5となる。10進数の0.1は2進数では表せない。
・プログラムでは小数点数を浮動小数点数として処理する。
・メモリはメモリICにアドレス信号、データ信号、制御信号を意味する足が複数あり、アドレスを指定してデータを読み書きする。
・スタックは干し草を積んだ山という意味で、つまりLIFO(LastIn FirstOut)形式。
・単なる配列を利用するよりも、リストを使ったほうがメモリの使い方がよいため、実行速度が高速になる。
・ランレングス法(Run Length Encoding)は、データと繰り返し数で圧縮する。(AABBBBCCCC→A2B4C4)
 画像ファイルなど同じデータが続く場合に高い圧縮率となる。
・ハフマン法は圧縮対象のファイルごとに符号体系を構築して、それをもとにして圧縮する。
・画像ファイルは非可逆圧縮であることが多い。
・動作環境に影響するのはOSとマイクロプロセッサの種類。OSごとに命令を受けるAPIが異なり、マイクロプロセッサごとに処理できるマシン語は異なるため。
・ソースコードをネイティブコードへ翻訳するのがコンパイラの仕事。
・インタプリタは実行時にソースコードを1行ずつネイティブコードへ翻訳する。
・コンパイルしただけではプログラムとしては利用できない。ソースコードで利用しているオブジェクトをまとめる作業(リンク)を実施する必要がある。
 (Windowsはこの作業をすることでEXEファイルとなる)
・EXEが実行されると、変数領域、関数領域、スタック領域、ヒープ領域(プログラム実行時に動的に作成される配列やオブジェクトを格納)がメモリに割り当てられる。
・1人前のプログラマとして、ハードを理解して、OSがハードを抽象化していることを理解するべき。
・OSがなかったころは、ディスプレイの表示や印刷のプログラムも自分で書く必要があった。
・C言語はコンパイルだけでなく、アセンブリに変換することもできる。
・アセンブリはネイティブコードに変換される命令と、_TEXTなどのプログラムの構造やアセンブル方法を表す疑似命令の2種類がある。
・アセンブリ言語の構文はオペコード(命令の動作)とオペランド(命令の対象)の組み合わせ。
・例えばキーボードは割込要求の01、マウスは02といった識別番号が割り振られており、割込が発生するとまずは割込コントローラーが処理を受け付け、順番にCPUに伝える。
・VRAMというメモリ領域にデータをINすると、ディスプレイに表示される。現在はVRMA用メモリと専用マイクロチップが載っているグラフィックカードがよく利用されている。

マスタリングTCP/IP 入門編 メモ

マスタリングTCP/IP 入門編を読んだ。
とても良かった。知らなかったことをメモ。

・1970年代、各メーカーが独自規格でネットワーク機器を作成していたため、ISO(国際標準化機構)はOSIと呼ばれる通信体系を標準化した。
 OSIの定めるプロトコルは普及していないが、OSIプロトコルの設計指針であるOSI参照モデルはとても有名。
・TCP/IPはIETF(Internet Engineering Task Force)にて提案されたプロトコルで、現在のデファクトスタンダード。
・探索MTUは10分しかキャッシュされない。
・IPパケットを利用した、ECN(Explicit Congestion Notification)という輻輳通知機能がある
・Mobile IPという移動時にネットワークが変わっても、IPアドレスが変えなくする技術がある
 内部的には変えたくないIPアドレスのネットワークに仲介エージェントを配置し、リバースプロキシするようなイメージ。
 IPv4だと仲介エージェントが必要だが、IPv6 Mobile IPだと不要になる。
・TCPとUDPは同じポート番号を別の目的で利用することが可能。
・ACKは肯定確認応答、NACK(Negative Acknowledgement)は否定確認応答。
・Nagleアルゴリズムのように、送信処理を遅らせることでネットワークの利用効率をあげる方法もある。ただし遅延につながることも。
・UDPパケットはチェックサムエラーがあるとパケットすべてを破棄する。UDP-Liteでは一部エラーでは破棄しないようにできる。
・TCPに追加してマルチホーミングに対応したSCTP(Stream Control Transmission Protocol)なるものがある。
・TCPのシーケンス番号の初期値は乱数値で決定される。
・経路制御アルゴリズムにはDistance-Vector(距離をが近いネットワーク情報を各ルーターがもつ)とLink-State(同じ経路制御表をすべてのルーターが保持する)の2種類が存在する。
・OSPFにはエリアという概念があり、管理する範囲をエリア内のみとすることで、経路制御情報や処理負荷をさげる。
・ISPや地域ネットワークなど組織を束ねるネットワーク集団を自律システム(Autonomous System)と呼ぶ。
 ASには16ビットのAS番号が割り当てられ、AS番号を使って経路制御される。
・インターネットは当初ARPANETがhostsファイルを一括管理していた。
・URIはあらゆるスキームに対応した識別子。
・POPは既読情報をメールクライアントで管理し、IMAPはサーバで管理する。
・SSHを利用してポートフォワード機能を利用可能。サーバAのポート1000へ接続すると、サーバBのポート110に接続するといったことが可能。
・MRTG(Multi Router Traffic GRAPHER)はネットワークトラフィックを収集して、グラフ化するツール。
・H.323やSIPは、呼制御(相手を呼び出し、どのような形式でデータのやり取りをするか)のプロトコル。
・広域イーサネットは通信業者が提供するVLANを利用者が専用で利用する。(データリンク層を利用するため、TCP/IP以外のプロトコルも利用可能)
・ITIL(Information Technology Infrastructure Library)はイギリス政府が策定したITシステムの運用や管理業務に関する階層・体系的なガイドライン。
・インターネットの最大の利点は「エンドツーエンド通信」。IPv4では枯渇によりこれを実現できない(NAPTなどで補っている状態)。

gulp で hello world!

概要

gulp入門を見たため、メモ。
gulpはフロントエンドのタスクを自動化するタスクランナーと呼ばれるもの。

インストール

dockerでcentosを用意して、gulpをインストールした。

PS C:\WINDOWS\system32> docker run -it centos:centos6
# yum -y install epel-release
# yum -y install nodejs npm
# node -v
v0.10.48
# npm -v
1.3.6
# npm install gulp -g
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm http GET https://registry.npmjs.org/gulp
npm ERR! Error: CERT_UNTRUSTED
npm ERR!     at SecurePair.<anonymous> (tls.js:1430:32)
npm ERR!     at SecurePair.emit (events.js:92:17)
npm ERR!     at SecurePair.maybeInitFinished (tls.js:1029:10)
npm ERR!     at CleartextStream.read [as _read] (tls.js:521:13)
npm ERR!     at CleartextStream.Readable.read (_stream_readable.js:341:10)
npm ERR!     at EncryptedStream.write [as _write] (tls.js:418:25)
npm ERR!     at doWrite (_stream_writable.js:226:10)
npm ERR!     at writeOrBuffer (_stream_writable.js:216:5)
npm ERR!     at EncryptedStream.Writable.write (_stream_writable.js:183:11)
npm ERR!     at write (_stream_readable.js:602:24)
npm ERR! If you need help, you may report this log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>

npm ERR! System Linux 4.9.87-linuxkit-aufs
npm ERR! command "node" "/usr/bin/npm" "install" "gulp" "-g"
npm ERR! cwd /
npm ERR! node -v v0.10.48
npm ERR! npm -v 1.3.6
npm ERR!
npm ERR! Additional logging details can be found in:
npm ERR!     /npm-debug.log
npm ERR! not ok code 0

# npm config set strict-ssl false
# npm install gulp -g
# mkdir mysite
# cd mysite/
# npm init
# npm install --save-dev gulp # フォルダにgulpをインストールする
# npm config set strict-ssl true

hello world!

gulpfile.jsをgulpをインストールしたフォルダに用意する。

var gulp = require('gulp');

gulp.task('hello', function() {
    console.log('hello world!');
});

gulp.task('default',['hello']);

gulpを実行する。

# gulp
[13:06:58] Using gulpfile ~/mysite/gulpfile.js
[13:06:58] Starting 'hello'...
hello world!
[13:06:58] Finished 'hello' after 289 μs
[13:06:58] Starting 'default'...
[13:06:58] Finished 'default' after 12 μs
# gulp hello
[13:07:01] Using gulpfile ~/mysite/gulpfile.js
[13:07:01] Starting 'hello'...
hello world!
[13:07:01] Finished 'hello' after

その他、プラグインをインストールしてwebserverを立ち上げたり、watch(更新を監視)などが可能。

参考

npm install で SSL Error になった時の対処法。

rfc5077をインストールできなかった話

第2回社内セキュリティ共有勉強会に参加した際に初めて知った単語

TLSのセッション情報を確認できるツールらしい
結論としてdebian8で使ってみようとしたが、できなかった話

以下を参考に実施してみた
サーバ側のSSL Session Cache状況を確認する「rfc5077」というツールが便利
rfc5077-clientをDebian上でビルドしたい
を参考に実施した

# git clone https://github.com/vincentbernat/rfc5077.git
# aptitude install libnspr4-dev libev-dev libssl-dev libnss3-dev make gcc
...
# git submodule init
Submodule 'http-parser' (https://github.com/joyent/http-parser) registered for path 'http-parser'
Submodule 'httpagentparser' (git://github.com/shon/httpagentparser.git) registered for path 'httpagentparser'
# git submodule update
Cloning into 'http-parser'...
remote: Counting objects: 1460, done.
remote: Total 1460 (delta 0), reused 0 (delta 0), pack-reused 1460
Receiving objects: 100% (1460/1460), 659.95 KiB | 341.00 KiB/s, done.
Resolving deltas: 100% (897/897), done.
Checking connectivity... done.
Submodule path 'http-parser': checked out '1ca7de52587f19cb87a28b8ace2e0f2e6cfcde7f'
Cloning into 'httpagentparser'...
remote: Counting objects: 591, done.
remote: Total 591 (delta 0), reused 0 (delta 0), pack-reused 591
Receiving objects: 100% (591/591), 630.40 KiB | 160.00 KiB/s, done.
Resolving deltas: 100% (265/265), done.
Checking connectivity... done.
Submodule path 'httpagentparser': checked out '920af88989f6dd8eb6f628505d039df8b65c880e'
# make
cc -g -Werror -Wall -ansi -std=c99 -D_DEFAULT_SOURCE -D_GNU_SOURCE   -c -o rfc5077-client.o rfc5077-client.c
rfc5077-client.c: In function ‘resultinfo_display’:
rfc5077-client.c:135:6: error: implicit declaration of function ‘SSL_SESSION_get0_cipher’ [-Werror=implicit-function-declaration]
      SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
      ^
rfc5077-client.c:135:26: error: passing argument 1 of ‘SSL_CIPHER_get_name’ makes pointer from integer without a cast [-Werror]
      SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
                          ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1834:13: note: expected ‘const struct SSL_CIPHER *’ but argument is of type ‘int’
 const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
             ^
rfc5077-client.c:154:5: error: implicit declaration of function ‘SSL_SESSION_get_master_key’ [-Werror=implicit-function-declaration]
     size_t master_key_len = SSL_SESSION_get_master_key(x, NULL, 0);
     ^
rfc5077-client.c:170:6: error: implicit declaration of function ‘SSL_SESSION_has_ticket’ [-Werror=implicit-function-declaration]
      SSL_SESSION_has_ticket(x)?"✔":"✘",
      ^
rfc5077-client.c: In function ‘resultinfo_write’:
rfc5077-client.c:207:33: error: passing argument 1 of ‘SSL_CIPHER_get_name’ makes pointer from integer without a cast [-Werror]
             SSL_CIPHER_get_name(SSL_SESSION_get0_cipher(x)),
                                 ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1834:13: note: expected ‘const struct SSL_CIPHER *’ but argument is of type ‘int’
 const char *SSL_CIPHER_get_name(const SSL_CIPHER *c);
             ^
rfc5077-client.c: In function ‘main’:
rfc5077-client.c:381:3: error: implicit declaration of function ‘TLS_client_method’ [-Werror=implicit-function-declaration]
   if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL)
   ^
rfc5077-client.c:381:26: error: passing argument 1 of ‘SSL_CTX_new’ makes pointer from integer without a cast [-Werror]
   if ((ctx = SSL_CTX_new(TLS_client_method())) == NULL)
                          ^
In file included from rfc5077-client.c:23:0:
/usr/include/openssl/ssl.h:1820:10: note: expected ‘const struct SSL_METHOD *’ but argument is of type ‘int’
 SSL_CTX *SSL_CTX_new(const SSL_METHOD *meth);
          ^
cc1: all warnings being treated as errors
<builtin>: recipe for target 'rfc5077-client.o' failed
make: *** [rfc5077-client.o] Error 1

httpoxy

概要

HTTPアクセス時に”proxy:”ヘッダをつけると
サーバ側で HTTP_PROXY として認識される(ヘッダのproxyが大文字に変換され、HTTP_が付与される)
CGIアプリケーションはこの値をHTTPプロキシの値として認識し
例えばPHPは外部接続時にHTTP_PROXYを利用して通信する

影響

サーバから外部にHTTP通信時にプロキシを経由させることができる
つまり通信内容を傍受可能となる
2016-07-19_220225
Mitigating the HTTPoxy Vulnerability with NGINX

対策

・リクエストに含まれる Proxy ヘッダを無効にする
・CGI において、環境変数 HTTP_PROXY を使用しない
・ファイアウォールなどを用いて Web サーバからの HTTP アウトバウンド通信を必要最小限に制限する
CGI等を利用するWebサーバの脆弱性に関する注意喚起 – JPCERT/CC

nginx対策方法

リクエストに含まれるProxyヘッダを無効にする対応は
複数サイト運用だと複数のファイル変更が必要となり、キツイためCGIにてHTTP_PROXYを使用しないことで対応

### 設定追加してreloadする ###
root@debian9:/etc/nginx# vi fastcgi_params
=====
fastcgi_param HTTP_PROXY "";
=====
root@debian9:/etc/nginx# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
root@debian9:/etc/nginx# /etc/init.d/nginx reload

apache対策方法

検証環境が手元にないが、以下でリクエストに含まれるProxyヘッダを無効にすることが可能とのこと

RequestHeader unset Proxy

確認方法

PHPに関するHTTPOXY脆弱性の問題と対応方法より

curl -H 'Proxy: 127.0.0.1:12345' "http://localhost"

でアクセス。PHP側は

var_dump($_SERVER['HTTP_PROXY']);
putenv('HTTP_PROXY=');
var_dump(getenv('HTTP_PROXY'));
exit;

その他

主なディストリビューションの対応方法
httpoxy : CGI/言語などを利用したHTTP_PROXY書き換えの脆弱性(CVE-2016-5387 etc.)

Ethereumを使ってみた

Ethereumとは

・2015-7-30リリース
・Ethereum(パブリック型ブロックチェーン)
・マイクロソフトが開発環境を提供しているらしい
・スマートコントラクト・分散型アプリケーション(DApps)の構築プラットフォーム
・派生したプロジェクトにEris、HydraChain(エスタブリッシュ型ブロックチェーン)

ブロックチェーン情報

・ETHの残高情報等がブロックチェーンに直接記録されるアカウントがベースとなったシステム
 2種類のアカウントがある
 ・従来のビットコイン等の仮想通貨のアドレスと同様のアカウント
 ・「コントラクトアカウント(Contract Account)」と呼ばれるプログラムコードによって
  管理されるスマートコントラクト実行用のアカウント

インストール

debianで試そうとしたが、サポート外とのこと(公式フォーラムより)

root@ubuntu1404:/home/shimizu# bash <(curl -L https://install-geth.ethereum.org)
...

root@ubuntu1404:/home/shimizu# geth version
Geth
Version: 1.4.10-stable
Protocol Versions: [63 62]
Network Id: 1
Go Version: go1.5.1
OS: linux
GOPATH=
GOROOT=/usr/lib/go

テスト環境で採掘する

パーミッションド型ブロックチェーンを試せる(Ehterの挙動調査や個人的な作業に向いている)
ただしそこで得たEtherはパブリック型ブロックチェーン(Frontier)では利用できない

root@ubuntu1404:/home/shimizu# mkdir eth_data
root@ubuntu1404:/home/shimizu# geth --networkid "10" --datadir "/home/shimizu/eth_data" --olympic console
...
> personal.newAccount("shimizu")
"0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07"
> personal.newAccount("shimizu02")
"0x8e9b51319dc468e8c1ea55737ba3192f40693103"
> eth.accounts
["0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07", "0x8e9b51319dc468e8c1ea55737ba3192f40693103"]
> miner.start()
I0719 00:47:10.318491 miner/miner.go:119] Starting mining operation (CPU=1 TOT=2)
I0719 00:47:10.318831 miner/worker.go:573] commit new work on block 1 with 0 txs & 0 uncles. Took 204.305µs
true
> I0719 00:47:10.319500 eth/backend.go:454] Automatic pregeneration of ethash DAG ON (ethash dir: /root/.ethash)
I0719 00:47:10.319637 ethash.go:259] Generating DAG for epoch 0 (size 1073739904) (0000000000000000000000000000000000000000000000000000000000000000)
I0719 00:47:10.319935 eth/backend.go:461] checking DAG (ethash dir: /root/.ethash)
I0719 00:47:12.251590 ethash.go:291] Generating DAG: 0%
I0719 00:47:14.766994 ethash.go:291] Generating DAG: 1%
I0719 00:47:17.135879 ethash.go:291] Generating DAG: 2%
...

miner.stop()

### ブロックチェーンの長さ ###
> eth.blockNumber
937

### etherの持ち高確認 ###
> eth.getBalance("0x2e7f96d3251027d3b4e2d90be4f9a320e7a28f07")
1.40765625e+21

Frontierに接続してみる

アカウントの削除方法がわからなかったため、新しくディレクトリを作成して試してみた

root@ubuntu1404:/home/shimizu# mkdir eth_data_frontier
root@ubuntu1404:/home/shimizu# geth --datadir "/home/shimizu/eth_data_frontier"
...
I0719 02:01:41.677036 core/blockchain.go:963] imported 1906 block(s) (0 queued 0 ignored) ...
...

参考URL

Ethereum イーサリアム
Gethをインストールする
Ethereumをインストールしてみた。