restofwaterimpのぎじゅつMemo

SIerに所属。企画から運用まで幅広くやってます。C#中心に書いてます。

【メモ】Strutsについて

昨日は、研修。

 

テキストではなく、講師と話したことを忘れないうちにメモメモ。

 

・URLでxxxdoというクラスで終わっているURLなら、それはStrutsで作られているよ。

 → ほとんどの理由は、トランザクショントークンを使いたいかららしい。

   不正な画面遷移を許さないようなフレームワークStrutsには入っているから。

   また、二重登録とかさせないようにするためらしい。新幹線や飛行機の予約サイト

   (急いで予約するようなケース)で使っているそうです。

    ほんとだ〜〜〜。

f:id:restofwaterimp:20131219081319p:plain

 

   amazonとかは最後にカートの中身を確認するからStrutsトランザクショントークンは使っていないと思われる。だから、Strutsでは作っていないようです。

 

・画面で使用する文字型は基本String型

 → 画面からリクエストを受けて、サーバー側でvalidationを行おうにも、

   型変換時にもともと適切な値が入らずに、validationがかからないケースがある。

   例)Strutsでいうと、画面のformをint型で設定し、validation.xmlにintegerチェクをしている場合、画面に文字を入力しても、サーバにリクエストを飛ばした時点で、勝手にInteger.parseIntがかかって、0が入り、integerチェックをしない。

    (※実験を仕切っていないので、これが本当なのか・・?ふめい。)

 

・アーキテクターを育成、勉強会って名古屋よく飛ばされるんですが・・・という質問

  → だったら、東京来た時に人脈作って、呼ぶか、きてくださ〜〜いって言えば

    だいたい行くと思いますよ。

    アーキテクター不足を東京でも感じているみたいですから・

 

    と、回答を頂いた。

 

 

話は脱線しますが、講師の方もいっていましたが、アーキテクターの育成って組織ではなく、個人のがんばりと興味にかかっているというのが現状みたい。

 

育成するには、XPとか真横でできるアーキテクターの人の作業を見て、自分でTry and Errorを実施し、経験して次に進めるかどうかなんですね。。プロジェクトコストにそんな余裕はなく、かつ、投資もできないので・・・やっぱり個人で覚えるしかないのだね。

 

 → 講師の人曰く・・・フレームワークとかソフトを作っている会社に移るのも

   急激に成長する1つの案だよとアドバイス。。。

 

それも1つなのかなと。。。

R.layoutの認識されるまでに・・・

Androidのプログラム学習しようと久々に思い立ち、ADT , Android SDK ManagerでAPIを最新にし、テキストを見ながら、入力フォームとボタンという簡単な画面を作って、さてビルド・・・としたら、「あれ?Rがエラーだ」と。

 

この2つのサイトで、どうもAPIのバージョンをあげていくと、

 

http://slumbers99.blogspot.jp/2013/05/eclipse-adt-22-android-sdk-manager-2.html

http://qiita.com/JunSuzukiJapan@github/items/3dd3b0bffb0db7f55356

f:id:restofwaterimp:20131214080037p:plain

 

 

どうも、Android SDK Build-toolsを入れないと行けないのが判明。

これをインストールして、さあ、大丈夫だろうと進むと。

あれ?まだエラーが。

なんかなとまた調査。

 

http://blog.takapra.com/2012/05/android%E3%80%80r-javaが消える件/

このサイトを見て、なんか関連ファイルがミスっているとR.javaができないみたい

というのがわかった。

どうも、原因はmanifestみたいだったので修正。

resファイルにR.javaも作成され、今度こそ大丈夫だろうと見ていたが、

今度もまたおかしく。main.xmlが解決できない・・。あれ?

 

 

import android.R;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

 

public class DataExchange extends Activity {

 

private EditText textBoxA;

private EditText textBoxB;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

textBoxA = (EditText)findViewById(R.id.valueA);

textBoxB = (EditText)findViewById(R.id.valueB);

}

/*

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.data_exchange, menu);

return true;

}

*/

public void onTouch(View v){

String strA = textBoxA.getText().toString();

String strB = textBoxB.getText().toString();

textBoxA.setText(strB);

textBoxB.setText(strA);

}

 

}

 

http://d.hatena.ne.jp/none53/20110501/1304267159

で見てみると、どうもandroid.Rのimportがイカンらしい。

Rにエラーが有るときに自動インポートして安心していたのが、こいつが悪さしていた。

このimportを削除するか、packageとxmlのファイルが違うなら、R.javaがあるpackage名をimportすることで解消。やっと作業できる。

 

