2017年2月28日火曜日

サムライズさんのJetBrains製品のハンズオンセミナー

サムライズさんのJetBrains製品のハンズオンセミナー


メモ

postfix completion

.var + tab → 変数に入れる

a + b.return + tab

.sout + tab

number &t; 18.if + tab

Emmet
dive.class + tab
script:src + tab

空気読む
山本さんのネーミングがセンスある
Alt + Enter

一つ前のペインに戻る
Control + tab
ファイルだけでなく、ツールウィンドゥを含む

閲覧履歴を開く
Cmd + e

パラメータ一覧を出す
Cmd + p

Shift + Cmd + Enter
Complete Current Statement
今の行の最後を終わらす。
");など

定義箇所にジャンプ
Cmd + b

Shift + f6
rename

リファクタリング
control + t

プロジェクトペインを開く
Cmd + 1

cmd + ↑ 探したい改装で ↓
そこでcmd + nでファイル作成もできる

cmd + n 画面で検索できる。
さらにその次の階層でも検索できる

Option + ↑↓
選択範囲の拡大・縮小

Opt + Cmd + L
コードフォーマット
選択して、範囲を絞ることができる。

PHP / Pythonには標準的なフォーマットがある
らしい。
あとは、Editor.configをプロジェクトルートに置く方法がある

SQLだとわかんない場所
Opt + Enter
Inject Language ...


RenameでAlterが書けてしまうので、
Read-Onlyをつけて置く。

SSHトンネルも掘れるよ。

Cmk + k
コミット
鍵マークを外すことで、diffの場所での変更が有効になる

Edit Json fragment
いい感じにエスケープしてくれる。

RegExpのテスト
1パターンだけはリアルタイムで判定する

2017年2月25日土曜日

Yaml入門 / Dotinstallで学ぶ

Yamlファイルに最近触れるけど、よくわかっていないのでDotinstallさんの動画を閲覧しました。
メモを残しておく。


メモ

Yamlとは
データ書式

公式サイト
YAML Ain't Markup Language

データ型
  • Scalar
  • Sequence
  • Mapping Hash

コメント
#ハッシュ記号です

Null値
~ チルダ

日付
yyyy-mm-dd

真偽値
true / false

Sequence
- (ハイフンとスペース)に続けて書く(=ブロックスタイル)
or
[]にカンマ区切りで書く(=フロースタイル)

ブロックスタイルの字下げ
ハイフンの前にスペースをつける
インデント前の要素は空白にする
- gee@nifty.com
- 
  - hoge
  - fuga
- yooo

Mapping Hash
key: value方式で: (コロンとスペース)で区切り。
こちらもブロックスタイルとフロースタイルが使える

SequenceとMapping Hashは交互に入れ子にできる

区切り文字にタブは使えない
注意

改行の取り扱い
|改行
最終行の改行を保持する。

|+
最後行以降の改行を保持する

|-
最後以降の改行を保持しない。

|を>に変えると、途中行の改行はスペースとなる

&でアンカー
*で呼び出せる(エイリアス)。変数みたいなもの。
- &hoge hogehoge
- *hoge

==
hogehoge
hogehoge
Mapping Hashは<<: *hoge
で呼び出す

--- と ...
データの区切りを示す
開始が---
終わりが...
1つのデータで、...がなくても問題はない。

Spring Batch / 区切り文字の変更

https://spring.io/guides/gs/batch-processing/ Spring Batchの公式サンプル

やってみてつまづいた点2点
・application.propertiesにDB定義しとかないいけない
・デフォルトパッケージだと動かないので、適当なパッケージ入れる必要がある
※パッケージに入れないのはテストやサンプルぐらいだと思いますが。。。

また、読み込むファイルの区切り文字の変更は「DelimitedLineTokenizer」のコンストラクトの引数で、区切りたい文字を渡す。
\tで、タブ区切りにした例です。
    reader.setLineMapper(new DefaultLineMapper() {
        {
           this.setLineTokenizer(new DelimitedLineTokenizer("\t") {
             {
              setNames(new String[] {"firstName", "lastName"});        
             }
           });        
           setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {
             {
              setTargetType(Person.class);        
             }
           });      
        }
    });

