JP7FKFの備忘録

ヒトは,忘れる生き物だから.

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\""
}

実行するとこんな感じ. f:id:jp7fkf:20210617022851p:plain

References

CLIでサクっとimage名を指定してdocker tagの一覧を取得する話

dockerを使っているとpullするときにdocker tagを取得したくなることがよくある.どのversionのimageがdocker hubにあがっているのかをみてそれをversion指定してpullしたくなる時とか.

今回はimage名を指定してdocker tagの一覧を取得するようなzsh functionをつくってzshrcに記述し,CLI command的に利用できるようにしてみたので紹介する.なおこの内容はほぼ下記の内容を踏襲させてもらって,一部工夫をいれたものである.

su-kun1899.hatenablog.com

早速だが,モノは下記の通り.これを ~/.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してみようと思った.

突っ張り方式にもいろいろあるようでバネ圧を利用する方式(ディアウォールなど)や,一般的な突っ張り棒のようなネジを利用する方式(今回使うもの),あとはジャッキのような方式(突っ張りジャッキとかいう商品名で販売されている)があるらしい.突っ張りの強さによって使い分けたりすると良いようで,バネ<ネジ<ジャッキの順で強く突っ張れる傾向にあるよう.強く突っ張れればもちろん耐荷重等の制限もより幅広くなるようだ.

今回は手始めに下記のようなネジを利用した突っ張り方式でやってみることにした.

近くのホームセンターで2x4材と1x4材を調達し,所望の長さに加工してもらった.今回は加工してもらって自宅までハンドキャリー.2mくらいあったのでちょっと大変だったが近距離だったのでなんとかなった.一本物のほうが強度的に強そうな気がしたので一本にしてみたが,下記のようなパーツを使えば分割して持ち運んで構築時につなぐことも可能である.正直強度はあまり変わらない気もする.ちゃんと平面が出ていて合わせてあれば,2x4の縦方向であれば7割以上強度は保たれるような気がする.完全に勘だけど.
// もちろん切断下方向と同方向のせん断,曲げ応力は全然もたないだろうが,2x4を突っ張る場合切断面に垂直に圧縮応力がかかる形になるので,よほど条件が悪くない限りそれなりに強度が出そう,ということである.

あとは適当に2x4と1x4をつなぐ金具や,落下防止に使うようなパーツを揃える.今回は初手としてワイヤの張力を利用する方式を試してみた.ただしこれは実は失敗で,ワイヤを張り出すためのバーの強度が不足しがちになってしまった.後ほど画像で紹介するが,ワイヤ張力を利用するのは文庫本などの奥行きが小さいものだけに採用し,奥行きがあり張り出しが大きいものはLアングルに1x4をネジ止めして落下防止を施した.

これらを適当に組み合わせてつくった.

手順に従って2x4を2本使って柱を立てるが,かんたんにできた.垂直を見ておいたほうがいいので,水準器を使って垂直を見た.Tjimaの水準器をしばらく前に買っていたけど,活躍してくれた.Tajimaの製品はモノがよくて助かる.コンベックスメジャーとか,カッターナイフとか,電工ナイフとかもTajimaのやつを使ってるけど,全部気に入っている.

2x4自体が多少反っていることもあるが,そこは中央部付近で垂直を見るなどする. 続いて1x4をためしに止めて,強度の確認や本を実際に載せて張り出しのイメージをしていく. f:id:jp7fkf:20210503021631j:plain

見ていただけるとわかると思うが,空間を有効利用するために棚自体は天井付近に構成している.これで下の部分はまた違う用途に拡張して利用できるし,ロボット掃除機フレンドリーになるのもいいところ.下が狭いと空間が狭く感じるので足元は広いほうがいい. これでイメージが付いたら一気に仕上げていく.2x4, 1x4にタッピングをバシバシ打っていく.Makitaのペン型インパクトを持っていたので,これで.ペン型は小回りがきいていい.

ワイヤはそこまで張力をかける気はないので,電線用の丸型端子を圧着してネジ止めした.そんなこんなで完成. f:id:jp7fkf:20210503021731j:plain

