プロフィール
| |
- Author:あろは (alohakun)
- 若槻俊宏 (WAKATSUKI toshihiro)
連絡先 : alohakun ___at___ gmail.com mixi : http://mixi.jp/show_friend.pl?id=182927 twitter : http://twitter.com/alohakun
abstract
プログラミングという人間の知的行為を体系化し,単なる職人芸ではなく,サイエンスにするための研究をしています.
具体的には,等価変換計算モデルに基づいた,仕様記述からのプログラム合成の研究をしています.
もっと噛み砕くと,プログラムの正しさをどのように定式化し,どのような枠組みで,どのように変換を進めていけば,正しさを保証したまま,効率的なプログラムを手に入れることができるのか,ということについて研究しています.
キーワード : equivalent transformation, computation model, programming paradigm, formal specification, program synthesis





|
FC2カウンター
| |
|
ブロとも申請フォーム
| |
この人とブロともになる
|
|
ET Q&A
| 2008/07/29(火) 19:11:50
|
問い詰める会 wiki の方で質問されて (私の不勉強により) うまく答えられなかったことを,研究室の M 先輩を問い詰めて (笑) いろいろ教えていただいたので,ちょっとまとめてみます.
たぶん Web 上での議論には限界があるので (また収集がつかなくなる),さらなる疑問点などは,問い詰める会などでよろしくお願いします.コメント欄などに質問をオープンな形でメモするぶんには大歓迎です (レスはあまり期待しないでください)
(免責 : これは私の理解,解釈であり,間違いは全て私の責任です) # というか,問い詰める会は,理論的なことをちゃんとやってる M 先輩とかが行った方が (笑)
Q. 正しさの根拠の違い
命令型 : アルゴリズムの一実装 (コーディング).正しさの議論が困難.仕様 (what) の概念無し.how そのもの
関数型 : how を書くことには変わりないんだけど,プログラムを数学的にすることにより,プログラムが特定の性質を持つことの検証をしやすくする (数学的に検証できるからより確からしいよ派)
論理型 : プログラム = 論理式の集合は問題の定義そのもの (公理).公理から演繹できるものは全て正しいよ派
ET : 上の全部ができない,プログラムの仕様に対する正当性がちゃんと議論できる理論になっている.
Q. Prolog と ET ってどう違うの ?
Prolog は,仕様 = プログラムなので,プログラムを改善しようと思ったら,仕様自体を変えないといけない.次々と公理を変更したり,増やし続けないといけない.だけど,そうなると,D 自体が変わるのに,D に対する正しさ,正しさの根拠をどうやって議論するの ? (できない)
ET は,仕様とプログラムの空間がわかれているので,プログラムを,新しいルールの探索により,段階的に改善していくことができる.
具体例
論理式の集合 D が与えられたとする.ここは Prolog と同じ.
(append () Y Y) <-. (append (X | Xs) Y Z) <- (= Z (X | Z1)), (append Xs Y Z1).
どうやってこれを動かすか ?
Prolog は,SLD 導出という,正しさが保障される推論方法 (アルゴリズム) によって実行する. ET は,仕様から,搾り出し方やメタ計算と呼ばれる,必ず仕様に対して正当な ET ルールを生成する(半)自動アルゴリズムによって,ルールを生成して実行する.
実行とは,質問を展開(書き換え)ていくこと.質問の集合 Q の最大の集合は,D に依存して決まる.D で定義されてない質問には回答できない.
でも,別に,常に想定される最大の Q に対してのアルゴリズムを生成する必要は無い.Q をもっと限定すると,可能な最適化がいろいろと出てくる.
例えば,必ず第一リストはグラウンド(変数じゃない)などの制約.(append (12) Y Z) とか,(append () (1 2) (1 2) とか (append (1 2) (3 4) Z) とか,そういう限定された加算無限集合が Q. そうすれば,X が変数の場合をケアするアルゴリズムが不要になる.
ET の世界では,D と Q の組 <D, Q> を仕様 (specification) と呼ぶ.
ここらへんから,だんだんと Prolog と離れていく.Prolog の世界は,常に最大の Q を想定するから,D と独立した最適化には限界がでてくる.
ET では,最適化のために,Q を限定するだけで良いのに,Prolog では D を直接変更しないといけない.
Q を非常に限定していくと,プログラムに非決定性は不要になります.特定の入力に対して,一つの出力を出す関数になる.そうすると,より効率的な,決定的なルール (D ルール) でプログラムを表現できます.Prolog の場合は,cut とか使って,直接 D を書き換えないと,手続き (決定的なアルゴリズム) は表現できない.
Q が固定 (常に最大) の世界では,ET と Prolog では,与えられた確定節の集合 D に対する意味はほぼ同じ.
確定節の意味とは,Prolog では任意有限回の推論で得られるアトムの集合. ET は,データ構造をパラメータ化してる(特殊化システム) ので,それのより一般的な定義になっている (推論とかいう,Logic Programming に依存する概念は入ってない).
ここから,完全に ET と Prolog の世界は変わる.ここから先の世界が,Prolog では到達不可能な世界.
Prolog の世界では,D からは一つの正当なアルゴリズムしか得られない.アルゴリズムを変えようと思ったら D を直接変えないといけない.これが本質的な問題点.一つの D に対して,一つの手続きしか得ることができないので,それ以上の改善ができない.
ET の世界では,ET ルールを D から出した後,D とルールの世界 (Prog とする) が明確に分かれているから,D を変更することなく,D に対する正当性を厳密に議論できる世界で Prog を改善することができる.
具体的には (トリビアルな例だけど) 結合法則
(append *A *B *C), (append *X *C *Z) ==> (append *X *A *D), (append *D *B *Z)
みたいな手続きは,Prolog では絶対に探索できない,その正しさも証明できない.
ET の理論では,D から直接得られる,正しさが証明されたET ルールを,いわば公理のルールとして, 上のルールも ET ルールであることが証明できる.右辺と左辺を,最初に得られた ET ルールで展開していって,同じ単位節が得られれば,これもまた ET ルール.そして上のルールを ET ルールとして Prog に追加することができる.D は無変更なので,相変わらず D に対する正当性は完璧に保存されているし,議論できる.このようにして,Prog を膨らませていくことにより,より良い手続きを探索することができる.
そもそも Prolog はホーン節の世界だから,ヘッドは一個だけしか許されないんだけど.
そういう狭さは,まぁ本質ではない.CHR とか,Prolog の後継のような言語は,ヘッド*部* に複数の制約の記述を許しているんだけど.CHR も,結局は Prolog と同じ,D と Prog が分かれてないという問題点は解決できていない.
要するに,Prolog も CHR も,ET の世界のごく一部しか表現できない狭い理論ということ (よくある,言語間の優位性戦争なんかとは本質的に異なる.科学的に構造の優位性が証明されている)
Q. 北大の TA ではどんなことを教えているのですか ?
忘れなければ,問題とテキストを印刷して持って行きます.
テキストの一部はここらへんから (ちょっと古い ?)
ETプログラミング入門テキスト(Dルール編) ETプログラミング入門テキスト(Nルール編) (現在トップからリンク張って無いので,見てよいものなのかは謎だけど)
(ET SITE)
ちょっと今時間無いので,推敲せずにアップ.
|
ET|TB:0|CM:0|
|

▲
| |
|
5.25 インチ光学式ドライブ用外付けケース
| 2008/07/27(日) 20:00:30
|
Thinkpad X61s には光学式ドライブが付いてないのでいろいろ不便です.研究室のアカデミックパックの MS-Office とかもインストールできません.
普通に USB か何かの外付けドライブを買っても良いのですが,けっこう高い.近所の PC ショップとかだと,一番安い中古でも 7 〜 8 千円前後はする感じでした (今時 CD-ROM だけのドライブとか売ってないし,たぶん逆に高い.外付け FDD でさえ 3 〜 5 千円ぐらいしてるし!Thinkpad X61 純正外付け FDD なんて 8 千円とかする)
どうしたものかな〜と思っていたら,IDE-USB の変換するやつさえあれば,デスクトップ機のドライブを外して note PC で使えるという情報を小耳に挟みました (昨日の北海道関数型言語勉強会の @osabou さんに感謝)
ヨドバシカメラで店員の人に聞いてみたら,なんか微妙に高い (7 千円前後) ものしか無かったのですが.北大前のじゃんぱらで,何やら怪しい商品を発見.3 千円と比較的安価.
メーカー:TIMELY 型番:R-CASE5.25B
けっこうデカいですし,ファンの音が大きいのですが,デスク機のコンボドライブを外して組み立てたら,普通に使えました.なんか説明書に,ドライブのジャンパーピンをマスターにするとか書いてたのですが,うちの (パソコン工房のオリジナル.5 年ぐらい前に OS 無しで 6 万円ほどで購入したもの)はなんにも無かったので,何もしなくても使えました.
デスクトップの光学式ドライブは比較的安い上に,速度が圧倒的に速いので,普通に外付けドライブを買うよりも拡張性が高くて良いんじゃないかと思います.どうせドライブなんて普段は持ち運ばないわけですし.
Linux でも,刺すだけで認識してくれる感じです./dev/sr0 あたりを mount したり,ogle とかの DVD に設定して Open すれば,普通に使えます.今まで通りデスク機でもドライブが使えるわけなので,このまま外付けのケースに入れたまま使い続けようと思います (デスク機にぽっかり空洞ができてしまったので,今は適当なビニール貼ってる)
# なんか画質がかなり乱れてしますいますが… どこが原因なのかの切り分けがまだできてません(ogle で開いたんですが,mpalyer とかだと普通に見えるのかも.今ちょっと apt-get dist-upgrade で mplayer の update がコケて,一時的に uninstall してる)
[ 1114.057947] usb 4-5: new high speed USB device using ehci_hcd and address 3 [ 1114.190952] usb 4-5: configuration #1 chosen from 1 choice [ 1114.193971] usb 4-5: New USB device found, idVendor=05e3, idProduct=0701 [ 1114.193984] usb 4-5: New USB device strings: Mfr=0, Product=1, SerialNumber=0 [ 1114.193988] usb 4-5: Product: USB Storage [ 1114.318208] Initializing USB Mass Storage driver... [ 1114.320571] scsi0 : SCSI emulation for USB Mass Storage devices [ 1114.321108] usbcore: registered new interface driver usb-storage [ 1114.321115] USB Mass Storage support registered. [ 1114.330826] usb-storage: device found at 3 [ 1114.330835] usb-storage: waiting for device to settle before scanning [ 1119.364129] usb-storage: device scan complete [ 1119.364718] scsi 0:0:0:0: CD-ROM COMBO IDE4816CO 0037 PQ: 0 ANSI: 0 CCS [ 1119.432136] Driver 'sr' needs updating - please use bus_type methods [ 1119.437223] sr0: scsi3-mmc drive: 16x/16x writer cd/rw xa/form2 cdda tray [ 1119.437235] Uniform CD-ROM driver Revision: 3.20 [ 1119.437332] sr 0:0:0:0: Attached scsi CD-ROM sr0 [ 1119.472173] sr 0:0:0:0: Attached scsi generic sg0 type 5
まだ CD 焼けるかとかは未検証ですが,一応ちゃんと情報取れてるみたいです.
# cdrecord dev=/dev/sr0 -scanbus scsibus0: 0,0,0 0) 'COMBO ' 'IDE4816CO ' '0037' Removable CD-ROM 0,1,0 1) * 0,2,0 2) * 0,3,0 3) * 0,4,0 4) * 0,5,0 5) * 0,6,0 6) * 0,7,0 7) *
|
メモ|TB:1|CM:0|
|

▲
| |
|
LLVM 2.3 を動かしてみる
| 2008/07/23(水) 13:13:54
|
なにやら @/id:TAKESAKO さんから 「8/30 の LL Future でパネルディスカッション や ら な い か ?」 (もちろん,実際はもっと非常に丁寧な文章です) というお誘いを受け,ホイホイ快諾してしまったら 「なにやら llvm-gcc を使ってブラウザ上で C とか Python のコードを動かすという構想があるそう.というわけで 『gcc と LLVM が紡ぎだす未来 〜ブラウザで言語処理系を無理やり動かして未来を先取りする〜』 みたいなことをテーマに,gcc フロントエンドとか LLVM とか AVM2 とかと LL の未来についてネタふりしてパネラーの皆さんと楽しく議論してください,超期待してます」 と,いきなりものすごいプレッシャーが.
Running C and Python Code on The Web C言語をブラウザで実行、Ruby/Python/Perlも然り
なんと交通費まで出していただけることになったので,せめて交通費 + チケット代ぶんぐらいの働きはしないと申し訳なさすぎる.「LLVM は初心者ですが頑張ります」
というわけで,まずは hello, world.
YT さんのブログ連載を読んでいると,LLVM イマイチすぎるなという印象を禁じえなかったわけですが (もちろん,LLVM をターゲットとする独自言語のコンパイラを一から書こうとか変なことを考えなければ,もう十分に実用レベルの技術になってます.COINS とかもそうなんですけど,C とか,公式に対応している以外の言語のコンパイラを書こうとすると,とたんにあの機能も足りない,この機能は未実装かッッ!となるのですが…)
最近,最新版の LLVM 2.3 がリリースされたようなので,改善に期待しつつのんびり見ていきましょう.
とりあえず,公式サイトから Windows mingw 用バイナリを落として解凍 (以下,MSYS + MinGW 環境) http://llvm.org/releases/2.3/llvm-2.3-x86-mingw32.tar.bz2
aloha@LENOVO-A41D2048 /c/tmp $ tar jxvf llvm-2.3-x86-mingw32.tar.bz2 llvm-2.3/ llvm-2.3/bin/ llvm-2.3/bin/bugpoint.exe llvm-2.3/bin/fpcmp.exe llvm-2.3/bin/llc.exe llvm-2.3/bin/lli.exe llvm-2.3/bin/llvm-ar.exe llvm-2.3/bin/llvm-as.exe llvm-2.3/bin/llvm-bcanalyzer.exe llvm-2.3/bin/llvm-db.exe llvm-2.3/bin/llvm-dis.exe llvm-2.3/bin/llvm-extract.exe llvm-2.3/bin/llvm-ld.exe llvm-2.3/bin/llvm-link.exe llvm-2.3/bin/llvm-nm.exe llvm-2.3/bin/llvm-PerfectShuffle.exe llvm-2.3/bin/llvm-prof.exe llvm-2.3/bin/llvm-ranlib.exe llvm-2.3/bin/llvm-stub.exe llvm-2.3/bin/llvmc2.exe llvm-2.3/bin/opt.exe llvm-2.3/bin/tblgen.exe
Java で言うところの jasmin (バイトコードアセンブラ) が llvm-as.exe で,java (VM + JIT インタプリタ) が lli.exe,javap (逆アセンブラ) が llvm-dis.exe なんでしょうか.他は gcj (GNU Compiler for Java) みたいに,バイトコードからアセンブラを生成したりするときのツールチェインみたいです.
とりあえず YT さんところの hello-world-llvm (ネタ元は既にリンク切れ) を実行してみましょう.
aloha@LENOVO-A41D2048 /c/tmp/llvm-2.3/test $ cat test.ll
@.LC0 = internal constant [13 x i8] c"Hello world!\00"
declare i32 @puts(i8 *)
define i32 @main() { %cast210 = getelementptr [13 x i8]* @.LC0, i64 0, i64 0 call i32 @puts(i8 * %cast210) ret i32 0 }
$ ../bin/llvm-as.exe test.ll $ ls test.bc test.ll test.ll~
$ ../bin/llvm-dis.exe test.bc
c:\tmp\llvm-2.3\bin\llvm-dis.exe: error opening 'test.ll': file exists! Sending to standard output. ; ModuleID = 'test.bc' @.LC0 = internal constant [13 x i8] c"Hello world!\00" ; <[13 x i8]*> [#uses=1]
declare i32 @puts(i8*)
define i32 @main() { %cast210 = getelementptr [13 x i8]* @.LC0, i64 0, i64 0 ; [#uses=1] call i32 @puts( i8* %cast210 ) ; :1 [#uses=0] ret i32 0 }
$ ../bin/lli.exe test.bc Hello world!
$ ../bin/llc.exe test.bc $ ls test.bc test.ll test.ll~ test.s
$ cat test.s
.text .align 16 .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp Llabel1: movl %esp, %ebp Llabel2: subl $8, %esp call ___main movl $_.LC0, (%esp) call _puts xorl %eax, %eax addl $8, %esp popl %ebp ret .data _.LC0: # .LC0 .asciz "Hello world!" .def _puts; .scl 2; .type 32; .endef
$ gcc test.s
This application has requested the Runtime to terminate it in an unusual way. Please contact the application's support team for more information.
あらら.たぶん C ランタイムへの依存性とか書いてなかったのが悪いのかな. 一回 llvm-gcc も download して,C から llvm コードを吐かせてみた方がよさそうかも.
とりあえず,ネイティブコードまで落とさなければ実行可能みたいですね.puts が呼べているのは,lli.exe が何やら勝手に libc の関数を呼び出しているらしい.
llvm-gcc を使えば,普通に実行ファイル作れますね.
$ tar jxvf llvm-gcc4.2-2.3-x86-mingw32.tar.bz2 $ cat test.c #include<stdio.h>
int main() { puts("hello, world!"); return 0; }
$ ../bin/llvm-gcc.exe test.c $ ls a.exe test.c test.c~
$ ./a.exe hello, world!
llvm のバイトコードも吐かせることができて,こんな感じになります.
$ ../bin/llvm-gcc.exe -emit-llvm -S test.c $ cat test.s ; ModuleID = 'test.c' target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32"
target triple = "i386-mingw32" @.str = internal constant [14 x i8] c"hello, world!\00" ; <[14 x i8]*> [#uses=1]
define i32 @main() nounwind { entry: %retval = alloca i32 ; <i32*> [#uses=2] %tmp = alloca i32 ; <i32*> [#uses=2] %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0] %tmp1 = call i32 @puts( i8* getelementptr ([14 x i8]* @.str, i32 0, i32 0) ) nounwind ; <i32> [#uses=0] store i32 0, i32* %tmp, align 4 %tmp2 = load i32* %tmp, align 4 ; <i32> [#uses=1] store i32 %tmp2, i32* %retval, align 4 br label %return
return: ; preds = %entry %retval3 = load i32* %retval ; <i32> [#uses=1] ret i32 %retval3 }
declare i32 @puts(i8*)
|
LLVM|TB:0|CM:2|
|

▲
| |
|
知識表現とProlog / KR
| 2008/07/20(日) 21:21:25
|
えらく古い本 (1985) ですが,たまたま研究室に転がっていたので眺めていたら,けっこう面白かったのでメモ.
知識表現とPROLOG/KR
ET 言語の,D ルールの定義構文 (as *Head | *Body) とか,変数の頭に * (アスタリスク)が付くのとかも,Prolog/KR の as 構文 (assert の略らしい) なのかな ? Prolog/KR も変数の頭に * が付くのか,とか,こういう由来系の情報ってのは面白いです.
Prolog/KR ってのは Lisp と Prolog の融合を進めたような言語のようです.というか,Lisp で書かれた Prolog 処理系のようです.
知識表現の利便性のために拡張された Prolog であり,多重世界の概念でプログラムの階層化(モジュール化)を可能にするそう.特に,AI における知識フレームなどが,一世界一概念という形で素直に対応付けられるらしい.
Prolog/KR は,もともと Utilisp [Chikayama 1981] (日立,富士通のMシリーズ,IBM370 で動く)上に作製されたが,現在 Franzlisp (VAX Unix),Maclisp (DEC-20),Zetalisp (Lisp マシン) の版がある.Lisp マシン版は多重世界機構の拡張とともに Uranus と呼ばれている. (p.70)
あたりに,非常に時代を感じますが,本の内容自体は (非アカデミックの水準では ?) それほど古びてない感じですね.
多重世界機構とか,リストでプログラムが表現されている(メタ記述が容易)とか,パターンマッチング機能がある,自動バックトラッキング部分と,決定的な部分が分離されているのでユーザが任意のプログラミングスタイルを選択できる,などは,まんま ET 言語にもあてはまりますね.なるほど,かなり大きな影響を受けているようです.ET のワールド機構,D ルールと N ルールの区別,単一化とパターンマッチングの分離 (Prolog から,より純粋なルール型言語へ.高レベルから低レベルまでを柔軟に記述可能) などにそのまま対応します.
多重世界機構の応用例として,Smalltalk の持つクラス間の階層構造を,そのまま素直に多重世界の入れ子構造で表現して,Tiny Smalltalk の処理系を十数行で実装したりしたりとか,なかなか面白い本です.
ちょっと検索したみたら,こんな記述も.
100 年 Windows 横山哲也 2006年09月12日 渕一博氏を偲ぶ
Prologは,プログラム言語としてはかなり未完成であった。例えば,まともなプログラムを書くには,カットオペレータという演算子が必須である。ところが,カットオペレータの強力さと単純さはGOTO文の比ではなく,結果としてプログラムの見通しは極めて悪いものとなった。そこで,研究者の間では,述語論理型言語にどのような制御構造が必要かという考察が行われていたことを記憶している。私は,自分の研究に,中島秀之氏(現公立はこだて未来大学学長)の作成したProlog/KRを使うことにした。当時,オンライン・コミュニティはあまり発達しておらず,中島氏が所属していた東京大学まで電話をして磁気テープを送ってもらったことを覚えている。もちろんオープンリールである。
Prolog/KRは,LispとPrologと融合した言語で,十分な制御構造が備わっていた。ただし,追加された制御構造は手続き型の側面が強く,述語論理の特徴を生かせていたとは言い切れない。ところで,どうでもいいことだが,1986年に広島で開催された情報処理学会全国大会で偶然中島氏をお見かけしたので,著書にサインをいただいた。今でも大事にとってある。
一方,ICOTではPrologを拡張したGHC(Guarded Horn Clause)をベースに,KL-1を開発した。こちらは,述語論理の特徴を生かし,さらに並列処理まで実現していた。ただ,Prolog固有の構文が色濃く残っており,慣れないと使いこなすのは難しいだろう。
追記
Common Lisp 上で動く Prolog/KR 処理系が存在するようです.
Uranus Prolog/KR
|
Book|TB:0|CM:0|
|

▲
| |
|
Thinkpad X61s (7666-77J) 購入
| 2008/07/17(木) 20:57:27
|
5 年ぐらいぶりに新しい PC 買いました.あと,我が家で初めての Windows 機です.
ずっと,学会やゼミ,勉強会などのために,持ち運びがしやすい note PC が欲しかったのですが.
期待していた新型の EeePC も,高い重いデカいと散々な感じで,一時は MacBook の中古で良い出物があった (core 2 duo 2.0 GHz / Mem 2 G / 英語キーボード) ので,心が動きかけたのですが.やはり,白い note PC とか無いなと (あと,大きくて持ち運びしんどそうだし.Mac はハードの選択肢がほとんど無いのが…).
そんなこんなでいろいろ悩んでいたところ,タイムリーなことに,先週の i-うぃん堂 の特価セールで,Thinkpad X61 と X61s が同じ値段で安売りされていました.夏の感謝セールとかで,送料が無料の上,8 万円以上のアウトレット品を買うと無料でメモリ 1 GB 増設キャンペーン (計 2 GB積まれる) とかもありーので,代引き手数料込みで 85430 円.
やはり Thinkpad は超カッコいい.これだよこれ,他の軽量モバイル note PC など全くに相手にならない.これは買うしか無いでしょう.
X61 と X61s のどちらにしようか迷ったのですが,
(1) 基本的に s の方が軽量化のため元値が高価 (231000 円 vs 168000 円)なのでお得 (まぁ,アウトレット品なので微妙なんですが)
(2) X61 の方は CPU クロックが上 (core 2 duo 2.2 GHz) なのは良いものの,発熱量が多そう (Matz さんが低温火傷という事例あり).X61s は 1.4 GHz なので,クロックは下ではあるが,もともとモバイル note PC に速度など求めてないので,発熱量が低い方が良いに決まってる.
(3) X61 は Windows Vista が初期インストール (X61s は XP) だが,おそらくビデオチップがチップセット内臓で,メモリが 2 GB 程度で HDD も低速の X61 では使い物にならない
(4) X61s ならば重量も 1.3 kg 弱ぐらいなので,1 kg 弱ぐらいの UMPC と重さ自体はそれほど変わらない (X61 だと 1.43 g ぐらいで 500 g ぐらい違う).
というわけで X61s に決定しました.X61 が X30 系列 (パワフルモバイル)で X61s が X40 系列 (スリムモバイル) らしいです.
僕は Thinkpad の X40 に強い憧れがあったのですが,その後継機種がこんなに安く手に入るとは.
防水キーボードでコーヒーがこぼれても大丈夫,「火事の炎にさらされ、消火ホースからの水を浴び、2階の窓から放り投げられ、さらに数昼夜の間ずぶ濡れになった家財道具の残骸にまみれ」ても全てのデータが無事だったなど,数々のレジェンドに彩られた愛すべき過剰品質,プロフェッショナル御用達の高級機種の代名詞だった Thinkpad.
それが中国企業 lenovo によりコモディティ化し,単なるイチ家電製品になってしまったということなのでしょうね.常に僕達の憧れだった,赤緑青に輝く IBM のロゴが消えてしまったのは悲しいですが,そのおかげで,僕のような貧乏学生の手にも届く価格帯にまで降りてきてくれたわけで,これはこれで大変素晴らしいことだと思います.
まだ今のところは IBM のチェックもしっかりしていて,生産体制にも以前と比べて大きな変化は無いようですし,X61 は評判がなかなか良い感じです.大事にしようと思います.
|
メモ|TB:0|CM:0|
|

▲
| |
| |
|
|
最近のコメント
| |
| リンク
| |
このブログをリンクに追加する
| 最近のトラックバック
| |
| 人生の残り日数
| |
日本人男性の平均寿命は 28700日.
| RSSフィード
| |
| カテゴリー
| |
|
|