2010年10月17日

検索エンジン Bing

 検索エンジンと言えばGoogleですが、最近私が気にいっているのはMicrosoftの検索エンジンであるBingです。コンピューター中級者の方は特に、Microsoftと聞くだけで敬遠する人もいるかと思いますが、Googleと比べて使いやすさが優れているのがBingだと思います。
人気ブログランキング
 Bingは、サイトの見た目がGoogleと似たところがあります。トップ画面で、日本語のみの検索か全言語の検索かを指定するオプションなどのレイアウトなどです。Webの検索はGoogleとほぼ同じような使い勝手です。Webで検索したときに、動画のヒットも多いときは動画の検索結果へのリンクが出てくる……というところも同じです。

 画像の検索となると、Bingの方がはるかに使いやすくなっています。検索結果の画像をクリックすると、Googleの場合は現画像へのリンクがどこにあるのか非常にわかりにくいですが、Bingだと結構目立つところにあります。Googleの場合、検索結果の画像の1つをクリックすると、次の画像を見るにはブラウザーの戻るボタンでいったん戻る必要があります。Bingでは、検索結果をクリックした画面でも、サムネイルとして他の検索結果を見ることができます。そのため、画像を1つずつ詳細に見ていくこともやりやすいです。

 動画検索では、Googleの場合は3ペイン構成になっていて、検索条件を指定するところと、検索結果が表示されるところと、スポンサーリンクが表示されるところがあります。幅の狭いウインドーで見ていると動画の検索結果が非常に狭くなってしまい、かなり見にくいです。これに対してBingでは、スポンサーリンクに相当するところがないので、検索結果が見やすくなっています。

 地図の表示はBingとGoogle Mapでは雲泥の差です。Bingでは左側のバーを非表示にできるため、マップがかなり広く表示されますし、必要になったら表示させることも可能ですから使い勝手が抜群に良いです。
web拍手 by FC2
posted by 北条利彦 at 08:05 | Comment(0) | TrackBack(0) | ウェブ | このブログの読者になる | 更新情報をチェックする

2010年10月16日

数字と数値は異なる

 コンピューターを扱っていると、言葉一つ一つの意味に敏感になってくることがあります。プログラムを書いていると、あいまいさがほとんど許されないためです。
人気ブログランキング
 世間一般では適当に扱われているような気がしますが、「0という値がある」ことと「値を定義できない」ことは明確に異なります。PASMOを持っていない人は「PASMOの残金」という数値は定義できません。PASMOを持っていて、その残金がない場合は PASMOの残金=0 となります。

 一般的には同じように使われている2つの単語でも、正確には意味が異なっていることもあります。

 たとえば「数字」と「数値」は異なるものです。「数字」は「字」であることがポイントです。「1000」というのは1つの数値ですが、数字は4文字あります。日常の会話だけでこれに気づくことは滅多にありませんが、プログラムを書くと、数字として扱うときには4バイト必要になり、数値として扱うときには2バイトで済むという形で、言葉の意味の違いが見えてくるのです。
web拍手 by FC2
posted by 北条利彦 at 11:13 | Comment(0) | TrackBack(0) | 基礎知識 | このブログの読者になる | 更新情報をチェックする

2010年10月09日

Thunderbirdでemlファイルを扱う(アドオン不要)

 Thunderbirdでメールを選択し[メッセージを保存]をクリックするとeml形式でメールを保存することができます。eml形式で保存すれば、それをテキストエディターで開くことでメールの内容を編集できます。
人気ブログランキング
EmlExport.png
 eml形式のファイルを読み込むには、メール一覧やツリービューにemlファイルをドロップするだけです。
EmlImport.png

 IMPORTEXPORTTOOLSというアドオンを使ってもemlを開いたり保存することができますが、当然ながらアドオンのインストールが必要です。また、IMPORTEXPORTTOOLSは動作が遅いという欠点があります。
web拍手 by FC2
posted by 北条利彦 at 07:19 | Comment(0) | TrackBack(0) | 電子メール | このブログの読者になる | 更新情報をチェックする

2010年10月02日

ダイナミック・リンク・ライブラリーとは

 Windowsのファイル形式はいくつもありますが、そのうちの1つに「アプリケーション拡張」というものがあります。拡張子がDLLで、これは、ダイナミック・リンク・ライブラリーの頭文字をとったものです。
