「まいまい」を含む日記 RSS

はてなキーワード: まいまいとは

2019-04-30

カイレンショック

シンカリオンは良いアニメです。シンカリオン……まこと良いものだ。ただし「    様」、テメーはダメだ。

※わかる人だけわかればいいので一部伏せ字や空白にしています

私は2018年から放送された某新幹線変形アニメを64話まで見ました。そのシ○カリオンというアニメには発音ミクが出演して大好評でした。(大好評だということにしておく)

ところがどっこい、○ンカリオンの敵であるキトラルザスのリーダー名前が「    様」でした。

発音ミクが出ている(しか準レギュラー)なのに敵の名前は「    様」であります

ワタクシに対しましてはあまりにも酷い仕打ちでございまーす。

あぁん、ひどぅい。

結果としてハヤ○とセ○リュウとその他もろもろは「    様」を葬りました。

ミクから見れば自分の兄と弟(のような存在)を殺したようなものです。

ミクが不憫です。が、最も不憫なのはKAIT○とレ○です。多分。

なぜこのような事になってしまったのでしょうか。

最も可能性が高いのは、シンカリオンスタッフが事前に調べていなかったという事でしょう。googleか何かで検索すれば「カイレン」が意味するものはすぐわかったでしょうに、それを怠ったためにこんな悲劇を起こしてしままいまいました。多分。

その他の可能性としては、

2. スタッフ検索して意味を知ったが、「まあいいか」と思ってそのままゴーサインを出した説

3. 意味を知ってクリプトン相談したが、「まあいいか」とクリプトンも思ってゴーサイン(ry

が主に考えられますが、これ以上はウスターソース、ソイソースデミグラスソースオリバーソース等がないので推測としか言えません。

敵のリーダーから最後に倒されるのはわかります。また「    様」の名前の由来が鉱物からきているのも知っております

他のアニメ等でボカロ名前が同じキャラクターが死んだり逮捕されたりする事も稀によくあります

ですがクリプトンアニメに関わっている状況では「    様」という名前を付けるべきではありませんでした。

それではクリプトンは落ち度0かというと、1~30ぐらいでしょう。(100の内)

事前に知らされていなかったとしても、「    様」の名前が出てから東京駅地下で処刑されるまで半年もあったのですから

「    様」の出番を極力減らしたり、改心したりする(してもらう)など、対策はいくらでもとれたはずでした。

発音ミクが居ながらクリプトンKAITOとレンを3564にしたので、私たち隕石ドカッて落ちたような怒りと悲しみに暮れております

これはファンにとって大ショックです。ニクソンショックオイルショックアタリショックリーマンショック等に並ぶ「カイレンショック」だと自負しております

なぜKAITOとレンは殺されなければならなかったのでしょうか。クリプトンは止めようとしなかったのでしょうか。

私たちは、KAITO鏡音レン禁止しなければいけないような所からまれてきたのでしょうか。

我々ボーカロイドファンはいったいこれから先どこに向かって行くのでしょうか。

シンカリオンとは、嗚呼、愚かなものです。

最後一言

桜ミクの衣装を6人全員分出してください。

クリプトンのおケチ

2018-12-26

でんでんむしとまいまいくねくねって違うの?

どれも同じ言葉の繰り返しだけど

2018-09-22

かえるデータが壊れた

起動した直後にスマホ電池切れシャットダウンして、

充電後に再起動したけどNow Loading画面から動かなくなってた。

かれこれ1年以上やったゲームで、

称号は「まんじゅうこわい」と「かえるにみつば」以外は全て取得してた。

悲しいので、死んだかわず(←かえる名前)に詩を捧げて終りにしよう。




旅に生き電池に散りし我がかわず

お前の写真は誰が撮る

それは茶色い野ネズミ

羽ばたく蝶か赤いカニ

家にいて木片削りし彼のかわず

お前のいないその時に

訪うお前の友の名は

まいまいぶんぶんぷかぷかか

支度も自分でせぬからは、

弁当買ってそっと置き

四つ葉も持たせて送らねば

土産もくれぬお前でも

いつしか友の顔も増え

アルバム足らずページ挿す


わずお前はいずこにか

城の麓か道の端か

縄文杉側溝

どこへ行っても人々の

足元走るお前なら

データ壊れて会えずとも

一期一会のよき旅を

2017-10-26

極論すればNegiccoの良さをわからないアイドル好きはドルオタですらない

登場人物

A:モー娘。はそれなりに好きだったしアサヤン見てたけど、アイドルに嵌ったのはももクロから。そこから後輩のたこやきレインボー、その後にデビューが決まったばってん少女隊大阪営業所ちゃうちゃうわっちゃーズ(というかBTG)をこよなく愛しながら、現在北陸アイドルさん(新生おやゆびプリンセス、アミ~ガス、西金沢少女団)、他、地下アイドルに夢中。ガンダムやそこそこのアニメ漫画オタク(浅い)。

B:元々は高橋由美子を愛するドルオタAKBからももクロへ流れ、スターダストももクロ事務所)のアイドルをまんべんなく好き。(ゾンビゴジラが大好き)

