himadatenodeの日記 このページをアンテナに追加 RSSフィード

*日記だけど 本人のメモや整理が垂れ流されてるだけなので。誤字脱字だらけで意味不明な電波が送信されてます。まともな漢字で翻訳されたのは、その内どこかにまとめて書くかもしれません。

HimaDataNode bookmark archive

xyzzyを使いたい人向け

2017-11-18

[]git bash文字化けしたので何とかした話

最近本当にemacsだと時間さえかければ出来るのかどうか気になってちょくちょく設定作業をしてみているんだけど、流石にxyzzyと同じ風にするのは非常に大変。別の便利さがある別のやり方の方がemacsだと便利というパターンが多いけど、じゃあそれが凄い便利なのかというというほど便利じゃなくて仰々しい多機能さと実際に使う時の不便さが同居するみたいなのが多い*1

それはxyzzyでも実は似たようなところがあって、自分で時間をかけて作った便利機能みたいなのより、10分位で作ったちょっとした気の聞いた小粒の機能の方が役立ったりするという。gitの奴もおなじで色々コマンドを補完する機能とかつけた奴は全く使わず結局git-bashを立ち上げるだけのを頻繁に使っている。そこで似たようなのをemacsで動かそうとすると文字化けしてしまう。理由がよく分からない。

どちらもほぼやることは一緒で、同じgit-bash.exeを起動するだけなんだけど、なぜかemacsの奴だけ文字化けするという謎。多分shell-commandとxyzzyのshell-executeで実行する時に微妙に何か違うんだと思う。どちらも.bashrcは読み込んでるんだけど、多分.gitconfigか何かをemacsの方だけ読み込んでないか何かな気がする。

■解決したので追記 11/22

 なんていうか、普通の設定の問題ではなかった。ウィンドウの左上のアイコンの所をクリックすると出るメニューからオプションを選び、オプションのウィンドウからtextの項目にあるLocaleを色々変えてたら普通に文字化け治った。てかコマンドでlocale設定は色々してたんだけど治らずにウィンドウのオプションいじったら治るのも割りと謎。迷ったのは設定項目が

  • bashのエンコード設定(.bashrc or .bash_profile とかに書く奴)
  • gitのエンコード設定(.gitconfig or git/etc/inputrc とかに書く奴)
  • lessのエンコード設定 (ビューワがless以外のを使う場合もあるのでそれぞれのビューワの設定)
  • emacsのエンコード設定

みたいにエンコードの設定が少なくとも4つあって、それぞれの設定方法が2種類から3種類位ある所にあったように思う。どこを自分が設定していてどこを設定していないのかが非常に分かり難い。そしてこれ前も同じことをやらかしていたらしく前回も結局ウィンドウのアイコンをクリックして出るオプションでなおしていたようなので、丁度いいからメモしておく。メモは大事。

*1:例えばアウトラインツリーをemacsで再現しようと思うと結構上手くいかなくて、org-modeみたいなxyzzyではない折りたたみ機能がかえって便利。でもorg-modeは仰々しい感じで使わない機能も沢山ある。そして解析してくれるのがxyzzyだとoltをマウスでポチポチすると色々変えれたり見出しの文字を正規表現で指定したり出来て痒い所に手が届く。デフォルトでも色々入ってて構造化エディタのアレとかにもマウスだけで簡単に見出しが変えれる。一方emacsだと基本見出しの撃ち込み方とかデフォルトの奴が他の機能とかでも何かと便利なので構造を強制的にorg-modeの記法にせざるをえないとかあったりなかったりする。けど個人的にはこれは不便だなと思う。

2016-08-23 リアル「安倍マリオ土管」説も 池袋駅前に謎の「緑の物体」

[]git for windows だけで出来る ssh

最近 xyzzy の git のを色々試してみて気づいたのでちょっと色々試した事とかを書いてみる。git で ssh を使う時の解説ページがいくつもある。ただ何故かほぼ putty を使っている。個人的にも putty を使ってたので、putty で ssh を使う人がいるのは分かるんだけど、git の場合 git bash があるから別に絶対 putty って事もないはず・・・。しかし Windows だと何故かほぼ ssh を使う時 putty を使ってる説明になっている。もしかして putty じゃないと上手くいかないのかなとか色々思ったり。

なので putty を使わないで git for windows で ssh を試してみた。適当にやったら普通に出来た。なんで windows だと putty の説明になっているのか分からないが、説明で見た putty を使う方法より git for windows だけの方がインストールする手間も少なくて簡単な気がしないでもない。むしろ putty を使う事で複雑になっている気が。

