OmniAICreator/Qiita-1.07M huggingface dataset:
Navigatorでネイティブ風なモーダルアニメーションが使いたい


`Navigator.SceneConfigs.FloatFromBottom` だと、元いたviewの縮小アニメーションがついてくる。
あくまでもiOSネイティブのようなモーダルアニメーションが使いたかったので、SceneConfigを作成してみた。

```js
const floatFromBottomLikeNative = {
  ...Navigator.SceneConfigs.FloatFromBottom,
  defaultTransitionVelocity: 8,
  animationInterpolators: {
    into: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      },
      transformTranslate: {
        from: { x: 0, y: Dimensions.get('window').height, z: 0 },
        to: { x: 0, y: 0, z: 0 },
        min: 0,
        max: 1,
        type: 'linear',
        extrapolate: true,
        round: PixelRatio.get()
      }
    }),
    out: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    })
  }
};
```

ついでにアニメーション無しのsceneConfigも欲しかったので作成してみた。

```js
const noAnimation = {
  ...Navigator.SceneConfigs.PushFromRight,
  defaultTransitionVelocity: 100,
  gestures: null,
  animationInterpolators: {
    into: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    }),
    out: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    })
  }
};
```

まとめると

```js:custom-scene-config.js
import { Navigator } from 'react-native';
import Dimensions from 'Dimensions';
import PixelRatio from 'PixelRatio';
import buildStyleInterpolator from 'buildStyleInterpolator';

const noAnimation = {
  ...Navigator.SceneConfigs.PushFromRight,
  defaultTransitionVelocity: 100,
  gestures: null,
  animationInterpolators: {
    into: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    }),
    out: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    })
  }
};

const floatFromBottomLikeNative = {
  ...Navigator.SceneConfigs.FloatFromBottom,
  defaultTransitionVelocity: 8,
  animationInterpolators: {
    into: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      },
      transformTranslate: {
        from: { x: 0, y: Dimensions.get('window').height, z: 0 },
        to: { x: 0, y: 0, z: 0 },
        min: 0,
        max: 1,
        type: 'linear',
        extrapolate: true,
        round: PixelRatio.get()
      },
    }),
    out: buildStyleInterpolator({
      opacity: {
        value: 1.0,
        type: 'constant'
      }
    })
  }
};

export const CustomSceneConfigs = {
  NoAnimation: noAnimation,
  FloatFromBottomLikeNative: floatFromBottomLikeNative
};
```

後は適当にimportして `Navigator.SceneConfigs.FloatFromBottom` 等を使っている箇所で `CustomSceneConfigs.FloatFromBottomLikeNative` を代わりに使えばok。
mustache.js cli で {{> head}} 形式のパーシャルテンプレート読み込みする方法

# mustache.js cli で {{> head}} 形式のパーシャルテンプレート読み込みする方法

npm install mustache などで mustache をいれて、

```html
<html>
 {{> header.html}}
<body>
 本文
 {{> footer.html}}
</body>
</html>
```

こういう html で、

```shell-session
#ls

template.mustache header.html footer.html
```

ファイルがこうあって、

```shell-session
# mustache var.json template.mustache
```

上記のように実行しても {{> header.html}} はまったく解決してくれない。

ソース見ると -p でファイル名をすべて指定する必要があり、かつ、{{> }} ではファイル名から mustache をのぞいた名前を期待してるようだったので

```html
<html>
 {{> header}}
<body>
 本文
 {{> footer}}
</body>
</html>
```

こういう html で、

```shell-session
#ls

template.mustache header.mustache footer.mustache
```

ファイル名の拡張子を mustache にして

```shell-session
# mustache var.json template.html -p header.mustache -p footer.mustache
```

のように渡せばうまくいきました。

また、サブディレクトリ配下においていも、basename を取られるので、 {{> partial/header}} とかは上手くいかない。
【クソ食らえ】CocoaPods プロジェクトで "〜 .h" file not found と戦う

※ 現在進行形のため、これがベストソリューションかどうかは、不明です。

CocoaPodsで入れたはずのライブラリが見つからない現象。
ググっても、ググっても、決定打になる解決策がなかなか見つからない……。

# で、結局何をしたら直るのか

あらかじめ断っておくと、**この方法ですべての人が解決するわけではないです**。
あしからず……。
**私の場合の決定打は、後半に記載。**

## 開発環境

* Xcode 8.1
* CocoaPods 0.39.0 → 1.1.1 （耐えかねてアップデート）

# 解決方法

結局のところ、以下の方法を試した所、うまくビルドできるようになりました。

## CocoaPods を 1.1.1 にアップデート

CocoaPodsは、それまで0.39.0を使用していたのですが、1.1.1にアップデートしました（いまさら？）。
アップデートした後は、Podsディレクトリを一旦、綺麗さっぱり削除して、`pod install`し直しました。

```bash:部署の先輩の端末では、これでうまくいったの。
cd ~/.cocoapods/repos/master
git checkout master

sudo gem install cocoapods
cd {プロジェクトのディレクトリ}
pod deintegrate {プロジェクトの}.xcodeproj
rm -fr Pods
pod install
```

でも、僕はうまくいかなかった。。。

## Pods ディレクトリを Git 管理下に入れる

それならばと、pod install済みのPodsディレクトリもGit管理することを試しました。
つまり、ビルドできる環境をまるごとPullしちゃえばいいってこと！いけそう!!

```
100MB近くなったブランチをpullする...
ビルドする...
"....... .h" file not found.
＼(^o^)／
```

うまくいかなかった!!!!
もちろん、一部では**PodsディレクトリもGit管理した方がいいよ〜**という開発チームもありますが、うちではうまくいかなかった！
（端末名や、プロジェクトのディレクトリがそれぞれ違うからなのかなぁ……）

## Build Location を Unique に変更　（← **決定打**）

（どういうわけか、）うまくいきました！！

### Unique に変更

まず、**Workspace Settings** から、**Build Location** を **Unique** に変更します。

<img width="526" alt="スクリーンショット 2016-11-25 16.12.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/1e450e54-25fd-8167-dbaf-60faedb82850.png">

<img width="602" alt="スクリーンショット 2016-11-25 16.12.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/63e632d8-040e-fd28-45b6-d0f8d0a8132e.png">

<img width="594" alt="スクリーンショット 2016-11-25 16.12.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/ff9631da-68df-334a-cdea-961a3f0ca0c0.png">

### めっちゃClean する

**Derived Dataも含めてClean**します!!
**`Cmd` + `Option` + `Shift` + `k`**です！

<img width="628" alt="scsho.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/0938f339-a885-aec5-b9f0-75e727331be5.png">

普通のCleanと、どう違うのかな？？

### pod installする

pod installします

### ビルドする

できました!!!

最終的には、コチラのStack Overflowを参考にしながら作業していました。
http://stackoverflow.com/questions/37377450/cocoapods-1-0-header-files-not-found

# で、結局、原因は何なのか……

わかりません。
でも、チームそれぞれのホームディレクトリの名前の違いや、プロジェクトファイルを置いているディレクトリの違いなどが影響しているのかなと予想しています。。。

CocoaPodsむずかしい……。
でも、アップデートできてよかったかも!!

---

