<?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: Koji Matsubara</title>
    <description>The latest articles on DEV Community by Koji Matsubara (@kozmats).</description>
    <link>https://dev.to/kozmats</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%2F118784%2F634d6b0c-a8bc-4c87-8ccc-62b7edfa6186.png</url>
      <title>DEV Community: Koji Matsubara</title>
      <link>https://dev.to/kozmats</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kozmats"/>
    <language>en</language>
    <item>
      <title>Kotlin Android Extensions の View Binding を ViewHolder でも良い感じに使うには</title>
      <dc:creator>Koji Matsubara</dc:creator>
      <pubDate>Fri, 30 Nov 2018 08:14:13 +0000</pubDate>
      <link>https://dev.to/kozmats/kotlin-android-extensions--view-binding--viewholder--39ia</link>
      <guid>https://dev.to/kozmats/kotlin-android-extensions--view-binding--viewholder--39ia</guid>
      <description>&lt;h1&gt;
  
  
  はじめに
&lt;/h1&gt;

&lt;p&gt;これまで NewsPicks のエンジニアがまとまった形で外部に対して発表を行なう事が多くなく、なかなか中のエンジニアが普段どのような技術に取り組んだり、悩んだりしているかを知ってもらえる機会が少ないなと感じていました。&lt;/p&gt;

&lt;p&gt;そこで今年から NewsPicks でも &lt;a href="https://qiita.com/advent-calendar/2018/newspicks" rel="noopener noreferrer"&gt;NewsPicks Advent Calendar 2018&lt;/a&gt; と称して Advent Calendar を始める事としました。&lt;/p&gt;

&lt;p&gt;初日は、言いだしっぺである &lt;a href="https://twitter.com/_koji_matsu_" rel="noopener noreferrer"&gt;@_koji_matsu_&lt;/a&gt; が主に担当している Android の分野から &lt;a href="https://kotlinlang.org/docs/tutorials/android-plugin.html" rel="noopener noreferrer"&gt;Kotlin Android Extensions&lt;/a&gt; について記事にしたいと思います。&lt;/p&gt;

&lt;h1&gt;
  
  
  NewsPicks における Kotlin
&lt;/h1&gt;

&lt;p&gt;2018年12月現在 &lt;a href="https://play.google.com/store/apps/details?id=com.newspicks" rel="noopener noreferrer"&gt;NewsPicks&lt;/a&gt;、&lt;a href="https://play.google.com/store/apps/details?id=com.newspicks.academia" rel="noopener noreferrer"&gt;NewsPicks アカデミア&lt;/a&gt; の2アプリを Android 向けに提供しています。その内 NewsPicks については新規コードの全てを、 NewsPicksアカデミア については100% Kotlin で開発を行なっています。&lt;/p&gt;

&lt;p&gt;実は、 NewsPicks アカデミアのサーバサイドも 100% Kotlin で開発しており、以前弊社の&lt;a href="https://medium.com/@monzou" rel="noopener noreferrer"&gt;@monzou&lt;/a&gt;が &lt;a href="https://medium.com/@monzou/newspicks-kotlin-server-18804392946f" rel="noopener noreferrer"&gt;記事&lt;/a&gt;を書いていて大変おもしろい内容なので是非読んでみてください。&lt;/p&gt;

&lt;h1&gt;
  
  
  View Binding
&lt;/h1&gt;

&lt;p&gt;お手軽に Android で Kotlin を使う場合ぱっとメリットが感じられるのが Kotlin Android Extensions を用いた View Binding ではないかと思います。 DataBinding をがっつり使われている現場であれば、DataBinding で代替できますが、 今 Jake神 の &lt;a href="http://jakewharton.github.io/butterknife/" rel="noopener noreferrer"&gt;Butter Knife&lt;/a&gt; を主に使われている方であれば、Butter Knife のような ViewBinding 処理を Kotlin という言語開発元の JetBrains が用意してくれていると思ってもらえれば良いと思います。&lt;/p&gt;

&lt;p&gt;具体的には良くあるレイアウトに定義されている View のインスタンスを取得する以下のようなコードを&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="nc"&gt;Button&lt;/span&gt; &lt;span class="n"&gt;button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;findViewById&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="no"&gt;R&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;button&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setOnClickListener&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// do something&lt;/span&gt;
&lt;span class="o"&gt;})&lt;/span&gt;
&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 kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;button&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setOnClickListener&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// do something&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ここで唐突に出てくる &lt;code&gt;button&lt;/code&gt; というインスタンスですが、これが &lt;code&gt;Kotlin Android Extensions&lt;/code&gt; の機能で View の ID 名をそのまま対応する変数名に自動的に Bind できる機能になります。&lt;/p&gt;

&lt;p&gt;更に、 button 変数に 実際の Button インスタンスを Bind をする際に、毎回 findViewById 行ないパフォーマンスが落ちてしまわないように自動的にインスタンスをキャッシュする機能も持っています。&lt;/p&gt;

&lt;h1&gt;
  
  
  RecycleView.ViewHolder 内で ViewBinding を使用する場合の問題点
&lt;/h1&gt;

