2014年8月28日木曜日

Windows7のタスクスケジューラ

Windows7で、あるタイミングで任意のプログラムを実行したい場面はわりとあります。
そんなようなフリーのソフトも見かけますが、
システムに最初から入っているタスクスケジューラが利用できます。

使い方は難しくありません。
[コントロールパネル]の[管理ツール]から[タスク スケジューラ]を開き、
[操作]ペインの[基本タスクの作成]を実行すると[基本タスクの作成ウィザード]が開くので、
なんとなく設定すれば完了です。
動作名称にわかりやすい識別名を付け、実行内容や実行タイミング(時刻指定)を設定できます。
実行するプログラムはもちろんコマンドラインツールでもよく、
例えば毎日特定の時刻にPCを休止状態にしたければ
プログラムに"C:\Windows\System32\shutdown.exe"を、
引数の追加(オプション)に"/h"を設定するといった具合になります。
なお、タスクを作成すると[タスク スケジューラ ライブラリ]に
先ほどつけた動作名称が追加されているので、そこから内容の修正が可能です。

また各タスクの[プロパティ]の[全般]タブで
[ユーザーがログオンしているかどうかにかかわらず実行する]を選択して、
[パスワードを保存しない]をチェックしておくと、
ログインしていなくてもスケジュールどおりに実行してくれます。

せっかくある機能、活用しましょう。

2014年8月27日水曜日

マウントポイントなのか通常のディレクトリなのか

Linuxで任意のディレクトリが通常のディレクトリなのか、
それとも別のボリュームがマウントされたマウントポイントなのかを
その時々で調べる必要に迫られました。
最初は"lost+found"ディレクトリがあるかどうかで判定しようと考えたのですが、
これだと完全ではないので何か方法はないのか調べてみると、
"/proc/self/mountinfo"の出力から分かることにたどり着きました。
例えば、"/opt"がマウントポイントかどうかは以下のようなコード(C言語)で判別できます。
FILE *fp;
int f;
char buff[128];
if((fp=fopen("/proc/self/mountinfo","r"))==NULL)
    return;
f=1;
while(fgets(buff,sizeof(buff),fp)){
    if(strstr(buff,"/opt")){
        f=0;
        break;
    }
}
if(f){
    // /opt is normal directory.
}
else{
    // /opt is mountpoint.
}
fclose(fp);

こういうことが必要になるケースはそうはないと思いますが、
組み込み用途では活用できるかもしれません。

2014年8月26日火曜日

Google Mapsをマッシュアップ

先日自分の位置を他人に知らせる方法を書きました。
そこではGoogle MapsへのリクエストURLを加工することで何とかしていましたが、
自作ウェブサーバからAPI経由でGoogle Mapsを呼び出し、
地図を表示する方がより便利なので作ってみました。
今のところ利用するのはGoogle Mapsだけなので
正確に言うと"マッシュアップ"ではないのかもしれませんが、
語感がかっこいいので"マッシュアップ"ということにしておきます。
基本は前回の環境を使いまわして、必要な部分だけ追加とします。
なおGoogleの開発者サイト
[Google Maps API のライセンス]リンクの飛び先の
Google Maps API(for Business でない方)に書かれているように、
エンド ユーザーが自由にアクセスできる一般公開のサービスであれば
APIを利用してマッシュアップできます。

最初にAPIを利用できるようにします。
開発コンソールで[Create project]をクリックし、
[Google Maps JavaScript API v3]を"ON"に切り替えます。
次いで左ペインの[Credentials]をクリックし、[Create new Key]、[Browser Key]と押して
APIを利用するウェブサーバのurl(*はワイルドカード)を設定します。
[Create]によりAPI KEYが決定されます。

次はウェブサーバでコンテンツを作ります。
以下のような内容の"map.php"スクリプトファイルを
ウェブブラウザからアクセスできるように配置します。
<?
$fp=fopen("/tmp/location","r");
$pl=fgets($fp);
fclose($fp);
$l=explode(",",$pl);
?>
<html>
<head>
<title>map</title>
<meta http-equiv="refresh" content="10;URL=./">
<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?key=<API KEY>&sensor=false">
</script>
<script type="text/javascript">
  function init() {
<?
printf("    var latlng = new google.maps.LatLng(".$l[0].",".$l[1].");\n");
?>
    var opts = {
      zoom: 18,
      center: latlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    };
    var map = new google.maps.Map(document.getElementById("map"), opts);
    var marker = new google.maps.Marker({
      position: latlng,
      map: map
    });
  }
