盆暗の学習記録

データサイエンスを中心として,日々学んだことの備忘録としていく予定です。初心者であり独学なので内容には誤りが含まれる可能性が大いにあります。

[Windows]コマンドラインで「自分のいつもの環境」を簡単に再現する

自分がWindowsで環境を用意するときに便利だなとおもったものをメモしておきます。

省力化のポイントは「極力コマンドラインで操作する」ということかなと思うようになりました。

そうすれば,「自分にとって必要なソフトウェアのリスト」をコマンド集としてメモしておけば,新しいPCを買ったときとかにそのコマンド集を実行すればいいので。

scoop

scoopとは

パッケージ管理ツールというやつで,いろんなアプリをコマンドラインpowershell)から簡単にインストール・アップデートできるようにするもの。

例えばgoogle chromeをインストールするときに,普通なら

  1. Edgeを開いて「Google Chrome」と検索する
  2. Chromeの公式サイトでダウンロードする
  3. ダウンロードしたファイルを実行してインストールする

という手順を踏むものだが,scoopなら

scoop install chrome

と入力するだけでダウンロードとインストールが自動で行われる。

こっちのほうが断然楽。

ちなみに,Windowsのパッケージ管理ツールにはChocolateyというものもある。でもこれを読んでscoopのほうが良さそうに思えたのでscoopにした。

(特に,Chocolateyはインストールのたびにユーザーアカウント制御が出てしまう,というのは致命的な気がするので,もし今のバージョンのchocolateyでも同様の仕様であるならばscoop一択な気がする)

install

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force
iex (New-Object net.webclient).downloadstring('https://get.scoop.sh')

パッケージのインストールの例

scoop install git
scoop install python
scoop install r
scoop install docker

Bucketの追加

bucketとは,ソフトウェアの公式サイトへのリンク集的なやつ。

bucketを追加すると,scoopでインストールできるソフトが増える

extras bucket

公式のbucket

など,いろんなソフトをダウンロードできるようになる

# Bucketの追加
scoop bucket add extras

extrasによってインストールできるようになるソフトウェアの例:

# Google Chrome: おなじみの大人気ブラウザ
scoop install chrome

# WinRAR: .zip, .rarなどの圧縮・解凍ソフト
scoop install winrar

# MPC-HC: 動画ビューア
scoop install mpc-hc

# irfanview: 複数画像の一括編集機能などがついた多機能の画像ビューア
scoop install irfanview

# ScreenToGif: 画面をGIFの動画としてキャプチャする
scoop install screentogif

# GIMP: Photoshopのような画像編集ソフト
scoop install gimp

# R Studio: R言語のエディタ
scoop install rstudio

# Open Hardware Monitor: CPUやGPUの使用率,温度などをモニターする
scoop install openhardwaremonitor

scoopでのダウンロードに向いていないソフト

次のようなソフトは手動でインストールする必要がありそう。

  • slack

    • extras bucketからダウンロード可能だが,インストールが失敗した
  • docker

    • デフォルトのbucketからダウンロード可能だが,うまく起動しなかった
  • steam
    • extras bucketからダウンロード可能だが,インストール後に保存先を移動したりとかの処理(必須ではないが推奨されているみたい)が面倒
  • QTTabBarエクスプローラをタブ化するソフト)

    • あるbucketからダウンロード可能だが,インストールがうまくいかなかった
  • Rictyなどのフォント

    • jpというbucketにあるが,ダウンロードまではうまくいくもののインストールがうまくいかない。

参考

WSL1

WSLとは

WSL(Windows Subsystem for Linux):Windows内でLinux OSのようなものを動かすやつ

WSLの機能の有効化

管理者権限でPowerShellを起動し,次を実行

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -Force

Linuxディストリビューションのダウンロード

ざっくり分けて,次の2つのインストール方法がある模様

  1. Microsoft Storeからダウンロード・インストールする
  2. PowerShellからダウンロードして,実行ファイルをクリックしてインストールする

