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

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

2022-08-19

マンガ好きだが、今一番の雑誌サンデーで、ジャンプで読める作品数は少ない、そしてWeb漫画アンテナは便利だ。

サンデーはこの中で売上が下の方らしい、そして

今のジャンプははっきり言ってマガジンサンデーよりも書ける人が揃っていない、でもジャンプのほうが売上が大きいらしい。

読める作品を思い出してみると

サンデーは、龍と苺、コナンMAO、シブヤニアファミリー白山三田さん、舞妓さんちのまかないさん、この漫画ヒロインは森崎あまねです、ラストカルテ、BeBlues、君は008、魔王城でおやすみレッドブルー、第九の波濤、十勝一人ぼっち農園、あおざくら、葬送のフリーレン、古見さんはコミュ症ですの17作品

チャンピオンは、弱虫ペダル、ゆうえんちバキ外伝、あつまれふしぎ研究部、ディエゴハリガネサービス、SANDA、ヤンキーJKクズハナちゃん、もういっぽん、メイカさんはおしころせない、木曜日のフルットグラップラー刃牙BEASTARSバチバチBURST、Gメンの14作品

マガジンは、はじめの一歩ダイヤのA黙示録の四騎士、シャングリアフロンティアカッコウの許嫁、カノジョ彼女、それでも歩は寄せてくる、幼なじみとはラブコメにならないの8作品

ジャンプは、ワンピース、WitchWatchの2作品Dr.STONE終わったのが痛い)

Web漫画アンテナ登録作品は(現在更新されてないのが多々ある)

2.5次元の誘惑

17歳からやり直すプロポーズ

38歳バツイチ独身女がマッチングアプリをやってみたヤバい結果日記

47歳、V系

Artiste

DYS CASCADE

Dジェネシス ダンジョンが出来て3年

GROUNDLESS-アリストリア改国戦記-

Helck

Infini-T Force 未来描線

MANGA Day to Day

NEETING LIFE ニーティングライフ

New's Network

R15+じゃダメですか?

SPY×FAMILY

あだち勉物語』~あだち充漫画家にした男~

アイドル家計簿

あそこではたらくムスブさん

あそびあそばせ

アニメタ!

アフタースクールメイト

あやかしトライアングル

あらくれお嬢様もんもんしている

アラサーママの私でいいの?

アルテ

いじめるアイツが悪いのか、いじめられた僕が悪いのか?

イジらないで、長瀞さん

エリス聖杯

おいしいコーヒーのいれ方

おしえて! ギャル子ちゃん

おちたらおわり

おとなりに銀河

お下がりのオンナ

お嬢さまから始める新婚生活

カスミ荘の漫画家志望達

カナカナ

きみとピコピコ

キャプテン2

きょう、離婚しますがなにか?

キン肉マン

クマ撃ちの女

ぐらんぶる

ゲーミングお嬢様

コーポ・ア・コーポ

こういうのがいい

ココロプログラム

この世界は不完全すぎる

コワモテ後輩が一日一回好きって言ってくる

ゴールデンゴールド

ゴールデンラズベリー

ゴブリンスレイヤー

サバエとヤッたら終わる

さよならキャンドル

さよならミニスカート

ざんげ飯

シンデレラキャンプ

それでも歩は寄せてくる

ダンス イン ザ ヴァンパイアバンド A.S.O

ダンダダ

つんドル!〜人生詰んだ元アイドル事情

てるて建設(株)

となりの代理人 -フットボールエージェント-

ドルフィン

ドンケツ

ドンケツ外伝

ナナとカオル Last Year

なれの果ての僕ら

ぬけぬけと男でいよう

ボル

ハイパーインフレーション

はぐれアイドル地獄変

ハルとアオのお弁当箱

バレット×ファング

ひとりでしにたい

ふたり明日もそれなりに

ブスなんて言わないで

ブラックガールズトーク

プレイボール2

プロレス保健室

ペイル・ブルードット バトルアスリーテス大運動会 ReSTART!

