面接をする側になって感じること

会社では一番若輩だし立場も下っ端だけど、最近はよく技術者の一次面接(中途採用のみ)を担当するようになった。週に一回くらいのペースかな。一人ではなくて上長と一緒にではあるけれど。今までの人生ではずっと面接をされる側だったので、非常に貴重な体験をさせて貰っていると感謝している。
今、率直に感じているのが、面接の頻出質問が実は面接する側からするとあまり興味がないことだということ。例えば、意図を知ればこわくない 面接で必ず出る12の質問に書かれているようなことの半分も聞きたいと思わない。例えば、「どうして当社に応募したのですか」とかは、余程間抜けでない限り、何と返答されても「なるほどね」としか思いようがない。
よくよく考えれば当たり前かもしれないけれど、面接というのは品質検査ではない。礼の角度を計っても仕方がないし、失礼な質問をして反応を見ても仕方がない。人間性がそんなに簡単に判るのなら余程世間は平和な筈だ。
技術力は判断材料の要であるから、職務経歴書の補足をして欲しいとは思う。何か作ったなら存分にアピールして欲しい。でも、それ以上のことはもう面接では判別できない。純粋なプログラマーを募集する場合でも、アプレッソの小野さんの記事(11.参照)にあるように、面接のときにコードを書かせるくらいしないと判らないだろうなと思う。
Web開発者で優れている人は大方Webの仕事が好き人なんだと思う。miyagawaさんやnaoyaさんを筆頭に。仕事というと語弊がありそうなので、Web開発自体が好きな人と言えば良いだろうか。暇があったらツールとかオープンソースの開発なんかに励んでいる。(このことは別にWeb開発者に限ったことではなく、一般的なことだとは思うけれど)
好き、楽しい、という感情を持って作業をする人は本当に強い。重力1000倍で鍛えたのか?と思うくらいに圧倒的に凄い。よく資格は持っているけれど使えない技術者というのがいるけれど、そういう人は勉強と思って資格を獲ったのではないだろうかと思う。
自分の場合、プログラムは好きだし、Webも好きだけれど、Geekの人と比べて心底好きかと問われると疑問符だ。だから、その通りの実力になっていると思う。Geek程凄いことは全然できないけれど、その辺の人よりはマシでっせみたいな。
だから、面接で一目散に聞きたいのは、「Web使っててどうですか?」とか「Web開発しててどうですか?」ということ。開発業務がただの作業と思う人は採用したくない。会社の収益の観点からは作業と見積もらなければ仕方のない側面もあるけれど、現場の人がそう思ったら終わりだと思う。
そんな訳で、シンプルに最近のWebサービスに焦点を合わせて使ってみてどうだとか改善するならどうだとかを聞いている。そういう質問をしていると、その人が感じている楽しさとかが判ったりするからだ。でも、実際の面接では「勉強のためにmixiで日記を書いたり」とかが返ってきたりしてゲンナリすることも多い。まさか「テスト」とか日記に投稿してないだろうなとか、要らぬ心配までしてしまう程だ。
という訳で、何かまとまらない文章になってしまったけれど、今週も一人面接の予定が入っているので、どんな方がいらっしゃるのか本当に楽しみにしている次第。

Binary Hacksをバイナリ日に買った!

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks ―ハッカー秘伝のテクニック100選

Binary Hacks の発売日決定を見た日から、「11月11日に買わなければ」という使命感に駆られて本日入手してきた。そのために久しぶりにAmazonを使わずに本屋に行ってきたくらい。
まだ、読んでいる途中だけど、ゲームのセーブデータをいじるくらいにしかバイナリに触れてこなかった私には、知らないことの連発でなかなか楽しい。最近はWebで色々なものが調べられるので書籍を買う必要がないことも多いけれど、本書はWebでは集めにくい情報が集約した良本と言えるだろう。一家に一冊、いや、せめて一社に一冊は欲しいところ。

正規表現の最短マッチの使い方

最短マッチの意味自体はそんなに難しくない。まず最初に通常(最短マッチでない)の場合の説明。

<title>cloned.log</title>

という箇所に対して

<.*>

というパターンを書いてしまうと


<title>cloned.log</title>

