はてなキーワード: Lispとは
全然関係なく、横から口出し。
例えば、JavaとかRubyとかVBとかPHPとか、そういう種類の言語一種類しか使えないプログラマがいたらどう思う?あまり難しい仕事任せられないって思わない?最低限、Cとかアセンブラとかできるだけ低レベルに近い言語はある程度使えてほしいし、できればLispみたいな関数型言語とかOSやコンパイラの理論とか、そういうのを知識としてだけでもいいから知っておいてほしいと思うよね?
思わないよ。
書けるレベルによるんじゃない?
一つの言語でもマスター、ほんとにマスターしている奴なら、いくらでも任せて良いと思うよ。
希に逆もいる。
知っている奴で、VBでむちゃくちゃセンスの良い奴がいて、そいつ別言語に放り込んだらあっさり覚えたよ。
他に応用が利くくらいに一つを覚えるか、複数覚えて補完して覚えるか。
道の違いもあるよ。
例えば、JavaとかRubyとかVBとかPHPとか、そういう種類の言語一種類しか使えないプログラマがいたらどう思う?あまり難しい仕事任せられないって思わない?最低限、Cとかアセンブラとかできるだけ低レベルに近い言語はある程度使えてほしいし、できればLispみたいな関数型言語とかOSやコンパイラの理論とか、そういうのを知識としてだけでもいいから知っておいてほしいと思うよね?
だったらどうして、古文や漢文の勉強が自分には意味ないって思うかなあ?日本語で文章を書くのは、仕事上の重要なスキルでしょ。まずその前提がよくわからない。
横槍だが、勉強する時間にも限りがあるし、向き不向きもあるんだから何でもかんでもやればいいってものでもない。どの分野の強化でも意味が歩かないかは一律に決まるものじゃないし全分野の知識を身につけることは無理なんだから各人に合わせて取捨選択しないと。学校で教えておけばなんでも身につくなら世の中エリートばかりになってるよ。
別に「新たに」なんて言ってないけど。ただし、資源ってのはメンテナンス要員が必要なんよね。現在の教育は、その中から一握りの専門家とそこそこ多くのファンを再生産する役目は果たしてると思うけどな。
こういうのはほかのことをやった場合の費用対効果も考えないとだめ。なぜ特定産業のメンテナンスだけ優遇して税金とかの労力をつぎ込まないといけないのかがわからん。メンテナンスに必要なリソースは有限。観光立国でも金融立国でもものづくりでも自給率上昇でも結局我田引水ってことじゃないかと。そういう利益誘導はポジショントークであって部外者は真に受けちゃだめだろ。
「楽しむ」という観点で言えば、古典や漢文の題材がそれらよりも優先するようには思わない。
劣るとも思わないけどね。ただね、現代文学は古典文学を下敷きにしてたりするから両方読めると楽しいことは知っておいた方がいいだろうね。
文学に限らずどんあものでも楽しいかどうかは人それぞれ。古典に限らず学校の授業に苦痛を感じる生徒が少なくないのは常識じゃないかと。
それとさー、どうしてあれを教えたらこれを教えるのやめろって話になるわけ?両方教えたらいいだけじゃないの。ただでさえゆとり教育なんだからさ。たとえば俺は高校時代理科と社会を全科目履修したし、数学も数III数Cまでやったし、古文や漢文だったら例えば岩波文庫の注釈付きなんかで訳なしで読めるよ。
いやがってるやつに教えるのは金や労力や時間の無駄遣い。ゆとり教育は叩かれすぎだと思う。正しい政策だったと個人的には思ってる。学校で教えないならやらないなんてやつは教育しなくて結構。授業時間だって有限だからそりゃ各教科の授業時間減らせば全部薄く教えるしかないし、深くやろうとすると分野は絞らないといけない。どっちがいいかは一概に言えるものでもないし、勉強自体向いてないのもいるでしょ。
ただし、君が思ってるほど高校の行列計算は一般には役に立たないし、観光は大きな産業になり得る。理由は上に書いたとおり。
そりゃ基礎技術力が高く工業力が強いほうが観光立国よりずっといいだろ。
観光業や製造業だけでGDP決まってるわけじゃないんだから比べても意味ない。日本の低成長はマクロ政策の失敗が大きいでしょ。あと人口の少ない国なら人口比で観光客はこさせやすいから雇用増やしやすいだろうけど、日本だとそうはいかない。観光だけで食ってける量は限られてる。そもそも貿易依存低いし、外需ばかり頼ってないで内需をしっかりさせないことにはどうにもならない。
例えば、JavaとかRubyとかVBとかPHPとか、そういう種類の言語一種類しか使えないプログラマがいたらどう思う?あまり難しい仕事任せられないって思わない?
古典が読めるってことはまったく評価にならんだろ。プログラマとしては。
無論、最低限の英語力は必須だし、英語力は高ければ高いほどいいが。
最低限、Cとかアセンブラとかできるだけ低レベルに近い言語はある程度使えてほしいし、できればLispみたいな関数型言語とかOSやコンパイラの理論とか、そういうのを知識としてだけでもいいから知っておいてほしいと思うよね?
そんなの情報系の基礎教養だ。微積分学や古典を勉強するよりははるかに楽だし。
だったらどうして、古文や漢文の勉強が自分には意味ないって思うかなあ?日本語で文章を書くのは、仕事上の重要なスキルでしょ。まずその前提がよくわからない。
ビジネス定型文書くのにはもちろん、企画書や仕様書や技術書を書くのにも、古典や漢文の知識なんぞ必要ないだろ。
別に古典教育がどうなろうが観光ビジネスの改革にはならんだろうに。
日本文学についてはそうかもな。でも、当の近代文学もろくに読んでない奴が、下敷きにだけ手出しても意味ないだろ。まずそっちが先じゃないかな。
それとさー、どうしてあれを教えたらこれを教えるのやめろって話になるわけ?両方教えたらいいだけじゃないの。ただでさえゆとり教育なんだからさ。
教育を強化するなら数学優先にすべきだな。あと英語の強化かな。古典なんか最後でいいよ。
それは単なる君の不勉強でしょ。高校までで役に立つこと勉強したいんだったら高専とか工業高校に行くべきなんだし。普通高校ってのはジェネラリストを育成するところなんだからね。
それに、君はたまたま高校で習った行列計算だけで用が足りてるのかもしれないけど、行列の計算だけできても普通は何の役にも立たない。
足りてるわけねーだろ。仕事やりながら勉強してるような状態だよ。これが、高校でやってなきゃ偏微分とかと同レベルの理解度でしかなかったんだと思うとゾッとするね。基礎だけでも仕込まれててよかった。
というか、固有値やベクトル空間を理解せずにどうやって大学を卒業できたんだ?力学も振動論も微分方程式も統計学も信号処理も量子力学も、何一つ理解できないでしょ、それじゃ。
数学系でも電子工学系でもねーもん。適当に試験前の一夜漬けで切り抜けてた。終わったら速攻忘れた。あと量子力学なんか何に使うんだよプログラマが。
信号処理は真面目にやっときゃよかったなとちょっと思うね。今んとこクリティカルにそういうもんが必要になる仕事はやってないが。
俺が思ってるものと比べてるんじゃない。「古典と」比べてんだよ。ちゃんと答えろ。
なんだ、君、プログラマーだったのか。だったら話が早い。
例えば、JavaとかRubyとかVBとかPHPとか、そういう種類の言語一種類しか使えないプログラマがいたらどう思う?あまり難しい仕事任せられないって思わない?最低限、Cとかアセンブラとかできるだけ低レベルに近い言語はある程度使えてほしいし、できればLispみたいな関数型言語とかOSやコンパイラの理論とか、そういうのを知識としてだけでもいいから知っておいてほしいと思うよね?
だったらどうして、古文や漢文の勉強が自分には意味ないって思うかなあ?日本語で文章を書くのは、仕事上の重要なスキルでしょ。まずその前提がよくわからない。
別に「新たに」なんて言ってないけど。ただし、資源ってのはメンテナンス要員が必要なんよね。現在の教育は、その中から一握りの専門家とそこそこ多くのファンを再生産する役目は果たしてると思うけどな。
あと、日本の観光ビジネスはまだ産業として未熟だよ。ヨーロッパ行ってみるとわかるけど、日本の観光ビジネスは横のつながりが弱くて商売がヘタクソ。たとえば厳島神社なんて世界遺産になってるのに、宝物殿では大した物展示されてないし、宮島にある飲食店はろくなお店がない。
劣るとも思わないけどね。ただね、現代文学は古典文学を下敷きにしてたりするから両方読めると楽しいことは知っておいた方がいいだろうね。
あと、古文とか漢文ってのは現代文と読み書きや文法の体系が少しだけだけど違うから、文法ぐらい教えておかないと、興味を持った人があとで独学たって難しくなってしまうことは理解できるよね。いまの高校の教育はそういう目的で文法だけを中心に教えてるようなもんだよ。
それとさー、どうしてあれを教えたらこれを教えるのやめろって話になるわけ?両方教えたらいいだけじゃないの。ただでさえゆとり教育なんだからさ。たとえば俺は高校時代理科と社会を全科目履修したし、数学も数III数Cまでやったし、古文や漢文だったら例えば岩波文庫の注釈付きなんかで訳なしで読めるよ。
俺も理系人間で、たいして出来がよくなかったから思うんだが、行列は大学入試という重しがある高校生の間にある程度慣れておくべきものだ。
大学で習った偏微分とか周回積分とかいっこも覚えてない俺でも行列演算は一通り出来るし、プログラミングとかで使えるのは、高校でみっちりやったからだよ。
それは単なる君の不勉強でしょ。高校までで役に立つこと勉強したいんだったら高専とか工業高校に行くべきなんだし。普通高校ってのはジェネラリストを育成するところなんだからね。
それに、君はたまたま高校で習った行列計算だけで用が足りてるのかもしれないけど、行列の計算だけできても普通は何の役にも立たない。それに、大学の線型代数やったんなら、高校でやるレベルの話なんて子供だましもいいところだってわかるでしょ。
というか、固有値やベクトル空間を理解せずにどうやって大学を卒業できたんだ?力学も振動論も微分方程式も統計学も信号処理も量子力学も、何一つ理解できないでしょ、それじゃ。
行列と比べてどうなんだと聞いてるんだが。
だから、本来比べるのがおかしいし比べられないと書いたんだが。
ただし、君が思ってるほど高校の行列計算は一般には役に立たないし、観光は大きな産業になり得る。理由は上に書いたとおり。
そりゃ基礎技術力が高く工業力が強いほうが観光立国よりずっといいだろ。
http://anond.hatelabo.jp/20080224122041
推薦図書については末尾に書くけど、その前にちょっとお話。うざいと思ったら読み飛ばして末尾に行ってね。
どの言語がよいか、というのは「ゴルフのクラブで一番よいクラブは何か」という問いと同じなので、正直意味のある問いとは思えないなあ。言っちゃ何だけど、言語を覚えて満足してる奴は、高いクラブを買って満足してるだけの奴と同じだよ。大事なのは「何をやりたいか」で、それさえ明確になれば後は単なる慣れの問題に過ぎないし。
一つや二つの言語を扱える以上になれない奴は、ごくごくごくごく少数の例外を除けば、所詮人に使われるだけのやつにしかなれんよ。そんなの、大学出てまでやる仕事じゃない。営業並みの対人能力があるとか半導体の回路を引けるならまた別だけど、それはもはやプログラマと呼べる仕事じゃないしね。
ゴルフだったら、ショートホールもあればロングホールもあるし、バンカーに落としてしまうこともグリーン上のヨセもある。プログラマも同じ。大事なのは、
「必要が来たとき最小限の勉強時間でどんな言語にも対応できる能力」
じゃないかなあ。これがあれば、その時点で知っている言語が一つだろうと十個だろうと大した問題にはならんよ。
世の中にある言語は、アセンブラとか C みたいに低水準(機械に近いところ)でやるのに適したものもあるし、C++ や Java みたいに大規模なビジネスアプリの開発に向いてるものもあるし、VB とか Perl みたいに細々とした作業を処理するためのお手軽ツールもあるし、Lisp とかみたいに、実用よりも理論的理解を指向したといえるようなものもある。だけど、アセンブラと Lisp みたいな特殊なものを除けば、どれも基本的な考え方は同じだ。確かに C++ や Java に出てくる「オブジェクト指向」は多少取っつきは悪いけど、きちんとした本を元にして勉強すれば一週間で理解できるよ。あとは処理速度と書きやすさ・手軽さを天秤に掛けての判断にすぎない。ゴルフでいうなら、パターを除けばどのクラブも基本的には原理が同じみたいなもんだ。ウッドとアイアンとウェッジという区別はあるけれど、基本的には飛距離とコントロールのバランスだろう?
どの言語を選ぶかなんてのは所詮は小手先のことなのさ。大事なのは、何をしたいか、何のためにプログラマになりたいかということだ。そのためには、いろんな素養が必要になってくる。
もし、半導体やコンピュータやOSみたいな低レベルな話に近いところ興味があるなら、電気工学とか形式言語理論とか数理論理学とかそういう知識が重要になってくる。ロボットを作ったり生体認証をしたり他の機械やシステムを制御したりというような高度な話に興味があるなら、数学とか統計とか信号処理とか制御工学をきっちり勉強した方がいい。業務で扱われる大規模なシステムを扱いたいのなら、理系の知識よりもむしろ世の中の仕組みを広く浅く知っといたほうがいいだろうね。
もはや、「プログラムが書ける」なんてのは、「ワープロや表計算ソフトが使える」というのに毛が生えた程度の技能でしかないんだ。十五年前なら、「一太郎や Lotus 1-2-3(当時は Word や Excel なんてのはあったのかどうかも微妙)が使える」といえば「即戦力」だったかもしれんが、今更そんなの当たり前の技能でしかないだろ?
大事なのは、「他の奴が簡単には追いつけないもの」を持つことだ。大学での数年間はそのために使うべきだよ。目標を持って真面目にかつ気楽に取り組むことだ。がんばりたまえ。
注意 この文章中でわからない言葉が出てきたらまずはぐぐってほしいが、わからなくても気にすることはない。それらの中身を知っていることは大した問題じゃない。大事なのは全体的な雰囲気だから。
まずは、この本をお薦めしたい。
プログラマ(というよりコンピュータ)が関わるあらゆる分野を、本質を押さえて入門程度に書いた本。「やさしい」という題名だけれど、高校生の基準で考えると「難しい」と思う。大学では、「やさしい」「難しい」の基準が何段階も格上げされるから気にしないように。これが「やさしい」と思えるようになったら大学卒業レベルと思っていい。だから余り気負わず、頭から読もうとせずに適当に面白そうなところを眺めて、興味が出たら他のところも拾い読みするという感じで十分。
その上で、興味を持った分野の本を探したいと思ったら次はこれがお勧めだ。
これを見て、適当にぱらぱらめくって、読みたいものから読めばいいよ。この辺の本なら大学の図書館にはあると思うし。ただし、ここに出ている本はどれも本格的だから、難しすぎると思ったら適当に放り投げていい。そうやって、いろんな分野をつまみ食いしていく間に全体像が見えてくるはずだ。
あと、それとは別に基本情報技術者試験を受けるのもいい。大学の授業についていくための基礎力としては十分なはず。これが易しすぎると思ったら、ソフトウェア開発技術者試験でもいい。もっとも、これに通るぐらいなら大学2年か3年ぐらいの力はあると思うけどね。
エスカレーター式私立中学校に通う男子のプログラミング独習記。(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ってなんだ?)を記述する
3. 挙動を図にしてみる(例をつくる)
4. プログラムの型(program templateってなんだ?)やレイアウトをきっちりつくる
5. テンプレートを変形して、完全な定義をつくる
(なんかプロセスとしてはわかりやすいけど、抽象的でプログラミングしたことのない僕には雲をつかむような感じ...
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はその方言みたいなものってことは今調べてわかった。ふーん。
まだ何がわからないっていうか全部わからないので、アドバイスのしようもないとは思いますが、最初はこれやっとけ!とかこのサイト読めとかあったら教えてください。
ブクマがたくさんついていて、それに対する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
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
ある研究によれば、生産性はそれぞれのプログラマでそれぞれ違う。
でも、あるプログラマに着目すれば、
そのプログラマが時間あたりに書けるコードの行数は、プログラミング言語によらず決まっている、
たとえば一年に50,000行なのだそうだ。
行数が決まっていたら、
どの言語で一番多くのことを達成できる?
そう、Rubyだよね。
例えば C のプログラムより 50 倍遅くなったとして、実行時間はどのくらい変わるだろうか?
もし C のプログラムが 0.01 秒で終わる としたら、
Ruby 版は 0.5 秒。あなたのプログラムは 0.49 秒速くす るために C で書く価値があるのか?
プログラムは開発の時間よりも保守の時間のほうがかかるというのはもはや常識だけども、
Ruby で書いてあれば例えば、
そういう点でも Ruby は非常にいい。
だいたい、スピードに対してごちゃごちゃ言うなら C じゃなくアセンブラで書けばいい。
それをなんで C で書いてるのかって言えば、
それはもちろん「コードがわかりやすい」とか、「早く書ける」って のが理由だろう。
そして、Ruby は C よりわかりやすいし速く書ける。
404 Blog Not Found:「PHPなめんな」と「(Perl|Python|Ruby)をなめんな」の違い
実行速度より実装速度(前編) - Object Station
「1 * 2 * 3 * 4 * 5 ... 1000 は幾つ?」
発祥: http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/
Scheme という Lisp 語族の言語を用いて ℃-ute の相関関係をプログラムし、様々な角度から関係性を分析する手法を紹介していきます(ソースコードは最後に張ります)。
まずは、メンバー間の関係を「リスト」というデータ型で表現します。例えば「栞菜->愛理」という関係は
(kanna . airi)
という形で表すことができます。これに、「大好き」という情報を付加し、ついでにその関係の性質を数値化したものを加えると
((kanna . airi) (desc "大好き") (score . 1))
のようになり、関係図における一つの矢印の情報をデータ化できたことになります(暫定的に、好意は 1、良好・中立は 0、険悪は -1 の3段階で表すことにします)。
メンバー間の全ての関係性をこのデータ単位で定義し、データベース化しておくことで、色んな条件に基づいた検索やスコア計算などが可能となります。
ここで相関関係図における矢印を「リンク」と呼ぶことにして、あるメンバーから他のメンバーへどのようにリンクし、またリンクされているかを調べることができます。
(sort-nodes (number-list (from-links)))
結果:
((kanna . 6) (saki . 5) (maimi . 4) (erika . 3) (mai . 3) (chisato . 3) (airi . 2))
栞菜ちゃんがメンバー全員にリンクを張っていることが分かり、℃-ute ラブっぷりが伺えます。なっきーにも同様の事が言えます。例の「女の子が好き」発言を数値的に裏付ける結果と言えるかもしれません。
ただ、データ不足でリンク件数がまだ少ないのと、リンクの性質(好意/反感など)までは分からない点を考慮する必要があるでしょう。
同様に、リンクの終点の件数を調べてみます。
(sort-nodes (number-list (to-links)))
((chisato . 5) (erika . 5) (kanna . 4) (maimi . 4) (airi . 4) (mai . 3) (saki . 1))
えりかちゃんと千聖ちゃんが高ポイントです。メンバーからの人気や注目度の高さを示すデータですが、千聖ちゃんの場合敵対的なリンクが2件含まれている点に注意してください。
なっきーの被リンク数が極端に少ないですが、単純にデータ不足のためだと思われます。はぶら(ryとか言わないようにお願いします。
リンクに付随するスコアを計算することで、愛情の度合いを測ることができるのではないか、という考えに基づく研究です。
まず、全ての関係性を対象として、スコアがマイナスの関係を抽出してみます。
(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))
まいまいとえりかちゃんが特に堅い・一途だという傾向を読み取ることができます。
今度は組み合わせ(カップリング)の評価です。
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))
となります。若干ピンとこない部分もあるかも知れませんが、計算上は矛盾無くデータの内容を表しています。
(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)のスコアの概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。
http://anond.hatelabo.jp/20070802021749
理由2: プログラミングは食べてける程度には儲かる
種明かしをしよう。
"ゼロから"
CPUの設計ができて、プログラミング言語を設計し、コンパイラが書けて、OSを載せて、
その上で例えばレイトレーシングを動かせるくらいの力量がつく。
が、しかしそれらは全てやり方さえ知ってれば普通の高校生でもできる。
簡単なことを単語を難しくかえて書いただけだ。
C言語をマスターしてるかどうかを低レベルな話なんていってるほうが低レベルである。
C言語って意外と奥が深い。C99なんてもう何が何だかさっぱりだ。
4年生の卒論でやるのは、例えば、とあるLISP処理系のGCを、
ある仮説を立てて、その仮説のもとで最適なアルゴリズムを設計し、
実際に処理系に組み込み、仮説が現実にどれくらいあっているかを検証することで、
そのアルゴリズムの良さを測る、といったレベルだそうだが、これは平たく言えば
「ご本に書いてあることをその通りやって、キッチンタイマーで時間はかったら短くなりました!」
というレベルだ。卒論なんて東大といえどもそんなにレベルは高くない。
上記のことは普通のプログラマーなら半年も訓練してれば簡単なことである。
また、ここで注意していただきたいのは、プログラミングなんて誰がやっても同じということだ、
という奴がかくコードは非常に雑であることが多いと言うことだ。
機械語を書く際の冗長な作業を軽減するためのプログラミング言語であり、
もっともプリミティブな部分が定義されていれば、あとはそれを別表現で定義すればいい。
だが、対象を別の対象へ写像して調べる表現論というのものは、数学の1分野にもなってる
ぐらい複雑な分野で、これを中学生でもできるとかいってる人の底の浅さがうかがい知れる。
銀行で使われている静脈認証、
DNA解析、
http://ibisforest.org/index.php?FrontPage
だが、開発をしてる東大生も意外と多い。
そして、こういうことを仕事にすると、
もちろん、全くコードを書かないわけではない。
誰がやっても同じ部分であるプログラミングは外注する。
R&Dが高給だと思ってる人は一回民間に就職してる人に
聞いてみよう。給料はほぼ同等か少し高いぐらいで
だけど、設計と吠える人ほど設計センスがないという現実がある。
本当に難しい部分の設計というのは、例えば、NTT Dataにいる東大生が丸投げしている。
他にも大規模システムの例はいくらでもある。
だが、別に東大生だけがやってるわけではない。NTT Data、日立、JR等は東大生の
推薦枠が大きいので東大生が多いだけである。特にNTT Dataは東大生は
推薦がとれなかったら学歴逆フィルターで落とされることが多いのも有名である。
だがどっちにしろ重要なのは、この辺の企業がほんとに重要な部分を設計
してるのではなく、丸投げしているということ。
上の文章は特に誇張してません。
東大にいる80%の人は本気を出せばそれくらいのポテンシャルがある。
だけど、同様に一般人の78%の人も本気を出せばそれぐらいのポテンシャルはあります。
上位5%は常に本気。こういう人はほんとにすごいです。
でも下位95%はやる気がない。4年次に行列式の定義とか聞くと答えられる人はほとんどいません。
アメリカへつれていき、いきなり英語でスピーチをさせたら無難にこなすレベルもいるけど、
語学は人による差が激しいのでなんともいえません。
あとは・・・C言語をマスターしてるレベルといったら、東大の工学部を連れてくると、丁度いいかもしれない。
だけど、文系の人はC言語なんて教えてもほとんどわかりませんよ。
そういや東大の教養課程で扱うプログラミング言語がRubyになるらしいね。LLの適度なヌルさは教育向きだと思う。
とりあえず俺のおすすめを書いておくよ。
まあでも結局、「プログラミングがしたいからプログラムを覚えよう」っていうのは身につかないんだ。
「PCにこれこれをさせたい!」と強烈に思って、なんとしてもやりきらなきゃいけない状況に追い込まれれば簡単に習得できるよ。「ゲームが作りたい!」「エロ画像自動で集めたい!」「卒論のデータをどうにかして分析しないといけない!」でもなんでも良いんだけど。
EXCELでテキストファイルから物凄い大量の入力をしてグラフを大量に印刷しなきゃいけないとかいう羽目になってVBAの達人になっちゃうとか、そんな感じ。
LV0 スクリプト言語?どうせAUTOEXEC.BATとかだろ?どうでもいいよ…
LV1 Perlはあんまり堅苦しくないな。ってかこのor dieって何なの?
LV2 流行の言語は綺麗だな。Rubyってのはなんか日本人多くて結構いいかも。
LV4 PHPも気が利くわりにドジっ子でかわいいな。LispとかSchemeとかHaskellもいい・・・
LV5 Pythonってワンライナー書けないのにWeb2.0言語扱いされててうぜぇ。Python死ね!
LV7 やべぇPython最高!Pythonとエディタさえあれば生きていける!