OmniAICreator/Qiita-1.07M huggingface dataset:
Windowsの設定

# アカウント
管理者：一般ユーザー
普段：マイクロソフトアカウント

# ダウンロードアプリ
- **セキュリティソフト**：[ノートン360](https://jp.norton.com/360/)（現在），[ESET ファミリー セキュリティ 3年版](http://canon-its.jp/product/eset/private/family/)（今後）
- **インターネットブラウザ**：[Google Chrome](https://www.google.co.jp/chrome/browser/desktop/index.html)
- **テキストエディタ**：[Sublime Text](https://www.sublimetext.com/)
- **オフィスソフト**：[Microsoft Office](https://www.microsoft.com/ja-jp/office/2013/default.aspx)
- **プログラミング**：[python](https://www.python.org/)，[java](https://java.com/ja/download/)，[R](https://www.r-project.org/)，[LaTeX](http://did2memo.net/2014/03/06/easy-latex-install-windows-8-2014-03/)，[Pandoc](https://sky-y.github.io/site-pandoc-jp/users-guide/)，[Git](https://git-scm.com/download/win)，[Gow](https://github.com/bmatzelle/gow/wiki)
- **クラウド**：[Dropbox](https://www.dropbox.com/install)
- **IME**：[Google 日本語入力](https://www.google.co.jp/ime/)
- **娯楽**：[Media Go](https://www.sony.jp/support/audiosoftware/mediago/)，[iTunes](https://www.apple.com/jp/itunes/download/)，[LINE](http://line.me/ja/download)，[Rakuten Kobo Desktop](http://books.rakuten.co.jp/event/e-book/application/desktop/?scid=wi_kb_top_application_desktop)

# 便利なアプリ
- [Hit-a-Hint for Windows](http://uisteven.at-ninja.jp/hw.html)
  - Google Chrome の拡張機能「[vimium](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb)」をデスクトップ上で再現
- [Lhaplus](http://www7a.biglobe.ne.jp/~schezo/)
- [CrystalDiskMark](http://crystalmark.info/software/CrystalDiskMark/)
- [Adobe Acrobat Reader DC](https://get.adobe.com/jp/reader/)

# 各種設定
## レジストリ（regedit）
- キーボードレイアウトの変更
  - コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Servicces\i8042prt\PParameters
  - [参考](http://freesoft.tvbok.com/win8/keyboard.html)

## フォントのインストール
- [参考](http://nelog.jp/how-to-use-ricty-diminished-font)

## Google 日本語入力
- ［一般］－［キー設定］ー［キー設定の選択］で「IMEを無効化」と「IMEを有効化」の入力キーを「Ctrl+Space」に設定
- ［入力補助］はすべて「学習」に設定

# 閲覧して下さった方へ
- 便利なソフト，快適になる設定があればご教授のほど，よろしくお願い致します．
CentOS7にMariaDB Galera Cluster10をインストールする方法

MariaDBの公式からリポジトリが用意されている。
URL：https://downloads.mariadb.org/mariadb/repositories/

上記URLから以下を指定。
1. Choose a Distro　→　CentOS
2. Choose a Release　→　CentOS 7 (64-bit)
3. Choose a Version　→　10.0

リポジトリファイルに記載する内容が表示されるので、コピペして「/etc/yum.repos.d/」配下にファイルを作成する。

```lang:/etc/yum.repos.d/mariadb.repo
# MariaDB 10.0 CentOS repository list - created 2016-02-25 11:52 UTC
# http://mariadb.org/mariadb/repositories/
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.0/centos7-amd64
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
```

リポジトリファイルを作成したら、yumでインストールする。

```lang:
yum -y install MariaDB-Galera-server MariaDB-client galera
```
elasticsearch-rubyでprettyをtrueに指定する


調べ方が悪かったのか、elasticsearch-rubyで`pretty=true`を指定する方法が見つかリませんでした。  

# [elastic/elasticsearch-ruby](https://github.com/elastic/elasticsearch-ruby)

elasticsearchをrubyから使うためのライブラリです。

##APIの検索にヒットしない
- [Documentation](https://github.com/elastic/elasticsearch-ruby)

[elastic/elasticsearch-ruby](https://github.com/elastic/elasticsearch-ruby)から遷移できるAPIのドキュメントですが、
prettyをページ右上にあるSearchで検索してもヒットしません。  
また、この検索フォームはページ内検索ではないようです。

##APIのActions,Cat,...Utilsどれにもヒットしない
APIの（おそらく）全てのページ内で`pretty`で検索をかけましたが、やはりヒットしません。

#指定方法
方法は簡単で、searchの引数のハッシュに指定するだけです。

```rb
client = Elasticsearch::Client.new log: true

client.search index: 'myindex',
              type: 'mytype' ,
              pretty: true,
              body: {
                  query: {
                      match: {
                          title: "qiita"
                      }
                  }
              }
```
品質の高いコードを素早く書くために、いつも意識している手順をまとめてみた


コードを書いている間は何も考えないですむようにするというのが基本スタンス。

参考URL: 
プログラミングのスピードを上げる方法 - 旧・teruyastarはかく語りき http://d.hatena.ne.jp/teruyastar/20080308/1204977907


## 要件定義
* 何のために実装を行うのかを事前に明確にすることで、プログラミング中は何も考えずにすむ
* ここが凄い大事。やることとやらないことを明確にしておくことで余分なコードを書かないですむ
* この段階で成果物のイメージを明確にしておく
* 要件に詳しい人に聞けばいいけど、一緒に考えるスタンスをとるように習慣づけておくと出来るエンジニアに成長しやすい
* ここで大事なのは「実装の大変さは一旦置いといてあるべき姿で考える」こと
* 本当はここまでやるのがあるべき姿だけど、スケジュールがギリギリだから、この代替案でどうでしょう？と提案できるようになるとベスト
* 「よくこれをやればいいですか？」と細かく確認するエンジニアがいるけど、開発初期は誰も正解を知らないことが多いので上記のように提案ができるエンジニアを目指したい

## 全体設計
* 全体の大まかな設計を考える
* このフェーズでは少し時間をとって似たようなサービスやツールのコードを読んだり設計をググるといい
* 頑張って自分で考えるより、世界中の優秀なエンジニアのリソースを漁った方が早いし、プラクティスが学べて学びになる
* 自分はなぜその設計にしたのか後で終えるようにesaとかに書いておくようにしている
* この段階では実装の細かいTipsまでは入らなくてOK

## 技術調査
* 実装のイメージが考えても湧かないようなものは先にライブラリなどを調査しておくといい
* 経験豊富なエンジニアがそばにいる場合は聞いてしまった方が早いかも

## 実装1
* 細かい所はこだわらずに全体の流れを通せるように実装する
* 難易度の高い実装から先に手をつける

実装中の作業BGMは245Cloudがおすすめ
http://245cloud.com/

## テストを書く
* テストドリブンだと時間かかりすぎるので、自分はこのタイミングでテスト書くことが多い

## 実装2
* 細かい箇所の実装を行う
* テストが落ちたら直す

## リファクタリング
* コメントをつけたり気になる箇所をリファクタリングする
* テストが落ちたら直す

## その他
* メリハリをつけるの大事。5分オーバーとかでも積もると最初やりたかったタスクができなくなったりする

自分はこうしてます！とかフィードバックあったらぜひください！自分もこれが正解だとは思ってないので改善したいです^^
Powershell > バックグラウンド実行の失敗 > ParameterBindingException > Start-Job -FilePath .\main.ps1

```txt:動作確認
Windows 8.1pro (64bit)
```

作成したスクリプトをバックグラウンドで実行しようとした。

### try1 > 失敗1

Start-Jobというのがあるらしいのでやってみた。

```ps1
> Start-Job .\main.ps1
Start-Job : 指定された名前のパラメータを使用してパラメータセットを解決できません。
発生場所 行:1 文字:1
+ Start-Job .\main.ps1
+ ~~~~~~~~~~~~~~~~~~~~
  + CategoryInfo     : InvalidArgument: (:) [Start-Job] ParameterBindingException
  + FullyQualifiedErrorId : AmbiguousParameterSet,Microsoft.PowerSHell.Commands.StartJobCommand
```

### try2 > 失敗2

[SO](http://stackoverflow.com/questions/5278617/calling-additional-scripts-as-jobs)を参考にコマンドにオプション(`-FilePath`)を追加した。

```ps1
> Start-Job -FilePath .\main.ps1
```

実行できたようだ。

と思ったらslackへの通知の処理が実行されていない。
まだ何か間違っているようだ。

バックグラウンドで動かしたJobに対して

```
> Receive-Job -id 2
```
のように実行して動作の内容を見てみると

```
パス 'C:\Users\....\secret_slack_url.txt'が存在しないため検出できません。
```

というエラーが出ている。

実行する場所が変わって、スクリプトと同じフォルダに置いておいたファイルが読めなくなっているようだ。

絶対パスを指定しないといけないのだろうか。

### バックグラウンド実行時にフォルダが変わる対策

このあたりをしないといけないのだろうか。
http://stackoverflow.com/questions/2224350/powershell-start-job-working-directory
Windows7 proxy配下で、Vagrant上、docker build エラー


docker build app等をした際に、

```bash
Error while pulling image: Get https://index.docker.io/v1/repositories/library/debian/images: dial tcp: lookup index.docker.io: no such host
```

とか出る。
つまり最初のdocker pull debian:jessieでいきなり名前解決エラー。

## やったこと
vagrant sshした後に、環境変数、http_proxyとhttps_proxyを設定した。
→変化なし

vagrant upする前に、環境変数、http_proxyとhttps_proxyを設定した。
→変化なし

vagrant-proxyconfというpluginをインストールして、Vagrantfileに以下のようにproxyを設定して、再度vagrant up
→うまくいった!

## 正解
vagrant-proxyconfというpluginをインストールして、Vagrantfileにproxyの設定を追加。

```Vagrantfile
if Vagrant.has_plugin?("vagrant-proxyconf")
  config.proxy.http     = "http://hoge.co.jp:8080/"
  config.proxy.https    = "http://hoge.co.jp:8080/"
  config.proxy.no_proxy = "localhost,127.0.0.1,.example.com"
end
```


## 参考
vagrant-proxyconf
https://github.com/tmatilai/vagrant-proxyconf/
Rでプログラムスライシングに負けない関数をつくる

# 概要
ただのおあそびです。
[R でプログラムスライシング #rstatsj](http://qiita.com/hoxo_m/items/9075b45b429c5b82b0da)に負けない関数を作ります。
※fix_slicing関数の内容等については、上のリンク先を参照してください。

# そもそものモチベーション
ifの中でprintしたりするとどうなるのかな、ということを思ったわけです。本当に最初に思ったのは、副作用はどうなるんだろう、ということだったんですが。

```r:unnaturalFunction0
> unnaturalFunction0 <- function(a,...){
+   if(T | print(a))
+     a
+ }
> fix_slicing(unnaturalFunction0(a=1:2))
function (`a = 1:2`, ...) 
if (T | print(1:2)) 1:2
```
むむむ、意外とかしこい（？）
他にも結構いろいろ試してみた結果、結構かしこいということがわかりました。
かくなる上は…ということで、逆転の発想で、プログラムスライシングに負けない関数を作ることにしました。

# できあがった関数
```r:unnaturalFunction1
> unnaturalFunction1 <- function(a,...){
+   add <- function(a,b){
+     a + b
+   }
+   add(a,a)
+ }
> fix_slicing(unnaturalFunction1(a=1:2))
function (`a = 1:2`, ...) 
{
    add <- function(a, b) a + b
    add(1:2, 1:2)
}
```
{}等がちょっと変わっているものの、addの部分が生き残りました。やったー。
ちなみに、これ、addを使わないと、賢く処理されてしまいます。

```r:naturalFunction1
> naturalFunction1 <- function(a,...){
+   a + a
+ }
> fix_slicing(naturalFunction1(a=1:2))
function (`a = 1:2`, ...) 
c(2L, 4L)
```
「ああああnaturalFunction1さま…！あのような痛ましいお姿になって……！」
と言わんばかりに~~無残に~~見事にスライシングされてしまいました。

# もっと意地悪をする
要するに`function()`まで最適化はできない、という感じなので、こういうこともできます。

```r:unnaturalFunction2
> unnaturalFunction2 <- function(a,...){
+   t <- function(a){
+     if(T) a
+   }
+   t(a)
+ }
> fix_slicing(unnaturalFunction2(a=1:2))
function (`a = 1:2`, ...) 
{
    t <- function(a) if (T) 
        a
    t(1:2)
}
```

`if(T)`が許されるのは小学生までだよねーキャハハハハハハ
※すみません嘘です。

# おしまい
既存関数から類似の処理を作成したり、デバッグにも使えそうですね。便利で非常に面白いです。


たのしめ！
小さい画像・動画を引き伸ばして荒れたときの最終奥義「網点」

# 素材が小さい、、、
手元にある画像素材が小さすぎる、、、
スマホ対応で動画の圧縮率をあげないと、、、
という場面は日常茶飯事かと思います。そして無理やり引き延ばすとモワモワに荒れてしまう、、、

素材
![umi_kappa.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/881ef4e1-c2ae-bc62-5ee0-4a9a20005847.jpeg)

2倍に拡大
![umi_kappa_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/3af1a903-7929-e663-082c-54bbbabf3402.jpeg)

ひどいもんですね。。

# 網点を上から重ねてみると
下のような網点画像を作って先ほどの画像に重ねてみます。
説明のために32倍に拡大してキャプチャしてます。実際は1マス1pxです。

## よこしま
![p1.png](https://qiita-image-store.s3.amazonaws.com/0/55103/85e01a89-0154-70d3-a0d5-4a179d5930a1.png)

重ねると
![umi_kappa_3.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/b5eba4d1-0878-3a29-d85b-a330018636c8.jpeg)

ちょっと粗さが目立たなくなりました。画像のトーンも全体的に暗くなっちゃいましたが、Coolになりました。

## ななめ
![p2.png](https://qiita-image-store.s3.amazonaws.com/0/55103/4cd7f795-8359-e144-f5be-178d5312e377.png)

重ねると
![umi_kappa_4.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/637d44b8-1496-d6b2-6f44-b9b070746568.jpeg)

先ほどよりも2倍の大きさの網点なのでその分明るくなりました。

# 動画にも使えます
Webコンテンツで背景に動画を埋め込んでいるものもよく見かけます。ですが、そのようなコンテンツはウィンドウサイズによって動画を拡縮してしまうためどうしても荒くなってしまいます。
そういうときはこの網点を使うと荒さがおさえられます。

# 使用上の注意
網点重ねた画像をそのまま書き出してその画像自体を拡縮させてしまうと元画像の荒れとは別に網点画像がモワモワしてしまいます。

先ほどの画像を75%
![umi_kappa_5.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/4729433f-e5f1-a526-9397-bb1006b8c6e8.jpeg)

それを避けるためなるべく拡縮させないか、Webコンテンツであれば背景のパターン画像としてリピートされるようにしましょう。

# 雑談
僕は元々Flashから仕事を始めたので、こういうちょっとしたネタがあります。世はJSが人気ですが、こういうネタは変わらないなーと嬉しい今日このごろです。
AquaSKK+AZIK(US)で:(コロン)と;(セミコロン)を入れ替えた時の設定

AquaSKK+AZIK(US)で:(コロン)と;(セミコロン)をKarabinerなどで入れ替えた時、:を押すと「っ」が変換モードで入力されてしまう。それを変える設定。


`/Library/Input\ Methods/AquaSKK.app/Contents/Resources/azik.conf`を下記のように直接書き換える。

```
UpperCases              Q||keycode::29 
InputChars              shift::keycode::29||keycode::29 
```
セレクトボックスのoptionにサブタイトルをつける

ずっと前から気になってたんだけど、ググっても全然出てこなかった。
実装してるサイトを見つけるたびにソースを見てみるが、みんなJSで実装してる。
昔どっかでHTMLで実装できるっていうの見たんだよなあ...って思ってたら、見つけた。
メモ。

```html:html
<select>
  <optgroup label="グループ１">
    <option value="1">項目１</option>
    <option value="2">項目２</option>
    <option value="3">項目３</option>
  </optgroup>
  <optgroup label="グループ２">
    <option value="4">項目４</option>
    <option value="5">項目５</option>
  </optgroup>
</select>
```

---

追記。
`<option disabled>...</option>`でも似てようなこといけんな。
nyancat を telnet サーバポートで動かそう

[nyancat](https://github.com/klange/nyancat) というソフトがあります。コンソールで実行するとにゃんこが走り出してほっこりできます。そして、このソフト、何と telnet サーバとしても動作できます。
折角なので、<del>telnet ポートに無差別アクセスしてくる輩をおちょくるために</del>世界にカワイさを広めるために、telnet サーバとして動作するよう設定してみましょう。
設定は xinetd (OpenRC または systemd から起動) と systemd 単独の二通りを載せました。

※ Gentoo タグを付けていますが、設定ファイル部分は他ディストリビューションでも概ね共通になると思います。

## nyancat のインストール

Gentoo では、そのものズバリ、 games-misc/nyancat というパッケージがあります。[^distributions]

    # emerge -tva nyancat

[^distributions]: 開発者によると、この他、Arch、Debian、Mandriva、Ubuntu にもパッケージがあるそうです。Linux 以外では、OpenBSD、FreeBSD にも。

## 設定 (xinetd)
### 設定ファイル

`user` は適当に権限弱目な人を適当に[^permission]。nobody とかでも動くかな？ (未確認)
Gentoo では games が丁度いいかと。

[^permission]: お遊びでしかないのに、rootにしてたらうっかりセキュリティホール突かれてひどい目に、なんてのは嫌ですからね。

```text:/etc/xinetd.d/nyancat
service nyancat
{
    socket_type = stream
    protocol    = tcp
    wait        = no
    user        = games
    server      = /usr/games/bin/nyancat
    server_args = -t
    only_from   = 0.0.0.0/0 ::/0
    flags       = IPv6
    disable     = no
}
```

### サービス有効化 (OpenRC から)

    # service xinetd restart

xinetd を自動起動するように設定していないなら、次回の起動のためにこれも行っておく。

    # rc-update add xinetd

### サービス有効化 (systemd から)

    # systemctl restart xinetd

xinetd を自動起動するように設定していないなら、次回の起動のためにこれも行っておく。

    # systemctl enable xinetd

## 設定 (systemd 単独)
### 設定ファイル

待ち受けソケットを記述する nyncat.socket と、起動するサービスを記述する nyancat@\.service を記述します。
`User` は xinetd の `user` と同様、適当に権限弱目な人を適当に[^permission]。

```ini:/etc/systemd/system/nyancat.socket
[Unit]
Description=Nyan Cat Telnet Server Socket

[Socket]
ListenStream=23
Accept=yes

[Install]
WantedBy=sockets.target
```

```ini:/etc/systemd/system/nyancat@.service
[Unit]
Description=Nyan Cat Telnet Server
After=syslog.target auditd.service

[Service]
ExecStart=-/usr/games/bin/nyancat -t
StandardInput=socket
StandardError=syslog
IgnoreSIGPIPE=no
User=games
```

### サービス有効化

次回以降の自動起動設定も一緒に。

    # systemctl daemon-reload
    # systemctl start nyancat.socket
    # systemctl enable nyancat.socket

## おまけ

/etc/service の 23 番ポートの名称 `telnet` を `nyancat` に書き換えると、 ss コマンドの出力などで、ポート名が "nyancat" に。

    # ss -l -t
    State      Recv-Q Send-Q            Local Address:Port                             Peer Address:Port
    LISTEN     0      128                           *:llmnr                                       *:*
    LISTEN     0      10                            *:distcc                                      *:*
    LISTEN     0      128                           *:ssh                                         *:*
    LISTEN     0      128                          :::llmnr                                      :::*
    LISTEN     0      128                          :::ssh                                        :::*
    LISTEN     0      128                          :::nyancat                                    :::*    ← コレ
go testの並列（-cpuと-parallel）がなんの事だったか忘れた時のメモ #golang

`T.Parallel`を呼び出したテストケースは、 GOMAXPROCSか`-parallel n`で指定した数まで並列に実行される。
これは、テストケースを複数同時に実行する意味。

これとは別に、`-cpu`で指定した数で`GOMAXPROCS`で各テストケースを実行する。
`-cpu`は複数設定でき、`GOMAXPROCS`を変えながら各テストケースを実行できる。
デフォルトは、起動時に`GOMAXPROCS`で設定された値（1.5からは4コアの場合は4）。

忘れたら、testingパッケージのソースコードを読んで思い出す。
Jenkinsで2回ビルドが走る件

Jenkinsをビルドした時に同じジョブが2回ビルド対象に入ることがあった。

Multiple SCMsを使っているのだが、
**[2.1.2/ios/develop]**
を
**[*/2.1.2/ios/develop]**
にしたら直った。（先頭にアスタリスク）
base64の次はbase65536が来る！！...こないかな？

※ この記事は自分のブログ記事のダイジェスト版（？）です。
http://blog.code42.jp/base65536go

base65536がおもしろかったのでGoでもやってみた

githubでfernoって人がbase65536というアイディアを出していて、nodejsのライブラリを作ってた。
https://github.com/ferno/base65536  


##base65536って何？

ところでbase65336ってなんだろう？


引用：

>Base64 is used to encode arbitrary binary data as "plain" text using a small, extremely safe repertoire of 64 (well, 65) characters. Base64 remains highly suited to text systems where the range of characters available is very small -- i.e., anything still constrained to plain ASCII. Base64 encodes 6 bits, or 3/4 of an octet, per character.
>However, now that Unicode rules the world, the range of characters which can be considered "safe" in this way is, in many situations, significantly wider. Base65536 applies the same basic principle to a carefully-chosen repertoire of 65,536 (well, 65,792) Unicode code points, encoding 16 bits, or 2 octets, per character. This allows up to 280 octets of binary data to fit in a Tweet.


わからん！！
でも、base64(64種類の文字)でやってたことをunicode(65536種類のコードポイント)でやるってことらしい！！

(´ε｀；)ｳｰﾝ ...
( ｰ`дｰ´)ｷﾘｯ エンコードで使う文字のバラエティが増えるってことね（ざっくり）

##つくってみた

https://github.com/usk81/base65536

```go:encode
s := "hello world"
result := base65536.Encode(s)

Println(result)
// 驨ꍬ啯𒁷ꍲᕤ
```

```go:decode
s := "驨ꍬ啯𒁷ꍲᕤ"

result := base65536.Decode(s)
Println(result)
// hello world
```
Laravelでユーザーのメールアドレスを変更するフロー


## 環境
Laravel 5.1

## 経緯
現在PHP+Laravelなシステムを開発していますが、ユーザーが設定画面などでメールアドレスを変更したいと思った時に、メールアドレスの打ち間違いなどを考慮してどのようなフローでやるのが正解かなと色々参考にした結果、まあまあ満足できる出来になったので共有します。ちなみに訳あってデフォルトのUserモデルを使用していませんが、適宜直せば大丈夫だと思います。
参考
[LARAVEL 5.1 のユーザー登録で確認メールを送る【前篇】](https://laravel10.wordpress.com/2015/05/04/laravel5%E3%81%AE%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E7%99%BB%E9%8C%B2%E3%81%A7%E7%A2%BA%E8%AA%8D%E3%83%A1%E3%83%BC%E3%83%AB%E3%82%92%E9%80%81%E3%82%8B%E3%80%90%E5%89%8D%E7%AF%87%E3%80%91/#more-1033)

## フローの説明
ざっくり説明すると、

1. ユーザーが新しいメールアドレスを入力して送信ボタンを押す。
2.  新しいメールアドレスを元にユニークなトークンをデータベースに保存して、そのトークンを含めた承認URLを新しいメールアドレスあてに送信する。
3. ユーザーがメールを開いて書かれてあるURLをクリックする。
4. トークンがデータベースにあるかどうか確認して、あればユーザーのメールアドレスを更新する。なければエラー画面を出す。
5. トークンを削除する。

こんな感じです。では以下で実装例を紹介します。

## コントローラの実装
ユーザーが新しいメールアドレスを入力して送信ボタンを押したところから説明を始めます。

```php:SettingsController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Session;
use Mail;
use DB;
use App\User;

class SettingsController extends Controller
{   
    public function changeMail(Request $request)
    {
        // ログインしているユーザーを取ってくる
        $user = User::find(Session::get('id'));
        
        $address = $request->input('newAddress');
        $token = hash_hmac(
            'sha256',
            str_random(40).$address,
            env('APP_KEY')
        );
        $domain = env('APP_DOMAIN');
        
        Mail::send(
            'emails.authorize',
            ['url' => "https:{$domain}/settings/authorizeMail/?token={$token}"],
            function ($message) use ($address, $domain) {
                $message->from(env('MAIL_ADDRESS'));
                $message->sender(env('MAIL_ADDRESS'));
                $message->to($address);
                $message->subject('メールアドレス変更確認');
            }
        );
        
        DB::table('email_changes')->insert([
            [
                'id' => $user->id,
                'email' => $address,
                'token' => $token
            ]
        ]);
        
        return view('sendMailCompleted');
    }
    
    public function authorizeMail(Request $request)
    {
        $token = $request->input('token');
        
        $email_changes = DB::table('email_changes')
            ->where('token', '=', $token)
            ->first();
        
        $user = User::find($email_changes->id);
        $user->email = $email_changes->email;
        $user->save();
        
        DB::table('email_changes')
            ->where('token', '=', $token)
            ->delete();
            
        return view('authorizeMailCompleted');
    }
}
```

## 実装説明
email_changesというテーブルにトークンとユーザーのIDと新しいメールアドレスを格納しておきます。そして、承認画面(ここでは/settings/authorizeMail)のMiddlewareでバリデーションしないようにしないといけません。あとはコード量も多くないので読んで分かると思います。

bladeテンプレートとかは各自で好きなように作ってください。あとは全くコントローラ内でバリデーションをかけていないので、参考にする際はトークンがリクエストに入っていない場合などを考慮して実装してください。
PostgreSQL 8.1.23 と PHP 5.3.3 な環境を Ansible でサクっと構築する

# PostgreSQL 8.1.23 と PHP 5.3.3 な環境を Ansible でサクっと構築する

レアケースだと思いますが、以下の環境をセットアップする playbook を書きました。

```
CentOS 5.11
Apache 2.2.3
PostgreSQL 8.1.23
PHP 5.3.3
```

# 1. PostgreSQL のインストール

CentOS 5.x の標準が 8.1 系なので、標準リポジトリからインストールします。

# 2. PHP のインストール

こちらも標準リポジトリから 5.3.3 をインストールできます。
ただ、このバージョンに対応する Xdebug は PECL から導入する必要があり、
さらにチャンネルの変更をしたりと、導入が少し面倒です。

# 3. コード

GitHub で公開してます。

[42milez / ansible-pg81-php53](https://github.com/42milez/ansible-pg81-php53)
2016-01-18 c++ builder > TComboBox > Items[]変更時にItemIndexが変更されるのを回避する実装

```txt:動作確認
C++ Builder XE4
```

TComboBoxにてItems[]を変更時、ItemIndexが-1に初期化されてしまう。
それを回避するため、以下のような関数を用意している。

```cpp
void TItemsUpdator::setStringToTComboBoxItems(String str, TComboBox *cbPtr, bool withSpace)
{
	if (cbPtr == NULL) {
		return;
	}

	TStringList *slPtr = static_cast<TStringList *>( cbPtr->Items );

	int preIdx = cbPtr->ItemIndex;

	if (withSpace) {
		slPtr->StrictDelimiter = true;
		slPtr->Delimiter = L',';
		slPtr->DelimitedText = str;
	} else {
        slPtr->CommaText = str;
	}

	// Items[]変更時にItemIndexが-1に初期化されるので元々の値に戻す
	cbPtr->ItemIndex = preIdx;	
}
```

もっとシンプルな方法で同じことができないだろうか。
[Linux]sarコマンド以外でメモリおよびCPU使用量をモニタリングする方法


sarコマンドが実行できない（sysstatが未インストール）LinuxサーバーのメモリおよびCPU使用量を一定間隔で計測し、その結果をファイル出力する必要があったため、以下のコマンドを実行


####要件
- メモリおよびCPU使用量を一定間隔で計測し、ファイルにリダイレクトしたい
- tailコマンドを実行して、ファイルに出力された内容を表示したい

####実行するコマンド
- vmstatコマンドのオプションで、実行間隔と回数を指定する
- パイプに続けてawkで実行日時を表示する
- 「system("")」で出力バッファをフラッシュする

```
（例）vmstatを5秒間隔で100回実行する際に、日時を表示する
vmstat 5 100 | awk '{print strftime("%Y-%m-%d %T"), $0; system("");}' > vmstat_out.txt 
```
DynamoDBLog: InvalidSignatureException: Signature expired エラーと解決策

今まで問題なく動いていたアプリが以下エラーを吐きましたのでメモ。

```shell-session:DynamoDBのエラー
InvalidSignatureException: Signature expired: 20160118T082956Z is now earlier than 20160118T083029Z (20160118T084529Z - 15 min.)
```

原因は、ありがちですが、OSの時間が20分ほどずれていたことでした。
ぐぐったところ、CentOS7の標準のNTPはChronyとかいうパッケージらしいので、入れてみますね。

```shell-session
# yum -y install chrony

インストール:
  chrony.x86_64 0:2.1.1-1.el7.centos

完了しました!
```

起動します。

```shell-session
# systemctl start chronyd
# systemctl status chronyd
chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled)
   Active: active (running) since 月 2016-01-18 17:53:37 JST; 15min ago

 1月 18 17:53:37 shiitake.com systemd[1]: Started NTP client/server.
 1月 18 17:53:42 shiitake.com chronyd[3768]: Selected source 59.106.180.168
 1月 18 17:53:42 shiitake.com chronyd[3768]: System clock wrong by 931.269655 seconds, adjustment started
 1月 18 18:09:14 shiitake.com chronyd[3768]: System clock was stepped by 931.269655 seconds
Hint: Some lines were ellipsized, use -l to show in full.
```

Chronydが起動した後、すぐに正しい時刻が設定されました。

OS起動時に自動的に起動するように設定して完了。

```shell-session
# systemctl enable chronyd
# systemctl list-unit-files | grep chronyd
chronyd.service                                          enabled
```

今回はNTPクライアントとして使うのみなので、特に設定せず。

おわり

### 参考サイト
* [Red Hat Enterprise Linux:13.3. CHRONY の使用](https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Using_chrony.html#sect-Installing_chrony)
* [新しいNTPクライアント＆サーバ、chrony](http://qiita.com/yunano/items/7883cf295f91f4ef716b)
基礎からのWordPress 改訂版

WordPressの入門書も最近はかなり出版されていますが、大抵レンタルサーバーとタイアップしているのか、どこかのレンタルサーバーを使うことを前提に書かれているものがほとんどです。しかし、WordPress を学習していく段階でわざわざレンタルサーバーを使う必要はないでしょう。最初の段階はむしろローカルで結果を確認しながら進める方が安心です。
本書は、XAMPPやMUMPでローカル環境を作るところから解説されているので、レンタルサーバーを使うことなく学習を進めることができます。
本書では、WordPress をインストールする時に、ダウンロードしたwordpress の wp-config-sample.php を編集して wp-config.php を作るように解説してあります。しかし、この方法では編集時に何か手順を間違うと、うまくWordPress がインストールできません。それよりも、wp-config.php ファイルを作らない状態で立ち上げると自動的にconfig ファイルのセットアップをするような画面になるので、その画面で必要事項を入力する方が簡単です。
解説も、サンプルを使いながら丁寧に説明されているので迷いなく進めることができます。また各ステップで、ファイルの構造や動作についても丁寧に説明されているので、WordPress自体の構造や動作についても理解していくことができます。
WordPress に最初に取り組むには最適な参考書でしょう。
逆にとても親切な解説なので、大して理解していない部分もわかったつもりになってしまいそうです。

![IMG_0373.jpg](https://qiita-image-store.s3.amazonaws.com/0/60473/40d98bbf-0c8d-bcf1-0341-a96771cae00d.jpeg "IMG_0373.jpg")
cocos studio2 : User Data の取得について(In the Properties on window)

![スクリーンショット 2016-01-18 17.54.54.png](https://qiita-image-store.s3.amazonaws.com/0/47947/46dde1c1-ed90-89b0-f4a0-fa5aed59fa99.png)

CocosStudio２にて取得できる　User Data　の取得方法を調べました。
（確認バージョン2.3.3〜）
忘れないうちにメモ！

CSLoaderの処理に置いて、Componentとして追加されていました。
！正しくは、
Componentを継承した、ComExtensionDataが追加されてます。
よって、以下の通りです。（ComExtensionDataを取得します。）

```
auto *data = dynamic_cast<ComExtensionData*>(node->getComponent(ComExtensionData::COMPONENT_NAME));
auto userdata = data->getCustomProperty();
```

ツールの方ではUser Dataと書いてあるが、
ソースの方では、CustomProperty として扱われてました。
mockitoのspyとArgumentCaptorで処理対象についてテスト

# きっかけ

バッチ処理などの、処理の対象となるものをprivateメソッドで取得しているときに、処理対象の条件についてのテストを書きたくなったのがきっかけ。spyとArgumentCaptorをつかえばうまくいきそうとおもい、試してみた。

# やり方

## テストするコード

```java:Sample.java

public class Sample {

  public void execute() {
     List<T> targets = getTargets();
     execute(targets);
  }  

  private List<T> getTargets() {
    /* DBなどから、処理対象となるものを取得 */
    
  }

  public void execute(List<T> targest) {
     /* 対象のリストを指定しての処理 */
  }

}

```

## テストコード

ArgumentCaptorをアノテーションで用意し、テストするクラスのインスタンスをspyに渡します。
そうすると、whenなどで振る舞いを指定しないものについてはもとのままで、それらもverifyで呼び出されたかどうかを確認できます。

```java
:SampleTest.java

public class SampleTest {

  @Captor
  ArgumentCaptor<List<T>> captor;

  @Before
  public void init() {
     MockitoAnnotations.initMocks(this);
  } 

  @Test
  public void test() {
    Sample sample = spy(new Sample());

    sample.execute();

    // captorで #execute(List<T> targets)に渡された引数を取得
    verify(sample, times(1)).execute(captor.capture());
    List<T> targets = captor.getValue();

    T expected = ...;
    asssertThat(targets).contains(expected);    
  }
   

}

```

# 所感

そもそも、処理対象を取得する部分を別のクラスに切り出して、個別にテストする方がよいかもしれない。
ただ、そこまで分けるほどでないときや、関連するをまとめたいようなときには、こういったのも手軽にできてよいかも。
CentOS7のネットワーク設定

#nmcliによるネットワークの設定

接続されているdeviceの確認

```lang:
# nmcli device
デバイス  タイプ    状態      接続
ens32     ethernet  接続済み  --
lo        loopback  管理無し  --
```

deviceをActiveにする。

```lang:
# nmcli connection up ens32
接続が正常にアクティベートされました (D-Bus アクティブパス: /org/freedesktop/NetworkManager/ActiveConnection/2)
```

接続されているdeviceを再度確認

```lang:
# nmcli device
デバイス  タイプ    状態      接続
ens32     ethernet  接続済み  ens32
lo        loopback  管理無し  --
```

IPアドレスを付与する。

```lang:
# nmcli connection modify ens32 ipv4.method manual ipv4.addresses "192.168.0.82/24 192.168.0.254"
```

NICを再起動して、設定を反映。

```lang:
# nmcli connection down ens32 && nmcli connection up ens32
```

設定内容を確認

```lang:
# nmcli device show ens32
GENERAL.デバイス:                       ens32
GENERAL.タイプ:                         ethernet
GENERAL.ハードウェアアドレス:           00:XX:XX:XX:XX:XX
GENERAL.MTU:                            1500
GENERAL.状態:                           100 (接続済み)
GENERAL.接続:                           ens32
GENERAL.CON パス:                       /org/freedesktop/NetworkManager/ActiveConnection/2
WIRED-PROPERTIES.キャリア:              オン
IP4.アドレス[1]:                        192.168.0.82/24
IP4.ゲートウェイ:                       192.168.0.254
IP6.アドレス[1]:                        fe80::250:56ff:fea5:ed30/64
IP6.ゲートウェイ:
```

恒久的にIPv6を無効にする。

```lang:
# echo "net.ipv6.conf.all.disable_ipv6 = 1" > /etc/sysctl.d/disable-ipv6.conf
```

サーバ再起動

```lang:
# reboot
```
VSCodeでES6のESLintの設定をする方法 (4.2.0対応)

現在ESLintの設定はExtensionを利用するものになっているのでそのやり方。ESLint 4.2.0 に対応したものに更新しました。

- https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint
- http://eslint.org/docs/user-guide/configuring

以上を見つつ設定したものを紹介。

まず前提として、Node.jsがインストールしてあり、`npm install -g eslint`がされていることが前提です。MacでもWindowsでもLinuxでも同様です。

```
$ eslint --version
v4.2.0
```

VSCodeを起動後、Command + Shift + p でパレットを出して

```
ext install
```

を入力、 ESまで入力すると ESLint のプラグインが出てくるのでダウンロードしてインストールボタンをクリックして再起動します。

その後、メニューの Code > Preference > User Setting (日本語のWindowsだと、基本設定 > 設定 だったりもします。)

`eslint.nodePath` は自分のプラットフォームに合わせて変更してください。

```
  // ESlint extension
  "eslint.enable": true,
  "eslint.nodePath": "C:\\Users\\sifue\\AppData\\Roaming\npm\\eslint",
  "eslint.options": {
    "parserOptions": {
        "ecmaVersion": 6,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true
        }
    },
    "rules": {
      "quotes": [
        2,
        "single"
      ],
      "linebreak-style": [
        2,
        "unix"
      ],
      "semi": [
        2,
        "always"
      ],
      "no-console": 0
    }
  },
```

以上を追記します。これでESLintでNGのコードは、エラーになります。
お疲れ様でした。

なお自分は VSCodeのsetting.json は以下の感じになっています。

```json
{
  // ESlint extension
  "eslint.enable": true,
  "eslint.nodePath": "C:\\Users\\sifue\\AppData\\Roaming\npm\\eslint",
  "eslint.options": {
    "parserOptions": {
        "ecmaVersion": 6,
        "sourceType": "module",
        "ecmaFeatures": {
            "jsx": true
        }
    },
    "rules": {
      "quotes": [
        2,
        "single"
      ],
      "linebreak-style": [
        2,
        "unix"
      ],
      "semi": [
        2,
        "always"
      ],
      "no-console": 0
    }
  },
  // Controls the rendering size of tabs in characters. Accepted values: "auto", 2, 4, 6, etc. If set to "auto", the value will be guessed when a file is opened.
  "editor.tabSize": 2,
  // Controls if the editor will insert spaces for tabs. Accepted values:  "auto", true, false. If set to "auto", the value will be guessed when a file is opened.
  "editor.insertSpaces": true,
  // Controls whether the editor should render whitespace characters
  "editor.renderWhitespace": "all",
  "window.zoomLevel": 0
}
```

やっぱりスペースとタブは見えていたほうが便利ですね。
SeleniumIDE×SelBlocksを使ってXMLでDDT！

SeleniumIDEとSelBlocksプラグインとforXMLコマンドを使うと
XMLで書いた項目に対して簡単にデータドリブンテスト（DDT)が出来るようになります。


## インストールするもの
Firefoxに以下のプラグインをインストールしてください。
* Selenium IDE
* SelBlocksプラグイン

## XMLファイルの作成

入力したいデータパターンをxmlファイルに作成する


```
<testdata>
<vars no= "1111111111111110" year = "18" month = "12" />
<vars no= "1111111111111111" year = "18" month = "12" />
<vars no= "1111111111111112" year = "18" month = "12" />
</testdata>
```

## TestCaseの作成

forXmlコマンドを使って作成


```
<!--XMLの要素を1つずつ取ってくる-->
<tr>
	<td>forXml</td>
	<td>file:///C:/selenium/_testcase/card.xml</td>
	<td></td>
</tr>
<tr>
	<td>open</td>
	<td>https://XXX </td>
	<td></td>
</tr>

<!--カード情報入力-->
<tr>
	<td>type</td>
	<td>name=data[order][card_no]</td>
	<td>${no}</td>
</tr>
<tr>
	<td>type</td>
	<td>name=data[order][card_month]</td>
	<td>${month}</td>
</tr>
<tr>
	<td>type</td>
	<td>name=data[order][card_year]</td>
	<td>${year}</td>
</tr>
<tr>
	<td>endForXml</td>
	<td></td>
	<td></td>
</tr>


```

## 利点

* データ数＝XMLの要素数なので、TestCase側はループ数を考慮しなくてよくなった
* TestCaseとXMLと分けることができたので、可読性があがった
* forXMLコマンドで${}で変数として取得できるようになったので可読性があがった


###以前は・・・
これを知るまで、かなり原始的な方法を行なっていました。
* JavaScriptの配列に詰め込む
* JavaScriptの配列の配列を使って無理やり要素を詰め込む


```
<tr>
	<td>getEval</td>
	<td>objCardno = [
{&quot;no&quot;:&quot;111111111110&quot;,&quot;year&quot;:&quot;18&quot;,&quot;month&quot;:&quot;12&quot;},{&quot;no&quot;:&quot;111111111111&quot;,&quot;year&quot;:&quot;18&quot;,&quot;month&quot;:&quot;12&quot;},{&quot;no&quot;:&quot;111111111112&quot;,&quot;year&quot;:&quot;18&quot;,&quot;month&quot;:&quot;12&quot;}];</td>
<td></td>
</tr>

```

この方法だと、JavaScriptエラーに高確率で引っ掛かり、デバッグもしづらかったのです。
今回の方法では、XMLに記述できるので、可読性もあがるのでステキになりました。

（JSファイルだけ外出しにする方法もあるのですが、あんまり根本的な解決としてはクールじゃない）

###再利用性があがる
* 入力パターンだけをXMLで外に出せたので、そのXMLだけ他のTestCaseに使いまわしが可能になった
* TestCaseの内容を変更せずに、XMLファイルパスだけを変更することで、別の入力パターンも簡単にできるようになる

##最後に
今回の疑問は、https://seleniumjp.slack.com で質問したところSelBlocksが使えるんじゃない？と教えていただきました。
ありがとうございました:)
RSA 2048bitの秘密鍵とcsrをつくるコマンド

openssl req -new -nodes -newkey rsa:2048 -keyout example.com.key -out example.com.csr

※パスフレーズは外れた状態になります
※コマンド実行後の詳細は下記を参考に
→https://www.geotrust.co.jp/support/ssl/csr/apache_openssl_new.html
Scala 自分型アノテーションメモ

self-type annotation(自分型アノテーション)
クラスに自分以外の別の型を宣言することが出来る

```Scala
// Bowトレイト
// DogクラスにBow型を含ませる用
trait Bow {
  def bow(s: String): String = s*2
}

// Dogクラス
// self: BowでDogにBow型を宣言する
// bowwowの中でBowトレイトのbowを使用している
class Dog { self: Bow =>
  def bowwow(s: String): Unit = println( bow(s) )
}

// self-type annotationを使用している場合インスタンス作成時にtraitをミックスインする必要がある
// with Bowを付けないとエラーが出る
val dog = new Dog with Bow
dog.bowwow("wann")
```

出力結果
wannwann


<h3>参考資料</h3>

[PHP のトレイトに気をつける](http://tototoshi.hatenablog.com/entry/2015/01/14/172602 "PHP のトレイトに気をつける")
[Scalaクラス](http://www.ne.jp/asahi/hishidama/home/tech/scala/class.html "Scalaクラス")
覚書：AWSのEC2にnginx(1.8.0) × PHP(5.6) × Node.js(0.1) × MySQL(5.6) の環境をつくる

# 諸注意

- 覚書なので、参考程度にお願いします
- ゴールは**PHPファイルが扱える環境をnginxを使って作成する**ところまでです

# パッケージのインスコ

**2016年01月18日現在、以下のバージョン群の環境ができます。**
- Node.js v0.10.36
- npm v1.3.6
- nginx v1.8.0
- php v5.6.14（5.4, 5.5, 5.6が選択可能）
- mysql v5.6.27

## Node.jsのインスコ

`yum install -y nodejs npm --enablerepo=epel`

## nginxのインスコ

`yum install -y nginx`

## PHPのインスコ

`yum install -y php56-opcache php56-devel php56-mbstring php56-mcrypt php56-mysqlnd php56-fpm php56-gd`

## MySQLのインスコ

`yum install -y mysql56 mysql56-server`

# デプロイ環境の準備

## デプロイ先を作成

### 1. **/var/www/html** を作成する。

```shell-script:shell

$ cd /var
$ mkdir www
$ cd www
$ mkdir html

```

### 2. 先ほど作ったディレクトリに **index.php** を作成する。

```shell-script:shell
$ cd /var/www/html
$ vim index.php
```

```php:/var/www/html/index.php
<?php phpinfo();

```

### 3. ディレクトリの権限を変更する

```shell-script:shell

$ chown -R nginx:adm /var/www/html

```

# nginxとphp-fpmとmysqlの設定

- httpdを自動起動しないように、nginxとphp-fpmを自動起動するようにする。（サーバー起動時）
- nginxとphp-fpmのサービスを開始する

```shell-script:shell

$ chkconfig --level 2345 httpd off
$ chkconfig --level 2345 nginx on
$ chkconfig --level 2345 php-fpm on
$ chkconfig --level 2345 mysqld on
$ service nginx start
$ service php-fpm start
$ service mysqld start

```

# nginxの独自設定

### 0. デフォルトの設定をコメントアウトする

＞ 2015-01-19追記

*/etc/nginx/nginx.conf* にデフォルトの設定が記載されています。
`server {}` の部分です。
下記工程 1 の sample.conf で記載していく内容に書き換えるのもアリです。
　
### 1. nginxの独自設定ファイル(Ex:sample.conf)を作成する

```shell-script:shell

$ cd /etc/nginx/conf.d
$ vim sample.conf

```

```conf:/etc/nginx/conf.d/sample.conf

server {
  listen 80;
  server_name localhost;
  root        /var/www/html;
  index       index.php;

  location / {
    if (!-e $request_filename) {
      rewrite ^(.+)$  /index.php?url=$1 last;
      break;
    }
  }

  location  ~ \.php$ {
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    include        fastcgi_params;
  }
}

```

### 2. 独自設定ファイル(Ex:sample.conf)の記載にミスがないかを確認する

```shell-script:shell

$ nginx -t

```

### 3. 2でエラーが出なければ設定を再読み込み

```shell-script:shell

$ nginx -s reload

```

# 確認

`http://[グローバルＩＰもしくはホスト名]/` にアクセスしてPHPの設定情報が表示されれば問題ありません。
※事前にセキュリティのインバウンドにてHTTP(80ポート)が有効になっているかどうかを確認する必要があるかと思います。
（申し訳程度の不安定なAWS要素）
UITextFieldで入力された文字の判定や、文字数、Byte数を取得する


UITextFieldのDelegateメソッドのメモ


```objc:.m
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"入力された文字 : \"%@\"",string);
    NSLog(@"入力済みの文字 : \"%@\"",textField.text);
    NSLog(@"入力完了後の文字 : \"%@\"",newString);
    NSLog(@"入力完了後の文字数 : %ld",(long)[newString length]);
    NSLog(@"入力完了後のByte数 : %ld",(long)[newString lengthOfBytesUsingEncoding:NSShiftJISStringEncoding]);
    NSLog(@"削除キー押下? : %d",[string length] == 0 && range.length > 0);

    return YES;
}
```

上記の方法だと、日本語入力で変換中の場合、ローマ字（英語）で取得するので（"あ"が変換中の場合は"a"を取得）
表示されている文字そのものを取得する場合は下記で。

```objc:.m
- (void)viewDidLoad
{
    [super viewDidLoad];

    // 文字入力時に指定のメソッドを呼ぶ
    [_textField addTarget:self action:@selector(didChangeTextField:) forControlEvents:UIControlEventEditingChanged];
}

/**
 *  テキストフィールドの値が変更される度に呼ばれます
 *
 *  @param textField UITextField
 */
- (void)didChangeTextField:(UITextField *)textField
{
    NSString *text = textField.text; // 入力されている文字を取得
}

```
Card wrapper



> **Note:** this is a simple wrapper for material design lite with mithril

### Resource:
Mithril [link](http://mithril.js.org/)
Material design lite [link](http://www.getmdl.io/)

### Implement
```javascript
// es6
let demoCard = {
  view(ctrl, args) {
    args = Object.assign(args, {
      stylename: formatName(args.caption) || 'demo',
      width: args.width || 400,
      height: args.height || 400
    });
    return m(Grid, {}, [
      m('style', {}, `.${args.stylename}-card-image.mdl-card {
          width: ${args.width}px;
          height: ${args.height}px;
          background: url('${args.src}') center / cover;
        }
        .${args.stylename}-card-image > .mdl-card__actions {
          height: 52px;
          padding: 16px;
          background: rgba(0, 0, 0, 0.2);
        }
        .${args.stylename}-card-image__filename {
          color: #fff;
          font-size: 14px;
          font-weight: 500;
        }`
      ),
      m('div', {class: `${args.stylename}-card-image mdl-card mdl-shadow--2dp`}, [
        m('div', {class: `mdl-card__title mdl-card--expand`}, ''),
        m('div', {class: 'mdl-card__actions'}, m(`span.${args.stylename}-card-image__filename`, {}, args.caption || ''))
      ])
    ]);
  }
}
```

### Usage:
```javascript
m('div', {}, m(demoCard, {
  src: 'http://img6.cache.netease.com/photo/0001/2016-01-13/BD6V26T55MC30001.jpg',
  caption: 'demo'}, '')
);
```

### Screenshot
![demo](https://ooo.0o0.ooo/2016/01/17/569b43f520690.jpg
)
Wordpress テーマ作成時のstyle.cssコメント


Wordpressのテーマ作成時には、必ずstyle.cssが必要。
そして、テーマについての説明もstyle.cssに記入する（必須）。
最低でも以下くらいは書いておきたいメモ。

```css:style.css
/*
Theme Name: テーマのタイトル
Author: 作成者名
Author URI: 作成者のURL（あれば）
Description: このテーマについての説明文
Version: バージョンを記入（1.0とか）
License: GNU General Public License v2 or later
License URI: http://www.gnu.org/licenses/gpl-2.0.html
*/
```

詳しくは以下Wordpressのcodex
https://wpdocs.osdn.jp/%E3%83%86%E3%83%BC%E3%83%9E%E3%81%AE%E4%BD%9C%E6%88%90
※日本語版は最新情報が翻訳されていない場合があるので、英語版もみること
https://codex.wordpress.org/Theme_Development
R でランダムに木を生成する #rstatsj

R で適当な木を生成する必要があったので適当に書きました。

```r:R
generate_tree <- function(parent_id, max_width, max_depth) {
  sibling_num <- min(sample(seq_len(max_width), 1), 9)
  depth_num <- sample(seq_len(max_depth)-1, sibling_num, replace = TRUE)
  child_ids <- paste0(parent_id, seq_len(sibling_num))
  result <- data.frame(parent=parent_id, child=child_ids, stringsAsFactors = FALSE)
  for(i in seq_len(sibling_num)) {
    if(depth_num[i] != 0) {
      child_tree <- generate_tree(child_ids[i], max_width, max_depth-1)
      result <- rbind(result, child_tree)
    }
  }
  result
}
```

使い方：

```r:R
generate_tree(1, max_width = 3, max_depth = 3)
```

```:結果
  parent child
1      1    11
2      1    12
3      1    13
4     12   121
5    121  1211
6    121  1212
7    121  1213
8     13   131
```

適当な木のエッジ情報を生成します。

分かりにくいので **igraph** で描画する。

```r:R
library(igraph)
plot_igraph <- function(igraph) {
  plot.igraph(igraph,
              layout=layout_as_tree,
              vertex.size=20,
              vertex.label.cex=0.8,
              vertex.label = V(igraph),
              edge.arrow.size = 0.5)
}
```

```r:R
tr <- generate_tree(1, 3, 3)
g <- graph.data.frame(tr)
plot_igraph(g)
```
![Rplot.png](https://qiita-image-store.s3.amazonaws.com/0/2570/d770ecae-439e-2ca2-035f-b996b2788787.png)

```r:R
tr <- generate_tree(1, 4, 4)
g <- graph.data.frame(tr)
plot_igraph(g)
```

![Rplot03.png](https://qiita-image-store.s3.amazonaws.com/0/2570/fa96ca07-580c-a7d2-f1ff-2500a2158010.png)


Enjoy!

## 追記

かずたん先生に教えてもらった **DiagrammeR** で描いてみました。

```r:R
library(DiagrammeR)

edges <- generate_tree(1, 3, 3)
edges_df <- create_edges(from = edges$parent,
                         to = edges$child)
graph <- create_graph(edges_df = edges_df)

render_graph(graph)
```

![Rplot04.png](https://qiita-image-store.s3.amazonaws.com/0/2570/25021d47-d077-5a36-5c51-875e91d74f8b.png)
DownloadManager.QueryのsetFilterByIdとsetFilterByStatusは一緒に使ってはいけない

とあるダウンロードIDについて、ダウンロード開始待ちまたはダウンロード中の状態であるかどうかを知りたくてこういうメソッドを作っていた。

```java
  boolean isDownloading(long downloadId) {

  boolean ret = false;

  Cursor cursor = downloadManager.query(new DownloadManager.Query()
      .setFilterById(downloadId)
      .setFilterByStatus(DownloadManager.STATUS_PENDING | DownloadManager.STATUS_RUNNING));

  if (cursor.moveToFirst()) {
    ret = true;
  }

  cursor.close();

  return ret;
}
```

しかし、この実装ではうまく判定できない。ダウンロードID`1`が実行中の場合にダウンロードID`2`について上記のメソッドを実行すると、`true`が返ってきてしまう。DownloadManagerの中の処理を追ってみると、どうやらSQLを組み立てるところでダウンロードIDによるフィルター処理とステータスによるフィルター処理がORで繋がってしまっているっぽい。
つまり、ダウンロードID`2`について問い合わせたつもりが、ダウンロードID`1`の結果が返ってきてしまうということです。

仕方ないので、ダウンロードIDでレコードを取得した後、その状態をチェックすることにした。

```java
boolean isDownloading(long downloadId) {

    boolean ret = false;

    Cursor cursor = downloadManager.query(new DownloadManager.Query()
            .setFilterById(downloadId));
    if (cursor.moveToFirst()) {
        int status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));
        if ((status & DownloadManager.STATUS_PENDING) != 0 
            || (status & DownloadManager.STATUS_RUNNING) != 0) {
            ret = true;
        }
    }

    cursor.close();
    return ret;
}
```

これならダウンロードID`1`が実行中の場合にダウンロードID`2`についてメソッドを呼び出したらちゃんと`false`が返るし、ダウンロードID`1`について呼び出せば`true`が返る。
inodeが枯渇しそうになってた...。


---

参考) http://iriya-ufo.net/2013/09/18/190.html
　　　助かった。

---

早速あたりをつけた。

     find / -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n
     (略)
     ：
       14171 opt
       81482 usr
     2009517 root

---

/root配下で無駄にファイルを使ってるところを探して消した。

before

    /dev/vda1            2621440 2209754  411686   85% /
    

after

    /dev/vda1            2621440  294120 2327320   12% /
Dockerfileでhttpsアクセスができるコンテナを作る

## 環境
コンテナのOSはUbuntu 15.10
Apacheのmod_sslを使用

## 経緯
現在開発しているシステムではリソースの問題からDocker Registryの作成と保守が厳しいので、プロダクションをリリースする際にDockerfileをビルドしてリリースしています。小規模の会社や最近Dockerを導入した会社にはこのようなリリースの仕方をしているところもあると思います。そこで、Dockerfileをビルドした時にそのままApacheの設定を自動でやってもらおうということで今に至ります。

## 方法
同じディレクトリにDockerfileとSSL証明書とApacheの設定ファイルがあると仮定します。

```:ssl.conf
<VirtualHost _default_:443>
    ServerAdmin webmaster@test.com

    DocumentRoot /var/www/html/hoge

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    SSLEngine on

    SSLCertificateFile /etc/apache2/hoge.crt
    SSLCertificateKeyFile /etc/apache2/hoge.key

    <FilesMatch "\.(cgi|shtml|phtml|php)$">
        SSLOptions +StdEnvVars
    </FilesMatch>
    <Directory /usr/lib/cgi-bin>
        SSLOptions +StdEnvVars
    </Directory>

    <Directory /var/www/html/test>
        Options Indexes FollowSymLinks
        AllowOverride all
        Require all granted
    </Directory>
    DirectoryIndex index.php


    BrowserMatch "MSIE [2-6]" \
                  nokeepalive ssl-unclean-shutdown \
                  downgrade-1.0 force-response-1.0
    # MSIE 7 and newer should be able to use keepalive
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown
</VirtualHost>
```

お気づきだと思いますが、これはApacheをインストールした時にsites-availableに最初から入っているdefault-ssl.confのパスだけいじったものです。

```:Dockerfile
.
.
.
RUN apt-get install -y apache2
RUN a2enmod ssl
COPY ./ssl.conf /etc/apache2/sites-available/ssl.conf
COPY ./hoge.key /etc/apache2/hoge.key
COPY ./hoge.crt /etc/apache2/hoge.crt
RUN a2ensite ssl
.
.
.
CMD ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]
```

DockerfileはSSL証明書と設定ファイルををコピーして`a2ensite`で有効にしています。これでコンテナ起動時にすでにhttpsでアクセスできるようになっているはずです。
vagrantでLAMP環境構築

#はじめに
Vagrantで仮想環境（CentOS）を立ち上げ、そこにLAMP環境を構築していきます。

![LAMPキャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/107936/853d4212-4da9-a6ad-f9da-147616834491.png)


#準備
まずはVirtualBox & Vagrantをインストール

VirtualBox
https://www.virtualbox.org/

Vagrant
https://www.vagrantup.com/

#vagrantによる仮想環境構築
![LAMPキャプチャ5.PNG](https://qiita-image-store.s3.amazonaws.com/0/107936/856423eb-1357-87c8-4223-caa93ec57610.png)


- サーバー用ディレクトリを作成

```
#mkdir centos
```

- CentOS6.7で初期化

```
#cd centos
#vagrant init bento/centos-6.7
```

- プライベートIPを割り当て

```
#vi Vagrantfile
// 192.168.33.10の行の#を削除し、コメントアウトを解除
```

- 仮想サーバー立ち上げ

```
#vagrant up
```

#LAMP環境構築
![LAMPキャプチャ4.PNG](https://qiita-image-store.s3.amazonaws.com/0/107936/f82ad2ae-6bbf-8c6b-57e7-c24907fb313a.png)



ここからは仮想サーバーにログインして作業する。

```
#vagrant ssh
```


##インストール

- まずはyumを最新に

```
#sudo yum -y update
```

- Apacheインストール

```
#sudo yum -y install httpd
```

- MySQLインストール

```
#sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el6-5.noarch.rpm
#sudo yum -y install mysql-community-server
```

- PHP5.6インストール

```
#sudo rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
#sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
#sudo yum -y install --enablerepo=remi --enablerepo=remi-php56 php php-mbstring php-mcrypt php-pear php-mysqli
// 自分の欲しいものだけインストール
```
##ApacheとMySQLを起動

```
#sudo service httpd start
#sudo service mysqld start
```

##設定（任意）

vagrant upしたときに自動で起動する設定

```
#sudo chkconfig httpd on
#sudo chkconfig mysqld on
```

ドキュメントルートの所有者を変更

```
#sudo chown vagrant:wheel /var/www/html
```
XcodeでiOSアプリをsubmitする時に、Upload to App Store ボタンとValidateボタンが無効になってしまう場合

XcodeでiOSアプリをsubmitする時に、Upload to App Store ボタンとValidateボタンが無効になってしまう場合がありました。
しかも、左側のリスト部分を見ると、本来は iOS Apps というカテゴリ内に出来上がったアーカイブがリストアップされるところが、Other Items というカテゴリ内にリストアップされてしまっています。

![Untitled.png](https://qiita-image-store.s3.amazonaws.com/0/109818/1b0a716b-9e9d-e97b-a00a-c4d769aaea8c.png)

この現象が発生したのは Google API 用の static library を組み込んだアプリだったのですが、static library のプロジェクト設定が原因でした。
static library のプロジェクト設定の Build Settings で、Skip Install の項目を YES にすることで解決しました。

詳細につきましては、以下の、Appleトラブルシューティングをご覧ください。
[&lt;Project name&gt; does not contain a single–bundle application or contains multiple products. Please select another archive, or adjust your scheme to create a single–bundle application.](https://developer.apple.com/library/ios/technotes/tn2215/_index.html#//apple_ref/doc/uid/DTS40011221-CH1-PROJ)
rails s が失敗してERROR RuntimeError: Missing `secret_key_base` と言われました。

rails sしたら動かなくて困りました。

# rails sでエラー

```
bundle exec rails s -b 0.0.0.0 -p 8888
=> Booting WEBrick
=> Rails 4.1.0 application starting in development on http://0.0.0.0:8888
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
[2016-01-17 14:07:02] INFO  WEBrick 1.3.1
[2016-01-17 14:07:02] INFO  ruby 2.1.0 (2013-12-25) [x86_64-linux]
[2016-01-17 14:07:02] INFO  WEBrick::HTTPServer#start: pid=1954 port=8888
[2016-01-17 14:07:08] ERROR RuntimeError: Missing `secret_key_base` for 'development' environment, set this value in `config/secrets.yml`
	/var/www/html/pugiemonn_app/vendor/bundle/ruby/2.1.0/gems/railties-4.1.0/lib/rails/application.rb:440:in `validate_secret_key_config!'
	/var/www
```
Missing `secret_key_base`と書いてあります。

# secrets.yml に secret_key_baseを書く
secrets.ymlが空だったので、developmentにsecret_key_baseを書くといいみたいでです。

```
vi config/secrets.yml

development:
  secret_key_base: aaaa
```
`secret_key_base`を適当に入れました。

# 再度rails s

今度は動きました(๑•̀ㅂ•́)و✧

# secret_key_base を生成する
コメントをいただいたようにsecret_key_baseを生成します。

```
bundle exec rake secret
598b5abb20fb110f686d8230765c1a72e1aac33f63c38646c1f3639e570c847a5b9ed0dd21f7c8797f2cd0859b1a5a3e5e179167f5c07372d005226159ce1a54
``` 
おお！！これを設定すればいいんですね(๑•̀ㅂ•́)و✧

# 参考
http://stackoverflow.com/questions/23180650/how-to-solve-error-missing-secret-key-base-for-production-environment-on-h
rails s が失敗して`raise_no_secret_key': Devise.secret_key was not setと言われました。

githubの某リポジトリをクローンしてrails sしたら動かなくて困りました。

# rails sでエラー

```
bundle exec rails s -b 0.0.0.0 -p 8888
=> Booting WEBrick
=> Rails 4.1.0 application starting in development on http://0.0.0.0:8888
=> Run `rails server -h` for more startup options
=> Notice: server is listening on all interfaces (0.0.0.0). Consider using 127.0.0.1 (--binding option)
=> Ctrl-C to shutdown server
Exiting
/var/www/html/pugiemonn_app/vendor/bundle/ruby/2.1.0/gems/devise-3.2.4/lib/devise/rails/routes.rb:481:in `raise_no_secret_key': Devise.secret_key was not set. Please add the following to your Devise initializer: (RuntimeError)
```
`Devise.secret_key was not set.`と書いてあります。

# config.secret_key のコメントを外す
config/initializers/devise.rbにある、`config.secret_key`を有効にすると良いみたいです。

```
vi config/initializers/devise.rb 

config.secret_key = 'f16010379bf12db8fd95a9d247deda7d6e732134e80275155f222db2c6d35 .. 略'
```
`config.secret_key`はコメントになっていたのでコメントを外しました。

# 再度rails s

今度は動きました(๑•̀ㅂ•́)و✧



# 参考
http://renkaze.seesaa.net/article/375608124.html
Unityでアニメーションの状態を確認する

特定のClipの再生が始まったらなにがしかの処理をしたい、みたいなときのチェック方法。

```csharp
bool isReady = GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).shortNameHash.Equals(Animator.StringToHash("Clipの名前"));
```

もしくは

```csharp
bool isReady = GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("レイヤー名.Clipの名前");
```

でチェックできる。
前者はClipの名前だけでよくて、後者はレイヤーの名前も必要となる。

尚、レイヤーの名前はAnimatorウィンドウに表示されている。
![スクリーンショット 2016-01-18 午後3.43.00.png](https://qiita-image-store.s3.amazonaws.com/0/18707/8c2ba652-4663-45bb-2992-63ad3cddd74b.png)
この画像でいうと「Base Layer」がこれに該当するので、IsNameメソッドを利用する場合、「Base Layer.Clip名」という風に指定をするような形になる。
macにnginxとuWSGIの環境構築

ちょっと勉強がてらnginxとuwsgiをmacにインストールして試した際に発生したエラーと解決方法をメモして行こうと思います。


#nginxのインストール
`brew install nginx`

#uwisgiのインストール
```
# pip install uwsgi
# ………
Cleaning up...
Command /usr/bin/python -c "import setuptools, tokenize;__file__='/private/var/folders/bq/○○○○/T/○○○○/uwsgi/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /var/folders/bq/○○○○/T/pip-RebnC4-record/install-record.txt --single-version-externally-managed --compile failed with error code 1 in /private/var/folders/bq/○○○○/T/○○○○/uwsgi
Storing debug log for failure in /Users/○○○○/Library/Logs/pip.log
```
何かエラーが発生した。
このエラー内容で色々探してみたら

`sudo apt-get install python2.7-dev`

これやれば、直るらしい。
ただ、macには標準でapt-getが無いため、違う方法が無いか探してみた。

`sudo C_INCLUDE_PATH=/usr/local/include LIBRARY_PATH=/usr/local/lib pip install uwsgi`

こんな感じで、やるとエラーが発生せずuwsgiがインストールされた。
まだ、勉強中のためuwsgiがいまいちどんなモノかも解っていないモノのとりあえず、スタートラインに立てたもよう。