yaotti's diary

Software is Eating the World

最近読んでいる本

GC本

ガベージコレクションのアルゴリズムと実装

ガベージコレクションのアルゴリズムと実装


GCのアルゴリズムといくつかの処理系でのGC実装について書かれた本.
まだアルゴリズムの部分をだいたい読み終わったぐらいだけど,図を多用してわかりやすく説明されているため理解しやすい.後半の実装の章が楽しみ.

TCP/IP

マスタリングTCP/IP 入門編 第4版

マスタリングTCP/IP 入門編 第4版


TCP/IPについての知識が不足しているように感じたので図書館で借りて読み進めているところ.
OSI参照モデルをしっかりと意識できるようになり,"イーサネット""PPPoE""ルーティング"のような,自分の中であやふやだった単語の意味を理解できたので良かった.

37 signals

小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)

小さなチーム、大きな仕事―37シグナルズ成功の法則 (ハヤカワ新書juice)


表題のような小さな組織で働いている人に限定せず,「(特に小規模な組織において)個人がどう考え,行動すべきか」が書かれている.
多くの小さい章で構成されており,言いたいことが明確なので気持ち良く読めた.
チームといっても会社に限らず,例えば「友達と一緒に何かを作る」なんていう場合でも参考になると思う.

NAISTのオープンキャンパスへ行った

昨日は大学院の説明会もあったのだけれど,気になっていたNAISTのオープンキャンパスへ行った.
NAIST 奈良先端科学技術大学院大学 - 受験生のためのオープンキャンパス

研究する環境としてはたぶん素晴しいのだろうなと思ったのだけれど,今の研究室で行われているような分野の研究室が無かったということもあって,受けるかどうか決めるにはまだ時間がかかりそう*1
分散コンピューティングに興味があるので,ソフトウェア基礎学は結構気になるけれど自分にとってあえてNAISTという外部の院に行く価値があるのか,考え切れていない…


「ある研究室がその分野で(世界|日本)においてどういうポジションにいるのか」ってどう知ればいいんだろうか.その分野の研究者に聞くのが良いのかな.

*1:受けるとしたら来年3月にある秋学期入学第一回分

はてダラ+simple-hatena-modeで複数ブログ投稿&Twitter通知する

hw.plとsimple-hatena-mode.elに以下のパッチを当てれば複数ブログ(ACCOUNT+NAMEというidとして作る)とTwitter通知ができます.Twitter通知のprefixは設定しなければ毎回聞いてきます.ディレクトリ構造とかは適宜読み替えて当ててください.

あとsimple-hatena-modeで編集するファイルがUTF-8じゃない場合はhw.plのUTF-8決め打ちの部分を変えてみてください(twitter通知のprefixがeuc-jpじゃないと文字化けする…)

バグってたのでhw.pl修正
追記
一応patchの当て方を.

  1. 以下のデータをコピーして,適当なファイル名でsimple-hatena-mode.elのあるディレクトリに保存する(例えばshm.patch)
  2. patch -p2 < shm.patch を実行

hw.plのほうはp2じゃなくてp1で実行するといいはず.

さらに追記
hw.plはgithubで管理されていたのでforkしてcommitしました.yaotti/hatena-diary-writer · GitHub
simple-hatena-mode.elの更新は 404 · GitHubを見てください.

simple-hatena-mode.el

diff --git a/hatena/simple-hatena-mode.el b/hatena/simple-hatena-mode.el
index 03423cf..4768043 100644
--- a/hatena/simple-hatena-mode.el
+++ b/hatena/simple-hatena-mode.el
@@ -133,6 +133,14 @@ simple-hatena-toggle-debug-modeを実行する。"
   :type 'boolean
   :group 'simple-hatena)
 
