OmniAICreator/Qiita-1.07M huggingface dataset:
[Java][JSON] genericなクラスの配列となっているJSONをJacksonを使ってLISTへデシリアライズする方法

genericなクラスの場合は、下記にあるTypeReferenceを使う方法ではCastExceptionが発生してしまいました。

- Jackson使い方メモ http://qiita.com/opengl-8080/items/b613b9b3bc5d796c840c
- トップレベルが配列な JSON を、Jackson で POJO を含む List にデシリアライズする方法 http://qiita.com/komiya_atsushi/items/c978e85c2065f57cea38

このようにすればよいみたいです。

```java:
public static <T extends Object> List<T> deserialize(final String jsonStr, final Class<T> clazz) {
  final ObjectMapper mapper = new ObjectMapper();
  final CollectionType jt
    = mapper.getTypeFactory().constructCollectionType(List.class, clazz);

  return (List<T>) mapper.readValue(jsonStr, jt);
}
```

JacksonのFAQに記載ありました :laughing: 
http://wiki.fasterxml.com/JacksonFAQ#Deserializing_Generic_types
WiX toolset x86とx64の判断

ある必要に駆られて、インストーラにて**使用しているWindowsが x86, x64 か**を判断する必要があった。
調べてみたところどうも環境変数にいい感じのものがあるらしく、以下を使うと良いようだ。

>PROCESSOR_ARCHITECTURE

ということで、条件式は以下のようにする

```xml
<Condition>%PROCESSOR_ARCHITECTURE="x86"</Condition>
<Condition>NOT (%PROCESSOR_ARCHITECTURE="x86")</Condition>
```
Windows10 x64とx86にて、x86版インストーラで動作確認したが問題なかった為、
まぁ大丈夫かな～と思っている。

ただし、WOW64内のcmd.exeにてPROCESSOR_ARCHITECTUREを読むと"x86"として認識されるらしいので、その点は留意しておきたい。
dockerでmroongaの複数バージョンを試す環境を作成する。


# TL;DR

- 目的
dockerの理解

新しいMacBookも買ったので、ローカルの環境にDockerで開発環境を作りたい
docker-machineとdocker-composeを使う。
バックエンドのMySQLでmroongaを使ってて、Macで開発環境を作っていたらMacのOSアップデート時に、見事におかしくなってしまい。
ローカル環境はちゃんと仮想化しておくべしだと痛感した故。


- 環境
Mac OS X EL Capitan バージョン10.11.3

- 資料
Dockerファイル！整備されています！
https://hub.docker.com/r/groonga/mroonga/

- この資料の範囲
dockerでmroongaのとあるバージョンをインストールして、ホスト側から接続するまでの説明


# 手順
## groonga/mroongaのDockerファイルをclone

```bash
git clone https://github.com/mroonga/docker mroonga_docker
```


## docker-machineを作成します。


```bash
docker-machine create --driver virtualbox mroonga

docker-machine env mroonga

eval $(docker-machine env mroonga)

docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER    ERRORS
default   -        virtualbox   Stopped                                       Unknown
mroonga   -        virtualbox   Running   tcp://192.168.99.105:2376           v1.10.0
nodeapi   -        virtualbox   Running   tcp://192.168.99.103:2376           v1.10.0

```

## ビルド

```bash
git clone https://github.com/mroonga/docker mroonga_docker
cd mroonga_docker/
docker build -t mroonga_docker Dockerfile/mysql5628_mroonga511
``` 

## run


```bash
docker run  --detach --name mroonga -p 3307:3306  mroonga_docker
 
docker ps


```  
  

### ホストから接続

```bash
mysql -h$(docker-machine ip mroonga) -P3307 -u root
```


### 検索できるかどうかのテスト

```bash

create database test;

use test;

CREATE TABLE diaries (id INT PRIMARY KEY AUTO_INCREMENT,content VARCHAR(255),FULLTEXT INDEX (content)) ENGINE = Mroonga DEFAULT CHARSET utf8;

INSERT INTO diaries (content) VALUES ("It'll be fine tomorrow.");
INSERT INTO diaries (content) VALUES ("It'll rain tomorrow");

INSERT INTO diaries (content) VALUES ("明日は晴れるでしょう");
INSERT INTO diaries (content) VALUES ("晴れ時々曇りとなります");
INSERT INTO diaries (content) VALUES ("雨上がりはいいですね");
INSERT INTO diaries (content) VALUES ("梅雨の季節になりました");

mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("fine");
+----+-------------------------+
| id | content                 |
+----+-------------------------+
|  1 | It'll be fine tomorrow. |
+----+-------------------------+
1 row in set (0.01 sec)

mysql> SELECT * FROM diaries WHERE MATCH(content) AGAINST("晴れ");
+----+-----------------------------------+
| id | content                           |
+----+-----------------------------------+
|  3 | 明日は晴れるでしょう              |
|  4 | 晴れ時々曇りとなります            |
+----+-----------------------------------+
2 rows in set (0.01 sec)

```


### その他コマンド

```bash

docker start mroonga
docker stop mroonga

docker images

docker ps 

docker exec -it  mroonga_docker /bin/bash

```


# (おまけ)4コマ漫画連載中on東洋経済オンライン

東洋経済オンラインで「エンジニア夫婦のあるある日記」を連載中です