棚板が1x4だと重たい技術書をたんまり載せた際の強度が心配だったが,やや歪みがあるものの,まだ余裕がありそうなくらいであった.もし今後湿度とかの影響で顕著に反ってきたりして危険性を感じたら1x6にするとかして強度をあげようかと思う(実は棚板を1x6にするか悩んだものの,価格が1x4の2倍以上したので1x4を選んでいた). 柱自体の強度については全然余裕がありそう.棚板自体も構成物の一部なので,これも強度を増加させる要因になっている.柱自体が歪んだりするのを抑えてくれていていい感じ.

落下防止のワイヤも板も,十分に効いていていいかんじである.手が滑って意図せず手前に本を倒してしまってもワイヤや板が受けてくれて落下が防げている.ワイヤについては全部の重量が一気にワイヤにかかったりすると不安があるが,そういうシチュエーションは常用する上ではあまり考えられないのでいいかと思っている.地震のときはどうなるかわからないが,たぶん持ってくれる気がしている. 落下防止のワイヤや板があるが,奥行きにやや余裕をもたせている(2-3cm程度?)ことや,高さにも余裕をもたせているので,本の背表紙側を軸に回転させてやる感じで出し入れができるようになっている.収納する本のうち一番大判な本をあてて現物合わせで位置決めをしているので,ピッタリである.

というわけで,いい感じに本が収納できるようになった.めでたし.

机の裏の地獄のケーブルを配線ダクトを使って整頓する話

前々からなんとかしないとと思っていたのだが,机の裏の配線類が地獄の形相を呈していた.Mac miniを自宅に導入してからますます配線も増えてしまっていた. f:id:jp7fkf:20210503021954j:plain

机の裏の配線類をなんとかできるものがないものかと色々amazonで調べてみたりしていて,下記のようなものならばたくさん見つかったが,どうやって机の裏にマウントしようとか,机の端から端までカバーできないとか,完全にきれいにできなさそうで導入できずにいた.

しかしなんとかしたいと思っていろいろとみっちり調べてみていたところ,下記のような商品を発見した.たしかにこれこそが私の望んでいたものだった.机の裏の端から端までがカバーできて,マウントもできる.ただし価格がネックだった.

これを見てうーんと考えていたところ,ケーブルをまとめるようなダクトは電気配線等で普通に使われているだろうという想定し,色々と調査してみたところ,「配線ダクト」と呼ばれるものがマッチした. 様々な会社の製品が配線ダクトというワードでヒットする.配電盤や,通信線などの集約をしているところでよく用いられるもののようだ.

amazonだと送料もついてしまってやや割高になってしまっているが,東京・秋葉原の愛三電気さんで同様の製品を扱っており,1本単位から購入できる.

星和電機 カッチングダクトBDR-682 1,830円 カッチングダクト・エスシーロック

愛三電気で手頃な価格で調達できるし,今回はこれを活用して自作してみることにした.

早速仕事終わりに愛三電気に行って調達してきた.今回使うカッチングダクトは60x80の幅と高さのものを採用した.OAタップとかACアダプタとかを入れたくなった時にも対応できるくらいのサイズとしてこれをチョイス.いい感じである. カッチングダクトと言う名の通り,スリットはニッパー等を使って簡単に切断できるようになっていて,自由にケーブルを出せるようになっている.便利. f:id:jp7fkf:20210503022047j:plain

カッチングダクトは図面が公開されていたので,これをもとに自分の机にマウントするためのアダプタを3Dプリンタを使って作る. f:id:jp7fkf:20210503022028j:plain f:id:jp7fkf:20210503022033j:plain f:id:jp7fkf:20210503022038j:plain

いい感じである.

アダプタができたら机にアダプタを付けるために穴あけをして,ネジ止めする. f:id:jp7fkf:20210503040546j:plain

ネジ止めしたアダプタにダクトを載せてみて,位置を見ていく. f:id:jp7fkf:20210503022232j:plain

