Ruby の Mechanize を使って Yahoo! JAPAN にログインする

mechanize は version 2.3 を使用 (現時点最新).

要約 : 正しいブラウザであると見せかけ .albatross を倒し連続アクセスを避ければ良い

(2012-03-05 追記) 単なる code snippet なんで gist に移しました

login to Yahoo! JAPAN with Mechanize on Ruby - Ruby の Mechanize を使って Yahoo! JAPAN にログインする - Gist

(2012-03-03 追記) Ruby コードは GitHub に置いてみました.

kaosf / login-to-yahoo-jp-with-mechanize-on-ruby | GitHub

課題

  • agent.user_agent は何ぞ他にもっと短く書けないのか
  • JavaScript は Mechanize では扱えないので WatirSelenium を検討する

参考

プログラムを用いたYahoo!Japanへのログイン手法 | Tomi-flu

mechanize-2.3 Documentation

RVM から rbenv + ruby-build に乗り換えました (on Ubuntu 10.04 Server)

複数の Ruby 環境を管理するために今まで RVM を使っていましたが,rbenv と ruby-build を使う方が便利だよとか Bundler あるのに gemset とかオワコンとか聞いた気がするので乗り換えました.

簡単に概念を説明すると,rbenv で複数の Ruby 環境を管理出来,ruby-build を使うことで自分でいちいち Ruby をビルドする手間が省けるようになる,という感じです.

(2012-03-06 追記) 嘘でした.RVM 同様,自分でビルドはさせられます.なので build-essential や zlib1g-dev パッケージは必要です.

前準備 (curl も必要でした)

sudo aptitude install git-core curl

もしかすると,以下も必要かも?必要です.zlib1g-dev がまず必要であり,rails 使おうとするなら libreadline-dev (無いと rails c 出来ない) や libssl-dev (無いとブラウザからアクセスしたときエラー出る) も必要です.後から依存するパッケージをインストールした場合は rbenv install 1.9.2-p290 等でリビルドする必要がある…かと.

sudo aptitude install libreadline-dev libssl-dev zlib1g-dev

さて…

RVM、お許しください!

rvm seppuku

なおこのとき,自分で作った随所の .rvmrc ファイルは自動的に消えないので手動で消してねって警告が出ました.別にあっても困りませんので見つけたら消していけばいいかと.あと,.zshrc とか .bash_profile とかその辺に残っている

[[ -s "/home/ka/.rvm/scripts/rvm" ]] && source "/home/ka/.rvm/scripts/rvm"

も消しておきましょう.

ここから rbenv + ruby-build の準備 + 構築です.基本的に GitHub の解説通りにコマンド打っていけば OK です.

sstephenson/rbenv - GitHub
sstephenson/ruby-build - GitHub

このエントリは,GitHub に書いてある解説を見て試した一人の人間の単なる結果です.いずれ古くなるでしょうし,英語読むのしんどいからちょっと参考に… 程度にお使い下さい.

cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.zshenv
echo 'eval "$(rbenv init -)"' >> ~/.zshenv
exec $SHELL
mkdir -p .rbenv/plugins
cd .rbenv/plugins
git clone git://github.com/sstephenson/ruby-build.git

後はインストールしたい Ruby を以下のようにインストール.自分でビルドしないとは言えファイルの展開には結構時間掛かる.

rbenv install 1.9.3-p125
rbenv install 1.9.2-p290
rbenv rehash

デフォルトで使うバージョンを指定するには

rbenv global 1.9.3-p125

どこか特定のディレクトリであるバージョンの Ruby が使いたいなら

cd somewhere
rbenv local 1.9.2-p290

Rails とか Bundler とかインストールしたら

rbenv rehash

結構忘れやすいので注意.

参考

か(@ka_)/2012年02月18日 - Twilog

ローカルで dump した PostgreSQL のバックアップを Heroku に restore する

ローカルの動作環境は以下の通り.

まず heroku で pgbackups という addon を導入しておく.現時点では以下のコマンドで OK*1

$ heroku update
$ heroku addons:add pgbackups

Heroku ではない何処かに既にある PostgreSQL のデータベースを dump しておき,それをどこか DL 可能な場所にアップする.

私の場合は,自前のサーバからバックアップし,自前の web サーバにアップした.

# まずバックアップ
$ su - postgres
$ pg_dump <DATABASENAME> -F c -f <DUMPFILE>
$ cp <DUMPFILE> <どこか>
$ exit

で, をどこか HTTP で DL 可能な場所にアップする.
そこの URL を とする.

まず heroku pgbackups のヘルプを読んでみる.

