のんびり精進

調べた情報などをおすそ分けできれば。

Flutter で画像を一覧表示するときに注意すること

画像を多く表示する画面が複数あるアプリの開発に今携わっていて、注意点をチーム内でどう共有しようかと考えている間に一つの記事になりそうだと思ったので書くことにしました。 大量読み込みが起こりやすい Flutter で画像を含む一覧を作るのは簡単ですが…

Freezedの代替方法を考える(Immutability編)

前編では、同一性を判定できる機能を Freezed を使わずにクラスに持たせる方法を確認しました。 kabochapo.hateblo.jp 今回は immutability です。 前回は equatable を使うだけでできるという仮定で検証作業ばかりだったのですが、今回はいくつかの方法を試…

Freezedの代替方法を考える(同一性判定編)

以前に考えていたときに試したコードなどが発掘されたので記事にすることにしました。 まず Freezed について pub.dev 用途 Freezed は Dart のクラスの自作しにくい機能を自動生成によって楽に実現できるパッケージで、様々な機能があります。 同一性(Equa…

Cloud Firestoreを用いてリアルタイムチャットに挑戦

モバイルアプリのクライアント側では何度も利用経験があり、タイトルの「初挑戦」は設計面のことです。 関連記事: kabochapo.hateblo.jp 昨年末に上記教材(公式の動画やドキュメント)で学び、年明けに初めて設計から取り組みました。 Vue.js の動画に出て…

Firebaseの学習教材(Cloud Firestoreなど)

学習開始の経緯 フリーランスの仕事で大きなアプリの設計をすることになりました。 バックエンドには慣れた技術を使って良いと言われているので、もし何も気にしなくて良ければデータベースには RDB を使いたいところです。 しかし同社からいただくお仕事は…

例外(Exception)って扱いにくくない?

例外の長い歴史の中で既に語りつくされている気がしますが、既存の情報をあまり見ていないのでわかりません。 記事のカテゴリとして Dart を含めていますが、例外を持つ様々な言語で共通するところがあると思います。 経験など 昨年まで業務で PHP、JavaScri…

【Flutter】LicensePageのテキストのスタイリング

アプリでは、使っているフレームワーク、ライブラリ、パッケージ等のライセンスを表示する必要がありますね。 Flutter では LicensePage という widget を使うだけで表示することができます。 しかも Flutter 1.20 で 刷新 されて見やすくなりました。 とこ…

Goのスライスの性質を再確認

Go

下記のようなコードが期待通りの結果にならないというのを先日 Twitter で見ました。 そのツイートのままではありませんが似たコードです。 問題のコード func main() { s := []string{"0", "1", "2", "3", "4"} fmt.Println(s) // [0 1 2 3 4] s2 := append…

Goでスライスの中身を消す方法

Go

モバイルアプリのサーバ側を Go で書いていて、スライスをクリアしたい箇所が出てきました。 Go をちょっと使ってはしばらく使わなくなる間に記憶が抜け落ち、スライスの使い方については公式 Wiki の SliceTricks を毎回参照しますが、なぜかクリアする方法…

Dart/FlutterのローカルDBの比較

モバイル以外にも対応したローカル DB を使いたかったので、複数のパッケージを調べてみました。 Hive を特に詳しく調べたため、そこだけ情報量が多めです。 2022年12月補足(結論) 記事を書いたときは Isar に注目していましたが、現在は Drift に落ち着き…

学習やアウトプット等活動の記録(随時更新 → 終了)

活動した実感があまりないので、記録して振り返る。 短時間でやったことでも「勉強したな」と思えたものは記録。 時間をかけても身についた実感がないものは記録外。 学習時に使ったツールは思い出し用に記録。 コントリビューションは Issue を立てるだけで…

.protoファイルのアップデートにおける注意点まとめ(protobuf)

Protocol Buffers には様々な用途があるようですが、個人的には gRPC での利用を考えています。 昨年末には Go や Dart/Flutter で gRPC を扱う方法を調べ、使っていけそうだと感じました。 そのときに記事にまとめて Qiita へ投稿しましたので、興味のある…

こんなデータベース用ライブラリを誰か作ってほしい(Go)

Go DB

Go2 Advent Calendar 2019 の 6 日目の記事です。 Go の database/sql って使いにくくないでしょうか。 二年ちょっと前にもっと楽にできないかなと思って調べました。 欲しかったもの database/sql を使いやすくしたもの ORM は要らない ただし、SELECT と I…

Dart/Flutterでドメイン駆動設計(DDD)してみた - 実装編

前編である「導入編」の続きです。 まずそちらをざっと一読されることをお勧めします。 kabochapo.hateblo.jp ソースコードは本記事投稿後にたびたび改変しており、記事内容との相違があります。ご了承ください。 github.com 作るアプリについて(ご注意) F…

Dart/Flutterでドメイン駆動設計(DDD)してみた - 導入編

カテゴリ別にメモを管理できるアプリの開発を DDD(Domain-driven design)でやってみたものです。 github.com 二つの記事から成り、この記事はその一つ目です。 導入編(本記事) 解決しようとした問題点や、DDD と関連用語の意味の他、モデリング・レイヤ…

【Dart】シンプルに派生クラスを作る(別名の代わり)

クラスに別名を付けることができれば後述の問題が解決するのですが、今のところできないため、代わりに 元のクラスと機能は同じままで継承するシンプルな方法がないか調べてまとめた記事です。 ※タイトルに「複製」という言葉を使っていましたが、同じものが…

【Flutter】依存オブジェクトの注入

1ヶ月ちょっと前に Flutter の provider というパッケージに関する記事を書きました。 qiita.com そこでは、provider の機能の一つとして「DI の仕組みを提供」と説明しています。 しかし記事を複雑化するのを避けて掘り下げないままにしました。 代わりにこ…

【SQLite/MySQL】グループごとの上位N件ずつを取得

MySQL でグループごとに上位のN件ずつを取得する方法は以前に書きました。 kabochapo.hateblo.jp サーバサイドの MySQL はこれで解決しました。 しかし、スマホアプリ側で似たテーブル構成にしておいて同様のクエリを使いたくてもできません。 そこで、Andro…

【Android / iOS】スマホOSとSQLiteのバージョン対応

スマホアプリ内のデータベースと言えば、SQLite を使うことが多いと思います。 自作のアプリでも SQLite を使っていましたが、非常にシンプルなクエリのみでした。 そのためあまり気にしていなかったのですが、新たなアプリで少し複雑なクエリが必要になって…

【Dart】Mapの順番(HashMap, LinkedHashMap, SplayTreeMap)

様々な言語によくあるハッシュマップでは順番の概念がなく、その一方で、PHP(連想配列)など一部の言語の実装では順番があったりします。 言語を切り替えて開発したりしばらく使わなかったりすると混乱する部分です。 Dart の Map についてはどうなっている…

【MySQL】グループごとの上位N件ずつを取得

Window 関数を使う方法 MySQL 8.0.2 で導入された Window 関数をまず使ってみます。 参考にしたのは次のページです。 「ROW_NUMBER() - Oracle, SQL Server and PostgreSQL」と書かれているので MySQL 以外でも共通で使えるはずです。 www.sqlines.com SELEC…

【Dart/Flutter】静的解析の強化と注意

静的解析の機能は Dart や Flutter のツールに組み込まれていて、IDE でもプラグインで提供されていますが、そのまま使っても足りないことがわかりました。 例えば、const を付けるのが望ましい箇所であっても Android Studio や VS Code は教えてくれません…

【Go】GoLandとVS Codeでinterfaceの定義や実装に飛ぶ方法

Go

interface の実装を見たいときや、逆に定義を見たいときがありますが、簡単にジャンプできると便利ですね。 実装へジャンプ GoLand 定義(interface 自体やメソッドの定義)にカーソルがある状態で次のいずれかの操作をします。 Ctrl + Alt + B Alt + Enter …

【MySQL】NOT EXISTSのサブクエリでOR条件を指定すると遅い

3年以上前に Twitter にメモ的に書いたものなのですが、忘れたときに遡って探し出すのが大変なのでこちらに再メモ。 SELECT * FROM tb1 WHERE NOT EXISTS ( SELECT * FROM tb2 WHERE tb2.col1 = tb1.col OR tb2.col2 = tb1.col ); くっそ遅くて、実行計画を…

【Flutter】SliverAppBarとTabBarを組み合わせたときに各タブのスクロール位置を保持したい

Flutterでは伸び縮みするApp Barを使うのも簡単に実装できます。 でも、タブを表示して中にListViewなどを表示すると、各タブ内のスクロール位置が連動してしまいました…。 例えば、1つ目のタブのリストでスクロールして2つ目のタブに切り替えると、そのタブ…

【Go】gorp でプレースホルダを使う

Go DB

テーブルは前回の記事のものを引き続き使用することにします。 kabochapo.hateblo.jp 値を SQL 文中に直書き rows, err := dbmap.Select(User{}, `SELECT id, name FROM user WHERE id IN (1, 3)`) プレースホルダ rows, err := dbmap.Select(User{}, `SELEC…

【Go】gorp を使って DB 操作を少し楽にする

Go DB

github.com gorp の気に入ったところ ORM は便利ですが、私は SQL 文を書いてパフォーマンスを調整したいので、ORM のためのパッケージだと自分の使い方に合いません。 その点で gorp は合格でした。 "an ORM-ish library" とのことで、がっつり ORM ではな…