例えばPowerShellからのUbuntu 18.04のダウンロードは次のように行う。

# ダウンロード
Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing
# 実行
start Ubuntu.appx
# 削除
rm Ubuntu.appx

参考

NERDTreeのWSL(Ubuntu)へのインストール

試しにnerdtreeを入れてみたので入れ方と操作方法についてメモ。

※ 執筆時のPCの環境など

Windows 10 ver.1803
Ubuntu 18.04.1 LTS

NERDTreeとは

vimの画面左側に,カレントディレクトリのファイルツリーを表示させるもの。

f:id:nigimitama:20190518125904p:plain

インストール手順

ちょっと昔の記事だとNeoBundleというプラグイン管理ソフトを使う手順が解説されていたりするが,私の環境ではNeoBundleはうまくいかなかったのでapt-vimを使ったらうまくいった。

  1. apt-vimvimプラグイン管理ソフト)をインストール

    sh curl -sL https://raw.githubusercontent.com/egalpin/apt-vim/master/install.sh | sh

  2. NERDTreeをインストール

    sh apt-vim install -y https://github.com/scrooloose/nerdtree.git

基本的な使い方

ファイルツリーを表示

vim

:NERDTreeToggle

というコマンドを実行すると表示される。

以下の設定を.vimrcに追加すればCtrl+nで開くようになる

map <C-n> :NERDTreeToggle<CR>

画面の切り替え

ファイルツリー画面とファイル編集画面との切り替えなどを行うには

Ctrl + w + w (Ctrl + wのあとにもう一度w)

ファイルを開く

ファイルツリーでカーソルをファイル名にあわせて

  • i:画面を横に分割してファイルを開く
  • s:画面を縦に分割してファイルを開く

その他の操作

細かい操作については,このサイトがよくまとまっているように思われる。

Vimメモ : The NERD Treeでディレクトリツリーを表示してファイル操作 - もた日記

vimのカラースキームを変更する

カラースキーム変更についてメモ。

カラースキームの変更

一時的に変えるには

:colorscheme [カラースキーム名]

と打てばいいらしい(カラースキーム名については次節)。

永続的に変えるには.vimrc

colorscheme [カラースキーム名]

と書き込む。

デフォルトのカラースキーム

カラースキームのファイルは/usr/share/vim/vim80/colorsにある (vim80はバージョンなので,環境によって異なる)

/usr/share/vim/vim80/colors$ ls
README.txt    delek.vim    industry.vim  pablo.vim      slate.vim
blue.vim      desert.vim   koehler.vim   peachpuff.vim  torte.vim
darkblue.vim  elflord.vim  morning.vim   ron.vim        zellner.vim
default.vim   evening.vim  murphy.vim    shine.vim

外部のカラースキーム

カラースキームのファイルをダウンロードして,vimcolorsフォルダに入れればいいみたい

例えばmolokaiを入れるなら

# 最新のmolokaiダウンロード
git clone --depth 1 https://github.com/tomasr/molokai

# molokai.vimの移動
sudo mv ./molokai/colors/molokai.vim /usr/share/vim/vim80/colors/molokai.vim

# 移動できたことを確認
ls /usr/share/vim/vim80/colors/ | grep molo

# cloneしたmolokaiディレクトリの削除
rm -r -f molokai

f:id:nigimitama:20190518112941p:plain

ポアソン対数正規分布についてのメモ

「所得分布のように格差がある歪んだ分布で,データ型は整数」というような確率分布ってあるのかなぁ・・・と探していたら,ポアソン対数正規分布(Poisson-lognormal distribution)なるものがあることを知ったのでちょっとだけメモ。

概要

R

# install.packages("poilog")
library(poilog)
library(ggplot2)
set.seed(0)

poilog = rpoilog(S = 350, mu = 1, sig = 1, keep0 = T)
ggplot(data.frame(poilog), aes(x = poilog))+
  geom_bar()

