OmniAICreator/Qiita-1.07M huggingface dataset:
hubotからBotkitへ移行メモ

hubotからBotkitへ移行したときの移行メモ
（Botkitの基本は省略）

## robot.respond

```js
robot.respond(/ほげ (.+)$/, (msg) => {
  console.log(msg.match[1])
})
```

↓

```js
controller.hears('ほげ (.+)$', 'mention,direct_mention', (bot, msg) => {
  console.log(msg.match[1])
})
```

```'mention,direct_mention'``` のところは厳密に同じにするなら```'mention,direct_mention,direct_message```

## robot.hear

```js
robot.hear(/ほげ (.+)$/, (msg) => {
  //...
})
```

↓

```js
controller.hears('ほげ (.+)$', 'ambient', (bot, msg) => {
  console.log(msg.match[1])
})
```

```ambient``` のところを ```message_received``` としている記事が多かったが、@0.4.10では動かなかった。
厳密に同じにするなら```ambient,mention,direct_mention,direct_message```

## robot.messageRoom

```js
robot.messageRoom(channelId, 'わーい')
```

↓

```js
bot.say({
  channel: channelId,
  text: 'わーい'
})
```

## text内のURL

Botkitではmsg.textでURLを含んだテキストを参照すると、URLの前後に<>がついている。
正規表現等で考慮していなければ修正する。

## ユーザー名取得

```js
msg.message.user.name
```

↓

```js
bot.api.users.info({ user: msg.user }, (error, response) => {
  const { name } = response.user
})
```

非同期になるのでやや修正大きい。

## attachment

```js
msg.send({
  attachments: [attachment]
})
```

↓

```js
bot.reply(msg, {
  attachments: [attachment]
})
```

## robot.router

```js
robot.router.post("/room/:room", function(req, res) {
  //...
  robot.send({ room: req.params.room }, text)
})
```

```js
const bot = controller.spawn({
  token: process.env.token
})
controller.setupWebserver(port, (err, webserver) => {
  webserver.post('/room/:channel', (req, res) => {
    bot.say({ text, channel: req.params.channel })
  })
})
```
Julia のインストールと Hello World の実行

## Julia とは

Julia はテクニカルコンピューティング(高度な科学技術計算などの計算処理)のためのプログラミング言語。

The Julia Language http://julialang.org/

> Julia is a high-level, high-performance dynamic programming language for technical computing, with syntax that is familiar to users of other technical computing environments.

Julia (プログラミング言語) - Wikipedia https://ja.wikipedia.org/wiki/Julia_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)

> Julia（ジュリア）は、 一般的なプログラミングから高水準の科学計算処理まで対処するよう設計された高水準言語及び動的プログラミング言語である。

## 今回の動作確認環境

macOS Sierra + Java 1.8 + Homebrew

## Homebrew で Julia をインストール

brew コマンドで Julia をインストールする。

```sh
$ brew install Caskroom/cask/julia
```

Julia のバージョンを確認する。

```sh
$ julia --version
julia version 0.5.0
```

## Julia で Hello World してみる

以下の内容を hello.jl というファイル名で保存する。

```
# Hello World してみる
println("Hello World")
```

julia コマンドでファイル名 hello.jl を指定して実行すると Hello World が出力される。

```sh
$ julia hello.jl 
Hello World
```

## 参考資料

- The Julia Language http://julialang.org/
- Getting Started — Julia Language documentation http://docs.julialang.org/en/stable/manual/getting-started/
読み方がわからない（わかりにくい）言葉集

#前置き

自分が読めなかったもの、まわりの人が読めなかったもの、などを載せています。
ここに載せる読み方は、ネイティブな発音を示しているのではなく、あくまでこの業界における「読み方」を指します。
随時更新予定。

コメント欄に書いていただければ追加します。
※コメント、編集リクエストを頂きましたので、追記しました。

#読み方がわからない言葉集
##A～M
| 名称 | 読み方 | 分類 | 補足/蛇足 |
|:---|:---|:---|:---|
| Ajax | えいじゃっくす | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| Angular | あんぎゅらー | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| Apache | あぱっち | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| Aptana Studio | あぷたな すたじお | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| Arduino | あるどぅいーの | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| bash | ばっしゅ | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| Bulma | ぶるま | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | UIフレームワーク |
| C++ | しーぷらすぷらす | 言語/言語内の要素 | 略称は「しーぷらぷら」「しーぷら」など |
| Composite | こんぽじっと | 言語/言語内の要素 | デザインパターンの一つ |
| Docker | どっかー | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| Dolteng | どぅるてん | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| ECMAScript | えくますくりぷと | 標準/規格/ｶﾞｲﾄﾞﾗｲﾝ | |
| Enum | いーなむ | 言語/言語内の要素 | |
| false | ふぉーるす（ふぉるす） | 言語/言語内の要素 | |
| Git | ぎっと | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| GIF | じふ | ﾃﾞｰﾀ形式/拡張子 | 長いこと「ぎふ」「じふ」議論がされてきたが、2015年に 開発者により明らかになった |
| GoF | ごふ | 言語/言語内の要素 | Gang of Fourの略 |
| Gradle | ぐれいどる | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | 周りに「ぐらどる」と呼んでる人がいて<br>こっちが恥ずかしくなった |
| Grails | ぐれいるず | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| Groovy | ぐるーびー | 言語/言語内の要素 | |
| height | はいと | 言語/言語内の要素 | |
| IEEE 802.11 | あいとりぷるいー 802.11 | 標準/規格/ｶﾞｲﾄﾞﾗｲﾝ | |
| i18n | いんたーなしょならいぜいしょん | 標準/規格/ｶﾞｲﾄﾞﾗｲﾝ | Internationalization（国際化）の略称。<br>Internationalization の最初の"i"から最後の"n"まで18文字あることが由来|
| Kotlin | ことりん | 言語/言語内の要素 | |
| Maven | めいぶ（ヴ）ん | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| MinGW | みんじーだぶりゅー | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| MSYS | えむしす | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |


##N～Z
| 名称 | 読み方 | 分類 | 補足/蛇足 |
|:---|:---|:---|:---|
| Nginx | えんじんえっくす | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| ngrok| えんぐろっく | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| Nuxt.js | なくすとじぇいえす | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| ping | ぴん（ぴんぐ） | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| PMBOK | ぴんぼっく | 標準/規格/ｶﾞｲﾄﾞﾗｲﾝ | |
| PostgreSQL | ぽすとぐれすきゅーえる | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | 「ぽすぐれ」と呼ばれることが多い |
| Python | ぱいそん | 言語/言語内の要素 | |
| Qi | ちー | 標準/規格/ｶﾞｲﾄﾞﾗｲﾝ | ワイヤレス給電の国際標準規格 |
| Qiita | きーた | ｻｰﾋﾞｽ | 最初「ちーた」だと思ていた。Qiは「ちー」だし |
| Redis | れでぃす | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | Remote dictionary serverの略 |
| SaaS | さーす | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | 医療系用語と区別するため「さーず」とは読まない |
| Scala | すから | 言語/言語内の要素 | |
| SCSI | すかじー | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | Small Computer System Interface |
| Seasar2 | しーさー2 | ﾌﾚｰﾑﾜｰｸ/ﾗｲﾌﾞﾗﾘ/手法 | |
| TortoiseSVN | とーたすえすぶいえぬ | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | TortoiseGitは「とーたすぎっと」 |
| Thymeleaf | たいむりーふ | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| WebM | うぇぶえむ | ﾃﾞｰﾀ形式/拡張子 | Googleが開発しているオープンな動画のコンテナフォーマット。<br>ファイルの拡張子は「.webm」|
| WebP | うぇっぴー | ﾃﾞｰﾀ形式/拡張子 | Googleが開発しているオープンな静止画フォーマット。<br>ファイルの拡張子は「.webp」|
| wget | だぶるげっと | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
| width | うぃず（づ） | 言語/言語内の要素 | 「うぃどぅす」と読まれることもある |
| YAML | やめる（やむる） | ﾃﾞｰﾀ形式/拡張子 | 「わいえいえむえる」だと思ってた。<br>一般的な拡張子は「.yml」 |
| Yeoman | よーまん | ｼｽﾃﾑ/ｿﾌﾄｳｪｱ | |
constにまつわるもやもやの整理

ES6でコードを書いていると、`const`を多用していくケースもありますが、どうにもモヤッとした気分になってしまいます。原因を考えてみると、「言語・文脈ごとに`const`の意味合いが違ってくるから」という結論に達しました。

# C++
C++にある`const`キーワードは、状況によって`const`となる対象が変わってきます。そして、クラス型について、普通の変数や参照では「オブジェクトと変数を切り離せない」ということもあってか、**オブジェクトそのものを書き換え禁止できる**という、特徴的な機能があります。

* `const SomeObject o`…`o`自体が書き換え不能（`const`でなくても、`o`とオブジェクトを切り離す方法もない）
* `const SomeObject& r`…`r`自体が書き換え不能（`const`でなくても、`r`とオブジェクトを切り離す方法もない）
* `const SomeObject * p`…`p`の指す先が書き換え不能
* `SomeObject * const p`…`p`自体が書き換え不能

# PHP

PHPの場合、`const`をかけた定数にできることがかなり限られています。

