月別アーカイブ: 2011年9月

カレログの中の人と話をした

このブログは本来アプリや書籍のことを書く場所なのですが、カレログチェッカーなるアプリを作り、その後もカレログにいろいろ突っ込みを入れていたところ、カレログの会社(有)マニュスクリプトの三浦社長より、一度会って話がしたいという申し出を受けましたのでその件を書きます。
元々はTwitterで書いていた話なので、この話もTwitterで書いた方がいいのでしょうが、140文字でバラバラに発言すると一部だけを取り上げて誤解されるようなことがあるかもしれません。それは私にとっても、三浦社長にとっても良いことでは有りませんので、こちらにまとめて書くことにしました。

●まず、お話をすることになった経緯から
Twitterの私の書き込みをご覧の方はご存じでしょうが、私はカレログについて色々と突っ込み記事を書いてきました。その中で、かなり挑発的なことも書いていましたので、いつかカレログの中の人から何らかのコンタクトがあるだろうと思っていました。
「そんな言いがかりはやめてくれ」とか「ユーザーでも無いのに文句を言うな」とか、ありがちな反応です。
しかし、実際には、DM(DirectMessage)で一度会って話をしたい旨のご連絡でした。
ご連絡の文面は丁寧だったのですが、このような状況でしたので、「体育館の裏に呼び出された」的な恐れを感じるのは自然だと思います。もちろん、何か明らかな害悪を及ぼすなんてことは無いと思いますが、用心に越したことは有りません。
そこで、この面談の件について公開すること、第三者の同席を認めること、場所はこちらで指定すること という条件の元であればお話しすることもやぶさかではないという回答をしました。(実際はもう少し細かいことを言いましたが、要点は上記のようなものです。)
かなり失礼な返答にもかかわらず、こちらの条件を認めていただいたので本日(2011/9/14)直接会ってお話をさせていただきました。

●面談の内容
前半は三浦社長から、カレログの開発の経緯や開発体制などのお話を伺いました。
その内容についてはセンシティブなものも含まれますのでここでは詳細は控えますが、特に目新しい情報があったわけではありません。
後半は私および同席した知人(こちらは氏名は伏せさせていただきますが、それなりにセキュリティなどにうるさい人物)から、カレログサービスについて指摘というか、ダメ出しをさせていただきました。
・アプリで規約を何度も読ませてもそれを読んでいるのは誰か不明
・端末所有者の同意を担保することはアプリだけでは不可能
・設計時点から契約者、端末所有者、カレログサービスという三者の存在がちゃんと定義されていない。
・位置情報サービス(GPS機能)を使うことすべてが悪みたいな風潮を巻き起こしかねない(Winny事件の結果P2Pがすべて悪者みたいな風潮が出てしまったのと同じ)
・カレログ管理画面を使う人間に対して規約への同意などを取っていない。
・管理画面のID/PWの管理がいい加減すぎる
・悪意の誰かがカレログを使ったとして、端末所有者がそれを見つけてもカレログ側では管理画面の使用者を特定する方法がない
・現在のサービスの品質をみると、サーバに保持している個人情報を十分に保護しているとは思えない
などなど、言いたい放題言わせていただきました。(他にもいくつか申し上げましたが、センシティブな内容であったりするので公開は控えます。)
総じて大変失礼な言い方だったと思います。三浦社長にはこの場を借りてお詫びします。

そして、三浦社長からは今後のサービスの改善について、協力をしてくれないかというオファーもいただいたのですが、さすがにそれはご勘弁いただきました。私としても興味が無い訳ではないのですが、中の人になってしまうと、表立って自由にものが言えなくなってしまいます。

●まとめ
「サービス開始時点では、これほどの反響が有るとは想像もしていなかった、よくても週刊誌などにちょっと取り上げられる程度が関の山だと思っていた」という三浦社長の言葉があったのですが、それがすべてではないかと思います。
位置情報というかなりセンシティブな情報を、あまりにカジュアルに扱いすぎたというのが今回のカレログの問題点だと思っています。
法的なことは私の専門外なので、意見は差し控えますが、技術的な面、モラル的な面で脇が甘かったというのが私の感想です。
すくなくとも三浦社長とお話をした範囲では、炎上まで予想してうまく立ち回ったというわけではないという印象は持ちました。(印象ですので正しいかどうかはわかりません)

●最後に
私のスタンスはこれまでと変わりません。
(有)マニュスクリプトとは利害関係、契約関係はありませんし、今後もこれまで同様に言いたいことを言います。
このことについては三浦社長にもご了承いただいています。(興味が失せたら何も言わなくなると思いますけど)

結局あまり面白い話にはならなかったので、この記事を書くのにえらく時間がかかってしまいました。(もっと三浦社長がぶっ飛んだ方だったら、おもしろおかしく書くこともできたのですが)

同席してくれた某氏ありがとうございました。他にもこの件で心配してくれた友人たちに感謝します。

カレログチェッカーの作り方

カレログチェッカーをつくるには

下記の説明だけではよく分からない方は、「基礎から学ぶAndroidアプリ開発」をどうぞ

