サイ本を読んで~JavaScriptの変数スコープ~

JavaScriptの変数スコープがJavaと結構違って厄介。。
また、備忘録として!
まず、JavaScriptにはブロックレベルのスコープがありません。つまり、ある関数で宣言された変数は、どのブロックで宣言されたにかかわらず関数全体で有効になる。
言葉ではわかりにくいと思うので早速コードで確認!

var scope = "global";
    function f() {
        alert(scope);
        var scope = "local";
        alert(scope);
    }
f();

最初のalertは、「global」と表示されると思いませんか?(JavaとかC使いの人に向けての問いかけ)
上で説明したように関数で宣言した変数は関数全体で有効なので「undefined」と表示されるのです。
もちろん2回目のalertは、「local」と表示されます。
つまり、次のように書いたのと同じ意味になります。

function f() {
    var scope;
    alert(scope);
    var scope = "local";
    alert(scope);
}
f();

変数が後に宣言してあること認識してるなら初期化してくれればいいのにな〜って思った今日この頃。
ま、そうしちゃうとどこで変数宣言したかわからないから探すの大変になっちゃいますけど。。。

言いたいことは、ちゃんと頭で変数宣言したほうがよいよってこと!

サイ本読んで~Part1~

サイ本はJavaScriptの本では一番有名でしょう。ま、どんな本かは調べてもらうとして今回備忘録としてまとめて起きたい項目はちょいちょい記事として書いていこうかと。
Part1は、オブジェクトリテラル
JSではオブジェクトリテラルを利用できる。(あるオブジェクト生成し、そのオブジェクトのプロパティをあらかじめ定義しておくことができる。)
次の形式で定義します。
[プロパティ名:値, プロパティ名:値, ...]
具体的に書くと次のようになります。

var taro = {name: "taro", age:20};
オブジェクトを入れ子にすることも可能。
var myteam = {
    taro: {name: "taro", age: 20},
    hanako: {name: "hanako", age: 18}
};

ThymeleafでformのList<Object>フィールドに値をいれるのにはまった話

仕事しててすごくハマった話。
type="hidden"でListの指定したインデックス番号のidに値をつっこもうと思ったとき、以下のようにするとうまくpostできました。

BookForm.java
@Getter
@Setter
public class BookForm implements Serializable {

	private List<Detail> details;

	@Getter
	@Setter
	public static class Detail implements Serializable {

		private Long id;

		private String name;

		private String passage;
	}
}
index.html
<form class="form-horizontal case-entry" role="form" method="post" th:action="@{/requests/category(step=book-detail)}" th:object="${createForm}">
    <div class="row">
        <div class="col-md-12">
            <fieldset>
                <th:block th:each="selectedBook: ${selectedBooks}">
                    <legend th:text="${selectedBook.name}"></legend>
                        <table>
                            <tr class="col-md-12">
                                <td>
                                     <div class="form-group" th:classappend="${#fields.hasErrors('all')}? has-error">
				         <input type="hidden" th:attr="name='details[' + __${selectedBookStat.index}__ + '].id'" th:value="${selectedBook.id}" />
                                         <div class="col-md-6">
                                             <input type="text" th:field="*{details[__${selectedBookStat.index}__].name}" class="form-control" />
                                         </div>
                                         <div class="col-md-6">
                                             <input type="text" th:field="*{details[__${selectedBookStat.index}__].passage}" class="form-control"  />
                                         </div>
                                     </div>
                                </td>
                            </tr>
                       </table>
                </th:block>
            </fieldset>
        </div>
    </div>
</form>

重要なのはth:attr="name='details[' + __${selectedBookStat.index}__ + '].id'"ですね!!!
th:attrは、任意の属性に値を設定する際に使います!
ちなみに、__は、プリプロセッシングといって通常の式よりも先に評価されます。

ビュー名を返すだけのControllerなら、Controllerは別にいらないらしいよ!

ログインフォームに誘導しようとした際、View名返すだけのControllerを作らなきゃいけません。
そんなとき、以下のようなConfigクラスを作ればこのControllerが必要ないんです!

@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("login").setViewName("login/login-form");
    }
}

ちなみに、Controllerを実装した場合はこんな感じ。

@Controller
@RequestMapping("/login")
public class LoginController {

    @RequestMapping
    public String login() {
        return "login/login-form";
    }
}

これだけ見てみるとそんなにコード量が変わらないというかむしろController作った方が少なそうだけど。笑

Postgresの初期設定(ユーザの作成)

仕事ではMySQLばかりであまり使うことのないPostgres。
コマンドがまるで違うので備忘録として!

psql経由でデータベースログイン

mbp-Ryosuke:~ ryosuke$ psql -d postgres -U [ユーザ名]
psql (9.5.1)
Type "help" for help.

postgres=#
  • -d:データベースの指定
  • -U:ユーザ名の指定(特にスーパーユーザを指定していない場合は、PCのログインユーザ名がスーパーユーザになります)

なお、Postgresでは、ユーザのことをロールと呼びます。

ユーザの作成

postgres=# CREATE ROLE mrs LOGIN
ENCRYPTED PASSWORD 'xxxxxxxxxxxxxxxxxxxx'
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
  • CREATE ROLEに続けて作成するロールの名前を入力します。ここでは「mrs」というロールを作成するようにしています。
  • ロール名に続けてオプションの指定を行います。「LOGIN」を指定すると、データベースに接続可能なユーザになります。
  • パスワードに続けてユーザのパスワードを指定します。PASSWORDの前に「ENCRYPTED」と指定すると暗号化されたパスワードが、「UNENCRYPTED」と指定すると生のパスワードが保存されます。
  • パスワードの続けてロールをスーパーユーザに設定するか有無かを指定します。「SUPERUSER」と指定すると、スーパーユーザが、設定されます。指定しない場合は「NOSUPERUSER」となります。
  • INHERITは、ロールがそのロールが属するロールの権限を"継承"するかどうかを決定します。(詳しく理解できてないです)
  • NOCREATEDBは、そのロールにはデータベースを作成する権限が与えられないようにするときに使用する。
  • NOCREATEROLEは、このロールが新しいロールを作成できないようにするために指定します。(デフォルト値もNOCREATEROLE)
  • NOREPLICATIONは、ロールがストリーミングレプリケーションを初期化でき、システムをバックアップモードとの遷移が可能かどうかを決定する。NOREPLICATIONは、これをさせたくないときに指定する。

Postgresのインストール方法(Mac)

postgresを使用する場面に遭遇したので備忘録として。

// postgresをインストール
ryosuke $ brew install postgresql
// 文字コードをutf-8で初期化
ryosuke $ initdb /usr/local/var/postgres/ -E utf8
// バージョンの確認
ryosuke $ postgers --version
// postgresqlの起動
ryosuke $ brew services start postgresql
// データベースの一覧を取得
ryosuke $ psql -l

データの入れ方等は次回ってことで!