スキップしてメイン コンテンツに移動

投稿

API化したGASの高速化まとめ

API化したGASの高速化まとめ ひょんな事から、GAS経由でスプレッドシートの中身をAPI化する案件を頂き、ざっと構築したのは良いがあまりにも処理が遅すぎたので、高速化のためにやったあれやこれをまとめる。 全データ取得 まず、一番の高速化と言えば、データ取得。 for文で回してセルのデータを取るのではなく、 Sheets.Spreadsheets.Values.batchGet(sheetId, request).valueRanges みたいな感じで、ぐわっとデータを取るのが早い。 これは以前にやった事がある事だったので、基本中の基本なのだが、これだけだと高速化しなかった。 キャッシュ化 今回の案件は、複数のスプレッドシートからデータを取得して表示するという物であった。 故に、初回の実行時はどうしても何度かリクエストを飛ばす必要があった。 で、これが同じネットワーク(?)内だとある程度キャッシュが効くのだが、別のネットワークになると途端に起動が重くなるという クソ仕様 現象が生じた。 これを解決するために、色々調べた結果、 CacheService を使うと良い事が分かった。 const cache = CacheService.getUserCache(); みたいにして、後は let data = cache.get("keyName"); if( !data ){ //dataを色々処理 cache.put("keyName",JSON.stringify(data)); } と書いて対応する形にした。 今回は、APIを起動実行するユーザが一人しかいない前提なので、getUserCacheを採用したが、getDocumentCacheや、getScriptCacheとかでも全然構わない。 localStorageの採用 さらなる高速化として、localStorageを採用することにした。 これで、爆速化した。 一応、データ更新は3時間に1回という形にして、 let data = localStorage.getItem("keyName"); let dataObject; // キャッシュ時間は3時間くらい if( !data || data.expire ...

メイン端末をXiaomiのMi 11 Lite 5Gにした

メイン端末を iPhone から Android にした このブログを見返してみると、 2013 年末から iPhone をメイン端末として使っていた らしい。 この記録からするに、10 年近く iPhone をメイン端末として使っていた算段になる。 メイン端末を Android にするに当たって、幾つかの理由があったので、それを書き出していこうと思う。 Apple にイノベーションが無くなった Apple は iPhone を発表してから常に新しい機能を iOS や iPhone に詰め込んできた。 それに当初から惹かれていたというのは正直な話である。 様々なイノベーションがあったが、ここ数年、iOS から何か新しいものが出てきたというニュースはほとんど聞かなくなった。 まあ、iOS 側だけでなく、Android 側からも新しいのは出ていないけれども……。 いずれにせよ、自分はイノベーションというのを思いの外重要視していた。 故に、イノベーションが無くなった Apple に魅力を感じなくなってしまった。 マシンスペックが完全に Android の方が良くなった 以前は、iPhone > Android という関係だったが、今は iPhone < Android という状態になっている。 ハイエンドだけでなく、ミドルハイに関しても、そうなったのがここ最近の事。 今後は、ミドルレンジや、エントリーに関しても Android スマホの方が高スペックになっていくのは既定路線と言えよう。 今回自分が購入したのは、Xiaomi の Mi 11 Lite 5G 。 my new gear... pic.twitter.com/68eVSGAvpR — ArcCosine💉💉💉 (@ArcCosine) July 10, 2022 昨年発売されたミドルハイモデルで、これが非常にコストパフォーマンスが良い端末だった。 Snapdragon の 780G 搭載で、今メインで使っている iPhone SE2 とも遜色ないというより、むしろほとんどの部分に関しては上回る性能を出してくれている。 今後、Snapdragon の世代が上がっていくに連れ、A プロセッサ以上の性能を体感出来るようになるに違いない。 また、 バッテリーの持ち に関しても...

『天冥の標』シリーズを読み終えたので、その感想

『天冥の標』シリーズを読み終えた 昨年の夏頃からまったりと追いかけて読んでいた天冥の標シリーズを読み終えました。 そう言えば、ふらにゃんオススメの天冥の標の第1巻読み終えました。メニーメニーシープ、面白かったです。続きも楽しく読む予定です。 — ArcCosine💉💉💉 (@ArcCosine) 2021年7月31日 らいもんさんが 時期を同じくして読み終えていた のは、シンギュラリティポイントの一つなのかもしれません、知らんけど。 閑話休題。 天冥の標シリーズの歴史的には、 2→3→4→5→6→7→1→8→9→10 (Part 1とPart 8の順番は微妙だが……)、みたいな感じなので、順番に読みたい人はPart 2から読み進めるのが良いかもしれない。 ただ、やはり作者の狙い的にはPart 1から順々に読み進めて貰ったほうが、衝撃が大きいと思う。 なので、色々と我慢して読み進めることをおすすめする。 Part10まであるが、Part 8まで読み進めないと、1巻で起きた出来事の全容を把握するのは難しい。 そこに至るまで膨大なテキストを消化しなければいけないので、本が好きな人向けの本という感じがする。 個人的には、Part 2は、現代のパンデミックも含めて凄い身近な内容に思えてとても興味深く読めたし、ある意味、天冥の標シリーズの根幹を為すストーリーなので、Part 1よりも先にPart 2を読むというのはありだと思っている。 バリバリのSF好きはPart 1を読んで様々な疑問を抱えながらPart 2以降へ読み進めていくと面白いと思う。 前半Partは、Part毎にテーマが絞られているので、案外すっきり読み進めることが出来る。 逆に、その辺がごちゃ混ぜになったPart 1は全容を理解していない状態で読むとかなり厳しい内容になってるなーというのが正直な意見。 SFでやりたい事全部詰め込みました!みたいな内容なので、SFに慣れていない人にはあまりオススメ出来ないのが非常にもったいない気がする。 三体はその辺、上手いこと短くまとめたなという印象があります。 用語説明あたりから含めて、SFってやっぱり特殊な分野だと改めて感じました。 小川氏が伝えたかった事は、Part 9 ヒトであるヒトとないヒトに詰め込まれていたなと感じました。...

ddu-source-rgを導入した

ddu-source-rg を導入する Slack の vim-jp に、grep 何を使っていますか~と問いかけたら、ddu-source-rg 使ってるよ~という情報をいただき、早速導入した。 まずは、 本家 に書いてあるような設定を施す。 ripgrep のインストール まずは、 ripgrep をインストールする。 すでに導入済みの人はこのステップを飛ばして良い。 自分は Windows 環境なので、 Scoop で導入した。 Scoop を導入していない人は、Scoop を先に導入する事。 PowerShell で下記コマンドを叩き込めば、勝手にインストールされる。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser # Optional: Needed to run a remote script the first time irm get.scoop.sh | iex Scoop の導入が完了してるならば、ripgrep をインストールする。 scoop install ripgrep ddu-source-rg の導入 ddu-source-rg は、Plug やら dein やらでインストールする。 自分は、dein.toml で管理しているので、dein.toml に [[plugins]] repo='shun/ddu-source-rg' を追記しただけ。 後は、dein#install()を実行。 ddu-source-rg の設定 本家にはシンプルに call ddu#custom#patch_global({ \ 'sourceParams' : { \ 'rg' : { \ 'args': ['--column', '--no-heading', '--color', 'never'], \ }, \ }, \ }) と書いてあるので、ddu#custom#patch_global に同じ設定をすれば良い。 ごちゃごちゃしてるけれど、自分のはこんな感...

KittyにUDEV ゴシックを導入

Kitty で UDEV ゴシックを有効にする 最近、Mac OSの方では、 Kitty を愛用している。 理由としては、GPUベースで動いているからヌルヌルだという記事をどこかで読んで飛びついた次第。 VimとGitがあれば、後は大抵何でもできるのだが、最近導入した Fern でフォルダアイコンとかをいい感じに表示したい欲が生まれた。 ターミナルのフォント変更についてネットで調べても、日本語記事はあまりなかった。 公式のドキュメントを読んだら kitty +list-fonts を実行して、その一覧にあるフォントを指定しろと書いてあったので、Windowsでも導入している UDEVゴシックフォント のNerd版を入れた。 UDEVゴシックフォントインストール後、kitty +list-fontsを実行し、そこに記されているフォント名を控え、kitty.confに追記した。 font_family UDEV Gothic NF Regular bold_font UDEV Gothic NF Bold italic_font UDEV Gothic NF Italic bold_italic_font UDEV Gothic NF Bold Italic font_size 18.0 font_sizeは自分の環境でのサイズなので、各自好きなサイズへどうぞ。 UDEVゴシックフォントをダウンロードする時は、UDEVGothic_NF_vX.X.X.zipと書いてある方をダウンロードする事。 NerdFont無いと、漢字が表記されて魔界になるので、注意。

Heroku を手動 deploy する

Heroku を手動 deploy する 先日、Heroku が やらかした 事件 があった。 このニュースを聞いて、すぐに github から heroku を切り離した。 その後、パスワードリセットが掛かる等、色々あったが、その辺は割愛。 実は、 つんでれ bot は heroku で稼働しているので、こいつの更新が出来ない状況になってしまった。 地味にちょくちょく更新していたので、どうにか deploy しなきゃなーと思ってたが、ようやく deploy 方法を見つけたので、ここに記録する。 heroku-cli を入れる まず、heroku-cli を導入する。 今は、npm 一発で入れられるので、 npm install -g heroku 自動アップデートされないから、他の方法をやれと書いてあったけれど、deploy する度に更新かければいいやという事で、折り合いをつける事にする。 次に、heroku にログインする heroku login をした後、Enter を叩くとブラウザが立ち上がるので、そこで認証する。 2段階認証もブラウザで出来る。 コマンドライン上でも出来るので、そこはお好みで。 その後、対象のレポジトリに移動し、remote に heroku を追加する。 cd ~/hoge/fuga/ heroku git:remote -a [アプリ名] 自分のアプリの名前は、heroku の dashboard から確認出来る。 最後に、push する git push heroku master 自分のレポジトリでは master でやってるが、main で運用している人はそこを main にすれば良い。 heroku の方でもなんか設定が必要かもしれないけれど、それは 公式ドキュメント を読んで。 編集後記 これで無事に tundere_bot を更新する事が出来た。 地味に、Twitter API ver2 もリリースされたので、近々そのバージョンで組んでみるつもりである。 あと、色々とアレなので、heroku を使うのをどこかでやめた方が良いかもしれない。 現状は代替が無いので、しばらくは heroku を使う予定だが、node が使えてお金が掛からないサービスあったらどなたか教えてください。

puppeteer で、ほどほどの速度で自動スクロールさせるコード

puppeteer で、ほどほどの速度で自動スクロールさせるコード puppeteer で、ほどほどの速度で目的の要素の位置に自動スクロールさせるコードを書いた。 await page.evaluate(async () => { const targetClass = ".target_class"; const hh = document.querySelector(targetClass).offsetHeight; await new Promise((resolve, reject) => { const moved = 100; let _top = 0; let timer = setInterval(() => { window.scrollBy(0, moved); _top += moved; if (_top > hh) { clearInterval(timer); resolve(); } }, 100); }); }); targetClass に、適当なセレクタを指定の事。 最初は、 await page.evaluate(async () => { const targetClass = ".target_class"; const hh = document.querySelector(targetClass).offsetHeight; window.scrollTo(0, hh); }); というシンプルなコードを書いていたのだが、これだと Intersection Observer 的な奴の処理が上手く走らなかったので、少し面倒くさいコードを書くに至った。 これならば、ちょっとずつスクロールしてくれるので、Intersection Observer に何か仕込んでいるサイトでもちゃんと動いてくれる。