これはもしかして布教なのか? Windows 以外の方が分かりやすくて簡単だよ的な布教なのか?ヨーダのようなすばらしい導師に導かれたい人は Mac にお布施をしろと?Windows でフォースの暗黒面を前面に押し出した Emacs もどきの xyzzy を使っているベーダーは putty 使っとけと?だが待ってほしい。フォースの暗黒面に染まりきってる xyzzy ユーザーなら Windows だけ除け者になる理由はない事に気づくはずだ。っていうか、Windows で git を使おうと思ったら大体インストールする git for windows に ssh も一緒に入っているわけで、あえて別のやり方って分かり難くないのかこれはと。ということで日本語だと何故か猫も杓子も putty で説明してるので、適当にやってみたらできた git for windows の ssh-agent を使って SSH をしてみる話。

  1. git for windows をインストールする
  2. git bash のエディタの設定をする
  3. git bash で vi 開いちゃって閉じたい
  4. git for windows のインストールが終わったら確認
  5. git for windows で ssh の鍵を作る
  6. git for windows で ssh の鍵を登録する
  7. gitlab の SSH 設定をする
  8. ssh の設定が上手く言っているか試す
  9. ssh の config 設定をしておく
  10. https で clone したのを ssh にする
  11. SSH で git push とかしてみる
  12. 簡単に`ssh-agent`して ssh-add する
  13. git bash すると ssh-agent を自動で起動
  14. SSHの方が遅いからHTTPSにする?
  15. git bash で文字化けしたので何とかした話

少々 git bash がとっつき難くても、ついでに bash にも慣れて ssh-agent も覚えてしまえば、実は mac でも linux でも似たような操作で出来ちゃって winndows 使ってる人が知識を広げるのに git bash はとても向いてる気がする。あと捻くれものの為に、説明は github じゃなくて gitlab を使う。github の説明はたくさんあるけど gitlab での説明は少ないので少しは為になるかと。

■詳しい話はもっと偉い人が書いてるのを読んだら良いと思う

ちなみに私は適当にやったら動くなと思っただけで、git for windows に関して本当に詳しいわけでも git に詳しいわけでもない。それどころかこの設定してそんな時間が経っているわけでもないし、まだ常用しているわけでもないのでずっと使ってみたら問題があるかも知れない。本当の細かい話は偉いヨーダ的な人に聞いたら良いと思う。

■xyzzy的な話

ここに書いた ssh の設定とかをしても、xyzzy から git add したり git commit したりする分には特に問題ない。push とか clone とかは git bash からやった方が安心かもしれないが、やっぱり add と commit が回数が多い気がするので、そこさえ抑えれば、後は別に git bash でいい気はする。

■git gui的な話

git gui でも ssh-agent の設定をすれば ssh 出来そうだったけど確かめてはいない。git gui の場合は help の show ssh key から鍵が見えるので多分出来るんじゃないかと思う。

[]git for windows をインストールする

 まず適当に適切にインストールする。古い Git for Windows だと何か日本語が化けたりするらしいので新しい奴を入れなおした方が良いと思う。ここで使っている環境は Git for Windows v2.9.0 。それだけ。新規でやる人は Cygwin とかその手のを入れたりすると環境変数の関係で条件が変わるきがするけど、そういうの入れてる人には説明が必要ない気がするというか、自分で何とかしたら良いと思う。もう一度書いとくけど、ここで使っている環境は Git for Windows v2.9.0 だけ。WinSCP とか TortoiseGit とか Putty とか OpenSSH を別途入れたりはしない。勿論 Cygwin とか Mingw-w64/MSYS2 も入れない。というか、こういう話って、色々入れる方が条件が変わったり失敗パターンが増えてかえって難しい気がする。挫折した人のための xyzzy の話でも書いたけど、まず基本的な奴でやって理解してないと、飛ばして先に進むとわからなくなる気がするので、先に一番スタンダードそうなので試して上手く行ったら便利そうなのを試せばいいんじゃないかと。

 やりかたは Putty をいれないから当然だけど Pageant じゃなくて、git for windows に付属している ssh-agent でやる。っていうか 付属してるんだからそれを使っても良いと思うんだよ。一応みんな基本で入れてる git for windows で満足出来ない人は putty とかを自分で設定くらいできるでしょっていう気もするので。

■一応インストール時の注意点

Run Git from the Windows Command Prompt

これを選ぶと環境変数 path に

C:\Program Files\Git\cmd(パスはGitをインストールした場所による)

を追加する。

Run Git and included Unix tools from the Windows Command Prompt

これを選ぶと環境変数 path に

C:\Program Files\Git\cmd