2017年2月20日月曜日

Spring Boot / Redirect先にオブジェクトを渡す

Spring Bootをいじってました。


RedirectAttributes attributes
Spring BootのGetting StartedでRedirect先にオブジェクトが渡せなくて1時間くらいハマってました。
結論、「RedirectAttributes attributes」で回避
  @PostMapping("/")
  public String checkPersonInfo(
          @Valid
          @ModelAttribute("personForm")
          PersonForm personForm
          ,BindingResult bindingResult
          ,RedirectAttributes attributes) {

    if (bindingResult.hasErrors() ) {
      return "form";
    }
    attributes.addFlashAttribute("personForm", personForm);
    return "redirect:/results";
  }
こちらを参考にさせていただきました。
Qiita SpringMVCでリダイレクト先ページにパラメータを渡す方法

brに閉じスラッシュをどうしてもつけたくない
意外とかったるいThymeleafのtemplatemodeの制約
LegacyHTML5だと単独タグでも閉じスラッシュが必要になる。
そこでtemplatemodeをLegacyHTML5にしましたが、この時はnekoHTMLというライブラリをimportする必要があるみたいです。
Gradleなら
dependencies {
        ...
 compile('net.sourceforge.nekohtml:nekohtml')
}

spring.thymeleaf.cache=falseを指定したのに、更新されない!どういうこと!?
IntelliJ上でgradle::bootRunしていて、spring.thymeleaf.cache=falseを設定の上、
HTMLファイルを更新してもブラウザで変更が確認できず調べる羽目になった。

結果、ファイル更新した後にbuildしないと内容は変わりません。
IntelliJ依存も疑って、Terminalでgradle bootRunしてみましたが、
これもbuildし直さなきゃHTMLファイルの変更すら反映されませんでした。

javax.validation.constraints.*のvalidation message
@NotNull(message="hoge")
以上!!簡単かつ簡潔
Spring Bootいいね!!

エラーページ
デフォルトなら、templates配下にerror.htmlを作ればよし。
エラーコードによる分岐はまた今度やります。
こちらを参考にさせてもらいました:システム開発メモ Spring Boot + Thymeleafでエラー画面をカスタマイズする

2017年2月19日日曜日

Perlのシジルの覚え方

Perl入学式という勉強会に参加して、覚えやすいシジルの覚え方を教わった


$
ScalorのS

@
ArrayのA

%
/を挟んで対応している=>なんか連想配列っぽい

Android is Dead.: Javaでメモリリークする件

Android is Dead.: Javaでメモリリークする件: Java プログラムでメモリー・リークが発生するのでしょうか? その通りです。 http://www.ibm.com/developerworks/jp/java/library/j-leaks/ メモリはリークするか まとめ 相互参照は問題ない。...



Javaで相互参照でメモリリークするのかどうか、この記事が一番しっくりくる柔らかい説明でした。もう循環参照以外から参照されないその循環参照は、GCの対象になるんですね。リファレンスカウンタ方式と世代別管理。。。まだまだ知らないことばかりです。

Git / githubのusernameを変更したら


Githubのusername変えたら、リモートリポジトリの書き換えが必要だったので、その実施メモ



メモ

git remote -v
今設定しているurlを確認
origin https://github.com/user_name/repository_name


git remote set-url origin https://github.com/new_user_name/repository_name
URLの書き換え

git remote -v
書き換わったことを確認

2017年2月11日土曜日

JVM入門

Schooの授業メモ
Apache Tomcatチューニング入門


メモ

Java/Tomcatアプリのレスポンスのボトルネック
keep-aliveの見直し、DB設計、SQL見直し
インデックスの見直し、Tomcatのメモリ設定

TomcatもJavaプログラム
知らなかったです。
TomcatもJavaプログラムのため、
物理メモリ → JVM → Tomcat → Webアプリ
という関係性のイメージになる

JVMの仮想メモリ
スタック領域 + ヒープ領域

