Mazn.net

やってみて 調べてみて 苦労しなけりゃ 箱は動かじ

cygwin

Cygwinでssh-agent

~/.bash_profile に以下を記述しましょう。ターミナル(bash)起動時に自動起動します。

SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

mosh(クライアント)のインストール@cygwin

mosh (mobile shell) は、NWが不安定で接続が切れたり、IP が変わっても接続を維持することがsshです。

主要なLinuxでは、バイナリパッケージがあるので、簡単にインストールできるのですが、cygwin から接続したい場合、cygwin向けのバイナリがないので、自分でコンパイルする必要が出てきます。

コンパイルは、https://gist.github.com/eerohele/2349067 を参考に実施しましたが、最新のcygwinやmoshでは若干異なるので、以下にメモ残します。

使用したバージョンは、mosh-1.3.2 + protobuf-3.5.1です。

まずはcygwinに必要なパッケージですが、私の環境では以下をインストールしました。

gcc-core gcc-c++ make libncurses-devel pkg-config perl boost-build openssl-devel zlib-devel

moshコンパイルに必要なprotobufをコンパイルします。

$ wget https://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.tar.gz
$ tar zxvf protobuf-all-3.5.1.tar.gz
$ cd protobuf-3.5.1
$ ./configure
$ make
$ make install 
$ cd ..

moshをコンパイルします。

$ wget https://github.com/mobile-shell/mosh/releases/download/mosh-1.3.2/mosh-1.3.2.tar.gz
$ tar zxvf mosh-1.3.2.tar.gz
$ cd mosh-1.3.2
$ ./configure CPFLAGS="-I/usr/include/ncurses" PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
$ make
$ make install

以上で、mosh コマンドが使えるようになりました。

WSL1のプロセスのfork性能を測ってみた

Windows上では今までCygwinを使っていたのですが、Cygwinはプロセスのforkの性能が遅く、全体的に遅かった。そこで、2016/8 にリリースされたWindows 10のbash (win-bashと略す)のfork性能がCygwinと較べてどのくらい早いのか比較してみた。

使用CPU : Core i5 6200U

まずはCygwin。1秒間にdateコマンドを20回ぐらい起動できた。(最初の1秒間は7回とかなり遅い)

$ while (true); do date; done | uniq -c
      7 2016年 8月 11日 木曜日 00:35:32 JST
     18 2016年 8月 11日 木曜日 00:35:33 JST
     24 2016年 8月 11日 木曜日 00:35:34 JST
     19 2016年 8月 11日 木曜日 00:35:35 JST
     20 2016年 8月 11日 木曜日 00:35:36 JST
     20 2016年 8月 11日 木曜日 00:35:37 JST
     20 2016年 8月 11日 木曜日 00:35:38 JST
     21 2016年 8月 11日 木曜日 00:35:39 JST
     18 2016年 8月 11日 木曜日 00:35:40 JST
     23 2016年 8月 11日 木曜日 00:35:41 JST

次はwin-bash。dateコマンドは30回程度とCygwinより若干性能はよい。

$ while (true); do date; done | uniq -c
     30 2016年  8月 11日 木曜日 00:36:06 DST
     34 2016年  8月 11日 木曜日 00:36:07 DST
     33 2016年  8月 11日 木曜日 00:36:08 DST
     33 2016年  8月 11日 木曜日 00:36:09 DST
     33 2016年  8月 11日 木曜日 00:36:10 DST
     32 2016年  8月 11日 木曜日 00:36:11 DST
     32 2016年  8月 11日 木曜日 00:36:12 DST
     33 2016年  8月 11日 木曜日 00:36:13 DST
     32 2016年  8月 11日 木曜日 00:36:14 DST
     33 2016年  8月 11日 木曜日 00:36:15 DST

同PC上のVirtualBox上のUbuntu 14.04 上でも計測してみた。

