leopardgeckoのブログ

Macの関連事項など

PlanckキーボードをMacでカスタマイズしてみよう。 <応用編>

はじめに

前回の記事でPlanckの基本的なカスタマイズ方法の紹介をしましたが、今回は他にいくつか実例を紹介します。これはPlanckというよりはQMK Firmware全般の説明になるのかもしれません。(記事を書くのにまだ慣れないPlanckを使っているのでタイプミスが多くて大変です・・・😅 )

以下、全て「keymap.c」ファイルの書き換えの説明です。特に説明がなければそのファイルの中の「[_QWERTY]」の設定を書き換えます。「keymap.c」については前回記事を参照してください。

右側にもシフトキーを追加する。

シフトキーが左側にしかないのは不便です。この際、右側にも追加してしまいましょう。かといって右側のキーが減ってしまうのは困るので、長押しでシフトキーの役割を兼用するように書き換えます。私はエンターキーと「'」キーの位置を入れ替えていて、「'」キーをシフトキー兼用にしています。その場合は、「KC_QUOT」を「MT(MOD_RSFT,KC_QUOT)」に書き換え、「KC_ENT」と位置を入れ替えます。

長押しと判定されるまでの時間の調節はこちらのサイトが参考になります。

Windowsでも使うときのために「半角/全角」キーを追加する。

Planckはコンパクトなキーボードですから持ち歩いて他の場所で使うのも楽です。メインマシンはMacでもWindows機を使う機会もあるでしょうから、キーボードをどちらでも使えれば便利です。そこでWin機でも日本語入力ができるように「半角/全角」キーを追加してみます。キーの位置ですが、デフォルト設定では一番左下のキーはバックライトキーであり、バックライトを使わないなら何の役にも立ちません。そこでこれを「半角/全角」キーに変更してしまいます。単に「BACKLIT」を「KC_ZKHK」に書き換えても良いのですが、独立したキーにしてしまうと肝心のMacで使う時に何の役にも立たなくなってしまってもったいないので、長押しした時にはコントロールキーとして使えるようにしてみます。その場合は「CTL_T(KC_ZKHK)」と記述します。デフォルトのコントロールキーの位置は押しにくいので一石二鳥と言えるでしょう。

音量調節を細かくする。

キーボードでの音量調節は割合大雑把なので、イヤホンで音楽を聴いている時などはもっと細かく音量調節をしたくなります。Macには細かい音量調節のショートカットがあり、「Shift」と「Option」を押しながら音量調節キーを押すと標準の四分の1の単位で音量調節ができるようになります。これをPlanckの設定に反映するには、「KC_VOLD」を「LALT(LSFT(KC_VOLD))」、「KC_VOLU」を「LALT(LSFT(KC_VOLU))」に書き換えます。

メディアキーの割り当てを修正する。

デフォルトでは曲送りのキーは「KC_MNXT」になっているのですが、これはあくまでWindows用であってMac本来の曲送りのキーではありません。このままでも一応iTunesでは動作するのですが他のソフトでは動作しないことがあります。例えば私の環境ではAmazon Musicで曲送りができませんでした。iTunes以外の音楽再生ソフトを使う可能性があるならばMac本来の曲送りのキーである「KC_MFFD」に変更しておいた方が無難です。ちなみに曲戻しのキーは「KC_MRWD」です。

レイヤーを増やす。

コマンドキーやコントロールキーなどは一番下の段にありますが、これはこれで良いとしても、もっと楽にアプローチできるキーも修飾キーとして使えれば便利です。ただ単に修飾キーも兼ねるだけなら上で挙げた例のように記述すれば良いのですが、ここではデフォルトのレイヤーである「Lower」や「Raise」とは別にオリジナルのレイヤーを作って、「a」キーの左隣という好位置にある「Esc」キーの長押しで呼び出せるようにしてみます。

「keymap.c」の最初の方にある「enum planck_layers」というところがレイヤー名の定義をしているところなので、ここにオリジナルのレイヤー名を追加します。とりあえず「_MYESC」としてみます。下の画像のように「_ADJUST」の後に一行追加するのですが、「_ADJUST」の後ろに「,」を付け加えるのをお忘れなく。

f:id:leopardgecko:20170914075454p:plain

あとは下の方にある「_ADJUST」の設定の下に、新たに「_MYESC」の設定を加えます。他のレイヤー設定をいったんコピペして好きなキーに書き換えると良いでしょう。下の例はカーソルやページの移動を割り当てたレイヤーです。どうしてそんなものをわざわざ作ったかというと、他に使っている60%サイズキーボードの設定を引き継ぎたかったからです。デフォルトのカーソルキーは最下段ですからホームポジションから遠くて押しにくいですし。他のキーボードで慣れている設定があればそのままPlanckでも使えるというわけです。

