OmniAICreator/Qiita-1.07M huggingface dataset:
GitHubでRevertする

## 問題

pushするとき、`git push origin <branch-name>:master`でpushした、masterでmergeした。しかし、masterでpushしたくないで、今のbranchでpushしたい。

そのために、Revertする。

## Revertの使い方

- まずは今のlogを検査する：

`git log -2 `

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/0ba0ad9c-4dff-b29a-5342-23ffe7c4f8cb.png)


- revertを実行する：

`git revert <commit-hashcode>`

ここは：

`git revert b1a0b4c0cf32c11bd6f3890d6cbc4a7964c85642`

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/4070d90b-8384-5f17-bf87-85c80db56227.png)

Revertが成功した。

## 自分のブランチにpushする。

- 先の編集を戻る：

`git cherry-pick <commit-hashcode>`

- pushする：

`git push origin <branch-name>`

以上。
[PHP] getimagesize() でSSLエラー

# 状況

getimagesize()で外部サイトから画像のサイズ情報を取得する処理、急に特定のサイトでエラーがでるようになりました。

```
 [PHP] E_WARNING: getimagesize() [function.getimagesize]: SSL operation failed with code 1. OpenSSL Error messages: error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure
```

最初は画像取得先のサーバーがssl化したかな？と思いましたが、もともとhttpsでアクセスしにいってたので、
どうやらそのせいじゃないっぽいです。

# SSLとTLS

OpenSSLには、SSLとTLSという2つのバージョンがあるんですね。（そんなことも知らなかった）

> セキュリティの懸念から、現在では一般的にSSL3.0プロトコルの利用は非推奨とされているため、多くのウェブサイトではSSL3.0の利用を終了し、TLS1.2などより安全性が高いバージョンのプロトコルが使われるように設定されています。
https://www.symantec.com/ja/jp/page.jsp?id=ssl-tls

なるほど…

# チェック

SSL3.0を指定して画像取得→error

```
$ curl https://test.com/image01.jpg --sslv3 --head
curl: (35) SSL connect error
```

tls1.0を指定して画像取得→OK

```
$ curl https://test.com/image01.jpg --tlsv1.0 --head
HTTP/1.1 200 OK
```

やはり、画像取得先のサーバーでSSL3.0を禁止したみたいです。

# 解決策

PHPのバージョンが高ければいろいろやりようはあるみたいですけど、
今回はPHP5.2 :rolling_eyes: だったため、getimagesize()はあきらめてcurlを使うことにしました。
こんなかんじで

```
$ch = curl_init($image_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
$data = curl_exec($ch);
curl_close($ch);
if( @file_put_contents($localpath ,$data) ){
    list( $w, $h ) = @getimagesize( $localpath );
    $ret = array( 'w' => $w, 'h' => $h );
}
```

curlであれば特別な設定はなくても画像取得できました。
画像を一回ローカルに保存してから画像サイズを取得しています。
Docker for Windows で Tensorflow を走らせるまで

作業メモです。（2017/09/27 実施）
スクショばっかりでスミマセン。
巷では環境構築でトラブったという噂も耳にしますがとりあえず今現在の最新版を使ったら特にトラブルなくすんなり済みました。

#環境
Windows 10 Pro（Creators Update 適用済）
Core i7-3610QM, RAM 16 GB, 64 bit
※ Hyper-V が有効化できないバージョンの Windows だとダメ

#Docker for Windows インストール
[Docker Toolbox を使うのはもはやレガシー](https://docs.docker.com/toolbox/toolbox_install_windows/) とのこと。
[Docker 公式](https://docs.docker.com/docker-for-windows/install/) からインストーラーをダウンロードして実行するだけ。
途中で Hyper-V の有効化を求められたりして１、２回再起動が必要。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/23a50d57-9ef1-996e-36f5-1647b78c6730.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/a6c5f04f-dbe0-45ff-aea9-dc2d24e2c774.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/9e74aebf-0c89-a70b-dce7-a7f7350f8ab5.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/50d764ff-74f4-e178-e5bc-4355088e7c34.png)

特にトラブルなく動いてしまった。

#Jupyter Notebook 環境
これも普通に動く。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/a46f4736-9abe-f55a-a61b-20995fce7646.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/ce7e8227-452a-6bca-0264-87638bbc366e.png)

#Windows 側のディレクトリをマウントしたい場合
起動時に指定する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/7554e53b-0007-70b7-8643-de055e4b5ad8.png)

ドライブへのアクセス許可の確認が出る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/e2a9532f-4a00-51fe-57ad-8b4244956ab0.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/253d6ea3-f7cb-e069-08fb-ee65d5514e82.png)

Windows 側のユーザとしてログインを求められるのでパスワードを入れればＯＫ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/e7bbeff3-492b-3cdb-d407-0513d700ee02.png)

Windows 側の領域が Docker 側にマウントされており、どちら側からもファイル操作等可能。

#Tensorflow / Tensorboard 起動
jupyter notebook 用と Tensorboard 用にポートを指定しておく。

```bash
docker run -it -p 8888:8888 -p 6006:6006 gcr.io/tensorflow/tensorflow:latest /bin/bash
```

jupyter notebook、tensorboard 共にバックグラウンドで走らせておく。

```bash
nohup jupyter notebook --allow-root >> jupyter.log 2>&1 &
nohup tensorboard --logdir=data >> tensorboard.log 2>&1 &
```

これで

- jupyter notebook は localhost:8888
- tensorboard は localhost:6006

にて繋がる。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/e3d89a9e-6764-536c-6f9d-83635b82b60c.png)

Jupyter notebook へのアクセス時はトークン求められるのでログから拾ってコピペ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/7dda765a-80b0-c603-7c27-f121caab4007.png)

これでアクセスできた。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/d1968e0a-f13b-c9ea-d300-25a06c6d2a6f.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/b2e2f71c-5495-92e5-8849-74b14af45e0a.png)


なお Docker の設定をデフォルトのままでやっていたら MNIST のトレーニング回すところで jupyter が落ちた。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/98fec53c-f826-df37-21e8-45d28aeceaa3.png)

メモリ割り当てを増やしてあげると
![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/73c5f403-5ca0-85bd-1c58-2d48071720ff.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/54184/1d8a87ca-5557-39cd-1221-dff105ae3ac6.png)

問題なく動いてくれた。



Docker for Windows からの GPU アクセスは今んところ出来ないんですかね？
nvidia-docker for Windows はよ
Githubでのコンフリクトの対処方法

##　主な原因

- コンフリクトの原因：自分の作業ブランチを作成してからPull Requestする間に同じファイルを別ブランチで編集されてしまったとか。

- このように「unmerged paths」があるので、コンフリクトが出できる。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/585a28ba-1898-76b8-2573-788c2f8dff6b.png)


##　問題発見

- まずは今のcommitを検査する。

```
git log -10
```
![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/e74ad179-63dd-90c3-c8a3-aee6cc9a5005.png)


- Githubでのcommitを検査する。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197386/3f13caa9-4b11-91bb-f5d6-7c51be36717c.png)




- 比較すると：ローカルでのcommitとGithubでのcommitは一致しない！

## 対処方法

この後はresetをやりますので、今の修正を保存する。
- 今の編集をadd：`git add <FileName>`（私の修正は新しいフィイルを増えるため、addが必要だ）
- 今の編集を保存する：`git stash save <StashName>`
- masterブランチを最新版にする：

1.`git reset --hard origin/master`