スタック領域
参照型変数のアドレス参照とプリミティブ型変数を格納する

ヒープ領域
オブジェクトのインスタンスを格納する
実行速度に特に影響が出やすいのが、このヒープ領域

さらにEden領域・Survivor領域・Tenured領域に区切られる。
Eden領域 + Survivor領域 = New領域
Tenured領域 = Old領域ともいう。

Survivor領域については、From空間とTo空間
(Survivor0 / Survivor1)にさらに別れる。

Garbage Collectionの動き
インスタンスを生成して最初に格納されるのが、ヒープ領域のうちのEden領域
Eden領域がいっぱいになると、Scavenge GC(Minor GC)が起動する。
参照されていないインスタンスは破棄し、残りは
Survivor領域のTo空間(Survivor1)に移動する

その後のScavenge GCにおいて、参照されているTo空間のインスタンスは、
From空間(Survivor0)に移動する

デフォルトでは、16回マイナーGCを実行されたインスタンスは、
Tenured領域に移動します。
new領域とOld領域が一杯になるとFull GC(Major GC)が実行され、
一時的にアプリが停止します。
以上のように、GCの対象になるかどうかは参照があるかどうかですが、
GCが実行されるタイミングは、メモリ容量によって決まります。

JVMのプロセスを表示
JVMのプロセスを表示
$ jps
3528 Jps
2554 
3403 Bootstrap
2188 

-vをつけると、実行コマンドを確認できる
$ jps -v
3529 Jps -Dapplication.home=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home 
-Xms8m
2554  -javaagent:../Eclipse/lombok.jar -Dosgi.requiredJavaVersion=1.8 -Xms40m 

JVMプロセスのメモリ使用状況
jstat -gcutil  3403
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT   
  0.00  68.59  90.99  38.86  96.71  92.41      9    0.121     1    0.059    0.180
FGCがFull GCが発生した回数
FGCが発生していた時間

単発は問題ない(メモリを解放するので悪いことではない)が、
頻発しているとアプリが止まっているので、問題がある
項目の詳細は公式から
  • S0 : Survivor0の使用率
  • S1 : Survivor1の使用率
  • E : Eden領域の使用率
  • O : Old領域の使用率
  • P : Permanent領域(Tenured領域の別名)の使用率
  • M : メタスペースの使用率
  • CCS : 圧縮したクラス領域の使用率
  • YGC : マイナーGCの回数
  • YGCT : マイナーGCの時間
マイナーGC = Young GCの理解ですが、時間があったら確認したい。

Stop The world
Full GCにより一時的にアプリが停止すること(スレッドの停止)

OutOfMemmoryError
Full GCでもメモリ不足が解消できない状態

指定メモリが大きすぎるのも問題
メモリ・CPU・アプリケーションの性能により、
単純にメモリを大きくすれば良いという話ではないらしい。
  • マイナーGCに時間がかかる:New領域が大きすぎる
  • フルGCに時間がかかる:Old領域が大きすぎる

JVMの起動時の設定
  • -Xms:ヒープ領域の起動時のサイズ
  • -Xmx:ヒープ領域の最大サイズ
  • -XX:NewSize:New領域のサイズ
  • -XX:MaxSize:New領域の最大サイズ
  • -XX:SurvivorRatio:From/To領域の使用比率
  • -XX:MaxTenuringThreshold:New領域からOld領域に移動する閾値
  • -XX:TargetSurvivorRatio:Survivor領域の閾値

起動オブションの設定
・引数で渡す
・設定ファイルに書いておく(setenv.sh/setenv.bat)

intelliJ IDEAの操作

Schooの授業とJetBrains公式
ショートカットはここも参照
Keyboard Shortcuts You Cannot Miss
Default Key Map
MAKING DEVELOPMENT AN ENJOYABLE EXPERIENCE あとは、公式販売代理店のサムライズさんの記事

開発効率あげるぞー


メモ

プロジェクト > モジュール
intelliJの階層構造は、「プロジェクト > モジュール」
Eclipseは「ワークスペース > プロジェクト」

クイックフィックス
Win:Alt + Enter Mac:opt + Enter

