「えりか」を含む日記 RSS

はてなキーワード: えりかとは

2016-12-19

つぼみ感ってwwwwエリカかよwwwwwワロッシュwwww

こころのたねもそこからまれてるってか?www

えりかの尻のつぼみを花開かせたい

2016-06-23

ハトプリのえりか

かわいすぎる

AAかわいいと思ったけど、アニメもそのままかわいかった

クッソかわいい

クッッッッッッッッッッッッッッッッッッッッッッッッッッソかわいい

破裂しそう

2016-05-11

http://anond.hatelabo.jp/20160511005258

まぁ分かるっつーか、俺みたいなおっさん時代からわりと教習所はそういうとこあった。

急ぎな事情があるのは本当同情する。

腹立つよな。

ただ、それこそ慎重に考えて欲しいんだが、仮に増田合格すれば、あの可愛い唐田えりかCM してるソニー損保に加入できるんだぞ?

というわけでえりか可愛い顔でも見て怒りを鎮めたまえ。

http://www.sonysonpo.co.jp/cm/ccmg000.html

やばい可愛い死んでもいい。

2016-04-15

唐田えりかが可愛すぎて辛い

ソニー損保CM の唐田えりかが可愛すぎてほんと辛い。

彼女とか嫁とかじゃなくていからあんな娘欲しい。

透明感パない

ブレイクして欲しい。

2015-07-05

やっぱりデスノートつまんなかったな

あんなんでも今の子供は面白いと思うんだろうな

ミサミサは、とだえりかよかあの子の方がイメージ近いとは思ったよ

乳でかすぎだけど

2015-06-27

将来えっちな絵を描きそうな人

昨今の二次創作アンチにはほとほと辟易している。

俺は二次創作のいわゆる薄い本エロ)、ネット上にあふれる1枚絵(エロ)が大好きだ。

えっちな絵を描いてない人が描くようになる瞬間が大好きだ。

えっちな絵を描きそうな人を見極める参考にしてもらえればと思う。

名前を出してしまった絵描きさんには申し訳ないが、おっさんの戯言と思って許していただきたい。


