新ジャンル:回文プログラミング

ブラウザのアドレスバーに貼り付けてお楽しみください。

javascript:''[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',~(_*-_+_),_-~_+_|_,_*_+_-~_,-_*~_+_,(_<<_-~_)+'("\\'+(''+!'')[_]+-~(_*_)+-_*~_+(''+{}._)[_]+(_+!'')[_*_]+'\\'+(''+!'')[_]+-_*~_+-~(_*_)+_*_*_+~-(_<<_)+'\\'+(''+!'')[_]+-~_+_%_+_*_+(''+{})[_]+'\\'+(''+!'')[_]+-~_+_%_+_*_+_*_+'?")'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')())(_)//(_)(()(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['("?'+_*_+_*_+_%_+_~-+[_](''!+'')+'\\'+[_]({}+'')+_*_+_%_+_~-+[_](''!+'')+'\\'+(_<<_)-~+_*_*_+(_*_)~-+_~*_-+[_](''!+'')+'\\'+[_*_](''!+_)+[_](_.{}+'')+_~*_-+(_*_)~-+[_](''!+'')+'\\")'+(_~-_<<_),_+_~*_-,_~-_+_*_,_|_+_~-_,(_+_-*_)~,'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]'':tpircsavaj

■動作画面

※推奨ブラウザ:Firefox, Chrome, Safari, Opera, Windows7のIE8もしくはIE9で動作確認しています。

■追記:
id:hasegawayosukeさんに卑怯な気がすると言われたので、記号だけで//を使わずに回文javascriptを書いてみました。

('"\')(("')[_=((_=''+-~-~'')+{})[-~_*_]+(_+{})[_]+(_+{}._)[_]+(_+![])[_*_]+(_+!'')[_/_]+(_+!'')[_]+(''+!'')[_]+(_+{})[-~_*_]+(_+!'')[_/_]+(_+{})[_]+(_+!'')[_]][_](_[_][_]((_=-~-~_+'',(_+!'')[_])+(_+!'')[_*_]+(_+!'')[_/_]+(''+!'')[_]+(_+!'')[_]+(_+{}._)[_]+'\''+['',(~(_*-_+_)),(_-~_+_|_),(_*_+_-~_),-_*~_+_,((_<<_-~_))+'(\\\'',''+_%_+_/_,_*_+_,(_-~_+_|_),(_*_+_-~_)+'\\'+_*_+_%_,((_<<_-~_)-~_),(~(_*-_+_)),(~_^~_*_+_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(_*_+_-~_),-_*~_+_,(_*_+_-~_)+'\\'+_*_+_%_,(~_*~_|_)+'\\'+_*_+_%_,(~_^~_*_+_),(~(_*-_+_)),((_<<_-~_)-~_)+'\\'+_*_+_%_,(_*_+_-~_),(_-~_+_|_),_*_+_,(''+_%_+_/_)+'\\\')'][(_+{})[_*_]+(_+{})[_]+(_+_/'')[_*_]+(_+{}._)[_]]('\\'+_/_)+'\'')(")(''\'+(_/_+'\\')[[_](_.{}+_)+[_*_](''/_+_)+[_]({}+_)+[_*_]({}+_)]['('\\\'+(_/_+_%_+''),_+_*_,(_|_+_~-_),(_~-_+_*_),_%_+_*_+'\\'+(_~-(_~-_<<_)),((_+_-*_)~),(_+_*_~^_~),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_~-_+_*_),_+_~*_-,(_~-_+_*_),_%_+_*_+'\\'+(_|_~*_~),_%_+_*_+'\\'+(_+_*_~^_~),((_+_-*_)~),(_~-(_~-_<<_)),_%_+_*_+'\\'+(_~-_+_*_),(_|_+_~-_),_+_*_,_/_+_%_+'',''\\\)'+((_~-_<<_)),_+_~*_-,(_~-_+_*_),(_|_+_~-_),((_+_-*_)~),'']+''\'+[_](_.{}+_)+[_](''!+_)+[_](''!+'')+[_/_](''!+_)+[_*_](''!+_)+([_](''!+_),''+_~-~-=_))[_][_]_)[_][[_](''!+_)+[_]({}+_)+[_/_](''!+_)+[_*_~-]({}+_)+[_](''!+'')+[_](''!+_)+[_/_](''!+_)+[_*_]([]!+_)+[_](_.{}+_)+[_]({}+_)+[_*_~-]({}+(''~-~-+''=_))=_]('"))('\"')

括弧()[]{}の対応づけが逆になっているのは見た目のための仕様です。(厳密には文字列の reverse になっていない鏡像です)

■追記(5/19 19:47)

2010年5月19日のヘッドラインニュース - GIGAZINE
に(右から見ても左から見ても同じ文字列でプログラミング)との解説付きで掲載していただきました。

■参考文献:

  1. Palindrome C code
  2. [Neta]真・新ジャンル:回文プログラミング - 葉っぱ日記

Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある件について

http://twitter.com/k_morihisa/status/9006163842

Twitter / Morihisa Kazuaki: Linux kernel の wireless.c で .header_type とか,ドットで始まる変数名?がある.謎

Linux-Kernel Archive: 2.6.18-git9 wireless fixes break ipw2200 association to AP with WPAのパッチとかみると、たしかにこんな断片のC言語ソースコードがでてくる。

@@ -242,24 +234,24 @@
[SIOCSIWESSID - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
.flags = IW_DESCR_FLAG_EVENT,
},
[SIOCGIWESSID - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
.flags = IW_DESCR_FLAG_DUMP,
},
[SIOCSIWNICKN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
},
[SIOCGIWNICKN - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_POINT,
.token_size = 1,
- .max_tokens = IW_ESSID_MAX_SIZE,
+ .max_tokens = IW_ESSID_MAX_SIZE + 1,
},
[SIOCSIWRATE - SIOCIWFIRST] = {
.header_type = IW_HEADER_TYPE_PARAM,
@@ -346,8 +338,8 @@
.max_tokens = sizeof(struct iw_pmksa),
},
};
-static const unsigned standard_ioctl_num = (sizeof(standard_ioctl) /
- sizeof(struct iw_ioctl_description));
+static const int standard_ioctl_num = (sizeof(standard_ioctl) /
+ sizeof(struct iw_ioctl_description));

