Raspberry Pi の SD カードを Mac でバックアップ
特筆するほど難しいことはないけど書いておく。基本的に dd を使う方法が最速だと思うけど、dd コマンドはうっかり使うと死ぬ感じなので、こういうことは GUI で行いたい。なので、ディスクユーティリティを使用してバックアップを作る。
SD カードをさしこむとディスクユーティリティにでてくるので、各パーティションをアンマウントして (boot だけ自動でマウントされるはず)、カード (この例では 32.02GB APPLE SD Card...) を選択して、ツールバーの「新規イメージ」を選択する。
新規イメージでは、デフォルトで「圧縮」が選択されているはずなので、そのまま適当なディレクトリに保存する。
するとコピーがはじまる。基本、SDカードそのものの読み出し速度に律速される。手元のカード (Class 10) の場合、25MB/sec ぐらいで読み出されて、圧縮で 8〜16MB/sec で書き込みがある。32GB だと、32 * 1024 / 25 / 60 で、22分ほどかかる。最終的に 18GB になった。
Mac では Linux で使われる extN には対応していないので、Raspberry Pi の ext4 のパーティションはマウントできない。コピー中、パーティションのタイプ自体は認識されているけど、ext2 として認識されている。
圧縮された .dmg ができるので、復元 (あるいはクローン) もディスクユーティリティを使う必要がある (Mac 上でマウントして復元、または hdiutil convert してから)。dd + gzip だとどこの環境でも簡単に復元可能なので、どっちもどっちかなという感じ。
関連エントリー
- Mac で強制的に FAT32 でフォーマットする ディスクユーティリティを使って FAT でフォーマッットをすると、フォーマットしようとしているディスクが2G未満だと自動的に FAT16 に...
- NEC Aterm WR9500N で Time Capsule 的バックアップ (履歴引き継ぎ) 初回はうまくいったけど、時間が経ってからもう一度やろうとしたらうまくいかなくなった。Mac の smb 接続が不安定になったりとかいろいろし...
- バックアップの取り方を改良 途中まで作業をしてしまってから気付いたけど、ExFAT のディスクは TimeMachine のバックアップ対象にできないらしい。ひどい……...
- 一度セットアップした Raspberry Pi を使いまわす Raspbian を書きこんで適当にセットアップする NOOBS は使わないこと。 SDカードのコピー dd で普通にもってくる。 $ di...
- 変なディスクがシステムパーティション(ESP: EFI System Pertition)になっているときの変更方法 Windows は EFI が入っているパーティションのことを ESP: EFI System Pertition と呼んでいるようだ。di...
✖
node.js で Perl における Test::TCP または Ruby における Glint
Perl には Test::TCP というのがあって、テスト中、空いてるポートで何かしらのサーバーを起動して使うということができます。Ruby においては Glint というライブラリがあって、同じことができます。
node.js の場合、node-test-tcp というのがあって、node の net.Server で動くサーバに関しては簡単に同じことができます。が、memcached とか外部プロセスを起動させようとするとちょっと困るのと、done() を呼ばないと終了しないので、何かいい方法はないかなと思ったので書いてみました。
test-tcp だとカブるので glint のほうの名前を仮りています。
つかいかた
glint(
function (port) {
// ここは外部プロセスで実行される
// ただし文字列化して関数が渡されるので外のスコープの変数は使えない。
// node.js の exec, execFile はいわゆる exec ではないので1つプロセスが余分にできる。我慢するしかない。
console.log('starting memcached with port: ' + port);
require('child_process').execFile('memcached', ['-p', port]);
},
function (error, server) {
if (error) throw error;
// server は起動が確認済み
// server.port でポート番号がとれる。
// server.kill() でこのプロセスだけ殺せる
console.log(server);
var s = net.connect(server.port, function () {
s.write("version\r\n");
});
s.on('data', function (data) {
console.log(data.toString('UTF-8'));
s.end();
});
// この関数を抜けても exit されるまで server は (明示的にkillしない限り) kill されない
}
); しくみ
他のモジュールとやってることは一緒なのですが、node.js だと面倒な点がいくつかあります
- fork / exec はいわゆる *nix の fork/exec ではない
- オブジェクトファイナライザ的な仕組みがない
- 特定のオブジェクトが破棄されるタイミングで処理を行うことができない
node の fork / exec (execFile) は *nix の fork / exec とは全く違うので、細かいプロセスの制御ができません。特に exec 単体相当はないので、現在のプロセス自体を置き換えるということができません。そんなわけで1つ別プロセスを経由している関係で、無駄に1プロセスを消費しています。
オブジェクトのファイナライザがないので、node-glint では process.on('exit') で起動したサーバを終了しています。ただし、普通に外部プロセスを起動すると、そのプロセスの終了を待つ挙動になり、exit されません。が、spawn() のオプションに detach: true を指定した上で、unref() を呼んであげることで、外部プロセスの終了に関わらず起動元の node プロセスを exit させることができます。
まとめ
一応形にはなりましたが、細かい挙動の検証がめんどうなので npm にあげてません。特に現在の実装はシグナルまわりのハンドリングがいい加減です。node マスターの皆様におかれましては、よりよい方法をご教示頂ければと思う所存です。
関連エントリー
- Server::Starter を node.js のサーバ起動に使う Server::Starter は hot deploy 用の汎用スーパーデーモンで、Perl で書かれています。h2o の起動にも使われて...
- HTTPS 開発環境 そろそろ HTTPS でしか使えない新機能なんかを使いたくなるので、すこしずつノウハウを溜めようという気持ちはあります。 localhost...
- ブログシステムの HTML 生成を効率化 そろそろやることなくなったので minify などをやることにしました。 ただ、ブログシステムの出力の最後ほうでページごとに全体を mini...
- h2o を systemd 管理下にした 徐々に daemontools 依存を外していってるが、とりあえず h2o を systemd に管理にすることにした。どうも daemon...
- 複数の psgi を1つのサーバでサービスするときにメモリをケチる このサーバはVPS 1台で動いていて、メモリは1GBしかありません。常時メモリ上限まで使いきっており、スワップファイルもそこそこあります。そ...
AngularJS のテスト
とりあえず、2種類のテストがあり、どちらも十分なサポートがされている。
基本的にangular-seedというのを元に作ればいいんだけど、e2e (end to end) テストについては protractor というのを使うのが新しいようなので、今からはじめるならそちらを使ったほうが良い。
karma での unit テスト
node で完結する、ロジックの単体テスト。主に controller とか filter をテストする。controller で DOM を直でいじっていると実行できない。
サーバサイドとかとの通信とかは全てモックにしなければならない。Angular の DI の仕組みで、モックオブジェクトを外部から注入して単体テストを完結させる。
いろいろ面倒くさいけど、これを書くようにすることで controller / directive の使いわけとかを意識せざるを得なくなるので良い気がする。
protractor による end to end テスト
selenium を使った結合テスト。
protractor は Angular JS 用の e2e テストライブラリ。簡単に selenium-standalone をセットアップするところから、テスト用のユーティリティまでのセット。ドキュメント の通りにやれば OS X では全く苦もなく selenium 環境を作りテストを開始できる。
どこが「Angular JS用」なのかというと、ページロードとか、イベント発火とかで、いちいち自分で wait() を書く必要がなく、Angular 準拠の部分は自動で処理待ちをするので、かなり楽をできる。
karma か protractor か
- karma のテストは早い
- protractor (selenium) は遅い
ので、パターンを網羅したロジックは書きたいなら karma で完結するように書いたほうがいい。
関連エントリー
- AngularJS のテストでページ側のスクリプトを実行する protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行でき...
- Chrome App をテストする Chrome App という、Chrome Extension の延長上にあるスタンドアロンアプリを作れる仕組みがある。これは、しばしば出て...
- AngularJS 依存を持つ filter のテスト myApp = angular.module('myApp', [ 'myApp.filters', 'myApp.services' ])...
- JSDeferred -> Angular $q 置き換え方法 AngularJS には $qっていう promise の枠組みがあるので、使っておくといいこと (ビューが自動的に更新されるだけだけど) ...
- Ruby でスコープをはずれたときに自動で何かをする Guard オブジェクト Perl だと Guard オブジェクトとかいうハックがあって、スコープを出るタイミングで必ず呼ばれるファイナライ...
AngularJS のテストでページ側のスクリプトを実行する
protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行できる。
けど、文字列で渡すとか、シンタックスチェックもかからないし、ありえないので、定義自体は普通に書きたい。ので以下のような関数を定義する。
var PageObject = function () {
this.exec = function (func) {
var args = Array.prototype.slice.call(arguments, 0);
args[0] = '('+ (func.toString()) + ').apply(null, arguments);';
browser.executeAsyncScript.apply(browser, args);
};
this.createEntry = function (data) {
this.exec(function (data, callback) {
angular.injector(['myApp']).invoke(function (Entry) {
var entry = new Entry();
for (var key in data) if (data.hasOwnProperty(key)) entry[key] = data[key];
entry.$save(callback);
});
}, data);
return data;
};
}; この例では、定義した exec 関数を使って、ページ側の ngResource で定義したクラスを使い、テスト用のデータを生成する createEntry メソッドを定義している。
関連エントリー
- AngularJS の ngResource を既存APIの仕様にあわせる AngularJS には ngResource という拡張があって、サーバに対する API 経由の CRUD 的操作を JavaScript...
- Perl の Locale::Maketext::Lexicon::Gettext フォーマットのメッセージをJSでフォーマットする Perl の Locale::Maketext::Lexicon::Gettext は以下のような Gettext ライクなフォーマットを扱...
- JS 数値リテラルに単位をつけたい [tech] デカい文字をA4で分割して印刷するツールをJSで書いた | Sat, Mar 7. 2015 - 氾濫原 では、実寸サイズを扱...
- node.js で git の blob sha1 を求める github の API とかに出てくる "sha" は git 的な sha1 で、ファイルの内容のみからとった sha1 ではない。なん...
- ngResource は何が便利なのか? ngResource は単にAPIのラッパーという感じではなくて、JS でサーバ側のモデルとうまく同期するように作られている。 最も簡単な例...
Selenium を使ったテストでわからないこと
- テスト用のデータのロード方法がわからない
- テスト間を独立させる方法がわからない (データの初期化とか)
関連エントリー
- AngularJS のテスト とりあえず、2種類のテストがあり、どちらも十分なサポートがされている。 基本的にangular-seedというのを元に作ればいいんだけど、e...
- Chrome App をテストする Chrome App という、Chrome Extension の延長上にあるスタンドアロンアプリを作れる仕組みがある。これは、しばしば出て...
- 続・GPIO (sysfs) を使ったソフトウェア I2C なんかうまく AVR だと動かなかったりしたので、カっとなってテストを充実させた。(動くようになった) とはいえ、コード上でテストだけ書いて...
- ESP8266 (ESP-WROOM-02) の Deep Sleep でデータを引き継ぐ ESP8266 の deep sleep モードは CPU などの電源を全て落として、RTC (時刻を持ってるわけではないっぽいけど内蔵RT...
- Fastly の Terrarium 環境で Rust を使ってカウンタを書いてみた Terrarium は Fastly の WebAssembly を実行してくれるお試し環境みたいなやつ。ちょっと前に話題になった Luce...
AngularJS でまだわからないこと
- 1つのページに複数のコントローラーを定義し、それぞれを連携させる方法がわからない
- scope はどうなる?
- スコープまわりがよくわかってない
- $on、$apply の伝搬がよくわかってない
- DI まわりがよくわかってない
- 何を service にして何を provider にするのかとか
関連エントリー
- AngularJS のテストでページ側のスクリプトを実行する protractor (webdriver) を使った場合、外から executeAsyncScript を使うと文字列でページ側で実行でき...
- Angular JS でビューを伴う Service ってどう書けばいいんですか 続きをかきました。 [tech] Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directi...
- Angular JS で View を伴う Service 的なことをしたいとき、あるいは Directive に Controller をつけたいとき。 クソコード を書いたはいいが、釈然としなかった。 "View independent business logic: Services" と...
- AngularJS 依存を持つ filter のテスト myApp = angular.module('myApp', [ 'myApp.filters', 'myApp.services' ])...
- AngularJS で http リクエスト中画面内のボタンを disabled にする とにかく面倒だから全部の http リクエストを監視してボタンをオフにしたい。という要件 いまいちいい方法が思いうかばないけど以下のようにし...
1アマ (第1級アマチュア無線技士) 免許がきた
12月10日に受験して、12月24日の合格発表と同時に申請を出し、免許日は1月9日で、それから2日後には不在票 (書留にしたので) が入ってた。思ったより早かった。営業日的には7日ぐらいかな。
今まで持っていたやつはラミネート加工されたやつだったけど、新しい形式になっていわゆるカードサイズになったのと、英語表記が併記されるようになった (電波の性質上、国際的に使われうる免許だからかな) のと、ホログラム (富士山と桜?) っぽいものが全面に入るようになったみたい。
関連エントリー
- 第二種電気工事士免状がきました (神奈川県) 第二種電気工事士 試験終わり | tech - 氾濫原 昨日に不在票が入っていたので、申請から到着まで5日だった。2週間ぐらいと言われてたが...
- 1アマ (第1級アマチュア無線技士) 試験を受験した アマチュア無線の試験を前回 (3級) 受けたのは、まだ電信受信試験があった中1のときだったので、実に14年ぶりぐらいの試験になった。その間に...
- Elecraft KX3 での初交信 8月1日に注文 8月9日に届いて組み立て TSSに申請 9月5日に保証 総通に申請 9月10日に総通審査終了 9月11日に免許状と証票受取 ...
- 免許がきた 8月17日 (日) に電子申請 (11日ほど進捗なし、一度フォームから問合せた) 8月28日 (水) ステータスが審査中に 8月29日 (木...
- スペアナでスプリアス測定してみる (KX3 CW) 手元にある Elecraft KX3 の測定をしてみる。 (ちなみに当局の KX3 は「平成17年12月以降にアマチュア局の保証を受けて免許...