人気ブログランキング
 DLLは、プログラムファイル(アプリケーション)のパーツとなっているファイルです。プログラムというのは、どのプログラムも全く違う処理を行うものではありません。多くのプログラムに共通する処理がどうしても出てくるものです。たとえば、Windowsでいえば、ウインドーを扱う処理が代表的です。ウインドーを表示するとか、閉じるボタンを押すと閉じられるなどという処理のことです。このような多くのプログラムに共通する処理を、どのプログラムのファイルにも組み込んでしまうと、同じ処理が何か所にも保存される状態ができるため、非常に無駄です(下図)。

 これを解決するために用意されている仕組みがDLLです。DLLは、多くのプログラムに共通する処理を組み込んでおくファイルです。各プログラムでは、自身に必要なDLLを読み込みます。このようにすることでディスクの容量を節約できます。
DLL.png
web拍手 by FC2
タグ:DLL Windows
posted by 北条利彦 at 21:36 | Comment(0) | TrackBack(0) | Windows | このブログの読者になる | 更新情報をチェックする

2010年09月21日

PowerShell 逆引きリファレンス

 最近、PowerShellの記事をたくさん書いていたのですが、このまま続けるとこのブログがPowerShellの記事で埋もれてしまいそうなので、別のサイトを作りました。

PowerShell逆引きリファレンス
http://powershell.web.fc2.com/
人気ブログランキング

 このサイトを作るために使ったソフトの都合で、あまり順序よく記事が並んでいないのですが、ブログに書くよりはまだいいかなと思います(閲覧するのにも記事を書くのにも)。

 逆引きリファレンスという割には記事が少ないですが、早めに増やしていこうと思います。
web拍手 by FC2
posted by 北条利彦 at 23:31 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年09月19日

テキストエディターと強調表示

 パソコンで文書を書くときには主にワープロが使用されます。ワープロでは文字を太くしたり、色をつけたり、図表を挿入したり、あるいは印刷する紙の大きさを設定することができます。
人気ブログランキング
 これに対し、文字を編集するだけの機能を持つテキストエディターがあります。テキストエディターは、図や票を入れるどころか、文字に色をつけたり大きくするとこもできません。しかし、高機能なワープロがある今でもテキストエディターは使われ続けていますし、バージョンアップもされています。

 そもそもワープロがあるのになぜテキストエディターというものが存在するのかというと、テキストエディターは文字を編集するのに特化していていろいろと便利な機能が備わっているためです。

 そのような便利機能のうち、今回取り上げるのは強調表示(キーワードハイライト)機能です。強調表示は、特定のキーワードに一致した部分のみ、色を変えて表示する機能です。

 たとえば、C#のソースコードを開くと次のように表示されます。
TextEditColor0.png

 using, namespace, classなどのキーワードが青く表示され、コメントである // から行末までが緑色で表示されています。

 注意してほしいのは、「〜行目の〜から〜までの文字を〜色にしろ」という意味のデータは、テキストエディターで扱っていないことです。テキストエディターで扱っている「データ」はあくまで文字の情報だけです。ただし、特定の条件を満たす文字を、表示するときに色を変えているだけです。

 先ほどのデータも、usingから1文字消してusngにすると、残っている部分も黒い色で表示されるようになります。
TextEditColor1.png

 これは、テキストエディターで、「using」という単語は色を変えるように設定してあるためです。逆に、どこか適当なところでusingと入力すると、最後のgを入力した時点で文字の色が黒から水色に変わります。

 この機能により、ちゃんとusingと入力できた場合は色が変わり、入力を間違えてusngになってしまった場合は、色が変わらないことで入力ミスに気づくことができます。

 この機能は、プログラムを書くときに非常に役に立ちます。逆に、プログラミングのような、コンピューター向けの言語を書くとき以外は使う場面がないかもしれません。

 テキストエディターの用途はもう少し広いです。たとえば、ブログの記事を書くときにボタン操作を間違えてしまうと記事の本文が消えてしまうことがあります。こういうときはテキストエディターを開いて本文を書き、できあがった後に記事入力欄にコピーするのです。これなら本文が消える心配はありません。
web拍手 by FC2
posted by 北条利彦 at 19:05 | Comment(1) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

2010年09月10日

[PowerShell] 例外を補足する

 PowerShell には例外補足機能がついていて、trap { } と記述します。trapは、C#に出てくるようなtry 〜 catch 文とは異なっていて、なかなか特徴的な動作をします。
人気ブログランキング

trapを書く位置


 スクリプトブロックのどかこにtrapを書くと、trapを書いた位置より後ろ(↓)で発生した例外はもちろん補足しますが、前で発生した例外も補足します。

■TrapTest1.ps1
1/$null

trap
{
  Write-Host "例外を補足しました。"
  exit
}

