部屋の照明をどうするか

引っ越しが完了して、次に考えないとならないのが照明。せっかく綺麗なお家に引っ越せたので照明も慎重に選びたいと思って調べてみました。

照明の役割と種類

照明には大きく2つの役割があるらしいです。1つ目が部屋を明るくする役割です。暗いところを大きく照らすことで生活をしやすくする役割があります。2つ目が演出をする役割です。部屋の空間に光の演出をして、生活を楽しくする役割があります。このように照明には2つの役割があり、バランスをとりながらインテリアを考えることが重要らしいです。

照明にはそれぞれの役割に応じた種類があります。

  • シーリングライト:部屋を明るくする役割の照明。部屋全体を照らすため、作業をするために向いている照明です。ただ、光の角度などが演出するのに向いていなく、部屋がおしゃれになりにくいです。
  • ペンダントライト:演出のための照明。光源を強めにしてしまうと、明るさより眩しさが目立ってしまうため、弱く状態で使うのが良い。シェードなどをうまく使って目に直接光を当たらないようにすることで、部屋をおしゃれに演出できます。
  • スポットライト:ダクトレールと一緒に使い、光の強さや角度を帰ることで明るくするためにも演出のためにも使える照明。明るくするために使うには一つだけでは光源として足りないので複数個使う必要がありそうです。

それぞれの関係をなんとなくまとめると以下のようになります。(あくまで自分のイメージです。)

f:id:makky_emmanuel:20210529121603p:plain

他にもいろいろ照明には種類がありますが、2つの役割のどちらを担えるのかという観点で考え、他の照明と比較することで、自分にあった照明を探すことができそうです。

光の位置による印象

光をどこに集めるかによって部屋の印象が大きく変わるらしいです。 1つ目に、上の方に光を集めると部屋を広く、開放感があるように感じさせることができます。上の方に集めるというのは、天井に向けて光を照らし、天井が光っている状態のことです。そうすることで、上が明るく、下が暗いという対比によって広く感じさせることができるみたいです。 2つ目に、低い位置に光を集めると落ち着いた印象や高級感を出すことができるらしいです。おしゃれなカフェやバーでも光を低い位置に集めることで落ち着いた雰囲気や高級感を出す効果を使っているみたいです。

結局どうしたの?

結局、スポットライト+ペンダントライトにすることにしました。 具体的には部屋を明るくする照明としてスポットライト、演出をする照明としてペンダントライトにしようと思います。

f:id:makky_emmanuel:20210529124413j:plain

最後に

まだまだ、買わないといけないものがありますが、いろいろ調べながら探すのは楽しいです。おしゃれな部屋を目指すぞ!

参考にした動画

【コスパ最強すぎ】賃貸OK!たった2700円でオシャレな空間を作るおすすめライト - YouTube 【ルールが分かれば安く済む】オシャレの近道は照明です!3500円からのおすすめ10選 - YouTube 【照明の選び方】これを知らないと失敗します!照明は何を選べばいいのか? - YouTube

告白デバッグ

わからない時に人に話すと勝手に自分で解決しちゃうということがよくありますよね。 このような現象に告白デバッグ(Confessional debugging)という名前がついていることを教えてもらったので少し調べてみました。

告白デバッグとは

Confessional debuggingと調べてみると、1993年に書かれたスティーブマコネルのCODE COMPLETEに出てきていることがわかりました。

Talk to someone else about the problem. Some people call this “confessional debugging.” You often discover your own error in the act of explaining it to another person.

その問題について誰かに相談する。これを「告白デバッグ」と呼ぶ人もいます。自分のミスを他人に説明することで、自分のミスを発見することがよくあります。

告白デバッグをするときは相手は何もせずとも、勝手に自分自身で問題を解決することができます。 

私も先日、

