CircleCI 2.0でAndroidアプリをビルドする
最近CircleCI 2.0のClosed Betaがリリースされました。
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 Tools
や Google Repository
を追加でインストールしています。Android SDKのライセンス周りは以下の記事を参考にしました。
Circle CIでAndroid SDK周りのライセンス許諾をローカル環境に合わせる - visible true
今まではブラックボックスの部分が多かったので大変でしたが、これからはDockerfileを見ればわかったり自分で作れたりするのですごく楽になりました。
また、以下の記事のようにローカルで設定ファイルを実行できるのですごく便利です。
CircleCI 2.0はローカル環境で実行できるよ - Qiita
※CircleCI 2.0はClosed Betaなので、使う前にこちらから申請する必要があります。
読んだ本を管理するためのアプリを作った
MacとgPhoto2でEOS Kiss X4を操作してみる
この記事がすごく良い内容でした!この中でgPhoto2なるカメラをターミナルから操作できるライブラリがあるということを知ったのでMacでも試してみました。
$ 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
あとは他にも設定を変えられたりするのですが、それは以下の記事がすごく詳しかったです。
こんな感じで特に使いたいことがあるわけではないのですが、勢いに任せてターミナルから撮影するまでやってみました。
わたしの行動規範 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]);
ポイントとしては 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