ひしだまの変更履歴

ひしだまHPの更新履歴。
主にTRPGリプレイの元ネタ集、プログラミング技術メモと自作ソフト、好きなゲームや音楽です。

現場で役立つシステム設計の原則

2017-07-09 18:51:38 | プログラミング

現場で役立つシステム設計の原則』が話題になっていたので、(流し読み程度だけど)読んでみた。

基本的にはJavaがベースで、前半(というか最初の2章くらい)はコーディングレベルの話、残りはオブジェクト指向ベースの設計方法の話。

あ、ちなみに自分は最近はAsakusa Frameworkというバッチフレームワークを使う仕事が多いのでバッチ寄りの考え方で読んでいるけど、本書は基本的にウェブ寄り(Spring Framework)の思想っぽい。


コーディングレベルの話はとても納得。Javaでプログラミングする人は全員これを確認しておくべきという感じ。

(とても細かいレベルの事を言うと、if文の処理部分は波括弧で囲んだ方が(余計なバグが入る余地を減らせるので)いいと思う。ただ、書籍なので、行数を減らすために波括弧で囲んでいないのかもしれない)
(p.60でenumの列挙子が小文字なのはJavaの慣習からすると違和感がある。ただ、これもそういうコーディング規約だというなら、それでいいかも)

p.32の値を扱うための専用クラスを作る話とかは、理想はその通りだと思うんだよね~。java.timeなんかはそういう思想っぽいし。
ただ、Javaだとそのクラスを使った演算とか書くのが面倒なんだよねorz(c = a.plus(b)みたいな)
Scalaだと+等の記号を使った演算子が定義できるけど、実行速度はプリミティブ型よりは落ちる気がするし…。
(こういうのが得意なプログラミング言語はそろそろ有りそうな気はするけど、聞いた事は無いな…)

p.75の「データクラスが広く使われているのはなぜか」では、StrutsやJ2EEを真っ向からdisっていて、すげー!って感じ(笑)


後半からは設計に関する話になっていく。
クラス設計だけではなく、DBのテーブル設計や画面設計、Rest APIの話題まである。

ただ、この辺りから自分の常識とは違う内容が多くなってきて、戸惑う。
ただ単に自分の頭が固くなって受け入れられないだけなのか。別の人の評価を聞いてみたいところ。

p.137の「用語集が育っていく」という話は超同意。
初めて入るプロジェクトでは、まず用語集を確認するし。(と言っても、用語集が作られているプロジェクトなんてほぼ皆無だけど(苦笑))
そして、プロジェクトが進んで業務理解が深まってくると、用語もきちんと分かってきて、メソッド名とかクラス名とかシェル名を直したくなる(爆)
(余談だけど、AsakusaFWでは、処理(フロー)の為のメソッドをvocabulary(語彙)と呼ぶ。これは業務用語を意味し、「フロー上は業務用語を使って処理を記述する」という思想の表れだと思う)

6章のデータベースの設計は、一番戸惑いが多い。
本来なら、理解できない所ほどちゃんと読むべきなんだけど、流し読みしかしてないせいか^^;

p.183の取り消しデータの作成って、履歴系のテーブルならそうかもしれないけど、マスター系もそれだと、最新の情報を取得するのが面倒になるのでは? プライマリキーにも履歴項目が増えそうだし。

p.184のカラムの追加はテーブルの追加でって、恐ろしいな^^;
パフォーマンスの悪影響は大きそうだし、そのテーブルを使うアプリケーションの修正もカラム追加より大きくなるのでは?
虚データを入れないようにするという事自体はとても正しいと思う。本来は追加したカラムに移行データとして何らかの値を入れるべきで、ただ、そう出来ないケースの事を考えているのだと思うけど。追加したカラムのnullチェックの代わりにテーブルの有無チェックが入るだけだろうから、全般的に利点があまり感じられないっす。
自分はDBのテーブルもオブジェクト指向のクラスと同様に「責務」があると思っていて、本来その責務の範疇のカラムなのに、値が無いかもしれないから別テーブルとする、というのは、どうかなーと思う。

