モーグルとカバとパウダーの日記 このページをアンテナに追加 RSSフィード Twitter

モーグルやカバ(EXカービングスキー)、山スキー(BC)の山行記録などがメインの日記です。
いろんな条件のいろんなところを、その時々の条件にあった滑り方で楽しむ、フリースキーをして遊んでいます。

検索で来られた方は、上の検索窓から再度検索していただくか、右サイドバーのカテゴリーやトピックスの項目で絞り込んでみてください。
仕事柄、コンピュータ系のネタも多いので、スキー関連ネタだけ読みたい方は[ski]、コンピュータ関連ネタは[pc]、スパム関連ネタは[spam]で絞り込んでください。

2016-11-10 (Thu)

[]WindowsでDockerToolboxとVBoxHeadlessTray使って起動時点でdocker使える環境にする WindowsでDockerToolboxとVBoxHeadlessTray使って起動時点でdocker使える環境にするを含むブックマーク WindowsでDockerToolboxとVBoxHeadlessTray使って起動時点でdocker使える環境にするのブックマークコメント

ここのところずっとvagrant+ansibleでやってたんですが、最近なにかとdockerいいよってのを見せつけられて、やっぱこれからはdockerだよね、ってなってました。


が、Windows環境ってdocker使いにくいですよね。


Docker for Windows使えばいいんでしょうが、まずHomeでは使えないのでProじゃないといけないし、Hyper-Vを効かすとVirtualBoxが使えなくなるためvagrantとの共存ができなくなるとか色々不都合があります。

というわけで、あえてDocker for Windowsは使わずに、VirtualBox上で動くDockerToolboxを使うようにしています。


でそれはいいのですが、DockerToolboxは自動的に起動してくれないので、コンソール開いてdocker〜と打つ前にDocker Quickstart Terminal開いてdocker用のVMを起動してやる必要がありました。それがなんかなあと。

あと、Windowsを終了するときも意識的dockerVMを落としてやる必要があります。


DockerToolboxをWindows起動時に立ち上げる方法ないの?と思って探したところ、DockerToolbox自体にはないけどVBoxHeadlessTrayを使うと自分の望みどおりの動きをしてくれることがわかりました。

VBoxHeadlessTrayはタスクトレイからVirtulBoxのVMを操作出来るようにするツールで、Windows起動時に一緒にVMを起動したり、シャットダウン時には勝手に終了させてくれる機能があるのです。


VBoxHeadlessTray - Topten Software


インストールすると最初に「Select Machine」と言われてどのマシンを起動するか選びます。

DockerToolboxは「default」という名前で入るのでそれを選んで「Power on machine」をチェックしておくと、起動時にdockerVMも一緒に立ち上げてくれます。

これ、間違って設定しちゃった時にどうやって設定変更するんだろう?


これでWindowsでも起動時点からdockerが使えるようになりました。


(関連)

NYAGOSからDockerを使う設定 - モーグルとカバとパウダーの日記

Docker for Windowsオープンベータのインストールと問題点 - モーグルとカバとパウダーの日記

トラックバック - http://d.hatena.ne.jp/stealthinu/20161110

2016-11-01 (Tue)

[]s3fs配下でchmod 0755/0644する速度 s3fs配下でchmod 0755/0644する速度を含むブックマーク s3fs配下でchmod 0755/0644する速度のブックマークコメント

S3をs3fsでマウントしている環境で、アップロードされたファイルのパーミッションを、ディレクトリは0755、ファイルは0644にchmodするスクリプトがあり、だいぶ処理時間が掛かっているので改善できないか調べていました。

s3fs使ってS3にアクセスするのは非常に遅いため、通常のファイルシステムに対しての常識とはまた違った気遣いが必要になります。


最初のスクリプト

find ./example -type d -exec chmod 0755 {} +
find ./example -type f -exec chmod 0644 {} +

という感じだったので、これを1コマンドにまとめたら少なくとも倍速になるんでは、と思ったわけです。


こういうのってうまく書いたらchmodだけで出来ないのかなあ、とも思っていたのでtweetしたところ、@mnb0327さん、@tatsushi_dさん、@satoh_fumiyasuさんからリプいただきました。

