Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
Inemuri nezumi diary(2008-04-03)
[go: Go Back, main page]

トップ «前の日記(2008-03-31) 最新 次の日記(2008-04-15)» 編集
2003|04|05|06|07|11|12|
2004|01|02|03|04|05|06|07|10|11|
2005|01|02|03|04|05|06|07|08|11|
2006|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|

イネムリネズミ日記


2008-04-03 ヒトリシズカ(Chloranthus japonicus)は隠された美しさ [長年日記]

_ エイプリルフールに乗り遅れた

ふぬんが。去年の4/1にやった四月馬鹿と、その後の一連のエントリの評判がよかったので2月から準備して、3月は日記も(ほとんど)書かずに脇目もふらずに準備していたのだが。風呂敷を広げすぎたようだ。

でもおかげで、自分のやりたいことが明確になったことは感謝している。今後もほそぼそと続けていれば、来年には大バカぶりをお見せすることができるだろう。それでいいのか、という思いもあるが。

_ 坤(坤為地)

坤、元亨。利牝馬之貞。君子有攸往、先迷、後得生。利西南得朋、東北喪朋。安貞吉。

彖曰、至哉坤元、萬物資生。乃順承生。坤厚載物、徳合无彊。含弘光大、品物咸亨。牝馬地類、行地无彊。柔順利貞、君子攸行。先迷失道、後順得常。西南得朋、乃与類行。東北喪朋、乃終有慶。安貞之吉、應地无彊。

象曰、地勢坤。君子以厚徳載物。

『易経上経』、「坤」より一部抜粋。

八卦の中で、いまのお気に入りは坤である。易経については、2/16のエントリで少し触れたが、超古代の思想の癖になかなか面白い妙味を含んでいる。2/16 はずるい議論をしていて、陰陽と{0,1}の割当てを勝手に決めている。the world が太極であるのは、私にとっては疑いようもないが、陰が 0 か 1 かは両方の解釈があると思う。陰が 0 なら、111 は坤ではなく「乾」にあたる。が、乾(乾為天)の解釈は坤の解釈よりもさらに曖昧なのである。まあ、オカルトの一つなので、どうでもいいことだ。

先迷失道、後順得常。乃与類行、乃終有慶。安貞之吉、應地无彊。結構、結構。私はひねくれものなので、柔順とやつが足りない。いみじくも本命卦が当たっている。

日本という文化圏は、西洋的な見方(複雑な物事を単純な物事に分解して、単純な方法で解決する)と東洋的な見方(複雑な物事を複雑な背景とともに把握して、過去の経験と知恵を適用して解決する)の両方を兼ね備えているという特徴があるのだから、後者も大事にしてもらいたいものだ。さらにいえば、一歩一歩考えを進めていくという方法(演繹的思考)と、想定外も含めた全体を想像して第三者的な立場から冷徹に判断する(禅的思考)の両方を持つことが、問題解決の重要なプロセスにつながると考えるようになった。後者については、どれだけ理性に束縛されずに自由な発想ができるかが問われる。

_ すばらしいソフトウエアを作るためには

Simon Peyton Jones の 「すばらしい論文を書き、すばらしい発表をするには」を読んで、ソフトウエア開発手法にも共通するところがあるのではないか、と考えました。そこで、やや雑な議論になりますが、「すばらしいソフトウエアを作るには」というコラムをこれから書いてみます。

なぜ私たちのほとんどは「すばらしいソフトウエア」を作ることができないのか

「昔はプログラムを書くのが嫌だったけど、今は違うんだ」
「わかったんだ、プログラムを書く真の目的は、つまんないアイデアや、あいまいでいい加減な屁理屈、ごちゃごちゃなものを、コンピュータの上で実現することで有頂天になることだってね」
「経験からわかったんだけど、プログラムを書くというのは恐ろしくて理解不明なもやもやを書くことなんだね、僕のプログラムを見てみるかい?」

/* http://www.ioccc.org/ */
/* 2004 17th International Obfuscated C Code Contest winner */
/* A pgm generator written by anonymous */
  
                                  #include\
                                  <stdio.h>
                     #include                <stdlib.h>
                     #include                <string.h>
  
                    #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:"
                   #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\
                  "DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y"
                 #define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\
                "K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T"
               #define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\
              R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j,
             #define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J"
  
    #define y                  yy(4),yy(5),                yy(6),yy(7)  
  #define yy(              i)R[i]=T[i],T[i ]            =O[i],O[i]=L [i]  
