「処理系」を含む日記 RSS

はてなキーワード: 処理系とは

2008-10-28

http://anond.hatelabo.jp/20081027222327

「末尾再起のある処理系なら」と付け加える必要があるのでは?

2008-10-13

web系って動けばいいからいいよね

というようなことを何度も言われた。

テストフレームワークの説明。

本人は読む気もなかったので読ませたコードコンプリートの一部分だけ読んで覚えた

疎結合疎結合の連呼。関数を分割して他と関連づかない様にするのがいいと言うが、

関数オブジェクトを他の変数に持たせてあちこち橋渡しをしすぎて

結局密結合。あれこれ関数を見ないと動きがわからない。

集合を作成するのに専用の型があるのにそれを使わない。あるよ、と指摘するとweb系って動けばいいですからね。

ステートメントの使い方が間違っていて動かないのにそれを指摘すると

web系は動けばいいですからね、と言われる。

あげくの果てにソースを見ればわかるよ、と言われて

お、処理系内部のソース見るのか、と思ったらただモジュールの内容を見て

「なんとなくこれじゃないですか?」と言われた。

web系は動けばいいですからね、というのをここでも言われた。

何系とか関係ないと思い込んでいる俺としては、話していて疲れるからだ。

web系の人間FreeBSDが使えないから駄目と言っていたが

普段からFreeBSDデスクトップ用途に使っている貧乏性な俺はweb系ではないのか。

web系って運用構築の人も含めているのか?CやC++

フレームワークを構築していたりする人たちもその人にとってはweb系で、

とにかく駄目らしい。Boost使うのもweb系の特徴と。

極めつけは、「web系は人の作った物を使い回して動けばいいですからねー」

だった。意味がわからなかった。

人を追い込んだり、文句言う時に勝手属性付けてしまうというのは

究極的に頭が悪い。絶対に悪い。何が気に食わないのかさっぱり分からない、そういう人間は。

以上のことは本人にも伝えた。ばれてもいい。知らん。二度とつきあうつもりもない。

2008-04-27

http://anond.hatelabo.jp/20080427105348

なんで不幸なの?

20万円のハードを買ってもカセットインターフェースしかなくて、あるのはN88 Basicなんていう悲しいくらい屑な処理系だけ。大学センターにもFORTRANがある程度。運が良いとPascalもある。教科書は4000円くらいするが、微妙処理系が違う。エディタはラインエディタ。なんて時代に勉強したんだぜ。

中古で3万円も出せばラップトップが一台買えて、1500円の雑誌付録Linuxを入れればIDEまでそろう。好きな言語は選び放題。どれもただ。ネットで検索すれば情報もサンプルもいくらでも手に入る。

なにが望みなんだよ。

2008-02-02

http://anond.hatelabo.jp/20080202135746

長いけど要するに

不完全でもとりあえず作って公開する、ってのは意味があること。

これにはものすごく同意。

けど、元増田みたいに単なるインジェクションすら分からんと開き直られると、ちょっとねえ。。。

難しくないですよ。インジェクション。例えばHTMLなら、タグの一部として解釈される<や>のキャラクタを&lt;や&gt;に置き換えろってだけ。もう理解したでしょ?応用で、SQLの文字列として解釈される部分は、' というキャラクタは文字列の終端として解釈されるのでエスケープしましょうね。ってだけ。

あと処理系バグは定期的なセキュリティアップデートで埋める。

簡単でしょ?

簡単な文字列操作を覚えたプログラマなら誰だってすぐに実践できますよ。抜けがあったってしょうがないと思うけど、穴を作らないようにするセキュリティ意識が大事。

2008-02-01

http://anond.hatelabo.jp/20080201012307

いや、元増田の「分からんから開き直る」という態度はアマチュアでもプロでも害悪でしかないぞ。つーか人としてどうよ。おまけに自分はリスクを取らず増田無知な人を煽ってるのが卑怯すぎる。

