Twitter botが作りたい。

 コミッターのサイトに載っていたので、広まるようにメモ

 Twitterj4を使っていて、ダイレクトメッセージを流すところでこんなエラー

Exception in thread "Twitter Stream consumer-1[Receiving stream]" java.lang.NumberFormatException: For input string: "2156851464"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48)
	at java.lang.Integer.parseInt(Integer.java:459)
	at java.lang.Integer.valueOf(Integer.java:553)
	at twitter4j.internal.util.ParseUtil.getInt(ParseUtil.java:120)
	at twitter4j.DirectMessageJSONImpl.init(DirectMessageJSONImpl.java:63)
	at twitter4j.DirectMessageJSONImpl.<init>(DirectMessageJSONImpl.java:60)
	at twitter4j.AbstractStreamImplementation.asDirectMessage(AbstractStreamImplementation.java:194)
	at twitter4j.UserStreamImpl.onDirectMessage(UserStreamImpl.java:88)
	at twitter4j.AbstractStreamImplementation.handleNextElement(AbstractStreamImplementation.java:89)
	at twitter4j.UserStreamImpl.next(UserStreamImpl.java:63)
	at twitter4j.TwitterStream$TwitterStreamConsumer.run(TwitterStream.java:621)

 後で探していたら下記のページで見つけました。知らないにも程がありますが、このページが作者のページだったんですね。今度チェックしてみます。あと、メーリングに入りましょう!

特に事前に騒がれてはいなかったのですが今日TwitterのダイレクトメッセージのIDが
符号付き32bitの最大値(=2147483647、約21億)を超えました。もう一つのTwitpocalypseですね。

http://samuraism.jp/diary/2011/01/06/1294312500000.html

 僕の使っていたTwitter4jは2.1.8、氏によると対応した最新版である2.1.10を使うといいそうです。しかし、21億って・・・ダイレクトメッセージなんてあんまり使わないと思っていたけど、凄いですね。2010年9月時点で世界でTwitterのユーザー数1億4000万以を超えているってのを見れば、一人20回ぐらいダイレクトメッセージでつぶやけば簡単に21億いっちゃいますね。(アクティブユーザーはもっと少ないんだろうけど)

ツイッターは140文字制限を特徴とするマイクロブログサービスだが、
このサービスを利用する1億4500万人(もしくは少なくとも1億4500万個のアカウント)の
ユーザーは、このサービスだけでは満足することが出来ず、・・・

http://jp.blogherald.com/2010/09/06/twitter-reaches-125-million-users-300-thousand-apps/

メーリング http://twitter4j.org/ja/index.html#mailingList

ポチ袋を作ってみた

 正月って言うと、僕達の払う税金・・・いや、お年玉が待っていますが、そのお金を入れる袋に何か工夫してみたいと思い、こちらのサイトを参考にポチ袋を作ってみました。

A4用紙で作ることができる「祝ひ袋」や「ぽち袋」などのA4折形の作品です。
紙を折り重ねることで奥行きを表し、季節や情景を表す “かさね色” や “文様” をあしらい、心遣いに季節感や縁起を添えます。

http://www.a4orikata.jp/

 結果としては、姪や甥はサッパリ気付いてくれなくて、orz...で、苦労した割には気付いてくれないし、カミさんは文句垂れるしと散々でしたが、その気付かれないところに意識するのが江戸っ子の粋ってもんでしょう。


 結構面白いです。コツとしては、サイトでダウンロードできるpdfを印刷して線通りにカッチリ折ってもうまく折れません。はじめ、線に沿って爪で慣らすように折っていて、なんできれいに折れないんだろうと思っていましたが、最期にはお金が入るので、線あたりでふわっと折って、紙をしっかける(引っ掛ける)ように折ると結構うまくいきます。下の写真は、シロートが作ったものなので、ちょっとずれているのはご勘弁ですが、紙の厚みを意識してふんわりと仕上げるのがいいです。






2011年、今年の抱負

あけましておめでとうございます。

去年言ったことはこんなこと。

  • なにかアイデアサイトを作る。
  • できれば、本格的なサイトを1つ作れればなぁ。


 で、去年公開したサイトは、以下の通り。

成長する○×ゲーム
http://marubatu.arcanum.jp/

強くなる!かもしれないオセロ
http://othello.arcanum.jp/

