matobaの備忘録

とあるプログラマーのブログ。ソフトウェア開発、執筆活動、ライフログ。

洗濯機を買い替えた話

ご無沙汰しています。

7月頃、洗濯機を買い替えたのですが、買い替えてから数ヶ月が経ちました。 今回は、その話をしようかと思います。

概要

以前から洗濯機を買い換えたいとは思っていました。いろいろ、買い換えるタイミングになったので買い換えたという状況です。

一番大きい理由は、引っ越したからです。先日、ブログ記事に書きましたが、6月下旬に引っ越しました。引っ越したことで、条件が整ったので買い換えました。

引っ越し前は、スペース的問題で洗濯機を設置できなくて買い換えたくても買い換えられないという状況だったのですが、引っ越して色々スペースができ、買い換えられるようになったのでした。

で、待望の新しい洗濯機に買い替えたのですが、すごく良いです。

ここでは、なぜ買い換えたのか、買い換えた後の感想を書いておきます。

どんな洗濯機に買い替えたのか

買い換えた洗濯機は、これです。

panasonic.jp

お値段が27万ほどかかっていて、なかなか高級な洗濯機だと思います。 いいお値段するとは思いますが、「買ってよかった」と思っています。

そもそもの話として買い換える前は、独身時代に使っていた一人暮らし用の縦型洗濯機を結婚してもそのまま使っていました。 独身時代に使っていた洗濯機は、本当に必要最低限のもので、値段にしても1万台のものだったと思います。なので、比べるとかなり高価な洗濯機になりました。

ドラム式洗濯乾燥機はすごく便利

買い換える前から予想していましたが、ドラム式洗濯乾燥機はすごく便利ですね。

何が便利かというと「洗濯の時に洗濯が終わるのを待って、干す」ということをやる必要がなくなったのがすごく便利です。洗濯を開始したら乾燥したい服が出てくるので、「洗濯物が溜まった」と思ったタイミングで、ボタンぽちぽちっと押して洗濯をセットすれば良いのはすごくありがたいです。

ちなみに夜中に洗濯するのが気になることもあります。そういう場合は洗濯の予約があるので、衣服を入れておいて、7時間後に開始する予約をすることもあります。

洗濯の流れを考えて生活をスケジュールする必要がなくなりました。

洗剤の自動投入機能が予想外に便利

それから「便利らしい」と聞いて、つけた機能に「洗剤の自動投入機能」があります。これがなかなか便利です。

買う前は「洗剤くらい自分で測って入れたらいいのでは?お金を出すほどの機能かなあ?」とか思っていました。ですが実際に使ってみると、この機能はつけた方がいいです。

自動投入機能によって洗剤をどれくらい入れるかを考える手間がなくなりました。 また、柔軟剤と洗剤を投入する場所を間違えたり、柔軟剤を入れ忘れることもあったのですが、それもなくなりました。

とりあえず服を入れてボタンを2回押すだけで洗濯が始まって乾いた衣服が出てくるのは楽で良いですね。

油断してると服が縮んでしまう

これは普通に僕が悪いのですが、何も考えずに衣服をぽいぽいっと洗濯機に入れて回してると、服によっては縮むことがあります。 これまでは浴室乾燥機で服を乾燥させていたのですが、その時は機にする必要がなかったことを気にする必要がある、と言うのはあります。

なお、私は、乾燥機で縮む衣服を買わない方向にしようかなあ、と思っています。(洗濯時に考えるのがめんどいので)

どうして買い換えたのか

洗濯機を買い替えたのは、それまでの洗濯の流れが、生活に合わなくなったからです。

洗濯は日々の生活の中に組み込まれているので、それを楽にするために買い換えました。

独身生活では浴室乾燥機が便利だった

買い換える前、洗濯した服は、浴室乾燥機で乾燥させていました。

今は引っ越したのでそうでもなくなりなったのですが、引っ越し前の家では外に干すと洗濯物が排気ガスまみれになってしまいます。なので、外には干せず、基本は室内干しが基本になるのですが、室内干しだとなかなか乾かないと問題があります。あと狭いですし。

