読者です 読者をやめる 読者になる 読者になる

mixi engineer blog

ミクシィ・グループで、実際に開発に携わっているエンジニア達が執筆している公式ブログです。様々なサービスの開発や運用を行っていく際に得た技術情報から採用情報まで、有益な情報を幅広く取り扱っています。

求人広告バナー用プログラムを書いた話

mixi

求人広告バナーに載せるかっこいいコードを作って欲しいとの依頼がたんぽぽグループに来ました。 残念ながらかっこいいコードはできず、よくある難読化コードになってしまいました。 その経過を書いてみます

IRCであれこれ相談して4つの案がでました

記号プログラミング

@sugyanさんの記号だけのPerlプログラミングの基本原理を使ってみました。

#!perl
''=~( '(?{' .('[' ^ '+').('['^')').
('`'|')').('`'|'.').('['^'/').
' "'.('`'|'-').('`'|')').('['^
'#').('`'|')').'"})');
バナー広告の候補からは外れたのですが、YAPC::Asia TOKYO 2011の求人広告に使用されました。

brainfuckのmixi版

6種類の記号がいるので

  • mixMIX,. の6文字
  • mixi mIxi miXi mixI MIXI MIXi の6単語
  • mixi social sns .. などの6単語
を検討。 しかし、プログラムサイズが大きい & 読みにくいのでバナーに使うのは難しい との結論になりました。

難読化

難読化といえばIOCCCということでなぜかCで書くことを検討しました。

main(){char*s="programming";
printf("%*.*sx%c\n",unix<<1,unix<<1,s+010-1,010[s]);}
簡単に作れるわりに難しいことしているように見えるので難読化したCでいくことになりました。 蛇足ですが、IOCCCで一番印象に残っているのはコレです。 実用的なプログラムであることにシビれました。

バナープログラム

以下に作成したバナープログラムを掲載します。

第1案

main(){
  char *s = "The person is made happy by the technology. ";
  char *_ = "Ymw]|_WwhG~wd~hEuwp{}%wj${}";
  char __[*s];
  char *___;
  while(*_)putchar(((___-___)[__]=*_++,(++___- --___)[__]=s[*_++-*s],('/'-'-')[__]=s[*_++-*s],
                    (___-___)[__]&(++___- --___))?(++___- --___)[__]|('%'-'#')[__]:('+'-'*')[__]&('$'-'"')[__]);
}
*_ の内容にしたがって、*sの内容を処理して出力するプログラムです。 0,1,2などの定数を@sugyanさんの記号プログラムのアイデアをいただき各種演算で求めることにより隠蔽しています。 処理内容自体は単純なので割愛させていただきます。 以下のプログラムも同じロジックです。

第2案

main(){
  char *s = "We make people happy via technology.";
  char *_ = "2t\\Grt;snwzs&zn?nvByw1isdy\\";
  char m9[*s];
  char *O;
  while(*_)putchar((
       m9[O-O]      =*_++,(++O- --O)[m9]=s[*_++-*s],('/'-'-')[m9]=s[*_++-*s],
       m9[O-O]      &(++O- --O))?(++O- --O)[m9]|
       m9['%'-'#']   :
       m9['+'-'*']   &('$'-'"')[m9]);
}
メッセージを変えました。 変数名を m9にし、 m9[0]をm9[0_0]とすることで キミを待っている!っぽい顔文字にしてみました。 バナーに採用されたのは、このプログラムです

第3案

main(){char*s =

"The three chief virtues of a programmer are: "
"Laziness, Impatience and Hubris. "
    "Larry Wall, from the book Programming in Perl";

char*O="4sibeitxT((>$sc@_qDpl0)W|XT`jJ6txZY|&mY$T"
"XvT~vz^,gTdTh|`^L`^",m9[*s];while(*O)putchar((
m9[O-O]    =~~~~~~+*O++,('M'&'!')[m9]=*O++, ('S'^'Q')[m9]=*O++,
m9[O-O]    &('_'>*s))?s[('I'&'!')[m9]-*s]&s[('N'^'L')[m9]-*s]:
m9[O-O]    &('_'-']')?s[('X'^'Y')[m9]-*s]|s[('S'&'&')[m9]-*s]:
m9[O-O]    &('-'^')')?s[('I'^'H')[m9]-*s]^s[(' '^'"')[m9]-*s]:
           ~~~~~~~~~~~~+('!'^' ')[m9]);}
Larry Wallのメッセージを埋め込みました。 さらに、顔文字を目立たせ、縦読みを入れました。 桁合わせは ~~ と + を使用しています。 1文字の桁合わせは + を挿入。 2文字の桁合わせは ~~ を挿入。 ~を2回行うことで元に戻ることを利用しています。 $n桁の場合を簡単に書くと '~~'x($n>>1).'+'x($n&1) といった感じになります。 しかし、バナーに埋め込むには大きすぎるので残念ながらお蔵入りに...

まとめ(?)

短くてかっこいいコードは難しいとしみじみ実感しました。 長ければかっこいいコード書けるかって言うとそうでもないのですが... オレならエンジニアに訴求するコードを書けるぜ!という方はぜひ弊社に応募していただければと思います。 Shibuya.pm#16が弊社で開催され、その際に"正規表現うちわ"を配布しました。 その正規表現もたんぽぽグループ作だったりします。 難読化から正規表現まで暮らしを見つめるたんぽぽグループでした。