Kentaro Imai

現状報告

先日、ElixirとPhoenixの勉強をしたので、それを元にブログ記事を書いてみたら、なぜか糞みたいな記事ができあがったので、とりあえずお蔵にした。

ブログ記事を書く能力に欠けているのかも。

前の記事から1ヶ月経ったこともあるし、とりあえず現状を書いておく。

まず、なぜブログを書けていないのかというと、毎日毎日、自分の思うほど進捗していないからで、一段落ついた深夜、ブログ書いた方がいいかもって思った時には、もう心身ともに限界な感じで寝てしまっている自分がいるのである。

で、前に書いたけど、僕はノートアプリを作ろうとしていて、今その技術的なピースを揃えている途中なのである。こんな感じ:

フロントエンド

Dart + Flutterを予定している。ただし、CRDTの状況によっては他の選択肢も考慮する必要があるかもしれない。

バックエンド

Elixir + Phoenix予定。ただし、CRDTの状況によっては他の選択肢(JavaScriptで書かれた何らかのウェブフレームワーク)も考慮する必要があるかもしれない。

データベース

PostgreSQLが良い気がするが、CRDTのためにRedisなどのNoSQLを追加で用意しなければいけないかもしれない。(PostgreSQLもRedis等NoSQLも僕は詳しくない)

CRDT

オフライン編集のために何らかの手立てを考えなければいけない。OTよりも最近はCRDTが良いらしく中でもYjsが抜きん出ているらしい、というのが僕の現状認識なのだが、YjsはJavaScriptで書かれているので、ウェブアプリとかElectronアプリならそれでいけるが、スマホアプリを作るとなると中々難しい。

なので、Yjsを他言語(DartとElixir)で実装するのがこのまま突き進んだ場合の未来、なのだが「それ可能なの??」と正直若干怖気づいている。

デプロイ

Kubernetesの勉強を中途半端にしている状態。大丈夫なのか大変心配。

以上が現状なのだが、

あんまり技術的なピースが揃っていないことがよく分かる。

どうしたらいいのか……

誰のために書くのかがあやふやだったので決めた

このブログは始まったばかりだけど、およそ一月に1、2記事程度しか書けていない。これは望ましい頻度でもないし、もっと記事を書けたらなと思いつつも、僕自身は正直上出来だと感じている。

それは小学生の頃、日記を文字通り3日以内に止めてしまったり、読書感想文が数行しか書けなかった僕にとっては、ブログが続いていること自体が驚くべき進歩と感じられるからだ。

これまで数記事を書いて、僕にもブログが書けることは書けるということは分かった。これで別に良いのだが、しかし、一歩先に進めてみたいと思った。

僕の書くものなど所詮何の役にも立たない。そもそも興味を持ってもらえるほどの人間でもないし、文章が上手い訳でもない。しかし、極一部の誰かには多少刺さる、または掠るぐらいのものを書いてみたいという欲があるような気がする。

そこで、誰のために書くのかということを明確にしようと思う。インターネットの向こうの誰かに向かってババーンとここに宣言するという意味ではなくて、僕自身に対する宣言というか、戒めというか、何かそういうようなものである。

誰に読まれても良いが、僕としてはそういうつもりで書くということだ。

誰のために書くのか

このブログは将来、自作のアプリなりサービスなりで何らかのどでかいことを成そうと考えている人を想定して書くことにする。

ちなみに僕は、自作のアプリなりサービスなりで何らかのどでかいことを成そうと考えている人であるが、未だ成していない人である。

何事か成してから、当時を振り返って書かれたものも面白いとは思うが、成してない人間が浮かれたりへこたれたり落ち込んだりのたうち回っているものを読む方が僕が好きなので、それを僕も書いてみようという試みである。

実際のところ、何事もなしていないから、結局それしか書けないんだけど。

内容に関しては、たぶんプログラミング関連の話題が多くなる気はするが、それに限定するつもりもない。好き勝手にその時々に書きたいことを書くつもりだ。

ノートアプリのおおまかな設計段階ですでに悩んでいる

先月部屋を片付けた後、Riverpodをさらっと勉強したりしたが、取り立てて面白い話もない。

その後、サーバサイドの勉強をしていた。

作ろうとしているアプリはノートアプリなのでクライアントだけで完結するアプリにしても良いのだが、マルチデバイス対応をするつもりなのでやはりサーバベースで作りたい。この辺りは意見が分かれるところなのかもしれないが……。

もしかすると例えばRealmなどを使って作るのが正解なのかもしれないが、Realmのことはよく分かっていないし、こういうコア部分をプロプライエタリなもので賄うのは怖い。

そういう訳で、サーバサイドを書かねばならない。

