2012/04/02

google web履歴をぶっこ抜く

googleのweb履歴をダウンロードするperl スクリプトを発見した.
https://gist.github.com/2283935/a9bde2f42942178c735988e5da0c249f5548cbd0


でもパスワード直書きは怖いので,標準入力にしたバージョンを書いてみた
https://gist.github.com/2283935

2012/03/27

perlでFFT

モジュールを使えば簡単



use Math::FFT;

my $PI = 3.1415926539;
my $N = 64;
my $in;

#set data
for (my $k=0; $k<$N; $k++) {
$in->[$k] = cos(2*$PI*$k/$N)+ sin(3*$PI*$k/$N);
}

#fft
my $fft = new Math::FFT($in);
my $coeff = $fft->rdft();
my $spectrum = $fft->spctrm;
my $original_data = $fft->invrdft($coeff);

#input data and inverse-fft
open FH, ">data.d";
for (my $k=0; $k<$N; $k++) {
$tmp1=0;
$tmp2=0;
for (my $j=1; $j<$N/2; $j++) {
$tmp1+=$coeff->[2*$j]*cos(2*$PI*$j*$k/$N);
$tmp2+=$coeff->[2*$j+1]*sin(2*$PI*$j*$k/$N);
}
$tmp=(($coeff->[0] +$coeff->[$N/2]*cos($PI*$k))/2 +$tmp1 +$tmp2)*2/$N;
print FH "$k\t $in->[$k] \t$tmp \t $original_data->[$k]\n";
}
close FH;

#coefficient
open FH, ">coeff.d";
for (my $k=1; $k<$N/2; $k++) {
print FH "$k\t $coeff->[2*$k] \t$coeff->[2*$k+1]\n";
}
close FH;

#power spectrum
open FH, ">spct.d";
for (my $k=1; $k<$N/4; $k++) {
my $tmp=($coeff->[2*$k]*$coeff->[2*$k]+ $coeff->[2*$k+1]*$coeff->[2*$k+1])/$N/$N*2;
print FH "$k\t $spectrum->[$k] \t$tmp\n";
}
close FH;


3/28追記
上記では,直流成分の係数は表示していないので注意


2012/03/23

UPSの状態をRS232で知りたい

UPSのデータシートによると, RS232ポートのあるピンの電圧をみると,電源駆動か電池駆動かが分かるそうな.

テスターを挿して測ってみると,確かにLowとHighになる.
実際にこのピンに掛かる電圧を監視すればいいことがわかった.
でもRS232は通信用のポートらしく,特定のピンの電圧を測るようなことは出来ないっぽい.
きっちり理解して,ドライバを書く時間もないしな.


また,調べてみるとapcupsdというプログラムで監視ができるみたい.
でもシリアルポートの認識ができない.
クロスとかストレートとかのケーブルの問題なのかな.

しばらくpendingだ.

参考
http://www.itmedia.co.jp/help/howto/linux/ups/
http://h2np.net/tips/fwf10.html
http://archive.linux.or.jp/JF/JFdocs/Serial-HOWTO-16.html
http://linuxjf.sourceforge.jp/JFdocs/Serial-HOWTO-8.html

2012/02/14

javaの文字コード指定について

javaなのにshift_jisで書かれたコードなんて...

それでも,ターミナルはUTF-8で固定しておきたいので,
コンパイルと実行時に以下のようにすれば,強制的にutf8に出来る.

javac -J-Dfile.encoding=UTF-8
java -Dfile.encoding=UTF-8

2012/01/29

Net::Twitter 3.18001 におけるmentionの扱い

Net::Twitterのバージョンをあげたら,
$twit->search({q => "to:$username",since_id => $sinceId})
が使えなくなっていた.

現行のバージョンでは,以下のようにする
my $ms=$twit->;mentions({ since_id => $sinceID, count =>10 });
for my $res ( @$ms ) {
my $text = Encode::encode('utf8', $res->{'text'});
print "$text \n";
}
引数は無くても動くらしいが,指定しないと動かなかった.
なんでだろ?


参考
http://search.cpan.org/dist/Net-Twitter/lib/Net/Twitter.pod

2012/01/06

google製 bugspotsを使ってみる

gitのリポジトリからバグが含まれるファイルを予測するbugspotsを使ってみた.

