読書の記録も書くことにしました

実は今まで読書の感想などを書くときは別のアカウントを使っていたのですが、できるだけ情報は一箇所に集めたいので、これから技術的な内容以外もこのブログに書いていくことにしました。ちなみに本のリンクはアソシエイトです。

さっそく先月の読書のまとめです。読む本はブログや書籍内で案内されていたものから選ぶことが多いです。以下、読んだ本です。

  • レバレッジ・リーディング
  • 自分の小さな「箱」から脱出する方法
  • ブッダ 大人になる道
  • 持たない暮らし
  • 一冊の手帳で夢は必ずかなう
  • 人を動かす
  • 2ちゃんねるで学ぶ著作権
  • 無理なく続けられる 年収10倍アップ勉強法
  • 浮世の画家
  • オプティミストはなぜ成功するのか
  • 知的複眼思考法
  • 私はどうして販売外交に成功したのか
  • iCon

先月はレバレッジ・リーディングに影響されて我流ですが速読をこころがけました。ですので、一部流し読みした箇所などがあると思います。「一日一冊!」と意気込んでいたのですが、10日ほどで挫折して結局読み終えたのは13冊。200ページくらいの平易な文章のビジネス書だと一ヶ月10冊は可能かな、という感想です。

先にあげた本のなかで、自分の中で繋がったのが以下の本。

  • 私はどうして販売外交に成功したのか
  • 自分の小さな「箱」から脱出する方法
  • 人を動かす

私はどうして販売外交に成功したか
自分の小さな「箱」から脱出する方法
人を動かす 新装版
私はどうして販売外交に成功したか」(フランク・ベドガー)は保険のセールスマンの営業術の本です。営業についての本というと何やら泥臭くてつまらなそうな印象を持ちますが、すべての職種のビジネスマンにとって共通する技術、またビジネスのみならず人間として向上するための技術といったものが書かれていると思います。この著者はもともと野球の選手で、引退後に保険営業に転職し、まったく右も左も分からない状態からアメリカNo.1のセールスマンとして成功を収めています。「もともと営業向きの性格で才能があったんでしょ」と思ってしまいますが、初期のエピソードを読むと「人前で理路整然と話せない」とか「アポイントメントをとれない」「スピーチするとあがってしまい支離滅裂になる」「勧誘電話がいやでいやで仕方がない」といったような、逆に営業に不向きな性格が伺えます。実際、契約をほとんどとれずに失意のどん底にあった時期があったようです。そのような時期から、著者がいかに自分を動機付け、自分を管理し、人間について洞察し、弱点を克服していったかというエピソードは今でも十分通用する内容だと思いますし、勇気付けられます。本のなかではリンカーンベンジャミン・フランクリンのエピソードがよく出てきます。リンカーンについてはカーネギーの「人を動かす」にもたくさんありましたし、GIGAZINEでも取り上げられていました(打ち負かされる事自体は、何も恥じるべき事ではない)ので、結構有名な話らしいですね。今度伝記でも読んでみます。また、フランクリンについてはこんなことが書いてありました。

彼は、自分自身は普通の能力しか持ち合わせていない単純な人間であると考えていたが、しかし、もし正しい方法さえ発見することができれば、必ずや世に成功するうえに必要な基本原理をつかむことができると信じていた。

おそらくこの考え方が共通して著者の根底にあると思います。最後のほうにはまとめとして、著者が自らを向上させるための項目として13項目挙げています。元ネタはベンジャミン・フランクリンらしいのですが、著者の13項目は私にとって結構しっくりきたので、仕事のなかのひとつの指針として頭の片隅に置いておこうと思いました。

  1. 情熱
  2. 秩序 自分自身の行動を組織的にすること
  3. 他人の利害関係を考える
  4. 質問
  5. 中心問題
  6. 沈黙(相手の話をよく聞くこと)
  7. 誠実(信用を得るに値することをする)
  8. 自分の事業に関する知識
  9. 正しい知識と感謝
  10. 微笑(幸福感)
  11. 人の名前と顔を記憶すること
  12. サービスと将来の見込みに対する予想
  13. 販売を取り決める(購買行動を起こさせる)

仕事のなかで大きなウエイトを占めるのが人間関係だと思います。このファクターによって、仕事の効率性が左右されます。人間関係のトラブルについて自分を見つめ直すことができるという点で「自分の小さな「箱」から脱出する方法」は目から鱗でした。また、読後にいい小説を読んだ後のような深い感動を与えてくれます。自分の感情に背くと自己正当化(本書で「箱の中」と表現されている)に嵌まり込み不当に他人を貶め自分を過大評価してしまい、挙句の果てに他者にも自己正当化が感染してしまう…、というのが本の要約です。

自分の感情に背いていると、自分を正当化するような見方で自分自身をみるようになる。そしてそのイメージを、状況が変わっても持ち続ける。だから状況が変わっても、相変わらず箱の中に入っているわけ。人を人としてまっすぐに見られず、自分で作り出した自己正当化イメージを通してしか見られなくなっているの。

