ござるのブログ

覚え書きいろいろ

VirtualBox上のFreeBSD 10.1でホストのOSX Yosemiteとsshfsでファイル共有

はじめに

OSX Yosemite上のVirtualBox内にFreeBSD 10.1を入れました。早速

$ pkg install virtualbox-ose-additions

として、virtualbox-ose-additionsをインストールしましたが、現時点で「共有ホルダー」は使えないようです。(ここで開発中らしいです。期待しています。)

そこで、sshfsでOSX YosemiteのフォルダをFreeBSDにマウントしたのですが、ちょっとてこずりました。以下、手順メモです。

OSX Yosemiteでリモートログインを有効にする

これが無いと始まりません。「システム環境設定」→「共有」→「リモートログイン」にチェックを入れます。

f:id:gzalt:20150215093844p:plain

VirtualBoxの設定

下記のように、外部との通信用の「アダプター1」(NAT)に加えて、OSX Yosemiteとやりとりするための「アダプター2」(ホストオンリーアダプター)を追加します。

f:id:gzalt:20150215101601p:plain

FreeBSD 10.1の設定

fusefs-sshfsのインストール

$ pkg install fusefs-sshfs

/boot/loader.confの編集

FUSEを有効化する。

fuse_load="YES"

/etc/rc.conffusefs_enable="YES"とするという記事を見かけますが、変わったようです。(参考)

/etc/sysctl.confの編集

ユーザランドでマウントが利用できるようにする。

vfs.usermount=1

/etc/rc.confの編集

ifconfig_em0="DHCP"
ifconfig_em1="inet 192.168.56.203 netmask 255.255.255.0"
vboxguest_enable="YES"
vboxservice_enable="YES"

em1が「アダプター2」(ホストオンリーアダプター)です。OSX Yosemitevboxnet0192.168.56.1なので、適当に192.168.56.203の固定アドレスを設定しました。

/etc/groupの編集

operator:*:5:root,[自分のアカウントを追記]

やっとマウント

FreeBSDを一旦再起動して、ログイン後

$ mkdir hostdir
$ sshfs -o idmap=user 192.168.56.1: hostdir

とすると、パスワードを聞かれるので入力します。うまくいけば、OSX Yosemiteのホームディレクトリがhostdirにマウントされて、読み書きできるようになるはずです。

最後に

かなり前にFreeBSD(98)をいじって遊んだことがあるので、いろいろなつかしいです。

OSX Yosemiteにrbenvとruby-buildでRuby 2.2.0を入れる時のconfigureオプション

自分がOSX Yosemiterbenvruby-buildRuby 2.2.0を入れる時のconfigureオプションを、覚え書きとして残しておきます。

$ RUBY_CONFIGURE_OPTS="--enable-pthread --enable-shared \
--with-readline-dir=`brew --prefix readline` \
--with-openssl-dir=`brew --prefix openssl` \
--with-libyaml-dir=`brew --prefix libyaml` \
--with-opt-dir=`brew --prefix gdbm`:`brew --prefix gmp`:`brew --prefix libffi`" \
rbenv install 2.2.0

見ての通りHomebrewreadline、openssl、libyaml、gdbm、gmp、libffiを入れて、それらを使うようにしています。

Tcl/Tkに関するオプションは何もありませんが、Ruby/TkOSX Yosemiteに入っているTcl/Tk 8.5が普通に使えました。

Ruby/Tkで少しだけインタラクティブなグラフを表示する

はじめに

以前書いたように、Ruby/TkPlotchartでグラフを表示できるのですが、それだけではつまらないので、ちょっとだけマウスと連動させてみます。

コード

#!/usr/bin/env ruby
# -*- coding: utf-8 -*-

require 'csv'
require 'tk'
require 'tkextlib/tcllib/plotchart'

# plotchart.rb を修正するモンキーパッチ
module Tk::Tcllib::Plotchart
  class XYPlot
    def pixel_to_coords(x, y)
      list(tk_call_without_enc('::Plotchart::pixelToCoords', @path, x, y))
    end
  end