p.186のUPDATEを使わずDELETE/INSERTにするというのも、最初はえーっ!と思ったけど。
DBMSによってはパフォーマンスが違うだろうし、DBMSによってはUPSERT(MERGE文)という構文があったりするし。
ただ、よく考えてみると、AsakusaFWだとDBアクセスはDELETE/INSERTが基本なんだよね。
というかバッチなので、テーブルから全対象データをバルクリード(SELECT)し、処理をメモリー(あるいはシンプルなファイル)上でまとめて行い、結果をバルクロード(DELETE/INSERT)する。
本書はたぶんウェブ想定なので、プライマリキー毎にDELETE/INSERTであって、AskusaFWの使い方とは違うだろうけど。

とかくDBアクセスはボトルネックになりやすいので、自分としては、どうしてもパフォーマンスのことが先に来てしまう^^;
パフォーマンスのことを気にしないなら、表面上はオブジェクト指向のクラスに載せて、いくらでも綺麗にコーディングできるんだよねぇ。(そしてN+1問題とか発生するorz)
(AsakusaFWを使うようになってからは、DBアクセスは最初と最後のバルク処理だけ済むので、とても楽になったw)

7章の画面(ウェブ)で印象的だったのは、p.215 HTMLのclass属性の値を決めるのがドメインオブジェクトだ、というところ。
画面を作る責務を担うオブジェクト、だったらHTMLの内容をいくら持っていても全く違和感ないんだけど、そういう事なのかな?

8章のアプリケーション連携では、Rest APIについても触れられていた。
Rest APIはあまり携わった事が無いんで何とも言えないんだけど、p.259の日付の話はダウトな気がする。
そもそもRest APIは人間が見るものではない(JSONだから見ようと思えば見られるけどさ)と思うので、日付は世界標準の形式で出力した方が良いのではないかと思う。
(人間が見られる形に変換するのは、Rest APIでデータを取得した側の責務では?)
少なくとも、年月日であればタイムゾーンは関係ないというのは、違うんじゃないかなぁ。(日本でしか使わないRest APIなら、それでいいのかもしれないけど)

9章の開発プロセス、p.276のソースを第一級のドキュメントとして活用する話は、下手すると物議を醸しそうですなぁw
(自分も『設計書は必要』ってブログを書いた事があるしな~w)
実際、顧客に見せる/同意を取る為のドキュメントを除けば、基本的にはソースとソースの説明書(ソースで表現しきれない部分を補う)があれば事足りる、というか、楽だよねぇ。
本書では打ち合わせでホワイトボードに書いた内容は写真で撮っておけばいいじゃんみたいな感じっぽいので(たぶん語弊有り^^;)、そういう面まで含めて考えているのかなぁ?
(ちなみに、今の自分の仕事ではホワイトボードの写真を見せられることが結構あるんだけど、写真だけで説明が無いと、その打ち合わせに出ていなかった人には伝わらない事の方が多いですよorz)

以上、なかなか刺激的な本なので、ぜひ他の人の感想を聞きたいw

 

コメント
この記事をはてなブックマークに追加

2017春アニメについて一言

2017-07-02 23:28:11 | Weblog

2017年4~6月期のアニメの感想。

