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

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

タグ:centos

CentOS や RHEL で便利に利用されているパッケージ管理コマンドの "yum" 。このコマンドの便利な使い方の1つが groupinstall と呼ばれる機能です。ある環境を用意しようとした際に複数のパッケージを導入しないといけない場合、その複数のパッケージを1つの「グループパッケージ」のまとまりとみなし、グループパッケージ1つを指定して導入することで環境構築が可能になります。

個人的によく使う例で紹介すると、GUI のデスクトップ環境であれば "Desktop"、日本語サポート環境であれば "Japanese Support" などです。それぞれ以下のコマンドで導入できます:
(デスクトップ環境)
# yum groupinstall "Desktop"
(日本語サポート環境) # yum groupinstall "Japanese Support"

上記のようにグループパッケージを指定するだけでまとまったパッケージを導入できるのは便利なのですが、ではこれらのコマンドで実際にどのようなパッケージが導入されるのかを調べる方法はあるでしょうか? その答が yum の groupinfo コマンドです。例えば "Desktop" で何が導入されるのかを確認するには以下のようなコマンドを実行します(黒字が入力、青字が出力結果です):
# yum groupinfo "Desktop"
  :
  :
グループ: デスクトップ
 説明: シンクライアントとして使用できる最低限のデスクトップ
 強制的なパッケージ:
   NetworkManager
   NetworkManager-gnome
   alsa-plugins-pulseaudio
   at-spi
   control-center
   dbus
   gdm
   gdm-user-switch-applet
   gnome-panel
   gnome-power-manager
   gnome-screensaver
   gnome-session
   gnome-terminal
   gvfs-archive
   gvfs-fuse
   gvfs-smb
   metacity
   nautilus
   notification-daemon
   polkit-gnome
   xdg-user-dirs-gtk
   yelp
 標準パッケージ:
   control-center-extra
   eog
   gdm-plugin-fingerprint
   gnome-applets
   gnome-media
   gnome-packagekit
   gnome-vfs2-smb
   gok
   openssh-askpass
   orca
   pulseaudio-module-gconf
   pulseaudio-module-x11
   vino
 オプション パッケージ:
   sabayon-apply
   tigervnc-server
   xguest


同様に "Japanese Support" の場合は以下のようになりました:
# yum groupinfo "Japanese Support"
  :
  :
グループ: 日本語のサポート
 Language: ja
 標準パッケージ:
   ipa-gothic-fonts
   ipa-mincho-fonts
   ipa-pgothic-fonts
   ipa-pmincho-fonts
   vlgothic-fonts
   vlgothic-p-fonts
 条件付パッケージ:
   autocorr-ja
   eclipse-nls-ja
   ibus-anthy
   kde-i18n-Japanese
   kde-l10n-Japanese
   libreoffice-langpack-ja
   man-pages-ja
   poppler-data


これらの結果の中の「強制的パッケージ」と「標準パッケージ」が groupinstall コマンドによって導入されます。また「オプションパッケージ」や「条件付きパッケージ」が導入可能になります。

滅多にはないのですが、CentOS/RHEL の環境によっては "yum groupinstall" コマンドが使えないこともあります。その場合はここに記載した情報を使って "yum install" で同様の環境構築が可能になります。

※ここに記載されていないグループパッケージを導入する場合は、"yum groupinfo" の使える環境でパッケージを確認し、そこにリストされたパッケージを "yum install" する、という形になります。


Microsoft が .Net アプリケーションを動かすためのフレームワークとしてオープンソース化を進めていた ".Net Core" の正式バージョン 1.0 がリリースされました:
https://www.microsoft.com/net/core

この .Net Core が .Net アプリケーションを動かすための基盤であり、同時に公開された ASP.Net Core は Web アプリケーションの開発基盤となる部分になります。従って .Net Framework のうちの GUI を除いた開発環境のオープンソース化が実現され、Linux や MacOS 上で動かすことができるようになった、ということになります。

というわけで、早速自分の CentOS 環境に導入して使ってみました。なお、.Net Core は CentOS 7 以降に対応しているので、CentOS 7.x 環境を用意した上で以下を説明します。

