まだプログラマーですが何か?

プログラマーネタとアスリートネタ中心。たまに作成したウェブサービス関連の話も http://twitter.com/dotnsf

タグ:swift

前回の続きです:
Ubuntu で Swift 言語を使う


前回は Ubuntu 上に Swift アプリケーション開発環境を用意して、ハローワールド的なアプリケーションを作って実行するまでを紹介しました。今回は Swift 用の Web アプリケーションフレームワークである Kitura を使って、Ubuntu 上の Swift で Web アプリケーションを開発してみます。 以下の作業の前に前回紹介した導入作業が必要になるので、まだの場合はこちらを参照して Ubuntu に Swift をインストールしておいてください。

では改めて Kitura アプリケーションを作ってみます。前回同様にアプリケーションプロジェクト用のディレクトリ(以下の例では myFirstKitura)を作って移動し、swift コマンドでパッケージを初期化しておきます(ここまでは前回と同様です):
$ mkdir myFirstKitura
$ cd myFirstKitura
$ swift package init --type executable

このプロジェクトでは Kitura を利用するため、パッケージ情報に dependencies を記述する必要があります。Package.swift ファイルをテキストエディタで開き、以下の青字部分を追加します:
import PackageDescription

let package = Package(
    name: "myFirstKitura",
    dependencies: [
        .Package(url: "https://github.com/IBM-Swift/Kitura.git", majorVersion: 1, minor: 6)
    ]
)

そしてアプリケーションのソースコード Sources/main.swift を以下のように変更します。Kitura の HTTP Server を使って 8090 番ポートで待ちうけ、"/"(ドキュメントルート)への GET アクセスをハンドリングしてメッセージを表示する、という内容にしています:
import Kitura

// Create a new router
let router = Router()

// Handle HTTP GET requests to /
router.get("/") {
    request, response, next in
    response.send("ハローワールド!")
    next()
}

// Add an HTTP server and connect it to the router
Kitura.addHTTPServer(onPort: 8090, with: router)

// Start the Kitura runloop (this call never returns)
Kitura.run()
  ↑なんとなく Node.js の Express に似てます。。


ではこのコードをビルドして実行します:
$ swift build
$ ./build/debug/myFirstKitura (実行したままにします)

実行されている状態で、同じシステムのウェブブラウザから http://localhost:8090/ にアクセスし、コードに記述したメッセージが表示されることを確認します:
2017040402


ウェブアプリケーションとして稼働できていることが確認できました。実行したままになっているコマンドを終了するには Ctrl + C を実行します:
$ ./build/debug/myFirstKitura
^C  (Ctrl+C を実行して、コマンドプロンプトに戻る)
$


以上、簡単なサンプルでしたが、Web のルーティング機能が実装されたフレームワークで Swift アプリケーションを、macOS ではなく Ubuntu 環境で開発/実行することができるようになりました。この Swift ウェブアプリケーションは IBM BluemixSwift ランタイムとしても実装されており、作ったアプリケーションを Bluemix 上ですぐに運用することができます:
2017040403



(参考)
http://www.kitura.io/en/starter/gettingstarted.html


Apple が開発したプログラミング言語 Swift は 2016 年にオープンソース化され、macOS 以外のプラットフォームでも Swift のアプリケーション開発ができるようになりました。というわけで、実際に Ubuntu から Swift をセットアップして使ってみました。以下は自分の(VirtualBox 上の)Ubuntu 14.02 環境での作業記録です。

なお、今回は Swift 3.0.2 を使うことにします(2017/Apr/04 時点での最新バージョンは 3.1 ですが、このバージョンの場合 Xcode 併用となって環境準備が面倒だったので・・ ←訂正、コマンドラインだけでも 3.1 が使えました。「Xcode の一部として Swift が提供されている」という表現が正しいようです)。

Ubuntu で Swift をインストールしたり、Swift アプリを作成したりする作業はターミナルからのコマンド操作で行います。というわけでターミナルを起動し、まずは Swift をインストールする上での前提パッケージをインストールします:
$ sudo apt-get update
$ sudo apt-get install clang libicu-dev libcurl4-openssl-dev libssl-dev

続いて Swift のダウンロードページから Ubuntu 用の Swift 3.0.2 をダウンロードします:
2017040401


ダウンロードしたファイルを展開して、展開先にパスを通します:
$ tar xzvf swift-3.0.2-RELEASE-ubuntu14.04.tar.gz
$ export PATH=~/swift-3.0.2-RELEASE-ubuntu14.04.tar.gz/usr/bin:$PATH  (この行を ~/.bashrc などに書くのがオススメ)

これで Swift 本体のインストールは完了です。次にアプリケーションを作ってみます。開発用のディレクトリ(以下の例では myFirstSwift)を作って、そこに移動します:
$ mkdir myFirstSwift
$ cd myFirstSwift

このディレクトリの中で上記でインストールした swift コマンドを使い、Swift アプリケーションパッケージを初期化します:
$ swift package init --type executable

