2019-06-30

R Shiny を使ってみる (6)

Shiny は R のパッケージの一つで、 このパッケージを使うと R を用いて対話的に操作する Web アプリケーションを作成することができます。Web 上のユーザーインタフェース部分を司る ui.R と、内部動作を司る server.R の二つの R 言語スクリプトで、サーバーサイドのコンテンツを作成できることが大きな特徴です。

参考サイト [1] より引用

今回は、Shiny Server をインストールして LAN 内の他の PC のインターネットブラウザから Shiny のアプリケーションにアクセスできるようにしました。

本記事で使用している動作環境は次の通りです。

使用している環境 
$ lsb_release -d
Description: CentOS Linux release 7.6.1810 (Core) 
$ rpm -qa | grep "R-core"
R-core-devel-3.6.0-1.el7.x86_64
R-core-3.6.0-1.el7.x86_64
$ rpm -q shiny-server
shiny-server-1.5.9.923-1.x86_64
$ rpm -q rstudio-server
rstudio-server-1.2.1335-1.x86_64
$ 

Shiny Server のインストール

Shiny Server のインストールは、参考サイト [2] の 'RedHat / CentOS 6&7' タブの手順に従って進めれば良いのですが、ルート権限で R の shiny パッケージをインストールする際に、あとでインストールすることになるであろう rmarkdown も一緒にインストールしてしまいます。

Shiny Server をインストールする前の準備 
$ sudo su - -c "R -e \"install.packages('shiny', repos='https://cran.rstudio.com/')\""
  ...
(途中省略)
  ...
$ sudo su - -c "R -e \"install.packages('rmarkdown', repos='https://cran.rstudio.com/')\""
  ...
(途中省略)
  ...
$ 

参考サイト [2] に従って、wget コマンドでパッケージをダウンロードして yum コマンドでインストールします。この時の Shiny Server のバージョンは 1.5.9.923 でしたが、ダウンロードするときにバージョンが更新されている可能がありますので、その都度、参考サイト [2] をご確認ください。

Shiny Server のダウンロードとインストール 
$ wget https://download3.rstudio.org/centos6.3/x86_64/shiny-server-1.5.9.923-x86_64.rpm

$ sudo yum install --nogpgcheck shiny-server-1.5.9.923-x86_64.rpm

Shiny Server はデフォルトでポート 3838 番を使うようになっていますので、ファイアウォールを通るように設定します。

ファイアウォールの設定 
$ sudo firewall-cmd --add-port=3838/tcp --permanent
success
$ sudo systemctl restart firewalld
$

早速、他の PC から、Shiny Server をインストールしたサーバー (192.168.0.22) へアクセスしてみます。ブラウザへ入力する URL は http://192.168.0.22:3838/ のようにします。Shiny Server のトップページは下記のようになっています。右側に簡単なサンプルが示されていて、インタラクティブに操作ができます。

 Shiny Server のトップページ 

Shiny アプリのデプロイ

Shiny Server のトップページで表示されるファイルは /srv/shiny-server 内に配置されています。よく見てみると、Shiny Server がインストールされている /opt/shiny-server/ の中からシンボリックリンクされています。

Shiny Server アプリケーションのデプロイ先 
$ ls /srv/shiny-server
index.html  sample-apps
$ ll /srv/shiny-server
合計 0
lrwxrwxrwx. 1 root root 38  6月 29 21:25 index.html -> /opt/shiny-server/samples/welcome.html
lrwxrwxrwx. 1 root root 37  6月 29 21:25 sample-apps -> /opt/shiny-server/samples/sample-apps
$ 

RStudio の Server 版も Shiny Server と同じサーバーで利用できるのであれば、個別アカウントで RStidio にログインして、そこで Shiny の Web アプリを開発し、最終的にシンボリックリンクを張ってブラウザで動作確認ができます [3][4]。RStudio の Server 版を利用していなければ、個別に Shiny アプリを開発後、Shiny Server をインストールしてあるサーバーの /srv/shiny-server 内にフォルダーごとコピーします。

