高木のブログ

MacBook Proが壊れたので修理に出した

Tags: Mac

先日、MacBook Proを修理に出して無事に返ってきたので、自分のためと同じ状況の人の参考になればいいなと思い記録を残しておく

修理の依頼方法として以下の4つの手段があり、今回は正規サービスプロバイダのカメラのキタムラに持ち込んで修理してもらった

  • Apple Storeに持ち込んで修理してもらう
  • Apple リペアセンターに配送して修理してもらう
  • Apple 正規サービスプロバイダに持ち込んで修理してもらう
  • Apple製品の非正規修理ショップに持ち込んで修理してもらう

マシンのスペックと症状 🔗

マシン 🔗

MacBook Pro (15-inch, 2018)
メモリ 32GB
SSD 512GB

症状 🔗

  • 電源が入らない
    • 電源ボタンを押してもうんともすんとも言わなくなった(起動する気配すらない)
  • メニューバーのバッテリーのところに「修理サービス推奨」の表示
    • 特に使用上問題なかったので放置してた

修理内容 🔗

  • ロジックボード(SSD一体型)の交換
  • トップケース(キーボード、バッテリー一体型)の交換

修理料金 🔗

※ AppleCare+ for Macの保証期限切れ状態

  • 部品代 73,300円
  • 技術料 5,000円 合計 86,130円

以下の記事を参考にすると部品代の内訳は、ロジックボード60,500円、トップケース12,800円になりそう
アップルストアのMacBook修理代金相場をまとめてみた | 最安修理.com

あまり安くない修理金額だから修理するか迷ったが、使っていたものと同じスペックのMacを買うと40万円コースになってしまうので修理することにした
これであと2,3年は戦っていきたい

修理スケジュール 🔗

  • 7/29(木) カメラのキタムラにMacの持ち込み修理依頼
  • 7/31(土) カメラのキタムラより、診断結果の連絡
  • 8/2(月) Apple リペアセンターにMac到着
  • 8/10(火) Apple リペアセンターにて修理完了
  • 8/11(水) カメラのキタムラより、修理完了の連絡
  • 8/11(水) カメラのキタムラでMacの受け取り

Apple リペアセンターは土日祝には稼働していないみたいで合計で2週間弱掛かった

補足 🔗

データは消えるのか 🔗

ロジックボードを交換する場合、ストレージ一体型なので必ず消える
修理が成功すればワンチャン!とかは絶対ないのでTime Machineなどでバックアップは日頃からしておくべき

修理する手段はどれがおすすめか 🔗

正解はないが、個人的な意見としては「Apple リペアセンターに配送して修理してもらう」が一番いいと思う

Apple Storeや正規サービスプロバイダでは修理自体はできず最終的にリペアセンターに送ることになるので、最初から配送修理でリペアセンターに送ってしまった方が早い
今回は早く原因と修理金額を知りたかったので、配送修理ではなく予約の空きがあった近くのカメラのキタムラを選んだ(結局、診断結果が来たのは2日後で意味なかったけど)

ちなみにカメラのキタムラで修理キャンセルする場合、キャンセル料(診断料)が5,500円掛かる
これは診断自体に人件費が掛かっているでしょうがないが、Appleに直接出した場合はキャンセルしてもお金が掛からないかもしれない

Appleに出した場合かなりのレアケースだろうけど、修理代が0円になった実績あり
imacの修理代が神対応で無料に! 保証切れでも対応してくれたアップルサポートは素敵すぎる| ひとり広報

【Mac】VoltaでNode.jsとYarnをインストールする

Tags: Node.js Yarn

今までNode.jsのバージョン管理ツールはnvm を使っていたけど、今回Macを新しく使うにあたってVolta を使うことにしてみた
時代はVoltaらしいよ、知らんけど。

ちなみに今日からzsh使いになった。

手順 🔗

Voltaのインストール 🔗

% curl https://get.volta.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 12319  100 12319    0     0   7212      0  0:00:01  0:00:01 --:--:--  7208
  Installing latest version of Volta (1.0.4)
    Checking for existing Volta installation
    Fetching archive for macOS, version 1.0.4
######################################################################## 100.0%#=#=-#  #                                                              ######################################################################## 100.0%
    Creating directory layout
  Extracting Volta binaries and launchers
    Finished installation. Updating user profile settings.