ペスト

ぽちゃこい

マイ・ブロークン・マリコ

まいまいまいごえん

マチネの終わりに

マリッジグレー

マンバイト 蒼空猟域

ミドリノバショ

みんなで作ろう!中央アジアクッキング

メイドインアビス

やり直し姫は夫と恋したい

やんちゃギャル安城さん

ゆきちゃん官能ごっこ

ラーメン赤猫

ラストジェンダー ~何者でもない私たち

ラブゼミ上野教授恋愛講義

レディース!

ロリータ

ワカコ酒

ワンパンマン

ヴァンピアーズ

悪の糸

囲の王

異世界キャバクラ

異世界猫と不機嫌な魔女

異世界迷宮ハーレム

宇宙の卵

王国へ続く道 奴隷剣士成り上がり英雄

俺たちつき合ってないか

家が燃え人生どうでも良くなったから、残ったなけなしの金でダークエルフ奴隷を買った。

家性婦とシタ 2

怪獣8号

外面男子清水くん

骸骨騎士様、只今異世界へお出掛け中

間くんは選べない

機動絶記ガンダムSEQUEL

機動戦士ガンダムTHE ORIGIN

帰ってください! 阿久津さん

境界のエンドフィール

君の心を漢字たい

傾国仕立て屋 ローズベルタ

拳児2

風俗嬢金持ち妻になりました

言えないことをしたのは誰?

古代戦士ハニワット

公爵令嬢の嗜み

好きなオトコと別れたい

幸せカナコ殺し屋生活

高嶺のハナさん

今日から始める幼なじみ

婚活バトルフィールド37

佐倉は私を好きすぎる

左ききエレン

最果てから、徒歩5分

三十路病の唄

子供になった俺を妻がめちゃくちゃ愛でてくる ~曜路と乙菜の夫婦生活

私がモテないのはどう考えてもお前らが悪い!

私と夫と夫の彼氏

自分気持ちを押し殺せてないメイドさん漫画

灼熱カバディ

寿エンパイア

終末のハーレム

終末のハーレム ファンタジア

あかね高校定時制夜間部

猥談

女の解体新書

女王陛下異世界戦略(ストラテジー)

騎士とケモミの子

傷だらけのピアノソナタ

松井さんはスーパールーキー

上京生活録イチジョウ

新しいきみへ

絵師JKOL腐女子

神様を殺す子供たち

人妻の唇は缶チューハイの味がして

図書館の大魔術師

吹奏楽部トランペットパート1st2ndの感情デカ漫画

推しが辞めた

推し武道館いってくれたら死ぬ

星界の紋章

正反対君と僕

青とオレンジ

青に、ふれる。

青のオーケストラ

専業不倫~堕ちていく主夫主婦

戦争は女の顔をしていない

創世のタイガ

早朝始発の殺風景

草薙先生は試されている。

脱稿するまでオチません

かのことを好きなだけ

蜘蛛ですが、なにか?

中華一番!

中国嫁日記

比奈若葉とOOな彼氏

都合のいい果て

東島丹三郎仮面ライダーになりたい

東独にいた

同人女アパート建ててみた

道産子ギャルなまらめんこい

独身OLのすべて

独身貴族は気づかない

派遣社員あすみの家計簿

彼女友達

美木さん、大好きです!

姫ヶ崎櫻子は今日不憫可愛い

姫様“拷問”の時間です

片喰と黄金

宝石商のメイド

邦画プレゼン女子高生 邦キチ! 映子さん

北斗の拳 世紀末ドラマ撮影

僕が夫に出会うまで

僕たちは繁殖をやめた

僕の奥さんちょっと怖い

僕の心のヤバイやつ

僕の生徒はオトナギャル

僕より目立つな竜学生

万引きGメン たつとら!!

未熟なふたりでございます

未来のムスコ〜恋人いない歴10年の私に息子が降ってきた!

未来人サイジョー

夢中さ、きみに。

