vagrantでweb開発をするのに必要なtips

vagrantでweb開発する際のハマりどころがいくつかあります。

まず、vagrantでは/vagrantが共有フォルダの役割を果たして便利なわけですが。

そこに/var/www/htmlのシンボリックリンクをはると、mac側でプログラムを変更しながら、linuxサーバー上での挙動を色々と見れます。
macのお気に入りのエディタで、プログラムを編集して、それをlinuxサーバー上で動かし、随時変更していけるわけです。

sudo rm -rf /var/www/html
sudo ln -fs /vagrant /var/www/html

でOKです。

これで/vagrant内のファイルを192.168.33.10というIPアドレスを使ってアクセスできます。

でめでたく、webサイトのテストができるようになるんですが、一つ問題点があります。
例えば、index.htmlを編集後、ブラウザをリロードしても全く反映されません。

これがわからなくてしばらくハマったのですが、これはvagrantの共有フォルダ/vagrantが外部ハードディスクのような扱いで、httpdがこのフォルダ内の更新を検知できないためです。ブラウザのキャッシュの問題ではないということです。懸命にブラウザのキャッシュを消して見たり、デベロッパーツールからdisable cacheをやったり、command+Rで更新しても、更新ボタンを長押しして「キャッシュのハード読み込みとキャッシュの消去」をしても意味がありません。サーバー側の問題なので。

httpd.confにキャッシュしない設定を追記する。(要再起動)

<Directory /var/www/html >
EnableMMAP Off
EnableSendfile Off
</Directory>

として、systemctl restart httpd
とすることで問題が解決できました。
よかったよかった。

Packtの技術本を買ってkindleで読んでみる

Packtは結構マニアックなプログラミング本の電子書籍を売ってる会社ですが、
年末にセールをやります。
1冊の価格が5ドルと激安です。
通常価格が、40ドルぐらいだから、買うんだったら今ですよね。
でも、買ったわいいが、読みづらいというのは最悪ですよね。

でもこれkindleに送ってkindle端末で読むことができるんですね。
amazon電子書籍を買うのと全く変わりません。

kindleに送るというのがあって、各kindle端末には独自のkindleメールアドレスがあって、そこに送るんですね。
なんのためにこのメールアドレスはあるんやと思ってました。

awk 解読

awkってあんまり使わないのでメモ

#!/usr/bin/env bash
if [ $# != 0 ]; then
 cat ${1} | awk -v"tab=${2}" 'BEGIN {a=0} {if ($0 ~ tab) {a = 22}; if (a==22) {if ($0 ~ "loop") a+=1} if (a==23) {if (length($0) < 2 || $1 ~ "data_") {exit} else {print $0} }}'  |grep -v "loop_" > tmp.dat
 if [ $# == 2 ]; then
    awk '{if (index($1,"_")!= 1) print; }' < tmp.dat
 else
  awk '{if (index($1,"_")!= 1) {j++; print j;} }' < tmp.dat > tmp1.dat
  for (( c=3; c<=$#; c++ ))
   do
    awk -v"label=${!c}" '{i++; if ($1 ~ label) {col = i}; if (index($1,"_")!= 1) { j++; print j, $col} }' < tmp.dat >tmp2.dat
    join tmp1.dat tmp2.dat > tmp3.dat
    mv -f tmp3.dat tmp1.dat
   done
   awk '{for (i=2; i<=NF;i++) printf("%s%s", $i,(i==NF) ? "\n" : OFS)}' <tmp1.dat
 fi
 rm -f tmp.dat tmp1.dat tmp2.dat tmp3.dat
else
 echo " === Usage: === "
 echo " ${0} <starfile> <tablename> <label1> <label2> ..."
 echo " "
 echo " === Purpose: === "
 echo " This (bash) script prints the contents of a datablock (with name tablename) from a starfile"
 echo " If any labels are given, then only those will be printed "
 echo " "
 echo " === Example: === "
 echo " ${0} run3_it024_model.star data_model_class_1 _rlnResolution _rlnSsnrMap"
fi

を解読していくと。

このプログラムの使い方は
" ${0} ..."
という感じなので、

if [ $# != 0 ]; then

引数がプログラム(${0})だけじゃなかったら

 cat ${1} | awk -v"tab=${2}" 'BEGIN {a=0} {if ($0 ~ tab) {a = 22}; if (a==22) {if ($0 ~ "loop") a+=1} if (a==23) {if (length($0) < 2 || $1 ~ "data_") {exit} else {print $0} }}'  |grep -v "loop_" > tmp.dat

${1}は"starfile"なので
cat ${1}でファイルを読み込む
それをパイプでつないで、awkに渡す。

awk -v"tab=${2}"

tabに"tablename"を代入している。

'BEGIN {a=0} {if ($0 ~ tab) {a = 22}; ....

aは最初0で目的の"tablename"が見つかったら、aに22を代入する。
$0はファイルの1列目の値

例えば、awkでは

みかん りんご ばなな
すいか きゅうり うり

ファイルの中身がこんな感じなら、1行ずつ読んでいって、
$0 = ”みかん”,$1 = "りんご", $2 = "ばなな"
が代入される。
”tablename”が"すいか"なら
2行目で aに22が代入される。

 if (a==22) {if ($0 ~ "loop") a+=1} if (a==23) {if (length($0) < 2 || $1 ~ "data_") {exit} else {print $0} }}' 

そんな感じで次はloopを見つけて、$0の長さが2文字以下もしくは$1が"data_"になったら、exitするよというかんじ
それまでは $0をはき続ける。

grep -v "loop_" > tmp.dat

そんでもってloop_以外をtmp.dat に出力。
grep -vオプションはそれ以外を出力という意味

cuda7.5をインストールする際にとまどったので

以前にcuda6.5をいれていて、cuda7.5にアップグレードしたくなりました。
使いたいソフトがcuda7.5対応だったので。

/usr/bin/nvidia-unistall
/usr/local/bin/cuda-6.5/uninstaller.pl 

とどっちも消したのだけど、なんか旧バージョンが残ってるよというエラーでこけちゃったので、/var/log/nvidida-installer.logを見ていたら、

yum remove xorg-x11-drv-nvidia\* kmod-nvidia\*
せよとなっていたので、
指示にしたがって実行してみた。

これでinstallはできた。

あとはPATHとLD_LIBRARY_PATHを設定して完了。

ツツミの分析

2016年12月4日
株価 1856円
時価総額373億円

29.3.第2四半期短信
現金 380億円
負債13億円
換金性のある資産は367億円

商品160億円

イメージとしては今の株価はほぼ手持ち現金と一緒。
今後、持ち直すならかなり安いが。

創業家の堤征二が48.4%の株式を保有している。

RSIが100近いので買うのは今ではない感じだが、かなり安いとも思う。

phantomjs を適切にストップするには

phantomjsは便利なんだけど、プロセスが何故かゾンビ化してリソースを圧迫するなんてことがあります。
python + selenium + phantomjsで運用していますが、
大抵は、dirver.close()、dirver.quit()でスットプできますが、たまに生き残ります。

pgrep phantomjs | xargs kill

シェル側からphangomjsを強制的にkillしてしまうのが確実で、これをpython スクリプトに仕込んどけばOKです。
ただし副作用もあって、これだと他のすべてのphantomjsをkillしちゃうので、人を選ぶわけです。

import signal

driver.service.process.send_signal(signal.SIGTERM) # kill the specific phantomjs child proc
driver.quit()                                      # quit the node proc

といのが良いのかなという感じみたいです。