箱というものを知らなくても、ふとしたことで敵視していた人を再評価することがあります。そういう瞬間を以下のように説明しています。

目の前にいる人々が常に持っている基本的な「他者性」、つまり相手は自分とは違う一個の独立した人間であるという事実と、目の前にいるのとは別の人たちとともに箱の外に出ているあいだに学んだことが相まって、相手の人間性が、わたしたちの箱を突然突き通す瞬間があるんだ。
その瞬間に、自分が何をすべきかがわかり、相手を人間として尊重しなくてはならないということがわかる。
相手を、自分と同様きちんと尊重されるべきニーズや希望や心配ごとを持った一人の人間として見はじめたその瞬間に、箱の外にでるんだ。

この本は上の項目で言うと、「他人の利害関係を考える」「誠実」に該当すると思います。

人間関係つながりで言うと、「人を動かす」(D・カーネギー)も勉強になります。この本は人間はみんな自尊心を持っているということを原則においています。その上で、相手にどんな些細な不快感も与えないことを人と接する上で重視しています。書かれていることは言われてみるとごく当然のことが多いのですが、普段ごく当然のことがいかにできていないかを思い知らされます。目次を読んだ段階では「議論をさける」「誤りを指摘しない」といういかにも日和見的だなあと思うような項目もあります。しかし、著者は相手の言いなりになるということは述べておらず、あくまで相手の自尊心を傷つけないことを第一にしていることに注意する必要があると思います。相手の自尊心を傷つけると、「自分の小さな『箱』から脱出する方法」でいう「箱」に相手は入ってしまうので、ますます説得するのが難しくなります。そう考えると、相手を真っ向から否定するよりは言い方を変えて相手を納得させるということが自分にとっても相手にとっても有益だということを述べています。いかに自分を殺すか、自分を正当化することの欲望から距離を置くか…、なかなか難しいことだと思います。
この本は人間関係全般を扱っていますので、先の13項目の「他人の利害関係を考える」「質問」「沈黙」「誠実」「微笑」「人の名前と顔を記憶すること」に関連します。

基本的にすべてビジネス書ですので、読んだあとはモチベーションをあげることができると思います。

perlsh

最近Rubyスクリプトを書くことが多くなっている理由を考えたところ、新しい言語のせいか文法的にしっくりくることもあって頭に入りやすいというのもあるんですが、irb(railsではruby script/console)を使って対話的にメソッドの挙動を確かめられるのが効率的なのかなあと思ってます。いちいちエディタでスクリプトを作って実行するなんてめんどくさいですし。
Perlでも似たようなツールがないかな、と探してみたらTerm-ReadLine-Gnuというのがありました。

http://search.cpan.org/~hayashi/Term-ReadLine-Gnu/
http://d.hatena.ne.jp/secondlife/20060111/1136975310

これは便利です。Perlを勉強し直す意欲が俄然沸いてきました。

PerlとRubyを混同してきた…

備忘メモ。
perlshであやふやなところをごちゃごちゃごちゃ。


main[100]$ @array = (1, 2, {"a" => "3", "b" => "4"}, [5, 6, 7])
1
2
HASH(0x78ae70)
ARRAY(0x78b530)
main[101]$ $array[2]{a}
3
4
main[103]$ $array[3][0]
5
main[104]$ $array[3][1]
6

以下妄想メモ

  • perlだとrubyの配列やハッシュの記法はリファレンス扱い
  • というかそもそもオブジェクト自体がリファレンス?
  • perlだと配列、ハッシュの要素にアクセスするためには、[ ]か{ }を使う(rubyでは[ ]のみ)
  • そのときの識別子は$
  • perlだと識別子が@や%に代入するときは( )でくくったものを代入する
  • 識別子が$のスカラ変数に代入するときは、[ ]や{ }(無名配列のリファレンスや無名ハッシュのリファレンス)を使う
  • というか識別子@や%を使うのは特殊だと考えるのが理解しやすいかも

WebServiceX.net

翻訳APIを提供しているWebサービスを探していたら、「WebServiceX.net」というサービスに行き当たりました。Rubyでちょっとだけ試してみました。

http://www.webservicex.net/WS/WSDetails.aspx?WSID=63


irb(main):001:0> require 'soap/wsdlDriver'
=> true

irb(main):002:0> wsdl = 'http://www.webservicex.net/TranslateService.asmx?WSDL'
=> "http://www.webservicex.net/TranslateService.asmx?WSDL"