+(defcustom simple-hatena-option-notify-to-twitter nil
+  "*ダイアリーに投稿した記事をTwitterに通知する時に付けるprefix。nilならtwitterに通知しない。
+
+実行時に、-wオプションとして使われる。"
+  :type 'string
+  :group 'simple-hatena)
+
+
 (defcustom simple-hatena-process-buffer-name "*SimpleHatena*"
   "*はてダラを実行するプロセスのバッファ名。"
   :type 'string
@@ -228,8 +236,9 @@ simple-hatena-toggle-debug-modeを実行する。"
 ;; > 大文字あるいは小文字のアルファベット・0-9の数字・「-」・「_」(いずれも
 ;; 半角)のいずれかを3-32文字並べたもの(ただし最初の文字はアルファベットで
 ;; あること)から成る。
+;; 10/05/27 複数ブログのために+を許容
 (defconst simple-hatena-id-regex
-  "^[A-z][\-_A-z0-9]+[A-z0-9]$"
+  "^[A-z][\-_A-z0-9]+[A-z0-9]\\(\\+[\-_A-z0-9]+\\)?$"
   "")
 
 ;; はてなグループ名の正規表現
@@ -705,9 +714,15 @@ dirが存在しない場合は`simple-hatena-setup'を呼ぶ。"
 
 (defun simple-hatena-internal-build-command (flag)
   "実行可能なコマンド文字列を作成する。"
-  (let ((flag-list (list flag)))
+  (let ((flag-list (list flag))
+        (twitter-prefix-onetime nil))
     (if simple-hatena-option-debug-flag  (setq flag-list (cons "-d" flag-list)))
     (if simple-hatena-option-cookie-flag (setq flag-list (cons "-c" flag-list)))
+    (if (or (setq twitter-prefix-onetime simple-hatena-option-notify-to-twitter)
+            (and (setq twitter-prefix-onetime
+                       (read-string "Twitter notification prefix (sth or \"n\"): "))
+                 (not (string= "n" twitter-prefix-onetime))))
+        (setq flag-list (cons (format "-w %s" twitter-prefix-onetime) flag-list)))
     (simple-hatena-internal-join
      " "
      (cons simple-hatena-bin

hw.pl

diff --git a/hw.pl b/hw.pl
index 67cba6e..5716738 100755
--- a/hw.pl
+++ b/hw.pl
@@ -66,6 +66,10 @@ my $filter_command = '';
 # Proxy setting.
 my $http_proxy = '';
 
+# Notification prefix to Twitter.
+my $twitter_notification_prefix = undef;
+
+
 # Directory for "YYYY-MM-DD.txt".
 my $txt_dir = ".";
 
@@ -112,10 +116,11 @@ my %cmd_opt = (
     'M' => 0,   # "no timestamp" flag.
     'n' => "",  # "config file" option.
     'S' => 1,   # "SSL" option. This is always 1. Set 0 to login older hatena server.
+    'w' => undef,   # Twitter notification prefix
 );
 
 $Getopt::Std::STANDARD_HELP_VERSION = 1;
-getopts("tdu:p:a:T:cg:f:Mn:", \%cmd_opt) or error_exit("Unknown option.");
+getopts("tdu:p:a:T:cg:f:Mn:w:", \%cmd_opt) or error_exit("Unknown option.");
 
 if ($cmd_opt{d}) {
     print_debug("Debug flag on.");
@@ -133,6 +138,8 @@ load_config() if -e($config_file);
 # Override global vars with command-line options.
 $username = $cmd_opt{u} if $cmd_opt{u};
 $password = $cmd_opt{p} if $cmd_opt{p};
+$twitter_notification_prefix = $cmd_opt{w} if defined $cmd_opt{w};
+warn 'twitter prefix: ' . $twitter_notification_prefix;
 $groupname = $cmd_opt{g} if $cmd_opt{g};
 $ua_option{agent} = $cmd_opt{a} if $cmd_opt{a};
 $ua_option{timeout} = $cmd_opt{T} if $cmd_opt{T};
@@ -262,7 +269,7 @@ sub login() {
     }
 
     my %form;
-    $form{name} = $username;
+    $form{name} = (split /\+/, $username)[0];
     $form{password} = $password;
 
     my $r; # Response.
@@ -331,7 +338,7 @@ sub logout() {
     }
 
     my %form;
-    $form{name} = $username;
+    $form{name} = (split /\+/, $username)[0];
     $form{password} = $password;
 
     print_message("Logout from $hatena_url as $form{name}.");
@@ -488,7 +494,11 @@ sub post_it($$$$$$) {
     print_debug("post_it: $year-$month-$day.");
 
     $user_agent->cookie_jar($cookie_jar);
-
+    # XXX: twitter prefix must be EUC-JP...
+    if ($enable_encode && $twitter_notification_prefix) {
+        $client_encoding ||= 'UTF-8';
+        Encode::from_to($twitter_notification_prefix, $client_encoding, 'EUC-JP');
+    }
     my $r = $user_agent->simple_request(
         HTTP::Request::Common::POST("$hatena_url/$username/edit",
             Content_Type => 'form-data',
@@ -501,6 +511,8 @@ sub post_it($$$$$$) {
                 title => $title,
                 trivial => $cmd_opt{t},
                 rkm => $rkm,
+                twitter_notification_enabled => defined $twitter_notification_prefix,
+                twitter_notification_prefix => $twitter_notification_prefix,
 
                 # Important:
                 # This entry must already exist.
@@ -696,7 +708,7 @@ sub load_config() {
             # skip comment.
         } elsif (/^$/) {
             # skip blank line.
-        } elsif (/^id:([^:]+)$/) {
+        } elsif (/^id:([^:+]+)$/) {
             $username = $1;
             print_debug("load_config: id:$username");
         } elsif (/^g:([^:]+)$/) {

「20歳のときに知っておきたかったこと」を読んだ


1ヶ月程前に買って読み,感じたことをまとめていたのだけれど,今日改めて読んでまとめを作ってみると,1ヶ月前のものとは微妙に違っていて面白い.
半年後,一年後に読むとまた感じるもの,ひっかかるポイントが違うんだろうなぁ.


以下は読んでいて気になった点の引用+感想を少し

  • 「問題を与えられないと解かない人」はまさにそうだなーと思った.問題発見能力が低い?
  • 「用意された道にとどまった方が楽なのは誰も同じ」
    • 「決まりきった次のステップ,とは違う一歩」
  • 決まりきった次のステップ以外に進むには訓練が必要→普段から他の選択肢を考えるようにする
  • 「他人の怠慢のおかげで成功できる」なるほど…
  • 自分の能力と, それに対する周りの評価を知っておくことが必要
    • 他人からの評価は意識しないといけない
  • 「幸運なんてものはないよ.すべては努力次第だ」
  • 「何かをしようとしている,は言い訳.するしかない」
  • 制約を与えることで良いアイディアが生まれることも多い
    • 「クリップを使って何かしなさい」なんてかなり強い制約だけど,それによってイノベーション・トーナメントの開催なんてことも起きる
  • 自分自身に課題を出すことができる
    • どうやる?意識的/習慣的に縛らないとできなさそうだけど
    • 自分はその前の段階だなー
  • 「許可を求めるな,許しを乞え」
  • 「自分で自分に許可を与えるタイプ or 自分のやりたいことを許可されるのを待っているタイプ」
    • 許可待ちよくない

ドラゴンブック輪講#1

研究室の輪講で発表しました.
4章までは既に講義で学んでいる基本的な部分だったので,第一回の今回は5章の最初からでした.
調べ切れていない部分があった+分量が少なかった(もう1章ぐらいやればよかった…)り,本に書かれていることと自分の考察の区別をスライドに書いていなかったりと不十分なところがちらほら…次に生かそう

jQueryコードリーディング

jQuery1.4.2のコードリーディング.

最初はkmdsbngさんの説明

jQueryの基本的な仕組みと使い方

一貫性のあるエレガントな設計,pluginが豊富
prototype.jsとの比較

  • prototype.js
    • ロジック中心
    • クラスの概念
    • 既存オブジェクトを拡張している
  • jQuery
    • DOM中心
    • jQueryオブジェクト($)を拡張して機能をつける

jQueryオブジェクトの作りかた
$("

", {"class": "test"})とすると
jQueryオブジェクトが返ってくる

jQuery code reading

function hoge(a, b){};
で,hoge(a)と呼ぶとbにはundefinedが入る("undefined"が上書きされる可能性があるので,undefined値を得るためにこうする)



Array.prototype.slice.call(arguments)
callなんてあるのかー

jQuery.fn.someMethodはjQueryオブジェクト($('a')とかで返ってくるやつ)に紐付くメソッド, jQuery.someMethodは$に紐付くメソッド


jQuery.extend: オブジェクトをmergeする
jQuery.extend() – jQuery API

head.insertBefore( script, head.firstChild );
head.removeChild( script );

jsをグローバルコンテキストで実行するために, scriptタグで入れてすぐ消す