</script>
</head>
<body onload="init()">
<h1>map</h1>
<div id="map" style="width:80%; height:80%"></div>
</body>
</html>
ブラウザから"map.php"を開くと
先に作成したAndroidアプリケーションが送信した位置に基づいて地図が表示されます。
くれぐれも第3者に位置がばれないように気をつけてください。

2014年8月25日月曜日

isaiのSIMロック解除

auのisai LGL22使い始め長所短所わかってきたところで、
isaiにはとんでもないボーナスが隠されていることを知りました。
なんとSIMロック解除ができるのです。
そもそもisai LGL22はグローバル機LG G2のローカル派生品なのだそうで、
LG G2と同様にSIMロックが解除できるとのことです。
mineoがある今、わざわざdocomo系のMVNOをチョイスする必要もありませんが、
解除費用も安く、海外で威力を発揮しそうなのでとりあえず解除してみました。

まずは端末のIMEIを調べます。
isaiのホーム画面でメニューを[アプリ]-[基本機能]とたどって[設定]アプリケーションを開き、
[一般]-[端末情報]-[ステータス]メニューから[IMEI]の値をメモしておきます。

次に解除コードを入手します。
unlock mobileの[search]ボックスで"lg g2"を検索すると
似たような機種名の一覧が表示されるので、
[Unlock by code for LG G2]をクリックし、さらに[UNLOCK LG G2]をクリックします。
[Select Model]が"G2"であることを確認して、
先にメモしたIMEIを入力し、[Make an order]をクリックします。
料金をPaypalで払うように催促されるので、
支払いを済ませ解除コードがメールで届くまで待ちます。

メールが届いたらそれに書いてあるNCKを端末に入力します。
[電話]アプリケーションで"2945#*22#"を入力すると[SIMロック解除プロセス]アクティビティが開きます。
[ネットワークロック]をタップし、発行してもらったNCKコードを入力して[解除]すると、
自動再起動しSIMロック解除完了です。
Android 4.4.2にアップデートしていても大丈夫なようですね。

なお、QuickShortcutMakerアプリケーションをインストールして立ち上げ、
"sim"で検索して現れる"com.lge.hiddenpersomenu"をタップして、
展開された[SIMロック解除プロセス]をタップして別画面に遷移した後、
[起動]をタップしても[SIMロック解除プロセス]アクティビティが開きます。

こうなるとau以外のsimでどうなるか試してみたくなります。
そこで白羽の矢を立てるのは、
常に初期費用無料キャンペーンをやってる楽天のdocomoのMVNOです。
短期契約もできるので接続実験には最適です。
で、エントリープラスプランのnanoSIMを契約しました。

isaiの電源を切り、裏ブタをUSBコネクタのあたりからはがして
simカードをauからdocomoに差し替え電源を入れるとSIMロック解除画面になります。
そこであらかじめ手に入れているNCKを入力すればロック解除できます。
なお、この作業は始めてdocomoSIMを入れたときだけ発生します。
その後は[設定]アプリケーションの[テザリングとネットワーク]メニューを開き、
[モバイルネットワーク]-[アクセスポイント名]メニューの[手動設定]で、
サービス会社から通知されたAPN、ユーザー名、パスワード、認証タイプを入力すれば
LTE/3Gでのデータ通信が可能となります。もちろんテザリングも可能です。
この作業は1度やってしまえば、simカードを入れ替えても
適切な設定が自動的に反映されるようになっていて手間はかかりません。

