Annieの部屋

ウィーンのホーフブルク宮殿の中にある非常口がアイコンの、きっとエンジニアな人。

子どもの月齢をiPhoneウィジェットに表示してみた話

はじめに

前回に引き続き、育児 × ちょっとした自作ツールのお話です。

早いもので我が子も生後2ヶ月を迎え、予防接種が始まりました。

予防接種の予診票を記入しようとしたところ、ものによって「生後◯日」「満◯歳◯ヶ月」「◯週◯日」と様々な形で子の年齢(月齢)を書く必要があり……

さすがに満◯歳◯ヶ月は覚えているものの、生後◯日や◯週◯日まではすぐ答えられるわけもなく。

そのたびに計算するのも面倒なので、月齢・週数・生後日数を、スマホでパッと確認できたら便利だなぁと思ったのがきっかけです。

既存のアプリだとどうなの?

例えば、我が家が使っているぴよログは、「◯ヶ月◯日」と「生まれてから◯日目」をアプリ内に表示してくれています。

ただ、「満◯歳◯ヶ月」「◯週◯日」「生後◯日」を全部まとめて、しかもホーム画面のウィジェットで見たい!という私のわがままを叶えてくれるものは、ぱっと探した限り見つかりませんでした。

ないなら作ってしまおう、ということで作ってみました。

実行環境 (執筆時点)

  • iPhone(iOSのバージョンを記入)
  • Scriptable(バージョンを記入)

Scriptable とは?

Scriptableとは、JavaScriptでiPhoneの自動化やウィジェット作りができる無料アプリです。

https://scriptable.app/

ホーム画面に置いたScriptableのウィジェットから、好きなスクリプトを選んで表示できます。 Xcodeでウィジェット拡張を作る……となるとちょっと腰が重いですが、これならiPhoneだけで完結します。とても手軽!

まずはシンプルに作ってみた

まずは、誕生日を入れておくと「満◯歳◯ヶ月◯日」「◯週◯日」「生後◯日」を表示するだけのシンプルなウィジェットを作りました。 生後日数は、誕生日当日を「生後0日」として数えています。

Scriptableでスクリプトを作ったら、ホーム画面にScriptableのウィジェットを置いて、そのスクリプトを選ぶだけで表示されます。

これで、画面に月齢が表示されるようになりました!

※ 誕生日は仮で2025-04-01が設定してあります。「赤ちゃん」の部分は我が子の名前に変更可。

せっかくなのでオシャレにしてみた

動いたのは嬉しいけど、白い背景に文字が並んでいるだけだとちょっと味気ない……。 毎日目にする画面なので、見た目にもこだわってみました。

変えたところはこんな感じです。

  • 背景をやわらかいグラデーションにして、フォントを丸みのある RoundedSystemFont 系にした
  • 月齢を大きな数字でドーンと出して、「◯週◯日・生後◯日」は小さく添える形にした
  • 次の月誕生日までの進み具合をバーで表示するようにした
  • 月誕生日や誕生日の当日は、バーの下がお祝いメッセージに切り替わるようにした
  • 小サイズに加えて中サイズにも対応して、中サイズでは週数と生後日数をカード風に並べた

カラーテーマは peach / mint / lavender / sky / night の5種類から選べるようにしました。

現在はnightに設定していますが、今後気分で変えてみようと思います。

コード

コードはGitHubで公開しています。

設定方法

コードをGitHubで公開するにあたって、子どもの名前や誕生日はScriptableのウィジェットの「Parameter」欄に入力して、コードからはそれを読み込むだけでにしました。 これなら個人情報はiPhoneのウィジェット設定にだけ残るので、安心してコードを公開できます。

設定の手順はこちら。

  1. App StoreでScriptableをインストールする
  2. Scriptableを開いて、右上の「+」から新規スクリプトを作成し、上のコードを貼り付ける
  3. ホーム画面を長押し →「+」→「Scriptable」→ 小サイズか中サイズのウィジェットを追加する
  4. 追加したウィジェットを長押し →「ウィジェットを編集」を開き、Script で作ったスクリプトを選ぶ
  5. 「Parameter」欄に、誕生日と名前などをカンマ区切りで入力する

Parameter欄の書き方はこんな感じです。

2025-04-01,赤ちゃん,👶,peach

