電話機に電話帳を転送しました

2010.02.09    馬場   タグ: —    baba   

昨日購入した電話機 VE-GP54DL/DW ですが、Gmailの電話帳を転送してみました。

説明書によると、↓のソフトを使って、PCで電話帳を編集できるとあります。
http://panasonic.co.jp/pcc/products/phone/phonebook/index.html

しかし、1件ずつ入力するのもばかばかしいので、直接ファイルを設置してみます。
説明書に書いてあるとおりのパスに、以下の形式でファイルを置けばOKです。

グループID [TAB] 名前 [TAB] フリガナ(半角カタカナ) [TAB] 電話番号

ただし、電話番号はハイフンなどを含めず、最後に :0:0 をつけるみたいです。最後の:0:0が何を指しているのかわかりませんが、複数の電話番号に対応するための拡張かもしれません?

記入例

char=01
version=001
model=w_GBC4YB
title=myaddressbook

1002 1000 1001 2000
01 BPS株式会社 ビーピーエス 0462103506:0:0
01 馬場孝夫 ババタカオ 09000000000:0:0
01 渡辺正毅 ワタナベマサキ 09000000000:0:0

注意点として、フリガナを空にすると、PCソフト上ではデータが見えるのに、本体に転送できない点があります。
必ず、適当でもいいのでフリガナを入れてください。

Gmailからこの形式に変換するのはちょっと面倒ですが、専用ソフトで1件ずつ入れるよりは楽ですね。

電話機をリプレースしました

2010.02.08    馬場      baba   

社内の電話機をリプレースしました。

Panasonic デジタルコードレス電話機 シルバー 子機2台タイプ VE-GP54DW-S

Panasonic デジタルコードレス電話機 シルバー 子機2台タイプ VE-GP54DW-S

Amazon価格:¥ 17,900

カテゴリ:エレクトロニクス

発売日:2009-09-11


今まで子機が1台しかなく不便だったため、子機の追加購入を検討していたのですが、子機1台15000円以上するため、本体ごと買い換えてしまいました。

・SDカードで電話帳をインポート、エクスポートできる
・SDカードにすべての通話を録音できる

とても便利そうです。

Excel 図形の小ネタ

2010.02.06    馬場   タグ: —    baba   

事務の方ならみんな知っているのかもしれませんが、開発者は意外と知らない、Excel 2007の使い方。

たくさん図形を作ったとき、複数を一括選択するときは、Shiftキーを押しながら選択すればOKです。
しかし、何十個もShiftキーを押しながら選択するのは大変です。

そこで、「オブジェクトの選択」機能を使いましょう。

ここを選ぶ

ここを選ぶ

「オブジェクトの選択」を使えば、たくさんの図形も一気に選択できます。
右クリックしてクイックアクセスツールバーにセットしておくと便利です。

こうやって一括選択できる

こうやって一括選択できる

Excel 2003まではわかりやすい場所にあったのですが、2007になって隠れてしまいましたね。

また、同じ図形を連続で描きたいときは、図形を右クリックして「描画モードのロック」をすればOKです。

描画モードのロック

描画モードのロック


描き終わったらESCを押しましょう。

ActiveDirectory環境下でローカルユーザを追加

WindowsをActiveDirectoryに参加させると、コントロールパネルの「ユーザアカウント」が変わります。

ActiveDirectoryのユーザを追加する際は、サーバ上で設定すれば良いのですが、各PCのローカルユーザを追加するときにちょっと戸惑います。

ダメなパターン
「ユーザアカウント」を開くと、「追加」ボタンがあるので、それを押してみると・・・

ユーザアカウント一覧画面

ユーザアカウント一覧画面

追加

追加

権限の設定

権限の設定

完了を押すと・・・

完了を押すと・・・

このように、エラーになってしまいます。
この画面は、既に存在するユーザにグループを設定することは出来ますが、新規ユーザの作成ができません。

正しいやり方
「ユーザアカウント」の「詳細設定」タブで、「ユーザ管理の詳細設定」を開きます。

詳細設定を選択

詳細設定を選択

出てきた画面で、右クリックして「新しいユーザー」をクリックします。

