64bit環境でvcredist_x64.exeを入れても,MSVCR100.dllが有りませんのエラーが出る場合

VisualC++2010で作成したプログラムを実行するためには、実行環境にMSVCR100.dllが必要となります。このdllは、Microsoftより下記のパッケージを入れることでインストールされます。
Microsoft Visual C++ 2010 再頒布可能パッケージ (x86)
Microsoft Visual C++ 2010 再頒布可能パッケージ (x64)


32bitのOSで使用する場合は、x86のパッケージを入れることでプログラムが使えるようになるのですが、64bit版のwindowsを使用時は、x64のパッケージを入れても問題が解決しない場合があります。

これは、実行しているプログラムがx84用として作成(コンパイル)されている事が原因です。


この場合に問題を解決する方法ですが、64bit環境であっても、x86版のパッケージもインストールしてしまえばOKです。x64とx86版は、両方ともインストールしても構いません。
Windowsはなぜ動くのか
プログラムはなぜ動くのか



補足: 開発者さん向け情報
コンパイル時のオプションを、/MDではなく、/MTに変更すれば,ライブラリがスタティックリンクされるようになるので、msvcr100.dllが不要になります。スタティックリンクさせると、exeのサイズが大きくなってしまいますが、ユーザ側の作業が減る(ランタイムのインストールが不要になる)ので、PC初心者をターゲットにしたプログラムを作成する場合は、この方法を使用することを検討するのも良いかもしれません。