クラス作成の基本
psvm > public static void main(String[] args) { } sout > System.out.println;

補完
Win:(Ctrl + Space) or (Shift + Ctrl + Space)
Mac:Ctrl + Space
もう一度押すと、詳しくサーチしてくれるらしいです。

アドバイバーの表示
Win:alt + Enter
Mac:alt + Enter

インスタンスの生成(new Class())を書いて補完
introduce local variableが出てくるので、それを押下すると、
クラス名をキャメルケースにした変数を宣言してくれる。

Generate
Win:Ctrl + Enter
Mac:Ctrl + Enter

静的コード解析ツール
format string > +で文字列と変数をつなげているものprint(ln)している場合、
printfを提案してくれる。(alt + Enter)

その他、ラムダへの書き換えやStream APIなども対応

Postfix
list_variable.for まで書いてtabを押すと、拡張for文
list_variable.fori まで書いてtabを押すと、for文
instance.nn で書いてtabを押すと、!= nullのif文
instance.null で書いてtabを押すと、== nullのif文

たっけーけど、Ultimate版を購入してみた
新規IntelliJのみ1年ライセンスで16,000ぐらい

Rename
Refactorの基本 Win:Shift + F6
Mac:Shift + F6

Search everywhere
Win:Double Shift
Mac:Double Shift

Redo / Undo Win:Ctrl + z / Ctrl + Shift + z
Mac:Ctrl + z / Ctrl + Shift + z

たまにUndoをCtrl + yと間違えて、バッファー消しちゃうときがあります。

現在の行を削除
*更新* Win:Ctrl + y
Mac:Cmd + Del

WinとMacで違うみたいです。

現在の行を下にコピー
Win:Ctrl + d
Mac:Ctrl + d

カーソルも移動。公式はカーソルではなくcaretって言っている。

ファイルの場所の表示
Win:Alt + F1 → 「Project View」を選択
Mac:Alt + F1 + fn → 「Project View」を選択

実装や呼び出し元へジャンプ
Win:Ctrl押しながらクリック
Mac:Cmd押しながらクリック

これ慣れると便利です。

選択しているクラスなどの定義をポップアップ表示
Win:Ctrl + Shift + I
Mac:Cmd+Y

Editor以外のウィンドウからEditorに戻る
Win:Esc
Mac:Esc

アクティブなEditorのタブを閉じる
Win:Ctrl + F4
Mac:Ctrl + w
違うね。

アクティブなペイン(pane)を閉じる
Win:Shift + esc
Mac:Shift + esc

規定の番号に対応したpaneを開く(Project:1/Version Control:9)
Win:Alt + Num
Mac:Cmd + Num

ターミナルを開く
前項目のpaneに登録されていないようでして、 Win:未確認
Mac:opt + f12

ファイルの構成をポップアップ
Win:Ctrl + F12
Mac:Cmd + F12

OSのディレクトリアプリで表示
Win:未確認
Mac:Opt + Cmd + F12

Win:
Mac:

Win:
Mac:

Win:
Mac:

Win:
Mac:

Win:
Mac:

2017年2月8日水曜日

Spring Boot / Form周り

Spring BootのForm周りでつまずいたところのメモ
時々intelliJショートカットやGradleのメモ


メモ

Gradle / 拡張プロパティ
ext {
  springBootVersion = '4.0.0.BUILD-SNAPSHOT'
}

Gradle / buildscript
拡張プロパティやレポジトリ、ビルドツールの依存を記述
ライブラリの依存は別の場所
buildscript { 
 ext { // extended property
  springBootVersion = '2.0.0.BUILD-SNAPSHOT'
 }
 repositories {
  mavenCentral()
  maven { url "https://repo.spring.io/snapshot" }
  maven { url "https://repo.spring.io/milestone" }
 }
 dependencies {
  classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
 }
}

Gradle / タスク名は前方一致で特定できれば省略できる
公式参照

Gradle / -x
依存しているタスクを省略
$ gradle --daemon jar 
:compileJava
:processResources
:classes
:jar

