トップ 追記

Route 477

過去の日記


2015-09-02

[git] Gitで最新のコミットのハッシュを得る

Dockerイメージをビルドする際に、gitのcommit hashをタグにしたかったのだけど、git HEADのcommit hashを得るコマンドが分からなかったので調べてみた。
以下でいけるらしい。

$ git log -1 --pretty=format:%h
1b234ab

%Hにすると省略しないフルのハッシュを取得できる。詳細はgit help logの「PRETTY FORMATS」の項を参照。

[ruby] YAMLで変数が欲しくなったときはアンカーとエイリアスが使えるかも

設定ファイルにYAMLを使っていて、以下のように同じ値が複数箇所に出てくる場合、変数か定数みたいなものが欲しくなる。かといってこれだけのために.yml.erbにするのはちょっとヘビーすぎる。

server: "1.2.3.4"

app_env:
  SERVER_HOST: "1.2.3.4" 

そういえばRailsのconfig/database.ymlで前方参照みたいなものがあったなぁと思って調べてみると、アンカーとエイリアスというものらしい。

これを使うと、上の例は以下のように書き換えられる。最初に出てくる値の前に「&host」を付けると、以降の出現は「*host」で置き換えることができる。

server: &host "1.2.3.4"

app_env:
  SERVER_HOST: *host

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
# 

うまく動いたようだ。


過去の日記