OmniAICreator/Qiita-1.07M huggingface dataset:
PM2で自作アプリをデーモン化する(Raspberry Pi)


https://www.npmjs.com/package/pm2

## 環境

Raspberry Pi 2 MODEL B URL
Raspbian GNU/Linux 7 (wheezy) URL
Node.js v5.0.0


## インストール

```
npm install -g pm2
```

## 基本コマンド

```
$ pm2 start app.js --name my-api # Name process
$ pm2 list               # Display all processes status
$ pm2 stop 0             # Stop specific process id
$ pm2 restart 0          # Restart specific process id
$ pm2 delete 0           # Will remove process from pm2 list
```

## pm2自身をデーモン化

`pm2 statup`コマンドで起動スクリプトが作られるのですが、同時に
環境変数PM2_HOMEとユーザを渡した方が楽出来ます。  
（直接起動スクリプトを編集してもOK)  

```
sudo env PM2_HOME=/home/pi/.pm2/ pm2 startup -u pi
```

`/etc/init.d/pm2-init.sh`が作られます。これに実行権限を与えます。

```
sudo su -c "chmod +x /etc/init.d/pm2-init.sh && update-rc.d pm2-init.sh defaults"
```

## 自作アプリのデーモン登録

```
pm2 start myapp.js
```

同様のソフトウェアではPythonベースのSupervisordが知られていますが、それと比較してもコマンドベースで設定を追加できたり使いやすい感じがします。  
まだまだ高機能っぽいので理解次第追記します。
line monitor > UI部分(v0.2) > android対応した

line monitor
http://qiita.com/7of9/items/028556c5a819a6a8de96

```txt:環境
実装 Unity 5.1.3-f1 on MacOS X 10.8.5
動作 304SH
```

## プログラム

[v0.2 @ github](https://github.com/yasokada/unity-151117-linemonitor-UI/releases/tag/v0.2)

以下の対応をした

- android対応
- 受信テキスト表示をPanel上に変更
- 最新の(32-1)行まで保持可能
- １行の文字数は50文字 (50文字以上は次の行へ表示)

## 動作結果

304SHで実行したキャプチャ。

<img width="350" alt="ファイル名" src="https://qiita-image-store.s3.amazonaws.com/0/32870/f8d849b8-fb25-f003-8948-e454ab4cef50.png">

<!--
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/f8d849b8-fb25-f003-8948-e454ab4cef50.png)
-->

1行の文字数を90文字程度にしたい気がする。
一方で、現在の31行が見れるというのも便利そうではある。
UIについては検討が必要。
Dockerでデモ

# dockerのデモで使って面白そうなもの

## マトリックス
egray/cmatrix

```
docker run --rm -it cgray/cmatrix
```

![matrix画面.PNG](https://qiita-image-store.s3.amazonaws.com/0/60484/0ecd37d4-741f-41dc-c402-b32695994aaf.png)
unity > android > UI PanelとUI Textのサイズ関係が変わってしまう > Panelをstretch/stretchからmiddle/centerにする

```txt:実装、動作環境
Unity 5.1.3-f1 on Mac OS X 10.8.5
304SH (android)
```

##症状

UIのPanel上にTextを置いた時に、以下の２つの場合でPanelサイズ
に対するTextの見え方が全然違ってしまう。

- Mac OS XにてUnityのプレイヤーモードで見た場合
- 304SH上で実際に動かした場合

GameObjectのHierarchyは以下。

![qiita2.png](https://qiita-image-store.s3.amazonaws.com/0/32870/48e636d7-90c1-088b-54d8-de5ad8549f87.png)

Mac OS Xの見え方は以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/b2d68ebc-ca00-513a-16df-c9a9bb8f5753.png)

304SHでの見え方は以下 (左右反転している)。

![qiita.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/470aee49-a8a6-8090-4bda-fcabf5e987c3.jpeg)


## 解決

PanelのRect TransformにてStretch/Stretchをmiddle/centerにすれば解決した。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/4891a556-61b3-4eca-7cb6-f865d6f6fa44.png)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/8d0e0877-d2b5-61ec-46ce-2993eba1e527.png)
Powershellで、実行中の任意のプロセスを呼び出す(備忘録)


改良

```powershell:sample1.ps1
add-type -AssemblyName microsoft.VisualBasic
add-type -AssemblyName System.Windows.Forms
start-sleep -Milliseconds 500

$ps = Get-Process | Where-Object {$_.Name -match "epad"}
foreach($process in $ps){
    [Microsoft.VisualBasic.Interaction]::AppActivate($process.ID);
}
```

実行中のプロセスから、Notepadを呼び出し、
"1+1="という文字列を送り込む。

これを改良し、タスクバーから、任意のアプリケーションを、
アクティブウィンドウに持ってこれたら、便利かなと思っている。

```powershell:sample.ps1
add-type -AssemblyName microsoft.VisualBasic
add-type -AssemblyName System.Windows.Forms

Notepad

start-sleep -Milliseconds 500

$ps = Get-Process | Where-Object {$_.Name -eq "Notepad"}

foreach($process in $ps){
    [Microsoft.VisualBasic.Interaction]::AppActivate($process.ID);
    [System.Windows.Forms.SendKeys]::SendWait("1{ADD}1=")
}
```
技術英語 > the world’s most [pressing] environmental problems / Clock is ticking, Ben.

@ LOE > June 15, 2012

http://loe.org/shows/shows.html?programID=12-P13-00024
> the world’s most <font color=red>pressing</font> environmental problems

http://eow.alc.co.jp/search?q=pressing
> 1.〔必要性などが〕差し迫った、急を要する

<hr>
関連して思い出したのは

> Clock is ticking, Ben.

http://www.macmillandictionary.com/dictionary/british/the-clock-is-ticking
> used for saying that someone must do something quickly because there will soon be no more time left

何かの映画の一場面の英語としてCNN English Express(かEnglish Journal)に説明があったのを2000年頃に読んだ。早朝、子供(Ben)に対して母親が準備を急ぐように言っている場面。

ちなみにWeblioでは以下の記載のみ。

http://ejje.weblio.jp/content/clock+is+ticking
> 時計が進む
xfreerdpのすすめ(rdesktop後継)

* 今までrdesktopを使っていたが、xfreerdpのほうが高機能。

## 参考

