latest log

酩酊状態で書いたエンジニアポエムです。酩酊状態で読んでください。

GamePad.js で PS4 のコントローラーをサポートしました

今日は GamePad.jsのお話です。

PS4 の隣は NexusPlayer のパッド(ASUS GamePad)です。

ForceClick.js disable the force click in link navigation of iPhone 6s. (リンクの先読み機能を無効化)

ForceClick.js は force click によるリンクの先読み機能を無効化するライブラリです。

iPhone 6s Safari<a href="..."> をクリックすると、3通りのアクションが発生することはご存知でしょうか?

  1. 軽くタッチすると、リンクを現在のタブで開く (open link)
  2. 長めにタッチすると、コンテキストメニューが開く (longpress, open contextmenu)
  3. 強く押すとモーダルダイアログが開き、リンク先のページをプレビュー (force click on link navigation)

3番目の機能は iPhone 6s で新たに追加された機能です

普段使いには便利な機能なのですが、問題を誘発するケースがいくつか見つかっています。

WebGame における問題

「レイドボスと戦う!」と書かれたボタン状のリンクがあり、リンク先が戦闘画面だとしましょう。

そのような状況でリンクを強くクリックするとプレビュー画面上で戦闘が始まります。
そして指を離すと、すぐに終了してしまいます。

この場合サーバには「ユーザは行動した(行動力を消費した)。レイドボスとの戦闘は終了(中断)した。報酬なし」と記録されます。
ユーザは戦闘を離脱した自覚も持てず「なんだこのク◯ゲーは!!」となります。

軽い興奮状態にあるユーザは "ボタンを強く押してしまう" 前提でUI/UXを考える必要がありますが、防ぎようがありません。

許諾や支払いを行う画面における問題

リンク先がYES/NOなどの選択肢を含む確認画面だとしましょう。

そのような状況でリンクを強くクリックするとプレビュー画面上で確認画面が表示され、指を離すと閉じてしまいます。

システムはこれを「ブラウザバックが発生した」「ユーザが不正な操作を行った」「ユーザがキャンセルした」と判断するかもしれません。 トランザクションはキャンセルされ、商品の購入はできず、契約の締結も中断してしまうかもしれません。
問い合わせが来てしまいます。

force click をOFFにするお手軽な手段は今のところ提供されていません

色々見た感じですと、WebKit のエンジニアはこの副作用にまだ気がついていないようです。
<meta ...> で封印する方法は存在せず、-webkit-touch-callout:none-webkit-user-select:none のようにCSS で封印する方法も見つけられませんでした。

pointer-events: none も試してみましたが、 none にしてしまうとタッチ操作に一切反応しないため、リンクをクリックする事ができなくなってしまいました。

Next Action

ForceClick.js で現行の問題をカバーできるようでしたら、次は WebKit(Apple)に対して機能追加(改善)要求を出して行こうかと考えています。
つまり、このようなライブラリを必要とする対処療法ではなく、ブラウザ側が機能をON/OFFする方法を用意する(根本治療)に切り替えて行きたいです。

(ε・ ワ ・)з 遠慮せず手伝ってくれてもええんやで…

Demo

iPhone 6s で demo にアクセスし、上段のリンクを軽くタッチ, 長くタッチ, 強くタッチしたあとに、下段のリンクを同じように操作してみてください。下段ではそれらの操作が機能しないようになっています。
下段のリンクを軽く押すと背景色が青く、強く押すと背景色が黄色になります。

第三次ブラウザ戦争がそろそろ閉幕します

追記: このエントリを投稿してから3日後に Google から AMP が発表されました。AMP は 既存の HTML/CSS/JavaScript の機能を制限することで、ページの表示パフォーマンスを改善するものです。AMP で書かれたページは Google 検索ランキングにおける特典が受けられるといった情報もあります。AMPの実装方法

iOS 9 Safari で発生していた touchstart で音が鳴らない不具合に対するパッチが投入されました

iOS 9 Safari で発生していた touchstart で 音が鳴らせない不具合に対するパッチが先ほどWebKitに投入されました。修正されるもようです

http://qiita.com/uupaa/items/e5856e3cb2a9fc8c5507 iOS 9 Safari WebAudio::AudioBufferSourceNode does not play on first touchstart event.

JavaScript で MP4 parser を実装してみました

MP4 コンテナに関する知識が不足していたので、習作がてら MP4 ファイルを分解する js ライブラリ(MP4.js)を WebModule で書きました。

今は MP4.parse() のみですが、そのうち MP4.build() も実装したいですね。

左がChrome / 右がVM Win7上で動作するMP4 Reader

バイナリダンプをカラフルに

あと90日でクリスマスですね。

(バイナリ解析が辛くなって来た事もあり)ちょっと気が早いですが、視認性の改善とモチベーションの維持のために TypedArray.dump のダンプ結果を色々とデコれるようにしてみました。