Rubyでファイル名を置き換える

以下のようなファイルを

_hoge1.png
_hoge2.png
_hoge3.png
_hoge4.png
_hoge5.png

以下のようにリネームしたい

hoge1.png
hoge2.png
hoge3.png
hoge4.png
hoge5.png

Rubyで書くとこんな感じ

equire 'fileutils'

Dir.glob('*.png') { |filename|
    tmp = /_(.*).png/.match(filename)
    new_filename = tmp[1] + ".png"
    FileUtils.mv(filename, new_filename)
}

PhotonでOSX風Electronアプリを作成する

ElectronでOSX風のUIを簡単に作れるPhotonを使ってみる。

Eelectronをインストール

先にElectornをインストールしておく。

Photonのリポジトリをclone

$ git clone https://github.com/connors/photon.git

プロジェクト構成

Photonを使用してElectronアプリを作成するために必要なcssやfont、アプリ本体はdist以下に配置されている。tagged downloadsからはdist以下のみダウンロードできる。

photon
├── CNAME
├── CONTRIBUTING.md
├── Gruntfile.js
├── LICENSE
├── README.md
├── _config.yml
├── dist
├── docs
├── fonts
├── package.json
└── sass

contributeしたい時はgruntを使う。

Photonのサンプルアプリを動かしてみる

$ npm start

もしくは

$ electron dist/template-app

f:id:horie1024:20151018210952p:plain

Components

色々なComponentsが用意されていて、組み合わせると簡単にOSX風UIを組み立てれる。

Electronを動かす

Node.jsのインストール

nvm(もしくはnodebrew)を使いインストール

$ nvm install v4.2.1
$ node -v
v4.2.1

yeomanのインストール

Electronの雛形プロジェクトを生成するためにyeomanをインストール

$ npm install -g yo

Electron用のgeneratorをインストール

$ npm install -g generator-electron

Electronをインストール

$ npm install -g electron-prebuilt

Electronの雛形プロジェクト生成

$ yo
? 'Allo horie1024! What would you like to do?
  Run a generator
❯ Electron
  ──────────────
  Update your generators
  Install a generator
  Find some help
  Clear global config
  Get me out of here!
  ──────────────

以下のようにプロジェクトが生成される。

my-app/
├── index.css
├── index.html
├── index.js
├── license
├── node_modules
├── package.json
└── readme.md

Electronをビルド

$ cd my-app && electron .

以下のようにデスクトップアプリとして表示される。

f:id:horie1024:20151018203024p:plain

作成したサンプルアプリ

https://github.com/horie1024/ElectronSampleApp

参考

java.net.SocketException: socket failed: EACCES (Permission denied)が発生した時の対処方法

AndroidでCalabashのテストを実行した際に以下のエラーが発生した。

Error message 'java.net.SocketException: socket failed: EACCES (Permission denied)'

原因はパーミッションが足りないから。AndroidManifest.xmlに以下を追加。

<uses-permission android:name="android.permission.INTERNET"/>

参考

stackoverflow.com

AWS SDKを使いDeviceFarmでのテストをスケジューリングする

概要

AWS SDKを使用してDeviceFarmへAPKとテストコードをアップロードし、Calabashによるテストを実行してみたのでそのメモ。

APIドキュメントと使用するSDK

ドキュメントは以下を参照した。

また、SDKにはAWS SDK for Ruby - Version 2を使用する。

AWS SDK Clientの作成

clientを作成します。IAMでAWSDeviceFarmFullAccessのポリシーをアタッチしたユーザを用意し、そのAccessKeyIdとSecretAccessKeyを使用する。また、regionにはus-west-2を指定する。

require 'aws-sdk'

devicefarm = Aws::DeviceFarm::Client.new(
    region: 'us-west-2',
    credentials: Aws::Credentials.new("YOUR_ACCESS_KEY_ID", "YOUR_SECRET_ACCESS_KEY"),
)

DeviceFarmのプロジェクト情報を取得

まず試しにDeviceFarmで作成したプロジェクトの情報を取得してみる。プロジェクトを作成していない場合DeviceFarmのコンソールから「Create a new project」をクリックしプロジェクトを作成しておく。

