2010年08月24日

[PowerShell] 16進のダンプ表示を行う

 以下のコードをスクリプトとして保存すると、16進数のダンプができます。スイッチパラメーターによって、以下の設定ができます。
スイッチ意味
-NoSeparatorバイトごとの空白区切りを非表示。
-NoHeader最初の行の0〜Fを非表示。
-NoLineNumber行番号を非表示。
人気ブログランキング

スクリプト(Dump.ps1)

param
(
  [switch]$NoSeparator,
  [switch]$NoHeader,
  [switch]$NoLineNumber,
 
  [Parameter(Mandatory=$true)]
  [string]
  $LiteralPath
)

# ヘッダー表示

if(-not $NoHeader)`
{
  $builder=New-Object System.Text.StringBuilder
  if(-not $NoLineNumber)
  {
    $builder.Append("       ")> $null
  }
 
  for($i=0; $i -lt 16; $i++)`
  {
    $builder.Append($i.ToString("X")) > $null
    $builder.Append(' ') > $null
    if(-not $NoSeparator)
    {
      $builder.Append(' ') > $null
    }
  }
  $builder.ToString()
}

# ダンプ表示

$byteCount=0
$lineIndex=0
$lineIndexLength=6
$bodyBuilder=New-Object System.Text.StringBuilder

function Output([int]$lineIndex)
{
  $indexText=""
  $bodyText=$bodyBuilder.ToString()
  if(-not $NoLineNumber)
  {
    $indexText=$lineIndex.ToString(
      "X").PadLeft($lineIndexLength,'0')+" "
  }
  $bodyBuilder.Length=0
  $indexText+$bodyText
}

Get-Content $LiteralPath -Encoding byte |
  %{
    $bodyBuilder.Append(
      $_.ToString("X").PadLeft(2,'0')) > $null
    if(-not $NoSeparator)
    {
      $bodyBuilder.Append(' ') > $null
    }
   
    $byteCount=($byteCount+1)%16
   
    if($byteCount -eq 0)
    {
      Output $lineIndex
      $lineIndex++
    }
   }

if($byteCount -ne 0) { Output }

使用例

> .\Dump.ps1 .\Test.txt
       0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
000000 61 31 20 62 31 20 63 31 0D 0A 61 32 20 62 32 20
000001 63 32 0D 0A 61 32 20 62 32 20 63 33 0D 0A 61 33
000002 20 62 33 20 63 33
>
> .\Dump.ps1 .\Test.txt -NoHeader -NoLineNumber -NoSeparator
61312062312063310D0A613220623220
63320D0A61322062322063330D0A6133
206233206333
web拍手 by FC2
posted by 北条利彦 at 00:10 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年08月23日

[PowerShell] 正規表現を使う

 PowerShellで正規表現を使用する例です。特にコマンドを使用せずとも、.NET Frameworkの呼び出しだけで実現できます。
人気ブログランキング
> $text='1:abc 2:def 3:ghi 4:jkl'
> $pattern='(?<=2:)[^\s]*'
>
> #マッチするかどうか(その1)
> [regex]::IsMatch($text,$pattern)
True
>
> #マッチするかどうか(その2)
> $text -match $pattern
True
>
> #マッチ結果の配列を作る
> $matches=[regex]::Matches($text,$pattern)
>
> #マッチした件数取得
> $matches.Count
1
> #マッチした最初のデータ
> $matches[0].Value
def
web拍手 by FC2
posted by 北条利彦 at 00:09 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年08月22日

[PowerShell] 指定した整数値を表す16進文字列を取得する(10進数→16進数変換)

 指定した整数$nを表す16進数文字列を取得します。.NET Frameworkのメソッドを使用すると簡単に実現できます。
人気ブログランキング
> $x=15*256+129
> $x.ToString("X")
F81
web拍手 by FC2
posted by 北条利彦 at 17:02 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年08月14日