[エンジニア夫婦のあるある日記](http://toyokeizai.net/category/diary)

![あるある日記.jpg](https://qiita-image-store.s3.amazonaws.com/0/32215/14d59814-449c-7cec-c463-59650d3ab1a3.jpeg)
React.jsのVirtual DOM内にコメントを書く方法

React.jsでVirtual DOMにコメントを書く方法は `{ /* ここにコメントを書く */ }` といったフォーマットで書く。
DOM要素も `{ /* */ }` で囲めばコメントアウトされて表示されなくなる。

[参考](https://facebook.github.io/react/docs/jsx-in-depth.html#comments)

```
var content = (
  <div>
    <div>これは表示される</div>
    { /* <div>これはコメントアウトされる</div> */ }
  </div>
);
```
Michael Abrash Interview 9

http://qiita.com/7of9/items/6dacaf96a2de76af3d04
の続き
Michael Abrash Interview:
https://www.youtube.com/watch?v=a7My8zbDNRI&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=2)

(4:00-)
That I wish I knew. But, of course, since <font color=red>I came into so long ago</font>, I wouldn't know. One thing I would say that is useful to learn is things other than how to program.

(4:11-)
Ah, Programming, for people who really belong in this industry, in my opinion, is just not that hard. I mean, I largely <font color=red>xxx myself (teach myself?)</font> at that time. 

(4:16-)
And ah, What is hard though is knowing how <font color=red>XXX(metrics?)</font> math works, knowing how to do things like solvers and image processing and such. Having some hard deep knowledge go with your program's skills, that's really valuable.


赤文字ははっきり聞き取れない部分。
青文字はそのように聞き取れるが、文法的にしっくりいかない部分。
EmEditor で今書いている Ruby スクリプトの文法をチェック

# 動機

[EmEditor](https://jp.emeditor.com/) で Ruby のスクリプトを書いているとする。だーっと書き進めている途中でちょっと文法チェックでもしておこうかな，と思ったとする。

文法チェックは

```rb
ruby -c foo.rb
```

でいいわけだけど，いちいちコマンドラインに行って，とか面倒。

そこで EmEditor の機能である「外部ツール」というのを使ってみる。

# やり方

［ツール］→［外部ツール］→［外部ツールの設定］で「外部ツール」ダイアログを出す。

［新規作成］で「外部ツールのプロパティ」ダイアログを出す。

## 「タイトル」

「タイトル」は「Ruby 文法チェック」とか好きなように。

## 「コマンド」

「コマンド」は Ruby のコマンドのパスを入れる。ここだけちょっと注意が必要。

パスが通ってるなら「`ruby`」でいい。

Ruby Installer for Windows で入れて，かつ環境変数に Ruby の処理系のパスを入れてなかったりとか，複数の Ruby を使い分けてるとかだったら，たとえば

```
c:\Ruby21\bin\ruby
```

みたいな感じで絶対パスを指定してやる。

「コマンド」欄にはオプションの類を一切書いてはいけない。

## 「引数」

次に「引数」を

```
-c $(Path)
```

とする。「`$(Path)`」の部分は EmEditor が〈今開いているファイルのパス〉に置き換えてくれる。

## 「ファイルを保存する」

チェックをかける前に，いま開いているファイルを保存しておかないと最新版のチェックにならないから，「ファイルを保存する」にチェックを入れておこう。

## 「アウトプットバーを使用する」

チェックした結果は「アウトプットバー」というところに表示するようにしよう。そのためには「アウトプットバーを使用する」にチェックを入れる。

## 初期値のままでいいもの

「初期ディレクトリ」は空のままでいいし，「入力」は「無し」のまま，「出力」「標準エラー」は「破棄」のままでいい。

「終了時に閉じる」も OFF のまま。さもないとアウトプットバーが一瞬で閉じて結果が見られなくなる。

# 警告も出させようか

どうせなら，Ruby 1.9 で追加された `-w` オプションも付けようか。

こうするといろいろ警告を出してくれる。制御構造のインデントが合ってないといったことまで気にかけてくれるのだ。

このためには「引数」を

```
-c -w $(Path)
```

とすればいい。

# 使い方

設定ができていれば，Ruby スクリプトを開いている状態で，［ツール］→［外部ツール］→［Ruby文法チェック］として呼び出すだけ。
JSPリダイレクトとフォワードの違い

基本的にフォワードを使用する

![スクリーンショット 2016-02-10 15.04.09.png](https://qiita-image-store.s3.amazonaws.com/0/95187/dac7caf0-a3e1-3c52-6ef1-47565996fccd.png)

・リダイレクトはアドレスバーがリクエスト先に変わってしまう


[参考ページ](http://himtodo.fc2web.com/java/redirectForward.html)
docker infoでRunning,Paused,Stoppedのコンテナ数が表示されるようになってる。

# 概要

docker 1.10 からとおもわれるが、Running, Pused, Stopped の数も docker info で確認できるみたい

* [Release v1.10.0 · docker/docker](https://github.com/docker/docker/releases/tag/v1.10.0)

```
Show the number of running, stopped, and paused containers in docker info #19249
```

## 公式のドキュメントページ

* [info](https://docs.docker.com/engine/reference/commandline/info/)

# 実際

実際にためしみた。

## docker 1.10

```
docker@docker1:~$ docker info
Containers: 5
 Running: 0
 Paused: 0
 Stopped: 5
Images: 28
Server Version: 1.10.0
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 85
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Plugins: 
 Volume: local
 Network: bridge null host
Kernel Version: 4.1.17-boot2docker
Operating System: Boot2Docker 1.10.0 (TCL 6.4.1); master : b09ed60 - Thu Feb  4 20:16:08 UTC 2016
OSType: linux
Architecture: x86_64
CPUs: 1
Total Memory: 996.2 MiB
Name: docker1.10
ID: IQFC:O3MF:4XNP:TLDS:M6LX:2PGY:FNXV:DSNE:U444:G2AA:WMK7:OTH6
Debug mode (server): true
 File Descriptors: 10
 Goroutines: 22
 System Time: 2016-02-10T05:47:13.916384514Z
 EventsListeners: 0
 Init SHA1: 
 Init Path: /usr/local/bin/docker
 Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
 provider=virtualbox
```

## docker 1.9.1

```
Containers: 38
Images: 583
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 659
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.1.13-boot2docker
Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015
CPUs: 1
Total Memory: 3.859 GiB
Name: local
ID: LO5A:2AVX:QPSS:NDNZ:SZ7K:SZEW:DGHU:ZGLF:7K3B:34IQ:OKZ4:ONOS
Debug mode (server): true
 File Descriptors: 26
 Goroutines: 48
 System Time: 2016-02-10T05:55:57.992479261Z
 EventsListeners: 0
 Init SHA1: 
 Init Path: /usr/local/bin/docker
 Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
 provider=virtualbox
```

### 1.9.1 docker -D info

公式のドキュメントみると、1.9.1で、-D つけると同じようにでるような風にかいてあったので試してみた。
[info](https://docs.docker.com/engine/reference/commandline/info/)

```
docker@local:~$ docker -D info
Containers: 38
Images: 583
Server Version: 1.9.1
Storage Driver: aufs
 Root Dir: /mnt/sda1/var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 659
 Dirperm1 Supported: true
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 4.1.13-boot2docker
Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015
CPUs: 1
Total Memory: 3.859 GiB
Name: local
ID: LO5A:2AVX:QPSS:NDNZ:SZ7K:SZEW:DGHU:ZGLF:7K3B:34IQ:OKZ4:ONOS
Debug mode (server): true
 File Descriptors: 26
 Goroutines: 48
 System Time: 2016-02-10T05:58:47.102923684Z
 EventsListeners: 0
 Init SHA1: 
 Init Path: /usr/local/bin/docker
 Docker Root Dir: /mnt/sda1/var/lib/docker
Labels:
 provider=virtualbox
```
一覧画面のページングについていろいろ考えた

一覧画面のページング処理はフレームワークに頼ってしまうのが手取り早いですが、内部の実装がDBと相性が悪かったりするとパフォーマンスが悪くなることがあります。
ページング処理について考察したことをまとめてみました。
#ページング
##ユーザーのためのページング
###全部はいらない
人間が処理できるデータ数には限界があります。
googleなどで検索結果が100万件ヒットしても、すべてを見る人はまずいません。人間が閲覧操作する画面に、全データが必要になることは殆どないのです。なので、一度に見せるデータを減らすことでユーザーにもパフォーマンスにも優い画面にしてくれるのがページングです。

###ページング
人間が一度に扱いやすい量をページごとに区切って表示するのがページングです。個人的に、１ページあたり10～100行程度が扱いやすいと思っています。
1ページ目に1～10が表示されていると、2ページ目は11～20が表示される…と直感的にわかります。

![paging.PNG](https://qiita-image-store.s3.amazonaws.com/0/69798/7c18fbe4-ac78-8d34-e298-ccbed3e4ff39.png)

##パフォーマンスのためのページング
###ページ数計算にカウントが必要
ここで問題なのが、ページ数を把握するには全件をカウントしなければならないことです。件数は検索条件によって動的に変化するので毎回カウントが必要です。実際には見ない数万件をカウントするためにパフォーマンスが悪くなるのは避けたいところです。

###ページの制限
パフォーマンスが悪い全件カウントを減らすため、１回のカウント取得レコードを制限してしまいます。上記例では`100件10ページ＝1000件`までにしてしまいます。この上限は要件やDBのパフォーマンス（カウント、全件フェッチできる）によって調整します。この制限で取得できるページ数を１ページセットとしてそれを越えるページを要求した場合には改めて次のページセットをカウントします。

###SQLDBの場合
1. 最大検索数で検索し件数カウント
3. 最大検索数＝件数カウントだったら続きがあるかも
4. オフセット計算
5. 最初のページを検索（offset=0 and limit = ページあたりの件数）
6. ページが変わったら(offset=オフセット and limit = ページあたりの件数)
7. 最後のページを表示したら次の最大検索数分(offset=最大検索数 and limit = 最大検索数)を取得

参考：
MySQL　（LIMIT句を使用）
http://dev.mysql.com/doc/refman/5.7/en/select.html

PostgreSQL　（LIMIT OFFSET　を使用）
https://www.postgresql.jp/document/9.2/html/queries-limit.html

Oracle （ROWNUM BETWEEN）　を使用
http://otn.oracle.co.jp/otn_pl/otn_tool/code_detail?n_code_id=106

##計算
###ページ数
ページ数の計算は普通に割り算で、端数は切り上げ（天井関数）になります。

`ページ数[pages] = ceil( データ数[records] / １ページあたりの表示数[records/page] )`

例えば、512件に対して20件ごとにページングすると26ページになります。

###データオフセット
各ページのオフセット（ページの先頭のレコード位置）は、ページ番号が1から始まるとして

`オフセットページ数[pages] = ページ番号 - 1`
`オフセットレコード数[records] = オフセットページ数[pages] ×　１ページあたりの表示数[records/page]`

例えば128件に対して20件ごとにページングした3ページ目は40件オフセットして41～60件目、7ページ目は121～128件目になります。

###表示ページオフセット
表示するページ数も最大を設定して最大ページ数に達したら、さらに次のページ番号を表示するようにします。

`現在ページのオフセット = 現在のページ番号- ceil(最大表示ページ数 / 2)`
`現在ページのオフセット < 0 の場合は現在ページのオフセット = 0 `

`最大表示ページ = 現在ページのオフセット + 最大表示ページ数`
`最大表示ページ > 全ページ数 の場合は、最大表示ページ = 全ページ数分まで`

###見つかった件数
`最大ページセット= ceil(最大表示ページ / 最大表示ページ数)`

最大ページセットのレコード数 <　1ページあたりの表示数　の場合
`(最大ページセット -1) × 1ページあたりの表示数 + 最大ページセットのレコード数`

最大ページセットのレコード数 ≧　1ページあたりの表示数　の場合
`最大レコード数 = 最大ページセット × 1ページあたりの表示数 ※続きがあるかもしれないので、この件数以上`　

１ページ３件、最大５ページ、全３２件の場合の例
![例](https://qiita-image-store.s3.amazonaws.com/0/69798/39df2187-eb6a-8ca8-9c5d-bd0e7cd00979.png)


##諦める
###CSVダウンロード
ページングによるパフォーマンス戦略が採用できない場合もあります。例えば、「CSVでダウンロード」の場合です。CSVダウンロードするユーザーは、大抵「別のシステムに取り込みたい」、「Excelで開きたい」といった場合なので、ファイルを分割するなんて忌々しいことはされたくありません。
この場合のページングは諦めて、重いDB処理を許容するか、ダウンロードさせないようにするなどが必要です。

###ダーティーリード
ページ切替えでページを再現するには、すべてのページのデータを保持しておく必要があります。ただし、ページングが必要なくらいデータ量が多い場合は、メモリに保持しておくことは現実的ではありません。
かといってDBから再現しようとすると、２ページ目読み込んだときにデータが更新されて変わってしまっていたなんてことが発生します。閲覧中ずっとロックしておくわけにもいかないので、この場合は諦めてダーティーリードを許容します。

###そもそもトランザクションが多い
トランザクションが激しいと、あるデータが存在するページが別のページに変わってしまうなど、意図したとおり機能しない場合があります。
生成・更新時間帯を指定して検索、もしくは時間帯ごとのページで表示したほうが現実的です。
時間帯で切り取るなら、ロールウインドウも手です。（ロールウインドウもそのうち投稿します。）
PhantomjsとCasperJSのバージョンアップ　Linux編

ずっとPhantomjsを古い1.9系で使っていたけど
Webfontやらで困ることが増えてきました。
ラッパーユーティリティのCasperJSの方がつい最近
PhantomJSの2系をサポートしてくれるようになったので、
重い腰をあげて、バージョンアップすることにしました。
PS)重い腰とは、casperjsで作ったtestがすでにいっぱいCIで走っているからです。それをぶっ壊してはできないので、躊躇していました。

今回は
PhantomJSのバージョンアップとCasperJSのバージョンアップ、2つをセットでバージョンアップします。

# PhantomJSのバージョンアップ
こちらは公式サイト http://phantomjs.org/ で
Linux用バイナリがダウンロードできますので、
それをPATH以下に置くだけです。

先に古いバイナリを今後も使えるように退避しておきます。

```
mv /usr/local/bin/phantomjs /usr/local/bin/phantomjs-1.9.7
ln -s /usr/local/bin/phantomjs-1.9.7 /usr/local/bin/phantomjs
phantomjs -version # 1.9.7と表示される
```

```
cd /tmp
wget https://bitbucket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2
bzip2 -dc phantomjs-2.1.1-linux-x86_64.tar.bz2 | tar xvf -
cp -a phantomjs-2.1.1-linux-x86_64/bin/phantomjs /usr/local/bin/phantomjs-2.1.1
ln -sf /usr/local/bin/phantomjs-2.1.1 /usr/local/bin/phantomjs
phantomjs -version # 2.1.1と表示される
```

以上でOKです。

# CasperJSのバージョンアップ
こちらも先に古いバージョンを退避しておきます。

```
casperjs --version # 1.1.0-beta3
cd /usr/local/
mv casperjs casperjs-1.1-beta3
ln -s casperjs-1.1-beta3 casperjs
casperjs --version # 1.1.0-beta3
```


https://github.com/n1k0/casperjs/releases
ここから最新のデータを落としてきます。git cloneでもいいです。

```
cd /tmp
wget https://github.com/n1k0/casperjs/archive/1.1-beta5.tar.gz -O casperjs.1.1-beta5.tar.gz
tar zxf casperjs.1.1-beta5.tar.gz
mv casperjs.1.1-beta5 /usr/local/
cd /usr/local/
rm casperjs && ln -sf casperjs-1.1-beta5 casperjs
casperjs --version # 1.1.0-beta5
```

以上です。

後はいつものcasperjsのtestなりスクリプトを走らせて確認してください。
うちで走っているCIの大量のテストも問題なく終わり、
かつWebfontやgraphy-genericons-cssを使ったサイトでも
文字化けなく豆腐になることなく、スクリーンショットが残せるようになっています。
postgresでテーブルのカラムの属性をintに変える


alter文

```sql
alter table items alter column code type int USING code::integer;
```

最初にこう書くと、

```sql
alter table items alter column code type int
```

エラーが出てHINTが出るのでそれをくっつければよい

```
HINT:  You might need to specify "USING code::integer".
```
【小ネタ】Web認証の自動化【Linux編】

カフェとか勉強会会場とかのWiFi等のWeb認証で毎回ブラウザでID・パスワードの入力とかAcceptボタンのクリックとかが面倒なので自動化しようというお話です。古いネタなんですが、周りに割と知らない人がいたのと、ググるとツールを使う方法とかが出てきちゃったのでスクリプトのみで行う方法を一応書いておこうと思います。

NetworkManagerの有無によって変わります。

# NetworkManager有りの場合

以下のようなファイルを作成します。

```bash:/etc/NetworkManager/dispatcher.d/99-local.sh
#!/bin/bash

if [ "$CONNECTION_ID" = "example-wifi" ]; then
	curl http://example.com/login -d user=example-user -d password=example-password -d cmd=authenticate
fi
```

`CONNECTION_ID`はwifiのSSIDを入れます。
curlのURLとパラメータはWeb認証で必要となるものに置き換えて貰えればと思います。
これらは事前に一度はログインしてパケットをキャプチャするなどして調べておく必要があります。
例えばdocomo WiFiなら`curl https://wlan.m-zone.jp/wlan/portal.jsp -d user=username-spmode@docomo -d password=userpassword -d mode=activate`とかですね。

そして実行権限を付与すればOKです。
sudo chmod +x !$

これで接続時に自動的に上記のスクリプトが実行されて繋がります。

# NetworkManager無しの場合

`/etc/sysconfig/network-scripts/ifup-post`
から
`/sbin/ifup-local`
が呼ばれるので、そこに処理を書きます。
デフォルトだとファイルが存在しないので、ファイル作成後に実行権限を付与します。

こっちは数年前に試したきりです。
現在手元にはNetworkManagerがオンのマシンしかないので、実は動かないとかあったらコメントください。

以上。超小ネタでした。
GatlingでAPIに対して負荷テストをする方法

## これなんだ
負荷テストツール `Gatling` の使い方です。
http://gatling.io/#/

APIに対しての負荷テストをしてます。
request_1の結果の一部をrequest_2に投げてます。

## インストール

```
$ wget https://repo1.maven.org/maven2/io/gatling/highcharts/gatling-charts-highcharts-bundle/2.1.7/gatling-charts-highcharts-bundle-2.1.7-bundle.zip
$ unzip gatling-charts-highcharts-bundle-2.1.7-bundle.zip
```

## シナリオを作る
これは20ユーザーがアクセスしてきます。
1ユーザーあたり2リクエストを送ります。
合計40リクエストが10秒間に来るアクセス数です。

```user-files/simulations/computerdatabase/BasicSimulation.scala
package computerdatabase

import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class BasicSimulation extends Simulation {

  val httpConf = http
    .baseURL("http://hogehoge.mogemoge.fugafuga/")
    .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8")
    .doNotTrackHeader("1")
    .acceptLanguageHeader("en-US,en;q=0.5")
    .acceptEncodingHeader("gzip, deflate")
    .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0")

  val headers_10 = Map("Content-Type" -> "application/x-www-form-urlencoded")

  val scn = scenario("Scenario Name")
    .exec(http("request_1")
      .get("/v1/user/show/1")
      .check(jsonPath("$.user.groups[0].id").saveAs("mogemoge_groud_id")))
    .exec(http("request_2")
      .get("/v1/group/show/${mogemoge_group_id}")
      .check(status.is(404)))

  setUp(scn.inject(rampUsers(20) over(10 seconds)).protocols(httpConf))
}
```

## 実行
```
$ ./bin/gatling.sh
GATLING_HOME is set to ~~~~~~~~~~~~~~~~~~/gatling-charts-highcharts-bundle-2.1.7
Choose a simulation number:
     [0] computerdatabase.BasicSimulation
     [1] computerdatabase.advanced.AdvancedSimulationStep01
     [2] computerdatabase.advanced.AdvancedSimulationStep02
     [3] computerdatabase.advanced.AdvancedSimulationStep03
     [4] computerdatabase.advanced.AdvancedSimulationStep04
     [5] computerdatabase.advanced.AdvancedSimulationStep05
0 を選択
Select simulation id (default is 'basicsimulation'). Accepted characters are a-z, A-Z, 0-9, - and _
[Enter]
Select run description (optional)
[Enter]
```
pillow

#使い方
Pillow 3.1.1

##基本

```
from PIL import Image as img
im = im.open("{file}")
```

情報確認

```
im.size # (xx,xx)
```

##結合（？）
複数の画像を１枚にする
画像読込み→新キャンパス→位置指定貼付け

```
a_jpg = im.open("{image_a}") # size(100,100)
b_jpg = im.open("{image_b}") # size(100,100)

canvas = im.new("RGB",(xxx,xxx),(255,255,255))

canvas.paste(a_jpg,(0,0))
canvas.paste(a_jpg,(0,100))
canvas.save('c.jpg', 'JPEG', quality=100, optimize=True)

```
Ubuntu15.10で環境構築した状態をPinguyBuilderを使いインストールメディア・フルバックアップをする方法

wget https://launchpad.net/ubuntu/+source/xresprobe/0.4.24ubuntu9/+build/1274262/+files/xresprobe_0.4.24ubuntu9_amd64.deb

sudo dpkg -i xresprobe_0.4.24ubuntu9_amd64.deb

wget http://netcologne.dl.sourceforge.net/project/pinguy-os/ISO_Builder/pinguybuilder_4.3-2_all.deb

sudo dpkg -i pinguybuilder_4.3-2_all.deb

sudo apt-get install -f


#バックアップコマンド
sudo PinguyBuilder

#とりあえず分かる人向けの為殴り書きで。すいません
小規模開発のgit-flowの導入を楽にするブランチルールと拡張スクリプト配布

# git-flowのフル利用は受託案件にはオーバースペック

個人的な感想として、開発で多いのは"成果物や期間の定まった小規模受託案件 > 継続的に運用を必要とする大規模案件"だと思ってます。あくまで個人的な感想です。

git-flowはプロダクトを継続的に開発・運用することを前提にした運用です。なので、「リリース後～次のリリースまでに問題が起きたらhotfixする」のようなワークフローが作られています。

逆に受託開発（特にアプリ開発）は「n月末までに納品物を作る。あとは知らん（契約によるからね！念のため！！）」という流れです。git-flowのワークフローは大仰すぎて、あんまり受託開発向けじゃありません。

## じゃあ、なんでgit-flowを使うのか

有名だからというのが一番の理由です。完全な社内ルールとかオレオレルールを適用してしまうと、協力会社だけじゃなく、中途採用の人にも学習コストがのしかかります。

git-flowは結局のところ「束縛の強い命名規則」なので、命名規則さえ守ってくれれば文句を言いません。「とりあえずgit-flowな感じの運用だから」といっておけば、次の最低限のルールはすぐに飲み込めるでしょう。

 * masterにはビルド可能なものが入っている
 * developが開発用の最新内容が入ってる
 * featureにはなんか新機能が入ってる

git-flowを知らなくても、適当な解説ページの冒頭くらいを見せておけばとりあえず問題無いです。

## このブランチルールの利点

 * git-flowの"master", "develop", "feature", (場合によっては"release")しか使わず、最低限の知識のみで開始できる
 * git-flowと互換性を保ってるので、自分一人からでも始められ、いつでもやめることができます。

## リリースルール

受託の場合、「中間の成果物」が求められる場合があります。ゲームで言えばアルファ（ベータ）版とか言われるやつです。この中間提出をgit-flowでいうところの"release"とみなすことができます。

大体の場合はdevelopで開発を続けても問題ありません。中間提出に対して、ほぼすべての開発者が関わることになるからです。

無事に提出完了したらdevelopの内容をmasterにマージし、場合によってはtagを打って完了です。

git-flowに慣れている開発者であれば、ちゃんとgit-flowのrelease機能を使ったほうが良いですが、わざわざそこまでやる必要のないことがほとんどです。

中間提出が無いプロジェクトの場合、masterがほぼカラの状態であることを許容します。

## featureのブランチ命名ルール

 * feature/id/{チケット番号}/master が基本的な作業ブランチ
 * feature/id/{チケット番号}/{トピック名} も使用する
  * 他人のチケットの手伝いや、チケットに対するさらなるブランチを切る場合に使用する
 * チケット番号のないfeatureブランチは基本的に作成しない
 * コミットメッセージには "refs #チケット番号"、完了時には"closes #チケット番号"を入れる
  * Redmineやgithubでチケットに対して自動的に参照を追加できます。これはあとから修正内容を見返すときに重要になるので、ルール化したほうが良いです。

featureにチケット番号を追加しているのは、どのチケットを処理しているか明示すると同時に、スクリプトで容易にコメントの自動生成を行うためです。

/masterを末尾に追加することで、チケットに対するブランチを容易に作成できます（gitの仕様上、あとから/masterとか/topickのようなブランチ階層は追加できない）。

「作業途中でちょっとリファクタしよう」とか、「他の人にチケットの一部を任せよう」とかを容易に実現できます。

特に開発末期のバグ修正では、トライ＆エラーのために割りと細かく修正とリセットを行ったりするので、有用です。

## 拡張スクリプトの配布 [git-flow-hook](https://github.com/eaglesakura/git-flow-hook)

上記のルールを簡単に実現するために、個人的に拡張スクリプトを作って運用していました（改造元は[bleis-tift氏](https://github.com/bleis-tift)のフックスクリプトです）。

動作確認はCygwinとUbuntuで行っているので、Macでも多分動きます。

従来は適当にリポジトリにコピペしていましたが、インストールスクリプトを作ったほうが新規案件とかでも使いやすい（プラス、個人的には便利だと思ってる）ので公開します。

インストールすることで、上記に沿ったルールのブランチが作られます。内部的にはgit-flowを使用しているので、互換性は保たれます。

拡張スクリプトは使わなくても、上記ルールにしたがって適度にゆるくやっていればきっと問題は無いです。ただ、チケット番号の付与は忘れがちなのでスクリプトで自動化したほうがおそらく自分のためです。

 * git mktopic {チケット番号}
  * feature/id/チケット番号/master を作成します
  * 以後、コミットすると自動的に"refs #チケット番号"がコメントの末尾に付与されます
 * git endtopic
  * feature/id/チケット番号/master の開発を完了してdevelopにマージします
  * 実行すると、自動的に"closes #チケット番号"がコメントの末尾に付与されます
 * git mksubtopic {トピック名}
  * feature/id/チケット番号/{トピック名} を作成します
 * git endsubtopic
  * feature/id/チケット番号/{トピック名}の開発を完了して feature/id/チケット番号/master にマージします
 * masterブランチ制限の強化
  * masterへの直接的なコミットが禁止されます
  * developからmergeする、もしくはpull requestの経由を強制できます

## 最後に

基本的にモノグサなので、真面目にgit-flowを適用して受託やったら疲れました。
楽に楽しく生きましょう。
Photoshop CC 2015で上下中央位置のガイドラインを瞬時に引く方法

Photoshopでデザイン作業をしているとき、上下中央位置のガイドラインがあると便利です。とは言え、手動でこのガイドラインを引くのは面倒な作業です。

Photoshop CC 2015なら、この上下中央位置のガイドラインを1ステップで引くことが可能です。

# 一瞬で引けるガイドラインの設定方法
1. [表示]→[新規ガイドレイアウトを作成]を選択
2. 下図のように、[列]と[行]の[数]にそれぞれ「2」を入力し、それ以外の設定値は全て削除する
3. [OK]を選択する

![新規ガイドレイアウトを作成画面](https://qiita-image-store.s3.amazonaws.com/0/67884/975b43c6-1aa3-74ab-de7e-f09875dc39cd.png)


# 上下中央にガイドラインが表示される
上記設定を行うと、下記のようにドキュメントの上下中央位置にガイドラインが表示されます。

![上下中央にガイドライン](https://qiita-image-store.s3.amazonaws.com/0/67884/bbc74638-dc17-db79-6c77-a2ddbbbf56ba.png)

# キーボードショートカットやプリセットを組み合わせて更に便利に
上下中央のガイドラインを引く機会が多いのであれば、[新規ガイドレイアウトを作成]をキーボードショートカットに登録し、上下中央ガイドラインの設定を「プリセット」にて保存しておくとよいでしょう。
Mac標準カレンダーが超便利！

# 何が便利？
標準カレンダー ＋ Safariや標準メーラの組み合わせで使うと、
ドラック＆ドロップ操作でメールの件名やリンクのタイトルをそのまま引用してカレンダー登録出来たので紹介したいと思います。

# どういうこと？
## メーラからカレンダー登録してみる
![メールから登録.png](https://qiita-image-store.s3.amazonaws.com/0/70732/1791297d-9273-8944-0e1c-b6cbde22b72b.png)

メーラから登録した場合はカレンダーに「メールで表示」というリンクがあるので、
これも地味に嬉しい機能！

## Safariからカレンダー登録してみる
![リンクから登録.png](https://qiita-image-store.s3.amazonaws.com/0/70732/8d8b03b2-d208-edce-7d3d-d1e8c9e53d79.png)

## 注意点
当然といえば当然ですが、Safari以外のブラウザやメーラから登録しようとしたときは
カレンダーの件名がURLになったりして上手く連携できませんでした。
[C#] Math.Round 関数は単純な四捨五入ではない

Math.Round メソッドで四捨五入対象桁が 5 の場合
必ずしも繰り上げにならないことがある。

```csharp
Debug.WriteLine(string.Format("Math.Round(0.15, 1)\t{0}", Math.Round(0.15, 1)));
Debug.WriteLine(string.Format("Math.Round(0.25, 1)\t{0}", Math.Round(0.25, 1)));
Debug.WriteLine(string.Format("Math.Round(0.35, 1)\t{0}", Math.Round(0.35, 1)));
Debug.WriteLine(string.Format("Math.Round(0.45, 1)\t{0}", Math.Round(0.45, 1)));
```

実行結果は以下の通りになります。

```
Math.Round(0.15, 1)	0.2
Math.Round(0.25, 1)	0.2
Math.Round(0.35, 1)	0.4
Math.Round(0.45, 1)	0.4
```

四捨五入桁の手前の数字が偶数になるように丸められるようです。
以下のリンクで詳しく説明がされています。

[小数点を切り捨て、切り上げ、四捨五入する](http://dobon.net/vb/dotnet/programing/round.html)

一般的な四捨五入にしたい場合は、MidpointRounding.AwayFromZero を指定します。

```csharp
Debug.WriteLine(string.Format("Math.Round(0.15, 1, MidpointRounding.AwayFromZero)\t{0}", Math.Round(0.15, 1, MidpointRounding.AwayFromZero)));
Debug.WriteLine(string.Format("Math.Round(0.25, 1, MidpointRounding.AwayFromZero)\t{0}", Math.Round(0.25, 1, MidpointRounding.AwayFromZero)));
Debug.WriteLine(string.Format("Math.Round(0.35, 1, MidpointRounding.AwayFromZero)\t{0}", Math.Round(0.35, 1, MidpointRounding.AwayFromZero)));
Debug.WriteLine(string.Format("Math.Round(0.45, 1, MidpointRounding.AwayFromZero)\t{0}", Math.Round(0.45, 1, MidpointRounding.AwayFromZero)));
```

実行結果は以下のように四捨五入されます。

```
Math.Round(0.15, 1, MidpointRounding.AwayFromZero)	0.2
Math.Round(0.25, 1, MidpointRounding.AwayFromZero)	0.3
Math.Round(0.35, 1, MidpointRounding.AwayFromZero)	0.4
Math.Round(0.45, 1, MidpointRounding.AwayFromZero)	0.5
```
Mac: ファイルの拡張属性を一気にはぎ取る


## 結論から

```shell-session:
% xattr -cr <directory>
```

これで指定したディレクトリ以下にあるファイルの拡張属性をすべてクリア (c) できます。

ただし確認は El Capitan でのみやっています。手元にある Mavericks にも `-c` オプションと `-r` オプションがありましたので同様に動作すると思われます。これ以前のバージョンでは `xattr` に `-r` (ディレクトリ再帰降下) オプションがないかもしれません。

## 拡張属性 (EA) とは

`ls -l` したときにパーミッションの右側に `@` マークがついていることがあります。これは HFS Plus (OSX のデフォルトのファイルシステム) の拡張属性 (EA: Extended Attributes) がそのファイルについていることを示します。たとえばメールの添付ファイルを保存したときにどのメールアドレスから受け取ったファイルなのかとか、そういう情報が記録されています。

EA についての概要はマイナビニュースの [OS X ハッキング! Leopard解体新書(4) ～拡張された拡張属性～](http://news.mynavi.jp/column/osx/253/) を参照してみてください。古い文書ですが大変有用です。

## EAが悪さをする
EA がついたままファイルを圧縮して他の OS のユーザーにそれを渡すと、拡張属性が別ファイルとなって渡されます。丁度 `.DS_Store` みたいな感じにです。他人とやり取りするときはほぼ必要ない情報ですから消したいところです。

## 実例

```shell-session:
% ls -lR
total 192
-rw-r--r--@ 1 tura  staff  98207 Feb 10 11:42 a.jpg
drwxr-xr-x  3 tura  staff    102 Feb 10 11:43 b/

./b:
total 192
-rw-r--r--@ 1 tura  staff  98207 Feb 10 11:43 b.jpg

```


`-rw-r--r--@` と右端に `@` がついていますよね。これが拡張属性がついている印です。指定したディレクトリ以下のファイルに付いた拡張属性を一気に消す方法は


```shell-session:
% xattr -cr <directory>
```

です。以前は `find` やらなんやらと `xattr` を組み合わせないとできなかったようですが、少なくとも El Capitan の `xattr`	 には `-r` オプションがあります。これは指定されたディレクトリ以下を再帰的に辿って適用するオプションです。

これと `find . -name '.DS_Store'|xargs rm` は Makefile や Rakefile などの 擬似ターゲット/タスク に記述していつでも消せるようにしておきましょう。他社へ渡すアーカイブファイルを作るタスクの依存タスクにこの消すタスクを指定しておけば完璧です。

## 参考文献
* [Macでlsした時のパーミッションにあるアットマークを消す。xattrコマンド。](http://d.hatena.ne.jp/kanonji/20100912/1284292517) Leopard の頃は `-r` オプションがなかったようです
* [ls -lした時に@(アットマーク)がパーミッションの所についた時にカレントディレクトリ以下をまとめて消すワンライナー](http://qiita.com/noblejasper/items/9f95dc09f82f0e6fe928) これをみてうわめんどくせえと思って man を見てみると簡単な解決策を見つけたのでした (先に man 読めよな)
Go言語によるWebアプリケーション開発 4.2.1.1 練習問題

## 変換方法のカスタマイズ

配列`transforms`の内容をハードコードするのではなく、テキストファイルやデータベースなどから読み込んでカスタマイズできるようにしてみましょう。

## 準備
- 同じディレクトリ位置に`word.txt`を用意しておく

```text:word.txt
get*
go*
lets*
*web
*ty
*ing
*done
we*
my*
you*
```

 
```go:main.go
package main
import (
	"bufio"
	"fmt"
	"math/rand"
	"os"
	"strings"
	"time"
	"errors"
)
const otherWord = "*"
var ErrFileNotFound = errors.New("ファイルが見つかりませんでした")

func makeWords() ([]string) {
	var transforms = []string{
		otherWord,
		otherWord,
		otherWord,
		otherWord,
		otherWord + "app",
		otherWord + "site",
		otherWord + "time",
		"get" + otherWord,
		"go" + otherWord,
		"lets" + otherWord,
	}
	return transforms
}

func makeWords_FromFile() ([]string, error) {
	file, err := os.Open("word.txt")
	var transforms = []string{}
	if err != nil {
		fmt.Println("word.txt not found!")
		return nil, ErrFileNotFound
	}else{
		var words = bufio.NewScanner(file)
		for words.Scan() {
			transforms = append(transforms, words.Text())
		}
	}
	return transforms, nil
}

func main(){
	transforms, err := makeWords_FromFile()
	if err != nil {
		transforms = makeWords()
	}
	rand.Seed(time.Now().UTC().UnixNano())
	s := bufio.NewScanner(os.Stdin)
	for s.Scan() {
		t := transforms[rand.Intn(len(transforms))]
		fmt.Println(strings.Replace(t, otherWord, s.Text(), -1))
	}
}
```
underscoreコードリーディング（invert）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##invertとは


###[underscorejs.orgのinvert](http://underscorejs.org/#invert)

こんな説明。
>####_.invert(object) 
>Returns a copy of the object where the keys have become the values and the values the keys. 
>For this to work, all of your object's values should be unique and string serializable.


```javascript
_.invert({Moe: "Moses", Larry: "Louis", Curly: "Jerome"});
=> {Moses: "Moe", Louis: "Larry", Jerome: "Curly"};

```
------------- 
keyがvalueでvalueがkeyになった形のオブジェクトのコピーを返します。
これを使うためには、objectのすべてのvalueがユニークでシリアライズされた文字列である必要があります。

###[underscore.invert](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L986)
コード的にはこのあたり。

```javascript
  // Invert the keys and values of an object. The values must be serializable.
  _.invert = function(obj) {
    var result = {};
    var keys = _.keys(obj);
    for (var i = 0, length = keys.length; i < length; i++) {
      result[obj[keys[i]]] = keys[i];
    }
    return result;
  };
```

引数はobj
返り値用のresultをobjectとして宣言。
変数keysに_.keysを用いてobjのkeyの配列を格納する。
for文を用いてi=0からkeysのlengthまで回す。
resultのobj[keys[i]]にkeys[i]を格納する。
その後、resultを返す。
AWS Certificate Managerで指定したドメインに登録されたアドレスにvalidation mailを送る

`subdomain.example.com` のSSL証明書をACMで取得しようとすると、validationのメールは以下のアドレスに送信される。

```
admin@subdomain.example.com
administrator@subdomain.example.com
hostmaster@subdomain.example.com
postmaster@subdomain.example.com
webmaster@subdomain.example.com
```

これだとvalidation mailを受信できない場合があるので、`example.com`の管理者のメールにvalidationを飛ばしたいときがある。

1. Web Consoleで`subdomain.example.com`の証明書発行をrequestする
2. pending validationのステータスになる
3. `» aws acm resend-validation-email --certificate-arn arn:aws:acm:us-east-1:11111111:certificate/hogehoge --domain subdomain.example.com --validation-domain example.com --region us-east-1`

* 今のところ`us-east-1`しかサービスがavailableじゃないので、regionは`us-east-1`
dos コマンドを使った file list の作り方(windows)

dos コマンドを使ってローカルでファイルリストを作りたい時の手順

## コマンドプロンプト`cd`でファイルリストを作成したいトップディレクトリに移動

```
cd C:\test
```

## `dir` コマンドでファイルの一覧をテキストファイルに出力

```
dir /s /b *.*>list.txt
```
上記は
- ファイル
- ディレクトリ
両方の一覧を出力する

### 以下は説明とよく使いそうなオプションの補足
- `/s` サブディレクトリも含めた全てのファイル情報を表示
- `/b` ディレクトリ名とファイル名のみを表示
  - ディレクトリだけのリストでいい時は`/a:d /s /b`
  - ファイルだけのリストでいい時は`/a-d /s /b`
  - ディレクトリを先に羅列したい場合は`/o:g /s /b`
- `*.*` ワイルドカードを使って拡張子すべてを対象とする
  - htmlだけのリストがほしいときは`*.html`
- `>list.txt` 結果をファイルに出力

### コマンド例

- ファイル一覧  
```
dir /a-d /s /b *.*
```
- ディレクトリ一覧  
``
dir /a:d /s /b
``

`cd`で移動したトップディレクトリにテキストファイルができる
man2html が便利だった

`man` を html にしたりブラウザで表示したりするやつ。

CentOS 7 なら yum でインストールできます。

```sh
sudo yum install man2html
```

Apache の設定ファイルが含まれています。

```sh
rpm -qc man2html
# /etc/httpd/conf.d/man2html.conf
```

デフォだと local からしかアクセス許可されていないので、外からもアクセスするためには設定ファイルを編集する必要があります。

```sh
sudo vim /etc/httpd/conf.d/man2html.conf
```

`Require local` を `Require all granted` とかに変更します。

```diff
- Require local
+ Require all granted
```

Apache をリスタートします。

```sh
sudo systemctl restart httpd
```

`http://192.0.2.123/man/man2html` のような URL で `man` を検索＆表示できます。

## ターミナルからブラウザで開く

`hman` というコマンドが一緒にインストールされます。このコマンドを使えばターミナルからブラウザで `man` を開くことができるのですが・・・

```sh
hman bash
# xdg-open: no method available for opening 'http://localhost/man/man2html?bash'
```

あくまでローカルで開こうとするので、わたしのように普段 Windows から Linux に ssh でログインして作業しているひとには使いみちがありません。

.

.

がしかし、環境変数 `MANHTMLHOST` でブラウザで開く URL のホスト名を（デフォは `localhost`）、`MANHTMLPAGER` がブラウザを開くためのコマンド（デフォは `xdg-open`）を指定できるので、わたしはこの辺りをうまいこと利用して ssh でログインした先のホストで `hman` するとローカルのブラウザでページが開くようにしています。

![man2html.gif](https://qiita-image-store.s3.amazonaws.com/0/8734/ab2904ed-5d08-d88b-e619-81800b62b465.gif)
PhantomJS で数秒待ってからスクリーンショットを保存する

[PhantomJS で Web ページのスクリーンショットを保存する - Qiita](http://qiita.com/makietan/items/bce761dcc9ac468cf53a)

こちらでスクリーンショットの保存方法を簡単に書いた
今回はアニメーションが含まれたサイトのスクリーンショットを保存する方法を紹介する

```js:index.coffee
page = require('webpage').create()

page.open 'http://www.tamurayukari.com/information/2016/02/674.html', (status) ->
  if status = 'success'
    window.setTimeout ->
      page.render 'yukari.png'
      phantom.exit()
    , 1000
  return
```

`window.setTimeout` を使って待つことで対処した
Googleスプレッドシートで特定キーワード検索結果を取得

例えば、VORKERS（ http://www.vorkers.com/ ）という会社評価のクチコミサイトで、個別の企業ページの情報を複数取得したい場合、まずは企業ページのURLを得る必要があります。しかし、企業名と企業ページURLに関連性がない場合（ページURLが連番で生成されているなど）、1つずつ手動で企業ページURLを取得するのは面倒です。
そこで、サイト上でキーワード検索をし、検索結果から企業ページのURLを取得すると便利です。

## やり方

下記のようなGoogleスプレッドシートを想定し、説明します。
<img width="515" alt="画像.png" src="https://qiita-image-store.s3.amazonaws.com/0/48375/052e410d-118c-c212-e853-705fcd51f40d.png">


`B1セル`に、検索したい企業名を入力します。続いて、`B3セル`、`B4セル`、`B5セル`にはそれぞれ下記のように関数を入力します。すると、`B5セル`に`B1セル`に入力したキーワードで検索した結果ページのURLが表示されます。

```:B3セル
="http://www.vorkers.com/search.php?src_str="&B1
```

```:B4セル
=IMPORTXML(B3,"//div[@class='table-noSequence_companyName']/a/@href")
```

```:B5セル
="http://www.vorkers.com/"&B4
```
Animate CCのコマンドディレクトリをお手軽に開けるJSFLを作った

# JSFLとはなんぞや
「JSFL」とは[Adobe Animate CC(旧：Flash Pro)](https://www.adobe.com/jp/products/animate.html)上で実行可能な、作業の効率化に重宝する便利なスクリプト（JavaScript）です。

# JSFLを扱うときに困ること
私がAnimate CCでJSFL扱う上で、一番つらいのが「JSFLを配置しているフォルダーがどこかわからない」です。
JSFLが配置されているCommandsフォルダーはランチャーに入れておくほど更新するフォルダーでもないし、場所も```~/Library/Application Support/Adobe/Animate CC 2015/ja_JP/Configuration```と階層の深いフォルダーになっています。Animateのアップデートのたびに既存のJSFLが配置してあった場所とは別の場所フォルダーになるので、毎度地味に困ります。

そこで重宝するのが、**コマンドディレクトリを開く.jsfl**です

# コマンドディレクトリを開く.jsflでJSFLをいつでも触れる

```コマンドディレクトリを開く.jsfl
function isMac() {
    return (fl.version.search(/mac/i) > -1);
}

function openDirectory(path) {
    var uri = FLfile.uriToPlatformPath(path);
    if (isMac()) {
        FLfile.runCommandLine("open " + "\"" + uri + "\"");
    } else {
        FLfile.runCommandLine("explorer " + "\"" + uri + "\"");
    }
}

openDirectory(fl.configURI + "Commands");
```
- [コマンドディレクトリを開く.jsfl](https://github.com/ics-nohara/JFSL/blob/master/Commands%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E9%96%8B%E3%81%8F.jsfl)

まずはこのファイルを作成し、適当なフォルダーに配置します。

メニューの[コマンド]→[コマンドの実行]を選び、上記の**コマンドディレクトリを開く.jsfl**ファイルを選択し、実行します。

※ いつのバージョンからかわからないのですが、Animate CCの描画エリアにドラッグ＆ドロップすることでJSFLを直接実行できるようです。知らなくて今まですごい損してました・・・！

すると、MacならFinderで、WindowsならExplorerでCommandsフォルダーが開かれます。
そして、開かれたCommandsフォルダーに__コマンドディレクトリを開く.jsfl__を再度配置することで、次回から[コマンド]メニューに表示されて選択できるので、もうCommandsフォルダーを探さなくて良くなりました :sparkles: 

![image 2016-02-10 11.42.26.png](https://qiita-image-store.s3.amazonaws.com/0/1423/e50c7802-bf3b-38d1-9143-944b64e76e59.png)

# 今後のAnimate CCとJSFLが気になる・・・

Flash ProがAnimate CCに変わり、[JSFLのAPIの変更があった](https://ics.media/entry/10897)ようですが、既存のAPIとも両立できるようです。

また、Flash Proの環境設定を引き継いだところ、以前作成した「[JSFL Tool](https://ics.media/entry/2302)」もインストールされ、通常通りに使えることが確認できたので、特に今までのワークフローと変わるところはないのかな？という印象でした。
UnityからiOS・Androidの機器情報を取得　メモ


# ■Android

## MACアドレス取得

WIFIの情報取得を拒否されないようにする必要があるのでAndroidManifest.xmlを修正する。

■AndroidManifest.xmlの場所
　**Assetsと同列のTemp/StagingArea/AndroidManifest.xml**

■追加するパーミッション

```
  <!-- WIFI -->
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
```

■ソース

```
#if UNITY_ANDROID
    AndroidJavaObject mWiFiManager;

    // MACアドレス
    string macAddr = "";
    if (mWiFiManager == null)
    {
        using (AndroidJavaObject activity = new AndroidJavaClass("com.unity3d.player.UnityPlayer").GetStatic<AndroidJavaObject>("currentActivity"))
        {
            mWiFiManager = activity.Call<AndroidJavaObject>("getSystemService", "wifi");
        }
    }
    macAddr = mWiFiManager.Call<AndroidJavaObject>("getConnectionInfo").Call<string>("getMacAddress");
#endif
```



# ■iOS

## ■デバイストークンとベンダーID取得


■ソース

```
#if UNITY_IPHONE

        string deviceToken = "";
        // デバイストークン取得
        byte[] token = UnityEngine.iOS.NotificationServices.deviceToken;
        if (token != null)
        {
            deviceToken = System.BitConverter.ToString(token).Replace("-", "");
        }
        else
        {
            deviceToken = "Nothing";
        }

        // ベンダーID取得
        string identifierForVendor = UnityEngine.iOS.Device.vendorIdentifier;

#endif
```
osxでphpでpostgresを使う　急いでる時

## Xcodeをインストール

App Storeから。
Xcodeを一回は起動しておく。

## コマンドラインツールをインストール
[https://developer.apple.com/downloads/]()


## Mac Ports をインストール
[https://www.macports.org/install.php]()


## phpをインストール

```
sudo port install php56
```

途中で以下のメッセージが出る

```
To customize php56, copy /opt/local/etc/php56/php.ini-development (if this is a development server) or
/opt/local/etc/php56/php.ini-production (if this is a production server) to /opt/local/etc/php56/php.ini and then make changes.
```


## 他のを入れる

```
sudo port install php56-postgresql
sudo port install php56-mbstring
sudo port install php56-gd
sudo port install php56-mcrypt
```

## php.ini 編集

```
sudo cp  /opt/local/etc/php56/php.ini-development  /opt/local/etc/php56/php.ini
sudo vim /opt/local/etc/php56/php.ini
```

```php.ini
date.timezone = Asia/Tokyo
```

## サーバー起動

```
/opt/local/bin/php56 -S localhost:8765
```
C# で Ruby の tap

```csharp:ObjectExtensions.cs
public static class ObjectExtensions {
  public static T Tap<T>(this T t, System.Action<T> f) {
    f(t);
    return t;
  }
}
```

これでタップし放題ですね

```
var multiplied = numbers.Select((e) => e * 10).Tap((list) => Debug.Log(list));
```

[参考: Ruby の Object#tap](http://docs.ruby-lang.org/ja/2.2.0/class/Object.html#I_TAP)
supertest でREST APIの試験を行う


Codeceptionがもう色々と辛くなってきたのでNodeに変更。

APIのシナリオ検証を行いたかったので、supertestとasyncを使って進めていきます。

## 考慮したポイント

- セッションに対応させる
- 同期的なAPIのシナリオ発行を綺麗に書けるようにする。

## インストール

````
$ npm install supertest async should --save
$ npm install mocha -g
````

適当に`test`ディレクトリ作成してtest.jsとかに以下を記述。

````
var request = require('supertest');
var async = require("async");

var debugApi = function(argent){
    return agent
    .get('/debug')
    .set('Accept', 'application/json')
    .expect('Content-Type', /json/)
    .expect(200)
    .expect(function(res){
        res.body.debug.should.equal("this is debug route")
        res.body.should.have.property("time")
    })
}


describe('GET /user', function() {
    this.timeout(10000)
    it('respond with json', function (done) {
        var agent = request.agent("http://localhost:9000")

        async.series([
            // 最初のAPI送信
            function(cb){
                debugApi(agent)
                .expect(function (res) {
                    res.body.session.should.equal(0)
                }).end(cb)
            },
            // 2本目のAPI送信
            function(cb){
                debugApi(agent)
                .expect(function (res) {
                    res.body.session.should.equal(1)
                }).end(cb)
            }
        ],done);
    });
});
````

以下でテスト実行

````
$ mocha --require should
````

## supertest の解説

supertestではクライアントを作成して、APIを投げていく。

クライアントは `request(url)`や`request.argent(url)`でオブジェクトとして取得できるが、後者はセッション等が保存される点が異なる。

検証用のAPI `expect` にはいくつかのパターンがあり、

- `expect(int[,cb])` : ステータスコードの検証
- `expect(int,obj[,cb])` : ステータスコードとBODYの検証
- `expect(obj[,cb])` : BODYの検証
- `expect(fn[,cb])` : クロージャによる検証

の４つがある。Bodyの検証に関しては完全一致or文字列の正規表現なので、
APIの検証時にはクロージャを使っていくのが楽そう。

````
.expect(function (res) {
	res.body.should.have.property("message")
	res.body.session.should.equal(1)
}).end(cb)
````

callback内での`should`の利用は実行時に`--require should`をつけると有効になる。

## 雑感

Codeception よりも比較的楽に書けそうな気がする。

でもやっぱりfunction書きまくるの辛いので、この手のコードはCoffeescriptとかで雑に書きたい。そのためだけにcoffeescript入れるのもなぁ…

async の導入でコードの読みやすさ大分変わりました。
実コードではAPIを利用した会員登録 → ログイン → ログアウト → 再ログイン → ユーザ情報変更 → ユーザ情報削除 と言った具合のシナリオ検証を進めていくことになるので、コールバック地獄で死にます。

デバッグの表示が若干不親切なのがつらい。
`codecept run --debug` 的な感じのアレば良いなぁ…と思ったのですがどうなんでしょうか。

複数ファイルになってきた時にmochaテストのグループ化とかそういうのどうしようかで若干悩んではいる。ベスト・プラクティスが聞きたい。

しゃあないとは思いつつ、describe->it->async->expect で四階層降りるのが辛い。
[CSS]長さの単位

##CSSで使う長さの単位

|単位|説明|ピクセル換算[^*1]|
|:--|:--|:--|
|em|相対単位。基準は要素のフォントサイズ|-|
|ex|相対単位。基準は要素のx-height （小文字xの高さ）|-|
|in|絶対単位。インチ。2.54センチメートル|96px|
|cm|絶対単位。センチメートル。10ミリメートル|約37.80px|
|mm|絶対単位。ミリメートル|約3.78px|
|pt|絶対単位。ポイント。1/72インチ相当|約1.33px|
|pc|絶対単位。パイカ。12ポイント相当|16px|
|px|絶対単位。ピクセル|1px|


実際によく使う単位は em ,px の2種類でしょう。
デザイナーさんによってはptで指定がくることもありますが、ピクセルで割り切れず厳密に同じ長さにならないためpxで指定いただくようお願いしています。

[^*1]: 四捨五入で小数第2位まで記載

またCSS3では更に下記単位が追加されることになっています。
このうち rem は非常に扱いやすい単位です（詳しくは後述）。

|単位|説明|ピクセル換算[^*1]|
|:---|:---|:--|
|ch|相対単位。基準は要素の「0」の幅|-|
|rem|相対単位。基準はルート要素のフォントサイズ|-|
|vw|相対単位。ビューポート幅の1/100。|-|
|vh|相対単位。ビューポート高さの1/100|-|
|vmin|相対単位。ビューポートの短い辺の1/100|-|
|vmax|相対単位。ビューポートの長い辺の1/100|-|
|q|絶対単位。級。1/4ミリメートル|約0.95px|



##新しい単位 rem
remはCSS3で追加される新しい単位です。
emに似ていますが、remは親要素ではなくルート要素のフォントサイズを元に計算されます。
root emでremです。

###ネストのフォントサイズ指定が楽に
```html
<ul>
    <li>果物
        <ul>
            <li>りんご</li>
            <li>みかん</li>
        </ul>
    </li>
    <li>野菜</li>
</ul>
```

```css
li{
    font-size: 1.2rem;
}
```

よくあるリストの入れ子ですが、ここで単位にemを使うとりんごとみかんの文字デカ:scream:！となります（1.2x1.2=1.44）。
remなら面倒な計算は不要で、ルートのフォントサイズを把握しておけばOKです。

###対応ブラウザ
http://caniuse.com/#feat=rem
IEは11以上ですが、主要ブラウザはカバーしているので問題ないでしょう。
IE9/10でもショートハンドプロパティを使用せず、`font-size: 1.2rem; `等と指定すれば大丈夫です。


##ビューポート単位の使いどころ

レスポンシブサイトの高さ指定で活躍します。
（詳しくは[参考サイト](http://coliss.com/articles/build-websites/operation/css/viewport-vs-percentage-units-by-ire.html)へ）

###例）ファーストビューで画像めいっぱい見せたい！
```html
<body>
    <div class="eyecatch">
        <img src="hoge.jpg" alt="hoge" />
    </div>
    <p>ほげほげほげほげ</p>
</body>
```

```css
.eyecatch{
    width: 100%;
    overflow: hidden;
}
.eyecatch img{
    height: 100vh;
}
```


###対応ブラウザ
http://caniuse.com/#feat=viewport-units
vhに関してはIE9以上で対応しています。


##参考サイト
* [&lt;length&gt; - CSS | MDN](https://developer.mozilla.org/ja/docs/Web/CSS/Length#Units)
* [CSS Values and Units Module Level 3](https://drafts.csswg.org/css-values/)
* [[CSS]ビューポート(vw, vh)とパーセント(%)、レスポンシブに適した単位の賢い使い分け方法 | コリス](http://coliss.com/articles/build-websites/operation/css/viewport-vs-percentage-units-by-ire.html)
CloudAtCostのLVMサイズを拡張

# Ubuntu 16.04.2

```ruby
fdisk /dev/sda

d 3
n p Enter Enter Enter
t Enter 8e
w

reboot

pvresize /dev/sda3
lvextend -l +100%FREE /dev/mapper/CAC_VG-CAC_LV
reboot

resize2fs /dev/mapper/CAC_VG-CAC_LV
```

# Debian8

## 拡張

* 10GBより大きいDISKを指定した場合、手動で拡張する必要がある。
* /dev/sda3が未使用。`mkfs.ext4 /dev/sda3`してマウントするのも良い。

```bash:作業前
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0       9.1G  1.2G  7.5G  14% /
```

```bash:拡張
pvcreate /dev/sda3
vgextend localhost-vg /dev/sda3
lvextend -l +100%FREE /dev/localhost-vg/root
resize2fs /dev/localhost-vg/root
```

```bash:作業後
$ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/dm-0        57G  1.2G   54G   3% /
```

# その他メモ

## sources.list

* [Debian non-US worldwide mirror sites](https://www.debian.org/mirror/list-non-US.ja.html)

```bash:無効なsources.list削除
sed -i 's@^deb http://non-us@#deb http://non-us@g' /etc/apt/sources.list
```

## 自分用

```bash:
apt-get update
apt-get install -y byobu
byobu
apt-get upgrade -y
```

```bash:
vi /etc/hostname
vi /etc/hosts
hostname -F /etc/hostname
```

```bash:/etc/fstab
/dev/mapper/localhost--vg-root /  ext4    defaults,data=writeback,noatime 0       1
```


* [JessieにPromox4をインストール、NAT設定 - Qiita](http://qiita.com/tukiyo3/items/71e3222b817e1188bc40)
MTのDataAPIメモ

しばらくMTをさわっていなかったらいつの間にか実装されていたDataAPIという機能。
とても便利だったので、なんでもできんじゃん！と思っていたら案外微妙なところがあったのでその辺のメモ。

基本的にはマニュアル通りでいけるが、以下は実現できなかった。
[Movable Type Data API ドキュメント](http://www.movabletype.jp/developers/data-api/)
※基本的な書き方は公式マニュアル等を参照ください。


## カスタムフィールドの検索はできない
検索結果としてカスタムフィールドの値は取得できるが、検索条件には含められない。
なので、検索結果を手動でフィルタリングする必要がある。


## 検索条件（search）を指定すると検索結果のcategoriesが空
```
http://[MTのURL]/mt-data-api.cgi/v2/sites/[サイトID]/entries?search=検索文字列
```
オプションに検索条件「search=検索文字列」を指定してDataAPIから取得した際に、記事のcategoriesが空で返ってくる。
これは悲しかった。。。これのおかげでDataAPIをあきらめて[flexible Search](https://github.com/tinybeans/jq-plugin-flexibleSearch)を使用することにしました。


## 複数カテゴリを指定して記事取得はできない
できなかった。1つのカテゴリを指定することはできるのになー
なので、「全件取得してカテゴリでフィルタリング」 or 「カテゴリ数分APIで取得する」をする必要がある。


## 取得件数は必ず指定する（デフォルト10件）
limitオプションで取得件数を指定できるが、指定しないと10件しか返ってこない（全件ではない）ので注意。


#感想
DataAPIは基本的なことは実現できるけど、少し変わったことをしようとするとできないことが多い。
もしかしたら知らないだけなのかもしれないけれど。
複数カテゴリ指定とかありそうなんだけどな。

あと仕方ないところだけど遅い。後々[flexible Search](https://github.com/tinybeans/jq-plugin-flexibleSearch)で実装したのと比較するとだいぶ違った。

以上、メモでした。
MongoDBをWindows(32bit)にinstall

# install

## download
* [ここからダウンロード](https://www.mongodb.org/downloads#production)
* msiでなくzip版をダウンロードする

## 展開

* 任意のフォルダにzipを展開
* 便宜的に展開したフォルダ名をmongodbに変更
     * 今回は```D:\install\mongodb```にしたとする

## PATHを通す

* 環境変数PATHにmongodb/binのPATHを通す
    * 今回は```D:\install\mongodb\bin```を環境変数PATHに追加

## データベースフォルダとログフォルダの作成

* 任意の場所にデータベースフォルダとログフォルダを作成する
* 今回はmongodb配下に置くこととする
    * mongodb/data
    * mongodb/logs

## 起動確認

* コマンドプロンプトを開き、以下のコマンド（パスは環境に合わせて変更すること）

```bat
mongod --dbpath d:\install\mongodb\data --logpath d:\install\mon
godb\logs\mongodb.log --storageEngine=mmapv1

```

* ネットワーク許可のダイアログが出た場合、許可する
* ログフォルダを開いてログに```waiting for connections on port 27017```のように出ていればＯＫ
* ```ctrl+c```で終了する

# Windowsサービスに登録して自動起動させる

## configファイルの作成

* データベースファイルとログファイルの位置をいつも設定するのは面倒なのでconfigを作る
* configファイルは任意の位置、名前でOK
    * 今回は```mongodb\mongod.cfg```とした

* configファイルの中身は以下の要領で記述
* configファイルを保存する際にUTF8で保存すること

```
systemLog:
    destination: file
    path: d:\install\mongodb\logs\mongod.log
storage:
    dbPath: d:\install\mongodb\data
    engine: mmapv1
processManagement:
   windowsService:
      serviceName: MongoDB-Service
      displayName: MongoDB-Service
      description: MongoDBのサービス
```

## windowsサービスに登録

* コマンドプロンプトを「管理者として実行」する
* 以下のコマンドにてサービスに登録

```
mongod --install --config "D:\install\mongodb\mongod.cfg"
```

* コントロールパネル - 管理ツール - サービスからmongodbを起動
could not load pg_hba.conf でハマった

## TL;DR

- pg_hba.confのIPアドレスはCIDR表記（ `/` つけるやつ）にしないといけない

## 記事

外部ホスト192.0.2.1からの接続を許可したく、pg_hba.confに下記のように書いた。

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             hogeuser        192.0.2.1               password
```

そしてサービススタート……。

```bash
$ sudo service postgresql-9.5 start
Starting postgresql-9.5 service:                           [FAILED]
```

とするが失敗。CentOS6のyumにリポジトリを追加してPostgreSQL 9.5をインストールしていた私の環境では、ログファイルは `/var/lib/pgsql/9.5/data/pg_log/` にあった。

```
< 2016-02-10 00:16:18.210 JST >CONTEXT:  line 86 of configuration file "/var/lib/pgsql/9.5/data/pg_hba.conf"
< 2016-02-10 00:16:18.210 JST >FATAL:  could not load pg_hba.conf
```

接続元のIPアドレスを下記のようにCIDR表記に変更して解決。

```
# TYPE  DATABASE        USER            ADDRESS                 METHOD
host    all             hogeuser        192.0.2.1/32            password
```

そのIPアドレスからだけ接続を受け付けるなら何も考えずうしろに `/32` をつければOK。
Any CPU/x86/x64 関係知ったことを貼っておく場所

[*1](http://d.hatena.ne.jp/siokoshou/20091102)
[*1](http://espresso3389.hatenablog.com/entry/20090519/1242743787)
[*1](http://blogs.msdn.com/b/nakama/archive/2008/11/06/part-2-net-framework-2-0-64.aspx)
[*1](http://www.bing.com/search?q=64bit%E7%92%B0%E5%A2%83%E3%81%AB%E3%81%8A%E3%81%84%E3%81%A6%E3%80%8164bit%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9%E3%81%AF32bit%E3%81%AEDLL%E3%81%AE%E8%AA%AD%E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%AF%E5%87%BA%E6%9D%A5%E3%81%AA%E3%81%84&src=)
[*1](http://d.hatena.ne.jp/yaneurao/20050407)
[*1](http://www.atmarkit.co.jp/ait/articles/1007/01/news131.html)
[*1](https://msdn.microsoft.com/ja-jp/library/ms241064(v=vs.110).aspx)
WindowsマシンのローカルSVNリポジトリをMacOSXのGitに移す


ソースコード丸ごと移行というパターンが多いかと思いますが、コード履歴にも思い入れがあって、なおかつGitに移行したいという欲張りな方へ！
特に特別な手順はありませんが、一応ポストします！

- SVNリポジトリは、個人管理のものなので、サーバは立てず、開発機と同じローカルWindows機で管理していました
- 改行コードはとりあえずCRLFのままです
   - 初めからGitで管理していたならWindowsでもリポジトリ上はLFで管理していると思いますが、SubVersionではWindows開発ならもっぱらCRLFで管理しちゃってますよね
   - 全ファイルをLFに置き換えてもいいのですが、それだと履歴の分断が起きてしまうのを嫌って、そのままにします
- 文字コードは幸いutf-8で保存していたので、そのままでokでした
   - ShiftJISで保存していた場合は、これもそのままにしておくのが良いかと思います。それか、閲覧用としてとりあえずgit cloneしておいて、utf-8に変換したものを新規のリポジトリとして作成するのもいいですね。


## Windowsで、svnサーバ起動

まず、svnリポジトリを指定してsvnサーバを起動します。

やり方はなんでもいいと思いますが、[git for windows](https://git-for-windows.github.io/) の Git BASH 上で以下のコマンドを実行しました。
なお、この時のマシンはWindows7でした。

```
$ svnserve.exe -d -r /c/svn
```

## Gitリポジトリとしてクローン

つづいて、Mac上で、gitリポジトリとしてクローンするには、次のようにします。

```Bash
$ git svn clone svn://{WINDOWS_IP}/ {PROJECT_ROOT}
```

## (おまけ) SVNクライアントとしてチェックアウト

Gitじゃなくて、svn派だという人は、Macの方で、svnクライアントとしてチェックアウトするために、次のようにします。

```Bash
$ svn checkout svn://{WINDOWS_IP}/ {PROJECT_ROOT}
```