机との隙間の感じとか,机とダクトの高さ関係や,まわりとの干渉がないかも確認.よさそうである. f:id:jp7fkf:20210503022227j:plain f:id:jp7fkf:20210503022252j:plain

よさそうであればダクトとマウントアダプタをネジ止めして,ごちゃごちゃだったケーブルをダクトの中に収めていく.絡まっているものはほどいて再配線.みるみるきれいになっていく. ケーブルを出す部分はニッパで切断して出してやる. f:id:jp7fkf:20210503022302j:plain

ケーブルをあらかたダクトに入れて整頓し,上のカバーをはめる.ごちゃごちゃだったケーブルがダクト内にまとまって見違えるようにスッキリした. f:id:jp7fkf:20210503022332j:plain

これで見た目もスマートになり,ケーブルも不意に絡まったりもすることなく快適に過ごせそうである.めでたし.

ホイップアンテナ用マグネット基台を自作してみた話

ふとマグネット基台が手元に欲しくなった.真面目に買うと3000円くらいはするけど,カジュアルに使いたいだけなのでそこまでコストをかけたくない.手持ちによさげな強いマグネットがあったので,作ってみることにした.ハウジングは3Dプリンタを使ってABS樹脂で作る.

f:id:jp7fkf:20200919094934j:plain
手持ちであった強いマグネット.これがないと始まらない.とても強力なので不用意に電子機器を近づけたりできない.鉄とマグネットの間に指を挟んだりしたら怪我するレベル.

私はなにか作りたいものがあったり,アイディアが生まれそうな時は,最近だいたいiPadに書いていく.iPadを導入する前はProject Paperを使っていた.オキナのProjectPaperは書き心地もよいし,罫線が丁度いい色で入っていてよい.

オキナ プロジェクトペーパー B5 5ミリ方眼罫 100枚 PPB55S

オキナ プロジェクトペーパー B5 5ミリ方眼罫 100枚 PPB55S

  • 発売日: 2017/07/20
  • メディア: オフィス用品

f:id:jp7fkf:20200919093912j:plain
ソフトウェアでもハードウェアでもなにか作りたいときはいつもだいたいこうやって描くことから始まる. こうして描いてみるとだいたい作りたいもののイメージがついてくる.この脳のうちにデータに起こす.
f:id:jp7fkf:20200919094403p:plain
fusion360モデリングする.今回は上半分と下半分の2パーツからハウジングを構成して,間にケーブルを通すスリットをいれておく.2つのパーツでマグネットを固定して保持し,パーツ同士はネジ固定にする.ネジ固定にするにあたって下側のパーツにはインサートナットを熱圧入してやることにした.

モデルができたら早速作っていく.3Dプリンタにデータを食わせて積層する. f:id:jp7fkf:20200919093717j:plain
f:id:jp7fkf:20200919093727j:plain
とりあえず下半分ができた. f:id:jp7fkf:20200919093744j:plain
続いて上半分も出力する. f:id:jp7fkf:20200919093755j:plain
f:id:jp7fkf:20200919093805j:plain
f:id:jp7fkf:20200919093815j:plain
上半分もできた.サポート材の条件がよくなくて,剥がすのが大変だった. ハウジングパーツができたので,あとは組み上げるだけ.インサートナットを熱圧入する. www.monotaro.com
モノタロウで買ってあったM4の廣杉計器のインサートナットをハンダゴテで熱しながら圧入していき,ある程度挿入できたら机などの平面にナットとパーツを押し当ててツライチになるようにする. するとわりときれいに圧入できる. f:id:jp7fkf:20200919095300j:plain
ここまできたらあとはコネクタとケーブルをつけて組み上げる.ケーブルは取り回しやすい3D-2V.秋葉原の九州電気で買った. f:id:jp7fkf:20200919095321j:plain
M型接栓は安物の手持ち. f:id:jp7fkf:20200919093837j:plain
これを組み上げて f:id:jp7fkf:20200919093901j:plain
完成.使ってみるとこんな感じ. f:id:jp7fkf:20200919101135j:plain
丁度いい吸着力でいいかんじ.
吸着力はハウジング下部パーツのマグネットと底面までの高さを変えてやることで調整できるが,今回は4mmで一発成功.ちょうどよかった.

