Sprng4勉強会
    脳内変換対象
        Spring4勉強会 第三回
            MemoValidator.java作成時に@override指定できずにエラーになる
            プロジェクトを選択⇒プロパティ―⇒javaコンパイラー⇒jdk準拠~直下のチェックボックスを外し、
            コンパイラー準拠レベルを1.7にする⇒適用⇒OK
            問題パースペクティブのエラーを選択⇒右クリック⇒クイックフィックスで1.7にする

        Spring4勉強会 第四回
            pom.xmlの修正
                <spring-jdbc.version>4.0.6.RELEASE</spring-jdbc.version>
                ~
                <CommonsDbcp.version>2.1</CommonsDbcp.version>
                ⇒propertiesタグの中に書くこと。

                <!-- MyBatis -->
                ~
                </dependency>
                ⇒dependenciesタグの中に書くこと

SpringTips
    Controllerメソッドの呼び出し戻り値=jspのファイル名

    Maven
        javaプロジェクト管理ツール
        今まで手作業で行っていたダウンロードや、プロジェクトのビルドをpom.xmlに記載することで自動化してくれる

    コンテキスト
        アプリケーションの配置場所や呼び出し方などの情報

    入力値検証(Validation)

    注意点
        <context:component-scan base-package="jp.co.kenshu"/>
        ⇒ページ上ではscan baseの間が空いてないからエラーになる

        form:fromのmodelAttributeに指定する値と、実際にControllerでバインドさせるFormオブジェクトは名前を一致させる
            jsp
                <form:form modelAttribute="testForm">
            controller
                TestForm form = new TestForm();
                model.addAttribute("testForm", form);

        pathに指定する値はFormオブジェクトのプロパティ名/フィールド名と合わせる
            jsp
                <form:input path="id"/>
                ※<input id="id" name="id" type="text">
            TestForm
                private int id;

    SpringMVCではFORMで送信される情報専用のFORMオブジェクトを用意し、リクエストオブジェクト
    から直接データをやり取りすることはない

    スクリプト言語
        インタープリター言語(事前コンパイル不要言語)

    Spring FormタグのTips
        <form:form>タグ
            actionパラメーターを省略すると自身に飛ぶ
            ⇒action="/SpringKenshu/show"

            methodを省略した場合はPOST扱い
            
            modelAttribute="testForm"と記載すると、id属性にtestFormが指定

        <form:checkboxes>タグ
            pathに指定するフィールドはString[]。
            ⇒中にはチェック状態にしたいチェックボックスを指定する。

    PRG (POST-REDIRECT-GET) 
        redirectする場合は、「redirect:」と書いて、その後に遷移先を書くだけです。
        return "redirect:/test/";

    Dto(Data Transfer Object)
        プロセスまたはネットワークの境界を越えて転送する必要がある
        集計データの集合に対する単純なオブジェクト

        Formクラスだと必要以上のデータを格納する為、
        Formを使用してデータを管理すると、同じJSPを何度も使用する際、不要なデータを削除する処理を
        入れなければならない。
        DTOを使えば、必要な情報だけ格納できるし、処理効率も良くなるし、ほかの人から見てもわかりやすい

        特徴:
            implements Serializableされる必要がある

    @Autowired
        DI(Dependency Injection)
            依存性の注入
            依存性:クラス間でのオブジェクトの関係している状態
            注入:「外部からの設定(Configuration)」を意味

            DIを使うと、プログラム中でnew(インスタンス化)することなく、
            インターフェースを使って実クラスをインスタンス化します
            方法:
                外部(DIコンテナ)からインスタンスを注入(生成)する。xmlにその設定を記述する。

            DIを導入する目的・メリット
                * クラス間の依存を排除する
                => オブジェクト間の疎結合にする。
                    ※ 疎結合とは、コンポーネント同士の結びつきが比較的緩やかで、独立性が強い状態のこと
                      緩やかにつなぐためにXMLなどの技術を利用する
                => そのため、変更に強い
                * 分業で開発しやすくなる
                * アプリケーションのコンポーネント(何らかの機能を持ったプログラムの部品)化を促進すること
                * モックツールを使って、単体テストがとてもやりやすくなる

