「コマンドライン」を含む日記 RSS

はてなキーワード: コマンドラインとは

2008-08-08

http://anond.hatelabo.jp/20080807212307

PHPコマンドライン

そこまで変態的か?

つかコマンドラインでなんか結局はバッチ処理なわけじゃない。

結局は本処理は別にあるからコマンドラインなんてなんだっていいんじゃないの?

そうじゃないひとってコマンドラインで何してんの??

2008-08-07

http://anond.hatelabo.jp/20080807212307

HPコマンドラインで使う用にできてないんだから、違うもので「コマンドラインスクリプト」を書いて動かすのが当然だろう?というマッチョ意見ですね。

まるで、中学生小学生相手に「何でその問題因数分解で解かないの?」と言っている感じがします。

http://blog.asial.co.jp/424

「皆さんはPHPコマンドラインスクリプトを作成するとき」とさらっと書いてあってビビった。

はてブ淡々とした反応にもビビった。

いや、別にPHPdisりたいわけじゃなくて、単純に驚いた。

そっかー、PHPコマンドラインスクリプト書くのかぁ。。。

慣れの問題かなぁ。

2008-07-06

Re: http://anond.hatelabo.jp/20080706004855

ありがとう

下のほうのソフトコマンドライン機能も付いてて完全に欲しかったものと一致してる。

これでほぼストレスなく2つのPCを使えるよ。

2008-03-08

敬意を払おう

フレームワークとか使ってるともはや隠蔽されすぎて自分で実装しようなんて思わないのが普通である。

ましてや車輪の再開発などもってのほか、バグを生み出す温床にしかならない。

だが、どういう仕組みになっているのかを紐解くのに自分で再実装するのはそれはそれで有意義だろう。

君は今まで食したパンの枚数を覚えていなくてもいい。しかしそのパンがどのように作られているかを知ることは決して間違いじゃぁない。

自分で実装してみてわかることもある。あぁ、このライブラリって凄かったんだなと。

なんでこんなにコード長いの?もっと短く書けそうなのに。そう思って自分で再実装してみると、あれが足りないこれが足りない。あ、バグってた。ダメだこりゃ。元のライブラリより長くなっちゃった・・・あれ?しかもベンチ遅!!

みたいなことになる。

例えばPerlCGI.pm

CGIモジュールはもともとある種のフレームワークのようなもので、入力データ以外にも色々HTML吐き出したりできるのでコードが長くなってしまってるんだ。

だからもっと短くかけるはずだよ。うん、俺やってみる。

結果惨敗。意外にしんどい。きつい。ベンチとってみてCGI.pmよりも低速になったときは絶望したよ。

しかも、機能が足りない。全然たりない。

CGI.pmコマンドラインからの入力データにも対応してるし、ファイルアップロードもばっちしできる。

なのにオレオレCGIモジュールときたら何にも出来ない。

腐ってやがる、まだ早すぎたんだ!(by クロトワ)

昔からあるものは伊達じゃない。それだけ歴史が詰まっているということだ。

凄い、凄すぎる。ハハハ。わらっちまうしかねぇ。

しかし、それを乗り越えて新しいものを産み出す人もいる。これはすごい。[これはすごい]ハハハこやつめ。

そーゆー人を俺は尊敬する。敬意を払う。ビシっ。

あ、スミマセン。手、当たりました?ごめんなさい。そんなつもりじゃ。ツッコミとかじゃないですよ。

あぁ、いてて、コラ、叩くなって、痛いイタイ、んー、もうハハハ、やめてってば、コラ、いい加減にしろ、ってばよ、っんもう。

プログラ増田のあなぐら

2007-12-25

ボクにとっての最大のご褒美は, やりがいだ.

給料は最低限で十分. 特に大金が必要な趣味も持っていない. 大金を使って遊ぶくらいなら, 仕事に役立つような勉強を楽しんでやるのが好き. 数学とかプログラミングとかいろんな仕事術とか.

