「ソースコード」を含む日記 RSS

はてなキーワード: ソースコードとは

2007-11-01

PerlClass::Data::Inheritableの解析

唐突に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

プログラ増田のあなぐら

2007-10-12

今日不具合はどうだった?

死ぬ思いで作ったソフト

復讐のためこっそり仕込んだ機能が、今日動作した。

原因が不明?開発当時の人間はもういないからな

ソースコードレビューしないからだよ

http://www.signal.co.jp/

2007-10-05

mixiデザイン

数日使って思ったこと

白い

白い白いと言われているが、おそらく問題は白の面積ではなく、明るいオレンジにあると思われる。

白さの面積で言えば、この増田も良い勝負。

前のオレンジは、オレンジでも明るさ抑えめの配色だったので、背景色にしても、

それほど違和感はなかったが、今回のオレンジは、背景色にするにはやや明るすぎの感がある。

サムネイル画像のみの表示

最新アルバム動画ミュージックに表示される部分が、画像のみであるため、

一体全体、何のアルバム(又は動画ミュージック)であるのか、判別つかない。

また、imgタグにalt属性タイトルを指定しているが、alt属性Firefoxではマウスオーバー時にポップアップ表示されないため、

title属性も付加すべきだろう。

まぁ、それよりも大人しく、文字によるタイトル表記をすべきだと思うが。

広告

丁寧に、AdBlockブロックされないように対策が施してある。

これは、mixiも慈善事業じゃないので、いたしかないところか・・・

たしかに横幅が広いが、ユーザースタイルシートも出回っているので、それで対応可能。

MacOS 9問題

未だに古い、セキュリティホールだらけのOSブラウザを利用しているのは信じられない。

これを機にMacOS 9ユーザは推奨環境に移るべきであろう。

もしくは、Firefoxの最新版を自らの手で移植すべきだ。

ソースコードは公開されているのだから。

統一感のなさ

端々に古いデザインが残っていたりして、統一感が欠けているので、

どうにも居心地が悪い。

上部にある2段構えのメニュー

1段目がユーザー全体のデータベースアクセスする必要があるメニューで、

2段目のメニューが、現在閲覧中のユーザデータベースアクセスする必要があるメニューとなっている。

たしかに、開発側からしてみると、このようになってしまうのかもしれないが、同じような項目が並んでいるので、

ユーザにとっては一見して分からない、失敗したユーザーインタフェースといえよう。

しかし、メニューの項目が1つしかないのは、何かのジョーク

2007-09-10

ペアプログラミングがやりたい

僕は組み込みシステムエンジニアなのだけど、自分の業務改善作業がとても好きだ。

キーボードを自腹で買い換えたり、メモリを自腹で増設したり、いろんなツール導入したり、GTD導入したり、職場wiki導入してみたり、デュアルディスプレイを自腹で構築したり、仕様書ソースコードPerlRubyで出力して同時出力したりなど色々業務環境改善してきた。

自分の開発環境をより開発しやすく、自分の開発工程をより完成度を高くしていく作業はとても楽しい。そういう記事を読むのもかなり好きだ。

でもずっと前からやりたいけどやれないことがある。それはペアプログラミングだ。

理由はペアプログラミングという業務改善作業には、それに賛同してくれる相手が必要で、今この職場には賛同相手は一人もいないからだ。僕の拙い説明では、「どうもペアプログラミングは悪くないらしい」ということが伝わらない。「そんなチャレンジしてる暇があれば目の前の仕事しなよ」と言われてしまう。きっと僕がペアプログラミング未経験者だからうまく説明できないというのもあると思うのだけど。

でも多分、ペアプログラミングは、「コミュニケーション不足になりがち」というIT業務の本質的な欠陥を補い得るかなり根本的な業務改善だと思う。だけど、それでも出来ない。賛同してくれる人が職場に一人もいない。だからペアプログラミングが出来ない。

仕様書レビューソースコードレビューで十分じゃないか」そう言われてしまう。十分か、十分じゃないかなんて試してみなければわからないじゃないか。

今のところ、地道に「ペアプログラミングやりたいやりたい」とことあるごとに周りに言って回る日々をすごしています。

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

2007-08-31

