様々な場面でSwiftを使う | try! Swift Tokyo 2017 #tryswiftconf Day2-3 聞き起こし

twitter.com

色々なプラットフォーム、様々な場面でSwiftを使いたいことがあります。しかし、現時点で、Apple以外のプラットフォームでは、ライブラリーが少ないなど、すぐ実用的に実装することが難しいことがあります。CのライブラリーやSwiftのライブラリーを使いながら、様々な場面でSwiftを実用的に使うための試みと、サーバーサイドにおける事例を紹介します。

様々な場面でSwiftを使う

f:id:niwatako:20170303113214j:plain

Apple 以外のプラットフォームでのSwift

f:id:niwatako:20170303113228j:plain

Server side swfit

f:id:niwatako:20170303113248j:plain

2015年オープンソース化しました

f:id:niwatako:20170303113311j:plain

MacUbuntuがサポートされています

f:id:niwatako:20170303113331j:plain

サーバーAPIワークグループも発足しました

f:id:niwatako:20170303113349j:plain

Webサーバーが一番良く思いつくと思いますがdeamonやUtilitiesを作れます

IBMAmazonクラウドで動かすことが多いですがRaspberry Piで動かすことも増えました。

なぜSwiftを使う必要があるのでしょうか。一般的には他の言語、スクリプティング言語を使うことが多いです。

でもSwiftでも出来るはずです。型も、プロトコルや高度なenumもあります。十分に検討できると思います。

サービス事例

f:id:niwatako:20170303113527j:plain

法人向けの中にWebクローリングやスクレイピングをしています。新規に実装し直していますがSwiftを使うことに決めました。

いままでPythonでしていましたが、設計やパフォーマンスの改善をしたかったのです。

Swiftに挑戦するのもリスクは有るが今後の発展に期待してSwiftを選びました。

クローラーは指定したWebサイトのページを取得してHTMLをパースしてそれをDBへ保存します。Google検索エンジンロボットの動きに近いですね。

取得したウェブサイトは検索に利用します。また、本文のみを抽出します。

f:id:niwatako:20170303113725j:plain

このようなサイトの左側は利用しません。

タイトル、日付、本文を抽出します。

クローラーアーキテクチャです

f:id:niwatako:20170303113754j:plain

MySQLとS3に保存します。

クローリングするサービスが左下。

右下がAPIサーバーです。

f:id:niwatako:20170303113815j:plain

外部から直接DBを使うのではなくAPIを叩きます。社内の別のサービスからこのクローラーを制御します。

GRPCプロトコルで形のあるプロトコルバッファーであるため、JSONなどより安全です。

このようなアーキテクチャの実現に具体的にどのようなライブラリが必要でしょうか。

WEBからコンテンツを取得するにはHTTPクライアントが必要です。そしてHTMLをパースする必要があります。XPathCSSセレクタを利用できるものが必要です。設定やメタデータMySQLへ保存したいのでそのライブラリが必要です。そしてS3のクライアント。

GRPCライブラリとプロトコルバッファのライブラリが必要になります。

クローリングするサイトは日本語エンコーディングです。それを解釈できる必要があります。

SwiftはLLVMを使っているのでC言語ライブラリをリンクしたりインポートすることが出来ます。

SwiftPackageMangerではCコードのコンパイルもサポートしています。

Linux環境ではC言語ライブラリが豊富です。PythonライブラリもCベースが多く、それらをSwiftからそのまま利用できるのです。

いまのCのライブラリをベースに考えると必要なものは全て揃っています。

HTTPクライアントはNSURLSessionではなくてlibcurlを利用しました。curlのライブラリ部分です。NSURLSessionはLinuxでは内部でlibcurlが利用されています

HTMLパーサーはlibxml2を利用します。Macにも標準では言っています。

CSSセレクタは簡単なものだけ利用するので正規表現を利用しました。

MySQLC言語ライブラリでmysqlconnector

日本語エンコーディングnkf(Network kanji filter)

GRPCは最近公式が出ているのでそれを使いました。

f:id:niwatako:20170303114422j:plain

f:id:niwatako:20170303114441j:plain

iOSと同じようにXcodeでテストできる。20日ぐらい連続して動かせる。Dockerに環境を展開してテストしているが、7日ぐらいやっていますが動いています。最近動かし始めたので7日程度ですが。

安定性などを測定していきたい。

f:id:niwatako:20170303114531j:plain

プロジェクト2

f:id:niwatako:20170303114549j:plain

ボードコンピュータでSwiftを使う

