OmniAICreator/Qiita-1.07M huggingface dataset:
macOS環境でのNaitive ExtensionのGemをインストールする

# 環境
macOS Sierra(10.12)

# mysql2

```Gemfile
gem 'mysql2'
```

## エラー

```
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.

    /Users/saicologic/.rbenv/versions/2.1.6/bin/ruby extconf.rb
checking for ruby/thread.h... yes
checking for rb_thread_call_without_gvl() in ruby/thread.h... yes
checking for rb_thread_blocking_region()... yes
checking for rb_wait_for_single_fd()... yes
checking for rb_hash_dup()... yes
checking for rb_intern3()... yes
-----
Using mysql_config at /usr/local/bin/mysql_config
-----
checking for mysql.h... yes
checking for errmsg.h... yes
checking for mysqld_error.h... yes
-----
Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load
-----
-----
Setting libpath to /usr/local/Cellar/mysql/5.7.16/lib
-----
creating Makefile

make "DESTDIR=" clean

make "DESTDIR="
compiling client.c
compiling infile.c
compiling mysql2_ext.c
compiling result.c
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2
````

## 解決

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
```

参考：http://stackoverflow.com/questions/39617761/cant-install-mysql2-gem-on-macos-sierra
VagrantでCentOS+Node.js環境を構築してみる

## 作業環境
Windows7
vagrant 1.8.1
VirtualBox 5.0.12

## サーバー構成
CentOS7.1
Node.js v6.7.0
yarn v0.16.1

