「(Ry」を含む日記 RSS

はてなキーワード: (Ryとは

2007-09-28

誤解を招きそうな

最近アダルトビデオ

先日ビデ倫警察からガサ入れされてたようだけど(違ったらスマソ)

いやぁ10年前が嘘のように、よく見える。

もう現世では、擬似なんてありえないんだろう。

 

で、ふと思ったんだけど

いまの映像ってさ

女優とソノ部分「だけ」を視聴者に見せようとしてるよね。

あれって誤解を招くんじゃないの?

 

愛し合う二人は、お互いの体温を感じあうように抱き合い、腰を(ry

しかしビデオの中は、体温を感じあえるのはソノ部分くらい。

なるべく男優の肌は映像にしないような撮影の仕方。

オ●ニ●との違いは、生肉を相手にしている位かw

 

最近若者はどうやってシ方を勉強してるのかは知らないけど

ビデオだけじゃ、純粋に好いてくれてる相手に呆れられそう。

 

ハッ!

女の子も、ビデオが当たり前になっているのかも?

世の中も末ぢゃ…

 

 

俺?

今年に入ってからはそんな機会など全くないです(自爆)

2007-09-27

人に邪魔されたくないが、人の助けは借りたい。

http://shi3z.cocolog-nifty.com/blog/2007/09/uei_28b7.html

うらやましい。すげぇ仕事たてこんでるときに「なぁ?あれってなんだっけ?あれ」とか

上司が言い出すと邪魔スンナ!とか激しく思う。しかも上司のほうは

「このフランクな会話により部署内のコミュニケーションがますます円滑(ry」とか

思っているフシがあって、マジフザケンなテメ(ry

話がずれた。俺も耳栓して仕事したいなーと妄想してみた。

そりゃもうスゲェ集中しますよ。仕事の能率なんてたぶん倍はいきますよ。

なんか妄想するだけで幸せなっちゃったんですが

妄想の中で横のデスクを見ると、同僚も耳栓してスゲエ集中してるんだよな。

もうね。「あのさー、入局申請のエクセルファイル持ってない?」とか

きける雰囲気じゃない。聞いたもんならスゲェ睨まれるに決まってる。

あごめんなさいホントすんません過去メール調べます自分でマジ邪魔してすいません!

「俺は耳栓するけど、お前ら耳栓するの禁止!」とかマジできないっすか。

占いってのはきっと

http://anond.hatelabo.jp/20070927003115

前ちょっと考えたんですが、こういう占いってのはきっと「当たらない」から人気なんだと。

例えば血液型占い

そっち方面を真剣に調べたことはないので最新科学ではどうなっているのか知りませんが、

血液型で性格など決まるわけがない」というのが一般人の科学的考え方ではないでしょうか?

人間の性格が4パターンしかないなど本気で思ってる人は居ないでしょう。

だからこそ血液型占いは良い。

マジメで綺麗好きなタケシ君。

女「タケシ君の血液型ってA型?」

タケシ「うん、A型だよ」

女「やっぱり??!ワーキャー(ry

同じくマジメで綺麗好きなケン君。

女「ケン君の血液型ってA型?」

ケン「いや、B型だよ」

女「え??意外??!ワーキャー(ry

はい。

つまり、当たろうが当たるまいがどっちでも良いんです。盛り上がれれば。

それにもう一つ重要なこととしては、当たらないからこそ否定的でも気にならない。

血液型占いに限らず、占いには否定的な答えというものも結構あります。

ケン君はB型だから身勝手マイペースなどという回答が出たとしても、当たるかどうかわからない。

だからこそ好き勝手いえるし、気楽に楽しめるのである。

もし超科学的な占い(の域を超えているが)だったら。

「あー、ケンくんはB型なんだ。ということは赤血球上のタンパク質の型がうんたらかんたらで、

それがなんたらに作用して、(中略)だから、自分の衝動を抑えられず、身勝手な振る舞いをとりやすいでしょう」

まぁこれはこれで盛り上がるかもしれないけど、ちょっと深刻な感じになっちゃう。

軽くやるのも、軽く聞くのもどうなのよ。

しばしケン君は悩むかもよ?あ、B型だから科学的には彼は気にしないはずだから大丈夫、って良いのかそれで?

だから占いとかジェネレーターは何の根拠もなく、くだらないくらいがちょうど良くて、

そうじゃないとダメなんじゃないだろうか?

http://anond.hatelabo.jp/20070927010447

やってみた。しかし名付けならば考え直すことをおすすめします、とか言い切っちゃうとこがすごい。

主運

21画:独立権威、頭領の霊位を示す大吉祥数

独立心が旺盛で、一歩一歩と地位と名誉を築く強運数で、人の長としての信頼を集め、前途洋々と開ける強運数だけに、若年から人を見下す欠点があり、和を欠いて敵も作ります。これを慎んでいけば弱冠にして才覚を発揮できます。

女性のあなたは、キャリアウーマンとしては大成功しますが、霊位が強すぎ、孤独相か、夫との生死別または一家を背負う運命の暗示があります。また、この数を持ていますと、夫の運勢を伸長させない暗示がありますから、安穏に夫を補佐し協調の精神を養うように心掛けてください。(「名付け」には避けたい数です。)

若年より人を??のあたりが身に覚えがあるだけにどきっとするところ。しかしキャリアウーマンとしては大成功か。まあ今のままいけば大成功はともかく普通に成功くらいはいくかな。

対人運・社交運

16画:頭領の才象望運の霊位を示す吉祥数

大器晩成、良い友達が多く、リーダ格で社交上手な才があり、多くの人に人気があって共に栄える博愛精神を有し、不遇な環境にあっても協力者により盛運に転ずる強運数。裏面には親分肌的な所があって、ひとの面倒を良く見ますが、逆に利用されて損をしないように注意が必要です。

どうも↑と矛盾しているような気がするのだけど。

性格

健全発達型 表面は大人しく何事も漸進的で物事に筋道を立てて理性的です。温和に見えるが内心は不屈の精神と、嫉みや疑いの気持があり、余り活動的でないが人の上に立つ素養あり。裏面は剛情でワンマンなため、これが出ますと遊び好き・けじめが無くなります。

同じく↑と矛盾s(ry 強情&ワンマンは当たってるかな。しっかし全体的に一貫してないな。

基礎運

9画:悲運薄幸な霊位を示す凶運数

智力に優れ頭の回転が速いのですが、病弱薄幸で肉親の縁も薄く幼少にて親との生死別による孤独な生活や甚だしい時は短命の暗示がある大凶数です。他の数との組み合わせにもよりますが、多くは人のために損をしがちな苦労の多い人生をたどります。ただし才略優秀なる人は大成功者となります。

家族には恵まれていると自負しているのでこれは当たってないかな。不幸といえば弟を亡くしたくらいか。

晩年

37画:篤実単行、繁栄の霊位を示す吉祥運

独立単行、智力胆力に優れ大業成就の強運で万難突破、独立権威の数だけに、反面、行き過ぎますと孤立する危険性があります。人との和合に心掛ける事が安泰発展の秘訣です。

女性のあなたは、過剛になりますと、孤立しますから分をわきまえたいものです。

女性は分を弁えろ(意訳)か。普通にむかつくのだけど。

健康運が極悪なことを除けば特に大過なし。才に溺れるな!みたいな感じなんで身を慎もうと思う。

2007-09-25

僕は今も毎朝美少女が空から降ってこないかなと玄関で天気をみるふりをしては空を眺めて会社へと向かってる。

もちろん会社ではモニターから美少女(ry

2007-09-24

http://anond.hatelabo.jp/20070924021147

ヤマダの本気について、ヤマダのバイトにヤマダ外で聞いたんだけど(ry

責任持てねぇから書けねぇや

2007-09-22

http://anond.hatelabo.jp/20070922042036

お見事です。

そういえば某北関東家電量販店で、ものは複合プリンタだったんだけど、○○店と△△店では値引き後価格でも\1,000くらい違ったなぁ。

映画の帰りに寄った○○店でかなり安かった(これは訂正値札上で)から、比較的近所の△△店でもそれくらいには値引きしてもらえるかなと

思って聞いてみたら「無理です」と。その店員さんが店長に確認に行ってくれたけど、エリア担当バイヤーの違いとかで、○○店の価格

の確認は取れたんだけど△△店でその価格で売ると明らかな原価割れになっちゃうと。ゴメンなので○○店で買ってくださいって謝られちゃった

けどそっちに戻るのも面倒だったんで、結局買わずに帰った。後日、一番近所の別の量販店に行ったら値札段階で○○店より安くてこけた。

後日、某家電量販店バイトしてたっていう子に話を聞けたんだけど(ry

http://anond.hatelabo.jp/20070922013417

いやいや、刑は刑であって、

別に加害者Bに刑を執行するのは被害者Aである必要は全く無い。

そこは国家が代わってやる。

あと、

>「プロボクサーのBさんが殴ったらAさんは死んでしまいました」

それはやりすぎ、ていうか間違い。

全然同等じゃない。

まぁ実際「目には目を(ry」が上手くいかないことなど分かってはいるんだけどね。

例えば、盗んだ1万円の例であれば、

富豪Aの1万円と、明日の飯に困るAの1万円では全く重みが違う。

同じ重み、被害を加害者Bに与えるのは難しい。

殺人に関しても、毎日を大切に生きていた被害者Aに対して、

もうどうでも良くなっていっそ殺して欲しい加害者Bと言う場合、

Bを殺せば良いかというと・・・

2007-09-21

いじめによる自殺事件があった滝川高校HP

http://www.takigawa.ac.jp/

のように、アクセス不可であるかのように見える。が、しかし実際は……

http://www.takigawa.ac.jp/top.html

と、2chから引っ張ってきてみる。まるでアーツ(ry

2007-09-20

http://anond.hatelabo.jp/20070920074332

初めて見た時から何やってる人かわからなかったんだけど・・・結局何やってる人なの?

それにしても沢尻趣味(ry

2007-09-18

セガサターンしろ!」

CMにて以上のフレーズがあったことから本体色がはじめから白でなかったことは自明である。

Q.E.D.

それはそうと、昔HiサターンとVサターンというものがあってだな(ry

http://anond.hatelabo.jp/20070918210653

Re: マシン語

なにをもって書けるとするかで(ry

Z80はもう記憶の彼方。8086レジスタ構成とか主要な命令は覚えてる気がする。しかし、なにより書く気がしない。

所で http://anond.hatelabo.jp/20070822235722 の2番目とかは不可かな?

http://anond.hatelabo.jp/20070918181611

書ける。

つってもアセンブラCPUと1対1の命令だから石によって全然違ってきちゃうんだよ。

自分が書けるのはz80,masm,emoti(ry,ARMだな

2007-09-17

ぐち

相手「彼女作らないの?」

俺> ふぇっ?別に欲しくないから

「なんで作らないの?」

> なんで作る必要があるの?

「好きな人いたりしないの?」

> いません

「いないなんておかしいよ。実はいるんでしょ?」

> いやぁ、いないんだよー

「2○才にもなって好きな人がいたことないなんて絶対おかしい」

> …

「いや、そもそもね。もっと積極的にならなきゃ。○○クンはいつも・・・(ry

> …

というタイプの会話にはもう疲れました

なんで恋人がいないだけで説教されなきゃならんのだ!

2007-09-14

続・子供(ry

小飼さんにまでご意見いただいて恐縮です。 でもトラバ全無視で新エントリを書いちゃう。

仮に子供の頃プログラミングに目覚めたとしても、その時点では打ち込んだゲームコードを「追う」ことは出来ても、データ構造もアルゴリズムも「理解」するのは難しいだろう。ポインタークロージャーも、むしろ大人になってからの方が理解は早い。一度面白さに目覚めてしまえば、今や教科書だって「実習環境」だっていくらでもある。慌てる必要は全くない。むしろ「老後の愉しみ」ぐらいでちょうどいいぐらいではないだろうか。

やっぱりそういうものなんでしょうね。 学ばせるなら大学とか専門学校とかでいくらでもありますし。

プログラム言語は、子供が触れてみて面白いというものではなくなった、ということで…

(だからベーマガとかもなくなっちゃったわけだし)

PC でなにか作るなら、ほかに絵とか音楽とかブログとかなんでもありますもんね。

Flash もいいなと思いました。 ありがとうございます。

ブクマコメントみたら LEGO mindstorm とかロボットというご意見もいただきました。 ちょっと敷居高そうですが、楽しそうです。

プログラマが枯渇云々というのは、べつに日本にしかプログラマがいないわけじゃないし、どこへでも求められますので気にしちゃいないです。

プログラマになってほしいからプログラミングやらせたいってんじゃないんです。

2007-09-11

ただいま

俺のフラグか。…欲しけりゃくれてやる。

探せ! フラグの全てをそこに置いてきた…。(CV大塚明夫

男たちはロマンを求め(ry

2007-09-10

http://anond.hatelabo.jp/20070910105633

あまり問い詰めると面倒なら結婚すんのやめる?とか言われるので(ry

はぁ??これぐらい話し合えないで結婚するなんて地獄見るか、愚痴ばっかり言って暮らすようになるよ?

そもそも問い詰められたぐらいで結婚をやめようとする彼女もあまり本気じゃないような…だめなんじゃね?

結納のみ

結納のみで、結婚式はしないってのはありなの?

や。式はしないのは別にかまわないのだけど、結納はするもんだと彼女が言うのです。じゃぁ仲人はどうすんの?とか、それって要するに婚資よこせって事?とか思うのですが、あまり問い詰めると面倒なら結婚すんのやめる?とか言われるので(ry

謎が多いぜ…

2007-09-07

http://anond.hatelabo.jp/20070907200027

我が家ハンバーグの60%は牛と豚の合い挽き肉でできています。

我が家ハンバーグの35%はタマネギパン粉でできています。

我が家ハンバーグの3%は私の愛情で(ry

我が家ハンバーグの1%は私の汗で(ry

我が家ハンバーグの0.7%は(ry

我が家(ry

我が(ry

我が帝国に栄光(ry

ふがふが

ようこそ、℃-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-09-03

ただいま

だから、それはフラッペ。欲しいって言ってたのはフラ(ry

2007-08-30

価値観増田と、アンチ価値観増田の闘争について

すまんね。なんか、俺が価値観増田煽りTBつけまくったせいで場が荒れてきた。そこで、もう一つ、煽っておこうかと思い、ここに書きこむわけだ。

きっと価値観増田現実で自分の価値観を侵害されるような行為を受けた、あるいは見たんだろう。そして、自分の価値観を維持することがとても難しい局面に陥ってるんだと思う。例えば、会社から不法行為を強要されたりとかね。それでも会社をクビになるのは何より恐かったから、今の境遇に関して自分をなっとくさせる必要があった。そのためには自分の価値観をねじ曲げてでも会社に迎合することが、生きるために必要で、それが社会常識でなければならなかった。

だからこそ、このような公の場で何かを叫ぶことによって、自らが置かれている境遇を一般化できるのではないかと(ry、、、

なんか、自分でも何言ってるのか分からなくなってきた。

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