Hatena::ブログ(Diary)

aranagy RSSフィード

2015-08-02

[] twitter bot開発で詰まったところメモ

最近@bell_repeat というtwitter botをつくったときに
やったことや躓いたところを簡単にメモ。

Rubyのインストールし直し

さくらレンタルサーバに入れてるRubyが2.0.0だかそこらの古めのバージョンだったので
2.1.6までアップデート
最新の安定版は2.2.2だったのだけれど すこし開発に急いでいたので
「最新版だと動かないよ〜」とかあると嫌だなあとおもって1つ前の安定版にしてみた。
参考:

さくらインターネットのスタンダードプランにRuby 2.1.5を自前でインストールしてみた | 極上の人生
http://kawairi.jp/weblog/vita/2014123118992



デフォルトシェルbashにした

上の記事で書いてるとおりにbashに変えた。
特にこだわりは無いのだけれど手元もたぶんbashだし
学校とかで触ったことあるのもbashだったはずだし。

SSHログインするたびに一回 $ source $HOME/.bashrc ってやらないと
環境変数とかの設定を読んでくれないっぽい?ので忘れないようにしたい・・・

botを動かそうとしたら「SSLがなんとか」みたいなエラーでコケた

書いたコードをサーバーに移して動かそうとしたら、SSLの認証ができなかったぜみたいな
エラーが出てしまった。
参考にしたのは以下の記事

RubyHTTPS 接続するときの証明書で悩んだ話 - てっく煮ブログ
http://tech.nitoyon.com/ja/blog/2014/05/30/ruby-https-cert/

SSL証明書はここにあるはずだ〜っていう位置に何もないせいで、証明書がみつからなくてコケたらしい。
記事を参考に証明書をサーバーに置いて、それからその証明書の位置を知らせるために

export SSL_CERT_FILE=(証明書のファイルまでのパス)

を .bashrc に追記した。

csvが読めなかった

UTF-8で保存したのにASCIIなんとかで読もうとして、読めないよ〜っていうエラーが出て困った。
参考:

Japanese user list of the Ruby programming language ()
http://comments.gmane.org/gmane.comp.lang.ruby.japanese/7079

encodingを明示的に書かないといけないとのこと。

cronの環境変数

cronとかcrontabというやつ、定期的にコマンドを実行してくれるあれは、
.bashrcとかに書いた環境変数を読み込んでくれないみたい。
なのでcrontabの冒頭に、必要な環境変数は書いておいてあげる必要がある。

cron力をつけよう!全てのcrontab入門者に贈る9個のテクニック · DQNEO起業日記
http://dqn.sakusakutto.jp/2012/06/cron_crontab9.html

ここに書かれているように、
"※ LOG_DIR="$HOME/logs" のように右辺で変数を使うことは残念ながらできません"ので、.bashrcから書き写すときに $HOME になってるところはもとの値で書き起こす必要がある。
たぶん本当は必要な環境変数だけ書くべきなのだろうけど、ぶっちゃけどれが必要か判ってないため .bashrcに書いてるものは全部書き写してある。
今回はそんなに数がないからまるごと移せたけど、すごくたくさん設定してあるような環境でそれをやるわけにもいかないだろうなー

cronの実行結果

もともとさくらサーバでは別のbotを動かしている状態だったのだけど、そのコードがあんまり良くなかったせいか、実行すると警告が出る状態だった。
cronの実行結果、エラーなどの出力はメールで飛んでくるようになっていたのだけど、放置していたせいでメールボックスが87万件とかになっていてメールボックスが開けない状態になってしまっていた。
このままでは新たに今回作成したbotのログが見られないので、上の記事をまた参考にして、テキストファイルにログが吐かれるようにしてある。

cron実行時のカレントディレクトリ

cronで実行されるとき、カレントディレクトリがどこになってるかってよくわからない。
昔書いた記事ではフルパスを取得して作って・・・みたいなことをやっているのだけど、そんなことしなくても
crontabのほうに