今期は粒揃いというか、見るのが楽しみなものがとても多かった。
特にSFが多かったのが嬉しい。
SFは、現実と異なる法則があって、それがある事によるメリット、デメリット(および、それに伴う人物たちの葛藤)、最終的にどう解決するか、というのが上手いと面白い。これに謎解きと意外性があれば完璧。

  • 正解するカド
  • サクラダリセット
    • 淡々と語っていく雰囲気が良い味を出している。
  • ID-0
    • クイズも面白かったw
  • アトム ザ・ビギニング
  • 龍の歯医者
    • ぜったい続編ありきで作られてるよね、これw
  • MONSTER
    • とうとう完結。長い時間かけてじっくり作られたのはとても良かった。
  • リトルウィッチアカデミア
  • ソード・オラトリア
    • 続編はよ!
  • 夏目友人帳 陸
    • 夏目友人帳は前から面白そうだと思ってたけど、シリーズが多くて、今回初だった。
  • Re:CREATORS
    • 異世界転生の逆みたいなの、面白い。
  • アリスと蔵六
  • 進撃の巨人season2
  • GRANBLUE FANTASY
  • ゼロから始める魔法の書
  • 終末なにしてますか?忙しいですか?救ってもらっていいですか?
  • 王室教師ハイネ
  • 有頂天家族2
    • 有頂天家族って全く存在を知らなかったけど、独特のノリが面白かった。
  • サクラクエスト
  • フレームアームズ・ガール
  • ひなこのーと
  • エロマンガ先生
    • タイトルよくない(勘違いする)だろw
  • 銀の墓守り
    • ゲーム世界に突入するまでは退屈だったが。
  • TO BE HERO
    • 汚い絵だと思ったけど、意外に面白かった。

あと、再放送で『ノーゲーム・ノーライフ』をやってたけど、これ本当に良いよなぁ。特に10番目の盟約最高!
昔途中から見た記憶があるんだけど、今回最初から見られて良かった。最近全然映画館に行ってないけど、これの映画は見たいなぁ。


  • ロクでなし魔術講師と禁忌経典
  • ツインエンジェルBREAK
  • 武装少女マキャヴェリズム
  • 笑ゥせぇるすまんNEW
    • なんで今どき笑ゥせぇるすまん^^;
  • つぐもも
    • TRPG同好会が出てきたのは高評価w
  • sin七つの大罪
    • マガジンで連載されてるやつかと思ったら、全然違ったよ^^;

  • 月がきれい
    • 恋愛物なので、見なければ良かった。オタクに倣って早々に切るべきだった。見ているだけでストレスになる。なんでストレスを感じてまでアニメを見なきゃならんのかって、しみじみ思った。
    • 電灯の紐にパンチするの、自分が中学生の頃もやってたわ~
コメント
この記事をはてなブックマークに追加

M3BPドキュメントのURLが変わってた

2017-06-04 02:01:39 | PG(分散処理)

Asakusa FrameworkM3BPのドキュメントのURLがいつの間にか(ディストリビューション化されたAsakusaFW 0.9.0から?)変わってた^^;
旧:http://docs.asakusafw.com/asakusa-on-m3bp/latest/release/ja/html/
  http://docs.asakusafw.com/asakusa-on-m3bp/0.1.3/release/ja/html/
新:http://docs.asakusafw.com/latest/release/ja/html/m3bp/
  http://docs.asakusafw.com/0.9.0/release/ja/html/m3bp/

コメント
この記事をはてなブックマークに追加

AsakusaFWでXMLファイルを読み込む方法

2017-05-22 04:42:05 | PG(分散処理)

Asakusa FrameworkXMLファイルを読み込む方法を考えてみた。

JavaでXMLファイルを読み込むライブラリーはいくつかあるが、AsakusaFWで使うにはStAXが向いている。

ただし、ファイル分割は出来ない(というか非常に面倒な)のと、タグがネストしていて内側の個数が不定のような場合はデータモデルをどうすればいいか等の問題があるため、AsakusaFWでXMLファイルを汎用的に扱うのは難しい気がする。

コメント
この記事をはてなブックマークに追加

AsakusaFW 0.9.1 formatted text

2017-05-01 11:28:10 | PG(分散処理)

2017/4/26にAsakusa Framework0.9.1がリリースされた。→リリースノート
ドラクエ10の大型アップデート(ver 3.5中期)と同じ日だったからDQ10を優先したので
今回は大きな機能追加が多かったので!試すのにちょっと時間がかかった!

まず、Direct I/Oのformatted text。これはcsvやtsvといったファイルの汎用的なもの。
従来のdirectio.csvより実行速度は若干劣るが、設定できる項目が豊富。項目数が不定(可変)のcsvにも対応している。
(これに伴い、DMDLに新しい文法(escape_sequenceの設定で使うマップ形式)が追加されているので、DMDL EditorXの対応しなきゃ…今のままだと、その文法がエディター上でエラーになってしまう)


