hishidaの開発blog

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

キーボード沼の終焉

一年半ほど前に、Surface Pro の外付けキーボードとしてARCHISS ProgresTouch RETRO TINY を購入した話を書いた。

ebstudio.hatenablog.com

ARCHISSのキーボードはその後、職場のPCのキーボードに昇格して日々愛用しており、キートップにテカリが目立つまでになった。

Surface Pro用のキーボードとしては、その後 Keychron B1 Pro を購入して半年ほど使用していた。ロジクール MX KEYS mini とそっくりだが価格が安く、それなりに満足度は髙かった。

この構成でしばらく落ち着いていたのだが、最近ふとしたきっかけで、「HHKB パーフェクトセット」なるものを衝動買いしてしまった。

HHKB Professional HYBRID Type-Sと、アクセサリがセットになった商品であり、次の内容となっている。

  • HHKB Professional HYBRID Type-S 日本語配列(白):36,850円
  • シリコンタイピングベッド(クールグレー):4,400円
  • HHKB吸振マットHG(Professionalシリーズ用):2,970円
  • HHKBキーボードルーフ(フリーザー):4,730円
  • キーボードポッド2(グレー):5,940円
  • 合計価格:54,890円
  • 特別セット価格:46,500円

HKKBパーフェクトセット

HHKB は購入すべきかどうか何度も迷っていたが、結論的には、早く購入して使い倒した方が、人生の時間において得だったと思う。入力効率のわずかな向上でも、投資する価値はある。それにキーボードの寿命はPCより長いので、長く使うほどお得だ。
キータッチも絶妙だし、ミニマムサイズなので机上が広く使える。ControlキーがAの左なのもよい。REALFORCE RC1 がライバルになるところだが、REALFORCE はキーマップの変更でControlとCaps Lockの変更ができても、キートップまでは変えられない。
なお、HKKBキーマップ変更ツールで、fn+矢印キーだけはPgUp,PgDown,Home,Endに変更した。
Type-Sは静音タイプとのことだが、全く音がしないわけではない。だが外のカフェやファミレスで使っても周りに迷惑をかけない程度には静かだ。吸振マットを裏側に貼るとさらに静かになる。(背面スタンドを立てると意味はなくなるが…)
キーボードルーフとキーボードポッドはいずれ購入したと思うので、セットの意味は十分にあった。
ひとつだけ残念だったのが、シリコンタイピングベッドで、予想外に重く、硬く、掌を置いた時の感触が冷たい。夏なら冷たくていいのかもしれないが、どうしても使う気にならず、結局、別途木製のパームレストを買ってしまった。

HHKB Professional HYBRID Type-Sに不満点があるとすると、Bluetoothで接続時にスリープに入ると、物理ボタンを押さないと復帰しないことである。何かキーを押せば自動的に復帰してほしい。Keychron B1 Proでは、キーの取りこぼしもなく自動復帰できて、便利だった。

もう一点、日本語キーボードの場合、下段のZ~Mの位置がわずかに左に寄っているのが気になるが、使っているうちに慣れてしまった。(よく見ると、REALFORCE RC1もそうなっている)

それなりの出費にはなったが、今後これ以上「理想のキーボード」を求めて他のキーボードに手を出さずに済むという安心感はある。

 

読書尚友の最近の改良

読書尚友をAPI35(Android15)に対応させるついでに、前から気になっていた問題をいくつか修正した。

(1)本棚の書籍の位置の移動

これまでは本棚の書籍の順序を変えられなかったが、GridView / ListView の代わりにRecyclerView を使い、ドラッグで移動できるようにした。本棚をリスト形式で表示しているときは、スワイプで削除もできる。

 

(2)ダウンロードフォントの追加

以前は源ノ明朝 Regularをダウンロードして内蔵のIPA明朝の代わりに使用できたが、Androidのどれかのバージョン以降、標準のSerifが Noto Serif になり、源ノ明朝と同じになったので、ダウンロードの意味がなかった。

今回、源ノ明朝 Light / Regular / Medium / SemiBold / Bold、および、しっぽり明朝、字雲フォントをダウンロードできるようにした。

雲のマークをタップするとダウンロードされ、選択できるようになる。

また、Unicode拡張領域(Ext.B)の表示に使用するフォントも、従来は花園明朝Bを使用していたが、現在は後継フォントの字雲があるというご指摘をいただいたので、字雲に変更した。

※カスタムフォントも使用できるが、フォントを所定の位置にPCからコピーして、設定から選択しないといけないので、ハードルがちょっと高い。

 

(3) Word97-2003 形式のサポート

これまでWordは .docx 形式だけサポートしていたが、.doc 形式を閲覧したい場合が多々あるので、org.apache.poi を使ってサポートした。

 

最近反省しているのが、Google Playのレポートを全然読んでいなかったこと。Android13以降書籍・著者の検索ができない問題や、Free版が広告の問題で落ちる問題が報告されていたが、気がつくのに時間がかかった。大変申し訳なかったと思っている。今後はもう少しユーザの声にも気を配りつつ、引き続き改善していきたい。

EBPocket for Android ひさびさの改良

API35対応でEBPocket for Androidのソースを久々に触る機会があったので、前から気になっていたところを何点か修正した。

(1) 辞書アイコンの表示

辞書ディレクトリに画像データ(jpgかpng)があれば、辞書選択画面で辞書アイコンとして表示するようにした。

辞書選択メニュー
EPWINGの代表的な辞書の画像を内蔵することも考えたが、著作権の問題もあるので、利用者が自分で配置する形にした。

