平穏な生活を得るRTA

この記事は平穏な生活を送りたいぴょこりんクラスタ Advent Calendar 2022 のために書いたものです。 このアドベントカレンダーとは何なのかについては、主催者による紹介記事を見てください。

はじめに

異動により、今年の夏頃からカリフォルニア住まいになりました。 数えるほどしか海外旅行したことないのに、海外住まいが決まり、 平穏な生活がなくなってしまったわけです*1。 早く生活を平穏にしたいのですが、日本ではないので、適当にやっていては何とかなりません。計画的に物事を進める必要があります。 つまりこれは、新しい環境で平穏な生活を得るためのRTAと言えます。 この記事では、カリフォルニアで、自分ひとりの平穏な生活に必要な最低限のものを得るまでの過程を書こうと思います。

*1:本当に平穏だったかどうかはさておき

続きを読む

再帰関数書きたくない!!!(セグメント木編)

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

再帰関数はとっても便利なもので、これを使うと アルゴリズムがシンプルに実装できることがありますね。 競技プログラミングでもよく使われますが、 pythonだとどうしてもこういうのを書かざるを得ません。

import sys
sys.setrecursionlimit(200000)

これ、美しさを損ねている感じがしますし、なるべくなら書きたくないですよね。 それに、たかだかスタック領域のサイズ分しか入力を扱えないというスケーラビリティの問題もあります。 なので、書かないでなんとかしましょう。

今回は、セグメント木を再帰無しで書いてみます。

セグメント木とは?

配列のある範囲内の最大・最小等をうまく求めることができるようになるデータ構造です。 偉大な先人がていねいにまとめてくださっているので、詳細はそこを見るとしましょう。例えば以下です。

algo-logic.info

やってみましょう

今回は1つのソースコードに両方まぜています。 queryが再帰なし版、query_recと__query_recが再帰版になります。

セグメント木の場合は、再帰にすると引数が多くて紛らわしいですね。。。 ボトムアップ再帰なしでやるとシンプルな感があります。 ぐぐる再帰版が出てくることが多そうな印象がありますが、これに限っては再帰なくしたほうがわかりやすくないですかね?

さいごに

このコードはある程度は動く・・・かな・・・と思う・・・

送料無料になるまでカルディで何か買う

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。 このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

前回の記事で、こういうことを言いました。

このごまラー油とシラチャーソースの成功に味をしめたので、 次はカルディで送料無料になるまで食べたことない食べ物を買うことにしました。

有言実行。早速やりました。 カルディといえばコーヒーショップですが、カルディ以外で見たことない食べ物・飲み物を置いているお店ですね。豊かな生活には、食生活の充実が欠かせません。そういうわけで、カルディを選んでいます。

多様性を確保するには、ある程度量を確保する必要があります。カルディのオンラインストアは6480円以上で送料無料になりますので、6480円以上何かを買うことにしました。

買ったもの

単価が小さいので、送料無料になるまで買うと結構な量になります。カルディのオンラインストアは、 ネット在庫と店舗在庫が別れているようで、有名商品(杏仁豆腐とか)は結構な割合で在庫切れになっていました。

f:id:nbisco:20211216195601j:plain
買ったもの

一覧は以下になります。おいしかったものリストは食べておいしかったものなので、いわゆるおすすめ品です。 豆乳ビスケットと、レモネードベースが特によかったです。豆乳ビスケットは飽きがこない味つけで、かつ 味のバリエーションが多くて長く楽しめます。レモネードベースは、激甘歯痛味ではなく、すっきりとした 味にできるのがよいです。ただ、薄める感覚がよくわからないので、最初は水多めがよいと思います(濃すぎた結果、 大きめマグカップ1杯レモネードができる事案になった)。

一番不安なのは塩レモン味のパスタソースで、塩振った素パスタになるんじゃないかとビクビクしています。いやそんなことはないだろうと思うんですけどね。あと、ヒマラヤピンクソルトは普通の塩と味が違うのかが気になりますね。

