2010/08/31

Gmail 優先トレイ(Priority Inbox)

Gmail の新機能・優先トレイ(Priority Inbox) - beta

重要度によってフィルタリングをかける、優先トレイ機能
多くのメールの中から、やりとりの多い相手や閲覧回数の多いメールを抽出する機能

返事を多く返す相手はモチロン、毎日呼んでいるメールニュースなんかも表示されるので、なかなか便利かも
機能を有効にして、最初に行う事は Google からの 「Gmail の優先トレイで大事なメールの確認をスピードアップ」の重要度マークを外す事




今の所、全てのアカウントでは有効になってないもよう

2010/08/26

維持費の要らない、緊急地震速報機器(FM電波利用)

自分用まとめ

アレクソンのは全部入り、接点情報が取れるのは大きい、工場のラインやビジネスホンへの収容も可能
ユニデンのは、バッテリー内蔵で、無給電でも最大24時間まで動作、実際に地震が起きた後の余震などに、効果が高いかもしれない
アイリスオーヤマのは、規模や目的に合わせた二種類

◆ アレクソン 希望小売価格 52,290円
-- FM/AM対応、外部アンテナ、接点出力、ライン出力
http://www.alexon.co.jp/products/eew/eew.html

◆ アイリスオーヤマ EQA-101 直販12,800円
-- 外部アンテナ、放送装置への接続
http://www.iris-bouhan.com/earthquake/spec_eews.html

◆ アイリスオーヤマ EQA-001 直販 6,980円
-- 音のみ
http://www.iris-bouhan.com/earthquake/spec_eews.html

◆ ユニデン EWR200 直販 6,980円
-- 音のみ・バッテリー内蔵(最大24時間)
http://www.uniden.jp/products/ewr/ewr200.html

ドコモのGPS携帯で110番してみた

先日、携帯(ドコモ・GPS搭載)から110番する機会があった、内容は別として(大したことないので)

最初に聞かれるのは、
事件ですか?事故ですか?

事故ですと答えると
けが人はいますか?いませんか?

次に場所を聞かれると思い、近くの自販機で住所を確認していると
○○バス停付近ですね?」 ←そうですけど何故???

携帯の画面には、見慣れないアイコンが
GPSにより得た座標を通知しているらしい

そういえば、携帯へのGPS搭載義務化って、どうなったんだっけ?
【追記】義務化ではなく、2011年4月時点で90%の普及率目標 (無理だろうけど)

2010/08/25

Delphi 2010 の RTTI で record の情報取得(2/2)

Delphi 2010 の RTTI とジェネリックスを利用して record 型の情報取得

昨日のコードは、取得するだけで書き込む事を考えてなかったので、その辺りを変更
Create時の引数からポインタを保持して、record そのものを変更しに行く
これで、record の型と値を放り込んだら、レジストリやIniFileやSQLへの書き込みや、読み込みが可能になるクラスが作れるス

ところで、ジェネリックスで与えられた型を使って、汎用ポインタからキャストって出来ないんですかね
var D: T;
    P: ^T;
begin
    D := P^;
end;
みたいなのは OK ですが
var D: T;
    P: Pointer;
begin
    P := @D;
    D := T(P); // NG
    D := (P as T); // NG
    D := <T>(P); // NG
end;
みたいなのは、NGで一方通行なんです

昨日と似たコード(Value がプロパティに変更され、引数のカッコを変更)で、書き込みをしている
procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
    RecField: TRttiRecordField<TTestRecord>;
    TestRecord: TTestRecord;
    S, ValueStr: string;