というわけで簡単に書く方法はなくて、やはりfind使うかperlとかでごりごりやるしかない、という感じでした。


(2016/11/2 追記)

chmodだけでディレクトリに対してのみ+x出来る記述方法を教えていただきました。

chmod -R a=,u=rwX,go=rX ./example

「0755」系のビットフィールド使った指定ではなく、「x」系の指定で「X」を使うと、ディレクトリに対してのみ実行権限「x」を付けられるのですね。

知らんかった…


そこで教えていただいた方法や、対照実験用のchmod単体でやった場合など、いくつか試してtime取ってみました。

2回データ取ってよかったほうを採用しましたが、だいたい近い時間で処理されていました。

s3fs-1.74で約950ファイルに対して行っています。

time ./chmod.pl
real    2m39.680s

time chmod -R 0755 ./example
real    2m44.186s

time find ./example -exec chmod 0644 {} +
real    2m47.660s

time find ./example -type d -exec chmod 0755 {} + -o -type f -exec chmod 0644 {} +
real    2m53.486s

time find ./example -exec chmod 0755 {} +
real    2m58.552s

time find ./example -depth -type d -exec chmod 0755 {} + -o -type f -exec chmod 0644 {} +
real    3m8.701s

time (find ./example -type d -exec chmod 0755 {} +; find ./example -type f -exec chmod 0644 {} +)
real    3m38.750s

chmod.pl

sub recursive {
    my ($dir) = @_;
    my @files = glob("$dir/*");
    foreach my $file (@files) {
        if (-d $file) {
            system("chmod 0755 $file");
            recursive($file);
        } else {
            system("chmod 0644 $file");
        }
    }
}

recursive("./example");

(参考)ディレクトリの中をを再帰的にたどってすべてのファイルに対してなにかの処理をするには | 入出力・ファイル操作 | プログラミング言語の比較 | hydroculのメモ


結局、perlで書いたのが一番早く、その場合は単純にchmodで全部0755にしてしまうよりも早く処理が終わりました。

単純なchmodよりもperlのが早いというのはちょっと不思議ですが、他の処理も動いていたため揺れの範疇かもしれません。

そして、find で -o オプション使って処理を変えるものも、ほとんど遜色ない時間で処理が終わりました。

さらに意外だったのが、元々のfindを2回書くパターンが実はそれほど遅くないということで、だいたい2割増程度の時間で済んでいました。


(2016/11/2 追記)

エントリ書いた後、さらにこのようなアドバイスいただいたので

  • chmodだけでディレクトリに対してのみ+x出来る記述方法
  • perlのchmodを内部コマンド使う方法
  • xargs経由でやる方法

を追加テストしました。

今日は全体的にS3へのアクセス速度が早くなっていて昨日やったテストの時間と直接比較できないため、代表的なものを比較用に再度テストしています。

time chmod -R a=,u=rwX,go=rX ./example
real    2m19.232s

time chmod -R 0755 ./example
real    2m22.987s

time ./chmod2.pl
real    2m26.634s

time ./chmod.pl
real    2m41.052s

time find ./11434 -type d -exec chmod 0750 {} + -o -type f -exec chmod 0640 {} +
real    3m18.127s

time (find ./example -type f -print | xargs chmod 0644; find ./example -type d -print | xargs chmod 0755)
real    3m19.146s

chmod2.pl

sub recursive {
    my ($dir) = @_;
    my @files = glob("$dir/*");
    foreach my $file (@files) {
        if (-d $file) {
            chmod 0755, $file;
            recursive($file);
        } else {
            chmod 0644, $file;
        }
    }
}

recursive("./example");

というわけでchmodでラージ「X」使うのが一番良くて、記述ももっともスッキリしました。

アドバイスいただいた皆様、多謝です!!

トラックバック - http://d.hatena.ne.jp/stealthinu/20161101

2016-10-28 (Fri)

[]NYAGOSからDockerを使う設定 NYAGOSからDockerを使う設定を含むブックマーク NYAGOSからDockerを使う設定のブックマークコメント

DockerToolbox(Docker for Windowsではなく)を使ってDockerを使える環境を作っていたのですが、普段使っているNYAGOSの上でDockerを使おうとしたところ、ぜんぜん動きませんでした。


