依存する npm パッケージのバージョンを上げ続けるために ci-npm-update を導入した
題の通りなんですが、導入。
プロジェクトが依存する npm パッケージのバージョンを上げるのを、忙しさにかまけてサボりがちになっていた。意識が低くてもいいかんじにできないかなぁ、と思っていたところ、ci-npm-update を見つけた。
GitHub - bitjourney/ci-npm-update: Keeps npm dependencies up-to-date, making pull-requests from CI
npm-shrinkwrap.json
(Ruby の Bundler でいう Gemfile.lock
に相当するもの) を再生成して差分があったら、GitHub に PullRequest を出してくれるコマンド。PullRequest には、パッケージのリポジトリの Compare View の URL が書かれていて、バージョン間でどんな変更があったかすぐ確認できて便利。
今のところ、Jenkins で週に1回程度 ci-npm-update を実行するジョブを実行させて、差分を確認したり、自動化テストが通るか、手元で動かして問題ないか調べて、良さそうだったらマージ。その後、テストエンジニアの人が週に1回おこなっているリグレッションテストで問題がないか確認してもらっている。
ただ、package.json
に書かれた範囲内でしかアップデートできないので、ライブラリのメジャーバージョンアップがあった場合は気づけないのが難点。それは半月に一回くらい、npm outdated
や npm-check-updates
の出力を通知したり、package.json
の dependencies
や devDependencies
を更新する PullRequest を出させると良いのかなぁ、とぼんやりと考えている。
JavaScript のメモリや GC を扱った記事のメモ
JavaScript のメモリ や GC を意識したプログラミングに関する記事をふたつばかり読んだので、個人用のメモ。
- V8 が minor GC を実行するときは 10ms オーダーの時間がかかる。
- 60fps を実現する場合の 1フレームは 16ms であるから、GC が頻発すると全体の fps が低下し、表示のかくつきや操作の違和感に繋がる。
- GC が発生するのは大量のオブジェクトの生成・破棄を繰り返したときだから、事前にオブジェクトを生成しておいてそれを使い回せばいい。(オブジェクトプール)
- 万能ではない。初期化に時間がかかるし、大してオブジェクトを作らない場合でもメモリを無駄に使用することになる。また、その無駄なメモリを解放するタイミングが難しい。
- ( モバイルの場合は、大量のメモリの使用がバッテリーの著しい消費に繋がるから、滑らかな UI を実現することとのトレードオフな気がする )
- (どこで聞いたか忘れたけども、React は生成したインスタンスをプールするutil関数を定義している react/PooledClass.js at 19b8eadb242054e2668cf90e83490ef552bcdbfe · facebook/react · GitHub )
- ( 話がズレるが、↑のコードで引数の個数毎に関数を定義しているのは apply よりも call のほうがパフォーマンスが良いため )
彼女と彼女の猫 を読んだ
漫画のほうです。
吾輩は猫である のOL版といったところ。日常で漠然と感じる寂しさや希望みたいなものの描き方が秀逸だった。
猫が飼いたくなる。
- 作者: 新海誠,山口つばさ
- 出版社/メーカー: 講談社
- 発売日: 2016/08/23
- メディア: Kindle版
- この商品を含むブログを見る
ThinkPad のキーボードを買った
買った。
キーボードが欲しいなぁ、と前から思っていて、休みの日にお店に行って色々なキーボードを触ってみた。 ThinkPadの赤ポチの付いたキーボードが個人的に打ってて気分が良かったので購入。
レノボ・ジャパン ThinkPad USB トラックポイントキーボード(日本語) 55Y9024
- 出版社/メーカー: Lenovo
- 発売日: 2009/08/25
- メディア: Personal Computers
- 購入: 23人 クリック: 680回
- この商品を含むブログ (40件) を見る
赤ポチに慣れるのにちょっと時間がかかったけれども、ホームポジションから手を動かさなくても良いので段々楽になりつつある(ような気がする)。
スクロールは、Karabinar(旧KeyRemap4MacBook)で赤ポチ+中ボタンで出来るように設定できる。下の記事を参考に設定をおこなった。
君の名は。を観た
今日、前職の同期に誘われて、二子玉川の109シネマズで観てきた。
(ネタバレしているつもりはないんですが、なんとなく内容を察することができるので、そういうのが嫌な人は読まないほうがよいです)
はじまって、なんだただのよくあるボーイミーツガールか、と思って斜に構えて観ていたら、途中から突然、氷水をぶっかけられるような体験を間髪を入れずに何度も強いられた。最高だった。
映画が始まる前に「近頃、年をとったからか、若年性痴呆症か、昔、観た映画を誰と見に行ったか、レストランに誰と行ったか、思い出せなくなる。日記でも書こうかな」という世間話をしていたのだけど、何の偶然か、この映画で扱っているテーマと重なる部分があって、背筋が凍る思いがした次第です。
- 作者: 新海誠
- 出版社/メーカー: KADOKAWA/メディアファクトリー
- 発売日: 2016/06/18
- メディア: 文庫
- この商品を含むブログ (19件) を見る
世界のドキュメンタリー カストロVSゲバラ を見た
NHKオンデマンドにあったので、見た。
自分のカストロ(兄)とゲバラの関係のイメージは学生の頃に見たスティーブン・ソダーバーグ監督の映画のそれだったのだが、そのイメージがぶち壊されるドキュメンタリーだった。
キューバ革命からゲバラの死までを、当時の映像や音声、作家やかつてのゲリラ兵のインタビューをまじえながら描く。
カストロの立ち回り方が凄まじく、革命中・直後は「私は共産主義者ではありません、決して!」と言っておきながら、アメリカとの関係がまずくなってソ連と組むしかなくなったら「私はマルクス・レーニン主義者です」とか言ってて、(経済の破綻を避けるにはそうするしかなかったのは分かるが)何だこいつ、という気持ちになった。
普通の指導者ならこんなことを繰り返せば何らかの形で引きずり降ろされると思うのだが、それでも長いこと権力の椅子に座り、今日まで生きながらえているということは、彼のカリスマ・老獪さ・人心掌握の能力は本物なのだろうと思う。
ゲバラは、高潔さ・理想の高さ・順従さをカストロに良いように利用され、用済みになったら追放・半ば見殺しという気の毒な感じだった。ゲバラは、メディアでなにかと神聖化して描かれることが多いが、このドキュメンタリーを見ると中庸なポジションが取れるようになってよいかもしれない(とはいえ、このドキュメンタリーも特定の側面だけを際立てて見せているだけなのかもしれないが)。
チェ ダブルパック (「28歳の革命」&「39歳別れの手紙」) [DVD]
- 出版社/メーカー: NIKKATSU CORPORATION(NK)(D)
- 発売日: 2009/06/12
- メディア: DVD
- 購入: 2人 クリック: 33回
- この商品を含むブログ (58件) を見る
WebPagetestのAPIを呼んで、結果を保存するスクリプトを書いた
WebPagetestが提供しているREST APIを定期的に呼んで、結果をMongoDBに保存したくなって、スクリプトを書いた。
webpagetest-api を使おうとしたときのメモ - kitak.blogでは、npm packageでインストールしたコマンドからAPIを呼び出したが、職場的にスクリプト言語はPythonが使われることが多いような気がするので、Pythonのスクリプトで。
先の記事にも書いたが、WebPagetest - Get API Key で事前にAPIキーを発行しておく。
import os import time import requests from pymongo import MongoClient client = MongoClient('localhost:27017') db = client.webpagetest API_KEY = os.environ["API_KEY"] target_url = os.environ["TARGET_URL"] params = { "url": target_url, "k": API_KEY, "f": "json", "location": "", "mobile": 1, "mobileDevice": "Nexus5", "video": 1 } r = requests.get("https://www.webpagetest.org/runtest.php", params=params) response_json = r.json() test_id = response_json["data"]["testId"] result_url = response_json["data"]["jsonUrl"] print(test_id) print(result_url) while True: time.sleep(10) params = { "f": "json", "test": test_id } r = requests.get("https://www.webpagetest.org/testStatus.php", params=params) response_json = r.json() status_code = int(response_json["statusCode"]) if status_code == 200: r = requests.get(result_url) response_json = r.json() result = {} result['id'] = response_json['data']['id'] result['summary'] = response_json['data']['summary'] result['location'] = response_json['data']['location'] result['from'] = response_json['data']['from'] result['completed'] = response_json['data']['completed'] result['average'] = response_json['data']['average'] db.results.insert_one(result) break elif status_code >= 400: print("ERROR " + target_url) break
スクリプトでやっていることは、テストを走らせるAPIを呼び出して、テストが完了したか調べるAPIを10秒毎に呼び出し、テストが完了したら結果から関心のある項目だけ取り出して、MongoDBに格納する、それだけ。 MongoDBを使うと怖い人が来そうな気がするのだが、テスト結果の項目が色々あって、そこから取捨選択したり、構造を変更することを考えるとスキーマレスでカジュアルにバンバン突っ込めるほうが楽。
後はこれを毎日実行して、1~3ヶ月のスパンで数値の変化をみていこうと思っているのだけど、可視化をどうするかが悩ましい。TTFBとかSpeed Indexの推移をみるだけだったら、matplotlabとかでグラフ描けばいいかなぁ...
後、話がズレるのだけど、Pythonのスクリプトを書いていて、dictから一部の項目だけ取り出して別のdictを作るのもっと楽に書けないかなぁ、と思った。