括弧の名前

プログラミング言語では括弧をよく使います。Javaなら

public static void main(String[] args) {
System.out.println("Hello World");
}

というように( )と{ }と[ ]の3種類を使います。 J2SE5.0ならジェネリックスで< >も使います。
プログラムコードを説明するときには当然この括弧を発音するのですが、どれも区別せずに「カッコ」と読んでしまいがちです。
各括弧の名称は次のとおりです。

( ) 小括弧 or 丸括弧
{ } 中括弧 or 波括弧
[ ] 大括弧 or 角括弧
< > 山括弧

こうしてみると区別しやすい名前になっていると思いますが、中括弧と言われて{ }か[ ]かをすぐに区別できる人は少ないかもしれません。
小学校で括弧の名前は習ったように思いますが、日常で使わないので忘れてしまっています。
せっかく区別できるので、今後は積極的に利用しようと思います。

SQL文を大文字にすると高速という都市伝説

Oracleでは内部的にSQLをすべて大文字で解析するので、SQL文に小文字があると無駄な変換が必要だから、全て大文字にするのが良い」
一度は耳にしたことがあるのではないでしょうか?
Oracleの人に聞いた訳ではないので内部処理の真偽の程(ひょっとしてマニュアルに記述があるのでしょうか)はわかりませんが、この手の話にいつも欠けているのはどの程度パフォーマンスに影響するかという話です。
周りの人でこの発言する人はベンチの結果を持ってきてはくれませんが、「これくらいの長さのSQL文ならいいけど、長いSQLの時は気をつけて」など、如何にも差が明確にあるように初心者に教えています。
この大文字解析説が仮に本当であっても、最近のプログラミングはスペックに対して僅かな負荷を考えるより、保守に優れた可読性の高いコーディングを行う傾向にあります。そうでなければオブジェクト指向といった方法論は無駄が多いと切って捨てられます。
こう言っているだけでは既出の人と変わりませんので、Oracle8iとOracle9iでベンチをとってみました。

SELECT
TO_NUMBER(TO_CHAR(SYSDATE,'DD')),
TO_NUMBER(TO_CHAR(SYSDATE,'DD')),
.
.
.
FROM DUAL;

ある程度の時間が掛からないと差分がわからないので関数(関数の呼出コストは調査できていませんので、これも都市伝説かもしれません)を使っています。実際にはSELECTとFROMの間に数100行同じ記述を書きましたので、約10KB(1万文字程度)のSQL文にしています。現場レベルでもそこそこ長いSQLと言っても良いレベルだと思います。
これを全て小文字、全て大文字で比較します。時間の測定は簡易的ですが

SET TIMING ON

をセッションに設定して行いました。
結果なのですが、どちらも

経過: 00:00:13.26

となりました。どちらもSQLキャッシュのない状態です。どこまで大きなSQLになれば差が出るのかわかりませんが、私としてはこの時点で既に気にするレベルではないと感じます。
特筆すべきは「SQL文の大文字小文字でパフォーマンスが変わる」ことではなく、上記のSQLでも2回目の実行結果は

経過: 00:00:00.02

と大幅に速くなる点です。これはSQLのキャッシュにより構文解析がスキップされるためです。チューニングの解説によくありますが、SQL文の大文字や小文字が区別されたり、PL*SQL上で変数を利用すると駄目だったり注意が必要です。繰り返し実行されるSQLだが動的な生成箇所がある場合はバインド変数を利用して同一(大文字小文字も全く同じ)のSQLを発行する必要がありますが、その効果はかなり期待できるものです。
簡単に出来るからといって、どの程度効果があるかわからないような「おまじない」をプログラムするのは賛成できません。特にそのまま思い込んでしまいがちな初心者に言うのは止した方がよいのではないでしょうか。(根拠が希薄なので初心者相手にしか言わないともとれますが)

Oracleで日本語混じりの日付フォーマット

PL*SQLで日付の文字列を生成する必要があって「YYYY年MM月DD日(DY)」と出力したかったのですが、これが上手くいきません。

select to_char(sysdate, 'YYYY:MM:DD') from dual;

の結果は

2006:01:24

となるので同じ要領で
select to_char(sysdate, ‘YYYY年MM月DD日(DY)’) from dual;
とすると

ORA-01821: date format not recognized

と怒られます。
PHPだと

print date("Y年M月D日");

