はてなキーワード: ソースコードとは
唐突にClass::Data::Inheritableのソースコードについて説明してやんよ。
使い方とかの説明はこの辺でも読んでから出直して来い、ごるぁ!
まぁとりあえずソース見てみろ、下記にはっつけてやっからよぉ!
1: package Class::Data::Inheritable; 2: 3: use strict qw(vars subs); 4: use vars qw($VERSION); 6: $VERSION = '0.06'; 7: 8: sub mk_classdata { 9: my ($declaredclass, $attribute, $data) = @_; 10: 11: if( ref $declaredclass ) { 12: require Carp; 13: Carp::croak("mk_classdata() is a class method, not an object method"); 14: } 15: 16: my $accessor = sub { 17: my $wantclass = ref($_[0]) || $_[0]; 18: 19: return $wantclass->mk_classdata($attribute)->(@_) 20: if @_>1 && $wantclass ne $declaredclass; 21: 22: $data = $_[1] if @_>1; 23: return $data; 24: }; 25: 26: my $alias = "_${attribute}_accessor"; 27: *{$declaredclass.'::'.$attribute} = $accessor; 28: *{$declaredclass.'::'.$alias} = $accessor; 29: } 30: 31: 1;
短いソースだなーこれ。でもな、なめんじゃねーぞ。短いけど色々な技術が盛り込まれてんだよコレはよぉ。
ハイ、まず3行目。
かるくstrictについて説明してやんよ。心して聞けよオマエラ。
strictっつーのはだな、つまりPerlにおける曖昧な部分をすこーしだけチェックしてくれるスグレモノなんだなコレが。
とりあえずざっくり言うと三つの機能があってだな、下記のよーに書くわけだ。
use strict 'vars'; use strict 'subs'; use strict 'refs';
varsってーのは簡単に言うとmyとかourとか宣言しろボケってやつですわ。
subsは裸体は許さんってやつですの、$とか%とかついていない裸の文字列をエラーにしてくれんだよ。
refsってのが一番やっかいな代物でな、これはムツカシイ言葉で言うとシンボリックリファレンスってんだが、要は変数名に変数を使うとエラーにしてくれるってこったよ。
で、これら全部ひっくるめてuse strict;なんだな。わかったか?オラ!
ちゅーことはだ、3行目を見ると意図的にrefsだけ外してるのがわかるよな。
つまりコレはこのコードのどこかで変数名に変数を使うってことを明示していることにもなるわけだ。けけけ。
あーもういいもういい、次だ、次。
4,5行目を見てみろよ。今時our使わずにuse vars使うなんてどんだけー。
ははは、まぁまてよ。
ourってのは明示的にグローバル変数を定義するもんなんだが、このourってやつが導入されたのがPerl5.6からなんだよ。
Perl5.5のころはourなんてなかったからグローバル変数定義すんのにこのuse varsを使っていたわけだ。
つまりこのモジュールはPerl5.5環境でも動くように配慮しているわけなんだな、ちゃんちゃん。ほほほ。
あーもう全然すすまねーよ。チクショウ、が、ま・・・・。
で、11-14行目。これはref関数使って$declaredclassがオブジェクトだったら死ぬって処理だ。
require CarpっつーのはCarpモジュールを動的にロードしてるっていうことだよぅ。
で、Carp::croak関数使ってエラー文はいて死ぬ、と。ちなみにこのCarp::croakってはまぁdie関数みたいなもんなんだ。
違いとしてはエラーの発生した原因を呼び出し元の奴のせいにして自分は悪くないんだよってアピールすることかな。まぁ実際使ってみりゃわかるよ。
さぁ、16行目。本編突入だ。長かった。長い道のりだったなお前ら。
sub {}ってのは無名サブルーチン(関数のリファレンス)ってやつだ。で、ここで注目すべき点はただひとつ!!!!!
19-23行目あたりをぼーっとみてると$declaredclass, $attribute, $dataっていう変数を使用していることがわかる。
これらの変数は9行目で受け取ったmk_classdataへの引数だ。
ここで問題が発生する。
myで宣言された変数の賞味期限はスコープの終端だ。それはわかるな?
つまり9行目で宣言された$declaredclass, $attribute, $dataといった変数どもは29行目のスコープの終端で消滅してしまうわけだ。
しかし!その消えてしまうはずの変数どもをsub {}という無名サブルーチンの中で使用してしまっている!!!
これが世間一般に語られているクロージャという仕組みなのだ!!!!!!うはははははははh!!!
本来生涯をまっとうするはずだった変数たちが別のサブルーチンの中にまぎれてしまうとその別のサブルーチンが消えてなくなるまでは死ぬことを許されなくなるのである!!!ざ・不☆老☆不☆死!
なんたる奇妙奇天烈なことであるが、この現実を受け入れることによってお前らの道が開けるんだ!!!すげーだろぉがよぉ!!
ボクはッ、キミがッ、クロージャを受け入れるまでッ、殴るのをやめないッ!
さて、肝心の16-24行目のアクセサ部分の処理の解説だけども、
引数が渡されてなければ特になんの処理もせずに$dataを返している。$dataってのは死ぬことを許されなくなったカワイソウな変数君だ。
つまり、Class::Data::Inheritableってやつはアクセサに渡された値をどこで保存してるのかというと、紛れも無いこの$data君に他ならない。
$data君がニート君になっちゃうとたちまちデータの読み書きができなくなるのであまり働かせ過ぎないように注意しよーね!
ハイ、次はアクセサに引数が渡された時の処理だけどな、20行目を見てみろ。$declaredclassに格納されてる値はmk_classdataメソッドを使用したときに格納された値になる。
package Hoge; use base qw/Class::Data::Inheritable/; Hoge->mk_classdata('hoge_accessor');
つまり上記の処理で例えると、$declaredclassには'Hoge'という文字列が入ってることになんだな。
で、この'Hoge'と$wantclassに入ってる値を比較しているわけだが、
package Hoge; use base qw/Class::Data::Inheritable/; Hoge->mk_classdata('hoge_accessor'); Hoge->hoge_accessor('aaa');
上記の処理で例えると$wantclassには$declaredclassと同じく'Hoge'が入ってくることになんだな。うっひょー。
んで、20行目のif文は$wantclassと$declaredclasが違う場合にだけ19行目の処理を実行しているわけだからこの場合はスルーするわけだぁ。ひょひょひょ。
じゃあだな、$wantclassと$declaredclasが違う場合ってどんな場合?ってことだが、下記に例を示すから目ん玉引ん剥いて網膜から直接見てみろよこのボケ野郎どもが。
package Hoge; use base qw/Class::Data::Inheritable/; Hoge->mk_classdata('hoge_accessor'); package Foo; use base qw/Hoge/; Foo->hoge_accessor('bbb');
HA!HA!HA!こういう場合だよ米ベー。$wantclass=Fooで$declaredclas=Hogeになるんで19行を実行し、Fooをベースにしてmk_classdataを呼ぶことでFooに同じ名前の新たなアクセサを提供し、元クラスHogeの値を壊さないようにするわけですなぁ。
考えた人すごいですなぁ。これがClass::Data::Inheritableが継承可能なクラス変数といわれる由縁でするまする。
で、最後の26-28行目はコレらの便利な処理をしてくれる$accessorさんをクラスに登録するというわけですよぉ。
27,28行目の*ってのは型グロブ変数ってという奴で、型グロブに対して無名サブルーチンを突っ込むと動的に関数を定義できるんだなぁコレが。
でここで、初めに俺が語った話を覚えてるか?へっ、オマエラなら覚えてないだろうなけっけ。use strictの話だよ。refsだよrefs。
ここでrefsを省いていたのが利いて来るんだ。refsって何だった?ホラ言ってミソ?
で良く見てみると型グロブ変数に対して「$declaredclass.'::'.$attribute」っていう変数を使おうとしているよね?これをしたかったからrefsだけ仲間外れにしてたわけですね。
はは。
あー、あー、あー。
これで終わりだよぅ。みんなわかったかな!?
コレ読んでもわからんやつはもう死ぬか、もしくはわからん用語について死ぬほど調べてもっかい読みなおしてみろこのド低のぅッ・・・ごふんごふん、このクサレ脳みそがぁ!!!!!!!!!!!!11
数日使って思ったこと
白い白いと言われているが、おそらく問題は白の面積ではなく、明るいオレンジにあると思われる。
白さの面積で言えば、この増田も良い勝負。
前のオレンジは、オレンジでも明るさ抑えめの配色だったので、背景色にしても、
それほど違和感はなかったが、今回のオレンジは、背景色にするにはやや明るすぎの感がある。
最新アルバム、動画、ミュージックに表示される部分が、画像のみであるため、
一体全体、何のアルバム(又は動画、ミュージック)であるのか、判別つかない。
また、imgタグにalt属性でタイトルを指定しているが、alt属性はFirefoxではマウスオーバー時にポップアップ表示されないため、
title属性も付加すべきだろう。
まぁ、それよりも大人しく、文字によるタイトル表記をすべきだと思うが。
丁寧に、AdBlockでブロックされないように対策が施してある。
これは、mixiも慈善事業じゃないので、いたしかないところか・・・
たしかに横幅が広いが、ユーザースタイルシートも出回っているので、それで対応可能。
未だに古い、セキュリティホールだらけのOS、ブラウザを利用しているのは信じられない。
これを機にMacOS 9ユーザは推奨環境に移るべきであろう。
ソースコードは公開されているのだから。
端々に古いデザインが残っていたりして、統一感が欠けているので、
どうにも居心地が悪い。
1段目がユーザー全体のデータベースにアクセスする必要があるメニューで、
2段目のメニューが、現在閲覧中のユーザのデータベースにアクセスする必要があるメニューとなっている。
たしかに、開発側からしてみると、このようになってしまうのかもしれないが、同じような項目が並んでいるので、
ユーザにとっては一見して分からない、失敗したユーザーインタフェースといえよう。
しかし、メニューの項目が1つしかないのは、何かのジョーク?
僕は組み込み系システムエンジニアなのだけど、自分の業務改善作業がとても好きだ。
キーボードを自腹で買い換えたり、メモリを自腹で増設したり、いろんなツール導入したり、GTD導入したり、職場にwiki導入してみたり、デュアルディスプレイを自腹で構築したり、仕様書とソースコードをPerlやRubyで出力して同時出力したりなど色々業務環境を改善してきた。
自分の開発環境をより開発しやすく、自分の開発工程をより完成度を高くしていく作業はとても楽しい。そういう記事を読むのもかなり好きだ。
でもずっと前からやりたいけどやれないことがある。それはペアプログラミングだ。
理由はペアプログラミングという業務改善作業には、それに賛同してくれる相手が必要で、今この職場には賛同相手は一人もいないからだ。僕の拙い説明では、「どうもペアプログラミングは悪くないらしい」ということが伝わらない。「そんなチャレンジしてる暇があれば目の前の仕事しなよ」と言われてしまう。きっと僕がペアプログラミング未経験者だからうまく説明できないというのもあると思うのだけど。
でも多分、ペアプログラミングは、「コミュニケーション不足になりがち」というIT業務の本質的な欠陥を補い得るかなり根本的な業務改善だと思う。だけど、それでも出来ない。賛同してくれる人が職場に一人もいない。だからペアプログラミングが出来ない。
「仕様書レビュー、ソースコードレビューで十分じゃないか」そう言われてしまう。十分か、十分じゃないかなんて試してみなければわからないじゃないか。
今のところ、地道に「ペアプログラミングやりたいやりたい」とことあるごとに周りに言って回る日々をすごしています。
発祥: 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)のスコアの概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。
”「組曲『ニコニコ動画』」はニコニコ版num1000.swfだ”って声をどこぞで聞いた。
最近のニコニコになんとなーく既視感を感じてたんだけど、胸のつっかえが降りた気分。
もうホント、あのころの某巨大掲示板の某フラッシュ板で発表される作品のほとんどが「PV系」「矢印」「ユーロビート」だった気がする。もしくは公開されたソースコードを用いてのリミックス作品。
あくまで今思い出して、の話だけど。絶対的な量とかは今でも確かめようもないんだけど。
でもそれこそ今のニコニコの「歌ってみた」とは比較にならないくらいの規模だったように思えるのだ。
よく出来てるなぁ。今見てもそう思う。
まずはじめに、コードを書きます。この時点では、恐らくソースコードにちょこちょことコメントが付いているくらいでしょう。私の場合、「ここ怪しいけれど一応動いてる」だとか「決め打ちなので後で書き直す」だとか「ここを参考:http://www〜」だとかみたいな一般的なコメントから、「帰りに〜買う」などまで書いています。まあこの辺は思い思いに様々なことを書いていることでしょう。
次に、このままではしょうがないので、他人のためのコメントを追加したり、明らかにいらないコメントを削除していきます。が、しかし、ここで困ったことが起ることがあります。そう、英語でどう書いていいのか全く解らない、何となく不安ってやつ。今まで適当に「if you cant 〜, delete this line」(これじゃコメント削除しろと書いてる気がしないでもないけれど……)とか書いたりしてきましたが、必修英語でさえダメダメの評定とかいう英語ダメ人間なので、多分に変なところがあったと思うのです。
そこでGoogle Code。例えばテストケース用の#defineの説明などを書きたいときなら「comment out」とか適当に使われそうな言葉で検索すると、何だか流用できそうなコメントが沢山出てくるわけですよ。そしたら後は適当にそれっぽいコメント選んで名詞などを書き換えつつ機械翻訳して意味を確認。これで英語に頭を抱えなくて済むかもしれない。
2007-07-11 v1.2 Release version
2007-05-30 v1.1 Added fold stars feature
2007-03-29 v1.0 Changed screens using Ten.SubWindow, you can d&d!
2007-03-28 v0.9 Changed Hatena.* classes to Ten v0.05.
2007-03-25 v0.8 Fixed Safari popup problem
2007-03-22 v0.7 Added active state to comment buttons
2007-03-21 v0.6 Added Comment function
2007-03-05 v0.5 Changed uri to Ridge-based paths.
2007-01-24 v0.4 Added Hatena.Diary.Entry class,
Changed Hatena.Star.Entry methods using class method
Added author parameters.
2007-01-23 v0.3 Added Hatena.Star.User class, added Hatena.js, Hatena.Star.js compatibility
2007-01-06 v0.2 Changed name spaces. Using Hatena.*, Hatena.Star.*
2007-01-05 v0.1 Initial version
4月前に大体出来てたって事かな
寝るよ。疲れた。おいらの睡眠時間を返せ…。寝る前にみるんじゃなかった。
http://www.maid-robo.com/masda/mairo.php
完成しなかったよ。
迷路のロジックは多分そこらへんをぐぐればいっぱいあるとおもうが
あえて独自で車輪の再発明をしてみた。
うんこくさいプログラムになってしまった。洗練さのかけらもない。
しかも完成していない。
誰か完成させておいて。
なにか二次元配列をつかいたかったのだけど、phpの配列ってよくわからないや。
んー。いけてないなーーー。。。。
これが俺の限界か…。
おやすみ。。。
<pre> <?php /** http://anond.hatelabo.jp/20070711013155 迷路を作成するプログラムを書いてみましょう。 1BIT/PIXEL のビットマップで道と壁の幅は1PIXEL。 任意の解像度で出力できること。 入り口と出口があること。 実行毎に異なる迷路が生成されること。 それをASCIIテキストで出力すること。 ソースコードとテキストで出力した迷路を増田に投稿すること。 言語問わず。 期限無し。 出力例) ########## ..#...#... #.#.#.##.# #...#..#.# #####.##.# #...#.#..# #.#.....## ########## ***/ define("MAP_X" ,10); define("MAP_Y" ,10); define("MAP_WALL" ,"■"); define("MAP_LINE" ," "); // 塗り。 for ($y = 0 ;$y < MAP_Y ; $y++) { for ($x = 0 ;$x < MAP_X ; $x++) { $map[$y][$x] = MAP_WALL; } } // start pointの設定 if (rand(0,1)%2) { $start_x = rand(1,MAP_X-2); $start_y = (MAP_Y-1)*rand(0,1); } else { $start_x = (MAP_X-1)*rand(0,1); $start_y = rand(1,MAP_Y-2); } $map[$start_x][$start_y] = MAP_LINE; $i=0; $giveupcnt = 0; $now_x = $start_x; $now_y = $start_y; while ($i < 40) { if ($giveupcnt > ((MAP_X-1)*(MAP_Y-1))) { break; } if (rand(0,1)%2) { $rnd_x = rand(-1,1); $rnd_y = 0; } else { $rnd_x = 0; $rnd_y = rand(-1,1); } $tmp_x = $now_x + $rnd_x; $tmp_y = $now_y + $rnd_y; // 壁だったらパス if ($tmp_x <= 0 || $tmp_x >= (MAP_X-1) ) { $giveupcnt++; continue; } if ($tmp_y <= 0 || $tmp_y >= (MAP_Y-1) ) { $giveupcnt++; continue; } /** print("@".($tmp_x) . "," . ($tmp_y)."<br>"); print(($tmp_x + $rnd_x) . "," . ($tmp_y + $rnd_y)."<br>"); print(($tmp_x + -1*$rnd_x) . "," . ($tmp_y + -1*$rnd_y)."<br>"); print(($tmp_x + -1*$rnd_y) . "," . ($tmp_y + -1*$rnd_x)."<br>"); ***/ // そこを掘ることにより他の壁とつながってしまうのであればパス if ($tmp_x > 0 && $tmp_x < (MAP_X-1) && $tmp_y > 0 && $tmp_y < (MAP_Y-1) ) { if ($map[$tmp_x + $rnd_x][$tmp_y + $rnd_y] == MAP_LINE || $map[$tmp_x + $rnd_y][$tmp_y + $rnd_x] == MAP_LINE || $map[$tmp_x - $rnd_y][$tmp_y - $rnd_x] == MAP_LINE ) { $giveupcnt++; continue; } } // 適当なマス数掘り進んだところで壁際まできれてばゴールをつくる // 未実装 $now_x = $tmp_x; $now_y = $tmp_y; $map[$now_x][$now_y] = MAP_LINE; $i++; } // 4方壁のところを起点に同じルールで通路をつくる foreach ($map as $key => $value) { $value = join("",$value); print($value."<br>"); } //print_r($map); ?> </pre>
Windows使いのゲーム好きなので感覚が違うことが前提になってしまいますが、私から見て、家庭用ゲーム機やゲームセンターのビデオゲームはすごく閉鎖的なんです。うちらのWindowsが閉鎖的なように。それに比べると、ゲームの分野に限れば案外Windowsはオープンですよ。ソースコードの部分開示が結構ありまして、それを元にゲームの拡張(Mod)が盛んに行われています。そういったゲームは、プレイしたくなりますね。大勢が手間隙を掛けて作っているものなので、ただの市販品のゲームよりは面白いです。強烈にやりたくなります。
CounterStrikeは面白いです。全世界で旧作新作をあわせてだいたい常時5万人くらいプレイしています(ソース:http://archive.gamespy.com/stats/)。人数から言えば、相応の価値はあるものだと思います。
やっている人間にしか分からないものだということは十分承知していますが、まさに「やれば案外面白い」という感じです。
この二行の間にはおっそろしいぐらいの溝があるな。慣れてる人だとその溝をすっかり忘れてしまいがちだが、冷静に初心者の姿を想像してみるとよくわかる。
http://anond.hatelabo.jp/20070523230747
C言語やrubyを中途半端に学校で習って、よく判らないまま単位だけとって卒業して、その後でJavaやらHaskellやらを最初だけ齧ってしまって結局全部混ざってしまい消化不良みたいな感じです。
まず電子回路の勉強しようぜ。0Vと5Vで電流が流れるだけだから簡単だ。物理的な裏づけもあってわかりやすい。
その後に集積回路の使い方を覚えるんだ。単に電子回路を集めてモジュール化しただけのものだから簡単なはずだ。
そうしたらCPUの作り方がわかってくる。CPUを動かすには機械語が必要だけど、どうして機械語でCPUが動くかがわかるはず。
http://installer.zinio.com/download/3.7.0.5930/ZinioReaderSetup-_2339749973.exe
Fujisan Readerをご利用いただきまして誠にありがとうございます。お客様が本サービスを利用した場合、そのお客様は本利用規約に同意したものとみなします。
第1条 ライセンスの使用許諾
現在ダウンロード、インストール又はアクセス中のソフトウェア(以下「本ソフトウェア」)並びに現在または将来、株式会社富士山マガジンサービス(以下「当社」)のウェブサイトもしくは他のウェブサイトからダウンロードまたは他の形でアクセスした本ソフトウェア、並びに本ソフトウェア用のデジタル雑誌などの商品(以下「ファイル」)に対して、当社は、利用者(以下「ライセンシー」)に制限された、個人利用のための、サブライセンス並びに譲渡ができない、非独占的な権利を許諾いたします。本ソフトウェアにはアドビ システムズ社のPDF Libraryソフトも組み込まれており、そのドキュメンテーション、アップグレード、修正バージョン、アップデート、追加、並びに複製物も含まれます。本ソフトウェアにはフォントを提供する著者が許諾する範囲内であればフォント、またはアウトライン化されたフォントを電子文書にエンベッドすることができます。このパッケージにはアドビ システムズ社並びに他社のフォントが含まれることがあります。アドビ システムズ社が所有するフォントは全てエンベッドすることができます。また、本商品には米国に本社を持つ、Zinio Systems, Inc,(以下「Zinio」)のソフトも組み込まれています。 本ソフトウェアのご利用は当社のウェブサイト(www.fujisan.co.jp)上の利用規約にも準拠するものとします。
第2条 制限事項
本規約で許諾が許されていない限り、ライセンシーは個人もしくは第三者に下記のいずれもできないものとします:複製(ただし本規約で認められる個人での利用の範囲で、改変されてないソフトウェアの複製は除く)、改変、もしくは本ソフトウェアの配布行為、リバースエンジニアリング、逆アセンブル、逆コンパイル又はソースコード又はその構成を発見しようとする行為、本ソフトウェアを貸す又はリース、タイムシェア又はサービスビューローなどで活用する行為、又はその他、本ソフトウェアまたはファイルを第三者のために営利目的で利用すること。当社は合理的な通知を行って、本規約を遵守しているかに関する記録を監査できる権利をもつものとします。本ソフトウェア並びにファイル自体、並びにその複製物、並びにその一部の全ての所有権、所有の権利、著作権などを含む知的財産権、公表権等、その他権利は当社並びに、その供給元もしくは権利保持者に帰属するものとします。当社は自由に本ソフトウェアを改変できるものとし、利用者に対して何らの補償責任を負うことなく、自己の都合により、本規約に基づく使用権を終了させることができます。本ソフトウェア並びにファイルは米国、日本、そして国際条約によって保護されています。本規約はライセンシーにここに明確に提供していない権利は提供していません。ライセンシーは自らが直接、もしくは他のものに依頼して非直接的に、アメリカ合衆国の通商禁止規定、日本の外国為替、日本の外国貿易法、並びにその他の法律に反して、本ソフトウェアまたはファイルを輸出、輸入、もしくは再輸出することはできません。本ソフトウェアをダウンロードもしくは利用することでライセンシーは(i)米国の商務省輸出官庁(United States Bureau of Export Administration)またはその他の米国もしくは日本の政府に輸出をする権利を停止、剥奪、または許可されている状況でないことと、(ii)キューバ、イラン、イラク、リビヤ、北朝鮮、スーダン、シリア又はアメリカ合衆国若しくは日本の通商禁止国の居住者もしくは、住居を定めていないことを保証し言明します。本規約の全権利は本規約の一部にでもライセンシーが従わない場合は喪失することを前提に許諾されています。また、ライセンシーは本ソフトウェア及びファイルの担保設定、貸借その他の処分も行ってはならないものとします。
本ソフトウェアを利用する条件としてライセンシーは次の各項目をしないことを保証し、言明し、誓約するものとします: (i) いかなる第三者の著作権などを含む知的財産権、公表権、プライバシー等、その他の権利をも侵害しないこと。(ii)法律、法令、もしくは規則を侵害しないこと。(iii)いかなる形もしくは形状での情報又はマテリアル(以下「コンテンツ」) も中傷的に、脅しとして、虐待行為として、いやがらせとして、拷問にかけて、名誉を傷つける形で、卑俗な形で、けがれた形で、名誉棄損配布またはその他異議ある形で広めないこと。また、(iv) コンピュータのソフトもしくはハードまたは通信機器に障害または、損失または、機能を制限する可能性のあるウイルスソフト、またはコンピュータのコード、ファイル又はプログラムを広めないこと。当社ではなくライセンシーが本ソフトウェアに関連してアップロードされたコンテンツ、メール、ポストされたものの責任を単独で負うものとします。ライセンシーがアクセスするコンテンツは自らのリスクにおいてアクセスするものとしてライセンシーは認め、これによる第三者もしくは自らへの損害に対して単独に責任を負うものとします。又、ライセンシーはいかなる理由に基づいても知的財産権の有効性及び知的財産権の帰属について争わないものとし、ライセンシーは、本ソフトウェア及びファイル自体、並びに、本ソフトウェア及びファイル含まれる製品表示、著作権表示、商標その他の表示をライセンサーの事前の書面による承諾なく除去又は変更してはならないものとします。また、ラインセンシーはいかなる理由に基づいても知的財産の有効性及び知的財産権の帰属について争わないこと、並びにその他当社が不適切と判断する行為を行わないものとします。
本規約は本ソフトウェアのいかなるサポート、アップグレード、パッチ、改良または改善(総称として「サポート等」)の提供を約束するものではありません。ただし、いかなるサポート等も当社から提供された場合、本ソフトウェアの一部を構成するものとし、本規約の対象となります。
第5条 保証の否認
ライセンシーは、ライセンシーの責任において本ソフトウェア並びにファイルを使用することに明示的に合意します。当社は、本ソフトウェア並びにファイルを「あるがままの状態で」使用許諾するものであり、本ソフトウェアの品質及び性能について何ら法的な保証責任を負いません。
第6条 責任
当社は、本ソフトウェア並びにファイルの使用(本ソフトウェア並びにファイルのダウンロード又はインストールを含みます)又は機能から生じる直接的、間接的、商業的損害または損失等を含む、人体損傷または付随的、特別の、間接的または二次的損害等について、責任論(契約、不法行為等)の如何を問わず発生する一切の損害及び第三者からなされる請求について、免責されるものとします。ライセンシーは、自身の責任において本ソフトウェアを利用するものとし、ライセンシーは、ファイル並びに本ソフトウェアの機能の利用に起因又は関連してコンピュータ等の通信機器及びデータに発生した損害について責任を負うものとし、当社は一切責任を負わないものとします。ライセンシーは、本ソフトウェア及びファイルを利用することが、ライセンシーに適用のある法令、業界団体の内部規則等に違反するか否かを自己の責任と費用に基づいて調査するものとし、ライセンサーはライセンシーによる本ソフトウェア及びファイルの利用が、ライセンシーに適用のある法令、業界団体の内部規則等に適合することを何ら保証するものではありません。本条の規定は、本ソフトウェア及びファイルの瑕疵、損傷又は故障に関するライセンサーの法律上の一切の責任(瑕疵担保責任、債務不履行責任及び不法行為責任を含む。)を規定したものであり、ライセンサーは本条に定めるほか、本ソフトウェア及びファイルの瑕疵、損傷又は故障について何らの責任も負わないものとします。ライセンシーは、本ソフトウェア及びファイルの瑕疵又は権利関係に関して、第三者からクレーム、損害賠償請求その他の請求又は主張がなされた場合には、遅滞なくライセンサーに通知するともに、ライセンサーの指示に従わなければならず、かつ、ライセンシーは第三者からの請求又は主張に関してライセンサーが被った損害(弁護士費用、第三者から請求された賠償額を含む。)及び損失を賠償又は補償しなければならないものとします。また、不可抗力事由が生じている期間中、当社はライセンシーに対し、債務不履行責任を負わないものとします。
第7条 期限並びに終了
本規約は、終了するまで有効です。ライセンシー、並びに当社は本規約をいつの時点でも終了できます。本規約の一部にでもライセンシーが違反した場合、当社は本規約を直ちに解約することができるものとします。終了原因の如何を問わず、本規約の終了に伴い、ライセンシーは、本ソフトウェア並びにファイルの使用を全て中止し、本ソフトウェア並びにファイルの原本および複製物を、その全部または一部を問わず、全てのコンピュータ、ハードドライブ、ネットワーク並びに全ての記憶媒体から破棄しなければなりません。本ソフトウェア並びにファイルの利用を終了した後も第2条、第3条、及び第5条から第8条までは効力を有するものとします。
第8条 その他
本規約は、本規約に基づき使用許諾されたソフトウェア並びにファイルの使用について、お客様とZinio又は当社の合意のすべてを定めるものであり、本件に関する、従前の取決めに優越するものです。本規約の改訂および変更は、書面でライセンシー並びに当社により実行された場合を除き、拘束力を有しません。何らかの理由により、裁判所が本規約のいずれかの条項またはその一部について効力を失わせた場合であっても、これに反しないその他の部分は、依然として完全な効力を有するものとします。ライセンシーが本規約に違反して実行した行為に対して当社がアクションを実行しなかった場合においても、そのことはその違反行為またはその後発生する違反行為を容認するものでもなく、当社の権利を放棄するものではありません。本規約はライセンシー個人との契約であり、いかなる形であれライセンシーが譲渡すること(制限をなくして、法律に基づくもの、合併によるもの、組織変更、コントロールの変化などがあった場合)をも認めません。また、当社が書面により認めた場合を除いてはこれらは無効とします。当社は本規約の全て又は一部を第三者に委託することができるものとします。本契約は、カリフォルニア州民間で締結および完全に履行される契約に適用されるカリフォルニア州法が適用され、これに従って解釈されるものとされ、カリフォルニアの法律の矛盾規約並びに国際売買契約に関する国連規約は適用されません。Adobeはアドビ システムズ社の商標です。ContentGuardはContentGuard Holdings, Inc. 社の商標です。当社より提供される本ソフトウェアおよびファイルは、「商業コンピュータソフトウェア(Commercial Computer Software)」「商業コンピュータソフトウェア文書(Commercial Computer Software Documentation)」から構成されるFAR section 2.101、DFAR section 252.227-7014(a)(1) 、及びFAR section 252.227-7014(a)(5)で定義する「商業品目(Commercial Items)」であり、当該用語は、48 C.F.R.12.212または48 C.F.R. 227.7202で使用されています。DFAR section 227.7202 又は FAR section 12.212に呼応して、商業コンピュータソフトウェアおよび商業コンピュータソフトウェア文書は、アメリカ合衆国政府のライセンシーに対して、(a) 商業品目としてのみ、かつ(b) 本規約条件に従ってその他のエンドユーザ全てに付与される権利のみを伴って、使用許諾されるものです。非公開の権利は、アメリカ合衆国の著作権法に基づき留保されています。
本ソフトウェアで閲覧するすべてのコンテンツは、日本国著作権法、及び国際条約により保護されています。
以上。
新着確認時に読み込まれるデータ。
http://imgs.zinio.com/reader/ReaderVersion.txt
http://www.zinio.com/publication?issn=%publication.issn%</SubscribeURL>
http://www.zinio.com/help</FeedbackURL>
http://imgs.zinio.com/reader/ReaderVersion.txt</PingURL>
http://www.zinio.com/GetReader</UpgradeURL>
http://www.zinio.com/GetReader</WhatsNewURL>
http://www.zinio.com/forgotpwd</ForgotPasswordURL>
http://soap.zinio.com/soap/reader/ReaderSupport.wsdl</SoapURL>
http://www.zinio.com/logmsg</LogURL>
http://www.zinio.com/playerurl</PlayerURL>
http://www.zinio.com/sendtofriend</SendToFriendURL>
http://imgs.zinio.com/magazines/*********/*/*********.zno
http://www.milkstand.net/fsgarage/archives/000984.html
とか
http://www.itmedia.co.jp/bizid/articles/0703/15/news102.html
で日付入れるとかあって、でも手打ちでメンドクセとか思って調べたらコマンドプロンプトから作成が出来る見たい。
REM 日付(yyyymmdd)でフォルダを作成 MD %DATE:/=% REM 日付_時分秒(yyyymmdd_hhmmss)でフォルダを作成 SET T=%TIME:~0,2%%TIME:~3,2%%TIME:~6,2% MD %DATE:/=%_%T: =0% REM 日付_時分秒ミリ秒(yyyymmdd_hhmmssms)でフォルダを作成 SET T=%TIME::=% SET T=%T:.=% MD %DATE:/=%_%T: =0%
ここ
ekken♂ : これであなたもGIGAZINEになれる! ……かも
Iconfactory: mac os XのためのFrenzicの導入
週末にわたって造られる光線辿る3D app -- pics、ビデオ及びソースコード!
Eyeshield 21は対Wiiで怒る
なぜLinuxのためのそう多くのファイルシステムか。 相違は何であるか。
Jetlagを取扱うのを助ける33の先端
DIYの写真のぽんと鳴ら出口の個人指導- 20分の涼しい3D効果
OpenIDがなぜ揺れるか、または吸うか11の理由
妊娠した女の子へのイタリアの裁判官: 「私は中絶」を得るように命令する
Ubuntu: OpenOfficeのための人間アイコン
皮の卵-固ゆで卵の完全に皮をむく最もよい方法!
NHKアーカイブス(番組ではなく、NHK各放送局にある過去の番組を見られる施設の方)では、様々な番組を無料で見ることができます。その中から、特に技術者向け(特にソフトウェア技術者)の番組を紹介します。
NHKは何を伝えてきたか NHKスペシャル 放送番組全記録一覧+番組公開ライブラリーリスト
パチンコ店の歴史や仕組みがよくわかります。サーバコンピュータにどんな機種をつかっているかは分かりませんでした。筐体は見たのですが、聞いたこともない会社のものでした(SGIとかでもなかったです)。大きさは一般的なパソコン並みでしょうか。OSはMS-DOSかな?
また、パチンコの制御プログラムのソースコードが写る場面がありますが、アセンブラで書いているようです。ICチップに書き込んでテスト打ちをしているそうなので、当たり前といえば当たり前かもしれません。最も放送されたのは12年前ですから今はCくらい使えるようになっているかもしれませんが。
NHKは何を伝えてきたか NHKスペシャル 放送番組全記録一覧+番組公開ライブラリーリスト
未視聴ですが、おもしろそうです。今のところ、新・電子立国シリーズで見られるのはこの2作品だけのようです。電子立国シリーズは全部見られるようですが。
生徒にグループを作らせて、その中で試行錯誤しながら、おもしろいゲームを作っていくというストーリー。提案する→問題が出る→解決する→問題が出るというスタイルで、分かりやすくて構成がうまいなと感じました。
安藤百福追悼として。
以下は私の趣味ですが
15年前の若者(現在30??40代)はこんなデートをしていたのでしょうか?ジェネレーションギャップを埋めるためにもいまどきの若者にこれを見せましょう。もちろんこの番組だけで当時の若者を語ってしまうのは危険ですが、話のネタ程度にはなるでしょう。
未視聴なので特にコメントなし。なぜかYOU関係は充実しています。
なお、視聴するときの注意点をいくつか