restofwaterimpのぎじゅつMemo

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

研修で頂いた環境をMacで動かせた

先月にグローバルナレッジで受講した研修のプログラムとデータを持ち帰り、

自己研鑚用に環境構築・・・。

 

研修はWinであったが、自宅のPCはMacなので、ちょっぴり設定に戸惑い・・・。

 

やったことは以下のとおり・・。

 

1.Java SE5で使っていたので、Java EE 7 をインストール。

 インストール後、GlassFish Serverも自動で入ってしまって、Tomcatとportがかち合ったので、

https://blogs.oracle.com/yosshi/entry/glassfishtomcatの違い_part_1

を参考に、GlassFishのポートを変更。

 

Tomcatlocalhost/config/server.xmlでポート番号を8080から18080に変更したのだが、うまく変わらなかったので、できる方で。(なんで変わらなかったのかはなぞ・・)

 

2.もらったソースをEclipseに取り込む。

 Tomcatプロジェクトにして、Servlet情報をビルドパスに・・。

  → とりあえず、コンパイルエラーはなし。

 

3.MySQLをインストール

  → って、昔、インストールしたんだっけと・・・。

    システム環境設定におもいっきりMySQLがあったので、version 5.5をそのまま利用。

 

    ただ、数ヶ月以上使っていなかったかつ、初心者クラスのため、起動の仕方をすっかり忘れていた。。。

    Windowsの用に、mysql - u  password -pじゃだめなんね。

    しっかり、実行することをアピールして、./mysql xxxxと書かないと起動しなかった。.shということをよく忘れてしまいます。

 

で、とりあえず、動いたので、ここから動かしながら拡張していこうかと。。。

f:id:restofwaterimp:20140116233247p:plain

 

 

徐々に学習です・・・。

【メモ】MacにJava EE7のインストール

このサイトを見て、DISPLAYの設定が必要なことを確認しインストール

 

shをそのまま実行したら、以下のメッセージが出たので・・・。

This program requires DISPLAY environment variable to be set.

 

Please re-run after assigning an appropriate value to DISPLAY.

 

http://sometimes.hatenablog.jp/entry/2013/11/03/003243

Jenkinsを使ってみた

会社の社内勉強会でJenkinsの使い方の例を紹介することがあるそうなんで、事前にJenkinsを触ってみようと。

 

http://www.buildinsider.net/enterprise/jenkins/01

 

のサイトを利用して、インストールしてみる。

 

1.Xcodeのインストール

 すでにインストールされていたので、飛ばす・・・

2.homebrewのインストール

 http://brew.sh/index_ja.html

 を参照にインストール・・・。

 やってみたら、どうも過去にインストールされていた・・・。

It appears Homebrew is already installed. If your intent is to reinstall you

should do the following before running this installer again:

    rm -rf /usr/local/Cellar /usr/local/.git && brew cleanup

 

3.Jenkinsのインストール

4.Jenkinsの起動

 java -jar /usr/local/Cellar/jenkins/1.490/libexec/jenkins.war

5.jenkins起動の確認

f:id:restofwaterimp:20140106210130p:plain

 

単純な事例で、shellの起動を実施してみた。

 

詳しくJenkinsを知らないので、これから学ぶことになるが、キーワードで継続的イテレーションとか記載されている。(どこの記事だっけな?)

 

上記のサイトにCronに似ているが条件をフック(多分複雑に出来るということか)したり、出力形式を変更できること、また自動化してテストできるというの利点として書かれている。

 

社内勉強会でも、面倒なデプロイ作業から、テストの自動化を謳っていそうなので、そこがポイントなのかな?

 

前回、研修でもらったソースをベースに使ってみようかと思います。

【メモ】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もこうやって書くのはよくないね・・・。

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