というか、Webサービスを公開しなくてもプログラミングなんて十分学べる。

今では教科書だって充実している。手元で動かしてみるのも良いし、ソースブログに貼り付けて反応を待つのも良いし、何でもありだ。ビバインターネット情報化社会

むしろ、サービスを公開しなきゃプログラミングじゃないという印象を振りまかれることの方が迷惑。

あとは実際に必要な学習コストだけど、さっきまでそこで書いてたんだが、

HTMLシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。

あとは処理系Apacheセキュリティアップデートをこまめにやっとけ。

これくらいなら、簡単にできるでしょ?一応、高木浩光が言ってることを極限まで簡単にしてみたんだが。

これをやるまでは、ローカルとかURLを晒してない非公開の場所で動かしてればいいだけの話。すんごく簡単。

http://anond.hatelabo.jp/20080201000805

HTMLシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。

あとは処理系Apacheセキュリティアップデートをこまめにやっとけ。

Webでメシを食うわけじゃなきゃ、これで十分。

本当にたったこれだけでいいんだから、とっとと覚えてからサービス作れって話ですよ。

なんでそう煽る人が多いんだろう。全然難しくないから!

http://anond.hatelabo.jp/20080201000023

HTMLシェル(ファイル名)やRDB(SQL)とか、他のプログラミング言語として解釈されそうな文字列をエスケープしてればおkですよ。

あとは処理系Apacheセキュリティアップデートをこまめにやっとけ。

Webでメシを食うわけじゃなきゃ、これで十分。

2008-01-05

Re: ポインタがあったほうがわかりやすい

それはどうかなー

ポインタ一回わかっちゃうとポインタの便利さ具合は身にしみるけど

アドレスを渡して操作する、つまり実体をゴリゴリ複製しないってのは処理時間メモリ量の節約行為でしかない

全てを値渡しの表記法にして、処理完了後の代入行為があるなど直接書き換えを意図していたらポインタ操作になるように言語処理系の方で工夫できたら一番いいのではないかと思うよ

誰もそのうまい書き方を思いついていないから、ソースを書く側で工夫しているわけで。あとケアレスミスに対して危ないから。

2007-12-03

水晶玉を覗いてみましょう

ライブラリも不要な実行可能形式ファイルを…
できますよ。
GUIは例えばPerl/Tkなどがあるけど…
使いやすいビルダーが存在し、日本語もOK
明日の自分ですら解読不能呪文を書いてしまいやすい
とても読みやすいコードです

あなたにピッタリの処理系Delphiです。

http://anond.hatelabo.jp/20071202142333

2007-11-15

処理系は肥大化した

センサの精度が元からよくなかったのかもしれない,悪くなったのかもしれない。それはわからない。ひどいノイズ処理系カットしきれなかった。ノイズの載った情報を推定で処理する処理系はそれだけで多くのエネルギーを使った。解はいつも同じだ。分布は一つしか与えられなかったから。結果出力は貧弱になり,いつしか簡素化された。処理系だけが残った。今日無意味に分布と照らし合わせて同じ解を吐き続けている。

http://d.hatena.ne.jp/ohnosakiko/20071114#1195045815

に寄せて。印象論。

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-25

http://anond.hatelabo.jp/20070825005422

基本的に、自分の作業や制作物を売らなくてはいけない職業は、ニートneetではなくneat)な人的交流が必須だぞ。

特定の気に入った人間とだけ交流していればいいのなら、ルートセールス・営業・販売でもそういうところはある。

要するに世間では「つらい」「割に合わない」「つまんない」「変化に乏しい」といわれている仕事から探すといいのかもしれない。話をしなくていいという点では自販機の補充とかありじゃないか?

あと、清掃業関係、つまり汚れ処理系は確実に交流が少ない。

そうだ、デイトレーダーはどうだ。

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-08-03

東大卒プログラマになんてならない理由 その2

