【Java】バグを減らすために意識すること part1

目次

    1. Java実行時のエラーについて

    2. NullPointerExceptionとは?

    3. NullPointerExceptionが起きない実装

    4. まとめ

1.Java実行時のエラーについて

Javaプログラムはコンパイルが成功しても、実行した際にエラーが発生することがあります。Java言語では実行時に発生したエラーを例外と呼び、例外処理が発生したときに例外に対する処理を記述していない場合、強制的に処理を終了してしまいます。

今回はこの例外を未然に防ぐための実装についてお話ししたいと思います。

2.NullPointerExceptionとは?

例外にもいくつか種類がありますが今回はNullPointerException(いわゆるヌルポ)についてお話ししたいと思います。まずヌルポが起きる時はどんな時でしょうか?以下のサンプルソースからどこでヌルポが発生するか考えてみてください。


public class NullPoEducation {
    protected void outputEmployeeInfo(String strProc, ArrayList lstEmp ){
        if(strProc.equals("社員名出力")) {
            for(String strEmp : lstEmp) {
                System.out.println(strEmp);
            }
        }
    }
}

まずはoutputEmployeeInfoメソッドの第一引数がnullの場合、NullPointerExceptionが発生します。これは参照変数strProcがnullにも拘わらずstrProcからequalsメソッドを呼び出しているためです。このようにnullのオブジェクトからメソッド呼び出しを行うと起こります。

さらに第二引数がnullの場合もNullPointerExceptionが発生します。拡張For文に渡すリストがnullのためです。ではどのように実装すればヌルポを防げるのでしょうか?

3.NullPointerExceptionが起きない実装

オブジェクトの比較を行う際にequalsメソッドはよく使用しますが、上記のケースでは以下の様に実装することでヌルポが起きなくなります。


if("社員名出力".equals(strProc)) {

}

条件判定の文字列"社員名出力"はオブジェクトとして必ず存在するため、 ヌルポが100%起きなくなります。なのでNullの可能性がある場合はequalsメソッドのパラメタにするようにしましょう。

拡張For文は以下の様にNullチェックを入れることでヌルポを回避できます。


if(lstEmp != null){
    for(String strEmp : lstEmp) {
        System.out.println(strEmp);
    }
}

4.まとめ

 上記のことを気を付けるだけでNullPointerExceptionが回避できるようになるわけですが、もちろんNullの場合の動作や振る舞いは考えなければなりません。実装者で判断つかなければ設計者に確認したり、呼び元、呼び先の処理を追って判断したり、とコードを組む以上に考えさせられることがあります。特に既存処理を修正する場合はこの調査に労力がかかります。そこまで考慮した上でコーディングを行うとバグも少なくなるはずです。ではではこれにて失礼します。

【息抜き】SEが面白いと思う海外ドラマ part1

今回はSEが観て面白いと思った海外ドラマを紹介したいと思います。

IT業界の人は一度は憧れるであろうアメリカリフォルニア州シリコンバレーを舞台にしたドラマ、その名も「シリコンバレー」です!

 私はアマゾンプライムでシーズン4まで観ましたが今のところずっと面白いです!

ストーリーはシリコンバレーの大手企業フーリー社に務める若者リチャードが、自主製作した音楽検索アプリを元にベンチャーキャピタルに売り込むところから始まります。駄目元で面接を受けるがアプリの評価よりも検索に使われているデータの圧縮技術が優れていることが分かりフーリー社の代表ギャビンは破格の値段を提示して技術を買い取ろうとしてきます。最終的にリチャードは自分が企業する道を選択します。

