とりあえず、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 で完結するように書いたほうがいい。

  1. トップ
  2. angularjs
  3. AngularJS のテスト
  1. トップ
  2. tech
  3. 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 メソッドを定義している。

  1. トップ
  2. angularjs
  3. AngularJS のテストでページ側のスクリプトを実行する
  1. トップ
  2. tech
  3. AngularJS のテストでページ側のスクリプトを実行する

  • 1つのページに複数のコントローラーを定義し、それぞれを連携させる方法がわからない
    • scope はどうなる?
  • スコープまわりがよくわかってない
    • $on、$apply の伝搬がよくわかってない
  • DI まわりがよくわかってない
    • 何を service にして何を provider にするのかとか
  1. トップ
  2. angularjs
  3. AngularJS でまだわからないこと
  1. トップ
  2. tech
  3. AngularJS でまだわからないこと

12月10日に受験して、12月24日の合格発表と同時に申請を出し、免許日は1月9日で、それから2日後には不在票 (書留にしたので) が入ってた。思ったより早かった。営業日的には7日ぐらいかな。

今まで持っていたやつはラミネート加工されたやつだったけど、新しい形式になっていわゆるカードサイズになったのと、英語表記が併記されるようになった (電波の性質上、国際的に使われうる免許だからかな) のと、ホログラム (富士山と桜?) っぽいものが全面に入るようになったみたい。

  1. トップ
  2. tech
  3. 1アマ (第1級アマチュア無線技士) 免許がきた
  1. トップ
  2. ham
  3. 1アマ (第1級アマチュア無線技士) 免許がきた

NEC Aterm WR9500N[HPモデル] PA-WR9500N-HP - NEC

NEC

5.0 / 5.0

評判の良いこれを買った。セットアップはあまり迷うところもなく終わった。

ただ、USB ディスク共有だけなんかおかしくて、smb://192.168.0.1/Hitachi-1 みたいな感じで、全部指定して接続をかけないと失敗する (Mac OS X)

  1. トップ
  2. tech
  3. 無線ルーターを変えた

初回はうまくいったけど、時間が経ってからもう一度やろうとしたらうまくいかなくなった。Mac の smb 接続が不安定になったりとかいろいろした結果、以下のような状態っぽいことがわかった (推測)

  • スパースバンドルのサイズが大きいとディレクトリエントリが多くなる
  • ルーターがメモリサイズ的にそのサイズのエントリを扱えなくなる
  • 死ぬ

なので、小さいスパースバンドルにするかなんとかしたらうまくいくかもしれないけど、もう諦めた…… 時間の無駄だった。

初回うまくいったのはよくわからない。Mac 側になんらかの形でエントリのキャッシュがあったのかもしれない。なんでもいいけど…

買ってから気付いたけど、USB ポートがついていて、USB HDD を繋いで SMB 共有ができるようになっていた。

せっかくなので、今まで有線USBでバックアップしていたのを、無線経由でバックアップするように変えた。

Time Machine をオフに

まず既存 Time Machine を OFF にする。

現状のバックアップディスクをバックアップ

HDDを新しく買ってくるならこんなことしなくていいんだけど、買いたくないので、一旦現状のバックアップディスクを、別にディスクに .dmg としてバックアップした。

バックアップディスクとなるスパースバンドルファイルをつくる

ディスクユーティリティでスパースバンドルファイルをつくる

  • サイズはとりあえずデフォルトのまま
    • 手元のディスク容量よりも大きいサイズには作れないため
  • フォーマットは Mac OS 拡張 (ジャーナリング)
  • イメージフォーマットはスパースバンドル・ディスクイメージ

作成したらアンマウントして、NASに繋げるディスクにコピーする。最初のバックアップまでは USB で直接繋いで作業する。

コピーしてからもう一度そのイメージをディスクユーティリティで開いて、「イメージのサイズを変更」を行い、2TB ほど容量を確保する。

バックアップをスパースバンドルイメージに復元

スパースバンドルファイルに対して、既存のバックアップの dmg を復元する。死ぬほど時間がかる。

