トップ 追記

Route 477

過去の日記


2015-07-31

[ruby][memo] google-api-clientでGCE instanceを起動する

gcloudコマンドと同じことがAPI経由でもできるはずだよね〜と軽い気持ちで試してみたらかなり大変だったので、コードの断片だけ貼っておく。

require 'google/api_client'  # v0.8.6
...

    def create
      if options['mesosphere_id']
        network = "global/networks/mesosphere-custom-#{options['mesosphere_id']}"
        firewall = "mesosphere-custom-#{options['mesosphere_id']}-port-22"
      else
        raise "--mesosphere_id is not set"
      end
      zone = "asia-east1-c"
      name = "instance_test1"

      gce = google.discovered_api('compute')
      logger.info("Creating instance")
      res = google.execute(
        api_method: gce.instances.insert,
        parameters: {
          project: config["gce_project_id"],
          zone: zone,
        },
        body_object: {
          name: name,
          machineType: "zones/#{zone}/machineTypes/n1-standard-1",
          disks: [{
            boot: true,
            initializeParams: {
              sourceImage: "projects/google-containers/global/images/container-vm-v20150715",
              diskSizeGb: 50,
            },
          }],
          networkInterfaces: [{
            network: network,  # Mesosphereとの連携に使用
            accessConfigs: [{type: 'ONE_TO_ONE_NAT', name: 'External NAT'}]  # これがないと外部IPが付かない
          }],
          tags: {items: [firewall]}  # Mesosphereとの連携に使用
        }
      )
      logger.debug(res.inspect)
      json = JSON.parse(res.body)
      if json["error"]
        logger.error("Got error:\n"+res.body)
      else
        logger.info("Response:\n"+res.body)
      end
    end

    private

    def google
      return @google if @google
      @google = Google::APIClient.new(
        :application_name => 'Example Ruby application',
        :application_version => '1.0.0'
      )
      @google.authorization = :google_app_default
      @google.authorization.fetch_access_token!
      return @google
    end
  end

2015-07-24

[golang] gbを使ってみた

ちょっとMQTT Brokerのベンチマークをしたかったのだけど、Goでそういうものを作ってる人がいたので、試してみることにした。

しかしPaho(MQTTのライブラリ)のAPIがgit masterで変わってしまっているらしく、そのままでは動かなかった。

そういえばGoのパッケージマネージャの話を読んだ気がするな…。そうこれこれ。

とりあえずgodepというのを試そうとしたのだけど、directory "(略)" is outside source root "src" というエラーが出て動かなかったので、gbの方を試す。

gb: http://getgb.io/

go get github.com/constabulary/gb/... でインストールするらしい。「...」までがコマンド。どういう意味なんだろ。

gbは自分のコードはsrc/以下に置かないといけないらしいので、srcディレクトリを作ってmqtt-bench.goをそこに入れる。と思ったけど直下じゃだめらしいのでsrc/mqtt-bench/mqtt-bench.goにした。

vendoringしたいコードはvendor/src/以下に置く。gb get ...みたいにして取ってこれたら便利なんだけど、チラ見した範囲では手作業以外の方法は見当たらなかった。

ということでPahoの古いやつ(0.9.1)のzipをダウンロードして、以下の場所に置く。

./vendor/src/git.eclipse.org/gitroot/paho/org.eclipse.paho.mqtt.golang.git

これでgb build allしてみたが、パッケージが足りないというエラーが出た。~/.go/src/code.google.com/からそれっぽいのを探して以下にそれぞれコピー。

./vendor/src/code.google.com/p/go.net/websocket
./vendor/src/code.google.com/p/go-uuid

これでgb build allすると、./bin/mqtt-benchという実行ファイルができた。よしよし。

まとめ

タグ指定くらいはできないと辛い。Go 1.5に期待したい。gbはとりあえず動くので良い。


2015-06-30

[linux] fcitx-mozcで入力が全角になる現象への対処