「num1000.swf」と「組曲『ニコニコ動画』

 ”「組曲『ニコニコ動画』」はニコニコ版num1000.swfだ”って声をどこぞで聞いた。

 最近ニコニコになんとなーく既視感を感じてたんだけど、胸のつっかえが降りた気分。

 もうホント、あのころ某巨大掲示板の某フラッシュ板で発表される作品のほとんどが「PV系」「矢印」「ユーロビート」だった気がする。もしくは公開されたソースコードを用いてのリミックス作品。

 あくまで今思い出して、の話だけど。絶対的な量とかは今でも確かめようもないんだけど。

 でもそれこそ今のニコニコの「歌ってみた」とは比較にならないくらいの規模だったように思えるのだ。

 

 そんな「num1000.swf」を再びニコニコで見てみた。

 よく出来てるなぁ。今見てもそう思う。

http://www.nicovideo.jp/watch/sm284920

2007-08-21

Google Codeの便利な使い方がわかったかもしれない

まずはじめに、コードを書きます。この時点では、恐らくソースコードにちょこちょことコメントが付いているくらいでしょう。私の場合、「ここ怪しいけれど一応動いてる」だとか「決め打ちなので後で書き直す」だとか「ここを参考:http://www〜」だとかみたいな一般的なコメントから、「帰りに〜買う」などまで書いています。まあこの辺は思い思いに様々なことを書いていることでしょう。

次に、このままではしょうがないので、他人のためのコメントを追加したり、明らかにいらないコメント削除していきます。が、しかし、ここで困ったことが起ることがあります。そう、英語でどう書いていいのか全く解らない、何となく不安ってやつ。今まで適当に「if you cant 〜, delete this line」(これじゃコメント削除しろと書いてる気がしないでもないけれど……)とか書いたりしてきましたが、必修英語でさえダメダメの評定とかいう英語ダメ人間なので、多分に変なところがあったと思うのです。

そこでGoogle Code。例えばテストケース用の#defineの説明などを書きたいときなら「comment out」とか適当に使われそうな言葉で検索すると、何だか流用できそうなコメントが沢山出てくるわけですよ。そしたら後は適当にそれっぽいコメント選んで名詞などを書き換えつつ機械翻訳して意味を確認。これで英語に頭を抱えなくて済むかもしれない。

2007-07-11

はてなスターソースコードの最後に更新履歴が載ってた

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 &amp;&amp; $tmp_x < (MAP_X-1) &amp;&amp;
		$tmp_y > 0 &amp;&amp; $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>

pre記法で書いたらトラバがとんでなかったので、追加。

http://anond.hatelabo.jp/20070711013155

2007-06-22

http://anond.hatelabo.jp/20070622193836

Windows使いのゲーム好きなので感覚が違うことが前提になってしまいますが、私から見て、家庭用ゲーム機ゲームセンタービデオゲームはすごく閉鎖的なんです。うちらのWindowsが閉鎖的なように。それに比べると、ゲームの分野に限れば案外Windowsオープンですよ。ソースコードの部分開示が結構ありまして、それを元にゲーム拡張Mod)が盛んに行われています。そういったゲームは、プレイしたくなりますね。大勢が手間隙を掛けて作っているものなので、ただの市販品のゲームよりは面白いです。強烈にやりたくなります。

OSセットアップとカスタマイズを上回る興奮を与えてくれる市販ゲーム地球上に存在したことがあるのでしょうか?

