hishidaの開発blog

EBシリーズ(EBPocket,EBWin,EBMac,EBStudio),KWIC Finder,xdoc2txt,読書尚友の開発者ブログ

外付けキーボード購入記

Surface Pro のタイプカバーキーボードは、日常的に使用していると、どうしてもパームレストの部分が汚れやすい。そこで、デスクで使用するときは外付けキーボードを使うことにした。

キーボードに求める条件としては:

  1. 日本語配列であること(Surface Proが日本語配列のため、英語キーボードだと設定を毎回切り替える必要がある。)
  2. 机を広く使うため、省スペースであること。テンキーレスか、コンパクトキーボードが望ましい。
  3. カーソルキーは省略されていないこと。
  4. キー配置はAの左はControlが好みなので、キー配置をカスタマイズできること。
  5. 打鍵音が静かなこと。
  6. 接続方法は有線でも可。(Bluetoothだと製品によっては最初の打鍵で遅延があることがある)

以上の条件だと、お金に糸目をつけなければ、HHKB Professional HYBRID Type-S か、REALFORCE テンキーレス の二択になる。だが、やはり高価なので、あえてそれ以外で探してみたい。

ロジクール KX850CL MX MECHANICAL MINI

最初に候補に挙げたのが、ロジクール KX850CL MX MECHANICAL MINIだった。ところが惜しいことに、日本語配列の場合、右シフトキーに追いやられて、最下段のZ~Mの行が微妙に左にずれている。このため、Nを打つときにMに指が触れてしまう。なぜこんな配置にしたのか

KX850CL MX MECHANICAL MINI

Keychron K3 Max

次に候補に挙げたのが、キーボード専業の新興メーカーKeychronの K3 Maxだった。ロープロファイルで非常に格好いいと思ったが、これも日本語配列ではキー配置に癖があって、カーソルキーが上下左右ではなく、横一列に←↑↓→の順に並んでいる。これはとても慣れそうにない。なぜこんな配置にしたのか。(ちなみにviのカーソルキーのhjklは←↓↑→の順であり、これとも違っている。)

Keychron K3 Max

FILCO Majestouch Xacro M3A 70JP

次はFILCOのコンパクトキーボードでMajestouch Xacro M3A 70JP という製品。この製品はDIPスイッチでControlとCaps Lockを入れ替えられる。だがちょっと待ってくれ。カーソルキーの↑と↓がずれている。実用上支障ないかもしれないが、生理的に気持ち悪い。なぜこんな配置にしたのか

FILCO Majestouch Xacro M3A 70JP

ARCHISS ProgresTouch RETRO TINY

結局、行きついたのが、ARCHISS ProgresTouch RETRO TINY 日本語配列 だった。
この製品のいいところは、

  • コンパクトな65%キーボードで、カーソルキーも省略されていない。
  • キートップにカナが刻印されていないので、すっきりしている。
  • DIPスイッチでControlとCaps Lock、WindowsキーとFnの位置を交換できる。しかも交換用のキーキャップもついている
  • InsとDelキーが独立している。エディターでほとんどの時間を過ごすプログラマー向き。
  • 軸の種類は黒軸、茶軸、青軸、赤軸、静音赤軸、スピードシルバー軸から選択できる。ただし、終売が近いのか、一部の軸は在庫切れで購入できない。

定価でも1万円程度だが、メルカリで程度のよい赤軸を購入した。

ARCHISS ProgresTouch RETRO TINY

難を言えば、接続のUSBケーブルがUSB mini-Bであることだが、Surface Dockに接続して固定で使うので、特に問題はない。USB-Cに置き換えた後継製品が出ればいいのだが。

ControlとCaps Lockの入れ替えと静音化

早速、DIPスイッチでControlとCaps Lock、左Windowsキーと右Fnを入れ替えてみた。

しばらく使っていると、今度はキーの底打ち音が気になってきたので、静音化リングをはめてみたら、ほとんど気にならなくなった。キーストロークが若干短くなるが、かえってちょうどよくなった。使用感としてはスコスコと気持ちよく、打鍵ミスも減ったと思う。

これがキーボード沼の入り口でなければよいのだが…(レンズ沼よりは安いけど…)

ControlとCaps Lock、WindowsキーとFnを入れ替え



 

EBPocket for Android ベータ版について(さて何でしょう)

このブログでも過去に取り上げたが、EBPocket for Android は、Android 11以降、外部SDカード上の辞書を使用できなくなった。辞書を追加したい場合は、アプリケーション固有のストレージ(サンドボックス)に辞書をコピーする必要がある。

ebstudio.hatenablog.com

