Diary

@ssig33

キャッシュできてるけど思ったとおりに飛んでねえな

30 Jan 2020 Thu 23:37

もうちょっといじって

Cloudflare(HTTPS化) => Fastly(キャッシュ) => Cloud Run(ここで next.js 動かす) => Cloudflare => Fastly => Cloud Run(Go で書かれた API)

という構成にした。

30 Jan 2020 Thu 23:35

CDN 沢山つかってるとキャッシュとばすのまじでめんどう

30 Jan 2020 Thu 22:58

キャッシュ

30 Jan 2020 Thu 22:34

おなかすいた、、、

30 Jan 2020 Thu 18:13

コアラ

30 Jan 2020 Thu 18:00

ゴリラ

30 Jan 2020 Thu 17:59

サイトの構成かえた

Cloudflare (HTTPS 化) => Fastly (キャッシュなど) => ZEIT (next.js の実行) => Fastly(キャッシュ) => Cloud Run (Go で書かれた API)

というような構成にした。だいぶ破滅的でやばいがいろいろいじりやすくはなった。

30 Jan 2020 Thu 17:45

ジャバ

30 Jan 2020 Thu 15:33

ねむい

30 Jan 2020 Thu 14:37

canvas を使って画像をトリミングする

const img = document.querySelector('img');
const canvas = document.createElement('canvas');
canvas.width = width;
canvas.height = height;
const context = canvas.getContext("2d");
context.drawImage(img, x, y, width, height, 0, 0, width, height);

というようなコードが紹介されることが多いですが、ダメです。これはディスプレイの解像度が伝統的な 96DPI になっていることに依存したコードで、現代的な HiDPI 環境では思った通りに動きません。

こうした問題に対応するためにwindow.devicePixelRatioという値を使用することができます。

const ratio = window.devicePixelRatio;
const img = document.querySelector('img');
const canvas = document.createElement('canvas');
canvas.width = width * ratio;
canvas.height = height * ratio;
const context = canvas.getContext("2d");
context.drawImage(img, x * ratio, y * ratio, width * ratio, height * ratio, 0, 0, width * ratio, height * ratio);

というような感じで devicePixelRatio をかけてサイズを補正してあげれば大丈夫です。

14 Jan 2020 Tue 14:22

Qrio (旧モデル)から Sesami mini にかえた

転居に共ない鍵が 2 個ついてるドアになったので Sesami mini に変えてみた。セールで 1 個 1 万ちょいとかで買えた。

Pros

  • 安い
  • 取り付けしやすい
    • 高さ調整の仕組みはこっちのほうが使いやすいと思う
  • 自動開錠は Sesami のほうがまともに動くと思う
    • とはいえ家の中の移動で自動開錠誤爆されたりするので正直今一ではある
    • Qrio は開かない、こっちは開きすぎという印象
      • 自動開錠開きすぎ問題に対処するための答えがノック開錠という機能なのだと思うが、ノックのほうも誤爆多い感じなのでいまいちです

Cons

  • 開閉の認識が正直いまいち
    • 閉まってるのに開いてる(あるいは逆)と認識しがちなので、開閉の設定のところでちゃんと動くような設定を詰める必要がある
    • これがあるので完全に Sesami だけに頼って鍵は一切持ち歩かないという運用はちょっと怖い
      • 怖いけどまあ最悪どうにかなるだろの精神で鍵持ち歩いてませんが
  • 鍵の共有が鍵の近くじゃないとできない
    • 遠隔で鍵をわたすには WiFi に接続するための高いやつを買っとかないとダメみたい
    • 家にくる予定の人に「鍵渡しとくからよろしく」とかは出来ない
      • まあそんなことしたの結局 2 回ぐらいしかないんでそんな問題ではないと思う

ほかにもいろいろあるらしいが乗り換えた感想としてはこんなもん。開閉の認識がいまいちという問題があるのでちょっと怖い。そういうものだと認識して確認しながら使ってるので今のところ締め出されなどの問題は発生していないのだけど、 Qrio と比較すると安心感は低い。