C:\Program Files\Git\mingw64\bin

C:\Program Files\Git\usr\bin

の3つを追加する。らしい。

ssh は Git\usr\bin に入っているのでここでは "Run Git and included Unix tools from the Windows Command Prompt" を選んだ方が都合がいい気はするが、個人的には確か Run Git from the Windows Command Prompt を選んだきがするのに Git\usr\bin のパスが通っていたのでその辺はよく分からない。適当にインストールをして試して駄目なら変えればいいと思う。Cygwin とか他のツールを使ってる人は慣れてると思うので、そういう人は自分で調節したら良いと思う。使えないけど趣味で Cygwin を入れてるという人は使うものだけ入れた方が良い。というかそうしないと挫折する。xyzzy でも同じだけど、使えないのに入れてると問題を引き起こすので。特に環境変数のあたりは問題が起きるし、インストーラでも実際警告の一文が出ている。

[]エディタを xyzzy にする

 まずエディタの設定の話を先にしておかないと、設定ファイルを変えるたびに vi が立ち上がって操作方法が分からない人がいる気がするので先にエディタの設定。

core.editor

コミットやタグのメッセージを編集するときに使うエディタは、ユーザーがデフォルトエディタとして設定したものとなります。デフォルトエディタが設定されていない場合は Vi エディタを使います。このデフォルト設定を別のものに変更するには core.editor を設定します。

$ git config --global core.editor emacs

xyzzy ならば、 emacs となっている所を、xyzzycli にでもすればいい。.gitconfig の場所は ~/.gitconfig なので、一度

$ vi ~/.gitconfig

から .gitconfig の設定をして

editor = "エディタのパス"

をチェックすればいい気はする。UTF-8(BOMなし)で保存にすると良いらしい。ただ、 git bash 使う時だけならどうせちょっと設定ファイルいじるだけなので vi を使った方が親和性は高い気がする。説明しといてなんだけど、ここは後から変えたい人が変えればいい場所だと思う。個人的にも vi のままにしている。

[]vi の閉じ方

 vi を使えば良いといっても閉じ方が違うので慣れてないと困るかもしれないから一応。

$ vi ~/.bashrc

とかをやると、bash から vi が立ち上がってどうやって戻ればいいのか分からないかもしれないが、基本的にはESCを連打しておいて、

:wq

を打てば保存して閉じる事が出来る。 vi での編集を済ませたたら :wq で普通に閉じるだけ。 :wq で無理な場合は :wq! で閉じると閉じれるかもしれない。 vi なので閉じ方は何個もあるが基本は :wq を打てばおk。一応他の方法は :x 、ZZ なんかも似たような感じで閉じるが例によってなんでこんな何個も用意しているのかは似非ベイダーじゃなくてヨーダにでも聞かないとよく分からない。

[]インストールが終わったら確認

 SSHで通信する前に git bash を動かして

$ ssh-key

で tab を連打してみる

上手くいってる場合

$ ssh-key
ssh-keygen.exe   ssh-keyscan.exe

という感じで ssh-keygen.exe などの候補が出る。上手くいってない場合は候補に出ないかもしれない。普通は git for windows を上手くインストールすれば勝手にパスが通ってる気がする。っていうか個人的には選択肢を選んで適当にインストールしただけでこうなっていたので他の環境はよく分からないけど。 Cygwin とか入れてると環境変数が面倒な事になるとかはどこかで見た。

[]sshの鍵を作る

打つコマンド

$ ssh-keygen.exe -t rsa -C "メールアドレス"

打った後

$ ssh-keygen.exe -t rsa -C "メールアドレス"
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/username/.ssh/id_rsa):  #左のパスで良ければ[Enter]。
Created directory '/c/Users/username/.ssh'.
Enter passphrase (empty for no passphrase): #パスフレーズを打つ
Enter same passphrase again: #もう一度確認でパスフレーズ

 keyを作る場所は、変えない方が面倒ないのでそのまま推奨する。そのままだと普通に使ってるwindowsの場合は[~/.ssh]で鍵のパスが指定できてフルパスが必要ないので打つのが楽。パスフレーズはパスワードみたいなものだと思えば良い。覚えておかないと駄目。

成功した場合

Your identification has been saved in /c/Users/username/.ssh/id_rsa.
Your public key has been saved in /c/Users/username/.ssh/id_rsa.pub.
The key fingerprint is:

こんな表記が出て~/.ssh/以下にid_rsaというファイルがで作られる。