EPWINGのハードユーザなら、数十GBの辞書データを持っていることは普通なので、この仕様が、いかに不便かは分かっているが、Google様がお決めになった仕様なので、アプリケーション作者にはどうしようもない。
実はMANAGE_EXTERNAL_STORAGE 権限をつけると、従来と同様、全てのストレージにアクセスできるのだが、MANAGE_EXTERNAL_STORAGE権限をつけるにはGoogleの審査を通る必要があり、ファイルマネージャのような一部のアプリを除いては、まず審査は通らない。私もMANAGE_EXTERNAL_STORAGEをつけたEBPocketを提出してみたが、どう説明しても審査を通過できず、結局公開をあきらめてしまった。

だが、この作業の副産物として、MANAGE_EXTERNAL_STORAGE権限付きの「全ての外部ストレージにアクセスできる」私家版のEBPocketができた。これを公開する方法をずっと考えていたが、この度、購入者限定でベータ版として配布することにした

  1. Google PlayからEBPocketをアップデートし、ver1.50.3以降になっていることを確認する。
  2. 設定から「ベータ版ダウンロード」を選択する。
  3. ダウンロードフォルダにベータ版のapkがダウンロードされる。
  4. 現在のEBPocketをアンインストールする。
  5. ファイルマネージャで、ダウンロードしたベータ版のapkをインストールする。
  6. EBPocketを起動し、「すべてのファイルを管理できるアクセス権を付与」をチェックする。



外部SDの辞書を指定するには、 設定から、次のいずれかを実行する。

  1. 「辞書検索パス」を変更する
  2. 「拡張辞書検索パス」を指定して「辞書の再検索」を実行する

これで、昔通りのEBPocketが帰ってきたわけだ。

ただし、ベータ版の提供はあくまで購入者限定としたいので、再配布は禁止とする。もし不正に流通していることが発覚した場合、ベータ版の提供は即時停止する。また、Googleから警告を受けた場合も、その時点で配布を停止する。
ベータ版は、起動時にサーバーで認証を行っているので、ベータ版の配布を停止したときは、配布済みのベータ版も実行許可を取り消す。
以上をご了承いただいたうえで、ご利用いただきたい。

 

Surface Pro 7+ 導入記

Surface Pro 7+(Core i7,16GB,256GB)を購入した

2018年11月に Surface Pro 6 (Core i5+8GB+256GB)を購入し、5年余り使用してきたが、そろそろバッテリ容量が低下し、性能的にもきつくなってきたので、Surface Pro 7+に乗り換えた。

Surface Pro 7+ は当初は法人・教育機関向けに発売され、その後一般向けが発売されたが、一般向けはCire i5+8GB+128GBのモデルしかない。メモリ16GBのモデルは法人・教育機関のみなので個人では通常買えないが、個人向けに販売している業者を価格.comでみつけ、Core i7+16GB+256GBモデルの新品を、税込 116,130円で買うことができた。

Surface Pro 7+の利点を挙げると、

  1. CPUの世代がSurface Pro 8と同じCore i 第11世代であり、現在でも通用するパフォーマンスがある。Surface Pro 6 の第8世代と比べると、PassMarkで2倍近い差がある。Surface Pro 9でも第12世代なので、1.2~1.3倍程度の差しかない。
  2. その後のSurface Pro 8以降で無くなった、USB-Aポートやmicro SDスロットがある。Surface Pro 9からはイヤホンジャックも無くなってしまった。
  3. Surface Pro 8以降、フォームファクタが変わって大型化し、若干重量も増えた。Surface Pro 7+のほうがコンパクトで軽量である。
  4. Surface Pro 7+以降、SSDが交換できるようになった。

というわけで個人的にはSurface Pro 7+が最良のSurfaceである。

ただし、法人向けモデルを買ったためか、Microsoft Completeの延長保証は購入できなかったので、通常の1年保証のみとなる。

SSDを1TBに交換してみた

購入後、SSD交換できるメリットを活かして、早速 1TB のSSDに交換してみた。SSD交換の事例は、ネット上に多数挙げられており、次の記事を参考にした。

akiba-pc.watch.impress.co.jp

交換用のSSDは、Micron 2400シリーズを選択した(2024年2月当時、13,280円)。

換装手順は簡単である。

  1. あらかじめ32GB以上のUSBメモリに、回復ドライブを作成する
  2. 本体を裏返し、裏蓋にSIMピンを差し込むと簡単に外れ、SSDが露出する
  3. SSDを取り付けているネジをT3トルクスドライバーで外し、SSDを交換する
  4. 念のため、0.5mmのサーマルパッドを貼る
  5. 回復ドライブからWindowsを再セットアップする

負荷のかかる処理をしても内部温度はほとんど上がらないので、ヒートシンクはなくても大丈夫そうだ(オリジナルのSSDは薄い金属製のヒートシンクが貼られている)。

