Rstudio Serverの設定で分からなかったことのメモ


Rstudio ServerをRHEL9環境にインストールした際に悩んだことのメモ

その1: 新規作成プロジェクトでのpythonパスを指定したい

ユーザのホームディレクトリに「.Renviron」というファイルを作って 環境変数 RETICULATE_PYTHON を定義する。

RETICULATE_PYTHON="/usr/local/python3/bin/python"

なお、今回は~/.Renviron ファイルを使ったが、「Managing R with .Rprofile, .Renviron, Rprofile.site, Renviron.site, rsession.conf, and repos.conf」の記述を見ると、いろいろある。

システム全体の設定としては $R_HOME/etc/Renviron がある。

検証環境の場合 /opt/R/4.1.3/lib/R/etc/Renviron にあった

### etc/Renviron.  Generated from Renviron.in by configure.
###
### ${R_HOME}/etc/Renviron
###
### Record R system environment variables.

## As from R 4.0.0 the C code reading this follows the POSIX rules
## for parameter substitution in shells, section 2.6.2 of
## https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18
## In earlier versions ${FOO-bar} was interpreted the same as ${FOO:-bar}

R_PLATFORM=${R_PLATFORM-'x86_64-pc-linux-gnu'}
## Default printer paper size: first record if user set R_PAPERSIZE
R_PAPERSIZE_USER=${R_PAPERSIZE}
R_PAPERSIZE=${R_PAPERSIZE-'letter'}
## Default print command
R_PRINTCMD=${R_PRINTCMD-'/usr/bin/lpr'}
# for Rd2pdf, reference manual
R_RD4PDF=${R_RD4PDF-'times,hyper'}
## used for options("texi2dvi")
R_TEXI2DVICMD=${R_TEXI2DVICMD-${TEXI2DVI-'/usr/bin/texi2dvi'}}
## used by untar(support_old_tars = TRUE) and installing grDevices
R_GZIPCMD=${R_GZIPCMD-'/usr/bin/gzip'}
## Default zip/unzip commands
R_UNZIPCMD=${R_UNZIPCMD-'/usr/bin/unzip'}
R_ZIPCMD=${R_ZIPCMD-'/usr/bin/zip'}
R_BZIPCMD=${R_BZIPCMD-'/usr/bin/bzip2'}
## Default browser
R_BROWSER=${R_BROWSER-'xdg-open'}
## Default editor
EDITOR=${EDITOR-${VISUAL-vi}}
## Default pager
PAGER=${PAGER-'/usr/bin/less'}
## Default PDF viewer
R_PDFVIEWER=${R_PDFVIEWER-''}
## Used by libtool
LN_S='ln -s'
MAKE=${MAKE-'make'}
## Prefer a POSIX-compliant sed on e.g. Solaris
SED=${SED-'/usr/bin/sed'}
## Prefer a tar that can automagically read compressed archives
TAR=${TAR-'/usr/bin/gtar'}

## System and compiler types.
R_SYSTEM_ABI='linux,gcc,gxx,gfortran,gfortran'

## Strip shared objects and static libraries.
R_STRIP_SHARED_LIB=${R_STRIP_SHARED_LIB-'strip --strip-unneeded'}
R_STRIP_STATIC_LIB=${R_STRIP_STATIC_LIB-'strip --strip-debug'}

R_LIBS_USER=${R_LIBS_USER-'~/R/x86_64-pc-linux-gnu-library/4.1'}
#R_LIBS_USER=${R_LIBS_USER-'~/Library/R//4.1/library'}

### Local Variables: ***
### mode: sh ***
### sh-indentation: 2 ***
### End: ***

しかし、これを直接編集はしてはいけない。

/opt/R/4.1.3/lib/R/etc/Renviron.site というファイルを新規で作成し、 「RETICULATE_PYTHON=”/usr/local/python3/bin/python”」とか書くことで全体適用となる。

これは、/opt/R/4.1.3/lib/R/etc/Renviron の方は、Rのバージョンアップで設定値が変わる可能性があるので、特有の設定はファイルを分離しておく、というものになっている。

その2: アクセスログ

Rstudio ServerのWeb UIから誰がログインしたのか、というログがどこに出るのか?

