データの意味

 先日、セミナーにちょっと行ってきました。
アプリケーションセキュリティに関するセミナーでしたが、印象に残ったのが、扱うデータの意味を理解して対策を立てるのは、どんなセキュリティ対策のツールを使っても扱うのが相当困難だという点でした。
 企業内で扱うデータの意味を知っているのは、基本的に企業内SEもしくはその位置付けにある人達です。何を知っているかと言えば、具体的にはテーブルとカラム、データ項目、インターフェース設計なんだと思います。前職で一時的にホストを担当した時は、VSAMのレコードレイアウト図として紙でしか資料が残っていなかったので、エクセルのテーブル設計書に落として、把握している範囲で項目の備考欄を埋めていきました。
 備考欄に殆ど何も書かれていないテーブル設計書をたまに見かけますが、項目の備考欄こそデータの意味を記載する箇所ではないかと思います。項目名だけでデータの意味を想定するのは間違いが生まれる元ですので、どういう意味の項目であるか、どういう値が入りえるのか、他とどういう関係を持っているか、出来る限り備考欄を埋める事が、データ設計をする人としてのそのデータを扱う他者への優しさではないでしょうかね?

VFS使用時の注意事項

 前に載せたapache.commons.vfs2を使ったファイルダウンロードをテストすると問題が発生しました。テスト内容は、
1.大きなファイルをダウンロードしてみる
2.複数のブラウザから同時にダウンロードしてみる
ですが、1は問題無いものの、2は後からダウンロードした方がFileObjectからInputStream取得時に失敗しています。今のやり方だとマルチセッションに対応していないようです。
 で、ググってみると下記を発見。
 http://timurlaykov.blogspot.jp/2011_05_01_archive.html

FileSystemManager fsManager = VFS.getManager();
でなく、
StandardFileSystemManager fsManager = new StandardFileSystemManager();
fsManager.init();
に置き換えるというもの

同時アクセスといっても大量に発生する事は今回考えなくてよいので、この内容に変えました。

 しかし、ググってばかりでいいんでしょうか?VFSはオープンソースなんだから、ちゃんとソースを解析して問題を解決したいのですが、やはりプログラミングを10年近くサボっていたからでしょうか、自力だといつ解決できるのか自信が持てません。。

カテゴリー: Java

税務署への届出

先週法人登記が済んだのを確認したので、次は税務署です。
前回と同じように下記を参考にして書類を用意します。

特に届出資産は無いので、
1.法人設立届出書
2.青色申告の承認申請書
3.給与支払事務所等の開設届出書
4.源泉所得税の納期の特例に関する申請書
の4つを一応用意しましたが、いまいち書く内容が解らないまま管轄の松戸税務署へ行きました。
前回、個人事業の開業届を出して以来の税務署でしたが、その時は確か10時過ぎくらいにに行ったら税務署の職員がいろいろ教えてくれたのですが、今回は昼近くで数人待ってる人が居たので、窓口で細かい事を聞く事が出来ず、届出については上記のうち2~4は実際に給与を支払い始めるときでいいとの事、仕事の切れ目は数か月先なのでとりあえず1だけ出して他は後日にしました。別に1の届出も後日でよかったのかな?
なお、法人成りなので、個人事業の廃業届について聞いたところ、こちらは個人事業主としての仕事が終了した後で提出との事なので、結局後日来なければダメですね。
税務署前にある中華そばまるきが改装中だったので、これもまた後日。

あと、税務署に法人設立セットの書類が置かれていたので持って帰ってみましたが上記の書類と同じでした。書き方がいろいろ書いてある書類も入っていたので、無理して出さずにかえって良かったかも?

その足で次は、法人口座開設です。
登記事項証明書(履歴事項全部証明書)と会社の印鑑証明を持って、以前から使っている三井住友銀行に行きます。
窓口で開口一番「2回目ですか?」と聞かれてなんの事?という感じでしたが、口座開設の申込後2週間くらいで連絡があり、その時が実際の手続きになるので2回行かなければいけないからです。メンドクサイなあ~、って断られたらどうしよう。。

