term タグ別の記事一覧

テンキーレスミニキーボード「Razer HUNTSMAN MINI」をmacOSで使う

 長年仕事用キーボードとしてHappy Hacking Keyboard(HHKB)Lite 2を使っていたのですが、だいぶタッチが渋くなっていること、そしてこの製品がすでに廃盤になっていることから将来的なmacOSサポートが期待できない点を考慮して、代替品としてRazerのHUNTSMAN MINIという製品を導入してみました。テンキーレスのコンパクトサイズキーボードの選択肢はあまり多くはないのですが、HUNTSMAN MINIでは日本語配列モデルも提供されており、かつキー配列的にも素直な感じです。macOSのでは英数キーとかなキーで日本語入力のON/OFFを切り替えるため、スペースバーが長かったりすると違和感を感じるのですが、本製品はスペースバーの幅がAppleの純正キーボードとほぼ同じなのが決め手でした。

Apple純正キーボードとHUNTSMAN MINIの比較

 HHKB Lite2と比較すると、サイズ的にはほぼ同じです。スペースキーが若干長く、また矢印キーがない点が大きな違いです。

HHKB Lite2とHUNTSMAN MINIの比較

 このキーボードは一般的なWindowsキーボードと同様、最上段の「1」キーの左には半角/全角キーがり、また「A」キーの左はCaps Lockキーがあるのですが、これらは純正のキー配列カスタマイズツールで変更可能で、かつ変更した内容はキーボード自体に保存されます。ただ、このカスタマイズツールは現状Windows版しか提供されていません。以前はmacOS版も提供されていたのですが、数年前にリリースされた最新バージョンからはmacOSのサポートが廃止されたようです。そのためキー配列のカスタマイズにはWindowsマシンが必要ですが、一度設定さえしてしまえば、Macでも特別なドライバなしで同じキー配列で利用可能です。

設定ツールRazer Synapse 3

 ただし、このカスタマイズツールではWindowsキーに関してはカスタマイズできず、また無変換キーや変換キーをmacOSで使われる英数キーやかなキーに割り当てることもできません。WindowsキーについてはmacOSではCommandキー、AltキーはOptionキーとして認識されるのですが、Apple純正キーボードではこれらがちょうど逆の位置にあります。これについてはmacOS側で入れ替えを行うことができるので、そちらで対応可能です。また、英数キーやかなキーが使えない問題は、無変換キーにCtrl+Shift+:、変換キーにCtrl+Shift+Jというショートカットキーを割り当てることで一般的には対応が可能です(参考資料:Macの日本語入力ソースを設定する/切り替える))。

macOSのキーボード設定