ペーパー・アドベンチャー・コーナー
http://paperad.arcanum.jp/

上桜木応援隊
http://kamisakuragi.info/

 上二つは作ったけどもう手をかける時間がないので、消すしかないかな。でも下2つはコンテンツを増やすだけなので、いまから色々とやっていけそう。去年の抱負のサイトを育てるってのは殆どできなかったけど、下2つを今年いっぱいかけて育てるつもり。どうも僕は、作ってコンテンツを増やすってタイプのサイトに向いているみたいな感じがする。

「トロン レガシー」を見た

http://www.disney.co.jp/tron/

 見た見た。40歳ぐらいのオヤジには面白かったです。先日、前作を見ていたので本作の話にすんなり入ることができました。前作の世界観を知らないと、この映画は辛いかもしんない。でも今の人達にあの前作のチープなCGの映像を見て勉強しろって言っても・・・難しいかな。ゲームのシーンは、昔のカクカクした感覚はなく、曲線、立体をフルに活用しており、臨場感バッチリです。


 オリビア・ワイルド演じるクオラがマジかわいいです。この映画、ジェフ・ブリッジス演じるケビン・フリンと、このオリビア・ワイルド演じるクオラがいるから持っている感じがした。20年に及ぶフリンとクオラの生活に主人公のサムが割り込んだ感じ。そして最期の逃避行。


 最期はあぁなるのは必然でしょう。今思うと、プログラムを擬人化して、修正できないものは壊していくってのはどうも、「自分が仕事で作ったもの」が壊されていく感覚があり、なんとも気の毒な感じがした。世界観に没頭できたからでしょうか。

ネタバレとか、いろいろ

 一応、下は白くしてます。

 パグ犬でバグ?とか(バグじゃないけどね)を表しているんだろうか。

 前作のオマージュと思われる部分があったり、あの壮大な空間も、メモリのムーアの法則で知られるように、「あんな小さな小さなところに収まるんだ」って感覚とか、クルーの出何処がそこならエンドはそうだよね、あのシーンの心の乱れは、そのコンプレックスからかとか、その後は、「アキラ」のラストを思わせる部分と結局トロンはああなったので元の鞘におさまったんだねぇとか、昔広げられた風呂敷を収められた感じです。

 ・・・とここまでネタバレ

 この映画も3Dでしたが、今まで見た3Dよかはマシでした。3Dをそんなに前面に押し出していないって言うか・・・正直、3Dだけで400円増しの今の価格は高いと思いうけどね。3Dが出始めだから3Dにすりゃ人が来るかなとか、値段高くてもいいかなって感じる人がいるからみたいな、3D特需。3Dにするという売り、画面の奥行き感だけじゃなく、3Dという必然性が観客に提示できなければ、普通に2Dでも良いかなと思う。映画が始まって10分もすりゃ3Dに成れてしまうんだから。

Twitter botが作りたい。

Twitter4jから出力されるエラーメッセージの日本語部分がユニコード変換されてくるのでとりあえずメモ。

ダイレクトメッセージは同一ユーザーに同じメッセージを行ってはいけないらしい。

 これは、BOTだけじゃなく、普通にTwitter上から同じダイレクトメッセージをしようとすると「何か問題が発生しました。しばらく待ってから、再度、メッセージを送信してください。」と言われる。

403:The request is understood, but it has been refused.  An accompanying error message will explain why.
{"error":"There was an error sending your message: Whoops! You already said that.","request":"\/1\/direct_messages\/new.json"}
TwitterException{exceptionCode=[1e0fc430-9cb39bf7], statusCode=403, retryAfter=0, rateLimitStatus=null, version=2.1.8}
	at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:310)
	at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:72)
	at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:103)
	at twitter4j.Twitter.sendDirectMessage(Twitter.java:1035)
	at jp.arcanum.textrpg.twitter.TwitterStreamManager.onStatus(TwitterStreamManager.java:124)
	at twitter4j.UserStreamImpl.onText(UserStreamImpl.java:82)
	at twitter4j.AbstractStreamImplementation.handleNextElement(AbstractStreamImplementation.java:87)
	at twitter4j.UserStreamImpl.next(UserStreamImpl.java:63)
	at twitter4j.TwitterStream$TwitterStreamConsumer.run(TwitterStream.java:621)