順番は「誕生日,名前,絵文字,テーマ」で、名前から後ろは省略できます。 省略した場合は、名前が「サンプル」、絵文字が👶、テーマが peach になります。

ちなみに、Scriptableアプリの中で▶ボタンを押して実行したときはParameterが空になるので、サンプルの名前と日付で表示されます。見た目を確認したいときは、このプレビューで十分です。 きょうだいがいる場合は、ウィジェットを2つ置いてParameterだけ変えれば、同じスクリプトでそれぞれの月齢を表示できます。

まとめ & 感想

Scriptableを使って、子どもの月齢・週数・生後日数をiPhoneの画面に表示するウィジェットを作ることができました!

iPhoneだけでコードを書いてウィジェットにできるので、思ったよりもずっとサクッと作れて驚いています。 今回もClaudeに相談しながら作ったので、育児の合間のちょっとした時間でも形にできました。

スマホを開くたびに「今日で○ヶ月○日かぁ」と目に入るのが、なんだかとても嬉しいです。 月誕生日にお祝いメッセージが出る日を、今からひそかに楽しみにしています。

おしまい

ぴよログのデータフィード + SwiftBar で、macのメニューバーに次の授乳時間を出してみた

はじめに

2026年8月に、子どもが生まれました!(唐突)

慣れない育児に毎日バタバタですが、育児記録は夫婦でぴよログに付けています。

ぴよログはスマホアプリで、次の授乳時間などはアプリを開かなくてもウィジェットからサッと確認できて便利!

ただ、パソコンをかまっているときは、わざわざスマホを手に取って確認するのがちょっと面倒で……。パソコンをかまっているときも、簡単に確認できるようにできないかなぁなんて思っていました。

実は、子どもが生まれる前から、先輩パパママエンジニアの方々がぴよログのデータを使って育児記録のダッシュボードなどを作っているのを見かけていて、「自分もいつかやってみたい!」とひそかに思っていたんですが、そんな中、ぴよログから公式の読み取り専用API(データフィード機能)が公開されたと知り、これはやるしかない!と思って作ってみたので紹介したいと思います。

実行環境 (執筆時点)

  • MacBook Air M1
  • macOS Tahoe 26.5.1
  • SwiftBar 2.1.1
  • ぴよログ v9.4.0 以降(データフィード機能が使えるバージョン)

完成したもの

macのメニューバーに、次の授乳予定時刻が表示されるようになりました! PCで作業しながらでも、目線を上げるだけで確認できます。

ぴよログのデータフィード機能とは?

2026年9月に、ぴよログの開発者の榊原さんが、ぴよログの記録を読み取れるAPIを公開してくださいました。

使い方とデータ仕様は、公式のページにまとまっています。

ざっくりまとめると、

  • iOSアプリの設定から「データフィード」を開いて、子ども・取得期間・有効期限を選んでフィードを作成する
  • 発行された専用URLにGETでアクセスすると、直近の育児記録がJSONで返ってくる
  • 読み取り専用で、ログインやAPIキーは不要(URLそのものが認証情報)

という仕組みです。とても簡単。

ちなみに、URLを知っていれば誰でも記録を取得できてしまうので、URLはパスワードと同じように扱うよう注意書きがあります。 なので、私はコードをGit管理していますが、URLをコードに直接書かずに.envに置いて、リポジトリにも含めないようにしました。

また、取得期間が24時間のフィードだとデータのキャッシュは1分程度で、同じURLへのアクセスも1分に1回程度までが推奨されています。 メニューバーの更新間隔を決めるときに、このあたりも参考にしました。

仕様のページには記録の種類ごとの項目やエラー時の対処まで丁寧に書かれていて、本当に読みやすかったです。

SwiftBar とは?

SwiftBarとは、スクリプトの出力をそのままmacのメニューバーに表示してくれるアプリです。

スクリプトが出力した内容がメニューバーに表示されて、ファイル名で実行間隔を指定することもできます。

今回は、

  1. ぴよログのデータフィードから最新の授乳記録を取ってくる
  2. 前回の授乳時刻から次の授乳時刻を計算する
  3. SwiftBarでメニューバーに表示する

という流れで実装しました。

まとめ & 感想

ぴよログのデータフィードとSwiftBarを組み合わせて、macのメニューバーに次の授乳時間を表示することができました!