cd (カレントディレクトリにしたいところの絶対パス) ; (実行するコマンド)

って書いてしまえば済む話だった。早い。

macSSHログイン

昔書いた記事windowsで開発してたときだったし、バージョンが古くてあまり参考にならない。
macではSSHログインしたいときは、ターミナル

$ ssh [さくらサーバのユーザー名]@[さくらサーバのユーザー名].sakura.ne.jp

って打って、パスワード入れれば、それだけでオッケー。便利。

gemのnokogiriをインストールするときに困った

botで、webページを読んで投稿日時や記事タイトル等を取得する必要があり、
nokogiriというgemを利用した。
インストールのために

$ gem install nokogiri

サーバー上で実行したら、

Fetching: mini_portile-0.6.2.gem (100%)
Fetching: nokogiri-1.6.6.2.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing nokogiri:
ERROR: Failed to build gem native extension.

/(パス)/ruby extconf.rb
checking if the C compiler accepts ... yes
Building nokogiri using packaged libraries.
checking for gzdopen() in -lz... yes
checking for iconv using --with-opt-* flags... no
checking for iconv... no
-----
libiconv is missing. Please locate mkmf.log to investigate how it is failing.

(以下省略)

のようなエラーがでてインストールできなかった。

代わりにこんなコマンドを使って入れました。

$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 gem install nokogiri --no-rdoc --no-ri

参考にしたのは以下の記事。

さくらインターネットのスタンダードプランにRailsインストールしようとしたらnokogiri が使うライブラリのチェックで怒られた件 | 極上の人生
http://kawairi.jp/weblog/vita/2015010319009



twitterのメモ

client.retweetツイートのidをわたすだけでよいんだって、便利
・user_timelineであるアカウントの投稿を全部取得するというのをやったのだけど、
そのアカウントツイート数より、取得できたツイートが10個少ないということが起こった。
RTも含めて取得したのだけど・・・いまのところ原因不明。


おわり。たくさん躓いた。

2013-12-31

[] 2013年のはなし

実家でまったりしているaranagiです。
いつの間に大晦日がやってきてしまったので、
年のまとめをしたいとおもいます!

kosenconf-066numazu2

高専カンファin沼津2、今年のことだったんすね・・・!
なんだか遠いことのようで1年の長さを感じます。
沼津1では、自分がスタッフなのにたのしもうとしすぎていたところがあったのを反省していて、今回はスタッフとして裏側に注力したいなとおもって行動してました。
それがうまくいったかはちょっとあまり自信がない部分もありますが
でもたくさんのひとに来ていただけてとてもよかったです。
もう来年1/18には沼津3が開催されます。
自分は発表者で参加予定です、よろしくお願いします!

卒業/就職

とうとう高専を卒業し社会人になりました。
5年間の学生生活は自分にとってドでかい影響がありすぎて、
正直もう卒業したらその後なんてどうでもいいやとかおもってたときもありましたけど
なんだかんだ社会人ライフも頑張ってます。

一人暮らし

就職に合わせて一人暮らしを始めました。
実家暮らしがすごくストレスたまってたので、ホントいま楽しいです。
家事やってくれる人が居ないのはめんどいけど、
好きなときに好きなことを、自分の分だけやればいいのは実家暮らしではできないことでした。

あらたな世界

自分がインターネットで絡んでいたのはほとんどが高専つながりの人々だったのですが、
今年は「ケモノ着ぐるみ」の界隈に飛び込みました。
自分がもともとドラゴンやケモノが好きで、ある日着ぐるみの写真を偶然初めてみたときに「可愛すぎる!」と一目惚れしたのがきっかけで、知り合いが一人も居ないイベントに参加することになりました。
知らない人と接するのがとても苦手なので、実はイベントに向かう電車の中では(怖いなあ引き返そうかなあ)なんて考えていました。
でもあのとき自分が勇気をもって参加したお陰でたくさんステキなものに出会えて世界が広がって、ほんとに良かったです。
来年は着ぐるみ制作に手を出して頑張っていこうかなあなんておもってます。

