はてなキーワード: lsとは
●便利なシチュエーション
『dir /b *.* > file_list.txt』を実行
拡張子の指定で「特定拡張子のファイルのみ」、または「拡張子は異なるが同じファイル名」の一覧も作成可能。
ソフトのインストールも不要で使用環境を選ばない。最強。ただしソートには別途エクセルが必要。
重複ファイルの検索も可能
フォルダ以下のファイル一覧が作成可能。MP3のアルバムを、ZIP圧縮ではなく1フォルダ1アルバムで管理している際に便利
ほんとにもう最高。
楽したい人間+ハマり性な人間には、こーゆーカスタマイズがしがし出来るツールが最高なのよ。
エディタならvim。emacsでもいいけど、あんまり詳しくない。
他のツールはカスタマイズ性で見劣りする。
こだわりのない人間にはどんなツールでもオッケーなんだろうね。
オレはこだわるところはこだわる。
ちょっとした不便に気づかないか気づいても甘受してしまうような人間と、今はクリアできなくともなんとか今後の課題にしたいと考える人間。
そこの違いだね。
どっちが得かというのはわからんけどね。
優劣とか損得の問題じゃなく、ただオレはそういう人種だってこと。
追記
vimperatorrcねえ。特筆すべき点はないけど、あえて一部抜粋すれば、こんな感じ。
inoremap <C-1> <Esc>1gt inoremap <C-2> <Esc>2gt inoremap <C-3> <Esc>3gt inoremap <C-4> <Esc>4gt inoremap <C-5> <Esc>5gt inoremap <C-6> <Esc>6gt inoremap <C-7> <Esc>7gt inoremap <C-8> <Esc>8gt inoremap <C-9> <Esc>9gt noremap <BS> H noremap <S-BS> L noremap ,b <Esc>:bmarks -tags= noremap u :o<Space> " ldrc+ldrでoで:open出来ない問題を解決
" wildoptions=auto時に一瞬補完が表示されてウザいmapがある - Dis Communication - 符号無し " http://unsigned.g.hatena.ne.jp/Trapezoid/20080620/1213961754 javascript <<EOM [ [',a',':dialog addbookmark'], [',c',':viewSBMComments -t h'], [',C',':viewSBMComments -t hdl'], [',d',':pindownload'], [',ld',':set ldrc'], [',p',':mb clear-pin'], [',q',':toggleldrc'], [',R',':so ~/_vimperatorrc'], [',r',':res'], [',v',':!vim ~/_vimperatorrc'], ['\\s',':scrapbook'], ['\\S',':scrap'], ['\\f',':firebug'], ['\\d',':dialog downloads'], ['\\p',':tabopen chrome://browser/content/places/places.xul'], ['!',':set invum'], ['B',':ls!'], ['\\a',':addons'], ['\\e',':errorconsole'], ['\\F',':firebugwindow'], ['\\d',':dialog downloads'], ['\\g',':oepnGMpanel'], ['\\G',':toggleGM'], ['e',':note'], ['<F11>',':fullscreen'], ['\\P',':placesnewwin'], ['\\H',':historynewwin'], ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ['<C-l>',':addtoldr'], ['<C-S-Right>',':removerighttabs'], ['<C-S-Tab>',':previousfirebugtab'], [',o',':openselectedlinks'], [',3',':copy titleAndURL'], [',ig',':imageGet'], [',io',':imageOpen'], ['w',':submit'], [',lo',':logout'], // nicontroller.js [',ni',':nicoinfo'], [',np',':nicopause'], [',nm',':nicomute'], [',nv',':nicommentvisible'], [',nz',':nicosize'], [',ns',':nicoseek'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.NORMAL], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM javascript <<EOM [ ['<C-j>',':togglebookmarksidebar'], ['<C-k>',':togglehistorysidebar'], ].forEach(function([key,command]){ liberator.mappings.addUserMap([liberator.modes.INSERT], [key], "User defined mapping", function () { liberator.execute(command); }, {rhs: key, noremap: true}); }); EOM
javascript <<EOM // nicontroller.js plugin // [N]- // N 秒前にシークする。 // 指定なしの場合 10 秒前。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['-'], 'seek by count backward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + '-' + count); }, { flags: liberator.Mappings.flags.COUNT } ); // [N]+ // N 秒後にシークする。 // 指定なしの場合 10 秒後。 liberator.mappings.addUserMap( [liberator.modes.NORMAL], ['+'], 'seek by count forward', function(count) { if(count === -1) count = 10; liberator.execute(':nicoseek! ' + count); }, { flags: liberator.Mappings.flags.COUNT } ); EOM
Vimperatorで;bでリンクを新しいバックグラウンドのタブに開くようにする。
http://anond.hatelabo.jp/20080709195527
も俺の仕業なんだけど、これvimperator本体に実装してくれないかな。
気になる点・これからの課題
窓の杜 - 【NEWS】Firefox 3のスマートロケーションバーに対応した「XUL/Migemo」
http://www.forest.impress.co.jp/article/2008/07/07/xulmigemo0105.html
余談
Index of /
http://vimperator.driftaway.org/
に上がるのはたいてい朝の07:30になっているので、いつからかチェックするのが朝の習慣になった。
http://twitter.com/tsuda/statuses/850434927
http://d.hatena.ne.jp/magoshin/20080704#p1
ハゲ言われたおっさんです。
童話の「はだかの王様」って、せいぜい数百人の国民の前で、子供一人から「王様は裸」って言われただけじゃない?
こっちは10000人+2000人の前で、何十人から「おっさん」「ハゲ」呼ばわりされて、2000人から大笑いされたんだから、
これは王様より凄いんじゃね、と思う。
このリアルタイム性&匿名性を持った告発者の発言、実際に受けてみると、
率直に言ってかなり面白い。
別に強がりとか自虐とかでなくて。だって、考えてみてよ、可視化された率直な感想の、リアルタイムな集合体を、
芸能人や政治家みたいな有名人ではなく一般市民の立場で世界初で見ることが出来たんだよ。
パラダイムシフトが起きた瞬間を体験出来た人間が、世界中にどれだけ居ると思う? そのパラダイムシフトを
体感出来たのは、世界でオレだけだと思うし、実際のところ見てて自分でも面白がれた。
…精神弱い人がこれを食らっても大丈夫か、という意見に対しては、正直わからんね。引き篭もったり首吊ったりする
可能性も否定出来ない。
だけど、この流れが止まったり逆流するかって考えれば、多分それはない。
携帯電話が当たり前になったように、こういう、善意悪意を問わない率直な意見の可視化の流れも、
そのうち当たり前になるんじゃないかな。
最後に一言。
まだ34歳なんだから、おっさん呼ばわり勘弁な。
(7/7 12:05 追記)
# 編集出来るの知りませんでした…。別立てしないで追記すれば良かった。
いまのところ、自分が書いたのは
http://anond.hatelabo.jp/20080706112744
http://anond.hatelabo.jp/20080706185812
http://anond.hatelabo.jp/20080706190131
の3つだけです。…実は本人じゃない、の増田は見た時「頭良いな」と思いました。
顔も声もバレているのに匿名のままで頑張っている理由は、単純に
「会社休んで遊びに行ってるのが、会社にバレたらヤだなぁ」というそれだけの話です。
ハゲ頭の写真を撮ってはてな日記にアップして、見ている人が「確かにこのハゲ具合は、
まさしくハゲのおっさんと一緒だ」…って、どこのガラスの靴試し履きしてるシンデレラですか?(笑)
とりあえず、ニコニコ動画の連絡フォームを使って連絡をして、ハゲのおっさん=増田=私であり、
私しか知らない&当日の動画を再生して見れば確認出来る出来事を伝えてみました。
上手く行けばニコニコ動画さんの方で本人認定してくれるのではないかな? と思っています。
無駄に騒動を起こした、という事は否定出来ませんが、自分としては良い『紛れの一手』が打てた
のではないかな、と思っています。
自分の想像の域を出ませんが、自分が増田で一言を書かなかったら、ニコニコ大会議の質疑応答の
感想は「あれはイジメだ」「魔女裁判だ」「対象者が嫌がる事を絶対にするな」といった、一方向の流れに
行ってしまったのではないでしょうか。
自分の一言で、感想をいう人から「本人か騙りかに関係なく」とか「本人がどう思おうとも」といった
マクラを引き出せたり、また参加していた人から「あの場の雰囲気はそんなに悪くなかったよ」
といった感想も引き出せたと考えています。
(逆に、自分以外に質問された4名の方々の意見を言う機会を塞いでしまったかもしれませんが…)
(7/9 1:10追記)
ハゲのおっさん(34歳独身)です。
なんとか本人証明が出来たので、そろそろ幕引きをした方が有終の美を飾れるかな、と思っています。大きな変化とか、あまりにも反論したくなるコメントとかが出ない限り、ハゲのおっさんとしての増田の書き込みは今回で終了と致します。
日曜からずっとはてなブックマークを辿って、ブックマークから見えるBlogは全部見たはずです。
…えーと、どうやら私は12000人からDisられても平然としてるdankogaiさんみたいなマッチョで、涙こらえて笑顔で道化やってる『いじめられっ子』ならぬ『いじられっ子』で、イジメのせいで精神分裂起こしかけてるビリーミリガンで、祭りの場で舞い上がったお調子者で、聞かれもしない感想を言う出しゃばりで、ついでに「私はハゲです」Tシャツを着て都会を歩いている人、らしいです。…凄いな、ハゲ言われた感想を書いたら、ここまで言われなきゃならんのか(笑)。
Blogやコメントを書かれる方々の多くの人は「あれはイジメ」と考えていて、なのに、12000人からハゲと笑われたハゲのおっさんは暢気にも「これは空気読みのパラダイムシフトやーー(彦麻呂の口調で)」なんて言っているので、その乖離を解消する為にハゲのおっさんを自分側から排除した部外者として処理しているのかな? と思っています。
色々と個別に意見とか反論をしたいBlogとかありましたが、ハゲのおっさん7日間戦争 - ls@usada’s Backyard( http://d.hatena.ne.jp/shibata616/20080708/1215510163 )
を読んだらどうでも良くなりました。こういう文才が欲しいです。
最後に、ここだけは気になったので。
ニコニコ大会議で行われた「リアルタイム中傷」( http://www.itmedia.co.jp/news/articles/0807/07/news096.html )
> ハゲと書かれた人は、しばらく声を失っていたところを、ひろゆき氏がフォロー。
> 中傷コメントに対して自重するよう書き込むユーザーも多かった。本人もそれほど気にしていなかったのか、その後元気に質問をしていてほっとした。
声を失ってたワケじゃないです。MP3聞いただけだとその場の状況分かりづらいですけど、この時は笑い声が上がってもずっと続けて話してたのですが、笑い声が大きくなりすぎてマイク通しても聞こえないくらいになったので、ひろゆきが一旦声かけて「もう一度初めからお願いします」っていう流れになったんです。で、皆が静まるまでハゲ頭に手置いて林家三平のマネして時間潰して、それから話し直しただけで、別段あの程度でうろたえる程でも無かったですよ。
繰り返しになりますが、今回は楽しませて頂きました。次回のββの大会議もあったら出席出来ればと思っています。
(12/3 1:20追記)
ハゲのおっさん(35歳独身)です。ニコニコ大会議2008冬の招待に当たりましたので会社休んで参加する予定です。早めに行って並んでいますので、お気軽にお声をかけて頂ければ幸いです。
反応してくれた人がイター!
ちょっと嬉しい。
> 別にrubyでもsedでも良いけど、正規表現で問題なくパース出来るんじゃない?
毎回正規表現考えるのも面倒かなーとかとか。
> 位置あわせでよいのかな?ほかにある?
理想を語ると出力形式指定できれば最強だなーとか妄想してた。
--output-style "[%p<>%u<>%g<>%s] %n"
とすると
| |-- [-rw-r--r--<>hoge<>hoge<>9108] HTTP_BAD_GATEWAY.html.var
みたいな。
別にコマンド的である必要はまったくないっす。
> # tree -pugs | perl -e '@line=<>; $max=(sort map {/(.*?)\[/; length($1)} @line)[0]; map {s/(.*?)\[/$1 . " "x($max-length($1))."\["/e} @line; print @line'
実行してみたら出力に変化がなかった。アルェー?
何にせよPerlじゃね?ってのは超同意。
とかく出力形式を指定できたら便利だなーと。
この手のディレクトリ状況調べて提出してちょ、みたいな要求はちらほらあるのですよ。
付け加えると、CSVで出してちょーみたいな要求の場合はfindとかlsとかgrepとかその辺組み合わせてどうにでもなる感じです。
http://anond.hatelabo.jp/20080323175904
半年前に「人月計算とExcelとスーツの世界より」を書いた増田だけど、この増田が他人に思えなかったので、半年ぶりに自分の話をしたいと思う。
半年前のエントリの内容、読んでない・読むのたるいって人のために簡単にまとめておく。
俺はCOBOLっていう昔々の言語を使って巨大な金融システムのお守りをしていた。それは誇らしい仕事(「これ読んで「転職考えろ」とか言ってるやつってアホだろ」的な意味で。これももっともな話だよね)ではあるんだろうけど、俺はやっぱりキャッチーな新技術がやりたくてたまらない。
そんなふうに増田に愚痴ったところ、なんか400以上のブクマがついた。以上がこれまでのあらすじ。
話の続きを始める。
あれほどのブクマを集めたことなど初めてだった。戸惑いながらも、日々増えていく皆のコメントを噛み締めた。
転職を勧めるコメントもついていた。うん、転職したいねいつかは。
でも、と半年前の俺は思った。そう簡単に転職できるものなのか? なにしろまだ会社に入って1年半。勿論今の会社にいても転職後に活かせるスキルがつくわけではないが、その前に個人で勉強できることもあるだろう。それからでも……っつーかそもそもスキル皆無なのに転職とか無理だろ。
だから、出来心だった。
エントリを書いてからいくらか経った頃、ホッテントリにもよく上がってくる某ブログに、プログラマ求人のお知らせが出た。
そこからはクリックひとつだ。あのエントリを短く要約してそこの会社に送りつけてみた。たいした作業ではない。転職への一歩を踏み出したという気持ちはあまりなかった。
でも当然ながら、先方からは連絡がきた。言われるまま、翌週の金曜日に会社を定時で上がってから面接に行った。いきなり社長が出てきて驚いた。
面接が始まった。キョドりながら、あのエントリの内容をまた繰り返した。
「うん。熱意は分かったけど……COBOLかー」
「そうかー、ちょっと評価しづらいなー。PHPって分かる?」
「えっと……Webのビューとかに使うスクリプト言語でしたっけ?」
「他にも色々できるんだけどね。それ使って、ちょっと今から言うようなの作ってみてよ」
帰りがけに書店でPHPの入門書を買って、言われたプログラムを週末使って作ってみた。
formに書いた内容を日付やUserAgentとともにファイルに書き込んで表示するとか、その程度の簡単なものだ。PHPでファイルの読み書きができるとすら知らなかった俺でも、土曜だけで作れた。
日曜が余ったので仕様を拡張してSNSのメッセージ機能もどきに仕立て上げたりはしたけど、この程度のアピールはちょっとでも熱意のある奴なら誰でもやるだろう。
どちらにせよ大したものじゃない。
翌週、採用の通知が届いた。
俺の転職活動は2週間で終わった。
面接のとき社長が言っていた。技術的な向上心をもって受けてくる人は珍しいらしい。
意外だった。だってホッテントリでもよく見かける会社だぞ。そんな会社がわざわざ、ブログで求人までしているんだぞ。
ブログで就職とかTwitterで就職とか、いつも華々しく話題になるあれは何だというのだ。
社長の言葉がリップサービスでなかったのは、正真正銘素人にも劣るレベルの俺が、この少数精鋭で構成される会社に、おそらく志望動機だけで、あっさりと採用されてしまったことから分かる。言っておくが大量採用ではない。求人経由での採用は俺一人だった。
現実はこんなものなのだ。
そんなこんなで、あまりに展開が早すぎて事後報告になってしまったが、転職を決めたことを会社に話した。
そんな中で、印象に残ったやりとりについて書いておきたい。
まず、他部署の人。
「勿体無い! 本当に勿体無い!」と彼は俺に詰め寄った。
「前、会社のイントラに君の作ったツールをアップしてただろ? その時からずっと、こいつと一緒に仕事できたらって思ってたのに」
技術より業務知識、巨大な金融システムを今までどおり動かし続けることを最大の目的とするこの会社では、ITを活用してプロセスを効率化しようという意欲を持つ人は多くない。
彼はそんな中で、VBやJavaの知識を蓄えて、プロセスをもっと良くしていきたいと願う人だった。だけど、
「いくら俺が呼びかけても、誰も興味を持たない。ツールを作っても使われなくて無駄に終わることもある。本当は俺も転職を選べるんなら選びたい。でも、俺の道はこれしかない」
彼は妻子持ちだった。生活のために、今の仕事を辞めるわけにはいかないのだ。
一方俺は、家庭を背負っていない今だからこそ好きな道を選べた。その俺が羨ましいと、彼は言った。
こういう環境に留まらざるをえない人がいることを、それでも戦っている人がいることを、俺は心に留めておきたい。
それから、とある同期。
彼は同期仲間の中でも飛びぬけて優秀な奴だった。
何をやらせてもまず成功する、万能型の秀才だ。元増田にイメージが被る。
技術力があり、コミュニケーション力もあり、ついでに顔もよかった。そして、この会社では珍しく、技術志向を持つ奴だった。
研修時代にも技術をやりたいと度々公言していた彼だが、こういう優秀な奴を会社が放っておくわけがない。配属先では協力会社への指示や客先とのやりとりに追われる日々が待っていた。
そんな中で彼は思っていた。この会社にいる限り、技術的なことをやることはできない。いつか転職したいと、彼も望んでいたらしい。だから、
「転職するって聞いたとき、やられたって思った」
やられた? 何故か。それは彼の迷いのせいだ。
「最初は別の仕事がやりたいと思ってたよ。でも仕事が分かってくると、これが面白く感じてくるんだ。俺がこのシステムを把握してるんだ、俺がシステムを回してるんだっていうのは充実してて、このままでもいいかなって思えてくるんだ」
万能だからこその迷い。
IT業界(SIer)の未来や、汎用的でないスキルばかり身に着けることの問題も彼はよくわかっている。でも、今の会社はビジネス的にも安定していて、当面は抜け出す意味がないというのも事実なのだ。
俺の場合、プログラミングのセンスはあっても運用やPMなんてとてもできない。偏っているから転職を決断することができた。でも彼には、金融システムのSEという仕事が適職すぎた。
半年後の今も、彼とはしばしば話をしている。
彼の答えは、まだ出ていない。
最後に、上司。
彼女は、完璧な検証や客先での要求詰めで皆の尊敬を集めるキャリアウーマンだ。
その上司が、俺が最後に出社する日、目に涙を溜めていた。
「ごめんね、雑用みたいな細かい仕事ばかり渡しちゃってたし、忙しくてあまり見てあげられてなかった。そのせいでこんなことになって。後悔してる。本当にごめんなさい」
違うんだ。そういうことじゃないんだ。あなたのせいじゃない。
俺はただ、仕事のスキルをそのまま使って、Twitterの@発言を抽出してクラスタを可視化してニヤニヤしたり、ニコニコに上がった新着ボーカロイド曲を自動処理でiPodに入れてみっくみくになりたいから転職するだけなんだ。
そんな趣旨のことを言葉を選んで伝えたけど、たぶん彼女には伝わらなかっただろうと思う。
俺や、はてなで色々言っているような技術系の奴らは、世の中では特殊な人間で、普通の人にはなかなか理解できない。
壁は厚い。そう思った。
そんな諸々の出来事を経て、俺は今、憧れのWebプログラミングの職場にいる。
Linuxのlsコマンドすら分からなかった俺には、毎日が学ぶことだらけだ。毎日終電だし、まだ休日出社はないけど、もうちょっと俺がまともに仕事できるようになったらそういう状況は確実に待っている。
だけど、すごく楽しい。仕事のために得る知識がすべて、自分の生活と地続きになっている。人生のベクトルと仕事のベクトルが噛み合ってるから、俺は成長している実感を持ててる。
だから、きっと俺はこの先ずっとこの会社で頑張れると思う。
ところで、
について一言。
Web系やりたいって半年前から言ってて、そして実際やってみたら超楽しんでる、そんな俺でもこれは同じですよ。
やっぱりはてブの[あとで読む]は日々溜まっていくし、これ全然業務とかかわりなさそうだって技術だとイマイチ乗れない。
転職決まってからの半年も同じだった。半年前、「転職するなら自分でスキルつけてから」って思って転職活動先延ばしにしていたら、たぶんいまだにApacheって何?って状態だっただろう。
だってプログラミングの他にもやりたい趣味はあるし。別の仕事やりながら勉強するには、この世界は広すぎるし孤独すぎるし何から手をつけていいのかわからない。
確かに、はてな見てて熱浮かされるだけってことは、人生かけて技術を追いかけるクレイジーなギークでないことの証左ではある。
でも、そこから情熱が継続しないからっていって、仕事として楽しめる程度に技術を追いかけていけるギークではないことは意味していない。わかりにくいな。つまり、はてな見てて熱浮かされる程度にはギークであるとは言える。だって楽しくないなら見ないじゃんそんな記事。
だから、そこをもってプログラマとしてやってけるかどうかの疑問を抱く必要はないと思った。
そういう意図で書いてるわけじゃないならいいけど。ていうか一言じゃないなこれ。
やたら長くなったけど、俺の転職の話は、大体そんな感じ。
あと、転職を通じて実感したのは、楽しい仕事をするのが一番楽しいよねってこと。
頭悪いこと言ってる気がするけど、これが俺の結論です。
Objective Camlを使ってみたよ!
問3はわからなかった!
let rec map f ls = match ls with hd::tl -> f hd (map f tl) | [] -> 0 in let plus x y= x + y in let rec iter f n ls= match ls with hd::tl -> (iter f (f n hd) tl) | _ -> n in let biggest ls= match ls with hd::tl -> iter (fun x y -> if x > y then x else y) hd tl | _ -> assert false in print_int(map plus [1; 4; 5]); print_int(biggest [1; 4; 32; 523; 453; 23;])
発祥: 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)のスコアの概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。
http://anond.hatelabo.jp/20070508170219 こいつをアセンブラで書こうとしていたが、
すでに
http://anond.hatelabo.jp/20070510170511 にそれっぽいものが書かれていた。
しかしデクリメントした直後に判定するならフラグですむがそうじゃないときはtest命令入れないといけないのでうまくいかんと思った。
とりあえず8086アセンブラで書いてみたが長くなったので実行ファイル(fizzbuzz.com)をBase64で下に書いておくよ。
~) ls -al fizzbuzz.com -a--rwx 98 May 11 03:28 fizzbuzz.com* ~) base64 < fizzbuzz.com uwUDuQoJvl0B/s91ErcD/st1BrpSAesOkLpLAesWkP7LdQi6VgGzBesKkLg6OivBiQSL1rQJzSH+ zXXNtQr+yXXHulYBzSG0TM0hRml6eg0KJEZpenpCdXp6DQokVU0NCiQ=
数字の表示の処理で10で割った余りを使っていたのでまずいと思って修正した。ついでに98バイトまで縮めてみた。
こんなことに時間を使っている俺はバカだ。
ソースも載せとこう。8086なんてほとんど初めてに等しいので汚いだろうけど。
CODE SEGMENT ASSUME CS:CODE,DS:CODE ORG 100H START: mov bx, 0305h mov cx, 090Ah mov si, OFFSET NUM LOOP: dec bh jnz skip1 ; 3の倍数だった mov bh, 3 dec bl jnz skip2 ; 3の倍数で5の倍数だった mov dx, OFFSET FIZZBUZZ jmp loop5 skip2: ; 3の倍数で5の倍数じゃなかった mov dx, OFFSET FIZZ jmp loopend skip1: ; 3の倍数じゃないとき dec bl jnz skip3 ; 3の倍数じゃなくて5の倍数だった mov dx, OFFSET BUZZ loop5: mov bl, 5 jmp loopend skip3: ; 3の倍数じゃなくて5の倍数でもなかった ; 数字を表示する。2桁でいい mov ax, 3A3Ah sub ax, cx mov [si],ax mov dx, si loopend: mov ah,9 int 21h dec ch jne loop mov ch,10 dec cl jne loop ; 最後のBuzzを表示する mov dx, OFFSET BUZZ int 21h mov ax, 4c00H int 21h FIZZ: DB 'Fizz', 0dh, 0ah, '$' FIZZBUZZ: DB 'Fizz' BUZZ: DB 'Buzz', 0dh, 0ah, '$' NUM: DB 'UM', 0dh, 0ah, '$' CODE ENDS END START