タスクの状態遷移

 WindowsやLinuxなどのマルチタスクのOSでは、ユーザーが直接操作しているプログラム以外は特にやることもなく待機していることが多いです。また、1つのタスクが長らくCPU時間を奪ってはいけないため、プログラムを作るときは、他のタスクの動きを妨害しないように作ることが必要になる場面も出てきます。このあたりと関係してくるのがタスクの状態遷移です。
人気ブログランキング
 マルチタスクOSにおけるタスクの状態遷移を表したのが次の図です。
TaskStates.png
 まず、起動したプログラムは「実行可能状態」になり、CPUの割り当てがくるまでは何もできない状態になっています。この状態のタスクは、CPUの割り当てを「待っている」ともいえますが、待ち状態ではありません。

 そして、CPUの割り当てられているタスクのことを「実行状態」になっているといいます。CPUは1度に1つの命令しか実行できませんから(実行できないことになっていますから)CPU 1つあたり、実行可能状態になるタスクは1つだけです。ただし、マルチコアのCPUであればコアの数だけ実行状態のタスクがあります。

 マルチタスクのOSでは、1つのタスクが永遠にCPUを使い続けるわけにはいきません。ある程度の処理を実行したら他のプログラムが動作できるようにCPUの制御を渡さなければなりません。そのようにして、タスクは実行可能状態に遷移します。ちなみに、プリエンプティブでないマルチタスクであれば、他のプログラムに制御を移す命令を実行しない限りはそのまま実行し続けることもできますが、プリエンプティブなマルチタスクであれば強制的に他のプログラムに制御が移ります。

 「実行状態」は、その実行内容によって遷移先が3通りあります。ひとつは今出てきたように、処理の途中で他のタスクにCPUの制御を渡した場合の「実行可能状態」への遷移です。2つ目は「状態」といえるかどうか分かりませんが、すべての処理を終えてタスクが終了することです。3つ目は、「待ち状態」です。

 「待ち状態」はディスクの読み書き、人の操作などの入出力が必要になった場合に遷移してくる状態です。入出力が終わったら、実行可能状態へ遷移します。
web拍手 by FC2
posted by 北条利彦 at 07:19 | Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2010年08月13日

[PowerShell] パスが通るファイルのフルパスを求める。

 PowerShell上でパスが通るものの、実体がどのフォルダー配下にあるのか分からず、ファイルの場所を特定したいときがあります。まずは、セミコロンで区切られているパスの文字列を配列にします。
人気ブログランキング
> $paths=$Env:Path.Split(';')
> $paths
%SystemRoot%\system32\WindowsPowerShell\v1.0\
C:\Windows\system32
C:\Windows
C:\Windows\System32\Wbem
C:\Windows\System32\WindowsPowerShell\v1.0\
>
 ファイルの存在確認にはTest-Pathコマンドレットが使用できます。これは一パラメーターを1つもち、そのパラメーターにはファイルのパスを指定すれば存在の有無を返してくれます。それを試す前に、引数に指定する文字列をちゃんと作れるかどうか確かめてみます。
> $paths[0]+"\mspaint.exe"
%SystemRoot%\system32\WindowsPowerShell\v1.0\\mspaint.exe
 フォルダー名とファイル名の間に「\」の記号が2個ついています。片方は不要ですが、2つ連続しても問題ない上、さきほどの$pathsの末尾には「\」がついていないものがありました。そのため、このままでいきましょう。

 あとは、$pathsに含まれているすべての要素それぞれに対し、Test-Pathコマンドレットを実行して、ファイルの存在確認をします。Where-Objectを使うと、パイプラインを流れる配列の要素の中から、条件に一致する要素だけを出力してくれるのでこれを併用します。下記の例ではWhere-Objectの略記である ? を使用しています。
> $paths | ?{ Test-Path ($_+"\mspaint.exe") }
C:\Windows\system32\mspaint.exe
>
 いろいろとやりましたが、結局、必要なのはこれだけです。