DockerToolboxは動かすのに環境変数の設定が必要で、その設定内容は例えばcmd.exe向けの場合

> docker-machine env default --shell cmd
SET DOCKER_TLS_VERIFY=1
SET DOCKER_HOST=tcp://192.168.99.100:2376
SET DOCKER_CERT_PATH=C:\Users\exampleuser\.docker\machine\machines\default
SET DOCKER_MACHINE_NAME=default
REM Run this command to configure your shell:
REM     @FOR /f "tokens=*" %i IN ('docker-machine env default --shell cmd') DO @%i

のようにして取得することが出来ます。


linux等の場合は、--shell bashしたものをevalしてすんなり設定を作れるのですが、NYAGOSだと色々と修正しないと動かなかったので、以下のように手でNYAGOSの設定ファイル「.nyagos」をホームディレクトリに作って解決しました。

set {DOCKER_TLS_VERIFY='1'}
set {DOCKER_HOST='tcp://192.168.99.100:2376'}
set {DOCKER_CERT_PATH='C:/Users/exampleuser/.docker/machine/machines/default'}
set {DOCKER_MACHINE_NAME='default'}

イマイチ感高いですが、とりあえずこれでNYAGOSの上でDocker触れるようになりました。

もっと良い方法があれば教えてください。


(参考)

docker-machineコマンド - Qiita

nyagos/05-Startup_ja.md at master · zetamatta/nyagos


(関連)

ConEmuでMSYS2のbash上でvagrant sshした時に画面が崩れる件 - モーグルとカバとパウダーの日記

2016-10-12 (Wed)

[][]なぜCNNではAutoEncoder使わなくても学習が収束するのか なぜCNNではAutoEncoder使わなくても学習が収束するのかを含むブックマーク なぜCNNではAutoEncoder使わなくても学習が収束するのかのブックマークコメント

7月のGCPUG信州の発表資料をやっと公開したので、そこで質問が出てた、CNNがなんでAutoEncoder使わなくても学習が収束するのかの話でつらつら考えてたことを、今さら書いてみます。


その時はCNNはネオコグニトロンの子孫でネオコグニトロンは自己組織化するからではないか、というような回答をしました。

が後から調べてみたところだと、Dropoutで正規化が行われるようになったおかげで過学習でローカルミニマムにはまりにくくなり、AutoEncoderで事前学習しなくてもよくなった、という流れが正解らしいです。

(さらに今はDropoutを使わずにバッチ正規化でやる流れ)

Deep Learningと画像認識 〜歴史・理論・実践〜 65ページ

教師なし事前学習は最近ではほとんど用いられていない

なぜならDropoutのようなすぐれた正規化方法が登場したため


ただその後も、CNNはほんとに自己組織化するのだろうか?と考えていました。


CNNでは代表的なプーリング手法として、Average PoolingとMax Poolingとがありますが、最近だとMax Poolingのほうがよく使われているようです。

Max Poolingとは、そのエリアで最も良く反応したニューロンの出力だけを採用するものです。

ということは、それってネオコグニトロンで抑制性結合してるのと同じ効果があるのではないかと思ったのです。


きっとそれだ!と思ったんですけれども、さらによくよく考えてみると、抑制性結合というのは福島先生の最大値検出仮説にもとづいて設計されたものでした。「最大値検出」とはまさに「Max Pooling」そのものです。

だからMax Poolingで実装されてるCNNはまさにネオコグニトロンそのもので、なのでCNNは普通に自己組織化出来るのですね。


と考えると、CNNのMax Poolingは平行移動とかを吸収して次元削減するためのものだけに捉えられがちですが、実は自己組織化のための側面のほうも大きいのではないかと思いました。

とするとある程度深い層では、次元削減せず逆に増やすくらいでもいいのかもしれん、と思いました。

今まで層が進むにつれて次元削減すべきと思ってたんだけど、ある程度からは逆のほうが良かったりしないかな、と。


とここまで書いておきながらなんですが、最近2016年福島先生ご自身がネオコグニトロンについて書かれた論文

DeepCNNネオコグニトロンの学習

C細胞は,最近のdeep CNNとは異なり,max-poolingではなく平均化操作によってpoolingを行なっている

とあって、根本的に僕の理解が間違ってる?というような感じになっていますが…