問題は、僕がサーバサイドのコードを書いていたのはもう10年以上前ってことで、さすがに勉強をしなおさないといけないだろう。

そこで、当時はRuby on Railsをさわっていたが、もう随分前のことでもあるし、まっさらな気持ちでサーバサイドの技術を選ぶことにした。

とは言っても中々難しい。

  • MVCやその亜種をベースにしたサーバサイドのフレームワークがいろんな言語で出ているが、その中から選ぶなら以前使っていたRailsを選ぶのが一番楽な気がする。

  • 最近はJavaScriptをちょっと書いていたので、そういう意味ではJavaScript/TypeScriptのサーバサイドフレームワークのいずれかを使うのも良いかもしれない。

  • 一方で、実は僕には将来作りたいサービスがあって、それにはElixirPhoenixがフィットする気がしていて、そこに繋げる意味ではElixirPhoenixで作りたい。

で、とりあえず、やって損はないだろうということで、Elixirの勉強をしていたのが最近の話だ。

ただ、今悩んでいることは、ノートの整合性保持で、ここの部分の設計をどうすべきなのか、決めきれないでいる。

例えばウェブアプリであれば、ユーザはおそらくオンラインだし、オフライン編集ができなくてもユーザは納得してくれるだろう。オンラインであれば、おひとり様用ウェブアプリの場合、編集後即サーバにPOST/PUT/PATCH/DELETEすれば整合性の問題はほぼ起こらないだろう。

逆に、スマホアプリの場合、ユーザはオフラインでノート編集できることを期待する。ということは何らかのデータの競合解消ロジックが必要になる。

複数人で編集する場合はもちろん整合性の問題が起きるが、そうでなくても、ひとりが複数のデバイスから編集する場合、コンフリクトが起こる可能性は高い。

この整合性問題を解決するための技術がOT(Operational Transformation:操作変換)とかCRDT(Conflict-free Replicated Data Type)とか呼ばれるもので、この辺の知識が全く足りていない。

この辺の実装はJavaScriptで書かれているものが多い気がするので、もしかするとサーバサイドはそういうライブラリを利用してJavaScriptで書くべきなのかもしれない(折角Elixirの勉強をしていたところではあるが)。

ということで、サーバサイドを何で書くかということすら未だ確定できていないのである。

とりあえず、泥縄ではあるが、今からOTCRDTの勉強をしようと思う。ただ、例えばCRDTと言ってもいろんなやり方が提案されているらしいので、それらの中から自分のアプリに合ったものを選ぶ必要がある。

もし詳しい人がいたら、何らか情報をもらえると嬉しいです。

あと、あんまり大変なようなら、とりあえずは個人使用を想定したノートアプリなのだから、競合解消ロジックなしで一旦リリースしてから考えるということも考えてはいる。

部屋を片付けた話

先月、Flutterの本を読んだ後、部屋を片付けた。

僕はやっぱり生活が苦手な気がする。

大学生だった頃に薄々気付いてはいたのだが、おっさんとなった今も何にも変わっていない。

片付けは苦手だし、そもそもきっちりと間違いなく何かをすることが苦手である。書き間違えずに文字を紙に書くことが苦手だし、数を数えることも苦手だ。出掛ける前に何度も忘れ物に気づいて行ったり来たりするし、出掛けてもしばしば戻って鍵が閉まっているか確認するし、結局忘れ物があったりする。日常生活のほとんどが苦手な気がしている。

本やPCに囲まれて過ごすのが好きな僕は、断捨離やミニマリストが話題になった頃、全く自分に関係ないものと思っていたし、正直なところ今も断捨離という言葉は好きな言葉ではない(僕は物欲肯定派である)が、今回片付けをしているうちに、少しそういうものから学ぶべきなのかもしれないと初めて思った。

自分の大切に思っていることに物もお金も時間も最大限投入するために、その他をできるだけ切り捨てるのだ。生活というものを極限まで自分から取り除くと、生活が苦手であるということの悪影響を最小限に抑えられるかもしれない。

そんなことが頭に浮かんだりした。

でもとりあえずは何もしない。部屋は片付いたのだ。苦手な生活のことは当分考えたくない。

それに、部屋は片付いたがアプリは全くできていない。

今月からはアプリ開発に集中したい。

DartとFlutterを学ぶための技術書について2

1ヶ月ブログを休んでしまった。

何か意味のあることを書こうとした結果、書けなくなった。書いているうちに「これを書いて意味があるのか?」とか考え出すともうだめである。

だから、これからは意味のあることを書かないことにした。

前回、DartとFlutterの技術書を列挙したが、読んでみた結果、以下の3冊が良かった。

