ラビット・チャレンジはじめます
社内でデータサイエンス系の部署に異動するチャンスが出てきた。
資格がものを言いそうな雰囲気を上層部の会話から感じたので、E資格でも取ろうと受講を決意。
数学はまーまーできるほう(のはず)なので、自分で高い山を登って行こうと決意。
詳しいことはリンク先を見たほうが早いです。
自習できる人なら、いいのかなと思いやってみることにしました。
ラビットチャレンジはこちらから。
https://ai999.careers/rabbit/
[計画]
Stage1は数学、Stage2は機械学習なので、1週間程度で終えたい。
Stage3は6月中、Stage4は7/18までに終えたい。
[目標]
できれば8月の試験で合格したい!
(7月以降の業務次第で…でも年度内には合格するぞ!)
一般次元の単位球面上の一様分布について
以下でまとめられている「倭式極座標」というものが使い勝手よさそう。
- 単位球体内の一様分布 : 2次元
https://wasan.hatenablog.com/entry/2014/01/14/052915 - 単位球体内の一様分布 : 3次元
https://wasan.hatenablog.com/entry/2014/01/14/060137 - 4次元倭式極座標
https://wasan.hatenablog.com/entry/20110613/1307978447 - 4次元倭式極座標で求める4次元球の体積
https://wasan.hatenablog.com/entry/20110617/1308337961 - 単位球体内の一様分布 : 4次元
https://wasan.hatenablog.com/entry/2014/01/15/230140 - 偶数次元の倭式極座標
https://wasan.hatenablog.com/entry/2014/01/13/042024 - 奇数次元の倭式極座標
https://wasan.hatenablog.com/entry/2014/01/13/075057 - n次元単位球面上・単位球体内の一様分布
https://wasan.hatenablog.com/entry/2014/01/16/032911 - 単位球体内と単位球面上の一様分布
https://wasan.hatenablog.com/entry/2014/01/17/053050
Box-Mullerより効率がいいらしいし、ある程度作りこめば武器になるかな。
時間見つけて読もう。
R / Rstudio server / rstan をCentos7にインストール
Rstanのインストールがgcc関連でハマりやすいことをあり備忘録として記録。
ついでになるべく環境を汚したくないので、独立したVM環境にRstudio Serverも導入して使う。 (Rstudio Serverに関する設定や使い方についてはここでは触れません)
環境
主要な環境は以下の通り。
- CentOS Linux release 7.8.2003 (Core)
- R 3.6.0
- Rstudio Server 1.3.1093
- tidyverse 1.3.0
- rstan 2.21.2
- bayesplot 1.7.2
- ggmcmc 1.5.0
基本方針
- Rはパッケージからインストール。
- Rstudio Serverは原則公式サイトに従い、安定版(?)をインストールする。
https://rstudio.com/products/rstudio/download-server/redhat-centos/ - 設定は原則
root
で行う。 - Rserver studioのユーザは
user01
とする。 - インストール先のIPアドレスは
10.100.100.100
とする。各自の環境に合わせて適宜読みかえること。
インストール
ユーザuser01の作成
ユーザを作成する。
# groupadd rserver # useradd -g rserver user01
パスワードも変えておく。
# passwd user01
epel-releaseのインストール
R等のインストールに重要なepel-releaseをインストールする。
# yum install -y epel-release
R のインストール
EPELよりそのままインストール。
# yum install -y R
Rstudio Serverのインストール
公式サイトの記載にのっとりインストールするが、wget
ではなくcurl
を用いる。
2020/11/2時点では以下のURLだった。
# curl -O https://download2.rstudio.org/server/centos6/x86_64/rstudio-server-rhel-1.3.1093-x86_64.rpm # yum install -y rstudio-server-rhel-1.3.1093-x86_64.rpm
rstudio-serverのサービスのステータスがactive
になっていることを確認する。
# systemctl status rstudio-server.service
ブラウザから以下のURLにアクセスすることで、Rstudio studioのログイン画面が表示される。
さきほどOS上に作成したユーザuser01
のユーザ名とパスワードでログインができる。
Rパッケージの導入
導入の準備
tidyverse
とrstan
を導入するために必要となるパッケージをインストールする。
まずはdevtoolset-8
を入れる。
# yum install -y centos-release-scl # yum install -y devtoolset-8
devtoolset-8
を有効化し、/etc/profile
の末尾にも有効化の処理が走るよう追記する。
# scl enable devtoolset-8 bash # echo "" >> /etc/profile # echo "scl enable devtoolset-8 bash" >> /etc/profile
その他必要なパッケージもインストールする。
# yum install -y v8-devel curl-devel libcurl-devel openssl-devel libxml2-devel tbb-devel
パスを通す。
さらに/etc/profile
にも念のため追記する。
# export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64 # echo "" >> /etc/profile # echo "export LD_LIBRARY_PATH=/usr/local/lib:/usr/lib:/usr/local/lib64:/usr/lib64" >> /etc/profile
tidyverseのインストール
R
のREPLを起動し、対話モードにする。
# R
tidyverse
をインストールする。
> install.packages("tidyverse", repos = "https://cloud.r-project.org/")
対話モードから抜ける。
> q()
rstanのインストール
root
ユーザで/root/.R/Makevars
、user01
ユーザで/home/user01/.R/Makevars
を作成する。
ファイルの中身は以下の通り。
CXX14FLAGS=-O3 -march=native -mtune=native -fPIC CXX14=/opt/rh/devtoolset-8/root/usr/bin/g++
rstan
をインストールする。
> install.packages("rstan", repos = "https://cloud.r-project.org/", dependencies = TRUE)
動作確認
ブラウザから以下のURLにアクセスすることで、Rstudio studioのログイン画面が表示される。
さきほどOS上に作成したユーザuser01
のユーザ名とパスワードでログインができる。
以下のコードで動作確認を行う。
> library(tidyverse) > library(rstan) > x <- rbinom(n = 100, size = 20, prob = 0.8) binomial_test <- " data { int N; int n; int x[n]; } parameters { real<lower=0, upper=1> p; } model { x ~ binomial(N, p); }" > d <- list(N = 20, x = x, n = length(x)) > fit <- stan( model_code = binomial_test , data= d) > stan_hist(fit)
その他パッケージを入れる
ここでは以下2つをいれる。
> install.packages('ggmcmc') > install.packages('bayesplot')
最後に
rstanのインストールは結局のところ、以下を読むのが早いです。
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started-(Japanese))
https://github.com/stan-dev/rstan/wiki/RStan-Getting-Started
Rstudio Serverのインストールはここを見ましょう。
https://rstudio.com/products/rstudio/download-server/redhat-centos/
動作確認のコードは以下から引用させていただきました。
https://qiita.com/kumalpha/items/158d0fdfa054da602e1b
CentOS7 on VirtualBoxベースマシン構築手順
はじめに
ローカルでしか使わないVirtualBoxのベースマシンを構築する最小限の手順を残す。
※あくまで外部からは入れない前提のマシンであり、構築手順を確認するためだけに用いることが目的であることを強調しておきます。
(なぜか何度か作るんだけど、毎度忘れるのもあって、いったん手順しとくべの精神です…)
構築物の概要
- OSは最小パッケージ
- ネットワークの設定を都度変えられるようシェル(
/sbin/aaa
)を用意する
(家の環境は10.0.0.0/8であり、ネットワークデバイスも場合によっては変わるので、そこはスクリプトを適宜あわせなおす) - SELinuxとfirewalldは無効にする
- 作業はrootでする。
ただしユーザuser01は作っておき、必要に応じてsudoはできる状況は構成しておく。
導入手順
CentOS7の初期導入
最小インストールをする。
SELinuxとfirewalldの無効化
以下のお決まりのコマンドで。
# sed -i -e "s/^SELINUX=enforcing$/SELINUX=disabled/g" /etc/selinux/config # systemctl disable firewalld.service
ネットワークの設定変更シェルの配置
/sbin/aaa
を作成する。
#!/bin/sh nmcli c modify enp0s3 ipv4.addresses $1/8 systemctl restart network
パーミッションを変更する。
# chmod 755 /sbin/aaa
sudoの設定
グループwheelに属していれば、sudoできるように初期設定されている。
そのためuser01をグループwheelに属するようにしてあげる。
# usermod -G wheel user01
使いかた
これをベースイメージにして、都度クローン→ipアドレスを/sbin/aaa
で変更という感じで使う。
10.0.0.100に切り替えたいときは、以下の通りスクリプトを走らせればOK。
# aaa 10.0.0.100
rpmコマンドまとめ
はじめに
インフラ屋にとって、パッケージ管理は非常に大事なテーマである。
Infrastructure as Codeが流行っている今だからこそ、負担なく確実にパッケージをインストールできる技術というのは必要になるのではないかと考える。
パッケージ管理のポリシーはいろいろあるとは思うが、共通して必要になるテーマは以下の3点になるのかと思う。
しかし、大前提として、パッケージ管理のコマンド(RPM系ならrpm/yum/dnf、DEB系ならdpkg/apt)を知るところから始めるのは迂遠なことではないと思う。
まずは自分の手馴れているRPMパッケージから扱う。
初回である今回は、特に上記に挙げた3点に結びつくようなrpmコマンドについて説明していく。
検索
インストールしたRPMパッケージの検索
インストールしたrpmパッケージ全てを出力させるには、「-qa」オプションを使用する。
grepコマンドと組み合わせることで、特定のRPMパッケージがインストールされたかがわかる。
coreutilsパッケージがインストールされているかを確認する例を示す。
# rpm -qa | grep coreutils
coreutils-8.22-18.el7.x86_64
policycoreutils-2.5-17.1.el7.x86_64
使用しているコマンドがのどのRPMパッケージのコマンドかの検索
コマンド名は必ずしもパッケージ名と一致しないことも多い。
使用してるコマンドがどのパッケージに含まれるかを知りたい場合には、「-qf」オプションを使用する。
ただし、「-qf」オプションはフルパスでないと指定ができないため、whichコマンドでフルパスを調べ、その結果を使用してrpmコマンドを使用する。
lsコマンドのパス先を調べ、そのパッケージ収録元を確認する例を示す。
# which ls
alias ls='ls --color=auto'
/usr/bin/ls
# rpm -qf /usr/bin/ls
coreutils-8.22-18.el7.x86_64
インストールしたRPMパッケージが提供するコマンドの検索
インストールしたRPMパッケージが提供するコマンドを知りたい場合には、「-ql」オプションを使用し、binでgrepする。
# rpm -ql rpm-build | grep bin
/usr/bin/gendiff
/usr/bin/rpmbuild
/usr/bin/rpmspec
インストール
新規インストール
「-i」オプションでRPMパッケージの新規インストールが可能。
「-vh」オプションを付けると、「#」マークを用いたプログレスバーが表示されるようになる。
なお、「#」50個で100%を示す。
test-1.0.0.x86_64.rpmを新規インストールするときは以下の通り、「-ivh」オプションを使う。
# rpm -ivh test-1.0.0.x86_64.rpm
test ##################################################
アップグレード
インストール済のRPMパッケージをアップグレードする場合は「-U」オプションを指定する。
「-i」オプションのときと同様に、「-vh」オプションを付けると、「#」マークを用いたプログレスバーが表示されるようになる。
test-1.0.1.x86_64.rpmにアップデートするときは以下の通り、「-Uvh」オプションを使う。
# rpm -Uvh test-1.0.1.x86_64.rpm
test ##################################################
yumコマンドとのすみわけ
「-i」オプションによるインストールもできるが、yumコマンドの「localinstall」オプションを使うことでもRPMパッケージのインストールができる。
この違いについては、別途記述する。
アンインストール
「-e」オプションでインストール済のRPMパッケージをアンインストールが可能。
test-1.0.1.x86_64.rpmをアンインストールするときは、以下の通り。
# rpm -e test-1.0.1.el7.x86_64
依存等により、アンインストールしようとしているRPMパッケージが他のRPMで使用されている場合は、エラーによりアンインストールできない。
「--nodeps」オプションにより強制的にアンインストールすることもできるが、そうすると依存関係にあるプログラムが動作しなくなる可能性もあるので注意すること。
# rpm -e --nodeps test-1.0.1.el7.x86_64
バッチファイルで現在時刻をyyyy/mm/dd hh:mn:ss形式で取得するための備忘録
バッチファイルget_time.batを適当なフォルダに配置し、C:\scripts\logフォルダに各ファイルを出力するスクリプト。 気をつけるポイントはコメントを参考に。
@echo off
REM 日付をyyyy/mm/dd形式で取得する
set d=%date%
REM 日付を年、月、日に分解する
set yyyy=%d:~-10,4%
set mm=%d:~-5,2%
set dd=%d:~-2,2%
REM 時間をhh:mn:ss形式で取得する
REM たんにtimeコマンドと入れるだけだと、hh:mn:ss形式で取得できないことに注意
set t=%time: =0%
REM 時間を時、分、秒に分解する
set hh=%t:~0,2%
set mn=%t:~3,2%
set ss=%t:~6,2%
REM 日付の出力
echo %d% > C:\scripts\log\get_time.log
echo %yyyy% >> C:\scripts\log\get_time.log
echo %mm% >> C:\scripts\log\get_time.log
echo %dd% >> C:\scripts\log\get_time.log
echo; >> C:\scripts\log\get_time.log
REM 時間の出力
echo %t% >> C:\scripts\log\get_time.log
echo %hh% >> C:\scripts\log\get_time.log
echo %mn% >> C:\scripts\log\get_time.log
echo %ss% >> C:\scripts\log\get_time.log
REM 日付と時間の出力(出力先のファイル名に時間を反映)
echo %d% %t% >> C:\scripts\log\time_%yyyy%%mm%%dd%_%hh%%mn%%ss%.log
get_time.logの中身はこんな感じ。
2017/10/14
2017
10
14
00:24:11.90
00
24
11
time_20171014_002411.logの中身はこんな感じ。
2017/10/14 00:24:11.90
JOIN on SQL
事前準備
Salesテーブル
sales_id | sales_date | kokyaku_id |
---|---|---|
0001 | 2016-10-01 | C001 |
0002 | 2016-10-02 | C002 |
0003 | 2016-10-03 | C003 |
0004 | 2016-10-04 | AAAA |
0005 | 2016-10-05 | |
0006 | 2016-10-06 | C001 |
CREATE TABLE Sales
(sales_id VARCHAR(4),
sales_date DATE,
kokyaku_id VARCHAR(4));
INSERT INTO Sales VALUES ('S001', '2016-10-01', 'C001');
INSERT INTO Sales VALUES ('S002', '2016-10-02', 'C002');
INSERT INTO Sales VALUES ('S003', '2016-10-03', 'C003');
INSERT INTO Sales VALUES ('S004', '2016-10-04', 'AAAA');
INSERT INTO Sales VALUES ('S005', '2016-10-05', NULL);
INSERT INTO Sales VALUES ('S006', '2016-10-06', 'C001');
Kokyakuテーブル
kokyaku_id | kokyaku_name |
---|---|
C001 | 田中 |
C002 | 鈴木 |
CREATE TABLE Kokyaku
(kokyaku_id VARCHAR(4),
kokyaku_name VARCHAR(30));
INSERT INTO kokyaku VALUES ('C001', '田中');
INSERT INTO kokyaku VALUES ('C002', '鈴木');
本題
INNER JOIN
SELECT *
FROM Sales INNER JOIN Kokyaku
ON Sales.kokyaku_id = Kokyaku.kokyaku_id;
sales_id | sales_date | kokyaku_id | kokyaku_id | kokyaku_name |
---|---|---|---|---|
S001 | 2016-10-01 | C001 | C001 | 田中 |
S002 | 2016-10-02 | C002 | C002 | 鈴木 |
S006 | 2016-10-06 | C001 | C001 | 田中 |
LEFT OUTER JOIN
SELECT *
FROM Sales LEFT OUTER JOIN Kokyaku
ON Sales.kokyaku_cd = Kokyaku.kokyaku_cd
ORDER BY sales_id;
sales_id | sales_date | kokyaku_id | kokyaku_id | kokyaku_name |
---|---|---|---|---|
S001 | 2016-10-01 | C001 | C001 | 田中 |
S002 | 2016-10-02 | C002 | C002 | 鈴木 |
S003 | 2016-10-03 | C003 | ||
S004 | 2016-10-04 | AAAA | ||
S005 | 2016-10-05 | |||
S006 | 2016-10-06 | C001 | C001 | 田中 |
RIGHT OUTER JOIN
SELECT *
FROM Sales RIGHT OUTER JOIN Kokyaku
ON Sales.kokyaku_id = Kokyaku.kokyaku_id
ORDER BY sales_id;
sales_id | sales_date | kokyaku_id | kokyaku_id | kokyaku_name |
---|---|---|---|---|
S001 | 2016-10-01 | C001 | C001 | 田中 |
S002 | 2016-10-02 | C002 | C002 | 鈴木 |
S006 | 2016-10-06 | C001 | C001 | 田中 |