(関連)

Dropoutが効果的な理由についての疑問 - モーグルとカバとパウダーの日記

トラックバック - http://d.hatena.ne.jp/stealthinu/20161012

2016-09-21 (Wed)

[][]Dropoutが効果的な理由についての疑問 Dropoutが効果的な理由についての疑問を含むブックマーク Dropoutが効果的な理由についての疑問のブックマークコメント

現在のDeep Neural Networkがうまく収束できるようになっていることにはDropoutの効果が大きいと言われている。

Dropoutはニューラルネットで中間層などの入力を50%の確率で落としてやることで、非常に強い正規化が行われるというものだ。


なぜDropoutが効果がそのような効果を持つのかについて、Hinton先生が書かれたスライドに記述があった。


2012年のDeep Learningについての解説スライド資料

52ページあたりからDropoutについての解説がある

IPAM Summer School 2012 Tutorial on Deep Learning


層の入力となるニューロンをランダムに半分を落とすことで、組み合わせを多数作ることが出来るから、非常に多数のニューラルネット平均値を得ることと同じ効果があり、それで性能が上がると説明されていた。



Hinton先生が書いてることに僕なんぞが疑問を抱くなんて、まったくもっておこがましいのだが、この説明はなんかどうもしっくりこなかった。

たしかに組み合わせは多数作れるけど、個々の元になってるニューロンは同じものが使われるのだから、非常に多くの回数学習を回すと、最終的に学習誤差を足し合わせた値を見たら全数が「生きて」いるときのものと同じになるんじゃないのだろうか。


「『みんなの意見』は案外正しい」というのがあったけど、あれは「多様な」「独立した」結果が集まるから正しくなるという前提があり、その前提が崩れていると機能しない。

ほんとうに同様の効果を狙うのならば、それと同じ前提が必要なのではないか。

ただ、ニューロンの重みが完全にシェアされた多数のニューラルネットワークだから強い正規化が行われる、と書いてあるから、逆に独立していないからこそ効果が得られるのだとすると、さらによくわからない。


Dropoutが効果がないとは全く思って無くて、間違いなく大きな効果が得られているはずだが、理由として挙げられている、多数のニューラルネット平均値を取ったのと同じこと、という説明が別の理由があるのではないかと。


Dropoutにより超平面に「ゆれ」が起こるから、ローカルミニマムから脱出しやすいとか、そういうのかなあと思ったんだけど、なんの根拠もないのにそんな適当なこと書いてごめんなさいごめんなさい。


上記の疑問に対し、良い説明があるページや論文がありましたら教えてください。

2016-09-02 (Fri)

[]MySQLの接続最大数に達した時にどのクエリの問題か確認する MySQLの接続最大数に達した時にどのクエリの問題か確認するを含むブックマーク MySQLの接続最大数に達した時にどのクエリの問題か確認するのブックマークコメント

MySQL障害時にprocesslistを表示したいが、接続クライアント数最大に達していて入れず、セッション消費してるはずのアプリデーモン止めてもクライアント数減らないような場合があると思います。

このような場合に、Javaスレッドダンプ的に外から状況を吐かせたい、と思うことってありますよね。


んでそんなことをtwitterで嘆いていたら、とみたさんから

のように教えていただきました。


なんと、なにもしなくてもMySQLrootアカウントなら1接続だけ入れるとのこと!


MySQL :: MySQL 5.6 リファレンスマニュアル :: B.5.2.7 接続が多すぎます

mysqld は実際には max_connections+1 クライアントの接続を許可します。余分な接続は、SUPER 権限を持つアカウントが使用するために予約されています。SUPER 権限を管理者に付与して、通常のユーザー (その権限の必要のないユーザー) に付与しないことによって、権限のないクライアントが最大数接続されていても、管理者はサーバーに接続して SHOW PROCESSLIST を使用し、問題を診断することができます。


まさにやりたかったことをやるために用意されている心づかいでした。


ちなみにflatさんからPostgreSQLにも同様の仕組みがあることを教えていただきました。

接続と認証

superuser_reserved_connections

PostgreSQLのスーパユーザによる接続のために予約されている接続


次、同じ障害出たらこれで processlist 取れるぞ!

