Panda Noir

JavaScript の限界を究めるブログでした。最近はいろんな分野を幅広めに書いてます。

日報をすぐ書く技術 ver.2

NVIM_APPNAME を使えばかなり快適にいけるんじゃないか? と気付いたので書き直し。ver.1はこちら

この方針だと、日報を書くときにだけ使う設定が足せる。プラグインを入れたり、カラースキームを変更するのが簡単。

手順

  1. ディレクトリを作る (mkdir ~/.config/nvim-memo)
  2. 各ファイルのシンボリックリンクを作る (ln -sf ~/.config/nvim/lua ~/.config/nvim-memo/lua)
  3. init.lua を書く
  4. エイリアスを設定する (alias memo="NVIM_APPNAME=nvim-memo nvim")

init.lua はこんな感じ。先頭の方は通常時のinit.luaとだいたい同じ。後半に日報ファイルの生成処理とかが追加されている。

---@diagnostic disable-next-line: undefined-global
if vim.loader then vim.loader.enable() end

-- 通常のinit.luaと同様の設定を読み込み
require('options')
require('disable-providers')
require('keymappings')
require('install-lazynvim')
require('userautoload.indent')
require('userautoload.filetype')

require 'lazy'.setup('plugins', {
  change_detection = { notify = false },
})

-- ====================
-- ↓ 以下が日報用の設定

local function get_weekdays()
  local today = os.date('*t') -- 今日の日付を取得
  local month = today.month   -- 現在の月
  local year = today.year     -- 現在の年

  local res = {}
  for i = 1, 31 do
    local d = os.time({ year = year, month = month, day = i, hour = 0, min = 0, sec = 0 })
    local d_table = os.date('*t', d) -- 日付をテーブル形式に変換

    -- 月が変わった場合はループを終了
    if d_table.month ~= month then break end

    -- 週末の場合はスキップ
    if d_table.wday == 1 or d_table.wday == 7 then
      goto continue
    end

    -- 結果をフォーマットしてリストに追加
    table.insert(res, string.format('# %d/%d/%d(%s)',
      d_table.year, d_table.month, d_table.day,
      ({ '日', '月', '火', '水', '木', '金', '土' })[d_table.wday]))

    ::continue::
  end

  -- 結果を逆順に並べ替え
  local result = {}
  for i = #res, 1, -1 do
    table.insert(result, res[i])
  end

  return table.concat(result, '\n') -- 結果を結合して返す
end

local dir = os.getenv('HOME') .. os.date('/Documents/daily-report/%Y')
local filename = os.date('%m.md')
local filepath = dir .. '/' .. filename

-- 今月の日報ファイルが存在しなければ作成する
os.execute('mkdir -p ' .. dir)
local file = io.open(filepath, 'r')
if file then
  file:close()
else
  file = io.open(filepath, 'w')
  if file then
    file:write(get_weekdays())
    file:close()
  end
end

-- 日報ファイルを開く
vim.cmd('e ' .. dir .. '/' .. filename)

-- 今日の日付の行にnマークをつける
local date_table = os.date('*t')
vim.fn.search(string.format('%d/%d/%d(', date_table.year, date_table.month, date_table.day))
vim.cmd [[normal mn]]

-- 昨日の日付の行にyマークをつける
if vim.fn.search(string.format('%d/%d', date_table.year, date_table.month), 'W') ~= 0 then
  vim.cmd [[normal my]]
end

