
Research
Two Malicious Rust Crates Impersonate Popular Logger to Steal Wallet Keys
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
loadshow
は、Webページの読み込みプロセスを動画に記録するオープンソースのCLIツールです。
このような問題意識から、Webページの読み込みスピードをわかりやすく表現し、直感的に比較する方法として開発しました。
読み込みスピードの改善結果の前後や、競合サイトとの比較などに活用ください。
npm i -g loadshow
record
サブコマンドでWebページの読み込み過程を動画に記録します。URLと成果物を格納するディレクトリを指定します。
loadshow record https://apple.com/ ./loadshow.mp4
上記のコマンドは、https://apple.com/
の読み込み過程を記録した./loadshow.mp4
を作成します。
juxtapose
サブコマンドで、複数の動画を左右に並べた比較動画を作成できます。
loadshow juxtapose -o compare.mp4 apple.com.mp4 microsoft.com.mp4
上記のコマンドは、apple.com.mp4
とmicrosoft.com.mp4
を左右に配置し、-o
オプションに指定したcompare.mp4
として出力します。
次の項目を環境変数で指定できます。
LOG_LEVEL
ログレベル (fatal
| warn
| error
| info
| debug
| fatal
) デフォルト値 info
CHROME_PATH
Chromeのパス (例 /Applications/Google Chrome.app/Contents/MacOS/Google Chrome
)FFMPEG_PATH
ffmpegのパス (例 /opt/homebrew/bin/ffmpeg
) デフォルト値 ffmpeg
(Windowsの場合 ffmpeg.exe
)LC_ALL
or LC_MESSAGES
or LANG
情報バナーのロケール (例 ja-JP
)TZ
情報バナーのタイムゾーン (例 Asia/Tokyo
)BARE_PUPPETEER
実験的なモード。puppeteer
にバンドルされるChromeを使用 (例: 1
)LOG_OBJECTS
ログに付帯されたオブジェクトを表示する。動画の仕様は次のように構造化されたオブジェクトで規定されています。それぞれのデフォルト値とともに示します。
frameFormat: 'png' # 中間画像フォーマット (pngまたはjpeg。jpegの方がやや軽量)
frameQuality: 85 # 中間画像フォーマットがjpegの場合の品質値
hasBanner: true # 情報バナーの表示
hasProgressBar: true # プログレスバーの表示
layout:
canvasWidth: 512 # 動画エリアの幅
canvasHeight: 640 # 動画エリアの高さ
columns: 3 # カラム数
gap: 20 # カラム間の幅
padding: 20 # 動画エリアの余白
borderWidth: 1 # 罫線の幅
indent: 20 # 第二カラム移行の頭下げ
outdent: 20 # 第一カラムの下方の余白
progressHeight: 16 # プログレスバーの幅
recording:
network: # ネットワーク設定
latencyMs: 20 # レイテンシー (単位 ms)
downloadThroughputMbps: 10 # ダウンロードスループット (単位 Mbps)
uploadThroughputMbps: 10 # アップロードスループット (単位 Mbps)
cpuThrottling: 4 # CPUスロットリング (スマホ相当にするため4 = 性能1/4)
headers: # HTTPリクエストヘッダ
viewportWidth: 375 # ビューポート幅
timeoutMs: 30000 # タイムアウト (単位 ms)
preferSystemChrome: false # Puppeteerバンドルのブラウザではなくインストール済みChromeを優先 ※
puppeteer: # puppeteerの設定 `PuppeteerLaunchOptions`
headless: true,
args: # 文字列
- '--hide-scrollbars'
banner: # 情報バナー
templateFilePath: "" # HTMLテンプレート (ファイル指定)
htmlTemplate: "" # HTMLテンプレート (テキスト指定)
vars: # HTMLテンプレートに渡す変数 (オブジェクト)
# var1: "値1"
composition:
colorTheme:
background: '#eee' # 動画エリアの背景
border: '#ccc' # 罫線
progressBackground: '#fff' # プログレスバーの背景
progressForeground: '#0a0' # プログレスバー
progressText: '#fff' # プログレスバーの文字
progressTimeText: '#333' # 経過時間の文字
rendering:
outroMs: 1000 # 読み込み完了後の静止時間 (単位 ms)
ffmpegArgs: # ffmpegへの追加オプション (文字列配列)
# - "..."
# recording.preferSystemChromeは環境変数BARE_PUPPETEER=1の場合のみ使用
これらの値を必要に応じて一部上書きして、作成される動画をカスタマイズできます。値を上書きする方法はふたつあります。
# -u オプションによる上書き (複数可)
loadshow record -u "layout.canvasWidth=500" -u "frameFormat: jpeg" https://apple.com/ ./loadshow.mp4
# YAMLファイルでまとめて変更する場合
loadshow record -s spec.yml https://apple.com/ ./loadshow.mp4
spec.yml
には、以下の例のように上書きしたい属性のみ記述します。
frameFormat: jpeg
layout:
canvasWidth: 500
インストール済みのChromeを自動で検索します。
環境変数CHROME_PATH
の指定がある場合、優先で適用します。
以下はOSごとのシステムChromeの代表的なパスです。
/Applications/Google Chrome.app/Contents/MacOS/Google Chrome
C:\Program Files\Google\Chrome\Application\chrome.exe
/usr/bin/google-chrome
puppeteer
をインストールするとChromiumブラウザが~/.cache
ディレクトリ以下にインストールされます。
本来はこちらを使いたいところですが、環境によって動画の表示崩れが発生するため、Chromeの事前インストールをを必要としています。
環境変数BARE_PUPPETEER
に値(1
など)を設定すると、実験的にpuppeteer
がバンドルしたブラウザを使用します。
動画の上部に表示される情報バナーは、HTMLテンプレート(handlebars)の変数を書き換えることによりカスタマイズできます。
変数自体がテンプレートとして振る舞うので、{{ }}
などの記号を記述することで他の変数を参照できます。
# システムから渡される変数
width: 動画の幅
url: 記録しているURL
htmlTitle: HTMLタイトル
timestampMs: 記録を行った日時のタイムスタンプ(単位 ms)
resourceSizeBytes: リソースサイズ
onLoadTimeMs: 読み込み時間(OnLoad 単位 ms)
# 組み込みヘルパー
datetime: ロケールに合わせた日時タイムスタンプの整形
mb: リソースサイズをMB単位に整形
msToSec: msを秒に整形
i18n: 一部の用語を翻訳
仕様オプションbanner.vars
以下の値を変更することでカスタマイズできます。
banner:
vars:
mainTitle: "{{htmlTitle}}"
subTitle: "{{url}}"
credit: "loadshow"
createdAt: "{{datetime timestampMs}}"
resourceSizeLabel: "Resource Size"
resourceSizeValue: "{{mb resourceSizeBytes}}"
onLoadTimeLabel: "OnLoad Time"
onLoadTimeValue: "{{msToSec onLoadTimeMs}}"
例えばloadshow
というクレジット表記を変更するには、次のようにコマンドを実行します。
loadshow record -u "banner.vars.credit=My Loadshow!" https://apple.com/ ./loadshow.mp4
仕様オプションbanner.templateFilePath
にHTMLテンプレートのパスを指定することで、テンプレート自体を変更できます。
あるいはbanner.htmlTemplate
にHTMLテンプレートを直接指定することもできます。この利用方法はYAMLファイルによる仕様の指定を想定しています。
詳しくはsrc/banner.ts
を参照してください。
内部的には縦長のウィンドウを作成し、動画の記録を行っています。そのため全面背景のようにウィンドウの高さを基準にしたCSSを利用しているページでは、表示が崩れる場合があります。
プログラムの一部として呼び出すには以下のように記述します。
import Fs from 'fs'
import { Dependency, runLoadshow, defaultLoadshowSpec, mergeLoadshowSpec } from 'loadshow'
async function main() {
// 外部依存
const dependency = new Dependency()
// Pino loggerをカスタマイズ / 削除可能
// dependency.logger = ... / delete dependency.logger
// 動画の仕様カスタマイズ
const spec = mergeLoadshowSpec(defaultLoadshowSpec(), {
layout: {
canvasWidth: 500,
},
frameFormat: 'jpeg'
})
// 仕様・URL・動画パス・成果物ディレクトリを入力とする
Fs.mkdirSync('./loadshow', { recursive: true })
const input = {
...spec,
url: 'https://github.com/',
videoFilePath: './loadshow.mp4'
artifactsDirPath: './loadshow',
}
// loadshowの実行
const output = runLoadshow(spec, dependency)
// 結果の参照
console.log(output)
}
main()
Apache License 2.0 の下で公開します。
技術サポートを希望の方は問い合わせください。
git clone <url>
cd <dir>
yarn
MacOS Arm64の場合、モジュールsharp
の関係で次のコマンドが必要な模様。
yarn --ignore-engines
yarn test
テストカバレッジは進捗予定。
src/adhoc.ts
を改変して以下のプログラムを実行。
yarn adhoc
puppeteer
にバンドルされるブラウザの積極利用。
BARE_PUPPETEER
に値を設定することで試験可能。FAQs
CLI tool to record a web page loading process as a video file.
We found that loadshow demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Socket uncovers malicious Rust crates impersonating fast_log to steal Solana and Ethereum wallet keys from source code.
Research
A malicious package uses a QR code as steganography in an innovative technique.
Research
/Security News
Socket identified 80 fake candidates targeting engineering roles, including suspected North Korean operators, exposing the new reality of hiring as a security function.