フォローしていないユーザーにダイレクトメッセージは送れない

 まぁ、当たり前って言えば当たり前ですが。

403:The request is understood, but it has been refused.  An accompanying error message will explain why.
{"error":"\u3042\u306a\u305f\u3092\u30d5\u30a9\u30ed\u30fc\u3057\u3066\u3044\u306a\u3044\u30e6\u30fc\u30b6\u30fc\u306b\u30c0\u30a4\u30ec\u30af\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u305b\u3093\u3002","request":"\/1\/direct_messages\/new.json"}
TwitterException{exceptionCode=[1e0fc430-9cb39bf7], statusCode=403, retryAfter=0, rateLimitStatus=null, version=2.1.8}
	at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:310)
	at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:72)
	at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:103)
	at twitter4j.Twitter.sendDirectMessage(Twitter.java:1035)
	at jp.arcanum.textrpg.twitter.TwitterStreamManager.process(TwitterStreamManager.java:155)
	at jp.arcanum.textrpg.twitter.TwitterStreamManager.onStatus(TwitterStreamManager.java:112)
	at twitter4j.UserStreamImpl.onText(UserStreamImpl.java:82)
	at twitter4j.AbstractStreamImplementation.handleNextElement(AbstractStreamImplementation.java:87)
	at twitter4j.UserStreamImpl.next(UserStreamImpl.java:63)
	at twitter4j.TwitterStream$TwitterStreamConsumer.run(TwitterStream.java:621)


 上の、変換された日本語は、「あなたをフォローしていないユーザーにダイレクトメッセージを送ることができません。」

既にフォローしたユーザーを再度フォローしようとすると怒られる
403:The request is understood, but it has been refused.  An accompanying error message will explain why.
{"error":"Could not follow user: ****\u306f\u65e2\u306b\u3042\u306a\u305f\u306e\u30ea\u30b9\u30c8\u306b\u767b\u9332\u3055\u308c\u3066\u3044\u307e\u3059\u3002","request":"\/1\/friendships\/create.json?include_entities=true&screen_name=****"}
TwitterException{exceptionCode=[ed901634-ca27228b], statusCode=403, retryAfter=0, rateLimitStatus=null, version=2.1.8}
	at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:310)
	at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:72)
	at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:119)
	at twitter4j.Twitter.createFriendship(Twitter.java:1056)
	at jp.arcanum.textrpg.twitter.TwitterStreamManager.onFollow(TwitterStreamManager.java:175)
	at twitter4j.UserStreamImpl.onFollow(UserStreamImpl.java:132)
	at twitter4j.AbstractStreamImplementation.handleNextElement(AbstractStreamImplementation.java:112)
	at twitter4j.UserStreamImpl.next(UserStreamImpl.java:63)
	at twitter4j.TwitterStream$TwitterStreamConsumer.run(TwitterStream.java:621)

上の日本語部分は「は既にあなたのリストに登録されています。」

自分自身をフォローしようとすると怒られる

 しかも'!'付きで大変怒ってらっしゃる。(笑)

403:The request is understood, but it has been refused.  An accompanying error message will explain why.
{"error":"Could not follow user: \u3042\u306a\u305f\u81ea\u8eab\u3092\u30d5\u30a9\u30ed\u30fc\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\uff01","request":"\/1\/friendships\/create.json?include_entities=true&screen_name=rpgcommand"}
TwitterException{exceptionCode=[ed901634-ca27228b], statusCode=403, retryAfter=0, rateLimitStatus=null, version=2.1.8}
	at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:310)
	at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:72)
	at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:119)
	at twitter4j.Twitter.createFriendship(Twitter.java:1056)
	at jp.arcanum.textrpg.twitter.TwitterStreamManager.onFollow(TwitterStreamManager.java:186)
	at twitter4j.UserStreamImpl.onFollow(UserStreamImpl.java:132)
	at twitter4j.AbstractStreamImplementation.handleNextElement(AbstractStreamImplementation.java:112)
	at twitter4j.UserStreamImpl.next(UserStreamImpl.java:63)
	at twitter4j.TwitterStream$TwitterStreamConsumer.run(TwitterStream.java:621)

上の日本語部分は「あなた自身をフォローすることはできません!」