$ heroku pgbackups --help
Usage: heroku pgbackups

 list captured backups

Additional commands, type "heroku help COMMAND" for more details:

  pgbackups:capture [DATABASE]                           # capture a backup from a database id
  pgbackups:destroy BACKUP_ID                            # destroys a backup
  pgbackups:restore [<DATABASE> [BACKUP_ID|BACKUP_URL]]  # restore a backup to a database
  pgbackups:url [BACKUP_ID]                              # get a temporary URL for a backup

上記のように書いてあるので,pgbackups:restore を試してみる.

$ heroku pgbackups:restore <DATABASENAME> <DUMPFILE_URL>

すると,以下のようなエラーが.

 !    Could not resolve database <DATABASENAME>
 !
 !    Available databases:
 !    SHARED_DATABASE (DATABASE_URL)
[1]

よく分からないが SHARED_DATABASE が Available とのことなので,以下のコマンドを打ってみる.

$ heroku pgbackups:restore SHARED_DATABASE <DUMPFILE_URL>

すると以下のような出力があり,破壊的な動作だからと警告が出ている.

SHARED_DATABASE (DATABASE_URL)  <---restore---  <DUMPFILE>

 !    WARNING: Potentially Destructive Action
 !     This command will affect the app: <CUSTOM_DOMAIN>
 !    To proceed, type "<CUSTOM_DOMAIN>" or re-run this command with --confirm <CUSTOM_DOMAIN>

> 

ここで入力待ちになっている.処理をするために, と入力するか --confirm とオプションを付けてコマンドをもう一回実行しろと言っている.なので と入力する.

> <CUSTOM_DOMAIN>
Retrieving... done
Restoring... done

ここで特にエラーも出ずに終了.

そして http://.herokuapp.com にブラウザからアクセスして確認すると,restore がちゃんと出来ていた.データベースの中身がちゃんと入っていた.

すごい!

そもそもなんでこんなことになったかって… development 環境で,動作確認のためだったのに本番に入れていいデータを 10 件くらい入力してしまっていて,これをまた入力するのめんどいな… そのまま restore 出来ないのかな… となったからです ^^;

本番環境に restore するって,ちょっとおかしいためなのかその方法を書いてる記事が見つかりませんでした.バックアップの手法の解説は公式のマニュアルも含めて 3 件ほど見つけましたが…

普通に再度入力した方が明らかに早かったですが,いい練習にはなりましたw

ちなみに,db/schema.rb はローカルも Heroku 側も一致してないとダメ…だと思います.私が今回試したこの例では,一致していました.違っていると,restore 時にエラーが出るのかもしれません.

あと SHARED_DATABASE ってのが何のことなのかよく分からないので,どなたかご存知でしたらご教授下さい (他力本願).

あとそもそも外部に PostgreSQL の database があるなら,heroku_external_db なる gem がある (nbudin/heroku_external_db - GitHub) そうなので,これ使う方がいいかもしれません.まだ私は使ってないので詳しくは分かりませんが…←heroku_external_db は MySQL を使うためのもののようです.PostgreSQL ならそもそも gem なんて無くて良かった.そのための方法を以下にまずは簡単に追記

2011-12-24T23:08:00+09:00 追記

heroku config コマンドで,Heroku のデプロイされた環境における環境変数が確認出来る.ここで,DATABASE_URL という値があるが,これがデフォルトだと

DATABASE_URL => postgres://なんじゃらかんじゃらamazonaws.com/なんとか

となっているはずである.(これは SHARED_DATABASE_URL の値と同じになっているはずである.) 実は,ここを自分で作った DB に接続出来るものに書き換えるだけで,外部の PostgreSQL の DB が使える.変更の方法は以下の通り.

heroku config:add DATABASE_URL=postgres://<USRENAME>:<PASSROD>@<HOSTNAME or IPADDRESS>:<PORT>/<DATABASENAME>

この辺の仕様に関しては,PostgreSQL の領域である.

これで私は今現在,sakura VPS 512 上に用意した PostgreSQL に Heroku から接続してやることに成功している.

追記ここまで

参考記事

追加 2011-12-24T23:08:00+09:00

*1:半年も経過すると変わっている可能性は非常に高い

Windows 7 で yamy を使ってキー配列を変更 (Windows XP での窓使いの憂鬱の後継)

窓使いの憂鬱は色々な事情から Windows VISTA/7 で使えなくなったようです.で,その後継に yamy なるツールがあるそうです.

とりあえず設定ファイルの書き方は窓使いの憂鬱そっくりなので,助かりました.何とか適当にググってるだけで従来 Windows XP で行なっていたことは実現出来ました.で,後の自分のためにもメモを残しておきます.

