2009年10月31日土曜日

【自作】Sleipnir別ブラウザ表示スクリプトインストーラ 「exBrowserSleipnir」

この投稿で書いた、
Sleipnirでのアクティブページを別のブラウザで開くスクリプトを、
ダウンロードしインストールする、インストーラを作成しました。
その名も「exBrowserSleipnir」。
以下からダウンロード及び実行出来ます。
詳しい利用方法は、zip内の「Readme.txt」を参照して下さい。
exBrowserSleipnir Ver1.00 ダウンロード exBrowserSleipnir_v100.zip 直接起動はこちら。 exBrowserSleipnir.vbs
この投稿で書いていたのはFirefoxに関してですが、 このインストーラを利用すると、Chrome用も同時にインストールされます。 当然、Sleipnir及びFirefox、Chromeがインストールされていない場合、 エラーと共に終了することになります。 主に自分用なので、細かなエラーチェックもしていないのが特色(?)です。 インストーラを実行し終了した後、「スクリプトの再読み込み」を行うと、 「スクリプト」内へ以下の様に表示されます。

Sleipnir APIを利用したアクティブページ別ブラウザ表示

Sleipnirを利用している人には分かることなのですが、
標準でいくつかのスクリプトが用意されています。
その中には、内部でSleipnirAPIを使用しているモノもあります。
SleipnirAPIに関してはこちら。
タブブラウザ Sleipnir オンラインデータベース(Sleipnir.API リファレンス)

で。
SleipnirAPIを利用して、アクティブページのURLを取得し、
別のブラウザで表示するスクリプトを作成したので、以下にまとめます。

まずはソースを。
そんなに難しい内容ではないです。
' ******************************************************
' FirefoxでSleipnirアクティブページを表示
' ******************************************************
Option Explicit

Dim Pnir, WshShell, Url

' SleipnirAPI呼び出し
Set Pnir = CreateObject("Sleipnir.API")

' 現在開いているページのURL取得
Url = "firefox "
Url = Url & Pnir.URL

' 非同期で呼び出し
Set WshShell = WScript.CreateObject("WScript.Shell")
Call WshShell.Run( Url )
ソースはFirefoxで開いていますが、Chromeでも確認済です。 「名前を指定して実行」出来るブラウザに対してはいけるはずです。 ブラウザを変える場合には、12行目のブラウザ名を変更してください。 以下が使用準備・方法となります。 Sleipnirのメニューバー「スクリプト」内のスクリプトが実行出来ない場合は、 「ツール」→「Sleipnirオプション内」から、 スクリプト実行を許可する必要があります。 スクリプトが利用できるようになると、 「スクリプト」内の「スクリプトの整理」を選択できるようになるので選択。 Sleipnirのスクリプトディレクトリが表示されるので、 「Firefoxで開く.vbs」を作成し、上のソースをそのまま貼り付けて保存。 Sleipnirに戻り、先ほど作成したスクリプトファイルを表示するために、 「スクリプト」内の「スクリプトの再読み込み」を行います。 「Firefoxで開く.vbs」が表示されるので選択。 Sleipnirで開いているページが、Firefoxで表示されれば完了です。 なお、当然ながらFirefoxで開くので、 インストールされていない場合にはエラーが発生します。 何しろエラーチェックしていないもので・・・。

2009年10月29日木曜日

VB.NET Enter時フォーカス遷移

昨日の続きで、試験で使用するソースについてメモ。

基本的にフォーカスを遷移する際にはTABを使うので、
遷移順位を付ける「タブオーダー」で並べ替えておきます。
ですが、一つの画面で複数の項目を素早く入力する場合には、
入力後の「Enter」で次のテキストボックスやボタンに遷移しておくべきです。

というわけで、その為のソースです。
2通りの方法がありますが、好きな方を選ぶと良いと思います。

