読者です 読者をやめる 読者になる 読者になる

futoase

よろしくお願いします。

Server side Swiftに触れてみる

プログラミング swift

Server side Swiftに触れてみる

swift.org

昨年からServer side Swift という単語が見られるようになってきた。

Swift については 2014年のWWDCで発表されたプログラミング言語

iOS, macOS など Apple製品向けとして、また処理系は2015年末にOSSとして公開され、 現在はUbuntu上でもSwiftで作成した成果物を利用できる。

Swiftのオープンソース化、Swift 3.0のロードマップ

mobile開発向けの言語でもありserver sideでも利用できる。 Kotlinのようだ。Swiftについて以前から利用したいと思っていたが、手を出していなかった。 今回、最小限のものを作ってみて理解を深めようと思う。

開発環境

私が利用している開発環境/OSは

である。

処理系のインストール

homebrewを使ってSwiftをインストールする。

> brew install swift

まず、Hello world

何をつくるか、がわからない。とりあえずHello worldをやってみたい。 Swift 3.0からpackage-managerというパッケージを作る機能(Rustのcargoみたいな)があり、 library/module のスケルトン(ディレクトリ構造など)を作成してくれる。

Swift.org - Package Manager

ディレクトリを作り、moduleを作る

ディレクトリを作り、ディレクトリの中でコマンドを実行する。

> mkdir -p hello-world
> cd hello-world
> swift package init

swift package init
Creating library package: hello-world
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/hello_world.swift
Creating Tests/
Creating Tests/LinuxMain.swift
Creating Tests/hello-worldTests/
Creating Tests/hello-worldTests/hello_worldTests.swift

moduleの成果物を生成、テストを行える状態になっている。

> swift build
Compile Swift Module 'hello_world' (1 sources)
> swift test
Compile Swift Module 'hello_worldTests' (1 sources)
Linking ./.build/debug/hello-worldPackageTests.xctest/Contents/MacOS/hello-worldPackageTests
Test Suite 'All tests' started at 2016-12-10 12:12:50.328
Test Suite 'hello-worldPackageTests.xctest' started at 2016-12-10 12:12:50.329
Test Suite 'hello_worldTests' started at 2016-12-10 12:12:50.329
Test Case '-[hello_worldTests.hello_worldTests testExample]' started.
Test Case '-[hello_worldTests.hello_worldTests testExample]' passed (0.003 seconds).
Test Suite 'hello_worldTests' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'hello-worldPackageTests.xctest' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.003) seconds
Test Suite 'All tests' passed at 2016-12-10 12:12:50.332.
         Executed 1 test, with 0 failures (0 unexpected) in 0.003 (0.004) seconds

コマンドを作るには

コマンドを作るには、package オプションの引数を追加すれば良い

> swift package init --type executable
Creating executable package: hello-world
Creating Package.swift
Creating .gitignore
Creating Sources/
Creating Sources/main.swift
Creating Tests/

executable オプションを付けると、main.swift のみが作成される。 main.swiftの中身は、print文のみだ。

print("Hello, world!")

ビルドし、成果物として出来上がったバイナリを実行することができる。

> swift build
Compile Swift Module 'hello_world' (1 sources)
Linking ./.build/debug/hello-world
> ./.build/debug/hello-world
Hello, world!

main.swift がエントリポイントになっている。 main.swiftをSourceの下に作成すれば、実行バイナリが生成される。

Web applicationを作る

簡素なWeb applicationを作ってみようと思う。

> mkdir simple-web-server-swift
> cd simple-web-server-swift
> swift package init

利用するlibrary

簡素なWeb server を作ることができるZewoを利用する。

github.com

パッケージの設定

Package.swift に依存関係を追加する。

import PackageDescription

let package = Package(
    name: "simple-web-server-swift",
    dependencies: [
        .Package(url: "https://github.com/Zewo/HTTPServer.git", majorVersion: 0, minor: 14),
    ]
)

main.swiftに書く

main.swift に書く。README.mdのものを使う。

import HTTPServer

let log = LogMiddleware()

let router = BasicRouter { route in
    route.get("/hello") { request in
        return Response(body: "Hello, world!")
    }
}

let server = try Server(port: 8080, middleware: [log], responder: router)
try server.start()

ビルドする

依存関係をいろいろと解決してくれる。

> swift build

ビルドが成功した。成果物としてのコマンドを実行する。

./.build/debug/simple-web-server-swift 



                             _____
     ,.-``-._.-``-.,        /__  /  ___ _      ______
    |`-._,.-`-.,_.-`|         / /  / _ \ | /| / / __ \
    |   |ˆ-. .-`|   |        / /__/  __/ |/ |/ / /_/ /
    `-.,|   |   |,.-`       /____/\___/|__/|__/\____/ (c)
        `-.,|,.-`           -----------------------------

================================================================================
Started HTTP server at 0.0.0.0, listening on port 8080.

サービスが立ち上がった。

f:id:syanbi:20161210133301p:plain

かなり気軽に作れた。

ドライバなど調べてみると...

AWS SDKを利用したいと思ったが、

AWS iOS SDK について Swift Package manager が対応していない。Package.swiftが無い... ので対応待ち。 cocoa podsを入れてやってみるというモチベーションはわかなかった。

DB用のドライバ

以下のものがあった。

Swift package managorに対応している。

その他のドライバについて

Perfect というWeb frameworkプロダクトがあり、 そのプロダクト内の成果物としてコネクタやライブラリがある。

Redisであれば以下。

