1ヶ月ごとに絵や写真のあるカレンダーがとても好きで、例えば昨日は1月のカレンダーをめくって2月になると新しい写真が出現して少し見入ってしまします。
毎回、ランダムで違うものを表示するということはプログラムでは簡単ですし、Webサイトではバナーなどでよくあります。ブログのテンプレートも日替わりや月代わりでランダム表示できるといいかなと思いました。
毎日表示の変わるものはランダムもいいですが、自分で作れると楽しそうです。例えば、日記を毎日つけて一年後からは「今日は○○の日」という表示を過去の自分の登録から表示するものとか。10年くらい日記をつけていれば、過去10年の中からランダムで1つ表示され、「あれは3年前の今日だったのか」などと感慨に耽ることができそうです。
実装は簡単だと思いますが、永い目をもって登録し続けられるかが難しいところですが。
萌香
萌え指向プログラミング言語「萌香」
この言語はすごいです。先日、括弧について書きましたが、「」が出現します。時間があれば覚えたいと思います。
括弧の名前
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つに分類されると云われます。
- 順次
- 分岐
- 繰り返し
順次はプログラムコードを書いた順番に上から下へ実行してゆきます。分岐は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になるかどうかわからないので、未来のように感じます。ですが、未来の計画を書いているだけで未来の動作を行う訳ではない以上、結局は現在形のコードしか書くことはできないのだと思います。
只、これは当たり前過ぎる話で、「出力した」というコードはあり得ないように思います。「出力していたら」というコードを書いても「出力した」という過去の情報を現在の変数で保持する必要がありますので、結局過去のコードにはなりません。
そう考えてみると、現実世界でも同じだなと思います。歴史があっても書物であったり記憶であったりが現在保持されているだけで、過去の行動を実行できる人はいません。結局は現在しかないのです。
タスクマネージャを起動するショートカット
Esc + Shift + Ctrl でタスクマネージャを起動できます。あまり知られていないようです。
あと、Win + L でロックをかける人も少ないですね。Ctrl + Alt + Del からロックする人がほとんど。
きっとまだまだ知らないショートカットはあると思います。
携帯から投稿
携帯から投稿をしたことがなかったのでやってみています。
携帯だと結構な文字数を入力したつもりでも、きっと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と併用は少し違和感があります。鍵盤楽器をやっていると何かと指番号が気になってしまうものです。