The key's randomart image is:
+---[RSA 2048]----+
|     .o...o.oo++ |
|     +.*.o.+.=o o|
|    o E %.=.+o . |
|   . o B X +...  |
|    . . S = o    |
|     . + o +     |
|      =   . o    |
|     .     o     |
|                 |
+----[SHA256]-----+

あと何かこんな模様が出てくる。模様の詳細はランダムなので細かくは違ってもいい。

失敗した場合

open /c/Users/username/.ssh/id_rsa failed: No such file or directory.
Saving the key failed: /c/.ssh/id_rsa.

とか出た場合は

$ cd ~/

で移動して

$ mkdir .ssh

でフォルダを作れば良い。別に git bash からじゃなくてもc/Users/user/の所に.sshという名前のフォルダを作れば問題ない。

[]sshの鍵を登録する

鍵が出来たら、ssh-agentを起動して鍵を登録

  1. $ ssh-agent
  2. $ eval `ssh-agent`
  3. $ $ ssh-add

をやる。

$ ssh-agent
$ eval `ssh-agent`

しておいてから ssh-add で鍵を登録

$ ssh-add ~/.ssh/id_rsa

成功した場合

$ ssh-add ~/.ssh/id_rsa
Enter passphrase for /c/Users/username/.ssh/id_rsa: #パスフレーズを入れる
Identity added: /c/Users/username/.ssh/id_rsa (/c/Users/username/.ssh/id_rsa)

失敗した場合

Could not open a connection to your authentication agent.

とかエラーがでる

失敗した場合の対策

 前の手順を見直す。

 ssh-agent が起動してないとエラーがでる

 eval `ssh-agent` してないとエラーがでる(これはWindowsの場合だけらしい)

$ eval `ssh-agent`で成功した場合

$ eval `ssh-agent`
Agent pid number

成功しているとAgent pid で数字が出るだけ。色々出てる場合は何か違う事しているんじゃないかと思う。

$ eval `ssh-agent`で失敗した場合

$ eval `ssh-agent`
bash: `ssh-agent`: command not found

どこかの設定をコピペしてて表記が変わっている場合とかがある。

例えば、`(半角)が`(全角)とかになってると失敗する。

[]gitlabの設定をする

$ clip < ~/.ssh/id_rsa.pub

クリップボードに公開鍵をコピーして、gitlab の profile bから SSH keys の設定をする。Key の所にコピーしたのを貼り付けて、title に適当な名前を入れて Add key で登録

[]sshの設定が上手く言っているか試す

$ ssh -T git@gitlab.com

成功した場合

$ ssh -T git@gitlab.com
Welcome to GitLab, username

失敗した場合

$ ssh -T git@gitlab.com
The authenticity of host 'gitlab.com (104.210.2.228)' can't be established.

失敗した場合の対策

gitlab の profile から ssh key がちゃんと登録されているか確認する。SSH をはじめに使う場合、鍵が何個も登録されている場合はとりあえず使う奴に絞って、後は remove しとく。何個も登録されてると、違う鍵になってたりする。あと回線がhttpsしか許可されてない場合とかも稀によくあるかもしれない。

ssh -vT git@gitlab.com

デバッグできるらしい。-T のオプションは使っていない人も多いみたいなのでつけないと駄目って事もないと思う。

[]configで設定しておく

$ vi ~/.ssh/config

で SSH の config を設定しておく。

ex

Host gitlab
  HostName gitlab.com
  User git
  ForwardAgent yes

この例では

$ ssh -T git@gitlab.com

の代わりに

$ ssh -T gitlab

で同じ事ができるようになる。あくまで例なので、ここは config の書き方をよく調べて自分に都合が良いように設定すれば良い。

Host 任意の接続名
HostName ホスト名
User ユーザー名
Port ポート番号
IdentityFile 鍵へのPATH(例 ~/.ssh/hoge.key)
ServerAliveInterval 秒数
ProxyCommand

ServerAliveInterval は放置しとくとログアウトしてしまうサーバーなどを一定間隔で生存報告してログアウトさせない。

[]https で clone したのを ssh にする

 既に https で clone してて ssh に出来ないよって言う人も origin を ssh に変更すれば普通に ssh になるはず。

今の origin を確認する

$ git remote -v

https になっている場合

origin  https://gitlab.com/accountname/hoge.git (fetch)
origin  https://gitlab.com/accountname/hoge.git (push)

見たいに https が出るはず。hogeの所は変動する。

origin を変更する

$ git remote set-url origin git@gitlab.com:accountname/hoge.git

git@gitlab.com:accountname/hoge.git の所は自分の gitlab のページの HTTPS/SSH の URL を入れる。HTTPS と SSH はプルダウンメニューから選べるので SSH の URL を選ぶ。