> $paths=$Env:Path.Split(';')
> $paths | ?{ Test-Path ($_+"\mspaint.exe") }
web拍手 by FC2
タグ:PowerShell PATH
posted by 北条利彦 at 01:06 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年08月11日

[PowerShell] 現在のフォルダー配下にあるテキストファイルの合計行数を求める。

 下記のコマンドを実行すると行数の合計を表示します。この例では、ファイル名の末尾が".cs"であり、かつ末尾が".designer.cs"でないファイルの合計行数を算出します。$judgeFunc={ ... }の中身を編集すれば、別の条件でファイルを絞り込むことができます。
人気ブログランキング
$judgeFunc={$args[0].EndsWith(".cs") -and -not $args[0].ToLower().EndsWith(".designer.cs")}

$files=(ls -Recurse | ?{ $_.GetType().Name -eq "FileInfo" } | %{ $_.FullName })
$selectedFiles=($files | ?{ & $judgeFunc $_ })
$lineCounts=($selectedFiles | %{ (cat $_).Count } )
$sum=0; $lineCounts | %{ $sum+=$_ }; $sum
web拍手 by FC2
posted by 北条利彦 at 23:40 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

メインメモリーの確保・解放とメモリーリーク

 プログラムが何かしらのデータを使用するとき、プログラムは「このサイズの容量が必要だから確保せよ」とOSに指示します。指定された容量のメモリー領域をOSが確保できたら、その領域を使用できるようになります。そして、プログラムがその領域を使い終わったら、今度は使い終わったことをOSに知らせます。すると、その使い終わった領域は、どのプログラムでも(OSに指示すれば)使用できるようになります。これをメモリーの確保に対して解放と呼びます。この流れを表したのが次の図です。
MemoryNewDelete.png

 これらの処理は、レンタサイクルに近いところがあるかと思います。自転車に乗りたいときには店から借りる(メモリーを確保する)わけです。乗りわったら店に自転車を返します(メモリーを解放する)。もし返し忘れると、他の人が自転車に乗ることができなくなります。
人気ブログランキング
 レンタサイクルと違うのは、メモリー確保の場合はPCのメモリーすべてがなくなるまで好きな量だけ確保できる(お金がかからない)ことと、解放するまでの期限がないことがあります。さらに、レンタサイクルの場合、自転車が盗まれたら買い足すことも可能ですが、メモリーの確保ではそれに相当する対策はありません。

 単に確保したデータを解放するというだけなのですが、プログラムは数万行もあり、しかも記号や英単語の複雑な羅列で、命令する順番なども非常に複雑なので、確保→解放という単純な順番も崩れるような場面が出てくるのです。

 このように、メモリーの解放処理が不足していることが原因で、解放されずに誰も使えない領域が出てきてしまう現象をメモリーリークといいます。

 OSにもよるのですが、起動してからすぐに終了してしまうプログラムの場合は、メモリーリークが問題になることはあまりありません。というのは、プログラムが終了した時点で、そのプログラムが確保していた領域をOSが自動的に解放してくれるためです。

 一方、ずっと動き続けていなければならないプログラム(サーバーなど)の場合、メモリーリークは深刻な問題です。正常に動いているように見えて、起動してから数日経過したらサーバーが止まってしまう……などという事件が起きたりします。
web拍手 by FC2
posted by 北条利彦 at 20:58 | Comment(0) | TrackBack(0) | データ記憶・保存 | このブログの読者になる | 更新情報をチェックする

2010年07月23日

