Iganinのブログ

日頃の開発で学んだ知見を中心に記事を書いています。

技術

【SwiftUI】要素数の少ない場合の表示も考慮したチャットライクな画面の実装

環境 以下の環境で実施しています。 Xcode 14.0 iOS 16.0.2 要件定義 いわゆるチャットのUIにおいては、最新の要素が画面下部に追加されていき、画面の初期表示時は画面最下部を基準に表示されているという要件が主流かと思います。 また、その一方で要素数…

【iOS】ARKitのFace Trackingの結果をobjファイルとして出力する

TL;DR; ARSessionでARFaceTrackingConfigurationを走らせる ARFaceGeometryをMDLAssetに変換する MDLAssetのexport(to:)メソッドを使う objファイルについて いわゆるobj形式のファイル。下記の記事が参考になった。 ブログ記事からの引用ではあるが、objフ…

【Kotlin】BCryptを使用してPasswordのハッシュ化を行う

TL;DR; パスワードは一般的な暗号化だけでなくSaltも加えた上でHash化するのが望ましい BCryptを使用すると暗号化データの中にSaltの情報が含まれるためSalt Columnが不要 jBCrypt/BCrypt.java at master · jeremyh/jBCrypt · GitHub がJavaではおそらく安牌…

【Kotlin】ExposedでDateTimeを扱う

TL;DR; org.jetbrains.exposed:exposed-java-timeを使う timezone付きでの保存には対応してないため注意 localDate, localDateTimeへの変換の際にsystemDefault TimeZoneが使用されるため注意 環境 Exposed 0.23.1 内容 ExposedはKtorとともに主に使用される…

【Flutter】RiverpodのProviderの変化を検知する

TL;DR; ProviderObserverを使用し,ProviderScopeのobservers引数に設定する 環境 [✓] Flutter (Channel stable, 2.2.3, on macOS 11.3.1 20E241 darwin-x64, locale ja-JP) [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] And…

【Flutter】FlutterのDartコードの難読化について

TL;DR; Dartコードの難読化には buildOptionとして --obfuscate --split-debug-info をつける 難読化について 難読化はクラス名やメソッド名を変更し、バイナリサイズを落とすことを主な目的としているらしい。 例えば、 SpecialCatクラスをaに置き換えると…

【Flutter】ScrollViewとExpandedを併用してSignIn / SignUp画面 などのレイアウトを作成する方法