BUILD SUCCESSFUL

Total time: 2.217 secs
--
$ gradle --daemon jar -x compileJava
:processResources UP-TO-DATE
:classes
:jar UP-TO-DATE

BUILD SUCCESSFUL

Total time: 0.844 secs


Spring / URLをパラメータとして受け取る
@RequestMapping("/{param}")
public String calc(@PathVariable int param) {

ちなみに、型が違うと下記のように怒られます
Tue Feb 07 22:24:50 JST 2017
There was an unexpected error (type=Bad Request, status=400).
Failed to convert value of type 'java.lang.String' to required type 'int'; nested exception is java.lang.NumberFormatException: For input string: "hoge"

少数は問題なかったです。

intelliJ + lombok
Qiita IntelliJ IDEA+GradleでLombokを使う
Enable annotation processing にチェックが覚えられない
Welcome画面で設定すればデフォルト設定できます。
現在Gradleの設定は、 compileOnly "org.projectlombok:lombok:1.16.12" でした

また、ディレクトリのインポート時にbuild.gradleにlombokをdependenciesに記載していなかった場合、
build.gradleに追記後、それをsynchronizedする必要があるみたいでした。
少なくても自分の環境では、synchronizedしないとimport lombok.*;は認識しませんでした。
  • @Data:getter/setter/toString/equals/hashCode
  • @AllArgsConstructor
  • @NoArgsConstructor
うむ、楽だ。

Spring / org.springframework:springloaded
htmlファイルの更新時に、再読み込みをするライブラリ
参照: Qiita Spring Boot + Thymeleaf + Tomcat + Gradleで業務系アプリ 躓いた所6点
buildscript {
 ext {
  springBootVersion = '1.5.1.RELEASE'
 }
 repositories {
  mavenCentral()
 }
 dependencies {
  classpath
                  ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
  classpath "org.springframework:springloaded"
 }
}
開発効率上げるために入れたほうがいい。

Thymeleaf自体はgradleで
compile "org.springframework.boot:spring-boot-starter-thymeleaf"

またまた、thymeleafのキャッシュは開発時には切っておきます。
[application.properties]
spring.thymeleaf.cache=false

Spring / @Controllerと@RestController
かなり恥ずかしい話ですが、違いがよくわかっていなかった。
@Controllerが付いているクラスのメソッドの戻り値は、HTMLテンプレートのファイル名
@RestControllerがついているクラスのメソッドの戻り値はHTTPレスポンスボディ

参考:Qiita Spring MVCのコントローラでの戻り値いろいろ

Git / **/で再帰的にignore
参考:MindTo01s git-ignoreの設定

Spring / 2.0.0-SNAPSHOTで超絶シンプル@Controllerサンプルを試してみるも。。。
ルーティング(@RequestMapping)がうまくいかず、ファイルがあるのに404が出た
hotload=ONやhtmlcache=OFFの設定があったので、とりあえずミートしてみましたが、変わらず。
1.5.1.RELEASEで同じコードを試したら、問題なくルーティングできた。
無駄に時間食ったわ。。。

Spring / ModelとModelAndView
Modelはセッションの属性値を持つだけ。
ビューのファイル名は別途メッソドの文字列返り値として渡す。

一方、ModelAndViewはセッションの属性値に加え、viewNameとしてビューのファイル名をもつ。
// Model
@RequestMapping("/{num}")
public String index(@PathVariable int num, Model model) {
  model.addAttribute("msg", "arg: " +num);
return "index"; // index.htmlを開く

// ModelAndView
public ModelAndView index(@PathVariable int num, ModelAndView modelAndView) {
  modelAndView.addObject("msg", "total: " + res);
  modelAndView.setViewName("index");
return modelAndView; // index.htmlを開く

IntelliJ w/Mac 1行消す
Command + delete
Qiita 忙しい人のためのIntelliJ IDEAショートカット集(´-`)

Command + dかと思ったんですが、逆に1行増えました。。。。Duplicateっすね。

Spring / フォームの値受け取り
@RequestParam("form_name") Type var_name
public ModelAndView submit(@RequestParam("name") String name , ModelAndView modelAndView) {

forwardとredirect
forwardはURLは元のまま、
redirectはURLも遷移後のものとなります。
Modelの場合
return "forward:/";

ModelAndViewの場合
return modelAndView;

2017年2月7日火曜日

Spring Boot / JPAとか

Spring BootのJPA周りとかでつまずいたところのメモ


メモ

JPA /JPQLのつまずきポイント
@QueryのFrom句は、ドメインクラスの@Table(name=xxx)の指定とは関係がなく、
ドメインクラス名を指定する

****
具体的には、
ドメインクラスでこう指定し、
@Table(name = "customers")

リポジトリのJPAインターフェースを下記のように設定
public interface CustomerRepository
 extends JpaRepository {
    @Query("SELECT x FROM Customer x ORDER BY x.firstName, x.lastName")
    List findAllOrderByName();

}
customersだとmappingできないと怒られる。
ドキュメントをちゃんと読もう

RequestMappingの設定確認
@RestControllerをつけたクラスに、
対応した@RequestMappingが付与する

起動時の確認としては、ログにMapped "xxx" onto ....と出力されるかを確認する
Looking for @ControllerAdvice: 
 org.springframework.boot.context.embedded.
 AnnotationConfigEmbeddedWebApplicationContext@243c4f91
Mapped "{[/api/customers],methods=[GET]}" 
 onto java.util.List 
 com.example.api.CustomerRestController.getCustomers()
...

SQL / Primary key制約の解除
> ALTER TABLE table_name DROP CONSTRAINT primary_key_name ;

JPA / Pagingとsort
Mapping(Controller)
    @GetMapping
    Page<Customer&t; getCustomers(@PageableDefault Pageable pageable) {
        Page customers = customerService.findAll(pageable);
        return customers;
    }
Service
    public Page<Customer> findAll(Pageable pageable) {
        return customerRepository.findAll(pageable);
    }
Repository
public interface CustomerRepository extends JpaRepository<Customer, Integer&t; {
    @Query("SELECT x FROM Customer x ORDER BY x.firstName, x.lastName")
    Page<Customer&t; findAllOrderByName(Pageable pagealbe);
}
URLパラメータで表示数を変化できる
http://localhost:8080/project?page=1&size=3
これ面白い。ちょうど検索数が多い場合の画面を実装どうしようと考えていたとこ。
Pageの内容だとこんな感じのJSON
{"content":[{"id":1,"firstName":"Hanamichi","lastName":"Sakuragi"},
{"id":2,"firstName":"Kaede","lastName":"Rukawa"},
{"id":3,"firstName":"Sho","lastName":"Sato"}],
"last":false,
"totalElements":5,
"totalPages":2,
"size":3,
"number":0,
"numberOfElements":3,
"first":true,"
sort":null}


Spring / 開発時にHTMLのキャッシュを無効化する
デフォルトはパフォーマンス向上のため、HTMLはキャッシュされる設定です。
そのため、HTMLキャッシュを開発時に無効化すると効率的にHTMLファイルの変更を確認できます。

方法は2通り
  1. application.propertiesで設定する
  2. Spring Dev Toolsを使用する
Spring Dev Tools はgradleならbuild.gradleのdependencyに加えておくだけ。

2017年2月5日日曜日

Eclipse

Eclipseのschoo授業を見てみた


ショートカット

Undo / Redo
  • Win:Ctrl + z / Ctrl + y
  • Mac:Ctrl + z / Ctrl + Shift + z

カーソルがある行を削除
  • Win:Ctrl + d
  • Mac:Ctrl + d

先頭末尾移動
  • Win:Ctrl + ↑→↓←
  • Mac:Cmd + ↑→↓←

カーソルがある行の移動
  • Win:alt + ↑↓
  • Mac:opt + ↑↓

カーソルがある行を前後行にコピー
  • Win:Alt + Ctrl + ↑↓
  • Mac:opt + Cmd + ↑↓

改行せずに行挿入
  • Win:Shift + Enter
  • Mac:Shift + Enter

不要なimport文の削除
  • Win:Ctrl + Shift + o
  • Mac:Shift + Cmd + o

対応する中かっこへ移動
  • Win:Ctrl + Shift + p
  • Mac:Cmd + Shift + p

フォーマット
  • Win:Ctrl + Shift + f
  • Mac:Ctrl + Shift + f

mainメソッドの実行
  • Win:Ctrl + alt + xj
  • Mac:Cmd + opt + xj

入力補完の呼び出し
  • Win:Ctrl + space
  • Mac:Ctrl + space

Rename
  • Win:Ctrl + Alt + r
  • Mac:Cmd + opt + r

プロジェクトサーチ
  • Win:Ctrl + h
  • Mac:Ctrl + h

2017年2月4日土曜日

あまり進展しないPostgre SQLメモ -case式

達人に学ぶ SQL徹底指南書を読んで、Postgre SQL DBで試してみました。


メモ

とりあえずpostgresql serverの起動
$ postgres -D /usr/local/var/postgres

いるはずのユーザのログインで、DBがないって怒られる
(usr) $ psql -U usr -W
Password for user usr: 
FATAL:  database "usr" does not exist
psql: FATAL:  database "usr" does not exist
$ 
なにやら、psql実行時ユーザと同じロール名でアクセスする際は、
-UをつけていてもDB名として認識されるみたいでした。
DB名を記載すれば、期待通り、-Uはロール名として認識してくれました。
$ psql -U usr -W testdb

\l
DBの一覧表示

# create database professional_sql ;
databaseの作成

# \c proffesional_sql
DBへの接続

新規テーブルの作成
create table Greatests (
  key char(1) primary key
  , x integer not null
  , y integer not null
  , z integer not null
);

\dt
テーブルの一覧表示

\i file
SQLファイルからクエリの実行

UNION / UNION ALL
UNIONは重複を削除
UNION ALLは削除しない

\w ファイル名
バッファに残っている内容をファイルに保存

PostgresqlでGreatest/Least関数使えるんですね
Release 8.1で追加されたみたいでした。
Add GREATEST() and LEAST() variadic functions (Pavel Stehule)
8.1 release note

都道府県テーブルを作る
東京都の人口が1,300万なので、
2バイトのsmallintでは足りず、4バイトのintegerがちょうど良さげ

最初に該当したwhen句を返す
対象値は重複させないようにする
ELSE句を省略すると
ELSE NULLとなる

条件法
「PならばQ」の論理式
「P→Q」と書ける

論理積(logical product)
「PかつQ」の論理式 「P^Q」と書ける

\r
クエリのキャンセル

テーブルのリネーム
alter table cousemaster rename to coursemaster;

# \! pwd
psqlプロンプトでlinuxコマンドを実行

# \d TABLE_NAME
テーブル定義を確認する
参考:PostgreSQLのpsqlでテーブル定義を確認する方法

テーブルに付く制約とカラムに付く制約
表現が正しいか自信がないが、あるカラムに対する制約はカラムに適用され、
複数カラムにまたがる制約はテーブルに適用されているみたいでした。
alter文やテーブル定義を確認しただけの推測です。公式ドキュメント読まな。。。
# alter table studentclub add primary key (std_id, club_id);
# alter table studentclub alter column main_club_flg set not null;

アルファにしてオメガ
最初にして最後
コトバンクより

$createdb hoge / $dropdb hoge
localのpostgresに対してcreate database hoge(drop database hoge)を実行する

データベース名
先頭はアルファベット
63文字以内
ユーザ名と同じデータベース名を推奨

DBに接続するPostgreSQLユーザ
指定がなければ、OSのアカウントと同じ名前を使用
Postgresを起動するOSユーザは、PostgreSQLユーザとしても存在する

mydb=> / mydb=#
mydb=> 一般ユーザ
mydb=# スーパーユーザ

SELECT version();
バージョン情報を取得

識別子を二重引用符で囲むと大文字小文字を区別する
公式ドキュメントを読んでてびっくりした。
SQLはキーワードと識別子に対して大文字小文字を区別しません。 
ただし、(上では行っていませんが)識別子が二重引用符で括られていた場合は大文字小文字を区別します。
version 8.4.4だけど、多分、最新でもそうでしょう。

COPYコマンド
クライアントとサーバが別で(localhostでなくて)、サーバにファイルを置かない場合、\copyコマンド
サーバにファイルを置く場合(COPYコマンド)
参照:CSVファイルをデータベースにインポートする
# copy coursemaster from '/Users/usr/test.csv' USING DELIMITERS ',';
from句でファイルをフルパスで書く必要性がありました。

ビュー
他のビューに対して、ビューをつくってもOK
CREATE VIEW tempview AS
    SELECT city, location
        FROM weather, cities
        WHERE city = name;

ウィンドウ関数
チュートリアルで説明されるほど、メジャーな関数なのですが、
自分がOracle DB Bronze SQLを勉強したときは、試験範囲ではなかったと思います。
利点は、集約しなくても、平均や順位を出すことができるということです。
avg(salary) OVER (PARTITION BY depname)
rank() OVER (PARTITION BY depname ORDER BY salary DESC)
OVER句をつけることにより、avg集約関数ではなく、ウィンドウ関数として扱われます。

また、partition by COLUMN_NAMEは省略可能で、この場合は全ての行を含む仮想テーブルを対象とします。
SELECT score, sum(score) over () from score_table;
また、ORDER BY句のみの場合は、
ウィンドウ範囲が広がっていくような動きになります。
SELECT score, sum(score) over (ORDER BY score) from score_table;
公式にもありますが、重複するscoreがsumに含まれないことに注意が必要です。 ウィンドウ関数は、SELECT句とORDER BY句でしか使えません


テーブルの継承
初めて知った。テーブルを拡張する場合に、選択可能な手段です。
デメリットはUNIQUE制約または外部キーと合わせて使えないこと。これは痛い
CREATE TABLE users (
  name text,
  create_dt date
);

CREATE TABLE super_users (
  approver text
) INHERITS (users);

文字列定数内に'シングルクォートを入れる
''と続けて2つシングルクォートを入力する

改行で文字定数を区切った場合
SELECT 'foo'
'bar';
 ?column? 
----------
 foobar

SELECT 'foo''bar';
 ?column? 
----------
 foo'bar

# SELECT 'foo'      'bar';
ERROR:  syntax error at or near "'bar'" at character 19
STATEMENT:  SELECT 'foo'      'bar';
ERROR:  syntax error at or near "'bar'"
LINE 1: SELECT 'foo'      'bar';
                          ^

エスケープ文字列定数
E'hoge'というように、シングルクォートの前にEをつける
エスケープ文字列定数内だとシングルクォートを入力するのに、''以外に\'も使える

引用符を指定する
$$や$hoge$と文字列定数の区切り文字を指定することができる

Oracle DBでは別名にasをつけない
トリビア

dropテーブルの権限は付与できない
テーブルの所有者しか、テーブルの削除はできない。権限をGRANTできない。
レコードの削除(DELETE)権限は付与することができる

PostgreSQLはレコードをDELETEしても、物理削除しない
知らなかったよー。

以下引用:OSS DB/Silverの例題解説「運用管理 - 基本的な運用管理作業(自動バキュームの概念と動作)」
PostgreSQLは追記型のデータ構造を採っており、
データをDELETEしても、データに削除済フラグがつくだけで、
物理的にはデータが削除されません。

UPDATEも内部的にはDELETEとINSERTを実行するため、
古いデータが残り、そのまま放置すると物理的なデータ量が増えていきます。
この削除済みデータの領域を回収するのがバキューム(VACUUM)機能であり、
それを自動的に実行するのが自動バキュームです。

PITR
Point In Time Recovery
特定時点への復旧のこと

createuserの方式変更
PostgreSQL 9.1:対話式
PostgreSQL 9.2:デフォルトで権限を付与しない

付与していないユーザ権限の剥奪
エラーにもならず、コマンドは実行される

RoleとUserに違いがない
PostgreSQLだとそうらしい