というわけでほしいと感じてから手に入るまでとても早く,手持ちの機器と部材でサクサクと作り上げることができました.めでたし.

ICOM IC-T90のバッテリ換装をしてみた話

おことわり

  • 本記事で紹介する内容はわたし自身が自身の責任のもと実施した例を紹介するにすぎません.
  • 本記事を参考して生じた事故,火災やその他の損害等が生じた場合でも,いかなる理由に関わらず一切の責任を負いかねます.
  • 一般的な二次電池,得に高エネルギー密度であるリチウムイオンバッテリーは取り扱いを誤るとたやすく爆発・火災等を生じる危険性があります.このことに十分配慮する必要があります.
  • この内容は製造元であるアイコム株式会社とは一切関係がなく,また推奨されることではありません.保証等が一切受けられなくなることをご理解ください.
  • もしも参考にされる場合でも,上記のことを十分ご理解頂いた上で事故なく実施いただけることを願います.

コトの発端

しばらく前に手に入れていたIC-T90だが,付属のバッテリーが使い物にならなくなった.具体的にはチャージャーで充電しても5W送信した瞬間に電源が落ちる.また充電中にバッテリーが異常と思われるほどひどく発熱していたことがあった.このままでは爆発・火災になる恐れがあると判断してしばらく利用をやめていたが,どうにか使い続けられるようにできないかと色々思考錯誤してみていました.具体的には11Vの外部電源端子からの給電のみとして利用し,バッテリは外して運用することや,バッテリの交換を実施することでした.新規に純正バッテリを購入することも検討しましたが,バッテリの値段は安くなく,それなら11Vの外部電源から運用したほうがコスパはよさそうだ,などと考えていました.

しかしどうにも11Vの外部電源だとモビリティがよくありません.せっかくのハンディ機なのにいちいち外部電源のことを考えて用意しておく必要が出てきます.これでは使いにくいと考え,思いついたのがバッテリパックを分解・改造したバッテリの換装でした.ただ,リチウムイオンバッテリパックの改造は多くのリスクを伴うものであり幾度か考え直しましたが,保護回路付きのセルに入れ替えることである程度の安全性を担保しつつ,換装が行えないかと考えました.

早速換装

ICOMのバッテリパックです.BP-217という型番がついていて,7.4Vの1500mAhのものとなっています. f:id:jp7fkf:20200906232721j:plain

当初これを記事にする予定はなかったこともあり,分解時の写真が残っておらずに申し訳ないのですが,バッテリパックは側面の隙間にマイナスドライバ等を差し込んでこじ開けることができました.中にバッテリがいるということに注意をして,金属ではなくプラスチックのドライバを利用するなどするほうが安全でしょう.中には18500のリチウムイオンバッテリの生セルが2本,ニッケルのタブでスポット溶接されて内蔵されていました.セル外装はピンク色. タブ,電池の端子等をショートさせないよう十分注意を払いタブはニッパで切断してセルを取り出しました.セルさえ取り出し,絶縁してしまえば危険はひとまずありません.

分解時の写真が無いため,いきなり換装後の写真を紹介します. f:id:jp7fkf:20200906233422j:plain

このように,既存のバッテリパックの外装のみを再利用し,その中に新たに保護回路付きのセルを内蔵するような設計にしました.詳細を追って紹介します.

換装するバッテリとして選択したのはKEEPPOWERに18350, 1200mAhの保護回路付きのセルです. 値段も2セルで2000円未満と十分手頃です. www.amazon.co.jp

これを選ぶまでの過程はいくつかあります.要素としては下記を考えました.
1. もとのバッテリーパックの外装に内蔵できる大きさであること(絶対)
2. 内蔵した際に得られる公称電圧が7.4Vとなること(つまりバッテリパックの中で2Sのセルとして構成できること)
3. 保護回路がついていること(絶対)
4. できる限り容量が大きいものであること
5. さらなる交換・換装が可能であること