Springの構成
    「src」フォルダ(開発するときはここだけ意識)
        ソースコードを配置します。Javaだけでなく、JSPやHTML,imgなども、この中にまとめられます。
        mainフォルダ
            プログラム本体
        resourseフォルダ
            xml等のリソース関係
        WEB-INF
            非公開ディレクトリ
            viewフォルダ
                MVCのViewが格納
    「target」フォルダ
        アプリケーションのデータです。自動生成されます。
    「.settings」フォルダ
        プロジェクトの設定ファイルが格納されてます。STS(Spring Tool Suite)によって作成されます。
    pom.xml
        Mavenのビルド設定ファイルです。

Springの流れ(ざっくり)
    ブラウザがURLを指定してリクエストを投げる
    例)http://localhost:8080/SpringKenshu/show
    
    @Controllerアノテーションがついたjavaファイルの中から、
    "/SpringKenshu/show"へのマッピングが指定されたファイルを見つけ、
    パッケージ名を保持
    package jp.co.kenshu;

    リクエストに該当するマッピング指定のメソッドを呼び出し
    例)@RequestMapping(value = "/show", method = RequestMethod.GET)
      public String showMessage(Model model){return "showMessage"}

    mvc-config.xmlから、先程保持したパッケージ名のノードを検索
    <context:component-scan base-package="jp.co.kenshu"/>

    Controllerの戻り値を
    mvc-config.xmlのprefix,suffixと掛け合わせてjspの場所を特定、呼び出し
    内部処理:(view.setUrl(getPrefix() + viewName + getSuffix());)
            <property name="prefix" value="/WEB-INF/view/"/>
            <property name="suffix" value=".jsp"/>
    ⇒"/WEB-INF/view/" + "showMessage" + ".jsp"

Springのページ作成方法
    Controller作成
        ・@Controllerアノテーション(メタデータ)をクラスに付与したクラスを作成
        ・メソッドに
         @RequestMapping(value = "/hogehoge", method = RequestMethod.GET)
         をアノテーションを付与したString型を返すメソッドを作成
         ※@RequestMapping valueを指定することで、住所を指定している。
          "/hogehoge"の場合、
          コンテキストルート(プロジェクト名)/hogehogeにアクセスされたときに使用する
          コントローラーであることをSpringに教えている
         ※returnする文字列は、この文字列でviewクラスを探索しにいく。
          この文字列に該当するViewファイル名をフレームワークが探しにいき、あればそのテンプレートを返却するという動きをします。

        ・Modelクラス
         ⇒Viewとの橋渡しをするためのクラス。
          addAtributeはModelインスタンスに属性を追加し、内部ではsessionに値を登録しています。
          第一引数には属性のkey値を、第二引数には値をそれぞれ指定します。
          ⇒なぜaddAtributeしたものが画面に表示されている?

        作成例)
        @Controller
        public class TestController {
            @RequestMapping(value = "/show", method = RequestMethod.GET)
            public String showMessage(Model model) {
                model.addAttribute("message", "hello world!!");
                return "showMessage";
            }
        }

    mvc-config.xmljspファイルとのマッピングルールを記載する
        作成例)
        ↓はSpringKenshuプロジェクトがどこのパッケージ下をControllerとして認識するか指定している
         <context:component-scan base-package="jp.co.kenshu"/>
          <mvc:annotation-driven />
          <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
           <!-- Example: a logical view name of 'showMessage' is mapped to '/WEB-INF/jsp/showMessage.jsp' -->
           <property name="prefix" value="/WEB-INF/view/"/>
           <property name="suffix" value=".jsp"/>
        </bean>
    
Validation作成時の注意点
    Form
        Integer型にはNotEmptyは指定できない。NotNullが正しい。
        @NotNull
        private Integer age;
    Controller
        ⇒引数の先頭に@Valid(入力値検証対象オブジェクトの明示用アノテーション)を付けること
         入力値を検証するオブジェクトのすぐ後ろにBindingResultを宣言すること
        〇public String list(@Valid @ModelAttribute EmployeeListForm form, BindingResult result, Model model) {}
        ×public String list(@Valid @ModelAttribute EmployeeListForm form, Model model, BindingResult result) {}
    JSP
        BindingResultがhasErrorsの時にのみ、値を出力させる指定
        <form:errors path="*"  />
        「path="*"」とすることで、Formクラスの全てのプロパティを参照する。

