2008/03/31

イシカワのスペック2008

じょにさんがスペックをさらしていたので、私も続きます。
書き出してみて、改めて思いましたがたいしたことしてませんねぇ。精進せねば

■わかってること・出来ること

  • PHP:現在の主な言語。まあ、普通にWEBサイトを立ち上げられますよってレベル。 (どんなレベルだ?)現在のところ、一番サクサク書けます。
  • ColdFusion:知る人ぞ知る言語。ポジションとしては、PHPみたいな感じでWEB専用言語です。PHPのsmartyなんて、近いかもしれません。で、スキルですが、現在の2番手かな。 普通にWEBサイトを作れますが、PHPよりは、時間がかかるかも。
  • ASP(VBScript):3番手。ちょっと関数とか自信なしです。 でも勉強する気はあまりなし。
  • WEBサイト:セキュリティも含め、基本的な動きは、知ってるつもり。 なので、言語が何であっても、改修なら比較的早く対応できると思います (WEBの動きから、コードを推測できるので。)でも、whitespaceは、厳しいかも(笑)
  • DB:MySQL、postgres、oracle、SQLserverなど一通り、仕事で使っています。 あとは、DB2が入ればコンプリートかな?薄く広くって感じです。 処理を早くするチューニングなどは、苦手。(インデックス張るぐらいしかわかりません。)
  • SQL:仕事で使う範囲は、問題なしです。早い書き方、遅い書き方なども かなり理解したつもり。DBの速さって8割SQLだそうで、結構重要だと思う。 でも、軽視されがちな気が・・・。
  • Linux:FedoraやCentOSなど主にレッドハッド系のものを仕事でいじっています。 LAMP環境のWEBサイトならば、まあ普通に設定できます。
  • シェル:時々、楽するために使ってます。sedとか少々。もう少し使えこなせるようになりたい。
  • ケータイサイト:PC用とどこが違うんだって突込みがありそうですが、いろいろ違います。クッキー使えないとか、絵文字の処理とか。その辺も一通り勉強かつ経験したつもり。

■やりたいこと・身につけたいこと

  • 正規表現:すごい便利。一回勉強しましたが、もう一度しっかり学びたい。 ちなみに、PHPでは(多言語でも?)多用するとオーバーヘッドが発生するので注意。 関数で出来ることは、関数でやりましょう。(数字チェックなどね。)
  • Java:やっぱり、プログラムと言えば、これ。何かと情報も多いし王道って イメージなので、学んでおきたい。市場価値も高いですし、Web系でも 組込み系で、使えるところもグーです。
  • Ruby:matzさんファンなので(笑)。Rubyを勉強すれば、オブジェクト指向も自然と わかるらしいし、Ruby on railsをやるためにもやっておきたい。
  • Ruby on rails(cakephp):フレームワーク自体あまり好きじゃないのですが、話題になっているので、さわってみたい。でも、「DB設計をする必要がない」とか「SQLを書かないでよい」ってどうよ?
  • コンピュータサイエンス:基礎をやっていないので、この先、この業界でやっていけるか かなり不安。なので、この辺の知識を付けておきたい。
  • 大規模開発:今まで、経験したプロジェクトは、1人~数人程度の小さいものが多かったので、大規模での開発を経験してみたい。大規模なりのノウハウがあるはず。

2008/03/30

OOP再考

■ところで私、OOPについて理解していないんじゃん?

VB6.0→VB.NET(VS2003)へ移行した当初は、OOP関連の書籍を読んだりして、わりとマジメにモヤモヤしていたものの、いつの間にかVB.NETでの表面的な書き方にすっかり慣れてしまって、

  • クラスは機能単位にまとめられてベンリだし
  • スコープの管理もなんだかラクチンだし
  • 全てをクラスで書くというシンプルさがいいではないの

というあたりで満足してしまっていたわけですが…。

移行当初に「差分プログラミングだ!」と思って、Formを継承するという大技にでて苦い思いをして以来(「VisualBasic」なのにVisualな環境ではなくなってしまい、ボタンの位置をズラしたくても、ソースに戻らねばならず大変なことに…。理屈を考えるとそりゃそーなんですけど)、すっかり懲りて、自分自身がコードを書く際には、継承、抽象クラス、Interfaceという三種の神器は、私の中ではまとめて「なかったこと」になっていたんですね。せいぜいヘルプを読む際に、その知識を生かす程度でした。

ところが最近、別件でサーフィンをしていたら、「俺のOOPの理解がどう間違っていたかのふりかえり」の記事がふと目にとまり、

クラス = 構造体 + 関数みたいにムリに構造化プログラミングの考え方で見ようとしてはいけない。でないと、オブジェクトを入れ替えることで実装を切り替えられる、という技術によって非常に柔軟なコードが書けるようになる不思議が中々理解できないんじゃないかと思う。

という一節が妙にココロに引っかかってきたんですね。私もクラス = 構造体 + 関数って捉えてない?捉えているよね?と自問自答…。

あらためて「OOPってナンだっけ。とりあえずデザインパターン本あたりから読んでみる?」という気になって、数年前に挫折したあたりからのやりなおし計画発動です。

