OmniAICreator/Qiita-1.07M huggingface dataset:
Youtubeのコメントをスクレイピングする

概要
====
[コメントの親子関係を利用したビデオ共有サイトにおけるネットいじめコメントの検出](http://db-event.jpn.org/deim2016/papers/208.pdf)では，[Youtube](https://www.youtube.com/)に投稿されたコメントを対象に，いじめコメントの検出を行っている．この研究のために，Youtubeコメントのスクレイピングツール[Youtube comment scraper](https://itslab-kyushu.github.io/youtube-comment-scraper/)を作成した．

Youtube comment scraper
==========================

そのなの通り，Youtubeの動画再生ページをスクレイピングして，投稿されたコメントを取得する．パッケージは[npm](https://www.npmjs.com/package/youtube-comment-scraper)に登録してあるので，`npm`コマンドにてインストールできる．

スタンドアロンで利用する場合，

```sh
$ npm install -g youtube-comment-scraper
```

とすれば，`scraper`コマンドが利用できるようになる．このコマンドの利用方法は，

~~~
Usage: scraper url [options]

   url
        URL for a Youtube video page or video ID.

   --help, -h
        Displays help information about this script

   --version
        Displays version info
~~~

となっていて，要するにYoutubeの動画再生ページのURLか，動画IDを渡せば良い．
例えば，

```shell-session
# URLを渡す場合．
$ scraper "https://www.youtube.com/watch?v=vN4U5FqrOdQ"

# IDを渡す場合
$ scraper vN4U5FqrOdQ
```

などとなる．出力はJSON形式で下記のようなフォーマットである．

```json
{
  "id": "動画 ID",
  "channel":{
    "id": "チャンネルの ID",
    "name" : "チャンネル名"
  },

  "comments": [
    {
      "root": "親コメント",
      "author": "このコメントの投稿者",
      "author_id": "投稿者のID",
      "like": "いいねスコア（下記参照）",
      "children": [
        {
          "comment": "親コメントへのリプライ",
          "author": "リプライの投稿者",
          "author_id": "投稿者のID",
          "like": "いいねスコア",
        },
        ...
      ]
    },
    ...
  ]
}
```

いいねスコアは，各コメントに与えられた:thumbsup:の個数から:thumbsdown:の個数を引いたスコアである．

また，各動画は複数の親コメントを持ち，各親コメントは複数のリプライを持ち得る．

<img width="806" alt="コメントの例" src="https://qiita-image-store.s3.amazonaws.com/0/62253/8b62a7b5-1059-5d7b-66b7-3ed8c92975db.png">

モジュールとしての利用
==================
```js
var scraper = require("youtube-comment-scraper");
```
として他のプログラムから呼び出して使うこともできる．（その場合はローカルにインストールする）このモジュールが提供する関数は次の２つである．

`scraper.comments(url)`
--------------------------
与えられた動画再生ページのURLまたは動画IDを元に，スクレイピングを行う．

- 引数:
  - url: 動画再生ページのURLまたは動画ID．
- 戻り値:
  非同期でスクレイピングを行うため[Promise](http://qiita.com/koki_cheese/items/c559da338a3d307c9d88)を返す．`then`メソッドを用いて結果を取り出すことができる．（下記の例を参照）

`scraper.channel(url)`
-----------------------
チャンネル ID を元に，チャンネル紹介ページをスクレイピングする．

- 引数:
  - id: チャンネル ID.
- 戻り値:
  非同期でスクレイピングを行うため[Promise](http://qiita.com/koki_cheese/items/c559da338a3d307c9d88)を返す．`then`メソッドを用いて結果を取り出すことができる．

`scraper.close()`
------------------
終了処理．スクレイピングに使用している[PhantomJS](http://phantomjs.org/)を終了させる．最後のスクレイピングが終わった後に，この関数を呼び出さないと，メインプロセスが終わらないことがある．

利用例
--------
例として`scraper`コマンドでの呼び出し部分を掲載する．

```js
var scraper = require("youtube-comment-scraper");

scraper.comments(some_url).then(function(res) {
  // 取得したコメントをJSON形式に整形して出力．
  console.log(JSON.stringify(res));

  // 終了処理.
  scraper.close();
});
```
paiza Code Girl Collection #ガルこれ

|&nbsp;|URL|
|:--|:--|
|コードガールこれくしょん|https://qiita.com/cielavenir/items/ea97544089a5a3ca686f|
|コードクロニクル|https://qiita.com/cielavenir/items/3124ec862325682d381d|

- Code Gym betaの時から言えることだけど、早解き問題を複数やることは本当に良いのか疑問だったりします。
- 真面目な方はpaizaラーニングの演習問題だけやればよいです。
- 逆に言うと、paizaラーニング基礎編第一部が完了してからゲームを始めることで、ほぼ一発でダイヤ6個取れることに。

以下、私自身は順位を気にしていないので、書きたいことを書きます。
(順位を上げるために自動解答スクリプト突っ込んでいる人がいるようなので、もはや不毛)

## 200307

- プライマリガール「貂蝉」(スコア8%)で52380点取れました。これはどういうことだろう。。コードクロニクルに入った言語はこちらも問題差し替えになったのかな?

## 160906

- プライマリガール「侍」(スコア7%)で35587点取れました。久々の更新。

## 共通

- `1==x`はどの言語でも問題なく評価されます。`x==1`よりも打ちやすい場合は積極的に行きましょう。

## Ruby

### 閏年判定
- `Date#leap?`でいけます。`date=Date.now; if date.leap? ...`みたいな問題だったような。`leep?`ではないのでそこだけ注意。
- ただ、`leap?`を初心者に推奨するのはどうなんだろう。本当はロジックを書くべき。

### 乱数
- `rand(start..stop)`です。

### 範囲逆順
- `(start..stop).to_a.reverse`でも良いですが、`[*start..stop].reverse`でも良いし、`(start..stop)`で回して出力を調整するのも勿論あり。
- ちなみに個人的にはRubyでのfor文はお薦めしません。つまり`stop.downto(start) do |i|`が正解。<del>打ちにくいので諦めますが。</del>
  - [追記] for の後ろに`stop.downto start`とするのが良さそう。括弧は不要。

### 年の下2桁
- `year%100`で通ります。本当は`sprintf('%02d',year%100)`ですが、そんなに長ったらしい物は書きたくない。

## PHP

### 暗算

- PHPは、`<?php ... ?>`の外に書いた語句は単にechoされる性質があるので、(入力を取らない問題については)暗算して、解答画面をクリアして答えを書いて実行するのが最速。

### 序盤
- ダイヤ6個狙いとして、`$x.$y.$z`なんて5秒で打つのはかなり困難ですが、中盤以降は制限時間多めになるので頑張って打ちましょう…あとは問題の運。

### date
- 年　`date('Y')` 2桁 `date('y')`
- 月 `date('n')`
- 日 `date('j')`
- 閏年 `date('L')`

## Python

### バージョン

- paizaラーニングで確認したところ、`3.4.3`でした。 **printは括弧が必要、入力はinput()** なので注意。あと、448/14==32 **.0** です。

### 閏年

- import文で示唆されていますが、`isleap(year)`です。

### 乱数

- `random.randint(start,end)`です。

## Java

### 序盤

- ダイヤ6個を狙うとすれば、タイピングスピードの影響をもろに受けるので、`System.out.println("");`をクリップボードに入れておくと吉。

### 乱数

- `new Random().nextInt(end-start)+start`です。面倒くさいので1に固定しましょう。


## C

### 序盤

- 「printf」をコピーしておくこと。

### 文字列結合

- `printf("%s%s%s",s1,s2,s3);`で良いと思います。Cでこの問題設定はよくない。

### 乱数

- `rand()%(end-start)+start`です。

### 今年

- `tm_now->tm_year+1900`

### ミス

- 1問だけ、「eles」と書かれたコードが有りますが、当然構文エラーなので、直す必要があります。
- 問題の本質と関係ない部分なのでつらい(不正解のときはsyntax errorなら出して良いのでは？)

## C# ##

- なぜかダイヤ6個制限時間が一律60秒なので他の言語より大幅に楽。てか他の言語も60秒にしてくれ(そのほうが初心者にやさしい)。

### ミス

- 「448から14を割り算した結果を出力する」問題ですが、答えは **31** です。どうしようもないので答えを埋め込んでください。
  - 31になる腐った言語があった気がしますが、何だったかな…。
  - マイナーな言語であるという記憶はあるのだけど、なんとも。

### 乱数

- `new Random().Next(end-start+1)+start`です。

## C++

- **C++特有の機能以外はCのセクションも参照のこと。**
- 出力問題のごく一部にしかあてはまりませんが、出力が1行の場合、`<<endl;`は不要です。

### include \<cstdlib\>

- paizaはC/C++の実行環境に[clangを採用しています](https://paiza.jp/guide/language)。
- `rand()`がcstdlibなしで使えるのはclangのみです。 **gccでは必要なので注意して下さい。**

### ミス

- x==2の問題が不正解になるときは、x=1をx=2に初期化し直してみてください。

## JavaScript

### セミカンマ

- 行末のセミカンマは不要です。

### 乱数

- `parseInt(Math.random()*(end-start))+start`です。
KIT（金沢工業大学）にiPhone(iOS)からVPNで繋ぐ

### はじめに
いつものことですが、大学ではWindows以外は非サポート扱いとなっています。
そのため現時点(2016/04/22)で出来ることが唐突にできなくなる場合があります。
また、自己責任で行ってください。筆者は一切の責任を負いません。

### きっかけ
KITのVPNには主に2つのモードが存在します。

- [Web]モード・・・ブラウザーだけでVPN接続が可能な簡易VPN接続ができる。外部のネットワークに接続可能。
- [NetworkConnect]モード・・・専用のソフトを介してVPN接続する、本格的なVPN接続が可能なモード。Windowsのみサポート。学内ネットワークしかアクセスできなくなる。外部のネットワークに接続不可。

今まではWebモードで普通に使えてたのですが、4月頃にポータルサイトの完全リニューアルが行われ、Webモードでは表示が崩れてしまい、自力でCSSを書き直すという方法がとられていましたが、残念ながらiOSの主要なブラウザーではCSSを書き換えることができずポータルサイトが使えない状態でした。そこで、今回はiOSからNetworkConnectモードで繋げないかやってみました。

### 環境
#### 端末
iPhone6s (64GB,Gold)
#### iOS
9.3.1
#### Pulse Secure
5.3.1.65349

## やり方
まずはRemote-VPNサービスが使えるように申請してください。

### Step1アプリの導入
AppStoreから「Pulse Secure」をインストールします。
![IMG_1262 (2).PNG](https://qiita-image-store.s3.amazonaws.com/0/79241/e8920f96-6424-8757-f91b-047dc2425be9.png)

### Step2 VPNの設定
インストールしたアプリを立ち上げて、設定をタップ
<img width="375" alt="IMG_1370.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/79241/b83347cc-e39a-4e8a-7a30-464abcaad5b3.png">


「新しい設定の追加」をタップ
![step2.png](https://qiita-image-store.s3.amazonaws.com/0/79241/542825df-0e7b-e930-c587-31f6f3ef98ed.png)

あとは、画面のように設定してください。
セキュリティ上いろいろ変えてありますが、適宜変えてください。
設定できたら、保存をタップして保存してください
<img width="375" alt="IMG_1264.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/79241/9bbeaa63-a51a-7700-42a9-e173c35e4e6b.png">

### Step3 VPN接続
ここまで来たら準備は完了です。
設定したVPNの名前をタップしてください（ここではkitです）
<img width="375" alt="IMG_1280.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/79241/49d8dda8-ecd2-cfb9-21db-990e820528ae.png">

接続ボタンをタップ
<img width="375" alt="IMG_1370.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/79241/b83347cc-e39a-4e8a-7a30-464abcaad5b3.png">

そうすると、認証画面が出てきますので、いつものようにに入力してサインインしてください。
<img width="375" alt="IMG_1281.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/79241/a1a5b1e5-3bdb-2420-44cd-2b028672aee4.png">

これでVPN接続ができました。ポータルサイトを覗いてみましょう。崩れることなく閲覧可能です！

### Step4 VPN切断
アプリから切断をタップすれば切断できます。

### 感想
新ポータルはレスポンシブデザインになっているのにもかかわらず、実際に表示されるのはPC版の表示なのでとても操作しづらいです。まだまだ未実装な部分が多いので今後の改善に期待です。
わりかし軽い User-Agent マッチング

## 結論

後述のようなUAのマッチングをする場合、体感的には`String.prototype.match()`を使うより、`String.prototype.indexOf()`を使う方が処理が早かったです（2016/04/20現在、当社比）。

例えば、UAの文字列からAndroid 5.x以前を検出したい場合の記述は、以下の通りです。

```detect-old-android.js
var ua = navigator.userAgent.toLowerCase();
var isLollipop = ua.indexOf("android 5") > -1; // If Android 5.x is true
var isAndroid4x = ua.indexOf("android 4") > -1; // If Android 4.x is true
var isAndroid2x = ua.indexOf("android 2") > -1; // If Android 2.x is true
var isOldAndroid = isLollipop || isAndroid4x || isAndroid2x; // Return true if Android version is 5.x or older 
if (isOldAndroid) {
  // Write here.
}
```
*[https://gist.github.com/takeshi81/1bb5e2cbff72a5ef46cdcc51dc9857ac](https://gist.github.com/takeshi81/1bb5e2cbff72a5ef46cdcc51dc9857ac)*

正規表現を使った方が記述はスマートですが、今回、Androidの古いバージョンに対して処理を行いたかったので、実行速度の早い書き方としました。お好みで値を変えてご利用ください。

以上です。

## あとがき： 私は如何にして`String.prototype.match()`するのを止めて`String.prototype.indexOf()`を愛するようになったか

Android 5（Lollipop）以前の端末に限って、日本語Webフォントを使いたかったからです。他の端末ではデバイスフォントを適用し、対象端末だけWebフォントの読み込みを行う処理のために、Web上のコードをいくつも試した結果、上述の方法にたどり着きました。実際には`// Write here.`の部分を、Webフォントサービスから提供されるコードに置き換えます。

### 経緯

（記事の主旨から外れるので、後でブログにまとめます。以下は下書き）

- Android 5（Lollipop）以前の日本語フォントは、モトヤマルベリやDroid Sansが標準で採用され、ベンダーによりその他のフォントがインストールされている。
  - モトヤマルベリは丸ゴシック体であり、比較的軽く甘い印象を与えてしまう（[参考](http://design.graphic.jp/static/howto_design/topics_002.html)）。デザイナーにより意見は異なるが、私は汎用的に用いるためのフォントとしては、あまり向いていないと考えている。
  - モトヤシーダはどこ？OSのリポジトリに上がっているのに、実機に入っていないことがある。
- Android 6（Marshmallow）では、日本語フォントにNoto Sans CJK JPが採用されている。
  - Noto SansはGoogleとAdobeが共同開発した角ゴシック体である。本文へ適用しても可読性は概ね良好な印象を受ける。
- そこで、Lollipop以前のAndroidに対してWebフォントを適用することを考えた。
  - 日本語（を含むCJK）フォントはファイルサイズが大きい。自力でサブセット化しても500KB〜1MB超くらいに落ち着くことが多いようである。
  - 特にこれから古くなるデバイスへ適用するのであれば、レンダリングにあまり時間がかからない実装にしたい。
  - もっとも、対象端末のシェアが落ちたらサポートは切るつもりである。
- Webフォントサービスを使う
  - 自力実装に比べて、商用Webフォントサービスは、さすがによくチューニングされていている。
  - 日本では[FONT+](http://webfont.fontplus.jp/)、[TypeSquare](http://www.typesquare.com/)などが有名。
  - [Adobe Typekit](https://typekit.com/fonts)のWebフォントにも日本語フォントが登場した。小塚明朝など自社製品の他、モリサワの主力書体も含まれている。
  - Creative Cloudに加入している場合、Typekitのポートフォリオプランが適用される。月間50万ページビューまで表示可能、サイト数は無制限である。

（つづく）
Raspbian Jessie で Kiosk Display

```
$ uname -a
Linux raspberrypi 4.1.19-v7+ #858 SMP Tue Mar 15 15:56:00 GMT 2016 armv7l GNU/Linux
```

Chromiumをインストール後、以下を編集。

```
vi /home/pi/.config/lxsession/LXDE-pi/autostart
```
```
@xset s off
@xset s noblank
@xset -dpms
@chromium-browser --noerrdialogs --kiosk --incognito https://www.youtube.com
```
再起動



# 参考
https://blog.reboost.net/kiosk-display-on-raspbian-jessie/
Spring-BootのThymeleafを同じURLで連続して何回も使いたい

何を言ってるかわからないだろう。それでいい。いいタイトルが思い浮かばなかった。Webの経験が浅いのでいい言葉を知らない（言い訳）

何がしたいかというと、`Spring-Boot + Thymeleaf`で、***固定のサイドビュー + メイン画面*** のような作りのWeb画面において、画面を再読み込みせずにメイン画面だけ更新したい、という要件があったとする。

例として、`/index.html`が上記の固定のサイドビュー + メイン画面の構成として、サーバサイドで以下のようなマッピングでリスンしている状態の場合、`/index`への初期遷移時は`/index.html`に対して`Thymeleaf`が働き問題ないが、そのあと、例えばサイドメニューで別項目を選択し、メイン画面を更新する必要がある場合、リクエストを`/index/hoge`で行い、サーバが例えば`hoge`の`ModelAndView`を返却したとすると、サーバは`/index/hoge.html`を探しに行ってしまい、リソースが無いので400エラーになる。


```java:SampleController.java
    @RequestMapping(value = "/index", method = RequestMethod.GET)
    public ModelAndView index(ModelAndView mav) {
        mav.setViewName("index");
        mav.addObject("param", "hoge");
        return mav;
    } 
```

よしんば`/index/hoge.html`を置いたとしても、`/index.html`と同じサイドビューと同じコードを書くのは流石に無いし、画面がサイドビューごと更新されてしまう。（サイドメニューがアコーディオン表現で開いたり閉じたりするようなメニューにしていた場合、開いていたのに閉じるなど、かなりかっこ悪い動きになる）

仕方ないので、`jQuery`の`$.ajax()`でJSONデータを取得し、DOMを動的にいじる等で対応していたのだが、せっかく`Thymeleaf`を使っているのに初期遷移時だけしか使えないというのは何とも寂しい。
色々模索していたところ、とりあえず以下の方法で落ち着いた。

```index.html
    <!-- メインメニュー(JQueryのload()で流し込む） -->
    <!-- ① -->
    <div id="main_menu"></div>

<script>

// 〜〜（省略）〜〜

    // 画面１を読み込む
    if (/* 画面1を読み込むための条件判定 */) {
			
        // 画面1をロードする
        // ②
        $('#main_menu').load('/menu1', null, function () {
            // なんか処理
        });
    }
    // 画面2を読み込む
    else if (/* 画面2を読み込むための条件判定 */) {
			
        // 画面2をロードする
        // ②
        $('#main_menu').load('/menu2', null, function () {
            // なんか処理
        });
    }

// 〜〜（省略）〜〜

</script>
```

```java:SampleController.java
    // ③
    @RequestMapping(value = "/menu1", method = RequestMethod.GET)
    public ModelAndView index(ModelAndView mav) {
        mav.setViewName("menu1");
        mav.addObject("param", "hoge");
        return mav;
    } 
```

①`index.html`に、空のセレクターを用意する。
②`jQuery`の`load()`関数に①のセレクターを設定し、サーバにリクエストする
③サーバは通常通りの方法で`ModelAndView`を返却する

こうするとテンプレートも分けられるし、流し込まれるhtml内で`Thymeleaf`を使うことも出来る。
注意点として、流し込む`menu1.html`にJavaScriptを書くと、`load()`されるたびに読み込まれてしまい、関数が同時に何回も呼ばれてしまう。
とりあえず関数はテンプレート単位にJSファイルに分けて、

```index.html
<script>
    $(document).ready(function(){
		$.getScript("/js/menu1.js");
		$.getScript("/js/menu2.js");
    });
</script>
```

とやったら回避出来た。あと、`<head></head>`内は設定しないと文字化け等してしまったので、
`<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />`
等は書いた。
OSS版Drone.io上のワーカーコンテナからコンテナを作成する方法のメリット・デメリット

OSS版Drone.io（以下Drone）が立ち上げたワーカーコンテナ上でコンテナを作成する方法2つと、実際に使ってみたメリット、デメリットを書きました。
今回はDroneでの使用を前提にしていますが、Droneに限らず「コンテナから新しいコンテナをrunしたい」などという用途にも使えると思います。

## 環境

* Amazon Linux (on EC2)
* Docker 1.9.1
* Drone 0.4

Droneは[docker hubにある公式のコンテナ](https://hub.docker.com/r/drone/drone/)を使用。
一部機能は新しいバージョンで実装された機能を使っているため、古いDockerやDroneでは動作しない可能性あり。

## wrapdockerを使う
1つ目の方法は"wrapdocker"を使う方法。[こちら](http://paislee.io/how-to-build-and-deploy-docker-images-with-drone/)を参考に。

```yaml:.drone.yml
build:
    image: jpetazzo/dind
    privileged: true
    commands:
        - wrapdocker
        - docker build -t my_container .
```

Droneの設定で **"Trusted"をONにする** のを忘れずに。

### メリット
* 手軽に使用可能

### デメリット
* dindコンテナの中のDockerが作業を行う。つまり、 **Droneの一連の処理が終わったらすべて消える。**
* privilegedで特権を取得するのでセキュリティ的にあまりよろしくない。らしい。

## docker.sockを使う
ホストのdockerの/ver/run/docker.sockをマウントしてホストのDockerを操作する。

### コンテナの準備
Dockerのモジュールが入ったコンテナを作成する。

```text:Dockerfile
FROM debian:jessie

#   --build-argで定義した変数を使用するために必要
ARG DOCKER_VERSION

RUN apt-get update && apt-get install -y apt-transport-https ca-certificates

#   Dockerをダウンロードするための設定
RUN apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
RUN echo deb https://apt.dockerproject.org/repo debian-jessie main > /etc/apt/sources.list.d/docker.list

#   Dockerのインストール
RUN apt-get update && apt-get -y install docker-engine=${DOCKER_VERSION}-0~jessie
```

Docker公式のセットアップ手順を参照に、コンテナの中にDockerをセットアップしているだけ。
ベースはDebianにしているけど、Ubuntuでもほぼ同様。
Debian
https://docs.docker.com/engine/installation/linux/debian/
Ubuntu
https://docs.docker.com/engine/installation/linux/ubuntulinux/

ビルドする。

```bash
docker build --rm --build-arg DOCKER_VERSION=$(docker version --format='{{.Server.Version}}') -t my_docker_in_docker .
```

--rmオプションで中間を消すのはお好みに応じて。このコンテナでわざわざキャッシュを残しておく意味はないと思う。
Dockerのバージョンを定義しているのは、ホストとクライアント（コンテナ）のDockerでAPIバージョンを合わせておかないとエラーが起きるため。
（常にどちらも最新バージョン同士なら問題ないだろうけど、今回はAmazon Linuxのリポジトリにある最新のDockerとDebianの最新版のバージョンがずれていたためエラーが起きた。）

### Drone側の準備
準備と言っても.drone.ymlですけど。

```yaml:.drone.yml
build:
    image: my_docker_in_docker
    volumes:
        - /var/run/docker.sock:/var/run/docker.sock
    commands:
        - docker build -t my_container .
```

### メリット

* pullしたベースやbuildしたコンテナ（中間含む）はすべてホストのDockerの管理下に置かれるのでキャッシュが利くし、ホストのDockerを操作している感覚（というか、実際にホストに対して操作しているのだけど）でよい。

### デメリット

* 一度やったら後は楽だけど、準備がやや面倒。
* この方法も、本当ならセキュリティ的にあまりよろしくない。らしい。

## まとめ
dindで何回かテストをしてみたけど、ベースを毎回pullしてくるし、ゼロからコンテナ作り直してるじゃん。ということで他の可能性を調べた末の方法がdocker.sockを使う方法でした。
やっぱりキャッシュが利く方がいいよね。

結局どっちも「セキュリティ的にあまりよろしくない」のね。そのあたりは参考のリンク先をご一読を。

## その他
「wrapdockerのデメリットをなくすために、dindコンテナに対象のベースコンテナををpullしてcommitしておけばいいんじゃね?」とも思ったけど、それだと「ベースが更新されるたびに手動で作り直さないといけないよね」ということで考えるのを止めました。

## 参考
OSS版　drone.io を使って Docker Image をビルド
http://qiita.com/quickguard/items/3b711fc871f42bf0772d

Docker マトリョーシカと私
http://orih.io/2015/12/we-should-think-twice-about-using-docker-in-docker/

Dockerコンテナ内からホストマシンのルートを取る具体的な方法（あるいは/var/run/docker.sockを晒すことへの注意喚起）
http://rimuru.lunanet.gr.jp/notes/post/how-to-root-from-inside-container/
chromebookにnode.jsを入れる

# モチベーション
[これ](http://qiita.com/ttakuru88/items/60f9561f0be1321faa85)を試したくて、chromebookにnode.jsを入れようと思いました。
備忘録&node.js初心者なので、検証不十分です。
詳しい方いらしたら、よろしくです。

# 環境

[git入りchromebook](http://qiita.com/y__sama/items/7684654a51e79566cdbc) ASUS C300MA

# やったこと

git経由でnode.jsのバージョン管理システムnvmを入れる。

```bash
git clone https://github.com/creationix/nvm.git /usr/local/bin/.nvm
echo 'source /usr/local/bin/.nvm/nvm.sh'>>~/.bashrc
source ~/.bashrc
nvm install v4.4.3
node -v
#>>> v4.4.3
```

ちょっとみないうちに、ver0.12からver4.ｘとかver5.xとかに上がっててビビりました。
なんか[偶数番がLTSらしい](https://html5experts.jp/yosuke_furukawa/17791/)ので、とりあえず4.xの最新であるv4.4.3を入れてみました。
[pyenvの時にきづきました](http://qiita.com/y__sama/items/7684654a51e79566cdbc#pyenv%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)が、ASUS C300MAは~/直下にアクセス制限がかかっているようで、~/直下にnvmをインストールすると、その後のインストールが上手くいかなくなります。
これはpyenvと同様にnvmのインストールフォルダを/usr/local/binにおくことで回避できました。

[bowerの紹介記事](http://qiita.com/oreo3@github/items/eb790fc091aa28af8d33)を参考にbowerを入れました。
この辺はあってるのか自信がないです。。。

```bash
npm install -g bower
cd /usr/local/bin/.nvm/versions/node/v4.4.3/lib/node_modules/bower
bower init
＃＞＞質問はとりあえず全部エンター連打
mkdir bower_components #textarea-markdown-editorインストール時にmkdirできなくて怒られてたので自分で作った。
```

# 実際にインストール

```bash
bower install textarea-markdown-editor
```

問題なく動きました^^
node.jsでの開発環境も構築できたっぽいです。
Go言語のHello Worldを3分で試す

![golang-project.png](https://qiita-image-store.s3.amazonaws.com/0/94137/13befe12-ce9a-f63b-fe12-d99c0a7f31f0.png)

Go言語でHello Worldしてみたくなったので挑戦してみる。


## 環境

* MacBook Air (11-inch, Early 2015)
* Mac OS X El Capitan バージョン 10.11.4


## インストール

brewに期待。

```bash
$ brew install go
==> Downloading https://homebrew.bintray.com/bottles/go-1.6.el_capitan.bottle.2.
######################################################################## 100.0%
==> Pouring go-1.6.el_capitan.bottle.2.tar.gz
==> Caveats
As of go 1.2, a valid GOPATH is required to use the `go get` command:
  https://golang.org/doc/code.html#GOPATH

You may wish to add the GOROOT-based install location to your PATH:
  export PATH=$PATH:/usr/local/opt/go/libexec/bin
==> Summary
🍺  /usr/local/Cellar/go/1.6: 5,771 files, 324.9M
```

インストール完了。ほんとにこれでいいのかな？というレベル。

```bash
$ which go
/usr/local/bin/go
```

コマンドも実行できそうだ。


## Hello Worldの準備

とりあえず、hello.goを書いてみる。

```hello.go
package main

import "fmt"

func main() {
  fmt.Printf("Hello World\n")
}
```


## 実行

実行してみる。

```bash
$ go run hello.go
Hello World
```

もうできた！

バイナリを作って実行もできるらしい。

```bash
$ go build hello.go
$ ls
hello*		hello.go
```

おお、バイナリができておる。早速、できたてのバイナリを実行してみる。

```bash
$ ./hello
Hello World
```

あっという間にできた！


## 参考

* [golang.jp - プログラミング言語Goの情報サイト](http://golang.jp/)
* [はじめてのGo―シンプルな言語仕様，型システム，並行処理：特集｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/go_4beginners)
シェルスクリプトで HTTP リクエストを行う最も原始的な方法

可搬性を最大限に保たなくてはいけないという要求のもとシェルスクリプトを書くとき、「curl はあるか？wget はあるか？」といったことすら考えることもあります。色々悩むことになるのであれば、bash で HTTP をしゃべろうという発想も悪くないでしょう。

以下の例は、TCP 接続を抽象化したデバイスファイルを読み書きしています。

```bash
# -*- shell-script -*-

HTTP_GET_SH_UA="http_get.source.sh/1.0"

function http_get {
    local url=${1#http://}
    local host=${url%%/*}
    local path=/${url#*/}
    exec 3<> /dev/tcp/$host/80
    printf "GET %s HTTP/1.1\n" $path          >&3
    printf "Host: %s\n" $host                 >&3
    printf "User-Agent: %s\n" $HTTP_GET_SH_UA >&3
    printf "\n"                               >&3
    cat <&3
}
```

`http_get http://example.jp/path/to` といったコマンドを入力すると、ヘッダとボディが空行で区切られたレスポンスが標準入力に得られます。

当然ながら複雑なことはできませんが、既存の環境が想定できない場合にこれができれば、簡単な HTTP リクエストを一度だけ実行したり、やろうと思えば curl や wget 自体を取ってくるといったこともできるでしょう。

HTTPS はさすがにシェルスクリプトだけでやるわけにはいかないので、OpenSSL の存在を仮定するのが素直でしょう。

* 最近の RHEL/CentOS 系の場合はほぼ標準と言える Postfix が `libssl.so` のために openssl パッケージを要求していて、これには `openssl` コマンドが同梱されています。なのでだいたい `openssl` コマンドは入っていると思っていいかも。
* 最近の Debian の場合は libssl パッケージというものが `libssl.so` を提供していて、これは `openssl` コマンドとは別なのでどうすべきか…。万が一 `openssl` コマンドが無くて `libssl.so` があれば、それを使う `curl` や `wget` を取ってきてしまった方が早いかも。

openssl コマンドでの HTTPS は `man 1 s_client` を参照ください

```shell-session
$ cat > header.txt
HEAD / HTTP/1.1
Host: www.openssl.org
Connection: close

$ cat header.txt | openssl s_client -connect www.openssl.org:443 -quiet
depth=1 /C=BE/O=GlobalSign nv-sa/CN=GlobalSign Domain Validation CA - SHA256 - G2
verify error:num=20:unable to get local issuer certificate
verify return:0
HTTP/1.1 200 OK
Date: Fri, 22 Apr 2016 14:01:39 GMT
Server: Apache/2.4.7 (Ubuntu)
Strict-Transport-Security: max-age=31536000; includeSubDomains
Accept-Ranges: bytes
Vary: Accept-Encoding
Connection: close
Content-Type: text/html; charset=UTF-8

read:errno=0
```

参考：

* [bash で TCP 通信 - Qiita](http://qiita.com/k_ui/items/a01fdcfa8ac6729e7870)
Rubyで高速popcount

実装したいものを思い描いていたところ、その過程で「整数の1が立ったビットを数える」ということが必要となりました。ところが、Rubyで実装するとかなり遅いことに気づいたので、C言語などで実装してみることにしました（[jkr2255/bit_counter](https://github.com/jkr2255/bit_counter)）。

# 先行事例

最近は`POPCNT`というCPU命令になるぐらいだし（後述）、だれか実装しているだろうと思ったら、意外と`Bignum`についてはほぼ手付かずだということに気づきました。

「ないんだったら、自分で作ればいいのよ！」

## 負の数について
Rubyの場合、整数が無限桁を（概念上）許容して、しかも負の数は２の補数表現ということもあって、符号ビットの1が**無限に続く**こととなっています。さすがにこの状態で1の数を数えても「無限大」となって意味がないので、負の数の時は「0の数を数えて、さらにそれをマイナスにして返す」という実装にしました[^1]。

# JRuby版…Javaに実装済み
C言語で拡張を作ると、JRubyは非対応となってしまします。ところが、今回の場合は、`Long.bitCount()`や`BigInteger#bitCount()`という、目的ぴったりなメソッドがJava側にあったので、[これを呼び出す](http://qiita.com/jkr_2255/items/33b1eb1b2d4099ca1c67)だけでほぼ片付きました。

とはいえ、JRubyでC拡張のビルドが始まってしまうとエラーになるので、`Rakefile`や`gemspec`でJRubyかどうかの条件分岐を入れて、さらにJRuby用Gemを別個で生成してRubyGemsにプッシュする必要がありました。

# C拡張の作成

Rubyの整数は[`Fixnum`と`Bignum`に分かれています](http://qiita.com/jkr_2255/items/476a4a82a0a2699ad777)が、`Fixnum`は簡単にC言語の整数にできるので、やるべきことは

* C言語レベルで高速にビットを数える
* `Bignum`をビット配列に変換する

この2つです。

## C言語レベルでのビットカウント
まず、SSE 4.2で導入された`POPCNT`命令が使えるか`CPUID`でチェックして、有効なら`POPCNT`で数えます[^2]。なかった場合はGCC組み込みの`__builtin_popcountl()`を使って、それもないときは手で書いたバージョンのカウント関数を使います。

## `Bignum`の値を配列に変換
`Bignum`で演算を続ければそのたびにオブジェクトを生成してしまって、スピードは全く出ません。ということで、いったん`Bignum`から数値配列に変換しますが、Rubyのバージョンによって`rb_big_pack`と`rb_integer_pack`という2つの関数があって、どっちが有効かが違ったりします。あと、変換用のバッファーも容量が小さい場合には`ALLOC`ではなく`ALLOCA`でスタックにとってオーバーヘッドを避けています（実際、小さな数ではこれだけで3割高速化しました）。

配列に入ればあとはカウントですが、Windows x64環境では`long`が32ビット幅なので、ポインタを読み替えて64ビットの`POPCNT`命令を使えるようにしています。

# ベンチマーク
よく使われる`num.to_s(2).count('1')`と比較してみたところ、（POPCNT命令のあるマシンで）5倍から20倍ほど高速化していました。

# 残る課題
いちおうRubiniusでも動くことは動くのですが、あまり速くならないので、なんとかならないものか検討中です。


[^1]: Javaの`BigInteger#bitCount()`は、「符号ビットと異なる」ビットの数を返す、となっています。つまり、負数についても正の値を返します。
[^2]: AVXなどを使って気合を入れればもう少し速くなるようですが、そこまではやっていません。
postach.ioのパーマリンクを知るには

#パーマリンクはソースの中に#
Evernoteのノートからブログを作れるサービス、postach.ioでブログ記事を作成しました。
そのパーマリンクがほしくなりましたが、色々画面を探しても出てきませんでした。
結局、**直接htmlソースを見ると、そこには書いてありました。**

```
<meta property="og:type" content="article">
<meta property="og:title" content="ノートリスト機能とは?">
<meta property="og:url" content="http://ge-nie.postach.io/permalink/44bb75b2b2">
```

三行目のURLですね。

xxx.postach.io/post/タイトル という形のURLだと、あとで題名を変更したときにURLが変わってしまいます。

シェアしたり、アプリで指定するときは、このパーマリンクのURLを使うと良いですね。

#(余談)コードのマークダウン#
postach.ioでは、markdownタグをつけると、マーグダウン機能を有効にできます。
コードのマークダウンも用意されています。タブ1つ、または4つのスペースを文頭につけるとコードとみなしてくれます。

[タブ1つ]コード
のように入力すれば、
` \<pre>\<code>コード\</code>\</pre> `
というhtmlに翻訳してくれます。
ただ、ブログになったときにコードと地の文が同じような外見です。区別がつきにくく、見づらいというのが印象を持ちました。

#参考文献#
[postach.io](http://postach.io/)
[Markdown: Syntax](http://daringfireball.net/projects/markdown/syntax#precode)

#追記(2016/04/26)#
パーマリンクでないと「あとで題名を変更したときにURLが変わってしまう」旨を書きましたが、間違いでした。**生成時のタイトルが維持されます**。

逆にいうと、記事のタイトルを変更しても生成時のタイトルにもとづいたURLのままになるということですね。URLを刷新した場合は、新規の記事を作成する必要があると思います。
Groongaで学ぶ全文検索2016-04-22 集計について


今日のテーマは集計について

## 全文検索での集計について

全文検索で集計ができるメリットは現時点で絞り込まれている文書の傾向がわかり、<BR>ユーザーが次にどうすれば良いかを決めやすくなること

例えばレストランを検索する場合
下記のようにジャンルでのサマリーを出すことで<BR>和食を食べたかったのに対象が無いのであればそこで検索をやめるなどの判断ができる。

例)

* 中華(3件)
* 和食(0件)
* イタリアン(10件)


これはユーザーにとっては
1. どのキーワードがどのくらい絞りこめるかがわかる
2. どのキーワードがあるかがわかる
ため次に何をするかの判断をすることができる。

※集計ではすでに決まったキーワードでグループ化するが、<BR>ユーザーに負担なくユーザーが絞りこめるための軸を検討する必要がある。

例)

価格比較サイト:値段
レストラン検索:ジャンル

## サジェストについて

ユーザーが欲しい情報に到達できるように手助けをする<BR>下記のようなサジェストについてもGroongaで実装されている

###もしかして
* 絞りこみすぎた場合に出す
* typoや間違いを治す

### 関連キーワード
* Googleの一番下に出ているようなもので「日本酒」で検索した際に<BR>
日本酒に関連する検索キーワードとして<BR>
「日本酒 ランキング」
「日本酒 飲み方」
などと表示されているもの
* ページの一番下にたどり着いているという事は対象が絞り込めていないという事なので一番下に関連度が高いものを表示すると良い。
* 関連度の高さはデータから関連度をもとめる場合と、ユーザーの入力値からもとめるパターンがあるが、<BR>ユーザーの入力はすべてのデータを信用できなく、<BR>データ量が少ない場合に偏ったサジェストになってしまう可能性があるので注意が必要

### 入力補完
* 次の動きを決める時に便利
* 必ず存在するものだけを出す事でユーザーが、がっかりしない
* ユーザーにキーワードを提示することができる


## 参考)
### データの性質について

学問的にはデータは下記の4種類があり
名義尺度＜順序尺度＜間隔尺度＜比例尺度の順に情報量が多くなるが、<BR>全文検索の場合、情報量は少なくなるが価格で検索したときよりも<BR>価格帯で検索した方がより傾向がわかりやすくなり、ユーザーが段階的に絞り込む時の助けになる。


1. 名義尺度(ジャンル、血液型など):順序を持たないデータ<BR>
2. 順序尺度(順位など):順位をもったデータ<BR>
3. 間隔尺度(価格帯):等間隔のデータ
4. 比例尺度(価格、身長、体重):数値の比にも意味があるデータ

データの性質がわかると、どのように見せれば良いかもわかる。

データの性質について今まで考えたことがなかったので面白いなと思いました。
統計と可視化について調べるとさらに勉強なるとの事
Slackのremind機能を使ってプライベートチャンネルにメンションを簡単に飛ばす方法


# やりたいこと
slackでプライベートチャンネルにリマインダー(/remind)を仕込みたい

# 実際のremindの書き方の例
リマインドをしたいチャンネル内で
`/remind @here "そろそろ風呂はいろう？" at 22:00` 
↑のようにコマンドを打つ


パブリックチャンネルだと#を打てばチャンネル名を補完してくれるのに、プライベートだとチャンネル名をどう指定するのか分かりにくいので、こちらに記事を残しておきます！
Mac OS X 10.11.3 (El Capitan) + pyenv + Python 3.5.1でimport tkinterできない時

# どうしたの
上記状態でpython起動し、import tkinterするとimport errorになる。
OS版のpythonについては情報があるものののこの組み合わせの情報はなかった（あんまり違わなかったけど）。

# import tkinterすると

```py
Traceback (most recent call last):
  File "/var/folders/_w/52jb4hnx4hb3rv6pvdlb7gtm0000gp/T/login.py", line 2, in <module>
    import tkinter as tk
  File "/Users/hogehoge/.pyenv/versions/3.5.1/lib/python3.5/tkinter/__init__.py", line 35, in <module>
    import _tkinter # If this fails your Python may not be configured for Tk
ImportError: No module named '_tkinter'
```
# 解決方法

```bash
% 一旦アンインストール
$ pyenv uninstall 3.5.1
% tcl-tkをインストール
$ brew tap Homebrew/dupes
$ brew install tcl-tk
% 再度インストール
$ pyenv install 3.5.1
```
これで無事使えました。brewでinstallしたpythonについては--with-brewed-tkが必要のようですが今回は特に明示する必要がありませんでした。

\# zlibでハマってしまったけどこれはxcode-select --installで解決します
IoT縛りの勉強会! IoTLT vol.14 @ ソフトバンクに行ってきたメモ

# イベント概要
http://iotlt.connpass.com/event/28246/

前半はLT 5分@一人　15人
発表者は何かしらの目立つものを着てる
会場めっちゃ綺麗で広い

# 会場説明
村井さん
Tシャツ作り
プロレス好き
胆のうが１つない
会場とエレベータホール以外立ち入り禁止


# スポンサーLT: 「ものづくり」を支援する新事業 +Style のご紹介
近藤 正充 氏@SoftBank

プラススタイル
入り口でチラシを配ってた
IoTのプロダクトに対して意見を言えたり買ったりできるサイト
https://plusstyle.jp

３つの機能

- プランニング
- クラウドファンディング
- ショッピング

ソフトバンクショップでも売れる
サポーター企業多い


# LT: IoT体験スペースTECH CAFEの展開について
石川 俊司 氏@SoftBank

Softbankが取り組んでいるIoT関連のサービス

- +Style
- TECH CAFE
- FMU

TECH CAFE

- Y!モバイルショップを利用してIoTを体験できるコーナーをやっている
- 六本木、南池袋、心斎橋、あともう一個

FMU

- Future Marketing Unit
- 動画等で説明したり、展示して体験することができる
- アンケート機能
- ソフトバンク表参道でやってる


# LT: IoTの前にI/Oの話
鈴木 氏@がじぇるね

GPIOはCPUのクロック数高ければ早く動くよね？を調べてみた

- いろいろと測ってみてもRaspPi遅い
- バスが多段になると遅くなる


CPUにバグなんてない

- 結構バグがある


がじぇるねのIoTコンテストがある
秋月でがじぇるねのカテゴリができた
**プレゼンは滑っても気にしない**


# LT: ビジネスから見たIoT
Hiroki Ogawa 氏@CAMI&Co.

新卒、プロデューサー
イベントプロデューサー

IoT、カネになる

- 1.7兆ドル

アップルウォッチと似たのを300円で売りたい
H/Wボタンの位置を変えたい
→無理ゲー

ハードオリエンテッドな考え方
→作るだけ作って金にならないことが多い
→目的を持って一貫を持って開発をする

まとめ

- なんだかんだで時間とカネなどコストがかかる
- その後の製品化につなげる必要性

IoT見積もりサービス


# LT: LEGOにぴったりのESP8266基板をつくったよ
河野@秘密結社オープンフォース

ESP8266

- 小さすぎる
- 550円
- 拡張基板は300円（部品別）

拡張基板はパブリックドメインでGithubで公開

うんちくタイム

- 3.3Vの電源
  - レギュレータで電源確保
- Amazonで売れなかった

**時間切れ**


# LT: ガチでビジネス！DALIを使った照明制御
中畑 氏＠日本ピーアイ

@nakachon

照明設備とLEDの話

照明設備でいくらぐらい掛かるか？

- モノだけで100万くらい
- カネがかかる

条件によってチカできたらビジネスになる気がしませんか？

- 出社した人の上だけON
- 残業
- ポモドーロ

どうやって証明を制御するか？

- GR-SAKURAをいっぱい使う→コストかかる

照明制御はオープンな規格がある
→DALI

# LT: Windows 10 IoT Coreで顔認証アプリ
川合 俊介 氏＠JMAS

@_shunsuke_kawai

RasbPi、カメラ、ディスプレイ、Wifi
顔認識で勤怠管理
UWP

破壊と想像を繰り返してつくられた

ネオエクスデス号

C# x UWPはいいぞ

# LT: Makerの聖地深圳に行ってみた
塩澤 氏＠ピクスー株式会社

2分でわかる深セン

- 世界最大の電子外
- ハードウェアのシリコンバレー

19万3600人
→数字が本当かはわからない

seed studio

華強電子世界
ひたすら専門店街

時間切れ


# LT: おしゃべりボックス♪
藤本 氏@がじぇるね

ロボコン
ソレノイド

コンセプト
言いにくことを伝えてくれる箱

リアルタイムじゃなくて手紙みたいな装置
GR-SAKURAでSDに書いてあるWAVから読みだして音声出せる


# LT: XBeeでイノシシを獲ってみた(続編)
たきもと 氏@ Sony CSL

前々回の続き

イノシシの取り方
くくりわな
落とし穴に落ちるとワイヤーが足を締め付ける

XBeeで罠猟のハードルを下げる

捕まえたらスマホにPUSH通知

絶縁シートが抜けたらセンサ固有IDを送る
→待機電力０

漁師さんがガラケーだったからメール通知ｗ

LIGでメイカー　うこ


# LT: なぜ、映像のピクセラがIoTを始めたの？
森 氏@ PIXELA

密かに４年前からM2Mでやってた
Air Tunerの余った時間を有効活用したい

- ホームオートメーション

BL

- 家の端まで届かない
- レンチンでデータ飛ぶ

通信規格を自作した
→Z-WAVE

MESHっぽいUI


# LT: あります！電柱100本にゲートウェイ
村山 氏@ 東京電力

邪魔とか景観損なう
570万本

ビーコンを電柱につけた

プラットホーム化して地域が活用する

みまもりサービス
100%近い検知率

プロジェクターを強引につけてビーコン


# LT: Internet of Telexistenceということ
中蔵 聡哉 氏

@arukakan

WebRTC

テレイグジスタンス
攻殻機動隊の義体

自作してみた


# LT: GR-SAKURAで家庭の問題を解決します
北村 トモミ 氏

@ktmr_tomomi

前回GR-SAKURAをもらったから活用してみた発表

子供ならプリントを入れることを忘れる
→楽しい感じだったら入れてくれるはず
→お母さんが見るの忘れる


# LT: 例の記事の裏話
のびすけ 氏@ LIG / TOLABL

本当につぶやいてますか？
ひとりごとをツイートする

精度そんなにいいの？

- Web Speech API
 - 結構調子いい
 - ChromeかOperaしか対応がない、AndroidはChromeのみ

それ仕事？遊び？

- 両方
GitHubのpushやプルリク通知をSlackに投げる

一刻も早くメールの時代を終わらせたいのでGitHubの通知をSlackに投げるようにした。

:::note alert
追記：本記事の情報は古くなっておりますので、2020年2月時点の手順をまとめた別記事をご参照ください
:::
[SlackとGitHubを連携してissueコメントやプルリク通知をチャンネルに流す方法（2020年版） - Qiita](https://qiita.com/unsoluble_sugar/items/e42ac352400598a24915)

# GitHub側の設定
Slackへ通知投げたいリポジトリを作成する。
対象リポジトリがすでに存在している場合は特にやることはない。

# Slack側の設定

1. Slackメニューの [Apps & Integrations] をクリック（ブラウザでSlackが開く）
2. 「github」を検索して、対象チームにインストール 
<img width="665" alt="スクリーンショット 2016-04-22 16.55.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/56b76ef5-5331-c57c-2e9b-fbc93e7f26ac.png">

3. 対象チャンネルを選択してAddする 
<img width="999" alt="スクリーンショット 2016-04-22 16.56.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/68358ebe-8495-32e0-b1a0-49a726aba646.png">

4. GitHubアカウントでログインして連携する
<img width="1031" alt="スクリーンショット 2016-04-22 16.56.57.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/77f78cee-91ad-c590-395a-0bd75ca2e609.png">

5. 対象リポジトリを指定する
<img width="1027" alt="スクリーンショット 2016-04-22 16.58.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/e32aaefc-d620-f4e1-fb6e-8e1b96aa0576.png">

6. Slackに通知投げるイベントを設定（その他の項目は必要に応じて変更してね）
<img width="956" alt="スクリーンショット 2016-04-22 17.58.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/79c09eeb-debf-43ee-c539-69559ad9d63b.png">

7. 設定保存して通知来るか確認する
<img width="612" alt="スクリーンショット 2016-04-22 18.02.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/6380/c6cbdfe0-a2a8-b055-8d9f-0e31d11d8938.png">


おわり。
Windows10のエクスプローラーのナビゲーションにGoogleDrive同期ツールのフォルダを表示させる

Windows10のエクスプローラーのナビゲーションにOneDriveフォルダあるのOneDrive使ってると便利ですよね！

GoogleDriveも使ってるので(Google Photos目的)同じようにしたく、GoogleDrive同期ツール(Googleが配布してるやつ)をいれたのですがフォルダアイコンは理想通りになりますがナビゲーションに追加されずクイックアクセスにピン止めという代替策を取らないといけなくとても不便でした

どうにかならないか調べても、ゴミ箱の表示が出るばっかでお目当ての記事を見つけるのに数日かかりました()

## 注意
レジストリ弄るので自己責任で(自分もよくわからずにしました)

## したいこと
![googledrive.PNG](https://qiita-image-store.s3.amazonaws.com/0/51176/3f2dbcef-926e-ae80-06f0-4ac74a391c0d.png)

OneDriveの上の奴です

## やり方

[Adding Google Drive to the Explorer sidebar](http://luke.digital/adding-google-drive-to-the-explorer-sidebar/) ←見つけた記事です、日本語環境だとそのままではうまくいかないので少し違います

- [ここ](https://github.com/svenkle/google-drive-add-to-explorer)からGoogle Drive.regをDLするかregファイルにコピペします
- "TargetFolderPath"="%USERPROFILE%\\Google Drive"が2か所あるので自分のGoogleDrive同期フォルダの**一個上のディレクトリ**のパスを指定します(このときディレクトリは`\\`で層を作ります)
- ファイルを保存し、実行します
- タスクバーの検索ボックスでregeditと入力しレジストリエディタを開きます
- `HKEY_CURRENT_USER\Software\Classes\Wow6432Node\CLSID\{81539FE6-33C7-4CE7-90C7-1C7B8F2F2D41}\Instance\InitPropertyBag`に移動し`\\Google ドライブ`を追記します
- `HKEY_CURRENT_USER\Software\Classes\CLSID\{81539FE6-33C7-4CE7-90C7-1C7B8F2F2D41}\Instance\InitPropertyBag`も同様にします
- 完了

### 説明
日本語環境だと同期するフォルダが`Google ドライブ`とマルチバイト文字を含んだものになってしまいます(なってない人は参考記事通りにすればいいです)
マルチバイトを含んでるとregファイルの実行で文字化けするらしく？回避方法なさそうでした
同期フォルダを英字のみに変更できないか試しましたがめんどくさそうなのでレジストリエディタで直接挿入することにしました

## 補足
ユーザー名日本語の方はフルパスをレジストリエディタでぶちこめばイケるかと思います

表示名が`Google Drive`になるのはこれも直接弄ったら日本語使えると思いますたぶん

削除したいときはダウンロードリンク先のとこので出来ると思います(試してない)
YAMAHA ルータの config を取得・設定する


YAMAHA のルータは tftp を使って config の取得や設定をすることができますが、config を管理するにあたっていくつか都合が悪いところがあり、簡単なシェルスクリプトを使って不要な情報を削除して git で管理できるようにしました。

https://github.com/yuuitiro/rtx-config

- curl を使って tftp を実行しています。
- 抜き出した config 
	- コメント行を削除していますが、最初の2行だけモデルとファームのリビジョンが乗っているので、これは保存するようにしています。
	- 改行コードは UNIX 形式に統一
- 多数のルータがあるときは一括で config を抜き取れるようにしています。
- パスワードの暗号化はしていません。
- 保存するときは、clear configuration を実行した後に config を流し込んで save するようにしています。
- 実機と config の diff をとれるようにしています。

## 使い方

### config 取得

```
% ./rtx-config -H <hostname> -p <admin password>
```

標準出力にルータの config が出力されますので、適時リダイレクトして保存してください。


### config 取得（一括）

```
% cat routerfile
192.168.1.254,admin
192.168.1.253,admin
192.168.1.252,admin
% ./rtx-config -f routerfile -o config
```

routerfile には、hostname,adminpassword で1行となる形でルータを列挙しておきます。
上記のコマンドを実行すると config フォルダの中に、ファイル名が hostname で config が出力されます。

### config 差分

```
% ./rtx-config -d -H <hostname> -p <admin password> -f 192.168.1.254
```

ファイル 192.168.1.254 と、hostname の config の差分を出力します。
出力は diff -u で得られた内容を標準出力へ出力します。

### config 保存

* ちょっと危険 * 

```
% ./rtx-config -s -H <hostname> -p <admin password> -f 192.168.1.254
```

ファイル 192.168.1.254 を hostnmae に反映させます。
処理は

 1. clear configuration を実行
 2. config ファイルを流し込み
 3. save 

という形を取っています。
tftp で流し込む為、config の正当性はチェックされません。
また、反映されていないものもある可能性があるので、保存後は diff を取って反映状況を確認する必要があります。

## バグ報告など

Github のほうへどうぞ。または yuuitiro@vcnet.toyama.toyama.jp まで。
phonyでテスト用データを超絶簡単に作る

メールアドレスとかユーザ名などの**テストデータってある程度の量をまとめて作るのってめんどくさくない**ですか？ 

そんな、悩みを一発で解消してくれる`phony`というツールを紹介します。

:octocat: **phony**
https://github.com/yields/phony

# phonyとは？
偽のデータをランダムにジェネレートしてくれるシンプルなコマンドラインツールです。

goで実装されています。

早速インストールしてみましょう。goが入っていれば簡単です。

```bash
$ go get github.com/yields/phony
```

goが入っていない場合は、以下リンクを参照にgoをインストールしていただければと思います。OSXならbrew経由でgoをインストールするのもいいですね。
https://golang.org/doc/install


この記事を書いた時のバージョンは、0.0.1になります。

```bash
$ phony --version
0.0.1
```

# 使い方
使い方は**とてもシンプル**です。標準入力からテンプレートを渡してあげれば、ランダムな偽のデータを作ってくれます。

やってみましょう。

## 基本形
まずは、3件のidを作成する例です。

```bash
$ echo '{{id}}' | phony --max 3
Ddyb9TepDG
lSHThIutNv
OObnmmV6qZ
```
テンプレートは`{{string}}`の形で標準入力に渡してやります。また、指定した件数を作成するためには、`max`オプションで指定できます。**`max`オプションの初期値は`-1`なので、指定しないとひたすら作成しつづけてしまう**ので注意が必要です。

## ジェネレートする間隔を指定する
データを作成する際の間隔は、`tick`オプションで指定することができます。初期値は`10ms`です。

以下は、メールアドレスを1秒間隔で作成する例になります。

```bash
$ echo '{{email}}' | phony --tick 1s --max 3
ehsandiary@test.me
roybarberuk@test.name
bublienko@test.com
```
## テンプレートを複数記述する
テンプレートは複数記述して渡すことができます。

アバターとHTTPメソッドの組み合わせてデータを作成する例になります。ちなみに、このアバターの画像はs3から取得することができました。画像を用意しなくていいのは助かりますね。

```bash
$ echo '{{avatar}} {{http.method}}' | phony --max 3
https://s3.amazonaws.com/uifaces/faces/twitter/exentrich/128.jpg OPTION
https://s3.amazonaws.com/uifaces/faces/twitter/hugomano/128.jpg PUT
https://s3.amazonaws.com/uifaces/faces/twitter/ManikRathee/128.jpg GET
```

同じテンプレートを複数回していしても、ちゃんとランダムに作成されます。

```bash
$ echo '"{{ipv4}}" "{{ipv4}}"' | phony --max 3
"113.125.155.19" "172.64.46.97"
"215.210.112.143" "24.25.239.233"
"16.23.233.217" "212.118.191.44"
```


## 作成したデータを、データストアに突っ込む
READMEのExamplesが一番わかりやすいので、そのまま転載します。

MongoDBや、Redisにcli経由でデータをインサートする例になります。ストレージに負荷がかけられない場合は、`tick`オプションを合わせて使うといいと思います。

```bash
# add users to MongoDB.
echo "'db.users.insert({ name: \"{{name}}\" })'" \
  | phony \
  | xargs -L1 -n1 mongo --eval

# add users to Redis.
echo "set {{username}} {{avatar}}" \
  | phony \
  | xargs -L1 -n3 redis-cli
```

# ジェネレートされるデータについて
## どんなデータが作れるの？
ジェネレートできるテンプレートの一覧は `list` オプションで確認できます。
email、name、username辺りは利用頻度が高そう。

```bash
$ phony --list

  avatar
  color
  country
  country.code
  domain
  domain.name
  domain.tld
  double
  email
  event.action
  http.method
  id
  ipv4
  ipv6
  latitude
  longitude
  mac.address
  name
  name.first
  name.last
  product.category
  product.name
  state
  state.code
  timezone
  unixtime
  username
```

## ジェネレートするデータって変更できる？
ジェネレートするデータの元は、`gens.go`および`dict.go`に記述されています。
なのでここらへんをゴニョゴニョしてbuildしなおせば容易に変更できると思います。

詳しくは実装を確認していただくのが、手っ取り早いと思います。
https://github.com/yields/phony/blob/master/pkg/phony/gens.go
https://github.com/yields/phony/blob/master/pkg/phony/dict.go

# まとめ

すごいシンプルなのに、応用が抜群にきくツールだと思いました。

テストデータって仕込みが以外にめんどくさかったりするので、こういうツールでサクっと作れるとかっこいいと思います :laughing:
RaspberryPiをUSBメモリからブートする

RaspberryPiをUSBメモリからブートするとSDカードはいらないのでは？と思っていましたが、実際には``/boot``としてSDカードは必須でした。


# USBへのRaspbianのインストール

とりあえず、普通にRaspbianをインストールしたSDカードを作成します。

```shell-session
$ sudo dd if=./2016-03-18-raspbian-jessie.img of=/dev/sdb   # sdbはSDカード
```

で、その後、USBメモリに/dev/sdb2をインストール？します。

```shell-session
$ sudo dd if=/dev/sdb2 of=/dev/sdc1    # sdcはUSBメモリ
```

その後、

```shell-session
$ sudo e2fsck -f /dev/sdc1
$ sudo resize2fs /dev/sdc1
```

のような感じで、ファイルシステムのエラーチェックをして、ddコマンドでよくわからなくなったパーティションサイズを全領域使えるようします。


# USBブート設定

``/boot/cmdline.txt``の``root``の値をSDカードのルートファイルシステムからUSBメモリのルートファイルシステムに切り替えます。

```bash:編集前
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
```

```bash:編集後
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/sda1 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
```
　

不要かもしれませんが、``/etc/fstab``も編集しておきます。``/``に設定するデバイスを``/dev/mmcblk0p2``⇒``/dev/sda1``に変えるだけです。

```bash:/etc/fstab
/etc/fstab
proc            /proc           proc    defaults          0       0
/dev/mmcblk0p1  /boot           vfat    defaults          0       2
#/dev/mmcblk0p2  /               ext4    defaults,noatime  0       1
/dev/sda1       /               ext4    defaults,noatime  0       1
```

一応、これでUSBメモリから起動できるはずです。



# どうでもいい情報

- bootパーティションがLite版のRaspbianだったせいか、USBメモリから通常版を起動した時、キーボートとマウスが使えませんでした。。。orz
- hdparmでアクセス速度を測定してみた感じでは、

```
SDカード：20.41 MB/sec
USBメモリ：32.55 MB/sec
```

だったので、ルートファイルシステムをUSBメモリに取り換えると1.5倍くらいの速さが期待できそうです。
（一応、テストに使ったUSBメモリはUSB3対応で、USB3接続だと60MBぐらい出せる子です。）
GebでIDEでの補完を効かせる

Gebで補完効かなくて苦しんでる人が観測範囲で結構多いので、GebでIDEの力を借りる方法書きます。
Gebのバージョンは0.13.1で試しています。

やり方は二つで

* 省略を使わない
* IntelliJ IDEA使う

です。

# 省略を使わない
GebはGroovyの機能を使って記述を省略し、完結にすることがウリの一つです

```groovy:省略する.groovy
def "ログインして新着情報を確認する"() {
    when: 'サンプルページの表示'
    to SignInPage
    at SignInPage

    and: 'ユーザー名とパスワードを入力して'
    signIn "SAMPLE_USER", "SAMPLE_PASSWORD"
    
    // 略
}
```

ただ、上記のように書くとIDEでの補完はほぼ効きません。
というわけで、記述を省略せず、シンタックスを明示してあげると補完が効くようになります。

```groovy:明示する.groovy
def "ログインして新着情報を確認する"() {
    when: 'サンプルページの表示'
    SignInPage signInPage = browser.to SignInPage // 左辺の型と変数名を明示。右辺のbrowserも明示。
    browser.at SignInPage // browserを明示

    and: 'ユーザー名とパスワードを入力して'
    MainPage mainPage = signIn.signIn "SAMPLE_USER", "SAMPLE_PASSWORD" // ページオブジェクトの型を明示
    
    // 略
}
```

上記のように書くと、明示した型については補完が効くようになります。
簡潔さを取るか、IDEの補完を取るか、というトレードオフになりますが、それは実際に携わる人やチームの状況などで決めればよいかな、と思います。

# IntelliJ IDEAつかう
IntellJ IDEAはもう少し空気読んでくれます。

* `browser`に定義されている、`to` と `at`の後のページオブジェクトの補完ができる（`GebSpec`を継承しているものに限る）
* `Page`や`Module`内で、どうファイル内に定義されているコンテンツをメソッドなどで呼び出すときに補完が効く

です。

[GebのTwitterアカウント](https://twitter.com/gebframework)が、なぜこれができるのか、というのに言及していました。

<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">So this is why InjtelliJ understands Geb&#39;s content definition blocks: <a href="https://t.co/4Te49UvE52">https://t.co/4Te49UvE52</a></p>&mdash; Geb (@GebFramework) <a href="https://twitter.com/GebFramework/status/686217303877402624">January 10, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

ツイート内のリンク先はIDEAのプラグインのソースコードです。興味がある人は覗いてみてもいいかも。

# 参考資料
## 公式ドキュメント
* http://www.gebish.org/manual/current/#ide-support

## スライド
* http://www.slideshare.net/hirokotamagawa/20141018-2selenium-40423299
* http://www.slideshare.net/youtaroutakahashi/what-makes-geb-groovy
【Mac入門】私が使うMacの便利アプリと便利設定

#Macを素早くカッコよく操作するためのカスタマイズ
注意：この記事はプロのエンジニア向けではありません


##基本操作編
###Command + Space
スポットライト検索です。
すべてのファイルに高速にアクセスする事が可能なので是非利用しましょう。
主に直前に使ってたあのファイル・・・となった時に便利

##システム環境設定
###Command+Spaceを押して　　sysと入力してエンターで起動
ここでMacの設定をいろいろいじれます

###トラックパッド設定
ポイントとクリックというタブにある
「タップでクリック」をONにしましょう、なれると便利です。

###MacBookPro限定　ディスプレイ設定
実は解像度＝作業領域広げられます。

ディスプレイのタブの解像度というところのラジオボタンの変更を選択しましょう。

一番右にする事で作業領域が増えて、同時に複数のアプリケーションを開いた際に作業が楽になります。


##超重要　3本指でドラッグ設定
システム環境設定の右下にある青い人マークの書かれているアクセシビリティを開きましょう

左にディスプレイ、ズーム機能、ボイスオーバーとかいろいろ出てる中の下の方にある
マウスとトラックパッドを選択

そこのトラックパッドオプションを押してドラッグを有効にするにチェックを入れましょう。

そして右の選択ボックスから3本指のドラッグを選択！

これでウィンドウを3本指でドラッグできるようになります、超必須級の便利機能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/5744ae22-7985-9caa-b5ea-af21991b83d2.png)



#ClipMenuで快適コピペ生活
Command+CやXでコピーした内容をずっと保存しておいてくれたり、
特定のキーワードを保存しておいて好きな時に貼り付けられたりといった

超便利機能を持っているクリップメニューはオススメアプリです
http://www.clipmenu.com/ja/


# さらに快適なコピペ生活を求める人へ Paiste
有料ですが最高です

コピペ履歴を検索できる上にプレビューがめちゃくちゃみやすいです。
これは必須アプリですね

https://apps.apple.com/jp/app/paste-clipboard-manager/id967805235


あの複雑なコマンドなんだっけって時も、複数文字タイプすれば呼び出せます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69647/3430fc90-67f9-6a89-7877-f75eee167f54.png)





#BetterTouchToolで超絶操作
必須です、入れてない人はまだ mac を使いこなしていません（笑

https://www.boastr.net/

WindowsのWin+→ボタンでウィンドウを右半分に寄せる機能とか欲しいと思いますよね！

このソフトを入れる事で実現できます、その他にもいろんな機能がついてたったの三百円！

買いましょう、是非買いましょう。

http://bamka.info/bbt-trackpad
http://koejima.com/archives/540/

解説は他サイトにお任せします。


よし、伝えたい事は伝えた。以上。



#番外編私の設定
Command+M メモ帳の起動
Command+K Keynoteの起動
Command+L　Lineの起動
Command+. ターミナルの起動
Command+/　SubLimeTextの起動
Command+_ GoogleChromeの起動

トラックパッドの左上をクリック：ファインダーの起動
トラックパッドの右上をクリック：メールの起動
トラックパッドの右下をクリック：デスクトップの表示

Option+ →　ウィンドウを右半分のサイズにする
Option+ ←　ウィンドウを左半分のサイズにする
Option+ ↑　ウィンドウを最大化する

2本指でタップ：現在選択しているテキストをGoogleで検索する
2本指で押し込む：現在選択しているテキストをQiitaで検索する
session_cache_limiter指定でフォーム入力データを保持する

## 本題
[前回](http://qiita.com/hibikikudo/items/937d451bb6570a55a47c)はフォームにこんな感じの

```html:form_confirm.php
<button type="button" onclick="history.back()">
```
戻るボタンを作った話を書きました。

こういった入力フォームは通常【入力画面】→【確認画面】→【サンキュー画面】と3段階で遷移します。が、確認画面から何かを修正するために入力画面に戻る時に、一部のスマホブラウザなどでフォームの入力内容が消えてしまうことがあるようです。
 参照:
1. [iOS の Chrome で history.back() すると入力されていたフォームのデータが消える](http://www.poky.org/2015/08/post-281/) 
2. [webフォームでAndroid端末の「Back」ボタンを使用した時に入力した内容が消えている](https://teratail.com/questions/5137) 
今回はこれを防ぐために、PHPでキャッシュ保持させる方法を採用しました。
なおキャッシュコントロールではなく、戻るボタン押下時にもPOSTする方法もあるようですが少々面倒くさそう（主観）。

```html:form_confirm.php
<button type="button" onclick="history.back()">
```

```php:form.php
<?php
session_cache_limiter('public');
session_start();
?>
```
session_startの前にsession_cache_limiterで、onclick="history.back()"で戻った際にキャッシュを保持する指定を行います。
なお、この方法については[こちらの投稿](http://qiita.com/mgng/items/ae3c4c07f920a5e6e2ed)がより詳しいです。
今回の場合は、上記の書き方で無事にさまざまなスマホのブラウザでもキャッシュが残るように出来ました。
## 次回予告
では次回予告という名のblog三日坊主自戒予告を...
次回もフォーム周り。autocomplete属性に着いて書こうと思います。
というかこの記事全体が次回の枕みたいな感じです。
短い記事執筆を継続します。
クエリパラメータ付きのURLをmod_rewriteでリダイレクトさせる

/fuga/?id=xxxxxx
みたいなURLを
/fuga/xxxxxx/
こうしたいみたいな話、よくあります。
さっそくmod_rewriteのRewriteRule使って飛ばしてみます。

## 早速のRewriteRule
```
RewriteEngine on
RewriteRule ^fuga/?id=(.+) /fuga/$1/ [L,R=301]
```

これで試してみましたが、うまくリダイレクトされません。
ちなみにたまたまやりたきことが「L,R=301」だったのでそのまま書いてます。

## クエリパラメータの拾い方
どうやらRewriteRuleで検証する値にクエリパラメータは含まれないようです。
ということでRewriteCondを用いた方法を考えてみます。

```
RewriteEngine on
RewriteCond %{QUERY_STRING} id=(.+)
RewriteRule ^fuga/ /fuga/%1/ [L,R=301]
```

他にクエリパラメータがあった場合とかは一旦考えてません。
後方参照に関しては、RewriteRule内のものであれば「$」で取れましたが、RewriteCondのものは「%」になるので
その点は注意が必要ですね。

## クエリパラメータのままで置換したい場合
たとえばid=1234だったらid=5678にしたいようなケース。
同じように設定すれば対応可能です。

```
RewriteEngine on
RewriteCond %{QUERY_STRING} id=1234
RewriteRule ^fuga/ /fuga/?id=5678 [L,R=301]
```
idの値まできちんと指定すれば問題なくリダイレクト可能です。

RewriteRule使う上ではきっと初歩的なところだと思うのですが
一瞬「あれ？」となったので備忘録的にメモっておきます。
webpay 連携で困ってた件

## webpay, Django, Angularjs 連携で困ってた件

## checkouthelperボタンが二回目以降表示されない
 - SPAの場合毎回webpayのscriptを読み込まない現象で二回目以降はボタンが表示されなくなった 
 - 解決方法　以下のコードを追加

```
$scope.init = function() {
    window.WebPay = void(0);
    window.WebPayCheckoutHelper = void(0);
}
```

## webpayのpublic keyとsecret keyの違い
 - 二つのkeyの違いがずっと探せなかった。
 - publick_key : templete側にcheckouthelperボタンを表示するためのkey
 - secret_key : 取得したcustomer_idかtokenで決済を行う際にサーバー側でrequestパラメーターとして渡すkey(見せちゃいけない)

## 本番環境とローカル環境でのwebpay keyの切り分け処理
 - 以下をサーバー側で判断してkeyを設定したい
  - 本番だと"data-key="live_public_234u32942342..."
  - ローカル環境だと"data-key="test_public_jfi443of34f..."
  
以下の様にするとできると思ったが、ハードコディングは行けたが、サーバー処理が走るとscript処理が先に実行されkeyがないままエラーなる

```
  <script class="webpay-button"
          data-key="[[form_data.webpay_key]]"
          data-lang="ja"
          data-partial="true"
          data-text="カード情報を入力する"
          data-submit-text="カード情報入力完了"
          src="https://checkout.webpay.jp/v3/"</script>
```

 解決方法としてはサーバーでkeyを取得する前にdata-key="[[form_data.webpay_key]]"を設定をしとく
 
 
 ## その他
  - webpayはSPAにはあんまり向いてないかな。

 以上、webpay 連携で困ってた件です。
【nginx】バージョンアップ方法

nginxのバージョンアップ。
今のバージョンファイルを上書きすることなくシンボリックリンクで向き先を変えるやり方。

### 現在のバージョンチェック

```
# /usr/local/nginx/sbin/nginx -v
　nginx version: nginx/1.5.8
```

### ソースダウンロード解凍

```
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.9.14.tar.gz  
# tar xvf nginx-1.9.14.tar.gz
# cd nginx-1.9.14
```

### インストール
```
# ./configure --prefix=/usr/local/nginx-1.9.14 \
  --user=nginx \
  --group=nginx \
  --with-http_ssl_module \
  --with-http_realip_module \
  --with-http_addition_module \
  --with-http_xslt_module \
  --with-http_sub_module \
  --with-http_dav_module \
  --with-http_flv_module \
  --with-http_gzip_static_module \
  --with-http_random_index_module \
  --with-http_secure_link_module \
  --with-http_stub_status_module \
  --add-module=/usr/local/src/headers-more-nginx-module
# make && make install
```

### 設定ファイルコピー

```
# cp /usr/local/nginx/conf/nginx.conf /usr/local/nginx-1.9.14/conf/nginx.conf
# cp /usr/local/nginx/conf/certs.pem /usr/local/nginx-1.9.14/conf/certs.pem
# cp /usr/local/nginx/conf/ssl-oisix.key /usr/local/nginx-1.9.14/conf/ssl-oisix.key
# cp -r /usr/local/nginx/conf/virtualhost /usr/local/nginx-1.9.14/conf/
# chown -R nginx. /usr/local/nginx-1.9.14
```

### シンボリックリンクで切り替え
```
# ln -nfs /usr/local/nginx-1.9.14 /usr/local/nginx
```

### 設定ファイルのシンタックスチェック
```
# /usr/local/nginx/sbin/nginx -t
　syntax is okを確認
```

### リクエストを落とさずにプロセスを切り替える

```
# ps aux |grep nginx
masterのプロセスIDを確認
# kill -USR2 5559
# kill -WINCH  5559
# kill -QUIT  5559
# /usr/local/nginx/sbin/nginx -s reload
```
Ubuntu 16.04 LTS のランチャーを横に寝かせる

ずっと気になってた左側に配置されているランチャー。
Ubuntu 16.04 LTS から、これを下側に配置できるようになりました。

ところが、設定メニューにはこれが見つかりません。
調べてみたところ、ユーティリティツールをインストールしたうえで変更するもののようでした。
https://www.linuxbabe.com/desktop-linux/move-unity-launcher-bottom-screen-ubuntu-16-04

# 環境

- VirtualBox 4.3
- Ubuntu Desktop 16.04 LTS

# 手順
はじめにターミナルを開きます。
`端末` というやつですね。

<img width="717" alt="スクリーンショット 2016-04-22 18.11.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/cd9f34ba-9d58-ac57-2ccf-24ba0a5a8434.png">

次に、`dconf-editor` というユーティリティソフトをインストールします。

```
$ sudo apt install dconf-editor
```

インストールが完了したら、`dconf-editor` を開きます。

<img width="741" alt="スクリーンショット 2016-04-22 18.12.23.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/2b2d02fa-1aec-14da-df4d-3e4cd9f5018e.png">

[com] > [canonical] > [unity] > [launcher] と、たどっていき、
[launcher-position] を "Bottom" に変更します。

<img width="808" alt="スクリーンショット 2016-04-22 18.14.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/a1bfb34a-dcb5-9233-89d0-0eaaeb0008de.png">

ランチャーが下にひっつきましたね！

![スクリーンショット 2016-04-22 18.15.10.png](https://qiita-image-store.s3.amazonaws.com/0/47993/04546b62-b921-0dc7-ab8c-f5f2adf0078d.png)

# おまけ

［コンピューターを検索］ の全画面解除もできるようになっていたので、これもやっておきます。
なお、［コンピューターを検索］ は、ランチャーの一番先頭にある、
Ubuntu マークのアイコンをクリックしたときに表示される機能のことです。

矢印で指した □ をクリックすることで、全画面状態を解除できます。

<img width="332" alt="スクリーンショット 2016-04-22 18.16.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/0fb59299-f60c-0c86-766f-a7ff604ae31f.png">

全画面状態を解除すると、まるで Windows のスタートメニューのようになる。

<img width="997" alt="スクリーンショット 2016-04-22 18.18.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/47993/1464d733-9520-e2ab-6686-42e445781b69.png">

キャプチャはディスプレイの解像度が低いので、あまり便利になったようには見えないのですが、
ディスプレイの解像度が高いと、デスクトップがもっと良く見えるようになるので、
背景でどんな作業をしていたかが見えて、すこしだけ便利になります。