パルカワ2

最近はFlutterをやっています

Mimestreamを使い始めた

Mimestream | A native macOS email client for Gmail

  • 会社MacChromeでは、会社のGoogleアカウントでログインして使っている
  • 会社のGoogleアカウントでChromeにログインしていると個人アカウントにログインできない
  • なにかに登録やログインする時に個人アカウントで基本登録しているので、メールを見るために個人アカウントのChromeプロファイルに切り替えている
  • めんどくさすぎるのでどうにかしたい
  • メールのクライアントを使うのがよさそう
  • Gmailのフィルタを結構がっつり使っているのでGmailに特化したものがほしい
  • MimeStreamというのがあるらしい

という感じで使い始めた。

FlutterでMacアプリをビルドしてFirestoreにつなげようとすると固まる

趣味でMacアプリでも作ってみるかと思ったら早速ハマってしまった………

Firebase準備

  • プロジェクトを作る
  • Firestoreのデータベースを作成する

コマンド

cd app
flutter create --org com.hisaichi5518 --platforms=ios,macos .
firebase login
dart pub global activate flutterfire_cli
flutter pub add firebase_core
flutter pub add cloud_firestore
flutterfire configure --platforms=ios,macos --ios-bundle-id=com.hisaichi5518.app --macos-bundle-id=com.hisaichi5518.app

macos/PodfileにてFirestoreが依存する最低バージョンに書き換える

platform :osx, '10.12'

アプリを立ち上げたらFirestoreのドキュメントが作られるコードを書いてみる

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

import 'firebase_options.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );

  final db = FirebaseFirestore.instance;
  final user = <String, dynamic>{
    "first": "Ada",
    "last": "Lovelace",
    "born": 1815
  };
  final doc = await db.collection("users").add(user);
  print('DocumentSnapshot added with ID: ${doc.id}');
  runApp(const MyApp());
}

Macアプリの場合は、無が表示されてしまう。ログすら出ないので困った。

iOSアプリはうまくドキュメントが作成されて画面も表示される。

アプリが作成された時点ではBundleIdが、 ios, macosともに com.hisaichi5518.app になっているのでそれぞれ変更してみたけどダメだった

またFirebaseは無料版はアプリが3個しか登録できない。flutterfire configureがよしなに作成してくれるが3個以上作ってもエラーにならないので注意

追記: 解決方法

macos/Runner/DebugProfile.entitlements に以下の設定を追加してあげれば動いた。

<key>com.apple.security.network.client</key>
<true/>

SocketException: Connection failed (OS Error: Operation not permitted, errno = 1) with flutter app on macOS - Stack Overflow