begin
    TestRecord.Key := 'Hello';
    TestRecord.Value := 99;

    RecField := TRttiRecordField.Create(TestRecord);
    try
        for I := RecField.Count - 1 downto 0 do begin
            S := RecField.Name(I);

            case RecField.ValueType(I) of
                tkInteger:
                    ValueStr := IntToStr(RecField.Value[I].AsInteger);
                tkUString:
                    ValueStr := RecField.Value[I].AsString;
            else
                ValueStr := '[else]';
            end;

            if (S = 'Key') then begin
                RecField.Value[I] := 'Good Bye';
            end;

            Memo1.Lines.Add(S + ' = ' + ValueStr);
        end;
    finally
        RecField.Free;
    end;

    Memo1.Lines.Add(TestRecord.Key);
end;
以下 TRttiRecordField<T>
unit RttiRecordFieldUnit;

interface

uses Classes, RTTI, TypInfo;

type
    TRttiRecordField<T> = class
    private
        FRecData: T;
        PRecData: Pointer;

        FCtx: TRttiContext;
        FFields: TArray<TRttiField>;

        function GetValue(I: Integer): TValue;
        procedure SetValue(I: Integer; AValue: TValue);
    public
        constructor Create(var ARecData: T);
        destructor Destroy; override;

        function Count: Integer;
        function ValueType(I: Integer): TTypeKind;
        function Name(I: Integer): string;
        property Value[I: Integer]: TValue read GetValue write SetValue;
    end;

implementation

{ TRttiRecordField<T> }

constructor TRttiRecordField<T>.Create(var ARecData: T);
begin
    PRecData := @ARecData;
    // FRecData := ARecData;

    FCtx := TRttiContext.Create;
    FFields := FCtx.GetType(TRttiRecordField<T>).GetField('FRecData').FieldType.GetFields;
end;

destructor TRttiRecordField<T>.Destroy;
begin
    inherited;
    FCtx.Free;
end;

function TRttiRecordField<T>.Count: Integer;
begin
    Result := Length(FFields);
end;

function TRttiRecordField<T>.Name(I: Integer): string;
begin
    Result := FFields[I].name;
end;

function TRttiRecordField<T>.ValueType(I: Integer): TTypeKind;
begin
    Result := FFields[I].FieldType.TypeKind;
end;

function TRttiRecordField<T>.GetValue(I: Integer): TValue;
begin
    Result := FFields[I].GetValue(PRecData);
end;

procedure TRttiRecordField<T>.SetValue(I: Integer; AValue: TValue);
begin
    FFields[I].SetValue(PRecData, AValue);
end;

end.

2010/08/24

Delphi 2010 の RTTI で record の情報取得(1/2)

Delphi 2010だったかで、機能追加された RTTI。 クラスなどのフィールド情報などを取得できる
( 2/2はこちら )

喜んで試してみたんだけど、class だけで record の情報は取得できない様子(できるのかもしれんが)
ただ、class メンバの record 型の情報は取れるので、ジェネリックスと絡めて record 型のメンバとデータを取得するクラスを作成してみた(後半のコード)

何がしたかったかというと、データ設定値などを record 型で作成して、レジストリやIniファイルへ保存するようなパターンで、フィールドが増えたときにいちいち保存や読込の所を修正しに行くのが面倒
TInifile を継承して、レコード型を渡すだけで、全て指定セクションに書き込んでちょ、みたいなのを最終的に利用できればよいと思う(SQLとのやりとりなんかにも)

Form1 に Button1 と Memo1 を貼って、TTestRecord のメンバと値を列挙する
(とりあえず String と Integer の例)

TRttiRecordField の Create で、型と実際の値を渡してやれば、あとはメソッドを呼び出すだけです
type
    TTestRecord = record
        Key: string;
        Value: Integer;
    end;

procedure TForm1.Button1Click(Sender: TObject);
var I: Integer;
    S: string;
    RecField: TRttiRecordField<TTestRecord>;
    TestRecord: TTestRecord;
begin
    TestRecord.Key := 'Hello';
    TestRecord.Value := 99;

    RecField := TRttiRecordField<TTestRecord>.Create(TestRecord);
    try
        for I := RecField.Count - 1 downto 0 do begin
            S := RecField.Name(I) + ' = ';

            case RecField.ValueType(I) of
                tkInteger:
                    S := S + IntToStr(RecField.Value(I).AsInteger);
                tkUString:
                    S := S + RecField.Value(I).AsString;
            end;

            Memo1.Lines.Add(S);
        end;
    finally
        RecField.Free;
    end;