https://github.com/PerfectlySoft/Perfect-Redis

言語としてのSwift

特徴

Optional (nil代入可能) や Null safety (?演算子によるnil参照)、型推論があること、があげられる。 qiita.com

サーバサイドで利用するときに気になる点

スレッドセーフ、Goのgoroutine, channelに準ずる機能の実装に関して 以下のドキュメントに書かれていた。

Concurrency.rst

要約すると

  • ネイティブ(APIを利用しない形)でのスレッドセーフのサポートレベルはC++と同程度
  • Stream, Taskを利用することでGoのchannel, goroutineと同等のことが行える
  • 非同期処理をサポート(async, await)
  • Actorによるメッセージ非同期処理をサポート

という感じだ。モダンだなこれ。

THE ART OF THE START 起業への挑戦を読んだ

起業への挑戦

起業への挑戦

THE ART OF THE START 起業への挑戦を読んだ

ガイ・カワサキという元アップルの従業員が書いた本が出たようなので、会社に買ってもらった。

プロダクトを立ち上げ、知ってもらい、ファンを作り、広げる努力

本が対象としているのはこれから起業しようと思っている人、NPOを立ち上げようとしている人としている。
全部で13章。

  • 始動する
  • 製品を発売する
  • リーダーシップをとる
  • 自己資本で経営する
  • 資金を調達する
  • 売り込む
  • チームをつくる
  • ファンを増やす
  • ソーシャルメディアを増やす
  • 事業を拡大する
  • 提携する
  • 持続・継続させる
  • 高潔の士でいる

だいたい、アタリマエのことが書いてある

アタリマエとか書いちゃうとアレだけど、
読んでなるほど〜となることが書いてある。

全部実践できれば強いのだろうけど、なかなかできなかったりする。
事業計画を突っ込まれたり、初めてのことだから失敗したり、くよくよしたり、
働いてくれない人が出たのでクビにせざるをえなかったり、
顧客が思ったように製品を使ってくれなかったり、
そんな中売れない製品を抱えてもインモラルな活動をしないよう精神を清潔に保つ、
などがまとめられている。

普段仕事をしてる中でも役に立つ

普段、仕事をしている中でも何を中心に添えて活動するのか、について
困った時、この本に書かれてることのどこに躓いている状態なのか、
と意識するようになった。本に書かれたことをそのまま受け取ってもアレなので、
実践もしないといけないが。

エンジニア立ち居振舞い: 技術的な暴力を振るわない

開発 雑記

お題「エンジニア立ち居振舞い」

技術的な暴力を振るわない

何事も初めて、ということがあるだろう。

プログラミングが好きで、かつ業務経験もあり、
いろいろなサービスに手を出している人ですら、初めてやったこと、というのがあるはずだ。

  • ECサイトをつくるため、CGIの処理、ブラウザからの快適な買い物を実現するために独学した小売店経営の個人事業主。
  • iOS上でのアプリ開発が解禁されて、初めてiOSアプリを開発するようになったWindows向けアプリケーション開発者。
  • Go言語が発表され、初めてGo言語でサーバサイド側のアプリを書いたフロントエンドエンジニア。
  • AWSのLambdaアーキテクチャ == Serverlessという問題の解決、分散の仕組みに心を惹かれHTTPS経由のファイルアップロードの処理をLambdaに寄せたIoTサービスを始めようとしている組込系エンジニア。
  • Nintendo Switchに対してUnityがサポーターになっている。どうせならゲームをパブリッシュしてみたいと妄想し、Unityを学び始めたインフラエンジニア。

問題を解決したい。問題を解決するために学ぶ、手を出す、金を出すための技術があり、学び、コードを書き、インフラストラクチャを構築していく。
学び、作っていく中で覚えていく、また目的を達成できれば製品をリリースしたり、ベータ版という形でお披露目をしたりするわけだ。

物事をすすめるなかで、技術的な暴力を振るわれることがある。

  • CGIには今の時代はPHPを利用するのに、なぜ未だにPerlを使っているのか。処理速度も遅く、表現も難解だ。
  • iOSアプリそのもの、プラットフォームがいつまであるかもわからないし、今後広がるかわからない。Objective Cを覚えたり、そんなものに技術をかけてどうするのか。
  • Go言語そのものの表現力が低い。そんなものを利用するならJavaScalaで書くべきだ。ライブラリが豊富にあるだろう。Googleに縛られた環境での開発は恐ろしい。
  • Serverlessそのものはサーバがなくなるわけではない。自身でチューニングなど細かなリソース管理ができないPaaSを使って自身のサービスの命運を預けるなんて馬鹿げている。
  • Nintendo Switchが大流行するかわからない。コントローラー使いづらいし。あんなものはチンケなものだ。そもそもUnityをインフラエンジニアが覚えて意味があるのか。

これから学ぼうとしている人たち、別のレイヤーから来て手をつけ始めた人たちに対して冷たかったり、得てして人格を否定するようなことを言う人達が出てくる。

僕はこれを「技術的な暴力」と表現している。

技術的な暴力という言語の割に、新しいものを否定したり、技術に対する理解を現在進行形で進めている人に対して、「お前は未熟」という言葉だけを残し、問題のエレガントな解決手段については指してくれないのだ。

ソフトウェア開発と心情は密接に関わっている、クオリティにも関わっていると考えているので、技術的な暴力は振るいたくないものだ、と気をつけている。

問題を解決したい。やりたいことをやりたいのだ。

Copyright (c) 2013-2015 Keiji Matsuzaki