cutmail's blog

write the code

Androidアプリで使っているライブラリのライセンスをいい感じに表示する

Fablic Advent Calendar 2015 - Qiitaの12/1のエントリーです。

序章 

みなさんはAndroidアプリにOSSライブラリなどを導入した際には、 そのライブラリのライセンスなどは正しく表示していますか?

弊社でもいくつかのOSSライブラリを導入しており、設定画面の中にライセンス情報を表示するようにしています。

AboutLibrariesとは

github.com

AboutLibraries」はアプリに導入しているライブラリのライセンス一覧を簡単に作成でき、カスタマイズなどもできるライブラリです。 サポートされているライブラリであれば、プロジェクト内を検索して自動で一覧表示をしてくれます。

f:id:invent:20151201000916p:plain:w300 f:id:invent:20151201000928p:plain:w300

使い方

AboutLibrariesを使ってライセンス一覧画面を表示する方法はいくつかあり、 その一つがFragmentを取得するやり方です。

Fragmentを生成する方法

LibsFragment fragment = new LibsBuilder()
        .fragment();

Activityを継承する方法

二つ目が、提供されているベースのActivityを継承するやり方です。

public class ExtendActivity extends LibsActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        setIntent(new LibsBuilder().withLibraries("activeandroid", "caldroid").withActivityTheme(R.style.MaterialDrawerTheme).intent(this));
        super.onCreate(savedInstanceState);
    }
}

Activityを直接起動する方法

こちらはActivityのタイトルなどを設定したうえで、直接起動する方法です。 一番手軽かもしれません。

new LibsBuilder()
        .withLibraries("otto", "progress_menu_item", "snack_bar")
        .withActivityStyle(Libs.ActivityStyle.LIGHT_DARK_TOOLBAR)
        .start(this);

またどの方法でも、表示する情報などを細かく設定したり、テーマをできるようになっています。

カスタマイズの一例

.withAboutIconShown(true)
.withAboutVersionShown(true)
.withAboutDescription("description")
..withActivityTheme(R.style.MyTheme)
.withActivityTitle(getString(R.string.license))

詳しくはサンプルアプリが公開されているので、そちらをご覧ください。

任意のライブラリライセンスの追加

サポートされているライブラリ以外を使用している場合は、自動で追加はしてくれないため、下記のような設定ファイルをresディレクトリいかに配置する必要があります。

今回は ProgressMenuItemを追加してみます。 下記のようなファイル名で設定を作成します。 ただこの設定ファイルを直接作るのは大変なので、ジェネレーターが公開されています。

AboutLibraries definition builder

こちらの画面に従って入力していくだけで、設定ファイルを作ってくれます。

res/values/library_progress_menu_item_strings.xml

<?xml version="1.0" encoding="utf-8"?>

<resources>
    <string name="define_int_progress_menu_item"></string>
    <!-- Author section -->
    <string name="library_progress_menu_item_author">hotchemi</string>
    <string name="library_progress_menu_item_authorWebsite">https://github.com/hotchemi</string>
    <!-- Library section -->
    <string name="library_progress_menu_item_libraryName">ProgressMenuItem</string>
    <string name="library_progress_menu_item_libraryDescription">Shows and stop a progress in the ActionBar.</string>
    <string name="library_progress_menu_item_libraryWebsite">http://hotchemi.github.io/ProgressMenuItem</string>
    <string name="library_progress_menu_item_libraryVersion">0.3.3</string>
    <!-- OpenSource section -->
    <string name="library_progress_menu_item_isOpenSource">true</string>
    <string name="library_progress_menu_item_repositoryLink">https://github.com/hotchemi/ProgressMenuItem</string>
    <!-- ClassPath for autoDetect section -->
    <string name="library_progress_menu_item_classPath"></string>
    <!-- License section -->
    <string name="library_progress_menu_item_licenseId">apache_2_0</string>
    <!-- Custom variables section -->
</resources>

