「Name」を含む日記 RSS

はてなキーワード: Nameとは

2008-03-15

[][]PythonからSWIG経由でVisual Studio 2005を使って困ったこと

以上のような組み合わせで出くわした困ったことと、その解決策をメモしておきます。

setup.py を実行するとエラーが表示された!

Python was built with Visual Studio 2003;

extensions must be built with a compiler than can generate compatible binaries.

Visual Studio 2003 was not found on this system. If you have Cygwin installed,

you can try compiling with MingW32, by passing "-c mingw32" to setup.py.

setup.pyに.iファイルとか.cppファイルを記述して実行すると、こんな感じのエラーメッセージが表示されました。うーん、困った!

http://labs.cybozu.co.jp/blog/mitsunari/2007/08/vc2005boostpython.html

上記のページを参考にして、"%Pythonインストールしたフォルダ%/Lib/distutils/msvcompiler.py"を以下のように修正してみたら解決できました。ありがとうありがとう

--- msvccompiler.py    2007-04-04 17:17:12.000000000 +0900
+++ 
@@ -126,7 +126,7 @@
         self.set_macro("FrameworkDir", net, "installroot")
         try:
             if version > 7.0:
-                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv1.1")
+                self.set_macro("FrameworkSDKDir", net, "sdkinstallrootv2.0")
             else:
                 self.set_macro("FrameworkSDKDir", net, "sdkinstallroot")
         except KeyError, exc: #
@@ -252,7 +252,10 @@

     def initialize(self):
         self.__paths = []
-        if os.environ.has_key("DISTUTILS_USE_SDK") and os.environ.has_key("MSSdk") and self.find_exe("cl.exe"):
+        if self.__version >= 7.1 or (
+            os.environ.has_key("DISTUTILS_USE_SDK") and
+            os.environ.has_key("MSSdk") and
+            self.find_exe("cl.exe")):
             # Assume that the SDK set up everything alright; don't try to be
             # smarter
             self.cc = "cl.exe"
@@ -288,10 +291,16 @@

         self.preprocess_options = None
         if self.__arch == "Intel":
-            self.compile_options = [ '/nologo', '/Ox', '/MD', '/W3', '/GX' ,
-                                     '/DNDEBUG']
-            self.compile_options_debug = ['/nologo', '/Od', '/MDd', '/W3', '/GX',
-                                          '/Z7', '/D_DEBUG']
+            if self.__version >= 7.1:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/EHsc', '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/EHsc', '/Z7', '/D_DEBUG']
+            else:
+                self.compile_options = [
+                    '/nologo', '/Ox', '/MD',  '/W3', '/GX',  '/DNDEBUG']
+                self.compile_options_debug = [
+                    '/nologo', '/Od', '/MDd', '/W3', '/GX', '/Z7', '/D_DEBUG']
         else:
             # Win64

cl.exeが見つからないと言われた!

setup.pyを実行するとcl.exeが見つからないみたいなエラーが表示されました。これは、アレだ。「パス通せ!」ということですね。bashを起動するときのバッチファイル(たぶん"cygwin.bat"とか)で、以下のような行を入れてやれば解決しました。

call "%VS80COMNTOOLS%vsvars32.bat"

setup.pyを実行したときに"basetsd.h"が開けないと言われた!

d:\python25\include\pyconfig.h(189) : fatal error C1083: include ファイルを開けません。'basetsd.h': No such file or directory

error: command 'cl.exe' failed with exit status 2

setup.pyを実行すると、上のようなエラーが表示されました。

http://d.hatena.ne.jp/ousttrue/20070531/1180556273

上記のサイトを見るとインクルードパスが通っていない場所に"basetsd.h"があるのが原因なので、"cygwin.bat"にインクルードパスの設定をしておきました。

call "%VS80COMNTOOLS%vsvars32.bat"
set INCLUDE=C:\Program Files\Microsoft Platform SDK\Include;%INCLUDE%

setup.pyを実行したときのリンク時にエラーが発生した!

link: extra operand `/INCREMENTAL:NO'

詳しくは `link --help' を実行して下さい.

error: command 'link.exe' failed with exit status 1

これは、cygwinのほうのlink.exeが実行されてるのが原因でした。スマートな解決策ではありませんが、cygwinのほうのlink.exeをリネームして解決。パスの設定順序とかでどうにかできるといいんだけど、どうすればいいんかな。

MSVCR80.dllが見つからないと言われた!

MSVCR80.dllが見つからなかったため、このアプリケーションを開始できませんでした。アプリケーションインストールし直すとこの問題は解決される場合があります。

SWIGが生成した.pyファイルをimportしたら、こんな感じのエラーダイアログが表示されたよ。うーん、困った!

http://d.hatena.ne.jp/moriyoshi/20070525

上記のページを参考にして、"%Pythonインストールしたフォルダ%/python.exe.manifest"として以下のようなファイルを新しく作ったら、解決できました。ありがとうありがとう

あとこれ、bashから実行したらエラーダイアログが表示されず、importするモジュールが見つからないみたいなエラーメッセージが出力されるだけだったよ。

<?xml version='1.0' encoding='UTF-8' standalone='yes'?>
<assembly xmlns='urn:schemas-microsoft-com:asm.v1' manifestVersion='1.0'>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50608.0' processorArchitecture='x86' publicKeyToken='1fc8b3b9a1e18e3b' />
    </dependentAssembly>
  </dependency>
</assembly>

2008-03-14

[][]はてブhotentryにて2chコピペブログや「ネタ」を削除

http://anond.hatelabo.jp/20080302214727

ネタ」がうまくいかない件は、"\u30cd\u30bf"にしたらうまく行った

あと2chコピペサイトを2つ追加

とりあえず、Sleipnir2のSeahorseで確認。

// ==UserScript==
// @name           hatebufilter
// @namespace      hatebufilter
// @description    Hatena bookmark filter
// @include        http://b.hatena.ne.jp/hotentry*
// @include        http://b.hatena.ne.jp/entrylist*
// ==/UserScript==
/*
問題点
いまのところなし

・問題が起こりそうなURL
http://b.hatena.ne.jp/hotentry?mode=daily&amp;date=20080224
http://b.hatena.ne.jp/hotentry?mode=daily&amp;date=20080218
**/