東大卒業した人がプログラマにならない理由は2つある。

理由1: オ○ニーに両手を使うのでキーボードをたたく暇が無い

理由2: 昔告白した子がプログラマーだった

種明かしをしよう。(東大だけにとーだい、凄いだろって言わせたいのさ)

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

"ゼロから"

「おてもやん」の設計ができて、「おてもやん」言語を設計し、「おてもやん」が書けて、「おてもやん」を載せて、

その上で例えば「おてもやん」を動かせるくらいの力量がつく。

(上で書いたようなことを実践した記録が、東大の3年生のホームページに書いてある。

それを参考に上記を書いたわけではない。あくまで、例として。)


C言語をマスターしてるかどうかなんて低レベルな話をしてる時点で見当違いのような気がする。

「雪見だいふくの数暗記してる?」くらいのレベルの低さだ

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

ある仮説を立てて、その仮説のもとで最適なコニャンコを設計し、

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

そのマゴニャンコの良さを測る、といったレベルだ。

実践うんぬんと言っているが、上記のことは普通リサ・スティッグマイヤーには実践すらできないだろう。

また、ここで注意していただきたいのは、ダンシング・ベイビーなんて誰がやっても同じということだ。

機械語を書く際の冗長な作業を軽減するためのせんだみつおナハナハ言語であり、

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

これはカレー王子様でもできることだ。

カレー王子様ができることをわざわざ仕事にしても面白くないだろう。

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

DSで使われているニャンコ肉球認識や、

銀行で使われているハスキーボイス認証、

オレオレ解析、

携帯電話などの無線通信で使われているクーポンポン

動画エンコードで使われている松崎しげるを白くする技術などが関連している。

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

http://www.baitoru.com/

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

もちろん、実装はカレー王子様でもできることだ。

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

チュパカブラの半分の労働時間で、倍以上の雪見だいふく(4個)を稼げる。

もちろん、全くラブレターを書かないわけではない。

誰がやっても同じ部分であるラブレターは外注する。

妄想の速度はきっとバッファローマンの方がはやいのだから、外注した方がいい。

だけど、超人強度でしか負けないから、

雪見だいふく単価はプログラマーの4倍(8個?)以上なのだ。

もちろん、大規模なペッティングの設計は重要だ。

だけど、ペッティングと吠える人ほどペッティングセンスがないという現実がある。

本当に難しい部分のペッティングというのは、例えば、NTT Dataにいる東大生が行っている。

あるいはチョコボールマーク判定のようなシステムならば、日立東大生。

JRキオスクおばさん配置システムJR東大生。

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

ただ、1つ注意して欲しいのは、君らが指しているカレー王子様(甘口)と、東大生がさしてるカレー王子様(中辛)が違うってこと。

あとがき

少しだけ誇張して書いている。

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

上位20%は常にハーゲンダッツ

下位20%はパナップ。

だけど、アメリカへつれていき、いきなり英語ダンシング・ベイビーをさせたら無難にこなすレベル

一番底辺をとってきても、能力的なものは高い。

あとは・・・去年のカレンダーをマスターしてるレベルといったら、東大文系を連れてくると、丁度いいかもしれない。

http://anond.hatelabo.jp/20070801222021

デリバリーヘルスがどうこうとかファッションヘルスがどうこうって話はあまり多くは出てこない。カリキュラムの整備がなかなか追いつかないし、そもそもみんな自分でやっちゃうから需要も無い。

需要が無いのは、開拓の余地がないから。日本むかし話は単なるむかし話だし、雪見だいふくは2個しかない。

必要になったときに、キン肉マンを読めば1週間で習得できるようなフィニッシュホールドを学ぶ意味はまったくない。

そういや東大教養課程で扱うペットのエサがペティグリーチャムになるらしいね。モンプチの適度なヌルさは教育向きだと思う。

情報系にはペティグリーチャム・ミキサーがあるので、皆様ご安心を。

宣伝

