キーノート:マークアップエンジニアのキャリアパス
by森田 雄
- 「マークアップエンジニア」という肩書きはオレが作った!
- 採用情報での募集職種がきっかけ
- それ以前は「HTMLコーダー」だった
- 2,000年以前のマークアップエンジニア
- HTMLを書くのは誰でもよかった
- とほほのWWW入門
- W3C信者(講演者含む)が炎上させた。へー。
- 当時のHTMLの仕事=「HTMLはデザインの再現」=誰がやってもできる作業
- 「HTMLは意味付けだ」
- マークアップエンジニアの職能
- 11項目あれもこれもどっさり
- 海外:たんぽぽ事件なるものがあった
- HTMLとCSSしか書けない奴はだめだ?→それはHTMLコーダーとさえよべない
- 上流工程(プロデューサー、プランナー)へいく
- 右へずれる:専門性を上げる(フロントエンドエンジニア)
<感想>
基調講演のはずだけど、ぐだぐだで「オレ昔から業界にいてエライ☆」以外よくわかりませんでしたよ…。今回LP9のタイトル「Coder's Higher」のタイトルにあっていなくてテンション下がりました。
りんごパッケージとサブパッケージの関係は「赤の他人」
eclipse上で、パッケージ「pkg」があるときに、サブパッケージ「pkg.sub」を作成します。
すると(Windowsの)エクスプローラではフォルダpkgの中にフォルダsubが作成されています。
…が!Javaプログラム上はsubがpkgのサブパッケージであるというような親子関係は認識しません。
つまり…
- ファイル構造はpkg/subになる
- プログラム記述上はpkg.subとなる
一方で
- 「pkg」と「pkg.sub」の間には、superで親を指すとか、
変数のスコープが子にもおよぶといったプログラム上の「親子関係」はまったく存在しない。
「pkg」と「pkg.sub」の関係は、「pkg」と(無関係な別パッケージ)「pkg2」の関係と同じ。
eclipseのパッケージエクスプローラで、サブパッケージがいわゆるサブフォルダのように表示されないのはそんな理由でした。
privateなコンストラクタの使い道
コンストラクタにもprivateがつけられますという話がありましたが
コンストラクタってインスタンス生成時に自動的に呼び出されるんでしょ?
privateつけたらインスタンスつくれないじゃん?
- staticフィールド・メソッドのみのクラスを作成した際にインスタンスの生成を禁止する
http://blogs.yahoo.co.jp/sister_ray999/16812136.html
→コンストラクタにはprivateをつけて、メソッドからインスタンス生成する
http://www.sk-jp.com/java/pattern/singleton.html
…といった場合に使うワザのようです。
キャッチ☆ザ☆例外 〜例外のスローとExceptionのサブクラス
(しばらくJava勉強メモになります)
Word君の例外処理について
まとめ
投げた例外はかならずキャッチしよー!
問題
「作成したWord君には例外処理対策がされていません。メニューの該当番号以外を入力した場合や番号以外を入力した場合の例外処理を記述してください。本例外を示すクラスとして、NoNullExceptionクラスを作成すること」
考察
- A:数字以外:Integer.parseInt(str)でNumberFormatExceptionが発生
- B:メニューの該当番号:1,2,3以外はエラー扱いにする
処理内容
A:数字以外:Integer.parseInt(str)でNumberFormatExceptionが発生
→「入力されたstrをint型にキャストして、proc()にわたす」部分をtry-catch処理
User.java
// 入力された数字を引数としてワード君へ String str = br.readLine(); try { int no = Integer.parseInt(str); boo = wk.proc(no); } catch (NumberFormatException e) { System.out.println("ちゃんと番号えらんでよ。"); }
B:メニューの該当番号:1,2,3以外はエラー扱いにする
→1-3でなかったらNoNullExceptionクラスの例外をスロー&キャッチする処理を、proc()内switchでメニュー処理を振り分ける前に追加
ミニマムに書くと…
WordKun.java public boolean proc(int no) throws NoNullException, IOException{ boolean boo = true; // 1-3でなかった場合 if(no < 1 | 3 < no){ try{ throw new NoNullException(); }catch (NoNullException e) { System.out.println("ちゃんと番号えらんでよ。"); } } else { // 1-3 の場合各処理 switch(no){ case 1: (以下略) break; } } }
もちろんおなじtry-catchにまとめる
User.java
// 入力された数字を引数としてワード君へ String str = br.readLine(); try { int no = Integer.parseInt(str); boo = wk.proc(no); } catch (NumberFormatException e) { System.out.println("ちゃんと番号えらんでよ。"); } catch (NoNullException e) { System.out.println("ちゃんと番号えらんでよ。"); }
さらにException1つまでまとめてキャッチしてもよいかも。
// 入力された数字を引数としてワード君へ String str = br.readLine(); try { int no = Integer.parseInt(str); boo = wk.proc(no); } catch (Exception e) { System.out.println("ちゃんと番号えらんでよ。"); }
わしがはまったところ
Exceptionのサブクラスとして作成したNoNullExceptionをスローする処理を考える。
- A: catch(NoNullException, e)でキャッチ:OK
- B: catch(Exception, e)でキャッチ:OK,スーパークラスでもキャッチ可能
- C:Exceptionってデフォルト処理でしょ?書かなくてもキャッチされるのではないのか?
→例外ハンドラを記述しないでデフォルト処理にまわると、「finally処理実行→デフォルトエラー処理→終了」になって止まってしまう
まとめ
投げた例外はかならずキャッチしよー!
参考:Javaの道
http://www.javaroad.jp/java_exception2.htm
まんなかにある「例外の処理フロー」図がわかりやすいです。
例外処理の蝶きほん
例外処理をしたいケースは2つ。
- 通常だとプログラムが停止するエラーでも停止しないようにする処理
- 「負の数はエラーにする」といった独自に設定したいエラーの処理
通常だとプログラムが停止するエラーを停止しないようにする処理
→try-catchを使う
- エラーが発生する可能性のあるぶぶんをtryでかこむ
- 発生を想定しているエラーが起きた時の処理(ハンドラ)をcatchにかく
例:キーボード入力のStringをintにキャストする
String str = br.readLine(); try { int no = Integer.parseInt(str); } catch (NumberFormatException e) { System.out.println("数字をいれてよ"); }
「負の数はエラーにする」といった独自に設定したいエラーの処理
- 想定するエラーに対応したExceptionのサブクラスを作成
- 作成したエラークラスからインスタンスを生成する
- エラーにしたい条件が発生したら、エラーインスタンスを送出(スロー)する
- スロー文をtryで囲む
- 作成したクラスをキャッチするcacth文を追加する
例:負の数はエラーにする
int num = Integer.parseInt(br.readLine()); if(num < 0){ try{ throw new NoNullException(); } catch(NoNullException e){ System.out.println("数字をいれてよ"); } } else { //正の数におこなう処理 }
サンプルソースリスト
lesson5 場合に応じた処理(if,switch,論理演算子)
- Sample1 if文の基本 1が入力されたら、「1が入力されました」と表示する
- Sample2 if文の基本2 1が入力されたら、「1が入力されました」「1が選択されました」と表示する
- Sample3 elseを使う 1が入力されたら「1が入力されました」、それ以外は「1以外が入力されました」と表示する
- Sample4 else ifを使う 1を入力→1を出力、2を入力→2を出力、それ以外→それ以外を出力する
- Sample5 switch文の基本 1を入力→1を出力、2を入力→2を出力、それ以外→それ以外を出力する
lesson6 for文
- Sample1 forの基本 5回繰り返す
- Sample2 for文の中でiを使う 「繰り返しています」と5回表示する
- Sample3 応用:入力した数だけ繰り返す 入力した数だけ「*」を表示する
- Sample4 応用:入力した数までの合計をもとめる
- Sample5 while文の基本 while文で「繰り返しています」と5回表示する
- Sample5b whileの条件にsumを使う
- Sample5c 応用:よくあるwhile文 キーボードから9が入力されるまで足し算する
- Sample6 do while文
- Sample7 for文のネスト
- Sample8 for文のネスト:if文との組み合わせ
- Sample9 break文:入力した数でループを抜ける
- Sample11 continue文
- Practice4_1 for文を使用して1〜10までを表示する
- Practice4_2_a 2〜100までの偶数を昇順に表示
- Practice4_2_b 1〜99までの奇数を降順に表示
- Practice4_3 入力した5つの数字の平均を表示
- Practice4_4 指定した数の数字を入力して平均を表示
- Practice4_5 指定した数nの階乗を表示
- Practice5_1 九九の表を作成
- Practice5_2 */**/***を表示
- Practice5_3 変数nを入力。n*nの■を表示
- Practice5_4 変数nを入力。底辺nの三角形を■で表示
- Practice5_5 変数nを入力。高さnの二等辺三角形を▲で表示
- Practice6_1 数値を取得し、累計が100を超えたら終了
- Practice6_2 数値を取得し、累計する。qが入力されたら終了して合計を表示
- Practice6_3 数値を入力し、変数nと合致したらnを表示
lesson7 配列
- Sample1 配列を使う 5つの点数を表示する
- Sample2 配列を使う キーボードから入力した5つの点数を表示する
- Sample4 配列の簡単な記述
- Sample5 配列変数への代入
- Sample6 配列変数への代入の注意点
- Sample7 配列の長さを知る for文の繰り返し条件に利用する
- Sample9 配列を点数の降順にソートする
- Sample10 多次元配列
- Sample11 多次元配列の長さ
lesson8 クラス
- Sample1 フィールドを記述したクラスを利用する
- Sample2 メソッドを呼び出す
- Sample3 クラス内でメソッドを呼び出す
- Sample4 引数をとるメソッド
- Sample5 複数の引数をとるメソッド
- Sample6 戻り値をもつメソッド
- Ex_01 プロフィールを表示する
- Ex_02 プロフィールを表示する:メソッドを利用する
- Ex_03 BMI値の表示を追加する
- Ex_04 年齢、身長、体重をキーボード入力にする
- Op_01 年・月を入力して、その月の日数を表示する
- Op_02 年・月・日を入力して、1/1からの経過日数を表示する
- Op_03 年・月・日を入力して、その日の曜日を表示する
- Op_04 年・月を入力して、その月のカレンダーを表示する
- Ren04 3人の点数を入力して、昇順に表示する
- Ren05 5人の英語・数学・国語の点数について、科目の平均と個人の合計点を表示する
- Ren06 人数を入力し、人数分の成績を入力すると一覧を表示する
- Ren07 人数を入力し、人数分の成績を入力すると点数の小さい順に一覧を表示する
- Ren08 データをもとに受講生の科目得点・平均・評価を出力する
- Ren09 データをもとに客室番号を入力すると定員を出力する
- Ren10 入力された文字列を表示するメソッドを作成する
- Ren11 入力された文字列・数値を「●●は-*歳です」という文字列にして返すメソッドを作成・戻り値を出力する
- Ren12 2つの数字を入力し、num1のnum2乗の値を返すメソッドを作成・戻り値を出力する
- Ren13 日本語の曜日を入力すると、英語で出力する
lesson9
- Sample1 privateに設定したメンバ(フィールド)には外からアクセスできない
- Sample2 privateに設定したメンバの設定方法
- Sample3 メソッドをオーバーロードする
- Sample4 コンストラクタの基本
- Sample5 コンストラクタのオーバーロード
- Sample6 クラス内の別のコンストラクタを呼び出す
- Sample7 インスタンス変数、インスタンスメソッドを記述する
- Sample8 クラス変数、クラスメソッドを記述する
- Sample9 セッターメソッド、ゲッターメソッド
- Ex_05 BMI計算のプログラムのフィールド変数をゲッターセッター利用に変更する
- Ex_06 BMI計算のプログラムのすべてのメソッドにpublicをつける
- Ex_07 BMI計算のプログラムに4つの引数を一気にセットするsetProfileを作成する
- Ex_08 オーバーロードで(名前,年齢)(身長,体重)をセットするsetProfileを作成する
- Ex_09 オブジェクト生成時に4つの引数をとって値をセットするコンストラクタを作成する
- Op_01 四則演算プログラムの作成
lesson10
- Ex_10 3人分の名前・身長・体重を設定し、出力する
- Ex_11 BMI値を小数点第2位までの表記にそろえる
- Op_01 入力した文字列の先頭から3文字を表示
- Op_02 入力した文字列の「-」を「,」に置き換える
- Op_03 入力した金額に通貨スタイルを適用して表示する
lesson11
- Sample1 スーパークラスを使う
- Sample2 super()で明示的にスーパークラスのコンストラクタを呼び出す
- Sample3 修飾子protectedを使ってスーパークラスのフィールドにアクセスする
- Sample4 オーバーライド
- Sample5 親クラスの型に子クラスを代入する
- Sample6 スーパークラスの配列を利用する
- Sample6b super.でスーパークラスのメンバを利用する
- Sample7 toString()メソッドをオーバーライドする
- Sample8 equals()メソッドを利用する
- Ex_12 サブクラスProfilrBMI()を作成する
- Ex_12b 住所、電話番号を保持するProfileAddress()クラスを追加する
- Ex_13 toString()メソッドを追加する
lesson13 大きなプログラムの作成:インポート
- Sample5 パッケージを分ける
- Sample6 インポートを利用する
lesson14
- Sample1 例外の送出
- Sample2 例外の処理
- Sample3 finallyを使う
- Sample4 例外オブジェクトを代入した変数eを使う
- Sample5 例外クラスの宣言
- Op_18 プロフィールプログラムに例外処理を追加する
- Op_19 身長・体重にマイナスが入らないようにする
- Op_01 入力された文字列の前後の空白を削除
- Op_02 入力された文字列のすべてのスペースを削除
コレクション
- Sample0 ArrayListを使う
- Sample1 ArrayListに基本型を格納する
- Sample2 格納したデータを取り出してキャストする
- Sample3 自作クラスの利用
- Sample4 取り出しをforループ化する
- Ex_15 練習15の配列をコレクションに変更
- Sample5 HashMapを使う
- Sample6 格納したデータがあるかの確認
- Ex_16 入力した値をAllayList型のオブジェクトに格納する
- Ex_17 入力した年齢と性別をArrayRistに格納し、入力終了後に集計する
- Ex_18 「5-five,...,1-One」というHashMapを格納し、入力されたキーに一致するデータを表示する
- Ex_19 練習17のHumanクラスにIDと名前のフィールドを追加する
- Ex_20 自動販売機プログラム
クラスとメソッド、引数と戻り値の蝶きほん
引数・戻り値のあるなし4パターンまとめです。
Washi.java
//引数・戻り値のあるなしパターン class Washi { public static void main(String[] args) { // インスタンスの生成(=仕事を頼む相手をつくる) Hisho chiaki = new Hisho(); ///////// 1 引数なし・戻り値なし // 「1〜100まで足してコンソールに出力しておいて」 chiaki.shigotoA(); ///////// 2 引数なし・戻り値あり // 「1〜100まで足した値を教えて(出力はこっちでやります)」 int report = chiaki.shigotoB(); System.out.println(report); ///////// 3 引数あり・戻り値なし //「1〜xまで足して、コンソールに出力しておいて」 int x = 100; chiaki.shigotoC(x); ///////// 4 引数あり・戻り値あり // 「1〜yまで足した値を教えて(出力はこっちでやります)」 int y = 100; int report2 = chiaki.shigotoD(y); System.out.println(report2); } }
Hisho.java
public class Hisho { void shigotoA(){ // 戻り値なし(void) 引数なし() int sum = 0; for(int i=1; i<=100; i++){ sum += i; } System.out.println(sum); } int shigotoB(){ // 戻り値あり(int sum) 引数なし() int sum = 0; for(int i=1; i<=100; i++){ sum += i; } return sum; } void shigotoC(int n){ // 戻り値なし(void) 引数あり(n) int sum = 0; for(int i=1; i<=n; i++){ sum += i; } System.out.println(sum); } int shigotoD(int n){ // 戻り値あり(int sum) 引数あり(n) int sum = 0; for(int i=1; i<=n; i++){ sum += i; } return sum; } }