irb(main):003:0> serv = SOAP::WSDLDriverFactory.new(wsdl).create_rpc_driver
ignored element: {http://schemas.xmlsoap.org/wsdl/http/}binding
ignored element: {http://schemas.xmlsoap.org/wsdl/http/}operation
ignored element: {http://schemas.xmlsoap.org/wsdl/http/}urlEncoded
ignored element: {http://schemas.xmlsoap.org/wsdl/mime/}mimeXml
ignored element: {http://schemas.xmlsoap.org/wsdl/mime/}content
ignored element: {http://schemas.xmlsoap.org/wsdl/http/}address
=> #http://www.webservicex.net/translatese>

irb(main):004:0> serv.generate_explicit_type = true
=> true

irb(main):005:0> hash = {:LanguageMode => "EnglishTOJapanese", :Text => "good morning"}
=> {:Text=>"good morning", :LanguageMode=>"EnglishTOJapanese"}

irb(main):006:0>serv.Translate(hash)
=> #

あれ?再度試してみると、今度は違うエラーが。

irb(main):007:0> serv.Translate(hash)
=> #
何か間違えたかなと思い、このAPIを使っていそうなサイトを利用してみましたが、同じようなエラーが表示されていたので、向こうのサービスの問題のようです。
しばらくしてもう一度試してみたところ、

irb(main):008:0> serv.Translate(hash)
=> #
翻訳できました。このエラー頻度ですと、実用は難しそうです…

64bitマシンでyum

CentOS5のx86_64を64bitマシンにインストールしたらi386のパッケージもインストールされてしまいました。


[root@test ~]# for f in `rpm -qa`; do rpm -q --queryformat '%{name} %{arch}\n' $f; done|grep i386
zlib i386
popt i386
zlib i386
libSM i386
ncurses i386
libsepol i386
libstdc++ i386
expat i386
libattr i386
cyrus-sasl-lib i386
libgcrypt i386

必要かわかりませんでしたが、とりあえず


[root@test ~]# yum erase *.i386

で消去しました。

ググって見るとこんな記事がありました。
yum.confに以下の設定をすると、x86_64以外のパッケージがインストールされなくなります。


exclude=*.i386 *.i586 *.i686

コマンドをうつ場合は、x86_64であることを指定します。


[root@test ~]# yum update *.x86_64

optimistic lockとpessimistic lock

railsでselectの結果によって更新するデータを変更する条件分岐を書いていて、selectしてデータを更新するまでの間に他のプロセスによってデータが更新される可能性があることに気づきます。

たとえば以下のようなプログラムだと、


1 user = User.find(1)
2
3 if user.status == 1
4 user.update_attributes(:status => 2)
5 elsif user.status == 3
6 user.update_attributes(:status => 4)
7 end
8
9 unless user.valid?
10 ...

1行目でfindしてから4行目もしくは6行目に至るまでの間に、対象のデータが更新されていることに気づかずにデータを更新してしまいます。

データベース初心者なり対策を調べてみました。

1.update_allを使う


1 user = User.find(1)
2
3 if user.status == 1
4 result = User.update_all("status = 2", "id = 1 AND status = 1")
5 elsif user.status == 3
6 result = User.update_all("status = 4", "id = 1 AND status = 1")
7 end
8
9 if result == 1
10 ...

条件を絞り込んでデータを更新します。インスタンスを作っているのに、クラスメソッドでデータを更新してかっこ悪いような気がします。

2.pessimistic lockを使う
データベースが実装しているロックを使って、selectしてからupdateするまでの間に他のプロセスにデータを更新させない方法です。悲観的なロックというらしいです。
ActiveRecordに標準で実装されています。


1 User.transaction do
2 user = User.find(1, :lock => true)
3
4 if user.status == 1
5 user.update_attributes(:status => 2)
6 elsif user.status == 3
7 user.update_attributes(:status => 4)
8 end
9
10 end
11 ...

ロック中に他のプロセスがデータを更新しようとした場合、ロックが解除されるまでそのまま待たされることになるようです。気がかりなのはロックしたプロセスがロックしたまま死んでしまったときです。ロックを解除しない限りデータの更新ができなくなるのが怖いです。

3.optimistic lockを使う
アプリケーション(rails)が用意しているロック機構を使うロックです。selectからupdaetの間のデータ更新は早いもの勝ちですが、updateのときにデータが更新されていたらエラー(StaleObjectError例外)になります。これを使うと、少なくともロックしたプロセスに不具合が起きて長時間データが更新できなくなるというトラブルはなさそうです。カラムにlock_versionを追加するだけで機能するようです。
使用する際の注意としては以下の点があると思います。

  • findで:selectオプションを使っている場合は、idとlock_versionを含めないと機能しない。
  • オブジェクトのアトリビュート(テーブルのカラム)がひとつでも変更されればlock_versionがインクリメントされるので、複数のアトリビューションをもつ場合には意図しないときにStaleObjectError例外が発生してしまうかもしれない。

Per-VE I/O priority support

昨日リリースのstableカーネルで、待ち望んでいた機能が実装されたようです。
http://openvz.org/news/updates/devel-kernel-2.6.18-028stab021.1


VPSを運用していく上でネックだったのが、特定のVEで巨大なファイルの書き込みを発生させた場合、そのプロセスが割り込み禁止(D)になって、他のVEのプロセスの実行に影響がでてしまうという問題でした。VserverにはI/Oスケジューラ(重み付け)の機能が実装されていて試してみたことがあったのですが、期待した効果は得られなかったように記憶しています(検証方法がまずかったのかもしれませんが…)。まだどのような機能かわかりませんが、この辺この辺を読みながらさっそく試してみようと思います。