設定を追加したライブラリを表示するようにするには、

.withLibraries("otto", "progress_menu_item", "snack_bar")

のように設定ファイルで指定した名前を引数に渡してあげます。 これでいい感じでライセンス情報を表示することができます。

f:id:invent:20151201005818p:plain:w300

最後に

明日はshobyがiOSアプリの開発について書く予定です。 よろしくお願いします。

読了「ソフトウェア開発の名著を読む 第二版」

ソフトウェア開発に関する10冊の書籍を紹介している。
ソフトウェア開発を始めたばかりの人など、どういう本から読んだら良いかわからない時に手にとって見ると良い感じの内容だった。
いくつか読んだことがない本もあったので、これを期に読んでみようと思う。

  1. プログラミングの心理学
    • ソフトウェア開発の人間的側面について
  2. 人月の神話
    • 見積もりとスケジューリングの単位としての「人月」の危険性を指摘した不朽の名著
  3. ピープルウェア
    • ソフトウェア開発における人間的側面を重視し、人間中心に考えることの大切さを説く
  4. デッドライン
    • 人間中心のプロジェクト管理について、デマルコが小説形式で表現した作品
  5. ソフトウェア職人気質
    • ソフトウェア開発を「工学」ととらえることをやめて、「職人気質」という基本へ回帰せよと提唱する
  6. 達人プログラマー
  7. コードコンプリート
  8. プログラミング作法
  9. リファクタリング
    • マーチン・ファウラーの不朽の名作
  10. ビューティフルコード
    • 「美しいコード」について、33名の著名なプログラマーがそれぞれの想いを語る超大作

ソフトウェア開発の名著を読む 【第二版】 (技評SE選書)

ソフトウェア開発の名著を読む 【第二版】 (技評SE選書)

「ALLIANCE 人と企業が信頼で結ばれる新しい雇用」を読んだ

LinkedIn創業者であるリード・ホフマンによる、終身雇用ではない、人と企業の新しい雇用関係についての本。 人と企業の長期的関係のために、定期的に仕事を変えたりする期間を「コミットメント期間」と呼び、本書では3つのコミットメントタイプについて解説している。

  • ローテーション型
    • 会社との相性が将来的にどうかを評価する
  • 変革型
    • 従業員のキャリアを一変させ、会社に大きな変革をもたらす
  • 基盤型
    • コアバリューを守り伝える

それぞれのタイプごとに狙いや期間の長さ、更新に関してなども違う。

また印象に残った点として、社員には社外のネットワークを徹底的に活用することを推奨することや、退職したOBなどとも関係を続けることが企業にとって長期的に大切だということが挙げられていた。

ALLIANCE アライアンス―――人と企業が信頼で結ばれる新しい雇用

ALLIANCE アライアンス―――人と企業が信頼で結ばれる新しい雇用

第一回testotips.ioに参加してきた

3/19にクックパッドさんで行われたtestotips.ioという勉強会に参加してきました。 testotips.ioはテスト/テスト・ツール周りのtipsを持ち寄って情報共有したいというところから始まったとのことです。

testtips.ioのs.ioは塩→塩味

第一回目のテーマはAppiumでした。

以下メモ。

Appiumの中身とその周辺Tips(仮)

@Kazu_cocoaさん

Appiumのテスト結果レポートをSahaginで作ってみる

@nosonosonosoさん

AppiumのPHPクライアントを使う上で行っている工夫

@takahashi22さん

  • 背景、やりたいこと
    • アプリの品質向上とより高頻度でのリリース
    • クラッシュを削減する方法の必要性
  • 手法

    • Appium, Espresso
  • システム全体蔵

  • アプリテスト自動化の現状
    • まずはAndroid
    • 並列実行可能、ID指定は4.3以上
    • WebViewへの切り替えも実用的に動いている
      • ログインとか
    • UI操作のスモークテスト的な位置づけでAppiumを利用
    • UIの細かい機能はespresso