通信速度についてはYouTubeで動画再生する感じではauより明らかに遅いのですが、
普通にウェブブラウジングする限りでは体感速度はほとんど変わりません(私の主観)。
問題なのはバッテリーです。
通話もSMSもできないデータ通信オンリーのdocomoのSIMを挿しても
アンテナピクトは正常に表示されるものの、
ざっくり言ってauのときより倍くらい電力を消費しているようです。
auのときとdocomoの時でアプリケーションの動作状況に変わりはなく、
セルスタンバイも20%ほどなんですがねぇ。
[電話]アプリケーションから"3845#*22#"をダイヤルすることで表示される
[Hiddenmenu]メニューで何かすればどうにかなるような気もしますが、
素直にauのMVNOであるmineoを使った方がいいかもしれません。
私は日本通信からau回線のsimが出てくるのを待ちつつ、
とりあえず運用でカバーしようかと考えています。

2014年8月21日木曜日

Windows7のハイバネーション

私の被害妄想かもしれませんが、Windowsは電源をいれっぱなしにしておくとろくなことがなく、
HDDに巨大なファイルを作るのがいやなので、ハイバネーションは常に無効にしてきました。
しかし、ちょっと使ってみたい場面に出くわし、
Windows7でハイバネーションを有効にしようと思ったところ、
思いのほか面倒だったのでメモとして残しておくことにします。

最初にコマンドプロンプトで
> powercfg.exe /a
を実行して、
以下のスリープ状態がこのシステムで利用可能です:
の中に
休止状態
があるのを確認します。
もしなければ
> powercfg.exe /h on
を実行します。
ちなみに
> powercfg.exe /h off
でハイバネーションを無効にできます。

続いて[コントロールパネル]から[電源オプション]を開きます。
選択している[電源プランの選択]の[プラン設定の変更]をクリックし、
さらに[詳細な電源設定の変更]をクリックします。
ツリーボックスにあるの[スリープ]-[ハイブリッドスリープを許可する]の
[設定]を"オフ"に変更して[OK]で終了します。
これで[スタート]メニューから[休止状態]に落とせるようになります。
デフォルトの終了動作をハイバネーションにしたければ、
[スタート]メニューのプロパティを開いて[電源ボタンの操作]を"休止状態"に設定します。
ただし、ここで言う"電源ボタン"とは
PC本体についているスイッチのことではないのでご注意ください。
(そうじゃないPCはあるかもしれませんが。)

なお、ハイバネーション状態への移行には画面が消えてからも多少時間がかかります。
あせってPCの電源LEDが消える前に電源プラグを抜くなんてことはしないように。

あと多くの方にはどうでもいい情報ですが、
APIのSetSystemPowerState()を呼び出せば、
休止状態にできるプログラムも作ることができるようです。
引数は(0,0)でいいのか?

2014年8月20日水曜日

独自ドメインで作っておくべきメールアカウント

最近わけあって
独自ドメインに大量のメールアカウントを作ったのですが、
その過程でRFC2142の存在を知りました。
これは独自ドメイン、というか組織において作っておくべきメールアカウントについて書かれており、
hostmasterやwebmasterといった有名なアカウントの元ネタのようです。
個人の場合salesなんて必要ないのですが、
securityなんてのを作って大量にお叱りのメールが来るとちょっと怖いですね。
ということでこのRFCは見なかったことにします。

2014年8月19日火曜日

自分がどこにいるのかを知らせたい

最近のスマートフォンには洩れなくGPS受信機が付いていて、
今自分がどこにいるのか、そのあたりに何があるのかが大体分かり、
初めての地でもうろうろすることなく目的地まで案内してくれたりします。
大変便利な反面、常に監視されているようで気持ち悪くもあります。

自分で自分の位置を知るのは普通にできますが、
他人に自分の位置を知らせたいような場面も結構あり、
しかも特定の人にだけに知らせたい時にだけ知らせられるのなら安心感があります。
ということで、持ち歩いているAndroidスマートフォンと
インターネット上に公開しているウェブサーバ(Linux+Apache+PHP)で、
個人的に位置通知システムを試しに作ってみることにしました。