なので、私は浴室乾燥機がついている物件を選んでいて、基本的に浴室乾燥機を使って洗濯物を乾かす生活を送っていました。外に洗濯物を干す場合は、朝に干して夜に取り込むなど天気と時間に洗濯スケジュールが左右されますが、洋室乾燥機を使っていれば、その依存を解消することができます。

思い返せば、独身時代や一人で住んでいる場合、浴室乾燥機を利用することで快適に生活できていたと思います。

結婚すると浴室乾燥機では辛くなっていった

浴室乾燥機は、独身時代は良かったのですが、結婚して二人になると浴室乾燥機では辛くなっていきました。

働いている人あるあるだと思うのですが、洗濯物を土日にまとめて洗うことがあるんですよね。平日の夜は何かしらの予定があることもありますし、洗濯物を回して干す前に寝落ちして、「うわー、洗濯物干してねえー」ってなることもあるので、時間的余裕のある土日に洗濯しようとするわけです。

ただ、共働き二人で生活し始めると、土日になった時に洗濯物が溜まりすぎているんですよね。洗濯物が溜まりすぎていると浴室乾燥機はなかなか使いにくいわけです。

共働き二人では浴室乾燥機は辛い

共働き二人では、二人分の1週間の洗濯物を土日にまとめて洗濯しようとします。すると、衣服を洗濯しても、浴室乾燥機に入りきらない状況になるんですよね。 お風呂場はそんなに大量の洗濯物を干せるほど広くないので当然です。

とは言え、洗濯してしまった洗濯を干す場所は、浴室乾燥機以外にありません。なので、ぎゅうぎゅうに詰めて、浴室乾燥機に入れて乾かそうと試みるわけです。

すると、当然ながら、なかなか乾かないわけです。なので、定期的に乾いたものを間引くとか、乾きやすいものから洗うとか、そもそも洗濯のタイミングをちょっとズラすとか、浴室乾燥機の稼働を管理するような状態になってきます。

これがなかなか辛い。 途中から、浴室乾燥機を使うのを諦めて、コインランドリーの乾燥機を使うことも増えていました。うーむ。

この問題を解決したくて、ドラム式洗濯乾燥機の購入を検討しました。

ドラム式洗濯乾燥機を買う場合の問題

同じようなことを考えて、ドラム式洗濯乾燥機を買いたいと考えている人はいると思います。 そんな時に問題になったのが次の二つです。

  • ドラム式洗濯乾燥機は高い
  • ドラム式洗濯乾燥機はでかい。

ドラム式洗濯乾燥機は高い

これについては、単純にお金を貯めるしかないのですが、まあ普通に高いですよね。 なので、買う前にある程度の覚悟が必要だと思います。

うちの場合は、「お金を使って家事の手間を減らしたい」という考えで一致していたので、普通に貯金して買いました。妻が長期出張に行く約3年前からコツコツ貯金した感じでした。

今時は、比較サイトを見れば、だいたい主要な洗濯機は洗い出せます。 なので、主要な洗濯機を洗い出した上で買う機種の方向性を考えます。 それから、価格.com などを見れば相場感もわかります。 洗濯機の寿命なども調べると、現実的な予算が見えてきます。 あとは、予算を夫婦で合意したら予算を貯めつつ貯金から捻出、という流れを踏みました。

ドラム式洗濯乾燥機はでかい

これは一人暮らし用の洗濯機を使っていたときは考えてませんでした。 とりあえず「お金を貯めれば良い洗濯機を買える」とだけ思ってました。 しかし、ドラム式洗濯乾燥機を置けるかどうかは住んでいる物件によります。

ドラム式の洗濯乾燥機はでかいので、物件によっては搬入が困難だったり、設置できない状況があります。 実際、1LDKの物件に住んでいた当初は、玄関口が特殊に曲がっていたのもあり、搬入できませんでした。ぐぬぬ。

「ドラム式洗濯乾燥機が買いたい」という人は、「場合によっては引っ越しを挟まないと買えない」ということを知っておくと良いと思います。

買うにはある程度の準備が必要

