2019年 09月の投稿を表示しています

ごみばこいんのjQuery依存をなくそうとした

ごみばこいんの jQuery 依存をなくそうとした。
背景としては jQuery の読み込みに 30KB くらい使っていて、でも jQuery をそんなに大活用しているわけでもなくて。
じゃあいらんか、と。

zepto にすることも考えた。が、せっかくなのでまるっと消すことにした。
GitHub - madrobby/zepto: Zepto.js is a minimalist JavaScript library for modern browsers with a jQuery-compatible API


自分で書いていたやつから jQuery な記載を消していった。
$は document.querySelector とか document.querySelectorAll とかで。
XHR がちょっと面倒だなあ…とか思ったけど fetch API あるやん!で解決した、便利。

Fetch API - Web API | MDN

あとは Chrome の DevTool でコンソールで試しながら変数あるかなあとか見たりしながら書いてた。


画像の表示に使っていた lity という lightbox なライブラリが jQuery 依存していたので別のものに切り替える必要があった。

GitHub - jsor/lity: Lightweight accessible and responsive lightbox.

cdnjs を lightbox で探していたらよさそうなのがあった。
luminous という lightbox なライブラリで lity と容量もあまりかわらない(3KB くらい)っぽい。

GitHub - imgix/luminous: A simple lightweight no-dependencies JavaScript lightbox.

imgix 画像加工ができる CDN サービスをやっている会社が提供している lightbox なライブラリとのこと。

imgix • Real-time image processing and image CDN

余談にはなるが日本で同様のものだと ImageFlux が有名だろうか。むしろ画像 CDN でパラメータで扱うのはこれしかしらなかった。。
画像変換サービス ImageFlux|さくらインターネット


あと jQuery に依存していたわけではないが Chrome の DevTool から Performance タブで Load イベントまでの様子を測ってみると Highlight.js がそこそこに時間を使っていてなんとかしたいなあと。

GitHub - highlightjs/highlight.js: Javascript syntax highlighter

これまたいくつか調べてみると prism なるものが見つかった。
テーマを切り替えることもできるし、様々な言語のハイライトに対応しているし、プラグインで拡張できるし、でっかいハイライトするなら WebWorker を使っての asyncRender も有効に使えそうな感じがする。

GitHub - PrismJS/prism: Lightweight robust elegant syntax highlighting.

実際にいれてみると、言語検出機能がないので、特に言語を指定せずにざっくり使っていた部分についてハイライトが効かなかった。のでそれっぽいものを自分でざっくり書いた WordPress で使うので、投稿についたタグの情報とか、コードの中身とかからざっくり判断でわりかし十分。多分間違っていても、そんなに気にならない。


そのほか、処理順を入れ替えたり、遅いやつをもっと遅延させて影響なくしたり requestAnimationFrame を使ってみるなどした。
変更する前と比べて、表示されるまでがだいぶ早くなった、と思う。(主観)

Google App Script で Gmail の掃除をする

久しぶりに Google App Script を見たらものすごいアップデートされているような気がする。

こんな管理画面的なものあったっけ…。。
自分のプロジェクト - Apps Script

本題 Github からくる通知メールや、各種メルマガ、その他さまざまな通知系のメールが Gmail の受信箱の大半を圧迫しており、まともに見れなくなってしまった。
フィルタを設定したものの、すでに受信したメールを一括削除することが、どうにも Gmail 上からはうまく動いていないっぽい。

というわけで Google App Script を使って不要なメールをドカッと削除する。

こんな感じのお手軽な関数で十分。

function myFunction() {
  var query = 'label:xxx subject:yyy'; // ここに任意の検索クエリを書く
  while(true) {
    var threads = GmailApp.search(query, 0, 500);
    if (threads.length <= 0) {
      return
    }
    for (var i = 0; i < 5; i++) {
      GmailApp.moveThreadsToTrash(threads.slice(i*100, i*100 + 100));
    }
  }
}

API ドキュメントはここ。
Class GmailApp | Apps Script | Google Developers

初回だけ手動で実行し Gmail に関する権限を取得する必要がある。