なお、Surface Pro 9用の保守部品として交換用SSDも発売が開始されたので、Microsoft純正の1TB SSDを入手することも可能になった。だが税込33,088円と、かなり割高になる。

www.microsoft.com

最近のSurfaceは円安もあって割高感が高いので、次の機種でSurfaceを選ぶかどうかはわからない。ともあれ、Surface Pro 7+ でまだ数年は闘えそうである。

 

【重要】EBPocket for Android の対象範囲別ストレージ対応について

やむを得ず、EBPocket for Android の対象範囲別ストレージ対応をすることになってしまった。その理由は、

  1. Android 11 以降で外字ビットマップが表示されないという現象が起きるようになった。改修は容易だが、アップデートするためにはtargetSdkVersion を31以上にしないと、Google Playに申請ができない。
  2. 近い将来、targetSdkVersion を31以上にしないと、新規ユーザのGoogle Playにアプリが表示されなくなる(Android11以降の場合)。EBPocketというアプリが、Google Play上から存在しなくなってしまう。

targetSdkVersion を31以上にするということは、対象範囲別ストレージ対応が必須になるということである。要するに、iPhoneみたいに、アプリ固有のサンドボックスと呼ばれる領域以外にアクセスできなくなる。
EBPocketにおいては、これまでのように外部SD上の辞書に自由にアクセスできなくなるということだ。

そこで、EBPocket 1.49以降では次のようになる。

Android10まで

従来通り、ストレージ内の任意の場所を辞書検索パスに指定できる。外部SDカード上の辞書もこれまで通り使用できる。

Android11以降

  1. 辞書の場所は、次のアプリ固有のデータ領域(サンドボックス)に固定される。辞書を追加する場合は、必ずこの配下に辞書を置かないと認識しない
    /storage/emulated/0/Android/data/info.ebstudio.ebpocket/files/EPWING
  2. PCからUSB接続で辞書を転送する場合は、上記の場所に辞書を転送し、「辞書の再検索」を実行する。
  3. 外部SDに辞書が存在する場合は、辞書管理メニューから辞書をインポートする。以下のスクリーンショットを参考にしてほしい。

スライドメニューから辞書管理を選択

辞書管理画面にて、辞書追加ボタンを押す。

辞書をインポートするフォルダを選択する。

アクセスの許可を与える。

辞書が追加される。

かなりの混乱が予想されるが、避けては通れないのでしかたない。今後もEBPocket for Androidの提供を続けるには、Google Playの規約に準拠するしかないからだ。

追記:MANAGE_EXTERNAL_STORAGE 権限について(2024/03/24)

実は、MANAGE_EXTERNAL_STORAGE 権限をつけると、Android10以前のように「すべてのファイルへのアクセス」が可能になるが、Google Playで権限申請フォームから申請して審査が必要である。この記事を書いた後、MANAGE_EXTERNAL_STORAGE 権限をつけて申請してみたが、案の定、審査が通らなかった。

この権限はファイルマネージャ等を想定しているようだが、世の中には音楽プレーヤーやPDFリーダーなどでMANAGE_EXTERNAL_STORAGE を使っているらしきアプリがいくらもある。「MANAGE_EXTERNAL_STORAGE以外の方法では実装できない」理由を技術的に理を尽くして申請フォームで説明してみたが、Googleの石頭には通じなかった。

ところで、MANAGE_EXTERNAL_STORAGE 権限をつけてビルドした「すべてのファイルへのアクセス」が可能な、私家版の EBPocket for Android が手元にあるのだが、さて、これをどうやって配布したものか。

 

EBPocket for iOS クリップボード変更検知によるクリップボード検索

クリップボード検索というと、たいていの方は、「他のアプリと辞書アプリを同時に立ち上げて、他アプリでテキストをコピーすれば即座に辞書引きができる」という利用方法を期待するのではないだろうか。
だが、EBPocketのクリップボード検索は、アプリケーションがアクティブになるタイミングでしか検索できなかった。
このたび、iPad のSplit Viewによるマルチタスク環境において、EBPocket for iOSクリップボード変更検知によるクリップボード検索が、やっとできるようになった。


iOSのペーストボードには、次のように変更を検知する機能が元々ある。

[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(pasteboardChanged:)
     name:UIPasteboardChangedNotification
     object:[UIPasteboard generalPasteboard]];

ところが、Split Viewで別のアプリがペーストボードを変更しても、このNotificationは発火しない。このため、てっきり変更検知はできないと思い込んでいた。
ところが最近、「物書堂の辞書アプリではできている」という報告をいただいた。物書堂さんができているなら、EBPocketでもできないはずはない。

