0

Google Talkで自分のIPアドレスを送信する

Ubuntu入れて大学のWiFi内で動かしているノートPCを主にUstream用途に使っているんだけど
DHCPで自動割り当てされるIPアドレスをsshやVNCでリモートログインしたい時にいちいち調べるのもめんどうなので作った。

前にgtalk-sendコマンドで使ったXMPP4RというRubyのXMPPライブラリを使って、google talkにIPアドレスを投げるようにしてみた。

gtalk-send-ip.rb

#!/usr/bin/env ruby
require ‘rubygems’
require ‘xmpp4r’
require ‘kconv’

ifc = `/sbin/ifconfig` # OS毎にパスが違うかも
inets = ifc.scan(/.*(inet.*) .*/i)
puts ‘–your IP info–‘
puts inets

user = ‘your-google-account’
pass = ‘your-google-password’

client = Jabber::Client.new(Jabber::JID.new(user))
client.connect(‘talk.google.com’, 5222)
client.auth(pass)

puts ‘sending to: ‘ + user
msg = Jabber::Message.new(user, ‘(sho-x32) ‘+inets.to_s) # 自分に送る
client.send(msg)

puts ‘–finished–‘

ホスト名を割り当ててないマシンのIPアドレスをRubyで調べる方法がわからなかったので、ifconfigコマンドの返り値を正規表現で抜き出して送るようにした。

実行すると別マシンでログインしているGoogle Talkで受信できる
(XMPPなのでGoogle Talk以外のJabberクライアントでも使える。下ではPidginを使っている)
gtalk-send-ip.rb


cronに

0 * * * * /usr/bin/ruby /home/sho/src/ruby/gtalk-send-ip.rb

という具合に登録して1時間ごとに送信させるようにした。
gtalk-send-ip.rb
パソコン使ってるとつい時間が経ってしまうので時計代わりにもなる


ちなみにこのコード、ログインしたアカウント(自分自身)に送ってすぐログアウトしているので、メッセージは先にログインしている別のマシンに送られる。
gtalk-sendコマンドの時は「2つgoogleアカウントが必要」と書いたけど1つで大丈夫だった。

0

RubyScript2Exeで実行ファイルを作る

Rubyスクリプトをexeにできる。
試しにRuby本体もgemもアンインストールしてみたが動いたので、exe内にruby本体とrequireしたファイル全てが収まっているみたいだ。
少し古いけどRuby on Railsをexe化する記事もあったので、使い道があるんじゃないですかね。


RubyScript2Exe – A Ruby Compiler
から、rubyscript2exe.rb をダウンロードしてきてexe化したいrubyスクリプトと同じディレクトリに置く。

今回は試しにfeed-normalizer – 橋本詳解をexe化してみる。
引数で渡したURLのRSS/Atomフィードを表示する簡易Feedリーダー。引数なしではこのblogのfeedを読み込む。

rss.rb として保存(Windows用に出力文字コードだけshift_jisに変更した)

require 'rubygems'
require 'feed-normalizer'
require 'open-uri'
require 'cgi'
require 'kconv'
require 'pp'
uri = ARGV.shift || 'http://shokai.org/blog/feed/'

puts "parse #{uri}"
feed = FeedNormalizer::FeedNormalizer.parse open(uri)

puts "title: #{feed.title.tosjis}"
puts "(#{feed.entries.size}entries)"

#feed.clean!
feed.entries[0..3].each{ |e|
  puts e.url
  puts e.content.tosjis
  puts e.last_updated
  puts ''
}
#pp feed.entries[0]


■exe化
ruby rubyscript2exe.rb rss.rb
で、rss.exeが生成される。


Rubyそのものが格納されるのでファイルサイズがでっかい。puts ‘test’しただけのコードをexe化したら900kb超えた。
このrss.rbだと5個requireしているので1.5MBになった。

まあファイルサイズは大した問題でもないか

0

ahokai rev.54以降でのDBファイル名変更、buzztter検索post

(ついに本気を出して絶賛修論執筆中だけど)ahokaiiの設計を少し修正した

これまでsqlite3のデータベースファイルを db_ngrams, db_postsという2つのファイルにしていたけど
db というファイル1つにまとめました。

理由は、特に2つに分ける意味は無かったからです。

commit 54以降のバージョンにアップデートするには、
db_postsの方にクロールした元twitterアカウントのデータが入っているので、それは消さずにdbにリネームして、n-gramのテーブルを追加すると良いですよ

mv db_posts db
rm db_ngrams
ruby migrate_ngrams.rb up
ruby make3gram.rb

忘れずにmake3gramし直す。