まとめるとドラム式洗濯乾燥機を買うためには、ある程度の準備が必要になります。 一人用の洗濯機を購入したときは「とりあえず洗濯機がないから、購入する」くらいの温度感で購入した記憶があります。 でも、今回の購入では価格や物の大きさなどによって準備が必要になりました。

あと、価格も安くないですし、ある程度長く使う物なので、どれを買うかの検討に時間が必要でもありました。

どこでドラム式洗濯乾燥機を買ったか

ドラム式の洗濯乾燥機を買いましたが、前述した通り安い買い物ではないです。

ここまでに記載していたように、どの製品を買うかの選択は、公式のカタログやWebの情報をもとに考えていました。なので通販で買うこともできるのですが、実際どう考えて、どこで買ったか、などを買いておきたいと思います。

販売店での値段の差は細かく考えなかった

これは最初に予算を決めてお金を貯めた後にいざ購入するぞ、と進めたこともあり、販売店でどれくらい値段の差があるかを細かく考えませんでした。予算に収まっているかどうか、を見ていたように思います。

そもそも、価格.com などを眺めていると大型の家電は、時期によって値段が変わるのがわかります。家電は定期的に新しい型が出ることもありますし、型落ちしたものは値段が下がります。なので、安くなるタイミングを狙うと欲しいものがより安価に手に入るかもしれません。

価格.com - パナソニック NA-VX800AL 価格推移グラフ

今回は、別記する在庫問題があったので、在庫があることを優先して販売店を決めました。

在庫があった近所の電気屋で買った

結局のところ、近所の家電量販店で購入しました。

予算と買いたい機種を決めている時点でどこでも良かったと言えば良かったのですが、Webで買おうとすると、在庫が尽きていて注文できない現象に当たりました。

理由がよくわからなかったので、近所の家電量販店にいって、在庫がないかを確認していたところ、実は製造に関係がある工場で火災があり、新しく入ってくる目処が立っていないことがわかりました。

mameken.blog

で、「困ったなあ」と思いながら、近所の家電量販店の店員さんと相談をしていたところ、偶然、予約確保してたものがキャンセルとなったようで、欲しかった機種の在庫が復活しました。そこでラッキーと思い、洗濯乾燥機の購入に至りました。これはラッキーでした。

大型家電の在庫があるとは限らない

どこで買うか問題の話を書きましたが、大型の家電になると一つ一つの単価が高いのもあり、生産数にも限りがあるように見えました。

私は「大量生産の大量廃棄するような機器ではないものは買い方が変わってくる」と言うことがよくわかっていなかったので、洗濯機を買う人はその観点も知っておくと良いのかもしれません。

最近も半導体が不足しており、云々かんぬんというニュースが流れていますが、またそういう影響もあるのかもしれません。

