「Lisp」を含む日記 RSS

はてなキーワード: Lispとは

2008-04-13

http://anond.hatelabo.jp/20080413160350

昨日からやりとりしてた増田です。

なんだ、君、プログラマーだったのか。だったら話が早い。

例えば、JavaとかRubyとかVBとかPHPとか、そういう種類の言語一種類しか使えないプログラマがいたらどう思う?あまり難しい仕事任せられないって思わない?最低限、Cとかアセンブラとかできるだけ低レベルに近い言語はある程度使えてほしいし、できればLispみたいな関数型言語とかOSコンパイラ理論とか、そういうのを知識としてだけでもいいから知っておいてほしいと思うよね?

だったらどうして、古文や漢文勉強が自分には意味ないって思うかなあ?日本語で文章を書くのは、仕事上の重要スキルでしょ。まずその前提がよくわからない。

具体的にどんな古典教育強化でどこが「新たに」観光資源になるんだ?

日本は今でも十分歴史伝統的なものを観光ビジネスに利用出来てるが。

別に「新たに」なんて言ってないけど。ただし、資源ってのはメンテナンス要員が必要なんよね。現在教育は、その中から一握りの専門家とそこそこ多くのファンを再生産する役目は果たしてると思うけどな。

あと、日本の観光ビジネスはまだ産業として未熟だよ。ヨーロッパ行ってみるとわかるけど、日本の観光ビジネスは横のつながりが弱くて商売がヘタクソ。たとえば厳島神社なんて世界遺産になってるのに、宝物殿では大した物展示されてないし、宮島にある飲食店はろくなお店がない。

「楽しむ」という観点で言えば、古典漢文の題材がそれらよりも優先するようには思わない。

劣るとも思わないけどね。ただね、現代文学古典文学を下敷きにしてたりするから両方読めると楽しいことは知っておいた方がいいだろうね。

あと、古文とか漢文ってのは現代文と読み書きや文法の体系が少しだけだけど違うから、文法ぐらい教えておかないと、興味を持った人があとで独学たって難しくなってしまうことは理解できるよね。いまの高校教育はそういう目的で文法だけを中心に教えてるようなもんだよ。

それとさー、どうしてあれを教えたらこれを教えるのやめろって話になるわけ?両方教えたらいいだけじゃないの。ただでさえゆとり教育なんだからさ。たとえば俺は高校時代理科社会を全科目履修したし、数学も数III数Cまでやったし、古文や漢文だったら例えば岩波文庫の注釈付きなんかで訳なしで読めるよ。

俺も理系人間で、たいして出来がよくなかったから思うんだが、行列大学入試という重しがある高校生の間にある程度慣れておくべきものだ。

大学で習った偏微分とか周回積分とかいっこも覚えてない俺でも行列演算は一通り出来るし、プログラミングとかで使えるのは、高校でみっちりやったからだよ。

それは単なる君の不勉強でしょ。高校までで役に立つこと勉強したいんだったら高専とか工業高校に行くべきなんだし。普通高校ってのはジェネラリストを育成するところなんだからね。

それに、君はたまたま高校で習った行列計算だけで用が足りてるのかもしれないけど、行列の計算だけできても普通は何の役にも立たない。それに、大学線型代数やったんなら、高校でやるレベルの話なんて子供だましもいいところだってわかるでしょ。

というか、固有値ベクトル空間を理解せずにどうやって大学卒業できたんだ?力学も振動論も微分方程式統計学信号処理量子力学も、何一つ理解できないでしょ、それじゃ。

行列と比べてどうなんだと聞いてるんだが。

だから、本来比べるのがおかしいし比べられないと書いたんだが。

ただし、君が思ってるほど高校行列計算は一般には役に立たないし、観光は大きな産業になり得る。理由は上に書いたとおり。

そりゃ基礎技術力が高く工業力が強いほうが観光立国よりずっといいだろ。

とんでもないよ。オーストリア日本の一人当たりGDPを調べてごらんよ。

2008-03-01

こんなC言語の開発環境は嫌だ

  • エラーメッセージイケメンボイスで復唱するコンパイラがついている
  • typedefを10個以上書くと、「ごめん俺、馬鹿だから。そんなにたくさん覚えられない」と愚痴られる。
  • voidを10個以上書くと、「はっきりしなさいよね」と怒られる。
  • 構造体に関数へのポインタが含まれていると、「おとなしくC++使ったら?」と毒づかれる。
  • a(b(c(d()))); みたいなステートメントを書くと、「俺、LISP苦手なんだよね。でもがんばる」とつぶやかれる。

2008-02-24

プログラミング言語なんて単なる道具

http://anond.hatelabo.jp/20080224122041

推薦図書については末尾に書くけど、その前にちょっとお話。うざいと思ったら読み飛ばして末尾に行ってね。


どの言語がよいか、というのは「ゴルフクラブで一番よいクラブは何か」という問いと同じなので、正直意味のある問いとは思えないなあ。言っちゃ何だけど、言語を覚えて満足してる奴は、高いクラブを買って満足してるだけの奴と同じだよ。大事なのは「何をやりたいか」で、それさえ明確になれば後は単なる慣れの問題に過ぎないし。

一つや二つの言語を扱える以上になれない奴は、ごくごくごくごく少数の例外を除けば、所詮人に使われるだけのやつにしかなれんよ。そんなの、大学出てまでやる仕事じゃない。営業並みの対人能力があるとか半導体の回路を引けるならまた別だけど、それはもはやプログラマと呼べる仕事じゃないしね。


ゴルフだったら、ショートホールもあればロングホールもあるし、バンカーに落としてしまうこともグリーン上のヨセもある。プログラマも同じ。大事なのは、

「適切な言語を選ぶ能力

「必要が来たとき最小限の勉強時間どん言語にも対応できる能力

じゃないかなあ。これがあれば、その時点で知っている言語が一つだろうと十個だろうと大した問題にはならんよ。

世の中にある言語は、アセンブラとか C みたいに低水準(機械に近いところ)でやるのに適したものもあるし、C++Java みたいに大規模なビジネスアプリの開発に向いてるものもあるし、VB とか Perl みたいに細々とした作業を処理するためのお手軽ツールもあるし、Lisp とかみたいに、実用よりも理論的理解を指向したといえるようなものもある。だけど、アセンブラLisp みたいな特殊なものを除けば、どれも基本的な考え方は同じだ。確かに C++Java に出てくる「オブジェクト指向」は多少取っつきは悪いけど、きちんとした本を元にして勉強すれば一週間で理解できるよ。あとは処理速度と書きやすさ・手軽さを天秤に掛けての判断にすぎない。ゴルフでいうなら、パターを除けばどのクラブも基本的には原理が同じみたいなもんだ。ウッドとアイアンとウェッジという区別はあるけれど、基本的には飛距離とコントロールバランスだろう?


どの言語を選ぶかなんてのは所詮は小手先のことなのさ。大事なのは、何をしたいか、何のためにプログラマになりたいかということだ。そのためには、いろんな素養が必要になってくる。

