Bash on Ubuntu on Windowsで日本語ターミナル環境を快適に使う3

下記の記事で紹介されている、wsl-terminal を使う方法が現状ベストだと思います。
Bash on Ubuntu on Windows + オールインワンmintty
簡単に導入出来て普通にminttyでBoWが使えちゃいます。凄い。
また cbwin というツールも一緒に使える様になっていて、Windowsのプログラムも実行できます。言うことなしですね。

Bash on Ubuntu on Windowsで日本語ターミナル環境を快適に使う2

OpenSSHのsshdが起動しないって書いたのですが、どうやら私の環境がダメなだけかもしれません。
下記のリンク先で自動起動も含め、sshdの使用法が紹介されていますので参考にしてみてください。
Bash on Ubuntu on Windows で SSH を利用する
私もやってみましたが何故か上手くいかなかったので、前回までの設定を行った上でとりあえず安直にスタートアップにbash.exeを登録しました。

Windowsのプログラムも実行したい

さて、今までWindows上のCygwin環境でやっていた事の殆どをBash on Windowsに置き換えて作業できる様になって来たので、後はターミナルからWindowsのプログラムを実行出来れば完全に移行できそうな気がします。まぁ、普通はそんなに必要無いんでしょうが、私の場合w3mから外部ブラウザを開く操作を頻繁にしますし、CUIのファイラからエクセルとかを起動するなんて事もあるので結構必須な機能なんです。
Cygwinの場合だと /cygdrive/c を起点としてフルパスで指定すれば難なく設定出来ますが、Bash on Windowsではそう簡単にはいかないので、一般的なLinux上からネットワーク経由でWindowsのコマンドを実行するのと同じ手段で実現する形になります。ちょっと調べてみたらWindows用のRSHデーモンや"winexe"というツールを使用する方法が見つかりましたが、どちらも上手く行きませんでした(winexecはCUIコマンドならOK、GUIを起動するオプションは最近のWindowsでは効かないみたい)。
なので今回はandLinux向けの下記サイトの情報を参考にdRubyを使用して実現したいと思います。
andLinuxからWindowsコマンドの呼び出し

Windows側の設定

まずはWindowsRubyをインストールします。私は今回はUSB Rumix 2っていうインストーラ無しでコンパクトにRuby環境を整えるパッケージを使用しましたが、RubyInstallerや参考サイトの様なCygwinRuby等、なんでもイケると思います。
準備出来たら下記の内容でwinexec-executer.rbというファイルを作って適当な場所に保存し、起動しておきましょう。


#!/usr/bin/ruby
require 'drb/drb'
require 'open3'
DRb.start_service('druby://127.0.0.1:12346', Open3)
sleep

Bash on Windows側の設定

こちらにも普通にapt-getでRubyをインストールしたら、下記内容でwinexec-teller.rbを作成します。


#!/usr/bin/ruby
require 'drb/drb'
DRbObject.new_with_uri("druby://127.0.0.1:12346").popen3(ARGV[0])
これを/usr/local/bin等パスが通った場所に保存し実行権限を与えて置きます。

Windowsプログラムの実行

ここまで出来たら、後はBash on Windowsのターミナルから、


winexec-teller.rb notepad
って打つだけでメモ帳が起動します。
w3mの外部ブラウザをWindowsの標準ブラウザにするなら、Bash on Windows上の$HOME/.w3m/configに

extbrowser winexec-teller.rb "start %s"
と追記すればOKです。
うんうん、なかなか快適です♪

Bash on Ubuntu on Windowsで日本語ターミナル環境を快適に使う

WindowsUbuntuが使える!

2016年8月2日のAnniversary UpdateでWindows 10上のLinux環境「Bash on Ubuntu on Windows」が提供されますねー。心待ちにしている方も多いんじゃないでしょうか?

現状はまだリリース前ですが、開発者向けのInsider Previewを用いる事で既に利用可能になっているので、私みたいに8/2まで待ちきれない方は下記リンク先の様にわかりやすく解説してくれているサイトを参照の上、導入しちゃっても良いでしょう。


Windowsに採用されたBash (Ubuntu)を試してみる

導入後は追加されたアイコンをクリックすれば普通にシェル(zshとかも使えます)経由でLinuxが使える様になります。標準のターミナルはコマンドプロンプトベースなので何かと不便ですが、ConEmu等のコマンドプロントの代替ツール経由でbashを動かせば日本語の入出力が一応出来る様にはなります。
ただ、これでもBSキーで日本語が2文字消える等、文字幅の計算がおかしい様で常用するには厳しい状況なので、ssh経由でログインして使ってみる事にしました。
以下に備忘録的にズラズラっと列挙してみます。
OpenSSHのsshdは起動はすれども繋がらない様だったので、dropbearを使ってます。

