vagrantでboxファイル圧縮 [ProviderがVirtualBoxの場合]

1. 仮想マシン上で以下を実行

$ sudo su -
# umount /vagrant
# yum clean all
# dd if=/dev/zero of=/EMPTY bs=1M
# rm -f /EMPTY

2. 仮想マシンをシャットダウン

$ vagrant halt

3. VirutalBoxのファイルを形式をvmdk から vdiに変更したり諸々

# VirtualBoxのHDDファイルがある場所を探す.
$ vboxmanage list vms
$ vboxmanage showvminfo 

# HDDファイルがある場所へ移動する
$ cd ~/VirtualBox VMs/test-app

# vmdk -> vdi
$ vboxmanage clonehd test-app.vmdk test-app.vdi --format vdi

# vdi形式のファイルを圧縮
$ vboxmanage modifyhd test-app.vdi compact

# 作成したvdiをvmdkに変換する
## ファイル名を前のvmdkファイルと別にする必要性がある。
$ vboxmanage clonehd test-app.vdi test-app-compact.vmdk --format vmdk

# 前のvmdkファイルを取り外し、圧縮したvmdkファイルを接続する。
# VirtualBoxのGUIでやるのが簡単なため割愛。

4. vagrant の boxファイルを作成 (これより前に圧縮したvmdkで動作するかどうか確認するほうが無難)

# vagrant package --out test-app.box

mecabで記号が名詞, サ変接続とされてしまう問題の解消

概要

  • MeCabのデフォルトでは半角記号が名詞、サ変接続とされてしまう。
$ mecab
;
;       名詞,サ変接続,*,*,*,*,*
EOS
  • この問題を解消するために未定義語の辞書を編集して、半角記号が記号として取り扱うことができるようにする

前提環境

ステップ

  1. unk.def の編集
  2. 辞書の再インストール

1. unk.def の編集

$ cat unk.def | grep SYMBOL
SYMBOL,1283,1283,17585,名詞,サ変接続,*,*,*,*,*
$ sed -i unk.def -e '/^SYMBOL,/s/名詞,サ変接続,\*,\*,\*,\*,\*/記号,一般,\*,\*,\*,\*,\*/' 
$ cat unk.def | grep SYMBOL
SYMBOL,1283,1283,17585,記号,一般,*,*,*,*,*

2. 辞書の再インストール

$ sudo /usr/local/libexec/mecab/mecab-dict-index
$ sudo make install
$ mecab
;
;       記号,一般,*,*,*,*,*
EOS

CentOS7でnkfを使う

インストール方法

$ sudo yum localinstall -y http://mirror.centos.org/centos/6/os/x86_64/Packages/nkf-2.0.8b-6.2.el6.x86 _64.rpm

nkfEUC-JPなファイルをUTF8に変換し、変換元を書き換える

$ nkf -g hoge.csv
EUC-JP (LF)
$ nkf -w --overwrite hoge.csv
$ nkf -g hoge.csv
UTF-8 (LF)

ssh で ProxyCommandが動かない問題の解決

ssh で多段ポートフォワーディングやプロキシを通す時に、~/.ssh/configにProxyCommandを設定してsshコマンドを実行しようとしたところ、下記のようなエラーが発生した。

$ ssh hoge
zsh: No such file or directory
write: Broken pipe

むむ、と思い、取り合えずデバッグモードで実行してみても..

$ ssh hoge -vvv
...
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Executing proxy command: exec ssh -CW 192.168.56.112:22 hoge
debug1: permanently_drop_suid: 197609
zsh: No such file or directory
...

エラーを見る限り、ProxyCommand内に設定しているコマンドを見つけることが出来ないのではなく、zsh自体のパスが解決できていない模様。

$SHELLを見てみると zshとなっている。

$ echo $SHELL
zsh

これをフルパスに直して実行すると、問題なく実行できた。

$ export SHELL=/bin/zsh
$ ssh hoge

Oracle Linuxのバージョンを知る方法

RHEL系のOSの場合以下のファイルをcatすることでバーションを知ることができる。

/etc/*-release

Oracle Linuxの場合は以下の通り

$ ls /etc/*release
/etc/oracle-release  /etc/os-release  /etc/redhat-release  /etc/system-release
$cat /etc/os-release 

NAME="Oracle Linux Server"
VERSION="7.3"
ID="ol"
VERSION_ID="7.3"
PRETTY_NAME="Oracle Linux Server 7.3"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:7:3:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://bugzilla.oracle.com/"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 7"
ORACLE_BUGZILLA_PRODUCT_VERSION=7.3
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=7.3

$ cat /etc/oracle-release
Oracle Linux Server release 7.3

apache zeppelinでsparkが動かない問題(Service 'sparkDriver' could not bind on port 0. Attempting port 1. )の解決

apache zeppelin https://zeppelin.apache.org/チュートリアルを実行しようとした際に、ハマったのでメモ。

zeppelinはjypter notebookみたいにウェブブラウザから様々な言語(R, python, scala)やツール(spark, bigquery, hadoop等)を実行できる環境のこと。 チュートリアルとしてsparkを動かすものがあるのだが、これがエラーになっており動かない。

ログを確認すると以下のように表示されている

WARN Utils: Service 'sparkDriver' could not bind on port 0. Attempting port 1.
ERROR SparkContext: Error initializing SparkContext.

これの原因はapache zeppelinがインストールされているサーバのホストネームの設定が誤っていること。 一度誤った固定IPとそれに紐づくドメインを設定していて、そのままになっていたのを忘れていた。

誤ったIP: 196.18.35.2 誤ったドメイン: tmks0828.jp.example.com 正しいIP: 196.18.35.1 正しいドメイン: tmks0820.jp.example.com

サーバのホストネームの設定と/etc/hostsの記述を変更する

$ hostname
tmks0828.jp.example.com

$ hostname tmks0820.jp.example.com

$ hostname
tmks0820.jp.example.com

$ vim /etc/hosts

....
196.18.35.1 tmks0820.jp.example.com
....

zeppelinを再起動すると、チュートリアルのsparkを実行することが出来た。