そういえば、最近、「車を買うといくらくらいかかるのかなあ(チラッチラッ」と車の様子を伺っているのですが、車業界も半導体不足で生産が遅れているらしいですね。

終わり

今回は、洗濯機を買い替えた話をつらつらと書いてみました。 他にも家電や趣味のもので買ったものはあるので、気が向いた時に紹介したいと思います。

ではでは。

引っ越しました(2021年)

ご無沙汰しております。

少し前に引っ越しました。 今は引っ越しに関する話も落ち着いています。 報告ブログを書いておきます。

引っ越しました

引っ越したの2021年6月下旬です。 「引っ越したい」という気持ちは、数年前から抱いていたのですが、諸々の状況が整うタイミングを待っていました。今回は、タイミングが来たので引っ越したという状況です。

引っ越したい理由

引っ越したいと考えていた理由はたくさんあるのですが、例えば次のような理由で引っ越したいと思っていました。

  • 部屋が狭くて、自宅での活動に諸々の不便を感じていた
    • 趣味のものが買えない
    • 仕事スペースと趣味スペースが混ざる
    • 住居が狭くて家具を新調したり、家電を買い替えられない
  • 大通りに面していて、ストレスが溜まっていた
    • 窓の外が車の走行音がいて、うるさい
    • 排気ガスがすごくて窓を開けてられない
  • 自宅の回線速度が遅くて、辛い
    • 物件にネット回線が付属していて、工事が拒否されている

コロナ禍で自宅生活が増えたのもあり、誰もがストレスを貯めていましたが、私も例外ではなくてストレスが溜まっていたのだと思います。

なぜ、これまで引っ越さなかったのか

そもそも、これらの問題はコロナ前からあって、ストレス要因になっていました。ただ、タイミングが悪いと思っていたので、待っていました。妻が2018年ごろからベトナムに長期出張に行っていた都合上、帰国を待った後に引っ越そうと思っていた感じです。

また、妻の出張も予定では2020年4月には戻る予定だったのですが、コロナの影響でズルズルと伸びて伸びて、やっと2020年12月に帰国でき、帰国してからも諸々の話があり、まとまって引っ越したのが2021年6月だったという感じです。住居問題、長かった。

どこに引っ越したか

引っ越し先は、東京都ですが、23区ではなくなりました。 前は、江東区の亀戸のあたりに住んでいたのですが、西の方に移動した感じです。(具体的な場所はここでは控えます。) なお、亀戸は食事が安くてうまい街でした。 亀戸でおすすめの店が知りたければ聞いてください。

以前は1LDKに住んでいたのですが、引っ越し後は3LDKになりました。 広くて素晴らしいですね。

ちなみに、現在、絶賛リモートワーク中ですが、一応オフィスのある池袋に通勤できる位置ではあります。

なぜ、そこに決めたか

前述したようなストレス要因が解消できる物件を選びました。 当たり前ですが、夫婦で引っ越すので、私も妻も住居に対して想いはあるし、いろんな要求があるのですが、それをいい感じに満たす物件を探すのが難しかったです。

お互いに「ここは譲れない」「これはMUST」みたいな要件が大量にあるものの、家賃はできるだけ抑えたいというのがあり、納得いくまで物件を探していたら時間がかかりました。妻は、室内の設備や通勤経路の話が多く、私は、固定費となる家賃と部屋の広さの話が多かったように思います。

結局のところ、いろんな住宅探しサービスで通知を受け取るようにしたり、定期的に条件に合う物件をピックアップして、何度も内見に行くという繰り返しでした。要は、実際の物件を見ながら期待値を調整していくことになりました。

その結果、時間はかかったものの満足いく引っ越し先になったように思います。 日を跨ぎながら何度も内見させてもらったりやりとりさせてもらった賃貸の仲介業者さんには大変お世話になりました。

今回、物件探しが長くなりそうに思ったので、賃貸の仲介業者さんは知り合いに紹介してもらった方に担当してもらったのですが、紹介してもらった仲介業者さんだと、気長に対応してもらいやすいのでよかったように思います。 また、メールベースで話を進めたり、zoomを使って契約や相談できたのもよかったです。

引っ越し後の生活はどうか

非常に良い感じです。

例えば、部屋が狭くて買うのを控えていたものをたくさん買いました。 個人的なものから家具や家電などなど。 一つ一つ紹介したいところですが、時間がないので、今回は省きます。

また、新しい家の近くは静かなので、夜は窓を開けて涼むことができます。排気ガス臭くもないし、快適です。 あと、光回線が入ってるマンションにしたので、当然ネットの速度はぼちぼち早くなりました。

引っ越す前に住んでいた亀戸に比べると、食事する場所は少なくなったように思いますが、まあ今後、開拓していけばいいかな、と思っています。あと自分で料理もしてるのですが、キッチンが広くなったので、いろいろやりやすくなりました。

今後の話

オフラインの勉強会イベントへの参加は少なくなるだろうなあ、と思っています。 コロナ前は、平日の夜に秋葉原等で開かれてるオフライン勉強会にふらっと参加することもありましたが、引っ越したことで遠くなり、流石に難しくなると思います。 とはいえ、ある程度予定されたイベントに参加することはできると思うので、機会があれば参加していきたい気持ちはあります。

ただ、自宅が広くなったことで、個人的な制作・創作はより捗る方向だと思っています。 諸々、購入した設備もあるのですが、そのうち紹介していきたいですね。

今回は、こんな感じで終わります。 ここまでお読みいただき、ありがとうございました〜

DRFでURLパラメータでリソースを指定してViewSetやRouterを作りたい

DRFでURLにパラメータを含んだRouterを作りたいと思った。

調べたところ、次の質問にたどり着いた。

stackoverflow.com

stackoverflow.com

まず、以下のような形で、正規表現を作る。

router.register(
    r"project/(?P<project_id>\d+)/task",
    ProjectTaskViewSet
)

そして、ViewSet側では、 lookup_url_kwarg を指定して、それを元にQuerySetを絞り込む。

from rest_framework.mixins import ListModelMixin
from rest_framework.viewsets import GenericViewSet

class ProjectTaskViewSet(ListModelMixin, GenericViewSet):

    queryset = Task.objects.all()
    serializer_class = ProjectTaskSerializer
    lookup_url_kwarg = "project_id"

    def get_queryset(self):
        project_id = self.kwargs.get(self.lookup_url_kwarg)
        return self.queryset.filter(project=project_id)

docker-composeでMySQLの起動を待つ

docker-composeでMySQLコンテナと、MySQLのDBを利用するアプリケーションがある時、DBを利用するアプリは、MySQLコンテナの起動を待ちたい。

docker-composeの depends_on で以下のように指定したもアプリのコンテナが起動しはじめるの早すぎて、接続エラーが出ていた。

version: '3'

services:
 web:
   ... 略
   depends_on:
   - db
 db:
   image: mysql:5.7
   ... 略

少し調べると、depends_onにはShort SyntaxとLong Syntaxがあるらしい。

参考 : Docker Compose の depends_on の使い方まとめ | gotohayato.com

なので、Long Syntaxを利用して以下のように書いてみる。

version: '3'

services:
 web:
   ... 略
   depends_on:
     db:
       condition: service_healthy
 db:
   image: mysql:5.7
   ... 略

するとdocker-compose upしたタイミングで次のエラーが出た。

container for service "db" has no healthcheck configured

どうやらどうやってhealthcheckするかの設定は自分で書く必要があるらしい。

良い設定を探したところ、stackoverflowで以下のスレにたどり着いた。

stackoverflow.com

mysqladmin pingを実行してヘルスチェックにする方法が紹介されていたので、以下のように記載した。

version: '3'

services:
 web:
   ... 略
   depends_on:
     db:
       condition: service_healthy
 db:
   image: mysql:5.7
   ... 略
   healthcheck:
     test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
     timeout: 20s
     retries: 10

これで、うまくMySQLの起動を待てるようになった。

ヘルスチェック時に、以下の警告が出るので、コマンドを微調整しておく。 Access denied for user ‘root’@’localhost’

     test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-u", "mysql", "-pmysql"]

django-filterを軽く動かしてみる(DRF編)

昨日、django-filterを動かした記録を書きました。 次は、DRFで利用する前提で動かしてみた記録を書きます。

前提

以下、記事から続く形で動かしていきます。

blog.mtb-production.info

前回の記事にも書いたことと重複しますが、基本的にドキュメントに書いてあることを斜め読みしながら動かしつつ、気になった部分のドキュメントやソースを僕が読んで記録していく記事です。間違っている可能性はありますので、より確かな情報は各自ドキュメントやソースを読んでください。

DRFで使う

そもそもDRFとフィルター

そもそも、DRFには、FilterBackendという概念がある。

Filtering - Django REST framework

ドキュメントをざっと読みしたところ、次の経緯で作られたと考えると、自分にとってはわかりやすいと感じました。(あくまで私の解釈です)

  • DRFで一覧を取得するAPIを作る場合、ListAPIViewを使う
  • 絞り込みを実装したい場合は、 get_queryset() に実装する
  • ただ、これだと次のような時に困る
    • 複数のListAPIViewで共通化したFilterを使い回したい時
    • 既存の検索や絞り込みを利用したい時
  • というわけで、次の対応を行なった
    • DRFでは、絞り込み処理部分をクラスとして定義できるようにした。これをFilterSetと呼び、定義方法やページネーションとの差異を吸収するためにFilterBackendができた。

django-filterはDRFのFilterBackendに使える形式になっていますが、django-filter以外のもDRFで利用できるFilterがあるようです。

DRFドキュメントの末尾で以下のものが紹介されていました。

  • django-filter
  • django-rest-framework-filters
  • djangorestframework-word-filter
  • django-url-filter
  • drf-url-filter

今回は、django-filterを動かしてみます。 今後、気が向いたら動かしてみたいと思います。

DRF側でdjango-filterを導入する前の状態

とりあえずdjango-filterを導入する前に、DRF側でAPIを作っておきます。

serializersに以下を追加します。

from rest_framework import serializers

from myapp.models import Product

class ProductSerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Product
        fields = ["name", "price", "description", "release_date"]

viewsに以下を追加。

from rest_framework import viewsets
from myapp.models import Product
from myapp.serializers import ProductSerializer

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer

urls.pyに以下を追加。

from django.urls import path, include
from rest_framework import routers

from myapp.views import ProductViewSet

router = routers.DefaultRouter()
router.register(r"products", ProductViewSet)

app_name = "myapp"
urlpatterns = [
    path("", include(router.urls)),
]

この状態でブラウザブルAPIを確認して表示されることを確認しておく。

f:id:mtb_beta:20210807195359p:plain

DRF側にFilterBackendを設定する

ListAPIViewの絞り込み結果に、FilterSetを利用するためにはViewに以下の差分を追加します。これで、有効化されます。

@@ -1,5 +1,6 @@
 from django.shortcuts import render
 from rest_framework import viewsets
+from django_filters import rest_framework as filters
 from myapp.filters import ProductFilter
 from myapp.models import Product
 from myapp.serializers import ProductSerializer

...

 class ProductViewSet(viewsets.ModelViewSet):
     queryset = Product.objects.all()
     serializer_class = ProductSerializer
+    filter_backends = (filters.DjangoFilterBackend,)
+    filterset_class = ProductFilter

この状態で、ブラウザブルAPIを開くと、Filterボタンが追加されてました。

f:id:mtb_beta:20210807200204p:plain

モーダルでパラメータを渡せるようになって動作確認ができました。

f:id:mtb_beta:20210807200311p:plain

簡単ー!!

あとは、Djangoの時と同じくFilterクラスを修正すれば検索クエリを実装できそうです

なお、django-filterのFilterSetをDRFで利用するためには、Viewに filter_backends = (filters.DjangoFilterBackend,) を指定する必要があるのですが、settingsで以下のように書いておくと、プロジェクト共通の設定として、済ませることができるとのことです。

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        ...
    ),
}