様々なものを接続してコントロールできる。デバイスコントロールはSwiftで出来る。

センサーからあたいを読み取ってサーバーにPostしたりをハードと連携して出来る。

ここからArm版Swiftを

f:id:niwatako:20170303114700j:plain

手に入れられる

f:id:niwatako:20170303114729j:plain

Raspberry Piはインターネットに接続されています。

f:id:niwatako:20170303114752j:plain

センサーからSlackにPost

QAコーナーに持っていくので見たい人は実物のボードをご覧いただけます

f:id:niwatako:20170303114836j:plain

このようにAppleと遠いプラットフォームでもちゃんと動きます。

どのように動いているか

f:id:niwatako:20170303114855j:plain

i2cという名前のデバイスバッファファイルが作成されるのでそれを利用します。

ライブラリを作っているので興味がある方はお試しください。

Xcode上でデバッグする方法がこの中に入っているのでMacでも開発できます。

f:id:niwatako:20170303114952j:plain

気圧センサーをインスタンス化、リセットとキャリブレートメソッドを呼んでメジャーを呼ぶと気圧と温度が帰ってくる。

f:id:niwatako:20170303115024j:plain

try {} でエラー処理も出来る。

f:id:niwatako:20170303115050j:plain

SlackKitというライブラリでSlackにPostしました。

arm環境では上手く動かなかったので一部独自実装です。

f:id:niwatako:20170303115120j:plain

ライブラリが足りない時があるかもしれません。自分でやらないといけないことが有ります。

f:id:niwatako:20170303115147j:plain

でもCライブラリがあればSwiftでラップしてSwiftの中で利用できます。

Cの構造体や関数をそのままラップするだけでなく、structやenumを活用してよりSwiftyにできるでしょう。

f:id:niwatako:20170303115233j:plain

ライブラリが揃えば自分が作りたいSwfitプログラムを効率的に作れますね。

f:id:niwatako:20170303115318j:plain

作ったものを公開しています。

テストされているライブラリならテストはラッパー部分のみで良いのでコードは少なくて済みます。

どちらかと言うとDevelopmentのSwiftの仕様変更に追いつくほうが大変でした。

ほかに社内で利用しているライブラリもあるのでそのうち公開します。

f:id:niwatako:20170303115425j:plain

Tokyo Serverside Swift meetupをやっています。

f:id:niwatako:20170303115440j:plain

いろいろSwiftで置き換えられるものがあると思います。

Server side swiftはSwift package managerのおかげで簡単にはじめられます。npmのようなもの、Cocoapodsのようなものです。

f:id:niwatako:20170303115520j:plain

ライブラリやプロジェクトを簡単に作れます。

f:id:niwatako:20170303115549j:plain

こうするとコンパイルしなくても動きます

f:id:niwatako:20170303115626j:plain

f:id:niwatako:20170303115629j:plain

小さなプロジェクトからServerSideSwiftをはじめてはいかがでしょうか

Q&A

クローラーPythonから移行されて、パフォーマンスは早くなりましたか?Cによるところが多いと思うが直接叩けたから早くなったのでしょうか

パフォーマンスは実際あまり測定していないです。ただ、Pythonはあまり比較が公平ではないがライブラリを使っていてその実装が思い。Pythonではそのオーバーヘッドが大きかった。 今回は言語移植以外にライブラリ全体やシステムの設計自体見直しているのでそうしたことでパフォーマンスが良くなっている。 感覚的には早く動いている。詳しくは会社のブログで出したいと思っている。 現状では具体的な話が申し上げられない。

ServerSideSwift、APISDKを担当しているものです。ソラコムで。 libcurlを使っているということだったがなぜか。NSURLSessionを使っています。実装されていますが部分的な実装もあるのでlibcurl対NSクラス、どうなっているのでしょう、本番環境で使う観点で。

Foundationに関してはどのくらい実装が進んでいるかGithubリポジトリで見ることが出来ます。プロダクションで使えるカバレッジで実装はされていてNSURLSessionも利用できる。 しかしクローラーではリダイレクションやrobotなどRFC規格などに従う必要がある。NSURLSessionではラップされていて外からカスタマイズできないのでlibcurlを使いました。

Raspberry Pi用にコンパイルしている。Foundationライブラリそのものは乗せていないのでしょうか

Linuxが動く必要がある。Swift組み込みプラットフォームを使うためにはArduinoを使う必要があります。Arduinoはもっと低いレベルのAPIなので、Linuxの上でなえれば動かせません。 armでもよいがLinuxなどSwiftがサポートするOSが必要です。