の全てがパターンにマッチしているとみなされる。途中で>が一度出現しているけれど、最後に出てきた>までが「一つのパターン」としてみなされる。
何が困るかというと、例えば上記の場合だとタグだけを引っ掛けたいときに困る。要は、


<title>cloned.log</title>

としたいとき。ここで登場するのが最短マッチ。ここの例で言えば、<から始まって最初に>が出てくるまでを「一つのパターン」としてみなしたい訳だ。答えから書くと、

<.*?>

となる。?が最短マッチのメタ文字。
ここまでだとそんなに難しくない印象なので、応用して、<a name=”hoge“>hoge</a>みたいなパターンを探すときの場合を考えてみる。最短マッチを意識しないなら、

<a\s+name=".+">.+</a>

みたいな感じ(話を簡単にするためにタグ内に空白があった場合とかは考慮してないパターンにしている)。一応説明すると、\s+は空白が一つ以上で.+は何かしらの文字を一つ以上という意味になる。
但し、最初に書いたとおり、これだと最長マッチになるので、


<a name="foo">foo</a>www<a name="hoge">hoge</a>

が「一つのパターン」としてみなされてしまう。中央のwwwは一致してもらっては困るので、再び最短マッチに登場してもらう必要がある。
個人的にはここが挫折のポイントだった。自分の発想では、

(<a\s+name=".+">.+</a>)?

と書きたかった。「こういうパターンを最短マッチでお願い!」というイメージを持っていたためだ。しかし、これは間違い。
よく考えればわかるのだけど、最短とか最長とかというのは長さが決まっていないから出てくる発想。では今回のパターンで長さが決まっていないのはどこか。
答えはs+と.+の部分になる。+がついているので、一つ以上は何個でも良いため長さが定まらない。そこで「*や+という繰り返しをどこまでやるのか?」という問いに「繰り返しは最小でお願いします」と注文するのが最短マッチ(メタ文字?を付ける)ということになる。
ということで、先程の例を


<a name="foo">foo</a>www<a name="hoge">hoge</a>

としたい場合には、

<a\s+?name=".+?">.+?</a>

というパターンを書けば良い。これで、次の文字(文字というかパターンだけど)が出現するまでの繰り返しを最短で終了するという意味になる。
もっと細かく書くと、「<a」の次に空白を一つ以上繰り返すが、最初に「n」があるところまでをパターンマッチとみなす。次に「name=”」まではそのままの文字があるかを確かめて、「.+?」とあるので次の文字である「”」が最初に出現した箇所でパターンマッチとみなす。
といった流れになる(多分正規表現のプログラムはもっと効率の良い探しかたをしている筈なので、あくまで人が理解するという意味で)。

正規表現を最初見たときはモールス信号かと思うくらい意味がわからなかったけれど、幸いメタ文字の数がそこまで多くないので、案外簡単に覚えられた。ただ、この最短マッチについては理解するのに苦労した思い出があったので何となく書いてみた。

タグクラウド化で自分の言葉が見えてくる

はてなダイアリーをタグクラウド化
ちょっと事前にテストとかやらせてもらって、既に自分のタグクラウドも公開中。
http://hdcloud.spiritloose.net/cloned/
いやぁ、自分でこんなこと書いたっけなぁってのが判って素晴らしい。「ノート」とか絶対「デスノート」のときにしか使っていない、きっと。
色々な人のクラウド化が見たかったりするので、公開してくれる人が増えればいいなとか思う。

スタートメニューがすっきりし過ぎ?


家でも会社でもWindowsのスタートメニューはこんな感じ。「すべてのプログラム」と「コントロールパネル」だけしか置いていない。この前会社の人が後ろから見て笑ってた。面白い状態なのかなぁ。そりゃ他人よりはすっきりしてると自覚してるけどさ。
デスクトップもよく突っ込まれる。こんな感じ。

デスクトップに関しては一般ユーザーが散らかり過ぎなだけではないかと思う。使いもしないファイルを並べてどうするんだろうと、いつも疑問に思う。

自宅サーバーを一新

やっとこさ自宅サーバーを直した。落雷でハードディスクエラーになってconfigureできない状態だったので、ハードディスクを買ってきてOS入れ直した。OS替えようかなとかも考えたけど、結局FedoraCore6にした。出たばっかりだし。
あと、作ったものとかを置く場所が欲しいなと思っていたら、id:spiritlooseさんに自宅サーバーにするべきと薦められたので、作ってみた。まぁ確かに自宅サーバーだと何でもありだから便利。