OSXへのインストールは
> sudo gem install bugspots
でオッケ.でもって
> git bugspots git-repo
で結果がでる.


ファイル更新の日時と回数をフェルミ分布みたいな評価関数で評価して,
どのファイルにバグが含まれるかを予測するらしい.
http://www.publickey1.jp/blog/11/post_193.html

近日中に更新が多いファイルにはバグが含まれるだろうという静的な解析.
ファイルサイズとかは影響しないんだろうか.
個人開発な規模のリポジトリでは,使い道がわからんなぁ.

2011/11/25

Javaの拡張構文

使うことは無いと思うけど,読むことはあるであろう構文について.
Javaでは以下のように,後にピリオドを3つつけた引数の宣言が可能.
 
void method(String... str) {
    for (String s : str){
        System.out.println(s);
    }
}

この場合
this.method("aaa", "bbb", "ccc"); 
や
this.method("aaa"); 
などと,任意の変数の個数を引数として,メソッドを呼び出すことが可能.
イチイチ配列に格納し直す手間が省けるという意味.
この書き方には,一つのメソッドに一つ,しかも最後の引数のみという制約がある.
考えたら当たり前な制約.

んで,
for (String s : str)
は,配列を1つずつ取り出して,sに入れるという意味.
foreachみたいなもん.こちらは使えそうだ.

2011/11/10

JNIを使ってみる

> javac JNITest.java
> javah -jni -o JNITest.h JNITest
> javac JNITest
> gcc -fPIC -g -c  -I/System/Library/Frameworks/JavaVM.framework/Headers HelloJniWorldImpl.c
> gcc -shared -o libHelloJniWorldImpl.jnilib HelloJniWorldImpl.o

そして
> java -Djava.library.path=.  -cp . HelloJniWorld
で実行されるはず.

linuxの場合は
> gcc -fPIC -g -c -I/java/header HelloJniWorldImpl.c
> gcc -shared -o libHelloJniWorldImpl.so libHelloJniWorldImpl.o

2011/10/17

Fedora15でネットワークデバイスの名前をeth*に変える方法

/etc/grub.conf
に
biosdevname=0 
を追加.そして
/etc/udev/rules.d/70-persistent-net.rules
として

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="MAC_ADDR", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0" 
を保存して,再起動すればいい.

でも,現時点でPGIコンパイラのFLEXLMはFedora15に対応していないので,
こんな小手先の調整をしても無駄.
これで1週間くらい無駄にした.

2011/10/16

yumでdropboxを入れる

/etc/yum.repos.d/dropbox.repo
として
 
[Dropbox]
name=Dropbox Repository
baseurl=http://linux.dropbox.com/fedora/$releasever/
gpgkey=http://linux.dropbox.com/fedora/rpm-public-key.asc

を作成.そして

$yum install nautilus-dropbox
 
でOK 

2011/10/11

perlのGetOpt::Longでクオートの扱い

GetOpt::Long を利用して
 
./mail.pl -subject 'test mail' fugafuga
 
などといった,クオートで囲ったコマンドラインオプションを扱う場合は
 
GetOptions ("subject=s" => \@sub);
 
のように,引数の型はsだが,格納する変数を配列にすれば良い.
 

2011/10/10

linuxでUSBRHで温度を測る


先日,計算機室のクーラーが停止して室温が50度くらいまで上がって,マシンが熱暴走した.その為,室温を計測して緊急メールを出すというシステムを作る必要があった.


