色々なプラットフォーム、様々な場面でSwiftを使いたいことがあります。しかし、現時点で、Apple以外のプラットフォームでは、ライブラリーが少ないなど、すぐ実用的に実装することが難しいことがあります。CのライブラリーやSwiftのライブラリーを使いながら、様々な場面でSwiftを実用的に使うための試みと、サーバーサイドにおける事例を紹介します。
様々な場面でSwiftを使う
Apple 以外のプラットフォームでのSwift
Server side swfit
2015年オープンソース化しました
サーバーAPIワークグループも発足しました
Webサーバーが一番良く思いつくと思いますがdeamonやUtilitiesを作れます
IBMやAmazonクラウドで動かすことが多いですがRaspberry Piで動かすことも増えました。
なぜSwiftを使う必要があるのでしょうか。一般的には他の言語、スクリプティング言語を使うことが多いです。
でもSwiftでも出来るはずです。型も、プロトコルや高度なenumもあります。十分に検討できると思います。
サービス事例
法人向けの中にWebクローリングやスクレイピングをしています。新規に実装し直していますがSwiftを使うことに決めました。
いままでPythonでしていましたが、設計やパフォーマンスの改善をしたかったのです。
Swiftに挑戦するのもリスクは有るが今後の発展に期待してSwiftを選びました。
クローラーは指定したWebサイトのページを取得してHTMLをパースしてそれをDBへ保存します。Google検索エンジンロボットの動きに近いですね。
取得したウェブサイトは検索に利用します。また、本文のみを抽出します。
このようなサイトの左側は利用しません。
タイトル、日付、本文を抽出します。
MySQLとS3に保存します。
クローリングするサービスが左下。
右下がAPIサーバーです。
外部から直接DBを使うのではなくAPIを叩きます。社内の別のサービスからこのクローラーを制御します。
GRPCプロトコルで形のあるプロトコルバッファーであるため、JSONなどより安全です。
このようなアーキテクチャの実現に具体的にどのようなライブラリが必要でしょうか。
WEBからコンテンツを取得するにはHTTPクライアントが必要です。そしてHTMLをパースする必要があります。XPathやCSSセレクタを利用できるものが必要です。設定やメタデータは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セレクタは簡単なものだけ利用するので正規表現を利用しました。
日本語エンコーディングはnkf(Network kanji filter)
GRPCは最近公式が出ているのでそれを使いました。
iOSと同じようにXcodeでテストできる。20日ぐらい連続して動かせる。Dockerに環境を展開してテストしているが、7日ぐらいやっていますが動いています。最近動かし始めたので7日程度ですが。
安定性などを測定していきたい。
プロジェクト2
ボードコンピュータでSwiftを使う
様々なものを接続してコントロールできる。デバイスコントロールはSwiftで出来る。
センサーからあたいを読み取ってサーバーにPostしたりをハードと連携して出来る。
ここからArm版Swiftを
手に入れられる
Raspberry Piはインターネットに接続されています。
センサーからSlackにPost
QAコーナーに持っていくので見たい人は実物のボードをご覧いただけます
このようにAppleと遠いプラットフォームでもちゃんと動きます。
どのように動いているか
i2cという名前のデバイスバッファファイルが作成されるのでそれを利用します。
ライブラリを作っているので興味がある方はお試しください。
Xcode上でデバッグする方法がこの中に入っているのでMacでも開発できます。
気圧センサーをインスタンス化、リセットとキャリブレートメソッドを呼んでメジャーを呼ぶと気圧と温度が帰ってくる。
try {} でエラー処理も出来る。
SlackKitというライブラリでSlackにPostしました。
arm環境では上手く動かなかったので一部独自実装です。
ライブラリが足りない時があるかもしれません。自分でやらないといけないことが有ります。
でもCライブラリがあればSwiftでラップしてSwiftの中で利用できます。
Cの構造体や関数をそのままラップするだけでなく、structやenumを活用してよりSwiftyにできるでしょう。
ライブラリが揃えば自分が作りたいSwfitプログラムを効率的に作れますね。
作ったものを公開しています。
テストされているライブラリならテストはラッパー部分のみで良いのでコードは少なくて済みます。
どちらかと言うとDevelopmentのSwiftの仕様変更に追いつくほうが大変でした。
ほかに社内で利用しているライブラリもあるのでそのうち公開します。
Tokyo Serverside Swift meetupをやっています。
いろいろSwiftで置き換えられるものがあると思います。
Server side swiftはSwift package managerのおかげで簡単にはじめられます。npmのようなもの、Cocoapodsのようなものです。
ライブラリやプロジェクトを簡単に作れます。
こうするとコンパイルしなくても動きます
小さなプロジェクトから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が必要です。