CircleCI 2.0でAndroidアプリをビルドする

最近CircleCI 2.0のClosed Betaがリリースされました。

circleci.com

CirceCI 2.0ではDockerをネイティブでサポートしたので、 さっそくDockerイメージを使ってAndroidアプリをビルドしてみました。

CircleCIの設定はビルドしたいアプリのディレクトリに .circleci/config.yml を作って以下のように書きます。今回はDockerのイメージに既にAndroidアプリのビルド環境が整っているbeevelop/androidを使いました。

version: 2
jobs:
  build:
    working_directory: ~/working_directory
    docker:
      - image: beevelop/android:latest
    environment:
      ANDROID_HOME: /opt/android
    steps:
      - checkout
      - run:
          name: System information
          command: |
            mkdir $ANDROID_HOME/licenses
            echo [ANDROID_SDK_LICENSE] >> $ANDROID_HOME/licenses/android-sdk-license
            echo y | android update sdk --no-ui --all --filter "build-tools-25.0.2"
            echo y | android update sdk --no-ui --all --filter "extra-android-m2repository,extra-google-m2repository"
      - run:
          name: Install dependencies
          command: ./gradlew dependencies
      - run:
          name: Build
          command: ./gradlew assembleRelease

gist5b588be52fde061900e89dbf1abff990

今回は Build ToolsGoogle Repository を追加でインストールしています。Android SDKのライセンス周りは以下の記事を参考にしました。

Circle CIでAndroid SDK周りのライセンス許諾をローカル環境に合わせる - visible true

今まではブラックボックスの部分が多かったので大変でしたが、これからはDockerfileを見ればわかったり自分で作れたりするのですごく楽になりました。

また、以下の記事のようにローカルで設定ファイルを実行できるのですごく便利です。

CircleCI 2.0はローカル環境で実行できるよ - Qiita

※CircleCI 2.0はClosed Betaなので、使う前にこちらから申請する必要があります。

読んだ本を管理するためのアプリを作った

iOSの時はブクログアプリを使っていたのですが、Androidに変えて本を管理するアプリがないことに困っていました。特に本に対して感想やメモを書かない人なのですが、読んだ本を並べて見るっていうのがちょっとワクワクします。新年になって何かアプリを作ってみようと思っていたので、ちょうどこのアプリを作ってみることにしました。

そしてやっとできたのが「Bookstand」です。

機能もほとんどなくて読みたい本や読んだ本を登録して一覧で見ることができます。
よければダウンロードして使ってみてください!

play.google.com

MacとgPhoto2でEOS Kiss X4を操作してみる

www.moyashi-koubou.com

この記事がすごく良い内容でした!この中でgPhoto2なるカメラをターミナルから操作できるライブラリがあるということを知ったのでMacでも試してみました。

Macの場合だとインストールはbrewで。

$ brew install gphoto2

カメラをUSBで繋いで gphoto2 --auto-detect で繋いだカメラが見つかります。

$ gphoto2 --auto-detect
Model                          Port
----------------------------------------------------------
Canon EOS 550D                 usb:020,028

ここまで順調!順調!ときていたのですがここでエラーが...

$ gphoto2 --summary

*** Error ***
An error occurred in the io-library ('Could not claim the USB device'): Could not claim interface 0 (No such file or directory). Make sure no other program (MacOS PTPCamera service) or kernel module (such as sdc2xx, stv680, spca50x) is using the device and you have read/write access to the device.
*** Error (-53: 'Could not claim the USB device') ***

gphoto2 --summary でカメラの情報がでるはずだったのですが。

解決方法としては、このカメラを繋いだ状態でPTPCameraのプロセスをkillします。

$ ps axuwww | grep "PTPCamera" | grep -v "grep"
8961   0.0  0.1  2529484  12392   ??  S    12:48AM   0:00.16 /System/Library/Image Capture/Devices/PTPCamera.app/Contents/MacOS/PTPCamera
$ kill -9 8961

そしてもう一度gphoto2 --summaryを実行するとちゃんとカメラの情報が出てきます。

$ gphoto2 --summary
Camera summary:
Manufacturer: Canon Inc.
Model: Canon EOS Kiss X4
  Version: 3-1.0.6
  Serial Number: xxxxxxxxxxxxxxxxxxx
Vendor Extension ID: 0xb (2.0)

Capture Formats: JPEG
Display Formats: Association/Directory, Script, DPOF, MS AVI, MS Wave, JPEG, CRW, Unknown(b103), Unknown(bf
02), Defined Type, Unknown(b104)

Device Capabilities:
        File Download, File Deletion, File Upload
        No Image Capture, No Open Capture, Canon EOS Capture, Canon EOS Shutter Button
...

この状態で以下のコマンドを実行すると写真が撮影できました!

$ gphoto2 --capture-image-and-download --filename=/tmp/picture.jpg

あとは他にも設定を変えられたりするのですが、それは以下の記事がすごく詳しかったです。

www.moyashi-koubou.com