合同誌制作

これがここ数ヶ月頑張ったこと!
創作活動をしている高専生の作品をあつめて合同誌を作りました。
そして先日12/30にコミケ頒布を行い、自分が思っていたよりも多くの人に手にとっていただくことができました!
嬉しいことに、刷った分は、参加者にお礼としてお渡しする分を除くともうホントに少数しか残っていません。もう「ほしい」と声をかけてくれている人全員分には足りない感じがしていて、判断をミスったなあと反省しています・・・
増刷とか電子版とか、なんとかみなさんの手にお渡しできる方法を検討中ですのでお待ちください!


というわけでわたしの2013年はこんな感じでした。
いろいろめまぐるしくて、でもすごく幸せな年でした。
本当にありがとうございました。来年もまたよろしくお願いします。

2013-07-27

[] MBAの環境整備


先日MBA13インチの安い方を購入しましたので環境整備とかしてました。
やったこととかわかったことのメモ。

AppStoreから入れたもの

  • 夜フクロウ
  • Xcode

XcodeをAppStoreからインストールしたあと、なにか適当なプロジェクトつくって起動して、
画面左上のXcode->Preferencesを開く
それから出てきた画面のDownloadsのCommand Line Toolsもインストールする
せっかくなのでiOS 6.0 Simulatorもインストール

インターネットでとってきたもの

  • GoogleChrome
  • Google日本語入力

Chromeはログインしたらすぐいつもの環境がやってくるのが便利すぎる

コマンド叩いたもの

パッケージ管理のためのものらしい
たぶん何かあたらしいコマンドをインストールするときにこいつを経由することでいろいろ楽になるんだと思う
インストールは公式ページに有る

$ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"

を実行
それから

$brew doctor

を実行して、準備オッケーだよみたいな意味の文が出てれば問題なし
自分は何かのファイルにどれどれを追記しろみたいな内容の英文が出ていたのでそのまま従った
実はたしかHomebrewを入れてる時にここに乗っているエラーに遭遇して悩んだ覚えがあるのだけど、
どこで遭遇したか記録がないので細かく書けない
いちおうメモとして貼っておく
YOMiTOKU: brew doctorの /usr/bin occurs before /usr/local/binにはまったときの解決法

  • git

さいきんRubyとかRailsでなにか作ってみるときgitを使うようにしていて、こっちでもその続きが開発できるようインストール
Homebrew経由でインストールするには以下を実行

$brew install git


  • readline

rubyのirbって対話型で実行できる機能のときに、こいつを入れないと日本語が入力できないことがあるようなのでインストール

$brew install readline


これから入れるrbenvを便利に使うために必要らしい
rbenvではrubyインストールするのになんだか難しいものを書かなければいけないようなのだけど、こいつが居るとそれが自動で出来上がるらしい

 rbenvは複数バージョンのrubyをすぐ切り替えられるということのみにフォーカスしてて、ruby本体をインストールするのは自前でmake等します。毎回それは面倒すぎる。そこで、ruby各バージョンのビルド内容のレシピをもっててコマンド一発でやってくれるよう、補助的に用意されているのがruby-buildなわけです。わー、ruby-build便利!

homebrewで入れたreadlineを使いつつruby-buildでruby入れてみた - Meltdown Countdown rev.

とのことなので以下のコマンドでインストール

$brew install ruby-build


  • rbenv

Homebrewが自分が追加したコマンドを管理してくれる(?)みたいにrbenvは自分で入れたrubyを管理してくれるらしい
いろんなrubyのバージョンを切り替えたりしながら使うこととかできる
自分はrubyをいくつも使い分けたりする予定はないけれども、Homebrew経由で入れたrubyがうまく使えないっていう事態に見舞われたのでこいつ経由で入れなおした
Homebrew経由でインストールするので

$brew install rbenv