数学勉強しておけば世界の見方が変わる. 目に見える色を表現するのに必要な情報量を考えるし, 新しいアイディアを考えるときに数学概念をうまく利用したり, 問題の明確化や定義もうまくなる. 明確化できるということは, 話の流れも自然になって当たり前にプレゼンがうまくなる. 話が分かり易くなると, いろんなところから仕事がふってくるようになって, 断るのに必死だったりする.

プログラミングが自由自在に出来れば, 身の回りのあらゆるルーティンが自動化されるようになる. ちまちま手作業でインターネットブラウザからスケジュールデータを post してる人を横目に, 携帯からメールからコマンドラインから自分のスケジュールを反自動的に投入していく. いつだって自分のスケジュールはぎっしりだ. データだって得意のワンライナーを駆使して, いつでも自由自在に加工分析できる. また, 新しい企画を速攻でプロトタイピングして動くものとして人に見せられるようになる. これいいねって言った次の日には, 何かが動いている. 最初は, アイディアが ある人に良いように使われるだけだが, ある日を境に立場が逆転する. 作れる人がチームの方向性を握るようになる. また, 開発者の苦しみが分かるようになるので, 人としてプログラマ仕事をお願いできるようになる. お願いしかしない人は, 自分で書かないから, プログラマの苦しみや悩みや, 本当の生産性が分からない. だから, 無責任仕事をふるし, 無駄お金を払ったりする. 自分の場合は, いつも適切に具体的に仕事をふれるし, モチベーションも同時にあげてるので, 必要最低限の出費で済む.(と思っている)

いろんなところから仕事術を勉強する. 本も読むし, 毎日コミュニケーションしている人たちのうまいやり方を常に観察して盗もうとする. いろんな人に会える機会を作って仕事パスを増やしてみる.

あと, 英会話も大好きだ. 暇さえあれば, 英語映画を見るし, 機会があれば積極的にネィティブスピーカーと話してみる. 趣味っぽい活動と言えば, あるスポーツを定期的にしてるけど, これはどちらかというと仕事に役立つ体力作りとしてやっている. 昔, 運動を完全にやめていたときに,何度か床に伏した経験があるからだ.

どんなやり方で給与を獲得するかを考えるなら, やりがいのあること, やりがいのある仕事の仕方を選ぶ. みんながやりたがらないことをやる. 誰よりもこだわりを持ってやる. ひょっとしたらまわりの人がたまたまやる気がないだけなのかもしれないが, そんなことどうでも良い. 自分にはまわりよりも仕事にこだわっているという自負があって, そうやって一生懸命仕事をするということが楽しくてしょうがない.

こういうボクを, 周りの人はワーカホリックと思っているかもしれない. ただそれは違う. ボクは楽しいからやっているだけなのだ. 楽しいことしかしたくないんだ. ただそれだけで今生きていけてるんだから, これ以上幸せなことはない.

2007-10-19

http://anond.hatelabo.jp/20071018142959

解説ありがとう

いや、書き込むっぽいなとは思ったんだけど、

entry = diary.entry('20070712231804')

エントリー指定してたからなんなんだろうと思って。

editもできるってことなのかな?

それともdiary.rawあたりでよみこむアンカーかなにか?

で、そもそもRubyに詳しくない自分からするとちゃんとした使い方がそれでもわからない。

バカでごめんねなんだけど、どうやって使えばいいの?

例えば自分windowsなんで、使い方に書かれてるスクリプト拡張子rbにして保存して、

masuda.rbの保存されているところにぶっこんでコマンドラインから実行してみた。

ずらーっと増田らしきものを読み込む。

そりゃそうだわなと思いながら文字化けの山。

diary.login('my_id', 'my_pass')

diary.my_entries.each {|entry| puts entry.content }

diary.post('Ruby is ...', <<EOS)</p&gt;

