hiromasa.zone : o)

2007/3/11 Sunday 投稿時の月齢:22.2  月名:弓張月(下弦)  潮汐:小潮 Moon:22.2[弓張月(下弦)]今日の心技体 : 好調期好調期好調期

ハッピーバースデー! このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 晴のち雪 ひろまさ @ 21:56

WP 使っている人はなぜか、11 日生まれがおおい? ということで、今日は自分の誕生日でした。

10台も今日で終わり。 0x20 歳? &h20 歳? ついに 16 進数で成人してしまいました。。

昨日 10 日は事務所で 23 時すぎまでお仕事。 「おなかをすかせておいてください」と同僚の方が、謎のメッセージをくれ、なにかあるのかな、、と思っていたら、仕事帰りにカウントダウンお誕生会をひらいてくれました(笑)

スパークリング

何か行くお店お店で、スパークリングワインあけてくれてとても楽しかったです。 ありがとうございました。

今日の夜ご飯はちらし寿司。

ちらし

ケーキ。

けーき

おなかいっぱい、満足じゃ。

2007/3/9 Friday 投稿時の月齢:19.3  月名:更待月  潮汐:中潮 Moon:19.3[更待月]今日の心技体 : 好調期好調期好調期

すいません、すいません このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 晴時々雪(2/-5) ひろまさ @ 0:50

ただいま若干(!?)仕事に追われております。

せっかく PHP のコードにトラックバックいただいた、よしともさんnaokiさんごめんなさい。。

if と 変数だけしばりの3個ソートのソースコードで、とても楽しくすぐにでも取り上げさせていただきたいのですが、時間が・・・。 せっかくなのでじっくり書きたいと思っています。 ややお待ちいただければと思います。

今日は健康診断の結果がきていました。

ガンマGTP値一桁だった!

ぼく唯一の健康自慢。 たぶん。。 :-) そして不健康な生活はあと1ヶ月確定で続きます… がんばろう。。

2007/3/5 Monday 投稿時の月齢:15.4  月名:満月  潮汐:大潮 Moon:15.4[満月]今日の心技体 : 好調期好調前不安定期低調期

PHP で遊ぼう(6) – if と 変数と このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 雨時々雪(8/1) ひろまさ @ 3:31

毎回蛇足の多い、~遊ぼうシリーズ。 おじさんになると、こうなんというか昔話を若い者にしたくなるもんですが、コンピュータの世界ではぼくも中年?。 まぁまぁ、古き良き昔話にもお付き合いください。 コンピュータ同世代の方は、なつかし~と思って読んでいただけたら幸いです。 🙂

プログラム言語というのは物事の処理の手順をきわめて紛れなく記述できる、人間のための言語です。 一般的にはコンピュータに指示させるための言語として位置づけられていますが、究極的には人間のためにもなるもんです。なんて、まぁいまのプログラム言語は純粋な手順以外にも余計なことを書かなければいけないので、これは極論です。ぼくはそうなることを期待しているのですが…。

では前置きはともかく。

たとえば、日常生活で数字を順番に並べ替えるなんてことはトランプとか麻雀しているとよくやることですが、みなさん実際にやるとするとどーやっていますか?

8, 4, 2, 6, 3, 1, 5, 7

このように並んだカードを小さい順番に並べ替える方法。 意外と無意識でやっちゃいますが、ぼくは一番小さい数字を探して左にもっていき、いま一番左のカードといれかえる、その後の左においたものは最小数字の検索対象から外す、という方法を基本的にはとるようです。

コンピュータの世界では並べ替えをソートといい、上のような方法を逐次選択方といいます。 たしか。。

じゃーこの手順を箇条書きで日本語で書いてみましょう。

  1. 対象のカードから一番小さいものを探す。 初回の対象は全カード
  2. 見つけたらそのカードを一番左にもってきて、現在の対象の一番左のカードと入れ替える。
  3. 1. に戻る

プログラミングというのは、こういった手順をプログラム言語に直すことです。別にコンピュータにやらせるからといって特殊なことはありません。 ほとんどの場合、一般的な常識(人間の思考の流れ)をそのまま記述するだけです。

しかしながら、コンピュータは日本語では分からないのです。 なぜならば言葉の定義に紛れがあるから。「対象のカード」「小さいもの」全てをうそなく教えてあげる必要があります。

そのために使われるのが、変数とか制御構文とかそういった言語に備わった機能になります。

で、事前にひとつ謝ることが。 WordPress のプラグインを次の回で取り上げようと思っていたのですが、もう一回先に回させてください。 お気づきの通り、このペースで書いているとものすごい一回が長くなりそうなので、、ご勘弁を。。

さてさて、上でやったようなカードの並べ替え、今回はこれを変数と if でやってみたいと思います。 まずは話を簡単にするために、カードは2枚であるとしましょう。

8, 4