おまけ

DRFにとってFilterBackendの指定はなぜ必要か

DRFの仕組みを調査している際に、以下のようなことが気になりました。

  • DRFにとってFilterBackendの指定はなぜ必要か?
  • FilterBackendの処理で何をしているのか?

というわけで、次の二点が知りたくて、実装を調査してみました。

  • DRF側のFilterBackendの読み込み実装と経緯など詳細
  • django-filterのFilterBackendの実装など詳細

すると、まず、FilterBackendでページネーションやSchema自動生成との兼ね合い、FilterSetクラスなどを処理してるというのはわかりました。

また、元々、django-rest-frameworkでDjangoFilterBackendと呼ばれる処理を持っていたが、途中で非推奨となり、django-filterのDjangoFilterBackendが推奨となったという、雑学が手に入りました。

github.com

終わり

とりあえずdjango-filterをDRFで動かした記録を書きました。

DRFのfilter拡張のライブラリはいくつかあるみたいなので、また気が向いたら動かしてみたいと思います。

あと、関連で以下のライブラリも見つけたので、こちらも気が向いたら動かしてみたいところ。

github.com

リースとサブスクリプションって何が違うの?と思った話

ふと、次のような疑問が頭をよぎった。

  • リースとサブスクリプションって何が違うの?

Webサービスのサブスクリプションはよく聞くけど、リースとは言わない。

何となくビジネスの仕組みが違うような気がしたので、本を買ってざっと読んでみた。備忘録的に書いておく。

続きを読む