なんかゲイツ、怒りの秘蔵メール : ギズモード・ジャパンとかいう記事を見た。
全文和訳はなかったので、とりあえずしてみた。べ、別に暇だったわけじゃないんだからねっ!
残念だ、ああ残念だ。Windowsのユーザビリティがこんなにも落ち込んでいることも残念だし、管理職の連中がユーザビリティについて考えちゃいないってことも残念だ。
俺の昨日の体験を教えてやろうじゃないか。
俺はMoviemakerをダウンロードしてDigital Plus Packを購入しようと決めたんだ。で、 microsoft.comに行った。ダウンロードページがあったからそこに行った。
ダウンロードページを開こうとしたら、五回もタイムアウトになった。その次でやっと開けたけど、それも8秒かかった。
こんなの、遅すぎて使えないよ。
(ダウンロードページの)はじめの五個にはなかったから、続く45個のページも開いた。
この45個の名前もわけが分からない。これを見てると、"C:\Documents and Settings\billg\My Documents\My Pictures"だって分かりやすい方に見えてくるよ。
システムごとに分類されていないし…、他にも色々。
メディア関係のページを見たんだけどmoviemakerは見つからない。movieを探した。ない。今度はmaker。やっぱりない。これじゃあお手上げだ。
仕方がないからAmirにメールしたんだ。「Moviemakerのダウンロードはどこ?本当にあるの?」って。
そしたらあいつ、ダウンロードページからダウンロードされるとは考えていなかった、なんて言うんだ。
で、メインページから"movie maker"で検索してくれ、だって。"moviemaker"じゃあないんだとさ!
だから、まあ、検索したよ。ページはまたひっどく遅くて、表示まで6秒くらいかかったけど。
とにかく、もう今度こそは直にダウンロードできるボタンを見られるだろうと思ってたんだ。
でも違った。むしろやりかたはパズルみたいだった。Windows Updateに行って、わけの分からないことを山ほどやってこいって言って来た。
これはさすがにおかしいだろ。なんでMoviemakerをダウンロードするためだけにシステムのスキャンをしなきゃいけないのさ?しかも他のところにいってまで?
まあしかし行ったよ俺は。Windows updateに。Windows Updateは色々ダウンロードしなきゃいけないって言ってきて、わけの分からぬウィンドウがたくさん開いては消えてった。
Windows updateってWindowsとうまくつながってるんでしょ、もうちょっとなんとかならないの?
で、まあスキャンが始まったよ。けっこう時間がかかった。で、17MBのダウンロードが必要だってさ。
これの前に差分パッケージがあることは聞かされてた。怖すぎるラベリングをされた*1六つのファイルをダウンロードしなきゃいけなくなる代わりに、17Mのパッケージをダウンロードするんだって。*2
だからまあ、ダウンロードしたよ。これは早かった。ダウンロードの後、インストールが必要だった。こいつが6分間もかかって、その間はマシンが重くなって他に何も出来なくなった。
この6分の間、こいつは一体何やってんだ?あほか。ダウンロードが終わってからこれだなんて。
それで、終わったら今度は再起動しろって言ってくるんだよ。なんでそんなことしなきゃいけないの。毎晩起動しなおしてるって言うのに、なんでそのタイミングでわざわざ再起動の必要があるのさ?
…あまりにしつこく再起動しろって言ってくるもんだから、仕方なく再起動したよ。せっかく使ってたOutlookの状態が全部ぱぁになってしまったけど。
で、またパソコン立ち上げてもう一度Windows Updateに行ったんだ。あれ?そもそも俺なんでWindows Updateしてるんだっけ?俺はただMovie makerをダウンロードしたいだけなのに…。
次に何をするかチェックするため、Microsoftのページで説明を読んだ。なんかWindowsXPってフォルダをクリックしなきゃいけないらしい。なんでそんなことしなきゃいけない?WindowsXPを使ってるってことは、Windows Updateは知ってるじゃないか。
そのフォルダをクリックすることになんの意味があるんだ?分からないけど、クリックしたらわけの分からんものがたくさん出てきた。まあそのうちのひとつはMoviemakerだったんだけど。
とにかく、だからダウンロードしたんだ。ダウンロードは楽々だったけど、インストールはやっぱり何分もかかった。ほんと、奇跡的に遅い。
どっかしらの時点でWindows Media 9シリーズもダウンロードする必要があるって教えられたんで、それをしに行ったんだ。したらダイアログが出てきて、「保存」か「開く」かせまってきた。どっちにするか、説明書きには書かれてない。一体どっちにすればいいんだよ。
とにかく、ダウンロードしてインストールした。ダウンロードはやっぱり早かったけど、インストールには7分かかった。
これでやっとMoviemakerが使える!
そう思って「プログラムの追加と削除」を見に行ってみたら、
…ないんだよ。
あったのは、ゴミばかり。Microsoft Autoupdate Exclusive test package, Microsoft autoupdate Reboot test package, Microsoft Autoupdate testpackage1, Microsoft Autoupdate testpackage2, Microsoft Autoupdate Test package3, …。
おいおい、誰かWindowsのいけてるところをなくしちゃうことにしたのか?ファイルシステムはもうダメだ*3。レジストリは使えない。プログラムの管理はまだまともな機能だったのに、今やこんなクソなことになってる。
でもこれはそんなクソのはじまりでしかなかった。あとでもっと見てみると「Windows XP hotfix 詳しくはQ329048を参照してください」なんてのがたくさん並んでいやがった。何だよQ320948って。なんでそんなのがここに並んでるんだ。いくつかのパッチはそれすらなくて、ただQ910655とだけ書かれてたりした。
プログラムリストにMoviemakerはなかった。
もうどうしようもない。Moviemakerは諦めて、Digital Plus Packageをダウンロードすることにした。
いろんな個人情報を書いてくれといわれた。
で、全部書いたんだよ。そしたらミスタイプがあったと判断されたらしく、全部書き直しだ。もちろん前に書いたものは全部消された。
くそだ。ミスタイプしないように五回もがんばったが、そのたびに消された。
結局、一時間以上クソみたいな時間を過ごして、プログラムのリストをゴミだらけにされて脅されてMicrosoftのページがクソだって分かっただけ。Moviemakerは動かせなかったし、Plus Packageも結局入手できなかった。
今回の経験から見られるユーザビリティへの意識の低さは酷すぎる。お前らは俺を怒らせた。Windows Network placesや802.11を使うときのメッセージよりも下はないだろうと思ってたけど、そんなことはなかったみたいだな。(あのルート認証のメッセージはほんと最高だよな!)
実際に使うようになったらもっと酷いことになることはまちがいない。
訳する前の文は [CG]ビル・ゲイツ、怒りのEメール からお借りしました。
Mykusoloftと言えば「Microsoftで私が学んだこと」という本があって、これがなかなか面白いのでおすすめ。トップであるGatesは少しでも弱いところがあるとしつこく鋭く突っ込んでくるので社員から畏れられているという様子がよくわかる。良い上司。
もう一つ分かるのは、Gatesはとことんユーザから見た世界をシームレスにしたがってるってこと。変なものは見えない方が良い、設定はOSや何やが勝手に読み取ってくれた方が良い、と。
その賛否はともかくとして、とりあえずMSDNがわかりにくすぎるのでそこを修正してほしいなーと。他のページも使いにくいけど、MSDNはほんと見つけたい情報を探すのがたいへん。ライブラリの情報くらい一発アクセスさせれ。
そんだけです。和訳へのツッコミ歓迎です。
Ricky2012/01/29 15:03This atricle went ahead and made my day.
mlbqrfg2012/01/29 23:49omc68I <a href="http://swzxzgykrebh.com/">swzxzgykrebh</a>
fzhxziehfyj2012/01/30 22:06x6gv77 , [url=http://odoonlygcznh.com/]odoonlygcznh[/url], [link=http://bxnxfydawnnv.com/]bxnxfydawnnv[/link], http://ekpalbttquum.com/
mxbrujzjahw2012/02/01 21:41WRL3Op , [url=http://fxtxktwjgziz.com/]fxtxktwjgziz[/url], [link=http://otqdxqyeevjq.com/]otqdxqyeevjq[/link], http://dqhxvwygcxti.com/
asm |
アセンブラディレクティブのマクロを使ってみたよ\(^o^)/
これすごいよ\(^o^)/
.macro printhoge pname .text 1 \pname: pushl %edx subl $20, %esp movl $_\pname, (%esp) call printf addl $20, %esp popl %eax cmpl %eax, %eax je after_print .section .rodata _\pname: .ascii "\pname \0" .endm printhoge Fizz printhoge Buzz printhoge FizzBuzz
.macro macroname [args]
マクロ内で\引数名とすればその場所が引数に置き換えられるよ\(^o^)/
文字列の中でもシンボル名の途中からでも置き換えちゃうよ\(^o^)/
冗談で試したら本当に出来てしまった\(^o^)/強力すぎる\(^o^)/
全体ではこんな感じだよ\(^o^)/
.globl main .macro printhoge pname .text 1 \pname: pushl %edx subl $20, %esp movl $_\pname, (%esp) call printf addl $20, %esp popl %eax cmpl %eax, %eax je after_print .section .rodata _\pname: .ascii "\pname \0" .endm .text 0 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx movl $1, %eax movl %eax, %ecx loop: movl %eax, %edx movl $15, %ebx call mod cmpl $0, %eax je FizzBuzz /* movl %edx, %eax */ /* since x mod 5 == (x mod 15) mod 5 */ movl $5, %ebx call mod cmpl $0, %eax je Buzz movl %edx, %eax movl $3, %ebx call mod cmpl $0, %eax je Fizz movl %edx, %eax pushl %eax subl $20, %esp movl %eax, 4(%esp) movl $_Number, (%esp) call printf addl $20, %esp popl %eax after_print: addl $1, %eax cmpl $100, %eax jle loop loop_end: popl %ecx popl %ebp leal -4(%ecx), %esp ret printhoge Fizz printhoge Buzz printhoge FizzBuzz .text 2 mod: /* This subroutine calculates (mod %eax %ebx) returns the mod on %eax. mod() */ /* movl %ecx, %eax*/ mod_loop: cmpl %eax, %ebx jg mod_end subl %ebx, %eax cmpl %eax, %eax je mod_loop mod_end: ret .section .rodata _Number: .ascii "%d \0"
アセンブリコードレベルでの記述は簡単になっているけど、オブジェクトファイルでは勿論展開されてるよ\(^o^)/
fb2.o: file format elf32-i386 Disassembly of section .text: 00000000 <main>: 0: 8d 4c 24 04 lea 0x4(%esp),%ecx 4: 83 e4 f0 and $0xfffffff0,%esp 7: ff 71 fc pushl 0xfffffffc(%ecx) a: 55 push %ebp b: 89 e5 mov %esp,%ebp d: 51 push %ecx e: b8 01 00 00 00 mov $0x1,%eax 13: 89 c1 mov %eax,%ecx 00000015 <loop>: 15: 89 c2 mov %eax,%edx 17: bb 0f 00 00 00 mov $0xf,%ebx 1c: e8 95 00 00 00 call b6 <mod> 21: 83 f8 00 cmp $0x0,%eax 24: 74 78 je 9e <FizzBuzz> 26: bb 05 00 00 00 mov $0x5,%ebx 2b: e8 86 00 00 00 call b6 <mod> 30: 83 f8 00 cmp $0x0,%eax 33: 74 51 je 86 <Buzz> 35: 89 d0 mov %edx,%eax 37: bb 03 00 00 00 mov $0x3,%ebx 3c: e8 75 00 00 00 call b6 <mod> 41: 83 f8 00 cmp $0x0,%eax 44: 74 28 je 6e <Fizz> 46: 89 d0 mov %edx,%eax 48: 50 push %eax 49: 83 ec 14 sub $0x14,%esp 4c: 89 44 24 04 mov %eax,0x4(%esp) 50: c7 04 24 00 00 00 00 movl $0x0,(%esp) 57: e8 fc ff ff ff call 58 <loop+0x43> 5c: 83 c4 14 add $0x14,%esp 5f: 58 pop %eax 00000060 <after_print>: 60: 83 c0 01 add $0x1,%eax 63: 83 f8 64 cmp $0x64,%eax 66: 7e ad jle 15 <loop> 00000068 <loop_end>: 68: 59 pop %ecx 69: 5d pop %ebp 6a: 8d 61 fc lea 0xfffffffc(%ecx),%esp 6d: c3 ret 0000006e <Fizz>: 6e: 52 push %edx 6f: 83 ec 14 sub $0x14,%esp 72: c7 04 24 00 00 00 00 movl $0x0,(%esp) 79: e8 fc ff ff ff call 7a <Fizz+0xc> 7e: 83 c4 14 add $0x14,%esp 81: 58 pop %eax 82: 39 c0 cmp %eax,%eax 84: 74 da je 60 <after_print> 00000086 <Buzz>: 86: 52 push %edx 87: 83 ec 14 sub $0x14,%esp 8a: c7 04 24 06 00 00 00 movl $0x6,(%esp) 91: e8 fc ff ff ff call 92 <Buzz+0xc> 96: 83 c4 14 add $0x14,%esp 99: 58 pop %eax 9a: 39 c0 cmp %eax,%eax 9c: 74 c2 je 60 <after_print> 0000009e <FizzBuzz>: 9e: 52 push %edx 9f: 83 ec 14 sub $0x14,%esp a2: c7 04 24 0c 00 00 00 movl $0xc,(%esp) a9: e8 fc ff ff ff call aa <FizzBuzz+0xc> ae: 83 c4 14 add $0x14,%esp b1: 58 pop %eax b2: 39 c0 cmp %eax,%eax b4: 74 aa je 60 <after_print> 000000b6 <mod>: b6: 39 c3 cmp %eax,%ebx b8: 7f 06 jg c0 <mod_end> ba: 29 d8 sub %ebx,%eax bc: 39 c0 cmp %eax,%eax be: 74 f6 je b6 <mod> 000000c0 <mod_end>: c0: c3 ret
mod_endとかそういうラベルがまだ残ってるのが気持ち悪いね\(^o^)/
確かLから始まるラベルはリンカに行く前に自動的に消えるとかそういう決まりがあったはず\(^o^)/
asm |
手書きだよ\(^o^)/
.file "fb.s" .globl main .section .text .text 0 main: leal 4(%esp), %ecx andl $-16, %esp pushl -4(%ecx) pushl %ebp movl %esp, %ebp pushl %ecx .text 1 movl $1, %eax movl %eax, %ecx loop: movl %eax, %edx movl $15, %ebx call mod cmpl $0, %eax je FizzBuzz /* movl %edx, %eax */ /* since x mod 5 == (x mod 15) mod 5, */ /* the last statement can be commented out */ movl $5, %ebx call mod cmpl $0, %eax je Buzz movl %edx, %eax movl $3, %ebx call mod cmpl $0, %eax je Fizz movl %edx, %eax pushl %eax subl $20, %esp movl %eax, 4(%esp) movl $_Number, (%esp) call printf addl $20, %esp popl %eax after_print: addl $1, %eax cmpl $100, %eax jle loop loop_end: popl %ecx popl %ebp leal -4(%ecx), %esp ret .text 2 Fizz: pushl %edx subl $20, %esp movl $_Fizz, (%esp) call printf addl $20, %esp popl %eax cmpl %eax, %eax je after_print Buzz: pushl %edx subl $20, %esp movl $_Buzz, (%esp) call printf addl $20, %esp popl %eax cmpl %eax, %eax je after_print FizzBuzz: pushl %edx subl $20, %esp movl $_FizzBuzz, (%esp) call printf addl $20, %esp popl %eax cmpl %eax, %eax je after_print mod: /* This subroutine calculates (mod %eax %ebx) returns the mod on %eax. */ mod_loop: cmpl %eax, %ebx jg mod_end subl %ebx, %eax cmpl %eax, %eax je mod_loop ret .section .rodata _Fizz: .ascii "Fizz \0" .align 4 _Buzz: .ascii "Buzz \0" .align 4 _FizzBuzz: .ascii "FizzBuzz \0" .align 4 _Number: .ascii "%d \0" .align 4
文字列の配置に間違いがあったので修正したよ\(^o^)/
.data じゃなくて .rodata に置くべきだったよ\(^o^)/
しょうもないFizzBuzzを書きました。いや、書かせました。
#include <stdio.h> int main(void) { int i; puts("#include <stdio.h>\nint main(void){"); for (i=1; i<=100; i++){ if(0 == i%15){ printf("printf(\"FizzBuzz \");"); }else if(0 == i%5){ printf("printf(\"Buzz \");"); }else if(0 == i%3){ printf("printf(\"Fizz \");"); }else{ printf("printf(\"%d \");", i); } } printf("}\n"); }
FizzBuzzを出力するコードを出力するコード。出力結果は:
#include <stdio.h> int main(void){ printf("1 ");printf("2 ");printf("Fizz ");printf("4 ");printf("Buzz ");printf("Fizz ");printf("7 ");printf("8 ");printf("Fizz ");printf("Buzz ");printf("11 ");printf("Fizz ");printf("13 ");printf("14 ");printf("FizzBuzz ");printf("16 ");printf("17 ");printf("Fizz ");printf("19 ");printf("Buzz ");printf("Fizz ");printf("22 ");printf("23 ");printf("Fizz ");printf("Buzz ");printf("26 ");printf("Fizz ");printf("28 ");printf("29 ");printf("FizzBuzz ");printf("31 ");printf("32 ");printf("Fizz ");printf("34 ");printf("Buzz ");printf("Fizz ");printf("37 ");printf("38 ");printf("Fizz ");printf("Buzz ");printf("41 ");printf("Fizz ");printf("43 ");printf("44 ");printf("FizzBuzz ");printf("46 ");printf("47 ");printf("Fizz ");printf("49 ");printf("Buzz ");printf("Fizz ");printf("52 ");printf("53 ");printf("Fizz ");printf("Buzz ");printf("56 ");printf("Fizz ");printf("58 ");printf("59 ");printf("FizzBuzz ");printf("61 ");printf("62 ");printf("Fizz ");printf("64 ");printf("Buzz ");printf("Fizz ");printf("67 ");printf("68 ");printf("Fizz ");printf("Buzz ");printf("71 ");printf("Fizz ");printf("73 ");printf("74 ");printf("FizzBuzz ");printf("76 ");printf("77 ");printf("Fizz ");printf("79 ");printf("Buzz ");printf("Fizz ");printf("82 ");printf("83 ");printf("Fizz ");printf("Buzz ");printf("86 ");printf("Fizz ");printf("88 ");printf("89 ");printf("FizzBuzz ");printf("91 ");printf("92 ");printf("Fizz ");printf("94 ");printf("Buzz ");printf("Fizz ");printf("97 ");printf("98 ");printf("Fizz ");printf("Buzz ");}
1 2 Fizz 4 Buzz Fizz 7 8 Fizz Buzz 11 Fizz 13 14 FizzBuzz 16 17 Fizz 19 Buzz Fizz 22 23 Fizz Buzz 26 Fizz 28 29 FizzBuzz 31 32 Fizz 34 Buzz Fizz 37 38 Fizz Buzz 41 Fizz 43 44 FizzBuzz 46 47 Fizz 49 Buzz Fizz 52 53 Fizz Buzz 56 Fizz 58 59 FizzBuzz 61 62 Fizz 64 Buzz Fizz 67 68 Fizz Buzz 71 Fizz 73 74 FizzBuzz 76 77 Fizz 79 Buzz Fizz 82 83 Fizz Buzz 86 Fizz 88 89 FizzBuzz 91 92 Fizz 94 Buzz Fizz 97 98 Fizz Buzz
このくだらないのに九分かかりました><
えーと、期待した人はほんとごめんなさい。
さっきのコードは2回もgccしなければならず、とっても大変でした!
「りだいれくと」を知らないと、コンパイルする前に途方に暮れてしまいますし、ね!
それは困るので、コンパイルするだけで実行できるという、本来の位置に立ち戻って書き直してきました。
#include <stdio.h> #include <stdlib.h> int main(void) { int i; FILE *fd; if( NULL == (fd = fopen("_temp_file.c", "w"))){ puts("some sort of a bad file\n"); exit(1); } fprintf(fd, "#include <stdio.h>\nint main(void){"); for (i=1; i<=100; i++){ if(0 == i%15){ fprintf(fd,"printf(\"FizzBuzz \");"); }else if(0 == i%5){ fprintf(fd,"printf(\"Buzz \");"); }else if(0 == i%3){ fprintf(fd,"printf(\"Fizz \");"); }else{ fprintf(fd,"printf(\"%d \");", i); } } fprintf(fd,"}\n"); fclose(fd); system("gcc -o _temp.exe _temp_file.c; ./_temp.exe; rm _temp.exe _temp_file.c"); }
どう見てもあろはくんのパクリですね!本当にありがとうございました!!
独創性が欲しいなぁ。(切実)
["aaa","bbb","ccc","aaa"]というリストがあったときに"aaa"という入力より["aaa","aaa"]という出力を得たい、という感じ
http://twitter.com/syou6162/statuses/770298353
それLispで。
と思ったので、とりあえず書きました。Common Lisp 。
(defun element-in-tree (tree a) (cond ((null tree) nil) ((atom (car tree)) (cond ((equal (car tree) a) (cons a (element-in-tree (cdr tree) a))) (t (element-in-tree (cdr tree) a)))) (t (cons (element-in-tree (car tree) a) (element-in-tree (cdr tree) a)))))
ツリーに対して、位置関係を把握したまま実行できます。
それだけじゃつまらないので、書いたことのない OCaml で書いてみた。
# let rec element lst atm = match lst with [] -> [] | a :: rest -> if a=atm then a :: element rest atm else element rest atm;;
こっちが動作するのはリストに対してのみ。
なんだか変数名が胡散臭いし、OCamlらしいコードかどうかもとっても疑わしい。
けど、言語仕様を確かめたりする良い練習になったので、今夜のところはひとまずよし、かな。
ツッコミは常に大歓迎です。特にコードや考え方の不備を指摘されるととっても喜びます。
OCaml |
# let exp = fun lst atm -> List.filter (fun a -> a = atm) lst;;
こ れ で 終 わ り ! !
一回しか使わないなら、 List.filter(fun a -> a = "hogehoge") だけでその関数の意味になる*1。(組み込みの)高階関数は超便利ですね、びっくりした。
hogelogfilter ("aaa" ==) ["aaa", "bbb", "ccc", "aaa"]
「Haskellでは組み込みの関数を組み合わせて目的とする処理を成し遂げるのがKool!」ってばっちゃが言ってた。
OCamlだとList.filterがあるからやっぱそっち使うとか。
SchemerとかSICPとかやると組み込みの便利なほげほげを使うという発想が消えるという楽しさがあるね。
suu-gツッコミありがとう!
さっそくList.filterを使ってみたけど、組み込みの高階関数って本当に便利なのね。
syou6162ふむふむ
hogelog個人的には、引数の順序はこうしたい気もする。
let exp atm lst = List.filter (fun a -> a = atm) lst;;
そしたら(exp "hogehoge")でatmだけ束縛して、簡単に「"hogehoge"と一致する要素だけとってくるフィルター」とか作れて良い気がした。lstだけ束縛した関数はあんまし使いどころ無さげな気するし。
suu-gあ、なるほど、fun a b -> hoge っていうのは fun a -> fun b -> hoge の構文シュガーみたいなものなのか。
(いま手計算してみて、引数の順番が変わらないことにちょっと驚いた)
部分適用って非常にλで良いですね!
suztomosuu_gはcurry化を身に着けた。
hogelogまさしくシンタックス糖衣です。
JacobyUmm, are you rellay just giving this info out for nothing?
mfdndilgkV8vOV , [url=http://ccvwujowdagl.com/]ccvwujowdagl[/url], [link=http://degassodawgp.com/]degassodawgp[/link], http://zydtyyasleze.com/
ケフィア |
id:yuyarin が名札のテンプレートを公開してくれていたので、mspaintにて編集してMY名札を作ってみた。普通だ、普通すぎるッ…!!!
id:hogelog のクオリティにはかなわない。
id:suu-gですよ!
普段利用しているその他のサービスをちょっと紹介しますよ。
SkypeID : suu_g_boden
メールは titius6boden を爺メールまで送ってくれれば届きますよ!
よろしくお願いします!!
*1:ちょwwwid:suztomowwwまだ書き途中ww