SlideShare a Scribd company logo
1 of 89
Download to read offline
Android Lintで正しさ
を学ぼう
2015.02.18 DroidKaigi 2016
Yukiya Nakagawa / @Nkzn
ROOM:B 13:00-13:50
#DroidKaigiB
Who are you?
• Yukiya Nakagawa / @Nkzn
• ウォーターセル株式会社@新潟
• 農業向けサービス「アグリノート」
• エンジニア募集中です
• Androidは2009年からチマチマと
Recent Activity
• C89コミケ
• とびだそう!Androidプロ
グラミングレシピ
• https://techbooster.booth.pm/
• Android Lintネタ書いてました
Target
• まだAndroidプログラミングのベストプラク
ティスが分からない初学者
• Androidアプリの品質を表す指標がほしい

品質担当者
Agenda
• Android Lintとは
• 初学者がやりがちなミス
• もっと上を目指す人のために
• 品質指標としてのAndroid Lintを考える
Android Lintとは
Lintとは
Another HTML-lint HTMLの構文チェックツール
JSLint, JSHint, ESLint JavaScriptの構文チェックツール
textlint 日本語の構文チェックツール
lintとは、主にC言語のソースコードに対し、コンパイラより詳細かつ
厳密なチェックを行うプログラムである。
• 型の一致しない関数呼び出し
• 初期化されていない変数の参照
• 宣言されているが使われていない変数
• 同じ関数を参照しているが、戻り値を使う場合と使わない場合がある
• 関数が戻り値を返す場合と返さない場合がある
など、コンパイラではチェックされないが、バグの原因になるような曖
昧な記述についても警告される。
https://ja.wikipedia.org/wiki/Lint
Javaの場合?
Android Lintとは
• Google公式
• 222個のルール(ver25.0.4現在)
• Category, Severity, Priorityで分類される
• 結構手広い
• 不具合予備軍の検出
• ユーザビリティチェック
Category
カテゴリ名 チェックする内容
Correctness SDKの使い方の正しさ
Correctness:Messages Correctnessのうち、特にメッセージ
Security セキュリティ
Performance パフォーマンス(動作速度)
Usability ユーザビリティ(使い勝手)
Usability:Icons Usabilityのうち、特にアイコン
Usability:Typography Usabilityのうち、特に文字
Accessibility アクセシビリティ
Internationalization 国際化・多言語化
Bi-directional Text Right-to-Leftモードでの見た目
Severity
レベル 意味 アプリへの影響
Fatal 致命的 ビルドや実行に必ず失敗する
Error エラー
ビルドはできるが実行時エラー
を引き起こす可能性が高い
Warning 警告
動作はするが修正したほうが
より良いアプリになる
Information 情報
ほぼ問題ないが頭の片隅に
置いておいたほうがよい
Ignore 無視
問題があったとしても
検出しない
チェックできるファイルの種類
• https://android.googlesource.com/platform/
tools/base
• com.android.tools.lint.detector.api.Detector

https://android.googlesource.com/platform/tools/base/+/master/lint/libs/
lint-api/src/main/java/com/android/tools/lint/detector/api/Detector.java
1. Manifest file
2. Resource files, in alphabetical order by resource type
3. Java sources
4. Java classes
5. Gradle files
6. Generic files
7. Proguard files
8. Property files
Priority
• 1から10まで
• あまりあてにならない
どんな問題を解決するのか
お作法分かりづらい問題
https://twitter.com/konifar/status/698760224409169920
Android Way is どこ
https://twitter.com/konifar/status/698760496837603328
Googleによる正解集
(あるいはアンチパターン集)
Android Lint
事例紹介
Part 1. 初学者がやりがちなミス
Case 1. LinearLayoutに並べたビューが
表示されないのは何故?
(Orientation)
こんなコード書いてませんか
<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent">

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="one" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="two" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="three" />

</LinearLayout>