-- 今日の日付の位置にジャンプ
vim.cmd [[normal `n]]

Apple watchが意外と便利

物欲に負けてApple watchを購入してみた。

思ってたより便利そう(だけど恩恵をフルで受けられていない)。

最大の利点: mac のロック解除機能がすこぶる便利そう

Apple watchは、macのロックを解除する機能がある *1。これがすこぶる便利そう。

というのも、クラムシェルモードでmacを使っていると、パスワードを手動で入力する必要があるのだが(touch idが使えないから)、apple watchがあれば操作なしでmacのロックを解除できる。これはなかなか便利。クラムシェルモードで使っている人はこのためだけに買っても良いだろう。

…ただ、僕はクラムシェルモードで使ってないのであまり恩恵がない。普通にtouch idで解除したほうが早い。悲しい。

ほかの利点: バンドがつけやすくて蒸れない

ほかの利点として、バンドが使いやすいというのがある。伸縮性があり通気性もいい ので、長時間つけてても不快にならない。また、バックルがなくてバンドも薄くて柔らかいので、PC作業時などに外す必要もない。革ベルトや金属ベルトの時計だとどうしても作業の邪魔になりやすいので、これは地味に大きい。

まあ、革ベルトとかと比べると流石に見劣りする。そこは利便性とのトレードオフ。使い分けるのが良さそう。

バッテリーは思ってたよりもつ

実は結構前からほしかったんだけど、「バッテリーが丸1日ももたないのがなぁ…」というのがネックでずっと購入を見送っていた。けど、いざ買ってみるとそこまで気にならない。iPhoneとだいたい容量が同じなので、iPhoneを充電するタイミングで一緒にセットするみたいなルーティンになりつつある。

あと、急速充電ができるので1日1回程度で済んでるのもあり、今のところそこまで負担に感じてない。シャワー浴びてるあいだに充電終わってるくらいなのが有り難い。

felica は思ってたほど便利じゃない

まだ慣れてないのもあるが、felicaを反応させるのに結構苦戦する。 思ってたよりスムーズに支払いできない。これは慣れていけば解消されるのだろうか?

バンドが柔らかくてくるっと回して時計を手首側に移動させられるので、これを利用すれば良い感じになるのかな?まだわからん

まとめ: まあまあ

時計にしては高めだし 、言うほど便利ってわけじゃなかった。まあでも物欲を満たせたのでヨシ!

*1:同一Appleアカウントでログインしてる必要があるなど制約あり

電子ペーパーで卓上カレンダーをつくる

完成品

こんな感じのものができる。予定はgoogleカレンダーから引っ張ってきている。

完成品

8時間おきに画面を更新している。裏にraspberry piがついていて、これで画面表示を制御している。

ハンダ付けすらしてないので、電子工作といえるかはかなり微妙かも(ケーブル繋いでピン刺しただけ)

用意するもの

あわせると15000円程度で揃えられる (ACアダプターやケーブルは家に余ってると思うのでノーカン)。

ソケット同士を差し込んだりする作業しかないので、ハンダごてすら要らない。

電子ペーパーディスプレイの選び方

電子ペーパーのみ選ぶとき注意が必要なので解説する。

今回購入したのはコレ↓。よく分からなければとりあえずコレでよい。

(公式サイトより画像引用 )

7.5inch E-Paper E-Ink Display HAT (B) For Raspberry Pi, 800×480, Red / Black / White, SPI

選ぶときの主な観点は2つ。

  • 画面サイズと解像度 (インチ数が同じでも解像度が異なるパターンがある)
  • いくつ色がつかえるか
    • 赤や黄色など、他の色も使えるか?
    • 白と黒の2色のみか? 灰色も使えるか?

サイズと色を決めたら、ドキュメント もチェックしておく。 ドキュメントにpythonのデモが入っているものを選ぶとよい。 C言語しかデモがないと大変だと思うので。

カレンダーの作成手順

全体の手順はこちら。各手順の詳細は後半に記載。

  1. raspberry piのセットアップをする
  2. 電子ペーパーとraspberry piを接続する
  3. デモプログラムを実行して動作確認をする
  4. カレンダープログラムを書く

1. raspberry piのセットアップをする

ここでは簡単な流れだけ書く。もっと詳しい記事やドキュメントが大量にあるので、わからなければ他の記事をあたってほしい。

  1. Raspberry Pi Imager をダウンロードしてインストールする
  2. Imagerでwifiやsshの設定をする
  3. Imagerを使ってmicroSDカードにOSを書き込む (色々あるがLite版でよい)
  4. raspberry piにmicroSDカードを入れて電源を接続する
  5. raspberry piが自動的に立ち上がる

起動が完了すると ssh [設定したユーザー名]@raspberrypi.local で接続ができるはず。できない場合はwifiの設定などが間違えている可能性がある。

2. 電子ペーパーとraspberry piを接続する

まず、ドライバーHAT(小さい青いパーツ)の黒い部分を立てる。これがロックになっている。 ロックを外したらディスプレイのオレンジの端子を挿入する。 ロックしたままだとかなり力を入れないと入らない。

小さい青いパーツと電子ペーパーを接続した様子

ドライバーHAT(青い部品)とraspberry piの接続は簡単だ。GPIOピンを差し込めば良い。 結構深く刺さって固定されたら完了。

GPIOピンで接続されている様子

3. デモプログラムを実行して動作確認をする

必要な各種ライブラリをインストールし、デモプログラムを動かしてみる。うまくいくとこのような画面になる。

デモプログラムが動くとこのようになる

注意として、インチ数、解像度、色が合致しているデモプログラムを選ばないと動かない。 デモプログラムのファイル名にはインチ数しか書いてないので、ドキュメントに記載されているデモファイル名をチェックしよう。

4. カレンダープログラムを書く

あとはカレンダープログラムを書けば完成だ。 カレンダープログラムはデモプログラムをもとに改造すれば自ずと書けるはず。 なので解説は省く。各々でデザインしよう。

僕が作ったものはこんな感じ。このリポジトリをクローンしてセットアップしたらすぐ動かせる。

github.com

仕様はこんな感じ

  • googleカレンダーから自分のカレンダーのicsファイルをダウンロード
  • googleカレンダーから祝日のicsファイルをダウンロード
  • カレンダー画像を生成

そんなに難しいことはしてない。pillowというpythonライブラリで画像を作って、作った画像をディスプレイに送って表示している。

まとめ

今回 トータルで15,930円かかった (家にあったものを除く)。しかし、毎年ロールカレンダーを買っていた手間が無くなると考えれば 十二分すぎるほど安上がりだ。 個人的には大満足である。

javaだとかgradleだとか

最近チームを異動して、仕事内容がサーバーサイドとなってjavaとかkotlinを書いてるので、その備忘録的なものを書いておこうかなと。マジで右も左もわからん…

(※現段階の理解を雑に書きなぐってるので、多分間違えてるところがままある)

java/kotlin

  • kotlinはJava仮想マシンで動作するプログラミング言語で、コンパイルするとJavaのバイトコードに変換される
  • javaは null安全じゃない。これがとてもつらい。
  • kotlinはnull安全。とても快適。
  • kotlinもjavaも型システムがnominal
    • typescriptはstructuralでそっちに慣れてしまっているので、辛く感じることがある
  • kotlinは構文がとてもエレガント
    • ifが文ではなく式だし、when式もあるし、fun foo() = result みたいに書けるし、本当に快適
  • javaはコンパイルが(基本的に)必要な言語
    • .javaファイルをコンパイルするとjavaバイトコード(.classファイル)になる
    • シングルファイルであればコンパイルせずに実行できる(java11以降)

kotlinとjavaの関係はtypescriptとjavascriptの関係に似てる。kotlinはjavaにコンパイルできるし、javaより型が便利だし。

gradle

(maven は知らないので書けない)

  • gradle はビルドツール
  • gradle にプラグインを入れてjavaやkotlinをコンパイルする
    • javaプラグインを入れると src/main/java 以下においてあるjavaファイルたちがコンパイルされる (多分)
    • kotlinプラグインを入れると src/main/kotlin 以下においてあるkotlinファイルたちがコンパイルされる (多分)
    • kotlinからjavaを読み込んだりもできる
  • ./gradlew build でビルドしたり、 ./gradlew bootRun で実行したりできる
  • gradleの設定ファイルはgroovyかkotlin DSLで記述する
    • groovyはJavaプラットフォーム上で動作する動的プログラミング言語らしい (by wiki)
    • build.gradleはgroovy、build.gradle.ktsはkotlin DSL
  • build-logicというものを使うとビルドロジックを共通化できる
    • これがあんまわかってないんだよな…

gradle は結構フレームワークに近い動きをする。たとえば src/main/java に配置されたファイルをコンパイルする動作のあたりとか、特にフレームワークっぽいよね。

まとめ

こうして書き出してみるとそこまで複雑じゃないな。でもいざ書いてみると全然書けないんだよな……

onUnmountedはonMountedのなかで呼ぶとスッキリしやすい

vueのcomposition APIはどこで呼んでも問題ありません。たとえばonMountedのなかでonUnmountedを呼んでも良いです。

onMounted(() => {
  const handler = () => {};
  window.addEventHandler('event', handler);
  onUnmounted(() => {
    window.addEventHandler('event', handler);
  });
});

onMountedのときに使ったもの(handlerとか)をそのまま流用してonUnmountedを設定できるので、このパターンはかなり有用です。ぜひ使ってみてください。