科学と非科学の迷宮 このページをアンテナに追加 RSSフィード

2005 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 |

2013/05/03

[]勝ち続ける意志力

勝ち続ける意志力 (小学館101新書)

勝ち続ける意志力 (小学館101新書)


プロゲーマー、梅原大吾の本。

ゲームに限らず、一つの道に真摯に向き合うための心構えについて教えてくれる、素晴らしい本でした。

特に心に残った箇所をまとめてみました。

勝つことに執着している人間は、勝ち続けることができない

(p.14)


100回や200回かつくらいでは、全然足りない

(p.14)


ほとんどの人は、実力がつけばつくほどに自分なりのスタイルというものを確立してしまう。

…さらに危険なのが、自己分析して自分のスタイルを決めるのではなく、他人の評価を鵜呑みにしてしまうことだ。

(p.55-56)


センスや運、一夜漬けで勝利を手にしてきた人間は勝負弱い。

(p.59)


自分の好きなジャンルで安易な道を選ぶことは考えられない。

(p.62)


便利な技を使えばコンスタントに80点は出せるかもしれないが、100点には届かない。

(p.64)


弱点を突いて勝つ戦法は、勝負の質を落とすような気さえする。

その対戦相手は自分を成長させてくれる存在なのに、その相手との対戦をムダにすると感じるのだ。

だから、弱点を突かず、むしろ相手の長所となる部分に挑みたい。

(p.68)


必勝法はないと確信しているからこそ、次から次へと手を替え品を替える。

……とにかく、できることを片っ端から試していくのだ。

隅から隅まで徹底的につぶしていくので、どれが良くてどれがダメなのか、自分の経験として身体が覚えていてくれる。

(p.73-74)


生み出した特許よりも、新しい特許を生み出す力の方が遥かに重要なのだ。

(p.77)


考えることをやめなければ出口は見つかる。

(p.95)


自分を痛めつけていると、努力しているような気になる。しかし、そんな努力からは痛みと傷以外の何も生まれてこない。

(p.185)


自分にとっての適量を考えるなら、

「その努力は10年続けられるものなのか?」

自問自答してみるのがいい。

(p.194)


勝った翌日ほど対戦する

(p.240)

2013/04/17

[]Fabric の run() メソッドと sudo() メソッド


この記事では、Fabricの主要メソッドである run() と sudo() について解説します。

サンプルコードは https://github.com/shiumachi/fabric-sample にあります。


run() と sudo() の基本


読みやすくするため、以後は必要がない限り run() メソッドのみを取り上げます。run() で出来ることはほぼ全て sudo() でも出来ます。断りが無い限り、run() は sudo() と読み替えることができます。


  • from fabric.api import run でインポート可能
  • run([コマンド文字列]) で、任意のコマンド文字列を実行可能
  • sudo([コマンド文字列]) とすれば、任意のコマンド文字列を sudo できる

エラーハンドリング


run() で実行したコマンドが失敗した場合、fab コマンド自体がその場で中断(abort)されます。

もしそのまま処理を続行したい場合は warn_only=True という引数を追加します。


def run_error_warn_only():
    run("hoge", warn_only=True)

warn_only=True だけだと、処理は続行できますがエラー出力はそのまま行われます。

エラー出力も抑制したい場合は quiet=True を追加します。


def run_error_warn_only_with_quiet():
    run("hoge", warn_only=True, quiet=True)

出力内容やリターンコードを使う


run() コマンドの返り値には、出力内容とリターンコードなどの情報が含まれています。

この返り値、公式ドキュメントでさえ使い方がきちんと整理されて書かれていないので、ここにまとめておきます。

res = run() としたとき、


  • print res
    • 実行したコマンドの出力内容を出力する
  • res.return_code
    • リターンコードを返す
  • res.succeeded
    • コマンドが成功していたら True、失敗していたら False を返す
  • res.failed
    • コマンドが失敗していたら True、成功していたら False を返す。succeeded の逆。

となります。


