2021年7月31日土曜日

Mozc on FreeBSD

家のマシンの日本語入力をAnthyからMozcに変更した。
(2022年1月9日追記:pkg upgradeで壊れたので復旧した。)

0. 前提

  • うちのマシン:FreeBSD 13.0-STABLE #3 amd64
  • うちのキーボード:HHK。半角全角キーはない
  • うちのデスクトップ環境:Mate 1.24.1
  • Emacsのもともの日本語入力:Anthy
  • Emacs以外(例えばFirefoxとかSofficeとかXfigとか)のもともとの日本語入力:
    uimとanthyの組合せ(iBusには移行していない。uimが動いているから) (参照:quantum の記録: [FreeBSD] uim-anthyは動きます(FreeBSD 11.1、2018年2月)

1. やったこと

1.1 Portsからのインストール

Portsから次のものをインストールする。
/usr/ports/japanese/mozc-server
/usr/ports/japanese/mozc-tool
/usr/ports/japanese/uim-mozc
/usr/ports/japanese/mozc-el
つまり
ls -d /usr/ports/*/*mozc*
で見つかるもののうち、それっぽいものをインストールしたわけだ。

1.2 ~/.emacs.elを一行変更する

 (when (featurep 'mule)
    (set-terminal-coding-system 'iso-2022-jp)
-(set-language-info "Japanese" 'input-method "japanese-anthy")
+(set-language-info "Japanese" 'input-method "japanese-mozc")
 (set-language-environment "Japanese")
(本当はanthyの行もコメントアウトして残してあるけれど、ここではこの示し方で良いでしょう。手で書いたんだし)

1.3 ~/.uimを変更する。

-(define default-im-name 'anthy)
+(define default-im-name 'mozc)
(1行しかないファイルである)

1.4 Mateの設定

MateのSystem->Preference->Personal->Input Methodで設定画面(uim-pref-gtk)を開く。
「手書きの~/.uimがあるよ、上書きしちゃうよ」とポップアップが出るのでOKする。
Global SettingsのInput method swithingの
Enable IM sitching by hotkey
のチェックボックスを外す。(これについては後述)

これで動いた。

2. Enable IM switching by hotkeyについて

これは、今までのAnthy時代は、ONになっていたが、今回外した。
EmacsではCtrl+\で入力切替し、それ以外ではShift+Spaceで入力切替するというのを変えたくなかったためだ。しくみはさっぱりわからない。
(チェックをONにすると、EmacsではShift+Spaceでも入力が切り替わり、かつ左下の入力メソッド表示に表示されない状態になる。Firefox他では、Shift+Spaceで切り替えられれなくなる。)

3. その他設定したこと・調べたこと

3.1 予測変換Off

$ mozc_tool --mode=config_dialog
で設定画面を開けるので、ここで予測変換をOffにした。
(私は、思考が乱される気がして、予測変換は好きではないのだ)
Portsとは違って、mozcとtoolの間はハイフンではなく、アンダースコアであることに注意。
modeは、
$ mozc_tool --help
を自分で見るよろし。

3.2 辞書登録

$ mozc_tool --mode=dictionary_tool
でインタラクティブにできる。Categoryは右クリックで変えられる。
辞書はファイルからも取り込める。
よみ 漢字 品詞 備考
を1つ以上のスペースで区切られたファイルを、読み込ませればよい。

4. pkg upgradeをして動かなくなったらこれをする(2022年1月9日追記)

状況確認と対応の記録は、別記事として記載したので、そちらを参照のこと。

4.1 uim-module-manager --register mozc

# uim-module-manager --register mozc
する。

4.2 uim-pref-gtk

Global settingsのInput method deploymentのEnabled input methodsのEditでMozcをEnableにしてやってCloseする。uim-pref-gtkでApplyしてOKで閉じる。
以上

参考

2020年6月21日日曜日

[FreeBSD] Canon PIXUS TS3130Sは動きます(FreeBSD 12.1、 2020年6月)

Canon BJ S500がついに限界に達して動かなくなったので、Canon TS3130Sを後継機として買った。
とくに苦労なく動いたのだが、「動く」ということ自体が情報であるので、ここに記録しておく。

概要

プリンタ機能はCUPS+gutenprintで動いている。
スキャン機能はxsaneで動いている。

詳細

CUPSの導入

今回、ついにCUPSを導入した。
Canonのサイトで配布しているLinux用ドライバではどうにもならなかったため。

必要なports

このタイミングで入れたportsはない。
過去にdependancyで入っていたもので足りた。
今、(pkg info -a -oで)確認したところ、入っていたportsは以下。
print/cups
print/cups-bjnp
print/cups-filters
print/gimp-gutenprint
print/gutenprint
graphics/sane-backends
graphics/sane-frontends
なお、graphics/sane-frontendはgraphics/xsaneに名前を変えたとの噂を聞いた。

FreeBSD側の設定

FreeBSD側の設定は、マニュアルを読まず、雰囲気でやった。
/etc/rc.conf.localに
cupsd_enable="YES"
を追加し、reboot。(rc.confでももちろんよいし、restartでテストしてもよい。)

CUPS内の設定

CUPS内の設定は、
http://localhost:631
にアクセスして、雰囲気でやった。
この時、プリンタの名前は後から変えにくいので、よく考えてつけること。

プリンタの持ち主

CUPSはdefaultではプリンタを自分だけのものとして、saneが使えなくなってしまうので、permissionを変更する。
具体的には、/usr/local/etc/devd/cups.conf内の
action "chgrp cups /dev/$cdev; chmod g+rw /dev/$cdev";

action "chgrp cups /dev/$cdev; chmod a+rw /dev/$cdev";
に変更。
(ログインユーザも何でもプリンタに何でもできるようになるので、セキュリティには留意のこと。私は家のマシンなら問題ないと判断した。)

スキャナの設定

別のCanonのスキャナが元々使えていたので、このタイミングでは何もしていない。
でもHandbookを見る限り、とくに設定はいらなそう。

プリンタの使い方

アプリケーション(firefoxとかAtrilとか)から印刷する時は、CUPSがきちんと設定されていると File->Printでそのプリンタが選べるようになるので、迷うことはない。
Postscript Fileについてもコマンドラインは放棄し、Atrilから印刷することにした。

スキャナの使い方

スキャンをするときは
$ xscanimage
でGUIが立ち上がるので、それを使う。

追記(2022年3月19日)

なんと、xscanimageがportsからなくなったが、CUIでスキャンできる。出力形式やoptionは好きにすればよい。
$ scanimage --resolution 300 | convert PNM:- -rotate 0 hoge.pdf

以上

2019年9月8日日曜日

FreeBSD上のVirtualBoxが不安定なのを解決するのに必要だったこと (2019年9月)

FreeBSD(12.0-STABLE、64bit)上のVirtualBox(5.2.32)に、 Ubuntu(18.04.3)をインストールしようとしていた。
(つまり、HostがFreeBSDで、GuestがUbuntu。)

しかしながら、何も考えずにインストールしたら あまりにも不安定で(症状は後述)、 いくつか設定が必要だった。

問題の切り分けが難しく、解決まで試行錯誤が必要だったので、 ここに記録を残しておくことにする。
(例えば、FreeBSDとVirtualBoxが原因だとしても、 症状としてはGuestのUbuntuが落ちるので、 検索語にUbuntuを入れてしまい、必要な情報にたどり着きにくかった。)
なお、以下ではそのUbuntu VMのことを単にUbuntuと書いている。VMとしての名前もhostnameもあるが、分かりにくくなるだけなので。

やること1. (FreeBSD)

HostのFreeBSDで、emulators/virtualbox-ose-kmodをVIMAGEをonにしてコンパイルしなおす。

やってないときの症状(VirtualBoxとFreeBSD)

VM VirtualBox Manager -> File -> Host Network Mangerで Createボタンを押すと、FreeBSDがKernel Panicで落ちる。

対処手順(FreeBSD)

HostのFreeBSDの管理者に、「emulators/virtualbox-ose-kmodをVIMAGEをonにしてコンパイルしなおして」と依頼する。

参考URL

Solved - VirtualBox 5.2.22 causes kernel panic with bridged adapter | The FreeBSD Forums
https://forums.freebsd.org/threads/virtualbox-5-2-22-causes-kernel-panic-with-bridged-adapter.68787/


やること2.(VirtualBox)

VirtualBoxのUbuntu VMのStorageのSATAの設定で、「Use Host I/O Cache」をonにする。

やってないときの症状(Ubuntu)

apt install xxx
をしている最中に、UbuntuごとAbortする。

より詳細には、サーバーからpkgをダウンロードしている途中(After this operation, xxx kB of additional disk space will be used.でyesと答えた後)で、aptが進まなくなる。 マウスとキーボードはしばらくは動くが、他のterminalでコマンドを打っても応答がなく、そうこうしているうちに、UbuntuがAbortする。

対処手順(VirtualBox)

VirtualBox ManagerでUbuntuを選ぶ。
Setting -> Strage -> Sontroller: SATA
でUse Host I/O Cacheにチェックを入れる。

参考URL

HostのFreeBSDの管理者からの、「別のFreeBSDマシンでVirtualBox上でWindows使っているが、SATAのUse Host I/O Cacheをonにしたら安定した」という口コミ。
(一次ソースが見つからない。)


やること3.(Ubuntu)

GuestのUbuntuで、Waylandを無効にする。 

やっていないときの症状(Ubuntu)

インストール後、Bootしてもログイン画面が出ず、一面黒(より正確には、黒とUbuntuのイメージカラー(臙脂色?)を混ぜた色)になる。

対処手順(Ubuntu)

Ubuntuをrecovery mode(FreeBSDのSingle User Modeに近いのか?)で立ち上げ、
/etc/gdm3/custom.conf

#WaylandEnable=false
の行頭の#を落とす。詳細手順は、参考URLに詳しく記載されている。

参考URL

Ubuntu 18.04 LTSが起動しない?Waylandを無効にすれば起動するかも!|LFI
https://linuxfan.info/ubuntu-gdm-wayland-false


以上

2019年2月11日月曜日

循環リストの応用例その2(Luhnアルゴリズム)

Luhnアルゴリズム(Luhn algorithm)は、
様々な識別番号の認証に使われている単純なチェックサム方式。
たとえば、クレジットカード番号にもこの方式が使われている。
詳細は wikipeida参照。

このLuhnアルゴリズムのさまざな言語での実装が、
Implementation in 88 languages on the Rosetta Code project
に載っているので、そちらを見ていただいても構わない。

で、先日ISBNのコードを書いている途中、
たまたまLuhnアルゴリズムに出くわしたので、
「関数の循環リスト」を使った、schemeでの実装を書いてみた。
なお、入力は文字列として受け取る。
(define (check-luhn num-string)
  (define luhn-digit
    (circular-list (lambda (x) x)
                   (lambda (x) (vector-ref #(0 2 4 6 8 1 3 5 7 9) x))))
  (zero? (remainder (fold + 0 (map (lambda (f x) (f x))
                                   luhn-digit
                                   (reverse (map digit->integer (string->list num-string)))))
                    10)))
;; (check-luhn "1234567812345678")

なんというか、schemeならではの素敵なコードになったと思うので、
ここに記録しておく。

以上

2019年2月2日土曜日

ISBNチェッカー(循環リストの応用例)

循環リストの応用例

最近、ISBNの入力ミスを発見するためのスクリプトを書いた。
循環リストを使った美しいコードだと思う。

だけど、「循環リスト(Circular list)なんて観念で、
(理論の)完全性のために存在しているだけ」と言われることがある。
また、Googleで「循環リスト」を検索すると
関連検索として「循環リスト 応用例」を提案してくる。

でも、循環リストを使わないと実現しにくいアルゴリズムもあるし、
循環リストはSchemeの楽しさを高めている思っている。
そして私はこよなくschemeを愛している。
だから、ここに実用的な「循環リストの応用例」として
ISBNチェッカーを公開する。

ISBNチェッカー

ISBNは書籍を一意に示すための番号である。
ISBN-13の最後の1桁はチェックデジットであり、以下のように計算される。
----- -----
現行規格のISBN (ISBN-13) のチェックディジットは、JANコードと同じく、「モジュラス10 ウェイト3・1(モジュラス10 ウェイト3)」という計算法にて算出される。(チェックディジットを除いた一番左側の桁から順に1、3、1、3…を掛けてそれらの和を取る。和を10で割って出た余りを10から引く。ただし、10で割って出た余りの下1桁が0の場合はチェック数字を0とする。)
----- -----
「ISBN」(2018年12月21日 (金) 08:59UTCの版)『ウィキペディア日本語版』より引用[注1]

これを実装すると以下のようになる。ただし、入力は文字列として受け取る。
(use srfi-1)
(define (check-isbn13 num)
  (define weight (circular-list 1 3))
  (zero? (remainder (fold + 0 (map (lambda (x y) (* x y))
                   weight
                   (map digit->integer (string->list num))))
            10)))
「一番左側の桁から順に1、3、1、3…を掛け」るところに循環リストを使っている ((circular-list 1 3)は'(1 3 1 3 ...)となる循環リストを返す。)。
左から1桁ずつループして拾っているのだけど、
掛ける数が1と3で交互なので、
(1 3 1 3 ...)となっている循環リストに対して、
carで先頭を拾って使い、cdrして残りを次のiterationに渡している。
場合分けとかフラグとかを使っていないところが美しいでしょう?

うさぎとかめのアルゴリズム

ところで、あるリストを与えられた時、それが循環リストになっているかをチェックする コードが以下にある。
大変美しく、ぜひご覧いただきたいので、ここで勝手に紹介する。

以上

2019年1月26日土曜日

ふわっとした情報から一次ソースまでたどり着く方法(RFC編)

0. 要旨

「メールアドレスのドットの連続はRFC違反」みたいな ふわっとした情報があって興味をもったとき、 技術屋なら 「どのRFCのどのセクションにどのように記述されているか」 みたいな一次ソースを当然確認したくなるでしょう?
今回、メールアドレスのルールが気になって調べたのでここに記録しておく。

1. 一次ソースまでの道のり

1.1. Wikipedia日本語版「メールアドレス」

ざっと説明を読む。ふむふむ。 RFC 5321とRFC 5322への参照がある。 取り合えずリンクを開く。
(今回は、Wikipedia日本語版に参照先まで書いてあってラッキーなパターン。 日本語版に参照がなくても英語版を眺めると参照先が見つかることもあるし、 さらにインターネットをさすらう場合もある。)

1.2. RFCを眺める

タイトルは
RFC 5321:Simple Mail Transfer Protocol
RFC 5322:Internet Message Format
で、どちらもボリュームがある。
RFC 5321から読むことにする。

1.3. RFC 5321を眺める

まず左上にObsoleted byがないことを確認する。
(もしObsoleteになっているなら、 Obsoleted by: XXXXのXXXXを読むべきだから。)
長いのでさらさらスクロールしてみる。
中程でバッカス・ナウア記法(BNF)的な 表記を見つけて手を止める。その節は 「4.1.2.  Command Argument Syntax」。
読んでみるが、いまいち解決しない。
@の左側はLocal-partと呼び、それはDot-stringであって、、、 と書いてあるが、atext以降が解決していない! そしてこの文書にはatextはこの1個しかない!

1.4. RFC 5322を眺める

気を取り直して、RFC 5322を開き「atext」を検索する。 3個めのatextでBNF的な表記に出くわす。その節は「3.2.3.  Atom」。 atextが定義されている。なんだatextは普通の文字 (アルファベットと数字といくつかの記号)のことか。

1.5. RFC 5321に戻る

ここで、RFC 5321 4.1.2に戻る。
----------------------------------------------
(前略)
   Dot-string     = Atom *("."  Atom)
   Atom           = 1*atext
(後略)
----------------------------------------------
たしかに、Local-partは確かにドットは連続しないわ、と納得する。

<読み方>
読み方は人によるところが大きい。
私はボトムアップが一番理解しやすいので、 最下層(定義に近いもの)から順番に組み立てるように理解する。
「Atomは任意個の普通の文字。
Dot-stringは先頭にAtomあって、その後に任意個の{.(ドット) とAtomの連結}が続く。
ということは.(ドット)は連続で現れないし、先頭にも最後尾(@の直前)にも現れない!」

1.5. RFC 5321とRFC 5322

だけど、RFC 5321の途中からRFC 5322の定義を読むのでよいのか、 と我に返る。
RFC 5321で5322を検索すると 「1.2.  History and Context for This Document」に 「RFC 5322はcompanion documentだよ」と書いてあるので、 よいことにする。

2. おまけ

2.1. ITEFのRFCのページ

ITEFのRFCのページは便利。
https://tools.ietf.org/html/rfc5321
Obsoleteになっているもの、updateがあるものは 最上部で分かるし、 他のRFCへの参照はハイパーテキストリンクになっている。

2.2. バッカス・ナウア記法(Backus-Naur form)

BNFは学部3年のときに情報学科の講義で勉強して、 なるほどすごい、と思った。
でも、いつもギリシャのお酒の好きな神様を思い浮かべてしまう。 (綴りはちょっと違う)

2.3. Request For Comment

RFCに「違反」という言葉は似合わないと思っている。
「法令」ではない、ただの「Standard」なのだから、 「準拠していない」くらいが適切と思う。

以上

2018年2月4日日曜日

[FreeBSD] uim-anthyは動きます(FreeBSD 11.1、 2018年2月)

0. 要旨

2018年2月、FreeBSD環境で、portupgradeからpoudriereに乗り換えてportsを全体的に入れ直したら、日本語が入力ができなくなった。
MATEのStartup ApplicationsとしてiBusが立たないようにして、
# uim-module-manager --register anthy
して、
$ uim-pref-gtk
で設定を直したら、また日本語が入力できるようになった。

1. 環境

OS:FreeBSD 11.1-STABLE
PackageとPorts: portupgradeからpoudriereに乗り換えた
input method: uim※

※uimは昔から使っている。
~/.xsessionに以下を書いている。
export GTK_IM_MODULE=uim
export XMODIFIERS=@im=uim
uim-xim &
~/.uimに以下を書いている。
(define default-im-name 'anthy)

2. 状況と検索と試行錯誤

FreeBSD環境で、portupgradeからpoudriereに乗り換えてportsを全体的に入れ直したら、日本語が入力ができなくなった。

2.0 設定の上書き?

設定が上書きされた可能性があるので、確認する。
(System->Preferences->Personal->Input Methodで、uim-pref-gtkというuim設定用のAplicationが立ち上がる。)
Hotkeyが変わっている気がしたので直したが、解決しない。

2.1 iBus

こういうときはiBusがhotkeyを食べている可能性がある。
$ ps -aux |grep ibus
したらibus daemonがいる。ibus daemonはいらないので、killする。
それからMATEのStartup Apllicationsを確認したらそこにもいたので、削除する。
(System->Preferences->Personal->Startup Applicationsで、MATEが立ち上がった時に立ち上げるデーモン類を設定する)

2.2 状況調査

  • atril(MATEのpdf/ps viewer、gnomeのevinceにあたる、いつの間にかgtk3に依存するようになっている)の検索窓にも入力できない。
    ということは、2017年5月とは違いgtk3まわりの問題ではなさそうだ。
  • よく見ると
    uim-pref-gtk
    のGlobal SettingでAnthyが選べない。
    Canna, SKK, Ajaxとかあるのに、Anthyがない。
  • いろいろ検索していると、ある nakagami の日記 で~/.uimに
    (require-module "anthy")
    という見慣れない記述を見つける。これは何だ?
  • さらに色々検索していると、
    CustomizeUim で~/.uim.d/custom/というディレクトリが出てくる。
    ls ~/.uim.d/custom/
    すると
    custom-skk-keys1.scm
    ...
    custom-tutcode-keys1.scm
    とかあるのに、
    custom-anthy-*.scm
    は1つもない。
  • 何の気はなしに、
    $ uim-
    でタブを押してどんなコマンドがあるかなと見ていたら uim-module-managerというコマンドを発見する。
    $ uim-module-manager
    Usage:
      uim-module-manager [options]

    Options:
      --register <modules>   Register the modules
      --unregister <modules> Unregister the modules
      --path <path>          Target path where installed-modules.scm
                             and loader.scm to be installed
      --unregister-all       Unregister all modules

    Example:
      uim-module-manager --register anthy skk
      uim-module-manager --register prime --path /usr/local/share/uim
      uim-module-manager --register personal-module --path ~/.uim.d/plugin

    Note:
      Registeration and unregistration cannot be done simultaneously.

    やってみる。
    $ uim-module-manager --register anthy
    ファイルのパーミッションがないと言われた。

3 解決

$ sudo -s
# uim-module-manager --register anthy
をする。

~/.uim.d/custom/
の下に
custom-anthy-*.scm
が一式できた。(他のcustom-skk-*.scmなどの一式も更新された)

$ uim-pref-gtk
左側にAnthyが登場した。
Enabled input methodsには並んでいないが、 Editを押すと、disableにAnthyが登場していた。
Anthyをenableに、それ以外をDisableに移動した。 他のセッティングも下の画像のとおりに直した。



これで、元のように日本語が入力できるようになった。
めでたしめでたし。