■実行結果
PS U:\> .\Scripts\TrapTest.ps1
例外を補足しました。
PS U:\>

 例外は1/$nullのところで発生しますが、その下に書いたtrapで例外を補足しました。

スクリプトブロック内で発生した例外


 trap内でcontinueと記述すると、trapブロックに書かれた処理を実行したのち、例外が発生した次の行からスクリプトが再開されます。

 ただし、スクリプトブロック内で例外が発生しした場合は、trapが発生したスクリプトブロックのレベルで考えた次の命令を実行します。次の場合、trapはifの外に書かれているため、ifのスクリプトブロックが1つの文とみなされ、ifの次の文からスクリプトを実行します。

■TrapTest2.ps1
Write-Host "  実行A"
if($true)
{
  Write-Host "  実行B"
  1/$null
  Write-Host "  実行C"
}
Write-Host "  実行D"

trap
{
  Write-Host "  例外を補足しました。"
  continue
}

■実行結果
PS U:\> .\Scripts\TrapTest2.ps1
  実行A
  実行B
  例外を補足しました。
  実行D
PS U:\>

 ifは{ }全体で1つの文と考えられるため、「実行C」とは表示されませんでした。

一度補足した例外を再度補足する


 trapで補足した際、breakと記述すると、breakのところで再び例外が発生したかのような動作をします。さらに、break文で発生した(ように見える)例外を、他のtrapで補足することができます。

■TrapTest3.ps1
Write-Host "  実行A"
if($true)
{
  Write-Host "  実行B"
  1/$null
  Write-Host "  実行C"
  trap
  {
    Write-Host "  例外[1]を補足しました。"
    break
  }
}
Write-Host "  実行D"

trap
{
  Write-Host "  例外[2]を補足しました。"
  continue
}

■実行結果
PS U:\> .\Scripts\TrapTest3.ps1
  実行A
  実行B
  例外[1]を補足しました。
  例外[2]を補足しました。
  実行D
PS U:\>

 if内のtrapでbreakが実行されたので、その外側のスクリプトブロックに書かれているtrapで例外を補足しました。

trapの中で変更された値


 trapのスクリプトブロック内で変数を使用した場合、その変数は、スクリプトブロックの外の変数をコピーした別の変数であるかのように振る舞います。

 したがって、trapのスクリプトブロック内で値を変更した場合、スクリプトブロックの外の変数には影響が及びません。

 ただし、参照型変数の参照先であるオブジェクトを変更した場合は、スクリプトブロックの外にも影響が及びます。

■TrapTest4.ps1
$obj=New-Object PSObject
$obj | Add-Member NoteProperty Value 0

$x=1; $obj.Value=1
Write-Host ("  [A1] x={0}, o.V={1}" -f $x,$obj.Value)
1/$null
Write-Host ("  [A2] x={0}, o.V={1}" -f $x,$obj.Value)

trap
{
  Write-Host ("  [B1] x={0}, o.V={1}" -f $x,$obj.Value)
  $x=2; $obj.Value=2
  Write-Host ("  [B2] x={0}, o.V={1}" -f $x,$obj.Value)
  continue
}

■実行結果
PS U:\> .\Scripts\TrapTest.ps1
  [A1] x=1, o.V=1
  [B1] x=1, o.V=1
  [B2] x=2, o.V=2
  [A2] x=1, o.V=2
PS U:\>

 trap{ }内の$xは値型変数なので、trap内で$xを変更してもtrapの外$xの値は変わりませんでした。$objは参照型変数なのでtrap内の変更がtrapの外にも影響しました。

 この違いをファイル操作にたとえると、ファイル本体をコピーした場合とショートカットをコピーした場合の違いのようなものです。

 値型変数(この場合は$x)はファイル本体がコピーされるようなものなので、コピー先を変更してもコピー元には影響しません。

 参照型変数(同じく$obj)はショートカットをコピーするようなもので、コピー先ショートカットからファイルを開いて内容を変更すると、コピー元のショートカットからファイルを開いても更新された内容が見えます。
web拍手 by FC2
タグ:TRAP
posted by 北条利彦 at 22:54 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年09月09日

[PowerShell] .NET Frameworkでパスやファイルの処理をするときの注意事項

 PowerShellで扱っているカレントディレクトリと、.NET Frameworkのカレントディレクトリは一般に異なります。
人気ブログランキング
PS U:\Work> [IO.Directory]::GetCurrentDirectory()
C:\Users\Hojo
PS U:\Work>

 そのため、PowerShellを通して.NET Frameworkの入出力処理をしようとするとパスを誤認してしまいます。下記の例では、PowerShellのカレントディレクトリがU:\Workであるのに、 .NETではC:\Users\Hojoを探してしまっています。