レイヤーの書き足しの際には「_ADJUST」の最後にある「}」の後に「,」を付け加えてください。これを忘れるとコンパイル時にエラーになります。

f:id:leopardgecko:20170914080059p:plain

 

「ESC」キーの長押しにこのレイヤー呼び出し機能を割り振るには、「[_QWERTY]」のところにある「KC_ESC」を「LT(_MYESC,KC_ESC)」に書き換えます。コンパクトサイズのメカニカルキーボードはFnキーで独自機能を呼び出せるものが多いですが、こういうやり方でそれっぽい機能を再現できます。

テンキーっぽく使える設定

さらなる応用として、下のようにテンキーっぽく使えるレイヤーを作ることもできます。Planckはテンキーと同じ格子状の配列ですから、通常配列のテンキーレスキーボードより数字入力が格段に楽になります。

f:id:leopardgecko:20170914124627p:plain

私は一番左上の「Tab」キーの長押しにこのテンキーっぽいレイヤーの呼び出し機能を割り振っています。数字をどのキーに割り振るかで少々悩みましたが、右手をホームポジションから動かさずにタイプできる位置にしてみました。

 

長押しの併用は基本的にどのキーに割り振ることもできますが、これを設定すると当たり前ですが元のキーの押しっぱなしの入力はできなくなりますのでご注意を。

とりあえず今回はこのくらいで。

PlanckキーボードをMacでカスタマイズしてみよう。 <導入編>

はじめに

今回は「Planck」というキーボードの話です。

一部で有名な(?)Planckといういわゆる40%サイズの格子型キーボードがあります。と言われても興味のない方には何のことやらさっぱりでしょうが、要するにこういう形の非常にコンパクトかつシンプルなキーボードです。

f:id:leopardgecko:20170913224757j:plain

小さいのですがメカニカルキーボードなので打鍵感はしっかりしたもので、外装は肉厚のアルミでガッシリ感や高級感も感じられます。金属外装のためかサイズの割に重量もあるので意外なほど安定感もあります。ただしこれは一般の店舗やネットショップなどでは売っておらず、MassDropなどでのみ入手できる組み立てキットという特殊な部類のキーボードになります。

組み立て式なのでCherry MX互換のどんなスイッチでも選べる(その気になればキーひとつ単位で様々な種類のスイッチを選ぶことも可能)ということの他に、ファームウェアを書き換えることでハード的にキーマップがいくらでも好きなように変更できるという特徴があります。つまりMacやPCでキーリマップソフトを使う必要がなく、どの本体に繋いでも自分がカスタマイズしたキーマップがそのまま使えるということです。(これはPlanckのみの特徴ではなく、このような機能がある組み立て式キーボードはサイズや形状が違うものが他に何種類も出ています)

私はこのPlanckをごく最近入手したのですが、組み立てはすぐに終わったものの、いざMacでキーマップの作成や転送をやろうとすると入門向けの情報が少ない上に内容が古くてそのままでは使えない情報が結構あり、意外と苦労してしまいました。MassDropでは大人気のキーボードなので日本での情報もそれなりにあるだろうと考えていたのですが少々甘かったようです。そこで備忘録も兼ねて、Planckのキーマップ設定をMacでカスタマイズする手順を紹介することにしました。

本体の入手方法や組み立て方などは他のサイトにお任せするとして、説明はすでに組み立てが終わっているところから始めます。

組み立てただけでもUS配列のキーボードとして普通に使えるのですが、日本語入力には専用のキーが欲しいですし、デフォルトのキーマップを変更したい人もいるでしょう。キーマップを書き換える機能を使うにはいくつかの準備が必要になります。

必要ソフトの導入

まずターミナルを立ち上げて、ファームウェアの作成と転送に必要なソフトをHomebrew経由でどんどんインストールします。Homebrewをお使いでない方はこの際入れてしまってください。(そうすれば私が別記事で紹介しているjRogueというゲームをターミナルで遊ぶことも出来ますよ!😉 )

brew tap osx-cross/avr

brew tap PX4/homebrew-px4

brew update

brew install avr-gcc

brew install dfu-programmer

brew install gcc-arm-none-eabi

次にQMK Firmwareというものを入手します。よくある説明はGitHubからクローンするというものですが、それができる人には説明は不要だと思いますのでGitHubの説明は省略して、ここではファイルを直接ダウンロードするやり方を紹介します。

まず、QMK Firmwareの配布サイトにアクセスしてファイルをダウンロードします。zipファイルを展開して、出来たフォルダをqmk_firmware-master→keyboards→planck→keymapsと辿っていき、keymapsフォルダの中に自分用のフォルダを作ります。ここでは仮に「leopardgecko」というフォルダを作ったとします。keymapsフォルダの中に「default」というフォルダがあり、その中に「keymaps.c」というファイルがあるので、これを先ほど作った「leopardgecko」フォルダの中にコピーします。この「keymaps.c」がキーマップを設定するファイルです。

