======== 練習問題 ======== この練習問題は、Asakusa Frameworkへの理解を確認すること、このチュートリアルで紹介していない機能について学ぶこと、 :asakusafw:`[Asakusa Framework documentation] ` の読み方に慣れることなどを意図しています。 練習問題の回答は用意していませんが、ここに挙げている問題に取り組むことでAsakusa Frameworkに対してより深い理解が得られると思いますので、是非チャレンジしてみてください。 各バッチアプリケーションを作成したら、テストドライバーで動作を確認したり、YAESSを使って実際にバッチアプリケーションを実行してみてください。 .. todo:: 練習問題案 * Direct I/O で 入力ディレクトリを変更するための設定。profile設定に組み込む。 * データモデルクラスのパッケージ名を変更 練習問題 1 ========== 1つのCSVファイルを読み込み、そのままの内容をCSVファイルに出力するバッチアプリケーションを作成しなさい。 ヒント ------ * 演算子は不要です。 * データフローの入力は、以下のようにそのまま出力に接続することができます。 .. code-block:: java final In input; final Out output; ... @Override protected void describe() { output.add(input) } 応用問題 -------- * 出力ファイルの並び順を指定しなさい。 * データの内容に応じて出力ファイル、またはディレクトリを分割しなさい。 練習問題 2 ========== CSVファイルを読み込み、レコードの内容によって出力ファイルを振り分けるバッチアプリケーションを作成しなさい。 例えば、ある項目が同じ値をもつレコードごとに振り分ける、数値の大小によって振り分ける、など。 ヒント ------ いくつかの実現方法が考えられますが、以下にその一例を紹介します。 * 分岐演算子を使って、データフロー内で振り分ける。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - 分岐演算子 ` * 抽出演算子を使って、データフロー内で振り分ける。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - 抽出演算子 ` * Direct I/O の「出力ファイル名のパターン」を使って、プロパティの内容からファイル名を生成して出力する * :asakusafw:`[Asakusa Framework documentation] - Direct I/O ユーザーガイド - ファイルを出力に利用するDSL ` これらの機能はそれぞれ実現できることや用途が異なるので、その違いについても考えてみてください。 応用問題 -------- 振り分けたの出力のうちの1つを出力から除外しなさい。また、除外したレコードの内容をログに出力しなさい。 練習問題 3 ========== あるデータモデルに対して、レコードがもつ複数のプロパティを使った集計を行うバッチアプリケーションを作成しなさい。 例えば :ref:`example-app-data-schema-sales_detail` に対して「数量」×「販売単価」の合計を求めるようなアプリケーションです。 ヒント ------ いくつかの実現方法が考えられますが、以下にその一例を紹介します。 * 畳み込み演算子を利用する。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - 畳み込み演算子 ` * グループ整列演算子を利用する。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - グループ整列演算子 ` また、演算子リファレンス上で上記の演算子における「性能特性」の違いについて、その意味を確認しなさい。 応用問題 -------- 集計項目の値に不正な値(例えば「数量」が0など)が含まれているレコードに対しては集計から除外して、 該当レコードを集計結果とは異なるファイル(エラーレコードファイルなど)に出力しなさい。 練習問題 4 ========== あるデータに対して訂正情報を一括で反映するようなバッチアプリケーションを作成します。 対象データと訂正情報をキーで結合して、訂正情報が見つかった対象データは訂正情報がもつプロパティで対象データを更新して「処理済みファイル」に出力し、 訂正情報が見つからなかった対象データはそのまま「処理済みファイル」に出力しなさい(つまり入力となる対象データと出力となる処理済みファイルの件数は同じになります)。 ヒント ------ いくつかの実現方法が考えられますが、以下にその一例を紹介します。 * マスタつき更新演算子を利用する。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - マスタつき更新演算子 ` * グループ結合演算子を利用する。 * :asakusafw:`[Asakusa Framework documentation] - 演算子リファレンス - グループ結合演算子 ` また、演算子リファレンス上で上記の演算子における「性能特性」の違いについて、その意味を確認しなさい。 応用問題 -------- 不正なキーをもつ訂正情報が含まれていることを想定して、対象データが見つからなかった訂正情報を「訂正エラーファイル」に出力しなさい。