サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
今年の「#文学」
gimite.hatenablog.com
google-drive-ruby - Github 作りました、というか、google-spreadsheet-rubyにスプレッドシート以外のファイルをアップロード/ダウンロードする機能を加えて改名しました。 Google Drive Appを作るライブラリではありません。Google Driveにアクセスする2種類のライブラリの違いについてはこちら。 インストール: $ sudo gem install google_drive使用例: require "rubygems" require "google_drive" # Logs in. # You can also use OAuth. See document of # GoogleDrive.login_with_oauth for details. session = GoogleDrive.login("username
最近麻雀AIを作っています。現状のAI同士を対戦させるとこんな感じです(たぶんChromeでしか見れません)。一応それっぽく動いています。まだまだナイーブで、あまり強くないですが。まだ役やドラの価値を考慮してないので、赤ドラをガンガン切ってますね…。 このAIのために対戦サーバを作りました。TCPでこんな感じのJSONを送り合って対戦できます。もし使いたい人がいたらご自由にどうぞ。詳細はこちら: Mjai 麻雀AI対戦サーバ ソースはこちら: gimite/mjai - Github : 対戦サーバ gimite/mjai-manue - Github : AI
Twitterの検索結果の1日単位のAtomフィードを作りました: Twitter daily search result Atom feed 今までTwitter公式の検索結果フィードをGoogle Readerに登録していたのですが、これだと1 Tweetごとに別のエントリになってしまって、見にくいです。そこで、1日分の検索結果をまとめて1エントリにするAtomフィードを作りました。 実験的に作ったもので、配信を停止する場合があります。
EventMachineの関数(em-http-requestとか)を多用すると、コールバックだらけになって訳が分からなくなるのが欠点です。 Ruby 1.9のFiberを使うと、em-http-requestみたいな非同期関数を同期的に呼ぶことができます。em-synchronyというライブラリがそのようなラッパを提供してるのを見つけました。 require "em-synchrony" require "em-synchrony/em-http" p EM::HttpRequest.new("http://www.google.com").get.response p EM::HttpRequest.new("http://www.yahoo.com").get.response こうするとhttp://www.google.comとhttp://www.yahoo.comを順にロード
201/4/18追記: 現在は(以前に変換されたものについても)直っています。Google Gadget側のバグが修正されたようです。 iframe → Google Gadget コンバータで変換して貼りつけたガジェットが正しく表示されないという不具合が起きています。以前は http://gimite.net/ の内容、現在はエラーメッセージが表示されるようになっています。 これはどうやらGoogle Gadget側のバグのようです。とりあえずの対策としては、iframe → Google Gadget コンバータでもう一度変換したものを貼りつけなおしてください。バグの対策が入っています。 以前のコンバータで変換されたものについては、残念ながら現状、こちらではエラーを表示する以上の修正ができません。Google Gadgetのバグについては報告済みなので、そちらが修正されるのをお待ちくだ
Amazon EC2が1年間無料というので、試してみました。とりあえずUnbuntuが立ち上がってSSHでログインできるようになりました。 セットアップの仕方はしげふみメモ : 無料でAWS(Amazon EC2,S3等)を使ってみたとかに説明があります。 なんか時々罠があって、うっかりしてるとすぐに課金されますね…。自分が不注意なだけのような気もしますが。今のところ Instance Typeにlargeを選んだら$0.75取られる。無料なのはmicroだけでした…。 インスタンスをStopしておけば課金されなくなるだろうと思って、Stopして会社に行って帰って来たら普通に課金され続けていて、追加で$4.25ほど取られる。Terminateしないと駄目なようです。 regional data transferという名目で$0.02取られる。これがなんで発生したのかはっきりしないのですが、
Sinatra+Thinで、どこかからHTTPで取得した結果を加工して出力したい、という場合、 require "open-uri" get("/") do open("http://example.com/"){ |f| f.read() } end でもいいのですが、これだとexample.comからの返答待ちの間、EventMachineが完全に止まってしまうのがいまいちです。そこでem-http-requestを使おうとしたのですが、それにはハンドラのレスポンスを非同期に返す必要があります。どうするんだろうと思ったのですが、async_sinatraというものがあるようです。 $ sudo gem install async_sinatra em-http-requestrequire "sinatra/async" require "em-http" register(Sinat
Tweet Search StreamでTwitter Streaming APIの結果をWebSocketに流す部分は、元々web-socket-rubyとnet/httpを使って1コネクション1スレッドという実装だったのですが、em-websocketとem-http-requestを使うように変更しました。Webサーバもthinなので、これで全てEventMachineの上に乗って、ほぼ1スレッドで全部動くようになりました。余計な排他処理が要らなくなったのはいいですね。パフォーマンスも良くなったことに期待ですが、測ってはいないです。まあ元々今ぐらいのアクセス数だと負荷は問題なかったんですが。 実装にはkennさんの記事が参考になりました。1点変更が必要だったのが http = EM::HttpRequest.new(STREAMING_URL).get :head => { 'Aut
10/3-10/5ぐらいにかけてTweet Search Streamが落ちていたのですが、これはTwitterからアクセス禁止をくらってました :) その後Twitter Streaming APIの使い方を変えることで制限に引っかからないようにして復活しました。以下はその経緯です。 まずアクセス禁止を食らった理由ですが、たぶんこれです。 Access and Rate Limiting - Streaming API: Concepts Excessive connection attempts, regardless of success, will result in an automatic ban of the client's IP address. 元の実装ではTweet Search Streamを開いているユーザの数だけStreaming APIのコネクションを張ってい
Twitterをリアルタイム検索するTweet Search Streamのソースを公開しました。 tweet-search-stream - GitHub サーバ側がSinatra + Thin + web-socket-ruby + Ruby Twitter Gem、クライアント側がweb-socket-js + jQuery、という感じです。Ruby Twitter GemはStreaming APIには対応してないっぽかったので、OAuthで認証する部分だけ借りて、残りは自作しました。 Tweet Search Streamの紹介記事はこちら。
Twitter Streaming APIとWebSocketを使って、Twitterのリアルタイム検索を作ってみました。 Twitter Search Stream 英語、日本語のHot hash tags(あれば)を適当にクリックしてみてください。英語の盛り上がってるハッシュタグとかだと大変なことになります。読めません。クリックもほぼ無理です。Retweetされた発言は上がります。 日本語での検索結果は自動更新されません。ハッシュタグは大丈夫です。これはTwitter Streaming APIが日本語に未対応だからです。 安定して動くのかはよく分かりません。*1落ちたらごめんなさい。 自作のweb-socket-jsを使っているので、IEやFirefoxなどWebSocket未実装のブラウザでも動きます。ただ、これらのブラウザではFlash Playerが必要です。 Chrome 7
touchmoveというイベントを使うらしい、と知ったので、試しにやってみました。 Androidのブラウザ上でお絵描きするサンプル 2010/6/28追記: たぶんiPhoneでも動くようになったんじゃないかと思います。前に動かなかったのはevent.pageXを見ていたせいで、iPhoneではevent.touches[0].pageXを見ないといけないようです。マルチタッチ対応?さらにjQueryを使っていると追加の罠があって、jQueryのイベントオブジェクトは生のイベントオブジェクトではないらしく、そっちにはtouchesが入っていません…。なので正解はevent.originalEvent.touches[0].pageX。ぬぬぬ。 Android特有と思われる罠としては、単にtouchmoveイベントを使うと、タッチ直後ちょっとだけtouchmoveイベントが発生して、その後
工藤さんのTwitter経由でGoogle日本語入力でアイヌ語入力という記事を見つけて、面白そうだったのでハングル版を作ってみました。はじめに言っておくと、いくつかの意味であまり実用的ではありません。とりあえず試してみたいという人は google-ime-hangul.zip の中のgoogle_ime_hangul_table.txtをGoogle日本語入力の[プロパティ]→[一般]→[ローマ字テーブル - 編集]→[編集]→[インポート]で読み込んでください。読み込み中、10秒ぐらい固まります。 入力方式は一般的な韓国語キーボード式ではなくて、ローマ字入力です。例えば일본はilbonと入力します。 実用的でないと言ったのは、 これを適用するとハングルしか入力できない(日本語が入力できなくなる)。 例えばilaと入力すると일아(il-a)になるが、たぶん이라(i-la)になるべき。これの
HpricotからNokogiriに移行しようとしていくつか罠にはまったのでメモしておきます。 基本的には require "hpricot" → require "nokogiri" Hpricot(html) → Nokogiri::HTML(html) Hpricot::XML(xml) → Nokogiri::XML(xml) と書き換えるだけで、運が良ければそのまま動くと思います。 Nokogiri(text)というのもあるのですが、これはXMLかHTMLかを自動判定するらしく、失敗することもあるのでお勧めしません。 NokogiriはHpricotと違ってXML名前空間をきちんと解釈するので、XML名前空間を使ったXMLを解析する場合には注意が必要です。XML名前空間を使ったXMLというのは、以下のようにxmlnsなんとかというのが入っているやつです。 <feed xmlns=
LocationManager.getLastKnownLocation()というのがあったので、これを定期的に呼べばいいのかと思ったのですが、これだとちっとも座標が変わりません。どうも、これは最後に(何かのアプリケーションが?)位置情報を要求したときの座標が返ってくるだけで、自動でアップデートはされないようです。常に最新の位置情報を受け取るには、Location.requestLocationUpdates()を使うようです。 public class MainActivity extends Activity { private LocationManager locationManager; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); locationMan
結論: 実用は無理っぽい Google AppEngineのタイムアウトがしばらく前に30秒に延長されたので、これならなんとかCometできるんじゃないかということで試しに実装してみました。ついでにWave Gaget API互換のインタフェースを実装して、Wave GadgetがそのままAppEngineで動くようにしてみました。動いているのはCanvasガジェットです。 http://gimite-test.appspot.com/comet-test 注: そのうち落とすかもしれません。Chrome 4とFirefox 3.5で動作確認しました。 しばらく1人で繋ぎっぱなしにしてAppEngineのQuotaを見守ったのですが、そこからざっと概算すると10人が24時間繋ぎっぱなしにするとそれだけでCPUの無料Quotaを使い尽くすようです :) それはちょっと厳しいですね。30秒で切
最近のChromeやFirefoxはJSONオブジェクトが標準付属してるっぽいのですが、それとprototype.jsが干渉してJSON.stringifyの挙動がおかしくなるようです。 prototype.js 1.6.1をロードした状態で JSON.stringify({"a": ["b", "c"]}) とすると '{"a":"[\"b\", \"c\"]"}' が返ってきます。配列の部分が二重にJSON化されています。 このへんによるとprototype.jsとJSONオブジェクトが同じObject#toJSON()という名前を違う用途で使っているのが問題らしいです。 まあ今時prototype.jsなんて使うなよ、っていう話なのかもしれませんが。いい加減jQueryでも覚えようかな…。 ちなみにjson2.jsは組み込みのJSON実装があればそちらを使うようになっています。なので
ローマ字で入力すると日本語に変換するGoogle Waveロボットを作りました。 Kanjy ギャラリー紹介ページ ソースコード Public Previewのアカウントを持っている人向けデモ Waveでは基本的に日本語は普通に打てるのですが、今のところ時々不安定だったり、環境によっては全然打てなかったりするというので。どちらかというと遊びで作ってみた、という感じですが。Social IME APIを使っています。シンプルで便利。 あと、お絵描きガジェットも作りました。 Canvas ギャラリー紹介ページ ソースコード Public Previewのアカウントを持っている人向けデモ
HTML5のWeb Socketを、Flashの力を借りて実装してみました。 gimite / web-socket-js - GitHub Web SocketはHTML5に入る(予定の?)機能で、JavaScriptから生のTCP Socketに近いもの*1を使えるようにしよう、というものです。 2009年11月頃にChromeの開発版で実装されましたが、ほかのブラウザでは未実装です。このライブラリを使うと、すべてのブラウザで(Flashが入っていれば)Web Socketが使えるようになります。 使い方はこんな感じです。 // おまじないその1: JavaScriptライブラリの読み込み <script type="text/javascript" src="swfobject.js"></script> <script type="text/javascript" src="web
web_socket.jsではJavaScriptとFlashを連携させる必要があっていろいろ方法を調べたのですが、その結果分かったことをメモしておきます。もっといい方法があるかもしれませんが…。 まず道具としてはswfobjectとFABridgeというのを使うのが便利なようです。それぞれ詳しくはこちら。 FlashをHTMLに貼るライブラリ swfobject 2 を使う JavaScript から Flash を楽々操作できる FABridge swfobjectはJavaScript内でFlashをHTMLに埋め込むライブラリ、FABridgeはFlashのオブジェクトをJavaScriptから操作するライブラリです。 FABridgeはFlex SDKのframeworks/javascript/fabridgeに添付されているので、これをコピーして使います。 JavaScrip
残念ながらLingrがなくなってしまうようです。そこで、少ない手間で最低限の代替手段が作れないかな、ということでIRCサーバ + Web上で動くIRCクライアント (QuickIRC2) + 過去ログサーバ というのを建ててみました。 irc.gimite.net 試してみたい方はお気軽に#ロビーにどうぞ。試験運用中なので、突然落ちたりいろいろあるかもしれませんが、それでも構わなければチャンネルを適当に作って自由に使ってもらって構いません。 QuickIRC2は2ch@IRCで使われているWeb IRCクライアントです。irc.gimite.netにあって2ch@IRCにない機能はたぶん過去ログだけです。 非常に性能のしょぼいサーバで運用しているので、負荷がかかると重くなるかもしれません。まあそうなったら何か考えます。
AndroidのJavaアプリ上で、C言語で書いたネイティブアプリをインストールして実行することができました。実機(Android Dev Phone)で動作を確認しました。 デモアプリ: パッケージ: NativeExe-0.1.apk ソースコード: NativeExe-0.1.zip 詳細はこちらに書きました。 コンパイル方法とかはAndroidでC言語で書いたネイティブアプリを動かしてみるをどうぞ。
を作ったので公開しました。 Google Spreadsheet Ruby インストール方法: $ sudo gem install google-spreadsheet-ruby使用例: require "rubygems" require "google_spreadsheet" # ログイン。 session = GoogleSpreadsheet.login("[email protected]", "mypassword") # http://spreadsheets.google.com/ccc?key=pz7XtlQC-PYx-jrVMJErTcg&hl=ja # の最初のワークシート。 ws = session.spreadsheet_by_key("pz7XtlQC-PYx-jrVMJErTcg").worksheets[0] # A2セルの内容を取得。 p ws[2,
JavaScriptが速くて、Rubyが遅い理由というエントリがあったのですが、コメントやトラックバック、追記などを読むと 実用上HotRubyがC Rubyより速いというわけではまったくない プリミティブ型の有無が原因という話はどうやら間違い のようです。 とはいえ「↓のベンチマークでHotRubyがC Rubyより速い」というのは事実です。これがなぜなのかちょっと気になったので考えてみました。 startTime = Time.new.to_f sum = "" 50000.times{|e| sum += e.to_s} endTime = Time.new.to_f puts (endTime - startTime).to_s + ' sec' これについてはRubyが遅いのは本当にBoxingのせいか?が参考になります。まず、C Rubyではベンチマークの += を << に書
open-uriはとても便利なのですが、BASIC認証とかPOSTとかができないので、そういうときだけはめんどくさになぁと思いながらnet/httpを使ってたのですが、WWW::Mechanizeを使うのが楽だということを最近知りました。 BASIC認証、ダイジェスト認証: require "rubygems" require "mechanize" agent= WWW::Mechanize.new() agent.auth("user", "password") page= agent.get("http://example.com/") print(page.body) POST: require "rubygems" require "mechanize" agent= WWW::Mechanize.new() page= agent.post("http://example.co
2011/3/2追記: 2011/3/2以前にこのコンバータで変換されたガジェットが正しく表示されない不具合が起きていました。現在は修正済みです。→詳細 最近はiframeを使ったブログパーツがいろいろありますが、はてなダイアリーではiframeが使えません。 Google Gadgetを使えば任意のiframeを埋め込めるのですが、めんどくさいので、iframeを自動でGoogle Gadgetに変換するものを作ってみました。 iframe → Google Gadgetコンバータ ためしにGoogleドキュメントのプレゼンテーションを貼り付けてみました。 ニコニコ動画のサムネイルもこれを使って埋め込めますが、ニコニコ動画のGoogle Gadgetもあります。
自分のはてなブックマークのエントリをインクリメンタル検索するGreasemonkeyを公開しました。 hatenagrep.user.js 使い方。 Google Gearsの開発版(0.2.x)*1、Greasemonkeyをインストール。 hatenagrep.user.jsをインストール。 自分のはてなブックマークのページ(例: http://b.hatena.ne.jp/Gimite/)にアクセス。 (初回のみ)検索窓の右の[Enable Gears]をクリックし、このサイトでのGearsのアクセスを許可。 [Enable grep]をクリックしてFinishedが出るまで待つ。エントリ数が多い場合はかなり時間がかかります。 検索窓でタイプすると、入力した単語をタイトルに含むエントリだけが表示されます。タイプするごとに、表示されるエントリが絞り込まれていきます。 手動での更新が必要
2009/2/8追記: 今はもう↓の公式ドキュメントやid:macksさんのドキュメントなどいろんな情報が出ているので、このメモの存在意義は微妙ですが、一応1.9.1に合わせて修正しておきました。 多言語化 class String class IO この辺のドキュメントが見つからず(まだない?)、いろいろ試行錯誤して分かったことをメモ。 まず、Ruby 1.9では文字列オブジェクトがそれぞれ文字コードを持っている。 p "a".encoding #=> #<Encoding:US-ASCII> ファイルの先頭に # -*- encoding: UTF-8 -*- と書いておくと、文字列リテラルのencodingがUTF-8になる。 p "あ".encoding #=> #<Encoding:UTF-8> p "a".encoding #=> #<Encoding:UTF-8> これを書か
Rubyのリファレンスマニュアルの新しいやつができていたので、それをクラス名とかメソッド名で簡単に検索できるものを作りました。 Rubyリファレンスマニュアル + 索引検索 新しいマニュアルはBitClustというツールを使ってプログラムからも簡単にアクセスできるので、こういうツールが作りやすくなってます。
次のページ
このページを最初にブックマークしてみませんか?
『monthly gimite』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く