何故かアイテムがひとつしか出ない・・・?
Orientation
• Summary: Missing explicit orientation
• Priority: 2 / 10
• Severity: Error
• Category: Correctness
何故いけないのか?
デフォルトのorientationはhorizontal
こう書きましょう
<LinearLayout

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="one" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="two" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:text="three" />

</LinearLayout>
Case 2: Fragmentが表示されない
こんなコード書いてませんか
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_commit_transaction);



getSupportFragmentManager().beginTransaction()

.add(R.id.container, new MyFragment());

}
あれー? Fragmentが表示されないなー?
CommitTransaction
• Summary: Missing commit() calls
• Priority: 7 / 10
• Severity: Warning
• Category: Correctness
何故いけないのか?
• beginTransaction()から始まるメソッドチェーンは、
commit()が呼び出されてから描画処理に入ります
• そりゃcommit()を呼んでなきゃ何も表示されません
• DBのトランザクションみたいなイメージ
こう書きましょう
@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_commit_transaction);



getSupportFragmentManager().beginTransaction()

.add(R.id.container, new MyFragment())
.commit();

}
Case 3. SharedPreferenceが
保存されない
こんなコード書いてませんか
SharedPreferences pref =
PreferenceManager
.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = pref.edit();

editor.putLong("now", new Date().getTime());
pref.getLong("now", -1); // -1
SharedPreferencesに保存したはずの
データが取れないなあ
CommitPrefEdits
• Summary: Missing commit() on
SharedPreference editor
• Priority: 6 / 10
• Severity: Warning
• Category: Correctness
何故いけないのか?
• SharedPreferencesにデータを保存する場合、
実際に保存されるタイミングはcommit()のと
き
• そりゃcommit()を呼んでなきゃ何も表示されません
こう書きましょう
SharedPreferences pref =
PreferenceManager
.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = pref.edit();

editor.putLong("now", new Date().getTime());
editor.commit();
// consider using apply() instead
pref.getLong("now", -1); // 1455620005841
おまけ: commit()とapply()
• SharedPreferencesはアプリ内領域のXMLを読
み書きすることでデータを永続化している

/data/data/[applicationId]/shared_prefs/hoge.xml
Editor XML
Memory
Cache
commit()は待つ
apply()は待たない
こう書くとなおよい
SharedPreferences pref =
PreferenceManager
.getDefaultSharedPreferences(this);

SharedPreferences.Editor editor = pref.edit();

editor.putLong("now", new Date().getTime());
editor.apply();
// OR
// if(editor.commit()) {
// pref.getLong(“now”, -1); // 1455620005841
// }
Case 4: Toastが出ない
こんなコード書いてませんか
Toast.makeText(
this,
“this line is passed”,
Toast.LENGTH_LONG)
なんでだ、絶対にこの行を通ってるはずなのに!
なんでトーストが出ないんだ!!!!
ShowToast
• Summary: Toast created but not shown
• Priority: 6 / 10
• Severity: Warning
• Category: Correctness
こう書きましょう
Toast.makeText(
this,
“this line is passed”,
Toast.LENGTH_LONG).show()
Case 5: なんかこのOKボタン
押しづらくない?
こんなコード書いてませんか
<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@android:string/ok" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@android:string/cancel" />

</LinearLayout>
ButtonOrder
• Summary: Button order
• Priority: 8 / 10
• Severity: Warning
• Category: Usability
何故いけないのか?
• デザインガイドラインに書いてある

https://www.google.com/design/spec/components/dialogs.html#dialogs-specs
• 単にダイアログを閉じるだけの「キャンセル」のよう
なものは左、本来やりたかった操作を続ける「OK」
のようなものは右に置く
• 「削除」はネガティブなイメージなので左に置いてし
まいがちだけど右
こう書きましょう
<LinearLayout

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="horizontal">

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@android:string/cancel" />

<Button

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="@android:string/ok" />