A dynamic, open source

programming language with a

#...

EOS

ここらへんにid/passやらタイトル、本文を書けば書き込めるのかもしれないけど、

毎回スクリプトを書き換えるって感じなのかな?

書き込みに成功|失敗したらその日の増田が表示されるのかな?

あと

session[:diary] = diary.raw

...

diary = Masuda::Diary.restore(session[:diary])

の...って何でしょうか??

2007-09-18

http://anond.hatelabo.jp/20070918211625

Windowsでも簡単だよ

http://rubyforge.org/projects/rubyinstaller/

以下コマンドラインから。cmd.exeはOne-Click Ruby Installerを実行したあとにやってね。

 > gem install -y rails
 > gem install sqlite3-ruby
  • mongrelも入れとくか(こっちも最新のmswin-32を選んでね)
 > gem install mongrel
 > rails -d sqlite3 my_great_webapp
 > cd my_great_webapp
 > ruby script/server

ブラウザhttp://localhost:3000/アクセスすればWelcome boardが出るはず。頑張れ〜。

あとエラーメッセージはビロビロと全部貼った方がいいと思った。問題解決したいなら、ね。独学でやりつつこっちは愚痴り場でもいいと思うけど。

てか各種入門記事は絶対にSQLite3を推すべきだと思うのだがどうだろう。MySQLとか難しいよね。

2007-09-16

[]1日目

コンテストルールを確認する。

http://rails.drecom.jp/

とりたてて特殊なルールも何をみるというポイントもかかれていないようだ。

協賛企業をみても系列一色だ。

求人情報が併載されているところをみると、もしかしたらそちらがメインコンテストなのかもしれない。

締め切りは25日。これまでにサービスインをさせなければいけないらしい。

逆算しても23日にはローカル鯖で動いている必要があるだろう。

23日は誕生日だ。よって作業をするつもりは殆どない。

でも、誰も相手をしてくれない気がするので作業をしてしまうかもしれない。

23日までまる5日しかない。

唯一、ドリコム賞というのがComet/ShootingStarを使うことを前提としている。

Cometメインに据えてあと5日でどうこするのは見通しが立たない。

余裕があったら追ってみよう。

積読していた本をひっぱりだす。

ISBN:4798013951

RailsDL先も書いていないので閉じる。

なにがなんだかわからないがRails言うからにはRailsが必要なのだろう。

検索してあれこれをダウンロードしてみる。

初期設定でまとめられたのないかなと再度検索。

Windows環境での Ruby on Rails (開発環境構築)

http://www.syssupo.co.jp/net_hal/ror.html

こういうのをみつけた。便利!!感謝!!最初からここから辿ればよかった。

httpd.confいじくってapache再起動掛けたらスタートできない。

困った。

見直してみたらRubyForApacheのインスコでしくじったよう。

再度設定。

HelloWorldをさっそく。

コマンドラインなら成功するのだが、rbファイルを配置してのブラウザベースの起動のさせかたがわからない。

ruby -e'puts("Hello The World!!WRyyy!!!")'

あ、、なんだ、拡張子をrbで作ったのがいけないのか。拡張子cgiにしたら動いた。

#!ruby
puts("Hello,The world!")

RailsHello, world!はなにやらさらに違うようだ。

Railsというのはなにやらスケルトンフレームワークなのだろうか?

http://blog.codezine.jp/editor/2007/06/ruby_on_railshello_world_1.php

ここを見ながら自分の環境にあうように書いてみたがうまくいかなかった。

開発環境もまだきめていなかったので、Eclipseをつかおうかな。何かお奨めのある?

とりあえず今日はここまで。

明日は・・・

3000系テストサーバー意味とか構成がさっぱりわからないのでそこら辺を弄ってみるのと、実際にRailsを触ってみるところ。あと開発環境構築かな。

http://blog.codezine.jp/editor/2007/06/aptana_eclipseruby_on_rails_1.php

