OmniAICreator/Qiita-1.07M huggingface dataset:
CakePHP3 大文字と小文字を区別せずにsortする

# CakePHP3 で、大文字と小文字を区別せずにsort する方法

大文字と小文字を区別せずにsort したかった。  
まずは例。  

例1  

| id |  fruits   |
|:--:|:---------:|
| 1  |     Apple |
| 2  |    Orange |
| 3  |     Peach |
| 4  |     apple |
| 5  |    orange |
| 6  |     peach |


View で例1 みたいな感じに並んでいたとする。  

これを  

例2 

| id |  fruits   |
|:--:|:---------:|
| 1  |     Apple |
| 4  |     apple |
| 2  |    Orange |
| 5  |    orange |
| 3  |     Peach |
| 6  |     peach |

例2 みたいにしたい！  

ということで、調べた。(教えてもらった)  


方法は、  
`view`側。つまり`hoge.ctp`で、  
```
$this->paginator->sort('lower(fruits)')
```

と書く。  
`lower()` で、 全部小文字に変換してから`SELECT`しているらしい(SQLの話)  

その後、Controller 側で、

```php
$paginate = [
    // 'limit' => 10,
    'sortWhitelist' => [
        'lower(fruits)'
    ],
]
```
という感じで `sortWhitelist` という配列に `lower(fruits)` という文字列を突っ込む！  
`sortWhitelist`に関しては、[こちら](http://book.cakephp.org/3.0/ja/controllers/components/pagination.html#id3)を参照！

これにて完成！  


ちなみに、 `sortWhitelist` を使うときは、  
`sort` の対象となる文字列を全部突っ込まなくてはならないらしい。
つまり、初期条件として`id` 降順を指定する場合、

```php
$paginate = [
    // 'limit' => 10,
    'order' => ['id' => 'asc'],
    'sortWhitelist' => [
        'lower(fruits)', 'id'
    ],
]
```

みたいな感じで書かなくてはならない。
地味にハマりそうなので、頭の片隅に置いておいて下さい！

以上！
SeaPig で uiflow サポートを追加してみた

![](https://raw.githubusercontent.com/yasumichi/seapig/master/seapig.png) [SeaPig](https://github.com/yasumichi/seapig) is converter from markdown to html with marked.js and highlight.js.

[SeaPig v0.3.0](https://github.com/yasumichi/seapig/releases/tag/v0.3.0) で viz.js サポートは実装済みで dot 記法から、グラフ画像を埋め込めるようにはしていたのですが、[SeaPig v0.5.0](https://github.com/yasumichi/seapig/releases/tag/v0.5.0) では、[uiflow](https://github.com/hirokidaichi/uiflow)を内蔵し、[uiflow の記法にも対応しました](http://qiita.com/yasumichi/items/b3acec72d740fba4b7f7#uiflow-%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88v050%E3%81%AB%E3%81%A6)。実装の際に困ったことを記録として残しておきます。

## 筆者の環境

- [VineSeed](https://vinelinux.org/vineseed.html) ([Vine Linux](https://vinelinux.org/) 開発版) 64bit
- [nodebrew](https://github.com/hokaccha/nodebrew) use v4.4.7(LTS)

## uiflow 使用に際し、困ったこと

[uiflowをライブラリとして使う](https://github.com/hirokidaichi/uiflow#uiflow%E3%82%92%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%81%A8%E3%81%97%E3%81%A6%E4%BD%BF%E3%81%86)を参考に実装前に node インタープリタで試してみたのですが、筆者の環境では以下のエラーが出てうまく行きませんでした。

```
$ node
> var uiflow = require("uiflow");
undefined
> uiflow.compile("[テスト]\nユーザーが見るもの\nユーザがすること\n");
ReferenceError: d is not defined
    at Object.uiflow.compile (/home/yasumichi/other/guiflow/node_modules/uiflow/index.js:112:37)
    at repl:1:8
    at REPLServer.defaultEval (repl.js:262:27)
    at bound (domain.js:287:14)
    at REPLServer.runBound [as eval] (domain.js:300:12)
    at REPLServer.<anonymous> (repl.js:431:12)
    at emitOne (events.js:82:20)
    at REPLServer.emit (events.js:169:7)
    at REPLServer.Interface._onLine (readline.js:211:10)
    at REPLServer.Interface._line (readline.js:550:8)
```

原因を調査している過程で @tkrkt さんの[ローカル画像生成サーバ作ってMarkdown記事執筆を加速する - Qiita](http://qiita.com/tkrkt/items/f65a4be0cd57235217c9)という記事に出会い、その途中に以下の記述を見つけました。

> ※uiflowでエラー出るならこっちで。
> 
> `$ npm install uiflow@git+https://github.com/tkrkt/uiflow.git#fix-argument-in-compile`

という訳で @tkrkt さんの修正版をインストールして同様の実験を行なったところ、問題なく動作しました。(参考:修正版の[差分](https://github.com/tkrkt/uiflow/commit/3e5037967394028351873e3db0533932509f751a))

## 参考リンク

- [もう保守されない画面遷移図は嫌なので、UI Flow図を簡単にマークダウンぽく書くエディタ作った - Qiita](http://qiita.com/hirokidaichi/items/ff54a968bdd7bcc50d42)
- [ローカル画像生成サーバ作ってMarkdown記事執筆を加速する - Qiita](http://qiita.com/tkrkt/items/f65a4be0cd57235217c9)
- [uiflowのvscodeプラグインを作ってみました - Qiita](http://qiita.com/kexi/items/f5bd25fd4a7da81e62d4)
- [innerText(textContent)/innerHTMLを使わずJavaScriptでHTMLエスケープ - Qiita](http://qiita.com/noriaki/items/4bfef8d7cf85dc1035b3)
- [uiflow](https://github.com/hirokidaichi/uiflow)
- [uiflow @tkrkt さん修正版](https://github.com/tkrkt/uiflow/tree/fix-argument-in-compile)(fix argument in compile)
angular-fullstack: ログインの要否を問わないアプリ

~~~javascript
var validateJwt = expressJwt({
  secret: config.secrets.session,
  credentialsRequired: false
});


export function isAuthenticated() {
  return compose()
    // Validate jwt
    .use(function(req, res, next) {
      // allow access_token to be passed through query parameter as well
      if (req.query && req.query.hasOwnProperty('access_token')) {
        req.headers.authorization = 'Bearer ' + req.query.access_token;
      }
      validateJwt(req, res, next);
    })
    // Attach user to request
    .use(function(req, res, next) {
      var query = {
        _id: req.user ? req.user._id : Array(24+1).join('0')
      };
      User.findOne(query).exec()
        .then(user => {
          if (!user)
            req.user = null
          else
            req.user = user;
          next();
          return null;
        })
        .catch(err => {
          next(err);
          return null;
        });
    });
}
~~~
Warning: a promise was created in a handler but was not returned from it

## Nodeで以下の様な警告が出ることがある
~~~
Warning: a promise was created in a handler but was not returned from it
~~~

## 環境
Promiseの返り値がないと言われているので、適切に返り値を指定すれば問題は解決する。意図せず警告が出る場合は、たとえばMongooseなどで返り値のないPromiseを作ってしまっている疑いがある。その場合、以下のように返り値を指定すれば良い。

~~~javascript:変更前
// User は Mongoose のスキーマ
User.findById(req.user._id).exec()
  .then(user => {
    if (!user) {
      return res.status(401).end();
    }
    req.user = user;
    next();
  })
  .catch(err => next(err));
~~~

↑これをこう↓

~~~javascript:変更後
// User は Mongoose のスキーマ
User.findById(req.user._id).exec()
  .then(user => {
    if (!user) {
      return res.status(401).end();
    }
    req.user = user;
    next();
    return null;
  })
  .catch(err => {
    next(err);
    return null;
  });
~~~
SPAの静的ファイルのデプロイの仕方


こちらの記事の続編です。（ここではReact/reduxで話を進めますが、他のSPAフレームワークでも共通だと思います。）
[React + Redux + TypeScriptでreact-router](http://qiita.com/uryyyyyyy/items/7d4b0ede3f2b973d6951)

## 概要

SPAで開発しよう！サーバーから独立して開発しよう！みたいな風潮がありますが、具体的にどのようにデプロイしたら良いんだっけ？と思ったので、個人的なプラクティスを書いておきます。
（認証を含むアプリについては別の記事で記載します。）

## 環境

- NodeJS 5.X~
- React 15.1
- TypeScript 1.8

全体の構成はこちらを御覧ください。
https://github.com/uryyyyyyy/react-redux-sample/tree/spa

画面遷移してurl叩いてもちゃんと動作することが確認できます。

## ゴール

- SPAの理想を改めて考える
- サーバー環境に依らずデプロイ出来るようにしておく
- フロントのルーティングにも対応できるようにする

## SPAの目指すところを改めて確認する

SPAでは、サーバーの都合に振り回されることなく、サーバーをただのAPIサーバとみなしてフロントの開発が出来ることにあると個人的に思っています。
そうすることで、モックサーバなどでの開発が簡単に行えて、リリースサイクルもサーバー側と変えることができます。

なので、一切サーバに依存することなく開発、デプロイができるようにしたいです。

## SPAでデプロイするものとは何か

基本的には以下の構成だと思っています。

```
tree ./

.
├── index.html
├── other_page.html
├── js
│   ├── bundle.js
│   └── 3rd-party-library.js
├── css
│   ├── bundle.css
│   └── 3rd-party-library.css
└── images
    └── fixed.jpg
```

このとき、htmlの書き方はこのようになります。
ここで、全てのファイルの頭に`/`が付いているのは、`http://localhost/page1/id/3` みたいなURLになったときにも、同じhtmlでSPA用のJSやらcssやらを同じように取得してほしいからです。

もちろん普通のサーバーだと`/page1/id/3` のindex.htmlを読みに行ってしまうのでサーバー側でrootのindex.htmlを返してあげる必要があります。そして、その際に他の静的リソースへのアクセスの時にもhtmlを返されると困るので、そのrouting設定は全部のパスが外れた最後に通してあげる必要があります。これはなんというか、webアプリの限界という感じです。詳しくは[こちらの記事](http://qiita.com/uryyyyyyy/items/30733e9cd140e60c52bd)をどうぞ。

```html:index.html
<!DOCTYPE html>
<html>
<head>
  <link rel="stylesheet" href="/css/3rd-party-library.css">
  <title>React minimal</title>
</head>
<body>
<img src="/images/check.png" />
<div id="app">Loading...</div>
<script src="/js/3rd-party-library.js"></script>
<script src="/js/bundle.js"></script>
</body>
</html>
```

要するに、上記のような静的ファイルをまとめることができれば、どの環境に持って行っても動くようになるはずです。

## 具体的にはどうするのか

ここでは、主に3rdパーティライブラリや生成したjs（そのままgitで管理したくないもの）の配置について考えます。
その他の「配置してgitで管理すれば終わり」「固定されてるCDNから取ってくるだけ」というだけのものはここでは省略します。

### 3rdパーティライブラリ

（npmやbowerでinstallしたものを想定しています。）

開発時、ビルド時に一度だけパスを移動させればいいので、shellなどで対象のフォルダ内に入れてあげます。（CSSフレームワークなどは、その中で他のファイルを読みに行くことがままあるので、フォルダ毎コピーしてあげると無難かと思います。）
その際、移動したファイルはgitignoreで管理から外します。

### 生成したjs/css

生成してから対象のパスへ移動して〜を毎回やるのは面倒なので、出力先をそのまま対象のパスにしてあげます。

## まとめ

ちょっと内容の薄い記事になってしまった感があります。。。
後で別記事を上げるのでそちらの前提を補完するものとして見て頂ければ。
phpの正規表現メモ　電話番号形式変換


#特殊文字
| 特殊文字 | 意味 |
|--------|--------|
| * | 0回以上の繰り返し |
| + | 1回以上の繰り返し|
|    ?    |    0回または1回    |
| {n} | n回の繰り返し |
| {n,m} | n回からm回の繰り返し |
| {n,} | n回の繰り返し |
| ^ | 行頭 |
| ¥ | 行末 |
| \d | 0-9の数字1字 |
| \w | アルファベットか数字かアンダースコア |

#正規表現でマッチング
```php

preg_match(正規表現パターン,対象文字列）

//例
$input = "123-4567";
$pata = "/^\d{3}[-ー]?\d{4}$/";

if(preg_match($pata,$input)) {
	echo "$inputは郵便番号の形式です";
} else {
	echo "$inputは郵便番号の形式ではありません";
}
```

#正規表現で置換

```php

preg_replace(正規表現パターン,変換形式,対象文字列）

//例
$input = "2015/5/25"
$pata = "/^(\d{4})\/(\d{1,2})\/(\d{1,2})$/";
$rep = "$1年$2月$3日";

$test = preg_replace($pata,$rep,$input);
// $test == 2015年5月25日
```


#電話番号置き換えプログラム
正規表現で電話番号の形式をチェックし、「-」の削除、復元を行う。電話番号のデータベースへの登録、取り出しの際に利用。


```php
//電話番号のフォーマット
class phone_formater {

    //電話番号から「-」を削除
    public static function replace($input) {
        //「-」の空白への置き換え
        $search = array("-","ー");
        $result = str_replace($search,"",$input);
        return $result;
    }

    //電話番号に「-」を追加
    public static function format($input) {
        //変数宣言
        $category = array(
            "normal" => "/^0[^346]\d{8}$/",
            "mobile" => "/^\d{11}$/",
            "tokyo"  => "/^0[346]\d{7}$/",
            "none"   => "/^\d{7}$/",
        );
        $pattern = array(
            "normal" => "/(\d{3})(\d{3})(\d{4})/",
            "mobile" => "/(\d{3})(\d{4})(\d{4})/",
            "tokyo"  => "/(\d{2})(\d{3})(\d{4})/",
            "none"   => "/(\d{3})(\d{4})/",
        );
        $rep = array(
            "normal" => "$1-$2-$3",
            "none"   => "$1-$2",
        );

        //携帯ならら
        if(preg_match($category['mobile'],$input)) {
            $result = preg_replace($pattern['mobile'],$rep['normal'],$input);
        }
        //市外局番2桁なら
        elseif(preg_match($category['tokyo'],$input)) {
            $result = preg_replace($pattern['tokyo'],$rep['normal'],$input);
        }
        //普通の市外局番なら
        elseif(preg_match($category['normal'],$input)) {
            $result = preg_replace($pattern['normal'],$rep['normal'],$input);
        }
        //市外局番なしなら
        elseif(preg_match($category['none'],$input)) {
            $result = preg_replace($pattern['none'],$rep['none'],$input);
        }
        //その他なら
        else {
            $result = $input;
        }

        return $result;
    }
}
```


```php

$input = 03-1234-5678;

//「-」の削除
$result1 = phone_format::replace($input);

//「-」の復元
$result2 = phone_format::format($result1);

//$result2 == 080-6520-7740
```お
Dockerコンテナのマウントディレクトリでnpm installが遅い


Github上でも議論されていました。

* [Speeding up \`npm install\` in docker · Issue \#8836 · npm/npm](https://github.com/npm/npm/issues/8836)

私の環境では、Dockerコンテナの/tmp上で `npm install` を実行した後、node_modulesのsymlinkをアプリのディレクトリに設定することで動作を速くすることができました。検証結果を共有します。

改善前:

```
$ cd /mnt/app && npm install
```

改善後:

```
$ cp /mnt/app/package.json /tmp/.
$ cd /tmp && npm install
$ ln -s /tmp/node_modules /mnt/app/.
```

## 環境

```
$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31

$ vboxmanage --version
5.0.24r108355

$ vboxmanage showvminfo default | grep -E '(CPU|Memory)'
Memory size:     2048MB
CPU exec cap:    100%
Number of CPUs:  2
CPUID Portability Level: 0
CPUID overrides: None

$ docker -v
Docker version 1.11.2, build b9f10c9

$ docker-machine -v
docker-machine version 0.7.0, build a650a40

$ node -v
v4.4.7

$ npm -v
2.15.8


```

## 検証

検証プロジェクトとして、[Material UI](https://github.com/callemall/material-ui)のdocsを使います。

```
$ git clone git@github.com:callemall/material-ui.git
$ cd material-ui/docs
```

### ローカルディレクトリ

結果: 約3分

```
$ rm -rf node_modules
$ time npm install
...
npm install 148.11s user 51.25s system 117% cpu 2:50.11 total
```


### Docker:マウントディレクトリ

結果: 約16分

```
$ rm -rf node_modules
$ docker run --volume $(pwd):/mnt/app -it node:4.4 bash

root@6d7dba381d3a:/# cd /mnt/app
root@6d7dba381d3a:/mnt/app# time npm install
...
real    15m55.132s
user    5m29.150s
sys     16m18.160s
```

### Docker:/tmp

結果: 約4分

```
$ rm -rf node_modules
$ docker run --volume $(pwd):/mnt/app -it node:4.4 bash
root@65b6a6c739d5:/# cp /mnt/app/package.json /tmp/.
root@65b6a6c739d5:/# cd /tmp
root@65b6a6c739d5:/tmp# time npm install
...
real    4m4.300s
user    2m16.840s
sys     2m4.350s
```
RancherOS 0.8-rc2をインストール

## 参考

* [Built-in System Services in RancherOS](http://docs.rancher.com/os/system-services/built-in-system-services/)

* user : pass = rancher : rancher
* OSインストールはメモリ768MBでは空き容量不足で失敗。1024MBでは成功。

## cloud-config.ymlの準備

Githubに登録している公開鍵を取得

* https://github.com/tukiyo.keys

```
wget https://github.com/tukiyo.keys
```

```bash:rancher.yml
ssh_authorized_keys:
  - ssh-rsa AAA... (tukiyo.keysの中身を貼り付け)
```

他の例だと

```bash:rancher.yml
ssh_authorized_keys:        
- ssh-rsa AAAA...

state:
fstype: auto
dev: LABEL=RANCHER_STATE
autoformat:
- /dev/sda
```

## インストール

```bash:インストール
ros install -d /dev/sda -c rancher.yml
```

* OS再起動。

## ros config export

* `ros config export`でcloud-config.ymlを確認できる。

もしくは

* /var/lib/rancher/conf/cloud-config.yml [参考](https://docs.rancher.com/os/system-services/built-in-system-services/)

## os upgrade

```
sudo ros os upgrade
```
MariaDBをきちんと使っていく為の前知識

今後どんどんOSS-DBとして主流になっていくと思われる。
MariaDBついてまとめる。

#■MySQLとの比較

- MariaDB10.0からは、MySQL5.6の機能を取り込む形となった。（それまではMySQLをベースとして開発していたが、MySQL5.6が大きくリファクタされ困難となったため）
今後は、今までのようにMySQLのスーパーセットとしてDBから、少しずつ独自拡張の進化を遂げていくのではないか。

- オプティマイザが賢い、スレッドプール、Role、マルチソースレプリケーションの機能がある。

- 通信プロトコルが同じなのでクライアントツールとしてはそのまま使える。

- ダブルライトバッファ→テーブルデータの書き込み方法をダブルライトバッファという。デフォでは無効。(innodb_doublewrite)。通常はバッファプールから書き込む。

- ダイナミックカラムを利用すると１項目に複数の値がセット出来る。実態はBLOB型として格納。

- データファイルはテーブルごとに保存させることが出来る。


#■超図解
![スクリーンショット 2016-08-16 17.15.50.png](https://qiita-image-store.s3.amazonaws.com/0/102281/f20a64f1-822e-3d79-0021-4d706c9e946c.png)

・１クライアントに対して１接続スレッドが割り当てられる
・パースして一字一句同じSQLなら、クエリキャッシュにある同じクエリ結果を返却。
・バッファプールはメモリ上のデータ保存場所。ここに無ければディスクIOが発生。

#■クエリキャッシュとは

SELECTステートメントのテキスト（つまりSQL）と、その結果を保存しておく機能。
その後、まったくおなじSQLが来たら、クエリキャッシュから結果を返却することで高速化をはかっている。
ちなみにデータ変更があると、関連するクエリキャッシュは全て削除されるので、古いデータが戻されることはない。
クエリキャッシュを使うとよいのは、システムとして表の更新はそこそこで参照が多い場合に有効。※ただし最近はハードウェアなどの進化によりそこまで効果のある機能ではなくなってきている。

#■スレッド周りの説明

通常は、１クライアントにつき、１スレッドが生成および破棄される。
スレッドキャッシュ機能により、複数クライアントを受け持つスレッドのグループ単位で、
処理することが出来る。これにより、スレッド生成処理に伴うオーバーヘッドを
抑える事ができる。

※MySQLでは、この機能はEnterPrise版でのみ利用可能だが、MariaDBでは無償で利用可能。

※Oracleなどでいうコネクションプーリングとは違う。
⇒スレッドのキャッシュが、（接続認証後の）スレッド生成要求が来た場合のキャッシュなのに対して、コネクションプーリングは、それより前の（接続認証済みの）接続自体を確保しておく。
つまり、スレッドのキャッシュは生成時に行われるスレッドの生成／データ構造体の初期化などを省くことが出来る。
コネクションプールは、認証済みの接続を使い回すため、認証処理から含めて省ける。


#■オプティマイザが分析時に利用する統計情報はいつ更新されるか

（１）テーブルが最初にオープンされたとき
（２）テーブルのデータが多く（１６分の一）更新された時もしくは２０億数行など
（３）ANALYZE TABLEが実行されたとき
（４）show tables status/ show index fromが実行されたとき
（５）InnoDBモニタがONになったとき
（６）MySQLサーバーの再起動

統計情報はデフォルトでは、テーブルに保持されていないため、途中で統計情報を変更してほしくない場合は、
ANALYZE TABLEを利用して、システムテーブルに保持するように変更する。
（MySQL5.6以降）

　
#■perror   （エラー内容確認ユーティリティ ）

よくSQLエラーになった時に、すぐ原因がわからない場合がある。
そんなときはperrorユーティリティを使う。

例）存在しないテーブルに対してSELECT

` MariaDB [test]> select * from tbl;
ERROR 1146 (42S02): Table 'test.tbl' doesn't exist` 

` [root@ ]# perror 1146
MySQL error code 1146 (ER_NO_SUCH_TABLE): Table '%-.192s.%-.192s' doesn't exist` 

例が微妙だが、同じ意味でも違った記述になるので内容によっては有用か。
Nginx,php-fpm,phpのバージョンアップ時の注意点

# はじめに
* 今回はNginxのバージョンアップ作業をしていてハマリどころ、実際にハマった点を元にまとめます
* Nginx1.4系から1.10系のバージョンアップで試してみた

# 構成的な所
Nginx + php-fpm + phpでwebサーバを構築してて、Nginxのバージョンアップをしようとした

# Upgrade
upgradeはnginx-buildをchef経由で使わせてもらってます
https://github.com/cubicdaiya/nginx-build

## nginx-buildとは
http://tech.mercari.com/entry/2015/08/26/170000

# ハマった点
すべては下記のNginxのエラーログが出たのがはじまり

```
yyyy/mm/dd hh:mm:ss [crit] 14114#0: *7 connect() to unix:/var/run/php-fpm/php-fpm.sock failed (13: Permission denied)
```

## 原因
1. 端的に言うとnginxのbuild時のuser,group設定が足らなかった

 * nginxのbuild時のuser,groupの設定

   ```
nginx-build \
      -d work \
      -v #{nginx_version} \
　    --user=nginx \  ここの設定が抜けてた
      --group=nginx \ ここの設定が抜けてた
      .
      .
      .
   ```

* php-fpmでは下記の設定がされている

```/etc/php-fpm.d/www.conf
listen.owner = nginx
listen.group = nginx
```

まぁ`/etc/php-fpm.d/www.conf`の方を修正してもいけると思うけど、Nginxのbuildをやり直した

2. php,php-fpm
 * socket permission
    * 下記の情報が元ネタですが、パーミッションの設定のデフォルト設定が変わった点
    * https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0185

アクセスするのがすべてローカルユーザで安全なら以前のように666で良いと思われる

```/etc/php-fpm.d/www.conf
listen.mode = 0666
```

# その他メモ
* NginxのDefaultのconfigに何か変更点とかあるかなぁと思ったけどほぼなかった

# 最後に
* `/etc/php-fpm.d/www.conf`の設定ばかり疑っていてnginxのbuildのオプションが他ならなかった事に気付かず消耗した
* みなさん同じ轍を踏まぬように公開しておく
Fabricでgunicornのデーモン化ができなかったアレ

# 経緯
Djangoでアプリを作っていてfabricとcuisineを使って環境構築をコード化していたんですが、どうにもgunicornがうまくデーモン化されません。
デーモン化のオプションを外すと実行はされるので、設定が間違ってるとかではないと思います。

## 動かなくて困ってるコマンド

```py
puts(green('Starting gunicorn process...'))
with cd(project_root_path):
    run('gunicorn {}.wsgi:application -c gunicorn_conf.py'.format(project_name))
```

## 解決策
`pty=False`にしてやるだけです。理由とかは面倒なので読んでませんw

```py
run('gunicorn {}.wsgi:application -c gunicorn_conf.py'.format(project_name), pty=False)
```

## 参考
http://www.fabfile.org/faq.html#init-scripts-don-t-work
ここの`Init scripts don’t work!`を読むと分かります。
詳しく読んでないですが、なんか上手く動かないことがあるっぽいですね。

僕の場合、nginxやtd-agentの起動とかストップは動きましたが、パッケージとして管理してないgunicornは動かなかったということですね。

とりあえず、これでコマンド一発でサーバーの環境構築とデプロイが済みます
iOS10から位置情報取得にはHTTPS必須？

[追記]
HTTP で geolocation の位置情報が取得できないのは、ブラウザの仕様みたいですね。
iphone 以外の chrome では既にその仕様になっているようです。

ios10 safari がその仕様に沿うようになったということだと思います。

----

Google Maps Geocoding API を使って現在地からスポットを探す機能を実装しています。

上記APIには、現在地の緯度経度を取得する
```navigator.geolocation.getCurrentPosition(successCallback(), errorCallback())``` 
という関数が用意されています。
この関数は、位置情報取得に成功した場合に第一引数を、失敗した場合に第二引数をコールバックして実行します。

**iOS10** にアップデートしたテスト機で API を触っていると、エラーコード "POSITION_UNAVAILABLE" で失敗する現象に出くわしました。

原因は、HTTPS(SSL)通信が完全では無かったことです。

- HTTPで読み込んでいるリソース(画像/広告)があった
- 開発環境で証明書が効いてなかった

ATSによってアプリがHTTPS必須になることは警戒していましたが、
今後、広い分野でHTTPSの制約が出てきそうですね。
今秋までにフルSSLを決意した一日でした。

私自身の知識不足と、今の時代にHTTPを使っていること自体..、
ということは置いといて、
この記事が同じことでハマる人のためになれば幸いです。
※iOS10のリリースは2016秋？
生年月日から年齢を算出する数式


# 数式オプション
>  数式の戻り値のデータ型：数値
> 小数点の位置：0
> ## 高度な数式
> ```
> 年齢(数値) = FLOOR(( Today() - Birthday__c - ( ( year(Today()) - year(Birthday__c) ) / 4 ) ) / 365 )
> ```
`
> ※ Birthday__c は日付型のカスタム項目(生年月日登録用)
`
reset.cssとnormalize.cssの違い(リセットCSSとノーマライズCSS)

cssを記述し始める時に読み込むこの2種類ですが、
違いがよくわかってないで読み込んでる人も多いと思います！


##リセットCSS

マージンやパディングなどの値を一旦全て0にしてしまう。
その後、改めて自身記述していく。


##ノーマライズCSS

ブラウザごとに異なる部分を補正する。
webpackをなんかかっこよくする

## Before
![スクリーンショット 2016-08-16 16.40.33.png](https://qiita-image-store.s3.amazonaws.com/0/24135/d8bc16dd-0adb-127f-2f5e-3ab8e89f32ef.png)


## [webpack-dashboard](https://github.com/FormidableLabs/webpack-dashboard)

- (既にwebpackが使える環境があることが前提です)
- `npm install -D webpack-dashboard` (執筆時v0.1.6)
- webpack.config.js等に下記を追加

```js
// webpack.config.js
var DashboardPlugin = require('webpack-dashboard/plugin');

plugins: [
  new DashboardPlugin()
], 


// package.json
"scripts": {
  // 元のコマンドの先頭に `webpack-dashboard --` を追加
  // "watch": "webpack -d --watch"
  // "start": "webpack-dev-server -d --hot --inline"
  "watch": "webpack-dashboard -- webpack -d --watch",
  "start": "webpack-dashboard -- webpack-dev-server -d --hot --inline",
}

```


## After
![スクリーンショット 2016-08-16 16.41.37.png](https://qiita-image-store.s3.amazonaws.com/0/24135/7b7de305-b442-7456-05a4-30384a3a09a9.png)
SES経由のメール送信で554 Message rejected: Email address is not verified. と言われました。

RailsでSES経由でメールを送信しようとしています。Deviseからメールアドレス認証メールの送信です。

# メール送信でエラー
deviseのユーザー登録画面で、`http://localhost:3000/users/sign_up`からメールアドレスを入れてsubmitします。

```rb:メール送信でエラー
Net::SMTPFatalError in Users::RegistrationsController#create

554 Message rejected: Email address is not verified. The following identities failed the check in region US-WEST-2: please-change-me-at-config-initializers-devise@example.com
```
メールアドレスをverifiedしてないと言われます。
あれオカシイなーSESの画面からは送信できたのですが。。とおもったらconfig-initializers-deviseと書いてあります。

# devise.rbのconfig.mailer_senderを指定
`config/initializers/devise.rb`を確認すると`please-change-me-at-config-initializers-devise@example.com`というところがあったので変更します。

```rb:送信メールアドレスを指定
# こうなっているのを
config.mailer_sender = 'please-change-me-at-config-initializers-devise@example.com'
# こっちに変更
config.mailer_sender = '送信したいメールアドレス'
```
SESで認証済みのメールアドレスに変更しました。

# 再度メール送信
今度はメールが送信できました(☝ ՞ਊ ՞)
Docker内からGridEngineへ--net=hostなしでジョブを投げられるようにするには

# 概要

***--net=host*** を使わないでなげられるか知りたかった

# 結論

できた

```
--hostname=GridEngineのmasterが動いているホストが認識できるFQDN
```

実際に試した時は、dockerを動かしているホストの名前を渡したら、ジョブは投げられた

# 注意点

これを実際運用で使ってよいかは管理者によく相談すること。
dockerが動いているホストや、
dockerコンテナに対して、外からの接続がある場合とか。

# 調べたこと

```
--hostname=ホスト名のみ
```

これだとダメだった。

# 調べてないこと

dockerがうごいているホストではないホストをなのったらどうなるかは調べていない
EventEmitter


[【祝！リニューアル】カヤック 新コーポレートサイト、5種類テーマ切り替えの裏側！【フロントエンド芸】](http://tech.kayac.com/archive/kayac_site_renewal.html)

こちらの記事を実際に動かしてみた

bodyのdata属性を書き換えて、同時に任意の関数（アニメーション等）を実行したいというシーン


```html:3種類のページテーマ
<div class="btn" data-design="mountain">mountain (green)</div>
<div class="btn" data-design="seaside">seaside (blue)</div>
<div class="btn" data-design="city">city (gray)</div>
```


```javascript:DesignManager.js
import $ from 'jquery';
import EventEmitter from 'events';

const DATA_DESIGN = 'data-design';

export default class DesignManager extends EventEmitter {
    constructor() {
        super();
        this.currentDesign = null;
        this.EVENT = {
            CHANGE: 'change'
        };
    }

    setDesign (nextDesign) {
        const currentDesign = this.currentDesign;

        if (nextDesign === currentDesign) {
            return;
        }

        $('body').attr(DATA_DESIGN, nextDesign);
        this.currentDesign = nextDesign;

		// 第二引数に遷移前と後の情報をもたせることで、
		// listen先でより詳細な分岐ができる
        this.emit(this.EVENT.CHANGE, {
            from: currentDesign,
            to: nextDesign
        });
    }
}
```

```javascript:script.js
import $ from 'jquery';
import DesignManager  from './DesignManager';

const DESIGN_NAME = 'mountain';
const designManager = new DesignManager();
designManager.on(designManager.EVENT.CHANGE, e => {
    console.log(e);
    // ページごとに分岐させる
    if (e.to === DESIGN_NAME ) {
      alert('to : mountainページへ移動');
    } else if (e.from === DESIGN_NAME ) {
      alert('from : mountainページを離脱');
    }
})

const $btn = $('.btn');
$btn.eq(0).on('click', () => {
    designManager.setDesign('mountain');
})
$btn.eq(1).on('click', () => {
    designManager.setDesign('seaside');
})
$btn.eq(2).on('click', () => {
    designManager.setDesign('city');
})
```

> 参考
https://nodejs.org/api/events.html
Elasticache for Redisを使っていたらサービスが固まった件

# 事象

ソーシャルサービスを運用して1年くらいになるのですが、ある日突然デザイナから
「なんかサービス遅くないですか？」と言われサイトを開くとすこぶる遅い！

アプリケーションを調べているとEC2からElasticacheへのアクセスでタイムアウトが
起きていることが分かりました。

そいでCloudWatchでメトリクスを見ているとプライマリサーバが
SwapUsage の値が急激に増加していることが確認出来ました。

しかーし、とにかくそういったものはAWSに任せて突き進んできたものですから
どーしよ、どーしよとなっていたところセカンダリサーバがプライマリに昇格して
復旧となりました。この間、30分ほどです。

# 原因

- reserved-memoryを設定していなかったこと

上記が原因でした。
これを設定しないとインスタンスのメモリをRedisですべて使い切ってしまう(maxmemory=reserved-memory)ようで、

ちゃんとRedis以外のメモリも確保していなかったので結果、スワップが発生する状態になっていました。

# reserved-memoryの設定値

安全値としては 50% 程度（メモリ空間 maxmemory の半分程度）を設定頂くことで、BGSAVE による影響をほぼ回避できることが分かっているようです。

ちなみに私はRedisのversionが2.8.19だったのですが、2.8.22 以降のバージョンを利用している場合、目安としてメモリ空間 maxmemory の 20-30% 程度を設定頂くのが安全値だそうです。

[AWSユーザガイド](http://docs.aws.amazon.com/ja_jp/AmazonElastiCache/latest/UserGuide/BestPractices.html)

# まとめ

なんだかんだでも30分で自動で復旧してくれる。やっぱフルマネージドいい！って思ったと同時に
フルマネージドだからといってもしっかりユーザガイドを見て分かっておくことが重要ですね。

これは言い訳なのですが、私の会社では開発部とインフラ部が分かれており、
AWSの設定はすべてインフラ部がやることなので開発部がコンソールに触れることはあまりありません。
ですが、AWS使ってるんだからサービス側がもっとその領域に踏み込んでいくべきだと痛感しました。

私たちのように専業していてはAWSを使うメリットが消えてしまうように思うし、
かといって会社がある程度大きいと専業してしまいがちです。

ほかの会社さんがどのようにAWSを管理しているか気になりますね。
Unity ゲームオブジェクトから見た移動

私的メモ。

#キー入力でゲームオブジェクトを相対的に移動したい時、つまり、上下キーで前後に移動し左右キーで左右に方向を変えたい時

transform.Translate()やtransform.Rotate()を使う。

###移動
《Transform》.Tanslate( X値 , Y値 , Z値 );
《Transform》.Tanslate( X値 , Y値 , Z値 , 《Space》);
《Transform》.Tanslate(《Vector3》);

###回転
《Transform》.Rotate( X値 , Y値 , Z値 );
《Transform》.Rotate( X値 , Y値 , Z値 , 《Space》);
《Transform》.Rotate(《Vector3》);

Vector3インスタンスとしてはtransform.upとtransform.rightも使える。

transform.up ゲームオブジェクトが１だけ前に進む方向を示すVector3インスタンス。
transform.right ゲームオブジェクトが１だけ右に移動する方向を示すVector3インスタンス。

後や左にするには負の値をかければ良い。

###キー入力
Input.GetKey(キーの指定)で真偽値を得る。指定されたキーと入力が一致すればtrue、そうでなければfalseを返す。

キーの指定にはKeyCodeに用意されている値を使う。
http://docs.unity3d.com/ja/current/ScriptReference/KeyCode.html

#サンプル

```
using UnityEngine;
using System.Collections;

public class myscript : MonoBehaviour {

	void Update () {
		if (Input.GetKey (KeyCode.UpArrow))
			this.transform.Translate (this.transform.up * 0.1f);	
		if (Input.GetKey (KeyCode.DownArrow))
			this.transform.Translate (this.transform.up * -0.1f);
		if (Input.GetKey (KeyCode.RightArrow))
			this.transform.Rotate (new Vector3(0, 0, -1f));
		if (Input.GetKey (KeyCode.LeftArrow))
			this.transform.Rotate (new Vector3(0, 0, 1f));
	}
}
```

普通にxyz指定してもよい。

```
using UnityEngine;
using System.Collections;

public class myscript : MonoBehaviour {

	void Update () {
		if (Input.GetKey (KeyCode.UpArrow))
			this.transform.Translate (0, 0.1f, 0);	
		if (Input.GetKey (KeyCode.DownArrow))
			this.transform.Translate (0, -0.1f, 0);
		if (Input.GetKey (KeyCode.RightArrow))
			this.transform.Rotate (0, 0, -1f);
		if (Input.GetKey (KeyCode.LeftArrow))
			this.transform.Rotate (0, 0, 1f);
	}
}
```

参考
http://libro.tuyano.com/index2?id=11166003
TypeScript + SystemJS + lite-serverでさくっとHello, World!する


Angular2のチュートリアルをやり、tscとSystemJSの組み合わせは、TypeScriptで実験的なコードを書くには良いと感じた。

なるだけ最小構成で動かすために試したらこうなったので、メモとして残しておきます。

# 環境構築

## とりま npm init

```
mkdir ts-sample
cd ts-sample
npm init -y
```

実験なので、-yで色々スキップ。

gitで管理する際には、package.jsonのrepository周りの情報が埋まるので先に git init を走らせておくのがよさ気。

## 必要なパッケージを追加する

```
npm i lite-server typescript typings concurrently --save-dev
npm i systemjs --save
```

※執筆時点でのバージョンは以下

```
  "devDependencies": {
    "concurrently": "^2.2.0",
    "lite-server": "^2.2.2",
    "typescript": "^1.8.10"
  },
  "dependencies": {
    "systemjs": "^0.19.36"
  }
```

## SystemJSの設定

systemjsの設定ファイルを追加

```
touch systemjs.config.js
```

```systemjs.config.js
System.config({
    baseURL: '/',
    transpiler: false,
    map: {
        'app': 'src/app' // dist
    },
    packages: {
        'app': { main: 'index.js' , defaultExtension: 'js' }
    }
});
```

## TSCの設定

```
$(npm bin)/tsc --init
```

# ファイル追加

## TypeScriptファイルを追加

せっかくモジュールローダーを使っているので、2ファイル作る

```
mkdir src
cd src
touch index.ts hello.ts
```

```index.ts
import { Hello } from './hello';

const hello = new Hello();
document.body.innerHTML = hello.message();
```

```hello.ts
export class Hello {
    public message() {
        return 'hello, world!!';
    }
}
```

## index.htmlを追加

```index.html
<!DOCTYPE html>
<html>
    <head>
        <title>sample!?</title>
    </head>
    <body>
        <script src="./node_modules/systemjs/dist/system.src.js"></script>
        <script src="./systemjs.config.js"></script>
        <script>
            System.import('app');
        </script>
    </body>
</html>
```

読み込むのがsystemjs関係のみというのがシンプルで良い感じ

# 動かす

## package.jsonにscriptを書く

```package.json
...
"scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "tsc && concurrently \"tsc -w\" \"lite-server\" "
  },
...
```

消耗するので、実験レベルだとタスクランナー使いたくない派

## hello, world!

npm run start

をすると、ブラウザが立ち上がり hello, world!!が表示されるはずです。

この状態で、hello, world!!を弄ると、ブラウザに変更が反映されます。
ざっくり仕組みとしては、

- lite-server が *.js ファイルの変更を監視
- tsc が *.ts ファイルの監視

を行っており、tsファイルをいじるとそれぞれが連動してブラウザに変更が反映されます。イイネ！

# まとめ
あんまりさくっとじゃなかった

## （参考）ディレクトリ構成

```
├── index.html
├── node_modules
├── package.json
├── src
│   ├── hello.js
│   ├── hello.ts
│   ├── index.js
│   └── index.ts
├── systemjs.config.js
├── tsconfig.json
└── typings.json
```
いつも探すワンライナーたち

#■３秒おきにdf 
 while true; do df -m; sleep 3; done

#■stateにtime_waitのものがあったら、TCPポート不足
netstat -nato

#■tracerouteで最後 **** となったら経路に問題あり。
traceroute -n  192.168.1.23

#■プロセス表示

`[root@]# ps -ae -o pid,pcpu,rss,time,cmd`
PID %CPU   RSS     TIME CMD
1  0.0   288 00:00:00 /sbin/init
2  0.0     0 00:00:00 [kthreadd]
3  0.0     0 00:00:00 [migration/0]

pid プロセスID

pcpc CPU利用率

rss メモリ使用量

time CPU時間

cmd コマンド名

#■Listenプロセス
netstat -tlnp

ss -ta // TCPかつ接続待ちを含め表示
netstat -l // 接続待ちの表示
netstat -an　// ポートを表示しつつ一覧
netstat -s  // 統計情報
Tcp:
    0 active connections openings
    48 passive connection openings	
    0 failed connection attempts  // 接続失敗数
    1 connection resets received
    6 connections established // 現在のコネクション数
    3470 segments received	// 受信したセグメント（TCPにおける1回のデータ送信単位）の総数
    3427 segments send out
    0 segments retransmited
    0 bad segments received.
    0 resets sent


#■CPU使用率の高い順に

`[root@]# ps -ae -o pid,pcpu,rss,time,cmd | sort -nr -k 2`

#■メモリ使用率の高い順に

`[root@]# ps aux --sort=-rss`
// STAT列に注目
// R : CPU利用中、D：ディスクIO待ち、S：自発的SLEEP、Z：ゾンビ状態（親待ち）

#■/var/www/html以下を容量の大きい順にMB単位表示

`[root@]#  du -sm /var/www/html/* | sort -nr

#■httpdのプロセス数をカウント

`[root@]# ps -aef | grep httpd | grep -v grep | wc -l`

#■httpd(SSL)のコネクション数をカウント

`[root@]# netstat -an | grep ESTABLISHED | grep :443 | wc -l`

#■Listenしているポートを確認
`[root@]# netstat -tanp | grep LISTEN`

#■Apacheログから特定日付のアクセス上位５までのIPアドレス
`zgrep "02/Apr" /var/log/access.log.gz | awk '{print $1}' | sort | uniq -c | sort -r | head -n 5`
※ zgrepを使うことでgzファイルに対してgrepできる

#■不正アタックと思われる上位10のユーザー名
`grep "sshd.*Invalid user" /var/log/secure | awk '{print $8}' | sort | uniq -c | sort -r | head -n 10`

#■各ユーザーのホームディレクトリごとの容量を表示
`du -hs /home/*`

#■wokrフォルダから５０KB以上のJPGファイルを探す
find /work -size +50k -name "*.jpg"


#■コミットを打ち消す
`git revert [commit]`

#■コミットを削除する
`git reset --hard`

⇒resetはコミットを無くす、revertはコミットを打ち消す。
運用ではrevertを推奨。

#■コミットを選んでマージ
`git cherry-pick [commit]`

#■一旦変更したものを逃がすにはstash
`git stash save 'とりあえず'`
`git stash list `

#■競合を確認
`git status -s`
Spring Tool Suiteのインストールと日本語化

## Pleiades適用について
更新せずに2年程ほったらかしててすみません。
検索結果の上のほうに出てきてしまっているようなのですが、
2018年5月現在、setup.exeを叩くだけで簡単に導入できるようになっているみたいです。
https://qiita.com/andna0410/items/e9cc07c9e2e34a542245


## はじめに
Spring使って開発演習するからインストールしてねって言われたのでよくわからず適当にインストール。
STSのインストールは簡単ですが、日本語化するのに少し手間取ったので、メモ程度に書き残しておきます。
STS.iniが罠すぎた。

## 環境
* Windows7 (64bit)

## STSダウンロードとインストール
### ダウンロード
ここから最新版をおとす。
https://spring.io/tools

* 現時点バージョン：3.8.1.RELEASE

### インストール
落としてきたzipファイルを解凍する。
→ "sts-bundle"というファイルができる。

### 起動
草っぽいアイコンのexeを起動
sts-bundle\sts-3.8.1.RELEASE\STS.exe

## 日本語化
### Pleiadesダウンロード
おなじみのところから。
http://mergedoc.osdn.jp/

All in Oneではなくて、プラグイン本体のみ落とす。
「Pleiades プラグイン・ダウンロード」→「安定版」→「pleiades_X.X.X.zip」

解凍ソフトではエラーが発生することがあるので、Windows標準の解凍ソフトで解凍。
ちなみに、関連付けされててできない(怒)って方は、
1. zipファイル右クリック
2. プログラムから開く
3. エクスプローラー
4. ファイルをすべて展開（タブのところにあるやつ）
### Pleiadesインストール
"readme_pleiades.txt"を見つつ進める。

1. 解凍したファイルのplugins、featuresフォルダに入っている
"jp.sourceforge.mergedoc.pleiades"フォルダをそれぞれ
　\sts-bundle\sts-3.8.1.RELEASE\plugins
　\sts-bundle\sts-3.8.1.RELEASE\features
にコピーして追加する。
  
2. STS.iniの最終行に以下の2行を追加。

```
     -Xverify:none
     -javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

**`-Xverify:none`については、中ほどに最初から記述されているので消して、改めて下に2行追加します。**

```text:こんな感じ
-startup
plugins/org.eclipse.equinox.launcher_1.3.200.v20160318-1642.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.400.v20160518-1444
-product
org.springsource.sts.ide
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.8
-Xms40m
-Dorg.eclipse.swt.browser.IEVersion=10001
-Xmx1200m
-Xverify:none
-javaagent:plugins/jp.sourceforge.mergedoc.pleiades/pleiades.jar
```

### Pleiades起動
初回起動は-cleanで起動します。それ以降は普通にSTS.exeから。

1. 「pleiades_X.X.X.zip」を解凍した中に入っている  
"eclipse.exe -clean.cmd"  をSTS.exeと同じディレクトリにおきます。
2. "eclipse.exe -clean.cmd"を右クリックで編集
3. eclipse.exeをSTS.exeに書き換えて保存。
4. "eclipse.exe -clean.cmd"をダブルクリックで実行

めでたしめでたし。
cmderやConEmu で MINGW64 な msys2 を使う

cmderやConEmu で MINGW64 な msys2 を使いたい。

- https://conemu.github.io/en/CygwinMsysConnector.html

```
set MSYSTEM=MINGW64 & "C:\msys64\usr\bin\bash.exe" --login -i
```

を指定して起動する。msys2 は起動時に MSYSTEM を見て挙動が変わるので、set で環境変数としてしていしてやればおｋ。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/5330/2c4b00d9-2e94-87a9-b67a-54b521faccd4.png)
ボトルネック判断をする時に知っておきたいこと



#■CPUのボトルネック

vmstat -n 2 
⇒２秒おきに更新

﻿![スクリーンショット 2016-08-16 15.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/102281/e6c06ec7-e795-967b-fcab-a8d0f8516e22.png)

r列　CPU処理待ち。ここが溜まりだすと体感として遅く感じる。だいたいus,syの値も高くなる。
b列　ブロック中。ファイルIOが多い場合に発生しページングが発生している可能性がある。

us+sy = 80〜90%ならCPUがボトルネックの可能性大

us（ユーザプロセス）が高い場合は、CPU負荷の高いアプリケーションが動いてないか

sy（カーネル処理）が高い場合は、ディスクIOやネットワーク通信に伴う処理の負荷

※CPU利用率(us+sy)が高くても、CPU待ち(proc r)が少ない場合は、体感速度的には、遅く感じないはず。

※下記単位は、Kバイト
free 空きメモリの容量
buff バッファに利用されているメモリ量
cache キャッシュに利用されているメモリ量
 

#■ディスクIO

wa(IO待ち時間)　、　procs b（IO待ちプロセス）が高い場合はディスクIOがボトルネックの可能性大


 

#■メモリ使用量

free -m
⇒　単位をメガで表示

![スクリーンショット 2016-08-16 15.18.04.png](https://qiita-image-store.s3.amazonaws.com/0/102281/422ac251-7dbb-4f67-ff87-b13865ed7d0d.png)

ディスクキャッシュは、必要なたびに適宜開放されるので、

ディスクキャッシュ分も空きメモリとして計算してよい。

- ディスクキャッシュの強制開放するコマンド

echo 3 > /proc/sys/vm/drop_caches

その上で、freeコマンドで確認する。

スワップイン/スワップアウトの値を確認する。

- IOの根深いキャッシュ：デントリーキャッシュの確認と削除

slabtop -o | grep dentry
56939140 56939107  24%    0.19K 2846957       20  11387828K dentry

echo 2 > /proc/sys/vm/drop_caches	
※カーネルでもつファイル参照やフォルダ参照のキャッシュのこと

#■プロセスの確認

・topコマンドを使った分析

top -b -n 10 -d 60 > output.txt

※60秒間隔で１０回分の出力をファイルに書き出す

・HTTPコネクション数のカウント
netstat -an |grep ESTABLISHED | grep :80 | wc -l

・HTTPプロセス数のカウント
ps -aef | grep httpd | grep -v grep | wc -l

・PHPプロセス数のカウント
 ps aux | grep php | awk '{sum += $6}END{print sum}'

・Nginxプロセス数のカウント
 ps aux | grep nginx | awk '{sum += $6}END{print sum}'


・MySQLプロセスが利用しているメモリ
ps aux | grep mysqld | awk '{sum += $6}END{print sum}'

・CPU使用率の高い順
ps -ae -o pid,pcpu,rss,time,cmd --sort=-pcpu
（プロセスID、CPU利用率、メモリ利用率、CPU時間、コマンド名）


★こちらも
http://qiita.com/yuse/items/1d398b34b812d5505aae
プロジェクトの炎上を何かのせいにしない

# 炎上プロジェクトで聞こえる言葉

炎上プロジェクトでよく聞かれることばがありますよね。

* 工期が短い
* 人が足りない
* 品質が悪い
* 他のプロジェクトに人を回したせい
* 他のプロジェクトが遅れているせいで人員の確保が遅れたから
* 仕様が定まらない
* 設計資料をつくる時間がない
* テストする時間がない
* 誰かの担当だから自分は知らない
* そんな話し聞いていない
* 使ったことがないフレームワークだから
* etc、、、

これらは全て誰かのせいにしたり、何かのせいにしたり、とにかく自分のせいにしないような言葉ばかりです。わたしだって口に出してしまうこともあります。
しかし、問題を外に向けていては何も変わりません。
組織やプロジェクトで活動している以上、自分の問題として捉えて打破していかないと何も変わりません。

# 折れない心構えをつくろう

誰かや、組織や、環境といった他のせいにすることは「アウトサイド・イン」のアプローチとなります。どのような状況であれ、自分自身の問題や、自分自身に出来ることはないか、自分が変化することで状況を変えることが出来ないか、そう考えるのが「インサイド・アウト」のアプローチです。
自分から、仕事のプロセスを変えていこうとか、組織の文化や風習を変えていこう、という位の気構えを持ちましょう。
字串合併 (String Appending) - Swift 3 調整記

Xcode 8 beta 6 出來了，
Swift 改了一個 String 中我很想要它被改掉的東西

就是 `append` 

這個 method

## 準備

先準備一個字串物件

``` swift
var priceString = "售價： "
```

現在想要讓他變成

> 售價： 100

所以現在要在後面加上 `100` 這個字串。

這個範例直接在 Xcode 裡面的 playground 執行即可。

## Before

（這一段是在 Xcode 7.3.1 中的 playground 執行）

假如我現在有個固定的字串，需要在後面加上另外一個字串，我在 Swift 2.x 之前要這樣寫：

``` swift
priceString.append("100" as UnicodeScalar)
```

如果照直覺寫這樣：

``` swift
priceString.append("100")
```

Xcode 原先會抱怨說

> Ambiguous use of 'append'

畢竟原本的 append 需要塞入一個 `UnicodeScalar` 的物件，而不是 `String` 物件
不然就是要用更長的一個方法：

``` swift
priceString.appendContentsOf("100")
```

嘶 ... 好長好囉唆，
所以一碰到要組合字串都會覺得不漂亮、很麻煩。

如果有寫過其他語言（如 Ruby）
就會覺得這麼長根本不合理。

## After

(這一段是在 Xcode 8 beta 6 中的 playground 執行）

這時候，簡化多了，也比較合理：

``` swift
priceString.append("100")
```

就這樣就好，也不需要轉型，
已經可以直接稼接上一個字串物件。

乾淨而且直覺、合理、易讀多了。
マルコフ確率場上で反復条件付きモードによるノイズ除去を組んでみる(Python)

#反復条件付きモードとは
反復条件付きモードはICMともよばれ，マルコフ確率場上で各ノードの状態を順番に変更しながら，ノード全体の状態を最適化するためのアルゴリズムです．しかしこのアルゴリズムはノード毎に勾配法を適用するだけなので，大域解に収束せず局所解しか求められません．

#使用データ
![使用データ.png](https://qiita-image-store.s3.amazonaws.com/0/66915/ccd39d3b-6c7c-6d5b-6a1e-be53f149f1e1.png)

#ソースコード解説
<p>大まかな流れは，各ノードにおいて，そのノードがとりうる状態全てについてエネルギーを求めてあげます．このエネルギーはそのノードがどの状態をとるべきかの度合いを表し，各ノードはエネルギーが最も低くなる状態をとります．</p>

<p>まずreference変数にノイズ画像をコピーします．これがノードの状態になります．次に各ノードについて隣接するノードの状態を調べながら自分がどの状態をとるべきかのエネルギーを以下の様に計算します．</p>

```python:
for i in range(1, height - 1):
    for j in range(1, width - 1):
        for k in range(len(dy)):
                    
            #近傍のノードの状態を考慮する
            if reference[i+dy[k],j+dx[k]] == 1:
               prob1[i,j] -= beta
               prob0[i,j] += beta
            else:
               prob1[i,j] += beta
               prob0[i,j] -= beta
```

<p>次に観測値(ノイズ画像)のみを考慮して各ノードがどの値をとるべきかのエネルギーを計算してあげます．それが以下になります．</p>

```python:
prob1[image == 1] -= alpha
prob0[image == 0] -= alpha
```

<p>ソースコード全体は以下の様になります．</p>

```python:
#encoding:utf-8
import numpy as np
import cv2
import matplotlib.pyplot as plt
from skimage.filters import threshold_otsu

def MRF(image):
    iter = 30
    height, width = image.shape
    dy = [-1,-1,-1,0,0,1,1,1]
    dx = [-1,0,1,-1,1,-1,0,1]
    reference = np.copy(image)
    alpha = 2.5
    beta = 4.0

    for t in range(iter):
        print(t)

        prob0 = np.zeros(reference.shape)
        prob1 = np.zeros(reference.shape)

        for i in range(1, height - 1):
            for j in range(1, width - 1):
                for k in range(len(dy)):
                    
                    #近傍のノードの状態を考慮する
                    if reference[i+dy[k],j+dx[k]] == 1:
                        prob1[i,j] -= beta
                        prob0[i,j] += beta
                    else:
                        prob1[i,j] += beta
                        prob0[i,j] -= beta
        
        #観測値を考慮する
        prob1[image == 1] -= alpha
        prob0[image == 0] -= alpha

        reference[prob1 > prob0] = 0
        reference[prob1 < prob0] = 1

    return reference


def addNoise(image):
    output = np.copy(image)
    flags  = np.random.binomial(n=1, p=0.05, size=image.shape)

    for i in range(image.shape[0]):
        for j in range(image.shape[1]):
            if flags[i,j]:
                output[i,j] = not(output[i,j])

    return output

def main():
    image = cv2.imread("Lenna.png", 0)
    binary = image > threshold_otsu(image)
    noise = addNoise(binary.astype(np.int))
    denoise = MRF(noise)

    plt.gray()
    plt.subplot(131)
    plt.imshow(image)
    plt.subplot(132)
    plt.imshow(noise)
    plt.subplot(133)
    plt.imshow(denoise)
    plt.show()

if __name__ == '__main__':
    main()
```

#実行結果
![実行結果.png](https://qiita-image-store.s3.amazonaws.com/0/66915/53e3a74b-6b4f-485e-c026-8ceb7ea8d61a.png)

<p>確かにノイズが除去されています．ＩＣＭは非常に簡単に組めるのでマルコフ確率場の入門にはお勧めです．</p>
EC2 インスタンスに対して kitchen converge しようとしたら The key pair **** does not exist エラー

# 問題の事象

```shell-session
$ bundle exec kitchen converge foo-bar
-----> Starting Kitchen (v1.3.1)
-----> Creating <foo-bar>...
       Creating <>...
       If you are not using an account that qualifies under the AWS
       free-tier, you may be charged to run these suites. The charge
       should be minimal, but neither Test Kitchen nor its maintainers
       are responsible for your incurred costs.
>>>>>> Create failed on instance <foo-bar>.
>>>>>> Please see .kitchen/logs/foo-bar.log for more details
>>>>>> ------Exception-------
>>>>>> Class: Kitchen::ActionFailed
>>>>>> Message: The key pair 'negito6' does not exist
```

# 解決

キーペアの Region 間違えてた。

キーペアの作り方: http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-key-pairs.html (リージョン選べってちゃんと書いてある)
vuex と vue-router の共存について

初学者ゆえなのか、vuex と vue-router を共存させる記述が分からなくて半日費やしてしまったので備忘録。

## サンプル
検索していたら見つけたIssueに、色々アドバイスが書いてあった。
https://github.com/vuejs/vuex/issues/11

ここの内容を基にサンプルを作成してみた。ルーティングは `route-config.js` として別ファイルに定義するようにしてみた。

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>SAMPLE APP</title>
  </head>
  <body>

    <div id="app"></div>

  </body>
</html>
```

```js:main.js
import Vue from 'vue'
import VueRouter from 'vue-router'
import App from './App'
import { configRouter } from './route-config'

Vue.use(VueRouter)

const router = new VueRouter({
  history: true,
  saveScrollPosition: true
})

configRouter(router)

router.start(App, '#app')
```

```js:App.vue
<template>
  <div>
    <a v-link="{ path: '/post' }">Go to Post</a>
    <router-view></router-view>
  </div>
</template>

<script>
  import store from './vuex/store'
  export default {
    name: 'App',
    store: store
  }
</script>
```

```js:route-config.js
import Post from './components/Post'

export function configRouter (router) {
  router.map({
    '/post': {
      component: Post
    }
  })
}
```

## vuex-router-sync
さっきのIssueページの中のコメントにも書いてあるけど、簡単にvuexとvue-routerを使えるようにしてくれるこんな物もあるみたい。後で試す。
https://github.com/vuejs/vuex-router-sync

vuex-router-syncのボイラープレートを書いてくれている人がいるので、サンプルを見てみると使い方が良く分かると思う。
https://github.com/funkyLover/vue-boilerplate
開発環境に PostgreSQL インストール


セキュリティ等考慮されていないので注意

参考: [CentOS 7 : PostgreSQL : インストール ： Server World](https://www.server-world.info/query?os=CentOS_7&p=postgresql)


## インストール&セットアップ

```
$ sudo yum install postgresql-server

$ sudo postgresql-setup initdb
```

## 起動

```
$ sudo systemctl start postgresql
```

## 状態確認

```
$ sudo systemctl status postgresql
```

## 設定ファイル

/var/lib/pgsql/data/pg_hba.conf を開き 以下のように trust を設定（ローカル開発用のためtrust 公開されているサーバでこれやっちゃダメ）

```
# "local" is for Unix domain socket connections only
local   all             all                                     trust
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
# IPv6 local connections:
host    all             all             ::1/128                 trust
```

参考 http://www.dbonline.jp/postgresql/ini/index2.html

変更したら再起動

```
$ sudo systemctl restart postgresql
```

## 接続

```
$ psql -h localhost -p 5432 -U postgres
```

で接続できたらOK


## 停止

```
$ sudo systemctl stop postgresql
```
ScalaのJson Parserを「spray-json」に変えたら処理速度が36倍になった話



仕事でEMR+Sparkを使って、いろいろなサービスが出すfluentdのログを整形していた時に、jsonのパースを変えたら処理速度が６時間→10分になった話

Jsonパーサーを変えようと思ったきっかけ
---

https://aws.amazon.com/jp/about-aws/whats-new/2016/08/amazon-emr-release-5-0-now-available-apache-spark-2-0-hive-2-1-enhanced-debugging-and-more/

sparkが2.0.0になったので、scala2.10.xで組んでたやつをこの際に2.11.xにあげるか！というノリ

scala2.10.x → 2.11の乗り換えで
scala.util.parsing.jsonがdeprecatedになってしまうので、変えないとまずくなってしまった故


Jsonパーサー
---

* 改善前
	* scalaにデフォルトで用意されているパーサー http://www.scala-lang.org/api/2.7.6/scala/util/parsing/json/JSON$object.html

* 改善後
	* https://github.com/spray/spray-json

#### 結果、6時間かかっていたものが10分に短縮

環境的にはどちらもc4.x2largeをマスター、コア、タスク合わせて6台利用してました＠EMR


導入方法（おまけ）
---

* build.sbtへ追記

~~~
libraryDependencies ++= Seq(
  "io.spray" %%  "spray-json" % "1.2.6"
)
~~~

* マッピングクラス、パーサークラスの準備


~~~
class Mapping(
	val hoge : String
	.......
	......
	...
)
~~~


~~~
object MappingProtocol {
	implicit object  MappingJsonFormat extends RootJsonFormat[Mapping] {
	
	override def read(json: JsValue): Mapping = {
		...
		new Mapping
	
	}
	
	override def write(obj: Mapping): JsValue = {
		JsObject( ... )
	
	}

}
~~~

処理

~~~
import spray.json._
import さきほど準備したやつ

val json = """適当なjson"""
val jsonP = json.parseJson
val jsonC = jsonP.convertTo[Mapping]

~~~

2016/08/17 追記
---

@xuwei_k さんのご指摘でそもそも標準のパーサーは使っちゃいけないみたいです。他のものを使いましょう（戒め）
Mac:「Digital Color Meter」と「ズーム機能」

OS X El Capitan（10.11.6）を使用しております。

無くても困りませんが、覚えておくとちょっと便利。
iOSアプリ作成時（シミュレータ上）などちょっと色、細かい表示確認など調べたい場合、いちいちペイントツールなど立ちあげなくても簡単に。
アプリの場所とか忘れてしまうので覚書として。


[アプリケーション]→[ユーティリティ]の中にある
Digtal Color Meter
<img width="192" alt="スクリーンショット 2016-08-16 11.52.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/120102/689ae8cf-f72a-2376-31f2-c5674c745365.png">
マウスカーソルが指しているカラーを取得し、設定したフォーマットで色の値を表示します。
テキストでコピーもできるので色の確認や欲しい色の取得に使えます。
使用頻度が高いようであればDockに登録しておくのもよいかと思います。



[システム環境設定]→[アクセシビリティ]
のズーム機能
<img width="647" alt="スクリーンショット 2016-08-16 11.54.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/120102/8e8b1a4a-285f-b6b9-2275-496ea7661f98.png">
この設定だとoption+command+8でオン、オフ切り替えできます。
枠内の場所が拡大表示されます。
画面のスクリーンショットを撮ってペイントツールで拡大表示させなくても簡単に確認ができます。

この２つはちょっとした時に使えるのでいっしょに覚えておくとよいと思います。
【ES6】Three.jsテンプレ


REVISION: '78'

どうやって書くのがベストプラクティスなのだろうか？
複数シーンを追加するときとかどうすれば。。
シーンごとにクラスをつくるのか、もう少し細かく分けるべきな気がする。

デモ：http://codepen.io/mo4_9/pen/VjqRQX

```javascript:Sample.js
import './OrbitControls';

export default class Sample {

  constructor (opts = {}) {

    this.width = window.innerWidth;
    this.height = window.innerHeight;
    this.output = opts.output || document.createElement('div');

    this.init();
  }

  init () {
    { // renderer
      this.renderer = new THREE.WebGLRenderer({ antialias: true });
      this.renderer.setClearColor( 0x222222 ); // 背景色
      this.renderer.setPixelRatio(window.devicePixelRatio || 1);
      this.renderer.setSize( this.width, this.height );
      this.output.appendChild( this.renderer.domElement );
    }
    { // scene
      this.scene = new THREE.Scene();
    }
    { // lights
      this.light = new THREE.DirectionalLight(0xffffcc, 1);
      this.light.position.set(0,100,30);
      this.scene.add(this.light);
      const ambientLight = new THREE.AmbientLight(0xffaa55);
      this.scene.add(ambientLight);
    }
    { // camera
      const perscamera = new THREE.PerspectiveCamera( 45, this.width / this.height, 1, 10000 ); // fov(視野角),aspect,near,far
      const orthocamera = new THREE.OrthographicCamera( this.width / -2, this.width / 2, this.height / 2, this.height / -2, 1, 10000 );
      this.camera = perscamera;
      this.camera.position.set( 100, 100, 100 );
      this.camera.lookAt( this.scene.position );
    }
    { // helper
      const gridHelper = new THREE.GridHelper(200,50); // size, step
      this.scene.add(gridHelper);
      const axisHelper = new THREE.AxisHelper(200,50);
      this.scene.add(axisHelper);
      const lightHelper = new THREE.DirectionalLightHelper(this.light,20);
      this.scene.add(lightHelper);
    }
    { // controls
      this.controls = new THREE.OrbitControls(this.camera);
      this.controls.autoRotate = true;
    }
    { // cube
      const geometry = new THREE.CubeGeometry(20, 20, 20);
      const material = new THREE.MeshLambertMaterial({ color: 0xFBBC05 });
      const cube = new THREE.Mesh(geometry, material);
      this.scene.add(cube);
    }

    this.render();
    // メソッドをそのまま渡すと`not function`と怒られるので
    // 無名関数で囲って関数にする点に注意
    window.addEventListener('resize', () => {
        this.onResize();
    }, false);

  }

  render () {
    requestAnimationFrame( () => {
      this.render();
    });
    this.controls.update();
    this.renderer.render( this.scene, this.camera );
  }

  onResize () {
    this.camera.aspect = window.innerWidth / window.innerHeight;
    this.camera.updateProjectionMatrix();
    this.renderer.setSize( window.innerWidth, window.innerHeight );
  }

}
```

```javascript:script.js
import Sample from './Sample';

const sample = new Sample({
  output: document.getElementById('webgl-output')
});
```

> 参考
http://jsdo.it/shuuuuun/ywm2
Elasticsearch(2.3.5)のKibana(4.5.3)でTilemapが表示されないので直す


# エラー画面

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/59f9c0ca-7cb6-bb41-9aaf-294df356bf02.png)

# 環境
* Mac
* Elasticsearch: 2.3.5
* kibana: 4.5.1

2016/8/16現在でhomebrewで入れた

# 直し方

4.5.3以上を入れる. ただし、8レベルまでしかズームできないのでここまでが限界。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/4a0284d6-339b-69fc-d63b-114ff0c1e21b.png)


# 参考
* https://www.elastic.co/blog/kibana-4-5-3-and-4-1-10
距離計 > Link > HC-SR04 不具合 > Echoからの出力のH固定

HC-SR04に関する不具合の情報を見つけた。
http://diy.ease-labs.com/?page_id=8024

> 不具合の内容は、測定対象物が近すぎるか遠すぎるとEchoからの出力がハイに固定されてしまうということです。不具合が発生した場合、電源を切って入れなおすしか対処方法はないので、不具合が発生したら電源を切り、起動しなおすように改造します。

自分が遭遇している症状とはまた別の症状なのだろう。
http://qiita.com/7of9/items/0ecbe9a9b34c5ff2f9df

<hr>
(追記 2016/08/23)
スイッチサイエンスで不具合の情報が掲載されていた。
http://mag.switch-science.com/2015/07/23/hc-sr04_failure/

7月7日に秋月電子から購入したが、8月23日現在秋月のwebでは見当たらない。取り扱いをやめたのだろう。
http://akizukidenshi.com/catalog/c/cdistance_spop/
SocketIOをALBでロードバランスする


1. ALBでロードバランサを普通に作る
2. EC2→ロードバランサ→ターゲットグループ→属性の編集→ロードバランサーによって生成された Cookie の維持を有効化


![スクリーンショット 2016-08-16 12.48.22.png](https://qiita-image-store.s3.amazonaws.com/0/40221/e92ac802-c551-a033-d6ca-29f5508080b4.png "スクリーンショット 2016-08-16 12.48.22.png")

xhr-polling後upgradeされるようになります。
[CentOS6] [ハマった] ソースからコンパイルしたapacheをservice起動するとopensslのバージョンが上がらない

具体的に書きすぎることができないので、ふわっとした記事なっています。
ご覧になられた方、ごめんなさい。

こんな環境をメンテナンスすることになりました。
CentOS6
Aapacheソースコンパイルインストール
OpenSSLソースコンパイルインストール
当時の設定情報・・・なし。

とりあえず config.niceを引っ張り出して、SSLのパス指定がされていることを確認し、
どこを見ているか確認し、まずはopensslのコンパイル&インストール
openssl versionにてアップグレードの完了を確認

そのあとで、apacheをリコンパイルして、再起動。
https://www.ssllabs.com/ssltest/
にてシグネチャやら弱いところなんかを確認。
大丈夫。ちゃんとバージョン上がってる。

んで、OSのreboot

起動後にもう一度sslのテストをしてみたら・・・
あれ。前のバージョンに戻ってる。

再起動時には自作のapache起動スクリプトを /etc/initdに置いているので、LD_LIBRARY_PATHがどうなっているか確認。

```実行結果比較
コンソールから実行 => /usr/local/ssl/lib
service apacheから実行 => (ブランク)
```

ああ。そういうことでしたか。もうずっとyumでしか扱ってないと忘れるもので
ldconfig /usr/local/openssl/lib
して再度reboot
SSLテストにてバージョンが正しく上がっていることを確認して、対応完了。

もしもapacheだけでライブラリを指定したい場合は、
/usr/local/apache2/bin/envvarsに/usr/local/ssl/libを通すことでも対応できます。

滅多にソースコンパイルされた環境触らなくなってしまって、基本を失念してしまい、
ハマってしまったということでした。