end;
以下 TRttiRecordField クラス (書き込みに対応したコードは、こちら)
unit RttiRecordFieldUnit;
interface

uses Classes, RTTI, TypInfo;

type
    TRttiRecordField<T> = class
    private
        FRecordData: T;
        FCtx: TRttiContext;
        FFields: TArray<TRttiField>;
    public
        constructor Create(ARecordData: T);
        destructor Destroy; override;

        function Count: Integer;
        function ValueType(I: Integer): TTypeKind;
        function Name(I: Integer): string;
        function Value(I: Integer): TValue;
    end;

implementation

{ TRttiRecordField<T> }

constructor TRttiRecordField<T>.Create(ARecordData: T);
begin
    FRecordData := ARecordData;
    FCtx := TRttiContext.Create;
    FFields := FCtx.GetType(TRttiRecordField<T>).GetField('FRecordData').FieldType.GetFields;
end;

destructor TRttiRecordField<T>.Destroy;
begin
    inherited;
    FCtx.Free;
end;

function TRttiRecordField<T>.Count: Integer;
begin
    Result := Length(FFields);
end;

function TRttiRecordField<T>.Name(I: Integer): string;
begin
    Result := FFields[I].name;
end;

function TRttiRecordField<T>.ValueType(I: Integer): TTypeKind;
begin
    Result := FFields[I].FieldType.TypeKind;
end;

function TRttiRecordField<T>.Value(I: Integer): TValue;
begin
    Result := FFields[I].GetValue(@FRecordData);
end;

end.

2010/08/17

ドコモwebメールの仕様

糞仕様なドコモwebメール(gooメール)


ある程度たまってから。というか、後からフィルタ設定を行う事はよくある
ある差出人からのメールを指定フォルダへ移動させようとか

ドコモwebメールには、作成したフィルタを受信箱に対して適用する事が出来ない
まぁ、それなら検索で絞った上で移動すればいいか~ と検索で、Fromを絞り込む

しかし、絞込結果を選択して選択できるメニューが、「削除」と「受信拒否」のみ。ドラッグして個人フォルダへ移動する事も出来ない

とりあえずフラグを立てて、受信箱から並び替え表示させて、固めておいて移動とか考えたが、受信箱で並び替えを切り替えられない

あのなぁ...

使いたいときに使い物にならなかったドコモwebメール

wmiprvse.exe アプリケーション エラー

wmiprvse.exe アプリケーションエラー の原因は多くあると思うけど、DELLのサービス Iap.exe を停止した事により、起動後定期的にエラーが発生

イベントビューアーからの確認で、wmiprvse.exe のエラー前後に DCOM 関連の Iap.exe がエラーを吐いていた
Iap.exe は、DELL の OMCI と共にインストールされるサービスなので、OMCIをコントロールパネルから削除

Iap.exe に限らず、wmiprvse.exe のアプリケーションエラーが発生する場合、イベントビューアーを確認すると原因が見つかるかも

2010/08/15

user_prefs は、いずこへ?

松田氏の user_prefs を cron でダウンロードしていたら、数日前からエラーが出ていた
http://tlec.linux.or.jp/docs/user_prefs からのダウンロードに失敗しているらしい

http://www.flcl.org/~yoh/user_prefs移動しているみたい
(HEADコマンドで更新を見ているのは、私の管理するサーバのいくつかス)

2010/08/11

Delphi/C++ Builder TPopupMenu を右クリックで呼び出した(呼び出された?)コンポーネント

Delphi/C++ Builder TPopupMenu を右クリックで呼び出した(呼び出された?)コンポーネントを取得

通常Sender には TMenuItem が入ってくるので、PopupComponent プロパティを使用すると、右クリックでPopupMenu を呼び出したコンポーネントが取得できる