トラックバック - http://d.hatena.ne.jp/stealthinu/20160902

2016-08-31 (Wed)

[]mod_rewriteURL末尾に付いた「?」を取る mod_rewriteでURL末尾に付いた「?」を取るを含むブックマーク mod_rewriteでURL末尾に付いた「?」を取るのブックマークコメント

アクセスされたURLが例えば「http://example.jp/foo/?」のように「?」だけで他のクエリパラメータがついていない場合にだけ、mod_rewriteで「http://example.jp/foo/」に直したいという要望がありました。

このURLクエリが渡される場合があるため、単にクエリを全部消す、というだけでは満たされない条件です。


RewriteRuleがマッチングする文字列にはクエリ文字列が含まれないため単純に

RewriteRule (.*/)\?$ $1 [L,R]

のように末尾の「/?」とマッチさせるように書いても、「/foo/」のように末尾の「?」がないものと比較されてしまうのでマッチしません。

REQUEST_URIやREQUEST_FILENAMEにもクエリ文字列は含まれていないため、検知できません。


じゃあとQUERY_STRINGと比較しても、QUERY_STRINGは「?」以降の文字列になるため、QUERY_STRINGが空というだけでは「?」が有って空なのか、無くて空なのかがわからないのです。


ということで、REQUEST_URIQUERY_STRINGが分割されていないものはないか、と探したところ「THE_REQUEST」に

GET /index.html HTTP/1.1

のように入っていることがわかりました。

mod_rewrite - Apache HTTP Server Version 2.4


そこでTHE_REQUESTに対して下記のような条件で引っ掛ければ検出できることがわかりました。

RewriteCond %{THE_REQUEST} " .*/\? "

が、この条件で引っ掛けてREQUEST_URIに対してリダイレクトさせると、勝手にクエリ文字列を追加してくれてしまうため、結局「?」が追加されてしまい元の木阿弥に…


そこでクエリ文字列を引き継がない設定を探すと

mod_rewriteでクエリ文字列(/?q=)を引き継がずにURL置換 | ええかげんブログ(本店)

クエリ文字列を削除するには「置換文字列の最後をクエスチョンマークにする」

とすれば良いとのことでした。


これだとクエリがついていてもすべて削除されてしまうのですが、末尾が「?」で終わっている条件だからクエリは空なので、クエリ文字列自体を消してしまって大丈夫です。

なので、次のようなルールで動くようになりました。

RewriteCond %{THE_REQUEST} " .*/\? "
RewriteRule .* %{REQUEST_URI}? [L,R]

んで、これをtwitterで相談していたところ、ふみやすさんから

と教えていただきました。ありがたや!!

リダイレクトは正しくはフルで書いてないとダメなのですね。


ということで最終的には

RewriteCond %{THE_REQUEST} "/\? " 
RewriteRule .* http://%{HTTP_HOST}%{REQUEST_URI}? [redirect=301,last]

という形になりました。


しかし… 単にURL末尾の「?」消したいだけなのに、だいぶバッドノウハウ感の高いルールとなってしまいました。

なんかもそっと簡単に書ける方法はないもんなんでしょうかね。


(参照)

mod_rewriteの考え方。 - こせきの技術日記

Apacheのmod_rewriteモジュールの使い方を徹底的に解説 | OXY NOTES

mod_rewrite - Apache HTTP Server Version 2.4

mod_rewriteでクエリ文字列(/?q=)を引き継がずにURL置換 | ええかげんブログ(本店)

トラックバック - http://d.hatena.ne.jp/stealthinu/20160831

2016-07-23 (Sat)

[][]GCPUG信州キックオフ勉強会で『GCEをTensorFlowの「計算エンジン」にする』という発表をしました GCPUG信州キックオフ勉強会で『GCEをTensorFlowの「計算エンジン」にする』という発表をしましたを含むブックマーク GCPUG信州キックオフ勉強会で『GCEをTensorFlowの「計算エンジン」にする』という発表をしましたのブックマークコメント

※発表したのは7/23なのですが、このエントリ書いたのは10/12です。早く書かねば、と思いながらもう秋になってしまいましたとさ…


GCPUG信州キックオフ勉強会で『GCEをTensorFlowの「計算エンジン」にする』という発表をしました。


