OmniAICreator/Qiita-1.07M huggingface dataset:
CATextLayerにセットした文字列を参照したい場合は、NSStringかNSAttributedStringにcastしよう


CATextLayerにセットした文字列を比較しようとしたらエラーにぶち当たった。

```ex-1

let layer = CATextLayer()
layer.string = "test"

if(layer.string == "test") {
}


```

if文で「Cannot convert value of type 'AnyObjct?' to expected argument type 'String'」とエラーが出る。
で、Documentを見ると

```
The text must be an instance of NSString or NSAttributedString. Defaults to nil.
```

となっているのでcastしてやらないといけない。
よって最初のソースを以下のように修正すればいける。

```ex-2

let layer = CATextLayer()
layer.string = "test"

let s = layer.string as! NSString //←追加

if(s == "test") {
}


```

以上、ちょっと戸惑うのでアップ。多分忘れた頃にまた同じことで悩みそうなので。
cronの出力をメールでなくSlackに送る方法

概要：crondのオプションでsendmailの代わりに独自スクリプトのパスを指定する

crondにはcronie, fcron, vixie-cronと色々種類があり、対応オプションも違うと思う。ここではcronieを使っているものとする。

sendmailの代替スクリプトを作成（`url`を自分のIncoming WebhookのURLで置き換えること）

```/usr/bin/sendmail.slack
#!/usr/bin/env ruby

require "json"
require "faraday"

url = "***** SlackのIncoming WebhookのURL *****"

message = $stdin.read

payload =
{
    "channel": "#general",
    "username": "sendmail.slack",
    "text": message,
}

res = Faraday.post url, JSON.generate(payload), content_type: "application/json"
puts res.status
puts res.body
```

faradayを使っているので

```
gem install faraday
```

としておいてください。

```
systemctl edit cronie
```

```/etc/systemd/system/cronie.service.d/override.conf
[Service]
# ↓既存のExecStart=を上書きするには、これでクリアする必要がある。
ExecStart=
ExecStart=/usr/bin/crond -n -m /usr/bin/sendmail.slack
```

```
systemctl daemon-reload
systemctl reload cronie

ps aux | grep crond

### crond が /usr/bin/crond -n -m /usr/bin/sendmail.slack で起動していることを確認
```

以上。

`journalctl -u cronie -f`しつつ適用にcronジョブを設定して動作確認。


## 追記

よく考えたら、ジョブの指定で末尾に

```
2>&1 | /usr/bin/sendmail.slack
```

とする方法でもよかったかもしれない。
CMakeの参考サイト

# Cmake

OSやコンパイラに依存しない方法でのテストソフトウェアやパッケージソフトウェアをビルドできるツール。

> CMake is an extensible, open-source system that manages the build process in an operating system and in a compiler-independent manner

