(11/02/01~)

11/02/01

Delphi / C++Buider Starter 機能一覧 (日本語版 PDF)
 機能一覧 (Features Matrix) の日本語版 PDF がフライング気味に更新されている。昨日の雑談 で書いたのは英語版の PDF から起こしたものだった。

 機能一覧の右側に "Starter" の列がちゃんと追加されている。そうなってくると "Starter Edition" の日本語ページは、  ですね、普通なら。

Delphi の旧バージョンのカタログと機能一覧
 日帰り出張から帰ってきました。出張行く前に Starter Edition の PDF を見つけたので朝っパチから貼っておきました。今日は "ビッグウェーブ" に乗り遅れる事が確定してたので (w

 後追い記事を出しても面白味がないので、Delphi 2007 以降のカタログと SKU 別機能一覧の PDF を列挙しておきます。

 ちなみにこれらの PDF は当サイトにあるミラーです。一部の PDF はファイル名を知っていても探し出すのが大変だと思うので。

Delphi / C++Builder Starter Edition 購入先
 既に購入可能なショップが。

 ComponentSource とか OSJオンライン とか、SEshop とかは明日以降からだな...きっと。購入を検討している方は各ショップを要チェック。


11/02/02

Delphi Starter Edition / C++Buider Starter Edition
 あ、dbGo (ADO Express) もないのか。BDE は Unicode 対応してないから、比較的楽をしたければ "IBX + Firebird" しか選択肢はないな (DB に Interbase を使うと結局 Professional を買う事になると思う。まず間違いなく $1,000 制限に引っ掛かるだろうし)。DB 機能をマトモに使いたければ Enterprise か、Architect を使う事になりそうだ。

 Delphi XE のインストール DVD の ISO イメージ が 01/21 付で更新されているのに気付く。この時点で "Starter Edition" が完全にネタバレしていた訳ね。

twitter
 参加してないけど RSS フィードで読んでる...が、現在 Web の方が死んでる (局所的に重い?) ので、米澤さんの twitter の更新が一昨日で止まってるように見える。面白いのに。"Starter Edition 祭り" 真っ最中なのに。

Delphi / C++Builder Starter Edition 購入先
 日帰り出張から帰ってきました (昨日に引き続き)。あり?両備 e-Shop 以外の動きがないのは何故?

Starter Edition の範囲でしかやらない入門書
 一昨日の雑談のエントリで、「"Starter Edition の範囲でしかやらない入門書"なんてのがあればなぁ」 と書きましたが、Team Japan ブログ によると、Dr.Bob's Delphi Programming Clinic で有名な Bob Swart 氏執筆の "Delphi XE Starter Essentials eBook" が DL できるようになっているようです...考えてる事は同じか。

 ...ただ。

 惜しい。"ないよりマシ" な程度なので、正直デブキャン資料を再構築したものの方が日本のユーザには有益かもしれない...まぁ、暗にデブキャン資料読めと言っているのだけれど。

 Delphi 1~7 ユーザが XE Starter を購入したのなら、

 これらを参照した後で、  をナナメ読みして、Google 先生で個別に検索するといいと思う。"ワカンナイ所がワカンナイ" 状態になっていると思うので。

to 米澤さん
 DEKO しゃんは見ております...家政婦にならない程度には...ですが嬢、残念ながら未だ周回遅れです。


11/02/03

第 19 回 エンバカデロ・デベロッパーキャンプ
 2011/03/30 開催。【A4】 セッションの講師は Allen="Crusher"=Bauer 氏。さらにデブキャンツアーとして 2011/03/02 に名古屋2011/03/03 に大阪 でそれぞれデブキャンが開催されます。

DEKO は何故 twitter をやらないのか?
 えーと。

 ココとか、Mr.XRAY 氏のサイトは速報性を重視している訳ではありませんで、この雑談に至っては "チラシの裏" なのですよ。"志"曰く。

時とともに人は 何にでもすっかり慣れてきて
驚きが途絶えると 次の誰かを品定めする

 DEKO は速報に値する情報なんて持っていないのです。Delphi の FT 内容バラしていいとかなら話は別ですが。twitter 自体を "価値がないもの" と切り捨てるつもりはありませんが、技術系の情報を発信したいのであれば、ちゃんとした Web サイト...少なくともブログが必要だと考えています。

原典はこちら
 ついでに、"志"曰く。

とうに醒めていたんだろう 僕の魅力のタネは尽きて
みなぎってた自信も 影をひそめおとなしくなる

こうなりゃもう終わりかなって 思った時からが勝負 糸は切れちゃいない

ほうり投げちまえば もうたどり着けない 未だ見ぬ 僕らの最高峰

だいなしにするのは いつでも自分自身のミステイク

今しか出せない輝きを 君だけに見せたいよ
他の誰かじゃ かわりはきかない

 あらあら、まるで...<ここに何かを当てはめて下さい> のようだ。

この期に及んで BDE (Paradox) を使うべきではない理由
 どうしても使わざるを得ない場合には、"53.今更ながら BDE (Borland Database Engine)" にあるトラブルシューティングの項目をご覧ください。


11/02/04

Delphi / C++Builder Starter Edition 購入先
 ComponetSource でも取扱いが開始されたようです。

 製品が発表されても、買えるトコがないと意味ないですからね。えぇい、OSJオンライン とか、SEshop はまだなのか?両備 e-Shop さんの値段は以前見たときは税抜だったのですが、今見たら税込になってますね。とても消費税の計算が面倒そうです(w

Delphi StarterおよびC++Builder Starterのアップグレード価格はだれが利用できるのですか?

アップグレード価格は、Delphi、C++Builder、Turbo Delphi、Turbo C++、
あるいは他の有償または無償の任意のIDEやソフトウェア開発ツールを持っているユーザーが対象です。

 ..."Visual Studio Express" の存在がある以上、新規購入版を買う理由がないような?ま、だからこそ ESD 版しか用意してないのだろうけれど ("通常版パッケージ" なんてあったらショップが不良在庫抱えちゃうw)。

 追記: SEshop を追加。

ラブプラス VISA カード
 廃人仕様。コンビニで何の臆面もなく○△×本を買える程のスキルを会得している者だけが所持できるという、ゴールド/ブラックカードとはまた別の意味でステータスを誇示するためのカードとも言えよう...そういえば俺、何でコナミのサイトなんて行ったんだっけ?


11/02/05

Delphi の Tips
 1 件追加しました。

 DSPack についてです。

 いやー、このサイトは土日になるとアクセス数が半分になるので、今度からこっそり土日に更新しようかと...嘘death。補足ですが、

 イロイロとご注意下さい。

Indy10 と SubVersion
 DSPack の Tips ではSubVersion を使ったインストールをやっていますが、Indy10 で SubVersion を使ったインストールを紹介していないのは、

 Delphi インストール時の Indy の構成と同じなら、Indy10 も SubVersion を使って管理した方が簡単なんですけどね...。


11/02/06

JCL and JVCL Binary Installer for XE and Starter Edition
 タイトル見ただけでピーンときたけど、そうか...Delphi XE Starter Edition には コマンドラインコンパイラが付属しない のね。

 JCL / JVCL をインストールした事のないヒト用に補足しておくと、JCL / JVCL にはインストーラが EXE の状態で付属しておらず、install.bat というスクリプトが同梱されている。このスクリプトを実行すると Delphi のコマンドラインコンパイラによってインストーラがコンパイルされ、それが起動する (インストーラがソースコードの状態で提供されているという事)。Delphi XE Starter Edition にはコマンドラインコンパイラが付属しないので、この方法が使えなくなったという事。

ミニム
 このサイトのレンタルサーバである "ミニム" ですが、コースプランの改定により従来の ギガプリン "ギガプラン" に相当する "ミディアム" の容量が 1GB->6GB となりました。もちろんお値段据え置き。「よーし、パパ、思い切って容量を無駄遣いしちゃうぞ!」という無駄にハイな意気込みに押され、とある CHM を公開する事にしました。

Diff.chm
 Minim 利益還元セール (?)。Delphi 1~2007 までのユニットの違いをまとめた CHM。クラスや関数なんかがどのバージョンで追加されたのかを知る事ができます。以前、このサイトで限定公開していた ものを CHM 化したものです。

 生成に使われているのは PasDoc というツールで、ソースからクラスや関数等を HTML に吐きだしてくれます。もっとも、これ単体で CHM を生成してくれるものではないので、CHM 化には "HTML Help Workshop" と多少の知識が必要になります。

 Diff.chm に使われた PasDoc よりも新しいものが存在するのですが、残念ながら現時点ではジェネリクスやクラスヘルパー等の構文に対応していません。このため、対応していない構文が含まれるユニットは丸ごと HTML 化されない (エラーになる箇所だけではなく、ユニット内のすべての関数やクラスも) 事になり、リストから漏れてしまいます。よって、Delphi 2009 以降のリストは含まれていません。

 CHM は HTML に逆コンパイルできますので、使いにくかったら HTML に戻してお使い下さい。

バイク製作中なう
 どういう事かは明日の雑談にて。


11/02/07

使い捨てライターを使ってバイクを作る
 いわゆる "作ってみた" って奴ですね。最初にお断りしておきますが、ちゃんと元ネタがあります。

 で、出来たのがコレです。まさに "Fucking. Awesome."

 ソレっぽいですね...かっこカワユス ("チョロバイ" とか言っちゃうと歳がバレますぜ、旦那)。手持ちのライターの関係上、ちょっとアレンジを加えてあります。あと、ライターが水色とピンクだったので、樹脂部品は黒で塗装してあります。

 作る上での注意点ですが...

 材料として必要なのは "フリントロック式の使い捨てライター×2" だけです。その他には何も使っていません。使い捨てライターの分解方法を知っていれば誰にでも作れると思います。

「...で?釈明を聞こうか?」
 お客さんの PC が不調で修理のために日曜出勤してたのですが、待ち時間の長さに退屈してしまいまして。以前見かけたサイトを思い出してバイク作りに没頭してしまいました (サーセン)。途中で復旧作業を放り出してダイソーに黒のスプレー缶を買いに行きました (サーセン)。


11/02/08

エンバカデロ iGoogle ガジェット (試)
 iGoogle 用のガジェットは XML なのでテキストエディタさえあれば作れます。ありそうでなかったエンバカさんの RSS ガジェットを作ってみました。但し、作ったとは言ってもソースは "RSSリーダーの作成から学ぶ、はじめての iGoogle ガジェット開発 (CodeZine)" からの丸パクリです。

<?xml version="1.0" encoding="UTF-8"?>
<Module>
<ModulePrefs title="Embarcadero-RSS" scrolling="true">
<Require feature="setprefs"/>
<Require feature="tabs" />
</ModulePrefs>
<UserPref name="feedNum" required="true" display_name="表示件数" 
          datatype="enum" default_value="10">
<EnumValue value="5"/>
<EnumValue value="10"/>
<EnumValue value="15"/>
<EnumValue value="20"/>
</UserPref>
<UserPref name="selectedTab" datatype="hidden"/>
<Content type="html">
<![CDATA[
<script type="text/javascript">
//全ての設定情報の取得
var prefs = new _IG_Prefs(__MODULE_ID__); 
//タブ情報にアクセスするためのオブジェクトを取得
var tabs = new _IG_Tabs(__MODULE_ID__);

function init() {
  var ednFeedUrl = 'http://edn.embarcadero.com/jp/rss';
  var twembFeedUrl = 'http://twitter.com/statuses/user_timeline/56877918.rss';
  var teamjFeedUrl = 'http://blogs.embarcadero.com/teamj/feed/';
  var forumFeedUrl = 'https://forums.embarcadero.com/rss/rssthreads.jspa?categoryID=3';
  var allegroFeedUrl = 'http://blogs.itmedia.co.jp/barbaro/index.rdf';
  var twfujiiFeedUrl = 'http://twitter.com/statuses/user_timeline/53317181.rss';
  var twyonezawaFeedUrl = 'http://twitter.com/statuses/user_timeline/121929534.rss';
  var twtadenumaFeedUrl = 'http://twitter.com/statuses/user_timeline/240592533.rss';
  var dfeedsFeedUrl = 'http://feeds.delphifeeds.com/delphifeeds';
  tabs.addTab("EDN_JP", "edn", getCallback(ednFeedUrl));
  tabs.addTab("embarcadero_jp", "twemb", getCallback(twembFeedUrl));
  tabs.addTab("Team Japan", "teamj", getCallback(teamjFeedUrl));
  tabs.addTab("Discussion Forums", "forum", getCallback(forumFeedUrl));
  tabs.addTab("Allegro Barbaro", "allegro", getCallback(allegroFeedUrl));
  tabs.addTab("Twitter / hifujii", "hifujii", getCallback(twfujiiFeedUrl));
  tabs.addTab("Twitter / CYonezawa", "CYonezawa", getCallback(twyonezawaFeedUrl));
  tabs.addTab("Twitter / tadeko", "tadeko", getCallback(twtadenumaFeedUrl));
  tabs.addTab("DelphiFeeds.com", "dfeed", getCallback(dfeedsFeedUrl));
}

/**
 * タブ切り替え時のCallback関数を返します
 * @param {String} feedUrl RSSのURL
 */
function getCallback(feedUrl) {
  return function(tabId) {
    callbackLoadTab(tabId, feedUrl);
  }
}

/**
 * タブ切り替え時のCallback関数
 * @param {String} tabId タブのコンテンツを示すid(div)
 * @param {String} feedUrl RSSのURL
 */
function callbackLoadTab(tabId, feedUrl) {
  _IG_FetchXmlContent(feedUrl, function (response) {
    if (response == null || typeof(response) != "object" 
                         || response.firstChild == null) {
      _gel(tabId).innerHTML = "<p>データが取得できませんでした</p>";
      return;
    }
    var feedTitle = response.getElementsByTagName("title")
                      .item(0).firstChild.nodeValue; //タイトル
    var feedLink = response.getElementsByTagName("link")
                      .item(0).firstChild.nodeValue;   //リンク
    var html = '<div><p class="center"><a href="' + feedLink 
             + '" target="_blank">' + feedTitle + '</a></p><ul>';
    var itemList = response.getElementsByTagName("item");
    var feedNum = prefs.getInt("feedNum");  //設定された表示件数の取得
    for (var i = 0; i < feedNum ; i++) { 
      var nodeList = itemList.item(i).childNodes;
      for (var j = 0; j < nodeList.length ; j++) {
        var node = nodeList.item(j);
        if (node.nodeName == "title") {
          var title = node.firstChild.nodeValue;  //記事のタイトル
        }
        if (node.nodeName == "link") {
          var link = node.firstChild.nodeValue;   //記事のURL
        }
        if (node.nodeName == "category") {
          var category = node.firstChild.nodeValue;  //記事のカテゴリ
        }
      } 
      html += '<li><a href="' + link +'" target="_blank">' 
            + title + '[' + category + ']' + '</a></li>';
    }
    html += '</ul></div>';
    //_gel(id)はdocument.getElementByIdのラッパー関数
    _gel(tabId).innerHTML = html;
  });
}

//ロード時に呼ばれるイベントハンドラ。関数を引数に取る
_IG_RegisterOnloadHandler(init);
</script>
<style type="text/css">
<!--
body {
  font-size: 80%;
}
p.center {
  text-align:center;
  margin: 2px;
}
ul {
  list-style-type: circle;
  margin: 2px;
  padding: 5px 0 5px 12px;
}
li {
  margin: 2px;
}
a {
  text-decoration: none;
}
-->
</style>
<div id="edn" style="display:none"></div>
<div id="twemb" style="display:none"></div>
<div id="teamj" style="display:none"></div>
<div id="forum" style="display:none"></div>
<div id="allegro" style="display:none"></div>
<div id="hifujii" style="display:none"></div>
<div id="CYonezawa" style="display:none"></div>
<div id="tadeko" style="display:none"></div>
<div id="dfeeds" style="display:none"></div>
]]>
</Content>
</Module>

 訴えられるといけないので (?) iGoogle には登録してありません (エンバカさんに何の確認も取ってませんし)。試してみたい方は

 からどうぞ。著名な方のブログですとか Twitter とかが含まれておりませんので、ちょっと物足りないかもしれません。そこはどなたかがちゃんと整備をして iGoogle へ登録されるとよろしいかと思います (むしろエンバカさんで作ってくれい)。


11/02/09

今日のおかずはなーに♪(なーに♪)
 諸事情により、たまに僕が子供のお弁当を作る事があります。今日はこんな感じ。

 正直、子供には概ね好評ですが、奥さんには不評です。何故って、時間とか材料とか関係なく作っちゃうので、「美味しいのは美味しいのだろうけど、毎日コレを期待されるコッチの身にもなってくれ」 だそうです。加えて 「何故、冷食を使わない?」 とも言われてしまいました。男の人って凝り性が多いですもんねー。ちなみに、このソーセージの下にはもう一品隠れています (イメージはキノピオなので、キノコのソテーなのですが)。

 「何かを作る」というカテゴリーならジャンル問わず好きですので、お弁当作りは苦じゃないですねー。しかし、幼稚園児のお弁当箱は小さくてカワユスなぁ。

IBConsole 日本語版+α
 リリース。ファイルダイアログの処理を見直し。クエリ結果を保存しようとすると拡張子が必ず csv になる件とか...原因は ; (セミコロン) の挟み忘れだったという。


11/02/10

IRQ8Priority
 今頃になってこのキーワードでこのサイトに来てるヒトが多い模様。4 年以上前に書いた記事 なのになぁ。

 内容は昔の記事にお任せするとして、例えばちょっと前の "ToughBook" は "RTC ≠ IRQ8" だったハズ (現行のは知らない)。他にも数台確認した気がするけど、今となってはよく覚えていない。

 最近の PC はレジストリチューンで高速化するよりも、

 をやった方が遥かに効果がある。"驚速なんたら" とかいうのがあるが、「それ買う金あるならメモリ買えよ」とマジで思う。


11/02/11

SynEdit
 Delphi 用のエディタコンポーネント。ま、Delphi 用に限ってる訳じゃなく、Kylix や Lazarus (FreePascal) でも使える。現行の SynEdit は Unicode に対応しているが、実は SynEdit には 2 種類ある事をご存じだろうか?ANSI 版 と Unicode 版...じゃない。

 まずは Lazarus のスクリーンショット を見て頂こう。コードエディタ部には SynEdit が使われているのだが、何かお気付きになっただろうか?

 そう、Lazarus のコードエディタは コードフォールディング (折り畳み) に対応 している。だが、最新版の SynEdit をインストールしてもコードフォールディング機能は使えない。これが、「SynEdit には 2 種類ある」 と書いた理由だ。

 コードフォールディング (折り畳み) に対応している SynEdit は Lazarus のソースコードに含まれているが、わざわざこれを DL せずとも SVN にはコードフォールディング対応のブランチがちゃんと置いてある。URL は http://synedit.svn.sourceforge.net/viewvc/synedit/branches/CodeFolding/

 当方は IBConsole 日本語版+α の関係で古い UniSynEdit (現在は DL できない) を使っている...古いバージョンのものに依存している処理が少しあるので。

 See also:

今日は建国記念日
 勘違いしやすいけれど、建国記念日とは言っても "日本国" の建国記念日ではなく、いわゆる紀元節ベースでの話。ちなみに "西暦 2011 年" は "皇紀 2671 年"。"西暦に軽自動車の排気量を足せば皇紀になる" と覚えておくと変換が簡単。


11/02/14

2月14日はバレンタイン...いや、Delphi の誕生日
 去年が 15 周年 だったので、当然今年で 16 周年。Windows 95 発売のちょっと前で、最初は Windows 3.1 で動作させていた事を思い出す。

 スクリーンショットは昨年 VM 上で動作させた "Windows3.1 + Delphi 1.0J"。現行の XE からするとツールパレットが少なくて寂しい。

 それまでは MS-C / Borland C/C++ なんかを使っていたのだけれど、覚えなきゃいけないツマンナイルールがアフォのようにあった。作りたいものはあってもそれを実現するための道程が果てしなく長いというか。Visual Basic はその当時 2.0J だったかな...があったけど、どうもしっくりこなかった。今は亡き "C MAGAZINE" に Delphi の体験版が添付された時、かなりの勢いで食いついたっけ...Turbo Pascal はやった事なかったんだけど。

Antique Software
 Turbo Pascal 等はかなり前から無償公開されている。Borland -> CodeGear -> Embarcadero へと遷移した過程でダウンロード先が見つけにくくなっているけれど。

 それから...この件とはちょっと違うけど、Borland C++ Compiler 5.5 / Turbo Debugger も未だに DL 可能。

Delphi Day
 大野さんのつぶやき があったみたいなので、大野さん絡みの資料 (PowerPoint) を公開してみます。

 時は 1999 年 9 の月。ノストラダムスの予言が外れた事にほっと胸を撫で下ろしていた頃のお話です。Delphi 5 がリリースされた時ですね...しかし、何でも持ってるなオイラ (w

 Delphi 5 と言えば

 の画像キャプチャシステムは未だに Delphi 製なのだろうか?

Leaning Edition
 Delphi 5 には "Leaning Edition" というのがありましたが、お値段は ¥20,000 でした。対して、"XE Starter Edition" は ¥18,000 です。

製品名 価格
Microsoft Windows 7 Home Premium ¥24,800
Microsoft Office Personal 2010 ¥29,800
Adobe Acrobat X Standard ¥34,800
Adobe Flash Professional CS5 ¥84,800

 "XE Starter Edition" は決して高くないと思います..."Intel Composer XE 2011" の価格とかみても。

Buy 1 Get 1 Free キャンペーン
 今日から 1 週間限定だそうな...マクドナルドのコーヒーの話ですがね。


11/02/15

...お前、喧嘩売ってるのか?
 なにやら物騒なタイトルですが、とりあえず画像を見て頂きましょうか。某サイトで見かけた Google の広告です。

 ふーん、そっかー。"仕事ができなくなる程にお客さんの PC を重くしてくれちゃったのは誰でしたっけ?""コーポレート版のくせにメールを完全ブロックしてくれてお客さんを激怒させたのは誰でしたっけ?"...ウィルスバスター? 最悪ですよ?トレンドマイクロ?プリインストールされていたら真っ先にアンインストールしますが何か?

 「現行の製品はそんなに重くないし、不具合もない」 と言うのだったら、W32/Induc-A だって "現行の Delphi には感染せんのよ" (感染するのは Delphi 7 まで...一番新しいものでも 2002 年の製品で、W32/Induc-A が出る前にサポート終了している)。少なくともこの広告は 正確/公平性を欠いている と思うけどいかがかね...トレンドマイクロの方。

 ちなみにこの広告は "ASCII.jp で Borland を検索" すると確実に出てくるようです...てか、当サイトにあるサイト内検索でもキーワードが "Borland" または "CodeGear" だと出てきますね (トップページで試せます)。いつからこの状態だったのかは不明ですが...。

 まずは、"ウイルスバスターに脆弱性発生" って広告を出してから、他社のブランド名を名指ししろっての。

W32/Induc-A"MS09-35"
 W32/Induc-A が発見されたのが 2009/08 その一ヶ月前に "MS09-35" というのがありまして、これは何かと言うと VisualStudio (C++) の ATL に脆弱性があり、未対策の ATL を使うとリモートでコードが実行できてしまうというものでした。W32/Induc-A の仕組みと似たような脆弱性です (或いは、時期的に考えて W32/Induc-A"MS09-35" がヒントになっているのかもしれませんが...)。

 「パッチがあるからいいじゃないか?」と思われるでしょうが、アプリケーションライフサイクルから外れている VisualStudio 2002 のパッチは提供されていません。奇しくも Delphi 7 と同時期の製品です。

 "Microsoft" で検索して、広告の結果に "VisualStudioに脆弱性発生" とかが表示されるのなら公平性は保たれているのかもしれませんが (それでもどうかと思いますが)、特定の製品名が名指しで表示されるのは Delphi だけじゃないでしょうか?先の ASCII.jp において、"ウィルス Excel" と検索ワードに明示的に製品名を入れても広告には "Excel" なんて単語は絶対に出てこないのですから...同様に "ウィルス Zlkon" とやっても "Adobe Reader" は出てきません。


11/02/16

トレンドマイクロの件
 いやー、もっとシンプルに "ASCII.jp で Delphi を検索" しても出てくるのね、例の広告...もう笑うしかないな。

 ノート PC や USB メモリにウィルスが混入 してた事があったけれど、問題のあった製品名や会社名で検索しても名指しで製品名や会社名は出てこない...ま、それが普通だわ。この広告、検索キーワードによって文面を変えているみたいだけど、通常 "ウィルス + 製品名 or 会社名" だと "ウイルスに感染したときは" としか出てこない。ところが、

 というキーワードは単独でも "Delphiにウイルス感染発生" というメッセージを出すようだ。もはや営業妨害レベルじゃね?百歩譲って "ウイルスに感染したときは" というトレンドマイクロの広告が出るのは許せるが、何故 Delphi だけはわざわざ "名指しの文面" が用意されてるのだ?他にもあるのか?あれ程猛威を振るった Gumblar (当初 GENO ウィルスと呼ばれていた) を検索しても GENO は出てこないし、"GENO" 単体ではトレンドマイクロの広告は出てこない。

 キーワードに関しては Google の関連キーワードに問題があるのか、トレンドマイクロの広告キーワードに問題があるのかは判断できないが、"名指しの広告" に関しては 100% トレンドマイクロに問題があると思う。"GENOウイルス対策なら" という広告も今となってはどうかと思うけど?


11/02/17

Windows 7 SP1 リリース
 今日はプチ出張なので、備忘録代わりに早めに書いておこう。

 リリースとはいえ、一般的に DL 可能になるのは 02/23 から。本日から DL できるのは恐らくメーカーと MSDN / TechNet 会員のみなので注意。夕方頃には DL できるかな?

Windows 7 SP1 インストール
 無事 DL できて、無事にインストールできた。特に問題はなさそうデス。

福岡の都市高速
 大宰府から乗って西回りする際に便利な 5 号線が "かなり" できてた。02/26 午後 3 時に "野芥~福重" 間が開通する模様。ここが開通してもあと 1 ブロック (福重~青果市場入口) が残っているので、まだ環状線にはならない (H24 内に開通予定) のですが、西九州自動車道へは東回り/西回りいずれからでも行ける事になります。

 高架下もかなり整備されたので、一般道の片側 1 車線区間がかなり減り、一時期に比べると渋滞もそこまでひどくはなくなったみたい。ひどいときは "青果市場入口~野芥" の短い区間で 40 分を費やした事があったからなぁ...。


11/02/18

Delphi 向け私用ツール (その1)
 お客さんにまで "トラブルシューター" が本職だと思われている DEKO ですが、"プログラマ兼 SE" が職業です (確か名刺にはそう書いてあったと)...あぁ、もう面倒なので "自称" でいいや (w

 で、業務系のアプリ作ってると何が面倒って入力コントロールの数の多さが面倒。Embarcadero の Survay が可愛く感じ程の入力項目を要求してくるお客さんがいます。で、DB からの入出力は非常に冗長なものになり、コントロール名を下手すりゃ 3 桁の行数書くことになります。

edInput01.Text := FieldByName('Field01').AsString;
edInput02.Text := FieldByName('Field02').AsString;
edInput03.Text := FieldByName('Field03').AsString;
edInput04.Text := FieldByName('Field04').AsString;
edInput05.Text := FieldByName('Field05').AsString;
edInput06.Text := FieldByName('Field06').AsString;
edInput07.Text := FieldByName('Field07').AsString;
edInput08.Text := FieldByName('Field08').AsString;
edInput09.Text := FieldByName('Field09').AsString;
edInput10.Text := FieldByName('Field10').AsString;

...

edInput99.Text := FieldByName('Field99').AsString;

 こんな感じで。コントロール名が連番になっていればちょっとは楽なのですが、連番のコントロール名だとソース見た時に何やってるのかワカンナくなりますので、コントロール名は判りやすいものを付ける事になります。DB のフィールド名を使った奴とか。

 でも、そうするとコントロール名を拾うのに補完を利用したり、オブジェクトインスペクタから持ってくる事になるのですが、チマチマコピペを繰り返すとイライラしてきます。前置きが長くなりましたが、そこで私用ツールを使っています。ちょっとデモしてみましょう。

 この位のコントロール数なんて可愛いものですが、コイツラの名前を一気に取得してみます。取得したいコントロールをまず選択します。取得したくないのは除外します...奇数列のコントロール名だけ欲しいとしますね。

 こんな感じで選択して、Ctrl+C でクリップボードへコピーします。次にツールを起動します。

 そしてボタンを押すと、コントロール名をクリップボードに返します。エディタに貼り付けてみると...

Edit1
Button1
Edit3
Button3
Edit5
Button5
Edit7
Button7
Edit9
Button9
Edit11
Button11

 はい、コントロール名だけ取得できましたとさ。結構な数のコントロール名も一瞬でコントロール名が取得できます。選択順序を変えるとその順番でコントロール名が取得できます。

 世の中にはこのような入力画面はザラって事です (横スクロールバーに注目)。このフォームは入力項目が数百あります。

Delphi 向け私用ツール (その2)
 Excel で CSV をいじられると書式が勝手に変更されちゃったりするので...

 こんなのも作ってます。CSV / TSV によるインポート/エクスポート機能はよく言われるので。

 こんな感じの CSV エディタです。他にも私用ツールはありますが、また後日。


11/02/19

Delphi 向け私用ツール (その3)
 業務系のアプリ作ってると何が面倒って入力コントロールの数の多さが面倒...と、昨日書きました。コントロール名を取得するだけでも面倒ですが、"貼り付けてプロパティ変えて名前を付ける" のはもっと面倒です。

 で、このツール。コントロールの名前とキャプションと種類を入力すると、勝手にガバガバ生成してくれます。このツールで入力するのすら面倒な時があるので、

 まず、Excel で一覧を作ります。

 "Paste From Clipboard" で Excel からコピーし、"Generate Controls" を押すとコントロールをクリップボードに返します。こんな感じで...。

object lblField01: TLabel
  Left = 0
  Top = 0
  Width = 100
  Height = 25
  Caption = 'AAA'
end

object lblField02: TLabel
  Left = 0
  Top = 25
  Width = 100
  Height = 25
  Caption = 'BBB'
end

object lblField03: TLabel
  Left = 0
  Top = 50
  Width = 100
  Height = 25
  Caption = 'CCC'
end

...

object lblField10: TLabel
  Left = 0
  Top = 225
  Width = 100
  Height = 25
  Caption = 'JJJ'
end

 フォームエディタに貼り付けるとこうなります。

 生成可能なコントロールは事前に登録しておく必要があります。Delphi のリポジトリみたいなものです。

object @Prefix@@Name@: TPanel
  Left = 0
  Top = @Top@
  Width = 330
  Height = 25
  BevelOuter = bvNone
  Color = clWindow
  ParentBackground = False
  TabOrder = 4
  object rbMale1: TRadioButton
    Left = 3
    Top = 5
    Width = 54
    Height = 17
    Caption = 'Male'
    Checked = True
    TabOrder = 0
  end
  object rbFemale1: TRadioButton
    Left = 59
    Top = 5
    Width = 70
    Height = 17
    Caption = 'Female'
    TabOrder = 1
  end
end

 上記の例は パネルの上に男女のラジオボタンが載っています。最初から IME の設定をしておいたりフォントを設定したものを登録しておけば、一つ一つオブジェクトインスペクタで値を変更しないで済みます。

 長々と講釈を垂れましたが、陸奥圓明流で言う所の "無刀金的破" な感じです...「言う程大したもんじゃない」みたいな..."オブジェクトリポジトリのバッチ生成版" といったトコでしょうかね。平たく言えば "Excel から大量のコントロールを生成するツール" です。

Delphi 向け私用ツール (その4)
 これは多分、理解してもらえないツール。まさに私用にしか使えない...."C/O/Rマッピング・ソースジェネレータ" とでも言いますか。

 コンボボックスでテーブルを選ぶと、そのフィールドで入力できるフォームが自動生成される (DFM と PAS)。んで、クラスが定義されているユニットがあって (正確には専用のプロジェクト一式)、それに上記画像で表示されているコードを挿入すると入力/検索等ができるフォームができる。"PHP とかで、HTML を生成するような感じ" と捉えて頂ければ。

 "Control (VCL) <-> Object <-> Record" を自動で設定したフォームを生成するので、とりあえず入力する目的だけなら自動で生成された EditBox とかの位置を変更するだけで、プロパティの変更は一切不要。EditBox の幅とかも、DB の文字数で自動設定される。

 未だジェネリクス版は完成していない (オリジナルは D2007 で作られている。Unicode 版は単純移植のため、ジェネリクスが使われていない) が、ジェネリクス版が完成すれば、追加しなければならないソースコードは段違いに減るハズ。最初に DB のテーブルがカッチリ決まっていれば、基本レイアウトの調整しかやる事がない。

 いわゆる "O/Rマッパ" とはちょっと違うが、頻繁にテーブル構造が変わったり動的にテーブル構造が変化しないのであれば、この方式は非常に便利。手順をまとめると...

  1. DB のテーブルを設計する
  2. このツールを起動し、テーブルを選択して [生成] ボタンを押す。
  3. 専用プロジェクトに生成されたファイルを追加する。
  4. 表示されているコードを専用プロジェクトのユニットに追記する。追記場所はコメントで埋め込まれている (理屈的には自動追記も可能だが、そこまではやっていない)。
  5. コンパイルする。
 マスタ系の入力フォームは一発で生成できる。コーディングは皆無...むしろ、SQL の "Create Table" を考えている時間の方が長いと思う。「Excel からコントロールを生成して貼り付けられてもコーディングが残ってるじゃないか」「O/Rマッパでもまだ面倒」 というコンセプトで作られた。「Delphi のフォームファイルとユニットはテキストファイルなのだから、DB の情報を元にしてコードごとすべて自動生成してしまえ」...という考え方。

 Delphi の高速コンパイルを活かして "RAD の RAD" をやっています。最近の言語はイロイロとコードを簡潔に書けますが、上記手法だと "開発時間 (工数)" から考えればチャラにしてなおお釣りがきます。Interbase / Firebird なら IBConsole 日本語版+α のオブジェクトウィンドウのテンプレートタブでも、ある程度は楽できますけどね。

 FieldByName とか ParamByName のコードを半分書いてくれます。


11/02/20

前の会社の社長
 前の会社の社長さん (当時。現在はどうなっているのか知らないケド) が県議会議員の選挙に出る事が判明。自民党推薦 (?) の模様。陰ながら応援させて頂きます。

メキシカン・フライヤー (Ken Woodman & His Picadilly Brass)
 とりあえず聴いて頂こう。

 むしろ "スペースチャンネル5" の曲としての方が有名かもしれない。その "スペースチャンネル5" だが、Part2 の方が今春 (...ってももう今春なんだが) PS3 (PlayStation Network) / Xbox360 (Xbox LIVEアーケード) で配信される予定 になっている。久々にやりたくなってきた。PS2 版でも買うか?つか、むしろこのゲームは Wii 向きな気がするんだが...キネクト使うなら新作でもいいんだけどね。

 映画 "スウィングガールズ" でもこの曲が演奏されていたな、そういや。

Make Her Mine (Hipster Image)
 "スウィングガールズ" 繋がりで。

 いい曲だ。メキシカン・フライヤーと同じく 1965 年の曲らしい。


11/02/21

Delphi 2010 / XE で作るマウスジェスチャ対応画像ビューア
 なーに、10 分もあれば作れますって (以下をコピペなら 5 分も掛らないハズです)。Delphi 2010 / XE ならアフォみたいに簡単です。とりあえず仕様を。

 操作性や機能の向上は各自やって下さいね。では行ってみましょう。

  1. Delphi で新規プロジェクトを作成します。
  2. フォームに ActionManager を貼ります (ActionManager1)
  3. フォームに GestureManager を貼ります (GestureManager1)
  4. フォームに Button を貼ります (Button1)
  5. フォームに Button を貼ります (Button2)
  6. フォームに Panel を貼ります (Panel1)
  7. Panel1 に Image を貼ります
  8. ここまでの作業でこんな感じになると思います。

    では次に進みましょう。

  9. オブジェクトインスペクタでフォームのプロパティを変更します。

    ※(任意) の所は変更しなくても支障はありません。

  10. クラス内プライベート変数を追加します。

      private
        { Private 宣言 }
        FIndex: Integer;
        PicList: TStringList;
        ...

    FIndex はページのインデックスを指すための変数で、PicList は画像のフルパス名を保持するリストです。

  11. 上記変数の初期化処理/終了時処理を記述します。

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      FIndex := 1;
      PicList := TStringList.Create;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      PicList.Free;
    end;

    FIndex の初期値が 1 になっている理由は後で解ります。

  12. フォーム上の ActionManager をダブルクリックし、設定ダイアログを開きます。
  13. "アクションの新規作成" でアクションを追加します。
  14. "アクションの新規作成" でアクションを追加します。
  15. 設定ダイアログの "アクション" にある "<<" をダブルクリックしてイベントを記述します。

    procedure TForm1.Action_LeftExecute(Sender: TObject);
    begin
      if FIndex > 0 then
        begin
          Dec(FIndex);
          Image1.Picture.LoadFromFile(PicList[FIndex]);
        end;
      Panel1.SetFocus;
    end;

    ページを戻る処理になります。

  16. 同様に、">>" をダブルクリックしてイベントを記述します。

    procedure TForm1.Action_RightExecute(Sender: TObject);
    begin
      if FIndex < PicList.Count-1 then
        begin
          Inc(FIndex);
          Image1.Picture.LoadFromFile(PicList[FIndex]);
        end;
      Panel1.SetFocus;
    end;

    ページを進む処理になります。

  17. フォームの OnShow イベントを記述します。

    procedure TForm1.FormShow(Sender: TObject);
    var
      FilePath, FileName: string;
    begin
      OnShow := nil;
    
      FilePath := IncludeTrailingPathDelimiter(ExtractFilePath(ParamStr(0))) + 'pic';
      if not DirectoryExists(FilePath) then
        ForceDirectories(FilePath);
    
      for FileName in TDirectory.GetFiles(FilePath, '*.jpg', TSearchOption.soAllDirectories) do
        PicList.Add(FileName);
    
      if PicList.Count > 0 then
        Action_LeftExecute(nil);
    end;

    ファイル一覧を取得してリストに突っ込んでいます。

  18. uses に IOUtils と Jpeg を追記します。

    uses
      ..., IOUtils, Jpeg;

    TDirectory が使えるようにするのと、TImage で Jpeg を使えるようにするためです。

  19. Button1 のプロパティを変更します。
  20. Button2 のプロパティを変更します。
  21. Panel1 のプロパティを変更します。
  22. Image1 のプロパティを変更します。

    上記設定で、"画像をフォームサイズに合わせてアスペクト比を保持しつつ拡大縮小し中央に置く" 事が可能になります。

  23. ここまでの作業でこんな感じになると思います。


  24. Image1 の Touch.GestureManager に GestureManager1 を指定します
  25. Touch.Gestures.Standard にある基本ジェスチャにアクションを割り当てます
  26. Touch.Gestures.Standard.Left にチェックを入れ、Action_Left を割り当てます
  27. Touch.Gestures.Standard.Right にチェックを入れ、Action_Right を割り当てます
  28. Touch の所は最終的にこうなります。


    "マウスでクリックしたまま左へ移動しマウスを離す操作" が基本ジェスチャの "Left" です。逆が "Right" になります。

 これにて完成です。一度実行してそのまま終了すると、EXE のあるフォルダの下に pic フォルダができますので、そこへ任意の Jpeg 画像を突っ込んでみて下さい。

  

 このように、画像が変わってもアスペクト比を保ったまま可能な限り拡大して中央に画像が表示されます。左右のボタンまたはカーソルキーの左右、またはジェスチャで画像を進めたり戻したりできます。

 先に発売された Delphi / C++Builder XE Starter でもこのアプリは作れます (多分)。要は各種イベントが ActionManager で管理されているのなら GestureManager を貼って、適当なジェスチャを選び、そこへアクションを設定してやるだけでジェスチャーアプリケーションが実現できるという事です。

 いわゆる "マルチタッチ" については ジェスチャ機能の概要 (DocWiki) の "対話型ジェスチャ" の項目をご覧ください...5 分でできるなら ライトニングトーク に出せばよかったかな?いあいあ、わずか 5 分のために上京するのはナンセンスだな (w

オンメモリテーブル
 Delphi Q&A 掲示板 より。以下のコードは "#150:To use TClientDataset as memory dataset (Scalabium Software)" を要約したものです。

uses
  ..., DB, DBClient;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  Table: TClientDataset;
begin
  table := TClientDataset.Create(Application);
  with table do
    begin
      FieldDefs.Add('ID'     , ftInteger,  0, False);
      FieldDefs.Add('Status' , ftString , 10, False);
      FieldDefs.Add('Created', ftDate   ,  0, False);
      FieldDefs.Add('Volume' , ftFloat  ,  0, False);
      CreateDataset;
      Open;
      for i := 1 to 100 do
        begin
          Append;
          FieldByName('ID'     ).AsInteger  := i;
          FieldByName('Status' ).AsString   := 'Code' + IntToStr(i);
          FieldByName('Created').AsDateTime := Date();
          FieldByName('Volume' ).AsFloat    := Random(10000);
          Post;
        end;
      First;
      ShowMessage(FieldByName('Status' ).AsString);
      Next;
      ShowMessage(FieldByName('Status' ).AsString);
      Close;
    end;
end;

 使い所によっては便利だと思います。


11/02/22

Touch.Gestures.InteractiveGesture / InteractiveGestureOption / TabletOptions
 Delphi 2010 以降でマルチタッチの実現に必要なプロパティです...が、定数で言われても "どのマルチタッチ操作が何に相当するのか" が解りにくいと思います。ちょっと行儀が悪いですが、Microsoft の説明画像を直接貼り付けてみます。日本語訳を作りました。

 元ページは "Windows タッチ ジェスチャの概要 (MSDN)" です。

マルチタッチ対応ディスプレイ (2011/02 現在)
 大分、値段もこなれてきたようですね。

 他にも、既存のワイドディスプレイをマルチタッチ対応にする 上海問屋 DN-UMTS215 / DN-UMTS236 / DN-UMTS240 なんてのがあるようです。

Delphi で画面を回転させる
 他人のふんどしで相撲シリーズ。画像を回転させるのではなく、スクリーン自体を回転させる方法です。

 別に Windows 7 の機能という訳ではありません。未検証ですが Windows 2000 でもできるような気がします。


11/02/23

Windows 7 SP1 リリース
 一般公開日です。DL は http://www.microsoft.com/downloads/details.aspx?FamilyID=c3202ce6-4056-4059-8a1b-3a9b77cdfdda&displayLang=ja から。Windows Update 経由でも入手できるようなので、慌てて DL するようなものじゃないかもしれません。

 当方はβや RC は入れずに 17日のリリースでインストールしたのですが、僅かながら体感速度が向上した気がします...ま、昨今の高速な CPU だと誤差レベルの話かもしれませんけどね。少なくとも体感で遅くなったという事はありません。

 今の所 "当方は" 問題が起きていません。しかしながら、お客さんトコで 「アップデート失敗して起動しない(T-T)」なんて電話が掛ってこないか戦々恐々です...過去に XP や Vista の SP の適用失敗で何度呼び出された事か。

 Server 2008 R2 にはこの SP1 で新機能が追加されていますが、Windows 7 の新機能はないとの事。累積 Hotfix という位置付けですね。

過去の SP の変更点 (XP 以降)
 とりあえず一覧で。

 XP は SP で結構機能追加されています...つーか、"SP で API 追加すんなよ" と思いました。リモコンデバイス とか WIC も XP SP1 で追加されています。"普通に使う分には変化がないように見えても、実は API レベルの変更がある" とかだととても困っちゃいます...そういうのって後で気付くんですよねぇ、大抵。


11/02/24

B.B.クイーンズ
 再始動だとか。米澤さん経由で知った。イロモノと見られがちなのがチト残念 (世間的には "一発屋" 扱いだし)。近藤房之助さんと坪倉唯子さんについては、

 取っ掛かりとして、この 2 曲だけでも聴いてもらえれば随分と見方が変わると思う...両方とも CD 持ってますけどね。

G.G.ブリッジ
 "Get the New Delphi XE Wallpaper (Andreano Lausse Blog)" だそうで。何故に "ゴールデンゲートブリッジ" なのだろう?エンバカさん的には "橋" ではなく "波止場" じゃないのだろうか?


11/02/26

福岡の都市高速
 "野芥~福重" 間が開通。西九州自動車道へは東回り/西回りいずれかれでも行けるようになりました。

劇場版マクロスF ~サヨナラノツバサ~
 本日より上映。"イツワリノウタヒメ" の方も TV 版とは大きく異なっていたので、こちらも期待。但し、熊本での上映予定は今の所ないらしい...orz

Nintendo 3DS
 本日より発売。

 今の所、カラーバリエーションは 2 色だけの模様。

02/26
 ...と言えばやっぱり "二・二六事件" の日だろうな。世が世なら...いや、多くを語るまい。


11/02/27

何気に見つけた Delphi のサイト (コンテンツ)
 Delphi 6 辺りっぽいですけど、今でも役に立ちそうです。

 トップページからリンクを辿って Programming in Delphi へ行くのは結構難儀します。"Palettes in Delphi" 等は視覚的に理解できていいですね (中に入ってみて下さい)。DocWiki にも似たようなページがある のはあるのですが、視覚的に解る (/判る) のはコンポーネントアイコンまでというのが残念。


11/02/28

Excel とか Word とか。
 お客さんから掛ってくる電話でムカつくのは、Excel や Word の操作説明を訊かれる事...知らんがな。ウチが納品した PC じゃなくてもお構いなしだからなぁ (ウチが納品した PC でも筋違いだとは思うけど...)。何でも屋じゃないんだよ?納品の締切だってあるんだよ?俺の持ってる時間は無限じゃないんだよ?

 ヘルプ引くのすら面倒だと言うのなら、ダイソーの "ダイソーパソコンブックシリーズ" でも買えばいいのにと思う。下手すりゃ電話代よりも安く済むのに。

フレッツ光、2,800円から NTT東西が新料金
 期待したオイラが馬鹿だった。逆算すると 1GB の通信で上限に達する訳か...Delphi のUpdate 適用済インストール DVD-ISO 落としたら上限だし、Windows 7 SP1 でも上限だな。Youtube とかニコニコ動画で動画見てたら 1GB なんてあっという間なんじゃなかろうか?Windows Update やウィルス対策ソフトの定義ファイルとかは気付かないうちに DL されてしまうので苦情を言うヒトが増えるような?100MB 30円ならともかく 10MB 30円とか全く意味がない...基本料金 0 円での従量課金ならまだ解るけど。東日本は決定事項のようだけど、西日本は未だ未定のようで...プランの設定は今からでも遅くないのでちゃんと考えてねー>西日本。

宗教戦争 (インデント)
 ギクリ。筑木さんの Twitter より。

 Delphi を含む Pascal 使いなら、C で言う所の "BSD/オールマンスタイル" で書くと思う。何でかと言えば、VCL や RTL がこれに倣った "Borland スタイル" だからだ。僕はと言うとサンプルコードでお解りの通り、変則的な "GNU スタイル" で記述している。C / C++ / C# のコードを書く時は "BSD/オールマンスタイル" だ。統一性がないのにはちょっとした訳がある。

 "Borland スタイル" とは簡単に言えば "BSD/オールマンスタイル" の中括弧を begin~end で置き換えたものだ。

procedure Proc(arg: Integer);
begin
  if a = 0 then
  begin
    b := 1;
    c := 2;
  end;
end;

 ところがこれでは読みにくい場面が出てくる。

procedure Proc(arg: Integer);
begin
  if a = 0 then
  begin
    b := 1;
    c := 2;
  end
  else
    d := 3;
  case e of
    1: f := 4;
    2: f := 5;
  else
    f := 6;
  end;
  begin
    h := 9;
  end;
  if a = 0 then
  begin
    b := 1;
    c := 2;
  end
  else
  begin
    d := 3;
  end;
  try
    g := 7;
  finally
    g := 8;
  end;    
end;

 ちょっと意地が悪いがこのような場合だ。C 等に於ける中括弧 {} は Pascal / Delphi に於ける begin と end それぞれを対で置換できるものではないというのがミソだ。もっと端的に言えば、"Pascal / Delphi の end に対応するのは begin だけではない" という事だ。僕が採用しているのは "変則 GNU スタイル" と書いたが文章で説明する前に実際に上のコードを書きなおしてみよう。

procedure Proc(arg: Integer);
begin
  if a = 0 then
    begin
      b := 1;
      c := 2;
    end
  else
    d := 3;
  case e of
    1: f := 4;
    2: f := 5;
  else
    f := 6;
  end;
  begin
    h := 9;
  end;
  if a = 0 then
    begin
      b := 1;
      c := 2;
    end  
  else
    begin
      d := 3;
    end;
  try
    g := 7;
  finally
    g := 8;
  end;    
end;

 "変則 GNU スタイル" では、原則として begin~end ブロックのみをインデントし、ブロック内もインデントする。ここまでは "GNU スタイル" と同じ。何が変則なのか?この原則に厳密に従うのであれば、コードは以下のようになるハズである。

procedure Proc(arg: Integer);
  begin
    if a = 0 then
      begin
        b := 1;
        c := 2;
      end
    else
      d := 3;
    case e of
      1: f := 4;
      2: f := 5;
    else
      f := 6;
    end;
    begin
      h := 9;
    end;
    if a = 0 then
      begin
        b := 1;
        c := 2;
      end  
    else
      begin
        d := 3;
      end;
    try
      g := 7;
    finally
      g := 8;
    end;    
  end;

 Pascal / Delphi では関数/手続きのネストも許されるため、厳密に適用すると余計に読みにくいコードになってしまうので、"関数/手続きブロック以外の begin~end ブロックをインデントする" というルールになっている。ま、これは "K&R スタイル" や "BSD/KNFスタイル" でも関数ブロックで例外があるのでそこまで変則的とは言えないと思う (厳密にやると "Bannerスタイル" になる)。

 自分のスタイルが "GNU スタイル" だと思っている方も、実は "変則 GNU スタイル" だった事に気付くかもしれない。"GNU スタイル" は "関数呼び出しの括弧の前にも空白を置く" のだから。

 さて、僕が C / C++ / C# を "BSD/オールマンスタイル" で書く理由だが、これは他の言語...特に HTML 等のマークアップ言語と同じスタイルで書くためである。HTML で言うと 開始タグと終了タグは同じインデントの深さになるハズであり、タグをブロックと考えると "BSD/オールマンスタイル" となるからだ。

 この宗教戦争の話は "114.改めて Delphi の構造化文" でも触れてある。長年、Pascal / Delphi を触って最終的に落ち着いたのが現在のスタイルなのだが、正直な話をすると "Borland スタイル" に慣れた方が RTL / VCL が読みやすい事には異議がない (^^;A

宗教戦争 (セミコロン)
 最少という意味で最適なセミコロンを付けた Pascal / Delphi のコードは以下のようになる。

procedure Proc(arg: Integer);
begin
  if a = 0 then
    begin
      b := 1;
      c := 2   // 不要
    end
  else
    d := 3;
  case e of
    1: f := 4;
    2: f := 5  // 不要
  else
    f := 6     // 不要
  end;
  begin
    h := 9     // 不要
  end;
  if a = 0 then
    begin
      b := 1;
      c := 2   // 不要
    end  
  else
    begin
      d := 3   // 不要
    end;
  try
    g := 7     // 不要
  finally
    g := 8     // 不要
  end          // 不要
end;

 何故こうなるのかは、"114.改めて Delphi の構造化文" でどうぞ。


 BACK   古いのを読む   新しいのを読む