つーか、最近の夢ではだいたいヤバいことばかり置こる。 目がさめてから「リセットされててよかった!」と思うことが多い。 むかしはこんなじゃなかったような気がするけどなあ? これは現在のオレの微妙な焦りを省庁しているのか何か。
COMPUTER SCIENCE COLLOQUIUM Friday, February 4, 2005 - 11:30 a.m. Room 1302 Warren Weaver Hall 251 Mercer Street New York, NY 10012-1185 Speaker: Andries van Dam, Brown University Title: Immersive Virtual Reality in Scientific Visualization
さっき廊下を通りかかったら、Ralph が IBM 製の電動タイプライタで フォームをがっちゃんがっちゃん打っているのに出くわした。ビックリ! 「わーお! これ動くんだ!?」と言ったら、「そうだよ、こいつはじつに信頼性があっていいんだ」という。 すばらっし。このタイプライタには前から目をつけていたのだが (キータッチが非常にいいので)、 通路の真ん中に放置してあるし、てっきりもう動かないガラクタだと思っていた。 今度ためしてみよー
google://島インフルエンザ/ (736Ken)
Web を検索していると、ときどき新山が決して使うことのないであろう ソフトウェアのページが沢山みつかる。それは Windows 用の 「シェアウェア」というやつで、html をテキストに直すとか、 swf から mp3 を抽出するとかのツールだが、 一体誰がそんなもんに $30 も払うんだよ?? っていうのが沢山ある。で、英語版に限定すると、フリーで (Windows用で) そういうツール (テキストエディタなど) をさがすのは大変むずかしい。 あるのかもしれないが、シェアウェアがどこでもスゲーめだっているのである。 しかし、日本って「フリーソフトウェア」では全然めだたない国だが、 じつは Windows 用の「フリーウェア」はすごく多い国じゃないだろうか。 しかも見つけやすい。あんまり最近の事情はしらないが、Windows では 圧縮ツールにしてもエディタにしても vector かなんかで、フリーでそこそこのものが 揃うことが多かった。どれも日本人が作った日本語オンリーな バージョンで、おそらく英訳したら大ウケだろう、と思うものも結構あった。 しかし英語ではかなりクダラナイものまで全部シェアウェアである。 これは単なる新山の錯覚なのか、あるいは本当にこういう差があるのか、 オレにはあんまりきちっと判断できないのだけど、日本のフリーウェアが多いのは 「ソフトウェアに金なんか払う必要ない」というアジア的な思考によるためだろうか? それとも日本人のほうが拝金主義じゃないということなのか。
しかし、日本の一般人が所詮は MS におんぶにだっこなのに対して、 米国では本当に「OS レベルから」フリーでやろうとしている人が多いから、 単にスケールの違い、ということなのかな。よりラディカルに考えれば、 アプリケーションだけフリーになってもしょうがないのだから。
うそ。ほんとは、ちっともうらやましくない。
どうでもいいけど、アドリア海ってどこだろう??
てくるで、このあいだ話してるときに、うっかり「BGM」という単語を 使ったら「BGM って何?」と真顔で聞きかえされた。こちらでは日本製の あcろnymは使えないのことが多かろい。
そういえばきのうはまた MoMA に行き忘れた。 金曜の夕方はタダなのでいつか行こうと思っているのだが…。 つうか、そんなことやってり場合じゃなかったね。
いつもさ、思うんだけどさ、朝このページを書いてるときは そんなに 1日 数十行も書く気なんかぜんぜんないのよ。 ところがなぜか夜になってみるといっぱい書かれているのな。 一日をひとことで終わらせられたらどんなにかいいだろう、とは思う。が、 残念ながらそれをするにはオレの中の余白は小さすぎる。ふぇるまっと
なーんと! つまりつまり稽古とは「昔のこと」を習うものでなければ いけなかったのである。つまりつまりプログラミングはもう昔 (=60年代) のものだから、 これからは「お稽古」というコトバをつかってもいいのね。 しかし芝居はなぜか「稽古」というのにプレゼンの練習はなぜ稽古とは呼ばないんだろ?(名) -スル 「古(イニシエ)を稽(カンガエ)る」の意
きょうは日がさしても全然気温が上がんない。 日が当たっているのに、道路の氷はまだ石みたいに固く灰色になっている (温度が低いので氷は白くないのです)。
ちなみにオレは、ひらがなで書いたときは「こんにちは」という表記をふつう使うが、 なぜかカタカナのときは「コンニチワ」のほうが好きだ。 なんか、「ワ」の部分がいかにも「ワ」ってかんじでいいのである。 意味が不明だって? ああーそうですよねーオレもですよオレもですよ奇遇だね奇遇だねさようならさようならもう来るな。 この「ワ」っていう文字は、ぜったい擬口文字 (口の形をまねている) だと思う。 そう信ずることにする。おしまい
こういうクダラヌことを書くからアレがアレしているのだ。
(アレ1 = 容量, アレ2 = 増加)
ところで今日(こんにち)のころきあについて。 "generation" とかいう単語が入ってたので、なんかこれは線型代数の 専門用語なのかと思っていたら、行列演算をするライブラリをほんとに 自動で生成するという研究なぬであった。 この行列演算アルゴリズムというのは奥が深く、たとえば逆行列を求めるだけでも 10種類以上の異なる手法があり、用途やアーキテクチャによって それぞれ適不適があるのだそうな。たとえば スパコンなどではわざわざ行列演算に 特化したメモリアーキテクチャを持たせたりしているが、これで 極限までスピードを追求するにはそれなりのアルゴリズムが必要である。 また激しく並列化されたハードの場合はそのアルゴリズムも並列化可能なものでなければならない (おもしろいことに、並列処理の効率は CPU の utilization が高いほどいいとされている、 つまり「ヒマな CPU」が少なく全員をつねに忙しくさせておけるのがいいアルゴリズムとされているのだ)。 そういえば、この分野はいまだに FORTRAN が使われていたりするな (それはちっとも奥が深いことにならないが、FORTRAN ってのは変数が全部グローバル割り当てなので スピードを追求するにはいいらしい)。で、今日の研究のキモはこういう 行列演算のアルゴリズム (というか、最終的に「ほしい結果」) を 形式仕様言語で書いて、それを自動的に手続き型コードに落とすというものだった。 で、この手のライブラリは「テストによる正当性」ではなく、 「形式的な正当性 (formal correctness)」が欲しいと。 これも行列演算に限っているから成功しているといえる。まず初期化があって、 ある決まった (予測可能な回数の) ループがあって、それが終わると結果ができている、という枠組みは あらかじめ定められている。ここにループ条件と不変式 (invariant) を与えるといろいろな 制約条件を考慮しながらコードができるのだが、つまり「知識」としての計算手法は 不変式のかたちで (ある程度は宣言的に) 与えられるわけだ。逆にいえばそれを知っていないと ダメなのだが、逆にそれさえできればあとは異なるアーキテクチャのために手続きに直す部分は 自動というわけね。いまの段階ではまだ複数のアルゴリズムを出力するだけで、どれが 並列システムに向いているかとかまでは判定できないらしいが、将来的にはそういうことも 考えているといっていた (もっともそれは彼の担当ではないらしいが、プロジェクト全体としては)。 でも不変式って簡単に書けるものじゃないよ。不変式ってのはループ中で使われる変数をなんらかの形で ふくんでいなければならないのだが、この場合は行列を decompose する方法を指定しなければいけないので かなりやっかいだと思う。…まあ、こういうのを使うのは数学屋さんだと思うので 彼らはそういう書き方になれているのかもしれないけど。 コード生成の研究という意味ではおもしろかったが、新山は行列演算にはまったく興味がないのだった。 一部の人々とは違うから!
でも助からないような気もする。
助からられない。
All your belongings are based on us.
sorenisitemo samui.
元気になると途端にいつものハイテンションに戻るのがオレのいいところ。 (と、自分で思っている馬鹿)
買いすぎたのでオフィスにきてからあちこちにくばる。おれってヘンな奴。
今週はあんまりわかんなそうだけど一応でとく。COMPUTER SCIENCE COLLOQUIUM Friday, January 28, 2005 - 11:30 a.m. Room 1302 Warren Weaver Hall 251 Mercer Street New York, NY 10012-1185 Speaker: Paolo Bientinesi, The University of Texas at Austin Title: Toward a Final Generation of Linear Algebra Libraries
Firefox を起動すると次のようなメッセージがでる場合がある:
Extension System Warning: Failed to set up default extensions files
probably because you do not have write privileges to this location.
While you can run Firefox like this, it is recommended that you run it
at least once with privileges that allow it to generate these initial
files to improve start performance. Running from a disk image on MacOS
X is not recommended. *** loading the extensions data source
このような場合、なぜか Extension Manager で 拡張機能 が使えなくなる。 (keywords: Firefox, Extension Manager, 使用 不能, 使用 不可能, 使えない, 使う方法)
この問題の解決方法: root で一度 firefox を起動し、終了する。 次回から一般ユーザで起動してもこのメッセージは消え、Extension も利用できるようになる。
以上です。
nylug みーてぃんぐ。きょうのゲストは Elliotte Haroldさんで、 XML 界ではそれなりに有名なのか? じつはこの人の XML in nutshell はオレも 持ってんだよな。話はおおまかに XML のアプリケーションをどうやって ブラッシュアップするか、というような内容だが、この人は 「XML 原理主義者」だった。いわく、XML のバージョンは 1.0 から絶対に 上げるべきではない (1.1 への改訂はひどい騒ぎだったそうな)。 XML をいじるときはかならずまともなパーサを通し、Perl スクリプトや 正規表現でちょろっと処理しないこと。XML の文法 (entity とか processing directive) は たとえ使わなくてもすべて想定しておくこと。というのは XML は あくまで標準化されているからいいのであって、あらかじめ正規表現で 読める程度のいいかげんな仮定でやりはじめると、いざというときに (人がテキストエディタでじかに変更したりするなどの) ツブシが効かないからだという。SAX になるべく固執せよ、そうすればそんなに遅くならないから。 また XML はあくまで XML なのであり、 これがいつも「階層化された辞書」だとは思わないこと (辞書と違って、エレメントの順序が 重要なことがあるし、同じエレメントが何度も出てくることもある)。 いわく、SOAP は XML の標準に厳密に従っておらず (例: entity が使えない)、あれは MS が XML を独自支配しようとしている 「歪曲規格」だ (まあ、ヤツらのいつもやってることだが)。 基本的にこの人は XML にあまり余計な意味論を入れるべきではなく、 きちんと Validate する必要もなく、ただ XPath かなんかで「いいところだけ取りだして使い、 あらかじめ規定することは最小限におさえる」という立場のようだった。 だから W3C の Schema はほとんどの場合オーバーヘッドでしかないし、 JPEG なんかを XML にするのは頭オカシイ、という。全体的に、この人の 態度はまともなように見えた。しかし、これはあとから気づいたのだが、 XML の話というのはどうしても宗教っぽくなるのである。 なぜなら XML 自体はただのフォーマットであり、 問題はそれをどう使うかということなので、自然と「べき」論が多くなるのだろう。 なるべく属性は使うな、ともいっていたな。その後 TGIF に移動して 飲み会したが、結局 XML が一番向いていたのは RSS だけじゃないか、というようなことを 言っていた。彼いわく、Semantic Web は・・・・・であるという。まあ、それにもだいたい同意。 RSS にしろ HTML にしろ、問題をバッサリ単純化して「もうこれしかやらない!」ということで うまくいっているように見える。つねに問題を拡張するより切りすてたほうが うまくいく (少なくとも人気はでる) というのはぬんとぬく示唆的だと思った。ぬんとぬく。
ちなみに、SOAP (と RSS) の正式名称にはじつは正式な定義がなく (MS はあとになって定義をとり消した)、 Simple Object Access Protocol の略だ…というのは「俗説」なのだそうな。ホントかな? ああ、atmarkit にも書いてあった。
それから、どうでもいいが、Ubuntu のオヒシャル CD をゲットした。4.10 Install が 1枚で、 Live CD が 1枚。なんか、すげーちゃんとしたパッケージで、まるでどっかのちゃんとした 会社がやってるみたいだよ! (いや、本当にちゃんとした会社がやってるのだろうが、 Linux では「ちゃんとした会社」はかえってアヤシイという直感がある) でも、自宅ではリブートしたくないから試せない。
ガーソ! いまのは雨の音じゃなかった!
max とか min を直接使ってもいいんだけど、直感と逆なのでまちがえやすくない?lowerbound = max upperbound = min x = lowerbound(MIN_VALUE, upperbound(MAX_VALUE, x))
究極の Google はおそらく「Google・SETI」だ。宇宙からくる電波を 10GHz にわたって検索可能!
読点が、やたらと多い文は、アホってる気分のときに、書いたことを、示します。
(もちろん生理的には、ヨッパらっていないのがだ)
誤字脱字が医用に多いかったり、漢字へんけんを間違えたりする場合は、なんでしょうね。
なんでしょうねこれは。あと異様に以上に同じことをおなじことをくりかえしくりかえすの
こと。
そして改行。
新山のかくすべてのメッセージにはこのようなメッセージがふくまれているのにもかかわらず、 それに気づかないのはあなたのせきんんだ。つまり multipart ってことですカ??
ねむいとパスワードを打つのがおそくなる。 てくるで、ガサ入れのことを「ガサ入れ」というのは、 これはガサガサと音をたてて手入れされるからなのか? それともガサツに手入れされるからなのか? 大辞林によると「てきやなどの隠語。『さがす』の『さが』の倒語。家宅捜索。」だそうだが、 するとこれってそんなに新しい語じゃないのな。しかしもうすこし新しい日本語スラングだと 語源のわからんものが結構ある。たとえば「ブッチする」とかだ。 こういうのをカヴァーしている辞書はどっかにあると思うのだがカモクにして知らない。
ところで、ついに Google にも「てくるで」の権威として認められました。
でも、ホムサは、目がさめたときに大切なのは、ねむっている間にも、
だれかが自分のことを考えてくれていた、ということがわかることなんだ、
といいました。
-- “ムーミン谷の十一月”
誰でもいちばん最初にした失敗がいちばん重要だ、と思うだろう。
六本木ヒズルにひとこと言いたい: まだやってたの?
さて今日はいつごろオレは家から出ればいい (= 家から出られるほど十分アッタカクなる) のでしょうか。
カタカナびょう。
てくるで google news は社説とか中国大使館のお知らせとかまで掲載するってのはちょっと、さ。 それってニウスなの??
.emacs
をいじろうとしたら、
ちっともわからんかった。Python の filter に相当する関数はなに? string.startswith に相当する関数はどこ?
皆目見当つかず。絶対どっかにあるはずだと思うのだが、いろいろ検索しても見つからん。
elisp は古い (=悪しき) Lisp の風習をうけついでいるので名前のつけ方に一貫性がない。
フランス語みたいな言語だよな (←てきとう君)。しょうがないから自分でつくったよ。
で、これで何をしたかったかというと「ファイル名を補完するときに ange-ftp をロードするのやめやがれチクショウ!」ということである。以上。(defun filter (proc x) (let ((r nil)) (dolist (e x r) (if (funcall proc e) (setq r (cons e r)))))) (defun startswith (s prefix) (and (<= (length prefix) (length s)) (string= prefix (substring s 0 (length prefix)))))
; disable ange-ftp completion (setq file-name-handler-alist (filter (function (lambda (x) (not (startswith (symbol-name (cdr x)) "ange-ftp")))) file-name-handler-alist))
Ken Anderson のニュースがあちこちから流れてくる。 Spam conference の壇上で JScheme について話しているときに死んだらしい。 "collapsed mid-sentence" というから、しゃべっているうちに倒れたということなのかな。 べつに茶化すわけではなく、死ぬ直前まで Scheme について喋っていたというのは 真の Scheme プログラマといわねばならない。
いや〜おもしれ〜!
ハラへった。さっさと食おう。なんたって、狂牛病の牛肉エキスたっぷりの某社製シチーだmonne!
u"あ"
などを直接 Unicode として解釈させたい場合
(現状では u'\x82\xa0'
などになってしまう) は、以下のようなパッチをあてる:
きっと、たぶん、おそらくこのやり方は正しくない。--- PyShell.py.orig Sun Jan 23 14:28:07 2005 +++ PyShell.py Sun Jan 23 14:28:21 2005 @@ -587,14 +587,14 @@ self.more = 0 self.save_warnings_filters = warnings.filters[:] warnings.filterwarnings(action="error", category=SyntaxWarning) - if isinstance(source, types.UnicodeType): - import IOBinding - try: - source = source.encode(IOBinding.encoding) - except UnicodeError: - self.tkconsole.resetoutput() - self.write("Unsupported characters in input") - return +# if isinstance(source, types.UnicodeType): +# import IOBinding +# try: +# source = source.encode(IOBinding.encoding) +# except UnicodeError: +# self.tkconsole.resetoutput() +# self.write("Unsupported characters in input") +# return try: return InteractiveInterpreter.runsource(self, source, filename) finally:
ところで仮死子と宏子 (なんか字が違うような気がするが…浩子だったっけ?) の ユー・ガッタ・メール合戦はどうしちゃったの? ポカリ風呂と WASP の富雄さんとの関係は? ホントにどうでもいいけど、まえに「ピョーーーーーーーーーーーーートル大帝」とかの文字列で適当に検索したら ナカガワさんのページに偶然ヒットしてすげーウケてしまった。 「ー」の数までぴったし一致したというこの奇跡。すばらかしいね。そういえばナカガワさんとは 語感感覚が一致することがわりと多い。たしか初めてお会いしたときに「どぶろくっていいですよね (語感が)」という 話をした記憶があるし、このピョーーーーーーーーーーーーーーーーーーーートル! にもそういう符合を感じる。 でも今はそのページももうない。まあ archive.org とかにいけばあるかもしんないけど もう URL忘れたし、だいたい archive.org とか使う奴は負け犬だ!
意味の等価性をいうとき、時制や aspect のちがいはどれほど重要になるのか。 たとえばある記事では "The president announced ..." といい、別の記事では "The president has announced ..." といっていたとする。この 2つの表現に意味的な違いは どれほどあるのか? またそれを客観的に議論することはできるのか? 対象を新聞記事に限ればある程度の一般化は可能かもしれない。 関連文献をさがさなければ。こんなのは言語学でもあまり研究されてなそうだが、 そもそも aspect に関する研究自身にいろいろな流派? のようなものがあるのだ。 たとえば英語には時制はあるけど aspect はないとか、かんとか。 でも、仮定法だったらどうなるの? "would have been ..." のような表現は 新聞記事でもときどき現れる。新山はこの手の素性が表層的な語法から直接 取り出せるとはあまり思わないのだが、それでも統計はとらねばならない。
以下は New York Times の記事 1年分からとりだした約5万文について (各記事の先頭 1文のみを使用)、
その根っこにある base VP (のようなもの) をぬき出したものである。メジャーな言いまわしは以下のとおり:
このデータはもっと詳しく調べる必要がある。どれとどれの組み合わせは区別すべきで
どれは区別すべきでないか。恐しいことに、これは eq(記事内容, 表現, 引数1, 引数2, ...) のような関数になっている。
先頭の文だけをとってきたのは、文脈を考慮する必要がないからである。
あと、類似記事の間ではどうなっているかのデータも取ること。
14623 VBD
2865 VBZ
2356 AUX:is
2348 VBZ TO:to VB
1719 VBP
1637 AUX:are VBG
1213 AUX:has VBN
1164 AUX:was
1035 AUX:are
977 VB
715 AUX:'s
695 MD:will VB
691 AUX:is VBG
590 AUX:was VBN
530 AUX:have VBN
504 VBN
409 VBD TO:to VB
359 AUX:has
286 AUX:had
242 AUX:has AUX:been VBN
238 AUX:was VBG
...
新しいラメカを買ったので、さいきん写真ばっかとってる。な
おととしの夏にACL札幌で、ある本を見つけたのだが、 その本がいつのまにかド有名になっている ことがこのあいだ判明した。いまや東京でもあらゆる本屋にある (おもに福祉・介護関連のコーナーだが、なんで新山がそんなところをあさっていたかは秘密)。 新山が見つけたときはまだ発売されて間もないころで、おそらく北海道ローカルにしか売ってなくて (「北海道の本」というコーナーにあったのだ)、「オーがんばっとるね」と思い、 じゃあ地方でしか買えなそうな本でも買っていくかな、と思って買ったのだが、もう地方の本じゃなくなってしまった。 まあ、この本が売れようと売れまいとどうでもいいのだけど、内容は結構泣けますね。 厚くて重いからこっちには持ってこなかったけど。
www あt openbsd.org って、来るのはほとんど spam ばっかだ。当然のことだけど。
やっとセンタクから帰ってきてぬくぬく。もう外に出ないぞ。 きょう日中の気温は -10℃前後からずっと上がらず、 寒さで地下のランドリーがブッコワれたらしいので (おそらく水道管破裂だろう)、歩いて 3分ほどの近くのコインランドリーに 出かける。ところがすごかった。 大...雪...警...報 ! すでに歩道には 20cm ぐらい雪がつもっていたが、スニーカーで平気。 なぜならあまりに寒くてコナ雪なので、衣服についてもぜんぜん濡れないのだ。 手でパサパサと払い落とせてしまう。道路では車が人の歩くほどの速度で走っている。 TV をつけると、しきりに「外へ出るな」といっている。 空港はほぼ全滅。高速道路もマヒ状態らしいが、マンハッタンではまだ人が歩いているらしい。 これは明日は行ってみなきゃな。きょう 1日雪はふりつづけたが、これは明日も午後まで 続く予想。TV で "Winter Wallop" というタイトルを見かける。PATH は動いてんのかな。 だとしたら、たいしたもんだな。ボストンあたりはさらにひどいらしい。 「外気に長期間ふれないこと」「ペットが死ぬので家に入れるように」とかいってる。
新山の解答:
# return the number of required bits for x.
def needbits1(x, signed=False):
if signed:
n = 1 # for sign
if x < 0:
x = -x-1
else:
n = 0
assert 0 <= x
while 1:
n += 1
x >>= 1
if x == 0: break
return n
assert needbits1(0,0) == 1
assert needbits1(0,1) == 2
assert needbits1(1,0) == 1
assert needbits1(1,1) == 2
assert needbits1(2,0) == 2
assert needbits1(-2,1) == 2
assert needbits1(-3,1) == 3
assert needbits1(127,0) == 7
assert needbits1(127,1) == 8
assert needbits1(128,0) == 8
assert needbits1(-128,1) == 8
assert needbits1(-129,1) == 9
assert needbits1(-6380,1) == 14
これは効率のいいコードなんだろうか。わからない。 ループが入っているのがイヤなのだけど、もっと効率的にする方法はあるのだろうか。
Generic を導入すると、Vector が自分の型を「知っている」ことになるので、 いちいちキャストする手間がはぶける:v = Vector() v.add('foo') x = (Integer) v.get(i) ← まちがい
しかし、Java 1.5 の Generic ってのは基本的に静的なチェックのためだけのもので、 べつにそれを使おうと使うまいと生成されるバイトコードに本質的な差はないし、速度も変わらない。 単にソースの見やすさが改善するだけなのだ (もちろんこれは重要である)。 今までと同じ Object を直接格納する方法も依然として使えはするが (この場合は「型が指定されない Generic」として扱われる)、1.5 からは 大量の warning が出るようになったんだそうな。 ところが、すでに大量にある既存の Java コードをこれに合わせて人手で書き換えるのは えらい手間である。ミスも起きやすい。というわけで、今日の研究は 「既存の Javaコードを食わせると、自動的にリファクタリングし、 Generic 宣言を使えるところは使用し、余計な型変換を削除するソフトウェア」なのであった。 ようするに既存のコードと、以下のような Generic の使える関数のセット (基本ライブラリはだいたいこのように書き直されている) を与える:v = Vector<String>() v.add('foo') x = v.get(i)
で、プログラム中にこんなのがあると:class MyIterator implements Iterator<T> { public T next() { ... } }
これは型推論をつかって v が Vector<String> であり、 したがって i も MyIterator<String> でなければならない、ということを推論する (ただし本当に Vector の型が動的に変化するような場合は Generic は 使えないので、なにもしない)。型推論はすでによく研究されてきた方法で、グラフに変換してから操作する。 その後コードを書き直す:v = Vector() v.add('foo') for (i = MyIterator(v); !i.end(); i = i.next()) { String x = (String) i.get(); ... }
彼らはこの変換を既存のいろいろな (公開されている) Java コードに適用させて試した。その結果、平均して約半分の downcast が削減でき、それにともなう warning の数もほとんどなくなるそうな。 なお、これは Ecripse 3.1 に塔載されることが決まっているそう。v = Vector<String>() v.add('foo') for (i = MyIterator<String>(v); !i.end(); i = i.next()) { String x = i.get(); ... }
でも Java じゃなあ。
どうでもいいけど Java 1.5 はいまや J2SE 5.0 って呼ぶのな。 Sun はいつもこういうことをする。バージョン番号底上げ君。Solaris もそうだし、 そもそも J2SE の 2ってのは一体どっから来たんだよ! このぶんだと Java (や Solaris) のメジャーバージョンが上がったときはいったいどんな 数字をつけるのだか予想もつかない (まあ、そんなことは未来永劫ないだろうケド)。 Solaris 3000 とかにするのか? あるいは Solaris 3333 とかか? それともそれとも「SolarisSolarisSolaris」とか 3回くり返すようになるのか?? なんか別なアレを思い出した。どうでもいいや。
K: 馬鹿な質問だが教えて。最近フリーランスになったが、 将来的な顧客になるかもしれない会社から仕事を依頼された。 友達が働いているので安く見積った: バックアップシステムの構築と メールゲートウェイの設置でハード料が $2000, セットアップとテスト料が $1200 (30時間×$40)。 そしたら向こうは「そんなに高いの!?」とびっくり。 自分の選んだ道はほんとに正しいのか自信がなくなった。
意見1: $40/時って安すぎるよ。きみのやっていることは価値があるんだから あまり値段をさげるべきでない。("stick to your guns")
意見2: この業界は競争が激しいからね。 でもそんなに安くてはここ(NY)では家賃も払えんね。そのビジネスモデルはあまり成功とは思えない。 自分を忙しくさせておくだけの顧客がほんとうに見つかるのか。月40時間だけ働くとして、 $40/時だと $1600 だろ。飢え死ぬよ :) stick to your guns.
意見3: ただ彼らは「値切りゲーム」をしてるだけじゃないかな。 オレは一度 $20/時 を要求されたことあるよ。値段を守るべきだ。
意見4: 彼らにいろいろ提案しすぎじゃないかと思う。こう考えたらどうかな。 まず彼らの予算内で、彼らが理解できることだけをやるシステムを納入すべきだ。 そのあと「こんなこともできる」と提案する。こうすれば彼らから次の仕事もくるし、 そのあいだにシステムの効果が現れてくれば信頼もされる。 彼らの「こいつに頼もう」guy になればいいんだ。
K: 安いのには同意する、まあいろいろあってね -- しかしポイントはつかんだ。 要するに、オレは間違ってなかったってことだ! ありがとうよ!
メーリングリストを読むのはときどきひどく勉強になる。いろいろな意味で。 それがいいメーリングリストである場合は。
import re PAT = re.compile(r'^([0-9]*)-([0-9]*)$') def range2list(s, n0, n1): r = [] for i in s.split(','): i = i.strip() if i.isdigit(): n = int(i) if n0 <= n and n <= n1: r.append(n) else: raise ValueError('%d: must be in %d..%d' % (n,n0,n1)) else: m = PAT.match(i.strip()) if not m: raise ValueError('%r: illegal number' % i) b = n0 if m.group(1): b = int(m.group(1)) e = n1 if m.group(2): e = int(m.group(2)) if e < b: (b,e) = (e,b) if b < n0: raise ValueError('%d: must be in %d..%d' % (b,n0,n1)) if n1 < e: raise ValueError('%d: must be in %d..%d' % (e,n0,n1)) r.extend(range(b,e+1)) return r
実行方法:
>>> range2list('2,3,5-8,10', 1,10)
[2,3,5,6,7,8,10]
>>> range2list('-3,8-', 1,10)
[1,2,3,8,9,10]
>>> range2list('12-', 1,10)
ValueError
あー、カツどん食いたいなー。ないけど。
(こういうときにオレがどれほどむなしい思いをしているか、わかる人にはきっとわかっていただけるだろう)
っていうかあした鶏肉買ってきて自分でカツ作ろ。
自分の食いたいものも自分で作れないやつは人として失格だからよ。