$ while (true); do date; done | uniq -c
    281 2016年  8月 11日 木曜日 14:20:38 JST
    518 2016年  8月 11日 木曜日 14:20:39 JST
    438 2016年  8月 11日 木曜日 14:20:40 JST
    415 2016年  8月 11日 木曜日 14:20:41 JST
    340 2016年  8月 11日 木曜日 14:20:42 JST
    340 2016年  8月 11日 木曜日 14:20:43 JST
    319 2016年  8月 11日 木曜日 14:20:44 JST
    275 2016年  8月 11日 木曜日 14:20:45 JST
    258 2016年  8月 11日 木曜日 14:20:46 JST
    255 2016年  8月 11日 木曜日 14:20:47 JST

桁が違う・・・ やっぱりネイティブなLinuxと比べると、win-bashはかなり遅そうだ。

2017/4/16追記

Windows 10 Creators update にアップデートして計測してみたが、差異なし

$ while (true); do date; done | uniq -c
      9 2017年  4月 16日 日曜日 22:37:40 DST
     32 2017年  4月 16日 日曜日 22:37:41 DST
     30 2017年  4月 16日 日曜日 22:37:42 DST
     31 2017年  4月 16日 日曜日 22:37:43 DST
     31 2017年  4月 16日 日曜日 22:37:44 DST
     30 2017年  4月 16日 日曜日 22:37:45 DST
     30 2017年  4月 16日 日曜日 22:37:46 DST

Cygwinでscreenコマンドが使えなくなる@Windows 10

Windows 10 上のCygwin (64bit版使用)で、screen コマンドを実行して、一度exitすると、2回目以降のscreenが以下のように失敗してしまうので、対処方法をメモしておきます。

$ screen.exe
Directory '/tmp/uscreens' must have mode 777.

 

エラーメッセージの通り、/tmp/uscreens のパーミッションがおかしいようですが、chmod 777 /tmp/uscreens を実行しても変更できません。

グループの所有者を変更するといけるようです。

$ chgrp users /tmp/uscreens
$ chmod 777 /tmp/uscreens

 

参考 : https://www.cygwin.com/ml/cygwin/2015-05/msg00034.html

cygwin ck のダブルクリック選択文字列の範囲を変更する

Cygwin 用のターミナルソフトウェア cygwin ck  を便利に使わせてもらってますが、唯一不満な点が一つあり、ターミナル上でマウスをダブルクリックした際に選択される文字列が TeraTerm と違い、"_ (アンダーバー)" や ". (ドット)" 等の文字も区切り文字として認識されるため、コピーアンドペーストが使いにくく感じてました。

設定ファイル (.ck.config.js) でも変更できないようなので、ソースを覗いてみたところ、ハードコーディングされていたので、自分で修正してみました。

修正箇所は、screen.cpp ファイル 617行目の以下の変数です。 (ck-3.6.3のソースを使用)

static const wchar_t  BREAK_CHARS[] = L"\"&()*,.-_/:;<=>@[\\]^`'{}~\x3000\x3001\x3002\x300C\x300D\x3010\x3011" ;

この変数に区切り文字が定義されていますので、このように変更しました。

static const wchar_t  BREAK_CHARS[] = L"\"()*,:;<=>@[\\]^`'{}\x3000\x3001\x3002\x300C\x300D\x3010\x3011";

上記では、"& . - _ / ~" を削除しています。

 

以前書いた基本設定編はこちら

CygwinでWindowsの拡張子に関連づけられたファイルを簡単に開く

Cygwin 使っていると、コマンドラインでいろいろと処理したくなりますよね?

Cygwin 付属のアプリケーションなら、通常はコマンドにパスが通っているので簡単に立ち上げることができますが、Windows アプリケーションの場合はパスが通ってないので、ファイルを開くのに苦労します。

そのような時は、cygstart コマンド使えば楽ちんです。cygstart はファイルの拡張子に関連づけられたWindowsのアプリケーションを開いてくれます。例えば、

# cygstart hoge.txt

とすれば、Windowsのテキストエディタ(デフォルトはメモ帳?)が起動します。 (テキストファイル開くぐらいならviで十分だが・・・)

Cygwin で Ctrl-C が効かない

