ListViewで全て選択

ListViewで全ての項目を選択した状態にしたいとき。
マネージで普通に書くとループなりイテレータなりでこんな感じ。

foreach(var item in listview.Items){
    ((ListViewItem)item).Selected = true;
}

数が増えると遅い。

SendMessage一発ではやい。

        private const UInt32 LVM_FIRST = 0x1000;
        private const UInt32 LVM_SETITEMSTATE = (LVM_FIRST + 43);
        private const UInt32 LVIF_STATE = 0x0008;
        private const UInt32 LVIS_SELECTED = 0x0002;
        
        struct LVITEM
        {
            public UInt32 mask;
            public Int32 iItem;
            public Int32 iSubItem;
            public UInt32 state;
            public UInt32 stateMask;
            public string pszText;
            public Int32 cchTextMax;
            public Int32 iImage;
            public IntPtr lParam;
            /* 以下略 */
        }
        
        public void SelectAllItems()
        {
            LVITEM lvitem = new LVITEM();
            lvitem.mask = LVIF_STATE;
            lvitem.state = LVIS_SELECTED;
            lvitem.stateMask = LVIS_SELECTED;
            SendMessage(listview.Handle, LVM_SETITEMSTATE, (IntPtr)(-1), ref lvitem);
        }

        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        static extern IntPtr SendMessage(IntPtr hWnd, UInt32 uMsg, IntPtr wParam, ref LVITEM lParam);

カテゴリー: Lutea日記, Programming | タグ: , | コメントをどうぞ

Linux mdのRAIDをメンテした

Linux mdを使って組んでいた1TB×3発のRAID5アレイを1TB×4発にした。

コマンドは以下の通り。

mdadm --add /dev/md1 /dev/sdd1
mdadm --grow /dev/md1 --raid-devices=4
mdadm --grow /dev/md1 --size max
xfs_growfs -d /dev/md1

mdadm –grow /dev/md1 –raid-devices=4 でRAIDの再構築(reshape)が行われる。進捗は/proc/mdstatで確認できる。

当初は1600minかかるとか表示されており、実際一晩経っても50%程度しか完了していなかった。

/proc/sys/dev/raid/speed_limit_max を大きくするのは実行していたが、それでも遅すぎる。

調べたところ、/sys/block/md[n]/md/stripe_cache_size を大きくするという情報を見つけた。

きちんとはかってはいないが、これによって3~5倍程度まで高速化したようで、その後数時間で再構築が完了した。

よく分からんので、リビルドが完了したら元の値に戻して運用することにした。

RAID5がiowait出まくりで遅いので、stripe_cache_sizeを増やした話 | Fusic Developers’ Weblog

md reshape ちょっと高速化 | hellokitty68

カテゴリー: Linux | コメントをどうぞ

Windows7のタスクバーに表示されるウィンドウのアイコンについて

はじめはバグではないかと思った挙動なのですが、色々試すうちに「こういうもの」なんだろうなと思い直しました。

しかし、分かりにくいので整理してみます(あんまり整理できてないかもですが)

前提

Windowsプログラムはexeファイル自体にアイコン画像が埋め込まれています。

エクスプローラ等ではexeファイルからこのアイコン画像を抽出して表示するわけです。

そして、プログラムを起動すると、タスクバーにも基本的にこのアイコンが表示されます。

Windows7のタスクバー

Windowsのタスクバーは、Windows7において大きく手が加えられました。

タスクバーの改良点は色々ありますが、ここで注目するのは以下の2点です。

  • プログラム(ウィンドウ)のアイコンとして「大きいアイコン」を使用するようになった。
  • MacOSXのDockのように、起動していないプログラムのアイコンをタスクバー上に固定してランチャーとして使用できるようになった(タスクバーにこのプログラムを表示する 設定)

ウィンドウのアイコン(WM_SETICON, WM_GETICON)

ここからの話はWindowsのバージョンによって異なります。以下はWindows7での動作となります。