def succeeded_sample():
    res = run("hostname", warn_only=True)
    if res.succeeded is True:
        puts("succeeded!")
        return

sudo() で、リモートサーバ上で別のユーザとしてコマンドを実行


リモートサーバで、現在実行しているユーザとは別のユーザでコマンドを実行したいときがあります。

例えば、Hadoop HDFS の管理コマンドは hdfs ユーザしか扱えません。

そういうときは、user='ユーザ名' を使います。


def sudo_user_sample():
    print sudo("id", user='sho')

ユーザ名は、既に存在する別のユーザがあればそのユーザと置き換えてください。


関連記事

2013/04/15

[]zsh による Fabric コマンドのタブ補完


Fabricは便利ですが、コマンドが多くなると管理が大変になり、いちいちコピペするのが面倒になります。

zsh を使えば、Fabric のタブ補完をすることが可能です。

ここでは、oh-my-zsh を使ったタブ補完の設定方法を紹介します。


oh-my-zsh のインストール


id:mollifier さんがインストール方法についてまとめてくれていますので、こちらを参考にしてインストールしてみてください。

http://mollifier.hatenablog.com/entry/20101009/p1


Fabric 用タブ補完プラグインの導入


残念ながら、Fabric 用タブ補完プラグインは oh-my-zsh のアップストリームにマージされていません。

santiycr 氏が補完プラグインを書いていますのでそれを使ってください。


~/.oh-my-zsh/plugins/fabric というディレクトリを作成し、以下のファイルを置いてください。


https://github.com/santiycr/oh-my-zsh/blob/master/plugins/fabric/fabric.plugin.zsh


やり方が分かる人は、santiycr 氏のリポジトリを fetch して必要なパッチのみを cherry-pick するといいでしょう。

一応こんな感じにすればうまくいくはずです。

細かい説明は省略します。


使い方


fabfile.py のあるディレクトリで fab と入力した後、タブを押すだけです。

コマンドを補完するか、補完対象のコマンド一覧を表示してくれます。

2013/04/14

[]今日からすぐに使えるデプロイ・システム管理ツール Fabric 入門

Fabric は、Python 製のデプロイ・システム管理ツールです。

最近、構築や運用を自動化するための様々なツールが出てきています。

構成管理ツールの Puppet や Chef が有名ですが、使うまでに覚えることが多いのが欠点です。

しかし、Fabric は非常にシンプルなツールで、今からすぐに使うことができます。

Fabric はデプロイ・システム管理ツールで、類似のツールとして Ruby 製の Capistrano があります。


Fabric の最大の特長は、シェルスクリプトを書き慣れた人がいきなり利用できるところです。

シェルスクリプトとしてまとめていたコマンドをそのまま run() メソッドや sudo() メソッドで囲むだけで、使うことができます。

シェルスクリプトを使っていていると、いくつもの問題に遭遇します。


  • 名前空間の管理
  • 変数の扱い
  • 複雑なデータ構造がない(せいぜい配列ぐらい)
  • 例外処理

これらの問題に頭を悩ませたことがある人は多いでしょう。

Fabric は Python で記述しますので、上記の問題は全て解決します。

「Fabric = シェルスクリプト + Python + 便利メソッド」

というイメージです。


SIerに勤めていてSE等をされている方は、運用チームのための運用手順書を書いたことがある人も多いでしょう。

その運用手順書の多くは、何らかのコマンドラインを実行する、という記述が書かれているはずです。

Fabric を使えば、その運用手順書を「ほぼそのまま」Fabric のスクリプトに移行できます。


Fabric のインストール


$ easy_install fabric


たったこれだけです。「easy_install って何?」という人は ymotongpoo先生の素晴らしい記事 を参考にしてください。約5分で読み終わり、さらに約5分で easy_install を使えるようになるでしょう。


試してみる(1): yum コマンドを Fabric から実行


例えば、yum コマンドで git をインストールする、という作業があったとします。

シェルを使えば以下のように書けるでしょう。


$ sudo yum -y install git