まずはウェブサーバ側の準備です。
以下のような内容の"setlocation.php"スクリプトファイルを
ウェブブラウザからアクセスできるように配置
(ここでは"http://www.test.com/setlocation.php"と仮定)します。
<?
$x=$_GET["x"];
$y=$_GET["y"];
header("HTTP/1.1 200 OK");
$fp=fopen("/tmp/location","w");
fprintf($fp,"%f,%f",$y,$x);
fclose($fp);
?>
<html>
<head>
<title>getlocation</title>
</head>
<body>
getlocation
</body>
</html>
さらに以下のような内容の"map.php"スクリプトファイルを
ウェブブラウザからアクセスできるように配置
(ここでは"http://www.test.com/map.php"と仮定)します。
<?
$fp=fopen("/tmp/location","r");
$pl=fgets($fp);
fclose($fp);
$url="https://www.google.co.jp/maps?q=".$pl."(here)&z=18&hl=ja";
?>
<html>
<head>
<title>link</title>
<?
printf('<meta http-equiv="refresh" content="0;URL='.$url.'">');
?>
</head>
<body>
<h1>link</h1>
<?
printf('<a href="'.$url.'">go</a>');
?>
</body>
</html>
持ち歩いているスマートフォンから定期的に
緯度経度情報を付加して"http://www.test.com/setlocation.php"にアクセスすることで
サーバに位置情報を蓄え、
他人が"http://www.test.com/map.php"(Google Mapsへのリダイレクト)を開くと、
その位置の地図が表示されるということになります。
ただし、地図が表示されるページでリロードしても最新の位置に更新されません。
更新したければ"http://www.test.com/map.php"を新たに開く必要があります。

さて、Androidスマートフォンから位置情報を送るのは
そういうアプリケーションを作って立ち上げておくのが楽です。
ということでEclipse+ADTでアプリケーションを作成します。
通常通りにウィザードでスケルトンを作り、以下のようにファイルの変更等を行い、作成します。
"AndroidManifest.xml"ファイルには""の行の直後に以下の行を追加します。
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
"MainActivity.java"ファイルは以下のような感じにします。
package <このアプリケーションのパッケージ名>;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
public class MainActivity extends Activity implements LocationListener{
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
     LocationManager lm =
                    (LocationManager)getSystemService(Context.LOCATION_SERVICE);
     lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, this);
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    @Override
    public void onLocationChanged(Location l) {
        new sendinglocation(this).execute(l);
    }
    @Override
    public void onProviderDisabled(String provider) {
    }
    @Override
    public void onProviderEnabled(String provider) {
    }
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }
}
新しいクラスを追加してファイル名を"sendlocation.java"とし、内容は以下のような感じにします。
package <このアプリケーションのパッケージ名>;
import java.io.IOException;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import android.app.Activity;
import android.location.Criteria;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.AsyncTask;
import android.content.Context;
public class sendlocation extends AsyncTask {
    private Activity act;
    public sendinglocation(Activity a) {
        act = a;
    }
    @Override
    protected Object doInBackground(Object... arg0) {
        Location l=(Location)arg0[0];
        String url=
            "http://www.test.com/setlocation.php?x="
            +l.getLongitude()+"&y="+l.getLatitude();
        DefaultHttpClient cl = new DefaultHttpClient();
        HttpGet req = new HttpGet(url);
        HttpResponse res = null;
        try {
            res = cl.execute(req);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            cl.getConnectionManager().shutdown();
        }
        return null;
    }
}

とりあえず動くことを優先して作っているので、
実運用するにはまだまだ足りない部分(余計な部分)はありますが、
応用して面白くすればいいでしょう。
ただし、第3者に位置がばれないように気をつけてください。

2014年8月18日月曜日

isaiでBluetoothテザリング

私にとってisaiは6つ目のスマートフォンなのですが、
Bluetoothテザリングができる機種は初めてです。
ということでBluetoothテザリングを試してみました。

基本的にはisaiの[設定]アプリケーションで[Bluetooth]をオン、
[テザリングとネットワーク]メニューの[Bluetoothテザリング]をオンにし、
[Bluetooth]メニューからisaiと他の機器をペアリングする作業は最低限必要です。

