kokh log

yumikokhの開発日記

flutter: 画面スリープしないようにする

アプリ起動中に画面をスリープさせないようにします。 実装 wakelock_plus というプラグインを使用しました。 pub.dev wakelock プラグイン(メンテ終了)の派生プラグインのようです。 WakeLock は画面が暗くなったりロックされることを防ぐためのAPIに用い…

flutter: iOSでアプリ起動していないときに処理を実行する

こちらのライブラリを使います。 pub.dev Documentの中でも、最速でiOS対応する箇所に絞って記録しておきます。 実装 info.plist に権限追加 <key>BGTaskSchedulerPermittedIdentifiers</key> <array> <string>com.transistorsoft.fetch</string> </array> <key>UIBackgroundModes</key> <array> <string>fetch</string> <string>processing</string> </array> 初期化…

flutter: 多言語対応する際の初期設定

flutter多言語対応の導入メモ。 Packageのインストール $ flutter pub add flutter_localizations $ flutter pub add intl:any ファイル設定 pubspec.yaml で、 generate フラグがtrueでない場合は設定します flutter: generate: true プロジェクトルートに …

はてなブログをVercelネームサーバーのサブドメインにしてGoogleAdSense申請した

このはてブロもやっと記事数が30超えたので、GoogleAdSenseの申請をしてみました。 3日くらいして審査が始まり、「有用性の低いコンテンツ」という理由でリジェクトされてしまいました この際打てる対策は全部打っとこうと思い、ついでに独自ドメイン設定す…

Web開発経験しかなかった私がiOSアプリをリリースするまで

この記事はエンジニアと人生 Advent Calendar 2024の 10 日目の記事です。 9日目は @tamanugi さんの「2024 年をつらつらと振り返る」お話でした。 はじめに 10月某日、人生で1度やってみたかった「AppleStore に自分で作ったアプリを載せる!!」という憧れ…

riverpod: invalidate後にstate更新するときの注意点

