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

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

タグ:ubuntu

前回の続きです:
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


Google ドライブのファイルシステム(?)を fuse を使って Linux にマウントする、というためのツールを使ってみました。今回は Google Drive ocamlfuse というツールを使って、Ubuntu 14.04 環境にマウントしてみました:
https://github.com/astrada/google-drive-ocamlfuse


なお、今回紹介する手順では途中でウェブブラウザを使った OAuth 認証を行うため、GUI 環境が必要です(コマンドライン環境だけでは最後までマウントできません)。GUI アクセスできる Ubuntu とウェブブラウザをご用意ください。

まずはターミナルを開き、Google Drive ocamlfuse を apt-get でインストールできるようにするため、リポジトリを追加します:
$ sudo add-apt-repository ppa:alessandro-strada/ppa
$ sudo apt-get update

そして apt-get install を実行します:
$ sudo apt-get install google-drive-ocamlfuse

準備の最後に Google Drive をマウントする先のマウントポイントとなるディレクトリ(以下の例では ~/googledrive)を用意しておきます:
$ mkdir ~/googledrive

では Goodle Drive ocamlfuse を使って実際にマウントしてみます。初回のみコマンドラインから引数なしで実行します:
$ google-drive-ocamlfuse

するとウェブブラウザが起動し、Google の OAuth 認証が行われます。Google ドライブを使うためのユーザーおよびパスワードでログインします:
2017032201


オフラインアクセスのための許可が求められるので「許可」をクリック:
2017032202


以下のようなメッセージが表示されれば OAuth 認証完了です:
2017032203


再びターミナル画面に戻り、今度はマウントポイントを指定して google-drive-ocamlfuse を実行します。これで OAuth 認証時に使ったユーザーの Google ドライブが指定ディレクトリにマウントされます:
$ google-drive-ocamlfuse ~/googledrive


この状態で df -h コマンドを実行すると、指定したディレクトリに Google Drive がマウントされていることが確認できます:
2017032204


ls コマンドなどでこのディレクトリ内を確認すると、Google Drive 内のドキュメントが odt 等のフォーマットで存在していることを確認できます:
2017032205


アンマウントする場合は fusermount コマンドを -u オプションを付けて(アンマウントポイントを指定して)実行します:
$ fusermount -u ~/googledrive


Google ドライブがマウントできると Boostnote のドキュメント共有が異なるシステム間でも可能になったりできて、ますます便利です。



(参考)
http://o2t.hatenablog.com/entry/2014/09/08/143621
 

Ubuntu で LXC を使ってみました。

LXC は "LinuX Containers" の略で、Linux の仮想化技術の1つです。1つのセンターホストの上で複数の Linux システム(コンテナ)を走らせる、というものです。コンテナなので、いわゆる VM(Virtual Machines) とは異なり、個別のプロセスとネットワーク空間を作り出す仮想環境です。なお Ubuntu 14.04 の 64bit 版を前提として以下を記載します(いつもの CentOS6 環境だとなぜか上手くいきませんでした):

導入は簡単。apt-get コマンド一発で LXC を導入します:
$ sudo apt-get install lxc

導入できたら中身を一度確認してみます。まず用意されているテンプレートの一覧が /usr/share/lxc/templates/ にあるのでその一覧を確認します(青字が出力結果、これだけのテンプレートが用意されています):
$ ls /usr/share/lxc/templates/
lxc-alpine     lxc-centos    lxc-fedora        lxc-oracle  lxc-ubuntu-cloud
lxc-altlinux   lxc-cirros    lxc-gentoo        lxc-plamo
lxc-archlinux  lxc-debian    lxc-openmandriva  lxc-sshd
lxc-busybox    lxc-download  lxc-opensuse      lxc-ubuntu

では今回は Plamo テンプレート(lxc-plamo)を使って、p01 という名称で Plamo Linux コンテナを作成してみます:
$ sudo lxc-create -t plamo -n p01
  :
  :
  :
morse-2.1-x86_64-P1 のインストール中
PACKAGE DESCRIPTION:

qrq-0.1.4-x86_64-P1 のインストール中
PACKAGE DESCRIPTION:

Copy /var/cache/lxc/rootfs-plamo-5.x-x86_64 to /var/lib/lxc/p01/rootfs...
Copying /var/cache/lxc/rootfs-plamo-5.x-x86_64 to /var/lib/lxc/p01/rootfs...
patching file /var/lib/lxc/p01/rootfs/etc/inittab
Setting root password to 'root'...
Please change root password!

コマンドが完了するまでしばらくかかりますが、無事に完了したようです(root ユーザーのパスワードが root で、すぐに変更しろ、というメッセージが表示されています)。 作成されたコンテナのルートディレクトリは /var/lib/lxc/p01/rootfs/ 以下に作成されています(p01 はコンテナ名):
$ ls /var/lib/lxc/p01/rootfs/
bin   cdrom  etc           home  lib64  mnt   root  sbin  tmp  var
boot  dev    etc-incoming  lib   media  proc  run   sys   usr

ではこの Plamo Linux のコンテナを実際に起動してみましょう。名前を指定して、デーモンモードで起動して、コンソールに接続します:
$ sudo lxc-start -n p01 -d
$ sudo lxc-console -n p01

Connected to tty 1
Type  to exit the console,  to enter Ctrl+a itself


Welcome to Linux 3.13.0-85-generic.

p01 login:
 

接続できました!ここで root ユーザーで(パスワード root で)ログインし、とりあえずはパスワードを変更しておきます:
p01 login: root (ユーザー名は root)
Password: (パスワードは root)
root@p01:~# passwd
Enter new UNIX password: (新パスワードを入力)
Retype new UNIX password: (同じ新パスワードを入力)
passwd: password updated successfully

で、ここからはコンテナ上に展開された Plamo Linux を1サーバーのように使うことができるようになります:
root@p01:~# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-1       913G   16G  851G   2% /
none            100K     0  100K   0% /dev
/media          5.8G     0  5.8G   0% /media
/tmp            5.8G     0  5.8G   0% /tmp

元の(Ubuntu の)コンソールに戻るには Ctrl+A を押し、続けて Q を押します:
root@p01:~# exit (Plamo Linux から普通にログアウト)
logout


Welcome to Linux 3.13.0-85-generic.

p01 login: (ここで Ctrl+A,Q)
$ (Ubuntu のコマンドプロンプトへ戻った)





前回の続きです:
Bluemix のビルドパックを作る(1/3)


このシリーズは3回に分けて IBM Bluemix 用のビルドパックをゼロから作成する手順を説明するもので、今回はその2回目です:
(1) ビルドパックを作る上で知っておくべきこと
(2) ビルドパックを作るための準備作業      ←今回はここ
(3) ビルドパックを作成して、実際に動作確認


前回は、ビルドパックを作成する上で知っておくべき仕組みや制限事項についてをまとめました。おおまかには次のような仕組み/条件でビルドパックを作ります:
- ビルドパック自体は detect, compile, release の3つのスクリプトからなる。
- これら3つのスクリプトは一般ユーザー権限で実行される。su や sudo は使えない。
- 素の Ubuntu Linux に対して、これら3つのスクリプトが実行された後に必要な環境が整っているようにする。

今回と次回の2回に分けて、実際にビルドパックをゼロから作成します。正確には実際にビルドパックそのものを作る手順は次回紹介しますが、今回はそのための準備作業を紹介します。具体的には実際にビルドパックを作るスクリプトは一般ユーザー権限でしか実行できないため、ビルドなどの root 権限が必要な作業はあらかじめ(Ubuntu 環境下で)済ませておく必要があります。そのための作業の説明を今回のブログエントリの中で紹介します。