ここみながら、aptana関連をなにやらわからないままいれて見たのだけど、

要求された操作は現在の構成には無効であるため、実行できません。 詳しくは詳細を参照してください。

Aptana Editor Infrastructure (0.2.9.16696) 必須: プラグイン "org.eclipse.core.filesystem"。

Ruby Development Tools (0.9.0.707021729NGT) 必須: プラグイン "org.eclipse.core.filesystem"。

filesystemプラグインがないってどういうこっちゃ。

http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/20070702/eclipse-rcp-europa-win32.zip&r=1&protocol=http

これかな?

後で入れてみよう。

おなかがすいたので今日はここまで!

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-06-12

もうずいぶん長いことMacユーザをしている。五色のiMacを買ってから以来だから、もう7年にもなるか。WindowsじゃなくてMacにしたのは、あの愛らしいデザインがいいと思ったからだ。正直、Windowsじゃないのを不安に思った。でも、なんでパソコンを使いたかったかっていうとパソコンお絵描きがしたかったからで、そういった用途ではMacもちゃんと動くということが調べてわかったから、バイト代貯金などを使い果たして、ライム色のiMacとPhotoshop5.5、それにタブレットスキャナプリンタをひとそろい買った。今から考えてみると、ずいぶんと思い切ったことをしたと思う。

身近に他のパソコンを触れる環境がなかった間は、それで満足していた。しかし大学に入学し新しく始めたバイトで、Windowsに接する機会があった。当時はまだ2000だっただろうか。そのWindowsのマイドキュメントなど、MacOS9にはなかったファイル管理の方法が非常にわかりやすく、次にパソコンを買い替えるならWindowsにしようかと思っていた。だがそのとき、MacOSXに出会った。やはりバイト先でのことで、私がMacユーザならMacマシンも管理してくれと頼まれ、そのMacマシンにはOSXが入っていたのだ。

そのきれいなインターフェースはもちろんのこと、ちゃんとWindowsみたいにマイドキュメントのようなフォルダがしっかりとわかりやすく用意されていて、さらに当時大学UNIXの使い方を勉強していたのだけれど、コマンドラインからでもGUIからでも動かせるというところにどっぷりはまってしまった。当時はまだOS10.2ぐらいの頃で、まだまだ古きMacユーザからはMacOSXの有用性が疑問視されていた。私もそうした意見に流され、ずっとMacOS9のままだったのだけれど、使ってみたらMacOSXはすごくよかった。すぐにMacOSXを買いに走ってしまった。MacOSXにしたらPhotoshop5.5を使うのはあきらめなければならなかったけど、代わりにPhotoshopElementsを買ってみたらそれで用が足りてしまって、本格的にMacOSX移行することができた。

今のところMacではギャオなどの一部動画配信サイトが見れないのが唯一の不満ではあるけれど、でもYoutubeニコニコ動画は見られるので、まぁいいかと言った感じ。

しかしこんなMacユーザの私でも、MacPCを比較する最近テレビCMは品がないから嫌いだ。

2007-05-09

http://anond.hatelabo.jp/20070509154649

mySQL迷子

なんだこれ難しいな…。

100までの整数がなんらかの状態でレコードにあって後はSQLひとつ流せばおわりなんだけど

select 
	if (tf.fizzbuzz = '',tf.num,tf.fizzbuzz) fizzbuzz
from (
	select 
		num,
		concat(
		if (mod(num,3)=0,'fizz',''),
		if (mod(num,5)=0,'buzz','')
		) fizzbuzz
	from tmp_fizzbuzz 
) tf
;

うえのSQLphpMyAdminで流しても反応がない。。。。

mySQLコマンドラインで流せば帰ってくるんだけど。

いまいちどころか、なかなかピンとこないなぁ。

慣れてきたつもりだったんだけど。。

_ノ乙(、ン、)_

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