## 環境構築手順
Vagrantを使ったサーバー構築手順の基本的な部分は以前のまとめで参照
[VagrantでLAMP環境を構築してみる](http://qiita.com/okoi/items/91e06fb0b70a818ceccd)

### Vagrantfile内容

:forwarded_port の設定を行い、ホストOSの特定のポートへのアクセスをゲストOSのポートへのアクセスとして扱うように設定しています

```ruby
Vagrant.configure(2) do |config|
  config.vm.box = "centos7"
  config.vm.hostname = "node"
  config.vm.network :forwarded_port, guest: 1337, host: 1337, id: "nodejs"
  config.vm.network :private_network, ip: "192.168.33.21"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--memory", "1024"]
  end
  config.vm.provision :shell do |sh|
    sh.path = "provision.sh"
  end
end
```

### provision.sh内容

```sh
#!/bin/bash

# リポジトリインストール
sudo yum -y install epel-release

# node.js
sudo yum -y install nodejs
sudo npm install --global yarn  # ついでにyarnも入れてしまう

# firewalld
sudo systemctl stop firewalld.service
sudo systemctl disable firewalld.service

# ntp
sudo yum -y install ntp
sudo cp /etc/ntp.conf /etc/ntp.conf.org
sudo sed -i -e "s/server 0.centos.pool.ntp.org iburst/server -4 ntp.nict.jp/" /etc/ntp.conf
sudo sed -i -e "s/server 1.centos.pool.ntp.org iburst/server -4 ntp1.jst.mfeed.ad.jp/" /etc/ntp.conf
sudo sed -i -e "s/server 2.centos.pool.ntp.org iburst/server -4 ntp2.jst.mfeed.ad.jp/" /etc/ntp.conf
sudo sed -i -e "s/server 3.centos.pool.ntp.org iburst/server -4 ntp3.jst.mfeed.ad.jp/" /etc/ntp.conf
sudo systemctl start ntpd.service
sudo systemctl enable ntpd.service
sudo timedatectl set-timezone Asia/Tokyo

```

## Node.jsの実行

/home/vagrantにhello.jsというファイルを作成して中身を次のように記載します

```js
var http = require('http');
var server = http.createServer();
server.on('request', function(req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.write('hello node.js');
  res.end();
});

server.listen(1337);
console.log('running...');
```

ターミナルから **node hello** と打ち込みます

```
[vagrant@node ~]$ node hello
running...
```

ホストOSのブラウザなどで "127.0.0.1:1337" にアクセスします
**hello node.js** と画面に表示されればOKです。
AWS CLI 経由でのユーザ作成とCredential キー


http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html#id_users_create_cliwpsapi


## ユーザ作成

````
$ aws iam create-user --user-name hoge
{
    "User": {
        "UserName": "hoge", 
        "Path": "/", 
        "CreateDate": "2016-10-19T07:16:11.217Z", 
        "UserId": "xxxxxxx", 
        "Arn": "arn:aws:iam::xxxxxxx:user/hoge"
    }
}
````

`--user-name` オプションは必須。

http://docs.aws.amazon.com/cli/latest/reference/iam/create-user.html

## ユーザにアクセスキーを提供する

````
$ aws iam create-access-key --user-name hoge
{
    "AccessKey": {
        "UserName": "mytest", 
        "Status": "Active", 
        "CreateDate": "2016-10-21T00:44:27.187Z", 
        "SecretAccessKey": "xxxxxxxx", 
        "AccessKeyId": "xxxxxxxx"
    }
}
````

`--user-name` オプションは必須。

http://docs.aws.amazon.com/cli/latest/reference/iam/create-access-key.html

## ユーザにポリシーを適用する

````
$ aws iam attach-user-policy --user-name mytest --policy-arn arn:aws:iam::aws:policy/AdministratorAccess
````

`--user-name` , `--policy-arn` オプションは必須。

`--policy-arn`はIAMポリシーのARNを指定する。よく使うものとしては、

- arn:aws:iam::aws:policy/AdministratorAccess
- arn:aws:iam::aws:policy/AccessAmazonS3FullAccess
- arn:aws:iam::aws:policy/AccessAmazonS3ReadOnlyAccess
- arn:aws:iam::aws:policy/AmazonSESFullAccess

http://docs.aws.amazon.com/cli/latest/reference/iam/attach-user-policy.html

## ユーザの一覧を確認

````
$ aws iam list-users
{
    "Users": [
        {
            "UserName": "admin", 
            "Path": "/", 
            "CreateDate": "2016-11-25T01:56:03Z", 
            "UserId": "xxxxxxxx", 
            "Arn": "arn:aws:iam::xxxxxxxx:user/admin"
        }, 
        ...
    ]
}

````
[git] Bash on Windows環境でcore.fileMode=falseが効かなかった


~/.gitconfig は以下の通りありますが、設定が効かず。

```.gitconfig
[core]
  fileMode = false
```

以下の通り.bashrcに記載して無理やり解決。。

```.bashrc
alias g = 'git -c core.fileMode=false'
```

-cで、一回限りの設定を指定することができます。
Amazon Linux AMI release 2016.09のNginxでハマる


Amazon Linux 2016.09でyumでインストールされるNginxのバージョンが1.10.1となりました。
https://aws.amazon.com/jp/amazon-linux-ami/2016.09-release-notes/

Nginxは1.9.11でモジュールのダイナミックロードが組み込まれ、幾つかのモジュールがダイナミックロードに変更されました。
https://www.nginx.com/blog/dynamic-modules-nginx-1-9-11/

```
./configure --with-http_geoip_module=dynamic \
              --with-http_image_filter_module=dynamic \
              --with-mail=dynamic \
              --with-stream=dynamic \
              --with-http_xslt_module=dynamic
```

今まで画像の変換などにhttp_image_filter_moduleを使っていた場合、今までのnginx.confをそのまま使ってもモジュールがないと怒られます。

```
Starting nginx: nginx: [emerg] unknown directive "image_filter" in /etc/nginx/sites-enabled/hoge:1
```

yumのnginx関連のパッケージを調べると、ダイナミックロード対象となったモジュールが存在するので、必要なモジュールをyumでインストールする。

```
$ yum list | grep nginx
nginx.x86_64                             1:1.10.1-1.28.amzn1          @amzn-main
collectd-nginx.x86_64                    5.4.1-1.11.amzn1             amzn-main
munin-nginx.noarch                       2.0.20-1.37.amzn1            amzn-main
nginx-all-modules.x86_64                 1:1.10.1-1.28.amzn1          amzn-main
nginx-filesystem.noarch                  1.10.1-1.el6                 epel
nginx-mod-http-geoip.x86_64              1:1.10.1-1.28.amzn1          amzn-main
nginx-mod-http-image-filter.x86_64       1:1.10.1-1.28.amzn1          amzn-main
nginx-mod-http-perl.x86_64               1:1.10.1-1.28.amzn1          amzn-main
nginx-mod-http-xslt-filter.x86_64        1:1.10.1-1.28.amzn1          amzn-main
nginx-mod-mail.x86_64                    1:1.10.1-1.28.amzn1          amzn-main
nginx-mod-stream.x86_64                  1:1.10.1-1.28.amzn1          amzn-main


$ sudo yum install nginx-mod-http-image-filter
```

さらにnginx.confにモジュールを読み込むように書いてあげると、nginx起動時に読み込まれます。（nginx.confの先頭の方で読み込んだほうが吉）

```
include /usr/share/nginx/modules/mod-http-image-filter.conf;
```
2008年3月の発表

[発表資料PDF](https://www.cps-jp.org/pub/cps/COEreport080317/sg2-09okada.pdf)

2008年3月の発表資料。

この資料の原本は自分のHDDのどこかにあるのだが見つけられず。

QMCで別資料検索中にgoogleで偶然見つけた。

> 中期的な目標
星間ダスト(サイズ 10um, 100万個の粒子からなる凝集体)の厳密な光散乱シミュレーション手法の開発

8年7カ月経ってるけどまだ「中期的な」目標。
【FG085】Function Generator製作記録

#秋月電子にてファンクションジェネレーター購入

先日、秋月電子にて購入した[ファンクションジェネレーター（FG085） 税込4000円](http://akizukidenshi.com/catalog/g/gK-06298/)を製作しました。

半田付けの練習が目的だったため組み立てKitを購入しましたが、[完成品 税込5400円](http://akizukidenshi.com/catalog/g/gM-06897/)も販売されています。その他のファンクションジェネレーターKit・完成品も商品リストにあがっています。


秋月の店舗に入って右側の棚に組立Kitのスペースがあるのですが、画像のようにチャック付きの袋にぶらさがって陳列してあります。（完成品は白い箱に入った状態で同じ棚に置いてあります）
![K-06298.JPG](https://qiita-image-store.s3.amazonaws.com/0/139228/eb6ecb0f-3f95-6652-d08d-62ada09fca80.jpeg)

#袋を開封

袋をばらすとこんな感じになります。
![K-06298-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/139228/62f0bf08-250e-a33a-e337-d02c4091e8d6.jpeg)


基盤をサンドイッチする黒いパネルはアクリル板です。レーザーカッターを最近触ったばかりのせいなのか、アクリル板のシールをはがす感じや丸い穴の削り具合に少し親近感を覚えてしまいました。

穴がいっぱい空いている表のパネルには白い文字が書いてあるのですが、アクリルパネルを正面・または横から覗くと透明パネルの裏側に白い文字を書いて、さらに黒い塗装をしていると思われます。（下図）

<br>
空気
---------アクリル上部（表面）-------
アクリル内部
---------アクリル下部（表面）-------
白文字
---------全面に黒い塗装---------
空気

<br>

画像をよく見てもらうとわかるのですが、基盤にはあらかじめ細かい部品が半田付けされているので、全体から見るとスイッチやコンデンサ等、簡単な部品が多いという印象でした。

#いざ半田付け

[同梱の説明書](http://akizukidenshi.com/download/ds/jye/AssemblyGuide_085G.pdf)の通り、全体の工程は大きくA,B,Cの３つに分かれています。
###A. Install Components at Back
この工程では特に困ったところはありませんでした。
・ピンヘッダを挿入する向き
・コンデンサの＋ー
に気をつければ大丈夫だと思います。

#####【ピンヘッダ】
短い方を基盤に挿入(Short ends go into PCBと記載されている)
![スクリーンショット 2016-10-24 14.04.55.png](https://qiita-image-store.s3.amazonaws.com/0/139228/f510e611-cde8-80c8-b101-1bce9b3d2903.png)
<br>
#####【コンデンサ】
線が長い方がプラス、黒い胴体に灰色の帯がある方がマイナス
![スクリーンショット 2016-10-24 14.05.04.png](https://qiita-image-store.s3.amazonaws.com/0/139228/acf162f6-19ce-af15-bb0a-69a5b28141a9.png)


###B. Install Components at Front

半田付けの山場です！
![スクリーンショット 2016-10-24 14.09.22.png](https://qiita-image-store.s3.amazonaws.com/0/139228/54af1ca1-8428-a40c-b1f8-2897a6f78337.png)

大体うまくいったのですが、やはり⑧プッシュボタンに相当手こずりました。

####【プッシュボタンの半田付け】
プッシュボタンを基盤に全部挿入して、片っ端から一気に半田付けをしたのですが……。
それがいけなかった。

初めてのプッシュボタンで特に深く考えずに半田付けしてたのですが、半田付けがおわったあと、ひっくり返して表面の部品を見てみると……**傾いてる！！**

**片側は浅く片側は深く挿入されていたため、ボタン全体が傾いたまま固定されてしまいました。**
半田を吸い取ってボタンを取ろうとしたら、誤って分解（バラバラに）してしまい、ボタンを元に戻すのにとても時間がかかってしまいました…。

１ボタンに６本の線がありますが、１本だけまたは両側１本ずつ半田付けして傾きを確認してから、残りも全部半田付けするようにしたほうが、後々のダメージが少ないのでおすすめです。

###C. Mount Panels

![スクリーンショット 2016-10-24 14.35.43.png](https://qiita-image-store.s3.amazonaws.com/0/139228/fe96fe35-e070-39f0-a32a-36ea1d7231ea.png)

ファンクションジェネレーター製作でちょっと不明なところがあるとすればここでした。
10bでspring washerのベラ部分がカットされたはずなのに、10cや10dではなにかがピンと立っているので、とても器用にカットしたのかと思っていました。

どうカットしたら良いかわからないので、とりあえず黒パネルに刺してみると、ベラが微妙に基盤に届かないことがわかりました。ここでやっと、10b~10dを理解します。届かないベラを切って、代わりに長目の半田(solder)を伸ばしていたんですね。妙に細くベラを切っていると思ったら、半田でした。いや恥ずかしい。

<br>
ちなみにBNCコネクタも最初、黒パネルに挿入できないと思って焦りました。穴（メス）は楕円風になっているのですが、コネクタ（オス）は真ん丸だと思っていたので、向きも考えずに入れようとしていました。コネクタもよく見ると楕円、に気づくのに少し時間がかかりました。


#今回のまとめ
- Solderは半田
- 傾く可能性のある部品は最低限傾かないことを確認してから全体付けしたほうが安全
- 基盤部分を温めて少しはんだをあてれば、自然と包むように流れ込んでいく。時間が立ちすぎると黒くなるので早めに半田ごてを外す。
- 思っていたより自分の作業は雑ということがわかったので、綺麗な実装を心がける。
- 今回の黒パネルのような文字塗装にすれば文字が消えにくいので、表に塗るよりも綺麗な仕上がりになる、多分。

##参考ページ
画像は下記から転載しました。
- http://akizukidenshi.com/download/ds/jye/AssemblyGuide_085G.pdf
- http://akizukidenshi.com/catalog/g/gK-06298/
Gradsで陸上のデータのみを描画する方法

海と陸両方値を持つデータ(以後landsea.bin,変数名landsea)に対して，陸地のみのデータを使って解析したい場合に，元データから陸面のみのデータセットをgrads scriptで作成します．

必要なデータ：陸地のみ値が入っているデータ（以後landonly.bin,変数名land）．

以下スクリプト

```
'reinit'
'open landonly.ctl'
'define mask = const(land,-1,-u)' #undef(ここでは海の値)を-1に変更
'open landsea.ctl'
'set t 1'
'define maskdata = lterp(mask,landsea.2)' #maskデータを作成
'd maskout(landsea, maskdata)' #陸のみのlandseaデータを描画
```

補足
maskout(expr,mask)
 maskの値がゼロより小さいとき，exprはundefに設定される．

const(expr, value, -u or-a)
 -u: undefもvalid dataもvalueに設定
 -a: undefのみをvalueに設定．valid dataは変化しない
grads本家ページもあわせて確認してください．

参考
http://cola.gmu.edu/grads/gadoc/gradfuncmaskout.html
http://cola.gmu.edu/grads/gadoc/gradfuncconst.html
WHATWG Streams の Stream と Pipe chain

# 概要

[WHATWG Streams](https://streams.spec.whatwg.org/) のことを何回かに分けて書く。[Kyoto.js #11](http://kyotojs.connpass.com/event/39462/) の『 [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/) 』という発表のために調べたものだ。発表だけで終わらせるのはもったいないので、再整理して共有する。

今回は次の 3 つを書く。

- WHATWG Streams の提供する Stream クラス
- それらの Stream でつくる Pipe chain 
- Pipe chain を流れる chunk 

Stream クラスについては概要に留め、それぞれの詳細は別途記載する。

# 3 つの Stream クラス

[WHATWG Streams](https://streams.spec.whatwg.org/) は次の 3 つの Streams クラスを提供している。

1. ReadableStream
2. WritableStream
3. TransformStream

今回はあくまでも概要だけを書く。

## 1. ReadableStream

- 読み取りのための Stream 
- Source から読んだデータを内部キューにためる

```ts
// イメージ
class ReadableStream {
  constructor(underlyingSource: Source, options?: ReadableStreamOptions);

  get locked(): boolean;

  cancel(reason: any): Promise<void>;
  getReader(): Reader;
  pipeThrough(
    transform: TransformStream, options?: PipeToOptions
  ): ReadableStream;
  pipeTo(
    writable: WritableStream, options?: PipeToOptions
  ): Promise<void>;
  tee(): [ReadableStream, ReadableStream];
}
```

## 2. WritableStream

- 書き込みのための Stream
- Sink に書くデータを内部キューにためる

```ts
// イメージ
class WritableStream {
  constructor(underlyingSink: Sink, options?: WritableStreamOptions);

  get locked(): boolean;

  abort(reason: any): Promise<void>;
  getWriter(): Writer;
}
```

## 3. TransformStream

- 変換のための Stream
- ReadableStream と WritableStream をそれぞれ readable / writable というプロパティで提供するオブジェクト
- **まだ仕様にない**

```javascript
class TransformStream {
  constructor(transformer: Transformer);
  get readable(): ReadableStream;
  get writable(): WritableStream;
}
```

# Pipe chain をつくる

- 3 種の Stream を **pipe** する (= **pipe chain** をつくる)
  - RS -(pipe)-> WS
  - RS -(pipe)-> TS -(pipe)-> ... -(pipe)-> WS
  - RS -(pipe)-> WS + RS -(pipe)-> WS
- pipe chain を **chunk** が流れる
  - chunk は RS / WS が読み書きするデータの単位

```javascript
const data = [1, 2, 3];
new ReadableStream({
  pull(controller) {
    const chunk = data.shift();
    controller.enqueue(chunk); // 1, 2, 3
  }
})
  .pipeThrough(new TransformStream({
    transform(chunk, controller) {
      controller.enqueue(chunk * 2);
    }
  }))
  .pipeTo(new WritableStream({
    write(chunk) {
      console.log(chunk); // 2, 4, 6
    }
  }));
```

# 参考

- [WHATWG Streams](https://streams.spec.whatwg.org/)
- [WHATWG Streams をためした](http://bouzuya.net/slides/2016-10-22/)
PHPで超簡単APIフレームワーク

PHPで超簡単自作APIフレームワーク
#目的
JSONの勉強

##製作動機
JSONを返すって普通に言ってたけど、JSONを返すって何。。。？

##対象者読者
JSONの説明をしてって言って、パッと具体的に説明できない人

##事前準備
1. JSONがそもそも何なのかわからない人は<a href="https://thinkit.co.jp/article/70/1">こちら</a>
2. urlパースがよくわからない人はURLを取得できる<a href="http://php.net/manual/ja/reserved.variables.server.php">`$_SERVER['PATH_INFO']`</a>
3. 動的言語機能が良くわからない人は動的に呼ぶクラスを変更できる<a href="http://php.net/manual/ja/language.namespaces.dynamic.php">動的言語機能</a>

#関連記事
1. <a href="http://qiita.com/k-okina/items/175b82295ab683ffb624">PHPで超簡単自作フレームワーク</a>

##補足
ルーティング等が搭載されていないのは、本記事はあくまでJSONがメインだからです。その内ルーティングクラスやORマッパーを搭載したフレームワークも公開する予定です。

##作ってみよう

###今回実装する内容

1.urlの初めに来るurlに相対したcontrollerを呼ぶオートローダー機能

例：localhost/apiでリクエスト

```php:index.php
include('./controllers/Api.php');
```

2.controllerはファイル名と同じクラスで作成し、その中のindex(@params)メソッドが呼ばれる
例：localhost/blogでリクエスト

```controllers/Api.php
class Api
{
    public function index() : array
    {
        return array('a' => 1, 'b' => 2, 'c' => 3, 'd' => 4, 'e' => 5);
    }
}
```

###ソースコード全容

```php:index.php
<?php
if (empty($_SERVER['PATH_INFO'])) {
    exit;
}
//スラッシュで区切られたurlを取得します
$parse = explode('/', $_SERVER['PATH_INFO']);
$call = "";
foreach ($parse as $value) {
    if ($value !== "") {
        $call = $value;
        break;
    }
}
//ApiControllerをインクルードし、JSONを返します
if (file_exists('./controllers/'.$call.'.php')) {
    include('./controllers/'.$call.'.php');
    //$call名のcontrollerをインスタンス化します
    $className = "controllers\\".$call;
    $obj = new $className();
    //controllerのindexメソッドを呼びます
    $response = json_encode($obj->index());
    //ヘッダーを指定してJSONを出力
    header("Content-Type: application/json; charset=utf-8");
    echo $response;
}
```

##解説
1.パラメーター１つ目が呼ばれるcontrollerと相対します。 

```php
require_once('./library/illuminate/Validate.php');
use library\illuminate\Validate as Validate;
if (empty($_SERVER['PATH_INFO'])) {
    exit;
}
//スラッシュで区切られたurlを取得します
$parse = explode('/', $_SERVER['PATH_INFO']);
$call = "";
foreach ($parse as $value) {
    if ($value !== "") {
        $call = $value;
        break;
    }
}
```

2.controllerを呼び、帰ってきた連想配列をjson_encodeを使用してJSON形式の**string型**文字列に変換します

```php
//ApiControllerをインクルードし、JSONを返します
if (file_exists('./controllers/'.$call.'.php')) {
    include('./controllers/'.$call.'.php');
    //$call名のcontrollerをインスタンス化します
    $className = "controllers\\".$call;
    $obj = new $className();
    //controllerのindexメソッドを呼びます
    $response = json_encode($obj->index());
}
```

3.JSONの規則に沿って記載されているstring型文字列を出力(JSONを返すってこれの事です)して終わり。

```php
//ヘッダーを指定してJSONを出力
header("Content-Type: application/json; charset=utf-8");
header("X-Content-Type-Options: nosniff");
echo $response;
```

4.localhost/やlocalhost////って入力された際の対策

```php
if (empty($_SERVER['PATH_INFO'])) {
    exit;
}
```

##まとめ
1. JSONとは、記載形式の規則でした。
2. JSONを返すとは、JSON形式のstringを出力する事でした。

##GitHub
https://github.com/k-okina/KahiroFramework/blob/master/index.php

##参考にしたサイト
* https://thinkit.co.jp/article/70/1
* http://php.net/manual/ja/function.json-encode.php
Docker + Ruby on Rails 5 のメモ

# Docker + Ruby on Rails 5 のメモ

```:Dockerfile
FROM ruby:2.3.1
ENV LANG C.UTF-8
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs

ENV APP_HOME /myapp
RUN mkdir $APP_HOME
WORKDIR $APP_HOME

ADD Gemfile* $APP_HOME/

RUN bundle install
```

```:docker-compose.yml
version: '2'
services:
  web:
    build: .
    command: bundle exec rails s -p 3000 -b '0.0.0.0'
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
```

```ruby:Gemfile
source "https://rubygems.org"
gem 'rails', '~> 5.0.0'
```

`$ touch Gemfile.lock` で空のファイルを作成。

`$ docker-compose build` で Rails ビルド。
`$ docker-compose run web rails new . --force --skip-bundle` でデフォルトのアプリ作成。
↑ ここの`web`は`docker-compose.yml`の`services`で定義している`web`。

`rails new`で新たに`Gemfile`が生成されるので`$ docker-compose build` で再度ビルド。

`$ docker-compose up`でアプリ起動。

ブラウザから [0.0.0.0:3000](http://0.0.0.0:3000) にアクセスして動作確認。

【参考】 https://docs.docker.com/compose/rails/
Mezzanine導入ながれとはまったことメモ

##Mezzanineとは
pythonのwebフレームワークのdjangoのcmsで、wordpressのように、簡単にwebページを作成できるようなものみたいです。（あまり詳しくはありません笑）

##使った環境
 
 - pyenv
 - python3.5.2
 - さくらのクラウド(ubuntu)
 - pip
 - django

##環境作成の流
###pyenvインストール
```bash

$ sudo apt-get update
$ sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev
$ git clone git://github.com/yyuu/pyenv.git ~/.pyenv
```
その後.bashrcに以下のことを書き込む

```.bashrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
かけたら、以下のコマンド！！！！

```bash

$ source ~/.bashrc
```
これで、pyenv が使えるようになりました

####参考
http://www.takunoko.com/blog/ubuntu%E3%81%ABpython%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/

###Python 3.5.2を使えるように

```bash

$ sudo pyenv install 3.5.2
$ sudo pyenv global 3.5.2
```
###Mezzanineを入れる

```bash
$ pip install mezzanine
```

これで入ったので
あとはプロジェクトを作る！
###プロジェクト&db作成
```bash

$ mezzanine-project myproject
$ cd myproject
db作成↓
$ python manage.py createdb
```

これで、できるはず！！！
あとは確認！

###確認
```bash
$ python manage.py runserver 0.0.0.0:8000
```
####参考
http://qiita.com/itkr/items/c6c26f55a292f3e39241

これで、クラウドの　ip:8000にアクセスして、表示できればOK

##はまったこと
pyenvをいれて、　やると、pipのバージョンが最新ではなかったので、

```bash
$ pip install --upgrade pip 
```
したら、mezzanineがなぜかinstallできなくて、結構悩みました、
updateしないとできるので、しないことをお勧めします。
brew updateがNo such file or directoryで失敗したとき

```
$brew update
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
/usr/local/Library/brew.sh: line 32: /usr/local/Library/ENV/scm/git: No such file or directory
Error: update-report should not be called directly!
```

時折発生する事象らしい。
以下のコマンドで最新版にresetすると直る。

`cd "$(brew --repository)" && git fetch && git reset --hard origin/master`  


ref. https://discuss.circleci.com/t/brew-update-command-fails/5211
Qt5の異常なドロップイベントを無視する


:warning: この障害([QTBUG-46287](https://bugreports.qt.io/browse/QTBUG-46287))は修正済みです。

Qt5には、モーダルウィジェットが存在してもメインウィンドウがドロップイベントを受け付けてしまうというバグがあります。

* [QTBUG-46287 QMainwindow accepts drop events even when a modal dialog is open](https://bugreports.qt.io/browse/QTBUG-46287)

回避するには、異常な`DragEnter`イベントを止めるイベントフィルターを作り、`QApplication`へインストールします。

* アクティブなモーダルウィジェットが存在するとき、`DragEnter`イベントを無視する
* ただし、 アクティブなモーダルウィジェットに対して発生したものは受理する

`DragEnter`を無視するとドロップもできなくなり、マウスカーソルがドロップを受け付けるアイコンになりません。

実装例は以下の通りです。

```cpp
class DragEventEater : public QObject
{
public:
    DragEventEater(QObject* parent): QObject(parent) {}
protected:
    bool eventFilter(QObject *obj, QEvent *event)
    {
        if (event->type() == QEvent::DragEnter)
        {
            if (QObject* modalWidget = QApplication::activeModalWidget())
            {
                for (; obj; obj = obj->parent())
                {
                    if (obj == modalWidget)
                    {
                        return false;
                    }
                };
                return true;
            }
        }
        return false;
    }
};
```
社内で基本情報の勉強会を行った話 1年目(27年度秋季)

#はじめに
基本情報の勉強会を社内で行いました。
本来は昨年の時点でやるべきでしたが、振り返りを行いませんでした。
そこで二回目の勉強会が行われましたが、1年めの振り返りをまとめておきます。

#動機
##後輩が基本情報処理技術者試験を合格するため
また後輩も基本情報を受験するとのことだったので、自分も合格していませんが、何かフォローをしたいと考えていました。
そこで、勉強会という形で行うことにしました。

##社内に勉強会の文化を導入するため
この時点では社内で勉強会を行う取り組みはあったものの、
主催者は特定の人物のみで行われており、浸透しているとは言いづらい状態でした。
そこで、定期的に行う勉強会を計画し、
後に別の勉強会を主催する人の心理的抵抗を下げることを狙いました。

#問題点
##学習する範囲
基本情報は問われる知識の深さは浅いものの、
その範囲が広いことが問題でした。

勉強会で全ての範囲をフォローしようとすれば、かなりの時間が必要となると考えられました。
ですので、勉強会をしながらも、プライベートで勉強をしてもらう仕組みを考える必要がありました。

##依頼する講師役
上記の通り、カバーする範囲が広いこともあり、それを教える講師役にかなりの負荷がかかると考えられました。
また、勉強会の期間が長くなる事が予想され、
仕事や、体調面で講師が行えなくなった場合のフォローを考える必要がありました。

#勉強会の教材
[平成27年度 イメージ&クレバー方式でよくわかる 栢木先生の基本情報技術者教室 (情報処理技術者試験)]
(https://www.amazon.co.jp/dp/4774169218/)

勉強会を行うということで、参考書を統一することにしました。
選定理由としては、以下になります。

 * 社内にこの参考書を使用して受かった方いたこと
 * レビューでの評判も悪くなかったこと
 * 目次の分け方が、カリキュラムを組む上で丁度良かったこと

#勉強会の形式
週一で進捗確認しつつ、勉強会を行いたかったので、
毎週月曜日の出勤前に１時間で行っていました。

また講師役を上記の問題点を解決するために、
勉強会の参加者で講師役を持ち回りにし、講義形式は各々がやりやすい形でやることにしました。
これには、以下の狙いがありました。

 * 講師役への負荷分散
 * アウトプットを前提とした勉強になる
 * 講義を行う中で、理解の浅い部分を他者に指摘してもらえる
 * 準備をする必要があるため、プライベートで勉強時間を確保する必要がある
 * 人によって異なる講義形式で行うと思われるので、他者の教え方を学べる
 * 特定の人物に依存しない勉強会の方式のため、
講義担当者が急に参加できなくなっても別の人がフォローでき、定期的な開催を維持できる

また、あくまで勉強会を個人学習の補完と位置づけ、
時間内に勉強会が終わらなくても、そこで終了し次回への持ち越しを行わないようにしました。

#勉強会をふりかえって
##良かったこと
###講義内容が想定よりもバラバラだった
以下のように複数の講義形式で行われ、
今後勉強会を行う上での参考になりました。

* 1時間の間に章の内容を全てカバーしようとする
* 過去問から傾向と対策を考えそれを中心に講義する
* 過去問を用意し、実際に解きながら解説を行う
* 参考書とは別に資料を用意し、それを使用して講義を行う

###受験者以外の参加者が参加してくれました
勉強会を行っていることを、社内に公表しスケジュールも公開していました。
その中で応用情報など他の試験を受ける方など、
受験者以外の方が参加してくださったのはありがたかったです。

###次の勉強会につなげることができました
人事部の方から今年(28年度)も勉強会を行うことを依頼され、
無事2回目の基本情報の勉強会を開催することができました。
また、別の試験でも同様の形式で勉強会が開催されました。

##改善点

 * 午前試験の内容が中心となってしまい、午後試験に関しては手薄になってしまった
 * 模擬試験を行うことで、実際の雰囲気や時間配分をつかんで貰ったほうがよかった
 * 1時間で講義が終わらないケースが想定以上に多かった
 * 講師役へのフィードバックが少なかった
 * 勉強会後に振り返りを行わず、資料を作成しなかった
AIXコマンドメモ(bash)

AIXコマンドについてまとめました。
まあIBMさんの資料を見てもらえればリファレンスがありますが、よく使うのにキーワードが合致しなくって探せないなんて事ありまして、んじゃテストとかで使ったものはメモっとこくという内容です。

以下コマンドは、bashとしてしまえばLinuxとシェルに関しては大差ないですが、多少の場所の違いやAIX独自コマンドがありますね。構築やメンテ障害対応でも参考にできるものもあるとおもいます。

詳しくはブログでｗ
といいますかアフィリエイトってやっぱり儲からないですね。商品レビューだけでしょうね直結すんのはｗ
アクセス増えたって一銭も入ってこない。。まあブログは自己満足自己啓蒙でがんばって生きたいと思います。

http://amachan007.techblog.jp/archives/7656346.html
Swift 3 で Array を Shuffle

### Array を Shuffle したい

Swift である事を実装しようと思うと、ある別の事を実装しなくてはならなくて、その実装をしようと思ったら、さらに別の実装が必要となった。それが、Array をシャッフルする事でした。そんなの標準であってもよさそうですが、標準のライブラリにはなく、どこかの勉強会で発表を見た気もするが、記憶の切れ端が見つかりません。検索して、良さげのを見つけてきても、Swift 3.0 でビルドエラーになったり、どこかのブログのコードスニペットを使ってみると、クラッシュして調べてみると、中で swap を使っている所でクラッシュしていました。いろいろ調査するよりも、自分で作ってしまえと思いこの記事を書きます。

設計方針は、「多少非効率であっても、swap を使わない」としました。

```Array+shuffled.swift
extension Array {

	func shuffled() -> [Element] {
		var results = [Element]()
		var indexes = (0 ..< count).map { $0 }
		while indexes.count > 0 {
			let indexOfIndexes = Int(arc4random_uniform(UInt32(indexes.count)))
			let index = indexes[indexOfIndexes]
			results.append(self[index])
			indexes.remove(at: indexOfIndexes)
		}
		return results
	}

}
```

簡単な説明をすると、`n`番目の要素を表す `0` から `n-1`までの整数を生成して 中間的なArray を作ります。その中間的なArrayから要素一個をランダムに選び（`m`とする）、元のArrayの `m` 番目の要素を新しいArrayに追加し、中間的なArrayから、`m`を表す要素を削除し、これを最後まで繰り返せば、非破壊的にシャッフルされた Array が出来上がります。

もっと効率的な...なんて一瞬脳裏を横切りましたが、ここはエネルギーをかける所ではないのでこれでよしとする事にします。<font color="silver">コード自体よりこの記事を書く方が時間がかかった事は秘密</font>

### Gist

コードは gist からも入手できます。

https://gist.github.com/codelynx/5e3a5fd972f2d6f1a032b764d0870458


### 参考資料

[How do I shuffle an array in Swift?]
(http://stackoverflow.com/questions/24026510/how-do-i-shuffle-an-array-in-swift)
[swiftでシャッフル関数](http://qiita.com/satoshia/items/13d0842a784f0f91c018)


### 環境に関する表示

```.log
Apple Swift version 3.0 (swiftlang-800.0.46.2 clang-800.0.38)
```
【Memo】mt:Forに関して


mt:Forを使って色々試してみたので、メモエントリーになります。
やろうと思ったきっかけは配列やループ系を勉強する中で、JSのフレームワークでよくあるコンポーネントっぽいものをMTMLで実装してみようかなって思ったのが始まりです。

## 各ブログでそれぞれのローカルナビゲーションを作ってみる

本来mt:Forの使い方は、カウント処理だったり回数で何かするということが一般的に使われていると思います。
私個人の研究として、これを各ブログで違うローカルナビとかで応用できるかなと思いやってみました。

最初は、mt:loopとかで複数の配列を入れたいなと思ったのですが、うまくいかずmt:Forのform→toで処理で代替してみました。すばらしいTipsではありませんが、こういった使い方もできるなと思いました。

結局ソースコードが長くなってHTMLを直接入れたほうがいいんじゃない？って思ったのですが、構造体だけを維持しつつデータの差し替えだけで管理したかったのでやってみました。

## 構造体をウェブサイトのテンプレートモジュールで定義

ウェブサイト（親）のテンプレートモジュールで定義することで、各ブログのテンプレートで呼び出せるようにしておきます。

```
<mt:SetVarTemplate name="navigationSample" key="navigation">
<ul>
<mt:for var="x" from="$navigationStart" to="$navigationCnt">
  <li class="<mt:Var name="classSample{$x}" />">
    <a href="<mt:Var name="linkSample{$x}" />">
      <mt:Var name="labelSample{$x}" />
    </a>
  </li>
</mt:for>
</ul>
</mt:SetVarTemplate>​
```

* SetVarTemplateをセット
* mt:forをセット
* formとtoは、各ブログテンプレートで変数を定義する（数はブログごとにユニークのため）
* mt:Varは、各ブログテンプレートで配列を定義する
* テンプレートモジュール名：function

## 各テンプレートのインデックスまたはアーカイブテンプレートで定義

各ブログで使用するフォーマットは以下のように定義してみました。

```
<mt:Ignore>テンプレートモジュールの読み込み</mt:Ignore>
<mt:Include module="function" parent="1" />

<mt:ignore>** ローカル変数 **</mt:ignore>
<mt:Ignore>Countの定義</mt:Ignore>
<mt:SetVars>
navigationStart=1
navigationCnt=3
</mt:SetVars>

<mt:Ignore>Labelの定義</mt:Ignore>
<mt:SetVar name="labelSample" />
<mt:SetHashVar name="labelSample">
  <mt:SetVar name="1" value="HOME" />
  <mt:SetVar name="2" value="ABOUT" />
  <mt:SetVar name="3" value="SERVICE" />
</mt:SetHashVar>

<mt:Ignore>linkの定義</mt:Ignore>
<mt:SetVar name="linkSample" />
<mt:SetHashVar name="linkSample">
  <mt:SetVar name="1" value="/index.html" />
  <mt:SetVar name="2" value="/about.html" />
  <mt:SetVar name="3" value="/service.html" />
</mt:SetHashVar>

<mt:Ignore>classの定義</mt:Ignore>
<mt:SetVar name="classSample" />
<mt:SetHashVar name="classSample">
  <mt:SetVar name="1" value="home" />
  <mt:SetVar name="2" value="about" />
  <mt:SetVar name="3" value="service" />
</mt:SetHashVar>

<mt:Ignore>表示側</mt:Ignore>
<mt:Var name="navigationSample" key="navigation" />
```

* 各hashで定義したkeyはナンバリングが必要（Forで呼び出す時の値として使用するため）
* それぞれに定義したclass名やlinkやlabelの値をvalueに入れる

これで、同じフォーマットを使って、各ブログで表示する内容を変えることができます。

個人的にSetHashVarが複数設定するところをそれぞれの値ごとに関連性をもたせたかったのですが、keyとvalueしか対応できないので、3つ以上の場合この方法になりました。

他に良い方法が見つかれば良いのですが。。コンポーネント化プラグイン的なのを作るしかないのかなと思いました。（プラグイン作れない身としては結構きつかったり・・・）
Firefoxのタブ機能をソースコードをいじって改変した

# Firefoxのタブ機能をソースコードをいじって改変した
## はじめに
この記事は大学の講義の一環で作成しています。目次は[こちら](http://qiita.com/kagutitan/private/3243a2cce3a4a80b9c1a)になります。

## 目的
ブラウザでテキストを選択した後検索ということをしたいときを考えると既存の方法としては以下のようなものが考えられます。

* 右クリック → 「Googleで○○を検索」をクリック
* Ctrl+C(コピー) → Ctrl+T(新しいタブ) → Ctrl+V(貼り付け) → Enter(検索の実行)

この操作がいつも煩雑だと思うので、ブラウザ上で選択した単語を簡単に(例えばショートカットキーで)検索したいテキストを選択 → Ctrl+Tで実行できるようにしたいと思いました。

## 実装
実装を考える上で文字を選択して右クリックを入力した際の挙動をデバッガによって追跡しました。デバッグはブラウザツールボックスを用いて行います。
新しいタブを開くときに、クリップボードの中身を検索して出てくるように実装しました。クリップボードの中身が空であれば新しいタブを開くようにしました。

今後、ファイルの場所はfirefox-49.0というディレクトリにいるとした時のパスで表します。
まず、元のコードとしては以下のコードとなっています。

```javascript:./browser/base/content/browser.js改変前
function BrowserOpenNewTabOrWindow(event) {
  if (event.shiftKey) {
    OpenBrowserWindow();
  } else {
    BrowserOpenTab();
  }
}
```
これを以下のように変更しました。

```javascript:./browser/base/content/browser.js改変後
function BrowserOpenNewTabOrWindow(event) {
  if (event.shiftKey) {
    OpenBrowserWindow();
  } else {
    let searchText = readFromClipboard();
    if (typeof searchText !== "undefined") {
      BrowserSearch.loadSearch(searchText, true, null);
    } else {
      BrowserOpenTab();
    }
  }
}
```

### 関数や変数の説明
#### readFromClipboard
この関数は名前の通りクリップボードの中身を取得している関数と考えられます。また、この関数には以下のようなコメントがあります。

```javascript:./browser/base/content/browser.js
// If available, use selection clipboard, otherwise global one
```
これによりダブルクリックで選択した後に(選択を外れた後も)Ctrl+Tとするだけで(予期せず)検索できました。
#### typeof searchText
これによってsearchTextの型を確認することにより、クリップボードが空(undefined)のときには新しいタブを表示するようにしました。
#### BrowserSearch.loadSearch
この関数は以下のように定義されています。

```javascript:./browser/base/content/browser.js
loadSearch: function BrowserSearch_search(searchText, useNewTab, purpose) {
  let engine = BrowserSearch._loadSearch(searchText, useNewTab, purpose);
  if (!engine) {
    return null;
  }
  return engine.name;
}
```

右クリックの時にも呼ばれる関数であり、今回はusenewTab:trueとすることで新しいタブで検索結果を表示しています。また、purpose:nullとすることでこの関数内のBrowser._loadSearchより内部でpurposeはデフォルトのpurpose("searchbar")となります。このことは以下の記述からわかります。

```javascript:./obj-x86_64-pc-linux-gnu/dist/bin/components/nsSearchService.js
// Default to searchbar if the purpose is not provided
var purpose = aPurpose || "searchbar";
```

### 最後に
#### バグ
* ブラウザの外でクリップボードにコピーした後しばらくしてから新しいタブを開くとなぜか新しいタブが表示されてしまいます。
* 何かのタイミング新しいタブを開くと”about:home”が検索されてしまいます。

#### メリット
別のところで(例えばpdfファイルやターミナルに表示されるエラー文)検索したいワードが出てきた時にそれをクリップボードにコピーすれば新しいタブを開くだけで検索できます。
#### デメリット
新しいタブを開くときに常に検索されてしまいます。
ショートカットキーを別に割り当てた方がいいかもしれません。
Djangoで作るTwitter投稿アプリケーション

#Twitterに投稿するだけのアプリケーションを作ろう

bottleでもやったことのDjango版になります。単に投稿して、投稿した文字列を返すだけのごく初歩的なアプリケーションを作っていきます。スクリプト自体は焼きましなのでPython2系とゴッチャになってるかもしれませんが、一応動きます。

過去記事　http://qiita.com/Gen6/items/1848f8b4d938807d082e
　　　　　http://qiita.com/Gen6/items/a5562c36fc5c67c89916
　　　　　http://qiita.com/Gen6/items/e845787a6ad073a77310

#前準備はやっておいてください


```
(virtualenv)$ pip install requests requests_oauthlib
```

仮想環境下にインストールしておきます。


#アプリケーションのイメージ

<img width="272" alt="スクリーンショット 2016-10-24 12.39.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/71585/4119acd5-0196-549e-c132-fd7ea59a26c1.png">

こういうのを作ります。
bootstrapをstaticフォルダを作り投げ込んでおいてもいいですし、CSSを自分で書いてもいいと思います。

#中身

```myapp/views.py
from requests_oauthlib import OAuth1Session
import json
import re
import os
import requests
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

from django.http.response import HttpResponse
from django.shortcuts import render


def index(request):
    Message = {
        'words': request.GET.get('words'),
    }

    msg = request.GET.get('words')

    C_KEY = "***********************"
    C_SECRET = "***********************"
    A_KEY = "***********************"
    A_SECRET = "***********************"

    url = "https://api.twitter.com/1.1/statuses/update.json"
    params = {"status": msg,"lang": "ja"}
    tw = OAuth1Session(C_KEY,C_SECRET,A_KEY,A_SECRET)
    req = tw.post(url, params = params)

    return render(request, 'index.html', Message)
```

```myapp/urls.py
from django.conf.urls import url
from . import views

urlpatterns = [
    url(r'^$', views.index, name='index'),
    url(r'^template/$', views.index, name='index'),
]
```

```templates/index.html
{% extends "base.html" %}
{% block body %}
  <div class="container">
    <div class="row">
    <form action="" method="get" class="form-group">
      <label>ツイート<input type="text" size="20" name="words" class="form-control"></label>
      <input type="submit" class="btn btn-primary" value="送信">
    </form>
    {% if words %}
      <p>「{{ words }}」 とツイートしました。</p>
    {% endif %}
    </div>
  </div>

{% endblock %}
```

bottleのときと比較するとなんかグッと楽になった気がするのは気のせいでしょうか。
＞bottle版　http://qiita.com/Gen6/items/ee33eb51fbeb969bb9db



続きをやりたい方はこちらで
http://qiita.com/Gen6/items/11fa5265053da95fcf0b
Google Clould Platform | gsutil コマンドを爆速にする 

-m オプションを付けるとマルチスレッド/マルチプロセスで高速に処理してくれるようになる。(体感30倍ぐらい速い)
オプションの位置に注意。 gsutil cp とかの後じゃなく、gsutil に直接オプションを渡すこと。

例:

- `gsutil -m cp -r dir gs://my-bucket`
- `gsutil -m rsync -r dir gs://my-bucket`
- `gsutil -m rm -r gs://my-bucket`

# 参考
- https://cloud.google.com/storage/docs/gsutil/commands/cp








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
UISearchBarのresultSearchControllerをSearchBarが空値の状態でも表示する

こんにちは :octocat:

通常の`UISearchBar`の実装では、SearchBarがテキストを持たないとき、もとのビューが見え続けます。
ですが、SearchBarがテキストを持たないときでもアクティブになったタイミングで`searchResultsController`を表示したいときがあるかと思います。
検索したところStackOverFlowにジャストな記事（[■](http://stackoverflow.com/questions/30790244/uisearchcontroller-show-results-even-when-search-bar-is-empty)）がありましたので、学習記録がてら日本語版として書いておきます。

## 環境

- macOS 10.12 sierra
- Xcode 8.0 (8A218a)
- Swift 3.0

## 解決法

- UISearchBarを実装しているクラスで、さらに`UISearchControllerDelegate`プロトコルを取り入れます

```swift
resultSearchController.delegate = self
```

- `willPresentSearchController`を実装します。

```swift
extension HogeViewController: UISearchControllerDelegate {
    func willPresentSearchController(_ searchController: UISearchController) {
        DispatchQueue.main.async {
            searchController.searchResultsController!.view.isHidden = false
        }
    }
}
```

- `didPresentSearchController`を実装します。

```swift
func didPresentSearchController(_ searchController: UISearchController) {
    searchController.searchResultsController!.view.isHidden = false
}
```

詳しくは[元記事](http://stackoverflow.com/questions/30790244/uisearchcontroller-show-results-even-when-search-bar-is-empty)もあわせてご覧ください :eyes:
hubot-slack 4系でAttachmentsを投稿する


3系では、 `robot.emit 'slack.attachment'` で投稿できたが、4系では投稿できなくなった。

なので、少しやってみた。

```coffeescript
slack = require 'hubot-slack'

module.exports = (robot) ->
  robot.respond /test/, (res) ->
    room = res.envelope.room
    timestamp = new Date/1000|0

    # https://api.slack.com/docs/message-attachments
    attachments = [
      {
        fallback: 'デプロイしたよ',
        color: 'good',
        pretext: 'デプロイしたよ',
        fields: [
          {
            title: 'Command',
            value: 'cap staging deploy',
            short: false
          }
          {
            title: 'Stage',
            value: 'staging',
            short: true
          },
          {
            title: 'Status',
            value: '0',
            short: true
          },
          {
            title: 'Output',
            value: '12323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323123231232312323',
            short: false
          }
        ],
        footer: 'hubot',
        footer_icon: 'https://hubot.github.com/assets/images/layout/hubot-avatar@2x.png',
        ts: timestamp
      }
    ]

    options = { as_user: true, link_names: 1, attachments: attachments }

    client = robot.adapter.client
    client.web.chat.postMessage(room, '', options)
```

要は、 `hubot-slack` が使っている [slack] (https://github.com/slackhq/node-slack-sdk) を直接呼んでしまえばできた。
xdebugでカバレッジを表示（AmazonLinux+PHP5.6）

単体テスト以外のコードカバレッジを取りたくなったのだけど、使いやすそうなツールが見つからなかったので、xdebugを使ってコードカバレッジを測定してみた。

#インストール

PHP5.6向けのxdebugは標準レポジトリに入っていないので、peclでインストールする。

    sudo yum install php56 php56-devel php-pear
    sudo pecl install xdebug 
    sudo vi /etc/php.ini
    # php.iniの末尾にでもextensionのロード指定を追加する→ zend_extension=/usr/lib64/php/5.6/modules/xdebug.so
    sudo /etc/init.d/httpd restart #リスタート

phpinfo()で、xdebugが出力されていればインストールに成功しています。

![2016-10-24_1205.png](https://qiita-image-store.s3.amazonaws.com/0/143301/52f31076-0d49-e5b4-84fb-b1f800f84d95.png)

#使ってみた
カバレッジが取れるかやってみた。

##実行したコード
以下のコードを実行しました。not zeroの行は実行されないはずです。

```
<?php
    xdebug_start_code_coverage();

    $x = 0;
    if($x == 0){
        echo "zero";
    }else{
        echo "not zero";
    }

    var_dump(xdebug_get_code_coverage());
?>
```

##実行結果
8、9、10行目のカバレッジが記録されませんでした。妥当といえば妥当なのですが、コードがないとはいえ10行目は通っているので、不自然な感じはします。ソースコードとカバレッジを重ねて表示すると分かりやすいと思いました。複数のテストケースを実行した結果をデータベース等に保存し、ビューアーを作ることで、比較的簡単にコードカバレッジ測定（表示）ツールを作れそうです。

```
zero
/var/www/html/cover.php:11:
array (size=1)
  '/var/www/html/cover.php' => 
    array (size=5)
      4 => int 1
      5 => int 1
      6 => int 1
      7 => int 1
      11 => int 1
```


#まとめ
ちょっと頑張ればコードカバレッジ測定ツール作れそう。
オリジナルクラスのイベントをWithEventsで捉えるときは

# 諸元
イベントを持つクラスを作成した場合
Formなどでそのイベントを捉えるときは、メンバ宣言するときにWithEventsをつけておけば
コーディングが楽です。

ただしこのとき、Formが閉じられてDisposeされても、イベントハンドラは残っているようで
イベントが発行されたときに拾ってしまいます。
ハンドラをしっかり消すためにはDisposeイベントでメンバの参照をnothingすればOK。

# ソース
Raiseが呼び出されたらイベント起こすだけの実験的クラス

```vb:Class1.vb
Public Class Class1
    Public Event TestEvent(sender As Object, e As EventArgs)

    Public Sub Raise()
        RaiseEvent TestEvent(Me, New EventArgs)
    End Sub
End Class
```

実験クラスのインスタンスをメンバに持ち、
Form2を開いたり実験クラスのRaiseを実行したりする役割

```vb:Form1.vb
Public Class Form1
    Private cl As New Class1
    Private WithEvents f As Form2

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        f = New Form2(cl)

        f.Show()
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        cl.Raise()
    End Sub

    Private Sub f_Disposed(sender As Object, e As EventArgs) Handles f.Disposed
        f = Nothing
    End Sub
End Class
```

実験クラスのイベントを拾ったときにメッセージを出す

```vb:Form2.vb
Public Class Form2
    Private WithEvents cl As Class1

    Public Sub New(cl As Class1)

        ' この呼び出しはデザイナーで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後で初期化を追加します。
        Me.cl = cl
    End Sub

    Private Sub cl_TestEvent(sender As Object, e As EventArgs) Handles cl.TestEvent
        MessageBox.Show("!")
    End Sub

    Private Sub Form2_Disposed(sender As Object, e As EventArgs) Handles Me.Disposed
        Me.cl = Nothing
    End Sub
End Class
```

# 実行と確認
Form1は最初から実験クラスのインスタンスを持っています。
Button2を押すとインスタンスにイベントを起こさせますが、最初は何も変化しません。

Button1を押すとForm2にインスタンスを渡した上で開きます。
Form2は渡されたインスタンスの発行するイベントを拾ってメッセージボックスを出すので、
Form2を開いてからForm1のButton2を押すと確かに出ます。

Form2を閉じてからButton2を押してもメッセージボックスは出ません。
これはForm2がDisposeしたときにインスタンスへの参照を消しているからであって、放置していれば
Form2がGCによって開放されるまではイベントは拾い続けるでしょう。
( インスタンスがForm2から参照され続けているからForm2は開放されない？ ちょっとわかりません)
よく使いはしないけれどまとめておきたかったGitの設定


あまりよく使うものではないけれど，最近個人的にたまによく使うことが多い設定をまとめてみました．

## `user.name`と`user.email`の設定

### 設定の確認

```
$ git config --global --list
user.name=shy_azusa
user.email=shy.azusa@gmail.com
```

### 設定方法

```
$ git config --global user.name 名前
$ git config --global user.email メールアドレス
```

### 入力例

```
$ git config --global user.name shy_azusa
$ git config --global user.email shy.azusa@gmail.com
```


## `remote`の設定

### 設定の確認

```
$ git remote -v
origin git@github.com:shyazusa/origin.git (fetch)
origin git@github.com:shyazusa/origin.git (push)
github git@github.com:shyazusa/github.git (fetch)
github git@github.com:shyazusa/github.git (push)
```

### 設定方法

#### 追加

```
$ git remote add リモート名 リモートのURL
```

#### 編集

```
$ git remote set-url リモート名 リモートのURL
```

#### 削除

```
$ git remote rm リモート名
```

### 入力例

```
$ git remote add github git@github.com:shyazusa/add.git
$ git remote set-url github git@github.com:shyazusa/edit.git
$ git remote rm github
```

## その他設定

### 設定方法

#### gitの補正をオンにする

```
$ git config --global help.autocorrect 待ち時間
```

#### 変更のdiffを見ながらコミットメッセージを書く

```
$ git config --global commit.verbose trueかfalseでオンオフ
```

#### 入力例

```
$ git config --global help.autocorrect -1
$ git config --global commit.verbose true
```
turnip_supportを使ってみよう

# インストール方法

Gemfileの`group :test`に下記の行を追加する

```
gem "turnip_support", git: "https://github.com/ThuBM/turnip_support"
```

その後、下記のコマンドを実行して

```
bundle install
```

# 環境を初期化

```
cd [プロジェクトフォルダ]
bundle exec rake turnip_support init
```

上記のコマンドを実行して、下記のファイルは自動的に作成される
- `.rspec`
- `spec/spec_helper.rb`
- `spec/turnip_helper.rb`

# テストパターン作成

3部分がないといけない。3部分は空の行で分離されないといけない

<img src="https://raw.githubusercontent.com/ThuBM/turnip_support/master/images/main_structure.png">

- feature_data: 基本のテスト情報を含む。(1行目 ~ 3行目)
  - 1行目： 機能
  - 2行目： タスクリンク
  - 3行目： ステータス


- initial_data: 初期化のデータを含む。 (6行目から )
  - カラム **B** : モデル名
  - カラム **D** : オブジェクト ID
  - カラム **E** から: オブジェクト属性の値

例：

<img src="https://raw.githubusercontent.com/ThuBM/turnip_support/master/images/init_data_structure.png">

- procedures_data: テストアクションと期待結果を含む。
  - 手順は空の行で分離される
  <img src="https://raw.githubusercontent.com/ThuBM/turnip_support/master/images/procedures_structure.png">
  - 各手順の構造：
    - テスト手順と期待結果は空の行で分流される
    - アクションの部分：
      - カラム **A** : 手順のID
      - カラム **B** : シナリオ名
      - カラム **C** : ブランチID
      - カラム **D** : アクション
      - カラム **E** から : アクションに該当のパラム
    - 期待結果の部分：
      - カラム **C** : ブランチID
      - カラム **D** : 期待メソッド
      - カラム **E** から : 期待メソッドに該当のパラム
      - カラム **I** : 結果 (OK, NG)
      - カラム **J** : エーラがイメージパス

例:

<img src="https://raw.githubusercontent.com/ThuBM/turnip_support/master/images/each_proc_structure.png">

上記のイメージに書いてある手順は下記みたいの意味がある

```
Scenario List all users (result ok)
  When visit to /users　　　
  Then have content admin_test_name
  And have content normal_name
  When visit to /users/new
  Then have selector input#user_name
  And ...
  ...
```

# Configuration ファイル

- スプレッドシートに対してのグーグル認証取得: [チュートリアル](https://github.com/gimite/google-drive-ruby/blob/master/doc/authorization.md)
- `.yml` ファイルを作成: [Configuration](https://github.com/ThuBM/turnip_support/wiki/Configuration)

上記の2ファイルは`spec/configs`フォルダに置いてください。

# featureファイルを自動的に作成

下記のコマンドを実行する

```
bundle exec rake turnip_support [feature_name] [yml_config_file]
```

スプレッドシートが編集されるたびに上記のコマンドの実行は必要があります。

# テスト

```
rspec spec/features/[feature_name].feature
```

# 参考

https://github.com/ThuBM/turnip_support/wiki
R(統計) 変数毎に基本統計量(summary)を算出する。int,num,factorに対応。

# 基礎集計や機械学習を実行する前に、異常値や基礎情報を知りたいために作成しました。

integerやnumericだけでなく、factorやlogicalにも対応しています。

まだエラーや書き方がRらしくないかもしれませんが、コメント頂けると幸いです。

先に結果から。

```R
> output <- mySummary(iris)
> output
      colnames   class                                 inform   sum     sd   mean  Min Median  Max NA.s
2 Sepal.Length numeric                                   <NA> 876.5 0.8281 5.8433  4.3    5.8  7.9    0
3  Sepal.Width numeric                                   <NA> 458.6 0.4359 3.0573    2      3  4.4    0
4 Petal.Length numeric                                   <NA> 563.7 1.7653  3.758    1   4.35  6.9    0
5  Petal.Width numeric                                   <NA> 179.9 0.7622 1.1993  0.1    1.3  2.5    0
6      Species  factor setosa:50, versicolor:50, virginica:50  <NA>   <NA>   <NA> <NA>   <NA> <NA>    0
```

プログラム

```R
# 基本統計量を算出
mySummary <- function(df){
  # only data frame
  if (!is.data.frame(df)) return(NA)
  # create new df
  new.df <- data.frame(
    colnames  = NA
    ,class     = NA
    ,inform    = NA
    ,sum       = NA
    ,sd        = NA
    ,mean      = NA
    ,Min       = NA
    ,Median    = NA
    ,Max       = NA
    ,"NA's"    = NA
  )
  col.count <- ncol(df)
  for (i in 1:col.count) {
    if (is.integer(df[,i]) || is.numeric(df[,i])) {
      cal.sum    <- sum(as.numeric(df[,i]), na.rm=TRUE)
      cal.mean   <- mean(df[,i], na.rm=TRUE)
      cal.sd     <- sd(df[,i], na.rm=TRUE)
      cal.min    <- min(df[,i], na.rm=TRUE)
      cal.median <- median(df[,i], na.rm=TRUE)
      cal.max    <- max(df[,i], na.rm=TRUE)
    } else if (is.factor(df[,i]) || is.logical(df[,i])) {
      tmp <- summary(df[,i])
      str.val <- paste(names(tmp), tmp, sep=":")
      cal.summary<- paste(str.val, collapse=", ")
    }

    insert.row <- c(
      colnames  = colnames(df[i])
      ,class     = class(df[,i])
      ,inform    = ifelse(exists("cal.summary"), cal.summary, NA)
      ,sum       = ifelse(exists("cal.sum"), cal.sum, NA)
      ,sd        = ifelse(exists("cal.sd"), round(cal.sd, 4), NA)
      ,mean      = ifelse(exists("cal.mean"), round(cal.mean, 4), NA)
      ,Min       = ifelse(exists("cal.min"), cal.min, NA)
      ,Median    = ifelse(exists("cal.median"), cal.median, NA)
      ,Max       = ifelse(exists("cal.max"), cal.max, NA)
      ,"NA's"    = sum(is.na(df[,i]))
    )
    new.df <- rbind(new.df, insert.row)
    suppressWarnings(rm("cal.sum","cal.mean","cal.max","cal.median","cal.min","cal.sd","cal.summary"))
  }
  new.df <- new.df[-1,]
  return(new.df)
}
```
Zabbix 3.2でServer <=> Agentを暗号化する　

ZabbixのAgent <=> Server通信で、インターネット越しの場合も監視内容がもれないように暗号化します。
今回はPSK(pre-shared keys)を利用して暗号化します。

# 環境
* OS X EI Captian (10.11.6)
* Zabbix 3.2.1

Macへのインストールは以下で行っている。なお、TLSをONにするために、configure時に ```--with-gnutls``` を忘れないようにする。

* http://qiita.com/wapa5pow/items/fe3d89580bc78fa53f50

# 鍵の作成

GnuTLSで鍵を作成します。GnuTLSをインストールしていない場合は、 ```brew install gnutls``` であらかじめいれておきます。

```
$ cd /var/tmp
$ psktool -u zabbix_agent -p database.psk -s 32

Generating a random key for user 'zabbix_agent'
Key stored to database.psk
```

するとdatabase.pskに鍵があるのでcatなどで確認します。

```
zabbix_agent:a3107a610fb59c4a67d1ec8a836f8cca47dacabf8b85deb57a980184e04a67e7
```

# Agentの設定更新

```/usr/local/etc/zabbix/zabbix_agentd.psk``` に先程の鍵をいれます。ただしユーザ名は必要ないので、鍵の部分だけ格納します。

```
echo "a3107a610fb59c4a67d1ec8a836f8cca47dacabf8b85deb57a980184e04a67e7" > /usr/local/etc/zabbix/zabbix_agentd.psk
```

PSKを使い通信するように、設定ファイル ```/usr/local/etc/zabbix_agentd.conf``` を更新します。

```
TLSConnect=psk
TLSAccept=psk
TLSPSKIdentity=zabbix_agent
TLSPSKFile=/usr/local/etc/zabbix/zabbix_agentd.psk
```

# Serverの設定更新

Web UI上から以下のように設定します。

![image](https://qiita-image-store.s3.amazonaws.com/0/30079/320cc4c5-7237-78ea-9e5b-d924e3118945.png)


すべて設定が終わったら、AgentとServerを再起動します。

# トラブルシューティング
正しく設定できない場合は、ログをみて、TLSが有効になっているか確認してください。
ログで以下のように ```TLS support``` がNOになっていると、TLSサポートされていないので、 ```--with-gnutls``` をつけて再度Zabbix自体をインストールしてください。

```
  6525:20161024:105752.796 ****** Enabled features ******
  6525:20161024:105752.796 SNMP monitoring:           YES
  6525:20161024:105752.796 IPMI monitoring:            NO
  6525:20161024:105752.796 Web monitoring:            YES
  6525:20161024:105752.796 VMware monitoring:          NO
  6525:20161024:105752.796 SMTP authentication:       YES
  6525:20161024:105752.796 Jabber notifications:       NO
  6525:20161024:105752.796 Ez Texting notifications:  YES
  6525:20161024:105752.796 ODBC:                       NO
  6525:20161024:105752.796 SSH2 support:               NO
  6525:20161024:105752.796 IPv6 support:               NO
  6525:20161024:105752.796 TLS support:                NO
  6525:20161024:105752.796 ******************************
```

# 追記: PSKで暗号化するとzabbix_getがそのままでは使えなくなる

回避するために以下のようにする

```
zabbix_get -s localhost -k proc.num[ruby,,,td-agent] --tls-connect=psk --tls-psk-identity=zabbix_agent --tls-psk-file=/usr/local/etc/zabbix/zabbix_agentd.psk
```



# 参考
* [Zabbix Documentation 3.2 - Encryption](https://www.zabbix.com/documentation/3.2/manual/encryption)
* [Zabbix Documentation 3.2 - Using pre-shared keys](https://www.zabbix.com/documentation/3.2/manual/encryption/using_pre_shared_keys)
* http://qiita.com/atanaka7/items/2ff1fd6a12f1dde4075f
* http://qiita.com/skouno/items/d01793bf85116a26a9a8
100MB超のファイルをgithubにpushできなかった時の対処法

# 以下のようなメッセージがでたとき
```
XXXXX is 182.02 MB; this exceeds GitHub's file size limit of 100.00 MB
```
githubでは100MBのファイルを扱うことができません。

# 100MB以上のファイルを調べる
- 以下のコマンドで該当ファイルを調べます

```
find . -size +100M -ls
```

- 今後100MB以上のものを追加しないように.gitignoreにも追加します。

```
find . -size +100M | sed -e 's/^\.\///' >> .gitignore
```

# ターミナルを開きます
- 100MB以上のファイルをPush対象から外す。

```
git rm --cached XXXXX(対象ファイル名)
```

- （参考）外したファイルは以下で確認できます。

```
git ls-files --others --ignored --exclude-standard
```


- 変更内容を修正する。

```
git commit --amend -CHEAD
```

- pushする。

```
git push
```

# 参考
https://help.github.com/articles/working-with-large-files/