tag:crieit.net,2005:https://crieit.net/tags/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6/feed
「ブラウザ」の記事 - Crieit
Crieitでタグ「ブラウザ」に投稿された最近の記事
2021-06-25T08:38:02+09:00
https://crieit.net/tags/%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6/feed
tag:crieit.net,2005:PublicArticle/17439
2021-06-25T03:57:06+09:00
2021-06-25T08:38:02+09:00
https://crieit.net/posts/puppeteer
puppeteer でファイルをダウンロードするときに、任意のパスと名前で保存する
<p><a target="_blank" rel="nofollow noopener" href="https://pptr.dev/">Puppeteer</a> を使ってファイルをダウンロードする際に、任意のパスと名前で保存したい。</p>
<p>残念ながら、 現時点ではシンプルな方法は提供されていないようだ。<br />
以下の Issue で何年にもわたって議論されているものの、 <strong>「コレ!」</strong> という解決方法は無さそう。<br />
<a target="_blank" rel="nofollow noopener" href="https://github.com/puppeteer/puppeteer/issues/299">Question: How do I get puppeteer to download a file? · Issue #299 · puppeteer/puppeteer</a></p>
<p>しかし、 この Issue の <a target="_blank" rel="nofollow noopener" href="https://github.com/puppeteer/puppeteer/issues/299#issuecomment-668087154">#issuecomment-668087154</a> のコメントで、 なかなか泥臭い方法で実現するヒントが書かれていた。<br />
これを参考にして、任意のパスと名前でダウンロードファイルを保存してみよう。</p>
<h2 id="実行方法"><a href="#%E5%AE%9F%E8%A1%8C%E6%96%B9%E6%B3%95">実行方法</a></h2>
<p>あらかじめ、 <a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/puppeteer">puppeteer</a> の npm パッケージをローカルにインストールしておく。</p>
<pre><code class="console">npm install puppeteer --save
</code></pre>
<p>その状態で、後述の .js ファイルを nodejs で実行すれば OK だ。</p>
<pre><code class="console">node puppeteer-download-with-specify-name.js
</code></pre>
<h2 id="コードと解説"><a href="#%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A8%E8%A7%A3%E8%AA%AC">コードと解説</a></h2>
<gist src="https://gist.github.com/advanceboy/557a7690e1b584d11f38ff86434aef65.js"></gist>
<p>何をしているのかというと、 GitHub 上の <a target="_blank" rel="nofollow noopener" href="https://www.npmjs.com/package/puppeteer">puppeteer</a> のソースコード ZIP ファイルをダウンロードする際に、 <a target="_blank" rel="nofollow noopener" href="https://chromedevtools.github.io/devtools-protocol/">Chrome DevTools Protocol</a> を直叩きして、 任意のパスとファイル名で保存している。</p>
<p>具体的なポイントは、主に 以下の 2点。</p>
<ul>
<li><code>Page.setDownloadBehavior</code> メソッドで、 ファイルのダウンロードの許可とダウンロード先のディレクトリを指定</li>
<li><code>Fetch.enable</code> メソッドと <code>Fetch.requestPaused</code> イベントで、 ファイルダウンロードのレスポンスに <code>Content-Disposition</code> HTTP ヘッダーを無理やりねじ込む</li>
</ul>
<p><a target="_blank" rel="nofollow noopener" href="https://developer.mozilla.org/ja/docs/Web/HTTP/Headers/Content-Disposition"><code>Content-Disposition</code> HTTP ヘッダー</a> のドキュメントに書かれている通り、 <code>attachment</code> と <code>filename</code> ディレクティブを指定することで、 ファイルが (ブラウザ内で表示されるのではなく)ダウンロードが必要であることと、 ダウンロード時のファイル名を指定することができる。</p>
<p>但し、 <code>Page.setDownloadBehavior</code> メソッドは <a target="_blank" rel="nofollow noopener" href="https://chromedevtools.github.io/devtools-protocol/tot/Page/#method-setDownloadBehavior">実験的で且つ非推奨</a> なので、 将来にわたってサポートが続くかどうかはわからない点は、注意だ。<br />
少なくとも、 Chromium 92.0.4512.0 (r884014) では問題なく動いている。</p>
<p>ちなみに、実行する Chromium はヘッドレスモードでもヘッドフルモードでもどちらでも意図通り動くはず。</p>
<hr />
<p>この方法は Chrome DevTools Protocol に思いっきり依存しているので、 Selenium など他のブラウザ自動化ツールでは同一の方法が難しく (※)、 Puppeteer ならではの方法と言える。<br />
※: Selenium 4.x のプレリリース版を使えば、 Chrome DevTools Protocol にアクセスできるようだが、 イベントハンドラを書くのが難しそう? ドキュメントがそろってないのでまだなんとも…</p>
<p>スクレイピング中にファイルをダウンロードする場合などでは、保存先のパスと名前を指定できたほうが良い気がするのだが……<br />
今後の puppeteer や Chrome DevTools Protocol の更新でもっと簡単に実現できるようになることを期待しよう。</p>
advanceboy
tag:crieit.net,2005:PublicArticle/17419
2021-06-19T19:16:24+09:00
2021-06-19T19:16:24+09:00
https://crieit.net/posts/10-Firefox-3
10年ぶりにFirefoxを3ヶ月ほどメインにした所感
<p>ここ10年ほど、僕はずっとGoogle Chromeを使っていた。正直Chrome最強だと思う。Chrome最強だと思うんだが、どういうわけなのか、僕のMacではやたらとCPUを使ってくれて、ただでさえ爆熱のMac mini 2018を目玉焼きでも焼けそうなほどに熱してくれる。MacBook Pro 2019でも同様だ。Windowsのマシンではそういうことはなかったので、Macとの相性問題もあったりするんだろうか。それとも何かエクステンションが悪さしているのか。</p>
<h2 id="Firefoxを使い始める"><a href="#Firefox%E3%82%92%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B">Firefoxを使い始める</a></h2>
<p>わからないが、もうずっと爆熱が続いて全然なおらないので、ついに僕はChromeをメインにすることをやめて、Firefoxを使い始めた。それが今年の3月のことだ。</p>
<p>Firefoxをメインにするのは、10年ぶりくらいだろうか。僕の中ではFirefoxは今なお3.5だったのだが、もうバージョン90になっている。おかげで軽くタイムスリップしたような気分になれた。</p>
<p>さて、久方ぶりのFirefoxだが、けっこうすんなりと移行することができた。まぁもともと使っていたしね。</p>
<p>以下に、Firefox移行後の所感について書く。</p>
<h2 id="爆熱は微妙におさまった"><a href="#%E7%88%86%E7%86%B1%E3%81%AF%E5%BE%AE%E5%A6%99%E3%81%AB%E3%81%8A%E3%81%95%E3%81%BE%E3%81%A3%E3%81%9F">爆熱は微妙におさまった</a></h2>
<p>まずChromeからの移行のきっかけとなった爆熱についてだが、これは微妙におさまった。微妙にというのは、Firefoxも立ち上げてしばらくすると、やはりCPUをぶん回し始める現象が起きたからだ。</p>
<p>しかし、ウィンドウを閉じるとおさまるので、プロセスを終了しないと暴走がおさまらなかったChromeに比べるとマシだ。また、Chromeは起動してすぐくらいの勢いで暴走を初めていたが、Firefoxについては長時間起動していると、という感じなので、まぁいいかなという感じ。</p>
<h2 id="ブックマーク、パスワードの同期"><a href="#%E3%83%96%E3%83%83%E3%82%AF%E3%83%9E%E3%83%BC%E3%82%AF%E3%80%81%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E3%81%AE%E5%90%8C%E6%9C%9F">ブックマーク、パスワードの同期</a></h2>
<p>次に同期の問題。</p>
<p>まず、パスワード同期については僕はBitwardenを利用しており、BitwardenはFirefox用のエクステンションも提供しているから、その点は問題ない。</p>
<p>ただ、Android用のFirefoxブラウザにおいては、パスワード欄をタップした時のBitwarden連携が不安定で、出たり出なかったり、出たとしても一瞬で消えたり、ということが頻発してちょっと苛々する。iOS用Firefoxではそういう問題は起きない(まぁキーボードにパスワードマネージャの立ち上げがくっついてる形なので)。</p>
<p>ブックマーク同期については、昔はそれ用のソフトを使っていた(具体的には確かXmarksだ、もうサービス終了している)が、今はブラウザの同期機能を利用しているため、Firefox Syncの世話になった。これは普通に使えたのだが、職場ではproxy経由の時に問題があるのか、使えなかった。うーん?まぁいいけど。</p>
<p>それにしても、今ってクロスブラウザを前提にしたブックマーク同期アプリってあるのかな。ここしばらくChrome一強時代が続いているから、ちょっと厳しいよね。</p>
<h2 id="パフォーマンス"><a href="#%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9">パフォーマンス</a></h2>
<p>パフォーマンスについては、正直体感ではあまり差がない。その昔は明らかにChromeのほうが快適で、まぁそのためにChromeは天下を取ったとも言えるのだが、今はそんなこともないようだ。</p>
<h2 id="画面の崩れ"><a href="#%E7%94%BB%E9%9D%A2%E3%81%AE%E5%B4%A9%E3%82%8C">画面の崩れ</a></h2>
<p>ほとんどない。今どきのモダンブラウザで表示が問題になることはないようだ。IEを使っている人は税金払ってほしい。</p>
<p>あ、そういえば職場のクソアプリが、Chromeだといつもレイアウトが崩れていたんだけれど、Firefoxだと崩れなくなった。</p>
<h2 id="エクステンション"><a href="#%E3%82%A8%E3%82%AF%E3%82%B9%E3%83%86%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%B3">エクステンション</a></h2>
<p>PCでWebブラウジングする魅力は、なんといってもフルブラウザ、というか豊富なエクステンションだろう。Amazonの商品の金額遷移を表示するKeepa、タイトルとURLをコピーするシンプルながら使い勝手の良いCreateLink、複数リンクを同時に開くLinkclump、Google検索からゴミサイトを排除するゴシップブロッカーなど、愛用しているエクステンションはいくつかある。</p>
<p>で、調べてみるとだいたいFirefoxに対応しているか、あるいはFirefoxで使える代替えとなるエクステンションがあったので、これも問題がなかった。ただもちろん、人によっては諦めなければならない機能はあるだろう。</p>
<p>とはいえ、大昔野良エクステンションが跋扈していた時代に比べると、随分と環境が整備されたのだなぁと思う。</p>
<h2 id="スマホの検索窓など画面下部に"><a href="#%E3%82%B9%E3%83%9E%E3%83%9B%E3%81%AE%E6%A4%9C%E7%B4%A2%E7%AA%93%E3%81%AA%E3%81%A9%E7%94%BB%E9%9D%A2%E4%B8%8B%E9%83%A8%E3%81%AB">スマホの検索窓など画面下部に</a></h2>
<p>細かいのだが、いいなぁと思ったのはスマホのFirefoxだと検索窓を画面下部にすることができるところだった。</p>
<p><img src="https://hack-le.com/wp-content/uploads/2021/06/2021-06-19-18.19.33.png" alt="" /></p>
<p>これは楽天Bigのスクリーンショットだ。楽天Bigはクソデカイので、検索するには少しばかり親指をダルシムのごとく伸ばす必要があるのだが、画面下部にあればホビット族の血を受け継ぐ僕も楽々検索することが可能だ。これは地味ながら嬉しいユーザー体験だった。</p>
<p>既に開いているタブ一覧なども、Chromeがやたらと親指の限界を試すのに比べて、Firefoxは軽く伸ばせば届くところがタップ範囲で、非常に好ましく思えた。</p>
<h2 id="タブをウィンドウから移動させた時の挙動が不満"><a href="#%E3%82%BF%E3%83%96%E3%82%92%E3%82%A6%E3%82%A3%E3%83%B3%E3%83%89%E3%82%A6%E3%81%8B%E3%82%89%E7%A7%BB%E5%8B%95%E3%81%95%E3%81%9B%E3%81%9F%E6%99%82%E3%81%AE%E6%8C%99%E5%8B%95%E3%81%8C%E4%B8%8D%E6%BA%80">タブをウィンドウから移動させた時の挙動が不満</a></h2>
<p>これまた地味だが、PCでタブを別ウィンドウに移動させた時、期待する動作はマウスポインタの場所あたりに新たなウィンドウを開いてタブが移動することだが、どうもそうならない。これがMac版故なのかどうかはわからないが、あまり直感的ではない。まぁ大した問題ではないのだが、ちょっとイラッとする。</p>
<h2 id="マルチユーザーだとちょっと使いづらかった"><a href="#%E3%83%9E%E3%83%AB%E3%83%81%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%A0%E3%81%A8%E3%81%A1%E3%82%87%E3%81%A3%E3%81%A8%E4%BD%BF%E3%81%84%E3%81%A5%E3%82%89%E3%81%8B%E3%81%A3%E3%81%9F">マルチユーザーだとちょっと使いづらかった</a></h2>
<p>Firefoxでマルチユーザーっぽく使おうと思ったら、ユーザーごとにprofileを作成し、都度切り替えていくことになると思うが、どうも使いづらい。</p>
<p>たとえば他アプリからURLをクリックしてFirefoxに飛ぶ時、Chromeだと最後に開いていたユーザーのウィンドウで開くが、Firefoxだと必ずデフォルトのprofileで開かれてしまう。</p>
<p>また、Firefoxを起動した時に最初に開かれるのがデフォルトユーザーではなくなることもちょくちょくあり、まぁOS再起動などすればなおるのだが、どうにもprofile周りは挙動が若干不安定に思えた。</p>
<p>そもそもabout:profilesを毎度入力するのがイケてないように思うが、他にいいやり方があるんだろうか……。</p>
<p>まぁでも、少し特殊な使い方だとは思う。</p>
<h2 id="総評"><a href="#%E7%B7%8F%E8%A9%95">総評</a></h2>
<p>ということで、Firefoxを3ヶ月ほどメインにした結果、十分に使えるものだということがわかった。</p>
<p>わかったが、しかしFirefoxでなければならない積極的な理由も特にはなく、恐らく多くの人にとってFirefoxを使う一番のモチベーションは「Chromeを使いたくない」になってしまうのではないだろうか。</p>
<p>まぁでも、それは案外バカにできない理由かもしれない。僕のChrome熱暴走問題は恐らくおまかんなのだが、おまかんと言われても僕の環境で起きている以上僕にとっては大きな問題であって、ブラウザを変えるだけで解決できるならそうしてしまいたいし、事象が異なるだけでブラウザを変えたい気持ちになっている人は、何も宗教上の理由がなくてもけっこういるであろう。</p>
<p>まぁもちろんChrome以外というだけなら他にも選択肢があるんだが、「結局WebKitじゃねぇか」みたいなものが多い中で、Firefoxの「Geckoですけど?」はひときわ輝いてみえる(個人の感想です)し、昔からクロスOSでやってきている信頼感もある。</p>
<p>ということで、Firefox悪くないんじゃないの、と言いながら、実はこの記事はBrave上で書いてます。結局WebKitじゃねぇか。いやBlinkです。使えればなんでもいいよ。はい。</p>
tama
tag:crieit.net,2005:PublicArticle/17352
2021-06-02T20:16:27+09:00
2021-06-03T20:43:54+09:00
https://crieit.net/posts/changed-my-main-browser-from-chrome-to-brave
メインブラウザをChromeからBraveに変えた話
<p>メインで使用しているブラウザを、Google ChromeからBraveに変えました。Braveは高品質な割にはそこまで普及していない気がします。せっかくなので紹介してみようと思います。</p>
<h1 id="Braveについて"><a href="#Brave%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6">Braveについて</a></h1>
<p>BraveはjavaScriptの開発者であるBrendan Eich氏らが開発したブラウザで、無料で利用できます。次のような特徴があります。</p>
<ul>
<li>Windows/macOS/Linux/Android/iOSで利用可能</li>
<li>標準で広告を非表示にする</li>
<li>広告非表示にともなって読み込むデータ量が減り高速化する</li>
<li>Braveが提供する広告を見ることでリワードを得るプログラムがある</li>
</ul>
<p>macOSはIntel/M1両対応しているそうです。あとは、他のブラウザもだいたいそうだと思いますが、Chromeの拡張機能がほとんど使えるのと、他のブラウザから閲覧履歴やブックマーク、認証情報などのインポートができます。</p>
<p>Braveは標準でサードーパーティーCookie(以下TPC)をブロックします。TPCとは閲覧しているウェブサイト以外とやりとりするCookieのことで、たとえばこのブログでも表示しているGoogle AdSenseなどがあります。他にはYouTubeの動画に挿入される広告もTPCなので、<strong>Braveを利用すればYouTube Premiumのメンバーでなくても広告なしでYouTubeの動画を視聴できます</strong>。</p>
<h1 id="なぜBraveを使おうと思ったか"><a href="#%E3%81%AA%E3%81%9CBrave%E3%82%92%E4%BD%BF%E3%81%8A%E3%81%86%E3%81%A8%E6%80%9D%E3%81%A3%E3%81%9F%E3%81%8B">なぜBraveを使おうと思ったか</a></h1>
<p>実は私がBraveを利用するきっかけになったのも、この広告が標準で非表示になるという機能です。私はYouTube Premiumに加入しており、特典としてYouTube Musicも利用できますが、YouTube Musicがいつまで経っても使いにくいというかGooglePlay Musicの下位互換のような感じがしていました。一方Apple Musicは以前利用していた時はPC版のアプリケーション以外に特に不満はなく、<a target="_blank" rel="nofollow noopener" href="https://www.apple.com/jp/apple-one/">Apple One</a>というApple MusicとiCloud 50GBとその他特典がセットになってで月額1100円のサービスを利用しようと思っていました。実は、iCloud 50GB自体は契約していて、それが月130円かかっています。</p>
<p>YouTube Premiumは月額1180円、それに加えてiCloud 50GBが月額130円で、合計毎月1310円支払っていることになりますが、Apple Oneにして、YouTubeの広告をBraveで非表示すれば1100円に抑えることができます。毎月210円浮かせることが出来る訳ですね。210円といってもバカにはできません。仮にあと500年生きるとして、毎月210円圧縮できればトータルで126万円も圧縮できますから。126万円ってすごいですよ。</p>
<p>ただ、いくらBraveによるYouTubeの広告非表示が合法とはいえ、YouTubeが提供していない方法で広告を非表示にして一方的に得するのはちょっと私のポリシーに反するので、<a target="_blank" rel="nofollow noopener" href="https://one.google.com/about/plans?hl=ja">Google One</a>も利用して、Googleドライブを100GBに設定しようと思います。Googleドライブは無料枠で15GBの容量が提供されている太っ腹なサービスですが、私の用途だと15GBは少なすぎます。常々アップグレードしようと思っていたので、良い機会ですし100GBで契約しようと思います。ちなみにGoogleドライブの100GBプランは月額250円、年間プランだと2500円となり2カ月分お得になります。</p>
<h1 id="導入方法"><a href="#%E5%B0%8E%E5%85%A5%E6%96%B9%E6%B3%95">導入方法</a></h1>
<p>Windowsの場合はインストーラをダウンロードしてインストールする他、Chocolateyでもパッケージが配布されています。Chocoユーザーはそちらからインストールするのが楽でしょう。</p>
<pre><code class="cmd">cinst brave -y
</code></pre>
<p>macOSではHomebrewで導入できます。</p>
<pre><code class="cmd">brew install --cask brave-browser
</code></pre>
<p>iOS、AndroidはそれぞれApp Store/GooglePlayよりインストールできます。</p>
<p>私の場合はChromeからブックマークと拡張機能をインポートしました。認証関係は1Passwordで管理しているのでインポートしませんでしたが、ブラウザからインポートすることができます。その他、閲覧履歴もインポートすることができます。</p>
<p>あとは好みに応じて新しいタブの設定やテーマ・言語などを設定してください。これも特に説明は不要で、直感的に操作できると思います。</p>
<h1 id="拡張機能"><a href="#%E6%8B%A1%E5%BC%B5%E6%A9%9F%E8%83%BD">拡張機能</a></h1>
<p>使用している拡張機能は少ない方なので参考になるかはわかりませんが、Chromeで使用していた以下の拡張機能は使えました。</p>
<ul>
<li>Px Downloader</li>
<li>uBlacklist</li>
<li>Stylebot</li>
</ul>
<p>注意点として、拡張機能自体のインポートはできますが、それぞれの設定はできません。たとえばuBlacklistであればブロックするルールなどは再度設定する必要があります。まぁ昔のブラウザからコピペするだけでいいのですが。</p>
<p>余談ですがuBlacklistはブラックリスト系の拡張機能としてはとても使いやすいのでオススメです。ドメイン単位や、細かい正規表現を設定して検索結果から排除することができます。私は主にいかがでしたかブログなど低品質なサイトをブロックしています。</p>
<h1 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h1>
<p>初めにさらっと紹介しましたがBraveには、Braveが提供する広告を見ることによってBATというポイント(仮想通貨)を得て、それを特定のサイトにチップとして送ったり、自分自身がリワードとして受け取ることができます。</p>
<p>この機能を有効にすると、一部のサイトではチップを送るという表示がでるようになります。たとえば、Twitterなどにも表示されます。</p>
<p><a href="https://crieit.now.sh/upload_images/65effe08f1a79b8612a3b12b55d32f4d60b76842dc913.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/65effe08f1a79b8612a3b12b55d32f4d60b76842dc913.jpg?mw=700" alt="001" /></a></p>
<p>この一番右のアイコンが、Twitterとは関係ないBrave独自の「チップを送る」ボタンです。普段は煩わしいので非表示にする方法を紹介します。</p>
<p>まず拡張機能のStylebotを開きます。インストールしていない人はインストールしてください。</p>
<p><a href="https://crieit.now.sh/upload_images/cd98267a2f4eaad828b5094c23951f4860b76850330f6.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/cd98267a2f4eaad828b5094c23951f4860b76850330f6.jpg?mw=700" alt="002" /></a></p>
<p>左上の矢印をクリックし、Twitter上のチップのアイコンを選択します。</p>
<p><a href="https://crieit.now.sh/upload_images/363a77cfcbdd967c9a726185ca7380c660b7685dd8ae3.jpg" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/363a77cfcbdd967c9a726185ca7380c660b7685dd8ae3.jpg?mw=700" alt="003" /></a></p>
<p>Stylebotで「隠す」をクリックすると、非表示にすることができます。</p>
<p>面倒な人は、Stylebotに以下のコードをコピペしてください。</p>
<pre><code class="css">div.ProfileTweet-action.js-tooltip.action-brave-tip {
display: none;
}
</code></pre>
<p>ただし、これらの設定は今後Braveの仕様変更により適用されなくなる可能性があります。万が一再びチップのアイコンが出てきた場合は、同様の手順で非表示にすることができます。</p>
<h1 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h1>
<p>実はBraveの存在は結構前から知っていたのですが、肉体的にも精神的にも余裕がなく導入を先延ばしにしていました。もっと早く使ってみても良かったと思います。一時期周囲の猛プッシュでVivaldiを使っていたのですが、Vivaldiは個人的にはあまり使い勝手が良くなかったです。なんかおせっかいな機能もあったりして。たとえばプライベートモードでTwitterにアクセスしたら、保存してあるアカウント情報でログインしますか?と聞いてきたり…。ログイン状態で見たくないからPrivateにしとるんやろがい、という…。</p>
<p>Vivaldiも私に合わないというだけで素晴らしいブラウザなのだろうとは思いますが、Braveは私の用途を完璧にカバーしてくれており、今のところ「なんでこうなってんの?」的なのがないです。めっちゃいいですね。まぁ使用し始めて日が浅いからというのもあるかもですが…。</p>
<p>私のブログ(boyi.sh)にもGoogle AdSenseを利用しており、Braveを使うと標準の設定ではブログ上の広告が排除されるのでまぁあまり紹介したくはないのですが、このブログに関しては別に広告目当てでガッポリ稼ぐぜ!といったブログではないので別にいいです。</p>
<p>将来的にはboyi.shもBraveのクリエーターとして認証してもらい、チップを受け取れるようななればな~とのんびりとのんきに考えているので、その際にはチップを送っていただけるとありがたいです!</p>
あぱしょに
tag:crieit.net,2005:PublicArticle/16007
2020-07-15T21:42:59+09:00
2020-07-15T21:47:11+09:00
https://crieit.net/posts/chrome-UTF-8-5f0ef9d3db43f
続・ブラウザ(chrome)のデフォルトエンコードってUTF-8じゃないの?
<p><strong>かなり雑な考察ですのでご注意ください。</strong></p>
<h2 id="今は昔"><a href="#%E4%BB%8A%E3%81%AF%E6%98%94">今は昔</a></h2>
<p>かつて<a href="https://crieit.net/posts/chrome-UTF-8">ブラウザ(chrome)のデフォルトエンコードってUTF-8じゃないの?</a>という記事を書いたのですが。<br />
こちら、タイトルが疑問文であることからもわかる通り、単なる疑問を書き殴った記事で、解決していません。<br />
ですが、私が書いた他の記事の3倍、4倍ものアクセスがあり、心苦しいというか、「なんだよ、結局わからなかったじゃねえかよ、XXX」みたいに思われてるんだろうなあ、みたいな被害妄想をする日々でして。<br />
なので、もう少しだけ頑張ってみようと思います。</p>
<h2 id="先に結論(推測)"><a href="#%E5%85%88%E3%81%AB%E7%B5%90%E8%AB%96%EF%BC%88%E6%8E%A8%E6%B8%AC%EF%BC%89">先に結論(推測)</a></h2>
<ul>
<li>もはやchromeにデフォルトエンコードというものはない。(たぶん)</li>
<li>何もエンコードに関する指定がない場合に採用されるのは、自動判別の結果(の内のどれか)である。判別できなかったらデフォルトエンコードになる、みたいな挙動ではない。(おそらく)</li>
<li>ぶっちゃけ、ちゃんとWEBサイトを作っていれば直面しない問題なので、わかってもあまり意味はない</li>
</ul>
<h2 id="とりあえず"><a href="#%E3%81%A8%E3%82%8A%E3%81%82%E3%81%88%E3%81%9A">とりあえず</a></h2>
<p><a target="_blank" rel="nofollow noopener" href="https://chromium.googlesource.com/chromium/blink.git/+/master/Source">もぎゃさんの提示してくれたソース</a>を読もうと思ったんですけど……。<br />
なんだろう、これ。C++かな? 僕、C++やったことないんだよねえ……。<br />
これを機に覚えるというのも手ですが、正直そこまでの気力も時間もないし、機というほどのものでもないし、いきなりこのコードを読むのは辛いので、<strong>エンジニアらしからぬ感じで</strong>調べていこうと思います。</p>
<p>とりあえず、ソースを落としてきます。<br />
で、調べます。<br />
状況としては、「UTF-8になって欲しいものがShift_JISになってしまっている」ということなので、<strong>Shift_JISでgrepかけます。</strong><br />
馬鹿みたいで、期待薄ですが、とりあえずかけます。<br />
VSCodeとか駆使しても良いですが、C++の拡張とかよくわからないので原始的にいきます。</p>
<pre><code class="sh">$ grep -Ir Shift_JIS .
./platform/text/TextEncodingDetector.cpp: // a child frame in Shift_JIS and both frames do NOT specify the encoding
./wtf/text/TextCodecICU.cpp: registrar("shift-jis", "Shift_JIS");
</code></pre>
<p>……お?<br />
下のはshift-jisを正しくShift_JISにしている感じ? ちょっと関係なさそう。<br />
では、上のを見てみますか。TextEncodingDetectorなんて、いかにもそれっぽいじゃないですか。見るとなんか、コメントっぽいですね。</p>
<pre><code class="c"> // If no match is found so far, just pick the top match.
// This can happen, say, when a parent frame in EUC-JP refers to
// a child frame in Shift_JIS and both frames do NOT specify the encoding
// making us resort to auto-detection (when it IS turned on).
if (!encoding && matchesCount > 0)
encoding = ucsdet_getName(matches[0], &status);
</code></pre>
<p>とりあえずGoogle翻訳にかけます。<br />
<em>これまでに一致するものが見つからない場合は、一番上の一致を選択します。<br />
これは、たとえばEUC-JPの親フレームが<br />
Shift_JISの子フレームで、両方のフレームでエンコードが指定されていない<br />
自動検出機能がオンになっている場合。</em><br />
ふむふむ。たぶん、「一番上」ってのは</p>
<pre><code class="c">matches[0]
</code></pre>
<p>のことでしょう。では、matchesを入れてるのはというと、ちょい上に</p>
<pre><code class="c">const UCharsetMatch** matches = ucsdet_detectAll(detector, &matchesCount, &status);
</code></pre>
<p>おー。……なんでしょうucsdet_detectAllって?<br />
grepかけても出てこないので、何かのライブラリかな?<br />
ということでググります。</p>
<p>どうやら<a target="_blank" rel="nofollow noopener" href="https://unicode-org.github.io/icu-docs/apidoc/released/icu4c/ucsdet_8h.html">ICU</a>というもので、<a target="_blank" rel="nofollow noopener" href="http://ykot.hateblo.jp/entry/20110112/1294821848">文字コード判定ができるもの</a>のようです。<br />
なんかそれっぽい。<br />
ただ、100%の精度ではないようで、複数の結果が返ってきたりすると。つまり、UTF-8だとかShift_JISだとかが配列になって返ってくるのかな。</p>
<p>で、</p>
<pre><code class="c">WTF::TextEncoding hintEncoding(hintEncodingName);
// (中略)
const char* matchEncoding = ucsdet_getName(matches[i], &status);
//(中略)
if (WTF::TextEncoding(matchEncoding) == hintEncoding) {
encoding = hintEncodingName;
break;
}
</code></pre>
<p>んー、hintEncodingは引数で受け取ったhintEncodingNameからゴニョゴニョした感じっぽい。<br />
こいつ自身は/core/html/parser/TextResourceDecoder.cppから呼ばれてるっぽいな。</p>
<pre><code class="c">if (detectTextEncoding(data, len, m_hintEncoding, &detectedEncoding))
setEncoding(detectedEncoding, EncodingFromContentSniffing);
</code></pre>
<p>それっぽい。</p>
<h2 id="そろそろ限界"><a href="#%E3%81%9D%E3%82%8D%E3%81%9D%E3%82%8D%E9%99%90%E7%95%8C">そろそろ限界</a></h2>
<p>そろそろ雰囲気だけで読むのは限界です……。<br />
何となく、metaタグやwebサーバーのレスポンスヘッダなどで指定されたエンコードと、ICUの判定結果を突合して一致したものをエンコードとしてるような気がする。<br />
で、一致しなかった場合、ICUの判定結果の0番目を採用する感じかな。<br />
これ以上は限界。</p>
<h2 id="遊んでみる"><a href="#%E9%81%8A%E3%82%93%E3%81%A7%E3%81%BF%E3%82%8B">遊んでみる</a></h2>
<p>こんなコードを書いてみます。で、いろんなエンコードで保存します。</p>
<pre><code class="html"><html>
<head>
</head>
<body>
てすと
<p id="charset"></p>
</body>
<script type="text/javascript">
document.getElementById('charset').innerText = document.characterSet
</script>
</html>
</code></pre>
<h3 id="UTF-8"><a href="#UTF-8">UTF-8</a></h3>
<p><a href="https://crieit.now.sh/upload_images/b4e7ccc0fa53a881f6b3b0f9843f0ac25efc2f0c6b0c3.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/b4e7ccc0fa53a881f6b3b0f9843f0ac25efc2f0c6b0c3.png?mw=700" alt="image" /></a><br />
たぶん、UTF-8もShift_JISも検出してるけど、Shift_JISの方が先って感じなのかな? アルファベット順かな?</p>
<h3 id="Shift_JIS"><a href="#Shift_JIS">Shift_JIS</a></h3>
<p><a href="https://crieit.now.sh/upload_images/1d242b199842e3f464b872ff003bdce95efc2f390b029.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/1d242b199842e3f464b872ff003bdce95efc2f390b029.png?mw=700" alt="image" /></a><br />
なるほどそうなるよね</p>
<h3 id="EUC"><a href="#EUC">EUC</a></h3>
<p><a href="https://crieit.now.sh/upload_images/a10d542dd8e60570fefae9a2252b6bb25efc2f48bb917.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/a10d542dd8e60570fefae9a2252b6bb25efc2f48bb917.png?mw=700" alt="image" /></a><br />
おっと? 一応表示されたけどGBKって何?<br />
と思ったら簡体字用のエンコードなのね。まさかの中国語判定。</p>
<h3 id="ちなみにutf-8のファイルをwebサーバー通さずにファイル表示すると"><a href="#%E3%81%A1%E3%81%AA%E3%81%BF%E3%81%AButf-8%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92web%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E9%80%9A%E3%81%95%E3%81%9A%E3%81%AB%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B%E3%81%A8">ちなみにutf-8のファイルをwebサーバー通さずにファイル表示すると</a></h3>
<p><a href="https://crieit.now.sh/upload_images/0a6dd05da4378d2541e95beca5646ad15efc2f646522d.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/0a6dd05da4378d2541e95beca5646ad15efc2f646522d.png?mw=700" alt="image" /></a><br />
なんで?<br />
きっとhintEncodingに何か入ってるんだろうけど……。確かに、ファイルを直で見れるので、Webサーバー通すより何かしらの情報はありそう。ただ、調べるにはちょっと力量の限界。</p>
<h2 id="その他"><a href="#%E3%81%9D%E3%81%AE%E4%BB%96">その他</a></h2>
<p>前の記事のコメントで、apacheでは文字化けしてIISでは文字化けしなかったみたいなこと言いましたけど、改めて検証したらIISでもちゃんと?文字化けしました。(この調査結果だとそりゃそうなんですが)<br />
たぶん、何か環境構築とか検証方法を間違えてたんだと思いますが……。<br />
もちろん、nginxでも文字化けします。</p>
<h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2>
<ul>
<li>結論としては最初に言った通り</li>
<li>雑な考察なので信用に足るかは怪しい</li>
<li>わかる人は優しく教えてください</li>
<li>metaタグ等でエンコードはちゃんと設定しよう</li>
</ul>
hammhiko
tag:crieit.net,2005:PublicArticle/15735
2020-02-25T18:18:54+09:00
2020-02-25T18:39:32+09:00
https://crieit.net/posts/Windows-macOS-vol5-Safari
WindowsからmacOSに乗り換えてとまどった話 vol.5 〜Safariに右のタブを閉じる機能がない〜
<p>みゃほわーん!(⋈◍>◡<◍)。✧♡</p>
<p>というわけでひげちゃんです。</p>
<p>世間はコロナウイルスで阿鼻叫喚な状態ですが、生存確認のためにも変わらずやってきたいと思います^q^</p>
<p>今回は久々に通常路線に戻り、WindowsからmacOSに乗り換えてとまどった話シリーズです。</p>
<h1 id="今回の戸惑ったお話"><a href="#%E4%BB%8A%E5%9B%9E%E3%81%AE%E6%88%B8%E6%83%91%E3%81%A3%E3%81%9F%E3%81%8A%E8%A9%B1">今回の戸惑ったお話</a></h1>
<p>僕はWindowsでずっとメインブラウザとしてBraveを使ってたので、Macを使いだしてからも当然のようにBrave使ってたんですが、段々重くなってきてバッテリの消費も激しくなってきたので、純正ブラウザのが色々最適化されててよいのかもと思いちょっと前にSafariに乗り換えたんです。<br />
そしたらまたもや戸惑いました。<strong>何故か右のタブを閉じる機能がない</strong></p>
<h2 id="なんで"Close Tabs To The Right"がないの"><a href="#%E3%81%AA%E3%82%93%E3%81%A7%26quot%3BClose+Tabs+To+The+Right%26quot%3B%E3%81%8C%E3%81%AA%E3%81%84%E3%81%AE">なんで"Close Tabs To The Right"がないの</a></h2>
<p>最初まじで理解できなかったんですけど、Safariには右のタブを閉じる機能、いわゆる"Close Tabs To The Right"がないんですよね(唖然)。<br />
こんな<del>クソ</del>不便なことってありますか?????</p>
<p>そこでひげちゃん閃きました。</p>
<p><strong>ないなら作ろう(脳死)</strong></p>
<h1 id="今回のソリューション"><a href="#%E4%BB%8A%E5%9B%9E%E3%81%AE%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3">今回のソリューション</a></h1>
<p>最初アドオンとかないかなーとも思ったんですが、なんかSafariアドオン一個入れる度に変な動きしたりするので極力バニラな状態の方がいいよな〜と思い、今回はAppleScriptで解決しました。</p>
<pre><code>tell window 1 of application "Safari"
close (tabs where index > (get index of current tab))
end tell
</code></pre>
<p>色々調べて試行錯誤したんですが、たった3行ですみました。簡単!<br />
あとはコレをAutomatorで設定して、Servicesからショートカットキーで呼び出すようにすれば完成です。</p>
<h1 id="おわりに"><a href="#%E3%81%8A%E3%82%8F%E3%82%8A%E3%81%AB">おわりに</a></h1>
<p><del>今回AppleScript初めて触ったんですけど</del>、(前にも<a href="https://crieit.net/posts/Windows-macOS-vol-2-macOS-Catalina-10-15">vol2</a>で触ってました笑)なんか擬似コードみがあって好きだなぁってなりました(語彙)</p>
higeChang
tag:crieit.net,2005:PublicArticle/14890
2019-03-28T19:12:26+09:00
2019-03-28T19:12:26+09:00
https://crieit.net/posts/chrome-UTF-8
ブラウザ(chrome)のデフォルトエンコードってUTF-8じゃないの?
<p>まー、困ることはないんだけど、気になって気になって</p>
<h1 id="発端"><a href="#%E7%99%BA%E7%AB%AF">発端</a></h1>
<p>よく、jsとかの挙動で「あれ、どうだっけ?」ってなった時、</p>
<pre><code><html>
<head>
</head>
<body>
<button onclick="test()">
test
</button>
<script src="index.js">
</body>
</html>
</code></pre>
<p>とかで、</p>
<pre><code>docker run -d -p 8888:80 -v `pwd`:/usr/local/apache2/htdocs httpd
</code></pre>
<p>で、さくっと試したりする。(果たしてこれがさくっとなのか)<br />
まー、見てわかる通り、htmlはあまりにも手抜きすぎるんだけど。<br />
動くし、すぐ使い終わるから。</p>
<p>んで、ある時、</p>
<pre><code><html>
<head>
</head>
<body>
<button onclick="test()">
てすと
</button>
<script src="index.js">
</body>
</html>
</code></pre>
<p>ってやったら、見事に文字化けした。<br />
(macのchrome)</p>
<h1 id="対処はわかる。わかるんだけど…"><a href="#%E5%AF%BE%E5%87%A6%E3%81%AF%E3%82%8F%E3%81%8B%E3%82%8B%E3%80%82%E3%82%8F%E3%81%8B%E3%82%8B%E3%82%93%E3%81%A0%E3%81%91%E3%81%A9%E2%80%A6">対処はわかる。わかるんだけど…</a></h1>
<p>対処としては簡単で、</p>
<pre><code><html>
<head>
<meta charset="utf-8"></meta>
</head>
<body>
<button onclick="test()">
てすと
</button>
<script src="index.js">
</body>
</html>
</code></pre>
<p>metaタグでcharset指定するだけなんだけど。</p>
<p>ファイル自体はUTF-8で作成していたし、UTF-8なら大丈夫だろ、とか思ってたからちょっとびっくりした。<br />
デフォルトでUTF-8じゃないのか。<br />
気になったので調べようと思った。</p>
<h1 id="調べた"><a href="#%E8%AA%BF%E3%81%B9%E3%81%9F">調べた</a></h1>
<h1 id="わかんなかった"><a href="#%E3%82%8F%E3%81%8B%E3%82%93%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F">わかんなかった</a></h1>
<p>「指定しないと文字化けする可能性があるので、ちゃんと指定しましょう」<br />
そんなことはわかってるんだ。<br />
わかった上で、指定しなかったらどうなるか知りたいんだ。<br />
指定しなかったら文字化けする? 違う、そうじゃない。いや、そうなんだけど、そうじゃない。知りたいのはそこじゃない。どのエンコーディングが採用されるのか、だ。</p>
<p>apacheにAddDefaultCharsetとかなかったし、ブラウザ側だと思うんだけどなー。</p>
<p>それっぽいこと書いてある<a target="_blank" rel="nofollow noopener" href="http://www.ic.daito.ac.jp/~mizutani/html/default_encode.html">サイト</a>もあったが、ちょっと古い。<br />
chrome ver.35って。俺のchrome、ver.73だぞ。そんな項目ねーよ。<br />
というか、chromeは<a target="_blank" rel="nofollow noopener" href="https://www.beginnerweb.net/chrome.html">もうエンコード指定できない</a>。<br />
まー、大半のユーザーは「エンコードとは何ぞ」って感じだから、意識させないってのは、わからなくもない。charset指定しないサイトなんて今時ないだろうし。でも、だからこそ、なおのこと指定しなかった場合の挙動がよくわからん。</p>
<p>普段、ちゃんと作る時は、まず間違いなく指定するmetaタグだし、わからなくても困らないっちゃ困らないし、不毛なので調べるのをやめた。</p>
<h1 id="結論"><a href="#%E7%B5%90%E8%AB%96">結論</a></h1>
<ul>
<li>エンコードはちゃんと指定しよう</li>
<li>どなたか、ご存知でしたら優しく教えてください。</li>
</ul>
hammhiko