Ubuntu上では日本語入力にfcitx-mozcを使っているのだが、日本語モードで「Foobar」みたいに大文字から始まる単語を入力してEnterを押すと「Foobar」のように全角になってしまう現象が発生していた。

アドバイスをいただいて確認してみたところ、fcitxのプラグインで全角入力を補助するものがあることが分かった。
状態パネルの右から2番目に月のマークのアイコンがあるのだが、これが満月だとプラグインONで、三日月だとプラグインOFFらしい。

状態パネルの右から2番目にある三日月アイコンは何?

[https://wiki.ubuntulinux.jp/UbuntuTips/JapaneseEnvironment/Fcitxより引用]

ということで、三日月にすることで対処できた。

[ruby] RubyからSwaggerを使う方法について調べた

仕事で必要になりそうなので、Swagger (http://swagger.io/ ) をちょっと触ってみた。

SwaggerはYAMLで書かれたAPI定義をもとに、APIサーバやそのクライアントを自動生成してくれるソフトウェアである。READMEを見ると、けっこういろいろな言語に対応しているようだ。

  • サーバ側:node.js, scalatra, jax-rs, spring-mvc
    • Ruby対応については後述
  • クライアント側:Java, Scala, C#, Perl, Python, PHP, Ruby, Android, Swift, etc.

またAPIサーバだけでなく、APIドキュメントも同時に生成してくれる (デモ http://petstore.swagger.io/ )。そのためAPIサーバを誰かに作ってもらうとき、Swaggerを使う取り決めにしておけば、必ず最低限のドキュメントが存在することが保証されるというわけ。

今回はSwaggerをRubyから使う場合(特にサーバ側をRubyで書きたい場合)にどんなライブラリがあるかを調べた。

リンク

  • http://swagger.io/
    公式サイト

  • http://editor.swagger.io/
    APIのWebエディタ。左にYAMLを書くと右にプレビューが出る。
    いくつかのサンプルを見ることもできる。

  • Swagger Codegen
    Swaggerのコードジェネレータ部分。いろんな言語に対応している。ジェネレータ本体はJavaで書かれている。
    これをインストールしなくても、上のWebエディタからジェネレートすることもできるようだ。

API定義の作成

とりあえず動かすだけなら、Webエディタのサンプルを使うのが簡単。
例:http://editor.swagger.io/ を開き、File→Open Example→minimum.yamlを選択

メニューのGenerate ClientからSwagger JSONを選ぶとAPI定義をJSONで取得できる(ライブラリによってYAMLではなくJSONしか受け付けないものがある)。

クライアント側

WebエディタのメニューのGenerate ClientからRubyを選ぶと、Ruby用のクライアントコードがzipで落ちてくる。どんなものなのかは未調査。

サーバ側

最新のSwagger Codegen (2.1.0)はまだRubyサーバの生成に対応していないようなので、別の方法を探してみる。
調べた範囲では3つほどライブラリがあった。

  • swagger_engine

    • Rails用
    • API定義ファイル(JSON)からAPIドキュメントを表示する部分をRails Engineとして提供してくれる
    • API自体は普通にRailsでつくる
  • swagger-blocks

    • チュートリアルはRails用だが、Sinatra等も使えると書いてある
    • API定義をYAML/JSONではなく、独自のRuby DSLで行う (そこからJSONを生成することは可能)
    • これもAPI自体は普通にRails等でつくる
  • grape-swagger-ui

grape-swagger-uiはREADMEを見る限りではまだSwagger2に対応してなさそうだったので、残りの2つを比較する。

  • swagger_engineはAPI定義をYAML/JSONで書く。Rails専用
  • swagger-blocksはAPI定義をRuby DSLで書く。Rails以外も対応

ということで、Railsを使う予定であればswagger_engine、Railsが使えない or YAMLを書きたくない場合はswagger-blocksかな。


2015-05-27

[mac][types] MacでSML#をコンパイルした

前にチャレンジしたときはうまく行かなくて諦めたのだけど、こちらの手順を参考にしたらコンパイルできた。ありがとうございます。

以下は手順。

32bit版のgmpを入れる

既にgmpが入っていたのでいったん削除した。

$ brew remove gmp
$ brew install gmp --32-bit

LLVMのコンパイル

今回は/usrに入れるのではなく、SML#専用にコンパイルすることにした。

$ mkdir ~/bin/smlshp
$ cd ~/bin/smlshp
$ wget http://llvm.org/releases/3.4.2/llvm-3.4.2.src.tar.gz
$ tar xvf llvm-3.4.2.src.tar.gz
$ cd llvm-3.4.2.src
$ ./configure --build=i686-mac-darwin CC='gcc -m32' CXX='g++ -m32' --prefix=/Users/yhara/bin/smlshp/llvm34 && make && make install

SML#のコンパイル

$ cd ~/bin/smlshp
$ wget http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-2.0.0.tar.gz
$ tar xvf smlsharp-2.0.0.tar.gz
$ cd smlsharp-2.0.0
$ ./configure --with-llvm=/Users/yhara/bin/smlshp/llvm34/      \
               --prefix=/Users/yhara/bin/smlshp/smlsharp/ \
               LDFLAGS='-L/usr/local/Cellar/gmp/6.0.0a/lib'     \
              CPPFLAGS='-I/usr/local/Cellar/gmp/6.0.0a/include' \
                    CC='gcc -m32'                               \
                   CXX='g++ -m32'
$ make && make install

動作確認

$ cd ~/bin/smlshp/smlsharp
$ ./bin/smlsharp
SML# 2.0.0 (2014-04-04 11:47:08 JST) for i686-apple-darwin13.4.0 with LLVM 3.4
# 1 + 1;
val it = 2 : int
# 

うまく動いたようだ。


2015-04-09

[english] NHKのラジオ英語講座を、インターネットで聞く

最近は英語学習について特に何もしてないので、NHKのラジオ英語講座でも聞こうかなぁと思っていたのだけど、そういえば今月から新年度で、講座も新クールになることを思い出した。

最近はラジオでの放送から一週間遅れでストリーミング放送が提供されており、「NHK マイ語学」への会員登録(無料)は必要だけど、好きな時間にパソコン等で聞けるらしい。またテキストも電子書籍版が売られており、Kindle for Macとかで読むことができる。便利。

AmazonのNHKテキストコーナーは2016年分の予約販売が先頭に来ていて、何がなんだかわからなかったので、今月分を以下にアフィリエイトしておく。
(難易度についてはこのページの下の方を参照のこと)

難易度A1〜A2

A1: 「日常生活での基本的な表現を理解し、ごく簡単なやりとりができる」
A2: 「日常生活での身近なことがらについて、簡単なやりとりができる」

NHKラジオ 基礎英語1 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)
NHKラジオ 基礎英語2 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)
NHKラジオ 基礎英語3 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)
NHKラジオ エンジョイ・シンプル・イングリッシュ 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)
NHKラジオ 英会話タイムトライアル 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)

難易度B1

B1: 「社会生活での身近な話題について理解し、自分の意思とその理由を簡単に説明できる」

NHKラジオ ラジオ英会話 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)
NHKラジオ 入門ビジネス英語 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)

難易度B2

B2: 「社会生活での幅広い話題について自然に会話ができ、明確かつ詳細に自分の意見を表現できる」

NHKラジオ 攻略!英語リスニング 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)

難易度C1

C1: 「広範で複雑な話題を理解して、目的に合った適切な言葉を使い、論理的な主張や議論を組み立てることができる」

NHKラジオ 実践ビジネス英語 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)

(難易度設定なし)

NHKラジオ 英語で読む村上春樹 2015年 4月号 [雑誌] NHKテキスト(NHK出版 日本放送協会)

内容について

各講座の詳しい内容については、英語のテレビ番組・ラジオ番組 | NHKゴガク を参照。
すごい適当だけど、選ぶとしたら例えばこんな感じかな?


過去の日記