wakwak3125's blog

年に数回更新する予定のブログ。 AndroidとかKotlinとかJavaとか。

Koinから環境変数を利用する

f:id:wakwak3125:20191212223809j:plain

こんにちは、普段はAndroidでKotlinを書いている人間です。 この記事は Kotlin Advent Calendar 2019 13日目の記事です。

最近、Kotlinサーバサイドにチャレンジをしているのですがその際に、環境変数の扱いをどうするのが良いのかと言うことについて考えていましたが、 Koinと言うDIコンテナの機能を利用すると便利にできそうだなと思ったので、Koinの紹介を軽くしてから、そのTipsを共有したいと思います。 なお、本記事執筆の際に利用した環境は以下の通りです。

  • Kotlin: 1.3.60
  • Koin: 2.0.1

まずKoinについて

KoinはKotlinで書かれた軽量でシンプルなDIコンテナです。 導入に関しては、ドキュメントをみていただくのが最適だと思うので、ドキュメントへのリンクを案内させていただきます。

https://insert-koin.io/

Koinはそのままでももちろん、AndroidやKtorとも連携してシンプルにDIを行うことができます。

環境変数を出力するアプリケーションを作ってみる

今回は、環境変数printlnする小さなアプリケーションを作りながら解説します。 環境変数にはMESSAGEが設定されており、値にはHello, World!と書かれています。 この環境変数を出力するアプリケーションを作っていきます。 まずはKoinを使わずにやる 通常の方法でやった場合がこちらです。

fun main() {
    println(System.getenv("MESSAGE"))
}

はい、これ表示できました。ではKoinを使ってこれを置き換えていきましょう。

Koinを使う方法 環境変数を格納するクラスを用意します。今回はConfigと言うクラスにします。

data class Config(val message: String)

このクラスをInjectすることで、環境変数のDIを実現していきます。 次に、このクラスをmoduleに追加します。

val module = module {
    single { Config(getProperty("MESSAGE")) }
}

ここのsingleブロック内のthisScopeと呼ばれるクラスです。 このScopeには

  • fun <T> getProperty(key: String, defaultValue: T): T
  • fun <T> getProperty(key: String): T
  • fun <T> getPropertyOrNull(key: String): T?

と言う3つの関数が用意されており、このkey環境変数の名前を指定してあげることで取得できる仕組みとなっています。

getPropertyの内部実装は、PropertyRegistryへのデリゲートとなっています。PropertyRegistryへどのようにして環境変数が格納されるかについては後述します。

次に、このConfigを利用するクラスを作ります。

class MainComponent : KoinComponent {
    private val config by inject<Config>()
    fun sayMessage() {
        println(config.message)
    }
}

あとはこのmoduleをKoinの初期化時に渡します。 ここで忘れてはいけないのが、environmentPropertiesの呼び出しです。 ここで呼び出さないと環境変数はKoinのpropertyRegistryに登録されません。

environmentPropertiesの中では、System.getProperties()System.getenv()を呼び出し、そこで取得した値をPropertyRegistryの中に保持します。

このenvironmentPropertiesの動きを少しみてみます。 この関数はKoinApplicationクラスに実装されている関数で、内部でKoinPropertyRegistryへ接続し、PropertyRegistryloadEnvironmentPropertiesへと処理をデリゲートしています。

KoinApplication#environmentProperties()Koin#getPropertyRegistry()PropertyRegistry#loadEnvironmentProperties() と言う流れです。

より内部の詳細が気になる方はこちらをご覧ください。

https://github.com/InsertKoinIO/koin/blob/master/koin-projects/koin-core/src/main/kotlin/org/koin/core/KoinApplication.kt#L104...L107

fun main() {
    startKoin {
        environmentProperties()
        modules(listOf(module))
    }
    MainComponent().sayMessage()
}

MainComponentsayMessageを実行するとめでたくHello, World!と表示されると思います。 これで環境変数バンドルするクラスをInjectすることができるようになりました。

また、Koinは環境変数だけではなく、Propertiesファイルの読み込みもサポートしています。 その読み込みに関しても、先程の、getProperty関数でサポートしているため、環境変数とPropertiesファイルの両方を統一的に扱うことができるのもKoinの良いところです。

終わりに

短かったですが、Koinでの環境変数の利用の方法を共有させていただきました。 それでは。

2018年の振り返り。今年もいい年だったと思う。

こんにちは。約一年に一回だけブログ書く人です。 今年の振り返りと来年の抱負的なの書きます。 目的としては備忘だったり、一年間やったことを振り返ることによって「お疲れ、自分」するためだったり。

だいたいTwitterみながら遡りました。 ちなみに自分は普段はAndroidのアプリを作るソフトウェアエンジニアをしています。

ざっくりどんな年だったか?

仕事編

仕事でいうと、現職がもうすぐで2年になるみたいな感じです。 ジョブホッパーな気質の自分にとっては2年というのはとても長いような気がしています。 事実、現職が今までで一番長くいる職場になっていて、自分でも驚いています。