とはいえ値段の差を考えればというところではある。

Qrio Lock (新モデル)のことはよく知りませんが、金があるなら Qrio Lock のほうがいいのではないかという予感はしている。しかしまあ Sesami でも別に困りはしてないです、以上です。

18 Dec 2019 Wed 17:18

React でレンダリングを遅延させたい ということがありまして。

const Todesking = ()=> {
  return <>
    <LightComponent />
    <UltraHeavyComponent />
  </>
}

このようなコンポーネント。 LightComponent のレンダリングは一瞬、UltraHeavyComponent は複雑な state の処理が遅い。で、 LightComponent の中身はとりあえずさっさと表示しておくと UX が向上する、というような事例。そういうことありませんかね?

そこで以下のようなことをした。

const useDelay = msec => {
  const [waiting, setWaiting] = useState(true);
  useEffect(()=>{
    setTimeout(()=> setWaiting(false), msec);
  }, []);
  return waiting
}

const Todesking = ()=> {
  const waiting = useDelay(200);
  
  return <>
    <LightComponent />
    {!waiting && <UltraHeavyComponent />}
  </>
}

指定した msec だけレンダリングの発生を遅延させる。今回はトランジションとのかねあいなどでレンダリング開始を遅延させる時間を場面ごとに調整したかったので、こんな感じのカスタムフックを作ってみました。

完全なる大破滅、こんなことをするなら UltraHeavyComponent をどうにかしろという話なのですが、とりあえず逃げなければならない時だってある。

05 Dec 2019 Thu 15:44

Rails の system test case でブラウザリロードのテスト

そういうことをしたくなることもあると思います。一般的には minitest より rspec を使ってる人が多いような気はしますがそのあたりは適当に読み替えてください(今は rspec も system test case 使えるんだっけ?よく知らない)。

Capybara には evaluate_script というものがあり、ブラウザには performanceNavigation.type(MDN) というものがあります。

というわけですっごい雑ですが以下のような感じでリロードの仕様に関するテストが書けます。

以下のようなページがあるとして

<h1>todesking</1>
<button class="todesprincess" onClick={()=> location.reload()}>リロード</button>
test "button を押すとブラウザがリロードされる" do
  visit "/todesking"
  assert_selector "button.todesprincess", count: 1
  
  assert_equal 0, page.evaluate_script("performance.navigation.type")

  
  find("button.todesprincess").click()
  
  reloaded = false
  100.times do
    reloaded = 1 == page.evaluate_script("performance.navigation.type")
    break if reloaded
    sleep 0.1
  end
  assert reloaded
end

こんなかんじ。これでとりあえずボタン押したら 10 秒以内にはリロードされるということがテストできます。なんかもうちょっとがんばればループとか使わずにテスト出来そうな予感はありますがとりあえずこれで最低限はいける

03 Dec 2019 Tue 10:19

LAN ケーブルを作る作業員として余生を過している

18 Nov 2019 Mon 14:25

昔はサーバー代ケチるためにめちゃくちゃやるのが好きだったんだけど 今は Cloud Run とかのおかげでほぼなんでもかんでもタダになってかつ全然全体の構成にも無理がないみたいになって、世の中便利になったんだけどこれはこれで非常に寂しいものがある。

14 Nov 2019 Thu 16:57

Go でひさしぶりに Web アプリを書いてみたが 特に思うところは、、、という程度の書き味であった

14 Nov 2019 Thu 16:55

非常にだるい

14 Nov 2019 Thu 16:36

ノーパンクタイヤを買った

ライダーズカフェというところのノーパンクタイヤを買ってみた。

とりあえずつけてちょっと走り回ってみた。

まず、取り付けはこの世の地獄。楽天などでレビューを見ると 30-120 分はかかるとみんな脅しているが実際それくらいかかるのは覚悟したほうが良い。金属製のタイヤレバーを持っているとわりと話が速いと思う。ある程度はめ込むことができたら、その部分をテープでぐるぐる巻きにして次にいくみたいな破滅的な手法も非常に有効。また、以下の他社製品の取り付けの様子も参考になる