私 :「なんでエラーになるかわからないので聞いてもらっていいですか?」
先輩:「エラー起こしてみて」
私 :「この辺でエラー起こっているんですよね」
先輩:「この辺っぽいね」
私 :「こっちではエラーにならないのに、こっちではエラーになるんですよね」
先輩:「なるほどね」
私 :「あっ、わかりました!なんかすみません。。。」
先輩:「こういうの、コンフェッショナルデバッキングっていうよね」

と話しただけで解決してしまいました。

わからない時こそ、説明する

告白デバッグでは人に説明する時に、詳しく説明する必要があるため、より深い理解ができ、解決策を思いつくという方法です。

調べていると「ラバーダックデバッグ」や「テディベア・デバッグ」などという言葉もあることがわかりました。これらは机の上にラバーダック(アヒルのおもちゃ)やテディベアをおき、一つ一つ説明してあげることで問題解決ができる手法です。

ja.wikipedia.org

確かに、私の場合でも相槌を打ってもらっているだけで解決できたので、人でなくても良いのかもと思いました。

最後に

CODE COMPLETEは読んだことがなかったのですが、少し興味が出ました。 でも、上下巻に分かれているし、めっちゃ厚いからなぁ。。。

おおよそ引っ越し完了

荷物の完全移行と元の部屋の掃除を終えて、おおよそ引っ越しが完了しました!

今日は引っ越しでやったことを書いていきたいと思います。

1~2月:引っ越しを考え始めた

彼女との同棲を考えて引っ越しのことを年始くらいに考えはじめました。この頃は様々な賃貸サイトを使って良さそうな物件を紹介しあい、譲れなさそうな条件などを探っている段階でした。

情報共有にはもともと二人用のDiscordサーバがあったので新たに引っ越し用のトピックを作成して、そこに賃貸サイトのURLを貼っていく感じでした。様々な賃貸サイトで調べていて気づいたことは、

  • suumoとathomeはほとんど同じ物件しかない
  • ホームズは物件の写真が豊富
  • yahoo賃貸は他に載っていない物件が結構ある
  • goodroomはおしゃれだが割高な物件が多い

でした。

3月:引っ越しへの意識を高める

この時期にはなんとなくの引越し時期を決めました。この日に引っ越すと決めるというより、おおよそ4月下旬から5月中が良いかなぁという感覚でした。

次に、引っ越しへのイメージを強くするために一度内見に行ってみることにしました。具体的には自分の最寄りの駅前にある不動産屋さん(アパマンショップとかピタットハウスとか)に予約もせず入店し、引越し時期となんとなくの条件を伝えます。

この段階での条件は以下のとおりです。

  • 家賃+管理費が12.5万円以下
  • 各職場へドアトゥードアで50分以内
  • 2階以上
  • 鉄筋コンまたは鉄骨
  • 日当たりがよい(南向き)
  • 1LDK or 2LDK
  • 50平米以上だと尚良(45平米以上は絶対)
  • 角部屋だと尚良

これだけだと、候補が出てきすぎると言われ、不動産屋さんと会話する中でなんとなくの駅も決めました。その場では内見の予定は立てず、条件に合いそうな物件があれば連絡してもらうようにしました。不動産屋さんはもう一店舗くらいまわりました。

そして3月下旬くらいに内見に行きました。

4月:物件決定と引越し準備

4月上旬は興味のある物件を内見しまくりました。全部で6件くらい内見しました。そして4月18日に内見した物件に決定しました🎉。失敗談として、18日より前にも良い物件があったのですが、内見してからすぐに申し込まず優雅に喫茶店でコーヒーを飲んでいたりしたら、次の日に申し込まれたということが2回ほどありました。なので反省を活かし、18日に内見した物件はその日中に書類を用意して入居申請をしました。

そしてここから引っ越しの準備をはじめました。引っ越しでしなければいけないことはTrelloで管理しました。

f:id:makky_emmanuel:20210516085912p:plain