NAS に繋げてバックアップ開始

ディスクをNASに繋げ、共有フォルダを開き、イメージをマウントする。

イメージをマウントして、マウント済みディレクトリに対し、以下のコマンドを実行。GUI を使わないので強制的に設定できる。

sudo tmutil setdestination /Volumes/Time\ Machine 

これでバックアップを再開するとネットワーク経由でバックアップが開始される。履歴も引き継がれ、差分バックアップになる。

NEC Aterm WR9500N[HPモデル] PA-WR9500N-HP - NEC

NEC

5.0 / 5.0

  1. トップ
  2. tech
  3. NEC Aterm WR9500N で Time Capsule 的バックアップ (履歴引き継ぎ)

追記:最近別のアダプタに変えました 500 Can't connect to lowreal.net:443 (certificate verify failed)

 -

3.0 / 5.0

アダプタは WLI-UC-GNM というやつをつけているんだけれど、ping が平均 100ms ぐらい (1ms〜250ms ばらつきがある) で、速度も 300kB/sec (2.4Mbps) ぐらいしかでない状態だった。

SSH して作業をしているので、ちょいちょいひっかかってストレスがかかるのと、奇妙な感じなので直したくていろいろ調べていたけど、ようやく解決したので記録しておく。

解決法

先に解決方法を書くと、/etc/network/interfaces に以下を書けばいいだけだった。

wireless-power off 

経緯

いろいろググってみると、ドライバに対してオプションをわたしたりとかしている例がでてくるけど、別のチップの話なのでそのまま適用できない感じだった。ただ、パワーマネジメントまわりでよくないことが起こることがある、みたいなのはこの時点で頭に入った。

iwconfig の出力を眺めると、以下のように Power Management:on になっていた。なので、iwconfig 側から Power Management を off にできないか調べたら解決方法にあるようなオプションがあることがわかった。

$ iwconfig
wlan0     IEEE 802.11bgn  ESSID:"SNEG"  
          Mode:Managed  Frequency:2.462 GHz  Access Point: XX:XX:XX:XX:AE:CE   
          Bit Rate=43.3 Mb/s   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on
          Link Quality=63/70  Signal level=-47 dBm  
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:41   Missed beacon:0

lo        no wireless extensions.

eth0      no wireless extensions.

オプションを適用させると、Power Management:off になり、ping は平均36ms程度まで、速度は 3MB/sec (24Mbps) まで改善した。数msぐらいまで短かくてもいいと思うけど、だいぶ改善してストレスが減ったのでとりあえずよしとする。

  1. トップ
  2. raspberrypi
  3. Raspberry Pi + Wi-Fi アダプタが異常に遅い問題を解決
  1. トップ
  2. tech
  3. Raspberry Pi + Wi-Fi アダプタが異常に遅い問題を解決

Raspberry Pi の実測電流値が気になったので安定化電源に繋いで適当に計ってみた。

アナログで読んだのでだいたい。USB Wi-Fi は指したまま起動。ほかのイーサネットポートやHDMIポートには何も指していない。

  1. 起動直後 約400mA (2W)
  2. USB Wi-Fi がチカチカしはじめてから 約500mA (2.5W)
  3. ruby -e 'loop {}' (CPU 99%) 約600mA (3W)

自分で接続した周辺機器をオン (AVR + RS232ドライバ + 気圧計 + I2C文字液晶) にすると、約650mA だけど、ほぼLEDだと思う。

スペック上、このモデルは 700mA 使うことになってるけど、意外と少なかった。CPU 全力 + HDMI + イーサネットポートとかだと 700mA になるのかな?

700mA (3.5W) で1年起動させっぱなしで、電気料金が高くとも 30円/kWh だとすると、(3.5 * 24 * 265) / 1000 * 25 ≒ 668円ぐらい。

  1. トップ
  2. raspberrypi
  3. Raspberry Pi の実測消費電力 (電流量)
  1. トップ
  2. tech
  3. Raspberry Pi の実測消費電力 (電流量)