* スカラー型、あるいは配列（PHP 5.6以上）のみ定数にできる。**オブジェクトを定数にはできない**。
* `const`で定数を作る場合、書けるものはリテラルか定数式（PHP 5.6以上）のみ。
* `define`関数を使えば、式の結果を定数にできる。

# ES6

これらに対してES6では、`const`にかかる制約は「入れたもの（値 or オブジェクト）を入れ替えられない」だけです。破壊的変更だろうが可能ですし、計算した結果を`const`変数に格納しようが一向に構いません。

似たような機能が何かにあったなと考えてみたら、Javaの`final`でした。
Dockerコンテナデプロイサービスの比較 (Beanstalk Multi-container Docker/ECS)

# 概要

最近Dockerコンテナでシステムの本番運用を始めました。その際にデプロイサービスとして検証したのがBeanstalk Multi-dockerとECS。今回は実際に両方触ってみて、両者のメリット・デメリットをまとめます。
尚、調査する上で、ECSで動作するRails コンテナ (Amazon Linuxイメージ) を作りました。ソースは [GitHub](https://github.com/naomichi-y/sandbox-ecs) で公開しています。

# 機能比較

Beanstalk、ECS共にDockerコンテナを動かすことはできますが、機能比較するとこんな感じです。

| 機能　| Beanstalk | ECS |
|:-:|:-:|:-:|
| EC2インスタンスの作成 | ◯ | ◯ |
| EC2セキュリティグループの割当 | アプリケーション環境単位で生成 | 既存のセキュリティグループを指定可能 |
| EC2オートスケーリング | ◯ | ◯ |
| ELB (CLB) の作成 | ◯ | ◯ |
| ELB (ALB) の作成 | ◯ (※1) | ◯ |
| ローリングデプロイ | ◯ | ◯ |
| ブルーグリーンデプロイ | ◯ | △<br>(OSS) |
| アラート通知 | ◯<br>環境作成のエラー・ヘルスステータスの変化等を通知| ☓ |
| ログ管理 | ◯ | ◯ |
| RDSインスタンスの生成 | ◯ | ☓ |

* ※1: CLIからのみ実行可能

# Beanstalkの特徴

* 環境構築が楽。EC2+RDSという一般的なアプリケーションであればBeanstalkコンソールでほぼ完結
* コンテナを用いないアプリケーションも構築可能
* Multi-container Dockerを利用すると、裏でECSが動く (ECSを意識しなくてもアプリケーションが動く)

Beanstalkはとにかく環境構築が簡単。ウィザードに従ってうっかり `Create environment` なんて押すもんならいきなりインスタンス起動してアプリケーションが動き出す。間違えて3回くらい押した。

<img width="600" alt="beanstalk.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/27454/060bfbdc-980e-e7a3-ef3e-a4991bcf6b4a.jpeg">

Beanstalkは環境構築が簡単な反面、裏で何のサービスが連動しているのか分かりにくい側面もあります。障害が発生した時、問題の切り分け (コンテナが原因なのか、ECSか、それともBeanstalkの問題か) が困難となる印象です。
ちなみにBeanstalkでもELBは利用できますが、ELB利用時にセッションストレージとしてよく使うであろうElastiCacheはBeanstalkのコンソールからは連携できないようです。

あと地味に便利だと思ったのはCloudWatchへのログ転送。Lambdaのように自動で各種ログをCloudWatchに流してくれる。恐らく裏でCloudWatch Logs Agentが動いてると思われる。

Beanstalkには色々と良い面もあるのですが、個人的にはセキュリティグループが謎の命名規則によって環境ごとに生成されまくるのが嫌という理由でECSの検討を始めました。

# ECSの特徴

* Dockerコンテナのデプロイに特化
* ALBが使える
  * CLBと比較してコストが安くパフォーマンスも高い
  * WebSocket、HTTP/2対応
  * L7ルーティング対応
  * 動的ポートマッピング対応
* Dockerの新機能はBeanstalkより早く取り込まれる

ECSを利用する場合、Beanstalk Multi-container Dockerが裏でやってくれていた仕事 (クラスタの構築、タスクの作成、サービスの作成) を自前で準備する必要があります。これが結構面倒です。CloudFormationでテンプレート書けば良さそうですが。

またECS特有の「タスク」や「サービス」の仕組みを理解する必要がありますが、概念さえ理解してしまえば、コンテナに対するリソース制限からネットワーク設定まで幅広い制御が可能です。

もう一点、ECSの特徴としてALBが使えることは大きなメリットですが、中でも動的ポートマッピングが良い感じ。
CLBの場合、1ホスト (EC2 Container Instance) につき1コンテナしかポートマッピングできなかったのが、ALBの利用によって複数マッピング可能となりました。これによって、1ホストで複数のWebアプリケーションを動かすことが可能となります。
また、今までELB利用時は2台のインスタンスを分散配置させる必要がありましたが、ALBはポート単位でコンテナと接続するため、1ホストだけ配置しておけば、あとはよしなにリクエストを分散してくれるようになります。

ちなみにECSはいくつかデプロイツールが公開されてます。これも機能を比較してみました。

| パッケージ　| GitHub Watch | GitHub Star | GitHub Fork | 特徴 |
|:-:|:-:|:-:|:-:|:-:|
| [aws/amazon-ecs-cli](https://github.com/aws/amazon-ecs-cli) | 67 | 491 | 79 | AWSオフィシャル。Docker composeファイルが利用可能 |
| [silinternational/ecs-deploy](https://github.com/silinternational/ecs-deploy) | 31 | 473 | 154 | サービスのデプロイに特化 |
| [stormcat24/ecs-formation](https://github.com/stormcat24/ecs-formation) | 8 | 78 | 9 | ブルーグリーンデプロイが可能 |

ecs-cliはクラスタの設定を `~/.ecs/config` に書き込むイマイチ仕様だったので、今回はecs-deployを採用。
最近はDocker CI環境を構築し、ecs-deployをラップしたデプロイツールでコンテナの本番運用を始めてます。
次のフェーズとしてデプロイの自動化を検討しているので、これについてはまた次回書こうと思います。
PythonでU分布を生成する


書籍：「データの見えざる手　ウエアラブルセンサが明かす人間・組織・社会の法則」に記載のあったU分布を生成してみたいと考え、Pythonでプログラミングを行ってみました。
2017.2.12コードの誤りを修正しました。

書籍についての詳細は以下リンクの私のブログにも記載しています。
[リンク]http://kansetsulight.seesaa.net

#コード
import numpy as np
import matplotlib.pyplot as plt

nindex = []

n = 0
nxxx = 0
nyyy = 0
x = np.random.rand(1000)*100
y = np.random.rand(1000)*100

while n < 1000:
 if x[n] < 10:
  nxxx = 1
 elif x[n] < 20:
  nxxx = 2
 elif x[n] < 30:
  nxxx = 3
 elif x[n] < 40:
  nxxx = 4
 elif x[n] < 50:
  nxxx = 5
 elif x[n] < 60:
  nxxx = 6
 elif x[n] < 70:
  nxxx = 7
 elif x[n] < 80:
  nxxx = 8
 elif x[n] < 90:
  nxxx = 9
 elif x[n] <= 100:
  nxxx = 10

 if y[n] < 10:
  nyyy = 1
 elif y[n] < 20:
  nyyy = 2
 elif y[n] < 30:
  nyyy = 3
 elif y[n] < 40:
  nyyy = 4
 elif y[n] < 50:
  nyyy = 5
 elif y[n] < 60:
  nyyy = 6
 elif y[n] < 70:
  nyyy = 7
 elif y[n] < 80:
  nyyy = 8
 elif y[n] < 90:
  nyyy = 9
 elif y[n] <= 100:
  nyyy = 10

 nindex.append([nxxx, nyyy])
 n = n + 1
 nxxx = 0
 nyyy = 0
ite = 0
chk = 0
while ite < 1e4:

 chk1 = 0
 while chk1 == 0:
  x_strt = np.random.randint(1,11)
  y_strt = np.random.randint(1,11)

  chk1 = nindex.count([x_strt,y_strt])

 strt = nindex.index([x_strt,y_strt])
 print 'index of start: ',strt
 print 'index of start: ',nindex[strt]
 print 'x_strt, y_strt: ',x_strt, y_strt

 chk2 = 0
 while chk2 == 0:
  x_dest = np.random.randint(1,11)
  y_dest = np.random.randint(1,11)
  chk2 = nindex.count([x_dest,y_dest])
  print chk2


 dest = nindex.index([x_dest,y_dest])

 x[strt] = float(x_dest*10)-np.random.uniform(0,10)
 y[strt] = float(y_dest*10)-np.random.uniform(0,10)
 print 'dest x,y index:  ', x_dest,' ', y_dest
 print 'dest crd: ',x[strt],y[strt]
 print

# Update for nindex
 nindex[strt] = nindex[dest]
 ite = ite + 1


fig = plt.figure()

ax = fig.add_subplot(1,1,1)

ax.scatter(x,y,s=1)
ax.set_title('random plot')
ax.set_xlabel('x')
ax.set_ylabel('y')

ax.grid(True)

plt.savefig('testfig')
plt.show()


コードはGitHubにもUpしています。
[リンク]https://github.com/yama89/U-distribution1.0


##結果
`< 1step後 >`
![up1.png](https://qiita-image-store.s3.amazonaws.com/0/163614/886dc314-6945-69c7-97e4-2b14abfbf16b.png "up1.png")

まだまだ均等ですね。

`<10step後>`
![up10.png](https://qiita-image-store.s3.amazonaws.com/0/163614/2a8316ca-0587-1eea-3bb0-1cf7acee4771.png "up10.png")

あまり変わりません

`<100step後>`
![up100.png](https://qiita-image-store.s3.amazonaws.com/0/163614/91eec3e6-ed96-6472-f971-fefc4c6c2d3b.png "up100.png")

これまたあまり（全く？）変わりません。

`<1000step後>`
![up1000.png](https://qiita-image-store.s3.amazonaws.com/0/163614/8a4d83cd-b5bf-4e7c-390e-68640e3a2e4d.png "up1000.png")


いよいよ偏りが出てきた気がする。

`<2000step後>`
![up2000.png](https://qiita-image-store.s3.amazonaws.com/0/163614/f274b0ba-a04a-6497-1cf6-7a70f41c090c.png "up2000.png")


これはきました。
偏りが明らかに現れています。

`<10000step後>`
![up10000.png](https://qiita-image-store.s3.amazonaws.com/0/163614/7f4222da-2bd8-25a6-f05d-196790ac3232.png "up10000.png")


これぞU分布といったものが出ました。

これは何かに活用したいなあ。
と思います。
AWS Lambdaのタイムゾーン変更

#開発中のこと…
上司から「DB上のタイムスタンプがズレてるよ」と指摘を受けました。
Lambdaで受け取ったリクエストに応じてEC2上のDBへ書き込みに行くAPIの開発だったのですが、確認すると確かに9時間ズレてる… 

#原因究明
リージョンも東京に設定しているのに何故かなー？といろいろ調べてたらこんな記事を見つけました。
[AWS lambda のタイムゾーンを東京にする | hacknote](http://hacknote.jp/archives/10055/)

記事は東京リージョンリリース前みたいなんですが、リージョンを東京にしてても何故かタイムゾーンだけズレるんですよねぇ…
`process.env.TZ = 'Asia/Tokyo'`
このスクリプトを差し込めば良いっぽいのですが、あいにくJavaでの開発だった為使えませんでした。

#解決策
で、どうしたら良かったかというと、Lambdaコンソールから、Functions→特定のファンクションまで降りていって、Codeタブの下部にある***Environment variables*** の ***Key*** と ***Value*** にそれぞれ **TZ**・**Asia/Tokyo** と入力すれば良いみたいです。

![a2326702-2c92-cae9-cc9c-d828ce8a6438.png](https://qiita-image-store.s3.amazonaws.com/0/164392/3514bbe7-a72c-6083-46af-be45d0d84951.png)

テストした結果、無事に日本時間で出力されました。
単純なところでハマったので、備忘録も兼ねて。
開発スピードを保つコツ

# 開発あるある
* 要件が増え続ける。
* この機能本当に必要だっけ？
* 開発おわらねえええ！

----

# 目的
* 重要なことにフォーカスして、ユーザーへ素早く価値を届ける。
* 検討・調整・議論に時間がかかって疲弊するのを防ぐ。

----

### 価値に注目して解決しよう！

----

#### 1. 価値からスタート
* まずはユーザーに提供する価値だけを考える。
* 「ユーザーに○○を提供する」のように一言で言えるゴールを定める。
* これがメンバー間で合意できるまで個人作業に入ってはダメ。
* 合意せず作業に入ると対立が起きやすい。別々の方向に走り始めるとチームワークは生まれない。

----

#### 2. 要件や仕様を最小にする
* 1で定めた価値を提供する最小の要件・仕様を考える。
* 機能やKPIから考えると要件・仕様が増え続けるのでダメ。
* 要件・仕様を増やしてもユーザーに提供できる価値はほとんど変わらない。 

----

#### 3. やらないことリスト
* 不安と戦う武器は機能追加ではなく、やらないことリスト。
* 成功確率を高めるため、最小でリリースして改善サイクルを回す意思をプロジェクト内外に示せる。
* 「無いよりあったほうがいい」は危険ワード。
* 想定されるものは事前にリストへ入れておく。

----

#### 効果
* 要件・仕様が最小なので、重要でない議論や調整がほとんどなくなる。
* 開発に集中できる -> 進む -> 終わる！
* 重要なことだけに取り組むので、やることは少なく、効果は大きくなる！

----

#### 参考
* [Inspired: 顧客の心を捉える製品の創り方](http://amzn.asia/93w3J4m)
* [アジャイルサムライ−達人開発者への道−](http://amzn.asia/fuaILgi)
simple-chat (Meteor)のdemoを動かす

多くの人がMeteorを勉強してまず思うのが、チャットアプリを簡単に作れるな、ということだろう。
クライアント（minimongo）とサーバ(mongo)がソケット通信(DDP)で勝手に通信してくれるのだから、ほかに何もすることはない。

何もすることはないと言っても、UIとか、ROOM管理とか、やはり面倒な仕事はある。そんな時に便利なのがsimple-chatだ。ここにはチャットアプリに必要な基本が全て揃っている。

というわけで、デモプログラムを動かしてみた。その設定手順です。

まず以下のコマンドを打つべし！
meteor create simple-chat
cd simple-chat
meteor npm install
rm server/*
rm client/*

meteor add session
meteor add random
meteor add cesarve:simple-chat
meteor add twbs:bootstrap
meteor add kadira:blaze-layout
meteor add kadira:flow-router
meteor add audit-argument-checks
meteor remove autopublish

次に以下のデモプログラムをダウンロードする
https://github.com/cesarve77/demo-simple-chat

デモプログラムをsimple-chatディレクトリ直下に置く
simplechat.html
simplechat.js
simplechat.css
public

以上で一応動作するはずです。

但しroomに入るときに以下のエラーが出ます。エラーは出るが動作はします。
Exception while invoking method 'SimpleChat.join' TypeError: SimpleChat.options.onJoin is not a function

まあ、これからsimple-chat本体のプログラムを読み解く予定なので、その時に一緒にデッバグできたらいいなと思います。
cocos2d-x(C++)周り勉強中🔰 他の言語やゲームエンジンの違いなども..

## NodeやSpriteの複製（コピー）はできない。。

Cocos Studioで使える、ImageViewやWidget等はclone()が使えるのに。

## parentSprite->addChild(childSprite)した、子Spriteは移動できない。

```cpp:

parentSprite->addChild(childSprite);
otherSprite->addChild(childSprite);

```

## CocosStudioで作ったアニメーション付きのオブジェクトをcloneすると、アニメーションが再生されない。

```

    // オブジェクト
    auto bg = CSLoader::createNode("GamePlay.csb");
    addChild(bg);
    
    //アニメーション
    auto action = cocostudio::timeline::ActionTimelineCache::getInstance()->createAction("GamePlay.csb");
    runAction(action);


    auto bgGameImageView = bg->getChildByName<ui::ImageView*>("Image_1");
    bgGameImageView->setPosition(Vec2(200.0,400.0));
    
    
    // cloneした、これはアニメーションしない。
    auto bgGameImageView2 = bgGameImageView->clone();
    bgGameImageView2->setPosition(Vec2(200.0,600.0));
    addChild(bgGameImageView2);


　　action->play("animation0",true); // 1=アニメーション名,ループflg


```



## cloneしたbuttonをpushbackできない？

```cpp:

    Vector<ui::Button*> mStageBtns;

　　〜省略〜

    for (int i = 0; i < 9; i++) {
        auto newStageBtn = stageBtn->clone();
        addChild(newStageBtn);
        mStageBtns.pushBack(newStageBtn); //エラーになる。
    }

```

autoをui::Button*にしても駄目、だけどWidgetにするとコンパイルエラーはなくなりました。

で、cocos2dxの大先輩から教えてもらったダウンキャストで、綺麗になりました。
こちら

```cpp:

auto newStageBtn = static_cast<ui::Button*>(stageBtn->clone()); //static_castで、buttonをcloneするとpushbackできないのを回避
stage->addChild(newStageBtn);
mStageBtns.pushBack(newStageBtn);


```

## ScrollView内のButtonが参照できない。

```cpp:
    auto stage = select->getChildByName<Node *>("stage");
//    auto scrollView = static_cast<ui::ScrollView*>(stage->getChildByName<ui::ScrollView*>("ScrollView_StageView")); //キャストしても駄目
    auto scrollView = stage->getChildByName<ui::ScrollView*>("ScrollView_StageView");
    auto stageBtn = scrollView->getChildByName<ui::Button *>("stage_1"); //個々でエラー

```

暫定的な解決策、ButtonをScrollView内ではなく外から利用する汗

```cpp:
auto stageBtn = stage->getChildByName<ui::Button *>("stage_1"); //ScrollView内のButtonが参照できないので、ScrollView外のButtonを利用
```

## Androidでビルドする際に型変換でstd::to_string()を使っているとビルドできない。

ndkが対応していないみたい。
自作関数やMacroなどで対応するか。

```cpp:
StringUtils::toString(myInt);
```
などで対応する

## Layout(Panel)を使うと、getChildByNameで普通に参照できない（恐らくScrollViewも同じあつかい

```cpp:
 auto tmpPageView = dynamic_cast<PageView*>(pSender);
            
            
string layoutPlanetName = "Layout_Planet_";
layoutPlanetName.append(StringUtils::toString(tmpPageView->getCurPageIndex()));

auto panelPlanet = tmpPageView->getChildByName<ui::Layout*>(layoutPlanetName);  // ここで「Expected expression」エラーになる。

```
ヘタにLayoutを使わず、Nodeを使う方が安全かも。listView等もBtnのイベントを階層深くすると取れなくなったりするので、そこら辺が影響しているのかも。

下記のように**dynamic_cast**すると一応対応できる

```cpp:

    string layoutPlanetName = "Layout_Planet_";
    layoutPlanetName.append(StringUtils::toString(selectGameNum));
    auto panelPlanet = dynamic_cast<Layout*>(pageView->getChildByName(layoutPlanetName));
    auto nameLabel = panelPlanet->getChildByName<Node*>("Node_Planet")->getChildByName<ui::Text *>("Text");

```
.gitについて

ふつうの.git
===============

ふつうのgitリポジトリの.gitはフォルダ。中にこんなものがはいってたりする

* FETCH_HEAD    : リモートの最新
* HEAD          : 最新のワークがどのブランチ/タグを指しているか
* ORIG_HEAD     : git cloneしたリモートブランチの最新
* MERGE_HEAD    : git mergeした相手の情報
* config        : リポジトリ固有の設定(ini形式)
* description   : なんかリポジトリの名前が入るらしい
* hooks/        : フックが入るパス
* index         : git addしたりすると、その時の状態が格納されるバイナリファイル
* logs/         : 参照の更新情報
* modules/      : サブモジュールの.git
* objects/      : ファイルとかフォルダの実態
* objects/pack/ : git gcされて複数のオブジェクトがマージされたやつがはいってる
* packed-refs/  : [packされた古いオブジェクト類を参照しているrefs](https://git-scm.com/book/ja/v1/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%82%A4%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA)
* refs/         : タグとかブランチとか
* worktree/     : git worktree addするとここにフォルダができる

サブモジュールの.git
===============

サブモジュールの.gitはファイル。こんな感じのものが書かれている。親のリポジトリの.git/modules/commonlibを見てねということ。

```
gitdir: ../.git/modules/commonlib
```

サブモジュールの実態はこの参照先を見るが、基本的にはふつうのgitリポジトリと同じ。逆方向のリンク情報が格納されたgitdirファイルだけが違うっぽい

```
* gitdir: サブモジュールのワークフォルダ無いの.gitファイルへの相対パスが書かれている。
```

worktreeの.git
===============

worktreeの.gitも基本的にはサブモジュールと同じ、リンクの書かれたテキストファイル。ただし、参照先は.git/worktree以下。

で、この中のリポジトリ構成が少し異なる

* HEAD      : ふつうのリポジトリと同じ
* ORIG_HEAD : ふつうのリポジトリと同じ
* commondir : ```../..``` とだけ書かれたテキストファイル
* gitdir    : サブモジュールと同じ
* index     : ふつうのリポジトリと同じ

worktreeはobjectとかrefは参照元と共有するので、commondirというファイルを使って探し先を保持しているらしい。

で、今日の成果だけど、[libgit2はobjects/HEAD/refsの項目があるかどうかで、正しいリポジトリかどうかを判定している](https://github.com/libgit2/libgit2/blob/master/src/repository.c#L160-L174)。よって、worktreeで作ったフォルダを開こうとするとエラーになる。

ということで、worktreeはまだまだトラブルになる可能性が高そう、ということだけがわかりました。
Clojure のインストールと Hello World の実行

## Clojure とは

Clojure は JVM (Java Virtual Machine) 上で動作するプログラミング言語。

Clojure https://clojure.org/

> Clojure is a robust, practical, and fast programming language with a set of useful features that together form a simple, coherent, and powerful tool.

## 今回の動作確認環境

macOS Sierra + Java 1.8 + Homebrew

## Homebrew で Clojure をインストールする

Homebrew で Clojure をインストールしようと検索してみたら、

```sh
$ brew search clojure
clojurescript
homebrew/emacs/clojure-mode

If you meant "clojure" precisely:

Clojure isn't really a program but a library managed as part of a
project and Leiningen is the user interface to that library.

To install Clojure you should install Leiningen:
  brew install leiningen
and then follow the tutorial:
  https://github.com/technomancy/leiningen/blob/stable/doc/TUTORIAL.md
```

Leiningen をインストールすべきだというメッセージが表示された。

Leiningen は Clojure のためのプロジェクト管理＆ビルドツール。

Leiningen https://leiningen.org/

> for automating Clojure projects without setting your hair on fire

> Leiningen is the easiest way to use Clojure. With a focus on project automation and declarative configuration, it gets out of your way and lets you focus on your code.

Clojure - Getting Started https://clojure.org/guides/getting_started

> Leiningen is a build and project management tool written in Clojure and used pervasively throughout the Clojure community.

Homebrew で Leiningen をインストールする。

```sh
$ brew install leiningen
```

Leiningen を実行するコマンドは lein。
バージョンを確認してみる。

```sh
$ lein --version
Leiningen 2.7.1 on Java 1.8.0_121 Java HotSpot(TM) 64-Bit Server VM
```

leiningen の JAR ファイルは /usr/local/Cellar/leiningen/2.7.1/libexec/leiningen-2.7.1-standalone.jar に配置されている。

## Clojure で Hello World してみる

以下の内容を hello.clj というファイル名で保存する。

```
; hello world してみる
(println "Hello World!")
```

java コマンドで clojure.main と ファイル名 hello.clj を指定して実行すると Hello World が出力される。

```sh
$ java -cp /usr/local/Cellar/leiningen/2.7.1/libexec/leiningen-2.7.1-standalone.jar clojure.main hello.clj
Hello World!
```

## 参考資料

- Clojure https://clojure.org/
- Clojure - Wikipedia https://ja.wikipedia.org/wiki/Clojure
simとモバイルwifiのよくある初期設定


だいたいこの二つのはず。
どっちも設定するってことだけメモしておく。

#1.モバイルwifi側の初期設定をする。
どちらも専用のサポートページがあるのでググる。
どの端末で設定するのかもざっくり入れておいた方がいい。
「端末名」＋「初期設定」＋「パソコン or 携帯」
「simのプロバイダ名」＋「初期設定」＋「パソコン or 携帯」



#2.sim側の初期設定をする。

simのログイン情報を設定する
（APN、ID、パスワード、認証方式など）

BIGLOBE LTE・3Gの場合
http://support.biglobe.ne.jp/settei/setuzoku/lte/
【Sinatra】オートロード && オートリロードしてほしい

http://qiita.com/izumin5210/items/cd2f9f48fbe1fdcaf628 の続編

sinatra-reloaderを使わなければもっと楽になる気がする…

---

## 導入

とりあえず`sinatra-contrib`と`activesupport'を入れる．

```ruby:Gemfile
# 前略

gem 'sinatra'
gem 'sinatra-contrib'
gem 'activesupport'

# 後略
```


## ディレクトリ構成例
`config/boot.rb`を用意し，最初にこれを読ませるようにする．

```
.
├── Gemfile
├── Gemfile.lock
├── config
│   ├── boot.rb
│   ├── database.yml
│   └── global
├── config.ru
├── lib
│   ├── app
│   ├── models
│   ├── ...
│
...
```

オートロードに`ActiveSupport::Dependencies`を利用するので，ファイル名とその中に定義されてるmodule/class名はその規約に従わないといけない．

e.g.

- `./lib/models/user.rb` => `User`
- `./lib/models/app/user.rb` => `App::User`

## 有効化

### Classic Application
#### オートロード

`ActiveSupport::Dependencies.autoload_paths`に対象ディレクトリ（ここでは`./lib`以下の各ディレクトリ）を喰わせる．

```ruby:config/boot.rb
ROOT_DIR = File.join(File.expand_path(File.dirname(__FILE__)), '..')
SOURCES_DIR = File.join(ROOT_DIR, 'lib')
ActiveSupport::Dependencies.autoload_paths = Dir[File.join(SOURCES_DIR, '**')]
```

#### オートリロード
どこかで`sinatra/reloader`を有効化する．その後，オートリロードしたいファイル（ここでは`./lib`以下の各`*.rb`ファイル）を`also_reload`に喰わせる．

```ruby:lib/app/app.rb
require 'sinatra'

if development?
  require 'sinatra/reloader'
  Dir[File.join(SOURCES_DIR, '**', '*.rb')].each { |f| also_reload f }
end
```

### Modular Application
#### オートロード
Classicのときと同じ．

#### オートリロード
だいたい似たような感じ．

```ruby:app.rb
require 'sinatra/reloader' if development?

class App < Sinatra::Base
  configure :development do
    register Sinatra::Reloader
    Dir[File.join(SOURCES_DIR, '**', '*.rb')].each { |f| also_reload f }
  end

  # snip.
end
```

# 参考
- [Sinatra::Reloader (part of Sinatra::Contrib)](http://www.sinatrarb.com/contrib/reloader.html)
- [ActiveSupport::Dependencies](http://api.rubyonrails.org/classes/ActiveSupport/Dependencies.html)
ReactでWindowのリサイズイベントを取得するのに react-event-listenerつかった


Redux + ReactなサイトでウィンドウサイズもReduxで管理させたかった。
Cantainer内で設定することもできるが、ルートコンポーネントが管理することになりそうなので、何か便利なものはないか探したたら[react-event-listener](https://www.npmjs.com/package/react-event-listener)があった。

```
<EventListener target="window" onResize={onResize} />
```
みたいな感じでつかえるので、以下のようなContainerを用意してつかっています。

```containers/resize_event_listener.js
import { connect } from 'react-redux'
import EventListener from 'react-event-listener';

const resize = (value) => { type: 'RESIZE', value };

const mapStateToProps = (state, ownProps) => {
    return {
        target: window
    };
};

const mapDispatchToProps = (dispatch, ownProps) => {
    return {
        onResize: () => {
            return dispatch(resize(window.innerWidth, window.innerHeight));
        }
    }
};

const ResizeEventListener = connect(mapStateToProps, mapDispatchToProps)(EventListener);

export default ResizeEventListener
```

みたいなのを用意して以下のようにつかってます。

```
<ResizeEventListener />
```

### もうちょっと詳しく

reactつかうときはなるべく`const`だけで戦いたいといろいろやってるうちにこういうやり方におちつきました。
あと関数スタイルのコンポーネント作成にこだわりたいというのもあります。

このReactEventListenerを使わない場合は以下のように書いて近いことはできます。

```
const mapDispatchToProps = (dispatch, ownProps) => {
    window.addEventListener('resize', () => {
       dispatch(resize(window.innerWidth, window.innerHeight)
    }
    return {}
};
```

`componentDidMount`の代わりのようにつかえますが、`componentWillUnmount`の代わりにつかう方法がないので、`removeEventListener`する良い方法が浮かびません。
他には[https://github.com/acdlite/recompose](recompose)を使うと関数スタイルを貫き通すことができると思います。
_mm512_store_epi32と_mm512_mask_store_epi32のアライン

# はじめに

16個のintを、マスクに従って選択的にストアしたい。

つまり、

```cpp
int in[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int mask[16] = {1,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0};
```

みたいなデータから、

```cpp
int out[16] = {1,2,0,0,5,0,7,0,0,0,11,0,13,0,0,0}
```

を作りたい。これをAVX-512でintを16個マスク付きでストアで実現しようとして、ちょっとだけハマったのでメモ。

# \_mm512\_store\_epi32

まずはマスク無しでデータのコピーができるか試す。単にzmmに配列からデータをロードして、別のところに書き込むサンプル。

```cpp:store.cpp
#include <immintrin.h>
#include <stdio.h>
int out[16] = {};
int in[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
void
dump(int a[16]){
  for(int i=0;i<16;i++){
    printf("%02d ",a[i]);
  }
  printf("\n");
}
int
main(void){
  __m512i vin = _mm512_loadu_si512(in);
  _mm512_store_epi32(out,vin);
  dump(in);
  dump(out);
}

```

```shell-session
$ icpc store.cpp
$ ./a.out
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 
```

問題なくできた。

# \_mm512\_mask\_store\_epi32

次、マスク付きでやってみる。コードはこんな感じになるだろう。

```cpp:maskstore.cpp
#include <immintrin.h>
#include <stdio.h>
int out[16] = {};
int in[16] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16};
int mask[16] = {1,1,0,0,1,0,1,0,0,0,1,0,1,0,0,0};
void
dump(int a[16]){
  for(int i=0;i<16;i++){
    printf("%02d ",a[i]);
  }
  printf("\n");
}
int
main(void){
  __m512i vin = _mm512_loadu_si512(in);
  __m512i vmask = _mm512_loadu_si512(mask);
  __mmask16 vm = _mm512_test_epi32_mask(vmask,vmask);
  _mm512_mask_store_epi32(out,vm,vin);
  dump(in);
  dump(mask);
  dump(out);
}

```

一度zmmにマスクデータをロードし、`vptestmd`でビットに落とすことでマスクレジスタ(`__mmask16 vm`)を作っている。[^1]

さて、コンパイルして実行する。

```shell-session
$ icpc maskstore.cpp
$ ./a.out
Segmentation fault
```

ありゃ、SIGSEGVった。

原因は、`_mm512_test_epi32_mask`、というか`vmovdqa32`が64バイトアラインを要求するから。出力先を

```cpp
__attribute__((aligned(64))) int out[16] = {};
```

と64バイトアラインしてやると、

```shell-session
$ ./a.out
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 
01 01 00 00 01 00 01 00 00 00 01 00 01 00 00 00 
01 02 00 00 05 00 07 00 00 00 11 00 13 00 00 00 
```

と、所望の動作になる。

# 原因というか言い訳というか

[インテルのマニュアル](https://software.intel.com/en-us/node/683208)には、`_mm512_store_epi32`も`_mm512_test_epi32_mask`も、対応する命令は`vmovdqa32`で、それは64バイトアラインを要求する、と書いてあるように読める。

で、何も指定しないで`_mm512_store_epi32`がうまく行ったから、「あ、コンパイラが勝手に64バイトアラインしてくれたんだ」と思い込んでて、`_mm512_test_epi32_mask`を使ったらSIGSEGVって、別の原因を探していた。

で、アセンブリ見ると、`_mm512_store_epi32`は`vmovdqa32`ではなく`vmovups`を呼んでいる。`store.cpp`のアセンブリはこんな感じ。

```nasm
        vmovups   in(%rip), %zmm0
        vmovups   %zmm0, out(%rip) 
```

`vmovups`は32バイトアラインで良くて、なんか(古いのは知らんけど少なくとも最近の)インテルコンパイラは勝手に32バイトアラインで配列を取ってくれるので、問題なく動作してた。で、もちろん`_mm512_test_epi32_mask`は、`vmovdqa32`を呼ぶ。こんな感じ。

```nasm
        vmovups   mask(%rip), %zmm0
        vmovups   in(%rip), %zmm1
        vptestmd  %zmm0, %zmm0, %k1
        vmovdqa32 %zmm1, out(%rip){%k1}  
```

`vmovdqa32`は格納先が64バイトアラインされていることを要求するのでSIGSEGVる。

# まとめ

マニュアルには`_mm512_store_epi32`も`_mm512_test_epi32_mask`も対応する命令が`vmovdqa32`と書いてあったけど、筆者が試した環境では前者は`vmovups`が呼ばれてる。混乱無く使うためには、AVX-512使う際には64バイトアラインする癖つけといたほうが良さそう。

どうでもいいけど、マスクレジスタ便利っぽい。いろいろ使えそう。

[^1]: 二進表現マスク作るといつもMSBと配列の向きが逆なので混乱するので、ここではわかりやすさを優先した。
i18next の使用例

国際化はそんなに理解が難しい処理ではないと思うんですが、i18nextの使い方を調べるのに思ってた以上に手間取ったので、基本的な使い方をメモとして残しておきます。

[i18next](http://i18next.com/)

### i18nextオブジェクトの初期化

initメソッドを呼び出してi18nextオブジェクトを初期化する必要がある。

翻訳データをこの時点で準備できるなら、resources パラメータに渡すことができます。ドキュメントの [Getting started](http://i18next.com/docs/) がいいサンプルになっています。


# あとから言語を切り替えるとき
changeLanguage メソッドを使います。

# あとから翻訳データを追加するとき
addResources メソッドを使います。

# 翻訳データの取得
tメソッドを使います。

# 使用例
```js
import i18n from 'i18next';

i18n.
  init(
    {
      fallbackLng: 'en',
      resources: {}
    }
  );

i18n.addResources('en', 'translation', {hoge: 'foo', moge: 'bar'}); // 'translation' はデフォルトのネームスペース。initの引数でデフォルトのネームスペースを変えることもできる
i18n.addResources('ja', 'translation', {hoge: 'ほげ', moge: 'もげ'});

console.log(i18n.t('hoge'));
// => foo

i18n.changeLanguage('ja');

console.log(i18n.t('hoge'));
// => ほげ

```

react-i18next などの、i18nextを利用したライブラリを使うときでも、翻訳データのセットや言語の切り替えは、この仕組を使うことができます。

その他のAPIの説明は、[API document](http://i18next.com/docs/api/) から確認できます。

以上です。
Vim でテストコード書きながらその場でテスト流すのを tmux の send-keys で超快適にやる

Vim でテストコードを書きながら、Vim を抜けずその場でそのファイルとかその行のテストを流したい

![send-keys.gif](https://qiita-image-store.s3.amazonaws.com/0/29846/e6802f3f-63c0-318d-1387-a6f537c1159f.gif)

そういうとき Emacs とか Atom だとプラグインでやってたけど、いまいち Vim だとそういうやり方がしっくりこないなと思っていたところで「もう tmux で別ペイン開いといて send-keys するのでいいのでは」という結論になった。

この方法だとテストの種類によって変えるのも実行コマンドを変えるだけで簡単にできるし、実際にテストを流すのが Docker コンテナの中、とかいうときにもそのまま応用できるのでなかなかよい。

具体的にどういうことができるかというと、これから書く例では、tmux を左右の2ペインに分割しておいて、

- 左ペインに Vim
- 右ペインにテストコマンドを実行したい場所

が設定された状態で、Vim でテストコードを書きながら右ペインでテストを実行するというもの。

## send-keys を実行するスクリプト

まずは send-keys を実行するスクリプトを用意する。

**tmux-send-keys-to-right-pane**

```bash
#!/usr/bin/env sh

session=$(tmux display-message -p '#S')
window=${session}:$(tmux display-message -p '#I')

args=""

for arg in $@; do
  args="${args}""${arg} "
done

tmux send-keys -t right C-z "${args}" C-m
```

かなり雑だけどこんな感じとか。

これに実行権限をつけてパスの通るところに置くなりした上で、tmux のウィンドウ上で右ペインを起動して、例えば左ペイン側で

```
$ tmux-send-keys-to-right-pane ls -la
```

とすると右ペインで `ls -la` が実行されると思う。

これで実行する対象をテストのコマンドにすれば、当然右ペインではテストが実行される。

## Vim の中から↑のスクリプトを実行する

ここからは Vim の設定になります！

とりあえず `.vimrc` に直接設定を書いて参ります！また、私事で大変恐縮なのですが、今私が Ruby on Rails で Minitest を書いており、それを実行したいという気持ちがあることから、Ruby on Rails で Minitest を実行するのを例として説明したいと思います！大変申し訳ございません。

よろしいでしょうか。では `.vimrc` に以下を記載してください！

**.vimrc**

```vim
command! RailsTest echo s:rails_test(expand('%'), getpos('.'))

function! s:rails_test(file, pos)
  let l:cmd = printf('tmux-send-keys bin/rails test %s:%d', a:file, a:pos[1])
  return system(l:cmd)
endfunction

nnoremap <Leader>rt :<C-u>RailsTest<Return>
```

簡単に説明しますと、これでやりたいことができるやつです！簡単すぎましたかね？もう少しだけ説明しますと、これは Vim のバッファ上で実行するもので、バッファのファイルとカーソル位置を Rails (5) のテストコマンドに渡しまして、そしてテストを実行する、そういうものであります。

ここでは `RailsTest` というコマンドが定義されておりまして、そして `<Leader>rt` がバインドされておりますので、つまりこれを読み込んだ後に左ペインの Vim で Minitest のファイルを開き、そして右ペインでは Rails のルートディレクトリをカレントディレクトリとした状態で `<Leader>rt` とキーをストローキングしますと、右ペインの方で `bin/rails test <バッファのファイル名>:<行番号>` が実行されまして、はい、実行されます。もちろん Vim 内部で同期的に実行するわけではございませんので、テストの実行中に Vim の動作がブロックされるということはないのでご安心ください。先ほど申し上げました通り、右ペインで Docker コンテナの `bash` とかを実行しておけばそのままコマンドを書き換えることなく Docker コンテナでテストが実行できますし、上記をコピペしてコマンド名と関数名、そして

```vim
  let l:cmd = printf('tmux-send-keys bin/rails test %s:%d', a:file, a:pos[1])
```

ここの行を書き換えれば任意のコマンドを実行することができるので便利に使っていただけると思います。ちなみに tmuxinator とかそういうやつは一度も使ったことがありません。あと参考にしました thanks to http://superuser.com/questions/492266/run-or-send-a-command-to-a-tmux-pane-in-a-running-tmux-session すごーいフレンズ
nw.jsでdevtoolsが表示されない


nw.jsでGoogle developer toolが表示されなかった。
どうやらsdkバージョンをインストールしないとけないとのこと。

# バージョンを指定してインストール

```
$ npm install nw@0.18.0-sdk --save-dev
```

無事に`cmd option + i` (windowsの場合は`F12`) でデベロッパーツールを表示できた。

# 参考
- [Debugging with DevTools](http://docs.nwjs.io/en/latest/For%20Users/Debugging%20with%20DevTools/)
DOMの存在確認する方法で処理速度の速いコードは？

コードを書いているとDOMが存在するかどうかって判定を個人的に良く使います。
ネットで調べると何が速いとか出てきますが、やはり自分で実験してみないと納得できないので行ってみた。
あくまでも自分を納得させるためだけの実験であって、**結果が世の正義だなんて主張する気はサラサラありませぬ**。

# 実験環境とか
対象ページ：食べログさんのトップページ（執筆時現在）
対象DOM(ID)：line3559の#score-help-url（ソース最下部のID）
ブラウザ：Firefox 51.0.1 (64 ビット) 
試行回数：1000回を10セットの10000回

# 実験データ
## ケース1：$('#score-help-url')[0]

僕が良く使う判定文ですw
なんでこれなのかは、最初に覚えたやり方だから（笑）

|No.    |Result(1k)|Average   |
|-------|----------|----------|
|1      |1133.14ms |1.13314ms |
|2      |1283.13ms |1.28313ms |
|3      |1196.36ms |1.19636ms |
|4      |1074.92ms |1.07492ms |
|5      |1053.23ms |1.05323ms |
|6      |1076.31ms |1.07631ms |
|7      |1127.34ms |1.12734ms |
|8      |959.73ms  |0.95973ms |
|9      |890.24ms  |0.89024ms |
|10     |918.92ms  |0.91892ms |
|Ave    |          |**1.07133ms** |

## ケース2：$('#score-help-url').length > 0

よく他人様のコードで良く見かけるケース

|No.|Result(1k)|Average    |
|---|----------|-----------|
|1  |1149.92ms |1.14992ms  |
|2  |1183.5ms  |1.1835ms   |
|3  |1043.87ms |1.04387ms  |
|4  |1021.04ms |1.02104ms  |
|5  |1178.1ms  |1.1781ms   |
|6  |1130.74ms |1.13074ms  |
|7  |907.92ms  |0.90792ms  |
|8  |965ms     |0.965ms    |
|9  |920.16ms  |0.92016ms  |
|10 |1174.93ms |1.17493ms  |
|Ave|          |**1.067518ms**|


## ケース3：$('#score-help-url').length

ケース2の簡略版？

|No.|Result(1k)|Average   |
|---|--------- |----------|
|1  |1097.48ms |1.09748ms |
|2  |1037.17ms |1.03717ms |
|3  |980.55ms  |0.98055ms |
|4  |952.79ms  |0.95279ms |
|5  |1162.75ms |1.16275ms |
|6  |1052.19ms |1.05219ms |
|7  |978.23ms  |0.97823ms |
|8  |906.48ms  |0.90648ms |
|9  |945.24ms  |0.94524ms |
|10 |995.29ms  |0.99529ms |
|Ave|          |**1.010817ms**|

## ケース4：document.getElementById("score-help-url") != null

どっかにこれがぶっちぎり最速！っぽいことが書いてあった

|No.|Result(1k)|Average   |
|---|----------|----------|
|1  |1059.89ms |1.05989ms |
|2  |1025.28ms |1.02528ms |
|3  |1035.77ms |1.03577ms |
|4  |980.89ms  |0.98089ms |
|5  |1069.44ms |1.06944ms |
|6  |981.58ms  |0.98158ms |
|7  |942.43ms  |0.94243ms |
|8  |938.23ms  |0.93823ms |
|9  |924.28ms  |0.92428ms |
|10 |1019.25ms |1.01925ms |
|Ave|          |**0.997704ms**|

# 結論

やはりケース4の書き方が速いという結果がでましたが、マクロな世界過ぎてぶっちぎりなのか謎だw（謎）
速いに越したことはないので、今後、リファクタの際にはこの書き方に変えて行こうと思ふ。

# 参考データ

こんなスクリプトをコンソールでぶん回しました。

```test.js
$(function(){
  console.time('DOM確認速度計測')
  for(var i=0; i < 1000; i++){
    if(document.getElementById('score-help-url') != null){
      console.log('EXIST');
    };
  };
  console.timeEnd('DOM確認速度計測')
});

```
MySQL常用文字列操作関数

以下、動作環境はWindows版MySQL Community Server 5.7.16です。

#文字列の長さ

lengthとoctet_lengthとchar_lengthがあります。octet_lengthはlengthと同じです。
__lengthはバイト単位の長さ、__char_lengthは字数単位の長さです。文字列中にマルチバイト文字が含まれていると、結果に差が現れます。length(NULL)やchar_length(NULL)はNULLです。

```mysql
select length('1234567890');
10

select char_length('1234567890');
10

select length('１２３４５６７８９０');
30

select char_length('１２３４５６７８９０');
10

select length(null);
NULL

select char_length(null);
NULL
```

#部分文字列（左端・右端）

left(str, len)で、文字列strの左端len文字を切り取ります。バイト数ではなく字数です。len>length(str)の場合は、文字列全体を返します。len<0の場合は、空白文字列''を返します。str, lenのどちらかがNULLなら、戻り値もNULLです。right(str, len)は右端を切り取ります。

```mysql
select left('1234567890', 5);
12345

select left('１２３４５６７８９０', 5);
１２３４５

select left('1234567890', 1);
1

select left('1234567890', 0);


select left('1234567890', -1);


select left('1234567890', 11);
1234567890


select left(null, 1);
NULL

select left('1234567890', null);
NULL

select right('1234567890', 5);
67890

select right('１２３４５６７８９０', 5);
６７８９０

select right('1234567890', 1);
0

select right('1234567890', 0);


select right('1234567890', -1);


select right('1234567890', 11);
1234567890

select right(null, 1);
NULL

select right('1234567890', null);
NULL
```

#部分文字列（中間）

midとsubstrとsubstringがありますが、意味は全部同じです。
mid(str, pos, len)は、文字列strの位置posから始まる長さlenの文字列を返します。posは0ではなく1から始まります。最左端位置が1です。pos, lenはバイト数ではなく字数です。lenは省略することもでき、その場合は最右端までとなります。

```mysql
select mid('1234567890', 2, 1);
2

select mid('1234567890', 2);
234567890

select mid('１２３４５６７８９０', 2, 1);
２
```

#文字列内検索

instrとlocationとpositionがあります。instrとlocationは引数の並びが逆なので注意して下さい。positionはlocationと同じです。
instr(str, substr)で、str内で最初にsubstrが現れる位置を返します。位置は0でなく1から始まります。最左端位置が1です。substrが見つからない場合は0が返ります。検索は大文字小文字を区別しません。全角文字も、全角文字同士なら大文字と小文字を区別しません。つまり``Ａ``と``ａ``は同じ文字とみなされるということです。ただし、全角と半角は区別します。つまり``Ａ``と``A``は別の文字です。

```mysql
select instr('ABCDEFGHIJ', 'b');
2

select instr('ABCDEFGHIJ', 'z');
0

select instr('ＡＢＣＤＥＦＧＨＩＪ', 'A');
0

select instr('ＡＢＣＤＥＦＧＨＩＪ', 'ａ');
1

select instr('あいうえおかきくけこ', 'イ');
0
```

#置換

replace(str, from_str, to_str)で、str中に現れる部分文字列from_strを全部to_strに置き換えます。このとき、大文字と小文字を__区別します。__また、半角文字と全角文字も区別します。

```mysql
select replace('ABCDEFGHIJ', 'A', '*');
*BCDEFGHIJ

select replace('ABCDEFGHIJ', 'a', '*');
ABCDEFGHIJ

select replace('ＡＢＣＤＥＦＧＨＩＪ', 'A', '*');
ＡＢＣＤＥＦＧＨＩＪ
```

#Q&A
__Q. 文字列str内で部分文字列substrが「最後」に現れる位置を返す関数はないのか。__
A. ないみたいです。MS AccessにはInStrRevってのがありますが、MySQLにはありません。

以上！このぐらい頭に入っていれば取りあえず恰好はつくかな。

#参考文献

MySQL 5.6 リファレンスマニュアル/関数と演算子/文字列関数
https://dev.mysql.com/doc/refman/5.6/ja/string-functions.html
VMWare > パケットロスの効果 > UDP: 文字列の一部がロスするのではなく、パケットそのものがロスする

```
VMware Workstation v12
Windows 8.1 pro (64bit)
Windows 7 pro (32bit)
```

@tenmyo さんの[コメント](http://qiita.com/7of9/items/8e433c6d0f7a9b2fe373#comment-6d266e6f468cc83d7877)にて教えていただいたVMWare上のでパケットロスを試してみました。

パケットロスには以下の２つの選択肢があります。

A. 着信転送側のロス (%)
B. 発信転送側のロス (%)

受信側で着信転送ロスにすると、テストしたい通信以外にもインターネット接続でロスが起きるように思いました。
そのため、送信側の発信転送ロスの設定をしました。

## UDP通信

### 動作環境

- UDP Echo server : Windows 8.1 pro (64bit)
  - C++ Builderで自作したEcho Serverソフトを使用
  - 発信転送ロスを20%に設定
- クライアント : Windows 7 pro (32bit)
  - Unityで自作したUDP文字列送信ソフトを使用

Echo server  
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/ee192d12-1690-d27f-6023-25720476f6a5.png)

クライアント動作ソフト
![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/617753d2-7605-8907-80e0-3f9cb9ff0adc.png)

### 動作させて気づいた事項 > [パケットロス]の定義

`hello, how are you?`という文字列を送信したときのロスはパケット単位?でロスを発生する。

つまり、`hello, how are you?`のロス時にはエコーバック文字列はない。

`hello, how are you?`を送信して、`heo, ow, r y?`のようにはならない。

後者の状況というのが現在取り組んでいる症状である。

~~**と思うが、実際のところはWireSharkなどのキャプチャソフトを使ってみないと、間違っている可能性はある**~~

### WireSharkで確認

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/2ccff387-dd94-7e87-21f1-fe787f2c350f.png)

6000のポートへ送信後にEcho backがない通信が発生している。

上に書いたとおり、「文字列の一部がロス」ではなく、「パケット単位のロス」が発生するようだ。


## TCP/IP通信

のんさんによるＴＣＰ／ＩＰテストツールにて動作を見てみました。

http://www.vector.co.jp/soft/winnt/net/se411272.html
http://nonsoft.la.coocan.jp/

TCP/IPの場合は、送信処理でロスが発生しても、Delayの後にEcho Back文字列を受信できた。

TCP通信の再送処理が働いているようです。
[XCode][Cocoapods]ビルドエラー時の対処法

##問題
Podfileに新しいライブラリ（Firebase/Core）を追加してビルドしたところ下記のようなエラーが出た。

```
ld: warning: directory not found for option '-F/Users/.../GoogleToolboxForMac'
ld: framework not found GoogleToolboxForMac
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```

##解決法
先輩に解決方法を教えてもらったのでφ(..)メモメモ。

###1. Build Active Architecture Only を No に統一する
Build Settings のBuild Active Architecture Only をNoにする。

<img width="1031" alt="スクリーンショット_2017-02-08_18_25_40.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/07fe0c82-2c06-b477-186d-834fb17ef7f3.png">

<img width="1033" alt="スクリーンショット_2017-02-08_18_25_56.png" src="https://qiita-image-store.s3.amazonaws.com/0/22680/216f0072-89e6-9439-27cb-d748891c0970.png">

###2. Clean Build Folder & Build
optionを押しながらProductメニューをクリックして、「Clean Build Folder」を実行。
その後、再ビルドすればいけるはず・・。
Slack で、全チャンネル横断の新着リストを見る方法

チャンネルが増えてくると、「さっき見た発言、どこのチャンネルのだったっけ？」ということがありませんか。発言内容や発言者を覚えていれば検索できるけれど、それも曖昧だった場合はどうしよう？

そんなときは、こんなワードで検索してみましょう。

```
from:all
```

つまり、「全員からの発言」ですね。これで検索すると、全部のチャンネル（自分が購読していないチャンネルも含む）新着リストが閲覧出来ます。

<img width="495" alt="Slack_-_kaoritter_private.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/4584/5d8ef58b-ef44-6bae-5147-30f7c4d8e21a.jpeg">

便利！
PHPで配列の要素をunsetしてもインデックスは詰まらない


## 何が起きたか

```php
$array = range(1,5);
var_dump($array); // #1
unset($array[0]);
unset($array[1]);
unset($array[2]);
unset($array[3]);
unset($array[4]);
var_dump($array); // #2
```

```
// #1
array(5) {
  [0]=>
  int(1)
  [1]=>
  int(2)
  [2]=>
  int(3)
  [3]=>
  int(4)
  [4]=>
  int(5)
}
// #2
array(0) {
}
```

ここまでは期待どおりかもしれない。

ここで、空になった配列に要素を追加してみる。念のため[reset](http://php.net/manual/ja/function.reset.php)関数で配列の内部ポインタを先頭にする。

```php
// 先ほどのコードに下記のコードを追記
reset($array);
$array[] = 1;
$array[] = 2;
var_dump($array); // #3
```

なんと、reset関数で内部ポインタを先頭（＝0）に戻したつもりでしたが、実際には、内部ポインタは要素をunsetする前の末尾の4になっていたようです。
（なので新たに要素を追加すると、5から始まる）

```
// #3
array(2) {
  [5]=>
  int(1)
  [6]=>
  int(2)
}
```

## unsetで配列の要素を削除しているライブラリ（e.g. Doctrine ArrayCollection）
`Doctrine`の`ArrayCollection`は`unset`を使って配列の要素を削除しています。

http://www.doctrine-project.org/api/common/2.3/source-class-Doctrine.Common.Collections.ArrayCollection.html#115-131

```php
public function remove($key)
{
    if (isset($this->_elements[$key])) {
        $removed = $this->_elements[$key];
        unset($this->_elements[$key]);

        return $removed;
    }

    return null;
}
```

## 配列から要素を削除して、インデックスを詰める方法
配列から要素を削除して、インデックスを詰める方法は下記のとおりです。

- [array_splice](http://php.net/manual/ja/function.array-splice.php)を使う方法
- unsetした後、[array_values](http://php.net/manual/ja/function.array-values.php)でインデックスを詰める
- unsetした後、[array_merge](http://php.net/manual/ja/function.array-merge.php)でインデックスを詰める

詳しくは、下記の参考URLを参照ください。

## 参考
- [PHPで配列から特定の要素を削除する - Qiita](http://qiita.com/Quantum/items/767dba44af81d1825248)
- [php - How to Remove Array Element and Then Re-Index Array? - Stack Overflow](http://stackoverflow.com/questions/5217721/how-to-remove-array-element-and-then-re-index-array)
ER図の作り方【簡易版】

#ER図とは
![Untitled (5).png](https://qiita-image-store.s3.amazonaws.com/0/113263/a611e645-f209-5def-5755-2569949617e5.png)


DB設計の際に作成するもの。
Entity（実体）とRelationship（関係）を把握することができる。


#作り方
##①　エンティティを作る
![Untitled(2).png](https://qiita-image-store.s3.amazonaws.com/0/113263/90199e36-08bf-1d1b-f08a-d41f5d5d0384.png)

- 四角の上にテーブル名
- 主キーは青枠内
- その他のキーは白枠内
- FKにはキーの後ろに **(FK)** と記述

##②　リレーションをはる
矢印の意味は[こちらを参照。](http://it-koala.com/entity-relationship-diagram-1897#IE-2)

##③　依存関係を調べる
![Untitled (4).png](https://qiita-image-store.s3.amazonaws.com/0/113263/c46372f9-081e-5135-6355-5b5915c29522.png)

###親子関係
| 分類 | 定義 |
|:-:|:-:|
| 親エンティティ | 「1」側のエンティティ |
| 子エンティティ | 「多」側のエンティティ |

###依存がある とは
子エンティティの主キーが、親エンティティの全ての主キーを含んでいる関係。
この場合、 **子エンティティを角丸にする。**

#参考
[若手プログラマー必読！５分で理解できるER図の書き方５ステップ](http://it-koala.com/entity-relationship-diagram-1897)
五分では理解できなかった。
Amazon Linux に jenv を入れる

```
yum install java-1.7.0-openjdk.x86_64
yum install java-1.8.0-openjdk.x86_64

git clone https://github.com/gcuisinier/jenv.git ~/.jenv
echo 'export PATH="$HOME/.jenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(jenv init -)"' >> ~/.bash_profile
jenv add /usr/lib/jvm/jre-1.7.0-openjdk.x86_64
jenv add /usr/lib/jvm/jre-1.8.0-openjdk.x86_64
jenv versions
* system (set by /home/ec2-user/.jenv/version)
  1.7
  1.7.0.121
  1.8
  1.8.0.121
  openjdk64-1.7.0.121
  openjdk64-1.8.0.121
jenv global 1.7
jenv versions
  system
* 1.7 (set by /home/ec2-user/.jenv/version)
  1.7.0.121
  1.8
  1.8.0.121
  openjdk64-1.7.0.121
  openjdk64-1.8.0.121
java -version
java version "1.7.0_121"
OpenJDK Runtime Environment (amzn-2.6.8.1.69.amzn1-x86_64 u121-b00)
OpenJDK 64-Bit Server VM (build 24.121-b00, mixed mode)
```
tmuxにペインごとにメモを表示できるようにする

みなさん、tmuxを使ってますか？
CUIで作業するなら是非使いましょう！

画面分割して作業したり, セッションがリモートのサーバで保持できるのは
長時間のタスクを動かすときに非常に便利です。


tmuxは, 画面分割や複数ウィンドウなど便利な機能が多いのですが

よくあるのがペインを乱立しすぎて、
__「このペインが何をやるためのペインだったか覚えていない」__
です。

タイトルとかに名前をつけることも考えたんですけど
2バイト文字使えないし、こんな狭い空間でメモとか正気の沙汰ではない...!
ということでtmuxのペインごとにメモする方法を考えました。

といってもやることは以下の通りで簡単です。

```
bind-key M run-shell "tmux split-window \"$EDITOR /tmp/tmux_pane_#{pane_id}.md \""
bind-key m run-shell "tmux display-message -p \"`cat /tmp/tmux_pane_#{pane_id}.md`\""
```

tmuxのprefix + Mでメモを標準のエディタで開いてprex+mでその内容を表示します。

これだけ
vimを使ってる人で開くたびに、タイムススタンプとか付けたい人はんな感じはいかがでしょう

```
bind-key M run-shell "tmux split-window \"$EDITOR +'au VimEnter tmux* if !exists(\\\"t\\\") | let t=1 | execute \\\"\\\$r!date\\\"| endif '  /tmp/tmux_pane_#{pane_id}.md \""
```

便利です。

templateなどを自動的に読み込むことができれば。
作業項目リストも簡単に作れますね。

tmux display-messageが貧弱で
カラー表示と空行が表示されないのが目下の悩み

それでは良いtmuxライフを...！
WordPress 管理画面の投稿一覧にカラムを追加してカスタムフィールドの値を出す

# 仕様
- 管理画面の投稿・固定ページ・カスタム投稿タイプの投稿一覧にカスタムフィールドの値を出す
- カラムの場所も調整したい

![スクリーンショット 2017-02-08 17.46.52.png](https://qiita-image-store.s3.amazonaws.com/0/18348/59d382af-0b22-ae70-776d-7df91e1e8ecc.png)

なお、カスタム分類を追加するのは `register_taxonomy()` の `show_admin_column` 引数でできるのでよしなに（デフォルトでは出ないけど）
https://developer.wordpress.org/reference/functions/register_taxonomy/

# カラムの追加と削除
フィルターフックで

- `manage_posts_columns` : 投稿一覧  
https://codex.wordpress.org/Plugin_API/Filter_Reference/manage_posts_columns
- `manage_pages_columns` : 固定ページ一覧  
https://codex.wordpress.org/Plugin_API/Filter_Reference/manage_pages_columns
- `manage_{$post_type}_posts_columns` : カスタム投稿タイプ `{$post_type}`（=スラッグ）一覧  
https://codex.wordpress.org/Plugin_API/Filter_Reference/manage_$post_type_posts_columns

ビルトインのカラムについては上記のリンク先参照

```php:add_column.php
<?php
// カスタム投稿タイプ book の投稿一覧で作成者名を削除し、本の著者名を追加
function add_book_columns( $columns ) {
	// 削除（作成者名）
	unset( $columns['author'] );

	// 追加
	$new_columns = array(
		'book_author' =>  __( 'Book Author', 'my_theme' ),
	);
	$columns = array_merge( $columns, $new_columns );

	return $columns;
}
add_filter( 'manage_book_posts_columns' , 'add_book_columns' );
```

任意の場所に追加したいときは foreach を回そう

```php:add_column2.php
<?php
// カスタム投稿タイプ book の投稿一覧で日付の前に、本の著者名を追加
function add_book_columns( $columns ) {
	$new_columns = array();
	foreach ( $columns as $column_name => $column_display_name ) {
		if ( $column_name == 'date' ) {
			$new_columns['book_author'] = __( 'Book Author', 'my_theme' );
		}
		$new_columns[ $column_name ] = $column_display_name;
	}	
	return $new_columns;
}
add_filter('manage_book_posts_columns' , 'add_book_columns');
```

# カラムの中身

追加したカラムの中身に何かしら入れるためにはアクションフックで

- `manage_posts_custom_column` : 投稿一覧  
https://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column
- `manage_pages_custom_column` : 固定ページ一覧  
https://codex.wordpress.org/Plugin_API/Action_Reference/manage_pages_custom_column
- `manage_{$post_type}_posts_custom_column`  : カスタム投稿タイプ `{$post_type}`（=スラッグ）一覧  
https://codex.wordpress.org/Plugin_API/Action_Reference/manage_$post_type_posts_custom_column

例ではカスタムフィールドの値だが、投稿に紐付いてる情報であればアイキャッチ画像などでもOK

```php:add_column_content.php
<?php
// カスタム投稿タイプ book の投稿一覧で 追加した著者名のカラムでその投稿のカスタムフィールド book_author_name を表示
add_action( 'manage_book_posts_custom_column' , 'custom_book_column', 10, 2 );
function custom_book_column( $column, $post_id ) {
    switch ( $column ) {
        case 'book_author' : 
            echo get_post_meta( $post_id , 'book_author_name' , true ); 
            break;

    }
}
```

現場からは以上です。
AppShortcuts使われていないってよ！

[Shibuya.apk#1２](https://shibuya-apk.connpass.com/event/48631/) で、AppShortcutsの話をしました。
<iframe src="//www.slideshare.net/slideshow/embed_code/key/w086cAA5KlBq48" width="595" height="485" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" allowfullscreen> </iframe> <div style="margin-bottom:5px"> <strong> <a href="//www.slideshare.net/nsface/app-shortcuts" title="App shortcuts" target="_blank">App shortcuts（SlideShare）</a> </strong> </div>
基本的な話は、いろいろな人が試していらっしゃるので、大した事じゃないんですが、ポイントは２点ありまして、

1. APIレベル25で、LauncherAppsと、UsageStats.EventにAppShortcuts周りの改修が入っているので、AppShortcuts経由の起動が多いアプリは、ランチャーアプリが目立たせてくれるようになるかも。
* 実際にログを取ってみると、Androidでランチャーアイコン長押しっていう操作って市民権まったく得てないよね。大丈夫？

みたいなことです。

特に2って重要で、マルチウィンドウも、NowOnTapもそうなのですが、ユーザーがその操作に慣れないと絶対に使ってくれないよねという影を落としています。

ウィジェットを簡単に設置できるような施策もGoogleさんは打つつもりもなさそうだし、私達がのどから手がでるほどほしい、アプリの起動導線って、ランチャーアイコンタップでの直接起動と、Notification以外には（今のところ）ないのです。