どこかに向かうらしい話

迷走エンジニアの放浪記

ラビット・チャレンジはじめます

社内でデータサイエンス系の部署に異動するチャンスが出てきた。
資格がものを言いそうな雰囲気を上層部の会話から感じたので、E資格でも取ろうと受講を決意。
数学はまーまーできるほう(のはず)なので、自分で高い山を登って行こうと決意。

詳しいことはリンク先を見たほうが早いです。
自習できる人なら、いいのかなと思いやってみることにしました。
ラビットチャレンジはこちらから。
https://ai999.careers/rabbit/

[計画]
Stage1は数学、Stage2は機械学習なので、1週間程度で終えたい。
Stage3は6月中、Stage4は7/18までに終えたい。

[目標]
できれば8月の試験で合格したい!
(7月以降の業務次第で…でも年度内には合格するぞ!)

一般次元の単位球面上の一様分布について

以下でまとめられている「倭式極座標」というものが使い勝手よさそう。

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のログイン画面が表示される。

http://10.100.100.100:8787/

さきほどOS上に作成したユーザuser01のユーザ名とパスワードでログインができる。

Rパッケージの導入

導入の準備

tidyverserstanを導入するために必要となるパッケージをインストールする。

まずは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/Makevarsuser01ユーザで/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のログイン画面が表示される。

http://10.100.100.100:8787/

さきほど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 田中