エンジニアとしては今年はAndroidだけじゃなくて細々としたいろんなものを書いた気がしています。 fastlaneのプラグイン、BitriseのStep、会社のアプリに組み込むための華やかな紙吹雪をJSとWebGL(THREE.js)で書いたり、アプリの中のある数値をグラフィカルに表示するための WebページをReactで作ってみたり…今までAndroidアプリしかほとんど書いてこなかった自分にとっては色々できたなって思える年でした。

こんな感じの紙吹雪作れた。作るために結構紙吹雪の動画をデザイナー氏と見て、ああでもないこうでもない言い合いながらやるのは楽しかった。

そのほかにも以前より少しだけプロジェクトを見るようになったり旗振り役のようなことをしたりして、マネジメントに関する書籍を読み始めたりした年でもありました。 かなり失敗したケースもありましたが、自分的には楽しくやることができたと思っています。

プライベート編

同棲を始めるために引っ越したり、ジムに行き始めたり、キャンプにはまったりフジロックに行ったりしました。 来年は登山と釣りに行きたい。

全部楽しかった。最高。以上。

以下ツイート振り返り

1月

特に技術的なアウトプットはしていない模様だった。 なんか友人の結婚式でギターを弾いて鈍りすぎて悲しかったのかこの時ギターアンプを買っているようです。 ちなみに、少しだけギターを練習する機会が増えました。コピーバンドしたい。

2月

今の会社に入社して1年たった模様

会社で出てきたLGTM画像をツイートしたらちょいバズりした

DroidKaigiで登壇した。 内容はアニメーションの実装の話をしたりした。

ただ、内容的には、「筋肉でやっていこうな!」 みたいな話になってしまってるのでもう少しうまくお話したかった。

ZenWatch3を買ったみたいです。

多分この時Xファイルにどハマりしていた頃だった気がする。

技術書典の準備をしている

3月

Google I/Oの抽選に外れたようです

try!Swiftに参加してたみたいです。

この時、今の会社の人事の人がiOSアプリ開発に挑戦するライブコーディングをしていたのですが、 通りすがりの人たちが教えてくれている様子をみながら「優しい世界だ…」とほっこりしていたのを覚えています。

会社にLinuxのビルドマシンを導入してもらって喜んでいました

リモートビルド最高。今も元気に活躍しています。

技術書典の初稿が終わらなくて苦しんでいる

Androidエンジニアデザイン部に参加して登壇しました。 https://twitter.com/wakwak3125/status/978977719798063105 今の会社のお仕事で、1月〜2月くらいの間にユーザーの新規登録フローの改善を大きく進めていました。 デザイナーやサーバーサイドのエンジニアと協働で手間取らないサインアップフローを作るぞ!と意気込んだ結果としてはかなりいいものになりました。 ログイン率やサインアップに必要なステップ数も大幅に改善しました。こういう仕事は楽しい。数字が上がらない時は苦しいけど。

4月

会社に出張回転寿司がきてわいわいしていた模様

会社の執筆部として技術書典を無事に終了することができた模様。 https://twitter.com/wakwak3125/status/988708113460047873 https://twitter.com/wakwak3125/status/987988020384096257 この時書いたのは確か、前述のサインアップフロー改善の詳細についてを書いた気がする。 しかもめっちゃ買ってる。

5月

Webフロントに興味が湧き始めたようです。

会社の同僚とキャンプに行った模様。 Amazonで買った激安テントが大活躍でした。

会社でゆるっとGoogle I/OKeynoteを見る会を開いた。

だらだらしてたらnon-devの人たちも見ていてみんなでわいわいできたので楽しそうでよかった。

OculusGoを買ったみたいです

会社で担当しているアプリに機能を追加していた。

とてもいい機能だと思っているけど、当時のアプリの成長のフェーズや色々な要因でとても成功とは言えない結果になった。 ただいつもいつも施策が当たるわけではないし仕方がない。そしてこの時はプロジェクトの進め方にも問題があったなと思ってかなり反省した記憶が蘇ってきた。

6月

WorkManagerがとても使いやすくて色々感謝しながら帰宅している模様

potatotipsで登壇していた。

内容としては、前述のWorkManagerを利用した際に出力しているデバッグログが大きすぎてOkHttpのLoggingInterceptorがOOMで死んだっていう話でした。 LoggingInterceptorにPR出したけど、忙しくなったりしたのもあってまだ未完成のまま…よくない。

ZOZOSUITSを手に入れてワイワイしていた見たい。

7月

Kotlin愛好家で登壇していた。

Kotlin/JSでもシュッといい感じに async/awaitできたよ〜的な話をしました。

