queue.yamlにはrateの設定が必須

既存のdefaultだけではなく、新しくTaskQueueを作成する場合、queue.yamlに定義を書いていくんだけど、名前と一部の設定だけ記載して「あとはデフォルトでよろしく」ってしておくと、次のエラーがでる。

Error 400: --- begin server output ---
Invalid queue configuration. Refill rate must be specified for push-based queue.
--- end server output ---

エラーメッセージの通り、queue.yamlにてTaskQueueを新しく定義した場合には必ず「rateの設定が必要」らしい。
なので、queue.yamlに「rate: 1/s」とでも追記してあげればOK。

queue:
- name: example
  rate: 1/s

あと、TaskQueueの設定を作成/変更した場合は次のコマンドで有効化する必要があるかも。GUIのデプロイツールでデプロイしただけでは反映されないかも。

% appcfg.py update_queues myapp/

大量のデータを一括でDatastoreに書き込む

あるログファイルを一行ずつデータストアに保存していくプログラムを作成した。
ログファイルをパースするところは問題なかったけど、データストアに書き込むところで時間がかかりすぎTimeOutエラーに。

データストアへの書き込み方がfor文で一行ごと読みこんで.putで一行ごとデータストア書き込んでいく方法だったので、これをリスト全部を一括で書き込む(.put)方法へ変えた。

参考にしたのは「雲の上のクラスタ: Google App Engine Python NDB を使ってみた。(2)」にある次の内容。

・複数のキー、エンティティを処理する。

get(),put()はRPC呼び出しを行っているので、ループを使って処理するしかなく非効率だったが、下記のメソッドで速くできる。

list_of_keys = ndb.put_multi(list_of_entities)
list_of_entities = ndb.get_multi(list_of_keys)
ndb.delete_multi(list_of_keys)


上記コードにある「list_of_entities」はNDBのオブジェクトがリスト型で入っている必要があり、NDBのオブジェクトは次のコードで作成する。

sandy = Account(username='Sandy',
                userid=123,
                email='sandy@gmail.com')


ということで、リストに入った連想配列からデータを抜き出して、DNBオブジェクトに入れてそれをまたリストにしてput_multiするには、こんなふうに書く。

class Log(ndb.Model):
    datetime = ndb.DateTimeProperty()
    text = ndb.TextProperty()
    level = ndb.TextProperty()

list_of_entities = []

for line in logdata :
                record = Log(
                    datetime=line.datetime,
                    text=line.text,
                    level=line.level
                )
                list_of_entities.append(record);
            
list_of_keys = ndb.put_multi(list_of_entities)

VMware vSphere ESXi5.5 上にWindowsServer2012R2のHyper-vをインストールする

VMware vSphere ESXi5.5 上にWindowsServer2012R2のHyper-vをインストールする方法。
何も考えずに普通にやると、役割の追加の所で止まる。
事前に手順が幾つか必要で、基本的には「Nesting Hyper-V 2012 R2 on ESXi 5.5 - Derek Seaman's Blog」に記載のあるとおり。
仮想マシンのバージョンを上げるとWebClientからしか設定変更できなくなり、上記URLの画面とは異なる。
WebClientでの画面は次の通り。

GoogleChromeのnotificationを連続で出す場合

GoogleChromeのnotificationを連続で出す場合、どうも同じNotificationIdでは何度も出せないみたい。
Googleが出してるサンプルを参考に、都度NotificationIdをランダムに生成するのがいいみたい。

function getNotificationId() {
  var id = Math.floor(Math.random() * 9007199254740992) + 1;
  return id.toString();
}

function messageReceived(message) {
〜略〜
  // Pop up a notification to show the GCM message.
  chrome.notifications.create(getNotificationId(), {
    title: 'GCM Message',
    iconUrl: 'gcm_128.png',
    type: 'basic',
    message: messageString
  }, function() {});
}

「ご使用のセキュリティ設定により、署名付きアプリケーションの実行がブロックされています」

環境

mac os x 10.9 mavericks
Safari

手順

システム環境設定から[Java]を選択。

セキュリティタブを選んで[サイト・リストの編集]をクリック。


[追加]を押すと現れる入力行の場所列にエラーの出ているページのURLを入力し、[OK]をクリックする。


エラーの出ているページを再読み込みするとダイアログが表示されるので、[リスクを受け入れて、このアプリケーションを実行します。]にチェックを入れ[実行]をクリックする。

LAN-GTJU3 を mac os x 10.9 mavericks で使う

Logitec公式のドライバページにて公開されているものはmac os x 10.9 mavericks対応していないので、以前「LAN-GTJU3でRXエラー」で紹介したチップセット公式サイトから最新のドライバをダウンロードしてインストールする。

ESXi5.5のログ

どんなログがhostdに乗って、どんなログがVMkernelログに乗るの?というお話。

たとえば、vSphereClientでvCenterに接続して、ホストのイベントタブを見た時。vmnicのリンクダウンイベントが記録されている場合。

hostd プロセスではリンクダウンを検知してるけど、実際に物理的にリンクダウンが発生していない場合。
hostd.logにはリンクダウンのログが残るけど、vmkernel.logにはリンクダウンログは残らない。