Operator DSL関連では、StringOption(およびOption系共通のValueOption)やStringOptionUtilにメソッドが加わっている。

大きな変化として、GroupSortとCoGroupで、Listの代わりにIterableで入力を受け取れるようになった。(これはドキュメントには書かれていない模様)
それに伴い、@Once@Spillというアノテーションが追加になっている。 

それから、Operatorのテストで使うMockResultを生成するユーティリティーが加わった。→OperatorTestEnvironment#newResult

フローのテストでは、ファイルを直接読み込む機能が追加された。
Excelファイルで入力データや検証データを書く代わりに、直接csvファイル等を使うことが出来る。


M3BP関連では、アクセス方式nioの2GB制限が無くなった。
今までは結構当たり前のようにunsafeに変えてたけど^^;、今後はnioのままで良さげ。

あと、今までコンパイルにgccを使っていた(もしくは使ってなかったけど設定は必要だった?)のが、不要になった。(g++のみになった)
Windows上でコンパイルする為の自分の手順ではCMAKE_C_COMPILERを指定してたんだけど、これが不要になる。(付けたままだと警告が出る。警告なだけなので無視すればいいけど)


最後に、まだincubatingな機能だけど、GroupViewというものが追加されている。
これは従来のDirect I/O APIのようなもので、Update等の各演算子から他のデータを読めるもの。たぶんこちらが正式機能になると思われる。
コーディング方法もテストの記述方法もDirect I/O APIよりすっきりしている。
フローの結線にもデータが現れるので、「フローに無いのにデータを使ってる…」といった誤解も無くなるだろう。

早く正式機能にならないかなw

 

コメント
この記事をはてなブックマークに追加

AsakusaFW GroupSortのレコードを補填する例を訂正

2017-04-25 21:18:58 | PG(分散処理)

Asakusa FrameworkGroupSortのレコードを補填する例を訂正。

Resultにaddするデータモデルインスタンスをそのまま使い回していたんだけど、
addするとインスタンスの内容は破壊(変更)されることがあるので、毎回初期化する必要がある。

昔はそれを知らなかったので、古い例だとそういうコーディングをしてることがあるんだよな~orz 

コメント
この記事をはてなブックマークに追加

Java本格入門

2017-04-15 17:23:06 | PG(Java)

dentomoさんから『Java本格入門』を頂きました。ありがとうございます。
(著者は谷本心さんを始めとするAcroquest Technology株式会社の方々ですが、編集がdentomoさんのようです)
なんと、p.436の参考文献に、そうそうたる本に混じって自分のウェブページのURLが載っています! うわ~嬉し恥ずかしw
(「この本を読んだ人たちが次に参考に出来るサイト」という意味かなーと思ったら、書いた人が本当に参考にしていたみたいです^^;)

このJava本格入門、入門の名の通りJavaの基本的な文法も扱っていますが、そこからさらに、よく使われるライブラリーやJavaで開発するために知っておいた方が良いこと(デザインパターン・ログ出力・JUnit、果ては例外の使い方やマルチスレッドに関する注意点・Checkstyle/Findbugs等)についてまで載っています。
まさに仕事でJavaを扱う人なら知っておいて欲しい内容です。
(まぁ僕自身はFindbugsとか使ってないんですが(爆)、例えばAsakusa Frameworkのソースはそれでチェックされています) 

本書のJavaのバージョンはJava8ですが、従来のバージョンで普通に使われていたライブラリーも新しいライブラリーも載っています。例えばFilePathDate/CalendarDate and Time APIなど。
各章のコード例や末尾に載っている応用に関する話題等も参考になります。例えばp.145のConcurrentHashSetの件とか知りませんでしたし、p.171のmapToObj(i -> "?")も、なるほどiを無視する使い方もあるか!と思いました。

また、あまり良くない入門書だと「その説明だとちょっと違うんだよな~」という違和感があったりするのですが、本書にはそういう違和感がありませんでした。
レビュー陣がよほど厳しかった素晴らしかったのでしょうw