どうやら、Pro版のみの機能の模様で、 /etc/rstudio/rserver.conf に「server-access-log=1」と設定するようだが、ライセンスがないと、この設定が入っているとRstudio serverが起動しない。

わざとパスワードを間違えたりすると /var/log/secure にログがでるので、/etc/pam.d/rstudio の内容を/etc/pam.d/sshd と同じにすれば、rstudioでログインに成功した場合でも同じようにログイン成功時もログ出力があるかと思ったのですが、出力されず。

・・・ただ、pamtesterコマンドで動作検証してみたところ、rstudioでもsshdでもログイン成功時に出力していない・・・もしかしてsshでログイン成功した時に/var/log/secureに出力しているのはpamd経由ではない??

rstudioでパスワード間違え

[root@rhel9 rstudio]# pamtester -v rstudio testuser authenticate
pamtester: invoking pam_start(rstudio, testuser, ...)
pamtester: performing operation - authenticate
Password:
pamtester: Authentication failure
[root@rhel9 rstudio]#

/var/log/secureの出力内容

Apr  5 17:50:51 rhel9 unix_chkpwd[41719]: password check failed for user (testuser)
Apr  5 17:50:51 rhel9 pamtester[41717]: pam_unix(rstudio:auth): authentication failure; logname=root uid=0 euid=0 tty= ruser= rhost=  user=testuser

rstudioでパスワード正しく

[root@rhel9 rstudio]# pamtester -v rstudio testuser authenticate
pamtester: invoking pam_start(rstudio, testuser, ...)
pamtester: performing operation - authenticate
Password:
pamtester: successfully authenticated
[root@rhel9 rstudio]#

/var/log/secureへの出力は無い

sshdでパスワード誤り

[root@rhel9 rstudio]# pamtester -v sshd testuser authenticate
pamtester: invoking pam_start(sshd, testuser, ...)
pamtester: performing operation - authenticate
Password:
pamtester: Authentication failure
[root@rhel9 rstudio]#

/var/log/secureへ出力あり

Apr  5 17:51:09 rhel9 unix_chkpwd[41726]: password check failed for user (testuser)
Apr  5 17:51:09 rhel9 pamtester[41724]: pam_unix(sshd:auth): authentication failure; logname=root uid=0 euid=0 tty= ruser= rhost=  user=testuser

sshdでパスワード正しく

[root@rhel9 rstudio]# pamtester -v sshd testuser authenticate
pamtester: invoking pam_start(sshd, testuser, ...)
pamtester: performing operation - authenticate
Password:
pamtester: successfully authenticated
[root@rhel9 rstudio]#

/var/log/secureに出力無し

Rstudio Serverの動作確認で使ったRとpythonのサンプル


Rstudio Serverの動作確認で使用したRとpythonのサンプルをメモとして残しておく

Rを実行したマシンのスペック確認

# https://www.karada-good.net/analyticsr/r-330/
#パッケージのインストール
# RHEL9+renv環境だとdevtoolsのインストールで失敗した
install.packages("rlang")
install.packages("devtools")
devtools::install_github("csgillespie/benchmarkme")
#パッケージの読み込み
library("benchmarkme")

#全てのベンチマークを実行:benchmark_stdコマンド
#各ベンチマークの詳細はヘルプを参照
res <- benchmark_std()
#結果をプロット
plot(res)

#CPU情報の取得:get_cpuコマンド
get_cpu()

#使用環境情報の取得:get_platform_infoコマンド
get_platform_info()

#使用中のRの情報を取得:get_r_versionコマンド
get_r_version()


#システム情報に関する全コマンドを実施:get_sys_detailsコマンド
#Sys.info(),get_platform_info(),get_r_version(),get_ram(),get_cpu()
#get_byte_compiler(),get_linear_algebra(),installed.packages(),実行時間のコマン ドを実施
#表示が多いので省略
get_sys_details()

Rでgrid描画のテスト

#http://www.okadajp.org/RWiki/?grid+%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E4%BA%8B%E5%A7%8B

library(grid)

grid.multipanel(vp=viewport(0.5, 0.5, 0.8, 0.8))  # デモ(1)
grid.plot.and.legend()                            # デモ(2)
grid.plot.and.legend                              # 関数定義