■OOPやりなおし計画発動 ~ デザインパターン本を読む

4774115797
技術評論社 2002-09
売り上げランキング : 24748
おすすめ平均 star

Amazonで詳しく見る

やりなおし計画の第一歩として、「Javaデザインパターン徹底攻略 」とうい本を手にとってみました。

サンプルソースはホントにパターンの骨だけが書かれているこの書籍。非常に短いセンテンスでパターンを紹介しているので、読みやすく、それぞれのクラスの関係性については、よく見えてくる本でした。

ただサンプルソースは短いだけあって、ホントに骨だけ。具体性には欠けていて、この本を読んだからといって、すぐさま「おお、確かにこういうシーンで使うと超ベンリだよね!」という感じにはなれませんでした。

前半のパターンでは「こんなコードを、デザインパターンでこんな具合にシンプルに!」という、デザインパターン以前のサンプルソースがついていて、ナットクしやすかったのに、後半では何故かデザインパターン以前のサンプルを端折りだしていますしね…。このAfter、Beforeの対比は、是非、全部のパターンにつけて欲しかったですね。

というわけで、パターンの作りは見えたものの、この本を読んだからといって「すぐさまデザインパターンを自分のソースに…!」とはならず、「まー、いずれ使うかもね…」くらいの感じではあったわけですが…。

23パターンをつらつらと見ていて、強く印象づけられたのは次の2点。

  • ポリモーフィズムを使いまくり。
  • ポリモーフィズムを利用して、IF文での判定を減らしている。

「IF文って嫌われている?まぁ処理に名前はついてないからね…」と思いながら、ひたすらポリモーフィズムを利用するパターンを読み続けているうちに、今更ながらに、「ポリモーフィズムってこういう風に使うのか…」という「気づき」はありました。ポリモーフィズムを利用した書き方なら、結構ラクに今の自分の書き方に取り入れられるかも…、という「気づき」でもあります。

■ポリモーフィズムについて実践考

ポリモーフィズムを使うことを前提に、一つの機能について大雑把に整理しなおしてみると、次の3つの階層に切り分けることができます。

  1. データを具体的に加工したりする階層
  2. Aのレベルのクラスのメソッド等を順序よく操る階層
  3. Button.Clickのイベントの辺りで書いたりするクライアントプログラムの階層。

A階層のデータを操る部分は、データが変わるたびにソースを書かざるをえません。でもB階層は単なるメソッド呼び出しの手順なので、意外と一緒だったりすることが多いんですよね。データは変わっても、それを扱う順序は変わらない。

もともと汎用的なツールを作っているときは、データ(画像とか)を直接処理するAの部分は固定で、Bの部分を作り変えることが多く、自然とこの 3階層に切り分けて書くことが多かったわけなのですが…(とはいえ、この場合は、Bの部分の書き換えなので、ポリモーフィズムは利用できませんが…)。

それとは逆の場合には、これまで主に2階層で書いていました。業務によって仕様の違うデータを処理する部分では(値を加工してテーブルを入れたり出したりするような作業とか)、A+Bが一体となっているクラスαを作って、Cからαクラスの、順序を管理しているメソッドを呼び出す…、という書き方です。Button1のクリックに対応するのはαクラス、という1対1の関係で、αクラスのメソッドを順番にみていけば、ストーリーの大筋は終えてしまう、という書き方。

ただこのB的な「順序を管理しているメソッド」の大部分は、別のクラスからのコピー&ペーストの世界です。このコピー&ペーストのメソッド部分を、別クラスに出して、3階層で切り分けてみると、A階層のクラスをひたすら作り変えている、というカタチになるなぁ、と今回改めて気がついたわけです。


もう少し具体的に考えていきましょう。たとえば、CSVファイルのDBへのインポート機能を考えると、

  1. ファイルのパスをゲット。
  2. テーブルにデータを突っ込む。
  3. インポートしたデーターのエラーチェックを行なう。
  4. エラーがあればレポートの出力。

シチュエーションによって多少の差異は出てくるにしろ、大筋はこんな流れになります。

ということは…。

  1. 定型的なメソッドをInterfaceで宣言
  2. A階層のクラスでInterfaceをImplements。
  3. B階層のクラスはInterfaceで宣言したクラスを操作する。
  4. クライアントプログラムとなるC階層では、BのクラスをNewするときか、別メソッドを作るかして、Bのクラスへ、引数としてAのクラスを渡す。

InterfaceをImplementsしているA階層のクラスを、データに沿ったカタチで複数作っていけばいいわけですね。クライアントプログラムでは、扱いたいデータを処理しているA階層のクラスをひとつ選んで、ひたすらBのクラスへ引数として渡せばいい…。

データを入れたり出したりのバッチ処理は、頻繁に書いているものの、フローのバリエーションはいくつかに絞れそうですし…。そのバリエーションの数だけ Interfaceを作って、Interfaceを操作するBも作ればいいわけですから。作ってしまえば、あとはひたすらAの部分を書いていくだけ、と。