当初はTensorFlowメインの発表をする予定でいたのですが、他にもTensorFlow関連の発表される方がいるとのことでかぶらないようにと、あとGCPUGの発表だからGCEがらみにするのが良いだろうと考えて、こういう内容にしました。



ただ… アンケート見ると僕のやつだけ「やや難しい」という感想が半分くらいになってて、結構へこみました。

もうちょっとわかりやすい発表しないとダメですね。

2016-06-23 (Thu)

[]Docker for Windowsオープンベータインストールと問題点 Docker for Windowsオープンベータのインストールと問題点を含むブックマーク Docker for Windowsオープンベータのインストールと問題点のブックマークコメント

先日6/21ごろから、Docker for Windows がオープンベータになったので早速試してみました。


Announcing the Docker for Mac and Windows Public Beta | Docker Blog

https://blog.docker.com/2016/06/docker-mac-windows-public-beta/


下記ページから Docker for Windowsインストーラを利用してインストールします。

バージョンは「DOCKER 1.12.0-RC2-BETA16」でした。


Getting Started with Docker for Windows

https://docs.docker.com/docker-for-windows/


Docker for WindowsWindows 10 64bitとHyper-Vが必須要件となっています。

Hyper-Vは「プログラムと機能」→「Windowsの機能」→「Hyper-V」から入れることが出来ます。

自分のWindows10Hyper-Vが入っていない状態でしたが、入っていないとインストーラが入れるか聞いてきて、入れてくれました。


また、事前にDocker Toolboxが入っていると動かないようです。

自分はこれで最初動かなくてはまったのですが、アンインストールしたら動くようになりました。


このページの書いてある例のように

$ docker run -d -p 80:80 --name webserver nginx

でnginxを起動してブラウザで「http://docker」を表示したところ、無事にページが見えることを確認出来ました。

コンテナの起動は非常に早く、コンテナイメージがローカルにあれば2秒程度で起動してくれました。これはほんとに手軽でよいです。


$ docker ps

で、現在起動しているコンテナを確認することが出来ます。


docker exec -it 【コンテナID】 bash

で、そのコンテナに入って操作や確認することが出来ます。


Docker ハンズオン - 基本コマンド編 - Qiita

http://qiita.com/hihihiroro/items/6dda871dc2566801a6da


が、次の日に同様に使おうと思ったところ、dockerがちゃんと立ち上がっていないことに気が付きました。

Docker for Windowsが起動していると、タスクバーのインジケータに白い鯨のアイコンが出ているのですが、うまく立ち上がっていない時は赤い鯨になっています。

赤い鯨にマウスを持って行くと「'MobyLinuxVM' failed to start.」と出ていました。


下記ページによるとWindows Updateの「KB3163018」が悪影響を及ぼしてるようで、これをアンインストールするとうまくいったという話や、ベータ16だと解決された、「KB3163018」が入っていてベータ16ではHyper-Vを再度入れなおすとうまくいくのでは、という話が出ていました。


'MobyLinuxVM' failed to start - Docker for Windows - Docker Forums

https://forums.docker.com/t/mobylinuxvm-failed-to-start/15175


自分が試した限り、ベータ16でHyper-Vを入れなおしても、再起動するとやはりこの状況になってしまい、改善しませんでした。

「KB3163018」のアンインストールは試していません。


ただ、dockerの設定ウィンドウからRestartを掛けると動くことがわかりました。

PC起動時に同時起動する場合だと、うまく動かないのかもしれません。


この状態だとMobyLinuxVMが動いているため、すでにローカルにイメージがあるdockerコンテナを立ち上げることは出来ました。

しかし、新しいdockerイメージを持ってくるような操作をすると「Network timed out while trying to connect」というエラーが出て使えない状況でした。

ネットワークが使えなくなっているのか、ca-certの鍵が古いのか、というあたりが考えられましたが、解決方法がわかりませんでした。


とりあえずこの時点であきらめて、今まで使っていたvagrantを立ち上げようとしたところ、今度は「Intel VT-xが見つからない」というようなエラーが出て、vagrantが動かなくなってることに気が付きました。

下記ページによると、どうもHyper-Vを入れるとVirtualBoxが動かなくなるようです。


