EncCodeの修正版

以前にSimpleCodeの代用品として作成したEncCode.htaですが、前記事のように、WordPress2.5.1ではペーストしたコードが文字化けしてしまうため、それに対応するように修正しました。
以前のバージョンをご利用の方は新しいバージョンに差し替えてご利用ください。

enccode02.lzh

ここのブログのコードは一応すべてこのEncCodeを使っていますので、自分で気づいた点があれば修正していますが、もし何かお気づきの点がありましたらご指摘いただけると嬉しいです。


WordPress2.5.1アップデート後にcodeタグ内の表示が・・・

このブログでは記事内にソースコードを表示していますが、2.5から2.5.1にアップデート後にcodeタグ内のシングルクォーテーションとダブルクォーテーションの表示の一部が全角に化けてしまうようになってしまいました。
具体的には、codeタグで囲んである部分の、
・シングルクォーテーション(')が全角になってしまう
・ダブルクォーテーション(")が全角になってしまう
・連続したシングルクォーテーション('')が全角のダブルクォーテーションになってしまう
等が確認されました。これにより記事からペーストしても正常に動作しない状態になってしまいました。
これらの文字は文字コードで指定すれば化けないようですので(もともと文字コードで記述すべきなのでしょうが)、過去の記事につきましてはとり急ぎ修正しましたが、不具合がありましたらコメントお願いいたします。


WordPress2.5.1へのアップデート

WordPress2.5.1日本語版がリリースされていましたので、さっそくアップデートしました。

今回も前回の2.5へのアップデート同様、こちらの記事の方法で問題なくアップデートできました。

外観や機能面では2.5とほとんど変わりませんが、バグフィックスの中には重要なものもありますので、アップデートする価値はあると思います。

パフォーマンスの向上に関しては、とりあえず記事を一つ書いてみたところではエディタのレスポンスが軽くなった様な気がする、といった程度でしょうか。

2.5ではパッチを当てなければならなかったIEでのメディアのアップロードの問題は修正されています。


懐かしいポケコンの本

よく行く古本屋の100円コーナーに懐かしい本があったので思わず購入してしまいました。
↓ポケコンマシン語入門 I/O編集部編著 工学社

若い人にはポケコンって何?という方もいると思いますが、昔は、電卓サイズにも関わらず、BASICでプログラミングができるコンピューターのことをポケコンと呼んでいました。非常に軽くて小さいので持ち運びに便利なことはもちろんですが、パソコンよりも価格が安かったため、入門機として買う人も多かったです。

当時のマイコン少年たちがマイコンを求める理由は一も二もなくゲームでしたが、ポケコンは画面が1行しかなく、処理速度も遅かったので、ゲーム目的にはあまり向きませんでした。それでもその狭い画面を工夫したいろいろなゲームが雑誌に掲載されていました。

ポケコンはごく一部のものを除いてBASICしか使えないと思われていたのですが、この本の対象であるPC-12系は、隠しコマンドでマシン語やグラフィックが利用できたりすることが判明して、雑誌では毎月解析情報やツール、そしてこれまでのポケコンの常識を覆す高速処理のゲームが発表されたりと、当時はちょっとしたお祭り状態でした。この本はそれらの雑誌の情報がまとめられた本で、PC-12系のユーザーにはバイブル的な存在でした。

私も中学生の頃は、この本とPC-12系を手に授業中に机の下でプログラミングをしたり、方眼紙を塗りつぶしてゲームのキャラクターを作ったりして有意義な時間をすごしたものです。


住所でGoogle Mapを表示するショートコードタグ

またまたショートコードタグですが、今回はGoogle Mapsを表示するショートコードタグです。GeoCodingを利用しているので住所をタグで囲むだけでマップが表示されます。これも前回の翻訳タグ同様、GoogleのサンプルJavaScriptをほとんどそのままラッピングしているだけです。
// [gmapwithgc (nosinglemsg="message" id="id" width="width" height="height" zoom="zoom")]address[/gmaiwithgc]
// googleマップを住所で表示
function gmapwithgc_func($atts, $content='') {
  extract(shortcode_atts(array(
    'nosinglemsg' => '',
    'id' => 'gmap0',
    'width' => '500px',
    'height' => '300px',
    'zoom' => '14',
  ), $atts));
  if($nosinglemsg != "" and !is_single()){
    return $nosinglemsg;
  } else {
    return <<<_EOT_
    <script src="http://maps.google.com/maps?file=api&amp;v=2.x&amp;key=●●" type="text/javascript"></script>
      <div id="$id" style="width: $width; height: $height"></div>
      <script type="text/javascript">
    map = new GMap2(document.getElementById("$id"));
    geocoder = new GClientGeocoder();
        geocoder.getLatLng("$content",
        function(point) {
      if (!point) {
        alert("$content" + " not found");
      } else {
        map.setCenter(point, $zoom);
        var marker = new GMarker(point);
        map.addOverlay(marker);
        marker.openInfoWindowHtml("$content");
      }
    });
    </script>
_EOT_;
  }
}
add_shortcode('gmapwithgc', 'gmapwithgc_func');

ソースの●●部分はご利用のGoogle Maps APIキーに置き換えてください。
使い方は記事内に以下のようなタグを入れると、Google Mapsが表示されます。
[gmapwithgc]東京タワー[/gmapwithgc]

サイズや拡大率を指定できます。
[gmapwithgc width=”400px” height=”350px” zoom=”10″]富士山[/gmapwithgc]

シングルページのみマップを表示する場合は以下のようにシングルページ以外で表示されるメッセージを指定してください。
[gmapwithgc nosinglemsg=”記事のタイトルをクリックしてシングル表示にしてください”]東京タワー[/gmapwithgc]

ひとつの記事に複数タグを入れたい場合は重複しないidを指定してください。
[gmapwithgc id=”gmap2″]東京タワー[/gmapwithgc]

以下は実際にタグを埋め込んだサンプルです。
シングルページにするとマップが表示されます


日付が土日祝日かを判別するVBA関数

前の記事のスクリプトで祝日データが取得できたので、VBAでそれを利用するサンプルとして日付が土日祝日かを判別する関数を紹介します。
前記事のスクリプトではタブ区切りテキスト形式で出力していましたが、今回はADOで利用しやすいCSV形式を利用します。
前記事のスクリプトをCSV出力に変更するためには、Else以降の部分を以下のものに差し替えます。

Else
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Set objText = objFS.CreateTextFile(OUTPUTFILE)
  Set entrys = xmlDoc.selectNodes("//feed/entry")
    objText.Write("hdate,hname" & VbCr)
  For Each entry In entrys
    objText.Write(Replace(entry.selectSingleNode("gd:when").getAttribute("startTime"), "-", "/"))
    objText.Write("," & entry.selectSingleNode("title").text & VbCr)
  Next
  objText.Close
End If

すでに取得したデータがある場合は、エディタ等でタブを”,”に変更して、一行目に”hdate,hname”という行を追加してください。
例:
hdate,hname
2008/09/23,秋分の日
2008/03/20,春分の日

以下からがVBA関数のソースです。ADOを利用しているので実行にはMicrosoft ActiveX Data Objectsへの参照設定が必要です。
IsHoliday(date)で土日祝日のいずれかならばTrue、それ以外ならFalseを返します。祝日データの場所はそれぞれの環境に合わせて修正してください。

'祝日データの場所設定(ファイルのフォルダパスとファイル名)
Const HOLIDAYDATADIR = "c:¥calendar¥"
Const HOLIDAYDATAFILENAME = "holiday.txt"
'
'入力日が土日祝日かどうかを返す
Public Function IsHoliday(ByVal paramDate As Date) As Boolean
    Dim objRS As Object
    Dim objConn As Object
    '土日ならTrue
    If IsSaturdayorSunday(paramDate) = True Then
        IsHoliday = True
        Exit Function
    End If
    'CSVデータから祝日を検索してレコードがあればTrue
    Set objConn = New ADODB.Connection
    Set objRS = New Recordset
    objConn.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};DBQ=" & HOLIDAYDATADIR & ";"
    objRS.ActiveConnection = objConn
    objRS.Source = "SELECT * FROM " & HOLIDAYDATAFILENAME & " WHERE hdate LIKE '" & paramDate & "'"
    objRS.Open
    If objRS.EOF Then
        IsHoliday = False
    Else
        IsHoliday = True
    End If
    objRS.Close
    objConn.Close
End Function
'
'入力日が土日かどうかを返す
Public Function IsSaturdayorSunday(ByVal paramDate As Date) As Boolean
    Dim tmpWeekDay As Integer
    tmpWeekDay = Weekday(paramDate)
    If tmpWeekDay = vbSunday Or tmpWeekDay = vbSaturday Then
        IsSaturdayorSunday = True
    Else
        IsSaturdayorSunday = False
    End If
End Function


Google Calendarの祝日データフィードからテキスト生成

休日のお知らせの生成や営業日の自動算出など、祝日のデータが必要になることはよくありますが、カレンダーから手入力というのも何ですので、Googleカレンダーの祝日データフィードから祝日名と日付のみ抽出してテキストにするVBScriptを作ってみました。Dimの部分を修正すればVBAにも応用できます。
なお、Googleカレンダーの祝日データフィードに関してはこちらの記事を参考にさせていただきました。

'Google Calendarから祝日データを取得
Option Explicit
'開始日
Const START_DATE="2008-01-01"
'終了日
Const END_DATE = "2008-12-31"
'保存ファイル名
Const OUTPUTFILE = "holiday.txt"
Dim xmlUrl, xmlDoc, i, entrys, entry, objFS, objText
xmlUrl="http://www.google.com/calendar/feeds/" &_
  "japanese@holiday.calendar.google.com/public/" &_
  "full-noattendees?start-min=" & START_DATE & "&start-max=" & END_DATE
Set xmlDoc = CreateObject("Microsoft.XMLDOM")
xmlDoc.async = False
If xmlDoc.Load(xmlUrl) = False then
  Msgbox("フィードの読み込みに失敗しました")
Else
  Set objFS = CreateObject("Scripting.FileSystemObject")
  Set objText = objFS.CreateTextFile(OUTPUTFILE)
  Set entrys = xmlDoc.selectNodes("//feed/entry")
  For Each entry In entrys
    objText.Write(Replace(entry.selectSingleNode("gd:when").getAttribute("startTime"), "-", "/"))
    objText.Write(vbTab & entry.selectSingleNode("title").text & VbCr)
  Next
  objText.Close
End If


Google翻訳APIを呼び出すショートコードタグ

WordPress2.5のショートコードタグ関連のネタとして、Google翻訳APIを利用するショートコードタグを作ってみました。とはいっても実質はGoogleのドキュメント内のサンプルJavaScriptをラッピングしているだけですが(^^;

// [gtranslate (sl="SourceLang" tl="TargetLang" id="id")]content[/gtranslate]
// タグに囲まれた部分をgoogle翻訳する(デフォルトは日→英)
function gtranslate_func($atts, $content='') {
  extract(shortcode_atts(array(
    'sl' => 'ja',
    'tl' => 'en',
    'id' => 'gtrans',
  ), $atts));
  return <<<_EOT_
    <div id="$id"></div>
    <script type="text/javascript" src="http://www.google.com/jsapi"></script>
    <script type="text/javascript">
    google.load("language", "1");
    function initialize() {
      google.language.translate("$content", "$sl", "$tl", function(result) {
        if (!result.error) {
        var container = document.getElementById("$id");
        container.innerHTML = result.translation;
        }
      });
    }
    google.setOnLoadCallback(initialize);
  </script>
_EOT_;
}
add_shortcode('gtranslate', 'gtranslate_func');

使い方としては記事内に以下のようなタグを入れれば、次の行の様に翻訳されます。
[gtranslate]我々はこの老人を知っています。[/gtranslate]

ひとつの記事に複数タグを入れたい場合は重複しないidを指定してください。
[gtranslate id=”gtrans2″]いえ、この眼差しと顔の傷を知っています。[/gtranslate]


PowerShellのスクリプトサンプル

PowerShellのスクリプトのサンプルとして、URLからRSSを読み込んでタイトル一覧を表示し、数字を入力するとその記事のテキストを表示する、まあ超貧弱版RSSリーダーといったものを作ってみました。
実用性はほとんどないですが、PowerShellのスクリプトがどういうものなのかというのは感じ取っていただけると思います。

#RSSを読み込んで記事を表示
#利用法:path¥rsstest.ps1 [URL] [RSSバージョン] [RSSの文字エンコード] [記事の文字エンコード]
#ex.(PC watch):.¥rsstest.ps1 http://pc.watch.impress.co.jp/sublink/pc.rdf 1.0 UTF-8 shift_jis | more
param($url, $rssVer = "1.0", $rssEnc = "UTF-8", $linkEnc = "UTF-8")
process {
  $wc = New-Object Net.WebClient
  $wc.Encoding = [System.Text.Encoding]::GetEncoding($rssEnc)
  $doc = [XML] $wc.DownloadString($url)
  $count = 0
  $link=@{}
  If($rssVer -eq "1.0"){
    $items = $doc.RDF.item
  } else {
    $items = $doc.rss.channel.item
  }
  ForEach($item in $items){
    Write-Host "[$count]: " + $item.title
    $link.[string] $count = $item.link
    $count++
  }
  $num = Read-Host "Select no."
  If($link.contains([string] $num)){
    $wc.Encoding = [System.Text.Encoding]::GetEncoding($linkEnc)
    $wc.DownloadString($link.[string] $num) -replace "<.*?>","" -replace "[ ¥t]¥n","" -replace "[¥n¥r][¥n¥r]+","`r`n"
  }
}

スクリプトを短くするため、パラメータのチェックなど厳密な処理は全く行っておりませんのであしからず。

 


PowerShellポケットリファレンスを買ってみた

久々に古本屋でない本屋へ行ってみたら、PowerShell関係の新刊が出ていましたので思わず購入してしまいました。
↓これ
Windows PowerShell ポケットリファレンス 牟田口大介著 技術評論社

PowerShellとはWindowsのコマンドプロンプトに代わる、.NETベースの新しいコマンドシェルです。
コマンドプロンプトにはシーケンス処理としては貧弱なバッチ機能しかありませんでしたが、PowerShellには充分なスクリプト言語機能が用意されており、強力なコマンド群と併せてCOMオブジェクトや.NETライブラリも利用できます。
現状ではXP、Vistaともにインストールを行わないと利用できないため、あまり普及していませんが、今後Windowsに標準搭載されるとWSHに代わっていくものになるかもしれません。
今までもPoweShellに関する書籍は何冊かありましたが、コマンド・スクリプト両面においてまとめられたものはなく、また、ポケットサイズのものもありませんでしたので、自分を含めてこういう本がほしかった人は多いと思います。
内容は基礎・コマンドレット一覧・.NETクラス一覧の3部構成で、コマンドレットはもちろん、基礎の部にスクリプト文法に関してもしっかり書かれているので、スクリプトを作るのにも不足はないと思います。特に.NETクラスに関してはスクリプト作成には必須といったあたりが簡潔にまとまっているいるので重宝しそうです。
なんか気持ち悪いくらいほめていますが、あえて文句を言うなら厚くならない程度で実用的なスクリプトのサンプルがあればとも思いました。
あと、入門書ではないのでPowerShellに関してまったく予備知識のない人(他のコマンドシェルを使い慣れている人も)が読むとピンとこない部分もあります。最低限PowerShellに付属のファーストステップガイドを読んでPowerShellの考え方(とクセ)を理解しておくことをお勧めします。
私自身は当分PowerShellスクリプトを仕事で作ることはないと思いますが、プライベートなスクリプトはなるべくPowerShellで作って今後に備えていこうかと。


    サイト内検索

    プロフィール

  • 顔絵
  • kotani(こたに)

    30台後半になって突然脱サラ。フリーのスクリプト系プログラマーとして独立を目論む謎のおやぢ。東京都在住。趣味は古本屋巡り、文具いぢり、機械いぢり、B級グルメ探索等々多岐にわたる。PCを使う作業に関しては何でもかんでも自動化したがる自動化オタク。