それで,PCに接続可能な温度計があればなぁと思っていたら,見つけた!
USBRH (http://strawberry-linux.com/catalog/items?code=52002) という温度計はUSBでPCに接続して温度と湿度を得ることができる.
付属のライブラリとソフトウエアはウインドウズ用だけど,libusbがあればlinuxでも使用可能.

linuxで使うには,yumでlibusb-develを入れて,http://www.dd.iij4u.or.jp/~briareos/soft/usbrh.html にある usbrh-0.05.tar.gz をダウンロード&解凍&makeすれば使える.

ただし,230行目あたりの
if((rc = usb_set_configuration(dh, dev->config->bConfigurationValue))<0){ 
を 
if( rc = usb_detach_kernel_driver_np(dh, dev->config->interface->altsetting->bInterfaceNumber)<0 ){
に変更しなければならない.


ちなみに,usbrh-0.05はアプリケーションで,ドライババージョンの usbrh-0.08 (http://green-rabbit.sakura.ne.jp/usbrh/)もあるけど,ドライバ関係は苦手だし,後輩君たちも分からないと思うので,アプリバージョンを選択した.


さらに問題があって,あるマシンでusbrhを実行すると,
Temperature: -40.00 C
Humidity: -4.25 %
となり,温度が正しく表示されない.
この-40.00と-4.25という値は初期値で,温度を取得できていないことを意味している.
ソースをみてみると,usbrh_main.c の
usb_bulk_read(dh, 1, buff, 7, 5000);
の呼び出しは成功を示す返り値が返ってきているのだが,buffに値が入っていない...

google先生に聞いてみると,ちらほらそういう事例があるようで,例えば
http://d.hatena.ne.jp/oxon/20101205/1291499466
では,二回に一回読取が出来ないらしい.
うちの環境では,読取が出来ないマシンでは,一切読み取れないけれど.

この問題は,恐らくOSが原因で,ドライバの読み込まれる順序が悪いんじゃないかなと思っている.



ひとまず,正常に計測できるマシンに2つのUSBRHをさして,
cronで 
usbrh -f1 > log1
usbrh -f2 > log2
を実行させている.
そしてtwitter botで最新の温度を読み取って,昼間の時間体だけ室温をつぶやかせて,
設定した閾値を超えたらスタッフにメールするようにした.



2011/09/30

TimeCapsuleの設定

大学ではTimeCapsuleを使っているのだが,無線LAN基地局としての機能は停止せよとのお達しがあったので,その設定について記しておく.


AirMacユーティリティを起動して,
AirMacの項目で,ワイヤレスのモードを切にする
これだけ.

インターネットの項目の接続共有は有線に関する設定らしいので,
切(ブリッジモード)でも,有線接続しなければブリッジングもしないとのこと.


基盤センターの人が言っていたので,問題ない(ハズ).

2011/09/29

jnlpで配布するjarに署名を与える

まず署名を作る.
keytool -genkey -keystore hogehoge -alias fugafuga
いろいろ聞かれるが,適当に答えるべし.
 
署名をjarに当てる 
jarsigner -keystore hogehoge Hoge.jar fugafuga
デフォルトだと,6ヶ月しか有効ではないようだ.

jogampのJOGLでシェーダー

 
 
st.glUseProgram(gl, false);
を
st.useProgram(gl, false);
に変更するべし.
 

2011/09/15

Dialogにデフォルト値を入れる JFileChooser

仮想的なFileを引数に与えれば良い.
つまり

chooser.setSelectedFile(new File("default.txt"));
chooser.showSaveDialog( null );

などとすればよい.
デフォルトのファイルは存在していなくても可.
フルパスしていだと挙動があやしくなることもあるそうだ.

2011/09/11

yumでffmpegを入れる.Fedora15

http://aruneko.f-space.org/archives/1295
にあるように,

yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm

でリポジトリを追加すれば,
yum install ffmpeg
でインストール可能

2011/08/25

Java: クラスパスの動的追加

追加したいクラスファイルを引数に以下の関数を呼べば良い.
プラグイン形式で機能拡張する場合は必須と思われる.

void addClassPath(File classPath){
   try{
     URLClassLoader classLoader=(URLClassLoader)ClassLoader.getSystemClassLoader();
     Class classClassLoader = URLClassLoader.class;
     Method methodAddUrl =
classClassLoader.getDeclaredMethod("addURL", URL.class);
     methodAddUrl.setAccessible(true);
     methodAddUrl.invoke(classLoader, classPath.toURI().toURL());
     System.out.println("added "+classPath);
   }catch(Exception e){
     e.printStackTrace();
   }
 }
 
 

プラグイン形式で機能拡張できるJavaアプリの作り方

http://oshiete.goo.ne.jp/qa/1947916.html
を参考に,動的にクラスファイルを読み込むだけ.
インターフェースにはこんな使い方もあるのかと,目からウロコ.

質問のページには,たまに珠玉の回答があるから,読まざるをえない.

2011/08/24

gitとかでパスワードを保存させておく方法

主にgoogle codeで使う.
 
~/.netrcに 
machine SERVER
login NAME
password PASSWORD
を記述する.
パーミッションに注意しないと,盗み見られるので注意!!