最初にMacです。
画面右上の[Bluetooth]アイコンの[Bluetoothデバイスを設定]でペアリング完了後、
[Bluetooth]アイコンの[LGL22]-[ネットワークへ接続]メニューの実行で接続できます。
なお、通信速度を量ってみたところ、Wi-Fiテザリングでは8.3Mbps出ている状況で
Bluetoothテザリングでは3.5Mbpsしか出ません。
Bluetoothの転送速度を考えれば仕方ありませんが、
私の場合それだけ出れば十分ですし、消費電力はBluetoothの方が断然少ないので、
用途により使い分ければいいでしょう。

ちなみにBluetooth/USBテザリング時に外部アクセスとして利用できるのは
3G/LTE回線だけでなくWi-Fiもそうで、
通常のisai内部からの通信と同様にWi-Fi接続が優先されます。
あまり意識せずに速い回線を使ってくれるので便利ですし、
SIMカードに紐付けて認証されるようなWi-FiもPCから間接的に使えます。
どちら経由でアクセスしているかを判別するのは、
アクセスもとのIPアドレスを表示してくれるようなWebページで、
自グローバルIPアドレスを確認するのが簡単ではないでしょうか。
auのスマートフォンのグローバルIPアドレスは決まっているので、
これに当てはまれば3G/LTE経由、そうでなければWi-Fi経由ということになります。

次にWindows7からisai経由でネットアクセスしてみます。
ペアリング完了後、[デバイスとプリンター]で[LGL22]を選び、
メニューのリボンから[接続方法]の[アクセスポイント]を実行するだけです。
この作業はPC起動毎に実行する必要があります。
BluetoothのネットワークインターフェイスがDHCPを使うようになっていれば、
isaiがローカルIPアドレスをWindowsに自動的に割り当ててくれ、
インターネットへアクセスできるようになります。

最後にNexus7(2013)です。通常通りペアリングし、
Nexus7の[設定]アプリケーションの[Bluetooth]メニューから
[LGL22]の[設定]アイコンをクリックし、
[インターネット接続の共有]を有効にすれば完了です。

Bluetoothはたくさんの機器といろいろペアリングするとめんどくさいことになるので、
私はこれまで好んで使うことはなかったのですが、
その面倒を上回るメリットがBluetoothテザリングにはありそうです。

2014年8月14日木曜日

キーボードとマウスの切替器

ネットワークで繋がっていない2つのPCを1組のキーボード/マウスで操作するために、
SCY-USBDLC02ずいぶん長く利用してきました。
仕様上不都合な部分はあるものの、
Windows同士ならクリップボードの共有やファイル転送もできて結構気に入っています。

しかし、思うところがあってKM-A22BBKを購入しました。
SCY-USBDLC02はソフトウェア的に共有しますが、
KM-A22BBKはハードウェア的に切り替える方式になっており、
Linuxや多ホイール/多ボタンマウスな環境なら後者の方が有利です。
さらに後者ならプリンタ等のUSBデバイスの切り替えまでも可能です。

が、問題も。
KM-A22BBKが接続するPCを切り替えには多少の時間が必要です。
切り替えボタンを押してからマウスポインタが動くようになるまで2~4秒かかってしまいます。
SCY-USBDLC02ではそのような待ち時間は一切なかったので余計に気になります。
あと、KM-A22BBKを使い始めてからマウスポインタが急に飛んだり、
ドラッグ状態になったり、左クリックの調子が悪くなったりするんですが、
原因はKM-A22BBK?それともマウスのドライバ?

2014年8月13日水曜日

時刻の文字列

Linux等でCのプログラミングしていて時刻を表示したい場面は多々あります。
ソースの先頭にあらかじめ
#include <time.h>
を入れておけば
time_t t;
struct tm *s;
time(&t);
s=localtime(&t);
を実行後にsのメンバ変数を参照することで現在の日付や時刻が分かります。
ちなみにtm構造体は以下のようになっています。
struct tm {
  int tm_sec;      /* 秒(0-61)(60,61は閏秒対応) */
  int tm_min;      /* 分(0~59) */
  int tm_hour;     /* 時(0~23) */
  int tm_mday;     /* 日(1~31) */
  int tm_mon;      /* 月(0:1月,1:2月,...11:12月) */
  int tm_year;     /* 1900からの経過年数 */
  int tm_wday;     /* 曜日(0:日,1:月,...,6:土) */
  int tm_yday;     /* 1月1日からの経過日数(0~365) */
  int tm_isdst;    /* 夏時間(0:無効) */
};
が、文字列に整形するのが面倒という私のようなずぼらな人間用にctime()が用意されていて、
time_t t;
char buff[32];
if(time(&t)){
    if(!ctime_r(&t,buff))
        strcpy(buff,"no time\n");
}
else
    strcpy(buff,"no time\n");