もし、半導体コンピュータOSみたいな低レベルな話に近いところ興味があるなら、電気工学とか形式言語理論とか数理論理学とかそういう知識が重要になってくる。ロボットを作ったり生体認証をしたり他の機械システムを制御したりというような高度な話に興味があるなら、数学とか統計とか信号処理とか制御工学をきっちり勉強した方がいい。業務で扱われる大規模なシステムを扱いたいのなら、理系の知識よりもむしろ世の中の仕組みを広く浅く知っといたほうがいいだろうね。


もはや、「プログラムが書ける」なんてのは、「ワープロ表計算ソフトが使える」というのに毛が生えた程度の技能でしかないんだ。十五年前なら、「一太郎Lotus 1-2-3(当時は WordExcel なんてのはあったのかどうかも微妙)が使える」といえば「即戦力」だったかもしれんが、今更そんなの当たり前の技能でしかないだろ?

大事なのは、「他の奴が簡単には追いつけないもの」を持つことだ。大学での数年間はそのために使うべきだよ。目標を持って真面目にかつ気楽に取り組むことだ。がんばりたまえ。


注意 この文章中でわからない言葉が出てきたらまずはぐぐってほしいが、わからなくても気にすることはない。それらの中身を知っていることは大した問題じゃない。大事なのは全体的な雰囲気だから。


推薦図書その他

まずは、この本をお薦めしたい。

やさしいコンピュータ科学 (Ascii books)

プログラマ(というよりコンピュータ)が関わるあらゆる分野を、本質を押さえて入門程度に書いた本。「やさしい」という題名だけれど、高校生の基準で考えると「難しい」と思う。大学では、「やさしい」「難しい」の基準が何段階も格上げされるから気にしないように。これが「やさしい」と思えるようになったら大学卒業レベルと思っていい。だから余り気負わず、頭から読もうとせずに適当に面白そうなところを眺めて、興味が出たら他のところも拾い読みするという感じで十分。

その上で、興味を持った分野の本を探したいと思ったら次はこれがお勧めだ。

改訂新版 コンピュータの名著・古典100冊

これを見て、適当にぱらぱらめくって、読みたいものから読めばいいよ。この辺の本なら大学図書館にはあると思うし。ただし、ここに出ている本はどれも本格的だから、難しすぎると思ったら適当に放り投げていい。そうやって、いろんな分野をつまみ食いしていく間に全体像が見えてくるはずだ。

あと、それとは別に基本情報技術者試験を受けるのもいい。大学の授業についていくための基礎力としては十分なはず。これが易しすぎると思ったら、ソフトウェア開発技術者試験でもいい。もっとも、これに通るぐらいなら大学2年か3年ぐらいの力はあると思うけどね。

http://anond.hatelabo.jp/20080224122041

とりあえず英語からだ

それからK&R本を読め

そして組んでは読み組んでは読みして

CodeCompleteあたりを読んで

次にスタンフォードかどっかのネットに落ちてる講義を見ろ

それからlispschemeに手を出せ

それが出来る頃にはもう何でもできる

2008-02-15

正直英語がわからないと厳しいんじゃないか

(/ 2 3)の動作を暗記するのと、これを "divide 2 by 3"と読むのは違うからな。これがひとつならともかく、積み重なってくると骨が折れそうだ。( subst a b c )を"substitute a with b in c"と読めるかどうかで記憶効率も違うし。と、Scheme知らずのOld Lispユーザーがつぶやいてみる。

俺も中学生の時に"branch always"なんて知らない単語を勉強しながらニモニックを覚えたよ。元増田はがんばれ。

http://anond.hatelabo.jp/20080215014457

2008-02-01

15歳中学生「はじめてのプログラミング」その1

エスカレーター私立中学校に通う男子プログラミング独習記。(Scheme/DrScheme)

本来高校受験を目の前に控えているはずなんだけど、怠けの坊ちゃん学校にはそんなものもなく教室の空気は緩んでいる。

3年前になんだかんだで部活動に入りそびれた僕は、際立ってダラダラなカテゴリに属す。

ベタギターをやってみたり、携帯のオンラインRPGにハマったり、プロフ女の子と会ってみたけどあまりしっくりこない。モバも飽きた。

唯一ハンズで買った財布づくりキットみたいなヤツをきっかけに革を触って何か作ったりするのは続いてる。革の裁断面を磨きまくるコバ磨きをしていると何故だか落ち着く。

僕のことばかり書いてても仕方ないな。で、なんか中学生活で達成したとかそんなの全然ないし、高校生活に胸をときめかせるとかもなくて。

それじゃああんまりだと言う事で、何か新しいことを始めたいなぁと思ってたんだ。

ちょうど親がプログラマーで、(全然パソコンには詳しくないけど)モノをつくるのも好きだし、やってみようって気になった。

昨日親に話してみたら、Structure and Interpretation of Computer Programsっていう本を勧められて、MITっていう大学(?)のサイトで見てみたけど難し過ぎた。

ってそのままお父さんに言ってみたら今度はHow to Design Programsっていうもっと入門編の本を教えてくれて、これ以上簡単な解説書はないからもうこれでわからなかったら諦めろと。

なんだか悔しいし、どうにかしてモノにしたい。早速MITサイトから100ページ分ぐらいダウンロードしてみた。

親に聞くのもイヤだし、(いつの間にかできるようになってたい)2chもそれ関係スレマニアック過ぎて謎過ぎたからここで書いてみる。

書いてることが間違ってたらぜひぜひ教えて欲しいです。

今日は最初の12ページ分。なんかプログラミングって何?とかプログラミングを学ばなきゃいけない理由とかが書いてあった。

  • ()内が僕が考えたこと。それ以外は本に書いてあったことです。

プログラミングって、職業的なスキル以上のものになってきてる。

すごく楽しいし、創造性のはけ口になるし、抽象的でふわふわしたアイデアを目に見える形で表現できちゃったりする。

(このアイデアを形にする手段、っていうのはなんかイイなと思った。やっぱりなんかひとりでモノをつくれる人は尊敬できるなぁ。)

プログラミングクリティカルリーディング、分析的思考、創造的統合(?)、細部へのこだわりを教えてくれる。

(創造的統合って何だろう?creative synthesisっていわれるとイメージはできる気もするけどうまく言葉にできない。

複雑なものをformingするってことだよね。多分...)

さらに何がイイかって、すぐにフィードバックが返ってくるところ。

冒険的、実験的になれるし、自己評価もできる。達成感を味わうっていうのもあるみたい。数学ドリルをするより全然。(確かに目に見える何ができるって励みになりそう)

この本ではプログラミング言語の細かいところとかにはあまり触れずに、デザインプロセスに焦点を当てる。

つまり問題定義からオーガナイズドされたソリューションまでの一連の流れについて語る。

2つのイノベーションがこの本にはあって、以下。

・明確なデザインガイドラインがある

・めちゃめちゃ新しいプログラミング環境

まず一つ目。今までの本は抽象的でクソみたいな定義の提案しかしてこなかった。例えば「デザインはトップからボトムに」とか「構造的にデザインしろ」とか。