Flutter Apprenticeは、最後のプラットフォーム別の部分はまだ読んでいないが、だいたい良かった。

ただ、問題は、画面遷移にはgo_router、状態管理にはprovider、DBライブラリはmoorを使っている点で、go_routerはFlutterに取り込まれたパッケージなのでこれを使っているのは自然なのだが、単純な画面遷移は問題なくても、ネストした複雑なものを作ろうとするとまだ機能が足りていないというようなことをRedditで読んだので、実際の開発に使っていいものか迷っている。ノートアプリの開発にはBeamerAutoRouteを選ぶかもしれない。

providerRiverpodという改善されたものが出ているので、そっちを使いたい。他にも多数状態管理のためのライブラリがあるらしく悩ましいが、とりあえずRiverpodを使ってみようと思う。

moorはAndroidアプリ開発に使うRoomのFlutter版という位置付けらしく、Roomを逆さにしてmoorらしい。あと、すでにパッケージ名が変わっていて、今は後継版のdriftを使うことが推奨されている。

そういう訳で、アプリ開発で骨組みとなるようなところの解説が、微妙に古いライブラリや使わなさそうなライブラリをベースに行われていて、おまけにそれぞれの解説も非常に薄いというか、さらっと書かれてるので、この本をもってFlutterをマスターとは到底言えないというのが、読んでみての正直な感想である。ただまぁ、Flutterのようなまだまだ変更の多いフレームワークの解説書が存在するだけでありがたい訳だし、とりあえずお手本に従ってアプリを組んで感覚をつかむという点では非常に良い本だったと思う。

本を読んだ後何をしていたかということはまた別の記事で。

DartとFlutterを学ぶための技術書について

ノートアプリを開発することに決めたが、まだ開発を始めることができていない。

というのも、アプリを開発するのに使う予定のFlutterを勉強中だからで、これがiOSだけのアプリで良いのなら既にSwiftで書き始めているところだが、今回はそういう訳にはいかない。マルチプラットフォームでアプリを出すためには、そしてそれを個人で短期間でやるとなればFlutterをどうしても使いたいのだ。

ところで僕は、プログラミング関係であるか否かを問わず、何でも本で勉強するのが好きで、いつも(電子ブックではなく)紙の書籍を買ってマーカーを引きながら、たまにメモを書き込みながら読んで勉強している。今回もそのつもりでDartやFlutterの本を買い集めたのだが、正直あまりうまくいっていない。

というのも、FlutterもDartもまだ若く変化が激しいからで、まともに本が出版されていないし、されていてもほとんどの本が既に陳腐化してしまっており内容が現在のFlutterやDartに当てはまらなくなってしまっているのだ。

なので今日のブログは要は泣き言である。2回目にして泣き言とは情けない。

以下の内容は端的に言えば「つらい」ということで、読む価値はありません。ここまで読んでくださってありがとうございました。FlutterやDartの本を探している人は読むと少しは参考になることもあるかもしれません。

さらに勉強を進めた結果、特にFlutterの本に関して下記の評価を改めなければならないと感じつつある。もう少しFlutterについて理解を深めた後に改めて記事を書き直したいが、基本的にはFlutter Apprenticeをおすすめしたい。(2023年3月4日)

書いた(2023年3月30日)→ DartとFlutterを学ぶための技術書について2

購入した書籍[1]

  1. Jonathan Sande, Dart Apprentice: Fundamentals, (Kodeco Inc., 2022)
  2. Jonathan Sande, Dart Apprentice: Beyond the Basics, (Kodeco Inc., 2022)
  3. Chris Buckett, Dart in Action (Manning Publications Co., 2013)
  4. Michael Katz, Kevin David Moore & Vincent Ngo, Flutter Apprentice (Razeware LLC., 2022)
  5. Eric Windmill, Flutter in Action (Manning Publications Co., 2020)

1~3まではDartの本で、4と5はFlutterの本である。また、1,2,4はKodeco(旧raywenderlich)という有料のチュートリアル記事をたくさん出しているサイトの本で、3と5はManningというおそらく最も信頼のおける技術書の出版社のひとつによるものである。

既に1と2の本を読み終えたが、プログラミング初心者向けとしてなら、これらの本は悪くない。説明も適切であり、読んでいて僕が疑問に思ったことはたいていその後に説明があるなど、解説に気配りが感じられ好感が持てた。ただ、残念ながら、すでに他言語で経験のあるプログラマにとって説明は冗長であり、内容も深くない。中身が価格に見合っていない。ともあれ、最新のDartに追従した解説書は貴重であり、そういう意味ではこれぐらいしか選べる本がないとも言える。

3はManningの本だが、やはり古すぎた。買う意味はないと思う。

