とりあえずやってみればいいじゃん

とりあえずやってみればいいじゃん

エンジニア関連のことについてつらつら書くブログ

3/3 様々な場面でSwiftを使う #tryswiftconf

try!Swiftのセッションまとめシリーズです。Yusuke Itoさんの「Swift Outside the Box」についての記事になります。

資料

内容

  • Swiftがアップル以外のプラットフォームでも使えるように

サーバサイドSwiftについて

  • 2015年10月にSwiftのソースコード公開
  • 2016年10月
    • サーバAPIワークグループが始動
  • Swiftを使う必要がなぜあるのか
    • 今までもRubyやNode.jsもあった

Server Side Swiftを使ってバックエンドサービスを作った話

  • 会社ではwebのクローリングやスクレイピングを行う
  • Swiftで書くことに決めた
  • 今まではPythonで実装していた
  • パフォーマンスや設計を改善したかった
  • Swiftはモダンで優れている
  • クローラは指定したwebサイトのページを取得してHTMLを取得してDBに保存
  • 取得したwebサイトは検索のために使う
  • webページ
    • メタデータ、本文は重要なので取り出す
    • 取得したコンテンツデータを保存するDBがあって設定に関することやXPATHの指定にも使う
  • Go言語などに接続する場合にも型があるといいかんじにできる

どのようなライブラリが必要?

* webからコンテンツを取得するにはHTTPクライアント
* パーサー
* 設定、メタデータのためのMySQL
* S3
* GRPC
* 日本語変換ライブラリ
  • Swift
    • LLVM基盤を使っている
    • C言語のライブラリを直接リンクしたりできる

何が必要?

  • 必要なライブラリは全て揃っている
    • NSURLSessionの代わりにlibcurlを使った
    • HTMLパーサーとしてlibxml2を使った
    • MySQLに保存するにはクライアントライブラリを使う
    • 文字コードを扱うライブラリも使用
    • GRPC系は公式のものが最近出てきた

現在の我々のステータス

  • コード量
    • クローラ1万行
    • 社内向けライブラリは9000行
    • Dockerに環境を展開している

次のステップ

  • AWS環境にデプロイして動かす
  • 安定性を測定

2つめのプロジェクトの話

  • ラズパイ
    • 様々なものをコントロールできる
    • センサから値を取って連携したりすることができる
  • 気圧を測定してslackにポストするものを作った
    • ラズパイはインターネットに接続されている
    • Swiftでセンサーの値を取得
  • 気圧のセンターを変数で作る
  • 現時点ではSwiftで自分の使いたいライブラリがないかも
    • Swiftのライブラリ化などを自分でしておくなど
  • すでにCのライブラリがあればSwiftでラップして使うことができる
  • enumなどを使えばSwiftっぽく書くことができる
  • ライブラリが揃えばより生産的に作ることができる
  • いくつかSwiftでライブラリを作っている

最後に

  • 東京Server Side Swiftの勉強会もある
  • Swift Package ManagerのおかげでServer Side Swiftができている
    • SPMはCarthageやCocoaPodsに似ている
  • Swift
    • 安全で効率的
    • ライブラリは少ないがCとうまくできる言語
  • 小さいプロジェクトからServer Side Swiftを初めてみては?

Q&A

  • クローラをPythonからSwiftに代えたとのことだが、どの部分が良くなったのか(パフォーマンスなど?)

    • パフォーマンスはまだあまり測定していない
    • Pythonの場合はスクレイピーが重たい
    • 言語移植以外にも全体の構成なども見直したのでそのおかげでパフォーマンスが上がった感ある
  • libcurlのリクエスト使っていないというのはそれはなぜなのか。ファンデーションライブラリが十分でないということ?

    • ファンデーションはGitにどのくらい実装が進んでいるかが書かれている
    • プロダクションで使えるカバレッジで実装がされている
    • なぜlibcurlだったのか
      • クローラはhttpリクエストなどhttpの仕様に準拠する必要がある
      • NSURLSessionはリダイレクトやタイムアウトの処理がラップされていて動かせない
      • その場合はlibcurlを使うようにしていた
  • ラズベリーパイ用にコンパイルしているということであり、ファンデーションライブラリそのものを乗っけているわけではないですよね?

    • Swift組み込みプラットフォームでも使う場合はArduinoでは動かない
    • SwiftはLinuxがある上で動かすことができる
    • armでもいいけどSwiftがサポートしているOSで動かす必要がある
    • ArduinoはOSが付いてないので動かすことができない

その他このトークに関する情報源

togetter

Swift Outside the Box #tryswiftconf - Togetterまとめ