f

アーカイブ

2015-10-31

Dynamic terminal title on bash, zsh, tmux

ターミナルのタイトルを設定する。CygwinとかMSYS2とかgnome-terminalなどの端末を起動すると,ウィンドウのタイトルが表示される。既定だとターミナルのタイトルは起動してから変わらないのでもう少し有益な情報を載せたい。そこで端末タイトルの動的な設定方法を調べた。

以下のページで端末のタイトルの設定方法が詳しく書いてある。

参考:How to change the title of an xterm http://tldp.org/HOWTO/Xterm-Title.html

[How to change the title of an xterm: Dynamic titlesによると,エスケープ文字(文字コード:\033;)で始まり,ベル(文字コード:\007)で終わるように囲めばよいらしい。また,エスケープ文字\033;の直後に0, 1, 2,を記入すると,それぞれウィンドウタイトル+アイコン名(タスクバーの名前),アイコン名,ウィンドウタイトルを設定できるようだ。また,bashなどでは\033の代わりに\eも使える。

アイコンとウィンドウ名を設定するには以下のようにエスケープ文字を出力すればよい。

echo -n "\033]0;${USER}@${HOST}\007"

上記設定を工夫して,現在のシェルとホスト名,ディレクトリも表示させる。

bashではPROMPT_COMMANDに設定する。プロンプトが表示される度にこの変数に設定された内容が実行される。

同様のことをzshでするにはprecmd()関数を使う。

zshにはHOSTHOSTNAME変数は設定されないのでhostnameコマンドから設定する。また,$0変数により現在のシェルも表示するようにする。

以下の設定によりこの内容を表示できる。

~/.bashrc~/.zshrc

case "${TERM}" in
  ?term*|rxvt*|screen) PROMPT_COMMAND='echo -ne "\033]0;$0@${HOSTNAME:=$(hostname)}: ${PWD/$HOME/"~"}\007"';;
esac

~/.zshrc

precmd() {eval "${PROMPT_COMMAND}"}

基本的に作業中はtmuxを使っているので,tmuxの起動中にもタイトルを変更できるようにしたい。以下を参考にして~/.tmux.confにも設定する。

参考:$PWD in window title bar, both in Bash and Tmux - Stack Overflow http://stackoverflow.com/questions/21607282/pwd-in-window-title-bar-both-in-bash-and-tmux

set -g set-titles on
set -g set-titles-string '#T'

上記の設定を施すことで以下のように望みの結果得られた。ホスト名と現在ディレクトリがタイトルにも表示されている。

参考

  • How to change Gnome-Terminal title? - Ask Ubuntu http://askubuntu.com/questions/22413/how-to-change-gnome-terminal-title
  • 漢のzsh (2) 取りあえず、プロンプトを整えておく。カッコつけたいからね | マイナビニュース

CygwinとMSYS2でのWindowsコマンドの文字化け対策

ターミナルの文字エンコーディングをUTF-8に設定したCygwinやMSYS2で,ipconfigなどのWindows標準コマンドを使いたいときがある。しかし,それをすると標準出力や標準エラー出力が文字化けする。この回避策をまとめる。

Introduction

不自由なWindows上でUnixコマンドを使用するツールとしてCygwinやMSYS2が存在する。これらでは,~/.minttyrcに以下を記述すればターミナルから扱える文字エンコーディングをUTF-8に設定できる。

Charset=utf-8

CygwinやMSYS2ではWindowsのコマンドも実行できる。しかし,Windowsのコマンドは標準出力と標準エラー出力の文字エンコーディングがCP932となっている。そのため,CygwinとMSYS2でターミナルの文字エンコーディングをUTF-8にしていると,Windowsのコマンドの実行結果から日本語が文字化けしてしまう。これを回避するためには2通りの方法がある。

  1. ~/.minttyrcの文字エンコーディング設定をCP932にする。
  2. Windows標準コマンドの出力文字エンコーディングを変換する。

1.の方法だと,Windows環境だけのためにその他の設定をすべてCP932に変える必要があるためよくない。2.の方法だと,Windows標準コマンドだけに対して対応すればよいのでこちらがよい。以下では2.の実現方法を説明する。

Windowsコマンドの出力の変換