Karabiner Elementsを導入する

 ひとまずはこの設定で利用していたのですが、なんとEmacsではCtrl+Shift+:やCtrl+Shift+Jというショートカットキーを使えない(Emacsのショートカットキーとして認識されてしまう)ことが判明。一応Emacs側で無理やりシステムイベントを発生させることで対応は可能ではあるのですが(参考資料:OSXにおけるIMEの変更 #10)、これは内部でコマンドを実行している関係で微妙に切り替えにタイムラグが発生するため、頻繁に入力モードの切り替えを行う使い方には向いていないと感じました。

 ということで、最終的にはmacOSでWindows向けキーボードを使う際の定番ツールであるKarabiner-Elementsを導入して無変換キーを英数キーに、変換キーをかなキーに割り当てることにしました。Karabiner-Elementsを使うとmacOS標準設定でのCommandキーとOptionキーの入れ替えが効かなくなるようなので、その設定もKarabiner-Elements側で行なっています。

Karabiner-Elementsの設定

 このように設定関係で紆余曲折はありますが、Razer HUNTSMAN MINIはキーボードとしての機能自体はよくできており、キータッチにも不満はありません。有線キーボードではありますが、お値段的にはHHKBと比べて1.5〜2万円ほどお安いので、キーボードに3万円近く出すのはちょっと……という方にはおすすめです。

macOSの最近のEmacsで日本語フォントがいわゆる中華フォントになる問題の解決方法

Emacsをアップデートしたところ、日本語(というか漢字)がいわゆる「中華フォント」になってしまった。中華フォントといっても繁体字なので問題なく読めるのだが、たとえば「化」の3画目が4画目に対して突き抜ける感じになったりするので、文章を書くときに気が乗らない。解決方法を試行錯誤したところ、これはset-language-environment"Japanese"に設定するだけで簡単に解決した。

(set-language-environment "Japanese")

あとついでにフォント設定も微調整。

(create-fontset-from-ascii-font "menlo-14" nil "menlo14")
(set-fontset-font "fontset-menlo14" 'unicode "menlo-14" nil 'append)
(add-to-list 'default-frame-alist '(font . "fontset-menlo14"))

Emacs 27.1ではいつの間にか日本語変換時のちらつき問題も解決していた。素晴らしい。

macOSでGhostscriptをビルドする

 PostScriptやPDFを扱う際にほぼ必ず出てくるGhostscriptですが、公式サイトにはmacOS向けのバイナリが見当たりません。ということで、自前でビルドする手順 のメモです。

 なお、GhostscriptのmacOS向けバイナリとしてはRichard Koch氏によって配布されているものもあるのですが、最新版はHigh Sierra以降向けでSierra環境では利用できません。また、brewコマンドでもインストールできますが、個人的にbrewコマンドをあまり使いたくない、という理由で自前でビルドしています。

 Ghostscriptのソースコードは、公式サイトのダウンロードページから入手できます。ダウンロード後、適当なディレクトリに展開しておきます。

必要な依存ライブラリ

ビルドには以下のライブラリが必要です。

 このうち、libpng、lcms、jbig2decはダウンロードしたアーカイブを展開して./configure;make;make installというおなじみの手段でビルド&インストールが行えます(一部はfreetypeとlibjpegのようにソースツリー内に展開するだけで一緒にビルドできるようなのですが未確認)。

 freetypeとlibjpegについては、アーカイブをGhostscriptのソースコードを展開したディレクトリ(ソースツリーのトップディレクトリ)に展開し、そのディレクトリ名を「freetype」および「jpeg」に変更しておくことで自動的にビルドされます。

 また、gxpsのビルドにはJPEG XRのサポートが必要なようなので今回は無効にしました。ということでGhostscript自体のconfigureオプションは次のようになります。

$ ./configure --without-xps

 あとはmakeコマンドを実行するとgsコマンドがビルドされ、「make install」で/usr/local/bin以下にgsコマンドがインストールされます。

 また、libgsが必要な場合、「make so」コマンドを実行するとバイナリがビルドされ、「make soinstall」でそれらをインストールできます(詳しくはbase/unix-dll.makを参照)。

macOSアプリ開発でStoryboard+Core Dataを使うときのハマり話

 ふと思い立って久しぶりにmacOSアプリ開発を始めて見たのだが、Core Dataで管理しているデータを(CocoaBindingを使って) Storyboardを使って作った画面上に表示するところでハマったうえにググっても情報を探すのが大変だったのでメモ。

参考文献

作業と疑問点

 Xcode(7.2.1)でOS Xの「Cocoa Application」を選択してテンプレートからプロジェクトを作成。このとき「Use Storyboards」、「Create Document-Based Application」、「Use Core Data」にチェックを入れておく。続いてAppleのCore Dataプログラミングガイドの「管理オブジェクトモデルの作成」に従ってオブジェクトモデルを作成する。

 さらにこのドキュメントでは「Core Dataスタックの初期化」を行うよう記されていて、NSManagedObjectContext、NSPersistentStoreCoordinator、NSManagedObjectModelの3つが必要と記述されている。しかし、初期化コードとしてDataControllerクラスの実装例もあるのだが、このオブジェクトをどのオブジェクトが所持すべきなのか(ビューなのかドキュメントなのか)が記載されていない。

 プロジェクト作成時に「Use Core Data」にチェックを入れておくと、ドキュメントの基底クラスとしてNSPersistentDocumentが使われるのだが、ドキュメントを見る限り、自動的にCore Data関連の初期化を行って「ready-to-use」のNSManagedObjectContextのインスタンスを提供すると書いてある。この解釈だと、自前でCore Dataスタックの初期化をする必要はなさそうである。

 「Core Data の使い方(1)」ページではViewController内でNSManagedObjectContextのインスタンスを作成し、ここでCore Dataの初期化を行っているのだが、本来Core Dataの管理はDocument(MVCにおけるModel)の仕事であるべきで、ViewController内でこの作業を行うのはよろしくないのではないか、という疑問があるし、前述の通りNSPersistentDocumentを利用する場合この処理は不要であるはずである。

 しかし、Documentが持つNSManagedObjectのインスタンスをArray Controllerに参照させる手段が分からない。DocumentにArray Controllerのoutletを作成できれば、そのオブジェクトのsetManagedObjectContextを使ってNSManagedObjectContextインスタンスを渡すことはできるのだが、StoryboardではDocumentにArray Controllerのoutletを作成することもできない。

 ちなみにArray Controllerを使ってTable ViewとArray Controllerをバインドしただけだと、Array ControllerにNSManagedObjectContextが関連付けられていないため「cannot perform operation without a managed object context」というメッセージが表示される。

解決法

 StackOverflowの「How do you bind a storyboard view to a Core Data entity when using NSDocument?」にそのものずばりの質問と回答があった。結論的には、まずDocument.swiftのmakeWindowControllers()の末尾に下記を追加する。

windowController.contentViewController!.representedObject = windowController.document

 これでView ControllerのrepresentedObjectがDocumentを参照するようになる。

 続いてArray ControllerのView Controllerで、Managed Object Contextで「Bind to」にチェックを入れ、「View Controller」を指定する。Model Key Pathには「representedObject.managedObjectContext」を指定する。以上で完了。ただ、このときModel Key Pathに「!」が表示されるのがちょっと気持ち悪い。

まとめ

  • 「Use Core Data」を選択してプロジェクトのテンプレートを作った場合、独自に初期化コードを書く必要は無い
  • DocumentからView Controllerにアクセスするのは面倒臭い

 なおこの辺の作業を行ったコードはhttps://github.com/hylom/ttune/tree/76d43fe476c24f064aee51b7748529aa82a309d1です。