ポリモーフィズムを連荘で見せつけられて、自分の今のソースへの当てはめ方も見えてくると、「なーんだ、そっかー、簡単じゃん」という気になってきました。…私、騙されています?それとも、今更…、ってところなのでしょうか。

memo

VBユーザーだけどOOPならJava本でしょ、やっぱり

私はVB2005ユーザーですが、OOP本はなにかとサンプルソースがJavaの本が多いので、「Javaをある程度読めないと、OOP本は読めないぞ」と思って、VB6.0→VB.NET(VS2003)への移行当時、覚悟を決めてJavaの入門書を一通り通読しました。で、Javaの入門書を読みながら思ったことといえば、

VB.NETの参考書よりも、Javaの参考書を読んだ方が、クラスのお作法についても、なんだかわかりやすい」(ナニソレ)

Java本が質・量とともに豊富なのに比べて、.Net系の良い参考書は、今でも「コレ!!」といったものがないですからね。VBユーザーといえども、Javaの簡単なサンプルソースくらいは読めないとツライご時世なのです。

とはいえ、今回私が読んだ「Javaデザインパターン徹底攻略」程度の簡単なサンプルソースであれば、わざわざJavaの入門書まで戻らなくても、ある程度、クラスのお作法に慣れている人であれば、非Javaユーザーの人でもつらつらと読めるのではないかと思います。共にOOP志向の言語で、大筋は似ていますから…。

ちなみにVB2005とJavaとの差異の部分は、VBという言語仕様のOOP志向への中途半端さ加減を感じる部分でもあります。例えばVBの場合、Interfaceにアクセス修飾子をつけられます。「ちょっとマテ。そこでpublic以外のアクセス修飾子をつけられる余地があるのは、どういうことなのさ?ポリモーフィズムを利用しようと思っても、不完全な可能性が…」この種の方向性の中途半端さ気がつくとなんだか気持ち悪くてムズムズしてきます。…あぁ神サマ、どーして私はVBユーザーなのでしょーか。この気持ち悪さを忘れるくらいの、自分の言語に対するLoveが欲しい。

memo2

Matzのにっき→2003年のOOPの記事リスト

Rubyは触ったことがないのですが、内容的にはなるほどなるほど。「オブジェクト指向は難しい」のオブジェクト指向の嬉しさの違いや、「(その2)」のオブジェクト指向のシンプルさについては、拙い書き方ながらも、これまでクラスを書きはじめてから感じていたことだったので、「あぁこの嬉しさの違いは私にもわかるなぁ」と共感(嬉)。

「継承は悪か」のま2さんのツッコミ記事は今の自分にはタイムリー(2003年の記事で、世間的には5年も前の議論なわけですが…)。

4. で実際問題として,手続きが変わるより,データ形式が変わることの方が多い。したがって,実際問題としてオブジェクト指向の方が威力を発揮する。

オブジェクト指向は「データ中心」の産物で,「データ中心世界」では強い。そこでプログラミングの対象が「データ中心世界」なのか「手続き中心世界」なのかが重要だということです。結局オブジェクト指向とは「ものの見方」なのですね

まさに!!ってところですね。

2008/03/27

マイスペック2008

B0015IQ776
日経ソフトウエア2008年5月号は「はじめてのプログラミング」総力特集号。プログラミングを始めるその瞬間に知っておきたいことを,ぐぐっとまとめてお届けします。はじめてのプログラミングでは,迷いと不安がつきものです。先輩プログラマからの手紙に始まり,プログラミング言語カタログ,多くの言語で共通するプログラミングの基本概念,学ぶときに気を付けたいことなどをやさしく解説して,“着実な一歩”をしっかりサポートします。

さてはてMSっ子のじょにです。日経ソフトウエアを読んでいたら、結城先生からの手紙に以下のような部分がありました。

今の自分が知っている言葉を紙に書き出してみましょう。

~中略~

そうやって、自分のノート、自分の理解の現状を具体的な形にしていきます。そして、例えば、1年後、そのノートを振り返ったとき、あなたは格段に変化している自分に気づくでしょう。

このブログのそもそもの私の目的はそれに近いので…(学習記録帳。恥を晒す)。かなりの恥さらしと自覚しつつ、現状把握の為、マイスペックを書き出してみることにしました。

わかっていること・LOVE・使えるレベル

  • Excel(2000/2003):LOVE。関数からマクロまで。ちなみにに汚いデータを整形したり(全角・半角を整えたり、桁数を揃えたり)、表の作成等については、かなりスピードに自信あります。
  • Access(97/2000/2003):LOVE。クエリも好きですが、Accessの大抵のVBAでの操作はかなりあれこれ大技・小技を含めて使っている方だと思います。ちなみにマクロ機能はまず使いません(VBAで大抵のことはコントロールできますし、ソースだけを見れば全体像がつかめて視認性が良いので)。
  • VB6.0:主にAccessとの連携プログラムばかり作成。生成物としてはCSV、Excelデータ作成など。レポート出力はAccessのレポート機能を使っていて、クリスタルレポートは使ったことナシ。データを管理する(インポート・検索・新規登録・編集・削除・レポート出力など)ようなものや、バッチ処理系のスタンドアローンなプログラムばかり作成。APIは、パクったものの利用くらいしか使えていません。他、dll利用の圧縮ツール等。
  • Visual Basic 2005:現在主に利用中。作成しているプログラムの内容的にはVB6.0時代と同様スタンドアローンのツール。レポート出力はActiveReportにて。たまーにバッチ処理的な画像処理のクラスの作成など。TIFのフォーマットについては多少勉強。他にはAccessのDB解析プログラムなど。
  • VBScript:主にEmEditorのマクロで。WinのDBサーバーへVBScriptでODBC経由でエラーチェックつきのインポートツールを作ってみたり。Winでありさえすればなにはなくとも動くので、ちょっと楽しいと思いはじめている。