また、今回作成するビルドパックの内容は「比較的緩めな日本語対応 PHP アプリケーションサーバーを作る」こととします。具体的には以下の様なスペック PHP アプリケーションサーバーのビルドパックを作ります:
・ PHP 5.6.14
・ Apache HTTPD 2.4.16
・ PHP の MySQL モジュールと Postgresql モジュールを追加
・ PHP の設定は日本語 UTF-8 ベースで、エラー発生時のエラー内容を出力、ファイルアップロードは1ファイル10MB まで許可、・・・などなど php.ini を緩めに設定
・ Apache HTTPD も .htaccess での設定上書きを許可するなど、ゆるゆるにする

簡単にいえば「php.ini と httpd.conf を緩めに設定するような環境で PHP のビルドパックを作成する」ということです。


では本エントリでの作業に入ります。まずは 64bit の Ubuntu Linux 14.02 環境を用意します。デスクトップ環境は必須ではありません。SSH 等でログインしてターミナル上での操作ができれば大丈夫です:
2015100900



この Ubuntu の中に PHP と Apache HTTPD 環境を構築していきます。といっても、ただインストールすればいいというわけではありません。インストールだけなら "sudo apt-get install php5 apache2 libapache2-mod-php5" とかを実行すればいいのですが、これは sudo が使える前提での話です。上記のようにビルドパック作成時の権限は sudo の使えないユーザー権限なので、この apt-get による簡単なインストール方法は使えないのです。

ではどうするか? その答は (2) まず Ubuntu 内で必要なモジュールを、ソースからのコンパイルなど全て手作業で作り、 (3) 作ったモジュールを tar などでまとめておき、ビルドパック作成時は一般ユーザーが展開してコピーすればよい、という状態にしておく 必要があるのでした。要は root 権限が必要な部分((2))と、不要な部分((3))に作業を分断し、ビルドパック作成時は root がなくてもできる作業だけを行います。そしてそのような作業だけで済むように、root 権限が必要な作業は(ビルドパック作成作業の前)あらかじめ済ませてまとめておく、という作業を行うようにします。これが全体作業でいうところの (2) と (3) を分けた理由でもあります。

では、あらためて今回行う作業の内容をまとめておきます:
(2-1) Apache HTTPD 2.4.16 をソースからビルドして /app/apache/ 以下にインストール
(2-2) PHP 5.6.14 をソースからビルドして /app/php/ 以下にインストール
(2-3) 出来上がった Apache HTTPD 2.4.16 および PHP 5.6.14 のモジュールを /app/apache/ および /app/php/ 以下からそれぞれ取り出してアーカイブ

こうして出来上がったアーカイブファイルは、Ubuntu 環境の /app/apache/ & /app/php/ 以下であれば動くように作られているので、同じ状態を作り出すようにビルドパックを構成(次回)すればよい、ということになります。今回はそのための準備を行います。


では具体的な作業手順の説明です。まずは Ubuntu 14.02(64bit) のターミナル環境に SSH 等でログインします:
2015100901


まずは作業ディレクトリを作成します。今回は /tmp/build を作業ディレクトリとします:
$ mkdir -p /tmp/build
$ cd /tmp/build


(2-1) Apache HTTPD 2.4.16 のソースコード一式をダウンロードし、作業ディレクトリ内に展開します:
$ curl -L http://www.carfab.com/apachesoftware/httpd/httpd-2.4.16.tar.gz | tar xzf -


Apache HTTP のビルドに必要な apr-1.5.2 および apr-util-1.5.2 をそれぞれダウンロードし、作業ディレクトリ内の srclib/ ディレクトリ内に展開します:
$ cd httpd-2.4.16/srclib
$ curl http://www.us.apache.org/dist/apr/apr-1.5.2.tar.gz | tar xzf -
$ mv apr-1.5.2 apr
$ curl http://www.us.apache.org/dist/apr/apr-util-1.5.4.tar.gz | tar xzf -
$ mv apr-util-1.5.4 apr-util
$ cd ..


Apache HTTP のビルドに必要なライブラリ(libpcre3, libpcre3-dev)を apt-get で入手します:
$ sudo apt-get install libpcre3 libpcre3-dev