printf("%s",buff);
のように書くことができます。
なおこの場合の文字列は
Sun Jan 23 01:23:45 1970
のような形式になります。

2014年8月12日火曜日

JavaScriptで乱数

ゲームにしろセキュリティにしろさまざまな場面で乱数は必要不可欠ではありますが、
真の意味での乱数を作るのは意外に難しく、
コンピュータ上では擬似乱数と呼ばれることがよくあります。
まあ最近はCPUやチップセットにはハードウェア的な乱数発生器が搭載されていて、
熱雑音をつかって乱数を生成してくれたりします。

もちろんJavaScriptでも乱数を得られます。
奥底でどのような処理が行われているのかは処理系にもよるでしょうが、
表面上はMath.random()関数の戻り値が0以上1未満の乱数となっています。
例えば0から9までの整数として乱数を得たいなら
var i=Math.floor(Math.random()*10);
のように実装できます。

2014年8月11日月曜日

isaiをPCにつなげる

いろいろ不満もあるものの、とりあえず使っているauのisai LGL22
USBケーブル(A-mircoB)でPCにつないでみました。

接続するとWindowsでは"LG PC suite"なるアプリケーションのインストールをさせられます。
これはスマートフォンとのデータ同期ができるようなこのアプリケーションなのですが、
多分デバイスドライバの類も含まれていると思われ、
入れてないとトラブルになりそうなので素直にインストールすることにしました。
ネットからダウンロードするのですがファイルサイズが大きいのには閉口します。
そういえばSAMSUNGにもKiesなんてものがありますが、
韓国メーカーってこういうの好きなんでしょうかね?

さて、そのときisaiはどうなっているかと言えば、
USBケーブルがささったっぽいアニメーションがちょっとだけ表示されるのは軽くスルーして、
[通知バー]に現れた[USB接続済み]をタップし、
[USB接続方法の選択]アクティビティを表示させます。
  • 充電
  • メディア同期(MTP)
  • テザリング
  • LGソフトウェア
  • 画像の送信(PTP)
が選べるようになっています。
PC側に余計なことをしてほしくないときに[充電]が選択できるのは意外に気が利いています。
MTPやPTP(isaiがデジカメのように振舞う)は多くのAndroidスマートフォンで使えますが、
先にインストールした"LG PC suite"と同期したい場合は[LGソフトウェア]を選びます。
そして非常に便利なのが[テザリング]です。
これはisaiがUSBモデム(ネットワークインターフェイスとして認識されるので
正確にはモデムではない)になってくれます。
ただしキャリアとテザリングのオプション契約を結んでいる必要はあると思われます。
もちろんWi-FiによるテザリングならPCと無線でつなげるわけで、
そっちの方がより便利ではあるのですが、カンファレンスの会場なんかに行くと、
みんながモバイルルータを使っているためにWi-Fiが非常に混み合い、
実質役に立たないなんてことが起こりがちです。
そんな時、PCとモバイルルータを有線で接続するUSBテザリングは威力を発揮します。
いやまあ3G/LTEの混み具合がひどければ関係ないのですが。
もうひとつUSBテザリングがいいのは、
3G/LTEのみならずWi-Fi経由でもインターネットにアクセスできることです。
PC側では外部アクセス回線を気にする必要はなく、
本来isaiでしか利用できないWi-FiサービスがPCからも間接的に利用できてしまいます。

USB接続ならではで言うと当然adb接続もできます。
isaiの[設定]アプリケーションの[端末情報]-[ソフトウェア情報]メニューで
[ビルド番号]を7回タップすると、[開発者向けオプション]メニューが現れるので、
そこの[USBデバッグ]を有効にすれば、すでにWindowsからadb接続できるはずです。