1つ目:「KeyDown」での取得・遷移。
' ******************************************************
' Enter時フォーカス遷移 / KeyDown
' ******************************************************
Private Sub TextBox1_KeyDown(ByVal sender As System.Object, _
  ByVal e As System.Windows.Forms.KeyEventArgs) _
  Handles TextBox1.KeyDown

  ' Enterの場合
  If e.KeyCode = Keys.Enter Then

    ' ビープ音を鳴らさないようにする
    e.SuppressKeyPress = True
    ' 次のTextBoxへフォーカスを当てる
    Me.TextBox2.Focus()

  End If

End Sub
「KeyDown」時に「どのキーが押されたか」をチェックします。 「Keys.Enter」で無くとも、Enterのキーコードである「13」でも可能です。 2つ目:「KeyPress」での取得・遷移。
' ******************************************************
' Enter時フォーカス遷移 / KeyPress
' ******************************************************
Private Sub TextBox2_KeyPress(ByVal sender As System.Object, _
  ByVal e As System.Windows.Forms.KeyPressEventArgs) _
  Handles TextBox2.KeyPress

  ' Enterの場合
  If e.KeyChar = Chr(Keys.Enter) Then

    ' ビープ音を鳴らさないようにする
    e.Handled = True
    ' 次のTextBoxへフォーカスを当てる
    Me.TextBox1.Focus()

  End If

End Sub
「KeyPress」時に「押されたキーはどれか」をチェックします。 「Chr(Keys.Enter)」は、 Chr関数によって「Keys.Enter」をそのまま「Enter」として返しています。

2009年10月28日水曜日

VB.NET テキストボックスでの入力制限

去年の春から授業でVB.NETを学び始め、それが今年も続いています。
当然年度ごとに大きな課題があり、
頭を悩ましながらかつ、みんなと協力しながら作り上げていきます。

そんな年度末の課題で使用した、テキストボックスの入力制限を、
今年の課題でも使う時が来たので、見て思い出せるようにメモ。

VB.NETとタイトルでは一言で書いてありますが、
生憎授業及び自宅での開発環境はVS2005ですので、
もしかしたらそれ以前、以降の環境ではダメかも知れないので注意。
' ******************************************************
' キー入力制限 / 数字+BackSpaceのみ
' ******************************************************
Private Sub TextBox1_KeyPress(ByVal sender As Object, _
  ByVal e As System.Windows.Forms.KeyPressEventArgs) _
  Handles TextBox1_KeyPress

  If (e.KeyChar < "0"c Or e.KeyChar > "9"c) _
   And e.KeyChar <> vbBack Then

    e.Handled = True

  End If

End Sub
入力制限は、TextBox1のKeyPressイベント発生時に行います。 このサンプルはコメントにも書いてある通り、「数字+BackSpace」のみです。 判断文字をしている際の「"0"c」などは、Char型へキャストしています。 この事に関しては、Microsoftのリファレンスに書かれていますね。 文字型 (Char) もし数字以外を入れたり(日付のための「/」など)する場合には、 判断にその文字を入れる必要があります。

2009年10月26日月曜日

Exifデータ抹消ソフト 「JPEG & PNG Stripper」

最近のデジカメって、凄い高画質なんですよね。
つい6年ぐらい前は、300万画素レベルのデジカメが数万したのに。
今じゃデフォルトが1000万画素だし、
ケータイでもそのくらいのレベルが採用されてるっていうのが凄い。

そうやって撮った綺麗な画像の中には、
「Exifデータ」という、画像に関しての情報が格納されています。

デジカメの型番から、もうわけのわからないデータまで。
デジカメによっては、どの場所で撮ったかなども分かるみたいです。

で。
その画像をそのままWeb上に上げてしまうのは、
何かこう、嫌な感じがします。えぇ。
なので、Exifデータを削除するソフトを使って、サクッと消してしまいます。
検索して真っ先に見付かったソフトです。

「JPEG & PNG Stripper」
作者サイトはこちら(英語)。
Home - www.SteelBytes.com
よくわかる解説サイトはこちら。
JPEG & PNG Stripper - k本的に無料ソフト・フリーソフト

