GithubHelp home page GithubHelp logo

azu / english-notes Goto Github PK

View Code? Open in Web Editor NEW
9.0 9.0 0.0 443 KB

English notes on GitHub Issues.

Home Page: https://english-notes.jser.workers.dev/

TypeScript 98.50% JavaScript 1.50%
blog cloudflare-worker english

english-notes's Introduction

Hi! I'm @azu.

I've worked on Open Source since 2010. I've created 500+ npm pacakges and These are 10 million downloads a year.

I've created and now maintain many open-source projects:

  • textlint is a linter for natural languages
  • Secretlint is a pluggable linting tool to prevent committing credential.
  • HonKit build books using Markdown
  • etc...

Also, I the main writer of some blogs about JavaScript and ECMAScript.

I've written JavaScript books as Open Source in Japanese.

If you want to support me, please see GitHub Sponsors♥️

❓If you want to know about me, create AMA Issue

english-notes's People

Contributors

azu avatar waka avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

english-notes's Issues

ある機能をモジュールに切り出すリファクタリング

Carve out extensions to Window Interface into its own section;

引用元: dap commit: Carve out extensions to Window Interface into its own section; from Mercurial notifier on 2014-06-06 ([email protected] from June 2014).

Carve out A to B.

AをBに切り出す。

以下の様な表現もあるみたい。

carve out time to ~する時間を努力して作る、時間を捻出して~する

carve out the direction of ~の方向を切り開く[決める]

とか見ると、movingよりも強い意志がある感じで使い勝手良さそう。

"こんにちは" は "konnichiwa" と読み、"konnichiha" と書き、 "konnnichiha" と入力する

VSCodeのテスト方法にIMEの使い方があって、英語で書かれている英語ユーザー向けのIMEの使い方がまとまって良いドキュメントだった。

その中で次のようなtypoがあった。

konnichiha should result in "こんいちは"

この問題を報告しようとしてIssueを作っていたら、"こんにちは"はかなり難しい単語なんだなと思った。

なんで"こんいちは"になってるんだろと思ったけど、ローマ字表記では"konnichiha"が正しくて、
そのままIMEで入力する"こんいちは"となってしまうことに気づいた。

全然意識してなかったけどnnとして入力しないと"こんにちは"にならなかった。

"konnichiha"を調べていると、"こんにちは"と"こんにちわ"はどっちが正しいのという質問も多かった。

"こんにちは"は発音とローマ字の表記も違うとかなり面倒なテストケースなんだなと思った。

まとめると次のように、ローマ字表記と発音とIMEのローマ字入力が全部違うという複雑性が"こんにちは"という単語に含まれている。

  • "こんにちは" is correct word in japanese
  • "こんにちは" pronunciation is "ko-n-ni-chi-wa" in japanese
  • "こんにちは" spelling is "ko-n-ni-chi-ha" in Romanization of Japanese
  • "こんにちは" typing is "ko-nn-ni-chi-ha" in IME(Romaji input mode. It is default behavior in almost IME)

この問題をTypo on IME Test Wiki というIssueに起こすのに1時間ぐらいかかってしまった。

英語でこの辺を説明している文章が見つけられなかった。
日本語だと次のページが詳しく書かれていた。

新装版 英文法のトリセツ じっくり基礎編を読んだ

新装版 英文法のトリセツ じっくり基礎編 | 阿川 イチロヲ | 英語 | Kindleストア | Amazon

  • 疑問詞 5w1hのところが良かった
  • 疑問詞の文法良くわかってなかった
What book / do you like?

こういう切り方がいまいちイメージできてなかったので、do が抜けがちだった気がする。

  • 主語と動詞が必要って話が全体的にされていて
    • ~ingだと形容詞になるから、be動詞が前にふえるんだよって話が良かった

英語だと動詞が主役なことが多くて、これより強いのは canとかwill みたいな助動詞なのかなと思った(動詞を変化させるという意味で)

  • SVOとSVOOの場合、SVOOの方が自然に感じるって話が面白かった
I'll send my book to Mr. Nakata.

I'll send Mr. Nakata my book

日本語だと前者の方がわかりやすく感じるけど、やっぱり前者のSVOOが良く使われる感じなんだなー。

He bakes a cake soft

He bakes a cake and the cake is soft.

の2文を省略的な話で、英語では最初に結論言ってから、後からどんどん追加されていくのを待っているみたいな感覚の話良かった。

自動翻訳大全を読んだ

自動翻訳大全というGoogle翻訳を上手く使って英語を読み書きする本を読んだ。