各タスクにはチェックボックスで二人の名前を入れておき、週末になんとなく次の週にやることを今週やることリストに移動しておきました。達成したらチェックをつけ、2つともチェックがついた段階でDONEリストへと移動する感じです。ここではほぼ毎日夜にやることに関する会話ができていたのが良かったのかなぁと思います。

5月:引っ越し

GW中に引っ越し方法や当日することをまとめていきました。私達は業者を頼まず、レンタカーを借りて自分たちで引っ越しすることにしました。具体的にはニコニコレンタカーでミニキャブバンを24時間レンタルしました。費用としては7000円位でした。

また、当日にすることに関してはGoogleスプレッドシートにまとめていきました。

f:id:makky_emmanuel:20210516090815p:plain

そして昨日、互いの元の部屋の掃除をしまして、無事引っ越しを終えることができました。

f:id:makky_emmanuel:20210516091239j:plain

最後に

引っ越し直後で何もないからこそのおしゃれな雰囲気の写真を撮っておきました。

f:id:makky_emmanuel:20210516091212j:plain

GPUを使った機械学習でのデバック

今週のタイムライン

  • Faster R-CNNを勉強した(ほぼ毎日)
  • 引っ越し作業を進めた
  • Core UIを使ってみた(月曜日)
  • リファクタリングした(火曜日)
  • 大学の友達と遊んだ(木曜日)

話したいこと

  1. Faster R-CNNを勉強した(ほぼ毎日)

GPUを使った機械学習

Faster R-CNNを使って物体認識を仕様と勉強中です。環境はGoogle Colab、ライブラリはPytorchを使っています。

Pytorchでは以下のようにdeviceを指定することでGPUで学習や推論処理を行うことができます。

import torchvision

device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') 

model = torchvision.models.detection.fasterrcnn_resnet50_fpn(pretrained=True)
model.to(device)

以下のようにして学習をさせようとしていた時、

torch.manual_seed(1)

dataset = Dataset(BASE_PATH)
n_train = int(len(dataset) * 0.7)
n_val = len(dataset) - n_train
 
train, val = torch.utils.data.random_split(dataset, [n_train, n_val])

def collate_fn(batch):
    return tuple(zip(*batch))

data_loader = torch.utils.data.DataLoader(train, batch_size=2, shuffle=True, collate_fn=collate_fn)

params = [p for p in model.parameters() if p.requires_grad]
optimizer = torch.optim.SGD(params, lr=0.005, momentum=0.9, weight_decay=0.0005)

for i, batch in enumerate(data_loader):
    images, targets = batch

    imagess = [image.to(device) for image in images]
    targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

    pred = model(images, targets)
    losses = sum(loss for loss in pred.values())
    loss_value = losses.item()
    
    optimizer.zero_grad()
    losses.backward()
    optimizer.step()

    if (i+1) % 10 == 0:
        print(f"epoch #{epoch+1} Iteration #{i+1} loss: {loss_value}")  

RuntimeError: CUDA error: device-side assert triggeredが発生してしまいました。より親切なエラーを見るためにはCPUで実行すればよいということを学んだ。

# cpuで実行するように変更
device = torch.device('cpu') 
model.to(device)

for i, batch in enumerate(data_loader):
    images, targets = batch

    imagess = [image.to(device) for image in images]
    targets = [{k: v.to(device) for k, v in t.items()} for t in targets]

    pred = model(images, targets)
    losses = sum(loss for loss in pred.values())
    loss_value = losses.item()
    
    optimizer.zero_grad()
    losses.backward()
    optimizer.step()

    if (i+1) % 10 == 0:
        print(f"epoch #{epoch+1} Iteration #{i+1} loss: {loss_value}")  

そうするとIndexError: Target 6 is out of bounds.ということでfeature mapあたりが間違っていることがわかりました。めでたしめでたし。

今週の思い出

週末にSOLSO FARMに行ってきました。SOLSO FARMは土日祝日だけオープンしているファームマーケットで引越しをしたら何か植物を置きたいなと思い行ってみました。