grid.newpage()
#grid.arrows(x = c(0.25, 0.75), y = 0.5)
grid.circle(x=0.5, y=0.5, r=0.5)
grid.frame(name=NULL, gp=gpar(), vp=NULL)
grid.grill(h = seq(0.25, 0.75, 0.25), v = seq(0.25, 0.75, 0.25))

grid.lines(x = c(0.25, 0.75), y = 0.5)
grid.line.to(x=1, y=1)

grid.polygon(x=c(0, 0.5, 1, 0.5), y=c(0.5, 1, 0.5, 0))
grid.rect(x = 0.5, y = 0.5, width = 0.7, height = 0.3)
grid.segments(x0 = 0, y0 = 0, x1 = 0.5, y1 = 0.5)
grid.text(label="abc", x = 0.5, y = 0.5)
grid.text(label="g実験g", x = 0.8, y = 0.5)
grid.xaxis(at = NULL, label = T, main = T, name = NULL)
grid.yaxis(at = NULL, label = T, main = T, name = NULL)

pythonとtensorflow/cudaのサンプル

import tensorflow as tf
import torch
torch.cuda.is_available()

mnist = tf.keras.datasets.mnist

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(512, activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation=tf.nn.softmax)
])
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

rstanのサンプル

# http://www.psy.ritsumei.ac.jp/~hoshino/Wsl/

install.packages("rstan")
install.packages("cmdstanr", repos = c("https://mc-stan.org/r-packages/", getOption("repos")))
library(cmdstanr)
install_cmdstan()

# https://estuarine.jp/2018/01/install-rstan/
# https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-(Japanese)
library(rstan)
options(mc.cores = parallel::detectCores())
rstan_options(auto_write = TRUE)

# 例 1: Eight Schools
schools_dat <- list(J = 8,
                    y = c(28,  8, -3,  7, -1,  1, 18, 12),
                    sigma = c(15, 10, 16, 11,  9, 11, 10, 18))
fit <- stan(file = 'rstan-sample-input.stan', data = schools_dat)
# ↑ の処理は時間がかかる
print(fit)
plot(fit)
pairs(fit, pars = c("mu", "tau", "lp__"))

la <- extract(fit, permuted = TRUE) # arraysのlistを返す
mu <- la$mu

### iterations, chains, parametersの3次元arrayを返す
a <- extract(fit, permuted = FALSE)

### stanfitオブジェクトにS3関数を使う
a2 <- as.array(fit)
m <- as.matrix(fit)
d <- as.data.frame(fit)

上記サンプル用のデータファイル rstan-sample-input.stan

data {
  int<lower=0> J;         // 学校の数
  real y[J];              // 推定されている教育の効果
  real<lower=0> sigma[J]; // 教育の効果の標準誤差
}

parameters {
  real mu;                // 処置の効果(全体平均)
  real<lower=0> tau;      // 処置の効果の標準偏差
  vector[J] eta;          // 学校ごとのスケール前のバラつき
}

transformed parameters {
  vector[J] theta = mu + tau * eta;        // 学校ごとの処置の効果
}

model {
  target += normal_lpdf(eta | 0, 1);       // 事前分布の対数密度
  target += normal_lpdf(y | theta, sigma); // 対数尤度
}

Rでラインを引く

# https://www.library.osaka-u.ac.jp/doc/TA_2014_01.pdf

temperature<-c(22,23,23,24,24,25,25,25,26,26)
coffee<-c(100,103,105,110,118,118,120,122,124,125)
plot(temperature,coffee)

plot(temperature,coffee,
     xlim=c(20,30),
     ylim=c(90,130),
     main=("コーヒーの売れ行き"),
     pch=17
)
prd<-lm(coffee~temperature)
abline(prd)

ONTAPをActive Directoryに参加させようとしたら時刻が狂ってて参加失敗した


ONTAPをActive Directoryに参加させようとしたら「Reason: SecD Error: no server available.」でエラーになった。

ontap91::> vserver cifs create -cifs-server newsvm0 -domain adosakana.local -ou CN=Computers

In order to create an Active Directory machine account for the CIFS server, you
must supply the name and password of a Windows account with sufficient
privileges to add computers to the "CN=Computers" container within the
"ADOSAKANA.LOCAL" domain.