実現したいことは,

  • 日本語 109 キーボードを US 配列にする
  • US 配列にした上で ] キーを Enter キーにする (US 配列ではこの位置が Enter なので)
  • CapsLock を Left Control にする
  • US 配列にしたせいで Space になってしまう無変換キーを IME 起動キーにする
  • US 配列にしたせいで Space になってしまう変換キーを変換キーに戻す

です.手順は以下の通り.

  1. yamy をダウンロードする.今回 DL したのは "YAMY 0.03 (UNICODE)"
  2. 何処でもいいので展開する.
  3. yamy.ini の escapeNSLKeys = 0 を 1 に変更する.
  4. yamy.exe と同じ階層に .mayu を用意する
  5. yamy.exe を「管理者として実行」する.

.mayu ファイルの内容は以下の通り.

include "109.mayu"
include "104on109.mayu"
def subst *RightSquareBracket = *Enter
def subst *E0英数 = *E0英数
mod control += E0英数
key *E0英数 = *LControl
def subst *変換 = *変換
def subst *E0無変換 = $ToggleIME

注意する点は,窓使いの憂鬱で「英数」「無変換」と書かれていたものを「E0英数」「E0無変換」と書く必要があること.E0 (O (alphabet) じゃなく 0 (zero)) であること注意.

"def subst *E0英数 = *E0英数" の行の設定は無意味に見えるが,その理由は日本語キーボードで英語配列 + 色々な設定 (Windows XP) - かおすふぃーるど - kaosfield Blog (私の過去のエントリ) を参照.

参考サイト

ちなみに .mayu ファイルは普通にファイル名変更では作れないので,例えば a.txt を .mayu の内容で編集しておいて,コマンドプロンプト

move a.txt .mayu

としてやれば良い.

窓使いの憂鬱 for Happy Hacking Keyborad Professional 2 (HHK Pro2)

基本的に高性能過ぎて涎が出そうになる HHK Pro2 ですが,キーが少なくて個人的にはちょっと使い辛いと思うのも事実.(参考 : Happy Hacking Keyboard HHKB Professional2 | 標準モデル | PFU)

ということで,ディップスイッチと窓使いの憂鬱で使いやすいようにしよう!