Rubymacに標準で入っていて、Homebrewのインストールでも使っているのだけど、
どうにもバージョンが古くてRailsが入れられないようなのであたらしいRubyを入れてみた
自分がインストールしようとした時点でのRubyの最新の安定版は2.0.0-p247というやつだったから
さっき入れたrbenvを利用してインストール

$rbenv install 2.0.0-p247

rbenvではインストールとかなにか変更をしたとき、パスを通すために以下を実行しないといけない

$rbenv rehash

そのあと、ターミナルで単にrubyって打つときに使われるような、いわゆるデフォルトのバージョンを決めるために以下を実行
変更が起こるわけなのでrehashもする

$rbenv global 2.0.0-p247
$rbenv rehash

それから以下を実行してインストールしたバージョンが出れば問題なし!

$ruby -v

ちなみに $rbenv install -l したら、インストールできるRubyのバージョンの一覧みたいなのが見れた(めっちゃたくさんあった)

無事ruby2.0.0が入ったところでやっとRailsインストール
今度はRailsgemというやつ経由で入れるらしい
gemはRubyGemsのことで、Rubyに関する追加機能の管理をやってくれるようだ
寺子屋で触ったときはgemRailsの追加機能を入れるためのものだと思っていたのだけど、勘違いしていた!
gemRailsを入れるには以下を実行

$gem install rails

実行が終わったら、rubyまわりの変更が起こったということでまたrehashしないといけない。

$rbenv rehash


  • rbenv-rehash

$gem installするたびにrehashするのは非常にめんどくさそうなので、自動化してくれるものをインストール

$gem install rbenv-rehash



以上。これで環境が整ったので、次はgitから自分がRailsで作りかけのものを引っ張ってきて動かすフェーズ。

2013-03-22

[] さくらレンタルサーバをつかってRubyで書いたtwitterbotを動かす

自分のマシンはwindows7。

1.ローカルにRubyの環境を作る

RailsInstallerにおまかせ。

2.ローカルにライブラリインストールする

Rubyではgemというかたちでライブラリが用意されているらしい。

RubyでTwitterBotを作ってみた(5 STEP) - himajin315の記録
http://d.hatena.ne.jp/himajin315/20120616/1339849875

こちらのSTEP4に従った。

gem install twitter
gem install userstream

を実行して待ってただけ。

3.レンタルサーバにもライブラリインストールする

さくらレンタルサーバにはRubyがもともとインストールされているが、必要なgemは自分で入れないといけない。

さくらレンタルサーバーに RubyGems をインストールする手順 - Google App Engine+Pythonで脱プログラミング初心者を目指す日記
http://d.hatena.ne.jp/ishimarum/20080929/1222689905

こちらに従った。

SSHログインにはTeraTermを使った。
自分がログインしたときの設定は

ホスト: [ユーザ名].sakura.ne.jp
サービス: SSH
TCPポート: 22
SSHバージョン:SSH2
プロトコル:UNSPEC

ログイン押したあとユーザ名とパスワードを聞かれるので入力。

インストール時に権限がないとかで怒られたときはこちらを参考にした。

さくらインターネットのcronでRubyで書いたTwitterBotを動かす - やぶろぐ
http://d.hatena.ne.jp/hellon999/20100807

要は

setenv RB_USER_INSTALL true

を実行してからgem installやるとうまくいく。

4.bot用のtwitterアカウントを作って、そのアカウントで外部アプリの登録をする。

Twitter Developersからbot用のアカウントログインして登録する。
こうすることで認証部分をプログラムでつくらなくてもtokenを得ることができる!

5.コードを書く

こちらのSTEP4の1にある定期post用のコードを引用して編集した。

RubyでTwitterBotを作ってみた(5 STEP) - himajin315の記録
http://d.hatena.ne.jp/himajin315/20120616/1339849875

実行されたら発言をまとめたdatファイルを読み込み、そのなかの1行をランダムに選び1回postする。
ほげほげの部分は4.の登録で得たものを入力しておく。

#coding:utf-8

require 'rubygems'
require 'user_stream'
require 'twitter'