新しいユーザの追加

新しいユーザの追加

ダイアログにユーザ情報を入力すれば、ユーザが追加できます。
「作成」をクリックしても何もおきないように見えますが、連続追加出来るように画面が閉じないだけで、ちゃんと追加されています。

ユーザ情報の入力

ユーザ情報の入力

これで、ローカルユーザが追加出来ました。もちろん、管理者権限のあるアカウントでログインしていることが必要です。

わかりにくいですね。

HDDエラー(chkdskすれば直ります)

2010.02.04    Windows, 馬場   タグ: , —    baba   

どっちだよ!って思いますよね。ふつう。

問題が発見されま...

問題が発見されま...

ここで
・日本語
・Windows
・フォント
どれの責任と思うかで、性格診断ができます。

SVNで更新しようとしたらCannot create new file

2010.02.03    馬場   タグ: , , —    baba   

Windows/Macで共用のSVNリポジトリを使った際、WindowsのEclipseで「更新」をしたら、

Cannot create new file
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。

といったエラーが発生しました。

これは、MacのXCodeでコミットしたときに、buildフォルダの中に > が含まれるファイル名のファイルがあったことが原因です。
Windowsでは > を含むファイル名は許可されないので、エラーが発生していました。

Macで該当ファイルを削除すれば、エラーは直ります。
また、このようなことがないよう、XCodeのbuildフォルダはSVNにコミットしない方が良いですね。

C#でUDPパケットをひたすら送り続ける

先日のiPhone UDP受信テストの際に使った、WindowsからUDPパケットを送りつけるプログラムを載せてみます。
一切の遠慮無く、1秒に20枚のペースで、デスクトップに置いてあるimg0.png~img9.pngの画像ファイルを一方的に送りつけます。

///一定時間ごとにUDPで画像を一方的に送りつける
private void SendData()
{
    //ローカルポート番号2222にバインドする
    System.Net.Sockets.UdpClient udp = new System.Net.Sockets.UdpClient(2222);

    int count = 0; //何番目の画像を送信するかのカウンタ

    Timer timer = new Timer();
    timer.Tick += new EventHandler((s, e) =>
    {
	    if (++count > 9)
	    {
	        count = 0;
	    }

	    //デスクトップのimg0.png~img9.pngを送る
	    string filename = @"C:\Users\baba\desktop\img\" + count + ".png";
	    using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read))
	    {
	        byte[] sendBytes = new byte[fs.Length];
	        fs.Read(sendBytes, 0, sendBytes.Length);
	        //宛先IPとポート番号を指定する
	        udp.Send(sendBytes, sendBytes.Length, "192.168.100.50", 5555);
	    }
    });
    timer.Interval = 50;
    timer.Start();
}

.NETは簡単にこういったコードが書けて便利ですね。
何の工夫も最適化も無いですが、50枚/秒くらいなら全然問題にならない程度の速度は出ていました。

古いIEだとAjaxのUserAgentが変わるので、CakePHPでセッションが切れてしまう

2010.02.01    CakePHP, IE, javascript, 馬場      baba   

CakePHPでjQueryを使ったAjaxを実装した際、IEの古いバージョンでのみエラーになる現象に見舞われました。
調べてみると、Ajaxリクエストを送った際にログインが切れているようです。

どうやら原因は、CakePHPのユーザエージェント検証機能でした。
app/config/core.phpで

Configure::write(’Session.checkAgent’, false);

を設定することで解決しました。

つまり、古いIEでは、通常時のリクエストとAjaxリクエストで、ユーザエージェントが違う、ということですね。
これはたぶん、歴史的な理由からXMLHttpRequestがActiveXオブジェクトで実装されていることに由来するのでしょう。

以下に、各ブラウザで確認したユーザエージェントを書いておきます。
PHPで、$_SERVER['HTTP_USER_AGENT'] を表示しています。また、Ajax通信は、jQueryの$.ajax()を使っています。

■Firefox 3.5.6
通常: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)
Ajax: Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)

