OmniAICreator/Qiita-1.07M huggingface dataset:
GoogleMap上にRxJavaを使って非同期で大量のマーカーを追加していく

GoogleMapsに大量のマーカーを追加するときに便利かも。スリープさせながら追加してもマップはグリグリ動きます。

<img width="324" alt="Screenshot_20161206-120739-2_png.png" src="https://qiita-image-store.s3.amazonaws.com/0/99731/f300bc3c-a2d1-c1f4-c0a5-d815fef01990.png">

```xml:build.gradle

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:24.1.1'
    compile 'com.google.android.gms:play-services-maps:9.6.1'
    compile 'com.google.android.gms:play-services-location:9.6.1'
    compile 'io.reactivex:rxandroid:1.1.0'
}

```

```java:MainActivity.java

 private GoogleMap mMap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        final ArrayList<LatLng> latlngs = new ArrayList<>();

        for(int i = 0; i < 400; i++) {
            latlngs.add(new LatLng(-34, 150 + i * 1));
        }
        mMap.moveCamera(CameraUpdateFactory.newLatLng(latlngs.get(0)));


        Observable
                .create(new Observable.OnSubscribe<LatLng>() {
                    @Override
                    public void call(Subscriber<? super LatLng> subscriber) {
                        for(LatLng latlng : latlngs) {
                            sleep(100);
                            Log.d("デバッグ","追加");
                            subscriber.onNext(latlng);
                        }
                        subscriber.onCompleted();
                    }
                })
//                .onBackpressureBuffer()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<LatLng>() {
                    @Override
                    public void onCompleted() {
                    }
                    @Override
                    public void onError(Throwable e) {

                    }
                    @Override
                    public void onNext(LatLng latlng) {
                        mMap.addMarker(new MarkerOptions().position(latlng).title("YES"));
                    }
                });
    }

    private void sleep(int time) {
        try{
            Thread.sleep(time); 
        }catch(InterruptedException e){}
    }
```
Anacondaにscrapyをインストールしようとしてできなかった

Anacondaにscrapyをインストールしようとしてできなかったので、やったことをメモする。
python3.5.2環境上での話。

##状況
Anaconda Navigator上でscrapyインストール。

scrapyの1.0.3をインストールするよって言われたので、はーいってOKボタンを押下
> The following packages will be installed
scrapy 1.0.3

その後コンフリクトしてるからインストールできねえぞ確認しろみたいなこと言われてるんだが、そもそも入れてねえ。
> UnsatisfiableSpecifications:
The following specifications were found to be in conflict:
- python 3.5*
- scrapy 1.0.3*
Use "conda info " to see the dependencies for each package.