ここでは以前 Shiny の紹介記事で扱ったサンプル用の Web アプリ iris-explorer(参考サイト [5])をデプロイしてみます。このサンプルは、Fedora 上の RStudio で作成したのですが、Shiny Server をインストールした CentOS 7 のサーバーへ移しました (/home/bitwalk/shiny-app/iris-explorer)。

RStudio で /home/bitwalk/shiny-app/iris-explorer 内のファイル global.R, server.R, ui.R のいずれか、あるいは全てのファイルを読み込みます。

RStudio のエディタペイン右上に表示されている「  Run App 」をクリックします。下記のように RStudio のブラウザのウィンドウがあらわれて iris-explorer が実行されます。

 RStudio 上で実行した iris-explorer 

動作確認出来たので、Shiny Server へデプロイします。と言っても、シンボリックリンクを張るだけです。

iris-explorer のデプロイ 
$ sudo ln -s /home/bitwalk/shiny-app/iris-explorer /srv/shiny-server/iris-explorer
[sudo] bitwalk のパスワード:
$

Shiny Server で動作確認をする前に、パッケージがインストールされるグローバルな領域に、使用するパッケージをインストールしておきます。この例では shinydashboardggplot2 をインストールしました。

グローバルな領域へのパッケージインストール 
$ sudo su - -c "R -e \"install.packages('shinydashboard', repos='https://cran.rstudio.com/')\""
  ...
(途中省略)
  ...
$ sudo su - -c "R -e \"install.packages('ggplot2', repos='https://cran.rstudio.com/')\""
  ...
(途中省略)
  ...
$

他の PC でインターネットブラウザを起動、http://192.168.0.22:3838/iris-explorer/ にアクセスして、iris-explorer が実行されることを確認します。

 デプロイした iris-explorer の実行例 

Shiny Server のログ

エラーや期待したどおりに動作しない場合、まず、サーバーログを確認しましょう。ログは /var/log/shiny-server/ にあります。ルート権限で内容を確認できます。