こっちも読んでね

http://anond.hatelabo.jp/20070731013218

ブクマがいっぱいついてうれしい限りです。

文句ある人はきちんと対応しますので、

ネタ」ですまさず、「ここが面白い」と指摘してくださいね。

具体性がないとおれみたいになっちゃいますよ。

現実を一緒に理解しましょう。

私が知らないこと(恋愛の方程式)もありますし、あなたが知らないこともあるでしょう。

お互い教えあえばいいわけです。

2007-07-07

http://anond.hatelabo.jp/20070707204147

言語化に必要な時間や労力と、言語の多様性の価値とは別モノだよ。

それから、コンピュータ世界における言語の表現方法を考えるなら、はじめから他言語サポートを目論んで制作されたのでなければ、海外サービス等で文字化けするくらいのことを特別視する必要性は無いんじゃないかな。日本語(というか、二バイト文字)対応っていうのは、英語圏では必要のない技術を使ってるわけだし、無頓着なっちゃうのも仕方無いと思うよ。喩えるなら、クロスプラットフォームクラス作ろうとしてたのについついリトルエンディアンな処理系しか考慮していなかった、後から気付いたけど直すの面倒って場合だとか、クロスブラウザ目指していたのに、ついついグラフィカルブラウザのみ考慮していた、テキストブラウザや音声ブラウザ存在に後から気付いたけどテスト環境整えるのが面倒だし、そもそも少数派だし……ってくらいで、別に意地悪して切り捨ててたり、言語を強制する目論みではないと思う。

2007-05-16

新卒派遣に入った私の履歴

ちなみに、派遣といっても一般派遣じゃなくて特定派遣正社員)。

就職氷河期の終わりごろに情報処理系専門学校卒業し、ソフト開発を希望して入社。

本社が東京にあったため都内のホテルに前泊したのだけど、そこのミーティングルームで2,30人くらいがそれぞれどこの会社派遣されるか告げられた。大体3つくらいに分かれたかな。

そして、引越しを経て4月の第2週くらいから派遣先に出社。

初日にはそれぞれ「○○さんは△△課、□□さんと××さんは**課…」と割り振られる。

さぁ、自分は何だと思ったら「品質保証課」。製品の検査部門だって。へー…ソフト開発を希望して、それで採用されたからてっきりそういうところに行くと思ってたんだけど。

そういえば、入社前にこんなことを言われたんだっけ。

「そのうち」と。

卒業式と入社前の集まりが重なってしまい、後日支社へ出向いた時に私だけ(だったんだろうなぁ、後から思うと)出向先を教えてくれていた。こういう製品を作っていてこういう雰囲気の会社で、という説明の後「まぁ、○○さん(私)の希望はそのうち」

要するに頭数さえいれば専門が何かなんてどうでもいいみたい。

そこから数年後、派遣先でゴタゴタがあったらしく派遣会社を一つに絞るいう話となり、私は契約終了になりました。

今度は他社工場生産技術部門へ突っ込まれましたとさ。

先日「退職の相談を」と営業に連絡したらすぐさますっ飛んできて面談となりました。

「えーと今の仕事は…あ、専門とは違うのね」

その営業さんは私についての資料を今初めて読んで、この瞬間にやっとそのことについて気がついたみたいだった。

詳しくは持ち帰り検討って言われて2週間以上は経ったけど放置され中??。

退職願持参で再び話し合いするつもりです。

ちなみに、出勤のカレンダー派遣先に順ずるため、自社が休みじゃない日は強制的に有給を使わされます。つまり、休みの多い会社派遣されたら有給がどんどん減っていく。

そういうわけで、有給もほんのりしかないし、辞めてから本格的な転職活動をするつもり。

ちょこちょこ書類を送ったりはしてるんだけど、派遣じゃないかどうかだけはチェックしてるw

2007-04-02

特定しますた

恋人ふつけるプレゼントする Schemer の俺が来ましたよ。