[C#]TextBoxに数字のみ入力可能にする

以下のコードは、TextBoxに対して数字のみを入力可能とするコードです。
数字以外を入力した場合は無視されます。

private void textBox1_KeyPress( object sender, KeyPressEventArgs e ) {
    // 制御文字は入力可
    if ( char.IsControl(e.KeyChar) ) {
        e.Handled = false;
        return;
    }
 
    // 数字(0-9)は入力可
    if ( char.IsDigit(e.KeyChar)  ) {
        e.Handled = false;
        return;
    }
 
    // 小数点は1つだけ入力可
    if ( e.KeyChar == '.') {
        TextBox target = sender as TextBox;
        if ( target.Text.IndexOf('.') < 0 ) {
            // 複数のピリオド入力はNG
            e.Handled = false;
            return;
        }
    }
 
    // 上記以外は入力不可
    e.Handled = true;
}



3つめのifで、小数点の入力を許容しています。
もし、小数をNGとみなしたい場合は、3つめのif文自体を削除すればよいです。

また、数字(digit)ではなく数値(number)の入力を行わせたい場合は、NumericUpDownコントロールが便利です。こちらは、上記のような入力制限に加えて、上限値・下限値を指定する事も可能です。





また、本題からは少し外れますが、数字(digit)と数値(number)の違いについて説明します。

数字というのは、数を表す文字で、例えば社員番号、会員No、伝票番号なども数字に含まれます。
これに対して数値は、金額や数量などの、数学的な意味での”数”を意味します。

謎の企業、fabrikam.comを調査する

今日、いつものようにリモートデスクトップを使おうと思ったら、入力例にcomputer.fabrikam.comと表示されている事に気づきました。



このドメイン、いったいなんだろうと思って、試しにブラウザでアクセスしてみました。
IEで、fabrikam.comにアクセスしてみます。



すると、302リダイレクトでwww.microsoft.com/ms.htmに飛ばされてしまいました。


そこからさらにhttp://www.microsoft.com/に飛ばされ、結果的にMicrosoftのホームページが表示されました。




どういうことかと思い、fabrikamについて調べてみると、どうやらfabrikam.comというドメインは、Microsoftが例として使用する架空の会社(ドメイン)のようです。

SharePoint Serverのドキュメントによると、以下のような設定があるようです。
国際的な,ハイテク製造メーカーですね。

Fabrikam Industries 社は、世界的に認められている大手製造元です。この企業が設計および販売する製品は、信頼性の高さのみならず、革新的な設計が評価されています。Fabrikam Industries 社は、組織の成功に欠かせない企業文化の統合を促進し、そうしたレベルの品質を達成するための惜しみない努力を続けています。そして、それを実現させているのは、組織全体でのアイデアの収集と効率性の向上です。

Fabrikam Industries 社は、米国本土と世界中の主要な場所にオフィスを構えています。そのため、企業内文化の問題だけでなく、全社的なビジネスおよびコミュニケーションの課題に直面します。そうした問題には、物理的な場所に関係する基本的な問題から、言語、タイム ゾーン、企業データ センター、世界各地での帯域幅の制限の問題まで、さまざまなものがあります。

Fabrikam Industries 社は、情報アーキテクチャに関してばく大な投資をしています。この企業の調査では、企業買収、および IT 分野でのリーダーシップの歴史的な移行により本業の成長がもたらされる兆候があることが示されています。また、この企業では、独自のデータ センターで、電子メール、ファイル共有、財務などの従来のサービス アプリケーションや基幹業務アプリケーション、および部門のニーズに応じたカスタム アプリケーションのホストを管理しています。分散された企業ネットワークは、業界標準のファイアウォール、境界ネットワーク、およびポイント ツー ポイント接続の組み合わせにより、セキュリティで保護されています。従来からのセキュリティ上の問題により、従業員による使用は、オンサイト アクセスおよび制限されたVPN 接続に限定されています。Fabrikam Industries 社は、通常の従業員チャネル以外の、外部のクライアント、パートナー、および請負業者を既存のアーキテクチャに統合することにある程度成功しています。

Whitepaper: Information Architecture in Office SharePoint Serverより

Microsoftのサイトで調べてみると、他にBiztalkやExchange Serverのマニュアルでも例として使用されていました。




もっと探してみると、まだまだ出てくるかもしれません。

[.Net]Chartコントロールに表示させるグラフ色の,カラーパレット一覧

Chartコントロールでは、1つのコントロールに複数の系列のグラフを描画する事ができます。
この際、各系列が分かりやすくなるよう、色が自動で切り替わるのですが、このカラーパレットはPaletteプロパティで指定する事が可能です。

chart1.Palette = ChartColorPalette.Berry;
chart1.ApplyPaletteColors();



パレットを切り替えたい時は、上記のコードで簡単に変更する事が可能です。

パレットの切り替え方法が分かると、次は、各パレットを使用した際にどんな色が表示されるのかが気になるところですが、これについてはMicrosoftのエンジニア、Alex Gorevがblogで一覧表を提供してくれています。

これを見れば、作成中のアプリに合った色合いを決めたい時にも一目瞭然です。

Setting Microsoft Chart Series Colors – Alex Gorev’s Weblogより


また、どのパレットを使用しても最低10色はあるので、10系列までなら色が重複する事は有りません。

.Net Framework4.0で追加されたChartコントロールを.Net3.5でも使用したい

.Net Framework4.0では、画面にグラフを描画する為のコントロールとして、Chartコントロールが新たに追加されました。

このコントロールは、System.Windows.Forms.DataVisualization.Chartingパッケージに有るのですが、新しいクラスなので、当然ながら.Net Framework3.5以前では通常は使用することが出来ません。


ですが、.Net Framework3.5を使用して開発を行っている場合は、同コントロールが使用できるよう、Microsoftより追加のライブラリを提供してくれています。

下記のページからライブラリをダウンロードし、インストールする事で利用する事が出来ます。


download page: Microsoft Chart Controls for Microsoft .NET Framework 3.5

[C#][.Net]Chartコントロールに表示されているグラフをファイルに保存する

VS2010の.Net Frameworkで用意されているChartコントロールを使用して描画したグラフをファイルに保存する方法です。

private void button1_Click( object sender, EventArgs e ) {
	chart1.SaveImage( "c:\\work\\chart.jpg", ChartImageFormat.Jpeg );
}


上記例のSaveImage()メソッドでは、第二引数でJpegを指定していますが、他にbmp,png,tiffなどのフォーマットでも保存可能です。


上記プログラムを実行すると、以下のようにファイルが作成されます。
下の画像では、キャプチャが二回に分かれたので、jpgファイルのグラフ波形が変わっていますが、実際はもちろん一致します
また、余談ですが、下記のデザインでグラフを描画するサンプルはこちらで説明しています。

            ↓



また、ファイル名を指定するパターン以外にStream指定版のメソッドもあるので、自前で書き込み用Streamを用意して出力する事も出来ます。この場合の例は以下のようになります。

using ( System.IO.FileStream writer = new System.IO.FileStream( "c:\\work\\chart2.jpg", System.IO.FileMode.Create ) ) {
	chart1.SaveImage( writer, ChartImageFormat.Jpeg );
}

[C#][.Net]Chartコントロールから目盛りの罫線を消す方法

VS2010の.Net Frameworkで用意されているChartコントロール(System.Windows.Forms.DataVisualization.Charting)で、グラフ内にあるグリッドの罫線を消す方法です。
ここでいう罫線とは、下図の赤枠で囲まれた線の事です。



Chartコントロールのプロパティを表示し、ChartAreasを選択します。ChartAreasは、実際にグラフが描画されるエリア(凡例などの周囲の余白ではなく)の情報を管理しています。


ダイアログが表示されるので、Axesプロパティを選択します。


さらに孫ダイアログが表示されるので、左のメンバーからX axisを選択した上で、MajorGrid.Enabledをfalseにします。



変更すると、Chartコントロールの表示でx軸(横軸)側の罫線が非表示になりました。


y軸側も消してしまいたい場合は、Y(Value)axisを選択し、同様に操作します。



これで、x,y軸の両方が非表示になりました。

[ThinkPad]ディスプレイ輝度を自動調整する


ThinkPadのディスプレイ輝度の調整が使い辛い

出先でPCを使用するとき、普段はThinkPadを携帯しています。
ThinkPadではFn+HomeやFn+Endキーを押す事で、ディスプレイの輝度を調整できるのですが、この調整幅が不便です。
厳密には、不便というか…、好みじゃないです。


どこが不便なのか

具体的に何が好みではないかというと、輝度が高い(明るい)時は、明るさを変更したときのメモリが1刻みなのですが、低い(暗い)時の刻みが大きいのです。

例えば最大輝度から1つ下げた時はこのようになるのですが…

            ↓




二番目に暗いところから一段階暗くすると、一気に4メモリも変更されてしまいます。

            ↓


明るい時は問題ないのですが、周囲が暗い場合、”メモリ=4″だと明るすぎるし、”メモリ=1″だと暗すぎることが多いんです。


というわけで、輝度を自動調整するプログラムを作成しました。


ディスプレイ輝度調整ツール


仕組みは簡単です。
タスクトレイに常駐しているプログラムが、ディスプレイ輝度の変化を監視してます


で、輝度の変化があった際、特定された値になったら、変更後の明るさに強制的に設定を変えているだけです。明るさが4から一瞬0になりますが、すぐに指定した値に変わります。

            ↓一旦0に変わるけど…

            ↓すぐに指定した明るさに変更される♪





設定は、タスクトレイのアイコンを右クリックすると出てくるメニューより表示されます。
値の設定は最大3つまで指定可能です。

            ↓




なお、本プログラムはThinkPad専用のアプリにしたくなかったので、汎用性を持たせてます。
プログラム上表示されている輝度値は、ThinkPadでFn+Home,Endを押したときに表示される値とは異なり、Windowsシステムからの取得できる値(最大輝度が100となる値)での指定となります。


ですので、変更前・後の輝度値が知りたい時は、面倒ですが、一旦、希望の明るさにした上で現在の値を控えてください。ThinkPadの場合、こちらのページで確認結果が分かります。
 →ThinkPadのFn+Home,Endによる輝度値と、wmi\WmiSetBrightnessの取得値の対応表

というわけで、他メーカーのPCを使用している場合でも,利用可能かと思います(多分)…


ダウンロード:BrightnessController.zip

[C#]WMIイベントをManagementEventWatcherクラスで処理する

Windowsでは、WMI(Windows Management Instrumentation)のAPIを使用することで、OSを構成しているコンポーネントを操作出来ます。

WMIでは通常データの取得やセットを行う事が多いのですが、イベントハンドラを登録しておく事で、指定した状況が発生したかをプログラムで検出することが出来ます。


今回は、C#より.Net FrameworkのManagementEventWatcherクラスを使用して、イベントハンドラを取れるようにします。サンプルとして、PCに接続されているディスプレイの輝度が変更された事をイベントとして検出し、イベント情報を画面に出力するプログラムを作成します。


イベントハンドラの登録


WMIイベントを受信する上で、最初に行う事はイベントの監視処理です。
下記のコードは、監視の開始処理のサンプルです。

ManagementEventWatcher watcher;
 
public Form1() {
    InitializeComponent();
    SetEventHandler();
}
 
//*********************************************************************
/// <summary> ディスプレイの輝度が変わったときのイベントハンドラを登録する
/// </summary>
//*********************************************************************
void SetEventHandler() {
    //-------------------------------------------------------------------
    // ディスプレイの輝度が変わったときのイベントオブジェクトを取得する
    //-------------------------------------------------------------------
    string              scope    = @"root\wmi";
    string              queryStr = "SELECT * FROM WmiMonitorBrightnessEvent";
    EventWatcherOptions option   = new EventWatcherOptions( null, new TimeSpan( 0, 0, 1 ), 1 );
    watcher = new ManagementEventWatcher( scope, queryStr, option );
 
    //--------------------------------
    // イベント受信時のハンドラを定義
    //--------------------------------
    watcher.EventArrived += new EventArrivedEventHandler( BrightnessEventArrived );
 
    //--------------------------------
    // イベントの監視を開始する
    //--------------------------------
    watcher.Start();
}



まず、SetEventHandler()メソッド内で、ManagementEventWatcherオブジェクトを生成しています。

string              scope    = @"root\wmi";
string              queryStr = "SELECT * FROM WmiMonitorBrightnessEvent";
EventWatcherOptions option   = new EventWatcherOptions( null, new TimeSpan( 0, 0, 1 ), 1 );
watcher = new ManagementEventWatcher( scope, queryStr, option );



コンストラクタの第一引数ではWMIのスコープを定義しています。
例では、プログラムが起動しているPCに対してWMI APIをコールしていますが、他のPCを対象としたい場合は、@”\\hostname\root\wmi” の形式で指定します。
第二引数にて、何のイベントを取りたいかをWQLで指定します。
第三引数ではイベント監視のオプションを指定します(省略可)。




watcher.EventArrived += new EventArrivedEventHandler( BrightnessEventArrived );


オブジェクトを生成したら、イベントが発生したときのハンドラメソッドを登録します。
BrightnessEventArrived()の中身は後述します。




watcher.Start();


その後、Start()メソッドをコールする事で、イベントの監視が行われます。


イベント発生時の処理


イベントハンドラを登録したら、次は実際のコールバック処理を記述します。

下記のコードは、EventArrivedで指定したコールバックメソッドです。

//*********************************************************************
/// <summary>   ディスプレイの輝度が変わったときのイベント
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//*********************************************************************
public void BrightnessEventArrived( object sender, EventArrivedEventArgs e ) {
    ManagementNamedValueCollection ctx      = e.Context  as ManagementNamedValueCollection;
    ManagementBaseObject           newEvent = e.NewEvent;
 
    StringBuilder tmpBuff = new StringBuilder();
 
 
    //----------------------------
    // イベントの情報を取得
    //----------------------------
 
    // イベントプロパティの情報をダンプ
    tmpBuff.AppendLine( "[Properties]" );
    foreach ( PropertyData prop in newEvent.Properties ) {
        tmpBuff.Append( prop.Name + "=" );
        tmpBuff.AppendLine( prop.Value == null ? "null" : prop.Value.ToString() );
    }
 
    // WMIシステムプロパティの情報をダンプ
    tmpBuff.AppendLine( "[SystemProperties]" );
    foreach( PropertyData sysProp in newEvent.SystemProperties ) {
        tmpBuff.Append( sysProp.Name + "=" );
        tmpBuff.AppendLine( sysProp.Value == null ? "null" : sysProp.Value.ToString() );
    }
 
    // WMI修飾子の情報をダンプ
    tmpBuff.AppendLine( "[Qualifier]" );
    foreach( QualifierData qualifier in newEvent.Qualifiers ) {
        tmpBuff.Append( qualifier.Name + "=" );
        tmpBuff.AppendLine( qualifier.Value == null ? "null" : qualifier.Value.ToString() );
    }
 
    //--------------------------------------------
    // イベント情報を画面に表示
    // (UIスレッド側で、UpdateText()をコールする)
    //--------------------------------------------
    UpdateTextDelegate updateTextDelegate = new UpdateTextDelegate( UpdateText );
    this.Invoke( updateTextDelegate, new object[] { tmpBuff.ToString() });
 
    // これはNG
    textBox1.Text = tmpBuff.ToString();
}



指定したイベントが発生すると、本メソッドが実行されます。
イベントの内容は、第二引数のEventArrivedEventArgsで渡されます。
今回の例では、この内容を文字列としてダンプしています。


手元の環境で本処理を実行した結果は、以下のようになりました。


[Properties]
Active=True
Brightness=63
InstanceName=DISPLAY\LEN4014\4&33df4d60&0&UID67568640_0
SECURITY_DESCRIPTOR=null
TIME_CREATED=129823120747750013
 
[SystemProperties]
__GENUS=2
__CLASS=WmiMonitorBrightnessEvent
__SUPERCLASS=WMIEvent
__DYNASTY=__SystemClass
__RELPATH=WmiMonitorBrightnessEvent.InstanceName="DISPLAY\\LEN4014\\4&33df4d60&0&UID67568640_0"
__PROPERTY_COUNT=5
__DERIVATION=System.String[]
__SERVER=null
__NAMESPACE=null
__PATH=null
 
[Qualifier]
abstract=True
dynamic=True



取得したデータを画面に表示する場合、以下のようにUIのプロパティにアクセスしたいのですが、残念ながらこれは出来ません.

textBox1.Text = tmpBuff.ToString();



試しに実行してみると、以下のようにInvalidOperationExceptionが発生します。



これは、イベントハンドラの処理が、UIスレッドとは別のスレッドで実行されているためです。スレッド一覧のウィンドウで確認すると、確かにイベントハンドラ用のワーカースレッドが走っています。


このような状況で、GUI上のコントロールを操作したい場合は、Form.Invoke()メソッドを使用する解決方法が一般的です。下記のように、Invoke()をコールする事で、指定したメソッド(のdelegate)を、UIスレッド側で実行する事が出来ます。

//--------------------------------------------
// イベント情報を画面に表示
// (UIスレッド側で、UpdateText()をコールする)
//--------------------------------------------
UpdateTextDelegate updateTextDelegate = new UpdateTextDelegate( UpdateText );
this.Invoke( updateTextDelegate, new object[] { tmpBuff.ToString() });




実際にコールされるUpdateText()は、以下のように定義します。

//*********************************************************************
/// <summary>   textBoxにメッセージを表示させる
/// </summary>
/// <param name="text"></param>
//*********************************************************************
private void UpdateText( string text ) {
    textBox1.Text = text;
}
 
delegate void UpdateTextDelegate( string text );





WMIイベント監視の終了処理


ManagementEventWatcherを使用して、イベントの監視を行った場合は、プログラムの終了前(一般的にはForm_Closedイベント等)で、Stop()メソッドをコールする必要があります。

//*********************************************************************
/// <summary>   フォームが閉じたときのハンドラ
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
//*********************************************************************
private void Form1_FormClosed( object sender, FormClosedEventArgs e ) {
    //----------------------
    // WMIの監視を停止する
    //----------------------
    if ( watcher != null ) {
        watcher.Stop();
        watcher = null;
    }
}



もしStop()を呼び忘れると、終了時に以下の例外が発生します。
この例外、メッセージが非常に分かり辛く原因の特定が難しいので、忘れずに終了処理を行ってください。


System.Runtime.InteropServices.InvalidComObjectException はハンドルされませんでした。
  Message=基になる RCW から分割された COM オブジェクトを使うことはできません。
  Source=mscorlib
  StackTrace:
       場所 System.StubHelpers.StubHelpers.StubRegisterRCW(Object pThis, IntPtr pThread)
       場所 System.Management.IWbemServices.CancelAsyncCall_(IWbemObjectSink pSink)
       場所 System.Management.SinkForEventQuery.Cancel()
       場所 System.Management.ManagementEventWatcher.Stop()
       場所 System.Management.ManagementEventWatcher.Finalize()
  InnerException:




4789818454
WMIシステム管理開発テクニック

TvTestでEMM処理の実施・非実施を切り替える

TvTestを使用して地デジを視聴している場合、EMM処理が行われてない事が理由で、視聴に問題が出る場合があります。
EMM処理は何かというと、地デジの放送波によって送られてくるデータの処理によるB-CASカード情報の更新処理で、主に以下のことが行われます。

有料チャンネルの契約時、有料チャンネルが視聴可能な事をB-CASカードに覚えさせる
契約登録コードの情報をセットする
省電力のための情報(機器をON/OFFさせる期間)を設定する
ユーザの操作指示なしに、デコーダ単独で強制発呼を行わせる
特定のB-CASカードが刺さっている端末にメッセージを表示させる
不正なB-CASカードを使用不可にさせる


ちなみに、EMMは”Entitlement Management Message”の略称です。


TvTestを使用している場合、下記の手順でEMM処理を行わせる事が出来ます。

TvTestの画面を右クリックし、設定をクリックします。


一般を選択し、一番下にある”契約情報の更新(EMM処理)を行う”にチェックを入れます。

ここにチェックを入れた後1~2時間ほど待てば、実際のEMM処理が実施されます。

もし、このチェックが外れている場合は、EMM処理が行われなくなってしまう(EMM処理しない)ので、視聴がうまくいかない場合は、このチェックが入っているか否かを確認してください。

ネットでやって良いこと悪いこと
地デジ裏録画究極マニュアル

radikaで「超A&G+」の予約録音を行う方法



前回GetASFStreamを使用して、文化放送がWeb上で配信している、超A&G+を予約録音する方法を説明しました

今回は、radikoの視聴ソフトとして有名なradikaを利用して、超A&G+の予約録音を行います。


ちなみに設定作業ですが、radikaよりGetASFStreamを利用した方が簡単です。
ですので、パソコンの操作に不慣れな人は、前回記事を参考にGetASFStreamで予約録音した方が確実かと思います。 → 超!A&G+ の番組を,GetASFStreamで予約録音する


ラジオの録画予約周りをradikaで一本化したい人は、今回の内容を参考にしてみてください。
※作業は自己責任で御願いします。

前置き

設定作業の前に、まずは少々前置きの説明をします。

まず、超A&G+はストリーミング配信の仕組みとしてrtspプロトコルを使用しています。
これは、具体的には、下記のURLで配信されています。

rtsp://1134mb-live1.daijinakoto.com/uniqueradio/2ch_movie



2012/8/1追記:
このURLは変更になったようです。新しいURLの調べ方はこちらの記事を参照してください。



一方、radikaは、radiko以外にも最近サイマルラジオに対応しており、サイマルラジオもrtspプロトコルを使用しています。radikaの方でサイマルラジオの局追加が画面から出来れば簡単なのですが、局の選択肢自体を追加する方法は無さそうです。

また、radikaでサイマルラジオの放送局登録を行うと、設定ファイルにラジオ局の情報(放送局名,URL)が登録されます。


ですので、今回はエディタで設定ファイルを直接編集する事で、超A&G+の局情報を無理やり追加させるという形をとります。


超A&G+のチャンネル追加方法

まずは、ブラウザから超A&G+の番組が視聴できる環境になっている必要があります。
(詳細は、こちらを参照してください)



次に、radikaを使用してサイマルラジオの番組が聴けるようにします。
radikoの初期設定(もしくはメニューより、ツール->ラジオ局設定ウィザード)画面で、サイマルラジオのラジオ局を何か1つ設定しておきます(今回の記事ではFMたちかわを選択したとして説明しています)。




ラジオ局を追加できたら、再生できる事を事前確認しておきます。
(下の例では、FMたちかわと、あまみFMの2つを追加したうえで、FMたちかわを再生しています)



再生を確認できたら、一旦radikaを終了させます。



失敗したときに備えて、radikaがインストールされているフォルダをバックアップしておきます。



RadikaSetting.xmlをエディタで開き、ファイル最後の方にあるタグ内に、先ほど追加したサイマルラジオのラジオ局が記載されている行を探します。



この行にある、”<TunerSetting>”の後ろに、下記の文字を追加します

&lt;StationID&gt;"超!A&G+","rtsp://1134mb-live1.daijinakoto.com/uniqueradio/2ch_movie"&lt;/StationID&gt;


2012/8/1追記:
RadikaSetting.xmlに埋め込むURLが変更になったようです。
新しいURLの調べ方はこちらの記事を参照してください。


追加後は、以下のような感じになります。(クリックで拡大します)




次に、Stationの閉じタグがある場所を探し、その上に以下の文字を追加します。

    <RadikaStationSetting>
      <Name>超!A&G+</Name>
      <ImageFileName>C:\logo_a_ang_g.jpg</ImageFileName>
      <Visible>true</Visible>
      <GeterID>00000000-0000-0000-0000-000000000000</GeterID>
      <GeterOptions />
    </RadikaStationSetting>






上記2箇所を修正したら、ファイルを保存後、radika.exeを起動します。


強制的にチャンネルを追加しているので、以下のエラーが出るかもしれませんが無視します。



ラジオ局一覧に、”超!A&G+”が追加されている事を確認します。

※ここで、”超!A&G+”の行をダブルクリックすると、音声が正しく再生できずノイズが聞こえるだけですが、気にせず次に進みます。



スケジュールの追加->通常予約より、超!A&G+のチャンネルに対して予約を行います。





時間になると予約録音が行われます。
保存されたファイルは正しく再生できるはずなので、問題がないことを確認します。

マハラジャになりたい!! 浅野真澄/鷲崎健


補足:
xmlファイルを編集時、RadikaStationSetting -> ImageFileNameにjpgファイルを指定しておくと、以下のように番組一覧でアイコン画像が表示されます。


ひだまりゼリー浅野真澄エッセイ
ひだまりゼリー 浅野真澄エッセイ
カスタマレビューより:
これを書いているのは、アニスパの浅野真澄ではありません。
声優浅野真澄とも違います。

エッセイスト浅野真澄です。
それくらい、いつもの浅野さんとは違います。ラジオでのトークとは全く違う、
新しい面が見れるでしょう。
逆に、それが浅野さんの全てだ!と思う人にはおすすめしません。
ショックでしょうから。
それだけ、良い作品です。月並みではありますが、暖かな作品であります。

バッテリーの性能ランクと蓄電容量(Ah)の対応表

カーショップなどで販売されているバッテリーは、その性能や大きさによって型式が付けられています。

例えば、「44B24R」のような記述になっており、このうち先頭の数字(例だと”44″)がバッテリーの性能を現しています。

バッテリーを自動車で使用する場合は、今まで使っていたのと同じ型式を使えば問題ないのですが、ソーラー発電用の蓄電池として利用したい場合は、各性能ランクがどの程度の量を蓄電できるかを知りたくなってきます。

というわけで、性能ランクと蓄電容量(Ah)の対応表を作成しました。
蓄電容量は5時間率での表記です。

性能ランク  蓄電容量(Ah)
26          21
28          24
34          27
36          28
38          28
44          34
46          36
48          40
50          40
55          36
55          48
65          56
70          52
75          52
80          55
95          80
105         83
115         88
130         92
145         112
165         136
190         160
210         160
245         176



ワット数が知りたい場合、12Vバッテリーなら下記の値に12を掛けてください。
性能ランク26で12Vの場合は、12V*21Ah=252Wになります。
ただし、完全に使用しきると過放電になるので、実際に利用可能なのは計算値の半分ぐらいです。

上記表の元ネタはJIS規格で、鉛蓄電池に関しては以下のJIS D5301で規格化されています。

JIS D5301
始動用鉛蓄電池
Lead-acid starter batteries
 
最新改正年月日  2006/11/20
原案作成団体    社団法人 電池工業会



JIS規格の資料を直接参照したい場合は、下記のサイトより閲覧可能です。
日本工業標準調査会:データベース-JIS詳細表示

上記のサイトからJIS D5301を確認すると、以下のような感じで各型式のスペックが確認できます。


注意点としては、一部のものは、同じ性能ランクでも型式(≒外寸)が異なると蓄電容量が変わるので、前述の表は目安として利用してください。ただし、大抵の場合は、性能ランクが一緒なら蓄電容量は同じなので、目安として利用するには問題ないかと思います。

型式  性能ランク  蓄電容量(Ah)
50B24 50          36
50D20 50          40



よくわかる電気のしくみ

超!A&G+ の番組配信用URLを確認する方法

前回書いた記事で、ストリーミング再生のURLを入力する箇所がありましたが、今回はこのURLの特定の仕方を説明します。



最近は、このような確認作業を自動化してくれるツールがあるので、手作業で確認する必要は無いのですが、今回は勉強を兼ねて順に確認を行っていきました。

確認はIEと、IEに標準搭載されている開発者ツールを使用しています。
(firefoxでもfirebugを使用すれば同様に確認可能です。)


まずは、普通にブラウザから番組の視聴を行います。
(下記の画像は動画の再生エリアが真っ黒ですが、実際には表示されています。)



視聴画面にフォーカスが当たっている状態で、F12キーを押すと、開発者ツールのウィンドウが表示されます(ツール->開発者ツールでも表示されますが、この画面はメニュバーが非表示にされているので、ショートカットキーを使用します)。



HTMLと画面のレイアウトを見比べると、再生画面の情報はOBJCETタグに記載されている事が分かります。さらにタグ内の属性をチェックすると、番組情報はag_movie_ot.phpのアドレスから配信されている事が分かります。


このページ自体のURLがhttp://www.uniqueradio.jp/agplayer/newplayer.htmlなので、
URLをフルで記載すると下記のアドレスになります。

http://www.uniqueradio.jp/agplayer/ag_movie_ot.php




上記の調査結果が合っているかを確認するため、IEのアドレス欄に先ほどのURLを直接入力します。



MediaPlayerが起動し、期待したとおり番組が再生されました。


というわけで、以上で調査と動作確認は完了です。
わかる!ストリーミング

超!A&G+ の番組を,GetASFStreamで予約録音する

超!A&G+で放送されている番組を、PCを使用して予約録音する方法を説明します。

超!A&G+って何?

文化放送が運営しているインターネット上のストリーミングサービスです。
番組の内容は、ゲームやアニメに関するモノが多いらしいです。





GetASFStreamって何?

Web上でストリーミング放送されている音声・動画を,ファイルに保存することが出来るソフトです。
フリーソフトなので無料で利用できます。

GetASFStream




GetASFStreamを使って,超!A&G+の予約録音をする方法


超!A&G+ の番組はDRMによる制限が掛かっているので、まずはブラウザから番組を視聴できるようにします。利用開始時に以下のようなアンケートに答える必要があります。





URL欄に、以下のアドレスを入力します。
(2012/05現在の確認結果です。将来変更の可能性があるかも)

http://www.uniqueradio.jp/agplayer/ag_movie_ot.php



再生ボタンをクリックして、番組が再生される事を確認します。

2012/8追記:
このURLは変更になったようです。新しいURLの調べ方はこちらの記事を参照してください。


問題なく再生できたら、メニューより番組予約画面を表示させます。
URLに、先ほど確認したURLを指定します。

※URLの確認方法はこちら



指定した時刻になると、録画が開始されます。



録画が完了すると、予約設定時に指定したフォルダにファイルが作成されます。
ファイルをダブルクリックすると、録画した番組が再生できます。


ラジオでGO!



保存したファイルですが、DRMで再生可能な期限が設定されているようです。
あまり溜め込むと聞けなくなってしまうかもしれません
(今日始めて試したので、未確認ですが…)


Codecや、ビットレートはこんな感じです。



2012/05追記:radikaを使った予約録音の方法も書きました。
radikaで「超A&G+」の予約録音を行う方法


B0000CBC22
nostalgia 児玉響(浅野真澄)

ThinkPadのFn+Home,Endでの明るさと、wmi\WmiSetBrightnessの関係

ThinkPadでは、Fn+Home,Endのキーを押すととで、ディスプレイの明るさを変更可能です。



このショートカットキーを押すと画面に現在の明るさが表示されますが、この値とwmiのWmiMonitorBrightnessにて取得したCurrentBrightness値の対応表を調べたのでメモしておきます。

表示値   CurrentBrightness
0        2
1        3
2        4
3        5
4        7
5        8
6        10
7        12
8        14
9        17
10       20
11       22
12       30
13       42
14       63
15       100


確認したPCはThinkPadX201sです。



見ての通り、画面の表示値に対して、CurrentBrightnessが比例するようではないようです。
表にすると以下のように表示が大きくなるに従いCurrentBrightnessの増え方が大きくなります。




プログラムからCurrentBrightnessの取得には、以下のコードを使用しました。

using System.Management;
 
static int GetBrightness() {
    int curValue = -1;
 
    ManagementClass monitorInfo = new ManagementClass( "root\\wmi", "WmiMonitorBrightness", null );
    foreach (ManagementObject obj in monitorInfo.GetInstances()) {
        try {
            curValue = Int32.Parse( obj[ "CurrentBrightness" ].ToString() );
        } catch {
            curValue = -1;
        }
        break;
    }
    return curValue;
}


このプログラムを実行するためには、Windowsのwmiより該当の情報が取得出来ないといけないので、WinVista(サーバはWin2008)以降の必要があります。
WMIシステム管理開発テクニック

また、CurrentBrightnessの値ですが、MSDNによると以下の記述があり、明るさMaxを100としたときのパーセンテージのようです。

Current brightness as a percentage of total brightness.

radikaでNHKの番組表が取れなくなったら行う事

ラジオ番組の録画にradikaを使用しているのですが、NHKの番組表が取れなくなってしまいました。


オフィシャルのサイトのコメント欄を確認したら、解決方法が載っていたので対応してみました。


番組表の画面で、NHKの列を右クリックし、この局の情報取得先を取得->XMLを選択します。
(NHK第1の場合で説明します)



番組表画面に”例外が投げられました”のエラーが出ますが、気にせず新しく出てきたダイアログのチャンネルから、”NHK第1″を選択します。



ダイアログ下に番組表が表示されたら、画面下のOKボタンをクリックします。


これで無事、番組表に表示されました。



うまくいったら、NHK第2とNHKFMも同様に設定します。

ただ、この方法だと番組内容のコメント情報が取れないようなので、コメントをファイル名やタグ情報に設定している場合は指定されません。
コメント情報が必要な場合は注意が必要です。

誰も書けなかったファイル交換&ダウンロード
オフィシャルのコメント欄に解決方法が載っているので、わざわざblogに起こす内容でもないのですが、コメント欄の中で余りに同じ質問が何回も繰り返されてたので、書いてみました…


radika関係のネタです。こちらもどうぞ。
radikaで「超A&G+」の予約録音を行う方法




補足:
NHK番組表をxmlで取る場合は、下記のURLで情報取得しているみたいです。
http://cgi4.nhk.or.jp/hensei/api/sche-nr.cgi?tz=all&ch=netr1&date=2012-05-19

chのパラメータは、チャンネルです。

ch=netr1 : NHK第1
ch=netr2 : NHK第2
ch=netfm : NHK-FM



4873112214
XML Hacks ―エキスパートのためのデータ処理テクニック

自作ソーラー発電用に100Wのパネルを追加



前回、ソーラー発電の仕組みを自作しました。
今のところ携帯デバイスやニッケル水素電池の充電、照明等の目的等で問題なく利用できています。
ソーラー発電の自作用に,パネルを購入しました
ソーラー発電システムの自作 その2(バッテリー側)
ソーラー発電システムの自作 その3(チャージコントローラ)



通常の利用では問題ないのですが、複数のデバイスを同時に充電していると蓄電容量不足になり、使用できなくなる事がが多くなってきたので、ソーラーパネルをもう一枚買い増ししました。


パネルの追加ですが、前回購入したチャージコントローラや配線は、最大30Aまで対応出来る様に余裕を見ているので、既存のパネルに並列接続するだけでOKです。100Wのパネルが2枚に増え、パネルから12Vで給電されたと想定すると100W * 2枚 / 12V = 16.6Aなので、仮に仕様値どおり全力で発電できたとしてもまだ楽勝です。



というわけで、今回購入したアイテムの紹介です。

まずはソーラーパネルですが、これは前回購入したものと同一の商品にします。
異なるパネルにすると、特性(電圧とか)が異なるものが混在することになり、蓄電ロスが出るのを避けたいのと、単に同じものが並んでいる方が見栄えが良いのが理由です。

単結晶ソーラーパネル100W人気のサイズ(85x85cm)

単結晶ソーラーパネル100W人気のサイズ(85x85cm)
価格:15,900円(税込、送料込)




もうひとつの購入パーツは、2枚のパネルを並列接続させるためのコネクタです。
今回のパネルはMC4規格のコネクタなので、対応するものを使用します。

今回は、楽天にて、メール便で送料込み880円のものがあったので、以下の商品にしました。

【送料無料】ソーラーパネル MC4 Y字型 コネクタ

上記のショップですが、商品ページにコネクタの接続方法や、パネル配置のQ&Aがあって親切です。


送られてきたコネクタです。
茶封筒に紙で巻いてあるだけの雑な梱包ですが、所詮コネクタなので問題無しです。



梱包を解いた状態です。
プラス用と、マイナス用の2つのコネクタがあります。


接続は簡単で、力も要らず差し込むだけで完成です。



パネルが二枚になり、晴れの日なら、ケータイ2台+充電電池8本+αを同時に充電しても問題なく給電するようになりました。


本当なら、バッテリーに蓄電されている分が残っていれば、今まででも問題なく充電できていたはずなのですが、
貰った中古バッテリーでかなり弱っているみたいで、あまり蓄電できていないようです。

自作ソーラー発電の仕組みも分かってきたので、次はバッテリーの新調を検討しようかと思います。
2011/06追記: 新しくバッテリ購入しました。詳細はこちら

秀丸のZen-Codingマクロで、aタグ・hタグの後ろに改行を入れさせない

Windows向けの定番エディタとして有名な秀丸エディタですが、HTMLを高速にコーディングする為のマクロとしてZen-Codingマクロが提供されています。
秀丸マクロでZen-Coding


このマクロを導入すると、HTMLのタグ打ちが非常に速くなるのですが、
しばらく使っていると、細かい使い勝手が気になる様になってきました。

例えば、リンクを貼りたいときにaタグをマークアップさせると…


このように、開始タグの後ろに改行が入ってしまいます。




またh1~h6タグの場合も


開始・終了タグが独立行になり、タイトル文字にインデントが入ります。




上記の振る舞いは、元々のzen-codingとしては正しいのかもしれませんが、個人的には、これらのタグの前後に改行が入るとソースが間延びして見づらくなってしまうので、a,hタグの前後には改行を入れたくない派です。

なので、これを直すために、今までエディタで以下のように修正していました。





修正の手間はわずかなのですが、頻度が多いし、そもそもZen-Codingがマクロで置換を掛けているものなので、プログラムが整形したものを人が再整形するのもおかしな話です。
なので、マクロに手を入れて上記のa,hタグの場合に限り、改行を入れないように改変してみました。


※補足:ちなみに設定ファイルのzenhtml.iniで、改行・インデントの有無は設定できるっぽいのですが、今回はh,aタグのときだけ振る舞いを変えたいという、ワガママ仕様なのでマクロ自体を変更します。

; yes: 改行・インデントしてソースを整形する(推奨)
; no:  整形しない
use-indent = yes






というわけで、今回の修正は以下の場所です。
もっとスマートな修正方法があるかもしれませんが、マクロ全体の流れを追うのも面倒なので、
適用が楽な所にパッチを当てる事にしました。

修正は2ファイルです。

まずは、zenhtml.macの640目付近にあるIndentEachLine関数。
元々は、以下の記述だったのを…

    IndentEachLine: // $$1: stri
                    // $$2: baseindent
    ##indenterSize = strlen($indenter);
 
    call ReplaceAll $$1, "><",">\n<"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "]>\n<!--","]><!--"; if ($$return != "") $$1 = $$return;
    call CountLines $$1; ##linelen = ##return;
 
    $$src = $$1 + "\n";
 
    ...



このように変更します。

IndentEachLine: // $$1: stri
                // $$2: baseindent
    ##indenterSize = strlen($indenter);
 
    call ReplaceAll $$1, "><",">\n<"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "]>\n<!--","]><!--"; if ($$return != "") $$1 = $$return;
    call CountLines $$1; ##linelen = ##return;
 
    // add 2012/05
    call ReplaceAll $$1, "<a href=\"\">\n","<a href=\"\">"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h1>\n","<h1>"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h2>\n","<h2>"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h3>\n","<h3>"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h4>\n","<h4>"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h5>\n","<h5>"; if ($$return != "") $$1 = $$return;
    call ReplaceAll $$1, "<h6>\n","<h6>"; if ($$return != "") $$1 = $$return;
 
    $$src = $$1 + "\n";
 
    ...



この関数では、下記の場所でタグの切れ目に改行を入れています。

call ReplaceAll $$1, "><",">\n<"; if ($$return != "") $$1 = $$return;


なので、その直後で、特定のタグの場合に限り追加された改行を削除しています。




2つ目の修正は、zenhtml.iniの290行目付近にある、各タグの要素を定義している箇所。
hタグがblock要素として定義されているのを、強制的にinlineに変更します。

h1         = block
h2         = block
h3         = block
h4         = block
h5         = block
h6         = block




h1         = inline
h2         = inline
h3         = inline
h4         = inline
h5         = inline
h6         = inline



マクロの方で、block要素のタグを挿入する場合は、タグの前後で改行した上で、その中身をインデントするというロジックになっています。なので、h1~h6タグはinlineであると騙す事によって該当のコードが走るのを抑制します。


上記2点の変更で、無事期待する動作に替わりました。
これでさらに高速にマークアップが出来る様になりそうです。



今回の改造は2箇所だけなので大した手間では有りませんが、元ネタがGPL3だったので、改変版を公開しておきます。改変版のライセンスは、勿論GPL3です。

というわけで、本マクロをダウンロードした方は以下のことを自由に行う事が可能です。

1.プログラムの実行
2.プログラムの動作を調べ、それを改変すること
3.複製物の再頒布
4.プログラムを改良し、改良を公衆にリリースする権利



ダウンロード:zencoding-macro-v0.5.6_kai

HTMLで使用される&nbsp;の語源は?

エディタでhtmlを直接読み書きする際、余白を入れたい時に、&nbsp;という文字を書きます。
このnbspの語源は何でしょうか?



nbspというのは略語で、実際は”No-Break SPace”です。
意味は、「改行されない(no blake)空白(space)の文字」という事で、要は”スペースを空けて欲しい”という意味です。

HTMLでは、複数のスペース記号を入れても1文字分しか余白が取られないので、スペースを大きく開けたい時によく使われますが、他にも、この場所で改行をしないで欲しいという意図もブラウザに伝えている事になります。

語根で覚える英単語

メモリリークの確認に、タスクマネージャのワーキングセットを使ってはいけない。

システムの開発時、メモリリークが疑われる場合最初にタスクマネージャでexeが使用しているメモリの量を確認する事が多いかと思います。

この際、Windows7のタスクマネージャでだと、メモリの使用量として「ワーキングセット(メモリ)」と、「メモリ(プライベートワーキングセット)」の2つが有りますが、ワーキングセットを見てメモリリークの判断を行ってはいけません。

(補足:XPだと、プライベートワーキングセットは、仮想メモリサイズと表記されます)



なぜかというと、ワーキングセットの値は、以下の特性があり該当のexeが”今使用している”メモリ量をあらわしているわけでは無いからです。

1.ワーキングセットの値は,他のプロセスと共有しているメモリ領域のサイズが含まれている
  (コード領域のメモリや、共有DLLのエリアのサイズが含まれる)
 
2.ワーキングセットの値は,使用してないけど開放されてないメモリも含まれているから
  (OSは、アロケートしたメモリが不要になったからといっても、すぐにそのメモリを開放するわけではない)



一方で、プライベートワーキングセットは、該当のプロセスが、文字通り独占的(=プライベートに)消費しているメモリ量なので、通常はこの値をウォッチするとメモリリークを判断可能です。
プライベートワーキングセットのサイズが、プロセスが使用している総メモリ量というわけでは有りませんが、プログラムでメモリの開放し忘れがあった場合は、大抵プライベートワーキングセットの領域が増加し続けていくので、通常はこの値をチェックすればOKです。


前述したように、プライベートワーキングセットの現在値は、Windows7ではタスクマネージャから確認できますが、過去の履歴の推移を見たい場合は、パフォーマンスモニタからチェックする事も可能です。

手順としては、perfmon.exeを起動し、カウンターの追加よりprocessオブジェクトの中にある、Private Bytesを指定します。


ガベージコレクション 自動的メモリ管理を構成する理論と実装

.NET&Windowsプログラマのためのデバッグテクニック徹底解説