おそらく、普通の運用手順書では、「サーバAにログインし、以下のコマンドを実行する」という形で書いてあるはずです。

Fabric を使えば、そのような手順書は不要になります。


まず、リモートマシンを1台用意してください。

VM でも構いませんが、Amazon EC2 を使う方が便利です。EC2 を使ったことがないという方は、この記事の末尾で使い方などが記載されている資料のリンクを紹介します。

ここでは、以下のようなサーバ設定を例にとります。

ec2-user は Amazon Linux のデフォルト管理者ユーザで、sudo 権限を持っています。

EC2 上で RHEL を使う場合は ec2-user ではなく root を使ってください。


  • サーバ名: ec2-XXX.ap-northeast-1.compute.amazonaws.com
  • ユーザ名: ec2-user
  • SSH秘密鍵のパス: ~/.ssh/id_rsa

Fabric を使う場合、まず適当なディレクトリを作成し、fabfile.py というファイルを作成してください。

次に、以下の内容を書き込みます。


from fabric.api import sudo

def install_git():
  sudo("yum -y install git")

「え?」と思ったでしょうが、本当にこれでおしまいです。

あとは、fabfile.py の置いてあるディレクトリで、以下のコマンドを実行します。


$ fab -u [ユーザ名] -i [sshの公開鍵] -H [ホスト名] install_git


先程のサーバ例の場合は、以下のようになります。


$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git


たったこれだけで、リモートサーバで yum install git を実行することができます。

非常に簡単です!


今回紹介したサンプルスクリプトは、github に公開しています。

こちらも参考にしてみてください。

https://github.com/shiumachi/fabric-sample


試してみる(2): Fabric の価値を体感する


「ただ置き換えるだけならシェルスクリプトのままでいいじゃん」

と思う人のために、Fabric の強力な機能のうちのいくつかをを紹介します。


複数ホストに対して同時に実行

'-H' でホスト名を指定する際にカンマ区切りで複数のサーバを指定することができます。

例えば先程の例で、serverA と serverB に対し同時に install_git を実行したい場合は、以下のように書きます。

$ fab -u ec2-user -i ~/.ssh/id_rsa -H serverA,serverB install_git


複数コマンドを順番に実行

例えば、ユーザ 'hoge' を作成するコマンドを作りたいとします。

シェルスクリプトで書く場合は以下のようになります。

# adduser hoge

これを Fabric で書くと、以下のようになります。

def adduser_hoge():
  sudo("adduser hoge")

シェルスクリプトの場合、先程の git のインストールコマンドと一緒に管理するには、別々のファイルとして保存するか、一緒のファイルにしてしまってバッチ実行するしかありませんでした。

Fabric の場合は、作成したメソッド全てを独立したコマンドとして扱えます。

fabric.py のあるディレクトリで、以下のコマンドを入力してみてください。

$ fab --list

そうすると、現在実行可能なコマンドの一覧が表示されます。

Available commands:

adduser_hoge

install_git

Fabric の面白いところは、一回のコマンドでこれらを任意の順番で実行できるところです。

以下の例のように、スペースを空けて一つづつコマンドを記述していくことで、Fabric はそのコマンドを左から順番に実行していきます。

$ fab -u ec2-user -i ~/.ssh/id_rsa -H ec2-XXX.ap-northeast-1.compute.amazonaws.com install_git adduser_hoge

たったこれだけのコマンドで、「git をインストールする」「ユーザ hoge を作成する」の2つの作業を実行できるのです!


次のステップ


もしこの記事を読んで、「よし、ちょっと Fabric を試してみよう」と思った方に、次にステップのための記事を紹介します。


drillbits 氏の紹介スライド

https://speakerdeck.com/drillbits/fabric-python-developers-festa-2013-dot-03-number-pyfes

Fabric の基本的な使い方についてまとめています。Fabric 入門者は必読です。


Python製デプロイツール Fabricを初めて使う際に役立つTips

http://dekokun.github.io/posts/2013-04-07.html