プロジェクト情報は以下のコードで取得できる。

devicefarm.get_project({
    arn: "プロジェクトのARN"
})

ここで、プロジェクトのARNは以下のようになる。

arn:aws:devicefarm:us-west-2:<ポリシーをアタッチしたユーザーID>:project:<DeviceFarmのプロジェクトID>

DeviceFarmのプロジェクトIDは、DeviceFarmでプロジェクトを開いた際のURLの以下の部分を使用する。

https://us-west-2.console.aws.amazon.com/devicefarm/home?region=us-west-2#/projects/この部分/runs

DevicePoolの取得

デバイスプールについて

テストを実行するデバイスの種類は、デバイスプールと呼ばれる単位で管理されている。デバイスプールをAWS SDKから作成することは出来るが、コンソールから作成した方がわかりやすい。

コンソールのプロジェクトページに表示される「Create a new run」をクリックすると新しいRun(テスト対象APKやデバイスの種類、テストケースを紐付けたもの)を作成することができるので、一度作成しRunを実行しておく。AWSのブログ記事が実行まで詳細に書いてあるので参考にした。

AWS SDKでのDevicePoolの取得

以下のコードでDevicePoolを取得でき、レスポンスにはDevicePoolのARNなどの情報が含まれる。今回はレスポンスに含まれる最初のDevicePoolを使用する。ドキュメントはここ

resp = devicefarm.list_device_pools({
    arn: "プロジェクトのARN"
})

# DevicePoolのARN(後ほど使用)
device_pool_arn = resp.device_pools[0].arn

テスト対象APKのアップロード

APKのアップロードは2段階の手順を踏む。

  • devicefarm.create_upload()でのinitialize
  • Pre-Signed URLを使用したAPKアップロード

initialize

以下のコードで初期化し、Pre-Signed URLを取得する。また、アップロードするオブジェクトのARNを取得しておく(実行をスケジューリングする際に使用)。ドキュメントはここ

resp = devicefarm.create_upload({
    project_arn: "プロジェクトのARN",
    name: "app-debug.apk",
    type: "ANDROID_APP",
    content_type: "application/octet-stream"
})

# Pre-Signed URLの取得
pre_signed_url = resp.upload.url

# 実行をスケジューリングする際に使用
apk_arn = resp.upload.arn

create_uploadのレスポンスのシンタックスは以下のようになっている。ドキュメントはここ

{
    "Upload": {
        "Arn": "string",
        "ContentType": "string",
        "Created": number,
        "Message": "string",
        "Metadata": "string",
        "Name": "string",
        "Status": "string",
        "Type": "string",
        "Url": "string"
    }
}

statusは、FAILEDINITIALIZEDPROCESSINGSUCCEEDEDの4種類があり、create_uploadを実行した直後は、INITIALIZEDになり、この状態ではDeviceFarmから利用できない。Pre-Signed URLを利用してAPKをアップロードすることでPROCESSINGとなり、その後SUCCEEDEDへ変化する。ここでPROCESSINGの際に不具合が起きるとFAILEDになる。

upload

ここを参考に、以下のようなコードでAPKをアップロードできる。

url = URI.parse(pre_signed_url)
apk = File.open("YOUR_APK_PATH", "rb").read
Net::HTTP.start(url.host) do |http|
    http.send_request("PUT", url.request_uri, apk, {"content-type" => "application/octet-stream"})
end

テストパッケージのアップロード

今回テストにはCalabashを使用するので、Calabashのfeaturesをzipに圧縮してアップロードする。アップロードの手順はAPKのアップロードと同じ。create_uploadのtypeにCALABASH_TEST_PACKAGEを指定する。

resp = devicefarm.create_upload({
    project_arn: "プロジェクトのARN",
    name: "features.zip",
    type: "CALABASH_TEST_PACKAGE",
    content_type: "application/octet-stream"
})

# Pre-Signed URLの取得
pre_signed_url = resp.upload.url

# 実行をスケジューリングする際に使用
calabash_package_arn = resp.upload.arn

url = URI.parse(pre_signed_url)
features = File.open("YOUR_FEATURES_PATH", "rb").read
Net::HTTP.start(url.host) do |http|
    http.send_request("PUT", url.request_uri, features, {"content-type" => "application/octet-stream"})
