OmniAICreator/Qiita-1.07M huggingface dataset:
ジェネリクスで Optional にキャストする

表題通りですが、一筋縄ではいかなかったので備忘録として残します。

ジェネリクスを使わない場合、下記は正しくキャストできます。

```swift
let hoge: Any? = nil
hoge as! String?  // nil
```

しかし、ジェネリクス関数で同様のことを行う場合、 force unwrap によるエラーが発生してしまいます。

```swift
func convert<T>(_ value: Any?) -> T {
    return value as! T
}

convert(nil) as String?  // fatal error: unexpectedly found nil while unwrapping an Optional value
```

これは、もう一つジェネリクス関数を経由することで回避することができます。

```swift
func convert<T>(_ value: Any?) -> T {
    func cast<U, V>(_ value: U, to type: V.Type) -> V {
        return value as! V
    }
    return cast(value, to: T.self)
}

convert(nil) as String?  // nil
```

:thinking: 


----


※ 達成したかったことは Optional、非 Optional どちらも許容できるキャストの定義です。

```swift
struct Hoge {
    let val1: String
    let val2: String?
}

Hoge(val1: convert(dict["val1"]),
     val2: convert(dict["val2"]))


// 逐一 `as` を書きたくない
Hoge(val1: dict["val1"] as! String,
     val2: dict["val2"] as? String)
```
[Pythonによる科学・技術計算] 極座標グラフ，可視化，matplotlib

