gnupotの出力から動画作成

splotで3次元の出力をしたら見にくかったので,
2次元に切った画像を動画にしてみたときの操作メモ.

まずは,c++などでデータを出力

double func(double c, double d){
  return 0;//適当な関数
}
void outputC(int i, int n){
  double c = 1.0*i/n;
  char fname[256];
  sprintf(fname,"dat/c%03d.dat", i);
  std::ofstream out(fname);
  for(int j=1;j<=n;++j){
    double d = 1.0*j/n;
    out << c << ' ' << d << ' ' << func(c,d) << "\n";
  }
}
int main(int,char**){
  int n = 128;
  for(int i=1;i<=n;++i){
    outputC(i,n);
  }
  return 0;
}

生成したデータをgnuplotpng画像に変換し,ffmpegでaviファイルに変換

#!/bin/sh                                                                                                                        
ls dat/*.dat | while read FILE
do
NAME=`basename $FILE .dat`
echo "$NAME"
gnuplot <<EOF                                                                                                                    
set xrange [0:1.0]                                                                                                               
set yrange [1.0:10.0]                                                                                                            
set term png                                                                                                                     
set output "dat/$NAME.png"                                                                                                       
plot "dat/$NAME.dat" using 2:3 w l                                                                                               
EOF                                                                                                                              
done
ffmpeg -r 10 -i "dat/%3d.png" -vcodec mjpeg -sameq out.avi

ubuntuからandroidプログラムの実機での実行

タイトルのことを実行しようとしてハマったので解決法のメモ.

環境はubuntu11.04とgalaxy s2

javaeclipseandroid sdkは入っていて,
エミュレータでの実行は成功した後の話.
ついでに,adbへのパスも通ってる.
android側では"提供元不明のアプリ"と"USBデバッグ"にチェックをつけている状態.


何も設定せずにusbでandroidをつなぎ,adb devicesを実行すると以下のようになる.

# adb devices
?????????? no permission

udev rulesの設定が必要らしい.


まずは,lsusbでidVendorを確認.

# lusb
Bus 001 Device 011: ID 04e8:685e Samsung Electronics Co., Ltd

これでvendor idが04e8だと分かる(685eはproduct id,たぶん)


udev rulseを設定.idVendorのところにはさっき調べたvendor idを入れる

sudo echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="04E8", MODE="0666"' /etc/udev/rules.d/51-android.rules
sudo chmod a+rx /etc/udev/rules.d/51-android.rules


これでもまだno permissionで,調べたところadb serverをsuper userで実行すればよいとのこと

adb kill-server
sudo adb start-server


あとは,androidをつなぎなおせば認識をしてくれた.

adb devices
List of devices attached
############### device

(###############には実際は数字が入ってます)


eclipseからrun as 1. android applicationを選べばちゃんと実行できた.

名刺作成

そろそろ必要になることも多くなってきたので,つくってみる.


注文は安かったので前川企画印刷(有限会社 前川企画印刷|デザイナーもコピーライターも…[神戸市兵庫区])で.
100枚で片面の場合,モノクロなら1000円,カラーでも1300円(送料込み)とお得.

宣伝のためのキャンペーンなので条件があるが,
ブロガー名刺に関するご案内は引っ越しいたしました。 - 引っ越しました → 川柳家の書いていたブログ
までトラックバックを送信するだけ.


完成したら,また報告する.

Ubuntu11.04 on さくらVPS からメールをGMailへ転送

ドメイン yambi.jp を取得して,さくらVPSを借りました.
以下,独自ドメインのメールアドレスをGMailから使う設定メモ

初心者なので間違えがある可能性大


まずは必要なソフトをapt-get

sudo apt-get install postfix sasl2-bin

/etc/postfix/main.cfを次の内容に変更

mail_owner = postfix
myhostname = mail.yambi.jp
mydomain = yambi.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain                                                   
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
home_mailbox = Maildir/

relayhost = [smtp.gmail.com]:587

#sasl setting                                                                                         
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_sasl_mechanism_filter = plain

#tls setting                                                                                          
smtp_use_tls = yes
smtp_tls_security_level = may
smtp_tls_policy_maps = hash:/etc/postfix/tls_policy

/etc/postfix/sasl_passwdを作成し,以下を記入
(もちろん,{myaccount}, {mypassword}は適切なものに置き換える)

[smtp.gmail.com]:587 {myaccount}@gmail.com:{mypassword}

/etc/postfix/tls_polic

[smtp.gmail.com]:587 encrypt
sudo postmap /etc/postfix/sasl_passwd
sudo postmap /etc/postfix/tls_policy
chmod 600 /etc/postfix/sasl_passwd
chmod 600 /etc/postfix/sasl_passwd.db
sudo /etc/init.d/postfix restart

~/.forwardに転送先を書く

{myaccount}@gmail.com

これで,gmailに転送されるようになる.

2011/09/30 追記

main.cfの設定は

mail_owner = postfix
myhostname = mail.yambi.jp
mydomain = yambi.jp
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
home_mailbox = Maildir/

だけでも.forwardで転送できるみたい.


むしろそうしないと転送時にgmailによるFromの書き換えが行われ,
元の送信者が分からなくなってしまう問題が発生してしまった.

VPSからGMailに登録されたアドレスでメールを送りたいときにはrelayhostが必要だけど,
今回は必要ないので消した.
relayhostの意味をちゃんと理解していなかった...

Javascriptで音を鳴らす

夏休みだし,javascriptでも勉強しようかと思ってゲームを作成中.
物理演算ブロック崩し みたいなの)
そこで音を鳴らすのに苦労したので調査メモを残す.
chromefirefoxで確認

方法1 divを使う

一番簡単で,大抵の場所で動く方法.
htmlファイルに

<div id="sound_element"></div>

と記述し,javascriptから

document.getElementById("sound_element").innerHTML= "<embed src='"+sound_file_url+"' hidden=true autostart=true loop=false>";

を実行するだけ.

ただし,遅延は非常に大きい.
1回鳴らすだけで5秒ぐらい遅れるので効果音などにはまったく使えない.

方法2 audioタグを使う

html5が使えるならこれ.
newでAudioオブジェクトを作り,

var audio = new Audio(sound_file_url);

playで音を鳴らす

audio.play();

先に読み込みができるので,遅延はほとんどなし.
複数回同時にならしたいなら,複数個同じオブジェクトを用意すればよい.
しかし,先に複数用意するのは無駄だし,
その場で新しいのを作ることにするとサーバに負荷がかかる.

方法3 audioタグ+Data URI scheme

Data URI schemeはファイルのなかにリソースを埋め込んで別のファイルを読む負荷を減らそうというもの(たぶん)
これを使えばサーバへの負荷が軽減できる.

やり方はsound_file_urlの代わりに「base64エンコードした音ファイルにヘッダをつけた文字列」を書くだけ

var s =  "data:audio/wav;base64,UklGRiQXAABXQVZFZm10IBAAA...." //実際はとても長い
var audio = new Audio(s);
audio.play();

wavファイルのbase64へのエンコードなら次のスクリプトを使えば良い

#!/usr/bin/zsh                                                                  
for i in $*
do
  echo -n "data:audio/wav;base64,"
  base64 $i | tr -d '\n'
  echo ""
done
exit 0

欠点は,base64エンコードするので少し長くなるのと,エンコードが面倒なこと.
後,1秒間に100回ぐらい再生しようとしたらブラウザがクラッシュした.

方法4 javaアプレットflashを利用する

試してないので不明

crack windows7

windowsのログインパスワードが分からなくなったので解除してくれとの依頼があったので,
いろいろ試してみたメモ.

対象はwindows7の32bit OS

Ophcrack

http://ophcrack.sourceforge.net/

レインボーテーブルとかいうのを使ってハッシュ値からパスワードを復元するらしい.
しかし,途中でエラーが出てうまくいかなかったので別の手段をとることに.
windows7には対応してないのかも

KON-BOOT

http://www.piotrbania.com/all/kon-boot/

このcdを入れて起動すればパスワードなしでログインできるようになるので,すごく簡単.
しかし,パスワード変更はできなかったので今回の目的には合わず.

Offline Windows Password

http://pogostick.net/~pnh/ntpasswd/

コマンドラインからパスワードのリセットなどができる.
これで目的を果たせた.

linuxでスタックサイズ変更

c++でプログラムを作っていたらサイズ10000000程度の配列を作るだけでsegmentation faultしてしまった.

原因はスタックのサイズ不足.
スタックサイズは

ulimit -s

で確認できる.単位はキロバイト

例えば1GBに変更したい場合は

ulimit -s 1048576

とすればよい.


余り大きくしすぎて再帰関数の終了条件をミスったりすると痛い目にあうので注意.