http://clonedoppelganger.net/

まだ何にもないけれど、何か作ったらここに置くとしよう。
ApacheとかMySQLとかは大体入れて、あとはSubversion入れれば一通り終わりかな。というところで、インストールメモを貼っておくと。

  • いろいろyum
$ sudo yum install zsh
$ chsh -s /bin/zsh
$ sudo yum install screen
$ sudo yum install w3m
$ sudo chmod 777 /usr/local/src
$ mkdir ~/download
$ cd ~/download
$ wget http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/httpd-2.2.3.tar.gz
$ cp httpd-2.2.3.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf httpd-2.2.3.tar.gz
$ cd httpd-2.2.3
$ ./configure \
--prefix=/usr/local/proxy \
--enable-headers \
--enable-proxy \
--enable-ssl \
--enable-rewrite
$ make
$ sudo make install
$ cd ~/download
$ wget http://www.meisei-u.ac.jp/mirror/apache/dist/httpd/httpd-2.0.59.tar.gz
$ cp ./httpd-2.0.59.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ./httpd-2.0.59.tar.gz
$ cd ./httpd-2.0.59
$ ./configure \
--enable-so \
--enable-shared=yes
$ make
$ sudo make install
$ cd ~/download
$ wget ftp://ftp.ruby-lang.org/pub/ruby/ruby-1.8.5.tar.gz
$ cp ruby-1.8.5.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ruby-1.8.5.tar.gz
$ cd ruby-1.8.5
$ ./configure
$ make
$ sudo make install
$ cd ~/download
$ wget http://www.modruby.net/archive/mod_ruby-1.2.6.tar.gz
$ cp ./mod_ruby-1.2.6.tar.gz /usr/local/src/
$ cd /usr/local/src/
$ tar zxvf ./mod_ruby-1.2.6.tar.gz
$ cd mod_ruby-1.2.6
$ ./configure.rb \
--enable-eruby \
--with-apxs=/usr/local/apache2/bin/apxs
$ make
$ sudo make install
$ sudo vim /usr/local/apache2/conf/httpd.conf
# add start
LoadModule ruby_module /usr/local/apache2/modules/mod_ruby.so
<IfModule mod_ruby.c>
RubyRequire apache/ruby-run
<Files *.rbx>
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
</Files>
</IfModule>
# add end
<Directory "/usr/local/apache2/htdocs">
# add start
options +ExecCGI
# add end
$ sudo /usr/sbin/groupadd mysql
$ sudo /usr/sbin/useradd -g mysql mysql
$ sudo /usr/bin/passwd mysql
$ cd ~/download
$ wget ftp://ftp.iij.ad.jp/pub/db/mysql/Downloads/MySQL-5.0/mysql-5.0.27.tar.gz
$ cp mysql-5.0.27.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf mysql-5.0.27.tar.gz
$ cd mysql-5.0.27
$ ./configure \
--prefix=/usr/local/mysql \
--with-charset=utf8 \
--with-extra-charsets=all \
--with-mysqld-user=mysql \
--with-mysqld-ldflags=-all-static \
--with-unix-socket-path=/tmp/mysql.sock \
--with-innodb \
--enable-local-infile \
--enable-assembler \
--enable-thread-safe-client
$ make
$ sudo make install
$ sudo chown -R mysql:mysql /usr/local/mysql
$ sudo vi /usr/local/mysql/bin/mysqld_safe
# comment out
echo "Starting $MYSQLD daemon with databases from $DATADIR"
$ su - mysql
$ cd /usr/local/mysql
$ mkdir var
$ cd var
$ ../bin/mysql_install_db
$ exit
$ sudo cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
$ sudo /usr/local/mysql/bin/mysqld_safe --user=mysql &
$ sudo /usr/local/mysql/bin/mysqladmin -uroot password xxxx
$ sudo /usr/local/mysql/bin/mysqladmin -uroot -pxxxx reload
$ sudo /usr/local/mysql/bin/mysql -uroot -p
mysql> use mysql
mysql> delete from user where user='';
mysql> flush privileges;
mysql> quit
  • libxml