PS U:\Work> [IO.File]::OpenRead('.\TestFile.txt')
"1" 個の引数を指定して "OpenRead" を呼び出し中に例外が発生しました: "ファイル 'C:\Users\Hojo\TestFile.txt' が見つかりませんでした。"
発生場所 行:1 文字:20
+ [IO.File]::OpenRead <<<< ('.\TestFile.txt')
    + CategoryInfo          : NotSpecified: (:) []、MethodInvocationException
    + FullyQualifiedErrorId : DotNetMethodException

PS U:\Work>

 PowerShellを通して.NET Frameworkの相対パス処理を行うには、まず.NET Frameworkのカレントディレクトリを変更します。

PS U:\Work> [IO.Directory]::SetCurrentDirectory(
>> (Get-Location).Path)
>>
PS U:\Work> [IO.Directory]::GetCurrentDirectory()
U:\Work
PS U:\Work>
web拍手 by FC2
posted by 北条利彦 at 07:23 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年09月08日

[PowerShell] フォルダー一覧・ファイル一覧をそれぞれ取得する

 PowerShellで、指定フォルダー直下のファイルやフォルダーの一覧を取得するには Get-ChildItem コマンドレットを使用します。
人気ブログランキング
PS U:\work\Test> Get-ChildItem


    ディレクトリ: U:\work\Test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2010/09/08      6:52            Folder1
d----        2010/09/08      6:52            Folder2
-a---        2010/09/08      6:53       9069 File1.txt
-a---        2010/09/08      6:54       9236 File2.txt


PS U:\work\Test>

 Get-ChildItemコマンドレットは、フォルダーとファイルの両方を出力します。フォルダーのみ、ファイルのみを出力してほしい場合、Where-Objectコマンドレット( ?{...} )とTest-Path コマンドレットを使用するとうまくいきます。

PS U:\work\Test> # フォルダー一覧
PS U:\work\Test> Get-ChildItem | ?{ Test-Path $_ -PathType Container }


    ディレクトリ: U:\work\Test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
d----        2010/09/08      6:52            Folder1
d----        2010/09/08      6:52            Folder2


PS U:\work\Test> # ファイル一覧
PS U:\work\Test> Get-ChildItem | ?{ Test-Path $_ -PathType Leaf }


    ディレクトリ: U:\work\Test


Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2010/09/08      6:53       9069 File1.txt
-a---        2010/09/08      6:54       9236 File2.txt


PS U:\work\Test>

 出力結果は省略しますが、.NET Frameworkのメソッドを利用して、型名を判定する方法も使用できます。

PS U:\work\Test> Get-ChildItem | ?{ $_.GetType().Name -eq "DirectoryInfo" }
PS U:\work\Test> Get-ChildItem | ?{ $_.GetType().Name -eq "FileInfo" }

 次の方法は@ITに掲載されているものですが、フォルダーによってはうまくいきません。

PS U:\work\Test> Get-ChildItem | ?{ $_.Attributes -eq "Directory" }
PS U:\work\Test> # 何も表示されない。

 これでうまく実行できるフォルダーもあるのですが、たとえばWindowsフォルダーはうまく表示されませんでした。なぜなら、(私の環境では)WindowsフォルダーのAttributes値が"Directory"と等しくないためです。

PS U:\work\Test> (Get-Item 'C:\Windows').Attributes
Directory, NotContentIndexed
PS U:\work\Test> (Get-Item 'C:\Windows').Attributes -eq "Directory"
False
PS U:\work\Test>

 「Attributesが"Directory"と等しい」という条件では駄目だったので、「Attributesが"Directory"を含む」という条件ではどうか確認してみます。

PS U:\work\Test> (Get-Item 'C:\Windows').Attributes -contains "Directory"
False
PS U:\work\Test>

 やっぱり駄目でした。……というのは、Attributesは配列でないためです。enum型なのです。

PS U:\work\Test> (Get-Item 'C:\Windows').Attributes.GetType()

IsPublic IsSerial Name              BaseType
-------- -------- ----              --------
True     True     FileAttributes    System.Enum

 enum型の値は、複数の値についてビットごとのORをとったものです。したがって、ビットごとのANDを計算すれば、AttributesにDirectoryが含まれているかどうかが分かります。

PS U:\work\Test> (Get-Item 'C:\Windows').Attributes -band [System.IO.FileAttributes]::Directory
16
PS U:\work\Test> (Get-Item 'C:\Windows\_default.pif').Attributes -band [System.IO.FileAttributes]::Directory
0

 フォルダーと比較すると結果が16になり、適当なファイルも実験してみたら結果が0になったので、どうやらフォルダーとファイルの区別ができたようです。「16」という値が分かれば、あとはこれで大丈夫です。