こんな感じで特に使いたいことがあるわけではないのですが、勢いに任せてターミナルから撮影するまでやってみました。

わたしの行動規範 2016

この記事は「行動指針 Advent Calendar 2016」の6日目の記事です。

こんにちは、かしまです。社会人4年目にもなり色々と新卒の時とは考え方が変わってきたので、私の行動規範としてよく自分の中で問いかける5つを残しておこうと思います。

ピンチの時こそ手を止める

「あ、やばいな」と思ったときこそすぐに手を止めてゆっくり一呼吸するようにしています。そうすると周りの状況がよく見えて次に何をすればいいか考えやすくなります。

何も考えないようにして寝る

どうしようかなと困った時はいろいろ考えずに頭をからっぽにして寝るようにしています。そうすると昨日考えていたより深刻じゃないことがほとんどだったりするのですっきりした頭で考えやすくなります。

他の方法がないか考えてみる

今までは経験でこれでいこうと決めることが多かったのですが、最近はなぜ他の方法を選ばなかったのか考えるようにしています。そうすると、案外見えていなかった部分が見えてくることが多いなと思います。

アクセルを踏み込めるようにしておく

今の会社の方の受けうりですが、普段はさらにもう一歩アクセルが踏み込めるように余裕を持ってものごとを進めるようにしています。「いまだ!」というタイミングで全力で行けるかどうかがすごく重要なことだと思うので意識するようにしています。

またはもうこない

最近よく思うことに「また〜」はなかなか実現されないもんなんだなと思います。「また会った時に話そう」や「また帰りに行ってみよう」は、その時は実現されると思ってるのですがほとんど実現できていないなと思いました。なので、やりたいと思ったらできる限りその時に行動してみるように心がけています。


以上が私の行動指針になります。いかがだったでしょうか。
自分でも立ち止まって考えたことがなかったのでこうやって意識するのはすごく新鮮でした。


そして明日の「行動指針 Advent Calendar 2016」はottieeさんです。同じチームの同僚なのですが、普段こういう話をすることがないのですごく楽しみにしています。
それでは引き続きどうぞ宜しくお願いします。

Angular1系のhtml5Modeでルーティングする

初めにアクセスされたページがトップページではない時のルーティングでAngularの設定で迷ったのでメモしておきます。

初めにアクセスされたページが http://localhost/ の場合は / がベースになることが分かるのですが、初めに http://localhost/item/1 にアクセスされるとベースがそこになってしまい item/1 にアクセスしたい場合は http://localhost/item/1/item/1 にしないといけなくなります。

色々試してみたのですが、結果としてAngularの設定はこんな感じになりました。

class AppController {
    constructor(private $router: AppScope) {
        $router.config([
            { path: '/item/:id', component: 'item' },
            { path: '/**', component: 'home' }
        ]);
    }
}

angular.module('app', ['ngNewRouter', 'app.home', 'app.item'])
    .config(['$locationProvider', ($locationProvider) => {
        $locationProvider.html5Mode({enabled: true, requireBase: true});
    })
    .controller('AppController', ['$router', AppController]);

*1

ポイントとしては html5ModeのrequireBase: trueの部分です。この設定をすることでルートのhtmlにベースパスを指定することができます。以下のように設定することで、http://localhost/item/1 にアクセスしても http://localhost/ をベースとして解釈して適切に処理してくれます。

<head>
    <base href="/">
    ...
</head>

これでサーバはどのURLでアクセスがきてもルートのhtmlを返すように設定しておけば、Angularがうまく処理してくれるはずです。

*1:ルーティングのモジュールであるngNewRouterにはotherwiseがないようで、{ path: '/**', component: 'home' } こう書くことで同じように動作させるみたいです。 https://github.com/angular/router/issues/110

TypeScriptでAngular1.5を書けるようにする

Webアプリを作ることになったので、Angularフレームワークを使ってTypeScriptで書くことにしました。そこでこの組み合わせでさくっとセットアップできなかったので方法を残しておきます。

セットアップ

AngularとTypeScript、Typingsをインストールする。

$ bower install --save angular
$ npm install -g typescript
$ npm install -g typings

TypingsはTypeScriptの型定義ファイルを管理するツールで、TypeScript標準で存在しない型の補助をしてくれます。 今回はAngularと依存しているjQueryの型定義をインストールする。

$ typings install --save --global dt~angular
$ typings install --save --global dt~jquery

Webアプリの設定

HTMLでAngularを読み込む。

<head>
  <script src="./bower_components/angular/angular.min.js"></script>
  <script src="todo.js"></script>
</head>

TypeScriptファイルの先頭で型定義ファイルを指定する。これでTypeScript内でangularなどの変数を使ってもエラーが出なくなります。

/// <reference path="./typings/index.d.ts" />

var app = angular.module('todoApp', [])
...

これでTypeScriptファイルをコンパイルできるようになり、JavaScriptファイルが正常に出力されます!

https://gist.github.com/t-kashima/24d97cddca0ba5e9b14b9e86c2ba81c4