実は口座開設申込時の本人確認資料として提示した国民健康保険証が先月末で切れていて1回断られました。FAXとかでもダメというので、ちょっとクレームを言いそうになりましたが、気持ちをこらえて即、自宅へ戻って新しいのを持ってまた銀行へ行きとりあえず申込は終わりました。。

リファクタリング中にパニくる。。

現在、複数のアプリケーションを一人で同時作成しているのですが、ソースがぐちゃぐちゃになってきたので、今更ながら共通処理を別プロジェクトにまとめて一元管理する事にしました。
WebApのプロジェクトでは、ビルドパスの追加と、プロジェクトのプロパティ→Webデプロイメント・アッセンブリーで、共通処理プロジェクトを追加すればサーバ実行時に動くようになるようです。
 その後、ソースを共通処理プロジェクト側に移動させていたのですが、動作確認するとDB接続箇所で意味不明のエラーが発生し、接続できなくなってしまいました。

<2015/06/24 13時14分30秒 JST> <[ServletContext@25608288[app:OfficeAp module:officeap path:null spec-version:3.0]] Root cause of ServletException. javax.security.auth.message.AuthException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.5.2.v20140319-9ad6abd): org.eclipse.persistence.exceptions.DatabaseException Internal Exception: java.sql.SQLException: ユニバーサル接続プールを起動できません: oracle.ucp.UniversalConnectionPoolException: データソースから接続を取得できません: java.sql.SQLException: 接続プロパティ: 書式エラー: Property is 'v$session.program' and value is 'XX.XXXX.XXX.XXXXXXXXXX.common.DBConnectionManager'

他にもいろいろソースを移動させていたので、何が原因か解らなくちょっとしたパニック状態。。
数時間試行錯誤した後、エラーメッセージをちゃんと見直してみる。
v$sessionのprogramにクラス名がセットできないみたいだけど。。なぜ?

結果、パッケージ名が長くなってセット出来なくなっただけでした。。
48文字までしかダメみたい。

カテゴリー: Java

Coherence開発環境作成

これは昨年からの備忘録です。。

開発対象のインフラターゲットは、RHEL+WebLogic12 + Coherence + OracleDB 12cという構成

開発環境
Windows7, Oracle Enterprise Pack for Eclipse(OEPE Luna)
OracleDB(開発用にOracleXE)は別途インストール

WebLogicは、管理サーバ自体にアプリケーションをデプロイするようになってました。
(管理対象サーバ追加の仕方がよくわからなかったので・・)

OracleのWebからOEPEをダウンロード
インストール後、
WLSの起動時の環境設定バッチ setDomainEnv.cmd に下記を追加

↓Coherence設定ファイル等を外出しにする為、WebLogic起動時の引数として設定してます
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.distributed.localstorage=false
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.override=c:\dev\bin\tangosol-coherence-override.xml
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.coherence.cacheconfig=c:\dev\bin\cache-config.xml
set JAVA_OPTIONS=%JAVA_OPTIONS% -Dtangosol.pof.enabled=true -Dtangosol.pof.config=c:\dev\bin\pof-config.xml

set CLASSPATH=%CLASSPATH%;C:\Oracle\Middleware\Oracle_Home\coherence\lib\coherence.jar

↑Coherenceがインストールされた場所にあるライブラリを指定

インフラターゲット側では管理対象サーバで動かすので、WebLogicコンソールから上記をJVM実行引数として追加すればOKでした

カテゴリー: Java

進捗会議の仕方について

現在、筆者はある企業のあるシステムのリプレイスプロジェクトに参画していて、ある大手ベンダーが請負開発、筆者はユーザー企業側のメンバーとしてその一部機能を開発しています。

毎週、進捗会議としてその大手ベンダーが進捗説明をするMTGを2時間くらいで実施しており、その後の時間で設計レビューの時間という流れになっています。進捗会議はWBSを見るというよりも、サマリとして何の予定工数XXのうち消化はYY、予定に対してZZ遅れと言った説明する形になっています。(XXとかは人日ですね)