使い方は簡単で、JPGもしくはPNGのファイルを、
ウインドウ内にドラッグ&ドロップするだけです。
ソフト下に結果が表示され、エラー無く終了すると、
ファイルのExifデータが見事に消えているはずです。


本当はこういったソフトが前から欲しくて、作ろうと思ったのですが、
検索してすぐに引っかかったのでまぁいいやと。

2009年10月24日土曜日

iPhone用にBluetoothヘッドセット購入

iPhoneは一応電話なので、対応しているイヤホンのボタンから、
音楽の再生/停止や電話に出たりなど出来るのですが、
以前からイヤホンの調子が悪くて、その機能が使えないままでした。
さらに、イヤホンを挿したまま根本をグリグリした結果、
根本付近が崩壊し、中のコードが見えてしまう始末。

どうせだからと、Bluetoothのヘッドセットを買うことにしました。
購入したのは、SonyEricssonの「HBH-DS205」です。
SONY ワイヤレスヘッドセット DS205 HBH-DS205


届いて箱を出してみたの図。
たかがヘッドセットなのに箱が大きいなぁと開けてみると、
なるほど、専用充電器が大きいんですね。

円筒状のものがレシーバーです。
こいつを服に付ければ、煩わしいコードともオサラバです。

iPhoneとのペアリングも、説明書通り行えば問題無く出来ました。

Bluetoothで音楽を聴いてみたの図。
ヘッドセットで聴いている間は、下に接続対象が表示されるようです。
右下のBluetoothアイコンをタップすると、スピーカーと切り替えができます。

まだ外に出て歩いたりしていないのですが、
ズボンにiPhoneを入れて聴いても、音ズレも音飛びもありませんでした。
普通のイヤホンとの違いは無い感じがします。
でも、外に出て電波やら他のBluetoothが居たら途切れたりするんだろうなぁ。

PS3にも繋げてみましたが、こちらも問題なし。
あくまでもヘッドセットなので、音楽などは聴けません。
ただ、ボイスチェンジャーなどで遊べます、一人で。

2009年10月23日金曜日

ほるめすメモ帳にCSSを反映しました

usamimi.infoに借りた「ほるめすメモ帳 - 暫定」には、
作っているサンプルやメモなど、地味に少しずつまとめています。
iPhoneでも見やすいようにシンプルに書いていたものの、
そろそろ縦に長く伸びてきた事とPCからでは質素に見えてしまうので、
PCとiPhoneでCSSを切り替えて反映してみました。

作ってみたものはこれです。
ほるめすメモ帳 - 暫定

PCとiPhoneとのCSSの切り替えは、
以前調べたOS判別を利用し、<HEAD>内で行っています。
<script type="text/javascript">
  if( navigator.userAgent.search(/iPhone/) != -1 ){
    document.write('<link href="css/iphone.css" rel="stylesheet" type="text/css"/>');
  }else{
    document.write('<link href="css/pc.css" rel="stylesheet" type="text/css"/>');
  }
</script>
PC版CSSでは、以下の様にグループ分けしています。 グループ分けを行い、「float」を行うことで、 左右にグループを表示することが出来ますが、 IE以外でのブラウザでは、そのままでは表示がおかしくなります。 この問題を解決するために1日も悩んでしまいました。 原因は、floatを行うことによる高さ(height)の消失です。 また、対策として「clearfix」という処理があります。 詳しくは以下の参考サイトで。 今回は、一番上のサイトのサンプルをそのまま使用させて頂きました。 ただ、仕様が厳密に違うのか、横幅(width)などが綺麗に反映されなかったので、 .clearfix:after時に、横幅と背景色を指定し直しています。 「:after」などに関しては、以下のページが参考になりました。 CSS: 宣言 Webページの世界は奥が深いんだなぁと、 Webプログラミングする時以上に実感しましたね。

2009年10月21日水曜日

Googleの「Table」を使ったブログ投稿一覧