/etc/apt/sourses.listの設定

以下のように編集、保存します。


deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty main restricted universe multiverse
deb-src http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-updates main restricted universe multiverse
deb http://ftp.jaist.ac.jp/pub/Linux/ubuntu trusty-security main restricted universe multiverse

日本語化


sudo apt-get update
sudo apt-get install language-pack-ja
sudo update-locale LANGUAGE=ja_JP.UTF-8 LC_ALL=ja_JP.UTF-8 LANG=ja_JP.UTF-8
sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

dropbearのインストール


sudo apt-get install dropbear
デーモンは使えない様なので、bashの起動スクリプトで起動させてます。もっといい方法があるとは思います。

echo "sudo service dropbear start" >> .bashrc
パスワード無しでdropbearが起動する様に、

sudo visudo
で開かれた設定ファイルに

[ユーザー名] ALL=NOPASSWD: /usr/sbin/dropbear
と追記し、保存します。
これでBash on Windowsのアイコンクリックでsshサーバが起動する様になります。

puttyの導入

以下のページからputty.exeを頂いてきます。
PuTTY Download Page
適当なフォルダに置いたら、1度クッリクして起動します。新規にlocalhostssh接続するセッションを作り、フォントの設定等を行った後で名前(ここでは"BOW"とします)を付けて保存します。
次にputty.exeのショートカットを作り、プロパティの「リンク先」を


[puttyを置いたフォルダのパス名]\putty.exe -load BOW -l [ubuntuのユーザ名] -pw [ubuntuのパスワード]
という感じに設定します。
鍵認証方式にした方がいいかもしれませんが、現状自分はこうしてます。

puttyの見た目を変更

下記のリポジトリから、solarized_dark.regを頂いてきます。

https://github.com/brantb/solarized/tree/master/putty-colors-solarized
puttyのフォルダに保存したら、エディタで開いて下記のようにSessionsの後をputty上で作成したセッション名に変更します。


[HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\Sessions\BOW]
変更後にダブルクリックしてレジストリに反映させます。
これで、puttyのショートカットのクリックで見易いターミナルでUbuntuを操作出来るようになる筈です。

tmuxのインストール

Ubuntu Trustyのtmuxは古いので、最新版のtmuxをビルドして使います。


sudo apt-get build-dep tmux
git clone https://github.com/tmux/tmux.git
cd tmux
sudo ./autogen.sh
sudo ./configure
sudo make
sudo make install

ここまでの作業で、以下の様な環境が整う筈です。Vim等での日本語入力も快適です。もしかしたら8/2のupdateでこんな面倒な事は不要になっちゃうかもしれないですね(笑)
ではまた!

↑やっぱりJnetHackはビルドしてるし(笑)

rbox更新

アップローダにTerm20131128.apkを置きました。ちょっとVim Touchの真似をして、アクションバーにIME ON/OFF の切替(鉛筆のアイコン)と[ESC]キーを付けました。手元の環境だと[TAB]が"[VolumeUp]+[T]"、[CTRL]が"[VolumeDown]"にアサインされているので、比較的ATOK等のIMEでも扱いやすくなった気がします。ウィンドウを閉じたり追加したりする場合はメニューの「ウィンドウ一覧」等から行えます。
例によってVimプラグイン管理をNeoBundleで行う設定が.vimrcに記述されているので必要に応じて書き換えるなりしてください。とりあえず私と同じ設定にするならば、$HOMEの"bundle.sh"を実行してNeoBundleとUniteをgit cloneした後にVimを起動して :Unite neobundle/install すれば良いかと思います。
ではでは。

Vimから電話がかけられるなんて・・・素敵!

このエントリーはVim Advent Calendar2012の301日目の記事です。

Vimで電話?

スマホVimを入れてるVimmerなら、Vimから電話掛けれたらな〜って1度は思ったことありますよね?(オレだけ?)。この度そんな願望を叶えるためのunite-sourceをちょこっと書いてみたので紹介してみたいと思います。

電話帳の取得は?

もちろんAndroid端末は内部に連絡先のデータベースを持っており、そこから情報を取得できれば一番いいんですが、ターミナルエミュレータで動いてるAndroidネイティブなCUIアプリからそれをやるのは恐らく無理だと思われます。さてどうしたものかと考えて思いついたのは、スマホの「連絡先データのエクスポート」でSDカード上に出力されたファイルを使ったらどうか?というものでした。vcard形式のこのファイルのUTF-8エンコードされた部分をデコードしてリスト作成は出来るには出来るんですが、なんかあまりカッコよくない。んで最終的に辿り着いたのは、「ネットワーク経由でGoogle Contact APIを叩いて連絡先を取得する」方法です。オンラインじゃなきゃ使えませんが、これから電話しようって時にオフラインな状況下ってのはまず無いと思うので良しとします。