これだけを聞くと真面目なITドラマの感じに聞こえますが実際は下ネタあり、ブラックジョークありの相当下品なコメディーと言っても過言ではないです。実在のIT企業や製品もちらほら出てくるし皮肉に使われることも。特に好きなシーンはギャビンが自社で開発したフーリーフォンの評判が悪いことを聞き、「まさかVistaほどではないよな?」と聞いたところ、「残念ながら…AppleMapぐらいです」と言われて電車の中で噴出しそうになりました。他にもインデントのタブ派とスペース派の論争も観ててちょっと共感することもあったり(私は絶対タブ派です)IT業界の人はより面白く観れると思います。でも美しいJavaのコードを観て下半身が元気になるのは引きました( ´∀` )

こういったドラマを観ると良い息抜きになります。今ならアマゾンプライムで観れるのでおすすめです。

 

Amazonプライム・ビデオ

Amazonプライム・ビデオ

  • 発売日: 2020/01/07
  • メディア: アプリ
 

 ではでは!

 

【SE知識】要件定義とは

 

目次

    1. 記事を書くことになったきっかけ

    2. 要件定義とは
    3. 要件定義でやるべきこと

    4. 要件定義で大事なこと

    5. まとめ

1.記事を書くことになったきっかけ

この記事を書くきっかけになったのは、ふと疑問に思ったことがあったためです。

そもそも要件定義って何をどこまでやるべきなの?

現場によっては基準もばらばらで明確な線引きがされていない様な気がします。

なので自分なりにまとめてみようと思ったのですが、主観で書くと偏ってしまうので

以下の本を読んで勉強し直してみました。

はじめよう!  要件定義 ~ビギナーからベテランまで

はじめよう! 要件定義 ~ビギナーからベテランまで

 

 この記事には私の考えも含まれていますので上記書籍の内容と異なる内容もあるかもしれませんのでご了承ください。

2.要件定義とは

そもそも、要件とは何なのか?

発注側の要求を実現するために必要な成果物、および、その成果物について

受注側と発注側で合意した納品検収条件である。

そのため要件定義とは上記を決める工程である。

3.要件定義でやるべきこと

要件定義は開発プロセスの中でも上位の工程になります。

f:id:peaceWalker:20200120000054p:plain

要件定義をおろそかにすると後の工程である基本設計が立ち行かなくなるので

スケジュール遅延を発生させる要因になります。

それに設計工程で気づいた場合はまだ良いのですが、設計時に問題があることに

気づかず毎日定時で帰って順調な様に見せて実装やテストで問題が見つかると…

炎上間違いなしです!

f:id:peaceWalker:20200120000712j:plain

ここで話を戻しますが要件定義では何をどこまでやるべきなのか?

まとめるべき要件は、機能要件非機能要件がある。

 ■機能要件

  ・UI(User Interfaceの略、代表的なものに画面がある)

   どのような画面が必要でどのような振る舞い(操作)をするのか詰めておく

  ・機能

   必要な機能の一覧が網羅されており一覧化されていること

  ・データ

   データパターンを整理した上でデータベースに必要な項目を網羅しており、項目単位で説明の資料が作成できていること

 非機能要件については多岐に渡るため、WikiPediaのリンクを貼っておきます。

 → 非機能要件 - Wikipedia

UIと機能については普段の業務でもやるべきことを出来ていた感はあるが

データについてはここまで出来ていなかったような気がする。

要件定義の段階ではデータの流れを大まかに決めてデータパターンの整理は設計工程で行っていた節がある。しかしよく考えるとデータパターンが整理されていないと必要な機能の全量も挙げきれないため、後から機能追加になる可能性もある。

また、内容によってはデータベースに項目追加が発生する可能性もあり、DBレイアウト変更を伴うとスケジュール遅延の要因になる。このことから要件定義の段階でデータパターンの整理までやるべきである。

4.要件定義で大事なこと

要件定義をする上で大事なことは何でしょうか?

予算と納期から出来るだけ顧客の要求を実現するに越したことはないが

たまに何でこんな画面の導線になっているのか?使いにくそうな画面だな~とか

思うことがあります。

発注者の要求をヒアリングして要件定義を行いますが中にはイケてない要求が出てくることがあります。その要求にどれだけの思いがあるのかヒアリングした上で、大して思いが無いようであれば代替案を提示してあげるのが重要だと思います。案は複数あるとなお良いです。捨て案①、本命②、本命案の一部採用版③といった感じで選んでいただくと本命が通りやすいです。

5.まとめ

 要件定義は開発プロセスの中でも最重要と言っても過言ではないです。

これに失敗したプロジェクトの火消しは想像を絶するものがありました。

f:id:peaceWalker:20200120005340p:plain

 

良い要件定義をして健全なシステム開発に務めていきたいです。

本記事だけでは要件定義の全てを伝えきれていないので要件定義について

さらに詳しく知りたい方は下記の書籍をおすすめします。

 

はじめよう!  要件定義 ~ビギナーからベテランまで

はじめよう! 要件定義 ~ビギナーからベテランまで

 

 ではではこれにて失礼します。

 

【情報処理安全確保支援士】part2 結果発表とおすすめの勉強方法

 

目次

    1. 結果発表

    2. おすすめの勉強方法

    3. 情報処理安全確保支援士について

    4. さいごに

1.結果発表

情報処理安全確保支援士の結果が6/20に発表されました!

結果は何と合格でした!以下はIPAのサイトで成績照会したときのものです。

IPA 独立行政法人 情報処理推進機構:情報処理技術者試験:合格発表・成績照会

f:id:peaceWalker:20180626001437p:plain

午前Ⅰは昨年の秋に別の試験で午前Ⅰを通過していたので免除でした。

午前Ⅱは自己採点通りで問題なかったですね。

午後に関しましては正直厳しいと感じていました。

特に午後Ⅱは奇跡が起きれば60行くかな~ぐらいの感触でしたが

結果午後Ⅰよりも良かったです。記述式の試験は基準が良くわからんですね。

 

2.おすすめの勉強方法

自分がやった中でおすすめの勉強方法を展開します。

 

午前Ⅱ対策

 ・以下サイトの過去問をひたすら解く

情報処理安全確保支援士過去問道場|情報処理安全確保支援士.com

 

 ちなみに平成21年~平成30年の19回分ありますが

 私は3~4年分ぐらいしか解いてませんでした。

 受験直前に取ってたメモによると以下の正解率ぐらいしか解けていませんでした。

 

f:id:peaceWalker:20180626004215p:plain 

 最新の問題から順に遡って解いて行きますが最初の内は3割~4割ぐらいしか

 解けてませんでしたが平成27年辺りを解く頃には5~6割ぐらいを

 マークしていました。6割取れてなかった問題を再度解きなおして余裕があれば

 さらに過去の問題に挑戦する感じでした。

 午前問題にはあまり時間をかけられなかったので結果、過去3.5年分しか

 出来ませんでしたが問題ありませんでした。

 

午後問題対策

 1.以下の教科書をひたすら読む。分からないところはすぐに調べる。

  上の教科書は本当に良書でした。内容もとても濃いです。

 この本に書いてあることをすべて理解し、自分の言葉で説明できる人は

 それだけで試験に合格できる知識があると言えます。

 

 2.記述式問題に馴染みが無い人は以下の教本で記述問題に慣れる!

絶対わかる情報処理安全確保支援士 2017年秋版

絶対わかる情報処理安全確保支援士 2017年秋版

 

 ただ読み進めているだけで何か問題が解けているような気分になります。

 でもこれ読むだけじゃ絶対に解けるようにはならないです。 

 

 3.問題のお決まりの流れを把握する

 過去問をいくつか解くと気づくと思いますが大体以下の流れの問題が多いです。

  ①問題の冒頭で既存のシステムの仕様を説明

  ②サイバー攻撃によりインシデント発生

  ③情報処理安全確保支援士が颯爽と登場

  ④脆弱性を除去するためサーバ、ネットワーク構成、権限の見直しを行う

  ⑤他の脆弱性についても調査し、問題があれば解決する

 

 4.サイバー攻撃の手法を理解する

 上記にあるようにサイバー攻撃が行われた時にシステムのどのような部分に

 脆弱性があり、どうやって解決するか考える必要があります。

 その際にサイバー攻撃がどのように行われるか理解しておけば問題を解く際に

 大きな助けになります。情報処理安全確保支援士試験の範囲で扱う攻撃手法は

 そこまで多くありません。以下は参考例です。

  ・クロスサイトスクリプティング

  ・SQLインジェクション

  ・OSコマンドインジェクション

  ・HTTPヘッダインジェクション

  ・クロスサイトリクエストフォージェリ

  ・ディレクトリトラバーサル攻撃

  ・DNSキャッシュポイズニング

  ・DoS攻撃

  ・マルウェアランサムウェア、ワーム、ウィルス、ボットなど)

  ・DNS水責め攻撃

  ・DNSラウンドロビン

  ・セッションハイジャック

  ・セッションフィクサエーション

  ・クリックジャッキング攻撃

  ・ManInTheBrowserAttack

  ・ManInTheMiddleAttack

  ・ConnectionFlood攻撃

  ・ICMPFlood攻撃

  ・SynFlood攻撃

  ・UDPFlood攻撃

  ・TCPハーフスキャン

  ・ARPポイズニング

  ・サイドチャネル攻撃

  ・標的型攻撃

 

 書き出してみると結構な数ありますね。。

 赤字のものはどんな攻撃か実際にイメージ出来るぐらい理解しておいた方が良いです

 これを踏まえて過去問に挑めば問題を読み進めながら

 注意すべきポイントが理解できるかと思われます。

 

 5.回答のお作法を身につける

 問題を理解していても記述式のため回答の作法がなっていないと

 採点されない可能性があります。

 下記の本をさっと流し読みして回答例を頭に入れておくと良いと思います。

 

 この本の後半部分に午後問題の回答のパターンがまとめてありました。

ただ、この本を最初読んだ時は構成が分かりにくく何を言っているのかよくわからん

最初は非常にストレスを感じました。記述式で何を書いたら良いか分からないと

感じた方は読んでみてはいかがでしょうか? 

3.情報処理安全確保支援士について

現状、登録料が2万かかるのと資格の維持に3年で15万かかるらしいですね。

今の段階ではメリットを感じないので登録は保留にします。

幸い、登録の期限は現状無いようなので…

4.さいごに 

このブログを始めて二つ目の資格取得となりました。

初めての高度試験合格で合格通知を見たときはかなり嬉しかったです。

資格の勉強を通じて色々な分野に興味が出てきて今は勉強したり

調べものをするのが楽しくてしょうがないです。

資格を取っても意味がないと言う人もいるかもしれませんが

その人達はあまりに視野が狭いと言わざるを得ないです。

資格の知識が確かにそのまま実務に役に立つ可能性は低いですが

資格取得をきっかけに色々なことに挑戦しようという気持ちになれたのが大きいです。 

これからも継続して色々挑戦して行こうと思います。以上です。

 

【Oracle - 12c SQL基礎】part2 パフォーマンスに影響を与える条件文

お疲れ様です。

オラクルブロンズの範囲でパフォーマンスについて

触れることはあまりありませんがこれも実務で役にたちますので

ご紹介したいと思います。

教本はこちらを使用しています。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

 

Distinctはあまり性能が良くない?

重複行を省いて結果を出力するのに使うdistinctですが

暗黙的にソートが行われており性能があまり良くありません。

他にもunion, intersect , minus辺りは暗黙的にソートを行っており

よろしくないです。大規模なDBで実施する場合は

本当に必要か、代替の手段は無いか考え直してみると良いです。

IN と ORのコストは変わらない?

例えば以下のSQLを発行した際の性能は変わりません。

select * from EMPLOYEE

where emp_no in ('00001', '00002','00003');

 

select * from EMPLOYEE

where emp_no = '00001' 

or emp_no = '00002'

or emp_no = '00003');

 INを使う時の注意点としては条件を1000個まで指定できるが

指定しすぎるととてつもなく性能が悪化することです。

今までの経験上、10個ぐらいまでに抑えた方が良いと思われます。

LIKEを使うときに気を付けること

LIKE文を使うときに中間一致の条件指定を行うと索引が指定されている

項目にも関わらず索引が無効になる場合があります。

SQLの性能を考える上では、ヒットする件数が全体の10%以下の場合は

索引を使用して検索を行った方が早いです。しかし条件の指定方法が

悪いと索引が使用されない場合がありますのでご注意ください。

LIKEで前方一致の条件を指定した場合

f:id:peaceWalker:20180602192507p:plain

この場合索引(index)は有効です。

(実行計画が何か分からない方はググってください)

 

LIKEで中間一致の条件を指定した場合

f:id:peaceWalker:20180602192745p:plain

上記の様にFULLスキャンになりますので表の全量を検索するため

大規模なDBでは遅くなります。

IS NULL や NOT 条件もFULLスキャン?

条件の性質上、表の全量を検索しなければならないためFULLスキャンになります。

どうしても使わなければならない条件なのか検討した上で使うようにしましょう。

暗黙的なデータ型変換は索引(INDEX)が効かない場合がある?

条件を指定する際にはデータの型を合わせるようにしましょう。

データ型を合わせた場合

f:id:peaceWalker:20180602201641p:plain

VARCHAR型のデータに対してNUMBER型の条件を指定した場合

f:id:peaceWalker:20180602201709p:plain

これもFULLスキャンになりました。条件を指定する際はデータ型を意識しましょう。

 

表結合時に表接頭辞を指定するとパフォーマンスが良くなる?

例えば複数のテーブルを結合して結果を取得する際に

select するカラムをどの表から取得するか指定すると

わずかですがパフォーマンスが向上するとのことです。

 

SQLを作成する上でパフォーマンスは意識しなければならないですが

かなり高度な知識が必要となります。

※オラクルゴールドで取り扱う内容がほとんどだと思われます

 

パフォーマンスについて書かれている良い記事がありましたので

こちらも参照してみると良いかもしれません。

津島博士のパフォーマンス講座

 

ではでは

【Oracle - 12c SQL基礎】part1 実務で役に立ちそうなSQL

お疲れ様です。

SQL基礎の教本を一通り読んだところですが

実務で使いそうなものをピックアップしました。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

 

基本的なselect, insert, delete, update辺りは言わずもがななので省略

 

1.表構造の表示 DESC (DESCRIBE)

f:id:peaceWalker:20180529013037p:plain

column名とか忘れたときに確認するのによく使いますね。

 

2.テーブル名確認 table_name  like文

f:id:peaceWalker:20180529013324p:plain

テーブル名を微妙に忘れたときなんかに使います。

where句でtable_nameを条件に入れないと環境によっては膨大な数Hitして

探してたやつが見つからないこともあるので注意

 

3.文字列の間引き substr 

f:id:peaceWalker:20180529014629p:plain

上記ではempnoの上位2桁を省いて表示しています。

一例として挙げましたが実際は上記の様な使い方をするよりも

PLSQLで入力データから文字列を取得するときによく使います。

 

4.NULL値を別の値で表示 nvl

f:id:peaceWalker:20180529015957p:plain

enameがnullの場合に名無しさんを表示しています。

どこかのプロジェクトであるカラムにnot null制約が張られていなかったため

Null と 0 が混在して上手く計算できないときに使ったかも

 

5.重複行の削除 distinct

f:id:peaceWalker:20180529020824p:plain

田から始まる2文字の苗字を抽出。distinctで重複を削除しています。

大きいプロジェクトに来てから重複レコードを懸念することが無く

distinctを使う機会はほとんどなくなりました。それにdistinctはソートも

するので性能も良くないとか何とか…

Group By や Havingに至っては業務で使ったことが無いですね。

 

6.表結合 Oracle独自結合構文

f:id:peaceWalker:20180529022708p:plain

testtableとtesttable2をempnoで結合しています。

join文よりも上記の結合が分かりやすく使っていました。

ただこちらも大きいプロジェクトでは使うことがほぼないですね

 

他にも結合の手段として副問い合わせ何かも使っていたような気がします。

以上です。

【Oracle - 12c SQL基礎】part0 勉強方法

お久しぶりです。

情報処理安全確保支援士の続報を書かずに1か月以上放置してました。

日々の業務やプライベートの方も色々あり更新をおろそかにしてました。

情報処理安全確保支援士の結果が発表されるのが6/20なので

結果が出たら記事にします。(午前Ⅱは自己採点で80点でした)

 

表題の話に戻りますと今度はSQLの勉強をしてみることにしました。

仕事でSQLを書いたりレビューしたりすることが月に2,3回ぐらいは

あるのですがちゃんと勉強したことが無かったのでやってみようかと

 

 

表題資格の試験範囲は以下のサイトに書いてある通りです。

https://education.oracle.com/pls/web_prod-plq-dad/db_pages.getpage?page_id=5001&get_params=p_exam_id:1Z0-061-JPN&p_org_id=70&lang=JA

 

教材はamazonの評判からこちらを選択しました。

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

【オラクル認定資格試験対策書】ORACLE MASTER Bronze[12c SQL基礎](試験番号:1Z0-061)完全詳解+精選問題集(オラクルマスタースタディガイド)

 

教材を読みつつ、ping-tの無料コンテンツで問題集を解いていくスタイルでいきます。

ping-t.com

 

教材と試験範囲を一通り見ましたが、

今の仕事ではほとんど使わないようなものばかりですね。

 (そもそもDBのメンテとか環境構築は対象外ですし…)

SQLの四則演算や単一行関数(upper,lower,initcapなど)は知らなくても

業務に支障をきたすことは一度もありませんでした。

 

最低でもselect, delete, update, insertが書けて、

in , like, isnull, <>,辺りを理解していれば何とかなりました。

以前の現場では副問い合わせ辺りも多用していました。

 

正直今の仕事をする分にはそこまで必要には感じていないのですが

SQLのパフォーマンスやチューニングの話になった時に専門の知識が無いと

辛いと感じることがあります。

SQL基礎ではその辺はあまり学べないかもしれませんが

今後勉強する中で役に立ちそうなものがあれば紹介したいと思います。

 

以上です。