# 鬼の首をとったかのように書いてごめんよ。

Lisp とカッコの不揃い

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 っぽいインターフェースブクマコメント表示したりする暇があるならこういう基本的なところやれよなマジで(いや、コメント表示も便利だけど)。そもそも増田システムなんてほとんどはてブと共通かと思ってたよ。増田が出た当初、「適当に組替えただけで、うまいことやったなぁ」と感心していただけに残念だ。

2007-03-08

http://v.japan.cnet.com/column/interview/story/0,2000067541,20344579,00.htm

e-eyeの鵜飼氏も高専卒だなー

同じ研究室の大先輩らしいんだけど、面識ねえからよくわからんけど

Windowsが無い時代にマイコンイベントドリブンな処理系を書いていたという伝説を聞きかじったくらい

2007-02-19

有能なマネージャーの特徴を思いつくまま列挙してみる

http://fromdusktildawn.g.hatena.ne.jp/fromdusktildawn/20070218/1171798705 より

要求自体がシンプル化しているかを図表で解説できる

(中略)

メタレベルプログラミングというものが時に開発計画の問題となることを知っている

(中略)

DSLオンデマンド自作できるようなプログラマは、いざというときの保険として確保している

(中略)

デザインパターン理屈ばかりこねるプログラマをちゃんと怒ることができる

(中略)

英語というほどではないが、洋書は要所を読め、会話も意思疎通ぐらいはできる

(中略)

処理系ライブラリの動作原理の精密な説明ができるプログラマに支えられている

(中略)

ライブラリに関する知識は一通り知っているが、未知のイカしたライブラリを探し回っている

(中略)

基本的なコンピュータサイエンスの知識をとっさに聞かれても、無難にごまかすことが可能

(中略)

セキュリティ技術の基本」とか言うからおかしいと思っており、きちんとコーディングすれば良いという考え

(中略)

プロトコルの詳細は現場レベルで決めさせ、報告だけをきっちりと精査する

(中略)

異質なプログラミングパラダイムを理解し「何故そういう作りなのか?」を自分に問える

(中略)

汎用のキーカスタマイズツールに統一されて無いコンソールでも、とっさに自分を切り替えてタイプすることが可能

(中略)

開発環境の具体的な機能の理解と使いこなしはプログラマの自由にさせる

(中略)

開発環境マクロ言語は、そのライブラリを利用する外注が扱いに困ったりするのである程度に抑えさせる

(中略)

開発環境正規表現を使っているプログラマには「これ、どういう仕組みなん?」って恥も無く聞ける

(中略)

スクリプト言語でいきなりRubyを勧めたりはせず、Perlで苦労させてからRubyを勧める

(中略)

マネージメントに飽きて、マネージャーを辞めたくなったときに起業できるコネを準備をしておく.

2007-01-19

[]男女関係の話を読んでいたら、青春を思い出した。

ねぇねぇ。Matlabって元気?

大学修論をやっていた時に、お金持ちの研究室の人がMatlab使ってた。ボクはOctaveを使ってた。Scilabとかいうのも出たてであったけど、当時のボクが使っていたマシンにはヘビー過ぎた。

最近は、なにを使っているんでしょうか。Octaveってまだ生きてんの?

当時にOctaveを使って自分がやっていたことをいまやるならRubyあたりを使うのかなぁ。

f77もCも使う気がおきなくて、f90,C++の良さげな処理系も手に入れることが出来なかったイケてない学生でした。いまも中途半端エンジニア気取った広告屋です。

----

matlab, octave, ruby, f77, C, f90, C++

うお!?、はてダって、文頭以外の場所に++(半角)があるとサーバーエラーになるんだ。

2006-12-03

http://anond.hatelabo.jp/20061202152016

言語Perl処理系実装はperl

だから言語全般についての話題なら[Perl]タグが正確かな。

でもタグCase無頓着でもOkじゃないか?

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