まず、絵描きを以下の8タイプに分類する(敬称略


0.(少なくとも表に出る形では)まったく描かない人

たくさんいるので例はあげられない。数で言えばここが一番多い。


1.商業しか描かない人

エロゲー原画さんに多い気がする。

商業エロ漫画家同人pixivエロ絵がない人は見たことがない。

ex:

月嶋ゆうこ

http://www.pixiv.net/member.php?id=78088

Mitha

http://www.pixiv.net/member.php?id=283135


2.数年前は描いていたが最近描かなくなった人

絵柄や作風の変化、商業デビューなどがきっかけで描かなくなったりする。

寂しい限り。

ex:

なつきゆう

http://www.pixiv.net/member.php?id=226893

みくる

http://www.pixiv.net/member.php?id=543291

ぺこ

http://www.pixiv.net/member.php?id=3439325

らぐほのえりか

http://www.pixiv.net/member.php?id=101500


3.別PNで描く人

まったく別PN、別サークル特に告知もなく描いていたりするケース。

例にあげてしまったが俺が思ってるサークルとはもしかしたら無関係かもしれない。

ex:

雛星ひな

http://hinaboshi.blog76.fc2.com/

今見たら活動終了って。悲しすぎる。


4.描きそうな絵柄なのに描いてなかったがここ数年描くようになった人

注目すべきはここだ。いろんな理由があるんだろうが、活動当初は本人が未成年だったりするのではないかと踏んでいる。

ex:

季月えりか

http://www.pixiv.net/member.php?id=419808


5.ものすごくたまに描く人

数年に一度、というケースもあるのでアンテナを高くしておく必要がある。

ex:

藤井理乃

http://www.pixiv.net/member_illust.php?id=1002315


6.よく描く人

山ほどいるので割愛


7.いつも描く人

6.に同じ。



このうち、1と2はほぼ今度えっちな絵を同人ベースにあげる可能性はないものとしていい。

3はイベントサークルカットと当日足で稼げば見つかるかもしれないが、かなり難しい。

4について、描くようになるかどうかは

pixivtwitterでの交友関係をなんとなく見る

・ほのぼの系よりはギャグ4コマ系の作風の人のほうがエロシフトする可能性が高い(気がする)

・微エロ路線シフトし始めたら、R-18は近い

 ※ただし、微エロ路線を追求していくこともある(それはそれで俺的にはOK)


まとまらないが、今後も二次創作エロが減らないことを祈って。

2015-04-16

[]2015/04/16

いろいろ見たけどはっきり覚えてるのは、

ハートキャッチプリキュアえりかと夢の中で会ったこと。

クラス席替えで移動先がえりかの後ろの席だった。

先に机と椅子の移動を終えてすでに座っていたえりかが振り向いて、

顔をしかめて「こわそうなひとがきたヨ~」と言って、また前を向いた。

会話とかはできなかったけど、えりかと会えてよかった。

2013-07-03

あの夏の日のこと

車の免許を取って、バイトで稼いだお金20万円のオンボロ中古車を買った。

彼女助手席に乗せることができれば、かっこがつくところだが、隣に座ったのは、うだつのあがらない同じ学部友達だった。

授業をサボってのドライブ

開放感に満ちていた。

海沿いの国道は、松林と砂丘の間をまっすぐに貫いていた。

先輩の話だと、この国道の先のはずれにアメリカの議事堂を模したラブホテル廃墟の状態で取り残されているらしい。

特に目的もないドライブ

エアコンが効かない国民車。

全開にした窓から夏の太陽の光と海の風がドバドバと車内に入り続けていた。

国道を外れると海の青さはより深くなり、浜茶屋看板もなくなり、補修頻度が減った道路自然にかえりかけているようだった。

案内の看板も白地に赤い矢印と黒い文字で書かれた今では見ることのないタイプのものが残っていた。

好奇心。ただそれだけだった。

おばけが出るとうわさの廃墟だが、夏の太陽サンサンと照りそんなそぶりはまったくなかった。

廃墟となった白い建物は、放置された朽ち果て感と不良にいたずらされた無残さが際立っていた。

厳重な柵と立て看板の警告を見たぼくらは、探検する意欲をなくし、ぶよが飛び回る廃墟をあとにした。

道路はこの廃墟の向こうにも続いていた。地図で確認するとなぜか袋小路になっていてどこにもつながっていない。

何もない道の先はどうなっているのか。地図上の空白地帯は一体なにがあるのか。

僕らの探検心はグングンと大きな盛り上がりを見せたのだった。

少し走ったところであっけなく探検は幕切れをむかえた。

道路はなくなり、入り江に囲まれた静かな砂浜がそこにはあった。

茶屋もなく、波消しブロックもない。

人間が入り込む前の海岸がそこにあった。

風と波の音しかしない。そんな場所だ。

誰もいないであろう無人と思しき砂浜をぼくらは探検の成果としてカメラにおさめた。

圧倒的な天然感をグイグイと僕らに強いてくる大自然は、総天然色のポジフィルムに焼き付けるには格好の対象であり、夢中でシャッターを切った。

水着彼女がその中にいればどんなにすばらしい写真になるとわかっていても、誰もいない自然被写体だった。

真夏の午後2時の日差しは容赦なく僕らの皮膚に対して紫外線照射し続けた。

一通り探検を終えて車に戻ったとき、この人気のない海岸山手に唯一人の気配がある建物がひっそりとあることに気が付いた。

探検の続きとして、好奇心だけでそこへ行ってみると、小さな事務所が建っていた。

事務所前には、車が一台停まっていた。人がいるようだ。

ブラインドのすき間から部屋の蛍光灯が見えた。

近くまでいって看板を見ると、電力会社出張所だった。

こんな僻地出張所。どんな出張をするのだろうか。

看板には、土地の所有を主張する説明も書いてありほとんどは、電力会社が買収していた。

この大自然は、電力会社のものだった。

静かな青い海も白い雲が浮かぶ青い空も緑に染まる山も電力会社のものだ。

急によそよそしい気持ちがフツフツとわいてきた。

うだつのあがらないコンビは、顔を見合わせて、この場所が何なのか急に思い出した。

ここは原発建設予定地だったのだ。

新聞テレビニュースをにぎわせたあの場所だ。

事務所の近くには、最後地主が売り渡さなかった土地が柵で囲まれていた。

柵の中には、所有を主張する看板が立っていた。

のものなのかは覚えていない。

地元に巨額のお金を落とすプラントは、建設されることはなく、ずっと塩漬けになっていた。

塩漬けになったおかげで、人間の気配がない場所になっていた。

皮肉にも人類の英知を集めた巨大プラント建設される予定地が、もっと自然が色濃く残る日本有数の自然遺産となっていたのだ。

あの夏の日からだいぶ時間が経過した。

あの海も空もあの日のままなのだろうか。

気が向いたら、足向けてみたいと思う。

2013-04-30

http://anond.hatelabo.jp/20130430111220

\(^-^)/<おかえり~


(どっちがおかえりかわからんほどレス遅れた…ごめんよ…)

2010-11-01

大学在籍中頃まではアニメを観てゲーム全般(ギャルゲエロゲも含む)をやっていたが、

漫画研究会とかは入らず)

年月重ねて遠ざかってきたが、先祖返りかどうかはわからないが

TSUTAYA大学在籍中に観ていたアニメDVDを借り始めてから無性にアニメエロゲに触れたくなってきた。

たまに深夜のアニメも観ちゃう勢い。ゲームエルフダウンロード販売に手を出してみた。

コンシューマギャルゲ以外は昔からずっとやっています)

知識的なものは当時で止まったまま。

オタ系SNSとか入ってもついていけないかな。

仲間が欲しくなっちゃって。

*修正

先祖えりか先祖帰り

2010-04-22

http://anond.hatelabo.jp/20100421223927

まぁ、プリキュア主題歌に限らず、作品のノリは学会員には馴染みやすいだろうな。

そして、ハートキャッチ1話えりかが「ウザイ」と言われてたけど、学会婦人部に比べたら可愛いだけでしかないw

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)のスコア概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。

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