4は上に述べたようにKodecoのFlutter解説本で、チュートリアル形式で進むが、指示が多く解説は少ない。これは必ずしも悪い訳ではない。スマホアプリを開発したことのない人にとっては手を動かして感覚を掴むことこそが最も大事なことのひとつだからだ。ただ、僕は途中で我慢ができなくなり、読むのを止め、現在、5のFlutter in Action (Manning)を読み進めているところである。

5の本はさすがManningというべきか、解説は非常に良い。しかし、やはり古い。サンプルコードをGitHubのリポジトリから落としたが、Android StudioでGradleのSyncができずに詰まってしまい、詳しくない僕はSyncを諦め、別のディレクトリでflutter createしてから、サンプルコードのlibディレクトリとassetsディレクトリをコピーし、pubspec.yamlを修正することにした。これはうまくいったのだが、サンプルコードがDartにnull安全が入る以前のものであるため、全面的にコードを見直し、修正する必要があった。またRaisedButtonElevatedButtonに、FlatButtonTextButtonに置き換えるなどの修正も必要だった。この修正の過程自体は勉強にもなって悪くない経験だったが、ここまでサンプルコードに修正が必要だと他人に薦めづらいと感じた。ただ、SwiftやKotlinなどのnull安全の概念が入った言語を使ったことがあるのなら、サンプルコードの修正はそれほど難しくないと思う。

まだFlutterの全体を把握しきれていない今の時点での感想だが、

Kodecoの本は3冊とも、プログラミング初心者を対象としているかのような丁寧さで、おそらくプログラムを一度も組んだことのない人がいっちょFlutterで一発当ててやるかと思った際には、一番フィットする本だと思う。

Kodecoの本の内容は大雑把に言えば、Big Nerd RanchのiOSアプリやAndroidアプリ開発の本に似ている。Big Nerd Ranchの本が好きなら、(価格は高く、クオリティもBNRの本に比べると見劣りしてしまう気がするが、)もしかすると気に入るかもしれない。

サンプルコードの修正の手間を分かった上でなら、5のFlutter in Action (Manning, 2020年1月出版)を買っても良いかもしれない。 だが、一般的には、FlutterやDartの本はnull安全が入った2020年夏以降のものを選ぶのが無難だと思う。

実は昨年末にO'ReillyからFlutter & Dart Cookbookという本が出ている。Cookbookだからまぁいいかと買わなかったが、もしかするとこの本を買うのが正解だったのかもしれない……とちょっと後悔をしている。

ただ、もう本はいい。

数万円を溶かして得たやや心許ない知識を元に、その都度必要な知識を吸収しつつアプリ開発を進めていこうと思う。


  1. Amazonへのリンクにしたが、これは今のところAmazonにレビューが一番集まっていることが多いからで、洋書を買うのに必ずしもAmazonをおすすめしない。ただし、Kodecoの本に関してはAmazonによるオンデマンド印刷なので、Amazonで買うのが一番きれいに届くと思う。 ↩︎

新しいプロジェクト

ここ数年まともなアウトプットができていない。んだけど、今日はそれについて書くのはやめておく。

これからのことを書く。

新しいアプリを作ろうと思っている。何を作るのか迷ったが、ノートアプリを作ろうと思う。

なぜノートアプリみたいなものを作るのか?その辺のことを書き始めると長くなりそうなので、これについても今日はやめておく。とにかく僕なりにいろいろと考えた末にそういうことになった。

ただ、ひとつだけ書いておくと、既存のノートアプリのクローンを作るつもりはないし、似たようなものも作るつもりはない。僕自身がしっくりくるノートアプリを見つけられないので、自作する、そういう話だ。

どんなノートアプリを作ろうと考えているのかは追々書いていきたい。

で、僕としてはノートアプリはスマホからもPCからも使いたい。マルチプラットフォーム対応していてほしい。だから、そうするつもりでいる。ただ、まずはiPhone版とAndroid版を先に開発するつもりでいる。

何を使って作るか迷ったが、Flutterを使おうと思っている。今まで使ったことはないし、Dartも年が明けてから勉強を始めたばかりだが、何とかなるような気がしている。なかなか使いやすそうな言語だと(今のところは)感じている。

実は、去年まで数年間ネイティブでアプリを書くことしか考えていなかった。Kotlinはあまりさわっていないが、Swiftのコードは書いていた。が、結局ろくなアウトプットをしないまま、Swiftをほぼ書かなくなりそうだ。

いろいろと技術的に足りていないことがあるけれど、勉強しながら作ろうと思う。

これから開発日記のようなものを書くつもりでいる。読みたいと思う人がいるのかはわからないけれど。