</LinearLayout>
おまけ: 検出条件
1. targetSdkがAPI Level 14以上
• API Level 13まではOKが左で正しかった
2. ラベルが”OK”, “Cancel”, android.R.string.ok, android.R.string.cancelのいずれか
3. 親レイアウトの設定上、並びが明らか
• LinearLayoutかTableRowで、orientationがhorizontal
• RelativeLayoutで、toRightOf, toLeftOfの関係で順序が分かる
• RelativeLayoutで、alignParentLeft, alignParentRightの関係で順序が分かる
Case 6: このアプリ英語化して
こんなコード書いてませんか
<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="ユーザーを選択してください" />



<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:contentDescription="犬のアイコン"

android:src=“@drawable/ic_dog” />



<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint="入力してください" />
日本語が表示されるところを全部探して
英語に書き直す・・・? 1日じゃ無理だよ!
HardcodedText
• Summary: Hardcoded text
• Priority: 5 / 10
• Severity: Warning
• Category: Internationalization
検出対象
• レイアウトXML(res/layout/)
• android:text
• android:contentDescription
• android:hint
• android:prompt
• AndroidManifest.xml
• android:label
• メニューXML(res/menu/)
• android:title
何故いけないのか?
• 文字列リソースに抜き出したほうが総合的に
メリットが多い
• Java側で言語情報を切り替えることもできな
くもないがかなり煩雑
• リソースファイルの自動切り替えに頼ったほ
うが遥かに楽
こう書きましょう
<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text=“@string/select_a_user“ />



<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:contentDescription=“@string/dog_icon“

android:src=“@drawable/ic_dog” />



<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:hint=“@string/input_please“ />
おまけ
• デモ
• クイックフィックス
• 言語コードごとにstrings.xmlを用意した場
合のAndroid Studioの挙動
事例紹介
Interlude: konifar/droidkaigi2016
./gradlew lint
app/build/outputs/lint-results.html
👍
事例紹介
part2. もっと上を目指す人のために
Case 7: アプリが管理していた個人情報が
別のアプリから奪われた!
こんなコード書いてませんか
<!—- AndroidManifest.xml —->
<provider

android:name=".provider.MyContentProvider"

android:authorities="info.nkzn.mycontentprovider" />
ContentProviderを使うときはマニフェストに
書くんだろ? そんなこと知ってるよ!
ExportedContentProvider
• Summary: Content provider does not require
permission
• Priority: 5 / 10
• Severity: Warning
• Category: Security
何故いけないのか?
• 実は<provider>にはexportedというパラメータがあ
り、デフォルトでtrue
• 外部のアプリからでも content://hogehoge のよう
なURIでデータにアクセスできてしまう
• Dropboxが2011年にやらかしてた

http://codezine.jp/article/detail/6286
こう書きましょう
<!—- AndroidManifest.xml —->
<provider

android:name=".provider.MyContentProvider"

android:authorities=“info.nkzn.mycontentprovider"
android:exported=“false" />
※ minSdkVersion, targetSdkVersionが
  両方とも17以上なら、デフォルトでfalseになります
  http://developer.android.com/intl/ja/guide/topics/manifest/provider-element.html
Case 8: これ、何を入力する欄?
こんなコード書いてませんか
<EditText

android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id=“@+id/phone_number"
android:hint=“電話番号を入力してください"
android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id="@+id/pin"

android:hint=“PINコードを入力してください"
android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id="@+id/site_url"

android:hint=“サイトのURLを入力してください"
android:layout_width="match_parent"

android:layout_height="wrap_content" />
電話番号を入れたいのに日本語キーボードが
出てきて切り替えるの面倒くさい・・・
何入れたらいいのか
わからない・・・
TextFields
• Summary: Missing inputType or hint
• Priority: 5 / 10
• Severity: Warning
• Category: Usability
何故いけないのか?
• ユーザーはhintを見て何を入力する欄なのかを
判断するので、無いと不便
• inputTypeを指定すれば適切なキーボードが現
れることが多いので、キーボードを切り替え
る手間が省けて便利
こう書きましょう
<EditText

