PythonでTwitter Botを作るまでの長い長い物語(失敗編)
はじめに
この記事は失敗編です。
成功編はこちら
PythonでTwitter Botを作るまでの長い長い物語(完結編) - からあげ定食
大学でTwitterの分析をしている手前、botを作りたいと常々思っていました。普段大学ではRを使っているのですがRではどうにもならない。ということで、春休みにPythonを始め、「さあ、作るぞ!」と意気込んでいたあの頃はどれほど前であったでしょうか。
これはTwitterのBotを作ることに奮闘したひとりの男の記録である。
RでTwitter APIには触れていたため、そんなに手こずること無くpyhtonからtweetを投稿するコードを書くことは出来ました。RではtwitteRというパッケージを使っていたので、Pythonでも似たようなものがないかと探していると、どうやらpython-twitterとtweepyというものが有名らしい。tweepyの方が簡単そうなのでそちらを使った。ちなみに、将棋が趣味なので、将棋の名言格言をランダムにつぶやくBotを作る。
次に、Pythonだ!、自動実行だ!、cronだ!ってことで大学のサーバーにアップしてcronで自動実行することにしました。
sshで大学のサーバに接続し、慣れないUNIXコマンドを打ちながらなんとかpyhonをインストールし、コードもアップロード成功。さあ実行だ!
ImportError: No module named tweepy
……ふむふむなるほど、どうやら外部モジュールを使いたいときはサーバーに設置しなければいけないらしい。そんなことは訳ない、やって差し上げようじゃないか。
gitからライブラリも用意し再び実行すると、謎の英語が。
どうやらお前には権限がないから無理だと……
……
……
その後、一心不乱にgoogle先生を質問攻めしたのですが僕にはできませんでした。PYTHONPATH、仮想環境、いろいろやってみましたが僕にはできませんでした……
ググっている印象では、きっと抜け道はあると思います。その入口まで来ている気もします。ただ、ドアの開け方が分からなかった……
第ニ章 GoogleAppEngin + tweepy 編に続く
PythonでTwitter Botを作るまでの長い長い物語(完結編) - からあげ定食
Rで関数の中でグローバル変数を定義する
通常、関数の中で定義した変数はその関数の中だけで有効で、関数実行後は残らない。例えば
x <- 10 myfunc <- function(){ x <- 9999 return(x) } myfunc() # [1] 9999 #関数の返り値 x # [1] 10 #グローバル変数には影響していない
しかし、 <<- を使えばグローバル変数に代入することができる。
x <- 10 myfunc <- function(){ x <- 9999 x <<- 55 return(x) } myfunc() # [1] 9999 #関数内のローカル変数が返り値 x # [1] 55 #関数内で定義したグローバル変数が更新されている
注意しなければいけないのは、関数内で定義している2つのxは別の変数であるということ。グローバル変数はあくまでグローバル変数であり、ローカル変数が優先される。(ローカル変数が定義されない場合はグローバル変数のxが返り値になる)グローバル変数とローカル変数は別の名前にしたほうが無難。
また、assign(変数, 値, env=.GlobalEnv)でもグローバル変数を定義でき、どうやらこちらのほうが推奨されているらしい。
Rで変数を変えながらfor文を回す
for文を回すとき、代入する変数を毎回変えたいことがしばしばあるが、やり方が分からなかった。(ちゃんと調べたことがなかった)やっと調べたので、忘れないうちにメモ。
assign()関数とpaste()関数を使うとできる!
まずassign()関数は、名前に値を付置する、つまり代入する関数。例えば、
asssign(a,1) a # 1 # もしくは、こんな使い方も可能 b <- "x" assign(b,1:10) x # [1] 1 2 3 4 5 6 7 8 9 10
paste()関数は文字列と文字列をつなぎ合わせる。便利な所は、引数に変数を持ってくることもできるところ。sep=は、繋ぎ目の記号等を決められる。(この場合は何もなし)
c <- "ゴレライ" paste("ラッスン",c,sep="") # [1] "ラッスンゴレライ"
この2つを組み合わせればfor文で変数を変えていくことができる。
for(i in 1:10){ nam <- paste("y",i,sep="") assign(nam,i*i) } y1;y2;y3;y8;y9;y10 # [1] 1 # [1] 4 # [1] 9 # [1] 64 # [1] 81 # [1] 100
(参考)
http://www.is.titech.ac.jp/~mase/mase/html.jp/temp/assign.jp.html
http://futabooo.hatenablog.com/entry/20110910/1315634652
Rで絵文字!
Rで絵文字をつかえるらしいと聞き、居てもたっても居られずいろいろ遊んでみた
と記事を書こうとしたらブラウザ上で絵文字が打てない!
どうやらchromeでは絵文字が使えないようなのでFirefoxに切り替りかえて気を取り直してリトライ。
(追記)
近々chromeも絵文字対応するようです。
Google Chrome for OS Xがまもなく「絵文字」に対応へ - Appleをiするブログ
http://qiita.com/uri/items/bcb702faef242bdd9820を参考にとりあえずやってみた。
ramen <- "🍜" ramen #エラー message(ramen) # message()関数で表示すると出る(謎) # 🍜
できた!
注意点としては、絵文字を" "で囲うことと、message()関数で表示すること。
どうでもいい情報だが、
ramensmax <- rep(ramen,10000) message(ramensmax)
とニヤニヤしながら打ってみたものの、何も表示されなかった(涙)ので限界を調べてみたところどうやら最高は2047らしい。ほかの絵文字は試してない。ほんとどうでもいい。
また、message()を使わないと表示できないので、データフレームを作ることはできるが、表示することはできない。write.table()で書きだすことはできた。
もしかして、絵文字でプロットできるのでは……!と思いやってみたが、
plot(iris[,1],pch="🍳") #できない
🙅でした。
悔しいので、こんなことをしてうさばらし。(絵文字ではない)
par(bg="black") plot(iris[,1],bg="black",pch="★",col="yellow",axi=F) axis(1,col="white",col.axis="white") #X軸を書く axis(2,col="white",col.axis="white") #Y軸を書く
楽しい!笑
さらにさらに、
http://qiita.com/uri/items/bcb702faef242bdd9820
によると remoji なるパッケージがあるらしい!
公式:
https://github.com/richfitz/remoji
早速インストール
devtools::install_github("richfitz/remoji") library(remoji) message(emoji("sushi")) # 🍣
Rはバージョン3.1.2以上に対応とのこと。
remojiに入っている絵文字であれば、emoji()関数に対応する名前を入れるだけで絵文字が使える。なんて便利なんだ!(?)
使える絵文字は
message(emoji(list_emoji(), TRUE))
で一覧表示できる(コンソールいっぱいに絵文字が並んでなかなか楽しい)
絵文字の名前が知りたいときは>|r|find_emoji("man")||<などで、manが含まれる絵文字の名前を検索できるが、例えば、🀄の絵文字の名前は何か、などを調べることはできないのでやっぱり不便。でもこういうのは楽しいことが大事だからOK。
これゼミで流行らしたい……