day one
日々の記録。
2011年7月24日日曜日
2011年7月17日日曜日
rubykaigi 2011 初日 に行ってきた
最後のrubykaigiにして初参加
今年で最後の開催となるrubykaigi 2011に、初参加してきた。普段、rubyはテキスト処理にone linerで使ったり、ちょっとしたツールを作るのに使ってきた。仕事ではFortranを使うという(かなり)珍しいマイノリティな部類なわけだが、こういう違うコミュニティというか文化みたいなに触れたくて参加を決めた。
初日の感想
- 基調講演が最高だった
- ruby自体の話よりも、rubyを使った仕事の話が多い(想像と違った)
- matzのサインをもらえて嬉しい
- crubyコミッタのみなさんの顔を拝めた
- 異分野の話を聞くのは刺激になる
あとでまた書く。
2011年7月9日土曜日
rubykaigi2011に参加することにした。
ちょっとrubyistの雰囲気を味わってこようと思う。
2011年6月19日日曜日
RedmineをCentOS 5.6 on serversman VPSにいれるのに苦労した
インストールメモ
versionなど。
- ruby 1.8.7
- もともと自分のhomeに1.9を入れていて、/usr/lcal/binに。
- gem 1.3.7
- sourceから/usr/local/bin/へ。
- gem でrails 2.3.5
- gem でrack 1.0.1
- gem でmysql
- gem でpassenger
- redmine 1.0.5(ソースから)
passenger
a.k.a mod_rails とか。apacheでrails アプリを動かせるらしい。railsはまったく知らないので、apacheでできると言われてもピンとこなかったけど、redmine公式サイトの記述通りにいれた。redmine公式サイトの説明通りにapacheのconfを書いた(同じものがpassenger-isntall-apache2-moduleするとterminalに出てくる。依存関係の不足を指摘して、yumでコレいれなよ、と言ってくれる。親切。)。1点、redmine公式ページの案内と変えたのは、sub uriで公開する点。apache-passengerのtech_noteを参考にして設定。
感想
まだredmineをあまり使ってない。ただ、インストールが面倒すぎる。versionとかapacheとか気にするとこがたくさん。これじゃあ、多くの人は使ってみようと思わないよなあ。(職場で詳しい人がインストールしてくれたら使おうかな、という程度じゃあるまいか。)
references
blogを中心に情報を探したけど、結局のところ、公式サイトが一番役にたった。2011年6月4日土曜日
うまくいかないときにやるといいこと
なんだか最近うまくいかない、空回りだなあ、というときにするといいこと。
- 部屋の掃除をする
- 音楽を聴く
- 風呂にゆっくり入る
- 机の周りを整える
- 自炊する
- 運動する
- たまっていたメールを片づける
- たまっていたRSSを片づける
- たまっていたメールを既読にする
- たまっていたRSSを既読にする
- 本棚の配置替えをする
- 買い物をする
ようするに気分転換をするといい。あとは、一定の手順が決まっていることに取りかかるのもよい。いろいろ細かいことを片づけているうちにいいリズムになってきたりする(なんだか、日々のルーチンをきっかけにいいフローに入る、みたいなのが、"プログラマが知るべき97のこと"の中の記事にあったような気がする)。最後の買い物をするというのは度がすぎると危険。
2011年4月25日月曜日
中島聡さん「エンジニアとしての生き方」出版記念講演会に行ってきた
世界で働く
4/24(日)に中島聡さんの著書「エンジニアとしての生き方」出版記念講演会を聴いてきた。ふとしたきっかけからブログの"Life is beautiful"に出会い、そこからほとんど欠かさず読んでいるのだが、ご本人に生でお目にかかることができて感激した。帰りがけにサインもいただき、"がんばってください。"と声をかけていただいたことは、忘れない。講演終了直後はかなり興奮していたのだが、一日置いて冷静になったところで感想を記しておこうと思う。
この本は"エンジニア"のためだけではない
中島さんは本を"ガラパゴス脱出論"みたいな題名にしたかったようだが、正式な書名は"エンジニアとしての生き方"となっている。"ガラパゴス~"に比べて若干固くなってしまったが、"流行物"っぽさが消えたこちらの方が長く読まれやすいのではないだろうか。ただ、"エンジニア"とあるが、ここをたとえば"科学者"と読みかえても十分通じる。"若者"でもいいかもしれない。伝えたいことは"人生は1度だからおもいきり楽しもう。活躍できる場に飛びこもう。明日の自分は自分でつくる!"というポジティブなメッセージである。
印象に残ったこと
中島さんはとても楽しそうに話をしていた。50歳とおっしゃっていたが、周囲にあれほど生き生きしている50歳の人はいない。自分がやりたいことをどんどんとやってやるぜ!という若者的エネルギーをびしばし感じた。当日はUSTREAMでも配信していたようだけど、その場にいなくても場を共有できるような時代にあって、実際にその場にいることの大切さを感じた。空気を感じられたと思う。経験に裏打ちされた"自信"を見ることができた。
ブログをはじめてから生活(人生?)が変わった、とおっしゃっていたような気がするが、そこで"いろんな分野でいい仕事をしてきている人がたくさんいると思う。でも、なかなか見えてこなくて、地上の星のようになっている。ブログを書くことは最高のパーソナルマーケティングだし、そういう人にも是非ブログを書いてほしい"という趣旨のことも言っていた。同感である。ブログを書くのはIT業界の人が多いと思うが、そこだけが世界なのではなく、現実世界の多様性がもっとブログ界に出てくれば、もっと楽しくなりそうである。
(なんだかうまく書けないが、)充実した時間を過ごすことができた :)
2011年4月17日日曜日
「プロセッサを支える技術」を読んだ。
今までよりもCPUが身近になった。
「プロセッサを支える技術」を読み終わった。"本書について"のところにも書いてある通り、本書は、自身でプログラムを書きコンピュータシステムをより効率的に動かしたい、という方を対象にしたプロセッサの解説書です。と、いう本である。プログラマのためのハードの本、と言えばいいのだろうか。
あらゆる科学技術がそうであるように、コンピュータシステムも技術の発展に伴いブラックボックス化され、抽象化されてきた。CPUが命令を実行する仕組みを知らなくても、また、メモリとキャッシュラインの関係を意識しなくても、コンパイラ技術の進歩によりそこそこなプログラムが書けてしまう。そもそもマシンパワーの拡大により、マシンの性能をぎりぎりまで引き出さなければいけない場面もあまりないし、LL系言語で片がつくことも多くなってきた。でも、そうやってプログラミングをする中で、もっと効率的なプログラムを書きたい、プログラムが実行される仕組みが知りたい、言語処理系やコンパイラの実装ってどうなっているの、と感じる人だって少なくないと思う。この本は、そんな人(←自分)の疑問にこたえる。1回読んだだけで消化しきれないが、必要に応じて何度も読もうと思う。
目次は以下。技術評論社のサイトより。
WEB+DB PRESS plusシリーズ プロセッサを支える技術 ― 果てしなくスピードを追求する世界 第1章 プロセッサとコンピュータシステムの基礎 1.1コンピュータの構造 コンピュータの構成要素 ― プロセッサ,メモリ,入出力装置 Column プロセッサパッケージの物理的な構造 コンピュータは2進法で計算を行う プロセッサ ― プログラムを解釈するコンピュータの頭脳 Column 2値と多値 ― 必ず2進法,ではない!? プロセッサの命令の実行 ― ベルトコンベア式の流れ作業 Column プロセッサ,マイクロプロセッサの定義 ― コンピュータの最重要部品としてのプロセッサ サイクルタイム,クロック周波数 Column パイプラインの段数 CPUという呼称 プロセッサ現在 ― 用途の広がり Column 倍率を表す接頭語 命令アーキテクチャとマイクロアーキテクチャ ― ソフトウェア的な構造とハードウェア的な構造 メモリ ― コンピュータの「命令」と「データ」を記憶する メモリ容量 ― どれだけの情報を記憶できるか その「K」は210か,103か バイト(B) ― 8ビット単位で情報を扱う アドレス メモリレイテンシ DIMM ― コンピュータの部品としてのメモリ バス ― プロセッサ,メモリ,入出力装置をつなぐ データ転送速度とメモリ 入出力装置 ― コンピュータの目,耳,口 入出力装置は種類が多い ― 基本/高速/各種用途向けの入出力装置 I/Oバス ― PCI Express規格 プロセッサと入出力装置の関係 ノースブリッジとサウスブリッジ ― 薄れつつある呼称 1.2 コンピュータの高速化を支える半導体技術 ムーアの法則 ― より多くのトランジスタ。並列度を高める方向へ デナードスケーリング ― トランジスタの性能を向上 膨大な開発投資が支える半導体の微細化 ― 微細化のペースは今後しばらくは継続 性能向上の三本柱 ― クロック向上,並列処理と,機能拡張 1.3 コンピュータとデータの表現 バイト,ハーフワード,ワード... ― ビットのグループと用途 文字コード 符号無し整数と符号付き整数,1の補数表現と2の補数表現 Column 日本語と文字コード 浮動小数点数 ― IEEE 754規格 ビッグエンディアンとリトルエンディアン ビッグエンディアンか? リトルエンディアンか? 1.4 プロセッサと命令 命令アーキテクチャ入門 Intel x86アーキテクチャの命令形式 x86という呼称について 機械命令 ― プロセッサへの命令 アドレス空間 32ビットアドレス空間 64ビットアドレス空間 ― AMD86-64,Intel 64 1.5 機械命令プログラムの作り方 アセンブラによるプログラミング Column AMDとIntelの64ビット拡張アーキテクチャ コンパイラを使う高級言語によるプログラミング 最適化 インタプリタによるプログラミング JITコンパイル 1.6 まとめ Column 半導体の微細化 第2章 プロセッサの変遷 2.1 コンピュータ以前の計算装置 そろばん ― 計算をするための最初の道具 ネイピアの骨 ― 掛け算の補助具 機械式計算機 ― Schikardの計算機,Pascaline BabbageのDifference Engine ― 歯車を使うスパコン 2.2 初期の電子式コンピュータ 最初の電子式コンピュータ ― ABCとENIAC FUJIC ― 日本初の電子式コンピュータ 2.3 プロセッサを構成する素子の変遷 主要な部品に基づくコンピュータの世代分類 第1世代:真空管 第2世代:トランジスタ TRANSARC S-2000 第3世代:集積回路(IC,LSI) 第4世代:大規模集積回路(VLSI) Intel 4004 MOSFETと性能向上,CMOS Intel 4004(1971年) vs. 2010年現在のマイクロプロセッサ VLSIプロセッサの素子数,クロック周波数のトレンド 2.4 命令アーキテクチャの変遷 命令アーキテクチャ発展の道 プログラム内蔵式コンピュータ ― プログラムもメモリから読み込む 仮想記憶 ― もっと潤沢に。メモリをたっぷり使いたい 仮想記憶のしくみ マルチプロセス ― プログラムの配置替えが必要 TSSと,メモリ管理機構の登場 メモリ管理機構,特権状態 ― マルチユーザではセキュリティ問題を解決する必要がある ページ方式とセグメント方式 特権状態とユーザ状態 Column MULTICS,その後 ISA拡張 ― 命令アーキテクチャの確立と,命令互換性の実現 2.5 マイクロアーキテクチャの発展 マイクロアーキテクチャ発展の道 パイプライン処理 ― パイプラインレジスタを用いて,ハードウェアを有効利用する パイプライン処理実現の難所 ― 素子数の増加に伴いパイプライン処理が普及してきた 演算器の高速化 ― 整数演算器,浮動小数点演算器 整数演算器 ― 加減算はとくに重要である 浮動小数点演算器 キャッシュ ― 「メモリアクセス」問題に対処する秘密の小箱 キャッシュの魔法 RISCの出現 ― RISCとCISC RISCの特徴,CISCの特徴 RISC方式のプロセッサとCISC方式のプロセッサ スーパースカラ実行 ― 複数の命令を1サイクルに実行する Out-of-Order実行 ― 命令の順序を変更して性能を上げる 20~30%程度の性能向上が見込めるOut-of-Order実行 分岐予測と投機実行 ― 「条件分岐命令」対策 Column 「Out of Order」にご注意(!?) マルチコア ― 消費電力の制約がマルチコア化をプッシュ ハードウェア量と性能の関係 ― グロシュの法則の今 消費電力の増加とマルチコア化 2.6 用途が広がるプロセッサ さまざまな舞台で活躍するプロセッサ 省電力,高信頼技術,リアルタイム性 ― さまざまな要件 2.7 まとめ 第3章 [詳説]プログラマのためのプロセッサアーキテクチャ 3.1 マイクロアーキテクチャを支える技術 パイプライン実行のしくみ ― 「並列」に命令を処理する 命令の実行とハードウェア構造 パイプラインの動き 構造的ハザード ― 「プロセッサの資源を取り合う」問題 データハザード ― 「前の仕事が終わらないと次に進めない」問題 制御ハザード ― 「条件分岐命令」問題 キャッシュのしくみ ― メモリアクセスを加速する キャッシュラインとタグ ― データの塊と,中身を示す小さなデータ メモリとキャッシュ間のデータ転送はキャッシュライン単位 フルアソシアティブ方式のキャッシュ ― 自由度が高い ダイレクトマップ方式のキャッシュ ― 構造が簡単 セットアソシアティブ方式 ― 良いとこ取りの中間的な方式 キャッシュによる性能改善効果 プロセッサの記憶階層 キャッシュをうまく使うプログラミング RISCとCISC ― 固定長命令と可変長命令 命令のデコードが難しい ― CISC命令と問題[1] パイプライン実行が難しい ― CISC命令と問題[2] 互換性を維持して内部をRISC化 ― x86のCISC命令を,RISC風の内部命令に変換してから実行する ロード,ユースの引き離し ― RISCの特徴[1] RISCはCISCより多くの命令メモリが必要 ― RISCの特徴[2] 演算器の高速化 ― プロセッサ中で処理が複雑で時間のかかる部分の一つ 整数加算器の高速化 整数乗算器の高速化 除算の高速化 ― SRT除算アルゴリズム 浮動小数点演算器とその使い方 スーパースカラ実行のしくみ ― 1サイクルに複数の命令を並列実行する 1サイクルに複数命令を実行するために Out-of-Order実行のしくみ ― データハザードの影響を軽減する リザベーションステーション 逆依存性の問題 リネーム ― 逆依存性を解消 正確な割り込みを保証 メモリバリア命令/FENCE命令 ― メモリアクセスの順序が変わると問題になる場合がある 分岐予測のしくみ ― 制御ハザードによる損失を低減する ループの振る舞い(おさらい) 分岐予測 ― 分岐方向の予測と予測実行 飽和カウンタを使う予測 ― Taken,Not Takenの履歴を使う 履歴を用いる分岐予測 ― ローカル履歴 その他の分岐予測機構 ― グローバル履歴,Gshare,ハイブリッド分岐予測 現代のプロセッサは各種ハザードを解消,軽減して性能を上げている メモリ,I/Oと入出力インタフェース コモンバス ― 伝統的なインタフェース 入出力の制御 パフォーマンスカウンタ ― プロファイラ,プロセッサ内部の実行状況の情報 パフォーマンスカウンタの構造 3.2 プロセッサの利用範囲を広げるアーキテクチャ拡張 マルチプログラミングとメモリ管理機構 メモリのフラグメンテーション ― セグメント方式が抱える問題 ページ方式 ― 現在主流のメモリ管理 多階層のアドレス変換 メモリを効率的に利用したい ― TLBミスの軽減,ページサイズ,ラージページ 割り込み処理機構 ポーリング Column 例外,割り込み,トラップ ― 用語の整理 割り込みのしくみ トラップ ― プロセッサ内部の異常を知らせる ベクタ割り込みと割り込みレベル 仮想化のサポート ― メモリアクセスとメモリ管理機構 VMM,仮想化 VMM,OS,メモリ管理機構 マルチメディア,暗号などのサポート ― 大量データを扱う計算処理 SIMD演算器 ― マルチメディア処理,並列演算 暗号化処理 3.3 x86 Nehalemアーキテクチャのプロセッサ x86の命令体系,Intel 64アーキテクチャについて IA-32e モード ― Compatibility,64ビット x86のレジスタセット x86で扱えるデータタイプ x86プロセッサの命令形式 Core i7プロセッサの構成 命令を取り出して解釈する「フロントエンド」 各種処理を行う「実行エンジン」 Nehalemの「キャッシュ階層」 メモリ管理は4階層のテーブルを使用 4階層ページテーブル ページの使い方を決めるページ属性 新しいプロセッサインタフェースQPI 3.4 まとめ 第4章 仮想化サポート 4.1仮想化の目的,メリット/デメリット 仮想化の基礎知識(おさらい) 仮想化の目的 強固なユーザ間分離を実現する ― 仮想化のメリット[1] 複数サーバをまとめて稼働率を改善する ― 仮想化のメリット[2] VMMの実行オーバヘッド ― 仮想化のデメリット,注意点 大量のメモリが必要 資源の割り当て管理が必要 ― Webホスティングサービスの例 4.2 仮想化を実現するために OSに独立の(仮想)ハードウェアを提供するVMM メモリの仮想化 ゲストOSのハードウェアアクセスをインターセプトする 4.3 仮想化をサポートするハードウェア機構 ハードウェア操作命令の検出 特権違反例外処理 ハードウェア状態の退避,復元 ― 仮想マシンの切り換え 仮想マシン制御情報 二重のアドレス変換,TLB シャドウページテーブル ― x86のハードウェアテーブルウォーク機構 仮想TLB方式 ― もう少し上手なシャドウテーブルの作り方 EPT,NPT ― 二重のアドレス変換を自動化するハードウェア機構 I/Oの仮想化 正統的なI/O仮想化 ― VMMがI/Oをエミュレーション パススルー方式 ― 入出力装置を1つの仮想マシンに割り当てる Para Virtualization(準仮想化)方式 ― ハイレベルI/O要求を使う ライブマイグレーション 4.4 まとめ Column 仮想化の始まり 第5章 マルチプロセッサの出現と普及 5.1 マルチスレッドプロセッサ スレッド,マルチスレッドの氾濫(!?) ― まずは用語のおさらいから マルチスレッドの二つの方式 VMT(垂直マルチスレッド) ― 複数のスレッドを切り替えて実行する SMT(同時マルチスレッド) ― 複数のスレッドの命令を混ぜて実行する VMTのしくみ ― 短時間でスレッドを切り替える VMTに必要なメカニズム SMTのしくみ ― 複数のスレッドの命令を混ぜる Column 実は長い歴史のあるSMT SMTに必要なメカニズム マルチスレッドの効果はいかに? ― Windowsタスクマネージャに見る例 スレッド間の資源競合 ― 性能向上への影響 マルチスレッド化による性能向上効果 ― スループット性能は10~30%程度向上 チップ面積とスループット性能向上のバランス 5.2 マルチプロセッサシステム マルチプロセッサ,マルチコアとは何か? マルチコアプロセッサの構造 Column メニーコアプロセッサの構造 キャッシュコヒーレンシ制御 ― マルチプロセッサのキャッシュ間の整合性 MSIプロトコル MESIプロトコル MOSIプロトコルとMOESIプロトコル マルチソケットシステム インクルージョンキャッシュ ノンインクルージョンキャッシュ キャッシュコヒーレンシとスケーラビリティ Column ソケット? チップ? プロセッサチップ間接続インタコネクトとメモリ ― HyperTransport,QPI Column マルチコア時代の,プロセッサ,CPUの意味するところ マルチプロセッサシステムの性能向上 ― 問題と対策 資源競合 ― 3次キャッシュ,メモリインタフェース キャッシュラインのフォールスシェアリング アムダールの法則とロードインバランス 発熱がクロックを制限 共有メモリシステムと分散メモリシステム メモリ空間とキャッシュ間のコヒーレンシ 分散メモリシステムの使い勝手 共有メモリ,分散メモリのハードウェアコスト クラスタシステム 5.3 まとめ 第6章 プロセッサ周辺技術 6.1 メインメモリ技術 メインメモリの歴史のおさらい ダイナミックメモリ SRAM,DRAM メモリの性能向上 ― 70年で140万倍の容量アップ,5000万倍のスピードアップ DRAMメモリの動作原理 ― 電荷で情報を記憶する DRAM記憶セルへの書き出し DRAM記憶セルからの読み出し リフレッシュ ― DRAM,SRAMの由来 DRAMチップとメモリDIMM DIMMのさまざまな種別 DRAMチップの内部構造 ― セルアレイ,行/列デコーダ,センスアップ,バンク ページ,バースト長 プロセッサとDIMMの接続 メモリとのデータ転送,メモリアクセス メモリシステムのエラー対策 パリティチェック ― メモリのエラーを見つける ECC ― メモリのエラーを訂正する 6.2 入出力装置の接続 プロセッサのI/O接続 PCIバス PCIバスとPCI Express Column PCIバス登場までの道のり PCIバスの制御構造 PCIの階層構造とバス番号,バスブリッジ IntelのCore iシリーズプロセッサのI/O構造 Intel PCHのI/O制御構造 6.3 まとめ Column DRAMのリフレッシュ 第7章 GPGPUと超並列処理 7.1 GPGPUのしくみ 3DグラフィックスとGPU ― 大量の計算が必要 GPU GPUシステム GPUからGPGPUへ 「超並列SIMDプロセッサ」としてのGPGPU AMD HD 5870 GPU NVIDIA Fermi GPU 「超マルチスレッドプロセッサ」としてのGPGPU GPGPUのメモリ階層 (1次)キャッシュ部分 ― GPGPUとキャッシュコヒーレンシ Column ワープ! GPUは高速のGDDR DRAMを使う AMD HD 5870 GPUのメモリ階層 GPGPUプログラミングではデータをどのメモリに置くか明示する GPGPUのマルチスレッドは汎用レジスタを分割使用する CPUとGPGPUの大きな違い 超並列SIMD処理による強力な演算能力 巨大マルチスレッドプロセッサ,同じ命令列の実行 メモリ空間の使い分け 7.2 GPGPUプログラミング GPGPUプログラミングの今 CUDAの実行モデル ― スレッドブロック,グリッド CUDAでの関数の宣言,変数の宣言 OpenCLのプログラミング GPGPUの性能を引き出すには データ転送やプログラム起動のオーバヘッドを減らす ワープ内の全スレッドを有効に動かすことが重要 ― 並列化アルゴリズムを作る 演算あたりのメモリアクセスを減らすタイリング ダブルバッファリング ― データ転送と演算をオーバラップさせる メモリアクセスのバンクコンフリクトを減らす 同期回数を減らす 7.3 まとめ Column Top500とGPUコンピューティング 第8章 今後のプロセッサはどうなっていくのか? 8.1 消費電力がすべてを支配する なぜプロセッサは電力を消費するのか 漏れ電流の増加 デナードスケーリングの頭打ちと,続くムーアの法則による性能向上 省電力技術の発展 DVFS ターボブースト,ターボコア 省電力マイクロアーキテクチャの採用 ― クロックゲート,キャッシュ機構... 現代のさまざまなプロセッサと消費電力対策 8.2 より高性能へ,より多くの機能を 半導体の微細化技術 増加するトランジスタをうまく使うには? 二つのアプローチ ― マルチコア化,周辺機能の取り込み 一部のトランジスタをコストダウンに使う 良品率,不良品率 一部のブロックが不良のチップを有効利用する Intel Xeon 5600シリーズ PS3のCELLプロセッサ,Fermi GPU 8.3 より高信頼で安全なプロセッサ設計 なぜプロセッサは誤動作するのか ― 故障,ノイズ 中性子,アルファ線によるノイズ トランジスタの傷みが引き起こす誤動作 誤動作を防いで安全に動かす 8.4 今後のプロセッサの方向性とは? さまざまなシステムで使われるプロセッサ 家電用プロセッサ 自動車用プロセッサ PC用プロセッサ スマートフォン用プロセッサ サーバ用プロセッサ 8.5 まとめ