乗り心地はかなり悪くなる。今回後輪だけこれにしてみたが、振動がダイレクトに体に来るので結構不愉快。一方で速度低下は一切感じない。またスリップもない。今回買う前にこの手の商品をいくつか調べたのだが「たしかにパンクしないがいつでもパンクしてるような乗り心地」みたいなレビューがついている商品が多くかなり身構えていたのだが、これにかんしてはそういうことはなくかなりよかった。

今回これを買った理由としては、

  1. リムがへこんでそこからパンクしまくるホイールがある
  2. とはいえ金使いたくないしそれを使いまわしたい
  3. ノーパンクタイヤならまあなんとかなるんでは

という思惑で、これにかんしてはうまくいったといえる。一方で、振動がここまでガタガタ来るところからするとフレームやホイール、特にホイールにはかなりのダメージが行くと考えたほうが良いと思う。今回は廃ホイールの再利用という理由もあったのでこれで非常に満足しているが、じゃあみんなもこれ買えばいいよとは言えない。

そんなに長距離乗るわけでもない自転車でパンクがまじでだるいみたいな人は選択肢に入れてもいいと思う。調べた限りこのジャンルの最有力選択肢のタンナスというメーカーと比較して 1/3 ぐらいの値段なのでとりあえず買ってみるみたいなことができる価格帯なので。

03 Nov 2019 Sun 21:38

かに

24 Oct 2019 Thu 16:14

Windows が生成する EFI System Partition (ESP) を拡張する ということをしたくなることがあるかと思います。具体的には

  1. Windows が入ってたところにマルチブートで Linux 入れたい
  2. Windows が生成した ESP を boot として使いまわしたい
  3. しかし Windows が生成した ESP は 100MB しかないのでカーネルが複数入らない
  • Linux 用に ESP 別途生成すればいいんですかね? ESP mutiple とかで検索しても「ESP を複数作る必要はない、使い回せ」みたいなことばっか書かれていて辛い

というような状況。

という Q&A を読むと、 MiniTool Partition Wizard Free を使うとよいであろう、とあります。これで実際に希望の要件を達成することができましたが、若干面倒な操作が必要でした。

Windows を何も考えずにインストールすると

  • ESP :100MB
  • Microsoft Reserved (MSR): 16MB
  • C:

の 3 個が生成されることが知られています。で、この MSR がなんなのか俺は知らないし知ろうとも思っていないのだがとにかく消してはいかんらしい。

MiniTool Partition Wizard Free では C: を縮小して後ろにつめることもできますし、 ESP を拡張することもできるのですが、 MSR を処理することは一見できないように見えます。

そこで Google に聞くと

What you can do is to Copy the MSR partition to an unallocated space block

とあるので信じます。すなわち MiniTool Partition Wizard Free 上で

  1. C: を縮小して後ろにずらす
  2. MSR を後ろにコピーする形でずらす
  3. もとの MSR を削除する;
  4. ESP を空いた部分に拡張する

という操作を予約し、適用します。すると期待どおりに ESP が拡張されますし、 MSR をこのように移動させても Windows の挙動に問題はないようです。ようですと書いたのはこの操作をしてからまだ 10 時間程度しか経過していないために副作用があるかどうかを知らないからです。

とにかくこれで Windows が生成した ESP を拡張して /boot に沢山のカーネルを入れることができて便利になりました、よかったですね。

19 Sep 2019 Thu 14:00

CircleCI (Performance Plan) vs. Github Actions

結論: CircleCI を買おう

現在ユビレジでは CI は CircleCI (Performance Plan)と TravisCI を使っていて、

  • CircleCI:
    • サーバーサイド(いろんな言語がある)
    • Web フロントエンド(Rails アプリのなかで webpack が動いていたり、 create-react-app で作られたペラっとしたものがあったりいろいろある)
  • TravisCI:
    • iOS アプリ

