2014年3月23日日曜日

GitHubとTravis CIでCIする

CI(継続的インテグレーション)のWebサービスTravis CIを使ってみました。

プライベートリポジトリは有料ですが、公開リポジトリであれば無料で、リポジトリ数も
無制限とのことだったので、さっそくトライしてみました。

必要なもの

GitHubアカウント
公開リポジトリ
Travis CI設定ファイル(.travis.yml)

手順

Travis CIのサインインがGitHubアカウントを必要としていましたので
GitHubでの利用が前提のように思います。
GitHubで公開リポジトリを用意していたのでTravis CIへのサインインはスムーズでした。

Travis CI-GitHub Auth

サインインするとTravis CIとの連携を許可するか確認の画面が表示されたので
内容を確認して赤枠内の"Authorize application"ボタンを押して承認します。

Travis CIのアカウント画面でGitHubのリポジトリ一覧が表示されるのでCIするリポジトリを
"ON"にします。
Travis CI-リポジトリ一覧
リポジトリ一覧

公開リポジトリのルートに.travis.yml(Travis CI設定ファイル)を作成します。
ファイル自体はYAML形式で記述します。
言語により設定する内容が変わります。詳細はドキュメントにあります。
Travis CI設定の検証で事前に書き方が間違ってないか確認できます。
(コメントに日本語を含めるとCIでエラーになったのですべて英語にしました)

公開リポジトリにPushまたはPull RequestすることでTravis CIでCIが行われます。

使ってみて

PushやPull Requestすれば設定しておいた内容を自動で行ってくれて実際の画面を見ると
「動作してるよ」と一人で感激していました。
終了時にメールなどに通知もしてくれるのでありがたいです。
GitHub側でPull Request画面で気づいたのですが、Travis CIでCIが行われているかどうか
ステータスとして表示されていました。

GitHubステータス(CI実行前)
CI実行前
GitHubステータス(CI実行後-成功)
CI実行後(成功)

エラーや警告から成功のグリーンに変わるのは気持ちがいいです。
プライベートリポジトリの場合は他の方法も含めて探す必要があるかと思いますが
まずはCIを経験してみるだけでも価値があると思いました。

2014年3月22日土曜日

GitのPushでerror unpack failed

WindowsからGitのPushでリモートに反映しようとすると
error: unpack failed: index-pack abnormal exit
が表示されて全くPushができなくなってしまいました。

結果としてはGitで利用するSSH?のアプリケーションを変更することで解決できました。
// Git BashでGIT_SSHの設定を変更
GIT_SSH='C:\Program Files (x86)\PuTTY\plink.exe'
↓
GIT_SSH='C:\Program Files (x86)\Git\bin\ssh.exe'
// 次のコマンドでGIT_SSHが設定されているか確認
set | grep GIT_SSH
jarファイルをコミットに含めたときからエラーが現れていました。

Gradleラッパーで必要なjarファイルがgitignoreで除外設定していたので修正したけれど
gitignoreはPushできてjarファイルがPushできなくなってしまいました。
Pushできなくて5時間ぐらい悩んでいました。

.gitフォルダを削除してリモートからクローンし直すとか、.git/objectsに書き込み権限を
追加すると解決するとかありましたが、どれも解決には至りませんでした。

私の場合はGIT_SSHの設定を変更することで解決できましたが、設定を変更する
ことになるので、試すときは慎重に。

Windows 7
Git extensions

2014年3月14日金曜日

開発初心者がバージョン管理をはじめようと思ったきっかけ-続き

前の内容の続きです

バージョン管理について調べてみると、編集したファイルの差分を履歴として残し
履歴として残すときにはメッセージを原則入れなければなりません。
差分もバージョン管理のGUIツールで閲覧できますし、変更後の部分は緑のエリアで表示し
変更前の部分は赤のエリアで表示され、私は見やすいと感じました。
この他にも色々できることがあります。

調べれば調べるほど私が今までやっていた自己流のバックアップ管理、バックアップによる
差分のチェック、他諸々が何をやっていたんだろうと思うくらいショックを受けました。

「数日、数ヶ月経てば自分が作成したプログラムも他人が作ったもの」と実感するように
なったのは、開発について右も左も分からないときから時間が経ったときでした。
履歴が無ければ差分を見ても「○○だろう」と曖昧な判断しかできませんし不安です。
出来るなら常に余計な不安と戦いながら開発をしていたころの私に伝えたかったと思うくらいです。

