maaash.jp

what I create

hilight2skype irssiのhilightをSkypeへ通知

みんなircで呼ばれた時、どうやって気づいてるんだろう?
mash:
って呼ばれてもputtyは3つのディスプレイの1つに表示されてるだけなので気づけないです。

http://im.kayac.com/
をtypesterが使ってるの見てて、やっぱデスクトップでぴこーんってされるのはいいな、と思ってたんだけど
GoogleTalk使ってないしなぁ、Skype版つくるべ、ってことでつくりました。

Skype4IRCってのもありますが、
こちらは、Skypeに届いたチャットメッセージをircに転送するもの。
hilight2skypeとは逆ですね。

■動かし方
skype for linuxインストール

skype4py(skypeAPIのpythonラッパー)インストール

以下をチェックアウト
http://coderepos.org/share/browser/lang/perl/irssi/scripts/hilight2skype.pl
http://coderepos.org/share/browser/lang/perl/irssi/scripts/hilight2skype/send_chat_message.py

$HOME/.irssi/scripts/autorun に入れる

hilight2skype.pl のskype名を自分のに修正

linuxでskypeを立ち上げるんですが、skypeを立ち上げるのにDISPLAY環境変数が必要なので、

1
2
3
4
Xvnc -query localhost -geometry 1024x768 -depth 16 -fp /usr/share/fonts/X11/100dpi/,/usr/share/fonts/X11/misc securitytypes=none[/code]  
vncサーバ立ち上げる

一度つないでシェルから  

echo $DISPLAY[/code]
ってすると、

うちは
127.0.0.1:0.0
になってたので、

vncクライアントは落として、コンソールから

1
2
3
4
5
6
7
8
9
export DISPLAY=127.0.0.1:0.0  
./skype-2.0.0.6/skype  
[/code]  
ってやるとskype立ち上がる

準備OK  
irssi起動すると hilight2skype ってscriptを自動でロードしてくれる  
hilight指定されてるメッセージが流れてくると、  
skypeがぴこーん!