まずは .Net Core 1.0 をインストールします。CentOS 7 環境で(SSH などで)ターミナルログインし、以下のコマンドを実行します(この例では実体を /opt/dotnet/ 以下にインストールし、/usr/local/bin へシンボリックリンクしています):
$ sudo yum install libunwind libicu
$ curl -sSL -o dotnet.tar.gz https://go.microsoft.com/fwlink/?LinkID=827529
$ sudo mkdir -p /opt/dotnet
$ sudo tar zxf dotnet.tar.gz -C /opt/dotnet $ sudo ln -s /opt/dotnet/dotnet /usr/local/bin

インストールはこれで完了です。では実際にアプリを作ってみましょう。雛形として用意されているアプリがいわゆる "Hello World" なので、"helloworldapp" というフォルダを作り、その中にアプリを作ることにします:
$ mkdir helloworldapp
$ cd helloworldapp
$ dotnet new

上記の最後に入力している "dotnet new" コマンドで雛形作成を含めた初期化を行います。この初期化によって、Program.cs ファイルと project.json ファイルという2つのファイルが作成されます:
2016092901


このうちの Program.cs ファイルがソースコードに相当するファイルです。デフォルト状態では "Hello World!" という文字列をコンソールに表示(WriteLine)するだけの内容になっています:
2016092902


これを vi などのエディタで適当に書き換えてみましょう。以下の例では "ハロー .Net ワールド!!" という日本語文字列に変えてみました:
2016092903


もう1つの proejct.json ファイルは依存関係などのパッケージ情報が記述されています。こちらは今回は変更が不要です:
2016092904

ではいよいよ CentOS 上でこの .Net アプリを動かしてみましょう。"dotnet run" と入力します:
$ dotnet run

成功すると以下のようにコンパイルされ、実行されて、書き換えた文字列が表示されるはずです:
2016092906


なお実行時にコンパイルされるので、このコマンド実行後には bin と obj フォルダがそれぞれ生成されているはずです:
2016092901


今回は CentOS 7.x 上でのインストールから実行までを紹介しました。実行手順は全てで共通ですが、インストール方法はシステムによって若干異なります(Docker イメージも公開されてるんですね・・・)。詳しくは公式ドキュメントを参照ください:
https://www.microsoft.com/net/core


Python から R 言語を呼び出して実行する手順をまとめました。システムは CentOS 6.x を想定しています。


具体的には Python の PypeR ライブラリを使います。なので Python と R 言語と PypeR ライブラリをインストールすることになります。ただそれだけではまだ色々不便なので、numpy や pylab などの PypeR と一緒によく使うライブラリとまとめて環境を用意して使うことにします。

まず以下の手順を実行する上で前提となるライブラリ類と Python3 をまとめて導入しておきます。
# rpm -ivh http://mirror.yandex.ru/fedora/russianfedora/russianfedora/free/el/releases/6/Everything/x86_64/os/puias-release-6-2.R.noarch.rpm
# yum install -y python3.x86_64 python3-devel.x86_64 python3-tools.x86_64 freetype* libpng-devel libjpeg-devel lapack-devel

次に pip をインストールします:
# curl -kL https://bootstrap.pypa.io/get-pip.py | python

導入した pip を使って PypeR などのライブラリをインストールします(numpy や scipy などは結構時間がかかります):
# pip install numpy
# pip install pyper
# pip install pandas
# pip install scipy
# pip install pylab

最後に R 言語環境をインストールします:
# yum install R

これで全ての環境が整いました。では R 言語と導入したライブラリを使って動かす、以下の様な Python スクリプトを用意して実行してみます(なお、この Python スクリプトはここで紹介されているものです):
# -*- coding:utf-8 -*-

import numpy
import pandas
import pylab
import pyper

n = 200
# データの生成
score_x = numpy.random.normal(171.77, 5.54, n)
score_y = numpy.random.normal(62.49, 7.89, n)

score_x.sort()
score_x = numpy.around(score_x + numpy.random.normal(scale=3.0, size=n), 2)
score_y.sort()
score_y = numpy.around(score_y + numpy.random.normal(size=n), 2)

# 散布図を描く
pylab.scatter(score_x, score_y, marker='.', linewidths=0)
pylab.grid(True)
pylab.xlabel('X')
pylab.ylabel('Y')