上手く言ったかを確認する

$ git remote -v
origin  git@gitlab.com:accountname/hoge.git (fetch)
origin  git@gitlab.com:accountname/hoge.git (push)

のように https の所が git@gitlab.com: になっていれば変更できている。

[]SSH で git push とかしてみる。

$ git pull

して上手くいってれば

$ git pull
Already up-to-date.

となる。

$ git push origin master

して上手くSSHで接続できていればファイルの情報が表示されて下の方に

To git@gitlab.com:accountname/hoge.git

のように To git@gitlab.com:accountname/hoge.git になっているはず。

[]簡単に`ssh-agent`して ssh-add する

このままだと git bash を起動する度に ssh-agent を動かす事に。それが面倒な場合の色々

$ vi ~/.bashrc

で.bashrcを編集して

alias ssh-set='eval `ssh-agent -s` ; ssh-add'

とかすると、ssh-set で 'eval `ssh-agent -s` と ssh-add を実行してくれる。ssh-set の所は好きな名前にすれば良い。でもこの設定はぶっちゃけあまり必要はなくて、ssh-agent を自動で起動する方がらくだと思う。

[]git bash すると ssh-agent を自動で起動

$ vi ~/.bashrc

で.bashrcを編集して

#ssh-agent
eval `ssh-agent`
ssh-add

と追記しておくと、git bash を動かす時に自動で ssh-agent を起動してパスフレーズの入力を一度だけ求められるようになる。git bash が起動している間は何度もパスフレーズを入力する必要はない。 devian のページとか見るとパスフレーズなしで ssh の話が出てるので、案外一人で触るならパスフレーズもなくてもいいのかもしれない。やりたい人は下のURLを参考にでもすれば良いと思う

個人的にはパスフレーズは入れている。あと、パスフレーズを設定しても~/.bash_profilとかにパスフレーズを書いてしまって入力を省略する方法とかもあるらしい。パスフレーズの入力も省略はできるらしいが、折角 SSH にしてもそれじゃ本末転倒な気がするので、一度くらいは打てばいい気がする。

実は上に書いた設定だと ssh-agent はログアウトしても残る。ので、ログアウトする時に終了するように .bash_logout に

eval `ssh-agent -k`

を追記しておく。これをやらないと git bash を動かすたびに ssh-agent のプロセスが増えまくる。

何度も git bash を立ち上げたり消したりするような使い方をする場合は ssh-agent が起動する度にパスフレーズを聞かれる。それが嫌な場合はログアウトしたときに ssh-agent を消さないでおく方法もある。 ssh-agent のプロセスを消さないと起動するたびに Windows のプロセスに残ってしまうので $ vi ~/.bashrc で書き換える内容を下のようなのにしておくと幸せになれる。

#ssh-agent
SSH_AGENT_FILE=$HOME/.ssh-agent
test -f $SSH_AGENT_FILE && source $SSH_AGENT_FILE
if ! ssh-add -l > /dev/null 2>&1; then
    ssh-agent > $SSH_AGENT_FILE
    source $SSH_AGENT_FILE
    ssh-add $HOME/.ssh/id_rsa
fi

個人的にはこっちのが楽なんじゃないかと思ったが、このやり方は色々な方法があるようなので、自分の好きなのを選べばいい気がする。こういう話は私みたいなフォースの暗黒面たる windows に染まっていない詳しそうな人が書いているのを色々見た方が良いと思う。この場合は .bash_logout には何も追記しないで良い。 ssh-agent の多重起動を防ぐので ssh-agent が一つだけになる。ただし、ログアウトしてもプロセスをキルしないので、一度 git bash を立ち上げたら後はログアウトしても ssh-agent が立ち上がった状態になる。そのため2度目の git bash 起動時にはパスフレーズの入力も必要ない。 ssh-agent のプロセスはつけっぱなしになる。プロセスをキルしたい場合は git bash を閉じる前に

$ ssh-agent -k

とすれば ssh-agent のプロセスもキルする事が出来る。この辺の問題は OpenSSH を利用するとかなり改善するらしい。多重起動防止とかがあるので。

[]SSHの方が遅いからHTTPSにする?

SSHの方が遅いからHTTPSにするという話を見かけたけど、よく見ると追記されてて

~/.ssh/config に次の設定をすれば、SSH でも十分速くなるようです。

Host github.com
  Compression yes
  Ciphers arcfour256

すれば早くなるらしい。

*1:フォースの暗黒面たる windows の力も結構なものなので多分 Mac じゃないからじゃなくて ssh-agent の種類で色々違うというか。 OpenSSH じゃないからじゃないかと思った。