Appiumを使ってiPhone Safari、Andorid Chromiumを使ってアプリをテストするTips

@HC_asagiさん

  • Excelに書いたシナリオテストからテストを実行

Running appium tests on Jenkins

@vishaljaynさん


Appiumを実際に使っている方の発表が多く、まだ使っていない自分としては導入してみてもいいかなと思えました。 次回はユニットテストなど、もう少し低レイヤーのテーマでやるとのことでした!

第9回potatotipsでAndroidアプリ開発のログ出力について発表をしました #potatotips

既に先週のことですが、弊社でpotatotips#9を開催いたしました。

バタバタしてしまいましたが、たくさんの方に来て頂き、そこそこ盛り上がってのではないかと思います。

他の方の発表まとめなどはこちら。

AndroidとiOSのtipsを共有するpotatotips #9に参加してきたので発表内容まとめてみた!

自分はLog周りの話と、Timberの紹介をしました。

Vagrantのpluginをインストールしようとして、nokogiriのインストールエラーで止まってしまう件の対応

DigitalOcean上にVMを立てていろいろやるのを、Vagrantから実行したかった。

vagrant-digitaloceanプラグインをインストール。

$ vagrant plugin install vagrant-digitaloceal

ところが、

$ vagrant plugin install vagrant-digitaloceal
Installing the 'google' plugin. This can take a few minutes...
Building nokogiri using packaged libraries.
Building libxml2-2.8.0 for nokogiri with the following patches applied:
        - 0001-Fix-parser-local-buffers-size-problems.patch
        - 0002-Fix-entities-local-buffers-size-problems.patch
        - 0003-Fix-an-error-in-previous-commit.patch
        - 0004-Fix-potential-out-of-bound-access.patch
        - 0005-Detect-excessive-entities-expansion-upon-replacement.patch
        - 0006-Do-not-fetch-external-parsed-entities.patch
        - 0007-Enforce-XML_PARSER_EOF-state-handling-through-the-pa.patch
        - 0008-Improve-handling-of-xmlStopParser.patch
        - 0009-Fix-a-couple-of-return-without-value.patch
        - 0010-Keep-non-significant-blanks-node-in-HTML-parser.patch
        - 0011-Do-not-fetch-external-parameter-entities.patch
************************************************************************
IMPORTANT!  Nokogiri builds and uses a packaged version of libxml2.

If this is a concern for you and you want to use the system library
instead, abort this installation process and reinstall nokogiri as
follows:

    gem install nokogiri -- --use-system-libraries

If you are using Bundler, tell it to use the option:

    bundle config build.nokogiri --use-system-libraries
    bundle install

However, note that nokogiri does not necessarily support all versions
of libxml2.

For example, libxml2-2.9.0 and higher are currently known to be broken
and thus unsupported by nokogiri, due to compatibility problems and
XPath optimization bugs.
************************************************************************
Bundler, the underlying system Vagrant uses to install plugins,
reported an error. The error is shown below. These errors are usually
caused by misconfigured plugin installations or transient network
issues. The error from Bundler is:

An error occurred while installing nokogiri (1.6.2.1), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.6.2.1'` succeeds before bundling.

という感じのnokogiriのインストールエラーが表示されてしまった。 システムに入っているものとは違うバージョンのnokogiriを使おうとしているようなので、 ググったところ、

http://stackoverflow.com/questions/23621717/vagrant-plugin-and-nokogiri-install-issue

システムに入っているnokogiriを使うNOKOGIRI_USE_SYSTEM_LIBRARIES=1というオプションが!

再度オプションを付けて試したところ、無事インストールできた。

$ NOKOGIRI_USE_SYSTEM_LIBRARIES=1 vagrant plugin install vagrant-digitalocean                                                                                      
Installing the 'vagrant-digitalocean' plugin. This can take a few minutes...
Installed the plugin 'vagrant-digitalocean (0.5.4)'!