end

# データを読み込み
en, cn = CSV.parse(DATA).map { |r| [r[0].to_f, r[1].to_i] }.transpose

# データをプロット
pl = Tk::Tcllib::Plotchart::XLogYPlot
     .new([0, en.size, 10**Math.log10(en.size).floor],
          [1, 10**Math.log10(cn.max).ceil],
          width: 600, height: 400) do
  title 'Spectrum'
  xtext 'Channel'
  ytext 'Counts/Channel'
  dataconfig('series1', color: :red)
  cn.each_with_index { |c, i| plot('series1', i, c) }
  pack(fill: :both)
end

# マウスカーソルの位置の値を表示
label = TkLabel.new.pack
pl.bind(:Motion, '%x %y') do |x, y|
  ch = pl.pixel_to_coords(x, y)[0].to_i
  if 0 <= ch && ch < en.size
    label.text(sprintf('%10d ch, %10.1f keV, %10d counts',
                       ch, en[ch], cn[ch]))
  end
end

# イベントループ
Tk.mainloop

__END__
32.78,1074
62.72,12131
92.70,13944
122.72,13110
152.79,11859
182.90,13204
213.05,11647
243.24,8780
273.47,7412
303.75,6632
334.07,6460
364.43,6369
394.83,6503
425.28,6566
455.76,5250
486.29,2766
516.86,1574
547.48,1062
578.13,914
608.83,3532
639.57,15018
670.35,18992
701.18,6495
732.04,660
762.95,177
793.90,157
824.89,134
855.93,154
887.00,131
918.12,124
949.28,129
980.48,113
1011.73,96
1043.01,103
1074.34,112
1105.72,92
1137.13,95
1168.58,86
1200.08,85
1231.62,66
1263.20,50
1294.83,29
1326.49,40
1358.20,33
1389.95,47
1421.74,93
1453.57,111
1485.45,67
1517.37,41
1549.33,19
1581.33,17
1613.38,11
1645.46,13
1677.59,18
1709.76,15
1741.98,10
1774.23,6
1806.53,13
1838.87,15
1871.25,11
1903.67,6
1936.14,8
1968.64,6
2001.20,8

実行結果

OSX Yosemiteで実行した結果です。下記のように、マウスカーソルの位置の値がグラフの下に表示されます。

f:id:gzalt:20141219145331g:plain

Ruby 2.2.0同梱のplotchart.rbのバグ

グラフ内におけるマウスカーソルの座標を取得するためにTk::Tcllib::Plotchart::XLogYPlot#pixel_to_coordsを使ったのですが、Ruby 2.2.0 同梱のplotchart.rbにはバグがあるので、下記のようにモンキーパッチを当てています。

module Tk::Tcllib::Plotchart
  class XYPlot
    def pixel_to_coords(x, y)
      list(tk_call_without_enc('::Plotchart::pixelToCoords', @path, x, y))
    end
  end
end

既に修正が本家に取り込まれたようなので、そのうち必要なくなると思います。

最後に

Ruby/TkPlotchartさえ入っていればWindowsでも動きます。しかし、WindowsPlotchartを使えるようにするまでがちょっと面倒でした(こちらに書きました)。

iCloudのどこでもMy MacでMosh (mobile shell)を使う

はじめに

iCloudどこでもMy Macを使うと、こちらで紹介されているように、出先から自宅のMacSSHでログインできます。今回はさらに「SSHよりも高速」というMoshを、どこでもMy Macで使えるようにします。Moshの仕組みについては、こちらが詳しいです。

Moshのインストール

サーバとクライアントの両方のMacMoshの最新版をインストールします。Homebrewを使えば簡単です。

$ brew install --HEAD mosh

これでSSHで接続する時と同様にクライアントから

$ mosh hoge@fooMac.999999999.members.btmm.icloud.com

などとすれば、サーバに接続できそうな気がするのですが、