procedure TGuiSetupForm.pop_AAAClick(Sender: TObject);
begin
    if (PopupMenu1.PopupComponent is TEdit) then begin
        TEdit(PopupMenu1.PopupComponent).SelText := 'hogehoge';
    end;
end;

2010/08/09

「Security Tool」ウィルスの削除

今更ながら 「Security Tool」ウィルスを駆除する機会があった

感染源はメールらしい
メーラー(MS-Outlook2007)が起動しないので、ウィルス感染したんじゃないかとの連絡を受ける
あまりにも有名で立派なユーザーインタフェイスなので、リモートですぐに確認


ひとまずプロセスを殺すため(タスクマネージャーは起動不可)に、rkill.com をダウンロードして、デスクトップあたりに置く(あとで、立て続けに起動しやすいように)

で rkill.com を連発して起動させ、プロセスを殺す
(最初に起動させたときに、実行時の警告チェックをはずしておく)
おそらく Security Tool は、主プロセスを別のプロセスから監視して、いなくなるとすぐに起動させるようにしているのだろう。なので、rkill.com を連続して起動する必要がある

プロセスを殺した所で (ここで再起動してはならない) ちょっと調べてみる
以下辺りに、あやしい実行ファイル有り
  • C:\Documents and Settings\All Users\Application Data\数字\数字.exe
  • C:\Documents and Settings\[UserName]\Application Data\数字\数字.exe
  • C:\Windows\Temp\ランダム.exe
また、レジストリのスタートアップ項目にも c:\Windows\Temp\ランダム.exe へのリンク有りHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
(Windows\temp\ランダム.exe が監視プロセスなのかも)

未確認ながら、駆除前に上記のファイルをある程度特定していたので、
実行中にファイル名を書き換えてみた(実行ファイル名は、実行中に変更できる)が、
それで再起動しても対処可能だったのかも???

お急ぎで、怪しいファイルが必要ないとわかっている場合は、rename や
目的のレジストリ項目を削除するなどで完了
わからない人は Malwarebytes' Anti-Malware をダウンロード・セットアップ・実行して駆除を行う

2010/08/05

ウィルコムとソフトバンク

ウィルコム、ソフトバンクとスポンサー契約締結
予想以上に加入者が減り続けているため、再生方法を再検討なんでしょう

少なくとも PHSの音声ユーザーは、ソフトバンク携帯へ移行が促される事になるでしょう。また、「だれとでも定額」の全国展開は移行の妨げになるので、提供は難しい???

さらに心配が2つ

PBX配下で動作している構内PHS。PBXメーカーの供給する内線端末があるから大丈夫!とかPBXメーカーは言っているが 2011年末で中国PHSの終了が決定しているため、部品供給がかなりあやしい。(数が出ないといって値上げしたんじゃ意味ないし、そうでなくても高くて壊れやすいって言われる構内PHS用端末だから)

次にウィルコムPHSをMVNOしている、NTTコミュニケーションズ、フュージョン楽天 等の存在。自社網へ接続させて、固定電話並みの料金で提供しているので、携帯で同体型の料金が実現可能だろうか...
プリペイドのデータ系を提供している日本通信なんかは、プリペイドの提供を停止して3Gへ移行を促せば、問題なし(というか、既にそういう状況)

携帯でもPHSほどではないにしろ定額サービスが出ているし、データ系はe-mobile や WiMAX のエリアも広がってきているので、そろそろ終了の兆しでしょうか

2010/08/02

iモードメールの 「存在するドメインからのみ受信」 はザルなのか

iモードメールの迷惑メールフィルタ設定の STEP2 で、PC等から送信されたメールに対して「存在するドメインからのみ受信」という選択が可能


しかし、このフィルタを選択していても、Fromが 「hogehoge@」とかいうドメインが記述されていないアドレスは、スルーしてしまうらしい

意味ね~じゃん