[12/19追記]ロイタイのガパオペーストの味は最高でしたが、如何せん自分には辛すぎて食べきれませんでした。。。

  • おいしかったもの
    • 豆乳ビスケット アソートパック 18枚
    • シチリアン レモネードベース 500ml
    • ミレービスケット コーヒー風味 100g
    • ティラミスダックワーズ
    • クレームブリュレダックワーズ
    • 小倉あんバター 140g
  • おいしいが辛すぎて食べきれなかったもの
    • ロイタイ ガパオペースト 80g
  • 名前は知ってるけど食べたことなかったもの
    • キャンベル クリームパンプキン Jラベル 305g(3人前)
    • キャンベル クラムチャウダー Jラベル 305g(3人前)
  • かなり高い確率でおいしいことが期待できるもの
    • シャリっと林檎ジュース 155g
  • 未知数だけど結構期待してるもの
    • デリッチオ パルメザンチーズ(粉チーズ) 80g
    • 北海道から 9種のスパイスにこだわったスープカレー 230g
    • ムーチョ・アロハ ハワイアンスタイル・ペールエール 355ml
    • 肉バル缶 砂肝のアヒージョ 70g
    • スタミナ丼の素 100g
    • DFE ルーロー飯の素 55g
    • 海老仕立て味噌鍋つゆ 2-3人前
    • タッカルビの素 2p
    • さば缶deご飯 焼きさばご飯の素 50g
  • 未知数でかつ味の想像がつかなくて不安なもの
    • 塩レモンパスタソース 30g
    • スパイスアップ ヒマラヤピンクソルト(ミル付き) 110g

おわりに

カルディのお菓子はおいしかった。レトルト食品は未知数なのでこれからが楽しみ。

最近買った調味料の話

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。 このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

生活の豊かさは、調味料にも現れると思います。 要は、豊かな生活をしていると、以下の2つをどちらか、もしくは両方を満たすということです。

  • 質の高い調味料を持っている
  • 普通買わない(ある意味変わった)調味料を持っている

僕は豊かな生活に憧れがありますので、今回は普通買わなそうというか、 そんなにメジャーじゃないかもしれない調味料を買ってみた話をします。

何買った?

ごまラー油とシラチャーソースを買いました。

ごまラー油は、ごま油で安定のかどやから。 www.kadoya.com ごまラー油は、文字通りごまの香りが強いラー油です。 単に辛さでアクセントをつけるだけでなく、ごまの香りがとがった辛さを中和する感があり、和っぽいものに合うような気がします。 自分はよくうどんにかけて食べています。七味だとちょっと香りが足りない、ラー油だと単に辛いだけになってしまう、という痛し痒しのところをうまく埋められる調味料だと思います。

シラチャーソースは、あまり良し悪しはわからないけど、有名そうな フラインググースのものを買いました。

https://www.yodobashi.com/product/100000001003480126/

フラインググースのシラチャーソースはそこまで辛くなく(カルディで買える龍のマークのシラチャーソース比)、 割と何でもかけられる気安さがあります。辛さのあとの爽やかな感じがいかにもタイとかベトナムとかのあたりの料理を思い起こさせます。ガパオや海南鶏飯にちょっとだけかけてそれっぽい雰囲気を出したり、焼きそばにかけてさっぱり食べたり、トマトソースパスタにかけてちょっとひねった味を楽しんだりしています。お気に入りは焼きそばで、焼きそば特有のべたっとした感じを中和できるのがよいです。

おわりに

ふだん食べるものがよくなると、ちょっと豊かな生活を送っているような気がします。 調味料だと金額もたかが知れているので、贅沢感のコスパもよいです。 このごまラー油とシラチャーソースの成功に味をしめたので、 次はカルディで送料無料になるまで食べたことない食べ物を買うことにしました。

子どものためという名目で買ったが親が案外楽しく読んでる本

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。 このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

自分の親はこと本に関しては不自由なく与えてくれたし、 子どもにはいっぱい本を読んでもらいたいと思っているので、 本は惜しまず買うようにしている。

まだ子どもは小さくてしゃべれないので、本を自分で選ぶことはできない。 そうなると必然的に親が選ぶことになるので、子どもが興味を示したものを 補強したり、興味の幅を広げると言う名目で親の趣味を出したりする。

今回は、そんな感じで買った本のうち、親がつい楽しく読んでしまう本を紹介する。

子どもも親も気に入っている本

書き出してみるとほぼ全部図鑑だった。