バックアップ管理は履歴を残すことで、対処できます。
ファイルの複製をする行為が減るので、フォルダ内がカオスになるようなことも予防できます。
差分のチェックは履歴+メッセージをもとに行えるので、判断するための材料が増え
不安要素が減ります。
最新のファイルは?という問題は履歴が内容の保証をカバーしてくれるので、誤って更新
したらバージョン管理の検知で分かるため予防できます。
複数人で編集しても内容に矛盾が発生しなければ、バージョン管理がよしなにしてくれるので
ファイルの編集にビクビクすることも減ります。
(矛盾が発生したらそのときは人が判断する必要があります)

普段の開発で発生する不安要素やヒューマンエラーの軽減・予防をサポートしてくれると
感じ、取り入れなければモッタイナイ!今後のことや時間が経ったときに大きく痛い目に
遭うと感じたので取り入れるようになりました。

お粗末な内容ですが、バージョン管理に興味をいだくきっかけになれば嬉しいです。

2014年3月13日木曜日

開発初心者がバージョン管理をはじめようと思ったきっかけ


バージョン管理を利用する前

開発を行うときは「バックアップを忘れずに」と、ファイルを複製してはファイル名に
日付を付加して管理していました。
(他にも○○コピーや○○編集用とか色々していました)

でも開発を進めているとバックアップファイルが次第に増えて、数日経つと
バックアップがファイル名だけでは判別が付かなかったり、差分を確認しても内容が
いつ・何のためにしたのか判らないカオス状態になったりしました。

上手く動作しなかったときは、動作していたところまで元に戻すのにエディタの「戻る」に
頼ったり、バックアップファイルの差分をチェックして対応していました。

ですが、このやり方だと複数人で進めていると確認環境のサーバにアップしたとき
さっきの状況+他の人がアップしたファイルを更新しないよう気を付けたり、他の人が
編集しているファイルは編集するとキケンなので編集できなかったり、運悪く編集したファイルが
他の人と衝突していたら、差分を比較して問題が出ないよう調整なんかしていました。

ユーザーからの問い合わせ内容でロジックの調査が必要になったときは、担当者に確認して
もらうのですが、数ヶ月経ったりすると担当者からは覚えていない・分からないが返ってきて
それが当たり前の光景になっていました。

開発について右も左も分からない自分は、それが開発の進め方だと思っていました・・・

でもこんな状況を重ねていくと次第に感じてきたのが、一人で作業している場合ファイルの
管理が煩雑になったり、どれが最新なのか判らず安心できなくて精神衛生的に悪い状態。
複数人で作業している場合、どれが最新なのか判らず、誰が・どの部分を・何故編集したか
判らず、ファイルを反映しても良いのか・編集しても良いのか判断できず、担当者に丸投げ。

これでは余計な時間を消費しますし、内容を保証できないので簡単には編集できず、複数人が
同時に開発を行うことは難しく、仕事を進めるうえでも足枷になっていました。

そんなときに出会ったのが、バージョン管理という仕組みです。
バージョン管理は誰が・どの部分を・何故編集したかを記録し履歴として残すことができる
仕組みと解釈しています。
これだけでは、すべてが解決できるとは思っていませんが、バージョン管理を利用する前より
色々と良くなることがあります。

もう夜も遅いので、続きは別の日に書こうと思います。
これだけのことを書くだけで、約3時間も費やしてしまいました。
思ったことを書くのは難しいです。
続きを書きました。

2014年3月9日日曜日

VirtualBoxをUpdateするとき躓いた

VirtualBoxのUpdate通知が来ていたのでインストーラファイルをダウンロードして
インストールしたのですが躓きました。

自分の環境だけかもしれませんが、Updateする前に「ホストオンリーネットワーク」の
アダプターのアドレスは今使っているものとは別のアドレスにしなければいけないようです。
 「192.168.186.1」→「192.168.186.10」のように。

そうしないとVirtualBoxで表示されるアドレスが「ネットワークと共有センター」から表示できる
アダプターのアドレスと違っていました。

アドレス変更前にUpdateしたので今回は下記の手順でUpdateし今まで接続できた状態に
戻せました。
  1. 「ホストオンリーネットワーク」のアダプターのアドレスを一度変更して再起動
  2. 「ホストオンリーネットワーク」のアダプターをすべて削除して再起動
  3. 「ホストオンリーネットワーク」のアダプターを作成して(アドレスは使っていたものと被らないようにしました)再起動
  4. 「ホストオンリーネットワーク」のアダプターを今まで使用していたアドレスに戻す
元に戻すのに約3時間かかってしまいました。
今後、同じことにならないように残しておこうと思います。

Windows 7
VirtualBox 4.3.8

2014年3月8日土曜日

Bloggerでコードを見栄えよく表示する方法

