コピペ誤爆対策

SQLをコピペでデータベースに投入するときとか、rootでコマンドコピペ作業するときとか、コピペする内容は意図通り? さっきみたメールの本文だったりしないか? と不安になるときもある。

pbwatchというコマンドラインツールを作ってみた。ターミナル上でクリップボードのテキストをターミナル上で表示しつづけるだけのシンプルツール。Macオンリーです。

20160721-pbwatch-demo

ちなみに別解としては、シェルで $ while [ 1 ] ; do clear; pbpaste; sleep 1; done とかでもほぼ同じことはできたりする。

前職でWindows使ってたときはこういうフリーソフトがあって使ってたんだけど、今はMac使っててMacでもシンプルなツールないかと探してみたもののこのくらいシンプルなのが無かったのでGoでコマンドラインでいいやと作ってみた次第。コピペ前にテキストエディタとかに貼り付けて確認(無意識的に)してるかもしれないけど、少し手間が減って良さそう。

英語学習 x コマンドラインツール

最近Skypeで英会話レッスンを受けてレッスン後には復習をさっとやるのですが、辞書を引く、単語の発音確認などの作業をささっとコマンドラインツールで出来たらとおもいまとめてみました。ほぼMac限定です。

辞書

open dict://WORDでターミナルからMac付属のDictionaly.app(辞書.app)を開ける

$ open dict://Hello

.bashrc, .zshrcなどにエイリアス登録しとくと$ dict Helloで使えて便利。