&lt;p&gt;このように、素の Java で Android を開発する場合に発生する &lt;code&gt;findViewById&lt;/code&gt; をすっきりさせてくれる ViewBinding ですが、前節で書いたインスタンスをキャッシュする機能は現状、 &lt;code&gt;Activity&lt;/code&gt;, &lt;code&gt;Fragment&lt;/code&gt;,  &lt;code&gt;View&lt;/code&gt; 内でという制限が付きます。&lt;/p&gt;

&lt;p&gt;つまり、このような 単純な ViewHolder を書いた場合 &lt;code&gt;HogeViewHolder#show()&lt;/code&gt; がコールされる毎に &lt;code&gt;R.layout.hogehoge&lt;/code&gt; 内の ID &lt;code&gt;R.id.title&lt;/code&gt; の View に対して毎回 &lt;code&gt;findViewById&lt;/code&gt; が発生する事になってしまいます。(つまり View のインタンスを保持するという ViewHolder としての機能を果たせていない)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HogeAdapter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;context&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Adapter&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onCreateViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ViewGroup&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;viewType&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ViewHolder 生成&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nc"&gt;HogeViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;LayoutInflater&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;from&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;inflate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;layout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hogehoge&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;parent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onBindViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;position&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ViewHolder 内の View インスタンスに対して表示を要求する&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;holder&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nc"&gt;HogeViewHolder&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;....&lt;/span&gt;

  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="k"&gt;inner&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HogeViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="c1"&gt;// これで R.layou.hogehoge 内の R.id.title という View にアクセスはできるが…&lt;/span&gt;
      &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hoghoge"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  LayoutContainer Support
&lt;/h1&gt;

&lt;p&gt;このように、通常 ViewHolder 内などで &lt;code&gt;Kotlin Android Extenstions&lt;/code&gt; を用いた ViewBinding を行なうと、思わぬ落とし穴が存在しています。&lt;/p&gt;

&lt;p&gt;ここで、もやっとする心を抑え、&lt;code&gt;findViewById&lt;/code&gt; を使って View のインタンスをきちんと保持する事も当然できます。 例えばこんな感じ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;HogeViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;view&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;TextView&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;

  &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;==&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;view&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findViewById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;R&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hoghoge"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ただこれはボイラープレートコードが増えますし、なにより折角 Kotlin Android Extensions を入れているのに、負けた気がします…。そこで登場するのが &lt;a href="https://kotlinlang.org/docs/tutorials/android-plugin.html#layoutcontainer-support" rel="noopener noreferrer"&gt;LayoutContainer Support&lt;/a&gt; です。&lt;/p&gt;

&lt;p&gt;ただし、注意点として、LayoutContainer Support は &lt;strong&gt;Experimental Mode&lt;/strong&gt; となる為、将来的に変更される可能性も十分ある事を考慮しておく必要はあります。(NewsPicksでは、最悪自分が最後責任を持つしという事で採用しています)&lt;/p&gt;

&lt;p&gt;実際に使うためには &lt;strong&gt;Experimental Mode&lt;/strong&gt; である為、 まず &lt;code&gt;build.gradle&lt;/code&gt; に experimentail を ON にする設定を行ないます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;androidExtensions {
    experimental = true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;そうする事で、このようにすっきり ViewHolder を記述する事ができます。&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;iclass&lt;/span&gt; &lt;span class="nc"&gt;HogeViewHodler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;containerView&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;View&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
  &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RecyclerView&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ViewHolder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;containerView&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nc"&gt;LayoutContainer&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

  &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// LayoutContainer を実装する事で ViewBinding がここでも使える　！ そしてきちんと View のキャッシュもされる！ ナイス!&lt;/span&gt;
    &lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"hogehoge"&lt;/span&gt;     
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;今回は長くなってしまう為、実際に Kotlin のコードがどういうバイトコードに変換されているかを調べる方法については記載しませんが、実際に Kotlin から生成されるバイトコードをデコンパイルする事で、findViewByid 部分がきちんとキャッシュされるようになっている事が確認できると思います。&lt;/p&gt;

&lt;h1&gt;
  
  
  最後に
&lt;/h1&gt;

&lt;p&gt;NewsPicks では、 Android を一緒に開発してもらえるメンバーを募集しています。 NewsPicks、 NewsPicks アカデミア 共に大きく成長しているフェーズの為、自分の関わったアプリが多くのユーザー様に使っていただけるという醍醐味を感じる事ができると思っています。&lt;/p&gt;

&lt;p&gt;また、特に NewsPicks アプリについてはリリースして時間も経過している為、内部のアーキテクチャについて、より今後の事業の成長を阻害しないものへ改善していく必要があると感じています。 Android のアーキテクチャをこうしていきたい! という意思を持っている方も大歓迎です。&lt;/p&gt;

&lt;p&gt;自分の腕を磨きたい! アプリだけでなくサーバサイドも開発していきたい! という方も歓迎しておりますので是非お気軽に&lt;a href="https://www.wantedly.com/companies/newspicks/projects" rel="noopener noreferrer"&gt;ご連絡&lt;/a&gt;ください 😃&lt;/p&gt;

</description>
      <category>android</category>
      <category>kotlin</category>
    </item>
  </channel>
</rss>