Windowsコマンドの標準出力と標準エラー出力の文字エンコーディングがCP932であることがわかっているので,iconvnkfコマンドを使って変換する。例えば,以下のように最後にパイプでこれらのコマンドにつなげることで文字エンコーディングを変換して出力できる。

ipconfig 2>&1 | iconv -f cp932 -t utf-8
ipconfig 2>&1 | nkf -w

nkfは標準でインストールされていないことが多いが,iconvはPOSIXで定義されており,多くの場合標準でインストールされている。したがって,iconvを使ったほうがよい,

Windowsコマンド実行の度に上記のコマンドを書くのは煩雑である。そのため,使うことが考えられるWindowsコマンドにaliasを設定する。以下のサイトを参考にして関数を定義すると引数がある場合でも対応できる。

参考:職業としてのプログラミング gnupackでCygwin導入した時に最初にすること

また,LinuxのWine上でもWindows標準コマンドを使うことがありえる。Wine上では文字エンコーディングは既定でUTF-8になっているようなのでaliasを設定するのはWindowsだけにする。これを考慮すると以下のようなaliasの設定となる。

### Windows character encoding convert
if [ "$OS" = "Windows_NT" ]; then
  wincmd(){
    CMD=$1
    shift
    $CMD $* 2>&1 | iconv -f cp932 -t utf-8
  }

  alias ipconfig='wincmd ipconfig'
  alias netstat='wincmd netstat'
  alias netsh='wincmd netsh'
  alias taskkill='wincmd taskkill'
  alias cs='wincmd cscript.exe -NoLogo'
  alias ws='wincmd wscript.exe -NoLogo'
fi

上記内容は~/.bashrcなどに書いておく。これでWindowsコマンドを実行時に日本語が文字化けせずに表示される。

2015-10-29

AutoCADでの縮尺の変更方法まとめ

AutoCAD LT2004で縮尺を変更させる方法をまとめた。以下の3通りの方法がある。

  1. 倍率による尺度変更
  2. 参照による尺度変更
  3. XYの片方向だけの尺度変更

倍率による尺度変更

全体のスケールを一括して変換したいことはよくある。例えば,mmで描画されているものをmにするときなどだ。以下の手順で実行可能だ。

  1. ドラッグで全体を選択。
  2. [修正]→[尺度変更]。または右クリック→[尺度変更]
  3. [基点を指定]:基点を適当にクリックして選択。
  4. [尺度の入力]:掛けたい倍率を記入する(例:mm→mなら0.001,m→mmなら1000)。

参照による尺度変更

ある物体のある辺の長さを別の物体の辺の長さと一致させるように全体を尺度変更したいときがある。

  1. ドラッグで全体を選択。
  2. [修正]→[尺度変更]。または右クリック→[尺度変更]
  3. [基点を指定]:尺度変更時の基点(固定点)を指定

  4. [尺度を指定 または [参照(R)]]→rを入力
  5. [参照する長さを指定<1>]:尺度を変更したい基準とする線分の始点を指定。[2点めを指定]:終点を指定。

  6. [新しい長さを指定]:基点から伸ばしたい長さの終点を指定する。

参考:AutoCAD LT 使い方 尺度変更・ストレッチ・長さ変更 http://cad.dee.cc/step1/step1_11.html

XYの片方向だけの尺度変更

AutoCADでは通常の方法では縦横比を変えての尺度変更はできない。つまり,横や縦だけ縮尺を変えられない。しかし,プロック化することで一応可能だ。ブロック化するためその後の操作はしづらいので注意が必要だ。

  1. 尺度変更したいものをコピー。
  2. [右クリック]→[ブロックとして貼り付け]
  3. 貼り付けたブロックを選択し,オブジェクトのプロパティのジオメトリから尺度Xなどに縮尺を設定する。

ブロック貼り付け http://cad.main.jp/m-class/09.htm

Gitリポジトリの分割

今まで,configリポジトリにdotfileとかその他の設定ファイルをまとめて管理していた。しかし,configリポジトリが大きくなってきた。そこで,configリポジトリからdotfileを新しいリポジトリに移すことにした。以下の記事を参考に実施した。

