<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: chuross</title>
    <description>The latest articles on DEV Community by chuross (@chuross).</description>
    <link>https://dev.to/chuross</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F46197%2F54d82dcd-6065-4034-8194-377caea863fe.jpeg</url>
      <title>DEV Community: chuross</title>
      <link>https://dev.to/chuross</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/chuross"/>
    <language>en</language>
    <item>
      <title>Androidでアプリの定数をBuildConfigではなくYamlから自動生成したい - Gradle Config Plugin</title>
      <dc:creator>chuross</dc:creator>
      <pubDate>Mon, 27 Nov 2017 16:16:07 +0000</pubDate>
      <link>https://dev.to/chuross/androidbuildconfigyaml---gradle-config-plugin-a3b</link>
      <guid>https://dev.to/chuross/androidbuildconfigyaml---gradle-config-plugin-a3b</guid>
      <description>&lt;h2&gt;
  
  
  経緯
&lt;/h2&gt;

&lt;h3&gt;
  
  
  やりたかったこと
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;アプリケーションで使う定数的な値を一括管理したい&lt;/li&gt;
&lt;li&gt;ProductFlavorごとにAPIの向き先など設定情報を変えたい&lt;/li&gt;
&lt;li&gt;それらを管理するためのクラスを自分で作りたくない&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  BuildConfigを使わない理由
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;build.gradleが肥大化する&lt;/li&gt;
&lt;li&gt;定数の記述が多少面倒

&lt;ul&gt;
&lt;li&gt;いちいち型を記述しないといけないので面倒&lt;/li&gt;
&lt;li&gt;すべての値を文字列で埋め込むのも好みでない&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Gradle Config Plugin
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/tmiyamon/gradle-config"&gt;https://github.com/tmiyamon/gradle-config&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  特徴
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;ProductFlavorごとにYamlを定義できる&lt;/li&gt;
&lt;li&gt;Yamlから値に参照するためのクラスが自動生成される

&lt;ul&gt;
&lt;li&gt;値の型はYamlの記述内容に合わせて自動的に解決してくれる&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  導入
&lt;/h2&gt;