Cygwin 上でCtrl-Cが効かないという話がネット上に転がっていて、最近のCygwinでは直ってるようですが、なぜか私の環境では最新(Cygwin 1.7.20)にしても未だにCtrl-Cが効かないので調べてみたら、TeraTerm を Cygwin のターミナルに使っているのが原因っぽい。

TeraTermでCygwinに繋げて、ssh で他のサーバにログインしているのだが、表示もかなり遅く、大量のファイルのあるディレクトリをlsで見ると、putty で1秒以内に終わる表示がTeraTerm + Cygwinだと数十秒も要する。

ということで、Cygwin のターミナルを、ck に変更したところ、Ctrl-C は効くし、表示速度も不満がなくなった。

ターミナルは、Cygwin 付属の mintty でもよいが、ck は今でも更新されていて個人的にはminttyより使いやすい気がするので、ck に乗り換えることにしました。

cygwinでWindowsのコマンド(ipconfig等)の文字化けを解消する

WindowsのコマンドをCygwin上で実行すると文字化けしてしまいます。これはWindowsコマンドの出力の文字コードがShift-JISであるのが原因なので、これをUTF-8に変換してあげれば解消できます。

変換にはnkfコマンドを使います。cygwinのパッケージにはないので、自分でソースダウンロードしてコンパイルし、/usr/bin にコピーしておいてください。

あとは、以下のように文字化けするコマンドを変換するスクリプトを~/.bashrc などに記述してcygwin起動時に読み込まれるようにしておきます。下記例ではipconfig, route ,netstat コマンドを変換対象にしていますが、他のコマンドも変換したいならば、WINCMDS変数に変換したいコマンドを追加してください。

WINCMDS="ipconfig route netstat"
for i in $WINCMDS; do
    alias $i="wincmd $i"
done

function wincmd() {
    local CMD=$1
    shift
    ($CMD $* 2>&1 | nkf -w | dos2unix) 2>&1 | nkf -w | dos2unix 1>&2
}

vimでBackSpaceが効かない@Cygwin

Cgywin上で、BackSpace が効かず、文字が消せない場合は、~/.vimrc  に以下のように追記するとOKです。

set backspace=indent,eol,start

コマンドラインからWebページを画像として保存@CygwinやLinux

スクリプトでWebページを保存するにはwgetを使えば簡単に実現できますが、これはあくまでもhtmlファイルや画像ファイルをそのまま保存するだけです。

Webページの表示そのものを画像として保存するには、ブラウザで表示して画面キャプチャすればよいのですが、これはスクリプトではできません。そういうときはwkhtmltopdf というツールが便利。Webページの表示をPDFや画像として保存できます。

PDFで保存するときは、 wkhtmltopdfコマンド を、画像で保存する場合はwkhtmltoimageコマンドを使用します。

使い方は簡単で画像の場合は、

# wkhtmltoimage.exe http://www.google.co.jp/ google.jpg

で画像化できます。オプション--crop-h  --crop-wを使えば一部を切り出すこともできます。

# wkhtmltoimage.exe --crop-h 500 --crop-w 700 http://www.google.co.jp/ google.jpg

上記の例では左上を基準に高さ300ピクセル、幅700ピクセルで保存されます。

google.jpg

切り出しの始点は、--crop-x や--crop-y で変更可能です。

# wkhtmltoimage.exe --crop-h 300 --crop-w 700 --crop-x 100 --crop-y 100 http://www.google.co.jp/ google.jpg

JavaScriptも処理できますので、Google Mapなども切り出し可能です。しかし画像のロードが遅延すると完全なマップがとりだせません。そういうこときは、--javascript-delay や --load-error-handling オプションを使ってあげます。また、--widthで前提とするブラウザの画面の横幅を変更することも可能です。

# wkhtmltoimage.exe --width 1280 --javascript-delay 10000 --load-error-handling ignore ・・・・以下省略

コマンドラインで画像編集@Cygwin

シェルスクリプトで画像を扱いたい場合は、 ImageMagick というソフトが便利。Linuxのディストリビューションには付属しているものもある (convertコマンド) が、CygwinにはないのでこれをインストールすればOK。

どんなことができるか簡単に紹介します。

画像フォーマット変換 (abc.gif をdef.jpgに変換)