※補足:文章にまとめる能力が枯渇しているため、非常に読みづらいです。
「Google Visualization API」がすごいと聞いたので、
せっかくだからと投稿一覧を表示してみることにしました。
実際に使用したのは、「Google Visualization API」のTableです。
以下を参考にしました。


まずは、できあがったものですね。
ほるメモいんぶろ - 投稿一覧
ブラウザ内に文字が大量に表示されるので、
文字羅列アレルギーの方は注意して下さい。

内容としては、先日iPhone用の一覧を作成した時にまとめた、
【まずはBloggerAPIで投稿一覧表示】
【iPhone Blogger投稿一覧に更新日表示】
を、バージョンアップしたような感じになります。


忘れそうになるので、「Blogger API」から取得出来るデータをまとめます。
基本的には、Google GData APIの「google.gdata.blogger」にあるものは、
全て取得出来るはずです。
ただ、試してみた時に取得出来ないもの(カテゴリなど)もありました。
それに関しては、ただ単に僕が把握しきれていない上、
記述ミスの可能性もあるので、一概にそうとは言い切れません。
今回取得出来たデータは以下の様なものです。
  • getUpdated().getValue().getDate(); :更新日時
  • getTitle().getText(); :投稿タイトル
  • getHtmlLink().getHref(); :投稿アドレス
  • getContent().getText(); :投稿内容
上の項目で取得出来る更新日時について。 iPhone用一覧を作成した時に、更新日時を日本風に書き換えましたが、 IEではうまく処理されずに、 「23:52:20/09/30(水) UTC+0900」のような不思議なカタチになります。 それは、ブラウザごとの更新日時の取得内容が異なるためです。 iPhone,Safali,Firefoxなどの、 「Tridentエンジン」を使用していないブラウザの場合は、 「Sat Oct 17 2009 22:34:27 GMT+0900」と取得し、 IEでは「Sat Oct 17 22:34:27 UTC+0900 2009」というように、 項目を取得する順番が入れ替わってしまいます。 対処は・・・どうしようかなぁ。 するなら、ブラウザ判別して処理を分けるぐらいしか思いつかないです。 取得した投稿内容について。 iPhoneのあれの時には使用していませんでしたが、 実はリファレンスをちゃんと読めば載っていたんですね。 ひとまず引っ張ってくることには成功しましたが、問題点が。 HTMLで戻ってくるのは嬉しいのですが、 <pre></pre>で囲って投稿を書いているおかげで、 各行に改行が挿入されないのです。 その結果、改行要素が含まれるタグ以外では改行されずに、 横に長々と文章が表示されるようになります。 ページ内で表示する際には、途中で折り返す処理が必須になります。 「Table」の初期ソートについて。 参考元サンプルをそのまま使うだけでは、 初期表示の際にどの列もソートされていない状態です。 初期表示の際にソートする場合には、 テーブル領域にデータを反映する際にパラメータを渡すことで行えます。
visualization.draw(data,
       {showRowNumber: true
        , sortColumn:0
        , sortAscending:false
        , cssClassNames: {
          tableCell: 'myVtd',
          headerCell: 'myVhtd'
        }
      });
これに関しては、以下のドキュメントに詳しく書かれています(英語)。 Visualization: Table - Google Visualization API - Google Code

2009年10月17日土曜日

「Google Chrome Frame」って何なのよ

GoogleのAPIを試せる「AJAX APIs Playground」へ久々に行ってみたものの、
下のような警告をされました。

つまりは、「そろそろIEに対応できないので、プラグインを入れろ」と。

じゃあ「Google Chrome Frame」は何者なの?と。

さっぱり書くなら、指定されたmetaタグが埋め込まれているページを、
Chromeと同じように動作表示する、ということでいいのかな?
直接的に、GoogleのAPIやHTML5の技術に触れられるという感じ?

それなら入れておいて損はしないんだろうなぁ、と思うけれど、
否定的な意見もあるみたいで。