この時点で以下のようなファイル構成が生成されています:
myFirstProject
|- Package.swift
|- Sources
    |- main.swift
    |- Tests

いわゆる「ソースファイル」は Sources/main.swift になります。この時点での中身は以下のような Hello World 表示アプリケーションになっています:
print("Hello, world!")

必要に応じてテキストエディタで適当に書き直してみます:
print("ハロー Swift ワールド on Ubuntu!")

ソースコードが用意できたら swift コマンドでビルドします:
$ swift build

ビルド結果は .build/debug/myFirstSwift にあるので、これを実行して、期待通りの結果が出力されることを確認します:
$ ./build/debug/myFirstSwift
ハロー Swift ワールド on Ubuntu!

ごく簡単なサンプルでしたが、とりあえず Ubuntu 上で Swift アプリの開発ができることが確認できましたが。次回は Swift の Web フレームワークである Kitura を紹介する予定です。




(参考)
http://www.kitura.io/en/starter/gettingstarted.html


IBM Bluemix からは(Swift 互換の)Object Storage サービスが提供されています:
2016051701


このオブジェクトストレージのサービスインスタンスは他の(外部の)システムにマウントして使うことができます。その一例として、Linux(CentOS) から CloudFuse を使ってマウントする方法を紹介します(2016/May/17 時点での情報です)。

まずは Bluemix にログインし、Object Storage サービスを1つ作成するために、カタログのサービス一覧から "Object Storage" を選択します(現在は「ストレージ」カテゴリ内にありました):
2016051702


Object Storage サービスに関する説明が紹介されるので内容を確認してください:
2016051701


このタイミングで利用する Object Storage サービスの料金プランを選択する必要があります。無料プランでは 5GB まで、標準プランでは使用量の上限はなく 1GB あたりで 4.2 円と、アウトバウンド転送 1GB につき 9.45 円がかかります。好きな方を選んでインスタンスを「作成」します:
2016051703


Object Storage サービスが作成できたらダッシュボードからそのサービスインスタンスを選択します:
2016051704


Object Storage サービスの画面が表示されたら、左ペインで「サービス資格情報」を選択します。すると右ペインにサービス資格情報として、JSON フォーマットのテキストが表示されます:
2016051705


おそらく以下のようなフォーマットのテキスト情報になっているはずです。このうち青字で記述した auth_url, userId, password の内容が後で必要になるのでメモしておきます:
{
  "credentials": {
    "auth_url": "https://identity.open.softlayer.com",
    "project": "object_storage_XXXXXXXX_XXXX_XXXX_XXXX_XXXXXXXXXXXX",
    "projectId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "region": "dallas",
    "userId": "(userId)",
    "username": "Admin_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "password": "(password)",
    "domainId": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "domainName": "NNNNNN"
  }
}


Object Storage のインスタンスは用意できました。ではこれを Linux のファイルシステムとして(リモート)マウントしてみましょう。

マウント元になる Linux システムを用意します。今回は CentOS 6(64bit) で試しました。また Object Storage をマウントするためのツールとして CloudFuse を用いました。CentOS 上に CloudFuse を導入する手順は以前のブログで紹介したことがあるのでこちらを参照ください:
SoftLayer の Object Storage をサーバーインスタンスにマウントする

CloudFuse が準備できたら、ログインユーザーのホームディレクトリ直下に以下の3行の内容で .cloudfuse というテキストファイルを作成します(赤字はコメント):
username=(userId)  # 上記の userId の値
api_key=(password) # 上記の password の値
authurl=https://identity.open.softlayer.com/v3/  # 上記の auth_url の値に '/v3/' を追加

これで準備完了です。実際に Object Storage をマウントする前に、df コマンドで現在のファイルシステム状況を確認しておきましょう:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot

では以下のコマンドを実行して、Bluemix の Object Storage を(この例では /mnt 以下に)マウントしてみます:
# cloudfuse /mnt

正しくマウントできているか、再度 df コマンドで確認します。ちゃんと /mnt 以下にマウントできているようです。この状態になれば Object Storage の中身を /mnt ディレクトリ以下と見なして直接読み書きすることが可能になります:
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/vg_centos-lv_root
                      8.3G  3.5G  4.5G  44% /
tmpfs                 499M  144K  499M   1% /dev/shm
/dev/vda1             477M  152M  301M  34% /boot
cloudfuse             8.0T  7.5M  8.0T   1% /mnt

マウント状態を解除するには umount コマンドを実行します:
# umount /mnt

Bluemix の Object Storage の有用な使いみちが実現できそうです。なお、Object Storage サービスに関してはこちらのドキュメントも参照ください:
https://console.ng.bluemix.net/docs/services/ObjectStorage/index.html



先週、IBM BluemixObject Storage サービスがベータを卒業して正式サービスになりました:
2015022101


SoftLayer 上に用意された Swift と呼ばれる標準的なオブジェクトストレージ機能を Bluemix を通じて提供するものです。5GB であれば無料サービスとして利用できます:
2015022102