/*
* Meta-data about all the additional standard Wireless Extension events

http://twitter.com/takesako/status/9016296481 でも返事しましたが、

つまり、こういうこと?

#include <stdio.h>

typedef struct x{
  char a;
  char b;
} X;

int main(void)
{
  const X x[] = {
    [2] = { .a=69, .b=0,  },
    [0] = { .a=65, .b=66, },
    [1] = { .a=67, .b=68, },
  };
  printf("%s\n",x);
}

→ 実行結果:ABCDE

12月5日@大阪

就活生向けIT業界セミナーで講演します | TAKESAKO @ Yet another Cybozu Labs

今週末12/5(土)、日帰りで大阪に行きます!

■大阪会場(共催:株式会社はてな×サイボウズ

 日時:12月5日(土)
 場所:大阪ドーンセンター

 14:00 受付開始
 14:30 ボクがはてなを選んだ理由〜グローバルなサービスを求めて〜
栗栖 義臣(はてな
 15:10 ITエンジニアと株式会社の付き合い方(恋愛編)
竹迫 良範(サイボウズ・ラボ)
 16:00 IT業界のヒ・ミ・ツ
佐藤 学(サイボウズ
 16:30 座談会
  Aチーム、Bチーム、Cチームにわかれて質疑応答
  (20分交代ですべての学生に各チーム回るイメージ)

まだ、座席に若干余裕があるみたいなので、興味のある方はぜひ。

Hatena × Cybozu ITエンジニアによるITエンジニアのためのIT業界セミナー 12月5日@大阪
http://cybozu.co.jp/company/job/recruitment/seminar/hatena/index.html

ちなみに私は新大阪21時発ぐらいの新幹線で東京に帰る予定です。

vip コマンドと zip コマンドの正しい使い方

vip - vi pipe (vipっていうviラッパー作った - kazuhoのメモ置き場)

http://github.com/kazuho/vip/blob/master/vip

$ vip | perl
i
print "Hello\n";
[Esc]:wq
"~/vip/20091028-123818-1" [New] 1L, 10C written
Hello
$ ls ~/vip/
20091028-123634-1  20091028-123818-1
$ more 20091028-*
::::::::::::::
20091028-123634-1
::::::::::::::
前に書いたプログラムの内容
::::::::::::::
20091028-123818-1
::::::::::::::
print "Hello\n";
$ cd ~/vip/
$ zip -dekure
Enter password: fushianasan
Verify password: fushianasan

zip error: Invalid command arguments (specify just one action)

あれ?

ANSI C Trigraph

このプログラムは普通にVisual C++コンパイルできたりする不思議。

??=/??/
*?=/??/
*/include<stdio.h>
int/*??*/main(int/**/T,char*e??(??))??<??/
printf("??/110ello,%s??/n",e??(T-T??));??>

■実行結果

C:\> cl a.c
Microsoft(R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

a.c
Microsoft (R) Incremental Linker Version 8.00.50727.762
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:a.exe
a.obj

C:\> a.exe
Hello,a.exe

gccコンパイルしたい場合は -ansi オプションを使うか -trigraphs オプションをつける必要がある。

$ gcc -ansi a.c && ./a.out
Hello,./a.out
$ gcc -trigraphs a.c && ./a.out
Hello,./a.out

gccコンパイルオプションのデフォルトでは -trigraphs はオフになっている。

$ gcc a.c
a.c:1:1: 警告: trigraph ??= ignored, use -trigraphs to enable
a.c:1: error: 文法エラー が '?' トークンの前にあります
a.c:1:5: 警告: trigraph ??/ ignored, use -trigraphs to enable
a.c:2:5: 警告: trigraph ??/ ignored, use -trigraphs to enable
a.c:4:30: 警告: trigraph ??( ignored, use -trigraphs to enable
a.c:4:33: 警告: trigraph ??) ignored, use -trigraphs to enable
a.c:4:37: 警告: trigraph ??< ignored, use -trigraphs to enable
a.c:4:40: 警告: trigraph ??/ ignored, use -trigraphs to enable
a.c:5:9: 警告: trigraph ??/ ignored, use -trigraphs to enable
a.c:5:22: 警告: trigraph ??/ ignored, use -trigraphs to enable
a.c:5:29: 警告: trigraph ??( ignored, use -trigraphs to enable
a.c:5:35: 警告: trigraph ??) ignored, use -trigraphs to enable
a.c:5:40: 警告: trigraph ??> ignored, use -trigraphs to enable

■参考文献

  1. Digraphs and trigraphs - Wikipedia