consumer_key = 'ほげほげ'
consumer_secret = 'ほげほげ'
oauth_token = 'ほげほげ'
oauth_token_secret = 'ほげほげ'

UserStream.configure do |config|
 config.consumer_key = consumer_key
 config.consumer_secret = consumer_secret
 config.oauth_token = oauth_token
 config.oauth_token_secret = oauth_token_secret
end

Twitter.configure do |config|
 config.consumer_key = consumer_key
 config.consumer_secret = consumer_secret
 config.oauth_token = oauth_token
 config.oauth_token_secret = oauth_token_secret
end

client = UserStream.client
max = 0

# 発言集post.datを読み込み、行数を調べる
open("/home/[ユーザ名]/www/post.dat",'r:utf-8') {|file|
 while file.gets
  max += 1
 end
}

#発言集からランダムに1行選んでツイートする
rand = rand(max)
open("/home/[ユーザ名]/www/post.dat",'r:utf-8'){ |file|
 Twitter.update(file.readlines[rand])
}


注意点:
・require 'rubygems' が無いと、

in 'require': no such file to load -- user_stream (LoadError)

とか言われて止まる(ローカルではうごいたのに・・・)。
こちらを参考にした。

Rubygem install したのにrequireできない - Coding Edge会議室
http://ap.atmarkit.co.jp/bbs/core/fcoding/24814

・openは、ファイルを読み込んだあとうしろの{}で囲った部分が終わると自動でファイルを閉じてくれる。

・読み込むdatファイルはフルパスで書かないとあとでcronで実行するときファイルがないって言われる。
(cronで実行するときは実行場所がスクリプトのある場所ではないからだと思う)
ここの、「ロードパスにカレントディレクトリを追加する」が参考になりそうだけど今の自分にはわからない。

blogaomu2.1:さくらインターネットレンタルサーバーでcronからRubyプログラムを実行するときに躓いたのでメモ
http://blogaomu21.blog91.fc2.com/blog-entry-175.html

・openに渡している'r:utf-8'は、

invalid byte sequence in Windows-31J (ArgumentError)

とかいう、utf8のファイルをWindows-31Jで開こうとしちゃったエラー(?)を吐かれたのでその対応。
こちらを参考にした。

Rubyのエンコーディング - @tmtms のメモ
http://tmtms.hatenablog.com/entry/20120812/ruby_encoding


6.サーバにアップロードし、cronで定期的に実行されるようにする

書いたコードをサーバにアップロードしたらスクリプトの権限を755に変更(実行権限を与える)。
サーバの管理画面にログインし、「CRONの設定」に進む。
「新規項目の追加」から以下を追加

実行コマンド:/usr/local/bin/ruby /home/[ユーザ名]/www/[うごかしたいスクリプト].rb
実行間隔はお好みで(自分は動作確認がしたかったので5分おきに設定した)

追加した後、下にある環境変数の設定もする。

さくらインターネットのcronでRubyで書いたTwitterBotを動かす - やぶろぐ
http://d.hatena.ne.jp/hellon999/20100807

こちらを参考にした。
つまり

環境変数:
GEM_HOME /home/[ユーザ名]/local/lib/ruby/gem
RUBYLIB /home/[ユーザ名]/local/lib



以上で設定終了。
cronで実行した時のエラーなどは、サーバの管理画面の「メールアドレス毎の設定」からpostmasterのメールボックスを見るとそこに届いている。
現状のコードだとgemのせいで(?)毎回warningを吐かれる。
こちら(http://d.hatena.ne.jp/yoshidaa/20130218/1361152275)と同じ状態なので、もうすこし勉強して、この記事が言っている意味がわかったら対応したい。

あと、環境変数の設定がなぜこうなのか理解できていないので勉強したい。
(なかなか動かなくていろんな記事の設定を試して動いたのがこれだった)
他にもコードをおもいっきり引用しているから理解してない部分があるので勉強する。

ご指摘などありましたらよろしくおねがいします。


おまけ: viでbackspace使っても文字が消せないときはescで入力抜けてからx押すといいそうです