# Rで回帰分析
df = {'X': score_x, 'Y': score_y}
df = pandas.DataFrame(df)

r = pyper.R(use_pandas='True')

# Rへデータ渡す
r.assign('df', df)

# Rのコマンド実行
print(r("summary(df)"))
r("result <- lm(Y~X, data=df)")
print(r("summary(result)"))

#予測区間と信頼区間を算出するため
new_x = numpy.arange(155, 190, 0.1)
new_df = pandas.DataFrame({'X': new_x})
r.assign('new', new_df)

# 予測区間(R)
r("prediction <- predict(result, new, interval='prediction')")
# 信頼区間(R)
r("confidence <- predict(result, new, interval='confidence')")

# Python側にとってくる
lm_result = r.get('result$fitted.values')
prediction = pandas.DataFrame(r.get('prediction'))
confidence = pandas.DataFrame(r.get('confidence'))

# 回帰直線, 予測区間, 信頼区間を描く
pylab.plot(score_x, lm_result, 'r', linewidth=2)

pylab.plot(new_x, prediction[1], 'g', linewidth=1)
pylab.plot(new_x, prediction[2], 'g', linewidth=1)

pylab.plot(new_x, confidence[1], 'c', linewidth=1)
pylab.plot(new_x, confidence[2], 'c', linewidth=1)

pylab.show()

この内容を例えば python01.py という名前で保存し、python で実行すると以下の青字部分のような出力が確認できます:
# python3 python01.py

try({summary(df)})
       X               Y
 Min.   :153.2   Min.   :41.81
 1st Qu.:167.1   1st Qu.:57.49
 Median :171.3   Median :63.45
 Mean   :171.4   Mean   :63.28
 3rd Qu.:176.3   3rd Qu.:68.39
 Max.   :186.8   Max.   :80.02

try({summary(result)})

Call:
lm(formula = Y ~ X, data = df)

Residuals:
   Min     1Q Median     3Q    Max
-8.389 -2.431 -0.233  2.405 10.974

Coefficients:
              Estimate Std. Error t value Pr(>|t|)
(Intercept) -106.42882    6.72661  -15.82   <2e-16 ***
X              0.99004    0.03921   25.25   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Residual standard error: 3.67 on 198 degrees of freedom
Multiple R-squared:  0.763,     Adjusted R-squared:  0.7618
F-statistic: 637.5 on 1 and 198 DF,  p-value: < 2.2e-16

Python スクリプト内で指定されている PypeR や Pylab などのライブラリが正しく読み込まれて実行することができました。

(参考)
https://gist.github.com/mia-0032/6378324

マルチスレッド&マルチコア&オンメモリで超ハイパフォーマンス NoSQL 型データベース、と言われている Aerospike をインストールしてみました:
2016081000


Aerospike は Docker や Vagrant のイメージが配布されていたり、AWS や GCE の仮想イメージが配布されていたりするので、これらを使うと「インストール」という作業を行わなくてもそのまま使えちゃいます(現にそのイメージを使う解説サイトも目立ちます)。が、今回はオンプレミスや普通の(?)仮想マシンでも使えるように、サーバーソフトの導入手順を紹介します。例によって CentOS 6.x が対象です。

まず Aerospike の動作には Python (2.6+)、Python ライブラリ、そして gcc が必要になります。これらの前提ライブラリをまとめてインストールしておきます:
# yum install gcc python python-devel

改めて、ここから Aerospike の環境を揃えていきます。今回は無料版であるコミュニティエディションのサーバーノード1つと、AMC(Aerospike Management Console 管理コンソール)1つを1台のマシンに導入する手順を紹介します。

まずサーバーノードを導入します。以下のサイトから対象の環境(今回は CentOS 6 なので、互換性のある RedHat 6)を選んで最新版をダウンロードします:
http://www.aerospike.com/download/server/

2016081003


2016/Aug/10 時点では最新バージョンは 3.9.0.3 でした。ダウンロードできるのは tgz ファイルなので、このアーカイブを展開し、インストーラー(asinstall)を実行してインストールします:
# cd /tmp
# tar xzvf ~/aerospike-server-community-3.9.0.3-el6.tgz
# cd aerospike-server-community-3.9.0.3-el6
# ./asinstall