CounterStrikeは面白いです。全世界で旧作新作をあわせてだいたい常時5万人くらいプレイしています(ソースhttp://archive.gamespy.com/stats/)。人数から言えば、相応の価値はあるものだと思います。

やっている人間にしか分からないものだということは十分承知していますが、まさに「やれば案外面白い」という感じです。

2007-05-24

http://anond.hatelabo.jp/20070524004238

そこまでいったらあとはアセンブラC言語Javaとだんだん高レベルな世界に行けばいい。

CコンパイラソースコードもJavaVMのソースコードもタダで手に入るんだから見てりゃわかるだろ。

この二行の間にはおっそろしいぐらいの溝があるな。慣れてる人だとその溝をすっかり忘れてしまいがちだが、冷静に初心者の姿を想像してみるとよくわかる。

レベルなものばっかりやりすぎなんだよ最初っから

http://anond.hatelabo.jp/20070523230747

C言語ruby中途半端学校で習って、よく判らないまま単位だけとって卒業して、その後でJavaやらHaskellやらを最初だけ齧ってしまって結局全部混ざってしまい消化不良みたいな感じです。

まず電子回路の勉強しようぜ。0Vと5Vで電流が流れるだけだから簡単だ。物理的な裏づけもあってわかりやすい。

その後に集積回路の使い方を覚えるんだ。単に電子回路を集めてモジュール化しただけのものだから簡単なはずだ。

そうしたらCPUの作り方がわかってくる。CPUを動かすには機械語が必要だけど、どうして機械語CPUが動くかがわかるはず。

そこまでいったらあとはアセンブラC言語Javaとだんだん高レベルな世界に行けばいい。

CコンパイラソースコードもJavaVMのソースコードもタダで手に入るんだから見てりゃわかるだろ。

2007-04-28

KENT

http://anond.hatelabo.jp/20070427131053

でも氏のソースコード云々の話は別にして彼の残した功績はかなりでかいと思う。

氏のCGIプログラムに興味をもった人間は少なくないだろう。

おれもその口。

MTソースを見た時、同じperlで出来てるとは信じられなかった。

2007-04-27

オブジェクト指向

自分もPerl CGIソースコードの修正から入ったクチだけど。

プログラミングをまっとうに勉強していけば

  1. とにかくベタ書き
  2. 何度も書くのは面倒だしすっきりしない。関数を多用したプログラミングへの目覚め
  3. 変数管理でスパゲッティ化。カプセル化の必要性を認識
  4. 関数変数って大差なくね?関数変数を一括して取り扱う仕組みの効率性に気がつく
  5. 入出力の形が一緒なら、違うものも同じように扱いたいよね。インターフェイスの統一って素晴らしい

と、先人たちの歩んだ思考パターントレースできると思うのだが。

http://anond.hatelabo.jp/20070427093912

2007-04-24

http://anond.hatelabo.jp/20070424034110

興味深い案だけど、

個々人の思想や主張を一本にまとめるのは難しいんじゃないか

ソースコードだとプロダクトという共通の目的があるんだけど、

政党オープンソースだと、まずあるべきの目的がまとまらないと思う

2007-04-04

Fujisan Reader

http://installer.zinio.com/download/3.7.0.5930/ZinioReaderSetup-_2339749973.exe

 

Fujisan Reader利用規約

Fujisan Readerをご利用いただきまして誠にありがとうございます。お客様が本サービスを利用した場合、そのお客様は本利用規約に同意したものとみなします。

第1条 ライセンスの使用許諾

現在ダウンロードインストール又はアクセス中のソフトウェア(以下「本ソフトウェア」)並びに現在または将来、株式会社富士山マガジンサービス(以下「当社」)のウェブサイトもしくは他のウェブサイトからダウンロードまたは他の形でアクセスした本ソフトウェア、並びに本ソフトウェア用のデジタル雑誌などの商品(以下「ファイル」)に対して、当社は、利用者(以下「ライセンシー」)に制限された、個人利用のための、サブライセンス並びに譲渡ができない、非独占的な権利を許諾いたします。本ソフトウェアにはアドビ システムズ社のPDF Libraryソフトも組み込まれており、そのドキュメンテーションアップグレード、修正バージョンアップデート、追加、並びに複製物も含まれます。本ソフトウェアにはフォントを提供する著者が許諾する範囲内であればフォント、またはアウトライン化されたフォント電子文書にエンベッドすることができます。このパッケージにはアドビ システムズ社並びに他社のフォントが含まれることがあります。アドビ システムズ社が所有するフォントは全てエンベッドすることができます。また、本商品には米国に本社を持つ、Zinio Systems, Inc,(以下「Zinio」)のソフトも組み込まれています。 本ソフトウェアのご利用は当社のウェブサイト(www.fujisan.co.jp)上の利用規約にも準拠するものとします。

第2条 制限事項

規約で許諾が許されていない限り、ライセンシーは個人もしくは第三者に下記のいずれもできないものとします:複製(ただし本規約で認められる個人での利用の範囲で、改変されてないソフトウェアの複製は除く)、改変、もしくは本ソフトウェアの配布行為、リバースエンジニアリング、逆アセンブル、逆コンパイル又はソースコード又はその構成を発見しようとする行為、本ソフトウェアを貸す又はリースタイムシェア又はサービスビューローなどで活用する行為、又はその他、本ソフトウェアまたはファイルを第三者のために営利目的で利用すること。当社は合理的な通知を行って、本規約を遵守しているかに関する記録を監査できる権利をもつものとします。本ソフトウェア並びにファイル自体、並びにその複製物、並びにその一部の全ての所有権、所有の権利、著作権などを含む知的財産権、公表権等、その他権利は当社並びに、その供給元もしくは権利保持者に帰属するものとします。当社は自由に本ソフトウェアを改変できるものとし、利用者に対して何らの補償責任を負うことなく、自己の都合により、本規約に基づく使用権を終了させることができます。本ソフトウェア並びにファイル米国日本、そして国際条約によって保護されています。本規約はライセンシーにここに明確に提供していない権利は提供していません。ライセンシーは自らが直接、もしくは他のものに依頼して非直接的に、アメリカ合衆国の通商禁止規定、日本外国為替、日本外国貿易法、並びにその他の法律に反して、本ソフトウェアまたはファイルを輸出、輸入、もしくは再輸出することはできません。本ソフトウェアダウンロードもしくは利用することでライセンシーは(i)米国の商務省輸出官庁(United States Bureau of Export Administration)またはその他の米国もしくは日本政府に輸出をする権利を停止、剥奪、または許可されている状況でないことと、(ii)キューバイランイラク、リビヤ、北朝鮮スーダンシリア又はアメリカ合衆国若しくは日本の通商禁止国の居住者もしくは、住居を定めていないことを保証し言明します。本規約の全権利は本規約の一部にでもライセンシーが従わない場合は喪失することを前提に許諾されています。また、ライセンシーは本ソフトウェア及びファイルの担保設定、貸借その他の処分も行ってはならないものとします。

第3条 知的財産コンテンツ

ソフトウェアを利用する条件としてライセンシーは次の各項目をしないことを保証し、言明し、誓約するものとします: (i) いかなる第三者の著作権などを含む知的財産権、公表権、プライバシー等、その他の権利をも侵害しないこと。(ii)法律法令、もしくは規則を侵害しないこと。(iii)いかなる形もしくは形状での情報又はマテリアル(以下「コンテンツ」) も中傷的に、脅しとして、虐待行為として、いやがらせとして、拷問にかけて、名誉を傷つける形で、卑俗な形で、けがれた形で、名誉棄損配布またはその他異議ある形で広めないこと。また、(iv) コンピュータソフトもしくはハードまたは通信機器に障害または、損失または、機能を制限する可能性のあるウイルスソフト、またはコンピュータコードファイル又はプログラムを広めないこと。当社ではなくライセンシーが本ソフトウェアに関連してアップロードされたコンテンツメールポストされたものの責任を単独で負うものとします。ライセンシーがアクセスするコンテンツは自らのリスクにおいてアクセスするものとしてライセンシーは認め、これによる第三者もしくは自らへの損害に対して単独に責任を負うものとします。又、ライセンシーはいかなる理由に基づいても知的財産権の有効性及び知的財産権の帰属について争わないものとし、ライセンシーは、本ソフトウェア及びファイル自体、並びに、本ソフトウェア及びファイル含まれる製品表示、著作権表示、商標その他の表示をライセンサーの事前の書面による承諾なく除去又は変更してはならないものとします。また、ラインセンシーはいかなる理由に基づいても知的財産の有効性及び知的財産権の帰属について争わないこと、並びにその他当社が不適切と判断する行為を行わないものとします。

第4条 サポート並びにアップグレード

規約は本ソフトウェアのいかなるサポートアップグレードパッチ、改良または改善(総称として「サポート等」)の提供を約束するものではありません。ただし、いかなるサポート等も当社から提供された場合、本ソフトウェアの一部を構成するものとし、本規約の対象となります。

第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</URL>

http://www.zinio.com</Stand>

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

2007-03-20

フォルダに日付を付加する。のなんてメンドクセ

http://www.milkstand.net/fsgarage/archives/000984.html

(1)ソースコードが入ってるフォルダに年月日をつける。

とか

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%

こんなのでバッチファイルでも作っておけば少しは幸せになれるのか…

2007-03-19

COBOLプログラム現役で動くような環境はね

いろいろなものが仰々しくて、ちょっとしたことをするのにも面倒くさい手順踏まないといけないんだけど、

その分余計なことを考えなくてもいい環境だったりして

そういうところだとプリンタソースコードを出して赤ペンでチェックしながら

デバッグしても割とその労力に見合った結果が出るのね。

2007-02-21

GIGAZINEになれるらしい? http://gigazine.net/

ここ

誰でもGIGAZINEになれる方法

手っ取り早くGIGAZINEになる方法

ekken♂ : これであなたもGIGAZINEになれる! ……かも

Iconfactory: mac os XのためのFrenzicの導入

謝肉祭パレードで騒いでいるドイツイスラム教

ビデオ: Lightsaberの酔った決闘

CNNマリファナの合法化の物語を動かす

地下鉄のすばらしい即興のbeatbox

IKEA米国ポリ袋のために満たし始める

週末にわたって造られる光線辿る3D app -- pics、ビデオ及びソースコード!

Eyeshield 21は対Wiiで怒る

3月解放のために形づくPhotoshop CS3

Skype衝突昨日500,000,000のダウンロード

世界で最も大きいカブトムシ(映像)

なぜLinuxのためのそう多くのファイルシステムか。 相違は何であるか。

Jetlagを取扱うのを助ける33の先端

DIY写真のぽんと鳴ら出口の個人指導- 20分の涼しい3D効果

OpenIDがなぜ揺れるか、または吸うか11の理由

非常に習慣性ラインゲーム

ビデオゲーム歴史の最も50大きい女性キャラクター

妊娠した女の子へのイタリア裁判官: 「私は中絶」を得るように命令する

Ubuntu: OpenOfficeのための人間アイコン

皮の卵-固ゆで卵の完全に皮をむく最もよい方法!

独学網開発者秘密: 網の開発を助けるべき115資源

2007-01-11

技術者が見るべきNHKアーカイブス

NHKアーカイブス番組ではなく、NHK放送局にある過去番組を見られる施設の方)では、様々な番組無料で見ることができます。その中から、特に技術者向け(特にソフトウェア技術者)の番組を紹介します。