自動翻訳のテクニックの話

  • , で改行入れると読みやすくなる
  • , and も同じ
  • 接続詞も同じ

みたいな話があって面白かった。

それをやるためのツールを書いてみた。
Google翻訳中にダブルクリックで原文に戻ってContentEditable状態にして改行を追加したりとかの編集をして、Escで再翻訳する仕組み。
結構変な翻訳を直しながら読めるので良い感じ。

この他にも自動翻訳大全だと音声翻訳アプリの比較とか英語を話すための3つの語順の話が面白かった。

image

自動翻訳大全 P107より

この語順でいろんな例文の言い方を見ていく感じのやつ。

S V O (主語 + 動詞 + 目的語)だと単語が難しくなると息詰まることがあるので、

  • A = B
  • 主語 + 動詞 + A = B(動詞は10種類 紹介されてた)
  • 主語 + 動詞 + A + B(動詞は14種類 紹介されてた)

のパターンなら、動詞とかがある程度種類が限られて詰まりにくいって話があって面白かった。

たとえば、主語 + 動詞 + A = Bなら

I belive the testing result true
I think A B

とか。

主語 + 動詞 + A + B なら

They gave me a present
I tell you the truth

みたいなパターン。

この辺の英文法は正直勘でしかわかってないので、分かりやすくていい本ってないかなー?
(英文法の電子書籍がなくて面倒。ウェブサイトとかでもよさそう)

自分で英語書く場合も自動翻訳を書けて意味通るかみたいなチェックを結構やっているので、その辺に近い話もあった気がする。自動翻訳は主語とか抜かすとだめみたいな話。

一度ざっと読んだだけなので、もう一度読んでみようと思った。

Cloudflare Workers + GitHub Issues + GitHub Actionsでブログを作る

英語の勉強ブログみたいの復帰させようとして、GitHubでやるのがいいと思ってたタイミングでGitHub IssueをCMSとして使う話を見たので作った。

元ネタ:

元ネタからの変更点

  • URLを issueの number (連番) ベースにした
  • Cloudflare Workersの無料枠で動くようにするため、KVではなくCache APIに変更

URLを number のIDベースにしたかったので、GraphQLのクエリも特定のIssue Idを元に取得するものへ変更している。

const ISSUE_QUERY = `
query issue($owner: String!, $repo: String!, $id: Int!) {
repository(owner: $owner, name: $repo) {
issue(number: $id) {
number
title
bodyHTML
bodyText
labels(first: 5) {
nodes {
name
}
}
url
createdAt,
comments(first: 1){
totalCount
}
}
}
}
`;

このクエリをもっと頑張ると、特定のissueやprのURLからその情報をまとめて取得するクエリとかも作れる。
これをREST APIでやるとn回のAPIコールする必要があるけど、GraphQLだと1回でできる(ただし、クエリもそれなりに遅い。数十コだと2-3秒かかることある)

元のコードだと、Cloudflareの$5/monthで使えるCloudflare Workers KVという機能を使っていた。

ただ、元データはIssueでブログ自体はIssueの別Viewでしかないので、ただのキャッシュで問題なさそうと思ってCache APIベースに変更した。
Cloudflare Workers KVはKey-Value Storageなので、もっとインタラクティブな機能とか、デプロイせずに状態を変更したい場合は必要になってくる感じ。
ブログみたいなやつでは、リクエストに対するレスポンスがキャッシュできて、それが配信できればよかったのでCache APIでほぼカバーできていた。

Cache APIの制限として、キャッシュのDeleteや中身を見ての処理などは制限されていた。
Cache APIはService WorkerででてくるCache インターフェイスの実装になっているけど、caches.delete(namespace)cache.keys()cache.has() などは実装されてなくて、キャシュを列挙したりキャッシュの中身を見ることはできないようになっていた。

なので、Cache APIではopaque responseを扱う感じになって、明示的にキャッシュを中身を見て処理を分ける - つまりCache APIをKey-Value Storageみたいに使うようにはできてなかった。

デプロイしたときに、Cache APIのキャッシュをすべてクリアしたい場合はcaches.open(namespace)で、デプロイ時に新しいキーを渡してそれを元にキャッシュを扱うと擬似的にキャッシュをクリアできる。

const currentCaches = await caches.open(新しいネームスペース);

CloudflareのAPIにPurge All Filesもあるけど、workers_dev(worker.devドメイン)を使っている場合は、そもそもzone idがないため、このAPIの使い方が謎な状態になっていた。(よくわからない)