こういったカードが机に並べてあることを想像してください。 そして、これが数字の小さい順番に左から並べば完成です。

プログラム言語の世界では、情報を変数という入れ物にいれて管理します。変数には分かりやすいような”名前”をつけることができ、これを変数名といいます。

PHP ではこの変数名は頭に”$” をつける決まりとなっていて、たとえば2枚のカードの左側においてあるものを left 、右側を rigth とすると、上のカードの並びは以下のように表すことができます。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.  ?>

左には8が、右には 4 が置いてあります。

変数名に続けて = を書くことで右辺の値を “代入” することができます。 また、右辺には数字だけでなく様々なものが書けるのですが、ここに変数名を書くこともできます。

たとえば、

  1.  <?php
  2.      $hoge = 10;
  3.      $hogehoge = $hoge;
  4.  ?>

こうすると、$hogehoge は $hoge の値が代入されて 10 になります。前回までの解説の通り、プログラムは上から順に実行されます。

また、右辺で四則演算等もできますので、

  1.  <?php
  2.      $hoge = 10;
  3.      $hogehoge = $hoge + 1;
  4.  ?>

とすると、$hogehoge は 11 になります。

昔高校生のとき、プログラム言語を知らない友達がぼくの印刷したソースをながめていて、「この式はおかしい」といったことがありました。 結構目から鱗だったのですが以下のようなコードでした。

  1.  <?php
  2.      $hoge = 10;
  3.      $hoge = $hoge + 1;
  4.  ?>

プログラム言語に慣れちゃっているとまったく違和感がないのですが、数学的な”等価”式としてみると確かにおかしいです。 $hoge = $hoge + 1 ですからこの式は解けません。 🙂

多くのプログラム言語において、 = は代入のみを表します。 なのでこのように自分自身を右辺に書くことができます。 この場合、自分自身 $hoge の 10 に対して 1 を足した 11 が $hoge にはいります。 右辺から順に評価されるわけです。

変数には他にも文字などいろいろなものが入るのですが、今回はここまで。 まずは、コンピュータ言語で何かを処理するには、必ずデータを変数に格納する必要があるという感覚を身につけます。 逆に言えば、処理できる形にデータを格納できてしまえば半分はプログラムが完成したと言っても過言ではないでしょう。

今回は変数に対してカードの”位置”を割り当てています。左($left)が8のカードで、右($right)が4のカードです。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.  ?>

変数と言うだけあって、変わる数。 本来ならば、左の数と右の数は画面からの入力によってその値を変えたりします。でも、まだその方法までたどり着いていませんので、ここを変えたいときは手作業でソースを修正することにしましょう。 🙂

やりたいことは、左と右を比べて小さい順に並べ替えることです。

ここで登場するのが、if という制御構文です。 これは比較演算を行いその結果に伴って”処理の流れ”を変えることができます。 書き方は以下のようになります。

  1.  <?php
  2.      if(比較演算) {
  3.          やりたいこと1;
  4.          やりたいこと2;
  5.          ...;
  6.      }
  7.  ?>

比較演算というのは、今回まさにやりたい値の大小判定やイコールの判定などが書けます。そして、その条件に”合致”していた場合は、if の後の { 中括弧から } までの間を実行します。 そうでなたっか場合はその中は実行されず、 } の下におちます。 いままでは上から下に順に実行されていましたが、その内容をスキップできるようなイメージです。

じゃー、今回の2枚のカードの左からの小さい順番での並べかえは以下のようにできそうです。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.      if($left > $right) {
  5.          $left$right の内容をいれかえる;
  6.      }
  7.  ?>

もし(if)、左のカードのほうが大きかったら右と入れ替える、デス。

比較演算には数学と同じように、<、>、 <=、 >=、などが使えます。

一点注意するのは今回は使いませんが、イコールの判定です。 先ほど上で出てきたように、PHP において = は代入です。 等価の意味ではありません。 等価を表すには == とイコールを重ねて書きます。 これはよく間違うところですので、十分気をつけてください。 とりあえず、最初は if の中は == って覚えておきましょう。

実はたとえば他言語、Visual Basic などでは = は等価として使えたりします。 ちゃんぽんで言語やっている人も要注意です。(←恥ずかしいことに先日間違った

さあ、あとは「$left と $right の内容をいれかえる;」という処理を PHP で書けば完成です。実はぼくが書くまでもなく、ここまでの知識で変数の入れ替えの処理は書くことができます。どうするでしょう? なんて。:-)

難しいことではないです、一般的に考えるだけで十分です。 二つのグラスの異なるジュースの入れ替え、みたいなもんです。 ですね、もーいっこグラス(変数)を使えば良いわけです。 え、空中で入れ替えるって? 大道芸はコンピュータには無理です。 😛

$left と $right 変数の入れ替えの処理だけ書いてみましょう。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.      //入れ替え
  5.      $temp = $left;
  6.      $left = $right;
  7.      $right = $temp;
  8.  ?>