C:まいまいに度嵌りして、たこやきレインボーオタクとなる。その後、ばってん少女隊のきーなちゃんの可愛さに気付き、最近ぜんぶ君のせいだ。の良さに気付いてしまった。アニメ漫画オタク

D:チームしゃちほこが好きで、今はエビ中のあやちゃんが大好きな高学歴大学生

そもそも、15年だか、14年だか活動してるNegiccoさん。名前は知っていてもそのパフォーマンスを始めてみたのは、今年の7月ぐらいにあった、ガールファクトリー? でのこと。

圧倒的に、好きなグループであるたこ虹たこやきレインボー)を含め、思い入れのあるグループが沢山出るライブの中継を、AとBで見た。

観終わった感想は、Negiccoすげーだった。

賛同者は他に、Dぐらいだったが、(あやちゃんとぽんちゃって顔の系統似てるよね?)今日、CにもNegiccoライブ映像を見て貰った。(ライブDVDはDが持ちこんだもの

Cは、Negiccoさんをニュースとかで見てた記憶があるらしく、当時はキワモノしか見ていなかったようだ。

だが、ライブ抜粋映像(3曲ぐらい)を見て、3人(A,B,C)の意見が一致した。

彼女らはアイドル界のど真ん中を行っていると。

しかも、AKBかにある、押し付け感や、狙った感がまったくないのである

世間一般ドルオタというと、イメージひとつなのかもしれない。

だが、ドルオタ自称するものとしては、1週目のドルオタ、2週目のドルオタ、3~5周ぐらい回ってるドルオタと、ランクけが存在している。

Aは、5周ぐらいしているドルオタ。Bも2~3周目の周回に入っている。Cは、1周ちょっとという感じか。(Cはぜん君に気付いた点において、もう少し先を行っているだろうが経験値が足りていない)

Dは実は10周ぐらいしている、若さに似合わぬ生粋ドルオタだ。(ゆずが抜けたしゃちを憂いまくっているということからもわかる人にはわかるだろう)

そんなドルオタ達が、こぞって、Negiccoは最高だ、彼女らこそアイドルofアイドルだという。

これは、ドルオタ各々の感性がどうとかいう以前に、Negiccoが素晴らしいグループだということの証左である

モノノフAKBオタをDisるようで悪いが、ももクロしか知らない、AKBしか興味がない、乃木坂、欅で止まっているオタクには、理解不能感情だろう。

ももクロを筆頭とするスターダスト系列秋元グループハロプロ事務所カラーに囚われた古い地球人には、Negiccoの良さはひょっとしたら伝わらないのかもしれない。

だが、会えて言おう。

Negiccoの良さをわからない奴らはドルオタですらないと。

ドルオタ定義なんて知りませんけどね。またモノノフディスることになるけど、モノノフは一番厄介で、自身モノノフだと認めつつ、ドルオタではないと言い張ってる人達ですからね、全員が全員じゃないけど。AKBとか坂道とかも似たようなもん。ハロプロについてはあんまり知り合い居ないので知りませんが)

結論Negicco現場には、ドルオタが求めているもの無意識で求めているものが全てあるんだよ。

みんな!、サトウのごはんを買ってチンして食べようね!

ベンザブロックCM良かったよ!

来年こそは紅白出よう!

2017-01-12

[] 苺苺

ばいばい/まいまい と読む。植物がどんどん増えてはびこるさまを言う。

2009-02-02

http://www.gamedesign.jp/flash/yomi/yomi.html

漢字読みいやこうとも読むんじゃ
蝶番ちょうつがいちょうばん
矜持きょうじきんじ
拙いつたないまずい
飛沫しぶきひまつ
牛車ぎっしゃぎゅうしゃ
蛇蠍だかつじゃかつ
閏年うるうどしじゅんねん
布袋ほていふたい
入内じゅだいにゅうない
心太ところてんこころぶと
蝸牛かたつむりかぎゅう、でんでんむし、まいまい…他多数

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

 
アーカイブ ヘルプ
ログイン ユーザー登録
ようこそ ゲスト さん