というかAnaconda Navigator上のscrapyのバージョン1.1.1なんだけど1.0.3とは？
![image](https://qiita-image-store.s3.amazonaws.com/0/150939/12094678-7d2f-0b17-8910-be6c097a5ded.png)


##対応
インストールした記憶はないけど、何かしらやった可能性は否定できない。

ということでコンフリクトしてるので、一旦アンインストール後、再インストールして問題解決。
```conda uninstall scrapy```

```conda install scrapy```

scrapyちゃんと入っているかなって以下コマンドで確認したら、1.1.1がインストールされていたので多分大丈夫。
```conda info scrapy```
PrimeFacesタグ利用　覚え書き

- Panelタグ

| Name| Default | Type |Description |
|:-:|:-:|:-:|:-:|
| toggleable  |  false |  Boolean |Makes panel toggleable   |
|toggleSpeed |1000 |Integer| Speed of toggling in milliseconds|
|collapsed |false |Boolean| Renders a toggleable panel as collapsed|
    - toggleable:Panelが表示非表示切り替え(toggle)を出来るかどうか指定する。falseで切り替え不可。
    - toggleSpeed:表示非表示切り替えのスピード設定。単位はミリ秒。
    - collapsed:tureでPanelが最小化された状態でレンダリングされる。畳み込まれるというニュアンスの単語。
    
>参考：[PrimeFacesドキュメント](http://www.primefaces.org/documentation)



- facetタグ

><p>facetのname属性で指定できるのは「first」「middle」「last」とあるようです。<br />
で、順番的には</p>
        
><ol>
><li>もしfirstが定義されたfacetがあればここ</li>
><li>テーマの<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a></li>
<li>もしmiddleが定義されたfacetがあればここ</li>
<li>PrimeFacesで定義された<a class="keyword" href="http://d.hatena.ne.jp/keyword/CSS">CSS</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/JavaScript">JavaScript</a></li>
<li>Headコンテンツ</li>
<li>もしlastが定義されたfacetがあればここ</li>
</ol>
>参考：[PrimeFacesでは<h:head>タグと<f:facet>タグでリソースの読込順を操作できる！](http://kikutaro777.hatenablog.com/entry/2013/07/16/185356)

 - Stickyタグ<p/>
他のコンポーネントを表示されてるウィンドウ内に常に表示されるようにする。
スクロールしてもついてくるアレ。


| Name | Default| Type| Description|
|:-:|:-:|:-:|:-:|
| target  | null  |  String|  Component to make sticky.
 |

　　- target：stickyにするコンポーネントを指定。
開発組織（Developer Edition）をサインアップした後にやることリスト

## やることリスト

自分はだいたいこんなことやってますよっ、てやつ。適宜ご参考にして下さい。

### 1. マイドメインを登録する
なぜかデフォルトの (ap|ap2).salesforce.com のままで使っている人がいまだに多いのだけど、よく慣れたSalesforce開発者は自分用の組織を3桁くらい持っているのが普通であり、そのうちの2,3は同時にログインすることになったりするので、同一ドメインでログインCookieが上書きされるのきついのです。いちいち他のブラウザとか立ち上げてられない。

### 2. プロファイルのIPアドレス制限を 0.0.0.0 - 255.255.255.255 に設定
たかだかDE組織にいちいちIP制限かけられたくないよ、という場合。これ設定しておくと他人とアカウント共有する場合に毎回承認メールが飛ぶのを防ぐ効果もある。

### 3. パスワードポリシーの有効期間をNeverに
90日で自動エクスパイアとかうざいので。そもそも強制リセット意味あるのかね。

## 上記の自動化

上記のうち1以外はMetadata API経由でスクリプト化することが可能。画面開かなくてもコマンドラインでできる。たぶんいちばん楽なのはJSforceのCLIを使う方法。

```bash
$ jsforce
> .authorize
logged in as user01@mydemo.example.org
> metadata.update('SecuritySettings',{fullName:'Security',passwordPolicies:{expiration:'Never'}})
{ fullName: 'Security', success: true }
> metadata.update('Profile', {fullName:'Admin',loginIpRanges:{startAddress:'0.0.0.0',endAddress:'255.255.255.255'}})
{ fullName: 'Admin', success: true }
```

1.もスクレイピングで何とかなりそうだけど、そこまではあまりやりたくない＆自動化沼にはまりそう。これぐらいで十分。

ちなみにJSforceの `.authorize`コマンドはOAuth2でリフレッシュトークンまで取得できるので、一旦セットアップしておくととても便利です。Zsh環境なら[jsforce-zsh-completions](https://github.com/jsforce/jsforce-zsh-completions)使えば接続済みのアカウントから補完できるので

```bash
$ jsforce -c admin@
-- connections --
admin@demo01.example.org                        admin@demo02.example.org
admin@mypartner.example.net                     admin@mycustomer.example.com
```

みたいにして接続先を選んでパスワード要らずのサインインができます。
ただし取得したリフレッシュトークンはOSのファイルに保存されてるので取扱には注意しましょう。
[EN] Checking your GitHub Issues & PullRequests at a glance

When working with several repositories, we tend to miss some of the issues and pull requests...

And to solve this, GitHub gives us a easy way out.

# Checking Issue & Pull Request with 1 click

In the header of your GitHub page, you will see the following layout.

<img width="1007" alt="ScreenCapture 2016-12-06 9.57.58_2.png" src="https://qiita-image-store.s3.amazonaws.com/0/85904/f7fe8ea9-4fca-a8b7-28e3-a66c8c0c260e.png">

By clicking `Pull requests` or `Issues` you can check them at a glance :slight_smile:
scala実行コンテキストでbuild.sbtの情報を使う


# Goal

* scalaバッチを頻繁にリリースすると、今動いてるバージョンの確信が持てなくなるので、バッチのはじめにアプリケーションバージョンをログ出力したい
* そのためにscala実行コンテキストでbuild.sbtに記述されるversionを取得したい

# Solution

sbt plugin: sbt-buildinfoが有効.
https://github.com/sbt/sbt-buildinfo

```project/buildinfo.sbt
# sbtVersion 0.13.6+の場合（その他のバージョンはgithub README参照）
addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.6.1")
```

```build.sbt
lazy val root = (project in file(".")).
  enablePlugins(BuildInfoPlugin).
  settings(
    buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
    buildInfoPackage := "hello"
  )
```

この設定でコンパイルするとpackage hello下にBuildInfoクラスが含まれる.
`sbt compile`したあと、以下のパスからソースも確認できる.
`target/scala-2.11/src_managed/main/sbt-buildinfo/BuildInfo.scala`

## Use Example

```scala:Main.scala
package jp.metheglin

import hello.BuildInfo

object Main {
  def main(args: Array[String]) {
    val logger = Logger(LoggerFactory.getLogger(this.getClass))
    // BuildInfo.toStringで一通りの情報が返る
    // 個別の情報はBuildInfo.versionのように取得する
    logger.info("Application Build: " + BuildInfo.toString)
  }
}
```

実行結果

```log
2016-12-06 00:40:03.590 INFO  jp.metheglin.Main$ - Application Build: name: test-batch, version: 2.2.2, scalaVersion: 2.11.8, sbtVersion: 0.13.8
```

## Environment

```
sbt sbtVersion
  # [info] 0.13.8

scala -version
  # Scala code runner version 2.11.7 -- Copyright 2002-2013, LAMP/EPFL
```
CakePHP2.xの初期構築

# 環境
* Centos6.x

# ミドルウェアのセットアップ
* php
* apache
* mysql
* pdo
* composer

# CakePHPの設置
* ソースの取得
``` $ composer require cakephp/cakephp:"~2.9" ```

* ドキュメントルートの設定
* セキュリティ設定
app/Config/Core.php
Security.salt
Security.cipherSeed
* app/tmpディレクトリの権限変更
* データベースの設定
データベース作成
app/Config/database.php
* ブラウザより動作確認

# more
* マイグレーションプラグインの導入
* bake

```
$ cd MyApp/app
$ ./Console/cake bake all [モデル名]
```
Rubyのアンインストールから再インストールまで

## ruby の特定バージョンを削除

```
ruby —version # バージョン調査
which ruby # ruby がどこにあるか
```

-> rbenv 以下にあることがわかった

```
rbenv —help # rbenv の使い方調査
rbenv uninstall 2.2.2 # アンインストール
```

## ruby の特定バージョンのインストールと rails の準備

```
rbenv install 2.2.2 # インストール
gem install bundler # bundler のインストール
vi Gemfile # rb-readline を削除
bundle install # gem (s) のインストール
```

## rb-readline なしで動くか

```
bundle exec rails c # rails console のテスト
```

これで動いたら OK!!
【FileMaker】既存の印刷物からレイアウトを取り入れる

はい、今日は、[AdventCalendar 2016 FileMaker Tips](https://qiita.com/advent-calendar/2016/filemaker-tips/) 12/06の記事です。

すでに運用されているExcelなどから出力された印刷物からFileMakerに乗り換え後に同じフォーマットで印刷できるようにして欲しい、ということがあります。
その時に有効なのが、スキャナでスキャンした印刷物をFileMakerレイアウトにコピペしてなぞる！
実際に開発でやってますが、今年のFileMaker Conference 2016でも紹介されていて、「あ、私のやり方、これでよかったんだー」となんとなくホッとしたのを覚えています。

それが、これ↓。
https://youtu.be/G05tycAuahY
「紙やスプレッドシートをカスタム Appにしてビジネス活用する方法」です。

もし、いちいち紙の段階で全ての罫線や位置を計ってレイアウトを作っていた方がいらしたら、ぜひ↑の方法を試してください。

今日は、ConferenceからのTips紹介でした！
Qiita の「いいね」の下に「どうでもいいね」を追加する

<img width="346" alt="ss_ 2016-12-06 11.30.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/40717/eb803321-c336-1b92-3443-6d36bcab4071.png">

Tempermonkey で追加します。
ブラウザバックできます。
ただし、その記事を「どうでもいい」と思ったというフィードバックは投稿者にとってどうでもいいと思うので伝えません。

```js
// ==/UserScript==

(function() {
    'use strict';

    let likeButton = document.getElementsByClassName('js-likebutton')[0];
    let dodemoButton = likeButton.cloneNode(true);
    // hard coding
    dodemoButton.getElementsByClassName('fa')[0].className = "fa fa-fw fa-hand-paper-o";
    dodemoButton.getElementsByTagName('span')[1].innerHTML = "どうでもいいね";
    dodemoButton.getElementsByTagName('button')[0].addEventListener("click", function(){
        history.back();
    });
    likeButton.parentNode.insertBefore(dodemoButton, likeButton.nextSibling);
})();
```

どうでもいいネタでした。

### インスピレーションを受けた記事
[よくないねボタン \- Qiita](http://qiita.com/mzyy94/items/7e816b7bed2d1e7fb584)
[Qiitaの「いいね」を「いいぞ」に変更する \- Qiita](http://qiita.com/kubosho_/items/9751e18e743360b522ad)
せめて投稿者だけでもストック数を確認できるようにして欲しい

# 要望
閲覧者にはストック数は出さなくてもいいと思うのだけれど、投稿した本人は投稿した内容がどのくらいストックされているか確認できるようにして欲しい
（いいねされた数ではなくて）

# 詳細
Qiitaでいいねを入れたのはそれはそれでいいのだけど、実際にいいね・ストックしてくれる人を見ると、通知を見た感じだけでもいいねじゃなく、ストックしてる人も相当数いるんじゃないだろうかと思いました。
閲覧する側からしてみたらどれがいい記事なのかの判定材料になるので、「いいね」でいいと思うし、Contributionもいいね基準でいいと思うのですが、投稿側からすると「いいね」と「ストック」は同等レベルで必要。もしくは「ストック」のほうが重要と感じる人がいる気がします。（自分は後者）
何故かと言うと、「いいね」はその投稿の内容がいいとおもったから押すもので、「ストック」は投稿内容に関心があるから押すものという違いがあるから。

# 行動理由（仮説）＆計測方法違い

## 閲覧

- 新着だからとりあえず
- 興味のある内容
- 自分の使ってる言語
- いいねがたくさんついてる
- Qiitaのメルマガに載ってた

**計測方法:** 

- 各投稿に表示されるView
- GoogleAnalytics

## いいね

- これはいい投稿だ ρ(・ω・｡)ﾎﾟﾁｯ
- あとで見る（旧ストックの感覚） ρ(・ω・｡)ﾎﾟﾁｯ

**計測方法:**
- 各投稿に表示されるいいねの数

## ストック

- あとで見る ρ(・ω・｡)ﾎﾟﾁｯ
- あとで使えそう（いい内容かどうか別として） ρ(・ω・｡)ﾎﾟﾁｯ
- いいねボタン嫌いだからストック ρ(・ω・｡)ﾎﾟﾁｯ

**計測方法:**
- 現在確認方法なし
Devicefarmの端末リストにあるものとないもの

## あるもの

https://aws.amazon.com/jp/device-farm/device-list/


## ないもの

- シャープ(SHARP)
- 京セラ(KYOCERA)
- 富士通(FUJITSU)
- ZTE
- プラスワン- マーケティング(PlusOnemaketing)
- NECカシオモバイルコミュニケーションズ
- パナソニック(Panasonic)
- 富士通モバイルコミュニケーションズ
- MOTOROLA(モトローラ)
- コヴィア- ネットワークス(Covia Networks)
- 富士通東芝モバイルコミュニケーションズ
- TCLコミュニケーションテクノロジー
- Pantech(パンテック)
- Dell(デル)
- ポラロイド(Polaroid)
- UPQ(アップ- キュー)
- Acer(エイサー)
- カシオ(CASIO)
- クロスリンクマーケティング(crosslink marketing)
- キャセイトライテック(cathay)
- TJC
- Geanee
- BlackBerry(ブラックベリー)
- BLUEDOT(ブルードット)
- 日本通信(JCI)
R で openxlsx パッケージを用いて xlsx ファイルを扱う

JDK に依存しない`openxlsx`パッケージを用いて xlsx ファイルからの入力と出力を試しました。
記述時の環境は以下の通りです。

- Windows 10 Pro
- R 3.2.5 Windows 64bit版
- openxlsx 3.0.0
- Rtools32.exe

## 事前準備

### RTools をインストールし、 bin フォルダを環境変数 PATH に追加しておく

R のバージョンにあった RTools をインストールします。ダウンロードは以下から。
[Building R for Windows](https://cran.r-project.org/bin/windows/Rtools/)

### openxlsx パッケージのインストール

通常通り。

```r
install.packages('openxlsx')
library(openxlsx)
```

## 使い方

### 読込

ファイルパスとシート番号を指定して `data.frame` として読み込みます。

```r
df <- read.xlsx(path, sheet = 1)
```

引数は色々あるので、必要に応じて `?read.xlsx` で参照すると良いでしょう。
例えば、1列目と1行目にそれぞれ特殊記号を含むような項目名の付いた正方行列データの場合は以下のようにすると、後の処理が楽になるかもです。

```r
df <- read.xlsx(path, sheet = 1, check.names = F, rowNames = T)
```

### 書出

ワークブックオブジェクトを作成し、シートを追加し、その上にデータを設定していくイメージです。
`openxlsx` ではセルやヘッダなどのスタイルを指定することもできますが、特に飾ったりしたくない場合は以下のような方法で十分かと思います。

```r
wb <- createWorkbook()
addWorksheet(wb, 'シート名1')
addWorksheet(wb, 'シート名2')
# withFilter = T の時は各列に Excel のフィルタが付きます。
writeData(wb, sheet = 'シート名1', x = df1, withFilter=F)
writeData(wb, sheet = 'シート名2', x = df2, withFilter=F)
# フォント指定をしない場合、Calibri が適用されます。
# "MS Pゴシック"や"ＭＳ　Ｐゴシック"を指定すると、xlsx ファイルが壊れました。
modifyBaseFont(wb, fontSize = 11, fontColour = "#000000", fontName = "MS PGothic")
# 上書きを許可しない場合、overwrite = F とする。
saveWorkbook(wb, path, overwrite = T)
```

## 感想

思ったより簡単に xlsx を扱うことができました。
今まで xlsx データを扱う際には一度各シートを csv に変換する手間がありましたが、そのまま読み書きできるようになれば、単純になりますね。
大きなサイズの csv を扱う場合にも、 xlsx では内部で圧縮されているので有利な気がします。
 
## 課題

フォント指定で日本語フォントを指定する方法がよくわかっていません。ソースコードを UTF-8 で書いてるのが良くないのかもしれません。

## 参考資料

[RでExcelのデータを読む方法](https://oku.edu.mie-u.ac.jp/~okumura/stat/exceldata.html)

  - 読込みだけなら hadley/readxl が良さそう。
  - openxlsx は日時データの扱いに注意が必要とのこと。
ubuntuにGitBucketを導入してssh接続する

#### OS
一応、私の動作環境です．

```
ubuntu 16.04.1 LTS
```

# 1. GitBucket を動かす
GitBucket の動作確認まで．

### java8 以上を入れる

```
$ sudo apt-get install default-jre 
$ sudo apt-get install default-jdk
```

### gitbucket.war を取得
GitBucket の [release ページ](https://github.com/gitbucket/gitbucket/releases) で一番新しいやつを入れる．

```
$ wget https://github.com/gitbucket/gitbucket/releases/download/4.7.1/gitbucket.war
```

#### gitbucket 動作確認

```
$ java -jar gitbucket.war
```
実行すると、 `http://[hostname]:8080/` で確認することができる．

# 2. サーブレットコンテナ Tomcat で GitBucket を動かす

### Tomcat の導入
Apache Tomcat の [8.5.8](http://tomcat.apache.org/download-80.cgi) を入れる．

```
$ wget http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-8/v8.5.8/bin/apache-tomcat-8.5.8.tar.gz
$ tar zxvf apache-tomcat-8.5.8.tar.gz
```

### gitbucket.war を Tomcat に入れる
```
$ mv gitbucket.war apache-tomcat-8.5.8/webapps/
```

### Tomcat 起動
```
$ ~/apache-tomcat-8.5.8/bin/startup.sh
```
ちなみに終了は `$ shutdown.sh`.
実行すると、 `http://[hostname]:8080/gitbucket` で確認することができる．

# 3. ssh で GitBucket にアクセスする．

### GitBucket に root でログインする
デフォルトの場合
id:   root
pass: root  

### 設定画面へ
右上アイコンから `System administration` をクリック．
サイドバーから `System Settings` を選択

### Base URL の設定
`Base URL` の項目に入力する．
http://[hostname]:8080/gitbucket

### SSH の有効化
`SSH access` で `Enable SSH access to git repository` にチェックを入れる．

### SSH Host, SSH Port について
SSHでアクセスするときに下のようになる．

`ssh://git@[SSH Host]:[SSH Port]/[User]/[repository name].git`

`SSH Host` は好きな名前で大丈夫．(たぶん
`SSH Port` はデフォルト値で大丈夫．
実はこのときすでにSSHに関する設定はすべて完了しているため、何らかの設定をする必要はない．

# 4. ローカルの git の設定
ssh-keygen によるカギの作成等は割愛．

### ssh/config について
ssh/config は以下のように設定する．

```
Host gitbucket
  User # ユーザー名
  Port 29418
  Hostname # ホスト名
  IdentitiesOnly yes 
  IdentityFile 秘密鍵の場所
```

|設定名|内容|
|:--|:--|
|Host|SSH Host の値|
|User|GitBucket のユーザー名|
|Port|SSH Port の値|
|HostName|ホスト名(IPアドレスなど)|
|IdentitiesOnly|ファイルに格納された秘密鍵のみを使用|

ssh/config に関して詳しくは[日本語マニュアル SSH_CONFIG](http://euske.github.io/openssh-jman/ssh_config.html)

### ssh 接続テスト
`$ ssh -T [Host] `
GitBucket の AA が見れたら成功．

# 参考Web
[githubの複数アカウントにSSH接続するための設定手順](http://dev.classmethod.jp/tool/github-ssh-sub-account-setting/)
[Ubuntu 16.04でGitBucketインストール+ssh接続](http://mochalog.hatenablog.com/entry/2016/04/18/175959)
[SSH接続の手順](https://gist.github.com/hayajo/9800990)
マルチタップの方法について

マルチタップについて手こずったのでメモします。


## やり方

指の数が増えるごとに指を反応してくれるようにした。
このままスクリプトを入れて設定すれば大丈夫です。


```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

public class Touch : MonoBehaviour {

	public Text text;
	public int touchCount;

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		// CountUpメソッドを呼び出す
		CountUp ();
	}

	//タップしたら数が増える
	public void CountUp(){
		//デバッグ用のクリック操作
		if (Input.GetMouseButtonDown (0)) {
			touchCount++;
			text.text = touchCount.ToString();
		}

		if( 0 < Input.touchCount){
			// タッチされている指の数だけ処理
			for(int i = 0; i < Input.touchCount; i++){
				// タッチ情報をコピー
				UnityEngine.Touch t = Input.GetTouch(i);
				// タッチしたときかどうか
				if(t.phase == TouchPhase.Began ){
					// タップされた時の処理
					touchCount++;
					text.text = touchCount.ToString();
				}
			}
		}
	}
}
```
Amazon linuxを立てて最初にやることメモ (ユーザ追加など)

Amazon linuxを立てて最初にやることメモ (ユーザ追加など)

##ユーザ追加
```
sudo su
useradd XXX
```
XXXはユーザ名

##SSHの公開鍵登録
```
su XXX
cd
mkdir .ssh
chmod 700 .ssh
vi .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
exit
```

.ssh/authorized_keysにクライアントの公開鍵を追記する。
クライアントの公開鍵作成コマンドは以下。
```ssh-keygen -t rsa```
クライアント側で生成される公開鍵id_rsa.pubの内容をauthorized_keysに追記する。

##sudo権限付与
root権限で
```
visudo
```
以下の箇所に追記

```
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
XXX     ALL=(ALL)       NOPASSWD:ALL
```
※パスワードなしでsudoできる例


##デフォルトユーザ(ec2-user)削除
root権限で
```
userdel ec2-user
```
以下コマンドでユーザ一覧を表示して、削除されていることを確認
```
cat /etc/passwd|sed -e 's/:.*//g'
```
※/home/ec2-userも不要なので削除
```
rm -rf /home/ec2-user 
```


##yumアップデート
```
sudo yum update -y
```

##よく使うツール類
gitとdocker
```
sudo yum install -y git docker
```

jq
```
sudo curl -o /usr/local/bin/jq -L https://github.com/stedolan/jq/releases/download/jq-1.5/jq-linux64 && sudo chmod +x /usr/local/bin/jq
```
Barba.jsを使って、metaタグを動的に更新する方法

[newPageReady](http://barbajs.org/events.html)のイベントで使用するようになります。例：

```js
Barba.Dispatcher.on( 'newPageReady', function( currentStatus, oldStatus, container, newPageRawHTML ) {
    if ( Barba.HistoryManager.history.length === 1 ) {  // ファーストビュー
        return; // この時に更新は必要ありません
    }
    // jquery-pjaxから借りた
    var $newPageHead = $( '<head />' ).html(
        $.parseHTML(
            newPageRawHTML.match( /<head[^>]*>([\s\S.]*)<\/head>/i )[ 0 ],
            document,
            true
        )
    );
    var headTags = [ // 更新になってほうしいタグ
        "meta[name='keywords']",
        "meta[name='description']",
        "meta[property^='og']",
        "meta[name^='twitter']",
        "meta[itemprop]",
        "link[itemprop]",
        "link[rel='prev']",
        "link[rel='next']",
        "link[rel='canonical']",
        "link[rel='alternate']"
    ].join( ',' );
    $( 'head' ).find( headTags ).remove(); // タグを削除する
    $newPageHead.find( headTags ).appendTo( 'head' ); // タグを追加する
});
Barba.Pjax.start();
```

@min30327 がコメントで書いた通り
jQueryを使用ずにネイティーブJSも変更可能です：

```js
Barba.Dispatcher.on( 'newPageReady', function( currentStatus, oldStatus, container, newPageRawHTML ) {
    if ( Barba.HistoryManager.history.length === 1 ) {
        return;
    }
    var head = document.head,
        newPageRawHead = newPageRawHTML.match( /<head[^>]*>([\s\S.]*)<\/head>/i )[ 0 ],
        newPageHead = document.createElement( 'head' );
    newPageHead.innerHTML = newPageRawHead;
    var headTags = [ 
        "meta[name='keywords']",
        "meta[name='description']",
        "meta[property^='og']",
        "meta[name^='twitter']",
        "meta[itemprop]",
        "link[itemprop]",
        "link[rel='prev']",
        "link[rel='next']",
        "link[rel='canonical']",
        "link[rel='alternate']"
    ].join( ',' );
    var oldHeadTags = head.querySelectorAll( headTags );
    for ( var i = 0; i < oldHeadTags.length; i++ ) {
        head.removeChild( oldHeadTags[ i ] );
    }
    var newHeadTags = newPageHead.querySelectorAll( headTags );
    for ( var i = 0; i < newHeadTags.length; i++ ) {
        head.appendChild( newHeadTags[ i ] );
    }
});
Barba.Pjax.start();
```
Mysql5.7でSQLログを出す


設定ファイル編集
```shell-session
vim /etc/my.cnf
```

```shell-session:my.cnf
#Set General Log
general_log=1                                                                                                                                                   
log_output=FILE
general_log_file=/var/log/mysqld-general_query.log
```

ログファイルに権限付与
```shell-session
touch /var/log/mysqld-general_query.log
chown mysql.mysql /var/log/mysqld-general_query.log
chmod 640 /var/log/mysqld-general_query.log
```

＊以下のサイトを参考にさせていただきました
http://qiita.com/torshinor/items/178f26277678fadd7cb0


サービス再起動
```shell-session
systemctl restart mysqld  
````
Memo: Arista + Cavium XPliant, AlgoMatch

ついに Arista が Cavium XPliant を採用とのニュース

* SDxCentral まとめ記事：[New Arista Programmable Switches Use Cavium XPliant Chips](https://www.sdxcentral.com/articles/news/new-arista-programmable-switches-use-cavium-xpliant-chips/2016/12/)
* Arista Press Release : https://www.arista.com/en/company/news/press-release/2115-pr-20161205

トピックスとしては以下２点。

* Programmable Switch using Cavium XPliant
* AlgoMatch ... algorithmic search using SRAM (not TACM)

ニュースのタイトルには記載されてないが、むしろAlgoMatchの実装詳細が興味深い。
パテント登録したということなので、いずれ公開されるでしょう。

# Programmable Switch using Cavium XPliant

Cavium XPliant は ASIC であるにもかかわらず、「パケットヘッダのパーサー」及び「パケット処理パイプライン」を変更（レジスタ設定によるプログラミング）が可能。これを利用すると、現在スイッチ・ルーターでサポートされてないプロトコルやパケット処理パターンに対応可能。

但し "We’re introducing a new chipset, but it’s the same single EOS" と記載されているため現時点では特別なプロトコルや処理は実装されてないと推測される。
今後の拡張性と、Broadcom独占を阻止するためのセカンドソースを確保する狙いがあるのか？

# AlgoMatch ... algorithmic search using SRAM (not TACM)

AlgoMatch の紹介ビデオ（英語 by Arista）
https://www.youtube.com/watch?v=sH4Lj8ov07A

従来TCAMを利用してルールマッチが実装されてきたが、IPv6のビット長に対応しようとすると非常に非効率になってしまう。また、（優先度ビット無しのエントリ位置によるマッチのため）柔軟なポリシー設定が難しい。

これに対し、SRAMを利用し、アルゴリズム的に検索（Lookup）することによりTCAMと比較し以下メリットを出せる AlgoMatch を実用的なレベルで実装した。

* 高密度（多くのエントリー）
* 省エネルギー
* ルールの柔軟性
Photoshopの不透明度と塗りの違い

不透明度
画像とレイヤースタイルの効果が透けます。

塗り
レイヤースタイルの効果は維持されたまま、元の画像だけが透けます。
塗りを0％にするとレイヤースタイルだけが表示されます。
例えば、水滴のようなレイヤースタイルの効果だけを表示する際に使用します。
JDBCでsjisなMySQLやMariaDBにWindowsネイティブな文字列を突っ込む

自分用メモのような日記

会社に古いDBからインポートしたcp932_japanese_ci(MS932/SJIS)なMySQLがあった。

クライアント「『㈱』とかが入った文字列突っ込むとなんか落ちます！！！」

Javaは悪くない。Javaはいい子だった。
問題はJDBCのSQLパーサーらしい。おのれOracleめ！！手抜きするな～！
しかし、Oracle社に恨み言言ってもしょうがない。だって無料コンポーネントだしね・・

ふと、昔BLOBなんかでバイナリ突っ込む時につかった魔法を思い出す。
文字列を16進数に変換して突っ込む魔法。

```java
import javax.xml.bind.DatatypeConverter;

private String toHexString(String value)
{
    try
    {
      byte[] data = value.getBytes("Windows-31J");
      String hex = DatatypeConverter.printHexBinary(data);
      if (hex.length() > 0) {
        return "0x" + hex;
      }
      return "''";
    }
    catch (UnsupportedEncodingException e)
    {
      e.printStackTrace();
    }
    return "'" + value + "'";
}
```

バインドする部分に噛ましたら**16進数な文字列**になって登録されてしまった・・・。
そりゃそうよね・・・。

なので、prepareするところに直に入れ込むことにした。
無事動いた。ひゃっほー！！

（バインドしなくていいの？）
（ループさせたりするとちょっと遅くなるけど、でも落ちるよりマシじゃね？）
（だよね）

知らない。SJISなDB建てたのが悪いんだ・・・
資料やスライド作りに役立ちそうなデザインのルールをまとめてみた

## はじめに
プレゼン資料やスライドを作っていると、フォント選びに悩んだり、
レイアウトがイマイチになったという経験はないでしょうか？
そこで今回は書体選びからレイアウトまで重要そうなことをまとめてみました。

## フォントの基本
日本語の文字は、大きく **明朝体**と**ゴシック体**、英語の文字は**セリフ体**と
**サンセリフ体**に分けることができます。


![https://tech-master.s3.amazonaws.com/uploads/curriculums//ba8812591500d5ce0d37605c23bed36b.png](https://tech-master.s3.amazonaws.com/uploads/curriculums//ba8812591500d5ce0d37605c23bed36b.png)

## これから使っていきたいテクニックまとめ


### 1.1 企画書やレポートには明朝体
企画書やレポートなどの場合、比較的長い文章を書くことが多いのではないかと思います。
こういった長い文章を書く場合には**明朝体**が有効です。
また、欧文の場合も同じで文字数が多いと**サンセリフ体**よりも**セリフ体**が適しています。
おすすめは**游明朝**です。

![yumintyou_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/f9d94ab8-24ca-4694-284b-e72ba3c63290.png)


### 1.2 スライドやポスターにはゴシック体

スライドやポスターは、伝えたい内容を短い言葉で説明するものです。
そのため、インパクトがある書体を選びましょう。
このような資料では、読みやすい**ゴシック体**や**サンセリフ体**を用いるのがいいと思います。
おすすめは**ヒラギノ角ゴ**です。

![hiragino_kakugo_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/d5d193c7-a834-ab88-cc90-c286007ce30d.png)



### 1.3 和文に欧文フォントを使わない

英文に、日本語の書体を使うのは避けましょう。
その逆もまた然りです。
僕はこれで先輩デザイナーに何回も怒られました。

また、和文と欧文を組み合わせる時のポイントとして

・**雰囲気**が似ているフォントを選ぶ
・**大きさ**が似ているフォントを選ぶ
・**太さ**が似ているフォントを選ぶ

という3つが挙げられるかと思います。


### 1.4 文字の大きさや太さにメリハリをつける

文字の大きさや太さに強弱がないと、資料が単調になってしまいます。
まず受け手に伝えたい情報とその優先度をしっかりと意識しましょう。
そのために有効なのは、タイトルや小見出しを太く、大きくすることです。
基準としては、普通に読む文章は**18~32pt**、強調したい文字にはそれ以上、
重要性の低い文章には**18pt以下**の小さな文字を使いましょう。

![ookisa_futosa_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/09d3a0ce-2446-adb2-17f1-b7591aecd542.png)


全て同じ大きさ・太さで書かれているため、何が本当に伝えたい情報なのか分かりづらいですね。

![after_ookisa_futosa_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/61783039-1d49-620e-47e2-4143ec4f8680.png)


文字にメリハリがついていて読みやすいですね。
文章に強弱をつけるために太めのゴシック体を使用している点も注目です。



### 1.5 行間を調整する

初期設定では行間が狭いことがほとんどであるため、行間を調整することはとても大切になります。
読みやすさを意識しながら行間を調整していきましょう。

・行間がないパターン
![gyoukan_nashi.png](https://qiita-image-store.s3.amazonaws.com/0/136162/cce52169-3e53-c786-5ded-adb6b4e25681.png)
行間がないので少し読みづらいかと思います。

・行間が適切なパターン
![mintyou_tekisetsu_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/93755ac0-785c-5142-787c-9c05dc4e4e9b.png)


スピード感を持って読み進められますね。

・行間が広すぎるパターン
![gyoukan_hiroi_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/625b4c67-e4ca-5593-3c34-72a6bdb19436.png)



行間が広すぎて読みづらいです。




### 1.6 しっかりとカーニングをおこなう

文字間のスペースを調整して読みやすさを改善する作業のことをカーニングと言います。
カーニングをしているのとしていないでは読みやすさにかなりの差が生まれてしまうので絶対におこないましょう。

![karning_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/b6c60f3b-0c48-91ab-a04b-b1eac18bdf55.png)




### 1.7 改行を意識してみる

スライドなど文章が短い場合、改行に気を配ることで可読性を高められます。
ここではすぐに使える改行についてのポイントをいくつかご紹介します。

#### ・単語を分離しない
![tango_bunri_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/fc204716-6456-51c4-6873-977d4f3713b9.png)

単語の途中で改行を入れるのはやめましょう。
改行するなら単語と単語の間や、読点などの位置がベストです。
文を書き換えたり、改行で調整してください。



#### ・文末のちょっとしたはみ出しを避ける

![tyutohanpa_03.png](https://qiita-image-store.s3.amazonaws.com/0/136162/cac19bf3-365a-14b7-7361-130583c67d08.png)



最後の行は句点を含めても3文字はあるようにしましょう。




## まとめ
ちょっとしたことかもしれませんが、気を配ってみると、資料の見やすさが向上するはずです。
ぜひ様々な場面で応用してみてください。
最後にこれをきっかけとしてデザイン自体の奥深さが伝われば何よりです。
AWSのAPIGatewayを利用したアクセスキー隠蔽方法

[ヴァル研究所 Advent Calendar 2016](http://qiita.com/advent-calendar/2016/val)、6日目です。

javascriptで駅すぱあとWebサービス(WebAPI)を使いたいんだけど、アクセスキーが見られちゃうのは勘弁〜な人のために、
AWSのAPIGatewayを利用したアクセスキー隠蔽方法をご紹介します。

※ほぼAPIGatewayの説明です。駅すぱあとWebサービスに限らず、他のWebAPIで同じ悩みに遭遇している方も是非読んでいただけるとうれしいです。

## APIGateway とは

APIを簡単に作成したり配布したり、保守や監視が行えるサービスです。
詳しくは[公式ページ](https://aws.amazon.com/jp/api-gateway/)をご覧ください。

## 駅すぱあとWebサービス とは

皆さんご存知（？）「駅すぱあと」の機能をWebAPIとして提供しているサービスです。経路探索はもちろん、駅や時刻表などの情報を取得することが出来ます。無料で使えるフリープランがありますので気になった方は[駅すぱあとWebサービスの紹介ページ](https://ekiworld.net/service/sier/webservice/index.html)をご覧ください。

## それでは作ってみよう

今回は[駅情報](http://docs.ekispert.com/v1/api/station.html)の機能をラップするAPIを作ります。

### APIの作成
APIGatewayのページにアクセスし、「APIの作成」をクリックします。

![スクリーンショット 2016-12-03 14.18.20.png](https://qiita-image-store.s3.amazonaws.com/0/79577/ab14f5cf-58fb-318a-cee3-a1e4831c080c.png)

API名と説明を入力して「APIの作成」をクリックします。

### リソースの作成

「リソースの作成」をクリックしてください。
![スクリーンショット 2016-12-03 14.27.07.png](https://qiita-image-store.s3.amazonaws.com/0/79577/7b385bdc-3aac-96dd-4f5d-aec7e4db0f8a.png)

![スクリーンショット 2016-12-03 14.27.44.png](https://qiita-image-store.s3.amazonaws.com/0/79577/59fe3939-d90d-fdce-754e-8a2ee37b9f11.png)
[駅情報](http://docs.ekispert.com/v1/api/station.html)APIは、`api.ekispert.jp/v1/{format}/station`というエンドポイントなので、`station`というリソースを作成することにします。

### メソッドの作成
次に、メソッドを作成します。
「メソッドの作成」をクリックします。
![スクリーンショット 2016-12-03 14.28.11.png](https://qiita-image-store.s3.amazonaws.com/0/79577/40394514-2bc8-1630-27b9-a7b083db94e4.png)

![スクリーンショット 2016-12-03 14.30.22.png](https://qiita-image-store.s3.amazonaws.com/0/79577/5d4c9edf-6022-a309-88c3-c503fa4f16ef.png)
「統合タイプ」は`HTTP`を選択しましょう。
「エンドポイントURL」は、`http://api.ekispert.jp/v1/json/station?key=xxxxxxx`を入力します。`json`の部分は`xml`でもかまいません。

![スクリーンショット 2016-12-03 14.31.04.png](https://qiita-image-store.s3.amazonaws.com/0/79577/4bb1a554-1749-869e-e40f-9fe6805992f5.png)

### テスト
ここまで出来たら、テストを実行してみましょう。

「テスト」をクリックして、駅すぱあとWebサービスのレスポンスが返るか確認してみましょう。

![スクリーンショット 2016-12-03 14.45.49.png](https://qiita-image-store.s3.amazonaws.com/0/79577/94eca263-620f-618f-0f92-929f2bdaa91e.png)

### デプロイ
デプロイを行い、APIを使える状態にします。

「APIのデプロイ」をクリックします。
![スクリーンショット 2016-12-03 16.55.33.png](https://qiita-image-store.s3.amazonaws.com/0/79577/4102350e-dc4a-c184-4ebf-91ec035ed8cf.png)

![スクリーンショット 2016-12-03 16.56.41.png](https://qiita-image-store.s3.amazonaws.com/0/79577/8ef8ca14-734c-ae85-0f0a-627daa43c2c7.png)

「デプロイ」をクリックすると、エンドポイントが生成されます。

![スクリーンショット 2016-12-03 16.58.50.png](https://qiita-image-store.s3.amazonaws.com/0/79577/87b3f515-2f51-862f-c1b8-21a54d910680.png)

アクセスして、テスト通りの結果になっているか確認しましょう。

![スクリーンショット 2016-12-03 16.57.40.png](https://qiita-image-store.s3.amazonaws.com/0/79577/27fd2efa-3ca7-7ed8-116a-27ac7ff4b6b1.png)

これで、[駅情報](http://docs.ekispert.com/v1/api/station.html)の機能をラップするAPIが完成しました！

## まとめ
今回は駅すぱあとWebサービスの機能を例に、
APIGatewayのHTTPプロキシ機能を使って、アクセスキーを隠蔽する方法をご紹介しました。
キーを隠蔽する以外にも、様々な使い方があります。

* 他のAPIと組み合わせることで、１つのエンドポイントで事が済ませられる
* メソッドレスポンスのモデルをいじることでレスポンスを整形することが出来るので、アプリケーション側の実装内容に合わせて、コード量を少なくすることが可能
* リクエスト時に付与するパラメータ名を変更することが可能なので、オレオレAPIを作る事が出来る

APIをさらに便利に使う事が出来ますね♩
それでは良いAPIライフを！
【Laravel】beginTransaction, commitの実行ログ出力方法

Laraval(5.1で確認)を使用していて、MYSQLのクエリ実行ログを確認したい場面は皆さんあると思います。

`\DB::listen()`や[laravel-debugbar](https://github.com/barryvdh/laravel-debugbar)を使用して確認している方が多いのかなと。


ただ、MYSQLの`begin transaction`や`commit`の実行コマンドログは出ないため、
本当にちゃんと「transactionの開始から終了までの流れがあっている？」と
確認したい場面があると思います。

その時は`App\Providers\EventServiceProvider::boot()`へ以下を追記をする事で確認ができます。

```App\Providers\EventServiceProvider.php
    public function boot(DispatcherContract $events)
    {
        parent::boot($events);

        $events->listen('connection.mysql.beganTransaction', function () {
            \Log::debug('beginTransaction');
        });

        \DB::listen(function($sql, $bindings, $time) {
            \Log::debug($sql);
        });

        $events->listen('connection.mysql.committed', function () {
            \Log::debug('commit');
        });
    }
```

`Event::fire`するイベントは`Illuminate\Database\Connection`クラスに記述されているbeginTransactionメソッド、commitメソッドに記載されています。

```Illuminate\Database\Connection.php
    public function beginTransaction()
    {
        ++$this->transactions;

        if ($this->transactions == 1) {
            try {
                $this->pdo->beginTransaction();
            } catch (Exception $e) {
                --$this->transactions;

                throw $e;
            }
        } elseif ($this->transactions > 1 && $this->queryGrammar->supportsSavepoints()) {
            $this->pdo->exec(
                $this->queryGrammar->compileSavepoint('trans'.$this->transactions)
            );
        }
        // ここでfireするイベント名を渡してる
        $this->fireConnectionEvent('beganTransaction');
    }

    public function commit()
    {
        if ($this->transactions == 1) {
            $this->pdo->commit();
        }

        --$this->transactions;
        // ここでfireするイベント名を渡してる
        $this->fireConnectionEvent('committed');
    }

    protected function fireConnectionEvent($event)
    {
        if (isset($this->events)) {
            // listenするイベント名は、connection.{database.phpのconnections名}.{イベント名}
            $this->events->fire('connection.'.$this->getName().'.'.$event, $this);
        }
    }

```

まぁコードを見ると、正確にはbeginTransactionメソッド、commitメソッドを実行したイベントログではあるのですが。。。

rollback等も同じようにlistenすれば確認が出来ます。
チューニング： 複雑なSQLで効率の悪い実行プランが採用されてしまう場合の対処法

※検証にはSQLServerを使用しています。

プロダクション環境で1分ほどかかってしまうクエリを実行する機能があったため、1秒程度までチューニングしたときのお話です。
該当のSQLは、20個ほどのテーブルをJOINして結果をSELECTする複雑なSQLでした。

クエリの中にはサブクエリのJOINも含まれており、調査の結果このサブクエリがボトルネックになっているようでした。
実行プランをみると、IndexScanの実際の行数が2億オーバーです。該当テーブルは本当は50万レコードくらいしかないので、最初はバグかな?と思いました。
統計情報は更新されているし、option(recompile)をつけて実行しても同じ実行プランで実行されてしまいます。

```
	--問題のSQL概要（ざっくりしててすみません。。)
	SELECT
		いろんなカラム
	FROM
		いろんなテーブル
	-- ↓ ここがボトルネック
	JOIN (
		サブクエリ
	) A ON A.ColumnA = Column1
	-- ↑ ここがボトルネック
	WHERE
		いろんな条件
```

実行プランの一部（テーブルサイズ50万レコードくらいなのに、Index Scanの行数がすごいことになってる）
![図1.png](https://qiita-image-store.s3.amazonaws.com/0/148310/01958614-ad5c-182d-4886-2a234638aed2.png)


調べていくうちに、「実際の行数」というのは、「GetNext()関数がコールされた回数」のことだということが分かりました。
参考： http://stackoverflow.com/questions/1006385/sql-execution-plan-shows-an-actual-number-of-rows-which-is-larger-than-the-tab?rq=1

ただ、なぜGetNext()関数が大量にコールされてしまったのか、そこまではつきとめることができませんでした。
（心当たりがある方は是非教えてください！）


サブクエリの中身はこんな感じでした

```
	-- ボトルネックとなっていたサブクエリ
	SELECT
		ColumnA
	FROM TableA
	WHERE ColumnB IN (
			SELECT MAX(ColumnB)
			FROM TableB
			JOIN TableC ON TableB.ColumnC = TableC.ColumnC
			GROUP BY ColumnD
		)
```

ためしに、このサブクエリの中身だけ単体で実行すると1秒もかからずに結果が返ってきます。
このことから、該当のSQLが遅い原因は「複雑なSQL文の解析時に、本当はもっと高速なプランがあるのに、効率の悪いプランが採用されてしまった」ということだと判断しました。

調査結果から、単体で実行する分には問題ないサブクエリを切り出すようにクエリを修正しました。

```
	-- 問題のサブクエリだけ切り出して結果を一時テーブルに保存
	SELECT
		ColumnA
	INTO #TmpTable
	FROM TableA
	WHERE ColumnB IN (
			SELECT MAX(ColumnB)
			FROM TableB
			JOIN TableC ON TableB.ColumnC = TableC.ColumnC
			GROUP BY ColumnD
		)

	-- 一時テーブル使用
	SELECT
		いろんなカラム
	FROM
		いろんなテーブル
	-- ↓ 一時テーブルに書き換え
	JOIN #TmpTable A ON A.ColumnA = Column1
	-- ↑ 一時テーブルに書き換え
	WHERE
		いろんな条件

	-- 後処理
	DROP Table #TmpTable
```

修正後のクエリは1,2秒で実行結果が返ってきました。
プランでも、「実際の行数」が332行となっており、ボトルネックとなっていたSQLが先ほどとは違うプランで実行されていることが分かります。
![図2.png](https://qiita-image-store.s3.amazonaws.com/0/148310/03a83d32-7a53-7491-861d-9ba83ceacbb5.png)


今回のチューニングをまとめますと、
・SQL文が複雑になると、最適なプランが生成されない可能性が上がる
	特にSQLServerでは経験上、GROUPBYを含むサブクエリだと今回の現象が発生する可能性が高いです
・複雑なSQLの中ではボトルネックなのに、単体で実行すると早いサブクエリがある場合は、前もって結果を一時テーブルに保存しておくと効果的な場合がある

以上、クエリの書き換えによるチューニングの例でした。
結構困ったwebpackのお話

# お話
JavaScript Advent Calendar 2016 6日目の記事です。
webpackでjQuery Pluginを管理しようとするとうまくビルドできなくて結構困りました。
jQueryの導入、jQueryPluginの導入を通して悩んだポイントを紹介していきます。
基本的なwebpackの使い方、webpackとはなんぞや？については解説しません。

> **勉強になるサイト**
- [公式サイト](https://webpack.github.io/)
- [webpack で始めるイマドキのフロントエンド開発](http://qiita.com/yosisa/items/61cfd3ede598e194813b)
- [step by stepで始めるwebpack](http://qiita.com/howdy39/items/48d85c430f90a21075cd)


# 前提
- webpack.config.jsを作成
- npmで必要なパッケージはインストール済み
- webpack.ProvidePluginでjQuery, jquery, $をaliasにjqueryを読み込んでいる

# jQuery-UIのautocompleteを使う
```js
// index.js
require('jquery-ui/ui/widgets/autocomplete');
$('[name="autocomplete-field"]').autocomplete({
  source: MY_SOURCE
});
```
- jquery-uiの場合複数の機能が一つのパッケージにまとめられているので、目的のscriptを直接requireしてくる必要がある
- npmの場合はnode_modules/jquery-uiの中身を見ればわかります

# pickadateのDatePicker機能を使う
```js
// webpack.config.js
// ... 省略
resolve: {
  alias: {
    'picker': 'pickadate/lib/picker'
  }
},
// ... 省略
```
```js
// index.js
require('picker');
require('pickadate/lib/picker.date');
$('[name="datepicker-field"]').pickadate();
```
- pickadateのDatePicker機能を利用するためにはpicker本体とpicker.date両方が必要
- またpicker.dateの中で`define( ['picker', 'jquery'], factory )`しているため`require('pickadate/lib/picker')`のままではダメで、pickerでaliasを作成する必要がある


以上短いですが、私自身がこの2つを動かすのに無駄に数時間悩んだので、誰かの助けになれれば幸いです。
Exponent で React Native のサンプルをさくっと公開する

# Exponent について

React Native のnpm上で公開されているコンポーネントのサンプルが [Exponent](https://getexponent.com/) というツールを使って公開されていることがあります。

- [react-native-svg](https://github.com/react-native-community/react-native-svg) => [Exponent](https://getexponent.com/@rncommunity/react-native-svg-examples)
- [react-native-tab-view](https://github.com/react-native-community/react-native-tab-view) => [Exponent](https://getexponent.com/@satya164/react-native-tab-view-demos)

端末上に、Exponentのアプリを入れておけば、このように公開されているサンプルはURLを踏むだけで、実際の動きを触ってみることが出来ます。gif動画でサンプルを見せるより、動くものを見せるほうがより魅力的に見せることが出来るのでとても良い方法だと思います。

コンポーネントのサンプル以外にも、プロトタイプレベルであれば、面倒な配布の準備をする必要なく、多数の人に配ることもできますので、使い所はたくさんあるのではと思います。ただし、ネイティブレベルの拡張は Exponent にもともとはいっているものだけになるので、限定される部分もあります。ただ、素の React Native よりは拡張されています。

Cordova/Phonegap にもこういったjsのアセットをダウンロードして一つのアプリで、多数の人に公開する仕組みはありましたが、Exponentは、その React Native 版ですね。
Exponent で作ったアプリをそのまま、パッケージングしてストアに公開することもできるようです。

# サンプルを作ってみる

https://docs.getexponent.com/versions/v11.0.0/index.html

こちらのドキュメントどおりに進めれば、React Nativeが開発できる環境があれば、非常に簡単に、端末にインストールしたExponentアプリ上で自分のアプリを開発できました。

1. PC(Mac)にクライアントツールをDL
2. プロジェクト作成（ブランクの状態・タブのサンプルの２種類から選んでスタートできます）
3. Exponentのアプリをストアからインストール
4. SMSで端末にURLを送信
5. ExponentアプリでURLを開く

クライアントツール
<img width="1405" alt="Exponent_XDE.png" src="https://qiita-image-store.s3.amazonaws.com/0/821/01d40923-88bc-17fc-8396-1b7315aa93a1.png">

あとは、React Native の通常の開発と同じように Hot Reload などが使えてサクサク開発は進められます。JS Debugging もできます。
面白いところとしては、ReactNative と違って同一ネットワーク上で端末を動かす必要はないので、リモートの人と一緒に Hot Reload を使って出来るのではないでしょうか。

タブのサンプルはこんな感じでした。

<img width="375" alt="Evernote Camera Roll 20161206 035153.png" src="https://qiita-image-store.s3.amazonaws.com/0/821/f6193246-4863-8947-abff-7897a085c415.png">
<img width="375" alt="Evernote Camera Roll 20161206 035153.png" src="https://qiita-image-store.s3.amazonaws.com/0/821/b07f09d8-78f0-274f-909e-dbcbae2321f8.png">
<img width="375" alt="Evernote Camera Roll 20161206 035153.png" src="https://qiita-image-store.s3.amazonaws.com/0/821/b69ca6b0-409c-981e-8c4a-6b0ccd8c6346.png">

２つの目のタブを、僕の自己紹介ページに変更したサンプルを公開してみました。公開も、クライアントの Publish ボタンを押すだけの簡単操作でした。

https://getexponent.com/@mat_aki/exponent-mat-sample

本当に大したことないですが、開いてみてのお楽しみということで。

# まとめ

Exponent を使えば、非常に簡単に React Native のサンプルを実機で試してもらえる環境が作れます。公開したコンポーネントのサンプルに、プロトタイプの共有に、ブログの記事のサンプルにと、使えるところはたくさんありそうです。
Rails の subdomain の TLD 長の罠

Rails で subdomain を扱うときにハマりがちなのは、TLD の長さによって subdomain の値が異なることです。

例えば foo.example.com というドメインから、 foo.example.co.jp にドメインを変更すると、今まで動いていた subdomain 関連のコードがうまく動かなくなりがちです。

ソースを見てみましょう。(ActionPack 5.0.1)

```ruby
      # Returns all the \subdomains as an array, so <tt>["dev", "www"]</tt> would be
      # returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
      # such as 2 to catch <tt>["www"]</tt> instead of <tt>["www", "rubyonrails"]</tt>
      # in "www.rubyonrails.co.uk".
      def subdomains(tld_length = @@tld_length)
        ActionDispatch::Http::URL.extract_subdomains(host, tld_length)
      end

      # Returns all the \subdomains as a string, so <tt>"dev.www"</tt> would be
      # returned for "dev.www.rubyonrails.org". You can specify a different <tt>tld_length</tt>,
      # such as 2 to catch <tt>"www"</tt> instead of <tt>"www.rubyonrails"</tt>
      # in "www.rubyonrails.co.uk".
      def subdomain(tld_length = @@tld_length)
        ActionDispatch::Http::URL.extract_subdomain(host, tld_length)
      end
```

この tld_length によって挙動が変わってくるので、ドメイン変更時 tld_length を適切に変えるか、```request.subdomain``` は使わず、```request.subdomains.first``` の値を使うなどの考慮をしていないと、突然意図しない挙動になってハマりがちなので注意しましょう。
バナーに秘めたデザインノウハウ

デザイナーの肩書きをもっていると必ず通るのがバナー制作。
「早く綺麗に訴求力高く作って！」と簡単に言われがちですが作るのが結構大変なのです。
そこで今回は、デザイナーはこんなことを考えながら作ってるんだ！という
ノウハウの一端を記事にしてみました。


今回はこのバナーを解体してみます。
![img](http://img.moppy.jp/pub/pc/friend/300x250-1.jpg)
http://pc.moppy.jp/


#目次
- [色を効果的に使う](#色を効果的に使う)
- [大きさの差で注目させる](#大きさの差で注目させる)
- [傾斜で誘目性を高める](#傾斜で誘目性を高める)
- [視線を向かせる](#視線を向かせる)
- [質感で際立たせる](#質感で際立たせる)



#色を効果的に使う

色彩（色み・明度・彩度）はデザインの大切な要素になります。

![01.png](https://qiita-image-store.s3.amazonaws.com/0/54596/039e2af9-0460-b8d7-4d59-e8aa39327908.png)


- 【基本色】黄色、焦茶色
    - 明度差・彩度差で注意を引きます。<br>ちょうど道路標識のような色合わせにしてみました。
- 【サブカラー】水色、ピンク
    - moppyのサービスカラーである水色に対し、補色であるピンク色（ブタちゃん）を添えて目立たせています。




###<i class="fa fa-pencil" aria-hidden="true"></i>グレースケールにして明度差をチェック

![02_g.png](https://qiita-image-store.s3.amazonaws.com/0/54596/c89c425f-1af8-0758-68e8-f563548c7c17.png)


色と同じくらい大切なのが明度差。
視認率や可読性を左右する要素ですが、意識的に作るのはむずかしい。
そんな時は一度作ったバナーをグレースケールにして確認してみましょう。

<pre>
グレースケールになっても可読性が確保されています。
グレースケールでモックを作ってから色を当てる方法もアリ。
</pre>



#大きさの差で注目させる
![03-big.png](https://qiita-image-store.s3.amazonaws.com/0/54596/d005e3c2-ae3e-de49-fcdd-febf3ad65ffe.png)


文字の大小差（ジャンプ率）を極端に取って、インパクトを出す方法です。
ジャンプ率が大きいと躍動的で読みやすく、賑やかになります。

![03-txt.png](https://qiita-image-store.s3.amazonaws.com/0/54596/9b9e4241-fac3-61d3-7418-fcd593f35b30.png)




#傾斜で誘目性を高める
![04-naname.png](https://qiita-image-store.s3.amazonaws.com/0/54596/c7b26857-14b3-5b2a-84b1-553ae72cfcd5.png)


傾きによって注目を集める方法です。
webページは基本的に水平線が多いため、部分的な傾斜が際立ちます。
傾斜させると、水平時よりもスペースを喰うので
少しはみ出すくらいの気持ちで配置するとボリューム感が出せます。



#視線を向かせる

![05-eye.png](https://qiita-image-store.s3.amazonaws.com/0/54596/ed06cd58-babf-0cfa-61ad-2de437d1acad.png)


視線によってメッセージを操る方法です。
今回はキャラクターの視線を「500万人」へ向けることで、メッセージを補強しています。
逆にキャラクターを外向きにして外へ向かう力を生み「突破！」というメッセージを強調するのもアリです。表現したいメッセージについては、依頼者に確認してみましょう。
キャラクター、人物写真、物の向きでも同じ効果が期待できます。



#質感で際立たせる
![06.png](https://qiita-image-store.s3.amazonaws.com/0/54596/958b063d-fd93-6132-6f75-8a296e902346.png)


光沢や素材感を付加して、質感の違いで目立たせる方法です。
抜群の効果があります。photoshopで効果を保存しておくと便利です。

今回はあまりギラギラさせず、キャラクターとの親和性を優先したかったので利用しませんでした。
多用し過ぎるとクドくなってしまう手法なので、抜き差しを心がけましょう。





#まとめ
いかがだったでしょうか？
ちょっとしたことの積み重ねでバナーデザインはぐっと良くなります。
タイムトライアル付きのデザイン練習と思って、意識的に取り組んでみましょう。
Ansibleのインストール

#Ansibleインストールについて
研究でAnsibleを使うことになりインストールしたところいくつか躓いたので、対処方法を記述する。
Ansibleで管理端末のシャットダウンを行うこととする。

## 実験環境

- UbuntuServer 16.04 LTS 
- SSH
## インストール
サーバ側
AnsibleとPython2.7をインストールする。

```
$ sudo apt-get install ansible
$ sudo apt-get install python2.7
```

クライアント側
Python Simplejsonをインストールする。

```
$ sudo apt-get install python-simplejson
```

これで必要なものはすべてインストールしたことになる。


## クライアントの設定
Ansibleでサーバからクライアントに接続するためには、公開鍵認証が必要になる。
しかし、わざわざお金をかけて認証局から証明書を発行してもらわなくても、自己証明書で十分なので自己証明書を用いて行う。
ただし、公開鍵で認証するのではなく秘密鍵を用いて認証を行う
今回はパスワードを設定を行わない。
必ず秘密鍵をサーバにコピーしておくこと

```
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/karuma/.ssh/id_rsa): ← Enterキーを押します
Created directory '/home/karuma/.ssh'. ← ~/.ssh がない場合、ディレクトリを作成します
Enter passphrase (empty for no passphrase): ← パスフレーズを入力します(今回は入力しない)
Enter same passphrase again: ← もう一度パスフレーズを入力します(今回は入力しない)
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/id_rsa*
$ chmod 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys
```

## サーバの設定
- ./ssh/config
- /etc/ansible/hosts     (任意の階層でよい)
- /etc/ansible/test.yml　(任意の階層でよい)

用意しなければいけないのは上記の3つである。
また、例を示すが自身の環境に合わせて適宜変えること。

```..ssh/config
Host IPアドレス
    HostName IPアドレス
    User test
    Port 22
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile "秘密鍵の絶対座標"
    IdentitiesOnly yes
    LogLevel FATAL
```

```/etc/ansible/hosts.
[all]
(IPAddress) ansbile_ssh_user=(UserName) ansible_ssh_private_key_file=(秘密鍵の絶対座標)

[all:vars]
ansible_sudo_pass=(sudoパスワード)
```
※Qiitaの仕様上"."を付けないとファイル名を指定できない為hostsの後に"."がついています。
(IPAddress) = 127.0.0.1
のように置き換えること

[test:vars]とすることで[test]に記述したすべての端末で同じ設定のものを指定することができる。
この例の場合はsudoパスワードを指定している

```yaml:/etc/ansible/test.yml
---
- hosts:all
  always_run:yes
  tasks:
    - name: shutdown
      Command: shutdown -h now
```

## 動作確認
Ansibleから管理する端末に向けて疎通確認ができることを確認する。

```
$ ansible all -m ping
```

![図３.png](https://qiita-image-store.s3.amazonaws.com/0/152941/7d1197b1-a768-91db-bc27-ccb64d7e6973.png)

このような表示になれば成功である。

次にシャットダウンを行ってみる。

```
$ ansible-playbook /etc/ansible/shutdown.yml --check -s
```

![図４.png](https://qiita-image-store.s3.amazonaws.com/0/152941/fc7f3ea2-e426-e8db-2974-59a051143119.png)

今回動作チェックを行うために"--check"を付けたが実際に使用する場合には必要ない。


~~また、この画像ではエラーを入れいるがこの原因は今後調べていこうと考えている。
しかし、これで正常に管理端末をシャットダウンすることが確認できている。~~
このエラーはAnsible側でSSH接続している最中に管理端末がシャットダウンすることでコネクションが切れることが原因であることが分かった。
なので、以下の内容に書き換えることで正常にAnsibleを終了することができる。
コマンドを"now"より"1"にしたことで1分後にシャットダウンを行うようになる。

```yaml:/etc/ansible/test.yml
---
- hosts:all
  always_run:yes
  tasks:
    - name: shutdown
      Command: shutdown -h 1
```
Windows10でのSoftEtherVPN Clientで仮想LANを複数使用する場合の注意点

windows7と10で微妙に違うようで。
結構ひっかかってしまったのでメモ。

Win7での
新規仮想LAN作成画面
![WS000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/127302/1c970585-f6a6-f93c-8547-d1b3d24f88b4.jpeg)

Win10での
新規仮想LAN作成画面
![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/127302/6ff9ed11-09f5-e54a-ad7c-65b11b9369cf.jpeg)

win10では
LANカードにつけられる名前に制限があるようで。

vpncmdでのNicCreateで作成していたため
この制限に気づけませんでした。。。
動画をダウンロードしづらくする方法(HTML5 videoタグを使って)

## 前提
- HTML5のvideoタグで動画を閲覧できるようにした上で、閲覧したユーザーがローカルへ動画をダウンロードすることを難しくしたい。
- HLSやRTMPといったストリーミングプロトコルを使わずに、sourceタグにmp4動画のURLを指定する形を想定。
- ある程度の知識と動機のあるユーザーでなければダウンロードしないよね、ぐらいのレベルでOK。
- サーバーはrailsで構築されている。
- http://ja.stackoverflow.com/questions/30927 で質問しているので、良い方法があればぜひ教えてください。

## 方法
今のところ、以下のような方法を考えついた。

- JavaScriptで動的にsourceタグを設定し、JavaScriptが無効化された状態での動画閲覧を制限する。その上で、JavaScriptでコンテクストメニューを無効化する。（コンテクストメニューにダウンロードオプションが表示されるため。）
念のため、コンテクストメニューの無効化というのは、jQueryの以下のコードで実現されるもののこと。```
$('video').contextmenu(function() {
  return false;
});
```

- リファラを動画閲覧ページのURLのみに制限する。

- URLにトークンを付与し、有効期限を設定する。（一度限りのトークンを設定しようと考えたが、chromeなどのブラウザはリクエストにRangeヘッダーを付けて複数回リクエストを送るようになっており、断念><。）

- sourceタグ内の動画URLにどのような文字列が入るのかわかりづらくするため、ソースコードを難読化する。（chromeのデベロッパーツールなどを見れば動画のURLが出てくるので、あまり意味がないかも。）

他にもダウンロードのハードルを上げるような方法があれば、教えてください><
Node.jsをCentOS7にインストール

#Node.js(v6 LTS)をCentOS7にインストール

yumリポジトリを追加
```curl --silent --location https://rpm.nodesource.com/setup_6.x | bash -```
Node.jsをインストール
```yum -y install nodejs```
nmpで必要らしいものをインストール
```yum install -y gcc-c++ make```

[Installing Node.js via package manager](https://nodejs.org/en/download/package-manager/#enterprise-linux-and-fedora "Installing Node.js via package manager")
LambdaにAPI Gatewayのステージ名を渡す


こんにちはsekitakaです。

Lambda関数を起動したAPI GatewayのAPIのステージによって、Lambda上の処理を変えたい場合があると思います。
そこで今回はLambdaへAPI Gatewayのステージ名を渡す方法を紹介したいと思います。

## LambdaにAPI Gatewayのステージ名を渡す手順
1. API Gatewayの任意のAPIを選択→統合リクエスト→本文マッピングテンプレート
2. Content-Typeは`application/json`を例に説明します。<br>

```json	
{
  "stage" : "$context.stage"
}
```
このように`stage`に`"$context.stage"`を記述することでLambda関数にステージ名を渡すことができます。swagger定義ファイルを使用している場合も同様に記述できます。
3. Lambdaでは以下のようにハンドラの引数`event`を経由してステージ名にアクセスすることができます。

```python:handler.py
def lambda_handler(event, context):
    stage = event.get('stage') # ステージ名を取得
    if stage == 'hoge':
        # 何かする
        pass
```

## 参考
[公式ドキュメント](http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html)にも記載がありますが、`$context`を経由して他にも色々な値をLambdaに渡すことができます。

## まとめ
いかがでしたでしょうか。このようにAPIの環境や状態によって処理を分けたい場合は`$context`を経由することで実現できます。
Atomのススメ

KIT Advent Calendar 6日目です!!

わたしがお話するのはGithub謹製のテキストエディタ「Atom」です
先に紹介されたSublime,Vimなど多くありますが今使っているのがAtomです

## 強み
* Windows環境でもインストールしやすい
* 豊富なパッケージ
* 多彩なテーマ　
* オープンソース!!
* marddownのプレビューが見れる

などなど他のエディタと比較すると十分なメリットがあるんじゃないかと...


## 導入方法
こちらのダウンロードしてください https://atom.io/

## パッケージを追加する
settingを開きます Ctrl+Commmaです
ここでパッケージだけでなくテーマなんかも変更できます
![atom_setting.png](https://qiita-image-store.s3.amazonaws.com/0/148754/668f5f5b-45b7-c9ee-f786-a1bb75c5426e.png)
今回はオススメパッケージを紹介します
### autocomplete-plus
https://atom.io/packages/autocomplete-plus
オートコンプリートで入力を補助してくれます
### encoding-selector
https://atom.io/packages/encoding-selector
エンコードを設定できます
### git-log
https://atom.io/packages/git-log
gitログを表示してくれます
なんと樹形図まで表示してくれます
### vim-mode
https://atom.io/packages/vim-mode
vimぽく利用することができるようになるパッケージ
### wakatime
https://atom.io/packages/wakatime
プログラミングしている時間を収集してくれるサービス
atomだけでなくAndroidStudioなど様々なエディタやIDEで対応しています
### sync-setting
https://atom.io/packages/sync-settings
今まで設定してきたsettingを他のコンピュータへも共有してくれるやつです。
導入とかはこちらの記事を参考にしてみたください。
http://qiita.com/T_M/items/0fb0804eb1fd256aac4e

などありますが簡単ですが今回はこれくらいで...
自分専用のエディタを作ってデベロップライフをエンジョイしましょう!!
他にも便利な機能があるので探してみてください

## おまけ
markdownエディタとしてデフォでshift+ctr+mでプレビューしながら編集もできます