現場で使えるIT技術のブログ

金融、流通、情報セキュリティプロジェクトなどの開発・運用・保守を経験したIT経験のあるまっちゃんが教えるIT技術者のための技術ブログです。

第5回[その他] 正規表現を知ろう

皆様、こんばんは


まっちゃん先生だよー


今回、なんだかんだで第5回目になりました。


今回のテーマは、ずばり正規表現です。


正直、全て知るのは不可能ですが、この正規表現を知っているのと

知らないのでは、パフォーマンスが明らかに違います。


例えば、数字ですが

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

である場合と、

[1-9]

の場合は、明らかに記述量が違います。


それがもう少し複雑な条件であれば明らか

先頭文字列が小文字英語の後の文字列がTRE,TYU,TEWのどれかであり、その後の末尾の数字が1-9のどれかとなる場合


・正規表現なし

aTRE1

aTRE2

...

zTEW9


・正規表現あり

^[a-z]T[RE|YU|EW][1-9]$


という感じで明らかに記載量が異なります。


このような正規表現ありに比べて、正規表現なしは、

26×3×9 = 702パターン記載しなければいけません。


正規表現ありだと1パターンでよいのに、

なければ702倍も手を動かす羽目になる。


こんなばかげた話はありません。


正規表現使えるならば、使えるに越したことはありません。

数字や文字、スペースやタブなど、基本的な正規表現さえ覚えてしまえば、

あとは、ITの現場で使うだけです。


正規表現と、ソースコードのきれいな書き方を、歯を磨くかのように

できれば、スーパーエンジニアに近い気がしますよ、はい。

第4回[ソースコード] 基本的な処理について

みなさん、こんばんは


まっちゃん先生です。


今回はソースコード第一回目の基本的な処理について、

です^^


主に以下の3パターン

・分岐処理

・繰り返し処理

・順次処理



この3つの組み合わせでソースコードの処理が記載されています。


基本的には、上から、文字列や数字等の何かしらの定義があり、上から順に処理されていきます。


まあ、ITの現場でこんなざつなフローチャート描いたら絶句ものですけどね笑

言語自体は流行り廃りがありますが、何でも良いのです。


例えば、あまりにも単純な例ですみませんが、こういうのと

public static void main(String args[]){

     public int[] num = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ;

     public int sum = 0;


     for(int matyan = 0 ; matyan < num.length ; matyan++ ){

            sum = sum + num[matyan];

     }

}


こういうの

public static void main(String args[]){
public int[] num = {1,2,3,4,5,6,7,8,9,10};

publicn int sum = 0;

for(int matyan = 0 ; matyan < num.length; matyan++){sum = sum + num[matyan];

}

}



どちらが、あなたは好きですか?

結構2つ目の例のソースコードに出くわすことがあり、

自分はこういうのをみたら、なんかインデントを直したくなりますね笑


そうとう気持ち悪いですから、、、


括弧がつながりすぎてて、視力検査かな?

と思うことがよくあります。


他人にこう思われないように、インデントをつけるクセがあるかどうか?

というので、保守性は飛躍的あがります。


正直、デバッグしているときに、どこが問題かわからなくなりますので、、、


上であげたJavaコードのような大規模開発向けのソースコードは

特に、、、、


あとは、SQLのビューとかも

select distinct matyan1,matyan2,case when matyan3 = 0 then "3" else "N" as ma3,sum(matyan4) as matyan4,(select case when matyan5 > 0 then "plus" else "minus" as matyan5 from matyan),...,matyan100 from matyan inner join ・・・where ・・・

という1行で果てしなく書いてあるのもありまして、、、


萎えます;;;;

少なくとも下のように書いてくれたほうがマシな気はします。


select distinct
  matyan1,
  matyan2,
  case when matyan3 = 0 then "3" else "N" as ma3,
  sum(matyan4) as matyan4,
  (select case when matyan5 > 0 then "plus" else "minus" as matyan5 from matyan),
  ...,
  matyan100
from
  matyan
  inner join
  ・・・
where
  ・・・


ということなので、何がいいたいかというと、

少なくとも自分で混乱しないようにソースコードで何か処理を書くときは、

・処理の順番

・インデントをつける

というのを意識しましょう^^

第3回[データベース]SQL(SELECT文)の副問い合わせ

皆様


こんにちは、まっちゃん先生です。


今回は、SELECT文2回目なので、SELECT文での副問い合わせをご紹介したいと思います。


副問い合わせは、SELECT以外にも、DELETEやUPDATEにも関連するので、

まとめてやってしまおうかなと思いましたが(個々にわけるより投稿が少なくて済むので笑)、なにかとプロジェクトで不便を感じる可能性があるので、別々にしました。


副問い合わせを用いたSELECT文の基本構文はこちらです。


SELECT 項目 FROM テーブル名 WHERE 条件


赤くした部分がテーマで記載した副問い合わせとなります。


たとえば、テーブル名:まっちゃんの定義が日付、金額、商品となる場合、


SELECT DISTINCT
  日付,
  金額,
  商品
FROM
  まっちゃん
WHERE
  日付 <= 昨日 and

        金額 <= 10000


の場合、記載された条件は、

昨日よりも前に10000以下の金額の商品データが重複なしで

取得されます。

※見やすいように、あえてインデントをつけました。


実行結果

赤字となっているデータについては、どちらも条件を満たすが、

データが全項目同じなので、1行(プロジェクトでは1レコードのみと言われることが多い)のみ残った。

黄色については、データがこれのみなので、1行のみ残った。

それ以外は、副問い合わせの条件を満たさないので、2レコードのみ抽出された結果になる。


実際は、もう少し複雑な外部結合を用いた記載であることが多いが、

今のところ、そのような要望はないと思うので、あればやります^^


まずは、副問い合わせの基本はこのような書き方となることを、

消化しましょう。