NHKは何を伝えてきたか NHKスペシャル 放送番組全記録一覧+番組公開ライブラリーリスト

パチンコ店の歴史や仕組みがよくわかります。サーバコンピュータにどんな機種をつかっているかは分かりませんでした。筐体は見たのですが、聞いたこともない会社のものでした(SGIとかでもなかったです)。大きさは一般的なパソコン並みでしょうか。OSMS-DOSかな?

また、パチンコの制御プログラムソースコードが写る場面がありますが、アセンブラで書いているようです。ICチップに書き込んでテスト打ちをしているそうなので、当たり前といえば当たり前かもしれません。最も放送されたのは12年前ですから今はCくらい使えるようになっているかもしれませんが。

NHKは何を伝えてきたか NHKスペシャル 放送番組全記録一覧+番組公開ライブラリーリスト

未視聴ですが、おもしろそうです。今のところ、新・電子立国シリーズで見られるのはこの2作品だけのようです。電子立国シリーズは全部見られるようですが。

生徒にグループを作らせて、その中で試行錯誤しながら、おもしろいゲームを作っていくというストーリー。提案する→問題が出る→解決する→問題が出るというスタイルで、分かりやすくて構成がうまいなと感じました。

安藤百福追悼として。

以下は私の趣味ですが

15年前の若者現在30??40代)はこんなデートをしていたのでしょうか?ジェネレーションギャップを埋めるためにもいまどきの若者にこれを見せましょう。もちろんこの番組だけで当時の若者を語ってしまうのは危険ですが、話のネタ程度にはなるでしょう。

未視聴なので特にコメントなし。なぜかYOU関係は充実しています。

なお、視聴するときの注意点をいくつか

  • NHK受信料を払っているかどうかの確認は当然ありませんが、視聴する際に、名前や住所、電話番号を書かされるケースがあります(そうでないケースもあります)。この情報は何に使われるかの説明は受けませんでしたが、後ろ暗いところのある人は見ないほうがよいかもしれません。
  • 視聴する際に、年齢、性別、都道府県を選ばなければなりません。これは全国どこでも一緒だと思われます。
  • ネットで番組検索(視聴は不可)することも可能ですが、なぜかここでも年齢、性別、都道府県を選ばなければなりません。
  • IDパスワードを登録をすれば、お気に入り番組リストを保存することができます。(追記:WEB上ではできません)
  • 地方によっても異なりますが席は2席ほどしかなく、視聴時間は1回につき1時間から2時間のようです。
ログイン ユーザー登録
ようこそ ゲスト さん