【SwiftUI】複数のScrollViewを同期させる

実装するもの

SwiftUIのScrollViewは、コンテンツのオフセット量(スクロール量)を指定することができないため、上記のような、スクロールが連動するようなUIを実装できませんでした。

そこで、UIScrollViewを使用することで、目的の実装が可能でした。

実装イメージ

  • UIViewController:UIScrollViewの親View。レイアウト周りの処理も実行
  • UIScrollView:スクロール可能にする
  • UIStackView:スクロール可能な方向を決定する(これがないと、スクロールが引っ掛かるような挙動になる)
  • UIHostingController:SwiftUIのViewを表示するためのView

最終的には、UIViewControllerRepresentableを経由させて、UIViewControllerをSwiftUI側から呼び出します。この際に、ScrollViewのコンテンツになるViewを引数として渡します。

最終的なソースコードのリンクを添付します。 I created Sync ScrollableView in SwiftUI · GitHub

また、このScrollViewを使って、スクロール時にヘッダーを固定できる表のUIを作成しました(元々このために作った) 上記のリンクに、サンプルコードを載せています。

参考記事

Haskell勉強メモ(6〜最終章)

メモ

関数

  • 関数は引数を変換して、値を返す
  • 関数は1文字で置き換えられていると意味がとりずらい

型クラス

  • 型クラスは振る舞い(関数)を定義する(Kotlinのinterfaceのようなもの)
  • instanceは、型クラスの振る舞いを満たすもの

Functor、Applicative Functor、Monad

  • Functor、Applicative Functor、Monadは文脈を保つ(伝搬する)型クラス

参考にさせていただいた記事

まとめ

感想

  • いままで触れてこなかった、再帰的な処理を学ぶことができて良い経験になった
  • Functor、Applicative Functor、Monadといった新しい概念に触れることがとても楽しかった

今後

  • 文脈を保ったまま、関数を適用したいといったシチュエーションに今後直面した時、Haskellで学んだMonad的な実装を試してみたい
  • 今後は、Haskellで何かを作ってみたり、KotlinでFunctional Programmingを意識したコーディングをしてみたい
  • 関数型プログラミングを身につけ、副作用の少ないテストしやすいコードを書きたい

Haskell勉強メモ(1〜5章)

勉強資料

https://www.amazon.co.jp/%E3%81%99%E3%81%94%E3%81%84Haskell%E3%81%9F%E3%81%AE%E3%81%97%E3%81%8F%E5%AD%A6%E3%81%BC%E3%81%86-Miran-Lipova%C4%8Da/dp/4274068854/ref=pd_bxgy_thbs_d_sccl_1/358-4542030-9939648?pd_rd_w=e1lAt&content-id=amzn1.sym.a6ef8710-f9e8-4ae9-bcba-322dc294eed3&pf_rd_p=a6ef8710-f9e8-4ae9-bcba-322dc294eed3&pf_rd_r=WYSBXNSEZVEQJF0N98QK&pd_rd_wg=YL1K8&pd_rd_r=a0d15423-627d-46e4-beea-5cbf7448dba9&pd_rd_i=4274068854&psc=1

文法について

  • 数学の記法に似ている
  • 変数を"束縛する"という考え方が強い
  • 配列を1つの集合と見る感覚
  • 関数は全て1引数の関数(カリー化関数)に分解されていて、どこで区切るかが自由
  • 関数は、関数名 引数 = 戻り値

再帰関数のコツ

  1. 基底部(例外的なもの)を考える
  2. 繰り返される処理を実行し、自身を呼び出す

カリー化と部分適用

  • カリー化
    • 多引数の関数を1引数の関数に変換すること
  • 部分適用

    • 多引数の関数にいくつか引数を与えて、部分的に引数を適用すること(関数を束縛している)
  • シグネチャによる関数の意味の読み取り方

    • 引数と戻り値に分けて考えると意味がとりやすい

$.の違い

  • $
    • 関数適用の優先順位を変えるもの
  • .
    • 関数合成。関数をまとめるという考え方

畳み込みについて

...

Haskellの環境構築(M1 Mac)

Haskellの環境構築を行いました。参考にさせていただいた記事を添付します。

ghcup + VSCodeでの環境構築について

cabalを使用したHaskellプロジェクトの作成

cabalプロジェクトの実行

VSCodeからPyCharmへ乗り換え時のメモ

経緯

以下の恩恵を受けたいと思い、VSCodeからPyCharmへ乗り換えようと考えました。

  • Auto Importをしてくれる
  • Inspection機能が優秀なこと(Python初心者のため、あると嬉しい)

加えて、普段AndroidStudioを使用しており、IDEの仕様に慣れているため(ショートカットキーなどが同じ)、Pythonでの開発に集中できることも大きいです。

環境構築

仮想環境で新規プロジェクトを作成したいと思います。

  1. NewProjectを選択
  2. 仮想環境で使用したいバージョンのPythonpyenvなどで準備しておく*
  3. Interpreter type: Custom environment、Type: Virtualenv、Base python: "2"で入れたPythonを選択して作成

*について

pyenv install --list # install可能なもの一覧表示
pyenv install 3.12.3 # 指定してインストール
pyenv versions       # pyenv管理下にあるPython一覧表示

新規プロジェクト作成

その他やったこと

  • PyCharmの設定をカスタマイズ
  • 外部パッケージのインストール方法の確認

移行した感想

移行して良かったと思います。 自動importはやはり便利でした。パッケージのインストールもGUIでできることに驚きました。また、PEP8のコーディング規約に基づいて警告が出るので、Pythonでも問題なくチーム開発できそうだなと思いました。

参考

FastAPIでCRUD可能なAPIサーバーをたてる

目的

  • 手軽にAPIサーバーを立てられるようになりたい
    • 個人開発やテストのため

目標

  • CRUDなリクエストを受け取るAPIサーバーを作成する
    • TODOアプリの機能を作る
  • Pythonの知識を身につける

環境構築

% pip install "fastapi[all]" // pip install fastapiでは依存関係が解決できませんでした.

% pip list
fastapi           0.111.0

実装

メモ