遊んだことがあるもの

  • Basic:学生時代の授業にて半年だったか1年だったか…。毎週課題が出るわけですが、今で言うギークっぽい子たちに、毎度毎度助けられていました(ちなみに私の初PC購入にあたっても、彼らに付き合ってもらいました。予算とやりたいことのみ伝えて、機器の選定から値段交渉まで全部お任せ…。配線や設定等は自力でやりましたが)。気がついたら、学期の後半には、このクラスには彼らと私しか残っていませんでした(他は全員脱落…)。
  • C言語:社会人になってからの最初の研修で10日くらい???家ではTURBO Cを入れて、ちらっと遊んでいました。ほぼ最初に触れた言語がCだったせいか、今でも型宣言等がキッチリしている言語の方が読みやすいとは感じます。
  • Java:結城本(プログラムレッスンの上下巻)を2冊読んで、OOP本の入門系のサンプルソースくらいは読めるレベル(ま、VB.NETとも似ているので…)。但し、当然、アプリを作るレベルではありません。
  • JavaScript:たまーにアイディアを思いつくと、ブラウザ上で動くミニツールを作成。ブラウザさえあれば、動くものを作れるので、ちょっと楽しいと思い始めているところ。でも普段あまり使わない言語なので、VBScriptほどにはサクサク書けず、もどかしい。
  • ASP:VBScriptとAccess連携で、セキュリティ無視の遊びレベルのツールくらいは作ったことあり(ホワイトボードや検索系)。でもセッションの使い方は、実は当時なんだかよくわかっていませんでした。今は概念はわかっていますが、実装レベルではどーでしょ?
  • ColdFusion:一週間くらい何故かいじったことがあります。業務アプリ・改修経験はナシ。
  • Python:Zope上で数日体験した程度。
  • Perl:初心者本を2冊通読した程度。インストールして多少いじったことはあるものの、ひとさまのソースもロクに読めない状況…。ソースになかなか慣れない原因その1.書き方のバリエーションがなんだか随分あるように感じられ、まごつく。その2.引数を明示しないファンクションになじめず、どこからともなく降ってわいた値がいきなり動き出しているような印象をもってしまう。その3.苦手な正規表現をばんばん使っているソースが多い。その4.Perlの関数を知らなさ過ぎる。
  • FileMaker:お友だちがこれの使い方がわからずパニくっていたので、お試し版を落として、多少のヘルプに入ったことアリ。でも根っからのAccessユーザーなので、これならAccessの方がいいや…、と思って、用が済んだらさっさとアンインストール。
  • Oracle10gEx:タダなので入れてみました。標準SQLを試しに叩いてみる程度。
  • MySQL:タダなので入れてみたことアリ。他人の作ったWebアプリを使うにあたって、ちらっといじってみたことがある程度。
  • CSS:カスケードとかはわかっていますが、あまり体系的に勉強はしておらず。整理されたCSSを書く力量はナシ。

壁を感じること・アイタタタ

  • UMLなど:設計書の類を読んだり、書いたりすること。当然、いきなりソースを書き出すタイプです。設計~開発までがある意味守備範囲なので、端折ろうと思えば端折れ、仕様を残せといわれて、大抵、作った後にごそごそ書類を書いています。設計~開発まで一人で担当できるレベルだから、どうにかなってはいるものの…。.NETに移行した際に、これからはUML図だ!──と思ったのもつかのま、挫折…。
  • ポインタ変数:C言語やC#の参考書を読むたびに、挫折。VBからC#へ移動したい気持ちはあるのに、毎回この山の麓あたりで挫折。
  • 再帰処理:どーにか他人のソースは読むものの、自力では書けない感じ。シナプスが切れている感じで、思いつけません…。
  • スレッド:追いかけているうちに、何がなんだかわからなくなります。sleepしか使ったことがないなんて…。
  • 正規表現:毎回何かしようと思うたびに、自分が欲しいと思っているモデルとなるサンプルをググって、多少改造するレベルでしか使えていません。
  • XMLとかXSLとか:入門書トライの度に、最初はわかったつもりでふんふんと思っているうちに、いつの間にか何がなんだかわからなくなってしまう。たまーに.Netから単純なものは利用したりもしますが、一体、なんなんですかー?
  • Webセキュリティ:全然知りません。SQLインジェクションとかブラインドSQLインジェクション、XSSについてもわりと最近知っておぉ…と思った暢気さ加減。いや、だからこそWebアプリは作ってこなかったわけですが。