Java本格入門は、Java8を対象とした入門書としてとても良いのではないでしょうか^^

コメント
この記事をはてなブックマークに追加

2017冬アニメについて一言

2017-04-09 22:40:15 | Weblog

2017年1~3月期のアニメの感想。

今期は、アニメを録画予約しようとしたら予約数の上限を超えたので、(見たことなくても)再放送のやつはカット。シンフォギアとか(GXが面白かったので)見たかったんだけどねぇ。

  • Rewrite
    • 全シーズンからのやり直しなのでどうなるか楽しみだったが、予想外の終わり方だったけどこれもまた良し。自分の想像と違うから他人の作品は面白いのだし。
    • 主人公の生きる年代がちょっとずれて、共に行動する人が変わったのも面白かった。
  • けものフレンズ
    • 何度見ても第1話の最初の5分が一番酷い^^;これで見るのをやめた人がいたというのも頷ける。
      (動物の動きらしくない。放物運動を擬似シミュレートしたらあんな感じか?
      txを目標(かばんちゃん)のX座標、xを自分(サーバル)のX座標、aを増分(加速度相当)としたとき、z=sign(tx-x)/*相手が右にいたら+1、左にいたら-1*/; a+=z; x+=a; という感じのロジックならああなりそう(要するにバルーンファイトみたいな動き))
      (口の動きと声も合ってない。これは2話以降は違和感無くなったけど)
      スケジュールが厳しくて後の方の作成が間に合わなかったのなら分かる(ウィザード・バリスターズなんかその典型だったし)んだけど、よりによって何故先頭がこれ^^;
    • シンプルで楽しい作品ではあったけど、ここまで一般に評価が高くなったのは正直に言って謎…。
    • 舞台のジャパリパークという言葉がJavaと似ているので、ついネタに乗ってしまったw(仕事でビッグデータ関連のAsakusa Frameworkを使っているのでw)
      1. Javaリパークの歌
      2. サーバル
      3. ラッキービースト
      4. おにいさん
  • ACCA 13区監察課
    • いつの間にか陰謀に巻き込まれて最後の解決まで、流れが見事。
  • 亜人ちゃんは語りたい
    • とても良かった。
    • デミヒューマンの生態を色々考察しているのも面白かった。
  • 小林さんちのメイドラゴン
    • 良かった。
  • うらら迷路帖
    • 良かった。
  • ガヴリールドロップアウト
    • 面白かった。
    • これを長編映画化したらどうなるか、予想が出来るキャラクター達だw
  • ひだまりスケッチ×ハニカム
    • これが噂のひだまりスケッチか~
  • バンドリ
    • 良い。音楽も良いよね。
  • リトルウィッチアカデミア
    • 最初は野暮ったい(古いくさい)絵だなーと思ったけど、内容とよくマッチしている。思ってたより面白い。
  • この素晴らしい世界に祝福を2
    • 話は面白かったんだけど、絵柄が前シーズンより酷く(手抜きに)なってない?
  • 幼女戦記
    • 多少は予期していたけど、タイトル詐欺っぽいw
    • 魔法を近代の戦争と混ぜて使うという意味では終末のイゼッタと似ているけど、雰囲気が全然違うのな。
  • テイルズオブゼスティリア ザ クロス
    • 良かった。
  • スクールガールストライカーズ
    • 面白かった。
  • カオスチャイルド
    • シュタインズゲートと同じ会社の作品らしいので期待してたんだけど、猟奇的すぎるだろ^^;
    • オープニング音楽はシュタインズゲートと同じ声質ですぐ分かったw
  • MONSTER
    • 引き続き注視。

  • チェインクロニクル
    • むっちゃ王道っぽかった。
  • ハンドシェイカー
    • 絵はきれいだったねぇ。
  • 銀魂
  • ALL OUT
  • エルドライブ
  • アイドル事変
  • AKIBA'S TRIP
    • カードバトル(カードバトルアニメ)へのツッコミとか面白かったw
    • CMもお約束をひねっていたり、こういうノリも嫌いじゃないw

  • TRICKSTER
    • 前シーズンに比べて暗いっつーか、あんまり後味良くなかったなー。
  • 霊剣山 叡智への資格
    • 絵柄が変わって続編だと認識できなかった。性格も酷くなってるし。(すぐ「殺す」とか言い出して。仙人のイメージが全然違う)
    • 前シーズンの前半はアイデアで勝負する感じで面白かったのになー。全シーズンの後半から、この作品はどこへ向かおうとしているんだろう?という感じだった。
  • スピリットパクト
    • BL好きな人向けか?
  • 風夏
    • 音楽は格好良かった。
  • 正宗くんのリベンジ
    • やっぱ恋愛物は苦手だわ。