ではMacにUSB接続するとどうなるでしょうか。
デスクトップに一瞬"LGE Mobile"ドライブが出現するので何かインストールするのかと思いきや
ここには何も入っていません。
しかし何もインストールしなくても特に困ることはありません。
isaiの動作モードが[メディア同期(MTP)]なら別途インストールしている
Android File Transferが立ち上がりますし、
[画像の送信(PTP)]モードならiPhotoが立ち上がります。
[テザリング]モードならisaiをルータとした3G/LTE/Wi-Fi経由の通信が可能です。
Mac版の"LG PC suite"も用意されているので、
インストールしていれば[LGソフトウェア]モードで同期が可能です。
なお、Mac版の"LG PC suite"はLGのサポートサイトから[PC Suite]タブで[Mac OS]を選択し、
[モバイル製品に関するダウンロード]をクリックすることでダウンロードできます。
ところでこのページの[推奨環境]の[必要ソフトウェア]に
"Windows Media Player 10 又はそれ以降のバージョン"なんて記述があるので、
そんなものあるのかと探してみるとマイクロソフトのサイトにありました。
が、Telestreamから"Flip4Mac Player"を入手しろと書いてあるだけでした。
もう持ってるって。
話を戻しますが、もちろんadb接続もそのまま可能です。
adbツールはインストールしているなら通常
"Applications/adt-bundle-mac-x86_64-201?????/sdk/platform-tools/"にあります。

こうして一見便利に自動化されているisaiのPC接続は、
ホストPCをLinuxにするととたんに大きなお世話となります。
私の場合Ubuntuにadb接続できればいいので、Ubuntuで以下を実行します。
$ echo '0x1004' >> ~/.android/adb_usb.ini
$ su -
# echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="1004", MODE="0666", GROUP="plugdev"' > /etc/udev/rules.d/isai-lgl22.rules
# chown root:root /etc/udev/rules.d/isai-lgl22.rules
# chmod 644 /etc/udev/rules.d/isai-lgl22.rules
# reboot
ここで出てくる0x1004はVender IDで、
USB接続してからLinuxなら"lsusb"を実行すれば分かりますし、
Windowsなら[デバイスマネージャ]の
[ADB Interface]-[AndroidNet Sooner Single ADB Interface]のプロパティの
[詳細]タブの[デバイス インスタンス ID]で分かります。

ちなみに、PCとしてどのOSを使うにしても、
adbを実行するにはあらかじめAndroid SDKをインストールしておく必要があります。
少々古い投稿ですが、こことかこのあたりを参考にしていただければいいかもしれません。

2014年8月7日木曜日

Windows7でフォルダが消せない

Windows7でデスクトップに置いていたフォルダにとんでもないことが起きました。
消そうとしたときに中にあるファイル1つが消せず、フォルダは残ったままになりました。
パーミッションの問題かと思いちょっといじっていると、
今度は開こうとしたとき[場所が利用できません]なるエラーダイアログボックスが出るようになりました。
[プロパティ]の[セキュリティ]タブには
「要求されたセキュリティ情報は利用できないか、または表示されません。」と出てますし、
削除しようとすると[項目が見つかりません]なるエラーダイアログボックスが出ます。
一体どうすりゃいいんだか。

答えはchkdskです。
エクスプロラーから該当ドライブの[プロパティ]を開いて、
[ツール]タブの[エラーチェック]で[エラーチェックする]をクリックし[開始]します。
システムドライブの場合はその場ではできませんが、PCの再起動時に実行できます。
これで無事にゾンビフォルダが消えました。
よかったよかった。

2014年8月6日水曜日

ext2が壊れたときに

私が初めてLinuxをインストールしたマシンは、
Pentium-120MHz(133MHzにオーバークロック)、EDOメモリ16MB、
HDD1GB、Windows3.1なGateway2000のフルタワーでした。
今考えると高すぎる買い物です。
Gatewayの日本法人がなかった頃の話で、並行輸入されたものを購入しました。