参考:GitHub - gitの特定のディレクトリをブランチ毎別リポジトリにする方法 - Qiita http://qiita.com/wataru420/items/f1eb7cf37fe5ba4980c3

  1. まず新しく作るリポジトリ用のディレクトリを作る。
    mkdir -p ~/project/; cd ~/project
  2. 新しく作ったディレクトリに元のプロジェクトをcloneする。
    git clone git@github.com:lamsh/config dotfile
  3. 以下のコマンドで分離したいサブディレクトリの情報だけ抽出。
    git filter-branch --subdirectory-filter dotfile -- --all
  4. リモートリポジトリの情報を削除して新しいリモートリポジトリを登録・push(事前にGitHubでリポジトリを作成しておく)。
    git remote rm origin
    git remote add origin git@github.com:lamsh/dotfile
    git push --all

これでリポジトリの分離が完了。もともとあったconfig/dotfileはgit rm -r dotfileで削除してコミットすればOK。

なお,間違えてgit filter-branchを使ってしまった場合は以下のコマンドで戻せる。

git reset --hard .git/refs/original/refs/heads/master

Undo git filter-branch - Stack Overflow http://stackoverflow.com/questions/14542326/undo-git-filter-branch

2015-10-28

Windows標準のリモートデスクトップでWindows Home Premiumにリモート接続する方法

不自由なOSであるWindowsにはmstsc.exeというリモートデスクトップのプログラムが標準でインストールされている。しかし,mstsc.exeでサーバー(接続先)として使えるOSには制限があり,広く使われているHome Premiumのエディションでは使えない。あくまでクライアントとしてしか使えなかった。

そのため,Windows Home Premiumにリモートデスクトップ接続したければ,UltraVNCなどの別のリモートデスクトップソフトを使うしかなかった。しかし,一部のWindowsの更新プログラムをアンインストールして,有志が作ったプログラムを実行してWindowsにパッチをあてることで,Windows Home Premiumでもmstsc.exeの接続先として使えるようになる。Windowsの標準機能だけでリモートデスクトップ接続ができれば,他の人のPCから自分のPCにログインして作業ができて便利である。

以下に書かれている情報を参考にして実現できる。

  • Rappazubon : Windows 7 Home Premium で リモートデスクトップを使う http://blog.livedoor.jp/rappazubon/archives/51943235.html
  • Windows 7 Home Premiumでリモートデスクトップを有効化する | 俺的備忘録 〜なんかいろいろ〜 http://orebibou.com/2014/05/windows-7-home-premium%e3%81%a7%e3%83%aa%e3%83%a2%e3%83%bc%e3%83%88%e3%83%87%e3%82%b9%e3%82%af%e3%83%88%e3%83%83%e3%83%97%e3%82%92%e6%9c%89%e5%8a%b9%e5%8c%96%e3%81%99%e3%82%8b/
  • 『Concurrent RDP Patcher』で有効化したWindows 7 Home Premiumのリモートデスクトップが接続できなくなったときの対応 | 俺的備忘録 〜なんかいろいろ〜 http://orebibou.com/2014/11/%E3%80%8Econcurrent-rdp-patcher%E3%80%8F%E3%81%A7%E6%9C%89%E5%8A%B9%E5%8C%96%E3%81%97%E3%81%9Fwindows-7-home-premium%E3%81%AE%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88/

[Concurrent RDP Patcher]というソフトを使う。配布元が公開を停止した場合に備えて自分のGoogle Driveでも公開しておく。何か問題があれば公開を停止する。

Concurrent RDP Patcher:https://drive.google.com/open?id=0B_vu4pIToNmuVUFKR1NxUTZQQjg

元々はこのソフトだけでリモートデスクトップのオン・オフを設定できた。しかし,その後のWindowsの更新プログラムで使えなくなってしまった。具体的には,[Concurrent RDP Patcher]を起動すると,[OS info]欄に以下のメッセージが表示され利用できない。

Microsoft Windows 7 Home Premium - termsrv.dll has an unknown checksum

少し手間だが,原因となったWindows更新プログラムを削除することで,機能を有効化できる。セキュリティ的には危なくなるので自己責任で行うこと。自分は利便性を重視して実行した。

まず最初に以下二つの更新プログラムをアンインストールする。

  • KB2984972
  • KB3003743

アンインストールの手順は以下の通りだ。

  • [コントロールパネル]→[プログラム]→[インストールされた更新プログラムを表示]
  • [プログラム]列をクリックしてソート→プログラム:Microsoft Windowsから上記2更新プログラムを探してアンインストール→PCの再起動