会社の仕事でちょっとWebフロントをしていた。 ただ知らないことだらけで結構苦労していた模様(主にCSS

ものとしては、単純なグラフを表示するだけのWebページを作るって感じだったのでちょうどよかった。

フジロックに行っていたみたいです。

本当に最高だった。また来年も行きたい。

8月

GitHub Releasesから任意のファイルをダウンロードできるBitriseのStepを作ったみたい

BitriseのStepの作り方については勉強会で登壇しました。

また技術書典の準備をしている

Kotlin愛好会で海辺にもくもくしに行ったぽい

9月

荒木飛呂彦原画展に行ってました

本当に最高!最高だった。

酔っ払った勢いでAndroidXの対応をやり始めた模様

この時は後悔しそうだなーって思ったけど、案外簡単に終えることができたのでやはりアルコールは正義

Kotlin愛好会で登壇していました

KOINというDIコンテナの紹介をしました。

技術書典の初稿脱稿していたっぽい

京都に行ってたみたい

macOS mojaveにアップデートしようとして完全に起動せず積んだのが9月だった見たい

個人的に今年かなり好きだった記事

10月

技術書典の準備がだいたい終わった模様

Androidテスト全書を読んでテストに燃えたのがこの頃な気がする。 https://twitter.com/wakwak3125/status/1047171209815838720 会社で担当しているアプリのUIテストが少し不安定なのもあって安定化させようとこの頃くらいから色々考えてたような気がする。

新しい機能を作っていたっぽい

初めて自作キーボードに手を出した。

十数年ぶり?くらいの半田付けはとても難しかった。

そう言えばこの月に引越しをした。 ちょっと広くなったし快適な部屋になって最高。

11月

まだ先月のことなのにそういやこんなのあったな〜〜〜ってなってる

結局今どんな感じなんだろう?

CI/CD Test Nightで2日連続で登壇してきた

この時、protbufについて調べていたみたい

12月

残念がっていた模様

以上だよ!さようなら!また来年! 来年は自分のプロダクトを作るぞっていうのが目標です。頑張るぞ。

NativeScriptの環境構築をやってみたよ

NativeScriptの公式サイトにあるセットアップをしてみました。 どうやら二種類のセットアップ方法があるようです。

NativeScript

www.nativescript.org

Quick setup

http://docs.nativescript.org/start/quick-setup

  • バイル開発未経験者向けのセットアップ方法
  • インストール方法が簡略化されている模様

Advanced setup

私はAndroid開発経験があり、MacユーザーなのでAdvanced setupMac版を選択しました。 基本的には公式サイトの手順通りに進めていきます。

1. HomeBrewのインストール

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

2. Node.jsをインストール

Node.jsの4.x, 6.x, 7.xのどれかの最新版かつstable版をインストールしてくださいとのことです。 NativeScriptの公式サイトでは、Node.js 6.xを使うことを推奨としているそうですが、すでにNode.js 7.4.0が入っていたのでそのまますることにしました。 HomeBrewでインストールします。

brew install homebrew/versions/node6-lts
brew install node

3. iOSの開発環境をセットアップしていきます

3-1. Xcodeのインストール

AppStoreから最新版を落として来ましょう。

3-2. Command Line Toolsのインストール

https://developer.apple.com/downloads/index.action この辺から自分のOSのバージョンとXcodeのバージョンにマッチするCommand Line Toolsをインストールしてください。

3-3. 色々gem等をインストール

gem install xcodeproj
gem install cocoapods

Xcode7.3と古いcocoapods(0.39.0以前)を使っている人はこちらも必ずインストールしてくださいとのことです。

brew install xcproj

4. Androidの開発環境をセットアップしていきます

HomeBrewを使ってAndroid SDKをセットアップしている箇所は都合上、AndroidStudioをインストールするような形で代用させていただきました。

4-1. JDK8をインストール

http://www.oracle.com/technetwork/java/javase/downloads/index.html ここから最新版をインストールしてください。

インストールが終わったら、JAVA_HOME を設定してあげましょう。

export JAVA_HOME=/path/to/your_java

4-2. Android SDKをインストール

https://developer.android.com/studio/index.html こちらから最新版のAndroidStudioをダウンロードしましょう。 インストール方法や設定が日本語で書かれているので、安心です。

4-3. ANDROID_HOMEを設定

インストールが終わったら、ANDROID_HOMEを設定してあげましょう。

export ANDROID_HOME=/path/to/android-sdk

4-4. Android SDKをアップデートする

結構時間かかるのでお茶でも飲んで待ちましょう。

android update sdk --filter tools,platform-tools,android-23,build-tools-23.0.3,extra-android-m2repository,extra-google-m2repository,extra-android-support --all --no-ui

5. いよいよNativeScript CLIのインストール

なんか長かった気がする… こちらのコマンドでインストールしましょう これも結構時間がかかります。コーヒーでも飲んで待ちましょう。

npm i -g nativescript

終わったら

tns doctor

と打って、問題がないか確認しましょう! No issues were detected. と表示されれば晴れてオッケーです。

以上です。

マッチングアプリ比較と傾向

この記事は カノジョできてるエンジニア Advent Calendar 2016 10日目 の投稿です。

こんにちは。ワクワクです。
三次元の彼女ができてるエンジニアです。

会社のエンジニアとマッチングアプリについて話をしていたら、それで1記事書いてくれと言われたので、この場を借りてやってみようと思います。  

僕自身、マッチングアプリで彼女ができた人間なので参考になればと思っております。

この投稿の目的

  • マッチングアプリってたくさんあるけど、どう違うの?
  • どんなシステムなの?
  • マッチングアプリで彼女って本当にできるの?
  • マッチングアプリ使ってるってバレるの恥ずかしいんですけど。

的な内容を、マッチングアプリニュービー達に送りたいと思っております。

私の使ったことあるマッチングサイト一覧

DLして、プロフィールを埋めたり、マッチングしてメッセージ交換を行ったアプリ一覧です。
全てAndroidスマートフォンでの検証です。

  • Pairs(ペアーズ)
  • with(ウィズ)
  • タップル誕生
  • Tinder(ティンダー)
  • Poiboy(ポイボーイ)
  • happn(ハプン)

これらを順に比較していきたいと思います。

その前に...

前述したマッチングアプリは大きく二つの分類、本気っぽいもの比較的ライトなもの に分けることができるのではないかと思っております。
ちょっと他にいい単語が思いつきませんでしたが、要は、婚活を主目的とした女性が多いもの友達を探したり、気軽に恋人を探している人、かっこいい男性が見たいだけの女性が多いもの です。  

ではまず、分類して見ましょう(個人的な主観です)。

本気っぽいもの

  • Pairs(ペアーズ)
  • with(ウィズ)

この二つに関しては、比較的本気で恋人を探している女性、婚活中の女性が多いと思われます。
では両者の特徴について見ていきましょう。

Pairs

Pairsはすごく有名ですよね!
エウレカさんの運営するマッチングアプリです。
公式情報によると、マッチング数は2700万組、累計会員数は450万人と圧倒的な登録者数を誇ります。
アプリのUIも使いやすく、他のいろんなマッチングアプリのベースのような存在になりつつあるのではないかなぁと思っております。

システムとしては、きになる女性に対して「いいね」を送ることで、好意を伝えることができます。
「いいね」を送った女性から「いいね」が返ってくれば晴れてマッチング、メッセージのやりとりが可能となります。
「いいね」できる数には限りがありますが、毎日ログインすることで、「いいね」に交換できるポイントがもらえます。リテンションも高そうですね。

メッセージのやりとりには月額会員になる必要があります。
月額会員の特徴などは公式サイトをご参照ください。

では特徴を列挙していきましょう。

  • 会員数が多い
  • 婚活・恋活を目的としたユーザーが多い
  • UIが綺麗。
  • サポート体制もしっかりしている
  • ユーザー数が多いので、ライバルも増える
  • しかし、その分自分のタイプの女性と出会える確率は高いと思われます。

Pairsに関しては、多くの紹介サイトもあると思うので、初めてマッチングアプリを使うといった方にはお勧めできると思っております。

何と言っても綺麗なUIや使いやすいアプリはさすがだなぁと思うところがあります。
エウレカさんには感謝です。

with

withはメンタリストのDaiGoが監修したとされる恋活・婚活アプリです。

基本的なシステムは前述のPairsと同じですが、ここでDaiGo要素が活きてきます。
DaiGo監修の診断のようなものが定期的に配信され、そちらに対して回答することで、診断したどうしだと「いいね」のポイントを消費することなく好意を伝えることができます。画期的ですね! 
診断した結果で相手と趣味や考えが合うかどうかも一つの参考要素にできるようになっているので、マッチングアプリ群雄割拠の時代に一つの差別化要素をうまく追加できているので、素晴らしいなぁと思っています。

アプリのUIもマテリアルデザイン(Googleの提唱するデザインガイドライン)に準拠したような作りになっており、綺麗で使いやすいものとなっています。

ごくたまにですが、キャンペーンなども行なっております。

では特徴を列挙して活きます。

  • 婚活よりは恋活のイメージがあります。
  • UIは綺麗。
  • ユーザー数がまだそこまで多くないようなので、ライバルも少ない分、好みの女性に出会える確率は下がる。
  • しかし、Pairsは有名で会員数が多く、多くのいいねが男性からきやすい女性はこういった少し小さなコミュニテイに属することをこのむといった傾向もあるため、Pairsではマッチしなかったけど、withではマッチした、といった女性もいる。(私はいました。)
  • 少数派ではありますが、友達を探している女性もいるようです。
  • DaiGoが好きな女性が登録しているのも事実。そこをどう捉えるかはあなた次第です。(深くは書きません。)

withは最近Facebookの広告でもよく見るようになりましたね。
仕組みは基本的なマッチングアプリと変わりなく、UIも使いやすく、DaiGoの診断システムによるポイントを消費せずに好意を伝えることができるシステムは画期的だなと思いました。
しかし、登録しないとわからない利点であるためこういうところをもっと推していってもいいのかぁと思いました。

ちなみに筆者はwithで現在の彼女と出会いました。 楽しくやっております。

比較的ライトだと思われるもの

  • Tinder(ティンダー)
  • Poiboy(ポイボーイ)
  • happn(ハプン)

この三つに関して書いていければと思っています。
あれ?タップルは?と思われた方もいると思いますが、後述します。

これらのアプリに共通して言えることは年齢層が比較的若いといったところでしょうか。

Tinder

Tinderはスワイプ形式で好みの女性を仕分けしていくアプリです。
その独特なシステムとUIは楽しく、気に入った女性を右スワイプすることで「LIKE」することができます。が、女性には伝わりません。 女性が運よくあなたを表示し、同じく「LIKE」することで マッチングが成立し、メッセージの交換を行えます。左スワイプで 「この女性はタイプではない」 とすることができます。これ、仕分けた結果は機械学習とかされてるんでしょうか。。。気になります。  

LIKEしたことを相手に伝えることができる、 SuperLike という機能がありますがこちらは無料では1日一回だけ。ここぞという時に使いましょう。体感ではマッチする確率が高くなります。

料金は基本的には無料。マッチした相手とのメッセージも無料でできます。
有料登録すると以下のような機能を使うことができます。

  • 一日のLIKE数が無限に
  • SuperLikeが毎月プラスされる

価格も1000円程度とリーズナブルです。
では特徴をまとめていきましょう。

  • 基本的には無料で使えるのでとりあえずマッチングアプリ使ってみたい人にはおすすめ。
  • ユーザー層は外国人も混じってくる。
  • 婚活というよりは、恋活、友達作りの方が多いと思います。
  • 仕分ける作業は楽しい。
  • 女性とメッセージでやりとりして、なんとなくの雰囲気をつかむ練習にはいいかも。

独特のUIとUXのTinderですが、スワイプしてめくっていくスタイルを実現するiOSAndroidのライブラリも複数あるそうです。気になるかたは見てみてはいかがでしょうか?各プラットフォームずつ抜粋してみました。

Poiboy

Poiboy男性がほぼ何もすることができないちょっと変わったマッチングアプリです。

仕組みとしては、女性がきになる男性を仕分けしていくアプリで、男性は基本的に仕分けを待つことしかできません。
しかしその分、仕分けてくれた女性とはスムーズに会話をすることができます。人は中身と言いますが、Poiboyにおいてはまず見た目。見た目に自信のある方、使ってみましょう。。

メッセージは有料会員のみ、ただ値段は1500円ほどでそこまで高くないですね。
女性は男性を仕分けしてグルーピングすることができます。例えば...

  • メガネ男子
  • 黒髪男子
  • メッセージ返してくれた男子

などなど...

このグルーピングがキモで、グルーピングされることで、女性への露出が増え、仕分けてもらえる確率が上がります。

Poiboy側でもイベントが実施されることがあり、例えばメガネ男子イベントでプロフィールをメガネをかけた画像にすることで、女性への露出度が高まります。
こういったイベントをうまく使うことで、確率をアップしていくことができます。

また、最近は女性へ能動的にアピールする機能も実装されています。
アピールできる数は制限がありますが、使うことでマッチング確率が上がります。

では特徴まとめいってみましょう。

  • 基本的に男性は何もすることができない。
  • 見た目重視のある意味男性にとっては残酷かもしれない。
  • マッチすると嬉しい。 
  • 婚活要素はあまりない。恋活もそうですが、女性が目の保養に使ってるイメージがあります。
  • マッチ後は割とスムーズ。

happn

happnは道ですれ違ったhappnユーザーが表示されるアプリです。
似たようなアプリとしてはCrossmeというものがありますね。こちらは使ったことがないですが、すれ違いをベースに出会っていくタイプとしては同系統としても大丈夫でしょう。

こちらはもう完全に恋活や婚活ではないと思っています。
仕組みは新しく面白いなぁと思いました。まだまだアーリーアダプターが多い感じがしており、IT系/WEB系の人が多いイメージです。

そういった友人が欲しい人にはおすすめではないでしょうか。
例えば、近所でランチする友達が欲しいとか、そういった用途ではいいと思います。

すれ違った人に対してLIKEをすることができ、相手もLIKEしてくれればメッセージができます。   また、LIKEしたことを相手に伝える機能も付いております。こちらは無料で使うには数に限りがあります。

ではちょっと内容が薄いですが特徴いってみましょう。

  • 無料でやっていける。
  • 恋活目的ではまだ少し微妙かも。
  • 近所のランチ友達を見つけるくらいにはちょうどいいかもしれない。
  • そこからの発展もあるかもしれないけど不確実性が高い。
  • すれ違ったということで、大まかな位置情報が共有されることになるので、嫌がる人は多いかもしれない。

タップル誕生について

タップル誕生

こちらは上記の2分類に当てはめるのが難しいと思っています。その理由は

  • TinderライクなUI
  • 恋活イメージが強いが、価格帯は婚活アプリと同等
  • もちろん純粋に恋活・婚活として使っているユーザーも多い。

と、使ってみた感じでは比較的ライトだが、値段設定は婚活アプリと同等...なので、ちょっと分類に困りました。また、いわゆるネットワークビジネス的な人が多いようにも感じられ、少し使ってやめてしまいました。

システムはTinderとほぼ同じです。

まとめ

はい、色々と比較と考察をしてみました。
マッチングアプリが非常に多く出てきた昨今ですが、その基本的なシステムは 相手に好意を伝える。そして相手から反応があればメッセージができるようになる です。この辺りを押さえておけばあとは各プラットフォームの独自機能を把握すればいいです。 最後になりましたが、こういったアプリを使うにあたってのTipsをまとめたいと思います。

ばれるのやなんだけど。

マッチングアプリは基本的には情報の正確性を担保するためにFacebookと連携することが求められます。
が、基本的にこの連携が他人にばれることはありません。安心してください。
しかしバレるリスクはあります。メインなものとしては

これはもうどうしようもないです。
iOSの方はフォルダを作って奥地にしまっちゃいましょう。
Androidの方はホームに置かず、ドロワーにしまっちゃうかしましょう。

Android限定ですが、サードパーティのホームアプリを使えばドロワーからもアプリを隠すことができます。
これらで対策していきましょう。

出会ったけどアプリで出会ったっていうのやだ。

マッチングアプリで出会うということは恥ずかしいことではないです。
もはやインターネット社会になった昨今、選択肢の一つでしかないです。
そして、あなたの友人はそこまで出会った経路に関して興味を持っていません!きっと。
人間、他人に強い関心を持っていることは少ないです。伝えても多分3日もすれば忘れてます。きっと。

どうしても聞かれて伝えるのが嫌なら、友達の紹介とか合コンとかいっときましょう。

出会えないんだけど。マッチしないんだけど。

プロフィールを完璧に埋めましょう。
人となりを「情報と写真」でしか判断できない状況を乗り越えるには、その情報を厚くしていくことが最前です。
プロフィールや写真は一朝一夕ではいいものができません。常にPDCAサイクルを回し、改善していくことでマッチング率が上がっていきます。

終わりに

以上が、使って思ったところでしょうか。 内容に関して質問があれば聞いてくださっても構いません。
以上です。ありがとうございました。

今から新規でAndroidアプリを書き始めるなら。

この記事は Android Advent Calendar 2016 2日目の記事です。

こんにちは。わくわくです。
現在お仕事で書いているアプリを新規で書き始めたのが2015年で、現在は2016年です。
そう、1年が経ちました。その頃から今まで書いてきて、今から書くならこんなライブラリや設計を採用するよ(したいよ) というのをまとめたいと思います。
これからAndroidアプリを書くけどどんなものつかっていけばいいんや〜?といった方の参考になれば幸いです。
すでにAndroid開発をされている方にとっては内容が薄く感じられることと思いますがご了承いただければと思っております…(予防線)
(裏の目的としては自分の備忘録のようでもあったりします。)

この記事では紹介しているライブラリや設計などに関しては深くは説明を書きませんが、参考になる資料などをまとめて行ければと思っております。

言語について JavaかKotlinか

2016年にめでたく1.0がリリースされたKotlinですが、使っていてとても楽しくて好きな言語になりました!
現在は1.0.5-2が最新バージョンです。

Kotlin 1.0 リリース: JVMとAndroid向けの実用的(Pragmatic)言語 | JetBrains ブログ

現在お仕事で書いているアプリも新規で書くクラスやテストコードなどでは積極的にKotlinを採用しております。
1.0リリースからKotlinを導入してよかったことやちょっと残念だったこと等をまとめていきます。

メリット

  • ラムダが使える
  • 便利な拡張関数
  • スコープ関数
  • switchより便利なwhen
  • null安全である
  • interfaceにデフォルト実装を書くことができる
  • デフォルト引数が使える
  • 名前付き引数が使える
  • リスト操作が容易

などなど、AndroidにおけるJavaでは使えないような機能が備わっております。
さらに、null安全であるため、AndroidでFragmentを使う際によく発生しがちなヌルポを防いでいくことができます。
では、そんなKotlinを使う上での自分なりのデメリットを考えてみました。

デメリット

  • 公式の言語ではない事によるサポートの将来性
  • 一部aptを使用したライブラリとの相性問題(IcePick, Parceler, Dagger2...etc)
    • こちらはKotlin側でも積極的に改善が進んでおり、現在ではあまりデメリットとも言えないとは思いますが、まだまだハマってしまうことがたまにあるので、記載させていただきました。
  • DataBindingを使う際、ソースコードが真っ赤になってしまう問題
    • こちらもKotlin1.0.5でかなりカイゼンされました!

しかし上記のデメリットを受け入れた上でも導入してよかったと感じています。
Kotlin向けに作られたライブラリなども盛んです。

参考

qiita.com

qiita.com

設計について

Androidの設計についてはいろんなところで議論が進んでいますが、現在は MVP もしくは MVVM を採用することが多いのかなと思っております。
MVCだと簡単なアプリでは問題にはなりませんが、規模が大きくなっていくといわゆる筋骨隆々なマッチョActivity/Fragmentが出来上がってしまうことになります。筋肉が付く場所は自分の体だけでいいと思っています。

MVP

Model-View-Presenterでアプリを表現していきます。

Activity/Fragmentを完全にViewとして扱い、Viewで発生したイベントをPresenterが処理し、Modelと通信します。
ModelはPresenterに対して、データをわたし、Viewの描画処理を担います。

MVVM

Model-View-ViewModelでアプリを表現します。

MVPとめっちゃ大きく変わる!といったことはありませんがViewの描画処理をViewModelと言うクラスが担当します。
AndroidではDataBindingと一緒に使うことで今まで書いていたtextView.setText("hoge")的なものを書かなくて済むようになるので大変楽になります。

参考記事

こちらのサンプルプロジェクトがとても参考になりました。
標準の実装からMVP, Android-DataBindingを使用したMVVMをまとめたリポジトリになっていてテストコードも用意されております。

github.com

  

また、上記プロジェクトを解説してくださっているエントリーもありますのでこちらにもとても助けられました。

qiita.com

  

全然関係ないですが内容が気になるこちら。

qiita.com

設計に関して、自分は読んだだけでは理解ができない頭なため、実際に手を動かして写経、そして自分でもアプリを書いてみる。などしてみることで理解が進みました!
どっちを採用すべきかはその画面などによるかとも思いますので、やはり一度手を動かしてみると気づきがあるのかな…と思いました。(基本的なところなんですが…)

ライブラリ

ライブラリも非常にたくさんありますね。よく使うものを抜粋させていただきました。
作者の方、コントリビューターの方々には足を向けて寝ることができないな…といった気持ちです。
基本方針としては最新版/それなりのユーザーが居るものを使います。

ネットワーク処理を楽にする

  • square/Retrofit
    • 超ド定番のRESTClientです。僕はこれがなければきっと何もすることができません。
    • 2系になってからより便利になりました。今から開発を始めるなら迷わず2.x系を採用します。
  • google/gson
    • 上記のRetrofitと合わせて使います。Jsonを扱うライブラリです。
    • Java開発の現場ではJacksonを使うことも多いようですが、Androidにおいてはメソッド数問題のため導入がためらわれるようです。

FRP

  • ReactiveX/RxJava
    • 複雑なイベント処理/非同期処理などはRxJavaを使うことでシンプルに記述することができます。
    • すでに多くのアプリで採用されていますね。しかしその独特の概念などもあるため無理して導入する必要は無いと思っています。もちろん、導入したほうが色々と楽になることは間違いと感じているのですが、新しい概念的なものもあるので学習はある程度必要なのかなと思っています。
    • 導入に際しては前述のRetrofitと一緒に使うことができるので、そちらの通信周りの非同期処理から使い始めるのが良いかと思います。
  • ReactiveX/RxAndroid
    • RxJavaをAndroidで使う時に便利になるライブラリです。
    • RxJavaを使用する際は合わせてつかうことになるとおもいます。

画像を扱う

  • square/picasso
    • URLから画像を非同期読み込みして表示してくれたり、またいい感じにキャッシュしてくれたりします。使い方もとても簡単です。
  • bumptech/glide
    • Picassoとほぼ同じような使い方で使うことができます。

上記のライブラリ2つはほとんど同じような使い方ができますがキャッシュ周りや優先度付けなどに若干の差があります。しかし通常使う分に関しては両者とも大きな差は無いので好きな方を使う。といった感じでも良いと思っています。
こちらの記事が大変参考になりました。

qiita.com

バックポート系

前述しましたが、Android開発におけるJavaではJava8で使えるような機能が使えません。しかしこちらはライブラリを使用することによってある程度改善することができます。

  • aNNiMON/Lightweight-Stream-API
    • Java8のStreamAPIのバックポートライブラリです。
    • リスト操作において、forEachなどが使えたり、さらにはOptionalも使えるようになります。
    • Kotlinを採用しない場合等ではとても強力な助けになると思っております。
  • JakeWharton/ThreeTenABP
    • Java8ので改善された日付処理のバックポートライブラリです。
    • 今までもJoda-Time-Androidが使われることがあると思いますが、バイナリサイズなどの観点から新規で書くにあたってはこちらを使用するのが良いと思います。
  • evant/gradle-retrolambda

データベース/ORM

  • realm/realm-java

    • いろんなプラットフォームで使える、SQLiteを置き換えるモバイル用のデータベース、Realmです。
    • 非常に高速で、使いやすいAPIを用意してくれています。
    • お仕事ではこちらを使用しております。
    • 注意点としては導入することでAPKサイズが大きくなってしまうというのが大きなデメリットです。
      • こちらに関してはapk splitという機能を使うことである程度緩和できますが、アプリのファイルを複数管理することになるの手間が増えてしまいます。 realm.io
  • gfx/Android-Orma

    • こちらは高速・使いやすいSQLiteのORMです。
    • 上記のRealmと違ってアプリサイズが肥大化することもなく、またORMであるので今後別のORMに乗り換えることになっても移行が容易であることがメリットであると感じています。
    • データベースはアプリを一度作り始めると変更をしにくい箇所でもあるとおもうので、どちらを使うかは要検討、、、と思います。 乱暴な言い方になってしまいますが、個人なら好きな方を使うのが良いとおもいます。

その他

  • facebook/Stetho

    • Facebookが提供しているAndroidアプリの中をいろいろと見れるライブラリです。
      • SQLite, SharedPreference, Network...etc
      • Realmを使用している方はこちらを使うことでRealmの中身をみることができるようになります。
  • google/Dagger

    • square社が提供しているDIコンテナのGoogleフォーク版です。通称Dagger2
    • DIコンテナ自体は必要になったら導入、という風にするのでも良いのではないでしょうか。
  • hotchemi/PermissionsDispatcher

    • Android6.0から導入されたPermissionをキレイにさばくことのできるライブラリです。
    • 使い方はとても簡単ですが、まずはAndroidのPermission処理の大筋の流れを掴んでおくことが重要です。 developer.android.com

DataBinding

過去にAndroidアプリを書く際はButterKnifeというライブラリを使ってViewインスタンスの生成を行っていました。
こちらはfindViewById(R.id.text_view)といったものを書かずとも、Viewのインスタンスを生成できる、といったライブラリでした。
しかし現在では、Googleの提供する、DataBindingという機能を使うのが良いでしょう。
DataBindingを使えば、ButterKnifeよりも、より楽にViewにアクセスできる様になります。
導入もとても簡単です。公式のドキュメントが一番わかり易いと思いますので導入・使用に際してはそちらを参照していただければと思います。

https://developer.android.com/topic/libraries/data-binding/index.html?hl=ja

リリース自動化

  • Triple-T/gradle-play-publisher
    • Gradleで完結できるリリース自動化Pluginです。
    • Gradleだけで完結させたい…!と言った人はこちらがおすすめです。
  • fastlane/supply
    • iOSでは有名なfastlaneのGooglePlayへのリリース自動化ツールです。
    • 結構自由にいろいろできます。
    • こちらは内部はrubyで書かれております。

あとがき

さて、設計やライブラリの紹介をざーーっとしてきましたが、一応個人的な感想としては普段から本当にいろんなライブラリやインターネット上の情報に助けられて開発をしているな、と言った気持ちです。もしなければヒーヒーいって開発をしていたことでしょう…
感謝の気持ちでいっぱいです。

が、それと同時に非常に多くの選択肢があるのも事実です。
なので、1からAndroid開発を始めたいけど、何をつかったらええのかよくわらん。って言う人向けに今回の記事を書いてみました。
当初はRealm Mobile Platformで書こうと思っていましたが、自分なりに開発を進めて1年がたった節目でもあるのでこれからやっていく人のほんの最初の手助けでもできればと言う感じです…。

他に質問・「こっちのほうがいいぞ!」などあれば随時受け付けていますのでぜひともお申し付けください。

以上です!ありがとうございました。

最近のこと。初めてLTしたり、HoloLensを触る夢を見たり。

去年、勢い良くブログやるぞ!って言ってからいい気分になっちゃって書いてなかったので、ちまちま楽に書いていこうと思います。 とりあえず、最近あったことを自分なりに整理する。あと今年の目標なんかの達成率的なのも現時点でまとめときたい。

初めてLTというものを経験した。

gunosy-beer.connpass.com

Gunosyさんのオフィスで開催されている、Gunosy beer bash という勉強会でLTをしてきました。 グローバル x アプリ開発ということで、偶然お声がかかり軽く「いいっすよ」といったものの勉強会で登壇すること自体が初めてだったのですごく緊張した。 スライド作るのなんていつぶりだっただろうか…

こんな発表をしてきました。

speakerdeck.com

ええ、それはそれはもう緊張しました。

他の方の発表などは安心して聞けるものが多く、勉強になるなぁという思い出楽しく聞いておりました。 特に、トランスリミットの高場氏のグローバルアプリの開発に関するところは「そうだよね…」と同意しながらも、僕自身まだできていないところがあるよなぁと思いながら聞くことができたので非常に有意義でした。

一応発表の反省点としては、

  • ゆっくりしゃべる
  • スライドは後でアップロードするもの。スライドだけ見てもだいたいの内容が伝わるようにしたい。
  • ビールは飲み過ぎない(でも少しくらいなら飲んだほうが心が和らぐ。)

という感じでした。下戸の僕にとっては最後がなかなか難しいですが、次回発表する際は上記3点を改善していきたいと思いました。

HoloLensを触る夢を見てきました。

みなさんHoloLensってご存じですか?知ってますか? Microsoftが現在開発している、 MR(Mixed Reality) デバイスです。 ARやVRはよく聞くのですが、MRは聞き慣れなかったので、なんだろうという気持ちですが、Wikipediaの一部を抜粋するとこういうものだそうです。

現実空間と仮想空間を混合し、現実のモノと仮想的なモノがリアルタイムで影響しあう新たな空間を構築する技術全般を指す。 複合現実感とも。 拡張現実と拡張仮想を包含する概念である。

なるほど。よくわらかん。 とりあえず見た夢を奇跡的に写真に収めることができたのでここに共有できればと思います。 場所はエクセルソフトさんで行われました。 @mitsuba_tan さんが開発者キットに当選されたということで、この場を設けていただけたとのことです。本当にありがとうございますm( )m

hololens.connpass.com

詳しいことはググるとたくさん出てきますのでどんな様子だったかをお知らせできればと思います。

こんな感じでした。

まずはケース。まるで湯たんぽのようです。かあいいです。質感Goodです。でも40万円です。高い湯たんぽだ。

ついにおさわり!かっこいい…!

触った感じがもうなんていうかその、いろんな物体を部屋にぽいぽい置けるぞ!すげええ!っていう感じです。未来を感じることができました。 空間情報をHoloLensが覚えてその座標にオブジェクトを配置していくので後ろからも見れるししゃがんでも見れるしでもうほんとにトニー・スタークの開発ルームを実現できるのでは無いかって思いました。

めちゃくちゃ楽しかったです。

HoloLensをおさわりさせていただいた@mitsuba_tan さん、エクセルソフトさん、本当にありがとうございました!

という夢をみました。

今年の目標について

  • ブログちゃんと更新する。
  • サーバーサイドも少しは分かるようになる。
  • 設計などをしっかりできるエンジニアを目指す。
  • より速いスピードで品質の良い物を作れるようになる。
  • 勉強会であと4回は登壇する。

全部できるかな…いややるんだ!という強い意志を持って頑張ります。

以上