当時日本でもLinuxが流行り始めていて、
雑誌の付録についていたSlackwareのCDからインストールしました。
残念ながらバージョンは覚えていませんが。
HDDのパーティションを分けWindows3.1とデュアルブートにしていたのですが、
Linuxにはswap含めて最低でも2つもパーティションを与えなければならず、
贅沢なOSだと思ったものです。

で、ルート用のパーティションはとりあえずext2でフォーマットしました。
現在Linuxでよく使われているext4はext2の上位互換版です。
なのでext2/ext3/ext4をひっくるめてext2と言ってしまうのは私だけではないでしょう。
ところで"ext"をなんと読むのか未だによく知りません。
"イーエックスティー"でいいのでしょうか?

さて、ext2ではパーティション上の特定の場所にスーパーブロックなるものがあり、
これを起点としてファイルにアクセスします。
つまり、もしスーパーブロックが壊れてしまうとファイルの読み出しができなくなってしまいます。
実はそんなもしものときのためにスーパーブロックには予備があるのです。
# dumpe2fs /dev/<パーティションのデバイスファイル>
を実行すると
Block size: <ブロックサイズ>
...
Backup superblock at <ブロック番号>
の情報が出てきます。これをもとに
# e2fsck -b <ブロック番号> -B <ブロックサイズ> /dev/<パーティションのデバイスファイル>
のようにすることでスーパーブロックを予備に切り替え、
パーティションが復活することができます。
まあ世の中何が起こるかわかりませんので、
定期的なバックアップは忘れないようにしましょう。

話は元にもどりますが、当時Linuxを何に使っていたかと言うと…まあディスクの肥やしです。
それなりに使いこなせるようになるのは相当後のことです。
それでも、ATI Mach64のためにX-Windowを2日かけて再ビルドしたりしてましたね。
で、そのX-Windowで何を動かしていたかと言うと…xeyesだったりします。

2014年8月5日火曜日

JavaScriptとキーボード

最近のゲームはタッチパッドだけで遊ぶものも多いのですが、
スーパーマリオのようなアクションゲームは物理キーで遊ぶに限ります。
JavaScriptでも物理キーボードによる入力は可能で、
window.onkeydownイベント発生時にキーコードを調べることで押されたキーがわかります。
カーソル(上下左右)キー、スペースキー、Enterキーは以下のように判別できます。
window.onkeydown=function(e){
 switch(e.keyCode){
 case 32: // space key
 case 13: // enter key (A button on 3DS/WiiU)
  return false;
 case 37: // left key
  return false;
 case 38: // up key
  return false;
 case 39: // right key
  return false;
 case 40: // down key
  return false;
 }
 return true;
};
ここでreturnをfalseにしておくとその後のキー処理がされません。
カーソルキーでゲームのキャラクタを動かせるけど
同時にスクロールしてしまうような現象はfalseを返せば防げます。

なお、キー入力はNintendo3DSWiiUのウェブブラウザでも使え、
カーソルキーはコントローラの十字キー、
EnterキーはコントローラのAボタンに割り当てられています。
このあたりWiiUの詳細は任天堂のサイトに詳しく書かれています。
上記5キー以外の情報についてはポーリングしないとわからないのでちょっとつまんないですね。

2014年8月4日月曜日

isaiのAndroid4.4.2.1?

まったく知らなかったのですが、
auのisai LGL22Android4.4へのアップデート
アドレス帳辺りのバグのため一時ストップしていたんですね。
そしてそれを修正したファームウェアが新たに公開されています。
オリジナルの4.4.2からの差分は12MB程度で、
ビルド番号が"KOT49I.LGL2220c"から"KOT49I.LGL2220d"に、
ソフトウェアバージョンが"LGL2220c"から"LGL2220d"に替わったぐらいでしょうか。
[アドレス帳]アプリケーション([連絡先]のことか?)はほぼ使ってないのでよくわかりません。

あと4.4ではロック画面に水滴が付いてビビるとか書きましたが、
これ実は天気予報と連動していることにずいぶん経ってから気がつきました。
何しろ私の住んでるところは雨多いんで。