[C#] テキストボックスのフォーカス時とクリック時に全選択する

 当ブログは、「操作方法を理解したもののパソコン内部の動作は知らない」程度の初心者へ向けた記事を書こうとしているのですが、最近の傾向は初心者向けとはだいぶ違ってきているような気がします。今回もその傾向に従っています。
人気ブログランキング
 さて、本題に入りますが、C#でテキストボックス(TextBox)をクリックしたとき、あるいはフォーカスが移ったときにテキストを全選択させたい場合があります。

 たとえばURLはあまり編集することがなく、コピーや貼り付けの操作が主ですから、クリック時やフォーカス時に全選択された方が都合が良いのです。この動作は、普段からウェブブラウザーを使用している人にとっては、ごくありふれたものです。しかし、ちゃんと作らないとどこか不自然な動きをします。私の思いつく限りでは次の条件を満たすと自然な動作をすると思います。

テキストボックスにフォーカスがあるとき……
・トリプルクリックすると全選択される。
・それ以外の操作では全選択されない(普通にテキスト全体をドラッグするなどを除く)。

テキストボックスにフォーカスが移ったとき……
・Tabキーでフォーカスが移ったときは全選択される。
・クリックの場合、ボタンを放すまでは全選択されない。
・マウスのボタンを放したとき、どこも選択されていない場合のみ全選択される(フォーカス遷移時もドラッグで部分選択が可能である)。

 これから紹介する私の方法では、トリプルクリックには対応しません。それ以外はうまく動作すると思います。

 それではテキストボックスを作りますが、他のフォームを作るときにツールボックスに表示された方が便利なので、カスタムコントロールを作成します。その名前はExTextBoxとしておきます。中のコードはこんな感じです。

public partial class ExTextBox : TextBox
{
  // 公開メンバー
  
  public ExTextBox()
  {
    InitializeComponent();
    this.Leave+=this.TextBoxEx_Leave;
    this.Enter+=this.TextBoxEx_Enter;
    this.MouseUp+=this.TextBoxEx_MouseUp;
  }

  public bool EnableSelectAll=true;
  
  public bool SelectOnClick
  {
    get { return selectOnClick; }
    set { selectOnClick=value; }
  }

  public bool SelectOnEnter
  {
    get { return selectOnEnter; }
    set { selectOnEnter=value; }
  }
  
  // 非公開メンバー

  bool selectOnClick=true;
  bool selectOnEnter=true;

  bool isFocused=false;
  
  void TextBoxEx_Enter(object sender,EventArgs e)
  {
    bool leftDown
      =(Control.MouseButtons & MouseButtons.Left)
        ==MouseButtons.Left;
    bool rightDown
      =(Control.MouseButtons & MouseButtons.Right)
        ==MouseButtons.Right;
    bool mouseDown=(leftDown||rightDown);

    // マウスが押されていないのに遷移した→Tabキーによる遷移
    if(mouseDown==false && SelectOnEnter) SelectAll();

    // クリック選択有効かつマウス遷移の場合、MouseUpで処理
    if(mouseDown==false || SelectOnClick==false)
      isFocused=true;
  }

  void TextBoxEx_Leave(object sender,EventArgs e)
  {
    isFocused=false;
  }

  void TextBoxEx_MouseUp(object sender,MouseEventArgs e)
  {
    if(isFocused==false && SelectOnClick && SelectionLength==0)
      SelectAll();
    isFocused=true;
  }
}

 SelectOnClick、SelectOnEnterの値を変更することで、クリック時の全選択とTabキー遷移による全選択の有効、無効を切り替えられます。
web拍手 by FC2
タグ:Textbox C#
posted by 北条利彦 at 00:04 | Comment(0) | TrackBack(0) | C# | このブログの読者になる | 更新情報をチェックする

2010年06月24日

49.7日問題の原因

 2000年問題というのは聞いたことがある人も多いと思います。西暦の表記を下2桁で表していたことが多かったため、「99年」の次が「00年」になり、100年前に戻ったかのようにコンピューターが勘違いするのではないかという問題でした。
人気ブログランキング
 さて、Windows 95やWindows 98には「49.7日問題」というものがあります。49.7日間、パソコンを連続稼働するとソフトウェアが止まってしまうというものです。49.7日問題も根本は2000年問題と同じようなもので、Windowsが起動してからの経過時間が0に戻ってしまうことが原因です。

 Windowsでは、OSが起動してからの経過時間を32ビットの整数で表しています。この記事では、この整数をタイマー変数と呼ぶことにします。タイマー変数の値は、1ミリ秒(0.001秒)経過するたびに1増えます。したがって、タイマー変数の値が1万であれば、10 000÷1 000ですから、Windowsが起動してから10秒経過したということになります。

 ところで、タイマー変数は32ビットですから、0から(2の32乗-1)までの値を記録しておくことができます。(2の32乗)=4 294 967 296(約43億)ですから、タイマー変数に設定できる値は最大で4 294 967 295までです。もし4 294 967 296の値になってしまうと、0に戻ります。

 つまり、Windows 98が起動してから4 294 967 296÷1 000秒が経過するとタイマー変数は0に戻ります。これが何日か計算してみると……

4 294 967 296÷1 000秒
= 4 294 967.296秒
=71 582.7883分
=1 193.04647時間
=49.7102696日

 約49.7日になりました。
web拍手 by FC2
posted by 北条利彦 at 23:29 | Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2010年05月26日

Stylishでユーザースタイルシート編集

 この前の記事では、FirefoxのuserContent.cssを編集してユーザースタイルシートを適用させました。実は、もうちょっと簡単な設定方法があります。ただし、こちらは「Stylish」という、Firefoxの拡張機能を使用します。Stylishを使うと、Firefoxを再起動しなくても、ユーザースタイルシートをボタン一発で適用できたり、変更した内容をキャンセルすることもできます。
人気ブログランキング

 まずは、次のページからStylishをインストールしましょう。

https://addons.mozilla.org/ja/firefox/addon/2108/

 インストール後、Firefoxを再起動すると、ステータスバーの右端に「S」の字のアイコンが表示されます。全体的に白っぽいのでよく分かりませんが、現在表示しているページにユーザースタイルシートが適用されると、このアイコンがカラフルになります(※)。このS字のアイコンをクリックするとメニューが出てきて、そのドメインやそのページに適用するスタイルを作成したり、ユーザースタイルシートを適用させたり無効にしたり……ということができます。

※Stylishでユーザースタイルシートを適用しているときのみカラフルになります。userContent.cssが適用されているかどうかには関係がありません。
StylishIcons.png

左が、適用するスタイルシートがない状態のアイコン。右が、スタイルシートがある状態のアイコン。ウインドーの枠の色が違うのは無関係。

 今回もGoogleの検索ツールを消去するというのでは芸がないので、今度は産経新聞のウェブサイトに表示される広告を消してみます。まず産経新聞のサイトを開いて、Firefoxのステータスバー右端にあるスタイリッシュのアイコンをクリックし、メニューを表示させます。[新しいスタイルを書く]→[sankei.co.jp.msn.com 専用...]をクリックします。

StylishSankeiMenu.png


 [新しいスタイル]というフォームが表示されるので[名前]には「ニュース」を、大きなテキストボックスには以下の文字列を書きます。なお、左中括弧 { の位置は、フォーム表示直後は@-moz-...の行の最後に表示されていますが、括弧の対応を見やすくするため、改行して次の行にしておきました。
@-moz-document domain("sankei.jp.msn.com")
{
  .adcenter, .ModuleSankeishimbun
  , div[id^="AD"], .banner
  { display:none !important }
}

 ここで、産経新聞のサイトを開いた状態で[お試し]ボタンをクリックすると、このスタイルによって表示がどう変わるのか確認できます。ここには、産経新聞の画像を載せないので、実際に試してみて下さい。問題がなければ「保存」ボタンをクリックします。
web拍手 by FC2
posted by 北条利彦 at 00:11 | Comment(0) | TrackBack(0) | ウェブブラウザー | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。