Enter the user name: administrator

Enter the password:

Error: Machine account creation procedure failed
  [    91] Loaded the preliminary configuration.
  [   213] Created a machine account in the domain
  [   214] Successfully connected to ip 172.17.44.49, port 445 using
           TCP
  [   249] Encountered NT error (NT_STATUS_MORE_PROCESSING_REQUIRED)
           for SMB command SessionSetup
  [   250] Cluster and Domain Controller times differ by more than
           the configured clock skew (KRB5KRB_AP_ERR_SKEW)
  [   250] Kerberos authentication failed with result: 7537.
  [   258] Encountered NT error (NT_STATUS_MORE_PROCESSING_REQUIRED)
           for SMB command SessionSetup
  [   259] Cluster and Domain Controller times differ by more than
           the configured clock skew (KRB5KRB_AP_ERR_SKEW)
  [   259] Kerberos authentication failed with result: 7537.
  [   259] Unable to connect to LSA service on
           adserver.adosakana.local (Error:
           RESULT_ERROR_KERBEROS_SKEW)
  [   260] No servers available for MS_LSA, vserver: 2, domain:
           adosakana.local.
**[   260] FAILURE: Unable to make a connection (LSA:ADOSAKANA.LOCAL),
**         result: 6940
  [   260] Could not find Windows SID
           'S-1-5-21-937304154-1581684492-536532533-512'
  [   284] Deleted existing account
           'CN=NEWSVM0,CN=Computers,DC=adosakana,DC=local'

Error: command failed: Failed to create the Active Directory machine account
       "NEWSVM0". Reason: SecD Error: no server available.

ontap91::>

古いONTAPがActive Directoryに参加できない」や「ONTAP 9.5でsambaドメインに参加できない & ONTAP 9.7で失敗」の話かな?と思って対処してみるも変わらない

もしかして、と時刻を確認してみると、Active DirstoryサーバとONTAPとの時刻差が3分以上あった。

時計を合わせるとActive Directoryへの参加が成功した。

Rstudio server上でRを使う時に追加しておいた方がいいRHELパッケージのメモ


Rstudio serverをRHEL9上で動かす際にR側でいろいろパッケージを追加する際に必要となるパッケージがあったので、そのメモ

まずは基本

「dnf groupinstall “開発ツール”」で開発ツールをインストール

tidyverseに必要だったもの

install.packages(“tidyverse”) でtidyverseを追加しようとしたら前提となるraggのインストールがfontconfigコマンドが無いことで失敗

→ fontconfig-devel

次のエラーがfribidi was not found in the pkg-config search path

→ fribidi-devel
→ libtiff-devel
→ libjpeg-turbo-devel

Rstudioからpythonを使う際に必要だったもの

Rstudio serverでpythonスクリプトを使う際に、追加パッケージを要求されるが、それが必要としているもの

→ libxml2-devel
→ libcurl-devel
→ libpng-devel

伊勢神宮 内宮神域にある鏡岩 に行ってみた


昭和の終わりごろ親の転勤のつごうで伊勢市に住んでいた時期がある。

小学校か中学校の遠足で、伊勢神宮内宮から高麗広方面にいく途中にある 鏡岩 というところまで歩いて行く、というものがあった。

いまはどうなってるんだろう?と思って検索してみると、道は整備されておらず荒れているらしい。

実際のところどうなんだろ?と思って、2023年3月5日に行ってみました。

レンタサイクルを借りて内宮宇治橋前から団体バス駐車場を横切って

高麗広への道に突入。

ちなみに、この道。CBCテレビでやっている「道との遭遇」という番組で紹介されたりしています→「険道・三重県伊勢市~度会郡南伊勢町に伊勢神宮から直結の狭すぎる道が!ジャニーズJr.「7 MEN 侍」佐々木くんが険道走る。先行映像公開!

すぐに内宮御手洗場の対岸を通るのですが、木々に遮られて写真としてはうまく撮れず・・・

また、途中にある建設会社の資材置き場の横にある道なんですが

謎の石の飛び橋ルートが見えたりしていました

対岸は広くなっていましたが、いまは何も残っていませんでした