■Chrome 4 beta
通常: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.64 Safari/532.5
Ajax: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/532.5 (KHTML, like Gecko) Chrome/4.0.249.64 Safari/532.5

■IE8
通常: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)
Ajax: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)

■IE7
通常: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)
Ajax: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)

■IE6
通常: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 6.1; WOW64; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)
Ajax: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.2; .NET4.0C; .NET4.0E)

iPhone スレッドに注意

2010.01.31    馬場   タグ: , , —    baba   

iPhoneでNSThreadのスレッドを使う際にうっかりミスった点をメモしておきます。
割と常識のようですが、特にUIImageViewのほうはエラーも出ないので初めてだと焦りますね;;

autoreleaseに注意

何も考えずにスレッド用の関数内でautoreleaseが呼ばれると、

*** NSAutoReleaseNoPool(): Object 0x********* of class NSConreteData autoreleased with no pool in place ….

といった感じのエラーが出てしまいます。

お決まりパターンとして、スレッドの最初で

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

しておいて、スレッド終了時に [pool drain] すればとりあえず問題なさそうです。

別スレッドからUIImageViewのimageを更新しても、表示されない

別スレッドで

imageView.image = [UIImage imageNamed:@"Hoge.png"];

のような処理を実行しても、表示されません。
UIImageViewのimageを設定して表示する処理は、メインスレッドでないとダメみたいです。

メインスレッドで実行するには、実行する処理を関数にまとめた上、

[delegate performSelectorOnMainThread:@selector(theProcess:) withObject:nil waitUntilDone:YES];

のようにperformSelectorOnMainThreadを使えばOKです。

iPhone用 超手抜きUDPサーバ

2010.01.30    ネットワーク, 馬場   タグ: , , —    baba   

先日のiPhone性能検証で作ったソースの一部として、超手抜きUDPサーバのコードを載せておきます。
CFSocketが思ったよりも使いにくいので、BSDソケットほとんど生です・・・

/**
 * 手抜きUDPサーバ
 */
#import <netinet/in.h>
#import <Foundation/Foundation.h>

@interface MyUdpConnection : NSObject {
	id delegate;
}
- (id)initWithDelegate:(id)_delegate; //receiveData:(NSData*)data を実装すること
- (void)bind;
- (void)bindThread;
@end

/**
 * 手抜きUDPサーバ実装部
 */
@implementation MyUdpConnection

// 初期化
- (id)initWithDelegate:(id)_delegate {
	delegate = _delegate;
	return self;
}

// 受信開始
- (void)bind {
	NSThread *th = [[NSThread alloc]initWithTarget:self selector:@selector(bindThread) object:nil];
	[th start];
}

// 受信用スレッド
- (void)bindThread {
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

	struct sockaddr_in addr;
	memset(&addr, 0, sizeof(addr));
	addr.sin_port = htons(5555); //適当なポートで待機
	addr.sin_family = AF_INET;
	addr.sin_addr.s_addr = htonl(INADDR_ANY);

	int sock = socket(AF_INET, SOCK_DGRAM, 0);
	bind(sock, (struct sockaddr *)&addr, sizeof(addr));

	char buf[100000]; //100KBまで対応
	while (1) {
		//ここでデータを受信するまでブロックされる
		int size = recv(sock, buf, sizeof(buf), 0);

		//NSDataに変換し、delegateに通知
		NSData *data = [NSData dataWithBytes:buf length:size];
		[delegate performSelectorOnMainThread:@selector(receiveData:) withObject:data waitUntilDone:YES];
	}

	[pool drain];
}
@end

これを使うと、たとえばViewControllerなどで

- (void)receiveData:(NSData *)data;

を実装しておいて、

MyUdpConnection *udp = [[MyUdpConnection alloc]initWithDelegate:self];
[udp bind];

のようにすれば、データを受信したときにreceiveData:が呼ばれます。

エラー処理や再送処理はおろか、ポート番号すらべた書きのものですが、重要でないデータを受け取る分には、ちょっと改良すれば使い物になりそうです。

古い投稿 »

COPYRIGHT [C] 2009 BEYOND PERSPECTIVE SOLUTIONS LTD. ALL RIGHTS RESERVED.