タスクバーに表示されるプログラムのアイコンは、基本的にexeファイルに埋め込まれているアイコン画像が使用されるのですが、WindowsからWM_GETICON(wParam=ICON_BIG)というウィンドウメッセージが送信されたときに適当なアイコンを返してあげることにより、任意のアイコンをウィンドウのアイコンとして使用できるようになります。WM_GETICONが送信されるのは

  • プログラム起動時
  • ウィンドウのキャプションを変更する等したとき(おそらく再描画がかかるため)
  • WM_SETICON(wParam=ICON_SMALL)というウィンドウメッセージを送ったとき

WM_SETICON(wParam=ICON_SMALL)を送るとWM_GETICON(wParam=ICON_BIG)が送られてくるというのがイマイチ理解できませんが、とにかくプログラムからWM_SETICONを送ることで「任意のタイミングで」「任意のアイコンを」ウィンドウのアイコンに設定することができるわけです。

ちなみに、WM_SETICONで送信するアイコンハンドルは、適当な乱数でもよく、WM_GETICONに対して適切なアイコンハンドルを返すことが必要なようです。

ウィンドウの結合とアイコン

ここからが本題です。

Windows7のタスクバーには、同一プログラムのウィンドウが複数あるとき、それらを1プログラムのスペースに纏めて表示する(結合)という機能があります。

タスクバーのプロパティから「タスクバー」→「タスクバーのボタン」の値が「常に結合、ラベルを非表示」または「タスクバーがいっぱいの場合に結合」となっている場合、結合が行われます。

WM_SETICONやWM_GETICONでのアイコンの設定は、ウィンドウに対して行われるものですから、結合が行われると、1つの表示領域に対して複数のアイコンが存在してしまうことになります。

この問題に対して、Windowsはどうするのでしょうか?

答えはなぜか2つあります。

プログラムが「タスクバーにこのプログラムを表示する」に設定されている場合は、exeファイル埋め込みのアイコンが使用されます。

プログラムが「タスクバーにこのプログラムを表示する」に設定されていない場合は、先頭のウィンドウのアイコンが使用されます。

特に、タスクバーボタンの設定が「常に結合、ラベルを非表示」となっている場合、ウィンドウが1つしかなくても内部的には1つのウィンドウが「結合」されている状態らしく、「タスクバーにこのプログラムを表示する」に設定すると即アイコンがexeファイル埋め込みのものになってしまいます。

カテゴリー: Windows, Windows7 | コメントをどうぞ

IS12T

馬鹿なので買いました。

カテゴリー: 未分類 | コメントをどうぞ

linux bonding

なんとなくLinux bondingによるネットワークのトランキングを試してみた。

bondingというのがLinuxにおけるポートトランキング実装の名前であり、束ねた仮想的なネットワークインタフェースをmaster、束ねられる物理NICをslaveと呼ぶ。

当方の実験環境は以下の通り。

  • PC: hp ML110 G5
  • OS: Debian GNU / Linux 6.0 @ Linux 2.6.32-5 (x86)
  • NIC1: OnBoard Broadcom Corporation NetXtreme BCM5722(tg3)
  • NIC2: PCIe Intel Pro 1000 CT Desktop Adapter(e1000e)
  • Intelligent L2SW: Allied Telesis CentreCOM GS924M
  • Non-Intelligent L2SW: CG-SW08GTPV2

PC側の設定

Debianでは、bondingはifenslaveというパッケージで提供されているので、まずaptからifenslaveのインストールを行う。

# aptitude install ifenslave

次に、/etc/modulesを編集し、起動時にbondingモジュールを読み込むように設定する。

既存のファイルにbondingという行を追加するだけでいい。

$ cat /etc/modules
# /etc/modules: kernel modules to load at boot time.
## This file contains the names of kernel modules that should be loaded
# at boot time, one per line. Lines beginning with “#” are ignored.
# Parameters can be specified after the module name.
loop
bonding

次に、/etc/modprobe.d/にbonding.confのようなファイルを適当に作成し、bondingの設定を記述していく。

options bonding mode=x miimon=0 arp_interval=10000 arp_ip_target=aaa.bbb.ccc.ddd

決めるべきことはbondingのmodeとリンクの死活監視の方法である。

