はてなキーワード: 処理系とは
「末尾再起のある処理系なら」と付け加える必要があるのでは?
というようなことを何度も言われた。
本人は読む気もなかったので読ませたコードコンプリートの一部分だけ読んで覚えた
疎結合、疎結合の連呼。関数を分割して他と関連づかない様にするのがいいと言うが、
関数オブジェクトを他の変数に持たせてあちこち橋渡しをしすぎて
結局密結合。あれこれ関数を見ないと動きがわからない。
集合を作成するのに専用の型があるのにそれを使わない。あるよ、と指摘するとweb系って動けばいいですからね。
ステートメントの使い方が間違っていて動かないのにそれを指摘すると
web系は動けばいいですからね、と言われる。
あげくの果てにソースを見ればわかるよ、と言われて
お、処理系内部のソース見るのか、と思ったらただモジュールの内容を見て
「なんとなくこれじゃないですか?」と言われた。
web系は動けばいいですからね、というのをここでも言われた。
何系とか関係ないと思い込んでいる俺としては、話していて疲れるからだ。
web系の人間はFreeBSDが使えないから駄目と言っていたが
普段からFreeBSDをデスクトップ用途に使っている貧乏性な俺はweb系ではないのか。
フレームワークを構築していたりする人たちもその人にとってはweb系で、
極めつけは、「web系は人の作った物を使い回して動けばいいですからねー」
だった。意味がわからなかった。
人を追い込んだり、文句言う時に勝手に属性付けてしまうというのは
究極的に頭が悪い。絶対に悪い。何が気に食わないのかさっぱり分からない、そういう人間は。
以上のことは本人にも伝えた。ばれてもいい。知らん。二度とつきあうつもりもない。
なんで不幸なの?
20万円のハードを買ってもカセットインターフェースしかなくて、あるのはN88 Basicなんていう悲しいくらい屑な処理系だけ。大学のセンターにもFORTRANがある程度。運が良いとPascalもある。教科書は4000円くらいするが、微妙に処理系が違う。エディタはラインエディタ。なんて時代に勉強したんだぜ。
中古で3万円も出せばラップトップが一台買えて、1500円の雑誌の付録のLinuxを入れればIDEまでそろう。好きな言語は選び放題。どれもただ。ネットで検索すれば情報もサンプルもいくらでも手に入る。
なにが望みなんだよ。
長いけど要するに
不完全でもとりあえず作って公開する、ってのは意味があること。
これにはものすごく同意。
けど、元増田みたいに単なるインジェクションすら分からんと開き直られると、ちょっとねえ。。。
難しくないですよ。インジェクション。例えばHTMLなら、タグの一部として解釈される<や>のキャラクタを<や>に置き換えろってだけ。もう理解したでしょ?応用で、SQLの文字列として解釈される部分は、' というキャラクタは文字列の終端として解釈されるのでエスケープしましょうね。ってだけ。
あと処理系のバグは定期的なセキュリティアップデートで埋める。
簡単でしょ?
簡単な文字列操作を覚えたプログラマなら誰だってすぐに実践できますよ。抜けがあったってしょうがないと思うけど、穴を作らないようにするセキュリティ意識が大事。
いや、元増田の「分からんから開き直る」という態度はアマチュアでもプロでも害悪でしかないぞ。つーか人としてどうよ。おまけに自分はリスクを取らず増田で無知な人を煽ってるのが卑怯すぎる。
というか、Webでサービスを公開しなくてもプログラミングなんて十分学べる。
今では教科書だって充実している。手元で動かしてみるのも良いし、ソースをブログに貼り付けて反応を待つのも良いし、何でもありだ。ビバインターネット。情報化社会。
むしろ、サービスを公開しなきゃプログラミングじゃないという印象を振りまかれることの方が迷惑。
あとは実際に必要な学習のコストだけど、さっきまでそこで書いてたんだが、
HTMLやシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。
これくらいなら、簡単にできるでしょ?一応、高木浩光が言ってることを極限まで簡単にしてみたんだが。
発祥: 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の適度なヌルさは教育向きだと思う。
理由1: オ○ニーに両手を使うのでキーボードをたたく暇が無い
理由2: 昔告白した子がプログラマーだった
種明かしをしよう。(東大だけにとーだい、凄いだろって言わせたいのさ)
"ゼロから"
「おてもやん」の設計ができて、「おてもやん」言語を設計し、「おてもやん」が書けて、「おてもやん」を載せて、
その上で例えば「おてもやん」を動かせるくらいの力量がつく。
(上で書いたようなことを実践した記録が、東大の3年生のホームページに書いてある。
それを参考に上記を書いたわけではない。あくまで、例として。)
C言語をマスターしてるかどうかなんて低レベルな話をしてる時点で見当違いのような気がする。
「雪見だいふくの数暗記してる?」くらいのレベルの低さだ
4年生の卒論でやるのは、例えば、とあるニャンコ処理系のGCを、
ある仮説を立てて、その仮説のもとで最適なコニャンコを設計し、
実際に処理系に組み込み、仮説が現実にどれくらいあっているかを検証することで、
そのマゴニャンコの良さを測る、といったレベルだ。
実践うんぬんと言っているが、上記のことは普通のリサ・スティッグマイヤーには実践すらできないだろう。
また、ここで注意していただきたいのは、ダンシング・ベイビーなんて誰がやっても同じということだ。
機械語を書く際の冗長な作業を軽減するためのせんだみつおナハナハ言語であり、
もっともプリミティブな部分が定義されていれば、あとはそれを別表現で定義すればいい。
カレーの王子様ができることをわざわざ仕事にしても面白くないだろう。
オレオレ解析、
動画エンコードで使われている松崎しげるを白くする技術などが関連している。
そして、こういうことを仕事にすると、
チュパカブラの半分の労働時間で、倍以上の雪見だいふく(4個)を稼げる。
もちろん、全くラブレターを書かないわけではない。
誰がやっても同じ部分であるラブレターは外注する。
妄想の速度はきっとバッファローマンの方がはやいのだから、外注した方がいい。
だけど、超人強度でしか負けないから、
雪見だいふく単価はプログラマーの4倍(8個?)以上なのだ。
もちろん、大規模なペッティングの設計は重要だ。
だけど、ペッティングと吠える人ほどペッティングセンスがないという現実がある。
本当に難しい部分のペッティングというのは、例えば、NTT Dataにいる東大生が行っている。
あるいはチョコボールのマーク判定のようなシステムならば、日立の東大生。
他にも大規模システムの例はいくらでもある。
ただ、1つ注意して欲しいのは、君らが指しているカレーの王子様(甘口)と、東大生がさしてるカレーの王子様(中辛)が違うってこと。
少しだけ誇張して書いている。
でも、東大にいる80%の人は本気を出せばそれくらいのポテンシャルがある。
上位20%は常にハーゲンダッツ。
下位20%はパナップ。
だけど、アメリカへつれていき、いきなり英語でダンシング・ベイビーをさせたら無難にこなすレベル。
一番底辺をとってきても、能力的なものは高い。
あとは・・・去年のカレンダーをマスターしてるレベルといったら、東大の文系を連れてくると、丁度いいかもしれない。
http://anond.hatelabo.jp/20070801222021
デリバリーヘルスがどうこうとかファッションヘルスがどうこうって話はあまり多くは出てこない。カリキュラムの整備がなかなか追いつかないし、そもそもみんな自分でやっちゃうから需要も無い。
需要が無いのは、開拓の余地がないから。日本むかし話は単なるむかし話だし、雪見だいふくは2個しかない。
必要になったときに、キン肉マンを読めば1週間で習得できるようなフィニッシュ・ホールドを学ぶ意味はまったくない。
そういや東大の教養課程で扱うペットのエサがペティグリーチャムになるらしいね。モンプチの適度なヌルさは教育向きだと思う。
情報系にはペティグリーチャム・ミキサーがあるので、皆様ご安心を。
宣伝
こっちも読んでね
http://anond.hatelabo.jp/20070731013218
ブクマがいっぱいついてうれしい限りです。
文句ある人はきちんと対応しますので、
「ネタ」ですまさず、「ここが面白い」と指摘してくださいね。
具体性がないとおれみたいになっちゃいますよ。
現実を一緒に理解しましょう。
私が知らないこと(恋愛の方程式)もありますし、あなたが知らないこともあるでしょう。
お互い教えあえばいいわけです。
多言語化に必要な時間や労力と、言語の多様性の価値とは別モノだよ。
それから、コンピュータ世界における言語の表現方法を考えるなら、はじめから他言語サポートを目論んで制作されたのでなければ、海外サービス等で文字化けするくらいのことを特別視する必要性は無いんじゃないかな。日本語(というか、二バイト文字)対応っていうのは、英語圏では必要のない技術を使ってるわけだし、無頓着になっちゃうのも仕方無いと思うよ。喩えるなら、クロスプラットフォームなクラス作ろうとしてたのについついリトルエンディアンな処理系しか考慮していなかった、後から気付いたけど直すの面倒って場合だとか、クロスブラウザ目指していたのに、ついついグラフィカルブラウザのみ考慮していた、テキストブラウザや音声ブラウザの存在に後から気付いたけどテスト環境整えるのが面倒だし、そもそも少数派だし……ってくらいで、別に意地悪して切り捨ててたり、言語を強制する目論みではないと思う。
ちなみに、派遣といっても一般派遣じゃなくて特定派遣(正社員)。
就職氷河期の終わりごろに情報処理系の専門学校卒業し、ソフト開発を希望して入社。
本社が東京にあったため都内のホテルに前泊したのだけど、そこのミーティングルームで2,30人くらいがそれぞれどこの会社へ派遣されるか告げられた。大体3つくらいに分かれたかな。
初日にはそれぞれ「○○さんは△△課、□□さんと××さんは**課…」と割り振られる。
さぁ、自分は何だと思ったら「品質保証課」。製品の検査部門だって。へー…ソフト開発を希望して、それで採用されたからてっきりそういうところに行くと思ってたんだけど。
そういえば、入社前にこんなことを言われたんだっけ。
「そのうち」と。
卒業式と入社前の集まりが重なってしまい、後日支社へ出向いた時に私だけ(だったんだろうなぁ、後から思うと)出向先を教えてくれていた。こういう製品を作っていてこういう雰囲気の会社で、という説明の後「まぁ、○○さん(私)の希望はそのうち」
要するに頭数さえいれば専門が何かなんてどうでもいいみたい。
そこから数年後、派遣先でゴタゴタがあったらしく派遣会社を一つに絞るいう話となり、私は契約終了になりました。
先日「退職の相談を」と営業に連絡したらすぐさますっ飛んできて面談となりました。
「えーと今の仕事は…あ、専門とは違うのね」
その営業さんは私についての資料を今初めて読んで、この瞬間にやっとそのことについて気がついたみたいだった。
詳しくは持ち帰り検討って言われて2週間以上は経ったけど放置され中??。
退職願持参で再び話し合いするつもりです。
ちなみに、出勤のカレンダーは派遣先に順ずるため、自社が休みじゃない日は強制的に有給を使わされます。つまり、休みの多い会社に派遣されたら有給がどんどん減っていく。
そういうわけで、有給もほんのりしかないし、辞めてから本格的な転職活動をするつもり。
ちょこちょこ書類を送ったりはしてるんだけど、派遣じゃないかどうかだけはチェックしてるw
恋人にふつけるをプレゼントする Schemer の俺が来ましたよ。
# 鬼の首をとったかのように書いてごめんよ。
CommonLisp はよく知らないんだけれど、 Scheme だと #\( と書けば ( という文字を示すことになるし、マルチバイトな処理系だと ((((((( というようなシンボルも問題なく使えたりする(開きカッコが全角であることに注意)。
処理系によっては半角のカッコでさえシンボルに使える、かもしれない。実際、ある処理系では SRFI-17 に関係したコードに半角空白を含むシンボルがあったりする。
そういうわけで
(define ((((( xs) (if (null? xs) '() (cons (map (lambda (c) (if (eqv? #\( c) #t #f)) '(#\( #\( #\( #\( #\( |setter of hogehoge|))) ((((( (cdr xs)))))
というようにカッコが不揃い(に見える)コードも可能。まあ、デモ以外でマルチバイト文字をシンボルに使うことなんてないだろうし、文字リテラルはたまに目視でカッコをチェックしていて「あれ?」と思うぐらいだし、そもそも上のコードは意味のある処理をしていないんだけど。
そういえば Emacs は閉じカッコを打った時、対応する開きカッコを強調表示してくれますよ。
Lisp なんてやってないで HSP とかやるといいよマジで。 Lisper になるには最初に HSP を学ぶのが最も近道なんじゃないかと最近気付いたんだ。
super pre 記法ないのかよ! Web2.0 っぽいインターフェースでブクマコメント表示したりする暇があるならこういう基本的なところやれよなマジで(いや、コメント表示も便利だけど)。そもそも増田のシステムなんてほとんどはてブと共通かと思ってたよ。増田が出た当初、「適当に組替えただけで、うまいことやったなぁ」と感心していただけに残念だ。
http://fromdusktildawn.g.hatena.ne.jp/fromdusktildawn/20070218/1171798705 より
要求自体がシンプル化しているかを図表で解説できる
(中略)
メタレベルプログラミングというものが時に開発計画の問題となることを知っている
(中略)
DSLをオンデマンドで自作できるようなプログラマは、いざというときの保険として確保している
(中略)
デザインパターンの理屈ばかりこねるプログラマをちゃんと怒ることができる
(中略)
英語というほどではないが、洋書は要所を読め、会話も意思疎通ぐらいはできる
(中略)
処理系やライブラリの動作原理の精密な説明ができるプログラマに支えられている
(中略)
ライブラリに関する知識は一通り知っているが、未知のイカしたライブラリを探し回っている
(中略)
基本的なコンピュータサイエンスの知識をとっさに聞かれても、無難にごまかすことが可能
(中略)
「セキュリティ技術の基本」とか言うからおかしいと思っており、きちんとコーディングすれば良いという考え
(中略)
プロトコルの詳細は現場レベルで決めさせ、報告だけをきっちりと精査する
(中略)
異質なプログラミングパラダイムを理解し「何故そういう作りなのか?」を自分に問える
(中略)
汎用のキーカスタマイズツールに統一されて無いコンソールでも、とっさに自分を切り替えてタイプすることが可能
(中略)
開発環境の具体的な機能の理解と使いこなしはプログラマの自由にさせる
(中略)
開発環境のマクロ言語は、そのライブラリを利用する外注が扱いに困ったりするのである程度に抑えさせる
(中略)
開発環境の正規表現を使っているプログラマには「これ、どういう仕組みなん?」って恥も無く聞ける
(中略)
スクリプト言語でいきなりRubyを勧めたりはせず、Perlで苦労させてからRubyを勧める
(中略)
ねぇねぇ。Matlabって元気?
大学で修論をやっていた時に、お金持ちの研究室の人がMatlab使ってた。ボクはOctaveを使ってた。Scilabとかいうのも出たてであったけど、当時のボクが使っていたマシンにはヘビー過ぎた。
最近は、なにを使っているんでしょうか。Octaveってまだ生きてんの?
当時にOctaveを使って自分がやっていたことをいまやるならRubyあたりを使うのかなぁ。
f77もCも使う気がおきなくて、f90,C++の良さげな処理系も手に入れることが出来なかったイケてない学生でした。いまも中途半端にエンジニア気取った広告屋です。
----