色々方法を探ったところ、結局、次の記事の方法で解決した。単純にタイマーで定期的にペーストボードの内容をチェックするだけだ。

stackoverflow.com

1つ注意点は、iOS14以来、他のアプリが書き込んだペーストボードの情報を読み込むと、"EBPocketに○○からペースト"みたいなアラートが表示されることである。
このため、実際に変更された場合だけ読み込むようにしないと、タイマーの間隔毎にアラートが表示されることになってしまう。そこで、ペーストボードのchangeCountを見て、数字が変わったときだけデータを取得する。

実は上記の記事のコードには、一部コンパイルできない箇所があるので、実際に使ったコードを以下に示す。
クリップボード監視を開始するときにstartCheckingPasteboardを呼び、終了時にstopCheckingPasteboardを呼ぶ。

@property (strong, nonatomic) NSTimer   *pasteboardCheckTimer;
@property (assign, nonatomic) NSUInteger pasteboardchangeCount;


- (void) startCheckingPasteboard{

    _pasteboardchangeCount = [[UIPasteboard generalPasteboard] changeCount];


    //Start monitoring the paste board
    _pasteboardCheckTimer = [NSTimer scheduledTimerWithTimeInterval:1   //  1s間隔
                                                     target:self
                                                   selector:@selector(monitorBoard:)
                                                   userInfo:nil
                                                    repeats:YES];
}

- (void) stopCheckingPasteboard{

    [_pasteboardCheckTimer invalidate];
    _pasteboardCheckTimer = nil;
}

- (void) monitorBoard:(NSTimer*)timer{

    UIPasteboard *_pasteboard = [UIPasteboard generalPasteboard];
    NSUInteger changeCount = [_pasteboard changeCount];
    if (changeCount != _pasteboardchangeCount) { // means pasteboard was changed
        _pasteboardchangeCount = changeCount;

       if ([_pasteboard hasStrings]){
            NSString *newContent = _pasteboard.string;

            [self tryToDoSomethingWithTextContent:newContent];
        }
    }
}

- (void)tryToDoSomethingWithTextContent:(NSString*)string{
    //    取得したペーストボードの内容で処理を行う。

}

 

iOS16のペーストボードの挙動について(EBPocket for iOS)

iOS16以降、他のアプリケーションでコピーした内容をペーストボードからペーストしようとすると、許可を求められるようになった。EBPocketでクリップボード検索をすると、次のような確認ダイアログが毎回表示され、非常にうっとうしい。

iOS16.0.2で「一部のユーザーにプロンプトが過剰に表示される問題」を解決したというアナウンスがあったが、EBPocketには効果が無かった。

iOS16.1からは、挙動を変更するオプションが設定画面に表示されるようになった(一度でもペーストの許可のダイアログが表示された後、オプションが表示される。初期状態ではオプションはない)。

設定アプリケーションからEBPocketを選ぶと、次のように「ほかのAppからペースト」という項目が追加されており、確認・拒否・許可から選択できる。

ここを許可にすると、確認ダイアログは表示されなくなる。ただし「"EBPocket"に○○からペースト」というメッセージが短い時間表示される。

 

読書尚友の注記対応、その他

読書尚友 Android版の公開から10年経っても、いまだに未対応の注記が見つかるので、徹底的に問題を潰したいと思って、下記の公式の組版案内に基づいて対応状況を調べてみた。

kumihan.aozora.gr.jp


青空文庫 組版案内

その結果、新たに対応した注記は以下の通り。

  • 「字詰め」中の「囲み」「地寄せ」(『蟹工船小林多喜二、『不連続殺人事件』坂口安吾)
  • 「ここから○字下げ、折り返して●字下げ」
  • ブロックでの「地付き」「地寄せ」
  • 「○段階小さな文字」(あるいは大きな文字)の入れ子(『他計甚麽(竹島)雑誌』松浦武四郎

最終的に、読書尚友で完全に対応できていない注記は以下のみだと思う。

  • 改丁、改段(いずれも改ページとして処理する)
  • 窓見出し(同行見出しとして処理 ※実例はほとんど見たことがない)
  • 縦中横(ただし2桁の数字は自動縦中横で表示するので、ほとんど対応)
  • キャプション(本来は図の下に表示するが、左側に表示している)

さて、注記対応と同時に、有償版の本棚に登録しているお勧め図書一覧も更新した。この10年で重要コンテンツが増加し、見直しが必要になったからだ。(吉川英治山本周五郎米川正夫訳のロシア文学等)
100冊に絞りたかったが、どうしても絞りきれなくて以下のラインナップになった。まずまず無難なところだと思っているが、どうだろうか。

http://ebstudio.info/manual/BookViewer/internal.html