[irssi #チャンネル名] < 送ってきた人> ircのメッセージ
[/code]
って感じのメッセージがSkypeに届きます。

初めてちょっとだけpython書いたー

vncサーバとDISPLAY環境変数付きでSkype起動できればいいので、
daemontoolsで監視できそう。
なんかサービスつくる?

2001年宇宙の旅の1x4x9

16bitのメモリ付き累算器?
Memory + Accumulator = New Plan

We finally completed work on the 16-bits of Data Memory, and attached it to the Accumulator. The final result is a rather attractive looking tower of K’NEX. The dimensions of it are almost exactly 1′ x 4′ x 9′ (an interesting coincidence for anyone who has read “2001: A Space Odyssey”).

wow

コンテキストマッチするamazonアフィリエイトを

  1. Yahoo PipesのFetchPageでブログのhtmlまたはRSSをとってきてテキスト部分を正規表現で抽出して
     (ブログに貼ってあるjavascript使ってとってきてもいいか)
  2. Yahoo Pipes使ってYahoo Japanの日本語形態素解析Webサービスに突っ込んで
  3. JSONPで結果を受け取って
  4. Amazon Webサービスをxslt使ってJSONP

したら、サーバサイドを書かずに&だれかに依存せずに(YahooやAmazonにはするけど、。)
コンテキストマッチするAmazonアフィリエイトをつくれるなぁ

[as3]FlexSDKでGoogleMaps API for Flash

Google Maps API for Flashお試し中
例によってFlexSDK。
ver: map_flex_1_4.swc

いくつか異常に重い処理がある
呼び出し順によってなんでこんなに違うんだ!?なんかよくわからないけど直った。

Flex[23]SDKでやるとUIComponentの中に入れないから、Mapのサイズを手動設定しないといけない(?)んだけどそのタイミングによっては異常に時間がかかる(?)

以下のならok
[as]map = new Map;
map.key = Params.key;
addChild( map );
map.addEventListener(MapEvent.MAP_READY, function(e:MapEvent) :void {
map.removeEventListener( MapEvent.MAP_READY, arguments.callee );
map.setSize( new Point(stage.stageWidth,stage.stageHeight) );
map.setCenter(
new LatLng(Params.MAP_INITIAL_CENTER_LAT,Params.MAP_INITIAL_CENTER_LNG),
3,
MapType.HYBRID_MAP_TYPE);

map.enableScrollWheelZoom();
map.enableContinuousZoom();
map.addControl( new PositionControl() );
map.addControl( new ZoomControl() );
map.addControl( new MapTypeControl() );
});
map.addEventListener(MapMoveEvent.MOVE_END, function(e:MapMoveEvent) :void {
//mapRefreshed();
});
map.addEventListener(MapMouseEvent.CLICK, function(e:MapMouseEvent):void{
logger(“[CLICK]pos: “+e.latLng);
});
[/as]

keyはこんなふうに設定するのがいいのかなぁ
Paramsクラス
[as]public static function get key() :String {
var loadedFrom :String = stage.loaderInfo.loaderURL.match(/^(https?:\/\/[^\/]+)/)[1];
if ( flashvars[“key”] ) {
return flashvars[“key”];
}
switch ( loadedFrom ) {
case “http://production.com&#8221;:
return “key_for_production”;
case “http://dev.production.com&#8221;:
return “key_for_dev”;
}
return “key_for_localhost”;
}[/as]

[as3]Marilena Object Detection in AS3

出しました。
http://www.libspark.org/wiki/mash/Marilena
http://level0.cuppy.co.jp/2008/06/marilena_object_detection_in_a.php

詳しくは上の2つを見ていただくとして。
実装してておもしろかったのは、
http://www.libspark.org/browser/as3/Marilena/trunk/src/jp/maaash/ObjectDetection/TargetImage.as
この辺り。
最初全くわからなかったんだけれど、Integral Image というのを使って、ある範囲内の輝度の積分を高速に計算しています。

integral imageについてはこちらが詳しい
Feature Detection using Integral Images
物体認識とかって技術の裏では、こういった算数のような細かい計算の高速化が大きなブレイクスルーだったりするんだなー、って感動した。

snmp/mrtgでプロセスの開いているファイルディスクリプタ数を監視

してみる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/usr/bin/perl

use strict;
use warnings;
use Unix::Lsof;
use Unix::PID;

my $pid = Unix::PID->new();
my $red5\_pid = $pid->get\_pidof(&#8216;search for a process by this string&#8217;);  
unless ( $red5_pid ) {
print &#8217;0&#8242;;  
exit;
}

my ( $output, $error ) = lsof( &#8216;-p&#8217;, $red5_pid, &#8216;-w&#8217; );  
my @vals = values %{$output};
print scalar @{ $vals[0]{files} };

snmpd.conf に

1
2
3
exec fd\_mon /path/to/fd\_mon.pl[/code]

mrtg.cfg 

Target[fd]: .1.3.6.1.4.1.2021.8.1.101.1&.1.3.6.1.4.1.2021.8.1.101.1:public@localhost
MaxBytes[fd]: 2000
YLegend[fd]: File Descriptors
ShortLegend[fd]:
LegendI[fd]: / File Descriptors
LegendO[fd]: /
Legend1[fd]: / File Descriptors
Legend2[fd]: /
Title[fd]: File Descriptors
PageTop[fd]:

File Descriptors

[/code]

WindowsでC++からlibxml2を使う

環境は
VisualC++2005ExpressEdition

http://www.zlatkovic.com/pub/libxml/
こちらからWindows用バイナリをDL
今のバージョンは libxml2-2.6.32+.win32.zip

C/C++ 追加のインクルードディレクトリに libxml2/include を追加
リンカ 追加のライブラリディレクトリに libxml2/lib を追加

こんなRSSを
[xml]
< ?xml version=“1.0” encoding=“UTF-8”?>


Copyright 2007-2008, …
snip..
[/xml]

こんな感じでパースできる
[cpp]

include #include

int XMLParser::parse( string filename ) {

xmlDocPtr doc = xmlParseFile( filename.c_str() );
if (doc == NULL ) {
fprintf(stderr,”Document not parsed successfully. \n”);
return 0;
}

xmlNodePtr cur = xmlDocGetRootElement(doc);
if (cur == NULL) {
fprintf(stderr,”empty document\n”);
xmlFreeDoc(doc);
return 0;
}

if (xmlStrcmp(cur->name, (const xmlChar *) “rss”)) {
fprintf(stderr,”document of the wrong type, root node != rss”);
xmlFreeDoc(doc);
return 0;
}

xmlChar *version = xmlGetProp(cur, (const xmlChar *)”version”);
printf(“version: %s\n”, version); // “2.0″
xmlFree(version);

xmlFreeDoc(doc);
return 1;
}
[/cpp]

めんどくさい

[as3][umap]PositionControlの位置を動かす

memo

UMapラッパー自前クラスのコンストラクタはこんな

[as]package {
// 省略
public class MyUMap extends UMap {
// 省略
st = s;
super();
setSize(st.stageWidth,st.stageHeight);
//setMapType(“hybrid”); // normal / satellite
setCenter(new LatLng(Params.MAP_INITIAL_CENTER_LAT,Params.MAP_INITIAL_CENTER_LNG), 2);

animatePan = true;
animateZoom = true;
panSpeed = 10;
enableScrollWheelZoom = false; // do this manually cause it zooms too much
//zoomAtPointer = true; // looks like its useful when enabledScrollWheelZoom==true
// define GoogleProvider with custom paths
var settings :URLRequest = new URLRequest(“http://www.afcomponents.com/components/g_map_as3/settings.xml?rand=&#8221; + Math.random());
var language :URLRequest = new URLRequest(“http://maps.google.com/maps?file=api&#038;v=2&#8243;)
var copyright :URLRequest = new URLRequest(“http://www.afcomponents.com/proxy/g_map_as3/copyright.php&#8221;);
control.provider = new GoogleProvider(false, settings, language, copyright);

var pc :PositionControl = new PositionControl;
pc.autoRepeat = true;
//pc.y = 50; // ng
//pc.stackAlignment = PositionControl.RIGHT; // ng
//pc.stackAlignment = PositionControl.CENTER; // ng
//pc.stackPadding = new Point(100,100); // ボタンが離れる!
pc.offset = new Offset( 100, 100 ); // positioncontrolが左上から100,100に
//pc.align = new Align( Align.RIGHT, Align.TOP ); // this is also ok
pc.refresh();
addControl(pc);
addControl(new ZoomControl);
}
}[/as]

Becky!とPOPFileでアンチスパムまとめ(SSLの場合)

聞かれることが多いので。

最新のBecky!をダウンロード
Becky! Internet Mail

最新のPOPFileをダウンロード
POPFile のダウンロード

最新のBkPOPFileConをダウンロード
BkPOPFileCon
(Becky!からPOPFileのスパム判定を修正するためのBecky!プラグイン)

Becky!をインストール
POPFileをインストール
mecabの辞書とかとってくるのでネットにつながった状態で。

POPFileインストール中に、
コンポーネントを選んでください、と出るので、
Optional Modules の下の SSL Support にチェック
(2007/12月にリリースされた版からかな、これで楽になりました)

インストール後、
POPFileインストールオプション、というのが出てくる
ユーザーインターフェースに使用するポート番号を選んでください、
のところで、
8080 だと他のソフトとぶつかる可能性があるので、
8081 とかにする
Windowsの起動時にPOPFileを自動的に起動、にチェック。

それ以外は 次へ、次へ、ってやってると完了する。
POPFileのユーザーインターフェースを起動する。
ブラウザで。

ここでバケツを作成します。ビジネスメール/個人メールとか、振り分けもできるんだけど
自分はそういうふうには使っていないので、
ひとまずデフォルトのバケツを全部削除して
spam
not_spam
を作成。

サマリーのところに、spam、not_spamが出てくるので
件名の変更、隔離、のチェックをはずす。(これは好みか
X-Text-Classificationヘッダー、X-POPFile-Linkヘッダーのチェックをつける。
変更を適用、をクリック (これ忘れがち
POPFileコントロールセンターの操作はここまで。

Becky!を起動。

Becky!の設定。
ツール→メールボックスの設定→基本設定 のところ
POP3サーバーのIPアドレスをどこかに書き留める。
POP3サーバーを 127.0.0.1 に。
POP3Sのチェックをはずす。
SMTPサーバーはそのまま。ここではPOPFileをSMTPサーバとしては使いません。
ユーザーIDに、
ほんとのPOP3サーバのIPアドレス(↑で書きとめたやつ):(コロン)ポート番号(995とか):(コロン)ユーザーID:(コロン)ssl(小文字でエスエスエル)

詳細タブへ。
POP3のポート番号は110
(127.0.0.1の110にPOPFileがいます)

これでメール受信すると、メールが取れる(はず)。
取れたメールを選んでみる(ここで選択しとくと、あとのフィルタリングマネージャでそのヘッダでサジェストしてくれるので選ぶだけ選んどくといい

スパム用のフォルダを作成

フィルタリングマネージャで、振り分け設定をつくります。
Becky!のメニュー→ツール→フィルタリングマネージャ
新規ルール をクリック
条件の追加 をします

ヘッダ のところで下の方にある、
X-Text-Classificationを選ぶ
なければ、↑で選択してなかったんだと思います、なければテキストで入れる
文字列のところに、spam って入れる

アクションを選びます
アクション:振り分け
spamフォルダを選択
OK
OK

Becky!を一度終了させる
BkPOPFileConをインストール
POPFileのポート番号の設定とかがあったと思いますので
↑で入力した番号を入れる 8081 とか

Becky!を起動
Becky!のメニュー→ツール→プラグインの設定→POPFile Control Pluginをクリック
(うろおぼえ
サーバーは 127.0.0.1 ポートは 8081
バケツ取得 をクリック
判定訂正後振り分けを行う にチェック
設定保存。

受信したメールの中から、
「これはスパムだっ」って思うのを選ぶ
右クリック

POPFileの判定を修正
現在 undefined とかになってるのを、spamを選ぶ
OK

これを何回か繰り返してるとスパムフィルタが学習を重ねてだんだん精度あがります。
たまに spamフォルダをのぞいて
spamじゃないのが入ってたら、
同じように右クリックして not_spam にする