Windows 10Hyper-VOracle VirtualBox v5.0.0 は両立できない !? – アプリ徹底紹介

http://app-review.poox.xyz/archives/1449


というわけで、もう少しDocker for Windowsが安定して使えるようになるまで様子見することにしました。

まずHyper-Vを「プログラムと機能」→「Windowsの機能」→「Hyper-V」からHyper-Vを外し、Docker for Windowsアンインストールしました。


こうやれば現バージョンのDocker for Windowsも問題なく使えるよ、というのをご存知でしたら、試してみたいので教えて下さい。

2016-06-09 (Thu)

[]ConEmuでMSYS2のbash上でvagrant sshした時に画面が崩れる件 ConEmuでMSYS2のbash上でvagrant sshした時に画面が崩れる件を含むブックマーク ConEmuでMSYS2のbash上でvagrant sshした時に画面が崩れる件のブックマークコメント

ターミナルとしてConEmuを使っていて、そこからMSYS2のbashzshbash.exe --login のようにして呼び出して使っていました。

で、そこからvagrantを動かしているのですが、vagrant sshして入った先のemacsが画面が崩れて使えない、みたいなことが起きていました。


で調べてみるとConEmu+MSYS2のbashzshで入る設定でTERMを確認すると

TERM=xterm-256color

になっており、これだと崩れてしまうことがわかりました。


ただ、ConEmu+Powershell等の環境から呼び出すと大丈夫であったため、確認すると

TERM=cygwin

となっており、TERMを「cygwin」等に指定にすれば良いということがわかりました。


そこでConEmu+MSYS2 bashを立ち上げた後

export TERM=cygwin

としてやってからemacs動かせば問題がないことを確認しました。


ただ、普通にスタートメニューからMSYS2のターミナルを開くとTERMが「xterm-256color」でも問題なく動くため、ConEmu+MSYS2の場合だと問題が起きるようです。


でそれについてさらに調べていると、


ConEmuからMSYS2のシェルを起動したときに256色対応させる - 水を見ると釣りがしたくなる

http://e8l.hatenablog.com/entry/2016/03/24/161206

MSYS2のシェルからansi color codeを上手にConEmuの方へ引き渡すコネクタプログラムを噛ませる必要がある


ConEmu | cygwin/msys terminal connector

https://conemu.github.io/en/CygwinMsysConnector.html

set MSYSTEM=MINGW64 & c:\tools\msys64\usr\bin\bash.exe --login -i

Change it to:

set MSYSTEM=MINGW64 & conemu-msys2-64.exe


ということで、コネクタプログラム経由にしないとxterm-256colorでの表示はうまくいかないそうです。

試してみると確かにこれでうまく動いてくれました。

ただ、そうするとzshではなくbashになってしまうのですよね。これはなにか方法あるのかな?


また、ConEmuのヘルプに起動時にTERMの指定が出来る記述

chcp 1251 & set TERM=MSYS & cmd

があったため、これでTERMの指定をcygwinにしてzshを動かせそうに思ったのですが、自分が試して見た限りではこれは動きませんでした。


で、この問題について色々と探しているときに、shellは「Nyagos」が良いというのをちょこちょこ見かけました。


Windowsターミナル環境にCmderを使う 〜Nyagosとmsys2を添えて〜 - 長文書くところ

http://zenito9970.hatenablog.com/entry/2015/06/19/163701


このエントリではCmder+Nyagos+MSYS2ですが、自分の場合はConEmu+Nyagos+MSYS2で使ってみました。

こちらのコメントにもあるようにChocolateyでインストールできるので簡単に入ります。

確かにNyagos良い感じで、TERMもcygwinになるためそのままvagrant sshしても表示が崩れる問題は起きませんでした。


というわけでまとめると

  • ConEmu + MSYS2 bash + vagrant ssh で崩れるのは TERM が「xterm-256color」になってるため
  • MSYS2 bashかvagrant中でTERMを「cygwin」などにすれば崩れなくなる
  • でもシェルをNyagosにしちゃったほうが快適

という感じでした。


(関連)

WindowsターミナルアプリConEmuのフォント設定 - モーグルとカバとパウダーの日記

http://d.hatena.ne.jp/stealthinu/20130527/p1