end

テストの実行

実行のスケジューリング

実行のスケジュールは以下のように行う。ドキュメントはここ

app_arnには、APKをアップロードした際に取得したARNを、device_pool_arnはDevicePoolの取得で取得したARNを、test_package_arnにはCalabashのfeatures.zipをアップロードした際に取得したARNを使用する。

devicefarm.schedule_run({
    project_arn: "プロジェクトのARN",
    app_arn: apk_arn,
    device_pool_arn: device_pool_arn,
    test: {
        type: 'CALABASH',
       test_package_arn: calabash_package_arn
    }
})

APK、Test packageのアップロード完了を待つ

APK、Test packageをアップロードした直後では、それぞれのstatusがSUCCEEDEDになっているとは限らない。このため、定期的にstatusがSUCCEEDEDかどうか確認する手順が必要になる。

get_uploadを使用すると、uploadしたオブジェクトの状態を取得できるので、それを1秒ごとに取得しstatusを確認。そして、APK、Test package両方のstatusがSUCCEEDEDならschedule_runを実行する。

10.times do
    resp_apk = devicefarm.get_upload({
        arn: apk_arn
    })

    resp_test_package = devicefarm.get_upload({
        arn: calabash_package_arn
    })

    if resp_apk.upload.status == "SUCCEEDED" &&
        resp_test_package.upload.status == "SUCCEEDED"

        devicefarm.schedule_run({
            project_arn: "プロジェクトのARN",
            app_arn: apk_arn,
            device_pool_arn: device_pool_arn,
            test: {
                type: 'CALABASH',
                test_package_arn: calabash_package_arn
            }
        })

        exit
    end

    sleep(1)
end

これでスケジューリングされ、DeviceFarm上でCalabashのテストが実行される。

TODO

CircleCIと連携させGitHubへのPushをトリガーにしてDeviceFarmでのテストを自動実行する。

参考

AWS Device Farm APIでプロジェクト情報を取得する

概要

AWS Device FarmAPIが公開されていたので試してみた。

AWS CLIのインストール

今回はAWS CLIを使ってみる。ドキュメント通りにCLIをインストール。

$ sudo pip install awscli

認証情報の設定

ドキュメントに従い設定。AWS Device Farmがオレゴン限定なのでリージョンにはus-west-2を指定。

$ aws configure
AWS Access Key ID [None]: YOUR_ACCESS_KEY
AWS Secret Access Key [Noe]: YOUR_SECRET_KEY
Default region name [None]: us-west-2
Default output format [None]: json

Device Farm APIAWS CLIから利用

AWS CLIのDevice Farmに関するドキュメントを参考にプロジェクト情報を取得する。

$ aws devicefarm get-project

エラー。

$ aws devicefarm get-project
usage: aws [options] <command> <subcommand> [parameters]
aws: error: argument --arn is required

--arn が必要。

ARNに何を指定すれば良いか?

ARNに何を指定すれば良いかどこにも書いて無かったので調べた。

↓のような感じで大丈夫そう。

arn:aws:devicefarm:us-west-2:<IAMで管理されたユーザーのID>:project:<DeviceFarmのプロジェクトID>

Device FarmのプロジェクトIDは、DeviceFarmでプロジェクトを開いた際のURLの以下の部分。

https://us-west-2.console.aws.amazon.com/devicefarm/home?region=us-west-2#/projects/この部分/runs

リクエストを実行

実行してみる。

$ aws devicefarm get-project --arn=arn:aws:devicefarm:us-west-2:12345:project:123-example

プロジェクトの情報が取れた。

{
    "project": {
        "name": "my first project",
        "arn": "arn:aws:devicefarm:us-west-2:12345:project:123-example",
        "created": 123456789.10
    }
}

TODO

  • APKのアップロードからテストの実行まで調査する。

参考

Elixirのインストール

概要

Phoenixを試したいのでまずElixirをインストールする。

インストール

Elixir公式Installを参考にインストールする。Macの場合Homebrewでインストールできる。

$ brew update
$ brew install elixir

バージョンを確認

$ elixir -v
Elixir 1.0.5

インストールできた。