抵抗の値をslackで確認したい!!!

どうもこんにちは、最近いろいろバタバタしているはとバスです。

この記事はAizu Advent Calenderの19日目の記事になります

18日目 fatman???? さん

20日目 のあ

当日の朝に担当だったことを知り、ほぼ半日で作った適当なslackのコマンドを紹介します。

カラーコードを確認したい

最近はめっきり機会が減ってしまったんですが、電子工作が好きです。

大学一年のときから始めて、いろいろな物を作ってきました。

hatobus.hatenablog.jp

hatobus.hatenablog.jp

電子部品を使うときのあるあるなんですけど、抵抗の値って、難しくないですか?????

f:id:flying_hato_bus:20191219214131p:plain

12の色と値を暗記しなければいけないし、パッと見ただけでは分からないので調べてから使うという人もいると思います。

そんな時に、slack上で簡単に確認できたら良さそうじゃないですか?

作りました

slackのslashコマンドを作りました。

f:id:flying_hato_bus:20191220095723p:plain

/resistor [抵抗の値]と書くことで、カラーコードの画像が返ってきます。

f:id:flying_hato_bus:20191220100244p:plain

f:id:flying_hato_bus:20191220100322p:plain

実装

使っている技術としては

  • サーバー
    • GCP cloud functions
  • 言語
    • Go

です。cloud functionsをサーバーにして、リクエストに応じてGoで画像を生成、そのままslackに画像を投稿しています。

f:id:flying_hato_bus:20191220101110p:plain

ポイント

github.com

カラーコードを生成する部分です。

抵抗の値を数字だけで表現する場合は入力された文字列をint64にキャストすればいいだけですが、抵抗の値を指定するときには少し特殊なフォーマットの場合があります。4700 Ωを 4k7などに表現するやつです。このようなフォーマットで表現する時に、以下のような表現の仕方があります。

  • 1k
  • 4k7
  • 47k
  • 470k

また、k以外にもMの接頭辞のときもあります。

このように表現されたときの抵抗値も対応しています。

SI接頭辞付きの抵抗値の場合

330Ωなど、接頭辞がついてないときには、 strconv.Atoi()などを使えば、stringをintにキャストできます。まずはこれで当たってみて、接頭辞が付いているときにはエラーが返ってくるため、Splitするセクションに入ります。

上で上手くキャストできなかった場合、SI接頭辞(k, Mなど)が付いているときには、入力された文字をSplitします。Goでは strings.Splitという関数があります。

golang.org

これは文字列を指定文字で切り取ることができるという関数です。

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

あとはカラーコードを割り出すまでもうちょっとです。

f:id:flying_hato_bus:20191220111435p:plain

抵抗は上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の仕様として、ユーザーが自由にファイルを書き込める場所に制限があります。

cloud.google.com

ファイル システムで書き込み可能な部分は /tmp ディレクトリだけです。このディレクトリは、関数インスタンスの一時ファイルの保存先として使用できます。

とあるので、slackに投稿する画像は /tmp以下に置かなければいけないことがわかります。

大急ぎで書いたのでクソ適当になりましたが、今回のアドベントカレンダーネタは以上になります。

来年からはもっとちゃんと書きたい。

もっと書くべき内容があったと思いますが、内容がバカでかい騒動にまで発展してしまったので書けませんでした。

気をつけよう!!!!!!