OmniAICreator/Qiita-1.07M huggingface dataset:
Crystalを試す：その2

[前回の記事](http://qiita.com/AQeNku/items/dc8992e4511ecb9e7bbb)からの続き

## 6. 引数を与えてみる
Rubyと同じでARGVに格納されるっぽい
とりあえずhello.crを以下のように変更

```hello.cr
puts "Hello world!"
puts ARGV
```

実行してみる

```
$ crystal hello.cr
Hello world!
[]

$ crystal hello.cr aaa
Hello world!
["aaa"]

$ crystal hello.cr aaa bbb
Hello world!
["aaa", "bbb"]

$ crystal hello.cr aaa bbb cc,cer
Hello world!
["aaa", "bbb", "cc,cer"]
```

## 7.「-h,--help」のようなオプションを使いたい場合
OptionParserクラスというのを使えば良いっぽい
詳細：https://crystal-lang.org/api/0.19.4/OptionParser.html

ということで上記URLのサンプルと同じソースコードにhello.crを変更
``puts "hello"``と``puts ARGV``は消さずにコメントアウト(なんとなく)

```hello.cr
# puts "hello"
# puts ARGV

require "option_parser"

upcase = false
destination = "World"

OptionParser.parse! do |parser|
  parser.banner = "Usage: salute [arguments]"
  parser.on("-u", "--upcase", "Upcases the salute") { upcase = true }
  parser.on("-t NAME", "--to=NAME", "Specifies the name to salute") { |name| destination = name }
  parser.on("-h", "--help", "Show this help") { puts parser }
end

destination = destination.upcase if upcase
puts "Hello #{destination}!"
```

 - コンパイルせずに実行するときは``crystal hello.cr -- <hello.crに記述したオプション>``となる

```
$ crystal hello.cr
Hello World!

$ crystal hello.cr -- -u
Hello WORLD!

$ crystal hello.cr -- -t "Crystal"
Hello Crystal!

$ crystal hello.cr -- --help
Usage: salute [arguments]
    -u, --upcase                     Upcases the salute
    -t NAME, --to=NAME               Specifies the name to salute
    -h, --help                       Show this help
Hello World!
```

 - コンパイルした後なら``--``は不要となる

```
$ crystal build hello.cr 
$ ./hello -u
Hello WORLD!
$ ./hello --to=Crystal
Hello Crystal!
$ ./hello -t Crystal -u
Hello CRYSTAL!
$ ./hello --help
Usage: salute [arguments]
    -u, --upcase                     Upcases the salute
    -t NAME, --to=NAME               Specifies the name to salute
    -h, --help                       Show this help
Hello World!
```

## 8.プロジェクトの作成
``crystal init app <project_name>``で作成

```
$ crystal init app Sample
      create  Sample/.gitignore
      create  Sample/LICENSE
      create  Sample/README.md
      create  Sample/.travis.yml
      create  Sample/shard.yml
      create  Sample/src/Sample.cr
      create  Sample/src/Sample/version.cr
      create  Sample/spec/spec_helper.cr
      create  Sample/spec/Sample_spec.cr
Initialized empty Git repository in /usr/local/crystal/Sample/.git/
```

なんかいっぱい生えた
spec/はたぶんテスト用だろうなー
src/が基本的にソースコードを入れる感じかなー

```
$ cd /usr/local/crystal/Sample
$ more src/Sample.cr 
require "./Sample/*"

module Sample
  # TODO Put your code here
end
$ more src/Sample/version.cr 
module Sample
  VERSION = "0.1.0"
end
```
OptionParserで、「-v,--version」指定時にsrc/Sample/version.cr呼べばバージョン表示ができそう
短いけど今回はここまで
Terraform -install-

# 目的
インフラをコードで管理するためにオーケストレーションツールの[Terraform](https://www.terraform.io/)を使用し、Ansibleと連携していく

# 方法
DLしてPATHが通っている場所へ置くだけ。

# 設定
```bash
$ mkdir terraform-install
$ wget https://releases.hashicorp.com/terraform/0.7.10/terraform_0.7.10_linux_amd64.zip
$ unzip -d terraform-install terraform_0.7.10_linux_amd64.zip
$ sudo  mv terraform /usr/bin/
$ terraform -v
Terraform v0.7.10

Your version of Terraform is out of date! The latest version
is 0.7.11. You can update by downloading from www.terraform.io
```

# TERRAFORM COMMANDS (CLI)
```bash
$ terraform
Usage: terraform [--version] [--help] <command> [args]

The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.

Common commands:
    apply              Builds or changes infrastructure
    destroy            Destroy Terraform-managed infrastructure
    fmt                Rewrites config files to canonical format
    get                Download and install modules for the configuration
    graph              Create a visual graph of Terraform resources
    import             Import existing infrastructure into Terraform
    init               Initializes Terraform configuration from a module
    output             Read an output from a state file
    plan               Generate and show an execution plan
    push               Upload this Terraform module to Atlas to run
    refresh            Update local state file against real resources
    remote             Configure remote state storage
    show               Inspect Terraform state or plan
    taint              Manually mark a resource for recreation
    untaint            Manually unmark a resource as tainted
    validate           Validates the Terraform files
    version            Prints the Terraform version

All other commands:
    state              Advanced state management
```
Crystalを試す：その1

# ■実行環境
- VMwarePlayer上のCentOS 6.8(Final)
- 割当は1コア、1GBメモリ、20GBのディスク容量

# ■Crystalの導入
## 1.crenvのインストール
以下を参考にcrenvを入れる
○[Ruby 風な静的言語 Crystal の開発環境を crenv で簡単に構築する](http://qiita.com/pine613/items/54b8d98b8fd416ac73ec "Ruby 風な静的言語 Crystal の開発環境を crenv で簡単に構築する")

```
$ cd /usr/local
$ git clone https://github.com/pine613/crenv crenv
$ git clone https://github.com/pine613/crystal-build.git crenv/plugins/crystal-build
$ bash -c 'cat <<\__EOT__ >> /etc/profile.d/crenv.sh
export CRENV_ROOT="/usr/local/crenv"
export PATH="${CRENV_ROOT}/bin:${PATH}"
eval "$(crenv init -)"
__EOT__'
$ exec ${SHELL} -l
$ crenv --version
crenv 1.0.1-9-ge371d5e
```
## 2. Crystalのインストール
```
$ crenv install -l
Available versions:
インストール可能なバージョンがずら～っと並ぶ
$ crenv install 0.19.4
$ crenv rehash
$ crenv global 0.19.4
$ crystal --version
Crystal 0.19.4 [7f82f79] (2016-10-07)
```
 - yumを使ってインストールしたい場合  
http://ja.crystal-lang.org/docs/installation/index.html  
上記の「RedHat や CentOS」を参考にCrystalのリポジトリを追加する  
そのあと以下のように手を加える

``` /etc/yum.repos.d/crystal.repo
[crystal]
name = Crystal
baseurl = http://dist.crystal-lang.org/rpm/
enabled=0 # ←これを追記
```

実際にyumでインストールするときは``--enablerepo=crystal``をつけて実行する

```
$ yum install -y --enablerepo=crystal crystal
```

## 3.vim-crystalの導入
[vim用のCrystalプラグイン](https://github.com/rhysd/vim-crystal)をNeoBundleでインストール
NeoBundleの導入方法については割愛

``$HOME/.vimrc``に以下のように追加したあとvimを開いて``:NeoBundleInstall``で良いはず

```$HOME/.vimrc
(人によって色々書かれている設定)
NeoBundle 'rhysd/vim-crystal'
(人によって色々書かれている設定)
```

## 4.「Hello world!」の実行
適当にCrystal用のディレクトリを切っておく

```
$ mkdir /var/local/crystal
$ cd /var/local/crystal
```
みんなが一度は書いている「Hello world!!」を表示するプログラムを書く

```hello.cr
puts "Hello World!!"
```

実行方法は``$ crystal <ファイル名>.cr``

```
$ crystal hello.cr
Hello world!
```

## 5.hello.crをネイティブコードにコンパイルして実行してみる 

``crystal build <ファイル名>.cr``でネイティブコードにコンパイルしてくれる

```
$ crystal build hello.cr
$ ls -l 
合計 640
-rwxr-xr-x 1 root root 649215 11月 16 19:43 2016 hello
-rw-r--r-- 1 root root     20 11月 16 19:43 2016 hello.cr
```
 - 拡張子の付いていない「hello」が実行ファイルとなるので、これを実行する


```
$ ./hello
Hello world!
```
``crystal build <ファイル名>.cr --release``で最適化された実行ファイルをコンパイルできる

今回はここまで
Railsでlibディレクトリを使うときはconfig.paths.addを使おう

# TL;DR

http://blog.arkency.com/2014/11/dont-forget-about-eager-load-when-extending-autoload/
これ読んでください。

# 概要

```rb:config/application.rb
config.autoload_paths += %W( #{Rails.root}/lib )
```

こんな感じのコードありますよね。
これだと、たしかに`autoload`はされるんですが、`eager_load`はされないのです。なので、`eager_load`が有効になっている本番環境などで、状況によっては`NameError`が起きてしまう。
代わりに、

```rb:config/application.rb
config.paths.add "#{Rails.root}/lib", eager_load: true
```

と書くとeager_loadもされるので、本番環境でもエラーが起きず安心、というわけです。

# 余談

`autoload`と`eager_load`でアンスコあるなしを統一してほしい…
Cognos 10 BI のLinux + DB2環境への導入手順書

Cognos 10 BIをLinux + DB2の環境に導入する手順です。

ご活用下さい。

【Cognos BI 10.1.1 for Linux RHE 5.6 導入手順】
http://www.slideshare.net/ShinsukeYamamoto/cognos-bi-installlinuxdb2
Ansible | iteritem の動作


## データ

yaml でいうと、こんなデータ構造があるとする。

```yaml
people:
  Alice:
    favorite: apple
  Bob:
    favorite: banana
  Carol:
    favorite: cherry
```

## テンプレートファイル

こんな感じ。


```example.txt.j2
{% for person, info in people.iteritems() %}
  {{ person }} likes {{ info.favorite }}
  {{ person }} is {{ info.age }} years old
{% endfor %}
```

この場合 `people` の全情報を `for` でに展開している。

さらに `for` の中で、ひとつずつの要素は `person(key)` と `info(value)` に分かれる。

`person` はキーなので、単純に文字列として出力できる。

`info` の方はネストされたハッシュなので、さらに `info.favorite` と `info.age` を得ることが出来る。

## 生成されるファイル

```example.txt
Carol likes cherry
Carol is 40 years old
Bob likes banana
Bob is 30 years old
Alice likes apple
Alice is 20 years old
```

# ちなみに

`iteritems` は `iterate items` の略っぽい。


# 環境

- ansible 2.0.0.2








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
プレイヤーを矢印キーで動かすスクリプト

```c#:PlayerController.cs
using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour
{
    public Vector2 SPEED = new Vector2(0.05f, 0.05f);  //set speed line                                              

    // Use this for initialization
    void Start()
    {

    }

    // Update is called once per frame
    void Update()
    {
        Move();

    }
    //when u push arrowkey

    void Move()
    {
        // 現在位置をPositionに代入
        float moveX = 0f;
        float moveY = 0f;
        Vector2 Position = transform.position;
        if (Input.GetKey("left"))
        {
            // 代入したPositionに対して加算減算を行う
            moveX -= SPEED.x;
        }
        else if (Input.GetKey("right"))
        { 
          // 代入したPositionに対して加算減算を行う
            moveX += SPEED.x;
        }
        if (Input.GetKey("up"))
        { 
          // 代入したPositionに対して加算減算を行う
            moveY += SPEED.y;
        }
        else if (Input.GetKey("down"))
        { 
          // 代入したPositionに対して加算減算を行う
            moveY -= SPEED.y;
        }
        if (moveX != 0f && moveY != 0f)
        {
            moveX /= 1.4f;
             moveY /= 1.4f;
        }
        Position.x += moveX;
        Position.y += moveY;
        // 現在の位置に加算減算を行ったPositionを代入する
        transform.position = Position;
        Clamp();
    }
    void Clamp()
    {//プレイヤーをゲーム画面から出さないための範囲指定
        
        Vector2 min = Camera.main.ViewportToWorldPoint(new Vector2(0, 0));

       
        Vector2 max = Camera.main.ViewportToWorldPoint(new Vector2(1, 1));

        Vector2 pos = transform.position;

        
        pos.x = Mathf.Clamp(pos.x, min.x, max.x);
        pos.y = Mathf.Clamp(pos.y, min.y, max.y);

        transform.position = pos;
    }
}
```
vmware > ホストとゲスト間のコピー不可問題 (v12.5.1) / ゲストOS起動時に.vmxが書き換えされる

```txt:動作確認
VMware Workstation v12.5.1
ホスト: Windows 10
```

VMwareではホストとゲスト、ゲスト間のコピペができなくなる症状が見られる。

http://qiita.com/7of9/items/7facd5aa07497b53a2ec
の記事において`isolation.tools.copy.disable = "FALSE"`と`isolation.tools.paste.disable = "FALSE"`の場所を変更することによりこの症状を解消できていたが、v12.5.1になってまた状況が変化した。

v12.5.1で使用しているゲストOSの.vmxは「ゲストOS終了時に書換えされる」のかもしれない。

試しに

```
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"
isolation.tools.copy.disable = "FALSE"
isolation.tools.paste.disable = "FALSE"
```

とした.vmxファイルを用いてゲストOSを起動して、しばらくしてから終了すると以下のようになっている (.vmxファイルの内容が書き換えられている)。


```
isolation.tools.copy.disable = "FALSE"
isolation.tools.paste.disable = "FALSE"
usb:0.present = "TRUE"
usb:0.deviceType = "hid"
usb:0.port = "0"
usb:0.parent = "-1"
```

この作業において、設定変更などは一切していない。

http://qiita.com/7of9/items/7facd5aa07497b53a2ec
においては.vmxファイルを書換えることによりコピペ不可問題を解消できていたが、上記の状況なのでその解消が1回の起動で無効になる。

要調査。

### 起動時の.vmxファイルの書換え

ゲストOSを起動時に`.vmxファイル`の内容が書き換えされるようだ。
(ゲストOSの終了時ではなかった）。

### コピペ不可の解消について

一旦`isolation.tools.copy.disable = "FALSE"`と`isolation.tools.paste.disable = "FALSE"`の位置を変更したゲストOSで、ゲストOS起動時に.vmxファイルが書換えされる。
しかしながら、書換え以降でもコピペ不可が解消されているようだ。

設定ファイルの記載内容順番が問題ではないのだろうか。

とりあえずコピペ問題は回避できたのでよしとする。
macOS Sierra(OS X 10.12.1)でgoのVisual Studio Code上でのデバッグ

**2016/11/18時点の情報。**
`brew install go-delve/delve/delve`
でいくらやっても
`could not launch process: could not fork/exec`
となり、デバッグ実行できず。brew installだと証明書は作成されるが、dlvに署名されていないようにみえる。

brewは諦めて[手動インストール](https://github.com/derekparker/delve/blob/master/Documentation/installation/osx/install.md#manual-install)。証明書はbrewのものを流用できて比較的ラク。
再度デバッグ実行するも、今度は以下のエラーが発生。
`could not launch process: could not get thread count`

どうも、Sierraに由来する問題があるらしく、以下のようにPRを適用することでとりあえずデバッグ実行できるようにはなった。

```
git clone https://github.com/derekparker/delve.git && cd delve
git fetch origin pull/665/head
git checkout FETCH_HEAD
CERT=dlv-cert make install.
```

記事作成時点ではまだcloseしてないので要監視。

情報元：
[OS X: cannot get thread count #645](https://github.com/derekparker/delve/issues/645)
JavaからPHPに入った人が　これってどうなんだろう　って思う部分。　その１

JavaからPHPに入った私がこれってどうなるんだろうと不安で仕方なかった部分の実験です。
適当に少々まとめました
本文はコメントとして記述しています

```PHP:Test.php
<?php

ini_set('display_errors', 1);

//  array_values　は値が　null　のものも除去するのか
//  期待　Array ( [0] => 0 [1] => [2] => 2 )　nullもnullという値なのだから除去して欲しくない
//  結果　Array ( [0] => 0 [1] => [2] => 2 )
//  null　は除去されない　やったね＾＾
print_r(array_values(array(0, null, 2)));

/*
↑↑ちなみに　array_values　は引数省略でオブジェクトを文字列として比較していますので独自クラスで使用するには独自クラスに
public function __toString()
の定義？オーバーライド？が必要です。
（ちょっとJavaっぽい）
*/

//  配列要素の参照を　unset　するとどうなるか
//  期待　Array ( [0] => 0 [2] => 2 )　foreachでの削除が便利なのでできないかなー
//  結果　Array ( [0] => 0 [1] => 1 [2] => 2 )
//  削除できない　あくまで参照という変数をunsetしただけ
$values = array(0, 1, 2);
foreach ($values as $i => &$v) {
    if ($i == 1) {
        unset($v);
    }
}
//ここで　unset($v)　すべきだが今回は実験なのでややこしくなるすぐ下の下記で説明
print_r($values);

/*
↑↑注意！特に　foreach　の参照を使用する場合、　foreach　のブロックを抜けたときに
参照に使った　$v　を　unset　すべき（phpではJavaと違い変数のスコープが変態）
なぜならこのコードの後に　$v　という変数を新しく定義＆初期化したつもりで
$v = 0;　などと書いてしまうと、　$v　は参照になっているため　配列の要素が書き換えられてしまう。

ちなみに、C言語系ではintなどは参照渡しより値渡しのほうが高速
これも考えてみれば当たり前で、64ビット環境のint（３２）なら
参照は　64ビット&参照する処理が必要
値渡しなら　32ビットで参照処理不要
*/

//  もちろん上記の配列ではなく変数バージョンも同じくむり
//  結果　hey
$value = 'hey';
$ref = &$value;
unset($ref);
print_r($value);

//  call_user_func　は　リフレクションのような関数ポインタのようなもの
//  ただし、参照を引数に渡すことは出来ない
//  なぜなら、call_user_funcの定義自体は参照を引数としないため
//  公式の裏技がある
function takeshi(&$str) {
    $str = '武';
}

//  武　と出力される事を期待するが、参照ではなく値渡しになっているので　さくらこ　のまま
//  よくよく考えればしかたないこと　call_user_funcの定義自体は参照を引数としないため
$str = 'さくらこ';
call_user_func('takeshi', $str);
print $str;

//  こちらを使用すると可能
//  武　と出力される
//  なぜこれが可能かというと、call_user_func_arrayに渡しているのは　値　だから
//  そして、その値である　array　が参照を持っているだけ
//  ただ、そのarrayに参照を格納することを明示的にしなければいけないので　&$str　とする
$str = 'さくらこ';
call_user_func_array('takeshi', array(&$str));
print $str;

?>
```
Gitがいつの間にかno_proxyに対応してた

Git、昔は`no_proxy`対応していないくて、Google先生に聞いてもこんな感じだった。

![git_no_proxy_-_Google_検索.png](https://qiita-image-store.s3.amazonaws.com/0/6092/1269e6d8-b2f9-0b58-696e-f53d4cf51c6a.png)


どうやら最近のGitは対応している模様。  
gitのバージョン。

```bash
git --version
git version 2.10.2
```

`no_proxy` を設定していない状態だと、

```bash
$ echo $no_proxy

$ git push
fatal: unable to access 'http://example.com/hoge.git/': The requested URL returned error: 503
```

って感じでつながらない。

`no_proxy` を設定してやるとつながるので、どうやら設定が効いている…！

```bash
$ echo $no_proxy
127.0.0.1,localhost,192,168.*,example.com

$ git push
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 376 bytes | 0 bytes/s, done.
Total 3 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1)
remote: Updating references: 100% (1/1)
To http://example.com/hoge.git
   a00b56b..c463c57  master -> master
```

Gitのコミットログを追ってみると、どうやら最近(2016/3) `no_proxy`に対応した模様。

* [Merge branch 'jx/http\-no\-proxy' · git/git@f4a48e8](https://github.com/git/git/commit/f4a48e870892b18a7205c9315821e4b6a831ade4)

昔の知識で、「Git、no_proxy対応してないんだよなー、どうしようかなー」とか思ってたら対応が進んでいたりするので、たまに変わりが無いか確認するのも良い。
安全に（？）「ウィンドウ枠の固定」を行う

## 追記（注意）

通常の方法（マクロの記録で得られるコードを実行するか、手動でウィンドウ枠の固定を行う）でウィンドウ枠の固定を行ったワークシートと行き来するとレイアウトが崩れるという問題が発生しました。引き続き検証しますが、しばらく以下のコードは使わない方がよさそうです。

## はじめに

タイトルでお分かりいただけるかとは思いますが、Excel の VBA です。Access, Word などは対象ではありません。

## 問題点
「ウィンドウ枠の固定」は頻繁に使用する機能ですが、ネットでよく見かけるサンプルおよびマクロの記録で得られるコードには以下のような落とし穴があります。

- セルの選択を伴う
- ユーザーが「時間がかかる処理だから」と、Excel を最小化しておくとエラーになる
- 基点がスクロール領域の外側にあるとおかしいことになる

## 解決した関数

これらの問題を解決した関数は、以下のようになります。

```vbnet:ウィンドウ枠の固定
Public Sub FreezePane(r As Long, c As Long)
   
    With ActiveWindow
       
        Dim saveWindowState As XlWindowState
        saveWindowState = .WindowState
        .WindowState = xlNormal
       
        If .FreezePanes Then .FreezePanes = False
       
        .SplitRow = r
        .SplitColumn = c
        .FreezePanes = True
       
        .WindowState = saveWindowState
       
    End With
   
End Sub
```

```vbnet:ウィンドウ枠の固定の解除
Public Sub UnfreezePane()
   
    With ActiveWindow
       
        Dim saveWindowState As XlWindowState
        saveWindowState = .WindowState
        .WindowState = xlNormal
       
        .FreezePanes = False
        .SplitRow = 0
        .SplitColumn = 0
       
        .WindowState = saveWindowState
       
    End With
   
End Sub
```

## 副作用

SplitRow や SplitColumn を有効に使っているコードは、これらを無効にしてしまいます。ご注意ください。

Application.ScreenUpdating の設定如何にかかわらず、一瞬 Window がちらつく場合があります。


## 免責

コード例は説明のために極端に単純化している場合があります。コード例以外の部分で基本的な事柄の説明が省略されているかもしれません。

エラーを回避するのが目的だったためタイトルには「安全に」とか書きましたが、副作用が結構あるのでむしろ危険かもしれません。
PostgreSQLでユーザー（ロール）を追加してテーブルにアクセスする

#■前提
開発用に適当なユーザーを追加して作業がしたい場合にユーザーを追加する方法。

初めてPostgreSQLを使って、
テスト用にユーザーを追加して処理を行おうとしたらハマったので書きました。

なお、PostgreSQLではいわゆるユーザーを「ロール」と呼びます。

ロールの追加は基本的に２段階です。
１．ロールを追加する
２．テーブルへの権限を追加する

##・実行環境
Windows10
PostgreSQL 9.6.1

#■ユーザーを追加する

コマンドプロンプトを起動します。
まずはスーパーユーザーでログインします。

	psql -U postgres


ユーザーを追加するには以下のコマンドを使います。
CREATE ROLE <ロール名> WITH LOGIN PASSWORD '<パスワード>';

今回は以下のようなユーザーを作成します。
ロール名：role_sample
パスワード：password

	postgres=> CREATE ROLE role_sample WITH LOGIN PASSWORD 'password';

※パスワードを囲うシングルクォーテーションを忘れるとエラーになるので注意

	postgres=> CREATE ROLE role_sample WITH LOGIN PASSWORD password;
	ERROR:  "password"またはその近辺で構文エラー
	行 1: CREATE ROLE role_sample WITH LOGIN PASSWORD password;
	                                                  ^

#■ユーザーを使う
##・ログインを試す
	>psql -U role_sample
	ユーザ role_sample のパスワード:
	psql: FATAL:  データベース"role_sample"は存在しません

作成したばかりのロール名だけでログインしようとすると上記のようなメッセージが表示されます。

##・DBを指定して再度ログイン
	>psql -U role_sample -d postgres
	ユーザ role_sample のパスワード:
	psql (9.6.1)
	"help" でヘルプを表示します.

データベースを指定するとログイン出来ます。
（postgresは初めから生成されているデータベスです）

##・SQLの実行
	postgres=> select * from pg_shadow;
	ERROR:  リレーション pg_shadow への権限がありません

現在のrole_sampleロールの状況
ロールは作成され、DBにはログイン出来るが、テーブルへのアクセス権限を持たない状態です。
テーブルにアクセスするためには権限の付与が必要です。


##・テーブルアクセス権限の付与
一度、role_userからログアウトし、postgresでログインしなおします。

GRANT <権限の種類> ON <テーブル名> TO <ロール名>;
権限の種類は、SELECTやUPDATEなどのテーブルに対する操作の名称となります。
詳細は参考サイトを参考にしてください。
複数の権限を設定する場合は、カンマ区切りで権限をつなげます。

role_sample に pg_shadow へのSELECTとINSERT権限を付与します。

	postgres=> GRANT SELECT ON pg_shadow TO role_sample;


postgresからログアウトし、role_userで再度ログインします。

	>psql -U role_sample -d postgres
	ユーザ role_sample のパスワード:
	psql (9.6.1)
	"help" でヘルプを表示します.

	postgres=> select * from pg_shadow;

	   usename   | usesysid | usecreatedb | usesuper | userepl | usebypassrls |               passwd                |        valuntil        | useconfig
	-------------+----------+-------------+----------+---------+--------------+-------------------------------------+------------------------+-----------
	 postgres    |       10 | t           | t        | t       | t            | md5633bc3c3d823be2a52d3dff94031e2c2 |                        |
	 role_sample |    24593 | f           | f        | f       | f            | md566db5a3e78c609bc2f01adcbab20850a |                        |
	(2 行)

今度は正しくデータが取得出来ました。

#■以上
以上です。
今回の肝は、
ユーザーはデフォルトでテーブルへのアクセス権限を持たない
というところかと思います。
それだけ理解していれば、今回の操作は難しくないでしょう。


#■参考
『DB Online』ロール(ユーザー)の作成
http://www.dbonline.jp/postgresql/role/

『PostgreSQLでテーブルに対してのアクセス権限を設定する・GRANT,REVOKE』
http://db.just4fun.biz/PostgreSQL/%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E6%A8%A9%E9%99%90%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%99%E3%82%8B%E3%83%BBGRANT,REVOKE.html
EC2インスタンスのmetadataを効率よく直感的に参照する

こないだ、ドキュメント:page_facing_up:を何気なく眺めていたら、**EC2 Instance Metadata Query Tool (ec2-metadata)**なる存在を知りました。

2008年からあったみたいですが、いままで知りませんでした:sweat_smile:

で、このツールをさらっと触った感じ、**いい感じ**:grinning:だったので紹介します。

# :thinking:いままで
EC2インスタンスのメタデータを取りたい時は、いつもリンクローカルアドレス(169.254.169.254)に対してhttpリクエストを出して情報を取得していました。

こんな感じですね。

```bash
[ec2-user@ip-172-20-21-62 ~]$ curl http://169.254.169.254/latest/meta-data/ami-id
ami-0c11b26d
```

ですが、お手軽な反面、意外と使いづらいなぁと感じていました。

印象として

:one: 169.254.169.254はブラインドタッチしづらい
 :point_right: よくタイプミスする

:two: 目的の情報までのパスが長い
:point_right: 覚えきれない

:three: 1リクエストで1情報しかとれない
:point_right: instance-idとinstance-type などまとめて確認したい時がある

で、これが**ec2-metadata**を使うと、どう変わるのか見ていきます。

# :slight_smile:どうなるか？

## :one: 169.254.169.254はブラインドタッチしづらい

いままでタイプしていた`http://169.254.169.254/latest/meta-data/`に比べて、`ec2-metadata`だけで良いので、**かなりタイプミスが減ります**。

更に、AmazonLinuxであれば、最初からインストール（※）されておりパスが通っていますので、タブの補完が効きます。

`ec2-me`くらいまでTabをタイプすれば補完されるので、すごい楽。

```bash
[ec2-user@ip-172-20-21-62 ~]$ uname -a
Linux ip-172-20-21-62 4.4.23-31.54.amzn1.x86_64 #1 SMP Tue Oct 18 22:02:09 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-172-20-21-62 ~]$ type -p ec2-metadata
/opt/aws/bin/ec2-metadata
```

## :two: 目的の情報までのパスが長い
例えば、block-device-mappingの例で見ると、

```
[ec2-user@ip-172-20-21-62 ~]$ curl http://169.254.169.254/latest/meta-data/block-device-mapping/ami/
/dev/xvda
```

↑の長いURLが、こうなります。**短いオプションをつけるだけ！簡単！**

```
[ec2-user@ip-172-20-21-62 ~]$ ec2-metadata -b
block-device-mapping:
	 ami: /dev/xvda
	 root: /dev/xvda
```

オプションも**直感的なので使いやすい**です。
どんなオプションが使えるのかは`ec2-metadata --help`で確認できます。

自分の場合、頻度が高いのは、`-t` や `-i` だったりします。

```
[ec2-user@ip-172-20-21-62 ~]$ ec2-metadata -t
instance-type: t2.micro
[ec2-user@ip-172-20-21-62 ~]$ ec2-metadata -i
instance-id: i-1a804e94
```

## :three: 1リクエストで1情報しかとれない

ec2-metadataとタイプすれば、いつも確認するような情報が**まとめて確認**できます。これくらいの情報が**何のオプションも付けずに確認できる**ので、必要十分ですね。

```bash
[ec2-user@ip-172-20-21-62 ~]$ ec2-metadata
ami-id: ami-0c11b26d
ami-launch-index: 0
ami-manifest-path: (unknown)
ancestor-ami-ids: not available
block-device-mapping:
	 ami: /dev/xvda
	 root: /dev/xvda
instance-id: i-1a804e94
instance-type: t2.micro
local-hostname: ip-172-20-21-62.ap-northeast-1.compute.internal
local-ipv4: 172.20.21.62
kernel-id: not available
placement: ap-northeast-1c
product-codes: not available
public-hostname: not available
public-ipv4: not available
public-keys:
keyname:your-keyname
index:0
format:openssh-key
key:(begins from next line)
ssh-rsa AAAA***** your-keyname
ramdisk-id: not available
reservation-id: r-3dee40b2
security-groups: your-security-groups
user-data: not available
```

## :raised_hand:まとめ

`ec2-metadata`を使うと、長いURLをタイプしなくても**効率よく直感的にメタデータを参照する**ことができます:muscle:

AmazonLinuxならデフォルトで使えるので、すぐに使えるのもうれしいです。

こういう地味なことを積み上げて、作業効率を上げていけるといいですね:grinning:

---
### 参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
https://aws.amazon.com/code/1825

### 備考
* ec2-utils-0.5-1.28.amzn1.noarch に含まれています。
AndroidでCleanArchitecture+αを導入して見えてきたことメモ

Android開発でCleanArchitectureやら諸々の技術をひっくるめて使った結果、色々見えてきたのでそのメモ。
ほとんど自分向けなので大雑把な内容しか書いてないです。
清書する日が来るかどうかは未定

# 主に使用した技術の話

- [Swagger](http://swagger.io/)
- [RxJava](https://github.com/ReactiveX/RxJava)
- [Retrofit2](https://square.github.io/retrofit/)
- [ButterKnife](http://jakewharton.github.io/butterknife/)
- [Dagger2](https://google.github.io/dagger/)
- [RxAndroid](https://github.com/ReactiveX/RxAndroid)

使ってみたかったやつ
- [RetroLambda](https://github.com/evant/gradle-retrolambda)

# プロジェクト構成の話
AndroidのCleanArchitectureで検索すると、だいたいは[ここ](https://github.com/android10/Android-CleanArchitecture)に行き着くと思う。
が、この構成はプロダクトが大きければ大きいほど不向きであることが見えてきた。

理由は、**機能(画面)ごとの見通しが悪くなる**から。

アプリとして１、２画面しか持たないのであればさほど問題にならないが、10画面以上も持つアプリで、さらに個々の画面で異なる機能を提供する場合、途端に見通しが悪くなった。これはUseCaseとPresentationの結びつきが強いことに起因している。

なので、方針として、データ層のみは固めて、プレゼンテーション層とドメイン層は機能毎にパッケージを切ることで、比較的すっきりした構成にすることができた。
データ層のみを固めた理由は、画面への依存が薄く、かつ複数のUseCaseから呼び出される可能性が高いから。

```text:構成イメージ
root 
  L data
      L datasource
      L entity
  L funcA
  L funcB
  ・・・
  L funcN
      L usecase
      L presentation
```

# CleanArchitectureの向き不向きの話

まずはCleanArchitectureのメリット・デメリットを簡単に整理。

**メリット**

- 可読性が高くなる
- 拡張性が高くなる

**デメリット**

- ソースコードが多くなる
- クラス分けが細かくなる

上記のメリット・デメリットを踏まえた上で向いている開発、向いていない開発をまとめてみた。

**向いている開発**

- 大規模な開発
- 複数の会社にまたがった開発（受託発注など）
- 長期の運用、メンテナンス、エンハンスが予測される開発
- 既に存在しているプロジェクトを大規模リファクタリング（作り直し）するような開発

**向いていない開発**

- 小規模な開発
- 単独で行うようなの開発
- 長期の運用や、メンテナンス、エンハンスがないような開発

向き不向きの判断は個人的主観によるもので、実際に体験してるものもあれば、想像で書いているものもあるが、おおよそ合ってるのではないかなぁと。
結局はメリットとデメリットに対してどのような開発がメリットを最大化できるか、という話なので、大規模で、いろんな人が関わっていて、今後もメンテナンスが必要な開発、に向いているというだけの話。


# サーバ間のAPIの話

Swagger,Retrofit2,Dagger2,RxJavaを使っているとサーバ間通信の実装が数行で終わる。
※ただしDagger2関連の記載部分は除く（と言ってもDagger2の記載を含めても50行ない)

```java:コア部分のみの抜粋記載
@Singleton
public class SomeRepository implements ServerSomeApi {
    
    private final ServerSomeApi mServerSomeApi;

    @Inject
    public SomeRepository(ServerSomeApi serverSomeApi) { mServerSomeApi = serverSomeApi; }

    @override
    public Observable<SomeEntity> getSomeEntity(String param1) {
        return getSomeEntity(param1);
    }
}
```

これでgetSomeEntityメソッドを叩くと、サーバからSomeEntityを取得できる。もし新たなAPIが追加されてもメソッドを追加して中身を1行実装するだけで終わる。

# UseCaseをどう作るかという話
おおざっぱにはCleanArchitectureの考え方に沿って、**プレゼンテーション層で使うデータを作る**方針で問題なかった。
データ層が木の板だとするなら、UseCase層ではその板をくっつけたりして犬小屋を作ったり、椅子を作ったりするイメージ。
Babelは「ES2015をコンパイルするコンパイラ」なのか、それとも「ES2015をトランスパイルするトランスパイラ」 なのか

# はじめに
「[Babelとは](https://www.google.co.jp/search?q=babel%E3%81%A8%E3%81%AF&oq=babel%E3%81%A8%E3%81%AF&gs_l=serp.3..35i39k1l2.1252.1497.0.1743.4.4.0.0.0.0.131.452.1j3.4.0....0...1c.1j4.64.serp..2.2.250.QP-NgT3T_Ks)」でググってみると

![babel.jpg](https://qiita-image-store.s3.amazonaws.com/0/69667/7fa89112-5bc0-d2e7-e77d-cd59e19ece40.jpeg)

記事によっては**「BabelはES2015をコンパイルするコンパイラ」**と説明されており、
また別の記事によっては**「BabelはES2015をトランスパイルするトランスパイラ」**と説明がされています。[^1]

[^1]: 「トランスパイル」は「トランスコンパイル」と、「トランスパイラ」は「トランスコンパイラ」とも言います。

「本来それぞれの言葉の意味は違うはずでは…?」と混乱したため、
どちらの説明が正しいのか、それともどちらも正しいのかざっくり調べて自己解釈した備忘録です。

# まずはBabelのサイトを見てみる
そもそも本家ではどのような説明をしているのか。
ということで[Babelのサイト](https://babeljs.io/)を見てみると

>Babel is a JavaScript **compiler**.

と記載されており、また[こちらページ](https://babeljs.io/docs/usage/cli/)では

>Babel comes with a built-in CLI which can be used to **compile** files from the command line.

と記載されているため

**「BabelはES2015をコンパイルするコンパイラ」**

という説明が正しいかもしれないが、それぞれの言葉の意味も見ていく。

# それぞれの言葉の意味を見てみる
言葉の意味は以下の通り。

## コンパイラ
>コンパイラ（英:compiler）とは、人間が理解しやすい言語や数式で記述されたプログラムを、機械語に（あるいは、元のプログラムよりも低いレベルのコードに）変換するプログラムのこと。

[コンパイラ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)

## コンパイル
>コンパイラによる変換することを動詞で「compile コンパイル」と呼ぶ。

[コンパイラ](https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)

## トランスパイラ(トランスコンパイラ)
>トランスコンパイラ(英語: transcompiler)またはソース・トゥ・ソースコンパイラ(英語: source-to-source compiler)は、一つのプログラミング言語で書かれたプログラムのソースコードを入力として受け取り、別のプログラミング言語の同等のソースコードを生成するコンパイラである。

[トランスコンパイラ](https://ja.wikipedia.org/wiki/%E3%83%88%E3%83%A9%E3%83%B3%E3%82%B9%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9)

## トランスパイル(トランスコンパイル)
トランスコンパイラによる変換すること。

## それぞれの言葉の意味を見る限りでは
**「BabelはES2015をトランスパイルするトランスパイラ」**

という説明が正しい気がする。
また、「トランスパイル」と「トランスパイラ」の言葉を用いている記事の方が多い印象。

# 結論：どちらの説明も正しい(と思った)
以下の理由でBabelを説明する場合はどちらも正しい(と思った)。

- トランスパイラはコンパイラの一種のため、コンパイラと言い換えても問題ない。
- トランスパイルは「変換する」という動詞の意味自体は同じため、コンパイルと言い換えても伝わる。
- TypeScript等の記事でもコンパイルと記載されていることがあれば、トランスパイルと記載されていることもある。
- 厳密に言えば「トランスパイル」と「トランスパイラ」を用いた説明が正しいと思うが、**どちらの説明でも伝えたいことは大体伝わる。**

# まとめ
というわけで、「どちらの説明でもBabelが何なのかは伝わるため、どちらの説明も正しい。」という結論にいたりました。

![komakai.jpg](https://qiita-image-store.s3.amazonaws.com/0/69667/de928e79-351c-31f9-1638-b724755ce506.jpeg)

しかし、それぞれの言葉の本来の意味は同じではないため、今回の例のように「トランスパイラ」を「コンパイラ」と言い換え、「トランスコンパイル」を「コンパイル」と言い換えることは問題ないですが、本来「コンパイラ」という言葉が正しいものを「トランスパイラ」に、「コンパイル」という言葉が正しいものを「トランスパイル」に言い換えると正しくなくなります。

例えば「C#をコンパイルする。」という言葉を「C#をトランスパイルする。」という言葉に言い換えると正しくなくなるため注意です。

[Compiling Vs Transpiling - Steve Fenton](https://www.stevefenton.co.uk/2012/11/compiling-vs-transpiling/)
SQLServer: 頻繁に更新するテーブルを含んだIndex付Viewの作成

WHERE句で
Replace(TelNumber, '-', '') = '09011112222'
のように、カラムに対して何かしらの演算を行うSQLは遅いクエリになりがちです。
インデックスを張っていても効かないのでIndex Scanになってしまうからですね。

計算列をテーブルに追加し、その列にインデックスを追加すれば解決できますが、その場合は既存のクラスタ化インデックスにカラム追加＋追加で非クラスタ化インデックスを作成する必要があるため、レコード数が多いとディスク容量も結構増えます。
また、実稼動しているテーブルにカラムを追加するのはなかなか心理的なハードルも高いです。他テーブルと「Select * From...」でUnionしてた日にはエラーになっちゃいますし。。

何か良い解決策はないかと調べていたところ、インデックス付Viewが良さそうでした。
https://technet.microsoft.com/ja-jp/library/ms187864(v=sql.105).aspx
テーブルのカラム構成も変わらないし、追加インデックス分しか増加しないので良い感じです。

ただ懸念点として、上記ページに

```インデックス付きビューは、基になるデータを更新する頻度が低い場合に最も効果的です。インデックス付きビューをメンテナンスする方が、テーブル インデックスのメンテナンスよりもコストがかかる場合があります。基になるデータを頻繁に更新する場合、インデックス付きビューの使用によるパフォーマンス向上よりも、インデックス付きビューのデータ メンテナンスにかかるコスト増加の方が大きい場合があります。```

とあります。非クラスタ化インデックス1つ追加したときに比べて、とても更新コストが増えてしまう印象を抱いてしまいました。

心配になったため開発環境で試したところ、速度的に問題はなさそうです。
リファレンスの文章の意味を考えると、count_big(*)やsum(*)などの集計処理を含むインデックス付Viewの場合には更新コストが大きいので、頻繁に基テーブルが更新されるようなケースではインデックス付Viewは不適切な選択だ、という意味かなと解釈しました。

今回のケースのようにReplace演算を行う程度であれば、頻繁に更新するテーブルを含んだIndex付Viewを作成しても問題なさそうです。
Alpine LinuxでGemをインストール再に「C compiler cannot create executables」エラー

Alpine の Docker イメージに `gem install ...` でRuby Gemを入れようとしていると、こんあエラーが出ました：

```
gem install kafkat

... ...

checking for gcc... gcc
checking for C compiler default output file name... configure: error: C compiler cannot create executables
```

何か足りないかんじなので、 `build-base` をインストールすれば問題は解消：

```
apk add build-base
```
Arduino nanoでサーボモータを使ってみる

#サーボモーターとは
>ホビー用途で市販されているラジコン用のサーボモーターと言った場合には電気駆動式で制御基板、モーター、ギヤボックスが一体化され防塵ケースに封入された物であることが多い。 
インドアプレーン用など重量が数グラムしかない超小型製品の場合は基板やギヤが剥き出しの物もある。 
制御信号はPWM信号によって行われることが一般的で、標準規格化はされていないが、事実上は大半のラジコン用サーボモーターで信号が統一されており、メーカーが異なるサーボ同士でも混在使用可能な場合が多い。 
近年ではホビーロボット用のアクチュエーターとして使用されるようになり、専用の製品も多数開発されている。

出展：[wikipedia](https://ja.wikipedia.org/wiki/%E3%82%B5%E3%83%BC%E3%83%9C%E3%83%A2%E3%83%BC%E3%82%BF)

# 使ったもの
[TOWER PRO SG90](http://www.amazon.co.jp/TOWER-PRO-%E3%82%BF%E3%83%AF%E3%83%BC%E3%83%97%E3%83%AD-SG90-%E3%83%87%E3%82%B8%E3%82%BF%E3%83%AB%E3%83%BB%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%82%B5%E3%83%BC%E3%83%9C/dp/B00VUJYNWG)

# サンプルコード
```cpp:sweep_test.ino
/* Sweep
 by BARRAGAN <http://barraganstudio.com> 
 This example code is in the public domain.

 modified 8 Nov 2013
 by Scott Fitzgerald
 http://arduino.cc/en/Tutorial/Sweep
*/ 

#include <Servo.h> 
 
Servo myservo;  // create servo object to control a servo 
                // twelve servo objects can be created on most boards
 
int pos = 0;    // variable to store the servo position 
 
void setup() 
{ 
  myservo.attach(2);  // attaches the servo on pin 9 to the servo object 
} 
 
void loop() 
{ 
  for(pos = 0; pos <= 180; pos += 1) // goes from 0 degrees to 180 degrees 
  {                                  // in steps of 1 degree 
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
  for(pos = 180; pos>=0; pos-=1)     // goes from 180 degrees to 0 degrees 
  {                                
    myservo.write(pos);              // tell servo to go to position in variable 'pos' 
    delay(15);                       // waits 15ms for the servo to reach the position 
  } 
} 
```

参考：http://makers-with-myson.blog.so-net.ne.jp/2014-04-24
参考：[Servo library](http://www.arduino.cc/en/reference/servo)

# Bluetoothとの連携サンプル
以下はただのメモです。

```c:bluetooth_test.ino
#include <SoftwareSerial.h>

SoftwareSerial btport(10, 11);

void setup() {
    Serial.begin(9600);
    btport.begin(38400);
    Serial.println("Enter AT commands:");
}

void loop()

{
    if (btport.available())
        Serial.write(btport.read());
    if (Serial.available()){
       btport.write(Serial.read());
    }
}
```
参考：[Arduinoを簡単にBluetooth無線化するHC-05/HC-06](http://nefastudio.net/2015/02/20/3850.html)
ファイルとディレクトリを分けてchmodし直す

Linux上のディレクトリを移行しようとして、ついうっかりFAT32領域にソースをコピーして移行したら
パーミッションがガバガバになってしまった。
とりあえず一括でファイルは644、ディレクトリは755にしたい。
でも普通にchmodでワイルドカードを使うとファイルもディレクトリも一緒くたで、
しかもドットファイルは無視されちゃったりする。

そんな時は、設定したいディレクトリで、こうする。

```
find . -type f -print | xargs -I{} chmod 644 "{}"
find . -type d -print | xargs -I{} chmod 755 "{}"
```

空白をファイル名に含むファイルやディレクトリが無ければ""で括らなくてもいいけど
せっかくだから括っといたほうが安心。
初めてAWSで環境構築した際に参考にしたページメモ

AWSで環境構築を行った際に参考にしたページをまとめました。
各ページの作者様には圧倒的感謝:pray:
※随時更新予定

# 新しくインスタンスを立ち上げるとき
[0から始めるAWS入門：概要](http://qiita.com/hiroshik1985/items/6433d5de97ac55fedfde)
[0から始めるAWS入門①：VPC編](http://qiita.com/hiroshik1985/items/9de2dd02c9c2f6911f3b)
[0から始めるAWS入門②：EC2編](http://qiita.com/hiroshik1985/items/f078a6a017d092a541cf)
[0から始めるAWS入門③：ELB編](http://qiita.com/hiroshik1985/items/ffda3f2bdb71599783a3)
[0から始めるAWS入門④：RDS編](http://qiita.com/hiroshik1985/items/6643b7323183f82297b2)

# 環境構築のパターン
[AWSクラウドデザインパターン](http://aws.clouddesignpattern.org/index.php/%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%9A%E3%83%BC%E3%82%B8)
鉄板の構成例がデザインパターンとしてまとまっていて、とても参考になります

# VPCについて
[【AWS】VPC環境の作成ノウハウをまとめた社内向け資料を公開してみる](http://dev.classmethod.jp/server-side/network/vpc-knowhow/)
[Amazon VPCを使ったミニマム構成のサーバ環境を構築する](http://dev.classmethod.jp/cloud/aws/minimum-amazon-vpc-server-environment/)

# CDNサービスを作る時
[CloudFront経由でS3からコンテンツ配信をする](http://qiita.com/ishikuro_yuuki/items/33b77510dfab14449a78)
[[CloudFront + S3]特定バケットに特定ディストリビューションのみからアクセスできるよう設定する](http://dev.classmethod.jp/cloud/aws/cloudfront-s3-origin-access-identity/)

# 料金関連
[無駄なコストを省こう！AWSで消し忘れを防止するためにチェックすべき７つのポイント](http://dev.classmethod.jp/cloud/aws/cost-check-point/)

# その他
[為替レート計算](http://info.finance.yahoo.co.jp/fx/convert/?a=1&s=USD&t=JPY)
AWSの料金を日本円で確認するため
# 第六回D実験

## データベース(DB)について

### 作業1

- MySQLの設定
    - MySQLクライアントの起動
    - MySQLはすでにサーバPCで稼働しているため，起こすだけでよい　次のコマンドで起動できる<br>‣mysql -u root
    - rootパスワードの設定
        - 初期状態のMySQLはパスワード設定がされていないため，設定する<br>‣mysql > set password for root@localodt=password('パスワード');<br>‣mysql > set password for root@' localhost.localdomain' =password('パスワード');<br>‣mysql > set password for root@' 127.0.0.1' =password('パスワード');<br><br>
        - 本実験ではパスワードはrootで固定，次からは次のコマンドで起動できる<br>‣mysql -u root -p<br><br>
        - exitと打ち込むとsqlコンソールから，通常コンソールへ戻る

<hr>

- 登録ユーザの確認
    - 登録されているユーザを確認するコマンド<br>・mysql > select host,user,password from mysql.user;<br><br>これで表形式で現在のユーザを表示することができる．



### 課題2
- 作業2(音楽DBの作成)で作成した2つのテーブルをshow fieldsコマンドで表示して　結果を**テキスト**形式でレポートに乗せる<br>・mysql > show fields from テーブル名


## サーブレットからのMySQL操作
DBに格納されたデータは多くのプログラムからSQL文をDBMSへ発行することで読み出しや編集ができる

- 作業3
    - Tomcat/webapp/music1/WEB-INF/classes作成
    - classeseディレクトリ　MusicListServlet.java
    - WEB-INFディレクトリにweb.xml
    - Tomcat再起動　確認

- 課題3
    - MusicListServlet.javaの中身をコメント文を入れて保存
    - 作業3の動作確認をキャプチャ
    - MusicListServlet.javaにnumberフィールドも表示できるように改変，そこをレポートに記述

- 作業4
    - Tomcat/webapp/music2/WEB-INF作成
    - music2以下にMusicAdd.jsp作成
    - music2以下にアルバム名，アーティスト名を入力するmusicadd.html作成
    - トムキャット再起動

- 課題4
    - MusicAdd.jspの中で指定された空欄を埋める　→　レポート
    - 「データベースに登録しました」というテキストの下にデータ一覧が表形式で表示されるようにMusicAdd.jspを変更する，変更箇所をレポートに
# セッション管理

## ショッピングサイト作成
- カートに入れる等の機能を付けたアプリケーションを作成する．
- ファイルが多くなる





### ショッピングサイト
- 作業
    -
    - 作業1
    - （1）ショッピングサイトのデータベース「shop_db」をsqlで作成<br>mysql > create database shop_db;
    - （2）ユーザ情報を格納するテーブル「user_tbl」を作成ユーザの登録番号”id”，ユーザ名，パスワード，認証失敗用のfailの四つのフィールドを持つ．以下のsql文で作る<br>mysql > create table user_tbl(<br>id int auto_increment primary key,<br>username varchar(64),<br>password varchar(64),<br>fail int);

    -作業2
    - （1）商品管理用テーブルの作成
    - shop_dbに商品を管理するテーブル「item_db」を作成，商品の登録番号”id”，商品名”name”価格”price”の三つのフィールドを持つ．以下のsql文で作る．<br>mysql > create table item_tbl(<br>id int not null auto_increment primary key,<br>name varchar(128),<br>price int);

    - （2）item_tblに任意の商品を登録する<br><br>
    - mysql>insert into item_tbl values ('''''''');<br><br><br>

    - 作業3
    - プログラムの作成
        - （1）Tomcat/webapp/shop/WEB-INF/classes/webshopとなるようにディレクトリを作成
        - （2）webshopディレクトリに下記のソースを作成
            - item.java
            - Cart.java
            - DatabaseConnector.java
            - ItemManager.java
            - UserManager.java<br><br>
        - （3）上記の（2）のUserManager.javaについて課題を解く
        - （4）コンパイルする
        - （5）classeseディレクトリ内にShopServlet.javaを作成しコンパイル
        - （6）WEB-INFディレクトリ内に下記のファイルとweb.xmlを作成する
            - Login.jsp
            - ShowItems.jsp
            - ShowCart.jsp
            - web.xml<br><br>
        - （7）http://10.210.21.26:8080/shop/ShopServlet　にアクセスし，動作確認
        - 作業4　省略
- **課題**
    - 課題1
    - （1）作業1（2）で作成したテーブルに対してshow fields コマンドを実行した結果をテキスト形式でレポートに記載
    - （2）作業2(1),(2)で作成したテーブルに対して，下記のselet分を実行した結果をテキスト形式でレポートに記載<br>select * from item_tbl;
    - (3)UserManager.javaに実装されたauthenticateメソッド内の(A),(B)の箇所に適切なSQL文を記述し，レポートに記載　→　ヒント参照<br><br>
    - 課題2　　自由
    - (1)ログアウト処理を実装　ShopServlet.javaに実装されたlogoutメソッド内の(D)と記述された箇所にセッションを無効化するような記述を追加，ログアウト後のキャプチャ画像とソースの変更点をレポートに記載
    - 指定された商品をカートから削除する機能を加え，削除後の**キャプチャ画像**とソースの変更点をレポートに記載
Applying 3rd party CSS in angular-cli

angular-cli を使って作ったプロジェクト(SystemJS は使わない)で 3rd party CSS (`node_modules/*/` 以下)を当てようとしてつまずいたので備忘録。

## サンプルは
angular-cli で作ったプロジェクトで [ag-grid-ng2-example](https://github.com/ceolter/ag-grid-ng2-example) のような Grid を 表示したい。ただ、CSS がうまく当たらないために意図した表示にならない･･･。

### 何が問題だった?
[index.html](https://github.com/ceolter/ag-grid-ng2-example/blob/master/index.html) のコメントにもある通り、CSS をどうロードするか自体は ag-Grid 自体の問題ではない。例では 特に build せず index.html で直接ロードしているが、`ng serve` を実行したときには webpack が build して bundle を作るため、この部分を index.html にコピーしただけでは意図した通りの表示にならない：

```html:index.html
    <!-- ag-grid CSS -->
    <!-- In your build, you will probably want to include the css in your bundle. -->
    <!-- To do this you will use a CSS Loader. How to do this is not an ag-Grid -->
    <!-- problem, so I've not included how to do it here. For simplicity, and -->
    <!-- explicitness, the CSS files are loaded in directly here. -->
    <link href="node_modules/ag-grid/dist/styles/ag-grid.css" rel="stylesheet" />
    <link href="node_modules/ag-grid/dist/styles/theme-fresh.css" rel="stylesheet" />
```

### 解決策

いつもありがとう [stackoverflow](http://stackoverflow.com/questions/39017376/angular-cli-webpack-3rd-part-css-files) 。2つの解決策が提示されていた。

#### Option 1
- `angular-cli.json` 内の `styles` array で直接指定する

```json:angular-cli.json
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      //...(snip)...
      "styles": [
        "styles.css",
    	  "../node_modules/ag-grid/dist/styles/ag-grid.css",
    	  "../node_modules/ag-grid/dist/styles/theme-fresh.css"
      ],
```

#### Option 2
- `src/styles.css` で該当の CSS を import する
 - `angular-cli` で作成した default の `angular-cli.json` を使って、`styles.css` を参照していると仮定する。
 - この方法の場合、 Option 1 で直接指定した `angular-cli.json` 内のエントリーは削除しておく必要がある。

```json:angular-cli.json
  "apps": [
    {
      "root": "src",
      "outDir": "dist",
      //...(snip)...
      "styles": [
        "styles.css"
      ],
```

```css:src/styles.css
/* You can add global styles to this file, and also import other style files */
@import "../node_modules/ag-grid/dist/styles/ag-grid.css";
@import "../node_modules/ag-grid/dist/styles/theme-fresh.css";
```

### まとめ
どちらの方法でも期待通りに Grid が表示できた。「どちらがよい」という記述はないが、「angular-cli で全部やる」という強い意志なら Option 1、直感的なのは Option 2 、なんだろうか。

とはいえ、Option 2 も angular-cli.json の `styles` array で `styles.css` が指定されているから効いているので、まわりくどいが以下のような Option 1 & 2 のハイブリッド版でもよいのかもしれない。

- `angular-cli.json` 内で `styles.css` 以外の CSS ファイル(たとえば`vendor.css`)を指定
- `vendor.css` 内で 3rd party vendor の CSS を import

いずれにせよ `angular-cli.json` を書き換えた場合は `ng serve` の再起動(angular-cli.json の再読み込み)が必要なので忘れないようにしたい。
ShinobiLayer: Endurance Storageの機能拡張（高速化＋暗号化）について

#1. はじめに
Bluemix Infrastructure(旧称:SoftLayer）のEndurance Storageは冗長性のあるマネージド・ストレージサービスであり、Block Storage（iSCSI型）とFile Storage(NFS型）から選択できます。今回、新規に購入したEndurance Storageから新機能が使えることになったので、この記事で紹介します。

#2. 新機能概要

- 従来は20GB～12TBのサイズの中から、0.25 IOPS/GB, 2 IOPS/GB, 4 IOPS/GBの性能を持つストレージを選択できていました。今回から2 IOPS/GB以上のストレージを選択した際には、内部実装的にはAll Flashストレージが利用されます。
- All Flashストレージの恩恵により、新たに**10 IOPS/GBの性能を持つストレージ（サイズは20GB～4TB）**も選択できるようになりました。
- 新Enduranceでは、**どのIOPSモデルであっても暗号化済み**になりました。

詳細は以下をご参照下さい。
https://console.bluemix.net/docs/infrastructure/FileStorage/new-ibm-block-and-file-storage-location-and-features.html
https://console.bluemix.net/docs/infrastructure/FileStorage/block-file-storage-encryption-rest.html

#3. 新Endurance Storageが使えるデータセンターの場所は？
注文方法や利用方法は、通常のEndurance Storageと同じです。以下のDCで購入可能です。

US: SJC03, SJC04, WDC04, WDC06, WDC07, DAL09, DAL10, DAL12, DAL13 
EU: LON02, LON04, LON06, FRA02, AMS03, OSLO1, PAR01, MIL01 
Australia: SYD01, SYD04, MEL01 
Canada: TOR01, MON01
Latin America: MEX01
Asia Pacific: TOK02, HGK02


新モデルのEndurance Storageが使えるデータセンターでは、下図のように該当ロケーションにアスタリスク（*）が付与されています。
![Endurance01.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/7633fd6c-6724-ab39-7dfa-bba1597a6635.jpeg)


#4. 暗号化されていることはどうやって確認できるの？
新Enduranceは暗号化されているので、デバイス一覧にて**LUN名に鍵マーク**が付いています。
![Endurance02.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/4310676f-5735-cadc-9b22-4d429ab03f52.jpeg)

また、詳細画面にて、**Encryption属性が"はい"**になっています。
![Endurance03.jpg](https://qiita-image-store.s3.amazonaws.com/0/62127/9e77d946-bcd0-324d-5982-216868ace344.jpeg)
Compose.io (OSS DBaaSサービス）で、Cassandraの互換性を持つ「ScyllaDB」が使えるようになりました

Scylla（読み方：すぃーら/しーら）というNoSQLのDBで、Cassandra互換性を持つDBがCompose.ioから使えるようになっています。

BluemixのComposeサービスではまだ利用不可のようですが、compose.ioのweb UIからは確認可能です。

・Cassandraとの互換性もあるのでアプリmodify不要
・Cassandraから移行するときも単純に接続先を変えるだけで良い

らしいです。（試してないので机上情報ということで）

一応、composeで環境デプロイして接続できるところまでは確認してみました。
MacのPCにクライアントをbrew経由で入れて試しましたが、いたって普通に使えます。
cassandraに今まで興味あった方など、やってみると良いかもしれません。

![スクリーンショット 2016-11-18 16.50.39.png](https://qiita-image-store.s3.amazonaws.com/0/119378/f5602bcf-022f-2d0a-a03a-d75520903e6e.png)



## 接続準備

```console:
$ brew install cassandra
Warning: You are using OS X 10.12.
We do not provide support for this pre-release version.
You may encounter build failures or other breakages.
Please create pull-requests instead of filing issues.
==> Downloading https://www.apache.org/dyn/closer.lua/cassandra/3.5/apache-cassandra-3.5-bin.tar.gz
Trying a mirror...
==> Downloading https://archive.apache.org/dist/cassandra/3.5/apache-cassandra-3.5-bin.tar.gz
########################################
```
https://help.compose.com/docs/connecting-to-scylladb
インターフェースがOracleのSQLPlusっぽい・・

```console:
$ cqlsh sl-xx-xxx-x-portal.x.dblayer.com 16696 -u scylla -p xxxxxx --cqlversion=3.2.1
Connected to Jin-scylladb-xx at v:16696.
[cqlsh 5.0.1 | Cassandra 2.1.8 | CQL spec 3.2.1 | Native protocol v3]
Use HELP for help.
scylla@cqlsh>

```
Xamarin.FormsのUWPアプリでNavigationBarに出てくる...ボタンを消す方法

NavigationBarにToolBarItemを追加すると一緒に右上の...ボタン（その他ボタン？）が出て来ます。

![EllButton.png](https://qiita-image-store.s3.amazonaws.com/0/132355/c60732ca-0f0d-2ebe-360c-a1ee827ea4eb.png)

消し方に詰まったのでググって見つけた解決法を書いておきます。
このボタンは、UWPプロジェクト内のApp.xamlを編集し、\<Applicaton>と\</Application>の間に以下のコードを書くと消えます。

```xml:App.xaml
    <Application.Resources>
        <Style x:Key="EllipsisButton" TargetType="Button">
            <Setter Property="MaxWidth" Value="0"/>
        </Style>
    </Application.Resources> 
```

なぜか効かないVisibilityではなくMaxWidthを0にするという荒業ですが消えてくれます。

というのが[この記事](https://forums.xamarin.com/discussion/70814/how-to-remove-ellipsis-button-in-navigation-bar-for-uwp)に書いてありました。
もっと良い方法がありましたらぜひ教えて頂けると助かります。

Xamarinはいいぞ。
最適化数学 行列の微分

#はじめに
最適化問題でコスト関数を設計してみるけど、行列を含んだ微分がよくわからず
調べるためにさまようことがあったので途中式と一緒にまとめます。
ノートとして、気づいたら追記していこうと思います。

#２乗誤差


$e=(y-Ax)$とし、$|e|^2$について考えます。
$A$は行列、$x=(x_1,x_2\cdots x_n)^T$$y=(y_1,y_2\cdots y_n)^T$の縦ベクトルとします。

```math
\begin{matrix}
|e|^2&=&e^Te&\\
&=&(y-Ax)^T(y-Ax)&\\
&=&(y^T-x^TA^T)(y-Ax)&\\
&=&y^Ty-y^TAx-x^TA^Ty+x^TA^TAx&\\
&=&y^Ty-y^TAx-y^TAx+x^TA^TAx &^{(*1)}\\
&=&y^Ty-2y^TAx+x^TA^TAx&\\
\end{matrix}
```



勾配の計算は、微分演算子$\frac{\partial}{\partial x}=(\frac{\partial}{\partial x_1},\frac{\partial}{\partial x_2},\cdots \frac{\partial}{\partial x_n})$の横ベクトルを作用させます。

```math
\begin{matrix}
\frac{\partial}{\partial x}|e|^2&=&\frac{\partial}{\partial x} (y^Ty-2y^TAx+x^TA^TAx)&\\
&=&-\frac{\partial}{\partial x}(2y^TAx)+\frac{\partial}{\partial x}(x^TA^TAx)&\\
&=&-2y^TA+2A^TAx&^{(*2)(*3)}\\

\end{matrix}
```

Hesse行列（2次微分）も同様です

```math
\begin{matrix}
\frac{\partial^2}{\partial x^2}|e|^2&=&\frac{\partial}{\partial x} (-2y^TA+2A^TAx)&\\
&=&2A^TA

\end{matrix}
```


#*変形
`(*1)`$x^TA^Ty=(Ax)^Ty=(y^TAx)^T=y^TAx$
`(*2)`$\frac{\partial}{\partial x}(x)=(\frac{\partial}{\partial x_1},\frac{\partial}{\partial x_2},\cdots \frac{\partial}{\partial x_n})(x_1,x_2\cdots x_n)^T=(1,1,\cdots 1)=1$
`(*3)`$\frac{\partial}{\partial x}(x^TAx)=2Ax$ (２次形式の微分）
エックスサーバーにて、iterm2で画像を表示させる

http://qiita.com/noraworld/items/ea59c37e48ac0977cc72

と同じ。

ただし、全てにおいて
１．suduは使わない（使えない）
２．/usr/local/bin/　=>　~/bin/
に置き換える。

以上

![1__potsd_sv1506___hanmotopkg_com_public_html_tdupress_wp_wp-content_plugins_category-archives__ssh__と_エックスサーバーにて、iterm2で画像を表示させる.png](https://qiita-image-store.s3.amazonaws.com/0/51918/a8021b8f-fc8c-9388-a50e-2fceabf441fb.png "1__potsd_sv1506___hanmotopkg_com_public_html_tdupress_wp_wp-content_plugins_category-archives__ssh__と_エックスサーバーにて、iterm2で画像を表示させる.png")
Unity でスクリプトから Renderer の Material を操作するとリークする件について

## 前提環境

- Unity 5.4.2f2

- コード(と、これのために作ったプロジェクト)
- https://github.com/furukazu/CheckUnityMaterialProperties/blob/master/Assets/Editor/EditorCheck.cs
    - https://github.com/furukazu/CheckUnityMaterialProperties.git

## TL;DR
Renderer.material は良い感じに内容を複製するので、本当にマテリアルに触りたければ sharedMaterial を使う。

## 概要

```csharp:EditorCheck.cs

	[MenuItem("Editor Check/Material/Get Material")]
	public static void ManipulateMaterial(){
		var r = GameObject.Find ("Sphere").GetComponent<Renderer> ();

		// ここでマテリアルが複製され、複製されたものが自動的にRendererにも設定されてしまう
		var mat = r.material;

		// 内部でこんなイメージの処理が走る
		// public Material material get{
		//     var newMaterial = new Material(this_material); // 複製する
		//     this_material = newMaterial; // 複製したもので自分も書き換えることで元々設定されてたものが影響を受けないように待避している
		//     return new Material;
		// }

		// なのでここで書き換えても、その情報は元のマテリアルには影響がない
		mat.SetTextureOffset ("_MainTex",new Vector2(0.25f,0.25f));

		// 実行時ではなくエディタ中でこのコードを走らせてしまうと、Rendererの持ってるマテリアルも変わってしまうので注意
		// また、実行時に走らせた場合は，明示的にDestroyしないと残り続ける
	}

	[MenuItem("Editor Check/Material/Get *Shared* Material")]
	public static void ManipulateSharedMaterial(){
		var r = GameObject.Find ("Sphere").GetComponent<Renderer> ();

		// ここでマテリアルが複製されないので、これで得た物を操作すると元々設定されていたファイルの内容が書き換わってしまう
		var mat = r.sharedMaterial;

		// ここを書き換えると元のマテリアル(アセットファイル)のプロパティを書き換えちゃう！
		mat.SetTextureOffset ("_MainTex",new Vector2(0.25f,-0.25f));
	}
```