では、この Bluemix 上の Object Storage サービスをクライアントから使う方法を紹介します。


1. Swift ツールの導入

このサービスを Linux(CentOS) から実際に利用するまでの手順を紹介します。このサービスを使うには swift と呼ばれるツール(swiftclient)が必要です。まずはこのツールを導入しましょう。

swift の導入は pip を使って行います。最初にこの pip を導入する必要がありますが、pip の導入に必要なライブラリをあらかじめまとめて導入しておきます:
# yum install fuse fuse-libs fuse-devel libattr-devel gcc gcc-c++ kernel-devel libxslt-devel

ここで導入した fuse ライブラリを読み込んでおきます:
# modprobe fuse

次に pip の導入に必要な Python 3 を導入します。Python 3 は yum ではインストールできないため、PUIAS から導入します。まずはそのための GPG Key をインストールします:
# cd /etc/pki/rpm-gpg/
# wget -q http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
# rpm --import RPM-GPG-KEY-puias

次に /etc/yum.repos.d/puias-computational.repo ファイルを以下の内容で作成します:
# vi /etc/yum.repos.d/puias-computational.repo

(以下を作成して保存)
[PUIAS_6_computational] name=PUIAS Computational Base mirrorlist=http://puias.math.ias.edu/data/puias/computational/$releasever/$basearch/mirrorlist gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias

作成したリポジトリファイルを使って yum で Python 3 一式をインストールします:
# yum install python3 python3-devel python3-libs python3-setuptools

Python 3 がインストールできていれば pip がインストールできます:
# wget -O - https://bootstrap.pypa.io/get-pip.py | python3

これでやっと pip の導入ができました。ではこの pip を使って keystoneclient と swiftclient をインストールします:
# pip install python-swiftclient
# pip install python-keystoneclient

ここまでの手順で swift コマンドが使えるようになっているはずです。


2. Object Storage サービスの追加と、環境変数の設定

Bluemix 上で Object Storage サービスを追加し、その資格情報を確認します:
2015022103


環境変数 VCAP_SERVICES の内容は以下の様な JSON 形式のテキストになっているはずです。これらのうち、赤字部分をメモしておきます(後で使います):
{
  "Object-Storage": [
    {
      "name": "Object Storage-7d",
      "label": "Object-Storage",
      "plan": "Free",
      "credentials": {
        "auth_url": "https://identity.open.softlayer.com",
        "project": "object_storage_(project)",
        "projectId": "(projectId)",
        "region": "dallas",
        "userId": "(userId)",
        "username": "Admin_(username)",
        "password": "(password)",
        "domainId": "(domainId)",
        "domainName": "(domainName)"
      }
    }
  ]
}

ここで取得した接続情報を Swift クライアント(Linux)の環境変数に(例えば /etc/bashrc などに)設定します:
export OS_USER_ID=(userId)
export OS_PASSWORD=(password)
export OS_PROJECT_ID=(projectId)
export OS_AUTH_URL=https://identity.open.softlayer.com/v3
export OS_REGION_NAME=dallas
export OS_IDENTITY_API_VERSION=3
export OS_AUTH_VERSION=3

↑上の赤字部分は接続情報のものを使い、青字部分は接続情報には含まれていないのですが、上記のように書き足してください。/etc/bashrc に書いた場合は再ログインするなどして、この環境変数が有効になった状態にしてください。これで swift を使う準備が整いました。


3. swift コマンドを実際に使ってみる

Object Storage はコンテナと呼ばれるフォルダ単位で利用します。現在のコンテナ一覧を確認してみましょう。以下のコマンドを実行します:
# swift list

初めて実行した時には(コンテナが存在していないので)何も表示されないはずです。コンテナを作成するにはコンテナ名を指定して post コマンドを実行します。以下の例では dotnsf-container というコンテナを作成しています:
# swift post dotnsf-container

このコマンド実行後に再度コンテナ一覧を確認すると、作成した dotnsf-container が表示されるはずです(緑字が出力結果):
# swift list
dotnsf-container

次にコンテナの中身を確認します:
# swift list dotnsf-container

これもコンテナ作成直後に実行した段階では(中身がないので)何も表示されないはずです。 ではこのコンテナにローカルファイル(以下の例ではカレントディレクトリの abc.txt を指定してアップロードしてみます:
# swift upload dotnsf-container abc.txt

この後に再度コンテナの中身を確認すると、アップロードしたファイルが追加されていることが確認できます:
# swift list dotnsf-container
abc.txt

コンテナ内のファイルは以下のコマンドでカレントディレクトリにダウンロードできます:
# swift download dotnsf-container abc.txt

コンテナ内のファイルが不要になった場合、以下のコマンドでコンテナから削除できます:
# swift delete dotnsf-container abc.txt
abc.txt

一通りのコンテナ/ファイル操作コマンドが利用できそうです。



(参考)
https://www.ng.bluemix.net/docs/services/ObjectStorage/index.html





このページのトップヘ