という書き方が出来るので同じような記述をしたいと思って奮闘していたのですが、オラクル得意の先輩が教えてくれました。正解は

select to_char(sysdate, 'YYYY"年"MM"月"DD"日("DY")"') from dual;

となります。ダブルクウォーテーションで囲うだけです。
文字列結合や型変換、フォーマットや正規表現など、各言語で翻訳しなければならないのでいつも忘れてしまいます。かといって膨大な対応表があっても鬱陶しいような気もしますので、結局覚えなければならないようです。(勿論、よく使うものはWikiなどに整理するのですが)

プログラムには過去形がない

プログラミング言語の主たる動作は次の3つに分類されると云われます。

  1. 順次
  2. 分岐
  3. 繰り返し

順次はプログラムコードを書いた順番に上から下へ実行してゆきます。分岐はif文に代表されるように、条件によって実行するコードを選択します。繰り返しはfor文やwhile文のようにあるブロックを繰り返します。
gotoのような処理をスキップするものもありますが、基本は上の3つを駆使してプログラムを組むことになります。そして、こうした制御フローをもったプログラムは私たちが通常使う言葉に変換して考えることができます。
例えば以下のJavaコードは

if (foo == 0) {
System.out.println("A");
} else {
System.out.println("B");
}

「もし変数fooが0であるならば、”A”を出力し、その他の場合は”B”を出力する」
となります。
プログラムを書くときに単純なものであれば言葉にして考えなくてもコードを直接書くことができますが、複雑になるとよく頭で言葉として整理します。その際に思ったことがあります。それは、プログラムには過去形がないことです。
そもそも実行時にどうすればよいかをコードとして書くので現在形しかなくて当たり前な気もします。ですが、特に分岐は想定された条件を理由にどう振舞うかを記述するので、コーディングの時点では何れのフローを処理するか確定していません。「もし〜」と表現するように未来のことを指しているイメージがあります。繰り返しも「10回繰り返す」であれば現在の定義のように感じますが、「trueになるまで繰り返す」であれば、実行時にtrueになるかどうかわからないので、未来のように感じます。ですが、未来の計画を書いているだけで未来の動作を行う訳ではない以上、結局は現在形のコードしか書くことはできないのだと思います。
只、これは当たり前過ぎる話で、「出力した」というコードはあり得ないように思います。「出力していたら」というコードを書いても「出力した」という過去の情報を現在の変数で保持する必要がありますので、結局過去のコードにはなりません。
そう考えてみると、現実世界でも同じだなと思います。歴史があっても書物であったり記憶であったりが現在保持されているだけで、過去の行動を実行できる人はいません。結局は現在しかないのです。

携帯から投稿

携帯から投稿をしたことがなかったのでやってみています。
携帯だと結構な文字数を入力したつもりでも、きっとPCで確認すると大した事はないのだろうと思います。
もう指が疲れてきましたのでこれにて終了です。

タグリブ後の改行は不要

JSPにロジックを埋め込む場合は

<% String foo = "Foo"; %>

のようになって、タグリブの場合は

<bean:write name="foo" />

のようになりますが、JSPはそれぞれのタグの空間だけがプログラムとみなされるので、行末の改行は通常の出力とみなされレスポンスされます。
この改行の出力によって、タグリブを頻繁に使う場合ではレスポンスの容量を増やしてしまします。具体的な例で言うと

<% for (int i = 0; i < 5; i++) { %>
<%-- print foo --%>
<bean:write name="foo" />
<% } %>

の出力結果は

foo
foo
foo
foo
foo

のようになります。判り難いですが、改行のみならずインデントに使ったTABやスペースも出力されるので、ループが多い場合は無駄な出力が多くなります。特にコメント(<%-- --%>)に対するインデント文字と改行が出力されるのは望ましいとは言えません。
出力を綺麗にしようとすると

<%
for (int i = 0; i < 5; i++) {
// print foo
%><bean:write name="foo" /><%
}
%>

というように改行コードやインデントがJSPタグ内部に納まるようにコーディングする必要があります。ですが、あまり可読性に優れないですし、そもそも見た目にカッコ悪いです。
因みにPHPの場合は閉じタグ後の改行を無視します。

<?php print "foo" ?>
<?php print "foo" ?>
<?php print "foo" ?>

このようなプログラムの出力は純粋に

foofoofoo