あとは自動トリガーに設定 2 時間に 1 回実行くらいで。もっと早い頻度で動かすこともできるのだが、早すぎると Gmail の API で制限に引っかかってしまう。気長にやるのがよさそう。
しばらく放置したのちに見るといらないメールがすべて消え去ってすっきり。

htpasswdをちゃんと使う

なんだか htpasswd で長いパスワードを設定してもちゃんと機能していないっぽい…、いやいや Basic 認証だから短い文字列しか使えない、なんていう制約はない、のでは…?ということで調べた。結果、ドキュメントかコマンドのヘルプ表示に書いてあることがすべてだった。

まずは、おや??と思ったサーバが使っていたのが Apache 2.2 だったので、そちらのドキュメントを見てみる。

htpasswd - Manage user files for basic authentication - Apache HTTP Server Version 2.2

-m
Use MD5 encryption for passwords. This is the default (since version 2.2.18).

-d
Use crypt() encryption for passwords. This is not supported by the httpd server on Windows and Netware and TPF.
This algorithm limits the password length to 8 characters. This algorithm is insecure by today's standards. It used to be the default algorithm until version 2.2.17.

ち、ちしきもソフトウェアも更新されていない。。。
古い httpd を使っていたので、そのまま更新してパスワードファイルを作り直し。

後述するがデフォルトになっている MD5 を利用するのがいいっぽい。

$ sudo yum update httpd

$ htpasswd -inm foo-user

ついでに Apache 2.4 を使っている別サーバの様子も確認。

htpasswd - Manage user files for basic authentication - Apache HTTP Server Version 2.4

こちらは bcrypt が使えたり SHA が insecure だよといった情報も増えている。

-m
Use MD5 encryption for passwords. This is the default (since version 2.2.18).

-B
Use bcrypt encryption for passwords. This is currently considered to be very secure.

-C
This flag is only allowed in combination with -B (bcrypt encryption). It sets the computing time used for the bcrypt algorithm (higher is more secure but slower default: 5 valid: 4 to 17).

-d
Use crypt() encryption for passwords. This is not supported by the httpd server on Windows and Netware. This algorithm limits the password length to 8 characters. This algorithm is insecure by today's standards. It used to be the default algorithm until version 2.2.17.

-s
Use SHA encryption for passwords. Facilitates migration from/to Netscape servers using the LDAP Directory Interchange Format (ldif). This algorithm is insecure by today's standards.

なんで SHA が insecure なのかは下の Security Considerations トピックに書いてある。
SHA を指定するとパスワードに対してソルトが設定されず毎回同じ値になるのがよろしくないとのこと。

というわけでこちらの Apache 2.4 がいるサーバでは bcrypt を使う、ついでにコストパラメータもちょっと上げてみる。

$ htpasswd -nb -C 10 bar-user
...

実際に各種作って比べるとこんな感じ。
いままでのそれよりだいぶ雰囲気がちがう。。。

$ cat htpasswd_test.sh
#!/bin/sh

password=test-foo-bar

echo 'raw'
echo $password | htpasswd -inp test
echo 'crypt()'
echo $password | htpasswd -ind test
echo 'sha'
echo $password | htpasswd -ins test
echo 'md5'
echo $password | htpasswd -inm test
echo 'bcrypt()'
echo $password | htpasswd -inB test
echo 'bcrypt() with cost=10'
echo $password | htpasswd -inB -C 10 test


$ htpasswd_test.sh

raw
Warning: storing passwords as plain text might just not work on this platform.
test:test-foo-bar

crypt()
Warning: Password truncated to 8 characters by CRYPT algorithm.
test:19KcNn65a0Ovo

sha
test:{SHA}FsxBAWUFKrRlyJof3T+q9X6QfNE=

md5
test:$apr1$/nZjVA4i$5.tcV5puEwC6t0xQzuBfK1

bcrypt()
test:$2y$05$W4354fiJgesqn4/EXJhOsemadtHoX.PevbZA76fptomx09NAvbQTa

bcrypt() with cost=10
test:$2y$10$A6DDhPBzUOQA3aRui6acK.IaRpe0bqL9m5dcER4Gp0Bwk/SzEYhNa