タグ

ブックマーク / hidemon.hatenadiary.jp (11)

  • Effective Go 野良翻訳(4) - hidemonのブログ

    これでおわり。並行性、エラー、Webサーバ。 並行性 通信による共有 並行プログラミングは大きなトピックだ。スペースの関係上、Go固有の特徴的な話だけに絞る。 多くの環境において並行プログラミングが大変なのは、共有される変数へのアクセスを巧妙に正しく実装しなければならないからだ。Goでは異なるアプローチを推奨する。共有する値はチャネルで引き渡すので、実際には複数の実行スレッドが値を共有することはない。ある瞬間にある値にアクセスするgoroutineは常に1つだ。データ競合は、設計上けして生じない。この考え方を推奨するためにスローガンにしてみた。 メモリを共有することによって通信してはいけない。通信によってメモリを共有するのだ。 このアプローチではやり過ぎになる場合もある。たとえば、参照カウントなどは、整数の変数の周りを排他ロックで囲んで実装するのがベストだろう。しかし、高レベルのアプローチ

    Effective Go 野良翻訳(4) - hidemonのブログ
  • Effective Go 野良翻訳(1) - hidemonのブログ

    Effective Goが面白いので勉強のため翻訳してみる。意外に長いのでちょっとづつ。 はじめに Go は新しい言語だ。Go は既存言語からアイディアを借用しているが、変わったところもあるので、実際のGoプログラムは、Goの親戚言語で書かれたプログラムと異なる特徴を持つことになる。C++Javaで書かれたプログラムを、単にGoに書き直すだけではなかなか良いプログラムにならない。JavaプログラムはJavaで書かれているのであって、Goで書かれているわけではないからだ。逆に、Go的な観点から問題を考えると、効率的だが他の言語で書いたものとは全く異なるプログラムになる。言い換えれば、よいGoプログラムを書くにはGoの特徴と定型的な書き方をよく理解しておく必要があるということだ。さらに、Goで用いるプログラム上の慣習、たとえば名前の付け方やフォーマット、プログラムの構成を理解しておくことも重

    Effective Go 野良翻訳(1) - hidemonのブログ
  • Cursorをつかったページング - hidemonのブログ

    1.3.1までは,データストアからの読み出し個数が1000個以下に限られていた.なので,1000個以上のデータを取り出すときに,rangeを使ってやろうとするとうまく動かなかった.というのは,range(990, 1010) とやると,0から1100までのキーをとりだして,その後,990から1010までの中身を取りに行く,という実装なので,0から1100までのキーを取りだすという時点で,落ちてしまうからだ.また,そもそも20個だけ読みたいのに,1100個キーを取りだしてしまうので非効率. これまでの方法 そこでよく知られているテクが,これ.条件式を組み合わせることで,rangeのオフセットを常に0にしたままスキャンする方法.このサンプルはPythonだけど,JDOで書いてもそのまま動く. 1.3.1 ところが,1.3.1になって事情が変わった.1000個の制約が無くなったので,とりあえず性

    Cursorをつかったページング - hidemonのブログ
  • Google App Engine はマルチスレッドで動いているのか? - hidemonのブログ

    Programming Google App Engine の93ページ上のあたりに,App Engine の一つのインスタンス上で同時に複数のリクエストをそれぞれのスレッドで処理する「かもしれない (may) 」,だからちゃんとスレッドセーフに書く様に,という趣旨のことが書いてある.実際のところどうなのか,調べてみた. テストプログラム いたって簡単.static で乱数値を生成して保持しておく.これがインスタンスのIDの代わりになる.で,10秒休む.開始時刻と終了時刻とIDを出力する. public class UpTest extends HttpServlet { static double val = Math.random(); @Override protected void doGet(HttpServletRequest req, HttpServletResponse

    Google App Engine はマルチスレッドで動いているのか? - hidemonのブログ
    koko1000ban
    koko1000ban 2010/01/12
    "現在のところ,App Engineではマルチスレッドでリクエストを処理することはないようだ"
  • App EngineのLogをXMPPで飛ばす. - hidemonのブログ

    Log をリアルタイムで見たい App Engineにはよくできたログコンソールがあり,フィルタリングとかもできるのだが,Webベースの悲しさ,必ずリロードしなければ最新の情報をみることができない. これを解決する素晴らしい記事がこちら.叢雲の歌:XMPPを使ったログの通知.LoggerのAppenderとしてXMPPメッセージを投げるものを作り,それを使ってすべてのログをIMで飛ばす.具体的には,GmailのChatウィンドウで読めるようになる. こりゃ便利. java.util.loggingでできないか こちらの記事では,ロギングライブラリとして,sl4jとlogback-classicを使っている.これをなんとか,AppEngine 標準のjava.util.loggingライブラリを使ってできないかというのを試してみた. 結論から言うと,できない.っていうか,できるんだけどすごく

    App EngineのLogをXMPPで飛ばす. - hidemonのブログ
  • Twitter to Google Talk bridge - hidemonのブログ

    TwitterをGmailのWebインターフェイス上のGoogle Talkで読み書きできるといいなあと思い,調べてみたところ,Twitterには昔はJabber(XMPP)インターフェイスがあったが,ある時点からなくなったらしい.ちょうどいいので,App Engineで作ってみた. 設計 Twitter からGoogle Talkへのブリッジには,cronを用いる.定期的に起動するサーブレットが,Twitterのfriends time lineを取得し,更新があれば,Google Talkへxmppへ送信する.この際,前回送信した最後のメッセージIDを保存しておく必要がある. Google TalkからTwitterへのブリッジは,XMPPハンドラで,送信元のXMPPアドレスから,フォワードするべきTwitterアカウントを判断し,そのアカウントにフォワードする. データ構造 ユーザご

    Twitter to Google Talk bridge - hidemonのブログ
  • Google App Engine 1.2.4の密かな新機能 - hidemonのブログ

    8月初頭に発表されたGoogle App Engine 1.2.4には,Remote APIの強化などのまっとうな新機能以外に,2つ隠し機能?がある,という記事がApp Engineのブログに出ていた.いずれも小ネタではあるが,結構便利そうだ. ヘッダに管理情報が出力される 管理者としてログインしている場合に限って,App Engineの出力するHTTPヘッダに管理情報が出力される.以下は,ブログから抜粋したサンプル. X-AppEngine-Resource-Usage: ms=293 cpu_ms=500 api_cpu_ms=236 X-AppEngine-Estimated-CPM-US-Dollars: $0.012320課金情報が簡単にわかるのはありがたい.ヘッダはFirefoxのアドオンLiveHTTPHeadersやFirebugで見ることができる,とのこと. URLにサブ

    Google App Engine 1.2.4の密かな新機能 - hidemonのブログ
  • Google File System に関するインタビューのサマリ - hidemonのブログ

    ACMのacmqueueにGFS: Evolution on Fast-forwardと題した興味深い記事があったので,サマリをメモしておく.Berkeley FSの設計をしたKirk McKusickと,GFSのリードであるSean Quinlanの対談. GFSはシングルマスタ GFSは大規模なシステムであるにもかかわらず,マスタが単一である.これはスケーラビリティに大きな影響を及ぼすだけでなく,単一障害点となりうる.この設計は,とりあえず利用できるものを短期間で作成するためになされたものであり,当時想定されていた用途では,それで十分なはずでもあった. 問題は,ストアされるデータの容量が増え何十テラバイトにもなったときに起こった.メタデータの容量が比例して大きくなってしまい,リカバリ時にメタデータをスキャンする際にも時間がかかるようになった.さらに,クライアントにとってもメタデータ操作

    Google File System に関するインタビューのサマリ - hidemonのブログ
  • FreemarkerをScalaで使う - hidemonのブログ

    Scalaの勉強の為に個人的なプロジェクトに使ってみようと思うのだけど,それにはテンプレートエンジンが必要.ということで,Freemarkerを使ってみた. FreemarkerはJavaのテンプレートエンジンなので,Scalaからそのまま呼び出すことはできるのだけど,JavaMapScalaMapはちょっと違うし,Listの実装も違うのでそのままでは使えない.ScalaJava Beansっぽく書くのもばからしい. Freemarkerはレンダリングするオブジェクトツリーの構造を隠蔽するラッパ機構が用意されていて,例えばDomツリーを直接レンダリングできたりする.同じ枠組みを利用して,JythonやGroovyのためのラッパがデフォルトで用意されている.Scalaでもこれらとおなじようなものを用意してやればいい.ラッパ機構は,型に応じたラッピングオブジェクトと,ディスパッチするク

    FreemarkerをScalaで使う - hidemonのブログ
  • Google App Engine についてあなたが多分知らない10のこと. - hidemonのブログ

    Google App Engineのブログより.なんかスターとかいただいたので,もう少し丁寧に訳してみる. Google App Engine についてあなたが多分知らない10のこと. 1. アプリケーションのバージョンは数字ではなく文字列である. app.yamlやappengine-webのほとんどの例では,versionフィールドに数字をあたえているが,これは単なる慣習にすぎない.バージョンにはURLで許されているものであれば,任意の文字列が使用できる.たとえば,"live" や "dev" をバージョンに使うと,アプリケーションは,"live.latest.yourapp.appspot.com" や"dev.latest.yourapp.appspot.com" でアクセスできる. 2. 複数のバージョンのアプリケーションを同時に利用できる。 1で述べたように,App Engin

    Google App Engine についてあなたが多分知らない10のこと. - hidemonのブログ
  • Scala のXMLリテラル - hidemonのブログ

    ScalaにはXMLをリテラルとして書く機能がある.文字列としてではなく,XMLのオブジェクトとして直接解釈される.具体的には scala.xml.Elem という型になるようだ.しかも,Scalaの式を'{','}'で囲んで埋め込むことができる. 下記はReferenceからの引用. val b = <book> <title>The Scala Language Specification</title> <version>{scalaBook.version}</version> <authors>{scalaBook.authors.mkList("", ", ", "")}</authors> </book>なんらかのクォートで囲むでも無く,いきなり書くことができる. おかしな(?)挙動 パーザは,XMLの開始っぽい部分を発見するとXMLモードに入る.なのでこんな変なことが起こる

    Scala のXMLリテラル - hidemonのブログ
  • 1