Cloudflare Workers KVの場合は、ちゃんと削除コマンドが用意されているので、Issueを変更したらキャッシュだけ消すみたいのも実装できる。
GitHub Actionでcurl叩くのに10秒ぐらいなので、大体20秒ぐらいで反映されるブログが作れると思う。

今のCache APIを使った仕組みだと、Issueやコードに変更があるたびにGitHub Actionsでデプロイしているので、反映まで1-2分かかる感じになっている。

デバッグ

Cache APIは wrangler preview では無効化されているので、基本的にデプロイしないとデバッグできない。
また、Cloudflare Workerにはデバッグ用のダッシュボードとかがまだないので(管理画面はログすら見れない)、wrangler tailを使ってデプロイしたもの標準出力/標準エラーをコンソールに出す感じでデバッグした。

wrangler tailの使い方がめっちゃわかりにくいので使い方のメモ。

デフォルトのCloudflare Worker用のトークンには"Workers Tails"のパーミッションがついてないので、トークンにパーミッションをつけるところから始める必要がある(最小権限の原則らしい)

次のようなエラーがでた場合は"Workers Tails"のパーミッションがついてない。

🦚  Setting up log streaming from Worker script "xxx". Using ports 8080 and 8081.
Closing tail session...                                                                                                                                                                                                                                                                                                                                                                                                                  
Error: ⚠️  Code 10000: Authentication error
🕵️  Make sure your API token has permission to both edit and read workers on your account

wrangler tail の使い方

  1. https://dash.cloudflare.com/profile/api-tokens からログインしてるトークンに"アカウント > Workers Tails > 読み取り"の権限を追加する
  2. wrangler tail --env production で待機する(たまに失敗する)
  3. 実際にアクセスしてエラーを発生させる

image

パフォーマンス

元ネタとほぼ同じ。

Lighthouse

Network

GitHub Issueを直で見たときも最速は30msでDocumentは返ってくる。
ただ他のJavaScriptをまったり、たまにつっかかるときがある感じ。

image

ブログの方は余計なものがまだ何もないので、常にその最速のパターンを引いている感じ。

GitHubリポジトリを別の見せ方したいことは結構あるので、そういう用途にはCloudflare Workersは結構向いているかもしれない。

エディタ

Issue画面でそのまま入力している。

textlint editorとかGrammarlyの拡張とか動くし、画像もそのままアップロードできるし、リロードで保存されてるからまあ普通によさそう。

もっといいエディタ使いたかったらコピペするとか、korefileみたいのを使ってリポジトリをCMS的に使うとかもできるけどあんまり気軽じゃなくなるので、ウェブで完結する形であることに意味がありそう。

image

おもしろいポイント

GitHub Issueなので、 #1@azu みたいなリファレンスリンクやメンションがもそのままブログにリンクとして反映される。
これは、レンダリングはGitHub側がやっているHTMLをそのまま表示しているからだと思う。

GitHubのCSSを使うと表示も似た感じになる。(コードリンクの埋め込みやシンタックスハイライトも機能する)

この発想自体は、昔書いてたものと似ているので、結構馴染みある。

これを書いてたときと違ってGitHub Actionsがあるので、自分のブログ(GitHub Issues)に対するbotみたいなものが簡単につくれるというのがおもしろいポイントになるかもしれない。

特定のワードがあったらIssueに反映する仕組みとか、そういうのもGitHub Actionsでイベントで書けるし、GraphQLがかなり柔軟なのでREST APIでは面倒なアグリゲーションとかもできてしまうので、いろいろ遊び方がありそう。

その他

  • Jekyllとかのブログと違って、Pull Requestで修正みたいなことができない
    • 権限的にCollaboratorにやってもらうしかできない
  • レビューみたいなのはやりにくい(PRだとコメント書けるのでセルフレビューしやすいし、CIもつなぎ込みやすい)
  • ファイルベースではないので、まとめて編集みたいのは仕組みが必要になる
  • ローカルで編集するときにgit pullしなくてもいいので楽
  • コンテンツとコメント欄が一体的になっているので遊びの余地がありそう
  • GitHub Issueはmp4のアップロードに対応していない
  • デプロイ時に記事やサイトを静的サイトとしてビルドするわけじゃないので、反映が比較的早い
    • リクエスト受けたタイミングでSSRして、それをCDNにキャッシュというのをCDN Edgeで動かしている
    • キャッシュがない場合はSSRを含め表示されるまで400~500msぐらいかかってる

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.