modeについては http://www.jp.redhat.com/magazine/jp/200904/rhel.html この辺を参考に適当なものを選択する。

リンクの死活監視にはMIIが使える環境ならMIIを、使えないならarpを使う。これも適当に設定する。ethtool eth*としたときにbondingに使用するNIC全てでちゃんと出力が出ればMIIでいいらしい。

最後にbondingインタフェースの設定を行う。ディストリによって差が出る部分である。

debianでは/etc/network/interfacesファイルに通常の物理NICと同じようにIPアドレスやネットマスクについて記述すればよい。

当方の環境ではこれまでeth0だった部分をbond0に書き換えて、slaves eth1 eth0という行を追加するだけでよかった。

出来上がりとしてはこのようになる。

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet static
allow-hotplug bond0
iface bond0 inet static
address 192.168.10.100
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.1
# dns-* options are implemented by the resolvconf package, if installed
dns-nameservers 8.8.8.8
slaves eth1 eth0

なお、udevでNICの名前を置き換えているとややこしくなるので、/etc/udev/rules.d/70-persistent-net.rulesを弄ってNAMEを元々認識されるeth*に合わせておいたほうが無難である。(dmesgを調べると分かるはず)

ここまで設定してリブートすると、NICがbondingされた状態で起動するはずである。

ifconfigにbond0というインタフェースが現れ、slavesと設定したNICの状態にUP BROADCAST RUNNING SLAVE MULTICASTのようにSLAVEが含まれていればOKです。

/proc/net/bonding/bond0を読むことでより詳細な情報を得ることができる。

$ cat /proc/net/bonding/bond0
Ethernet Channel Bonding Driver: v3.5.0 (November 4, 2008)

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0

802.3ad info
LACP rate: slow
Aggregator selection policy (ad_select): stable
Active Aggregator Info:
Aggregator ID: 1
Number of ports: 1
Actor Key: 17
Partner Key: 1
Partner Mac Address: 00:00:00:00:00:00

Slave Interface: eth1
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Aggregator ID: 1

Slave Interface: eth0
MII Status: up
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:xx
Aggregator ID: 2

実験

ではここから実験の開始。

まずはmode0の実験を行う。

mode0については、参考にするサイトによってポートトランキングに対応したSWが必要と書かれていたり、いなかったりする。

結論から言うと、当方の環境での実験では、トランキング非対応のスイッチでもフェイルオーバーを含めた動作が期待通りに行われた。

したがって、mode0にはポートトランキング対応SWは必須ではないようだ。

ただし、SW→PCのトラフィックがいずれかのNICに偏るなどして本来の性能が発揮できない、といった問題があったりするかもしれない。

カテゴリー: 未分類 | コメントをどうぞ

PX-W3PE、内蔵BCASリーダ使用で復号漏れ

運用を開始したAtom録画サーバで録ったtsを見てると稀にコマ落ちする気がしていたのですが、

どうも復号漏れというやつらしいです。

データ自体が落ちているわけではないですし、見て削除する分には問題ない程度なのですが、

保存を考えるとpost processが必要になりそうです。

しかし、カードリーダー内蔵のボードを買ったのに結局別にカードリーダー必要になるコースなのが残念。

カテゴリー: Hardware | コメントをどうぞ

録画サーバ作った

PX-W3PE買ってきたので録画サーバを構築しますた。

ハードウェア:

ケース=岡谷エレクトロニクス MX1203-BK

マザー=ASUS AT5NM10T-I

メモリ=Transcend JM1066KSU-2G (SODIMM DDR3 PC3-8500 2GB)

HDD=WesternDigital WD5000AACS (その辺に転がってたやつ)

チューナー=PLEX PX-W3PE

OS=Windows Server 2003(DreamSparkで入手したやつ)

録画ツール=TVTest + tvrock

という構成。HDDとOS抜いて合計約3.8万というところ。

Server 2003はドライバ類を入れるのにxpよりもやや手間がかかったが(不明なデバイスが残ってる)録画サーバとしては問題ない。

ハードディスクは先頭の30GBだけ切り出してOSと録画ツールのみインストールしてあり、

動画のネットワーク経由でNASに保存されるようにしてある。