Updating your Volta directory. This may take a few moments...
success: Setup complete. Open a new terminal to start using Volta!
% source .zshrc
% volta -v
1.0.4

Node.jsのインストール 🔗

% volta install node@16
  Fetching [email protected]  [========================================] 100%
success: installed and set [email protected] (with [email protected]) as default
% node -v
v16.6.1

Yarnのインストール 🔗

% volta install yarn
success: installed and set [email protected] as default
% yarn -v
1.22.11

参考 🔗

【Ruby】2.7 から追加された Enumerable#tally メソッドが便利

Tags: Ruby

Ruby 2.7から追加された Enumerable#tally メソッドが便利なので、必要になったときにすぐ使えるようにメモしておく

Enumerable#tally 🔗

tally メソッドは配列内の同じ要素の数を数えてHashで返してくれるメソッド

[1,2,2,2,3,3,4,5].tally
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}

今までやり方 🔗

2.7 以前では以下のようなやり方でやるしかなかった

[1,2,2,2,3,3,4,5].group_by(&:itself).transform_values(&:size)
#=> {1=>1, 2=>3, 3=>2, 4=>1, 5=>1}

他にもやり方は存在するが、どれも1メソッドで完結できない

Enumerable#tally_by 🔗

tally_by は残念ながら存在しない

存在したら単語の頭文字で集計などに使える

['Apple', 'Box', 'Cat', 'Ball', 'Cup'].tally_by { |s| s[0] }
#=> {"A"=>1, "B"=>2, "C"=>2}

代替 🔗

map 経由なら実現できる

['Apple', 'Box', 'Cat', 'Ball', 'Cup'].map { |s| s[0] }.tally
#=> {"A"=>1, "B"=>2, "C"=>2}

一応、採用するかどうかは議論中みたい
https://bugs.ruby-lang.org/issues/11076#note-22

参考 🔗

RedshiftのデータをS3にエクスポートする

Tags: Redshift S3 AWS

RedshiftのデータをUNLOADコマンドを使ってテーブル単位でS3にエクスポートする手順

手順 🔗

バケット作成 🔗

特筆すること無いので省略

IAMロール作成 🔗

  • [AWS servise]は[Redshift]を選択
  • [Select your use case]は[Redshift - Customizable]を選択
  • アクセス権限ポリシーポリシーを作成してアタッチする
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:PutObject"
            ],
            "Resource": [
                "arn:aws:s3:::mybucket/*",
                "arn:aws:s3:::mybucket"
            ]
        }
    ]
}

s3:ListBucket権限はUNLOADコマンドでALLOWOVERWRITEオプションを使う場合は不要

IAMロールをRedshiftクラスターに関連付けをする 🔗

Redshiftのコンソール画面から関連付けをする

UNLOADコマンドを実行 🔗

> unload ('select * from users') to 's3://mybucket/' iam_role 'arn:aws:iam::0123456789012:role/RedshiftUnloadToS3' CSV GZIP;
INFO:  UNLOAD completed, 728635600 record(s) unloaded successfully.
UNLOAD

CSV形式かつGZIPで圧縮したかったので、末尾にオプションを付けた
約7億レコードくらいのテーブルで13分掛かった

limit句は使えない 🔗

少ないレコードで試したいと思ってlimit句で件数を絞っても効かない
件数を絞りたいときを以下のようなクエリにする

> unload ('select * from users where id in (select id from users limit 10)') to 's3://mybucket/' iam_role 'arn:aws:iam::0123456789012:role/RedshiftUnloadToS3';

参考 🔗

CentOS7にDenoをインストールする方法

Tags: Deno

公式ドキュメント通りにCentOS7にDenoをインストールしただけでは動かない

GLIBC 2.18が必要らしい