# convert abc.gif def.jpg

画像サイズ変更

# convert abc.gif -resize 150% output.gif

画像結合 (上の画像 abc.jpg , 下の画像 def.jpg)

# convert append abc.jpg edf.jpg  output.jpg

文字(hoge)を入れることだってできちゃいます。

convert -pointsize 30 -draw "text 0,30 hoge"  abc.jpg def.jpg

0,30は、文字列の左下の座標です。0,0にすると文字が見えなくなるので注意。

Cygwin 1.7 の起動が遅い@ Windows 7 x64

PuttyやCygterm で cygwin を起動しているのですが、コンソールが起動するのに7~8秒もかかり、コンソールを大量に立ち上げる時は、かなりストレスがたまります。

これはcygwinのforkが遅いのが原因で、特に64bit環境で遅いのが原因のようで、起動時に呼び出される/etc/profileの実行時間が大半のようです。

試しに実際に起動後のプロンプトでbashを実行してもすぐに応答が返ってきますが、bash --loginを実行すると時間がかかってしまいます。

/etc/profileの処理を--noprofile オプションをつけてスキップさせることはできますが、これだといろいろと必要な環境変数がセットされないので、かなり使いにくい。

そこで、起動時に不要な処理をスキップさせるように、/etc/profileの処理を追ってみたところ、どうも一番重い処理は/etc/bash_completionのようです。

bash_completion ファイルは、TABを押して補完できる文字列を拡張する設定ファイルです。このファイルの処理をスキップしても、通常の単純な補完は動作するので、この処理をスキップすることにしました。

スキップ方法は、 /etc/profile.d/bash_completion.sh の1行目に、returnコマンドを挿入するだけです。

これで、2~3秒ぐらいでcygwinが起動するようになりました。(これでも遅いけど・・・)

ck@cygwin 1.7

cygwin 1.7 より前では、ターミナルエミュレータにckを使っていたのですが、cygwin 1.7から動かなくなってしまったので、仕方なく mintty や poderosa を使用してきました

しかし、mintty はフォントの色をうまく変更できなかったり、poderosaは動作が少し不安定だったりしたので、困っていました。

それが、とうとう cygwin 1.7 に対応したckを公開してくれた人がいましたので使用させて頂きました。 これで、元の cygwin 生活に戻れそうです。

インストール方法は簡単で、zipを展開してck.app.dll, ck.con.exe, ck.exe を cygwinの/binにコピーします。さらに。.ck.config.js を自分のホームディレクトリにコピーします。

起動は、ck.exe を起動するだけです。

.ck.config.js は設定ファイルです。デフォルトでは(vista以上では?)透過ウィンドウになっていて見にくいため、

Config.window.transparent = 0;

にすることをお勧めします。またデフォルトのウィンドウサイズは小さいため

Config.window.cols = 160;
Config.window.rows = 45;

としています。さらに、バックグラウンドが黒で濃い青は見にくいため、色設定を以下に変更してあげました。

Config.window.color_color4 = 0x5555cd;
Config.window.color_color12 = 0x5555ff;

さらに、自分好みに少し改造もしてみました。↓

cygwin ck のダブルクリック選択文字列の範囲を変更する

minttyの色変更を変更する@Cygwin 1.7

最近、Cygwin 1.7でコンソールにminttyを使用してます。

このminttyでsshを使って、他のシステムにログインしているのですが、青が濃く見づらいです。こういう時は、以下のようなシェルを実行すると、色を変更できます。

#! /bin/bash
ESC="\e]4;"
echo -e \\
       "${ESC}0;#000000\\a" \\
       "${ESC}1;#ff0000\\a" \\
       "${ESC}2;#00ff00\\a" \\
       "${ESC}3;#ffff00\\a" \\
       "${ESC}4;#4444ff\\a" \\
       "${ESC}5;#ff00ff\\a" \\
       "${ESC}6;#00ffff\\a" \\
       "${ESC}7;#bbbbbb\\a" \\
       "${ESC}8;#666666\\a" \\
       "${ESC}9;#ff9999\\a" \\
       "${ESC}a;#99ff99\\a" \\
       "${ESC}b;#ffff99\\a" \\
       "${ESC}c;#9999ff\\a" \\
       "${ESC}d;#ff99ff\\a" \\
       "${ESC}e;#99ffff\\a" \\
       "${ESC}f;#ffffff\\a"

