OmniAICreator/Qiita-1.07M huggingface dataset:
javascriptでブラウザにcookieをset、getする書き方

誰もが知っていることですが、備忘録として残します。

## 仕様

- cookie setのボタンを押すとブラウザにcookieがsetされる
- cookie getのボタンを押すとcookieの値がconsole.logに表示される

## HTML

``` html:sample.html
<button class="set">cookie set</button>
<button class="get">cookie get</button>
```

## javascript(jQuery)

``` javascript:sample.js
$(function() {
  $('.set').on('click', function() {
    document.cookie = 'cookieName=hogehoge';
  });

  $('.get').on('click', function() {
    console.log(GetCookie('cookieName'));
  });

  function GetCookie( name ) {
    var result = null;
    var cookieName = name + '=';
    var allcookies = document.cookie;
    var position = allcookies.indexOf( cookieName );
    if( position != -1 ) {
      var startIndex = position + cookieName.length;
      var endIndex = allcookies.indexOf( ';', startIndex );
      if( endIndex == -1 ) {
        endIndex = allcookies.length;
      }
      result = decodeURIComponent(allcookies.substring( startIndex, endIndex ));
    }
    return result;
  }
});
```

### 参考サイト

- [クッキーの使用方法](http://so-zou.jp/web-app/tech/programming/javascript/cookie/#no6)
Rajawaliで簡単な3Dシーンを作ってみる

Android向けOpenGL 3Dライブラリ[Rajawali](https://github.com/Rajawali/Rajawali)を使って、最小限のシーンをセットアップしてみました。
まず、`app/build.gradle`にRajawaliを追加します。

```groovy:build.gradle
dependencies {
    compile 'org.rajawali3d:rajawali:1.1.970'
}
```

MainActivityを以下のように書き換えます。

```java:MainActivity.java
import android.app.Activity;
import android.os.Bundle;

import org.rajawali3d.view.SurfaceView; // これ重要！！ android.view.SurfaceView ではない！！

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        SurfaceView surfaceView = new SurfaceView(this);
        surfaceView.setSurfaceRenderer(new MyRenderer(this)); // setRenderer() ではなく setSurfaceRenderer()
        setContentView(surfaceView);
    }
}
```

MyRendererクラスも作成します。

```java:MyRenderer.java
import android.content.Context;
import android.graphics.Color;
import android.view.MotionEvent;

import org.rajawali3d.Object3D;
import org.rajawali3d.materials.Material;
import org.rajawali3d.primitives.Sphere;
import org.rajawali3d.renderer.Renderer;
import org.rajawali3d.scene.Scene;

class MyRenderer extends Renderer {

    MyRenderer(Context context) {
        super(context);
    }

    @Override
    protected void initScene() {

        Scene scene = getCurrentScene();

        // 球を作る
        Object3D obj = new Sphere(1, 16, 16); // 半径1の球。16,16は頂点の分割数で、数を大きくするほど球に近づく。
        obj.setPosition(0, 0, -5);            // 視点は0,0,0で0,0,-1の方向を向いている。0,0,-5は画面の奥の方になる
        scene.addChild(obj);

        // 球の見た目を定義する
        Material material = new Material();
        material.setColor(Color.CYAN);
        obj.setMaterial(material);
    }

    @Override
    public void onOffsetsChanged(float xOffset, float yOffset, float xOffsetStep, float yOffsetStep, int xPixelOffset, int yPixelOffset) {
    }

    @Override
    public void onTouchEvent(MotionEvent event) {
    }
}
```

## 実行結果

![device-2017-08-09-134413.png](https://qiita-image-store.s3.amazonaws.com/0/56668/22fbec1d-1805-ec47-9493-a05dcc848e05.png)

球が見えます！よくわかんないけど！
Facebook Messenger Platformを公式サンプルではじめる方法

facebookのドキュメントに記載されている[クイックスタート](https://developers.facebook.com/docs/messenger-platform/guides/quick-start)を使ってMessenger Botを作ります。

## 用意すべきもの
Node.jsが動くサーバー(herokuなど, SSLに対応できることが必須)
facebookアカウント

## 手順
アクセストークンの取得順序などが前後してる場合があります. 適当に進めてみてください. 

1. Facebookページを作る.
2. [Facebook Developers](https://developers.facebook.com)に登録. 適当にアプリを作る.
3. アプリにMessengerを追加. 
4. [GitHub](https://github.com/fbsamples/messenger-platform-samples)からサンプルをダウンロード
5. `default.json`の全ての項目を埋める. (`validationToken`は適当に決める)
6. `index.html`の`appId`などを埋める.
7. サーバーにデプロイ
8. アプリのダッシュボードに戻り`webhook`を設定. URLは`サーバーのURL + /webhook`となる. `Validation token`は手順5で`default.json`に書いた値. webhookのイベントは`messages`にチェックをいれておく. `messages`をチェックするとBotがメッセージを受信したときにイベントが発火する. (参考: https://developers.facebook.com/docs/messenger-platform/webhook-reference)
9. `トークン生成`から対象のFacebookページを選ぶ.

## テスト
Messengerアプリ or FacebookサイトからFacebookページを検索し, メッセージを送る. `gif`,`image`, `file`, `generic`などを送ると動作の様子が分かる.
github releaseを使って猫の線画を着色するモデルの配布を始めた

# 概要

[以前書いた記事](http://qiita.com/knok/items/4cfa2f9ca06b57cb233b)で学習に使ったデータセットと訓練済みモデルの配布を、githubのリリース機能を使って配布しました。

## URL

* [Release Publish pretrained model and dataset](https://github.com/knok/pix2pix-tensorflow/releases/tag/v1.0)
* https://github.com/knok/pix2pix-tensorflow/releases/tag/v1.0

## 使い方

TensorFlow実装を使います。

* https://github.com/knok/pix2pix-tensorflow

### 自分で訓練をする

* [データセット](https://github.com/knok/pix2pix-tensorflow/releases/download/v1.0/edge2cats-dataset.tar.gz)をダウンロード、展開する
* 以下を実行し訓練を行う

```shell-session
$ python pix2pix.py --mode train --input_dir ./joined \
 --which_direction AtoB --output_dir trained-model --max_epochs 500
```
* 出来上がったモデルをexportする

```shell-session
$ python pix2pix.py --mode export  \
 --checkpoint trained-model \
 --output_dir ../models/edges2cats_AtoB
```
* 事前訓練モデルを使う場合、[export-cats-model.tar.gz](https://github.com/knok/pix2pix-tensorflow/releases/download/v1.0/export-cats-model.tar.gz)を取得、展開してください

### 描画デモページを起動する

* 以下の手順でサーバーを起動します

```shell-session
$ cd server
$ python serve.py --local_models_dir ../../export-cats
loading model edges2cats_AtoB
listening on :8000
```
* export-catsディレクトリ以下にはedges2cats_AtoBディレクトリがあり、その中に訓練済みモデルがあるものとします
* http://localhost:8000/ 等にブラウザでアクセスしてください

## 参考

* [GitHubのリリース機能を使う - Qiita](http://qiita.com/todogzm/items/db9f5f2cedf976379f84)
  * githubリリースを使うとCDNで配布してくれる点がありがたいです
"Could not find url for MSVC version = 1700 and Python version = 2.7."の対処法

Caffe for Windowsのビルド時に以下のエラーが発生してハマったのでメモ。

# エラー内容

```
The specified configuration type is missing. The tools for the configuration might not be installed.
CMake Error at cmake/WindowsDownloadPrebuiltDependencies.cmake:40 (message):
  Could not find url for MSVC version = 1700 and Python version = 2.7.
Call Stack (most recent call first):
  CMakeLists.txt:77 (include)

-- Configuring incomplete, errors occurred!
ERROR: Configure failed
```

# 対処法

Caffe（あるいはCMake）はVS2012でのビルドには対応してないそうです。

なので、VS2013かVS2015（あるいはそれ以降のバージョン）をインストールしましょう…
Todoistとslackの連携でタスク管理を便利に

##手順
1.[ここでslackとtodoistを連携](https://todoist.com/slack/begin)
2.slackで下のような書き方でタスクを振る

Todoistの文法
TodoistとSlack連携の文法は以下の通り。

```
「/Todoist」・・・Todoistへの入力を開始
「@」・・・ラベル
「#」・・・プロジェクト
```
例:`/Todoist 商店街でケーキを受け取る #日常 午後6時 @用事 @緊急`

3.以上

##便利だから是非使おう
Pythonでcsv



# Pythonでcsvファイルからデータを読み込む
(python3)

```
import csv
csvfile = open("filename", 'rt')
contents = csv.reader(csvfile, delimeter=',')
    #delimiterの値を区切り文字として、読み込む。
for row in contents:
    """
    contentsをそのまま出力してもファイルの中身が
    出力されるわけではないので、各行を取り出している。
    """
    print(row)
```

例えば、

filenameの中身が

```
,A,B,C,D,E
1,234,513,25345,5243,52
2,513,52345,523452,5234,45
3,31,5432,54,63,63
```

だとすると、
以下のようにコードを書けば、

```
import csv
import numpy as np
csvfile = open("filename", 'rt')
contents = csv.reader(csvfile, delimiter=',')
array = np.array( [ row for row in contents ] )
array = array[1:, 1:]
print(array)
```

次のような出力結果が得られる。

```
[['234' '513' '25345' '5243' '52']
 ['513' '52345' '523452' '5234' '45']
 ['31' '5432' '54' '63' '63']]
```
Apache Shiro Quickstart

10 Minute Tutorial on Apache Shiroをやってみて、いまいち便利さが伝わらなかったので補足します。
https://shiro.apache.org/10-minute-tutorial.html

Downloadページから最新の“Source Code Distribution”をダウンロードする。このサンプルでは、1.3.2 release distributionを使用。
https://shiro.apache.org/download.html#latestSource

ソースパッケージをUnzip.

    $ unzip shiro-root-1.3.2-source-release.zip

webディレクトリに移動。

    $ cd shiro-root-1.3.2/samples/web

Jettyを実行。

    $ mvn jetty:run

WEBブラウザで以下のURLを参照してください。これは便利そうだと実感できるはず！
http://localhost:9080/
Caffe for Windowsのインストール時に"mspdb110.dllがありません"というエラーが出た時の対処法

コマンドプロンプト上でビルドしようとしているときに発生するらしいです。

# 環境

- VS2012
- Windows7

# 対処法

VC++コンパイラを使ってビルドする際に必要な環境変数の設定が必要となります。

方法としては以下の2つがあります。

1. VS開発者コマンドプロンプトを使う
2. `vcvars32.bat`を実行する

## 1. VS開発者コマンドプロンプトを使う

必要な環境変数の設定が済んだ状態で起動するので、これが一番簡単です。

スタートメニュー
→すべてのプログラム
→Microsoft Visual Studio 2012
→Visual Studio Tools
→VS2012の開発者コマンド プロンプト

## 2. `vcvars32.bat`を実行する

`C:\Users\Program Files(x86)\Microsoft Visual Studio 11.0\VC\bin\vcvars32.bat`を実行すると、必要な環境変数の設定が自動的に行われます。

# 参考文献

- https://stackoverflow.com/questions/28180610/visual-c-2012-missing-mspdb110-dll
Cognos に登録されたユーザーのみログイン可能とする

##概要
Cognosに登録されたユーザーのみログイン可能にして欲しいという要件がある事は多いです。
Cognosに登録されたユーザーとは、Cognosネームスペースにある、グループとか役割に所属しているユーザーという事です。
この画面で、いずれかのグループ・役割に所属していないユーザーは、そもそもCognosにアクセスできないようにします。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/9f1f56ea-f278-ba65-de4a-0e231a056dd2.png)

Cognosに接続されているLDAPのユーザーは、誰でもCognosにとりあえずログインできてしまうというのは困る、という話です。




##方法
知ってるか知らないかだけなので、設定は非常に簡単です。
Cognos Configurationの「認証」にある、「組み込みネームスペースのメンバーのみアクセスを限定する」を「有効」にして、Cognosを再起動してください。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/07440252-603d-4753-68b2-8853ce100302.png)

これでCognosネームスペースのグループ・役割に登録されていないユーザーは、そもそもCognosにログインできなくなります。

簡単ですが、そんな機能もあるという事だけでも覚えておいて頂ければと。
lower_case_table_namesでハマった

# Table 'xxx.xxxxx' doesn't exist

そんな馬鹿な…
Auroraを使っていてバッチを走らせたら出てきたエラー

## 原因

ここに詳しい説明がある

* [MySQL の lower_case_table_names について，テーブル名とデータベース名の中の大文字小文字について](http://moznion.hatenadiary.com/entry/2015/04/13/005641)

>MySQL には lower_case_table_names という変数があって，これはテーブル名の大文字小文字を区別するかどうかというのを設定するパラメータなわけですが，その詳細は以下のようになっています (参照: MySQL :: MySQL 5.6 Reference Manual :: 9.2.2 Identifier Case Sensitivity)．

これが 0 になっていたので、もともと大文字を無視して小文字に変換していたクエリがコケてた。

## AWS RDSのパラメーターグループ

このへんにドキュメントがある

* [AWS Documentation » Amazon Relational Database Service (RDS) » ユーザーガイド » Amazon RDS での Aurora » DB クラスターパラメータと DB インスタンスパラメータ](http://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Aurora.Appendix.ParameterGroups.html)

パラメーターグループが外れていたので、適用しなおしてインスタンスを再起動したら動くようになった。
SQL Serverでテーブルを差分更新する


更新型のテーブル（例えば、各種マスタやユーザ情報を保存してあるテーブル)を分析用のデータベースに保存する場合、多くはテーブルを作り直したり、データを丸ごと入れ直したりすることで最新の状態を保つが、テーブルのサイズが極端に大きく、かつ設定された更新頻度での差分がそんなにない場合は「MERGE」を使用して、存在しない行または、更新がかかった行のみ取り込むことで、差分のみ更新するほうが効率的な場合がある。

以下は基本の構文。公式ドキュメントは[こちら](https://msdn.microsoft.com/ja-jp/library/bb510625(v=sql.120).aspx)

```sql
--base_tableをもとにtarget_tableを差分更新する
MERGE INTO target_table AS a
USING (SELECT columnA,
          columnB,
          columnC from base_table) AS b 
--マッチしているかの判定条件
ON (a.columnA = b.columnA)
--マッチしている行の処理（UPDATE)
WHEN MATCHED THEN
UPDATE SET columnA = b.columnA,
    	   columnB = b.columnB,
    	   columnC = b.columnC
--マッチしていない行の処理（INSERT)
WHEN NOT MATCHED THEN
INSERT (columnA,
        columnB,
        columnC)
VALUES (b.columnA,
        b.columnB,
        b.columnC)
        
```
Caffe for Windowsのインストール時に"loading 'rules.ninja': 指定されたファイルが見つかりません。"というエラーがでる時の対処法

Caffe for Windowsをインストールしようとして、`build_win.cmd`を実行した時に以下のようなエラーが出た時の対処法。

```
ninja: error: build.ninja:30: loading 'rules.ninja': 指定されたファイルが見つかりません。
```

# 対処法

1. 自前でインストールしたCMakeとNinjaをアンインストールする
2. PATHから上記2つを取り除く
3. conda経由（Anaconda Navigator）で上記2つをインストールする

これで解決しました。

# 参考

https://github.com/BVLC/caffe/issues/5791
トラフィックフローを試してみた

# TL;DR

Amazon Route53 のトラフィックフローは、複雑なルーティングポリシーを実現するための魅力的なソリューションです。ただし、カンニングはできなさそうです（後述）。

# 目的

オンプレに２台のWebサーバがあり、それぞれ個別のグローバルIPを持っています。これら２台ともコケた場合の BCP 対策として、S3+CloudFront で構築した Sorry ページを表示するというのを Route53 を使って実現することを考えます。なお、HTTPS 対応の構成図を掲載しますが、HTTPS 自体は本質的ではないので説明は省略します。

![overview.png](https://qiita-image-store.s3.amazonaws.com/0/47305/5a2b88dc-de6c-0f8d-eae7-bff08c23c9e1.png)

本来の構成は、インターネットから見て Web サーバー群の前段にロードバランサーがあって、そいつが回線負荷を考慮してこれらのいずれか一方 の A Record を返す（ように DNS Responseを書き換える）ということをやっているらしいです。しかしながら、Route53 からは回線負荷の状況などわかるはずもないので、A Record として両方の IP をなるべく公平に返してやることにします。

# 考え方

２台のWebサーバーを合わせた１個の仮想的なサービスを現用系、Sorry ページを待機系とするフェイルオーバー構成として構築します。まず、テスト用に立てた２台のサーバ fo-test1, fo-test2 に対して、それぞれ HTTP でヘルスチェックを行います。さらに、『これらいずれかが稼働中』を表す仮想的なヘルスチェック either-ok を作りました。ちなみにヘルスチェックの価格は、AWS 以外のエンドポイントに対して１件あたり0.75$／月です。HTTPS監視とか監視間隔を短くしたいといった向きには、多少オプション価格が上乗せされます（[Amazon Route53 料金](https://aws.amazon.com/jp/route53/pricing/)）。

![health-check.png](https://qiita-image-store.s3.amazonaws.com/0/47305/733af1d2-f6b3-2e60-2c40-79a7600b58fb.png)

複数の IP アドレスを公平に返すのは、ルーティングポリシーの [Multivalue Answer で実現可能](http://qiita.com/hotta/items/c43b547f5786731278de)です。これらを組み合わせて、以下のようにすることにします。

| Case | fo-test1 | fo-test2 | either-ok | A Record |
|-----:|:-----------|:------------------|:------------------|:------------------|
| 1    | Healthy | Healthy | Healthy | fo-test1, fo-test2 |
| 2    | Healthy | Unhealthy | Healthy | fo-test1 |
| 3    | Unhealthy | Healthy | Healthy | fo-test2 |
| 4    | Unhealthy | Unhealthy | Unhealthy | xxx.cloudfront.net |

ところが、『これらいずれかが稼働中』をフェイルオーバーの現用系とするための設定方法が、どうしてもわかりませんでした。仕方がないので、最後の手段としてトラフィックフローというのを試してみました。これは、複雑なルーティングをビジュアルエディタで構成でき、ルールのバージョン管理やロールバックも自由にできるという優れものです。

なぜ最初からこれでやらなかったかというと、これがちょっとお高いからです（ポリシーあたり50$／月）。

結果的には、めちゃくちゃ簡単。２分で設定完了。

![traffic-flow.png](https://qiita-image-store.s3.amazonaws.com/0/47305/2296c749-7ffc-a821-54f3-fa0d0c5f671b.png)


# カンニング失敗

実は、トラフィックフローとかいいながら、実は単にビジュアルエディタで設定した内容を通常のリソースレコードに展開するんだろう。だからそれを書き留めて、トラフィックフローを解除してそれらのルールを手で追加すれば料金かからないはず。俺って天才じゃね？、的なことを当初考えていました。

ところが、トラフィックフローの機能としてはちゃんと動いているのに、リソースレコードの一覧には "Traffic policy record" の１件しか表示されません。どうも、トラフィックフローはリソースレコードとは完全に別管理になっており、その詳細ルールはリソースレコードとしては見えないようです。使いたかったらちゃんと金払えってことですね。

![resourece-list.png](https://qiita-image-store.s3.amazonaws.com/0/47305/aa8afd54-eb71-8980-828d-cf5ff097df0a.png)
illustratorでSVGスプライトを書き出したら表示崩れしたので、原因と解決策を書いてみた

# はじめに
まだまだSVGについてはわからないことばかりなので、検証しつつ書いてはいますがもっといい方法があるかもしれません。
「こっちの方が良いよ！」などあれば都度アップデートしていきたいと思います。

# 環境
Adobe Illustrator(R) 17.0 (Illustrator CC)

# やりたいこと条件
①IllustratorでSVGアイコンを書き出す

②各アイコンは四隅に1pxの余白を含めて、32px × 32px の大きさ
※ギリギリで作るとはみ出たり、見切れたりする可能性があるため

③すべてのアイコンを１つのアートボードで管理

# 書き出し方法
ファイル→書き出し→書き出し形式→ファイルの種類「SVG」を選択
※ほかにもあるけれど割愛

# 表示崩れが起こる書き出し方を再現
①ファイル→書き出し→書き出し形式→ファイルの種類「SVG」を選択して「書き出し」ボタンをクリック
![img05.png](https://qiita-image-store.s3.amazonaws.com/0/146113/edc37473-f60f-9fb0-3ff7-52601624e1da.png)

②設定画面が開くので、下記のとおり設定して「OK」ボタンをクリック
![img.png](https://qiita-image-store.s3.amazonaws.com/0/146113/775fcbe7-45a0-66cd-60f6-3f03c48b79ae.png)
※SVGオプションの説明については[Adobe公式サイト](https://helpx.adobe.com/jp/illustrator/using/svg.html)を確認ください。

③HTMLとCSSを用意して、下記のとおり書いてみる

```HTML
<i class="spriteIcon"></i>
```

```CSS
.spriteIcon {
    background-image: url("icon_sprite.svg");
    background-position: 0 0;
    background-repeat: no-repeat;
    background-size: 32px;
    content: "";
    display: inline-block;
    height: 32px;
    vertical-align: middle;
    width: 32px;
}
```

④ブラウザで確認すると、見事にいろいろなブラウザ・デバイスで表示崩れを起こしている。（検証しやすいのはFireFox、chrome、IE11あたり）
(1)アイコンの境界がずれて線がうっすらと見えている
![img02.png](https://qiita-image-store.s3.amazonaws.com/0/146113/1dd8bf26-ccd5-54d0-1c38-007859129306.png)

(2)スプライト画像全体が表示されている
![img03.png](https://qiita-image-store.s3.amazonaws.com/0/146113/4ca91060-95ed-25bc-5cfe-a3c00bfce700.png)

# 原因と解決策
①アイコンの境界がずれて線がうっすら見えている
原因：アートボードの余白が無視されて、オブジェクトがある範囲しか書き出されていないため
解決策：アートボードごとに書き出しをする

②スプライト画像全体が表示されている
原因：SVGオプションの「レスポンシブ」にチェックを入れてしまうと、SVGにwidthとheightが記述されないため
解決策：SVGオプションの「レスポンシブ」のチェックを外して書き出す。もしくは、SVGファイルをテキストエディタで開いて、下記のようにwidthとheightを記述する

```SVG
<svg id="hogehoge" data-name="hogehoge" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 416" width="32" height="416">
```

# 小ネタ
PCとSPで同じスプライト画像を使用する場合は、background-position・width・heightを調整すれば可能。

# まとめ
①余白も含めて書き出しをしたい場合は、下記のとおり**「アートボードごとに作成」にチェック**を入れる
![img06.png](https://qiita-image-store.s3.amazonaws.com/0/146113/59e36d50-65f5-32a0-6964-23afdec3e9f4.png)

②下記のとおり、**「縮小」のみにチェック**を入れる
![img04.png](https://qiita-image-store.s3.amazonaws.com/0/146113/c5fc18c2-ad95-e5e0-226e-cad89cb4cb67.png)

# 追記
2017/08/14
「アートボード書き出し。アイコンそれぞれがアートボード管理されていることが前提」とご指摘をいただきました。ありがとうございます！
指摘に伴って、内容を修正しました。
ActiveRecord::Relationを結合する

別々の条件で取得したActiveRecord::Relationを１つにまとめようとしたら、思いの外苦労したので備忘録。
他にいい方法があれば、ぜひコメントをお願いします！

# Rails 5.0以降ならorメソッド、それ以外は一度Arrayにして結合
別々の条件で取得したActiveRecord::Relationを１つにまとめる場合、```merge```だとAND条件になってしまい、意図とは違う結果に。

```or```というメソッドを使えばすんなり結合できるが、手元の環境はRails 4.0だったため、他の方法を模索。

```+``` で２つのActiveRecord::Relationを結合し、一度Arrayにした状態で再度ActiveRecord::Relationするという方法で実現。ちょっと回りくどいですが、ちゃんと書けば可読性もそこまで落ちないので、一旦この方法で落ち着きました。

```ruby
users = User.where(id: [1,2,3])
another_users = User.where(name: 'John Doe')

another_users.pluck(:id) #=> [4]

# combined with AND
users.merge(another_users).to_sql
#=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3) AND `users`.`name` = 'John Doe'

# combined with OR (only available in Rails 5.0~)
users.or(another_users).to_sql
#=> "SELECT `users`.* FROM `users` WHERE (`users`.`id` IN (1, 2, 3) OR `users`.`name` = 'John Doe')"

# combined with OR (through Array, available in Rails ~4.0)
User.where(id: (users + another_users).map(&:id)).to_sql
#=> SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)
```

# 参考
[Combine two ActiveRecord::Relation objects](https://stackoverflow.com/questions/9540801/combine-two-activerecordrelation-objects)
[[Ruby on Rails] 配列を ActiveRecord::Relation に変換する](http://qiita.com/wada811/items/12c74ed62c943c8c3f77)
HomebrewでQuicklookのプラグインをまとめてインストールできないとき

[Mac の QuickLook で プラグインをまとめてインストールする](http://qiita.com/exabugs/items/9a392077c492ed97950d)を見て、homebrewで一式インストールしようとしたらコケたのでメモ。

## 環境
macOS 10.12.6 (16G29)

## トラブル

```
$ brew cask install qlcolorcode qlstephen qlmarkdown quicklook-json qlprettypatch quicklook-csv betterzipql qlimagesize webpquicklook suspicious-package
```
とすると、

```
Error: Permission denied - /usr/local/Caskroom/qlcolorcode
```
となり処理が出来ない。

## 対策
https://stackoverflow.com/questions/16432071/how-to-fix-homebrew-permissions を参考にして、ディレクトリの所有権を編集した。

```
$ sudo chown -R $(whoami):admin /usr/local
$ sudo chown -R $(whoami):admin ~/Library/Caches/homebrew
```

## 結果

![Imgur](http://i.imgur.com/s7ZoENi.png)
これで解決。ε-(´∀｀*)ﾎｯ

## 参考
- [Mac の QuickLook で プラグインをまとめてインストールする](http://qiita.com/exabugs/items/9a392077c492ed97950d)
- https://stackoverflow.com/questions/16432071/how-to-fix-homebrew-permissions
- [OS Xでバージョンをコマンドラインから確認する方法](https://rcmdnk.com/blog/2016/02/15/computer-mac/)
拡張メソッドを使って自力で、Map を実装する

実は次のポストのコンセプトを理解するための、ヤクの毛刈りなのですが、拡張メソッドについて調べてみました。
拡張メソッドは、既存のメソッドや、インターフェイスに対して、後付けでメソッドを生やせる仕組みです。 Ruby とかだと、普通にクラスを書けばそうなりますが、静的言語ではどうなるでしょう？

例えば次のようなクラスがあります。

```csharp
    public class Employee
    {
        public string Name { get; set; }

        public Employee (string name)
        {
            this.Name = name;
        }
    }
```

# 拡張メソッドをつかって、メソッドを追加するように見せる

こいつに対して拡張メソッドを使って、メソッドを追加してみましょう。本体には手を入れずにです。呼び捨ては失礼なので「様」づけするメソッドを追加します。

```csharp
    static class EmployeeExtensions
    {
        public static string GetNameWithRespect(this Employee self)
        {
            return self.Name + "様";
        }
    }
```

ここで、のポイントは、static のクラスに、static のメソッドを書いて、`(this 型 変数名)` の定義をしてあげるだけになります。実際これを呼び出すためのメソッドはこんな感じ

```csharp
    class Program
    {
        static void Main(string[] args)
        {
            var emp = new Employee("三太夫");
            Console.WriteLine(emp.Name);
            Console.WriteLine(emp.GetNameWithRespect());
            Console.ReadLine();
        }
     }
```

実行結果は、

```
三太夫
三太夫様
```

　完璧！想定通り。しかし、だまされてはいけません、これは、あくまで、static メソッドが、インスタンスメソッドのように見せかけているだけなので、private にはアクセスできませんし、Mock とかするときに、拡張メソッドだったらMockできません。（Mock の回でお話ししました）　
　だから、普通は自分がメンテしているクラスだったら、ちゃんとクラスにインスタンスメソッドを書くべきだと思います。じゃあ、どんな時に良いかというと、インターフェイスに対しても同じようにかけるということらしいです。いつも超絶お世話になっている[ブログ](http://ufcpp.net/study/csharp/sp3_extension.html)によると、

```csharp
var input = new[] { 8, 9, 10, 11, 12, 13 };
var output =
    Extensions.Select(
        Extensions.Where(
            input,
            x => x > 10),
        x => x * x);
```

と、普通に呼び出したら、こうなるところを、こう書けるのがメリットとあります。

```csharp
var input = new[] { 8, 9, 10, 11, 12, 13 };

var output = input
    .Where(x => x > 10)
    .Select(x => x * x);
```

これはカッケー。もしかすると、これ使うと、自分で Map や flatMap 書けるんじゃね？

# オレオレ Map を実装する

というわけで、C# にない、Map を実装してみましょう。Ruby で大好きだったやつで、イテレーターに関数適用するメソッドです。ちなみに、C# だと、Linq を使えばできますが、そこはあえて実装してみましょう。

先ほどのメソッドに追加

```csharp
    static class EmployeeExtensions
    {
        public static string GetNameWithRespect(this Employee self)
        {
            return self.Name + "様";
        }
        public static IEnumerable<X> Map<T, X>(this IEnumerable<T> e, Func<T,X> f)
        {
            List<X> x = new List<X>();
            foreach(var element in e)
            {
                x.Add(f(element));
            }
            return x;
        }

    }
```

単純に、先ほど学んだ 拡張メソッドに対して、引数に Function を渡すようにしています。もともとの型は、どういう型にかわるかわかりませんので、型を変えています。そして、単純に関数適用して、結果を戻しています。
こんなコードをかいてみました。

```csharp
            var list = new List<int> { 1, 2, 3, 4 };
            var result = list.Map<int, int>(p => p + 1);
            foreach (var e in result)
            {
                Console.WriteLine(e);
            }
            Console.ReadLine();
```

で結果は？

```
2
3
4
5
```

おお！できてる。わしMap 実装しちゃったよ！俺カッケー度が高いテクニックですね。flatMap も同じように実装できるかも！　拡張メソッド理解できるとカッコいいですね！
Dockerコンテナ内でのpermission denied

Dockerコンテナ内で```touch```や```yum```などが使えない問題。
つまりコンテナ内のファイルがいじれない状態です。
Permission deniedと出てしまいます。

詳しくはわかりませんがSELinuxがオンになっていることが良くなかったようです。

というわけでDockerでSELinuxをオフにする方法。
/usr/lib/systemd/system/docker.serviceを編集。
以下のようにOPTIONSに追記してdockerの再起動。

```
        略
OPTIONS=--selinux-disabled
        略
```

当方環境ではこれで直りました。
ZendFramework2、MySQLで一時テーブル作成

ZendFramework2、MySQLで一時テーブルを使いたかったため、
調べてみたらできた話。

$dbAdapterをアダプターとして、

$sql ... テーブルを定義するSELECT文

$dbAdapter->query(
  'create temporary table temp_table_name ' . $sql,
  $dbAdapter::QUERY_MODE_EXECUTE);

としたらできた。

DDLを使うにはqueryメソッドの第二引数に$dbAdapter::QUERY_MODE_EXECUTEを設定しないとダメっぽい(未確認)。

おわり。
CFアプリ開発と管理#12 スタックの変更

スタックは、特定のオペレーティングシステムをサポートする、あらかじめ構築されたルート・ファイルシステム（rootfs）です。 たとえば、Linuxベースのシステムでは、ルートに/ usrおよび/ binディレクトリが必要です。 スタックは、コンパートメントで実行されているアプリケーションをサポートするビルドパックと連携して動作します。 Diegoアーキテクチャでは、セルVMは複数のスタックをサポートできます。

注：Dockerアプリケーションはスタックを使用しません。

*注意事項: この記事は、Cloud Foundry Documentaion [Changing Stacks](https://docs.cloudfoundry.org/devguide/deploy-apps/stacks.html) (last updated: October 6, 2016) からの独自の翻訳とコメントです。内容を保証するものではありません。*


## 利用可能なスタック

Linuxのcflinuxfs2スタックは、Ubuntu Trusty 14.04から派生しています。 サポートされているライブラリについては、Githubの[スタック](https://github.com/cloudfoundry/cflinuxfs2/blob/master/cflinuxfs2/cflinuxfs2_receipt)ページを参照してください。

独自のカスタムスタックを構築することもできます。 手順については、「[カスタムスタックの追加](https://docs.cloudfoundry.org/adminguide/custom-stack.html)」を参照してください。


## 新しいスタック上のアプリケーションの再開

セキュリティのため、スタックはCVE（Common Vulnerabilities and Exposures）に対処するために定期的な更新を受けます。 Appsは、Cloud Foundryの新しいリリースを通じてこれらのスタック変更を受け取ります。 しかし、あなたのアプリがrootfsで提供されているライブラリに静的にリンクしている場合は、手動で変更を取り戻す必要があるかもしれません。

アプリが静的にリンクしているライブラリを知ることは難しく、使用している言語によって異なります。 1つの例は、RubyまたはPythonバイナリを使用し、C標準ライブラリの一部にリンクするアプリケーションです。 Cライブラリに更新が必要な場合は、アプリケーションを再コンパイルして、次のように再構成する必要があります。

1. `cf stacks` コマンドを使用して、展開で使用可能なスタックを一覧表示します。

~~~
$ cf stacks
Getting stacks in org MY-ORG / space development as developer@example.com...
OK

name            description
cflinuxfs2      Cloud Foundry Linux-based filesystem
~~~

2. スタックを変更してアプリケーションをリストアするには、`cf push`コマンドを使用します。 たとえば、デフォルトのスタック`cflinuxfs2`上でアプリケーションをリストアするには、`cf push MY-APP`を実行します。

~~~
$ cf push MY-APP
Using stack cflinuxfs2...
OK
Creating app MY-APP in org MY-ORG / space development as developer@example.com...
OK
...
requested state: started
instances: 1/1
usage: 1G x 1 instances
urls: MY-APP.cfapps.io
last uploaded: Wed Apr 8 23:40:57 UTC 2015
    state    since                    cpu    memory        disk
#0  running  2015-04-08 04:41:54 PM   0.0%   57.3M of 1G   128.8M of 1G
~~~

別のスタックを指定するには、コマンドに-s STACKNAMEを追加します。

## スタックAPI
API情報については、Cloud Foundry APIドキュメントの「[Stacks](http://apidocs.cloudfoundry.org/268/)」セクションを確認してください。
Dockerで大きなサイズのイメージファイルをインポート出来ない問題

#問題#
Dockerで10GBほどのコンテナをexportしてimportしようとしたが、おそらくメモリの問題で出来なかった。
結論としては自分の場合、StrageDriverの選択に問題があったらしいです。
devicemapperだとうまくいかないらしい。
ネット上では同じような人がたまに見られたけど具体的な解決策は特に見当たらなかったので備忘録として。
（StorageDriverは```$ docker info```で確認出来ます）

###環境###
・CentOS 7
・Storage Driver: devicemapper → overlayに変更
・Docker version 1.12.6

#dockerでのStorage Driverの変更方法#
参考：https://docs.docker.com/engine/userguide/storagedriver/overlayfs-driver/#configure-docker-with-the-overlay-or-overlay2-storage-driver

`overlay`もしくは`overlay2`だと問題なく動くためそちらに変更する。

`overlay2`の方が優れているのだがlinux kernelのバージョンが4.0以上であることが条件



手順

[1] Dockerを停止

```
$sudo service docker stop
```

[2] /var/lib/dockerを一時的に退避

```
$cp -au /var/lib/docker /var/lib/docker.bk
```

[3]
If you want to use a separate backing filesystem from the one used by /var/lib/, format the filesystem and mount it into /var/lib/docker. Make sure add this mount to /etc/fstab to make it permanent.（引用）

[4] /etc/docker/daemon.jsonの編集
overlayへの変更

```
{
  "storage-driver": "overlay"
}
```

overlay2への変更

```
{
  "storage-driver": "overlay2"
}
```

centOSでoverlay2を使用する場合

```
{
  "storage-driver": "overlay2",
  "storage-opts": [
    "overlay2.override_kernel_check=true"
  ]
}
```

[5] Dockerを起動

```
$sudo service docker start
```

#コメント#
私も詳しくはわかりませんがdevicemapperは結構問題が多いらしいです。
とりあえず当方環境ではこれで大きなイメージファイルも問題なくimport出来るようになりました。
jenkinsの特定のジョブのみ実行ユーザーを変更したい

# やりたいこと

webアプリをdevelopユーザーで実行していて、それをjenkinsを用いてデプロイしたいときに、developユーザーでしか実行できないコマンドがあるとします。
jenkinsの実行ユーザーをdevelopにしてしまうのも手ですが、なるべくjenkinsユーザーで動かしたいと思っています。

http://qiita.com/mochidamochiko/items/377e30683f797a372103
そこでこちらの記事のを参考に特定のシェルを実行するときのみ、パスワードなしで実行できるようにしました。

# 設定

`/home/develop/shell/deploy.sh`に実行したいshellを書いて配置します。

その後` /etc/sudoers`を編集します。
直接ファイルを編集しないで、`visudo`で編集してください。
`visudo`で行うと編集後のファイルの整合性チェックを行うので、間違えて壊れた設定にすることを防いでくれます。

```
$ sudo visudo
# どこかいい感じのところへ下記を追加
jenkins ALL=(develop) NOPASSWD: /home/develop/shell/deploy.sh
```

これでjenkinsから`sudo -u develop /home/develop/shell/deploy.sh`が実行できると思います。

```
$ sudo su -s /bin/bash jenkins 
bash-4.2$ sudo -u develop /home/develop/shell/deploy.sh
# 正しく実行されていることを確認
```


複数ファイルを指定したい場合は以下のようにコンマで区切ればいいみたいです。

```
jenkins ALL=(develop) NOPASSWD: /home/develop/shell/deploy.sh, /home/develop/shell/test.sh
```

# 問題点

配置したシェルを頻繁に更新するなら、毎回サーバにログインして編集する必要があるので、多少面倒です。
今回のように頻繁に更新しなければそこまで問題はないです。
Postgresqlのクエリのコストを確認する方法

Postgresqlが推定したコストを取得

```sql
EXPLAIN 
SELECT *
FROM Hoge
```

実際にSQLを実行した際のコストを取得

```sql
EXPLAIN ANALYSE 
SELECT *
FROM Hoge
```

[引用元はこちら](https://www.slideshare.net/MikiShimogai/postgre-sql-explain)（結果の見方も載ってます）
GPSデータをrostopicとして取り扱う

# 概要

ROSネットワーク上でGPSデータを取り扱うことを考えた場合、軽く調べると"[NAVIO](https://emlid.com/navio/)"系統を利用した記事が多くある

実際、割と手軽に環境を構築でき、IMUなどのセンサも一通りそろっており、ドキュメントも充実しているため使い始めるまでは非常に簡単だった

しかし、GPSデータだけ、IMUだけほしいのに、メインのPCとは別にNAVIOを立てるというのは面倒だったので、とりあえずUSB接続可能なGPSデバイスを使えるようにしようと考えた

# 基本方針

使用するデバイス等は以下の通り

- センサ：[UBLOX NEO-M8T TIME & RAW RECEIVER BOARD WITH SMA (RTK READY)](http://www.csgshop.com/product.php?id_product=205)
- アンテナ：[Tallysman Wireless Inc. 33-2710-00-5000](https://www.digikey.jp/product-detail/ja/tallysman-wireless-inc/33-2710-00-5000/1526-1014-ND/4862786)
- 搭載センサ：[NEO-M8T](https://www.u-blox.com/ja/product/neolea-m8t-series)

センサ類はNAVIO2の搭載センサを基準に選定した

# 環境等

- Ubuntu 16.04
- ROS kinetic
- GPS用ライブラリ：https://github.com/KumarRobotics/ublox

選定理由としては、READMEが充実しているとか、変なパッケージに依存していないとか、一番最初に目に入ったとか

※動作確認が主目的のため、メッセージの形式などは二の次

※おすすめあったら教えてください

# 導入手順

1. `ワークスペース名/src/`で`$ git clone https://github.com/KumarRobotics/ublox`
2. `$ catkin_make`
3. `$ roslaunch ublox_gps ublox_gps.launch`
    4. ランタイムエラー：権限が必要
5. `$ sudo chmod 666 /dev/ttyACM0`で権限を付与
    6. デバイスの場所は必要に応じて読み替えてください
7. 上記launchファイル内のデバイス指定を`/dev/ttyACM0`に変更
8. 再度launchファイルを実行
    9. `$ rostopic list`から発行されていることを確認
    10. `$ rostopic echo /gps/fix`から中身を確認

# 結果

```
$ rostopic echo -n 1 /gps/fix

header: 
  seq: 242
  stamp: 
    secs: 1377993660
    nsecs: 500000000
  frame_id: gps
status: 
  status: -1
  service: 3
latitude: 0.0
longitude: 0.0
altitude: 0.0
position_covariance: [18446744065119.617, 0.0, 0.0, 0.0, 18446744065119.617, 0.0, 0.0, 0.0, 14062500960000.016]
position_covariance_type: 2
---
```

※鉄筋コンクリートの屋内のため、緯度経度が出ていません。ちゃんと見たいならアンテナは屋外に出してください
CircleCI2のMachineExecutorなマシンでNode(v8)とYarnを使う

> MachineExecutorなマシン
> https://circleci.com/docs/2.0/executor-types/
>
> ```yaml
> # こっちじゃなく
> # docker:
> #   - image: ...
>
> # こっち
> machine:true
> ```
>

絶対もっといい方法あるはず😅

## 問題
マシンに`ssh`した後に`nvm`するとヘルプが表示されます。「よーし、じゃあ`nvm`で入れちゃおう」と思ったけどちょっとハマったのでメモ。
ステップ中で`run: nvm`とかしても「`nvm`なんてコマンドないぜ」と怒られてしまいます。`run`を実行する前に`.bashrc`とか読まれてないみたい。多分。

## 解決
`source`で`.bashrc`を読み込む。`/home/circleci/.bashrc`というファイルに`nvm`の事とか色々書かれてるのでこれを使います。また、(2017年8月9日現在)デフォルトで入ってるのは6.xなので8.xを入れます。

`yarn`は`npm`でいれちゃいます。

```yaml
- run: |
    source /home/circleci/.bashrc
    nvm install 8
    npm i -g yarn
```

ちなみに、ここで6.xを`nvm uninstall 6`したら駄目でした。
`run:`毎に毎回`.bashrc`を読み込んでない状態で始まるのと、`source .bashrc`した時に6.xを探しに行ってしまい無いとエラーを返してciが失敗してしまいます。

`.bashrc`を読んでないので、以降のステップでいきなり`yarn`とかしても、「`yarn`なんてコマンドないぜ」と怒られます。なので、`node`に関係あるすべての`run`で`.bashrc`を読み込んで、「8.xを使うぜ」と言ってあげることでどうにか先に進めます。

こんな感じです。

```yaml
- run:
    name: Install node & yarn
    command: |
      source /home/circleci/.bashrc
      nvm install 8
      npm i -g yarn
- run:
    name: Show versions
    command: |
      source /home/circleci/.bashrc
      nvm use 8
      node -v
      yarn -V
- run:
    name: Yarn
    command: |
      source /home/circleci/.bashrc
      nvm use 8
      yarn
```
アプリケーションごとのgemfileのインストール

初心者の頃、リポジトリを作るたびにわちゃわちゃしてたのでメモ。

```
$    --path vendor/bundle
```


`--path`をつけることによって、
pcのローカルフォルダのデフォルトの位置ではなくて、それぞれのアプリの中にインストールする！
アプリケーションごとにすると、バージョンの違う言語、Gemfileの共存が可能になる。
Dockerを使ってrailsアプリケーションを開発する2


[Dockerを使ってrailsアプリケーションを開発する1](http://qiita.com/usatie/items/8596f4b6d13cdba6f8b7)からの続きです。

##1. アプリケーションを停止する
Ctrl-Cでも停止できるけど、これが正しい停止方法。

```Terminal
$ docker-compose down
```

もし、再ビルドする時に下記のようなエラーが出た時には、`/tmp/pids/server.pid`を削除すれば良いそうです。

```
A server is already
running. Check /myapp/tmp/pids/server.pid.
```

```Terminal
$ rm /tmp/pids/server.pid
```


## 2. Restart the application
```Terminal
$ docker-compose up
```

違うターミナルで、以下のコマンドを実行。（ディレクトリはアプリのところまで移動してから。）

```Terminal2
$ docker-compose run web rake db:create
```

もし、http://localhost:3000 にアクセスした時に以下のようなエラーが出る場合には、`config/environments/development.rb`に追記が必要でした。

```
Cannot render console from Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255
```

```config/environments/development.rb
...
  config.web_console.whitelisted_ips = '0.0.0.0/0'
...
```
http://qiita.com/suin/items/9b567c63af73b235e458


## 3. Rebuild

###3-1. ちょっとだけ変更した時
一回停止させてから、再ビルドして起動

```Terminal
$ docker-compose down
$ docker-compose up --build
```

データベースも立ち上げる

```Terminal-2
$ docker-compose run web rake db:create
```

これでいけます。

###3-2. 結構変更した時（bundle installが必要な時）
一回停止させてから、再ビルドして起動

```Terminal
$ docker-compose down
$ docker-compose up --build
$ docker-compose run web bundle install #これが追加で必要！
```

データベースも立ち上げる

```Terminal-2
$ docker-compose run web rake db:create
```

これでいけます。
Dockerを使ってrailsアプリケーションを開発する1

rubyもrailsもローカル環境には入っている必要はありません。all you need is Docker！
こちらを試してみました。
https://docs.docker.com/compose/rails/#connect-the-database

##1. 必要な４ファイルの作成
`Dockerfile`, `Gemfile`, `Gemfile.lock`, `docker-compose.yml`という４つのファイルを作成します。`Gemfile.lock`はempty fileで大丈夫です。

```Dockerfile
FROM ruby:2.3.3
RUN apt-get update -qq && apt-get install -y build-essential libpq-dev nodejs
RUN mkdir /myapp
WORKDIR /myapp
ADD Gemfile /myapp/Gemfile
ADD Gemfile.lock /myapp/Gemfile.lock
RUN bundle install
ADD . /myapp
```

```Gemfile
source 'https://rubygems.org'
gem 'rails', '5.0.0.1'
```

```Gemfile.lock
```

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

```Terminal
$ vim Dockerfile
$ vim Gemfile
$ touch Gemfile.lock
$ vim docker-compose.yml
```


## 2. Build the project
以下のコマンドでビルドを行います。

```Terminal
$ docker-compose run web rails new . --force --database=postgresql
$ ls -l
$ docker-compose build
```

## 3. Connect the database
データベースに接続するために以下のようにdatabase.ymlを変更します。

```config/database.yml
default: &default
  adapter: postgresql
  encoding: unicode
  host: db
  username: postgres
  password:
  pool: 5

development:
  <<: *default
  database: myapp_development


test:
  <<: *default
  database: myapp_test
```
その後、下記のコマンドを叩く

```Terminal
$ docker-compose up
```
これで、サービスが起動するので、別のターミナルを開いて以下のコマンドを実行する

```Terminal-2
$ docker-compose run web rake db:create
```

以上で、railsアプリケーションがとりあえず作成できて、http://localhost:3000 にアクセスできるようになっています。
![スクリーンショット 2017-08-09 12.20.08.png](https://qiita-image-store.s3.amazonaws.com/0/44151/8cec6b21-a277-cb54-04c4-0c4d534ef4fd.png "スクリーンショット 2017-08-09 12.20.08.png")


続きはこちら。
[Dockerを使ってrailsアプリケーションを開発する2](http://qiita.com/usatie/items/6ef54a3d2d69bab9e2c2)
javascriptで配列→csv書き出しの実現

nodeを使ってディープラーニング用の学習データを準備するのに**配列→CSV**を行う必要があったので備忘録として

```js
var fs = require('fs');
var formatCSV = '';
var testArr = [
  [0.018317, -0.019618, -0.011231, 0.999577],
  [0.018395, -0.019801, -0.011154, 0.999573],
  [0.018559, -0.019742, -0.01115, 0.999571]
];

exportCSV(testArr);

// 配列をcsvで保存するfunction
function exportCSV(content){
  for (var i = 0; i < content.length; i++) {
      var value = content[i];
   
      for (var j = 0; j < value.length; j++) { var innerValue = value[j]===null?'':value[j].toString(); var result = innerValue.replace(/"/g, '""'); if (result.search(/("|,|\n)/g) >= 0)
      result = '"' + result + '"';
      if (j > 0)
      formatCSV += ',';
      formatCSV += result;
    }
    formatCSV += '\n';
  }
  fs.writeFile('formList.csv', formatCSV, 'utf8', function (err) {
    if (err) {
      console.log('保存できませんでした');
    } else {
      console.log('保存できました');
    }
  });
}
```

単純に行っており、もっといい方法があると思うので教えていただければ幸いですmm


以上
Raspberry Piの時刻を合わせる

手順
1. ntpの設定をする
2. 最新の時刻を取得する
3. システム時刻を世界標準から日本標準にする

## 1. ntpの設定

ntp.confを編集する

```
$ sudo nano /etc/ntp.conf
```

server行をコメントアウト
pool行を追加

```diff:ntp.conf
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift


# Enable this if you want statistics to be logged.
#statsdir /var/log/ntpstats/

statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable


# You do need to talk to an NTP server or two (or three).
#server ntp.your-provider.example

# pool.ntp.org maps to about 1000 low-stratum NTP servers.  Your server will
# pick a different set every time it starts up.  Please consider joining the
# pool: <http://www.pool.ntp.org/join.html>
-server 0.debian.pool.ntp.org iburst
-server 1.debian.pool.ntp.org iburst
-server 2.debian.pool.ntp.org iburst
-server 3.debian.pool.ntp.org iburst
+#server 0.debian.pool.ntp.org iburst
+#server 1.debian.pool.ntp.org iburst
+#server 2.debian.pool.ntp.org iburst
+#server 3.debian.pool.ntp.org iburst
+pool ntp.nict.jp iburst

# Access control configuration; see /usr/share/doc/ntp-doc/html/accopt.html for
# details.  The web page <http://support.ntp.org/bin/view/Support/AccessRestrictions>
# might also be helpful.
#
# Note that "restrict" applies to both servers and clients, so a configuration
# that might be intended to block requests from certain clients could also end
# up blocking replies from your own upstream servers.

# By default, exchange time with everybody, but don't allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery
restrict -6 default kod notrap nomodify nopeer noquery

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1

# Clients from this (example!) subnet have unlimited access, but only if
# cryptographically authenticated.
#restrict 192.168.123.0 mask 255.255.255.0 notrust

# If you want to provide time to your local subnet, change the next line.
# (Again, the address is an example only.)
#broadcast 192.168.123.255

# If you want to listen to time broadcasts on your local subnet, de-comment the
# next lines.  Please do this only if you trust everybody on the network!
#disable auth
#broadcastclient
```
ntpデーモンを再起動する

```
$ sudo service ntp restart
```

## 2. 最新の時刻を取得する

```
$ sudo apt-get install ntpdate
$ sudo ntpdate -v ntp.nict.jp
```

## 3. 日本時刻にする

```
$ date
Wed  9 Aug 02:49:35 UTC 2017

$ sudo timedatectl set-timezone Asia/Tokyo
$ date
Wed  9 Aug 11:49:44 JST 2017
```
Android開発で個人的に使ってるPlugin・テンプレート一覧

# はじめに
Android-Studioで個人的に便利だなぁーと思って入れてるプラグインやテンプレート一覧。
Kotlin開発前提
半分は自分用のメモ兼宣伝
*また増えたら随時更新する予定*

# Plugin
## Parcelable Code Generator(for kotlin)
そのまんまでParcelable Codeを１発で作ってくれるやつ
<img width="797" alt="スクリーンショット 2017-08-09 10.49.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/1d2476dd-f1a4-de7f-856e-8812f8f87dc2.png">

### 使い方
Parcelableにしたいクラスの上で`Show Intention Actions`を表示
<img width="481" alt="スクリーンショット 2017-08-09 10.51.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/99ada93f-25e9-e1cf-bf68-06b9173af57a.png">

すると`Add Parcelable Implementation`の項目があるので選択すればParcelableなコードが１発で作られる
<img width="611" alt="スクリーンショット 2017-08-09 10.53.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/9f4654fe-5c19-8b81-eb9e-4ba2d3e19ee9.png">

## Save Action
保存時に色々してくれる子。主に自動フォーマット目的
<img width="775" alt="スクリーンショット 2017-08-09 10.56.20.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/46499645-603f-fbaf-7675-82b30bd26ae0.png">

検索で出て来ないのでインストールは以下のページから行う
https://plugins.jetbrains.com/plugin/7642-save-actions

DLしてきて`Install plugin from disk...`からインストールして再起動する
そうすると設定の`Other settings`に`Save Action`が追加されてるのでここから色々設定できる。
<img width="1013" alt="スクリーンショット 2017-08-09 10.58.50.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/cef51144-6566-e29d-bba1-ec6bdd5d3529.png">

とはいうものの、デフォルト設定のまま(保存した時に自動フォーマット&imports整理)だけで十分な気もする

## gradle-unused-resources-remover-plugin
@konifar さんが作ったプラグイン。Res以下から未使用なリソースをガッと消してくれるやつ。ありそうでなかった。
https://github.com/konifar/gradle-unused-resources-remover-plugin
<img width="1013" src="https://raw.githubusercontent.com/konifar/gradle-unused-resources-remover-plugin/master/art/shell.png" alt="gradle-unused-resources-remover-plugin">

## kotlin-fill-class
その名の通りクラスの要素を１発で入力してくれるやつ。
https://plugins.jetbrains.com/plugin/10942-kotlin-fill-class
<img width="1013" src="https://user-images.githubusercontent.com/8841470/42932763-24e15c72-8b7e-11e8-9e60-ee2f8095d6cc.gif" alt="kotlin-fill-class">


# Template
## CleanArchitectureTemplateForKotlin
自作のCleanArchitecture用のテンプレート
https://github.com/kiuchikeisuke/Android-Studio-CleanArchitecture-template-forKotlin

詳しい説明はこちら
[Kotlin用のCleanArchitectureのテンプレート作ったよ！](http://qiita.com/k_keisuke/items/38bf26e711b6918703b8)


体感で10分近くかかる作業が10秒で終わるようになった。

## RecycleViewAdapterTemplateForKotlin
自作テンプレート第２弾
https://github.com/kiuchikeisuke/Useful-template-forKotlin

RecycleViewAdapterのテンプレートをパパッと作れる。
毎回忘れがちなinflator周りのコーディングを一切しなくてよくなるから楽。
<img width="792" alt="スクリーンショット 2017-08-09 11.38.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/76726/ffd43381-bbc6-c24a-ddef-322a8092540d.png">

クリックイベント&Rippleエフェクトも自動で作ってくれるようにしてある。単純なものならこれだけでOK。

体感で5分かかる作業が10秒で終わるようになった。
Docker PostgreSQL公式イメージを使用してDBに初期データを流し込む


以前書いた

> Docker MySQL公式イメージを使用してDBに初期データを流し込む
http://qiita.com/furu8ma/items/75e5b1df29fef04ec7f1

のPostgreSQL版です。
まったく同じ手順で初期データを流し込めます。


> 公式イメージのありか
https://hub.docker.com/_/postgres/


まずは``docker-compose.yml``
個人的好みでalpine版を使っていますが、``docker-entrypoint.sh``を見る限り debian版でも同じ挙動のはずです。
ただ、alpine版は約40MB, debian版は270MB...


```docker-compose.yml
version: "3"
services:
  database:
    image: postgres:9.6-alpine
    volumes:
      - database:/var/lib/postgresql/data
      - ./postgres:/docker-entrypoint-initdb.d
    environment:
      - POSTGRES_USER=root
      - POSTGRES_PASSWORD=password
    ports:
        - 3306:3306

volumes:
    database:
      external: false

```

注意点としてpostgreSQLのデータ格納領域にvolumeを使用します。そうしないと **docker for windowsの場合、postgreSQLが正常に起動しないためです。**ホストOSがMacOSやLinux系なら直接ローカルディレクトリをマウントしても問題ないはずです。ホストOSのファイルシステムの違いのためでしょうか。Ubuntu on Windowsを使っても解決しないのがつらいところです。Microsoft先生よろしくお願いいたします。m(__)m


./postgres/にDBクリエイト用SQLやらインポート用シェルやらを置きます。
数字のプレフィクスをつけて実行順をコントロールするのもMySQLと同じHackです。

```sh
+ docker-commpose.yml
+- postgres/
    + 1_create_db.sql
    + 2_import.sh
    + dump1.gz
```


```2_import.sh
cd /docker-entrypoint-initdb.d/
echo "import data1..."
gzip -dc ./dump1.gz | psql -h localhost -U root -d db1
echo "done."

```

注意点はDockerfileなりで**~/.pgpassが事前に配置されていること**


これで、``docker-compose up``で初回起動時にデータが投入されます。
MySQLのイメージと挙動が一緒というのがありがたし。

参考になれば。
特定のサイトで使用されているSSL証明書がワイルドカード証明書か否かを確認する方法

# 確認手順
ブラウザで確認したいサイトをhttpsで開く（https://example.co.jp/）

証明書を確認する。
Firefoxの場合では画面の何もないところを右クリックし、ページの情報を表示を選択する

ページ情報のダイアログが表示される。セキュリティのタブをクリック→証明書を表示をクリックする。

証明書ビューアーが表示されるので、一般名称の項目を確認する。

ワイルドカード証明書であれば、*.sub.example.co.jp のようにワイルドカード付きで表示される。
ワイルドカード証明書でなければ、sub.example.co.jp のようにワイルドカード無しで表示される。
IE11 で disabled 属性の select 要素の color (文字色)を変える。

# 簡易メモ

## disabled 属性の select 要素は border や background-color と共に指定すると文字色が変わらない！

```html
<select>
  <option>Normal</option>
</select>

<select disabled>
  <option>Disabled</option>
</select>
```

```css
select {
  color: red;
  border: solid 1px black;
  background-color: orange;
}

select:disabled {
  color: blue;
  border: 1px solid black;
  background-color: orange;
}
```

## そんなときは ::-ms-value 疑似要素と ::-ms-expand 疑似要素を使う。

```css
select {
  color: red;
  border: solid 1px black;
  background-color: orange;
}

select:disabled {
  color: blue;
  border: 1px solid black;
  background-color: orange;
}

select:disabled::-ms-value,
select:disabled::-ms-expand {
  color: lime;
}
```
### ::-ms-value
Applies one or more styles to the content of a text or password input control, or a select control.

https://msdn.microsoft.com/en-us/library/hh771841(v=vs.85).aspx

### ::-ms-expand
Applies one or more styles to the drop-down button of a select control.

https://msdn.microsoft.com/en-us/library/hh771821(v=vs.85).aspx
Gnuplotで相対頻度分布を描く

頻度分布(ヒストグラム)をGnuplotで描く方法については，ドキュメントに[tips (PDFへのリンク)](http://www.gnuplot.info/docs_5.0/gnuplot.pdf#page=90)があり，Qiitaにも[頻度分布の描き方](http://qiita.com/iwiwi/items/4c7635d4c84bc785e47a)が投稿されていて，それらを読めばどうすればよいかわかるけれども…とりあえず，メモということで．

## 使用環境

* macOS 10.12.5

```
$ gnuplot --version
gnuplot 5.0 patchlevel 6
```

## 描き方

ドキュメントによれば，`using x:y smooth frequency`とすると，`x`が同じものについての`y`の合計値がプロットされる．
そして，`x`と`y`には式が書ける．
ということは，`y`に相対値を記述すればよい．つまり:

```gnuplot
binwidth = <something>
bin(val) = binwidth * floor(0.5 + val / binwidth)
plot "datafile" using (bin(column(1))):(1.0 / (binwidth * STATS_records)) smooth frequency with boxes
```

また，`with boxes`のデフォルトの描画方法だと，頻度0の箇所の隣の頻度が0でない場合，幅が伸びたboxが描画されてしまうようだ(デフォルトの描画ルーチンが累積値用のものになっている？)．
そこで，boxの幅を`binwidth`で固定するとよい:

```gnuplot
set boxwidth binwidth
```

## 注意点

* データファイルが複数のブロックを持つ場合，`every`を使用して間引こうとしても正しく描画できないようだ．
    * 自分が用意したデータファイルに原因があるかもしれない．詳細には再現や検証をしていない．
    * あるいは，そもそも単一ブロックを想定しているのかもしれない(未確認)．
* 上の`bin`は四捨五入のつもりだが，実際には正へのバイアスがかかる丸めである．
    * [ここ](http://qiita.com/iwiwi/items/4c7635d4c84bc785e47a)で定義されている`filter(x, y) = int(x / y) * y`は0への丸めになっている．
* 対数プロットは描画できない場合がある．
    * 頻度0の領域があるからか？
    * 原因と解決方法は未調査

# 参考情報
* [Gnuplot](http://www.gnuplot.info/)
    * [頻度分布の描き方(PDFへのリンク)](http://www.gnuplot.info/docs_5.0/gnuplot.pdf#page=90)
* [gnuplot でヒストグラム（頻度分布図）を描画する - Qiita](http://qiita.com/iwiwi/items/4c7635d4c84bc785e47a)

# TODO

* 具体的なサンプルスクリプト
Railsでファイル名を間違えて「generate」してしまった時の対策

#Railsでファイル名を間違えて「generate」してしまった時の対策
Railsコマンドの1つである **generate**コマンド 。
controllerやmodelなど様々なファイルを生成する大変便利なコマンドです。

しかし、このコマンドを使いファイルを生成するときに名前を間違えてしまった場合
誤った名前(saamon)のファイルがポコポコと大量に生成されてしまいます。

今回は英語の綴を間違えてしまった例です。

```ruby:command
rails generate model saamon
```

```ruby:コマンドプロンプトの表示
invoke  active_record
create    db/migrate/20170809020847_create_saamons.rb
create    app/models/saamon.rb
invoke    minitest
create      test/models/saamon_test.rb
create      test/fixtures/saamons.yml
``` 

salmonが正しいのにsaamonという名前でファイルを生成してしまいました。


これらのファイルを一つずつ消していくのは非常に面倒です。

そこで力を発揮するのが **destroy**コマンドです。


このコマンドの使い方は、簡単でgenerateと同じような感覚で使えます。

```ruby:command
rails destroy model saamon
```

```ruby:コマンドプロンプトの表示
invoke  active_record
remove    db/migrate/20170809020847_create_saamons.rb
remove    app/models/saamon.rb
invoke    minitest
remove      test/models/saamon_test.rb
remove      test/fixtures/saamons.yml
``` 

綺麗サッパリ消すことができました。

また、短縮して「destroy」を「d」と省略して使用することも可能です。

```ruby:command
rails d model saamon
```




以上、ファイル名を間違えて「generate」してしまった時の対策でした
Azure の IaaS サービス Virtual Machine で 鍵ファイルで ssh接続をしてみた

AzureのIaaSサービスVirtual Machineでssh接続をしてみます。もちろん鍵ファイルを使います。

## Azure CLI をインストール (2.0)

```
$ curl -L https://aka.ms/InstallAzureCli | bash

$ az -v
-bash: az: command not found

exec -l $SHELL
# これでパスがとおります

$ az -v
azure-cli (2.0.9)
```

## ログイン

```
$ az login
To sign in, use a web browser to open the page https://aka.ms/devicelogin and enter the code ********* to authenticate.
# ********はコード。ブラウザからコード認証してログインします。成功するとブラウザに成功した旨が表示されます。その後ブラウザは閉じてよい (そういうメッセージ)。
# ブラウザでコード認証がおわるとCLIでもログインが完了し、jsonでステータスが返却されます（省略)
```

## VM起動 (鍵付き、ubuntsu)

```
$ az group create --name myResourceGroupVM --location eastus
# 成功するとjsonでステータスが返却されます(省略)

$ az vm create --resource-group myResourceGroupVM --name myVM --image UbuntuLTS --generate-ssh-keys
SSH key files '****/.ssh/id_rsa' and '****/.ssh/id_rsa.pub' have been generated under ~/.ssh to allow SSH access to the VM. If using machines without permanent storage, back up your keys to a safe location.
# **** はmacへログインしているユーザのカレントディレクトリのパスです。

$ssh xx.xx.xx.xx
# xx.xx.xx.xx は起動したVMのグローバルIPです。ユーザ名は鍵ファイルを使うので不要。鍵ファイルは.ssh配下に存在しています
```

ログインできました

## 参考
https://docs.microsoft.com/ja-jp/cli/azure/install-azure-cli
https://docs.microsoft.com/en-us/azure/virtual-machines/linux/tutorial-manage-vm
もしも、New PHPの言語設計をするとしたら…。

いつもお世話になっている、PHP。
バージョンも7.2まで上がってきて、次は8と言われています。

しかし、長く進化し続けてきたということは、過去の負債も背負っているのは宿命というもの。
そんな過去の負債を断ち切るために、自分が新しくNew PHPの言語設計をするとしたら…というのを考えてみました。

**お断り: 以下は個人の見解であって、所属先の見解ではありません。**

# シンボル名をcase-sensitiveに
とにかく今すぐなんとかしてほしいのがこれ。
PHPは予約語、関数名、クラス名、メソッド名がcase-insensitiveなので、大文字と小文字の区別がありません。

だからこんな奇妙なコードもしっかり動作しちゃいます。

```php
$a = true;
iF($a == tRUe){
    EcHo 'true';
}
```

これが更に問題となるのは、名前空間と組み合わせたときにクラス名が予約語に衝突しちゃうことがあることです。

```php
namespace Foo;

class Int {     // PHP Fatal error:  Cannot use 'Int' as class name as it is reserved
}
```

クラス名がcase-sensitiveでさえあれば、こういう問題は起こらなかったんです。
PHP 7の間は`E_DEPRECATED`にしておいて、PHP 8からcase-sensitiveにしてくれないものだろうか…。

# primitive廃止
primitive(int, string, array, boolなど)は組み込みクラスに変更。
そうすれば、

```php
$a = ['a', 'b', 'c'].map(function($x) { return $x.toupeer(); });
```

みたいな書き方ができるし、`str_xxx()`、`array_xxx()`みたいな関数が一掃できます。

# 自動変換廃止
primitiveを廃止すれば自動的に解決されると思うけど、これがあるおかげで`===`演算子を道入せざるを得なくなってしまったわけで、型の自動変換は存在自体が悪です。

```php
1 == '1'    // true
1 === '1'   // false
```

型変換が必要な場合は明示的に行わせましょう。そのために`Integerable`みたいなinterfaceを用意しても良いと思います。

# エラーを例外オブジェクトに統一
もう、`E_XXXX`はお役御免にして、例外オブジェクトに統一してほしい。
`assert`は例外オブジェクト化されたのに、中途半端すぎ。

あとPHP7で導入された `Throwable` は微妙に問題が多いので、素直に`Exception`を頂点に戻してほしい。
7の間は、`php.ini`で例外にするか、`E_XXXX`にするかを選べるようにして、8から例外に移行すればよかったと思います。

# 正規表現クラス導入

PHPでの正規表現はただの文字列なので、エスケープが大変なんです。

いい加減

```php
/^abc$/.match('abc');
```

とか書きたいです。

```php
preg_match('/^abc$/', 'abc');
```

だと読みづらいし、スクリプトの実行（コンパイル）毎に正規表現のコンパイルが発生してしまいます。リテラル化してればOPCache(APC)のキャッシュ対象にすることも可能でしょう。

# 組み込みテンプレートエンジンを廃止
もう、ファイルの先頭に

```php
<?php
```
と書くのは疲れました。

つい、うっかり

```php
 <?php       // 先頭に空白
```

と書いちゃって、不要な空白が出力されて `header()` がエラーになったりするのは面倒なんです。

テンプレートエンジンは専用のライブラリでやってください。

# メソッド名のオーバーロード
C++でおなじみの、引数の数や型が違えば同じメソッド名が定義できるやつです。

```php
class Foo
{
    public funciton search(Bar $bar)        // Barで検索
    {
    }

    public funciton search(Baz $baz)        // Bazで検索
    {
    }
}
```

同じようなことをやるメソッドで引数の数の型が違う場合に、別のメッソド名を考えるのは無駄だし面倒なんです。
`ByXXX`とか`ForXXX`みたいなsuffixを付けるのは嫌です。

# 後置if構文のサポート
perlとかrubyでサポートされている

```php
if($condition){
    foo();
}
```

を

```php
foo() if($condition);
```

と書ける構文のことです。

これが導入されると、複数のガード節をスッキリ書けます。

```php
function(){
    return if(なんとか);        // ガード節1
    return if(かんとか);        // ガード節2
}
```

# クラスのメソッドはデフォルトで `$this` を返すようにする
PHPの組み込みクラスには、特に返す値も無いのに `$this` を返さないメソッドが多くて、メソッドチェーンできずにイライラします。
特にXML関連、ImageMagicとかがひどいです。

メソッドのデフォルトが`$this`を返す仕様だったら、これらのメソッドが自動的にMethod Chainableになっていたのに…。と思います。