2022年買ってよかったもの
2022年も年の瀬.そろそろ終わりです.気まぐれでやっている買ってよかった物の紹介を今年もやろうと思います.
2022年はどのくらい買ったか
- 115件,458,663円の注文をamazonで行ったようです.買いすぎ.
買ってよかったもの
とりあえず1年分の履歴を眺めてよかったなと思った物をリストアップし,コメントします.
- Amazon.co.jp : サーモス 真空断熱タンブラー 600ml ステンレス JDE-600 S : ホーム&キッチン
- 普段使いのタンブラーとして優秀.JDE-420Sというものを使っていたが,一回り大きめのものを導入してみた.これがわりとよかった.
- Amazon | JEJアステージ 工具箱 日本製 パーツストッカー ケース 仕切板15枚付き 小物収納ケース PS-400 [幅40.5×奥行29×高さ7.8cm] | パーツボックス
- パーツボックスとしてsuperpitch(ex. Amazon.co.jp: リングスター スーパーピッチ クリア L300×W206×H39mm 仕切板20枚付 SP-3000D : DIY・工具・ガーデン)を愛用していたが,割と小さめの工具であったりなどをでかい工具箱にいれてしまうと取り出しにくかったりといった問題があった.このケースに小さめの工具を入れるようにしてからは見通しもよくなり,かつ取り出しに苦労することもなく平和になった.
- Amazon.co.jp: 【56種のハーブ・スパイスを使ったハーブリキュール】 イエーガー マイスター 専用ショットグラス2個付セット [ リキュール 700ml ] (国内正規品) : 食品・飲料・お酒
- 自宅でイエガーボムが作れるようになって最高.薬草を摂取している感がすごくて健康っぽいので罪悪感が小さめ.
- Amazon.co.jp: 国内正規品 HERO CLIP Small ヒーロークリップ スモール カラビナ 型 フック バックハンガー 静止荷重 22kg (シナモン&ゴールド Cinnamon & Gold) : スポーツ&アウトドア
- カバンをカフェのカウンターやテーブルからぶら下げたりすることができて便利.普通のサイズだと割とデカめなので,smallあたりがおすすめ.smallだと天板の厚みが大きいと引っ掛けられなかったりがあるのでそこは留意のこと.
- Amazon.co.jp: 【New コアラマットレス】 シングル(195×97×23cm) 独自開発ウレタンフォーム3層構造 厚み23cm 日本仕様モデル 硬さ調節可能 低反発 高反発 振動吸収 寝姿勢・寝返りサポート 通気性 植物繊維使用 マットレス滑り防止技術 抗菌加工 圧縮配送 koala 公式直営 : ホーム&キッチン
- マットレスがへたってきてベッドフレームの金属部に腰の骨が当たる感覚を覚えて睡眠体験が最悪になりつつあったので思い切って購入.腰の痛みもなくぐっすり寝れて最高によかった.
- Amazon | フェローズ シュレッダー 家庭用 電動 8枚細断 マイクロカット 高さ39cm コンパクト スピード細断 8MC 4693201 | 文房具・オフィス用品 | 文房具・オフィス用品
- 小型の電動シュレッダーを愛用していたが,経年劣化によりモータの動きが悪く,裁断中に停止したりすることが多々起こるようになった.流石に耐えられずに裁断可能枚数が多めのものに買い替えることにした.今の所とても快適に使えていてハッピー.
- Amazon | モバイルモニター モバイルディスプレイ InnoView 4K タッチ機能 IPS液晶パネル 光沢液晶 USBType-C miniHDMI MACUSB入力 HDRモード FreeSync対応 ブルーライト機能 (14) | InnoView | ディスプレイ 通販
- 一台は持っておきたかったモバイルモニタを導入した.年末年始で実家に帰省するにあたり本格利用したが快適.発色,コントラスト,輝度など特に不満もなくタッチパネルも含め良好.欲を言えばもう一回り大きいのを買えばよかったと思っているが,まぁ十分でしょう.
- Amazon.co.jp: 5050 workshop 2WAYトーチ&ランタン MICROLight マイクロライト 充電式 led 懐中 電灯 : スポーツ&アウトドア
- キャンプ等で使える小型ランタンのおすすめで紹介されていたので購入.USB-Cな充電式でめちゃめちゃ小型でしかも明るいといった優れもの.キーチェーン等につけておくのもよい.なにより小型でこんなに明るいのはびっくりした.
- Amazon | NOGA ラピッドバー RB1000 | 面取り
- バリ取り機.いままでは気合いでヤスったり,大きめのドリルで代用したりしていたけど,いざ買って使うと楽に綺麗にバリが取れて,効率が段違い.最初から買えばよかった.
- Amazon|白雪 ふきん 日本製 無地 白 塩素系漂白剤可 しなやかな触感 F|キッチンクロス オンライン通販
- なんかよさそうなので買ってみたらすごいよかった.THE ふきん.
- Amazon.co.jp : SS (スーパーステンレス) 茶こし 茶漉し 急須 ポット 用 76×65mm 11712 : ホーム&キッチン
- 茶漉しってワイヤーが編み込まれたものがほとんどだと思うが,そういうタイプは使っていくとワイヤが切れて洗ってる時に指に刺さったりして最悪だった.この茶漉しはパンチングメタルのように板に細かい穴が空いているタイプなので切れたワイヤが刺さったりすることがなく快適.洗いやすいのもよい.
- Amazon|山忠 アイスピッケル ミニ 全長175|アイスピック オンライン通販
- 氷を砕きたくなったので買った.非常に手によく馴染んで使いやすい.コツを掴むと思った通りに割ったりできてアイスピックすげえ.
- Amazon|吊り下げラック 8個用 グラス&カップホルダー 18-8ステンレス製 穴あけ不要 日本製|グラスホルダー オンライン通販
- 一人暮らしで1Kとか1Rのキッチンは往々にして狭いことがほとんど.グラスとか洗った後に乾燥されるための場所もままならないのでシンク上のストレージにこれを取り付けた.わりと頑丈で8コグラスを引っ掛けても安心で,食器の水切りを占領せずに乾かせて便利.
- Amazon | ホーザン(HOZAN) ピンセットグリップ ピンセットケース ピンセットホルダー ピンセットの保管、先端保護に 粘着テープで簡単固定 P-845 | ピンセット
- ピンセットって保管が難しくて,適当に保管しているとすぐに先端をダメにしてしまう.Twitterでよいケースがあるかを尋ねたところ,これを紹介され,導入してみたところ非常によかった.
- Amazon.co.jp: エレコム ガジェットポーチ ガジェット ポーチ 大容量 【ストレージタイプ】 ガジェットケース オーガナイズポーチ グレー BMA-GP14GY : パソコン・周辺機器
- ガジェットポートがパンパンだったので一回り大きいものが欲しくて導入.たくさん入っていい.
- Amazon.co.jp : オカ(OKA) キッチンマット グレー 約45cm×120cm うちねこ 台所マット : ホーム&キッチン
- 台所,水が飛び散りがちで,フローリングに水が跳ねるのがいやだったので導入.サイズや品質もちょうどよく,ネコのも模様もメンタルによい.
ランキングBEST5
上で紹介したものもうち,BEST5をならべる.
- Amazon.co.jp: 【New コアラマットレス】 シングル(195×97×23cm) 独自開発ウレタンフォーム3層構造 厚み23cm 日本仕様モデル 硬さ調節可能 低反発 高反発 振動吸収 寝姿勢・寝返りサポート 通気性 植物繊維使用 マットレス滑り防止技術 抗菌加工 圧縮配送 koala 公式直営 : ホーム&キッチン
- 最高の睡眠体験だったので文句なしの1位.
- Amazon.co.jp: 5050 workshop 2WAYトーチ&ランタン MICROLight マイクロライト 充電式 led 懐中 電灯 : スポーツ&アウトドア
- 小さくて明るくて充電できるライトなんて今まで欲しくてもあまりいいのがなく,コレがほしかった!というドストライクの商品だった.
- Amazon|吊り下げラック 8個用 グラス&カップホルダー 18-8ステンレス製 穴あけ不要 日本製|グラスホルダー オンライン通販
- 食器の水切りが占領されないことは最高.スペースを有効活用できて効率厨な僕にとって評価が高い.
- Amazon.co.jp : SS (スーパーステンレス) 茶こし 茶漉し 急須 ポット 用 76×65mm 11712 : ホーム&キッチン
- 長く使えそうで洗いやすい.こういうささいな便利の積み重ねがQoLを上昇させる.
- Amazon.co.jp: 国内正規品 HERO CLIP Small ヒーロークリップ スモール カラビナ 型 フック バックハンガー 静止荷重 22kg (シナモン&ゴールド Cinnamon & Gold) : スポーツ&アウトドア
番外編(Amazon外)
amazonで買ってないけど今年であってびっくりした商品.
- Yakult(ヤクルト)1000/Y1000 | TOP
- マジで眠れてウケた.そして疲労回復とか,ストレスの感じ方の変化をここまで認識できるとは思っておらず,マジで体験できたのでびっくり.
まとめ
- よく買った一年でした.来年も衝動買いは控えめに,いい商品に出会えますように.
HPのRAIDコントローラのキャッシュバッテリを換装してみた話
キャッシュバッテリ交換アラート
我が家のサーバはIPMIの監視としてzabbixにてSNMP経由で各種情報を取得している. あるとき,zabbixから1通のアラートが.内容はRAIDコントローラのキャッシュバッテリのreplaceが必要であるという内容のものであった. RAIDキャッシュバッテリとは,RAIDコントローラのメモリ上の保持されている未書き込みデータを保持するためのもので,バッテリが有効なある一定期間であれば意図しない電源断が発生した場合でも,RAIDコントローラに残ってしまった未書き込みデータの消失を防いでくれる.通常のシグナル等による電源OFFのシーケンスであれば,RAIDコントローラのデータはすべて不揮発性デバイス(RAIDストレージ)に書き込まれるが,意図しない突然の電源喪失があった場合,この書き込みがされず,RAIDコントローラにデータが残ってしまう.キャッシュバッテリがなければこのデータは揮発してしまい,writeされるべきデータがwriteされず,さらに揮発してしまい,データの喪失という結果を引き起こす.キャッシュバッテリはRAIDコントローラにとってのUPSのように働き,これを防ぐ役割を持っている.
キャッシュバッテリの交換と失敗
アラートに気づき,早速交換を検討した.同じパーツNoであれば良いと考え,IPMIの画面からパーツ番号を同定し,eBayで交換用のキャッシュバッテリを探した. 想定通りeBayで同一の型番のキャッシュバッテリが見つかったので早速オーダー.船便で1ヶ月程度で到着した.
バッテリが到着したので何らかの事故が起きる前に早々に交換したい.早速やってみる. キャッシュバッテリの交換は,私の持っているマシンではホットスワップには対応しておらず,マシンを停止した状態で行わなければならなかった. UPSのように使っているキャッシュバッテリのホットスワップができないのは意外だった.これは今どきのマシンでもホットスワップは不可なのだろうか?RAIDコントローラが冗長化されているマシンではおそらくホットスワップ可能ではないかと思う.
マシンを停止し電源ケーブルを引き抜き,エアフローガイドやファンモジュールを取り外し,RAIDバッテリにアクセスできるようにする. あとはRAIDカードからRAIDバッテリのコネクタを引き抜き新しいものに差し替える. 逆の手順を踏んで組み直して完了.電源を入れる.
電源を入れてブートしてきたが,SNMPのアラートやIPMIの画面上のdegraded表示は復帰せずそのまま. マニュアルによると,キャッシュバッテリを交換した場合にはキャッシュバッテリへのチャージに,数時間から数十時間程度かかるようだ.キャッシュバッテリがチャージできていないと電圧が検出されずにステータスが異常のままになってしまっていると推測された.したがって数日間様子を見てみることとした.
数日後,同じくステータスを見てみたものの状態は変化していなかった. このままではキャッシュバッテリの役目を果たしてくれないため,RAIDバッテリが正常に機能していないと判断し,調査してみることにした.
再度マシンを停止しRAIDバッテリを取り外し,交換前と交換後のバッテリの双方について故障調査をしてみることにした.
RAIDバッテリの故障調査
今回取り扱ったタイプのRAIDバッテリはEDLCを利用したものであった.EDLCとは電気二重層コンデンサのことで,通常のコンデンサよりも大きな数Fオーダの静電容量をもつコンデンサである. EDLCは通常の2次電池と比べ,充放電回数や安全性にアドバンテージを持っており,短時間のバックアップ電源として利用されている事が多い. EDLCは振る舞い上コンデンサとしてみればよく,まずは電圧を印加し,蓄電動作をするかどうかを確かめてみることにした.
電圧を印加するにあたり,RAIDコントローラと接続する端子のピンアサインが不明であることから,RAIDバッテリを分解した. 分解していくといくつかのことがわかった. コネクタは6端子まで利用できるものだが,配線は合計で5本であった.配線色は赤白黒青青の4種類. まず4端子ある配線のうち2本はEDLCの温度を計測するためのサーミスタに接続されているということである. 配線の色でいうと青2本がこのサーミスタに接続されていた.このサーミスタの抵抗値を室温下で測定すると約10kΩであった. おそらくB定数がよく見る3435Kあたりのものかと想像される(実際にそうかは測定していない). あとの3本はEDLCと共に基板にはんだ付けされていた.赤がEDLCのプラス側,黒と白がEDLCのマイナス側に接続されており,基板上には抵抗のようなものが配置されていた.これは複数のEDLCを直接接続して利用する際のバランス抵抗と呼ばれるものと思われる.この抵抗により2つのEDLCの電圧のアンバランスを防ぐ. 色々と観察したところ,次のような回路となっているようだった.
まずは大雑把に充電可能かどうかを検査するべく,電源装置を用いて該当のRAIDバッテリのプラス端子とマイナス端子に対して電圧を印加してみたが,全く電流が流れる気配がなかった. テスタの電圧レンジでも電圧がふれておらず,抵抗値測定を行っても開放状態であった. 各所のはんだ付けのクラック等も疑ったが問題なく接続されていたため,これはEDLCの開放モードの故障であると推定した. しかしEDLCに抵抗が並列に入っている用に見えるのに開放となっているのはおかしい. よくよく観察すると抵抗が炭のように燃えてしまっているようであることがわかった.
原因を推測してみたが,断定することまではできなかった.観測された事象として
- EDLCが開放モードの故障状態である.
- 開放モードで故障したEDLCに接続されいてるバランス抵抗に許容電力を超える入力があり発熱した結果,抵抗が炭化し開放モード故障となった.
の2つのことは確認できた.
交換前と交換後のパーツの2つを分解してみたが,どちらも同じ状態だった.なんとebayで入手したRAIDバッテリも元から故障していたのだった.
RAIDバッテリの換装
分解したRAIDバッテリに用いられているEDLCは2.7V/34F,12mmx46mmの筒状のものが2本用いられていた.パッケージから型番はTPL-34と読み取れた.TecateGroupのTPLシリーズと考えられるが,すでに生産は終了しているようだ. 代替となる部品を調達することも考えたが,秋月電子通商で5.4VのEDLCが販売されていたので,手っ取り早くこれを利用することにした.
秋月電子にある5.4VのEDLCは各種あるが,このRAID用のEDLCは17Fの容量をもつことから,それ以上の容量を持つものを選んだ. 購入したものが下記のものである. akizukidenshi.com
すでに2本のプラスマイナスの配線と,バランス抵抗が装荷されているもので,配線を分解したRAIDバッテリのケーブルで置き換え,サーミスタをいい感じにくっつけてあげればよい. とても簡単である.その変更を加えたものが下記である.
サーミスタはホットボンドで固定.配線した部分がむき出しになっている部分もホットボンドで絶縁した. 電源装置を用いて充電試験をしたところ問題なく充電され,5.4Vまで充電された*1. 動作に問題はなさそうなので,これをもとのサーバに取り付けし,起動. するとRAIDバッテリアラートは解消し,オールグリーン状態となった.
まとめ
交換パーツの入手も容易ではないサーバのRAIDバッテリ故障だったが,汎用部品で代替して解決することができた.めでたし.
*1:充電せずに取り付けをしてもよいが,取り付け後に充電され十分な電圧になるまでアラートは消えないので注意する必要がある
Wi-Fi接続でHTTP APIで制御できる信号灯を自作してみた話
何かに気づきたいとき
日常生活をしている上で,何かに気づきたいことってありますよね.
たとえば...
- 自宅のSW/RT/SVなどの機器で障害が発生した
- 温度/湿度/CO2濃度が一定以上になった
- 緊急地震速報などの警報がきた
- etc...
こういったとき,どのような手段で通知をうけているでしょうか? Legacyな方法だとメールで受信したり,最近だとslackなどにpostする,などで通知させているケースもあるでしょう.
これらの手段ではpush通知等で気づくこともできますが,より明確に気づかせたいケースもあるでしょう.
こういったとき,便利なのがパトライト社の積層信号灯*1などではないかと思います. 工作機械などの自動機械の状態を示すためにもよく利用されていますね.
これらに代表される信号灯は,表示状態を制御する制御端子や電源が独特だったりします(産業機械などに合わせられているケースが多い). そこで,汎用性をもたせたHTTP APIでフルカラーLED,ブザーを制御でき,USB 5Vで動作する信号表示器を自作してみたので紹介します.
信号灯の自作
材料がこちらです. MCUにはESP8266, ESP-WROOM-02を利用しており,2.4GHz帯の無線LAN接続経由で操作できるようになっています.
基盤は自分でESP-WROOM-02用の汎用基盤として作成したものを利用しており,ユニバーサル部にLEDやブザーを駆動する回路を付加しています.
筐体は3Dプリンタで作成しました.
これらのパーツをもりもり組み合わせていきます.
スペーサーをいれてタッピングで固定.
半透明な頭の部分と本体はネジ山を切ってあるので,締め込んで固定します.
六角形にちょうど汎用のスペーサが合うようになっているので,両端ナットになっているスペーサを差し込んで両側からねじ止めして挟む形で止めます.
点灯させるとこんな感じになります.
APIはHTTP APIで,json形式でやり取りできるようになっています.LEDとブザーを制御できます.
LEDはフルカラーLEDのPWM制御で1024段階,intervalを指定した点滅ができるようになっています.
異なる色を積層させる積層信号灯とは違い,色は何らか1種類しか表現できませんが,フルカラー表示ができるようになっているので,アラート種別灯に応じて,ある程度違った表現をすることができます.
ブザーも同様,ON/OFFの他にintervalを指定してON/OFFの繰り返しリピートができるようになっています.
% curl -X PUT -d '{"red": 2000, "green": 0, "blue": 0, "interval": 100, "flash": true}' 'http://fast.local/indicator' -s | jq . { "red": 1023, "green": 0, "blue": 0, "interval": 100, "isOn": true, "flash": true } % curl -X PUT -d '{"isOn": true, "repeat": true, "interval": 100}' 'http://fast.local/beep' -s | jq . { "isOn": true, "repeat": true, "interval": 100 }
色相を変化させるとこんな感じ.
これらを組み合わせると,トラフィック量に応じて色彩を変化させる(青=低トラフィック,赤=高トラフィック)ことで回線トラフィック状況を可視化できたりします.
また,zabbixのmediaとしてこのAPIをたたくように登録しておくと,zabbixで検知したtrigger種に応じて色を変えて通知することなどに応用できます.
赤色のボタンを搭載していますが,これは1クリックでブザーが,ダブルクリックでLEDがOFFにになるようになっています.アラートに気づいたらまずうるさいブザーを停止する,などの操作が即座に現地で行えるようになっています.
こういった機能を組み合わせて,我が家ではもっぱらzabbixのアラート通知用として活躍しています.
今回作成した信号灯はFlexible Alerting Signal Tower(FAST)と名付け*2,Opensourceとして3D modelやfirmwareを公開しています.
(まだ完全ではないので,2021/08現在beta扱いです...)
GitHub - jp7fkf/FAST: Opensource signal tower using ESP8266 WiFi-module.
通知ソリューションの自作に興味がある方など,制作してみてはいかがでしょうか.
まとめ
- 汎用性のあるHTTP APIとUSB電源で動作する信号灯を制作しました.
- zabbix などの監視システムと組み合わせて"気づく"ソリューションの実現ができました.
謝辞
- 本制作物を制作するにあたり,とくにfirmwareについて kerikun11 氏のIR-Station をとても参考にさせていただきました.この場を借りて感謝申し上げます.
Feed43でRSSフィードが提供されていないwebページをRSS購読する話
RSSとは
RSSとはwebサイトやブログなどのサマリ(見出し,要約)を購読することができる仕組みで,当該サイトの更新情報をwatchする際などに利用されている. RSSという名前はRDF Site Summary(0.9), Rich Site Summary(0.91-), Really Simple Syndication(2.0-)の略語であるようで,面白いことにRSSという同じ略称であるにもかかわらず,バージョンによってこの正式名称が異なるそうである.現在多く利用されているRSS2.0では,Really Simple Syndicationが正式名称とされている*1. RSSはxmlを用いて記述されている.RSSのxmlを見るとどのversionのRSSフォーマットが利用されているかを確認することができる.
<rss version="2.0">
slackのRSS購読機能
ビジネスチャットツールとして知られているslackにはRSSフィードの購読機能が存在する*2. これを用いて自分のwatchしておきたいページのRSSフィードを登録し,更新があったときにはslackのpostで更新を受け取ることができる.
RSS配信がされていないwebページを購読する - Feed43
こういった便利なしくみであるRSSだが,一般にはこのRSSフィードはコンテンツの提供元にて用意され,用意されたRSSを任意の購読希望者が購読する形となっている.つまり,コンテンツの提供元がRSSフィードを配信しなければ購読できないことを意味する.今回私はこの状況に陥り,購読したかったコンテンツにRSSフィードが存在しないという状況であった.これのよい解決策がないかと探ってみると,Feed43 というRSS購読に必要な情報をパースし,RSS配信を構成してくれるサービスを見つけた.これを利用してRSSフィードを構成し,slackでRSS購読を行うことができたので紹介する.
今回題材としてネットワンシステムズ株式会社様の匠コラムを利用させていただく*3.このミニブログ的コンテンツの更新情報をslackで受け取ることを目的とする.
まずFeed43にアクセスし,[Create your first RSS feed] ボタンからRSSフィード作成画面に遷移する.
すると下記のような画面に遷移し,購読したいRSSフィードを作るためのconfigurationを行っていくことになる.
Step 1. Specify source page address (URL)
ここではRSSフィードに必要な情報が含まれるページのURLを記述する.
今回題材としている匠コラムでは以下のURLでjson形式でコンテンツの情報を得ることができる(ありがたい).これを利用させてもらうことにする.
URLを記述したら右下の[Reload] をクリックしてコンテンツを取得して次のstepへ.
Step 2. Define extraction rules
ここでは取得したコンテンツから正規表現に似たようなものを使って,必要な情報を切り出していく.このsearch patternの書き方は Understanding Search Patterns and Output Templates - Feed43が参考になる. ここではエントリの日付,タイトル,ページのpathを切り出している.正規表現を書いてみたら右下の[Extract]ボタンを押して,自分の思い通りに切り出されいるかを確認しながら勧めていくとよい.うまく切り出せていたら次のステップへ.
Step 3. Define output format
ここでは,切り出した要素を使って実際のRSSフィードの中身を定義していく.書かれているとおりfeedのタイトル,リンク,説明や,RSSアイテムのタイトル,リンク,コンテンツを記述することができる.Step2で切り出した要素を自分の好きなように組み合わせてRSSフィードを構成しよう.
構成できたら[Preview[を押して実際のRSSフィードを見てみよう.うまくpreviewできると Your feed is ready!
という要素が現れる.RSSフィードの作成はこれだけで完成だ.表示されている購読用のリンクを用いて購読することができる.
SlackでのRSS購読
slackのRSSフィード購読機能はとてもかんたんに利用することができる.購読をポストしたいチャンネルで
/feed subscribe <rss-feed-url>
と投稿するだけである.これだけで購読は完了だ.先程作成したFeed43のRSSフィードURLを使って購読しよう.
うまく購読できていると,更新があった場合に下記のような形で更新がポストされる.非常に便利だ.
まとめ
References
*1:RSS 2.0 specification - W3C
*2:Slack に RSS フィードを追加する | Slack
*3:この方式のRSSフィード作成ではどうしても定期的にwebコンテンツにアクセスする必要性があることから,多少なりともwebサーバ側に負荷をかけることになることに十分注意をする必要があります.もしもネットワンシステムズ株式会社様がこの行為の停止を求める場合には速やかに従うことを約束します
ANSI escape sequenceを使ったterminal文字色変更をサクっとやるためのヤツ
題の通りのやつをサクっとできるようにscriptにした.echoしているだけで工夫が全然無いけど事足りるっぽい.
zshrcとかに書いておくなどする.
######### shellcolors ############ function shellcolors () { echo -e "\033[1m# Basic\033[m" echo -e "Set color: \"\\\033[<attribute>;<foreground>;<background>m\"" echo -e "Reset color: \"\\\033[m"\" echo -e "\033[1m# Attributes:\033[m" echo -e "\\\033[0m\033[0mReset\033[m\\\033[m" echo -e "\\\033[1m\033[1mBold\033[m\\\033[m" echo -e "\\\033[2m\033[2mLowLuminance\033[m\\\033[m" echo -e "\\\033[3m\033[3mItalic\033[m\\\033[m" echo -e "\\\033[4m\033[4mUnderline\033[m\\\033[m" echo -e "\\\033[5m\033[5mBlink\033[m\\\033[m" echo -e "\\\033[6m\033[6mHighBlink\033[m\\\033[m" echo -e "\\\033[7m\033[7mInvert\033[m\\\033[m" echo -e "\\\033[8m\033[8mHide\033[m\\\033[m" echo -e "\\\033[9m\033[9mStrikethrough\033[m\\\033[m" echo -e "\033[1m# 16 foreground colors:\033[m" echo -e "\\\033[30m\033[30mBLACK\033[m\\\033[m\t\\\033[90m\033[90mLIGHT BLACK\033[m\\\033[m" echo -e "\\\033[31m\033[31mRED\033[m\\\033[m\t\\\033[91m\033[91mLIGHT RED\033[m\\\033[m" echo -e "\\\033[32m\033[32mGREEN\033[m\\\033[m\t\\\033[92m\033[92mLIGHT GREEN\033[m\\\033[m" echo -e "\\\033[33m\033[33mYELLOW\033[m\\\033[m\t\\\033[93m\033[93mLIGHT YELLOW\033[m\\\033[m" echo -e "\\\033[34m\033[34mBLUE\033[m\\\033[m\t\\\033[94m\033[94mLIGHT BLUE\033[m\\\033[m" echo -e "\\\033[35m\033[35mMAGENTA\033[m\\\033[m\t\\\033[95m\033[95mLIGHT MAGENTA\033[m\\\033[m" echo -e "\\\033[36m\033[36mCYAN\033[m\\\033[m\t\\\033[96m\033[96mLIGHT CYAN\033[m\\\033[m" echo -e "\\\033[37m\033[37mWHITE\033[m\\\033[m\t\\\033[97m\033[97mLIGHT WHITE\033[m\\\033[m" echo -e "\033[1m# 16 background colors:\033[m" echo -e "\\\033[40m\033[40mBLACK\033[m\\\033[m\t\\\033[100m\033[100mLIGHT BLACK\033[m\\\033[m" echo -e "\\\033[41m\033[41mRED\033[m\\\033[m\t\\\033[101m\033[101mLIGHT RED\033[m\\\033[m" echo -e "\\\033[42m\033[42mGREEN\033[m\\\033[m\t\\\033[102m\033[102mLIGHT GREEN\033[m\\\033[m" echo -e "\\\033[43m\033[43mYELLOW\033[m\\\033[m\t\\\033[103m\033[103mLIGHT YELLOW\033[m\\\033[m" echo -e "\\\033[44m\033[44mBLUE\033[m\\\033[m\t\\\033[104m\033[104mLIGHT BLUE\033[m\\\033[m" echo -e "\\\033[45m\033[45mMAGENTA\033[m\\\033[m\t\\\033[105m\033[105mLIGHT MAGENTA\033[m\\\033[m" echo -e "\\\033[46m\033[46mCYAN\033[m\\\033[m\t\\\033[106m\033[106mLIGHT CYAN\033[m\\\033[m" echo -e "\\\033[47m\033[47mWHITE\033[m\\\033[m\t\\\033[107m\033[107mLIGHT WHITE\033[m\\\033[m" echo -e "\033[1m# 256 colors:\033[m" echo -e "Foreground: \"\\\033[38;5;<color number>mCOLOR\\\033[m\"" echo -e "Background: \"\\\033[48;5;<color number>mCOLOR\\\033[m\"" seq 0 255 | xargs -I {} printf "\033[38;5;{}m{}\033[m " echo -e "" echo -e "\033[1m# 24bit colors\033[m" echo -e "Foreground: \"\\\033[38;2;<red(0-255)>;<green(0-255)>;<blue(0-255)>m\\\033[m\"" echo -e "Background: \"\\\033[48;2;<red(0-255)>;<green(0-255)>;<blue(0-255)>m\\\033[m\"" }
実行するとこんな感じ.
References
CLIでサクっとimage名を指定してdocker tagの一覧を取得する話
dockerを使っているとpullするときにdocker tagを取得したくなることがよくある.どのversionのimageがdocker hubにあがっているのかをみてそれをversion指定してpullしたくなる時とか.
今回はimage名を指定してdocker tagの一覧を取得するようなzsh functionをつくってzshrcに記述し,CLI command的に利用できるようにしてみたので紹介する.なおこの内容はほぼ下記の内容を踏襲させてもらって,一部工夫をいれたものである.
早速だが,モノは下記の通り.これを ~/.zshrc
とかに書いておく.書いたあとに適当にshellを再起動するか, source ~/.zshrc
とかをして読み込めば使えるようになる.
function docker-taglist (){ local image=${1} local limit=${2:=1} # official image exists under /library path if [[ ! "${image}" =~ ^.+/.+$ ]]; then image="library/${image}" fi local next="https://registry.hub.docker.com/v2/repositories/${image}/tags" local names while [[ ${limit} -gt 0 && ${next} != "null" ]] do response=$(curl --silent --show-error "${next}") names="${names}\n$(echo ${response} | jq -r ".results|map_values(\"${image}:\"+.name)|.[]")" next=$(echo ${response} | jq -r .next) limit=$((${limit}-1)) done echo -e "${names}" }
やっていることは見ての通り簡単なもので,https://registry.hub.docker.com/v2/repositories/${image}/tags
を叩いて帰ってくるjson dataからほしいデータをjqで抜いて適当にくっつけているだけである.たとえばmysqlをimageを指定してを叩くと
% curl https://registry.hub.docker.com/v2/repositories/library/mysql/tags {"count":119,"next":"https://registry.hub.docker.com/v2/repositories/library/mysql/tags?page=2","previous":null,"results":[{"creator":7,"id":20021,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:50.332131Z","last_updater":1156886,"last_updater_username":"doijanky","name":"latest","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:50.332131Z"},{"creator":1156886,"id":146193135,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:47.441552Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0.24","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:47.441552Z"},{"creator":621950,"id":5471601,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:44.794422Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:44.794422Z"},{"creator":621950,"id":5472027,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:bbeff35b63bf28aeb024de309aab2d501f8aa30e94664d3840d55b36c8db53c8","os":"linux","os_features":"","os_version":null,"size":161997667,"status":"active","last_pulled":"2021-05-06T04:22:19.161759Z","last_pushed":"2021-04-19T19:14:41.194888Z"}],"last_updated":"2021-04-19T19:14:42.993272Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8","repository":21179,"full_size":161997667,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:22:19.161759Z","tag_last_pushed":"2021-04-19T19:14:42.993272Z"},{"creator":1156886,"id":146193124,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:31.26934Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.7.34","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:31.26934Z"},{"creator":7,"id":20000,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:26.36101Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.7","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:26.36101Z"},{"creator":1156886,"id":133913292,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:4d3ef8034652ee13d7db73eafeb783440a2f10f2dd54e4f8808718b0748cc053","os":"linux","os_features":"","os_version":null,"size":102980915,"status":"active","last_pulled":"2021-05-06T04:35:45.82737Z","last_pushed":"2021-04-19T19:14:17.44793Z"}],"last_updated":"2021-04-19T19:14:22.28644Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.6.51","repository":21179,"full_size":102980915,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:35:45.82737Z","tag_last_pushed":"2021-04-19T19:14:22.28644Z"},{"creator":7,"id":19961,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:4d3ef8034652ee13d7db73eafeb783440a2f10f2dd54e4f8808718b0748cc053","os":"linux","os_features":"","os_version":null,"size":102980915,"status":"active","last_pulled":"2021-05-06T04:35:45.82737Z","last_pushed":"2021-04-19T19:14:17.44793Z"}],"last_updated":"2021-04-19T19:14:17.836259Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5.6","repository":21179,"full_size":102980915,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:35:45.82737Z","tag_last_pushed":"2021-04-19T19:14:17.836259Z"},{"creator":7,"id":19969,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:9f768489d306402ea11243f1b96aeaa4696adb9ed7c1bb0318724759b9cbd1a6","os":"linux","os_features":"","os_version":null,"size":154430588,"status":"active","last_pulled":"2021-05-06T04:23:02.792412Z","last_pushed":"2021-04-19T19:14:07.955061Z"}],"last_updated":"2021-04-19T19:14:10.182408Z","last_updater":1156886,"last_updater_username":"doijanky","name":"5","repository":21179,"full_size":154430588,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:23:02.792412Z","tag_last_pushed":"2021-04-19T19:14:10.182408Z"},{"creator":1156886,"id":133747539,"image_id":null,"images":[{"architecture":"amd64","features":"","variant":null,"digest":"sha256:355617769102e9d2ebb7d5879263a12d230badb7271c91748b2c7b0ac6971083","os":"linux","os_features":"","os_version":null,"size":159323709,"status":"active","last_pulled":"2021-05-06T04:53:14.908711Z","last_pushed":"2021-04-10T07:42:48.565852Z"}],"last_updated":"2021-04-10T07:42:55.155529Z","last_updater":1156886,"last_updater_username":"doijanky","name":"8.0.23","repository":21179,"full_size":159323709,"v2":true,"tag_status":"active","tag_last_pulled":"2021-05-06T04:53:14.908711Z","tag_last_pushed":"2021-04-10T07:42:55.155529Z"}]}
このような応答が帰ってくる.このうちそれぞれのエントリについてのtag name情報をjqで抜いている.抜いたtag nameを適当にimage名とコロンでくっつけて,コピペしてdocker pullにそのまま入れれるように加工してある.
実際に使ってみるとこのような感じ
# official image(library/mysql等library配下のもの) % docker-taglist mysql library/mysql:latest library/mysql:8.0.24 library/mysql:8.0 library/mysql:8 library/mysql:5.7.34 library/mysql:5.7 library/mysql:5.6.51 library/mysql:5.6 library/mysql:5 library/mysql:8.0.23 # unofficial image % docker-taglist mysql/mysql-server mysql/mysql-server:latest mysql/mysql-server:8.0.24-1.2.2-server mysql/mysql-server:8.0.24 mysql/mysql-server:8.0 mysql/mysql-server:8.0.24-aarch64 mysql/mysql-server:8.0-aarch64 mysql/mysql-server:8.0.24-1.2.2-server-aarch64 mysql/mysql-server:latest-aarch64 mysql/mysql-server:8.0.24-1.2.2-server-amd64 mysql/mysql-server:8.0-amd64 % % docker-taglist gitlab/gitlab-ee gitlab/gitlab-ee:latest gitlab/gitlab-ee:nightly gitlab/gitlab-ee:rc gitlab/gitlab-ee:13.11.3-ee.0 gitlab/gitlab-ee:13.9.7-ee.0 gitlab/gitlab-ee:13.10.4-ee.0 gitlab/gitlab-ee:13.11.2-ee.0 gitlab/gitlab-ee:13.11.1-ee.0 gitlab/gitlab-ee:13.11.0-ee.0 gitlab/gitlab-ee:13.10.3-ee.0
ページネーションも可能で,一度に多くのtagを取りたい場合は第二引数に取得ページ数を指定する.今回の実装では指定したページのみを取得するのではなく,指定されたページ数分全部を取得する.
% docker-taglist gitlab/gitlab-ee 2 gitlab/gitlab-ee:latest gitlab/gitlab-ee:nightly gitlab/gitlab-ee:rc gitlab/gitlab-ee:13.11.3-ee.0 gitlab/gitlab-ee:13.9.7-ee.0 gitlab/gitlab-ee:13.10.4-ee.0 gitlab/gitlab-ee:13.11.2-ee.0 gitlab/gitlab-ee:13.11.1-ee.0 gitlab/gitlab-ee:13.11.0-ee.0 gitlab/gitlab-ee:13.10.3-ee.0 gitlab/gitlab-ee:13.9.6-ee.0 gitlab/gitlab-ee:13.8.8-ee.0 gitlab/gitlab-ee:13.10.2-ee.0 gitlab/gitlab-ee:13.8.7-ee.0 gitlab/gitlab-ee:13.9.5-ee.0 gitlab/gitlab-ee:13.10.1-ee.0 gitlab/gitlab-ee:13.10.0-ee.0 gitlab/gitlab-ee:13.7.9-ee.0 gitlab/gitlab-ee:13.8.6-ee.0 gitlab/gitlab-ee:13.9.4-ee.0
これでいちいちdocker hubを見に行ってtagを確認したりせずにCLIからサクサクdocker pullできている.いい感じだ.
References
2x4突っ張り方式で本棚を作った話
一人暮らしでそこまで広くない部屋に住んでるとどうしても気軽に本棚だとかの大型の家具を置いたりする決断ができずにいた.置いても場所を取るし,引っ越すときに次の家で活用できるかわからないし,結局買えない.
ところが最近は2x4などの木材を使って突っ張る方式で柱を立てて簡易的な家具を作ることができるものがある.ちょうど自宅に収納スペースがなくなってきていて困っているところだったので,この方式でDIYしてみようと思った.
突っ張り方式にもいろいろあるようでバネ圧を利用する方式(ディアウォールなど)や,一般的な突っ張り棒のようなネジを利用する方式(今回使うもの),あとはジャッキのような方式(突っ張りジャッキとかいう商品名で販売されている)があるらしい.突っ張りの強さによって使い分けたりすると良いようで,バネ<ネジ<ジャッキの順で強く突っ張れる傾向にあるよう.強く突っ張れればもちろん耐荷重等の制限もより幅広くなるようだ.
今回は手始めに下記のようなネジを利用した突っ張り方式でやってみることにした.
平安伸銅工業 LABRICO STAPLER FIX シリーズ 2×4 アジャスター マットブラック DXC-1
- 発売日: 2017/11/30
- メディア: Tools & Hardware
近くのホームセンターで2x4材と1x4材を調達し,所望の長さに加工してもらった.今回は加工してもらって自宅までハンドキャリー.2mくらいあったのでちょっと大変だったが近距離だったのでなんとかなった.一本物のほうが強度的に強そうな気がしたので一本にしてみたが,下記のようなパーツを使えば分割して持ち運んで構築時につなぐことも可能である.正直強度はあまり変わらない気もする.ちゃんと平面が出ていて合わせてあれば,2x4の縦方向であれば7割以上強度は保たれるような気がする.完全に勘だけど.
// もちろん切断下方向と同方向のせん断,曲げ応力は全然もたないだろうが,2x4を突っ張る場合切断面に垂直に圧縮応力がかかる形になるので,よほど条件が悪くない限りそれなりに強度が出そう,ということである.
若井産業 WAKAI ツーバイフォー材専用壁面突っ張りシステム ディアウォール専用中間ジョイント ブラック DWCJBK
- メディア: Tools & Hardware
平安伸銅工業 LABRICO DIY収納パーツ ジョイント アイアン 屋外使用可 ブラック IXK-4
- メディア: Tools & Hardware
あとは適当に2x4と1x4をつなぐ金具や,落下防止に使うようなパーツを揃える.今回は初手としてワイヤの張力を利用する方式を試してみた.ただしこれは実は失敗で,ワイヤを張り出すためのバーの強度が不足しがちになってしまった.後ほど画像で紹介するが,ワイヤ張力を利用するのは文庫本などの奥行きが小さいものだけに採用し,奥行きがあり張り出しが大きいものはLアングルに1x4をネジ止めして落下防止を施した.
ダイドーハント(DAIDOHANT) 補強金物 2x4(ツーバイ)サポート Lアングル型 黒塗装 24A‐1‐BK 10179006
- メディア: Tools & Hardware
WAKI ユニクロ 特厚アングル 90X180mm BY-020
- メディア: Tools & Hardware
ひめじや ステンレス カット ワイヤーロープ φ2.0mmx10m
- メディア: Tools & Hardware
これらを適当に組み合わせてつくった.
手順に従って2x4を2本使って柱を立てるが,かんたんにできた.垂直を見ておいたほうがいいので,水準器を使って垂直を見た.Tjimaの水準器をしばらく前に買っていたけど,活躍してくれた.Tajimaの製品はモノがよくて助かる.コンベックスメジャーとか,カッターナイフとか,電工ナイフとかもTajimaのやつを使ってるけど,全部気に入っている.
タジマ(Tajima) オプティマレベル 130mm ゴールド OPT-130G
- メディア: Tools & Hardware
見ていただけるとわかると思うが,空間を有効利用するために棚自体は天井付近に構成している.これで下の部分はまた違う用途に拡張して利用できるし,ロボット掃除機フレンドリーになるのもいいところ.下が狭いと空間が狭く感じるので足元は広いほうがいい. これでイメージが付いたら一気に仕上げていく.2x4, 1x4にタッピングをバシバシ打っていく.Makitaのペン型インパクトを持っていたので,これで.ペン型は小回りがきいていい.
マキタ ペン型インパクトドライバTD022(7.2V)黒 トルク25Nm 1.5Ahバッテリ2本・充電器付 TD022DSHXB
- メディア: Tools & Hardware
棚板が1x4だと重たい技術書をたんまり載せた際の強度が心配だったが,やや歪みがあるものの,まだ余裕がありそうなくらいであった.もし今後湿度とかの影響で顕著に反ってきたりして危険性を感じたら1x6にするとかして強度をあげようかと思う(実は棚板を1x6にするか悩んだものの,価格が1x4の2倍以上したので1x4を選んでいた). 柱自体の強度については全然余裕がありそう.棚板自体も構成物の一部なので,これも強度を増加させる要因になっている.柱自体が歪んだりするのを抑えてくれていていい感じ.
落下防止のワイヤも板も,十分に効いていていいかんじである.手が滑って意図せず手前に本を倒してしまってもワイヤや板が受けてくれて落下が防げている.ワイヤについては全部の重量が一気にワイヤにかかったりすると不安があるが,そういうシチュエーションは常用する上ではあまり考えられないのでいいかと思っている.地震のときはどうなるかわからないが,たぶん持ってくれる気がしている. 落下防止のワイヤや板があるが,奥行きにやや余裕をもたせている(2-3cm程度?)ことや,高さにも余裕をもたせているので,本の背表紙側を軸に回転させてやる感じで出し入れができるようになっている.収納する本のうち一番大判な本をあてて現物合わせで位置決めをしているので,ピッタリである.
というわけで,いい感じに本が収納できるようになった.めでたし.