あと、ついでにBuzztterから検索してpostを構築する機能が付けてみた。
面白くなるかはわからないけど。


マルコフ連鎖でのpost構築は、今まで頭側から行っていたけど左右両方向へ伸ばすようにしたので
これで検索機能が付けられた

ruby post3gram.rb リナカフェ

「リナカフェ」を含むpostが作られる

make post with ‘リナカフェ’
リナ カフェ が 1
—search left 3-grams—
=” リナ カフェ 1
m =” リナ 1
‘ m =” 1
e ‘ m 1
– e ‘ 1
(h)ruby – e 1
—search right 3-grams—
カフェ が オススメ 1
が オススメ ! 1(t)
ruby-e’m=”リナカフェがオススメ!


Read more

1

スーパーボット大戦

Twitter / ahokaiという、自分の過去の発言を収集し、n-gramモデルとマルコフ連鎖を用いて分析・発言するプログラムを作りました。いわゆるボットという奴です。
方法については「圧縮新聞」を作った – phaのニート日記が詳しいです。


こちらからahokaiの全ソースコードをダウンロードできます。
shokai / bot-ahokai / overview — bitbucket.org
詳しい作り方やいきさつはbot ahokaiの作成 – 橋本詳解に書いたのですが、
今回はahokaiの様な「自分の発言を再構成して喋るbot」を設置する方法を書きます。
botがたくさん喋ってくれればクリスマスも寂しくないし、師走で忙しくても平気です。みんなで実在の人物を元にしたボットを設置して裏twitterを作り、最終戦争終結後もボット同士が喋り合いスーパーボット大戦しましょう。


主な機能は

  • あるユーザの過去の発言を3000件程度取得する
  • 発言データを再構成する
  • 再構成して発言する
  • followerにランダムに話しかける
  • followしてきたユーザをfollowし返す
  • 言及してきた発言をtwitter searchで検索し、favotiteし返す
です。

Read more

1

MT3.2からWordPress2.6に移行した時の不具合をWWW::Mechanizeで修正

今年の春にSFCで動かしていたMovableType3.2が調子悪くなって、さくらに置いたWordPressに移行したわけだけど(さくらレンタルサーバ+wordpressにしてみた
その時に過去ページのいくつかが見えなくなる不具合があった。んで今朝からそれを解消するスクリプトを動かしている。今1000件目あたり。昼過ぎには完了するはず。

どういう不具合かというと、wordpressにログインしていない人がアクセスしたページは404ステータスになる。apacheが吐く404ではなくwordpressが吐く404で、「エラー 404 – 見つかりませんでした」と出る。ログインしていると普通に記事を見る事が出来る。
このせいで、俺は見れているのにURLを送ると「記事がないですよ」とみんなに言われて、原因を特定するのに時間がかかった。

そしてその修正方法だが、単に個別記事編集画面で「保存」を押すだけでその記事は復活した。なぜだかわからない。
さくらのコントロールパネルからMySQLのテーブルを見ても、どのテーブルが悪さしているのかよく分からなかったのでRubyのWWW::Mechanizeを使って全ページ「保存」ボタンを押しなおす事にした。

WWW::Mechanizeはログインフォームにパスワードを入れたり、UserAgentを偽装してwebページにアクセスしたりできる非常に有用なモジュール。Perlでは使った事あったけどRubyでは今回が初。

参考




必要なものをインストール

sudo gem install mechanize hpricot



普通にwp-login.phpからログインしてdashboardへ行き、cookieを持った状態で各記事個別ページへ移動して保存ボタンを押していく。記事個別ページが連番で助かった。あと自分のサーバをいじめたくないのでsleepは長めにしてある

shokai-blogfix.rb として保存

#!/usr/bin/env ruby
require ‘rubygems’
require ‘kconv’
require ‘mechanize’
require ‘pp’
user = “username”
pass = “password”

puts ‘start’

agent = WWW::Mechanize.new
page = agent.get(“http://shokai.org/blog/wp-login.php”)
login_form = page.forms_with(“loginform”).first
login_form.log = user
login_form.pwd = pass
dashboard = agent.submit(login_form)

puts “login: ” + dashboard.title

# 各ページ処理
for i in 1..1558
  sleep 10
  begin
    page = agent.get(“http://shokai.org/blog/wp-admin/post.php?action=edit&post=#{i}”)
    post_form = page.forms_with(“post”).first
    page = agent.submit(post_form)

    puts i.to_s+”success!” if page.body =~ /投稿が更新されました/
  rescue
    puts i.to_s+”error”
  end
end

puts ‘–finished–‘

パスワードなどは適宜変更。
URLもハードコーディングしている。1回しか使わないスクリプトだし