f:id:makky_emmanuel:20210502080311j:plain f:id:makky_emmanuel:20210502080325j:plain f:id:makky_emmanuel:20210502080335j:plain

知識欲が湧いた週

今週のタイムライン

  • 引っ越しの物件決定(日曜日)
  • Quarkus(月曜日)
  • CNNの応用の勉強(火曜日)
  • Amazon PersonalizeのBatch recommendationを試した(水曜日)
  • A*アルゴリズムをまとめた(金曜日)
  • スープカレーを久々に食べた(土曜日)

話したいこと

  1. CNNの応用の勉強
  2. A*アルゴリズムをまとめた

CNNの応用の勉強

CNN(畳み込みニューラルネットワーク)は様々な分野で使われています。例えば、画像認識(その画像がなんの画像であるかの認識)、人検出など。その中の一つの物体検出を少し勉強しました。

f:id:makky_emmanuel:20210425100840p:plain

上の画像では画像の中のどの部分に何が写っているかがわかります。こういったことをできるようにするのが物体検出です。物体検出は画像認識より難しそうだなということはわかります。

物体検出をできるようにするためには、

  • どの領域(画像の四角)を認識対象とするか
  • 認識対象とした領域の中から認識したいクラス(犬、人、馬など)以外の場所をどうやって排除するか

などの課題を解決すれば良いです。 これらの問題を解決した方法として、R-CNN、Fast R-CNN、Faster R-CNN、YOLO(You Only Look Once)、SDD(Single Shot Multibox Detector)などがあります。

その中で今はR-CNN、Fast R-CNN、Faster R-CNNを勉強中です。Pytorchには様々なモデルが用意されていたり、チュートリアルも豊富です。コツコツ頑張ろう。

pytorch.org

github.com

github.com

A*アルゴリズムをまとめた

経路探索アルゴリズムの一つであるA*アルゴリズムを勉強し直して、理解をまとめました。

勉強する際にWikipedia日本語版英語版で書いてある内容が異なり、それぞれ計算量を減らすための工夫が書いてあってとても興味深かったです。

とりあえず実装はできたので、Wikipediaに書いてある工夫も取り入れてみて高速化できるのか試してみたいなと思います。

最後に

今週は知識欲がとても湧いた週でした。その調子を維持して勉強を進められたらなと思います。

土曜日に、久しぶりにスープカレーを食べました。

f:id:makky_emmanuel:20210425103800j:plain

テストファーストでプログラミング

今週のタイムライン

  • ゴルフの打ちっぱなしに行った(日曜日)
  • 新入社員とドリームマネジメントをやった(月曜日)
  • 新たなAPIを使用した開発のための調査(火曜日)
  • Streamlitを用いたデータ可視化(水曜日)
  • Amazon Personalizeを用いたバッチでの推薦(木曜日)
  • テストファーストでプログラミング(金曜日)

話したいこと

  1. テストファーストでプログラミング

テストファーストでプログラミング

学生の頃とプログラミングをする上で異なるところはテストを書くというところです。品質を担保(ちゃんと動いているかの証明)をするために働く上ではテストコードを書いています。

さらに最近ではテスト駆動開発(あまりわかっていないが)のようにやりたいことや修正したいことを先にテストに書いてしまってから実装を行うということをやっています。

例えば年齢に応じた映画館の料金を算出したいという要望があるとします。仕様は以下の通り。

  • 大人(23歳以上)は1,800円
  • 大学生・専門学生(18歳〜22歳)は1,500円
  • 中学・高校生(13歳〜17歳)は1,000円
  • それ以下は500円 ※細かい料金体系は面倒なので年齢で区切りました

以下のようなクラスを考えるとします。

// PriceCalculator.java
class PriceCalculator {
    static int calculate(int age) {
        return 0;
    }
}

まずやるのは、仕様をテストコードに反映させます。