それにしても、ほんっとCocoaPodsはくせ者で、定期的に苦しめられてきました。
[【クソ食らえ】CocoaPodsとApple Mach-O Linker Errorとlinker command failed with exit code 1でどハマり](http://qiita.com/sutchan/items/0a78042261ca3f0a7d91)

そして今回も……。

見つからない……。
![見つからない……。](https://qiita-image-store.s3.amazonaws.com/0/75329/4c316270-0db2-af34-4e6b-ecf992a42641.png)

見つからない……!!!
![見つからない……!!!](https://qiita-image-store.s3.amazonaws.com/0/75329/5e77ab44-8d26-dc7c-e69a-0af377a8342a.png)


うまくビルドできても、また pod install や ブランチ切り替えているうちに、できなくなっちゃってたんですよねー……。

ひとまず、ビルドできるようになってよかった。
めでたしめでたし！
webpack で moment.js の無駄なロケールファイルを除去する

moment.js を利用する際、

```js
const moment = require('moment');
```

と書いて webpack でビルドすると、**生成される bundle ファイルのサイズが非常に大きくなってしまいます。**これは、moment.js が持つすべてのロケールファイルが bundle ファイルに含まれてしまうためです。ファイルサイズにシビアなフロントエンドではかなり大きな問題です。

![image](https://qiita-image-store.s3.amazonaws.com/0/4629/8f549b13-d5bc-3231-8d4e-3e60ab350805.png)

(上図は [source-map-explorer](https://github.com/danvk/source-map-explorer) を使って生成しました）

# 解決策

webpack の `IgnorePlugin` か `ContextReplacementPlugin` を使えば、この問題を回避することが出来ます。

## `IgnorePlugin` を使う場合

「デフォルトの `en` 以外にロケールファイルは必要ない」という場合は、`IgnorePlugin` が使えます。

```webpack.config.js
const webpack = require('webpack');
module.exports = {
  //...
  plugins: [
    // Ignore all locale files of moment.js
    new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
  ],
};
```

これですべてのロケールファイルが除去されます。

また「特定のロケールだけ必要」という場合も、コードの中で `require('moment/locale/xx')` と書けば bundle ファイルに含めることができます。

```your-code.js
const moment = require('moment');
require('moment/locale/ja');

moment.locale('ja');
...
```

この手法は [create-react-app](https://github.com/facebookincubator/create-react-app/blob/36cd35d684f6f0eda971b30c789010758fc61ceb/packages/react-scripts/config/webpack.config.prod.js#L358) でも使われています。


## `ContextReplacementPlugin` を使う場合

「`en` 以外にいくつかのロケールファイルを使いたい」というケースでは `ContextReplacementPlugin` が使えます。

```webpack.config.js
const webpack = require('webpack');
module.exports = {
  //...
  plugins: [
    // load `moment/locale/ja.js` and `moment/locale/it.js`
    new webpack.ContextReplacementPlugin(/moment[\/\\]locale$/, /ja|it/),
  ],
};
```

この場合、コードの中で `require('moment/locale/xx')` と書く必要はありません。

```your-code.js
const moment = require('moment');
moment.locale('ja');
...
```

## どれぐらいサイズを減らせるか

手元で検証してみたところ、以下のような結果になりました。

|       | File size | Gzipped |
|:-----------------|------------------:|------------------:|
| Default | 199 kB | 58.6 kB |
| IgnorePlugin | 51 kB | 17.1 kB |
| ContextReplacementPlugin | 51 kB | 17.1 kB |

どちらの方法も、かなり効果があることがわかりました。

# まとめ

やや hacky ですが、現状ではこれが現実的な解決策です。

どちらのプラグインでも結果はほとんど同じですが、個人的には webpack.config.js でロケールを指定する `ContentReplacementPlugin` よりも、コードの中で明示的に `require('moment/locale/xx')` と使うロケールを指定する `IgnorePlugin` のほうがベターではないかと思います。

# 参考
- http://stackoverflow.com/questions/25384360/how-to-prevent-moment-js-from-loading-locales-with-webpack/37172595
- https://github.com/moment/moment/issues/2373
sbtでJavaのライブラリを作成してGithubで簡易的に配布する

# 要約Play Frameworkで使われているEbeanで、SQL文をファイルから読み込むためのライブラリを作り、GitHubにゆるく公開しました。

[nkmrs / ebean-query-text](https://github.com/nkmrs/ebean-query-text)

※2017/1/25: Jarファイルの配布は一旦停止しました。自分でビルドしてください。

# 手順
## プロジェクトの作成
### activator newを使ったプロジェクト雛形の作成

```
$ activator new ebean-query-text
```

タイプは`3) minimal-java`を選択。

※`libexec`ディレクトリと`bin`ディレクトリは不要なので`rm -fR`しておきます


### 依存性の追加
build.sbtにEbeanの依存関係を追加します

```scala:build.sbt
libraryDependencies += "org.avaje.ebeanorm" % "avaje-ebeanorm" % "7.6.1"
```


### コードの作成
パッケージを切ってごりごりコードやテストを書いていきます


## GitHubでの配布

### 配布物の依存関係からscala-langを除く
build.sbtに設定を追加します

```scala:build.sbt
crossPaths := false
autoScalaLibrary := false
```

### publish先をレポジトリ直下の`repo`ディレクトリに設定
build.sbtに設定を追加します

```scala:build.sbt
publishTo := Some(Resolver.file("file",file("repo")))
```

### publishする

```
$ sbt publish
```

```
$ git push
```

### GitHub Pagesの設定
リポジトリの`Settings > GitHub Pages`で
masterブランチをGithub Pagesに設定。

これで、リポジトリの内容が `https://nkmrs.github.io/ebean-query-text/` 以下に公開されます。



# 呼び出し方
## libraryDependenciesへの追加方法

```build.sbt
resolvers += "Github Repository" at "https://nkmrs.github.io/ebean-query-text/repo/"

libraryDependencies += "com.github.nkmrs" % "ebean-query-text" % "0.1-SNAPSHOT"
```

## Ebeanの依存性は追加したくないとき(既にある場合)

excludeする

```build.sbt
resolvers += "Github Repository" at "https://nkmrs.github.io/ebean-query-text/repo/"

libraryDependencies += "com.github.nkmrs" % "ebean-query-text" % "0.1-SNAPSHOT" exclude("org.avaje.ebean", "ebean")
```

以上。


# 参考URL
- http://www.scala-sbt.org/1.0/docs/Publishing.html
- http://d.hatena.ne.jp/Kazuhira/20140505/1399281936
- http://ebean-orm.github.io/
ゼロからphp7環境構築 - 0.事前準備

次回: [ゼロからphp7環境構築 - 1.DBサーバー設定](http://qiita.com/th_/items/dd3c61441bcf7fd58ebe)
***

# 概要

* centOS7
* Apache
* php7
* MariaDB

の環境を、vagrantを使用して、ゼロから作っていきます
せっかくなので、下記のようなことをしてみたいと思います

* appサーバーとdbサーバーを分ける
* git commitにHookをかけて静的コードチェック(phpcs, phpmd, phpcpd)
* gitLabサーバーを立てて、gitHubフローでソース管理
* nginxでリバースプロキシ立ててappサーバー二台構成
* dbサーバー二台構成(master/slave）でレプリケーション

*****

まずはboxを作るところから

# もくじ
* Vagrant, VirtualBox インストール
* 作業フォルダ作成
* vagrant init
* Vagrantfile 編集
* vagrant up
* ssh接続
* yum update
* centOSの設定
* git, vim インストール
* box作成・追加

## Vagrant, VirtualBox インストール
[Vagrant公式サイト](https://www.vagrantup.com/)
> 1.8.6 使用

[VirtualBox公式サイト](https://www.virtualbox.org/)
> 5.1.8 r111374 (Qt5.5.1) 使用

## 作業フォルダ作成
C:\HashiCorp\Vagrant 以下に作業フォルダを作成します
(windowsでの作業には PowerShell を使用しています)

``` 
cd C:\HashiCorp\Vagrant
mkdir work
mkdir work\testProject
mkdir work\testProject\appServer
```
## vagrant init
```
cd work\testProject\appServer
vagrant init bento/centos-7.2
```
下記のメッセージが表示され、bento/centos-7.2 の指定されたVagrantfile(vagrantの設定ファイル)が作成されます
>A `Vagrantfile` has been placed in this directory. You are now ready to `vagrant up` your first virtual environment! Please read the comments in the Vagrantfile as well as documentation on `vagrantup.com` for more information on using Vagrant.

```
ls
-a---        2016/11/18     10:59       3091 Vagrantfile
```
### Vagrantfile 編集
変更前
```
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  # config.vm.network "private_network", ip: "192.168.33.10"
```
変更後
``` 
  # Create a private network, which allows host-only access to the machine
  # using a specific IP.
  config.vm.network "private_network", ip: "192.168.33.11"
```
### vagrant up
```
vagrant up
```
初回はBOXをインストールするため、時間がかかります(5分くらいかかった)
> 通常は事前にdown load, vagrant box add が必要ですが、特定のBox名を指定することでhashicorpが提供するboxの提供サイトから自動で取得します
> [Atlas - These boxes are built using templates from the Bento project -](https://atlas.hashicorp.com/bento)

ステータスの確認
```
vagrant status
```
default                   running (virtualbox) と表示されればOK

## ssh接続
macなどssh接続できるターミナルを使用している場合は、 vagrant ssh で接続できます
windowの場合は、[Tera Term](https://ja.osdn.net/projects/ttssh2/), [Putty](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) などのssh可能なターミナルをインストールしてください
先ほど設定した 192.168.33.11 を指定すれば接続できます(ID PassWordは vagrant)

## yum update
ssh接続先にて。時間がかかります(10分くらいかかった)
```
sudo yum update
```

## centOSの設定
fireWall停止, 自動起動解除
```
sudo systemctl stop firewalld
sudo systemctl disable firewalld
```

## git, vim インストール
```
sudo yum -y install git
sudo yum -y install vim
sudo yum -y install zip unzip
```

## 最適化
```
sudo yum clean all
sudo dd if=/dev/zero of=/EMPTY bs=1M
sudo rm -f /EMPTY
```

## box作成・追加
pc側で
```
vagrant halt
vagrant package
vagrant box add --name centos72 package.box
vagrant box list
```
centos72 が追加されていることを確認

***

次回: [ゼロからphp7環境構築 - 1.DBサーバー設定](http://qiita.com/th_/items/dd3c61441bcf7fd58ebe)
TORQUE 4.2.10 を Ubuntu 16.04 LTS にインストール

# TORQUEとは
TORQUEはオープンソースのジョブスケジューラであり、ジョブを空いてる計算資源に順次投入してくれるソフトである。多数のジョブを並列的・逐次的に処理するクラスターなどでよく使われる。近年は多数のコアを搭載したCPUが普及してきてるので、クラスターではないコンピュータでもジョブスケジューラは役立つ。TORQUEの新しいバージョン（5.x, 6.x）は手元の環境ではうまく動かなかったので、4.2.10をインストールして使っている。

# TORQUEのインストールと設定

#### 必要なパッケージのインストール
```bash
sudo apt install openssl libssl-dev libxml2-dev libtool lsb-core
```

#### ホスト名が指定されているか確認
/etc/hosts にホスト名と使用しているIPアドレスが指定されているか確認する。
例えば`192.168.0.101	TORQUE-Server`のように。
指定されていなければ編集する。

```bash
cat /etc/hosts
sudo nano /etc/hosts
```

#### TORQUE 4.2.10 のダウンロードとインストール
http://www.adaptivecomputing.com/support/download-center/torque-download/ からダウンロードできる。

```bash
tar xvzf torque-4.2.10.tar.gz
cd torque-4.2.10
./configure
make
sudo make install
```

#### ホスト名を指定し、trqauthdデーモンを設定・起動させる。

```bash
echo $HOSTNAME | sudo tee /var/spool/torque/server_name
sudo cp contrib/init.d/debian.trqauthd /etc/init.d/trqauthd
sudo update-rc.d trqauthd defaults
echo /usr/local/lib > sudo tee /etc/ld.so.conf.d/torque.conf
sudo ldconfig
sudo service trqauthd start
```

#### キューの設定
```bash
sudo ./torque.setup $USER
sudo qmgr -c 'p s' # check qmgr settings
```

#### trqauthdとpbs_serverを一度停止して、ヘッドノードと計算ノードを設定する。
```bash
sudo qterm
sudo service trqauthd stop
ps aux | grep pbs
ps aux | grep trq
```

#### 計算ノードを設定
`/var/spool/torque/server_priv/nodes`に計算用のホスト名と割り当てるスレッドの数を指定する。書式は`TORQUE-Server np=36`のようにホスト名と割り当てるスレッドの数である。ここでは、TorqueサーバーとTorqueクライアントは同一のマシンである。

```bash
echo "$HOSTNAME np=`cat /proc/cpuinfo | grep processor | wc -l`" | sudo tee /var/spool/torque/server_priv/nodes
sudo nano /var/spool/torque/server_priv/nodes
```

一行目では作業中のコンピュータの`$HOSTNAME`とスレッド数を`/var/spool/torque/server_priv/nodes`に書き込んでいる。全てのスレッドを計算に割り当てると同一コンピュータ上の他の作業やプロセスに支障が出そうなので、エディタを使ってTORQUEで使用するスレッド数を減らす。

#### ヘッドノードを設定
```bash
echo "\$pbsserver $HOSTNAME" | sudo tee /var/spool/torque/mom_priv/config
```

#### 他のTORQUEデーモンを設定し、システムの起動時に自動的に開始するようにする

```bash
# 他のtorqueデーモンを設定する
sudo cp contrib/init.d/debian.pbs_server /etc/init.d/pbs_server
sudo cp contrib/init.d/debian.pbs_sched /etc/init.d/pbs_sched
sudo cp contrib/init.d/debian.pbs_mom /etc/init.d/pbs_mom
sudo update-rc.d pbs_server defaults
sudo update-rc.d pbs_sched defaults
sudo update-rc.d pbs_mom defaults

# torqueデーモンを起動する
sudo service trqauthd start
sudo service pbs_server start
sudo service pbs_sched start
sudo service pbs_mom start

# torqueデーモンが起動しているか確認。
ps aux | grep pbs
ps aux | grep trq
```

#### 計算用のコンピュータ（TORQUEクライアント）が設定されているか確認
```bash
pbsnodes -a
```

#### 小さなジョブを投げて動作確認
```bash
echo "sleep 30" | qsub
qstat
```

***

#### 参考

* http://tech.ckme.co.jp/torque.shtml
* http://qiita.com/hdoi/items/88d3cf93a32747acc7f3
* https://en.wikipedia.org/wiki/TORQUE
* TORQUE 4.2.10 Administrator Guide: http://www.adaptivecomputing.com/support/documentation-index/torque-resource-manager-documentation/
* https://ubuntuforums.org/showthread.php?p=11797874
畳み込み(CNN)とSpatial Pyramid Pooling(SPP-net)を使ってテキスト分類

以前、[Recurrent Convolutional NNでテキスト分類](http://qiita.com/knok/items/26224c8489ad681769c0)という記事を作成し、画像ではない方のR-CNNでテキスト分類をするコードを書きました。

この時、「covolution_2dではx軸固定の畳み込みができない」と書いたのですが、実際のところは画像を対象とした処理と同様の畳み込み方法(x, y方向に移動しながらフィルタを適用する)でも性能は出るようです。実際にその手法でChainer実装をされた方がいました。

* [【Chainer】畳み込みニューラルネットワークによる文書分類](http://qiita.com/ichiroex/items/f225f6d8eceb6796cc7e)

単語埋め込みベクトルを語順にそのままつなげて大きな2次元ベクトルを作り、それを用いて分類器の学習ができるわけですが、テキストという性質上、そのサイズは文章の長さに依存してしまいます。そのため、先の実装では一度すべての文章の最大長を計り、そのサイズに固定して(必要なら0パディングして)処理を行っています。

これはこれでひとつの方法なのですが、プーリング層にSpatial Pyramid Poolingを用いることで、任意長の入力を固定長のベクトルにすることができます。これを利用することで可変長入力を受け付けるモデルができます。
Chainerではspatial_pyramid_pooling_2d関数として実装されているので、max_pooling_2dをこれに置き換えて、中間のFCレイヤーのユニット数をSPPの出力と合わせれば完成です。

```py
    def __call__(self, x):
        h1 = F.spatial_pyramid_pooling_2d(F.relu(self.conv1(x)), 2, F.MaxPooling2D) # max_pooling_2dと入れ替え
        h2 = F.dropout(F.relu(self.l1(h1)))
        y = self.l2(h2)
        return y
```

* [knok/chainer-cnn: convolutional neural network for sentence classification by Chainer](https://github.com/knok/chainer-cnn)

test accuracyはオリジナルと同等程度出ています(75%前後)。

## その他の修正点

* テキストデータのダウンロード、input.datの生成までを行うMakefileを追加
  * word2vecモデルはwgetでダウンロード可能な一意のURLがないので、[配布元](https://code.google.com/archive/p/word2vec/)から取得してください
* load_dataの高速化
  * 巨大なnumpy配列に対するappendは遅くなるのであらかじめ必要な領域を確保
* CPU指定時に動かない(xp未定義)を修正
FacebookのURLシェア数を取得する

# URLのシェア数の推移を取得する


http://graph.facebook.com/?id=http://qiita.com/

idのパラメータにURLを入れる

```
{
   "og_object": {
      "id": "143935272446719",
      "description": "Qiita\u306f\u3001\u30d7\u30ed\u30b0\u30e9\u30de\u306e\u305f\u3081\u306e\u6280\u8853\u60c5\u5831\u5171\u6709\u30b5\u30fc\u30d3\u30b9\u3067\u3059\u3002 \u30d7\u30ed\u30b0\u30e9\u30df\u30f3\u30b0\u306b\u95a2\u3059\u308bTips\u3001\u30ce\u30a6\u30cf\u30a6\u3001\u30e1\u30e2\u3092\u7c21\u5358\u306b\u8a18\u9332 &amp; \u516c\u958b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002",
      "title": "Qiita - \u30d7\u30ed\u30b0\u30e9\u30de\u306e\u6280\u8853\u60c5\u5831\u5171\u6709\u30b5\u30fc\u30d3\u30b9 - Qiita",
      "type": "website",
      "updated_time": "2016-11-23T02:18:14+0000"
   },
   "share": {
      "comment_count": 0,
      "share_count": 3357
   },
   "id": "http://qiita.com/"
}
```

簡単ですね。
ハマりメモ：spring-boot-starter-parentを継承した時のmaven-resources-pluginの挙動

##TL;DR
spring-boot-starter-parent を継承してpomを作成しているプロジェクトで maven-resources-plugin のリソースフィルタリング機能を使う場合、フィルタリングする箇所は ${} ではなく @@ で囲まなければならない。
（Spring Bootのマニュアルにも載っている）

##要件
Spring Bootを使ったWebアプリでCache bustingをしたい。

##行おうとした実装
SpringにはVersionResourceResolverを使ってお手軽にフィンガープリントをつけられる機能があるが、今回はファイル名が変わるとまずい事情があるのでそれは使えなかった。
そこで、
１．Mavenビルド時に${maven.build.timestamp}で日付を取得して、プロパティファイルにセット
２．それをHTML側からthymeleafで取得し、クエリ文字列としてセット
という手順で実装することにした。

##ハマった点
以下のようにしたところ、プロパティファイルにビルド日時が設定されてくれなかった。
設定は間違っていないはず・・・

```xml:pom.xml
...

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.3.5.RELEASE</version>
	<relativePath/>
</parent>
<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<java.version>1.8</java.version>
	<project.build.timestamp>${maven.build.timestamp}</project.build.timestamp>
	<maven.build.timestamp.format>yyyyMMdd</maven.build.timestamp.format>
</properties>

...

<build>
	<plugins>
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-resources-plugin</artifactId>
			<configuration>
				<resources>
					<resource>
						<directory>src/main/resources</directory>
						<filtering>true</filtering>
					</resource>
				</resources>
			</configuration>
		</plugin>
	</plugins>
</build>

...

```

```text:application.properties
# Cache busting
app.build.timestamp=${project.build.timestamp}
```

```html:layout.html
<link rel="stylesheet" type="text/css" th:href="'/css/common.css?v=' + @{__${@environment.getProperty('app.build.timestamp')}__}" />
<script type="text/javascript" th:src="'/js/commons/common.js?v=' + @{__${@environment.getProperty('app.build.timestamp')}__}"></script>
```

##原因
頑張ってググったところ、マニュアルに答えが書いてあった模様。
http://stackoverflow.com/questions/35417086/maven-resource-filtering-with-spring-boot-could-not-resolve-placeholder
http://docs.spring.io/spring-boot/docs/1.3.0.RELEASE/reference/html/howto-properties-and-configuration.html#howto-use-short-command-line-arguments


要約すると、spring-boot-starter-parent を継承してpomを作成している場合、maven-resources-plugin がフィルタリングに用いるトークンは、${} から @@ に変更される、との事。

つまり、こうするのが正しかった。

```text:application.properties
# Cache busting
app.build.timestamp=@project.build.timestamp@
```
WebSphere ADMU3028I 「サーバーインスタンスが既に実行されている可能性があります」の解決方法

タイトルのようなエラーメッセージが出た場合、

cmd を起動

- cd [WebSphereルート]\bin\
- stopserver [サーバー名]

上記2つのコマンドを実行し、無事起動しました。
サーバーインスタンスを強制停止したことで解決したようです。

うまくいかなかった場合は、stopserverの前にstartserver [サーバー名]を試してみてください。
Windows ServerでChef-solo実行したことその1(ユーザ/パスワード作成)

#Chef-soloに関するなぐり書き

##前提
◆Chef-repo配下にsolo.rbというファイルがあって、
中に各レシピまでのパスが通っていること。
(例：cookbook_path ["C:/Users/Administrator/chef-repo/cookbooks"])
※Windowsの場合はここのパスは\(円マーク)ではなく/

◆私の場合は、solo.rbがchef-repo配下、
JSONファイルがchef-repo/nodes配下にあります(それにより実行文変わる)

◆Windows server環境下でchef-soloを実行するまでは[ここ](http://qiita.com/E_M/items/403e11e0c637cd28ba1d)を見てください。

◆Powershellを使用

###トライその1.ユーザとパスワードを作成
1.ユーザ作成用のクックブックを作成する(今回はadduser)

```
(ディレクトリはchef-repo)
> knife cookbook create adduser -o cookbooks
```

2.シャドウパスワードっていう暗号化したパスワードが必要らしいので生成。
　ただそれに必要なopensslコマンドが使えないので[ここ](https://slproweb.com/products/Win32OpenSSL.html)からインストール

3.暗号化したパスワードを生成

```
> openssl passwd -1 '暗号化したいパスワード'
暗号化されたパスワードの文字列
```

4.usersの中のrecipesの中のdefault.rbに追記

```
user "ユーザ名" do
  password "暗号化されたパスワードの文字列"
  supports :manage_home => true
  action :create
end
```

5.nodes配下にJSONファイルを作成(今回はadduser.json)→編集

```
{
    "run_list": [
      "recipe[adduser]"
    ]
}
```

6.実行

```
> chef-solo -c solo.rb -j nodes/adduser.json
```

7.確認

```
> net user


\\WINほにゃらら のユーザー アカウント

-------------------------------------------------------------------------------
Administrator            Guest                    名前(default.rbで設定したもの)
コマンドは正常に終了しました。
```
ODSC

# ODSC 
## 概要
プロジェクトの目標を**詳細**に**正確**に設定するための手法。
プロジェクト以外でも流用が可能。
自分たちの目指す何かでもよいし、飲み会や自分の人生設計の一部でも流用できる。

#O: Objectives
プロジェクトの目的こと。
このプロジェクトをやって、どんな未来が待っているかの目的。

・このサービスを飲食店が利用し始めると、飲食店全体がイキイキとする。
・この飲み会は、筒香さんの入団をお祝いするためであり、チームメンバー9名との懇親を深める。

#D: Deliverables
成果物のこと。
このプロジェクトを実施し、生み出されるアウトプット。
モノでもよいですし、定性的な何かでもよい。

・サービス設計書
・Javaのソースコード
・binary
・コーディング規約
・筒香さんと東尾さんの出身地が同じことが周知される。
・筒香さんの追い込まれてからの理論が体現される。
・筒香さんと石川さんが同じ高校出身ということが判明する。
・集合写真
・etc...

#SC: Success Criteria
成功基準のこと。
定量的でも定性的でも問題ない。

プロジェクトの定量的な指標であれば、
・X月Y日までにローンチ
・スループットがXXX以上
・マネージャの予約管理業務が60％減
・来年は２位以上
など。

定性的な指標であれば、
・飲食店マネージャーからお褒めの言葉をいただく。
・実際にイキイキとしている飲食店に伺う。
・社内で表彰される。
・JIRAでの開発に、チームメンバーが慣れる。
・チームでのテスト基準を策定できる。
・引退試合の対象にならないようになる。

## ODSCチェックリスト
- [ ]  企業や組織の理念に合致しているか。
- [ ]  経営目標やプロジェクトの本来の目標と合致したものであるか。
- [ ]  参加メンバーが熱意を持ってプロジェクトに参加し、メンバーが成長するために、積極的でありながら、達成可能な内容になっているか。
- [ ]  社会貢献できる視点が入っているか。

## 参考サイト
http://global-optimum.com/blog/2010/06/プロジェクトの計画と実行-odsc-とは？/
http://www.it-innovation.co.jp/2009/11/08-131742/
http://blog.goo.ne.jp/isobegumi/e/4285556de27594b27fac0bbed2eba70b
新人マネージャーが聞きたいこと（WIP）


# 新人マネージャーがみなさんに聞きたいこと
配属された場合、チームのこともプロダクトのこともまっさらな状態です。
まずは、メンバーのことを知りたいと考えているときに聞いておきたい項目を
列挙してみました。
前提として、自分自身のことも項目に当てはめてお話をして、
みなさんに覚えておいてもらうことも必要です。

## 人としての項目
- 基本情報
 - 名前（名前の意味も聞けると尚良）
 - 出身地（結構重要）
- 経歴
 - 開発経験概要
 - 経験した言語
 - 経験したDB
 - 経験したOS
- 趣味嗜好
 - 好きな食べ物
 - 好きな言語
 - 飲酒の有無
 - 喫煙の有無
 - 趣味
　 

## 業務的な項目
- 業務知識
 - 得意な機能
 - 戦略
- 顧客情報
 - 構築
 - 得意な工程
 - トラブル対応


## 能力的な項目
- 対人コミュニケーション
 - 交渉
 - 調整力
 - 巻き込み力
 - 巻き込まれ力
 - アサーティブコミュニケーション(自分の意見を、誠実に、率直に表現し、同時に相手の意見を尊重するコミュニケーションスタイル)
 - 問題解決力
 - チームへの普及活動、教育
- プログラミング
 - ソフトウェア設計
 - スケーラブル設計
 - HA設計
 - データモデリング
 - オブジェクト指向プログラミング
 - 純粋関数型プログラミング
 - 構成管理
 - セキュリティ
- プロジェクトマネジメント
 - プロジェクト計画（機能、日程、予算、人員、リスク分析）
 - プロジェクト進行管理
 - 要求のトリアージ
 - チームビルディング
 - プロジェクトファシリテーション
- 事業開発・業務設計
 - 業務オペレーション構築
 - システムオペレーション構築
 - 戦略思考
 - マーケティング（戦略策定、商品設計、プライシング）
 - 要求開発
 - 要件定義
 - 業務分析、業務モデリング
- 要素技術
 - ネイティブアプリ開発
 - サーバサイドアプリ開発
 - Webフロントエンド開発
 - インフラ・機器
 - インフラ・ミドルウェア
 - テスト
 - BIツール
 - アジャイル開発（XP,Scrum,UP,クリスタル）
 - Linuxカーネル
 - データベース（RDBMS）
 - データベース（KVS）
 - ネットワーク
 - データ分析
 - 機械学習
Cognos BI XQEフォルダのログフル対応

Cognosの導入パス/logs/XQEというフォルダがあると思います。
以下のイメージで、dq_verbosegc_XXXXX.log.001ファイルと、xqelog-XXXXX.xmlファイルが大量に生成されて、ファイルシステムがパンクしてしまう事象が発生しがちです。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/b231a2b2-beb9-8929-d69e-db18194c3860.png)


これの対応についてまとめましたので、Cognosの運用をされている方はご一読下さい。

dq_verbosegc_XXXXX.log.001ファイルは名前の通り、Query ServiceのJVMのGCを記録しているログファイルです。
xqelog-XXXXX.xmlファイルは、DQM(動的クエリーモード)の動作を記録しているログです。

これらのファイルは基本的に増え続けて行き、自動消しこみはできないので、運用スクリプトを作成するなどして、消しこみの仕組みを作る事が必要です。

とはいえ、ログをそもそも出力させないなどのコントロールも可能ですので、以下はその情報です。

■ xqelog-XXXXX.xmlファイルについて
コントロールは、Cognos導入パスの/configuration/xqe.diagnosticlogging.xml ファイルで行います。
ログを出力させないためには、以下のように <diagnostics enabled="true"を"false"に変更し、Cognosを再起動します。

![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/7d3a4f2d-314d-670e-dc4b-d229eee1d210.png)

このファイルに関しては、以下のリンクの情報もご参照下さい。
特定の処理のログレベルを変更する事なども可能です。

【IBM Business Analytics Proven Practices: IBM Cognos Dynamic Cube Advanced Logging Settings】
https://www.ibm.com/developerworks/library/ba-pp-infrastructure-cognos_specific-page655/

【How to trace native SQL for relational DQM datasources or Dynamic Cubes】
http://www-01.ibm.com/support/docview.wss?uid=swg21579065

【No query execution trace "xqelog-xxx.xml" under ..\logs\XQE】
http://www-01.ibm.com/support/docview.wss?uid=swg21989478


■ dq_verbosegc_XXXXX.log.001 ファイルについて
Cognos AdministrationのQuery Serviceのプロパティで設定が可能です。
具体的には、以下の画面の赤枠の2つです。
「JVM 冗長ガーベッジ・コレクション・ログを無効にする」にチェックを入れて、Query Serviceを再起動すると、ログ出力がされなくなります。
「冗長ログへのガーベッジ・コレクション・サイクルの出力数」は、ここに指定した数だけGCの実行回数がログされると、ログファイルがローテーションされる設定値になります。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/f3a2ef84-9f15-2637-73ff-b468ef8d54c6.png)
TeXでsubsubsubsectionを使えるようにする

ときたま、1.1.1.1みたいな書き方をしたいと思う場合がある。(ホントはだめだけど。)しかし残念ながらTeXにはsubsubsectionまでしか用意されていないので、自分で定義する必要がある。よって、今回は備忘録＆勉強がてら残しておく。今回参考にしたサイトは
 [こちら](http://yoppi.hatenablog.com/entry/20091229/1262088390)
# newcommnad
といっても簡単である。newcommandでsubsubsubsectionを定義すればよい。

```TeX
\makeatletter
\newcommand{\subsubsubsection}{\@startsection{paragraph}{4}{\z@}%
  {1.0\Cvs \@plus.5\Cdp \@minus.2\Cdp}%
  {.1\Cvs \@plus.3\Cdp}%
  {\reset@font\sffamily\normalsize}
}
\makeatother
\setcounter{secnumdepth}{4}
```

これでヨイ。
R > オブジェクトxのサイズを表示する > dim(x) / ncol(x) / nrow(x) > View()で最後の列まで見る > View(x[(ncol(x)-99):ncol(x)])

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

xにcsvファイルのデータを読込んだとする。
xのサイズを知りたい。

参考
https://stat.ethz.ch/R-manual/R-devel/library/base/html/dim.html


```R
dim(x)
[1] 11 254
```

11が行で
254が列のようだ

### ncol(x)とnrow(x)

行と列それぞれのサイズを取得するにはncol(x)とnrow(x)でいいようだ。

https://stat.ethz.ch/R-manual/R-devel/library/base/html/dim.html

254列ほどあるxの場合、以下でView()できた。

```R
> View(x[200:ncol(x)])
```

View()の始まりは1なので、ncol(x)がそのまま使える。

以下だと実際の大きさをしらなくてもView()できる。

```R
View(x[(ncol(x)-99):ncol(x)])
```

### 検索用キーワード

- shape
- size
- length
[Git]不要なファイルをpushしてしまった時の対処法

よくGitでやらかすので、
失敗したことと、対処法を忘れないように記載する


## 今回やらかしたこと
* 追跡したくないファイルを意図せずgitにpushしていた
* 完全なる確認ミス

### やりたいこと
* 1度pushしたファイルをリモートとローカルから削除したい

### やったこと
* 不要なファイルが上がった直前のcommitIDを確認(対象ファイルに差分がないもの)
* 差分を確認
* 差分が無いファイルの状態に戻す

```
git checkout commitID ファイル名
```
->ファイルの差分がない状態に戻す

```
git diff --cached
```
->ファイルの差分が戻っていることを確認する

```
git commit -m '不要なファイルアップしたので削除'
git push origin <ブランチ名>
```
プッシュする

### addしたくない場合
```
git checkout <ファイル名>
```
で、追跡から外す
知ると便利なヒアドキュメント

#知ると便利なヒアドキュメント
よく、コマンドを実行する時に引数としてファイルを指定して、その中に書かれた物を使うといった物がある。例えばsftpのコマンド。更にはsshのキーファイルやpgpass、rsyncのエクスクルードなどなど。そういうコマンドをシェルから呼ぶ時にヒアドキュメントを使うと綺麗にかけたりすることがあります。
複数行に渡るファイルをシェルから作るときもechoを連発する必要もなくなります。

##ヒアドキュメントとは
```lang:
echo line1
echo line2
echo line3
```

上記のような事を下記に置き換える事ができます。

```lang:
cat <<EOF
line1
line2
line3
EOF
```

シンプルですね。
ファイルを作りたいときはリダイレクトするだけです。

```lang:
cat <<EOF > test
line1
line2
line3
EOF
```

これだけで複数行に渡ったファイルを作れます。
シェルスクリプトの中でちょっとしたファイルや接続ファイル、エクスクルードファイルなどが必要な時、シェルスクリプトに含める事ができます。

ヒアドキュメントは標準入力として扱われます。文字列リテラルではありません。
従ってファイルを作る時もechoに渡すのではなく、catを使用しています。

##文法

```lang:
cat <<EOF > test
line1
line2
line3
EOF
```

コマンドに<< EOSが渡されると次の行からEOSが単独で現れる行までの間が
ヒアドキュメントの内容になります。
EOSの部分は任意の文字を使うことができます。
また「EOSが単独で現れる行」というのは空白やタブも含んではいけません。

###行頭のタブを取り除く
ヒアドキュメントは便利ですが、インデントできないのが難点です。
EOSをインデントしてしまうとヒアドキュメントの終わりとして認識してくれませんし、
ヒアドキュメントの内容にインデントがそのまま反映されてしまいます。
この問題を解決するための機能が用意されていて、<<を<<-に書き換えるだけで
使用できます。<<-でヒアドキュメントを書くと、行頭のタブを無視してくれます。
ただ、やはり空白だけは無視してくれません。

```lang:
cat <<-EOF > test
\t\tline1
\tline2
\t\tline3
\tEOF
```

```lang:testファイル
        line1
    line2
        line3
```

###変数展開をやめさせる
EOFをクォートします。

```lang:
HOGE=hogehoge
cat <<'EOF' > test
line1
lne2
line3
$HOGE
EOF
```

としておけば下記のように$HOGEは文字列として扱われます。

```lang:testファイル
line1
line2
line3
$HOGE
```

##応用
ファイルを作るだけなく色々な所で役に立ちます。

```lang:
sftp -oPort=2222 -oIdentityFile=hoge hoge@hogehoge.hogehoge.hoge << EOF
cd /tmp
put hoge1
cd /home
put hoge2
put hoge3
quit
EOF
```

##注意
便利ですが、パスワードファイルやキーファイルをシェルで作成する時は
シェルファイル自体のパーミッション、オーナーに十分注意しましょう。
RStudio > デフォルトの日本語コードはShift_JIS

```txt:動作環境
RStudio 0.99.903 on Windows 7 pro
R version 3.3.1
```

R機能マップ 
http://qiita.com/7of9/items/0f911bcb95d3a8bbd703

Rstudioで日本語を含むcsvファイルを読込もうとして気になったのが、「デフォルトの日本語コード」。

以下を見つけた。
http://wakate2014ima.wikidot.com/
> WindowsのRstudioでは、デフォルトの文字コードがShift-Jisのためです。(Mac、UbuntuはUTF-8）

この情報の第一ソースはざっと探したがまだ見つかってはいない。

ToolsのGlobal Options...などざっと見てもencodingの指定は見つからなかった。

Windows環境でRstudioはShift_JISのファイルに対してencoding=指定はいらないようだ。
SpringBootで開発した時に参考にしたサイトまとめ

※随時更新中

SpringBootにもちょっと慣れてきたので、そろそろ参考にさせてもらったサイトをまとめてみようかと。備忘録も兼ねて。
SpringBootだけじゃないですが。。

## 環境
Windows7 64bit
Java 1.8.0_102
Gradle 3.0
SpringBoot1.3.3 RELEASE
MySQL5.1
Postgres

#テンプレート
※2016/11/28現在、SpringBootではまだThymeleaf 3系には未対応なようです。
Thymeleaf使ってるのでやっぱりチュートリアルは外せない

- Thymeleaf 3.x

[Tutorial: Using Thymeleaf (ja)](http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf_ja.html)

- Thymeleaf 2.x

[Tutorial: Using Thymeleaf (ja)](http://www.thymeleaf.org/doc/tutorials/2.1/usingthymeleaf_ja.html)

- Bootstrapのテンプレート

[SB Admin 2](https://startbootstrap.com/template-overviews/sb-admin-2/)

#controller

- controller内での値の引き回しに。

[Spring BootでSessionを扱う（SessionAttribute版）](http://blog.okazuki.jp/entry/2015/07/05/214538)

- RedirectAttributesを使って値を渡す方法

[Spring Bootでリダイレクト先にパラメータを渡す方法](http://grandbig.github.io/blog/2016/05/28/redirect-parameter-spring-boot/)


#form周り
- formをリストで使ったりした時の書き方

[Spring Boot(MVC)のFormにてネストしたオブジェクトを扱う](http://area-b.com/blog/2015/02/04/2009/)

# view
## ajaxを使って一部ページを更新
いろいろ苦戦したので、自分でもまとめたいと思います。

- [Spring(Java) + Thymeleaf でページの一部更新(Ajax)](http://qiita.com/yoyoyo/items/b288f067d5de04f26046)
- HTMLの一部を更新する書き方

[Spring Boot触ってみる その2 ーController,テンプレートエンジン(Thymeleaf)ー](http://endok.hatenablog.com/entry/2016/06/06/035849)

- [Spring BootでJSONデータを受け付けるWebAPIを作る](http://niwaka.hateblo.jp/entry/2015/04/06/213516)

#validation
- [Thymeleafを使用した入力フォームのサンプルコード](http://qiita.com/rubytomato@github/items/387d46ea34eb92071065)
- アノテーションを使ったバリデーションで、どの型に対してどれが使えるかすぐわかる。

[Spring web MVC Validation](http://ziqoo.com/wiki/index.php?Spring%20web%20MVC%20Validation)

- カスタムバリデーションを作る方法。独自のアノテーションを作る。

[SpringMVCで独自Validationチェックをする](http://confrage.jp/springmvc%E3%81%A7%E7%8B%AC%E8%87%AAvalidation%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%82%92%E3%81%99%E3%82%8B/)

#エンティティ
- よく忘れるアノテーション

[JavaEE使い方メモ（JPA その２ - マッピング）](http://qiita.com/opengl-8080/items/265f9f66a65e966678cb)

#DB周り
基本的にentityは主キーが1つが前提なようなので、複数キーの場合はいろいろ不都合があっていろいろ使ってます。

- JdbcTemplateのquery,queryForListとか

[SpringFrameworkでJdbcTemplateを使ってみる(Javaアプリケーション)](http://thread.main.jp/spring/jdbc.html)

#テスト
- データベースを使ったテスト

[Spring Boot で DB アクセスまわりのテスト](http://qiita.com/yo1000/items/014aca2af7234d21d41a)

- 設定もろもろ

[SpringBoot/SpringMVCでRepositoryのテストを楽にするspring-test-dbunit](http://wannabe-jellyfish.hatenablog.com/entry/2016/05/22/123658)

- Spring Test DBUnit使いました(でもまだうまくいってない→autoCommit=falseが出来ない。。トランザクションが別だから共通にしたいのに。。)

[Spring Test DBUnit](https://springtestdbunit.github.io/spring-test-dbunit/index.html)

- [Spring Boot, Spock, DBUnit でトランザクションを使ったテスト](http://qiita.com/yo1000/items/0ce7e8ab0800b49861f7)
- [Spring Boot + DBUnit でテスト用のDBを定義する](http://blog.ryhmrt.com/entry/43241113)
- [Spring Boot で DB アクセスまわりのテスト](http://qiita.com/yo1000/items/014aca2af7234d21d41a)
- [SpringBoot/SpringMVCでRepositoryのテストを楽にするspring-test-dbunit](http://wannabe-jellyfish.hatenablog.com/entry/2016/05/22/123658)
- [Spring4勉強会 第五回](http://qiita.com/yu_eguchi/items/7de03903b43dcb445b52)

#その他
- SpringBoot1.3→1.4へのアップグレードガイド
[Spring Boot 1.4 Release Notes](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-1.4-Release-Notes)
[Javaの小枝] JavaでPPAP

# 参加せざるを得ない

```Ppap.java
public class Ppap {

	enum Word {
		pen, pinapple, apple;
		Word talk() {System.out.println("talk : " + this); return this;}
	}
	
	enum PpapState {
		initial {PpapState transition(Word word) {return word == Word.pen      ? p    : initial;}},
		p       {PpapState transition(Word word) {return word == Word.pinapple ? pp   : initial;}},
		pp      {PpapState transition(Word word) {return word == Word.apple    ? ppa  : initial;}},
		ppa     {PpapState transition(Word word) {return word == Word.pen      ? ppap : initial;}},
		ppap;
		PpapState transition(Word next) {throw new InternalError();}
	}
	
	public static void main(String[] args) {
		Random random = new Random();
		
		for (PpapState state = PpapState.initial; state != PpapState.ppap; ) {
			state = state.transition(Word.values()[random.nextInt(3)].talk());
		}
		System.out.println("finish : Pen Pinapple Apple Pen!");
	}

}
```

# 心掛けたこと

- 状態遷移には、いかにも状態遷移を記述しているっぽいコードを使う
- 話す単語と状態は別の enum で(これはhmhmshさんの[前記事](http://qiita.com/hmhmsh/items/a9c1848437b765e538d3)のコメントでも指摘されていたけど)
- 一目でコードの挙動がわかるように書く
ActionPack Variantsで、layoutとviewファイルに同じ適応をさせる

ActionPack Variantsでは、request.variantに値を入れると入れた値を元にしてviewファイルを探してくれます。

今回、スマホ対応にこの機能を使おうとしたのですが、スマホレイアウトを用意して、一部のviewにスマホ用を用意しても、対応していない方もスマホ用のレイアウトが適応されてしまうので、全部用意する必要がでてきました。

> app/views/layouts/articles.html+mobile.erb
> app/views/layouts/articles.html.erb
> app/views/articles/index.html+mobile.erb
> app/views/articles/index.html.erb
> app/views/articles/show.html.erb

こんなファイル構成だと/articles/index でlayouts/articles.html+mobile.erbが適応されるのは嬉しいのですが、articles/showでlayouts/articles.html+mobile.erbを適応すると崩れてしまうので、PG的に回避したかったのです。

というわけで、以下の様なmodlueを作りました 

```ruby:app/controllers/concerns/mobile_render.rb
# Rails 4.2 使用
module ActionView class LookupContext
    register_detail(:variants_use) { []}
  end
  class TemplateRenderer
    def render_template(template, layout_name = nil, locals = nil) #:nodoc:
      view, locals = @view, locals || {}
      if defined?(template.variants) && template.variants
        @lookup_context.variants_use << template.variants
      end
      render_with_layout(layout_name, locals) do |layout|
        instrument(:template, :identifier => template.identifier, :layout => layout.try(:virtual_path)) do
          template.render(view, locals) { |*name| view._layout_for(*name) }
        end
      end
    end
  end
end

module MobileRender
  def _default_layout(require_layout = false)
    lookup_context.variants_use = lookup_context.variants_use.flatten.uniq
    variants = []
    lookup_context.variants.delete_if{ | variant | ! lookup_context.variants_use.include?(variant.to_s) }
    super(require_layout)
  end
end

```


render時に、templateを呼び出した時、templateで使ったvariantsを取得して、variants_useに格納し、レイアウトを呼び出す際にvariants_useにないものをvariantsから削除するという方法を取っています。

もし、別アプローチでの実現方法や、コード上の問題がありましたらご指摘頂けますと助かります。

[20170831追記]
@yasaichi さんのコメントより
以下の方法の方がスッキリしました。

```ruby
module ActionViewTemplateRendererPatch
  def render_template(template, layout_name = nil, locals = nil)
    @lookup_context.variants = nil if template.variants == [nil]
    super
  end
end

ActionView::TemplateRenderer.prepend(ActionViewTemplateRendererPatch)
```
[sshfs利用]サーバのコードをローカルのエディタで編集

# [sshfs利用]サーバのコードをローカルのエディタで編集

sublimeとかローカルで自分のエディタを使っている人必見。
sshfsを利用すればFinderにサーバ上のディレクトリをマウントすることができます。

※ ただし、Macユーザのみとなっております。

## 導入方法

- まずはpkgをDLしよう

[こちらより最新をDL](https://github.com/osxfuse/sshfs/releases)
[これもDL](https://osxfuse.github.io/)
これの最新版をそれぞれいれよう

- ダウンロードできたら手順に沿ってインストール
- ターミナルを開いて下記コマンドを打ってみよう

```bash
( *｀ω´)/ sshfs --version
SSHFS version 2.5 (OSXFUSE SSHFS 2.5.0)
OSXFUSE library version: FUSE 2.7.3 / OSXFUSE 2.8.3
no mount point
```

インストールされていることが確認できますね

- では、マウントしてディレクトリを確認してみましょう

```bash
( *｀ω´)/ mkdir Hogehoge
( *｀ω´)/ sshfs [username]@[domain]:/path/to/dir/ Hogehoge
```

[username]@[domain]は.sshのconfigにかかれている名前でもOK
/path/to/dir/の部分はサーバ上のマウントしたいディレクトリを指定
Hogehogeはローカルのマウントされるディレクトリを指定

これでマウントができるので、ローカルのエディタで編集すればOKです。

## 削除方法

アンマウント

```
( *｀ω´)/ diskutil unmount Hogehoge
```

これできれいサッパリ消せます。

## まとめ

sshfsの導入はとても簡単♪
Travisからの通知をメールじゃなくてSlackにする

小ネタです。

# はじめに
Travis CIのメールがけっこううるさいのですぐにオフにしたい、でも.travis.ymlを開くのが面倒、という用です。


```bash
$ sed -e -i 's/notifications:/notifications:\'$'\n  email: false/g' .travis.yml
```

<img width="556" alt="Screen Shot 2016-11-25 at 16.13.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/47327/7dc644d7-a55f-b8e5-6f24-2d062898e3a7.png">

> http://stackoverflow.com/questions/723157/how-to-insert-a-newline-in-front-of-a-pattern


```bash
$ git init
$ git add -A; git commit -m 'first commit'
$ git hub-new-repo
$ export SLACKTOKEN=tokenhere
$ travis init
$ travis enable
$ travis encrypt "l2tp:${SLACKTOKEN}#ci" --add notifications.slack.rooms
$ sed -e -i 's/notifications:/notifications:\'$'\n  email: false/g' .travis.yml
```

1. Gitの初期化
2. GitHubにリポジトリを登録してプッシュ
3. Slackのトークンを設定
4. Travis CI初期化
5. Travis CIのリポジトリ作成
6. Slack通知追加
7. Email通知をオフ

として使っています。
macでdllの依存関係を見たい

mac で unityのdllライブラリ作っている時に依存がわからず困った。

```
$ monodis --assemblyref proto.dll
WARNING: The runtime version supported by this application is unavailable.
Using default runtime: v4.0.30319
AssemblyRef Table
1: Version=2.0.0.0
	Name=mscorlib
	Flags=0x00000000
	Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
2: Version=2.0.0.668
	Name=protobuf-net
	Flags=0x00000000
	Public Key:
0x00000000: 25 7B 51 D8 7D 2E 4D 67
3: Version=2.0.0.0
	Name=System
	Flags=0x00000000
	Public Key:
0x00000000: B7 7A 5C 56 19 34 E0 89
```

こんな感じで依存しているDLLが見れた！
VSCodeのエディター設定の話 - タブ文字がなぜか半角スペースになってしまう

#何があったか
タブキーを押しても半角スペースが挿入されてしまう。
タブ文字を入れて欲しい派なのでなんとかしたい。

#editor.detectIndentationをtrueにしてた
既存のファイルをVSCodeで開いて編集を始めたところ、そのファイルが半角スペースでインデントされていたので、それを自動認識してタブ押しても半角スペースになっていたっぽい。たぶんVSCodeを使い始めたときに適当に設定してしまった過去の俺がギルティ。

#あと設定方法が変わってました
[September 2016 (version 1.6)](https://code.visualstudio.com/updates/v1_6) - （[日本語訳](https://blogs.msdn.microsoft.com/ayatokura/2016/10/12/vsc1-6_releasenote/)）
から <strong>editor.renderWhitespace</strong> の設定方法が変わっていたんですね。

それまで真偽値で設定していたものが、
"none"
"all"
"boundary"
の3択になったようです。"boundary"は単語間のスペースは表示されないというオプションのようです。

#というわけで設定を変えました
```
"editor.detectIndentation": false,
"editor.insertSpaces": false,
"editor.renderWhitespace": "all",
"editor.tabSize": 2,
```
これで無事にタブ文字が入力できるようになりました。
ところでワタクシの設定ではタブサイズは2です。どうでもいいですかそうですか。
そんな感じでーす。
Swaggerをちょっとだけ使いやすくするyamlの書き方

基本的な書き方は「[swaggerの基礎。swaggerの設定ファイルの書き方とか](http://qiita.com/magaya0403/items/0419d84d8df7784ac465)」を参照

この記事は上記の内容を前提に、補足程度の情報を記載。
追加があったら都度、追記するかもしれない。

# サンプルを記載する
そのまんま。swagger-editorのプレビューやswagger-UIのAPI一覧でサンプルを見ることができる。
ぱぱっと内容を把握するのに便利。
「examples:」から諸々を記載。以下の例はSwagger-editorのサンプルにある、instagramのyamlから抜粋して加工してある。

```yaml:instagram.yamlのusers/{user-id}より
paths:
  /users/{user-id}:
    parameters:
      - $ref: '#/parameters/user-id'
    get:
      security:
        - key: []
        - oauth:
          - basic
      tags:
        - Users
      description: Get basic information about a user.
      responses:
        200:
          description: The user object
          schema:
            type: object
            properties:
              data:
                $ref: '#/definitions/User'
##ここから
          examples:
            application/json:
              id: 123
              username: "taro"
              full_name: "yamada taro"
              profile_picture: "XXXXX"
              bio: "YYY"
              website: "http://XXXX.YYY.ZZZ"
              counts:
                media: 456
                follows: 100
                followed_by: 200
##ここまで
```

# API名を明示的に指定する
パス名とAPI名を変えたいときに使う。
パスにV2などのバージョンを記載するけど、API名は変えたくない場合に便利（そんなケースあるか・・？）
また、プラットフォームによってAPI名がぶれるのも防いでくれる。
「operationId:」からAPI名を記載する。以下の例だと、URLは/user/123/のような感じだが、APIは「mogeId(int userId)」みたいになる。

```yaml:instagram.yamlのusers/{user-id}より
paths:
  /users/{user-id}:
    operationId: moge_id
    parameters:
      - $ref: '#/parameters/user-id'
    get:
##以下、省略
```

# enumを定義する
そのまんま。enumが使える。ただし、リクエストとして渡したい場合、タイプ(in:)はbodyかqueryでしか指定できないので注意が必要。responseでは縛りなし。
「enum:」から諸々を記載する。
とは言うものの、実際のApiのリクエストはStringになるという・・・。

```yaml:サンプル
parameters:
  user-type:
    name: user-type
    in: query
    type: string
    enum:
      - WOMAN
      - MAN
##以下、省略
```

# バリデーションをする
string系なら文字列の長さと正規表現によるパターンマッチ、数字系(int,long,float,double)なら大小の条件を指定できる
プラットフォームによって機能したりしなかったりするので過信は禁物。
必ず生成されたコードを確認したほうが良い

```yaml:string系
      full_name:
        type: string
        pattern: "[a-z0-9]{8,64}"
        minLength: 8
        maxLength: 64
```
patternで正規表現によるパターンマッチ、min/maxLengthで最小、最大長


```yaml:数字系
  user-id:
    name: id
    in: query
    type: integer
    format: int32
    minimum: 0
    exclusiveMinimum: true
    maximum: 100
    exclusiveMaximum: false
    multipleOf: 10
```
minimum/maximunで最小、最大値、exclusive系でminimumなどで指定した値を含むかどうか(trueで含まなくなる)。上記の例ならidの条件は「0 < id <= 100」となる。
multipleOfは倍数指定。上記の例なら、idは10の倍数でないとNGになる。
Matlab::フォルダ内のcsv-fileをｍat-fileに変換する方法


##### 課題 
* Matlabはcsvファイルをimportするのが遅い．
* 大量の実験データ（数十Mbyteのcsvファイル結構沢山ある．）

##### 解決方法
1. 実験データを保管しているフォルダ内のcsvを検索しリスト化．  
2. １つ目のファイルを一度Workspaceに取り込み，その値をMatファイル形式で保存．
3. 全てのcsvファイルに対して上記２の処理をfor文で実施．

#### 使用Matlab関数
* addpath()
* dir();
* importfile();   Import機能で半自動で実装できる関数です．
* fileparts();
* save() 

***
今回は[JINS MEME ACADEMIC PACK](https://jins-meme.com/en/academic/)を使って実験したので，そちらのデータをサンプルにします．

#### JINS MEMEで計測したデータのサンプル
```MEME
// Data mode  : Full
// Transmission speed  : 100Hz
// Accelerometer sensor's range  : 2g
// Gyroscope sensor's range  : 250dps
//
//ARTIFACT,NUM,DATE,ACC_X,ACC_Y,ACC_Z,GYRO_X,GYRO_Y,GYRO_Z,EOG_L,EOG_R,EOG_H,EOG_V
,1,2016/04/01 08:27:35.29,919,1321,-15849,732,-659,-396,-128,316,-444,-94
,2,2016/04/01 08:27:35.30,1077,1250,-15779,679,-453,-441,-113,334,-447,-110
,3,2016/04/01 08:27:35.31,1161,1189,-15779,685,-254,-456,-97,348,-445,-125
,4,2016/04/01 08:27:35.32,1093,1200,-16087,687,-94,-474,-86,354,-440,-134
,5,2016/04/01 08:27:35.33,943,1147,-16451,630,-2,-456,-80,361,-441,-140
,6,2016/04/01 08:27:35.34,1009,1115,-16666,554,-24,-393,-75,366,-441,-145
,7,2016/04/01 08:27:35.35,954,1069,-16648,448,-106,-300,-75,363,-438,-144
```

100Hzでサンプリングしているので１時間計測すると100×60×60=36万行程度になり,ファイルサイズも20Mbyte程度になります．

これをMATLABでcsvread()などすると結構時間がかかる.いや,アホみたいに時間がかかります．
（もし５秒程度で読み込む方法があるなら教えて頂けると嬉しいです．）

一方でMatファイル形式だと結構あっさり読み込みなどが終わります．
ということで，大量のcsvファイルをMatファイルに変換する方法をメモ．

##### 前提
* csvをImportするm-file（コード中の"import()"）は事前に作ってあります．
* 計測データ（csvファイル）があるフォルダへのパスを通して，csvファイルが検索できる状態になっている．（[参考](http://qiita.com/UJinc/items/42d907f101a922f43e2b)）

```MATLAB
% add folder path if needed
addpath('/Users/***/****/folderA')

% Search csv files in folder-A. Type of "files" is structure.
files = dir('/Users/***/****/folder-A/*.csv');

% Transform csv into MAT
for i=1:1:length(files)

    %Import csv file to workspace
    [ARTIFACT,NUM,DATE,ACC_X,ACC_Y,ACC_Z,GYRO_X,GYRO_Y,GYRO_Z,EOG_L,EOG_R,EOG_H,EOG_V]=importfile(files(i).name);  
    
    %Split filename in folder path, file name, and extention. 
    [path, name, ext] = fileparts(files(i).name); 
    
    %save mat
    extention='.mat';
    matname=[name extention];
    save(matname);
end
```
homebrewで古いpostgresqlとpostgisをインストールする

## 課題：何も考えずにbrew reinstall postgresqlしたら壊れた

もともとpostgresql 9.5を使っていた状態で、psqlが認識しなくなったので`brew reinstall postgresql`を実行したら9.6がインストールされてしまい、pg_upgradeの処理が必要になったけれど、そもそもreinstallしたから9.5ないのでできないし面倒臭いという状態に。もう一度9.5が使いたい。

## 9.5のインストールに成功。しかしpostgisが…。

`brew install postgresql95`で9.5は入ったのだけれど、postgisが入ってない。
しかし、`brew install postgis`を行うと、依存関係に`postgresql`があると言われて強制的に9.6が入る。

## 解決：古いバージョンをcheckoutしてインストール

[Homebrewで旧バージョンをインストールする方法(brew verionsはもう使えない)](http://qiita.com/honeniq/items/778cc08d2db78e6774d8)を参考に、古いバージョンを使うことにしました。

なお、`cd`先のディレクトリはhomebrewのインストール先次第では違うと思うので、適宜読み替えてください。

### 前提

関連するものは全て一旦停止・削除しておきましょう！
以下の命令は必要ないものもあるかもしれないので、適宜実行してください（多分害はないと思うけれど、自己責任で）

```bash
brew services stop postgresql
brew services stop postgresql95
brew uninstall postgresql
brew uninstall postgis
brew uninstall postgresql95
```


### postgresql

以下を実行します。

```bash
cd /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/Formula
git log postgresql.rb
```

すると、

    commit db96a14dde07fdd4600d2a8cc3d4a917806d3228
    Author: BrewTestBot <brew-test-bot@googlegroups.com>
    Date:   Wed Nov 2 08:29:01 2016 +0000
    
        postgresql: update 9.5.5 bottle.

というコミットが見つかるので、それをcheckoutしました。

```bash
git checkout db96a14dde07fdd4600d2a8cc3d4a917806d3228 postgresql.rb
```

### postgis

postgisもcheckoutします。最新のものはpostgresql9.6に対応しているため、9.5では`create extension postgis;`でエラーになったためです。

```bash
git log postgis.rb
```

すると、こちらも同様に、

    commit a1f02e19405897966e7998f917f7c8ab14e6732e
    Author: BrewTestBot <brew-test-bot@googlegroups.com>
    Date:   Wed Oct 12 23:44:00 2016 +0100
    
        postgis: update 2.3.0 bottle.

というコミットが見つかったのでそれをcheckoutします。

```bash
git checkout a1f02e19405897966e7998f917f7c8ab14e6732e postgis.rb
```

### インストールを実行

```bash
brew install postgis
```

これで、postgresql 9.5, postgis 2.3がインストールされます。

あとは、`psql`でposgisが使えるか確認します。
Railsプロジェクトやってる人ならば、プロジェクトのディレクトリで`bin/rails dbconsole`を使うと楽です。
そして、以下を実行してpostgisがあるかどうかを確認します。
```psql
select * from pg_available_extensions;
```

あったら、使えるようにしましょう。

```psql
create extension postgis;
```

以上です。

## 感想

こうなると面倒臭いので、そろそろpostgresqlをDockerで動かしたい…。
git プロトコルが使えない環境で bundle install する


元ネタ: [github - git:// protocol blocked by company, how can I get around that? - Stack Overflow](http://stackoverflow.com/questions/4891527/git-protocol-blocked-by-company-how-can-i-get-around-that)

以下のように git の設定を行うと、git:// の代わりに http:// でアクセスしてくれるようになる。

```
git config --global url."https://".insteadOf git://
```
preg_match関数と正規表現の理解を再度見直す

PHPで、受け取った文字列が所定の条件を満たしているか
よく使うけど、とっさに出ないのがこれ。


# 環境

- PHP （4以上：preg_matchが使える環境）

ereg は5.3以降で非推奨になり、7.0.0で削除とのこと
http://php.net/manual/ja/function.ereg.php

だからpreg_matchを使うことにしました
http://php.net/manual/ja/function.preg-match.php

# preg_match関数の仕様（抜粋）

php.netのドキュメントより抜粋



関数の文法が記載されていますが


> int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags = 0 [, int $offset = 0 ]]] )


ここで扱うのは手前２つの引数　`$pattern`=パターン　`$subject` = 判定対象　です。

戻り値は、pattenが指定したsubject内にマッチした時に1 しなかった時に 0 エラーが発生した時にfalse　なので注意


# 利用ケース

## IDなど、指定した文字しか許可しない場合

IDやパスワードなどにありがちな、
半角アルファベットと数字、ハイフン、アンダースコアのみ許可するパターン。

この場合、判定対象の文字列に、許可する文字「以外」が存在したらNG(=false)とみなす。存在しなければOK(=true)とみなす。とする。

厳密には例外処理すべきだが、エラーが発生した場合もNGとする。

```php:特定の文字だけならtrue
  //半角アルファベットと数字、ハイフン、アンダースコア「以外」を対象とする
  $id_ptn = '/[^A-Za-z0-9\-_]/';

  $ok_id = "user_1-2";
  $ng_id = "user#1-2";

  //$ok_id_ptnの場合、指定した文字以外が無いのでpreg_match が0を返しtrue
  $ok_id_ptn = preg_match($id_ptn,$ok_id) === 0 ? true : false;
  //$ng_id_ptnの場合、指定した文字以外が存在するので1を返し　false
  $ng_id_ptn = preg_match($id_ptn,$ng_id) === 0 ? true : false;

```

上記のパターンで、エラーも分けるなら`preg_match`の戻り値をそのまま判定し、

- 0なら許可する文字だけが存在しているので、正しい時の処理に分岐
- 1なら許可する文字以外が存在しているので、不正な時の処理に分岐
- falseなら、判定処理自体に失敗したので、例外処理に分岐

みたいなロジックをとる。

# オチ

# ・・・といったことが、すぐに頭に浮かび、エンジニア以外に説明でき、そつなくコードをかけるように　ワタシハナリタイ