#define Y _(0          ], 4] )_ (1 ], 5] )_ (2      ], 6] )_ (3 ], 7] )_=1  
#define v(i)(      (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2
double b = 32  ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ;
#define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256,
# define  p      "G\\QG\\P=GLPGTPGdMGdNGtOGlOG"   "dSGdRGDPGLPG\\LG\\LHtGHtH:"
#  define W         "Hs?H{?=HdGH|FI\\II\\GJlHJ"    "lFL\\DLTCMlAM\\@Ns}Nk|:8G"
# define   U           "EDGEDH=EtCElDH{~H|AJk}"       "Jk?LSzL[|M[wMcxNksNst:"
#  define u                  "Hs?H|@=HdFHtEI"             "\\HI\\FJLHJTD:8H"
char  *   x                   ,*X , ( * i )[               640],z[3]="4_",
*Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U
 "4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\
FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\
\\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"W
S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\
BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\
J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" u t t
"4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\
rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u"
p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\
THLdFNk|Nc|\
:8K"; main (
int C,char**        A) {for(x=A[1],i=calloc(strlen(x)+2,163840);
C-1;C<3?Q=_=       0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X =
strstr(Z,z))      &&(X+=C++):(printf("P2 %d 320 4 ",V=b/2+32),
V*=2,s=Q=0,C     =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B)
]=1:_?_-=.5/    256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1)
))/Q:*X>60?y   ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y),
Y:*X>57?++X,  y,Y:*X >54?++X,b+=*X++%64*4:--C:printf("%d "
,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q=
0,s+=2)<640
||(C=1));}

これはもちろん、ジョークですが、ほとんどのプログラマは恐ろしくて理解不明なもやもやを書いています。これはホントーです。

ソフトウエアを作ることに関する誤解

「皆をびっくりさせること、皆の注目を集めること、腕前を見せつけること」が、ソフトウエアを作る目的である。←誤解

ソフトウエアはアイデアを伝達する手段のひとつである

  • ソフトウエアを作る目的:思いついたアイデアを皆にウイルスのように伝染させること
  • プログラムは芸術作品とは違う(Mozartを見よ)

アイデアをいつまでも温め続けるならば、もっとも優れたアイデアに価値が生まれる。

ソフトウエアを作成する手順その一

アイデアが浮かぶ→実現するためのライブラリ/フレームワークを探す→プログラムを書く

ソフトウエアを作成する手順その二

アイデアが浮かぶ→実現するためのライブラリ/フレームワークを探す→プログラムを書く

アイデアが浮かぶ→プロトタイプとしてのプログラムを書く→実現するためのより良いライブラリ/フレームワーク/言語を探す

  • 何がアイデアの鍵なのかをはっきりさせる
  • 何をまだ理解できていないかを認識する
  • 他人との意思の共有を行う:実際に動かしてもらう、批判してもらう、協力する

高慢ちきにならないこと

誤解

ソフトウエアを作る前に、すんばらしいアイデアを持っていなければならない。←誤解

アイデアがすんばらしいか、つまんねえか、そんなことは関係ない。プログラムを書け。

  • プログラムを書くことは、アイデアを具現化する第一歩である
  • 最初に思ってたよりは、より面白く、より挑戦的な取り組みに変わることが多い

ソフトウエアを作ることの目的

ソフトウエアを作ることの目的とは...アイデアをユーザに伝えることである。

頭の中にしかまだないアイデアを、ユーザに伝えることが目的である。全てはそのためにある。

ソフトウエアを作ることに関する誤解

間違っても、こういう目的でソフトウエアを作ってはいけない:「ほげらもげらシステムに新しいボタンを追加する」

  • そもそも、ユーザはほげらもげらシステムのことがわかっていない
  • ユーザは汎用な、イカしている機能に興味をもっているのであって、ほげらもげらシステムに固有なことなどどうでもいい

アイデアを伝えるには

  • ここに、皆様の抱えている問題があります
  • これは解決すべき問題であります
  • しかも、まだ解決されておりません
  • ところで、このようなアイデアを思いつきました!(問題を解く方法を見つけた!)
  • このアイデアによって、問題を解決するような振舞が起こります(うまくやるぜ、カッコいい)
  • このアイデアと既存の手法を比べると、このようなメリットとデメリットがあることがわかります

ソフトウエア作成の前のアイデアノートテンプレ

  • 概要
  • 具体例
  • 問題とは何か
  • アイデアとは何か
  • 実装の詳細
  • 既存手法調査
  • TODO

続きは...ご自分で。