この本には明確なステップがあって、読むこと、分析すること、組織化すること、実験すること、システマティックに思考することを学べる。

二つ目は、初心者向けのプログラミング環境であるということ。既存の本は周りにプログラミングプロがいて、すぐにその人に質問したりできることを前提に書かれていた。

この本はそういった意味の分からない前提は捨てて、独習できるように設計してある。

1. 問題のデータのかたまり(problem dataってなんだ?)を記述する

2. 簡単にプログラムの挙動の仕様をつくる

3. 挙動を図にしてみる(例をつくる)

4. プログラムの型(program templateってなんだ?)やレイアウトをきっちりつくる

5. テンプレートを変形して、完全な定義をつくる

6. テストしてエラー発見する

(なんかプロセスとしてはわかりやすいけど、抽象的でプログラミングしたことのない僕には雲をつかむような感じ...

inputデータの記述からどうやってprogram templateが得られるんだろう?1→2がよくわからない)

プログラミングアクティビティってつまるところ、

1. ある数とある数を関係づけること

2. 名前の代わりに値を用いることで、関係を評価する

ってこと。(これもわかったようなわからないような。1はinputとoutputの間の話?2は数値化するってこと?)

プログラムを学ぶのってサッカーを学ぶのと似てるね。

最初はトラップやドリブルパスシュートの仕方を学んで、次はあるポジションの役割を学んで、戦略を学んで、どの戦略を選ぶかを学んで、時々新しい戦略をつくったりもする。フィットするヤツがない場合はね。

他にも建築家作曲家作家に似てる。

彼らが楽器技術や書く技術建築技術を学んでアイデアを形にするように、プログラマープログラムを学んでモノをつくる。

この本ではSchemeというプログラミング言語を使う。開発環境はDrSchemeで行う。

ただこの本はSchemeの解説書ではないから、Schemeの構成概念の6つだけを使う。

function difinition、application、conditional expressions、structure definition、local definition、assignmentsだ。

---

とりあえず1回目はこんな感じ。

まだ全然良く分かってない。ただ親が使ってるのがlispっていうプログラミング言語で、Schemeはその方言みたいなものってことは今調べてわかった。ふーん。

まだ何がわからないっていうか全部わからないので、アドバイスのしようもないとは思いますが、最初はこれやっとけ!とかこのサイト読めとかあったら教えてください。

2007-12-02

マジレスしてみる

自然言語の場合、文字セットと発音が言語ごとにスットンキョーに違うので、元増田が期待したような差分学習は無理。もうひとつ、古い言語活用が複雑かつ不規則すぎる。数千以上ある単語に対してその過半数が不規則活用なんてのもある。だから、甘い考えはやめろ。

プログラム言語の場合、基本文字セットと予約語英語ベースになっている。だから、元増田が「3つもあれば」というのは実は言語設計者の手のひらの上で踊っているだけ。まぁ、大言するならLispPrologも入れといてくれよ。

http://anond.hatelabo.jp/20071202085518

2007-11-15

IT業界に否定的な記事に対して、