こうして書き出してみると、アプリ使いって感じですね。自信があるのはExcelとAccessだけか!…みたいな。来年の今頃は、多少スペックは上がっているのでしょうか。

2008/03/22

Java/Officeストーリー

MSっ子な私はこれまでVB6.0なり.NetからのExcel出力部分ではCOM利用をしていて、その部分ではたいした苦労をしたことありません(COMオブジェクトの解放 はちと面倒臭いですけどねー)。ですが、JavaからのExcel出力には、なんだか随分大変な歴史があったのですね。

◆Javaを使ってOffice2007をクラックする

上記サイトの記事を読むと、COM利用の言語の人の場合は、「ExcelのCOMを利用すればいいじゃん」のヒトコトで済むわけなんですが、COMをサポートしてない言語ではCSVで吐いてみたり(それを聞いただけで泣ける…!)、涙と汗の紆余曲折。Office2003が登場したかと思えば、独自路線なXMLフォーマット。しかもそのフォーマットはきちんと文書化されていないという中途半端な状況で、トライアル・アンド・エラーを頻発させしながら、自分達でそのフォーマット状態を手探り状態で解明しなければならないという、暗中模索作業が待っていて…。

全般的に、Java/Officeストーリーは、控えめに言っても、極めて不快な状態でした。Javaの開発者はじっと耐えるか、「Officeは最低だ。とにかく、なぜ、誰かがそれを使いたがるんだい?」と言うことで、イソップ物語の1つを大いに連想するやり方で自分自身を慰めるか、単純に Officeを使っているユーザーに、Microsoft とSun の訴訟問題のせいで、JavaはOfficeを理解することができないのだ、と言ってみるかしかありませんでした。

Javaを使ってOffice2007をクラックする

極めて不快…Officeは最低って…。憎まれちゃって、まぁ。憎むほど苦労する前に、その部分は、素直にCOMを使える言語を使えばいいのに…、とついつい憎まれっ子世に憚る(?)MSっ子としては呟きたくなるわけですが…。

上記サイトのストーリーを読むと、Office2007の登場でXML文書のZIPファイル以外何物でもないものになったので、やっとJavaの開発者もハッピーになりそうだ、というようなストーリーになっていますね。

もっとも、今のところ、私はOffice2007でのフォーマットの納品自体を頼まれたことはありません。むしろなるべく多くのOfficeで問題なく開くよう、バージョンダウンを意識しています。Java開発者がOOXMLで大手を振って納品できるようになるのはもう少し先のことなのかなぁ、と思うわけですが。

現在、企業ではOffice2007はどれくらい普及しているのでしょうかね。

EmEditorのマクロ 選択範囲をpタグで囲む

選択範囲をpタグで囲むマクロ。

改行はbrタグで記事を書こうと思っていたわけですが、やっぱりパラグラフはpタグの方がレイアウトしやすいなと思って、pタグも準備しました。ソース的には新鮮さゼロですが。

ついでに個人的にはすーごく気持ち悪かったbloggerの記事を囲んでいたpタグも外してしまいました(ウィジットテンプレートをぽーっと見ていて、やっとどこで設定しているのかわかりました。ふー、スッキリ。更に調子に乗って「ウィジットのテンプレートを展開」にチェックを入れて、ウィジットのタグもいじってみましたが、こちらはことごとくエラーになりました。あー改造したい…)。

Dim intXB        '選択範囲の最終行のX
Dim intYC        '現在位置のY
Dim intYA        '選択範囲の開始行
Dim intYB        '選択範囲の最終行
Dim i

intYC = document.selection.GetActivePointY( eePosLogical )
intXB = document.selection.GetBottomPointX( eePosLogical )

intYA = document.selection.GetAnchorPointY( eePosLogical )
intYB = document.selection.GetBottomPointY( eePosLogical )


If intXB = 1 Then
    intYB = intYB -1
    If intYC > 1 Then intYC = intYC - 1
End If

If intYC <> intYB Then
    For i = intYC To intYB
        document.selection.StartOfLine False,eeLineLogical
        document.selection.Text="<p>"
        document.selection.EndOfLine False,eeLineLogical
        document.selection.Text="</p>"
        document.selection.LineDown
    Next
Else
    For i= intYA to intYB
        document.selection.StartOfLine False,eeLineLogical
        document.selection.Text="<p>"
        document.selection.EndOfLine False,eeLineLogical
        document.selection.Text="</p>"
        document.selection.LineDown
    Next
End If

2008/03/20

Whitespace

本日の面白ネタは、「Whitespace」というプログラミング言語。
るびまのMatzさんの解説は、こちら。

何が面白いってすべてが、スペース、タブ、改行で表されていてWeb上やwindows付属のメモ帳とかでは何がなんだかわからない。
たとえ、EmEditorや秀丸などの高機能エディタを使っていても見にくいこと、この上ない。じゃあ、なんのために存在するんだよ って思ったところ

