OmniAICreator/Qiita-1.07M huggingface dataset:
さくらのレンタルサーバーでWordPressを使って独自ドメイン、SSL対応するまで

だいたい公式のインスト通りなのですが、それでもつまづいた点、解決方法を書いていきます。
以下の手順で行いましたが、例えばSSL設定を先にやると再現しない問題もあるかと思います。
ご参考までに。

# 目次
- WordPressをインストールする
- サブドメインをRoute53に設定しさくらのレンタルサーバーに適用する
- 無料SSL（Let's Encrypt）をインストールする
- 常時SSL化プラグインのインストール
- WordPress側の設定

# さくら契約
人気No.1のスタンダードで

# WordPressインストール
コンパネ→クリックインストール　からサクッと

# サブドメインをRoute53に設定しさくらのレンタルサーバーに適用する
## さくら側
コンパネ→サーバー情報の表示、でIPアドレスを控えておきます。
<img width="514" alt="スクリーンショット 2018-03-27 9.29.45.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/43b11b08-d63f-9af5-80dc-fec7402a418e.png">

コンパネ→ドメイン/SSL設定→新しいドメインの追加→5.他社で取得したドメインを移管せず使う→他社で取得されたドメインのサブドメインを追加

## Route53側
Aレコードで先程控えておいたIPで登録します。
<img width="416" alt="スクリーンショット 2018-03-27 9.33.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/80d28e3b-39c1-6818-ff06-686411273624.png">

NSレコードも追加します

# 無料SSL（Let's Encrypt）をインストールする
コンパネからサクッと
筆者は一度失敗のメールが来ましたが、再度インストールを行ったところ成功しました。

ここまで出来ると、httpで独自ドメインでWebサイトを見れるようになります。

# WordPress側の設定
WordPressアドレスとサイトアドレスを独自ドメインに変更。
**これを直さないと常時SSL化した時にログインページにアクセスできなくなり結構焦ります**

<img width="617" alt="スクリーンショット 2018-03-27 9.44.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/214400/e93e0f3f-b06f-a5d5-181a-064c7c5e2305.png">

# 常時SSL化プラグインのインストール
**必ずログインページが見れることを確認してから実行しましょう**
https://help.sakura.ad.jp/hc/ja/articles/115000047641--WordPress-%E5%B8%B8%E6%99%82SSL%E5%8C%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9

# つまづいた点
## 常時SSL化する際に、wp-login.phpがnot foundになってしまう。
初期ドメインのままになっていることが原因。WordPressの設定からURLを変更する。

## なんかいちいち初期ドメインに行ってしまうんですけど・・・？
WordPressの設定が初期ドメインのままになっていることが原因。URLを変更する。

参考
https://help.sakura.ad.jp/hc/ja/articles/115000047641--WordPress-%E5%B8%B8%E6%99%82SSL%E5%8C%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
https://help.sakura.ad.jp/hc/ja/articles/115000051662--WordPress-%E5%B8%B8%E6%99%82SSL%E5%8C%96%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3-%E3%83%88%E3%83%A9%E3%83%96%E3%83%AB%E3%82%B7%E3%83%A5%E3%83%BC%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0
Mathematicaメモ

# データ点のプロット
横軸のデータ点 $x_i$ に対して縦軸のそれが $y_i$ で与えられているとき，

```
list={{x1,y1},{x2,y2},...}
```

のようなリストを作れば，

```
ListPlot@list
```

によってプロットできる．

点列が次のように別々に与えられている場合を考えよう：

```
x={0.1, 0.3, 0.34, 0.6, 1.1};
y={100,300,200,500,20};
```

各データ点は横軸座標 x[i]，縦軸座標 y[i] であるとする．このときは，

```
list=Partition[Riffle[x,y],2];
ListPlot@list
```

でプロットできる．
  