スマホの連絡先情報の保存

Android端末の連絡先データの保存先は、機種にもよりますが「1:キャリアのアカウント」、「2:本体」、「3:Googleアカウント」から選べる形になってると思います。この中で「3」を選ぶとデータがクラウド上で管理されるので携帯キャリアを変えたり機種変したりしても簡単にデータ移行できますし、PCのブラウザでGoogleにログインして編集したりといったことも可能です。今回Vimから扱うのもこのGoogleアカウントに紐づいた連絡先情報という事になります。
すでに連絡先を本体のみに保存してしまっている場合でもGoogleアカウントに同期させることは可能です。方法はググってみてください。

unite-sourceについて

Google Contact APIを叩く部分がcurlなのは仕方ないにしても、そこ以外はVimスクリプトだけで書きたかったんですが、精進不足でweb-apiが上手く使えなかったのでXMLのパースはrubyでやってます。動作にはAndroid上のターミナルアプリで端末Vimrubyが使える環境が必要で、1から作るには結構大変なんですが、拙作のrboxだとTermYYYYMMDD.apkのインストールだけで整います。IS01専用のMCVTってのもあります。
拙いコードで申し訳ないんですが、以下にのっけます。


let s:save_cpo = &cpo
set cpo&vim

" unite-source の設定を定義する
let s:unite_source = { 'name': 'denwa' ,
\ }
let s:denwa = []


" Google Contact API を叩いて連絡先を取得
function! s:get_contact_list()
let auth = vimproc#system("
\ curl -s https://www.google.com/accounts/ClientLogin
\ --cacert $RBOX/usr/share/curl/curl-ca-bundle.crt
\ -d Email=YOUR_EMAIL
\ -d Passwd=YOUR_PASSWD
\ -d accountType=GOOGLE
\ -d source=Google-Contact-Lister
\ -d Gdata-version=3.0
\ -d service=cp | grep ^Auth= | sed 's/^Auth=//' ")

let cmd = "curl -s https://www.google.com/m8/feeds/contacts/default/full?max-results=1000
\ --cacert $RBOX/usr/share/curl/curl-ca-bundle.crt
\ -H 'Content-Type: application/atom+xml'
\ -H 'GData-Version: 3.0'
\ -H 'Authorization: GoogleLogin auth=" . auth ."'"

let ret = vimproc#system(cmd)
return ret
endfunction