matplotlib.pyplotの**polar**メソッドを指定して極座標グラフを描く。
例として**r = 0.5 θ**([アルキメデスの渦巻線](https://ja.wikipedia.org/wiki/%E4%BB%A3%E6%95%B0%E8%9E%BA%E6%97%8B))を考える。


```py3
import numpy as np
import matplotlib.pyplot as plt
"""
極方程式
例:アルキメデスの渦巻線
"""

theta = np.arange(0.0, 4*2*np.pi, 0.01) #θの範囲を 0-8π ラジアン(4周分)とする
r = 0.5*theta   ## 極方程式を指定する。
plt.polar(theta,r) # 極座標グラフのプロット

plt.show()
```
###結果

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/4f59f5b4-a903-cafa-a665-0433b827d483.png)
Aurora小ネタ／テストDBを削除するときに…

AuroraでテストDBの復元→削除を繰り返すときに、うっかり既存のスナップショットと同じ名前**（○○-final-snapshot）**を付けて最終スナップショットを取得すると…？

# 0. 初期状態

以下のテストDBを削除し、最終スナップショットを取得しているとします。

 * DBインスタンス識別子 : **db1-test**
 * 同・クラスター識別子 : **db1-test-cluster**
 * 最終スナップショット名 : **db1-test-final-snapshot**

![01_rds_snap.png](https://qiita-image-store.s3.amazonaws.com/0/123899/ef38c78d-4b60-807b-08fe-b1325ba8e7cf.png)
こんな感じになります。この時点では、クラスター**「db1-test-cluster」**はきれいに削除されています。

# 1. スナップショットからテストDBを復元

↑のスナップショットからDBインスタンス**「db1-test」**を復元します。

![02_aurora_connect.png](https://qiita-image-store.s3.amazonaws.com/0/123899/a4b07b57-546c-652b-8f59-c65786d55329.png)
クラスター識別子は元のままで、クラスターエンドポイントのIPアドレスもDNSで引くことができており（PINGで確認）、MySQLクライアントからの接続もちゃんとできています。

# 2. テストDBを削除

このテストDBを削除します。

![04_aurora_delete2.png](https://qiita-image-store.s3.amazonaws.com/0/123899/f11d1d19-8b8c-141e-3f42-153997783853.png)
ここで、うっかり、**最終スナップショット名を（元のスナップショットを消さないまま）同じもの**にすると、画面上には**何のメッセージも出ません**が…

![05_aurora_cluster.png](https://qiita-image-store.s3.amazonaws.com/0/123899/7a988200-e7de-6e32-6176-169d853b2386.png)
インスタンスは削除されますが、クラスターが残っています（インスタンス数は**0**です）。
クラスターエンドポイントのIPアドレスは、DNSで引けなくなりました。

# 3. 再度、スナップショットからテストDBを復元

最初と同じ画面で、同じスナップショットから再びテストDBを復元します。

![06_aurora_restore.png](https://qiita-image-store.s3.amazonaws.com/0/123899/68ebf137-e766-2c73-7791-faaf9c6f08bd.png)
何の指定もしていませんが、クラスター識別子の末尾に**「-1」**が付きます。
つまり、先ほどまでとは**別のクラスターでインスタンスが復元**されます。

![07_aurora_new_cluster.png](https://qiita-image-store.s3.amazonaws.com/0/123899/55df35fc-6e9e-c464-11b1-d6e9314defe8.png)
クラスターが変わっていることに気づかないまま、前回のクラスターエンドポイントにPINGを打ってみると…なんと、新しいインスタンスのIPアドレスが引けてしまいます！（第4オクテットが**152**から**154**に変わっていますね。）
当然、MySQLクライアントから接続もできてしまいます。

# 4. レプリカを作成し、フェイルオーバーを試す

フェイルオーバーのテストをするために、別AZにレプリカを作成します。

![08_aurora_replica.png](https://qiita-image-store.s3.amazonaws.com/0/123899/545f2fb5-2c67-8a4d-8ee0-63b59ff59c35.png)

作成後、フェイルオーバーしてみると…？

![09_aurora_failover.png](https://qiita-image-store.s3.amazonaws.com/0/123899/62199639-178b-9546-7941-1ac4f1bbece9.png)
前回のクラスターエンドポイントにPINGを打ってみても、IPアドレスは変わりません。DNSエンドポイントがレプリカにフェイルオーバーしない…!?

当然ですが、このときのクラスターエンドポイントは**「db1-test-cluster-1」**用のものが正解です。
こちらのエンドポイントを使うと、ちゃんと**「db1-replica」**インスタンスのIPアドレスを指しているのですが…そもそも、この時点では別クラスターにインスタンスが復元されていることに気づいていないので、ちょっとしたパニックに…。

私の場合、しばらく悩み、AWSのパートナーさんのサポート窓口とやり取りしている途中にようやく気づきました（スクリーンショットと画面ログを添付していたのですが、私自身が気付くまで、サポート窓口の方も気づきませんでした）。

その後、同僚が別のテストでDBの復元→削除を繰り返しているときに全く気づかずに同じことをしていて、**「○○-cluster-2」**まで出来上がり（末尾の番号はインクリメントされていきます）、さらに**「○○-cluster-3」**までも（意図せず）作ろうとしていたので、慌てて止めました。

なお、クラスターを削除し損ねた場合、指定のバックアップウィンドウの中で自動スナップショットの取得が行われるので、そちらを見て「おや？なんか変だぞ？」と気づくかもしれません。

![10_aurora_snap.png](https://qiita-image-store.s3.amazonaws.com/0/123899/1a46ca60-3c58-09ef-ccad-cd1c98f4a4e7.png)

皆さんも、騙されないよう、気を付けましょう。

---

**【おまけ】**
Amazon Aurora関連投稿記事へのリンクを集めました。

 * **[Qiitaに投稿したAmazon Aurora関連記事](http://hmatsu47.hatenablog.com/aurora)**
GLO(Optimizing the Latent Space of Generative Networks)の解説

**Discriminatorが不要なGAN**と聞いて、早速まとめてみました。
しかし、Discriminatorが無い時点でAdversarialな要素が皆無なので、厳密にはGANの一種では無いですね。

元論文
https://arxiv.org/abs/1707.05776

## 概要
GANはAdversarialな学習をGeneratorとDiscriminatorが行う。
双方のモデルはミニマックスゲームの最適化式で表現されるが、学習が不安定であるという問題点がある。
そこで学習にDiscriminatorを用いずに、シンプルな更新式を用いることで学習を安定化させることに成功した。

GLOの最大の特色として、学習対象がパラメータθだけでなく入力ノイズZにも及ぶということがある。
著者は「Discriminatorの無いGAN」「encoderの無いオートエンコーダー」とも言えるよねと言っている。

## 目的関数

学習データセット（画像）：{$x_{1}, ... ,x_{N}$} $x_{i} \in X$ 　$dim=[3,w,h]$
ノイズ：{$z_{1}, ... ,z_{N}$} $z_{i} \in Z$ 　$dim=[d]$

この二つをペアにして、以下の形式のデータセットを得る。
{$(z_{1}, x_{1}), ... ,(z_N, x_{N})$}

ノイズ空間Zから画像空間Xへの射影を$g_{\theta}$（パラメータ$\theta$を持つGenerator）とする。
以下の式を$z_i, \theta$について最小化するように、学習を行う。

$$
\min_{\theta\in\Theta} \frac{1}{N} \sum_{i=1}^{N}\min_{z_i\in Z} l(g_\theta(z_i), x_i)
$$

注目すべきなのが、$z_i, \theta$　の両者ともに目的関数の最小化を目指しているということである。これにより、従来のGANの問題点であった、「学習がどの程度進んでいるのかがlossを見ても分からない」ということが無く、lossの値が減少しているかどうかで学習の進み具合をある程度知ることが出来る。
ここでl()はloss functionのことである。

## Zについて
latent spaceのZを考える際に、Generatorによる写像がリプシッツ写像になるよう以下の処理を行う。

* Zの事前分布は正規分布を用いる。
* Zの空間を半径1の閉単位超球に収まるように正規化する。
* zは学習の度にノルムが変わるので、単位球に収まるように正規化する必要がある。（Zの次元がdのときは$\sqrt d$ で割れば良い。論文では「余程のことが無い限りzが半径$\sqrt d$の球の外側に出てしまうことは無いよね」と述べられている。）

## 損失関数
θとzは、それぞれ別の損失関数を用いて、back propagationによって最適化がされる。
### θの損失関数
損失関数については色々考えられるが、最小二乗誤差を用いた場合は、ぼやけた画像が生成されるようになってしまうらしい。
GANではDiscriminatorの真偽判定の確率でlossが評価されるが、本モデルではそれが出来ないので、式からも分かるように生成画像と本物の画像をペア同士で直接評価している。
ピクセルごとに最小二乗誤差を取って評価する手法は、位置ズレにはとても過敏であるのに対し、微小なガウシアンノイズに対しては寛容であるため、生成画像がぼやけてしまったと考えられる。
（ガウシアンノイズはホワイトノイズとも呼ばれ、画像をぼやけさす元凶となる。）
余談として損失関数に最小二乗誤差を用いたLSGANが上手くいく理由は、GANはDiscriminatorを介して誤差を評価しているからである。

GLOの論文内では損失関数として、位置の微小なシフトに寛容なLaplacian Pyramid Lap1 lossを用いている。

$$
\begin{equation}
Lap_1(x, x') = \sum_{j} 2^{-2j}||L^j(x) - L^j(x')||_1
\end{equation}
$$

Lの肩に乗っているjは「j番目のLaplacian Pyramid representation of x」を表している。
因みにLap1は、小規模のDiscriminatorでのEarth mover's distance（EMD）と一致するらしい。（WGANでは生成分布と元のデータ分布のEMDを最小化しようとしている）

### zの損失関数

ノイズ復元などで用いられる再構築誤差を使用する。再構築誤差は具体的には以下の式で表される。

$$
\begin{equation}
||AG(z) - x||_2 + L(z)
\end{equation}
$$

A : measurement matrix, L : 正規化項

## その他
最適化手法として、論文ではSGDを用いて学習させたと言っている。SGDの学習係数は$\theta$が1で$z$が10となっている。それ以外のネットワークの構造だったり、ハイパーパラメーターだったりは、DCGANの論文で用いられているものが使われているらしい。

生成画像はこんな感じになるそうです。上から元の画像、生成画像（zの次元：100）、生成画像（zの次元:512）になっています。

![Screen Shot 2017-07-20 at 22.45.04.png](https://qiita-image-store.s3.amazonaws.com/0/178922/332d63b1-e98c-767c-7736-a177bec020e7.png)


GANでおなじみの画像同士の演算も、z同士のベクトルの引き算や足し算で実現できるみたいです。interpolation(画像のモーフィング)や、conditional generationも可能らしい。
ruremai gem で irb or pry からRubyのリファレンス（るりま）を確認する

## 「るりま」とは？
Rubyの公式日本語リファレンスマニュアルです。

* [プログラミング言語 Ruby リファレンスマニュアル](https://docs.ruby-lang.org/ja/)

## ruremai とは？
ruremai は「るりま」のリファレンスを REPL 上で利用するツールです。

## インストール
* インストール

```sh
$ gem install ruremai
```

* 設定

常に ruremai を有効にしたい場合は `.pryrc` や `.irbrc` に以下を追記します。

```
require 'ruremai'
```

## 試行
```sh
$ pry
[1] pry(main)> require "ruremai"
=> true
[2] pry(main)> "test".method(:upcase)
=> #<Method: String#upcase>
[3] pry(main)> "test".method(:upcase).rurema!
=> #<Process::Waiter:0x007fb90a9ea8e8 sleep>
```

上記を実行すると以下のページが開きます。

* [instance method String#upcase (Ruby 2.4.0)](https://docs.ruby-lang.org/ja/2.4.0/method/String/i/upcase.html)

## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [hibariya/ruremai](https://github.com/hibariya/ruremai)
さくらVPS(Cent OS6)にGitlabをインストールする②

postfixの起動につまづきましたが、何とかなったので、
ようやくGitlabのインストールへ。

その前に、postfixの設定変更（自動起動するように）

`chkconfig postfix on`

と、iptablesに記述を追加

`lokkit -s http -s ssh`


上記が完了したら、Gitlabのパッケージを取得して
`curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash`

インストール
`yum -y install gitlab-ce`

その後に、起動
`gitlab-ctl reconfigure`

ダウンロードもインストールも時間がちょっとかかったけど、エラー出ることなく起動もできてよかった。

途中でこんなのが表示してちょっと楽しい気分になった。

![スクリーンショット 2017-07-20 22.48.25.png](https://qiita-image-store.s3.amazonaws.com/0/191168/89c0f6cc-798f-2407-3474-bf3ea07e15f8.png)

CUIの世界に不慣れなので、こういうグラフィック的なものが表示されてほっこりした。。。
AWS VPCの勉強メモ

試しに下記の環境をCloudFormationを使って構築してみる。

![Picture1.png](https://qiita-image-store.s3.amazonaws.com/0/45959/a627bd2a-e99b-17a0-33d4-e4b2465d80db.png)

下記、作成したCloudFormationのテンプレート。
https://github.com/khiraiwa/cloud-certifications/blob/1ab33227b014a4dc0679291729b1a117420a5cde/vpc/template.yml

YAML形式でやってみた。これだとコメントが書ける。

```yaml
################################
#### VPC
################################
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock:
        Ref: VpcCidrBlock
      EnableDnsSupport: 'true'
      EnableDnsHostnames: 'true'
      Tags:
      - Key: Name
        Value:
          Ref: VpcName
```

また、最近だと短縮記法も使えるようになっている。

```yaml
  SubnetPublic1a:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId:
        Ref: VPC
      AvailabilityZone: !Sub
      - "${AWS::Region}${AZ}"
      - AZ: !Select [0, !Ref VpcAzs]
      CidrBlock:
        Ref: VpcSubnetCidrBlockPublic1a
      MapPublicIpOnLaunch: true
      Tags:
      - Key: Name
        Value:
          Ref: VpcSubnetNamePublic1a
```

SubnetにセットするNetwork ACLにはデフォルトで\*のルールが有る。
追加したルールに一致するものがなければ*のルールが使われる。
(つまり、拒否される)

<img width="823" alt="VPC_Management_Console 2.png" src="https://qiita-image-store.s3.amazonaws.com/0/45959/7e797006-e4e2-11bb-42be-b5961e5afa34.png">

参照: http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_ACLs.html#ACLRules

また、Network Aclはステートレス。例えばインバウンドでtcp/22を許可していいてもアウトバウンドは通さない。戻りのローカルポート(1024-65535とか)をアウトバウンドで開ける必要がある。
(逆にSecurityGroupはステートフル)

また、下記の図のように、あるサブネットからは特定のサブネットにしか通信できないようにするにはNetwork ACLで制御する（しかないのかな？）

![Picture2.png](https://qiita-image-store.s3.amazonaws.com/0/45959/545bd0eb-d4c0-12be-2b2b-6aa1e3edbda1.png)

VPCペアリングはペアリングしたVPCにしか通信できない。例えば下記の場合、AからCには行けない。

![Picture4.png](https://qiita-image-store.s3.amazonaws.com/0/45959/18e75a49-c23e-fa88-8c0d-e3b345e7a874.png)
『初心者向けのPHPセミナー』に参加してみた

## 1. 概要

先日、ONLINE-TUTOR主催の初心者向けPHPセミナーに参加しました。
[① みるみる上達！初心者向けWEBプログラミング(PHP)](https://online-tutor.connpass.com/event/59557/)

前半の時間は授業形式でPHPの基本を学び、後半の時間はハンズオン（実際に手を動かす）で課題をこなしていきます。短い時間ではありましたが、充実した時間を過ごすことができました。そのセミナー内容を振り返り、PHPの基本を紹介したいと思います。


## 2. 内容

この講座は、PHPの初心者向けです。
まずはプログラミングを体験してみたい人が受講されているそうです。

**＜基本文法、文字列の出力方法＞**
phpは、<?phpで始まります。

```PHP
<?php
echo ‘こんにちは’;
?>
```

**＜変数の書き方＞**
変数には、文字列や数値を入れておくことができます。変数名の前に、'$' を必ず書きます。
echoで、変数の中身を参照して、そのデータを出力することができます。

```PHP
<?php
$var = ‘Hello, World!’;
echo $var;
?>
```

**＜フォームからデータを受け渡す＞**
ここでは、データの送信/受信用（form1_send.php、form1_receive.php）の2つのページを作成します。
まずは、form1_send,phpを下記のように記述します。

```PHP
<body>
<h1>氏名を入力してください</h1>
<form action=“./form1_receive.php” method=“POST”>
<label>氏名</label>
<p><input type="text" name=“myname"></p>
<input type=“submit”>
</body>
```
- actionに、受け渡し先のファイル名を記述する。
- name=“name”は、送信データを取得する時、必要である。

次に、form1_receive.phpを下記のように記述します。

```PHP
<?php
//送信したデータを取得する
$var = $_POST[‘myname’];
?>

<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>受信ページ</h1>
<p>取得したデータをデータを表示する</p>
<p>あなたのお名前は<?php echo $myname; ?>です。</p>
</body>
</html>
```
- $_POST[‘myname’]に送信データが格納されています。
- $_POSTはグローバル変数と呼ばれ、自動的に生成されている。

**＜データの型＞**
PHPは他のプログラミング言語と同様に、データの型があります。
また、変数の中身を確認する時、var_dump()を利用します。
var_dump()は、変数の型や値を画面上に出力することができる組み込み関数です。

```PHP
<?php
//文字列
$str = ‘こんにちは’;
//整数
$int = 8;
//論理型
$bool = TRUE;
//小数
$float = 3.2;
?>
```
- string（文字列）：日本語やアルファベットを扱うことができます。
- int（整数）：半角の数字を扱うことができるが、全角の数字は使うことができない。また、シングルクォート(‘)で括る必要はありません。
- boolean（論理型）：TRUEとFALSEの2種類のみ扱うことができます。
- float（小数）：整数と小数を分けて考えます。

**＜変数/文字列の連結＞**
ドット(.)で文字列を連結することができます。ドットはつなげて書くことも可能です。
ダブルクウォーテーションの中に変数を入れる方法はドットで連結するよりもややサーバに負担がかかるそうです。

```PHP
<?php
$first_name = ‘太郎’;
$family_name = ‘鈴木’;
echo $family_name.$first_name.'さん';
?>
```

**＜演算子＞**
整数の四則演算(+,-,×,÷)の結果を出力します。
余りを取得する剰余演算(%)のようなプログラミング特有の計算方法もあります。

```PHP
<?php
$a = 21;
$b = 3;
$c = 8;
//数値の和
echo $a + $b.’<br>’; //21 + 3 = 24
//数値の差
echo $a - $b.’<br>’; //21 - 3 = 18
//数値の積
echo $a * $b.’<br>’; //21 * 3 = 63
//数値の商
echo $a / $b.’<br>’; //21 / 3 = 7
//数値の剰余
echo $a % $c.’<br>’; //21 % 8 = 5
?>
```
NginxでPHPの開発環境構築

最近行く先々の現場で耳にする**Nginx**。
Webサーバらしいですが、Apatchとの違いもいまいち分からず、なんとなくで作業しちゃっています。
特徴やApatchとの違いも勉強しつつ、とりあえず自分のPCに環境構築や！
ということで、その際の手順をメモしようと思いました。

実施OS：**Windows10 Pro**

###**Nginxのインストール**
まずはNginxのインストールです。
[nginx: download](http://nginx.org/en/download.html)から、zipファイルをダウンロードします。
バージョンが3つほどあると思いますが、
Mainline version ⇒ メインのバージョン
Stable version ⇒ 安定版
Legacy versions ⇒ 古いバージョン
的な意味なので、自分は安定板の**nginx/Windows-1.12.1**をダウンロードしました。
ダウンロードしたzipファイルはC直下に展開します。
私はフォルダ名を**nginx-1.12.1**にしました。

###**PHPのインストール**
次はPHPをインストールします。
PHPを選択した理由としては、なんか簡単そうだったからです。
[PHP: Downloads](http://www.php.net/downloads.php)から、またまたzipファイルをダウンロードします。
とりあえず最新版でいいかという感じで、
**Current Stable PHP 7.1.7**の欄にある、**Windows downloads**をクリックします。
遷移先で、自分のPCにあった**Zip**をクリックして、ダウンロードします。
ちなみに私のPCは64ビットなので、**VC14 x64 Thread Safe**のzipファイルをダウンロードしました。

**Non Thread**と**Thread**とは？
と気になる方もいるかもしれませんが、
>スレッドセーフである、というのは、Windows 上の Apache 2 のような,
マルチスレッドのウェブサーバーでも動作するバイナリだという意味です。 
スレッドごとにローカルストレージのコピーを作成し、
別のスレッドとデータの衝突を起こさないようにしています。

よく分からなかったので、私はとりあえず**Thread**の方を選択しました。
ダウンロードしたものを解体したのち、
私はフォルダ名を**php-7.1.7**にして**C:nginx-1.12.1**直下に置きます。

###**nginx.confの編集**
**C:\nginx-1.12.1\conf\nginx.conf**の65~71行目からコメントアウトを外して、
**fastcgi_param**の部分を以下のように変更します。

```nginx.conf
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  c:/nginx-1.12.1/html$fastcgi_script_name;
    include        fastcgi_params;
}
```

###**start＆stopファイルの作成**
**C:nginx-1.12.1**直下に、以下2つのファイルを作成します。

```start-nginx.bat
@ECHO OFF
cd c:\nginx-1.12.1
start c:\nginx-1.12.1\nginx.exe
start /b c:\nginx-1.12.1\php-7.1.7\php-cgi.exe -b 127.0.0.1:9000 -c c:\nginx-1.12.1\php-7.1.7\php.ini
ping 127.0.0.1 -n 1>NUL
echo Starting nginx
echo .
echo .
echo .
ping 127.0.0.1 >NUL
EXIT
```

```stop-nginx.bat
@ECHO OFF
cd c:\php-7.1.7
c:\php-7.1.7\nginx.exe -s stop
taskkill /f /IM php-cgi.exe
EXIT
```
作成後、**start-nginx.bat**でnginxの起動、**stop-nginx.bat**で終了ができます。
起動している間はコマンドプロンプトもずっと起動しています。
![](https://qiita-image-store.s3.amazonaws.com/0/192989/8b38dd49-8c7b-a8af-0992-39cd20b58294.jpeg)

###**起動時しない場合**
私は初回起動時、以下メッセージが出て起動できませんでした。

**コンピューターにVCRUNTIME140.dll がないため、プログラムを開始できません。
この問題を解決するには、プログラムを再インストールしてみてください。**

なんだこりゃと思ったら**Visual Studio 2015 の Visual C++ 再頒布可能パッケージ**
というのがないのが原因らしいので、
以下からダウンロードしたのちインストールしたら起動できました。
https://www.microsoft.com/ja-jp/download/details.aspx?id=48145

###**PHPコードの実行**
phpファイルは、**C:\nginx-1.12.1\html**に作成します。
とりあえず以下を作成しました。

```index_p.php
<?php
  echo "Hello PHO for NGINX!!";
?>
```
そして http://localhost/index_p.php を開くと、
![](https://qiita-image-store.s3.amazonaws.com/0/192989/8575e197-d3d3-ef23-4aad-1308dd835980.jpeg)
出ました！

とりあえずここまでは割とスムーズに行きました。
分からないことだらけの**nginx**ですが、これからどんどん学んでいこうと思います。
boto3でリトライの設定を変更する

python 3.7
boto3 1.4.4

[AWS でのエラーの再試行とエクスポネンシャルバックオフ](https://docs.aws.amazon.com/ja_jp/general/latest/gr/api-retries.html)
>各 AWS SDK は、自動再試行ロジックを実装しています


設定ファイルで変更するか、コードで変更するかのどちらか
設定ファイルの場合、AWS CLIでも有効になる

##設定ファイル
~/.aws/models/_retry.jsonを用意する。書き方はbotocoreパッケージの_retry.jsonと同じ。
http://botocore.readthedocs.io/en/latest/reference/loaders.html

##clientのリトライハンドラーの持つ値を直接変更する
[boto2.num_retries equivalent in retryhandler.py or _retry.json #882](https://github.com/boto/botocore/issues/882)

```pyt3
import boto3

client = boto3.client('stepfunctions')
client.meta.events._unique_id_handlers['retry-config-states']['handler']._checker.__dict__['_max_attempts'] = 1
```
`retry-config-states`の`states`部分はサービスごとの値。上の例だと、stepfunctionsでの再試行回数を1に設定している。

---
現在、セッションごとに設定値を指定できるようなPRがマージを待ってる
[Add possibility of modifying retry_config #891](https://github.com/boto/botocore/pull/891)
参照型のプロパティを持つstructについて考える

# はじめに
新たに型を設計する場合、classにするべきか、structにするべきか迷うことがあるかと思います。
この記事では、**参照型のプロパティを持つ型を設計する場合、型はstructでなくclassを利用することを検討したほうが良い**という設計指針をたまに見かけるので、その理由を考えてみます。

# structかclassか
Swift標準のライブラリではstructで宣言されている型が多く、**structで実現できない場合にclassを採用することが推奨される**ように思われます。

## こんなときはclass？
 - インスタンスの参照を共有したい
 - デイニシャライザを利用し、インスタンスの破棄タイミングに合わせて何か処理を行いたい
 - protocolでなく、継承で実装したい

## 参照型のプロパティを持つstructを実装した場合どうなるのか
参照型のプロパティを持つ、以下のようなstructを考えてみます。
structの` SomeStruct`は参照型のプロパティである、`numberClass`を持ちます。

```swift
// 参照型プロパティに持つ構造体
struct SomeStruct {
    var numberStruct = NumberStruct() // 値型プロパティ
    var numberClass = NumberClass()   // 参照型プロパティ
}

// 構造体
struct NumberStruct {
    var number: Int = 0
}

// クラス
class NumberClass {
    var number: Int = 0
}
```

以下のように、`SomeStruct`型の変数をコピーした場合、

```swift
// 構造体を初期化して、別の変数に代入する
let someStruct1 = SomeStruct()
var someStruct2 = someStruct1

// コピー先の値を変更する
someStruct2.numberStruct.number = 1
someStruct2.numberClass.number = 1

// コピー元の値を確認する
print(someStruct1.numberStruct.number) // 0（値のコピーのみ）
print(someStruct1.numberClass.number)  // 1（参照が共有されている）
```
コピー先でプロパティを変更しても、値型のプロパティ`numberStruct`は値が変化しませんが、
参照型の`numberClass`は値が0から1に変化してしまっています。
（参照型の特性として、参照を共有する形で代入が行われたため、当然といえば当然）

**値型として定義した型でも、プロパティが参照型の場合、その特性は保たれる**ということになります。

今回のケースではシンプルな設計でしたが、型が多重のネストされた構造になっている場合は、プログラマーがどのプロパティがコピーされて、どのプロパティが参照共有になるかは判断がつきづらくなります。

そのため、値型で定義する型は、すべてのプロパティを値型にするというシンプルな設計の方が**分かりやすく、予期せぬ参照共有によるバグも生まれにくい**ということかと思われます。

## 補足

Swiftの公式ドキュメントにも以下の記載がありました。
[The Swift Programming Language (Swift 4) - Classes and Structures](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html)
> Any properties stored by the structure are themselves value types, which would also be expected to be copied rather than referenced.

構造体は値型なので、そのプロパティも値型としてコピーされることが期待されます。（意訳）

# 参考
 - [The Swift Programming Language (Swift 4) - Classes and Structures](https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html)
 - [recruit-lifestyle/swift-style-guide](https://github.com/recruit-lifestyle/swift-style-guide)
 - [Swiftにおけるclassとstructの使い分け](http://cockscomb.hatenablog.com/entry/choosing-between-classes-and-structures)
さくらVPS(Cent OS6)にGitlabをインストールする①

会社でGitlabを使っているので、自宅でも同じ環境にしたいなーと。

以下の記事を参考に。
http://j-levia.hatenablog.jp/entry/2016/01/24/GitLab%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%28CentOS%29

※以下、rootかsuで実行する

①まずは、SSHのクライアント、サーバとメール送信用のpostfix、cronをインストールする

`yum -y install curl openssh-server openssh-clients postfix cronie`

②postfixのサービスを起動させる

`service postfix start`

・・・と、ここでエラーでた！

`Starting postfix: [FAILED]`

って返答が；

`postfix check`
でpostfixをチェックしたところ
`postfix: fatal: parameter inet_interfaces: no local interface found for ::1`
との返答

/var/log/maillogをチェックしたところ、同様のエラーが５件ほど。。。おお。。。

きっと、インストールしたけど、起動できないということは、
postfixの初期設定の問題だろうということで
/etc/postfix/main.cf（main.cfにpostfixの設定に関する記述がまとまっている）をチェック。

以下の記事を参考にpostfixの初期設定を変更した。
▼Postfix のインストールと設定 〜 CentOS6
http://easyramble.com/install-setting-postfix.html

しかし、やはりpostfix起動せず。

結局、色々ためしてmain.cfの外部からのメール受信設定を[all]にしたら、
起動しました！

`inet_interfaces = all　←　変更(外部からのメール受信を許可)`

今のところ、ホスト名とかcentOSの初期設定のままやっているのと、
ホスト名の設定やドメインの設定などをいきあたりバッタリでやってるので、
どこかでエラーが起きそうでこわい；
というか、configファイルの設定項目の意味をちゃんと理解できていなかったりするので、いきあたりバッタリ感がすごい
継承先ModelでEbean.update()が実行されない。

環境：
playframework 2.5 ebean 7.6.1
事象：
継承しているモデルに対してupdate()が実行されない。

理由としては、setterが継承元の値にセットしていたため。
super.~ではなくthis.~にすると実行される。
仕様上、親クラスにフィールドを持たせて継承先でセットしていた。
実際にsetterが呼ばれて値がセットされる先は同じだと思うんだけどなぜ？

```java:Member.java
@Entity
@Table(name = "member")
public class MemberDatas extends AbstractMemberDatas {
  public void setId(Long Id) {
    super.Id = Id;
  }
  
  public void setMemberId(Long memberId) {
    super.memberId = memberId;
  }

  public Long getId() {
    return Id;
  }

  public Long getMemberId() {
    return memberId;
  }
}
```

```java:AbstractMember.java
@MappedSuperclass
public abstract class AbstractSentenceDictDatas extends Model {

  @Column(name = "id")
  protected Long Id;

  @Column(name = "memberId")
  protected Long memberId;
}

```

```java:MemberService.java
~
Member member = new Member();
member.setId(1);
member.setMemberId(1);
member.update();
~
```
WordPressでトップページに固定ページを埋め込む

##自己紹介
只今、WordPress絶賛お勉強中の30代半ばのおじさんです。
今お勉強中のWordPressで最近流行りのシングルページのサイトを作ってみようかと計画中です。

もちろんトップページとなる部分に全てを記述していけば事足りる話ですが、それではWordPressの利点を全く活かしていないのでトップページにいくつもの固定ページを埋め込めればいいのでは⁉ということでやってみました。

##どのようなレイアウトを目指すのか
![レイアウト.png](https://qiita-image-store.s3.amazonaws.com/0/155272/ab5d922d-abc3-682e-7165-694f9f7ab308.png)
こんな感じのレイアウトのページを目指してやってみます。
僕はいつもindex.phpをトップページにするのでindex.phpに複数の固定ページを埋め込み汎用性が高くシングルページを作れないかという事ですね。

##記述するPHP
```index.php
$page_id = 49;
$page = get_post( $page_id );

echo $page->post_content;
```
この様に固定ページを作った時に表示されるページのidを取得してechoで結果を返す事で固定ページを埋め込む事が出来ました。

固定ページのidの確認方法は↓
![SnapCrab_NoName_2017-7-20_22-8-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/155272/be65ced0-6204-dda6-40b6-26e7adf2f6e1.png)

必要なpage_idをArrayに入れてループ処理で一気に吐き出すことも出来そう（まだやっていない）なので今後お世話になろうかという所で備忘録的な感じの投稿でした。
HRESULT型を返されたら例外を投げたいけど短く書きたい。


# 初期状態


```cpp:c++
HRESULT hr;
hr=Hoge(略);
if ( FAILED( hr ) ){
  throw some_exception(hr);
}
hr=Fuga(略);
if ( FAILED( hr ) ){
  throw some_exception(hr);
}

```

変数が使いまわされている。大変気分が悪い。

# 第一段階 - 変数の使い回しをやめる。

```cpp:c++
{
  HRESULT hr=Hoge(略);
  if ( FAILED( hr ) ){
    throw some_exception(hr);
  }
}
{
  HRESULT hr=Fuga(略);
  if ( FAILED( hr ) ){
    throw some_exception(hr);
  }
}
```

長くなった。残念すぎる。

# 第二段階 - 条件節で変数が定義できることを利用する
```cpp:c++
// CFailed 型を頑張って定義する
if ( CFailed hr = Hoge( 略 ) ){
  throw some_exception(hr.get());
}
if ( CFailed hr = Fuga( 略 ) ){
  throw some_exception(hr.get());
}

```

`CFailed`型は、

* HRESULT を引数とした 非explicit なコンストラクタがある。
* bool への変換演算子がある

という辺り。
短くなったけど、繰り返しパターンだよねこれ。

# 第三段階 - 演算子のオーバーロードで一行にまとめる

```cpp:c++
// throwIfFailed というオブジェクトと、operator|を頑張って定義する
Hoge(略) | throwIfFailed
Fuga(略) | throwIfFailed
```

* `throwIfFailed` は、`throwIfFailedClass` 型のオブジェクト。ヘッダでスタティックに定義してしまえば良い。
* `throwIfFailedClass` は、空っぽのクラス。
* あとは `HRESULT operator|(HRESULT, throwIfFailedClass);` があればよい。

なかなかうまく行った。
例外の話が関数よりも後になったので、ソースコードも追いやすい。
すべて `inline` にしてしまえば実行時のオーバーヘッドもほぼないだろう。
しかし、`operator|(略)` の左辺が `BOOL` や `bool` なんかでもコンパイルが通るのが気分悪い。

# 第四段階 - template を利用して HRESULT 以外をエラーにする

ユーザーコードは第三段階と同じ。

で。
`operator|(略)` を template にする。
`template<typename t> t operator|(t, throwIfFailedClass);`
という具合。
で、`t` が HRESULT 以外の場合にエラーになるように中を書けば良い。

というわけで、第四段階が今のところ最終段階。
HRESULT の正体が long なのでまだ気分悪いんだけど、HRESULT を変えるわけにもいかないので仕方ない。
docker-composeのログを雑にCloudWatchに投げつける


docker-composeでオーケストレーションしているコンテナたちのログを、CloudWatch Logsに集約したいので、
loggingのawslogs　driverを使ってみました。

![Compose.png](https://qiita-image-store.s3.amazonaws.com/0/62822/349292cd-76e0-a9bb-6394-293d290d3de1.png)

## 経緯
- docker-composeでオーケストレーションしているコンテナたちのログを集約したい
- cloudwatch logsに投げつけたい　おりゃ！(イラスト作りたかった)

## 環境
- amazon linux: cloudwatch logsのroleをつける
- docker: 17.03
- docker-compose: 1.9.0

## docker-compose.yml
- driverに awslogsを指定する
- optionsにregion,group名,stream名を指定する

```
logging:
  driver: "awslogs"
  options:
    awslogs-region: "ap-northeast-1"
    awslogs-group: "${RAILS_ENV}"
    awslogs-stream: "nginx"
```

## Dockerfile
- 必要ならばログを出したいファイルにリンクを貼るとログが出力される

```
RUN ln -sf  /dev/stdout /var/log/HOGOHOGE/app-access.log
RUN ln -sf  /dev/stderr /var/log/HOGEHOGE/app-error.log
```

## cloud watch
- 空のgreoupを作成しておかないと、以下のエラーが出てしまいます

```
ERROR: for redis  Cannot start service redis: Failed to initialize logging driver: ResourceNotFoundException: The specified log group does not exist.
	status code: 400, request id: xxxxxx-xxxxxxxxx-xxxxxxxx-xxxxx

ERROR: for db  Cannot start service db: Failed to initialize logging driver: ResourceNotFoundException: The specified log group does not exist.
	status code: 400, request id: xxxxxx-xxxxxxxxx-xxxxxxxx-xxxxx
```


<img width="1025" alt="スクリーンショット 2017-07-20 16.47.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/94bc1a9f-945d-22a9-1802-9bda6f9441dd.png">

## 動かしてみる
```
$ docker-compose up
```


## ログ集約できた
- いちいちdocker execしなくてもよくなった



<img width="969" alt="スクリーンショット 2017-07-20 16.48.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/65ca6664-fec8-bc84-9908-892fe96a882a.png">



<img width="1130" alt="スクリーンショット 2017-07-20 16.47.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/62822/7c8c7896-a5c3-daec-5694-aaa4efe0b34a.png">



## docker-compose.yml全体(dbとredisに意味はない)

```docker-compose.yml
version: '2'
services:
  web:
    image: nginx
    depends_on:
      - db
      - redis
    ports:
      - "80:80"
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "ap-northeast-1"
        awslogs-group: "develop"
        awslogs-stream: "nginx"
  redis:
    image: redis
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "ap-northeast-1"
        awslogs-group: "develop"
        awslogs-stream: "redis"
  db:
    image: postgres
    logging:
      driver: "awslogs"
      options:
        awslogs-region: "ap-northeast-1"
        awslogs-group: "develop"
        awslogs-stream: "posgre"
```

## まとめ
- とてもかんたんですね！！
- これでログとしては十分かと！
あとの解析はまた、cloudwatchから何かに投げつければいいかなーと！！
teratermからRaspberry Piを操作するときのおかしな挙動

#操作がうまく効かない...
RaspberryPiをSSHでWindowsPCより操作する際に便利なのがteraterm

環境によってはSSH接続後にキーボードの挙動がおかしくなる例があるようです。
例：カーソルキーが使えない、vimの挙動がvi互換モードではないのにおかしい
(自分の場合はRaspberryPiをUSキーボードで初期設定、その後日本語キーボードより操作を試みたのが原因でした)

##teraterm側の設定
1. [設定]⇒[キーボード]より、すべての項目のチェックを外します。
2. メタキー設定を[Off]にします。

これだけでも、カーソルキーが使用可能になります。

vimの挙動がまだおかしい人は、
teratermのインストールフォルダ(Cドライブ\Program Files(x86)階下がデフォルト)内の、
TERATERM.INIファイル(320行付近)
`TermType=xterm`であることを確認してください。

また、`~/.vimrc`ファイル内に`set nocompatible`(vi互換モード無効)の記述があるかも確認してみてください。
[Pythonによる科学・技術計算] 2次元データをエラーバー付きでプロット, 可視化, matplotlib

matplotlib.pyplotの**errorbar**メソッドを用いて2次元XYデータをエラーバー(誤差棒)を付けて描画する。
例として，x値に5%, y値に20%のエラーバーを付けた。

```py3

import numpy as np
import matplotlib.pyplot as plt 


x_list=[] # x_listを定義 (空のリストを作成)
y_list=[] # y_listを定義 

f=open('tst_XY.dat','rt') # tst_XY.datという名のファイルをr(読み込み) t(テキスト)モードで読み込む

## 以下, データを読み込み，x_listとy_listに値を格納していく
for line in f:
    data = line[:-1].split(' ')
    x_list.append(float(data[0]))
    y_list.append(float(data[1]))
##


plt.plot(x_list, y_list,'o',color='red') # 生データのプロット
 
plt.xlabel('X-axis',fontsize=18) # ｘ軸のラベル
plt.ylabel('Y-axis',fontsize=18) # y軸のラベル


# その他，描画用オプション

plt.xticks(np.arange(0,901,300),fontsize=18)

plt.yticks(np.arange(40,180,30),fontsize=18)
plt.grid(True)

# エラーバーをつける
yerr_list=[]
error_y=20   # error (%): y値に20%のエラーをつける
error_x=5   # error (%): x値に5%のエラーをつける
for i in range(len(x_list)):
    yerr_list=(error_y/100.0)*y_list[i]  # y値に20% errorをつけたものをyerr_listに格納
    xerr_list=(error_x/100.0)*x_list[i]  # x値に5% errorをつけるxerr_listに格納

plt.errorbar(x_list,y_list,xerr=xerr_list, yerr=yerr_list,fmt='ro',ecolor='blue',capsize=4.0) #エラーバーを図示

plt.show()   

```
### 結果

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/2696e4ec-f096-db0d-f19d-72b0f00f1646.png)





###例題で使用した"tst_XY.dat"ファイルの中身
```py3
0.0 164.26
54.2 137.98
106.2 124.84
142.3 118.27
187.5 111.70
317.1 98.56
530.4 85.42
688.8 78.84
900.7 72.27
```
GAEで"TypeError: must be _socket.socket, not socket"が出た時の対応

# 概要
Google App Engine(GAE)でtwitter OAuthの機能を使いたくて、requests_oauthlibをいれて動かそうとしたが、うまくいかなかったのでそのメモ


# 状況・対策
### ssl
以下のようなエラーが出る

``` error.log
Can't connect to HTTPS URL because the SSL module is not available
```

以下のようにsslモジュールを取り込む

```yaml:app.yaml
libraries:
- name: ssl
  version: latest
```


### socket
sslモジュールを取り込むと次は以下のようなエラーが出る。実際に試してはないが、これは本番環境では起こらないらしい。

```error.log
must be _socket.socket, not socket
```

以下のようにsandbox.pyの_WHITE_LIST_C_MODULESに_ssl&_socketを追加

```sandbox.py.diff
$ diff /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/tools/devappserver2/python/sandbox.py_orig
912,913d911
<     '_ssl',
<     '_socket',
```


python標準のsocket.pyをGAEのsocket.pyに上書きする

```
$ cp /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/socket.py /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/socket.py_orig

$ cp /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py /Applications/GoogleAppEngineLauncher.app/Contents/Resources/GoogleAppEngine-default.bundle/Contents/Resources/google_appengine/google/appengine/dist27/socket.py
```

requestsモジュールを入れ直す

```
$ pip uninstall requests
$ pip install requests==2.3
```

これでうごくようになった。


# 参考
http://tsuboi-sj.hatenablog.com/entry/2015/05/29/164743
https://stackoverflow.com/questions/16192916/importerror-no-module-named-ssl-with-dev-appserver-py-from-google-app-engine/16937668#16937668
DiffUtilを使ってRecyclerView.Adapterをいい感じにする

とある勉強会でコードがほしいと言われたので書いてみます。

# DiffUtil

24.2.0で追加された、2つのリストの差分計算を行うユーティリティーです。
計算量が`O(N)`、移動検知ありだと`O(N^2)`です。

`calculateDiff`の結果を`dispatchUpdatesTo(adapter)`とすることで、`RecyclerView.Adapter`の各種notify系が呼ばれ、いい感じにアニメーションなどをやってくれます。

使用方法は[ドキュメント](https://developer.android.com/reference/android/support/v7/util/DiffUtil.html)を参照してください。

## Diffable

`DiffUtil.calculateDiff`には`DiffUtil.Callback`が必要です。
これをAdapterごとに実装するのは面倒なので、比較可能なアイテムを表すインターフェースとCallbackの実装クラスを定義します。
好みは別れると思いますが、ついでにグローバルスコープ関数も作ります。

```kotlin:Diff.kt
interface Diffable {
    // otherと同じIDを持つかどうか
    fun isTheSame(other: Diffable): Boolean = equals(other)
    // otherと完全一致するかどうか
    fun isContentsTheSame(other: Diffable): Boolean = equals(other)
}

private class Callback(
        val old: List<Diffable>,
        val new: List<Diffable>
) : DiffUtil.Callback() {

    override fun getOldListSize() = old.size
    override fun getNewListSize() = new.size

    override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return old[oldItemPosition].isTheSame(new[newItemPosition])
    }

    override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean {
        return old[oldItemPosition].isContentsTheSame(new[newItemPosition])
    }
}

fun calculateDiff(
        old: List<Diffable>,
        new: List<Diffable>,
        detectMoves: Boolean = false
): DiffUtil.DiffResult {
    return DiffUtil.calculateDiff(Callback(old, new), detectMoves)
}
```

## Delegates.observableと組み合わせる

差分計算するには、新旧の`List`が必要になりますが、Kotlinには`Delegates.observable`があるので、これを使います。

```kotlin
class MyAdapter : RecyclerView.Adapter<AbstractViewHolder>() {
    var items: List<Item> by Delegates.observable(emptyList()) { _, old, new ->
        calculateDiff(old, new).dispatchUpdatesTo(this)
    }
}
```

上記のように`Adapter`に`var items: List<Item>`プロパティを作ります。
`MyAdapter.items`に値をセットすると、自動でDiffの反映までやってくれます。
ViewHolder周りは省略します。

## 実装例

`Item`には`Diffable`を実装します。
デフォルト実装があるので、`isTheSame`のみオーバーライドします。

```kotlin:Item.kt
data class Item(val id: Long, val fullName: String) : Diffable {
    override fun isTheSame(other: Diffable) = id == (other as? Item)?.id
}
```

続いてActivityなどの実装例です。
細かいのは省略してます。

```kotlin
val adapter = MyAdapter()
recyclerView.adapter = adapter
adapter.items = listOf(Item(0, "Item: 0"))

recyclerView.postDelayed({ adapter.items += Item(1, "Item: 1") }, 1000)
```

上記コードだと、最初は`Item: 0`のみ表示されているが、1秒後に`Item: 1`がアニメーションとともに表示されます。

# もう少し実用的なサンプル

[こちら](https://github.com/kubode/diff-util-kotlin)です。
ReduxでGitHubのリポジトリを表示するだけのものです。
Railsのlayout中の要素をページ毎に変更したい場合のプラクティス

Rails で開発をしている際、 layout ファイル中の要素を特定のページでのみ変更したくなることがしばしばある。

例えば、次のような `app/views/layouts/application.html.haml` があり、ページによってサイドメニューの内容を変えたいというユースケースを考える。

```haml
%html
  %head
    -# ...
  %body
    .side-menu
      -# この部分をページによって変更したい
      = render 'side_menu'
    %main
      = yields
```

## ダサい例: pathによる分岐

次のようにページの URL によって分離する方法をよく見かける。

```haml
- if request.path == '/'
  = render 'root_side_menu'
- else
  = render 'side_menu'
```

このようなやり方でしか解決できない場合もあることは認めるが、しかしクソダサい方法だと思う。

共通部分であるレイアウト側が特定部分である URL や View のことを気にしなければならない感じが嫌だし、対応しなければならない URL が増えるたびに条件式を変更しなければならないのも嫌だ。View の Template ファイル中ではこの分岐に全く触れることが出来ないのも、ロジックが分散している感じがして嫌だ。

## 格好いい例: content_for を使う

もっと宣言的に書こう。 `yield` と `content_for` を使うほうがずっといい。

まず、 layout ファイルを次のように変更しよう。

```haml
%html
  %head
    -# ...
  %body
    .side-menu
      = yield :side_menu
    %main
      = yield
```

次に、View の Template に `content_for` で表示したい内容を渡す。

```haml
-# root の view の Template
= content_for :side_menu do
  = render 'root_side_menu'
```

```haml
-# 他の部分の Template
= content_for :side_menu do
  = render 'side_menu'
```

Rails の View の `yield` に Symbol を渡すと、その Symbol 名を引数に持つ `content_for` を探して、`content_for` のブロックを `yield` の部分に差し込む。
`content_for` の宣言がViewファイル間で重複するのが気になる場合はHelper メソッドに逃がすなどすればいい。
macのanaconda環境にPolyglotをインストールするのに半日かかったからメモを残しとく



[英文の自然言語処理におススメ！お手軽なPolyglotを使ってみた。](http://...)という記事を見て面白そうだからひとまず`Polyglot`なるものをinstallしようとしたら、プログラミング初心者には茨の道だった。
今後のためにメモを残しておこうと思う。
失敗事例も末尾に残しておこうと思う。

### はじめに
上記ブログに書いてある、関連モジュールをインポート。

### 次に
[こちら](http://polyglot.readthedocs.io/en/latest/Installation.html)の中程にある「From Source」セクションの、tarballをダウンロード

### そして
ダウンロードしたtarballを解凍し、フォルダごとanacondaの site-package に投入する。

### 最後に
解凍したファイルの`setup.py`を実行する。実行するときは、
`$ python setup.py install` と、「install」をつけるのを忘れないこと！


無事にミッション完了したと思ったけど、実はスタートラインに立っただけだった。
早速Polyglotで遊ぼうと思います。

# 陥りがちな罠
- 安易に`pip`でinstallしたのは良いが、anaconda環境で使えない（import errorとなる）。
- Googleに導かれて[Anaconda Cloud](https://anaconda.org/derickl/polyglot)のページにたどり着いたことに安心したのも束の間。`conda install -c derickl polyglot` を実行したら以下のようなErrorとなり、なぜかGoogleに怒りを覚える。

 ``` :error

Fetching package metadata ...............
Solving package specifications: .

UnsatisfiableError: The following specifications were found to be in conflict:
  - polyglot -> futures >=2.1.6 -> python 2.6*
  - python 3.6*
Use "conda info <package>" to see the dependencies for each package.

```
Node-RED で、node を作成する

サンプルのページでは、アルファベットを総て小文字に変換する例が載せられています。
[Creating your first node](https://nodered.org/docs/creating-nodes/first-node)

このサンプルを、総て大文字に変換する例に書き換えてみました。

事前に準備するのは、
.node-red/nodes/package.json
.node-red/nodes/upper-case.js
.node-red/nodes/upper-case.html
です。

```json:packeage.json
{
  "name": "node-red-contrib-example-upper-case",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "node-red" : {
        "nodes": {
            "upper-case": "upper-case.js"
        }
    }
}
```

```js:upper-case.js
module.exports = function(RED) {
    function UpperCaseNode(config) {
        RED.nodes.createNode(this,config);
        var node = this;
        node.on('input', function(msg) {
            msg.payload = msg.payload.toUpperCase();
            node.send(msg);
        });
    }
    RED.nodes.registerType("upper-case",UpperCaseNode);
}
```

```html:upper-case.html
<script type="text/javascript">
    RED.nodes.registerType('upper-case',{
        category: 'function',
        color: '#a6bbcf',
        defaults: {
            name: {value:""}
        },
        inputs:1,
        outputs:1,
        icon: "file.png",
        label: function() {
            return this.name||"upper-case";
        }
    });
</script>

<script type="text/x-red" data-template-name="upper-case">
    <div class="form-row">
        <label for="node-input-name"><i class="icon-tag"></i> Name</label>
        <input type="text" id="node-input-name" placeholder="Name">
    </div>
</script>

<script type="text/x-red" data-help-name="upper-case">
    <p>A simple node that converts the message payloads into all upper-case characters</p>
</script>
```




準備が出来たら、エディター　でフローを作成します。

まず、inject, upper-flow, debug を配置します。

![node-red_jul2003.png](https://qiita-image-store.s3.amazonaws.com/0/179446/f4e58f44-5675-1b76-c75b-f0d8ccb8d92f.png)

inject をダブルクリックして、
ペイロードを文字列にし、入力データ　（例えば、Good Evening と入れます。

![node-red_jul2002.png](https://qiita-image-store.s3.amazonaws.com/0/179446/187bf1eb-1952-20fe-f64a-d91208b33b3e.png)

そして、ノードを結びます。

![node-red_jul2004.png](https://qiita-image-store.s3.amazonaws.com/0/179446/cfd4a1e8-a807-cc22-73a1-4c84056b0afb.png)

デブロイして、inject の　左のボタンをクリックします。
実行結果です。

![node-red_jul2001.png](https://qiita-image-store.s3.amazonaws.com/0/179446/34b2dbc7-6b7f-0c6c-2b9e-dc4e9fd47b40.png)
Maven を動かすDocker コンテナを作ってみた


Docker Store で公開している Oracle Java を使用して、Apache Maven を実行することが可能な Docker Image を作成

## 説明

Java プロジェクトのプロジェクト管理ツール（ビルドや構成管理）として有名なツールに [Apache Maven](https://maven.apache.org/) が有名です。この Maven を利用するためには通常は Java をインストールして、Maven をインストールして、パスを通し、JAVA_HOME や MAVEN_HOME の設定などを行う必要があります。
そのような一連の環境を予め Docker イメージとして用意しました。これを利用する事で Maven が導入されていなくとても Maven プロジェクトのビルドをする事ができるようになります。

ここで用意した Maven 環境は、Java のランタイムとしては、Docker Store で公開している [Oracle 提供の Java 8](https://store.docker.com/images/oracle-serverjre-8) を利用します。

以下が、Java と Maven のバージョン情報です。

- Java: Oracle JDK 8 (1.8.0_131 : 2017年7月時点での latest イメージのバージョンです)
- Mavan: Maven 3.5.0

## 動作イメージ

Maven が導入されていない環境で Docker コンテナ内の Maven によるプロジェクトビルドを行う動作イメージです:

![Demo](https://raw.githubusercontent.com/shinyay/docker-mvn-jdk8/v1.0.0/docs/images/docker-mvn01.gif)

## 前提
- Docker Store のアカウントを持っていること
- Oracle Java 8 の Docker イメージを Docker Store でチェックアウトしていること
  - [Oracle Java 8 SE (Server JRE)](https://store.docker.com/images/oracle-serverjre-8)

![Oracle JDK 8](https://raw.githubusercontent.com/shinyay/docker-mvn-jdk8/v1.0.0/docs/images/docker-mvn02.png)

![](https://raw.githubusercontent.com/shinyay/docker-mvn-jdk8/v1.0.0/docs/images/docker-mvn03.png)

## 導入

Docker Hub に公開しているイメージを取得します

`docker pull shinyay/docker-mvn-jdk8:3.5.0`

## 使用方法

ホスト環境にある Maven プロジェクトを Docker コンテナにマウントし、ワークディレクトリを マウントポイントに移動して Maven コマンドを実行します。

`docker run -it --rm -v [ホスト環境の Mavenプロジェクトパス]:[コンテナ環境内のマウントポイント] -w [コンテナ環境内のマウントポイント] shinyay/docker-mvn-jdk8:3.5.0 mvn [MAVEN GOAL]`

## Docker オプション
- **-it** : 標準入力/tty端末デバイスの確保
- **--rm** : コンテナ終了時にコンテナを破棄
- **-v** : ボリュームマウント
- **-w** : 作業用ディレクトリの指定(デフォルトはルートディレクトリ )

### 例1: mvn clean
`docker run -it --rm -v /home/shinyay/works/mvn-projects/mvn-webapp/mytest-app:/usr/src/mvnproject -w /usr/src/mvnproject shinya/mvn:3.5.0 mvn clean`

### 例2: mvn package
`docker run -it --rm -v /home/shinyay/works/mvn-projects/mvn-webapp/mytest-app:/usr/src/mvnproject -w /usr/src/mvnproject shinya/mvn:3.5.0 mvn package`

## まとめ
Maven が入っていない仮想イメージを使用する時などに便利に使えます。

今後の改善点は、Maven実行後のリポジトリをキャッシュしていないので、再度実行しようとしたときに依存ライブラリの再取得が発生してしまうことです。ただ、ホスト環境の Mavenリポジトリと共有するとよさそうですね。
[Pythonによる科学・技術計算] 3次元曲面の描画，サーフェス，ワイヤーフレーム，可視化，matplotlib

#はじめに

matplotlibを用いて3次元曲面で表現できる関数 $z = e^{-(x^2+y^2)}$をプロットする。
plot_surfaceやplot_wireframeを使う。


#コード
##(1) surface plot
```py3
"""
3次元曲面のプロット例
z=exp(-(x^2+y^2))
"""
from mpl_toolkits.mplot3d import Axes3D   
import matplotlib.pyplot as plt 
import numpy as np

fig = plt.figure() #プロット領域の作成
ax = fig.gca(projection='3d') #プロット中の軸の取得。gca は"Get Current Axes" の略。

x = np.arange(-2, 2, 0.05) # x点として[-2, 2]まで0.05刻みでサンプル
y = np.arange(-2, 2, 0.05)  # y点として[-2, 2]まで0.05刻みでサンプル
x, y = np.meshgrid(x, y)  # 上述のサンプリング点(x,y)を使ったメッシュ生成

z = np.exp(-(x**2 + y**2))  #exp(-(x^2+y^2))  を計算してzz座標へ格納する。

ax.plot_surface(x, y, z, rstride=1, cstride=1, cmap='hsv', linewidth=0.3) # 曲面のプロット。rstrideとcstrideはステップサイズ，cmapは彩色，linewidthは曲面のメッシュの線の太さ，をそれぞれ表す。

plt.show() # 絵の出力。
```

#結果(1)

![t.png](https://qiita-image-store.s3.amazonaws.com/0/192457/353c2051-3164-ee0a-484a-1cecccda6db0.png)
***

##(2) ワイヤーフレーム表示
```py3

from mpl_toolkits.mplot3d import Axes3D   
import matplotlib.pyplot as plt 
import numpy as np

fig = plt.figure() #プロット領域の作成
ax = fig.gca(projection='3d') #プロット中の軸の取得。gca は"Get Current Axes" の略。

x = np.arange(-2, 2, 0.05) # x点として[-2, 2]まで0.05刻みでサンプル
y = np.arange(-2, 2, 0.05)  # y点として[-2, 2]まで0.05刻みでサンプル
x, y = np.meshgrid(x, y)  # 上述のサンプリング点(x,y)を使ったメッシュ生成

z = np.exp(-(x**2 + y**2))  #exp(-(x^2+y^2))  を計算してzz座標へ格納する。
ax.set_zlim(0.0,1.0)
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
    
ax.plot_wireframe(x, y, z, color='blue',linewidth=0.3) # ワイヤーフレームのプロット。linewidthは曲面のメッシュの線の太さ，をそれぞれ表す。

plt.show() # 絵の出力。
```
#結果(2)
![tt.png](https://qiita-image-store.s3.amazonaws.com/0/192457/c0ab40ef-a2b1-d9de-86b4-48da4617d2f1.png)
***
Rails 多言語化対応 View編

# はじめに
このグローバル社会！
開発するサービスによっては多言語化対応が必要になりますよね？
今回自社の開発で多言語化対応をしたので簡単ではありますが導入を紹介します。

Model編はこちら↓
[Rails 多言語化対応 Model編](http://qiita.com/ss_watanabe/items/9fa9fa6e4653ba404f3f)

# 参考サイト
以下のサイトを参考にしました。
記事を読む前に一読お願いします。

## before_action以外
[i18nについて](http://morizyun.github.io/ruby/rails-function-i18n-internationalization.html)
特にこの2つ
[i18nのベーシックな使い方](http://morizyun.github.io/ruby/rails-function-i18n-internationalization.html#i18nのベーシックな使い方)
[辞書ファイルを分割して管理をしやすくする](http://morizyun.github.io/ruby/rails-function-i18n-internationalization.html#辞書ファイルを分割して管理をしやすくする)

## before_action
[Ruby on Railsで言語切り替え機能を作る](http://qiita.com/lhside/items/52623ca8d09858fc7d6e)

# 実装
## config

config/application.rbにデフォルトの言語と複数のロケールファイルを読み込む設定を記述します。

```rb:config/application.rb
module TestProject
  class Application < Rails::Application
    # Settings in config/environments/* take precedence over those specified here.
    # Application configuration should go into files in config/initializers
    # -- all .rb files in that directory are automatically loaded.
    config.i18n.default_locale = :ja
    config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}').to_s]
  end
end
```

## before_action
controller/application_controller.rbにbefore_actionとして、localeの指定があった場合変更する処理を書きます。
ログイン情報と一緒にlocale情報を持っておいてページを読み込むたびにチェックするイメージです。

```rb:controller/application_controller.rb
class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  
  before_action :set_locale

  def set_locale
    I18n.locale = locale
  end

  def locale
    # ここで言語の切り替えを行う
    @locale ||= params[:locale] || I18n.default_locale
  end
end

```

## dictionary
1つのファイルに全文言をかくと意味不明状態になるので、
参考サイトに倣って然るべき場所に然るべきファイルを作成し文言を記述していきます。
今回はbrandのviewで使いたかったので

- config/locales/views/brands/ja.yml
- config/locales/views/brands/en.yml

を作成しています。

```yaml:config/locales/views/brands/ja.yml
ja:
  brand_index_title: "ブランド一覧"
```

```yaml:config/locales/views/brands/en.yml
en:
  brand_index_title: "Brand List"
```

これ以外にも階層を持った書き方もできたりします。
詳しくは調べてください。

## view
書き方はいろいろありますが、階層を持たない場合はこれで統一してください。
（この例にはslimを使用しています）

```rb:view/brands/index.rb
h1 = t(:brand_index_title)

```

# 結果
locale = :jaの場合
<img width="583" alt="a552ecf6-da35-7015-cacd-c512c6dee036.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/cdff6f70-6971-3459-2102-3f3b934cae8a.png">


locale = :enの場合
<img width="565" alt="aa1e6ef6-fc11-a1fe-5b8e-3eca219de7bf.png" src="https://qiita-image-store.s3.amazonaws.com/0/147005/e336ce44-992f-38b1-e385-1384e1646eac.png">



# 補足
今回はviewでの利用方法でしたが、modelでも利用することになります。
（validのエラーメッセージで使うはず）
dplyr内での& と &&の違い

当たり前なのですが、失敗したので書いておきます。

# &,&&の違い

&はリストの場合はリストの要素ごとに論理積を出しますが、&&スカラしか対応しておらず、1要素目同士の論理積を出します。

```R
> a = c(TRUE,TRUE,FALSE,FALSE)
> b = c(TRUE,FALSE,TRUE,FALSE)
> a & b
[1]  TRUE FALSE FALSE FALSE
> a && b
[1] TRUE
```

# dplyrでの条件式では

filterなどで条件式を書きますが、&&を使ってしまうと、直感的にはよくわからない結果になってしまいます。
filter内の条件式は要素ごとの比較を書いているのではなくて、あくまでリスト同士の条件を書いているということが念頭にあればこういう間違いは起こらないのでしょうが、ついつい書いてしまいます(C#erだし)。

```R
> df <- data.frame(a=a,b=b)
> df %>% filter(a & b)
     a    b
1 TRUE TRUE
> df %>% filter(a && b)
      a     b
1  TRUE  TRUE
2  TRUE FALSE
3 FALSE  TRUE
4 FALSE FALSE
```
Facebook ピクセル のコード埋め込みについてメモ

## トラッキングコードの埋め込み
タグマネージャーとかで埋め込んでおくと便利です。
（タグ > カスタム HTML で下記をぺたり）

```html
<!-- Facebook Pixel Code -->
<script>
var fbPixelId = "[PIXEL CODE ID]";
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};if(!f._fbq)f._fbq=n;
n.push=n;n.loaded=!0;n.version='2.0';n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];s.parentNode.insertBefore(t,s)}(window,
document,'script','https://connect.facebook.net/en_US/fbevents.js');
fbq('set', 'autoConfig', false, fbPixelId);
fbq('init', fbPixelId);
fbq('track', 'PageView');
</script>
<noscript><img height="1" width="1" style="display:none"
src="https://www.facebook.com/tr?id=[PIXEL CODE ID]&ev=PageView&noscript=1"
/></noscript>
<!-- DO NOT MODIFY -->
<!-- End Facebook Pixel Code -->
```
2017/05/19？あたりから（気づいたのはほんの最近でしたが。。）ボタンとかに片っ端からイベントが仕込まれてるようで、どうにかなんないかなーと思ってましたが、以下を入れてあげればどうにかなりました。(上記では既に入ってます)

```
fbq('set', 'autoConfig', false, [PIXEL CODE ID]);
```

(2018/12/20 @hareno さんよりご指摘頂き、リファレンスURLを修正しました)
参考: https://developers.facebook.com/docs/facebook-pixel/advanced#automatic-configuration
~~参考： https://developers.facebook.com/docs/facebook-pixel/api-reference~~

## 各種コンバージョンイベント
https://www.facebook.com/business/help/952192354843755
より抜粋

なにかユーザーのアクションをトラッキングしたかったり、特定のページのコンバージョンを取りたいときには以下の様なものを使って送る。

```js
if (window.fbq) {
    // コンテンツを表示
    fbq('track', 'ViewContent');

    //友達、スポット等を検索
    fbq('track', 'Search');

    //カートに追加
    fbq('track', 'AddToCart');

    //ウィッシュリストへの追加
    fbq('track', 'AddToWishlist');

    //精算開始
    fbq('track', 'InitiateCheckout');

    //支払い情報の追加
    fbq('track', 'AddPaymentInfo');

    //購入
    fbq('track', 'Purchase', {value: '0.00', currency: 'USD'});

    //リード
    fbq('track', 'Lead');

    //登録完了
    fbq('track', 'CompleteRegistration');

    //カスタムコンバージョン
    fbq('trackCustom', 'HogeFuga');
}
```

## まとめ
ちゃんとドキュメント読もう。
GitHub English Challenge Cheat Sheet

GitHub上の実際のコミットメッセージやIssueのやりとりをみて、チートシート作りました。

## 共通的なこと

* コミットメッセージやIssueのタイトルは、主語省略し、1文で書き行末ピリオドは付けない
* 動詞は現在形・過去形のどちらも同じくらいの頻度で見られるが、どちらかに揃える。

## コミットメッセージを書く

|Japanese|English|
|:---|:---|
|Aを実装しました|Implement A|
|機能(クラス)BにAを実装しました|Add A to B|
|機能(クラス)BのAをリファクタリングしました|Refactor A in B|
|AをBからCに変更しました|Change A from B to C|
|AでなくBを使うようにしました|Replace A with B|
|機能(クラス)Aのテストを追加しました|Add test for A|
|機能(クラス)Aの失敗していたテストを修正しました|Fix broken A tests|
|依存ライブラリAをバージョンx.y.zに上げました|Update A to x.y.z|
|ファイルA中の誤字を修正しました|Fix typo in A|
|〜のとき〜するバグを修正しました|Fix the problem where 〜 when 〜|
|機能(クラス)Aについて、Bにも対応しました|Support B in A|
|ドキュメントAのBに関する記述を修正しました|Improve B in A|
|Aで発生するエラーメッセージを見直しました|Improve error message thrown in A|
|バージョンx.y.zをリリースしました|Release x.y.z|

### 本当は避けたほうが良いが、細かい修正をまとめてコミットするときのコメント用例

|Japanese|English|
|:---|:---|
|依存ライブラリのバージョンを諸々更新しました|Update dependencies|
|雑多なコードフォーマット修正・可視性の修正をしました|Polish|
|コンパイル・静的解析の警告を出ないように修正しました|Clean up|

## 問い合わせる

|Japanese|English|
|:---|:---|
|〜する予定はありますか?|Do you have any plans to 〜 ?|
|(このプロダクトを使って)〜することはできますか?|Is there any way |
|回避策ありませんか?|Is there a workaround?|
|～してないのって、何か理由ありますか?|What is the reason for not ～?|
|設定/実装例がほしいです|Could you provide an example please?|
|どうぞよろしくお願いします|Thanks in advance.|
|〜するとNullPointerExceptionがでます|We get NPE when 〜|
|このドキュメントを日本語に翻訳してもいいですか?|Can I translate the docs to Japanese?|
|クローズしちゃっていいですか?|Can I close this?|
|バージョンx.y.zでも、まだこのバグ潰れてないです|I still encounter this bug with x.y.z.|

## 問合せに答える

|Japanese|English|
|:----|:----|
|再現できないですねぇ…|I'm afraid I can't reproduce the error you're seeing.|
|もうちょっと情報ください|You'll need to provide a little more information than that.|
|スタックトレースはありませんか?|Could you provide a stack trace?|
|そこがまさに問題なんです|That's exactly the problem.|

## お礼をいう

|Japanese|English|
|:----|:----|
|とても勉強になりました|I think I've learned a lot.|
|オッ、分かりました!|I see now.|
|フィードバックありがとう|Thanks for the feedback.|
|何か他にもありましたら、よろしくお願いします|You're more than welcome to contribute.|
|もし解決できたら、プルリク送ってください|If you are able to resolve this, we would encourage you to send a pull request.|
|ちゃんと動きました!|It's working as expected.|