$ deno --version
deno: /lib64/libc.so.6: version `GLIBC_2.18' not found (required by deno)

CentOS7に入っているGLIBCは2.17

$ ldd --version
ldd (GNU libc) 2.17
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
作者 Roland McGrath および Ulrich Drepper。

手順 🔗

GLIBC 2.18のインストール 🔗

$ curl -LO https://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gz
$ tar zxvf glibc-2.18.tar.gz
$ cd glibc-2.18/
$ mkdir build && cd build
$ ../configure --prefix=/usr --disable-profile --enable-add-ons --with-headers=/usr/include --with-binutils=/usr/bin
$ make && sudo make install
$ ldd --version
ldd (GNU libc) 2.18
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
作者 Roland McGrath および Ulrich Drepper。

Denoのインストール 🔗

$ curl -fsSL https://deno.land/x/install/install.sh | sh
$ echo 'export DENO_INSTALL="/home/vagrant/.deno"' >> ~/.bash_profile
$ echo 'export PATH="$DENO_INSTALL/bin:$PATH"' >> ~/.bash_profile
$ source ~/.bash_profile
$ deno --version
deno 1.12.2 (release, x86_64-unknown-linux-gnu)
v8 9.2.230.14
typescript 4.3.5

参考 🔗

GitHub Pagesにサブドメインを設定する

自分用メモなので雑に

GitHub Pagesで公開したページにサブドメインを設定したい

手順 🔗

例として「ytkg」というGitHubアカウントで公開したGitHub Pagesに「hello.takagi.blog」というサブドメインを設定する

CNAMEというファイルを作成 🔗

公開ソースのルートに作成する

hello.takagi.blog

DNSレコードを追加 🔗

ドメインを取得したレジストラのDNS設定画面

サブドメイン 種別 TTL
hello CNAME デフォルト値でもなんでもOK ytkg.github.io

参考 🔗

[GitHub] GitHubを使って独自ドメインWebサイトを公開する方法 - Qiita

【Gatsbyブログ】gatsby-plugin-sitemapが3系から4系で仕様が変わっていた

Tags: Gatsby

Google Search Consoleで新しい記事がインデックスになかなか追加されないなと思ったら、gatsby-plugin-sitemap が3系から4系で仕様が変わっていたためだった

3系から4系でいくつか変更があると思うが、今回は出力されるサイトマップのURLの話

出力されるサイトマップのURLの変更 🔗

3系では/sitemap.xmlが出力されていたが、4系からは/sitemap/sitemap-index.xmlになった

Google Search Consoleには「 https://www.example.com/sitemap/sitemap-index.xml 」この形で登録してあげたら良い
しばらく待っていると正常に登録される

変更に気づくのが遅れた理由 🔗

4系に上げてから気づくまでに2ヶ月くらい経ってた
このブログはVercelにデプロイしていて、/sitemap.xmlがキャッシュに残っていた
記事は更新されていないが、URLが存在するため検知ができなかった

対応 🔗

--forceオプションを付けてデプロイしてあげたらキャッシュが消える

vercel --prod --force

参考にさせていただいたブログの補足 🔗

対応1 🔗

google search console に登録するサイトマップの URL を/sitemap/sitemap-index.xml にすると登録できたが、紐づく sitemap-0.xml がエラーとなってしまった。

原因は、/sitemap/sitemap-0.xml にアクセスしないといけないのに、sitemap-index.xml 内の URL が /sitemap-0.xml となっているためでした。

こちらのバグは修正済み

対応2 🔗

gatsby-plugin-sitemap のオプションに出力先が指定できるので、gatsby-config.js に設定する。

ビルドすると public フォルダの直下に出力できたが、google search console は登録エラーのままだった、、、

こちらについては時間が経てば登録されるはず

参考 🔗

GatsbyJS gatsby-plugin-sitemapを更新すると登録できない

Docker Composeで起動しているHomebridgeのNode.jsのバージョンを最新に上げる方法

使っているHomebridgeのプラグインをアップグレードしようしたら、ますはNode.jsのバージョンを上げろって出たのでその手順

HomebridgeのNode.jsのバージョンを最新にする方法は公式ドキュメントに書いてあった
https://github.com/oznu/docker-homebridge/wiki/Homebridge-on-Raspberry-Pi#updating-homebridge--nodejs

手順 🔗

Homebridgeのdocker-compose.ymlがあるディレクトリに移動 🔗

$ cd /home/pi/homebridge

最新のHomebridgeのイメージをpullする 🔗

$ docker-compose pull homebridge

Homebridgeを起動 🔗

$ docker-compose up -d

コンテナ内に入って確認 🔗

$ docker-compose exec homebridge sh
/homebridge # node -v
v14.17.3

OK!

DeepStackのObject Detectionの結果を画像に矩形を描画して可視化する

DeepStackのObject Detectionを試す の続き

以下の画像をAPIに投げて物体検出することができた
結果のJSONに物体の座標も載っているので今回はそれ使って画像に矩形を描画する

フエ郊外の村と牛(ベトナム)の写真素材 この画像はPAKUTASO様からお借りした(https://www.pakutaso.com/20170609172post-12164.html )

{
  "success": true,
  "predictions": [
    {
      "confidence": 0.7281746,
      "label": "motorcycle",
      "y_min": 275,
      "x_min": 241,
      "y_max": 388,
      "x_max": 401
    },
    {
      "confidence": 0.856776,
      "label": "person",
      "y_min": 219,
      "x_min": 131,
      "y_max": 418,
      "x_max": 246
    },
    {
      "confidence": 0.86147404,
      "label": "bicycle",
      "y_min": 294,
      "x_min": 100,
      "y_max": 468,
      "x_max": 301
    },
    {
      "confidence": 0.9212758,
      "label": "cow",
      "y_min": 293,
      "x_min": 359,
      "y_max": 482,
      "x_max": 566
    }
  ],
  "duration": 0
}

画像に矩形を描画する 🔗

画像に描画するにはImageMagickを使う

矩形の描画するコマンド 🔗

以下のコマンドとオプションで矩形の描画ができる

$ convert 元の画像 -draw "rectangle X1の座標, Y1の座標, X2の座標, Y2の座標" 描画後の画像

牛の位置に矩形を描画してみる 🔗

$ convert original.jpg -draw "fill #ffffff fill-opacity 0.5 rectangle 359, 293, 566, 482" draw_rectanglejpg

そのままだと黒い矩形ができるので半透明の白を指定して実行した

【シェルスクリプト】引数でも標準入力でも値を受け取れるように書く方法

./script.sh abcecho abc | ./script.sh の両方で動作させたい

引数ではもちろん、パイプで繋げて処理できたらいいなと思ったので調べた

実装 🔗

cat -で標準入力が受け取れる

#!/bin/bash

if [ -p /dev/stdin ]; then
  input=`cat -`
else
  input=`echo $@`
fi

echo Hello, ${input}

実行 🔗

# 引数
$ ./hello.sh World
Hello, World

# 標準入力
$ echo World | ./hello.sh
Hello, World

参考 🔗

DeepStackのObject Detectionを試す

DeepStackObject Detection を試したメモ

画像内のオブジェクトを見つける物体検出API

現時点では80種類のオブジェクトが判断できるみたい

person, bicycle, car, motorcycle, airplane, bus, train, truck, boat, traffic light,
fire hydrant, stop_sign, parking meter, bench, bird, cat, dog, horse, sheep, cow,
elephant, bear, zebra, giraffe, backpack, umbrella, handbag, tie, suitcase, frisbee,
skis, snowboard, sports ball, kite, baseball bat, baseball glove, skateboard,
surfboard, tennis racket, bottle, wine glass, cup, fork, knife, spoon, bowl, banana,
apple, sandwich, orange, broccoli, carrot, hot dog, pizza, donot, cake, chair, couch,
potted plant, bed, dining table, toilet, tv, laptop, mouse, remote, keyboard,
cell phone, microwave, oven, toaster, sink, refrigerator, book, clock, vase,
scissors, teddy bear, hair dryer, toothbrush

https://docs.deepstack.cc/object-detection/index.html#classes

【Docker for Mac】Dockerコンテナからlocalhostでホストマシンにアクセスする方法

Tags: Docker Mac

Docker for Macでの話

$ docker --version
Docker version 20.10.7, build f0df350

やりたいこと 🔗

Dockerコンテナで立ち上げたアプリケーション(今回の例ではNginx)に別のDockerコンテナ(今回の例ではRubyのコンテナ)からlocalhostでアクセスしたい

NginxをDockerで起動 🔗

$ docker run --rm -it -p 8080:80 nginx:latest

ホストマシン(Mac)からだとアクセスできる 🔗

$ curl http://localhost:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Rubyのコンテナからだとlocalhostにアクセスできない 🔗

コンテナ内のlocalhostになるから当たり前である
これを別のコンテナで立ち上がってるNginxにlocalhostで繋がるようにしたい

【Debian】digのインストール

RubyのDockerコンテナからdigコマンドを使いたかったけど入ってなかった

$ docker run --rm -it ruby:2.7.3 bin/bash
root@bdcc1171318d:/# dig www.google.com
bash: dig: command not found

バージョン 🔗

root@bdcc1171318d:/# cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

インストール方法 🔗

root@bdcc1171318d:/# apt update && apt install -y dnsutils

apt updateが抜けててハマった

root@bdcc1171318d:/# which dig
/usr/bin/dig
root@bdcc1171318d:/# dig www.google.com

; <<>> DiG 9.11.5-P4-5.1+deb10u5-Debian <<>> www.google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1073
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;www.google.com.                        IN      A

;; ANSWER SECTION:
www.google.com.         114     IN      A       172.217.26.36

;; Query time: 18 msec
;; SERVER: 192.168.65.5#53(192.168.65.5)
;; WHEN: Sun Jul 11 15:12:39 UTC 2021
;; MSG SIZE  rcvd: 48

参考 🔗

【Debian入門】digコマンドのインストールと試し打ち - (O+P)ut

Denoでコラッツの問題を確認してみた

はてブにあがっていた記事(数学の未解決問題に『1億2000万円』の懸賞金がかけられる→内容は簡単に理解できます。数学自慢の方々挑戦してみて - Togetter )を読んで気になったので、Denoでコラッツの問題を確認してみた

コラッツの問題とは 🔗

「任意の正の整数 n をとり、

  • n が偶数の場合、n を 2 で割る
  • n が奇数の場合、n に 3 をかけて 1 を足す という操作を繰り返すと、どうなるか」というものである。「どんな初期値から始めても、有限回の操作のうちに必ず 1 に到達する(そして 1→4→2→1 というループに入る)」という主張が、コラッツの予想である。 (コラッツの問題 - Wikipedia

Deno(TypeScript)で確認する 🔗

export function collatz(number: number): number {
  if (number % 2 === 0) {
    return number / 2;
  } else {
    return number * 3 + 1;
  }
}
import { collatz } from "./collatz.ts";

let number = Number(Deno.args[0]);

while (number > 1) {
  console.log(number);
  number = collatz(number);
}

console.log(number);
$ deno run app.ts 6
6
3
10
5
16
8
4
2
1
$ deno run app.ts 11
11
34
17
52
26
13
40
20
10
5
16
8
4
2
1

テスト 🔗

ちゃんとテストも書いた

Denoでブログ執筆を楽にするCLIツールを作った

Denoでブログ執筆を楽にするCLIツールを作った(というより作っているが正しい)

DenoとTypeScriptの勉強をするための題材としてCLIツール作成を選んでみた
Aleph.js のCLIツールを参考にして作っている

機能がこのブログに特化しちゃってるので、コマンド名もtb(takagi blog)にした

作った機能 🔗

インストールスクリプト 🔗

$ deno run -A install.ts
$ tb --version
tb-cli 0.1.0

openコマンド 🔗

このブログ(https://takagi.blog/ ) をブラウザで開く

$ tb open

newコマンド 🔗

新しい記事ファイルを作成する

$ tb new sample-ruby
Create content/blog/sample-ruby.md
$ cat content/blog/sample-ruby.md
---
title:
date: 2021-07-05
tags: [""]
---

Vim使いなのでそのままVimで開けるようにできるのであればしたい
オプションでタグの指定もできると良い

終わり 🔗

今のところCLIツールにしなくてもいい内容だけど、今後CLIツール機会が出てきた時の予習も兼ねているので問題なし

ytkg/tb-cli - GitHub

【Gatsbyブログ】i-mobileの広告を表示する

Tags: Gatsby

広告タグの改変は禁止されているので自己責任でお願いします

Gatsby(React)にi-mobileの広告を貼ろうとしたけど、発行されたタグをそのまま貼るだけではエラーになった

とりあえず動くコンポーネントを作って表示した
もし参考にする人は自己責任でよろしく

発行されたタグ 🔗

<div id="im-abcd123456789dfghijklmnop">
  <script async src="https://imp-adedge.i-mobile.co.jp/script/v1/spot.js"></script>
  <script>(window.adsbyimobile=window.adsbyimobile||[]).push({pid:12345,mid:78910,asid:1234567,type:"banner",display:"inline",elementid:"im-abcd123456789dfghijklmnop"})</script>
</div>

とりあえず動いたコンポーネント 🔗

import React, { useEffect } from "react"

const Ads = () => {
  useEffect(() => {
    if (process.env.NODE_ENV !== "development") {
      const tag = document.createElement("script");
      tag.src = "https://imp-adedge.i-mobile.co.jp/script/v1/spot.js";
      tag.async = true;
      document.body.appendChild(tag);

      (window.adsbyimobile = window.adsbyimobile || []).push(
        {
          pid: 12345,
          mid: 78910,
          asid: 1234567,
          type: "banner",
          display: "inline",
          elementid: "im-abcd123456789dfghijklmnop"
        }
      )

      document.body.removeChild(tag);
    }
  }, [])

  return (
    <div id="im-abcd123456789dfghijklmnop"></div>
  )
}

export default Ads
  ...
+ import Ads from "../components/ads"
  ...

  ...
+ <Ads />
  ...

参考 🔗

Rubyの配列展開(*[:a, :b, :c])をJavaScriptでもやりたい

引数とかに配列の中身を展開して渡してあげるやつ(配列展開?)をJavaScriptでもやりたい

Ruby 🔗

*: スプラット演算子

array = [:a, :b, :c] # => [:a, :b, :c]

[*array, :d, :e] # => [:a, :b, :c, :d, :e]

JavaScript 🔗

...: スプレッド構文

const array = ['a', 'b', 'c'] // [ 'a', 'b', 'c' ]

[...array, 'd', 'e'] // [ 'a', 'b', 'c', 'd', 'e' ]

参考 🔗

Ruby と ECMAScript の配列展開の挙動の違い

SwitchBot用のGem作った

スマートリモコンをNature Remo からSwitchBot に乗り換えてからいろいろなSwitchBotの製品を使うようになったので、Rubyで操作できるようにAPIクライアントのGemを作った

switchbotのネームスペースを使うのはかなり躊躇したが、ちゃんとメンテする覚悟ができたので使わせてもらった

https://rubygems.org/gems/switchbot

ytkg/switchbot - GitHub

使い方 🔗

インストール 🔗

gem 'switchbot'
$ bundle install

もしくは

$ gem install switchbot

初期化 🔗

require 'switchbot'

client = Switchbot::Client.new('YOUR_TOKEN')

デバイス一覧を取得 🔗

client.devices
#=> {:status_code=>100,
#    :body=>
#     {:device_list=>
#       [{:device_id=>"500291B269BE",
#         :device_name=>"Living Room Humidifier",
#         :device_type=>"Humidifier",
#         :enable_cloud_service=>true,
#         :hub_device_id=>"000000000000"}],
#      :infrared_remote_list=>
#       [{:device_id=>"02-202008110034-13",
#         :device_name=>"Living Room TV",
#         :remote_type=>"TV",
#         :hub_device_id=>"FA7310762361"}]},
#    :message=>"success"}

デバイスのステータスを取得 🔗

client.status(device_id: 'C271111EC0AB')
# or
client.device('C271111EC0AB').status
#=> {:status_code=>100,
#    :body=>
#     {:device_id=>"C271111EC0AB",
#      :device_type=>"Meter",
#      :hub_device_id=>"FA7310762361",
#      :humidity=>52,
#      :temperature=>26.1},
#    :message=>"success"}

コマンドを実行 🔗

client.commands(device_id: 'C271111EC0AB', command: 'turnOn')
# or
client.device('C271111EC0AB').commands(command: 'turnOn')
# or
client.device('C271111EC0AB').on
#=> {:status_code=>100,
#    :body=>{},
#    :message=>"success"}

使用例 🔗

スマート加湿器 🔗

SwitchBotのスマート加湿器が止まっていたら起動させるスクリプト で書いたものをRubyで書き直す

【自分用】Gemのリリース手順

Tags: Gem Ruby

そんなに頻繁にやるわけじゃなくて忘れるから、自分用にメモしておく

CHANGELOG.mdの編集、バージョンの変更、リリースするまでのやり方
対象のコードがmain(or master)ブランチにマージされている前提

独学だからこれでいいのかわからない

手順 🔗

1. CHANGELOG.mdの編集 🔗

- [full changelog](http://github.com/ytkg/switchbot/compare/v0.4.0...main)
+ [full changelog](http://github.com/ytkg/switchbot/compare/v0.5.0...main)
+ 
+ ## v0.5.0
+ [full changelog](http://github.com/ytkg/switchbot/compare/v0.4.0...v0.5.0)
+ 
+ * Add Bot
+   * https://github.com/ytkg/switchbot/pull/9
$ git add CHANGELOG.md
$ git commit -m 'Update CHANGELOG.md'

2. バージョンの変更 🔗

  module Switchbot
-   VERSION = '0.4.0'
+   VERSION = '0.5.0'
  end
$ git add lib/switchbot/version.rb
$ git commit -m 'Bump version'

3. リリース 🔗

$ bundle exec rake release
switchbot 0.5.0 built to pkg/switchbot-0.5.0.gem.
Tagged v0.5.0.
Pushed git commits and tags.
Pushing gem to https://rubygems.org...
Successfully registered gem: switchbot (0.5.0)
Pushed switchbot 0.5.0 to rubygems.org

SwitchBotのボットをAPIで操作する

Tags: SwitchBot API IoT

SwitchBotのボット を買ったので、APIから操作をサクッと試してみた記録

手順 🔗

ドキュメント: SwitchBotAPI/README.md at main · OpenWonderLabs/SwitchBotAPI

APIキーは公式アプリから取得できる。(「SwitchBotのスマート加湿器をAPIで操作する 」に書いた)

デバイスを探す(ボットのdevice IDを取得) 🔗

$ curl -s -X GET -H 'Authorization: token' https://api.switch-bot.com/v1.0/devices | jq '.body.deviceList[] | select(.deviceType == "Bot")'
{
  "deviceId": "EX0DEVICE0ID",
  "deviceName": "ボット",
  "deviceType": "Bot",
  "enableCloudService": true,
  "hubDeviceId": "EX0HUB0DEVICE"
}

たくさんデバイスが出てくるので、deviceTypeで絞り込みをする

enableCloudServiceがfalseになっている場合、アプリからクラウドサービスを有効にしておく

ステータスを確認する 🔗

$ curl -s -X GET -H 'Authorization: token' https://api.switch-bot.com/v1.0/devices/EX0DEVICE0ID/status | jq
{
  "statusCode": 100,
  "body": {
    "deviceId": "EX0DEVICE0ID",
    "deviceType": "Bot",
    "hubDeviceId": "EX0HUB0DEVICE",
    "power": "off"
  },
  "message": "success"
}

スイッチをオン、オフする 🔗

モードは「スイッチ」モードにしている(アプリから設定)

オン 🔗

$ curl -s -X POST -H 'Authorization: token' https://api.switch-bot.com/v1.0/devices/EX0DEVICE0ID/commands -H 'Content-Type: application/json' -d '{"command": "turnOn","parameter": "default","commandType": "command"}' | jq
{
  "statusCode": 100,
  "body": {},
  "message": "success"
}

オフ 🔗

$ curl -s -X POST -H 'Authorization: token' https://api.switch-bot.com/v1.0/devices/EX0DEVICE0ID/commands -H 'Content-Type: application/json' -d '{"command": "turnOff","parameter": "default","commandType": "command"}' | jq
{
  "statusCode": 100,
  "body": {},
  "message": "success"
}

【Rails】chartkickを3系から4系に上げた時のメモ

Tags: Rails Gem

Railsでシンプルなグラフを扱うならchart-js-rails よりchartkickを使うべし - Qiita の記事のようにRails 6にchartkick 3系を入れた前提

$ bundle update chartkick
$ bundle list | grep chartkick
  * chartkick (4.0.4)
$ yarn upgrade chartkick --latest
$ yarn upgrade chart.js --latest
$ yarn list --depth=0 | grep -e chart.js -e chartkick
├─ [email protected]
├─ [email protected]
-require("chartkick")
-require("chart.js")
+require("chartkick/chart.js")

参考 🔗

ankane/chartkick: Create beautiful JavaScript charts with one line of Ruby

【GitHub Actions】rubocop-linter-actionからaction-rubocopに切り替えた

GitHub Actionsでandrewmcodes-archive/rubocop-linter-action を使ってRuboCopを回していたけれど、いつの間にかコケるようになっていた

リポジトリを見に行ったらアーカイブになっていて、コケてる直接の原因は特定できていないけど、この際reviewdog/action-rubocop に切り替えることにした

name: Rubocop

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

jobs:
  rubocop:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: 2.7.3
    - name: Rubocop
      uses: reviewdog/action-rubocop@v1
      with:
        rubocop_version: gemfile
        rubocop_extensions: rubocop-rails:gemfile
        github_token: ${{ secrets.github_token }}
        reporter: github-pr-review

参考 🔗

GitHub Actions が RuboCop できないのはどう考えてもお前らが悪い!

【Gatsbyブログ】Google Analytics 4(GA4)にアップグレードした

はやくGA4にしろとずっと警告が出ていたのでやっとアップグレードした
gatsby-plugin-google-analytics はGA4に対応していないので、gatsby-plugin-google-gtag に変更した

手順 🔗

gatsby-plugin-google-gtag 追加 🔗

$ yarn add gatsby-plugin-google-gtag

gatsby-config.js 編集 🔗

    {
-     resolve: `gatsby-plugin-google-analytics`,
-     options: {
-       trackingId: "UA-12345678-0",
-     },
+     resolve: 'gatsby-plugin-google-gtag',
+     options: {
+       trackingIds: ['G-ABCD123EFG'],
+       pluginConfig: {
+         head: true,
+       },
+     },
    },

GA4のトラッキングIDは「G-」から始まる

gatsby-plugin-google-analytics 削除 🔗

$ yarn remove gatsby-plugin-google-analytics

参考 🔗

AWS CLIでアクセスキーとシークレットキーからアカウントとユーザーを確認する方法

システムで使われているキーの棚卸しで、キーがどのアカウントとユーザーのものなのか確認したかった

バージョン 🔗

$ aws --version
aws-cli/2.2.9 Python/3.9.5 Darwin/19.6.0 source/x86_64 prompt/off

確認方法 🔗

aws sts get-caller-identityで確認することができる

$ aws sts get-caller-identity
{
    "Account": "123400006789", 
    "UserId": "AIDAHOGEHOGEFOOBARBAR", 
    "Arn": "arn:aws:iam::123400006789:user/hoge.user"
}

キーの指定 🔗

$ AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY aws sts get-caller-identity
{
    "Account": "123400006789", 
    "UserId": "AIDAHOGEHOGEFOOBARBAR", 
    "Arn": "arn:aws:iam::123400006789:user/hoge.user"
}

おわり 🔗

おかげでルートアカウントのキーが使われている箇所を見つけることができた

SESAME 3の状態と履歴をWeb APIで取得する

Tags: API IoT

SESAME 3 のAPIが公開されていたので触ってみた(まだ正式には発表されてはいないっぽいが)

https://doc.candyhouse.co/ja/SesameAPI

API KEYの取得 🔗

https://dash.candyhouse.co/ でログインしたら取得できる
最初「-」しか表示されていなかったけど待っていたら表示された

状態を取得 🔗

GET: "https://app.candyhouse.co/api/sesame2/{UUID}"
$ curl -s -H "x-api-key:{API KEY}" https://app.candyhouse.co/api/sesame2/{UUID} |jq
{
  "batteryPercentage": 100,
  "batteryVoltage": 6.116129032258065,
  "position": 1069,
  "CHSesame2Status": "locked",
  "timestamp": 1623646157
}

履歴を取得 🔗

GET: "https://app.candyhouse.co/api/sesame2/{UUID}/history?page=1&lg=3"
$ curl -s -H "x-api-key:{API KEY}" "https://app.candyhouse.co/api/sesame2/{UUID}/history?page=1&lg=3" |jq
[
  {
    "recordID": 83,
    "type": 2,
    "timeStamp": 1623646093156,
    "historyTag": "44KI44GX44GN"
  },
  {
    "recordID": 82,
    "type": 3,
    "timeStamp": 1623645290000,
    "parameter": "atzGYAEAAAA="
  },
  {
    "recordID": 85,
    "type": 10,
    "timeStamp": 1623606552160
  }
]

pageとlgは必須パラメータっぽい
pageは何ページ目を取得するか
lgは1ページに何件の履歴を取得するか

Categories


Tags