3の保護回路がついていることは絶対条件として考えていました.火災や爆発は避けたいからです.
1, 2の内容について,次のような結論を得ました.
もとのバッテリパックに入っているセルは生セルの18500セルとなっています.BP-217そのセルに最適化されたバッテリパックのサイズになっており,横幅には薄いニッケルのタブだけが収められる程度のサイズ余裕しかありません.しかし保護回路が搭載されたセルは一般の生セルよりも数mm長くなってしまいます.このことから同じサイズである18500の保護回路付きのセルはバッテリパックの外装に収めることはサイズ的余裕がないためできません.18500よりも小さいサイズとしては18490, 18350等があります.一般に電池の容量が増加すると電池自体のサイズも増加することから,4の条件を考えると18490サイズで保護回路付きのものがあり,全長がバッテリパックの外装に収められればこれを選びたいと考えるところでしたが,どうやら調べてみると18490のバッテリというのはあまり流通していないようで入手性がよくないようです.このことから今回は18350のサイズのセルを選ぶことにしました.また,このサイズにすることで5の条件である交換・換装用意になるようなしくみをバッテリパック内部に取り入れることが可能になりそうだという考えが浮かびます.

この時点で,上記のKEEPPOWERの18350保護回路付きセルはこれらの条件をすべて満たしており,さらに評判も悪くないメーカーであること,数多く利用され,実績のあるセイコーインスツルメンツの保護回路ICを利用していると謳われていることから上記を選択しています.

今回はこの5の条件である換装容易性を,通常の乾電池ボックス等で利用されているようなバネ性のあるコンタクトが利用できそうだと考えました.これは秋月電子で販売されているものを利用しました.ターミナルクリップと呼ばれているんですね. akizukidenshi.com

これら18350セル2本,上記のターミナルクリップ,その他配線類をもとのバッテリーパックの外装に収められれば求めるものができます.ここで懸念するべき点がいくつかあります.
1. リチウムイオンバッテリの特性がもともと入っているものと異なる可能性があること
2. 容量が異なること

少なくともこの点については気をつけなければなりません.いくら保護回路が入っているといえど,リチウムイオンバッテリで比較的特にリスクが有る作業が充電です. 充電はこの1, 2のことをよく考慮して実施する必要があります.リチウムイオンバッテリは一般に最大充電電流は1Cとされています.このセルは1200mAh, もとのセルは1500mAhです.この時点でIC-T90の急速充電装置およびIC-T90本体からの補助充電時の充電電流が高すぎる恐れがあるということは容易に想像できます.このことを気にかけておく必要があります.
また放電についても,もとのバッテリの放電特性が不明であることから,気にかける必要があります.しかしリチウムイオンバッテリの放電特性として低内部抵抗で比較的大電流を扱うことができることからそこまで大きな問題になることは少ないでしょう.KEEPPOWERのこのバッテリはの出力電流は最大4.1C出力の仕様であり,最大放電電流は約5A程度になります.あらかじめIC-T90のバッテリ運用時の必要電流を測定しましたが,5Aは大きく下回っていることを確認していましたので,この点についてはクリアです.

このことを忘れないようにしておき,作成後に検証することにします.

さて,長くなりましたが作成物の紹介をしていきます.購入したバッテリはこれ.ちゃんとケースもついてきて2セルで1500円くらいです.
f:id:jp7fkf:20200907003556j:plain
f:id:jp7fkf:20200907003610j:plain

バッテリとコンタクトするターミナルクリップをうまく固定するため,3Dプリンタで保持具を作ります.モデルはこんな感じ.
f:id:jp7fkf:20200907004604p:plain