一つずつアンインストール→再起動する必要がある。上記二つの更新プログラムをアンインストールしたら,[Concurrent RDP Patcher]を起動する。起動すると以下のウィンドウが表示される。


Optionとして2項目がある。それぞれ,以下のような意味となっている。

  • マルチログインの有効化
  • 空のパスワードの有効化

[マルチログイン]は複数のユーザーで1台のPCにリモートで接続して同時並行して作業するにはよいだろう。途中まで自分で作業し,後でリモートで接続して続きをやりたい場合はオンにしないほうがいい。[空のパスワードの有効化]はセキュリティ的にかなり危ないのでオンにしないほうがいい。

2015-10-31T1315追記:Google Driveにアップしていたファイルの共有設定が自分だけになっていたので他の人もダウンロードできるように共有範囲の設定を変更した。

2015-10-21

Setting icon for MSYS2 shortcut

MSYS2のショートカットにアイコンを設定した。設定手順を記す。

MSYS2をインストールすると,スタートメニューに[MinGW-w64 Win64 Shell]という名前でメニューが追加される。これを選択することで/mingw64/binにPATHを通した状態でMSYS2が起動できる。

しかし,この方法での起動には以下の問題がある。

  1. タスクバーにピン留めしたときのアイコンがMSYS2でない。
  2. タスクバーにピン留めしたアイコンをクリックして実行すると,余分にタスクバーにターミナルのアイコンが表示されてしまう(下図参照)。

  3. ターミナルのアイコンをタスクバーにピン留めして実行した場合,MSYS2のPATHが一切設定されていない状態となる。

これは,スタートメニューの[MinGW-w64 Win64 Shell]が環境変数を設定してminttyを実行すようなbatファイルになっているためだ。[MinGW-w64 Win64 Shell]をタスクバーにピン留めして右クリック→プロパティからリンク先を見ると以下の内容となっている。

C:\Windows\System32\cmd.exe /A /Q /K C:\msys64\mingw64_shell.bat

このようにcmd.exeからmingw64_shell.batmingw32_shell.bat)を起動している。mingw64_shell.batは中で環境変数を設定してminttyからbashを起動している。仕組みがわかれば自分で設定できる。mingw64_shell.batmingw32_shell.bat)では環境変数MSYSTEMの設定が重要である。この環境変数の設定でMSYSから使うMinGW-w64のアーキテクチャ(64/32bit)ごとのプログラムのPATH(それぞれ,/mingw64/bin/mingw32/bin)を設定している。以下のようにすることでアーキテクチャを指定できる。

  • MinGW-w64の32bit版:MSYSTEM=MINGW32
  • MinGW-w64の64bit版:MSYSTEM=MINGW64

この仕組みがわかっていれば自分でショートカットを作り,MSYS2起動時にアイコンの設定も可能だ。ここでは設定の手順を記す。

  1. どこでもよいが,例えばデスクトップ[右クリック]→[新規作成]→[ショートカット]でショートカットを作成する

  2. リンク先に以下を記述する。
    C:\msys64\usr\bin\mintty.exe -i /msys2.ico /bin/env MSYSTEM="MINGW64" /bin/bash --login -i

  3. ショートカットの名前を[MSYS2-64 Terminal]にする。

  4. 作成されたアイコンを右クリックして[プロパティ]を選択。

  5. [ショートカットタブ]→[アイコンの変更]

  6. [このファイル内のアイコンを検索]に以下を入力して,その後表示されたアイコンを選択。
    %SystemDrive%\msys64\msys2.ico

この設定で以下のようにアイコンが設定された。

あとはこれをタスクバーにピン留めしておけばクリック一発でMINGW64にPATHのとおったMSYS2が起動できる。自分で設定するのが面倒ならば,以下にMINGW32とMINGW64に設定済みのショートカットを用意しているので使うとよい。ファイル名を選択→Rawボタン押下でダウンロードできる。拡張子が.downloadになっていたら.downloadを削除してリネームすればよい。

https://github.com/lamsh/uploader/tree/master/MSYS2/shortcut

参考:Windows/MinGW-MSYS/インストール - yanor.net/wiki http://yanor.net/wiki/?Windows-%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%2FMinGW-MSYS%2F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB