2019年6月25日火曜日

暗算を練習するミニアプリを作った (対象: 小1〜)

「何かお遊び勉強ツールを作って」と言われたので、作ってみました。



手書き/タイピングで簡単な算数問題を解くゲームです。 PC、スマホ、タブレットならどんなブラウザでも動くし、PWAなのでアプリ化できるし、オフラインでも使えます。

学年の選択は、その学年で習う範囲も出しているので、 3年生までは、範囲が終わっていない場合は1学年前のものをやったほうが良いかも知れません。 4年生以降は四則演算の難易度が少しずつ上がるだけです。 中学生では20x20の掛け算まで出題するようにしてみました。 ただ九九をたくさん覚えてもつらいので、10x10以上の暗算が難しければ、小6くらいの難易度がちょうど良いかも知れません。


作って見て思ったのですが、手書きで算数問題をやるのって意外と難しいですね。 MNISTでは99%以上の精度が当たり前になっていますが、実際には適当な絵を書いても数字だと認識します。 そこで入力してもらった数字が合っているかどうかをチェックしてもらう形式にしましたが、ちょっと手間が掛かる。 これ以上簡単にするのは結構難しいかなー。

あと最初はもっと画像をバリバリ使ったそれっぽいサイトにしようと思ったのですが、著作権はやっぱ厳しくて、気付いたらAAサイトになってしまった。 こんなはずではなかったんだが…。 AA普及サイトという事にしておきます。

2019年6月23日日曜日

フリゲ紹介: ハシビロコウとメジェド

ハシビロコウとメジェドは、バナナをゲットしてゴールするだけというシンプルなアクションゲーム。 全16ステージ+ファイナルステージ+おまけステージ。



最初のほうは一瞬でクリアできるステージばかりですが (左下)、10面くらいから面白くなってくる (右下)。 画面内のバナナをすべて取るとゴールが表示されるので、そのゴールに入ればステージクリアです。 全16ステージはすべて30秒以内にクリアする問題で、アクション要素も強くないので、ちょっとしたパズルゲームを解いている感じ。



ただファイナルステージだけは30秒制限もなくなり、なかなか歯ごたえがある。 ファイナルステージが本番で、最初の16ステージは前座のようなゲームになっている。 探索アクションに近いくらいマップが広くてかなり楽しめる。

アクション要素を薄めてパズルゲームになった洞窟物語みたいな感覚が楽しめる作品。 こういったライトな作品は気軽に楽しめて良いですね。

2019年6月17日月曜日

Googleガイドライン制定後のfaviconサイズ

Googleで検索結果にfaviconが表示できるようになり、ガイドラインが作られました。今のところはモバイル以外では表示されないけど、対応できるものは対応しておきたい。



ただこのガイドライン、すぐに気になった事として「ファビコンのサイズが 48 ピクセルの倍数になっていること」、「16 × 16 ピクセルのファビコンは指定しないでください」という記述がありました。 16x16, 32x32のfaviconってなくても大丈夫なんだっけ? 有名なfaviconジェネレータではまず間違いなくこの2つを生成しています。


そこで16x16、32x32は何のために必要なのか、改めて調べてみました。 色々なページの結論をまとめると、48x48以下のサイズは以下の使われ方をしている事がわかりました。

これらの指定が必要かどうかについてはStackflowにドンピシャの解答が見つかりました。 MicrosoftはIE9時代には16x16, 32x32のサイズ指定を推奨していたようなのですが、より大きなサイズのfaviconがあればそちらを使っているのが現状のようです。 つまりIE9が死滅し、今後 IE11 も死滅していくことを考慮に入れると16x16, 24x24 の favicon 生成は不要と思います。

では今でもたいていのブラウザの表示に使われている32x32の記述はなくても大丈夫なのでしょうか。 対応状況をチェックしたテーブルがありましたが、いまいちよくわからない。 仕方ないので実機で検査してみると、IE11、Edge、Safari、Firefox、Chrome、どのブラウザも16x16, 32x32のサイズがなくても表示できました。 なんだレガシー系を捨てれば32x32も要らなかったのか。 ようするにこれらの指定は、これまでも通信量とレスポンスの観点以外では指定する必要がなかった事になります。


32x32と48x48では通信量が2倍くらい違ってくるので、普段のタブ表示ではどちらが優先されるかDevToolsでさらに調査してみました。 その結果、32x32のfaviconがあれば、タブ表示ではそちらが優先されるようになっていました。 つまり以下のような指定が今後は良さそうという事になりますね。
# before
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">

# after
<link rel="icon" type="image/png" sizes="48x48" href="/favicon-48x48.png">


たかがfavicon、されどfavicon。

2019年6月15日土曜日

Neocitiesは高速でコミュニティ機能が凄い静的サイト構築サービス

Neocitiesという静的サイト構築サービスを見つけました。 どう見ても「猫シティー」なんですが、Neocitiesです。 スペルミスには注意しましょう。 おそらく今は亡きYahoo! ジオシティーズからもじったのだと思いますが、これ凄いサービスと思います。



私はサイトを作る場合、エンジニア向けならNetlifyGitHub Pagesをおすすめしていたし、非エンジニアならGoogle Sitesなどをおすすめしていました。 でもNeocitiesは、HPやブログを作るなら、もっとおすすめできる気がしている。 まずは広告なしなところも凄いのですが、CDNが付いているのでTTFBを適当に測定してみたら30msくらいでした。 巷のCDNサービスよりずっと早いじゃないか!

何も Limitations が書かれてないのでとりあえずユーザ登録してみたところ、1GBのストレージと200GBの帯域が無料で使えるとの事です。 無料枠も凄いのですが、5ドル/月払うだけで50GBのストレージと3000GBの帯域が使えるらしい。 たいていのVPSより安くないかこれ。 最近の海外の静的サイト構築サービスのレベルってここまで来たんだな…。


コミュニティサービスとしても興味深くて、Mediumみたいなソーシャル機能があります。 ここで結構面白いサイトが見つかります。 例えば、ドラクエのパロディサイトは、すぐに目を引き付けられました。 インパクト重視で海外に売り込めるチャンスを提供していて、よくできていると感じました。 トップページでいかにインパクトを出すかが重要そう。

エンジニアにとってもかなり使い勝手が良いです。 コマンドラインからも操作できてHugoなどのたいていの静的ジェネレータに対応しています。 巷のブログサービスってどれもAPIで弄ろうとすると面倒臭いんですよ。 そういったイライラがないように設計されているから嬉しい。 さらにGit Hooksを使って自動デプロイもできるし、Web上でHTML編集もできて、割と高機能です。

惜しむらくはWYSIWYGに対応していないところと、複数アカウントの非対応でしょうか。 ただ結構面白いなと思ったので、何かネタサイトでも作ってみたいなと思ってます。

Surge: 簡易的な静的デプロイサービス

Surgeという静的デプロイサービスがある事を知りました。 GitHub Pagesとよく似たデプロイサービスです。 もちろん無料枠もある。



Surgeの面白いところはGitHubと連携している訳ではなく、ディレクトリ上で surge コマンドを打てばデプロイできるところです。 最近流行のNetlifyなどのデプロイサービスだとGitHubと連携したりする必要があるのでネット上で多少の設定が必要ですが、その必要もない。 CNAMEファイルを作っておけばそのドメインに毎回デプロイしてくれるみたい

[your-domain-name].surge.sh という短い名前を使えるのも良いところだと思います。 ディレクトリをそのままアップロードするようなので静的サイト以外には使えないと思いますが、とにかくシンプルなのが売りでしょうか。 ただGitのバージョン管理を使わずにディレクトリだけを見るので、インクリメンタルな更新はどうするのかという問題があります。 ページ数の多くないモック的なサイトじゃないとキツイかな。


使いやすそうな利用シーンを色々と考えてみましたが、単一のファイルサイズがやや大きめで、なおかつ更新されやすい時には良さそうです。 そういったファイルをGitHubで管理すると、diff地獄に陥りますからね。

公式サイトには Limitations が一切書かれていないように見えて困惑するのですが、300MBくらいの容量制限はあるみたい

2019年6月14日金曜日

Google FontsのJIS漢字コード対応チェッカーを作った

Google FontsはJIS漢字コードをどれくらいサポートしているか示していません。 訳あってきちんと調べたかったので、調べられるツールを作りました。

といってもあまり完璧なものではありません。 以前はフォントが欠けていたら文字化けしていた気がするのですが、最近は標準フォントで無理やり代替するようになったのか、文字化けしてくれないので確認しにくいのです。 対応状況をきちんと調べるには、フォントをダウンロードしてチェックするしかないような気がしていますが、それは面倒過ぎる。

そこで少し考え方を変えて、JISの水準ごとにレンダリングしてみて、標準フォントを一切使わずレンダリングできていたらサポートできていると考える事にします。 以前作ったGoogle Fontsの日本語用表示チェッカーを少し拡張して、JIS第一基準とJIS第二基準の漢字一覧を表示させてみました (下)。 DevToolsを使って標準フォントを使わずに表示できている事を確認できれば、その水準の漢字に対応していると判断できます。





JIS第1基準



JIS第2基準





念のため調べ方を書いておくと、上記のJIS第n基準のテキストエリアをDevToolsで開いて、以下のようにComputed Elementsを確認すれば、フォントの対応状況がわかります。



2019-06-14時点では、対応状況は以下のようになりました。

フォント名JIS第一基準 (対応文字数)JIS第二基準 (対応文字数)
Noto Sans JP
Noto Serif JP
M PLUS 1p△ (2072)
M PLUS Rounded 1c△ (1944)
Sawarabi Mincho△ (2228)△ (27)
Sawarabi Gothic△ (1951)
Kosugi
Kosugi Maru
M+ 1p××
Rounded M+ 1c△ (1944)
はんなり明朝××
こころ明朝××
さわらび明朝△ (2228)△ (27)
さわらびゴシック△ (1951)
ニクキュウ××
ニコモジ△ (3)△ (2)
Noto Sans Japanese××


JIS第一基準も意外と対応してないんですね。

2019年6月12日水曜日

Google Search Consoleの「公開URLをテスト」はやったほうが良い

Google Search Consoleの公開URLのテストは絶対やったほうが良いと思いました。 というのもGooglebotが最新版になった→ブラウザで表示きちんと表示されているからOKという訳ではないからです。 実際、私の作った某サイトはJavaScriptがこけていて、正しくクロールされていなかった。

そのような事にならないよう、まずは公開URLをテストしてみましょう。 公開URLのテストは、サイドバーにある「URL検査」からできます。 「URL検査」で検査したいURLを入力すると、以下の画面が出てくるので、「公開URLをテスト」を押しましょう。 既にクロール済みの場合は、「クロール済みのページを表示」を押してもOKです。



テストをした後はクロール済みのページを見てみましょう。 先に述べたボタンを押しても良いですし、サイドバーからは「モバイル ユーザビリティ」→「テスト済みのページを表示」→「スクリーンショット」で辿る事ができます (下図)。※下図ではスクリーンショットは表示されてません。



私はこの「スクリーンショット」が想定通りに表示されていなくて、 その理由は「スクリーンショット」の隣の「その他の情報」でJavaScriptのエラーが出ていました。 そしてなぜエラーが出ていたのかというと…


1. 日本のGooglebotはまだES6に非対応 (少なくともライブテストでは)

エラーが出る原因ですが、まず一番重大なのはライブテストで動いているGooglebotでは、ES6が動かないことでした。 GooglebotがES6をサポートしたと公式宣言されているけど、少なくともテストでは動いていません。 実際のクローラは動くのかも知れないのですが、 原文では既にChromiumが最新バージョンになっていると書いてあるから期待薄かも。

非対応と言っても、const, letくらいは動きます。IE11と同レベルくらいかな…。 私はもともとIE11で動くレベル以上はES6は書かないようにしているのですが、それでもいくつか注意点はありました。 例えばJavaScriptって最終行ならセミコロンなしでも実行してくれるんですが、それは駄目。 私はその書き方はしないんですが、コピペしてきたコードがエラーを出してました。 他にもES6の分割代入などの基本的な構文も動いていませんでした。 最初はなんで駄目なのかわからず、またわかってもES6のサポート状況がわからず、何度もライブテストを実行して挙動を確認してしまいました。 公開URLのテストも回数制限があるようなので割とキツイ。


2. GooglebotはJavaScriptがエラーで落ちるときちんとクロールしない

公開URLのテスト結果を見ていてもう1つ重要だと思ったのは、遅延実行されるコードのバグがあった場合に、JavaScript全体の処理が落ちるという事です。 例えばクリックされない限り使われる事のないコードにバグがあった場合、 それだけでエラーが発生し、最初のレンダリングで表示されるべきコンテンツもクロールの結果に表示されませんでした。

割と厳しいです。仮にバグがあってもサイト自体は動くケースもあると思うのですが、温情措置はないみたい。 このような仕様がある以上、本当にGooglebotがきちんとクロールしてくれるかは、公開URLのテストで必ずチェックしたほうが良さそうです。 特にJavaScriptの量が多いサイトを運用している方は確認したほうが良いでしょう。


公式宣言を鵜呑みにするのではなく、実際の挙動を見ないと駄目だなあと思いました。 米国でGooglebotの挙動が変わっても日本でそれが適用されるとは限らないですしね。 日本でもいずれは対応すると思いますが、2の特性がある以上、油断はできません。 きちんと確認したほうが良いです。

2019年6月10日月曜日

font-familyによる等幅フォントの指定方法まとめ

CSSによる等幅フォント指定でやたら時間を食ったので、現状をまとめておきます。

まずこのページでサポートしているのは、Windows、Mac、Ubuntu, Debian, iOS, Android, ChromeOSです。 Linuxデスクトップのフォントはディストリビューションごとに異なるので、 シェアの大きいもの以外は考えたくないため、Webフォントも利用しています。

いきなりまとめてしまうと、以下が良いと思う。

等幅フォント+ゴシックの指定

font-family:
  'Liberation Serif', 'Noto Sans CJK JP',  /* Linux/Android/ChromeOS */
  'TakaoGothic', 'VL Gothic',  /* Debian/Ubuntu */
  'Yu Gothic', 'MS Gothic',  /* Windows */
  'Hiragino Sans', 'Hiragino Kaku Gothic ProN', 'Osaka-Mono',  /* Mac/iOS */
  'Noto Sans JP', Monospace;

等幅フォント+明朝の指定

font-family:
  'Liberation Serif', 'Noto Serif CJK JP',  /* Linux/Android/ChromeOS */
  'TakaoMincho',  /* Ubuntu */
  'Yu Mincho', 'MS Mincho',  /* Windows */
  'Hiragino Mincho', 'Hiragino Mincho ProN',  /* Mac/iOS */
  'Noto Serif JP', Monospace;


古いOSでも動くよう真面目に指定していますが、古いOSなど知らんという方は、以下の記述を削除すると良いです。 最近はWebフォントもあるので、Webフォントでカバーすればバッサリ切っても大丈夫です。 WindowsやUbuntuはもう数年待ったほうが良いと私は思いますが、Mac/iOSはそろそろ削除しても良いかも知れません。

OSフォント指定
Windows 8.1以前MS Gothic / MS Mincho
Ubuntu 18.04以前TakaoGothic / TakaoMincho
MacOS 10.10 / iOS9以前Hiragino Kaku Gothic ProN / Hiragino Mincho ProN



最後に雑多な話をまとめておきます。

ヒラギノ系の指定について

Hiragino Kaku Gothic ProNの指定はサイトによって異なる事が多いです。 Hiragino Kaku Gothic ProN W3でも、Hiragino Kaku Gothic Proでも良いですが、 ProNだと厳密な表示ができW3だとウェイトの指定をしている違いとなります。

Monospaceについて

Monospaceの指定は、固定幅の宣言みたいなものですが、フォントサイズの指定が使い物にならないので、これを使うくらいならWebフォント (Google Fonts)を使ったほうが良いです。 何を使っても良いと思いますが、Noto Sans系列がLinux/Android/ChromeOSで使われているので、私は類似系列の Noto Sans JP / Noto Serif JP を指定しておきました。

Liberation Serif について

英字も指定しておかないと割と表示が崩れるので、それを避けるおまじないです。 Liberation Sansが指定される事もあるのですが、これを指定すると数字が汚いので、私はLiberation Serifにしました。 Monospaceをsans-serifにして、Liberation Serifを消したりしてみると、効果がよくわかると思います。

2019年6月6日木曜日

tdewolff/minifyでWebサイトのビルド時間を1/100に

とあるサービスに1万ほどページを追加したのですが、改めてビルドツールは自作に限ると思いました。 理由はタイトルにあるように、ビルド時間を削減できるからです。 最近はNode.jsのビルドツール (Gulp, WebPack, Parcel, etc.) が流行っているのですが、 これらはページ数が増えると制御が大変になってきます。 高機能でSPAに便利なのは確かだけど、ビルドプロセスが複雑過ぎるし、リッチ過ぎる。