となります。
最近のプログラミングの傾向としては、細かいパフォーマンスは気にせず汎用的で理解しやすいコードを書く方が望ましいのですが、無駄なトラフィックが増加するのは避けたいものです。
逆にPHPのような仕様では困るような場面があるのでしょうか。仕様としてはJSPの方が確かに順当だとは思いますが。

ブラインドタッチの指番号

ブラインドタッチでBを何指で押すべきか悩んでいます。通常のポジションだと左手人差し指だと思います。
Nは右手の人差し指が一般的ですが、私は親指で押すことにしています。その方がアクションが少なくて済みます。
左手の親指はスペースキーを押すのに使っていますのでBと併用は少し違和感があります。鍵盤楽器をやっていると何かと指番号が気になってしまうものです。

高橋名人の速度を再現してみる。

高橋名人の速度を視覚的に再現してみました。
https://cloned.jp/tmejin16/
速度は16連射に合わせてコーディングしたつもりですが、JavaScriptのタイマーなどで使うsetTimeoutが小数点を受け付けるか知りませんので、速度の正確性は定かではありません。
GeoCities広告なしのオリジナルソースGeoCitiesは閉鎖することになったので移動しました) を一応貼っておきますので、何かに利用できそうならご自由にどうぞ。(利用の仕方は思いつきませんが)

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-JP">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<style type="text/css">
<!--
* {
font-family:"Georgia","MS Pゴシック",serif;
}
body {
background-color:white;
}
div#counter {
width:50px;
height:25px;
text-align:right;
border-style:solid;
border-width:1px;
color:orange;
background-color:black;
}
td#bar {
width:50px;
border-top-style:solid;
border-top-width:15px;
border-top-color:#A72D21;
}
.side {
width:15px;
}
td#center {
width:20px;
height:26px;
border-bottom-style:solid;
border-bottom-width:5px;
border-bottom-color:black;
text-align:center;
vertical-align:top;
}
input#exec {
border-style:solid;
border-width:1px;
color:white;
background-color:#444;
border-color:black;
}
-->
</style>
<script type="text/javascript">
<!--
var appName = window.navigator.appName.charAt(0);
var meijin = null;
onload = function () {
    meijin = new TakahashiMeijin();
}
function TakahashiMeijin() {
    this.active = false;
    this.finger = false;
    this.icon = "▽";
    this.pushCount = 0;
    this.pushSpeed = 1000 / 2 / 16;
    this.push = function () {
        if (this.active) {
            if (this.finger) {
                this.finger = false;
                this.pushCount++;
            } else {
                this.finger = true;
            }
            return true;
        }
        return false;
    }
}
function main() {
    if (!meijin.push()) {
        return;
    }
    write();
    setTimeout("main()", meijin.pushSpeed);
}
function write() {
    document.getElementById("counter").innerHTML = meijin.pushCount;
    if (meijin.finger) {
        document.getElementById("center").style.verticalAlign = "top";
        document.getElementById("center").style.borderWidth = "5px";
        if (appName == "M") {
            document.getElementById("center").style.height = "26px";
        }
    } else {
        document.getElementById("center").style.verticalAlign = "bottom";
        document.getElementById("center").style.borderWidth = "2px";
        if (appName == "M") {
            document.getElementById("center").style.height = "29px";
        }
    }
}
function run() {
    meijin.active = true;
    document.getElementById("center").innerHTML = meijin.icon;
    document.forms[0].elements[0].value = "Stop";
    document.forms[0].elements[0].onclick = stop;
    main();
}
function stop() {
    meijin.active = false;
    document.getElementById("center").innerHTML = "&nbsp;";
    document.forms[0].elements[0].value = "Start";
    document.forms[0].elements[0].onclick = run;
}
//-->
</script>
<title>高橋名人の速度を再現してみる。</title>
</head>
<body>
<h1>高橋名人の速度を再現してみる。</h1>
<form action="./">
<div id="counter">0</div>
<table cellspacing="0" cellpadding="0" style="margin-top:14px;">
<tr>
<td class="side">&nbsp;</td>
<td id="center">&nbsp;</td>
<td class="side">&nbsp;</td>
</tr>
<tr>
<td id="bar" colspan="3">&nbsp;</td>
</tr>
</table>
<div>
<input id="exec" type="button" value="Start" onclick="run();" style="width:50px;">
</div>
<div style="margin-top:20px">
<a href="https://blog.cloned.jp/">作者</a>
</div>
</form>
</body>
</html>