川を渡って広場までいくのを動画で撮ったモノがこちら

帰ってきてから調べて見ると「宮川水系 五十鈴川流域の砂防~伊勢神宮宮域内の砂防~」という三重県の資料で平成3年~6年にかけて施行した「景観に配慮した護岸工」と紹介されていました。

この写真が撮られた時期はまだ田んぼかなにかやってたようですね

進んでいくと、いきなりいままでの細い道が災害復旧で丈夫な感じになってたり・・・

こちらは整備されなくなって石に埋もれつつある旧道

さらにすすんでいくと右側に 水飲み場という標識があります。

ただ、水としては冷たいという感じではありませんでした。

さらに進むとこんな感じで開けた場所に出ます。なにか栽培とかしているようです。

あとで分かるのですが、ここで見える対岸の川原が鏡岩のあたりだったのですが、残念ながらここから川を渡るルートが存在していません。

じゃあ、どこからなら対岸に渡れるのかと言えば、もっと上流にしばらく進んだところにあるこの分岐を下に行きます

降りて橋を渡り・・

橋を渡ってすぐ左側の道を入って、下流側/内宮に向けて歩いて行きます。

途中、倒木があったり

なかなかやばい感じの木橋があったり

というか、これ、もうすぐ折れる予感がします・・・

まあ、折れても下は水がなく、高低差もなんとかなる程度なので渡れますけどね

橋を越えて少しいくと左側にカーブした感じで石垣がある開けた場所がありますが、そこを超えてさらに下流側へ進んでいきます。

しばらく進むと川からちょっと高度があがり、左側に岩が見える出っ張りがあります。

この出っ張りの少し先の下流側に目的地の鏡岩があります。

鏡岩には2つの見るポイントがあります。1つ目

↑の写真の左側にはお社があります。

なんか、明治になるまではこのお隣にもう1つお社があったらしいです。

で、鏡岩と呼ばれるところは↓の右側部分です

上からだとわかりにくいですが、階段があるのでそこを降りて行くことができます

下から見るとこんな感じです。

鏡岩の全体像としてはこんな感じです。

昭和終わりの時点で、どこが鏡???という感想を持っていましたが、そこから30年以上が経過した現時点では、さらにうーん、という感じになっていますね。

かつてはこのあたりがもっと鏡っぽく見えたのかもしれません・・・

下流側の川から鏡岩のある方向を見てみますとこんな感じです。

この写真のどこに鏡岩があるのかというと↓の赤丸の部分です

まあ、見てのとおりに清流感はすごいです。

鏡岩の川側は、ごつごつしていて木もはえてるので見栄えはよくありません。

で・・・ここから下流側を見ると・・・

対岸にひらけたところが見えますね。上から撮った写真に見えたブルーシートっぽい物体も↓にあります。

ここに橋があれば簡単に鏡岩に行けるのに、といった感じの場所でした。

もしかして、災害で山崩れとかがあってこんなにひらけた感じになったのかと思い、伊勢市の「土砂災害ハザードマップ(伊勢市宇治今在家町高麗広地区)」を確認してみましたが、この付近については特に崖崩れの恐れについては触れられていませんでした。

そんなわけで、今回の鏡岩探索は、距離としては片道 6kmぐらいで、今回は自転車移動だったので片道約1時間での旅という感じでした。

現在はまだ木橋が使える状態ですが、恐らくもうすぐ寿命がなくなりそうなのと、夏は草が生えて大変になりそう、というのもあって、なかなか訪問にはツライ場所じゃないかと思います。

10:58 宇治橋前出発
11:05 謎の飛び石橋発見
11:12 出発
11:21 水飲み場
11:24 ひらけたところ(鏡岩対岸。仙人下橋)
11:28 分岐
11:30 自転車を置いて徒歩移動開始
11:32 木橋
11:34 カーブの石垣
11:38 鏡岩到着
12:16 撤収
12:23 カーブの石垣
12:24 木橋
12:28 自転車回収
12:35 ひらけたところ(鏡岩対岸。仙人下橋)
12:40 水飲み場
12:53 宇治橋前

ということで、鏡岩手前から神路山方面を望んだ写真でこの記事を締めさせていただきます。