[公式](https://cmake.org/about/)より引用。

# ■ 参考サイト

* [公式](https://cmake.org)
* [公式Wiki](https://cmake.org/Wiki/CMake)
* [PuWiki](http://www.wakayama-u.ac.jp/~chen/cmake/cmake.html) 
* [簡単な使い方](http://qiita.com/termoshtt/items/539541c180dfc40a1189)
[学習記録]Rails TouTorial 	1日目


##本日の進行状況

第1章...終了
第2章...終了
第3章...終了

本編と関係ないところでエラー。

`fatal: remote origin already exists.`

と出て、gitにpushできない。

originを削除して、無事push完了。

###参考URL
[Gitで fatal: remote origin already exists. というメッセージが出る場合]
(http://pyoonn.hatenablog.com/entry/2014/10/29/191744 "Gitで fatal: remote origin already exists. というメッセージが出る場合")

`bundle exec rake test`は完璧に確認できるわけではないが、想定通り実行できているかのチェックにはなる。
何より達成感があって楽しい（笑）

第4章...終了

演習1)文字をシャッフルする関数

`s.split('').shuffle.join`

演習2)shuffleメソッドを Stringクラスに追加

`self.split('').shuffle.join`

演習3)3つのハッシュ

```
person1 = {first:"Yamada", last:"Taro"}
person2 = {first:"Yamada", last:"Hanako"}
person3 = {first:"Yamada", last:"jiro"}
params = {}  
params[:father] = person1
params[:mother] = person2
params[:child] = person3
params[:father][:first]
```

本日は第5章まで終了。
[Unity] ちょっとしたTipsメモ


Unityを使っていく上で、知っておくと便利そうなTipsをメモしていきます。

以前Unityを始めたばかりのころに、「[Unityを触り始めたのでメモ（C#編）](http://qiita.com/edo_m18/items/e15b679596abfcad8f32)」という記事を書いているので、よかったらそちらも見てみてください。

## オブジェクトの位置を元に、スクリーンにGUIをオーバーレイさせる

Unityの[ドキュメント](http://docs.unity3d.com/ja/current/Manual/UNetSetup.html)を見ていて知ったやつです。

例えばプレイヤーの位置にHPバーを表示したり、名前を表示したり、みたいなやつです。

```csharp
using UnityEngine;
using System.Collections;

public class HealthBar : MonoBehaviour
{
    GUIStyle healthStyle;
    GUIStyle backStyle;
    
    void OnGUI() {
        InitStyles();
        
        // Draw a health bar.
        Vector3 pos = Camera.main.WorldToScreenPoint(transform.position);
        
        // draw health bar background
        GUI.color = Color.grey;
        GUI.backgroundColor = Color.grey;
        GUI.Box(new Rect(pos.x - 26, Screen.height - pos.y + 20, 10), ".", backStyle);
        
        // draw health bar
        GUI.color = Color.green;
        GUI.backgroundColor = Color.green;
        GUI.Box(new Rect(pos.x - 25, Screen.height - pos.y + 21, 5), ".", healthStyle);
    }
    
    void InitStyles() {
        if (healthStyle == null) {
            healthStyle = new GUIStyle(GUI.skin.box);
            healthStyle.normal.background = MakeTex(2, 2, new Color(0f, 1f, 0f, 1f));
        }
        
        if (backStyle == null) {
            backStyle = new GUIStyle(GUI.skin.box);
            backStyle.normal.background = MakeTex(2, 2, new Color(0f, 0f, 0f, 1f));
        }
    }
    
    Texture2D MakeTex(int width, int height, Color col) {
        Color[] pix = new Color[width * height];
        for (int i = 0; i < pix.Length; i++) {
            pix[i] = col;
        }
        Texture2D result = new Texture2D(width, height);
        result.SetPixels(pix);
        result.Apply();
        return result;
    }
}
```

## サーフェースシェーダでの「IN.screenPos.w」

いくつかのシェーダを見ていて以下の記述があることに気づく。

```HLSL
float2 screenUV = IN.screenPos.xy / IN.screenPos.w;
```

どうやらこれは、スクリーン座標を `0.0～1.0` に簡単に正規化する方法らしい。
要は要素として余った `w` に、正規化を手助けするための数値が予め入っているからそれを使おう的な話だと思う。

## Gizmoを表示する

選択されたときなどに、Gizmoをカスタムで表示させたりすることができる。
具体的には以下のスクリプトをアタッチすると表示される。

```csharp
public class Gizmo : MonoBehaviour
{
    [SerializeField]
    float _gizmoSize = 0.3f;
    
    [SerializeField]
    Color _gizmoColor = Color.yellow;
    
    void OnDrawGizmoSelected()
    {
        Gizmos.color = _gizmoColor;
        Gizmos.DrawWireSphere(transform.position, _gizmoSize);
    }
}
```

例ではSphereを表示するものだけど、他にもいくつか種類がある。
（詳細は[ドキュメント](https://docs.unity3d.com/jp/current/ScriptReference/Gizmos.html)を参照）


## Logに色をつけたりフォーマットを適用する

```csharp
Debug.LogFormat("<color=green>{0}</color>", gameObject.name);
```
Slackとの連携　その１～準備編～

# まずは連携の準備から

1.Slackとの連携テスト
以下の順にどんどん進めていく。
![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/bc7b5474-21f1-93f0-6c67-ae47412a18d0.png)

　↓ ↓ ↓

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/211b1af3-eee1-c7e7-5b90-6b54b99f8d42.png)

　↓ ↓ ↓

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/a63e5a7b-961d-2989-4357-ce89efe219bd.png)

　↓ ↓ ↓

![4.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/e5e56bdd-482d-63b1-6d46-2e030245a2b3.png)

　↓ ↓ ↓

![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/2f77af37-2894-2427-369d-b64bf7df4357.png)

　↓ ↓ ↓

![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/f1996f19-ec3c-af4e-0cb9-318e609230b6.png)

　↓ ↓ ↓

![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/6f223da3-840e-3641-d1e2-bd1e9af4504b.png)
　
　
　
2.まずはコマンドから連携のテスト
うまいこと結果が返ってきた。
![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/17c13709-1d08-f2e0-51df-f2783a6c1ea7.png)
　
　
3.Scalaのコードで連携のテスト
コードは以下のとおり。


```scala:JsonTest.scala
object JsonTest {

  def main(args: Array[String]): Unit = {

    val r = scala.io.Source.fromURL("https://slack.com/api/auth.test?token=トークン")

    var json = ""

    for (s <- r) {json = json + s}

    print(json)

  }
}
```
　
Scalaのコードでも連携できた。
![11.PNG](https://qiita-image-store.s3.amazonaws.com/0/64360/9135db44-b9a2-7457-fc28-9f9bfd08ef8c.png)


## 今後試したいこと
・Slackにメッセージを投げる
・Slackから通知を受け取る
Electronでよく使いそうなネタの覚え書き

## jQueryを使う
jQueryはおそらく'module'あたりの名前がかち合っているため使用できない。
どうしても使いたい場合は、BrowserWindowのオプションで`nodeItegration:false`
を指定する。

```js:こんな感じ
win = new BrowserWindow({
    webPreferences: {
        nodeIntegration: false,
    }
});
```

**というか、[zepto.js](http://zeptojs.com/)のような互換ライブラリを使った方が楽。**

## 複数インスタンス起動を禁止する
[app.makeSingleInstance](http://electron.atom.io/docs/api/app/#appmakesingleinstancecallback)でできる。

## リンクをデフォルトブラウザで開く
`webContents.new-window`イベントを引っかけてURLを取得し、`shell.openExternal()`で開く

```js:メインプロセス内のコード
    mainWindow.webContents.on('new-window', (ev,url)=> {
        shell.openExternal(url);
    });
```

## コンテキストメニューを開く
contextmenuイベントのリスナーで、メインプロセスの`Menu.popup()`を使用して開く
## コンテキストメニューでカット、コピー、ペースト
カット、コピー、ペーストは専用の`MenuItem.role`が用意されているので、それを使うだけ。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <script src="../zepto.min.js"></script>
</head>
<body>
   てすと
    <script>
        const {Menu, MenuItem} = require('electron').remote;
        $('body').on('contextmenu', ev=> {
            ev.preventDefault();
            let menu = Menu.buildFromTemplate([
                {role:'copy'},
                {role:'cut'},
                {role:'paste'},
            ]);
            menu.popup();
            return false;
        });
    </script>
</body>
</html>
```

## 名前を付けて保存
`webContents.downloadURL()`だけで、保存先を選択するダイアログ表示→保存までできる。楽。

```js:sample
    mainWindow.webContents.downloadURL(URL);
```

## モーダルウィンドウ、モーダルダイアログ
BrowserWindowのオプション`parent`と`modal`を指定する。
ダイアログの場合は第1パラメータに親ウィンドウのBrowserWindowオブジェクトを指定する。

モーダルなウィンドウ/ダイアログは、これらを閉じるまで親ウィンドウの操作はできない。

```js:モーダルウィンドウ
    const subWindow = new BrowserWindow({
        parent: mainWindow,     //親ウィンドウのBrowserWindowオブジェクト
        modal: true,
    });
    subWindow.loadURL(`file://${__dirname}/subwindow_content.html`);
```

```js:モーダルダイアログ
    dialog.showMessageBox(mainWindow, {
        type: 'info',
        message: 'モーダルダイアログのテストですよ',
    });
```

## フォーカスを奪わないウィンドウを開く
`window.show()`ではなく`window.showInactive()`で開くだけ。

```js
    const subWindow = new BrowserWindow({
        parent: mainWindow, 
        show: false,
    });
    subWindow.loadURL(`file://${__dirname}/subwindow_content.html`);
    subWindow.showInactive();
```

## ダイアログのボタン
`dialog.showMessageBox()`の`buttons`オプションでボタン名を指定しても、'ok' 'yes' 'no'等はボタンで表示されるが、それ以外はリンクで表示されてしまう。

```js
    dialog.showMessageBox(mainWindow, {
        type: 'info',
        message: 'ダイアログのテストですよ',
        buttons: ['OK', 'yes', 'no', 'リンク？'],
    });
```

![SnapCrab_electron_test_2017-4-18_22-46-27_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/97959/89297add-c3d9-f4cc-d13a-29c0f58d2e71.png)

全部ボタンにしたいときは`noLink: true`オプションを追加する。

```js
    dialog.showMessageBox(mainWindow, {
        type: 'info',
        message: 'noLink:true',
        buttons: ['OK', 'yes', 'no', 'ボタン'],
        noLink: true,
    });
```
![SnapCrab_electron_test_2017-4-18_22-46-14_No-00.png](https://qiita-image-store.s3.amazonaws.com/0/97959/a20bbb6a-52ec-9263-f356-3e321f2eb21e.png)
カメラ関連の自前記事の整理

今までに書いたカメラ関係の記事を整理します。

-  訳　[カメラ校正](http://qiita.com/nonbiri15/items/5e59dea66d7733d6d6a3)
    -  OpenCV3.0-beta [OpenCV-Python Tutorials](http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html)への和訳です。
    -  OpenCV 3.1.0 [OpenCV-Python Tutorials](http://docs.opencv.org/3.1.0/d6/d00/tutorial_py_root.html) がリリースされています。
- [OpenCV-Python Tutorialsの「カメラ校正」への補足](http://qiita.com/nonbiri15/items/e36c12d444d7cc4a00b7)
    - ステレオカメラ関係の情報を追記しました。MeshLabを使ってステレオカメラの結果を3次元表示するのがお勧めです。視差画像を0-255の範囲で正規化して画像ファイルに保存して表示させるのは推奨しません。できればpythonでmatplotlibのimshow()を使って表示することを推奨します。その場合だとjetなどのcolorbarの表示を付けることができますし浮動小数点の行列をcolorbarの上限と加減を、plt.imshow(mat, vmin=-10.0, vmax=20.0)などのようにしてあつかえるので、参考にしてください。その他のことも書いています。
  
- [LinuxでUVC(USB Video Class)タイプのUSBカメラを使う](http://qiita.com/nonbiri15/items/9593d61a2be81f2b31a9)
    - カメラ関係のプログラムを書く際には、Windowsだけではなくとか、Linuxとで状況が違ってくることがあります。そこで気づいた範囲のことを記述しています。RaspberryPiでは簡単にUSBカメラを使う事ができますし、RaspberryPiの専用カメラの性能があがってきています。カメラ関係の記事が多い「インタフェース」の紹介を示しました。
- [外部トリガーが可能な種類のUSBカメラを調査中](http://qiita.com/nonbiri15/items/bfc9254cba943c110d56)
    - ステレオカメラやロボット用に用いる場合、カメラの取得した画像がいつのタイミングで取得されたかがとても重要になります。特にOpenCVのVideoCaptureでは、画像がバッファリングされているので、画像をreadする頻度が少ないと、数秒前の画像を取得していたということにもなりえます。
- [USB3.0 カメラについて調査中](http://qiita.com/nonbiri15/items/1b2123b76e8b6b88fe28)
    - USB2.0の場合だと、解像度とカメラの接続台数とフレームレート（fps）の組み合わせに制限が大きくなりがちです。USB3.0では帯域が大きく広がるため、解像度の高いカメラを複数接続することが可能になります。 
- [市販 Stereo Cameraについて調査中](http://qiita.com/nonbiri15/items/d341e68f9aa9345211a2)
    - Stereo Cameraの市販品とその他の距離センサの1例を示しています。
- [M12(Sマウント)のレンズについて調査中](http://qiita.com/nonbiri15/items/635ba96cf2c8f82f5040)
    - 組み込み機器に使うためには、M12のレンズを使う場合が多いので、M12のレンズについての調査をしやすくするためのメモを作成中です。
- [Stereo Matching をハードウェアで加速する](http://qiita.com/nonbiri15/items/6e9149ac237ec23bb657)
    - Stereo Cameraでのブロックマッチングの処理速度を向上させるのには、マルチコアの利用、GPGPUの利用、FPGAの利用があります。FPGAは消費電力あたりの演算性能を高めることができるでしょうが、画像サイズやフレームレートなどの前提条件が違ったときには、それまでの設計が無効になってしまうリスクがあります。
- [Jetson TK1　TX1について調査中](http://qiita.com/nonbiri15/items/f18d0aab15a0c8590f96)
    - Jetson TX1ではドローンで撮影する画像の認識などがリアルタイムで可能な演算能力がある。そこでJetsonについての調査中の記事を書いています。

- [Camera Serial Interface(CSI-2)のカメラを使う](http://qiita.com/nonbiri15/items/a60bcb6ba6acef4ba685)
    - RaspberryPi3の専用カメラに使われているインターフェースであるCSI-2についての調査中の記事。このインターフェースはJetson TX1にも使われている。カメラモジュールの性能を最大限に引き出すには、USBインターフェースでは限界がある。

- [SDKがオープンソース化したステレオカメラが市販されている](https://qiita.com/nonbiri15/items/320591d7cd80b1d304d5)
- [デュアルカメラを利用した携帯電話](https://qiita.com/nonbiri15/items/06eb1360d034877bc776)
CentOS6にRe:dashをインストールする

CentOS6系の環境にRe:dashをインストールした時のメモ。

Re:dashの[公式サイト](http://docs.redash.io/en/latest/setup.html#docker-compose
)によると、CentOSではDockerを使ってセットアップするとのこと。
Dockerの[公式サイト](https://docs.docker.com/engine/installation/linux/centos/)を見に行くとCentOS7でしか動かないとのこと。

>Docker requires a 64-bit installation regardless of your
>CentOS version. Also, your kernel must be 3.10 at minimum, 
>which CentOS 7 runs.

調べてみると、`docker-engine 1.7.1`、なら動くようなので、下記のサイトを参考にさせて頂きセットアップした。

https://gist.github.com/tamamushi/be848daa1fedfee45fdb312f980ce7c2


```
$ sudo yum update

$ sudo tee /etc/yum.repos.d/docker.repo <<- 'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

$ sudo yum install docker-engine
```

`docker-engine.x86_64 0:1.7.1-1.el6` がインストールされた。

自動起動を設定する

```
$ sudo chkconfig docker on

$ sudo tee /etc/sysconfig/docker <<- 'EOF'
other_args="-H tcp://127.0.0.1:4243 -H unix:///var/run/docker.sock"
EOF
```

docker-compose をインストール

```
$ sudo sh -c "curl -L https://github.com/docker/compose/releases/download/1.5.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose"

$ sudo chmod +x /usr/local/bin/docker-compose
```

CentOS6.4の場合、docker起動でエラーになったので、device-mapper-develをインストールした。

```bash:/var/log/docker
/usr/bin/docker: relocation error: /usr/bin/docker: symbol dm_task_get_info_with_deferred_remove, version Base not defined in file libdevmapper.so.1.02 with link time reference
```

```
$ sudo yum install device-mapper-devel
```

後は公式サイトに従って、Re:dashをセットアップする。

```
$ git clone git@github.com:getredash/redash.git

$ cd redash

# とりあえずdocker-compose-example.ymlをそのまま使う
$ cp docker-compose-example.yml docker-compose.yml

$ docker-compose up postgres

$ ./setup/docker/create_database.sh

$ docker-compose up
```

起動したホストの80番ポートでRe:dashが起動している。
Carrierwaveでアップロードした画像に特定の新しいバージョンを追加する


例えば、こういうバージョンを作って運用してたとします。

```

  version :thumb_1000 do
    process :resize_to_fit => [1000, 1000]
  end

```


あとで別のバージョンを追加しようとした場合、こう書きますが

```
  version :thumb_600 do
    process :resize_to_fit => [600, 600]
  end

  version :thumb_1000 do
    process :resize_to_fit => [1000, 1000]
  end

```


これで既存のファイルからバージョンを作ることができます。

```

User.all.each { |user| user.image.recreate_versions! }

```

このメソッドは既にあるバージョンも作り直すため、引数でバージョンを与えるとそのバージョンだけ作ってくれます。

```

User.all.each { |user| user.image.recreate_versions!(:thumb_600) }

```


削除するときは

```

User.all.each do |user|
  path = File.delete(user.image.thumb_600.current_path)
  File.delete(path) if File.exists?(path.to_s)
end

```

こんな感じかなぁ。。スマートじゃないけど。。
sshとsshdの違い

* ssh(クライアント) : 他のサーバにsshで接続する設定
* sshd(デーモン)    : 他のサーバからsshで接続されるときの設定

sshdは他のサーバのsshクライアントから実行されたコマンドを実行する。

そのため、sshd の動作していないマシンには、ssh クライアントでログインできない。


```shell-session

* ssh
ssh (SSH client) is a program for logging into a remote machine and
for executing commands on a remote machine.

* sshd
sshd (OpenSSH Daemon) is the daemon program for ssh(1). Together
sshd listens for connections from clients. 

```

# ■ 設定ファイル

```
* sshの設定ファイル
 /etc/ssh/ssh_config

* sshdの設定ファイル
/etc/ssh/sshd_config
```
macから簡単にファイルアップロードを行う

macから簡単にscpさせたいなぁ
なんか公開鍵認証の設定とかめんどくさそうだなぁと思いつつ作ったファイルアップロード用シェルです。
（[前回](http://qiita.com/t114/items/c44c9200b191342dcbb8)の記事同様sshpassにより書き換え可能なため、あとでsshpass版も追記予定）

アップロード元rootディレクトリ：/Users/user/Desktop/test/src/

アップロード先rootディレクトリ：/home/pi/Desktop/test/src/
アップロード先ipアドレス:192.168.0.10
アップロード先user名:pi
アップロード先password:raspberry


```bash:upload.sh
#!/bin/sh
lRoot=/Users/user/Desktop/test/src/
hRoot=/home/pi/Desktop/test/src/

password='raspberry'
host='192.168.0.10'
id='pi'

expect -c "
set timeout 10
spawn scp -p $lRoot$1 $id@$host:$hRoot
expect \"password:\"
send \"$password\r\"
interact
"
```

# 使い方

アップロードしたいファイルが/Users/user/Desktop/test/src/sample.py
アップロード先が/home/pi/Desktop/test/src/の場合は下記の様になる。

```
. upload.sh sample.py
```

シェル実行後、/home/pi/Desktop/test/src/sample.pyにアップロードされる。


# 2016/9/27:追記
  - sshpassを導入した場合

```
brew install http://git.io/sshpass.rb
```

```bash:auto_login.sh
#!/bin/sh
lRoot=/Users/user/Desktop/test/src/
hRoot=/home/pi/Desktop/test/src/

password='raspberry'
host='192.168.0.10'
id='pi'

sshpass -p $password scp -o StrictHostKeyChecking=no $lRoot$1 $id@$host:$hRoot

```
iOSのPUSH通知ができなかった問題を解消した時のメモ

結論から言うと自分の設定ミスだったのだが、色々試行錯誤した時のメモ

# 結論

TargetのCapabiliiesでPush NotifictionsをOFFにしてしまっていたため。
Background Modesの Background fetch、Remote notificationsはONしてしていたが、こちらだけONにしても受け取れない(DeviceTokenは受け取れます)

# 環境

+ Xcode8.0
+ 実機iPodTouch(iOS9.3)で確認

# 状況

+ Push通知で利用するDeviceTokenは取得できる
+ しかし、APNsにPushメッセージを送信を行った時にStatusCode8(Invalid Token)が返却され、Push通知時にiOSで呼ばれるはずのdidReceiveRemoteNotificationが呼び出されない

# やったこと

+ 「状況」の所でAPNsから返却ステータスコードを書いているが最初はそれが分かってなかったため、APNsからの返却値が何であるかは最初に確認したほうが良いだろう
+ InvalidToken 8 とかでググってみる。iOSで取得できるデバイストークンの設定をミスしたときなども同様のエラーとなるようだった。(実際に取得できたデバイストークンとAPNsへ送信する時のデバイストークンが違うなど）しかし、今回はこれが原因ではない
+ 証明書?などの設定ミスなどの可能性もあることがあるようだったのでAppIDの作成や証明書の作成などすべてを最初からやり直したが解消せず
+ 追加でググったりすると以下の記事を発見

[プッシュ通知の配信済みエラー](https://github.com/NIFTYCloud-mbaas/UserCommunity/issues/284)

+ 自分の設定を再度見直すとCapabilitiesでPushNotificationsという設定があり、これがOFFになっていた
+ ONに変更し、再度アプリを動かすことでPush通知が出来た

# その他調べた時のメモ

+ 今回と同じInvalidTokne8と同じ事象になるかは不明だが、Deploymnet用の設定で、ProductionのPushをしようとするとエラーとなることがあるらしい(APNsのエンドポイントが違う)


# 感想

自分が悪いと言えば悪いのですが、iOSなりAPNsのステータスコードでもうちょっと分かりやすいエラーコードを出してくれると嬉しいなぁ。。。(ずばりPush通知設定がされていないよというメッセージを出すなど)
[作業メモ]dockerのログ管理をElasticsearchで行う(on CentOS6.x)

## やりたいこと

0. ローカルにログを出さないようにする + コンテナだけでログを管理したい
1. ElasticSearchでのログ管理の手間を可能な限り省きたい
2. CentoOS 6.x = docker v1.7.1で行いたい

## やったこと

1. dockerのログ出力を__none__か__syslog(udp)__に統一する
2. ログ収集のためのfluentコンテナを動かす
3. Elasticsearchのログを自動削除する__[curator](https://github.com/elastic/curator)__コンテナを立てる


## 構成

すべてのコンテナのログは`udp://localhost:5410`に出力をするようにした
fluentが`24224`(fluent forward)と`5140`(syslog)で受け付けてelasticSearchに流すことでログの取得に対応。

### Fluentの設定

下記のような設定になった。
コンテナの出してくるメッセージが正直どうなるかわからないので全て__message__にしてしまっている。
コンテナの起動順序によってはfluentが起動していないこともあるのでtcpではなくudpで。

formatを作るのには[Fluentular](https://github.com/Tomohiro/fluentular)が大変便利でした。感謝。

```conf
<source>
  type forward
  port 24224
  bind 0.0.0.0
</source>

<source>
  @type syslog
  port 5140
  bind 0.0.0.0
  tag syslog
  protocol_type udp
  format /^(?<time>[\dTZ\:\-]+Z)\s+(?<host>[\w\d\.]+)\s+(?<container_id>[\w\/\d]+)\[(?<row>\d+)\]\:\s+\[(?<timeorigin>[^\]]+)\]\[(?<level>[^]]+)\]\[(?<ident>[^\]]+)\](?<message>.*)$/
  time_format %Y-%m-%dT%H:%M:%SZ
</source>
```


### Curatorの自動実行

cronで行うつもりであったが手元のArch上のコンテナでは動作するのにVM上のCentOS6では動作しない現象にハマったため断念。
scriptのuidが違う事あたりが問題だろうか?
cronにこだわる理由もないため__[schedule](https://pypi.python.org/pypi/schedule)__を使う方向に変更した。
[elastic curator](https://github.com/elastic/curator)はPythonで動く為の選択で、定時系は決まったツールを入れてしまっても良いと思う。

## まとめ

以上そのへん諸々は[Github](https://github.com/uzuna/elasticseach-centos6)にまとめてある。
似たような制約に悩む人の参考になれば幸い。
(Machine Learning Masteryから要約)ディープラーニング性能改善の方法


[How To Improve Deep Learning Performance | Machine Learning Mastery](http://machinelearningmastery.com/improve-deep-learning-performance/)

このポストに、性能改善の方法がとても良くまとまっています。

今後の参照のため要約してみましたが、著者の意向で一旦公開を見合わせます。

必要な方は個人的にご連絡下さい。
SVGフィルタ サンプル集


## SVGのフィルタとは

お絵かきソフトでよくある、画像に特殊効果をかけられるみたいなやつです。効果をかける対象はSVG要素に限らず、DOM要素ならなんでも効果の対象にできます。
有名どころでは以下のようなフィルタがあります。

### ぼかし

`<feGaussianBlur>`
![image](https://qiita-image-store.s3.amazonaws.com/0/40921/3bcf82a8-053f-de28-9c2b-2b63aa88d1dc.png)
__Demo__ http://codepen.io/tanishi/pen/LRWBJd
__Docs__ https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feGaussianBlur

### 色の変換

`<feColorMatrix>`
![image](https://qiita-image-store.s3.amazonaws.com/0/40921/9855bc41-55b1-debe-dc40-8883386a1f11.png)
__Demo__ http://codepen.io/tanishi/pen/RGpBEE
__Docs__ https://developer.mozilla.org/ja/docs/Web/SVG/Element/feColorMatrix

![image](https://qiita-image-store.s3.amazonaws.com/0/40921/537d208a-777a-f667-a7cc-5bc17895d5e5.png)
__Demo__ http://codepen.io/tanishi/pen/PGpXdN

---

このように、フィルタは単体で使っても十分強力です。
でも組み合わせて使うことでさらに面白い効果をかけられます。

## 組み合わせたフィルタ

### ゆがみ

`<feTurbulence>` __+__ `<feDisplacementMap>`
![image](https://qiita-image-store.s3.amazonaws.com/0/40921/a10eb4e6-388a-fcdf-6897-2e068a7ded4b.png)

__Demo__ http://codepen.io/tanishi/pen/LRWrbX
__Docs__ :one: [feTurbulence](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feTurbulence) :two: [feDisplacementMap](https://developer.mozilla.org/ja/docs/Web/SVG/Element/feDisplacementMap)

微妙に形が異なる軽度のゆがみを次々に適用していくことで、輪郭がジマジマする味のある効果が作れます。

(css-tricksから引用)
https://css-tricks.com/squigglevision-in-css-and-svg/
![__360.gif](https://qiita-image-store.s3.amazonaws.com/0/40921/80bf0330-b7bc-bacd-541b-3a9be3249af3.gif)

### 引き合う境界線

`<feGaussianBlur>` __+__ `<feColorMatrix>`
![c.gif](https://qiita-image-store.s3.amazonaws.com/0/40921/7438d6e8-cb1c-bc64-043b-b1f72825ddad.gif)
__Demo__ https://codepen.io/tanishi/pen/vXgKkv
__Docs__ :one: [feGaussianBlur](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/feGaussianBlur) :two: [feColorMatrix](https://developer.mozilla.org/ja/docs/Web/SVG/Element/feColorMatrix)

---

他にも面白い効果がかけられるフィルタがあれば教えてください。追記していこうと思います。
列車遅延状況をPowerShellで取得する

# 列車遅延状況をPowerShellで取得してみた

## 動機

- 列車の遅延状況をチャットに流したいなぁと思った
- 公開APIを使ってみる練習

## 実際に使ったもの

- Yahoo!Japan路線情報 の [運行情報(関東)](http://transit.yahoo.co.jp/traininfo/area/4/)
- PowerShell 5.0 (Windows10)
- PowerShell ISE

## ソース

[Gistにあげたのでそちらを参照](https://gist.github.com/ponpoko04/875dbe62acfbaa69eccddff5794f77a2)

## 苦労・工夫した点など

- あまり最新バージョンのPowerShellに依存しないようにした(たぶん3.0でも動くはず、これから試す)
    - 開発したのはWindows10だが、会社のマシンはWindows7なので
- 最初は無償APIを探していたが、遅延や事故情報は有償APIでの提供しか見つけられなかったのでスクレイピングに変更
    - 最初は[鉄道コム](https://www.tetsudo.com/traffic/)さんのRSSを利用しようとしたけど、小湊鐵道がずっと出ていてなんかおかしかったので・・・
    - ググったらYahooの路線情報をスクレイピングしていた人がいたので
- あまり激しくアクセスすると迷惑をかけてしまうため、引数でキャッシュを見るか再取得するか選べるようにした
- WebのフロントでJavaScript触るときはjQueryが多かったから、生のDOMいじりに悶絶した
- PowerShellちゃんと使ってみたの初めてだったけど、便利！
JPG无损压缩工具介绍

大家都知道JPG是一个图片格式.已经经过了优化和压缩.所以在分享很多图片的时候一般都直接打包选择不压缩.然后主要是可以    变成一个文件方便分享.因为确实目前大众化的压缩格式比如 `zip` `7z` `rar`都不能很好的压缩图片。

以前在逛 [maximumcompression](http://www.maximumcompression.com/data/jpg.php) 的时候凑巧也看到了一个新的JP    G算法.压缩率可以在 70% ~ 85% 之间.比起之前传统压缩软件的 99% ~ 101% 要好太多了.

自己粗略的找了下 然后在 `GitHub` 上找到了这个名字叫 [PackARC](https://github.com/packjpg/packARC) 的软件.意外的它除了能更好的处理 JPG 格式以外,还能优化 MP3 和 BMP 格式.

下面这个图是一个文件夹(包含了1000+的jpg图片,和一些文本文件),和用`PackARC`打包后的pkg文件大小对比.效果还是比较可观的
![](https://ws3.sinaimg.cn/large/677ca070gw1f5ho7j8l9cj20el03wdgk.jpg)
下载源码后.可以直接在Linux下进行编译,也可以在[这里](http://packjpg.encode.ru/?page_id=21)下载到预编译的二进制文>    件(包括Windows平台)
macで隠しファイルを表示させるためのコマンド

例えば、sshキーのファイルが保存されている`.ssh`フォルダを表示させたいときなど。

 - 隠しファイルを表示する

```
$ defaults write com.apple.finder AppleShowAllFiles TRUE
$ killall Finder
```

隠しファイルを非表示に戻すときは、"TRUE"を"FALSE"に変えて、上記の２行を実行すればよい。
sshでGitHubに簡単に接続するためにconfigを設定する

#はじめに
環境はmac
mindowsでも、Git bashから同じ動作ができます。
GitHubに登録をした後、configの設定画面からの抜け方が分からず手こずったため、メモ。

##(下準備)キーを作成、GutHubに設定する
まずは、Launchpadからターミナルを起動する。
とりあえず、

 - GitHub公式に記載されている通りにsshを作成
 - GitHubに公開鍵を登録

を行なう。
詳細な手順は以下のGitHubのページを参考にする。
(メールアドレスはGitHubに登録したときのアドレス。)
https://help.github.com/articles/generating-an-ssh-key/

##configを設定する

```
$ ssh -T git@github.com
```

上記のコマンドで一々接続するのは面倒なので、簡単に接続するために、configを設定する。

```
$ vim ~/.ssh/config
```
上記コマンドを実行すると、vim画面に入り、コマンドモードとなる。
以下の記述を行なう。

```
Host github
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  User git
```
引用：(http://qiita.com/godgarden/items/28bc299b35c5c60a5877#クライアント側macへのsshキーの設定)

##configの設定を終えるには
入力が終わったら、

```
:wq
```

を入力することで内容を保存、vim画面を終了することができる。
これを知らずに時間を使いました。
参考：(http://hacknote.jp/archives/7660/)

##接続をする
```
$ ssh github
```
"github"の部分には、先述のconfigの設定で入力したHostの名前を入力する。

```
Hi 【GitHubのアカウント名】! You've successfully authenticated, but GitHub does not provide shell access.
```
が返ってきたら接続成功。

##さいごに
CLIの仕組みを勉強したい。

=================
参考：(http://qiita.com/godgarden/items/28bc299b35c5c60a5877#接続のテスト)
RailsのScaffoldのテンプレートを変更する方法


# はじめに
簡単な社内用のシステムをRailsで作ろうと思いたち、簡単なアプリケーションなので`scaffold`で自動生成してから修正することにした。
ただデフォルトのままだと作成されるコードは見た目的に今いちなので、デフォルトの`template`ではなく自前の`template`からviewsなどを作る方法を調べたのでメモしておく。

# 環境
- OS: OS X 10.11.1
- Ruby: 2.2.3
- Rails: 5.0.0.1

# 手順
デフォルトのscaffoldで作成する元となるViewsのファイルは `$RAILS_HOME/vendor/bundle/ruby/2.2.0/gems/railties-5.0.0.1/lib/rails/generators/erb/scaffold/templates/` にある。
> gemのインストール先を `$RAILS_HOME/vendor/bundle` にした場合。

ここではその元となるファイルを変更する方法を記載する。

## 既存のtemplateをコピー
一から`template`を作成するのは面倒なので以下のコマンドでデフォルトの`template`を作成する。

```
$ bundle exec rails app:templates:copy
```

上記コマンドを実行すると `lib/templates` にデフォルトのtemplateがコピーされる。

```
$ tree lib/templates
lib/templates
├── erb
│   ├── controller
│   │   ├── templates
│   │   │   └── view.html.erb
│   │   └── view.html.erb
│   ├── mailer
│   │   ├── templates
│   │   │   ├── view.html.erb
│   │   │   └── view.text.erb
│   │   ├── view.html.erb
│   │   └── view.text.erb
│   └── scaffold
│       ├── _form.html.erb
│       ├── edit.html.erb
│       ├── index.html.erb
│       ├── new.html.erb
│       ├── show.html.erb
│       └── templates
│           ├── _form.html.erb
│           ├── edit.html.erb
│           ├── index.html.erb
│           ├── new.html.erb
│           └── show.html.erb
└── rails
    ├── assets
    │   ├── javascript.js
    │   ├── stylesheet.css
    │   └── templates
    │       ├── javascript.js
    │       └── stylesheet.css
    ├── controller
    │   ├── controller.rb
    │   └── templates
    │       └── controller.rb
    ├── helper
    │   ├── helper.rb
    │   └── templates
    │       └── helper.rb
    └── scaffold_controller
        ├── api_controller.rb
        ├── controller.rb
        └── templates
            ├── api_controller.rb
            └── controller.rb

16 directories, 28 files
$ 
```


## templateの修正
自分の好きなように `template` を変更する。

## 参照先変更
`config/application.rb`を変更して`template`の`path`を作成した`template`のものに変更する。

```config/application.rb
require_relative 'boot'

require 'rails/all'

Bundler.require(*Rails.groups)

module StockViewer
  class Application < Rails::Application
    config.templates = "./lib/templates"
  end
end
```

以降、参照される`template`は`lib/templates`に変更される。

おしまい。
Laravel5.3でFormヘルパーを使う


Laravel5系ではFormヘルパーを使うと```class 'Form' not found```と出てしまうので、大体パッケージを自分で入れる必要がある。

## composer.jsonに追記

```json:composer.json
    "require": {
        "laravelcollective/html": "~5.0"
    },

```

```bash
$ composer update

```

## app.phpに追記

```php:config/app.php
    'providers' => [
        Collective\Html\HtmlServiceProvider::class,
    ],
    
    'aliases' => [
        'Form' => Collective\Html\FormFacade::class,
        'Html' => Collective\Html\HtmlFacade::class,
    ],

```

## Form Helperを使う

```php
{!! Form::open(['action' => 'Auth\RegisterController@register', 'class' => 'form-horizontal']) !!}
{{ Form::text('fuga', old('fuga'),[ 'class' => 'form-control', 'required' => 'required', 'autofocus' => 'autofocus' ]) }}
{{Form::checkbox('hoge', 1, true)}}
{!! Form::close() !!}

```
reduce/injectで処理を中断するにはbreakを使う(+三項演算子の話)


*注意: Rubyのバージョンは2.3.0です。それ以前のバージョンあるいはそれ以後のバージョンでは挙動が変化している可能性があります。*

`reduce`または`inject`による畳み込み演算の途中で処理を抜けたい場合は`break`を利用します。このとき__`reduce/inject`の戻り値にしたい値を`break`の引数に渡す__ことが重要です。

```irb
irb(main):001:0> langs = %w(ruby perl python php java)
=> ["ruby", "perl", "python", "php", "java"]
irb(main):002:0> langs.reduce do |str, lang|
irb(main):003:1*   break str if lang.size < 4
irb(main):004:1>   "#{lang} / #{str}"
irb(main):005:1> end
=> "python / perl / ruby"
```

なお引数なしの`break`を宣言した場合、戻り値は`nil`になります。

```irb
irb(main):001:0> langs =%w(ruby perl python php java)
=> ["ruby", "perl", "python", "php", "java"]
irb(main):002:0> langs.reduce do |str, lang|
irb(main):003:1*   break if lang.size < 4
irb(main):004:1>   "#{lang} / #{str}"
irb(main):005:1> end
=> nil
```

さて上のようなケースでは三項演算子を利用したいところです。__三項演算子の真式もしくは偽式に`break`を利用する場合はbreakを`(break str)`のように書く必要があります。__

```irb
irb(main):008:0> langs =%w(ruby perl python php java)
=> ["ruby", "perl", "python", "php", "java"]
irb(main):009:0> langs.reduce{|str, lang| lang.size < 4 ? (break str) : "#{lang} / #{str}"}
=> "python / perl / ruby"
```

なお`break`を`()`でくくらないと例外が発生します。

```irb
irb(main):013:0> langs = %w(ruby perl python php java)
=> ["ruby", "perl", "python", "php", "java"]
irb(main):014:0> langs.reduce{|str, lang| lang.size < 4 ? break str : "#{lang} / #{str}"}
SyntaxError: (irb):14: syntax error, unexpected tIDENTIFIER, expecting ':'
...lang| lang.size < 4 ? break str : "#{lang} / #{str}"}
...                               ^
        from C:/Ruby23/bin/irb.cmd:19:in `<main>'
```

では`break`に引数を渡さない場合はどうでしょうか? 実は__例外は発生しません__。

```irb
irb(main):015:0> langs = %w(ruby perl python php java)
=> ["ruby", "perl", "python", "php", "java"]
irb(main):016:0> langs.reduce{|str, lang| lang.size < 4 ? break : "#{lang} / #{str}"}
=> nil
```

このあたりのさじ加減(?)はなかなか難しいところがあります。まあ`break`や`reduce/inject`を多用するプログラミングスタイルはわかりづらいので避けるべきという話かもしれませんが(´・ω・`)
病院で診察の順番が近づいてきたことをincomming webhookでslackに通知する

# 概要
病院に行ったら診察までの待ち時間は4時間といわれてげんなりしてたら、
診察の順番が近づいて来たらメールで連絡してくれるシステムと診察の順番がwebで見れるページが用意されていたので
スクレイピングして自分の番号があったらslackに通知するpythonのスクリプトを暇つぶしに作った。

# どうして作ったのか
メールだと気づかない気がするし、何回か通知してほしかったので作りました。

# やったこと
[このページ](http://konzatsu.net/sfd-m.php?cid=17514799)に順番が回ってきた診察番号が表示されるので（診療時間外だと表示されない）、
このページ内を自分の診察番号で検索してＨＩＴしたらslackに通知するようにしました。5回まで通知してくれます。
ページ内にはidとかタグとかキーになるものがなかったので、単純にfindで探すかんじです。
beautifulsoupでやるぞーって思ってたらタグとかなくてoh...ってなった。

# 作ったスクリプト
https://github.com/tomokitamaki/NowIsThetimeForASABUhospital
Windows10 Home update後の自動再起動防げず

#背景
ディープラーニングのモデル作りのために動かし続けているwindows10のマシンが、強制再起動の脅しをかけてきたのでなんとかしようと四苦八苦しました。最終的に[ココ](http://blog.bagooon.com/?p=1077)を参考にして勝手な再起動を防ごうとしましたが失敗してしまいました。
やろうとしていることはwindows update機能そのものを停止してしまう措置のようです。

#手順
1. タスクバー左スミのウィンドウズアイコンを右クリック、"検索"から「services.msc」を検索して以下画面を表示
![1.png](https://qiita-image-store.s3.amazonaws.com/0/138229/0876e06f-9925-9b9b-493e-06d43aec8c2a.png)


2. 
"Windows Update"をダブルクリックして「サービスの状態」の欄の「停止」を選択したのが下の状態
![2.png](https://qiita-image-store.s3.amazonaws.com/0/138229/7a6df2ca-46ba-89bb-605b-594e76353a9d.png)

これで「OK」としましたが次の日見たら再起動しようとしたのか、真っ暗な画面でキーボードもマウスも効かない状態になっていたので泣く泣く起動ボタン長押しで再起動しました。

上部でも書いた[参考にしたサイト](http://blog.bagooon.com/?p=1077)良く見直したところ"スタートアップの種類(E):"のところを「無効」にしなければいけないみたいです（上の画像では「手動」）。

私は失敗して１週間以上回していたプログラムが無に帰ってしまいました。皆様ご注意あれ。
cloud9で作ったlaravel5のプロジェクトをherokuにデプロイした時の対処

①以下に従ってcloud9上でlaravelプロジェクトを作成
http://cloudfish.hatenablog.com/entry/2015/09/18/022222

②以下に従ってgitの設定やBitbacketへのcommit、herokuへのデプロイを実施
http://qiita.com/jhorikawa/items/84a0f4a7f40f5914ad1a
※gitコマンド
http://qiita.com/fukumone/items/73e1a9a62c5e4454263b

③cloud9ではドキュメントルートを変更していたため、herokuで403forbiddenエラー発生
ドキュメントルートの変更のため、現在のドキュメントルートに```Procfile```を作成し、以下のコードを記述

```
web: vendor/bin/heroku-php-apache2 public/
```

階層は以下のような形

```
/public/index.php
/vendor/
/composer.json
/composer.lock
/Procfile
```

④これでherokuのサイトを表示しようとすると

```
Whoops something went wrong
```

的なエラーが表示される
これはheroku上ではデバックモードがfalseになっているから。
cloud9のコマンドラインから、

```
heroku config:add APP_DEBUG=true
```

を実行してデバッグモードをオンにしてエラーメッセージを表示させる

⑤エラーメッセージを見るとenctyperがなんとか、ってでたので検索してみると、APP_KEYが無いためらしい。
cloud9上だと

```
php artisan key:generate
```

で出来るがheroku上では出来ないため、
以下のコマンドをcloud9から実行し、cloud9で作成したAPP_KEYをherokuでも適用する。

```
heroku config:add APP_KEY=自分のAPP_KEY
```

APP_KEYは.envファイルで確認出来る

```
vim .env
```

これでherokuでも無事ページを表示できた！
Samusung  PenSDK を使う

PenSDKの利用について、公式のリファレンスがあるのですが、なかなかわかりにくいので情報を整理してみたいと思います。

公式
[samusung pen sdk](http://developer.samsung.com/galaxy/pen)

でサンプルファイルも配布されているのだけど、サンプルファイルから移植を行う形で、制作をしてみます。

ライブラリにファイルを追加して、下記のようなにする

compile(name:'pen-v4.1.1_light', ext:'aar')
compile files('libs/sdk-v1.0.0.jar')

で、gradleファイルの中に

```gradle:build.gradle
repositories {
    flatDir {
        dirs 'libs'
    }
}
```

の内容も追記しておかないと動作をしなかった。また、パーミッションについても、

<uses-permission android:name="com.samsung.android.providers.context.permission.WRITE_USE_APP_FEATURE_SURVEY" />

を許可しておくことで、ペンのSDKを使えるようになった。


```java:main.java
        Spen spenPackage = new Spen();
        try {
            spenPackage.initialize(this);
        } catch (Exception e1) {
            Toast.makeText(context, "Cannot initialize Spen.", Toast.LENGTH_SHORT).show();
        }
```
これは特には何かに使うのではなく、利用を宣言する為に呼ぶ、Spenクラスだけど、ペン自体じゃないので注意。ペン自体のクラスはSpenPenっていうクラスで使う。ただ、ペンを作る時にペンは何を利用したペンか？っていうのを確定させたいので、

```java:main.java
        SpenPenManager mPenManager = new SpenPenManager(context);
        SpenPenInfo penInfo = new SpenPenInfo();
        List<SpenPenInfo> penInfoList = mPenManager.getPenInfoList();
        for (SpenPenInfo info : penInfoList) {
            if (info.name.equalsIgnoreCase("InkPen")) {
                penInfo = info;
                break;

            }
        }
```

ペンの情報を取得するためにSpenManagerクラスから、ペンのクラスを取得する。
ためしたところ取得できるペンが
FountainPen
InkPen
ObliquePen
Pencil

で、Pencilは同じ太さなのだけど、
FountainPen InkPenは筆圧の取得をしてくれるペン
ObliquePenは平たいペン（？）書く方向によって太さが異なるペン

が設定できた。

この設定の値を用いて、Spenpenを作ると

```java:main.java
　　　　SpenPen mPen = null;
        try {
            mPen = mPenManager.createPen(penInfo);
        } catch (Exception e) {
            Toast.makeText(context, "SpenPenManager is not loaded.", Toast.LENGTH_SHORT).show();
        }

        mPen.setSize(20);
        mPen.setColor(Color.RED);
```

でペンが完成した。


このペンは例えばViewに対してだと

```java:main.java
 protected class MyView extends View {
        private final RectF bitmapRect = new RectF();
        public MyView(Context context, int w, int h) {
            super(context);
            createBitmap(w, h);
        }
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            mPen.draw(event, new RectF());
            invalidate();
            return true;
        }
        @Override
        protected void onDraw(Canvas canvas) {
            // Draw the bitmap of a pen on the canvas.
            canvas.drawBitmap(mBitmap, null, bitmapRect, null);
            super.onDraw(canvas);
        }

        private void createBitmap(int w, int h) {
            // Create a bitmap and set the bitmap to Pen to draw a pen.
            mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
            bitmapRect.set(0, 0, mBitmap.getWidth(), mBitmap.getHeight());
            mPen.setBitmap(mBitmap);
        }
    }
```

これで、一方的に描画のみだけど、お絵かきのアプリができた。
サンプルよりも簡単に使い方を順番を追って、書いてみた。
![ころすけ](https://qiita-image-store.s3.amazonaws.com/0/3026/ba3a8f9e-34b0-21b9-fbdc-45b22c6cd13e.png)
日本語Word2Vecを作って公開した

## はじめに
Word2Vecを[Apitoreで公開](https://apitore.com/store/apis/details?id=8)しました。日本語Wikipediaに[Neologd](https://github.com/neologd/mecab-ipadic-neologd)の辞書を使いました。無料で使えるWeb APIなので、ハッカソン等で使えると思います。今回公開したWord2Vecは、日本語WikipediaをKuromoji+Neologdで形態素解析したものを学習データに使っています。Neologdを用いているので、最近の単語（e.g. 「とある魔術の禁書目録」）も扱えるのがおもしろいところです。

## 公開
APIのページは[こちら](https://apitore.com/store/apis/details?id=8)。

## 関連記事
- <a href="http://blog.apitore.com/2016/09/19/deeplearning4j-jwikipedia-word2vec/">deeplearning4jで日本語WikipediaのWord2Vecを作る</a>
- <a href="http://blog.apitore.com/2016/09/22/deeplearning4j-word2vec-limitation-and-application/">deeplearning4jのword2vecの限界とその上手な使い方</a>
- <a href="http://blog.apitore.com/2016/09/25/word2vec-webapi-free/">Word2VecのWebAPIを無料公開しました</a>
- [word2vecを使って、日本語wikipediaのデータを学習する](http://qiita.com/tsuruchan/items/7d3af5c5e9182230db4e)

## 特徴
Word2Vecの関数は2つあります。

1. Distance
1. Analogy

それぞれについて特徴を見ていきましょう。

### Distance
ひとことで言えば、入力した単語の類義語や同義語を返します。もう少し正確に言うならば、入力した単語と同じようなシーンで用いられる単語を返します。例を見ましょう。「アディダス」を入力すると、以下の結果を返します。競合会社と製品が出てきましたね。

|単語 |コサイン距離（≒類似度） |
|:-----------|:------------|
|ニューバランス |0.753 |
|アシックス |0.751 |
|アディダスジャパン |0.713 |
|ナイキ |0.706 |
|シューズ |0.705 |

このように、同義語っぽいものが出てきます。Distanceの使い道としては、検索クエリの拡張があります。質問応答サイトで導入すると役に経ちそうです。例えば、入力された質問文を自動的に同義語展開して検索を実行すれば、検索結果は取りこぼしが少なくなるでしょう。（網羅性の改善）

さて、Word2Vecですが、学習データを変えれば、より面白いことができそうです。例えば、特許文書を対象に学習すれば、「特許のときに使われやすい同義語表現」が出てくると思います。近年ではWord2Vecを拡張してDoc2Vecが出ています。Doc2Vecはドキュメント版のWord2Vecです。つまり、例えば「作成途中の自分の研究論文を入力すると、先行研究の論文を見つけてくれる」みたいな使い方ができそうです。商品レビューで学習すれば、商品名を入力すると類似したコンセプトや評価の商品を提案してくれるとかできそうです。


### Analogy
ひとことで言えば、単語の足し引きができます。これは例を見たほうが早いので例を見ましょう。「日本」+「パリ」-「フランス」の結果は以下になります。なんとなく東京っぽい結果が出ていますね。

|単語 |
|:-----------|
|日本|
|東京|
|都内|
|東京都内|
|日本国内|

単語の概念を足し引きして、その結果に近い概念の単語を示す、という感じです。コンセプトづくりに役立ちそうです。例えば、「巣鴨」+「高級」→「テレジアヌム」や「世田谷区成城」が出てきました。テレジアヌムは、[オーストリアのホテル](https://www.tripadvisor.jp/Hotel_Review-g190454-d264920-Reviews-Austria_Trend_Hotel_Beim_Theresianum-Vienna.html)の名前のようです。ぐぐってみましたが、それっぽい気もします。世田谷区成城は言わずと知れたセレブの町。それっぽいですね。

## 悪ふざけ
せっかくなので「とある魔術の禁書目録」の同義語を調べてみた。

|単語 |コサイン距離（≒類似度） |
|:-----------|:------------|
|とある魔術の禁書目録ii |0.785 |
|とある科学の超電磁砲 |0.761 |
|灼眼のシャナ |0.752 |
|とある魔術と科学の郡奏活劇 |0.720 |
|とある科学の一方通行 |0.705 |

「とある〇〇」が多い！シリーズモノは抑制したほうがいいかも？
emacsの基本操作

# emacsの基本操作全般

#基礎の基礎用語説明
キーバインド -> ショートカットのこと
フレーム -> 他で言うところのウインドウ
ウインドウ -> フレーム内の各バッファ領域
M -> option (メタキー)
C -> control
S -> shift
RET -> enter

#キーバインド
操作に嵌まったら，C-gもしくはesc esc escで抜け出せる

## ウインドウ操作
C-x 1 -> ウインドウを一つに
C-x 2 -> 上下方向にウインドウを新たに開く
C-x 3 -> 左右方向にウインドウを新たに開く
C-x o -> 隣のウインドウへカーソルを移動する

## バッファ操作
C-b k -> バッファの削除
C-x C-f -> バッファを開く
C-x b -> バッファの名前を指定して切り替える
C-x C-b -> バッファの一覧を開く

### バッファ一覧上での操作
f -> 選択したバッファを開く
d, k -> バッファの消去をマーク
s ->　バッファの保存をマーク
x -> マークしたコマンドの実行
u -> マークを外す
q -> バッファ一覧のバッファを閉じる

## カーソル移動操作
C-p -> カーソルを上に移動する．
C-n -> カーソルを下に移動する．
C-f -> カーソルを右に移動する．
C-b -> カーソルを左に移動する．

C-a -> カーソルを行頭に移動する．
C-e -> カーソルを行末に移動する．

M-a -> カーソルを段落の先頭に移動する．
M-e -> カーソルを段落の末尾に移動する．

C-v -> 1画面下へカーソルを移動する．
M-v -> 1画面上へカーソルを移動する．

M-< -> バッファの先頭へ移動する．
M-> -> バッファの終端へ移動する．
M-g g -> 指定行へ移動

## 編集操作
C-space -> 複数行の選択が可能になる．
C-w -> 領域をカット
M-w -> 領域をコピー
C-y -> ペースト
C-k -> カーソル位置から行末までをカット
M-; -> コメントアウトする．複数行選択で一括コメントアウトが可能である．

## 検索と置換
C-s -> 前方検索
C-r -> 後方検索
検索条件を入力した後に，上記キーバインドを入力すると，次を検索できる．
C-M-s -> 正規表現での前方検索
C-M-r -> 正規表現での後方検索

## ディレクトリ操作
C-x d -> ディレクトリエディタのバッファを開く．ここからファイルを開くことも可能．

# 操作一覧
emacsを再起動せずに編集中のinit.elを反映させる方法
```M-x eval-buffer
```
# パッケージ一覧
バージョン24ではflymake.elおよびpackage.elはプリインストールされている．
SQL Serverでテーブル結合

#結合の種類
###**内部結合**: JOIN, INNER JOIN
結合条件を満たす行のみを結合。
**結合できない行は表示しない。**

【補足】JOINを使わない外部結合
SELECT *
FROM A, B
WHERE A.no = B.no

※WHEREに絞り込み条件も記述するため、結合条件がどれなのかわかりにくくなる。

###**外部結合**
**結合できない行も表示する。**

- 左外部結合: LEFT JOIN, LEFT OUTER JOIN
左側のテーブルのデータを全て表示する。

- 右外部結合: RIGHT JOIN, RIGHT OUTER JOIN
右側のテーブルのデータを全て表示する。

- 完全外部結合: FULL JOIN, FULL OUTER JOIN
両側のテーブルのデータを全て表示する。

【補足】JOINを使わない左外部結合
SELECT *
FROM A, B
WHERE A.no = B.no(+)

#なぜいろいろな結合があるのか
内部結合だけだと、下記の場合にデータが結合結果から消滅してしまう。

- 右側テーブルに結合相手のいない。
例：家計簿テーブル（左）に新しい費目IDがあるが、費目テーブル（右）の費目IDが更新されておらず、データがみつからない。結果に表示されない買い物記録が存在してしまう。

- 左側テーブルの結合条件の列がNULL。
DataGridViewの使い方

#DataGridViewに値をセットする方法
##インデクサを使う
```csharp
// "0"をセット
dataGridView1[0, 0].Value = 0.ToString();
```
##Rowsプロパティを使う
```csharp
// "0"をセット
dataGridView1.Rows[0].Cells[0].Value = 0.ToString();
```
##DataSouceプロパティを使う
List\<T>をまとめてDataGridViewにセットする。

```csharp:Form1.cs
List<Product> procucts = new List<Product>();

procucts.Add(new Product(1, "米"));
procucts.Add(new Product(2, "そば"));

dataGridView1.DataSource = procucts;
```

```csharp:Product.cs
class Product
{
    public int Id { get; set; }
    public string Name { get; set; }

    public Product(int id, string name)
    {
        Id = id;
        Name = name;
    }
}
```

![datagridview.PNG](https://qiita-image-store.s3.amazonaws.com/0/64683/2a696e09-2a89-3493-0e27-cf0f1ae4fac5.png)

#DataGridViewに列を追加する方法
```csharp
dataGridView1.Columns.Add("ID", "Product ID");
dataGridView1.Columns.Add("Name", "Product Name");
```

#DataGridViewに行を追加する方法
```csharp
// 空白行を追加
dataGridView1.Rows.Add();
// セル内容を指定して行を追加
dataGridView1.Rows.Add(new string[] { "1", "Good Product" });
```
WordPressの始め方　（４）サイトURLの変更方法

WordPressでサイトを構築すると、
最初はドメインの後ろに「/wp」と表示されたURLとなっています。

これでは、WordPressで構築したことがバレバレだし、
何よりかっこ悪い・・・

何か更新をして運用開始後となっている状態から
サイトURLを変更するには、
・サーバの管理画面からPHPファイルを編集
・WordPress管理画面からサイトURLを編集
の2ステップが必要となります。

<h3>（１）サーバ管理画面からindexファイルをダウンロード</h3>

サイト名を変更したいドメインで、サーバの管理画面にログイン
↓
ファイルマネジャーのページ
↓
ドメインのディレクトリ
　-Wp(WordPressのディレクトリ）
     -wpのファイル諸々
　　　↑サイトURLを管理している「index.php」ファイルはここに入っています

「index.php」ファイルと
「.htaccess」ファイルを
ダウンロードします。
（大体のサーバコントロールパネルで、チェックボックスにチェックを入れて
　ダウンロードボタンを押すと、ローカルディレクトリへのダウンロードが行われます）

<h3>（２）index.phpを編集</h3>
ダウンロードした「index.php」ファイルをテキストエディタなどで開きます。
(Mac使用者の著者は、なぜかiOSアプリ開発フォームのX-codeで開かれましたが問題なく変更できました）

17行目を
require(‘./wp-blog-header.php’);
↓
require(‘./wp/wp-blog-header.php’);

と変更し、保存します。

<h3>（３）アップロード</h3>
再びサーバの管理画面に移動し、
上書きした「index.php」と「.htaccess」を
ドメインディレクトリと同一階層にアップロードします。

ドメインのディレクトリ　←ここに並列するようにアップロード
　-Wp(WordPressのディレクトリ）
     -wpのファイル諸々
　　
<h3>（４）サイトのアドレスを変更</h3>
設定＞一般から
サイトのアドレス（URL)を
「http://www.xxxx.com/wp」
↓
「http://www.xxxx.com/」へ変更。

以上で変更は完了です。
WordPressのダッシュボードからサイトにアクセスすると、URLが変わっているはずです。
iPad Safariのselectがjavascript経由でリフレッシュされない場合

ChromeとFirefoxでiPad向けの業務WEBアプリを作成しています。

基本的に3ブラウザとも動きが同じで通常は問題ないのですが、
jsonで取ってきた値をselectの選択値に反映させようと
javascriptでselected属性を付けたときにsafariだとうまく反映されずに困ってました。

で、ついに解決策を発見しました。
- デフォルトのoptionにもselected属性をちゃんと付ける
- 異なるoptionにselected属性を付ける前にすべてのoptionからselected属性を削除する
です。

私はjqueryを主に使っているのでサンプルコードとしてはこんな感じです。

1.セレクトボックス作成時(反復処理前提なので無駄が多いです)

```sample.js
//selectオブジェクトのテンプレート作成
var selectObj = $('<select></select>');
selectObj.append('<option value="0"></option>');
selectObj.append('<option value="1">aaaaaa</option>');
selectObj.append('<option value="2">bbbbbb</option>');
selectObj.append('<option value="3">cccccc</option>');
selectObj.append('<option value="4">dddddd</option>');
//親オブジェクト
var divObj = $('<dev/>');
//親オブジェクトにテンプレートをコピー
divObj.append(selectObj.clone(true));
//デフォルトの選択値をセレクト(テンプレート作成時に行ってもいいと思います)
divObj.find('option').eq(0).attr('selected','');
```

2.書換時

```sample.js
//すべてのopcionからselected属性を削除
divObj.find('option').removeAttr('selected');
//改めてselected属性を追加
divObj.find('option').eq(1).attr('selected','');
```

※追記
どうやらこれだと手動でセレクトボックスを変更した際に選択値が表示されなくなってしまうみたいです。
そこでサーバから戻ってきた値と現在の選択値を比較して変更されていた場合にだけselected属性を削除追加する様に変更します。

```sample.js
//サーバから戻ってきた選択値(適宜値を代入します)
var server_value = "";
//現在の選択値
var tmp_select_value = divObj.find('select option:selected').val();
//二つの値が異なる場合だけselected属性を付け替え
if(tmp_select_value != server_value){
    //すべてのopcionからselected属性を削除
    divObj.find('option').removeAttr('selected');
    //改めてselected属性を追加
    divObj.find('option').eq(1).attr('selected','');
    //iOS 10.0.2対策
    divObj.find('select').focus();
}

```

これでiPadでもセレクト値がアップデートされると思います。
**※追記**
iOS 10.0.2で確認したところ表示がリフレッシュされなくなっていました。
なにかイベントを与えたらリフレッシュされるかもしれないので引き続き調査します。
→セレクトボックスにフォーカスを送れば変更されることを確認しました。ちょっと画面がうるさくなりますが。

ちなみにこれを行っていない状態だと、
一番上のoptionがselected属性なしで選択状態になってしまい、
書換時に追加したselected属性と合わせて2個のoptionが選択された状態になってしまうようです。
CakePHP3のORMにおけるget()とfind()の違い

開発中にハマったのでメモしておきます。

get() で指定した id に該当するデータが存在しなかった場合は RecordNotFoundException 例外が発生する。

```ruby:
public function view($god_id = null)
{
    /* 指定した id に該当するデータが存在しなかった場合はエラーになる */
    $god = $this->Gods->get($god_id);
    
    $this->set('god', $god);
}
```

それに対して、クエリビルダのfind()に続くwhere()で id を指定した場合は、1件もデータを取得できなくてもエラーは発生せず後続の処理を行う。

```ruby:
public function view($god_id = null)
{
    /* 指定した id に該当するデータが存在しなかった場合でもエラーにはならない */
    $god = $this->Gods->find()->where(["god_id = " => $god_id]);
    
    $this->set('god', $god);
}
```

結論
絶対に1件以上のデータを取得できる保証がある時にはget()を使ったほうが簡潔に書ける。
しかし、1件もデータを取得できない可能性がある場合はクエリビルダのfind()に続くwhere()で id を指定したほうが無難である。
[Unity][vuforia]立体をARマーカーとして認識させる ～その1 ARマーカーを登録する～

# はじめに
vuforiaのDBに登録できる形式のうち「3D Object」をARマーカーとして利用する手順について2回に分けて解説します。

- その1 ARマーカーを登録する(本記事)
- [その2 Unityで実装する](http://qiita.com/chano2/items/6adc323a334abaa254ac)

本記事はその1回目として、3D objectをARマーカーとして登録する手順について解説します。

DB登録など、vuforiaの始め方全般については、こちらの記事をご参照ください。
[Unityでお手軽AR開発！vuforiaを使ってみる](http://qiita.com/chano2/items/8ddd263f0c2ddddaca85)

# 3D ObjectをDBに登録する
本題です。
以下の手順で実施します。

1. Vuforia Object Scannerを準備する
2. Vuforia Object Scannerを用いて、ARマーカーとして使用する立体をスキャンする
3. スキャンした立体の情報を、開発に使用するPCから取り込む
4. vuforiaのDBに立体の情報を登録する

## 1. Vuforia Object Scannerを準備する
[こちら](https://developer.vuforia.com/downloads/tool)からVuforia Object Scannerのzipファイルをダウンロードします。ファイルにはAndroidアプリのapkのほかに、スキャンに使用するためのマーカーのpdfが含まれています。

Android端末に、ダウンロードしたapkを入れます。
まず、USBデバッグを有効にしたAndroid端末をPCに接続します。接続したPCにadbコマンドを実行できる環境を準備したうえで、以下のコマンドを実行すると、Vuforia Object Scanner のインストールに成功します。

```
adb install '$YourAPKFilePath'
```

Vuforiaのロゴがアイコンとなっている、「Scanner」というアプリが入っているはずです。

次の手順でスキャンを実施する前に、アプリのzipに含まれていたpdfを印刷しておきましょう。

## 2. Vuforia Object Scannerを用いて、ARマーカーとして使用する立体をスキャンする
Vuforia Object Scannerを起動したら、まず右上の＋ボタンを押します。
カメラが起動するので、カメラを手順1で印刷した紙にかざしましょう。
![Screenshot_20160930-193015.png](https://qiita-image-store.s3.amazonaws.com/0/83524/15838334-e9ae-0e11-133a-f2eae549a186.png)
ここに物体を置いてくれと言わんばかりのオブジェクトが映し出されます。
紙の方眼の領域に、ARマーカーにしたい物体を置いて、画面右の赤いボタンを押します。

![スクリーン.png](https://qiita-image-store.s3.amazonaws.com/0/83524/299ede7f-9684-ee3c-bf33-74128a60f77c.png)
いろんな角度から端末をかざしていくと、このように特徴点が緑色で記録されていきます。
十分に特徴点が記録されたところで右の赤い四角のボタンを押して、スキャンを停止します。

## 3. スキャンした立体の情報を、開発に使用するPCから取り込む
スキャンしたデータは、Vuforia Object ScannerからGoogleドライブなどにアップロードすることができます。

アップロードしたら、Unityを使用するPCからアップロードしたサービスにアクセスしましょう。
拡張子が .od のデータがあるはずです。これをPCに取り込みます。

## 4. vuforiaのDBに立体の情報を登録する
[vuforia Developer Portal](https://developer.vuforia.com/)にログインし、「Develop」→「Target Manager」の順に進みます。
(アカウント登録からアプリケーションのライセンスキー取得までの手順は[こちら](http://qiita.com/chano2/items/8ddd263f0c2ddddaca85)を参照してください)

データベース、ターゲットの順に作成します(データベースの作成についても[こちら](http://qiita.com/chano2/items/8ddd263f0c2ddddaca85)を参照してください)。
ターゲットのタイプは「3D Object」を選択します。
![スクリーンショット 2016-09-30 19.46.14.png](https://qiita-image-store.s3.amazonaws.com/0/83524/ca1693ea-e0f0-3155-65e9-f8e25b6baf7c.png)
Fileのところに、先ほど取り込んだ.odのファイルをアップロードします。

以上で、vuforiaにおける立体マーカーの登録は完了です。
次回は登録したマーカーの情報をUnityで利用します。[こちらの記事](http://qiita.com/chano2/items/6adc323a334abaa254ac)を参照してください。
swift3 CharacterSet.urlxxxx addingPercentEncoding


CharacterSet.url???? 系、どれがどのキャラクタをエンコードするのかドキュメントではわからんから解析メモ

key|chars|example
---|---|---
urlFragmentAllowed | !$&'()*+,-./:;=?@_~ |  http://google.com?a=b&c=d
urlHostAllowed | !$&'()*+,-.:;=[]_~  | http:%2F%2Fgoogle.com%3Fa=b&c=d
urlPathAllowed | !$&'()*+,-./:=@_~  | http://google.com%3Fa=b&c=d
urlQueryAllowed | !$&'()*+,-./:;=?@_~  | http://google.com?a=b&c=d
urlUserAllowed | !$&'()*+,-.;=_~  | http%3A%2F%2Fgoogle.com%3Fa=b&c=d
urlPathAllowed | !$&'()*+,-./:=@_~  | http://google.com%3Fa=b&c=d


code

	func cs(cs:CharacterSet)->String {
		var s = ""
		
		let ar = [0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,0x2a,0x2b,0x2c,0x2d,0x2e,0x2f,
		          0x3a,0x3b,0x3c,0x3d,0x3e, 0x3f,
		          0x40,
		          0x5b,0x5c,0x5d,0x5e,0x5f,
		          0x7b,0x7c,0x7d,0x7e,0x7f,
		          ]
		
		for i in ar {
			let uc = UnicodeScalar(i)!
			if cs.contains(uc) {
				s += String(uc)
			}
		}

		let url = "http://google.com?a=b&c=d"
		s += "   " +  url.addingPercentEncoding(withAllowedCharacters: cs)!

		return s
		
	}
CircleCIでTurnipのparallelismを効率化させる

#CircleCIでrspec.xmlを出力する理由
* 詳細はCircleCIのドキュメントの[Manually setting up parallelism](https://circleci.com/docs/parallel-manual-setup/)を参照すること。
* CircleCIではコンテナを複数個利用した並列テスト実行を行うことができる。
* 理想を言えば、全てのコンテナのテストが同時に終了すれば最も効率が良い状態と言える。
* デフォルトでは各コンテナに分配されるテストファイルはファイルの大きさによって分配される。
* [rspec_junit_formatter](https://rubygems.org/gems/rspec_junit_formatter)を利用することでテスト内容と実行時間が記録されたrspec.xmlを出力することができ、CircleCIはそのファイルを元に次回テスト時に各コンテナへのテストファイル分配を効率化してくれる。

# 何が問題なのか
* テストを行う際にTurnipを利用するとテストのファイル名が正しくrspec.xmlに出力されない
* gherkin記法で書かれたfeatureファイルが正しく認識されていない。
* このためテストが各コンテナにベストな条件で分配されない。

# 取り急ぎの対応
* featureファイルがrspec.xmlに出力されるように改造した[rspec_junit_formatter](https://github.com/kazuhisa/rspec_junit_formatter)を用意した。ひとまずは次のようにGemfileに指定すれば利用することができる。

```ruby
gem 'rspec_junit_formatter', github: 'kazuhisa/rspec_junit_formatter'
```

# 今後の対応
* [今回の修正](https://github.com/kazuhisa/rspec_junit_formatter/commit/65ca57f6e82f0c81db8b8279422225a4ca5d7931)でも何となく良い気がするのだが、何かしらの理由があるのだろう。調査して本家にプルリク出したい。