Riverpodのinvalidateを行ったときの挙動ではまったメモです。 あるリストをRiverpodで管理するProvider経由で取得し、ドロップダウンで表示するコードがありました。 _buildDropdown( value: selected.date?.id, items: selectedViewModel .propertyOptions…

flutterでbuildできるのにXcodeで `Module XXX not found` エラーになる

ようやくv1.0.0をリリースしたアプリ、さっそくバグ報告があがったので修正して v1.0.1 をストアにあげようとしたところ、Xcodeのビルドで Module XXX not found エラー になってしまいました。flutter build ios はうまくいきます。clean installしなおして…

flutter: SimulatorでAppleStore申請用のスクリーンショットを作成する

AppleStoreの申請でスクショを用意するときに最初から知ってけばスムーズだったなということをメモしておきます。 スクショの要件 ストアの申請画面 サイズは、6.9インチか6.5インチのどちらかでアップロードすれば、自動的に片方の大きさ分作成されます。 …

flutter: iOSアプリのアイコン設定

iOSアプリのアイコン作成&指定をしてみたので作成〜適用までの最短ルートをご紹介します。 アイコンを作る iOS18から、アプリアイコンの見た目をライト、ダーク、淡色にカスタマイズできるようになりました。(ライト以外って誰か使ってるんだろうか) その…

flutter: Snackbarを全体管理する

Snackbarを実装したので実装例をご紹介します。 Demo 方針 画面遷移時にSnackbarが急に消えるような体験にしたくなかったため、アプリケーション全体で共通のSnackbarWidgetを表示できるようにします。 また、ViewではなくControllerあるいはViewModel側のエ…

Dart: type narrowingされない?

Dartを書いていて、nullでない場合という条件式内でも、nullableなオブジェクトはnon-null扱いにならず、泣く泣く ! (Non-null assersion operator) を使って凌いでいました。 例えば下記のように、クラスのnullableなメンバー変数にアクセスするとき、 != n…

Dart: DateTimeで日付単位の比較

毎度おなじみのタイムゾーンの罠にハマったので記録しておきます。 今回サーバーから返却される値は下記の二種類ありました。 2024-11-14T00:00:00.000+09:00 のような ISO 8601 形式 2024-11-14 のような日付のみの情報 これをそのまま DateTime.parse で処…

テキスト:emoji:をUnicode絵文字👍に変換する

以前紹介した、外部サービスの投稿をNotion日報へ連携するカスタムAPIの続きです。 kokh.hateblo.jp ZappierでSlackに投稿されたポストをwebhookで受取り、カスタムAPIへのリクエストを通してNotion日報に追加するようにしています。 ここで、webhookで受け…

NotionアプリのOAuth認証

ユーザーにNotionへのアクセスを許可してもらいたいときに利用する、OAuth認証の実装方法です。 全体の流れ ざっくりこのような流れになります。はユーザー操作です。 1. リダイレクト先のページを作成 2のPublic Integrationを作成するときに必要なページを…

flutter: アノテーションを使ったコード生成

RiverpodやFreezedといったpackageには、アノテーションを使ったコード生成オプションが用意されています。 例えば、 @riverpod String example(Ref ref) { return 'foo'; } この @riverpod の部分がアノテーション。 このままだと当然 Ref の定義が見つから…

flutter_secure_storage利用時の注意点

最近flutter入門してアプリを作ってみてます。 ネイティブアプリ開発自体はじめてだし、新しい言語を学ぶのは久しぶりなので新鮮です ストレージの種類 さて、flutterの世界で永続化で使用するローカルストレージはこのような区分けになっているようです。 S…

path.resolve(__dirname, ...paths) にする理由

path.resolve(...paths) は、引数に指定されたpathを結合して絶対pathに変換する。 ドキュメントに以下の記述があった。 If, after processing all given path segments, an absolute path has not yet been generated, the current working directory is us…

振り返りコマンドをnpmパッケージとして公開した

NotionDatabaseの特定期間内のページを取得して、AIに最適化したテキストに変換(Token削減するため不要な文字を削除するなど)した上で、日報から1ヶ月を振り返るプロンプトを作成した - kokh log で言及したプロンプトでOpenAIにリクエストするコマンドをn…

Node.jsでAlfredのWorkflowをつくった

Notionでタスク管理する際に、Alfredを使っていい感じにタスク追加できるWorkflowを作りました。 github.com (Notion DBのプロパティなど自分仕様になっているので、Githubのみの公開) AlfredのWorkflowを、使い慣れたNode.jsで作るための知見が溜まったの…

シェルスクリプトの文字列と変数の扱い

下記のように、jsonの中で変数展開するスクリプトが通らなくてハマったのでメモ > curl --location "https://example/api" \ --header "Authorization: Bearer ${SECRET_KEY}" \ --header "Content-Type: application/json" \ --data '{ "page": { "page_id"…

Zodを使った複雑な型検証

複雑な型をもつ値に対する整形関数を作成した際、zodが便利だったので、注意点とともに紹介します。 やりたいこと ユーザー情報を表すオブジェクトから、田中 太郎, 山田 花子 のような形に整形するための関数 formatFullNames を作成します。 [{ lastName: …

asdfでNodejsのVersionをあげてpnpmを有効にする

去年anyenvからasdfに乗り換えて以降、プロジェクトのNode.jsのバージョンが変わるたびに呪文的に下記のコマンドを実行していたため、改めて調べました。 asdf install nodejs {version} corepack enable asdf reshim nodejs 最後にreshimをしないとpnpm呼び…

LightroomとLightroom Classicの同期設定

LightroomからLightroom Classicへ移行するにあたり、同期まわりの仕組みを理解するのに大変苦しんだので、記録を残しておきます。 ようやくこれだという情報をシェアしてくださっているYouTubeを見つけ(ただし英語)、なんとか理想の形で移行ができました…

オーバーロード関数で引数の型によって返り値を変える

はじめに 突然ですが、下記のような関数があったとします。(できるだけシンプルな形にするために実際にはありえなさそうな関数になっています) function fn(value: string, opt?: string ) { if (typeof opt === "string") { return [opt] } return value …

Toggl Track のタイマーをAPI経由で開始する

Toggl Trackは、タイマーを使って作業時間を計測することができるサービスです。 マルチデバイスで使用でき、使い心地もとても良く、自分だけで使うには十分な機能が無料で利用できます。 iOSショートカットとしてもタイマーの起動や停止が用意されているの…

テスト用のStorybook Buildを高速化する

Storybookをテスト目的でbuildする際、--test フラグをつけることで、テストに必要のない機能を生成物から取り除くことができ、テストの実行速度をあげることができます。 $ storybook build --test .storybook/main.ts で個別に生成物の設定ができるオプシ…

Vercel CLIから環境変数を設定する

Vercel のdashboardを経由せずに、Vercel CLIから環境変数を設定することができます。 使い方 Vercel CLIはインストールされている前提で進めます。 クラウドへ環境変数を設定 $ vercel env add ${KEY} ここから対話形式で値とセットする環境を選択すること…

Notion日報の更新を簡単にする

背景 2024年1月にNotionCalendarが登場したことがきっかけで、すべてのタスク管理をNotionに一元化しました。 ただ、Notionはかなり高性能であるがゆえ、シンプルなテキストエディタに比べとっさのメモをとるときに腰の重さを課題に感じていました。 ページ…

VSCodeのZenModeでマークダウンを書く環境設定

記事をNotionで書いてはてなに貼り付けてましたが、VSCodeで書いたほうが速く書けそうだなと思い準備しました。 やったこと mdの構文チェックを有効化 こちらは割愛しますが、とりあえずmarkdownlintをいれました。 もともと下記の設定をしていたので、保存…

日報から1ヶ月を振り返るプロンプトを作成した

ここ数年、日報代わりにNotionで日々の記録を書いています。 月の終わりに、目視で30日分の記録を振り返るのが億劫なことが課題だったのですが、 AIを使えばいい感じに振り返りができるのではないかと思いました。 思い通りの出力結果になるまでにプロンプト…