(2) 辞書グループ編集でドラッグによる移動とスワイプによる削除

EBPocket for Androidで一番気になっていたのが、辞書グループの編集で辞書の移動がしずらいことだった。
iOS版では最初からドラッグによる移動ができていたが、Androidの場合はListViewの機能が貧弱で、大幅に作り込む必要があったため、ドラッグは未対応だった。
現在では ListView ではなく RecyclerView を使うと、ドラッグによる移動も、スワイプによる削除も、簡単に実装できるようになっている。

辞書グループ編集
長押しでドラッグモードになるので、上下に移動することで順序が変更できる。
横にスワイプすると削除できる。複数の辞書を削除する場合は、タップして複数選択し、ゴミ箱ボタンを押す。
これで辞書グループの編集が簡単にできるようになった。

(3)ボタンのフラットデザイン

ボタンが立体的だと古臭く感じるので、フラットデザイン(ボーダーレス)にした。
対応は非常に簡単で、次のようにstyleを入れるだけでいい。
<Button 
android:id="@+id/okButton"
style="@style/Widget.AppCompat.Button.Borderless.Colored"
android:text="@string/str_ok"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>

 

Android版の改良はここでいったん終了し、次はiOS版の改良にかかる予定である。

というのは、iOS26でリキッドグラスデザインが導入され、将来的に対応が不可避になるためである。進捗があればまたご報告したい。

 

Android15(対象APIレベル35)対応について

2025/8/31以降、Google Playのアプリをアップデートするには対象APIレベルを35以降にする必要がある。EBPocketと読書尚友の対応作業を一ヶ月ぐらいかけて行ったが、それなりに大変だった。

(1)edge-to-edge対応

一点目は、対象APIレベルを35にするとedge-to-edgeが強制され、画面の表示領域がスクリーンの上端から下端までになる。上部のステータスバーと、下部の3ボタンナビゲーションバーは、アプリに重なってフローティングで表示される。
確かに地図アプリなどでは全画面で表示されたほうが画面を有効活用できると思うが、全てのアプリに強制されるのはどうなんだろう。
とりあえずはActivity の theme に windowOptOutEdgeToEdgeEnforcementを指定すると、edge-to-edgeを無効にはできる。
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
ただし、対象APIレベルを36以上にするとwindowOptOutEdgeToEdgeEnforcementは効力を失うので、これは一時しのぎでしかない。
きちんと対応するには、システムバーのインセットを取得して、システムバーの領域が重ならないようにビューの表示領域を調整する必要がある。
詳しくは以下を見てほしい。
 
大体こんな感じで対応した。
if ( Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM ) {
  optimizeEdgeToEdge();
}
 
private void optimizeEdgeToEdge() {
ViewCompat.setOnApplyWindowInsetsListener(contentView, (v, windowInsets) -> {
Insets insets = windowInsets.getInsets(WindowInsetsCompat.Type.systemBars());
 
ViewGroup.MarginLayoutParams mlp = (ViewGroup.MarginLayoutParams) v.getLayoutParams();
mlp.leftMargin = insets.left;
mlp.topMargin = insets.top;
mlp.rightMargin = insets.right;
mlp.bottomMargin = insets.bottom;
v.setLayoutParams(mlp);
 
// Return CONSUMED if you don't want the window insets to keep passing
// down to descendant views.
return WindowInsetsCompat.CONSUMED;
});
}
 
ただし、表示領域を調整しただけだと、ステータスバーの背景が透明のままになる。従来はsetStatusBarColor()で背景色を指定できたが、API35からはAPIが無効になったので、ステータスバーの背景を変えるのは至難の業になった。
結局、「透明のステータスバーの背景に、色付きのカスタムビューを表示する」という姑息な方法で対応したが、もっといい方法があるかもしれない。

(2)16Kページサイズ対応

二点目は、NDKを用いたライブラリを使っている場合、16Kページサイズに対応しなければならない。JavaやKotlinで書かれている場合は特に対応する必要はない。
読書尚友では、PDFライブラリの android-pdf-viewer が依存している PdfiumAndroid が16Kページサイズに対応していなかった。
調査したところ、16Kページサイズに対応させたandroid-pdf-viewerのforkが見つかったので、こちらに置き換えた。
(変更前:16Kページに未対応)
    implementation 'com.github.barteksc:android-pdf-viewer:3.2.0-beta.1'
 
(変更後:16Kページに対応)
    implementation 'com.github.marain87:AndroidPdfViewer:3.2.8'

EBPocketは自前のC++ライブラリを16Kページサイズ対応させる必要がある。

具体的にはAndroid.mkにリンクオプションを追加するが、NDKのリビジョンによって指定方法が違う。
Android NDK r28 以降 
   デフォルトで 16 KB アラインメントでコンパイルされる。
 
Android NDK r27
    APP_SUPPORT_FLEXIBLE_PAGE_SIZES := true
 
Android NDK r26 以前
    LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
 
Android NDK r22 以前
    LOCAL_LDFLAGS += "-Wl,-z,max-page-size=16384"
    LOCAL_LDFLAGS += "-Wl,-z,common-page-size=16384"
とりあえずこれで対象APIレベル35(Android15)に対応できた。
毎年対象APIレベルが一つずつ上がるので、年に一度の対応が恒例行事になっている。
さて、久しぶりにEBPocketを触ったら、UIの古臭さが気になってきたので、できる範囲で対応してみた。この話は次回にしたい。
 

外付けキーボード購入記

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+ でまだ数年は闘えそうである。