以下の目的を達成するためのディップスイッチと窓使いの憂鬱の設定ファイルを書き記します.

  • 英語配列
  • Esc と Grave/Tilde (` と ~) の位置入れ替え
  • 左下の Alt (Opt) キーを「無変換」にしてこのキーで IME 起動
  • 右下の Alt (Opt) キーを「変換」

以前書いた「日本語キーボードで英語配列 + 色々な設定 (Windows XP)」の設定も参考にします.

ディップスイッチは 3 と 5 を ON に,他は OFF に.
(※考えてみたらこの設定って今回の内容と本質的に関係ない気がする.)

dot.mayu とか .mayu とかに書いておくべき設定は以下の通り.

include "109.mayu"
include "104on109.mayu"
keymap Global
def subst *Esc = *$GRAVE_ACCENT
def subst S-*Esc = *$TILDE
def subst *半角/全角 = *Esc
def subst *変換 = *変換
def subst *無変換 = $ToggleIME

Windows XP 側では,普通に日本語キーボードのドライバを使うよう設定しておきます (つまり何もしない).

詳しい解説は… 聞きたい人はコメントして下さい.コメントしてくれたら,やる気が起動して書きます (公約).

でも keymap Global の意味とかもう大方忘れちゃってるなぁ…

まずは窓使いの憂鬱のオンラインマニュアル 7. customizeを読んだ方が早いかも…

Git 練習の件

サポーターが集まるまで毎日やるのはやめときますw

ただ,ミスった commit を無かった事にしたいとか,特定の revision まで戻って別の方向でやり直したいとかいうことを早速やる必要性が出てきたので,また色々実験してます.

そこで試行錯誤した結果は適当にメモってる (手書き) ので,それをまた適当に公開していこうかなと思います.

kezoku.com にて宣言したのは,果てさてどう扱えばいいのか… ^^;

Git を使えるようになるまで頑張る その 1

Git のいろは

ここを見ながら適当に色々やってみた結果です.

動作環境は,さくら VPS 512 上の Ubuntu 10.04 です.

$ sudo aptitude install git-core

で Git はインストールされています (RVM のために既にインストールはしていました).

まず,使えるエディタを Vim に変更したかったので,Twitter で軽く質問的な tweet を投げました.そして返って来た返答がこちら.

$ git config --global core.editor vim

※core.editor = vim と誤って記載していたのを修正

もしくは

$ export EDITOR=vim

後者の方は,.bashrc なり .zshrc なりに書いておけばいいでしょう.

とりあえず私は前者を実行しました.このとき,何のレスポンスも無かったので変更されてるのかどうか分かりませんでしたが,Twitter で man git-var で解説を見てご覧と言われたので,見てみたら,どうやら

$ git var -l

で確認出来そうでした.実際 core.editor = vim となっていました.

また,この設定は $HOME/.gitconfig にも記載されていました.

さて,Git のいろはの最初の方だけを見ながら,ひとまず rollback 的な動作はまったく考えず,commit の繰り返しだけとにかくやってみよう,ということで実験.

$ cd ~
$ mkdir -p work/git/test0
$ cd work/git/test0

とりあえず適当に Git 実験用ディレクトリ作ってそこに移動して…

$ git init

はい,なんとこれだけでリポジトリが作られるようです.

ここで Git の幾つかの機能を実験.

$ git status
$ git diff
$ git log

git status で

# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use "git add" to track)

…と言われますね.

git diff は何も出ません.そりゃ何もしてないのだから差分は何も無いわけですな.

git log も

fatal: bad default revision 'HEAD'

まだログは何も無い.エラー的な文章になってる意味は分かりません.

さて,ファイルを作ってみます.

$ touch a.txt

ここで同様に 3 つのコマンドを実行してみると git status だけ結果が変わってます.

# On branch master
#
# Initial commit
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       a.txt
nothing added to commit but untracked files present (use "git add" to track)

ははぁ.a.txt を git add でどうにかしなさい,というような感じですね.

git add は,Git のいろはでも「追跡対象に追加する」という説明以外は特に説明もなく出てますね.

じゃあやりましょう.

$ git add a.txt
$ git commit

git commit した時点で Vim が起動されたと思います.されてない人は… 環境変数読み直すとかが出来てない可能性が…?

で,この辺 Subversion と同じで私は何となく分かります.要するに,1 行目に commit message を追加すればいいのでしょう.2 行目以降の # で始まる行は,全部コメントとなり無視される…と.ああ,書かれていますね.

Please enter the commit message ... with '#' will be ignored, ...

では早速 1 行目に

add a.txt

とでも書いて,保存して終了します.

すると,おっ?何か出ましたね.

[master (root-commit) 65e64e5] add a.txt
 Committer: ka <ka@XXX.sakura.ne.jp>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name <you@example.com>'

 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a.txt

コミット出来たような気がします.

$ git log

で,何やらログが見えますね.

commit 65e64e5cb591a3f4740bf5448ede40ab18c0d812
Author: ka <ka@XXX.sakura.ne.jp>
Date:   Tue Sep 27 23:43:39 2011 +0900

    add a.txt

さて,では a.txt をちょいと編集してみましょう.abcd とでも追記します.

で,

$ git diff

すると

diff --git a/a.txt b/a.txt
index e69de29..acbe86c 100644
--- a/a.txt
+++ b/a.txt
@@ -0,0 +1 @@
+abcd

おっ.差分出ますね.

次は git add しないで commit してみます.

$ git commit
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   a.txt
#
no changes added to commit (use "git add" and/or "git commit -a")

エラーです.add しないと,commit 出来ないんですね.理由はまだよく分かりません.

さて,git commit には -a オプションを付けるとなんだか add をすっ飛ばせそうな雰囲気が Git のいろはの 18 ページから漂ってきます.試しましょう.

$ git commit -a

おお!エディタ開きますね!で,同じく commit message を書いて,保存して終了.

[master 0716bf5] add abcd to a.txt
 Committer: ka <ka@www8070u.sakura.ne.jp>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:

    git config --global user.name "Your Name"
    git config --global user.email you@example.com

If the identity used for this commit is wrong, you can fix it with:

    git commit --amend --author='Your Name <you@example.com>'

 1 files changed, 1 insertions(+), 0 deletions(-)

commit message は add abcd to a.txt としてみました.

で,git log を見てみると…

$ git log
commit 0716bf575448159ce6e316eb11881753326e9b2f
Author: ka <ka@XXX.sakura.ne.jp>
Date:   Tue Sep 27 23:51:41 2011 +0900

    add abcd to a.txt

commit 65e64e5cb591a3f4740bf5448ede40ab18c0d812
Author: ka <ka@XXX.sakura.ne.jp>
Date:   Tue Sep 27 23:43:39 2011 +0900

    add a.txt

ふむぅ.ログ見えますね.

とりあえず,今日はここまで.