昨日購入した電話機 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件ずつ入れるよりは楽ですね。
社内の電話機をリプレースしました。
今まで子機が1台しかなく不便だったため、子機の追加購入を検討していたのですが、子機1台15000円以上するため、本体ごと買い換えてしまいました。
・SDカードで電話帳をインポート、エクスポートできる
・SDカードにすべての通話を録音できる
とても便利そうです。
事務の方ならみんな知っているのかもしれませんが、開発者は意外と知らない、Excel 2007の使い方。
たくさん図形を作ったとき、複数を一括選択するときは、Shiftキーを押しながら選択すればOKです。
しかし、何十個もShiftキーを押しながら選択するのは大変です。
そこで、「オブジェクトの選択」機能を使いましょう。

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

こうやって一括選択できる
Excel 2003まではわかりやすい場所にあったのですが、2007になって隠れてしまいましたね。
また、同じ図形を連続で描きたいときは、図形を右クリックして「描画モードのロック」をすればOKです。

描画モードのロック
描き終わったらESCを押しましょう。
WindowsをActiveDirectoryに参加させると、コントロールパネルの「ユーザアカウント」が変わります。
ActiveDirectoryのユーザを追加する際は、サーバ上で設定すれば良いのですが、各PCのローカルユーザを追加するときにちょっと戸惑います。
ダメなパターン
「ユーザアカウント」を開くと、「追加」ボタンがあるので、それを押してみると・・・

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

追加

権限の設定

完了を押すと・・・
このように、エラーになってしまいます。
この画面は、既に存在するユーザにグループを設定することは出来ますが、新規ユーザの作成ができません。
正しいやり方
「ユーザアカウント」の「詳細設定」タブで、「ユーザ管理の詳細設定」を開きます。

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

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

ユーザ情報の入力
これで、ローカルユーザが追加出来ました。もちろん、管理者権限のあるアカウントでログインしていることが必要です。
わかりにくいですね。
どっちだよ!って思いますよね。ふつう。

問題が発見されま...
ここで
・日本語
・Windows
・フォント
どれの責任と思うかで、性格診断ができます。
Windows/Macで共用のSVNリポジトリを使った際、WindowsのEclipseで「更新」をしたら、
Cannot create new file
ファイル名、ディレクトリ名、またはボリューム ラベルの構文が間違っています。
といったエラーが発生しました。
これは、MacのXCodeでコミットしたときに、buildフォルダの中に > が含まれるファイル名のファイルがあったことが原因です。
Windowsでは > を含むファイル名は許可されないので、エラーが発生していました。
Macで該当ファイルを削除すれば、エラーは直ります。
また、このようなことがないよう、XCodeのbuildフォルダはSVNにコミットしない方が良いですね。
先日の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枚/秒くらいなら全然問題にならない程度の速度は出ていました。
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で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サーバのコードを載せておきます。
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:が呼ばれます。
エラー処理や再送処理はおろか、ポート番号すらべた書きのものですが、重要でないデータを受け取る分には、ちょっと改良すれば使い物になりそうです。