Shiny Server のログ 
$ ls /var/log/shiny-server
iris-explorer-shiny-20190630-173444-41788.log  rmd-shiny-20190630-094622-43528.log
rmd-shiny-20190630-091930-37985.log            rmd-shiny-20190630-094741-44562.log
rmd-shiny-20190630-094602-42135.log
$ tail /var/log/shiny-server/iris-explorer-shiny-20190630-173444-41788.log
tail: `/var/log/shiny-server/iris-explorer-shiny-20190630-173444-41788.log' を 読み込み用に開くことが出来ません: 許可がありません
$ sudo tail /var/log/shiny-server/iris-explorer-shiny-20190630-173444-41788.log
[sudo] bitwalk のパスワード:
su: ignore --preserve-environment, it's mutually exclusive to --login.

Attaching package: ‘shinydashboard’

The following object is masked from ‘package:graphics’:

    box


Listening on http://127.0.0.1:41788
$ 

Shiny Server のより詳細な情報は、参考サイト [6] を参照してください。

参考 サイト

  1. Shiny - RjpWiki
  2. Download Shiny Server - RStudio
  3. Download RStudio - RStudio
  4. bitWalk's: RStudio Server と SELinux (Fedora) [2019-08-10]
  5. bitWalk's: R Shiny を使ってみる (5) [2018-09-30]
  6. Shiny Server Configuration Reference

 

ブログランキング・にほんブログ村へにほんブログ村

2019-06-24

Apache Rivet 3.1.1

Apache Rivet は Apache HTTP Server のモジュールで、PHP のようにサーバ・サイドで動的な Web ページを作成できる Tcl システムです[1]。現バージョンの Rivet 3.x 系は Apache 2.2.x と 2.4.x に対応しています。Tcl はバージョン 8.6 以上が推奨されています。

しばらく Rivet の RPM パッケージを更新していませんでしたが、Rivet の方は着々と更新を重ねてバージョン 3 系 (3.1.1) になっていました。気が付いた時に RPM パッケージを更新しないと、と思い立ち、Fedora 30 向けに更新した RPM パッケージを公開しました[2]。Rivet 3.1 は Tcl 8.5.10 以上が必要ですが、RPM パッケージを作成するときに 8.5 と 8.6 の場合分けが面倒だったので依存パッケージで Tcl 8.6 以上必要としてしまいました。ご了承下さい。

※ Tcl のバージョンに対応したものに差し替えました。 mod_rivet-3.1.1-2.fc30.x86_64.rpm [2019-07-01]

参考サイト [3] で紹介されているカレンダーを表示するサンプルを紹介します。実行には Tcl の他に Incr Tcl (itcl) がインストールされている必要があります。

カレンダーを表示するサンプル 
<? set hello_message "Calendar" ?>
<html>
  <head>
    <title><? puts $hello_message ?></title>
  </head>
  <body><?
package require Calendar

proc ::cal_cell_attributes {day month year weekday} {
    if {$weekday == 3} {
        return [list class curr_wkday]
    }
}

set htmlc [HtmlCalendar #auto]
set html_txt [$htmlc emit \
        -container {table class calendar} \
        -current_weekday 3 \
        -cell_function cal_cell_attributes]
puts $html_txt
?></body>
</html>

これを calendar.rvt というように、拡張子 rvt のついたファイル名で保存し、保存したファイルを Web サーバー (Apache) からブラウザで読み込むと以下のようになります。


参考 サイト

  1. Rivet - Webscripting for Tcl'ers
  2. Apache Rivet RPM Wiki - OSDN
  3. Examples and Usage

 

ブログランキング・にほんブログ村へにほんブログ村

2019-06-23

【備忘録】pip-review で一括アップデート

Python パッケージは pip install package -U でアップデートしますが、このやり方だとインストールされているパッケージ全てに適用したい場合に面倒です。pip-review を利用すればインストールされているパッケージを調べて、必要なアップデートをしてくれます。備忘録のために使い方の一部をまとめました。

pip で pip-review をインストール 
$ pip install pip-review
アップデートがあるパッケージを表示 
$ pip-review
tornado==6.0.3 is available (you have 6.0.2)
$

たまたまアップデートできるパッケージはひとつしかありませんでしたが、pip-review --auto でアップデートします。

アップデートがあるパッケージをまとめて更新する 
$ pip-review --auto
Collecting tornado==6.0.3
  Downloading https://files.pythonhosted.org/packages/30/78/2d2823598496127b21423baffaa186b668f73cd91887fcef78b6eade136b/tornado-6.0.3.tar.gz (482kB)
     |████████████████████████████████| 491kB 3.2MB/s 
Installing collected packages: tornado
  Found existing installation: tornado 6.0.2
    Uninstalling tornado-6.0.2:
      Successfully uninstalled tornado-6.0.2
  Running setup.py install for tornado ... done
Successfully installed tornado-6.0.3
$

参考 サイト

  1. pip-review · PyPI

 

ブログランキング・にほんブログ村へにほんブログ村

2019-06-16

待ち遠しい CentOS 8

CentOS は、Red Hat Enterprise Linux (RHEL) と機能的に互換性があることを目指したフリーの Linux ディストリビューションです。ターゲットは RHEL と同様に企業のサーバやデスクトップ環境の構築としています。また、ライセンス費用が無償であるにもかかわらず、非常に長いサポート期間のあることが特徴です。

Wikipedia より抜粋、修正

10 年の製品ライフサイクル

普段は Fedora を使っていますが、これは RHEL に関わる開発の検証に使う実験的な位置づけにあるため、毎週のようにやってくるパッケージのアップデートや、おおむね半年ごとにやってくるシステムアップグレードなど、変化の激しいディストリビューションです。それでも長年使っているので変化に慣れっこになってしまっていますが、何かちょっとしたシステムを作ろうとしたときにベースの OS とするには不向きだと感じています。

それに比べ、RHEL の製品ライフサイクルは 10 年です。2019 年 5 月 7 日に出荷開始された RHEL 8 は、2029 年 5 月までサポートされることがアナウンスされています。10 年のサポート期間中、半年毎にマイナーリリースがされて、バグやセキュリティ問題の改善が行われます。RHEL の互換ディストリビューションである CentOS も当然これに追従するでしょう。

CentOS 8 は今、リリースに向けて RHEL 8 に含まれる商標や商用パッケージ等を除去したものをリビルドしています。まだ具体的なリリース期日のアナウンスが出ていませんが、それほど遠くない時期にリリースされるものと思われます。

毎日のように参考サイト [3] をチェックしているのですが、もしかすると進捗を更新する暇もないのでしょうか、こまめに状況が反映されているようには見えません。突然 RC (Release Candidate) 版の公開が発表されるような気がしますが、そうだとしても待ち遠しいです。

CentOS の個人的なニーズ

2014 年 7 月 に現行の CentOS 7 がリリースされた時には、リファレンス機にしようとメインのデスクトップ PC を Fedora から CentOS 7 へ乗り換えましたが [4]、長続きせずに Fedora へ戻ってしまいました。今回は Web サーバをデスクトップ機 (Fedora) とは別に用意して、Web アプリケーションをデプロイして動作確認する実証機に使いたいと考えています。

RHEL を購入するという選択肢

Slackware 2 の頃から始まった Linux とのお付き合いは、Red Hat Linux 3.0.3 へ移り、その後 2003 年 11 月に Red Hat Linux が Fedora Core 1 へ移行するまでは、コンピュータ専門店や家電量販店の片隅に置かれている Red Hat Linux のパッケージを購入することで続いていました。当時は、無料 OS と言えど家庭のネットワーク環境(特に通信速度)がそれほど良くなかったので、メジャーバージョンのリリース時、インストールメディアを有料で購入することにそれほどの抵抗はありませんでした。当時は Microsoft Windows も併用していましたので、考えてみると OS を使うために結構な出費をしていたことになります。💦

ネットワーク環境は格段に良くなり、Linux にまつわるビジネスモデルも変わりました。Red Hat Linux から Red Hat Enterprise Linux に移行した時に Red Hat 社が採用したサブスクリプション方式のビジネスモデルは成功をおさめ、今や IBM 傘下に入りました。

RHEL は業務で扱ったことがあるので、その時に購入した RHEL のサブスクリプションの管理もしています。あらためて、個人で RHEL のサブスクリプションを購入した場合の費用を参考サイト [5] で確認したところ、ニーズに合わせて条件を適切に選べば、意外にもそれほど高価でないことが判りました。もしかして、無料の CentOS にそれほど固執する必要がないかもと、少し心が揺れています。

参考 サイト

  1. Red Hat Enterprise Linux 8 リリース! - 赤帽エンジニアブログ [2019-05-08]
  2. Red Hat Enterprise Linux 8 ご紹介 - Speaker Deck [2019-06-04]
  3. About/Building 8 - CentOS Wiki
  4. bitWalk's: 【備忘録】CentOS 7 移行時のメモ [2014-07-21]
  5. Buy Red Hat Enterprise Linux subscriptions

 

ブログランキング・にほんブログ村へにほんブログ村

2019-06-08

【備忘録】httpd 設定のおぼえがき 〜 初期設定 〜

CentOS をほとんど使っていない古い PC にクリーンインストールして、家庭内 LAN で Web サーバーに使おうとしています。Apache HTTP Server との付き合いはとても長いのですが、使いはじめの設定は毎日するようなものではないので、その場限りの設定をしてしまっています。そのため、同じような設定を別のサーバーにするときにはいつも調べ直しています😅。

少しでも調べ直す無駄をなくすために備忘録として残すことにしました。ということで、今回のテーマは次のとおりです。

家庭内 LAN の Web サーバー用 PC に Web 関連パッケージをインストールして、必要な設定を加えてサーバーの各ユーザーアカウント内で Web コンテンツの作成をできるようにします。

使用した OS は前述のとおり、CentOS です。

OS
CentOS 7.6-1810

Web サーバー関連パッケージのインストール

CentOS は、ダウンロードした CentOS-7-x86_64-LiveGNOME-1810.isoFedora Media Writer で USB メモリに焼いてインストールしたのですが、通常のインストールでは Web サーバーに必要な Apache HTTP Server などのパッケージがインストールされません。下記のようにして関連パッケージをインストールしました。

Web サーバーに必要な基本的なパッケージをインストール 
$ sudo yum group install "ベーシック Web サーバー"

サービスの起動

Apache HTTP Server のサービス、httpd を起動 (start) します。また、OS 起動後にサービスが使えるように有効化 (enable) しておきます。

httpd の起動 
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
$ sudo systemctl status httpd
 httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 土 2019-06-08 10:09:02 JST; 38s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 7250 (httpd)
   Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─7250 /usr/sbin/httpd -DFOREGROUND
           ├─7254 /usr/sbin/httpd -DFOREGROUND
           ├─7255 /usr/sbin/httpd -DFOREGROUND
           ├─7256 /usr/sbin/httpd -DFOREGROUND
           ├─7257 /usr/sbin/httpd -DFOREGROUND
           ├─7258 /usr/sbin/httpd -DFOREGROUND
           └─7259 /usr/sbin/httpd -DFOREGROUND

 6月 08 10:09:01 localhost.localdomain systemd[1]: Starting The Apache HTTP ...
 6月 08 10:09:02 localhost.localdomain systemd[1]: Started The Apache HTTP S...
Hint: Some lines were ellipsized, use -l to show in full.
$ 

ファイアーウォールの設定

HTTP で使用する 80 番のポートを解放し、HTTP で通信できるようにサービスを追加後、ファイアーウォールのサービスを再起動して反映させます。

ファイアーウォールの設定 
$ sudo firewall-cmd --add-port=80/tcp --permanent
success
$ sudo firewall-cmd --add-service=http --permanent
success
$ sudo systemctl restart firewalld
$ 

LAN 内の他の PC のブラウザからこの CentOS (192.168.0.12) へアクセスして、トップページが表示されることを確認します。

 他の PC のブラウザからアクセスした例 

ユーザ毎のウェブディレクトリ

ユーザアカウント内の public_html 内をウェブサイトとして利用できるように /etc/httpd/conf.d/userdir.conf を編集します。下記にコメントを除いた設定ファイルの内容と、変更した箇所を赤字で示しました。

/etc/httpd/conf.d/userdir.conf の設定 
<IfModule mod_userdir.c>
    #UserDir disabled
    UserDir public_html
</IfModule>

<Directory "/home/*/public_html">
    AllowOverride FileInfo AuthConfig Limit Indexes
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
    Require method GET POST OPTIONS
</Directory>

ユーザアカウント内に public_html ディレクトリを作成します。この例ではユーザアカウントは bitwalk のみです。パーミッションは下記のようになっています。

ユーザアカウントのディレクトリとパーミッション 
$ cd ~
$ mkdir public_html
$ chmod 755 /home/bitwalk
$ ll -d /home/bitwalk
drwxr-xr-x. 17 bitwalk bitwalk 4096  6月  8 08:32 /home/bitwalk
$ ll -d /home/bitwalk/public_html
drwxrwxr-x. 2 bitwalk bitwalk 41  6月  8 08:32 /home/bitwalk/public_html
$ 

httpd を再起動します。

httpd の再起動 
$ sudo systemctl restart httpd

SELinux の設定

最後に SELinux で httpd_enable_homedirs を有効にします。

SELinux で httpd_enable_homedirs を有効にする 
$ sudo setsebool -P httpd_enable_homedirs 1

簡単な Web ページで確認

LAN 内の他の PC から、下記のサイトがアクセスできることを確認します。事前に index.htmltest.html を用意して /home/bitwalk/public_html/ に保存おきました。

http://192.168.0.12/~bitwalk/
 二つのテストページで確認 

まとめ

最低限の設定ですが、これで初期の目標を達成できました。今後も httpd に関わる設定について、何回も設定する場面が予想されるものについては備忘録でまとめて行く予定です。

また、まもなくリリースされるであろう CentOS 8 でも同じような確認をしていこうと考えています。

参考 サイト

  1. centos7でwebサーバー構築1-基礎的なシステムの構築 - Qiita [2018-12-27]

 

ブログランキング・にほんブログ村へにほんブログ村