カスタマイズ例(「英数」「かな」キーを追加する)

カスタマイズの一例として、スペースキーの両隣にある「Lower」と「Raise」キーを一回押しすると「英数」「かな」キーとして動作する方法を紹介します。もちろん長押しの時は「Lower」と「Raise」としての本来の動作をします。US配列のキーボードを使っている人にはコマンドキーのリマップでおなじみのカスタマイズですが、この設定をキーボード本体に保存できるのが最大の違いです。

先ほどコピーした「keymaps.c」をテキスト編集できるソフトで開くと「[_QWERTY] = {」という行があります。その下に「KC_云々」というような記述が並んでいるところが基本レイヤー(要は普段使うところ)のキー設定です。

f:id:leopardgecko:20170913225638p:plain

ここの「LOWER」を「LT(_LOWER,KC_LANG2)」に書き換え、「RAISE」を「LT(_RAISE,KC_LANG1)」に書き換えます。これで「Lower」「Raise」キーが一回押しの時はそれぞれ「英数」「かな」キーとしても動作するようになります。

Planckに設定ファイルを転送

このキーマップをPlanckに転送するには、まずPlanckをMacに接続したまま裏にある小さな穴の奥にあるリセットボタンを何か尖ったものでしばらく押して、ファームウェアが書き換えられるモードに切り替えます。次に別のキーボードを使ってMacのターミナルで先ほどの「qmk_firmware」フォルダに移動し、

make planck-rev4-leopardgecko-dfu

と入力します。この「leopardgecko」というところは先ほど作成したフォルダの名前にしてください。これでファームウェアコンパイルされ自動的にPlanckに転送されます。Planckから電子音が鳴ったら成功です。

デフォルトのキーマップに戻したい時は、

make planck-rev4-default-dfu

と入力すればOKです。

日本語版ローグ(Rogue 5.4)for macOS よもやま話 その5。<カウンターカルチャー>

以前の記事で公開したMac用日本語版ローグ(Rogue)についての雑談です。

ローグ5.4の和訳作業をしている時に不思議に感じたことの一つに、「幻覚をおこす水薬」で起こる作用がやたらと凝っているということがあります。モンスターやアイテムがめまぐるしく変化するのはプレイ画面を見ているだけでもわかりますが、例えば色が出てくるメッセージのときは表示される色の名前がランダムに変わったりしますし、メッセージの内容も幻覚時かそうでないかで変わるものが結構あるのです。それ自体はゲームの進行にはほとんど関係がないので、ほとんどが単なるお遊びの要素です。

↓ 例:「目が見えなくなる水薬」や「空中に浮き上がる水薬」で使用時のメッセージが変わる。

f:id:leopardgecko:20170909231835p:plain

これはローグの製作者が「幻覚」に強い思い入れを持っていた証なのではないかと思います。私がそう感じたもう一つの根拠として、ソースコードに隠された(?)名称があります。「幻覚をおこす水薬」は元の英語版では「hallucination」なのですが、ソースコードの注釈には「LSD」と書いてあるのです。つまりこの水薬は実在の幻覚剤であるLSDをモチーフにしたものだったことがわかります。

↓ ソースコードに「LSD」と書いてある

f:id:leopardgecko:20170909232017p:plain

アメリカでLSDが全盛だったのは60年代後半から70年代始めのサイケデリックブームの時期でしょう。ローグが作られた1980年はすでに収束に向かっていた頃でしょうが、まだ70年代の記憶は新しい時期でしょう。製作者もLSDの使用経験があったのかもしれませんし、少なくとも身近に感じていたのは確かでしょう。

ここで突然スティーブ・ジョブズの話題に移りますが、ジョブズは60年代の音楽や文化すなわちカウンターカルチャーが大好きな人で、ボブ・ディランビートルズのディープなマニアでしたしLSDマリファナの経験もありました。ジョブズが活躍を始めた時期、つまり70年代後半はエレクトロニクスとカウンターカルチャーが非常に接近していた時期だったと言えるでしょう。これはアメリカ独自の現象だったのではないかという気がします。

ローグの製作者もジョブズと同様にカウンターカルチャーに強い親近感を覚えていたのではないかと思います。LSDの件に加えて、もう一つ根拠があります。添付文書の「【運命の洞窟】へのガイド」を見ると、オプションの説明でキャラクターの名前を変更する例がありますが、その名前は「Blue Meanie」と書いてあります。これは1968年に製作されたサイケデリックなアニメ映画の「イエロー・サブマリン」に出てくるキャラクターの名前で、この映画にはビートルズがアニメのキャラクターとして主演しています。ローグの製作者もジョブズ同様にビートルズのファンだったのでしょう。

↓ 「【運命の洞窟】へのガイド」より抜粋

f:id:leopardgecko:20170909234131p:plain

こういったことを総合的に考えてみると、70年代後半から80年代前半にかけてエレクトロニクスとカウンターカルチャーの親和性が非常に高い時期があったのだと思います。ローグがただのお硬くて真面目なファンタジーではなく、どことなく人を食ったようなユーモアに満ち溢れているのはそういうところからも来ているのではないかなと思った次第です。

日本語版ローグ(Rogue 5.4)for macOS よもやま話 その4。<仕様変更>

以前の記事で公開したMac用日本語版ローグ(Rogue)についての雑談です。

jRogue for macOS(以下jRogue)には少しだけオリジナルとは変更しているところがあるのですが、今回はその説明をします。

オリジナルのRogue 5.4はHomebrewでインストールすることができますが、そちらで遊んだことがある人であればjRogueとの違いがすぐに目につくだろうと思います。パッと見たときにすぐわかる違いの一つは、jRogueでは背景を黒、文字を白に設定していることです。

Homebrew版Rogue 5.4を背景を白に設定しているターミナルで起動すると、以下のような画面になります。

f:id:leopardgecko:20170823163341p:plain

jRogueではターミナルの設定に関わらず背景は黒で表示されます。

f:id:leopardgecko:20170823163356p:plain

カラーモードでも同様です。

f:id:leopardgecko:20170823163411p:plain

黒を背景にしたのは、昔の端末はそういうものが一般的だっただろうということもあるのですが、一番はこの方がゲーム画面としてより適切であろうという考えからです。

もう一つの違いは、オリジナルはプレイヤーの位置にカーソルが表示されますが、jRogueではあえてカーソル表示をしないようにしています。これは私が外観をカスタマイズする上で参考にしたメッセージ分離型ローグの仕様を反映したものですが、カーソルの有無をじっくりと見比べた結果、カーソルはない方が美しいだろうという私の勝手な個人的判断も含まれています。ただしカーソルを消すとプレイヤーの位置がわかりにくくなってしまうのでオリジナルのままにしておくべきか非常に迷いました。オプションで選択できるようにしようかとも考えたのですが、やたらと複雑にするのも良くないだろうと思い、えいやっと思い切って現在の仕様に固定しました。

他にはオリジナルではスコア表示画面で最新のスコアの行が反転表示されない不具合があったので修正しました。また、遠くの怪物がわかる水薬を飲むと他の部屋にいる怪物が反転表示されるようになるのですが、jRogueの元になっている5.4pのソースではカラー表示の時は反転表示がされない不具合があったので関数を追加するなどして動作の修正を行いました。多分これはMacだけの問題ではなく元のWindowsLinux版でもカラーでは反転表示されないのではないかと思うのですが、私はWindowsLinuxも使っていないので検討できません。下の画像に遠くの怪物が知覚できる状態の例を出しますが、プレイヤーがいる部屋以外の怪物が反転表示されているのがお分かりになるかと思います。

f:id:leopardgecko:20170823170319p:plain

 

最後に、細かいところですがオプションの「持ち物の表示方式」が「上書き(Overwrite)」になるように修正しています。オリジナルのソースコードMacでそのままコンパイルすると「クリア(Clear)」がデフォルトになります。何が違うかというと、「上書き」の場合はマップを表示したまま画面の右上に持ち物を表示するのですが、「クリア」の場合はマップ画面をいったん消して持ち物だけを表示します。Rogueの歴史の中では「上書き」が最新の表示方式らしいのですが、当時は「clear-to-end-of-line」という機能を持たない端末は表示速度が遅くなるため、そういう端末では旧来の「クリア」がデフォルトになる仕組みになっていたようです。Macのターミナルでは「clear-to-end-of-line」の機能はないと判定されて「クリア」の設定になってしまうのですが、今のMacで表示速度が問題になることはありません。表示が速い端末では「上書き」で表示するのが開発者が意図した動作でしょうから、そのように修正しました。

これが「上書き(Overwrite)」の持ち物表示。

f:id:leopardgecko:20170823223835p:plain

こちらが 「クリア(Clear)」。マップなどの表示が画面からいったん消える。

f:id:leopardgecko:20170823223945p:plain

 

不具合の修正はともかく、オリジナルからの仕様変更はやって良いものかどうか悩むところです。私としてはRogueを単に歴史的な遺産としてそのまま保存するのではなく、2017年の今でも楽しく遊べるゲームとして再現したいと思っています。あくまで元のままのオリジナル性にこだわる方は、MacではHomebrew版のRogueをお使いになることをお勧めします。

(ただしHomebrew版には上述の持ち物の表示方式の問題とスコア表示の際に最新の行が反転表示されないという不具合もあるのですが・・・)

日本語版ローグ(Rogue 5.4)for macOS よもやま話 その3。<走る>

以前の記事で公開したMac用日本語版ローグ(Rogue)についての雑談です。

今回は走る動作についての説明をしてみます。

シフトキーとコントロールキーの違い

ローグで移動するためには「hjkl」キーをタイプするのは皆さんよくご存知でしょうが、シフトキーまたはコントロールキーを押しながら移動キーをタイプすると走ることができます。

シフトキーを押した場合は、モンスターにぶつかったりアイテムの上に乗って拾ったりするところまで進みます。動かないモンスターにもぶつかってしまうので、むやみに使うと危険なコマンドです。氷の怪物に衝突して一瞬でゲームオーバーになってしまうこともありますから。

コントロールキーを押した場合は、ぶつかる前に自分の隣に何かを見つけると止まります。比較的安全なコマンドだと言えるでしょう。

慣れるまではコントロールキーだけを使った方が良いでしょうが、明らかに止まる必要がないところを駈け抜けるときにシフトキーを使うなど使い分けをすれば動作のサクサク感が上がるでしょう。

言葉だけで動作の違いを説明するのは難しいので、一例を動画でお見せします。

www.youtube.com

 

オプションの「jump」とは

jRogue for macOSでは走るときに動いている様子が一コマ一コマ表示されますが、オプション設定で瞬間移動させることも可能です。そのためには、「o」キーでオプション設定を呼び出し、「移動中の表示を行わない ("jump")」を「True」に設定します。

設定を変えるには、オプション画面が表示されたらリターンキーを押して設定を変えたい行にカーソルを移動し、オン(True)にしたい場合は「t」を、オフ(False)にしたい場合は「f」を押すだけです。

アニメ表示はいらないのでサクサクと進めたい時には便利な設定です。

www.youtube.com

 

オプションの「passgo」とは

オプションの「通路の角で止まらずに進む ("passgo")」で、通路を走るときに曲がり角で止まるかどうかの設定をすることができます。

もともと初期のRogueでは曲がり角で止まるのがデフォルトの動作で、のちのバージョンで曲がった通路でもドアからドアまで一気に走ることができるオプションが追加されたようです。曲がり角で止まらなければならない理由も特にないと思いますので、これは常に「True」にしておいて良いのではないでしょうか。

初期Rogueの雰囲気を味わいたいオールドファンであれば、あえて「False」に設定するのもありでしょう。GUI版のオリジナルモードやCUI版のデフォルト設定は「False」になっています。

www.youtube.com

 

Rogueは非常に古い黎明期のコンピューターRPGですが、走るという単純な行動に対する設定だけでもこれだけのバリエーションがあるのは驚きです。Rogueの制作者たち自身がRogueを愛し丁寧に作っていた証であろうと思います。

GeekToolでお天気表示 改訂版

(以前GeekToolで天気を表示するためのスクリプトを公開したのですが、見直してみると地域やプロキシの変更が面倒そうなのでもっと簡単に設定を変えられるように全面的に改定してみました。前回の記事を読んでいない人にもわかるように記述がかぶりますがご容赦ください。ここのスクリプトは転載や改変なども自由にやっていただいて構いませんが、公開される場合はこのブログがオリジナルである旨の記載を入れてください。

はじめに

GeekToolとはMacのデスクトップをカスタマイズできるソフトです。スクリプト次第で色々なものを表示できて便利なのですが、スクリプトが公開されているものでなければ自分でスクリプトを書かなければなりません。
天気を表示するスクリプトは情報が古くて今では使えないものが多い上に自力で作るとなるとHTMLソースを解析する必要があるなど結構大変な作業なので、AccuWeatherという天気予報サイトを利用したスクリプトをご紹介します。GeekTool自体の使い方は他の入門用サイトを参照してください。

例えば下の画像のような感じで表示させるとします。一番上の小さめの文字が本日の最高・最低気温。一番大きな文字が現在の気温・天気、その左が現在の天気の画像です。中段のずらっと並んだ画像と文字が時間単位の天気予報で、とりあえず16時間後まで表示しています。下段が明日と週末の天気予報です。

f:id:leopardgecko:20170803144326p:plain

現在の気温と天気

現在の気温と天気を表示してリアルな画像の天気アイコンを取得するスクリプトを下に示します。Propertiesウインドウの「Refresh every 〜s」のところで表示を更新する秒数を設定するのを忘れないでください。

このままでは東京都江東区の天気が表示されてしまうので、スクリプトを書き換える必要があります。まずhttps://www.accuweather.com/en/jp/japan-weatherにアクセスして、天気を表示したい市や区の名前をローマ字で入力して検索するとその地域の天気が表示されるようになりますので、そこのURLを記録してください。「https://www.accuweather.com/en/jp/場所/数字/weather-forecast/数字」のような形式になるはずです。下のスクリプトの「# 場所のURL」の下に「weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"」という記述がありますが、この赤い文字で示した部分が表示したい場所のURLです。ここを上で記録したURLに書き換えてください。このURLは他のスクリプトでも使います。

(社内での使用などでプロキシを指定する必要がある場合は、「# プロキシ」の次の行の「weather_proxy=""」を「weather_proxy="--proxy http://hogehoge:8080"」のように適宜書き換えてください)

天気アイコンの画像は「/tmp/weather_now.png」に保存されるので、GeekToolの「Image」をデスクトップにドラッグ&ドロップしてURLを「file://localhost/private/tmp/weather_now.png」と指定してください。上のスクリプトと同じようにRefreshの秒数設定も忘れずに。

画像をリアルではなく他と同じシンプルなものにしたい場合は、スクリプトの最後の方の「https://vortex.accuweather.com/adc2010/images/icons-numbered/」のところを「https://vortex.accuweather.com/adc2010/images/slate/icons/」に変えてください。

# 現在の気温と天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_data=`curl $weather_proxy --silent $weather_url`

# 現在の温度と天気を取得して表示
echo "$weather_data" | grep -A 8 'Current Weather' | grep -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 天気アイコンのナンバーを取得し二桁でゼロパディングする
icon_cur=`echo "$weather_data" | grep -A 2 'Current Weather' | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789' | awk '{printf "%02d", $1}'`

# 天気アイコンナンバーをURLに変換して画像を保存
echo "https://vortex.accuweather.com/adc2010/images/icons-numbered/"$icon_cur"-xl.png" | xargs curl $weather_proxy --silent -o /tmp/weather_now.png

最高気温と最低気温

最高気温と最低気温の表示は以下の通りです。AccuWeatherでは夜になると最低気温のみの表示に変わるのですが、それにも対応させてあります。「場所のURL」は上と同じように天気を表示したい地域のURLに書き換えて、必要がある方はプロキシも書き換えてください。以下のスクリプトも全て同様です。

# 最高気温と最低気温のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_today=`curl $weather_proxy --silent ${weather_url/weather-forecast/daily-weather-forecast}"?day=1"`

# 今日の最高温度と最低温度を取得して表示
echo "$weather_today" | grep -A 6 'Today\|Tonight' | grep  -e 'large-temp\|small-temp\|temp-label tonight selected' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

時間単位

以下は現在時刻から8時間後までと、9時間後から16時間後までのスクリプトです。これは等幅フォントを指定しないと表示がずれますのでご注意を。(上の画像ではRicty Discordというプログラミング用の等幅フォントを使っています)

天気アイコンの画像は「/tmp/weather_hour_0.png」から連番で「/tmp/weather_hour_7.png」まで保存されるので、上の応用で画像を一つずつ貼り付けて並べてください。

視認性を上げるためにamとpmの色を変えていますが、色を変えたくない場合は「時刻を左揃え8桁で表示」のところの「 | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g」をごそっと削除してください。(「printf "%-8s" ${current_time[*]}」だけ残す)

まず一つ目、現在時刻から8時間後までのスクリプトはこんな感じです。

# 現在時刻から8時間後までのスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
my_hour=`date +%H`
curl_data=`curl $weather_proxy --silent ${weather_url/weather-forecast/hourly-weather-forecast}"?hour=$my_hour"`

# 8時間分の時刻を取得(後で配列変数として使う。以下同様)
current_time=(`echo "$curl_data" | grep -A 37 "overview-hourly" | grep -A 29 "first-col" | sed -e 's/<[^>]*>//g' -e 's/^ *//' | tr -d "\r"`) 

# 8時間分の天気を取得(データにスペースが入ることがあるのでIFSを使って処理)
_IFS="$IFS";IFS="_"
current_weather=(`echo "$curl_data" | grep -A 67 "overview-hourly" | grep -A 23 "Forecast" | sed -e 's/<[^>]*>//g' -e 's/^ *//' -e '1,2d' -e 's/ \&amp;/\&/g'| tr -s '\r\n' '_'`)
IFS="$_IFS"

# 8時間分の天気アイコンのナンバーを取得
current_icon=(`echo "$curl_data" | grep -A 38 "overview-hourly" | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789\n'`)

# 時刻を左揃え8桁で表示
printf "%-8s" ${current_time[*]} | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g

# 天気を左揃え8桁かつ2段で表示
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $1}'
done
echo
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $2}'
done

# 天気アイコンを取得して保存(URLに使うアイコンのナンバーはゼロパディングする)
for (( i=0; i < ${#current_icon[@]}; ++i))
do
current_icon[$i]=`printf "%02d" ${current_icon[$i]}`
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/${current_icon[$i]}-s.png" | xargs curl $weather_proxy --silent -o /tmp/weather_hour_$i.png
done

9時間後から16時間後まではこんな感じ。上のスクリプトの応用ですから内容はほとんど同じです。「later=」の後の数値を「16」にすれば17時間後から24時間後の表示にすることもできます。天気アイコンの画像は「/tmp/weather_hour_8.png」から連番で「/tmp/weather_hour_15.png」まで保存されます。

# 9時間後から16時間後までのスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 何時間後?
later=8

# 元データ取得
my_hour=`date +%H` ; my_hour=`expr $my_hour + $later`
curl_data=`curl $weather_proxy --silent ${weather_url/weather-forecast/hourly-weather-forecast}"?hour=$my_hour"`

# 時刻を取得
current_time=(`echo "$curl_data" | grep -A 37 "overview-hourly" | grep -A 29 "first-col" | sed -e 's/<[^>]*>//g' -e 's/^ *//' | tr -d "\r"`)

# 天気を取得(スペースを含んだデータを配列に格納)
_IFS="$IFS";IFS="_"
current_weather=(`echo "$curl_data" | grep -A 67 "overview-hourly" | grep -A 23 "Forecast" | sed -e 's/<[^>]*>//g' -e 's/^ *//' -e '1,2d'  -e 's/ \&amp;/\&/g' | tr -s '\r\n' '_'`)
IFS="$_IFS"

# 天気アイコンのナンバーを取得
current_icon=(`echo "$curl_data" | grep -A 38 "overview-hourly" | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789\n'`)

# 時刻を左揃え8桁で表示
printf "%-8s" ${current_time[*]} | sed -e s/am/`echo "\033[0;31mam\033[0m"`/g -e s/pm/`echo "\033[0;34mpm\033[0m"`/g
# 天気を左揃え8桁かつ2段で表示
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $1}'
done
echo
for (( i=0; i < ${#current_weather[@]}; ++i))
do
echo "${current_weather[$i]}" | awk '{printf "%-8s", $2}'
done

# 天気アイコンを取得して保存(取得するアイコンのナンバーはゼロパディングする)
for (( i=0; i < ${#current_icon[@]}; ++i))
do
current_icon[$i]=`printf "%02d" ${current_icon[$i]}`
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/${current_icon[$i]}-s.png" | xargs curl $weather_proxy --silent -o /tmp/weather_hour_`expr $i + $later`.png
done

明日の天気

明日の天気は以下の通り。AccuWeatherでは深夜を過ぎるとその日の早朝の天気に表示が変わりますが、それにも対応させてあります。天気アイコンは「/tmp/weather_tomorrow.png」に保存されます。

# 明日の天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_data=`curl $weather_proxy --silent $weather_url`

# 明日(または早朝)の天気を表示
echo "$weather_data" | grep -e 'Tomorrow\|Early' | sed -e 's/<[^>]*>//g'  -e 's/^ *//' 
echo "$weather_data" | grep -A 9 'Tomorrow\|Early' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 明日の天気アイコンのナンバーを取得しゼロパディングする
icon_data=`echo "$weather_data" | grep -A 2 'Tomorrow\|Early' | grep 'icon' | sed -e 's/[^"]*"\([^"]*\)".*/\1/' | tr -cd '0123456789' | awk '{printf "%02d", $1}'`

echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_data"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_tomorrow.png

週末の天気

週末の天気は以下の通り。天気アイコンの場所は土曜日が「/tmp/weather_sat.png」、日曜日が「/tmp/weather_sun.png」です。

# 土日の天気のスクリプト

# 場所のURL
weather_url="https://www.accuweather.com/en/jp/koto-ku/221230/weather-forecast/221230"

# プロキシ
weather_proxy=""

# 元データ取得
weather_weekend=`curl $weather_proxy --silent ${weather_url/weather-forecast/weekend-weather}`

# 土日の天気を表示
echo "\033[0;34mSaturday\033[0m"
echo "$weather_weekend" | grep -A 9 'Saturday' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "
echo "\n\033[0;31mSunday\033[0m"
echo "$weather_weekend" | grep -A 9 'Sunday' | grep  -e 'large-temp\|cond' | sed -e 's/<[^>]*>//g' | sed -e 's/&deg;/°/g' -e 's/^ *//' | tr "\r\n" " "

# 土日の天気アイコン取得
icon_sat=`echo "$weather_weekend" | grep -A 2 'Saturday' | grep 'icon' | sed -e 's/^ *//' -e s/'<div class=\"icon '//g -e s/' \"><\/div>'//g -e s/i-//g -e 's/\([0-9]*\).*/\1/' | tr -d '\n' | tr -d '\r'`
icon_sat=`printf "%.2d\n" $icon_sat`
icon_sun=`echo "$weather_weekend" | grep -A 2 'Sunday' | grep 'icon' | sed -e 's/^ *//' -e s/'<div class=\"icon '//g -e s/' \"><\/div>'//g -e s/i-//g -e 's/\([0-9]*\).*/\1/' | tr -d '\n' | tr -d '\r'`
icon_sun=`printf "%.2d\n" $icon_sun`

echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_sat"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_sat.png
echo "https://vortex.accuweather.com/adc2010/images/slate/icons/"$icon_sun"-l.png" | xargs curl $weather_proxy --silent -o /tmp/weather_sun.png

さいごに

他にもAccuWeatherには色々な予報がありますので、これまでに挙げたスクリプトの仕組みがわかれば様々な応用が可能でしょう。要はHTMLソースの中から欲しい情報をゲットするためのキーワードを拾ってHTMLタグを除去してテキストを整形しているだけですから、キーワードを確実に拾えるパターンを見つけさえすればOKです。

メカニカルキーボードのカスタマイズ。

日本では一部の業界を除いて全く流行る気配がないのですが、海外ではキーボードのカスタマイズが盛んに行われており、様々なスタイルのキーキャップが販売されていたり、キーキャップのデザインを自分で行えるようなサービスがあったり、全て自作するキットまであったりします。

キーボード本体も様々なキータッチのものが存在しており、スムーズに押し込む感触だけのもの、わずかなクリック感があるもの、カチカチと音が鳴るものなどから好みのものを選びます。また、それぞれキーの重さも何種類か用意されています。

私はCherry MX黒軸のいわゆる60%サイズのコンパクトキーボード(KBParadise V60)をベースにして、外側のケースを木製のものに変更し、キーキャップは黒の無刻印、ESCキーだけ顔のマークがついているものを使っています。また、打鍵音を抑えるために静音リングをつけています。

f:id:leopardgecko:20170221110805j:plain

海外の猛者に比べれば全く特別なカスタマイズではありませんが、日本国内ではこういうものはなかなか入手できないので海外サイトを利用することになります。具体的には、木製ケースはMassdrop、黒の無刻印キーキャップのセットはAliExpress、ESCキーはEbayで購入しました。

中でも苦労したのはキーキャップのセットで、黒の無刻印で質の良いものを見つけるのは意外と大変でした。最初は国内で簡単に入手できるFILCOのMajestouch用を買ったのですが、これは実際には黒というよりはかなり色の濃いグレーの半透明で、しかもプラスチックの厚みが全体的に薄く使用感は良いものではありませんでした。薄いと打鍵音が甲高く耳障りなものになってしまうのです。また、これはABS樹脂製で磨耗に弱く使っているうちに表面がツルツルになってしまい見た目が安っぽく触り心地も良いものではありませんでした。次にMAX Keyboardという海外サイトから磨耗に強いPBT樹脂製のセットを買ってみました。これは厚みもありツルツルにもならず使用感は良かったのですが見た目のばらつきがかなりあり、キーによってグレーに見えたり黒に見えたりしてかなり格好悪い仕上がりになってしまいました。

最後にたどり着いたのがAliExpressで売っているNPKCのPBT製キーキャップです。キーキャップの形状にはいくつか種類があって、私が買ったのはCherry profileという高さが低めのもの(一般的な高さのものはOEM profileという)です。これが今までで一番まともなものでした。厚みがあり、外観のばらつきが少なく、触った感触も良く、打鍵音は静かで静音リングはなくても良いくらいです。(音の差は樹脂の種類や厚み以外にもprofileの違いも影響がありそうですが)

一見良いことずくめのようですが、AliExpressは中国からの直輸入になるので、ある程度のトラブルは覚悟の上で注文する必要があります。私はうっかり春節の時期に注文をしてしまったので出荷されるまでかなり待つことになりました。あまりにも時間がかかるので一度キャンセルを試みたのですが、「休暇が終わったら出荷するからもう少し待ってくれ」みたいな返事が来て簡単にはキャンセルに応じてくれないのです。

 

キーボードのカスタマイズはとても楽しいのですが、日本人向けの情報が少なく失敗のリスクがある上に面倒なことも多く費用もかかります。国内でもこういう世界がもっと盛り上がってくれれば品質の良いものをもっと簡単に入手できるようになると思うのですが、なかなかそういう流れにならないのが残念です。