データフィードはURLにアクセスするだけでJSONが返ってくるシンプルな仕組みで、SwiftBarも出力するだけでメニューバーに出せるので、思ったよりもずっとサクッと作れて驚いています。

Claude Codeのおかげで、育児の合間の細切れの時間でもすぐに形にできたのも大きかったです。

そして、ずっとやってみたかった「ぴよログで何か作る」が叶って嬉しかったです!

最後に、ぴよログのデータフィード機能を公開してくださり本当にありがとうございました。 毎日の育児で助けられているアプリで、自分の欲しいものを作れるようになったのがとても嬉しいです。

ぴよログAPI公開の記事に「何か作ったら教えてほしい」と書かれていたので、何かの拍子にこの記事が届きますように……

おしまい

Docker Desktop for Mac から Colimaに乗り換え

背景

個人ではフリープランでDocker Desktop for Mac使ってた

会社の環境は、そろそろDocker Desktop for Macからおさらばしたくなった→Colimaにしてみよう!

それに合わせて個人PCも環境を揃えることにしたので自分用の覚え書き

(いままでDocker Desktopさんに頼りっぱなしだったから、ちょっと寂しくもあるね。)

環境

PC: MacBook Air Apple M1, 2020

OS: Sequoia 15.7

すすめかた

Docker Desktop for Macをuninstall

公式の方法 こちらを参照 docs.docker.com

わたしの場合はもともとhomebrewでインストールしていて、

公式の方法の実行後もbrew listにdocker-desktopが出てきて嫌だったから

追加で以下のコマンドも実行

brew uninstall --cask docker --force

Colimaをinstallする

開発者さんありがとう github.com

brew install colima

dockerをinstallする

brew install docker

Colimaを起動する

colima start -c 4 -m 8

~/.colima/default/colima.yamlをみると、デフォルトはCPUが2, MEMが2GB, DISKが100GBらしい

CPUは4MEMは8GBをなんとなく充てておきたいのでオプション付きで起動した

気にしないならcolima startだけでOK

必要なdocker pluginを入れる

brew install docker-compose docker-buildx
# docker-buildxはdocker build コマンドを使いたい人

で、これを実行したときに多分下みたいなようなメッセージが出るから、

指示の通り~/.docker/config.jsonを更新する

Compose is a Docker plugin. For Docker to find the plugin, add "cliPluginsExtraDirs" to ~/.docker/config.json:
  "cliPluginsExtraDirs": [
      "/opt/homebrew/lib/docker/cli-plugins"
  ]

動作確認

docker run --rm -d -p 8080:80 nginx

open http://localhost:8080

で、"Welcome to nginx!" が出てきたらOK!完了!

# Cleanupも忘れずに
docker stop $(docker ps -q --filter ancestor=nginx)

感想

GUIにこだわらないなら、手軽に切り替えできてびっくり!

おしまい

asdfのバージョンが上がったときに.asdf/shims/{packages} が No such file or directory になる

自分用覚え書き

いつも何したら解決するか忘れてしまうので。

こんな感じのエラーが出てくる

asdfでインストールしたコマンドを実行しようとしたとき

/Users/{username}/.asdf/shims/kubectl: line 4: /opt/homebrew/Cellar/asdf/0.10.0/libexec/bin/asdf: No such file or directory
/Users/{username}/.asdf/shims/kubectl: line 4: exec: /opt/homebrew/Cellar/asdf/0.10.0/libexec/bin/asdf: cannot execute: No such file or directory

asdf reshim しても直らない

github.com

とりあえずどうにかしたいとき

~/.asdf/shimを消してからもう一回 asdf reshim を実行したら、とりあえずなおる

$ rm -rf ~/.asdf/shims && asdf reshim

MacBook Air (M1, 2020) にk8s勉強用の環境を整える

Udemyの「Kubernetes for the Absolute Beginners - Hands-on」を進めていて、

minikubeを使ったdemoを自分でもやってみようと思ったら想像以上に躓いたので自分用メモ。雑。

www.udemy.com

実行環境

2022/03/19 現在

※Udemyの講座ではLinux OS上で動かしている

Virtual BoxがM1 Macで使えない

$ brew install --cask virtualbox
==> Caveats
virtualbox requires a kernel extension to work.
If the installation fails, retry after you enable it in:
  System Preferences → Security & Privacy → General