インストールが成功したら以下のコマンドでサーバーとして起動し、またシステム再起動時に自動起動するよう設定しておきます:
# /etc/init.d/aerospike start
# chkconfig aerospike on

これでサーバーノードがこの環境にインストールできました。次にこのサーバーノードを管理するコンソール機能を導入します。

同様にして、以下のサイトから対象の環境を選んで AMC の最新版をダウンロードします。ちなみに AMC は RedHat 6(CentOS 6) 用のものしか用意されておらず、7.x のものは配布されていませんでした:

http://www.aerospike.com/download/amc/

2016081001


こちらの場合は rpm パッケージファイルがダウンロードできるので、RPM コマンドでそのまま導入します:
# rpm -ivh aerospike-amc-community-3.6.10.1-el6.x86_64.rpm

やはり同様に AMC を起動して、次回再起動時に自動起動するよう設定しておきます:
# /etc/init.d/amc start
# chkconfig amc on

これで導入作業は完了です。試しに一度管理コンソールを見てみましょう。ウェブブラウザを起動して、
 http://(導入先のマシン名):8081/
にアクセスしてみましょう:

2016081002


すると最初の1回は上記のような画面になり、AMC で管理するサーバーノードを指定するよう指示されます。今回は AMC と同じマシンにサーバーノードを導入しているので、同じアドレスか localhost を指定します。ポート番号は特に変更していない限り 3000 のままで大丈夫です:

成功すると AMC の管理画面が現れます:
2016081004


とりあえず1ノード環境ですがこれで動いちゃいました。Aerospike はノードを追加すればリニアにスケールするよう設計されているので、足りなくなったらサーバーノードを追加準備して、この AMC に追加すれば使えちゃいます。データの増減が大きいシステムに非常に向いていると言えます。




Perl ベースのウェブフレームワークである Mojolicious というものが出ていることを知りました。昔は CGI といえば Perl だったよなあ・・・と懐かしい想いにふけりつつ、 CentOS (6) 環境に Perl と Mojolicious を導入して、使ってみます。
2016080501



Mojolicious は Perl のパッケージマネージャーである CPANM を使って導入します。その CPANM や Perl の比較的新しいバージョンを使おうとすると perlbrew 経由で導入するのが楽なので、まずは perlbrew を導入します:
# curl -L http://install.perlbrew.pl | bash
# echo "source ~/perl5/perlbrew/etc/bashrc" >> ~/.bash_profile

シェルを起動しなおした後に、導入した perlbrew を使って Perl (以下の例では 5.20.2)をインストールします:
# perlbrew install perl-5.20.2

導入した Perl( 5.20.2 ) を有効にして、バージョンを確認します:
# perlbrew switch perl-5.20.2
# perl -v

This is perl 5, version 20, subversion 2 (v5.20.2) built for x86_64-linux
(with 1 registered patch, see perl -V for more detail)

Copyright 1987-2015, Larry Wall
  :
  :

目的の Perl がインストールできたことが確認できました。次に perlbrew を使って CPANM をインストールします:
# perlbrew install-cpanm

導入した CPANM を使って Mojolicious をインストールして、バージョン(と動作)を確認します:
# cpanm Mojolicious
# mojo version
CORE
  Perl        (v5.20.2, linux)
  Mojolicious (7.01, Doughnut)

OPTIONAL
  EV 4.0+                 (n/a)
  IO::Socket::Socks 0.64+ (n/a)
  IO::Socket::SSL 1.94+   (n/a)
  Net::DNS::Native 0.15+  (n/a)

This version is up to date, have fun!

ここまでの作業で Mojolicious がインストールできました。では以下の内容で Perl のウェブアプリを作ります(webapp.pl という名前で保存します):
use Mojolicious::Lite;

get '/' => sub {
  my $self = shift;

  $self->render(text => 'ハローワールド!');
};

app->start;

以下のコマンドで作成したアプリを起動します:
# morbo webapp.pl
Server available at http://127.0.0.1:3000

3000 番ポートで HTTP サーバーが起動している、というメッセージが表示されます。ウェブブラウザでこのサーバーの 3000 番ポートにアクセスして「ハローワールド!」が表示されることを確認します:

2016080502


動作も確認できました。


このページのトップヘ