package jp.gihyo.mitoma.chap01_01;

 

 

//import jp.gihyo.mitoma.chap01_01.*;

import android.os.Bundle;

import android.app.Activity;

import android.view.Menu;

import android.view.View;

import android.widget.EditText;

 

public class DataExchange extends Activity {

 

private EditText textBoxA;

private EditText textBoxB;

 

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

 

textBoxA = (EditText)findViewById(R.id.valueA);

textBoxB = (EditText)findViewById(R.id.valueB);

}

/*

@Override

public boolean onCreateOptionsMenu(Menu menu) {

// Inflate the menu; this adds items to the action bar if it is present.

getMenuInflater().inflate(R.menu.data_exchange, menu);

return true;

}

*/

public void onTouch(View v){

String strA = textBoxA.getText().toString();

String strB = textBoxB.getText().toString();

textBoxA.setText(strB);

textBoxB.setText(strA);

}

 

}

 

BigDecimal型で整数部分だけを扱いたい場合

仕事のプログラムで

入力項目が整数7桁小数1桁

出力項目が整数7桁

の仕組みでかつ、入力項目が整数値の場合のみ、出力項目へ

遷移させるという仕様にであった。

ともに使う属性はDecimalで実施する。

 

入力項目の入力チェックをかけたあとに値の遷移をさせようとするのだが、

入力項目に小数が入っているという制約に困ったので、以下のソースのようにして

対応。

 

import java.math.BigDecimal;

 

 

public class DecimalClass {

 

/**

* @param args

*/

public static void main(String[] args) {

int num = 456;

BigDecimal num2 = new BigDecimal(12345.12);

BigDecimal num3 = num2.setScale(0,BigDecimal.ROUND_DOWN);

//Remain

System.out.println("int num = " + num);

System.out.println("decimal num = " + num2);

 

 

//小数を落としたもの

System.out.println("小数落としたもの = " + num3);

 

}

 

 

}

 

出力結果

 

int num = 456

decimal num = 12345.120000000000800355337560176849365234375

 

小数落としたもの = 12345

 

 

こうやってすると、Decimalでも整数部だけで対応できるんだなと。

やりながらよっしゃと思ってしまった。。。便利だな〜〜と。

最後の値の検索【メモ】

Udacityでの講義の一つ

strに文字、targetに検索したい文字を入力して、

対象の文字が最後に発見されたときの文字の位置を出力するもの。

 

自分の回答

def find_last(str,target):

    if str.find(target) == -1:

        return -1

    n = 1

    while str.find(target, n) > 0:

        n = n + 1

    return n - 1

 

模範解答

def find_last(str , target):

    last_pos = -1

   while True:

      pos = str.find(target ,  last_pos + 1)

     if pos == -1:

        return last_pos

     last_pos = pos

 

改めて見ると、自分のはマジックナンバーはあるしな・・・。

Whileもこうやって書くのはよくないね・・・。

簡易なことなのかもしれないが、実装者のスキルで見やすさが変わるのは事実だな・・。

Udacityで基礎の復習

英語の勉強もかねUdacityでコンピュータ・サイエンスを復習中。

 

講座はそこまで多くないのだが、全編英語なので、英語の耳を作りながら、コンピュータの仕組みも覚えられるのが良い所。

 

基礎講座は Introduction to Computer Science

中級講座は AlgorithmsやWeb developments

上級講座は Design of Computer Programs

 

などとなっている。

まだまだ初級PGの方にとっては活用できる良い講座だろうと思います。

https://www.udacity.com/ 

 

これをやったらMITの無料講座を聞いてみよう。

情報システムの経年劣化

http://itpro.nikkeibp.co.jp/article/COLUMN/20091021/339209/

 

物はたいてい経年劣化する。

例えば、錆びてくるとか、時間が立って歪んでくる。

これは、もののみでもなく、情報システムにも経年劣化はあるのだろうか?

 

私が思うには、もちろんあると思う。ソフトウェアも出来上がったときが一番「ドキュメント品質」が高く、徐々に経年劣化してきている。

 

サービス員当時はぴっかぴか。が、サービスイン後、数々の仕様変更があると、「システム」には手を加えられる。一方、「ドキュメント」には手を加えない。その状態で年月を重ね、いつの間にか「システム」と「ドキュメント」の乖離が起こる。と、なるとコードを見て、テストをしてみないと仕組みがわからず、「ドキュメント」ではこの仕組は何ができるのか。何が必要なのかが見えなくなってくる。

 