function dict {
  if [ $# -eq 0 ]; then
    echo "Usage: dict WORD" 1>&2
    return 1
  fi
  open dict://$@
}

あらかじめDictionaly.appの設定で必要な辞書(英英、英和、和英などなど)好みの設定にしておくとよい。

UPDATE 2015/10/12

はてブコメント経由で辞書引いた結果をターミナル内で完結しないのか、というのがあり調べてみた。

jakwings/macdictというのが良さそう。CLIオプションで辞書を選択できるようになってた。またsekimura/lookupというのも見つけたがこちらは任意の辞書選択は出来ないみたい。

ただ文字列を整形して(例えばmanみたいに)出してくれる訳ではないのでやはり読みやすくはないので、個人的な意見としてはopen dict://で辞書アプリに飛ぶ方が良いかなー。

発音確認

sayコマンドでMacが喋り出す。

$ say "Bob’s mother became sick three month ago"

-r NUMBERオプションで1分間のワードレートを変更できる。-r 100くらいにするとゆっくり喋ってくれる。

$ say -r 100 Please speak slowly

自分の発音を録音し即時再生

soxコマンド付属のコマンドを使うとコマンドラインで録音、オーディオファイル再生ができる。

インストール。sox, rec, playコマンドがインストールされる。

$ brew install sox

以下のコマンドで録音 -> Ctrl-cで録音終了 -> 即時再生となる。簡易ボイスレコーダになって便利。

$ rec /tmp/a.wav; play /tmp/a.wav; rm /tmp/a.wav

Input File     : 'default' (coreaudio)
Channels       : 2
Sample Rate    : 44100
Precision      : 32-bit
Sample Encoding: 32-bit Signed Integer PCM

In:0.00% 00:00:01.83 [00:00:00.00] Out:79.9k [   ===|===   ]  Clip:0
...

.zshrc, .bashrcなどにalias rec-play='rec /tmp/a.wav; play /tmp/a.wav; rm /tmp/a.wav'としておくと便利。

いろいろ便利。

daemontoolsインストール後にトラブった

普段と違うで順でマシンをセットアップした時のこと。daemontoolsまわりたまにハマると詰んだ。メモメモ。

  • CentOS 6.3
  • upstart経由でsvscanbootを起動させる

こういう構成

daemontoolsをrpmからインストールした後、上げたいプロセス(mysqld)が起動しなくて困った。

svscan: warning: unable to start supervise mysql: file does not exist

こういうエラーが出てる。でもためしにupstart経由せずマニュアル $ svscan /service で起動するとうまく起動する。$PATH確認してみたりパーミッション確認したりしたが問題なさそう。英語Q&AサイトでOS再起動したら治るよ、っていう記述があって乱暴だな…とおもったのだが。困ったときのreboot、マシンを再起動したらupstart経由でデーモン起動できた。謎…。

スキマトークで英会話レッスン受けてみた

スキマトークというSkypeを使ってネイティブと英会話レッスンできるサービスを使ってみた。

10月に海外出張行く関係で、会社で英会話レッスン(実際に会って会話する1 on 1 レッスン)を週1受けることになった。あまり時間はなく付け焼き刃感はあるもののいずれにせよ誠にありがたい。

先日1回目があり、レッスン終わりに次回日程を決め次回は1週間後となったのだけど、はてそこでおもったのが1週間に1回の英会話レッスンで英語が流暢に話せるようになるだろうか?….なるいやなるわけがない!ということ。最近筋トレしていて時々筋トレ基準で考えることがあるのだけど週1回30分筋トレだけでマッチョになるわけはない。

Listeningについては数ヶ月前からHuluで毎日寝る前に聞いてる一応鍛えてる。でもSpeakingは英会話レッスン以外で機会を作れない。そこでレッスン頻度を増やすべきだと考えた。ひとつは、会社に頼んで回数を増やしてもらう。この調整はできそうではあるが、社内英会話とは別のやりかたを混ぜてやってみるのも面白そうだったのでSkype英会話を試してみた。

前置きが長くなったがスキマトークを利用してみた。他にも似たサービスは沢山あるが比較検討はしてない。選択理由はスキマトークの割引が受けれたからでとりあえず使ってみて良かったら継続してみよう、くらい。ちなみに私は回し者ではないことを断っておく。

週末1回、平日1回計2回とりあえず受けてみた。

  • 世界中からネイティブの先生が登録されている
  • 自分にあうレッスンをサイトから探して、時間を決めて先生を選ぶ
  • レッスン時間になるとskypeで先生から電話がかかってくるのでレッスンのスライドを見ながら進める
  • 値段は9コイン(=$9)前後/30分、先生によって値段がちがう
  • 授業後は、生徒から先生をレーティングできる

こんな感じ。Airbnbの英会話版みたいなとは言い過ぎかもしれないけどそういう印象で、先生を評価できるので沢山レビューもらった先生はより授業のofferが来る仕組みのようだ。そうすると先生もより熱心に頑張るのかなという印象。

初回登録したとき初回10コインもらえたので1回目は実質無料で受けることができた。2回めは10コインクレジットカードでチャージした。

1回目は何も考えずに適当に先生を選んでみたらSouth Englandの先生でイギリス英語アクセントでそれはそれで興味深かった。1回目の先生は真面目で淡々とレッスンを進めるタイプでところどころ発音を丁寧に教えてくれた。1回目の先生はイギリス英語でかっちりした発音で聴きやすかった。

また2回目はアメリカのフロリダ出身で今現在はシンガポールで英語の先生をしていて普段は子供に教えてるとのこと。朝の授業にもかかわらず明るい授業をありがとうございます。2回目の先生はアメリカ英語なので流れるような流暢さ++で個人的には聞き取りにくい部分もあった。

先生によって訛りが異なるので個人的には色々な発音が聞けて面白いとおもった。また先生は毎回変えれるので合わなかったら変えることができて良いなと。実際の英会話学校だと先生変えるのって気を使うのかな?(通ったことないから分からない)

あとSkype英会話の良いなとおもったのは、授業中に指摘されることをリアルタイムにSkypeチャットで先生がメモしてくれること。アクセントとか、間違った文法を正してくれたり。授業後に振り返る時にとても助かるのでこれはいいなとおもった。

2回受けての感想としてはSkype英会話便利だった。家の外にでずに隙間時間でさくっとできて便利。

当面の目標は出張用なのでレッスン内容をも少し考えたいところ。

Hugoに移行

ブログのツールをOctopressからHugoに移行した。

週末の時間を利用してHugoに移行してみた。HugoはGoで作られた静的サイト生成ツール。

移行は案外大変だったけどhugoのコンパイル処理がサクサク動いて良い感じ。デザインも変えてみた。

h2oでreverse proxy

HTTP/2対応の高速なHTTPサーバ、h2oを使ってみた。

今回、HTTP/2でリクエスト受けて裏側のアプリサーバへHTTP/1.1で流すreverse proxyとして動かしてみた。reverse proxy先へはunix domain socket経由で、またdaemontools経由で起動させるようにした。

環境

  • h2o v1.4.3
  • OS CentOS 6.5

インストール

自前でbuildした

cmake & libyaml

$ sudo yum install cmake libyaml

libuv

libuv 1.0.0 以上が必要。CentOSのパッケージのバージョンは古いため自前でbuild。libuvをbuildするためにはlibtoolが必要だったのでyumで入れた。

sudo yum install libtool
cd /var/tmp
wget https://github.com/libuv/libuv/archive/v1.7.0.tar.gz
tar zxvf v1.7.0.tar.gz
cd libuv-1.7.0
./autogen.sh
./configure --prefix=/usr/local/libuv-1.7.0
make
sudo make install

h2o

cd /var/tmp
wget https://github.com/h2o/h2o/archive/v1.4.3.tar.gz
tar zxvf v1.4.3.tar.gz
cd h2o-1.4.3/
PKG_CONFIG_PATH=/usr/local/libuv-1.7.0/lib/pkgconfig/ cmake -DWITH_BUNDLED_SSL=on -DCMAKE_INSTALL_PREFIX=/usr/local/h2o-1.4.3 .
make
sudo make install
sudo ln -s /usr/local/h2o-1.4.3 /usr/local/h2o

設定

設定はこんな感じ。

#/etc/h2o/h2o.conf
---
max-connections: 1024
num-threads: 4
user: nobody
hosts:
  "www.example.com:80":
    listen:
      host: 0.0.0.0
      port: 80
    paths:
      "/":
        redirect: https://www.example.com/
  "www.example.com:443":
    listen:
      host: 0.0.0.0
      port: 443
      ssl:
        certificate-file: /etc/h2o/www.example.com.cer
        key-file: /etc/h2o/www.example.com.key.pem
    proxy.timeout.io: 30000
    paths:
      "/":
        proxy.reverse.url: http://[unix:/tmp/unicorn.sock]/
        proxy.preserve-host: ON
      "/assets":
        file.dir: /path/to/app/public/assets
access-log: /var/log/h2o/access.log
error-log: /var/log/h2o/error.log
pid-file: /var/spool/h2o/pid
http2-reprioritize-blocking-assets: ON
  • 基本HTTPSで受ける(HTTPできたらHTTPSにリダイレクト)
  • 裏側のアプリ(Rails)とのつなぎはTCPではなくunix domain socket経由にしてみた

起動スクリプト

ちゃんと動かすために今回はdaemontools経由で起動させてみた。

#/service/h2o/run
#!/bin/sh
exec 2>&1
DAEMON=/usr/local/h2o/bin/h2o
CONFIG=/etc/h2o/h2o.conf

if [ ! -x "$DAEMON" ]; then
  echo "not executable: $DAEMON" >&2
  exit 1
fi

# Test configuration
$DAEMON -t -c $CONFIG
if [ $? -ne 0 ]; then
  echo "Failed to test $CONFIG" >&2
  exit 1
fi

ulimit -n 32896

exec 
  setuidgid root 
  $DAEMON 
  -m master 
  -c $CONFIG 
  ;
  • -t で起動せずコンフィグのsyntaxチェックできる。
  • -m master でh2oを起動するとデーモンモードで動く。HUPシグナルを受け取るとgraceful restartしてくれるモード。
  • -m asterで起動すると中ではServer::Starterがh2oを起動してる
  • abで負荷かけつつサーバ側でwhile [ 1 ]; do sleep 1 ; echo ok ; svc -h /service/h2o/ ; doneやってみたけど無事捌いてくれた。

まとめ

以上、h2oを動かした。

社内にあるほぼ個人プロジェクトサイトをSSL化するついでにnginxからh2oに置き換えて様子見中。自分で構築したサイトでChromeのSPDY indicatorが青く(HTTP/2)に光るの嬉しいな。

参考

SmokePingをPlack + Perlbrew + Alien::RRDtoolで動かす

SmokePingをApache+CGIではなくPlackだけで動かしてみた。

以前書いたSmokePingをインストールしてみたという記事ではシステムPerl + Apache CGI + yumからrrdtool, rrdtoo-perlをインストールする方法でやったが、今回は違う方針で入れてみた。

やりたいこと

  • システムPerlではなくperlbrewで入れたperlを使う
  • PlackでApache無しでWeb画面を立ち上げる

なお、RRDToolをシステムのパッケージシステムからインストールしPerlで使おうとするとCentOSの場合、rrdtoolとrrdtool-perlを入れることになる。rrdtool-perlを使うにはシステムPerlを使わなければならず、今回やりたいperlbrew perlを使えない。そこでAlien::RRDtoolを使ってrrdtoolをbuildすることでRRDToolをperlbrew perlで使えるようになる。Alien::RRDtoolは@gfxさんのAlien::RRDtool – RRDtoolをCPANから入れるが大変参考になる。

Plack化するためCGI::Emulate::PSGIを使う。

以下CentOS6での作業

RRDToolのbuildに必要なパッケージを入れる

# yum install cairo cairo-devel pango pango-devel libxml2-devel bitmap-console-fonts vlgothic-fonts vlgothic-fonts-common

PerlbrewでSmokePing用Perlをbuildする

perlbrewの--asオプションを使ってperlを名前付きでインストールする。今回の作業で必須ではないが、perlのバージョンを上げたいときに普通にインストールするとshebangのパスを書き換えないといけないが、--asオプションを付けると変えなくて済むので便利。

まずsmokepingユーザを作成する

# groupadd smokeping
# useradd smokeping -g smokeping
# su - smokeping

続いてperlbrewをsmokepingユーザ環境化に入れる

$ curl -L http://install.perlbrew.pl | bash
$ echo 'source $HOME/perl5/perlbrew/etc/bashrc' >> ~/.bashrc
$ source ~/.bashrc

build

$ perl_version=5.20.2
$ perl_name=smokeping
$ perlbrew install $perl_version --as $perl_name  -j 4 -v 
   => ~/perl5/perlbrew/perls/$perl_name にperlがインストールされる

SmokePingのsourceをダウンロード

次のcpanmの工程で必要なので、まずsourceをダウンロードしておく

$ wget http://oss.oetiker.ch/smokeping/pub/smokeping-2.6.11.tar.gz
$ tar zxf smokeping-2.6.11.tar.gz
$ cd smokeping-2.6.11

CPANモジュールインストール

SmokePingが依存するCPANモジュール、 Alien::RRDtool、Plack関連モジュールをインストールする

まず、perlbrew perlを使ってまずcpanmを入れる

$ perlbrew use $perl_name
$ curl -L https://cpanmin.us | perl - App::cpanminus

続いてcpanmを使ってperlbrew perl以下にCPANモジュールをインストール

$ cpanm Alien::RRDtool CGI::Emulate::PSGI Plack `cat PERL_MODULES`

PERL_MODULESはSmokePingのsourceに含まれているファイルでインストールすべきモジュールリストが定義されているのでここでインストールしておく。

SmokePingをインストール

SmokePingを普通に./configure -> make -> make installするとシステムPerlを使おうとするので一工夫が必要で、configure時にPERL環境変数で使うperlを指定することが出来る。また--enable-pkgonlyオプションを指定することでSmokePingのインストーラ自身がCPANモジュールをインストールするのを止めている。

$ PERL=/home/smokeping/perl5/perlbrew/perls/smokeping/bin/perl ./configure --prefix=/usr/local/SmokePing --enable-pkgonly
$ make 
$ sudo /usr/bin/gmake install
$ sudo chown -R smokeping:smokeping /usr/local/SmokePing

本当にperlbrew perlを使ってるかshebangを確認してみる

$ head -1  /usr/local/SmokePing/bin/smokeping
#!/home/smokeping/perl5/perlbrew/perls/smokeping/bin/perl

plackupする

準備は整ったのでsmokepinユーザでplackupしてみる。なお今回は/smokepingをSmokePingのrootにした。

まず、SmokePingの設定ファイルのうち以下の項目の修正が必要。

imgcache = /usr/local/SmokePing/cache
imgurl   = /smokeping/cache
cgiurl   = http://localhost:5000/smokeping/  # URLは適宜読み替えてください

以下のapp.psgiを/usr/local/Smokeping/に置く。

use warnings;
use strict;

use Plack::Builder;
use CGI::Emulate::PSGI;
use CGI qw();

use Smokeping;

my $smokeping = sub {
    CGI::initialize_globals();
    my $q = CGI->new;
    # 適宜configは作成してください
    Smokeping::cgi("/usr/local/Smokeping/etc/config", $q);
};
$smokeping  = CGI::Emulate::PSGI->handler( $smokeping );

builder {
    use Plack::App::File;
    mount "/smokeping/cache" => Plack::App::File->new(root => './cache')->to_app;
    mount "/smokeping/cropper" => Plack::App::File->new(root => './htdocs/cropper')->to_app;
    mount "/smokeping" => $smokeping;
};

/cacheと/cropperはそれぞれ画像ファイルとjsファイルの参照のため。

plackup

$ cd /usr/local/SmokePing
$ plackup

http://localhost:5000/smokeping でweb画面が見れます!!!

あとはpingプロセスを立ち上げる。これもsmokepingユーザで動かす。別途fping等インストールしておく。

$ /usr/local/SmokePing/bin/smokeping

まとめ

何がいいの? システムPerl使いたくない人向け。また管理画面なのでCGIでも十分ではあるけどApache立てずに動かしたい人には便利。