f:id:nigimitama:20190511201522p:plain

  • メモ
    • rpoilog()keep0=TRUEにしないと0という値が結果から削除される
    • 引数のmusigは,マニュアルによれば対数正規分布の平均と標準偏差だと書かれているが,実際は対数正規分布のμとσなのでは?

python

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('ggplot')
np.random.seed(0)

# ポアソン対数正規分布
lognorm = np.random.lognormal(mean=1, sigma=1, size=350)
poilog = np.random.poisson(lam=lognorm, size=350)
sns.countplot(poilog)

f:id:nigimitama:20190511201242p:plain

参考

ポアソン対数正規分布 - ryamadaの遺伝学・遺伝統計学メモ

Fitting a Poisson-lognormal distribution in Stan (rstan)

[Windows]VSCodeのターミナルをPowerShellやBashにする

VSCodeが便利なのでよく使っています。

ただ,今迄の所唯一不満だったのが「ターミナルがコマンドプロンプトであること」です。

Bash(WSL)やPowerShellUNIX系のコマンドラインが使えるので,VSCodeのターミナルをこれに変えると作業が捗りました。設定の変え方をメモしておきます。

設定を開く

Ctrl + ,あるいは[file] -> [Preferences] -> [Setting]から設定を開きます

f:id:nigimitama:20190425222754p:plain

ターミナルの設定箇所を探す

検索窓にterminal.integrated.shell.windowsと入力すると,

Terminal › Integrated › Shell: Windows
C:\Windows\System32\cmd.exe

と書かれている箇所が見つかるかと思います

f:id:nigimitama:20190425222406p:plain

値を書き換える

cmd.exeがコマンドプロンプトなので,それ以外のものを入れます

// Command Prompt
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\cmd.exe"
// PowerShell
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe"
// Git Bash
"terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
// Bash on Ubuntu (on Windows)
"terminal.integrated.shell.windows": "C:\\Windows\\System32\\bash.exe"

Integrated Terminal in Visual Studio Codeより引用)

Bash・Shellコマンドまとめ

bash操作・シェルスクリプトについて学んだのでメモ。

ファイル操作系コマンド

カレントディレクトリ関係

# カレントディレクトリの確認
pwd

# change directory
cd [path]

# ls:ファイル一覧
ls

# la -la
# -l:ファイルのサイズや更新日時を含めた一覧
# -a:隠しファイルを含めた一覧
ls -la

フォルダ/ファイルの操作

# mkdir:フォルダ作成
mkdir [dir]
# mkdir -p:深いディレクトリを一気に作成
mkdir -p learning/log/20190422.md

# touch:ファイル作成
touch [file]

# rm:ファイル・ディレクトリの削除
rm (option) [削除するファイル1] [削除するファイル2] ...
# rm -i:「本当に削除しますか?」と確認してくれる
# rm -r:フォルダを削除できる

# rmdir:空のディレクトリを削除する
rmdir [dir] # 空でないディレクトリを指定するとエラーになる

# mv:ファイル・ディレクトリを移動する/名前を変更する
mv (option) [移動元] [移動先]

ファイルの内容を表示

# cat:ファイルの内容を表示
cat [file]

# head:ファイルの最初の10行を表示
head [file]

その他のコマンド

curl:URLへのアクセス・ダウンロード

curl -o <ファイル名> <URL>

-o でファイルへの書き出し

# ダウンロード
curl -o hogehoge.tar.gz http://xxxxxxxxxxx.jp/hogehoge.tar.gz
# 解凍
tar xzf hogehoge.tar.gz

find:ディレクトリツリーからファイルを探す

find <検索開始ディレクトリ> <検索条件> <アクション>
# カレントディレクトリで,.txtファイルを調べ,パスを表示(print)する
find . -name "*.txt" -print
  • printは省略可能(デフォルトがprint)

ヘルプ

# ヘルプ
[command] --help

# マニュアル
man [command]