$ cd ~/download
$ wget ftp://xmlsoft.org/libxml2/libxml2-2.6.26.tar.gz
$ cp libxml2-2.6.26.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf libxml2-2.6.26.tar.gz
$ cd libxml2-2.6.26
$ ./configure
$ make
$ sudo make install
  • libmcrypt
$ cd ~/download
$ wget http://umn.dl.sourceforge.net/sourceforge/mcrypt/libmcrypt-2.5.7.tar.gz
$ cp libmcrypt-2.5.7.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf libmcrypt-2.5.7.tar.gz
$ cd ./libmcrypt-2.5.7
$ ./configure --disable-posix-threads
$ make
$ sudo make install
$ cd ~/download
$ wget http://jp.php.net/distributions/php-5.2.0.tar.gz
$ cp php-5.2.0.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf php-5.2.0.tar.gz
$ cd php-5.2.0
$ ./configure \
--prefix=/usr/local/php \
--with-apxs2=/usr/local/apache2/bin/apxs \
--with-mysql=/usr/local/mysql \
--with-mcrypt \
--enable-roxen-zts \
--enable-zend-multibyte \
--enable-track-vars \
--enable-mbstring \
--enable-mbregex
$ make
$ sudo make install
$ sudo cp php.ini-recommended /usr/local/php/lib/php.ini
$ sudo vim /usr/local/apache2/conf/httpd.conf
# add
AddType application/x-httpd-php .php
# add
DirectoryIndex index.html index.php
  • ZendOptimizer
$ cd ~/download
$ cp ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gz /usr/local/src/
$ cd /usr/local/src
$ tar zxvf ./ZendOptimizer-3.0.1-linux-glibc21-i386.tar.gz
$ cd ./ZendOptimizer-3.0.1-linux-glibc21-i386
$ sudo ./install-tty
/usr/local/php/lib/
yes
/usr/local/apache2/bin/apachectl
yes

若干補足。自宅サーバーなので、/usr/local/srcの権限を777にしているけれど、一般的にはsuして作業する方が自然かと。最後だけsudoでやりたい面倒臭がり用です。
Apacheを2台入れてるのは、フロントを80番ポートのプロキシにしているため。後は別のポートで○○専用Apacheを増殖させていくのが便利。
ZendOptimizerだけは普通にWindowsでダウンロードしたので、wgetしてない。最後のは対話で何と答えたかを書いている。

[追記]
Subversionもインストールした。やり方は前に書いたのと同じ。

[追記 2]
ZendOptimizer 3.0.1はPHPの5.2.xには対応してなかったorz。Zendがアップグレードしたら入れ直す。

Poderosaいいかも

Poderosa
タブ式GUIのターミナル。個人的にターミナルにTeraTermは全然ありえないのだけど、Poderosaは気に入った。
id:jishihaさんのOS再インストール時などにインストールするアプリケーションを管理するツールで見つけた。見つけるのが遅い。PuTTYに不満がなさ過ぎたせいかと思われる。
用途によってはPoderosaみたいなタブインタフェースは便利かなと思う。自分の開発環境とか自宅サーバーとかだとscreen使うので単発コンソールで十分(というよりWindows上でタブにする方が面倒)なので、正直PuTTYで不満がない。でも、会社の本番サーバーとかでscreen入ってないのはよくある話なので、Poderosaでtailfやりまくりみたいな用途で会社で使ってみよう。
今のところ気が付いたPoderosaの不満は、余計な表示が多い。プルダウンメニューとかステータスバーとかは非表示にしたい。窓の面積を限りなく広くして欲しい。逆にそれ以外は中々良く出来ている印象。ConsolasClearTypeフォントもちゃんと使えるし、文字コードSSHの対応具合も良いと思う。接続先の設定が「接続へのショートカット」になるのかな。この辺はPuTTYの方がいいなぁ。でも、フォントとかカラーとかのグローバル設定が出来るのはPuTTYより優れてるかな。

嘘とバグ

  • {嘘|バグ}を取り繕うために{嘘|バグ}が増える。
  • {嘘|バグ}は後々ボロが出る。
  • {嘘|バグ}吐いたことは隠している。
  • {嘘|バグ}吐いたことを言い訳する。

友人とチャットしているときに思い付いたこと。