というような感じで使い分けている。 Performance Plan なんだから iOS のも Travis から引っ越せばいいんじゃねえの?と思わんでもないのだが、

  • Travis の annual 課金がまだ残ってる
  • iOS の CI と TravisCI と CircleCI に全部詳しいかつやる気がある人はいない

という事情があり、このようになっている。

ここで CircleCI の Performance Plan について簡単に説明すると

  • 課金体系は従量課金
    • 使ってる人数*月15ドルの固定課金
    • 使ったインスタンスの時間あたりの課金
  • 並列数は無制限
    • 昔は UI 上 200 並列が上限であるように見えてたけど実際どうなのかは不明。この表示自体はシステムを従来プランと使い回していた故のように思える
    • 200 並列にまだ頭ぶつけたことないので実際どうなのかは知らない、気になる人は営業に問い合わせてみましょう
  • 開始時に営業に問い合わせが必要
    • 日本ブランチはあるので日本語でやり取り可能です

といった特徴があります。簡単に言うと安くて便利。というわけで CircleCI Performance Plan でテストを回していたプロダクトの一つで Github Actions を使ってみることにしました。

Github Actions はだいたい以下のような特徴があります

  • リポジトリごとに 20 並列までいける
  • OSS なら無料、 Private は 11 月から有料化
    • プランはまだ未発表
  • 裏側には Azure Pipelines というものが使われている

今回何故か Beta 開始日から我々の組織では Actions (CI)を使うことができたので、今回僕が面倒(?)をみているプロダクトの一つで Github Actions を使用してみました。 create-react-app で開始した SPA で(現在では eject 済み)、純粋に Web フロントエンドだけが存在しているリポジトリです。テストは全て E2E テストで、 jest-puppeteer を使っています。あんまり関係ない話ですがどうも Web フロントエンド界隈ではコンポーネントのユニットテストと型でアプリを守るという思想が流行っているようですが、これらは全て無意味だと僕は思っています。型は VSCode の補完で便利という程度に捉えておくほうがよいと思う。ユニットテストはクソ。

リポジトリごとに 20 並列という制限は、大規模なモノリスがあり多くの従業員がそこで作業をしているという場合簡単に頭をぶつけることになるでしょう。ただし今回僕が Actions を仮投入してみたプロダクトは開発者が 3 名しかいないプロダクトでしたのでそこが問題になることはありませんでした。

プランについては発表しようにも評価のしようがありません。

裏側である Azure Pipelines というか CI の実行部分については、これはもう悲惨としか言いようがない水準です。

今回 CircleCI と平行するかたちで Github Actions の利用をはじめ、落ち着いてきたら Actions のほうだけに統一みたいなつもりでいたのですが、一向に落ち着くことはなかったので 8/13 に使用しはじめた Github Actions ですが 9/4 で使用を中止し CircleCI だけに戻しました。

あまりにもサービスの品質に問題を感じるため、周囲のエンジニアにインタビューをとってみましたが、 Azure Pipelines 自体が悲惨な品質で、リリース以来あまり改善されてこなかったという話をいくつか聞くことができました。

なお、今回のプロダクトでは CI で実行するあれこれの処理を Makefile に記述し、 CI の設定ファイル内では make hogehoge みたいのだけを書くようにしていたこともあり、 Github Actions の利用開始自体は 30 分もかからずに行なうことができました。このあたり一切面倒なところはありません。

全体として、 Github Actions は非常にストレスフルなプロダクトで、仕事としてやっているプロダクトで金銭的な出費が許される場合には CircleCI の Performance プランを使用することを強くオススメします。11 月に発表される料金がかなり安かったとしてもそれはそうで、出費を節約した結果 CI の不可解な挙動でエンジニアの生産性が落ちるようでは話になりません。

Azure Pipelines の改善が進まなかったことには、そもそもサービスのユーザーが多くなくメトリクスなりユーザーの意見なりを十分に収集できていなかったという可能性はあります。今後 Actions 経由でこれを利用する開発者が増えれば改善されていく可能性はあります。ただし、僕はこれまで Azure のマネージドサービスについて多くの場合において品質面での問題を感じていました。今回だけまともになることあるかなあ、、、

