Twitterにバルス!するやっつけコードを書いた
コードのネタは数年前にどこかで見たscala日本語プログラミングの話から(忘れてしまった…)
来たる8月2日、Twitter vs バルスの日
当日バルス数十分前に思いついたのでやってみた。 バルスを唱えるスクリプトをScalaで書く。
まず初めに
崩壊の呪文を唱える
こんな感じで実行できたら嬉しいのでそんな感じにします。
ただScalaは普通に日本語メソッド定義できちゃうので、普通に文字列でメソッドを定義してしまうのもつまらないし、形態素に分けて
"崩壊" の 呪文 を 唱 える
という感じで定義します。
「の」と「を」は多分格助詞、「える」は助動詞だと思うので、implicit conversion
class jp[A](self:A) { def の[B](f:A => B) = f(self) def を[B](f:A => B) = f(self) def える() = () } implicit def a[A](v:A) = new jp(v)
という感じにつなげれるようにします。
「崩壊の呪文」はバルスですね!ついでにアブラカタブラも実装しておきます。
def 呪文(s:String) = s match { case "崩壊" => Some("バルス!") case "死" => Some("アブラカタブラ!") case _ => None }
次に唱えるところですが、とりあえず動くところを確かめたいので
def 唱(str:Option[String]) = str.foreach{ s => println(s) }
としておきます。
で、メインである呪文を唱えるコードを追加
"崩壊" の 呪文 を 唱 える
最終的にできあがったのは
class jp[A](self:A) { def の[B](f:A => B) = f(self) def を[B](f:A => B) = f(self) def える() = () } def 呪文(s:String) = s match { case "崩壊" => Some("バルス!") case "死" => Some("アブラカタブラ!") case _ => None } def 唱(str:Option[String]) = str.foreach{ s => println(s) } implicit def a[A](v:A) = new jp(v) "崩壊" の 呪文 を 唱 える // バルス
とりあえず、ツイッターに投稿はできていませんが、思ったように呪文が唱えられそうです。
次にTwitterに呪文を実際に唱えるところ。
twitter4jのライブラリを使うと直ぐにできるので使います。
mavenの説明がありますが、みんな大好きsbtだとこんな感じ
name := "Bals" version := "1.0" scalaVersion := "2.10.2" libraryDependencies += "org.twitter4j" % "twitter4j-core" % "3.0.3"
各種APIを使用するのに必要なキーをTwitter Deveoperページで取得してきて「唱」を適当にツイートできるように実装します。
面倒なんで綺麗に書かずにやっつけコード
import twitter4j.conf.ConfigurationBuilder import twitter4j.TwitterFactory def 唱(str:Option[String]) = str.foreach{ s => val CONSUMER_KEY = "Consumer key" val CONSUMER_SECRET = "Consumer secret" val ACCESS_TOKEN = "Access token" val ACCESS_TOKEN_SECRET = "Access token secret" builder.setOAuthConsumerKey(CONSUMER_KEY) builder.setOAuthConsumerSecret(CONSUMER_SECRET) builder.setOAuthAccessToken(ACCESS_TOKEN) builder.setOAuthAccessTokenSecret(ACCESS_TOKEN_SECRET) new TwitterFactory(builder.build).getInstance.updateStatus(s) // これでツイートできる }
これで、唱えるとツイッター上に唱えれるようになったので、最後に全部くっつけて下記のようなコードになりました。
import twitter4j.conf.ConfigurationBuilder import twitter4j.TwitterFactory class jp[A](self:A) { def の[B](f:A => B) = f(self) def を[B](f:A => B) = f(self) def える() = () } def 呪文(s:String) = s match { case "崩壊" => Some("バルス!") case "死" => Some("アブラカタブラ!") case _ => None } def 唱(str:Option[String]) = str.foreach{ s => val CONSUMER_KEY = "Consumer key" val CONSUMER_SECRET = "Consumer secret" val ACCESS_TOKEN = "Access token" val ACCESS_TOKEN_SECRET = "Access token secret" builder.setOAuthConsumerKey(CONSUMER_KEY) builder.setOAuthConsumerSecret(CONSUMER_SECRET) builder.setOAuthAccessToken(ACCESS_TOKEN) builder.setOAuthAccessTokenSecret(ACCESS_TOKEN_SECRET) new TwitterFactory(builder.build).getInstance.updateStatus(s) } implicit def a[A](v:A) = new jp(v) "崩壊" の 呪文 を 唱 える
使い捨てのコードなので適当だけど、こんな感じでツイートできました。