盆暗の学習記録

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

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プラグイン管理ソフト)をインストール

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

  2. NERDTreeをインストール

    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:20190727225552p: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

手元の本を電子書籍にした

就職を機に都心の狭くて安い物件に引っ越すので荷物を減らそうと努力しています。

私が持っている本棚の使い勝手がイマイチで,専有する場所の割には本があまり入らない(文庫本向けっぽくて専門書があまり入らない。未使用の空間が多く生まれる)ので,一つの策として本棚を捨てることを考えています。

そこで紙の本を「自炊」(自分で電子書籍化を行う)で電子書籍化しました。

そのあたりの意思決定に関して記しておきます。

なぜ自炊なのか。外注できないのか

自炊には時間的にも金銭的にもコストがかかります。

できれば電子書籍化代行サービス」のようなのを利用したいところですが,著作権法上そうしたサービスは違法なようです1

自炊して自分で読む分には適法のようなので,泣く泣く自炊用の設備を購入してきて自炊することにしました。

自炊のために揃えた設備

裁断機

買ったもの

個人用の裁断機のなかではかなりハイグレードと思われるこれにしました。

DURODEX 自炊裁断機 ブラック 200DX

DURODEX 自炊裁断機 ブラック 200DX

これに決めた理由:

  • 本のスライスと裁断が最も時間のかかる作業であるのでスペックが高いことは時短につながる
  • 一度に裁断できる枚数が多いほどスライス回数が少なく済んでよい
  • 小型の裁断機だと真っ直ぐ切れないものもあるらしいが,これは構造がしっかりしていて裁断精度が高い

例えば『マンキューミクロ経済学』は750ページ近くあるんですが,200DXなら一冊を2~3個のパートにスライスしてそれぞれ裁断できます。

もし,もっと安くてスペックの低いもの(例えば裁断枚数が50)なら8個のパートにスライスしてからそれぞれ裁断することになるでしょうから,それを考えるとだいぶ手間を省略できます。

大きくて置き場所に困りそうでちょっと怖いんですが,でも裁断の安定性は高いです。安全性もしっかりしています。

買わなかったもの

もう少し安くてコンパクトなものもあります。

買おうかちょっと迷ったのは次の2つです

コンパクトで,安くて,40枚を裁断できます。「うっかりしているとずれて裁断してしまう」といった裁断精度に関するレビューもあったので購入は見送りました。

プラス 裁断機 コンパクト 断裁機 PK-213 裁断幅 A4縦 26-366

プラス 裁断機 コンパクト 断裁機 PK-213 裁断幅 A4縦 26-366

コンパクトで,比較的まっすぐ切れそうですが,60枚しか切れない割に高い。

買えば良かったかも,と思ってるもの

今この記事を書いてて知ったのですが,裁断枚数400の

こういう裁断機もあるようです。非常にコスパが良さそうです。

これ買えばよかったかもしれません。

200DXよりも大きそうなので置き場所に困りそうですが…。

スキャナー

買ったもの

自炊の定番スキャナらしいです

富士通 ScanSnap iX500 (A4/両面)

富士通 ScanSnap iX500 (A4/両面)

これに決めた理由:

  • 評判がよかったから

他の選択肢を知らなかったので迷わずこれに決めました。

実際に使ってみても自炊用に作られていてクオリティが高いです。

例えば,裁断が甘くて糊がちょっと残ってて2枚の紙がくっついてる場合,スキャナ側が用紙を送ったときの超音波から異常を検知して中止・エラー通知してくれます。

また,スキャンした画像を検索可能なPDF(スキャンした画像の上にOCR検出したテキストデータが乗っていて文書内を検索できるPDF)にしてくれるソフトのライセンスなども付属していて,非常に役に立ちます。

買わなかったもの

もっとあたらしいバージョンが出ているんですが,さらに+1万円かかることになるので諦めました

今はその時とは価格が変わっているのでこちらもアリだとおもいます。

PFU ScanSnap iX1500 FI-IX1500

PFU ScanSnap iX1500 FI-IX1500

自炊に必要な費用

200DXとiX500で8万円近くかかりました。結構痛い出費です…。

裁断機を200DXにしなければもう少し安く抑えることができると思います。

成果

手元の本のうち「裁断してもいいや」とおもったものを9割方電子書籍化し終わった時点でこの程度の量でした

f:id:nigimitama:20190312140749j:plain

スキャナと裁断機の箱の体積分くらいにはなりましたかね

「結局,自炊用の設備が手元に残るからあんまり部屋の空きスペースが増えないんじゃないか」という不安もありますが,今後また

  • 電子書籍が出てない本
  • 1度目は紙で読みたい本
  • 新品の電子書籍だと高いけど紙の中古の本だと安い本

を買う時があれば少しずつ今回の投資を回収できるかなと思います。

ストレージ上に容量無限の本棚をもったようなものなので,置き場所の心配をすることなくガンガン本を買えます。

自炊用の設備にたっぷり投資した分,色んな本を沢山読んで回収していきたいと思います。