# コマンドのフルパスを表示する
which [command]

環境変数

# printenv:環境変数の表示
printenv
# あるいは特定の変数を指定してecho
echo $LANG

# export:環境変数の設定
export LANG='ja_JP.UTF-8'

シェルスクリプト

シェルスクリプトの実行方法や注意点

Windowsで書く際の注意点

  • 改行コードがCRLFで作成すると,Linuxは改行コードがLFなので,エラーになる
    • VSCodeなどでWindowsを通して書く場合,LFとして保存する必要がある

#!/bin/bash:シバン

シェルスクリプトを作るとき,最初の行に以下のように書く必要があるらしい。

#!/bin/bash

これは,その.shファイルを,/bin/bashで実行するよう指示していることになる(Linuxカーネルは#!の後ろのコマンドを実行する)。

つまり,以下のようなコマンドラインが実行されているということになる

$ /bin/bash ./hoge.sh

シェルスクリプトの3つの実行方法

いろんな実行方法があるらしい。

①シェルの引数として実行する

bashから実行させる。shファイルに実行権限は不要

bash hoge.sh

②sourceコマンドを利用して実行する

sourceコマンド,あるいはドットコマンドで実行できる

sourceコマンドでは直接実行するわけではないので,shファイルに実行権限は不要

source ./hoge.sh
. ./hoge.sh

ドットコマンドは古いやり方だし,見落として妙なトラブルを引き起こしかねないため非推奨らしい

③ファイル名のみを指定して実行する

シェルスクリプトに実行権限を付与すると,sourceコマンドが不要になる

# 実行権限の付与
chmod +x hoge.sh
# 実行
./hoge.sh

変数

変数に関しての注意点

  • 代入するときは= の前後にスペースを入れてはならない
  • 代入時は$をつけないが,呼び出すときは$をつける

$():コマンド置換

コマンド置換$()により,コマンドの結果を文字列として受け取る

# dateコマンドで取得した日付を文字列として受け取る
today=$(date '+%Y-%m-%d')

${}:変数を文字列に埋め込む

"string${var}string"

# 今日の日付
today=$(date "+%Y年%m月%d日")
# 文字列の結合
message="今日は${today}です!"
# 表示
echo $message

if文とfor文

if文

if 文と test コマンド | UNIX & Linux コマンド・シェルスクリプト リファレンス

testコマンド

論理演算はtestコマンドか[コマンドを使う。次のif文は同じ意味になる。

if [ "$1" = "bin" ]; then
if test "$1" = "bin"; then

シェルスクリプトでは,ifの後に置くのは条件式ではなくコマンドである

$ type [
[ is a shell builtin

hoge="A"
fuga="A"
if [ $hoge -eq $fuga ]; then # -eqと=は同じ意味の論理演算子
  echo "文字列は同じです"
else
  echo "文字列は違います"
fi

for文

shell - How do I iterate over a range of numbers defined by variables in Bash? - Stack Overflow

for i in {1..5}
do 
    echo $i # 変数iの値を表示
done
1 
2 
3 
4 
5

例:Fizz Buzz

  • for ((i=1;i <= $N;i++))C言語風に1からNまで1ずつ変化するi を指定できる
  • $((計算式))で計算でき,剰余は%で計算する
#!/bin/bash
N=30
for ((i=1;i <= $N;i++)); do
    if [ $(($i % 15)) = 0 ]; then
        echo "Fizz Buzz"
    elif [ $(($i % 5)) = 0 ]; then
        echo "Buzz"
    elif [ $(($i % 3)) = 0 ]; then
        echo "Fizz"
    else
        echo $i
    fi
done

配列

bash 配列まとめ - Qiita

# 空の配列の生成
empty_array=()

# 先頭に追加
array=(3 "${array[@]}")        # array は (3 “a” "b" "c")
# 末尾に追加
array=("${array[@]}" 4)        # array は (3 "a" "b" "c" 4)
array+=( 5 )                   # array は (3 "a" "b" "c" 4 5)

例:lsコマンドの中身を配列にして表示する

#!/bin/bash
array=()
for i in `ls`; do
    array+=( $i )
done
echo ${array[@]}

例:その日の日付をファイル名に含んだ空のファイルを作成する

#!/bin/bash
# 保存先
directory="./log"
# カレントディレクトリの移動
cd ${directory} 

# ファイル名
today=$(date "+%Y%m%d")
filename="log_${today}.log"

# もしファイルがなければ作成する
if [ -e $filename ]; then
    echo "既にファイルが存在します。"
else
    touch "${filename}"
    echo "${directory}に${filename}を作成しました。"
fi

引数

コマンドの引数は,コマンドからスペースを空けて記述していく。

bash hoge.sh 引数1 引数2 ... 引数n
  • $0, $1, ..., $nで参照できる
    • \エスケープできる
  • $@:すべての引数を1行であつかうが,それぞれ別の文字列
    • 別のコマンドの引数としてそのまま渡すときに便利
  • $*:引数を分割せず,スペース区切りされた1つの文字列とする
  • $#で指定されたパラメータの数がカウントされる
  • ./hoge.sh *のように*を指定すると,カレントディレクトリにあるファイル達の名前がパラメータに入る

例:引数をそのままechoする

#!/bin/bash
echo "指定された引数(\$@):$@"
echo "指定された引数の数(\$#):$#"

標準入力・出力

read:標準入力

入力と出力 | UNIX & Linux コマンド・シェルスクリプト リファレンス

  • catでファイル名を指定しない場合,標準入力を受け取ってechoする動きをするようになる
  • readコマンドで標準入力を受け取るようになる
# 標準入力の受け取り
read [変数名]
# 入力された内容は[変数名]の変数に格納される
echo $[変数名]

echo:標準出力

# 標準出力
echo [object]

$ echo Hello World
Hello World

リダイレクト

# 標準入力
cat < [file]
# 標準出力
ls > ls.txt
## >:上書き,>>:末尾に追記
ls -la >> ls.txt
# 標準エラー出力
ls /xxx 2> error.txt
  • 上のコードで作られたls.txtはメモ帳で開くと改行が無いが,cat < ls.txtすると改行されて表示される

その他の概念

パイプライン

  • コマンドからの標準出力を,別のコマンドの標準入力に入れる
# ls -laの結果をlessで表示する
ls -la | less

相対パス絶対パス

例:相対パス絶対パスをパラメータで渡し、渡されたファイルパスが相対か絶対かを判定する

#!/bin/bash
# 第一引数にパスを入れてもらう
if [ $# != 1 ]; then
    echo "第一引数に判定したいパスを入れてください。"
else
    # 1文字目を取り出す
    first_letter=$( echo $1 | cut -c 1 )

    if [ $first_letter = "/" ]; then
        echo "絶対パスです。"
    else
        echo "相対パスです。"
    fi
fi

文字列操作

grep:文字列検索

grep [オプション] <検索パターン> <ファイル名>
# シェルスクリプトを検索
ls -la | grep .sh

文字列置換

sedによる置換

sed "s/置換対象にしたいパターン/置き換えたい新しいパターン"

変数内文字列置換

${変数/検索文字列/置換文字列}

参考

この本を参考にしていました。この一冊で全部をまかなえる…とまでは行きませんが,多くの基本的なコマンドをカバーしている上,「なぜこうするのか」についての説明もあったりして,いい本でした。

新しいLinuxの教科書

新しいLinuxの教科書

Git基本操作メモ

ようやくGitをちゃんと学ぶことができたのでコマンド一覧的なのをメモ。

Git基本操作まとめ

設定

# リポジトリのクローン
git clone [url]
# リポジトリの初期化(.gitディレクトリの作成)
git init
# リモート(ファイルをアップロードする場所)を登録
git remote add [リモート名(大抵はorigin)] [リモートのURL]
git remote add origin https://....
# ユーザー名等の設定
git config --global user.name [ユーザー名]
git config --global user.email [メールアドレス]

リポジトリ

# 共有するファイルを選択(監視対象に追加)
git add [file name]
# 選択したファイルを記録
git commit -m "コミットメッセージ"
# 前回のコミットの修正
git add [追加し忘れたファイルなど]
git commit --amend

リモートリポジトリ

# リモート参照(リモートのポインタ)
git ls-remote [remote]
# リモートの情報
git remote show [remote]

# リモートにファイルをアップロードする
git push origin master
# リモートからファイルをダウンロードするだけ(現在のブランチにマージしない)
git fetch [remote]
# リモートでの更新をダウンロードして手元とマージする
git pull [remote]
# リモートブランチの削除(ガベージコレクションするまではポインタを削除するだけ)
git push [remote] --delete [branch]

# リモート名の変更
git remote rename [old] [new]
# リモートの削除
git remote rm [remote name]

ファイルの確認

# 変更した/addしたファイル名の確認
git status
# 変更内容の確認
git diff [ファイル名]
# 自分・他人のコミットログの確認
git log
# 変更内容を見たいとき:-p (表示を終了したいときはQキーで抜ける)
git log -p

ファイルの操作

# ファイルの削除
git rm [file]
# ハードディスク上にはファイルを残しておきたいけれど、もう Git では追跡させたくないというような場合
git rm --cached [file]
# .logで終わるすべてのファイルを削除する場合
git rm \*.log
# ファイルの移動/ファイル名の変更
git mv [file_from] [file_to]

タグ

# タグの一覧表示
git tag
# 注釈付きのタグ annotated tag
git tag -a v1.0 -m "my version 1.0"
# タグのデータとそれに関連づけられたコミットを見る
git show
# 軽量版(lightweight)のタグ
git tag v1.1-lw
# タグの共有(デフォルトのgit pushではタグ情報は送らない)
git push origin [tagname]
# 手元にあるタグのうちまだリモートサーバーに存在しないものをすべて転送
git push origin --tags

Gitエイリアス

# git commitを git ciで指定できるようにする
git config --global alias.ci commit
# 直近のlogを見るコマンドlastを追加する
git config --global alias.last 'log -1 HEAD'

ブランチ

# ブランチ一覧
git branch

# 新しいブランチの作成
git branch [name]
# 作業中のローカルブランチのポインタ(HEAD)を確認
git log --decorate
# ブランチの切り替え
git checkout [name]
# ブランチの分裂の確認
git log --oneline --decorate --graph --all
# ブランチの作成と切り替えを同時に行う
git checkout -b [name]
# ブランチの削除
git branch -d [name]

# マージ:現在作業中のブランチにmasterブランチの内容をマージする
git merge master
# コンフリクトしてマージできなかったファイルを知る
git status
# コンフリクトの解決をグラフィカルに行う
git mergetool

# マージされていない作業を持っている(削除できない)すべてのブランチを表示
git branch --no-merged

リベース (rebasing)

  • 分岐を残さずにすっきりしたツリーにするマージ方法
  • 公開リポジトリにプッシュしたコミットをリベースしてはいけないらしい
    • リベースをすると、既存のコミットを破棄して新たなコミットを作成することになるため

プッシュする前の作業をきれいに整理する手段としてだけリベースを使い、 まだ公開していないコミットだけをリベースすることを心がけていれば、何も問題はありません。 (『Pro Git』3.6節)

# リベース
git checkout [branch] # 統合したいサブのブランチへポインタを移動
git rebase master # マスターにリベースする

参考

基本中の基本の操作はprogateで学ぶのが簡単でした。

『Pro Git』はかなり丁寧に詳細な情報を載せて書かれています。

練習によさそうなアプリ

ゲーム感覚で練習できる素晴らしいアプリをみつけました。

learngitbranching.js.org