当連載「Ubuntu Weekly Recipe」は、今回でちょうど400回となります。ここまで続いたのも、いつもアクセスしてくださる読者の皆さま、掲載を続けてくれる技術評論社様、これまでさまざまな記事を執筆してきた著者陣のおかげです。さて、400回ではありますが、何ら特別なことはない、いつもどおりの記事をお届けします。
なぜ「からあげ」なのか?
いつもなら第100回 や第200回 、第300回 のように、キリのいい回には「特別企画」と題して特別な人による、ちょっと特別な連載を掲載していました。ただ今回はいろいろと立て込んでいて企画できなかったため、チーム内で誰も手を挙げなければ普通のRecipeでいいかなと考えていたのです。ところが先週の月曜夜、第399回の記事を提出した[1] 前回担当のいくやさんが、曇りのない期待した眼差し(via メール)で「次はいよいよ400回ですね……!」( 意訳:だからきっと普通じゃないネタ用意していますよね!)と仰るではないですか。
[1] 本連載はだいたい月曜夜ぐらいに提出して、編集さんによるHTML化や手直しを経て、水曜に公開されます。いつもはだいたい提出時にはその次の週の担当が決まっているものですが、今回は皆忙しくて空いている状態でした。
それを受けて、急遽チーム内でネタが出されました。実際にいろいろ調べたり、動かしたりと検討がなされたのですが、いかんせん時間が足りないということで、特別企画としては断念することになった次第です。ボツになったネタは近いうちにきっと誰かが書いてくれることでしょう。
そこで特別企画はできないものの、多少はそれっぽくするために時事ネタでもと考えて最初に出てきた単語が「からあげ」です。
実はUbuntu Weekly Topicsの11月27日号 でもお伝えしたように、グリー株式会社主催のもとUbuntu 15.10を記念したオフラインミーティング を12月12日に開催します(現在は参加者・発表者を募集中ですので、ふるってご参加ください) 。このオフラインミーティングでは、ランチもかねて毎回ちょっとした軽食を提供しています。そのうち「からあげ」は参加者の数に増減に関係なく、回を重ねるごとにひたすら増量を繰り返しているのです。そんなイベントの「からあげ」事情を暴露したツイート が1000RTを超えるという、担当者の心に傷を残す出来事が発生しました。イベント案内のツイート はたかだか20RT程度だったのに。
心の傷はともかくとして、「 からあげ」ネタは注目されることがわかったので、「 からあげ」をタイトルに入れた何かを書いてみようと思ったのが今回Recipeです。
「からあげ」探しの舞台裏
タイトルは決まりましたが、内容がまったく決まっていません。よって無理やりにでもUbuntuにからあげを絡める方法を探す必要があります。Ubuntuとからあげといえば本連載でもおなじみのEmacsとお酒をこよなく愛する水野さん ですが、水野さんそのものをRecipeの記事にすることはできません。……できませんよね?
とりあえずは定石通り、リポジトリからそれっぽいパッケージを探してみることにしましょう。なーに、寿司 や鉄火巻き やちらし寿司 があるのですから、からあげもいくつかあるはずです。
$ apt-cache search karaage
$ apt-cache search fried chicken
$ apt-cache search chicken
texlive-luatex - TeX Live: LuaTeX packages
swig - スクリプト言語向けに C/C++ のコードのインターフェースを生成
swig2.0 - スクリプト言語向けに C/C++ のコードのインターフェースを生成
chicken-bin - Practical and portable Scheme system - compiler
libchicken-dev - Practical and portable Scheme system - development
libchicken6 - Practical and portable Scheme system - runtime
gtk2-engines-magicchicken - GTK+ 2.x 用 Magic Chicken テーマ集
swig3.0 - Generate scripting interfaces to C/C++ code
そのものずばりというものはありませんね。一応Schemeの処理系である「Chicken 」があるので、これを揚げればからあげにはできそうです。しかし、処理系を揚げる方法をどうするか。
そこで、リポジトリにないのなら、Google先生に相談することにしましょう。
図1 からあげという名称のプロジェクトを発見。
あっさり「Karaage 」というプロジェクトが見つかりました。どうやらクラスター向けのアカウント管理を行うソフトウェアという位置づけのようです。実際は「Slurm 」や「PBS/TORQUE 」といったスーパーコンピューターなどの大規模クラスターで使われているリソース管理ツール用のUIとして使うみたいです。Karaageそのものは、Pythonで書かれたDjangoプロジェクトでした。
今回はこれをUbuntuにインストールすることにしましょう[2] 。
Karaage - アカウント管理ソフトウェア
Karaageのインストール先はUbuntu 14.04 LTSとします。インストールガイド には、Debian Jessie用の非公式リポジトリを使う方法が紹介されていますが、14.04の場合はいくつか必要なパッケージが足りないために使えません[3] 。そこで今回は、Pythonソフトウェアをpipコマンドでインストールすることにします。
[3] たとえばpython-django-xmlrpcパッケージなどが該当します。15.10ではほぼJessie相当になっているため、そちらを使う場合は 非公式リポジトリからインストールできるかもしれません。
KaraageはPythonのWebフレームワークであるDjango を使っています。よって最低限必要なものはPython処理系だけです。ただし、インストールガイドではWebサーバーとしてApache2/WSGI、データベースとしてMySQLを使っているため、この記事もそれを利用することにします。
Apache2のインストールはとても簡単です。SSL接続もできるようにしています。SSL証明書はssl-certパッケージをインストールした時に自動生成されるsankeoilの自己署名証明書を使うことにしましょう。SSL証明書関連の詳しいことは第387回 を参照してください。
$ sudo apt-get install apache2 libapache2-mod-wsgi
$ sudo a2enmod ssl
$ sudo a2ensite default-ssl
$ sudo service apache2 restart
MySQLもリポジトリからインストールします。インストール時、MySQLのルートパスワードを問われるので、適切な値を設定しておきましょう。ここでは「KARAAGE」としておきます。
$ sudo apt-get install mysql-server
MySQLの設定ファイル(/etc/mysql/conf.d/karaage.cnf)を作成します。
[mysqld]
character_set_server=utf8
default-storage-engine = innodb
sql_mode = STRICT_ALL_TABLES
[client]
default-character-set = utf8
最後に、次のようにデータベースとユーザーを作成します。「 -pKARAAGE」はMySQLのルートパスワードに置き換えてください。
$ mysql -uroot -pkaraage
mysql> create database karaage;
mysql> CREATE USER 'karaage'@'localhost' IDENTIFIED BY 'karaage';
mysql> GRANT ALL PRIVILEGES ON karaage.* TO 'karaage'@'localhost';
下準備が整いましたので、Karaageをインストールします。pipコマンドはPyPI からだけでなく、GitHubなどからのインストールもサポートしています[4] 。よってpipコマンド用にpython-pipとgitパッケージをインストールしましょう。python-mysqldbとpython-pilはKaraageの設定によって必要になるパッケージです。
$ sudo apt-get install python-pip git python-mysqldb python-pil
$ sudo pip install git+git://github.com/Karaage-Cluster/karaage.git#egg=karaage
(中略)
Successfully installed karaage cssmin Django python-alogger django-xmlrpc django-simple-captcha django-ajax-selects django-jsonfield django-model-utils python-tldap django-pipeline django-tables2 django-filter slimit ldap3 passlib futures ply pyasn1
[4] 今回はシステム領域にインストールしているため「sudo」をつけています。管理者権限がない場合であっても「--user」オプションをつけるなり、virtualenvを使うなりすれば、ユーザーのホームディレクトリ以下にインストールできます。
これでインストール完了です。「 /usr/local」以下に上記のようなPythonパッケージがインストールされていることがわかります。次に「/etc/karaage3/settings.py」を編集して、Karaageの設定を行いましょう。変更箇所のみを列挙します。個々の設定について詳しくは公式ドキュメント を参照してください。
HTTP_HOST = "karaage.example.org"
ALLOWED_HOSTS = [ "10.0.3.65" ]
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.mysql' ,
'NAME' : 'karaage' ,
'USER' : 'karaage' ,
'PASSWORD' : 'karaage' ,
'HOST' : 'localhost' ,
'PORT' : '' ,
'ATOMIC_REQUESTS' : True ,
}
}
SECRET_KEY = 'ey5iM7WFA8Dkdo1G4cGMtkN3O7OeqdbtU1/+ANTAipoK'
また、Djangoプロジェクトで使ういくつかのディレクトリを作成しておきます。
$ sudo mkdir -p /var/log/karaage3 /var/cache/karaage3/{files,tmp} /var/lib/karaage3/static
$ sudo chown -R www-data: /var/{cache,log,lib}/karaage3
設定が一通り完了したので、Karaageのマイグレーションを行います。
$ sudo kg-manage migrate
(中略)
Running migrations:
Rendering model states... DONE
Applying captcha.0001_initial... OK
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying karaage.0001_initial... OK
Applying karaage.0002_auto_20140924_1111... OK
Applying karaage.0003_auto_20150410_1032... OK
Applying methods.0001_initial... OK
Applying sessions.0001_initial... OK
Applying sites.0001_initial... OK
また、Karaageの管理者を作成します。
$ sudo kg-manage kgcreatesuperuser
Username: karaage
E-mail address: karaage@example.com
Password:
Password (again):
Short Name: karaage
Full Name: Ubuntu Karaage
No Institutes in system, will create one now.
Institute Name: ubuntu
Created new group ubuntu.
Created new institute ubuntu.
Karaage Superuser created successfully.
最後にKaraage用のWSGI設定(/etc/apache2/conf-available/karaage3-wsgi.conf)を有効化し、Apacheサービスをリロードします[5] 。
$ sudo a2enconf karaage3-wsgi
$ sudo service apache2 reload
[5] mod_wsgiを使っているのでAapacheのリロードでなく、 「 sudo touch /etc/karaage3/karaage.wsgi」でも、次回アクセス時にDjangoアプリケーションがリロードされます。以降の手順はApacheのリロードで統一していますが、touchする方法に置き換えてかまいません。
「https://マシンのアドレス/karaage」にアクセスするとKaraageの初期画面が表示されるはずです。さらに右上の「Log In」から先ほど作成した管理者のユーザー名とパスワードでログインできます。
図2 Karaageの初期画面
図3 Karaageのログイン画面
図4 Karaageの基本画面
Karaageには「プラグイン機能 」が存在します。これを使うとユーザーアカウントの管理だけでなく、利用状況の表示なども行えるようになります。これらのインストール方法もあわせて紹介しておきましょう。
まずusageプラグインで使うpython-mattplotlibパッケージをインストールしたあとに、3つのプラグインを順番にインストールしていきます。
$ sudo apt-get install python-matplotlib
$ sudo pip install git+git://github.com/Karaage-Cluster/karaage-applications.git#egg=karaage-applications
$ sudo pip install git+git://github.com/Karaage-Cluster/karaage-software.git#egg=karaage-software
$ sudo pip install git+git://github.com/Karaage-Cluster/karaage-usage.git#egg=karaage-usage
さらにpipからインストールできるdjango-table2には問題があるため 、パッチを適用します。
$ wget https://github.com/bdauvergne/django-tables2/commit/423a74702c7bff58cbe8f9078c5241b99ba3bb77.patch
$ sudo patch -d /usr/local/lib/python2.7/dist-packages/ -p1 < ~/423a74702c7bff58cbe8f9078c5241b99ba3bb77.patch
設定ファイル(/etc/karaage3/settings.py)に有効するプラグインを列挙します。
PLUGINS = [
'karaage.plugins.kgapplications.plugin' ,
'karaage.plugins.kgsoftware.plugin' ,
'karaage.plugins.kgsoftware.applications.plugin' ,
'karaage.plugins.kgusage.plugin' ,
]
マイグレーションとApacheのリロードを行います。
$ sudo kg-manage migrate
$ sudo service apache2 reload
最後に分散タスクキューであるCeleryを起動するスクリプトをインストールして起動しましょう。
$ wget https://raw.githubusercontent.com/Karaage-Cluster/karaage-usage/master/debian/karaage3-celery.default
$ wget https://raw.githubusercontent.com/Karaage-Cluster/karaage-usage/master/debian/karaage3-celery.init
$ sudo mv karaage3-celery.default /etc/default/karaage3-celery
$ sudo mv karaage3-celery.init /etc/init.d/karaage3-celery
$ sudo chmod 755 /etc/init.d/karaage3-celery
$ sudo service karaage3-celery start
Karaageのウェブページをリロードすると、サイドバーに有効にしたプラグインが追加されているはずです。
最後の仕上げ
ここまで説明しておいてなんですが、このKaraage、単体ではあまり使えません。最初の方で言及したように、SlurmやPBS/TORQUEなどと併用して初めて便利になります。いずれもパッケージ化されているので、導入自体は簡単です。KaraageとSlurmやPBS/TORQUEの間は、KaraageにData Storeを作成し 、LDAP over TLSを設定して連携する必要があります。
このままではあまり実用的でない上に、「 からあげ」っぽくないので、「 からあげ」画像で装飾することにしましょう。実はDjangoには、生成されるページにからあげ画像を表示するミドルウェア が存在します。よく読み取れなかった方のためにもう一度、「 生成されるページにからあげ画像を表示するミドルウェア 」が存在するのです。
さっそくインストールしましょう。こちらもKaraageと同じくpipコマンドでインストールします。karaage.jsはインストールされなかったので手動でインストールしています。
$ sudo pip install git+git://github.com/drillbits/django-karaage.git#egg=django-karaage
$ wget https://raw.githubusercontent.com/drillbits/django-karaage/master/django_karaage/karaage.js
$ sudo cp karaage.js /usr/local/lib/python2.7/dist-packages/django_karaage/
設定ファイル(/etc/karaage3/settings.py)のMIDDLEWARE_CLASSESに有効するミドルウェアを列挙します。MIDDLEWARE_CLASSESはもともと次のファイルで設定されています。
/usr/local/lib/python2.7/dist-packages/karaage/conf/defaults.py
これをそのままsettings.pyにコピー&ペーストして、最後にdjango_karaageを追加します。
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware' ,
'django.middleware.common.BrokenLinkEmailsMiddleware' ,
'django.contrib.sessions.middleware.SessionMiddleware' ,
'django.contrib.auth.middleware.AuthenticationMiddleware' ,
'django.middleware.clickjacking.XFrameOptionsMiddleware' ,
'django.middleware.csrf.CsrfViewMiddleware' ,
'django.contrib.messages.middleware.MessageMiddleware' ,
'karaage.middleware.threadlocals.ThreadLocals' ,
'karaage.middleware.saml.SamlUserMiddleware' ,
'tldap.middleware.TransactionMiddleware' ,
'django_karaage.middleware.KaraageMiddleware' ,
)
最後にApache2をリロードすれば設定完了です。
$ sudo service apache2 reload
ちなみにsettings.pyの中でKARAAGE_IMAGE_URLにからあげ画像のURLをセットすれば、任意のからあげ画像を表示できます。
図5 ページを蹂躙するからあげ画像