$temp という変数を新設して、$left を保持させておいて $right で $left を上書きします。 保持しておいた $temp($left) の値を $right にいれればいれかえ完成です。

ジュースをグラスから移すのと違って、= で代入しても元の値はそのままだということに注意してください。変数間のやりとりはあくまで代入、コピーとなります。 移動ではありません。

じゃー先ほどの if と組み合わせてみましょう。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.      if($left > $right) {
  5.          //左のほうが数字が大きかったら入れ替え
  6.          $temp = $left;
  7.          $left = $right;
  8.          $right = $temp;
  9.      }
  10.  ?>

完成! って、これだけでは動かしても画面出ませんね。 じゃー最後に仕上げに 結果を HTML で出力させてみましょう。

  1.  <?php
  2.      $left = 8;
  3.      $right = 4;
  4.      if($left > $right) {
  5.          //左のほうが数字が大きかったら入れ替え
  6.          $temp = $left;
  7.          $left = $right;
  8.          $right = $temp;
  9.      }
  10.  ?>
  11.  <html>
  12.  <body>
  13.  <p>左が<?php echo $left;?>で、右が<?php echo $right;?> です。</p>
  14.  </body>
  15.  </html>

前回出てきた、画面に表示を行う echo ですが、変数の表示も行うことができます。上で処理された $left、$right の値を下の HTML で表示してみました。

左が4で、右が8 です。

うまく入れ替わってくれたようです。 $left、$right の数字を変更して遊んでみましょう。マイナスの数字とかでもうまくいくハズです。

さてさて、以上で今企画している WordPress プラグインを作る知識はお伝えできたはずなのですが、実は if や変数には多くの機能があります。