この保持具にコンタクトを接着剤で固定し,配線類のはんだ付けを行っています.配線類はバッテリから2-3A程度の電流をとっても発熱が少なくなるよう余裕を持った太さのものを使うと良いでしょう. f:id:jp7fkf:20200907003912j:plain
見ていただくとわかると思いますが,バッテリパックには制御基板が入っています.これはもともと生セルと一緒に入っていた制御基板をそのまま利用しています.制御基板からはそれぞれ充電用端子,バッテリの各セルのプラスマイナスに対して配線が伸びているので,もとの生セルと同様の配線になるように配線してあげます.要するに生セルだろうが換装後の保護回路付きセルだろうが配線は変えずに生セルだと思って配線してあげればよいです.これで制御基板側でも充電・放電電流の監視も行ってくれることでしょう.セル側にも最後の頼みの綱として保護回路があり,2重で保護されている形になります.
f:id:jp7fkf:20200907003801j:plain
f:id:jp7fkf:20200907003816j:plain
f:id:jp7fkf:20200907003829j:plain

両側面にはエポキシ接着剤をいれて固定してしまっています.
f:id:jp7fkf:20200907003949j:plain
f:id:jp7fkf:20200907004000j:plain

斜めからみるとこう.バッテリを入れる前に抵抗計でバッテリのセルを入れても問題ないか(セル両端で抵抗値測定をした場合に異常に低い値を示さないか)を確認しておくと良いでしょう. f:id:jp7fkf:20200907003734j:plain

これでバッテリパック自体は構成できました.この時点で電圧を確認します.低くても5V程度から高くても8.4V程度である必要があるでしょう.リチウムイオンバッテリの終止電圧は低くてもセルあたり2.5V程度,満充電電圧はセルあたり4.2V程度ですから,これに由来します.この範囲を大きく外れていた場合はセルや回路に異常があると判断して調査を行ったほうが良いかもしれません.

さて,電圧の正常性が確認できたら充電電流を測定してみます.今回は急速充電クレードルBC-139を利用して測定を行いました.電流計,電圧計をかましてセル状態を監視しながら充電をしてみます.最大充電電流は1Cですから,1.2Aを超えていた場合は即座に充電を中止する心構えをしておきます.
測定中の画像が下記です.クレードルの端子にはワニ口クリップをはさみ充電・測定系につなぎます.クレードルの下にはスイッチがついており,このスイッチが押されていると充電を開始しますから,これを押して計測します.はじめは手で押して様子を見て,問題なさそうならマスキングテープで押しっぱなしにして充電完了まで監視します.
f:id:jp7fkf:20200907005738j:plain
測定の結果,終止電圧付近から充電を始めた場合でも,充電電流は最大0.8A程度で,1Aをこえることはありませんでした.このことから約0.66C程度で充電をしている事になりますが,これは1Cを大きく下回っていること,一般に充電電流は0.5C-1Cの間で行うことが多いことから,0.66C充電は問題ないものと判断しました.実際危険はあまりないでしょう.

充電は無事完了し,充電クレードル側でも充電完了を示す緑色のランプが点灯し充電電流が0Aになり充電が終了しました. 充電が無事成功したといえるでしょう.

換装後充電したバッテリパックで送信・受信ともにテストを行いましたが5W送信も問題なく行え,電池本体や周辺回路からの発熱もほぼありませんでした.それより5W送信すると本体の発熱が大きいです.
ちなみに充電中であっても電池本体・回路からの発熱はほぼありません.それより充電クレードル本体の発熱がひどいです.

というわけで無事バッテリの換装ができ,ハンディ機として継続して利用することができるようになりました.1500mhAから1200mhAに容量が減っていることから,多少運用時間は短くなることは想定されますが,その場合はセル自体が交換できるようになっていますので,同様の18350保護回路付きセルをケースに入れて持ち運び,交換してあげるような運用もできます.これで使いやすくなりました.めでたし.

まとめ

  • IC-T90のバッテリパックBP-217の内蔵バッテリを保護回路付きバッテリに換装し,さらにセル自体も交換可能となりました.
  • 急速充電クレードルを利用した充電テストでも問題なく充電でき,クレードルも流用することができることがわかりました.
  • 送受信も問題なく,換装後のバッテリでストレスなく運用できました.