CPUはDualCore Atom D525の1.8GHzなのだが、負荷は1チャンネルの録画で15%ぐらい。

4並列で録画すると70%ぐらいは持っていかれる。

5並列以上は考えないほうがよさそうだ。

カテゴリー: Hardware | コメントをどうぞ

PX-W3PE買ってきた

東京方面に行く用事があったので、PCI-Expess接続, ロープロ対応でts抜けるチューナーボードことPX-W3PEを買ってきました。

とりあえずWindows Server 2008 R2のメインマシンに入れて使ってます。

試しに設定してみたそふてにっの予約録画も正常に始まったっぽいです。

そのうち録画鯖作ろうかなっと

カテゴリー: Hardware | 1件のコメント

bass_flv, flv.fapでaacなflvが再生できない

flvの仕様でaacだけ特別な扱いなんだけど、当時aacなflvのサンプル持ってなかったから放置してたんだった。

サンプル見つけたのでいじってみよう。

http://hibari.2ch.net/test/read.cgi/software/1268836916/509-526

517 :名無しさん@お腹いっぱい。:2011/05/20(金) 01:54:44.21 ID:BLAG6gER0
windows7/32bitでtest46を使用しています。
bass_flv.dllをbassフォルダに入れてFLVファイルを再生すると、100%の確率でfittle本体が強制終了します。
flv.fapをfapフォルダに入れると、フォルダツリーにFLVファイルが表示されますが、左クリックでも関連付けでもファイルドロップでもプレイリストに追加できず、再生できません。
どなたか解決方法をご存知の方がおられましたら、よろしくお願いします。

518 :名無しさん@お腹いっぱい。:2011/05/20(金) 10:47:51.81 ID:17ZWSRys0
ある特定のflvだけなのか
そのflv以外はいけるのか

519 :517:2011/05/20(金) 21:38:35.56 ID:BLAG6gER0
FLVファイル全般です。
ほとんどがyoutubeからダウンロードしたものですが、例外はありませんでした。

521 :名無しさん@お腹いっぱい。:2011/05/21(土) 04:25:11.26 ID:BHtuIdKL0
>>519
FLVは動画形式なので、fittleには向いてない。
どうしても音声だけ聞きたいのであればツールで抽出して
音声だけにしてから聞くのが良い。
それか、生flvを「聞く」のならmpc-homecinemaで開く、これが一番安心。

522 :名無しさん@お腹いっぱい。:2011/05/21(土) 20:11:31.22 ID:mzWDVkgJ0
>>519
そのFLVを真空波動研に放り込んだらどう表示される?
たしかYouTubeのFLVはH.264+AACになってるんじゃないかな。

523 :名無しさん@お腹いっぱい。:2011/05/21(土) 21:57:10.36 ID:WFlyqnHe0
そんなもんあるんだなーと俺もやってみた
AACで16bitのはまず弾かれるようだ
そうじゃないのはとりあず試したぶんではOK
まぁ>>521とかてきとーな動画プレイヤーで最小化しとくとかが無難だろな

524 :名無しさん@お腹いっぱい。:2011/05/21(土) 21:58:45.00 ID:vnIRf7qR0
flv関連はどう考えても再生できたらラッキーってレベルだしなぁ

525 :名無しさん@お腹いっぱい。:2011/05/21(土) 22:55:43.53 ID:Hypee68/0
前にも同じこと書いた記憶があるんだが
えこでこツールで音声ファイルだけ抽出して再生すればOK
出力の音量設定をしておけばファイルによって音の大きさが違うなんてこともなくなる
http://sourceforge.jp/projects/ecodecotool/wiki/FrontPage

526 :517:2011/05/22(日) 00:11:57.01 ID:AzfvXYVD0
>>521->>525
私が所持していたファイルは全てAVC/H.264と表示されました。
試しに別のサイトからダウンロードしてみると、On2 VP6のFLVファイルは問題なく音声が再生されました。
ファイルの音声形式に対応していなかったのですね。
皆様、色々と教えて頂き、本当にありがとうございました。
カテゴリー: 未分類 | コメントをどうぞ