== 2010/6/5 追記 ==

この設定をしたホストにscpをすると、なぜかファイル転送ができなくなります。どう回避するのか・・・

コマンドプロンプトを任意のフォルダから開く@Windows 7

Shiftを押しながらフォルダを右クリックすることで、"コマンドウィンドウをここで開く"というメニューが出てきます。

cygwin@Windows 7 64bit

Windows 7 64bit にcygwin 1.7を入れてみました。

結果、問題なくインストールできましたが、今まで使っていたcygwin ckが動きません。cygwinのデフォルトのコンソールはコマンドプロンプトで、大変使いづらいので、代替を探したところ、最近はやりのPederosaが使えるようです。

ただし、最近のcygwinはレジストリの仕様が変わったらしく、

レジストリキーSOFTWARE\\\Cygnus Solutions\\Cygwin\\mounts v2\\/がみつかりません。Cygwinが正しくインストールされていないと思われます。

というエラーが出ます。/binにあるcygwin1.dllにアクセスできないのが原因のようなので、cygwin1.dllをPATHの通ったフォルダにコピーするか、/bin のフォルダをPATHに追加することで一応動くようですが、エラーは消えません。

こういう時はレジストリに直接昔の仕様の情報を書いてあげます。

やりかたは簡単で、コマンドプロンプトを右クリックで管理者として実行し、以下を実行します。

reg add "HKLM\\SOFTWARE\\Cygnus Solutions\\Cygwin\\mounts v2\\/" /v native /t REG_SZ /d C:\\cygwin

C:\cygwin はcygwinのインストールディレクトリですので、環境に合わせて変更してください。

== 2010/4/18 追記 ==

Cygwin付属のminttyがシンプルで使いやすいです。setup.exeでmintty を選択してインストールすると、スタートメニューに追加されます。minttyの設定では、Optionでlocalをja_JP、Character set をUTF-8にして、minttyを再起動すると、日本語も無事表示されました。

==  2010/7/3 追記 ==

minttyは色が見にくいので、色を変えたらscpでのファイル転送ができなくってしまって、回避方法がわからないので、Poderosaに乗り換えました。Poderosaのssh機能ではなく、Cygwinでsshコマンド機能を使って、他のLinuxにログインしたところ、HOMEキーやENDキーがうまく動かないので、 オプション設定→操作の設定欄から、追加キー定義に以下を定義してあげました。

 Home=0x1B[1~, End=0x1B[4~

== 2010/7/18 追記 ==

以前のcygwinで使っていたckがcgywin 1.7にも対応しているようです。結局、Poderosaも動作が少し不安定なので、ck に戻りました。

lsの色を変更する@Cygwin

lsコマンドは、ディレクトリやファイルの種類によって、表示に色をつけることができます。しかし、ターミナルによっては見にくい場合があります。変更方法は、/etc/DIR_COLORSをホームに.dir_colorsとしてコピーし、編集します。

$ cp /etc/DIR_COLORS ~/.dir_colors
$ vi ~/.dir_colors

.dir_colorsには、以下のようなコメントがあります。

# Attribute codes:
# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed
# Text color codes:
# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white
# Background color codes:
# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white

表示の属性(太字や点滅)、テキストの色、背景の色が上記のように定められています。例えば

DIR 01;34

は、ディレクトリは01=太字で、34=blue(青)で表示を意味します。よって、これらの設定を好みの設定に変更します。

設定変更後、反映するには、以下のコマンドを打ちます。

$ eval "`dircolors.exe ~/.dir_colors -b`"

常に反映したい場合は、上記コマンドを~/.bashrcなどに書き込んで、ログインの度に設定が反映されるようにしましょう。

このブログについて
プライバシーポリシー・お問い合わせ等
購読する(RSS)
記事検索
アーカイブ
カテゴリー
  • ライブドアブログ