「JAWS-UG - Sendai勉強会 第0回 (2010/12/15) 」に行った。

2010年12月15日、仙台でJAWS-UGの第0回勉強会が開催されます。

当日は、AWSからエバンジェリストの玉川氏が参加します。
またJAWS-UGからも株式会社gumi CTOの堀内氏が参加予定です。

http://jaws-ug.jp/events/gaew52


 Amazon Web Serviceって言うとAPIってイメージがあったが、そのAPIではなく、サーバー関連の話中心になっている。スピーカーはエバンジェリストの玉川さん(ツイッターIDは@kentamagawa)と株式会社gumi CTOの堀内さん(ツイッターIDは@horiuchi)玉川さんがAWSの紹介をし、実際の運用している堀内さんからユーザーとして経験などの話をする。ツイッター上では ハッシュタグ #jawsug

玉川さんの話

アマゾンではの3つのビジネスを展開している。

  • 一般消費者向けサービス(Eコマース)
    • 範囲の経済
  • セラー様向けサービス(物流部分をアマゾンがサービスとして売っている)
    • 規模の経済
  • 開発者IT開発者向けサービス(クラウドコンピューティング

 今日の話は3番目のアマゾンンのクラウドサービスのこと。実はアマゾンって言うと本のサイトが有名だが、 アマゾン自身のアクセス量よりもAWSへのアクセス量が2007年に超えたという事実があり、これからも重要になってくるだろうと。

AWSの本質

 AWSの本質的な部分としては、「自家発電からサービスの委譲(へいつでも必要なだけ安価に)」ということを言っていた。その例としてビール工場の例を挙げる。ビール工場で使う電気は始めは自家発電だった。しかしそれだと、発電機の量で規模が制限されてしまう。時代が移り、今は発電を自己完結するのではなく、電力会社に依存している。これは電気を「いつでも必要なだけ安価に提供」してくれるインフラができたから。

 同じことがIT業界でも起こっている。

  • 自家発電 ⇒ 社内のサーバー
  • 電力会社 ⇒ AWSのデータセンター



AWSのイメージ

 完全な時間課金制。標準的な仮想サーバーでも1〜8ECUECUはアマゾン馬力。1ECU≒1GHz)で1時間あたり7円。ハイCPUでも14円、スパコンクラスでも131円と、導入が手軽になっている。しかし、7円×24時間×30日を目安として考えてしまうが、使いたいときに使い、使った分だけ課金されるということを考えるともっと安くなる。(データの転送量は別にかかるが、金額の10%から20%を目安)



 そのほかのキーワード

  • 仮想サーバー(Amazon EC2)
  • スペックを決めて数分で出来上がるサーバー
  • 作ったサーバーをAMIでスナップショットを取って保存可能
  • AMIを基にスケールアウト
  • AWS Management Consoleでクラウドインフラを管理
  • Windowsでは仮想デスクトップとして使え、Unixでは普通にターミナルでつなげることも可能。


 お客様事例として、 ピーク時、5000台までサーバーがスケールアウトした例を紹介。実際にサーバーを購入するわけではないので、アクセスが無くなればサーバー数が自動的に減るということ。また、夜と昼でピークが逆転する例(昼は少なく夜は多いのが繰り返しとか)こういった場合は昼の時間帯は自動スケールインで経費を浮かすことができ、お金を他に投資に回すことが可能となる。

 他のAWSのサービス

Amazon S3 (Simple Storage Service)
  • 容量無制限のストレージ
  • 置いた瞬間にURLが付く(その場で公開可能)
  • コンテンツ配信(CDN)に直結
  • データ保持能力 99.99999999999%
  • コスト(1Gバイト1カ月置いて、0.083$:約6円)


ミドルウエアレイヤ
サービス
  • Amazon SQS(キューサービス)
  • AmazonSNS
  • Elastic Map reduce
  • Route53(DNSサーバー)
  • モバイルSDK


※これらのサービスをブロックのように組み合わせてサービスを開発可能しかも安い「!

 利用事例としては、ファームウエアの公開など、はじめピークがあって、その後も公開をやめられないものや、ピークが読めないもの、バッチ処理など一時的に集中したいもの、時間的にピークが変わるもの、シーズンものなどに向いている。

