はてなキーワード: portsとは
友達が最近藤村シシンさんがFGOをギリシャ史と絡めて解説する動画にハマったらしい。ヲタトークをしていたらシシンさんの動画が面白かったという話をしていて、それはいいんだけど、「古代スパルタだとお金をわざと重くして人々が堕落しないようにしてたんだって!」と楽しそうに語りだしたので「そんなことある???」と思ってしまった。古代ギリシャ史については素人だけど、流石にちょっと胡散臭くないか?
ということで調べてみました!
動画はこれ。
https://www.youtube.com/watch?v=1R-hpr7FJdI
まあトーク番組だから出典をいちいち挙げないのは当然として、じゃあ何がソースなんだろうと思ってちょっと検索してみたら、元ネタはプルタルコスの『英雄伝』なのね……『英雄伝』はギリシャ・ローマの英雄たちの逸話を紹介してる本で、日本語訳も複数出てるけど、増田は素人だから手元になくて近所の図書館にもなさそうなので、ネットで英訳版を見てみることにする。具体的にはリュクールゴスの章に書かれているらしい。
Not contented with this, he resolved to make a division of their movables too, that there might be no odious distinction or inequality left amongst them; but finding that it would be very dangerous to go about it openly, he took another course, and defeated their avarice by the following stratagem: he commanded that all gold and silver coin should be called in, and that only a sort of money made of iron should be current, a great weight and quantity of which was very little worth; so that to lay up twenty or thirty pounds there was required a pretty large closet, and, to remove it, nothing less than a yoke of oxen. With the diffusion of this money, at once a number of vices were banished from Lacedaemon; for who would rob another of such a coin? Who would unjustly detain or take by force, or accept as a bribe, a thing which it was not easy to hide, nor a credit to have, nor indeed of any use to cut in pieces? For when it was just red hot, they quenched it in vinegar, and by that means spoilt it, and made it almost incapable of being worked.
In the next place, he declared an outlawry of all needless and superfluous arts; but here he might almost have spared his proclamation; for they of themselves would have gone after the gold and silver, the money which remained being not so proper payment for curious work; for, being of iron, it was scarcely portable, neither, if they should take the means to export it, would it pass amongst the other Greeks, who ridiculed it. So there was now no more means of purchasing foreign goods and small wares; merchants sent no shiploads into Laconian ports; no rhetoric-master, no itinerate fortune-teller, no harlot-monger, or gold or silversmith, engraver, or jeweller, set foot in a country which had no money; so that luxury, deprived little by little of that which fed and fomented it, wasted to nothing and died away of itself. For the rich had no advantage here over the poor, as their wealth and abundance had no road to come abroad by but were shut up at home doing nothing. (...)
なるほど、シシンさんのトークはプルタルコスの記述に忠実だ。少なくとも彼女は盛って話していたわけではない。
で、プルタルコスの『英雄伝』が書かれたのは後2世紀初頭と言われているんだけど、ここで逸話が語られているリュクールゴスはだいたい前9世紀頃に活躍した人物と言われているのね。彼はスパルタの半ば伝説的な立法者。要するにプルタルコスは直接スパルタで鉄貨を見たんじゃなくて「1000年くらい前のスパルタではそういうことがあったらしいよ」っていう伝承を語っているのよ。古事記かな?
ところで根本的に、古代ギリシャでは鉄の棒を通貨として使っていた地域があったらしいんだよね。「わざと鉄の棒を通貨として採用した」んじゃなくて「もともと鉄の棒をお金として使ってた」だと、かなりイメージ変わってこない?
https://www.brown.edu/Departments/Joukowsky_Institute/courses/greekpast/4792.html
ちょっと古い文献だけど,Charles Seltmanっていう貨幣の専門家が書いたA Book of Greek Coinsっていう本にも次のようなくだりがある。
Certain it is that before coined money was used in Greece other states as well as Sparta, chief among them Sparta's great rival Argos, regularly employed iron spits as currency.(34頁)
なんでかというと、スパルタがあったラコニア地方は単純に鉄が採れる地域なんだってさ。そら、鉄が採掘できるなら鉄貨使うわな。
Iron was mined in Laconian territory, in the southern spurs of Taygetus and Parnon which end in Capes Taenarum and Malea. It was, therefore, but natural that the Spartans, with the wealth at their disposal, should employ bar-iron as currency; and their conservatism, combined with their lack of any more precious metal, led them to continue the employment of iron money for four centuries after other Greek states had adopted coin(33頁)
さらにこうも書かれている。
a currency which was possibly kept in use for reasons of economic convenience rather than for the enforcement of a stern rule of life(34頁)
要するに、
ってことね。
「質実剛健さを重んじてわざとコインを使わなかった」のが仮に史実だとしても、「あえて鉄の棒を採用した」んじゃなくて「鉄の棒を使い続けた(=コインを採用しなかった)」というのが本当のところなんだろうなぁ。
あと,「偉い人の論文読んでみたら、普通にスパルタでは外国の通貨使ってたらしいよ」というブログ記事も見つけた。ただ元の論文がなかなか見つけられないので確定的なことは言えないけれど……
https://hoferjonathan14.medium.com/the-iron-money-of-sparta-likely-a-myth-97d95d431a62
このエピソード、英語で色々ググってみたけど全部出典がプルタルコスに行き着くので、考古学的裏付けはあまりないっぽいんだよね。まあプルタルコスはおもしろネタが満載なわけだけど、そこしか出典がないとなると結構胡散臭いんじゃないかな。
もちろん増田は古典ギリシャ語とか読めない素人だから、実際には他のところにも記述があったり、考古学的証拠が見つかっていたり、リュクールゴス時代の古文書が発掘されている可能性もあるわけだけど、個人的にはシシンさんのスパルタの鉄貨に関するトークを信じる気にはなれないかなと思いました。
https://www.kk-bestsellers.com/articles/-/2907/
この記事に鉄の串の写真があって、シシンさんが解説を寄せている。解説の文面はまあ納得のいく見解なので(串がコインに先立つことや、コイン出現後もスパルタでは串が使われていたと書いている。そこに異論はない)、動画でのトークはネタに振り切った感じなんだろうか……
シシンさんの動画のそこ、笑ったw 増田も調査サンキューやで / その上で、動画はFGOというゲームを楽しむユーザー向けで、論文ではない。そこでネタとして紹介してくれたものに目くじらを立てる気に私はならんな
FGOファン向けなら史実かどうかは怪しいおもしろエピソードを史実かのように話していい…ってコト!? ワ…ワァ…FGOファンにもシシンさんにも失礼すぎて泣いちゃった!
様々な論点があるので100字に入りきらないが,スパルタは貴金属貨幣を禁止していたということと,リュクルゴス制の成立を前9世紀とするのは後世による「伝統の創造」であるこことは指摘したい。
書き方が悪かったかもしれませんが、鉄貨の存在や貴金属貨幣の禁止は否定していません。
動画では、シシンさんは「スパルタはお金をどんどん重くしていって、賄賂や贅沢を抑止していた脳筋国家である(少しでも金額が大きくなると持ちきれないほどの重さになるから袖の下は渡せないし、持つことで鍛えられるから)」と言っています。
これ、前提知識なしで聞くと「バーベルのような鉄貨は堕落を嫌ったスパルタの発明」と聞こえるんですよ。実際に増田にこの話を面白そうに話した友人もそう理解していましたし、増田もトークを聞いてそう理解しました。そして実際にプルタルコスはそう書いています。
でも実際には、単にコインの発明前からスパルタやその周辺地域には棒状の貨幣があって、スパルタはそれをコインに置き換えなかった、という話なんですよね。で、参考文献に挙げた本にも「マッチョイズムじゃなくて経済的だから使ってたんじゃない?」と書いてある(最後に引用したセンテンス)。これ絶妙に史実を勘違いさせるトークになってません? って思っちゃうんですが、どうでしょう。
(もちろん、副次的効果として賄賂の抑止や筋力増強はあったかもしれませんが、それが主目的であるかのように論じられると……都会民は電車通勤ゆえに自家用車通勤の地方民より体力があったりしますが、都民の体力を増強させるために都はメトロを整備したんだ、と言い出したら違う話になるでしょう?)
3 青少年のインターネット利用環境(レイティング、ゾーニング)に関する 制度、法および政策とその背景(PDF形式:67KB)
4 青少年のインターネット利用環境(レイティング、ゾーニング)に関する民間機関の取組や現時点における青少年のインターネット利用環境に関する民間団体の取組の内容(PDF形式:162KB)
CP80 Foundation
現状のポルノサイト任意規制では不十分だとして、より強力な法的フィルタリング規制を求め、2006年にユタ州で設立された非営利団体。主な活動は C80 インターネットゾーニングイニシアティブの推進。 内容は 1.ゾーニング技術適用の推奨、 2.インターネットコミュニティポート法(The Internet Community Ports Act(ICPA))の作成、推奨、宣伝、 3.規則の作成及び違反行為の取締りなどのインターネットガバナンスの推進。
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007745140-26-03-2020-Патриот-11-серия-канал-ТНТ-смотреть-в-хорошем-качестве-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007745200-26-03-2020-Холостяк-7-сезон-5-серия-тнт-смотреть-в-хорошем-качестве-
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007745079--Доктор-Вера-15-серия-26-03-2020-качество-HD-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007745980--Холостяк-7-сезон-5-серия-тнт-26-03-2020-в-хорошем-качестве-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/ru/community/posts/360007743679--Место-под-солнцем-27-серия-26-03-2020-онлайн-сериал-смотреть-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007744880-26-03-2020-В-шаге-от-рая-17-серия-Россия-1-смотреть-в-хорошем-качестве-от-26-марта
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007745920--Корни-12-серия-СТС-26-03-2020-хорошее-качество-смотреть-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007744879-26-03-2020-Патриот-12-серия-тнт-в-хорошем-качестве-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007745039--Доктор-Вера-13-серия-26-03-2020-смотреть-в-хорошем-качестве-
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007745080--Доктор-Вера-17-серия-26-03-2020-хорошее-качество-смотреть-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007745020-26-03-2020-Проспект-обороны-13-серия-на-канале-НТВ-все-серии-сезона-
https://youtubecomhelp.zendesk.com/hc/ru/community/posts/360007745119-26-03-2020-Проспект-обороны-15-серия-нтв-смотреть-бесплатно-в-хорошем-качестве-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007744199--Доктор-Вера-17-серия-26-03-2020-качество-HD-
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007743799-26-03-2020-Ничто-не-случается-дважды-2-сезон-17-серия-хорошее-качество-смотреть-от-26-марта
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007744820--Отражение-радуги-11-серия-26-03-2020-в-хорошем-качестве-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/pl/community/posts/360007743919--Проспект-обороны-13-серия-на-канале-НТВ-26-03-2020-все-серии-сезона-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/en/community/posts/360007743879-26-03-2020-В-шаге-от-рая-15-серия-Россия-1-смотреть-бесплатно-в-хорошем-качестве-от-26-марта-
https://youtubecomhelp.zendesk.com/hc/ru/community/posts/360007746440--Проспект-обороны-13-серия-на-канале-НТВ-26-03-2020-в-хорошем-качестве-
大学四回生の夏、下宿の扉に「出入禁止」とチョークで大書し、親を呼ばれて精神病院に連れて行かれた。
パソコンを買ってもらったのは小学三年生の冬だった。今でも覚えている。1996年12月2日のことだ。Windows95発売で世間は揺れていた。インターネット回線がうちに来たのは翌97年の1月、これはそこそこ早い導入だったと思う。さらに翌々年の99年にはケーブルテレビで常時接続になった。親には先見の明があったが、しかしパソコンには詳しくなかった。PC-8001も確かそうだ。親はこれが次世代の必需品になると確信して買っていたが、買った一方で使い道が分からなくてオブジェとして放置していた。親はPC-8001をパソコンだと言っていたけれど、僕にとってパソコンはおっきなテレビが標準で付属しているものだったし、マウスもなかったので、それがパソコンだとは到底思えなかった。でも親は言った。今度来るのは違うんだ、オフィスも入っているパソコンなんだ。僕は聞いた。一太郎っていうやつは入ってないの?テレビで言ってたよ、と。親は答えた。オフィスってのは一太郎より機能がスゴイんだよ。僕はへぇ、とだけ言った。どちらにせよペイントは入っているだろう。ペイントなら親戚の家で使わせてもらったことがある。パソコンはお絵かきができるのだ。マウスをカチカチして、キーボードをカチャカチャするのだけが楽しみで、納品の日を一週間ひたすら待った。その頃、漢字の宿題提出が滞っていて、そのままでは居残りでさせられることになっていた。僕は久々に奮起した。いつもは踏み倒していた宿題を、全部一気に終わらせた。家に帰るとパソコンが電気屋さんの手で設置されつつあった。今は亡き、ニノミヤで買われたパソコンであった。
97年にインターネットを始めた。一日一時間まで。実のところ電話代の問題ではなく、一時間ほど使うとブルースクリーンが発生するからだった。一日一時間以上動かすと壊れるから。PC-8001をキッチリ買った親なのに、それぐらいの(?)ITリテラシーであった。ただ別にそれを責めるつもりはない。僕はすぐにアングラサイトに入り浸った。人に飢えていたのだ。普通のチャットには人がいない。テレホタイムにならないと、誰一人ログイン氏亡いのだ。でも、アングラサイトなら四六時中書き込みがある。僕は思う存分厨房行為を楽しんだ。煽り騙りなんかは、小学生がやっても大人がやっても大して変わらないものだ。You is a big fool manという文句をリアルタイムで目にした人は、多くても数百人だっただろう。何千、何万のツイッタラーが押し寄せ、ブクマが1000以上付くような今の炎上とはほど遠い暢気さだ。当時の匿名掲示板とはそういうものだった。誰一人本気で投稿しなかったし、しかし誰一人面白くない書き込みをしようとはしなかった。トイレでもネタを考え、思いつけばすぐに投稿し、ワラタが付くのを待ち続ける。あやしい、あめぞう、あやしい、2ch。人の多いところから人の多いところへ。ワラタが多くもらえる場所へ。気づいたらインパクが終わっていた。
その一方で僕は中高一貫の私立校に入学していた。高校受験がないことから、ネット依存はさらに加速した。しかし2000年を境にアングラ掲示板は衰退の一途をたどり、2ch一強時代を迎えていた。1ch.tvをボコったりするなど楽しいネタがないわけではなかったが、匿名掲示板はネタの宝庫と言うより、本気でちゃんと議論することもできる場所になり始めていた。ちゃんと議論しようとしたらすぐさま崩しにかかるのが2ch隆盛以前の匿名掲示板文化であったが、2003年頃を境にはっきりと潮目が変わっていったように思う。まあその辺はどうでもいい。アングラと非アングラの境目は消え始めていた。
その狭間に、僕は生きていた。
自分で掲示板を設置することにした。けれども何をして良いのか分からない。CGIレスキューに救援要請をして本も買った。Perlだ。Perlしかない。しかしPerlがどうして動いているのかは、全く分からなかった。何十行、何百行もの文字の羅列が、どこでどうなって、掲示板になるのか。インタプリタ?コンパイラ?訳が分からない。そもそもCPUがどうやって動いているのかも分からない。僕にとってプログラムとは、セットアップウィザードでCD-ROMをギュンギュン言わせながらインストールするものであって、掲示板というものは、Teacupで借りるものだったからだ。でもどうやらそうじゃないらしい。コンピューターに翻訳するのがコンパイラです。さっそくコンパイラを使ってみましょう……
お手上げだった。
コンパイラがないのだ。コマンドプロンプトにはない。Linuxを入れる?使い方が分からない。Vine Linuxが初心者にお勧めだった頃の話だ。ボケッとしててもGNomeぐらいは動かせる程度には簡単になっていたが、そこからターミナルを開いてgccでコンパイルするなんて想像も付かないことだった。Hello, Worldはなんとか表示できても、それをGUIで動かす方法が分からない。僕はデスクトップに「Hello, World」のポップアップウインドウを表示させたかったのに。全然訳が分からなかった。
プログラムが動いている方法を知らなければならない。プログラミングを学ばなければいけない。しかし全体像を把握するにはあまりにもほど遠い……。絶望感が支配し始めていた。Hello, Worldはできたけれど、その先が全くわからない。どの参考書を読んでも分からない。ググってもググっても分からない。ポインタで躓く初心者が多いです!……どの本にも書いてあったけれど、僕はポインタどころか、変数の種類がたくさんあるところでお手上げだった。int?char?long???意味不明の文字列が並び続ける。メモリ?メモリって、挿したらいいんじゃないの?確保?fopen????どんなプログラミング言語も、何一つ分からなかった。その頃インターネットは加速し始めていた。切るのが当たり前だったJavascriptが復権し、Ajaxと名を変えてやってきた。掲示板スクリプトもどんどん高機能化し、もはやPerlを知るだけでは何一つできないようになってしまった。苦痛の日々が始まった。どの言語も、全く分からなかった。分からなければならないという焦りが募っていった。
あるとき、一年間ほど、とりあえずお手上げのままにしておくことにした。大学受験が迫ってきたからだった。そして案外あっけなくそれは終わった。僕は某大学の情報科学科に入った。
教授がガイダンスで説明したとおり、情報科学科のプログラミング演習はそれほど多いものではなかった。一回生の時なんか、キーボードを目で追って人差し指で打っている人もいるぐらいだった。学校の授業はアテにならない。そして大学受験でいったん引っ込んだ、とにかく十代でなにかしないと、という焦りが復活してきた。
大学のキャンパスは広すぎた。何をして良いのか全く分からなかった。授業内容はひどくつまらなく、何が役に立つのかも分からず、ただただ苦痛で、キャンパスでサークル活動に打ち込んで楽しく過ごせるほど社交的ではなく、かといってオタク集団に混じる勇気も無く、とにかく、とにかくここで四年間、四年間で何かしないと、何かしないと就職に間に合わない、大学院進学に間に合わない、十代のうちに何か大きな事を成し遂げなければならない。日々研鑽に励み、日々プログラミングスキルを磨き、日々勉強会に参加し、日々コードを書き、日々環境設定をし、日々本を読み、そして日々コードを美しく書かなければならない、そういう焦りだけがどんどん加速していった。大学の生協で片っ端からプログラミングの本を買った。ド初心者向けのPerl本から、美しいコードは何か、みたいな本まで。でも、どれ一つ、僕のスキル向上には役に立たなかった。プログラミングスキルの向上=自分自身の地位=生活の保障、と思っていた自分には、悪夢のような現実だった。
とにかくインターネットと一緒に歩んできた僕にとって、ITスキルはすなわち力であり、むしろITスキル以外は何の価値も持たないもの、と思えるほど脅迫的な観念にとらわれていた。入ってくる情報はさらに増えていった。Cができるのは当たり前、Ruby on Railsがアツい、Java、PHPはもちろんできるよね、MySQLは当然使えるよね、もちろんHaskell、Scheme、Objective-Cもやらなきゃね……何一つできないのに、習得すべき言語だけがどんどん増えていく。加えて美しいコードを書け!という文句が飛んでくる。クソッタレが。何が美しいコードじゃ。goto使ってもいいだろ。好きなだけ使わせろクソッタレが。全部getsで書いてやる。クソが。アルゴリズムアルゴリズム勉強会勉強会ビューティフルコードMacMacMacジョブズジョブズジョブズ……???????????????
それでもなんとか、そう、なんとかなった。友達が優秀だったのだ。僕には到底できないような、きれいに整理されたコードを書く人だった。聞けば在学中から外注のプログラマをやっていて、それなりに稼いでいたのだという。性格はちょっとアレで、風俗に勇気を出して行こうかどうしようか迷ったけどその金でオナホ買ってシコってオナホを床に叩きつけたみたいなヤツだったけれど、そいつからもらったコードを、わざと汚く成形し、変数名も汚らしくし、提出し、なんとかなった。結局自分で最初から最後までプログラムを作ることはできなかった。丸々コピペはしなかったけれど、コピペがなければ卒業は無理だっただろう。
そうして三回生の終わり、試験がどっと押し寄せてきた。一月のことだった。機械学習と……なんだっけ?そういう感じの試験が、2月の初日、行われることになった。三回生はただでさえ試験が多かったが、その大トリこそが機械学習だったのだ。
まるで意味が分からなかった。推論、それは分かる、機械学習?機械に学習??やっていることは数式だしベイズがどうの……まるで分からない。泣きそうだった。三年間必死こいて勉強したり勉強会に行ったりプログラミングスキルを上げようとしたり本を読んだり色々したのに、何一つ得るものは無かったのだ。僕はあやしいわーるどでオマンコ連呼していた頃から、何一つ成長出来なかったのだ。そしてそれは、間違いなく、疑いようがなく、自分のせいだった。自分の頭が悪いせいで。自分の勉強不足のせいで。自分のせいで……コンピュータとともに、十何年も育っていた僕にとって、コンピュータに関するスキルこそが、全ての力の基準だったのに、その全てを否定されたような気持ちだった。プログラミングができなければ、死ぬ。だって、友達はみんな就職して、SEになったりSIerで働いたりネットワーク管理者になったりしてるのに、僕はなんで、こんなところに。そいつらに取り残されるのに。みんな勉強会に出てMacを持ち寄ってハッカソンしてるのに。泊まり込みでプログラミングしたりしてるのに。なんで僕は、fgetsすらマトモに使えず、getsとscanfだけであなたの名前を入力してください オマンコ オマンコさん、こんにちは!みたいなプログラムしか書けないんだ。
大学四回生になった。研究室を選択する必要があったがしなかった。しないでは困るとのことで、適当に書いたらその一番上に配属された。でも一切研究せず、下宿に引きこもって何もしないをした。今日の輪講はここまで進みました!という報告が毎週回ってくるが、まるで研究室では日本語でなくアラビア語が公用語になっているのではないかと思えるぐらいの光景だった。この頃、近所の人の証言によれば、言動がおかしく、訪ねてきた人に暴言で返し、殺す殺すなどの声が聞こえ、時折モノを投げつける音が聞こえたりしたそうだ。まあよく知らない。僕は普通に何もせずぼんやりネットを見ていただけのような気がするけど。
それからしばらく経った。
結局僕は中退した。そして別の大学に入り直した。今度は、工学じゃない別の場所に。みんなキーボードの文字を読みながら指先でキーを叩いている。安心する光景だった。僕らはプログラミングを習わなくてもいい。これから習う必要も無い。タッチタイピングだって、できるに超したことはないだろうけど、できなくてもいい。ただ、そこにある便利なモノを使えば良いだけなのだ。Chromeを使っていて、うっかり開発者向けコンソールを開いてしまっても、何も分からなかったことにして閉じて良いのだ。きっとマクロを書けば、楽ちんに勝手にやってくれるような作業を、人の手で何度もやる。それでいいんだ。マクロを考えるために必死になる必要なんか無い。マウスで右クリック、コピー、ペースト。それでいいのだ。キーバインドすら覚えなくて良い。メモ帳を使ってもいい。viやEmacsのキーバインドを覚えなくてもいい。マウスも使えないようなエディタと格闘する必要は無い。Macを買っても、XCodeやportsを入れる必要は無い。iTunesでiPhoneを同期させて、音楽を聴くだけでいいんだ。
僕はもうプログラミングしないでいいんだ。
それが分かったとき、全てから解放されたような気がした。僕を苦しめ続けたプログラミングというものは消えてなくなった。パソコンでやる作業は、昔と一緒、匿名掲示板にオマンコと書き込むだけだ。それ以上のことをしなくてもいいんだ。勉強会に出てハッカソンする必要は無いんだ。プログラミングスキルを錬磨しないと死ぬなんてのはウソだったんだ。美しいコードを書かないと天罰が下るというのはウソだったんだ。毎日毎日はてブのホッテントリを見てると、プログラミングでマスターしなければならないこと、何何する方法、開発者必須スキル、便利ツール、Macでのアプリ開発、セキュリティ、通信、データベース、勉強会、ハッカソン、そういうもので溢れている。苦しくないのか不思議で仕方ない。もちろんプログラミングをしていて楽しい人もいるんだろう。けれど、僕みたいに、プログラミングという行為が苦痛で苦痛で苦痛でしかない人もいる。たとえ1000回の同じ操作でも、人力でやる方がマクロを書くよりも楽だという人も、ここに存在するのだ。そしてそのような人の存在も当たり前に肯定されるのだ。みんな苦しまなくて良いんだ。誰かが勝手にやってくれればいい。できる人にお金を渡して、僕らはそれを享受するだけで良いのだ。ここでプログラミングという言葉を連呼したけれど、コーディングという言葉との違いとか、そういうのを気にするような人とおつきあいする必要は無いのだ。いずれプログラミングは必須スキルになるとか言われて何年も何年も苦しみ続けてきた。けれど、そんなことをする必要は無いんだ。
それでぶっちゃけここからが本番なんだが、十代でなんとかしないと、という焦りはこないだの青木君の小四なりすましの話に似ている。僕もそうだった。僕らの世代だと登大遊氏なんかが結構輝いてて、ああいう感じにならなきゃ、と思っていた節はある。十代の時になにか成し遂げないといけない、そのためには誰かに認めてもらわなければならないという焦りは、どれくらいの「大人」に理解してもらえることなのだろうか?誰かの承認を得たいという承認欲求を、同じ世代の誰かを使って満たすことができず、むしろ同じ世代の誰かを一緒に引き連れて、承認欲求を満たしてくれる「教祖」にすがりつく。NPOの大学生が「承認」を欲し、政治家が「承認」を与えているのだ。AO入試用の作文?図?みたいなものも見かけたが、「私はリーダーシップがあります!」とか実にくだらないことしか書いていない。しかしそういうものでさえ、学生団体とやらは「承認」してくれる。結局、オウム真理教が丸ごと開けたポジションに、バラックが建ち並び闇市が行われていて、コミュニケーションで自然と得られるはずの承認欲求が、法外な札束で取引されている、そんな感じのような気がする。
意外にブクマが増えていた。PC-8001は俺が産まれる前に買われたもので、ずっとオブジェだったのだ。動くかどうかもわからない。テレビに接続するコードがなかったから。
発祥: http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/
Scheme という Lisp 語族の言語を用いて ℃-ute の相関関係をプログラムし、様々な角度から関係性を分析する手法を紹介していきます(ソースコードは最後に張ります)。
まずは、メンバー間の関係を「リスト」というデータ型で表現します。例えば「栞菜->愛理」という関係は
(kanna . airi)
という形で表すことができます。これに、「大好き」という情報を付加し、ついでにその関係の性質を数値化したものを加えると
((kanna . airi) (desc "大好き") (score . 1))
のようになり、関係図における一つの矢印の情報をデータ化できたことになります(暫定的に、好意は 1、良好・中立は 0、険悪は -1 の3段階で表すことにします)。
メンバー間の全ての関係性をこのデータ単位で定義し、データベース化しておくことで、色んな条件に基づいた検索やスコア計算などが可能となります。
ここで相関関係図における矢印を「リンク」と呼ぶことにして、あるメンバーから他のメンバーへどのようにリンクし、またリンクされているかを調べることができます。
(sort-nodes (number-list (from-links)))
結果:
((kanna . 6) (saki . 5) (maimi . 4) (erika . 3) (mai . 3) (chisato . 3) (airi . 2))
栞菜ちゃんがメンバー全員にリンクを張っていることが分かり、℃-ute ラブっぷりが伺えます。なっきーにも同様の事が言えます。例の「女の子が好き」発言を数値的に裏付ける結果と言えるかもしれません。
ただ、データ不足でリンク件数がまだ少ないのと、リンクの性質(好意/反感など)までは分からない点を考慮する必要があるでしょう。
同様に、リンクの終点の件数を調べてみます。
(sort-nodes (number-list (to-links)))
((chisato . 5) (erika . 5) (kanna . 4) (maimi . 4) (airi . 4) (mai . 3) (saki . 1))
えりかちゃんと千聖ちゃんが高ポイントです。メンバーからの人気や注目度の高さを示すデータですが、千聖ちゃんの場合敵対的なリンクが2件含まれている点に注意してください。
なっきーの被リンク数が極端に少ないですが、単純にデータ不足のためだと思われます。はぶら(ryとか言わないようにお願いします。
リンクに付随するスコアを計算することで、愛情の度合いを測ることができるのではないか、という考えに基づく研究です。
まず、全ての関係性を対象として、スコアがマイナスの関係を抽出してみます。
(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))
まいまいとえりかちゃんが特に堅い・一途だという傾向を読み取ることができます。
今度は組み合わせ(カップリング)の評価です。
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))
となります。若干ピンとこない部分もあるかも知れませんが、計算上は矛盾無くデータの内容を表しています。
(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)のスコアの概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。