来年の夏ぐらいにまた検証してみたい。

17 Sep 2019 Tue 14:01

待遇にも文句ないしプロダクトにも愛着は強いんだけど 環境への飽きみたいのが出てきていて、これはまあどうしようもないねえ。

20 Aug 2019 Tue 12:01

最近同人誌即売会いっても 机全部みればいいじゃんみたいな感じで事前にカタログみたりしなくなっちゃって。なんかでも机全部みるのってそれはそれで見落しありそうということでティアズマガジンちゃんと見てみることにした。

20 Aug 2019 Tue 12:00

ここのバックエンド Cloud Run にしたらほとんど運用費タダになった。 そこそこアクセスあったからどうなんだろとか思ってたけど Fastly がほぼ全部吸ってくれるから最高。

07 Jul 2019 Sun 01:27

だるい

05 Jul 2019 Fri 18:56

はい

05 Jul 2019 Fri 18:56

Host ヘッダー上書きしたらアプリの動作おかしくなった けどまあなんとかなるだろう。

05 Jul 2019 Fri 18:29

ここのバックエンド Cloud Run にした

ここはもともと Cloudflare (HTTPS化) => Fastly (キャッシュ) => GKE というかんじで動いていて、 GKE の部分を Cloud Run に差し替えた。

Fastly から Cloud Run を使うには、 Fastly に Host ヘッダーを上書きしてもらえばいい。そのものズバリな説明があって最高便利、よかったですね、 Fastly 最高、金払ってないけど。

05 Jul 2019 Fri 18:28

React で Android 向けとそれ以外でインタラクションを分ける

コンセプトとしては

const Android = ({children})=>(
  isAndroid() ? children : null
)

const NotAndroid = ({children})=>{
  isAndroid() ? null : children
}

というようなコンポーネントを用意しておいて

<Android>
  <アニメーションとか使わない地味なインタラクション>
    <HogeFuga>
      <Nanika />
    </HogeFuga>
  </アニメーションとか使わない地味なインタラクション>
</Android>

<NotAndroid>
  <豪華なインタラクション>
    <HogeFuga>
      <Nanika />
    </HogeFuga>
  </豪華なインタラクション>
</NotAndroid>

とかこんなん。まあ Android と NotAndroid の中身は適当に想像してください。

なんでこんなことをしたいかというと、

  • iOS 端末については年々 GPU が進歩している
  • Windows についても Intel の IGP すらわりと進歩している
  • 一方で Android 低価格機の GPU はショボいまま

という問題があるので。 Windows 環境でも若干そういう傾向はあるが、特に Android 機において低価格機の GPU は「表示できれば十分でしょ」から進歩しない。なんでこんなことになってんだと思うけど、もうそういうものとして考えていくしかないと思う。

とすると、 Android にだけアニメーションとかを適用しないショボいバージョンを見せる、という選択肢がでてくると思う。 React を使っている場合、しっかりコンポーネントを設計していれば、↑のような感じでそれなりによろしく書いていったりできるんじゃないかな、、、という考え。

実際に現時点でこんなことを実務でやっているわけではないです。今は全体にたいしてなるべくアニメーションとか使わないようなものを出していこうという方針でものを作っています。

ただ、エフェクトの有無が UX に影響するみたいなことが分かってきたら、なるべく多くの環境向けにエフェクトを出そうとかなると思うし、そうなると↑みたいな対処になるのかなーとか。

みんなこういうのどうしてるんだろう。

https://scrapbox.io/shokai/CSS%E3%83%AC%E3%82%B9%E3%83%9D%E3%83%B3%E3%82%B7%E3%83%96%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%82%92SPA%E3%81%A7%E4%BD%BF%E3%81%86%E3%81%A8%E7%A0%B4%E6%BB%85%E3%81%99%E3%82%8B からインスパイアされてこんなことを考えています。

22 May 2019 Wed 16:45

Next