通常無視されがちな空白に対する不公平を是正 する

ためらしい。まさに、ジョーク言語!!
なんというかもう、最高。面白い。

ちなみに本家サイトは、こちら

2008/03/18

日本オラクル

17日の英語でしゃべらナイトを本日見ました(録画)。

外資の取材といいつつ、番組の8割くらいはOracleさんネタでした(パックン英検もなかったし…)。

入社1年目の子の1日の密着とか、かなり興味深かったです。入社1年目にして、家の中にホワイトボードまであったりして、なぬぬ、ビックリしたものの、すごくまじめ。頭が下がります。上司に対して、研修についの有用性を訴えるプレゼンのシーンなんかもなかなか面白かったです。自分の意見を認めてもう為に、プレゼンの機会を設けて上司(関係者)を説得する、という風景なのですが、プレゼンの練習にもなりますしね。

ちなみに再放送は3月21日(金)深夜2:50からのようです。

EmEditorのマクロ 選択範囲内をprettyprint

EmEditorのマクロで選択範囲をソースコード用のタグ<pre class="prettyprint"></pre>で囲んで、&類を実体参照化するマクロ。preの中だと自動で実体参照に変換してくれないようなので。

Blogger投稿用デス。

Dim strData
Dim intSCount

intSCount = 4    'tab→半角スペース置換えの際のスペースの数
strData = document.selection.Text

