OmniAICreator/Qiita-1.07M huggingface dataset:
Scala-PlayFramework2.5で2.2時代のtodolistチュートリアルをやってみた・その１

# きっかけ
Scala-PlayFrameworkを以前ちょこっとやったことがあって、最近また久しぶりにやってみようかなと思った時に、とりあえず当時やったチュートリアルをまたやれば記憶を呼び起こすきっかけになるかなと思った。

# ところが
[Playのドキュメントサイト](https://www.playframework.com/documentation/ja/2.4.x/Home)を見てみると、当時やったチュートリアルが無くなっていた。Playのドキュメントサイトはバージョンごとにページが別になっているのでバージョンを遡って確認してみると、どうやら[2.2.x](https://www.playframework.com/documentation/ja/2.2.x/Home)までは存在していて[2.3.x](https://www.playframework.com/documentation/ja/2.3.x/Home)以降に無くなっているっぽい（チュートリアルは外部リンクに変わっていた）。

# それでも
意地でもやりたくなってきたので、Play自体は最新のバージョンを使いつつ、2.2のチュートリアルをやってみた。

# やってみた環境
- Windows7 Professional
- JDK 1.8

# 準備作業
## Activaorのインストール？
まずは実行環境作り。`Play`自体は最新バージョンを使いたい。[Playドキュメントの最新バージョン](https://www.playframework.com/documentation/ja/2.4.x/Installing)を見るとまずは`Typesafe Activator`をダウンロードしろと書いてあるが、そのリンクをクリックするとTypesafe社のサイトではなくLightbend社のサイトが開く（社名変更したらしい）。そしてそこには「`Activator`はもうすぐEOLになりますよ、代わりに`sbt`コマンドを使ってね」と書いてある。
## sbtのインストール
なので[sbtのサイト](http://www.scala-sbt.org/index.html)へ行き、Windows版をダウンロード。ダウンロードされたバージョンは0.13.15。
## プロジェクトの作成
さっきの`Activator`のページに説明によると、0.13.13以降の`sbt`では`giter8`テンプレートによってプロジェクトを作成するらしい。ご親切にテンプレート一覧へのリンクも貼ってあったので[それ](http://www.scala-sbt.org/index.html)を参考にし、テンプレートは`playframework/play-scala-seed.g8`をチョイス。C:ドライブにscalaフォルダを作成し、そこでコマンドを実行。

```
C:\scala>sbt new playframework/play-scala-seed.g8
```
いろいろダウンロードされるのでひたすら待つ。
プロジェクト名を聞いてくるので「todolist」と入力。以降の質問は全てENTERだけ押してデフォルトに。

```
name [play-scala-seed]: todolist
organization [com.example]:
scala_version [2.11.11]:
play_version [2.5.14]:
scalatestplusplay_version [2.0.0]:
```
再度ひたすら待つとテンプレートが作られた。

```
Template applied in .\todolist
```
作られたtodolistフォルダの中に入り、`sbt`コマンドを実行。

```
C:\scala\todolist>sbt
```
二度ひたすら待つことは三度ひたすら待つ。$プロンプトが出たらrunコマンドを実行。

```
[todolist] $ run
```
やっぱりひらすら待つ。ようやく`Server started`と表示されるのでブラウザからアクセスして確認。
![welcome-to-play.PNG](https://qiita-image-store.s3.amazonaws.com/0/181011/7852abd4-70d7-04e2-bfc5-0d6df3938edb.png)
これでようやく準備完了。

[その２](http://qiita.com/12345/items/e5de0a7a9a67d70e74b1)へつづく。
どこでもアプリルートからの相対パスでrequireできるnpmモジュール

https://github.com/tilfin/reqroot の紹介

### 背景
ある程度大きな Node.js アプリになると、モジュールの **require** で `models/aaa` から `require('../utils/foo')` や `routes/bbb` から `require('../models/entry')` のような指定が増えてきて、深いといくつ上の階層に戻るかわかりづらくかったり、リファクタリングで階層が変わると書き換えが面倒になります。

### reqroot モジュール
そこで `require('../utils/foo')` のような代わりに `reqroot('utils/foo')` とアプリルートからのパスでどこからでも読み込めるモジュール [reqroot](https://github.com/tilfin/reqroot) （読み方:リクルート）を作りました。既存の同機能のモジュールはありましたが、毎回そのモジュール自体を require しなくてはならず、`global.reqroot` としてグローバルに使えるところが異なります。

### 設定
* node が最初に読むメインモジュールの先頭で `require('reqroot');` する。
* テスト時も効くように `"test": "mocha -r reqroot"` とpackage.jsonに定義する。

### 補足
全ての require を置き換えるのではなく、背景の例のようにアプリ直下の各モジュールツリーに対して別のツリーのモジュールを呼び出すところだけ使うと良いでしょう。
Perlのこの特殊変数の意味は？

というときは`perldoc -v`を使う。
全部見たいときは`perldoc perlvar`から探しても良い。

# 例

```
$ perldoc -v '$!'
    $OS_ERROR
    $ERRNO
    $!      When referenced, $! retrieves the current value of the C "errno"
            integer variable. If $! is assigned a numerical value, that value
            is stored in "errno". When referenced as a string, $! yields the
            system error string corresponding to "errno".

            Many system or library calls set "errno" if they fail, to indicate
            the cause of failure. They usually do not set "errno" to zero if
            they succeed. This means "errno", hence $!, is meaningful only
            immediately after a failure:

                if (open my $fh, "<", $filename) {
                            # Here $! is meaningless.
                            ...
                }
                else {
                            # ONLY here is $! meaningful.
                            ...
                            # Already here $! might be meaningless.
                }
```

# 参考

[perldocべんりってはなし \- Qiita](http://qiita.com/karupanerura/items/53f0a5a8e38345f4ede3)
Rを用いた二項分布B(n,p)のnの推定

## 何をするか
ベイズ統計を用いた二項分布B(n,p)のnの推定をRを使ってします。

## 二項分布 B(n,p) 推定の歴史
二項分布B(n,p)では歴史上、pに興味がある場合が多かった。一方パラメータnに興味があるケースは稀であり、あまり研究は進んでいない。さらに、推定量の構成が難しく、漸近正規性をもたない場合がある。

頻度論的アプローチでは近年DasGupta and Rubin(2005)「Estimation of binomial parameters when both n, p are unknown」において順序統計量と期待値などを組み合わせて、安定性の高い推定量の構築と漸近分布の導出を行っている。

ベイズ統計学を用いたアプローチも存在しRaftery(1988)「Inference for the binomial N parameter: A hierarchical Bayes approach. 」でベイズ統計を用いた推定量の構築と事後分布の構成を行っている。

本ページではベイズ統計を用いた手法のコードを書く。

## コード

```
#nの信頼区間構成、通常
nn.def<-1000
pp.def<-0.5
NN.def<-10
nn.max.def<-nn.def*3
a.error<-0.05

#観測の生成、平均、分散、最大値
mm.obs<-rbinom(NN.def,nn.def,pp.def)
plot(mm.obs)
mean(mm.obs);var(mm.obs)
mm.sum<-sum(mm.obs)
mm.max<-max(mm.obs)

#nnのサポート生成
nn.min<-mm.max
nn.max<-nn.max.def
nn.vec<-nn.min:nn.max

#事後分布
##choose
lchoose.vec<-rep(0,length(nn.vec))
for(ii in 1:NN.def){
	lchoose.vec<-lchoose.vec+lchoose(nn.vec,mm.obs[ii])
}
##beta
lbeta.vec<-lbeta(mm.sum,NN.def*nn.vec-mm.sum)

#propto
L.nn.propto<-lchoose.vec+lbeta.vec
plot(exp(L.nn.propto))

##確率に書き直す
gg<-exp(L.nn.propto-max(L.nn.propto))
nn.posterior<-gg/sum(gg)

nn.posterior.cumsum<-cumsum(nn.posterior)
nn.interval.min<-max(which(nn.posterior.cumsum<(a.error/2)))+mm.max
nn.interval.max<-min(which(nn.posterior.cumsum>(1-a.error/2)))+mm.max

plot(nn.vec,nn.posterior,type="l")
abline(v=nn.def)
abline(v=nn.interval.min,col=2)
abline(v=nn.interval.max,col=2)
```

##出力結果
黒線が真のn,赤線が両側95％信用区間です。それっぽく見えますが、裾が非常に重たく、サンプル数が多くないとうまくいきません。
画像1は裾がはやめに落ちてますが、画像2は裾が重たく、信頼区間の計算にも失敗しています。


![fig.png](https://qiita-image-store.s3.amazonaws.com/0/138352/78afe7ed-401b-e5b0-45f9-94d1f8061cc9.png)

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/138352/02a4714e-aa13-95e6-1a71-7e42793e8ceb.png)


##結論
B(n,p)から十分多くの観測があれば推定が安定するが、少ないときわめて不安定という問題は結構ついて回ります。
する機会はあまりないと思いますが、かなり注意して扱う必要があります。
Github API | 二段階認証を設定しているアカウントから利用する

二段階認証を設定していると、正しいパスワードを入力しても認証が出来ない。

```
curl -u YumaInaura https://api.github.com
```

```bash
$ curl -u YumaInaura https://api.github.com
Enter host password for user 'YumaInaura':
{
  "message": "Must specify two-factor authentication OTP code.",
  "documentation_url": "https://developer.github.com/v3/auth#working-with-two-factor-authentication"
}
```

# トークン作成

https://github.com/settings/tokens からトークンを作ってしまうのが早そう。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/1b5a0daa-6498-9fea-a05e-1d7b2247bb62.png)

# 再実行

`curl -u YumaInaura:[発行されたトークン] https://api.github.com`

# 結果

応答あり。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/01a56eda-513f-91de-146e-0a64b19100f1.png)



# 参考

- [Other Authentication Methods | GitHub Developer Guide](https://developer.github.com/v3/auth/#working-with-two-factor-authentication)








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
QiitaにUMLを載せられるようにPlantUMLつかってWebサービス作ろうと思ったら本家にあった話

## はじめに
仕事ではPlantUMLを使っています。GitLabの場合は、コードを書けば図に変換して表示してくれるので便利です。しかしQiitaではそうもいかないので、PlantUMLで書いたコードを図に変換してくれるサーバーを書こうかと思っていました。

...ら、本家に既にありました。

## PlantUML Server
- http://www.plantuml.com/plantuml

<img width="695" alt="スクリーンショット 2017-05-15 23.22.03.png" src="https://qiita-image-store.s3.amazonaws.com/0/111801/19b8d68c-5187-15a1-7f34-98aacb6dbebb.png">

## まずURLを取得
- http://www.plantuml.com/plantuml にアクセス
- PlantUMLでUMLを書く
- View as PNG / View as SVG からリンクをコピー

## 下記のようにQiitaに記載
- コピーしたURL : `http://www.plantuml.com/plantuml/{format}/{ENCODED}`
- `format` : `svg` とか `png` とか
- `ENCODED` : 書いたコードをハッシュしたようなもの

```text
[![alt](http://www.plantuml.com/plantuml/{format}/{ENCODED})](http://www.plantuml.com/plantuml/uml/{ENCODED})
```

### サンプル
```text
[![alt](http://www.plantuml.com/plantuml/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)](http://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)
```

## 結果
- こうなる
- 画像をクリックすると本家に飛んで、元のコードが見れる
- URLはコードのハッシュなので、コードを変更するとURLも変わる点に注意
- ハッシュではあるものの、履歴も一応残せる

[![alt](http://www.plantuml.com/plantuml/svg/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)](http://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000)

## 2017/05/18　追記

こんなもの作りました。
[QiitaにUMLを貼れるようにChrome拡張機能を作った - Qiita](http://qiita.com/ryskiwt/items/06c1322ebae8af376f7a#_reference-4d1bc8ba718333c07d0e)
mac上の仮想環境に構築したcentos7にapahceを導入する


##centos7の環境にapacheを導入する

###やりたいこと
vagrant+virtualbox+centos7の環境をmac上に構築して、仮想環境の中にLAMPの実行環境を設定します。
今回はhttpサーバーであるapacheを導入します。

インストールはyumを使ってインストールします。

```
[vagrant@localhost bin]$ sudo yum install httpd httpd-devel

[vagrant@localhost bin]$ httpd -v
Server version: Apache/2.4.6 (CentOS)
Server built:   Apr 12 2017 21:03:28
```


##ドキュメントルートの確認とサンプルファイルの配置
導入したapacheの動作確認をします。ディフォルトではhttpd.confファイルは以下の場所に配置されています。

```
/etc/httpd/conf/httpd.conf
```
このファイルを見るとapacheのドキュメントルートは以下の場所になっています。

```
/var/www/html
```
このディレクトリに動作確認用のファイルを作成します。今回は合わせてPHPの動作確認も行うため下記のファイルを作成して配置しました。
ディレクトリはrootユーザーにて作られていたのでsudoコマンドを利用してroot権限でファイルを作成します。

```index.php
<?php
phpinfo();
?>
```

##ファイアウォールの設定追加
CentOS7ではディフォルトでファイアウォールが起動しています。この定義にhttpは登録されていないのでホスト側からゲスト側に接続できません。定義を追加します。

ファイアウォール通過の設定の確認

```
[vagrant@localhost]$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client ssh
```
dhcpv6-clientとsshだけが通過を許可されています。
ここにhttpを追加します。

```
[vagrant@localhost]$ sudo firewall-cmd --add-service=http --zone=public --permanent
success
```

追加できました。
確認します。

```
[vagrant@localhost]$ sudo firewall-cmd --list-services --zone=public --permanent
dhcpv6-client http ssh
```

無事追加できていました。この後、ファイアウォールを再起動すると反映されます。

```
sudo systemctl stop firewalld
sudo systemctl start firewalld
```

ホスト側のブラウザからアクセスして見ます。
http://localhost:8080/index.php
（今回の環境は仮想OS側はNATでホスト側とつながっていて、ポートフォワーディングを利用してホスト側8080ポートを仮想側80へ転送しています）

![スクリーンショット 2017-05-12 13.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/89268/f3f22649-1fb2-902a-1a29-9421df434175.png "スクリーンショット 2017-05-12 13.01.21.png")
指定したページが表示できました。（ついでにPHPの動作も確認できました。）

## 参考
macOS Sierra バージョン10.12.4
Vagrant 1.9.4
VirtualBox 5.1.22
CentOS 7.0 64bit
Apache 2.4.6

***
## シリーズ一覧 (vagrant centos LAMP環境構築）
1.[macにvagrantでcentos7の仮想環境を構築したときの初期設定](http://qiita.com/saboten10/items/40a1331b69536534b7dc)
2.[mac上の仮想環境に構築したcentos7にPHPを導入する](http://qiita.com/saboten10/items/7026539e47093a62673c)
3.[mac上の仮想環境に構築したcentos7でPHPのビルトインサーバーを利用する](http://qiita.com/saboten10/items/e916bd2cd33c059f266b)
4.[mac上の仮想環境に構築したcentos7にapahceを導入する](http://qiita.com/saboten10/items/4bf506c81b5eed3aae78)
5.[mac上の仮想環境に構築したcentos7にmysqlを導入する](http://qiita.com/saboten10/items/298e884c953255708a61)
6.[centos7に導入したMySQL5.6の初期設定と動作確認](http://qiita.com/saboten10/items/4d2c79d507d1eae00d1b)
Haskellのキモいフィボナッチ数列がやっと理解できたからこれでもかという程に細かく説明してみた #Haskell

#`fib = 0 : 1 : zipWith (+) fib (tail fib)`

[こちらの記事](https://chomado.com/programming/haskell/haskell-キモいフィボナッチ数列の解読を試みる/)で紹介されていた **キモいフィボナッチ数列**がやっとの事で理解できたので, これ見よがしにドヤ顔で解説をしたいと思います.
ただ, 僕はこれを理解するので精一杯な初心者ですので, もし間違いやより良い表現等があれば教えて頂けると幸いです.


##まずは見てみる

まず問題のフィボナッチ数列はこちら

```hs:fib.hs
fib :: Num a => [a]
fib = 0 : 1 : zipWith (+) fib (tail fib)
```

ここで注意して頂きたい点があります.
この`fib`ですが, このままだと動作しません. 実は僕は最初ここで躓いてしまい, これより先に進む事ができませんでした. ~~雑魚とか言わないで~~
この`fib`というのは, **関数ではなく定数**です(引数を取らない関数である多相定数というやつなのかなーと思っていますが, 多相定数が何なのかイマイチ理解できていません. [~~教えてエロい人!~~](http://dic.nicovideo.jp/a/教えてエロい人)).
再帰的に定義をしていますし, いつもの関数定義のような形で書いているのでパッと見関数っぽいですが, 定数です.


##じゃあ中身は一体どうなってるのさ

`fib`の中身は無限リストになっています. 
Haskellでは, その値が本当に必要になるまで評価を行わない**遅延評価(lazy evaluation)**が採用されています. 無限の長さのリストが扱えるのは, LazyなHaskellだからこそできる芸当ですね. どこぞの軽音楽部とは違います
> *はすける「Please say me "You are lazy!"」*

話を元に戻しましょう. 
無限リスト`fib`の中から値を取り出したい場合は, リストの先頭から`n`個の要素を取り出したリストを返す関数`take n`を用いて,

```hs:fib.hs
print $ take 20 fib
```
```hs:実行結果
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181]
```

このように, フィボでナッチなリストを, あなたのメモリと整数型の上限値が許す限り取り出すことができます.

##いよいよ解読開始

ではまず定義を改めて確認していきます.

```hs:fib.hs
fib :: Num a => [a]
fib = 0:1:zipWith (+) fib (tail fib)
```
`fib :: Num a => [a]`というのは単純で, **`fib`はNum型クラスの任意のインスタンス`a`のリストを返します**, という意味になります.

`0:1:`というのは`[0, 1]++`(リスト[0, 1]と, その後ろのリストを連結する)と同じ意味です.

関数`zipWith`は二引数関数f, リストa, bを引数に取り, a, bの要素を先頭から順にfで合成したリストを返す関数です. 
例えば`zipWith (+) [1, 2, 3] [4, 5, 6]`だと,

```hs:zipWith
[1, 2, 3]
 +  +  +
[4, 5, 6]
 ↓  ↓  ↓
[5, 7, 9]
```
のようになり, `[5, 7, 9]`を返します.

要するに, `fib`は, **[0, 1]というリストに, `fib`と`tail fib`の各要素をそれぞれ足したリストを連結した無限リスト**です

`fib`の初期段階で分かっている要素は`[0, 1...]`
`tail fib`の初期段階で分かっている要素は`fib`から先頭要素を除いた`[1...]`

もうお気付きの方も多いかと思いますが, その通りです. この無限リストは, **フィボナッチ数列の最初の2つの要素に, それをずらした数列2つの要素を足し合わせたリストを連結したもの**になっています. 
フィボナッチ数列は先頭2つの要素さえあれば後は分かりますから, これで求める事が出来るのです.

##これ見よがしの解説

まずは第1段階です. 
上に並んだ2つが

```hs:第1段階
fib         [0, 1...]
             +  +
tail fib    [1...]
             ↓
fib [0, 1]++[1...]
```

3番目の要素が1である事が分かったので, リストの末尾に追加します.

```hs:第2段階
fib         [0, 1, 1...]
             +  +  +
tail fib    [1, 1...]
             ↓  ↓
fib [0, 1]++[1, 2...]
```
4番目の要素が2である事が分かったので, リストの末尾に追加.

```hs:第3段階
fib         [0, 1, 1, 2...]
             +  +  +  +
tail fib    [1, 1, 2...]
             ↓  ↓  ↓
fib [0, 1]++[1, 2, 3...]
```

5番目の要素が3である事が分かったので(ry

```hs:第4段階
fib         [0, 1, 1, 2, 3...]
             +  +  +  +  +
tail fib    [1, 1, 2, 3...]
             ↓  ↓  ↓  ↓
fib [0, 1]++[1, 2, 3, 5...]
```

6番目の要素が5である(ry

```hs:第5段階
fib         [0, 1, 1, 2, 3, 5...]
             +  +  +  +  +  +
tail fib    [1, 1, 2, 3, 5...]
             ↓  ↓  ↓  ↓  ↓
fib [0, 1]++[1, 2, 3, 5, 8...]
```

よって, 以下のようなリストになります.

```hs
[0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597,2584,4181...以降無限に続く
```

##以上です

Haskellを思い通りに書けるようになりたいけど, 読むのが精一杯でいざ実装しようとなると全く書き方(文法ではなく考え方)が分からない今日此の頃. 誰か何かおすすめの方法等あれば教えてください.
システム開発の際に用意すべき環境

# 序

今までシステム開発に携わってきて考えた事。開発時に使用する環境から、リリース対象となる最終的な実運用環境まで、用意すべき環境についての私案です。

[ウェブ開発で大切な3つの環境: 開発・ステージング・プロダクション](http://qiita.com/suin/items/004679b27d4a1f8bcb36)というQiitaの記事を見つけました。開発とステージングと本番の3つの環境を用意しよう、というのは割とよく見る意見です。ある程度以上のプロジェクトだと、実際にこの3つを用意するのが普通でしょう。ただ、私が思うに、3つではちょっと足りない気がしています。

# 開発環境（ローカル環境）

上述のQiita記事 [ウェブ開発で大切な3つの環境: 開発・ステージング・プロダクション](http://qiita.com/suin/items/004679b27d4a1f8bcb36) では「開発環境は開発者によるテスト環境」と書かれていますが、一般的には、「開発者が自由に使えるローカル環境」を指す事が多いのではないでしょうか。

開発者が自由に使えるというのは、本当に文字通りです。下記のような条件を満たす環境を開発者ごとに用意して、ローカルとして通常の開発に使用します。

* 他の開発者と干渉しない
* 仮に再起不能なほど壊しても、誰にも迷惑を掛けない

ここで少々厄介なのがデータベースとハードウェア。

データベースを人数分用意する事は、用途を開発に絞ってしまえばそれほど大事ではありません。問題は、すべての開発者が同一の設定で別々のデータベースにアクセスできる仕組ですね。一工夫が必要ですが、やってやれない事もありません。ただ、テーブルスキーマの変更などがあった場合に全員で同期する段取りを用意するのがちょっと大変です。

そしてハードウェア。私はWeb系よりビジネス系のシステムに携わる事が多かったのでそちらを想定するのですが、例えば印刷機能があります。帳票印刷などビジネス系の基本中の基本。当然、プリンタを好きな時に好きなだけ使う必要があります。しかし開発者ごとに実際にプリンタを用意するのは非常に難しい。ただ、これも工夫は出来ます。最初にきちんと検討しておけば何とかなります。

# 検証環境（テスト環境）

どんなテスト環境を用意するかは工程の設計とも関わってきます。テストの何たるかについては、テストに関する理論を調べて下さい。

余談ですが、テストというと見下す技術者や顧客も時々いますけども、テスト専門の会社が存在するほど奥が深くてノウハウの必要な分野です。アメリカなんかだと仕様に関するコンサルティングまで業務範囲に入っているゲームのテストの専門会社もあるとか。それでなくても、品質管理においてテストは決して軽視できる分野ではありません。

…という知識を踏まえて、テストの為にどんな環境を用意すべきか。

単体テストに関しては、開発環境で済ませてしまうのが一般的だと思います。単体テストに必要なデータの用意が簡単なので。運用ルールで禁止されるけれども理論上は可能性を否定できないデータの組合せとか、そういう状況下でのテストをするには、どれだけ想定外の状況を用意しても誰にも迷惑を掛けない開発環境が最適なのです。また単体テストは開発者自身が実施するのが一般的なので、その点でも開発環境での単体テストは自然です。

問題は結合テストです。結合テストに関しては専用の環境を用意した方が良いでしょう。贅沢を言えば、テストメンバーの人数分だけ用意したい所です。まぁ結合テストならば、作業範囲を区切ってスケジュールを調整すれば、環境1つでやりくり出来る事が多いでしょう。

またテストを自動化する際にも、その為の独立したサーバが必要となります。

# ステージング環境

ステージングの意味等については、上述のQiita記事 [ウェブ開発で大切な3つの環境: 開発・ステージング・プロダクション](http://qiita.com/suin/items/004679b27d4a1f8bcb36) を参照して下さい。大事な用語を丸投げでナンですけど:sweat:

デモ環境とかレビュー環境とか言えばイメージは近い…かな？基本的にバグは取り切っていて、上司や顧客の最終確認の場になります。本番に近いデータを用意する事になりますが、機能確認の為に本番通りではないデータが仕込まれる可能性もあります。

# リハーサル環境

文字通り、リハーサルをする環境です。本番と全く同じ環境を用意して、本番と同じ状況で実行します。

特にシステム移行では重要視される工程です。但し私の経験上、普通のデバッグを含むリリース時にも、リハーサルを実施した方が良いような気がしています。せめてデータだけでも本番と全く同じものを使ってテストしていれば防げた事故というのが、たまに発生します。

ただ、本番データを流用するとなると、権限の関係でなかなか難しい事も多い。個人情報や企業秘密が絡んでくると、開発者やテスターの誰も彼もが自由に閲覧する訳にもいきません。そこが難しい所で、ある程度の妥協が必要になる点でもあります。

更に言えば、外部との連携機能を搭載している場合には一工夫の必要があります。

* 機能実行終了時にメール通知が発生する場合。本番と全く同じデータという事は、メールの宛先も本番と同じという事で…運用担当者だけならまだしも、大量の一般ユーザに不審なメールが届いてしまったら…
* FTP等々で外部のサーバにデータを転送する場合。設定も本番と同じだと、リハーサルのデータが外部の本番サーバに転送されてしまいます。気が遠くなるほど後始末が大変です。

こういうのは普通に大事故です。そうならないように、ネットワークの設定をいじるなどで対応しておく必要があります。

# 本番環境（プロダクション環境）

言わずと知れた、サービス提供の実運用を行う環境です。

本番環境は開発者ではなくて、システムを発注したお客様の所有物です。その上のデータは、開発者ではなくてお客様の財産です。うっかりミスでデータを改変してしまったなんてのは論外。データのコピーも慎重にやらなければなりません。リハーサル環境でも触れましたが、実は、下手すると契約にまで関わってくる大変な話だったりします。

そういう訳でなので、本番環境にアクセスできるメンバーは、かなり厳密にコントロールする必要があります。

# 結

以上、可能であれば用意しておきたい環境を、私の経験から考察して列挙してみました。

* 開発環境
* 検証環境
* ステージング環境
* リハーサル環境
* 本番環境

5種類ですね。昔はハードウェアを個別に用意する必要があったのでコストや設置場所が大変でしたが、最近は仮想環境の出現で非常に楽になりました。超軽量仮想環境も出現している昨今、少なくともLinuxに関しては渋る理由は薄くなったと言えるでしょう。個人の趣味プログラミングでも用意できるレベルです。
Rで複数項目に関するhistgramをいい感じに出力する方法 via pipeR

## ユースケース

以下のようなデータを持っているとしよう

<img width="570" alt="スクリーンショット 2017-05-15 19.36.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/172474/b2ebe0e7-1174-fb8f-312c-51452ebac6a9.png">

`flg`の値が0なのか1なのかによって、`x_i`の分布がどのように異なるのかをhistgramでみたい。
そういう場合に使って下さい。

#### イメージ
これは別のデータを用いたものですがこんな感じになります。
![resume_fixes_f.png](https://qiita-image-store.s3.amazonaws.com/0/172474/acb2431c-4f30-9837-f405-fb2466da7f1c.png)


## snipet

`data %>>% (.[, c("flg", "x_1")]) %>>% (~ (.[.$flg == 0,][,2]) %>>% (as.matrix(.)) %>>% (hist(., freq=T, col="#00FFFF40"))) %>>% (.[.$flg == 1,][,2] %>>% (as.matrix(.)) %>>% (hist(., freq=T, col="#FF00FF40", add=T)))`

特にimportするべきは`pipeR`くらいです。

### 1つずつ説明

`(.[, c("flg", "x_1")])`

ここで、`flg`と`x_1`の組だけ取ってくる

`(~ (.[.$flg == 0,][,2]) %>>% (as.matrix(.)) %>>% (hist(., freq=T, col="#00FFFF40")))`

ここで、pipeの1つの処理`(~ hoge)`の中にpipe処理が入ってる。
（頭に`~`がついているので、処理はこの中で完結し、後ろには上で2つの列にだけしたものが渡される）
更に見ていく。

`(.[.$flg == 0,][,2])`
ここで、`flg`の値が0の時の`x_1`の値のみ取り出している。

`(as.matrix(.)) %>>% (hist(., freq=T, col="#00FFFF40")))`
それをmatrixにし、histにぶち込む。
`col`属性で、色を指定。`#RRGGBBAA`形式（`AA`はalpha値）。

こんな感じで、1つめのhistgramの描画完了。

後半
`(.[.$flg == 1,][,2] %>>% (as.matrix(.)) %>>% (hist(., freq=T, col="#FF00FF40", add=T)))`

では、最後の`hist`の中に`add=T`を書き加えれば、新規のhistgram描画ではなく、前のところに書き加えてくれる。
PHP Carbonのtimezone表現

# 何
- timezone情報のついた日時文字列表現(ISO8601という？)をCarbonで取り扱う際のメモ

# 追記
- こちらもご覧ください。　https://qiita.com/hogesuke_1/items/6d887c5669adeb1d1b08

## 挙動
```test.php
    public function test_timezone()
    {
        //日本時間で初期化
        $tokyo = '2017-05-15T04:20:00+09:00';
        $c_tokyo = new \Carbon\Carbon($tokyo);
        $this->assertEquals('2017-05-15 04:20:00', $c_tokyo->format('Y-m-d H:i:s'));
        $this->assertEquals('2017-05-15T04:20:00+0900', $c_tokyo->format(DateTime::ISO8601));
        $this->assertEquals('+09:00', $c_tokyo->tzName);

        //UTC時間で初期化
        $utc = '2017-05-15T04:20:00Z';
        $c_utc = new \Carbon\Carbon($utc);
        $this->assertEquals('2017-05-15 04:20:00', $c_utc->format('Y-m-d H:i:s'));
        $this->assertEquals('2017-05-15T04:20:00+0000', $c_utc->format(DateTime::ISO8601));
        $this->assertEquals('2017-05-15T04:20:00Z', $c_utc->format('Y-m-d\TH:i:s\Z')); //Zの表現にしたいとき
        $this->assertEquals('Z', $c_utc->tzName);

        //日本時間からUTCに変換
        $c_tokyo2 = $c_tokyo->copy()->setTimezone('UTC');
        $this->assertEquals('2017-05-14 19:20:00', $c_tokyo2->format('Y-m-d H:i:s'));
        $this->assertEquals('2017-05-14T19:20:00+0000', $c_tokyo2->format(DateTime::ISO8601));
        $this->assertEquals('UTC', $c_tokyo2->tzName);

        //表現は変わるが時間差はない
        $this->assertEquals(0, $c_tokyo->diffInSeconds($c_tokyo2));
    }
```

## その他
- Carbonの、というよりはCarbonがラップしているDateTimeの、なのでしょう。
Gmail | メールを新規作成するショートカットは C

`C` を押すだけで 新規作成できる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/c63835b4-c21a-4f0b-a3ee-e0d070525e66.png)

以上。

# 備考

- こんなに大事なショートカットが 「Gmail 新規作成　ショートカット」 とかでググっても全然出てこないので記事を書いた。(調べようとして30回ぐらい挫折していた)
- よく見たらヘルプにも書いてあるけど分かりにくすぎる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/b03fe21d-b79c-efdf-e2a1-9a994f789620.png)










<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Material design iconを中央に配置したボタンを作成する


AndroidStudioには[Android Material Design Icon Generator](https://github.com/konifar/android-material-design-icon-generator-plugin)という、マテリアルデザインのアイコンを各dpi毎に生成してくれる便利なプラグインがあり、使っている人も多いのではないかと思います。

しかしいざ実践で使ってみると、デザイン的にはアイコンのサイズは`24dp`が良いのですが、ボタンやUIとしてタップ可能なエリアは`48dp`くらいにしたいという事があります。
ImageButtonを使えば同じことができますが、今回紹介する方法はImageButtonにかぎらずbackgroundとして使用できるので、ToggleButtonなどでも使えるので知っておいて損はありません。

以下のようなdrawableのxmlを作ることで、Viewの背景の中央に画像を表示することができます。

```xml:center_icon_favorite_background.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
    <shape>
        <solid android:color="@color/colorAccent"></solid>
    </shape>
</item>
<item
    android:gravity="center"
    android:drawable="@drawable/ic_favorite_border_white_24dp" >
</item>
</layer-list>
```
`layer-list`を使用して背景のshapeと一つのdrawableを重ねています。
また`gravity="center"` を指定することでアイコン画像を中央に配置しています。

実際にこのdrawableを背景にすると以下のようなUIになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/18273/36424222-02bf-7561-4cc9-f1c414feb1d5.png "image.png")

layout.xmlは以下の通りです。

```xml
<LinearLayout
    android:orientation="vertical"
    android:layout_width="368dp"
    android:layout_height="495dp"
    >
    <Button
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:background="@drawable/center_icon_favorite_background"
        android:layout_marginBottom="10dp"
        />
    <Button
        android:layout_width="148dp"
        android:layout_height="48dp"
        android:background="@drawable/center_icon_favorite_background"
        android:layout_marginBottom="10dp"
        />
    <Button
        android:layout_width="148dp"
        android:layout_height="148dp"
        android:background="@drawable/center_icon_favorite_background"
        />
</LinearLayout>
```

小さなアイコンを使いつつタップ範囲を広く持っておくことは、デザインとUXの両立をする上で必要なことだと思います。専用の画像を作ってもよいですがせっかく素晴らしいマテリアルアイコンが使えるので、できるだけマテリアルアイコンで済ませていきたいですね。
Promise再入門① ~Promise基本編~

# 概要

PromiseはモダンJSでコーディングする際の肝の1つです。
Promiseを制するものが、モダンJSを制するものと言っても言い過ぎではないと思います。

ES7では、いよいよasync/awaitが実装されます。
今まで感覚で使っていた部分もあるPromiseを再度学習し直そうと思います。

# Promiseとは

* 非同期の処理を分かりやすく制御するオブジェクト
* ES6に追加された機能の1つ
* IE対応用のPolyfillも完備

# Promiseの使い方

* Promiseはnewして使う。
*  Promiseオブジェクトの**第1引数は必ず関数**
  * Promiseの第1引数の関数はは **成功時の処理** と **失敗時の処理** を実行する引数(関数)を取得できる。
    * 成功 -> resolve(渡したい値)
    * 失敗 -> reject(渡したい値)
* newされたPromiseは以下の関数を持つオブジェクトを返す
  * ```then(onFulfilled,onRejected),catch(onRejected)```
  * thenでresolveされた時の処理、catchでrejectされた時の処理を受け取る
    * thenもcatchも引数を持つ関数を引数に取る
  * catchはエラーの処理が明確になるだけでなく、複数の非同期処理のエラーをまとめて制御する為にも使用される
    * 基本的には、catchを使って失敗時の処理を記述する

```js

const promise = new Promise((resolve, reject) => {
  window.setTimeout(() => {
    resolve('OK');
  }, 2000);
});

promise
  .then((result) => {
    console.log(result);
  })
  .catch((error) => {
    console.log(error);
  });
```

# Promiseパターン

## Promiseを使って同期的に処理

* thenの中でPromiseを返せば、さらにthenを続けて記載する事が可能
* 今回の例では、同期的に処理される。
    * func1の非同期処理の完了後、func2がコールバックされて、func2の非同期が完了後、次のthenに移っている。
    * Promiseを返さなければ、並列で処理されるthenとなる

```js

const func1 = (num) => {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve(num);
    }, 3000);
  });
};

const func2 = (num) => {
  return new Promise((resolve) => {
    window.setTimeout(() => {
      resolve(num * num);
    }, 2000);
  });
};

func1(2)
  .then(func2)
  .then((result) => {
    console.log(result);
  })
  .catch((e) => {
    console.log(e);
  });
```

* コールバック地獄が容易に想像出来るが下記の様な書き方も可能

```js

...

func1(2)
  .then((res1) => {
    func2(res1)
      .then((res2) => {
        console.log(res2);
      });
  });

```

## Promiseを使って並列処理して完了を検知する

* 複数の非同期処理を並列で実行し、全てが完了したら情報を取得する
  * 非同期のメリット
* ```Promise.all([Promise, Promise...])```を使って、非同期な処理を並列で行い、全てがresolveになるタイミングでthenを取得する。
* 並列処理しているもので1つでもrejectがあれば、catchされる。

```js

const func1 = (num) => {
  return new Promise((res) => {
    window.setTimeout(() => {
      res(num + num);
    }, 500);
  });
};

const func2 = (num) => {
  return new Promise((res, rej) => {
    window.setTimeout(() => {
      rej(num * num);
    }, 2000);
  });
};

Promise.all([
  func1(2),
  func2(3)
])
.then((results) => {
  console.log(results);
})
.catch((e) => {
  console.log(e);
});
```

## 1つでも処理が返ってきたら実行する

* ```Promise.race([Promise, Promise...])```を使う事で、resolveもcatchでも何かしら処理が返ってきたら次の処理(thenやcatch)を実行する様に出来る。

```js

const func1 = (num) => {
  return new Promise((res) => {
    window.setTimeout(() => {
      res(num + num);
    }, 500);
  });
};

const func2 = (num) => {
  return new Promise((res, rej) => {
    window.setTimeout(() => {
      rej(num * num);
    }, 2000);
  });
};


Promise.race([
  func1(3),
  func2(3)
])
.then((res) => {
  console.log(res);
})
.catch((e) => {
  console.log(e);
});
```

# 終わり

今回は基本編という事で、Promiseオブジェクトの最低限の知識をまとめました。
次回は、ES7で実装されるasync/awaitを使って、より柔軟にPromiseを使って見たいと思います。
Github | Github Page で Markdown の記事を書いてみよう

# Github page とは

- Github レポジトリからダイレクトにホスティングをしてくれる仕組み
- サイトの中身は全部自分で作る必要がある
- Github 上のインターフェースからファイルを作成・編集すれば、多少はブログっぽくにも使うことができそう

# 良いところ

- サービス終了の可能性が極めて低そう
  - Github のサービスなので、git自体が無くなりでもしない限り続くんじゃないだろうか

# 悪いところ

- 既成のブログサービスみたいに「いいね」できないので、モチベーションを上げるものがない
- Qiitaみたいなプラットフォームではないので、記事を作っても、必ず誰かに読まれるわけではない
- Github 上のファイル新規作成機能を使うと、インターフェイスがイマイチ
  - スクリーンショットがコピペで貼れない
  - リアルタイムのプレビューが出来ない

# 手順

## レポジトリの作成

`username.github.io` というフォーマットでレポジトリを作る。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/8147c58b-3778-535e-06a4-67d1d586ce45.png)


## ファイルの追加

ここでは Github上のインターフェイスからファイルを追加してみる。

**Code** > **Create new file** 

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/bcf877b3-473d-52db-5a7a-7b85b3a192ed.png)

## Markdown

ファイル拡張子を `.md` にして Markdown で書いてみる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/aa97f429-868c-b72d-9196-5f10745c6e1e.png)


# スクリーンショット ( クリップボードに保持されている画像の貼り付け )

Mac の `Command+V` での貼付けは出来ないっぽい。

仕方ないのでいったん Issue にアップロードしてから

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/4a449501-b868-51d9-bc52-3eb7bf6b3f1a.png)

それを編集フィールドにコピペしてみる。

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/866d6a7d-65cf-0362-ae52-d0ae36435aee.png)

## アクセス

`https://[username].github.io/` にアクセスすると `index.md` の内容が反映されている。

(pushから反映まで30秒ぐらいかかった)

![image](https://qiita-image-store.s3.amazonaws.com/0/89618/ccf400ba-ecb6-3a61-2e5e-0bc8995dfe95.png)

# 参考

- [What's the best blogging platform for programmers? - Quora](https://www.quora.com/Whats-the-best-blogging-platform-for-programmers)

>I would suggest the GitHub Page. You can use Jekyll, Bootstrap, etc, to build your blog. It has fully markdown support, you can use VI to edit your blog easily, which can highlight everything you want. However, if you want a online dashboard, github is not a good choice, though it really has a dashboard.








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
macOSのプロンプトにGitのブランチ名を表示する

コマンドラインでGitのブランチ名が見えているとなにかと便利なので。

```bash:.bash_profile
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-completion.bash
source /Applications/Xcode.app/Contents/Developer/usr/share/git-core/git-prompt.sh

PS1='\[\e[1;36m\][\h: \W]$\[\e[1;32m\]$(__git_ps1)\[\e[0m\] '
```
<!--
ブランチ名の部分だけ色を変えたい場合は

```bash
PS1='[\h: \W]$\[\e[1;32m\]$(__git_ps1)\[\e[0m\] '
```
という感じで。
-->

## 結果

ブランチ名が表示されました。
これでコミット先のブランチを間違える可能性が減りますね。

![git_prompt.png](https://qiita-image-store.s3.amazonaws.com/0/169798/621b2b1e-608f-3542-22e3-0a3f6c1d80ed.png)

## こちらを参考にしました
http://qiita.com/fernet/items/4dcb6f82520d87227121
http://qiita.com/calpo22/items/8ce258e1f03453a86609
デフォルトでインストールされるAndroidSDKToolsと別のバージョンのAndroidSDKToolsを入れたい時

Cordovaのビルドを行う際、古いAndroidSDKToolsが必要だったので、その方法のメモ。

http://stackoverflow.com/questions/9555337/how-to-downgrade-my-sdk-version

このStackOverflowにある通り、一度AndroidStudioをインストール後、**toolsディレクトリをリネームし古いAndroidSDKToolsを放り込めば動く。**

古いAndroidSDKToolsは、

http://dl-ssl.google.com/android/repository/tools_r22.6.2-macosx.zip

のURLを適宜いじればダウンロードできる。バージョン番号は https://developer.android.com/studio/releases/sdk-tools.html を参照すること。

○余談
AndroidSDKTools 25.3.0からandroidコマンドなどの機能が削られている（別のコマンドに置き変わるらしい）ので、cordovaアプリのビルドなどをしようとした時ハマった。ご注意ください。
LPIC Lv1 学習日記

本日から 「LPICレベル1 スピードマスター問題集」を使った学習日記(チラシ裏レベル)をつけていくことにする。

とりあえず今日は33ページまでは舐めてみた。
この本は中々内容が濃い…

今日の感想

> /dev/null 2>&1
と
> /dev/null 1>&2
の違いがいまいちわからない！
jQuery UIのSortableをTableで使用した際の横幅縮小を解消する方法

### 何が問題か

Sortableは、Tableタグでドラッグした際に横幅が小さくなる現象が発生します。
Tableタグ以外を使えばいいのですが、結構Tableで組みたいことも多いと思います。
そこで、Tableタグで横幅が小さくなる現象を解消します。

### 実装

これを入れれば解決

```js
$(function(){
	function fixPlaceHolderWidth(event, ui){
		// adjust placeholder td width to original td width
		ui.children().each(function(){
			$(this).width($(this).width());
		});
		return ui;
	};
	
	$('.sortable').sortable({
		placeholder: 'ui-state-highlight',
		start: function(event, ui){
			ui.placeholder.height(ui.helper.outerHeight());
		},
		helper: fixPlaceHolderWidth
	});
});
```

### デモ

https://codepen.io/qwe001/pen/QvxaBz
Googleクラウドサービスを利用して時間指定メール送信システムを作る（その１）

***
＜[前へ]()＞　＜[次へ](http://qiita.com/matsuhandy/items/ffb717bfb07417c05e4e)＞
　誰でも使えるGoogleのサービスを使って作ってみます。
***

#1. はじめに
　Google Apps Script・Google Form・Google Spreadsheet・Google Documentを活用して，サーバサイドアプリケーションを作ってみます。課題は「時間指定メール送信システム」です。

#2. 時間指定メール送信システムのソフトウェア構成
　Google Formを入力インターフェース，Google Spreadsheetをデータベース，Google Documentを実行ログやデバッグに使って，Google Apps Scriptで時間指定メール送信システムを作成しつつ，GASを学んでみたいと思います。以下，フォーム，スプレッドシート，ドキュメント，GASと表記します。

![画像2.png](https://qiita-image-store.s3.amazonaws.com/0/146927/2f6cfb09-a62a-7d1f-496d-a926050d2320.png)

* 上の図のような構成になります。

1. フォームをメール入力用のUIとします（①）。
1. フォーム入力を完了後，フォームに紐付けられたGASプログラムが自動実行（②）され，入力内容確認メールを返します（③）。指定日時までメールは送信されませんから，まだメールの内容を修正する時間的余裕があります。修正用のURLもメール中に入れておきます。
1. フォーム入力と同時に，メール送信記録として，スプレッドシートに内容を貯めていきます（④）。
1. スプレッドシートにデータが入力されると同時に，GASプログラムが自動実行され，最後に入力されたメール送信データをmailフォルダに保存します。後で扱いやすいように，ファイル名は送信日時としておきます（⑥）。
1. タイムベース実行されるよう設定した関数（①1min）で，例えば1分ごとにmailフォルダの中を検索し，ファイル名と現在時間を比較します（②1min）。
1. 送信時刻を過ぎているファイルについて，中身を読み出しメール送信します（③1min）。
1. 送信し終えた関数は，mailフォルダから削除します（④1min）。

***
　添付ファイルも可能ですが，とりあえず扱わない予定です。なお，週に1つ位公開して，7週くらいでシステムを作っていきます。次は，C言語との違いを簡単にまとめてみます。
＜[前へ]()＞　＜[次へ](http://qiita.com/matsuhandy/items/ffb717bfb07417c05e4e)＞
***
[OpenGL/EGL] バージョン情報を確認する

# OpenGLのバージョン情報の確認
glGetString(GLenum name)を用いることで取得可能。

取得したい内容に合わせて、引数nameを変更する。

|取得する情報|GLenum name|
|:----------|:----------|
|ベンダー情報|GL_VENDOR|
|レンダラー情報|GL_RENDERER|
|バージョン情報|GL_VERSION|
|拡張機能|GL_EXTENSIONS|

# EGLのバージョン情報の確認
eglQueryString(EGLDisplay display, EGLint name)を用いることで取得可能。

取得したい内容に合わせて、引数nameを変更する。

|取得する情報|EGLint name|
|:----------|:----------|
|サポートAPI情報|EGL_CLIENT_APIS|
|ベンダー情報|EGL_VENDOR|
|バージョン情報|EGL_VERSION|
|拡張機能|EGL_EXTENSIONS|

# 参考
- glGetString  
https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glGetString.xhtml
- eglQueryString  
https://www.khronos.org/registry/EGL/sdk/docs/man/html/eglQueryString.xhtml
データの整形に役立つExcel関数

![データ整形.png](https://qiita-image-store.s3.amazonaws.com/0/160563/b8081899-7d0d-4b26-50ae-aed7bfd660ba.png)


#利用シチュエーション

* 既存のデータを自分好みに変更したいとき


#関数一覧
|関数|内容|
|:---|:---|
|ASC|全角を半角へ|
|JIS|半角を全角へ|
|UPEER|小文字を大文字へ|
|LOWER|大文字を小文字へ|
|VALUE|文字列を数値へ|
|DATEVALUE|文字列を日付へ|


#記述方法
```text:qiita.rb
データを整形したいセルを参照

<記述例>
=ASC(A1)
```
次にやること、その計画の概要

# 背景
新人教育として下記のタスクをもらったので、その解消

## タスクたち
 * 教養としての本たち
   * リーダブルコード
   * Webを支える技術
   * HTTPの教科書

 * プログラミング関連
   * [RailsTutorial](https://railstutorial.jp/)


## 目標
 * Railsの仕組みの大枠がわかる。
 * 現在動いているものの機能追加、修正がスムーズに出来るようになる。
 * 要するに(最低)賃金以上の価値は出す。
 
## 使える時間の整理
 * 業務時間後
 * 通勤電車内の暇な時間
 * 土日

### Railsに使う時間
 * Railsは(見るだけでもいいけど)できればパソコンとお話しながらがいい。
   * 業務時間後、3時間できるとして 3h×(5+5+3)
   * 土日(下の図だと土日どっちもやることになってるけど、バッファ取るよう言われたので、片方だけで計算) 8×(1+1)
   * 計55h

### 読書に使う時間
 * 読書は通勤電車内の暇な時間を使う。
   * 1h×2×(5+5+3)=26h=2.5 ~ 3冊?

## 概要図
![進捗計画概要.png](https://qiita-image-store.s3.amazonaws.com/0/171564/36928774-8b5f-cb4d-8b0c-e1e9880261b0.png)


## 感想
割と時間があると見るか、割と時間がないと見るか。。。土日しっかりやればRailsTutorial1つあたり5時間使える(それでも少ない！)計算になるので、なんとかなりそう?
一応4.2版でRailsTutorialは"こなして"いるので、なんとかなるかもしれない。
Amon2 構築・雛型作成

忘れないように備忘録。
参考 : https://github.com/perl-entrance-org/Perl-Entrance-Textbook/blob/master/amon2/1.md

## 環境
+ ubuntu 14.04

## 実行手順
cpanmとbuild-essential(makeのため)をインストール
``` $ apt-get install build-essential cpanminus
```

cartonインストール
``` $ cpanm Carton
```

Amon2インストール
``` $ cpanm Amon2
```

雛形生成(今回作成したのはBasic)
``` $ amon2-setup.pl MyApp
```

起動
``` $ carton exec -- perl -Ilib script/myapp-server
```

実行後、ブラウザにアクセスして確認。
今度はNginxもインストールして、Amon2を使ってみよう。
現状把握

## 背景
 * 個人的に新人エンジニアとして研修を受ける立場にある。
 * 自分がどういうことがわかっているのかを整理することで、研修の質向上を図る。
 * 現在の自分の魚拓を取って、後々見返したい。
 
> TODO
良い区切り方を考える。
レベルの分け方が少しおかしいかもしれない。

## Hardware周り
あまりよくわかっていない気がしています。


## Software周り

## プログラミングについて

全く触ったことがないわけではないものの、サービス等の開発自体は未経験。

## 言語についてtetete
### HelloWorldだけやったことがある
  * python
    * Cで自由にやっていたので、強制インデントが辛かった。
  * haskell
    * xmonadをDebianに入れていたものの、ほぼコピペ
  * emacs lisp
    * 使用してemacs拡張をしようとしたがほぼ同等以上の実装があったのでコピペへ
  * javascript

### 授業で習ったことがある
  * C 
    *  関数書ける(理解はしているはず)
    * ポインターや構造体などはブラックボックスになっている。

### 初めて触った
  * Ruby
    * Rails tutorial -> rubyという流れで触れている。
    * 初めてのオブジェクト指向っぽい部分(classとか)を触れた言語
    * 今一番書ける言語

## 言語周りについて
### 初めて触った
 * SQL
   * 複雑なものは書けない
   * BigQueryである程度触ったことがあるが、SELECT文しか書いていない。

 * MongoDBのクエリ
   * SQLより全体像を把握している。
   * (documentもある程度読めるように)
   * こちらも読み取りしかほぼやっていない。

 * オブジェクト指向
   * 詳しいことは一切知らず、から現在勉強中

## 開発周りについて
### 普段から使っていた
  * Emacs
    * [YaTex](https://texwiki.texjp.org/?YaTeX)を使いたいがために導入した。
    * 当時の設定が[こちら](https://github.com/usr4423)に残っている。
    * ショートカットは大体覚えている
    * SKKユーザ

### Helloworldレベル
  * vim
    * Linuxで初めて遭遇。
    * i と esc と :!qwだけ覚えている。
  * バージョン管理
    * Github
     * コマンドは多少覚えた
      * add commit push pull(fetch merge)
     * pull reqまで送れるようになっている。

### 初めて触った
  * Atom
   * 現在のメイン
  * AWS
   * AmazonLinux + nginx  + rails の初期画面までは触った
  * Heroku
    * 触った
## OSについて 
### 普段から使っていた
  * Windows
   * 家のメインで最も使っていた
   * 基本的なショートカット等は覚えている。

### 特定の作業のみつかっていた
  * Linux
   * コマンドは基本的なものは知っている
     * ls sl mkdir rm mv cd aptitude yum等々(それ以外あまり使わない)
   * TeXを書くためだけに導入した
     * Ubuntu
     * Debian(main)
     * ArchLinux

### 初めて触った
  * macOS
    * 現在のメイン
    * 基本的なショートカット等は覚えている
  
### network基礎知識
### 一回授業を受けて勉強した(要復習)
 * OSI参照モデルなどの知識？
   * TCP/IPの具体的なヘッダー情報などはふわっとした記憶のみ
 * DNS/ルータなどの概念的な知識

### 初めて触れた
 * REST
   * CRUDとの対応も含め学習した。
   * Railsのroutesでも少し復習になった。
Vyatta の logrotate について

#内容
Vyattaのログローテーションについて、調査しました。

#バージョン確認
```
vyatta@vyatta:~$ show version
Version:      VSE6.7R10
Description:  Brocade vRouter 5415 6.7 R10
```

```
# logrotateがインストールされているかの確認
vyatta@vyatta# dpkg -l | grep logrotate
ii  logrotate                              3.7.8-6                                       Log rotation utility
```

#システムログ /var/log/messages のローテーション
Vyattaのメインのログは、rsyslogdによって「/var/log/messages」に書き込まれています。
「/var/log/messages」のログローテーションは「/opt/vyatta/etc/logrotate/global」で管理されていますので、こちらのファイル設定を「sudo vi」で編集してローテーションさせます。
1日単位でローテーションさせたい場合は、以下のサンプル設定で動作を確認しました。

``` 
vyatta@vyatta:~$ cat /opt/vyatta/etc/logrotate/global 
/var/log/messages {
  missingok    # ログファイルがなくてもエラーを出さない
  notifempty    # logファイルが空の時はrotateしない
  create    # 新しくlogを作る
  rotate 30    # ログを30世代残す
  daily     # weekly, monthly など指定可能
  postrotate    # ログローテーション後に実行するスクリプト
    invoke-rc.d rsyslog reload > /dev/null
  endscript
  compress    # gzipで圧縮して保存
}
```
 
一方で、VyattaのCLI経由でも設定可能ですが、時間ベースのローテーションが設定できない仕様になっています。
たとえば、

```
set system syslog global archive files 30
set system syslog global archive size 16
commit
save
```

とすると、以下のように上書きされます。
（CLI経由では、filesとsizeしか指定できません。）
 
```
vyatta@vyatta# cat /opt/vyatta/etc/logrotate/global 
/var/log/messages {
  missingok
  notifempty
  create
  rotate 30
  size=16k
  compress
}
```

#その他のログ（/var/log/ 配下） のローテーション
その他のログ（/var/log/ 配下） のローテーションについては、「/etc/logrotate.conf」「/etc/logrotate.d/ 配下」で管理されていますので、各ファイル設定を「sudo vi」で編集してローテーションさせます。
 
#「/var/log/auth.log」についての注意点
VSE6.7R10で確認しましたが、デフォルトで「/var/log/auth.log」がローテーションされない設定になっているBrocadeのバグがありますので、ご注意ください。
ログが肥大化することにより、システムがダウンしてしまう可能性があります。
このバグは、6.7R12以降で修正されていますので、最新の6.7R13にアップグレードするか、以下の設定ファイルを作成すれば問題ないです。
（中身はサンプルになりますので、任意設定可能です。）
 
```
vyatta@vyatta# cat /etc/logrotate.d/auth 
/var/log/auth.log {
  missingok
  notifempty
  create
  rotate 5
  size=25k
  compress
  postrotate
    invoke-rc.d rsyslog reload > /dev/null
  endscript
}
```

#さいごに
ほかにもよい方法を知っている方がいれば、ぜひ教えてください！！！

#参考
- [必読！ログファイルとディレクトリ | Think IT（シンクイット）](https://thinkit.co.jp/article/711/1?page=0%2C1)
- [ログローテートツール「logrotate」を使いこなしたい - ITmedia エンタープライズ](http://www.itmedia.co.jp/help/tips/linux/l0291.html)
- [ログの見方 - satake7’s memo](http://d.hatena.ne.jp/satake7/20080330/1208856557)
- [system syslog global archive](http://www.brocade.com/content/html/en/vrouter5600/35r3/vyatta-35r3-basicsystem/GUID-372EACF6-C33A-4459-B3B6-590876F30BF3.html)
- [VyOSをAWSで使う時によくやることをまとめてみた ｜ Developers.IO](http://dev.classmethod.jp/server-side/network/vyos-aws/)
d3.jsのセレクタとタグ操作

## はじめに
d3.jsは、セレクタでタグを選択し、操作を行う。
バージョン3.xでのd3の選択、操作をjQuery, javascriptと共にまとめます。

## d3.jsセレクタ
d3.jsはselect（単一）, selectAll（複数）でタグを選択する。
selectで対象が複数ある場合は、１コ目の要素が選択される。

|セレクタ|d3|jQuery|javascript|
|:--|:--|:--|:--|
|タグ指定|d3.select("p");  d3.selectAll("p"); |$("p");|document.getElementsByTagName("p");|
|id指定|d3.select("#id");|$("#id");|document.getElementById("id");|
|クラス指定|d3.select(".cls");  d3.selectAll(".cls");|$(".cls");|document.getElementsByClassName("cls");|

セレクタに続いてセレクタを記述し、さらに要素を特定できる。

    d3.select("#id").selectAll("p");

## タグ操作
セレクタに続いて記述する。

|操作|d3|jQuery|javascript|
|:--|:--|:--|:--|
|属性取得|selection.attr("id");|selection.attr("id");|selection.getAttribute("id");|
|属性追加|selection.attr("id", "name");|selection.attr("id", "name");|selection.attrAttribute("id", "name");|
|属性削除|selection.attr("id", null);|selection.removeAttr("id");|selection.removeAttribute("id");|
|クラス追加|selection.classed("cls", true);|selection.addClass("cls");|selection.classList.add("cls");|
|クラス削除|selection.classed("cls", false);|selection.removeClass("cls");|selection.classList.remove("cls");|
|スタイル取得|selection.style("color");|selection.css("color");|selection.style.color;|
|スタイル設定|selection.style("color", "blue");|selection.css("color", "blue");|selection.style.color = "blue";|
|スタイル削除|selection.style("color", null);|selection.css("color", "");|selection.style.color = "";|
|プロパティ値取得|selection.property("checked");|selection.prop("checked");|selection.checked;|
|プロパティ値設定|selection.property("checked", true);|selection.prop("checked", true);|selection.checked = true;|
|html取得|selection.html();|selection.html();|selection.innerHTML;|
|html設定|selection.html("&lt;p&gt;value&lt;/p&gt;");|selection.html("&lt;p&gt;value&lt;/p&gt;");|selection.innerHTML = "&lt;p&gt;value&lt;/p&gt;";|
|要素追加|selection.append("p");|selection.append("&lt;p&gt;&lt;/p&gt;");|selection.appendChild(document.createElement('div'));|
|要素削除|selection.remove();|selection.remove();|selection.parentNode.removeChild(selection);|

## dataとenterとexit
dataはセレクタで選択した要素と配列の値（dataset）を関連付ける。
enterは、要素よりdatasetが多い場合、余剰分のdatasetの選択を返す。

    var dataset = [...];
    selection.data(dataset).enter();

[enterの利用例](https://jsbin.com/boqezev/edit?html,js,output)

exitは、datasetより要素が多い場合、余剰分の要素の選択を返す。

    var dataset = [...];
    selection.data(dataset).exit();

[exitの利用例](https://jsbin.com/mekifeh/edit?html,js,output)

enterとexitの両方を使ってみました。
[enterとexitの利用例](https://jsbin.com/mawonil/edit?html,js,output)
R: 自作イテレータの注意

Rで、自分でイテレータを定義する時の注意点

次のコードは、値`x`を`times`回繰り返すイテレータです。 問題なく動きます。

```r
library(iterators)
library(foreach)


f <- function(x, times) {
  nextEl <- function() {
    if (times > 0) {
      times <<- times - 1
    } else {
      stop("StopIteration")
    }
    x
  }
  obj <- list(nextElem=nextEl)
  class(obj) <- c("abstractiter", "iter")
  obj
}

foreach(i = f(3, 4)) %do% i
## [[1]]
## [1] 3
## 
## [[2]]
## [1] 3
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 3
```

次のコードは、同じに見えるようで、エラーを出します。コピペしてみてください。
何がいけないのでしょうか。

```r
f <- function(x, times) {
  nextEl <- function() {
    if (times > 0) {
      times <<- times - 1
    } else {
      stop("stopIteration")
    }
    x
  }
  obj <- list(nextElem=nextEl)
  class(obj) <- c("abstractiter", "iter")
  obj
}

foreach(i = f(3, 4)) %do% i
## Error in i : stopIteration
```

↓答え(選択すると文字が出ます)

<font color="White">**"stopIteration"の最初の文字が小文字**</font>


ちなみに、`as.list`でも同じエラーが出るので、`foreach`ではなく`iterators`の仕様と解釈しています。


以下、環境情報

    sessionInfo()
    ## R version 3.4.0 (2017-04-21)
    ## Platform: x86_64-pc-linux-gnu (64-bit)
    ## Running under: Ubuntu 14.04.5 LTS
    ## 
    ## Matrix products: default
    ## BLAS: /usr/lib/openblas-base/libopenblas.so.0
    ## LAPACK: /usr/lib/lapack/liblapack.so.3.0
    ## 
    ## locale:
    ##  [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
    ##  [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
    ##  [5] LC_MONETARY=en_US.UTF-8    LC_MESSAGES=en_US.UTF-8   
    ##  [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
    ##  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
    ## [11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       
    ## 
    ## attached base packages:
    ## [1] stats     graphics  grDevices utils     datasets  methods   base     
    ## 
    ## other attached packages:
    ## [1] foreach_1.4.3   iterators_1.0.8
    ## 
    ## loaded via a namespace (and not attached):
    ##  [1] compiler_3.4.0   backports_1.0.5  magrittr_1.5     rprojroot_1.2   
    ##  [5] tools_3.4.0      htmltools_0.3.6  yaml_2.1.14      Rcpp_0.12.10    
    ##  [9] codetools_0.2-15 stringi_1.1.5    rmarkdown_1.5    knitr_1.15.1    
    ## [13] stringr_1.2.0    digest_0.6.12    evaluate_0.10
Swift3でカスタムクラスを使って画面遷移

# 説明

画面遷移の為のカスタムクラスを作ってみました。引数に自分のStoryboardの名前を入れると簡単に`presentviewController`で画面遷移ができます！` New > File > Swift File` を選んでカスタムクラスを実装して使います。

# 注意

ちなみに、このクラスでは、同じ`Main Storyboard`の中にあるViewには飛べません。あくまでも別の`Storyboard`にある`ViewController`にしか飛べません。(不便ですみません)同じ`Storyboard`の中にある`ViewController`に飛ぶ為のクラスはまた暇を見つけて作ろうと思いました。

# 使い方

<img width="1250" alt="スクリーンショット 2017-05-15 19.41.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/d955833b-d06b-bfc3-610d-82c55caa84aa.png">



```swift
//右に遷移
CustomScreenTransition().Right(StoryboardName: "YourStoryboardName")

//左に遷移
CustomScreenTransition().Left(StoryboardName: "YourStoryboardName")
```


# 実装

```swift
import UIKit

public class CustomScreenTransition: UIViewController {
    
    public func Right(StoryboardName: String) {
        
        let storyboard: UIStoryboard = UIStoryboard(name: (StoryboardName), bundle: nil)
        let nextView = storyboard.instantiateInitialViewController()
        
        let transition = CATransition()
        transition.duration = 0.5
        transition.type = kCATransitionPush
        
        transition.subtype = kCATransitionFromRight
        let appDelegate = UIApplication.shared.delegate as? AppDelegate
        appDelegate?.window?.layer.add(transition, forKey: kCATransition)
        appDelegate?.window?.rootViewController = nextView!

        
    }
    
    public func Left(StoryboardName: String) {
        
        let storyboard: UIStoryboard = UIStoryboard(name: StoryboardName, bundle: nil)
        let nextView = storyboard.instantiateInitialViewController()
        
        let transition = CATransition()
        transition.duration = 0.5
        transition.type = kCATransitionPush
        
        transition.subtype = kCATransitionFromLeft
        let appDelegate = UIApplication.shared.delegate as? AppDelegate
        appDelegate?.window?.layer.add(transition, forKey: kCATransition)
        appDelegate?.window?.rootViewController = nextView!
        
    }
    
}
```

# 参考

[Swift - Accessing AppDelegate window from viewController](http://stackoverflow.com/questions/30027780/swift-accessing-appdelegate-window-from-viewcontroller)

[画面遷移のための関数を別のクラスから呼びたい](https://teratail.com/questions/75931)

[Swift3でカスタムクラスを使って画面遷移](http://off.tokyo/blog/2017/05/15/swift3%E3%81%A7%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E7%94%BB%E9%9D%A2%E9%81%B7%E7%A7%BB/)
GoogleWebDesignerでswipegallery使った時の設定メモ

こういうよく見る自動でチカチカ切り替わるやつの色とか変えたいって時

![スクリーンショット-2017-05-15-19.19.09.png](https://qiita-image-store.s3.amazonaws.com/0/92042/860f0b6a-1a34-9a2c-662e-203a8e952438.png)

コンポーネントプロパティにも出てこないしどこだよって思ったら、jsファイルに定義されてた
これやってから再度プレビューかけると変わった

```/common/custom.js
function itemMouseOver(item) {
// 中略
  itemBG.style.backgroundColor = "#CBCBCB"; // ←これが背景色
  itemBG.style.borderColor = "#fb0000"; // ←これが枠線の色

```


しかしJavascriptちゃんと読もうね…
作業ファイルのhtmlみて順に追って行けば普通にわかったわ…
音ゲーしたら脳がすっきりして解決したので音ゲーは神
gitフックによりAWSアクセスキー混入を防止する






# 概要

`~/.git_template`ディレクトリを作っておくことにより、`git init`、`git clone`したとき必ず所定の`.git/hooks/pre-commit`フックが入るようにする。フックの中で`AWS_ACCESS_KEY`が入っていないかチェックする。

参考：
http://qiita.com/k0kubun/items/5cb8209e3d1854ac2e2e
http://dev.classmethod.jp/etc/git_aws_access_key/

# セットアップ

```~/.gitconfig
[init]
    templatedir = ~/.git_template
```

フックのテンプレートを作成する:

```
mkdir -p ~/.git_template/hooks/
cat > ~/.git_template/hooks/pre-commit <<EOF
#!/bin/sh

GREP_RESULT=`git diff --cached | grep -i KEY | grep AKI[A]` 
if [ -n "${GREP_RESULT}" ]; then
    echo 'AWS_ACCESS_KEYがインデックスに入っている可能性があります。git diff --cachedで確認してください。'
    echo "${GREP_RESULT}" 
    exit 1 
else
    exit 0
fi
EOF
chmod +x ~/.git_template/hooks/pre-commit
```
pyenv-virtualenvでPython3環境構築(CentOS7.3)

## はじめに

pyenv-virtualenvを使うことで、Pythonのバージョン+バージョンごとの環境を管理できるようになります。
様々なPythonのバージョンを使いたい、かつ同一バージョンで異なる環境を構築したい場合に必須のツールです。

## 環境

- OS：CentOS 7.3-1611 64bit Minimal
- pyenv：1.0.10-22-g3292200
- Python：3.6.1

## 依存ライブラリのインストール

```shell-session
$ sudo yum install -y zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel git gcc
```

## pyenv-virtualenvのインストール

実行ファイルをGitHubからダウンロードし、パスを通すだけでインストールが完了します。

pyenv-virtualenvはpyenvのプラグインなので、まずpyenvを導入してから、そのプラグインフォルダにpyenv-virtualenvを導入します。

```shell-session
$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
```

`/usr/local/` にインストールしている記事も多いですが、ここでは公式のインストール方法に沿って `~/` にインストールします。

`~/.bash_profile` に以下を追記し、パスを通します。

```diff_shell:.bash_profile
+ export PYENV_ROOT="$HOME/.pyenv"
+ if [ -d "${PYENV_ROOT}" ]; then
+   export PATH="$PYENV_ROOT/bin:$PATH"
+   eval "$(pyenv init -)"
+   eval "$(pyenv virtualenv-init -)"
+ fi
```

その後、`~/.bash_profile` を再読み込みしてpyenvの初期化処理を実行します。

```shell-session
$ source ~/.bash_profile
```

この続きはMac版と同様のため、[こちら](http://qiita.com/uhooi/items/b2f3a121b2e9dac6a256#python3%E7%B3%BB%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)を参照して行ってください。
CentOSはなるべくミニマルに環境構築したいため、Anacondaではなく `pyenv install 3.6.1` でインストールし、必要なパッケージのみ追加でインストールするのがいいと思います。

## 参考リンク

- [GitHub - pyenv/pyenv: Simple Python version management](https://github.com/pyenv/pyenv#installation)
- [pyenv/pyenv-virtualenv: a pyenv plugin to manage virtualenv (a.k.a. python-virtualenv)](https://github.com/pyenv/pyenv-virtualenv)
- [Common build problems · pyenv/pyenv Wiki](https://github.com/pyenv/pyenv/wiki/Common-build-problems)
- [CentOSにPython環境を作ってみたまとめ - 薮蛇なエンジニアの開発備忘録](http://h2shiki.hateblo.jp/entry/2016/03/30/230633)
- [pyenv/pyenv-virtualenvで環境を構築する（Linux環境下で） - Random Seed](http://fly-in-the-dusk.hatenablog.com/entry/2016/05/06/003044)
- [PyenvによるPython3.x環境構築(CentOS, Ubuntu) - Qiita](http://qiita.com/akito1986/items/be5dcd1a502aaf22010b)