macの共有フォルダにパスワード認証無しでアクセスする

  • [設定]-[共有]-[共有フォルダ]-[ユーザー]に「全員」を追加しアクセス許可を与える
  • [設定]-[ユーザー]-[ゲストユーザー]で「ゲストユーザーに共有フォルダへの接続を許可」にチェックする

参考:Anonymous SMB sharing from OS X Lion (10.7) – Mihail Stoynov's blog

lualatexがfont dbの構築でコケるのを直す

コンパイルする度にfont周りの処理をしようとして、失敗するのを繰り返している(しかもそれに時間が凄くかかってる)。

luaotfload | db : Font names database not found, generating new one.
luaotfload | db : This can take several minutes; please be patient.
luaotfload | db : Index file not writable
luaotfload | db : Failed to write /usr/local/texlive/2017/texmf-var/luatex-cache/generic/names/luaotfload-names.lua.
luaotfload | db : Failed to write /usr/local/texlive/2017/texmf-var/luatex-cache/generic/names/luaotfload-names.luc.
luaotfload | db : Failed to save database to disk: nil
luaotfload | cache : Lookup cache file not writable.
luaotfload | cache : Failed to write /usr/local/texlive/2017/texmf-var/luatex-cache/generic/names/luaotfload-lookup-cache.lua.
luaotfload | cache : Failed to write /usr/local/texlive/2017/texmf-var/luatex-cache/generic/names/luaotfload-lookup-cache.luc.(save: /usr/local/
texlive/2017/texmf-var/luatex-cache/generic/fonts/otl/lmroman10-regular.lua)(sa
ve: /usr/local/texlive/2017/texmf-var/luatex-cache/generic/fonts/otl/lmroman10-
regular.luc))

ログを見るとinndexファイルが書き込めないとなってるので、パーミションが怪しそうだ。 周辺のディレクトリを見ると殆どが所有権がユーザーにあるのに/usr/local/texlive/2017/texmf-var/luatex-cacheだけroot所有になってた、どうやらこれが原因のようだ。

chownでユーザー所有にして解決した。

今気づいたけど/usr/local配下は所有権がuserになってた。 最近homebrewを使い始めたけど、それが原因だろうか。

有向グラフの簡潔表現GLOUDS

ネタ元

Johannes Fischer, Daniel Peters: GLOUDS: Representing tree-like graphs. J. Discrete Algorithms 36: 39-49 (2016)

概要

  • 木の簡潔データ構造LOUDSを拡張した有向グラフの簡潔データ構造GLOUDSを提案する
  • in-edgeが2以上のノードをコピーして、グラフを木に変換しLOUDSに似たデータ構造で表現する
  • in-edgeの数が少ない、つまり木に近い有向グラフの場合効果を発揮する

LOUDS

木のビット表現。LOUDSの話は今までにも聞いたことがあるが、この論文の説明が一番わかり易い。

  • 各ノードを1*子の数+0で表現する(0が親、1が子ノードを表すと考えると分かりやすい)
  • level-order(深さ毎)にノードの01表現を連結する
  • level iでk番目に出現する1で表された子ノードは、level i+1でk番目に出現する0で表された親ノードに対応する
  • この性質から、親から子、子から親へ01表現のrank, selectで辿ることが出来る

GLOUDS

次のような方法で有向グラフから木を作る。

  • あるノードから有向辺で全てのノードに辿れるようなノードをrootと呼ぶ
  • 複数あり得るが、簡単のためrootが一つだけあると仮定する
  • rootノードからlevel orderで各ノードuを辿る
  • uの各子供vについて、vがまだ辿られていないノードだったら枝を貼る
  • vが既に辿られているノードだったらvをコピーしたshadowノードを作り、そのノードに枝を貼る

次にこの木を簡潔データ構造で表すにはどうすればよいかを考える。

  • vがまだ辿られていないノードであればvを1で表す
  • vがすでに辿られているノードであればvを2で表す
  • 親ノードuを0で表す

これで木を表すことが出来たが、これだけでは元の有向グラフで出来た操作が行えない。 以下の情報を付け加え、操作可能にする。

  • 有向グラフ上のノードは、変換した木上でshadowノードとそうでないノード(1ノードと呼ぶことにする)で表される
  • 1ノードは有向グラフ上のノードが表す子の情報全てと親の情報を1つ持っている。
  • shadowノードは親の情報を1つ持っている。
  • つまり、子を辿るためには、全てのshadowノードから対応する1ノードに、
  • 親をたどるためには全てのノードからそれ以外のノードへと遷移することが出来ればよい
  • 対応関係を整数文字列で表し、整数文字列上のrank, selectで実現する
  • level-orderで木を辿りshadowノードを、対応する1ノードのrank(何番目に出現したか)で表すことで木のshadowノードの出現を整数文字列Hとして持つ
  • H[i]=xはlevel-orderでi番目のshadowノードに対応する1ノードがlevel-orderでx番目に出現することを表す
  • 対応するノード間はこの文字列Hを経由し、木のrank, select、Hのrank, selectで対応するノード間を辿ることが出来る

その他