(function(){
	// Hatebu Tag
	var HatebuTagParentNum = 3;

	var filters = [
		// moconico douga
		{"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"},
/*
		// tag of "2ch"
		{"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum},
		{"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum},
**/
		// 2ch blogs  
		//  livedoor
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//},
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//},
		//  fc2
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/(imihu|urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//},
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/www\.kajisoku\.org\//},
		
		// hatena anonymouse diary
		{"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//},

		// tag of "neta"
		{"tag": "a", "name": "tag", "pattern": "\u30cd\u30bf", "parentNum": HatebuTagParentNum},
		{"tag": "a", "name": "tag", "pattern": "\\*\u30cd\u30bf", "parentNum": HatebuTagParentNum},
	];

	for (var i = 0; i < filters.length; i++) {
		var f = filters[i];
		filtering(f.tag, f.name, f.pattern, f.parentNum== undefined ? 1 : f.parentNum);
	}

	function filtering(tag, name, pattern, parentNodeNum){
		var entrylist = document.getElementsByTagName(tag);
                //print("pattern = " + pattern);
		for(var idx = entrylist.length - 1; 0 <= idx; idx--){
//        for(var idx = 0; idx < entrylist.length - 1; idx++){
			if (entrylist[idx].className == name){
				if (entrylist[idx].innerHTML.match(pattern)) {
					var node = entrylist[idx];
					var oldNode = null;
					for (var j = 0; j < parentNodeNum; j++) {
						oldNode = node;
						node = node.parentNode;
					}
					// print("class = " + oldNode.getAttribute("class"));
					// print("id = " + oldNode.getAttribute("id"));
					node.removeChild(oldNode);
				}
			}
		}
	}
})();

2008-03-08

[][greasemonkey][seahorse]はてブのhotentryで、2chコピペブログや「ネタ」を削除す...勝手に改造

firefoxでしか確認していないけれど、URL正規表現XPathで指定できる様にしてみたよ。

// ==UserScript==
// @name           filter for Hatena::Bookmark
// @namespace      http://anond.hatelabo.jp/
// @include        http://b.hatena.ne.jp/hotentry*
// @include        http://b.hatena.ne.jp/entrylist*
// origin http://anond.hatelabo.jp/20080302214727
// ==/UserScript==
(function(){
	var itemxpath = "//div[@class='entry']";
	function xpathgenURL(url) {return "//div[@class='entry' and descendant::a[starts-with(@href,'"+url+"')]]"}
	var filters = [
		// start with '//' then xpath
		// moconico douga
//		{"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"},
		"//div[@class='entry' and descendant::a[contains(@href,'nicovideo.jp')]]",
/*
		// tag of "2ch"
		{"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum},
		{"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum},
***/
		// start with 'http' then url
		// 2ch blogs  
		//  livedoor
//		{"tag": "div", "name": "entry",
//			"pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//},
		"http://blog.livedoor.jp/insidears/",
		"http://blog.livedoor.jp/dqnplus/",
//		{"tag": "div", "name": "entry",
//			"pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//},
		"http://guideline.livedoor.biz/",
		"http://alfalfa.livedoor.biz/",
		"http://news4vip.livedoor.biz/",
		// typeof /regexp/ is function (@firefox) then regexp pattern
		//  fc2
//		{"tag": "div", "name": "entry",
//			"pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//},
		/http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//,

		// tag of "neta"
//		{"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum},
		"//div[@class='entry' and descendant::a[@class='tag' and string()='ネタ']]",
//		{"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum},
		"//div[@class='entry' and descendant::a[@class='tag' and string()='*ネタ']]",

		// hatena anonymouse diary
//		{"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//}
		"http://anond.hatelabo.jp/",
	];

	for (var i=0; i<filters.length; i++) {
		var filter = filters[i];
		var type = typeof filter;
		var regexp;
		var xpath;
		if (type == "function") {
			xpath = itemxpath;
			regexp = filter;
		} else if (type == "string") {
			if (filter.match(/^http/)) {
				xpath = xpathgenURL(filter);
			} else if (filter.match(/^\/\//)) {
				xpath = filter;
			} else {
				next;
			}
		}
		var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var j=0; j<removeNodes.snapshotLength; j++) {
			var node = removeNodes.snapshotItem(j);
			if (!regexp || node.innerHTML.match(regexp)) {
				node.parentNode.removeChild(node);
			}
		}
	}
})();

ついでに増田版も作ってみたよ。

// ==UserScript==
// @name           filter for Hatelabo::AnonymousDiary
// @namespace      http://anond.hatelabo.jp/
// @include        http://anond.hatelabo.jp/
// @include        http://anond.hatelabo.jp/*?page=*
// @exclude        http://anond.hatelabo.jp/YourID/*
// ==/UserScript==
// origin http://anond.hatelabo.jp/20080302214727
(function(){
	var itemxpath = "//div[@class='section']";
	function xpathgenURL(url) {return "//div[@class='section' and descendant::a[starts-with(@href,'"+url+"')]]"}
	var filters = [
		// start with '//' then xpath
		"//div[@class='section' and child::h3[starts-with(string(),'■はてな嫌われ者!')]]",
		// start with 'http' then url
		"http://anond.hatelabo.jp/",
		// typeof /regexp/ is function (@firefox) then regexp pattern
		/釣り/,
	];

	for (var i=0; i<filters.length; i++) {
		var filter = filters[i];
		var type = typeof filter;
		var regexp;
		var xpath;
		if (type == "function") {
			xpath = itemxpath;
			regexp = filter;
		} else if (type == "string") {
			if (filter.match(/^http/)) {
				xpath = xpathgenURL(filter);
			} else if (filter.match(/^\/\//)) {
				xpath = filter;
			} else {
				next;
			}
		}
		var removeNodes = document.evaluate(xpath,document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (var j=0; j<removeNodes.snapshotLength; j++) {
			var node = removeNodes.snapshotItem(j);
			if (!regexp || node.innerHTML.match(regexp)) {
				node.parentNode.removeChild(node);
			}
		}
	}
})();

2008-03-02

[][]はてブのhotentryで、2chコピペブログや「ネタ」を削除する

http://anond.hatelabo.jp/20080102122736

汎用性を上げてみた。

はてブのhotentryから削除するgreasemonkey

Sleipnir2のseahorseでも使える。

// ==UserScript==
// @name           hatebufilter
// @namespace      hatebufilter
// @description    Hatena bookmark filter
// @include        http://b.hatena.ne.jp/hotentry*
// @include        http://b.hatena.ne.jp/entrylist*
// ==/UserScript==
/*
問題点
いまのところなし

・問題が起こりそうなURL
http://b.hatena.ne.jp/hotentry?mode=daily&amp;date=20080224
http://b.hatena.ne.jp/hotentry?mode=daily&amp;date=20080218
**/

(function(){
	// Hatebu Tag
	var HatebuTagParentNum = 3;

	var filters = [
		// moconico douga
		{"tag": "div", "name": "entry", "pattern": "nicovideo\.jp"},
/*
		// tag of "2ch"
		{"tag": "a", "name": "tag", "pattern": "2ch", "parentNum": HatebuTagParentNum},
		{"tag": "a", "name": "tag", "pattern": "\\*2ch", "parentNum": HatebuTagParentNum},
**/
		// 2ch blogs  
		//  livedoor
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/blog\.livedoor\.jp\/(insidears|dqnplus)\//},
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/(guideline|alfalfa|news4vip)\.livedoor\.biz\//},
		//  fc2
		{"tag": "div", "name": "entry",
			"pattern": /http:\/\/(urasoku|news23vip|waranote|vipvipblogblog|netanabe|res2ch|kanasoku|tenkomo)\.blog\d+\.fc2\.com\//},

		// tag of "neta"
		{"tag": "a", "name": "tag", "pattern": "ネタ", "parentNum": HatebuTagParentNum},
		{"tag": "a", "name": "tag", "pattern": "*ネタ", "parentNum": HatebuTagParentNum},

		// hatena anonymouse diary
		{"tag": "div", "name": "entry", "pattern": /http:\/\/anond\.hatelabo\.jp\//}
	];

	for (var i = 0; i < filters.length; i++) {
		var f = filters[i];
		filtering(f.tag, f.name, f.pattern, f.parentNum== undefined ? 1 : f.parentNum);
	}

	function filtering(tag, name, pattern, parentNodeNum){
		var entrylist = document.getElementsByTagName(tag);
                //print("pattern = " + pattern);
		for(var idx = entrylist.length - 1; 0 <= idx; idx--){
//        for(var idx = 0; idx < entrylist.length - 1; idx++){
			if (entrylist[idx].className == name){
				if (entrylist[idx].innerHTML.match(pattern)) {
					var node = entrylist[idx];
					var oldNode = null;
					for (var j = 0; j < parentNodeNum; j++) {
						oldNode = node;
						node = node.parentNode;
					}
					// print("class = " + oldNode.getAttribute("class"));
					// print("id = " + oldNode.getAttribute("id"));
					node.removeChild(oldNode);
				}
			}
		}
	}
})();

hatebufilter.user.jsなどとUTF-8で保存して使う。

しかし、増田コード記法日本語貼り付けたら化けるんだが・・・どうすればいいんだろ?

コメントアウトを直せば、2chコピペブログ以外の「2chタグ自体での削除も可能です。

いろいろ削除していると、まーオレンジニュースでいいじゃんという。

# スーパー引用記法にしました

PTA

javascript:i='[MEMBER_ID]';p='[PASSWORD]';f=document.createElement('form');g=document.createElement('input');h=document.createElement('input');g.setAttribute('name','id');g.setAttribute('value',i);g.setAttribute('type','hidden');h.setAttribute('name','pass');h.setAttribute('value',p);h.setAttribute('type','hidden');f.method="post";f.action="https://secure.amuse.co.jp/perfume/_perfume_login/index.php";f.appendChild(g);f.appendChild(h);document.body.appendChild(f);f.submit();

2008-02-23

はてなダイアリーコメント欄で特定IDコメントあぼーんするgreasemonkey

ついかっとなって書いた。動くことを優先で書いてるので、変なコードあるかも。

参考にしたもの:増田にあぼーん機能を追加するgreasemonkey

// ==UserScript==
// @name           hatena diary comment filter
// @namespace      http://anond.hatelabo.jp/
// @description    abone specified id's comments.
// @include        http://d.hatena.ne.jp/*
// ==/UserScript==
(function(){
   var ignore = [/kyoumoe/, /DASM/];
   var abonemessage = "abone";
    var commentatorIDs = document.evaluate('//a[@class="hatena-id-icon"]', document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
    for (i=0; i < commentatorIDs.snapshotLength; i++) {
        var commentatorID = commentatorIDs.snapshotItem(i);
        var idName = commentatorID.textContent;
        for (j=0; j < ignore.length; j++) {
            var isIgnoreID = ignore[j].test(idName);
            if(isIgnoreID) {
                break;
            }
        }
        if(isIgnoreID) {
            var commentator = commentatorID.parentNode;
            while(commentator.firstChild) {
                commentator.removeChild(commentator.firstChild);
            }
            commentator.textContent = abonemessage;
            var commentBody = commentator.nextSibling.nextSibling.nextSibling.nextSibling;
            while(commentBody.firstChild) {
                commentBody.removeChild(commentBody.firstChild);
            }
            commentBody.textContent = abonemessage;
        }
    }
})();

2008-02-18

Seahorse

// ==UserScript==
// @name はてなハイク
// @description NGID・NGKW・NGWORD
// @include http://h.hatena.ne.jp/*
// ==/UserScript==

// 以下でNG指定. NG判定は完全一致ではなく部分一致.
// NGID → エントリ(真ん中)やUsers/StarFriends(左側)が対象
ni=new Array('hatenahaiku');
// NGキーワードエントリ(真ん中)やStarFriends(左側)、Keywordバー(右側)が対象
nk=new Array('アダルトビデオにありそうなタイトル');
// NGワードエントリ(真ん中)が対象
//nw=new Array('うんこ');


// NGID エントリあぼーん
a=document.getElementById('main').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<ni.length;j++)if(a[i].href.indexOf(ni[j])>-1){p=a[i].parentNode.parentNode.parentNode.parentNode;if(p.className=='entry')p.style.display='none';}
// NGID Users/StarFriendsあぼーん
a=document.getElementById('leftbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<ni.length;j++)if(a[i].href.indexOf(ni[j])>-1){p=a[i].parentNode;if(p.tagName.toUpperCase()=='LI')p.style.display='none';p=a[i].parentNode.parentNode;if(p.className=='userkeyword')p.style.display='none';}

// NGキーワード エントリあぼーん
a=document.getElementById('main').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode.parentNode.parentNode;if(p.className=='entry')p.style.display='none';}
// NGキーワード StarFriendsあぼーん
a=document.getElementById('leftbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode.parentNode.parentNode;if(p.className=='userkeyword')p.style.display='none';}
// NGキーワード HotKeyword/RelatedKeywordあぼーん
a=document.getElementById('rightbar').getElementsByTagName('a');for(i=0;i<a.length;i++)for(j=0;j<nk.length;j++)if(a[i].innerHTML.indexOf(nk[j])>-1){p=a[i].parentNode;if(p.tagName.toUpperCase()=="LI")p.style.display='none';}

// NGワード エントリあぼーん
//a=document.getElementById('main').getElementsByTagName('div');for(i=0;i<a.length;i++)for(j=0;j<nw.length;j++)if(a[i].className=='body')if(a[i].innerHTML.indexOf(nw[j])>-1){p=a[i].parentNode.parentNode;if(p.className=='entry')p.style.display='none';}

2008-01-27

anond:20080127103706

トラックバックツリーを表示するときに、最初に自分の位置にスクロールしていてくれるとありがたい。

いまどこだったか見失わなくてすむので。

トラックバックツリーのノードアンカー(<a name>)つけて、

記事の「トラックバック」から飛ぶときに #tb ではなく自分のアンカーに飛ぶ、みたいな。

もちろん #tb を自分ノードに付け替えるんでもいいんだけど。

Firefox好きならgreasemonkey拡張機能で何とかしてみようぜ

http://anond.hatelabo.jp/20080127094645

oncontextmenuで禁止してるのを無効にするgreasemonkey書いてみた。

onmousedownで禁止してるのは無理だった。

http://userscripts.org/scripts/source/21614.user.js

// ==UserScript==
// @name          Allow Rightclick
// @namespace     http://www.petitnoir.net/
// @description   
// @include       *
// ==/UserScript==


(function (){
	var w = (typeof unsafeWindow == 'undefined') ? window : unsafeWindow;
	function unprotect(){
		var contextmenus = document.evaluate('//*[@oncontextmenu]',document,null,XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,null);
		for (i=0; i < contextmenus.snapshotLength; i++) {
			handler = contextmenus.snapshotItem(i).getAttribute("oncontextmenu", false);
			if(handler.match("return false")){
				if(handler.match(/alert\(\S+\)/)){
					handler = handler.replace(/alert\(\S+\);/, "");
				}
				handler = handler.replace("return false", "return true");
				contextmenus.snapshotItem(i).setAttribute("oncontextmenu", handler,false);
			}
		}
	}
	
	var onload = w.onload;
	if (onload) {
			w.onload = (function(){
				onload();
				unprotect();
			})();
	}else{
		unprotect();
	}
})();

nikkansports.comで右クリックを有効にしたい。その2 - Muibrogを参考にした。文京区図書館のならこっちのスクリプトでも無効にできるよ。

2008-01-07

ビルド失敗

またか。

俺はため息をついた。

365: alternative_crew.set(CREW.NAME, name);

なんどやってもビルドができない。

356行目のエラーがどうしても理解できない。

変数の宣言は間違いない。

直前の行で宣言しているから、スコープも大丈夫だ。

括弧の閉じ忘れが無いことは専用ツールで確認した。

時計の針はコツコツと時間の経過を告げる。

あたりはもう真っ暗だ。

もう二日も徹夜してる。

はっきり言って、頭は昨日から回らなくなっている。

それでも画面の前に張り付いているのは、期限が迫っているからだ。

期限が迫っているというムチは、ずっと俺に緊張感を与え続けてきた。

だが、体は疲労に対して従順だった。

気がついたときにはもう、俺の船の大半が破壊されていた。

ここでキャンペーンが終了した。

逆転をかけて、競技用AIの最終調整をしていたがついに間に合わなかった。

AIが操作する宇宙船の攻撃を受け、俺の船はすでに沈没していた。

このキャンペーンを勝ち抜いた8名のシステムエンジニアに次の予選会場の場所と開始時刻が告げられると、会場からあっというまに人の気配が消えていく。

俺はつかれきった体を横にしながら、機材を片付けていく他のプレイヤーぼんやりと見つめていた。

敗因はなんだったのか。

旧式のTHzにも満たないCPUを使ったのがいけなかったか。

バスクロックも遅いし、ユーザインターフェースも遅い。

画面の解像度も低いし、ハードディスクのシーク速度も足りてない。

他のプレイヤーを見ろ。

大きなブレードサーバラックなんて持ってきてやがる。

俺のおんぼろPCでどうやって勝てというのだ!?

だが、スペックの問題よりも致命的なのがアルゴリズムだった。

それをうまく組み立てられなかった自分のふがいなさをどうしても認めたくなかった。

挙句の果てには、キーボードの触り心地が悪かったのではないかとさえ、思えてきた。

だめだ。

ここに居たら、いつまでも変なことばかり考えてしまう。

俺は逃げるように会場から機材を運びだし、車に積み込んだ。

外は真っ暗で、頬をなでる冷たい風が気持ち良かった。

今頃になって、いいアルゴリズムを思いついた。

俺はぷっと思わず吹き出してしまった。

2008-01-04

JavaScriptニコニコ動画を殺すか?

JavaScriptサイトの見え方を変えることができる。ニコニコ動画からほとんど広告を消すこともできる。オペラだったらこんな感じ。

// ==UserScript==
// @name      test
// @include   http://www.nicovideo.jp/watch/*
// @author    test
// @version   0.0.1
// ==/UserScript==

(function(){
    //DOM?の取得
    var elemAuthorsComment = document.getElementById("WATCHHEADER").getElementsByTagName("p")[2];
    var tableTagList = document.getElementsByTagName("table");
    var elemTag = tableTagList[7];
    var elemCommentAndMyList = tableTagList[8]
    
    
    
    //削除
    myDeleteById("PAGEHEADER");
    myDeleteById("WATCHHEADER");
    myDeleteById("WATCHFOOTER");
    myDeleteById("PAGEFOOTER");
    
    
    
    //作者コメントタグなどの追加
    document.body.appendChild(elemAuthorsComment);
    document.body.appendChild(elemTag);
    document.body.appendChild(elemCommentAndMyList);
    
    
    
    //関数
    function myDeleteElement(elem){
        elem.parentNode.removeChild(elem);
    }
    
    
    function myDeleteById(id){
        var elem = document.getElementById(id);
        myDeleteElement(elem);
    }
})();

まぁ、一箇所残ってるけど。こんな風に簡単に広告を消すことができる。GmailについてもFirefoxGreasemonkey広告を消す拡張がある。JavaScriptを使えばこんな風に広告を消すことができるのだけど、これは企業側にとっては脅威だ。ネットサービスを提供する企業は主に広告収入によって、収入を得ている。しかしJavaScriptによってそれがなくなってしまうと広告収入が減る。現段階ではまだJavScriptを使うのは敷居が高いし、そもそもGreasemonkeyのようなブラウザ向けのユーザースクリプトがあること自体知られてないだろう。だから今はまだいい。しかし今後ブラウザ向けのユーザースクリプト認知され、だれかが書いたJavaScriptを簡単に使えるようになったらどうなるのだろうか?IEを主に使うような普通の人でも特定のサイト広告がうざいからそれを消すためのユーザースクリプトを探すようになるかもしれない。そうなったらJavaScriptニコニコ動画を含めたウェブサービス企業を殺すのだろうか?

2008-01-02

http://anond.hatelabo.jp/20080101232846

フィルター方式にしたら良い感じかな。

petternに弾きたいものを正規表現で指定したら、同じドメインでも選別できるし。

Firefox(Greasemonkey
// ==UserScript==
// @name           hatebufilter
// @namespace      hatebufilter
// @include        http://b.hatena.ne.jp/entrylist*
// ==/UserScript==

var pattern = "nicovideo\.jp";
filtering( "div", "entry", pattern );

function filtering( tag, name, pattern ){
    var entrylist = document.getElementsByTagName( tag );
    
    for( var idx = 0; idx < entrylist.length; idx++ ){
        if(entrylist[idx].className == name){
            if( entrylist[idx].innerHTML.match( pattern ) ){
                entrylist[idx].parentNode.removeChild( entrylist[idx] );
            }
        }
    }
}

はてブメタブックマークがうざすぎる

なのでJavaSciptの勉強がてら、メタブックマークを見えなくするユーザースクリプトを作った。DOMがよくわからないので変なところがあるかも。スコープノードリストなんかもよくわかってないので、無駄なところもあるかも。

以下ソース

Opera用
// ==UserScript==
// @name      Metabu Eraser
// @include   http://b.hatena.ne.jp/entrylist*
// @author    Hatena Anonymous User MASUDA
// @version   0.0.1
// ==/UserScript==
(function(){
    document.onload = main;
    
    
    function main(){
        var entryList = filterByTagAndClass("div", "entry");
        
        checkAndErase(entryList);
    }
    
    
    function filterByTagAndClass(tag, name){
        var list = document.getElementsByTagName(tag);
        var newList = [];
        
        for(var i = 0; i < list.length; i++){
            if(list[i].className == name){
                newList.push(list[i]);
            }
        }
        
        return newList;
    }
    
    
    function checkAndErase(nodeList){
        for(var i=0; i < nodeList.length; i++){
            var elem = nodeList[i].getElementsByTagName("a")[0];
            
            if(elem.href.substring(0,50) == "http://b.hatena.ne.jp/entry/http://b.hatena.ne.jp/"){
                nodeList[i].parentNode.removeChild(nodeList[i]);
            }
            
        }
    }
})();
Firefox(Greasemonkey)
// ==UserScript==
// @name          Metabu Eraser
// @include       http://b.hatena.ne.jp/entrylist*
// @description   version:0.0.1
// ==/UserScript==

main();

function main(){
    var entryList = filterByTagAndClass("div", "entry");
    
    checkAndErase(entryList);
}

function filterByTagAndClass(tag, name){
    var list = document.getElementsByTagName(tag);
    var newList = [];
    
    for(var i = 0; i < list.length; i++){
        if(list[i].className == name){
            newList.push(list[i]);
        }
    }
    
    return newList;
}


function checkAndErase(nodeList){
    for(var i=0; i < nodeList.length; i++){
        var elem = nodeList[i].getElementsByTagName("a")[0];
        
        if(elem.href.substring(0,50) == "http://b.hatena.ne.jp/entry/http://b.hatena.ne.jp/"){
            nodeList[i].parentNode.removeChild(nodeList[i]);
        }
    }
}

2008-01-01

はてブニコニコ動画へのブックマークがうざすぎる

アイドルマスターとか初音ミクとか。

なのでJavaSciptの勉強がてら、ニコニコ動画関連のブックマークを見えなくするユーザースクリプトを作った。DOMがよくわからないので変なところがあるかも。スコープノードリストなんかもよくわかってないので、無駄なところもあるかも。

以下ソース

Opera
// ==UserScript==
// @name      NicoNico Eraser
// @include   http://b.hatena.ne.jp/entrylist*
// @author    Hatena Anonymous User MASUDA
// @version   0.0.1
// ==/UserScript==
(function(){
    document.onload = main;
    
    
    function main(){
        var entryList = filterByTagAndClass("div", "entry");
        
        checkAndErase(entryList);
    }
    
    
    function filterByTagAndClass(tag, name){
        var list = document.getElementsByTagName(tag);
        var newList = [];
        
        for(var i = 0; i < list.length; i++){
            if(list[i].className == name){
                newList.push(list[i]);
            }
        }
        
        return newList;
    }
    
    
    function checkAndErase(nodeList){
        for(var i=0; i < nodeList.length; i++){
            var elem = nodeList[i].getElementsByTagName("a")[0];
            
            if(elem.href.substring(0,30) == "http://www.nicovideo.jp/watch/"){
                nodeList[i].parentNode.removeChild(nodeList[i]);
            }
            
        }
    }
})();

Firefox(Greasemonkey)
// ==UserScript==
// @name          NicoNico Eraser
// @include       http://b.hatena.ne.jp/entrylist*
// @description   version:0.0.1
// ==/UserScript==

main();

function main(){
    var entryList = filterByTagAndClass("div", "entry");
    
    checkAndErase(entryList);
}

function filterByTagAndClass(tag, name){
    var list = document.getElementsByTagName(tag);
    var newList = [];
    
    for(var i = 0; i < list.length; i++){
        if(list[i].className == name){
            newList.push(list[i]);
        }
    }
    
    return newList;
}


function checkAndErase(nodeList){
    for(var i=0; i < nodeList.length; i++){
        var elem = nodeList[i].getElementsByTagName("a")[0];
        
        if(elem.href.substring(0,30) == "http://www.nicovideo.jp/watch/"){
            nodeList[i].parentNode.removeChild(nodeList[i]);
        }
    }
}

まぁ、これだと初音ミクアイドルマスター以外の動画も見えなくなるんだけどね。

つーかJavaScriptだとPythonみたいなfor文使えないの?

2007-12-30

Re: anond.IrisがIEで使用不可になってるっぽい

> ってどこに通報したらいいの?

一応 about の所にしていただけるとありがたいです。

機能追加で不具合出てました。name属性id属性が被ってました。IEでチェックしてませんでした。つか、IE常用できる環境じゃないのでごめんなさい。

でもって、返信フォームつけてみたけれど、操作感がイマイチIEで動かない。少しずつ改良していきます。

2007-11-30

[][]Sites Powered by Ruby or Ruby on Rails

Nitro and Og

Meet beautiful people | Joyerz 

home [Ramaze]

sites-powered-by-ramaze [Ramaze]

Applications created with Ruby on Rails

Twitter Twitter創始者が語るWeb 2.0の要諦 − @IT

ウィリアム氏がOdeo内で始めた小さなプロジェクトが「Twitter」だ。

Ruby on Railsを使って2週間で最初の動くバージョンを作り上げたという。


Ruby on Railsで10分で作るTwitterもどき - ZDNet Japan

Railsでブログを作ろう!(Creating a Weblog in 15 minutes) - hp12c

食べログ 月間380万人が利用するグルメのNo1クチコミサイト『食べログ.com』、Ruby on Railsを採用し、フルリニューアル - 株式会社カカクコム - ZDNet Japan

3行で要約します。 - 3lines.info 3行で要約するサービスつくったよ! - $ dropdb 人生

いいめもプロジェクト 田口元の「ひとりで作るネットサービス」探訪:【番外編】開発合宿で出会った3人が作ったお小遣い帳 (2/2) - ITmedia Biz.ID

Fooo.name!! 田口元の「ひとりで作るネットサービス」探訪:もっと自分の知らない情報や人とつながっていきたい──fooo.name・高村さん (2/2) - ITmedia Biz.ID

ToDo項目をドラッグ&ドロップで移動させたり、画面遷移なくその場で項目を編集できたりといった機能を実装していった。

Ruby On Railsのおかげで開発は順調だった。

Ruby勉強も含めて全部で1カ月ちょっとくらいしかかかりませんでしたよ」


Ruby オブジェクト指向スクリプト言語 Ruby

RetroTube COBOLプログラマがRubyで挑む!RetroTube開発記---目次:ITpro

tDiary.org

Welcome : Typo

Mephisto??The best blogging system ever  Mephisto?? Large Mephisto Deployment

Radiant

Ruby勉強も含めて全部で1カ月ちょっとくらいしかかかりませんでした

田口元の「ひとりで作るネットサービス」探訪:もっと自分の知らない情報や人とつながっていきたい──fooo.name・高村さん (2/2) - ITmedia Biz.ID

ToDo項目をドラッグ&ドロップで移動させたり、画面遷移なくその場で項目を編集できたりといった機能を実装していった。

Ruby On Railsのおかげで開発は順調だった。

Ruby勉強も含めて全部で1カ月ちょっとくらいしかかかりませんでしたよ」

2007-11-15

昨今のスイーツ(笑)事情

つまりこういうことですよね!

// ==UserScript==
// @name            kakko-waranizer
// @include         http://anond.hatelabo.jp/*
// ==/UserScript==

(function(){
  document.body.innerHTML = document.body.innerHTML.replace(/\u3002/g, '\uff08\u7b11\uff09');
  document.body.innerHTML = document.body.innerHTML.replace(/\uff01/g, '\uff01\uff08\u7b11\uff09');
  document.body.innerHTML = document.body.innerHTML.replace(/\uff1f/g, '\uff1f\uff08\u7b11\uff09');
})();

2007-10-26

ブックマークスパム多重アカウント疑惑(関西暴力団アダルトサイト)

アカウントを大量に所持し、ブックマークスパムを繰り返して情報操作を行っているとの疑惑について。

 

ソース

http://b.hatena.ne.jp/entry/http://5.movie-connection.com/

 

同一人物が管理運用ブックマークをつけていると思われるユーザーIDは以下の通り。

id:yh4a1uj4r2ew id:kelopa id:xn--icktho51ho02a id:jk23d1sx id:kd1321ks3241 id:ldf132d11h1h id:z1sx12tfd3g1h id:juhytfsdsadgh id:udfhfkrio id:srtyukrgnyujk id:ojkhfetybjhji id:ohgtyihgdryu id:lapvnfdkxsldie id:lphybcgfn id:adeftgvmkhg id:dkfjfureydkdlcjdh id:yglpsjeyfg id:ijuyvnfjko id:yutydfre id:ueowidkei id:uloijeiss id:ieowicvkhjl id:kiebjieudls id:iueiwodjbmf id:utiuyeowos id:ioiojfibalsieu id:uurwoisoigbm id:lakaiajaigiekwl id:iuwoiunolzzxc id:uaoiuveullsiu id:hilineosilew id:hy4a654yer id:kisiritooru id:bh6s34 id:hs3s4 id:sd3gf35 id:dtbghj354 id:sfgsfg5 id:fsgs5646f id:dgsf5453 id:adf3a432aa id:af3432sss id:af34a34a id:aef4afae id:dfae324adef id:fae456ae id:fgaera4654ae id:fatre354adf id:agfa3245atae id:gafea4854s3r id:fata6541aga id:agaw32456afga id:aea453165g id:a6544a id:gae52487r id:gae284tg id:gfaefa8543ht56f id:ws21496af id:hgara354ga id:hseg5154f id:ada254f id:dae326a id:dsf6454sfd id:dfs654654sdf id:jah4785 id:anj1458 id:hajba54716 id:dafh478549 id:ajdk14785 id:dh215 id:dh21485 id:dj54ds5 id:ys65 id:nsd1485 id:bhs1th8545 id:syh5 id:sth18 id:hth51 id:hs24t8 id:h8t4hg5 id:jdydt8452s id:fa414a7yh5 id:a464ag5 id:a4189j1a45 id:hs34h654a id:s65ts54hg id:a654ya id:a68t4a8a46a id:aga56444ga id:a64a5at4r id:g23r6s2s id:sa5546y6a id:ju54a56sa id:ha56ag64a id:at568421sae id:ae5234afre id:yws35t25a56 id:ga5g24e42d id:j7j54g8 id:yjs6t581f id:ts515gt8 id:shj321js5r7 id:sjs4851s2 id:js24sh16 id:je6a15ta21 id:shj3549s id:jhs548s35 id:shs95s47 id:shs54s54 id:sys54sy54 id:sh24158hs id:stsrs547s id:str5s47 id:sts548 id:sr514h2s5 id:sg5rg5487s id:s5rtsf4578 id:htrsg548 id:srsag9544s id:hs54s87h id:hjsr51s56 id:hsfsg484s id:ggg48 id:f2r4t25f1 id:ik1gtf5y5 id:ta64a2eerr id:ya6y4a21y487a id:a654y2a34a id:ayt67a4ewe5 id:yfag56a15ewr63 id:a64a524rehgy3 id:ua327a3a id:uhwe354gt4r id:aekds34a1r54a id:h674atat id:hay64e314w id:yayuh354a31a id:a56a065syt0a id:g0a6544ae56e0 id:a655ya15ea id:dk6ldk3sdk id:dtu6fj63dhs id:druik5kdgt id:g6gd52cud id:fkuf34gk id:fogvk3fiuy5 id:jdshb25hdsjh3s id:dst6hjdsh5h id:dj5dhjs5dsh id:jdf5dj5d id:djjdsh52dj id:shs64jhs id:h56dj65sh id:jdt3jdsh id:shsth5dh id:shs5hshs id:hjsr1465s id:h3s343 id:sdjszf34sauj id:hargf8ahg id:hsaar3setat id:arg2srggarr id:jhs56dhs id:taa354ha id:gsar34sga id:hara6agar id:gafg63gha id:hsfdh3zh id:aghs6ga id:yhxd52gh id:arett3agta id:fga63rfgas id:asarg3agtg id:sg6a id:agtta52sgha id:aa6hatta id:jysrah5shsra id:ash5gfa id:gadaf2atgta id:atr4hsfda id:hsr35hggar id:jyesr35ad id:dga5ata id:ae2satf id:hga57shye id:hhy54 id:ar35454a id:ae6354sarr id:ueko22toteti id:ueko21toteti id:ueko20toteti id:ueko19toteti id:ueko18toteti id:ueko17toteti id:ueko16toteti id:ueko15toteti id:ueko14toteti id:ueko13toteti id:ueko12toteti id:ueko11toteti id:ueko10toteti id:ueko09toteti id:ueko08toteti id:ueko07toteti id:ueko06toteti id:ueko05toteti id:ueko04toteti id:ueko03toteti id:ueko02toteti id:ueko01toteti id:uttyann137 id:uttyann136 id:uttyann135 id:uttyann134 id:aea34g34 id:uethy234 id:sj684stt8dgh4 id:uttyann122 id:uttyann120 id:uttyann130 id:uttyann133 id:uttyann132 id:uttyann131 id:uttyann129 id:uttyann128 id:uttyann127 id:uttyann126 id:uttyann125 id:uttyann124 id:uttyann123 id:uttyann121 id:uttyann119 id:uttyann117 id:kye851dj4d id:asjdyj541dsu id:ijkfd48415 id:sjhty5445d id:jfsj8yx5yy4 id:hs5741a5 id:hid3543ik id:e7g3avc1h3s id:af34a354fa4 id:hsth5723 id:ghs9845s id:fsr84sg145 id:adfa18fgs2 id:da354ga id:g345ag id:hg54gj5 id:gjs354s1 id:ahotte47484 id:afa84727h id:aaa5454awg id:d4f75hgd4 id:gh75h8d4 id:s6d5c9 id:s427a8s7 id:f417f82g5 id:zz9578zgf id:f45f478z id:f454f4599 id:fdfdf8479 id:fsdfg245 id:hikken id:kuro_utopia id:yuri_hanataba id:toge_hitoki id:kuroi_maria id:syounen_boy id:spray_de_egaita id:nite_and_day id:like_a_angel id:kuro_no_postol id:sea_you id:beams_ah_beams id:yasashii_higeki id:ice_my_life id:for_dear id:mac_wo_kiwameru id:powerbook_g id:my_win_good id:my_mac_saikou id:wansegu_yoi id:selves_xxxx id:in_sairensu id:dezaia_l id:end_obu_sorrow id:ra_se_n id:g_god_g id:wizu_rabu id:fakexxxx id:civilize_luna id:feisu_to_feisu id:inoran_ken id:true_b id:call_for_love id:ueto_dakishime id:ueto_kiss id:ueto_renai id:genki_c id:hutsuka_yoi id:atama_itai id:orona_min_c id:kasaneta_kuti id:kasaneta_yubi id:queen_for_you id:mist_of_tears id:hatujouki id:more_trance id:risoukyou id:shilk_shilk id:last_eve_for id:equal_jesus id:sutekina_yume id:i_believe_y id:tsuki_wo_omou id:chess_chess id:nugget id:karatani id:cocoron20 id:kami_ga_warau id:the_slain id:kagirinaku_t id:shade_shade id:branch_road id:samdhi_taimu id:taimu_izu id:precious_xxxx id:decide_ones id:ima_ha_fate id:hurry_up_mode id:milmilmilmil id:ayapon565

 

多重アカウントを所持しブックマークスパムを支持していると思われる業者のドメイン(の一部)はこれ。

 

high.movie-connection.com

5.movie-connection.com

4.movie-connection.com

2.movie-connection.com

1.movie-connection.com

www.movie-connection.com

xn--cck0cya3lt22posxn4qgqh.movie-connection.com

www.movie-connection.com

azuqun.blog103.fc2.com

mlink.blog111.fc2.com

eroikoeroiko.eroiko-daisuki.com

sexs.sex-sexs.net

de.coco-de-aeru.net

ero.ero-moe.net

xn--n8j214gc5b6wwz3a.sblo.jp

xn--h9ja3mb0426g1hwa.sblo.jp

ブックマークスパムによる情報操作を発注していると思われるMOVIE-CONNECTION.COMについての情報分析。

Domain Name: MOVIE-CONNECTION.COM
Registrar: KEY-SYSTEMS GMBH 
Whois Server: whois.rrpproxy.net 
Referral URL: http://www.key-systems.net 
Name Server: NS1.VALUE-DOMAIN.COM 
Name Server: NS2.VALUE-DOMAIN.COM 
Name Server: NS3.VALUE-DOMAIN.COM 
Status: ok 
Updated Date: 15-mar-2007 
Creation Date: 15-mar-2007 
Expiration Date: 15-mar-2008 
DOMAIN: MOVIE-CONNECTION.COM 
RSP: DigiRock Inc. 
URL: http://www.value-domain.com 
created-date: 2007-03-15 
updated-date: 2007-03-15 
registration-expiration-date: 2008-03-15 
owner-contact: P-TGK215 
owner-organization: Personal 
owner-title: student 
owner-fname: takahiro 
owner-lname: kubo 
owner-street: koyama1-1-5 None 
owner-city: koubesinisiku 
owner-state: hyougo-to 
owner-zip: 651-2144 
owner-country: JP 
owner-phone: 090-1005-6622
owner-email: gongongon1221@yahoo.co.jp 
admin-contact: P-TGK215 
admin-organization: Personal 
admin-title: student 
admin-fname: takahiro 
admin-lname: kubo 
admin-street: koyama1-1-5 None 
admin-city: koubesinisiku 
admin-state: hyougo-to 
admin-zip: 651-2144 
admin-country: JP 
admin-phone: 090-1005-6622 
admin-email: gongongon1221@yahoo.co.jp 
tech-contact: P-TGK215 
tech-organization: Personal 
tech-title: student 
tech-fname: takahiro 
tech-lname: kubo 
tech-street: koyama1-1-5 None 
tech-city: koubesinisiku 
tech-state: hyougo-to 
tech-zip: 651-2144 
tech-country: JP 
tech-phone: 090-1005-6622 
tech-email: gongongon1221@yahoo.co.jp 
billing-contact: P-TGK215 
billing-organization: Personal 
billing-title: student 
billing-fname: takahiro 
billing-lname: kubo 
billing-street: koyama1-1-5 None 
billing-city: koubesinisiku 
billing-state: hyougo-to 
billing-zip: 651-2144 
billing-country: JP 
billing-phone: 090-1005-6622 
billing-email: gongongon1221@yahoo.co.jp 
nameserver: ns1.value-domain.com 
nameserver: ns2.value-domain.com 
nameserver: ns3.value-domain.com 

<<

どうやらブックマークスパムの元締め関係者は、神戸市西区小山クボタヒロという人らしい。(偽名の可能性あり)

なお、登録されている電話番号は090-1005-6622だが、この電話番号でググルとこの出会い系サイト利用規約に書いてある電話番号と完全に一致する。

 

http://72.14.235.104/search?q=cache:tjQsEzlAt-UJ:love-ag.com/use.html

<第1条> 目的

規約は会員が無料コンテンツサービス[LOVEアゲイン](以下、弊社又は当サイト)を利用する上で遵守すべき規約を定める事を目的とします。 個人間で発生したトラブルには一切の責任を負いかねます。

(略)

【管理主】〒542-0067 大阪府大阪市中央区松屋町9-20

管理者:木村勇登

TEL:090-1005-6622

MAIL:info@love-ag.com

さらにこのlove-ag.comというドメインWhois検索するとこういう情報が出てくる。

 

Domain Name: LOVE-AG.COM 
Registrar: ENOM, INC. 
Whois Server: whois.enom.com 
Referral URL: http://www.enom.com 
Name Server: NS1.LOVE-AG.COM 
Name Server: NS2.LOVE-AG.COM 
Status: clientTransferProhibited 
Updated Date: 23-oct-2007 
Creation Date: 04-oct-2007 
Expiration Date: 04-oct-2008 
Domain name: love-ag.com 
Registrant Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Administrative Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Technical Contact: 
personal 
masasi odazima (iyaiyatereruna@yahoo.co.jp) 
+80.52368569 
Fax: - 
aogakidai 1-3 none 
nara-shi, nara-ken 631-0053 
JP 
Status: Locked 
Name Servers: 
ns1.love-ag.com 
ns2.love-ag.com 

ドメイン奈良県奈良市青垣台のオダジママサシなる人物が管理しているらしい。(やはり偽名の可能性あり)

 

以上の情報から分析すると、数十のアダルトサイトを同時に運用している組織による情報操作であることから、前述の疑惑はてなIDは、関西組織暴力団関係者によって運用されている可能性は極めて高いと思われる。

2007-10-23

tinycafe「私の通報は108式まであるぞ」

 朝早くからお疲れ様、tinycafe先生

自分のところに書いたのと、ほぼ同様の記事を増田にも流すってどういう意味があるんだか、正常な思考能力の持ち主たる自分には全く理解できかねるんだけど。

http://anond.hatelabo.jp/20071023072239

http://d.hatena.ne.jp/fuwaridays/20071023/1193091307

http://jp.cyworld.com/ps/ps_board_view.php?mh_id=7000078623&menuid=12&postid=539&startpos=&search_value=&search_key=&viewtype=all#

 一番下の記事によると、どうもネットからの通報らしいね。っていうか、いつも何かしら通報しているようだね。

その割に「前川祥子」なる人物(tinycafeが具体的にどんな被害を受けたのかは存じません)は捕まらないね。本当に通報しているなら、証拠不十分か、事件性なしと判断されているんじゃないのかな?

 それから、tinycafe先生日本語筆記能力が少し可愛そうなので、以下の字面をそのまま鵜呑みにしていいかどうかはわからないけど、

http://jp.cyworld.com/ps/ps_diary_view.php?mh_id=7000078623&menuid=10&folderid=&folder_type=0&postid=&diary_date=&name=&viewtype=all

母も旅行から戻ってくるし(遅いけど 笑)、

酒の肴も用意しておいた方がいいかもな。。。

今日日記に書かれているので、たぶん明日なら親御さんがいらっしゃるのでしょう。

 念のため、d:id:kyoumoeの人は予め地元警官か、弁護士同伴で話をしに行った方がいいのかもしれないね。あと、彼女の裏の顔、“朝霞沙耶”についても忘れない方がいいと思いますよ。今度こそキッチリ片を付けて来られることを、増田からこっそり応援していますよ。

*追記*

 まだこんなこと言い続けているのか。攻撃対象で誰が書いたか特定できてしまうんだから、自分のとこでやって下さいよ(今日増田は気力が続く限り監視予定)。

http://anond.hatelabo.jp/20071023085246

私を怒らせた罪は一生かかっても償えはしない。

 随分偉いお人なんですねえ。恐らく自分王国内だけでしょうけど。まあ、そのお山の大将今日限りで引退した方がよさそうですよ。好む好まざるに関わらず。

というか、精神病院への通院を強くお奨めしておきます。

http://anond.hatelabo.jp/20071023095747

 はあ、やはり思った通り“通報”という言葉は全部そこに飛ばしているわけですか。いやね、向こうのお人もお役人なわけですから、恐らくは

「またtinycafeからか!」と思ってろくに読んでいないのでは?と思いますが。本当に通報していて何の返答もないのなら、既に電波ちゃん扱いされているのでは?と考えましょうよ。って言うか、頼むから社会で通用するような思考能力を持ってくれ(;´Д`)

http://anond.hatelabo.jp/20071023104844

 誰か精神病院に連絡して下さい!これは相当ヤバイです。末期症状です!おまけに気持ち悪いって言ってます!

いや、別に自分の家でゲロ吐いている分には構わないんだけどさ、ネットで毒吐くのは止めろっての。

 あと、お前さんは過去に関わった人なら、恩に着るべき人も、DISられた人も全部一緒くたにしちゃうんだね。そういう精神構造なのね。常識がわかっていないのも、脅迫するのも全部tinycafeの仕業でしょうが。本当にいい加減にしておけよ。

 …と思っていたら、彼女のページにて自作自演発見

http://jp.cyworld.com/ps/ps_board_view.php?mh_id=7000078623&menuid=12&folderid=39&folder_type=2&postid=555&name=&viewtype=&startpos=1#

 これはひどいこれはひどいd:id:kyoumoe氏は、これも彼女の罪状の一つに加えるべきでしょう。本当にtinycafeって人としてどうなの?

http://anond.hatelabo.jp/20071023110239

 もう言及する言葉が見つからない。明日、kyoumoe氏が伺うことで毒吐きネットライフが終わるという自覚があるから、狂い咲きサンダーロード状態なのであろうか。これらの汚い書き込みは、是非お父様、お母様に余すところなく読んでいただきたいと思います。

http://anond.hatelabo.jp/20071023115103

 …えーと、「自分以外全員悪い」って発想はどうにかできんものかね?「自分だけ全面的に悪い」って可能性もあるんだけどね。

http://anond.hatelabo.jp/20071023115556

http://anond.hatelabo.jp/20071023120903

http://anond.hatelabo.jp/20071023123400

 誰もtinycafeの仲間になんてならないって。だいたい「ストーカー」の定義がおかしいよ?tinycafeが些細なことでもう一年以上、kyoumoeに喧嘩を売り続けているだけじゃないの?

http://anond.hatelabo.jp/20071023121322

 ほう、ようやく新スレ発見したみたいだね。前述の通り「またこの人か!」で終了すると思うよ。と言うか、本当に自分の行動にやましいところがないと言い切れるの?「痛い」から観察対象になっているんですけど。

http://anond.hatelabo.jp/20071023124441

 出たよ!必殺「成りすまし」!出たよ!!こう言っておけば大概のことはスルーできるもんね。

http://anond.hatelabo.jp/20071023104844を書いた誰かを正確に捕捉して、19分後にはサイワールドコピペしてるんだね。言っておくけど、よほどの観察者でなければ捕捉しきれない、はてな外の人達ハンドルをずらっと列挙してあるんだが。

http://anond.hatelabo.jp/20071023151950

 え?「成りすまし」は「前川祥子の仕業」じゃなかったの?ここでまたd:id:kyoumoe氏のせいにするってのは、一体どんな心境の変化?

 最後に彼女の本家、サイワールドでは既に物事の正しい判断能力を失っているか、または物凄い言い掛かりを付けているのが観察できます。

http://jp.cyworld.com/ps/ps_board_view.php?mh_id=7000078623&menuid=12&postid=558&startpos=&search_value=&search_key=&viewtype=all#

愛知県警へのメールのお返事を公開します。

>>つきまとわれている状況に関して具体的な内容が記載されていません。

とのことでしたが、そのことについてお話しします。

私がホームページ上でデスクトップアクセサリの販売をやろうとしていたんですが、お金の支払いを郵送による小為替で、郵便局にて小為替を換金する形式をとったんです。

そのため小為替の郵送先として自宅住所を書いたメモを一緒に圧縮したんです。

それを不正アクセスなどを繰り返す無職少女(15)に無断で公開された為に、私は今とても危うい状況に追い込まれて居るんです。

そのストーカーは私が一方的に喧嘩を売っていると思いこみ、

また、ブログリンクを貼った位で逆上し、

ブログはこれです。⇒ http://d.hatena.ne.jp/kyoumoe

汚い言葉を使い、

挙げ句の果てには住所を調べて上がり込んでいくとまで言うんです。

私のせいで家族に何らかの危害が加えられるようなことになったら、

私は死んでも死にきれないだろうし、

その上、私の身までなんだか危険が及びそうで、怖いんです。

もう警察にすがるしかないと思いました。

私の住所をばらした不正アクセス犯の少女も手口がかなり酷いんです。

私のHNや本名を騙って暴言を吐くだけでなく、

他人のHPを盗んだり、掲示板ブログを抹消するなどと言った酷いこともやっているんです。

この二人は明らかに共犯です。

お互いに私を悪者に仕立て上げるためにやったに決まっています。

この二人に法的な罰を与えてやらなければ、私に二度と平穏なネットライフは訪れません。

助けてください。

警察の力が必要なんです。

 …(;´Д`)こりゃ大変だ!こんな素敵な陰謀をマジに愛知県警に送りつけたのか(;´Д`)

ええと、ここに登場する「無職少女」、これが以前から捕まえたいとか全ての元凶だとか言っている「前川祥子」のことだよね?危ないよd:id:kyoumoe氏!危ないよ!いつの間にか素敵思考回路で共犯にされているよ!明日はブラフじゃなくて本当に先方に訪問しないと大変なことになるよ!

 というか、tinycafe先生の頭の中が物凄く大変なのはよくわかった。彼女妄想の中で生き、妄想にまみれることで更にその妄想を肥大化させてしまい、既にネット上なら刃物無差別に斬りつけても構わないと考えているんだろうね。kyoumoeの中の人も大変だなあ。大変だけど、きっちり解決させなきゃならないよね。…というか、きっちり明日、ケリをつけてよ。危ない人の観察はもう懲り懲りだよ(;´Д`)

2007-10-14

pythonクラスを使ったけど

class BTree:
    def __init__(self, node_info=None):
        self.root = BNode(node_info)
        self.left = None
        self.right = None

    @classmethod
    def printNode(self, n):
        print "%s " % n.info,

    def walk(self, node = self.root, Execute=BTree.printNode):
        ... ...

walkメソッドは引数エラーがでる。selfがわかんないみたい。name 'self' is not defined

そりゃそうか、実行時にselfが決まるんだから。でもname 'BTree' is not definedになるのは何故?

2007-10-11

Re: 2つのメタブ

現在

確かに差は大きい。

で、このメタブ2(って何のことかわかりにくいのでメタブコメ、またはブコメタでどうだろう)なのだが、知っていても使いにくい。その一番の要因が、リンクされるページ自体は個人のブックマークのページであることだ。

ほとんどの場合、個人のブックマークページでは、そのコメントとその前後の内容はまったく関係がないものとなっている。一方エントリページの方はコメントした、つまりブックマークしたページの概要と、他の人のコメントがある。どちらへのリンクがのよりわかりやすいか、便利であるかは明白であろう。

よって、各エントリページの各コメントにもnameをつけるべきである。

2007-09-25

[]PHP VS Rails (Ruby on Rails)

PHP

404 Blog Not Found:そろそろPHPに関して一言いっとくか

PHPを使っても、知識は増えても知恵が増える気がちっともしないのである。


スラッシュドット ジャパン | Ruby on Railsは万能薬ではない

はてなブックマーク - スラッシュドット ジャパン | Ruby on Railsは万能薬ではない

COBOL技術者の憂鬱 - RailsからPHPへ

PHPプログラムを始めてみたい、難しいと思っている人の為に*ホームページを作る人のネタ帳

アフィリエイトは儲かんないってば:PHP初心者によるPHP入門 - livedoor Blog(ブログ)

1日平均13億3800万ページビューを誇るYahoo!JAPAN

この爆裂なアクセスを誇るYahoo!JAPANを支えているテクノロジーのひとつがPHPということでした。

PHPの車輪はバカに出来ない。使うに留めず使いこなしてからが面白い。*ホームページを作る人のネタ帳

service_YouTubeというPEARモジュールを使うと、YouTubeAPIを活用して驚くほど簡単に動画サイトが作れます。

指定したタグがついているすべての画像の一覧表示をいうのをservice_YouTubeを使うと以下の様な文で構築できます。


CakePHPで高速Webアプリ開発:第1回 CakePHPを使いたくなる5つの特徴|gihyo.jp … 技術評論社

Ruby

Shane's Brain Extension: A Ruby Interface to the YouTube API

YouTubeのAPIを使ってみる。 - t-imaizumiのMacとかのはなし

Flickrの画像をはてなに貼り付けるためのHTMLを取得するスクリプト。 - t-imaizumiのMacとかのはなし

InstantRails で 簡単 Ruby on Rails 体験

10分で作るRailsアプリ for Windows - masuidrive

ITmedia エンタープライズ:第1回 Instant Railsで始めるWindows環境のRails (1/2)

Matzにっき(2007-09-15)

Scaling Twitter: Making Twitter 10000 Percent Faster | High Scalability

平均毎秒600アクセスというのも興味深い情報

これは楽天の個別サービスアクセスよりも多い。


【特選フリーソフト】生産性の高いWeb開発環境 Ruby on Rails:ITpro

37signalsのBasecampはXeon 2.4GHz dual,メモリー2Gのサーバー2台で40万リクエスト/日を処理している。

他にも43Things.comでも20万リクエスト/日の処理


2005-12-31 - きんきん日記

Basecampはデュアル2.4GHz Xeon、2MBメモリマシン上で15個のFastCGIプロセス

50から100個のApache 1.3.xプロセスが動作している2つのWeb/アプリケーションサーバによって、

1日約40万リクエストを処理している。しかし、マシンのロードは通常0.5から1.5程度。

MySQLサーバは他の2つのアプリケーション(Ta-da ListとBackpack)で共有されていて、最大50万行のテーブルを持っている。

このMySQLは3つのアプリケーションから利用されているが、ロードは0.1から0.3の間で、ボトルネックにはなっていない。


Part2 Rubyに学ぶ「Ruby on Railsの正体」:ITpro

Railsを使うことで可能になる自然な英文に近い記述

1.day.ago # 現在時刻から1日前を表すTimeオブジェクト

10.years.from_now # 現在時刻から10年後を表すTimeオブジェクト

1.kilobyte # 1024

●productsテーブルからnameが'book',priceが2079であるようなProductオブジェクトを読み取り,存在しなかった場合はデータベースレコードを新規作成する処理

book = Product.find_or_create_by_name_and_price('book', 2079)


Ruby/Ruby on Rails/model/5分でわかるActiveRecord - PukiWiki

モデル.findで、名前がMr.C、年齢が30歳のレコードを検索

friend = Friend.find_by_name_and_age("Mr.C", 30)


2005-11-13 - きんきん日記


Ruby に挑戦

Ruby配列は賢い

$ irb

irb(main):001:0> a = [ 'dog', 'cat', 'sheep', 'horse' ]

["dog", "cat", "sheep", "horse"]

アルファベット順に並べ変えたいときは

irb(main):004:0> a.sort

["cat", "dog", "horse", "sheep"]

順序を逆にしたいときは

irb(main):005:0> a.reverse

["horse", "sheep", "cat", "dog"]

アルファベット順に並べて、順序を逆にしたいときは

irb(main):006:0> a.sort.reverse

["sheep", "horse", "dog", "cat"]


[Ruby]Ruby Python の比較

2007-09-23

増田の親スレッドのみ表示するproxomitronフィルタつくったよ!!

http://wakkaya.com/sukkirishimasuda.jpg

こんなふうにスッキリスレのみ表示できるよ!

既出だったらごめん><

[Patterns]
Name = "masuda"
Active = TRUE
Bounds = "<div class="section">*</div>"
Limit = 32767
Match = "<div class="section">*>anond*</div>"


[Patterns]
Name = "masuda"
Active = TRUE
Bounds = "<div class="section">*</div>"
Limit = 32767
Match = "<div class="section">*>http://anond*</div>"




設定方法は

http://aoix.hp.infoseek.co.jp/proxomitron.html

が分かりやすくておすすめだよ!

2007-09-07

ようこそ、℃-uteLisp の世界へ

発祥: http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/

はじめに

Scheme という Lisp 語族言語を用いて ℃-ute相関関係プログラムし、様々な角度から関係性を分析する手法を紹介していきます(ソースコードは最後に張ります)。

まずは、メンバー間の関係を「リスト」というデータ型で表現します。例えば「栞菜->愛理」という関係

(kanna . airi)

という形で表すことができます。これに、「大好き」という情報を付加し、ついでにその関係の性質を数値化したものを加えると

((kanna . airi) (desc "大好き") (score . 1))

のようになり、関係図における一つの矢印の情報データ化できたことになります(暫定的に、好意は 1、良好・中立は 0、険悪は -1 の3段階で表すことにします)。

メンバー間の全ての関係性をこのデータ単位で定義し、データベース化しておくことで、色んな条件に基づいた検索やスコア計算などが可能となります。

例 1: リンク状況の調査

ここで相関関係図における矢印を「リンク」と呼ぶことにして、あるメンバーから他のメンバーへどのようにリンクし、またリンクされているかを調べることができます。

関係の中からリンクの起点を抽出してソートしてみると

(sort-nodes (number-list (from-links)))

結果:

((kanna . 6) (saki . 5) (maimi . 4) (erika . 3) (mai . 3) (chisato . 3) (airi . 2))

栞菜ちゃんがメンバー全員にリンクを張っていることが分かり、℃-ute ラブっぷりが伺えます。なっきーにも同様の事が言えます。例の「女の子が好き」発言を数値的に裏付ける結果と言えるかもしれません。

ただ、データ不足でリンク件数がまだ少ないのと、リンクの性質(好意/反感など)までは分からない点を考慮する必要があるでしょう。

例 2: 被リンク状況の調査

同様に、リンクの終点の件数を調べてみます。

(sort-nodes (number-list (to-links)))
((chisato . 5) (erika . 5) (kanna . 4) (maimi . 4) (airi . 4) (mai . 3) (saki . 1))

えりかちゃんと千聖ちゃんが高ポイントです。メンバーからの人気や注目度の高さを示すデータですが、千聖ちゃんの場合敵対的なリンクが2件含まれている点に注意してください。

なっきーの被リンク数が極端に少ないですが、単純にデータ不足のためだと思われます。はぶら(ryとか言わないようにお願いします。

例 3: 愛情度の評価

リンクに付随するスコアを計算することで、愛情の度合いを測ることができるのではないか、という考えに基づく研究です。

まず、全ての関係性を対象として、スコアマイナス関係を抽出してみます。

(filter-nodes (lambda (n)
		(< (score-relation n) 0)))

結果:

(((kanna . chisato) (desc "愛理に手出すんじゃねぇよ") (score . -1))
 ((saki . chisato) (desc "愛理に手出すんじゃねぇよ") (score . -1)))

件数だけを得ると

(length (filter-nodes (lambda (n)
			(< (score-relation n) 0))))
2

僅か2件です。

良好・中立的な関係

(length (filter-nodes (lambda (n)
			(= (score-relation n) 0))))
8

愛に満ちた関係

(length (filter-nodes (lambda (n)
			(> (score-relation n) 0))))
16

非常に多いです。舞美ちゃんの「℃-ute同士でラブラブなんですよ」発言(例のラジオ)を数値的に裏付ける結果と言えるんじゃないでしょうか。

次に、メンバーごとのスコアを算出してみます。Lisp 的には以下のようにフィルタリングと畳み込み (fold) で計算することができます。例えば

(foldr (lambda (n acc)
	 (+ (get-score n) acc))
       0
       (filter-nodes (cut to? <> 'kanna)))

栞菜ちゃんに対するリンクスコアが得られます。結果:

3

上式を一般化して一挙にメンバー全員に適用してみると

(sort-nodes (map (lambda (x)
		   (cons x (score-loved x)))
		 (all-members)))

結果:

((airi . 4) (kanna . 3) (mai . 2) (erika . 2) (maimi . 2) (saki . 1) (chisato . 0))

愛理ちゃんが好意を寄せられやすい傾向が伺えます。

今度は逆方向のスコアを計算してみると

(sort-nodes (map (lambda (x)
		   (cons x (score-loving x)))
		 (all-members)))
((kanna . 3) (maimi . 3) (chisato . 2) (airi . 2) (saki . 2) (mai . 1) (erika . 1))

まいまいえりかちゃんが特に堅い・一途だという傾向を読み取ることができます。

例 4: 相性の調査

今度は組み合わせ(カップリング)の評価です。

2点間相互のリンクスコアを加算したものを「相性」と考えられるものとします。最大値 (互いに好意を寄せている場合の数値) は現在スコアリング方式では 2 です。例えば

(score-between 'kanna 'airi)

の値は

2

となります。1 であれば一方通行と考えます。

関係性が未定義の場合もあるので 0 のものを除外して算出すると

(sort-nodes (filter (lambda (n)
		      (not (= (cdr n) 0)))
		    (map (lambda (n)
			   (cons n (apply score-between n)))
			 (all-combinations))))
(((chisato mai) . 2)
 ((chisato airi) . 2)
 ((airi kanna) . 2)
 ((saki kanna) . 2)
 ((kanna maimi) . 2)
 ((erika maimi) . 2)
 ((saki airi) . 1)
 ((saki erika) . 1)
 ((kanna mai) . 1)
 ((maimi airi) . 1)
 ((saki chisato) . -1)
 ((kanna chisato) . -1))

となります。若干ピンとこない部分もあるかも知れませんが、計算上は矛盾無くデータの内容を表しています。

参考までに、スコア 1 の相互関係の中身を見てみると

(map (lambda (p)
       (find-relation (cons (caar p) (cadar p))
		      identity))
     (filter (lambda (n)
	       (= (cdr n) 1))
	     (map (lambda (n)
		    (cons n (apply score-between n)))
		  (all-combinations))))
(((kanna . mai) (desc "喰ってやるよ") (score . 1))
 ((saki . airi) (desc "好き") (score . 1))
 ((maimi . airi) (desc "良き妹") (score . 1))
 ((saki . erika) (desc "彼氏にしたい") (score . 1)))

のようになります。

まとめ

以上の調査を経て気になった問題点を列挙してみます。

特に最初の点に関して、「百合的」なるものの質的評価がなかなか難しいと感じました。例えば「大好き」も「良き妹」も同じ 1 と評価してしまっているのが妥当かどうか、といったことです。

また、スレにて与えられた情報を評価・分析する方法としては有効だとしても、逆方向のフィードバックの手段がなかなか見つからないというのが三つ目の問題です(技術力不足とも言います)。(注:画像化の方法が分かりました。追記参照)

最後に、プログラムソースを示します。実行には PLT Scheme が必要です。文字コードUTF-8 で保存した上で、(load "c-ute.ss") としてください。文字化けする場合はターミナルUTF-8 を表示できるよう設定する必要があります。がんばってください。

プログラム

c-ute.ss:

(require (lib "etc.ss")
         (lib "list.ss")
         (lib "26.ss" "srfi")
         (lib "delete.ss" "srfi" "1"))

;;; Utilities

(define true? (compose not not))

(define (ignore _) #f)

(define fif
  (case-lambda
    ((predicate consequent)
     (fif predicate consequent ignore))
    ((predicate consequent alternative)
     (lambda (x)
       (if (predicate x)
           (consequent x)
           (alternative x))))))

(define (concat! xs) (apply append! xs))

(define (mapconcat f lst sep)
  (let lp ((str (f (car lst)))
           (lst (cdr lst)))
    (if (null? lst)
        str
        (lp (string-append str sep (f (car lst)))
            (cdr lst)))))

(define (slice-string str len)
  (let lp ((res '())
           (str str))
    (if (<= (string-length str) len)
        (reverse! (cons str res))
        (lp (cons (substring str 0 len) res)
            (substring str len)))))

(define (break-string str len)
  (mapconcat identity (slice-string str len) "\\n"))

;; NOTE: input and output ports have to be either file-stream or #f
;; (i.e., cannot be a string port)
(define (run exe opt in out)
  (let-values (((p p-i p-o p-e)
                (subprocess out in #f exe opt)))
    (subprocess-wait p)
    (close-input-port p-e)))

;;; Database

;; http://ja.wikipedia.org/wiki/%E2%84%83-ute

(define names
  '((erika . "えりか") (maimi . "舞美") (saki . "早貴") (airi . "愛理")
    (chisato . "千聖") (mai . "舞") (kanna . "栞菜")))

(define (symbol->name sym)
  ((fif true?
        cdr)
   (assq sym names)))

(define nodes '())
(define edges '())

(define (relate from to desc score)
  (let ((n (cons from to)))
    (or (find-relation n
                       (lambda (r)
                         (let ((d (assq 'desc r))
                               (s (assq 'score r)))
                           (set-cdr! d (cons desc (cdr d)))
                           (set-cdr! s (+ score (cdr s))))))
        (begin
          (set! nodes (cons n nodes))
          (set! edges (cons (cons n `((desc ,desc)
                                      (score . ,score)))
                            edges))))))

(define (find-relation n k)
  ((fif true? k)
   (assoc n edges)))

(define (related? x y)
  (find-relation (cons x y) (lambda (_) #t)))

(define (from? n x)
  (eq? (car n) x))

(define (to? n x)
  (eq? (cdr n) x))

(define flip-relation
  (case-lambda
    ((n)
     (and (related? (cdr n) (car n))
          (cons (cdr n) (car n))))
    ((n k)
     ((fif true? k)
      (flip-relation n)))))

(define (get-score n)
  (cdr (assq 'score n)))

(define (get-description n)
  (cdr (assq 'desc n)))

(define (describe-relation n)
  (find-relation n get-description))

(define (score-relation n)
  (or (find-relation n get-score) 0))

(define (print-node . ns)
  (for-each (cute find-relation <>
                  (lambda (r)
                    (display
                     (format "| ~a => ~a  (~a)~%"
                             (caar r) (cdar r)
                             (mapconcat (lambda (s)
                                          (string-append "\"" s "\""))
                                        (cdr (assq 'desc r))
                                        ", ")))))
            ns))

(define (iter-nodes k)
  (let lp ((nodes nodes))
    (unless (null? nodes)
      (k (car nodes))
      (lp (cdr nodes)))))

(define (filter-nodes p)
  (let ((ns '()))
    (iter-nodes (fif p
                     (cut find-relation <> (lambda (n)
                                             (set! ns (cons n ns))))))
    ns))

(define (from-links)
  (map car nodes))

(define (to-links)
  (map cdr nodes))

(define (all-members)
  (delete-duplicates! (from-links)))

(define (all-pairs) nodes)

(define (ordered-pairs)
  (concat! (map (lambda (x)
                  (map car
                       (sort (filter-nodes (cute to? <> (car x)))
                             (lambda (x y)
                               (> (get-score x) (get-score y))))))
                (sort-nodes (map (lambda (x)
                                   (cons x (score-loved x)))
                                 (all-members))))))

(define (all-combinations)
  (let lp ((cs '()) (ns nodes))
    (if (null? ns)
        cs
        (let ((n (car ns)))
          (lp (if (member (list (cdr n) (car n))
                          cs)
                  cs
                  (cons (list (car n) (cdr n)) cs))
              (cdr ns))))))

;; number-list :: [a] -> [(a . Int)]
(define (number-list ls)
  (let lp ((ns '()) (ls ls))
    (if (null? ls)
        ns
        (let ((x (car ls)))
          (lp ((fif not
                    (lambda (_) (cons (cons x 1) ns))
                    (lambda (n)
                      (set-cdr! n (add1 (cdr n)))
                      ns))
               (assq x ns))
              (cdr ls))))))

;; sort-nodes :: [(a . Int)] -> [(a . Int)]
(define (sort-nodes ns)
  (sort ns (lambda (x y)
             (> (cdr x) (cdr y)))))

(define (diff-nodes ms ns)
  (let lp ((ds '()) (ns ns))
    (if (null? ns)
        (sort-nodes ds)
        (lp (let* ((n (car ns))
                   (m (assq (car n) ms)))
              (cons (cons (car n)
                          (- (cdr m) (cdr n)))
                    ds))
            (cdr ns)))))

(define (get-total-score x p)
  (foldr (lambda (n acc)
           (+ (get-score n) acc))
         0
         (filter-nodes (cut p <> x))))

(define (score-loved x)
  (get-total-score x to?))

(define (score-loving x)
  (get-total-score x from?))

(define (score-between x y)
  (+ (score-relation (cons x y))
     (score-relation (cons y x))))

(define (-> x)
  (display (format "~%Links from [~a]~%" x))
  (iter-nodes (fif (cut from? <> x)
                   print-node)))

(define (<- x)
  (display (format "~%Links towards [~a]~%" x))
  (iter-nodes (fif (cut to? <> x)
                   print-node)))

(define (<-> x)
  (display (format "~%Reciprocal links for [~a]~%" x))
  (iter-nodes (fif (cut to? <> x)
                   (lambda (n)
                     (flip-relation n
                                    (lambda (m)
                                      (print-node m n)))))))

(define (<=> x)
  (display (format "~%Reciprocal matches for [~a]~%" x))
  (iter-nodes
   (fif (cut to? <> x)
        (lambda (n)
          (flip-relation n
                         (lambda (m)
                           (if (ormap (lambda (x)
                                        (ormap (lambda (y)
                                                 (equal? x y))
                                               (describe-relation m)))
                                      (describe-relation n))
                               (print-node m n))))))))

(define (<?> x)
  (let ((to (assq x (number-list (from-links))))
        (from (assq x (number-list (to-links)))))
    (display (string-append
              (format "~%Link statistics for [~a]~%"
                      x)
              (format "| ~a => ~a (love ~a)~%"
                      x
                      (cdr to)
                      (score-loving x))
              (format "| ~a => ~a (love ~a)~%"
                      (cdr from)
                      x
                      (score-loved x))))))

(define (info x)
  (for-each (cut <> x)
            (list <- <-> <=> -> <?>)))

;;; GraphViz (http://www.graphviz.org/) support

(define graphviz "C:/Program Files/ATT/Graphviz/bin/dot.exe")

(define (nodes->dot ns)
  (string-append "digraph cute {\n"
                 ;;"\tordering=out;\n"
                 ;;"\trankdir=LR;\n"
                 "\toverlap=true;\n"
                 "\tnode[fontname=\"msgothic.ttc\"];\n"
                 "\tedge[fontname=\"msgothic.ttc\",fontsize=9];\n"
                 (let lp ((str "") (ns ns))
                   (if (null? ns)
                       str
                       (let* ((n (car ns))
                              (s (score-relation n)))
                         (lp (string-append
                              str
                              (format "\t\"~a\" -> \"~a\""
                                      (symbol->name (car n))
                                      (symbol->name (cdr n)))
                              (format "[label=\"~a\",color=\"~a\","
                                      (break-string
                                       (car (describe-relation n))
                                       7)
                                      (cond ((> s 0) "red")
                                            ((= s 0) "green")
                                            (else "blue")))
                              (format "style=\"bold~a\"];\n"
                                      (if (and (not (= s 0)) (< s 1) (> s -1))
                                          ",dashed"
                                          "")))
                             (cdr ns)))))
                 "}"))

(define (write-dotfile dot file)
  (and (file-exists? file) (delete-file file))
  (with-output-to-file file
    (lambda ()
      (display dot)))
  file)

(define (dot->png dot png)
  (call-with-input-file (write-dotfile dot "c-ute.dot")
    (lambda (in)
      (and (file-exists? png) (delete-file png))
      (call-with-output-file png
        (lambda (out)
          (run graphviz "-Tpng" in out)))))
  'done)

;;; Setup database

;; Based on:
;; http://ex23.2ch.net/test/read.cgi/morningcoffee/1188654905/116-142
(begin
  (relate 'maimi 'erika "大好き" 1)
  (relate 'maimi 'kanna "良き妹" 1)
  (relate 'maimi 'airi "良き妹" 1)
  (relate 'maimi 'mai "姉妹" 0)
  (relate 'erika 'maimi "一番可愛いよ" 1)
  (relate 'erika 'kanna "仲間" 0)
  (relate 'erika 'chisato "おソロパジャマ" 0)
  (relate 'kanna 'erika "仲間" 0)
  (relate 'kanna 'maimi "好き" 1)
  (relate 'kanna 'saki "喰ってやるよ" 1)
  (relate 'kanna 'mai "喰ってやるよ" 1)
  (relate 'kanna 'airi "大好き" 1)
  (relate 'kanna 'chisato "愛理に手出すんじゃねぇよ" -1)
  (relate 'saki 'maimi "荷物整理" 0)
  (relate 'saki 'erika "彼氏にしたい" 1)
  (relate 'saki 'kanna "興味がある" 0.5)
  (relate 'saki 'chisato "愛理に手出すんじゃねぇよ" -1)
  (relate 'saki 'airi "好き" 1)
  (relate 'airi 'kanna "受け入れる" 1)
  (relate 'airi 'chisato "最近親密" 1)
  (relate 'mai 'erika "保護者" 0)
  (relate 'mai 'maimi "姉妹" 0)
  (relate 'mai 'chisato "恋人" 1)
  (relate 'chisato 'erika "おソロパジャマ" 0)
  (relate 'chisato 'mai "恋人" 1)
  (relate 'chisato 'airi "最近親密" 1))

;; query relations / draw graphs

(if (file-exists? graphviz)
    (dot->png (nodes->dot (ordered-pairs))
              "c-ute.png")
    (for-each info (all-members)))

追記(グラフ描画について)

Graphviz というソフトによって関係図を可視化できる、ということを教えていただきました(既に上プログラムを実行すると自動的に関係画像を作成するようにしてあります)。ここでは技術的な観点から幾つか注意点を挙げておきます。

まず、Scheme プログラムから Graphviz を動かす方法について。コマンドラインからの起動のように、プログラムへのオプション文字列で入出力ファイルを指定する方法ではどうも上手く行きませんでした。調査の結果、入出力ファイルポートScheme 側で用意しておく必要があるようです。処理系によって異なりますが、PLT Scheme の場合 subprocess という関数を次のように呼び出します。

(subprocess output-port input-port #f "/path/to/dot.exe" "-Tpng")

ここで output-port は png画像ファイルへの出力ポート。input-port は dot ファイルグラフの定義ファイル)の入力ポートです。エラーポートは必要無いでしょう (#f)。

dot という名前の実行ファイルが、関係図のような有向グラフを描画するプログラムです。最後にオプション文字列として出力形式を指定します(png, jpeg, gif, etc.)。

次に dot ファイルScheme で書く方法ですが、以下の基本的な有向グラフの書式

digraph g {
  A -> B;
  B -> C;
  C -> A;
}

を理解すれば、後は実直に Schemeデータを当てはめて format 関数等で変換するだけです。

(string-append
 "digraph g {"
 (format "~a -> ~a;" (car node) (cdr node))
 "}")

問題は、ノードを配置する順番によって出来上がる画像が変わってくる、ということです。

より見た目に分かりやすくするための工夫としては、相互にリンクするノード同士が dot ファイル上でも近接して出力されるようにすると良いでしょう。関連の強いものが画像の上でも近くに表示されるようになります。

また上述(特に例3)のスコア概念を応用し、スコアの低いものが後に出力されるようにすることで、重力感覚に一致するような関係図を得ることができるでしょう。

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