/usr/local/bin/mosh: Could not resolve hostname fooMac.999999999.members.btmm.icloud.com
ssh_exchange_identification: Connection closed by remote host
/usr/local/bin/mosh: Did not find remote IP address (is SSH ProxyCommand disabled?).

と言われてうまくいきません。そこで、こちらに書かれているようにクライアント側のmoshコマンドを以下のように修正します。1行加えるだけです。

--- /usr/local/opt/mobile-shell/bin/mosh.orig   2014-12-05 13:18:17.000000000 +1100
+++ /usr/local/opt/mobile-shell/bin/mosh        2014-12-05 13:23:49.000000000 +1100
@@ -36,6 +36,7 @@
 use strict;
 use Getopt::Long;
 use IO::Socket;
+use IO::Socket::INET6;

 $|=1;

これで

$ mosh -6 hoge@fooMac.999999999.members.btmm.icloud.com

とすれば、サーバに接続できるようになりました。

OSXにHomebrewで入れたnkfでman nkfするとfatal error: invalid device `nippon'と言われるのをなんとかする

はじめに

OSX YosemiteHomebrewnkfw3mなどを入れているのですが、

$ man nkf

とすると

/usr/bin/groff: can't find `DESC' file
/usr/bin/groff:fatal error: invalid device `nippon'

と言われて表示できません。しかし、こちらで紹介されている通りにやると、nkfのmanを日本語で閲覧することができました。

Homebrewでgroffをインストール

こちらで紹介されている通りに、Homebrewでgroffをインストールします。

$ brew tap homebrew/dupes
$ brew install groff

/etc/man.confの修正

$ sudo -e /etc/man.conf

で以下のように修正します。

--- /etc/man.conf.orig  2014-09-10 09:16:35
+++ /etc/man.conf       2014-12-03 22:10:24
@@ -92,7 +92,7 @@
 #
 TROFF          /usr/bin/groff -Tps -mandoc -c
 NROFF          /usr/bin/groff -Wall -mtty-char -Tascii -mandoc -c
-JNROFF         /usr/bin/groff -Tnippon -mandocj -c
+JNROFF         /usr/local/bin/groff -Dutf8 -Tutf8 -mandoc -mja -E
 EQN            /usr/bin/eqn -Tps
 NEQN           /usr/bin/eqn -Tascii
 JNEQN          /usr/bin/eqn -Tnippon
@@ -102,8 +102,8 @@
 PIC            /usr/bin/pic
 VGRIND
 GRAP
-PAGER          /usr/bin/less -is
-BROWSER                /usr/bin/less -is
+PAGER          /usr/bin/less -isr
+BROWSER                /usr/bin/less -isr
 HTMLPAGER      /bin/cat
 CAT            /bin/cat
 #

これで

$ man nkf

とすると

nkf(1)                                                                                              nkf(1



NAME
       nkf - ネットワーク用漢字コード変換フィルタ

SYNOPSIS
       nkf [-butjnesliohrTVvwWJESZxXFfmMBOcdILg] [file ...]

DESCRIPTION
       nkf はネットワークでメールやニュースの読み書きをするために作られた、漢字コードの変換フィルタであ
       る。

...

このように日本語で表示されるようになりました。

w3mのmanをUTF-8に変換

ところが、

$ man w3m

とすると文字化けします。/usr/local/opt/w3m/share/man/ja/man1/w3m.1EUCなのが原因なので、UTF-8に変換します。

$ nkf -w --overwrite /usr/local/opt/w3m/share/man/ja/man1/w3m.1

これで、w3mのmanも読めるようになりました。

Yosemiteで動かなくなったCUPS-PDFの代わりにVipRiserを使う

はじめに

Wineskinという素晴しいソフトウェアのおかげで、とても有名な2D CADであるJw_cadOSX上で使用することができます。この場合、OSXに接続されたプリンタから印刷可能なのですが、OSXの通常の印刷ダイアログは表示されないので、PDFに出力したい時に困ります。これまでは、Homebrewでインストールした仮想プリンタCUPS-PDFを使っていたのですが、Yosemiteで動かなくなってしまいました(詳しくはここ)。しかし、VipRiserという別の仮想プリンタがうまく動きました。

VipRiserのインストール

VipRiserのサイトから、VipRiser.zipをダウンロードして中のVipRiser.appをアプリケーションフォルダにコピーするだけです。

仮想プリンタの登録

VipRiser.appを実行すると最初にプリンタドライバのインストールが行われます。ドライバのインストール後に表示されるダイアログに従って、「システム環境設定」→「プリンタとスキャナ」で、「+」をクリックしてPrint to VipRiserを下記のように登録します。

f:id:gzalt:20141114142843p:plain

CUPS-PDFを使ったことがあると、既にPrint to VipRiserが登録されていたりしますが、一度「-」で削除して、再度登録した方が無難です。これで、VipRiserを起動すれば、仮想プリンタが使えるようになります。下記のようにメニューバーのアイコンからPDFの出力先を指定できるので、CUPS-PDFより便利です。

f:id:gzalt:20141114144912p:plain

下記のようにWineskin上のJw_cadからもPDFに出力できるようになりました。

f:id:gzalt:20141114145421p:plain

最後に

VipRiserのアイコンは何なのだろう…

LanguageToolをOSX Yosemiteで使う

はじめに

英作文がとにかく苦手なので、GingerFirefox拡張にかなりお世話になっていたのですが、今日確認したところ「このアドオンは作者によって削除されました。」となっていました。ChromeSafariを使えば良いのだと思いますが、私はFirefoxを使いたいのです。そこで、Gingerと同じように英文校正してくれるオープンソースのソフトウェアLanguageToolを使ってみることにしました。

インストール

HomebrewLanguageToolをインストールします。

$ brew install languagetool

とても簡単です。これで

$ languagetool-gui

とすると、下記のようなウィンドウが表示されます。

f:id:gzalt:20141113182222p:plain

上段にチェックしたい英文を入力すると下段にチェック結果が表示されます。

Firefoxのアドオンをインストール

languagetool-guiだけでもとても便利ですが、Firefoxから使えると、Gmaiiなどで英文メールを作成するときに便利です。そこで、FirefoxのアドオンLanguageToolFxをインストールし、下記のように設定の「URL of the local server」にhttp://localhost:58081と入力します。

f:id:gzalt:20141113183356p:plain

次にサーバを起動します。

$ languagetool-server -p 58081

これで、下記のようにFirefox上でLanguageToolが使えるようになります。

f:id:gzalt:20141113185822p:plain

実は、ローカルでlanguagetool-serverを起動しなくても、先のLanguageToolFxの設定で「Use web service when connecting with local server is not successful」にチェックを入れると、api.languagetool.orgに接続してLanguageToolFxが使えます。しかし、情報セキュリティが厳しくGingerなどが使えない場合でも、LanguageToolなら上記のようにローカルサーバを使うことができます。オフラインでも使えるので、とても便利だと思います。

ちなみに、ThunderbirdのアドオンはGrammar Checkerです。

languagetool-serverを自動起動する

languagetool-serverをいちいち手動で起動するのは面倒なので、私はログイン時にlaunchdで起動するようにしています。下記のような内容の~/Library/LaunchAgents/gzalt.languagetool-server.plistを作成します。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>KeepAlive</key>
    <true/>
    <key>Label</key>
    <string>gzalt.languagetool-server</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/languagetool-server</string>
        <string>-p</string>
        <string>58081</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
</dict>
</plist>

設定ファイルを読み込みます。

$ launchctl load ~/Library/LaunchAgents/gzalt.languagetool-server.plist

これで、ログイン時にlanguagetool-serverが自動起動するはずです。

$ ps x | grep language

などで、確認できます。

肝心の校正能力は?

まだちょっと使っただけですが、やはりGingerの方が性能が高い気がします。しかし、ローカル環境だけで使えるのはとてもうれしいです。 langtool.elがあるのも、Emacs使いにはうれしいところです。

最後に

ほんやくコンニャク欲しい。