以下は今後覚えておくと良さそうなのでメモ

  • ビット配列上のrank, selectはn+o(1)bitsでO(1)時間で実行可能
  • rank, selectは文字列上にも拡張できる。
  • よく知られている方法だとn log σ(1 + o(1)) bitsでrankがO(log log σ)時間、selectがO(1)時間で実行可能、ここでσは文字種類数
  • 当たり前だが文字列を陽に持っていればn log σ bitsで各位置の文字にO(1)時間でアクセスできる
  • σ=wO(1)の時上記の3つの操作はより高速に実行可能、ここでwはワード長
  • この場合O(n log σ) bitsで上記3つの処理がO(1)時間で実行可能

apple wireless keyboardのcapsとcontrolを入れ替えた

Apple Wireless Keyboard (US)を買った。 HHKBも良いけど、このキーボードもなかなか良い。

HHKBや内蔵キーボードはControlがaの左に来るけど、このキーボードの場合はcapsになっているので前回の記事のように変更した。 kg86.hatenablog.com

最初はKarabinerを使って設定しようとしたが、control→capsは上手くいくが、caps→controlは上手くいかない。 どうやらcapsを違うキーに割り当てるにはSeilというソフトが追加で必要なようだ。 ドキュメントを読むとseilでcapsを一旦違うキーコードに割当て、karabinerで新しいキーコードを違うキーコードに割り当てるようになっている。 問題はkarabinerはキーボードデバイスごとの設定ができるのに、seilは全体設定しか無いこと。 これでは弄る必要のない、HHKBや内蔵キーボードまで影響が出てくる。

悩んでいたら、もっとシンプルな方法に気がついた。 デフォルトのキーボード設定でcapsとcontrolの入れ替えができる、しかもキーボードデバイスごとに。

[システム環境設定]→[キーボード]→[修飾キー]の順に選択すれば設定画面が表示される。

macでHHKBのキーを変更した

Happy Hacking Keyboard(HHKB)はキーが少なくて素敵だけど、macだとキーが少なすぎて直感とは違うキー配置になってしまう。 ディップスイッチを使うことで、キー配置を少しいじれるけど柔軟とは言い難く限界がある。

Karabainerを使ってキーの配置をいじってみた。 HHKBのみをキーを変更したいので、HHKBのデバイスをKarabiner の private.xml 設定方法 - Qiitaを参考にして登録する。 僕の環境では以下のようになった。

  <devicevendordef>
    <vendorname>PFU</vendorname>
    <vendorid>0x0853</vendorid>
  </devicevendordef>

  <deviceproductdef>
    <productname>HHKB</productname>
    <productid>0x0100</productid>
  </deviceproductdef>

僕の環境では(ディップスイッチの設定にもよると思う)2つのMetaキーがOptionキーになっていて、左AltがFnに、右AltがCommandキーになっている。 以下ではMetaキーをCommandに、右AltをOptionキーに割り当てている。

僕の使用方法ではOptionはEmacsでAltキーとしてしか使わないので、これぐらい使用頻度が少ない位置にして、Commandキーを使いやすくしたほうが良い。

<?xml version="1.0"?>
<root>
  <devicevendordef>
    <vendorname>PFU</vendorname>
    <vendorid>0x0853</vendorid>
  </devicevendordef>

  <deviceproductdef>
    <productname>HHKB</productname>
    <productid>0x0100</productid>
  </deviceproductdef>

  <item>
    <name>Swap Command and Option in HHKB</name>
    <identifier>private.hhkb</identifier>
    <device_only>DeviceVendor::PFU, DeviceProduct::HHKB</device_only>
    <autogen>__KeyToKey__ KeyCode::OPTION_L, KeyCode::COMMAND_L</autogen>
    <autogen>__KeyToKey__ KeyCode::OPTION_R, KeyCode::COMMAND_R</autogen>
    <autogen>__KeyToKey__ KeyCode::COMMAND_R, KeyCode::OPTION_R</autogen>
  </item>
</root>

HHKBだけ、キー変更が有効なことを確認した。概ね満足。 但し、元々Karabinerの設定でCommandキーを組み合わせで押さない場合は英数、かなキーとして振る舞う設定をしていたのだけど、今回新しく割り当てたコマンドキーではそのように振る舞ってくれなかった。 内部の設定の適用順序があるのだろうか?

f:id:kg86:20161121152744p:plain

もしかすると以下の記述が関係ある?

Karabinerでは設定を再帰的に反映することは出来ません。 一つの設定が反映された後は他の設定は無視されます。 マニュアル - Karabiner - OS X用のソフトウェア

映画「舟を編む」を観た

企画から出版に行き着くまでに10数年は掛かると言われる辞書作成作業に取り組んだ人たちの話。

途方もない作業に地道に取り組んでいる人とそれを支える人たちの姿がとても魅力的だ。

舟を編む 通常版 [DVD]

舟を編む 通常版 [DVD]

「はじめよう! 要件定義 ~ビギナーからベテランまで」を読んだ

非常に平坦に書かれていて読みやすい。

はじめよう!  要件定義 ~ビギナーからベテランまで

はじめよう! 要件定義 ~ビギナーからベテランまで

こういった専門分野の人にとっては当たり前の知識を、そのエッセンスだけつまみ食いすることで知識や考えの幅が広がると思って実践中。 この本は優しい言葉で重要な事が書かれている。 素晴らしいのは重要なことが繰り返し繰り返し、ダメ押しのように書かれていること。 最重要する事柄を見失わずに、他のことはそれを補強するようなアクションを起こしていく。 最初から最後まで一筋の道が見えているのでとても分かりやすい。