久々に Emacs のお話。多分、Emacsだけの仕様だとおもうんだけど、ファイルを開くときに「Local Variables:」と書かれた行から「End:」と書かれた行までの間に、そのファイルを編集するのに適切なメジャーモード (mode) や 文字コードセット (coding)の設定ができる。ちなみにそのときには、Perlのスクリプトを UTF-8 で書いており、そのファイルを開くときの文字コードセットを utf-8 にするため、以下のように書いてみた。
Local Variables: coding: utf-8-unix End:
これでうまくいくかなぁなんて思っていたんだけど、結果としてはダメ。なぜか coding の部分だけは mode の設定のときと Parse のしかたが違う。以下に lisp/international/mule.el の中にある coding: を Parse する部分のソースを抜粋してみた。
;; If no coding: tag in the head, check the tail.
(when (and tail-found (not coding-system))
(goto-char tail-start)
(search-forward "\n\^L" nil t)
(if (re-search-forward
"^\\(.*\\)[ \t]*Local Variables:[ \t]*\\(.*\\)$" tail-end t)
.... 以下 略 ....
引用が中途半端なのはお許しいただきたい。この部分を解釈すると、カーソルを後ろのほう (tail-start) に移動させて、^L (0x0c)だけの行を前方検索してそこにカーソル移動させて、Local Variablesの部分を検索するようになっている。そう、原因は "^L" が足りなかっただけだった。なんか仕様がバラバラっていう感じでアレですね。(笑)
自分の作ったプログラムのチューニングをして時間当たりに処理できる数がxx% 多くなって喜んでみたり。 そのプログラムを使う案件の売り上げ試算とかいうのがやってきて、それの数字を見て「もうこの案件にかかわるのやめようよ」ってリーダーに言われてショゲってみたり。 で、あとでその試算の計算方法が全然試算になっていないことに気づいたりして、こんどはムカっとしてみたり。 「なんでオレが数字にケチつける役なんだよぉ」って思って「自分とほかの人の仕事の役割分担ってなんだっけ」って悩んでみたり、その後のプロジェクトの進行がどうなるのか心配になってみたり。 今回のプロジェクトで一番つらい時期なのかもなぁ。 これ越えたらいいことあるといいなぁ。
でも辛すぎ。 まぢで泣きたい。
ミラクルリナックスの吉岡さんのBlog より。 引用されているグラフの、脆弱性が発生している対象として、かたや Linux カーネルだけなのに、Windows 2003 Server だと 2003 Server すべての内容物になるんですよね。 となると比較する範囲が違っていて、説明するための資料としては妥当ではなさそうだ。 Windows のカーネルと呼んでいる部分と、Linuxのカーネルでは、APIのレイヤーでのカバーしている領域も違うので、一概に比較してもいけないでしょうし。 脆弱性なんてリリース後に発見されました、という場合のことをいっているので、脆弱性の数が少ない原因として考えられるのが、そもそも脆弱な部分が少なかったり発見されやすいものはすでに発見されている、または、そもそも見ている人が少ない、とかあるわけで。 今回の吉岡さん文章だと、脆弱な部分がそもそも少ない理由として、すでに発見されやすい体系だから、と言いたいのでしょうね。
定量的に品質を比較するの難しいですね。
昨日発見したOpenIDの実装を見ていたところ、OpenIDで認証したあとには @session[:user_id] に認証した順番が数字(番号)として保存されており、その user_id から MySQL の users テーブルにuser_id に対する OpenID のURLが保存されていて、OpenID の URL を知りたいときには毎回 MySQLサーバに問い合わせる形になる。 んで、@sessionで出てくるセッションってなんぞやとか思って、また Rails のなかをひっくり返してみていたと。 セッションは Rubyの cgi ライブラリに装備されている CGI::Session をつかっており、ブラウザごとにユニークなIDを振って、そのIDごとに key=value なデータができるようになっている。 ブラウザへのユニークなIDの保存の部分までコードを追いきれなかったので推測になりますが、たぶんCookie使っているのでしょう。 セッションの中身 (key=value の部分) については、ローカルのファイルシステムに保存するようになっていた。 つまり、Webサーバを複数台置いて負荷分散するときには、あるWebサーバが受けたリクエストのときに設定したセッションに対する値が、別のWebサーバがリクエスト受けたときには、なんらかの共有などを行わない限り参照できない。 セッションの中身を共有するには、ディスク共有とかわけわからんことせなアカンと。 共有なディスクなんか置いてしまった日には、大量のユーザが利用したときややページビューを受けたときにはそこがボトルネックになってしまうことがあるので、何らかの形でデータの分散保存ができなければならないのです。 分散保存できるシステムって、がんばればできるのですが、そんなに頑張りたくないのが本音。
方向性としては、OpenIDで認証受けた内容を、WebブラウザのCookieに焼いちゃえばいいのでは、と。 んでクッキー焼くときに署名的なものを入れてデータの改竄を検出できるようにしておくと。 そうすれば認証したユーザ名を入れても安心だろうなぁ。
ただ今回は、この認証部分とか、これのスケーラビリティーの話をつめたいわけじゃないので、この課題は気が向いたら対応します。
で、コミュニケーションの状態が良好でないパターンを見て、その原因について考えてみた。 考えられることとしては、このような点だ。
ほかにもいろいろありそうだが。 類は友を呼ぶ、なんていうので、いいチーム作るには、類友を上手に使うっていうのも必要かも。 類友がよいパフォーマンス出すかどうかは、また別の問題だろう。
たとえば、チームのパフォーマンスを上げようと、優秀なスタッフやマネージャーを連れてきたとしても、スタッフやマネージャの優秀さとチームの優秀さに大きな隔たりがある場合、コミュニケーションの不調によりそのままチームの平均点上昇ってことには、すぐにはならないだろう。 逆に経験すくないスタッフを優秀なチームに放り込むと、その人次第ではグングン成長するかもしれないが。
なんだか脈略ないまとめになったが、あまりかけ離れた人材を入れるといろいろ難しいよ、ってことで。
リーダーシップの心理学 (講談社現代新書 (725))(国分 康孝) を完読。
心理学の本を初めて読んだのですが、心理学っておもしろいですね。 人間の感情相手に、前提たてて調査して統計して結果を導いた、みたいなことがいっぱいあって。 なんだかわかったのが、リーダーシップ発揮するには、人間としてきちんとできていないとだめ、ってことなんだろう。
父的親心・母的親心が多い方がよかったり、気が小さいより大きい方がよかったり、危機的な場合など、時と場合によってはワンマンに進めた方がよかったり、と。
リーダーシップについて知ろうと思ったのだが、いろいろと人間の性格について理解することができた。 不思議な言動する人の原因とかがわかったり。
リモートのマシンから家のネットワークにVPN接続したくなったので、PPTPを使った VPN 接続環境を作った。
今回、PPTPサーバは Ubuntu 8.04 をホスト (Hypervisor) とした Xen の VM なのだが、特に普通の Ubuntu と変わりなく構築できた。
まずは pptpd のインストール。
sudo apt-get install pptpd
インストール後に各種ファイルを設定。 まずは /etc/pptpd.conf で、割り当てる IPv4 アドレスを設定する。ほかはデフォルトのまま。
# PPTP サーバの eth0 に当たっている IP アドレス localip 192.168.3.16 # PPTP クライアント(接続してくる側)に割り当てる IPアドレスの範囲 # (192.168.3.192 - 192.168.3.207) remoteip 192.168.3.192-207
次に /etc/ppp/pptpd
name pptpd # domain mydomain.net refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 proxyarp nodefaultroute # Debug 必要な場合は debug オプションを #debug lock nobsdcomp
あとは /etc/ppp/chap_secrets を。
# client server secret IP addresses username * password *
設定ファイルは以上で終わり。 あと、PPTPサーバ側で IPv4 パケットの forward ができるように /etc/sysctl.conf の編集を行う。
net.ipv4.ip_forward=1 net.ipv6.ip_forward=1
PPTPサーバが、いわゆるブロードバンドルータなどの内側のセグメントにある場合、ポートマッピングを行わなければならない。 PPTPの場合、GRE (47:General Routing Encapsulation) を使うみたいなので、面倒だったので PPTP サーバを DMZ ホストとして設定してしまった。 PPTPサーバで netstat -a -p |grep pptp なんてすると、こんなかんじ。
tcp 0 0 *:1723 *:* LISTEN 13886/pptpd tcp 0 0 this-host:1723 client:49858 ESTABLISHED 14236/pptpd [114.48 raw 0 0 this-host:gre client:* 1 14236/pptpd [114.48 unix 2 [ ] DGRAM 36651 14236/pptpd [114.48 unix 2 [ ] DGRAM 34814 13886/pptpd
1723/tcp のポートマッピングは簡単だが、GRE側の面倒だったので、DMZ ホスト機能を使ってしまった。
ウチのルータはNECアクセステクニカ製の A-Term なのだが、GRE の設定もできる。 ポートマッピングルールの「【NATエントリ追加】」で、LAN側ホストを PPTP サーバの IPv4 アドレス、プロトコルに「その他」プロトコル番号に47と入力すると、GREのエントリが追加できる。あとはPPTPの接続を受ける 1723/TCP を追加する。 ポートマッピング設定の結果は、キャプチャに載っている設定内容をご参考にどうぞ。 この場合は PPTP サーバが 192.168.3.16 で動いております。
あとは Windows 側の設定だが、今回使った Windows Vista Business ではサクっとできた。 スタートメニューの接続先から新しい接続を選んで、VPNを選んで、リモートのホスト名と設定したアカウントなどを設定するのみ。 注意しなければならないのが、VPN接続時の経路設定。 接続先のVPN接続エントリのプロパティを表示して、[ネットワーク]タブの「インターネットプロトコル バージョン4 (IPv4)」を選んで、プロパティをクリックし、上記プロパティのウィンドウの「詳細設定」をクリックし、[IP設定] タブの「リモートネットワークでデフォルトゲートウェイを使う」のチェックを外す必要がある。 (んー手順長い) これをやらないと、VPN の先のデフォルトルートを採用しようとして、VPN接続先以外のインターネットにつながらなくなってしまうのだ。
これで、出先から emobile 使って家のファイルサーバにアクセスできたりする。 なんだか嬉しいw
いつも通りプールで平泳ぎ500m。 ウチのスポーツクラブはプールが8レーンあるのがよいところなのだが、レッスンプログラムで2レーン使っている上に、最近になってから「ファミリー用」とか書かれた1レーンが確保されており、あとは歩行用に1レーン使っているので、普通に泳ぐためのレーンが3つだけになっていた。 以前は1レーンあたり2人ぐらいが泳いでいたのだが、最近は3人〜4人ぐらいになって混雑。 だんだん会員増えたりしていて使いづらくなってきたので、退会しておいてよかった。 今月いっぱいで退会だし。
プールに行くときに、ちょうどゴルフスクール終わった人たちがランチを食べに行こうとしていたのだが、まぁ退会するわけなのであんまり参加する気にならず。 プールの後に仕事したかったので、食事は断ってさっさと泳いで帰りました。
・ knaka [マイクロソフトが比較を喧伝する際には、Windowsの内容物 vs Linuxディストリビューション全体で比較するの..]
・ まさる [そっか、MSも同じようなことやっているんです。 まぁ厳密に平等な比較は難しいってことで。]