たとえば、if の条件の中に and や or の複合条件を書けたり、if 後に else や else if といった構文を書くと条件以外の時の処理を書けたり、if の中括弧 { の中にさらに if を入れるなどの技もあります。

if の構文で言えば以下のようになります。

  1.  <?php
  2.      if(条件1) {
  3.          条件1にあったときやること1;
  4.          if(条件2) {
  5.              条件2にあったときやること1;
  6.              条件2にあったときやること2;
  7.          } else if(条件3) {
  8.              条件2じゃなく条件3にあったときやること;
  9.          }
  10.          条件1にあったときやること2;
  11.      } else {
  12.          条件1じゃなかったときやること;
  13.      }
  14.      必ずやること;
  15.  ?>

よーくみれば、必ず分かると思います。

では今回の例題カードならべかえの3枚版を。 $center が真ん中です。 😛

  1.  <?php
  2.      $left = 8;
  3.      $center = 2;
  4.      $right = 4;
  5.     
  6.      並べ替えの処理;
  7.     
  8.  ?>
  9.  <html>
  10.  <body>
  11.  <p>左が<?php echo $left;?>で、真ん中が<?php echo $center;?>で、右が<?php echo $right;?> です。</p>
  12.  </body>
  13.  </html>

ぜひぜひ挑戦してみてください。これがうまくできたときの爽快感を味わったらもう後には戻れません。プログラミングの世界にようこそ。 :-P できたらトラックバックくれたりすると嬉しかったり。 変態コードもお待ちしております(笑)

さぁぱっとみ3枚でも大変そうなのに、これが4枚になったらと思うとゾっとしませんか? 10枚になったら? 変数名考えるだけでもいやになります(笑)

実は変数にはこういった同種類のデータを同じように扱える、配列という機能があります。 これとループと呼ばれる技と組み合わせると、データがいくつあっても同様に処理できるようになります。

でも便利なものは後から。それでこそ使い道が身につくというものです。最近はソートすら関数一発だからねぇ。。

とおじさんの戯言が始まったところで、また次回。

2007/3/4 Sunday 投稿時の月齢:14.3  月名:十五夜  潮汐:大潮 Moon:14.3[十五夜]今日の心技体 : 好調期好調前不安定期低調期

借りるのに試験が必要なレンタルサーバ このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 曇時々晴(4/0) ひろまさ @ 0:34

海外の無料レンタルサーバに MyJavaServer というのがあります。 たしか昔は MyCgiServer って名前でした。

特に意味はなかったのですが、そういやサーバサイド Java が動くレンタルサーバってあんまないよな、と思って久しぶりに見てみたのです。

実はこのサーバ、以前から借りるときにとある問題を解かないとサインアップできなかったのですが、

うぉ、問題が変わっている!

このサーバの趣旨は Java の開発者用途なので、前も Java にまつわる問題だったのですが、まぁちょっとやってればすぐ分かるものでした。

MyJavaServer

MyJavaServer provides a development environment for Java web applications.

An open environment like MJS is a target of malicious users who abuse our services for illegal or simply inappropriate activities.
In order to minimize abuse and yet provide our services to all interested Java developers for free, we require you to demonstrate your Java skills. The challenge is easy to master but does require some knowledge of the Java programming language.

今回みてみたら、いつから変わったのか難易度アップ。 しかも、出題の仕組みが面白い。

  • 問題はあるメソッドに入力を与えたときに、正しい出力がでるかどうかを試される。
  • テキストボックスに Java のソースコードをかくとサーバサイドでコンパイルされる。
  • コンパイルされたコードに、自動的にテストケースが渡され全て正しい値が帰れば正解!。

問題の内容的には、ある URL が渡されたときにどのクラスを呼ぶのかを決定するようなメソッドをつくるものです。 URL の最長一致で決定するのがキモでしょうか。 そう、答えはさまざま。 一種類ではないのです。

疲れているんですよ、、仕事で一日中コードみてたわけですよ。。

でもやってしまうぼく。。

ちょこちょこやって、提出! がーん、fail した。 あ、条件にあたらなかったとき空ストリングかえしてた。 ”miw1SQ” を返すのか。 ちょいとなおして、

きたー!

与えられるテストケースが隠されているところが面白いところですね。 🙂

最長一致ということで、ぼくは引数をオブジェクトに詰め直して、ソートした上でパターンマッチングする方法をとりました。 まぁこんなことしなくても、順次みて一番一致長が長いのをとれば簡単にできるかな。

コードが書きたくてたまらない方、Java の勉強をはじめた方、あるいはなにか憂鬱な方(!?)は遊んでみるといいかもしれません。 🙂

2007/2/25 Sunday 投稿時の月齢:8.0  月名:九日月  潮汐:小潮 Moon:8.0[九日月]今日の心技体 : 低調期低調期低調期

PHP で遊ぼう(5) – PHPの書き方 – このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 晴れ ひろまさ @ 17:53

何から伝えれば、いいのか。 というわけでめでたく5回目。 🙂

プログラム言語といえども、それは人間が使う言語のひとつ。 しゃべれるようになるには、まずはいくつかの基本を押さえる必要があります。 プログラム言語に備わる機能は全て目的があって実装されているものですが、何に使うのかを説明する前に、いくつかは動作だけを先にお伝えする必要があります。 なぜなら、そうじゃないとサンプルが実行できないから。 ちょっとジレンマですが、少々ご辛抱ください。 🙂

目的がないとプログラム言語なんちゅーものは使わないものです。 というわけで、まずは目標をひとつ!。

ここのブログを読んでくださっている方は WordPress を使われている方が多いので、次の次の回で WP のプラグインをひとつつくることにします。 使うのは変数と if 構文といくつかの組み込み関数。 まじですか、と思う方もいるかもしれませんが、プログラムは単純な動作しかしなくても、ブログのようにたくさんの入力データがあると、実はそれだけでもプログラムは面白いものに変わります。 お楽しみに…。 (endunham さん、naoki さんコメントありがとうございました!)

さて前回は、PHP はファイルの先頭から順に実行が始まって、ファイルの終端もしくは明示的な構文の指定で、プログラムが終わるという説明でした。 いろいろすっとばして言うと、拡張子 .php のテキストファイルを適切に設定された Web サーバ上におき、そのファイルにブラウザからアクセスするとテキストファイルに書かれた PHP が動作し最後まで行くと終了します。

この辺が、Apache とか mod_php とか CGI とかその手の世界の話になりますが、まぁとりあえずインフラのお話はおいおいと。 どうせ、画面からのユーザ操作受けのところでいやというほどでてきます。

プログラム言語の世界では、とりあえずまずは hello world というプログラムを書くのが習わしになっています。 hello world って画面にだすだけのプログラムなんですが、この慣習の奥底には、画面さえでちゃえば、あとはなんとなかるぜというハッカー的な要素が潜んでいます。

たとえば、Java (Script じゃないよ)なんかだと、

  1.  public class HelloWorld {
  2.      static final String HELLOWORLD = "Hello World.";
  3.      HelloWorld() {
  4.          System.out.println(HELLOWORLD);
  5.      }
  6.      static public void main(String args[]) {
  7.          new HelloWorld();
  8.      }
  9.  }

こんなかんじかなー。 いや、もっとやれば getHello() とかつくるべきなんだろうけど、まぁまぁとどのつまり非常に複雑です。 Java などのオブジェクト指向プログラムとよばれる言語はこのようにとっかかりが非常に悪いのです。 この hello world が1行ずつ正しく説明できたらほぼ言語仕様が分かっていることになります。(System オブジェクトの PrintStream 型の out スタティックフィールドの println メソッドを呼ぶ、、とか冷静に考えるとここだけでも高度ですよね)

じゃー、PHP で画面に hello world とだすのは非常に簡単で、

  1.  <?php
  2.      echo "Hello World.";
  3.  ?>

となります。 これならなんとなくぱっとみすぐ分かります。 このようにスクリプト系言語は非常にとっつきやすいようにできています。

ではひとつずつこのプログラムの要素を見ていきます。 <?php、?>、echo が目立ちますが実は重要なのは「;」と改行とスペース・タブです。

PHP は <?php から ?> でくくられた部分をプログラムとして認識し評価実行します。 それ以外の場合は、”そのまま出力”します。 ここは後述。 echo というのは後ろに指定された文字等をこれまた画面に出力します。

では、「;」はなにかというと PHP にそれが1文であるということを知らせるものです。 二つ画面に hello world を出力する場合は、

  1.  <?php
  2.      echo "Hello World.";
  3.      echo "Hello World.";
  4.  ?>

となります。 文の区切りとしては改行は特に意味を持ちません。 あくまで文は ; で区切ります。 改行は人間がみやすいように挿入するだけですので、次のようにしてもまったく問題ありません。

  1.  <?php echo "Hello World."; echo "Hello World."; ?>

スペース・タブに関しては何文字いれても PHP は1区切りとなります。 逆に言うと次はだめです。 エラーになります。(たぶん)

  1.  <?phpecho "Hello World."; echo "Hello World."; ?>

<?php と echo がくっついちゃっているので解析できないわけです。 次は OK です。

  1.  <?php      echo "Hello World."; echo "Hello World."; ?>

この辺は人の書き方の癖になりますね。 ちなみに複数人の大規模開発なのではコーディングスタイルといった文書でこれらを統一するようにしたりします。

さてさて、この hello world を helloworld.php とかってして Web サーバに置いてアクセスするとブラウザ上にはめでたく Hello World と出力されるわけですが、実はこの Hello World は真実ではありません。

なぜならばブラウザは HTML を表示するもの。 そして基本的に PHP は HTML を送るようにデフォルトで設定されていますので、内部的にブラウザに HTML をおくるよーといいつつ、<html> タグすらない うそ HTML を送っていることになります。

タグを全部ふくめて、echo してもいいわけなんですが、PHP は上で書いたように <?php ~ ?> でくくられていないものはそのまんま出力するという機能があります。 これを使えば、

  1.  <html>
  2.  <body>
  3.  <p><?php echo "Hello World1."; ?></p>
  4.  <p><?php echo "Hello World2."; ?></p>
  5.  </body>
  6.  </html>

とすることができます。 <?php ~ ?> 部分が PHP の echo による出力とおきかえられるイメージです。 これが真の Web/PHP の Hello World かもしれません。 出力された画面を、ブラウザのソース表示で確認すると分かりやすいでしょう。

…でお気づきの通り、

  1.  <html>
  2.  <body>
  3.  <p>Hello World1.</p>
  4.  <p>Hello World2.</p>
  5.  </body>
  6.  </html>

という hellowordl.php でもまったく同じ結果を得ることができます。。

これでは PHP 使わなくてもいーじゃんって話ですが、その通りで echo は固定で文字をだしている文にはその実装された目的を達成することができません。 echo はプログラムで処理した結果を出力するもので、実行によって値が変わる場合にその真意を発揮します。

というわけで、やっぱりとっかかりはツマランですね。(笑) でも PHP の場合これでおしまいです。 次は変数と if を使って遊んでみましょう。 ちょっとは面白いかもしれません。 🙂

VB Script とエラーハンドリング このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 晴時々曇(2/-6) ひろまさ @ 4:34

ちょっと訳ありで VB Script でバッチ処理を書くことになり、いろいろ試行錯誤しました。 もう5年も前に一度扱ったことがあるのですが、正直もう VB 系は覚えていない…。

VB Script というのは、Windows で標準的に使えるスクリプト言語です。 IE の上でも使えますが、Windows に実装されている、WSH (Windows Scriptiog Host) 上でも使えます。 とどのつまり、昔からある .bat ファイルの強化版のようなイメージ。 ためしに、Windows 上で拡張子 .vbs の空ファイルをつくるとアイコンが変わり、そのままダブルクリックでスクリプトファイルが実行できるのが分かります。 🙂

@IT:運用 Windows管理者のためのWindows Script Host入門 第1回 WSHの内部構造 1.Windows管理にWSHを活用しよう

このバッチに代わるものとして、Windows環境ではWindows Script Host(以下WSH)と呼ばれる機能が提供されている。これはWindowsが標準でサポートするスクリプト環境で、テキスト・ベースのスクリプトを記述することで、GUIに頼ることなく、Windows環境でさまざまな処理を実行できる。

これつかうと、簡単に exe を起動したり、ものによってはアプリを自動コントロールできたり、結構個人で使うぶんには便利です。 Skype なんかも COM 対応なので WSH から動かせるみたいですね。 ムードメッセージ変更したりなんかが、UI使わなくてもできるようです。

さて、”バッチ処理” というのは(Windows のバッチではなく一般的な意味)、一括処理系の総称で、反対の言葉はリアルタイム処理となるでしょう。 たとえば、日中帯リアルタイムで入力されたデータを、システム終了後 “バッチ処理” で集計する、といった使い方になります。 1日の売り上げの集計(締め処理)などがこれにあたります。

でもって、VB Script でバッチ処理を書こう、というのが今回の課題になっていました。 VB Script が指定されるというくらいなので、それほど難しいバッチではないのですが、一応業務システム。 落とすわけにはいきません。

とりあえずちょこちょこ書きはじめてみたのですが、ひとつの壁に当たりました。

エラーハンドリングどーやるんだ?

プログラムにエラーはつきものですが、そのエラーには大きく2つあります。 正常系異常と異常系異常。 なんのことやらですが、文字通りで前者は、動き的にエラーが想定されていて、それが分かった場合にはしかるべき処理をするというのが正常系異常。 異常系異常は、単純にプログラムのバグによっておちることです。 後者は当然リリース時には修正されるものです。

ここでの問題は、正常系異常。 これはスクリプト言語系全般にいえるのですが、組み込み関数などが簡単に異常で落ちます。 まぁ落ちるのはいいとして、それを検知(エラーハンドリング)するのがあまりスマートなほうほうがとれない。

もちろん、プログラム続行不能な場合は落ちるしかないのですが、業務系のシステムでは落ちたことを適切に(正常に)ログに出力するなどして通知したり、そこまでの処理データを処理前にロールバックする必要があります。 これが正常系異常処理です。

以下、かなり前後を省略していますが VB Script で”ファイルを消す”処理です。(そらで書いているので間違っているかも。 イメージだけ)

objFS.Delete("hoge.txt")

こうやると、hoge.txt が消えてくれます。 hoge.txt が存在している場合は正常系。 じゃー、hoge,txt が存在しないこともあるとするとどうなるのかというと、このコードはここの部分でエラーで”落ち”ます。 スクリプトが停止してしまうので、失敗したことの通知すらできません。 なんたってバッチです、画面なんかでません。(画面にでただけでもだめだけど…) これじゃー困っちゃうのです。 🙂

というわけで、ちょっと小細工します。

If onjFS.FileExists("hoge.txt") Then
  objFS.Delete("hoge.txt")
Else
  log "hoge,txt が消せませんでした。"
  WScript.Quit 1
End If

ってなかんじで、ファイルが存在しているときだけ消すようにすると、まぁファイルなくてもおちなくなります。

でもね、気になりませんか? 存在確認をした直後、瞬間に、ファイルが消える可能性があります。 いや、100% に近い確率でありえませんが、それでも可能性はあります。 WP で起きても笑うだけですが、たとえば、これが原発とか病院のシステムだったらと思うと夜も眠れません。(←そんなもんつくったら寝るな!

というのは冗談ですが、ファイルが読み取り属性だったり、もちろん直後に消えることも少しは考えられますし、Delete がおちる可能性はまだまだあります。

Java や C# などのいわゆる高級言語では例外処理という考え方があり、なにかが落ちたらこの処理をはしらせろといった記述ができます。 また、それぞれのメソッドで何が起きる可能性があるかということも言語仕様として非常に明確です。

ちなみに、PHP も 5 から例外処理が構文的には書けるようになっていますが、組み込みの関数はごく一部しか例外を throw してくれないので、組み込み関数の場合はその戻り値をみて自前で例外をなげるしかないようです。 とりあえず PHP の場合あまり処理ごと落ちる関数がないので、これである程度なんとかはなりそうです。

というわけで、VB Script。 くさっても Visual Basic ゆずりということで例外処理くらいかけるだろーと思ってしらべたらでてきました。

On Error Resume Next
On Error Goto 0

…この Resume Next 構文より下はエラーが”なかった”ことになるらしい。 で、Err オブジェクトでエラー番号調べて処理しろと。。 Goto 0 はその解除ですか。 orz

On Error Resume Next
If onjFS.FileExists("hoge.txt") Then
  objFS.Delete("hoge.txt")
Else
  log "hoge,txt が存在しませんでした。"
  WScript.Quit 1
End If
If Err.Number <> 0 Then
  log "hoge,txt がなぜか消せませんでした。" & Err.Number
  WScript.Quit 1
End If
On Error Goto 0

そりゃないぜ、って感じですが VB だと使えた On Error Goto ラベル ってのが使えないのでこうするしかないようです。

であと、みため美しくないのもあるのですが、エラーを全部無かったことにしてくれるので、異常系異常すら素通ししてしまいます。 つまりスペルミスなどの構文エラーなどもなかったことになるのです。 これがコーディング中には非常に強敵。 そんなわけで、

If SCRIPT_DEBUG = False Then
  On Error Resume Next
End If

なんてしておくと便利かと思いました。

今回は処理も簡単な 1000 step 程度のもので、複数人でひとつつくっているわけでもなかったので、なんとなかりましたが、やはりあまり大規模なものには向いていないという感想を持ちました。

とりあえず本気(?)で使う場合は、よく落ちるメソッドがたくさんありますので、正常系だけでなく異常系もよくよく試験してから運用に回すことをお勧めします。 😛

2007/2/21 Wednesday 投稿時の月齢:3.8  月名:黄昏月  潮汐:中潮 Moon:3.8[黄昏月]今日の心技体 : 低調期低調期好調期

備えあれば、公式ドキュメント このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 曇時々雪 ひろまさ @ 11:37

プロがプログラム言語を使う上で一番必要なのは、なにはなくても公式ドキュメント。 たまに、現場でいきなり Google でインターネット全検索しだす新人君がいますが、みるとこ間違っていますよ。。 考え方を調べるのと、使い方を調べるのは違うもの。 考え方が必要なのはお勉強中のときです。 🙂

てなわけで、公式ドキュメント/日本語訳のありかをまとめてみます。

まずは公式 PHP マニュアル。 

PHP: PHP マニュアル – Manual

ECMAScript (JavaScript) 日本語訳。 助かります。

Under Translation of ECMA-262 3rd Edition

W3C – XHTML /CSS 1.0 日本語訳。 どら猫本舗さん。

ウェブ制作 – どら猫本舗

W3C – DOM1 日本語訳。 どら猫本舗さん。

DOM1仕様書

Mozilla の JavaScript 実装。 その他もあります。

mozilla developer center

Microsoft の JavaScript の実装と VBS とか WSH とか。

Windows Script

Sun Microsystems Java Development Kit。

JDKTM 5.0 ドキュメント

ファイルダウンロードできるものはしておくと安全ですね。 メモリスティックで持ち歩くのもありでしょう。 🙂

あ、セキュリティでメモリスティックさせませんか? うちもです。(笑)

あと、あんまり関係ありませんが SOHO などでインターネットに依存してお仕事されている方は、携帯電話用の通信ケーブルがあるとプロバイダダウンなどの事態に備えられます。

ドコモの FOMA なら、

FOMA USB接続ケーブル | 製品 | NTTドコモ

たしか、2千円しないと思いました。 接続先は、

mopera|サポートメニュー|アクセスポイント一覧

です。 特別な契約などは不要です。 通信料は安くはありませんが、メインプロバイダがダウンする確率を考えれば、緊急回線で2回線プロバイダ契約するよりずっとリーズナブルかと思います。

備えあれば憂いなし。 😛

2007/2/20 Tuesday 投稿時の月齢:3.2  月名:黄昏月  潮汐:中潮 Moon:3.2[黄昏月]今日の心技体 : 低調期低調期好調期

ぼくもおっこってました。 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 曇時々晴 ひろまさ @ 22:43

え、あーあーあー。 テスト。 テスト。

すいません、若干忙しく更新が滞っております。 コメント返信、遅れまして申し訳ないです。 オフラインが続いておりますが、生きていますのでご心配なくデス。 携帯にメールくださったかた、ありがとうございました。 🙂

お詫びに(?)、小ねたを。

プログラム言語で愛を語る方法。

この愛が続く限り。 by Java

while(this.ai);

新しい愛をぼくと一緒にはぐくまないか。 by Java

love = new Love(new Hiromasa());

君のすべてが知りたい。 by SQL

select * from kimi;

僕色でそまれ。 by PHP

$kimi = str_replace("boy", "hiromasa", $kimi);

こわ!!

猫のトイレ。 by UNIX

cat nuko | wc

関係ない。。。 ← 前の会社の先輩のネタでした。

以上、お後がよろしいようで…。:evil:

2007/2/13 Tuesday 投稿時の月齢:25.7  月名:二十六夜  潮汐:若潮 Moon:25.7[二十六夜]今日の心技体 : 低調前不安定期好調期好調前不安定期

サーバおっこってました。 このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 雪のち晴 ひろまさ @ 20:21

またまた、MySQL くんがご機嫌をそこねたようで数日サイトがとまっておりました。 アクセスしてくださったかた、ごめんなさい。。

結構ここのところ頻繁に出ているのですが、

Host is blocked because of many connection errors. Unblock with ‘mysqladmin flush-hosts’

ということで、ここの Web サーバからの接続が、使っている MySQL に拒否されてしまいます。(MySQL は正常に動いている) なんでかってーと、

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: A.2.5 Host ‘…’ is blocked エラー

これは、mysqld が ‘hostname’ ホストから多くの接続エラー(max_connect_errors)を受けた場合に発生します。max_connect_errors 大量発生後、mysqld は何か問題(クラッカーからの攻撃など)が発生したと判断し、このホストからの接続を拒否するようにします。これを解除するには、mysqladmin flush-hosts コマンドを実行します。

ということで、原因はおそらくですがこの Web サーバが DoS をうけているとかそんなところだと思います。 MySQL が自衛しているわけですね。(ログをみるとうちではなさそう)

共有サーバなのでしかたないところですが、またおちてたら、そのうち復活しますので(メールして手動でサーバ管理者の方に接続を flash してもらっているのです)ややお待ちいただければと思います!。

そういえば、WordPress が PHP5 標準で使える組み込みデータベースSQlite データベースもサポートするというチケットがあったのですが…

SQLite support for wp2.0

02/04/07 21:50:13 milestone deleted.

消えちゃった? 🙁

2007/2/4 Sunday 投稿時の月齢:16.4  月名:立待月  潮汐:大潮 Moon:16.4[立待月]今日の心技体 : 好調期好調期低調期

JavaScript のお勉強.. このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加

日記 - 雪時々曇 ひろまさ @ 14:44

AJAX 以降脚光を浴びてしまった JavaScript ですが、ぼくはこれが大の苦手です… 基本的にバックエンドのプログラムが好きなので…。 Web やっている人でも結構そういう人は多いのではないかと思います。

境界を越える: JavaScript の言語機能 / プログラミング言語の「醜いアヒルの子」を探る@IBM

ほとんどの Web 開発者は、1 度か 2 度は JavaScript を呪ったことがあるはずです。この悩める言語は、DOM (document object model) と呼ばれる複雑なプログラミング・モデルの重みで沈んでおり、実装やデバッグのためのツールは貧弱であり、その上ブラウザーによって実装が異なります。最近まで、多くの開発者にとって JavaScript は、好意的に言っても必要悪であり、ひどい場合はオモチャにすぎませんでした。

100回は呪っています… 🙂

というわけで、苦手苦手いってもしょうがないのでお勉強を。 上の IBM の文書はその後「しかし~」で続き JavaScript の仕様を他の言語(Java)と比べたときの特殊な点と利点を列挙しています。 分かりやすいです。

ちなみに、たまに JavaScript のことを Java っていう人がいますが、まったく別な技術なので区別して呼んだ方が良いです。 昔、JavaScript の技術者を探すのに Java の技術者を探していると電話している人がいて、混乱をよんでいました…

まずは基本からということで、JavaScript とはなんぞやというとことですが、「ECMA-262 / ECMAScript」の実装のひとつということらしいです。 言語仕様自体は ECMA というヨーロッパの標準化団体で規定されています。

Under Translation of ECMA-262 3rd Edition

この文書は、 Standard ECMA-262: ECMAScript Language Specification (3rd edition, December 1999) の邦訳を試みるものです。

その、ECMAScript の上で HTML の処理を行う DOM や通信系、プラグインとの通信を実装したものが JavaScript という理解をしました。 DOM は W3C で規定されています。

Document Object Model (DOM) Technical Reports

AJAX でお馴染みになった、XMLHttpRequest などのオブジェクトは基本的に各ブラウザの実装のようです。 調べてて分かったのですが、AJAX のきもとなる XMLHttpRequest は、もともと Microsoft InternetExplorer の独自拡張で他のブラウザが追従したもののようです。(なので生成方法が違うし、ECMAScript的には違ってもいい)

XMLHttpRequest@Mozilla

XMLHttpRequest は、Microsoftによって作られ、Mozillaが採用した JavaScript オブジェクトです。 これを使ってHTTPを通してデータを簡単に回収することができます。

もともと、Web をぴょこぴょこ動かすのは Microsoft が好きだったような気がするのですが、Google がつかうまでうざい対象とされていて…、なんか Microsoft も気の毒ですね。 いまじゃ、XMLHttpRequest なんか削除しちゃいたい気分でしょう… 自分の首をしめるオブジェクトいれたの誰だ!って怒られてたくらいにして(笑)

というわけで、JavaScript のお勉強はまずは ECMAScript の仕様を読むところから始まるらしい… 長い道のりです。。

プロトタイプ型のオブジェクト指向言語というらしい、、それで prototype.js なんか?。 え、配列の out of bounds ないんですか、勝手に拡張される!? なんだそりゃ。。 うはー、外からメソッド追加できるんだ、、意味わかんね。(←投げ出しそう

まさにスクリプト言語の中の、スクリプト言語。 なれるまで相当かかりそうです。

DOM に関しては、こちらのソースが簡潔にまとまっていてかなり参考になります。

bytefx

Bytefx is a fast, lightweight and crossbrowser library with some useful special effect for your web pages.

JavaScript の開発環境は aptana が非常に便利なので、こちらにたよりながらもうちょっと探ろうと思います。

このサイトについて

このブログは引っ越しを行いコンテンツはフリーズしています。hiromasa.anotherへどうぞ。

Powerd By WordPress

We (Heart) WordPress

WordPressME Logo
WordPress Plugins

ブログ内検索

Todays Popular

WordPress Ring

はてなリング - WordPress -

情報

18 queries. 0.184 seconds.

このページの先頭へ