* [FreeRDP - Wikipedia](https://ja.wikipedia.org/wiki/FreeRDP)

## インストール

```bash:
sudo apt-get install -y freerdp-x11
```

## 使い方

```bash:
xfreerdp \
 +compression \
 +fonts \
 -wallpaper \
 -theme \
 +home-drive \
 +clipboard \
 +smart-sizing \
 +async-input \
 /size:1280x960 \
 /sound \
 /t:"-" \
 /u:user1 \
 /v:localhost:3389
```

----

# rdesktopでwindows10に接続ができない場合

![w10.png](https://qiita-image-store.s3.amazonaws.com/0/25728/7cef9b10-d2a7-4982-4e05-b6201efed999.png)

> ネットワークレベル認証でリモートデスクトップを実行しているコンピュータからのみ接続を許可する（推奨）

このチェックを外せば接続ができる。
pip 覚書

``pip help`` で表示される英文の和訳です。間違ってるところがあったら教えてください。

# Usage:
```
pip <command> [options]
```

# Commands:

## pip install
パッケージをインストールする。

## pip uninstall
パッケージをアンインストールする。

## pip list
インストール済みパッケージを下記の形式で一覧表示する。

```
パッケージ名 (バージョン)
例) selenium (2.48.0)
```

## pip freeze
インストール済みパッケージを下記の形式で一覧表示する。
pip wheel と組合せて使用すると便利。

```
パッケージ名==バージョン
例) selenium==2.48.0
```

## pip wheel -r requirements file
requirements file に記述されたパッケージ群を
wheel 形式(拡張子 .whl)で wheelhouse ディレクトリへ保存する。

requirements file は

```
パッケージ名==バージョン
```

の形式で記述する。

## pip show パッケージ名
インストール済みパッケージについての情報を表示する。

```
pip show selenium

---
Name: selenium
Version: 2.48.0
Location: /usr/local/lib/python2.7/dist-packages
Requires:
```

## pip search パッケージ名
[PyPI](https://pypi.python.org/pypi) からパッケージを検索する。

## pip zip
*廃止:*
個々のパッケージを圧縮ファイル化する。

## pip unzip
*廃止:*
圧縮ファイル化されたパッケージを解凍する。

## pip bundle
*廃止:*
pybundle(複数のパッケージを格納したアーカイブ)を生成する。

## pip help [コマンド]
コマンドのヘルプを表示する。

# General Options:

## -h, --help
ヘルプを表示する。

## -v, --verbose
詳細を出力する。3回まで任意で使用することができる。

## -V, --version
バージョンを表示する。

## -q, --quiet
出力なしでコマンドを実行する。

## --log-file path
失敗のみを記録する詳細非追記ログのパス。
既定のログ出力場所は ~/.pip/pip.log 。

## --log path
詳細追記ログのパス。このログは既定では無効となっている。

## --proxy proxy
プロキシを下記の形式で指定する。

```
[user:passwd@]proxy.server:port
```

## --timeout sec
ソケットのタイムアウトを設定する。
既定値は15秒。

## --exists-action {switch | ignore | wipe | backup}
パスが既に存在する場合の既定の動作を設定する。

## --cert path
個別の CA bundle のパス。
テンプレートエンジン ede を使ってみる

[ede](http://hackage.haskell.org/package/ede)はHaskellの軽量テンプレート言語です。edeのルールに従って書かれたテキストにHaskellのデータ構造を使ってレンダリングしてテキストを生成することが出来ます。実際は主にHTMLページの生成とかに使うんだと思います。

HTMLの生成はHaskellでは[shakespeare](https://hackage.haskell.org/package/shakespeare), [blaze-html](http://hackage.haskell.org/package/blaze-html), [lucid](http://hackage.haskell.org/package/lucid)などが有名ですがどれも書き方が独特です。エンジニア以外の人と作業する場合はHTMLは出来るだけそのままに最低限のテンプレートの記法で済むようなものがいいでしょう。edeは[Mustache](https://mustache.github.io/)ベースのテンプレートでHaskeller以外の人にもわかりやすいものになっています。

<img width="196" alt="スクリーンショット 2015-11-21 4.50.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/17134/4a03ec6f-cec9-f395-afa2-e0b43a66cc6e.png">

例えばHTMLでこういうテーブルを表示するとしましょう。データはHaskell側から渡します。

```hs
data Todo = Todo
    { title :: String
    , done  :: Bool
    }

todos :: [Todo]
todos = [ Todo "買い物に行く" False
        , Todo "ゲームをする" True
        , Todo "Haskellを書く" True
        ]
```

さっそくedeのテンプレートを書きます

```html:index.html
<!DOCTYPE html>
<html>
  <head>
    <title>{{ title }}</title>
  </head>
  <body>
    <table border="1">
      <tr>
        <th>#</th>
        <th>Title</th>
        <th>Done</th>
      </tr>
      {% for todo in todos %}
      <tr>
        <td>{{ todo.index }}</td>
        <td>{{ todo.value.title }}</td>
        <td>
          {% if todo.value.done %}
            ✔
          {% else %}
            ✗
          {% endif %}
        </td>
      </tr>
      {% endfor %}
    </table>
  </body>
</html>
```

ほとんどHTMLのままで必要なところだけテンプレート記法が使われてるのがわかると思います。[Spock](http://hackage.haskell.org/package/Spock)を使って実際にWebサーバー経由で表示してみるプログラムを書いてみます。

```hs:app/Main.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}

module Main where

import Data.Aeson
import Data.Text.Lazy (toStrict)
import GHC.Generics
import Text.EDE
import Web.Spock

data Todo = Todo
    { title :: String
    , done  :: Bool
    } deriving Generic

instance ToJSON Todo

todos :: [Todo]
todos = [ Todo "買い物に行く" False
        , Todo "ゲームをする" True
        , Todo "Haskellを書く" True
        ]

main :: IO ()
main = do
    tpl <- eitherParseFile "index.html"
    let env  = fromPairs [ "title" .= ("TODOリスト" :: Value)
                         , "todos" .= toJSON todos ]
        body = either error toStrict $ tpl >>= (`eitherRender` env)
    runSpock 3000 . spockT id $ do
        get "/" $ html body
```

edeのテンプレートに渡すパラメータは[Aeson](http://hackage.haskell.org/package/aeson)の[Object](http://hackage.haskell.org/package/aeson/docs/Data-Aeson-Types.html#t:Object)である必要があるので`Todo`は`ToJSON`のインスタンスになっています。実行して<http://localhost:3000>にアクセスすると先ほどのテーブルが表示されると思います。

HaskellにはlucidのようにモナドでHTMLを組み立てられるようなDSLもあって便利な一方で実際の開発ではHTMLはいろんな人がさわると思うのでedeのように薄いテンプレート言語が必要になるのだと思います。適材適所で使い分けていきたいですね
mitmproxy を使ってアプリの API を無理やり PC のローカル開発環境に向ける

ほぼ以前書いた[mitmproxy を使ってアプリの API を無理やり開発環境に向ける](http://qiita.com/yuya_takeyama/items/979e00cf0b87dae92e28)と同じですが、相違点は以下の通りです。

* 前回はリモートのどこかにある開発環境を意図していたが、今回はローカルの開発環境で動くサーバに接続する
    * そして mitmproxy と開発サーバは同一のマシン上で立ち上げる前提
* 前回は本番環境も開発環境も同じプロトコル (HTTPS) という前提だったが、今回は本番環境は HTTPS で開発環境は HTTP とする
    * Rails とかの開発サーバを HTTPS で立ち上げることは稀だと思います
    * (主にこれのやり方がわからず調べるのに手間取ったので、こうして記事に残してます)

# 手順

mitmproxy の導入については[以前の記事](http://qiita.com/yuya_takeyama/items/979e00cf0b87dae92e28)に書いてあるので割愛。
今回もやはり Python スクリプトによるリクエストの改ざんを行います。

```py:replace_host.py
def request(context, flow):
    # 本番環境 (リクエスト改ざん対象のホスト)
    original = "api.example.com"
    # 開発環境 (同一マシンという前提なのでループバックを指定)
    replace  = "127.0.0.1"

    if original in flow.request.host:
        if original in flow.request.headers["Host"]:
            # 開発サーバは HTTP
            flow.request.scheme = "http"
            flow.request.host = replace
            # 開発サーバのポート番号を指定
            flow.request.port = 3000
            flow.request.headers["Host"] = [replace]
```

そして以下のように起動します。

```
$ mitmproxy -p 8080 -s replace_host.py
```

あとはこのプロキシを使うように準備した iPhone 等から接続してアプリを実際に操作するだけ。
特定のリクエストの時に、HTTPヘッダーを付与する


# きっかけ

自分のサイトへのHTTPリクエスト時にHTTPヘッダーに追加情報を載せたかった。

- アプリのバージョンを付与する
- 機種名を付与する
- HTTPS使用時に、認証用トークンを付与して、APIとWebでログインできるようにする

など。

# 実装したもの

https://github.com/taka0125/CustomHttpHeadersURLProtocol

# 試行錯誤

HTTPリクエストを投げる時によく使う`Alamofire`とか`AFNetworking`とかは比較的簡単にヘッダを付与できる。

ただ、`UIWebView`でWebページを表示しているケースでの付与が大変だった。

- `UIWebView`を継承したクラスの`loadRequest`でごにょごにょ
- `shouldStartLoadWithRequest`でごにょごにょ
- 隠しdelegate使ってごにょごにょ

とか見つけたんだけど全体的に微妙…。

そんな中で見つけたのが

**NSURLProtocolを使う**

だった。

今回、自分のサイトに設置してあるAPI/Webへのリクエストの時のみ色々付与したかったのでもの凄くマッチした。

応用も効きそうなのでPod化しておいた。

## ざっくりな流れ

- `canInitWithRequest`で自分の作ったProtocolを適用するか決める
- `startLoading`でリクエストの開始
- `stopLoading`でリクエストの終了
- 適当なタイミングで、`NSURLProtocolClient`のメソッドを呼ぶ

詳しいコードは、

https://github.com/taka0125/CustomHttpHeadersURLProtocol/blob/master/Pod/Classes/CustomHttpHeadersURLProtocol.swift

で。

# まとめ

NSURLProtocolで通信をフックしてごにょごにょしよう！
CakePHP3.1で追加されたRoutes Shellを試してみた

# CakePHP3.1で追加されたRoutes Shellを試してみた

`Routes Shell` はroutesを複雑に作っている場合等、CLIからroutesが正常に動くかをテストするときに使います。  

## URL解析チェック

以下のコマンドを実行することで、どのroutesに一致して、どうparseされるかを確認できます。

```
php bin/cake.php routes check /hoges/edit/1

// routesには以下が設定してあります。
// $routes->connect('/hoges/:action/*', ['controller' => 'fugas']);

```

### 実行結果

![2015-11-21_02h00_28.png](https://qiita-image-store.s3.amazonaws.com/0/49429/9057104b-e5de-49d9-664a-9cc8b15c7c45.png)

※Query Stringを含む場合はcheck対象のURLをダブルコーテーションで囲む必要があります。

```
php bin/cake.php routes check "/hoges/edit?key1=aaa&key2=bbb"

```

## URL生成チェック

以下のコマンドを実行することで、どういうURLが生成されるかを確認することが出来ます。

```
php bin/cake.php routes generate controller:fugas action:edit 1

// routesには以下が設定してあります。
// $routes->connect('/hoges/:action/*', ['controller' => 'fugas']);

```

### 実行結果

```
> /hoges/edit/1
```
CakePHP3 Plugin Shell周り覚書

# CakePHP3 Plugin Shell周り覚書

## プラグイン作成

```
php bin/cake.php bake plugin [Plugin名]
```

## プラグイン有効・無効

load, unloadを実行することで `bootstrap.php` に `Plugin::load('プラグイン名');` を追記・削除されます。

### 有効化

```
php bin/cake.php plugin load Hoge
```
loadには *-b* と *-r* のオプションがあります。

- -b：Pluginのbootstrapを読み込むように設定します
- -r：Pluginのroutesを読み込むように設定します

```
// bootstrap読み込み
php bin/cake.php plugin load -b Hoge
// routes読み込み
php bin/cake.php plugin load -r Hoge
// bootstrap, routes両方読み込み
php bin/cake.php plugin load -br Hoge
```


### 無効化

```
php bin/cake.php plugin unload Hoge
```

## Pluginのwebrootアクセス

デフォルトの状態でPluginのwebrootにアクセスすると、画像やCSS等を読み込む毎にPHPが実行されます。  
以下のコマンドを実行するとPluginのwebroot以下をappのwebrootへ `シンボリック` or `コピー` することが可能です。


Plugin名は省略可能で、省略した場合はすべてのPluginが対象になります。

### シンボリック

```
php bin/cake.php plugin assets symlink [Plugin名]
```

### コピー

```
php bin/cake.php plugin assets copy [プラグイン名]
```
react,babel,webpackを試してみる

# github
https://github.com/yamatatsu/react-babel-webpack-template

# 手順
以下をインストールします。

```
npm i --save react@0.13.3
npm i -g webpack-dev-server@1.12.1
npm i -g --save-dev webpack@1.12.1
npm i --save-dev babel-loader@6.0.1
npm i --save-dev babel-core@6.0.12
npm i --save-dev babel-preset-es2015@6.0.12
npm i --save-dev babel-preset-react@6.0.15
```

まずは土台になるhtmlを用意

```html:./index.html
<!doctype html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Hello React</title>
  </head>
  <body>
    <div id="hello"></div>
    <div id="world"></div>
    <script src="bundle.js"></script>
  </body>
</html>
```

そしてjsを書いていきます。
書いたjs,jsxはwebpackでビルドされて
↑のbundle.jsになります。

```js:./src/front/main.js
import './hello.jsx';
import './world.jsx';
```
↑es6っぽい書き方。
では、hello.jsxとworld.jsxを用意します。

```js:./src/front/hello.jsx
import React from 'react';

class Hello extends React.Component {
  render() {
    return <h1>Hello</h1>
  }
}

React.render(<Hello/>, document.getElementById('hello'));
```

```js:./src/front/world.jsx
import React from 'react';

class World extends React.Component {
  render() {
    return <h1>World</h1>
  }
}

React.render(<World/>, document.getElementById('world'));
```

そしてwebpackの設定。

```js:./webpack.config.js
var path = require('path');

module.exports = {
  entry: './src/front/main.js',
  output: { path: __dirname, filename: 'bundle.js' },
  module: {
    loaders: [
      {
        test: /.jsx?$/,
        loader: 'babel-loader',
        exclude: /node_modules/,
        query: {
          presets: ['es2015', 'react']
        }
      }
    ]
  },
};
```

これでできあがり。
実行は
`webpack-dev-server --progress --colors`

タスクランナーは使ってないです。
使いたい場合はnpm scriptで吸収するのがいいと思います。

もう少しexportしてimportする感じの例があるといいなぁ。

参考：
[Setting up React for ES6 with Webpack and Babel](https://www.twilio.com/blog/2015/08/setting-up-react-for-es6-with-webpack-and-babel-2.html)
PHPのsscanf関数をPowerShellで使えるようにしてみた

[「PHP関数 - フォーマットされた文字列を配列・変数に - sscanf()」](http://webkaru.net/php/function-sscanf/)で紹介されているsscanf関数をPowerShellでも使えるようにしてみました。
方法は簡単で、PHPをインストールして、PowerShellから呼び出すだけです。

## 事前準備
１．PHPのインストール
※詳細は[「PHPインストールと初期設定(Windows)」](http://www.phpbook.jp/install/)を参照

２．php.exeの格納フォルダを環境変数PATHに登録

## 関数定義
```ps1:
#PHPのsscanf関数をPowerShell用にラッピング
function sscanf($string,$format,$encoding="shift_jis"){
  $tempfile = [System.IO.Path]::GetTempFileName()
  $script = @"
<?php
  echo join("\n",sscanf("$string", "$format"))."\n";
?>
"@
  $objEncoding = [System.Text.Encoding]::GetEncoding($encoding)
  ;[System.IO.File]::WriteAllText($tempfile,$script,$objEncoding)
  php -n -f $tempfile
  del $tempfile
}
```
※「;[System.IO.File]」の「;」は不要（Qiitaで表示させるため）

## 使い方（例）
```ps1:
$year,$month,$day = sscanf "2015年11月21日" "%d年%d月%d日"
echo "年：$year"
echo "月：$month"
echo "日：$day"
```

```txt:結果
年：2015
月：11
日：21
```

## まとめ
上記の例以外にも、コマンドプロンプトやLinux Shellの実行結果をCSV変換する等、テキスト加工が必要な場面で活躍しそうです。
実はsscanf関数自体はC言語の頃からある関数のようですが、どうしてこのような便利な関数を.NETで使えなくしたのか、少し疑問です。
nodejsのファイルシステムで迷った

## 環境

* Node.js 5.1

## 概要

Node.jsのコアモジュールのfsモジュールを使って、getリクエストのresponseを非同期で保存して終わったら何か表示するプログラムを作った時。

## 問題

```
var outfile = fs.createWriteStream(savepath);
http.get(url, (res) => {
  res.pipe(outfile, { end: false});
  res.on('end', () => {
    outfile.close();
    console.log("ok");
  });
});
```

これはソースの一部ですが、実行すると途中までファイルに書き込まれて最後まで書き込まれずに終了することが有りました。

## 対処

stream.writableを終了する時はendメソッドを使う。

どうやらcloseメソッドを利用するとファイルが書き込み中だったとしても強制的にクローズする模様。
endにするとfinishイベントが発火されるまで待ってくれる。


参考
https://nodejs.org/api/stream.html#stream_class_stream_writable
Linuxのディレクトリ構成

# そろそろLinuxディレクトリの全体像把握しとく？
Linux入門でCUIを操作しはじめると、/etcとか/homeとか/varとか、しばしば登場するディレクトリがたくさん出てきます。そもそもどういう意図で作られたディレクトリなのか？ディレクトリの役割など詳しく知りたくなった時に、Linuxディレクトリ構成の全体像をざっと把握しておくと、ベース知識となり、その後のCUI学習の効率がアップしそう。

参考になったサイト：
[Linuxの基本の基本。Linuxの基本的なディレクトリ構成](http://oxynotes.com/?p=5987)
ひょんな拍子にCoffee断ち

なんとなく使い始めていたCoffeeScriptですが、いま製作中のプロダクトで環境を整えた直後に「いらないな」と感じるようになってしまいました。

# お断り
これはあくまで個人の感想であって、これに従って何かを行なってトラブルが起きたとしても、筆者は一切の責任を負いません。そして、「どんな言語を使うか」はあくまで個人の自由ですので、「こんな人もいるんだな」と受け止めてもらえれば幸いです。

# Coffeeを使い始めたきっかけ
半年ほど前にRailsのプロダクトを作り始めた時に、RailsでCoffeeScriptが使えることを知って、そして書いてみると、そのすっきりした書き味に魅力を感じて、しばらく使っていました。

# 別プロダクトの環境構築
そのRailsプロジェクトとは別に、非Railsでものを作ることになり、せっかくだからCommonJS的な`require`で書けるようにしてみよう、ということで、（自分としての考えがあって）コマンドラインツール+Rakeで環境を整えました。最初からJavaScript/CoffeeScript両対応で環境を作っていたので、多言語化の下地はこのときにできていました。

# ES6の魅力
その過程で、ES6も従来のJavaScriptへコンパイルできることを知りました。ブロックスコープの`let`、ジェネレーターといった新機能や、CoffeeScriptと共通する部分のあるクラス記法、ファットアローなど、いろいろと充実してきている印象を受けました。

CoffeeScriptではすっきり書けるけど、ES6で手間取る、というのは`?`を付けての存在確認と、配列内包ぐらいかな、という印象でした。

# CoffeeScriptは楽しいけど…
一方のCoffeeScriptでも、書き心地はいいのですが、よくよく考えてみれば**あまり書く速度は速くなっていない**ということに気づきました。というのも、ややこしい記法をしようとすればCoffeeScriptでの書き方がわからず、その都度調べることになるので、そのあたりは素のJavaScriptのほうがわかりやすいのです。

あと、RailsでもSassよりSCSSを、HamlやSlimよりERBを選ぶ程度にはインデントを基準とした構文になじめず、CoffeeScriptのインデント構文にも、じつはもやっとした感じがしていました。

# とどめを刺したVisual Studio Code
つい先日にオープンソース化されたVisual Studio Codeですが、TypeScriptと、その下位互換にあたる[^1]ES6・JavaScriptについて、Microsoftお得意の強力なIntelliSenseが効いて、しかも型情報さえあればjQueryなどライブラリにも使える、そして`require`する場合にもその先のファイルから読んでくれるということで、書きやすさがかなりのものになっていました。ただ、これはCoffeeScriptには効かないようで、これが最後の決め手になって、JavaScriptに戻ることにしました。

# 帰れない片道切符
で、残ったCoffeeScriptのコードは、ちょうど環境整備していたコマンドラインコンパイラで、`coffee -bc hoge.coffee`とすれば対応するJavaScriptの一丁あがりです（コメントを移植する、不要な変数を削るなど多少の調整は必要ですが）。CoffeeScriptを使うために整備したはずの環境が、CoffeeScriptから乗り換えるために使うこととなってしまったのでした。

とはいえ、早急に型付けしたいものや、手を入れたいもの以外をすべてJavaScriptに戻すのも手間なので、とりあえず現状Coffeeで書いたものも残ってはいる状態です。



[^1]: もちろん、正しくはTypeScriptがES6に対して上位互換で作ってあるのですが、JavaScriptに出るIntelliSenseも、TypeScriptとして型付けしてあるような感じでした。
Atomエディタのscriptプラグインでhomebrewでインストールしたプログラムが動かなかったとき

Atomエディタのscriptプラグインは、Atom上でプログラムを実行してくれてとても便利。
プログラム実行のショートカットキーは`command + i`です。

でも、homebrewでインストールしたプログラムがプログラムが参照できないことがあったのです。

![スクリーンショット 2015-11-20 22.21.03.png](https://qiita-image-store.s3.amazonaws.com/0/76589/aabcb586-084c-b12b-9093-4b4bbce3a68a.png)

# そういうときは

`Atom -> Open Your Init Script`(japanese-menuプラグインで日本語化している場合は「起動スクリプトを開く」)もしくは`vi ~/.atom/init.coffee`などで設定ファイルを開き、


![スクリーンショット 2015-11-20 22.38.48.png](https://qiita-image-store.s3.amazonaws.com/0/76589/42a6d30e-28e2-d661-32d9-bd544519d994.png)


```coffeescript:init.coffee
# 下記の記述を追加してください
process.env.PATH = ['/usr/local/bin', process.env.PATH].join(':')
```

# それからAtom再起動すると

`command + i`で目的のスクリプトが動きます。

![スクリーンショット 2015-11-20 22.22.17.png](https://qiita-image-store.s3.amazonaws.com/0/76589/fd1c1d1b-9a4b-42ef-e7e5-739b6e938d64.png)

japanese-menuプラグインとscriptプラグインの作者さんありがとう。超べんりです。

おわり。

# 参考と注釈

* [Uncaught BufferedProcessError for files not shown on PATH #275](https://github.com/rgbkrk/atom-script/issues/275)
* [Perl6導入とHello, world! - Qiita](http://qiita.com/B73W56H84/items/2153e6211ed617b4605d)
* [パッケージ[Script]でJS,CoffeeScriptを実行 - Qiita](http://qiita.com/takeyuichi/items/e32d7b4b551e434c5262)
* [Atomでscriptパッケージ入れてJavaScript実行しようとしたらnodeなんていないと言われた - Qiita](http://qiita.com/rei-m/items/0af8260307bba2845c8a)
Google Maps SDK for iOSの導入手順


久しぶりに使おうと思ったら手順がだいぶ変わっていたのでGoogle Maps SDKのダウンロード、APIキーの取得、サンプルを動かすところまでをメモ。
（基本的にGoogle Maps SDK for iOSの[Getting Started](https://developers.google.com/maps/documentation/ios-sdk/start)の内容。）

開発環境:Xcode7.1.1

#手順

### 1 CocoaPodをインストールする　

```console
$ sudo gem install cocoapods
```

### 2 Podfileを作成する
GoogleMapSDKを使いたいXcodeのプロジェクト内にPodfileを作成する。
（.xcodeprojと同列に作成）

```Podfile
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.1'
pod 'GoogleMaps'
```

### 3 GoogleMapSDKをインストールする
ターミナルでPodfileがある階層に移動して、以下のコマンドを実行。

```console
$pod install
```
### 4 iOS API keyを取得する
4.1 [Google Developers Console](https://console.developers.google.com/?hl=ja)を開く
4.2 画面右上部にある「プロジェクトを選択してください」を押下し、プルダウンにある「プロジェクトの作成...」を押下して、新しいプロジェクトを作成する
4.3 ダッシュボード内にある「Google APIを利用する」を押下し、API Managerのページへ移動
4.4 左メニューの「認証情報」を押下し、認証情報画面を開く
4.5 認証情報タブの『認証情報を追加』ボタンを押下し、「API キー > iOSキー」を押下
4.6 iOS APIキーの作成画面で「作成」ボタンを押下。
4.7 APIキーが取得できる。

### 5 Google Developers ConsoleからAPIを有効にする
5.1 [Google Developers Console](https://console.developers.google.com/?hl=ja)を開く
5.2 ダッシュボード内にある「Google APIを利用する」を押下し、API Managerのページへ移動
5.3 左メニューの「概要」を押下し、概要画面を開く（デフォルトはこの画面）
5.4 Google Maps API　カテゴリ内の以下二つを有効にする

* Google Maps SDK for iOS
* Google Places API for iOS

### 6 ソースコードにAPIキーを記述する
**AppDelegate.m** 内に以下を追加する。

GoogleMapsをimportする。

```objective-c
@import GoogleMaps;
```
**application:didFinishLaunchingWithOptions:** に以下のコードを記載する
（ **YOUR_API_KEY** に4.で取得したAPIキーを記載）

```objective-c
[GMSServices provideAPIKey:@"YOUR_API_KEY"];
```

### 7 サンプルコードを動かしてみる
[Google Maps SDK for iOS](https://developers.google.com/maps/documentation/ios-sdk/)のトップにある **Hello Map** を **ViewController.m** にコピーする

### 8 Info.plistに設定を追加
8.1 **LSApplicationQueriesSchemes**を追加し、Typeを **Array** に設定
8.2 LSApplicationQueriesSchemesの中に以下2つを追加

* googlechromes
* comgooglemaps

### 9 ビルド
ビルドを実行するとGoogleMap上にマーカーの載った画面が表示される。


#エラー
###その1

一通り設定が終わって、アプリをビルドしたところ以下のようなエラーが出た。

####エラー内容

```console
ld: library not found for -lPods
```
同時に以下のようなWorningが出る。

```console
Target 'Pods' of project 'Pods' was rejected as an implicit dependency for 'libPods.a' because its architectures 'arm64' didn't contain all required architectures 'armv7 arm64'
```

####解決策

Build Settings内のArchitecturesにある「Build Active Architecture Only」をYesに変更する。

1度ビルドが通ると、ここのNoに戻してもビルドは通るようになる。

###その2

実機（iPhone5S）でビルドしたところ以下のようなエラーが出た。

```console
ld: '/Users/**/program/Xcode_Test/googlemap_test/googlemaptest/Pods/GoogleMaps/Frameworks/GoogleMaps.framework/GoogleMaps(GMSBillingPointRecorder.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. for architecture arm64
```

####解決策
BuildSettingsのBuild Optionsにある **Enable Bitcode**を「NO」に設定する。
Github上のプロジェクトをいい感じでチラ見する

# なんだこれは？

- Githubでちょっとソースを見たい。
- ただ、いちいちローカルにcloneして、じっくり見るほどではない。
- とはいえgithub上でディレクトリを行ったりきたりしながら、１つずつ見ていくのも面倒だ。
- その中間ぐらいで適度に見やすくする方法はなかろうか。

そんなときに使えるのが

- http://v-github.com/


Githubの簡単なビュアーです。
IDE風にGithub上のソースを見ることができます。

# 例

- [bitcoin](http://v-github.com/bitcoin/bitcoin)

![bitcoin.png](https://qiita-image-store.s3.amazonaws.com/0/24444/b56d1722-5b5e-319f-2e85-a1632e71201d.png)

- [twitter bootstrap](http://v-github.com/twbs/bootstrap)

![twbs.png](https://qiita-image-store.s3.amazonaws.com/0/24444/37d0867d-15c9-76f6-8317-5282994fff0d.png)

ちなみに以下のURLのように、ファイルを開いた状態でのパーマリンクを持っています。
[http://v-github.com/twbs/bootstrap#bootstrap/.travis.yml|bootstrap/composer.json|bootstrap/package.js](http://v-github.com/twbs/bootstrap#bootstrap/.travis.yml|bootstrap/composer.json|bootstrap/package.js)

# 使い方

1. Github上で、気になったプロジェクトを見つける
2. そのプロジェクトのURLをコピーする
3. [v-github](http://v-github.com/)のヘッダーのテキストボックスにURLを貼り付けて、「見てみる」をクリック
4. しばし待つ
5. OK

Gihut上のパブリックなものであれば、どんなプロジェクトでも使うことができますので、ちょっと気になったプロジェクトを見る時とかに使ってみてください。

# 制限

- masterブランチしか見れないっす
- 閲覧可能なプロジェクトのサイズ上限があります
- サーバー側で素朴にcloneしているだけなので、ユーザー増えるとファイル容量などで、サービスすぐ死ぬと思います！
Androidの保存先アクセス方法めも

忘れっぽいのでメモ

#### アプリケーションデータの保存領域にアクセス

=> **ActivityクラスのgetFilesDirメソッド**

#### アプリケーションデータの保存領域にあるファイルを開く

=> **ActivityクラスのopenFileOutput(“data.dat”,MODE_PRIVATE)**
※ファイルが無かった新規作成する

#### 内部ストレージのトップディレクトリを開く

=> **EnvironmentクラスのgetExternalStorageDirectoryメソッド**

#### 内部ストレージ内アプリ保存ディレクトリ

=> **EnvironmentクラスのgetExternalFilesDirメソッド**

注意) 端末によっては機種依存がある
XcodeでUI部品とコントロールが紐付けできないときの対処


XcodeでObj-cのコードとUIを紐付けしたいとき、
> アシスタントエディタでコードを開いて関連付けたいUI部品をCtrl押しながらコード側に持っていくと自動でメソッドやらプロパティが生成される

的な記載を本で見たけど、Storyboardファイルを消したり作ってたりautolayoutでこんがらがってたらなぜかできなくなった。


結論としてはCustomClassを設定したらなおった。
UIはどこに何があるか把握しきれていないので、Storyboardをソースコード版で開いて、```<viewController>```の要素に```customClass="ViewController"```を入れて対応。


しかし、やっぱり時代はSwiftですかねぇ……。
【ansible】強制的にchangedを発生させない方法


Ansibleの[shell module](http://docs.ansible.com/ansible/shell_module.html)を使用してコマンド結果のみをregisterに保存しておきたい時がある

自分の場合はログインShellがzshなのかbashなのかを調べたくてこんなタスクを書いた

```main.yml
- name: check using shell register in file path
  shell: |
      if [ `echo $SHELL | grep -c "zsh"` -eq 1 ]; then
        echo ".zshrc"
      elif [ `echo $SHELL | grep -c "bash"` -eq 1 ]; then
        if [ `uname` = "Linux" ]; then
          echo "~/.bashrc"
        elif [ `uname` = "Darwin" ]; then
          echo "~/.bash_profile"
        fi
      fi
  register: shell_configure_file
```

上記タスクを実行した場合は必ず ``` changed ``` になってしまう。

```
TASK: [python/pyenv/install | check using shell register in file path] ********
changed: [127.0.0.1]
```

このchangedを常にokにしたい時に色々調べてしまったのでメモ

## 環境

* Mac OSX Yosemite(10.10.5)
	* python 2.7.10
		* ansible 1.9.4


## 参考にしたサイト

[ansible個人的メモ＆Tips](http://qiita.com/yushin/items/d65929a3c972bcf50887)


## 常にokにする方法

``` changed_when: False ``` をタスクに記載してしまえばよい

先ほどのtaskの場合だとこうなる

```main.yml
- name: check using shell register in file path
  shell: |
      if [ `echo $SHELL | grep -c "zsh"` -eq 1 ]; then
        echo ".zshrc"
      elif [ `echo $SHELL | grep -c "bash"` -eq 1 ]; then
        if [ `uname` = "Linux" ]; then
          echo "~/.bashrc"
        elif [ `uname` = "Darwin" ]; then
          echo "~/.bash_profile"
        fi
      fi
  changed_when: False
  register: shell_configure_file
```


## なぜchangedを許容してはいけないのか？

個人的な見解なのだが、自分が書いたplaybookであれば、これは気にしなくてよいchangedだ。などansibleの実行結果を見てすぐ判断できるだろうが、このplaybookを他人が実行した時に ``` changed ``` がでた場合に「おや、何か設定が何か変わったのか？」と思ってしまう。

changedは対象のOSの振る舞いが変わった時だけchangedになる方が望ましいと思う。

## 最後に

ansibleは簡単なんだけども色々回避方法があるから返ってtask作るときはムズイなー。。。
上記taskもshellゴリゴリ書いちゃってるから自分の中ではかなり負けた気分だし・・・・
SafariでWEBフォント細杉問題

Safariで細いWebフォント(Robotoの`font-weight:100`とか)使うと、Safariで超細杉問題が発生。
そこで、こうしたらだいぶマシになりました。他にいい方法あるかしら？

```scss:_font-fix-safari.scss
.safari #hoge {
  -webkit-font-smoothing: subpixel-antialiased;
  -webkit-text-stroke: 0.5px;
}
```
Vyatta の VPNユーザ一覧を確認する方法

# 環境

```
$ show version
Version:      VC6.5R1
Description:  Vyatta Core 6.5 R1
```

# 手順
`/opt/vyatta/config/active/vpn/[ プロトコル ]/remote-access/authentication/local-users/username/` 以下にVPN接続ユーザのディレクトリがある。


PPTPのVPN接続ユーザ一覧を確認したければ、

```
$ ls /opt/vyatta/config/active/vpn/pptp/remote-access/authentication/local-users/username/
```

ユーザのVPN接続パスワードを確認したければ、各ユーザのディレクトリの中にある `node.val` を見る。
例えば、hogeユーザなら以下のコマンドで確認出来る。

```
$ view /opt/vyatta/config/active/vpn/pptp/remote-access/authentication/local-users/username/hoge/password/node.val
```
Zendesk の REST API で組織を指定してチケットを起票する

REST API Documentation の Request parameters には記載されて無かったけど organization_id を指定すれば、その組織のチケットとして起票される。

https://developer.zendesk.com/rest_api/docs/core/tickets#creating-tickets

**実際に投げたパラメータ**

```
{
  ticket: { 
    subject: 'ほげほげ', 
    comment: { body: 'ふがふが' }, 
    tags: 'hoge', 
    requester_id: 1234567890, 
    type: 'task', 
    priority: 'normal', 
    organization_id: 12345678
  } 
}
```
Block要素の縦横比固定mixin。黄金比とかも。

備忘なり。

```scss:_fixed-ratio-box.scss
@mixin fixed-ratio-box($width:'100%', $height:'100%') {
    position: relative;
    width: #{$width};
    height: auto;

    &:before {
        content: '';
        display: block;
        padding-top: #{$height};
    }

    > * {
        position: absolute;
        top: 0;
        left: 0;
        width: 100%;
        height: 100%;
    }
}

// 黄金比とか
.golden-ratio-box {
    @include  fixed-ratio-box('100%', '70.72%');
}

// 画像サイズの縦横比維持 - 背景画像を使う時とか便利
.origin {
    @include  fixed-ratio-box('100%', percentage(image-height('origin.png') / image-width('origin.png')));
}
```

黄金比ボックスの使い方。


```jade:golden-box.jade
div.box.golden-ratio-box
	div.box-inner
		p 黄金比ボックス
```
高さ不明の親子で縦横中央の術

いまだに毎回ググってしまうので備忘。
`table-cell`はバグが多いので(position:absolute;が効かないとか)、それ以外の方法で。

```css
#parent {
	position: relative;
	overflow: hidden;
}

#child {
	position: absolute;
	top: 0;
	right: 0;
	bottom: 0;
	left: 0;
	min-height:100%;
	min-width: 100%;
	margin: auto;
}

/* Firefox用のfallback - .firefoxはmodernizrとか使って当ててね。 */
.firefox #child {
	top: 50%;
	left: 50%;
	bottom: auto;
	right: auto;
	transform: translate(-50%, -50%);
	-moz-transform: translate(-50%, -50%);
}

```

もっといい方法あったら、誰かおしえてー！
tweetid から tweet をできるだけ早く集める方法 (72000 tweets / hour)

#tweetid から tweet をできるだけ早く集める方法 (72000 tweets / hour)

##環境
MacOS, Linux
python v3.4.3
PHP v2.5.0

##概要
データの配布が　tweetid での配布ということはよくありますが、Twitter  のクロールには制限があり、集めるのが面倒であることが多いです。今回は tweetid から tweet を集める方法を紹介します。
使うのは[GET statuses/lookup](https://dev.twitter.com/rest/reference/get/statuses/lookup)という公式で発表された tweet を1リクエストあたり 100 件もってきてくれるやつです。（詳しいことはわかりません）

##クロールには Twitter のアカウントが必要
ご存知の方も多いと思いますが Twitter のクロールにはアカウントが必要になります。更に[Twitter developers](https://dev.twitter.com)にて以下の4つの情報を入手する必要があります。このあたりは説明が転がっていますので各自集めて下さい。

* Consumer Key (API Key) =                                                            
* Consumer Secret (API Secret) =                              
* Access Token = 
* Access Token Secret = 

##コードと使い方
スクリプトを Github にて公開しているので参考にしてください。[Twitter クロールスクリプト](https://github.com/ace12358/twitter/)

必要であれば Github を利用して
	
	git clone https://github.com/ace12358/twitter/
	
で必要なスクリプトを揃えることができるのでご利用下さい。以下では src/ リポジトリの中のコードの使用例です。

次に、tweetid2json.php のスクリプトのに取得した4つの情報を書き加えます。

* Consumer Key =                                                       
* Consumer Secret  =                              
* Access Token = 
* Access Token Secret =

それが完了したら

	php tweetid2json.php 418033807850496002

などとすれば json 形式でクロールが可能になります。ここで

	php tweetid2json.php 418033807850496002 | python json_reader3.4.3.py

で

	418033807850496002	よるほ　あけましておめでとうございますほー
のようなタブ区切りで出力が可能になります。
因みに、418033807850496002のようなtweetid はカンマ区切りで100個までまとめてリクエストすることができます。これらをまとめたシェルスクリプトがあり

	bash make_tweet.sh ../data/tweet_id_list.txt
	
を実行することで 6 秒おきにファイルの1行（tweetid(s)）をよみクロールします。6秒おきなのは制限に引っかからないためです。

*  制限: 180 request / 15 min

以上で説明は以上です。一番効率よく集めるためには
100 個の　tweetid が ',' で連結されたものが1行のファイルを作成し

	bash make_tweet.sh ../data/tweet_id_list.txt
を実行するといいでしょう。

100万tweets くらいのデータを集めるさいは1日程度かかるので
サーバーなどで

	nohop bash make_tweet.sh ../data/tweet_id_list.txt > tweetid_tweet.txt &
	

などとして放置しておくと良いでしょう。急ぎの場合であればアカウントを複数作れば並列で処理も可能です。

##php インストール後に Call to undefined function curl_init() でError が出る場合
* ここを参考にするとうまくいきました 
* → [apacheでエラー「Call to undefined function curl_init()」が出た場合](http://blog.livedoor.jp/skky2/archives/1230938.html)

##参考文献
* [phpのクロールとかの参考](https://syncer.jp/twitter-api-matome/get/statuses/show-id )

##何かあれば
[@Ace12358](https://twitter.com/ace12358/) までどうぞ。すぐに返事ができるかと思います。
【Groongaで学ぶ全文検索 2015-11-20】全文検索とは


# 背景

久しぶりに勉強会参加してきました。
というのも、来週のいい肉の日（11/29）にGroonga Meetup 2015で登壇させて頂くことになり、焦って勉強しなきゃ！全文検索！ということで参加しました。

* Groonga Meetup 2015
https://groonga.doorkeeper.jp/events/31482

あと30人くらい参加枠があるみたいです。会場はぐるなびさんで、美味しい肉が食べられるみたいです！
都合が良い方は是非！

# 勉強会で学んだこと

## 全文検索とは

* 文章を検索したいってニーズは誰にでもあります
* だけど、検索対象の文書が大量だと大変
* そこで、インデックス作って効率的に検索するのが全文検索

## インデックスってなに？

* からくり
	* インデックス自体はキー・バリューストア
	* キー・バリューのキーに対して検索する
	* キーに入ってるものだけYesとして、それに対応するバリューを返す（※これ重要）
	* 因みにバリューには結果の文書に対するIDのリストが入ってる


* 検索キーワードが英語の時

	* 単語単語で区切ってキーに登録していく
	* 英語は文章が単語で区切られてるからスマート
	* 例えば、This is a pen の時、キーにする区切りがわかりやすいでしょ？
	
* 検索キーワードが日本語の時

	* 例えば東京都だと、東京・京都 だったり区切るところわかりずらい
	* 割りと大変、いや凄い大変
	* そこでアプローチが2つある

## 日本語検索のアプローチ

1 英語と同じく単語をキーワードにする

* 例えば「花が咲いた」の時、花・が・咲いたをキーにする
* 形態素解析　→　MeCab

2 なんでもキーワードにしちゃう

* 例えば「花が咲いた」の時、花が・が咲・咲い・いた・た花・花が・が咲とか何でもキーにする
* N-Gram
* 2バイトでとるのは、2gram（バイグラム）、3バイトは3gram（トリグラム）、バイグラムはバイリンガル（倍ってことじゃないよ！）のバイ、トリグラムはトライアングルのトリ

## 日本語の何が大変なんだっけ？

* 1は超大変。例えば「すももももももものうち」どこで切ればいいの。。。
* だから2がある
* 例えば「咲いた」を検索する場合、「咲い」・「いた」のアンドとれば咲いた引ける
* でも、まだまだ問題がある
* キーワードが「花が咲いていた」の場合、「咲い」・「いた」のアンドでYesになるけど「咲いた」ないよね。。誤検索 ＼(^o^)／ｵﾜﾀ
* なので、さらに隣り合ってるかってのも見なきゃいけない罠がある。
* 隣り合ってるか問題の解決方法としては、値の中に何番目にあったかを値に入れとくやり方と初めの検索ではちゃんと見ないで怪しいのピックアップしたあとに、ちゃんと見るやり方がある

	* それをフレーズ検索という
	* google検索でいうところの、ダブルクォーテーションで囲った場合の検索

## 気になる性能面

* 上記で推測すると、2のNgramはインデクシング簡単だけど、検索遅そう、1の形態素解析はインデクシング大変だけど、検索早そう。
* 性能面が気になるので、ググッてみました。
* ざっと調べた感じだと[Mroonga/GroongaのMeCabトークナイザの全文検索性能について](http://createfield.com/Mroonga/Groonga%E3%81%AEMeCab%E3%83%88%E3%83%BC%E3%82%AF%E3%83%8A%E3%82%A4%E3%82%B6%E3%81%AE%E5%85%A8%E6%96%87%E6%A4%9C%E7%B4%A2%E6%80%A7%E8%83%BD%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#.E5.85.A8.E6.96.87.E6.A4.9C.E7.B4.A2.E6.80.A7.E8.83.BD
)の記事がわかりやすい
* Mecabの場合、「〜の」とか助詞が頻出して容量圧迫する割に検索に寄与しないので、頻出語句がある場合とない場合で計測してるようです

![Qiita](http://createfield.com/images/thumb/mecab_pe.png/640px-mecab_pe.png)

* 頻出語句さえ除けば、MeCabトークナイザは、インデックスサイズをコンパクトに抑えつつ、Bigramトークナイザ、Trigramトークナイザよりもかなり高い検索性能が得られていることがわかります。
* Mecabで問題は検索漏れがあるみたいですが、Mecabの検索漏れを減らす場合、IPADic辞書より、UniDic辞書の方が良いって書いてありますね

## 自身がMecabで困ってたこと

* たまに「mecab_sparse_tostr() failed len=XXX err=too long sentence.....」ってエラー出てた
* おかげでインデックス処理が落ちて、、ダメマーク付けて再インデックスするという不毛な処理を入れて回避してた
* その場合、対象文書はインデックスにすら入らない状態になってる
* 原因は、モノには限界がある
	* big文書で改行とかの問題で解析長いとリソース溢れてエラー

* 最近長い時にプチッと切るオプションが追加された
	* plugins/tokenizers/以下のソースを環境変数キーワードに漁ったら見つかるよと（後で漁る）


## 今後の話

* 物事やるときは、本質知らないとですね。今回全文検索のからくり部分をしれて、とても勉強になりました。
* この勉強会の趣旨（学習したことを自分の言葉で即アウトプット）もとても素晴らしいと思いました。
* 自分としては、今後も[ownCloudとMroongaのコラボで全文検索](http://owncloud.jp/service/bgt-customization)について勉強していかないといけないと思ってます。
* 形態素解析とか、辞書とか、ドリルダウンとか使いこなせれば、現状のソリューションも利用価値が上がっていくのだろうと
* 技術的要素としては、ownCloudのO/Rマッパー（Doctrineベース）をMroongaに対応させていったり（もうあるかもだけど）
* Ansibleでさくっと構築とか、これは普通に行ける（半分やってる）
* 因みに、最新バージョンのownCloudで自身で作った全文検索機能が動いてなかったり（ownCloud側の問題）、、先にそこFixしないと。。
* といったところで、この勉強会に今後も参加させて貰えればなと思います。
CSSアニメ時のSafariチラツキ問題解消

CSSアニメを実行中、なぜか全くアニメーションと関係ない場所のオブジェクトがプルプルする on Safari。
(何コレ？なんで？なんで？誰か理由をおしえてー！)

そういう時にはこちら。

```scss:_remove-purupuru.scss
%remove-purupuru {
    -webkit-transform: translateZ(0);
    -webkit-perspective: 1000;
    -webkit-backface-visibility: hidden;
    overflow: hidden;
}
```

使い方：プルプルしてるオブジェクトを見つけたら、そいつに対してextendするだけ。

```scss:styles.scss
#purupuru {
    @extend %remove-purupuru;
}
```
bowerやrails-assetsの代替としてjsdelivrを使う


ここ数日、[rails-assetsは終わった](https://github.com/rails-assets/rails-assets/issues/291)とかいやいや[bowerはまだ終わってない](http://bower.io/blog/2015/bower-alive-looking-contributors/)と騒がしいですが、そんな中、最近自分もbowerを最近捨てていたので[^1]そのあたりの話。

# どんな環境か？
- プロダクト全体ではまだbrowserifyなどは使えてない
	- 使いたいけどなかなかそこまで手が回らず・・・
	- browserifyとか使っているのであればbowerからの移行先は基本npmで良いだろう
- bowerはChart.jsとかちょっとしたライブラリを持ってくるのに使っていた。
- bower -> gulpでconcatして出力して管理していた。

このぐらいな環境であれば、jsdelivrはそれなりにおすすめできる。

# 結果：CDNで対応しよう

ある程度有名なライブラリばかりだったので、CDNで対応するのが楽そうだった。

CDNは色々あるが、[jsdelivr](https://www.jsdelivr.com/)を選定した。選定理由はこんな感じ

- ライブラリ数が十分に豊富
	- cdnjsより豊富な気がする（調べてないので体感）
	- jquery.sticky-kitとかはjsdelivrにしかなかった。
- [複数のファイルの同時呼び出し](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)に対応 __(重要)__
- [複数のCDNでBalanicing](https://www.jsdelivr.com/features/multi-cdn-load-balancing)しているらしい
	- これに関してはそこまでがっつり読み込んでない。

個人的には刺さったのが二番目。

例えばjQueryとjQuery UIを取りたいなら

```
https://cdn.jsdelivr.net/g/jquery@1.11.3,jquery.ui@1.11.4
```
こんな具合。
形式としては

```
https://cdn.jsdelivr.net/g/パッケージ名(@version),パッケージ名...
```
という感じ。もっと細かい指定やカスタム指定はjsdeliverのgithubページで見てもらうと良い。

すごく構造化されているので、例えばサーバーサイドでこのURLを構築するのもざっくりこんな具合にさっくりできる。

```ruby

def generate_jsdelivr_url(pkgs)
    path = pkgs.map{ |pkg_name, v| "#{pkg_name}@#{v}" }.join(",")
    "https://cdn.jsdelivr.net/g/#{path}"
end

pkgs = {
    "jquery": "1.11.3",
    "jquery.ui": "1.11.4"
}

generate_jsdelivr_url(pkgs)
// => "https://cdn.jsdelivr.net/g/jquery@1.11.3,jquery.ui@1.11.4"
```

もしCDNでなく自前のサーバーから配信したいなどがあれば、上記のURLをwgetでもすればよいのではなかろうかと思う（良いかはわからんけど、bower捨てる手法としては使えそう）。

### 番外編：jsdelivrに登録されてないライブラリどうするか？
順当にいけばCONTRIBUTEするのが一番。
とはいえ登録は多少面倒なところ[^2]

これに対して便利なのは[npmcdn](https://npmcdn.com/)。
npmに上がっているものは全て使えるので嬉しい。
ただ企業が運用しているしっかりとしたようなものでもないので、
polyfillなどのさほど重要でもないもの利用に留めている。
jsdelivrも自動でnpm配信やってほしい・・・



[^1]: 今回の騒動ありきというわけでもなく「なんか最近globalインストールした場合とそうでない場合で結果が変わる」みたいな問題があったから。何かの兆候だった気もする。

[^2]: しかも面倒な割に数日前に一回[pull requestを投げてみた](https://github.com/jsdelivr/jsdelivr/pull/7768)けどなかなか音沙汰が無い・・・
SSLとIPSecの違い

備忘のためのメモ。

#1)SSL
●SSLの特徴
  - セッション層で実装
  - アプリケーション依存
　　　例）HTTPはHTTPSのためのSSLを実装
　- SSLに対応していないアプリケーションでSSL通信を行う場合は、専用のClientソフトを入れる必要がある。
　　  例）SoftEther等
　- リモートアクセス向き

#2)IPSec
●IPSecの特徴
  - ネットワーク層で実装
  - アプリケーションに依存しない
　- 組織間アクセス向き
　- ユーザ認証方法や、NAPTの仕様が標準化されていない
　- IPSecVPNでリモートアクセスVPN環境を構築する場合、組織内のネットワークにVPNゲートウェイ装置を設置し、ユーザー側のクライアント端末には専用のVPNクライアントソフトウェアを導入する必要がある。さらに、インストール後にはVPNゲートウェイ装置に設定されているパラメータと同じ値をVPNクライアント上でユーザー自身が設定する必要がある。定義するパラメータには以下のようなものがある。

![image](https://qiita-image-store.s3.amazonaws.com/0/100291/84a326fe-b02c-0af8-a9ad-dcec74db11a6.png)
MySQLで今更知ったこと３つ

#１．縦表示にするメタコマンド「\G」
MySQLでとりあえず全表示させるとき

```
SELECT * FROM table_name;
```
カオス…
カラムの数が多い時とかもう見てられない。

```
+----+------------+-------------------------------------------------------+-----------------------------------------+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------------------------+---------------------+---------------------+
| id | date       | k
```

これを縦に表示してくれるのがあるんです！
「;」を「\G」にしてみな！(\gだとダメー)

```
SELECT * FROM table_name\G
```

#２．テーブルのステータスを確認するよ！
```
SHOW TABLE STATUS LIKE 'table_name'\G
```
Auto_incrementとか表示される。便利！

※でもこういうこともあるので注意な。
[MySQLのSHOW TABLE STATUSに騙された]http://qiita.com/TanukiTam/items/b396598c1e2fe208e978
#３．オートインクリメントの値をリセットするよ！
これはrailsのモデルでuserを全削除したのに、
再度ユーザーを作成してもidが１から始まらないよ〜、
というような時に。

まあ、気にしなくてもいいっちゃあいいんですが。

```
ALTER TABLE table_name AUTO_INCREMENT = 1;
```
ただし、既にデータが存在する場合、idの一番大きい数値以上にしないとリセットできません。
[[MySQL] AUTO_INCREMENTのリセットができない場合の対応方法](https://www.crunchtimer.jp/blog/technology/mysql/1562/)を参照のこと。
改　カスタムタクソノミーで選択を強制にする 

```php
//カスタムタクソノミーで選択を強制にする
add_action('admin_print_footer_scripts', 'admin_print_footer_scripts_custom', 21);
function admin_print_footer_scripts_custom() {
    echo '<script type="text/javascript">
      //<![CDATA[
      jQuery(document).ready(function($){
          // default check
          if ($(".categorychecklist input[type=checkbox]:checked").length == 0) {
            $(".categorychecklist > li:first-child > .selectit > input").attr("checked", "checked");
          }
      });
      //]]>
      </script>';
}
#CakePHP 2.1 以降でパラメータにスラッシュ(/ or %2F)を含める

## <i class="fa fa-comment"/> 次の場合に処理できるようにした時のメモ

- `%2F`をパラメータに含む (例: http://---domain---/pages/a%2Fb%2Fc)
- `/`をパラメータに含む (例: http://---domain---/pages/a/b/c)
- **`a/b/c` という値を action で受け取る**

⇒ **Apacheの*.confと、CakePHPのルーティングを設定**

CakePHP2.3.9を利用しています。

## <i class="fa fa-pencil"/> Apache

ApacheはデフォルトでURLに`%2F`を含むと404を返すとのことで`AllowEncodedSlashes`を有効にする。

```
AllowEncodedSlashes On
```

→ これでURLに%2Fを含んでいても404を返さず、処理がCakePHPまで行われる。

参考: http://blog.flatlabs.net/20110307_230227/

## <i class="fa fa-pencil"/> CakePHP 2.1以降

`/`を含むパラメータは`**`で利用できる。

```php:routes.php
Router::connect(
    '/pages/**',
    array(
        'controller' => 'pages',
        'action' => 'index',
    )
);
```

```php:PagesController.php
public function index($param) {

}
```

http://---domain---/pages/a%2Fb%2Fc
http://---domain---/pages/a/b/c

→ `a/b/c` という一塊の値が pages コントローラ index アクション `$param` に渡ってくる。

※ルーティングを設定しないと pages コントローラの a アクションに `b` と `c` という2つの値が渡ってくる。

参考: http://book.cakephp.org/2.0/ja/development/routing.html#connecting-routes
マイナンバーのチェックデジットを JavaScript で計算する

[Ruby 版](http://qiita.com/qube81/items/fa6ef94d3c8615b0ce64) の記事をもとに JavaScript でコードを書きました。並行して JavaScript ライブラリの練習にも取り組みました。

for ループ
---------

```js
function validateMyNumber(myNumber) {

  if (!(typeof myNumber === 'string' || myNumber instanceof String)) {
    return false;
  }

  if (myNumber.length !== 12) {
    return false;
  }

  var sum = 0;

  for (var n = 1; n <= 11; ++n) {
    var p = parseInt(myNumber[11 - n]);
    var q = n < 7 ? n + 1 : n - 5;
    sum += p * q;
  }

  ret = sum % 11;

  if (ret <= 1) {
    ret = 0;
  }

  return parseInt(myNumber[myNumber.length - 1]) === 11 - ret;
}

console.log(true === validateMyNumber('123456789018'));
```

Array.from
----------

ES6 から配列オブジェクトの生成に `Array.from` が使えます。

```js
var myNumber = '123456789018';

var sum = Array
  .from({length: 11}, function(v, k) {
    var n = k + 1;
    var p = parseInt(myNumber[11 - n]);
    var q = n < 7 ? n + 1 : n - 5;

    return p * q;
  })
  .reduce((previous, current) => previous + current);

console.log(206 === sum);

```

RxJS
-----

準備中。

Ramda
-----

```js
var R = require('ramda');

var myNumber = '123456789018';

var ret = R.sum(R.range(1, 11).map(function(n, k) {
  var p = parseInt(myNumber[11 - n]);
  var q = n < 7 ? n + 1 : n - 5;

  return p * q;
}));

console.log(206 === ret);
```
WebP画像フォーマットの整理＆PHPでJPEG->WebP変換したら1/8のサイズになった


## はじめに
自分は知らなかったのですが、チームメンバーより、WebPという画像フォーマットがあることを知りました。Google製というのと、サイズがかなり小さくなるということで検証してみました。

> あまりPHPでやってる事例も無かったので整理がてら投稿しておきます

## WebPとは
* Google: https://developers.google.com/speed/webp/
* wikipedia: https://ja.wikipedia.org/wiki/WebP

> * WebP は、米Googleが開発しているオープンな静止画フォーマット。ファイルの拡張子は「.webp」
> * 2010年9月30日に仕様が公表され、各種ツールと共に提供が開始された。
> * JPEGと比較して25−34%小さくなるらしい。

wikipediaからは上記の通りです。
実は、IE, Safari, iOS では対応していないという話。（ここの最新情報知ってる方いたら教えてください）

## PHPでJPEGをWebPに変換してみる

### 準備
* PHP5.5 以上
* GDライブラリ
* 参考：http://jp2.php.net/manual/ja/function.imagewebp.php

### ソース

```php
// 返値などあまりちゃんと判定してません
$jpeg_path = "hogehoge.JPEG";
$webp_path = "fugafuga.webp"

// 画像読み込み
$img = imagecreatefromjpeg($jpeg_path);		

// 画像変換
$ret = imagewebp($img, $webp_path);

// 画像リソース解放
imagedestroy($img);
```

## 結果: 1/8 になりました
* JPEG画像: 2.8M -> WebP画像: 313K

なんと約1/8程度まで小さくなりました。ちょっと驚きです。たいしたことしてませんが、かなり小さくなることがわかりました。
両方の画像を確認しても、見た目には違いが全くわかりません。というか自分には違いを見つけることがわかりませんでした。


## まとめ
* 変換後のサイズは満足いくものになりました。
* 変換後の画質も自分の目では違いがわからないくらいです。
* Google 製品：Chrome, Android 関連では使えそう。（本当は全部対応してくれれば。。。）

私たちのプロダクトはそれほど大きくありませんが、通信量や表示速度を少しでも効率良くしたいという方には、非常に良いソリューションになるのではないでしょうか。WebPの情報はミクロな部分ではあったのですが、導入事例という形ではクックパッドくらいしかみつかりませんでした。まだまだここからなんですかね。


## 参考
* http://parashuto.com/rriver/development/posibility-of-webp-usage
* http://techlife.cookpad.com/entry/2014/12/04/090000
Is《0+(int*)malloc(1)》well defined in C99?

知人から
http://twitter.com/mohitj83/status/667207656751263744

```
@Nabetani Referring 6.5.6/8 in C99 specs, After [int *p = malloc(1);] (Assume sizeof(int) > 1) succeeds, is [int *q = p+0;] well defined?
```

という質問を受けたので、答えを。

で。
C も C++ も、ポインタは

* 有効なアドレス
* 有効なアドレスの次のアドレス

のいずれかを指していなければならず、そうでない場合は未定義になる。
例えば

```c:c99
int ary[2]={0}
int * p = ary; // well defined.
int * q = ary+1; // well defined.
int * r = ary+2; // well defined.
int * s = ary+3; // NOT well defined.
```

こんな具合。

というわけで、`sizeof(int)==4` なら、

```c:c99
int * p0 = malloc(4);
int * q0 = p0+0; // well defined.
int * r0 = p0+1; // well defined.
int * s0 = p0+2; // NOT well defined.
```

となる。
であれば。

```c:c99
int * p1 = malloc(1); 
int * q1 = p1+0;
```

の `q1` は、`r0` が well defined であるのと同じ理由で well defined となりそうな気もする。
が。
そもそも `p1` が well defined ではないように思う。

`malloc` は「The pointer returned if the allocation
succeeds is suitably aligned」となっていて、引数が 1 の場合の「suitably aligned」が int に合っているとは限らないと思う。

というわけで、私の答えは
「q is not well defined because p is not well defined.」
になった。

全然自信がない。

どう思う？
テストのNG項目や不具合を報告するときは、再現手順と期待する結果との差異を明確に伝えよう

チケットで不具合を起票してもらったり、テストのNG項目について報告を受けた時に気になったこと。

次の2つについて、明確に述べてもらわないと、コミュニケーションに時間がかかってしまう。

1. 再現手順
2. 期待する結果との差異

再現手順がわからないと、そもそも何が起きているのかもわからなかったりする。
手順が書いてあっても、曖昧だと途中を埋めるための推理ゲームや伝言ゲームがはじまって、それだけでもへとへとになったり。もちろん、再現手順が確立できないときもあるので、それならその旨伝えてもらえればOKです。発生した時刻がわかれば、ログから条件を見つけられる余地があるので。

期待する結果との差異がないと、何が問題かがわからない。見た目の話でこれがおきると、キャプチャーを送ってとかどうとか、なにかと面倒。

意図することを誤解なく伝える努力は大事。
Active Record AssociationからModelのクラスメソッドを呼んだら想定していなかったクエリが飛んだ

端的に言えば、```Association``` からクラスメソッドを呼ぶと、```Association``` に属するレコード群に対してメソッドが呼ばれて少しハマったという話。

# やりたかったこと
ユーザーが商品を購入するサービスで、商品毎の購入者番号(```Buyer.number```)を購入順で振りたい。

## 実装
### Model
サービス利用者である```User``` は、購入者情報である```Buyer```を複数持ち、```Buyer```は```User```と```Product```に結びつく

```app/model/user.rb
class User < ActiveRecord::Base
  has_many :buyers
```

```app/model/buyer.rb
class Buyer < ActiveRecord::Base
  belongs_to :user
  belongs_to :product

  # Productに対する購入者番号を自動で割り振りつつRecordを生成
  def self.create_by_product(product)
    create(product_id: product.id, number: current_provided_number(product))
  end

  # 現在割り振られる購入者番号
  # Productの購入者がいないなら1を、いるなら現在の最大購入者番号+1を返す
  def self.current_provided_number(product)
    if exists?(product_id: product.id)
      current_last_buyer = where(product_id: product.id).order('number ASC').last
      current_last_buyer.number + 1
    else
      1
    end
  end
```

### Controller
購入時に```User```にひも付ける形で```Buyer```を生成

``` app/controller/products_controller.rb
product.with_lock { user.buyers.create_by_product(product) }
```

# 実行結果
## 期待してた挙動
>```app/model/buyer.rb
if exists?(product_id: product.id)
      current_last_buyer = where(product_id: product.id).order('number ASC').last
```

のif節内で

```mysql
WHERE `buyers`.`product_id` = 12 LIMIT 1
```
のようなクエリが飛ぶと思っていた。

## 実際の挙動
```mysql
WHERE `project_sponsors`.`user_id` = 3 AND `project_sponsors`.`project_id` = 12 LIMIT 1
```
これが飛んだ。

# 原因と解決策
```
user.buyers.create_by_product(product)
```
といった呼び方をしたため、意図せず```user_id```でも絞り込みがかかってしまった。

解決策としては、基本的に呼び出す側で気をつけましょうというのが一番正しいと思う。
ただ、絶対に```Association```ではなくて```ActiveRecord```そのものに対して呼びたいメソッドである場合、```unscoped```使うとかもありなのかも。

```app/model/buyer.rb
class Buyer < ActiveRecord::Base
  ...

  # 現在割り振られる購入者番号
  # Productの購入者がいないなら1
  # いるなら最大購入者番号+1を返す
  def self.current_provided_number(product)
    unscoped do   # どこから呼ばれようとBuyerそのものに対してクエリを投げる
      if exists?(product_id: product.id)
        current_last_buyer = where(product_id: product.id).order('number ASC').last
        current_last_buyer.number + 1
      else
        1
      end
    end
  end

```

こんな感じで。
ひょっとしたらアンチパターンかもしれないけど。