OmniAICreator/Qiita-1.07M huggingface dataset:
Course 2 > Week 3 Hyperparameter tuning, Batch Normalization and Programming（Coursera Deep Learning Specialization 受講記録）

Coursera > [Deep Learning Specialization](https://www.coursera.org/specializations/deep-learning) > Course 2 : Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization >  **Week 3 Hyperparameter tuning, Batch Normalization and Programming** の受講記録。

#概要
Course 2 は3週分の講座から構成される。

1. [Week 1 Practical aspects of Deep Learning](https://qiita.com/onooooo/items/8a571a78605fce18be22)
2. [Week 2 Optimization algorithms](https://qiita.com/onooooo/items/fcb86624b837c734aa60)
3. [Week 3 Hyperparameter tuning, Batch Normalization and Programming Frameworks](https://qiita.com/onooooo/items/a648062b67893fd1b58f)


今回は Week 3 の受講記録。Batch Normalizationが登場。

---

#Hyperparameter tuning
##Tuning process
チューニングが大事なパラメータ

- 最も大事
    - α（学習率）
- その次に重要
    - β（Momentum項）　0.9が良いデフォルト値
    - ミニバッチサイズ
    - Hidden Layerのユニット数
- その次
    - レイヤー数
    - Learning Rate Decay
- あまりチューニングしない
    - Adamのパラメータ ： β1=0.9 , β2=0.999 , ε=10**-8

グリッドサーチはあまり使わない。ランダムサーチのほうが良い。fine sampling schemeというのも良い。

##Using an appropriate scale to pick hyperparameters
ハイパーパラメタを探索する際は適切なスケールを選択することが重要。

##Hyperparameters tuning in practice: Pandas vs. Caviar
ハイパーパラメータのチューニングには２つのアプローチがある。
１．少数のモデルにすこしずつ手を加えて育てていく
２．大量のモデルを同時並行でトレーニングする。いろんなパラメータを同時に試すことができる。
２はコンピュートリソースが潤沢にあるような場合に採用することができる。

#Batch Normalization

##Normalizing activations in a network
入力データの正規化だけでなく、各層のOUTPUT（つまり次の層へのINPUT）もそれぞれ正規化することでtrainingがスピードアップする、という考え方。正規化のタイミングは活性化関数を適用する前とするか後とするかで議論があるが、活性化関数の適用前に正規化することが多い。ただし隠れ層の入力は平均0と分散1がベストではない。γとβを使って分散をスケールし、平均をずらす。
`Ztilda = γ*Znorm + β`
γとβは BartchNorm における学習可能なパラメータ。

##Fitting Batch Norm into a neural network
Mini Batch + Batch Norm の実装。

##Why does Batch Norm work?
なぜBatch Normが機能するのか？の説明。
共変量シフト = covariate shift
Batch Norm は内部共変量シフトを抑制する。

(以下、参考になります)

- [Batch Normalization](http://joisino.hatenablog.com/entry/2017/07/09/210000)
- [[Survey]Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift](https://qiita.com/supersaiakujin/items/8a465ecb1dcbc7df8b02)
- [Deep LearningにおけるBatch Normalizationの理解メモと、実際にその効果を見てみる](https://qiita.com/cfiken/items/b477c7878828ebdb0387)

##Batch Norm at test time
ここまでミニバッチ単位で正規化する処理を見てきたが、１件ずつのデータを処理するテストフェーズではどうするのか？
→exponentially weighted average で近似化する

#Multi-class classification
##Softmax Regression
唐突にソフトマックス回帰

##Training a softmax classifier
softmax regression の training

#Introduction to programming frameworks
##Deep learning frameworks
Python と NumPY で頑張らなくても、 DeepLearning のフレームワークがいろいろある。
フレームワークを選ぶ上で重要なポイントは以下の通り。

- プログラミングの容易さ
- 実行速度（大量データのトレーニング速度）
- 真にオープンなフレームワークかどうか

単一の企業のコントロール下にあるのではなく、優れたガバナンスのもと、末永くオープンソースであり続けられるかどうか。

##TensorFlow
TensorFlowの導入。

#Programming assignment
##TensorFlow
TensorFlow Tutorial
スプレッドシートをJSONで取得する

# スプレッドシートをJSONで取得したい！
## まずスプレッドシートのIDを調べる
具体的には
1. 共有ボタンを押す
2. 出てきたウィンドウで共有可能なリンクを取得を押す
3. リンクを確認する
![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/c35e6d45-ae22-cf75-a2f5-4d055ad1bbcc.png)

{ここがIDです！}の部分がIDに当たるのでメモ帳などにコピペしておいてください。
https://docs.google.com/spreadsheets/d/{ここがIDです！}/edit?usp=sharing

なお、共有自体をする必要はないです。

## スプレッドシートを公開する
公開するのですが、先程の共有ではなく、下記のウェブに公開を選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/e7bf4e37-f194-59b7-caf7-f17d3953a50b.png)

すると下記のようなウィンドウが出ます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/196422/0eb55980-477f-15b6-e044-10d80f1bacb7.png)

そのまま問題なければ公開ボタンを押してください。(公開範囲を設定することもできます)
公開するとさっきと似たようなリンクが表示されますがスルーしてください。

## JSONで取得する
最後に、下記アドレスでアクセスします。
{ここがIDです！}の部分を調べたスプレッドシートのIDをにしてください。
https://spreadsheets.google.com/feeds/list/{ここがIDです！}/od6/public/values?alt=json

JSON形式で表示されれば成功です。
mac osX MySql サーバの文字コード設定（mysql5.6）

mac版のmysqlはインストーラのオプションが少なく
そのままでは、`chara-set-server` のコードが`latin1`になってしまう。

```
show variables like 'char%';
```
を投げればわかるのだが、自分としては、文字コードのたぐいはすべてutf8で統一したい。

my.cnfファイルの
`[mysql]`
の項目に
`default-character-set = utf8`
を追記するのがよろしい！！ということらしいので試してみると、mysqlが起動しない
(my.cnfファイルには少なくとも自分のユーザーの読み書き権限を与えないといじれない）

困ったもんですな、もう少し調べてみるとmysql5.6では
`character-set-server = utf8`
と書くのが正しいようだ。

今度は、mysqlが起動し

```
show variables like 'char%';
```
を投げると、`chara-set-server` のコードは`utf8`になっていた。
とりあえずこれでいく
ココで新たな疑問
###my.cnfの項目が少なすぎ
[client]やら[mysql]が、自分の環境にはなかった。→追加すればいいだけか？

###my.cnfの置き場って？
自分の環境では`/usr/local/mysql/`にある（正しくは`/mysql`はエイリアス）のだが
`/etc`にあるだとか`/etc/mysql`にあるだとか
そもそも、mysqlワークベンチで、option Fileを見てみると「ファイルが見つからん」と宣う

<i>このへんはもうチョット調べてみよう</i>
VS CODEでCSSのフォーマットをするまで

#①CSSのフォーマットとソートをしたい
[**CSScomb**](https://marketplace.visualstudio.com/items?itemName=mrmlnc.vscode-csscomb)という拡張機能によって自分の好きなフォーマットを作成、適用できる。



リンクから緑のInstallボタンを押すと下記のようなポップアップが出るのでContinueをクリック。

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/213748/52af1071-e894-508c-91a1-806953c7fc76.png)


#②VS CODEにCSScombをインストールする
VS CODEが起動して、Installをクリック。
画面は既にインストール済みなので、アンインストールの選択肢が出ている。
![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/213748/72b711d5-fb26-b36b-1186-013c2315aedf.png)


#③自分好みのフォーマットを作成する
[**CSScomb Build Config**](http://csscomb.com/config)を開き、自分好みのフォーマット形式を選択していく。全部で24問ある。基本的に2択か3択で、一番最後の選択肢はどっちでもいいよ、の意味になっている。
![無題3.png](https://qiita-image-store.s3.amazonaws.com/0/213748/8606108f-006f-5174-1aea-f3d995bcbecf.png)

#④作成したフォーマットを読み込む
完成したjsonファイルを下記パスにあるjsonファイルと置き換える。なお、元のものはバックアップをとっておくと良い。

```path:path
C:\Users\Minato\.vscode\extensions\mrmlnc.vscode-csscomb-5.2.2\node_modules\csscomb\config\csscomb.json
```




#⑤VS CODEで読み込むファイルを指定する
ファイル→基本設定→設定　から設定画面を開き、下記を追記する。
```
"csscomb.preset": "csscomb"
```

![無題aaa.png](https://qiita-image-store.s3.amazonaws.com/0/213748/71ac917a-e032-b8c6-faea-8c4675b7132f.png)

#⑥これで最後、フォーマットする
Ctrl + a などでキレイにしたいコードを選択し、F1で拡張機能の呼び出し画面を開く。
csscombなどと打つと選択肢に表示されるので、クリックして完成！
![無題ff.png](https://qiita-image-store.s3.amazonaws.com/0/213748/7f0b4a22-6e71-ea07-54c3-f60451cad51d.png)


#⑦おまけ
僕好みのフォーマットはこんな感じです。もし同じで良ければ、コードを貼っとくのでお使いください。
![無題aefa.png](https://qiita-image-store.s3.amazonaws.com/0/213748/b5867352-cf8f-758e-6a06-ba64360faf23.png)

```minato.json
{
    "remove-empty-rulesets": true,
    "always-semicolon": true,
    "color-case": "lower",
    "block-indent": "\t",
    "color-shorthand": false,
    "element-case": "lower",
    "eof-newline": true,
    "leading-zero": true,
    "quotes": "double",
    "sort-order-fallback": "abc",
    "space-before-colon": " ",
    "space-after-colon": " ",
    "space-before-combinator": " ",
    "space-after-combinator": " ",
    "space-between-declarations": "\n",
    "space-before-opening-brace": " ",
    "space-after-opening-brace": "\n",
    "space-after-selector-delimiter": " ",
    "space-before-selector-delimiter": " ",
    "space-before-closing-brace": "\n",
    "strip-spaces": true,
    "tab-size": true,
    "unitless-zero": true,
    "vendor-prefix-align": true
}
```
早速、SORACOM Lagoonで遊んでみた

# SORACOM Lagoonをいろいろいじってみた
7月4日に発表されたばかりのLagoonを触ってみた。

## やったこと
- おなじみWioLTEで温度、湿度をセンシング
- SORACOM Harvestに送信
- Lagoonで可視化！

## WioLTEで温度、湿度をセンシング
省略！！

## SORACOM Harvestに送信！
いつものWioLTEで会社の温度、湿度をHarvestに送る。

送った！！
![スクリーンショット 2018-07-04 23.17.03.png](https://qiita-image-store.s3.amazonaws.com/0/123239/6730d5be-17ec-b0e3-fc5b-406dde08259b.png)

## Lagoonで可視化
SORACOMにログインして。。。

Lagoon。。。？

どこなのさ？

。。。

ありました。


![スクリーンショット 2018-07-04 22.50.04.png](https://qiita-image-store.s3.amazonaws.com/0/123239/1aa03699-b8a5-68d6-1018-969c742e269e.png)

共通機能の下。
課金情報よりセキュリティよりエラーログよりデータ収集よりしたの一番下にこっそりありました。

まぁ、ベータですから。

んで、利用開始。

![スクリーンショット 2018-07-04 22.50.24.png](https://qiita-image-store.s3.amazonaws.com/0/123239/7859d62d-2051-44d3-6920-cda57356f1d1.png)

と、ちょっと待て。
このサービスいくらかかんだ？

で、ちょっと調べる。

[SORACOM Lagoon のご利用料金](https://soracom.jp/services/lagoon/price/)

![スクリーンショット 2018-07-04 23.12.36.png](https://qiita-image-store.s3.amazonaws.com/0/123239/0846bd31-4af5-b676-9d61-303f3cbd3d9e.png)

Makerプランなら980円/月か、まぁそのくらいなr。。。

![スクリーンショット 2018-07-04 23.13.59.png](https://qiita-image-store.s3.amazonaws.com/0/123239/3e827f85-add2-9db4-8b1f-a6109b8d027b.png)

おぉう。。。
月初のいま始めるしかないっしょ。
そうでしょ。

後は、これ見て

[Getting started with SORACOM Lagoon](https://dev.soracom.io/jp/start/lagoon-dashboards/)

ポチポチポ。。。

どん！！！

![スクリーンショット 2018-07-04 23.21.52.png](https://qiita-image-store.s3.amazonaws.com/0/123239/d59af5b2-acbd-a5fb-f052-564288cefe45.png)


むっちゃ簡単！！！
まじ半端ないって！！！

マックスの無茶振りで初Qiita。
こんな私でも30分で作れるLagoonダッシュボード
最大2ヶ月無料で遊べます。

是非！！！

。。。Worldmapの使い方わかりません。
mysql データのダンプとロード

接続ユーザー名`hoge`
データベース名`fuga`
パスワード`piyo`

ダンプデータのファイル名`dump.sql`
だとすると

データのダンプコマンドラインから

```
mysqldump -u [ユーザー名] [データベース名] -p[パスワード] > [ダンプデータのファイル名]
```
つまり

```
mysqldump -u hoge fuga -ppiyo > dump.sql
```
とこんなかんじ、

全部のデータベースを出したかったら

```
mysqldump -u hoge --all-databases -ppiyo > dump.sql
```
といったところ

このツールは、ダンプデータを標準出力するという性質らしく、<font color="Blue">ファイルに出力させたかったらリダイレクトしてね。</font>というものらしい。
ちなみにパスワードのオプションは、空白文字なしで`-ppassword`てな感じにしないと、<font color=red>ダメ</font>


さて、ダンプしたデータがあるならロードもしたいわけで。。。。。
データのロードはやはりコマンドラインから

```
mysql -u [ユーザー名] [データベース名] -p[パスワード] < [ダンプデータのファイル名]
```
つまり

```
mysql -u hoge fuga -ppiyo < dump.sql
```
てな感じ。
全部のデータベースをやりたいときは　データベース名を指定しなければいい

```
mysql -u hoge -ppiyo < dump.sql
```

当然　接続ユーザには　それなりの権限がないとダメで(と思っていて)
`DROP`やら、`CREATE`やらが必要なんろうなあ　なんて思っているが現在わからず
<font color = "gray">
それにしてもシンプルなツールだ。
ダンプデータは、リダイレクトすることから分かるようにおもいっきりテキストデータ
しかも、丸ごとSQLのカタマリなんで、中身が丸見えなんですけど。。。。
</font>
sapplyで引数を固定する

ずっと前から気になっていたことがありまして。それは、「引数が複数ある関数で、ある引数以外は固定してsapplyで回したい」ということでした。sapplyで回したいとはつまり、ベクトルなりを関数に渡してアウトプットとしてまたベクトルを得たい、ということです。サンプルコードから書きます。

```
xx <- c(1:20)
hoge <- function(a, b, x){
out <- a + b*x
return(out)
}
sapply(xx, a=3, b=2, FUN=hoge)
```
とすると、結果は

```
> sapply(xx, a=3, b=2, FUN=hoge)
 [1]  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43
```
ここではxを変数として、a, bは固定しています。
sapply()の中で’=’で指定してやればいいだけなんですね。全く気づかなかった。ちょーかんたん。
roleの取得 oracle



```sql:接続しているユーザー自身に付与されたロールを取得
SELECT
    *
FROM
    user_role_privs
;
```

```sql:現在のセッションで有効なロールを取得
SELECT
    *
FROM
    session_roles
;
```


```sql:すべてのユーザーの情報を取得
SELECT
    *
FROM
    dba_role_privs
;
```
ただし、接続するユーザには
`DBA`ロールである`SELECT ANY TABLE`権限が必要
sql 各テーブルの件数を抽出する部品

`as` と `union` を応用する。


```sql
select 'table_01' as tablename , count(*) from table_01
union
select 'table_02' as tablename , count(*) from table_02
union
.
.
.
select 'table_XX' as tablename , count(*) from table_XX
order by tablename desc
;
```
order by はお好みで

<font color="CadetBlue"><i><a href='https://ameblo.jp/tcexternal/entry-10316714942.html'>別ブログに掲載していた記事</a>をQiitaに掲載
[WIP][基礎編]scopeを使って可読性と保守性を向上

# 目的

scope基本的なことをとりあえずメモ程度でもいいので残して置くために書きました。
[WIP]scopeはよく使うので、今後scopeの様々な使い方を紹介していきます。

# 目次

1. scopeとは
2. scopeの利用例
3. default_scopeについて(使ったことないけど情報だけ)

## 1. scopeとは

共通的に使うクエリをモデルのメソッドのように定義できるやつです。
複雑なSQLを何度も書かなくていいし、保守性に優れて、レビュアーにとっても読みやすくなるので良い関係を築けるかもです。

後、同じことがcontrollerでもできるのですが『Skinny Controller, Fat Model（コントローラーのコード量を少なくして、モデルを分厚くする）』という書き方が推奨されています。
このような背景から、ファットモデルという設計が目指すべき設計ということになります。


## 2. scopeの利用例（基本形だけ）

```ruby:
class Article < ApplicationRecord

  enum state: %i[draft published]

  scope :viewable, -> { published.where('published_at < ?', Time.current) }
=begin
  :viewable <-メソッド名
  published <- enumで定義したやつ。articlesテーブルでステータス「公開」のやつ
  .where('published_at < ?', Time.current) }
  「.where」は条件定義するメソッド。
  ('published_at < ?', Time.current) }は「公開日が現在時刻より前」
  まてめ->ステータス「公開」で「公開日が現在日時より前」のデータを取得してこいというメソッド

  豆知識「Time.nowとTime.currentの違い」
  Time.now      -> システムのタイムゾーンになる(Ruby組み込みのメソッド)
  Time.current  -> config.time_zoneで設定したタイムゾーンになる(Rails独自のメソッド)
=end
end
```


## 3. default_scopeについて(使ったことないけど情報だけ)

モデルで共通で適用される scope を定義するために、default_scopeという機能があります。
一見便利な印象を受けるのですが、影響範囲が大きすぎるため、意図しない挙動を生む場合があります。
そのため、default_scope は安易に利用しないほうがいいっぽいです。

#### 🔥なぜ<font color="red">default_scope</font>がだめなのか

[Railsのdefault_scopeは使うな、絶対（翻訳）](https://techracho.bpsinc.jp/hachi8833/2017_10_31/47302)を参考

```
理由は2つあります。どちらも後になってコードが混乱したりバグつぶしに明け暮れたりすることを避けるのが目的です。

default_scopeを追加すると、モデルの初期化が影響を受けます。

いったん定義されたdefault_scopeを使わないようにするのは大変です。
default_scopeが不要な場面で削除するには、unscopedしたスコープ（！）を使わなければならず、
しかも適用されていた関連付けなどの条件はすべて削除されてしまいます。

例: Post.first.comments.unscopedとすると、Postの最初のコメントだけではなく、データベース内のすべてのコメントを返します。

default_scopeより明確な解決法は、明示的な名前付きスコープを使うことです。
default_scopeを使えばバグつぶしに何時間も費やすことになるでしょう。default_scopeは使わないでください。
```

##　参考

[[書籍]Ruby on Rails 5の上手な使い方 現場のエンジニアが教えるRailsアプリケーション開発の実践手法](https://www.amazon.co.jp/Ruby-Rails-5%E3%81%AE%E4%B8%8A%E6%89%8B%E3%81%AA%E4%BD%BF%E3%81%84%E6%96%B9-%E7%8F%BE%E5%A0%B4%E3%81%AE%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%81%8C%E6%95%99%E3%81%88%E3%82%8BRails%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA%E3%81%AE%E5%AE%9F%E8%B7%B5%E6%89%8B%E6%B3%95-%E5%A4%AA%E7%94%B0/dp/4798153095/ref=sr_1_2?s=books&ie=UTF8&qid=1513009954&sr=1-2&keywords=%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2)

[Railsのdefault_scopeは使うな、絶対（翻訳）](https://techracho.bpsinc.jp/hachi8833/2017_10_31/47302)
UITableViewをenumとCaseIterableで管理してみる

WWDC2018で新しく`CaseIterable`というProtocolが発表されたので
実際にどのような場合に便利か自分なりに考えた

UITableViewをenumで管理しやすいのでは…？

# やってみた
下記Delegate周りのコード

```swift:MenuViewController.swift
extension MenuViewController: UITableViewDelegate, UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return Menu.allCases.count  //ココ！！！
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        guard let menu = Menu(rawValue: indexPath.row) else { return UITableViewCell() }
        guard let cell = tableView.dequeueReusableCell(withIdentifier: "MenuCell", for: indexPath) as? MenuTableViewCell else { return UITableViewCell() }
        
        cell.titleLabel.text = menu.info.title
        cell.metaImage.image = menu.info.image
        cell.contentView.backgroundColor = menu.info.color
        return cell
    }
}
```

下記Cellの情報を管理するenum
CellがタップされたDelegateで、定義した`MenuData`を初期化。
Cellの内容を保持させた`MenuData`を`info`として返却する

```swift:MenuViewController.swift
enum Menu: Int, CaseIterable {
    case history
    case chat
    case setting
    
    struct MenuData {
        var title: String
        var image: UIImage?
        var color: UIColor
        var segue: String
    }
    
    var info: MenuData {
        switch self {
        case .history:
            let menuData = MenuData(title: "History",
                     image: UIImage(named: "History"),
                     color: UIColor(red: 46/255, green: 204/255, blue: 113/255, alpha: 1),
                     segue: "toHistoryViewController")
            return menuData
        case .chat:
            let menuData = MenuData(title: "Chat",
                                    image: UIImage(named: "Chat"),
                                    color: UIColor(red: 241/255, green: 196/255, blue: 15/255, alpha: 1),
                                    segue: "toChatViewController")
            return menuData
        case .setting:
            let menuData = MenuData(title: "Setting",
                                    image: UIImage(named: "Setting"),
                                    color: UIColor(red: 149/255, green: 165/255, blue: 166/255, alpha: 1),
                                    segue: "toSettingViewController")
            return menuData
        }
    }
}
```



またこの`Menu`は`CaseIterable`に準拠しているので

```swift
Menu.allCases.count
```
でenumのcaseの個数が取得可能。これをセルの個数に指定する

# まとめ
`UITableViewCell`を返すDelegateメソッドはコード量が増えがちだがenumで管理してあげれば
比較的スマートに書けるし今回の`CaseIterable`でCellの個数が返せます。
ウニプロットをmatplotlibで描く


バイオインフォマティクスという分野の研究者ならほとんど誰でも知っている「ウニプロット」をmatplotで描いてみたくなったが、調べても方法がわからない。そもそも、画像ファイルをプロットのマーカーにする方法も調べても分からない。そこで、既存のマーカーを組み合わせてウニっぽく見えるようにしてみた。

## 様々なマーカーのプロット

<a href="http://ailaby.com/plot_marker/">matplotlib で使える marker を全て試してみる－python</a>を参考に、マーカーの大きさとズレを微調整しながら描いてみる。



```python
%matplotlib inline
import matplotlib.pyplot as plt
```


```python
import numpy as np
import math
x = np.linspace(0, 2.0 * math.pi, 20)
y = np.sin(x)
```


```python
from collections import OrderedDict
markers = OrderedDict([
    ('*', [200, 0, 0]),
    ('v', [100, 0, -0.02]),
    ('<', [70, -0.05, -0.01]),
    ('>', [70, 0.05, -0.01]),
    (4, [70, -0.035, 0.02]),
    (5, [70, 0.035, 0.02]),
])
for m, s in markers.items():
    plt.scatter(x + s[1], y + s[2], marker=m, c="black", s=s[0])
    plt.show()
```


![output_2_0.png](https://qiita-image-store.s3.amazonaws.com/0/211162/5ffa19d4-1ec4-2544-622b-5e6573c66436.png)



![output_2_1.png](https://qiita-image-store.s3.amazonaws.com/0/211162/87e7b3bf-5513-ffdd-ea47-6552d39b590c.png)



![output_2_2.png](https://qiita-image-store.s3.amazonaws.com/0/211162/ffa2700f-a2f2-b01d-82a8-cf89337a8368.png)



![output_2_3.png](https://qiita-image-store.s3.amazonaws.com/0/211162/bd82a9b3-ff23-7d76-c249-acd9fcf7290c.png)



![output_2_4.png](https://qiita-image-store.s3.amazonaws.com/0/211162/239152b1-8c0f-6bb7-9723-3a1f7769444d.png)



![output_2_5.png](https://qiita-image-store.s3.amazonaws.com/0/211162/b1f94ec2-a0d9-f1a8-d553-55de76208ff8.png)

## ウニプロットの完成

以上のプロットを重ね合わせると...

```python
from collections import OrderedDict
markers = OrderedDict([
    ('*', [200, 0, 0]),
    ('v', [100, 0, -0.02]),
    ('<', [70, -0.05, -0.01]),
    ('>', [70, 0.05, -0.01]),
    (4, [70, -0.035, 0.02]),
    (5, [70, 0.035, 0.02]),
])
for m, s in markers.items():
    plt.scatter(x + s[1], y + s[2], marker=m, c="black", s=s[0])
plt.show()
```


![output_3_0.png](https://qiita-image-store.s3.amazonaws.com/0/211162/e3a27bd3-af44-dce3-50d1-25e08e7741ea.png)


できた！！！ウニっぽい！
【Swift】UIBezierPathを使ってviewのlayerにグリッドを描画する


# １．はじめに

　`UIBezierPath` を使って丸や三角、四角、星型など様々な形を描画する記事はたくさんありますが、そのほとんどが、コンテキストから `UIImage` として取得するというものに感じました。
　`UIBezierPath` で指定したパスを `view` の `layer` に設定することもできるので、それを紹介したいと思います。

#  ２．完成形

　20ポイント間隔のグリッドを描画します。
　描画したい形にこだわりがあるわけではないので、そこはなんでも。

<img width="545" alt="スクリーンショット 2018-07-04 22.43.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/124577/99115c24-c640-060e-14a4-c75d7cc21e5a.png">

#  ３．コード

```swift

// 描画するレイヤーを作成する
let gridLayer = CAShapeLayer()
gridLayer.frame = view.bounds

// 線の色
gridLayer.strokeColor = UIColor.red.cgColor
// 線の太さ
gridLayer.lineWidth = 0.4

let gridLine = UIBezierPath()

// 横線の描画
var pointA = CGPoint(x: 20, y: 20)
var pointB = CGPoint(x: view.frame.width - view.frame.width.truncatingRemainder(dividingBy: 20), y: 20)
while pointA.y < view.frame.height {
    gridLine.move(to: pointA)
    gridLine.addLine(to: pointB)
    pointA.y = pointA.y + 20
    pointB.y = pointB.y + 20
}

// 縦線の描画
pointA = CGPoint(x: 20, y: 20)
pointB.x = 20
pointB.y = pointB.y - 20
while pointA.x < view.frame.width {
    gridLine.move(to: pointA)
    gridLine.addLine(to: pointB)
    pointA.x = pointA.x + 20
    pointB.x = pointB.x + 20
}

// 線を描画
gridLayer.path = gridLine.cgPath

view.layer.addSublayer(gridLayer)

```

パスは `UIBezierPath` で作成します。
`move(to: CGPoint)` で始点を指定します。
`addLine(to: CGPoint)` で線を描画するポイントを指定します。

`UIBezierPath` で作成したパスを `CAShapeLayer` のインスタンス（`gridLayer`）の `path` に設定します。
`gridLayer` を `view` に `addSublayer()` してあげれば、完成です。

この `gridLayer` をインスタンス変数として保持しておいて、グリッドを削除したいタイミングで
`gridLayer.removeFromSuperlayer()` をすればグリッドが削除されます。


＊ `UIBezierPath` を使っているということで `.stroke()` を使いたくなりますが、
これを使うと、大量の「正しくないコンテキストで使わないでね」エラーが出力されて、ぎょっとします。
ユーザー定義のテーブル名を取得 oracle


oracleでユーザー定義の属性名を取得する

```sql:ユーザテーブルの取得
SELECT
    *
FROM
    user_tables
;
```
```sql:現行のユーザーが所有するテーブル、ビューおよびクラスタの列を取得
SELECT
  *
FROM
  user_tab_columns
;
```
これらを応用しつつ、テーブル構造を取得する。

```sql
SELECT
    table_name,
    column_name,
    data_type || '(' || nvl(data_precision,data_length) || '.' || nvl(data_scale,'0') ||')' as data_type
FROM
    user_tab_columns
WHERE
    not table_name like 'BIN$%'
;
```
table_name に　BIN$ほにゃららを出さないようにしているのがミソ
<font color="CadetBlue"><i><a href='https://ameblo.jp/tcexternal/entry-10306912426.html'>別ブログに掲載していた記事</a>をQiitaに掲載
Wiki.js を docker-compose で動かす

## Wiki.js

オープンソースの Node.js 製 Wiki engine です。

https://wiki.js.org/
https://github.com/Requarks/wiki

Markdown で記述でき、Github 等のリモートのリポジトリにも sync させることができます。

## docker-compose でローカルに立ち上げる

[Using Docker Compose | Docker - Wiki.js](https://docs.requarks.io/wiki/install/docker#using-docker-compose)

ドキュメントにある、sample の `config.yml` と　 `docker-compose.yml` を使う場合以下の点を直しておきます。

https://github.com/Requarks/wiki/blob/master/config.sample.yml#L26

```diff:config.yml
- port: 80
+ port: 3000

- db: mongodb://localhost:27017/wiki
+ db: mongodb://wikidb:27017/wiki
```

mongo の設定はドキュメントにある通りです。port の方は `docker-compose` の方の　ports の設定が `"80:3000"` になっているためです。
https://github.com/Requarks/wiki/blob/master/tools/docker-compose.yml#L18-L19

> さらに注意ですが、ホスト側に　expose する port は 80 にしておかないと、 JavaScript 等の asset ファイルが読み込めません。

## Github に sync する設定を追加する

[Github Using SSH (Repository) | Git - Wiki.js](https://docs.requarks.io/wiki/install/installation/git#using-ssh-repository)
[Using SSH | Git - Wiki.js](https://docs.requarks.io/wiki/install/installation/git#using-ssh)

ここでは、SSH を使って Github に sync する方法を利用します。

```yaml:config.yml
git:
  url: git@server.com:org/repo.git
  branch: master
  auth:
    type: ssh
    privateKey: /etc/wiki/keys/git-private.pem
    sslVerify: true
  signature:
    name: Marty
    email: marty@doc.com
```

ドキュメントの設定を抜粋しています。

上記の場合、まず `org/repo` のリポジトリの `master` ブランチは存在している状況にしておく必要があります。新規リポジトリを作ったままの状態では失敗します。

続いて、ssh の key に関してですが、上記の設定の場合はドキュメントにあるように、 __Deploy Keys__ が必要です。
Deploy Keys が取得できたら、その秘密鍵を以下のように設定します。以下では秘密鍵を `id_rsa_wikijs` という名前にしたという前提です。

```yaml:docker-compose.yml
  wikijs:
    image: 'requarks/wiki:latest'
    # 略
    volumes:
      - ./config.yml:/var/wiki/config.yml
      - /path/.ssh/id_rsa_wikijs:/etc/wiki/keys/git-private.pem
```

## config.yml の内容

とりあえず動かす場合には認証も不要だと思うので、以下ぐらいの設定があれば十分です。（もちろん Heroku 等に　publish する場合は `sessionSecret` の値を変えたり、 `auth` の設定はしてください。）

```yaml:config.yml
host: http://localhost
port: 3000
db: mongodb://wikidb:27017/wiki
sessionSecret: 1234567890abcdefghijklmnopqrstuvxyz

public: false

auth:
  defaultReadAccess: false
  local:
    enabled: true
git:
  url: git@github.com:dany1468/wiki.git
  branch: master
  auth:
    type: ssh
    privateKey: /etc/wiki/keys/git-private.pem
    sslVerify: true
  signature:
    name: dany1468
    email: dany1468@example.com
```

## ログを見る

うまく動作しなかった場合はログを見ます。

```bash
% docker-compose exec wikijs bash

# supervisorctl tail wikijs
# cd /logs
# ls 
supervisord.log  wiki-stderr.log  wiki-stdout.log
```

supervisord で動作しているのでログを見れますし、`/logs` にいけばログファイルもあるので、内容を見てみます。

## Github への同期のされ方

https://github.com/dany1468/wiki

上記を見れもらうと分かる通り、すべてのページが root に配置されます。

## 余談

部門の都合で、Markdown ベースの情報共有ツールが使えず、仕方なく Github をドキュメント置き場にするかと考えて、いろいろ調べていた中でたどり着きました。

Git をデータベースにするという点では、 Ruby 製の gollum 等もありましたが、なるべく余計な工夫なしで Github に入れられて、かつ、Github だけ見る人は普通の Markdown として見られるツールが欲しかったのでした。

結果として、Gitbook Editor を使ってドキュメントを書くのが自分のしたいことに最も近かったので、Wiki.js は使わなかったのでした。
HTTPメソッドのメモ


# POST

一番汎用的に使われる。

# PUT

作成かつ値を指定する場合。（ファイルの新規作成など）
ファイルをユーザに作ってもらうときは実装側でファイル名を指定しておくとよい。

# PATCH

一部を更新するときに使う。

# DELETE

削除する時に使う。
バイナリとは


2つの要素からなるもの。2進数もそれにあたる。
ただし、コンピュータ用語で出てくる「バイナリ」とは

- 「0」「1」（2進数）で表現されているデータ形式
- テキスト以外の（コンピュータが理解できる）データファイル

のどちらかを指すらしい。
anyenv 基本的な使い方

- 一つのマシンでNode.js,Python,Ruby 等の複数言語を扱うかもしれないので、anyenvをインストールしてみた
- 基本的には公式通りでOK

# anyenvインストール
- インストール

```
git clone https://github.com/riywo/anyenv ~/.anyenv
echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
exec $SHELL -l
```

- 確認
  - `anyenv -h`

# anyenvでndenvをインストール

- インストール

```
anyenv install ndenv
exec $SHELL -l
```

- 確認
  - `anyenv version`
 
# ndenvでNode.jsをインストール

- インストール可能なバージョン一覧
  - `ndenv install -l`
- インストール
  - `ndenv install v8.9.1` 
- インストールされているバージョン一覧
  - `ndenv versions`
- バージョン切り替え(global)
  - `ndenv global v8.9.1`
- 確認
  - `node -v`
  - `npm -v`

# 参考

- <https://github.com/riywo/anyenv>
- <https://github.com/riywo/ndenv>
- <https://qiita.com/0084ken/items/22ca33032773c6d2f9f4>
データを保持したままのパーティションの拡張 (非LVM環境、ext4)

# 前提条件
拡張するパーティションの後ろに空き領域が必要。
要するに対象のパーティションのすぐ後ろの領域に他のパーティションが存在する場合は無理。
また、作業前にはバックアップを行うこと。

#1.現在のサイズや存在するファイルを確認

```shell-session
$ df -hT /testdir/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      ext4  9.1G   37M  8.6G   1% /testdir
$ ll /testdir/
total 316
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file1
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file2
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file3
drwx------ 2 root root  16384 Jul  4 21:55 lost+found
```

#2.パーティションテーブルを確認
```shell-session
$ parted /dev/sdb u s p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End        Size       Type     File system  Flags
 1      2048s  19531775s  19529728s  primary  ext4
        ^^^^^★開始セクタが後述の作業で必要になる
$
```

#3.アンマウント
```shell-session
$ umount  /testdir/
```

#4.パーティションの削除
```shell-session
$ parted /dev/sdb rm 1
Information: You may need to update /etc/fstab.

$ parted /dev/sdb u s p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End  Size  Type  File system  Flags
```

#5.パーティションの再作成
```shell-session
$ parted -s /dev/sdb mkpart primary 2048s 100%
$                                   ^^^^^★必ず「2.」で確認した開始セクタを入力すること
$ parted /dev/sdb u s p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 41943040s
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start  End        Size       Type     File system  Flags
 1      2048s  41943039s  41940992s  primary  ext4

$ parted /dev/sdb u GB p
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      0.00GB  21.5GB  21.5GB  primary  ext4

```

#6.ファイルシステムチェック及びファイルシステムの拡張
```shell-session
$ e2fsck /dev/sdb1
e2fsck 1.42.9 (28-Dec-2013)
/dev/sdb1: clean, 14/610800 files, 80417/2441216 blocks
$ resize2fs -f /dev/sdb1
resize2fs 1.42.9 (28-Dec-2013)
Resizing the filesystem on /dev/sdb1 to 5242624 (4k) blocks.
The filesystem on /dev/sdb1 is now 5242624 blocks long.

```

#7.拡張後のサイズや存在するファイルを確認
```shell-session
$ mount /dev/sdb1 /testdir/
$  df -hT /testdir/
Filesystem     Type  Size  Used Avail Use% Mounted on
/dev/sdb1      ext4   20G   45M   19G   1% /testdir
$ ll /testdir/
total 316
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file1
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file2
-rw-r--r-- 1 root root 100000 Jul  4 21:56 file3
drwx------ 2 root root  16384 Jul  4 21:55 lost+found
$
```

# 参考情報
How can I extend an existing file-system partition without destroying data?
https://access.redhat.com/solutions/29095

How to extend a logical volume and its filesystem online in Red Hat Enterprise Linux?
https://access.redhat.com/solutions/24770
RMarkdownでチェックボックスを使う

※2019-07-30追記

コメント欄に@uriさんが書いてくれていますが、Pandoc 2.6でチェックボックスがサポートされたので、GitHubのリポジトリからtask-list.luaが削除されています。

現状だとRStudioにバンドルされているPandocは2.3.1なので、コメント欄にあるように古いリポジトリからダウンロードしてくるか、Pandocのバージョンを上げるかのいずれかの対応が必要になります。

mac & デスクトップ版RStudioの場合は`brew install pandoc`するだけでチェックボックスが使えるようになりました。

## RMarkdownではチェックボックスが使えない

- [x] こういうやつが
- [ ] 標準のR Markdownでは使えない

どうやらPandocの都合らしい。

軽く調べたところ使えるようにするのは割と簡単だった。

## 準備

### Pandocのアップデート

チェックボックスを使用可能とするためには`--lua-filter`というオプションが使える必要があって、Pandocのバージョンがあまり古いと使えないことがある。手元のPandocはいつ入れたのか覚えがないんだけど、バージョンが1.11.1でこのオプションが使えなかったので、homebrewから`brew install pandoc`として2.2.1を入れた。

### $DATADIRの準備

pandocは標準では`$DATADIR`以下にある各種のファイルを参照する。デフォルトではこのディレクトリは

- UNIX: `$HOME/.pandoc`
- Windows: `C:\Users\USERNAME\AppData\Roaming\pandoc`

となっているので、作成しておく。また、luaファイルを配置するために`$DATADIR/filters`ディレクトリも作成しておく。

ちなみに、この手順を省略し、luaファイルへの絶対パスをオプションで指定しても良い。

### task-list.luaのダウンロード

[lua-filters/task-list.lua at master · pandoc/lua-filters](https://github.com/pandoc/lua-filters/blob/master/task-list/task-list.lua)から`task-list.lua`をダウンロードして`$DATADIR/filters/task-list.lua`に保存する。

## チェックボックスを使う

準備ができたら.Rmdを書く。準備したluaフィルタを使うには、pandoc実行時に`--lua-filter=task-list.lua`のようなオプションを渡す必要がある。.Rmdファイルのyamlフロントマターで指定すると、次のようになる。

```markdown:checkbox.Rmd
---
title: ".Rmdでチェックボックス"
output:
  html_document:
    pandoc_args: [
      '--lua-filter', 'task-list.lua'
    ]
---

- [ ] 空
- [x] checked
```

あとはこれをKnitすれば良い。次のような出力が得られるはずだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/109348/39ef58c8-f8aa-09f8-1458-e48e8ce2a904.png)


## 参考

- [r markdown - How to change pandoc option in R Studio - Stack Overflow](https://stackoverflow.com/questions/35271593/how-to-change-pandoc-option-in-r-studio)
- [Pandoc Tricks · jgm/pandoc Wiki](https://github.com/jgm/pandoc/wiki/Pandoc-Tricks#gfm-task-lists-with-pandoc)
- [Pandoc - Pandoc User’s Guide](https://pandoc.org/MANUAL.html)
Rustの自作ライブラリのチューニング(をしている)

テーブルを綺麗に表示するだけの自作ライブラリ「[pretable](https://crates.io/crates/pretable)」で、
出力する部分が遅かったのでパフォーマンスチューニングを行っていまうす。
そこでやった点をまとめています。
(こうするべきっていうのがあったら教えてほしいです)
(ドキュメントもそのうち書きます)

上から順に行っている為、時間はどんどん早くなっています。
計測のやり方は**10万行分**のデータをStringとして出力する関数だけの時間を計測しています。
(``--release``は使っていないです)

```rust
table.output();
```

## 文字列結合よりformat!のほうが早い
変更前: 1.9s
変更後: 1.6s

```rust
Self::repeat(" ", start) + v + &Self::repeat(" ", end)
```

```rust
format!("{}{}{}", Self::repeat(" ", start), v, Self::repeat(" ", end))
```

## 文字列結合よりformat!のほうが早い2
これは考えなくてもわかる気がした。(Javaとかでそうだから)

変更前: 1.6s
変更後: 1.3s

```rust
for _ in 0..count {
    v += s;
}
```

```rust
for _ in 0..count {
    v = format!("{}{}", v, s);
}
```

## Vecの初期化
数が多いと影響してきそう

変更前: 1.36s
変更後: 1.35s

```rust
Vec::new()
```

```rust
Vec::with_capacity(n)
```

## 単純な文字列作成
もっといいやり方があるかもしれない

変更前: 1.35s
変更後: 1.14s

```rust
fn repeat(s: &str, count: usize) -> String {
    let mut v = String::new();
    for _ in 0..count {
        v = format!("{}{}", v, s);
    }
    v
}
```

```rust
fn repeat(s: &str, count: usize) -> String {
    let b = s.as_bytes()[0];
    String::from_utf8(vec![b; count]).unwrap()
}
```

## 上記の関数の引数をstrからu8に変更
変更前: 1.14s
変更後: 1.13s

```rust
fn repeat(s: u8, count: usize) -> String {
    String::from_utf8(vec![s; count]).unwrap()
}
```

## Vecの初期化(別の箇所)
10万回呼ばれる箇所

変更前: 1.13s
変更後: 1.11s

## Vecのiter()のunwrap()を使わないようにする
絶対入るってわかっている箇所ならインデックス使ったほうがはやい

変更前: 1.11s
変更後: 1.09s

```rust
let mut l = value_len_vec.iter();
*l.next().unwrap();
```

```rust
let mut n = 0;
let mut inc = || {
    n += 1;
    n - 1
};
value_len_vec[inc()];
```

## Vecのjoinをconcatに
join早くしたいと思って調べたら存在した

変更前: 1.09s
変更後: 1.08s

```rust
result.join("")
```

```rust
result.concat()
```

## String::from_utf8をString::from_utf8_uncheckedに
unwrap()は遅いと思って調べたら存在した

変更前: 1.08s
変更後: 1.06s

```rust
String::from_utf8(vec![s; count]).unwrap()
```

```rust
unsafe {
    String::from_utf8_unchecked(vec![s; count])
}
```

## Stringの生成を抑える
[outputの高速化 by vain0x · Pull Request #2 · ryota-sakamoto/pretable](https://github.com/ryota-sakamoto/pretable/pull/2)
[vain0xさん](https://qiita.com/vain0x)
すごいなるほどなあと思った。

変更前: 1.06s
変更後: 0.68s

# 現在もチューニングを続けているのであった…
EmacsからVimiumを操作する

[「EmacsからChromeを操作する」](https://qiita.com/blue0513/items/16d76ff27520bd8b2f57)のつづきです
もうちょっとだけ操作性を向上させます

# 何ができるの？
Emacsからフォーカスを外すことなく、Chromeアプリ[「Vimium」](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=en)を起動・操作できます
（Vimium: The Hacker's Browser. Vimium provides keyboard shortcuts for navigation and control in the spirit of Vim.）

![untitled2.gif](https://qiita-image-store.s3.amazonaws.com/0/144707/b1675246-0701-5d2f-7641-6009a68ddec8.gif)

# どうやるの？

## AppleScriptの準備

### Vimium起動用のAppleScript  
Google Chrome上で`F`キーを押す動きをシミュレート

ファイル名: `chrome_vimium`  

```applescript
#!/usr/bin/osascript

tell application "Google Chrome" to activate
tell application "System Events"
     tell process "Google Chrome"
	       keystroke "f"
     end tell
end tell

tell application "Emacs" to activate
```

### Vimium操作用のAppleScript  
Google Chrome上に表示されたキーを押す動きをシミュレート

ファイル名: `chrome_vimium_input`

```applescript
#!/usr/bin/osascript

-- 引数: 押したいキー
on run argv
   set myinput to (item 1 of argv)
   tell application "Google Chrome" to activate
   tell application "System Events"
	tell process "Google Chrome"
	       keystroke myinput
	end tell
   end tell
   tell application "Emacs" to activate
end run
```

各スクリプトは適当なPathに配置して実行権限を付与してください

## init.elの準備

```elisp
;; Vimium起動用の関数
;; スクリプトへのPathはお好みで
(defun my-vimium()
  (interactive)
  (call-process-shell-command
   "~/shellscript/chrome_vimium/chrome_vimium&"
   nil 0))

;; お好みで
(global-set-key (kbd "H-e") 'my-vimium)

;; Vimium操作用の関数
;; スクリプトへのPathはお好みで
(defun my-vimium-input(my-input)
  (interactive "sString:")
  (call-process-shell-command
   (concat "~/shellscript/chrome_vimium/chrome_vimium_input " my-input)
   nil 0))

;; お好みで
(global-set-key (kbd "H-w") 'my-vimium-input)
```

## 実行
1. Emacs上で`M-x my-vimium` （上記の例だと "H-e"）
2. Chromeにジャンプ用のキーが表示される
3. Emacs上で`M-x my-vimium-input`（上記の例だと "H-w"）
4. Emacs上でジャンプしたいキーを入力

以上です！！
超初心者DB


随時適当に更新していく（予定）。

# 接頭辞はつけよう

## よく使われるもの
### m_

マスタ系。アプリケーション内で度々参照されるもの。
例）商品マスタ、ユーザなど

### t_

トランザクション系。基本的に増えていくもの。
例）お問い合わせ内容を保存するテーブル、購入履歴など

# 大文字は使わない

使うDBによって大文字・小文字の区別をしたりしなかったりするらしいので基本的に使わないようにするのがベター。

# サーバーの物理層と論理層

## 物理層
サーバーを置く場所のことを指す。さくらインターネットの石狩データセンターが例。

## 論理層
サーバーの中に置いてあるDBのことで、1つのサーバーに多数のDBが置かれている。
DB間で結合はできないため、他者のプロジェクトにデータが抜かれることはない。
Laravelでシーダーをやり直す度にidを1始まりにしたい


```
SELECT SETVAL('"郵便番号マスタ_シリアル_seq"',0);
```

- 最後の数字の次から始まるので、1から始めたい場合は0にする
- DBファザードのtableを使ってSQLを書く

## 参考

http://www.t-webu.net/postgres/postgres%E3%81%AB%E3%81%A6%E3%82%B7%E3%83%BC%E3%82%B1%E3%83%B3%E3%82%B9%E3%82%92%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.html

https://www.postgresql.jp/document/9.1/html/functions-sequence.html
[Ruby on Rails] 複数のステージング環境を用意する

## 環境
- Rails 5.0
- Ruby 2.3.3
- AWS

## 背景
現在のチームの開発の流れ: 

development -> staging -> production

開発チームメンバーが増えると開発のスピードを上げるために、複数のステージング環境が望ましくなってきました。それで複数のステージング環境を構築してみました。

現在のステージング(stagig)を除いで、２つ別のステージング環境(staging1, staging2)を作りました。

## 方針
|名前|説明|
|---|---|
|Web Server|新しいインスタンを新規追加|
|DB|別のDB名にして、同じStaging RDS Instanceに新規作成|
|Redis|同じReids Instanceの別のDBを使う|

## Ec2 Instance
### 用意
Terraformで２つの同じステージングインスタントを追加した。
### 設定
InstanceのタグStagesをstaging1/staging2に設定します（デプロイのため）。

## Database
### 用意
そんなに使われないので、同じRDS Instanceに複数のDBを作りました。

```sql
mysqldump -h hostname -u username -p password --single-transaction pro_staging > dump.sql

mysql -h hostname -u username -p password --single-transaction pro_staging_1 < dump.sql
mysql -h hostname -u username -p password --single-transaction pro_staging_2 < dump.sql
```

### 設定
現在の3環境（development, staging, production）を増やすつもりなく、ステージング環境そのまま利用します。

database.ymlにはすでにdotenvで環境変数を入れてますので、修正が不要です。

```yml:database.yml
staging:
  <<: *default
  pool: 20
  database: <%= ENV['DATABASE_NAME'] %>
  username: <%= ENV['DATABASE_USERNAME'] %>
  password: <%= ENV['DATABASE_PASSWD'] %>
  host:     <%= ENV['DATABASE_HOST'] %>
```

dotenvのファイルを増やして、.env.staging1と.env.staging2を追加する。

```yml:.env.staging1
# RDS
DATABASE_NAME = pro_staging_1 # or pro_staging_2
DATABASE_USERNAME = xxx
DATABASE_PASSWD = xxx
DATABASE_HOST = xxx
```

## Redis
### 用意
そんなに使われないので、同じRedis Instanceに別のDBを使います。defaultは0を使ってるので、staging_1とstaging_2はDB 1と2を使ってもらいます。
### 設定 
```rb:config/environments/staging.rb
config.cache_store = :redis_store, ENV['REDIS_ENDPOINT'], { expires_in: 12.hours }
```

```yml:.env.staging1
# Redis
REDIS_ENDPOINT=redis://xxx:6379/1
```

## Rails
### 設定
Staing1とStaing2はstaging環境としてうごくように設定します。

```rb:config//environment.rb
Rails.env = 'staging' if Rails.env =~ /staging\d+/
```

## Capistrano
[cap-ec2](https://github.com/forward3d/cap-ec2)を使って、デプロイしてます。

### 設定
- デプロイstagesを追加する

```rb:config/deploy.rb
set :stages, %w[development staging staging1 staging2 production]
```

- .envファイルのコピータスク修正

```rb:config/deploy.rb
desc 'set env file'
  task :set_env_file do
    on roles(:app) do
      with rails_env: fetch(:rails_env) do
        case fetch(:stage)
        when :staging1
          p 'copy .env.staging1'
          upload!('.env.staging1', "#{shared_path}/pro/.env.staging")
        when :staging2
          p 'copy .env.staging2'
          upload!('.env.staging2', "#{shared_path}/pro/.env.staging")
      end
    end
  end
```

- 新しいstageの作成

同じソースを増やしたくないので、symbolic link fileを使います。

```sh
ln -s config/depoly/staging.rb config/depoly/staging1.rb
ln -s config/depoly/staging.rb config/depoly/staging2.rb
```

これて２つのステージング環境を追加することができました。時々本番とのデータsyncが必要になります。
sympyの微分方程式で「Euler’s formula」を参考にした。

(参考)2乗出ません。本文を見て下さい。

http://www.wolframalpha.com/input/?i=%7Bw''(x)%2B%CE%BB**2*w(x)%3D0%7D

(参考)Taming math and physics using SymPy - Minireference

https://minireference.com/static/tutorials/sympy_tutorial.pdf#page=5

```fullscript.py
from sympy import *
x = symbols('x', real=True)
λ = symbols('λ', real=True,positive=True)
var('c_1,c_2')
w = symbols('w', cls=Function)
v = symbols('v', cls=Function)
print('wolframalph------------------------')
w = c_2*sin(λ*x) + c_1*cos(λ*x)
print("w=",w)
print('sympy------------------------------')
eq=v(x).diff(x,2) +λ**2*v(x)
v = dsolve(eq).rhs
print("v=",v)
# wolframalph---------------------
# w= c_1*cos(x*λ) + c_2*sin(x*λ)
# sympy---------------------------
# v= C1*sin(x*Abs(λ)) + C2*cos(x*λ)
```
【全3回講座】Sketch超基本講座①　ショートカットキー編

![image.png](https://qiita-image-store.s3.amazonaws.com/0/268203/5a119434-1fae-d62b-b696-f6310243ca7d.png)

#なぜSketchが必要か
iPhoneやAndroidアプリを作る際、
自分のプロダクトを、より洗練され、より多くの人に愛されるものにするためには必ずUIデザインが必要になります。
UIを簡単にかつとても綺麗に作成し、まとめられるSketchは世界中で多くのUIデザイナーに愛用されています。

そんなSketchをこれから使い始めようとしている方を対象に
今日から使える超基本的な使い方を紹介します。


#実際にSketchを使っていきましょう！
第１回　「ショートカットキー編」
第2回　「シンボル化」
第3回　「マスク化、メニューアイコンの作り方」
の全３回講座でお届けします。

基本的にはショートカットキーを使わなくても作業を始められますが、生産性をあげる為にこの際、是非ショートカットキーを覚えて
サクサクっとデザインイメージを作っていきましょう。


# 1. アートボード (Artboard)
まずはアートボードを開いて作業を始めましょう。
アートボード　＝　作業画面　と考えていただければ。

| 操作名       |       ショートカットキー |
|:-----------------|------------------:|
| アートボードを開く             |              a | 



<img width="270" alt="スクリーンショット 2018-06-20 10.56.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/268203/5191065e-734b-e004-861a-f9b8263d19d3.png">

ショートカットキーの [a] を押すと、画面右側にアートボードの種類が表示されます。
Appleのデバイス以外にも、android, web, 紙サイズなど数多くのプリセットから指定できます。

| Apple | android |　web　|　紙サイズ　|
|:-----------------:|:------------------:|:------------------:|:------------------:|
| <img width="214" alt="スクリーンショット 2018-06-20 10.55.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/268203/0dde120a-9348-582a-1632-b5f50c729f20.png">             |              <img width="213" alt="スクリーンショット 2018-06-20 11.17.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/268203/b5e745e8-dc9a-65b7-a115-2ac7c10a035f.png"> | <img width="214" alt="スクリーンショット 2018-06-20 11.20.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/268203/84adfc54-1e5c-8900-aa9f-452746f95213.png">| <img width="213" alt="スクリーンショット 2018-06-20 11.23.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/268203/e74295b4-2dc4-81e9-d84f-4531f4c1f9f6.png">



# 2.　シェイプ (Shape)
アイコンやメニューバーを作る際にはシェイプは必需品です。
種類は４つありますのでうまく利用しましょう。

Shiftキーを押しながらドラッグすることで綺麗に描図することができます。

| 操作名 | ショートカットキー | + [Shift] キー |
|:-----------------:|------------------:|------------------:|
| 四角 |r| 正方形| 
|四角(角丸)|u | 正方形(角丸)| 
|丸 | o |  円|
|線 | l | 直線|

# 3.　テキスト (Text)
| 操作名       |       ショートカットキー |
|:-----------------|------------------:|
| テキストを入力する             |              t |



この3つのショートカットキーを習得すれば超基本的な作業が今日からスタートできます。
四角いボックスに色をつけて、その上に文字を載せればトップページのロゴだって作れます。
ショートカットキーを駆使して色々作ってみましょう！

では第2回をお楽しみに！
PHPのクラス設計


だいぶ前に勉強会で学んだ内容のメモを見つけたので、復習がてらまとめる。
かなり前の話なので、解釈等が間違っているかもしれない。
（特にValueObject以下）

### 題材
問い合わせフォームをつくる。

#クラスの役割
クラスの役割は次の2つがある。

##1. データの保持

クラスにプロパティ

```php
public $name
```

を生やすことで、配列と違い **明示的に「どんな項目が必要か」を示す** ことができる。
つまり、データの持ち方の仕様を決めることが可能。

例えば、下記のようなUserクラスの場合

```php
class User {
	public $name;
	public $age;
	public $company;
}
```

「このクラスには `$name` `$age` `$company` 項目が必要」ということになる。

##2. 処理のモジュール化

バリデートなど、処理のモジュール化としてクラスを作ることもある。
この場合、クラス作成時に必ず **「何をするクラスか」をコメントなどで書いておく** ことがポイント。

処理をモジュール化したクラスを作ったら

```php
$contact = new User； //User：クラス名
```

でクラスのインスタンスができる。
インスタンスを作ることで実装したメソドが `->` で呼び出せるようになってとても便利。

## クラスの外部化
ここまでを「クラスを外部化」というらしい。
ただし、

```php
return $contract->validate();
```

と `->` で呼び出せるようになったところで、これだとちょっと外部化しただけ。

# クラス作成のポイント

**1クラス1処理が鉄則。**
例えば以下のような処理を行いたい場合、

- リクエストデータをとってくる
- バリデーションをする
- セッションに突っ込む
- DBに突っ込む

4つ全ての処理を1つのクラスに担わせるのはナンセンス。

## クラスをつくる上で大事な概念

- 1クラス1責務
- IPO

この2つを意識することがとても大切。
クラスをIPOに当てはめると、以下のようになる。

- I：Input...引数
- P：Process...1クラス1責務
- O：Output...戻り値、例外

## 返り値の重要性
「何をするのか」ではなく **「何をして何を返すのか」** が一番大事。
保守の時に返すものを修正することはよくあるので、最初からドキュメント化しておくべき。

### php7から使える返り値の型指定
```php
validate():bool
```

メソドの後ろに `:型` と書くと、返す型を指定することができるので積極的に使おう。

### バリデーションの返り値
バリデーションの場合は「OK」or「NG」だけを返すのではなく、エラーメッセージが出せるようにしておくこと。
ただし、「sessionにエラーメッセージを返す」といったところまでもバリデーションクラスに書いてしまうとクラスの趣旨がずれてしまうので注意する。

バリデーションクラスは **「バリデーションオブジェクトをつくる」** ことに専念させ、受取手が好きに扱えるようにするスタンスがよい。
Serviceクラスを作り、そこでDBに保存させる、とか。

#コントローラの役割

- `return view` する
- リダイレクトする
- etc...

といったように、リクエストの処理をちゃんと行うことがコントローラの役割。

ちなみにコントローラ内でsessionを使った場合、デバッグ用のartisanコマンドでは使えなくなるので注意。
（sessionはHTTP経由でないと使えないため）

#Serviceを作る場所

Laravelとかだとserviceは `app` の下に作るのが一般的っぽい。

#ValueObject
バリデーションオブジェクトをそのままもらうだけなのはやな感じなので、  **ValueObject（以下、VO）** にあたるContactクラスをつくるのがおすすめ。
VOをつくることで、配列とは違い「ここを見ればどんな項目が入ってくるのか」が確実にわかるようになる。

```php
$contact = new Contact();
$contact->name = $data["name"]; //安全性が保障されている
```

#ステートフル/レスのどちらが理想か？
プロパティとメソドのどちらも持たせるクラスのことを「ステートフル」と言えるかもしれない。
こうするとそのクラスを見てる時はラクだが、依存しあっている（プロパティとメソドが？）と間違った処理を書いてしまった時に大変。

なので、クラスの中で依存しあっていない「ステートレス」が理想的。
クラスは状態・処理の両方を持たせることができるが、そうしてしまうと複雑度が増す＆依存性があがるので避けるべき。

ステートレスなクラスの例をあげるとするならLaravelのEloquent。
Eloquentを自分で作ってはいけない。

# まとめ

クラスを作る時には

- 処理をするためのクラスか
- データを保持するためのクラスか

を考えるようにしましょう。
iPadのiOSバージョンを取得する(JavaScript)

## はじめに

iPadのiOSバージョンをJavaScriptで取得する方法を紹介します。

## iPadのiOSバージョンを取得する関数

ユーザーエージェントからiOSのバージョンのみを取り出します。

`11_3_1` のようにアンダーバー `_` で区切られているので、ドット `.` に置換してから浮動小数点に変換して返しています。

```js
function ipad_ios_version() {
  var version = window.navigator.userAgent.toLowerCase().match(/ipad; cpu os (.+?) like/)[1];
  return parseFloat(version.replace("_", "."));
}
```

## 使い方

浮動小数点に変換しているため、比較演算子で簡単に比較することができます。

```js
if (ipad_ios_version() >= 11.0) {
  // TODO: iOS 11.0以上の場合に実行する処理を書く
}
```

## おわりに

この関数のままだとiPhoneでは使えません。

他にいい方法があればご教授のほどよろしくお願いします。
AtCoder Beginner Contest 102 解説備忘録

#前書き
AtCoder Beginner Contest 102 を解いてみた．解けなかった問題の備忘録．

#C問題
[[問題はこちら]](https://beta.atcoder.jp/contests/abc102/tasks/arc100_a)

・min $\sum |A_i-(b+i)|$を求める。

・$A_i-i=x_i$とし、$x_i$を昇順でソートする。

・ここで、$x_m-b \leq 0$、$x_{m+1}-b \leq 0$となる$m$を設定する。

・このとき、
$\begin{eqnarray}
\sum_{i=1}^{n} |x_i-b|&=& \\{ \sum_{i=1}^{m} -(x_i-b) \\} + \\{\sum_{i=m+1}^{n} (x_i-b) \\} 
&=&  \sum_{i=1}^{m}(-x_i) + \sum_{i=m+1}^{n}x_i + (2m-n)b 
\end{eqnarray}
$
となる。
・$x_1 \leq x_2 \leq \cdots \leq x_m \leq x_{m+1} \leq \cdots \leq x_n$より、$m=n/2$すなわちソート後の中央値で最小となる。

```main.cpp
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <cmath>
#include <set>
#include <sstream>
#include <bitset>
#include <stack>
#include <cstdlib>
#include <utility> //pair

#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define REP(i,n)  FOR(i,0,n)

typedef long long ll;

using namespace std;

int main() {
    
    ll n;
    cin >> n;
    
    vector<ll> a(n);
    
    FOR(i, 0, n){
        cin >> a[i];
        a[i] = a[i] -(i+1);
    }
    
    sort(a.begin(),a.end());
    
    ll b,b1,b2;
    ll ans=0;
    ll ans1=0,ans2=0;
    if(n%2!=0){
        b = a[n/2]; //中央値
        FOR(i, 0, n){
            ans += abs(a[i]-b);
        }
    }else{
        b1 = a[n/2];
        b2 = a[n/2-1];
        FOR(i, 0, n){
            ans1 += abs(a[i]-b1);
            ans2 += abs(a[i]-b2);
        }
        ans = min(ans1,ans2);
    }
    
    cout <<  ans <<  endl;
    
    return 0;
}

```
#あとがき
精進します．
CUDDの簡単な利用例: BDD構造の幅優先探索

# TL; DR
- ランダムな論理関数を作成できるようになった
- BDD/ZDD/ADDのノードを表しているC言語側の構造体__DdNode(のポインタ)__を利用して、BDD構造を走査したい
- とりあえずqueueとstackを利用すれば幅優先・深さ優先探索ができる
- 優先探索からやってみる。


# 前提
- 実装済みのランダムな論理関数がBDDで返ってくる関数を__random_function__という名前で再利用
- DdNode*からBDDを作る場合は以下の形で可能（効率が良い/悪いまでは気にしない）

```cpp
Cudd mgr;
DdNode* n = (何らかの内部構造へのポインタ)
BDD b = BDD(mgr, n);
```

- あるノードから0枝（点線）と1枝（実践）を辿った先のノードはそれぞれC言語側の関数__Cudd_E__と__Cudd_T__で取得できる

- あるBDDの節点bについて、その深さは関数__NodeReadIndex__で、子供に存在する節点数を__nodeCount__で取得できる

# 幅優先探索の実装

- 前提とqueueを利用して実装する

```cpp
#include <iostream>
#include <random>
#include <vector>
#include <queue>
#include <stack>
#include "cuddObj.hh"
#include "myutil.hpp" // random_functionが入っている

using namespace std;

int main() {
  Cudd mgr;
  const int N = 4;
  vector<int> pos;
  BDD f = random_function(N, &pos, mgr);

  // dot dump
  const vector<ADD> vec = {f.Add()};
  const char* iname[4] = {"x1", "x2", "x3", "x4"};
  const char* oname[1] = {"F"};
  auto fp = fopen("dot/random.dot", "w");
  mgr.DumpDot(vec, iname, oname, fp);

  // BFS
  queue<DdNode*> q;
  q.push(f.getNode());
  while (!q.empty()) {
    DdNode* n = q.front(); q.pop();
    BDD b = BDD(mgr, n);
    std::string name = b.IsZero() ? "F" : (b.IsOne() ? "T" : iname[b.NodeReadIndex()]);
    cout << name << ":" << b.nodeCount() << "," << b.NodeReadIndex() << endl;

    // put left & right child only when n is an nternal nodes
    if (!b.IsZero() && !b.IsOne()) {
      DdNode* l = Cudd_E(n);
      DdNode* r = Cudd_T(n);
      q.push(l);
      q.push(r);
    }
  }
  return 0;
}
```

# ランダム関数の例

![random.png](https://qiita-image-store.s3.amazonaws.com/0/7181/c826b4a8-0d81-5a87-6691-8b8f0814ff33.png)

# 出力の例

- おそらく合っている気持ちになる

```bash
x1:6,0             # 0x3a:root(x1)は自分以下に節点を6つ持つ
x2:4,1             # 0x3aの0枝側: x2は自分以下に節点を4つ持つ（0x36)
x2:3,1             # 0x3aの1枝側: x2は自分以下に節点を3つ持つ（0x39)
x3:3,2             # 0x36の0枝側： x3は自分以下に節点を3つ持つ（0x35)
T:1,2147483647     # 0x36の1枝側: T(=1)
x4:2,3             # 0x39の0枝側: x4は自分以下に節点を2つ持つ（0x31)
T:1,2147483647     # 0x39の1枝側: T(=1)
x4:2,3             # 0x35の0枝側: x4(0x31)
F:1,2147483647     # 0x35の1枝側: F(=0)
F:1,2147483647     # 0x31の0枝側: F(=0)
T:1,2147483647     # 0x31の1枝側: T(=1)
```
iosシュミレーターの周りの黒い部分を消す


![alt](https://user-images.githubusercontent.com/26253721/39765058-e8d0eae4-531b-11e8-9305-4c852f269517.png)

iosシュミレーターは無駄に大きくて使いづらいと思っていた。

<img width="404" alt="スクリーンショット 2018-07-04 21.03.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/131a7c5f-086a-3622-8f85-5854c35c32b4.png">

しかし、Window>Show Device Bezelでダイエット出来る！！！

ああ、素晴きかな
<img width="430" alt="スクリーンショット 2018-07-04 21.09.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/183835/4f66b600-3812-4b68-f088-2e7578354b32.png">
5分で政府統計すべてをcsvファイルで保存する

# やりたいこと
ディープラーニングに使う適当なデータが欲しい。日本政府が良さそうなデータを公開してるらしい。さくっとぜんぶ入手しよう！
# 環境
Ubuntu, CentOS
Python 2 / 3
# 準備
```console
$ pip install estat
```
# データを手に入れる！
* e-StatのappIDを手に入れる
政府統計の総合窓口e-Stat（ https://www.e-stat.go.jp/ ）を開く
* 画面右下の「新規登録」をクリック
* 仮登録したらメールが届くので本登録する
* e-Statの画面右下の「ログイン」をクリック
* **ここからが迷いやすい** 画面右上の「マイページ」をクリック
* 「API機能(アプリケーションID発行)」をクリック
こちらから( https://www.e-stat.go.jp/mypage/view/api )もたどりつけます...
* 「名称」と「URL」を入力して、「発行」ボタンを押すとappIDが表示される。すかさずメモる！
* あともう一息

```console
$ python
>>> import estat
>>> estat.download()
```

* appIDを聞かれるのでさっきメモったappIDを入力する
* あとはほっとけば大量の政府統計データが `~/estat/data-cache/` に保存されます

nltkと同じようにダウンロードできますね