PS U:\work\Test> (Get-Item 'C:\Windows').Attributes -band 16
16

 うまくいきました。しかしこの方法を使用すると、何の脈絡もなく「16」という数値が出てくることになります。これをたとえばPowerShellスクリプトに書いたりすると、あとで読んだときに意味が分からなくなりますので、この方法を使用するのは望ましくありません。
web拍手 by FC2
posted by 北条利彦 at 20:26 | Comment(0) | TrackBack(0) | PowerShell | このブログの読者になる | 更新情報をチェックする

2010年08月28日

プログラミングとは何か

 このブログの読者のみなさまは、ほとんど全員がパソコンでアクセスしてくるので、何かしらのプログラムは使っているはずです。今回の記事では、プログラムを作る方法について述べていきます。
人気ブログランキング
 まず、何か物を作る行程というは、たとえばどこかの工場で材料が運ばれていったりするわけです。パソコンの部品もそういう具合につくられます。

 しかし、プログラムを作るのはそれとは全く別です。どちらかというと作文に近いかと思います。パソコンやOSに対する命令を1つずつ書いていくことでプログラムが作られていくのです。その命令というのは、たとえばこれです。
void MainForm_Closing(object sender,FormClosingEventArgs e)
{
  Settings.MainFormSetting setting=Program.Setting.MainForm;

  if(WindowState==FormWindowState.Normal)
    setting.Rectangle=this.Bounds;
  else setting.Rectangle=this.RestoreBounds;
  setting.ArticleView.Width=notePanel.ArticleViewWidth;

  try
  {
    Program.Setting.Write();
  }
  catch(Exception)
  {
    DialogResult result=MessageBox.Show(
      Resource.WrittingSettingError,
      ErrorMessages.Caption,
      MessageBoxButtons.YesNo,
      MessageBoxIcon.Error);
    if(result==DialogResult.No)
      e.Cancel=true;
  }
}

 これは、とあるプログラムのウインドー(この場合、フォームともいう)の閉じるボタンを押したときの処理です。英単語と記号が入り交じっていますが、英単語が分かる人でも命令の意味はほとんど分からないと思います。

 比較的分かりやすいのは Program.Setting.Write(); でしょうか。これは、「プログラムの設定を保存しなさい」という命令です。ただし、この1行だけでは設定を保存してくれません。この1行は「メソッドの呼び出し」と呼ばれるもので、プログラムの別の場所に書かれている別の命令を実行するものです。その「別の場所」には、保存先のファイル名を指定する命令や、ファイル形式を指定する命令、実際に保存処理をする命令が書かれています。このようにして、ウインドーを閉じたときに自動で設定を保存する命令ができあがります。

 コンピューターというのは機械ですので、少しでもあいまいさのある命令をすることはできません。1ビットの間違いすら起きないように細かく命令を書き綴っていく必要があります。そのため、小さなプログラムでさえ数千行の命令になったりします。MicrosoftのWordのような大規模なプログラムになると1000万行なのか1億行なのか、はたまたそれ以上なのか、私にも分かりません。

 上記の例は20行程度です。それでも意味が分からないかと思いますが、現実のプログラムは、こういうものが大量に書かれてできているのです。ですから、バグのないプログラムをつくるのがいかに難しいか想像できるかと思います。

 上記のような命令の羅列をソースコード、そのファイルをソースファイルといいます。ソースコードの状態でも十分わかりにくいですし、自分で書いたコードですら時間が経過すると(内容を忘れると)読めなくなることも十分起こりえます。

 それでもソースコードは、「人間が読み書きするためにコンピューターの命令を分かりやすくした」ものです。コンピューターが実際に理解できるのは、0や1の羅列(ビット列)で書かれた命令です。ソースファイルを0や1の羅列に変換して1つのプログラムを作り上げる作業を「ビルド」といいます。ソースコードさえ正しければ、ビルドはソフトウェアが自動的にやってくれます。
Build.png
 このような感じで、プログラムを作るためにソースコードを書いていくことを「プログラミング」といいます。名前から想像がつくかと思いますが、プログラム(のファイル)を作り出す行為だから「プログラミング」です。アプリケーションに対する命令であるスクリプトやマクロを書く行為や、 HTMLなどの文書を書く行為、あるいはデータベースの問い合わせ文を書く行為は、プログラミングとはいえないので注意が必要です。
web拍手 by FC2
posted by 北条利彦 at 00:36 | Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする

広告


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

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

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


×

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