✖
Chrome App をテストする
Chrome App という、Chrome Extension の延長上にあるスタンドアロンアプリを作れる仕組みがある。これは、しばしば出てくる HTML + JavaScript でスタンドアロンアプリを作れるやつの Chrome 版にあたる。
結構いろいろとAPIが整備されていて面白いんだけど、いまいちテストを書く方法がわからなくていろいろ試した。Chrome の API を使っている場合、どうしても Chrome のコンテキストで実行する必要があり、なかなか面倒くさい。
protractor (webdriver-js ラッパ) を使う
protractor は Angular.JS 用のエンドトゥーエンドテストフレームワークで、いろいろ環境を一発でつくるのが便利なので使ってる。Angular.JS も使ってるから丁度いい。
コマンドラインから Chrome App を起動すると、まず1つ普通のChromeのウィンドウが開き、次にアプリケーションのウィンドウが開くという挙動をする。なので、アプリケーションのウィンドウが起動するのを待って、そっちにスイッチする必要がある。
403 Forbidden このあたりに書いてあるのをなおして、以下のようなのを書いた。
function switchToAppWindow (nth) {
function _switchToAppWindow (n) {
if (n <= 0) throw "failed to switch to app window";
browser.driver.getAllWindowHandles().then(function (handles) {
if (handles.length <= nth) {
_switchToAppWindow(n--);
} else {
browser.driver.switchTo().window(handles[nth]);
}
});
}
_switchToAppWindow(1000);
} switchToAppWindow(1) で2番目に生成されたウィンドウにスイッチできる。
これで、Angular.JS レベルでの E2E テストは書けるようになる
Unit テストを書く
しかし、E2E テストだと Chrome 向けに Chrome 専用の API を使ったライブラリのテストが書きにくいので、普通の Unit Test みたいなのも書きたくなる。
いろいろ試したけど、結局以下のようにした。
- テスト用の .html を用意する
- E2E テスト用のスクリプトから、executeScript でテスト用の .html を開き、テストを実行する
Jasmine を読みこませてテストを実行させ、自力でテスト結果を取得して表示してる。
ただ、罠があって、Jasmine が eval を使っててそのままだと Content Security Policy にひっかかって実行できない。これはmanifest.json に sandbox 指定することでも解決するけど、これだと本来の目的の API がたぶん使えないので、jasmine を書きかえて治す必要がある。global オブジェクトを取得しようとして eval を使っているので (なんで?) そこだけ自分で変えたら動く (Edge バージョンだと eval するコードがないので普通に動きそう)。
スケルトンプロジェクト
をつくった
関連エントリー
- Google Chrome (Mac版) の色化け いろいろ確認していたところ、Chrome で Preview.app と色が違うことに気付いた。sRGB モニタで見ていると同じように見える...
- AngularJS のテスト とりあえず、2種類のテストがあり、どちらも十分なサポートがされている。 基本的にangular-seedというのを元に作ればいいんだけど、e...
- macOS で SetupSTM32CubeMX-5.4.0 なんかしらないけど直接ターミナルから実行してやらないとウィンドウがでない ~/Downloads/en.stm32cubemx_v5.4.0...
- Manifest for a web application https://w3c.github.io/manifest/ https://developers.google.com/web/upda...
- Chrome App で USB デバイス (AVR V-USB) にアクセスする Chrome App は、chrome.usb という API を通じて低レベルなUSBデバイスドライバをJavaScriptで書くことが可...
JavaScript ArrayBuffer -> String 変換
500 Can't connect to stackoverflow.com:443 (certificate verify failed) の回答であったやつだけど、String.fromCharCode が複数文字を引数にできることを知った。String.fromCharCode、なぜか1文字しか渡せないと思いこんでいたので、なんとなくびっくりした。
console.log(String.fromCharCode.apply(null, [97, 98, 99]));
//=> "abc" つまりこれは ArrayBuffer とかを String に変換するときにとても簡単に書ける。以下の例は 8bit のビューを作っているが、元記事のように必要に応じて 16bit のビューを作って渡すこともできる。
var buffer = new ArrayBuffer(10);
for (var i = 0; i < buffer.byteLength; i++) {
buffer[i] = 97 + i;
}
console.log(String.fromCharCode.apply(null, new Uint8Array(buffer)));
//=> "abcdefghij"
関連エントリー
- mbed USBSerial を WebUSB から扱うには mbed USBDevice ライブラリの中に USB CDC で動く USBSerial クラスが実装されている。これを Web USB ...
- 正規表現からそれにマッチするランダム文字列を生成する String_random.js var randomUrl = String_random(/http:\/\/[a-z]{3,8}\.example\.com\/([a-...
- Manchester Encoding を JS で WebAudio での通信用に使おうと思って書いていたけど、やる気が失せてしまった。WebAudio 非依存部分だけ習作的に書いた。思ったよ...
- AngularJS の ngResource を既存APIの仕様にあわせる AngularJS には ngResource という拡張があって、サーバに対する API 経由の CRUD 的操作を JavaScript...
- はてブ用ブックマークレット 現在の非表示ユーザの総数: javascript:(async()=>{alert((await(await fetch("http://b...
電圧バラン・電流バラン
あんまり日本語の文書だと見ない気がするけど、英語圏由来の文書だとしばしばみるような気がする Voltage Balun, Current Balun ってなんなのだろうと思って調べたけど、つまり以下のような話だった
- 電圧バラン (Voltage Balun)
- トランスとして働く (同時にインピーダンス変換が可能)
- 強制バラン
- 電流バラン (Current Balun)
- コモンモードチョークフィルタとして働く (電圧は変更しない)
- フロートバラン・ソーターバランとも呼ばれる
基本、電流バランで十分なら電流バランのほうが効率が良く、インピーダンスマッチも同時にしたいなら電圧バランを使う、でいいのかな。
関連エントリー
- LTSpice で伝送線路トランス 「伝送線路トランス」という言葉が一般的な用語かどうかよくわからないのですが、トロイダル・コア活用百科ではこのような用語になっていました。一応...
- アンテナに生じる電圧 しばしば、耐圧を気にする場合、アンテナに生じる電圧を求めたくなることがある。 普通にインピーダンスと電力から求める。インピーダンス 、電力 ...
- ✖ メモ: コモンモードは+と-が同位相なので、+と-を同時にコアに巻いてやることで強いインピーダンスを発生させることができる。ノーマルモードは...
- 74HC04 の出力インピーダンス データシートにまさにこれという値は載っていないので計算する必要がある。VCC などによって出力インピーダンスが変わってくる。 たとえば To...
- バランの役目・平衡とは何なのか いまいちイメージがしにくくて理解したとはいいきれてない部分の覚書 平衡経路は差動信号、すなわち位相が反転した信号を2線に乗せ、接地せずに伝送...
洗濯機 Panasonic NA-VX7200L を修理
買ってから1年とちょっと経過したが、U04 という乾燥フィルター掃除エラーが頻発し、フィルター周辺が結露するようになった。当然洗濯物がなかなか乾かない、というかエラーで止まるので乾燥がやりなおしになる。うちには物干し竿も洗濯バサミも存在していないので、死活問題
一通り念入りに、排水フィルタまでもを掃除してみたが改善されず、乾燥フィルタの奥が固定なので洗えないなーと思いつつ、ググってみると、メーカー修理すると脱着式になることがあるらしい。よくくるクレームっぽい。
ということですぐに修理を依頼して、来てもらったら、脱着式になった。丁寧にカラー両面の説明書までついている。乾燥時の騒音が増える?っぽいけど、乾かないことには仕方ないし、掃除しやすくなったので良かったと思う。とりあえず様子を見る。
ちなみに1年経過でメーカー保証切れだったけど、購入店 (ケーズデンキ) では価格に5年分の延長保証が含まれているので、支払いはしてない。事前に乾燥まわりで故障するであろうことが予測できたので、延長保証があるところを選んでたのは正解だった。
ケーズデンキを一度通してからの修理だったけど、今回かなりスムーズにいった。ケーズデンキの修理電話にかけると、購入時の電話番号を訊かれるので、それに答えれば購入履歴から保証情報もとってくれるみたいで、保証書は見せる必要がなく、その後はメーカー(パナソニック)から、日曜だったが当日中にコールバックがあった (とはいえ、電話をとれなかった)。特に待ちとかもなく、スムーズに終わってよかった。欲を言えば電話だと面倒なのでメールにしてほしい。
あと、メーカー修理の人曰く、洗濯漕クリーナーは、半分ずつ頻度をあげてやったほうがいいらしい。洗濯機が自動判定して余分な洗濯漕クリーナーを排水してしまうことがあるとのことだった。
あと、洗濯機入口の2mm〜4mm程度の狭い隙間から乾燥の風がでているらしく、そこも詰まらないように金属のクシとかで1年を目安に掃除したほうがいいらしい。
関連エントリー
- 洗濯機の故障 (水漏れ) 洗濯機の故障は前回から2年ぐらい経過して2回目。 NA-VX7200L-N パナソニック ドラム式洗濯乾燥機 cho45 パナソニック(Pa...
- 洗濯機が壊れたので買い替えた パナソニック ドラム式洗濯乾燥機 幅63.9cm 洗濯12kg/乾燥6kg 左開き NA-LX125CL-W マットホワイト トリプル自動投...
- 洗濯機 Panasonic NA-VX7200L を買った。 NA-VX7200L-N パナソニック ドラム式洗濯乾燥機 cho45 パナソニック(Panasonic) ★ 5.0 / 5.0 cho4...
- 冷蔵庫を買った パナソニックの NR-F436T という冷蔵庫を買った。 今回はじめてケーズデンキで購入をしてみた。本当は NR-F437T という後継機の...
- ✖ ちょっと困ったことが起きており、一昨日からワンオペ。 普段ルーチンに入っていないので、一番面倒なのが食事。平日は朝食だけ用意すれば良い。もと...
WebAudio シグナルジェネレーター
しばしば、ただのサイン波を適当な周波数で出したくなると思いますが、ググってもいまいち一発で自分の欲しいものがでてこないので作りました。
- サイン波
- 矩形波
- ノコギリ波
- 三角波
- ホワイトノイズ
- ピンクノイズ
- ブラウンノイズ
あたりを自由に組合せて出せます。(当然スマフォでも動く)
関連エントリー
- WebAudio の BiquadFilterNode の周波数特性をグラフにするやつ 検索してもいまいち出てこなくて、いつも「前見たのどこだったかな」となるので自分で書いた…… https://github.com/cho45...
- ブラウザで動く擬似音声発生器 (ITU-T G.227 フィルタ) ITU-T G.227 にあるフィルタを実装して、無線機の特性試験の試験方法に登場する「疑似音声信号発生器」を WebAudio で作ってみ...
- 2015年つくったもの 2015年もたくさんコードかきました。他人に承認されないことはせめて自分で承認しましょう。つらい Chemr [tech] リファレンスマニ...
- ComplexAnalyserNode (WebAudio) を作った (IQ信号のFFT) https://github.com/cho45/complex-analyser-node WebAudio の AnalyserNode...
- WebAudio のデバッグ用のオシロスコープ WebAudio で ScriptProcessorNode とかを使ってちょっと変なことしようと思うと、波形が実際どうなっているのか見たく...
✖
そういえば最近8年前に作って放置していたヘッドフォンアンプを修理して使いはじめた。ネットで回路図が公開されていた SAITAMA なんちゃらみたいな名前がついたオペアンプ+ダイヤモンドバッファのスタンダードな回路のもので、いつのまにか片方聞こえなくなって使わなくなった、みたいな感じだったと思う。(当時の日記のエントリにリンクをはろうと思ったが読んでみたらキモ恥ずかしすぎるのでやめた…)
ちゃんと調べた感じ、単に入力の接触不良っぽかったので、とりあえずそれだけ直したら動いたんだけど、当時の自分のスキルレベルが異常に低くく (今も低いけど、今以上に)、アースまわりのワイヤリングに明らかにまずい部分があり、ちょっと試行錯誤して多少マシにした。
電源トランスを内蔵する仕様的に、当時はハムノイズが完全に消えなかったんだけど、アースまわりを常識的に直したら普通に皆無になった。8年経過の間に特にアナログ電子回路についてスキル上げした覚えがないけど、なんとなくベースレベルで解決した感じだった。
「ヘッドフォンアンプとか昔なんとなく作ったけど、意味あったのかなあ」と思って改めて使ってみたけど、音量あげたときの歪みっぽいものがなくなって気持ち良い感じにはなったので意味あるかもしれない。音量小さいなら意味ないしやっぱ意味ないのかもしれない。
関連エントリー
- LTSpice でヘッドフォンアンプを解析する LTSpice に慣れようということで、いくつか代表的なヘッドフォンアンプの回路をシミュレーションし、全高調波歪率 (THD / Total...
- LTSpice でヘッドフォンアンプを解析する2 http://lowreal.net/2015/01/14/1 の続き NJM4556A は 70mA と余裕があるオペアンプだが、こんなに...
- 特にトピックなし 最近やってるのは MIDI2LR のコントローラ 部品の納品待ち フルバランスのヘッドフォンアンプ DDC -> DAC でアナログにした時...
- 技術力がないから奇行に走る アルゴリズムを原理から実装するみたいなのが相変らずできないわけだけど、そうでないものなら比較的すぐに実装を書けるようになってはきているので、...
- 電子ピアノ練習用のミキサー 要件 PCで再生させた曲と電子ピアノの音をミックスしたい 出力を3人で同時にヘッドフォンで聞きたい この際、ヘッドフォンの種類が違う場合でも...
FuzzyFinder (fuf) で git ls-files を対象に fuf る
nmap gb :call fuf#givenfile#launch('', 0, 'x ', split(system('git ls-files'), '\n'))<CR> こうすると対象ファイルを git ls-files にして fuf を呼べる
関連エントリー
- ccls + vim-lsp で補完時に後続のwhitespaceが削除される 以下をいれるととりあえずおさまる。ccls と相性が悪い?? let g:lsp_insert_text_enabled = 0 let g...
- CPAN のリリース管理を Minilla に変えてみる $ cpanm Minilla で入れると minil コマンドができる。既存レポジトリで (ここでは Test-Name-FromLine...
- Swift で Mac の ScriptingBridge を無理矢理つかう ちょいちょい「環境設定」→「セキュリティとプライバシー」→「アクセシビリティ」を開かせたいケースがあるが、openURL とかで Secur...
- Perl の Locale::Maketext::Lexicon::Gettext フォーマットのメッセージをJSでフォーマットする Perl の Locale::Maketext::Lexicon::Gettext は以下のような Gettext ライクなフォーマットを扱...
- Ubuntu 16.4 LTS クリーンインストールして引越 カスタムOSインストールガイド - Ubuntu 16.04 – さくらのサポート情報 を見ながらインストールまでやる。 旧サーバと同じホス...
ユーザ由来の構造化データによるSQLインジェクション
Kazuho's Weblog: The JSON SQL Injection Vulnerability について。元記事をはっちゃめっちゃに要約すると
- SQL::Maker にユーザから受けとったデコード済み JSON をそのまま突っ込むと SQL インジェクションになる場合がある
- SQL::Maker 側でそういったことが起こらないように strict オプションをつけたから、できればそっち使え
- 別に SQL::Maker に限らないから気をつけろ
という話っぽい。本来であればユーザ入力をタイプチェックをすべきだけど、クエリビルダレベルでも、脆弱性にならないようにもうちょっと考慮してもいいよねという趣旨かな…
strict モードは非互換なので、既存のコードが動かなくなる可能性があるようです。
Teng での対応
Teng を使っているとデフォルトで SQL::Maker がクエリビルダとして使われるので、同じように危険な場合があります。Teng 0.24 から、クエリビルダのコンストラクタにオプションを渡せるようになったので、以下のように書くと strict モードになります。
my $teng = My::DB->new({
...
sql_builder_args => { strict => 1 }
}); Teng 0.23 以前の場合、このオプションがないので、以下のように自分で sql_builder に SQL::Maker のインスタンスを作って渡す必要があります。
my $teng = My::DB->new({
...
sql_builder => SQL::Maker->new(driver => 'SQLite', strict => 1);
}); 既に使っている場合
strict モードつきにしてみて問題なく動くならそのほうがいいですね。非常に単純なクエリは strict モードにしても変わりませんから、
$teng->search('foo', { id => $id }) みたいなクエリしか書いたことねーぞ! って場合、何も考えず strict を有効にして試してみると今後比較的穏かな気分でコードを書けることになります。
そうではない場合でも、あまりに大量にクエリビルダで複雑なことをしているというわけではない限り、 strict を有効にしてコードを書きかえ、検証しなおすべきでしょう。
さらに、どうせコード書きかえるなら根本的に入力のタイプチェックを行うのも考えたほうがいいと思います。
どうしても strict モードを有効にしたくないぐらい複雑にクエリビルダを使いこなしている場合かつ、脆弱性になりそうなコードを書いた覚えがあってヤバいぞという場合、ユーザから受けとる JSON などの構造化データを復号化するところで、一括して再帰的に全ての HashRef, ArrayRef, ScalarRef などを適当に bless することで、ある種の「汚染された」フラグとし、少なくとも SQL インジェクションについては防ぐことができると期待できます。
これは、SQL::Maker が strict オプションが入っていなくても、元から bless された構造化データについては文字列化が走るような挙動になっているためです。
ただ、これはこれでやはり全体的に影響する変更になるので、検証がstrict を入れる場合と同じように大変であり、コードを書きかえる手間の問題ないし、SQL インジェクションのリスクとほかのところで問題がでるリスクを比べた場合に、どうしてもとる1つの手段であって、基本は strict を有効にするように頑張ったほうが生産的かつ安全だと考えられます。
ユーザが構造化データを作れること
ウェブアプリケーション開発者は、普通のHTMLフォームが文字列しか送信できないという、歴史的経緯により無意識に、危険なデータは文字列でしかこないとなんとなく思っている。なのでユーザーが構造化データをつくって送れること自体がうっかり脅威になりえることがある。この手の問題は Perl に限らず Rails でも発生してる。
昨今では JSON をリクエストボディーにしたり、クエリ文字列にルールを与えて (例えば foo[bar]=1&foo[baz]=2 みたいな) 構造化データを受けとれるようにしたりといったことが行われる。これにより、信頼できない構造化データというのが生まれている。
単純なデータ構造でクエリを組み立てるというのは、それ自体が危険なAPI設計といえ、また、入力のタイプチェックをすれば防げる問題なので、それを強制するフレームワークになっているほうが良い、という学びを得られた。
関連エントリー
- Ruby Sequel で生 SQL をメインに使う Sequel はドキュメント見ると SQL そのまま書くやりかたもとクエリビルダを介すやりかたも許されていると感じるので (別に他のライブラ...
- MySQL で SET 型の UPDATE 以下のようなテーブルのとき CREATE TABLE foo ( aset set('aaa', 'bbb', 'ccc') ); 空文字列...
- ブログのキャッシュバックエンドの変更 今までは Cache::FileCache によるファイルシステムキャッシュにしていたけど、いくつか問題があって SQLite にかえた フ...
- Lightroom のカタログを SQLite で読んで統計を出したりする .lrcat っていったい何なのか カタログファイルの実体である lrcat は SQLite の DB ファイルそのもの。sqlite3 ...
- SQLite の WITHOUT ROWID の効果測定 SQLite で「PRIMARY KEY」を《真のプライマリキー》とするには | tech - 氾濫原 の続きです。 以下のような簡単なベン...