コメント
この記事をはてなブックマークに追加

embulk-parser-poi_excel 0.1.6 セルのキャッシュ値の取得

2017-01-28 17:04:05 | PG(分散処理)

きっかけは、Embulkで新しくExcelファイルを読もうと思ったら、プラグインが固まった(ように見えた)こと。
(超どうでもいいが、「きっかけは」って書くと、LINDBERGのLITTLE WINGが頭の中で始まるw)

トレースログを埋め込んで(自分で作ったプラグインだから、何とでもなるw)見てみたら、セルの数式の計算でやたらと時間がかかっている。1セル7分。おいおい(汗)
SUMIFのような関数で列全体とかが指定されていると、1行目~1,048,576行目までの全てを探しに行く実装になっているようだorz 関数がネストしているような“神エクセル”だと、そりゃ遅いわ…。
(POIでは実データの有る最大行数は取れるんだから、それを考慮してくれればいいのに(苦笑))

まぁPOIの実装は置いといて、Excelでファイルを開いたときは値が表示されているので、これが取れればいいのになぁと思って試しにPOIで値を取得するメソッドを呼んでみたら、取れたし!
後はその値がどの型(数値か文字列か)が分かる方法があれば…と思ってCellクラスを眺めてみたら、ばっちりgetCachedFormulaResultTypeというメソッドがあった!これは知らなかった。。
計算の結果がキャッシュされていないExcelファイルではどうしようもないだろうけど、とりあえず今回の目的にはこれでOK。

という訳で、embulk-parser-poi_excelプラグインに、キャッシュされている値を取得できるようにするオプションを追加した。

ついでに、シート名の指定でワイルドカードを使えるように修正。 

コメント
この記事をはてなブックマークに追加

Embulk xlsxファイルプレビューの注意

2017-01-27 23:55:06 | PG(分散処理)

Embulkembulk-parser-poi_excelプラグイン)で新しくxlsxファイルを読み込もうとしたら、例外が発生
エラーメッセージがEOFExceptionでend of ZLIB input streamとのことだったので、最初はxlsxファイルが大きすぎたのかと思った。

で、別途Apache POIのサンプルを作ってそのxlsxファイルを読み込んでみたら例外が発生した。
inflate ratio(圧縮率?)のチェックに引っかかったらしい。
ただ、これをチェックする閾値は設定できるので、問題解決!

と思ったのだが、よく見るとエラーメッセージが全然違う(汗)

WorkbookFactory.createメソッドでxlsxファイルを読み込むのだが、引数がFileのメソッドとInputStreamのメソッドでは挙動が違うらしい…。
Embulkのxlsxファイルを読み込むプラグインではInputStreamを使う方式なのだが、ratioのエラーになるのはFileを使う方式だけで、InputStreamを使う方式だとエラーにならなかった。
Embulkでも、previewだとエラーになるが、同じファイルをrunで読み込むとエラーにならない。

ということは、EmbulkとPOIの相性の問題と思われる。
プレビューだから、ファイルの全データを読み込んでいないのではないかと思う。
しかしxlsxファイルはzip圧縮されている形式なので、先頭データだけでは解凍できない^^;

まぁプレビューだけの問題だから、注意喚起だけでいいかな~。

(追記)他のプラグインでも同様の問題が起きているらしい。previewだと32kBしか読まないそうで。
previewでも全データを読むように修正されるなら、この問題も解決しそう。

コメント
この記事をはてなブックマークに追加