Apache HTTP ビルド後のインストールディレクトリを /app/apache/ とする前提でビルド(configure して make して make install )します:
$ ./configure --prefix=/app/apache --with-included-apr --enable-rewrite
$ sudo mkdir -p /app/apache
$ sudo chmod -R 777 /app/
$ make && make install


(2-2) PHP インストール先のディレクトリ(/app/php/)を用意します:
$ sudo mkdir -p /app/php


(2-1) の作業でビルドしたモジュールの一部を PHP のライブラリとしてコピーします:
$ sudo mkdir -p /app/php/ext
$ sudo chmod -R 777 /app/php
$ cp /app/apache/lib/libapr-1.so.0 /app/php/ext
$ cp /app/apache/lib/libaprutil-1.so.0 /app/php/ext
$ cd /app/php/ext
$ ln -s libapr-1.so.0 libapr-1.so
$ ln -s libaprutil-1.so.0 libaprutil-1.so


PHP のビルドに必要なライブラリ(libxml2, libxml2-dev, libssl-dev, ...)を apt-get で入手します。平行して PostgreSQL をサポートするために必要な環境を整えます:
$ cd /tmp/build
$ sudo echo “deb http://apt.postgresql.org/pub/repos/apt/ trusty-pgdg main”> /etc/apt/sources.list.d/pgdg.lis
$ wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc |  sudo apt-key add -OK
$ sudo apt-get update
$ sudo apt-get install libxml2 libxml2-dev libssl-dev libvpx-dev libjpeg-dev libpng12-dev libXpm-dev libbz2-dev libmcrypt-dev libcurl4-openssl-dev libfreetype6-dev postgresql-server-dev-9.4


PHP のソースコード一式をダウンロードし、作業ディレクトリ内に展開します:
$ curl -L http://php.net/get/php-5.6.14.tar.gz/from/us1.php.net/mirror | tar xzf -


PHP ビルド後のインストールディレクトリを /app/php/ とする前提でビルド(configure して make して make install )します:
$ cd php-5.6.14
$ ./configure --prefix=/app/php --with-apxs2=/app/apache/bin/apxs --with-mysqli --with-pdo-mysql --with-pgsql --with-pdo-pgsql --with-iconv --with-gd --with-curl=/usr/lib --with-config-file-path=/app/php --enable-soap=shared --enable-libxml --enable-simplexml --enable-session --with-xmlrpc --with-openssl --enable-mbstring --with-bz2 --with-zlib --with-gd --with-freetype-dir=/usr/lib --with-jpeg-dir=/usr/lib --with-png-dir=/usr/lib --with-xpm-dir=/usr/lib
$ make && make install


MySQL クライアントライブラリを apt-get で入手して、PHP / Apache のライブラリとしてコピーします:
$ sudo apt-get install libmysqlclient-dev
$ cd /app/php/ext
$ cp /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18.0.0 ./
$ ln libmysqlclient.so.18.0.0 libmysqlclient.so.18
$ ln libmysqlclient.so.18.0.0 libmysqlclient.so
$ cp /tmp/build/php-5.6.14/.libs/libphp5.so /app/apache/modules/


(2-3) コンパイルが終了した Apache HTTP のモジュールをアーカイブします:
$ cd /app
$ echo '2.4.16' > apache/VERSION
$ tar -zcvf apache-2.4.16.tar.gz apache


コンパイルが終了した PHP のモジュールをアーカイブします:
$ echo '5.6.14' > php/VERSION
$ tar -zcvf php-5.6.14.tar.gz php




これで (2) の作業が完了して、ビルドパックを作るための作業準備が整いました。今回の作業で出来上がった apache-2.4.16.tar.gz および php-5.6.14.tar.gz はどちらも /app/ 以下にコピーすれば正しく動く前提で作られているので、これらのモジュールを使い、この条件でビルドパックを作ってあげればよい、ということになります。

次回はいよいよ実際にビルドパックを作って、動作確認までしてみます。ゴールは目前!


(注 2015/Oct/16 追記)
続きはこちら

 

このページのトップヘ