明日、私は誰かのカノジョ

明日の恋と空模様

綿谷さんの友だち

妄想先生

木根さんの1人でキネマ

柚子川さんは、察して欲しい。

幼馴染とはラブコメにならない

踊れ獅子堂賢

理系が恋に落ちたので証明してみた。

流血女神伝帝国の娘~

龍と苺

隣のお姉さんが好き

隣のガキに懐かれた話

隣の黒木さんは飲むとヤバイ

恋とゲバルト

恋人以上友人未満

凛子ちゃんとひもすがら

ごはん

ガール

2022-06-04

結婚して苗字を変えるなら「今井」姓にしたい

下の名前が「舞」だからから読んでも下から読んでも「いまいまい」になりたい

人生で一度も未婚の「今井」姓の男性に会ったことがない

イマイが最高だけど、無理なら「イマ○」(イマダ、イマノetc)でも良い

結婚相談所ってそういう希望も汲んでくれるのかな

2022-04-14

サンリオ

年代順にキャラクターを見ていたら、近年、人型のキャラばかりだ……。

2018年は「となりの研究生シマヒメコ。」。なんか、サンリオにこういうのは求めてない感。

2019年は「デビルミント鬼龍」と「Warahibi!」。なんだこのVTuberみたいなやつら……。

2020年は寄せ集めみたいな感じ。

2021年の「まいまいまいごえん」も違う、こうじゃない……。

「ぼさにまる」で矜持を取り戻せ。

2022-01-23

三木美樹」「今井舞」みたいな名前ある?

みきみき

ABAB

まいまい

ABABA

2種の音だけが交互に登場するお名前

知りたいです! 知りたいでーーーーーーーーす!!!!!!!!

2021-06-15

ぜんぶ可愛ければ

自分乃木坂みたいな顔と性格だったら、イケメンと付き合えたんだろうな。

私が与田ちゃんだったら、桃子だったら、未央奈だったら、美月だったら、聖来だったら、さゆりんごだったら、七瀬だったら、まいまいだったら。

自分容姿レベルでどこまでを求めていいのかわからない。

大学時代全然だめだった。周りの可愛い子ばっかチヤホヤされて、私は手軽な存在だった。

職場では、みんな私のこと可愛いって言ってくれるから勘違いしてる。子どもにも可愛いお姉さん!とか乃木坂みたいとか言われてさ。先輩も、同期も可愛いって言ってくれて。

調子乗ってたかも。

イケメンが好き。イケメンから好きというか、好きになった人がみんなそこそこイケメンだった。

そして好きになった人と付き合えたことがない。

妥協で付き合った人とも半年以上続かない。

なんで妥協で付き合ってるのに少しでも不安にさせるの?なら別れよってすぐなっちゃう。

でも寂しい。どうしようもなく寂しい。彼氏が欲しい。私の事を女の子扱いしてくれて、大切にしてくれる彼氏が欲しい。

Tinderで会ったらさ、みんなヤリモクなの。

エッチしたらあっちからの連絡無くなる。

それまでみんなLINE電話もくれたのに。

そんなの分かってるけど、エッチしないなら会ってくれないでしょ。優しくしてくれないでしょ。

ヤリモクじゃない人も1回あったら連絡なくなった。

マッチングアプリだと、1回会って無理だなって思った人ほど連絡してくる。

自信ないしつまらない人間だし顔もそんななんだろうから本当に穴以外魅力がない。

顔はともかく、中身が終わってるんだろうな。

早く彼氏ほしい。

それでこの気分を紛らわせてほしい。

一生好きな人と付き合えないんだろうなって思っちゃう

どうせまた好きになった人には遊ばれて、うわって思った人に告白されての繰り返しなんだろうな。

辛い、でも1人の方が辛い。

2020-09-01

2歳児「弟ちゃん(0歳)かわいい、弟ちゃん好き」

「どこが好き?」

2歳児「まいまい(よだれかけ)がかわいい

かわいいなぁ。

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

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