独自Validationを作成する方法
    Validation用のクラスを作成する(ここではMemoValidatorクラスとする)
        ConstraintValidator<Memo, String>を実体化し、
        isValidメソッドで具体的なチェック処理を記載する

    アノテーションを自作する
        Validation用のクラスをインポートしたアノテーションを作成
        @Constraint(validatedBy = MemoValidator.class)

    日本語エラーメッセージ定義を指定する
        Memo={0}は文字列のみを指定してください

    アノテーションを付与する。
        @Memo
        private String memo;

    ※validationの{0}にフィールド名ではなく、日本語名を当て込む方法
        日本語エラーメッセージ定義に、このプロパティ名が来たらこのように定義する、というように変換処理を書いておく
        NotEmpty={0}は必須です
        name=名前

・ボタン押下時の遷移先の設定
 form actionタグの中で設定

・input type(テキストフィールド)
 〇 <input type="text" name="name" size=32 value="${'aaa'}"/>
 × <input type="text" name="name" size=32 /><c:out value="aaa"/>
 ⇒テキストフィールドの外に値が出力される

・要素セレクタ css: button {color:blue;} ・クラスセレクタ css: .button {color:blue;} html: <button class="button"~></button> ・HTMLの構造に依存している ⇒div h2でcssを定義していると、  マークアップを変更したときにcssも変更しなければならない。  class名称にすればマークアップが変更になった時(div h2⇒artcle h2)に  cssを変更しないで済む ・スタイルの取り消し <h2 class="title no-border">見出し<h2> ⇒titleに対してno-borderで取り消している <h2 class="title headline">見出し</h2> ⇒titleの中にborderの定義を入れず、headlineで定義することで、無駄なコードを増やさないようにする ・詳細度  !mportant  インライン記述(style属性をhtmlに記載) <button style="colr:green"></button>  IDセレクタ  クラスセレクタ・属性セレクタ・擬似クラス [class="primary"]{color:green} class属性にprimaryだけが入っている要素を選択  要素セレクタ、擬似要素 buttton:first-child{color:green} ボタンの最初の要素に対して適用  ユニバーサルセレクタ(*) ・リファクタリング  要素セレクタを省略することで、シンプルに、メンテナンス性の高いcssにする h2.title⇒.title ul.link-list li⇒.link-list li  セレクタを短くすることで、  特定の要素への依存度が減る .links li a{ display: block; }  ⇒.links a{display: block;} ・セレクタ(セレクタ{プロパティ:値;}) 要素セレクタ h2 li ulとか クラスセレクタ class="aaa"のaaa 子孫セレクタ(空白を開ける) ⇒孫となる要素も含めて適用対象になる 子供セレクタ(>を使用) ⇒直下の要素のみが対象になる。  スタイルを重ねてスタイルを打ち消す必要がない HTMLタグを指定しないでクラスを選択するようにする ⇒HTMLタグを使用すると意図しない継承が発生する可能性がある 要素セレクタを省略する ⇒詳細度を高めるだけの為 セレクタを共通、個別で分ける 共通:アラート発生機能 個別:成功時、失敗時、警告時 ⇒alert success ⇒successが他と競合しない為に、successでなく、alert-successにする方がよりいい。 ・CSS LINT  http://csslint.net/ ・コンテナとコンテンツを分離 場所に依存しないセレクタを書く ⇒#header .logo{}  #footer .logo{}  ⇒.logoとしてまとめる   そして、共通から変更されるものが出てきたら、   logo small-logoのように、   必要なプロパティのみ拡張するようにする   1.ヘッダーとフッターのロゴ    ⇒内容が同じなら共通の.logoとして定義   2.フッターのロゴだけ小さいロゴにしたい    ⇒必要なプロパティのみ拡張したcssを作る ・まずは継承等考えずに書いてみる ・幅の情報を拡張元に持たせない .btn{...} .btn--short{width:200px;} .btn--long{width:480px;} .btn--full{width:100%;} <button class="btn btn--long">~</button> <button class="btn btn--full">~</button> ⇒ただ、これだと例えばshortとlongの間ができたときにその都度悩む  実際は、divごとに幅が異なる場合が多いため、  ブロック(div等)に幅を持たせることも考える css: form__button{width: 200px; /* フォームにおけるボタンの幅 */ } html: <div class="form__buton"> css: comment__button{width: 120px;} html: <button class="btn comment__button"></button>

文系プログラマが問題を解決するまでの思考回路_はじめてAzure触ってみた編

遅ればせながら、Azureを使用してみようと思い立ち、

ネットに転がっている情報から、

以下のサイトにたどり着いて、一通りAzure上で動くところまでやってみた。

 

nakaji.hatenablog.com

 

