2014-08-30

[windows] ハードディスクの内容を完全に消去する

Windows Vista 以降では、OS 標準のフォーマットツールで、クイックでない完全なフォーマットを行うと、Windows Vista の format コマンドの動作の変更 の通り、ゼロフィルを行うように仕様が変更されたので、GUI/CUI で通常のフォーマットを行えばそれで良いです。

考慮すべきこととしては、通常の方法以外でデータが読み取られる可能性が考えられます。バッドセクタになってしまった場所の機密情報を HDD のコントローラーを操作して読み取ったり、磁気力顕微鏡 を使ってプラッタの残留磁気を読み取られる可能性を考慮しないなら、消去方法は1回のゼロフィルで十分実用的と思います。

Windows XP 以降をお使いの場合は、diskpart の clean all コマンドを使うとディスク全域へのゼロフィルを行うことが出来ます。具体的な手順は以下のようにすれば OK です。

diskpart を管理権限で実行

list disk
select disk 123 # 消去対象を選択する
detail disk # 確認
clean all

OS のディスクを消去したいなど、OS を使わずにディスクを抹消したい場合や、1回のゼロフィルではなく政府機関認定の消去シーケンスを実行したい場合は、DBAN (Darik's Boot And Nuke) を使えば良いです。

DBAN の無人モードは全ディスクを消去する機能で、あるディスクのみ消去するときはインタラクティブモードを使います。消してはいけないディスクがある場合、念のため BIOS/UEFI で ATA ポートを Disable にしておくと良いです。

本当にディスクが消去されているのかを目視確認するには、ディスクをローレベルで見ると良いです。Windows の場合は HxD - Freeware Hex Editor and Disk Editor などで確認できます。

SSD を消去したい場合は、製造元の提供するツールを用いて消去を行うと早く完全な消去が行えると思います。具体的には、Intel SSD Toolbox, Samsung Magician Software, OCZ Toolbox などに存在する、Secure Erase 機能が該当します。

2014-08-24

Google Tag Manager を使って JavaScript エラーを収集する

Google Tag Manager は単にアクセス解析のタグを配信するだけでも、サイト自身にトラッキング ID などを直接埋め込まずに Tag Manager 管理画面から誰でも変更可能な状態に出来てとても便利です。

今回はさらにエラーリスナータグと、ユニバーサルアナリティクスのイベントトラッキングを組み合わせることで、サイトに変更を加えることなく、サイト上で発生したエラーを Google Analytics のイベントとして収集する方法を考えてみます。

設定方法

まず、エラーリスナータグを全ページに配信するように設定します。

次に、エラーリスナータグの発生させたイベントをユニバーサルアナリティクス (トラッキングタイプ=イベント) を使って報告したいのですが、エラー情報を受け渡す方法が一見したところ良く分かりません。色々触ってみたところ、受け渡し方法は、マクロを経由してデータレイヤ変数を引き渡せば良いみたいです。

こちらのヘルプ JavaScript エラー リスナー - イベント リスナー - Tag Manager ヘルプ
に書かれている通り、データレイヤ変数が設定されるので、以下のようなマクロをまず設定します。

マクロ名 dataLayer gtm.errorLineNumber
マクロのタイプ データ レイヤー変数
データ レイヤー変数名 gtm.errorLineNumber
データ レイヤーのバージョン バージョン2

このようなマクロを使って、以下のようなイベントトラッカーを設定します。

配信条件 {{event}} が gtm.pageError に等しい

タグの種類 ユニバーサルアナリティクス
トラッキング タイプ イベント

イベント トラッキングのパラメータ
  カテゴリ gtm
  操作 {{event}}
  ラベル {{dataLayer gtm.errorUrl}}:{{dataLayer gtm.errorLineNumber}}: {{dataLayer gtm.errorMessage}}
   (空欄)
  非インタラクション ヒット True

レポートの見方

エラー統計情報は、レポートで、行動 > イベント > 上位のイベント > イベントカテゴリ、から順番にクリックして以下のように絞り込めば OK です。
すべて » イベント カテゴリ: gtm » イベント アクション: gtm.pageError

追加情報

イベント リスナー - Tag Manager ヘルプ によると、同様のイベントリスナーは他にも以下のものが利用可能です。例えばクリックリスナーを使用すると、どの DOM 要素がクリックされているかを、要素の ID などで識別して収集することが出来ます。

クリック リスナー
フォーム送信リスナー
リンク クリック リスナー
タイマー リスナー
履歴リスナー
JavaScript エラー リスナー

ユーザーの安全のためこのイベントトラッキングはユニバーサルアナリティクスの SSL 有効モードで行うのが良いと思います。

[java] Lombok と AspectJ を組み合わせて使う

Lombok はリフレクションなどは使用せず、コンパイル時にゲッターやセッター、ロガー、toString、hashCode, equals など自動生成出来そうなものを生成してくれる大変便利なライブラリです。これと、AspectJ を組み合わせようとすると、厄介な問題が発生したのでメモしておきます。

まず、よく使用されているらしい aspectj-maven-plugin を使おうとすると、ソースコードに対する weaving は Lombok が処理する前のコードをコンパイルして weaving しようとして、コンパイルに失敗しました。そこで処理対象を Java バイトコード (.class) に変更しようとして、この方法 を見つけました。頑張れば出来そうな気はしますが spring-aspects を使うプロジェクトでまだ上手くビルド出来ていません。

次に見つけた、jcabi-maven-plugin の ajc ゴール を使う方法は、特に何も追加の設定をすることなく、Lombok 経由で作られた .class に対して weaving を行ってくれました。この組み合わせが良いと思います。


<!-- project > build > plugins -->
<plugin>
  <groupId>com.jcabi</groupId>
  <artifactId>jcabi-maven-plugin</artifactId>
  <version>0.9.3</version>
  <executions>
    <execution>
      <goals>
        <goal>ajc</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Spring Framework + AspectJ
少し蛇足ですが、@Transactional, @Scheduled, @Async, @Cacheable を使うには、mode = AdviceMode.ASPECTJ に加えて spring-aspects をコンパイル時依存に追加する必要があります。同じく @PreAuthorize, @PostFilter, @Secured など、@EnableGlobalMethodSecurity で有効になる仕組みを使うには spring-security-aspects が必要です。

また実行時依存に aspectjrt も追加しておきましょう。通常時は使われる気配はありませんがこちらの FAQ によると異常時の挙動に関係するようです When I run, I get a NoAspectBoundException or a ClassNotFound message for NoAspectBoundException.

今回はコンパイル時の weaving について記述しましたが実行時の weaving も可能なので、興味のある方は @EnableLoadTimeWeaving のあたりを調べてみてください。

[android] 定期的に位置情報を取得するアプリ

Android 4.2 にて、GPS 有効の状態で、バックグランド時も定期的に詳細な位置情報を取得するという動きをするアプリが1つでも存在すると、電池がどんどん無くなるので、この現象が起こりうるアプリについてメモしておきます。

新しくインストールしたアプリが原因で、この不可解な電池消費が起こり得ることが心配な方は、高精度の位置情報が必要な時以外は GPS 無効にしておくのが良いと思います。

Google の現在地送信機能
Path の近所機能
Path Talk の Ambient Status の Location 自動更新機能
Facebook の近所通知機能 (過去存在したが最新バージョンでは削除されているようです)

また、このアプリを使うと、どのアプリのせいでスリープ状態が解除されているか分かって大変便利です。
Wakelock Detector

2014-08-23

Google Analytics でサイトの速度サンプルレートを設定する

Google Analytics にはサイトの速度を計測する仕組み (レポート > 行動 > サイトの速度 を参照) が存在するのですが、デフォルトのサンプリングレートが 1% になっているので、アクセスの少ないページの情報が少なくて寂しいです。そこで、全アクセスについて計測対象とするように、サンプリングレートを 100% とするには、以下のようにすれば良いです。

新しい方の Universal Analytics (analytics.js) を使用している場合以下のようにパラメータ siteSpeedSampleRate を与えます。

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

// こっちは削除
// ga('create', 'UA-XXXX-Y', 'auto');
ga('create', 'UA-XXXX-Y', 'auto', {'siteSpeedSampleRate': 100});
ga('send', 'pageview');

古い方の ga.js を使用している場合は以下のように設定用メソッド _setSiteSpeedSampleRate を呼び出します。

var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-XXXXX-X']);
// 次の行を追加
_gaq.push(['_setSiteSpeedSampleRate', 100]);
_gaq.push(['_trackPageview']);

 (function() {
  var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
  ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
  var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
})();

Google Tag Manager でユニバーサルアナリティクスを使用している場合は、詳細設定 > 設定するフィールド に以下の設定を追加します。
フィールド名 siteSpeedSampleRate, 100

確認方法
正しく設定されたことを確認するには、ユニバーサルアナリティクスの場合、www.google-analytics.com/collect に対して、t=pageview の他に、t=timing のリクエストが行われていることを確認すると良いと思います。

ga.js の場合は、http://www.google-analytics.com/__utm.gif に対するアクセスを見ると何か分かりそうです。

リクエストが全く無くなってしまっている場合、トラッキングコードがおかしくなっている可能性があります。

注意
ga.js より以前に使われていた urchin.js を使用している場合はサイト速度計測は利用できないようです。

速度の計測に際してクライアント側に多少のオーバーヘッドが発生することは確かなので、本当にサンプリングレートを上げても良いかについては各自検討が必要です。

リンク
analytics.js のフィールドに関するガイド - Google アナリティクス - Google Developers - analytics.js (Universal Analytics) の場合について
_setSiteSpeedSampleRate() - Tracking Code: Basic Configuration - Google Analytics - Google Developers - ga.js (一つ前のバージョン) の場合について