本物の蔵独活5か条
  • 初期費用、設備投資がかからない
  • 従量課金、定額、使った分だけ
  • スケールアウト/インが自由自在
  • ビジネススピードを速める
  • 本業専念


 プライベートクラウドは仮想化ではあるが初期費用がかかる、スケールアウト/インがむづかしい、その維持費がかかるため本業に専念できないなどで本当のクラウドではないとのこと。

3分間クッキング(実演)


 実際にAWSを使って仮想サーバにWebサーバーとDBサーバーを立ち上げ、アプリを登録し、そっから冗長化構成に発展させ、非常に耐久性のあるサーバーを構築する実演を行った。

  • 冗長化構成
  • マスタ、スレーブのDB、ロードバランサ

 コレの構成をたった10分ぐらいでやった。実際にやったら見積りやらなんやらで4週間とかかかるだろうとのこと。また、AmazonではISO-27001、PCI,DSSプロバイダ認証、SAS-70 Type2を取得し、非常にセキュアなサーバーを構築することが可能。これは社内VPNなんかとしても使える。

堀内さんの話

 携帯ゲームとかを作っている会社。サーバーのインスタンス数は150台ぐらい。DBサーバーは20台ぐらい。1アプリあたり20から30台のサーバー構成。はじめ物理サーバ2台構成(Webssa-ba 、DbBサーバ)でMIXIアプリを公開したが数分でダウン!そこで・・・

  • プログラムのチューニング ⇒ あまり効果なし
  • スケールアウトを考えた
    • 物理サーバでは見積りでは1カ月ぐらいかかる
    • エンジニアがいなし・・・時間がかかるし・・・

 結果としてクラウドの利用。1週間ぐらいでサービスを再開。

 AMIたんをつくっておくと、自動的にスケーリングしてくれるその閾値を自由に決めることができる。愛してやまない(これは玉川さんの言葉)プログラムが書けるエンジニアであれば気軽にあービスを作ることができる。サーバーの増減を貴にしなくていいので、ピークになればお手軽に増やせるし、閑古鳥になれば、潔く無くすことができる。インフラエンジニア不要になってくる。

所感など


 話を聞いていて、非常に面白かった。クラウド活用ってデータのみがどっかにあってそれを活用できる、ASPとはちょっと違うぞ的なイメージだったけど、コレを見る限り、どっかのクラウドと呼ばれるサービスを使うだけがクラウドじゃなくて、コンピュータっで表現できるハードを含む全てのものが、インターネットを介して低価格に作れ、使えるってことなのかな??コンピュータのリソースをすべてWebで表現できる、使える、公開できる。


 当初、AWSってアマゾンのデータを使うためのAPIやらなんやらでその活用事例なんかが今日講演されるのかなって勝手に思っていた・・・が、それは単なるアマゾンの一つのレイヤであって、プログラマとしてとっつきやすい部分だった。


 今日話しに出た、Amazon EC2Amazon S3Amazon RDS、AmazonSimpleDB、Amazon SQS、Route53・・・と一つ一つが単体のサービスとして使えるしお客様向けに提供できるアイデアが思いつくし、それらを組み合わせた形でも面白いことができるんじゃないか。しかも講師が言うように、誰もが、安価に、個人で。最近読んだ本でもチープ革命のことが言われていたが、まさにそれを地で行く感じがした。


 堀内さんが話のなかで、「ついついサーバーを多くして対応してしまう」的なことを言っていたが、それわかるねぇって感じた。90年代までの「プログラムのチューニングで何とかなるや」から「ハードの進歩にはかなわない」って動きがあったけどそれに似たようなもんでしょう。ハードの進歩、価格の低下によって今まで可読性無視で書いていたコードやらがその工数をハードの金額に当てたほうがいいってなった。その分ぼくらプログラマも可読性を考えればいいようになったし。時代の流れじゃないかな。


 自分の身の回りでは勉強のためって言って、自宅サーバーでサービスやらサイトやら色々公開しているが、なんか「勉強のためって言う、言い訳」という自分のはずかしい部分を鏡で見せられる感じがした「ほら、AWSを使うと自宅サーバーいらないよ、しかも安価にね」って。餅は餅屋にまかせましょう。そう感じた。玉川氏が最期に言っていたが、誰でも、安価に、公開できる「サービスの民主主義」とはさっきの「チープ革命」と相まってなるほどねって感じた。