Twitterでふぁぼったものをひたすら試します

iOS以外でも前向きにSwiftを使いたい話

本記事はこれです。

qiita.com

iOS以外でSwiftの出番がない話

皆さんはiOS以外でSwiftを採用したことはありますか?私はないです。Swiftとかいうマイナーな言語を授業や研修で使うわけがありません。

「言語何にするー?」
Ruby/Java/Pythonならみんな書けるっしょー?」完

たまにはSwiftって言われてみたい……
全員がiOSエンジニアにも関わらずiOS以外をやる用事があればSwiftになるかも?

たとえば、iOSコミュニティでサーバサイドをやることになったとか……

アクセスポイント毎の接続数をSwiftを使って取得する

具体的には

自前でカンファレンスのネットワーク環境をやろうと思った時には、ログを集めたり監視したりするように作らなければならない。ここでネットワーク管理ソフトウェアZabbixの利用が候補に上がる。

ざっくりとした図:
f:id:S_Shimotori:20181220235419p:plain

例えば、各APの接続数は、APの親玉であるWireless LAN ControllerからZabbixに届けられる。
ZabbixはREST APIで叩くことができるので、あとは煮るなり焼くなりVaporでヒートマップを出すなり自由。もしwebassemblyが完全対応すればWi-Fiヒートマップの描画までSwiftがやっちゃうかもしれない。

SwiftでZabbix REST APIを叩く

Linux(適当なUbuntu)サーバ上で叩くので、Linux対応のライブラリがあると便利。Package.swiftが置いてあるかというよりも、READMEで名言されていたり #if os(Linux)ソースコード上にあったりIBMだったりするほうが信用度高め。

github.com

let request = RestRequest(method: .post, url: "http://Zabbixホスト/zabbix/api_jsonrpc.php")
request.messageBody = try! encoder.encode(略)
request.response { data, response, error in 煮るなり焼くなり }

略の部分に、たとえば

{
    "auth":"ログインした時に返ってきたやつ",
    "method":"item.get",
    "id":1,
    "params":{
        "search": {
            "name":"* Ap If No Of Users * GHz"
        },
        "searchWildcardsEnabled":true,
        "output": ["name", "key_", "lastvalue", "prevvalue"]
    },
    "jsonrpc":"2.0"
}

というふうになる struct Hoge: Encodable を与えておくとZabbixから接続数が取れる。

Zabbix自体をカンファレンス参加者に叩かれるわけにはいかないし、キャッシュの役割をする人がいてほしいので、Vaporを立ててそこからAPIやらhtmlやらを出させるとなおよし。

github.com

routes.swiftに上手に書けばVapor1人で両方出せる。テンプレートを使ってりっちにhtmlをやりたい場合はleafもセットで。

.package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),
.package(url: "https://github.com/vapor/leaf.git", from: "3.0.1"),

なんでこんなことしなくちゃいけないの?

え、自分の所属するコミュニティのカンファレンスのネットワーク環境やっていきたくないんですか?

まとめ

興味がある人はそのへんのカンファレンスのネットワークチームを乗っ取っていっしょにSwiftまみれにしましょう!iOS関係ならSwiftを使ってもメンテの人手には困……らないかどうかはわからない。責任は取りません。

ちなみに上の図の画像はいらすとやさんです。アクセスポイントにははんぺんを使いました。便利ですね。