android:hint="メモを入力してください"
android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id=“@+id/phone_number"
android:hint=“電話番号を入力してください”
android:inputType=“phone”
android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id="@+id/pin"

android:hint=“PINコードを入力してください”
android:inputType="numberPassword"

android:layout_width="match_parent"

android:layout_height="wrap_content" />



<EditText

android:id="@+id/site_url"

android:hint=“サイトのURLを入力してください”
android:inputType="textUri"
android:layout_width="match_parent"

android:layout_height="wrap_content" />
Case 9: やっぱりアイコンは
カラフルじゃなきゃ
こんなアイコン作ったことありませんか
色がついててみづらい
色がついててみづらい
IconColors
• Summary: Icon colors do not follow the
recommended visual style
• Priority: 6 / 10
• Severity: Warning
• Category: Usability:Icons
何故いけないのか
• マテリアルデザインの登場などもあり、ステータスバーや
ActionBarの色はアプリごとに鮮やかに変わるようになった
• アイコンと同系色の背景になったときに見づらくなってしまう
• 通知アイコンは白、アクションアイコンはグレーにしておけば、
なんとなく大体の色に合う
• というような話が developer.android.com/design に載っていた
ような気がするのだけれど、www.google.com/design に移った
ときにその辺の話がなくなってしまった気がする
こうしましょう
おまけ
// com.android.tools.lint.checks.IconDetector.java
for (int y = 0,
height = image.getHeight();
y < height; y++) {

for (int x = 0,
width = image.getWidth();
x < width; x++) {

int rgb = image.getRGB(x, y);

if ((rgb & 0xFF000000) != 0) {

int r = (rgb & 0xFF0000) >>> 16;

int g = (rgb & 0x00FF00) >>> 8;

int b = (rgb & 0x0000FF);

if (r != g || r != b) {
1pxずつ色を評価していて執念を感じた
Case 10: 文字は正しく使いましょう
こんなコード書いてませんか
<string name="continue_to_read">続きを読む...</string>
3点リーダ(…)の入れ方わかんないから
ピリオド3つでいいや
TypographyEllipsis
• Summary: Ellipsis string can be replaced with
ellipsis character
• Priority: 5 / 10
• Severity: Warning
• Category: Usability:Typography
何故いけないのか
• フォントによってはピリオドが都合よく…と見えてく
れるかどうかはわからない
• ISO-8859-1で…は”&#8230;”として定義されてお
り、各フォントも…が3点リーダとして見やすくなる
ようにしてくれているはず
• 用意されている文字はちゃんと使おうというスタンス
こう書きましょう
<string name=“continue_to_read”>続きを読む…</string>
<!—- または —->
<string name=“continue_to_read”>続きを読む&#8230;</string>
品質管理担当者の方へ:
品質指標として使ってみませんか
エンジニアの勝手な言い分
• Googleが「これやると良くないアプリになるよ」と言って
いるものを回避しているので、相対的にアプリの品質は上がっ
ていると言っていいのでは
• こんな重箱の隅を突くようなチェックを200項目以上も回避
するのはそれなりの経験値がないと難しい
• 正しくAndroid SDKを使えるように気を使いながら開発でき
ているという点は、品質上の成果として計上して、取引先や
経営層が評価してもらえると嬉しい
品質指標に使う場合
• 優先度が低いルールは事前に設定でignoreしておく(Bi-
directional Textカテゴリなど)
• 予算やスケジュールに応じて事前に「Fatal, Errorはすべ
て直す」「Warningは15件以内の検出」などの品質目標
を定めておく
• カテゴリ単位での採用・不採用を各プロジェクトごとに
定めるのもよいと思います
エンジニアの方へ:
abortOnErrorを切らないで
abortOnError,
checkReleaseBuilds
// build.gradle
android {
lintOptions {
abortOnError false
checkReleaseBuilds false
}
}
abortOnError:
危険度がErrorまたはFatalのルールに抵触したらビルドを中断する
checkReleaseBuilds:
リリースビルド時にFatalのルールに抵触したらビルドを中断する
趣味でやってたり
プロトタイプならともかく
お仕事でやるときに
falseにするのよくないと思います
本当に対応しないルールだけ
ignoreしましょう
droidkaigi2016/app/build.gradle
lintOptions {
abortOnError false
disable 'InvalidPackage'
}
😡
さいごに
• Android Studioがソースコードに黄色いのと
か赤いのとか付けてたら、マウスオーバーし
て何が起きてるか見てね!
• すべてのルールを倒したら胸を張ろう
• Android Lintと俺達の戦いはこれからだ!
ご清聴ありがとうございました
参考文献
• lint | Android Developers

http://developer.android.com/intl/ja/tools/help/lint.html
• Improving Your Code with lint | Android Developers

http://developer.android.com/intl/ja/tools/debugging/improving-w-lint.html
• Android Lint - Android Tools Project Site

http://tools.android.com/tips/lint
• Writing a Lint Check - Android Tools Project Site

http://tools.android.com/tips/lint/writing-a-lint-check
• platform_tools_base

https://android.googlesource.com/platform/tools/base
• LintOptions - Android Plugin 1.5.0 DSL Reference

http://google.github.io/android-gradle-dsl/current/
com.android.build.gradle.internal.dsl.LintOptions.html

More Related Content

What's hot

What's hot (20)

minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
minneにおけるテスト〜リリース〜リリース後にやっている事の紹介
 
Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発Go MobileでAndroidアプリ開発
Go MobileでAndroidアプリ開発
 
絶対落ちないアプリの作り方
絶対落ちないアプリの作り方絶対落ちないアプリの作り方
絶対落ちないアプリの作り方
 
用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法用途に合わせたアニメーションの実装方法
用途に合わせたアニメーションの実装方法
 
Androidアプリのストレージ戦略
Androidアプリのストレージ戦略Androidアプリのストレージ戦略
Androidアプリのストレージ戦略
 
Android 6.0 Marshmallow App Permissions 実践編
Android 6.0 Marshmallow App Permissions 実践編Android 6.0 Marshmallow App Permissions 実践編
Android 6.0 Marshmallow App Permissions 実践編
 
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
DroidKaigi 2019 シームレスに遷移可能な画面を他のアプリに提供する方法
 
僕がAndroid開発する時にちょっと便利だと思うtips
僕がAndroid開発する時にちょっと便利だと思うtips僕がAndroid開発する時にちょっと便利だと思うtips
僕がAndroid開発する時にちょっと便利だと思うtips
 
Android lint-srp-practice
Android lint-srp-practiceAndroid lint-srp-practice
Android lint-srp-practice
 
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
【ヒカ☆ラボ】 dely株式会社 梅森 翔氏 登壇資料 20171121
 
Android Studioの魅力
Android Studioの魅力Android Studioの魅力
Android Studioの魅力
 
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
2015年のAndroidアプリ開発入門 - ABCD 2015 Kanazawa
 
What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?What is tested by pre-launch (security) reports?
What is tested by pre-launch (security) reports?
 
あるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクルあるゲームアプリケーションの構成とアップデートサイクル
あるゲームアプリケーションの構成とアップデートサイクル
 
開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程開発を効率的に進めるられるまでの道程
開発を効率的に進めるられるまでの道程
 
Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有Android学ぶを君へ。生き抜くためのナレッジ共有
Android学ぶを君へ。生き抜くためのナレッジ共有
 
Android Studio開発講座
Android Studio開発講座Android Studio開発講座
Android Studio開発講座
 
go.mobile で Android 開発
go.mobile で Android 開発go.mobile で Android 開発
go.mobile で Android 開発
 
Android6.0 RuntimePermissionの実装と注意点
 Android6.0 RuntimePermissionの実装と注意点 Android6.0 RuntimePermissionの実装と注意点
Android6.0 RuntimePermissionの実装と注意点
 
Android App Development with Gradle & Android Studio
Android App Development with Gradle & Android StudioAndroid App Development with Gradle & Android Studio
Android App Development with Gradle & Android Studio
 

Similar to AndroidLint #DroidKaigi

Androidレイアウトのスタンダードアプローチ
AndroidレイアウトのスタンダードアプローチAndroidレイアウトのスタンダードアプローチ
Androidレイアウトのスタンダードアプローチ
Takao Sumitomo
 
ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
Tak Inamori
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
Daisuke Sugai
 

Similar to AndroidLint #DroidKaigi (20)

Androidレイアウトのスタンダードアプローチ
AndroidレイアウトのスタンダードアプローチAndroidレイアウトのスタンダードアプローチ
Androidレイアウトのスタンダードアプローチ
 
Realm meetup LT大会(Androidアプリへの適用経験談)
Realm meetup LT大会(Androidアプリへの適用経験談)Realm meetup LT大会(Androidアプリへの適用経験談)
Realm meetup LT大会(Androidアプリへの適用経験談)
 
20170705 apiをつくろう
20170705 apiをつくろう20170705 apiをつくろう
20170705 apiをつくろう
 
第一回Android training4desinger
第一回Android training4desinger第一回Android training4desinger
第一回Android training4desinger
 
Android multiscreen
Android multiscreenAndroid multiscreen
Android multiscreen
 
ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
 
Spring I/O 2018 報告会
Spring I/O 2018 報告会Spring I/O 2018 報告会
Spring I/O 2018 報告会
 
Spring I/O 2018 報告 RESTDocs RAML, Cloud Contract
Spring I/O 2018 報告 RESTDocs RAML, Cloud ContractSpring I/O 2018 報告 RESTDocs RAML, Cloud Contract
Spring I/O 2018 報告 RESTDocs RAML, Cloud Contract
 
tweleve-factor-app_and_enterprise
tweleve-factor-app_and_enterprisetweleve-factor-app_and_enterprise
tweleve-factor-app_and_enterprise
 
How to improve performance
How to improve performanceHow to improve performance
How to improve performance
 
[Stack Overflow Dev Days 2015]Android 6.0 Marshmallow App Permissions 応用編
[Stack Overflow Dev Days 2015]Android 6.0 Marshmallow App Permissions 応用編[Stack Overflow Dev Days 2015]Android 6.0 Marshmallow App Permissions 応用編
[Stack Overflow Dev Days 2015]Android 6.0 Marshmallow App Permissions 応用編
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
[potatotips #18] Android M Developer Preview & Wear 最新トピック
[potatotips #18] Android M Developer Preview & Wear 最新トピック[potatotips #18] Android M Developer Preview & Wear 最新トピック
[potatotips #18] Android M Developer Preview & Wear 最新トピック
 
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
OpenJDKのコミッタってどんなことしたらなったの?解決してきた技術課題の事例から見えてくる必要な知識と技術(JJUG CCC 2023 Spring)
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
技術選択とアーキテクトの役割
技術選択とアーキテクトの役割技術選択とアーキテクトの役割
技術選択とアーキテクトの役割
 
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
Spring Fest 2017 「エンタープライズで利用するSpring Boot」#jsug #sf_h1
 
iPhone/Android アプリをまとめて省エネ開発する技術
iPhone/Android アプリをまとめて省エネ開発する技術iPhone/Android アプリをまとめて省エネ開発する技術
iPhone/Android アプリをまとめて省エネ開発する技術
 
AndroidでDIxAOP
AndroidでDIxAOPAndroidでDIxAOP
AndroidでDIxAOP
 
ABC2016Spring Androidアプリ実装アンチパターン(暫定)
ABC2016Spring Androidアプリ実装アンチパターン(暫定)ABC2016Spring Androidアプリ実装アンチパターン(暫定)
ABC2016Spring Androidアプリ実装アンチパターン(暫定)
 

More from Yukiya Nakagawa

React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
Yukiya Nakagawa
 
PechaKucha Niigata #3 2013.7.27
PechaKucha Niigata #3 2013.7.27PechaKucha Niigata #3 2013.7.27
PechaKucha Niigata #3 2013.7.27
Yukiya Nakagawa
 

More from Yukiya Nakagawa (20)

Atomic Designは「マルチ」で真価を発揮する
Atomic Designは「マルチ」で真価を発揮するAtomic Designは「マルチ」で真価を発揮する
Atomic Designは「マルチ」で真価を発揮する
 
Androidの入門書を書いたときに気にしたこと #NDS57
Androidの入門書を書いたときに気にしたこと #NDS57Androidの入門書を書いたときに気にしたこと #NDS57
Androidの入門書を書いたときに気にしたこと #NDS57
 
React Nativeの光と闇
React Nativeの光と闇React Nativeの光と闇
React Nativeの光と闇
 
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJアグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
アグリノートにおけるGIS情報を活かした圃場・作付管理の取り組み @ FOSS4GJ
 
React Native Androidはなぜ動くのか
React Native Androidはなぜ動くのかReact Native Androidはなぜ動くのか
React Native Androidはなぜ動くのか
 
CSS in JSの話 #friday13json
CSS in JSの話 #friday13jsonCSS in JSの話 #friday13json
CSS in JSの話 #friday13json
 
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組みReact Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
React Nativeアプリをリリースし続けるために、最初に行う8つの取り組み
 
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigiReact Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
React Nativeはクロスプラットフォームモバイルアプリ開発の夢を見るか #DroidKaigi
 
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetupAndroid Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
Android Lintを覚えてベテラン開発者に追いつこう #ndsmeetup
 
僕らのデータ同期プラクティス
僕らのデータ同期プラクティス僕らのデータ同期プラクティス
僕らのデータ同期プラクティス
 
Android再入門 〜Eclipseのことは忘れろ〜
Android再入門 〜Eclipseのことは忘れろ〜Android再入門 〜Eclipseのことは忘れろ〜
Android再入門 〜Eclipseのことは忘れろ〜
 
もう一度Kotlinの話をしよう #ndsmeetup4
もう一度Kotlinの話をしよう #ndsmeetup4もう一度Kotlinの話をしよう #ndsmeetup4
もう一度Kotlinの話をしよう #ndsmeetup4
 
アグリノートを支える技術
アグリノートを支える技術アグリノートを支える技術
アグリノートを支える技術
 
NDS36 Kotlin Cute
NDS36 Kotlin CuteNDS36 Kotlin Cute
NDS36 Kotlin Cute
 
NDS36 Java7&Java8
NDS36 Java7&Java8NDS36 Java7&Java8
NDS36 Java7&Java8
 
Coworking Business Forum in NIIGATA 2013
Coworking Business Forum in NIIGATA 2013Coworking Business Forum in NIIGATA 2013
Coworking Business Forum in NIIGATA 2013
 
Niigata.rb#03
Niigata.rb#03Niigata.rb#03
Niigata.rb#03
 
PechaKucha Niigata #3 2013.7.27
PechaKucha Niigata #3 2013.7.27PechaKucha Niigata #3 2013.7.27
PechaKucha Niigata #3 2013.7.27
 
ぼくのかんがえたふつうのあんどろいどかいはつ
ぼくのかんがえたふつうのあんどろいどかいはつぼくのかんがえたふつうのあんどろいどかいはつ
ぼくのかんがえたふつうのあんどろいどかいはつ
 
Androidで使えるJSON-Javaライブラリ
Androidで使えるJSON-JavaライブラリAndroidで使えるJSON-Javaライブラリ
Androidで使えるJSON-Javaライブラリ
 

Recently uploaded

Recently uploaded (11)

Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
Utilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native IntegrationsUtilizing Ballerina for Cloud Native Integrations
Utilizing Ballerina for Cloud Native Integrations
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
知識ゼロの営業マンでもできた!超速で初心者を脱する、悪魔的学習ステップ3選.pptx
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 

AndroidLint #DroidKaigi