やってみた感想としては、

大部分は、そのまま流れに沿ってやればできた。

 

が、最後にハニートラップに阻まれた。

(ブログの方はきっと悪くない。当時は動いたのだろう。)

 

ローカルでWebApplicationをスタートアップに設定し、

実行するところまでは何とか行けたが、

一番最後の

「Azure上で動作確認」

が、どうしても失敗してしまっていた。(502 Bad Gateway ...)

 

これを解決するのに結局一日かかった。

 

どうやら、GoogleAPIの認証をするための証明書がうまく作れずに

エラーになってしまっているらしい。

ということで、一行ソースを書き換えたらうまくいった。

 

var certificate = new X509Certificate2(analyticsKeyFile, "notasecret", X509KeyStorageFlags.Exportable);

var certificate = new X509Certificate2(analyticsKeyFile, "notasecret", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);

 

因みにこんなサイトを参考にしました。

stackoverflow.com

 

 

どうすればもっと早く解決できたかなー。

ここからは文系プログラマがどういう思考回路で解決まで至ったか、

参考にして頂ければと思います。

こう考えていればもっと早かったんじゃない!?とか助言を頂けるとすごく嬉しい。

 

自分の解決までの道のり

3/12 17:00 エラーが出てTwitterに連携されない。

 

3/12 17:00 ~ 21:00 

⇒エラーの内容で検索をしてみるが、いい解決策が見つからない

 

3/12 22:00 ~ 08:00

⇒ふて寝

 

3/13 08:00 ~ 11:00

⇒作者のGitからソリューション取得、Azureに上げてみると一度成功(?)

 

3/13 11:00 ~ 14:00

 ⇒自分のソースと作者のソースコードの差分を必死でなくそうとする

 (app.config,web.config,参照dllのバージョン、.Net Frameworkのバージョン。。。。)

⇒でもやっぱりうまくいかない。もう一度作者のソリューションでAzureに上げたやつ

 を動かしてみる→動かないやんけ!!

 (T-T)

 

3/13 14:00 ~ 16:00

⇒「C# Azure 502」とかでGoogleさんに聞いても解決せず。

 (もういいよ。。。どうせ自分にはプログラミングのセンスがないんだろ。。。)

 

3/13 16:00 ~ 17:00

 ⇒作者のブログに、Google AnaliticsはB1 Basicプラン以上じゃないと動かないという

 記述を見つけ、無料試用期間の自分にはそもそも動かせなかったプログラムじゃない

 かとあきらめつつ検索

 (ここまで来たら明日まで粘ってやっからな。。。覚悟しとけAzureさんよぉ!)

 

⇒「azure google analytics」で検索してたら、

 認証時にAzureがうまく動いてくれてない(?)という記事を見つける

 

⇒StackOverFlowの記事を見つけて適用してみたら動いた

 \(T_T)/

 

 

今日はみんなよい休日を過ごせたでしょうか。

プログラミングの環境構築Tips

・本に書いてある環境構築方法を実践するときには、

 バージョンは「かならず」同じものを使用する。

 (セキュリティー面で最新のものを…、バグが治ってるかもしれないからとりあえず最新を…とかやってるとバージョン差異でうまく動かくなることが多い)

 

ruby on rails(windows 8.1 64bit時)

 ruby on rails4 アプリケーションプログラミングを読みながら環境構築した際、

 以下のエラーが出て詰まった。

 C:/Ruby200/lib/ruby/gems/2.0.0/gems/tzinfo-1.2.2/lib/tzinfo/data_source.rb:182:i
n `rescue in create_default_data_source': No source of timezone data could be fo
und. (TZInfo::DataSourceNotFound)

 

 解決方法:

 C:\data\railbook\Gemfileをメモ帳などのテキストエディタで開き、

 一番下に、

 gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw]

 を追記。

 コマンドプロンプトでその後、以下のように実行

 c:\data\railbook>bundle update

 c:\data\railbook>rails server

 

 教えてくれたブログに感謝。

        /// <summary>
        /// 指定したビットフラグが立っているか
        /// </summary>
        /// <param name="binaryData"></param>
        /// <param name="location"></param>
        /// <returns></returns>
        public static bool GetBitFlg(byte binaryData, int location)
        {
            string result = Convert.ToString(Convert.ToInt32(binaryData), 2).PadLeft(8, '0');

            return result.Substring(result.Length - location, 1) == "1" ? true : false;
        }