例えば数千ページくらいをビルドする時、JavaScriptのトランスコンパイルを1ページずつ実行とかは、ただの苦行です。 トランスコンパイルは使うべきではなくバージョンは固定すべきだし、 使ったとしても事前最適化しないといけない訳ですが、調整をしようとするとビルドプロセスがわかりにくいせいで、非常に面倒。 以前から感じていたのですが、ページ数の多いサイトを作っていると、改めてリッチ過ぎる事の弊害を感じました。


私は数千ページ以上のビルドには、以下の処理手順のビルドツールを自作しています。
  1. UnCSS/DropCSS: 未使用CSSを削除 (事前処理→数千ページに一括適用)
  2. tdewolff/minify: JavaScript/CSS/HTMLを圧縮
  3. 自作: gzip/brotliで圧縮


まずSPAでよく使われるインライン化は非SPAページでは効率が悪い事が多いので、たいていはlinkタグで読み込みます。 ページごとに最適化するのではなく、使うべきCSSをすべて載せたテストページを作って未使用CSSの削除を事前に行い、文字列展開します。 たくさん読み込むと遅くなるので、ファーストビューとセカンドビューの2つだけにします。 そして次にコンテンツ圧縮していくのですが、ここで重要なのがtdewolff/minifyを使う事です。 以前紹介した事もあるけど、Node.jsのたいていのビルドツールの100倍ほど高速に色々なものを圧縮できる素晴らしいツールです。 最後にgzip/brotliで事前圧縮してビルドは完了。

割と簡単な上記の構成でも、1万ページくらいなら2-3分でビルドできます。 Node.jsのビルドツールだと数時間は軽く掛かるので、やはりtdewolff/minifyは凄いと思う。 その割に日本語の記事がほとんどないのは不思議です。SPA人口が多過ぎるのかなあ。

ところで本当は画像/SVGを自動でインライン化するような機能も自作してるんだけど、パースに時間掛かるしファイルサイズの14KB調整とかでビルドが遅くなるだけなので、最初から手作業でインライン化したほうが良いんじゃないかと最近は思ってる。 このようなビルドプロセスの最適化もとても大切だと思う。


tdewolff/minifyに唯一欠点があるとすれば、JavaScriptの圧縮率が平凡な事でしょうか。 本気で圧縮するなら他ツールを使うべきですが、1万ページあるとビルドに丸1日掛かりかねないので無理。 tdewolff/minifyがローカル変数をmangleさえしてくれれば間違いなく最強ツールになるので、今後に期待しています。 追記: 気付いたら速度も圧縮率も素晴らしいツールになっており、あらゆる面でほぼ最強になっていました。つよい。

2019年6月1日土曜日

BloggerのURL登録が神速になった

Google Search Consoleを触っていて気付いたのですが、 Googlebotの更新後くらいからBloggerのGooglebotによるインデックス化の仕組みが変わったように思います。 いくつかのブログで確認したので間違いないと思うのですが、おそらく記事を公開した瞬間にURLが登録されるようになりました。

ただURLがクロール対象として登録されるだけで、即座にインデックス化される訳ではないようです。 ようするに速攻でキューイングされる状態と思ってます。 更新が早いサイトはクロールも早いので、即座にインデックス化されるサイトもあるかも知れません。 更新頻度の多いサイトがもっと有利になったという認識で良いのでしょうか。



普通のサイトはGoogle Search ConsoleのURL検査からインデックス登録のリクエストが今でも必要です。 これをしないと平凡なサイトはなかなかインデックス化されない。 普段の更新頻度にもよると思いますが、この処理に1日くらい時間が掛かります。


実は最近作ったサイトで何ヶ月待ってもインデックス化が終わりそうにないサイトが手元にあります。 これが1日でインデックス化できればどんなに良い事か。 このように大規模なサイトだとインデックス速度は割と大きな問題になります。 何となくの経験論ですが、Googleはカバレッジが一定量ないと検索結果に全然表示されないと思っていて、 一定量カバレッジを溜めるための速度というのは割と死活問題です。

インデックス化の速度も改良されると良いなあと思っています。


2019-06-22: URL登録は一瞬だけどインデックス化は遅いことがわかったので文章を修正しました。