プラグイン作動によるセキュリティの問題や、
ブラウザ自体を否定する様な扱いだ、というような感じ。

結局、IEを使い続けるかどうかはユーザ次第で、
ユーザがストレス無く新技術に触れられるのなら良いのかなぁとは思います。
ひとまず入れておくことにします。

VBScript fakepath回避選択ファイルパス取得サンプル

IEditorを作成した時に、
程よく使いやすいサンプルが出来たのでメモ。

ソースが長いので、見づらい場合には閉じて下さい。
▼ソースを開く/たたむ
' **********************************************************
' ファイル選択ダイアログを表示し、ファイルパスを取得する
' **********************************************************
Function GetFilePath()

  ' 変数宣言
  FilePath = "" ' ファイルパス
  ExtName = "exe" ' 拡張子判断用

  ' 初期メッセージ
  Msgbox("パスを取得するファイル(." & ExtName & ")を選択して下さい。")

  ' IEオブジェクトを用意
  Set Ie = CreateObject("InternetExplorer.Application")
  Ie.Navigate( "about:blank" )
  Ie.document.getElementsByTagName("BODY")(0).innerHTML = _
    "<INPUT id=FilePath type=file><TEXTAREA id=Text></TEXTAREA>"
  Ie.document.getElementById("FilePath").click

  ' 選択ファイルパス格納
  FilePath = Ie.document.getElementById("FilePath").value

  ' 選択ファイルパスチェック
  If FilePath = "" then
    ' ファイルが選択されなかったので終了
    Msgbox("ファイルが選択されなかったので終了します。")
    Wscript.Quit
  end If

  Set Fso = CreateObject( "Scripting.FileSystemObject" )
  If Fso.GetExtensionName( FilePath ) <> ExtName then
    ' 実行ファイル(.exe)が選択されなかったので終了
    Msgbox("選択されたファイルが実行ファイル(." & ExtName & ")で無いので、終了します。")
    Wscript.Quit
  End If

  ' IE8の場合はセキュリティの関係上、
  ' 「C:\fakepath」となるので、別処理取得
  If InStr( FilePath, ":\fakepath\" ) = 2 Then
    ' コピー&ペースト用定数用意
    Const OLECMDID_COPY = 12
    Const OLECMDID_PASTE = 13
    Const OLECMDID_SELECTALL = 17 '(&H11)
    Const OLECMDEXECOPT_DODEFAULT = 0
    ' FilePathの内容をコピーし、Textへペースト
    Ie.Document.all.FilePath.focus
    Ie.ExecWB OLECMDID_SELECTALL,OLECMDEXECOPT_DODEFAULT
    Ie.ExecWB OLECMDID_COPY,OLECMDEXECOPT_DODEFAULT
    Ie.Document.all.Text.focus
    Ie.ExecWB OLECMDID_PASTE,OLECMDEXECOPT_DODEFAULT
    FilePath = Ie.Document.all.Text.value
  End If

  ' Ie破棄
  Ie.Quit
  Set Ie = Nothing

  ' 最終的にファイルパス取得
  GetFilePath = FilePath

End Function
以下参考メモ。 ソースの大本は、以下を参考にしました。 ファイル選択ダイアログを開く:SQLの窓 IEオブジェクトを作成した際にエラーチェックしていませんが、 「IEの入っていないWindows環境」を見たことがないのに加え、 Vista+IE8でも問題無く通過しているので、様子見の状態です。 このサンプルでは、 ファイルを選択した際に拡張子を判別しています。 別に無くても良いのですが、IEオブジェクトを使用するという仕様上、 ファイル選択ダイアログ時に拡張子を限定することが出来ないため、 仕方無くファイルを選択した後の判断となります。 IE8の場合、<INPUT>に格納されるファイルパスを取得した際に、 セキュリティの問題上「C:\fakepath\」となります。 その回避として、 何度も紹介させて頂いている以下のサイトを参考にしました。 IE8で、input type=fileの.valueがc:\fakepath\filenameを返す。(その2): Windows Script Programming