TL;DR; LayoutBuiderとIntrinsicHeightを併用する 環境 [✓] Flutter (Channel stable, 2.2.3, on macOS 11.3.1 20E241 darwin-x64, locale ja-JP) [✓] Xcode - develop for iOS and macOS [✓] Chrome - develop for the web [✓] Android Studio (version 202…

【Flutter】GraphQLClientでキャッシュの永続化を行う(DIにRiverpodを使用)

TL;DR; HiveStoreを使う HiveStoreの初期化は非同期処理のためgraphqlのproviderがFutureとなってしまいめんどくさい 上記解消のために main.dart で 初期化を終わらせ ProviderScopeでoverrideする 環境 [✓] Flutter (Channel stable, 2.2.3, on macOS 11.3…

【Flutter】RiverpodのProviderのキャッシュをLogout時に効率的に削除する

TL;DR; logout時に値を変更するProviderを作成して、各Providerの初期化処理でそのProviderをwatchする 環境 [✓] Flutter (Channel stable, 2.2.3, on macOS 11.3.1 20E241 darwin-x64, locale ja-JP) [✓] Xcode - develop for iOS and macOS [✓] Chrome - d…

【Flutter】Navigation2.0とAutoRouteライブラリを使用して、画面遷移時に認証状態を確認する

tl;dr; 画面遷移時の認証状態をAutoRouteライブラリのAutoRouteGuardを使って確認する 認証していない場合は認証画面に遷移させるなどもできる riverpodでDIしている場合でも対応できる 書くこと auto_route + riverpodでの画面遷移時の認証状態確認方法 書…

【React】GraphQLとSentryを組み合わせて使用する際に気をつけること

tl; dr; graphQLのリクエストは全て同一のURLとなる 通信エラーの場合、sentry上では同一URLとなってしまい、operationがわからなくなる 外部のOSS(apollo-link-sentry)を入れてgraphqlのリクエストの中身を見れるようにする 発生する問題 graphQLのリクエス…

【React】(未解決)SentryのPerformance Monitoringがうまく機能しなかった

ほとんど個人用のメモです。 掲題の通りSentryのPerformance Monitoringが機能しなかったので調べたことなどまとめておきます。 環境 react 16.9.55 next 10.0.8 sentry/react 6.4.1 sentry/tracing 6.4.1 発生したこと 下記のチュートリアル通りに実装して…

【Flutter】webview_flutterで独自WebViewerを作る

webview_flutterはアプリ内で独自のWebView表示をしたい場合にまず第一候補として上がってくるライブラリかと思います。 本稿では、webview_flutterとhooks_riverpodを使用し、アプリ内に独自のWebViewerをMVVMの形で作成する方法を記載します。 下記環境を…

【Flutter】graphql_flutterでの認証処理について

graphql_flutterは【Flutter】graphql_flutterのクライアントにTimeoutを設定するにて記載した通り、 Flutterでgraphqlを扱う際には第一候補として使用を検討するライブラリかと思います。 本稿では、graphql_flutterを使用した認証処理について記載します。…

【Flutter】graphql_flutterのクライアントにTimeoutを設定する

graphql_flutterはgrahQLの有名なライブラリーであるApolloにインスパイアされたflutterのgraphql clientライブラリです。 FlutterでgraphQLを使用する場合はgraphql_flutterを使用するかgraphqlを使用することになるかと思います。 ネットワーク通信を行う…

【Server】APIにおけるHTTPメソッドの分類と意味

APIにおいて、URIとともにGETやDELETEといったHTTPメソッドを使用します。 GETやDELETEはそれぞれ意味がすぐにわかりますが、POST、PUTやPATCHおよびそれらの差異となるとたまに思い出すために時間がかかるため、備忘を兼ねメモします。 分類 GET リソースの…

【GitLab】GitLab内のProjectを複製する方法

はじめに GitLab内で既存Projectを複製し新規Projectを作成する方法を記載します。 環境設定 以下の環境を使用しています。 GitLab 内容 複製元のProjectの操作 export projectを押下する Project export started. ~~ のバナーが表示される exportに成功する…

【iOS】PlaygroundでSwiftUIのViewを描画する

はじめに SwiftUIで簡単なView構成を試したいときにわざわざProjectを作るのもめんどくさいなという時がありました。 Playgroundを使用してViewの画面を作成し、表示や動作を確認する方法がわかりましたのでメモがてら記載します。 環境設定 以下の環境を使…

【iOS】UIViewをUIImageに変換する

はじめに UIViewをUIImageに変換するというよくあるやつです。 今だとこのやり方が良いのではないかというのが見つかったのでメモがてら記載します。 環境設定 以下の環境を使用しています。 Xcode 11.4.1 Swift 5.2 内容 いかに作成したextensionメソッドを…

【Kotlin】Exposedのテーブル定義からテーブルスキーマ生成のSQL Scriptを作る

はじめに 下記の記事の続きです。 iganin.hatenablog.com Exposedによってテーブル定義を比較的簡単に作成することができます。 また、作成したテーブル定義から実際にテーブルスキーマを作成することも可能です。 ただ、実際にサービスを開発する際はServer…

【Kotlin】Exposedでテーブル定義を実装する

はじめに Server Side で Kotlinを使用する際に候補として上がるフレームワークとしてSpringとKtorがあります。 SpringはJavaの頃から親しまれているWeb Frameworkです。それに対し、Ktorは最近できたKotlinベースのWeb Frameworkであり、CoroutineなどKotli…

【iOS】UITextViewでタップ遷移可能なバナーを表示する方法

はじめに UITextViewにHtmlの記述を反映させたいことがあります。その場合は下記のようなコードを書くことで、<a>タグでのリンクの表示などが反映可能です。 Stringのextensionメソッドとして作成しておくと便利です。 extension String { func convertToHtml()</a>…

【iOS】NavigationBarのUIBarButtonItemにバッジを付与する方法

はじめに アプリを作成する際に通知の数をバッジで表現することがよくあります。たとえば通知タブを作成し、タブにバッジを表示する、UIApplication.shared.badgeNumberに値を設定してアプリアイコンにバッジをつけるといった対応です。 開発を行う中で画面…

【iOS】iOS SDK 13 以上でのビルド時に ダークモード非対応とする際の注意点

はじめに iOS 13からダークモードが導入されてしばらく経ちました。 iOS SDK 13以上(Xcode 11以上)でビルドする場合、ダークモード非対応とする場合はそれ用の対応が必要です。 対応に漏れが発生しかけたので備忘をかねて記載します。 環境設定 以下の環境を…

ユニットテストについての少考

はじめに 今年読んだ以下の本の中で設計におけるユニットテストの立ち位置を語る箇所が多くみられました。「レガシーソフトウェアからの脱却」、「レガシーコード改善ガイド」、「CAREER SKILLS」、「クリーンアーキテクチャ」など。実際に仕事の中で使った…

【iOS】Firebase RemoteConfig で作成する強制ダイアログ機構

はじめに Firebase Advent Calendar 12日目です。本稿では、Firebaseを使用した強制ダイアログ表示に関して記載します。ここで、強制ダイアログと表記しているのは、いわゆる強制バージョンアップダイアログに代表されるダイアログを表示し、それ以上のユー…

【Swift】Swift5.1からOptionalのEnumのswitch文をより簡単にかけるようになった

はじめに Swift5.0まで OptionalのEnumのインスタンスに対してswitch文を使用する際は下記のように.some(T)と.noneで記述する必要がありました。 enum Frequency { case daily case weekly case monthly case yearly } let frequency: Frequency? = .daily s…

【Swift】StructやClassスコープからSelfでstatic memberへのアクセスが可能になった

はじめに Swiftではstructやenumおよびclass内からstaticなメンバーにアクセスする際には以下のようにClass名.staticMemberかtype(of: self).staticMemberとする方法がありました。 struct Sample { static var hoge: Int = 0 func sampleFunction() { // ク…

【iOS】iOS13でSystemフォントがTimes New Romanフォントに変更されることがある

概要 タイトル通りです。バグレポートでも上がっているようにUITextViewなどでsystemフォントを指定していた際に、アプリ実行時にTimes New Romanフォントに変更されてしまう、という事象が発生しているようです。 NSAttributedStringKey の .fontに明示的に…

【iOS】Password Autofillの実装

はじめに iOS11からpassword autofillに対応することが可能になりました。 具体的には、パスワード新規作成時にiOSから提案される強力なパスワードを使用したり、keychainにユーザーID、パスワードのセットを記録し、アプリ使用時やWebサイトのログイン時に…