Doctor summary (to see all details, run flutter doctor -v):
[✓] Flutter (Channel stable, 3.3.2, on macOS 12.5.1 21G83 darwin-arm, locale ja-JP)
[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
[✓] Xcode - develop for iOS and macOS (Xcode 14.0)
[✓] Chrome - develop for the web
[✓] Android Studio (version 2021.3)
[✓] Android Studio (version 2021.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.2.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.2.2)
[✓] IntelliJ IDEA Ultimate Edition (version 2022.2.1)
[✓] VS Code (version 1.71.2)
[✓] Connected device (3 available)
[✓] HTTP Host Availability

• No issues found!

サンプルアプリは動く

flutterfire/packages/cloud_firestore/cloud_firestore/example at master · firebase/flutterfire · GitHub

関連

Add Firebase to your Flutter app

まとめ

flutterfire configureが便利だった。 FlutterFireのmacOS対応はまだβ版らしいので本格的に使うのはまだ先かなぁ

VSCode環境改善活動

定期的にVSCodeやInteliJでGitの操作をしたい期がやってくる。4年前も挑戦して挫折している。

最近はInteliJを使ってなくてVSCodeだけになってる。Gitの操作をするときは、VSCodeからiTerm2に移動していてまあそれでも大きくは困ってないんだけど、VSCodeからiTerm2に移動するときはVSCodeで開いてるディレクトリでGitを操作すること以外していないのでVSCodeで完了させたい気がしてきた。

VSCodeGUIでGitを操作することもやってみたけど、自分には無理だったのでVSCodeのTerminalを使うことにする。

TerminalとEditorの移動をキーバインドでできるようにする

VSCodeのUserInterfaceドキュメントを見て何から何に移動したいのか確認する。以下を満たしたい。

  • 特定のEditor GroupsからPanel(Terminal)に移動する
  • Panel(Terminal)から特定のEditor Groupsに移動する

キーバインドの設定を検索する。

  • Terminal: Focus Terminalというのがあったのだけど、デフォルトではキーバインドが設定されていない(!)
  • パネルのターミナルにフォーカスを当てると ^` と表示されていてcontrol+@で移動できるのでこれで良い
  • Editor Groupsには、command+1-9で移動できる

ちなみにcommand+0でサイドバーに移動できる。エクスプローラーとか具体的なのは command+shift+eとか。

また他のパネルは、command+shift+mなどなのでcommand+shift+なんかに統一したい気持ちを抑えてcontrol+@を使う。

ただターミナルにフォーカスが当たっているときにcontrol+@したらEditor Group 1に戻れるように追加した。

[
    {
        "key": "ctrl+[BracketLeft]",
        "command": "workbench.action.focusFirstEditorGroup",
        "when": "terminalFocus"
    }
]

Terminalを開いたらtmuxを開くようにする

tmuxのキーバインドに手が慣れているのでそうした。すでにセッションがある場合は、attachするなどは不要だと思ったのでやっていない。複数のディレクトリをVSCodeで開くのでattachされるとむしろ困るかもしれない。

  • コマンドパレットを出して、Terminal: Select Default Profile を選択
  • tmuxを選択

Terminalを開いたらVSCodeで開いてるディレクトリを開く

VSCodeでTerminalを操作するときは、ほぼ確実にVSCodeで開いてるディレクトリに移動している。

設定に以下を追加

    "terminal.integrated.cwd": "./",

ちゃんとキーバインドを覚える

環境というか自分の問題である…………。

InteliJからVSCodeを使うようになってからキーバインドがわからないままになってたりしてたんだけどちゃんと確認した。

あと最近もともと使えてたキーバインドが使えなくなったりして困ってたんだけどちゃんと原因を調べたりした。Karabiner-Elementsの設定がオフになってた……。

TerminalからVSCodeを開くようにする

日々何個かのディレクトリを行き来している。たくさん開いてると重くなる気がするので不要になったらウインドウを閉じている。再度開く必要があるとき毎回マウスでポチポチしていたけど、fzfで移動出来たら便利じゃんと思ったので作った。 ちなみにすでに開いてるとそのウインドウに移動してくれる。

control+@ -> control+v -> 文字入力 -> 移動 という感じになって楽

fzf-open-vscode() {
  local repo=$(ghq list | fzf --preview "ghq list --full-path --exact {} | xargs exa --color=never --no-permissions --no-user --no-filesize --git-ignore --sort name --tree --level 2")
  if [ -n "$repo" ]; then
    repo=$(ghq list --full-path --exact $repo)
    BUFFER="cd ${repo} && code . && cd -"
    zle accept-line
  fi
  zle clear-screen
}
zle -N fzf-open-vscode
bindkey '^v' fzf-open-vscode

まとめ

手癖でiTermを開いてしまうことがあるけど減らしていける気がする

Mac環境改善活動

ここ数年会社Macの開発環境がかなりいい加減でちゃんと設定してない状態だったので、久しぶりに整えるかという気持ちになったので整えた。

oh-my-zshをやめてZimに移行した

GitHub - zimfw/zimfw: Zim: Modular, customizable, and blazing fast Zsh framework

ターミナルを立ち上げるたびにずっと遅いな〜と思っていたので早いやつに移行しようという気持ちになって移行した。Sixeightさんのひさしぶりにzshに戻りました - ちなみに を参考にして色々設定した。ありがとうございます!

もっさりしてたけど、早くなったので良かった。

pecoをやめてfzfに移行した

GitHub - junegunn/fzf: A command-line fuzzy finder

pecoを愛用してたんだけど僕のiTerm2の設定だと色が若干見にくくて設定を直せばいいんだけどめんどくせ〜と思ってずっと放置してた。Sixeightさんの記事を読んでfzfを使ってみたら色も問題ないしpreviewとか出せて便利じゃんとなって移行した。

exaとかbatとかいれた

色がついてて綺麗!!!ただfzfのpreviewでexaを使ってるけど、colorを付けると文字がズレる問題があったのでオフにしてる。普通に使うぶんには困らないのでlsなど置き換えた。

Raycastで社内ドキュメントを検索できるようにした

Raycast

RaycastにNotion Extensionがあるんだけど、タイトル検索ではなかったりChromeの閲覧履歴を検索出来なかったり遅かったりしたので自分で作った。実は前から作ってたんだけど結構バグっていたり情報がなくて困ることがあったりしたので諸々直したりした。

SpotlightをやめてRaycastだけにした

元々はSpotlightとRaycastを併用していてアプリケーション検索はSpotlight, その他はRaycastを使うという感じで使い分けてた。前はRaycastだけだと満足出来なくて併用してた気がするけど理由は忘れてしまった。

RaycastのQuicklinksを設定する

ちゃんと設定すれば便利な気がするなと思ったので設定した。例えば特定のプロジェクトのFirestoreを開きたい時はRaycastのQuicklinksを設定しておいてそれを使って開くと早い、みたいな。ブラウザのブックマークを検索できるSearch Browser Bookmarksもあるけど、Search Browser Bookmarksを選択して検索するみたいなのがめんどくさいのでQuicklinksにした。

RaycastのExtensionをいれる

たくさん入れても忘れるので自分がよくやることを解決するものだけ入れて使わないコマンドはオフにした。

前はJIRAのExtensionとか入れてたけど結局使ってなかった。検索するよりボードの一覧を見ることが多いので自分が見るボードのQuicklinksを追加するみたいな感じで自分の行動に合わせるようにした。

まとめ

Raycast便利。ただScriptの結果をFilterしてアクションするみたいなfzf的なことが出来ない。AlfredはできるらしいのでAlfredのほうが便利かもしれない。あとRaycastのExtensionで日本語を打つとEnterキーで遷移してしまうバグがあるのがずっと直ってない。Alfredのほうが良い気がする。ただExtensionの開発が楽しいのでRaycast使ってる。

マウスピース最高!

社会人を10年くらいしているとやりたくない仕事は当然ある。そういう仕事をしている時に1 on 1とかすると「いま歯を食いしばってる」と僕は言ってる。

歯を食いしばるのってパッと見あんまり辛くなさそうだけど、長期間やっているといつの間にか歯はかけるし、顎は痛くなるし、頭痛はひどいし全然良いことがない。なので歯を食いしばるのをやめるか、食いしばっても問題ないようにする必要がある。

実際、寝ている時に歯を食いしばる人はマウスピースをして歯の食いしばりを軽減している。僕も寝ている時に付けていて頭痛がなくなったのでかなり最高

そういう感じで歯を食いしばってる時に息抜きになる仕事(プログラミング)をマウスピースとして用意することで歯の食いしばりも楽にしたら最高だと思う。

仕様書を浸透させるために仕様書のあれこれを決めた

仕様書を浸透させるために何が必要か?

品質の作り込みをしていきたい・仕様を把握するコストが高いので仕様書を書くことを会社全体で浸透させたいと思っていて、そのために書く・読むの負担軽減が重要だと考えて以下をやることにした。

  • 仕様書の項目を減らす
  • 仕様書フォーマットの統一
  • 仕様書の命名規則を決める
  • 統一されたフォーマットに沿ったテンプレートの作成
  • 管理方法の明示化・単純化
  • 仕様書作成・更新・廃止プロセスの明示化
  • 仕様書の具体例の作成
  • 仕様書を書くときに迷いそうなときに参照するガイドの作成または作成の依頼

実は一回シンプルなフォーマットを決めたのだが、自分の進め方が悪くそれが全く浸透しなかった。その反省を踏まえて上記を考えた。

仕様書の話は、このあたりの話に関係する。

ちなみに仕様書は、Notionで記載している。

実際のフォーマット

解決したい問題となぜやるのか

  • 実際に起きている問題を記載する
  • 目標となる指標がある場合は、指標も書くと尚良

言語定義

  • 仕様書内で利用する言葉を定義し認識を揃える
  • 社員なら知っているであろうと思う言葉も記載することを推奨

ユーザーストーリー

  • ユーザーストーリーを記載し開発メンバーと何をつくるか認識を合わせ考慮漏れを発見する
  • ユーザーストーリーはデータベースで管理する
  • データベースのプロパティは任意で追加してもよいが、ステータスが開発が終わった時点で非表示または削除することを推奨

仕様詳細

  • システムの制約やロジックを記載する
  • 開発者が設計時に作成するもの・お客様やスタッフが知っているべき情報等は、ここには記載しない

システムの制約とロジック

  • システムに関する制約や価格の計算方法などのロジックの詳細を記載する
  • 文章が長くなる場合は、表にまとめて記載する
  • 実例を記載することを推奨

関連

  • 仕様書に関連するメンテナンスされないフロー情報やリンクを記載する
  • 具体的には、仕様作成時のメモ・FAQ・図・議事録・QA成果物・JIRAやFigmaのリンクなど

決め方

前回の失敗の反省を活かして自分の中でテーマを持って取り掛かった。

複数のプロダクトマネージャーを巻き込む

仕様書を書くという労働に責任を持つのはプロダクトマネージャーなので諸々決めるときに一人で決めずにプロダクトマネージャーと一緒に決めた。例えば、最初に仕様書の項目はプロダクトマネージャーと一緒に仕様書を実際に書いてみてこの項目は必要だねとか話したりしていた。

自分はソフトウェアエンジニアなので、この仕様書は書きやすいとか読みやすいと思ってもプロダクトマネージャーがそう思わない可能性はあってプロダクトマネージャーの意見のほうが重要だと考えたからそうした。話すことでシンプルになったりした。

小さく始める

フォーマットに関する事だと言語定義はユビキタス言語大統一データベースみたいなのを用意したい気持ちになっていたのだけど、まずは始めることを意識してそれは問題にぶち当たったら考えることにした。他にもユーザーストーリーに具体例を用いるとかそれを使ってテストの自動化だとか色々考えたけど今回はやめた。

あとは仕様書に関することを決めるときにプロダクトマネージャーを呼んでいたけど、全員呼ぶと話がまとまりにくそうなのと全員空いてる時間を見つけるのが大変なので全員は呼ばずに詳しそうな人か興味がありそうな人を自分含め3人以上になるように呼んでいた。

継続的にチームで改善していく

対話だ!!変化への対応だ!!

やらなかったこと

仕様書の浸透で必要なことに「心理的負担の軽減」というのも考えていて、仕様書という名前をやめてminispecにするとか考えたのだけど、心理的負担の軽減はチームで取り組むことによって軽減していくのがよいと思って一旦仕様書という名前ですすめることにした。

あと開発チームやプロダクトマネージャーが決めればいいと思うのでレビューの仕方とかも決めなかった。

まとめ

仕様書のあれこれを決めた。しかしこれで終わりではなく始まりだ!!!!!!!!!!!

open.talentio.com

open.talentio.com

DEEBOT N8+を買った

プライムデーで安くなっていたので買った。普段は69,800円くらいで買ったのは45,000円くらい。安くなっていたので結構勢いで買った。

前はルンバ876を持っていた。当時7万くらいで買ったけど今見たら5万くらいで売られてる。高い。 ルンバ876を今買う人はいないと思うけど、ランダムに動くので時間はかかるし、バコバコ突撃してくるし、清掃中の音はうるさいし、清掃予約はバグってて時間がズレまくって使い物にならないしで褒められるところはほぼなかったんだけど、ないよりはマシという感じだった。掃除機を買ったあとは、ほぼ使ってなくて置物状態だった。

DEEBOTは同僚に勧められて一番モリモリのDEEBOT X1 OMNIを買おうかなと思ったんだけど、プライムデーでも13万くらいしたのでやめておいた。でも次は一番モリモリを買うかも。

DEEBOT N8+は、ルンバ876と比較するとマップを作って掃除をするので効率的(2LDKを20分くらいで掃除する)だし、突撃してこないし、清掃中の音は結構静かだし気に入ってる。清掃予約はバグっていて1時間ずれてるのが気になるけど今問い合わせてる。アプリの出来は正直良いとは思えないけど、清掃予約したあとはそんな触らないので大した問題ではない。

掃除できてるかどうかで言えば、普通に出来ていて髪の毛が落ちてる率が減った。まあただDEEBOTだけで良いかというと微妙で扉の関係で掃除出来ない部分はあったりする。DEEBOTだからというよりはロボット掃除機の課題な気がする。なので買った掃除機は使ってる。ちなみに水拭きはまだ使ってないのでよくわからない。

びっくりしたのは、ゴミをステーションが自動回収してくれるんだけどその時の音は本当にびっくりするくらいでかい。最初聞いたときはでかすぎて一人で笑った。まぁでもずっとうるさいわけじゃなくて数十秒だけなのでまだいいかな。

追記:清掃予約の時間が1時間ズレるのは、タイムゾーンがずれているからだった。"スマート清掃に入る" をタップ → 右上の三点をタップ → "その他の設定"タブを選択 → タイムゾーン で設定できる。