class PriceCalculatorTest {
    private static final int ADULT_PRICE = 1800;
    private static final int COLLEGE_AND_PROFESSIONAL_STUDENT_PRICE = 1500;
    private static final int SCHOOL_STUDENT_PRICE = 1000;
    private static final int CHILD_PRICE = 500;

    @ParameterizedTest
    @MethodSource
    void shouldReturnValidPrice(int age, int price){
        assertThat(PriceCalculator.calculate(age), is(price));
    }

    static Stream<Arguments> shouldReturnValidPrice() {
        return Stream.of(
                arguments(23, ADULT_PRICE),
                arguments(22, COLLEGE_AND_PROFESSIONAL_STUDENT_PRICE),
                arguments(18, COLLEGE_AND_PROFESSIONAL_STUDENT_PRICE),
                arguments(17, SCHOOL_STUDENT_PRICE),
                arguments(13, SCHOOL_STUDENT_PRICE),
                arguments(12, CHILD_PRICE));
    }
}

このように書いてみると、年齢がマイナスの時や、年齢の上限はどこまで許せば良いんだろうという疑問が湧いてきます。

  • マイナスは例外だよね
  • 最高年齢は現状118歳だから200歳くらいまでを範囲としておいて、それ以上は例外にしちゃおう

などの考慮できていなかった仕様を考えることができます。そしてテストにも追加。

class PriceCalculatorTest {
...

    @ParameterizedTest
    @MethodSource
    void shouldThrow(int age) {
        assertThrows(IllegalArgumentException.class, () -> PriceCalculator.calculate(age));
    }

    static Stream<Arguments> shouldThrow() {
        return Stream.of(
                arguments(201),
                arguments(-1));
    }
}

これでやっと実装しはじめられますね。 こうやってテストファーストで書くのがいいなって思いました。

最後に

人生初の打ちっぱなしに行きました。Youtubeをみてイメージしていきましたが。全然思ったように当たらず。。。新しいことをするのはいつになっても楽しい!

f:id:makky_emmanuel:20210418071613j:plain

社会人3年目開始

今週のタイムライン

エネルギーを与えた出来事(幸せになった・安心した)

  • ドリームマネジメント最終回(月曜日)
  • 機械学習を使って処理速度を改善できた(火曜日)
  • チームメンバーと軽くお酒を飲みながら話せた(水曜日)
  • 社会人3年目開始(木曜日)
  • atCoderを初めてやった(金曜日)

エネルギーを奪った出来事(悲しくなった・不幸になったなど)

特になし

戸惑った出来事や疑問に思った出来事

特になし

話したいこと

  1. 社会人3年目開始
  2. ドリームマネジメント最終回(別記事であげる予定)

社会人3年目開始

2019年に大学院を卒業して、早2年が経ってしまいました。あっという間だったような、よく考えてみると濃かったような。そこで、社会人になってから技術・非技術を問わずにどんな知識に触れてきたのかをバーっと書き出してみました。(趣味的にさっと触れただけのものも入っています)

  • フロント系
    • Typescript, React, Redux, MUI, Nodejs, Jest, TestCafe, Kotlin, Android
  • バック系
    • Java, Spring Boot, JUnit, Mockito, REST Assured
  • インフラ系
    • AWS, Docker, Jenkins, heroku
  • 機械学習アルゴリズム
    • SageMaker, Amazon Personalize
    • LightGBM, XGBoost, k-means, GMM, 経路探索, SAT
    • Pytorch, Keras, Tensolflow.js, pandas
    • Kaggle, SIGNATE
  • その他

こう見ると、いろんなことをやってきたんだなぁと実感。 最近ではアルゴリズム系のことをやるのがとても楽しいです。大学で学んだことが実際に使えたり、ちょっと違った考え方を工夫するだけで処理速度が改善されたりなど知見が結びついていく感じがします。 今年一年も様々なことを学び充実させていくぞー!

最後に

今週はとてもあたたかかったです。月曜日にはきれいな桜を見ましたが、もう散ってしまっているのかな。

f:id:makky_emmanuel:20210403093605j:plain