# 題名 メモ
1 小学館の図鑑NEO 野菜と果物 普段目にしそうな野菜・果物を載せている。子どもは好きな野菜を指差して親に読み上げさせて楽しんでいる。親は漢字表記を見たり、この野菜は何科なのかを見たりして楽しんでいる。ちなみに、ピーマンの漢字表記は甘唐辛子らしい。すごく納得感がある。
2 小学館の図鑑NEO 乗りもの 子どもはみんなはたらく車が大好きですよね。はたらく車だけでなく、電車も飛行機も指差して名前を読み上げさせることで楽しんでいる。船はまだよくわからないのか、船に乗っている車を指差して遊んでいる。親は工事車両を眺めるのが結構楽しい。
3 小学館の図鑑NEO+ 分解する図鑑 身近な乗り物・建物の部品構成、地下道の断面図や、料理の材料が載っている。子どもはエレベータ、電車、自動車の構成図が好きで、部品を指差して名前を読み上げさせることで楽しんでいる。時折名前を知らない部品が混ざっていたりするので、親は緊張感がある。
4 めくって学べる もののしくみ図鑑 #3よりも簡易なもの。子どももお気に入りはボールとコンテナ船。
5 めくって学べる きかいのしくみ図鑑 #3よりも簡易なもの。子どももお気に入りは傘とごみ収集車。
6 ZOOLOGY 図鑑 動物の世界 いろんな生き物が載っている。開くと手当り次第に指さして楽しんでいるようだが、いかんせん重すぎて持てないので出番が少なめ。ガチ図鑑なので親は普通に楽しんで読んでいるが、重すぎるので出番が少なめ。 
7 地下鉄のできるまで トンネルを掘るところから地下鉄を動かすところまでを絵本にしたもの。絵本だから子ども用かと思いきや、大事なところは全部書いているので大人も楽しい。

おわりに

子ども向け図鑑とは言え、抑えるべきところは抑えているので、 親が読んでも楽しく読めますね。

再帰関数書きたくない!!!(トポロジカルソート編)

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

再帰関数はとっても便利なもので、これを使うと アルゴリズムがシンプルに実装できることがありますね。 競技プログラミングでもよく使われますが、 pythonだとどうしてもこういうのを書かざるを得ません。

import sys
sys.setrecursionlimit(200000)

これ、美しさを損ねている感じがしますし、なるべくなら書きたくないですよね。 それに、たかだかスタック領域のサイズ分しか入力を扱えないというスケーラビリティの問題もあります。 なので、書かないでなんとかしましょう。

今回はトポロジカルソートを再帰なしで書いてみます。

トポロジカルソートとは?

Directed Acyclic Graphという、辺に向きがあってかつサイクルがないグラフの 並び替えです。辺の指し元が前、指し先が後に来るように並び替えます。 指し元と指し先の順序だけを規定するので、以下の図のように何パターンかあり得ます。

f:id:nbisco:20211206232911p:plain
トポロジカルソートの例

身近なところでは、Makefileコンパイル順序を決めるのに使っていたりするようです。

トポロジカルソート自体はすごく簡単にできて、深さ優先探索の帰りがけ順にノードを 記録して、最後に逆順にするだけです*1

やってみましょう

動作確認はここでやりました。

再帰あり版

帰りがけ順なので、自分が指し元となるノード全てに対して深さ優先探索をしたあとで、 自ノードを回答に追加します。

再帰なし版

単にスタックを使うだけ・・・とはいかず、帰りがけ順なので、きちんと自分が 指し元となるノード全てを調べ終えたあとかどうかを判定して、回答に追加します。 再帰を使ったときに比べて長いしわかりにくい感じがしますね。代償が大きくない?

ただ、再帰を使わないおかげで、扱える入力サイズはこちらのほうが大きいですね。

さいごに

まあ再帰使えるときは使ってもいいような気がしてきますね。

在庫管理ってけっこう大変だよね

この記事は異世界行ったら本気だすぴょこりんクラスタ Advent Calendar 2021のために書いたものです。このアドベントカレンダーそのものに関しては、主催者による紹介記事を見てください。

はじめに