このような説明の仕方をしていると、このZZの遅れ以外に話題がないので、ユーザー企業から見れば何で遅れているのかを聞くくらいしかなく、ベンダー側はなぜ遅れて、どう取り戻すかを説明するようなことを毎回繰り返している事に気が付きました。

筆者としては、進捗説明後の設計レビューあたりしか感心が無いので聞き流している箇所なんですが、毎週同じようなやり取りなんだけどこれって要るの?とふと考えてしまいました。

筆者の経験上、大手ベンダーはだいたいこのようなサマリ資料を用意して進捗を説明するやり方が多いように思われますが、そもそも、おえらいさんが参加するような進捗会議でなく、システム部門の担当レベルだけが会議参加メンバーである場合においては進め方は違うのではないでしょうか?サマリ資料じゃなくWBSを見た方が、各タスクの関連とかを意識した上で指摘することもできるし、また、本当にその後に影響を与える遅れがある場合なんかは、このような進捗会議の場でそれが表面化することはほとんど発生せず、別途個別にこっそり通知されるのが殆どのケースではないでしょうかね?

ベンダーが進捗サマリ資料を毎週作成する工数が、どれだけユーザー支払工数にはねているかをちゃんと説明していますかね?その工数を理解すれば、その資料作らないでいいよって大抵なるんじゃないでしょうか?

結果的にこの進捗報告にやり方を、サマリ資料でなく、プロジェクト管理ツールから直出力されるチャートのみで簡単な説明で済ませれば、ベンダーの担当者も負担が減るし、MTG参加メンバーの時間も節約できてみんなうれしいんじゃないのかな?
筆者の立場ではちゃんと設計レビューする時間取ろうよ!後で痛い目見ますよ!というのが本音ですが。

これでうれしくないのはベンダーの営業だけだと思うんだけど。。

今どきのJavaRMI

とあるシステムのプロトタイプを去年作りました。
システム構成はAPサーバ(Weblogic)が複数台構成で、ある特定の処理を同期処理で1台のサーバだけで行わないといけないというもので、言語と実行環境はオールJAVAとの指定です。
その特定の処理を行うサーバとAPサーバ間の通信をどうしようかなと考えましたが、プロトタイプとはいえ、かなりミッションクリティカルかつ応答性能を求めるシステムで、また、拡張性や他の言語からの呼び出しなどは無視してよかったので、シンプルかつ、ミドルウェアレベルで昔から使われているRMIを採用してみました。実は最近の方式をよく知らないだけだったりしますが・・

こんな構成です。

RMI
ソース的には3つに分かれます

①インターフェースをクライアントとなるAPサーバと、「とある処理」サーバで動作させるモジュールのソースに含みます。ここでは処理要求・応答はByte配列を引数・戻りとして、クライアントからサーバへ処理要求を行います。

以下必要な処理をつらつら書いてますが省略

②APサーバ側の呼び出し部分抜粋です。

必要なのはこれだけ

③「とある処理」サーバ側のソースです

これだけでホントにシンプルです。
昔はリモートオブジェクトのエクスポートとかRMIレジストリ起動とか訳が解らないいろいろな前提があったみたいなんですが、今(使っているのはjdk1.8)ではずいぶんすっきりしているみたいです。
が、古い情報が混在していていまいち何が必要かやってみないとわかりません。

なお、「とある処理」のJVM起動時に
-Djava.security.policy=ポリシーファイル
-Djava.rmi.server.hostname=待受対象となるIP(NICが複数ある場合)
を指定しないと動きませんでした。(ポリシーは要らないかもしれない・・)

ポリシーファイルは
java.net.SocketPermission
について許可すればよかったはず。

後で負荷テストしたら秒間千件を超えるRMI呼び出しを行うと「Too many open files」エラーが多発しました。
調べたところ、Linuxのファイルディスクリプタ制限が影響していて、open filesの値を大きくしなきゃならないみたい。