こうすると、今のstatusは：
![スクリーンショット 2017-09-27 17.33.30.png](https://qiita-image-store.s3.amazonaws.com/0/197386/de41791e-102e-faaa-8637-b87651035c01.png)

2.`git pull origin master`

- 自分のブランチを作る：

`git checkout -b <BranchName>`

- 自分の編集を加える：

`git stash apply stash@{0}`

- commitを作る：

`git commit -m <YourCommitMessage>`

- 自分のブランチでpushする

`git push origin <BranchName>`
Papertrailを使ってみる

## 試した環境

```bash
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="17.04 (Zesty Zapus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 17.04"
VERSION_ID="17.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=zesty
UBUNTU_CODENAME=zesty
```

## Papertrail

https://papertrailapp.com/

```
# 自動でSystem/OSログ関連がセットアップされます
$ wget -qO - --header="X-Papertrail-Token: xxxxxxxxxxxxxxx" \
https://papertrailapp.com/destinations/xxxxxxx/setup.sh | sudo bash

# 以下の手順で手動でログを登録できる
# https://github.com/papertrail/remote_syslog2/releases/tag/v0.19
$ wget https://github.com/papertrail/remote_syslog2/releases/download/v0.19/remote-syslog2_0.19_amd64.deb
$ dpkg -i remote-syslog2_0.19_amd64.deb
$ sudo remote_syslog -p {YOUR_PORT} -d {YOUR_DOMAIN} --pid-file=/var/run/remote_syslog.pid /path/to/access_log
```
Magit の cherry-pick で squash 的なものをやるやり方


Magitはたまに操作体系を変えてくることがあるので `Magit 20170913.1424` のバージョンでの話と思ってください。

いくつかコミットを取り出してそれを一つのコミットに圧縮して別のブランチに適用したいときは (以下特に注釈がないときは Magit 上での操作です)、

* `Lo` (Log Other) 等で取り込みたいコミットの存在するブランチのログを表示させる
* 表示されたログで `C-space` などを使ってコミットを選ぶ
* `Aa` (Cherry Apply) を使ってワーキングツリーとインデックスに選択したコミット内容を取り込む。このコマンドが実行されて競合がなければ選ばれたコミットがワーキングツリーに適用されインデックスに add された状態になっています
* あとは `cc` → コミットメーッセージ編集 → `C-c C-c` と通常のコミット手順と一緒です

以上
sshd_config に RSAAuthentication no を設定する必要はもうない

新しいサーバを立ち上げていつも通りに公開鍵認証を使うように設定していたら、sshdからエラーが出たので調べてみた。

```
/etc/ssh/sshd_config line **: Deprecated option RSAAuthentication
/etc/ssh/sshd_config line **: Deprecated option RhostsAuthentication
```

「sshd インストール」とかでググると、2003年(マトリックス リローデッドが流行った頃！)に書かれた記事がトップに出てきて、その手順の中に*RSAAuthentication no*が書かれているのが、いまだに受け継がれているっぽい。

結論からいうと、これらの行はサクッと削除してOK。

# OpenSSH 7.4で、SSH v1サポートが(実質的に)削除された

 OpenSSHは、SSHの実装の一つで、現代のほとんどのlinuxディストリビューションで採用されているデファクトスタンダード。2016年に発表された[OpenSSH 7.4のリリースノート](https://www.openssh.com/txt/release-7.4)では、こんなふうに書かれている。

```
 In approximately August 2017, removing remaining support for the SSH v.1 protocol (client-only and currently compile-time disabled).
(私訳)2017年夏頃をもって、残っているssh v.1プロトコルのサポートを削除する予定です(現在は、クライアント側にのみ実装が残っていて、通常のコンパイルでは無効に設定されています)
```
```
This release removes server support for the SSH v.1 protocol.
(私訳)サーバサイドのSSH v.1サポートはこのリリースで削除されました。
```

ssh v.1は2001年ごろから脆弱性が指摘されていて、その後v.2に移行が進んだ。
上記の通りv.1のサポートは終了したし、もっと前から意図して使うようにしない限り使えないように設定されていたから、yumとかapt-getでバイナリをインストールして使っているだけの人は、v.2を使っていると思って間違いない。

# SSH v1向けのオプション

 例えば[FreeBSD Manual Pages](https://www.freebsd.org/cgi/man.cgi?sshd_config(5))に記述が残っている(公式のmanだと、もう廃止されているので載っていない)のだけど、RSAAuthenticationオプションは、"This option applies to protocol version 1 only." となっている。

```
RSAAuthentication
  Specifies whether pure RSA authentication is allowed.
The default is ``yes''. This option applies to protocol version 1 only.
```

 同様にRhostsAuthenticationについても、[docs.oracle.com](http://docs.oracle.com/cd/E19253-01/816-5174/sshd-config-4/index.html)あたりを見ると、

```
RhostsAuthentication
  Specifies whether authentication using rhosts or /etc/hosts.equiv files is sufficient. Normally, this method should not be permitted because it is insecure. RhostsRSAAuthentication should be used instead, because it performs RSA-based host authentication in addition to normal rhosts or /etc/hosts.equiv authentication. The default is no. Note that this parameter applies only to protocol version 1.
```

ということで、これもSSHv1向けのオプションだったということがわかる。

以上。SSHv1をサポートしない最新のopensshにおいて、*RSAAuthentication*,*RhostsAuthentication*の設定を記述する必要はもうない。
datetime-localをサポートしていないブラウザの時に代替ライブラリを使う

日時を入力するフォームを実装する際に、datetime-localを使うことで、対応端末・ブラウザに適した形で入力を行えます。
しかし、IE11やSafariといった一部ブラウザで利用ができないため、代替機能を提供する必要があります

## inputタグのtypeのサポートをチェックする方法
https://stackoverflow.com/questions/10193294/how-can-i-tell-if-a-browser-supports-input-type-date


## 実装
今回は代替として
https://github.com/xdan/datetimepicker
利用します

```html
<input class="datetime" type="text" value="2017/01/01 00:00" min="2017/01/01 00:00" step="60">
```

```js
//datetime-localのサポートチェック
function checkDatetimeSupport() {
    var input = document.createElement('input');
    input.setAttribute('type','datetime');

    var notADateValue = 'not-a-date';
    input.setAttribute('value', notADateValue); 

    return (input.value !== notADateValue);
}

if (!checkDatetimeSupport()) {
    //サポートしていない場合はライブラリを設定する
    $('input.datetime').datetimepicker({
        format:'Y/m/d H:i',
        step:1,
        minDate:"2017/01/01",
    });
} else {
    //サポートしている場合はdatetime-localに切り替える
    $('input.datetime').each(function() {
        var val = $(this).val();
        $(this).attr("type", "datetime-local");
        if (val) {
            //datetime-localのフォーマット yyyy-mm-ddThh:MM:ss に書き換え
            val = val.replace(" ", "T");
            val = val.replace(/\//g, "-");
            $(this).val(val);
        }
    });
}
```

## 注意点
- ライブラリの場合、`yyyy/mm/dd hh:MM:ss`、datetime-localの場合は`yyyy-MM-ddThh:MM:ss`のフォーマットでリクエストされるので、submit時またはサーバサイドで加工が必要です
UbuntuにDocker, Docker Compose, tmux, fishをインストールして最低限の環境を構築する

[170927-1528] 執筆

個人的な備忘録です。EvernoteやらSimplenoteやらBearやらメモが散逸してしまったので、今後ちょっとしたスニペットなどはこちらにまとめようと思います。
完全に自分向けの資料ですが、アドバイスなどありましたらぜひご指摘いただけると嬉しいです。

なお本記事は[Conoha](http://conoha.jp/)のUbuntuイメージで作成したマシンを想定してします。

# Ubuntuパッケージを最新に

```bash
apt-get -y upgrade && apt-get update
```

# Docker CEをインストール

参考 : https://docs.docker.com/engine/installation/linux/docker-ce/ubuntu/

CEはCommunity Editionの略、普通はこちらをインストールするかと思います。

まずは下準備。

```bash
apt-get install -y linux-image-extra-$(uname -r) linux-image-extra-virtual apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
```

なお上記の最終行にある`[arch=amd64]`はアーキテクチャによって内容を変える必要があるそうです。`dpkg --print-architecture`コマンドで確認できるっぽい。
参考 : http://d.hatena.ne.jp/rx7/20120105/p1

いよいよインストール。

```bash
apt-get update && apt-get install -y docker-ce
```

Dockerについては以上。`docker --version`で確認。

# Docker Composeをインストール

参考 : https://docs.docker.com/compose/install/

便利。Dockerはコマンドが長いので、単純にタイプミスを減らすのにも役立ちます。

```bash
curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
```

もちろん上記のバージョンは変わりますので、適宜 https://github.com/docker/compose/releases より最新のURLを確認しましょう。

Docker Composeについては以上。`docker-compose --version`で確認。

あと`docker-compose`と毎回タイプするのは面倒なので、`alias fig='docker-compose'`コマンドで短縮 (`fig`は`docker-compose`の旧名)。
参考 : https://qiita.com/aild_arch_bfmv/items/d47caf37b79e855af95f

# tmuxをインストール

便利。`tmux`と`tmux -a`さえ覚えておけばsshが切れてもセッションを再開できる。

なおきちんと最新版を入れるのであればソースをgitしてmakeする必要がある。
参考 : https://qiita.com/koara-local/items/7e8391b837fb6f834cb9

が、面倒なのでaptでインストールする。

```bash
apt-get install -y tmux
```

# fishをインストール

参考 : https://launchpad.net/~fish-shell/+archive/ubuntu/release-2

便利。何も設定しなくても最低限のコマンド補完と色付けを行ってくれる。

```bash
apt-add-repository ppa:fish-shell/release-2
apt-get update
apt-get install -y fish
```

fishをデフォルトのシェルに設定。

```bash
chsh -s /usr/bin/fish
```

なおfishのパスは`which fish`で確認。
`chsh: PAM: Authentication failure`とエラーが出る場合は以下のファイルの記述を一時的にコメントアウトする。

```:/etc/pam.d/chsh
# auth       required   pam_shells.so
```

またfishの設定ファイルはデフォルトで作成されないので以下のように作っておく。ここで`docker-compose`のエイリアスをfishにも設定。

```bash:~/.config/fish/config.fish
alias fig='docker-compose'
```

これでセッションを開き直して`Welcome to fish, the friendly interactive shell`が表示され、`fig --version`コマンドが通れば万事オーケー。
作業する際は`tmux`コマンドを打って、接続が切れた時は`tmux -a`で再開。

# 運用方法・参考資料

(自分向けの) 運用方法や各種コマンドのアンチョコなどは追い追い書き足します。
RailsでMySQLのクライアント-サーバー間の通信を圧縮する方法

Webサーバー(nginx)でgzip圧縮するのと同様にRailsでMySQLのクライアント-サーバー間の通信を圧縮する方法。

```
development:
  adapter: mysql2
  username: user
  database: database
  host: "localhost"
  pool: <%= ENV["DB_POOL"] || ENV["RAILS_MAX_THREADS"] || 5 %>
  flags:
    - COMPRESS
```

## 参考 
https://github.com/brianmario/mysql2#flags-option-parsing
ReadCube でDatabase Errorが起こったら

ReadCubeは御存知の通り、強力な論文管理アプリです。
https://www.readcube.com/home

私は論文管理については Mac で ReadCube のみを使って管理しています。

先日、アプリを起動しようとしたところ、Database error となり、見事にリストからすべての論文が消えてPDFが閲覧できない状態になってしまいました。Application を削除して Reinstall しても治らず、困っていましたが、ReadCube のサポートに解決法がありました。

http://support.readcube.com/knowledgebase/articles/408464-what-can-i-do-if-readcube-won-t-launch-update

私の場合はMac用のNorton Antivirus/ Firewall インストール後に使えない事態となり、関連を疑っていますが、この方法で治したあとは、ノートンは併存したままで問題なく使えました。

ここに同様に困っている方のために日本語で記しておきます。

1. フォルダへ移動（shift + Command + G） ~/Library/Preferences
2. com.readcube.desktop フォルダを開く
3. uninstall というスクリプトをクリックする
4. data フォルダを念のため他の場所に移す
5. 再起動する
6. ReadCube を再インストールする
7. （場合によっては、4. で移動したdata フォルダを元の場所に戻す）
High Serria にアップデートしたら，Vimが使えなくなったときの対処法．



とりあえずVim使ってみるかーとiTerm2を起動して，vimと入力するとvimが立ち上がりませんでした．
vimはbrew でインストールしてました．

とりあえずbrew を使ってupgradeしてみると，エラーでできません．

```
$ brew upgrade vim　
省略
	
if_python.c:67:10: fatal error: 'Python.h' file not found
#include <Python.h>
         ^~~~~~~~~~
1 error generated.

省略

```
Python関係の問題かと思って，調べたところ[スタックオーバーフローに似た問題](https://ja.stackoverflow.com/questions/23350/homebrew-%E3%81%A7-vim-%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84
)がありました．


私の場合，pyenvを利用して，pythonの開発環境を構築していたので

```
$ pyenv local system 
```
によりpythonの環境をlocalに戻して，upgradeすると

```
$  brew upgrade vim　
```
できました．

pyenv以外で環境を構築している方は，
それぞれの環境のコマンドでsystemのpythonに変更するupgradeができるようになると思います．

systemのpythonに戻したあとは，pythonのバージョンをもとに戻すことを忘れずに．
ec2(amazon linux)にphp7を導入（phpinfo()を表示するところまで）

前提
　・EC2のインスタンスを作成済み（yumのupdateも完了）
　・インスタンスのセキュリティーグループでsshとhttpを許可している
　・インスタンスにSSHに繋げる
　・nginxかapache導入済み（ここではnginx）
　　※ [nginx導入手順](https://qiita.com/TetsuTaka/items/48433145c7f0ffa9e337)
　・Macでターミナルを使用

手順
　1. php7.1をインストール
　2. phpinfo()を表示させる
　3. 番外

##1. php7.1をインストール

php7.1をインストール（下記php71以外は必要なものを選んでインストールしてください）

```
sudo yum install php71 php71-devel php71-fpm php71-mysqlnd php71-mbstring php71-pdo php71-xml php71-zip　php71-pear
```
　バージョンの確認　

```
php -v
```
##2. phpinfo()を表示させる
###　DocumentRootの編集
```
sudo vi /etc/nginx/nginx.conf
```

　※40行目付近にある「server」の中を下記の様に編集
`修正前：root         /usr/share/nginx/html;`
`修正後：root         /var/www/html;`

　※40行目付近にある「server」の中に下記を追記

```
location ~ \.php$ {
    root           html;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
    include        fastcgi_params;
}
```
###　phpinfo()を表示するためのファイルを設置
```
sudo vi /var/www/html/phpinfo.php
```
　ファイル(phpinfo.php)の中身

```
<?php
    echo phpinfo();
?>
```

###　nginxの再起動とphp-fpmの起動
```
sudo service nginx restart
sudo service php-fpm start
```

###　ブラウザから確認
「http\://IPアドレス/phpinfo.php」でブラウザから接続

##3. 番外
###php-fpmを自動起動する様に設定

```
sudo chkconfig php-fpm on
```
###php.iniの基本的な設定をここで設定しておく
　自分はそんなに詳しくないのでとりあえず下記参考URL通り設定
　参考：http://affiwork.net/php-settings/
　※参考URLで使用しているのはApacheなのでrestartはnginx
　　ファイルはコピーを取っておいて下記コマンドで確認すると安心♪
　`diff /etc/php.ini /etc/php.ini_def`

　全部済んだらnginxとphp-fpmを再起動して確認する！

```
sudo service nginx restart
sudo service php-fpm restart
```

　ブラウザから確認して反映されていればOK!!!
　「http\://IPアドレス/phpinfo.php」でブラウザから接続
AndroidStudioのJREが変更できない

AndroidStudioのJREの更新に手間取ってしまったのでメモ
AndroidStudioのJDKは1.8なのになぜかJREが1.6しかなかった調べてみても特に詳しく書いてあるものがあまりなく（当たり前すぎて書く必要すらなかっただけかも）苦戦した。

環境
macOS Sierra 10.12.6
AndroidStudio 2.1.2

結果を先に言ってしまうと古いバージョンのSDKが悪さしていた。

詳しいことはこちらで↓
**WindowsでJDK 7とJDK 8を切り替える際の注意点**
http://daregada.blogspot.jp/2015/03/windowsjdk-7jdk-8.html
(Windowsについての記事だけどこれ読んだおかげで解決できた)

どうやら最新のJDKをAndroidStudioのJDK locationに入れても古いJDKを消さないとJREは変更されないらしい

JDKを消す方法はMacのFinderから
　/Library/Java/JavaVirtualMachines
までアクセスし、ファイル内にある今まで使っていたJDKのバージョンを消すだけ

そのあとAndroidStudioを再起動してみるとJREが1.8になってたのを確認できた。

Qiitaに投稿するのが初めてなので読みにくかったらすみません
MySQL(Mariadb)のデータ領域を引っ越しする、最小変更箇所

MySQLでのデフォルトデータ領域は
[/var/lib/mysql]
です。

私的にはデータは別にしたいので、新たにマウントした[/data/mysql]みたいなところで運用したいところです。

で、
いろいろ調べたんですが調べると多種多様いろいろでしたので、
sockファイルの場所はそのままデフォルトでよければ、
dataディレクトリを変更すればよいようです。

##変更箇所

[/etc/my.cnf]
 
```ini:my.cnf
[mysqld]
datadir=/data/mysql
```

これだけでOK
これが、[/home][/root][/run/user]配下だったらsystemdの設定ファイルも変更です。
「# Prevent accessing /home, /root and /run/user」ってコメントがmariadb.serviceのファイル内にあります。
vi /usr/lib/systemd/system/mariadb.service

```ini:mariadb.service
#ProtectHome=true
ProtectHome=false 
```



あとは、dbのデータを移動です。
mariadbを停止します。

/var/lib/mysql
この中のファイルをすべて
/data/mysqlへ移動させます。
/data/mysqlのオーナーを/var/lib/mysqlのオーナーに合わせてください。
【IBM Cloud k8s検証メモ】二つ以上の永続ストレージを識別してマウント


Bluemix-k8s のドキュメントでは、PersistentVolume と PersistentVolumeClaim の対応づけは、Capacityを同じとしか記述されておらず(2017/9/25現在)、それでは、20Giのパフォーマンス・ストレージが２つ存在すると、対応づけは運任せになってしまう。　例えば、こんな感じです。 mysql-claim1 と mysql-pv1 を対応付けたいのですが、mysql-claim1 と mysql-pv2 がボンドされてしまいました。

~~~
$ kubectl get pvc
NAME           STATUS    VOLUME      CAPACITY   ACCESSMODES   AGE
mysql-claim1   Bound     mysql-pv2   20Gi       RWX           16s
mysql-claim2   Bound     mysql-pv1   20Gi       RWX           5s
~~~

これでは使えないので、確実に目的のPersistentVolume と Claimを意図した様に確実に結びつける方法についてのメモです。


# 対策 selector 利用

次の例の様に、永続ボリュームの設定で、 metadata の下に、labels: を追加して、name: pv1 を設定します。

~~~file:s01_PersistentVol.yml
apiVersion: v1
kind: PersistentVolume
metadata:
 name: mysql-pv1
 labels:
  name: pv1
spec:
 capacity:
   storage: "20Gi"
 accessModes:
   - ReadWriteMany
 nfs:
   server: "fsf-dal1001c-fz.adn.networklayer.com"
   path: "/IBM02SV289550_2/data01"
~~~



そして、spec: 下に selector: を追加して、matchLabels: に name: pv1 を設定します。 これで、labelが一致したものが対応する様になります。

~~~file:s03_PersistentVolClaim.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
 name: mysql-claim1
 annotations:
   volume.beta.kubernetes.io/storage-class: ""
spec:
 accessModes:
   - ReadWriteMany
 resources:
   requests:
     storage: "20Gi"
 selector:
    matchLabels:
      name: pv1
~~~


これで、以下の例の様に、思い通りに、結びつけられる様になります。

~~~
$ kubectl apply -f s01_PersistentVol.yml
persistentvolume "mysql-pv1" created
$ kubectl apply -f s02_PersistentVol.yml
persistentvolume "mysql-pv2" created
$ kubectl apply -f s03_PersistentVolClaim.yml
persistentvolumeclaim "mysql-claim1" created
$ kubectl get pv
NAME        CAPACITY   ACCESSMODES   RECLAIMPOLICY   STATUS      CLAIM                  REASON    AGE
mysql-pv1   20Gi       RWX           Retain          Bound       default/mysql-claim1             20s
mysql-pv2   20Gi       RWX           Retain          Available                                    13s
$ kubectl get pvc
NAME           STATUS    VOLUME      CAPACITY   ACCESSMODES   AGE
mysql-claim1   Bound     mysql-pv1   20Gi       RWX           10s
~~~


意図した対応づけになりました。

~~~
$ kubectl get pvc
NAME           STATUS    VOLUME      CAPACITY   ACCESSMODES   AGE
mysql-claim1   Bound     mysql-pv1   20Gi       RWX           1m
mysql-claim2   Bound     mysql-pv2   20Gi       RWX           16s
~~~


簡単ですが、以上です。

# 参考資料
(1) https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistent-volumes
(2) https://kubernetes.io/docs/concepts/storage/persistent-volumes/#persistentvolumeclaims
ng-ifとng-showの違い

コードを書いているときに，ng-ifとng-show違いを知らなくて詰まってしまったので，違いを調べて，実験してみました．

■違い
ng-ifは，ng-ifに割り当てられている変数が，falseになるとDOMから削除される．
ng-showは，DOMから削除されない．

■結果
ng-ifがfalseのときに，<div>の中に書かれている文字列（"aaaaa"）を取得してみる． → 取得できない．
ng-showがfalseのときに，<div>の中に書かれている文字列（"bbbbb"）を取得してみる． → "bbbbb"が取得できる．


```html:test.html
<div ng-click="waa(miseru)">ここを押すとけしたりだしたりするよ</div>
<div ng-click="check()">ここを押すと取得できるかわかるよ</div>
<div ng-show="miseru" id="a">aaaaa</div>
<div ng-if="miseru" id="b">bbbbb</div>
```


```js:test.js
    $scope.miseru = true;

    $scope.waa = function (miseru) {
      console.log("aaa");
      if (miseru) {
        $scope.miseru = false;
      } else {
        $scope.miseru = true;
      }
    }

    $scope.check = function () {
      console.log("ng-show:" + $('#a').text());
      console.log("ng-if" + $('#b').text());
    }
```
React Nativeで扱うサイズの単位について

## はじめに
React NativeではComponentのサイズを指定する際に以下のように単位無しで指定します。

```js
{
	width: 100,
	height: 100,
}
```

基本的に、Androidは"dp(dip)", iOSは"ポイント"をサイズの単位としますが、React Nativeで指定した値がどう扱われるのかを調べてみました。

## React Nativeのドキュメントを見てみる
公式のドキュメントには以下のように書かれています。

>All dimensions in React Native are unitless, and represent density-independent pixels.

(引用元: https://facebook.github.io/react-native/docs/height-and-width.html)

```density-independent pixels```とあるので、単なるピクセル数ではなくデバイス密度非依存ピクセルであることがわかります。
よしなにdp、ポイントに置き換えられそうな気もしますが、一応実際に動作させて確認してみます。

## Android端末で見てみる
幅360dpのAndroid端末にJavaScript上で一辺"72"の正方形を並べたのがこちらです。
72 * 5 = 360で、幅360dpの端末にぴったりに収まってるのがわかります。

React Nativeで指定した値はそのままdpに置き換えられるようです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/64046/3fddedb9-2760-c277-b7dd-202a75eb8835.png" width=30%/>

## iOS端末で見てみる
つづけて、iOS端末です。

こちらは、幅375ポイントの端末にJavaScript上で一辺"75"の矩形を並べています。
75 * 5 = 375で、幅375ポイントの端末にぴったり収まっています。

iOSはポイントに置き換えられるようです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/64046/53e07525-6b7b-f5bc-0ec7-583478283799.png" width=30%/>

## 余談 : フォントサイズ
Textのフォントサイズはデフォルトではシステムの設定によって拡縮するようになっています。
(Androidでいうsp)
固定したい場合は、```allowFontScaling```プロパティを```false```にしておきましょう。


## おわりに
React Nativeで指定するサイズは、Androidの"dp"、iOSの"ポイント"にそれぞれ置き換えられることを確認できました。
LiveShell Proでちゃんと設定してるのに「認証が必要です」と表示されるときはユーザ名・パスワードじゃなくてストリーム名が間違っている可能性を疑うべき

![liveshellpro-error.jpg](https://qiita-image-store.s3.amazonaws.com/0/34041/c7dd44d5-b778-b14b-e6e3-37d31ab11da8.jpeg)

# あいもかわらずタイトルだけで言い切っちゃう

そういう芸風だからね。しょうがないね。

# タイトルを読んでいない人向け

- LiveShell Proで「その他の配信サービス（サーバアドレス入力）」を選択して、RTMP認証を利用する場合、当然ながら認証用のユーザ名・パスワードの入力を求められるんだけど、写真のようなエラーが出て、にっちもさっちもいかなくなった。
- 直前にファームウェアのバージョンアップ、複数端末で設定画面開いてた、無線のドングルと有線LAN両方刺してた等、いろいろ気になるところがあったので、いっこいっこ潰してたけど解消せず。
- 設置場所であるサーバールームが寒くて、このままだとしぬ。
- ストリーム名の入力エリアに違和感が。(人間しにかけると注意力が増す)
- 「foobar」のはずが「 foobar」になってた。
- 無事接続。

# Cerevoの人がここ見てたら直してほしい(サポートに連絡するほどのことでもないので)

- エラーメッセージ見直してほしい。
- 英字の入力欄はmonospaceにしてほしい。
ec2(amazon linux)にnginxを導入（デフォルトページの表示まで）

Amazon Linux 2の方はこちらを参考にした方が良いです。
[Amazon Linux 2にExtrasレポジトリからNginxをインストールする](https://dev.classmethod.jp/cloud/aws/install-nginx-on-amazon-linux2-from-extras-repository/)

前提
　・EC2のインスタンスを作成済み
　・インスタンスのセキュリティーグループでsshとhttpを許可している
　・インスタンスにSSHに繋げる
　・作成したばっかりのインスタンスを想定
　・Macでターミナルを使用

手順
　1.インスタンスにsshで入る
　2.yumのupdate
　3.nginxのインストール
　4.nginxのデフォルトページを表示

##1. インスタンスにsshで入る

```
ssh -i 鍵のPATH ec2-user@IPアドレス
```

##2. yumのupdate

```
sudo yum update
```

##3. nginxのインストール
　[最新版の確認](https://nginx.org/en/download.html)(Stable versionが安定板)
　nginxインストール

```
sudo yum install nginx
```

　バージョンの確認

```
nginx -v
```

##4. nginxのデフォルトページを表示
　nginxを起動

```
sudo service nginx start
```
　「http\://IPアドレス」でブラウザから接続
　デフォルトページが表示されるはず♪

　めんどいので自動起動する様に設定

```
　sudo chkconfig nginx on
```

以上っす！
【Windows】ReactNativeの開発のためAndroidシミュレータを立ち上げたい

# ただそれだけだったのですがハマりました・・・

何をするにも情報がなくて
（というよりも、色んな情報があり過ぎて。）
毎回毎回時間を食います。

古かったり、ちょっとだけ違ったり、OSがMacだったり・・・

ということで、
自分の備忘録と同じ悩みを持つ方のために
”Windows” で ”ReactNative” ”Expo” で開発していて（要はCRNA（create-react-native-app））
Androidシミュレータを立ち上げたい方に
ピンポイントの手順を残しておきます！

---

# そもそも

Expo clientでずっと開発をしていて全然それでよかったのですが
App Storeでアップデートが走ってから謎のエラーが発生し
何もできなくなったことが発端でした。

iOS11.0も関連していそうですが、そこはまだよく分かっていません。
とにかくExpo clientは使えなくなり、全く開発できなくなってしまったため
急遽シミュレータが必要になりました。
（こういうこともあるんですね。
改めてスマホアプリ開発の恐怖を感じました。）

・シミュレータではできるという人
・シミュレータでもできないという人
色んな情報がありましたが、
人によって違うならやってみるしかない。
ということになった感じです。

色々調べた情報はまた別で記事を書くことにします。

---

# 正直かなり遠回りしました・・・

調べていると色々出て来るので、その全てに翻弄されましたが、
結果的に必要なのは、[Genymotion](https://www.genymotion.com/)と[Expo XDE](https://expo.io/tools)だけでした！

Android Stdioはなくて大丈夫。
VirtualBoxもなくて大丈夫。
（厳密に言うとVirtualBoxはGenymotionで一緒に取れます。）

この辺で色々遠回りをしましたが
結果これだけやればOKです！

---

# まずは

[Genymotion](https://www.genymotion.com/)ですね。
これは詳細な手順を書いてくださっている方がいるので
[こちら](https://nelog.jp/genymotion-install)を参考にしてください。

VirtialBoxを一緒にインストールできるのですが
これだと起動できず苦労しました・・・

結局はGenymotionがインストールしてくれたあとに
自分でサイトから最新版のインストールが必要でした。。

が、これは今だけで大丈夫な時もあるかと思います。
ダメだった方は[こちら](https://www.virtualbox.org/)をインストールすればOKです！

---

# 次は

[Expo XDE](https://expo.io/tools)です。
これは単純にインストールしたら[このページ](https://docs.expo.io/versions/v18.0.0/guides/genymotion.html#genymotion)にあるStep1～2をやれば良いだけです。

Step1はoption1でやってください。
Windowsの場合のパスは
`C:\Program Files\Genymobile\Genymotion\tools` です。
（もちろん、インストールをひたすらNextで進めた場合です。
インストール先を変えた方はその下のtoolsです。）

---

# これでOK・・・なのですが

実はこの後もハマりました。

Expo XDEから`Open on Android`してもエラーになってしまったりして
色々時間がかかったんですけど、
結論から言うと「全て起動しておけばOK」ということです。

VirtialBox・Genymotion・Android deviceの3つを起動している状態で押せばOKでした。

Android deviceはGenymotionからあげます。
僕の場合は`Google Nexus5 6.0.0`でやりましたが
たぶんもっと新しいものでも大丈夫だと思います。
（あがらない機種があるという情報がたくさんあったので
ちょっとビビッてセーフティそうなものにしてしまった感じです。）

---

# 以上

まとめると
・[Genymotion](https://www.genymotion.com/)と[Expo XDE](https://expo.io/tools)インストール。
　　→VirtialBoxがあがらなければ[こちら](https://www.virtualbox.org/)から最新版をインストール。
・[Expo XDE](https://expo.io/tools)をインストール。
・[この手順](https://docs.expo.io/versions/v18.0.0/guides/genymotion.html#genymotion)でパス設定。
・全部立ち上げている状態で`Open on Android`
でOKです！

何か分かりにくいところやできないところがあれば
気軽にご連絡ください＾＾
macOS High Sierraでeclipseのメニューが無効化される

# 問題解決しています
(2017/10/12 追記)
4.7.1aが[リリース](https://www.eclipse.org/downloads/eclipse-packages/)されました。
4.7.1から「Check for Updates」で4.7.1aに更新後、ecilpse.iniの英語起動オプション(-Duser.country, -Duser.language)を削除し、-cleanオプションで起動したところ、メニューが無効化される不具合の解消を確認しました。

# 現象
macOS High Sierraにアップグレードすると、eclipse 4.6 (neon)/4.7 (oxygen)でメニューが無効化される現象が起きます。
表示はされるのですが、グレーアウトしていて実行することができません。キーボードショートカットやアイコンは有効なので、そちらで操作することは可能です。

(2017/10/02 追記)
4.8のIntegration Buildではこの現象は起きないようです。（自身では未検証）

# 回避策
[Bug 520176 - [10.13] Menu Bar Disabled From Use Completely](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520176)によれば英語モードで起動することで、この現象を回避できるようです。

## コマンドラインで起動
コマンドラインオプションを使用して起動するには、ターミナルで以下のコマンドを実行します。

```Bash:terminal
/Applications/Eclipse.app/Contents/MacOS/eclipse -nl en
```

## eclipse.iniに設定
コマンドラインで起動するのが面倒な場合は、eclipse.iniに以下の設定を追加します。

```Ini:/Applications/Eclipse.app/Contents/Eclipse/eclipse.ini
-Duser.country=US
-Duser.language=en
```

追加した後は、-cleanオプションを付けてeclipseを起動し、設定を反映します。

```Bash:terminal
/Applications/Eclipse.app/Contents/MacOS/eclipse -clean
```

## Eclipseを更新する
(2017/10/04 追記)
この問題が修正された4.7.1aが10月11日に[リリース](https://bugs.eclipse.org/bugs/show_bug.cgi?id=520176#c119)されるようです。
Ruby でメソッドを入れ替える

メソッドを入れ替える `swap_memthods` を作りました

```rb:kiminonaha.rb
module Kernel
  def swap_methods(a, b)
    alias_method :__temp__, a
    alias_method a, b
    alias_method b, :__temp__
    remove_method :__temp__
  end
end

class Kiminonaha
  def taki
    puts "もしかして俺たち..."
  end

  def mitsuha
    puts "もしかして私たち..."
  end

  def say
    taki
    mitsuha
    puts "「「入れ替わってる～！？！？！？」」"
  end
end

Kiminonaha.new.say
```

普通に実行

```
もしかして俺たち...
もしかして私たち...
「「入れ替わってる～！？！？！？」」
```

`swap_methods` を追加して実行

```diff
    def say
      taki
      mitsuha
      puts "「「入れ替わってる～！？！？！？」」"
    end

+   swap_methods :taki, :mitsuha
  end
```

```
もしかして私たち...
もしかして俺たち...
「「入れ替わってる～！？！？！？」」
```

「入れ替わってる〜 :fearful: 」


使い所は無いです。
類似画像検索システムを例に機械学習をツールとして利用する / 2017年9月27日

#はじめに
2017年9月26日19:30~22:00にサポーターズにて行われた「ツールとしての機械学習：類似画像検索システムを例に機械学習をツールとして利用する方法を学ぶ」の勉強会メモになります。

ニューラルネットワークを使った機械学習の研究がめまぐるしい勢いで進展する中、システムへ組み込む事例が増えてきました。本勉強会は主に、ウェブアプリケーションにどのようにして組み込むかをテーマに、ざっくりとした概要やツールについて簡単にお話されていました。

本勉強会の感想ですが、機械学習フレームワークはWebフレームワークなど違って、ある程度裏側で動いている仕組みを理解しないとツールとして使うことが難しいなと思いました。また、機械学習を学習する上で前提となるのは、理系大学教養課程における初等解析学・線形代数学の知識群になるので、Pythonと併せて少しずつ学習していこうと思っています。

講師紹介：山際康貴 (@tamanobi)　ピクシブ株式会社 エンジニア
寄稿：雑誌: WEB+DB PRESS Vol.95


#illustration2vec

![Illustration2Vec.png](https://qiita-image-store.s3.amazonaws.com/0/200922/6a4cc324-2efb-bcbb-f33f-b88c5ac9fbd4.png)

https://arxiv.org/abs/1603.08511
画像のベクトル化技術で学習済みモデルが配布されている
Ex） 二郎系ラーメンを取るとどの店舗かわかるというようなイメージ

*機械学習を試すのにもってこい
以前は1pxごとに解析して画像を判断していたが、現在は膨大なデータ群から画像とタグを収集してベクトル化することで画像認識を行なっている。

Googleは類似画像検索に関して、テキストデータも併せて精度をあげている。

#一般物体認識とは
写真が与えられたときに、これが何でどれくらいの大きさなのか認識する
https://www.slideshare.net/MPRG_Chubu_University/01-objectrecognition

#YOLO(You Only Look Once)とは
畳み込みニューラルネットワーク(CNN:Convolutional Neural Network)を用いた物体検出アルゴリズムで、現時点ではv1とv2が存在します。学習済みモデルが配布、気軽に試せてイラストにも応用可能。
https://www.slideshare.net/DeepLearningJP2016/dl-reading-paper20170804pdf

<img width="774" alt="スクリーンショット 2017-09-27 14.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/200922/024d9563-e454-45ed-bf48-3b58354b8b85.png">





#機械学習トピックニュース紹介
[10億枚の画像の分類がパソコン1台で可能に）](http://it.impressbm.co.jp/articles/-/14981)
[機械学習による料理/非料理判別](http://techlife.cookpad.com/entry/2017/09/14/161756)
[Alternative illustration2vec（高次元タグ予測器）](http://catindog.hatenablog.com/entry/2017/03/11/232838)

#質疑応答
メモが間に合っていないものもあります...

学習済みかどうかはどう判断するのか？
→チューニング前提で提供されている為、ある程度うまくいっているモデルを指している。

量子化するときに次元数の指定はあるのか？
→ディープラーニングのどの層から取り出す部分によってきまる。

ここでいうレコメンドはどういうものなのか？
→協調フィルタリング。集合知に基づくレコメンドであり、自分と似ている人がブックマークしているものはこの人も好きだろうというもの。

機械学習のキャッチアップはどのように行なっているか
→主に情報に強い人が発信しているツイッターやQiita、はてブ
macのSourcetreeでSVN

```
この記事ではmacOS Sierra　バージョン10.12.6を使っています。
Sourcetreeのバージョンは2.6.3です。
```

SVNでバージョン管理しているプロジェクトに参加することになりましたが、自分のマシンはMacなので、Soucetreeとgit-svnを使うことにしました。（無料で使えるツールで良さそうなものがみつからなかった）
主に以下のことについて説明します。
（１）クローンの方法
（２）運用の手順

**状況**
・SVNリポジトリが膨大なコミットを含む（ただ過去のリビジョンは自分の作業には不要）
・リポジトリの構成はスタンダードなtrunk/branches/tagsというもの
・SVNリポジトリに自分のブランチを用意済み
・基本的に自分のローカルブランチでの作業をSVNの自分のブランチにコミットさえできれば、trunkへコミットできなくても良いが、trunkの新しい更新は自分のローカルブランチに随時反映したい。

##準備
クローンの前に準備したことは以下です。
- Sourcetree のインストール
 　- ATLASSIANアカウントを作成
 　- BitBucket アカウントを作成
- Sourcetreeで使うgitをシステムのGitへ変更
 　- Sourcetreeの環境設定>GitでシステムのGitを使用するに変更

##クローン
ここからが本題です。
SVNサーバからソースをgit svn cloneするタイミングで直面した課題が大きく分けて二つありました。それに対する自分の理解を記載します。。

**課題１　自分のブランチだけをクローンすることができるのか？**
できます。trunkだけ（//svn.hoge.net/repo/trunk）、特定のブランチだけ(//svn.hoge.net/repo/branches/your-branch)をクローンすることも可能です。ただ、今回は自分のブランチで作業しながらtrunkへのコミットを随時マージしたかったのでその場合にはリポジトリ全体(//svn.hoge.net/repo)をクローンする必要がある。

**課題２　クローンする途中で失敗して、プロセスが止まる。**
リビジョンの数が膨大だと、クローンに何時間もかかるようです。途中で何かしらのエラーが起きたりもする。クローンをSourcetreeから行わず、ターミナルでオプションを用いてクローンする必要があるという結論に至りました。

以下のコマンドを用いてクローンに成功しました。オプションの詳細は以下

```
$ git svn clone -r 22500:HEAD <URL> --prefix svn/ -s
```

**-r 22500:HEAD**
リポジトリが巨大すぎてクローンに失敗したり、容量圧迫になるのを避けるために、クローンの対象を直近100リビジョンくらいに限定。22500（設定時の最新のリビジョンを確認して逆算してたもの）からHEADまでに限定したリビジョンをクローン。(Gitのように”HEAD~100:HEAD”という記述で直近100リビジョンを指定することはできないようです)
**--prefix svn/**
リモートブランチ（SVN）にsvn/という接頭辞をつける
**-s(--stdlayout)**
クローンしてくるsvnリポジトリがスタンダードな構成である場合にこれをつけると、ブランチやタグの情報も含んだローカルリポジトリを作成できる。ただし、-sオプションを利用する場合、Subversionリポジトリ内でブランチが「branches/」以下、タグが「tags/」以下、trunkが「trunk/」以下に作成されている必要がある。

ターミナルでの処理が終わったら、Sourcetreeへ移動して、
メニューバーのウィンドウメニューから、リポジトリブラウザを表示
ローカルとリモートの切り替えタブの右にある"新規"から既存のローカルリポジトリを追加を選びクローンしたリポジトリを指定するとSourcetreeで変更履歴が見られるようになります。

プロセスの途中でエラーが出て止まってしまった場合、Cloneではなくinit+fetchを使うこともできる。このやり方だとエラーが出た時に途中からやり直せるというメリットがあります。
リビジョンの範囲の指定はfetchコマンドで行います。

```
$ git svn init -s --prefix svn/ <URL>
```

```
$ git svn fetch -r 22682:HEAD
```
ローカルブランチの作成
ローカルでの作業用に、リモートの自分のブランチを元に自分のローカルブランチを作る必要があります。この作業もターミナルから行います。
例えばリモートのyour-nameブランチをlocal-your-nameという名前でローカルに作成する場合

```
$ git branch local-your-name your-name
```
##運用
ローカルブランチに最新の更新を反映するタイミングで手作業によるパッチの作成・適用があるので少し不安ですが、この内容でなんとか始められそうという流れが以下です。

- masterにチェックインtrunkの更新をプル
- 前回の同期以降のリビジョンを確認してパッチを作成
- ローカルブランチにチェックインしてパッチを適用
- 作業を行なってコミット（どこからどこまでのリビジョンを含むかを書く）
- リモートブランチへプッシュ

##まとめ
SourcetreeでSVNを扱うことは可能ですが、ターミナルからの操作もできないと不便が多いかもしれません。とはいえMac用SVNクライアントは無料では使いやすそうなものは見つけられなかったので、Macでsvnを扱わないといけないけれど、全てをターミナルから行うのはちょっと、という方にはおすすめできます。

##参考にさせていただいたサイト
http://sinsoku.hatenablog.com/entry/2014/02/26/231918
https://mag.osdn.jp/09/03/26/0834222
http://blog.endpoint.com/2010/05/continuing-interrupted-git-svn-clone.html
homebrewでgitをアップデートした際のSourcetreeでのエラーについて

SouceTreeの設定をデフォルト設定である「内臓のgit」を使用する設定ではなく
homebrewでインストールしていたgitを使用するように設定を変更していた場合
homebrewでgitのバージョンアップをすると次の図のようなエラー

> 「git status failed with code -1: launch path not accesible」

が発生することがあります。

![スクリーンショット 2017-09-27 15.07.28.png](https://qiita-image-store.s3.amazonaws.com/0/55166/4e067357-c159-f9c2-ba5c-7e0d77babd68.png)

SouceTreeの環境設定を開き、次の図のようになっていた場合、gitバイナリが見つからなくなっている状態になっているので、エラーメッセージのすぐ下の「内蔵のgitに戻す」を押すか、「システムのgitを使用する」を押して、正しいgitバイナリの位置を再設定することにより復帰できます。

![スクリーンショット 2017-09-27 15.10.08.png](https://qiita-image-store.s3.amazonaws.com/0/55166/708027ae-cd80-5a93-e36e-038ca5823c0d.png)

よく忘れてしまうのでメモのため記述しました。
mySQL workbenchのエクスポート/インポート

mySQL workbenchで，DBをエクスポート/インポートやり方をいつも忘れてしまうので，メモ．

・エクスポート
![export1.png](https://qiita-image-store.s3.amazonaws.com/0/140965/55c42797-de72-8cd0-c8c4-64688dc04ee3.png)

![export2.png](https://qiita-image-store.s3.amazonaws.com/0/140965/20904591-07cf-9281-f591-6f040ccfce8d.png)

・インポート
![import1.png](https://qiita-image-store.s3.amazonaws.com/0/140965/09f2fa79-7cc4-5e3e-079d-6095d68e8f60.png)

![import2.png](https://qiita-image-store.s3.amazonaws.com/0/140965/982bd481-a413-8e1a-d5e4-e223f1c37227.png)
Visual Studio 拡張機能を新規作成後、System.OutOfMemoryException が発生し、ビルドエラーが出るときの対処法

#### はじめに
Visual Studio の拡張機能を新規作成し、ビルドを行うと、System.OutOfMemoryException というエラーメッセージが表示され、ビルドが失敗する場合があります。
例えば、以下の手順のように何もコードを記述していない状態でも、このエラーは発生することがあります。

1. Visual Studio で VSIX プロジェクトを新規作成
1. プロジェクトに 「Tool Window」を新規追加
1. プロジェクトをビルドする
1. ビルドエラー発生

![Build Error](https://gist.githubusercontent.com/tafuji/061fbfd136b266f674952dfe586dc278/raw/27e662eaedf18477471a2b2340379285a3b23e64/01-builderror.png)

#### 原因
テンプレートから作成されたイメージファイルが壊れていることが原因と思われます。

![SolutionExplorer](https://gist.githubusercontent.com/tafuji/061fbfd136b266f674952dfe586dc278/raw/27e662eaedf18477471a2b2340379285a3b23e64/02-ImageFile.png)

ファイルを開くと、「サポートされていない形式のようです」というエラーで開けない。

![BrokenFile](https://gist.githubusercontent.com/tafuji/061fbfd136b266f674952dfe586dc278/raw/27e662eaedf18477471a2b2340379285a3b23e64/03-BrokenFile.png)

#### 対処方法
壊れているイメージファイルを正常なイメージファイルに置き換えると、このエラーは解消されます。正常なイメージファイルであれば、どんなファイルでもよいのですが、ここでは、インストールされたテンプレートのファイルを利用する方法を記載します。

- Tool Window のテンプレートの場所を開く
    - 例の場合
        - C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\Extensions\q2vm3w32.pmy\ItemTemplates\CSharp\Extensibility\VSPackage\1033\CSharpCustomToolwindow
- Resources フォルダ直下にある png ファイルを、プロジェクトの png ファイルと差し替えてください

    ![Resources](https://gist.githubusercontent.com/tafuji/061fbfd136b266f674952dfe586dc278/raw/27e662eaedf18477471a2b2340379285a3b23e64/04-ResourceFile.png)

- プロジェクトをリビルドする

Visual Studio 2017 にインストールされたテンプレートの場所を調べる方法は、「参考」の参照先の記事に記載しています。（ログファイルを toolwindow で検索すると見つかります）

#### 参考
Visual Studio にインストールされたテンプレートの場所を調べる方法は、以下に手順を記載しています。
- [!Visual Studio 2017 のプロジェクト・項目テンプレートがインストールされている場所を調べる方法](https://qiita.com/tafuji/items/e0a6b9921247f54551c2)
nodejsでpngをsvgに変換する

png2svgというモジュールを使います．

npm install -g png2svg
でインストールできます．

$png2svg input.png output.svg 
で，同じ階層にあるpngファイルをsvgファイルに変換できます．

webからとってきたpngファイルをsvgに変換してみたのですが，
* 大きなファイルは変換できない
* 小さなファイルは変換できる．ただし，colorが全て#ffffffになる
ということが確認できました．

使い方を間違っているかもしれないので，もう少し調査してみます．．．
rubyで自然言語処理(natto)を使ってみた @cloud9


## 環境設定
nattoを使うためにはmecabをインストールしなければならない

```
$ sudo apt-get update
$ sudo apt-get install -y mecab mecab-ipadic-utf8 libc6-dev build-essential libmecab-dev libfreetype6-dev libxft-dev
```

mecabコマンドを使う

```
$ mecab 
こんにちは今日は晴れです！
こんにちは      感動詞,*,*,*,*,*,こんにちは,コンニチハ,コンニチワ
今日    名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
晴れ    名詞,一般,*,*,*,*,晴れ,ハレ,ハレ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
！      記号,一般,*,*,*,*,！,！,！
EOS
```

## rubyの準備
test.rbでnattoを使うサンプルプログラムを作成した。

```ruby:test.rb
require 'natto'

nm = Natto::MeCab.new

text = '太郎はこの本を二郎を見た女性に渡した。'
nm.parse(text) do |n|
  puts " >> #{n.surface} \t>> #{n.feature}"
end
```

環境構築を行い。実行する。

```
$ gem install bundler
$ bundle init 
$ echo "gem 'natto'" >> Gemfile
$ bundle
$ ruby test.rb
```

## 参照
[[Ruby]mecabを使ってみた（形態素解析）](https://qiita.com/hkengo/items/0c47675c86535bc85d1e)  
[Python MeCabをCloud9上で動かす|Review of My Life](http://review-of-my-life.blogspot.jp/2017/07/python-mecab-cloud9.html)
C++ Builder XE4, 10.2 Tokyo > TDateTime > yyyymmdd と hhnnss :StringからTDateTime型を取得する実装

```txt:動作環境
C++ Builder XE4
RAD Studio 10.2 Tokyo Update 2 (追記: 2018/01/05)
```

### code

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	String strdate = L"20170927";
	String strtime = L"123045";

	TDateTime dt = ToDateTime(strdate, strtime);

	String msg = dt.FormatString(L"yyyy/mm/dd hh:nn:ss");
	ShowMessage(msg);
}

TDateTime __fastcall TForm1::ToDateTime(String yyyymmdd, String hhnnss)
{
	String adate = yyyymmdd.SubString(0, 4) + L"/"
		+ yyyymmdd.SubString(5, 2) + L"/"
		+ yyyymmdd.SubString(7, MAXINT); // MAXINT: 最後まで

	String atime = hhnnss.SubString(0, 2) + L":"
		+ hhnnss.SubString(3, 2) + L":"
		+ hhnnss.SubString(5, MAXINT); // MAXINT: 最後まで

	try {
		return VarToDateTime(adate + L" " + atime);
	} catch (...) {
		return (TDateTime)0; // エラー値は要検討
	}
}
//---------------------------------------------------------------------------

```

### 結果

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/6490e671-65ef-a242-1ebb-967622de7634.png)

### 備考

[DateUtils](http://docwiki.embarcadero.com/Libraries/XE4/en/System.DateUtils)などに型(例: YYYYMMDDHHNNSS)を指定してTDateTime型に変換する関数はないのだろうか?

ざっと見たが分からなかった。

ToDateTime()という関数名は「動詞+」の命名規則とは異なる。

### 関連

Python実装を基に上記を実装した。
[Python / datetime > YYYYMMDD形式をYYYY/MM/DDに変換する実装](https://qiita.com/7of9/items/5f2a8727f43bdb80a88b)
【Django】JSONFieldを持つModelでJSONの中身によってフィルターをかけてデータを取得する


こういうモデルがあって

```python:models.py
class Test(models.Model):
	text = CharField(max_length=255 blank=True, null=True)
	fields = JSONField(blank=True, null=True)
```

JSONの中身はこのような場合の話

```
[
	{
		"name": "sample1",
		"value": "value1"
	},
	{
		"name": "sample2",
		"value": True
	},
	{
		"name": "sample3",
		"value": "value3",
		"url": "https://hogehoge.com"
]
```

例えば、fieldのJSONで"name": "sample2"で"value"がTrueのものをとりたいなー、という場合はこんな感じでフィルターかけたらうまくいった

```python
query = Test.Objects.filter(fields__contains=[{'name': 'sample2', 'value': True}])
```

<hr>

JSONが以下のようにネストしている場合

```
[
	{
		"name": "sample1",
		"value": {
			"foo1": "bar1",
			"foo2": "bar2",
		}
	},
	{
		"name": "sample2",
		"value": {
			"foo1": "bar1",
			"foo4": "bar4",
		}
	}
]
```

"name"が"sample2"で"value"の中の"foo4"が"bar4"のものだけを取りたいなー、というときは以下のようにフィルターかける

```python:
query = Test.Objects.filter(fields__contains=[{'name': 'sample2', 'value': {'foo4': 'bar4'}}]) 
```

"value"の中の"foo1"が"bar1"だけを取りたい場合は

```python:
query = Test.Objects.filter(fields__contains=[{'value': {'foo1': 'bar1'}}])
```

<hr>

割とそのまんまだな、と書いてて思った
Salesforceでデータローダ(不満と日付系項目の投入)

# データローダへの不満
早速ここから行きます。もちろん便利なツールではあると思います。一人のポンコツユーザーとしての意見です。

#### ロールバックできない
おかしいデータあったら直してからやり直したいです。エラー起きちゃったやつだけ入れ直す派の人もいるかと思いますが、私は全部やり直したい派です。要はロールバックするかどうか選べるようになってほしい。

#### 一度に一つのオブジェクトだけしか入れられない
ほぼ言いがかりですが、上と関連します。主従関係がある場合とか一度に親子で入れたいときがあります。主を入れて、Id取ってきて、Id埋めて、子を入れてってめんどくさいしミスが発生します。親レコード入れるときに20000レコード中179レコード失敗とかなったらやる気なくなります。

#### なんで最初のメニューまで戻るんだよ
お使いのかたはわかると思います。そこまで戻らなくていいだろ。


# データローダへの日付型の投入
日付型、日付/時間型を投入するときに形式不正でエラーになったのでまとめておきます。まず基本的なルールとして、

- 年は1700年〜3999年
- 年、月、日、時、分について先頭の0は無視される
- 時間は24時間表示
- 全角数字はダメ
- 年月日と時分の間は半角スペース(全角スペースはだめ)

のようです。合ってるかどうかはわかりません。この形式にマッチするものを探す正規表現を考えてみました。正規表現REにマッチしない正規表現として`^(?!.*(RE)).+$`を使えば、形式不正がチェックできると思います。すでにわかっている問題点は

- 2月29日が無条件で通ってしまう(うるう年が考慮できない)
- 9月31日とか31日がない月に31日を指定しても通ってしまう

です。2個目に関してはがんばってチェックすればできますが、そこまでやってられるかという感じでやっていません。投入前のチェックに使うくらいであれば十分かなと思っています。

#### 日付型が受け入れ可能な形式
`^0*(1[789]\d{2}|2\d{3}|3\d{3})-0*(\d|1[012])-0*(\d|[12]\d|3[01])$`
#### 日付/時間型が受け入れ可能な形式
`^0*(1[789]\d{2}|2\d{3}|3\d{3})-0*(\d|1[012])-0*(\d|[12]\d|3[01])[ ]0*(\d|1\d|2[0-3]):0*(\d|[1-5]\d)$`
ABC07CとD問題

問題はhttp://abc007.contest.atcoder.jp/
#C問題
##解答の方針
蟻本でみかけた幅優先探索
実装するだけだった

##コード
```py3:python:abc07c.py
INF = 10**9+7

R,C = map(int,input().split())
sy,sx = map(int,input().split())
gy,gx = map(int,input().split())
c = [list(input())for i in range(R)]
distance = [[INF for i in range(C)]for i in range(R)]
queue = [[sy-1,sx-1]]
distance[sy-1][sx-1] = 0

def bfs():
    global distance
    global queue

    while len(queue):
        y,x = queue.pop(0)
        for ny,nx in [[1,0],[0,1],[-1,0],[0,-1]]:
            dy = y + ny
            dx = x + nx
            
            if 0 <= dx <= C and 0<= dy <= R and c[dy][dx] == '.' and distance[y][x]+1 < distance[dy][dx]:
                queue.append([dy,dx])
                distance[dy][dx] = distance[y][x] + 1

bfs()
print(distance[gy-1][gx-1])
```

#D問題部分点
##解答の方針
0<A,B<10000程度ならすべて0~A,0~Bのすべての値に対して、
4か9が含まれるかをカウントしてもO(2*10^5)程度なので間に合う

##コード
```py3:abc07d.py
A,B = map(int,input().split())
res = 0
 
for i in range(B+1):
    if '4' in list(str(i))  or '9' in list(str(i)):
        res += 1
for i in range(A):
    if '4' in list(str(i))  or '9' in list(str(i)) :
        res -= 1
 
print(res)
```
#D問題満点解答
##解答の方針
0~9までの4,9が含まれる値は2つしかない。

また、100までの4，9が含まれる値は、
0~9,10~19,20~29,30~39,50~59,60~69,70~79,80~89　の8つの区間でそれぞれ2つずつ、
40~49,90~99の区間はすべてが対象なのでそれぞれ10つずつ
つまり、10*2 + 2*8である

1000までの場合も100を単位として考えると同じように計算できることから
10のn乗までの4,9が含まれる区間は漸化式として以下のように表せる。

```math
a_{0} = 2\\
a_{n} = 2\times10^{n-1}+ a_{i-1}\times8
```
このことから以下の手順を踏むことで、解が求められると考えた。

1 与えられた値に4もしくは9が含まれる場合(例:14931),端数を取り去る(14000)。
  取り去った分をresなどに足しておく

2 先ほどの漸化式の値を、配列として持って置き、各位ごとに、a[n]と掛け合わせ、順次resに加える。（例:14000の場合、1*a[4] + 4*a[3] + 0*a[2] + … + 0 *a[0])

3 入力A,Bごとに手順1,手順2を行い、resを返す。その後二つの値の差を出力する。



(補足）このように実装したが、微妙におかしなところが多く、いろいろな付け加えをしてしまい、とても見づらいコードになってしまった。いつか直したい

##コード
```py3:abc07d.py
A,B = map(int,input().split())

A = list(str(A))
B = list(str(B))
list_A = list(map(int,A))
list_B = list(map(int,B))
a = [0 for i in range(19)]
a[1] = 2

def dfs(i,n): #漸化式aを求める
    global a
    if i == n:
        return 
    a[i] = 2*(10**(i-1)) + a[i-1]*8
    return dfs(i+1,n)

def cal(list):#4,9の含まれる値の計算
    l = len(list)
    n = l-1
    res = 0
    for k in range(l):
        if list[k] == 4 or list[k] == 9:#端数を取り去る
            for j in range(k+1,l):
                res += list[j] * (10**(l-1-j))
                list[j] = 0
                if j == l-1:
                    res += 1
    for i in range(l):
        count = 0
        if i == l-1 and list[i] == 4:#1の位が4の時(端数処理を行わないので特殊なパターン）
            count = 1
        elif 4 < list[i]:
            count = 1
        res += (list[i]-count)*a[n]+(10**n)*count
        #print(res,a[n],list[i],count,(list[i]-count)*a[n]+(10**n)*count)
        n -= 1
    if list[-1] == 9:
        res += 1
    return res

dfs(2,19)
m = cal(list_A)
n = cal(list_B)

if '4' in A or '9' in A:
    m -= 1

print(n-m)
```
Gradleのtestタスクの進捗を出力する

# Gradleの`test`タスクの進捗を出力

`gradle test`を実行した際に、テストの実行結果をコンソールへ出力する。

```groovy
apply plugin: 'java'

test {
    testLogging {
        // テストの実行結果を出力
        events 'passed', 'failed', 'skipped'
        debug {
            // --debugでの実行時
            events 'started', 'passed', 'skipped', 'failed'
            exceptionFormat 'full'
        }
    }
}
```

## 参考

- [Gradle – Display test results in Console](https://www.mkyong.com/gradle/gradle-display-test-results-in-console/)
- [TestLoggingContainer](https://docs.gradle.org/current/dsl/org.gradle.api.tasks.testing.logging.TestLoggingContainer.html)
Qiitaの使い方に関して

# はじめに
Qiitaでナレッジを探していて 困った/よくわからない に遭遇したので、使い方を考えてみた。

# 注意
<font color="red">主観なので参考程度に見てください</font>

# 全体公開で記事を投稿する
ソフトウェアの導入、使い方についての技術情報は全体公開で記事にする。

+ ソフトウェア導入経験者から指摘やアドバイスを貰いたい。
+ 経験者、未経験者とそのソフトウェアについてコミュニケーションしたい。
+ 文書で説明出来ているか、第三者に指摘されたい

# 非公開で記事を投稿する
具体的なパラメータやアイディアが盛り込まれた技術情報は限定公開で記事にする。
<font color="red">※社外秘は載せない</font>

+ グループ/個別チャットで共同作業者や協力者から指摘を貰いたい。
+ 単に触ってみた記録を残しておきたい。


→ 何かのコードを残すことがなければevernoteとかでもいいのかなと思い始めてきました。


# モチベーションを保つ使い方
1. 面白そうな記事、気になる記事を見つけたら気軽に「いいね」する
2. Qiitaに書いたナレッジを再利用できるようになるべく分解する
3. (気持ちが疲れるので)大層なことは書かない
4. 画像を多用する(百聞は一見にしかず)
5. 図解を使う(Excel、Wordの図形でもいい。手書きでもいい)。
6. 加工に頑張らない(赤枠とか作らない)
7. なるべく長文を作らない。
8. 複数バージョンのあるソフトウェア・サービスについてはタグを盛る(例 C#でWindowsフォームアプリケーションにxxを実装した → C#,C#7,visualstudio,visualstudio2017,Windows,Windows10)[^1]
※タグでどんな記事を書いてきたかは分かるんだけど、個別の蓄積が量れない

9. 細かいことは気にしない。完成度も気にしない
10. 手順は省略しない
<font color="red">※そのまま見てできるものにしないと記録として意味がない</font>

11. 環境やバージョンは参考になりそうな情報は書き漏らさない
12. 更新を恐れない。気づいたら即更新
13. 気になった記事はとりあえず「ストック」する
14. ストックした記事からナレッジを起こしてみる(経験値を稼ごう)
15. 賛美コメントはうれしい。役に立ったら賛美しよう。

# やらないほうがいい

+ 叩かない
+ 口撃/クソリプはしない



# 注釈
[^1]: ソフトウエアやサービスによっては過去から利用可能なナレッジがあったりする。特定のバージョンでしか通用しないナレッジもあったりする。検索したときに判断できるような情報は多いほどwin-win。
calcを使う時に少しハマった件

CSSにおいて計算式を可能に、しかも単位が違ってもOKな便利なcalc()ファンクションを勉強がてら使ってみようと思い、書いたら少しはまった（というかどこにも書いてなかった）のでメモ

calc()についての詳細は以下とかググってみてください。
[CSSで計算式を可能にするcalc()ファンクション](https://w3g.jp/blog/css3_calc_function)

●誤

```
calc(1px+1px);
```

●正

```
calc(1px + 1px);
```

要は記号の前後にスペースが必要ってこと。

##追記
コメントにありますように、[本家の仕様](https://drafts.csswg.org/css-values-3/#calc-syntax)の方に以下の記述がありました。

>In addition, white space is required on both sides of the + and - operators. (The * and / operaters can be used without white space around them.)