December 18, 2009
November 10, 2009
November 6, 2009

メールアドレスの正規表現

perlfaq9 - Networking ($Revision: 8539 $) - search.cpan.org
    my $atom       = qr{[a-zA-Z0-9_!#\$\%&'*+/=?\^`{}~|\-]+};
    my $dot_atom   = qr{$atom(?:\.$atom)*};
    my $quoted     = qr{"(?:\\[^\r\n]|[^\\"])*"};
    my $local      = qr{(?:$dot_atom|$quoted)};
    my $domain_lit = qr{\[(?:\\\S|[\x21-\x5a\x5e-\x7e])*\]};
    my $domain     = qr{(?:$dot_atom|$domain_lit)};
    my $addr_spec  = qr{$local\@$domain};

ちなみに、これをまとめると、

/^(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&’*+/=?\^`{}~|-]+)(?:.(?:[a-zA-Z0-9_!#\$\%&’*+/=?\^`{}~|-]+))*)|(?:”(?:\[^\r\n]|[^\”])*”)))\@(?:(?:(?:(?:[a-zA-Z0-9_!#\$\%&’*+/=?\^`{}~|-]+)(?:.(?:[a-zA-Z0-9_!#\$\%&’*+/=?\^`{}~|-]+))*)|(?:\[(?:\\S|[\x21-\x5a\x5e-\x7e])*\])))$/

参考サイト:http://blog.livedoor.jp/dankogai/archives/51189905.html
October 31, 2009

CentOSでtex環境を整備する方法

(´もω(+”)ノ

CentOS 5.3でtex環境を整えました。
そのやり方を自分用にメモ。

~$ sudo yum install platex tetex*

dvipdfmxはyumレポジトリにはないらしく、手動でインストールすることに。。。

~$ mkdir work
~$ cd work
work$ wget http://project.ktug.or.kr/dvipdfmx/snapshot/latest/dvipdfmx-20090708.tar.gz
work$ tar zxvf dvipdfmx-20090708.tar.gz
work$  cd dvipdfmx-20090708

ここ以降、パス関連で苦労しました。このパスはうまくいったときにやったパスです。

dvipdfmx-20090708$ ./configure —prefix=/usr —with-kpathsea=/usr
dvipdfmx-20090708$ make clean
dvipdfmx-20090708$ make 
dvipdfmx-20090708$ sudo make install

これで一応入ってますが、まだパスが通ってないので以下のエラーが出ると思います。

** WARNING ** Could not open config filedvipdfmx.cfg

なので、このコマンドをするとパスが通ると思います。

dvipdfmx-20090708$ sudo mktexlsr

さぁ、これで使えるとおもいきや、こんなエラーが生じるでしょう。

** ERROR ** Could not find encoding file “H”.

実は、このHは/usr/share/ghostscript/8.15/Resource/CMap/Hにあります。
なので、ここにパスを通せばOKです。

dvipdfmx-20090708$  sudo vi /usr/share/texmf/web2c/texmf.cnf
- 345 CMAPFONTS = .;$TEXMF/fonts/cmap// 
+ 345 %CMAPFONTS = .;$TEXMF/fonts/cmap// 
+ 346 CMAPFONTS = .;$TEXMF/dvipdfmx/CMap//;$TEXMF/fonts/cmap//

で、そこにパスを通します。

dvipdfmx-20090708$ sudo ln -s /usr/share/ghostscript/8.15/Resource/CMap  /usr/share/texmf/dvipdfmx/CMap

最後に、もう一度パスを通します。

dvipdfmx-20090708$ sudo mktexlsr

これで、ちゃんと動くようになってるはずです。目的のtexファイルをpdfに変換してみてください。
なお、パス修正時にお世話になったコマンドを紹介しておきます。
locate ・・・ ある単語が含まれるパス一覧を出してくれる。updatedbをしないと、最新情報は見れないので注意。
make uninstall ・・・ アンインストール。5回はやったかもw。

それでは、インストール作業頑張ってください^^

参考サイト:
http://groups.google.co.jp/group/fj.comp.texhax/browse_thread/thread/72b421245869931d?pli=1

October 18, 2009

リモートサーバのGUIを使う方法

DISPLAY=自分のIP:0.0 ssh -X リモートサーバのIP

TCP 6000のポートを開けておきましょう。

CentOSにXとかをインストールする方法

CentOSで最初のインストール時にX Window(GUI)をインストールしなかった時、後から追加したい場合には、

# yum groupinstall “X Window System” “GNOME Desktop Environment”

参考:http://blog.livedoor.jp/loopus/archives/50161232.html

September 28, 2009

ニコニコ生放送でコメントを書き込むperlプログラム

にこ生にコメントを書くほうも、ついでに。

#!/usr/local/bin/perl

use LWP::UserAgent;
use HTTP::Cookies;
use URI::Escape;
use HTTP::Request;
use HTTP::Headers;
use IO::Socket;
use IO::Select;

# 初期設定
my $video_id = $ARGV[0] || die “lvから始まる生放送IDを入力してください”;

my $mail = メールアドレス;
my $password = パスワード;

# UserAgentの設定
my $ua = LWP::UserAgent->new;
$ua->cookie_jar( HTTP::Cookies->new(
file => ‘cookie.lwp’,
autosave => 1,
));

# ログイン
my $res=$ua->post( “https://secure.nicovideo.jp/secure/login”,
[
mail => $mail,
password => $password,
]);
print “Login : “,$res->status_line,”\n”;

#$ua->get( “http://live.nicovideo.jp/watch/$video_id” );

$res = $ua->get(“http://live.nicovideo.jp/api/getplayerstatus?v=$video_id”);
$\=”\n”;
print “API connect : “,$res->status_line,”\n”;

my $content = uri_unescape($res->content);
use XML::Simple;
my $parser = XML::Simple->new;
my $xml = $parser->XMLin($content);


my $server = $xml->{ms}->{addr};
my $port = $xml->{ms}->{port};
my $thread_id = $xml->{ms}->{thread};

my $ticket= $xml->{rtmp}->{ticket};
my $base_time= $xml->{stream}->{base_time};
#use Time::HiRes;
#print Time::HiRes::time;
#my $now= Time::HiRes::time;
my $vpos=(time-$base_time)*100;

my $mail=”184”;
my $user_id = $xml->{user}->{user_id};
my $premium = $xml->{user}->{is_premium};

#save xml
my $post_data = “<thread res_from="-100" version="20061206" thread="” . $thread_id .”" />\0”;

my $selecter = IO::Select->new;             # select の前準備

print “$server:$port\n”;
my $sock = IO::Socket::INET->new(“$server:$port”);  # 各サーバのソケットを生成

$selecter->add($sock);                              # select の対象ソケットに追加
my $sock2host = “$server:$port”;                # メッセージ表示用ハッシュ

print $sock $post_data;

$sock->flush();                                     # バッファをフラッシュ

my $thread=&getComment();
die “” unless($thread=~/last_res=”(\d+)”/);
my $block_no=int ($1/100);
$res = $ua->get(“http://live.nicovideo.jp/api/getpostkey?thread=$thread_id&block_no=$block_no”);
my $data=$res->content;

my $postkey=substr($data,index($data,’=’)+1);
my $comment= “<chat thread="$thread_id" ticket="$ticket" vpos="$vpos" postkey="$postkey" mail="$mail" user_id="$user_id" premium="$premium">こんにちは〜</chat>\0”;

print $sock $comment;

# 読み込みが完了していないソケットが残っていたら
sub getComment
{
my ($readable_socks) = IO::Select->select($selecter, undef, undef, undef);

# 読み込み可能なソケットがあれば、以下の foreach ループが実行される
foreach my $sock (@$readable_socks){
my $len = sysread($sock, $buf, 4096);   # ソケットから 4096 バイト読み込む
print “read ${len}bytes from $sock2host\n $buf…”;
if ( $buf=~/\/disconnect/)
{
print “放送終了: $sock2host\n”;  # そのソケットからの読み込みは終了
$selecter->remove($sock);         # select の対象から外す
$sock->close();                   # ソケットをクローズ
$continue=0;
}
return $buf;
}
}

ちょー汚いですが、用は
<chat thread="$thread_id" ticket="$ticket" vpos="$vpos" postkey="$postkey" mail="$mail" user_id="$user_id" premium="$premium">こんにちは〜</chat>
っていうデータを送信したいだけです。
そのデータ収集のために、いろいろやってます^^;
参考サイトは、先日の日記とほぼ同じなので割愛 (´もω(+”)ノ

September 23, 2009

ニコ生のコメントを取得するperlプログラム

perlでニコ生のコメントを取得できるようにしてみたよ。

ソケットプログラミングとか、何か楽しい。
使い方:lv番号を渡して実行してください。

#!/usr/local/bin/perl

use LWP::UserAgent;
use HTTP::Cookies;
use URI::Escape;
use HTTP::Request;
use HTTP::Headers;
use IO::Socket;
use IO::Select;

# 初期設定
my $video_id = $ARGV[0] || die “lvから始まる生放送IDを入力してください”;

my $mail = メールアドレス;
my $password = パスワード;

# UserAgentの設定
my $ua = LWP::UserAgent->new;
$ua->cookie_jar( HTTP::Cookies->new(
file => ‘cookie.lwp’,
autosave => 1,
));

# ログイン
my $res=$ua->post( “https://secure.nicovideo.jp/secure/login”,
[
mail => $mail,
password => $password,
]);
print “Login : “,$res->status_line,”\n”;

$res = $ua->get( “http://live.nicovideo.jp/api/getplayerstatus?v=$video_id”);
$\=”\n”;
print “API connect : “,$res->status_line,”\n”;

my $content = uri_unescape($res->content);
die “放送してません” unless $content=~m!<ms><addr>(.*)</addr><port>(\d*)</port><thread>(\d*)</thread></ms>!;
my ($server,$port,$thread_id)=($1,$2,$3);
#save xml
my $post_data = “<thread res_from="-100" version="20061206" thread="” . $thread_id .”" />\0”;

my $selecter = IO::Select->new;             # select の前準備

print “$server:$port\n”;
my $sock = IO::Socket::INET->new(“$server:$port”);  # 各サーバのソケットを生成
$selecter->add($sock);                              # select の対象ソケットに追加
my $sock2host = “$server:$port”;                # メッセージ表示用
print $sock $post_data;                               # この書き込みするとコメントを送信してくれる
$sock->flush();                                     # バッファをフラッシュ

my $continue=1;

# 読み込みが完了していないソケットが残っていたら
while ( $continue ){
my ($readable_socks) = IO::Select->select($selecter, undef, undef, undef);

# 読み込み可能なソケットがあれば、以下の foreach ループが実行される
foreach my $sock (@$readable_socks){
my $len = sysread($sock, $buf, 4096);   # ソケットから 4096 バイト読み込む
print “read ${len}bytes from $sock2host\n $buf…”;
if ( $buf=~/\/disconnect/)
{
print “放送終了: $sock2host\n”;  # そのソケットからの読み込みは終了
$selecter->remove($sock);         # select の対象から外す
$sock->close();                   # ソケットをクローズ
$continue=0;
}
}
}

例:

$ perl nicolivecomment.pl lv4428803

出力

read 1448bytes from msg101.live.nicovideo.jp:2808
<thread last_res=”40” resultcode=”0” revision=”1” server_time=”1253706359” thread=”1005523015” ticket=”0x9e8e580”/><chat anonymity=”1” date=”1253705787” mail=”184” no=”1” premium=”1” thread=”1005523015” user_id=”uDy9TgWasnzEO2zbgo9xnWnqtVU” vpos=”2000”>こっそりと聞いて</chat><chat anonymity=”1” date=”1253705793” mail=”184” no=”2” premium=”1” thread=”1005523015” user_id=”X-UeIgE9Z8ujNsvYN-vKkK_25Gg” vpos=”2635”>そぉい</chat>

長いので以下省略。仕様変更したらうまくいかないかもしれません。

参考にしたサイト
http://x68000.q-e-d.net/~68user/net/http-parallel-1.html
http://d.hatena.ne.jp/dambiyori/20081227/1230393234

July 13, 2009