0.AndroidSDKをインストール
1.Eclipseを起動する。
2.新規Androidアプリ作成(この時CreateActivityチェックはつけない)
3.新規クラス「KarelogReceiver」を作成(SuperクラスはBroadcastReceiver)
4.「KarelogReceiver」のonReceiveメソッドの作成
ACTION_POWER_CONNECTEDのインテントを受け取ったらアプリケーションを検索してノーティフィケーションを表示するだけです。
ACTION_DISMISS_NOTIFICATIONというのは、ノーティフィケーションをタッチされたときに発行するインテントで、ノーティフィケーションを消去するだけの処理を行います。

public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action != null){
if(action.equals(Intent.ACTION_POWER_CONNECTED)){
String foundApp = checkPackages(context);
if(foundApp != null){
showNotification(context,foundApp);
}
}else if(action.equals(ACTION_DISMISS_NOTIFICATION)){
NotificationManager manager =
(NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.cancel(NOTIFICATION_ID);
}
}
}
5.checkPackagesの作成
パッケージリストを順番に捜してみる処理です。
先にアプリケーションのリストを取り出してから、検索した方が効率がいいですが、チェックする数が多くはないので、ここでは手を抜いています。

public static String checkPackages(Context context){
String foundApp = null;
for(int i=0;i<checkPackages.length;i++){
foundApp = findApplication(context,checkPackages[i]);
if(foundApp != null){
break;
}
}
return foundApp;
}
6.findApplicationの作成
引数にマッチするアプリケーションがインストールされていれば、パッケージ名を返します。
最初に見つかった一つだけを返すので、複数検出したい場合は、リターン値をListとかに変える必要があります。
引数のパッケージ名は先頭一致なので、ドメイン名の部分だけにしておくと同じベンダーのアプリがすべてヒットします。

public static String findApplication(Context context,String packageName){
PackageManager packageManager = context.getPackageManager();
List<ApplicationInfo> applicationInfoList =
packageManager.getInstalledApplications(0);
for(ApplicationInfo info : applicationInfoList){
if(info.packageName.length()>=packageName.length()){
if(info.packageName.substring(0, packageName.length()).equals(packageName)){
return info.packageName;
}
}
}
return null;
}
7.showNotificationの作成
ノーティフィケーションの表示を行います。書籍のCHAPTER05で説明しているのと同じ処理です。

public static void showNotification(Context context,String foundApp){
long time = Calendar.getInstance().getTimeInMillis();
String message = “Found:”+foundApp;
Notification notification=new Notification(R.drawable.icon,message,time);
Intent intent = new Intent(context,KarelogReceiver.class);
intent.setAction(ACTION_DISMISS_NOTIFICATION);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
notification.setLatestEventInfo(context,context.getString(R.string.notify_title),context.getString(R.string.notify_message)+foundApp,pendingIntent);
NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
manager.notify(NOTIFICATION_ID,notification);
}
8.各種定数など
各種定数の定義です。NOTIFICATION_IDは適当な値です。別に何でもいいです。
checkPackagesはArrayにしているので、複数のパッケージをチェックすることもできます。
先にあるとおりドメイン名だけにしておくと同じベンダーのすべてのアプリをチェックすることができます。

public static int NOTIFICATION_ID = 1020;
public static String[] checkPackages = {“jp.karelog.gpsmanager”};
public static final String ACTION_DISMISS_NOTIFICATION = “be.watana.karelogchecker.service.dismiss”;
9.Manifestの修正
receiverだけのアプリなのでActivityはありません。

<?xml version=”1.0″ encoding=”utf-8″?>
<manifest xmlns:android=”http://schemas.android.com/apk/res/android”
package=”be.watana.karelogchecker” android:versionCode=”1″
android:versionName=”1.0″>
<uses-sdk android:minSdkVersion=”8″ />
<application android:icon=”@drawable/icon” android:label=”@string/app_name”>
<receiver android:name=”.KarelogReceiver”>
<intent-filter>
<action android:name=”android.intent.action.ACTION_POWER_CONNECTED” />
<category android:name=”android.intent.category.DEFAULT” />
</intent-filter>
</receiver>
</application>
</manifest>
10.あとはImportするクラスを調整して 細かいエラーを直せばOKです。
stringsリソースが必要なので適当なものを追加する必要があります。
Eclipseのエラーを見れば何が必要かはわかるので、適当に作成します。
Layoutリソースなどは不要なのでlayoutフォルダーごと削除してしまっても問題有りません。
日本語と英語に対応するには、CHAPTER04の最後に有るとおりvalue-jaディレクトリを作って日本語用strings.xmlを作成します。

書籍に乗っていない情報はfindApplicationの中のPackageManagerを使う部分だけだと思います。
チェックするパッケージ名を変えるだけで簡単に「なんとかチェッカー」になります。

Eclipseプロジェクトのアーカイブは KarelogChecker.zip

ライセンスはApache License 2.0です。
このプログラムはAS IS(あるがまま)で提供されます。動作することは保証しません。
このコードを使ったこと、使わなかったことによる結果については一切の責任を負いません。
ソースコードについての質問には基本的に回答しません。
ソースには上記のコード以外に、テストのコードや定期実行、起動時実行などを試したものが含まれています。
使用する際にはかならずパッケージ名の変更をしてください。