&lt;h3&gt;
  
  
  buildscriptにプラグインを追加
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buildscript {
  repositories {
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath "gradle.plugin.com.tmiyamon:gradle-config:0.2.1"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  プラグインを適用する
&lt;/h3&gt;

&lt;p&gt;アプリのプロジェクトがあるbuild.gradleに以下を追記&lt;br&gt;
(app/build.config)&lt;/p&gt;

&lt;p&gt;&lt;code&gt;apply plugin: 'com.tmiyamon.config'&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  使い方
&lt;/h2&gt;
&lt;h3&gt;
  
  
  コンフィグファイルを作る
&lt;/h3&gt;

&lt;p&gt;アプリのプロジェクトルートに&lt;code&gt;config&lt;/code&gt;ディレクトリを追加する&lt;/p&gt;

&lt;p&gt;ファイル名は以下が対応している&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;config/default.yml
config/default_secret.yml
config/${productFlavor}.yml
config/${productFlavor}_secret.yml
config/${buildType}.yml
config/${buildType}_secret.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ProductFlavorに応じてこれらのファイルが適宜読み込まれて1つのクラスが生成される&lt;/p&gt;

&lt;p&gt;&lt;code&gt;*_seciet.yml&lt;/code&gt;のファイルは秘匿情報を入れることができる。使う場合はバージョン管理下に置かないように&lt;code&gt;.gitignore&lt;/code&gt;に入れておくこと&lt;/p&gt;

&lt;h3&gt;
  
  
  Yamlに項目を埋めていく
&lt;/h3&gt;

&lt;p&gt;あとはYamlを作っていくだけ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;size: 2
server: google.com
section:
  size: 3
  servers: [ {name: yahoo.com}, {name: amazon.com} ]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;このように記述するとビルド時に&lt;strong&gt;Settings&lt;/strong&gt;という名前のクラスが生成される&lt;/p&gt;

&lt;p&gt;生成されたクラスはこのように値を参照できるようになっている&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings.size   // =&amp;gt; 2
Settings.server // =&amp;gt; google.com
Settings.section.size // =&amp;gt; 3
Settings.section.servers.get(0).name // =&amp;gt; yahoo.com
Settings.section.servers.get(1).name // =&amp;gt; amazon.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;便利！！！😃&lt;/p&gt;

&lt;h2&gt;
  
  
  応用
&lt;/h2&gt;

&lt;h3&gt;
  
  
  kotlinの拡張を使って定数と引数を組み合わせた文字列を作る
&lt;/h3&gt;

&lt;p&gt;例えばベースのURLだけYamlに書いておいて、パスの組み合わせをkotlinの拡張で実現する&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;url:
  base: https://hoge.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;続いてkotlin側でプロパティを拡張する&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;fun Settings.Url.getDetail(id: String) = "$base/detail/$id"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;こんな感じでアプリ上で参照できるようになる&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Settings.url.getDetail("1") // =&amp;gt; https://hoge.com/detail/1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  あとがき
&lt;/h2&gt;

&lt;p&gt;設定情報は何かと細かく組み合わせたり、たくさん記述したりする部分なので、管理しやすくしたい&lt;/p&gt;

&lt;p&gt;このプラグインはそうした部分の要求を叶えてくれるよいアプローチに思えた&lt;/p&gt;

</description>
      <category>android</category>
      <category>gradle</category>
    </item>
    <item>
      <title>Twitterのような画像をフリックすると画面を閉じれるライブラリを作った - FlingLayout</title>
      <dc:creator>chuross</dc:creator>
      <pubDate>Thu, 23 Nov 2017 15:11:36 +0000</pubDate>
      <link>https://dev.to/chuross/twitter---flinglayout-d4g</link>
      <guid>https://dev.to/chuross/twitter---flinglayout-d4g</guid>
      <description>

&lt;h2&gt;
  
  
  今回の成果物
&lt;/h2&gt;

&lt;h3&gt;
  
  
  FlingLayout
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/chuross/flinglayout"&gt;https://github.com/chuross/flinglayout&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U4lmbJUa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://qiita-image-store.s3.amazonaws.com/0/20629/0e7cdaa6-6f9e-2bf6-bfb2-24a906c29bbb.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U4lmbJUa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_66%2Cw_880/https://qiita-image-store.s3.amazonaws.com/0/20629/0e7cdaa6-6f9e-2bf6-bfb2-24a906c29bbb.gif" alt="31901843-b1bdb554-b85d-11e7-9ae4-cc49b3a161b2.gif"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  特徴
&lt;/h2&gt;

&lt;p&gt;Twitterの画像とこで使われてるように、上下にフリック操作すると画面を閉じれる挙動をレイアウトに内包するだけで実現できる。&lt;/p&gt;

&lt;h2&gt;
  
  
  導入
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;jitpackをrepositoryに追加する&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repositories {
    maven { url "https://jitpack.io" }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;dependenciesにライブラリを追加する &lt;a href="https://jitpack.io/#chuross/flinglayout"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--q8FuzTGu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://jitpack.io/v/chuross/flinglayout.svg" alt=""&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ol&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;dependencies {
    compile 'com.github.chuross:flinglayout:x.x.x'
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  使い方
&lt;/h2&gt;

&lt;p&gt;サンプルプロジェクトでは&lt;a href="https://github.com/chrisbanes/PhotoView"&gt;PhotoView&lt;/a&gt;を使って実現している。&lt;/p&gt;

&lt;p&gt;具体的にどう使えばTwitterみたいにできるんじゃみたいなの知りたい場合はここ見てね&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chuross/flinglayout/tree/master/app"&gt;https://github.com/chuross/flinglayout/tree/master/app&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  XMLにレイアウトを記述する
&lt;/h3&gt;

&lt;p&gt;これだけで挙動自体は完成&lt;br&gt;
内包できるViewは1つだけなので注意&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;com.github.chuross.flinglayout.FlingLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"&amp;gt;

    &amp;lt;!-- something view parent --&amp;gt;

&amp;lt;/com.github.chuross.flinglayout.FlingLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  ドラッグ操作を制御する
&lt;/h3&gt;

&lt;p&gt;FlingLatoutにドラッグを無効にするフラグを用意しているので適宜セットする&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val flingLayout = findViewById&amp;lt;FlingLayout&amp;gt;(R.id.flinglayout)
flingLayout.isDragEnabled = false
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;サンプルプロジェクトではPhotoViewのスケールを見てフラグを必要に応じてセットしている。(拡大時はFlingLayoutはドラッグ操作を受け付けないようにしている)&lt;/p&gt;

&lt;h3&gt;
  
  
  Dismissのリスナーを拾って画面を閉じる
&lt;/h3&gt;

&lt;p&gt;いつものDismiss用のリスナーセットできるようにしてあるので、それを使えばおｋ&lt;/p&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;val flingLayout = findViewById&amp;lt;FlingLayout&amp;gt;(R.id.flinglayout)
flingLayout.dismissListener = { /** something your code **/ }
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  XML属性一覧
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;key&lt;/th&gt;
&lt;th&gt;type&lt;/th&gt;
&lt;th&gt;description&lt;/th&gt;
&lt;th&gt;etc&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;fl_isDragEnabled&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;ドラッグの有効 / 無効&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fl_isDismissEnabled&lt;/td&gt;
&lt;td&gt;boolean&lt;/td&gt;
&lt;td&gt;Dismissの有効 / 無効&lt;/td&gt;
&lt;td&gt;無効にした場合はスワイプしても元の位置に戻る&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ライセンス
&lt;/h2&gt;



&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Copyright 2017 chuross

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  あとがき
&lt;/h2&gt;

&lt;p&gt;内部的にはViewDragHelperを使用しているので、実装はいたってシンプルに作れた。&lt;/p&gt;

&lt;p&gt;需要はありそうな気がしてたけど、ざっと検索した感じ引っかからなかったり、メンテされてなくてビルドできなかったりしてたので自分で作った。&lt;/p&gt;


</description>
      <category>twitter</category>
      <category>android</category>
      <category>androidlibrary</category>
      <category>kotlin</category>
    </item>
    <item>
      <title>中規模のSwaggerファイルをいい感じに管理するために薄いフレームワーク作った - swglow</title>
      <dc:creator>chuross</dc:creator>
      <pubDate>Thu, 23 Nov 2017 03:58:28 +0000</pubDate>
      <link>https://dev.to/chuross/swagger---swglow-c47</link>
      <guid>https://dev.to/chuross/swagger---swglow-c47</guid>
      <description>&lt;h2&gt;
  
  
  今回の成果物
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Swaglow
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/chuross/swaglow"&gt;https://github.com/chuross/swaglow&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  特長
&lt;/h2&gt;

&lt;p&gt;特定のルールに基づいたディレクトリ階層から、SwaggerのYamlファイルを結合して出力する。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SwaggerのYaml運用に&lt;strong&gt;最低限&lt;/strong&gt;の秩序をもたらす

&lt;ul&gt;
&lt;li&gt;フレームワークが生成したディレクトリに沿ってファイルを追加していくので、ファイル管理をルール化しやすい&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;ディレクトリ階層や名前から&lt;code&gt;paths&lt;/code&gt;や&lt;code&gt;definitions&lt;/code&gt;の定義を自動生成

&lt;ul&gt;
&lt;li&gt;最終的なYamlがどう生成されるのか意識する必要は無い&lt;/li&gt;
&lt;li&gt;Yamlファイルを個別に管理していくことに集中できる&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  経緯
&lt;/h2&gt;

&lt;p&gt;Swaggerで扱うYaml(or Json)は最終的には1つのファイルとして扱わないといけないが、何も考えずにそれに乗っかるとファイルが肥大化して管理しづらくなる。&lt;/p&gt;

&lt;p&gt;そのためYamlを分割して結合するのが良く、npmにも既にそれを実現するライブラリも豊富にある。しかし、そのどれもが&lt;code&gt;$ref&lt;/code&gt;を使う方式で、これだとファイルをどの単位で分割するかのルールが無いので、もうちょっと仕組み的に縛りたかった。&lt;/p&gt;

&lt;h2&gt;
  
  
  導入
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;$ npm install -g swaglow&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  使い方
&lt;/h2&gt;

&lt;h3&gt;
  
  
  初期化
&lt;/h3&gt;

&lt;p&gt;まずはプロジェクトのルートディレクトリでinitコマンドを実行&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ swaglow init -o [output path]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;するとこのようなディレクトリが出力先に生成される&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;swaglow root // -oで指定したパスのルート
- swaglow.json // 専用のコンフィグファイル
- paths // APIのエンドポイントを管理するディレクトリ
- definitions // モデルを管理するディレクトリ
- parameters // APIリクエストで使う共通のパラメータを管理するディレクトリ
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  開発
&lt;/h3&gt;

&lt;p&gt;簡単な例としてREADME.mdにある内容をリンク貼っとく&lt;br&gt;
&lt;a href="https://github.com/chuross/swaglow#example"&gt;GitHub - chuross/swaglow: simple swagger framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;より実践的な例だと、このライブラリを使ってQiita API用のSwaggerを作るリポジトリを用意したのでそちらを確認してほしい&lt;/p&gt;

&lt;p&gt;swagger-toolsなどを用いて出力したyamlをvalidateしたりiOS Clientにビルドする仕組みを入れてCIで回すようにしている&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/chuross/qiita-swagger-yaml"&gt;GitHub - chuross/qiita-swagger-yaml: swagger yaml file for Qiita&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  ビルド
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;$ swaglow build -o [output path]&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;出力先に結合されたSwagger Yamlファイルが生成される&lt;/p&gt;

&lt;h2&gt;
  
  
  ライセンス
&lt;/h2&gt;

&lt;p&gt;MIT&lt;/p&gt;

&lt;h2&gt;
  
  
  あとがき
&lt;/h2&gt;

&lt;p&gt;今回紹介したように手運用でSwaggerのYamlを生成するのは基本的にはオススメしない。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;追従しないとサーバー側の実装と乖離する可能性がある(メンテコストの増加)&lt;/li&gt;
&lt;li&gt;Swagger Yaml職人が出る可能性がある(属人化)

&lt;ul&gt;
&lt;li&gt;チーム全体で管理していく仕組み作りなどが必要になる&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;そういった意味では自社開発のAPIにリクエストを投げる場合であればメンテの効率を上げるためにサーバー側で書かれたコードから自動生成させるのが良いだろう。&lt;/p&gt;

&lt;p&gt;では手運用は果たして意味が無いのかと言うと状況によってはそんなこともない。&lt;/p&gt;

&lt;p&gt;例えばこのようなケースには使えると思われる&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;プロジェクトがスタートした直後でサーバー側の準備ができていない場合

&lt;ul&gt;
&lt;li&gt;モックサーバーとして活用する&lt;/li&gt;
&lt;li&gt;本格的な運用はサーバー側ができたらそっちでやるのが良さそう&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;別会社・別チームのプロダクトなどそもそもSwaggerの連携が難しい場合&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;このような感じでケース・バイ・ケースだと思うので、もし何らかの理由で手運用の管理が必要になった場合はこのフレームワークを使うと良いかもしれない。&lt;/p&gt;

</description>
      <category>swagger</category>
    </item>
  </channel>
</rss>