# 有限次元における固有値方程式を解く
ある$N$次元のケット空間 $\mathbb{H}^N$ において，以下の固有値方程式を考える：
$$
\hat{\mathcal{A}}|\phi_a\rangle=a|\phi_a\rangle,
$$ここで$\hat{\mathcal{A}}$はある線形演算子とする．目的は，Mathematicaを使って固有値$a$を求め，それに属する固有ケット$|\phi_a\rangle$から作られる行列要素：
$$
\langle\phi_a|\hat{\mathcal{B}}|\phi_{a'}\rangle,
$$を求めることである．ただし$\hat{\mathcal{B}}$は $\mathbb{H}^N$ で働く任意の線形演算子とする．前提条件として，以下の行列要素は人間が顕に書き下せるものとする：
$$\langle n|\hat{\mathcal{A}}|n'\rangle\ \mathrm{and}\ \langle n|\hat{\mathcal{B}}|n'\rangle,$$ここで$\\{|n\rangle\\}$は $\mathbb{H}^N$ における正規直交基底である．
## コード
$\langle n_1|\hat{\mathcal{A}}|n_2\rangle$と$\langle n_1|\hat{\mathcal{B}}|n_2\rangle$は

```
A[n1,n2]
B[n1,n2]
```

という関数で与えられているものとする (近似数値とする)．$n_1,n_2$はそれぞれ$1$から$N$まで動く整数としよう．まず行列 (リスト) を作る：

```
matA=Table[A[n1,n2],{n1,N},{n2,N}];
```

行列の固有値とそれに属する固有ベクトルを求める：

```
es=Eigensystem[matA]; (* 固有値方程式を解く *)
e=es[[1]]; (* 固有値列 *)
v=es[[2]]; (* 固有ベクトル列 *)
```

ここで，matAが近似数値で与えられていない場合は v が規格化されないので注意が必要である．
もう1つの方の行列を作る：

```
matB=Table[B[n1,n2],{n1,N},{n2,N}];
```

先程求めた固有ベクトル列を使って基底を変更する：

```
eigenmatB=Conjugate[v].matB.Transpose[v];
```

$\langle\phi_{a1}|\hat{\mathcal{B}}|\phi_{a2}\rangle$は

```
eigenmatB[[a1,a2]];
```

で取り出せる．また，$a$番目の固有ベクトルが属する固有値は

```
e[[a]];
```

で参照できる．このリストには，固有値の絶対値が大きい順に格納されている．

## 実際の例
## 原理
buildメソッドについて

親モデルに属する子モデルのインスタンスを新たに生成したい場合に使うメソッド。
（親モデルと子モデルは、アソシエーション設定あり）
外部キーに値が入った状態でインスタンスが生成できる。

ブログに紐づくコメントインスタンスを生成したい場合
※BlogモデルとCommentモデルは、１対多のアソシエーションを設定しているとします。

```ruby
@blog = Blog.find(params[:id])
@comment = @blog.comments.build  ## 親モデル.子モデル.buildという形式
```

生成されるコメントインスタンスの中身

```ruby
@comment
 id: nil,
 blog_id: 1,
 user_id: nil,
 content: nil,
 created_at: nil,
 updated_at: nil
```
blog_idに値が入っています。
Rustの「配列」たち

数値計算では，たくさんの実数のを「配列」に格納して演算を行います。Rustには標準でどのような「配列」が用意されているのでしょうか。

# 配列

まずは普通の配列。コンパイル時にサイズが分かっている必要があります。

```Rust
const N: usize = 1000;
let mut a = [0.0; N];
```

スタックに確保されるので，大きな配列には向いていません。

# ベクター

お次は標準ライブラリの [`std::vec`](https://doc.rust-lang.org/std/vec/)。ベクターはヒープ上に割り付けられる連続した可変長の配列。`Vec::new()`またはマクロ`vec![]`で作ることができます。

`Vec::with_capacity(100)`とすると100個分の連続した領域が確保されますが，容量は100，長さは0です。次の例では`v.push(3.14)`した時点で`v.len()`は`0`から`1`となり，`v[0]`にアクセスできるようになります。

```Rust
let n = 100;
let mut v: Vec<f64> = Vec::with_capacity(n);
v.push(3.14);
println!("{} {}", v[0], v.len());
```

# ボックス

[`std::boxed`](https://doc.rust-lang.org/std/boxed/index.html)はヒープ上に割り付けられます。サイズはコンパイル時に分かっている必要があります。

```Rust
const N: usize = 1000;
let mut b = Box::new(N);
```

# 動的割付配列

Cの`malloc`，Fortranの`allocate`に相当する長さ固定の動的割付配列ものはないのでしょうか。`vec::set_len()`で長さを指定できるものの，`unsafe`です。ベクターで割り付けてからボックスに変換すると良さそうです。

```Rust
fn myalloc(n: usize) -> Box<[f64]> {
    vec![0.0; n].into_boxed_slice()
}
```
High Sierraにしたらopensllとかcurlでエラーが出るようになって困った

curlが動かねぇ

```
$ curl -i https://example.com
curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to example.com:443
```

opensslも動かねぇ

```
$ openssl s_client -connect example.com:443 -showcerts
CONNECTED(00000006)
140735838761864:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:/BuildRoot/Library/Caches/com.apple.xbs/Sources/libressl/libressl-22/libressl/ssl/s23_lib.c:124:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 318 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
---
```

困るわ！
どうやらHigh SierraはopensslからLibreSSLに変わったらしい。

```
$ curl -V
curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: AsynchDNS IPv6 Largefile GSS-API Kerberos SPNEGO NTLM NTLM_WB SSL libz HTTP2 UnixSockets HTTPS-proxy

$ openssl version -a
LibreSSL 2.2.7
built on: date not available
platform: information not available
options:  bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) blowfish(idx)
compiler: information not available
OPENSSLDIR: "/private/etc/ssl"
```


取り急ぎ対応。

```
$ brew install openssl curl
$ echo 'export PATH="/usr/local/opt/curl/bin:$PATH"' >> ~/.bash_profile
$ echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.bash_profile
```

Chromeブラウザから一部のURLアクセスでエラーになるのもこのせいか？
mrubyガジェットいろいろ

mrubyなガジェットのリストを作ってみました。

|項目|[GR-CITRUS](http://gadget.renesas.com/ja/product/citrus.html)|[GR-PEACH](http://gadget.renesas.com/ja/product/peach.html)|[enzi basic board](http://enzi.cc/)|[EAPL-Trainer](http://www.ilc.co.jp/commodity/eapl-trainer-mruby/index.html)|[ESP32](https://github.com/mruby-esp32/mruby-esp32)|[mruby on YABM](https://qiita.com/yamori813/items/e13c29b96c42d895e8ea)|
|:--|:--|:--|:--|:--|:--|:--|
|発売元|がじぇっとるねさす|がじぇっとるねさす|SCSK九州|アイ・エル・シー|Espressif Systems|いろいろ|
|価格|2200円|9690円||16800円|1480円|108円(HardOff)-|108円(HardOff)-|
|CPU|RX631|ARM Coretex-A RZ/A1H|ARM Coretex-M4|RX63N|Tensilica LX6|RTL8196C,BCM4712,ADM5120|
|クロック|96MHz|400MHz|168Mhz|96MHz|240MHz|175MHz-|
|RAM|2M|10M|1M+192K||520KB|8M-|8
|ROM|256K|8M|1M|||2M-|
|Ethernet|×||○|×|×|○|
|WiFi|△||×|×|○|×|

これらの他にPIC32MXやSTM32などのワンチップマイコンでmrubyを動かされている人もいるようです。ソースツリーのexamples/targetsにいくつかのマイコン用のビルドコンフィグがあります。

enziなどをターゲットにした[plato](http://plato.click/index.html)というフレームワークがあるようです。

どこかにmrubyは数Mのメモリをつんだモジュールをターゲットにしているというような事が書かれていました。メモリが1Mより少ないターゲットでも動くようですが、制約があるかもしれません。

蟹さんの8M/2MはOSをのせるには小さいのですが、BareMetalのmrubyにとっては十分大きいです。蟹さんは32M/8Mのターゲットなどもあり途方も無く広大です。

OS上で動いているもの

|項目|Mindstorms EV3|[OnionOmega](https://qiita.com/yamori813/items/ae66330ccbf6fe6bd5ab)|[rubyCOM-RX](http://www.datec.co.jp/iot/ruby-com.html)|
|:--|:--|:--|:--|
|発売元|Lego|クラウドファウンド|データテクノロジー|
|価格||||
|OS|Linux|FreeBSD|μITRON|
|CPU|ARM 9|AR9330|RX63N|
|クロック|300MHz|400MHz|96MHz|
|RAM|64M|64M|256K|
|ROM||16M|1M|
|Ethernet||○|○|
|WiFi||×|×|

FreeBSDのルータ用ビルド環境の[ZRouter](https://qiita.com/yamori813/items/2fc5b14648029bb4730f)にはmrubyのプロファイルを入れてあるので、Flashが8M以上のターゲットであればmrubyを入れてビルドして、mruby入りu-bootイメージを作成する事ができます。目安としてRAMが32M以上であれば充分実用になります。
Selenium でリンクをたどる　(python3)

Selenium でリンクをたどるサンプルです。
id と text の例があります。

Arch Linux でのソフトのインストール

```bash
sudo pacman -S python-selenium
sudo pacman -S geckodriver
```

```py:follow_link.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	follow_link.py
#
#					May/23/2021
#
# ------------------------------------------------------------------
from selenium.webdriver import Firefox

url = 'https://ekzemplaro.org'

browser = Firefox()
browser.get(url)
tag = browser.find_element_by_id('ekzemplaro')
tag.click()
#
tag = browser.find_element_by_link_text('Tips')
tag.click()
#
# ------------------------------------------------------------------
```

実行方法

```bash
./follow_link.py
```

実行結果
![selenium_may2301.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/5fb10b0c-a6a1-54c6-df6c-ed2406d7e1ac.png)



テストしたバージョンです。

```text
$ pacman -Q python-selenium
python-selenium 3.141.0-3

$ pacman -Q geckodriver
geckodriver 0.26.0-1
```
LINQ to EntitiesでCRUDする方法についての備忘録

業務でEntity Frameworkを使いました。
その際、SQLの構文とCRUDのメソッド名が違い、
少し悩んだのでメモ書。

また、IQuerable型でデータを扱わないと、SQLが発行されずに
LINQ to Objectsの扱いになる点にも注意。
膨大なデータのオブジェクトを扱ってしまうことになります。

```csharp:SELECT
using (var context = new XXXXXContext())
{
    context.YYYYYs.Where(x => x.Id == 1);
    context.YYYYYs.Where(x => x.Name == "hogehoge").ToArray();
}
```

```csharp:INSERT
using (var context = new XXXXXContext())
{
    // YYYYY Entity の Statesが
    // Unchanged状態→Added状態へ。
    context.YYYYYs.Add(
        new YYYYY()
        {
            id = 1,
            value= "hoge",
        });

    context.SaveChanges();
}
```

```csharp:UPDATE
using (var context = new XXXXXContext())
{
    var yyyyy = context.YYYYYs.Single(x => x.Id == 1);
    yyyyy.Name = "Aiueo";
    context.SaveChanges();
}
```

```csharp:SELECT→DELETE
using (var context = new XXXXXContext())
{
    var yyyyy = context.YYYYYs.Single(x => x.Id == 1);
    context.YYYYYs.Remove(yyyyy);
    context.SaveChanges();
}
```

Entity Frameworkは以下の状態を持っており、
SaveChanges()メソッドで更新系SQLを発行。

Unchanged: 追跡開始後に変更されていない状態
Added: 追加された状態。
Modified: 編集された状態。
Deleted: 削除された状態。
Detached: 追跡が開始されていない状態


参考
---
[LINQ to Entitiesに関する私の勘違いを見直した話](http://tsubalog.hatenablog.com/entry/2015/07/03/110000)
[Entity Framework](https://techinfoofmicrosofttech.osscons.jp/index.php?Entity%20Framework#me91998f)
TensorFlow v1.2.1 > cifar10_train.py > Error: ImportError: No module named 'tensorflow.models' > 古いバージョンのTensorFlow用コード | 動作環境の記載

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.2.1
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
scipy v0.19.1
geopandas v0.3.0
MATLAB R2017b (Home Edition)
ADDA v.1.3b6
gnustep-gui-runtime v0.24.0-3.1
```


### システムの更新手順

1. 現状のシステムで問題ないことを確認する
2. システムを更新する
3. 更新後のシステムで動かなくなった事項に対処する

### 1. 現状のシステムで問題ないことを確認する

[TensorFlow > TensorFlowを遊び倒す！ 4-1. Convolutional Neural Networks > cirar10_train.pyを実行しながらcifar10_eval.py](https://qiita.com/7of9/items/b8286880b483f6468e27)

> ```
$ python3 cifar10_train.py
Traceback (most recent call last):
  File "cifar10_train.py", line 47, in <module>
    from tensorflow.models.image.cifar10 import cifar10
ImportError: No module named 'tensorflow.models'
```

現状のシステムでは動かない。

以下を見つけた。
https://teratail.com/questions/77683
> aika_y
> modelをすべて落としてcifar10_train.pyを実行してみたところ、きちんと実行ができました。

TensorFlowをv0.11からv1.2.1にする過程でcifar10_train.pyが動かなくなっていた。

### 動作環境の記載

Qiitaの記事には動作環境を書くようにしている。
動作環境を書いておけば、問題の解決・対処につながりやすい。

動作環境の記載には@howdy39 さんによる「[Q Accelerator](https://qiita.com/howdy39/items/e6136b8454099ebfef29)」を使用している。

- [Q Accelerator > 新規投稿時のテンプレート > 動作環境のテンプレートとしての使用案](https://qiita.com/7of9/items/6992704790d12d542a75)

TensorFlowのような開発速度が速いフレームワーク?を使う場合、どの動作環境で動かしたかの情報は大切になる。

### システム更新どうするか

最新版(2018年3月27日現在)

- TensorFlow v1.6.0: [link](https://github.com/tensorflow/tensorflow/releases/tag/v1.6.0)
- cuDNN v7.1: [link](https://developer.nvidia.com/cudnn)
- CUDA v9.1: [link](https://developer.nvidia.com/computeworks)

目的はUbuntu 16.04.4 LTSへのアップデートなので、上記すべてを更新するまではしなくてもいいかもしれない。
TensorFlow v1.2.1で動く実績のあるコードで動作確認して、システム更新、動作確認の手順になりそうだ。
Fusion 360 Sketch Tips

​
‐Line + arc
Click and drag end point, tangent arc can be created.
Screencast: http://autode.sk/2elupbz
-Cancel snapping
CTRL[WIN] / CMD[MAC]
-Midpoint
SHIFT and mouse over
Screencast: http://autode.sk/2xdbqtP
-Parallel/perpendicular guide
mouse over target line
Screencast: http://autode.sk/2xf5w6n
-Change command type
Can be found on Sketch Pallet
Screencast: http://autode.sk/2xf5w6n
-Context menu for Dimension
Right click
screencast: http://autode.sk/2gbSEsg
-Arc centre or tangent (dimension context menu)
Right click
-LIne/Spline End task
Double Click
-Draw parpendicular line on Line
Start and Hold on line
-Draw parpendicular line on Circle
Hold on line (0, 90, 180, 270)
-Draw tangent line
Hold on line other than (0, 90, 180, 270)
darknetでYOLOv3を動かしてみた。

##目的
深層学習フレームワークdarknetのYOLO(You only look once)特徴量の最新版YOLOv3を動かしてみた。

[darknet](https://github.com/pjreddie/darknet/tree/9726f1e89c29fb9a8802f0a544e2cc79aafa67ff)

##概要
yolov3のファイルをダウンロードしてきて、dartknetで読み込むだけである。

##環境
Ubuntu 14.04(x64) 
GPU:NVIDIA GeForce GTX1050


##インストール

###深層学習フレームワークdarknetをインストールする。

````
git clone https://github.com/pjreddie/darknet.git
cd darknet
````

###Makefileを修正し、GPUとOpenCVをOnにし、makeする。

````
vi Makefile
make
````

変更前(Makefile)

````
GPU=0
CUDNN=0
OPENCV=0
OPENMP=0
DEBUG=0
````

変更後(Makefile)

````
GPU=1
CUDNN=0
OPENCV=1
OPENMP=0
DEBUG=0
````

###YOLOv3をダウンロードする
YOLOv3の学習済みファイルをダウンロードする

````
wget https://pjreddie.com/media/files/yolov3.weights
````

###YOLOv3をテストする

````
./darknet detect cfg/yolov3.cfg yolov3.weights data/dog.jpg
````

![predictions.jpg](https://qiita-image-store.s3.amazonaws.com/0/73020/e195f581-df45-70d2-4f0e-585fff8a504c.jpeg)


###WEBカメラでテストする

````
./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights
````

###YOLOv2と比較する

YOLOv2の学習済みファイルをダウンロードする

````
 wget https://pjreddie.com/media/files/yolov2.weights 
````

YOLOv2をwebカメラで実行する

````
./darknet detector demo cfg/coco.data cfg/yolov2.cfg yolov2.weights
````
ABC015D 「高橋くんの苦悩」

#問題概要

- 制約付きナップザック[(リンク)](https://beta.atcoder.jp/contests/abc015/tasks/abc015_4)
- 荷物は$K$個までしか選べない
- $1 \le W \le 10^5, 1 \le N \le 50, 1 \le K \le N$

#最初に考えたこと

- 絶対dpでしょ
- 制約を無視して普通に考えて、最終的にその制約を満たすものを考えれば良い

#考察

- `dp[i][j][w] := i番目までからj個選んだ時の幅合計w以下での最大の価値`で良さそう
- 計算量は$O(WN^2)$なのでギリギリ余裕（？）
- 漸化式は
    - $w+weight[i] \le W$(つまり$i$番目を選べる時)では
$dp[i+1][j+1][w+weight[i]] = max (dp[i][j][w] + value[i], dp[i][j][w+weight[i])$

    - 共通の操作として($i+1$番目までのものと$i$番目までのものを比較)
$dp[i+1][j][w] = max (dp[i+1][j][w], dp[i][j][w])$

- 二つ目の漸化式がすんなり出てこなかった（デバッグしながら試行錯誤した）
- 一度式を立ててしまうと理屈づけるのは簡単だが、ひねり出すのに一苦労

#解答
```cpp:answer.cpp
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <map>
#include <set>
#include <vector>
#include <stack>
#include <queue>
#include <bitset>
#include <algorithm>
#include <numeric>
#include <functional>
using namespace std;

#define Rep(b, e, i) for(int i = b; i <= e; i++)
#define rep(n, i) Rep(0, n-1, i)

typedef long long ll;

const int MAX = 64;

int A[MAX], B[MAX], dp[MAX][MAX][10010];
//abc015d
void solve(void){
    //input
    int N, W, K;
    cin >> W >> N >> K;
    rep(N, i) scanf("%d %d\n", &A[i], &B[i]);

    //dp[i][j][w] := i番目まででj個選んだ時幅合計wでの最大の価値
    rep(N, i) Rep(0, N, j) Rep(0, W, w) {
        if (w+A[i] <= W) {
            dp[i+1][j+1][w+A[i]] = max(dp[i][j][w]+B[i], dp[i][j][w+A[i]]);
        }
        dp[i+1][j][w] = max(dp[i+1][j][w], dp[i][j][w]);
    }
    /*
    rep(K+1, k) {
        rep(W+1, w) printf("%d ", dp[N][k][w]);
        putchar('\n');
    }*/
    printf("%d\n", dp[N][K][W]);
}

int main(void){
  solve();
  return 0;
}
```

[(リンク)](https://beta.atcoder.jp/contests/abc015/submissions/2267346)

#最後に
- 時間かかりすぎた(2h以上はかけた)
- dpむずかちむずかち
Safari非対応のサイトをSafariで表示する

Safari非対応のサイトをSafariで表示する

###＜事象＞
Safariでの動作を確認しようとした際に、Safari非対応サイトであったためサイトの表示をすることができなかった。

###＜解決策＞
以下のステップで他のブラウザの環境で開く
1. Safariメニューバーの「開発」メニューを選択する
2. ユーザーエージェントを選択する
3. Google Chrome(iPad)を選択する

###＜本当にこれでいいのか＞
これについては、このユーザーエージェントというものがどういうものなのかをもっとちゃんと調べます。
Apache httpdとmod_rewriteとphp-fpmで少しハマった

# 概要
サイトA(`http://hoge.host`)にアクセスしてきたとき、一部コンテンツをサイトB(`http://fuga.host`)にリダイレクトしたかったとき少しハマったので備忘録的にメモしておく。

# 前提
  - サイトAではApache httpd 2.4とPHPが動作している。
  - サイトAの一部URL(`http://hoge.host/a/`)にアクセスしたときはサイトAのサーバで処理し、別のURL(`http://hoge.host/b/`)にアクセスしたときはサイトB(`http://fuga.host/b/`)に転送させたい。

ここまでであればhttpdとmod_rewriteで問題なかったのだが、httpdのeventモジュールとphp-fpmの設定を追加したタイミングで一部URLのリダイレクトに問題が出ていることが分かった。
具体的には`http://hoge.host/b/aaa.jpg`は問題ないが、`http://hoge.host/b/bbb.php`のようなリクエストの場合に書き換えに失敗していた。

# 原因と解決
mod_rewriteでの書き換えはwwwrootに設置してある.htaccessで処理していたのが、httpdの設定で先にphp-fpmにcgiで処理を投げていたため、RewriteCondを満たしていてもURLの書き換えが出来ないという状態だった。

以下のようにhttpdの設定ファイルを書き換えることでcgiに投げるURLを制限して解決した。

```/etc/httpd/conf.modules.d/01-cgi.conf
...
<IfModule mpm_event_module>
   LoadModule cgid_module modules/mod_cgid.so
   ProxyPassMatch ^/(^b)(.*\.php(/.*)?)$ fcgi://127.0.0.1:9000/path/to/webroot/$1
</IfModule>
...
```

あるいは[こちらに記載](https://gist.github.com/milo/4c4171950952684a8afc)のようにやる。
center-one

### 殆ど使わないタグを一つの機能に特化させる。例えば、中央指定。
```css
/*var is center one*/
.var,[var],var{display:flex;justify-content:center;align-items:center}
```
### 全部
```css
/*var is center one*/
.var,[var],var{display:flex;justify-content:center;align-items:center}

/*debug*/
var{
  position:fixed; top:30px; right:400px;
  width:200px;height:200px;
  background-color:rgba(0,0,0,0.05); 
}
```
```html
<var><b>xyz aaa bbb</b></var>
```
fishでdotfilesマネージャdotを使う


# 経緯

最近メインのシェルをzshから[fish](https://fishshell.com/)に乗り換えました。
私はdotfilesの管理に[dot](https://github.com/ssh0/dot)というdotfilesマネージャを使用していました。しかし、dotはbash/zshにしか対応していないためfishでは使用できませんでした。

そこで、fishでもdotを使えるようにしてみました。

 - [fish-dot](https://github.com/re3turn/fish-dot)

fishはbash/zshと互換性が無いため、1からfishで作成するのは諦めました。
bashなら大抵はどの環境にも入っているはずなので、bash版dotのラッパー関数として作成しています。

実行のたびにdotをインストールしてコマンドを使用する仕様になっていますが、あまり重い処理をしているわけではないですし、暫く使ってみても特に問題が無いようなので公開しました。

# 前提ソフトウェア

bash版のラッパー関数なのでbashが必要です(大抵の環境にはあると思いますが)。
また、インストールに[fisher](https://github.com/jorgebucaran/fisher)が必要です。

 - bash
 - fisher

# インストール

以下を実行するだけでインストールできます。

```
fisher install re3turn/fish-dot
```

# セッティング
実行するためには[dot](https://github.com/ssh0/dot)リポジトリも必要になります。
`~/.dot`にdotリポジトリをクローンする場合は以下の様にしてください。
`your_username`の部分は各自のアカウント名に変更してください。

```
git clone https://github.com/ssh0/dot ~/.dot
set -U DOT_REPO https://github.com/your_username/dotfiles.git
set -U DOT_DIR ~/.dotfiles
set -U DOT_SCR ~/.dot
```

fish-dotでは、dotで必要な環境変数に加えてdotリポジトリのクローン先のディレクトリパスを定義します。

|環境変数 |説明|
|-------|-----|
|DOT_REPO | 自分のdotfilesリポジトリのURL |
|DOT_DIR | 自分のdotfilesリポジトリのクローン先ディレクトリパス(フルパス) |
|DOT_SCR | dotリポジトリのクローン先ディレクトリパス(フルパス)| 

bashやzshの場合、`~/.bashrc`や`~/.zshrc`に環境変数を設定しますが、fishの場合ユニバーサル変数として一度定義すればよいです。ユニバーサル変数は、明示的に削除しない限り、fishプロセスを終了したりOSを再起動しても永続的に定義されます。

# 使い方

使い方はbash、zsh版と変わりません。
使い方の詳細は[製作者様の記事](https://qiita.com/ssh0/items/930127d079ccd08bc18a)を参照してください。

# タブ補完
dotコマンドのサブコマンド、およびオプションは[タブ補完](http://fish.rubikitch.com/document-ja/#655806bc25d47ab50429cd006ca797be)出来るようにしています。
dotと打ったあとに<kbd>Tab</kbd>を押すとサブコマンドが補完できます。
dotコマンド単体、またはオプションを持つサブコマンドの後ろに`-`を打ったあとに<kbd>Tab</kbd>を押すとオプションを補完できます。

![fish-dot2.gif](https://qiita-image-store.s3.amazonaws.com/0/136134/ba9faf29-8367-9526-b5c7-ecd7b71c4a3e.gif)
さくらVPS サブドメインを設定

下記にアクセス。

```
https://secure.sakura.ad.jp/menu/dns/
```

ゾーン設定をクリック。エントリの追加と変更のテーブルに下記を入力。

|タイトル|内容|
|---|---|---|
|エントリ名|hoge.xxx.com|
|種別|CNAME|
|値|@|
|DNSチェック|する|
|TTLの指定|チェックしない|

新規登録ボタンをクリック。

`nginx.conf`を開く。

```
$ sudo vim /etc/nginx/nginx.conf
```

ポートは80番、サーバネームには設定したサブドメインを、ドキュメントルートは`/var/www/html/hoge`に設定。

```
server {
    listen       80;
    server_name  hoge.xxx.com;
    root         /var/www/html/hoge/;
}  
```

設定ファイルの構文チェック。

```
$ sudo nginx -t
```

問題なければ、nginxを再起動。

```
$ systemctl restart nginx
```

`/var/www/html/hoge/index.html`を配置し、hoge.xxx.comにアクセスし、ページが表示されれば完了。
Railsにおける多対多(n対n)のアソシエーション

# この記事で前提にしていること

- Railsアプリを作成できていること
- ターミナル上の基本的なコマンドを使用できること

注）はじめてのQiitaへの投稿となりますので、不備があるかと思いますが、ご指摘いただけたらと思います。

環境

- Rails -v 5.1.5
- Ruby -v 2.4.2

# 多対多のアソシエーションの作り方
以下のようなモデルを想定します

- userが複数のgroupをもっている
- groupが複数のuserをもっている
- 特定のuserが持っているgroupが呼び出せる
- 特定のgroupが持っているuserが呼び出せる

## モデルの構造
`user -- user_group -- group`のように、中間モデルであるuser_groupを設けて、userモデルとgroupモデルを紐付けます

それぞれのモデルの中身は以下のようになるように作ります。

| Model    | column1:class | column 2:class |
|:---------|:---------|:---------|
| User     | name:string     |          |
| Group    | name:string     |          |
| UserGroup| user_id:integer  | group_id:integer |

## コマンド/コード
手順

- rails g modelでマイグレーションファイルとモデルファイルを生成
- 上をモデル数分（今回はuser、group、user_groupの３回）繰り返す
- db:migrateをしてマイグレーションファイルの反映
- モデルファイルにアソシエーションを記述する

### 1. マイグレーションファイルとモデルファイルの作成

```terminal:terminal
bundle exec rails g model User name:string
```
これを実行することで以下のようなマイグレーションファイルが生成されます。

```ruby:db/migrate/create_user.rb
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :name

      t.timestamps
    end
  end
end
```
これを作成するモデルごとに行います。
ちなみにuser_groupのマイグレーションファイルは以下のようになります。

```ruby:db/migrate/create_user_group.rb
class CreateUserGroups < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.integer :user_id
      t.integer :group_id

      t.timestamps
    end
  end
end
```
###マイグレーションファイルの反映
必要なモデルの数だけのマイグレーションファイルが作成できたら以下のコードを走らせて、反映します。

```terminal:terminal
bundle exec rake db:migrate
```

### モデルファイルにアソシエーションを記述する
まずはuserのモデルファイルuser.rbを以下のように書きます。

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :user_groups
  has_many :groups, through: :user_groups
end
```
同様にgroupのモデルファイルも書きます。
そして、中間モデルであるuser_groupのモデルファイルには以下のように書きます。

```ruby:app/models/user_group.rb
class OptionReservation < ApplicationRecord
  belongs_to :user
  belongs_to :group
end
```

これで`rails c`でコンソールを立ち上げて、それぞれのモデルにデータを入力したのちに

```ruby:terminal
User.find(n).groups
あるいは
@user = User.find(n)
@user.groups
```
などと入力するとuserと紐づいたgroupが引き出せます。

# 注意事項
ここを書くためにここまで書いてきた節まであります（笑）
## HasManyThroughOrderError
モデルファイルを以下のように書くと`HasManyThroughOrderError`が起きます。

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :groups, through: :user_groups
  has_many :user_groups
end
```

正しくはこうです。

```ruby:app/models/user.rb
class User < ApplicationRecord
  has_many :user_groups
  has_many :groups, through: :user_groups
end
```

違いは`has_many: groups, through: :user_groups`が先にあるか、`has_many: user_groups`が先にあるかの違いだけです。これはgroup.rbでも同じことが起きます。
私はこれを知らずにうまくアソシエーションを作れないでいました。
当たり前なのかもしれませんが、私にとっては驚きだったので、これで少しでも同じ誤ちを犯す人が少なくなればと思います。

## dependent: :delete_all
groupを削除するときにuser_groupも削除されるようにする場合は以下のように書きます。

```ruby:app/models/group.rb
class User < ApplicationRecord
  has_many :user_groups, dependent: :delete_all
  has_many :users, through: :user_groups
end
```
`has_many :user_groups`の後ろに`dependent: :delete_all`を書き加えるだけです。


こんなサイトを作っています
ポケモン情報サイト[エイパムのしっぽ](http://aipom-tail.jp)
How we created our app in React Native

This article is about the creation of our app in react native. Previously we only had the [website and blog](https://www.krishnakutumb.com/blog/).
##Why we chose react native?
React native is a JavaScript framework which can compile the code into platform specific native one. At first we wished to go for Java and develop our app in android studio but we had little knowledge of mobile development. We are basically web developers and this app was our first mobile development opportunity. We searched for different options and found react native to be the most appropriate. 

React native is cool because you can compile it to get both iOS and Android app from almost similar code. There are some platform specific features but overall its quite easy to work on.

##Which app we created?
Our app name is [Krishna Kutumb](https://play.google.com/store/apps/details?id=com.krishnakutumb.krishnakutumb). It's a social devotional networks of India. We share all kinds of religious, spiritual, yoga and ayurveda related content there. People can also share posts, chat, ask questions, read stories, listen music etc. We also have a blog for that.
 
![Krishna Kutumb App](https://lh3.googleusercontent.com/7Txzmgt1IBye2e2XQFSwHrGEYXazopJcchTkpSzAe4VwWt_sNJ_D9aVl4eFBqdCY4WvT=h900)

##Packages used in our app
We have used several react-native packages. Some of them are -  
1. **react-native-device-info**
2. **react-native-fbsdk**
3. **react-native-fetch-blob**
4. **react-native-htmlview**
5. **react-native-image-crop-picker**
6. **react-native-navigation**
7. **react-native-onesignal**
8. **react-native-restart**
9. **react-native-share**
10. **react-native-socket.io-client**

You can read extensive article on our app here - [How we created our social community app in react native](https://l.facebook.com/l.php?u=https%3A%2F%2Fwww.dunebook.com%2Fkrishna-kutumb-react-native-app%2F&h=ATPS78en5zE8sUeVYUDXxIak9Rj_i_DHAjFrCV4kLMjFKq5OJoJ_4WYajTJbk6okejh_7NEY4M7JOYJx3VnHdI-XWE5PFAJtHiWblgn5bGvhCQfQ1720tQ)
実機ビルド時にno suitable image foundでコケたときの対処法

# はじめに
QAさんとやりとりをしていてテストをしてもらう際に何故か実機に入れられない問題が発生したのでその時の対処法を記載しておきます

## 原因
おそらく証明書

## 状況
- 実機だとビルドに成功するがスプラッシュ画像で下記のような状態で止まってしまう
- シュミレーターでは問題なく起動できるし使える
- Alamofireはcarthageで管理しているライブラリだからこれがあやしい？
- 自分と先輩たちのPCだと問題なく実機ビルドできるがこの端末だけ実機ビルドができない

<img width="1512" alt="スクリーンショット 2018-03-26 10.39.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/176479/64274cef-eaf9-7a2b-edbf-313e8a743e5b.png">

### 表示されるエラー内容
```
dyld: Library not loaded: @rpath/...
Referenced from: /private/var/mobile/Containers/Bundle/Application/...
Reason: no suitable image found. Did find:
/private/var/mobile...
```

## やったこと
調べてみると色々原因があるらしく一つづつやってみた

### Carthageが原因？
carthageのcacheを消してみたがうまくいかず
また一度プロジェクトファイルまるごと消してgitcloneからビルドまでやり直してみたもののうまくいかなかった
### WWDR有効期限切れが原因?
Apple Worldwide Developer Relations Certification Authorityという証明書らしい
[Apple PKI](https://www.apple.com/certificateauthority/)
ここで期限が長いものを選んでダウンロードしてKeyChainにいれてみたもののうまくいかない

### Derived Data(中間データ)を削除する
上部メニュー > [File] > [Workspace Settings…]内のDerivedDateにパスが書いてあります
コマンドで消すなら
```
rm -rf /Users/（ユーザー名）/Library/Developer/Xcode/DerivedData
```
これでもうまく行きませんでした
### プロジェクトをクリーンしてみる
product -> clean

### keychainから全ての証明書を削除
初めて知ったのですが削除してもXcodeがなんとか証明書を用意してくれることを発見しました
それでも再び実機ビルドしてもうまくいかず

### 登録しているappleのアカウントを削除する
preferences->Accountsのなかの左したの−ボタンで削除できます
### 端末再起動
### Xcodeのappleアカウントログイン
ここで再び実機ビルドをしてもうまくいかず
### 証明書をrevokeして再度証明書をつくって登録する
TARGETSの項目のGeneralタブ内のSigningで証明書がないと言われるはずなので、その時に表示されるrevokeボタンを押す

下記を参照して証明書を作りました
[よく分かる！iOS アプリ開発に必要な証明書ファイルの作成方法 | アドカレ2013 : SP #4](https://dev.classmethod.jp/smartphone/ios-certificates/)

これをやってもやはり実機ビルドができずに困りました・・・

### 何度かXcode再起動、ビルドのし直し、キャッシュの削除、clean、appleアカウントの切替えをやる
突然何故がビルドできるように
わけがわからない・・・・・

おそらく原因は証明書だと思われるので誰かの助けになれば幸いです



## 参考文献
[no suitable image found.の対処](https://qiita.com/gki/items/3607e0fe0c83d1c64dc4)
[Xcode 9.2 (9C40b) refuses to code sign. I am dead in the water here.](https://forums.developer.apple.com/thread/93615)
[XCode9: code signing blocked mmap() while running on device
](https://stackoverflow.com/questions/46447779/xcode9-code-signing-blocked-mmap-while-running-on-device/47324398#47324398)["code signing blocked mmap()" on iOS Device](https://egeek.me/2017/10/21/code-signing-blocked-mmap-on-ios-device/)
railsのfile_fieldで画像クリックによりアップロード

# やりたいこと
標準の`file_field`がダサいのでどうにかしてデザインを変えたい。
今回はユーザの画像登録を想定しているため、設定済み画像をクリックしたらそのままファイル選択に移るという流れを実装したい。

# 実装
これを任意の`form`ループの中に入れる。

```erb
<%= image_tag user.image, onClick:"$('#upfile').click()" %>
<%= form.file_field :image, style:"display:none;", id:"upfile"%>
```
`onClick`を指定することで対応するidの動作をその部分のクリックで行うことができる。
`file_field`では`display:none`を指定して表示をしないようにしている。

# あとがき
色々調べていたらこの形に辿り着いたのですが、`file_field`のデザインはなかなかややこしいですね...
React Native for WebをElectronで動かす

[前回（React NativeをExpo無しで始めて、React Native for Webも動かすまで - Qiita）](https://qiita.com/noboru_i/items/d487219b8a6a9b90714e)は、React NativeでiOS/Androidが動作し、React Native for Webでブラウザ上での動作まで確認できました。

今回は、それをElectron上で動かし、デスクトップアプリ化してみようと思います。

## 環境

前回の環境から少しアップデートしています。

macOS 10.13.3
Node.js 8.10.0

react 16.2.0
react-native 0.54.2
react-native-web 0.5.3

そこに今回、書きを追加します。

react-native-electron 0.4.2
electron 1.8.4
webpack-serve 0.2.0

実際には、下記を実行しました。

```bash
yarn add react-native-electron
yarn add -D electron
yarn add -D webpack-serve
```

## Electron動作用のファイルを準備する

https://github.com/PaulLeCam/react-native-electron/tree/master/example にあるファイルを参考に、ファイルを配置していきます。

今回は、前回用意した `web` ディレクトリと並列に `electron` ディレクトリを作成し、その中に置いていきます。

### electron/webpack.config.js

https://github.com/PaulLeCam/react-native-electron/blob/master/example/webpack.config.js をコピーします。

そのままだと、

> Module not found: Error: Can't resolve 'react-native'

というエラーが出てしまうので、READMEに記載してあった https://github.com/gh-viewer/client/blob/master/webpack.config.js を参考に、
`'react-native': 'react-native-electron'` に変更しました。

### electron/app/renderer.js

続いて、上記のwebpackの設定で出てきた `renderer.js` を作成します。

こちらも、 https://github.com/PaulLeCam/react-native-electron/blob/master/example/app/renderer.js をコピーします。

`App` の位置が違っているので、
2箇所ある `./App` を `../../src/App` に変更しました。

### electron/app/main.js

続いて、Electron実行時のentry pointとなるjsファイルです。

https://github.com/PaulLeCam/react-native-electron/blob/master/example/app/main.js をコピーします。

こちらは、このままでも問題なかったのですが、
https://electronjs.org/docs/tutorial/first-app にある、Electron公式チュートリアルを参考に、

```js
const path = require('path');
const url = require('url');
...
  win.loadURL(
    url.format({
      pathname: path.join(__dirname, 'index.html'),
      protocol: 'file:',
      slashes: true
    })
  );
```

のように書き換えてみたり、 `win.webContents.openDevTools();` を追加してみました。

### electron/app/index.html

実際に読み込むhtmlファイルです。

https://github.com/PaulLeCam/react-native-electron/blob/master/example/app/index.html をコピーして、そのまま利用しました。

### package.json

ルートにある `package.json` に、起動用のスクリプトを追加しました。

```json
  "scripts": {
    "start:electron:server": "webpack-serve ./electron/webpack.config.js",
    "start:electron:client": "electron ./electron/app/main.js",
  },
```

## 起動してみる

まずは、 `bundle.js` を配信するためのサーバを立ち上げます。

```
yarn start:electron:server
```

この状態で、 http://localhost:7000/bundle.js にアクセスすると、コンパイルされたjsファイルが確認できました。

続いて、Electronアプリを起動します。上記のサーバは立ち上げたまま、別のウインドウを用意して、

```
yarn start:electron:client
```

を実行します。
すると、Dev Toolsとともに、作成したアプリが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/8708/ccd7b282-17b6-2b82-f63e-42d0cbcd6ffb.png)

`src/App.js`にある文字列を書き換えて保存すると、サーバの方が自動的に再コンパイルを行いました。
ただ、Electronの方をhot reloadさせようとすると、別のパッケージが必要なようなので、今回は見送ります。
現状でも、Electronのアプリにて Cmd+rを押すことで、書き換え後の文字列が表示されました。

これで、React Nativeで作成したアプリを、デスクトップアプリとして動かすこともできそうです。

今回の変更点は、 https://github.com/noboru-i/Memo2GitHub/pull/1/files にあります。

## 参考

https://github.com/PaulLeCam/react-native-electron のサンプルコード
https://github.com/gh-viewer/client のwebpack.config.jsなどの設定
https://electronjs.org/docs/tutorial/first-app
【Unity/Git】Unityでチーム開発をする(2) GitFlowでブランチを管理する


# 前回のおさらい
[【Unity/Git】Unityでチーム開発をする(1) 概要と初期設定編](https://qiita.com/Sansuusetto/items/9d6965e688fb0dbf9d8b)

上記エントリーで、Unity+Gitでチーム開発する際の初期設定まで終えました。
**残念なことに、ツールを導入しただけではチーム開発が上手くいかず、遠からずリポジトリを消してやり直したくなることでしょう…。**
チーム開発において有用なブランチモデルを学び、幸せになりましょう。

# ブランチモデルとは
これまで先人たちがGitを利用していく中で、たくさんの地雷を踏みぬいた結果、チーム開発におけるGit上でのブランチ管理手法を編み出してくれています。
有名どころとして、以下のようなモデルがありますが、今回は私が利用していたGitFlowについて記載します。
(私見ですが、恐らく一番有名なブランチモデルだと思います)

* GitFlow
* GitHubFlow
* GitLabFlow

# ブランチモデルを適用しない例
はい、皆さん。ご自分のGitブランチを思い出してください。
下記の様なブランチ構成になっていませんか？
**チーム開発で下記の様なブランチのまま進めると地獄を見ます。**

![GitNG.PNG](https://qiita-image-store.s3.amazonaws.com/0/216921/0eabe45f-31e7-d81d-c838-82858c70f734.png)

上記の様なmaster1本で開発を進めるにあたっては下記の問題があります。

* 開発途中の(正常に動かない)コミットをPushできない
    * Pushした場合、ブランチは1本なので、正常に動かないコードをPullしたメンバー全員に影響が及びます
* タスクの開始～終了コミットが追えない
    * タスクの開始～終了をコミットメッセージから追わなければならないので、コミットメッセージの入力ルールを設けていて尚且つ、抜けが無いことを保証しなければならず、実質的に無理。また、間に関係のないコミットが挟まっているので、特定のタスクで障害が混入した場合に、単純に差分を出すことができなくなります

他にも沢山あるとは思いますが、パッと思いつくだけでも上記の様にクリティカルな問題が発生することがわかります。

# GitFlowを用いたブランチ管理
## GitFlowに登場するブランチ
GitFlowでは、下記表のブランチが登場します。
とりあえず、最低限master, develop, featureの3つだけは覚えておいてください。


| ブランチ名 | 説明 |
|:----------|:----------|
| master | 正式にリリースする成果物をコミットするブランチ  |
| hotfix | リリースした成果物(master)に緊急の不具合修正が必要となった場合にコミットするブランチ(正直使ったことない) |
| releas | リリース準備に使用するブランチ  |
| develop | 開発ブランチ。各featureの成果物を集約する |
| feature | 各タスクの開発ブランチ。担当者が個々人で開発を進める際にコミットする  |

各ブランチの関係は以下のようになっています。
![GitFlowRelation.PNG](https://qiita-image-store.s3.amazonaws.com/0/216921/eb618efa-8b16-0a1f-68ea-bfb7f270f5ce.png)


## GitFlowを用いたブランチ管理の例

開発がすんなり行くと、以下のようなブランチ構成になります。
各担当者はFeatureブランチの中でそれぞれ開発を進めることができ、タスクがブランチと紐づくため、非常に管理がしやすくなります。

![GitFlow.png](https://qiita-image-store.s3.amazonaws.com/0/216921/66415b35-2206-a7ff-ec42-307c6d1d8782.png)

## featureブランチの粒度
1feature=1タスクにすると良いでしょう。1タスクって何かというとWBSの最下層とイコールです。
更に言うと、チケット駆動開発におけるチケット=1featureにすると、PJ管理上とても良いと思いますが、まだ実践したことがありません。
SourceTreeとJIRAで連携していい感じにチケット駆動ができるという情報を見た覚えがあるので、そのうちやりたい。

## コミットメッセージの規則(18/03/27追記)
「GitFlowを用いたブランチ管理の例」で書いた図には、敢えて良くないコミットメッセージを書きました。
「Score機能を作成」等です。
これでは、Score機能の作成中なのか、作成完了なのか判然としません。
**ステータスを表さずに体言止めを使うな**ということです。

そこで、前職ではコミットメッセージの規則として以下を設けていました。
「(○○の)○○を○○中 or 完了」

上記に従うと例えばこんな感じになります。
「Score機能のカウントロジックを作成中」

このようにすることで、多少はどういった意図のコミットか分かるようになるので、チーム内でどのようなルールとするか決めておくとよいでしょう。

# SourceTree上でGitFlowを使う
SourceTreeには、GitFlowでブランチを管理するための機能が標準で搭載されています。
下記画像の通り、進めることでdevelopとfeatureブランチが生成され、GitFlow使うための補助機能が使えるようになります。

![GitFlow1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216921/6cf3ec72-0937-cee4-b486-2692bc22c517.png)

![GitFlowSourcetree1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216921/4a8741ce-ccb7-7c13-d8e8-01043dc92de6.png)

![GitFlowSourcetree2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216921/e5042ab3-44e8-27f7-1dc0-a60d65a4d401.png)

# 次回
長くなったので、一旦ここまで。
次回は「コンフリクトさせないためのシーン設計」を予定しています。
学校のカフェテリアのためにメニューソフトを作ったお話

#はじめに
こんばんわ、ダブと申します
今回は自分の学校のために作ったメニューソフトについて書きます。
###学校にカフェテリアができた
最近、（といっても数年前ですが）学校にカフェテリアができました、カフェテリアでは日替わりのメニューを毎日3つ提供しています。

カフェテリア内には大きなモニター2x2で構成されたでっかい画面があります。
最初の一年間はそこにメニューの画像が表示されていました（日替わりなので、必要だった）。
しかし、二年目以降ソフトが動かなくなり、更新されなくなってしまった...
なので生徒は、文字のみでメニューを選んでいました。

まぁ、それで全然問題ないのです。が、4枚のモニタが真っ黒のままってのはいただけないし、やはり見えた方がいいよね、ってことでメニューソフト開発することにしました。

完全におもちゃになっている図
![CvhFCCkUEAE4xv2_censored (1).jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/f8876730-fe5e-a6d8-67ff-d436e451d8c5.jpeg)



#とりあえずデザインから
見栄えを重視するってことは最初に決めていたので、windowsform は候補から外れました。
当時はC#しか書けなかったのでUnityで開発することにしました。
###はじめのデザイン
![C4TFZX2UEAE-M4r_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/413c8880-d045-be36-25c3-223b87f7eeb7.jpeg)


見開きの本をイメージして作ったのですが、２つしか同時に表示できません。（メニューは３つあるのに）

ちなみに、メニューデータはJsonで記述されています、これは最初から最後まで変わりませんでした。
この時はJsonファイルを読み込んでいないのでエラーが出ています

###次のデザイン
![C8j-NvpUMAEFmiq.jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/67a78bbd-2152-53e0-7f50-29d7966149df.jpeg)
上のタブを一定間隔で切り替えることによって、いくらでも表示できるようにしよう、ってわけです。
最終的にこのデザインで作業を進めることにしました。

###最終形態
![C8zBVMpUQAALGKN_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/0baac446-1fce-4df6-efb9-6e935239b7de.jpeg)

だいぶメニューっぽくなってきました。
この時点でだいぶコーディングが終わっていて、メニューデータも読み込まれている状態です。
#データを同期する
このメニューソフトにはメニューを設定する機能があり、写真撮影もできます。
が、こんなでっかいPCからWEBカメラ引っ張ってきてパシャパシャするのはアレなんで
タブレットでメニューを編集して、本器に送信できればいいな、と考えました。
###はじめにやったこと
サーバーとかがさっぱりわからなかったので某ファイル同期サービスをインストールしてデータを共有する、というごり押しの戦法をとっていました。(この状態で１年くらい運用していた）

まぁ全然スマートじゃないわけで、次の手に出ます。

###APIをやろうず
せっかく自宅にLinuxマシンあるのだからそれ使おうぜってことでNode.jsでREST APIを構築
出来ることはとてもシンプルです、メニュー情報の取得、設定、他にも端末のメニュー情報が最新か確かめるためのIDを管理しています。

#一応完成
ってことで完成です。
![ezgif-3-54969af3be.gif](https://qiita-image-store.s3.amazonaws.com/0/174160/59a83b33-dc6e-50e2-3442-98702ee29b3d.gif)

上の方に張った写真のモニタでこれが動いています、あとタブレットでも...

#WEB GUI実装
ブラウザから設定できるようにしました。便利。

通常表示
![Screenshot-2018-7-5 ラボメニューWEB_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/3fb16c50-5b83-c535-5a2f-af2ecf81669b.jpeg)

編集用ページ
![Screenshot-2018-7-5 ラボメニューWEB Admin_censored.jpg](https://qiita-image-store.s3.amazonaws.com/0/174160/6ec48a76-74a1-2173-66ae-b36c80038b3a.jpeg)

#おわりに
作っててとても楽しかったです、ちなみに報酬としてカレーをおごってもらいました。同情するならマネーを(ry
Laravelのマイグレーションで外部制約する時の注意点

# Laravelのマイグレーションで外部制約する時の注意点

Laravelのマイグレーションで外部制約つけようとしたら、
えー。。。ってなったので備忘録。

```php
  Schema::create('hoges', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->foreign('user_id')
      ->references('id')
      ->on('users');
  });
```

よし、実行だ！

```sql
  SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
  (SQL: alter table `hoges` add constraint `hoges_user_id_foreign` foreign key (`user_id`) references `users` (`id`))
```

えー。。。

## 原因と対応
### その１.参照する側と参照される側のデータの型が違う  
  大抵の場合、親側は`increments('id')`とかだと思います。
  この時、子側が`integer('user_id')`などとするとエラーになる。

  `increments`で生成されるのは`INT(10) UNSIGNED`なのです。  
  なので、子側も、

  ```php
  unsignedInteger('user_id');
  ```

  もしくは

  ```php
  integer('user_id')->unsigned()
  ```
  とすれば通ります。  

### その２.参照するテーブルやカラムがまだない
  `php artisan make:migration`でマイグレーションファイルをポコポコ作成していざ実行。はい、エラー。
  今回はこのパターンでした。
  ポコポコ作ることに原因があるのではなく、作成順は大丈夫ですか？という話。

  ```php
  Schema::create('hoges', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->foreign('user_id')
      ->references('id')
      ->on('users');
  });
  ```
  先ほどのこの例で言うと、`users`テーブルよりも`hoges`テーブルのマイグレーションが先に実行をされると、
  当然ながら`users`テーブルはないのでエラーになります。

  マイグレーションの実行はプレフィックスの日付が古いものから順に実行されます。
  プレフィックスの日付を意識するのは何だかスマートじゃないぞ！
  と思い、今回はテーブルの作成とテーブルの紐付けを別にして管理することにしました。  

  作成するファイルは普通に作成して、

  ```php:2018_03_26_235054_create_hoges_table
  class CreateHogesTable extends Migration {
    public function up() {
      Schema::create('hoges', function (Blueprint $table) {
        $table->unsignedInteger('user_id');
      });
    }
  }
  ```

  紐付けするファイルは作成後に、必ず最後に実行されるようにリネーム。

  ```php:9999_03_26_235054_relate_tables.php
  class RelateTables extends Migration {
    public function up() {
      Schema::table('hoges', function (Blueprint $table) {
        $table->foreign('user_id')
          ->references('id')
          ->on('users');
      });
    }
  }
  ```

  おしまい。結局プレフィックス頼みですね。。。
  （より良い方法がありましたらご教授願います。）
Visual Studioでクラスのコードからクラス図を作る

# 概要
Visual Studioでクラス図を作ることができるようなので導入方法とドキュメントに貼付する方法をまとめてみた。


# 1.デザイナーの導入

1. VisualStudioの[個別コンポーネント]にて[クラスデザイナー]をチェックし、[変更]をクリック。
![Screenshot_NoName_2018-3-26_23-54-45_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/cbebfcf3-505f-6062-377b-3a0deb5b4553.png)

# 2.クラス ダイアグラムを追加する

1. クラス図を追加したいクラスを選択し、[右クリック]>[クラス ダイアグラムで表示]を選択。
![Screenshot_NoName_2018-3-27_0-1-15_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/d59cdaba-5d96-5322-fe18-9dd8817d4258.png)

2. 選択したクラスの「クラスダイアグラム」が表示される。
![Screenshot_NoName_2018-3-27_0-2-25_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/80f3603e-a3eb-4117-8a28-a022a563425d.png)

3. クラスダイアグラムを選択し、[右クリック]>[イメージのコピー]を選択。
![Screenshot_NoName_2018-3-27_0-10-58_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/aa023df3-b4f1-5ac9-20d4-917ee3cca4ae.png)

4. Excelに貼付するとコピーしたイメージが図形として貼付される。
![Screenshot_NoName_2018-3-27_0-11-7_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/184939/32f6a662-f37a-7116-f2f9-8862cc795bf1.png)


# 所感
クラスをどのように変更しているのか、視覚的に確認できるのは便利に思えた。
普段全く触っていないツールなのでもっと理解を深めたい。


# 参考

+ Visual Studio2017でクラスダイアグラムが作れない via ヤスダ式仕事ブログ さん
http://blog.yuizi.com/2017/03/visual-studio2017.html

+ クラス ダイアグラムの使用 (クラス デザイナー) via Microsoft ~ Visual Studio Document
https://docs.microsoft.com/ja-jp/visualstudio/ide/class-designer/working-with-class-diagrams
ElasticBeanstalkのRuby2.5でRailsのbundle installに失敗した話

# 結論

ffiのビルドに必要なパッケージがインストールされてなかった

足りないパッケージは`.ebextensions/xxx.config`に

```yaml
packages:
    yum:
        automake: []
        autoconf: []
        libtool: []
```

みたいに設定書けばインストールできる

# 経緯

EBのRuby2.5がいつの間にかリリースされてたからRuby2.4から切り替えてみようと新しい環境作ったけど、eb deployが失敗する

# 調査

ログを見てみると

```
An error occurred while installing ffi (1.9.21), and Bundler cannot continue.
```

ビルドしてるログを見るとどうやらautoreconfがないよって怒られてる

で、autoconfをインストールしてもっかい試してみると今度はaclocalがないって怒られる

なので次はautomakeをインストールするとlibtoolのマクロがないって怒られる

libtoolもインストールするとようやく成功
facebookのAI prophetを使った時系列データの将来予測

# FacebookのProphetとは
Prophetは、FacebookのCore Data Scienceチームが公開したオープンソースソフトウェアです。時系列データを予測するために、RまたはPythonで利用可能なフレームワークです。特に毎年、毎週ごとの周期性や、休日などの影響を加味したモデルである点が特徴となります。
https://facebook.github.io/prophet/

別のサイトの情報によると、Pythonの機械学習フレームワークのScikit learnと使い方が似ているそうです。

## Prophetの特徴
1. 正確で早い
2. 全自動
3. チューニング可能な予測
4. RまたはPythonで使用可能

# インストール方法
Windows 10 64bitの場合について、説明します。事前に、Prophetが依存するいくつかのライブラリをインストールする必要があります。

まずは、Anacondaをインストールします。(必須ではありませんが、Pythonと、主要なライブラリがインストールされるので、楽です)
Anacondaをインストールしないバイは、個別に、下記ライブラリをインストールする必要があります。

- numpy
- cython
- matplotlib

Anacondaに含まれていないものとして、以下をインストールします。

- PyStan
- C++ Compiler
- libpython
- mingw-w64

まずは、Pystanのインストール。Anaconda Promptから実行します。

```Console

> pip install pystan

```

次に、こちらからC++ Compilerをインストール
http://landinghub.visualstudio.com/visual-cpp-build-tools

そして、libpythonとmingw-w64をインストールします。

```Console

> conda install libpython
> conda install -c msys2 m2w64-toolchain

```

これで、Prophetが依存するライブラリのインストールが完了です。
ようやくProphetをインストールします。pipでもインストールできるそうですが、僕の環境ではうまく行かなかったので、下記のcondaコマンドでインストールしました。

```Console

> conda install -c conda-forge fbprophet

```

# Prophetの動作確認

ちゃんとインストールされたか、確認するために、Quick Startのプログラムを動かしてみます。

### CSVファイルの入手

下記サイトから分析データをダウンロードします。Wikipediaページの日次訪問者数を分析します。
example_wp_peyton_manning.csv を使用します。

https://github.com/facebook/prophet/tree/master/examples

### ソースコード

チュートリアルに書いてあるとおりです。グラフは、コンソールで実行しても表示されなかったので、png形式で保存するように書き換えました。

```Python:QuickStart.py

import pandas as pd
import numpy as np
from fbprophet import Prophet

df = pd.read_csv('example_wp_peyton_manning.csv')
# print(df.head())
df['y'] = np.log(df['y'])

m = Prophet()
m.fit(df)

future = m.make_future_dataframe(periods=365)
future.tail()

forecast = m.predict(future)
forecast[['ds', 'yhat', 'yhat_lower', 'yhat_upper']].tail()

m.plot(forecast).savefig('1.png');

m.plot_components(forecast).savefig('2.png');

```

こんな短いコードで動くんですね。

### 予測結果
うまく動いていますね。黒点が過去の実績、青線が将来の予測データのようです。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/80231/6ac59b98-5d80-b438-5b3e-87dd167ec02b.png)

年毎、週毎の周期性と、トレンドに分けて要素ごとの分析結果を分けて表示することができます。これは面白いですね。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/80231/d8c8d381-df77-c3e2-da3a-8988a736bfbe.png)

# 今後にやりたいこと

facebookのProphetはまだまだ細かいチューニングができるそうで、いろいろ試してみたいなと思います。
【CSS】ハンバーガーメニューのアニメーション

>[参考元](https://codepen.io/KPCodes/pen/Ypwrdx/"CSSでハンバーガーメニューのアニメーション")

```html:menu.html
<link href="css/style.css" rel="stylesheet" type="text/css">
<div class="burger_menu mb">
  <p>menu</p>
  <input type="checkbox" id="menu37">
  <label for="menu37">
    <div></div>
    <div></div>
    <div></div>
  </label>
</div>
```

```css:style.css
#menu37{
  display: none;
}

.burger_menu label {
  position: relative;
  width: 50px;
  height: 40px;
  display: inline-block;
  cursor: pointer;
  -webkit-transition: all 0.5s;
  transition: all 0.5s;
  text-align: left;
}

.burger_menu div,
.burger_menu div:before,
.burger_menu div:after {
  background: #000;
  position: absolute;
  height: 5px;
  width: 44px;
  left: 3px;
  border-radius: 4px;
  -webkit-transition: all 0.5s;
  transition: all 0.5s;
}

.burger_menu label div:first-child {
  top: 7px;
}
.burger_menu label div:nth-child(2) {
  top: 17px;
}
.burger_menu label div:nth-child(3) {
  top: 27px;
}

#menu37 + label div {
  -webkit-transition: top .15s .17s, -webkit-transform .12s .033s;
  transition: top .15s .17s, -webkit-transform .12s .033s;
  transition: top .15s .17s, transform .12s .033s;
  transition: top .15s .17s, transform .12s .033s, -webkit-transform .12s .033s;
}
#menu37 + label div:nth-child(3) {
  -webkit-transition: top .15s .17s, -webkit-transform .17s;
  transition: top .15s .17s, -webkit-transform .17s;
  transition: top .15s .17s, transform .17s;
  transition: top .15s .17s, transform .17s, -webkit-transform .17s;
}

#menu37:checked + label div {
  top: 17px;
  -webkit-transform: rotate(135deg);
          transform: rotate(135deg);
  -webkit-transition: top .1s, -webkit-transform .12s .1s;
  transition: top .1s, -webkit-transform .12s .1s;
  transition: top .1s, transform .12s .1s;
  transition: top .1s, transform .12s .1s, -webkit-transform .12s .1s;
}
#menu37:checked + label div:nth-child(3) {
  -webkit-transform: rotate(225deg);
          transform: rotate(225deg);
  -webkit-transition: top .1s, -webkit-transform .17s .1s;
  transition: top .1s, -webkit-transform .17s .1s;
  transition: top .1s, transform .17s .1s;
  transition: top .1s, transform .17s .1s, -webkit-transform .17s .1s;
}
```
ectoのchangesetを学ぶ

# まとめ
- validateはクエリ実行前のチェック、constraintは実行後のチェック
- validate,constraintに書かれている知識ならectoはエラーを返すが、それ以外は例外になる
- unique_constraintはindexの名前が規則通りじゃないとエラーにしてくれない
  - 規則から外れる場合はnameオプションで指定
- [primaryキーのconstraintnの書き方はこちら](https://qiita.com/toku_bass/items/9f1ec3b1bc07b78facb8)

# 実験

## 普通にinsertする

```sql
CREATE TABLE `people` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `first_name` varchar(255) NOT NULL,
  `last_name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `people_first_name_index` (`first_name`),
  UNIQUE KEY `last_name_index` (`last_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
```

```exs
defmodule Friends.Person do
  use Ecto.Schema

  schema "people" do
    field :first_name, :string
    field :last_name,  :string
    field :age,        :integer
  end
end
```

```exs
iex(1)> {:ok, row} = Friends.Repo.insert(%Friends.Person{})

01:32:25.191 [debug] QUERY OK db=2.1ms queue=5.7ms
INSERT INTO `people` () VALUES () []
{:ok,
 %Friends.Person{__meta__: #Ecto.Schema.Metadata<:loaded, "people">, age: nil,
   first_name: nil, id: 37, last_name: nil}}
```

## validation

castはpersonとparamsの指定のキーワードを比較して差分だけchangesetにする。
validate_requiredはnilと空文字の禁止。デフォでtrimもされるので注意。

```exs
def changeset(person, params \\ %{}) do
  person
  |> Ecto.Changeset.cast(params, [:first_name, :last_name, :age])
  |> Ecto.Changeset.validate_required([:first_name, :last_name])
end
```
first_name,last_nameが空のchangesetを作成

```exs
iex(1)> iex(1)> changeset = Friends.Person.changeset(%Friends.Person{})
#Ecto.Changeset<action: nil, changes: %{},
 errors: [first_name: {"can't be blank", [validation: :required]},
   last_name: {"can't be blank", [validation: :required]}],
 data: #Friends.Person<>, valid?: false>
```

- changeset.valid?はfalse
    - そのままinsertするとクエリ実行前にエラー
- validate_requiredが存在しないとクエリが実行される
    - schemaがNOT NULLなので例外発生

```exs
iex(2)> {:error, _changest} = Friends.Repo.insert(changeset)
{:error,
 #Ecto.Changeset<action: :insert, changes: %{},
   errors: [first_name: {"can't be blank", [validation: :required]},
    last_name: {"can't be blank", [validation: :required]}],
   data: #Friends.Person<>, valid?: false>}
```

## constraint

- クエリ実行時にDB側でエラーになると、Elixirでは例外が発生するが、事前にconstraintで定義していた事項は例外ではなくエラーにすることができる。
- unique_constraintではunique indexの名前をectoが知っている必要があるので、nameオプションで指定
    - デフォルトnameは`#{table名}_#{field名}_index`

```exs
def changeset(person, params \\ %{}) do
  person
  |> Ecto.Changeset.cast(params, [:first_name, :last_name, :age])
  |> Ecto.Changeset.validate_required([:first_name, :last_name])
  |> Ecto.Changeset.unique_constraint(:first_name)
  |> Ecto.Changeset.unique_constraint(:last_name, name: "last_name_index")
end
```

ecto経由のmigrationでDBに追加したindexならデフォルトで`#{table名}_#{field名}_index`という名前のindex名になっている

```exs
defmodule Friends.Repo.Migrations.AddIndexPeople do
  use Ecto.Migration

  def change do
    create unique_index(:people, [:first_name])
  end
end
```