取得に失敗しました

2020年度 入部

GitHub

オキリョウ

目指せ All Kotlin Application

自己紹介

プログラミング系統を主にしています。メイン言語はKotlinです。
現在の目標は全部Kotlinで書かれたサイトを作ることです。

将棋、刀鑑賞、ラジコン飛行機などもやってます。

何か聞きたいことがある人は入部して探すか、以下のアプリの「開発元」の欄にあるメールアドレスにメッセージを送ってください。
https://play.google.com/store/apps/details?id=com.wsr.shopping_friend

自己紹介画像

取得に失敗しました

この人が書いた記事

プログラミング Polygon
プログラミング

Ktorを知る ~Pipeline編~

こんにちは、オキリョウと申します! 前回、Ktorの特徴について解説させていただきました。(https://oucrc.net/articles/ia_sv-bbmz) そこで今回はKtorで重要な概念であるPipelineについて解説していきたいと思います。 PipelineとはPipelineとは、Ktorにおいて処理を順序良く処理していくためのものです。 ライフサイクルを定義するためのもの、みたいな感じに考えていただけてたらと思います。 前回、Ktorには以下の特徴があるといいました。拡張性が高く、柔軟非同期処理に強いこれらはPipelineを導入することで実現しています。 Ktor内では、継承可能なクラスとして定義されており、そこらじゅうで使われています。Ktor内のクラスの継承元をたどっていくと一枚嚙んでいた・・・ということも珍しくありません。 それではより詳しく見ていきましょう。 Pipelineを図で表すと以下のようになります。 この画像の場合、オレンジ色の向きへと処理が流れていきます。 つまりフェーズ(Phase)1->フェーズ2->フェーズ3->フェーズ4の順番に処理が流れていくということです。 各フェーズ同士は依存していません。しかし、共有する必要のある値ももちろん存在します。 それらはPipelineが所有しているPipelineContextに保存しておき、そこから値を取り出す仕組みになっています。 また、フェーズは好きなところに付け足すことも可能です。 このように、左から右へと、それぞれ独立したフェーズを処理していく流れがPipelineです。 Pipelineの使用例では、Pipelineがどのように使われているのか見てみましょう。 例えば、サーバーサイドアプリケーションの中でも必須である、「リクエストを受けとってリスポンスを返す」という部分はPipelineで実装されています。(ApplicationCallPipelineという名前のクラスです) このオレンジ色の矢印がApplicationCallPipelineです。 こんな感じに差し込まれています。 リクエストを受けとって、そこから各フェーズを実行してリスポンスを作成、返すという感じです。 ではより具体的に見ていきましょう。 このような感じになっています。 左から順番にSetup -> Monitoring -> Features -> Call -> Fallbackの順番に処理が流れています。これら青い部分がフェーズですね。 これらのフェーズの役割は以下の通りです Setup: callやattributesを用意する Monitoring: callを追跡するための部分で、ログやコードの評価を行う、エラーハンドリングなどに使われる Feature: 大体のFeatureが入るところ Call: callを完全に作りきるために利用するところ Fallback: ハンドリングされていないcallを何らかの形で処理する部分 補足call:ApplicationCallの事。リスポンスであったりattributesであったりを管理している attributes:DIコンテナ(多分、詳しく知りたい人は公式をチェック) Feature:Ktorの追加機能の事。後述 それぞれのフェーズを順に通していく中で徐々にリスポンスを作成しています。 この流れがPipelineです。 ちなみにRouting等もPipelineを使用しています。 ではPipelineについてある程度説明したところで拡張性が高く、柔軟非同期処理に強いを実現している方法について説明していきたいと思います。 拡張性が高く柔軟Pipelineはそれぞれのフェーズを定められた順に実行していくことは先ほどまで書いた通りです。 また、これらのフェーズは互いに依存しておらず、好きなところに差し込むことができるということも説明したと思います。 必要なフェーズを差し込んだり、要らないフェーズを抜くことができるということは、必要な処理だけを記述することができるということです。 それに加えて、実はフェーズの間に処理を入れることも可能です。(intercept) 先ほどちらっと登場したFeatureというのは、このような処理を練りこんだライブラリといえます。 そのようにすることで、本来複雑になるはずのライブラリの作成、導入が非常にシンプルにできるわけです。 せっかくですので、リスポンスのヘッダーに現在時刻を付ける、というFeatureを定義、導入したコードを掲載します。 まずは現在時刻を付けるFeatureの定義からpackage com.example import io.ktor.application.* import io.ktor.response.* import io.ktor.util.* import io.ktor.util.pipeline.* import java.time.LocalDateTime class SendTimeHeader(configuration: Configuration) { private val name = configuration.headerName //設定 //この場合、ヘッダーのkeyの部分を設定できるようにする class Configuration{ var headerName: String = "Send-Time" } //差し込まれる処理 private fun intercept(context: PipelineContext<Unit, ApplicationCall>){ //設定された値と、現在時刻をheaderにセット context.call.response.header(name, LocalDateTime.now()) } //アプリケーション実行時に行われる処理 companion object Feature : ApplicationFeature<ApplicationCallPipeline, Configuration, SendTimeHeader>{ //Attributeを設定 override val key: AttributeKey<SendTimeHeader> = AttributeKey("SendTimeHeader") //install時の処理 override fun install(pipeline: ApplicationCallPipeline, configure: Configuration.() -> Unit): SendTimeHeader { val configuration = Configuration().apply(configure) //インスタンスの作成 val feature = SendTimeHeader(configuration) //ApplicationCallPipelineのCallというフェーズに以下の処理を入れる pipeline.intercept(ApplicationCallPipeline.Call){ //先ほど定義した、interceptの処理 feature.intercept(this) } return feature } } } こんな感じです。 非常に見づらくなってしまい申し訳ないですが、雰囲気は理解できたかと思います。 実装の流れはそのうち別の記事で説明すると思います。 ちなみに今回の場合は、ApplicationCallPipeline↓ のCallのところにこちらの処理が入ります。 それでは利用するときのコードも掲載します package com.example import io.ktor.application.* import io.ktor.response.* import io.ktor.routing.* import io.ktor.util.* import io.ktor.util.pipeline.* import kotlinx.coroutines.launch fun main(args: Array<String>) = io.ktor.server.netty.EngineMain.main(args) fun Application.main(){ //先ほどのFeatureの導入 install(SendTimeHeader){ headerName = "Time" } routing { //ホームルートにアクセスしたときに「Hello World」を返す get("/"){ call.respondText("Hello World") } } } これだけですね。 installのところでFeatureを指定(必要ならば設定も行う)するだけで、すべてのルートにて、現在時刻が追加で刻まれたヘッダーが返却されます。 一見複雑に見えるかもしれませんが、普段は利用するだけ、つまり下側だけですので非常にシンプルです。 上側の方も、やっていることはそこまで複雑ではなく、他のフレームワークで同じことをすることを考えたらはるかに簡単だと思います。 他にも認証機能やログを取る機能もこんな感じで簡単に導入できます。 このように、簡単にいろいろなライブラリを導入したり、作成したりすることができます。 ですので、自分が好きなライブラリで固めることも可能ですし、かなり規模の大きいアプリケーションを作成することも全然可能です。 これもPipelineだからできることです。 非同期処理に強い前回、KtorではCoroutineというものを使い倒しており、そのために非同期処理に強いという話を書きました。 Pipelineもこの流れを強く受けています。というのも、PipelineContextはCoroutine Scopeを継承しており、Coroutine Scopeとして扱うことができるためです。 例えばrouting { //ホームルートにアクセスしたときに「Hello World」を返す get("/"){ launch{ TODO("Coroutineを起動") } } } という感じで、さらっとCoroutine builderを呼び出すことができます。 get()関数は引数としてPipelineContextを取るからですね。 このように、わざわざCoroutine Scopeを定義する必要もないため、気軽に非同期処理を書くことができます。 また、非同期処理が強い理由としてProceed関数およびProceedWith関数の存在もあります。 ややこしい説明になりますが、この関数を実行したインターセプター(フェーズの間に入れる処理群の事)の処理は後回しにされます。 なんの役に立つのかと思うかもしれませんが、意外と使えます。 例えばかなり重たい処理があったとします。その時はPipelineと違うCoroutineを立ち上げて、その後Proceed関数を実行します。 本来だとCoroutineを立ち上げた場合は、そのCoroutineの処理が終わるまで待機しないといけないため、Coroutineの処理が長ければ長いほどレスポンスが遅くなります。 しかし、後回しにすることで、かなり重たい処理とほかの処理を並列に実行することができます。 重たい処理の完了を待つことなく別の処理を進めることができるため、早く処理を終わらすことができるというわけです。 このようにPipelineを用いることで、非同期処理を簡単に、しかし効果的に書き上げることができるのです。 他にもPipelineではCoroutineを生かして処理の効率化を図っていますが、ここでは省略しています。 まとめいかがだったでしょうか?ちょっと説明が難しくなってしまい、申し訳ございません。 ただ、このフレームワークはかなり面白いので、実際に組んでみる価値は大いにあります。 また、公式がより分かりやすく説明してくれています(英語ですが) ぜひそちらの方にも目を通してみてください! あと、ここまでの説明は公式の解説と、コードを読んでみた結果から書いています。 何かしら間違っていたら申し訳ございません。

> 内容を見る

プログラミング Polygon
プログラミング

Ktorを知る ~基礎編~

こんにちは、オキリョウと申します! 先日、Ktor等Webアプリケーションフレームワークを使ってみたのですが、結構気に入りました。そこで、せっかくなのでKtorについて記事にすることで、より深く理解していきたいと思い、書くことにしました。 KtorとはKtorはKotlinで書かれた、かなり新しいWebアプリケーションフレームワークです(2018年にバージョン1.0を発表)。オープンソースとしてJetbrains社が中心となって開発しています。 ↑ Ktorのロゴです。少し怖い 公式によるとKtorの目標は the goal of Ktor is to provide an end-to-end multiplatform application framework for connected applications.  ということらしいです。つまりサーバーからクライアント、windowsからiosにいたる全部の環境で動くフレームワークを目指しているようです。欲張りですね。 コードは以下のようになっています。これは Hello World を出力するプログラムですね package com.example import io.ktor.application.* import io.ktor.response.* import io.ktor.routing.* fun main(args: Array<String>) = io.ktor.server.netty.EngineMain.main(args) fun Application.main(){ routing { get("/"){ call.respondText("Hello World!") } } } こんな感じの雰囲気です。 Ktorの主な特徴は以下の通りです。とにかく軽い拡張性が高く、柔軟非同期処理に強いどこでも動く 一つずつ見ていきましょう。 とにかく軽いKtorはとにかく軽いです。というのも、何も実装されていないところから開発できるからです。 Webフレームワークといえば、SpringやDjango, Laravelなどがあると思います。これらのフレームワークは、認証機能やシリアライザー、ORMなどの必要な機能がデフォルトで搭載されています。逆にKtorは何も搭載されていません。その代わりに、必要なものだけ書いて使用することができます。そのようにすることで、かなり軽いフレームワークとなっています。 拡張性が高く、柔軟先ほど、必要なものだけを使用することができると書きました。逆に言えば、Ktorは必要なものをどんどん取り込む機能が充実しているとも言えます。例えば、テンプレートエンジン「FreeMarker」を使いたい場合、以下のように書けばOKです。 install(FreeMarker) { templateLoader = ClassTemplateLoader(this::class.java.classLoader, "templates") outputFormat = HTMLOutputFormat.INSTANCE } もちろんですが、他のテンプレートエンジンを選ぶこともできます。 ちなみに自分でこのようなプラグインを書くことも全然可能です。 このように、Ktorでは好きなように拡張できますし、使いたいものを使うことができます。 非同期処理に強いKtorは非同期処理に強いです。どれほど強いかというと、公式が出しているチュートリアルの中に、チャットアプリを作成するというものがあるくらいです。 というのも、Ktorは、Kotlinのライブラリの一つである「Coroutine」をものすごく使っています。 ここではCoroutineの詳しい説明は省きます(それだけで記事ができるくらいややこしい)が、このCoroutineを使うことで非同期処理に相当強くなっています。 どこでも動くKtorの目標として、マルチプラットフォーム上で動くというものがありました。 現在も開発中ということですが、公式によると、今のところサーバーサイドはJVM、クライエントサイドはJVM、JavaScript、IOS、Androidで動くようです。ですので、ほとんどの環境で動きます。 Kotlin自体がどこでも動くので、Kotlin一つでWeb系を制覇できる日が来るかもしれませんね。 ちなみに公式では書いていませんが、Android上でもサーバーを立てることが可能です。 https://qiita.com/oxsoft/items/aec71882b1b21930c953 何に使うのかといわれるとアレですが・・・ まとめKtorについていろいろ書いてきました。このように魅力があふれかえるフレームワークとなっています。 唯一欠点があるとすればドキュメントがそこまで多くないことでしょうか。できてから数年しかたってないので仕方がない部分ではあります。 といっても公式を見ておけば大体何とでもなります。 実際書くこと自体はそこまで難しくないので一度挑戦してみるのもありだと思います。

> 内容を見る

プログラミング Polygon
プログラミング

2. 一からアンドロイド開発をして思った、知っておくべきこと~ViewBinding編~

こんにちは、オキリョウと申します! このシリーズでは私が初めてAndroidアプリ(下のURLのやつ)を作成した時に「最初から知っておきたかったな・・・」と感じたことを書いていきたいと思います。   是非見ていってください↓↓↓ https://play.google.com/store/apps/details?id=com.wsr.shopping_friend 今回紹介するのは「ViewBinding」です。  どういう内容?Androidのコードを書いていると、Viewを操作したり、Event発生時の処理を書いたりしたくなる時が多々あります。 例えば、画面上にあるボタンを押したらメッセージが出てくる、といった実装をするときです。そのような時、どういう風に書くのかというのが今回の議題です。  1.findViewByIdまず、古い記事などでよくみられるのがfindViewByIdです。val button = findViewById<Button>(R.id.button) button.setOnClickListener {     //処理を書く }このように書くことで自分の指定したid(この場合だとbutton)のボタンが押されたときの処理を書くことが出来るようになります。 ただ、このfindViewByIdはいくつか問題を抱えていました。コードが複雑になったり、返り値がnullableだったり… 幸いにも私はfindViewByIdを利用するのはあまりよろしくないという記事を発見したので無事回避することが出来ました。  2.Kotlin Android Extensions次に考えられるのがKotlin Android Extensionsを使った方法です。 こちらはGradleファイルに記述を加える事で使えるようになるものです。これを使うことで、先ほどのコードは以下のように書くことが出来ます。button.setOnClickListener {    //処理を書く }findViewByIdというのが無くなってますね。 これは、プログラム側が勝手にfindViewByIdをしてくれ、id名と同じ名前の変数に代入してくれているからです。 これによりfindViewByIdよりも簡潔に書けるようになりました。ついでにfindViewByIdが持っていた「型安全ではない」という問題も解決してくれています。 これだけ聞くとかなり優秀そうです。実際にKotlin Android Extensionsを使っていたり、称賛している記事も多くありました。 そこで私のアプリにも導入して、コーディングしていました。   しかし、この2020年11月24日にサポートが終了してしまいました。 というのも、Kotlin Android Extensions自体もまた問題をいくつか抱えていたからです。 まずKotlinでしか動かないことです。そりゃあ、KotlinのExtensionsなんだから当たり前の話です。しかし、古くからあったアプリとかがJavaで組まれていることを考えると無視できない問題であることが分かります。 次にnullableであることです。つまり、findViewByIdが抱えていた問題が解決できていないということです。 そして、コードが汚くなるということです。 Kotlin Android ExtensionsではXMLで定義されたidと全く同じ名前の変数にいろいろ準備してくれます。 しかし、そもそもXMLはスネークケース(kotlin_is_best)、Kotlinではキャメルケース(kotlinIsBest)と命名規則が違います。したがってKotlinのコードに本来あるべきではないスネークケースが紛れ込むことになります。 これらの理由からサポートが終了してしまったとのことです。  3.ViewBindingそしてこれらの問題をほぼ全部解決するのがViewBindingとなります。 このViewBindingがどういうものなのかを書くと長くなってしまうので省略しますが、導入することにデメリットはないという人もいるくらいのものです。必ず導入してあげましょう。 参考URL: https://developer.android.com/topic/libraries/view-binding?hl=ja   ちなみに私のアプリは現在懸命にKotlin Android Extensionsから移行している最中です…皆さんも気を付けましょう。

> 内容を見る

プログラミング Polygon
プログラミング

1. 一からアンドロイド開発をして思った、知っておくべきこと~Fragment編~

こんにちは、オキリョウと申します! このシリーズでは私が初めてAndroidアプリ(下のURLのやつ)を作成した時に「最初から知っておきたかったな・・・」と感じたことを書いていきたいと思います。   是非見ていってください↓↓↓ https://play.google.com/store/apps/details?id=com.wsr.shopping_friend 今回紹介するのは「Fragment」です。  ActivityとはFragmentが何なのかを紹介する前に、まずActivityについて書きたいと思います。 このActivityというのは、Androidのアプリにてメインで動く部分です おそらくAndroidの入門記事を読むと、MainActivityというファイルにコードを書いていると思います。このMainActivityというのがActivityの一種です。   まだまだひよっこだった私は様々な入門記事を読み漁りました。そういった入門記事のほとんどはそこまで複雑なことをしないものですからMainActivityにコードを書いています。 それを見た私は「Activityに全部書くんだな」と勝手に思い、全部書き込んでしまいました。 全部書いてしまうことの欠点実は全部の処理をActivityに書くのはそこまでいいわけではありません。Activityに書いてしまうと使いまわしが出来なくなるからです。下の画像を見てみてください。 こちらは実際に作ったAndroidアプリとなります。 左の画面にあるボタンをクリックすると右の画面に遷移するのですが、共通部分がありますね。写真には撮りませんでしたが、一番下の空白、そこも広告が入るので共通部分となります。 これらを全てActivityで書いてしまうと、画面遷移前と画面遷移後、どちらのプログラムコードにもこれらの記述を書く必要があり、非常に面倒です。 面倒なだけならいいですが、実装できなくなる例もあります。例えばBottom Navigation Barを実装するときにActivityに全部書くと、Googleが用意してくれているやつが使えなくなるので血の涙を流すことになります。 Fragment君 Activityに全部書くのは非効率で、使えるものも制限されてしまうことが分かったと思います。 ではどのようにすればいいのでしょうか? ここで冒頭のFragmentが登場します。Fragmentとはその名の通り、パーツを指します。Acitivityというメイン画面に使えるパーツというわけですね。 このFragment、何と簡単に差し替えることが出来ます。 AcitivityにFragmentを置く場所を置いておけば、あとは変え放題です。 つまり、共通部分はActivityに、違う部分はFragmentにおいてやれば再利用が出来ます。 もっと言えば、Fragmentは差し替えるものということで設計されているので、簡単にわかりやすく変えることが出来ます。 詳しくはNavigationで検索しましょう。一応参考URLも貼っておきます https://qiita.com/tktktks10/items/7df56b4795d907a4cd31 まとめFragmentを実装すること自体はたいして難しいものではありません。調べればある程度の資料は出てくると思います。ですので、しっかり調べて、どのような時にFragmentを使うのかなど知っておくのがベストだと思います。 ちなみに私はFragmentについて知った後、アプリをごっそり書き換えました…皆さんも気を付けましょう。

> 内容を見る

プログラミング Polygon
プログラミング

後編:Kotlinの批評をしてみた~不満編~

こんにちは、オキリョウと申します! 前回の記事ではKotlinを学習するメリットについて書かせていただきました。 しかし、メリットばっかり書くのはあまりよろしくないように感じます。 そこで今回は、私がKotlinを学ぶ上で感じた不満等について書いていきたいと思います。 *前回の記事も合わせて読まないと偏った考え方を持ってしまう可能性があります。気をつけてください  1.   プログラムを初めて学ぶ人には敷居が高いそもそもKotlinはJavaの後釜となるべく作られた言語です。なので、Kotlinを勉強する人の大半はJavaも勉強したことある人です。 それに伴ってKotlinの入門記事はjava等の他の言語を勉強していることが前提のものが多いです。 実際に前回紹介したKotlin Koansも初めてプログラミングを触る人にとってはかなり難易度の高いものとなっています。 実際に私も最初にKoansをやって挫折しかけました。 もしKotlinから学びたいという人はAndroidの入門記事などで勉強したほうがいいかもしれません。また、Kotlinを知っている人に聞いて回るのも手だと思います。  2.   新しすぎるKotlinは2011年にできた言語です。しかし、実際に注目を浴びたのは、googleがKotlinをandroid用の言語として正式に採用した2017年です。ですので、Android開発に関しては実質3年分の情報しかありません。 そのため、Androidのアプリを組む際には、Javaで書かれたコードを参照することもよくあります。 Androidはましな方です。 例えばデスクトップ用アプリを作る際に使う「Compose for Desktop」は発表されてからまだ半年すら経っていません。完全に情報不足です。 従って、実際に組むときはかなり試行錯誤する必要があります。  3.   気軽にスクリプトを書くことはできないKotlinは静的言語ですので、毎回コンパイルが必要になります。しっかりしたアプリを作るうえでは非常に心強いですが、簡単なスクリプトを書こうとしたときには逆に障害になります。 例えばパソコンの自動化をしたい!となったときです。Pythonだとファイルにコードを数十行も書けば実現可能です。コンパイルとかも必要なく、長くても1時間あれば完成するでしょう。 しかしKotlinでそれをしようとするとそれこそ「Compose for Desktop」を使ってアプリを作ることになると思います。勉強時間等を兼ねて大体1週間くらいかかるでしょう。もちろんクオリティはいいものになるとは思いますが・・・ このように、Kotlinで何かを作るとなると腰を据える必要があります。  まとめKotlinはその性質上、初心者には厳しい言語と言えます。また、比較的新しい言語でまだまだ発展途上です。そのため情報不足なところが多いです。気軽に何でもKotlinで・・・とはいきづらいところがあります。 しかし、それらに目をつぶってもいいような魅力がKotlinにはあります。勉強する価値も十分にあります。皆さんもぜひ、Kotlinを勉強してみてください!そしてもっと情報を増やしてください。

> 内容を見る

プログラミング Polygon
プログラミング

前編:Kotlinの批評をしてみた~メリット編~

こんにちは、オキリョウと申します! 私はプログラミング言語のひとつである「Kotlin」に非常に思い入れがあります。 最初に作ったアプリはKotlinで書きましたし、Qiitaに書いた記事も全部Kotlinが絡んでいます。 そこで、そんなKotlinを2回に分けて布教批評していきたいと思います。何番煎じだという感じですが、自分なりの目線で書くので読んでいってください。   今回はKotlinを勉強するメリットについて書いていきたいと思います。  1.   スマートに書けるKotlinの文法の特徴として簡潔に、分かりやすく書けるというものがあります。以下のコードを見てください。fun main(){    for(i in 1..20){        when{            i % 15 == 0 -> println("FizzBuzz")            i % 3 == 0 -> println("Fizz")            i % 5 == 0 -> println("Buzz")            else -> println(i)        }    } } よくあるFizzBuzz問題の回答をKotlinで書いてみました。どうですか?簡潔で美しく感じませんか?   このコードも見てくださいfun match(data1: String, data2:String?): String{     data2?.let{ it ->         return if(data1 == it){             "Match"         }else{             "Not Match"         }     }     return "data2 is null" }こちらは2つのデータが同じかどうかを確認する関数ですね。また、片方の引数はnullableです。 そもそもKotlinはnull安全を採用しているので、いちいちnullかどうかで処理を書く苦労を減らすことが出来ます。また、nullチェックをするときでも2行目のように書いてやればスマートに書けます。 Return文もKotlinならではの書き方です。Kotlinのifはそれ自体が式なので、このように書いてやるだけできっちり処理してくれます。 こんな感じでKotlinを使うことでかなりスマートに書くことが出来ます。他にもスマートに書くための様々な文法があります。ぜひ一度調べてみてください。 ちなみに私はdata classが一番気に入っています。  2.   なんでも書けるKotlinなら何でも書けます。マジで何でも書けます。 KotlinはAndroidアプリしか書けないと考えている人もいるでしょう。しかし、そうではありません。 バックエンドからフロントエンド、デスクトップ用のアプリ、さらにはIOSアプリまで書くことが出来ます。 一つ勉強すれば全部書くことが出来るというのは結構魅了的なことだと思いませんか?  3.   響きがいいこう、Kotlinと言われるとかわいらしい感じがしますよね?それだけで勉強していく価値は十分にあります。 ちなみにKotlinというのはフィンランド語で「やかん」の意味ですので、小鳥とは全く関係ありません。が、公式が用意しているKotlin例題集「Kotlin Koans」は、日本語の「公案」から来ているそうです。親しみがわきますね! ↑昔のロゴ  まとめKotlinを使うことで、スマートなプログラムを簡単に書くことが出来ます。また、Kotlinであればできないことはほぼありません。 ちなみにですが、聞いた話によるとAndroid開発者は人材不足らしいです。つまりKotlinを勉強しておけば就職にも優位に働くかもしれません。 皆さんもKotlinを勉強して素晴らしいプログラミングライフを過ごしましょう!

> 内容を見る