strData = Replace(strData, vbTab, String(intSCount," "))
strData = Replace(strData, "&", "&amp;")
strData = Replace(strData, "<", "&lt;")
strData = Replace(strData, ">", "&gt;")
strData = Replace(strData, """", "&quot;")
strData = Replace(strData, "'", "&#39;")

document.selection.Text = "<pre class=""prettyprint"">"
document.selection.NewLine
document.selection.Text = strData
document.selection.Text = "</pre>"

2008/03/17

バカにされる言語?

最近、webを徘徊していてものすごく笑ったのがこれ

◆PHPやってるだけでバカにされるんですがどうしたらいいでしょうか。 - 人力検索はてな

PHPやってるだけでバカにされるんですがどうしたらいいでしょうか。
あとIPAの総論とかもひどいな~。

◆IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第1章 総論:より良いWebアプリケーション設計のヒント

開発基盤選定における考慮事項の例
(1) プログラミング言語の選択
1) 例えば、PHPを避ける
まあ、phpについては、matzさんもdisりまくってるのですが、間違った方向に いっている例もあるということで・・・・。

なんにせよ、人気言語ってことでしょうか?

2008/03/16

複数個の改行を1つにまとめるファンクション

VBSで書いたソースで、末尾に改行2コくっついてしまた変数の改行を手軽に1つにしたいという依頼を受けました。

最終的にこんなふうになってしまった変数の中身を、

strData = strData & "10001:XXエラー" & vbCrlf
strData = strData & "10002:XXエラー" & vbCrlf
strData = strData & "10003:XXエラー" & vbCrlf
strData = strData & "10004:XXエラー" & vbCrlf
strData = strData & vbCrlf

こうしたい、

strData = strData & "10001:XXエラー" & vbCrlf
strData = strData & "10002:XXエラー" & vbCrlf
strData = strData & "10003:XXエラー" & vbCrlf
strData = strData & "10004:XXエラー" & vbCrlf

というわけですね…。

「strDataに入っているなら、Replace関数を使っちゃえば?」ということで、シンプルにこんな感じでひとまず完了。

strData = Replace(strData, vbCrlf & vbCrlf, vbCrlf)

しかしあまりにシンプルでつまらないので、正規表現だとどうなるのかなー、などと余計な好奇心。

「正規表現であれば、2コ改行以上の改行キーを1つにまとめることもできるなー」ということで、文末にくっついてしまった複数個の改行を1つにするファンクションを書いてみました。

Function ReplaceEnd( strData )
    '末尾の1コ以上の改行を1つにまとめる関数
    Dim objReg
    Set objReg = new RegExp
    objReg.Pattern = "(\r\n)+$"    '末尾の1個以上の改行
    ReplaceEnd = objReg.Replace(strData, vbCrlf)
    Set objReg = Nothing
End Function

MSDNのヘルプを見ると、\n:改行にマッチします。と出ているからVBSの改行はてっきり「\n」でいいんだ、と思っていたら、うまくいきませんでした。その原因は、strDataの中で、「vbCrlf」(キャリッジリーターン + ラインフィールド)を使っているからデス。

\r:キャリッジ リターンにマッチします。ということなので、「vbCrlf」は「\r\n」で表現すればいいわけなんですね…。

正規表現は正直なところ、冷や汗が出るほど苦手なんですが、ベンリだなー、とは認識しているので、今後とも用心深くコネタでちまちま実験していきたいです。

ついでに末尾に拘らず、2コ以上の改行を1つにまとめる関数を作成しました。EmEditorのマクロでも使えそうなネタですね。

Function ReplaceCrlfDel( strData )
    '2コ以上の改行を1つにまとめる関数
    Dim objReg
    Set objReg = new RegExp
    objReg.Global = True
    objReg.Pattern = "(\r\n)+"
    ReplaceCrlfDel = objReg.Replace(strData, vbCrlf)
    Set objReg = Nothing
End Function

2008/03/15

EmEditorのマクロ 選択範囲へ改行タグ

EmEditorのマクロ機能で、選択範囲に改行タグを入れるマクロをVBSで書いてみました。上から選択しても下から選択しても動くように、カレントポジジョンを見て判定。

うーん、「選択範囲」をどう捉えるかちょっと悩みつつ、ひとまず自分が使いやすいように。

Dim intXB        '選択範囲の最終行のX
Dim intYC        '現在位置のY
Dim intYA        '選択範囲の開始行
Dim intYB        '選択範囲の最終行
Dim i

intYC = document.selection.GetActivePointY( eePosLogical )
intXB = document.selection.GetBottomPointX( eePosLogical )

intYA = document.selection.GetAnchorPointY( eePosLogical )
intYB = document.selection.GetBottomPointY( eePosLogical )


If intXB = 1 Then 
    intYB = intYB -1
    If intYC > 1 Then intYC = intYC - 1
End If

If intYC <> intYB Then
    For i = intYC To intYB
        document.selection.StartOfLine False,eeLineLogical
        document.selection.EndOfLine False,eeLineLogical
        document.selection.Text="<br />"
        document.selection.LineDown
    Next
Else
    For i= intYA to intYB
        document.selection.StartOfLine False,eeLineLogical
        document.selection.EndOfLine False,eeLineLogical
        document.selection.Text="<br />"
        document.selection.LineDown
    Next
End If

2008/03/13

英語でしゃべらナイト

3/17(月)オンエアの英語でしゃべらナイトで日本オラクルが取り上げられるみたいですね?ウェンディ…?が映っているなぁ。

AcceessのDAOでの繋ぎ方

参照設定でMicrosoft DAO 3.6 Object Libraryあたりを選択(バージョンは環境による)。

Access2000あたりはチェックが外れていた筈。要確認。

参照

Dim db As Database
Dim Rst As Recordset

Set db = CurrentDb
Set Rst = db.OpenRecordset("SELECT * FROM TB_WORK WHERE SEQNo<=2")
Do Until Rst.EOF
    MsgBox (Rst("SEQNo"))
    Rst.MoveNext
Loop
Rst.Close: Set Rst = Nothing
db.Close: Set db = Nothing

更新

Set Rst = db.OpenRecordset("SELECT * FROM TB_WORK WHERE SEQNo<=2")
Do Until Rst.EOF
    Rst.Edit
    Rst("DATA") = "更新"
    Rst.Update
    Rst.MoveNext
Loop
Rst.Close

追加

Set Rst = db.OpenRecordset("SELECT * FROM TB_WORK WHERE SEQNo<=2")
Rst.AddNew
Rst("SEQNo") = 13
Rst("DATA") = "新規"
Rst.Update
Rst.Close

ちなみにADOよりもDAOの方が処理が速いというウワサを聞くんですけどなんなんですかー?

ITProのすぐわかるデータベースの基礎の一覧表をみてみると、「データベース・エンジンとデータベース接続規格の種類」のJetについては

Accessが提供するデータベースエンジンで,MDBファイル(Microsoft Accessのデータ・ファイル)を操作するための機能を提供します。スタンドアロン型またはファイル共有型のデータベースで使われます。

とあり、「データ・オブジェクトの種類」の項目をみると、DAOについては

Jetを操作するためのデータ・オブジェクトです。

となっています。

DAO は Jet データベース エンジンを主なターゲットにしているので、それ以外のDBを視野にいれているのならADO…、ってところなのでしょうか。個人的には超ビミョー。

うーん、私がAccess単体での開発をする場合は、DAOの方がいいような気がしてきたぞ。VB6.0時代はADO利用していたものの、今更Access単体のツールをVB6に移植する、という可能性はないでしょう。移植するならVB.NET。そうするとADO.NET利用になるので、ADO利用のソースをそのままごっそり利用…、なんてことはしませんから、結局イチから書き直し。ADOで書くメリットがあまり思い浮かびません。

モリス

ミックさんのところでプロジェクト杉田玄白(翻訳版青空文庫?)の話が出たところで。

そういえばミックさんたらモリスの翻訳もやっていたんだっけ、と思い出しちょっとうきうき。ちょっとずつ読んでいこうかな。

モリスは直感的にスキ。でもせいぜいこれまでのところ「ユートピアだより」位しか読んでいませんので。

原文の方も折角なのでトライするかの…。

AcceessのADOでの繋ぎ方

再びAccessでのお仕事が入ってきそうなのでリハビリ。まずは基本ネタ。

環境:Access2000

参照方法

Dim cn As ADODB.Connection
Dim Rst As ADODB.Recordset
Dim i  As Integer
Set cn = CurrentProject.Connection
Set Rst = New ADODB.Recordset
Rst.Open "SELECT * FROM TBS_TEST WHERE SEQNo < 3 ", cn, adOpenForwardOnly, adLockReadOnly
Do Until Rst.EOF
    MsgBox (Rst("SEQNo"))
    Rst.MoveNext
Loop
Rst.Close: Set Rst = Nothing
cn.Close: Set cn = Nothing

更新

Rst.Open "SELECT * FROM TBS_TEST WHERE SEQNo <= 2", cn, adOpenDynamic, adLockPessimistic
Do Until Rst.EOF
    Rst("Data").Value = Rst("SEQNo").Value + 1
    Rst.Update
    Rst.MoveNext
Loop
Rst.Close

追加

Rst.Open "SELECT * FROM TBS_TEST WHERE SEQNo <= 2", cn, adOpenDynamic, adLockPessimistic
Rst.AddNew
Rst("SEQNo") = 10
Rst("Data").Value = "新規"
Rst.Update
Rst.Close

CursorTypeやLockTypeはシチュエーションで考えると吉(ヘルプなり確認したまへ)。

構文

Recordset.Open Source,ActiveConnection,CursorType,LockType,Option

2008/03/12

終端文字のようなセミコロンの話

SQLの終端文字のようなセミコロン。

Oracleではどうやらシステム変数で変更できちゃうみたいだし(デフォルト=セミコロンというだけの話なのねー)、どうやら標準SQLではないというのはなんだか衝撃でした。ものの本では大抵、終端文字然としてSQLの文末には「;」がありますからねー。

で、このセミコロンの話をS師匠と話していたところ、「そうだよ、だから.Netで書くときはパラメーターでイチイチ定義する書き方もやっているんだよ」と云われて、そういえば、DB絡みのクラスを書きはじめた当時、そんなようなことを云われたなー、ということを思い出しました。

アプリを作る際には、SQLのWHERE部分に対して、変数なりで条件を受け渡します。検索画面であったりするなら、テキストボックスで知りたい値を入力するわけですが、その際「0;DELETE FROM TB_USER」とか入力されて、それがまかり通るようなソースを書いていると、あっという間に、システムは逝ってしまうわけですね。こわー。

そういう意味ではSQLの終端文字を受け付けないODBCはある意味、安全ってコト?(うーん、でもODBCとDBの組み合わせによっては終端文字OKな場合もあるのかなー?ありそうな気もするなー)

ORA-00911エラー

VBSからODBC経由でOracleへ接続。その際、ODBC経由でSQL文を投げても、

ORA-00911: 文字が無効です。

のエラーがでるばかり。

SQL文をコマンドラインから投げても通るので、SQL文自体は正しい模様。

で、試行錯誤の結果、SQLの終末端子のつもりで最後に入れていた「;」を外すとSQL文が通ることが判明。

以下、まとめ。

動的 SQL の DDL や DML にはセミコロンは不要。

※参考: 最後に入力する セミコロン(;) とスラッシュ(/) の意味

セミコロン(;)
SQL*Plus コマンドの終端文字。
単独で使用すると LIST コマンドと同じ動作になる。
SQL と SQL*Plus コマンドの終端文字はデフォルトで同一であるが SQL*Plus コマンドの終端文字は CMDSEP システム変数で変更可能。
セミコロン(;)
単一の SQL 文、 PL/SQL ステートメントの終端文字。
SQLTERMINATOR システム変数で変更可能。
スラッシュ(/)
SQL バッファの実行 兼 ブロック全体の終端文字。
PL/SQLブロック内には、文の終端文字としてセミコロンが既に使用されているため、文末と全体の終端との区別のためにある。
機能的には、RUN コマンドと似ているがスラッシュは SQL バッファを表示しないで実行する、また、RUN コマンドには終端文字として機能はないという点も異なる。
単独で使用すると SQL バッファを実行(再実行)する。
ドット(.)
ブロック全体の終端文字。
行頭で使用することで、終端文字として扱われる。(変数の終了文字としても使用する。)
ブロック要素の入力途中での間違いや入力を中断したいときに使用する(程度しか思い当たらない) (入力文字はバッファに入る)。
BLOCKTERMINATOR システム変数で変更可能。

参考URL:http://www.shift-the-oracle.com/sqlplus/command/run.html

というわけで、「;」は、決して標準SQLというわけではないようなので要注意。システム変数で変更できちゃう存在なわけだから、そりゃ標準ではないよなー。

memo
OracleのTIPSの総本山のようなところ
http://www.shift-the-oracle.com/
Oracleのエラーがでたら…。
上記サイトの[Top]→「Knowledge」→「代表的なオラクルのエラーの対処方法」
http://www.shift-the-oracle.com/oerrs/

航海日誌

航海日誌試運転中。

日々のエラー記録簿、備忘録。

Ω Ω Ω
なにかとgoogleユーザーなので、とりあえずBlogger。

ついでにPage Creatorとかも利用しちゃったりして(ソースコードに色をつける為、javascript類をUP)。

でもTBとかデフォルトで設定できないんですね。blogとしてそれはどうなの?Backlinksってナニそれ?

gmailでおなじみのラベル機能は魅力だけど、googleなんだし、過去ログを探すときは検索した方が速いカモネ?

Contact us