2018年12月30日日曜日

UbuntuでJava Web Start (サポート状況/文字化け対策)

UbuntuでJava Web Startをやるのは意外と面倒になってきました。 自分自身がいつか絶対ハマるなと思ったのでその対策をまとめておきます。


今後の Java Web Start の立ち位置

(1) まずJava Web StartはOracleの技術なので、OpenJDKには含まれていません。 そのためOracle JRE/JDKを手動ダウンロードする必要がある。

(2) しかもJava Web StartはJava SE 8からJava SE 11への移行に伴って廃止されるので、Java SE 11には含まれていません。 Java SE 8は2019/1から商用サポートが切れ、セキュリティ的にも問題が出てきますが、仕方ない。 Java SE 8をダウンロードしましょう。

(3) さらにJava SE 8はいくつかのOSでは日本語表示に問題があります。 特にUbuntuはデフォルトでサポートされていないので日本語は文字化けます。 解決策はこことかここで語られてますが、Ubuntu 18.04以降を対象とした対策は以下のようになります。


文字化けを直す方法

まずはOracle JRE/JDKをtarballで拾ってきてどこかに配置します。もちろん apt + PPA で拾ってきても良い。 私は /opt/jre1.8.0_191/ に配置しました。

次に /opt/jre1.8.0_191/lib/fonts に移動してfallbackディレクトリを作り、その中に日本語フォントへのシンボリックリンクを作成します。 デフォルトのUbuntu 18.04では Noto Sans CJK / Noto Serif CJK のどちらかを使う事になるでしょう。
cd /opt/jre1.8.0_191/lib/fonts/
mkdir fallback && cd fallback
sudo ln -s /usr/share/fonts/opentype/noto/NotoSansCJK-Regular.ttc .
sudo ln -s /usr/share/fonts/opentype/noto/NotoSerifCJK-Regular.ttc .
ちなみにUbuntuに限らず、Javaがデフォルトで対応しているOSごとのフォントサポート状況は以下のコマンドで確認できます。 対応するディレクトリがない=対応していない場合は上記のようなフォント設定が必要になる。
ls -altr /opt/jre1.8.0_191/lib/fontconfig*


ここまでくれば後は普通にJava Web Startが使えるようになります。 実行したい jnlpファイルを以下のコマンドで実行しましょう。
/opt/jre1.8.0_191/bin/javaws foobar.jnlp


今後、Java Web Startは上記3つのトラップをかい潜ってようやく使えるものになります。 執筆時点では2の問題が起きてないのでマシですが、来年ハマる人が続出しそう…。

Windowsのテキストエディタまとめ

LinuxノートPCがお亡くなりになって、久々にWindowsを使いました。 昔はバリバリのWindowsマンだったのですが、久々のせいかテキストエディタを探すのに凄く時間が掛かりました。 今後時間を掛けないように軽くまとめておきます。

海外製のエディタ

高機能なものが多いのですが、日本語特有の編集は若干苦手な時があります。 典型的な例は全角空白の表示や処理などですね。

日本製のエディタ

日本語に強く高機能なのですが、海外製には配色設定で負けてる事が多いです。

探せばもちろん他にも色々あると思いますが、有名そうなところだけ。 昔はPeggy, SpaceEditor, Meadowとかもあったのですが、サポート停止なされたらしい。

ちなみに私が探していたのは Mery。 軽くてまあまあ高機能で、配色設定に強いのが特徴です。 普段はVimを使っているのですが、Vimではできない事をやる時に重宝します。 名前を忘れていて探すのに時間掛かりました。

リアルでも広告で0円サービスは可能か?

DeNAが「0円タクシー」を始めるらしいです。都内のタクシーの平均料金がいくらなのかよくわからないけど、 初乗り410円で利用率が+23%だから、無料なら+100%くらい望めるのかも知れない。 410円未満の利益を増やすには、確かに広告は現実的な価格帯になっている。 ただ410円と100円以下の壁は大きい気がするなあ。 価格帯が下がれば下がるほど、人件費と設備費と燃料費の問題が出てくる。


また仮に乗車率が+100%になったとして、 Web広告よりはずっと広告効果が高そうだから1人あたり5%の広告効果が望めるとしても、 どん兵衛1個の5%はたった5円の利益なんだよなあ。 まあ化粧品のようにもう少しボリュームの高い広告主が入り込んでくれば、 ペイする可能性はより高まっていくのではないかとは思う。

広告の適正値というのは読めないところがある。 リアルな売上の増加から考えられる利益を考えると5円だけど、Google Adsenseの1クリックを20円とすれば、5クリックくらいの価値はありそうだ。 この計算だと100円くらいの価値が生まれそうだから、意外とちょうど良い数値になってくる。 仮に10クリックくらいの価値と見積もるなら200円。これはペイする可能性がある数字のようにも思う。


このニュースは実際ペイするのかという問題があるにしても、リアルな商売でも勝負の価格帯が100円~200円に落ちてきた事がわかり、インパクトのある話だと思う。 食料品や飲料品、電車/バス代賃などもその価格帯に入る訳だから、結構色々な余地を感じさせる。

ただ無料に目を引かれはするけど、タクシー料金全体が無料になるとはあまり思えない。 タクシー料金がすべて広告で賄えるか? 100km乗っても? そんな事はないよね。 50台の制限を掛けたりして、ほんの一部を広告車にするからこそ成立するんじゃないか。 それなら出店に出店するのと同じ効果がありそうだし。 観光用車としては面白いと思うし、それ以外でも成立するなら面白いやり方だとは思う。

2018年12月12日水曜日

フリゲ紹介: カプグラの審判

カプグラの審判は、主人公の抱える不可解な謎を解き明かす新感覚アクション&アドベンチャーゲーム (作者様紹介)。



久々にVectorを眺めていたら見つけたアクションゲームなのですが、シンプルだけど面白いなと思った作品。 主人公のメアリーは自身の抱える謎を、カウンセラーのミツキとのカウンセリングを通じて記憶を辿り、解いていきます (下)。



カウンセリングは「深層の箱庭」を探索し、「記憶の結晶」を見つける事によって行われます。 その探索がアクションゲームになっている (左下)。 深層の箱庭を探索できる時間は限られており、その時間内に記憶の結晶を見つけないといけません。

しかし最初のほうは短い時間しか探索できないので、深層の箱庭に散らばる結晶を蓄え、スキルを開放したり探索可能時間を増やしながら、記憶の結晶を手にする事を目指します。 右下図はスキルを管理したり記憶の結晶を確認する画面ですが、左下に記憶の結晶が溜まっています。 いくつかの記憶の結晶が集まった時、主人公の抱える謎は解決するでしょう。



このゲームを最初にプレイした時、VIPRPGのWindⅠ Upgradeという作品を思い出しました。 システムは非常によく似ている。 WindⅠ Upgradeは中盤くらいからカオスな事になってきてVIPRPGらしさを楽しめる作品なのですが、カプグラの審判は正統派作品で最後まで安定したプレイが楽しめる作品になっています。

フリゲ紹介: Princess Quartet

Princess Quartetは、奪われた王国の宝を取り戻すため、エルフ御一行が冒険に旅立つ、王道RPG。タイトル画面を見てわかるように、可愛いは正義 (もちろん男性も出て来る)。



まだ第一章のみの公開ですが、今後に期待の作品ですね。第一章の主人公はエルフの王国の姫様リサ (左下)。 他にもたくさんのエルフっ娘が出てきます。 キャラ画だけでなくシステム面の作り込みも凄いですね。エルフの王国はとても幻想的です (右下)。



姫城であるリサは王国の外に出れずに四苦八苦する日々を送っていたのですが、ある事件をきっかけに王国の宝を奪われてしまいます。 その王国の宝を取り返すために旅に出られる事になり、道中で様々な街に立ち寄ります (左下)。 立ち寄る街ごとに、様々なクエストが用意されているのが印象的でした (右下)。 お使い要素は結構あるのですが、サクサクプレイできて飽きないような仕組みになっている。 本編も様々なアクション要素があって面白い。



様々な敵とも出会います。戦闘はサイドビューで (左)、カットインなどもあり格好良い。 スキルツリーを成長させる事ができるようになっていますが (右)、第一章だけではスキルツリーを埋めきるのは、今のところ大変です。



これからさらに幅が広がって面白くなりそうだ!というところで第一章は終わり。 これからなのに〜というところもありますが、第一章だけでも9〜10時間の想定と、結構なボリュームがある作品でした。 第一章だけでも十分に楽しめると思います。 新たなキャラクターが出てくるであろう第二章も楽しみですね。

2018年12月7日金曜日

UbuntuでWiFiが認識しなかった時の対処法

HPのノートPCを買ったのですが、いざLubuntuに入れ替えるとワイヤレスカードを認識してくれず、WiFiがまったく使えませんでした。 LANコネクタもないモデルだったので使い物にならなくなってしまった。 ググるとHPのノートPCでハマってる人が山のように出てきますね…今後はHPのノートPCはもう少し注意しよう。 とりあえず解決はできたので、同じ事が起きた時にどのように対処すれば良いかまとめておきます。


ワイヤレスカードが認識しない場合、まずは使用しているワイヤレスカードが何かを調べない事にはドライバを入れようがありません。 Ubuntuでは以下のコマンドで調べられます。様々なハードウェア情報が表示されますが、重要なのはNetwork controllerのところ。
$ lspci
:
02:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
03:00.0 Network controller: Realtek Semiconductor Co., Ltd. RTL8821CE 802.11ac PCIe Wireless Network Adapter
:


今回はRTL8821CEを使っているとの事ですが、購入時点ではワイヤレスカードまで調べる事はできないので仕方ありません。 私はLubuntuを使いたいのでLinuxドライバがないか探しました。 見つからなかったらどうしようかと思いましたが、今回は運良く(?)同じワイヤレスカードでハマっている人がたくさん居て情報もたくさんあった上、ドライバを提供してくださっている方が居ました。 感謝しつつこれを使わせて頂きます。


ただこのドライバは内部でDKMSを使っているとの事です。 標準のLubuntuではDKMSが入っていませんから、再びここで困りました。 別環境でdebを作ってインストールしようと思ったら、入れたばかりのLubuntuにはgccすら入っておらず、なんか面倒そうな気配を感じました。 この辺りで諦めの境地に入ってきて、一番安いUSB有線LANアダプタをポチり購入しました。やはりapt-getが使えないと地獄なんだよなあ…。 こういう時のために最低1個はUSB有線LANアダプタは常備しておいたほうが良いかも知れません。 たとえば私は CableCreation のアダプタ を購入しました。

購入したUSB有線アダプタは認識してくれたので、とりあえず有線ならインターネットは使えるようになりました。 ここも認識してくれなかったら手動で依存性解決地獄を乗り越えるしかなかったので、助かった。 まずは速攻でDKMSを入れましょう。
sudo apt-get install dkms

DKMSをインストールした後は、先程のドライバをUSBメモリで送り、Githubの解説に従いつつインストール。 再起動後にきちんとWiFiネットワークに接続できました。


ノートPCが壊れて今回は色々な事をやったのですが、どのマシンでも今までで一番インストールに苦労した気がする。 HDMIが認識しなかったり、GPUの設定でコケまくったりしてました。 何となくの印象ですが、Windows用のドライバしか作らない事でコストカットしてないかなあ。 運用はLinuxじゃないと辛いのだから、そういうの本当に困るし、ハードウェアで躓くのはキツイです。

PlaidML/ROCmは対応ハードに注意

私が普段使ってるDeep LearningのライブラリはKerasなのですが、 今のKerasではGPU処理にCUDAを用いているので、NVIDIAのGPUにしか対応していません。 他のライブラリでも差はあれど今のところは似たような傾向があります。

しかし最近はOpenCLというGPUを含む異種混在環境での標準規格が推進されており、 CUDAは廃れてこちらが主流になるのではないかと思っています。 既にOpenCLに対応したDeep Learning用のライブラリとしてPlaidMLが出てきており、 これを使えばIntel/AMDのGPUも使えるようになってきている。


そんな訳でそろそろ面白いんじゃないかと思って手を出してみたのですが…、甘かった。

私はAMD Radeon Vega 8 Graphicsを動かそうと試してみたのですが、認識しませんでした。 詳しい事はこちらに書きましたが、AMDに関しては購入前からCPU/GPUをきちんと選ばないと動かない事が多そうです。 NVIDIAに関しては純粋に価格帯が高めなので、まともな構成を組もうとすると10万円を軽く超える。 もう少し安く買えたらDeep Learnin専用ノートPCにしようと思ったのですが、まだまだパンピーには早かったようだ…。

PlaidML以外にもドライバ周りからDeep Learningまで総合的にサポートする基盤としてROCmというのもあります。 ただこれも現状では同様にAPUへの対応は弱いし、GPUへの対応も限定的です。 AMD Ryzen 5 2500U / AMD Radeon Vega 8 Graphicsはやはり非対応だったので、これも今回は使えませんでした。 どれも意外と採用条件が厳しいですね。


発展途上だし動かないものは仕方ないのですが、AMDGPU-Pro DriverのせいでOSを何回再インストールしたかわかりません。 AMDのドライバには懲りたので、私はもっと要件の厳しくないライブラリが欲しいです。 でもそれはドライバとの戦いであって、当分は解決されような気もします。 NVIDIAのGPUの価格帯が落ち着いてきたらDeep Learning用マシンを購入したいとは思っているのですが、ドライバ周りも含めて面倒そうな今にわざわざ買う必要はない気もして、ノートPCはひとまずCPUベースで行こうと思いました。 早く廉価なモデルでも気軽にGPGPUできる時代になって欲しいなあ。

LinuxのAPU/GPU周辺は闇

久々にAMDのノートPCを買って気付いたのですが、最近のLinuxのAPU/GPU周りってめちゃくちゃ難しいんですね。 一番クリティカルな部分は、ノートPCでよく使われるAPUはLinuxがサポートしてないところ。

APUへの対応がないと、CPU性能がかなり落ちてしまう。 じゃあAMD APUはLinuxだとただの駄目な子なの?となってしまうのだけど、解決する手段はない事もない。 APUを認識させるためのドライバを用意すれば良いのです。


ただしここで最初の闇です。AMDは純正のAMDGPU-PRO DriverはLinuxに対応していない事が非常に多い。 私はAMD Ryzen 5 2500U / AMD Radeon Vega 8 Graphicsが搭載されたHPのノートPCをLinux化しようとしたのですが、Linuxドライバは非対応でした。

非対応のものにドライバを適用しようとしても、すぐに画面が表示されなくなったり、OSが起動しなくなったりします (闇)。 特に18.04はサポートしてないので間違って入れるとOSが起動しなくなる。 といってサポートのある16.04にしたからといって動く訳でもなく、私は起動後にブラックスクリーンで停止するので、利用は諦めました。


純正ドライバが駄目でもまだ手はあります。それはMesaなどのオープンドライバを利用してハードを認識させる方法です。 Mesaは依存関係が多いので手動インストールは辛そうだけど、PPA経由のapt-getでもインストールできる (下)
sudo add-apt-repository ppa:ubuntu-x-swat/updates
sudo apt update

AMDGPU-Pro Driverでも認識してくれないAMD Ryzen 5 2500UのAPU部分が認識され、mnist_cnn.py の実行時間が10%ほど性能改善していました。 ただもう1つ購入したDELL PCと比較すると、WindowsではCPUスコアに2倍も差がある上に結構なスペック差があるのに (下)、Linuxでの実行時間は25%くらいしか改善してないんですよねえ。 あまり性能を発揮できていないような気はしなくもない (闇)。



今回は運良くAPU部分がほんの少しでも改善できて良かったですが、AMDは購入前に徹底的に調べないと買うの怖いなあと思いました。

低価格PCのコスパが悪くなってる

久々にノートPCが死んで新しいノートPCを買ったのですが、 今って小さくてスペックが良くて安いノートPCがまったくないんですね。 4-5年前に Acer Aspire V5-171-H54C/S が4万円くらいで買えたのに、今5万円以内の小さなノートPCでこれよりスペックが良いものは1つもない。 特にCPUが酷い。 低価格路線のノートPCは下手すれば10年前のノートPCより処理速度が遅いものが普通になってて、全体的に2倍くらい割高の印象があり驚きました。

昔は4-6万円に最もコスパの良いPCが揃っていた気がするのですが、今は6-8万円にそれが移動している。 コスト増加の影響で低価格路線のコスパが悪くなり、今まで若干高めだったところのコスパが良くなったと考えるべきなのか。 それともメモリ/CPU/GPUが割高になっているせいでコスパが最悪になっていると考えるべきなのか。 組立は海外だから後者だとは思うのだけど、いずれにしても良くない傾向です。


メモリ/CPU/GPUが高過ぎて今は高いものを買う気はしないのですが、ノートPCが壊れてしまった以上は買わないといけない。 今回は処理用と作業用で、2台に分けて安物ノートPCを買おうと思っていました。 私は Acer Aspire V5-171-H54C/S と同スペックがあれば作業には困らないので、 そのスペックだけは抑えつつあとは安さだけを追求してDELLの直販モデルを作業用PCとして購入してみました。 キャンペーン中でぴったり4万円なのは良かったけど、到着まで10日待つのは辛かった。何も設定せずベンチマークした結果が以下。



Windowsだと既にIMEの反応が若干悪い気がする…。 不要なサービスを徹底的に切れば2倍は体感性能上げられると思いますが、設定量が多過ぎるので私は速攻でLubuntuに替えました。 なにしろLubuntuは初期状態でのメモリ使用量は300MBもありませんからね。 Lubuntuに替えてからは、普段の作業は非常に快適ですが、Deep LearningやDB処理するとメモリが足りなくて死ぬのが玉に瑕。

2018年12月2日日曜日

Chrome拡張でコピペ禁止を禁止

結構大きなサイトでなぜかコピペが禁止されていて辛みがあり、Chrome拡張でコピペ禁止を禁止する事にしました。 よほど重要なサイトならともかく「なぜここで?」というところはたまにある。

コピペ禁止は例えば以下のような実装パターンがあるけど、JavaScript/CSSの両方を弄らないと対処できない。 以下の4例以外にマウス/タッチイベントをキャプチャするみたいな方法もありそうだけど、実装は見た事がないし作るのは面倒そうなので割愛した。


JavaScriptによるコピペ禁止例

:

JavaScriptによる選択禁止例

:

CSSによる選択禁止例

:

JavaScriptによるキーボード禁止例

:


Chrome拡張での対応は、以前紹介した Minimal User CSS & JavaScript なChrome拡張を作った を拡張する事を前提として話を進める。 ただし "run_at": "document_start" で実行しないといけない点だけは注意して欲しい (参考)。

user.jsに以下を書き加える。
// コピペの禁止を禁止
document.addEventListener('cut', event => event.stopImmediatePropagation(), true);
document.addEventListener('copy', event => event.stopImmediatePropagation(), true);
document.addEventListener('paste', event => event.stopImmediatePropagation(), true);
// 選択の禁止を禁止 (user.cssも変更が必要)
document.addEventListener('selectstart', event => event.stopImmediatePropagation(), true);
// キーボード/マウス/タッチイベントの変更を禁止
// document.addEventListener('keydown', event => event.stopImmediatePropagation(), true);
// document.addEventListener('mousedown', event => event.stopImmediatePropagation(), true);
// document.addEventListener('dragstart', event => event.stopImmediatePropagation(), true);
// document.addEventListener('touchstart', event => event.stopImmediatePropagation(), true);
// document.addEventListener('touchmove', event => event.stopImmediatePropagation(), true);
キーボード/マウス/タッチイベントの変更禁止はリッチUIサイトでは不都合が生じる可能性がある。 普段はこれらをOFFにしておいて、いざ面倒なサイトに遭遇した時だけONにしたほうが良いかも知れない。 逆にサイト管理者がユーザに多少の不都合があったとしてもコピペを禁止したい場合、この辺を弄ると良いと思われる。
その他の指定に関しては常時ONにしておいても良いと思う。 選択の禁止はゲームサイトだと問題になる事はあるかもだけど、せいぜいそれくらいだろう。


user.cssは以下のようにする。
* {
  user-select: auto !important;
  user-drag: auto !important;
}

user-select/user-dragプロパティにはブラウザ特有の値として、-moz-, -webkit-, -khtml-, -ms- などの追加プロパティがある。 様々なブラウザの利用を考えると一番最初に書いたコピペ禁止の実装例のようにすべて指定する必要がある。 ソースを見るのが面倒な人のために書き出すと、以下のように値を指定するべきだ。
-webkit-user-select: text !important;
-webkit-user-drag: auto !important;
:
ただuser-select/user-dragさえ指定しておけばChrome拡張ではきちんと動作する事を確認しているし、 ブラウザ毎に動作が微妙に異なる部分をわざわざ指定するのは面倒なだけだ。 最も簡単な指定さえしておけば (たぶん) 十分だろう。

Chrome拡張で強力なポップアップブロックを作ってみた (3)

HTTPヘッダのContent-Security-Policy (CSP)でもポップアップブロックができる事を知ったので、 その機能を使ってポップアップブロックを作ってみました。 以前作ったもの (下) とほとんど同じ機能がHTTPヘッダでも実現できるんですね。
最低限必要なディレクトリ構造は以下。 以前作ったものに書き加えても良いです。
usercssjs/
  manifest.json
  background.js

manifest.jsonはこんな感じにします。 permissionsとbackgroundが重要で、その他は適当です。
{
  "name": "Minimal User CSS & JavaScript",
  "version": "0.0.1",
  "manifest_version": 2,
  "description": "Minimal User CSS & JavaScript",
  "permissions": ["webRequest", "webRequestBlocking", "<all_urls>"],
  "background": {
    "scripts": ["background.js"]
  }
}

background.jsはこんな感じにします。CSPにある程度の権限を与えつつ、不要な項目を削除します。 使いたい機能を指定可能なオプションと照らし合わてONにすれば良いです。 ポップアップを防ぎたい場合はallow-popups関連を停止すれば十分ですが、allow-same-originも停止させてみました。
chrome.webRequest.onHeadersReceived.addListener(
  function(details) {
    var headers = details.responseHeaders;
    var csp = {
      name: "content-security-policy",
      value: "sandbox allow-scripts allow-forms allow-presentati
on allow-orientation-lock allow-pointer-lock allow-top-navigation"
    };
    headers.push(csp);
    return {responseHeaders: headers}
  }, {
    urls: ["*://www.hoge.com/*"]
  },
  ["blocking", "responseHeaders"]
);

あとはこの拡張を読み込むだけです。chrome://extensions にアクセスし、上部に表示されている「デベロッパーモード」をONにします。 そして「パッケージ化されていない拡張機能を読み込む...」を押して、usercssjsディレクトリを選択すれば完了です。 普通の拡張のようにパッケージ化していないので、Chrome拡張のファイルを編集後に設定をリロードする事ができます。結構便利。


URLを "<all_urls>" にすればすべてのサイトに適用できますが、やはり不都合が出てきます。 なので以前作ったものと使い勝手は変わらないと思う。 ただDOMを編集するよりはこちらのほうが処理が早そうだし、URLを若干だけどパターンマッチしやすくなっている利点はあるかも。

Chrome拡張でContent-Security-Policyを取得できなくなったかも

HTTPヘッダーのContent-Security-Policy (CSP) でsandboxを設定するはたまに行われる。 これをChrome拡張で編集すると色々とページの動作を変えられて、嬉しい事がある。 指定可能なオプションはこことか見やすい

ただ以前はCSPをChrome拡張で取得できたのだけど、たぶんChrome 70からCSPがヘッダー情報として取得できなくなっていた (編集はできる)。 Chrome拡張はたまに細かい動作が変わったりして「???」となる事があるんだけど、今回もその類かも知れない。

以下は動かなくなったものだけど、これは動かないよというのも大切な事なのでメモを残しておく。 以下のサンプルくらいなら、コンテキストメニューを弄るなど、サイト側に影響を与えない別の方法で機能を提供すれば良いとも思う。
chrome.webRequest.onHeadersReceived.addListener(
  function(info) {
    var headers = info.responseHeaders;
    for (var i=headers.length-1; i>=0; --i) {
      var header = headers[i].name.toLowerCase();
      if (header == 'x-content-security-policy' || header == 'content-security-policy') {
        var values = headers[i].value.split(/ *; */);
        for (var j=0; j<values.length; j++) {
          if (values[j].startsWith('sandbox')) {
            values[j] += ' allow-modals';
            headers[i].value = values.join(';');
            break;
          }
        }
        break;
      }
    }
    return {responseHeaders: headers};
  }, {
    urls: ["<all_urls>"]
  },
  ["blocking", "responseHeaders"]
);

上記のようにwebRequestを弄るようなものはmanifest.jsonに以下の記述を加えないと動かない。 さすがにその間違いはしてない。
"permissions": ["webRequest", "webRequestBlocking", "<all_urls>"],
"background": {
  "scripts": ["background.js"]
},

今は駄目でも、気付いたら動くようになってるかも知れない。そういう事もよくある。 ただ直近数日で色々な機能が豪快に挙動が変わったみたいだ。

2018年11月26日月曜日

フリゲ紹介: 戦姫千騎戦記

戦姫千騎戦記はリアルタイムストラテジー風?アクション (作者様紹介)。 主人公のいるヴァーレントゥーガみたいなゲームだと言うとわかりやすいでしょうか。 エスティールの封印の主人公プレイとかも近いかな。



帝国に王国を支配された姫君が、打倒帝国を決意して立ち上がるところから物語は始まります (左下)。 スタート時点では風前の灯火ですが (右下)、領土を徐々に広げていき、最終的に帝国を倒す事を目指します。



ヴァーレントゥーガなどではターン制でユニットを雇用しますが、戦姫千騎戦記ではリアルタイムにユニットを雇用できるのが特徴です。 Aキーで歩兵、Sキーで騎兵といった要領で、キー1つで雇用する事ができるようになっている (左下)。 わちゃわちゃ~とユニットが増えて、なかなか面白いです (右下)。
リアルタイムに資源を確保する事ができるようにもなっていて、 資源をうまく管理しないとクリアが難しいステージも多い。 資源とユニットの2つの調整が面白さにうまく繋がっているゲームだなあと思いました。



リアルタイムで資源管理するゲームは久々に遊んだ気がします。 プレイしていて、STAR BARON というFlashゲームに昔ハマっていた事を、なぜか思い出しました。 リアルタイムの資源管理って面白いですよね。

フリゲ紹介: ガンヴァルケン

ガンヴァルケンは、またたび屋敷さんの投稿で知った作品。重装騎兵ヴァルケンのファンゲーム作品とのことで、全方位アクションに分類されるのかな。



私は重装騎兵ヴァルケンの事も知らなかったのですが、こんな凄い作品が眠っていたんだなあと驚かされました。 しかし凄いクオリティの作品ですねえ。ドットは身を見張るものがある (下)。 SFC世代のロボットアクションゲームらしく難易度は高めの作品と思います。 ロボットらしい重厚な動きをするステージもあれば、シューティングゲームのような軽快な動きのステージもあり、面白い作品になっている。




最初はヴァルケンとナックルの2つだけを装備している自機「GUNVALKEN」を操作していくのですが (左下)、 アイテムを集めると武器の種類が増えたりパワーアップできる仕組みがあるため (右下)、 ただステージをクリアすれば良いという作品にはなっていないように思います。 自機を強化しながら進めないと、結構早い段階でキツくなってくるんじゃないかな。



難易度が高めになっている要因の一つは射角調整が必要な事でしょうね。 移動しながらのショットは思い通りの方向には打てないので、射角調整しながらショットを打たないといけないのですが、 慣れないとそのへんの操作は結構難しい。 私はキーボードで操作していましたが、コントローラを使ってがっつりプレイしたほうが楽かも。


あとこのゲームが凄いのは自機の種類の多さですね。 なんと30種類もある。ヴァルケン愛を感じますね…。 下図は「DOMCOM」と「BLACK」でプレイしてみた時の画像ですが、機体の種類によって難易度がガラッと変わります。



私にはクリアが厳しそうな難易度の作品だったのですが、 全7ステージを途中面からもプレイできるので到達できないステージも雰囲気が楽しめて良かったです。

Yahoo! ジオシティーズのサービス終了でダウンロードできなくなってしまうかも知れませんが、忘れ去られるのはあまりにももったいない作品だと思います。

2018年11月25日日曜日

独自Web検索エンジンまとめ

検索エンジンにも気になるニュースが出てきました。 まだ政府レベルの話のようですが、第三のWeb検索エンジンに陽の目が当たる機運が高まってきているようにも思ったので、久々に様々なWeb検索エンジンを探し、まとめてみました。 ニュースで紹介されていた Qwant も思った通りの検索結果が高速に表示され、なかなか良い感じです。



メジャーなWeb検索エンジンは StatCounter でシェアも詳しく調べられ、 以下のサービスがよく知られています。GooYahoo! のようにバックエンドで他社のWeb検索エンジンを利用しているサービスを除外すると、さほど種類は多くないです。
上記のシェア調査ではヒットしないマイナーなWeb検索エンジンは手作業で調べるしかないですが、 軽く調べて見たところ以下が見つかりました。 ググれば山程見つかるので列挙に留めます。 こちらの中には独自Web検索エンジンではないものもあるかも。 マイナーになるとクロールの量や頻度、他言語対応度が落ちているものが多いですね。 検索エンジンを探すのにもGoogleを使っている訳で、Googleはやはり信頼性があります。 土俵に立つためにはある程度は資金量も必要になってくる。
Yippy は検索結果が充実しているし使いやすく、この中では一番良いかなあ。 2019/01/29: 気付いたらEcosiaも爆速になり検索結果も充実していた。やる気が出てきたのかも?
WolframAlpha は普段の検索にはあまり使えませんが、有名だと思うので一応入れておきました。 Fooooo は動画検索からスタートした日本の検索エンジンですが、独自Web検索かはわかりません。 利用者の4割が海外向けとの事で、伸びているのかも。


世界的にはGoogleが90%以上のシェアを誇っているのは多くの人が知っている事だと思いますが、 仮にEUが中国のようなシェア構成になれば、Googleにとってもさすがに痛いはず。 あとはインドやアフリカ、アジア次第かと思うのですが、そのへんの国々は今のところGoogle頼り。 ただインドはケータイ端末も作ってるおかげで独自Web検索エンジンを作るのは簡単そうだし、Googleも絶対的強者ではないかなとも思う。

検索エンジンが再び戦国時代になると、面白い時代になりそうですね。

2018年11月13日火曜日

dpkgやapt-getで依存関係のエラーが出た時の対処法

wineで久々に依存関係でハマりました。 わかりやすい事例だったのでdpkgやapt-get関連でエラーが出た時の対処法をまとめてみます。

まず以下のようなエラーが出ている状況を想定します。実際に出て困った訳ですけど。
$ sudo apt-get install wine-stable
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
wine-stable はすでに最新バージョン (3.0-1ubuntu1) です。
これらを直すためには 'apt --fix-broken install' を実行する必要があるかもしれません。
以下のパッケージには満たせない依存関係があります:
 wine32:i386 : 依存: libwine:i386 (= 3.0-1ubuntu1) しかし、インストールされようとしていません
 wine64 : 依存: libwine (= 3.0-1ubuntu1) しかし、インストールされようとしていません
E: 未解決の依存関係です。'apt --fix-broken install' を実行してみてください (または解法を明示してください)。

エラーが出たら最初は説明通りに以下のコマンドを打ってみましょう。
$ sudo apt --fix-broken install
長いので省略
:
処理中にエラーが発生しました:
 /var/cache/apt/archives/libwine_3.0-1ubuntu1_amd64.deb
 /var/cache/apt/archives/libwine_3.0-1ubuntu1_i386.deb
 /var/cache/apt/archives/fonts-wine_3.0-1ubuntu1_all.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

たいていは上記のコマンドで解決するのですが、今回は解決しませんでした。 そういう時は以下のコマンドで問題を探ると良いです。wine* の3つが設定不足で悪さをしているらしい。
$ sudo dpkg --audit
以下のパッケージは展開されましたが、まだ設定されていません。
これらのパッケージが正常に動作するためには、dpkg --configure か
dselect の設定 (configure) メニューオプションを使って設定を完了
させなければなりません:
 wine-stable          Windows API implementation - standard suite
 wine32:i386          Windows API implementation - 32-bit binary loader
 wine64               Windows API implementation - 64-bit binary loader

以下のパッケージはトリガされましたが、トリガ処理はまだ完了していません。
トリガ処理は dselect または dpkg --configure --pending (あるいは dpkg
--triggers-only) の利用で要求できます。
 hicolor-icon-theme   default fallback theme for FreeDesktop.org icon themes
 libc-bin             GNU C Library: Binaries
 man-db               on-line manual pager

説明に従って dpkg --configure を実行して設定を試みてみましょう。
$ sudo dpkg --configure -a
dpkg: 依存関係の問題により wine32:i386 の設定ができません:
 wine32:i386 は以下に依存 (depends) します: libwine (= 3.0-1ubuntu1) ...しかし:
  パッケージ libwine:i386 はまだインストールされていません。

dpkg: パッケージ wine32:i386 の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
libc-bin (2.27-3ubuntu1) のトリガを処理しています ...
dpkg: 依存関係の問題により wine64 の設定ができません:
 wine64 は以下に依存 (depends) します: libwine (= 3.0-1ubuntu1) ...しかし:
  パッケージ libwine:amd64 はまだインストールされていません。

dpkg: パッケージ wine64 の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...
dpkg: 依存関係の問題により wine-stable の設定ができません:
 wine-stable は以下に依存 (depends) します: wine64 (>= 3.0-1ubuntu1) | wine32 (>= 3.0-1ubuntu1) ...しかし:
  パッケージ wine64 はまだ設定されていません。
  パッケージ wine32:i386 はまだ設定されていません。
 wine-stable は以下に依存 (depends) します: wine64 (<< 3.0-1ubuntu1.1~) | wine32 (<< 3.0-1ubuntu1.1~) ...しかし:
  パッケージ wine64 はまだ設定されていません。
  パッケージ wine32:i386 はまだ設定されていません。

dpkg: パッケージ wine-stable の処理中にエラーが発生しました (--configure):
 依存関係の問題 - 設定を見送ります
処理中にエラーが発生しました:
 wine32:i386
 wine64
 wine-stable

上記のコマンドで直る時も多いのですが、今回はこれまた駄目。 このままだと apt-get upgrade もできないので、以下のコマンドで壊れているパッケージを取り除いてしまいましょう。
$ sudo dpkg --remove --force-remove-reinstreq wine32:ie86
dpkg: 警告: インストールされていない wine-i386 を削除する要求を無視します
$ sudo dpkg --remove --force-remove-reinstreq wine64
dpkg: 警告: インストールされていない wine-64 を削除する要求を無視します
$ sudo dpkg --remove --force-remove-reinstreq wine-stable
(データベースを読み込んでいます ... 現在 539892 個のファイルとディレクトリがインストールされています。)
wine-stable (3.0-1ubuntu1) を削除しています ...
man-db (2.8.3-2ubuntu0.1) のトリガを処理しています ...
hicolor-icon-theme (0.17-2) のトリガを処理しています ...

警告が出てるけど特に問題はないです。私の環境ではこれで依存関係のエラーは消えました。 解決に少し時間を取られたので、今後はこの手順でやっていこうと思います。

参考文献:

2018年11月11日日曜日

Linuxコマンドの改良/高速化ツールまとめ

様々なLinuxコマンドの改良/高速化ツールが普及してきたので、軽くまとめてみました。

新しい機能を登録するようなものは awesome-cli-apps (例: その1その2) とか、awesome-shell で検索したほうが良いので、 Linuxに最初から入っているような有名なコマンドを改良/高速化するものだけ。 限定したほうが見やすいと思ったので作ってみました。

改良系ツール


実際に使っているものはさほど多くないんですが、fzf, lazygit, tokei, archiver, mmv あたりは私でも使用頻度の高いツールで、便利だと感じています。


高速化ツール


grepの高速化は様々な代替ツールがありますが、特に早そうなものの紹介に留めておきました。 逆に並列ダウンローダーはどれが一番良いのかは何とも言えないところ。

2018年11月6日火曜日

軽量爆速ターミナルAlacritty

軽量爆速ターミナルとして有名なAlacrittyを使い始めました。



主な特徴は以下。
  • Rust製でGPUによる高速レンダリング
  • Linux/Macで利用できる (将来的にはWindowsも対応予定)
  • メモリ使用量も少ない

レンダリングは謳い文句通り高速だし、メモリ使用量も少ない。 これまでxfce4-terminalのメモリ使用量が36.4MBで、即座に使えるターミナルとしては最軽量と思っていたのですが、 Alacrittyはそれより少なく31.1MBでした。 今後の機能拡張でどうなるかはわかりませんが軽量なターミナルである事は間違いなさそう。
GPU高速化ターミナルは他にもいくつかあるけど、Alacrittyはalpha版とは言え完成度が突出している。 既に常用していますが特に問題らしい問題も見つからず、既に実用レベルにあるターミナルだと思う。


インストールが簡単なのも良かった。 コンパイルに時間は掛かるもののGithubに書かれている通りの3-4stepでインストールが完了した。 Ubuntuでの唯一の注意点は、apt-getで入れたRustでは古くてビルドに失敗するという点。 rustupから最新のRustとcargoをインストールする必要がある。

インストール直後からカラフルで十分使いやすいけど、細かなところでは多少使いにくいところはある。 例えばキーバインド。~/.config/alacritty/alacritty.yml に以下を追加してCtrl-C、Ctrl-Vでコピペするようにだけ設定しました。 欲を言えばもう少しマウスをデフォルトで設定して欲しい。
- { key: V, mods: Control, action: Paste }
- { key: C, mods: Control, action: Copy  }

上記のように設定はすべてYAMLで編集するので、配色の設定もそのままでは大変です。 最近のターミナルは配色を自由に選択できる事が当たり前になっているので、 何か良い方法はないかと探していたら、Base16 (紹介記事) という様々なアプリの配色を簡単に変えるツールがありました。 これを利用すると簡単に配色が変えられるので、併用をおすすめします。

2018年11月2日金曜日

様々なアプリの配色を簡単に変えるBase16プロジェクト

様々なアプリの配色を簡単に変えるBase16というプロジェクトがある事を知りました。 配色が用意されているだけで手作業でコピーするのかと思ったらそうではなく、とても便利なツールでした。

Base16のページは関連リポジトリが多く最初に何をすれば良いかわかりにくいですが、 とりあえずbase16-managerbase16-shell-previewの2つをインストールすると良いと思う。
まずbase16-managerを使うと以下ができるようになります。
base16-manager install [repository]  # アプリ毎に配色をダウンロード
base16-manager update                # 配色を一括更新
base16-manager set [colorscheme]     # 登録済みのアプリの配色を一括変更
様々なアプリの配色を一括管理できるようになるのは便利ですね。 ただ base16-manager set [colorscheme] は現状では対応しているアプリが少なく、非対応アプリはスクリプトを追記する必要があるので注意が必要です。 またこのコマンドで配色を一括変更できるとは言っても、配色の数が多過ぎて名前入力が困難だと思う。


そこでbase16-shell-previewを利用します。 base16-shell-previewを使うと配色をプレビューしながら、その変更を適用できます (下図)。



base16-shell-previewのインストールに関して念のため補足しておくと、内部でbase16-shellの設定ファイルを内部で使っているので、以下のコマンドで先にインストールする必要があります。
base16-manager install chriskempson/base16-shell


base16-shell-previewでvimとターミナルの設定を一度に同じ配色に変更できると、 以前書いたvimの配色自動変更も捗りそうなどと私は思ったのですが、そこまで単純ではなかった。 vimはみんなが頑張って書いたくれた配色のほうがずっと見やすいので、Base16の配色だとちょっと物足りない感じがする。 なので私は今のところvimのカラースキームにはBase16は使ってません。

しかしターミナルの配色はどれも綺麗で使いやすいです。 ターミナルの配色変更には有用なツールなので、そちら方面では今後も使っていきたいです。

2018年11月1日木曜日

ついにTPPが発効決定

TPPは日本が推進していた経済連携協定ですが、2018-12-30についに発効されるそうです。 RCEPより先に結果を出したのは、昨今の情勢の中、大きな話だと思います。 既に日本、メキシコ、シンガポール、ニュージーランド、カナダは国内手続きを終えており、ベトナム、ペルー、チリ、ブルネイ、マレーシアが11月中旬までに議会の承認を終える見通しになっているようです。

タイフィリピンインドネシア台湾コロンビアイギリスといった国も貿易戦争を境目に参加表明をしており、 今は11カ国の参加ですが将来的にはもっと増えるかも知れません。 米国がTPPから脱退し、中国と貿易戦争をし始めた事によって、 自由貿易を求める各国の利害が一致し、むしろ存在価値が高まったとも思えます。


ところでTPPのような連携協定/組織は、アジア圏にASEAN、APEC、RCEPなどがあるのですが、 参加国の違い以外で一体何が違うのでしょうか。大まかには以下になると思ってます。
  • TPP: 日本主導、自由貿易協定
  • RCEP: 中国主導、自由貿易協定
  • ASEAN: ゆるい協力関係
  • APEC: ゆるい協力組織


TPPとRCEPはどちらも自由貿易協定でよく似た話だったので、 中国に先んじる事ができたのは大きいのではないでしょうか。

ではTPPとRCEPの主導国以外のもっと詳細な部分での違いは何でしょう。 私は専門家ではないので国際貿易投資研究所の記事を参照したのですが、 TPPには政府調達=公共事業の入札の自由化や、環境問題や労働問題に対する取り決めが含まれている一方、RCEPにはそれがないという違いがあるようです。 他にも知財の扱いには結構な差がありそうなのですが、あまり正確にはわかってないです。 ただ「TPP 知財戦争の始まり」という本もありますし、模倣品被害に合いやすい日本では重要な事かも知れません。同日に無印良品が中国でパクられ賠償金まで取られるというニュースがありましたが、こういう事が減るのではないでしょうか。 他にも気付いたら追記していきたいと思います。


公共事業にも一定の競争力が働くのは、面白い条約かも知れません。 労働に関しては、日本人に取ってみれば差別撤廃の採用・維持などは当然考慮する必要があるし、 それを主張される側になる事は認識しないといけなそうです。

TPPの発効が決定した事によって、日本は自由貿易国である事を再認識させられましたが、 自由化に伴って私は移民を含めた労働面での自由化が進む気がしました。 既に働き方改革や移民政策が進められていますが、 今後はますますその変化にも耐えられる事業をする必要があると思う。

2018年10月30日火曜日

Chrome拡張でクリックイベントを完全に止める

クリックイベントにcookieを付けて必ず広告を表示させてくるケースを見かけるようになった。
iframeを使うクリックジャッキングなら様々な防ぎ方があるけど、 そういった方法では防ぐ事ができないポップアップだし、何よりやられると鬱陶しさが半端じゃない。

この問題は、Chrome拡張なら以下のように設定する事で防げる。 要約すると、このコードの宣言以降はクリックイベントの上書きを禁止する命令です。 Chrome拡張を "run_at": "document_start" で実行すれば鬱陶しいクリックイベントを仕込んでくる処理を無効化できる。
if (location.host == "www.hoge.com") {
  document.addEventListener('click', event => event.stopImmediatePropagation(), true);
  document.addEventListener('mousedown', event => event.stopImmediatePropagation(), true);
  document.addEventListener('touchend', event => event.stopImmediatePropagation(), true);
  document.addEventListener('touchstart', event => event.stopImmediatePropagation(), true);
}

全サイトに適用すると便利な機能まで削除してしまうので、 本当に鬱陶しいサイトだけにしましょう。

2018年10月29日月曜日

Googleアプリ有料化から見える変化の兆し

IT/AIの時代も大きく動いている感じがする。 例を挙げればキリがないけど、以下はかなりわかりやすいし大きなニュースだと思いました。
このニュースに伴って、Googleアプリを載せる場合にはライセンス料を付ける方針が伝えられ、欧州ではやはり端末価格が上がっていく事になりそうです。 一見は自爆ですが、利点もある。

まずはGoogle一強の防止。 Google Maps、Gmail, YouTube、PlayStoreが有料になったとして、マップは様々な代替があります。 メールもLINEに代表されるチャットツールの浸透によって様々な余地ができている。 YouTubeには代替になり得るものはない気がするけど、だからあえて盛り込んだ感じなのかな。 長期的には権力の分散効果はありそうです。
ただPlayStoreは問題です。これがないとアプリのインストールさえできません。 野良ストアが流行すれば確かに競合になり得ますが、どうなっていくか何とも言えない。 現時点では一強を防いだとしても不都合があまりにも大きい。


なのでPlayStoreに関してはもう1つの利点で考える事のほうが簡単だと思う。 それは欧州が課税面での恩恵が得られるという事です。 米国系IT企業はどこの国で稼いでいるかが曖昧である事を利用して課税逃れをしているとよく言われますが、その対策になる。 以前からデジタル税で売上に課税をする事でそれを防止しようとしていましたし、 端末にPlayStoreを組み込んでいる事を明確化させる事で、 その売上が欧州向けに発売されたものである事が明確になります。 地域端末に関連する売上にデジタル税で課税をすれば、課税逃れが結構難しくなると思う。

似たような事は韓国でも進められていますが、 このような課税の厳格化は、国家の利益を守る意味では非常に重要です。 ただ実際どれくらい課税逃れがあるかはよくわからないし、欧州の目論見通りに進むかはまだ不透明です。 でも利益のほうが大きいと試算したから課税したんじゃないかな。 などと思惑を巡らせていたらイギリスもデジタル税をプッシュして来ました他国も追随しつつあるようです。 たった1ヶ月でこの速度、どの国も凄い迅速だなあ。


このような課税の変化は端末競争の在り方にはかなり影響があり、結構大きな変化を生むように思います。 既に通貨危機や貿易戦争によって世界と米国の不和が強まり、ロシアや中国、中東は米国から離れつつあります。 欧州も間接的にですが、関税の流れができた事になります。 この感じだとさらに新しい流れも出てくるかも。

例えばサウジに関する一連の報道対米投資規制が強まっている事なども、かなり近い分野の話なので嫌な感じですね。 他にもIBMがLinuxのRed Hatを340億ドルで買収などもレイヤが多少違うもののクラウドとOSが絡む大きな話。 仮想端末として見れば端末に食い込む余地も大きいプレイヤーなので、もしかすると。 今思えばMicrosoftがLinux保護のために6万件の特許を無料開放した事も、流れを加速させる一因になっていそうです。 着々と全体に波が波及しているように思う。

このような変化の中、あくまで最終的な流れとして純粋な効率面だけを考えれば、 端末の在り方は大きく変わっていく事は想像でき、 状況次第では他国で製造するほうがずっと安くなる可能性はあるように思います。

2018年10月27日土曜日

Pixel 3はAIの未来を占う試金石

iPhone XR/XS/XS MaxPixel 3/3 XLが日本で発売される事になりました。



iPhoneは749〜1499ドルで、日本では84,800円〜。スペック的には素晴らしいようですが、ソフトは2-3年前から頭打ちしている。 本来なら中韓の設備投資でDRAM価格が下がって多少は値頃感が出るかなとも思っていたのですが、 貿易戦争もあってか価格は上昇した感じ。 とにかく高スペックを求める人には良さそうだけど、以前から少し高めではある。


一方のPixel 3は799〜1099ドルで、日本では95,000円〜。 安ければ良いなという淡い期待があったのですが、それは夢と消えました。 ただ記事を見ていると非常に面白い端末で、Googleでなければ作れないようなAI機能を盛り込んだ端末になっている。 良くも悪くもPixel 3は今後のAIの未来を占う試金石のような製品ですね。 AI大好きな人には面白い端末だと思う。

ただ画像翻訳はアプリでも提供されてますし。カメラは凄いけど使うかな。 ファッションアイテムの画像検索もGogglesから派生したGoogleレンズですよね。 Call ScreenやDuplex、迷惑電話のAIによる撃退なども面白いけど絶対必要というものではないし。 リアルタイム翻訳は凄いし欲しい人も多いと思うけど、これもGoogle翻訳が凄いのであって、Pixel 3が凄いのとはまた違う。 同じスペックで半額の端末もあるし、まさにキャッチフレーズから「AIを買うかどうか」になってると思うのです。

多くの人にとって「AIを買う」判断はどのようにするものなんでしょうね。 私だったら未来の大きさというのが1つの尺度かなあ。 ノートPCが10万円くらいして今よりずっと高かった時代でも、それによって買えた未来は大きかった。 6万円で買えた初代iPhoneや、初代Androidと比較してどうか。 今4万円で買えるPCの未来より、10万円で買えるPixel 3の未来は大きいだろうか。 2〜3万円で買える中古スマホと比較してどうか。とか。 日本人より新興国の方がどう感じるのかが気になるなあ。


Pixel 3の売れ行きがどうなるかは割と気になります。 「面白いと欲しいはまた違う」となるのか、やっぱAI凄いとなるのか。 米国の物価とインフレに世界は合わせていけるのかという良い判断材料にもなりそう。 iPhoneの値段は初期型が599ドルですから、そこに 1.02^11 (インフレ率) を掛けると744ドルなんですよね。 アメリカの方にとってはiPhoneの価格の肌感覚は変わってないですが、日本人からすると結構な差に見える。

ガラケが付属機能を付けるのに躍起になっていた時代があるけど、結局はiPhoneに駆逐されたようにならないか。 と言って当時のiPhoneのような先端的端末が今後作れるのかというと、そこも難しいところがあるので、PCのほうが参考になるのかも知れない。 PCは先進的な機能が結局生まれず、廉価端末として定着しました。 ガラケ時代にはiPhoneが成功する事は多くの人が予想できたと思いますが、AIは成功するでしょうか。


Pixel 3が成功ならGoogleの描く世界、失敗なら安きに流れる時代が加速していくだろうと私は思います。 貿易戦争の前なら私は後者だろうと思っていて、その主役は中国だろうとは思っていましたし、 実際にHuaweiは後一歩のところまで来ていた。 しかし知財で徹底的に叩かれ始めた中国が、覇権を取るのはかなり遠くなった。 スパイウェアまみれになるよりは良いかも知れないけど、 知財をまともにして売ってくれる道も残っていると助かる。別に中国である必要はないけども。

2018年10月17日水曜日

フリゲ紹介: シューティングスターセブン

シューティングスターセブンは3人の主人公を操作してプレイする爽快アクションゲーム。 ゲーム自体は英語ですが、日本語で紹介されてますし、それほど英語は出てこないので大丈夫です。



作者様が紹介動画も公開されているのでそちらを見ると雰囲気がわかるかも。




これはなかなか凄いアクションゲームです。 ぬるぬる動くし、必殺技があったり、その見せ方も細かなところまで凝ってるし、背景も凄い作り込み。 そして何より爽快感抜群だし、主人公の1人のアミィはアクションが格好良い (左下)。 操作方法もプレイ中に提示してくれるので操作に困る事もない (右下)。 凄く気持ち良くプレイできる作品だと思います。



1面でアミィ、2〜3面ではベティ (左下)、セシリィ (右下) の3人をプレイできます。 アミィは銃器、ベティは重火器、セシリィは超能力を操っており、まったく操作性が異なります。 最初プレイした時は3面のセシリィの癖が強くて難しかった。 ちゃんと説明されているのですが、相手の攻撃をシールドで防ぐとチャージできる事に気付かないと厳しい。 気付いてからはサクサクプレイできました。ゲームバランスも素晴らしい。



4面以降は3人が協力し合ったりして (下)、3面までとはまた違った面白さ。どこまでもよく考えられた作品だと思う。 EASYでも歯ごたえはあったけど、何回かコンティニューしていればクリアまではしっかり辿り着けるくらいの難易度でした。 アクションがそこまで得意な人ではなくても楽しめると思います。 上手い人ならHARDでもいけるのかな、私にはちょっと厳しそうだった。



非常に面白い作品でした。おすすめ。

フリゲ紹介: 妖精とゴーレム

妖精とゴーレムはマウスとキーボードを使って、二人の妖精をそれぞれ操作し、ゴーレムを引っ張る新感覚アクションゲームです。



妖精のリタとシラハがスケルトンっぽいホネに襲われるところから物語は始まります (左下)。 近くで寝ていたゴーレムを使ってホネを撃退しようとするリタ。 「妖精がどうやってゴーレムを動かすの?」と疑問に感じると思いますが、フェアリーロープという凄いロープを使います。 マウスで妖精1、キーボードで妖精2を操作し、輪ゴムを飛ばすイメージでゴーレムを飛ばす事ができる (右下)。 図では黄色の点線がフェアリーロープですが、何となくわかるかな。
マウスを使うゲームってどうしても操作性が悪くなりがちですが、 妖精がゴーレムを動かすなんて難しくて当然だし、でもその割には思い通りに動いてくれる。楽しい。



ステージはかなり多くて実は歯ごたえのある作品。左下のマップのの5-6倍くらいステージあります。 ステージの難易度も自由に変えられるのでアクションが苦手な人でも大丈夫。 ステージごとにクリア条件が異なっているので、そのへんも飽きが来ないように配慮されている。
仲間の妖精もどんどん増えます (右下)。 妖精はそれぞれ能力がまったく異なるので、その能力をうまく活かさないとクリアが難しいステージもある。



シンプルだけど凄く面白い作品だと思いました。

2018年10月11日木曜日

vimの配色を起動時刻ごとにランダムに変える

普段エディタで黒系の配色を使っていて、 晴れの日に外でコーディングすると画面が明るいせいで見にくくなったりする事があります。 で、設定を変える訳ですが、帰ってくるとまた黒配色に戻さないといけない。 最近のエディタはカラースキームが用意されているので切り替えは昔より簡単にはなっているのですが、 もっと簡単にできないかなあと思いました。

vimだとこの問題は簡単に対応できそうだったので、 少し問題を簡単にして、起動時刻で配色を変えられるスクリプトを書いてみました。 配色の設定を変える事自体も簡単になっています。 まず以下のコードを ~/bin/cvim などの実行しやすい環境に配置します。
#!/usr/bin/env python

import os, sys, datetime, argparse, subprocess, random

# config
light_500   = 'solarized,gruvbox,seoul256,hybrid,PaperColor'.split(',')
light_other = 'github,schellar,newspaper,kalisi,pencil,tender'.split(',')
dark_500   = 'solarized,gruvbox,molokai,onedark,jellybeans,hybrid,badwolf,seoul256,monokai,zenburn,iceberg,PaperColor,nord'.split(',')
dark_other = 'frictionless,wasabi256,tender,apprentice,alduin,kalisi,antares,nefertiti,moonshine'.split(',')
light = light_500 + light_other
dark = dark_500 + dark_other

filepath = os.environ['HOME'] + '/.vimrc.colorscheme'


parser = argparse.ArgumentParser(description='color changer for vim')
parser.add_argument('-d', '--dark',  action='store_true', help='use dark theme')
parser.add_argument('-l', '--light', action='store_true', help='use light theme')
(args, vim_args) = parser.parse_known_args()


background = colorscheme = None
hour = datetime.datetime.now().hour
if args.light == True:
    background = 'light'
    colorscheme = random.choice(light)
elif args.dark == True:
    background = 'dark'
    colorscheme = random.choice(dark)
elif hour < 7 or 17 < hour:
    background = 'dark'
    colorscheme = random.choice(dark)
else:
    background = 'light'
    colorscheme = random.choice(light)
with open(filepath, 'w') as f:
    f.write('set background=%s\n' % background)
    f.write('colorscheme %s' % colorscheme)

vim_args = ' '.join(vim_args)
subprocess.call('nvim %s' % vim_args, shell=True)

上記のコードではGithubで500以上のスターを貰っているカラースキームと、ここで紹介されているものを片っ端から登録してみました。今回はvimでこれらのカラースキームを事前に読み込んでおく事を想定しています。 この設定は面倒だと思うので、Shougo/dein.vimを使った設定例を表示しておくと以下になります。
"--- 500 fav
call dein#add('altercation/vim-colors-solarized')
call dein#add('morhetz/gruvbox')
call dein#add('tomasr/molokai')
call dein#add('joshdick/onedark.vim')
call dein#add('nanotech/jellybeans.vim')
call dein#add('w0ng/vim-hybrid')
call dein#add('sjl/badwolf')
call dein#add('junegunn/seoul256.vim')
call dein#add('sickill/vim-monokai')
call dein#add('jnurmine/Zenburn')
call dein#add('cocopon/iceberg.vim')
call dein#add('NLKNguyen/papercolor-theme')
call dein#add('arcticicestudio/nord-vim')
"--- dark & light
call dein#add('freeo/vim-kalisi')
"--- dark
call dein#add('0xcharly/vim-frictionless')
call dein#add('thomd/vim-wasabi-colorscheme')
call dein#add('AlessandroYorba/Alduin')
call dein#add('romainl/Apprentice')
call dein#add('jacoborus/tender.vim')
call dein#add('Haron-Prime/Antares')
call dein#add('jeetsukumaran/vim-nefertiti')
call dein#add('KKPMW/moonshine-vim')
"--- light
call dein#add('endel/vim-github-colorscheme')
call dein#add('igungor/schellar')
call dein#add('vim-scripts/newspaper.vim')
call dein#add('reedes/vim-colors-pencil')


さらに ~/.vimrc や ~/.config/nvim/init.vim で背景色とカラースキームを指定をしている箇所を以下のように書き換え、カラースキームの設定を別のファイルから読み込むようにします。
" 時刻で表示を変える
execute ':source ' . '~/.vimrc.colorscheme'

あとは以下のように普段vimを使う時と同様に実行すればカラフルなvimの出来上がり。 -l, -dオプションを付けると黒配色と白配色を明示したりもできる。
cvim foobar.txt
cvim -d dark.feel

今のところ夜中に実行すると黒配色、日中に実行すると白配色で表示します。 表示はカラースキームのリストの中からランダムに選びます。 照明や屋内外の判定を頑張れば面白いかもですが、そこまでのやる気はなかった。 起動する度に表示が変わり新鮮な気持ちでvimれるようになったので、これだけでも満足してます。

2018年10月8日月曜日

bashで編集可能な補完を実現する方法

fzfを使った時にCtrl-Tなどのキーバインドで「編集可能な補完」を実現している方法がわからなかったので調べてみました。 ~/.fzf/shell/key-bindings.bash を読むと重要なのは以下。

fzf-file-widget() {
  if __fzf_use_tmux__; then
    __fzf_select_tmux__
  else
    local selected="$(__fzf_select__)"
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
  fi
}
bind -x '"\C-t": "fzf-file-widget"'

bindコマンドでCtrl-Tでfzf-file-widget関数を呼び出しているけど、 内部では__fzf_select__、ようするにfzfを起動して選択パスをselectedに保存している。 その後READLINE_LINEとREADLINE_POINTを設定する事で、編集可能な文字列の入力を実現しているようです。

このREADLINE_LINEとREADLINE_POINTの仕組みは覚えておくと結構便利そうですね。 しかしbashの公式リファレンス見てもサラッとしか書いてない。 おそらくここが最も詳しく説明しているページなので、そちらを読んだほうが良いけど、軽くまとめると以下のようになっている。
# 出力文字列の設定
READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
       # 先頭からカーソル位置までの現在の文字列 | 選択文字 | カーソル位置より後ろの現在の文字列

# カーソル位置の設定
READLINE_POINT=$(( READLINE_POINT + ${#selected} ))


ところでこの機能についての補足ですが、fzfではbash3以前では別の方法で実現しており、そちらについては割愛してます。 またzshやfishだとまた違った方法で実現するしかないようで、あまり深みにハマらないほうが良いかも知れません。 シェルスクリプトの種類ごとに実装が異なるという事は、有名ではないシェルだと編集可能な補完がそもそもできない可能性もあるかも知れない。


応用してみます。
コマンドを補完してアプリを選択し、引数を付けて実行しやすくしてみましょう。
__launch() {
    local selected="$(compgen -ac | FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse $FZF_DEFAULT_OPTS $FZF_CTRL_T_OPTS" fzf) "
    READLINE_LINE="${READLINE_LINE:0:$READLINE_POINT}$selected${READLINE_LINE:$READLINE_POINT}"
    READLINE_POINT=$(( READLINE_POINT + ${#selected} ))
}
bind -x '"\C-j": "__launch"'

上記を~/.bashrcなどに記述すると、fzfを利用してCtrl-Jで実行ファイルの入力補完ができ、補完後に実行オプションを再編集できます。

2018年10月1日月曜日

peco/fzfを使って軽量ランチャーを作ってみた

常駐なしでコマンドをpeco/fzfで部分一致検索できる軽量ランチャーを作ってみた。

これまでAlbertランチャーを使っていたのだけど常駐する必要もない気がしてきて、何となくランチャーを作ってみたら一瞬で作れてしまった。 似たようなコンセプトでRofiという良い感じのランチャーもあるのだけど、作ってしまったものは仕方ないので紹介してみる。

peco/fzfとRofiそのものの最大の違いは執筆時点では複数選択できるかどうかと思うけど、ランチャーでは複数選択する必要性があまりないので、正直Rofiでも良かったかも知れない。 まあRofiよりWindowsに応用しやすい点は利点かなあ。


作り方: まず以下のコードを ~/bin/launch などの実行しやすいディレクトリに配置する。 launchコマンドを実行するとpeco/fzfを使ってコマンドを検索、実行できる。
特に複雑な事は何もしていないけど、コマンドのリストをキャッシュして高速化している。 apt-getなどでコマンドをインストールしてキャッシュを更新したい場合は launch update で更新できる。 何もしないでも1日間隔でキャッシュは更新する。
#!/usr/bin/env ruby

update_freq = 24 * 60 * 60  # 1day
cache = ENV['HOME'] + '/bin/launch.lst'

def update(filepath)
  t = Time.now
  open(filepath, 'w') {|f|
    f.write `bash -ic "compgen -ac"`
  }
  puts "cache are updated! (#{Time.now - t}sec.)"
end


if ARGV[0] == 'update'
  update(cache)
  exit
elsif !File.exist?(cache)
  update(cache)
elsif File.ctime(cache) + update_freq < Time.now()
  update(cache)
end

# app = `cat #{cache} | peco --select-1`
app = `cat #{cache} | fzf --select-1`
`lnch #{app}`

最終行のlnchコマンドは存在しないため、次にこのコマンドを ~/bin/lnch などのパスが通ったディレクトリに登録する必要がある。 lnchコマンドは外部コマンドを実行する時に子プロセスを停止しないような実行を行う。 RubyやPythonではたぶんこれができない。 なので仕方なく以下のようなコードをGo言語で書いてビルドする必要がある。 実はこのテクニック、このサイトで紹介されていたもの。この方もfzfをランチャー化したいという事で、よく似た事をやっている。
package main
import (
  "fmt"
  "log"
  "os"
  "os/exec"
  "syscall"
)

func main() {
  if len(os.Args) <= 1 {
    fmt.Println("Usage: lnch  ")
    os.Exit(1)
  }
  cmd := exec.Command(os.Args[1], os.Args[2:]...)

  // this is the important part to avoid killing the child process instantly
  cmd.SysProcAttr = &syscall.SysProcAttr{Setpgid: true}

  err := cmd.Start()
  if err != nil {
    log.Fatal(err)
  }
}

あとは何らかの方法でlaunchコマンドをGUI呼び出しすればランチャーになる。 実はこれ、xfce4-terminalを使うと秒速で完成する。 xfce4-terminalには様々なウィンドウオプションがあるので簡単に格好良い表示ができる。 例えば以下のような感じで呼び出す。
xfce4-terminal --drop-down \
--hide-menubar --hide-borders --hide-toolbar --hide-scrollbar \
-x launch

あとはこれを何らかの方法でキーボード呼び出しすれば、キーボードランチャーの完成となります。 Lubuntuなら ~/.config/openbox/lubuntu-rc.xml でキーバインドを設定できるので、 以下をkeybindタグがある辺りに追加すると、Win+Spaceでランチャーを起動できる。 設定は openbox --reconfigure で反映できます。
<keybind key="W-space">
  <action name="Execute">
    <command>xfce4-terminal --drop-down --hide-menubar --hide-borders --hide-toolbar --hide-scrollbar -e "bash -ic launch"</command>
  </action>
</keybind>

実行画面は以下のような感じ。キャッシュを利用すれば起動時のラグはほぼゼロでストレスもない。



現時点で作り込みの甘さからRofiに劣っているところは、過去の起動履歴から検索候補順を並び替えたりしていないところ。でもそれくらいかなあ。たった数十行でそれくらいしか課題がないなら結構凄いかなと。 xfce4-terminalを応用すると誰でも簡単にドロップダウンメニューを作れるので、ランチャー以外にも応用できそう。