For more information, refer to vendor documentation or this Apple Technical Note:
  https://developer.apple.com/library/content/technotes/tn2459/_index.html

==> Downloading https://download.virtualbox.org/virtualbox/6.1.32/VirtualBox-6.1.32-149290-OSX.dmg
######################################################################## 100.0%
Error: Cask virtualbox depends on hardware architecture being one of [{:type=>:intel, :bits=>64}], but you are running {:type=>:arm, :bits=>64}.

minikubeのdriverとしてvirtualboxを使う方法がdemoで使われているが、installできない。

→ Driverにdockerを指定することでminikube start コマンド自体は実行できた

$ minikube start --driver=docker

$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured

Hello Minikubeで使われているimageがM1 Macで動かない

kubernetes.io

$ kubectl create deployment hello-node --image=k8s.gcr.io/echoserver:1.4
deployment.apps/hello-node created

$ kubectl get deployment
NAME         READY   UP-TO-DATE   AVAILABLE   AGE
hello-node   0/1     1            0           79s

いつまで経ってもdeploymentがreadyにならない……。

k8s.gcr.io/echoserver:1.4 はM1 Macで動かないらしい。

M1 MacでMinikubeを使ってみる - Hacker Sheet

↑こちらを参考に、違うimageを使ってkubectl create deployment してみる

$ ubectl create deployment hello-minikube --image=arm64v8/nginx

$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-minikube   1/1     1            1           107s

deplyomentがreadyになった!

Service URLにアクセスできない

そもそもURLが発行されない……

$ kubectl expose deployment hello-minikube --type=NodePort --port=80
service/hello-minikube expose

$ kubectl get service
NAME             TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
hello-minikube   NodePort    10.108.178.165   <none>        80:31639/TCP   2m34s
kubernetes       ClusterIP   10.96.0.1        <none>        443/TCP        26m

$ minikube service hello-minikube --url

🏃  Starting tunnel for service hello-minikube.
❗  Because you are using a Docker driver on darwin, the terminal needs to be open to run it.


$ minikube service list
|-------------|----------------|--------------|-----|
|  NAMESPACE  |      NAME      | TARGET PORT  | URL |
|-------------|----------------|--------------|-----|
| default     | hello-minikube |           80 |     |
| default     | kubernetes     | No node port |
| kube-system | kube-dns       | No node port |
|-------------|----------------|--------------|-----|

他にも問題に直面している人を見かけた

github.com

うーん、これはM1 Mac特有の問題ではなさそう。

そして「driverをdockerじゃなくてhyperkitにしたら動く」というのが解決策になっている……。

github.com

そしてM1 Macではhyperkitが動かない!詰んだ!

対応:microk8sを使う

今回は、minikubeを使うことを諦めてmicrok8sを使うことにした。

Canonicalの軽量Kubernetes「MicroK8s」がWindowsとMacに対応。インストーラーで簡単に導入可能に - Publickey

これで、いまのところdemo通りのコマンドが使える。

MicroK8sのパッケージインストール

$brew install ubuntu/microk8s/microk8s

MicroK8sのインストール

multipassが入っていないとinstallを促される

$microk8s install
Support for 'multipass' needs to be set up. Would you like to do that it now? [y/N]:

MicroK8sとSkaffoldで開発環境を構築した際のメモ(Mac) - Qiita

$ microk8s start
Started.

~/.kube/config に設定追加(任意)

追加しない場合はmicroku8s kubectlというコマンドを使えば良い。

私はこれ以外に切り替えるk8sクラスタはないので、以下のコマンドでconfigに設定を追加した。

$ microk8s config > ~/.kube/config

複数切り替える必要がある場合はmicrok8s configの結果をうまいこと切り取って~/.kube/configに追記する必要あり。

Hello Minikube をmicrok8sで再実行!

Hello Minikubeで使われていたコマンドをmicrok8s環境で使ってみる

$ kubectl create deployment hello-microk8s --image=arm64v8/nginx
deployment.apps/hello-microk8s created

$ kubectl get deployment
NAME             READY   UP-TO-DATE   AVAILABLE   AGE
hello-microk8s   1/1     1            1           33s

$ kubectl expose deployment hello-microk8s --port=80
service/hello-microk8s exposed

これでhttp://localhostにアクセスすると馴染みのWelcome to nginx! が見れるはず!