dekokun 氏による Tips 集です。

最初に読んでもいいですが、ある程度使ってから「こういう書き方したいんだけど、どうすればいいんだろう?」と思ったときに開いてみるのもオススメです。


Fabric デプロイツールのPythonicな書き方

http://www.ianlewis.org/jp/fabric-pythonic

やや古い記事ですが、ianlewis 氏による Fabric の書き方入門。

with cd() の書き方は Fabric での典型的なイディオムなのでオススメです。


公式ドキュメント

最後に、公式ドキュメントを紹介します。

http://docs.fabfile.org/en/1.6/

英語ですが、API のリファレンスとしては必須です。以下の3つのモジュールの API リファレンスは何度も読むことになるでしょう。

  • Operations
    • run, sudo, get, put などの基本メソッドのドキュメントがあります。
  • Utils
    • error, warn などのロギング周りのメソッドについて書かれています。
  • Files and Directory Management
    • append(ファイルに追記)、comment(ファイルの特定の項目をコメントアウト)などのファイル操作周りの便利APIがあります。



付録: Amazon EC2 の使い方

EC2 を使ったことのない人のために、いくつかドキュメントを紹介します。

これらを読めば、EC2 上でインスタンスを立ち上げることができると思います。



これらを読んでもどうしても分からない人はAWSの有償サポートを買ってください

多分人件費分は元が取れると思います。


更新履歴

2013/04/14 17:33 指摘に従い、タイトル及び冒頭の説明を修正

2013/03/18

[]8つの質問で、Hadoop業界の現状を知る


Webサービス系の隆盛があったのかどうかはよく知らないが、Hadoopのリリースが騒がれたのが7年前ぐらいだろうか。Hadoop業界の人材動向が、今どうなってるかって?

大方の予想より凄惨ですよ。

それが分かる方法がある。Hadoop技術者に技術力を問う8つの質問によってだ。Hadoop業界のエンジニアの平均レベルを知りたくって、いろんな会社さんのHadoop開発者(経験者)向けに以下のような8つの質問をしてみたいと思ってるけど、やったことはない。 対象者としては、Hadoop経験3から4年の現役バリバリのはずのHadoopエンジニアだ。

その8つの質問というのはこんな問題だ。

Hadoop技術者に技術力を問う8の質問

  1. 投機的実行のメリットを一言で表して下さい。(筆記解答)
  2. ネームノードのRPCアドレスを取得するコマンドは何ですか?(筆記解答)
  3. 標準jarファイルでベンチマークを取る方法を説明してください。(筆記解答)
  4. 複数の出力を生成するためのクラスはどれですか?(選択解答。複数回答可)
    1. MultipleOutputs
    2. MultipleOutputFormat
    3. MultiOutputFormat
    4. MOutputs
  5. MapReduceを書いているのに、思ったほど実行時間が短くなってくれません。CPUコア数は足りているようです。原因として何が考えられますか?(筆記解答)
  6. MapReduceでMap処理だけを使用するのはNGですか?そうであればその理由を説明してください。(筆記解答)
  7. Yarnでノード一覧を取得するためのコマンドは何ですか?(筆記解答)
  8. APIでカウンタをカウンター名の指定により取得するメソッドは何ですか?(筆記解答)

過去に実施した平均点

この8問について、僕が出会ったエンジニアに解答してもらった平均正解数は、なんと8点満点中8点(予想)である。





この辺まで書いて力尽きた。


偉大なる元ネタ

8つの質問で、Java SI業界の現状を知る - 山本大@クロノスの日記

8つの質問で、Go業界の現状を知る - YAMAGUCHI::weblog


おまけ

Go Conference 2013 springというイベントが開催されます。凄惨なGo業界の現状を打破したいそうなので手伝いましょう。直前でキャンセルが出るはずなので、とりあえず並んでみて下さい。

Go Conference 2013 spring - connpass


Disclaimer

煽ったのは id:ymotongpoo です。私は乗せられて書いただけです。