ここ2年くらい、消耗品はいくつもまとめて買うようになった。 そうなると困るのは数の管理であり、買い物のたびにあれ買うんだっけとか、 そろそろこれが切れそうとかを覚えておくのも大変になったので、 まずは数だけでも管理できるようにした。

完成品

ソースコード

github.com

README作ってないので、代わりに

  • 道具
  • 立ち上げ方
    • Makeでビルド
    • できたバイナリを実行すると、デフォルト12000番ポートで立ち上がる。-port <port#>をつけるとport#で立ち上がる。

動作イメージ

トップ画面はこんな感じで、最終更新日が古いものから順に品名と数がひたすら並ぶ。 プラスボタン/マイナスボタンでそれぞれインクリメント/デクリメントを行い、 ゴミ箱ボタンでエントリそのものを消す。 メニューボタンは数を大幅に変えたり名前を変えたいときに使うが、基本使わない。

f:id:nbisco:20211128234520p:plain
トップ画面

カテゴリごとにフィルタもできる。 filterを押すとメニューが出てきて、一旦全部見えなくなる。 チェック入れたものだけ見られるようになっている。

f:id:nbisco:20211128234553p:plain
フィルタ画面

追加はシンプルにフォーム。

f:id:nbisco:20211128234610p:plain
追加画面

設計

以降、作るときに意識したことを書いていく。

要件

要件は以下とした。品数のメンテがだるいのはともかく避けたかったので、 手軽というかまあ許せるくらいに簡単なもので、かつそんなに作るのに苦労しないものをめざした。

# 要件 対応方針
1 ぱっと見で何がどれくらいあるかわかる 品名と数だけ表示し、更新日時等は出さない
2 スマホでもPCでも使える Webアプリとし、レスポンシブに動くようにする
3 品数メンテ時に文字入力させない インクリメント/デクリメントボタンで増減できるようにする
4 探しやすくする カテゴリでフィルタをかける

アーキテクチャ

いくつかAPIを用意し、それをブラウザから適宜叩くようにする、 (たぶん)よくある感じのウェブアプリとした。

UI

問題なのはレスポンシブに動くようにするところ、画面に合わせてデータを取得したりすることだった。 前者はCSSフレームワークにVanilla Frameworkを使ったら実現できてしまったので、 特に考えることはなかった。 後者は、特にフレームワークに頼らずともJavaScript使うだけでなんとかなってしまった。 async/awaitのおかげで素人でもあまり困らずにこの辺なんとかできてしまいますね。

APIモデル

consumable-itemオブジェクトが1個あるだけ。全部リクエスト同期で処理する。 インクリメント/デクリメントはPATCHとかPUTとかとはちょっと性質が違うのではと 思って、オブジェクトにくっついてる特殊操作扱いにした。 これでよかったかは謎だが、特に困ってはいない。

# HTTP Methodとendpoint 概要
1 GET /api/v1/consumable-items 管理品一覧取得
2 GET /api/v1/consumable-items/:id id指定で管理品取得
3 POST /api/v1/consumable-items 管理品新規作成
4 POST /api/v1/consumable-items/actions/plus-one/invoke id指定で管理品の数をインクリメント
5 POST /api/v1/consumable-items/actions/minus-one/invoke id指定で管理品の数をデクリメント
6 PATCH /api/v1/consumable-items/:id id指定で管理品情報修正
7 DELETE /api/v1/consumable-items/:id id指定で管理品情報削除

データモデル

品名、数、カテゴリを1つエントリで持つ。 カテゴリに関してはテーブルを分けようかとも思ったが、 使っていると結構気軽に分類を変えることがわかった(最初はキッチンでまとめていたが、出し入れが激しいので別枠を作って管理するとか)ので、 1つにして、テーブル間の同期を考えないようにした。 大した量もないので、これでも問題ないはず。

type Consumable struct {
   Id          uint32    `gorm:"primaryKey" json:"id"`
   CreatedAt   time.Time `json:"created_at"`
   UpdatedAt   time.Time `json:"updated_at"`
   Name        string    `json:"name"`
   Count       uint32    `json:"count"`
   Category    string    `json:"category"`
   SubCategory string    `json:"subcategory"`
}

おわりに

けっこう便利に使っているが、結局日々のメンテがいちばん大変なのであった。 次は数のメンテが楽になる何かを作りたいですね。