そのようなシステムの状態で、例えばサーバ変更やシステムの抜本的な見直し、再構築のような案件が入るとすでにてんやわんや。軽く、現行分析を業務視点で行い、現行論理モデルを作成し、新モデルを作成する・・・なんて、教科書通りには行かず、現行システム分析に取られる時間が多くなる。

 

こういう状況は、企業の大小・業種にかかわらず起こっているのだろう。書籍やセミナーでの事例ならびに私の経験でもそう感じる。

 

このような場合、以下にこうならないように予防するのか。

もしなってしまった場合、どうやって現状分析するのか。の二点が考えられる。

 

<予防策>

 1.変更時のプロセスを定義し、実践すること。(些細な変更でも)

 2.リバースエンジニアリングツールを最初から突っ込む。

 3.システム変更はさせない

1は仕組みを作り、回すのに教育が必要であるし、しっかり回っているかを調査するような取り組みが必要。手間暇かかって実践できるかがミソ。

2はお金で解決。すべてが良い物ではないかもしれないが、要求から基本設計の業務内容は判断できないかもしれないが、システム・データレベルでいつでも把握できるはず。

3は究極・・・WW。まあ、そうやっていたら市場の理論で淘汰されそうですが・・。  

 

<予防できなかった場合の現行システム分析>

 1.リバースエンジニアリングツールを利用

 2.人海戦術で解析

 3.今の業務を捨て、新業務モデルでシステム構築

 

とまあ、極端な例を記載しましたが、結論としては、「作ったらハイおしまい」としないことと、「システムが自動的に保守・メンテされている」という変な期待を抱かないことである。

世間ではDEVOPSも流行っている?というか保守がテーマに上がっているくらい、システムの劣化に対する方策が求められていると思われる。

そりゃ、要件変更でプログラムだけ変えて、動きゃいいでしょ!!というのは楽なのだが、それは短期的なコストについてのみ。長期的にどのような開発プロセス、保守プロセスを抱くことで、ソフトウェアの品質の劣化を防止し、新たな品質レベルへステップアップできるか、多少なりとのお金はかかるが・・・業務とビジネスを硬直させないためにも対応が必要ではないかと思わる。

I/Oの発想がHOSTのままだった

大規模データをバッチ処理で扱う場合、

1.先にすべて、UNLOADして、テキストファイルで処理

2.すべて、DBで処理

 

いずれが処理効率がいいのだろうか?

そんな問が会議で出た。

HOST系でじゃかじゃかやってきた身としては、1と思っている。

ただ、オープン系(サーバ系というのがいいのか?)のみを経験している人は2という。

 

なぜだろうか?

私が考えるに考える上でのバックグラウンドが違うからだろうと思われる。

<ホストの思考からいうと・・・>

・サーバの配置は?

 HOSTで考えると、AP、DB、WEBサーバすべて同一筐体で考えている。(HOSTではそういう名前で呼ばないが、オープンに名前を統一している。)そのため、サーバ間のデータのやり取りが思考から外れている。

 

・データのアクセス

DBによるI/Oに比較し、SAMなどのシーケンスファイルを扱う、IBMのツール類のほうが断然処理速度が速い。DBによるI/Oプラス、プログラム領域へのI/Oを考えると、最初からファイルのほうが効率がいいのだろう。

 

<オープンの思考から言うと・・・>

・サーバの配置について

 バッチと言うよりかオンラントランザクションで考えるケースが多い。そのため、AP、DB、WEBサーバの配置を気にする。サーバ間でのやりとりが極力少なくなるような設計や処理方法を好む傾向あり。(当たり前なんだろうが)

 

・データのアクセス

 ファイルにすることは処理効率を下げるという人が多い。DBでできることはDBでというのが元々の思想。例えば、データを呼んできて、APサーバで処理させるよりは、PLSQLを書いて、DBサーバ内で処理することで、データ感のI/OやAPサーバでのメモリ消費を下げる、ということを考えるみたいです。

 

 

どちらの考えも一理あると思うのだが、大容量のデータを扱う場合っってどうなのだろう?私は経験上、テキストのほうが速いと思ってしまう。キーをしっかりした索引で検索するならDBのほうが速いのでは思うが、1件1件処理をしなければならないケースはテキストのほうが速いのでは??と思ってしまう。

 

私自身、経験と知恵が足りないので、下記のサイトなどでしばらく学習・・・。

http://gihyo.jp/admin/serial/01/rdbms

 

今の開発で実経験ができるといいかなと。