ブクマがたくさんついていて、それに対するIT業界成功者みたいな人のブログの反論の記事にはあまりブクマがつかないよね。まあ、才能のあるやつと一緒にするなと言うことかな?(挨拶

あまりブクマがつかなかった記事なんだけども、もはや「(笑)」の意味が変わってきているところが面白かったということで紹介。

スイーツ(笑)@マ板

http://alfalfa.livedoor.biz/archives/51170208.html

個人的にウケたところをコピペ

4 仕様書無しさん :2007/11/09(金) 16:10:53

品質(笑)

5 仕様書無しさん :2007/11/09(金) 16:19:09

ボーナス(笑)

6 仕様書無しさん :2007/11/09(金) 16:19:39

残業手当(笑)

8 仕様書無しさん :2007/11/09(金) 16:43:16

納期(笑)

12 仕様書無しさん :2007/11/09(金) 17:04:23

プチ仕様変更(笑)

21 仕様書無しさん :2007/11/09(金) 20:28:51

金曜日(爆笑)

23 仕様書無しさん :2007/11/09(金) 23:42:51

鬱病(笑)

24 仕様書無しさん :2007/11/10(土) 00:36:21

親睦会(笑)

30 仕様書無しさん :2007/11/10(土) 11:56:57

えいやで(笑)

78 仕様書無しさん :2007/11/11(日) 20:48:21

(((少数精鋭(笑)(笑)(笑)(笑)

lisp みたいだw

103 仕様書無しさん :2007/11/12(月) 23:54:57

協力会社(笑)

2007-09-28

[][]私はこれで perl から乗り換えました

OO, Perl, Ruby

Perl から Ruby への移行メモ

INTRODUCTION OF RUBY

class

404 Blog Not Found:coders.each{|you| you.get(this) if you.langs[0] != 'ruby' } # - 書評 - 初めてのRuby

1章 ようこそ、Rubyのある生活へ

1.1 Rubyの特徴

1.1.1 オブジェクト指向言語

1.1.2 より良いPerl

日本 Ruby 会議 2007 - Log0610-S5

ある研究によれば、生産性はそれぞれのプログラマでそれぞれ違う。

でも、あるプログラマに着目すれば、

そのプログラマ時間あたりに書けるコードの行数は、プログラミング言語によらず決まっている、

たとえば一年に50,000行なのだそうだ。

行数が決まっていたら、

どの言語で一番多くのことを達成できる?

そう、Rubyだよね。

どうしてそんなに Love Ruby ?

例えば C のプログラムより 50 倍遅くなったとして、実行時間はどのくらい変わるだろうか?

もし C のプログラムが 0.01 秒で終わる としたら、

Ruby 版は 0.5 秒。あなたのプログラムは 0.49 秒速くす るために C で書く価値があるのか?

プログラムは開発の時間よりも保守時間のほうがかかるというのはもはや常識だけども、

Ruby で書いてあれば例えば、

C で書いたプロ グラムよりも楽に保守できるはずだ。

そういう点でも Ruby は非常にいい。

だいたい、スピードに対してごちゃごちゃ言うなら C じゃなくアセンブラで書けばいい。

それをなんで C で書いてるのかって言えば、

それはもちろん「コードがわかりやすい」とか、「早く書ける」って のが理由だろう。

そして、Ruby は C よりわかりやすいし速く書ける。

ということは、「C よりも Ruby」というのは非常に自然な選択では ないだろうか?

Perl, Python, Ruby の比較

404 Blog Not Found:「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い

実行速度より実装速度(前編) - Object Station

ポール・グレアム「プログラミング言語が解決するもの」 - らいおんの隠れ家

Rubyが解決: Perlはその場しのぎだし、Lispの文法はおっかない。

2007-09-18

英語とかと混じってもいいように

コンマと, ピリオドで書く連中.

マジレスすると英語とかと混じったとき句読点だと気持ち悪い。

car, cdr, consのような Lisp関数

のほうが

car、cdr、consのような C++関数じゃないもの

より良くないか?

英文からコピペするときも楽じゃないか。

いや、俺も句読点使うけど、この居心地の悪さを感じて JISは正しかったんだなああ、って思うこともよくある。

2007-09-14

http://anond.hatelabo.jp/20070914115225

「1 * 2 * 3 * 4 * 5 ... 1000 は幾つ?」

と問題を出して、電卓と睨めっこしている所でLispを教えてあげる。

2007-09-07

ようこそ、℃-uteLisp の世界へ

発祥: http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/

はじめに

Scheme という Lisp 語族言語を用いて ℃-ute相関関係プログラムし、様々な角度から関係性を分析する手法を紹介していきます(ソースコードは最後に張ります)。

まずは、メンバー間の関係を「リスト」というデータ型で表現します。例えば「栞菜->愛理」という関係

(kanna . airi)

という形で表すことができます。これに、「大好き」という情報を付加し、ついでにその関係の性質を数値化したものを加えると

((kanna . airi) (desc "大好き") (score . 1))

のようになり、関係図における一つの矢印の情報データ化できたことになります(暫定的に、好意は 1、良好・中立は 0、険悪は -1 の3段階で表すことにします)。

メンバー間の全ての関係性をこのデータ単位で定義し、データベース化しておくことで、色んな条件に基づいた検索やスコア計算などが可能となります。

例 1: リンク状況の調査

ここで相関関係図における矢印を「リンク」と呼ぶことにして、あるメンバーから他のメンバーへどのようにリンクし、またリンクされているかを調べることができます。

関係の中からリンクの起点を抽出してソートしてみると

(sort-nodes (number-list (from-links)))

結果:

((kanna . 6) (saki . 5) (maimi . 4) (erika . 3) (mai . 3) (chisato . 3) (airi . 2))

栞菜ちゃんがメンバー全員にリンクを張っていることが分かり、℃-ute ラブっぷりが伺えます。なっきーにも同様の事が言えます。例の「女の子が好き」発言を数値的に裏付ける結果と言えるかもしれません。

ただ、データ不足でリンク件数がまだ少ないのと、リンクの性質(好意/反感など)までは分からない点を考慮する必要があるでしょう。

例 2: 被リンク状況の調査

同様に、リンクの終点の件数を調べてみます。

(sort-nodes (number-list (to-links)))
((chisato . 5) (erika . 5) (kanna . 4) (maimi . 4) (airi . 4) (mai . 3) (saki . 1))

えりかちゃんと千聖ちゃんが高ポイントです。メンバーからの人気や注目度の高さを示すデータですが、千聖ちゃんの場合敵対的なリンクが2件含まれている点に注意してください。

なっきーの被リンク数が極端に少ないですが、単純にデータ不足のためだと思われます。はぶら(ryとか言わないようにお願いします。

例 3: 愛情度の評価

リンクに付随するスコアを計算することで、愛情の度合いを測ることができるのではないか、という考えに基づく研究です。

まず、全ての関係性を対象として、スコアマイナス関係を抽出してみます。

(filter-nodes (lambda (n)
		(< (score-relation n) 0)))

結果:

(((kanna . chisato) (desc "愛理に手出すんじゃねぇよ") (score . -1))
 ((saki . chisato) (desc "愛理に手出すんじゃねぇよ") (score . -1)))

件数だけを得ると

(length (filter-nodes (lambda (n)
			(< (score-relation n) 0))))
2

僅か2件です。

良好・中立的な関係

(length (filter-nodes (lambda (n)
			(= (score-relation n) 0))))
8

愛に満ちた関係

(length (filter-nodes (lambda (n)
			(> (score-relation n) 0))))
16

非常に多いです。舞美ちゃんの「℃-ute同士でラブラブなんですよ」発言(例のラジオ)を数値的に裏付ける結果と言えるんじゃないでしょうか。

次に、メンバーごとのスコアを算出してみます。Lisp 的には以下のようにフィルタリングと畳み込み (fold) で計算することができます。例えば

(foldr (lambda (n acc)
	 (+ (get-score n) acc))
       0
       (filter-nodes (cut to? <> 'kanna)))

栞菜ちゃんに対するリンクスコアが得られます。結果:

3

上式を一般化して一挙にメンバー全員に適用してみると

(sort-nodes (map (lambda (x)
		   (cons x (score-loved x)))
		 (all-members)))

結果:

((airi . 4) (kanna . 3) (mai . 2) (erika . 2) (maimi . 2) (saki . 1) (chisato . 0))

愛理ちゃんが好意を寄せられやすい傾向が伺えます。

今度は逆方向のスコアを計算してみると

(sort-nodes (map (lambda (x)
		   (cons x (score-loving x)))
		 (all-members)))
((kanna . 3) (maimi . 3) (chisato . 2) (airi . 2) (saki . 2) (mai . 1) (erika . 1))

まいまいえりかちゃんが特に堅い・一途だという傾向を読み取ることができます。

例 4: 相性の調査

今度は組み合わせ(カップリング)の評価です。

2点間相互のリンクスコアを加算したものを「相性」と考えられるものとします。最大値 (互いに好意を寄せている場合の数値) は現在スコアリング方式では 2 です。例えば

(score-between 'kanna 'airi)

の値は

2

となります。1 であれば一方通行と考えます。

関係性が未定義の場合もあるので 0 のものを除外して算出すると

(sort-nodes (filter (lambda (n)
		      (not (= (cdr n) 0)))
		    (map (lambda (n)
			   (cons n (apply score-between n)))
			 (all-combinations))))
(((chisato mai) . 2)
 ((chisato airi) . 2)
 ((airi kanna) . 2)
 ((saki kanna) . 2)
 ((kanna maimi) . 2)
 ((erika maimi) . 2)
 ((saki airi) . 1)
 ((saki erika) . 1)
 ((kanna mai) . 1)
 ((maimi airi) . 1)
 ((saki chisato) . -1)
 ((kanna chisato) . -1))

となります。若干ピンとこない部分もあるかも知れませんが、計算上は矛盾無くデータの内容を表しています。

参考までに、スコア 1 の相互関係の中身を見てみると

(map (lambda (p)
       (find-relation (cons (caar p) (cadar p))
		      identity))
     (filter (lambda (n)
	       (= (cdr n) 1))
	     (map (lambda (n)
		    (cons n (apply score-between n)))
		  (all-combinations))))
(((kanna . mai) (desc "喰ってやるよ") (score . 1))
 ((saki . airi) (desc "好き") (score . 1))
 ((maimi . airi) (desc "良き妹") (score . 1))
 ((saki . erika) (desc "彼氏にしたい") (score . 1)))

のようになります。

まとめ

以上の調査を経て気になった問題点を列挙してみます。

特に最初の点に関して、「百合的」なるものの質的評価がなかなか難しいと感じました。例えば「大好き」も「良き妹」も同じ 1 と評価してしまっているのが妥当かどうか、といったことです。

また、スレにて与えられた情報を評価・分析する方法としては有効だとしても、逆方向のフィードバックの手段がなかなか見つからないというのが三つ目の問題です(技術力不足とも言います)。(注:画像化の方法が分かりました。追記参照)

最後に、プログラムソースを示します。実行には PLT Scheme が必要です。文字コードUTF-8 で保存した上で、(load "c-ute.ss") としてください。文字化けする場合はターミナルUTF-8 を表示できるよう設定する必要があります。がんばってください。

プログラム

c-ute.ss:

(require (lib "etc.ss")
         (lib "list.ss")
         (lib "26.ss" "srfi")
         (lib "delete.ss" "srfi" "1"))

;;; Utilities

(define true? (compose not not))

(define (ignore _) #f)

(define fif
  (case-lambda
    ((predicate consequent)
     (fif predicate consequent ignore))
    ((predicate consequent alternative)
     (lambda (x)
       (if (predicate x)
           (consequent x)
           (alternative x))))))

(define (concat! xs) (apply append! xs))

(define (mapconcat f lst sep)
  (let lp ((str (f (car lst)))
           (lst (cdr lst)))
    (if (null? lst)
        str
        (lp (string-append str sep (f (car lst)))
            (cdr lst)))))

(define (slice-string str len)
  (let lp ((res '())
           (str str))
    (if (<= (string-length str) len)
        (reverse! (cons str res))
        (lp (cons (substring str 0 len) res)
            (substring str len)))))

(define (break-string str len)
  (mapconcat identity (slice-string str len) "\\n"))

;; NOTE: input and output ports have to be either file-stream or #f
;; (i.e., cannot be a string port)
(define (run exe opt in out)
  (let-values (((p p-i p-o p-e)
                (subprocess out in #f exe opt)))
    (subprocess-wait p)
    (close-input-port p-e)))

;;; Database

;; http://ja.wikipedia.org/wiki/%E2%84%83-ute

(define names
  '((erika . "えりか") (maimi . "舞美") (saki . "早貴") (airi . "愛理")
    (chisato . "千聖") (mai . "舞") (kanna . "栞菜")))

(define (symbol->name sym)
  ((fif true?
        cdr)
   (assq sym names)))

(define nodes '())
(define edges '())

(define (relate from to desc score)
  (let ((n (cons from to)))
    (or (find-relation n
                       (lambda (r)
                         (let ((d (assq 'desc r))
                               (s (assq 'score r)))
                           (set-cdr! d (cons desc (cdr d)))
                           (set-cdr! s (+ score (cdr s))))))
        (begin
          (set! nodes (cons n nodes))
          (set! edges (cons (cons n `((desc ,desc)
                                      (score . ,score)))
                            edges))))))

(define (find-relation n k)
  ((fif true? k)
   (assoc n edges)))

(define (related? x y)
  (find-relation (cons x y) (lambda (_) #t)))

(define (from? n x)
  (eq? (car n) x))

(define (to? n x)
  (eq? (cdr n) x))

(define flip-relation
  (case-lambda
    ((n)
     (and (related? (cdr n) (car n))
          (cons (cdr n) (car n))))
    ((n k)
     ((fif true? k)
      (flip-relation n)))))

(define (get-score n)
  (cdr (assq 'score n)))

(define (get-description n)
  (cdr (assq 'desc n)))

(define (describe-relation n)
  (find-relation n get-description))

(define (score-relation n)
  (or (find-relation n get-score) 0))

(define (print-node . ns)
  (for-each (cute find-relation <>
                  (lambda (r)
                    (display
                     (format "| ~a => ~a  (~a)~%"
                             (caar r) (cdar r)
                             (mapconcat (lambda (s)
                                          (string-append "\"" s "\""))
                                        (cdr (assq 'desc r))
                                        ", ")))))
            ns))

(define (iter-nodes k)
  (let lp ((nodes nodes))
    (unless (null? nodes)
      (k (car nodes))
      (lp (cdr nodes)))))

(define (filter-nodes p)
  (let ((ns '()))
    (iter-nodes (fif p
                     (cut find-relation <> (lambda (n)
                                             (set! ns (cons n ns))))))
    ns))

(define (from-links)
  (map car nodes))

(define (to-links)
  (map cdr nodes))

(define (all-members)
  (delete-duplicates! (from-links)))

(define (all-pairs) nodes)

(define (ordered-pairs)
  (concat! (map (lambda (x)
                  (map car
                       (sort (filter-nodes (cute to? <> (car x)))
                             (lambda (x y)
                               (> (get-score x) (get-score y))))))
                (sort-nodes (map (lambda (x)
                                   (cons x (score-loved x)))
                                 (all-members))))))

(define (all-combinations)
  (let lp ((cs '()) (ns nodes))
    (if (null? ns)
        cs
        (let ((n (car ns)))
          (lp (if (member (list (cdr n) (car n))
                          cs)
                  cs
                  (cons (list (car n) (cdr n)) cs))
              (cdr ns))))))

;; number-list :: [a] -> [(a . Int)]
(define (number-list ls)
  (let lp ((ns '()) (ls ls))
    (if (null? ls)
        ns
        (let ((x (car ls)))
          (lp ((fif not
                    (lambda (_) (cons (cons x 1) ns))
                    (lambda (n)
                      (set-cdr! n (add1 (cdr n)))
                      ns))
               (assq x ns))
              (cdr ls))))))

;; sort-nodes :: [(a . Int)] -> [(a . Int)]
(define (sort-nodes ns)
  (sort ns (lambda (x y)
             (> (cdr x) (cdr y)))))

(define (diff-nodes ms ns)
  (let lp ((ds '()) (ns ns))
    (if (null? ns)
        (sort-nodes ds)
        (lp (let* ((n (car ns))
                   (m (assq (car n) ms)))
              (cons (cons (car n)
                          (- (cdr m) (cdr n)))
                    ds))
            (cdr ns)))))

(define (get-total-score x p)
  (foldr (lambda (n acc)
           (+ (get-score n) acc))
         0
         (filter-nodes (cut p <> x))))

(define (score-loved x)
  (get-total-score x to?))

(define (score-loving x)
  (get-total-score x from?))

(define (score-between x y)
  (+ (score-relation (cons x y))
     (score-relation (cons y x))))

(define (-> x)
  (display (format "~%Links from [~a]~%" x))
  (iter-nodes (fif (cut from? <> x)
                   print-node)))

(define (<- x)
  (display (format "~%Links towards [~a]~%" x))
  (iter-nodes (fif (cut to? <> x)
                   print-node)))

(define (<-> x)
  (display (format "~%Reciprocal links for [~a]~%" x))
  (iter-nodes (fif (cut to? <> x)
                   (lambda (n)
                     (flip-relation n
                                    (lambda (m)
                                      (print-node m n)))))))

(define (<=> x)
  (display (format "~%Reciprocal matches for [~a]~%" x))
  (iter-nodes
   (fif (cut to? <> x)
        (lambda (n)
          (flip-relation n
                         (lambda (m)
                           (if (ormap (lambda (x)
                                        (ormap (lambda (y)
                                                 (equal? x y))
                                               (describe-relation m)))
                                      (describe-relation n))
                               (print-node m n))))))))

(define (<?> x)
  (let ((to (assq x (number-list (from-links))))
        (from (assq x (number-list (to-links)))))
    (display (string-append
              (format "~%Link statistics for [~a]~%"
                      x)
              (format "| ~a => ~a (love ~a)~%"
                      x
                      (cdr to)
                      (score-loving x))
              (format "| ~a => ~a (love ~a)~%"
                      (cdr from)
                      x
                      (score-loved x))))))

(define (info x)
  (for-each (cut <> x)
            (list <- <-> <=> -> <?>)))

;;; GraphViz (http://www.graphviz.org/) support

(define graphviz "C:/Program Files/ATT/Graphviz/bin/dot.exe")

(define (nodes->dot ns)
  (string-append "digraph cute {\n"
                 ;;"\tordering=out;\n"
                 ;;"\trankdir=LR;\n"
                 "\toverlap=true;\n"
                 "\tnode[fontname=\"msgothic.ttc\"];\n"
                 "\tedge[fontname=\"msgothic.ttc\",fontsize=9];\n"
                 (let lp ((str "") (ns ns))
                   (if (null? ns)
                       str
                       (let* ((n (car ns))
                              (s (score-relation n)))
                         (lp (string-append
                              str
                              (format "\t\"~a\" -> \"~a\""
                                      (symbol->name (car n))
                                      (symbol->name (cdr n)))
                              (format "[label=\"~a\",color=\"~a\","
                                      (break-string
                                       (car (describe-relation n))
                                       7)
                                      (cond ((> s 0) "red")
                                            ((= s 0) "green")
                                            (else "blue")))
                              (format "style=\"bold~a\"];\n"
                                      (if (and (not (= s 0)) (< s 1) (> s -1))
                                          ",dashed"
                                          "")))
                             (cdr ns)))))
                 "}"))

(define (write-dotfile dot file)
  (and (file-exists? file) (delete-file file))
  (with-output-to-file file
    (lambda ()
      (display dot)))
  file)

(define (dot->png dot png)
  (call-with-input-file (write-dotfile dot "c-ute.dot")
    (lambda (in)
      (and (file-exists? png) (delete-file png))
      (call-with-output-file png
        (lambda (out)
          (run graphviz "-Tpng" in out)))))
  'done)

;;; Setup database

;; Based on:
;; http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/116-142
(begin
  (relate 'maimi 'erika "大好き" 1)
  (relate 'maimi 'kanna "良き妹" 1)
  (relate 'maimi 'airi "良き妹" 1)
  (relate 'maimi 'mai "姉妹" 0)
  (relate 'erika 'maimi "一番可愛いよ" 1)
  (relate 'erika 'kanna "仲間" 0)
  (relate 'erika 'chisato "おソロパジャマ" 0)
  (relate 'kanna 'erika "仲間" 0)
  (relate 'kanna 'maimi "好き" 1)
  (relate 'kanna 'saki "喰ってやるよ" 1)
  (relate 'kanna 'mai "喰ってやるよ" 1)
  (relate 'kanna 'airi "大好き" 1)
  (relate 'kanna 'chisato "愛理に手出すんじゃねぇよ" -1)
  (relate 'saki 'maimi "荷物整理" 0)
  (relate 'saki 'erika "彼氏にしたい" 1)
  (relate 'saki 'kanna "興味がある" 0.5)
  (relate 'saki 'chisato "愛理に手出すんじゃねぇよ" -1)
  (relate 'saki 'airi "好き" 1)
  (relate 'airi 'kanna "受け入れる" 1)
  (relate 'airi 'chisato "最近親密" 1)
  (relate 'mai 'erika "保護者" 0)
  (relate 'mai 'maimi "姉妹" 0)
  (relate 'mai 'chisato "恋人" 1)
  (relate 'chisato 'erika "おソロパジャマ" 0)
  (relate 'chisato 'mai "恋人" 1)
  (relate 'chisato 'airi "最近親密" 1))

;; query relations / draw graphs

(if (file-exists? graphviz)
    (dot->png (nodes->dot (ordered-pairs))
              "c-ute.png")
    (for-each info (all-members)))

追記(グラフ描画について)

Graphviz というソフトによって関係図を可視化できる、ということを教えていただきました(既に上プログラムを実行すると自動的に関係画像を作成するようにしてあります)。ここでは技術的な観点から幾つか注意点を挙げておきます。

まず、Scheme プログラムから Graphviz を動かす方法について。コマンドラインからの起動のように、プログラムへのオプション文字列で入出力ファイルを指定する方法ではどうも上手く行きませんでした。調査の結果、入出力ファイルポートScheme 側で用意しておく必要があるようです。処理系によって異なりますが、PLT Scheme の場合 subprocess という関数を次のように呼び出します。

(subprocess output-port input-port #f "/path/to/dot.exe" "-Tpng")

ここで output-port は png画像ファイルへの出力ポート。input-port は dot ファイルグラフの定義ファイル)の入力ポートです。エラーポートは必要無いでしょう (#f)。

dot という名前の実行ファイルが、関係図のような有向グラフを描画するプログラムです。最後にオプション文字列として出力形式を指定します(png, jpeg, gif, etc.)。

次に dot ファイルScheme で書く方法ですが、以下の基本的な有向グラフの書式

digraph g {
  A -> B;
  B -> C;
  C -> A;
}

を理解すれば、後は実直に Schemeデータを当てはめて format 関数等で変換するだけです。

(string-append
 "digraph g {"
 (format "~a -> ~a;" (car node) (cdr node))
 "}")

問題は、ノードを配置する順番によって出来上がる画像が変わってくる、ということです。

より見た目に分かりやすくするための工夫としては、相互にリンクするノード同士が dot ファイル上でも近接して出力されるようにすると良いでしょう。関連の強いものが画像の上でも近くに表示されるようになります。

また上述(特に例3)のスコア概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。

2007-08-04

東大卒の俺がプログラマになった理由

http://anond.hatelabo.jp/20070802021749

東大卒の俺がプログラマになった理由は二つある

理由1: プログラミングってすごい楽しい

理由2: プログラミングは食べてける程度には儲かる

種明かしをしよう。

東大情報系を卒業する頃には、

"ゼロから"

CPUの設計ができて、プログラミング言語を設計し、コンパイラが書けて、OSを載せて、

その上で例えばレイトレーシングを動かせるくらいの力量がつく。

が、しかしそれらは全てやり方さえ知ってれば普通高校生でもできる。

簡単なことを単語を難しくかえて書いただけだ。

C言語をマスターしてるかどうかを低レベルな話なんていってるほうが低レベルである。

SQL構文暗記してる?」くらいのレベルの低さだ。

C言語って意外と奥が深い。C99なんてもう何が何だかさっぱりだ。

4年生の卒論でやるのは、例えば、とあるLISP処理系GCを、

ある仮説を立てて、その仮説のもとで最適なアルゴリズムを設計し、

実際に処理系組み込み、仮説が現実にどれくらいあっているかを検証することで、

そのアルゴリズムの良さを測る、といったレベルだそうだが、これは平たく言えば

「ご本に書いてあることをその通りやって、キッチンタイマーで時間はかったら短くなりました!」

というレベルだ。卒論なんて東大といえどもそんなにレベルは高くない。

上記のことは普通プログラマーなら半年も訓練してれば簡単なことである。

また、ここで注意していただきたいのは、プログラミングなんて誰がやっても同じということだ、

という奴がかくコードは非常に雑であることが多いと言うことだ。

機械語を書く際の冗長な作業を軽減するためのプログラミング言語であり、

もっともプリミティブな部分が定義されていれば、あとはそれを別表現で定義すればいい。

だが、対象を別の対象へ写像して調べる表現論というのものは、数学の1分野にもなってる

ぐらい複雑な分野で、これを中学生でもできるとかいってる人の底の浅さがうかがい知れる。

ここ5年くらいの情報系での流行機械学習だ。

DSで使われている手書き文字認識や、

銀行で使われている静脈認証、

DNA解析、

携帯電話などの無線通信で使われている符号化、

動画エンコードで使われている圧縮技術などが関連している。

機械学習に関する情報のページ

http://ibisforest.org/index.php?FrontPage

東大生はこういうことを仕事にしている人もいる。

だが、開発をしてる東大生も意外と多い。

そして、こういうことを仕事にすると、

プログラマーの倍の労働時間で、同等の給料を稼げる。

もちろん、全くコードを書かないわけではない。

誰がやっても同じ部分であるプログラミングは外注する。

R&Dが高給だと思ってる人は一回民間に就職してる人に

聞いてみよう。給料はほぼ同等か少し高いぐらいで

毎日研究午前様労働となる。


もちろん、大規模なプログラムの設計は重要だ。

だけど、設計と吠える人ほど設計センスがないという現実がある。

本当に難しい部分の設計というのは、例えば、NTT Dataにいる東大生が丸投げしている。

あるいはSuicaのようなシステムならば、日立東大生。

JRのダイア自動制御システムJR東大生。

他にも大規模システムの例はいくらでもある。

だが、別に東大生だけがやってるわけではない。NTT Data、日立JR等は東大生の

推薦枠が大きいので東大生が多いだけである。特にNTT Dataは東大生は

推薦がとれなかったら学歴フィルターで落とされることが多いのも有名である。

だがどっちにしろ重要なのは、この辺の企業がほんとに重要な部分を設計

してるのではなく、丸投げしているということ。


あとがき

上の文章は特に誇張してません。

東大にいる80%の人は本気を出せばそれくらいのポテンシャルがある。

だけど、同様に一般人の78%の人も本気を出せばそれぐらいのポテンシャルはあります。

上位5%は常に本気。こういう人はほんとにすごいです。

でも下位95%はやる気がない。4年次に行列式の定義とか聞くと答えられる人はほとんどいません。

アメリカへつれていき、いきなり英語でスピーチをさせたら無難にこなすレベルもいるけど、

語学は人による差が激しいのでなんともいえません。

あとは・・・C言語をマスターしてるレベルといったら、東大工学部を連れてくると、丁度いいかもしれない。

だけど、文系の人はC言語なんて教えてもほとんどわかりませんよ。




そういや東大教養課程で扱うプログラミング言語Rubyになるらしいね。LLの適度なヌルさは教育向きだと思う。

情報系には別のカリキュラムがありますが、多分上位15%しか理解していません。

そもそも計算機プログラミングJavaだったころにも本当に理解してたのは上位15%程度でした。

2007-06-04

自由につかいこなしたい言語

http://anond.hatelabo.jp/20070604030827

あるある、いっぱいある。最近特にHaskell、そしてLISPに興味がわきつつある。使いこなしたいよー。

でも、一番切実なのは、なんといっても日本語!何十年と経つけど未だ使いこなしていない。奥が深いよー。

2007-05-28

reducel/reducer (2)

Perl/Python/Ruby/Lisp/Scheme/Haskell/Ocaml 辺りを触っている人にはあの説明で十分なんですよ……。というか、弾さんはあの例からそのトレース結果をいかに素早く連想出来るかを問うているんじゃないのか?

FizzBuzzが「こういう処理をしたい」という要求をコードに落とすだけだったのに、その続編でいきなり要求分析までさせるの? 納得いかないなあ。

読解力の無い人にも仕事をさせるのがSE仕事ですよ。>id:kejinan

2007-05-24

http://anond.hatelabo.jp/20070524000131

そうそう、プログラムの組み立て方を学ぶ前の、とりあえず試すために覚える言語ってなにがいいのかな?

とりあえず俺のおすすめを書いておくよ。

  1. まず、「文字を書いたら結果が出る。文字を変えたら結果が変わる。ミスをするとたまに変なことになる、思い通りになるのではなくて書いたとおりになる」を習得するために、HTML3.2をやる。開発環境がどこにでもあるのも良い。
  2. 次に、ゲームで恐縮だが「カルネージハートポータブル」をやるとよい。PSP版はわかりやすいチュートリアルも付いているしおすすめだ。繰り返し、条件分岐、ブラックボックスっぽい「チップ」という名の「ライブラリ」を組み合わせて、勝利するという「目的」に向かってプログラムを組みまくるという体験ができる。このとき、一通りクリアするまで絶対に他人のプログラムを読まないこと!(モチベーション維持のため)あと、カルネージハートには大会等も開かれているので、他人のソースが結構読める。クリア後は、他人のプログラムを読んで意図を汲む練習をここで行うことができるので必ずやっておこう。
  3. その次、Cを授業か独習Cなんかでつまんねーなと思いながら習得すべし。
  4. C++を、他人のソースが読める程度に習得。
  5. やりたいことができる、イマドキの言語へ。Rails使いたかったらRubyだっていいし、ManagedDirectXのためにC#やったっていい。
  6. 気が向いたらlisp

まあでも結局、「プログラミングがしたいからプログラムを覚えよう」っていうのは身につかないんだ。

PCにこれこれをさせたい!」と強烈に思って、なんとしてもやりきらなきゃいけない状況に追い込まれれば簡単に習得できるよ。「ゲームが作りたい!」「エロ画像自動で集めたい!」「卒論データをどうにかして分析しないといけない!」でもなんでも良いんだけど。

EXCELテキストファイルから物凄い大量の入力をしてグラフを大量に印刷しなきゃいけないとかいう羽目になってVBAの達人になっちゃうとか、そんな感じ。

2007-05-22

スクリプト言語使用者におけるハマり度レベルの変遷

LV0 スクリプト言語?どうせAUTOEXEC.BATとかだろ?どうでもいいよ…

LV1 Perlはあんまり堅苦しくないな。ってかこのor dieって何なの?

LV2 流行言語は綺麗だな。Rubyってのはなんか日本人多くて結構いいかも。

LV3 Rubyって神じゃね?理想の言語って感じ・・・

LV4 PHPも気が利くわりにドジっ子でかわいいな。LispとかSchemeとかHaskellもいい・・・

LV5 Pythonってワンライナー書けないのにWeb2.0言語扱いされててうぜぇ。Python死ね!

LV6 Python結婚してくれ!

LV7 やべぇPython最高!Pythonエディタさえあれば生きていける!

LV8 Python結婚した!俺はPython結婚したぞ!!

LV9 やっぱRubyRailsは最高だわ

MAX sed/awkとちゅっちゅしたいよぉ〜

http://anond.hatelabo.jp/20070522174635

2007-05-03

中二病プログラマ

  1. はてなスッタフの日記を見始める
  2. カバンの中にいつもリファレンス本を入れておく
  3. 普通の人にとっては)おもしろくもないコードを見始める
  4. (他のプログラマblogを見て)やさぐれる
  5. 眠れない午前2時
  6. 苛立ちがキーボードを叩く(あとでスマートな方法が見つかってヘコむ)
  7. Ruby
  8. Perl
  9. Lisp
  10. コードの書けないSEはいらねーよなぁ」
  11. 有名になったプログラミング言語を「有名になる前から知っている」とムキになる
  12. Linuxカーネルコードは汚い」
  13. 自分にとってのベストテキストエディタ探しを始めたりする。
  14. 仕様変更に対して激昂して「プログラマを尊重してくれ」と。
  15. カスタマイズの仕方も分からないのにEmacsViを使う。
  16. リファクタリングなんてもう必須じゃん?」って言って関数名の変更に軟着陸する
  17. ひげぽんの発言に感銘し、ソフトを作り出すが考えられることはよくあるユーティリティアプリだけ。
  18. (本当の)プロに対して評価が辛い。
  19. プログラム勉強をある程度して言語に詳しくなると「Lispって括弧だらけでキモいよな」と急に言い出す。
  20. 行き場のない思いをプログラマ板に費やす。
  21. MINIXソースを全て読んでいることに対するすごい自慢。
  22. プログラマ収入問題に積極的になり、即絶望(どうしようもないから)。
  23. 急に括弧や改行の位置の良い・気持ち悪いを言い出す。
  24. 母親に「どこいくの?」と聞かれて、「スタバプログラミング
  25. Linux」「null」「char」をどう読むかで熱論になる。
  26. リファレンス本や入門本などこれまで自分が買っていた本が物凄く要らないものに思え、急に処分する。(例:http://d.hatena.ne.jp/naoya/20060604/1149377759

……普通あるあるネタと批判が混ざった内容ですまん

LL編プログラミング言語ヒエラルキーにおける罵倒

perlRuby
CPANみたいなのはないの?
Rubyperl
それってオブジェクトって言えるの?
perlPHP
もう少しセキュアに書けないの?
PHPperl
単体でDBが扱えないの?
RubyPHP
もう少しわかりやすく書いてくれないかな?
PHPRuby
もう少しパフォーマンス良くならない?
Java → 他LL言語
結局どれも大規模開発には向かないよね。
LISP → 他言語
なんでそんなにごちゃごちゃしてるの?
Smalltalkオブジェクト指向言語
結局劣化コピーじゃないの?

Pythonはよく知らない((いや、他もよく知らないけど))のでパス。最後の方はおまけ。採点お願いします。

2007-05-02

プログラミング言語ヒエラルキーにおける罵倒

http://www.geekpage.jp/blog/?id=2006/12/13

プログラミング言語ヒエラルキーにおいて、上位が下位に対してどう見下してるのかを書いてみた。詳しくない言語も無理して調べながら書いてある。あと、言語に理解の無い人みたいで生々しいかと思って、刺激的かつあまり真っ当でない内容ばっかにしてみたよ!((FORTRAN から Java に「GO TO も実装されてないんですか?」とかそういう、馬鹿にすることを目的とした偏狭で的外れな発言ってことだよ!))((ここにある中では、C# に多重継承が無いことを馬鹿にする C++ プログラマーが真っ当でない指摘のわかりやすい例かな))

みんなが普段どういう不当な見下しをしてるかも教えてね!

Lisp → C

「いつまで経っても言語仕様が貧弱で大変ですね」

アセンブラ → C

「結局アセンブラ翻訳してるだけじゃん」

C → C++

C++ の難解な仕様と戦うぐらいなら C で関数ポインタを使ったオブジェクト指向の方がスマートだね」

STL は糞」

C++C#

中途半端ポインタを隠蔽して何がしたいの?」

「多重継承したくなったらどうするの?」

C → Perl

CPAN 見たって C でコア部分を書いてるライブラリばっかじゃん」

「なんでわざわざ use strict なんて書かなきゃいけないの」

PerlPython

Python って明示的に object継承した場合としなかった場合で挙動が違うって本当なの?」

「インデントブロック(笑)

Python → OO PHP

ライブラリ環境が全然整備されてなくて最悪じゃん。C や C++ で書かれたライブラリをラップしてるだけのはずなのに機能が減りまくってるのも多いし」

OO PHPPHP

ベタ書きしてて楽しい?」

PHPAjax

ウェブブラウザでしか動かないプログラム書いてて楽しい?」

AjaxJavaScript

「簡単な処理をコピペで実装してるだけだね」

JavaScriptVisual Basic

As とか書いてて混乱しない?」

C# があるのにまだ使ってるんだ」

FORTRANCOBOL

「冗長でわかりやすいですね(笑)

「DIVISION の概念って本気で言ってるんですか?」

COBOLAda

「航空宇宙産業専用言語でしょ」

「記述がわかりづらいね」

JavaScriptAda

ペンタゴンで使われてるだけじゃん」

「ガベージコレクタが無い……?」(あるらしいです><

AdaPascal

「昔 Apple で使われてただけじゃん」

「Del…phi…?」

PascalJava

コンパイルも実行も遅いらしいけど何に使うんですか?」

JavaHTMLプログラミング言語であると主張する人々

「処理も記述できないのに何言ってるの」

おまけ

マイクロソフト・ジョークス/プログラミング言語が女性なら

2007-04-30

ブロック付きメソッド呼び出し/レキシカルクロージャについて

ブロック付きメソッド呼び出し」がわからん、ということでいいのかな。この概念は是非とも解ってほしいので、今日始めて Ruby を触った俺が頑張って解説しよう、と思ったけれど、いいドキュメントを見つけたのでリンクしておくよ。

これで解らんかったらOn Lispを途中まで読みんさい(お金がないならWeb 版をどうぞ)。「ブロック付きメソッド呼び出し」は元々関数型言語の界隈で「レキシカルクロージャ」と呼ばれるもので、要するに中身は一緒なのでクロージャが解れば「ブロック付きなんたら」も解る(Ruby を触ったことのない自分が「ブロック付きなんたら」を理解しているのはこれの為)。 On LispCommon Lisp という言語の本なんだけど、 Ruby言語仕様の多くの点で Common Lisp を参考にしているので、勉強するのはそれほど難しくないと思う(つまり見た目はヘンテコだけど中身は Ruby ってこと)。

2007-04-02

LISPの話題というと、ふじさわさんを思い出すな

未踏認定者とかスーパーハッカーと知り合いで・・・みたいな匿名日記を書いてボコボコにトラバされていたときに

「あれ? これって状況的にオソマガのYFさん?」

と思ったけど。

増田で話題になったネタblogで書いていて。しかもanond.hatelabo.jpリンクしないでほのめかし系だったりして。

あー、やっぱりふじさわさんも増田民だったのねと。

ログイン ユーザー登録
ようこそ ゲスト さん