備忘録として残していくであろうプログラムなどのコードを見るときに
他のサイトやWebサービスのように見栄えよくBloggerでも表示できるのか探していたところ
コードスニペット用のgoogle-code-prettifyがありました。

最初はBloggerにあるかなと思い、小一時間探していました。
よくよく考えれば専用に必要なものは、自分で用意しないといけないですよね。反省。

google-code-prettifyを利用するときはGitHubにホスティングされているファイルを
読み込めば良いようです。
以前ホスティングされていたcode.google.comサイトは閉鎖となりプロジェクトは
GitHubに移行されています。そのため、これまで利用できていたURLは無くなるので
リンク先の変更が必要です。

準備

1.適用するブログ > レイアウトの「ガジェットを追加」から「HTML/JavaScript」を選択します。
2.「HTML/JavaScript」編集画面の「コンテンツ」に次のコードを埋め込んで保存します。
<!-- Google Code Prettify -->
<script src='https://cdn.rawgit.com/google/code-prettify/master/loader/run_prettify.js'></script>
<style>
li.L0, li.L1, li.L2, li.L3,li.L5, li.L6, li.L7, li.L8{ list-style-type: decimal !important }
pre.prettyprint{
  white-space: -moz-pre-wrap;
  white-space: -pre-wrap;
  white-space: -o-pre-wrap;
  white-space: pre-wrap;
  word-wrap: break-word;
}
</style>
1行目のコメントは埋め込んだ位置を示すために書いています。
4行目は行番号を表示したときデフォルトでは、5行間隔しか行番号が表示されないので、
1行ごとに表示するように変更しています。
5行目~11行目は折り返し表示できるように変更しています。

ブログでコードを書くとき

「HTML」モードに切り替え、次のように書きます。
<pre class="prettyprint">
// 行番号を表示しない場合はpreのclassに"prettyprint"を指定
// コード
</pre>

<pre class="prettyprint linenums">
// 行番号を表示する場合はpreのclassに"prettyprint linenums"を指定
// コード
</pre>
コード内で"<"や">"を利用する場合は"&lt;", "&gt;"に置換する必要があります。
<pre>タグの部分だけ「HTML」モードで記述し、「作成」モードに切り替えてコードを
書き込めば"<"や">"の置換をする手間が省けると思います。
「作成」モードに切り替えると、コードを書き込む部分が分かりづらいので、<pre>タグ内に
目印となる文字を入れておけば、切り替えた後でも簡単に場所を見つけられると思います。

Mockitoを利用したテストコードが失敗する

Androidのテストで利用できるモックライブラリのMockitoをテストコードに利用すると
エラーが出てテストが失敗してしまう。

エラーは次のバーチャルデバイスで発生しました。
  • GenymotionのNexus 4 - 4.3 API 18 - 768x1280
なぜか、次のバーチャルデバイスではエラーが発生しませんでした。
  • GenymotionのNexus S - 2.3.7 API 10 - 480x800
AndroidのAPIのバージョンが原因なのか、エラーメッセージをGoogleで検索すると似たような
報告はありました。

エラーメッセージは次のとおり
java.lang.IllegalArgumentException: dexcache == null (and no default could be found; consider setting the 'dexmaker.dexcache' system property)
"dexmaker.dexcache"という文字列があるので、dexmaker絡みかな。
今のところは様子見で違うAPIのバージョンを使おうかなと思います。

エラーが発生したテストコード
import android.test.AndroidTestCase;

import java.util.ArrayList;

import static org.mockito.Mockito.*;

public class MockExampleTest extends AndroidTestCase {

    public void testMock() throws Exception {
        ArrayList mock = mock(ArrayList.class);
        when(mock.isEmpty()).thenReturn(false);
        assertFalse(mock.isEmpty());
    }
}

バーチャルデバイスだけなので、やはり実機が欲しいですねぇ。

2014年3月4日火曜日

Apacheの再起動を行うときはgraceful

編集したApacheの設定ファイルやPHPの設定ファイルを反映するには
再起動が必要なので前はrestartを利用していましたが、最近はgracefulを利用
するようにしています。

service httpd restart

service httpd graceful

restartで再起動するとApacheのプロセスの子プロセスが実行中でも終了してしまいます。
Apacheで時間のかかる処理を行わせていたら、その処理が終了してしまいます。

Apacheのプロセスの子プロセスが実行中でも、その子プロセスが終了するまでは
再起動しないようにするにはgracefulを利用します。
Apacheで時間のかかる処理を行わせていても、処理が終了するまでは再起動を待ちます。

稼働中のサーバーで編集した設定を反映させたい場合には問題発生の予防として
gracefulを利用しています。