あー、楽しかった。

おもうこと(2021年10月ver.)

2021年もあと2ヶ月になったのはあまり関係ないけれど、今の思いを綴りたくなったので書き残しておく。

先月まで一緒のチームで働いていた先輩エンジニアが今月から新たに素敵な挑戦をされていて、
その姿に勝手に刺激と影響を受けている自分がいるなぁと感じているけど
振り返れば、今までの人生も自分はこうやって周りの人の影響を受けまくって生きてきた気がするなぁと思った。

15歳のときに、偶然参加した「中学生Ruby教室」で出会った講師の先生に憧れて、
それまで選択肢に一切なかったその先生の出身校の高専に進学して情報工学を学び始めたし、
(プログラミングにも興味はあったけど、自分の誕生石がルビーなので何故か惹かれて参加しただけだった気がする)

バスケ部のマネージャをしているときに、他校のマネージャーさんがスポーツトレーナーもできる方でかっこよくて憧れて、
テーピングの資格を取ってみたり、コンディショニングコーチの資格を勉強したりして
エンジニアの道を捨ててスポーツトレーナーの道に進もうとした時期もあったし

結局色々あってスポーツトレーナーの道に進めなくて、半分惰性で工学を学び続けながら、
IT系に就職する気ないなぁと思いつつ参加したエンジニアの逆求人イベントで今の会社のマネージャーと出会って、
自分のことを「きみ面白いね」と言ってくれたその人と一緒に働きたくなって結果的に入社してるし。

なんかいろいろなことを真剣に考えずに直感で選んで生きてしまった感はあってちょっと不安だけど、
でもそれはきっと今まで素敵な人との出会いがあったからだから私ってツイてるなって思うし
おかげで今が楽しいからいいかなって27歳の自分は思ってると記しておこう。

どんぶらこと「Chrome Extension作りたい欲」が流れてきた(1)

学生時代、履修した授業の5段階評価アンケートにWEBで回答するという儀式が毎学期末にあったのですが、
技術に尖っていた先輩が「いちいち手で選ぶの面倒くさい」ということでChromeの拡張機能を自作し 、各評価項目のラジオボタンをランダムに選択して提出できるものを作っておられて感動したのを覚えています。(実際に使用されていたのかまでは把握していませんが。)

あの感動から約10年、突然川上の方からどんぶらこと「Chrome Extension作りたい欲」が流れてきたのでやってみた記録です。

(n番煎じ感はありますが・・・)

たどり着きたいところ

スケジュールの話をするときにいちいちカレンダーアプリを開くのが面倒なので、
Chrome Extensionで簡単なカレンダーを開けるようになる!

  • Nice to have: やれたらいいけど今は優先度低めなこと

    • ReactやVueを使って書いてみる?
    • そのカレンダー上で予定を登録できるようにする??
    • そのほかリッチな機能の実装
    • 実際にweb storeで公開する($5かかるらしい)

今回のゴール

公式にGetting startedがあるのでやってみる!

developer.chrome.com

とりあえずはじめてみる

Extensionをつくるのに必要なものは、以下の4つでした

  • jsファイル
  • css ファイル
  • html ファイル
  • manifest.json: 「どんな拡張機能か」を記載しておく定義書のようなもの

※ 執筆時点ではmanifest v3の形式でmanifest.jsonを記述しています。

もちろん、実装する機能によってサイズ感や難しさは変わると思いますが
Extensionはとてつもなく特殊な方法で作られているのかなと勝手に思い込んでいたので、普通にwebページを作る感覚で作り上げることができるんだなーというのが最初の印象です。

できた!

ということで、Getting startedに載っているコードをそのままコピペするだけで、こんな感じのOptionメニュー付き Extensionを作ることができました!

chrome-extension-sample gif

特に詰まってしまうところはなくて、ゆっくりやっていましたが所要時間は1時間程度で形にすることができました。

「あれ、書いてあるとおりに動かないぞ・・・?」となるときは、だいたい拡張機能管理画面の更新ボタンを押し忘れているときでした。

chrome-extension-management-screen img

次回は・・・

popup.htmlの要領で、カレンダーを表示するものを作ってみようと思います!

今回実際に書いたコード。フォルダ構成を若干変えていますが、ほぼ公式ページに載っているコードそのままです。

github.com