抵抗の値をslackで確認したい!!!
どうもこんにちは、最近いろいろバタバタしているはとバスです。
この記事はAizu Advent Calenderの19日目の記事になります
18日目 fatman???? さん
20日目 のあ
当日の朝に担当だったことを知り、ほぼ半日で作った適当なslackのコマンドを紹介します。
カラーコードを確認したい
最近はめっきり機会が減ってしまったんですが、電子工作が好きです。
大学一年のときから始めて、いろいろな物を作ってきました。
電子部品を使うときのあるあるなんですけど、抵抗の値って、難しくないですか?????
12の色と値を暗記しなければいけないし、パッと見ただけでは分からないので調べてから使うという人もいると思います。
そんな時に、slack上で簡単に確認できたら良さそうじゃないですか?
作りました
slackのslashコマンドを作りました。
/resistor [抵抗の値]
と書くことで、カラーコードの画像が返ってきます。
実装
使っている技術としては
- サーバー
- GCP cloud functions
- 言語
- Go
です。cloud functionsをサーバーにして、リクエストに応じてGoで画像を生成、そのままslackに画像を投稿しています。
ポイント
カラーコードを生成する部分です。
抵抗の値を数字だけで表現する場合は入力された文字列をint64にキャストすればいいだけですが、抵抗の値を指定するときには少し特殊なフォーマットの場合があります。4700 Ωを 4k7
などに表現するやつです。このようなフォーマットで表現する時に、以下のような表現の仕方があります。
- 1k
- 4k7
- 47k
- 470k
また、k以外にもMの接頭辞のときもあります。
このように表現されたときの抵抗値も対応しています。
SI接頭辞付きの抵抗値の場合
330Ωなど、接頭辞がついてないときには、 strconv.Atoi()
などを使えば、stringをintにキャストできます。まずはこれで当たってみて、接頭辞が付いているときにはエラーが返ってくるため、Splitするセクションに入ります。
上で上手くキャストできなかった場合、SI接頭辞(k, Mなど)が付いているときには、入力された文字をSplitします。Goでは strings.Split
という関数があります。
これは文字列を指定文字で切り取ることができるという関数です。
srcstr := "a,b,c" splitstr := strings.Split(srcstr, ",") // splitstr -> ["a" "b" "c"]
つまり、これでk, Mの場合でSplitすれば、 4k7
などは ["4", "7"]
という値が返ります。Splitした値はこのようになります。
- 1k --> ["1", ""]
- 4k7 --> ["4", "7"]
- 47k --> ["47", ""]
- 470k --> ["470", ""]
補足ですが、Splitには罠が存在して、 47k
のように、最後に切り取る文字が来ている場合には最後に空白が入ります。気をつけましょう。
これで上手くSplitできればできたときの文字で乗数も割り出せますね。
- kでSplitできた --> 乗数 = 3
- MでSplitできた--> 乗数 = 5
あとはカラーコードを割り出すまでもうちょっとです。
抵抗は上2桁の数字をそれぞれの色に対応させ、3本目の線を乗数の色にします。
- 4k7の場合 4700なので 1本目は 黄色 2本目は 紫 乗数は10^2なので 赤
のように求まります。
上にある 1k, 4k7, 47k, 470k の場合は以下のようになります。 (Split済みの配列をcontainsと書きます)
- 1k contains[0]の文字は1桁、contains[1]の文字は無し、この場合1st barは1になり、2nd barは0になる、乗数は1減るので減らしておく - 4k7 contains[0]の文字は1桁、contains[1]の文字は1桁、この場合1st barは4になり、2nd barは7になる、乗数に変化はない。 - 47k contains[0]の文字は2桁、contains[1]の文字は無し、この場合1st barは4になり、2nd barは7になる、乗数は1増やす必要がある。 -470k contains[0]の文字は3桁、contains[1]の文字は無し、この場合1st barは4になり、2nd barは7になる、乗数は2増やす必要がある。
contain[0]の長さでif-elseしています。
if len(contain[0]) == 1 { fv, _ := strconv.Atoi(contain[0]) firstband = int64(fv) if contain[1] == "" { secondband = 0 } else { sv, _ := strconv.Atoi(contain[1]) secondband = int64(sv) } } else if len(contain[0]) == 2 { fv, err := strconv.Atoi(contain[0]) if err != nil { return nil, err } firstband = int64(fv / 10) secondband = int64(fv % 10) mag += 1 } else { resistor_topvalue, err := strconv.Atoi(contain[0]) if err != nil { return nil, err } for i := 0; ; i++ { last1digit := resistor_topvalue % 10 resistor_topvalue /= 10 if int64(resistor_topvalue/10) == 0 { firstband = int64(resistor_topvalue) secondband = int64(last1digit) break } mag += 1 } }
これによって、firstband, secondband, magの3つの数値が求められ、これを元に色を出しています。
色を求めて、いい感じに画像を生成しています。
cloudfunctionsについて
cloud functionsの仕様として、ユーザーが自由にファイルを書き込める場所に制限があります。
ファイル システムで書き込み可能な部分は /tmp ディレクトリだけです。このディレクトリは、関数インスタンスの一時ファイルの保存先として使用できます。
とあるので、slackに投稿する画像は /tmp
以下に置かなければいけないことがわかります。
大急ぎで書いたのでクソ適当になりましたが、今回のアドベントカレンダーネタは以上になります。
来年からはもっとちゃんと書きたい。
もっと書くべき内容があったと思いますが、内容がバカでかい騒動にまで発展してしまったので書けませんでした。
気をつけよう!!!!!!