" XML の連絡先をパースしリストを作成
function! s:get_data()
let str = s:get_contact_list()
ruby << EOC
require 'rexml/document'
x='';y='';z=''
ruby_ret = VIM.evaluate('str')
doc = REXML::Document.new(ruby_ret)
doc.elements.each('feed/entry') do |element|
title = element.elements['title']
fname = element.elements["gd:name/gd:familyName"]
phoneno = element.elements['gd:phoneNumber']
if title.length > 0 && !phoneno.nil? then
x = title.text + " "
x = x + "(" + fname.attributes['yomi'] + ") " if !fname.nil? && !fname.attributes['yomi'].nil?
x = x + phoneno.text
y = "echo am start -a android.intent.action.DIAL tel:#{phoneno.text} | /system/bin/sh"
z = z + "[\"#{x}\",\"#{y}\"],"
end
end
z = "[#{z}]"
VIM.command(%Q[let s:denwa = #{z}])
EOC
endfunction


" unite.vim で表示される候補を返す
function! s:unite_source.gather_candidates(args, context)
if empty(s:denwa) | call s:get_data() | endif
return map(copy(s:denwa), '{
\ "word": v:val[0],
\ "source": "denwa",
\ "kind": "command",
\ "action__command": "call unite#util#system(''".v:val[1]."'')"
\ }')
endfunction


" unite.vim に source を登録
"call unite#define_source(s:unite_source)
"unlet s:unite_source
function! unite#sources#denwa#define()
return s:unite_source
endfunction

let &cpo = s:save_cpo
unlet s:save_cpo

YOUR_EMAIL,YOUR_PASSWDはご自分のものに置き換えてください。

使い方

◆ 上記のコードを"denwa.vim"という名前で ~/.vim/bundle/unite.vim/autoload/unite/sources に保存したら早速Vimを起動して"Unite denwa"してみましょう。






◆ 基本的には「氏名 (ふりがな) 電話番号」の形式で表示されます。(本当の私の連絡先を晒すわけには行かないので、下図はテストアカウント&テストデータによるものです。)



◆ 四天王で絞り込み、広目天さんに電話してみましょう。リスト上で[Enter]押下です。




◆ あとは[ダイアル]ボタンを押せば電話がかかります。




如何ですか?実用性はともかくw,Google Contact API & Unite & Androidインテントの組み合わせは結構面白いと思うんですけど。
応用としては、Uniteで選択した複数の連絡先のメールアドレスに、編集中のバッファを本文としてメールを送ることなんかも出来るんじゃないかなって考えたりしてます。
ではまたー。

Androidでeskk.vimを使ってみた

このエントリーはVim Advent Calendar2012の294日目の記事です。

Vimで日本語入力を行えるプラグインの中にtyruさんのskk.vim/eskk.vimがあり、rboxには今まで前者のskk.vim(anyakichiさんのfork版ですが)を同梱していました。これはこれでgoogle-ime-skkと連動も出来て便利なんですが、rboxのVimでもLuaJITの有効化によりneocompleteが使える様になったので、eskk.vimとの組み合わせを試してみたくなったんです。


◆ まずはrboxに入ってるskk.vimを削除します。


~% rm ~/.vim/plugin/skk.vim

◆ 次に .vimrc の編集です。skk.vimに関する設定部分を削除またはコメントアウトしたら、NeoBundleの設定箇所に下記を追記します。


NeoBundle 'tyru/eskk.vim'

◆ ついでにeskk.vimの設定も追記しときましょう。わたしはとりあえず下記の様にしました。


" eskk
let g:eskk#large_dictionary = {
\ 'path': $HOME . "/SKK-JISYO.L",
\ 'sorted': 1,
\ 'encoding': 'euc-jp',
\}

let g:eskk#enable_completion = 1
let g:eskk#egg_like_newline = 1


◆ 設定を終えたらUnite-Neobundle/Installしましょう。(skk-dict.vimは必要なかったかもしれません。)


◆ 忘れてましたー。SKK-JISYO.Lこちらからダウンロードし、$HOMEに置きましょう。


◆ はやる気持ちを抑えつつ早速Vimを起動し[Ctrl]+[j]。




実はeskkは設定が良く分からなくてPCでも使ってなかったんで、いきなりこの環境で試したわけですが、ちゃんと自動補完されてる様で結構感動ものです。今の設定だと[Ctrl]+[N]or[P]で候補選択するんですけど、[TAB]でも出来るようにしたいと思ってます。
ではまた〜。

AndroidでTweetVimを使うには

rboxでやるととっても簡単だよって話です。



色々と気になる点があったんですが、ブログにコメント欄が無かったのでこちらでエントリーを書かせて頂きます。(ちなみにrboxってのはここで公開してる改造版Android TerminalEmulatorです。)
まずその1の方

  • 同梱されているRubyjRubyではなくCRuby
  • gitコマンドの記述の部分は単にプラグイン管理ツールであるNeoBundleをインストールするための手順であり、エラー対処している訳ではない。これを先にやらずにいきなりVimを起動するとエラーメッセージが出るってだけの話。そんでもって:NeobundleInstallすると$HOME/.vimrcでの設定に従いTweetVimで使うプラグインは全て自動でインストールされます。



続いてその2

  • 上でも書いた様に:NeobundleInstallにより必要なプラグインが導入されるので、gitで落として手動でインストールする必要は無いです。
  • rboxの場合、vimprocは私がコンパイルしたものを予め導入してあります。自分で落として来たものを使う場合は、AndroidNDKを使用しビルドする必要があります。
  • rbox上ではアイコン表示は出来ません。




実際にrboxの現時点の最新版(Term20130905.apk)を使用した場合の導入手順を示しますね。


◆ rboxがインストールできたらすかさずNeoBundleを入れる。ソフトキーボードは"Keyboard with Ctrl key"を使ってます。5インチの端末でも打ち間違いも少なく使いやすいと思います。



Vimを起動し、:NeoBundleInstallする。これによりTweetVimを含め、いくつかのプラグインがインストールされる($HOME/.vimrc参照)。



◆ :TweetVimHomeTimelineでTweetVim起動。



◆ するとインテントによりURLを開くアプリを選択する画面が表示されます。ここでは標準ブラウザを選択してみます。



◆ ブラウザで連携アプリの認証を促す画面に遷移します。Twiiterへのログインが必要です。



◆ PIN番号が表示されるので暗記しますw(コピペでもいいと思います。)



Vimに戻りPINを入力。



◆ タイムラインが表示されました。続けてUserStreamも試しましょう。



◆ ちゃんと動きますね。スワイプでログをスクロールしたり、URLにカーソルを合わせてエンター押下で外部ブラウザで表示したり出来ます。



◆ ソフトキーボードをOFFにして、ログを垂れ流しとくのもいいかも知れないですね。

ではでは興味ある方は試してみてください。