OmniAICreator/Qiita-1.07M huggingface dataset:
参照を返す関数について

参照を返す関数の取り扱いについて、わからない点があったので、短いですが投稿します。

C++の以下のコードを実行したところ

```cpp
int global_int=0;
int &f(){
    return global_int;
}

int main(){
    f()++;
    cout << global_int << "\n";
}
```

---
```
1
```

となりました。しかし次のコードを実行したところ

```cpp
int global_int=0;
int &f(){
    return global_int;
}

int main(){
    int x;
    x = f();
    x++;
    cout << global_int << "\n";
}
```

---
```
0
```

となりました。この二つのコードが違う動作をする理由がわかりません。どなたか教えていただけないでしょうか？
1行で全てのUIButton(UIView)の同時押しを無効にする

全てのUIButtonの同時押しを無効にするには、Viewを再帰的に掘るしか方法が無いと思っていました。
思いつきで試してみたらできたので、今更ですがメモしておきます。

`UIButton.appearance().isExclusiveTouch = true`
もしくは
`UIView.appearance().isExclusiveTouch = true`

これだけです。`appearance`なのに見た目の設定ではないのでちょっと気持ち悪いですが...
UIViewの方なら、GestureRecognizerで実装している場合も含めて同時押し制御できるかもしれないです。

※動作は確認できていますが、意図された使い方ではない可能性もあり、今後のiOSのアップデートで予期せぬ動作をするようになるかもしれないのでご留意ください。
Tableauで市区町村レベルポリゴンを表示する

<b>この記事は2017年2月1日現在の情報です。</b>

#概要
BIツール「Tableau」には標準で地図上にマッピングする機能がついているが、
初期設定では都道府県レベルまでしかポリゴンがない。

政府の公開情報やマーケティングデータは市区町村で整理されているものも数多くあり、
これを可視化するには自分でポリゴンを準備する必要がある。

#環境
OS: Windows7
Tableauのバージョン: 10.1

<b>※朗報！　Tableauのバージョン 10.2 から空間ファイルコネクタがサポートされるようになりました。
　shpファイルが提供されている場合はそのまま使えます。
　提供されていない場合は、下記の方法を試してみてください。</b>

#手順
##データの準備
Tableauでは地図上のポイントをパスでつなぐことでポリゴン（閉じた領域）を表示するが、
地図上のポイントと認識するためには緯度経度情報が必要となる。
これは国土交通省政策局国土情報課のサイトからダウンロードすることができる。
[国土数値情報ダウンロードサービス](http://nlftp.mlit.go.jp/ksj/)

GML(JPGIS2.1)シェープファイル形式でダウンロード、ZIPを展開する。
下図はZIP内容物のサンプル（福岡県の行政区データを解凍したところ）

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/161809/3f77a98c-22b9-4f91-776a-c0ac7633150c.png)


この図で言えば、最下段の「N03-16_40_160101.xml」が緯度経度データの本体。
但し、TableauはXMLをそのまま取り込めないので、テーブル様の形式（CSV等）に加工しなければならない。
先ほどのXMLの一部を抜き出すと次のようになっている。

```N03-16_40_160101.xml
	<!--  図形 --> 
	<gml:Curve gml:id="cv0_0">
		<gml:segments>
			<gml:LineStringSegment>
				<gml:posList>
				33.86784628 131.00049789
				33.86786372 131.00000000
```

この場合、`gml`名前空間の`posList`要素に緯度経度が入っていることが分かる。
構造が分かれば、ExcelVBAでもPHPでもJavascriptでも何を使ってもいいので表の形に展開すればよい。
なお、行政区データはXML内に次のような3種類のデータがある。つまり表は3つできると考えてよい。

|要素|内容|
|---|----|
|gml:Curve|ひとつの領域。ひ孫要素に緯度経度情報を持つ|
|ksj:AdministrativeBoundary|市区町村名や地方公共団体コードなどの領域属性|
|gml:Surface|上記の2つを結びつけるためのxlink|

それぞれを整理しておけば、あとはTableauで結合できる。

##加工時の注意点
ひとつの閉じた領域を作るために、「どの点とどの点を結ぶか」という情報が必要になるが、
少なくとも行政区のXMLデータ内にはこの情報が無い。
そのため、表の形に展開するときに「ポイントをつなぐ順番」を書き加える必要がある。

ひとつの`posList`要素内に複数の緯度経度情報があるので、単純に上から順番に連番を割り当てればよい。
連番はIDごとでも良いし、全IDの通し番号でも良い。

##Tableauへの接続
データの準備ができたらTableauに接続する。
Tableau Desktopを立ち上げ、接続 -> ファイルを指定。
行政区データをExcelに接続したときのデータソースの例が下図となる。

![キャプチャ3.png](https://qiita-image-store.s3.amazonaws.com/0/161809/7c4e13f7-6b98-d431-7c8a-b114c849fcde.png)

行政区の場合は`Curve`要素の`gml:id`属性と`Surface`要素の中の`gml:curveMember xlink:href`属性を結合し、
`Surface`要素の`gml:id`属性と`AdministrativeBoundary`要素の`ksj:bounds xlink:href`属性を結合する。

データソースを構築したらシートに移動し、緯度を行、経度を列に入れて、マークタイプを「多角形」に変更。
ディメンションの「cityName」と「id」を詳細に入れて、加工時に割り当てた連番をパスに入れれば地図が出来る。

![キャプチャ0.PNG](https://qiita-image-store.s3.amazonaws.com/0/161809/e3ddcc72-0e74-c563-c6c0-fb2c60aabdfe.png)

上図の例では、マークシェルフの「curve_serial_number」が加工時に割り振った連番となっている。

実績データ（国勢調査や自社のマーケティングデータ）を可視化するときは、
別のデータソースに新しく接続し、データブレンディングで処理をするとレコードの重複が無いのでオススメ。

#まとめ
将来的にTableauが日本の市区町村レベルポリゴンを標準搭載する可能性が高いですが、
これを応用すれば「好きな地図を作る」ことが可能になります。

地図上で表計算を行う方法、ポリゴンを粗くする（ポイントを間引きする）方法についても
別途記事を作りたいと思います。
protractorのノウハウあれこれ

[Protractor](http://www.protractortest.org/)を利用していていろいろノウハウが溜まってきたので、残しておきます。
Angular.jsではないフレームワーク(knockout.jsを使ってます)を使って画面を構築しているアプリで、いい感じにテストできるように改善しています。

# Angular.jsではないフレームワークで利用するために

## Angular.jsとの同期を切る

まずはAngular.jsとの同期をオフにしておきます。
ProtractorはAngular.js用のE2Eフレームワークなので、Angular.jsの初期化が終わるまで待つ処理がデフォルトで入っています。
Angular.jsを利用していない場合にはオフにしておかないとエラーになります。
また、URLをgetする前に実行しておかないと意味ないので、注意しましょう。

```js
browser.ignoreSynchronization = true;
browser.get( url );
```

## エレメントを取得するとき、エレメントの存在チェックをする

knockout.jsなどのフレームワークでは、htmlを読み込んだタイミングでは、まだDOMが構築されておらず、非同期でいろいろな情報を取ってきたりしてからDOMを構築する、というような処理を行います。
ProtractorなどのE2Eテストフレームワークでは、htmlの読み込みが完了した時点でテストケースを実行するように作られているので、DOMの構築が終わっていない状態でテストを実行してしまう可能性があります。
そこで、エレメントに対して何か処理をする際、エレメントが見つかるまで待つ、という処理を入れてあげます。

```js
elementWrapper = function( locator ) {
  browser.wait( function() {
    return browser.findElement( locator ).then( function( element ) {
      return element.isDisplayed().then( function( isDisplayed ) {
        return isDisplayed;
      } );
    } )
    .catch( function( e ) {
      return false;
    } );
  } );
  return element( locator );
};

// element( by.id( "login" ) ).click();
elementWrapper( by.id( "login" ) ).click();
```

# テストコードを書きやすくする

## イベントをシミュレートできるようにする

Protractorではエレメントに対してクリックか文字入力くらいしかできませんが、スマホ対応しているアプリなどは、タッチイベントなども入力したいですね。
なので、jqueryのイベントを発生させられるようにします(アプリ側でjQueryが動作していないと利用できませんが)。
ElementFinderが`element( hogehoge )`の戻り値なので、こいつにメソッドを追加してやります。
browser.executeScriptを使えば、ブラウザ上で好きなコードを実行することができます。

```js:アプリ
$( "#login" ).on( "touchstart", function() {
  console.log( "start" );
} );
$( "#login" ).on( "touchend", function() {
  console.log( "end" );
} );
```

```js:テストコード
ElementFinder.prototype.simulate = function( event ) {
  this.getWebElement().then( function( element ) {
    browser.executeScript( function( el, e ) {
      $( el ).trigger( e );
    }, element, event );
  } );
};

// 1.5秒 エレメントを長押しする
element( hoge ).simulate( "touchstart" );
browser.sleep( 1500 );
element( hoge ).simulate( "touchend" );
```

これで、クリックだけでなくイベントを発生させることができるようになりました。
display:inline-blockでwidth 50%のliが崩れる件！

ちょっとネタが・・・汗

```css
ul li{
display: inline-block
width:50%;
text-align:left;
}
```

```html
<ul>
 <li>はじめの</li>
 <li>にこめの</li>
 <li>さんこめの</li>
</ul>
```
　↓
```html
<ul><!--
 --><li>はじめの</li><!--
 --><li>にこめの</li><!--
 --><li>さんこめの</li><!--
</ul>
```
みたいにしたら改行がないよりはちょっとましかなと
Middlemanでsitemap.xmlを生成する(lastmod付き)

Middlemanでsitemap.xmlを作りたかったので、以下の投稿を参考に作成しました。

- [Middlemanでsitemap.xmlを生成する](http://qiita.com/youcune/items/71e18e7bd5219b4a07f8)

この記事でも説明されているのですが、更新日(lastmod)を付けるための言及において、

- ファイルの更新日時を取得する
- Frontmatterでmodify_dateを定義しておく

という2パターンがあったのですが、ファイルの更新日時に関しては、`git pull`したらファイルの更新日時がpullした時間になってしまうという問題があります。

そこで、gitで管理しているんなら、gitで管理しているファイルの更新日時を取得すればいいんじゃないか？と考えて、ちょっと改変してみました。

```rb:sitemap.xml.builder
---
layout: false
---
require 'open3'

xml.instruct!
xml.urlset 'xmlns' => 'http://www.sitemaps.org/schemas/sitemap/0.9' do
  sitemap.resources.each do |resource|
    xml.url do
      xml.loc "http://www.example.com#{resource.url}"
      output, error, status = Open3.capture3("git log --pretty=format:%ci -n1 #{resource.source_file}")
      xml.lastmod output.split(' ').first
    end if resource.destination_path =~ /\.html$/
  end
end
```

Open3.capture3で、コマンドを実行した結果を標準出力に出したものをキャプチャします(変数`output`に)。
変数outputには`2017-01-26 11:51:18 +0900`のような形式でファイルの更新日時が入っているので、日付だけ取り出すようにしました。

結果は、以下のように。

```xml
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>http://www.example.com/foo/</loc>
    <lastmod>2017-01-19</lastmod>
  </url>
</urlset>
```

こっちのほうが楽かなと思う。
しかし、一覧ページなどの更新日時が反映されないかなという懸念点がある…。

## 参考URL

- [Middlemanでsitemap.xmlを生成する](http://qiita.com/youcune/items/71e18e7bd5219b4a07f8)
- [Rubyで外部コマンドを実行して結果を受け取る方法あれこれ](http://qiita.com/tyabe/items/56c9fa81ca89088c5627)
Debian

# Firefox Install

google-chromeよりもkeyborad shortcutの編集等が行いやすい。

```
apt-get remove iceweasel
apt-get update
apt-get install firefox-esr
```

# apt-get

時々testingやunstableにのみ存在するpackageをapt-getしたい場合がある。

下記ファイルを作成

```bash:/etc/apt/apt.conf.d/99target
APT::Default-Release "stable";
```

sources.listにtestingやunstableのaptlineを追加

```bash:/etc/apt/sources.list
deb http://ftp.jp.debian.org/debian testing main contrib non-free
deb-src http://ftp.jp.debian.org/debian/ testing main contrib non-free
```

（参考）
http://debian.fam.cx/index.php?AptGet#f2d52afb

# 日本語入力（fcitx）

```
# apt-get install fcitx-mozc
# im-config
# fcitx-configtool
```

非デスクトップ環境の場合（リモートログインしている場合など）は下記の設定を加える必要がある。

```bash:~/.profile
# set input method fcitx
export GTK_IM_MODULE=fcitx
export QT_IM_MODULE=fcitx
export XMODIFIERS=@im=fcitx
```

（参考）
https://wiki.archlinuxjp.org/index.php/Fcitx

# rsyncのexclude

```
rsync -av --exclude={.pyenv,Work} /home/ben /media/ben/backup/
```

# network設定

固定IP等の設定

```
# emacs -nw /etc/network/interfaces
# /etc/init.d/networking restart
```

nameserverについては、私の環境では以下のファイルが読まれているのでここを設定する必要あり。

```
# emacs -nw /etc/resolv.conf
```

# ntp

# nfs

# rsa
Lightningコンポーネント ($A)

####クラスの追加
`$A.util.addClass(modalP,'slds-fade-in-open');`
####クラスの削除
`$A.util.removeClass(modalP,'slds-fade-in-open');`
####クラスのtoggle
`$A.util.toggleClass(target, "slds-hide")` //slds-hide=>display:none

####他のコンポーネントの更新をリクエスト
`$A.get('e.force:refreshView').fire();`

#### QuickActionで表示したダイアログのクローズ
`$A.get("e.force:closeQuickAction").fire();`

#### 別のレコードへの移動
```
var sObectEvent = $A.get("e.force:navigateToSObject");
sObectEvent .setParams({
    "recordId": recordId,
    "slideDevName": "detail"
});
sObectEvent.fire();
```

####ログインユーザーIDの取得
`$A.get("$SObjectType.CurrentUser.Id");`
Exploratory でSQL Serverに接続する（ODBC）

# Exploratoryとは

[Exploratory](https://exploratory.io) は日本人エンジニアによるカリフォルニアのスタートアップが開発するRベースのBIツールです。Rベースで作られており、クエリーなどはdplyrの構文が使えたりとRを使いこなしている人にとっては、他のBIツールよりも親和性が高そうに感じるところが魅力です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/e9a46b74-14a6-545e-4cae-c0e617889925.png)


実際にPowerBIと比べてみても、ツールの使い勝手としては申し分無く、出来上がるビジュアルもセンスが良く、弊社でも適材適所で使い分けています。
日本人エンジニアによる開発ということもあり、日本語対応がびっくりするほどしっかりしており、日本語カラム名など何のそのです。マッピングなども今時ツールらしくしっかりサポートしており、当然ながら予測や回帰などのツールはRの機能をのものを使えるのでおそらく他のツールの追従を許さない豊富さです。特筆すべきは、PowerBIが弱いテキストマイニング系のツールがそろっており、日本語対応も相まって、非常に貴重な存在になっていると思います。

# データソース

[こちら](http://docs.exploratory.io/data_import.html)のように、データソースとして、RedShiftやBig Queryなど大規模系のリポジトリも対応しており、大手のBIツールと比べてもそん色無かったのですが、社内ではまだまだSQLServerを中心に使っているので、ODBCアクセスが欲しいと思っていたところ（フォーラムでリクエストしましたが）[最近のアップデート（V3.0）](https://blog.exploratory.io/exploratory-v3-0-released-ace2a16e7d91#.l63qa39rl)で対応してくれました！

早速社内で運用している、SQL Azureのノードに接続してみました。

# ODBCのセットアップ

SQL Serverを使っている人はだまって、[Microsoft SQL Server 用 ODBC Driver](https://msdn.microsoft.com/library/mt654048.aspx)を入れましょう。

Cortanaさんに”ODBC”と入れて、ODBCデータソースアドミニストレータを起動します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/06879200-28aa-1bb6-10d2-d404a2fff5c9.png)

システムDSNにSQL Server Native Client 11.0を使ってつなぎたいAzure SQL のノードの情報を設定します。基本的にはホストと接続情報を設定したDSN情報を作成するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/268f1682-76e4-3718-258d-0e2441ea5835.png)

# ExploratoryでODBC接続

あとはExploratoryで先ほど設定したDSNの情報を接続先として指定するだけです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/df9854e9-febe-8898-8f59-576ce45aabfe.png)

接続した後は普通のデータソースと変わりません。というかインポートするので同じデータフレームです。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/146939/c47e8e6d-5016-0a6e-7af3-c108e371982d.png)

Rを使うときはCSVに吐き出して検証することが多いですが、DBの中をのぞいて、軽くETLをやって、所望のグラフを出す、程度ならExploratoryで全部できてしまいますので、ODBCサポートは非常に助かりました！
argparseのファイル指定とパイプラインを切り替える

```shell
$ python egg.py -i some-list.list
```
```shell 
$ cat some-list.list | python egg.py
```
```shell 
$ python egg.py < some-list.list
```

こういうのを自動で切り替えるやつ。


```python
#!/usr/bin/env python3
# coding: utf-8

import argparse
import sys


parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('-i', '--inline', type=argparse.FileType('r'), default=sys.stdin, help='some list')

if __name__ == '__main__':
    args = parser.parse_args(args=sys.argv[1:])
    print(args.inline.read())
```

両方あった場合は-iのが優先されるんじゃないかな
ワンライナーでテスト用web APIをさらっと用意したい

# ユースケース
- 問題対応で、問題の再現のために、何らかのhttpのAPIを用意したい。
  + タイム・アウトするAPI
  + 固定のjsonを返すAPI など。
- とりあえずrubyが動くサーバーがある。
- railsとか用意するの面倒くさい。

# ruby標準webserver
webrick使う。

```sh
# ドキュメント公開。かんたんなapiスタブは可能
$ ruby -rwebrick -e 'WEBrick::HTTPServer.new(Port:8888, DocumentRoot:"./").start'

# かんたんなAPI
$ ruby -rwebrick -e 's=WEBrick::HTTPServer.new(Port:8888); s.mount_proc("/") {|req, res| res.body = "HELLO"}; s.start'
$ ruby -rwebrick -e 's=WEBrick::HTTPServer.new(Port:8888)' -e 's.mount_proc("/") {|req, res| sleep(5); res.body = "HELLO"}' -e 's.start'
```
JavaのGUIを別スレッドで立ててメインを生かす

# GUIをサブの処理で使いたい
GUIをメインの処理と別に立てたい場合の処理です。

例えば、言語処理系を記述していたとして
処理系が処理するスクリプトからフレームを作るように命令されたとき、
処理系はフレームを立てなければなりません。
これは`JFrame frame = new JFrame();`だけ実行すれば済む話でしょうが、
Frameにボタンをつけたり、描写したりするよう命令されると話は別です。
Canvasクラスをframeに追加したとします。canvasのpaintメソッドをオーバーライドしますが、paintメソッドはコーダが呼び出すのではなく、frame側が必要なとき呼び出すのです。

これは少し厄介です。本当は処理系がframeに描写命令を与えたいところですが、frameがcanvasに描写命令を出すのです。この流れだとcanvasが処理系を呼び出す破目になります。

今は言語処理系に限った話をしましたが、CUIからGUIの操作をしたい場合なども当てはまるでしょう。

# GUIをメインスレッドと別スレッドに立てる
Threadを継承したクラスでrunをオーバーライドします。
このrun内でGUIの生成を行います。そして、mainではGUIのクラス類には触らず、
このThreadを継承したクラスをstartして利用します。

# データのやり取りはLinkedBlockingQueueを使う
[クラスLinkedBlockingQueue](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/LinkedBlockingQueue.html)
このクラスはtakeするときは要素が来るまでthreadを待たせたり、簡単に排他制御を行えます。
GUIはこのキューを見ることで処理をこなしていきます。

# サンプル
以下のプログラムはlineの座標をキューで待たせておいて届いた順で描画しています。
 
![WS000044.JPG](https://qiita-image-store.s3.amazonaws.com/0/125554/ce6b8238-9bff-5c40-e229-c3aaa471e317.jpeg)

```java
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;

import javax.swing.JFrame;

public class Test {
	public static LinkedBlockingQueue<int[]> drawQueue = null;
	static {
		drawQueue = new LinkedBlockingQueue<int[]>();
	}

	public static void main(String[] args) {
		Thread canvasThread = new CanvasThread();
		canvasThread.start();
		Random rand = new Random(System.currentTimeMillis());

		for (int i = 0; i < 120; i++) {
			drawQueue.add(new int[] { rand.nextInt(CanvasThread.WIDTH),
					rand.nextInt(CanvasThread.HEIGHT),
					rand.nextInt(CanvasThread.WIDTH),
					rand.nextInt(CanvasThread.HEIGHT) });
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		drawQueue.add(new int[]{});

	}

}

class CanvasThread extends Thread {
	public static final int HEIGHT = 400;
	public static final int WIDTH = 600;

	@Override
	public void run() {
		JFrame frame = new JFrame("test");
		frame.setSize(WIDTH, HEIGHT);
		frame.setVisible(true);
		frame.add(new Canvas() {
			@Override
			public void paint(Graphics g) {
				System.out.println("print start");
				int[] x = null;
				Random rand = new Random(System.currentTimeMillis());
				try {
					while ((x = Test2.drawQueue.take()).length == 4) {
						g.setColor(new Color(rand.nextInt(256), rand
								.nextInt(256), rand.nextInt(256)));
						g.drawLine(x[0], x[1], x[2], x[3]);
					}
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("paint end");
			}
		});
	}

}
```
Npgsql 3.2.0 rocks !

### **npgsql** 
 - 3.2 just released
 - very easy to access PostgreSQL! :smiley: 
 - though need to clean the previous environment completely, otherwise causes troubles ...into nowhere...


### (added 2017-02-11) **How to use EF Core with npgsql - data first**
1. (install Powershell 5.0)
2. `
PM> Install-Package Microsoft.EntityFrameworkCore.Tools -pre
`
3. `
PM> Scaffold-DbContext "Host=localhost;Database=mydatabase;Username=myuser;Password=mypassword" Npgsql.EntityFrameworkCore.PostgreSQL
`
4. voilà　Postgres Table -> Class ORMapping Done !:thumbsup:

### Must READ this thread
 - https://github.com/npgsql/npgsql/issues/1299
 - and this
 - http://www.npgsql.org/doc/ddex.html
 
 * for me, it took me to remove all npgsql entries in all **machine.config** files and uninstall all npgsql related modules with Nuget Manager in VS2015.

 
### How to install
 1. https://github.com/npgsql/Npgsql/releases
 2. Download Npgsql.vsix  - **DONT DOWNLOAD Npgsql-3.2.0.msi**
 3. install NPgsql.vsix
 4.  voilà　:thumbsup:
 
![npgsql.jpeg](https://qiita-image-store.s3.amazonaws.com/0/114634/0286c1b6-e522-cd94-9139-44d61ef2e942.jpeg)
Amazon Linux にて pyenv-virtualenv でプロジェクト毎に python version と package が違う環境を用意する方法

## 前提

Amazon Linux と Ubuntu に pyenv を入れて Python 3.6.0 の環境を作る方法
http://qiita.com/rysk92/items/878fddbf23262628d89e

にて、pyenv を入れてあるものとする。

## virtualenv のインストール

```
pyenv install 2.7.13
pyenv global 2.7.13
pip install virtualenv
```

## pyenv-virtualenv

```
git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' > ~/.bash_profile
```

## 環境を作る

### 前提
例えば、

- 1. AWS Batch で動かす前提の Python 3.6.0 の hoge_batch というプロジェクト
- 2. AWS Lambda で動かす前提の Python 2.7.13 の hoge_lambda というプロジェクト

が欲しいとする。

それぞれプロジェクトのパスは下記とする。

- hoge_batch: /path/to/hoge_batch
- hoge_lambda: /path/to/hoge_lambda

### 環境の作成

```
pyenv virtualenv 3.6.0 hoge_batch
pyenv virtualenv 2.7.13 hoge_lambda
```

### 環境の設定

```
cd /path/to/hoge_batch
pyenv local hoge_batch

cd /path/to/hoge_lambda
pyenv local hoge_lambda
```

### 環境の切り替え

それぞれのプロジェクトのパスに移動すると、自動で切り替わる。

### 環境の設定の解除

プロジェクトのフォルダに .python-version というファイルができているので、それを削除すると、フォルダと環境の紐付けが消える。
Cognos 保存済みレポートにURLでアクセスする例

Cognos BI & Analyticsの各レポートにURLで直接アクセスする事ができますが、そのレポートの保存済みバージョンにアクセスする際のURLの書き方例です。

##環境
Cognos BI 10.2.2で、以下のようなフォルダに、BurstReportという名称で、PDF形式での保存済みレポートを作成しています。
![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/51ded6e3-b21f-f0ee-7856-43bbe3612e96.png)

以下のように、複数バージョン保存されていて、かつ、「Australia,Italy,United States」の国名でバーストされています。
![001.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/3dd6d37c-2baf-ba57-fd14-c70b341b3d56.png)


##書き方例
まず、レポートのプロパティから、Search pathを確認してください。
![002.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/d72bcaa8-51b8-5306-dcdf-4b848a869204.png)

レポートのバージョンが最新で、Italyのものにアクセスする場合、以下となります。
先ほど確認したSearch pathの値を、ui.object=に入れています。
http://localhost/ibmcognos1022/cgi-bin/cognosisapi.dll?b_action=cognosViewer&ui.action=view&ui.object=/content/folder[@name='Qiita']/folder[@name='SavedURL']/report[@name='BurstReport']/reportVersion[last()]/output[@burstKey='Italy']

レポートのバージョンが、2017/2/6 PM 2:53:07のもので、Australiaにアクセスする場合、以下となります。※時刻が14時ではなく、GMTの05時になっている点にご注意下さい。
http://localhost/ibmcognos1022/cgi-bin/cognosisapi.dll?b_action=cognosViewer&ui.action=view&ui.object=/content/folder[@name='Qiita']/folder[@name='SavedURL']/report[@name='BurstReport']/reportVersion[starts-with(@name,'2017-02-06T05:53')]/output[@burstKey='Australia']
docker swarm restarting node on AWS

### 目的
- awsなどで特に、メンテナンスのために勝手にdocker swarmのノードが再起動されることがあるのでその時の挙動について確認したい。

### 環境
- AWSでt1.smallを２つ使い、1master/1workerで動かす
- 全体をシャットダウンはせず、どちらかのノードが再起動した場合の挙動を確認する

### 結果
##### masterの再起動(docker-machine stop/start)
- 1masterなので当然だが、クラスタ全体が動作しなくなる
- stop/startで再起動したため、ip addressが変更され、docker-machine regenerate-certsすることになった。
- regenerate-certs後は特に問題なくクラスタが利用できるようになった。またシャットダウン時に定義されていたサービスも全て元に戻った

##### masterの再起動(docker-machine restart)
- 再起動自体はすぐに終了するが、masterがdockerコマンドに反応しなくなった。

```
mgo-stage-m     *        amazonec2    Running   tcp://ADDR:2376           Unknown   Unable to query docker version: Get https://ADDR:2376/v1.15/version: dial tcp ADDR:2376: getsockopt: operation timed out
```

- やがてtimeout状態になったが１０秒ほどで復旧し、サービスも元の状態に戻った
  - raftに参加しているノードがなくなったので、state machineをsnapshot+logから復旧したりするからだろうか。

##### 2 masterの再起動(docker-machine restart)
- raftのせいで復旧が遅い疑惑があったので、複数マスターのある状態で再起動を試す
- 結果として、workerをpromoteした場合でもやはりしばらくtimeout状態が続く上に、２つのノードがrunningになった後でもサービスは復旧しなかった。(rpc timeout)
- こういうログが延々とで続けているため、おそらくleaderになるためのquorumが取れていない。2ノードなのがよくないのだろう。

```
Feb  6 04:21:03 mgo-stage-m dockerd[777]: time="2017-02-06T04:21:03.967920435Z" level=info msg="62ebaabf99cd5c24 [logterm: 5, index: 9327] sent vote request to 7df4e98a03f59f91 at term 151"
Feb  6 04:21:06 mgo-stage-m dockerd[777]: time="2017-02-06T04:21:06.244817897Z" level=error msg="agent: session failed" error="session initiation timed out" module="node/agent"
```

##### 3 masterの再起動(docker-machine restart)
- 2 masterで復旧しなくなったので、3 master (0 worker)での挙動も確認した。
- 3 masterの場合、leaderが死んでも迅速にleaderは別のノードに受け継がれ、１分弱で再起動したノードもdocker node ls上でactiveになり接続もできるようになった。

##### workerの再起動
- 時々dockerの起動確認で以下のようなエラーがしばらく出続けた以外は問題なくサービス全体が復旧した
  
  ```
    Error running SSH command: ssh command error:
    command : netstat -tln
    err     : exit status 255
    output  : 
  ```

### まとめ
- 2マスターのdocker swarmは再起動によって復旧不能な状態になることがある。quorumの教科書で習うように、マスターは奇数にする。
- modeがglobalなサービスの場合、アクセスがあったnodeに立ち上がっているサービスに接続されると考えていたが、globalであっても内部的なロードバランスによって接続しに行ったのと別ノードのサービスに接続されることがある模様。
  - EDIT: docker service createにおいて、-p PORT:EXPORT ではなく、--publish mode=host,published=PORT,target=EXPORT を使うことでhostモードでコンテナを立ち上げれば各ノードに来たコネクションはそのノードのglobalサービスが受けるようにできる。同時にclientのraw ipがわかるのでありがたい。
LangIDについて



[LangID](https://github.com/saffsd/langid.py)とは Language Identification(言語特定) を行うライブラリ。
文字列を入力として与えると、その文字列がどの言語のものかを示してくれる。

シンプルな使い方は以下の通り。

```python
# -*- coding: utf-8 -*-
import langid

result = langid.classify('これは日本語です')
print(result)  #=> ('ja', -197.7628321647644)
```

このライブラリのアルゴリズムは公知の研究から作られていて、[こちら](https://github.com/saffsd/langid.py#read-more)から参考文献が得られる。


気になる点としては、速度に難がある。
上記のシンプルなテストで3秒近く要するため、リアルタイム性が重要なWebの世界ではあまり使えない印象。
Chocolateyインストールメモ

## 概要

* Chocolateyを(会社の)Windows7マシンに(こっそりと)インストールしたはなし。
* 普段はmsys2使ってるんですが、rubyの勉強会で教えてもらい、なんか色々とパッケージありそうなので試してみました。
* この記事には特に有用な情報はないかもしれませんょ。

## インストール方法

基本的には、 [Chocolateyを使った環境構築の時のメモ] を参考にさせて頂きました。

ただ、ウチの環境の場合、プロキシがあるわ、何故か名前解決ができないわで、
install.ps1をg:\\に予めダウンロードしておき、(`chocolateyProxy`という変数に値を入れといても良いみたいですが) 
`$explicitProxy = "http://xxx.xxx.xxx.xxx:xxxx"` (ダブルクォートがミソ)
のようにプロキシの設定を直書きして、コマンドプロンプトから以下のコマンドを叩きました。

```
C:\>@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex g:\install.ps1" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"
```

どうでも良いですが、コマンドプロンプト使うなら [Clink - Powerful Bash-style command line editing for cmd.exe] が超便利でございます。

インストールした後、また別途プロキシの設定は必要のようです。

```
> chocolatey.exe config set proxy http://xxx.xxx.xxx.xxx:xxxx
Chocolatey v0.10.3
Updated proxy = http://xxx.xxx.xxx.xxx:xxxx
```

## コマンドメモ

そもそも `chocolatey.exe` ではなくて `choco` とだけ打てば良いみたい。

* `choco list`: パッケージ一覧を表示。
* `choco search [パッケージ名]`: パッケージ検索。正規表現は使えないようだ。
* `choco install [パッケージ名]`: パッケージのインストール。
* `choco --help`: ヘルプ。ハイフンいるんだ……。

## 使ってみた

上で紹介した Clink のパッケージもあるよ!!
うっかり clink のウィンドウから実行して「なんで失敗するんだ……」なんてことをやってたのは内緒です。

```
>choco install clink
Chocolatey v0.10.3
Installing the following packages:
clink
By installing you accept licenses for the packages.

clink v0.4.8 [Approved]
clink package files install completed. Performing other installation steps.

... snip ...

Failures
 - clink (exited 2) - Error while running 'C:\ProgramData\chocolatey\lib\clink\tools\chocolateyInstall.ps1'.
 See log for details.
```

## 参考サイト

* [Chocolateyを使った環境構築の時のメモ]
* [Clink - Powerful Bash-style command line editing for cmd.exe]

[Chocolateyを使った環境構築の時のメモ]:http://qiita.com/konta220/items/95b40b4647a737cb51aa
[Clink - Powerful Bash-style command line editing for cmd.exe]:https://mridgers.github.io/clink/
htmlの表示・非表示を切り替える処理

#内容

html内の一部の表示・非表示を切り替える処理。
以下、clickボタンを押下して、pタグの表示を切り替えます。

```css:html
<button>click</button>
<p>表示・非表示する要素</p>
```

##非表示処理

```css:非表示にする処理
$('button').click(function(){
    $('p').hide();
});
```

下記処理と同様。

```css:非表示にする処理2
$('p').css('display', 'none');
```


##表示処理

```css:表示する処理
$('button').click(function(){
    $('p').show();
});
```


下記処理と同様。

```css:表示する処理2
$('p').css('display', 'block');
```


##切り替え処理

```css:表示・非表示を切り替える処理
$('button').click(function(){
    $('p').toggle();
});
```
※表示状態によりhide,showを切り替えます。




###リファレンス
■show()
http://js.studio-kingdom.com/jquery/effects/show

■hide()
http://js.studio-kingdom.com/jquery/effects/hide

■toggle()
http://js.studio-kingdom.com/jquery/effects/toggle
openBDのAPIライブラリをGoでつくりました

[openBD](https://openbd.jp)は2017年1月に開始された日本の書籍データを提供するAPIサービスです。

公式サイトで

> 私たちopenBDプロジェクト（カーリル・版元ドットコム）は書誌情報・書影を、だれでも自由に使える、高速なAPIで提供します。

と謳っている通り、登録不要で高速なレスポンスをJSON形式で返す、便利で使いやすいサービスとなっています。

これまで日本では、書籍データを網羅的かつ利用可能な形で取得できるサービスは実質AmazonのProduct Advertising API（と網羅性は劣りますが[版元ドットコム](http://www.hanmoto.com/about_api)）くらいしかなかったので非常に画期的なAPIといえます。個人的に期待大です。

そこでこのAPIにGoで利用するためのライブラリを作りました。

https://github.com/seihmd/openbd

## openBD APIの概要

### １冊分の情報を取得する
`/get?isbn=ISBN`

- ISBNはISBN10、13、ハイフン区切り、ハイフンなしに対応

https://api.openbd.jp/v1/get?isbn=978-4-7808-0204-7&pretty

### 複数冊の情報を取得する

`/get?isbn=ISBN,ISBN`

- ISBNをカンマ区切りで記述
- 1000冊まで指定可

https://api.openbd.jp/v1/get?isbn=978-4774183923,978-4621300251&pretty

その他、収録範囲すべてのISBNコードを取得するcoverage APIやJSONスキーマを取得するAPI、一万冊までのリクエストに対応するPOSTリクエストなどありますが自分の中で需要がないのでライブラリには実装していません。

### その他API仕様の参考

レスポンスデータ仕様
[OpenBD 書誌APIデータ仕様 (v1)](https://openbd.jp/spec/)

公式サイト->配布資料からアクセスできるpdf
openBDの概要、参加出版社、そして最後のページにクライアント側からのAPI利用方法が載っています。
https://openbd.jp/pdf/openBD_doc_20170123.pdf

## 使い方

```go
o := openbd.New()

// 一冊の情報を取得
book, err := o.Get("477418392X")
if err != nil {
    ...
}
book.GetISBN() // 477418392X

// 複数冊の情報を取得 1000冊まで可
isbns := []string{"9780061234002", "9780071123419"}
books, err := o.GetBooks(isbns)
if err != nil {
    ...
}
for _, book := range *books {
    if !book.IsValidData() {
        // ISBNコードの一致するデータがなかった
    }
}
```

ISBNコードやタイトルなど基本的なプロパティにはGetterを作っています。
自分の需要の範囲で作っているので他のが必要な場合はプルリクかフォークでお願いします。

https://github.com/seihmd/openbd/blob/master/book_func.go

## その他注意点など

### 書籍によってプロパティの有無が異なる

APIデータ仕様をみても分かる通り、かなりプロパティの数が多いです。これはおそらく版元ドットコムがもともと持っていたデータやその他データ提供社のデータ仕様を統合して最小公倍数的に提供するためだと思います。
そのためAPIデータ仕様にあるプロパティが欠けている（JSONレスポンス自体に存在しない）場合がよくあります。書籍データを取得した後に実際に目的のデータがあるかどうかは見てみないとわかりません。

### structが完全でないかも

API仕様書や実際のデータをもとに[Book struct](https://github.com/seihmd/openbd/blob/master/book_struct.go)を作っていますがプロパティの数が多いので抜け漏れあるかもしれません。テストで500冊弱のマッピングを通しているので大抵の本はいけるつもりですが、もしも失敗する書籍データがあれば教えてほしいです。

https://github.com/seihmd/openbd/blob/master/book_struct.go

### ISBNのチェックについて

OpenBD.GetおよびGetBooksの中では渡されたISBNコードの妥当性をチェックしていません。
ISBNチェックのユーティリティを作っているのでもし必要な場合はぜひ使ってください。

https://github.com/seihmd/goisbn
RDSでgeneral_logとslow_logテーブルをクリアする方法

general_log や slow_log の保存先がTABLEにしておくと mysql.general_log とかにレコードが増えていくが、RDSだとこれらのテーブルを直接TRUNCATEとかは出来ない。その代わりにRDSではそれらのログをローテーションするプロシージャが用意されているのでそれを読んでやることで削除が出来ます。
このプロシージャは1回実行すると *_backup というテーブルにリネームするだけなのでまだ削除はされません。ただし1世代しか保存されない作りなので2回実行してやることで完全にレコードを削除することが出来ます。

```sql
call rds_rotate_general_log;
call rds_rotate_general_log;
call rds_rotate_slow_log;
call rds_rotate_slow_log;
```
pumaのバグ？port変更しても強制的に3000をlistenしてしまう時の対処メモ

## 現象

- サーバ起動オプションでポート3030を指定したのに、listenするポートが3000に変わっている。

```bash
$ rails s -p 3030
=> Booting Puma
=> Rails 5.0.1 application starting in development on http://localhost:3030
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.7.0 (ruby 2.4.0-p0), codename: Snowy Sagebrush
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:3000
Use Ctrl-C to stop
```

## 対処

- webrickを使ってる時はこんなことはなかった。
- ググっているといろんな人が「pumaのバグなんじゃないのか？」と言ってる。
- 一時的にはこのように現象を回避する

```bash
env PORT=3030 rails s
```

これで

```bash
* Listening on tcp://0.0.0.0:3030
```
を得ることができる。

とりあえずメモ。
[rails] app下に新しく置いたディレクトリがロードされない時


##現象
appの下にservicesというディレクトリを置いてもロードされず、`NameError: uninitialized constant`でクラスが読めません。

##環境
- Ruby 2.3.3
- Rails 5.0.1

##結論
Springを一度停止したところloadされるようになりました。

##Before
```
server git:(master) ➜  bin/rails runner 'puts ActiveSupport::Dependencies.autoload_paths'
Running via Spring preloader in process 54908
/Users/y1row/src/github.com/app/server/app/assets
/Users/y1row/src/github.com/app/server/app/channels
/Users/y1row/src/github.com/app/server/app/controllers
/Users/y1row/src/github.com/app/server/app/controllers/concerns
/Users/y1row/src/github.com/app/server/app/helpers
/Users/y1row/src/github.com/app/server/app/jobs
/Users/y1row/src/github.com/app/server/app/mailers
/Users/y1row/src/github.com/app/server/app/models
/Users/y1row/src/github.com/app/server/app/models/concerns
/Users/y1row/src/github.com/app/server/app/serializers
```

##Spring停止
```
server git:(master) ➜  bin/spring stop
Spring stopped.
```

##After
```
server git:(master) ➜  bin/rails runner 'puts ActiveSupport::Dependencies.autoload_paths'
Running via Spring preloader in process 54986
/Users/y1row/src/github.com/app/server/app/assets
/Users/y1row/src/github.com/app/server/app/channels
/Users/y1row/src/github.com/app/server/app/controllers
/Users/y1row/src/github.com/app/server/app/controllers/concerns
/Users/y1row/src/github.com/app/server/app/helpers
/Users/y1row/src/github.com/app/server/app/jobs
/Users/y1row/src/github.com/app/server/app/mailers
/Users/y1row/src/github.com/app/server/app/models
/Users/y1row/src/github.com/app/server/app/models/concerns
/Users/y1row/src/github.com/app/server/app/serializers
/Users/y1row/src/github.com/app/server/app/services ←増えた
```
ECS(Beanstalk Docker)でlambdaを使ってcron設定

ECS(Beanstalk Docker)の場合、docker内でcronを設定するのに悩むと思いますが、
lambdaを使ってお手軽cronを設定できたので簡単にメモ

# SSMのインストール
ECSインスタンスに入ってdocker runを叩きたいのですが、
今回はSSMというものをインストールし、こいつをlambdaのpythonから呼び出す方針です。
http://dev.classmethod.jp/cloud/aws/introduce-to-run-a-command-button-for-linux/

ECSのsshでログインして、以下のコマンドでssm-agentをインストールして下さい。
amazon-ssm-ap-northeast-1のところが重要で、ここを間違えると動きません。

```
sudo yum -y update
curl https://amazon-ssm-ap-northeast-1.s3.amazonaws.com/latest/linux_amd64/amazon-ssm-agent.rpm -o amazon-ssm-agent.rpm
sudo yum install -y amazon-ssm-agent.rpm
```

# ECS(EC2)のロールにAmazonEC2RoleforSSMをアタッチ
ECS(EC2)に紐付いているロールにssm-agentへのアクセス権限を与えるために、
AmazonEC2RoleforSSMをアタッチして下さい。

自分の場合はロールはaws-elasticbeanstalk-ec2-roleだったので、
こいつにAmazonEC2RoleforSSMをアタッチします。


# EC2のコマンド実行が出来るか確認
EC2のコンソール画面でコマンド履歴という項目があると思いますが、ここでコマンド実行をクリックし、
AWS-RunShellScriptを選択した時に上記で設定したインスタンスが表示されるか確認して下さい。
これが出てこないのであれば上の設定がミスってるので確認して下さい。

※ アタッチして即、出るわけではないみたいです。少し待ってみましょう

#lambdaの設定
こちらを参考にしました
http://dev.classmethod.jp/cloud/aws/lambda-ssm-pseudo-cron/

docker runを呼び出すことで、コンテナ内のコマンドを実行できます。
いつもは -it をつけていると思いますが、今回はttyに出力するわけでないのでtは不要です
ここでtをつけると動かないので注意

ssm-agentをインストールしたインスタンスから、一つを選んで実行する感じです。
ssm-agentのインストールを手動でやってますが、インスタンスが増えた時に
自動で行えたほうがいいのですが、スマートなやり方がわかりません。誰かいい方法知ってる人いたら教えてください。

```python
import boto3
import logging
 
logger = logging.getLogger()
logger.setLevel(logging.INFO)
 
ec2 = boto3.client('ec2')
ssm = boto3.client('ssm')
 
def lambda_handler(event, context):
    try:
        ec2_resp = ec2.describe_instances(Filters=[{'Name':'tag:Name','Values':['hogehoge_production']}, {'Name':'tag:ssm-agent','Values':['installed']}] )
        instances = [i["InstanceId"] for r in ec2_resp["Reservations"] for i in r["Instances"]]
        instances = instances[0:1] 
        
        logger.info(instances)
 
        ssm.send_command(
            InstanceIds = instances,
            DocumentName = "AWS-RunShellScript",
            Parameters = {
                "commands": [
                    "sudo docker run --rm -i $(sudo docker ps |grep hoge-production | head -n 1 | awk '{print $2}') rails r Hoge.hogehoge >> /tmp/lambda_cron"
                ],
                "executionTimeout": ["3600"]
            },
        )
        
    except Exception as e:
        logger.error(e)
        raise e
```

# cronの設定
TriggerでCloudWatch Events - Scheduleを選択して、
Schedule expressionのところに　　cron(5 * * * ? *) など
任意のスケジュールを設定すれば完了です。

便利な機能ですが、Schedule expressionの説明が薄い上に、
selectになってるのに、文字列を貼り付けて
登録するUIってのはどうなんですか？ Amazonさんw
http https について

###http　と https（SLL） について の違いについて
---
実はスポーツ少年だった私ですが、野球で例えるならば、直球と魔球くらい違うというと分かりやすいでしょうか？

httpとは　WEBページを呼び出すための呪文みたいなもので

httpsとはセキュリティ機能がついたもの、Webページとの通信に暗号化をかけたものです。

特に「フォームなどで入力してもらった個人情報などを不正アクセスから守る」ための方法ですので今後のアプリ作成には重要なことですね。

###「アップル、iOSアプリのHTTPS通信義務化を延期。」という記事があって
---
アップルが、2017年1月1日から全iOSアプリを対象に実施するとしていた App Transport Security (ATS)適用の義務化を延期すると発表があり、アプリ開発者に猶予が与えられた。。若干ホッとしている部分がありますが、、、

対応は必要だよなぁっと　頭を抱えている日々です。。。

## 関連記事

【About】(http://qiita.com/sunstripe) - サンストライプ

---

## 制作チーム：サンストライプ

[![sunstripe_logo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/80600/322f2d60-f19d-af9e-2b6f-7290ca546848.png)](http://sunstripe.main.jp/)
http://sunstripe.main.jp/

(月１WEBコンテンツをリリースして便利な世の中を作っていくぞ！！ボランティアプログラマー/デザイナー/イラストレーター/その他クリエイター声優募集中！!)

### 地域情報 THEメディア
THE メディア 地域活性化をテーマに様々なリリース情報も含め、記事をお届けしてます！！
https://the.themedia.jp/

### ゼロからはじめる演劇ワークショップ
多様化の時代に向けて他者理解を鍛える

https://workshop.themedia.jp/

### プログラミングワークショップ・ウェブ塾の開講！！！
様々なテーマでプログラミングに囚われずに取り組んでいきます。
詳しくはこちら　↓　↓　↓　↓　↓　↓　↓　↓
[プログラミングサロン 月１だけのプログラミング学習塾](https://workshop.themedia.jp/posts/7057553?fbclid=IwAR32CfRQ7RvDOhvuogoSwqxDLMOU7Jvuzljlnx-TMc27qBPX1BnWsfLcBR8
)

### 協力応援 / 支援者の集い
## チーム：サンストライプ
#### プログラミングラボ
https://twitter.com/sunstripe2011

一緒にポートフォリオを作りませんか？現場の体験やそれぞれの立場から年齢関係なく作品を作りたい方々と一緒にチームを作って、作品を作っています。現場に行きたい人には、職場紹介や職場の体験や悩み相談なども受けております。
様々な職種からプログラミングの知識を得たい、デザインの知識を得たい、データーベースの知識を得たいという人が集まっております。
週１のミーティングにそれぞれの近況と作業報告して、たまにリモート飲み会などをしております！！

興味がある方は、DMに話しかけてみてください。

## トラストヒューマン
http://trusthuman.co.jp/
私たちは何よりも信頼､人と考えてます｡

｢コンサルティング｣と｢クリエイティブ｣の両角度から｢人材戦略パートナー｣としてトータル的にサポートします！！

キャリア教育事業
広域学習支援プラットフォーム『のびのび日和』
https://slc-lab.amebaownd.com/

#スポンサー募集
【メモ】FW、IPS、WAF

![Fig 1.png](https://qiita-image-store.s3.amazonaws.com/0/134166/211eef86-2e3f-ad1b-c743-efc8b0f565e0.png)
![OSI-Layer-Please-Do-Not-Tell-Secret-Passwords-Anytime-blackMORE-Ops-1.png](https://qiita-image-store.s3.amazonaws.com/0/134166/734992f9-1a43-8e3d-5d74-65943b47657c.png)
![Osi-model.png](https://qiita-image-store.s3.amazonaws.com/0/134166/74c80725-12e8-d4be-d390-538c52bbc759.png)
![0410-3-fig02.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/fc58b393-cd88-79c5-467a-020f8bc18794.jpeg)
![big-ip_about_01.jpg](https://qiita-image-store.s3.amazonaws.com/0/134166/12a43eac-73a8-9c57-4515-f3b47684ef7a.jpeg)
【検証】本当にiPhone（デバイスピクセル比2）だと 1px が 2px で表示されるの？

# **検証方法**

今回、iPhone6（デバイスピクセル比2）の環境で検証します。
このような環境で `<meta name="viewport" content="width=device-width">` を指定すると HTML / CSS 上 で `1px` と指定しても、実際の画面上では `2px` で表示されます。
文章中の言葉はそれぞれの下記の意味です。

|文章中|意味|
|:--|:--|
|HTML / CSS 上|CSSピクセル（論理ピクセル）|
|実際の画面上|デバイスピクセル（物理ピクセル）|

本当に `2px` で表示されるのか確かめます。
下記のように `1px` の線を指定したHTMLファイルをiPhone6で表示します。

```html:HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width">
<title>iPhone - test</title>
<style>
body { background: #000; padding: 20px; }
.bar { width: 100px; height: 100px; border: 1px solid #fff; }
</style>
</head>
<body>
<div class="bar"></div>
</body>
</html>

```

iPhone6の画面をマイクロスコープ（商品：handymicron3、光学ズーム：250倍、デジタルズーム：4倍）で撮影しました。

# **結果**

画面上に表示された矩形の右下角を撮影しました。

![iPhone6-resize.jpg](https://qiita-image-store.s3.amazonaws.com/0/72985/1c426cad-5e7d-5bef-4b83-2b5fb9a5259b.jpeg)

**本当に HTML/CSS で 1px と指定したものが、画面上では 2px で表示されました。**

# note

note でも記事を公開してるので、興味がある方はご覧ください。

・[【初学者向けコードリーディング】 PHP の TODO アプリのコードを一緒に読み解こう](https://note.mu/7968/n/n46a8beb87c93)
predisとredis extensionの速度を比較してみた。

#まえがき

phpでredisを使う場合、今まではextexsionを使っていたんだけどlaravelだとpredisを採用しているので簡単に性能を比較してみました。

サンプルコードは以下の通り

```sample.php
<?php

$end_loop = 50000;

$ext = new redis();
$ext->connect('localhost');

include 'vendor/predis/predis/autoload.php';
$predis = new Predis\Client('tcp://127.0.0.1:6379');

$ext->set('hogehoge','fugafuga');

echo '--- get ---' . PHP_EOL;
// redis extension 読み込み
$start = microtime(true);
for($i=0;$i<$end_loop;$i++){
        $ext->get('hogehoge');
}
printf("phpredis %f\n",microtime(true) - $start);

// predis 読み込み
$start = microtime(true);
for($i=0;$i<$end_loop;$i++){
        $predis->get('hogehoge');
}
printf("predis   %f\n",microtime(true) - $start);


echo '--- set ---' . PHP_EOL;
// redis extension 書き込み
$start = microtime(true);
for($i=0;$i<$end_loop;$i++){
        $ext->set('hogehoge',12345);
}
printf("phpredis %f\n",microtime(true) - $start);

// predis 書き込み
$start = microtime(true);
for($i=0;$i<$end_loop;$i++){
        $predis->set('hogehoge',12345);
}
printf("predis   %f\n",microtime(true) - $start);


```

今のところの想定ではgetとsetが大半なのでこの二種類で検証。

# 結果

php-5.6.30でやってみた。

```
--- get ---
phpredis 7.943276
predis   11.579012
--- set ---
phpredis 9.351953
predis   11.512340
```

extensionの方が速いですね。

php-7.0.13でもやってみた。**違うPCなのでphpのバージョン間の性能差は参考にはなりません**

```
--- get ---
phpredis 0.560895
predis   1.281387
--- set ---
phpredis 0.580832
predis   1.239677
```

やっぱりextensionの方が速いですね(倍以上でてる)。

# まとめ

結論としてはextensionの方が高速でphp-7での性能差は顕著でした。とは言ってのphpの場合ライブラリの性能がネックになることはあまりなさそうなので使いやすい方でいいかと思います。
HaskellでSlack bot (RTM API)

# はじめに
SlackでBotを書きたいけど、Hubotは使いたくないし、なによりJavascriptを書きたくない。
でも直にReal Time Messaging APIを叩きに行くのはしんどい。

Hackageにいい感じのライブラリないかな…→ありました
https://hackage.haskell.org/package/slack-api

ということで、覚えたてのHaskell stackを使って、RTM APIを叩きに行くサンプルを作りました。
今回はgithubに載ってたEchoBotを動かすとこまで。

# Slack bot
まずはbotのtokenを発行します。
https://slack.com/apps/A0F7YS25R-bots
(無料プランだとintegrationは10個までなので気をつけてください)
適当にUsernameを決めると謎の文字列(token)が手に入ります。魔法の呪文なので公開しないように。

もうこの時点で[API document](https://api.slack.com/methods)のやつが使えるので、適当に

```
$ curl "https://slack.com/api/api.test" -X POST -d "token=xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"
```

とかやるとjsonが帰ってきます。

```json
{"ok":true,"args":{"token":"xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx"}}
```

お手軽ですね。
[chat.postMessage](https://api.slack.com/methods/chat.postMessage)とかもあります。一通り遊んでみましょう。

# Haskell stack
[stack](https://docs.haskellstack.org/en/stable/README/)が神すぎて泣いてます。
How to installに書いてある一行でインストールできるので今すぐ入れましょう。

適当な作業directoryで

```
$ stack new my-bot && cd my-bot
```

するといい感じのtemplateができます。

slack-apiはStackageには入ってないようなので、extra-depsに書きます。

```diff
diff --git a/stack.yaml b/stack.yaml
index 45ed1cb..754e7ac 100644
--- a/stack.yaml
+++ b/stack.yaml
@@ -39,7 +39,8 @@ packages:
 - '.'
 # Dependency packages to be pulled from upstream that are not in the resolver
 # (e.g., acme-missiles-0.3)
-extra-deps: []
+extra-deps:
+- slack-api-0.11
```

そしてmy-bot.cabalに依存関係を書きます。

```diff
diff --git a/slackbot.cabal b/slackbot.cabal
index 75da504..041d58c 100644
--- a/slackbot.cabal
+++ b/slackbot.cabal
@@ -25,6 +25,7 @@ executable slackbot
   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
   build-depends:       base
                      , slackbot
+                     , slack-api
   default-language:    Haskell2010

 test-suite slackbot-test
```

いったんbuildしてみます。結構時間がかかると思います。

```
$ stack build
```

これだけでslack-apiが使えるようになりました。

# サンプルコードを動かす

[slack-apiのgithub](https://github.com/mpickering/slack-api)にあるExampleを動かしてみます。
app/Main.hsをまるっと以下で書き換えます。

```haskell
module EchoBot where

import Web.Slack
import Web.Slack.Message
import System.Environment (lookupEnv)
import Data.Maybe (fromMaybe)
import Control.Applicative

myConfig :: String -> SlackConfig
myConfig apiToken = SlackConfig
         { _slackApiToken = apiToken -- Specify your API token here
         }

echoBot :: SlackBot ()
echoBot (Message cid _ msg _ _ _) = sendMessage cid msg
echoBot _ = return ()

main :: IO ()
main = do
  apiToken <- fromMaybe (error "SLACK_API_TOKEN not set")
               <$> lookupEnv "SLACK_API_TOKEN"
  runBot (myConfig apiToken) echoBot ()
```

そしてbuild。

```
$ stack build
```

起動。

```
$ env SLACK_API_TOKEN=xxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxx stack exec my-bot-exe
```

botがオンライン状態になると思います。DMを送ってみましょう。
![slack.png](https://qiita-image-store.s3.amazonaws.com/0/163933/a66cb158-5ca5-319a-cb53-954d1ee88de2.png)

OK. オウム返しBOTの完成です。

# まとめ
Haskell Stackを使ってSlackのRTM APIを叩くライブラリを扱えました。
stack.yamlとmy-bot.cabalの連携が最初よくわからなかったんですが、stackがここにこう書けばいいよ～って教えてくれたりしてすごかったです。
stack便利だなぁ

今回はデプロイまでは扱いませんでしたが、サーバって感じでもない(外部にポート晒したりしない)のでローカルで動かしておけばいいのでは？って感じもします。

どうでもいいけどslackとstackをよく見間違えます。
auto increment な主キーを uuid に変更する

rails デフォだと 数値の主キーになるので、それを uuid を利用するように変更する。
変更は簡単なんだけど、 リバーシブルに作るのが辛かったのでメモ。
DBスキーマはリバーシブルだが、IDの順序はリバーシブルじゃないので注意。

```rb
class ChangeIdToUuid < ActiveRecord::Migration[5.0]
  def change
    change_id_to_uuid(:messages)
  end

  def change_id_to_uuid(table_name)
    reversible do |dir|
      dir.up do
        change_column_default table_name, :id, nil
        change_column table_name, :id, :uuid, null: false, default: 'uuid_generate_v4()', using: 'uuid_generate_v4()'
        execute "DROP SEQUENCE IF EXISTS #{table_name}_id_seq;"
      end
      dir.down do
        change_column_default table_name, :id, nil
        execute "CREATE SEQUENCE #{table_name}_id_seq;"
        change_column table_name, :id, :integer, null: false,
          using: "nextval('#{table_name}_id_seq'::regclass)"
        execute "ALTER TABLE #{table_name} ALTER COLUMN id SET DEFAULT nextval('#{table_name}_id_seq'::regclass);"
      end
    end
  end
end
```
NativePackagerでzip化できるんだけど、AWSのElasticBeanstalk/Dockerにデプロイするアプリ形式にするにはもう一手間必要な件について

NativePackegerでzip化するところまでは、各々抜かりなく……。

# アプリzipファイルのルートにDockerfileファイルが必要ならしい
Dockefileはパッケージ名のディレクトリと同じレベルに置かなければいけない。
が、パッケージ名のディレクトリの下にファイルを追加する方法は見つかるのだが、その方法がどうも見つからない。
探せていない可能性は高い。
AWS+activator(sbt)でこんなことをやってる人は、それなりにいるはずだから。
でも、まぁ、せっかく書いたんで、ここに記録しておく。

# 早い話が、sbtのdistタスクの成果物(zipファイル)にDockerfileとか、Dockerrun.aws.jsonとか、.ebextensionsとかを突っ込むタスクを作ればいいんだろ？
ほい。

```scala:build.sbt
// ---------------------------------------------------------------------------------------------------------------------
//
// sbt makeEBで、以下のTaskが実行される
//
//

//
// プロジェクトに追加するタスクの定義
//
lazy val makeEB = taskKey[File]("Append AWS Dockerfile")

//
// プロジェクトに追加するタスクの実体
//
// dist.valueは、"dist"Taskの出力(Zipファイル)のFileインスタンス
// だいたい、"target/universe/[package_name].zip"になるはず。
// これを参照することで、distを実行した後、ここを実行するイメージになる
makeEB := appendToRoot(thisProject.value, dist.value) 

// ---------------------------------------------------------------------------------------------------------------------
//
// ここ以降が、Taskの本体
//
//

// Task[makeEB]に必要なImport
import java.io.File
import java.net.URI
import java.nio.file.{FileSystems, Files, Paths}
import java.util

//
// ZipファイルのRootにDockerfileファイルを追加する
//
def appendToRoot(project:ResolvedProject, zip_file:File): File = {
  val path = zip_file.toPath
  val uri = URI.create("jar:" + path.toUri)

  // 既存のZipファイルにファイルを追加する
  val env = new util.HashMap[String, String]()
  env.put("create", "false")
  env.put("encoding", "UTF-8")
  val zipfs = FileSystems.newFileSystem(uri, env)

  // zip_root以下のファイル/ディレクトリをZipファイルのroot以下にコピーする
  val root = project.base.toPath.resolve("zip_root")
  getFile(root.toFile) match {
    case Some(files) =>
      files.foreach {
        file =>
          val zipFilePath = zipfs.getPath(root.relativize(file.toPath).toString)
          if (file.isDirectory) {
            if (!zipFilePath.toFile.exists()) {
              Files.createDirectories(zipFilePath)
            }
          } else {
            Files.copy(file.toPath, zipFilePath)
          }
      }
      zipfs.close()
      println("[info] zip_root is appended")
    case _ =>
    // zip_rootがない、あるいは中身がない場合、なにもしない
  }
  zip_file
}

/**
  * file以下を再帰的に走査し、ディレクトリ優先でリスト化する
  *
  * @param file 対象File
  * @return 以下のファイル要素
  */
def getFile(file: File): Option[Array[File]] = {
  if (null == file || !file.exists()) {
    None
  } else if (file.isFile) {
    Option(Array(file))
  } else {
    val current: Array[File] = file.listFiles()
    val children: Array[File] = current.filter(_.isDirectory).flatMap(getFile).flatten
    Option(Array.concat(current, children))
  }
}

// makeEB.value
```
[project_root]/zip_root以下のファイルをzipファイルのルート以下に突っ込みます。
docker で xvfb-run しようとしたときに Xvfb failed to start というエラーが出てしまう現象の解決方法

## 症状

docker run 時のコマンドに `xvfb-run bundle exec rake resque:work` を指定して実行しようとしたが、フリーズしてしまい `bundle exec rake resque:work` が行うはずの処理に進まないか、`xvfb-run: error: Xvfb failed to start` というエラーメッセージが出て異常終了してしまう問題が発生した。

`xvfb-run -e /dev/stdout bundle exec rake resque:work` としてデバッグしてみたところ、後者のパターンでは下記のようなログが出ているようだった。

```
(EE) 
Fatal server error:
(EE) Server is already active for display 99
        If this server is no longer running, remove /tmp/.X99-lock
        and start again.
(EE)
```

## 解決方法

[このコメント](https://github.com/SeleniumHQ/docker-selenium/issues/91#issuecomment-233434500)を参考にして、なぜか生成されてしまうロックファイルを削除するようにすると、うまく動くようになった。
(issue に書いてあるけど、イメージビルド時に削除してもダメらしい。)

```
bash -c "rm /tmp/.X99-lock || echo 'Lock not found, continuing normal setup' && xvfb-run bundle exec rake resque:work"
```

Xvfb むずかしくていつもはまるとなかなか直せないので、もう少し詳しくなってみたい。

## 参考資料

* [node\-chrome\-debug:2\.47\.1 xvfb\-run: error: Xvfb failed to start · Issue \#91 · SeleniumHQ/docker\-selenium](https://github.com/SeleniumHQ/docker-selenium/issues/91#issuecomment-233434500)
* [linux \- Xvfb failed start error \- Stack Overflow](http://stackoverflow.com/questions/16726227/xvfb-failed-start-error)
Kotlin で Spring アプリを書くときの open が嫌だ

Kotlin では、とくに修飾子を付けない場合、クラスやメソッドは `final` になります。これを Spring と組み合わせた場合、Proxy などを適用するにあたって相性が良くない。

そこで、`open` という修飾子を使って `final` になるのを回避するわけですが、せっかく Kotlin のおかげで簡潔になったはずのコードに、こういった一手間を加えてしまうというのは、好ましくないです。

こういった場合にどうしたら良いか、というのがこのポストです。

# 環境

- Oracle Java 1.8.0_121
- Maven 3.3.9 (Maven Wrapper)
- Kotlin 1.0.6
- Spring Boot 1.4.3.RELEASE

```
$ ./mvnw -version
Apache Maven 3.3.9 (bb52d8502b132ec0a5a3f4c09453c07478323dc5; 2015-11-11T01:41:47+09:00)
Maven home: /Users/yo1000/.m2/wrapper/dists/apache-maven-3.3.9-bin/2609u9g41na2l7ogackmif6fj2/apache-maven-3.3.9
Java version: 1.8.0_121, vendor: Oracle Corporation
Java home: /Library/Java/JavaVirtualMachines/jdk1.8.0_121.jdk/Contents/Home/jre
Default locale: ja_JP, platform encoding: UTF-8
OS name: "mac os x", version: "10.12", arch: "x86_64", family: "mac"
```

# 対応

`build` `plugin` に、`spring` の設定を追加するだけです。

```xml:pom.xml&nbsp;(一部抜粋)
<plugin>
    <artifactId>kotlin-maven-plugin</artifactId>
    <groupId>org.jetbrains.kotlin</groupId>
    <version>${kotlin.version}</version>
    <configuration>
        <compilerPlugins>
            <plugin>spring</plugin>
        </compilerPlugins>
    </configuration>
    <!-- .. -->
</plugin>
```

これで `open` を付けずとも Kotlin で、問題なく Spring を扱えるようになります。

また、[Spring Initializr](http://start.spring.io/) で、使用言語に Kotlin を選択した場合も、依存関係に、これが自動で追加されるようになっているので、こちらも併せて利用してみるとよいかと思います。
【WordPress】CSSキャッシュ対策のクエリ文字をファイルの更新日時を見て自動でつける

WordPressテーマ作成時、リリース時のCSS反映に時間がかかりますよね。
もうheader.phpに手動でキャッシュ対策のクエリ文字を書くのはイヤだ〜😣ってことで方法を調べました。

指定したCSSファイルの更新日時を自動的に取得して、クエリ文字にします。

### 💠 function.phpに以下を記述。
```php:function.php
function file_date($filename){
  if (file_exists($filename)) {
    return date('Y-m-d-His', filemtime($filename));
  }
}
```

### 💠 header.phpでcssを読み込んでいる箇所に以下を追記。
```php
<?php echo file_date(get_template_directory() . '/更新日時を自動取得したいCSSのパスを書く.css'); ?>
```

##### 使用例
```php:header.php
<link rel="stylesheet" href="<?php bloginfo('template_url') ?>/style.css?<?php echo file_date(get_template_directory() . '/style.css'); ?>">
```
##### 出力結果
```html
<link rel="stylesheet" href="http://localhost/hoge/wp-content/themes/theme_name/style.css?2017-02-03-120252">
```

これでもうCSSを書き換えるたびにheader.phpを書き換えなくてOKです😄 
楽ちんになりました😺
  
  
  
#### 参考記事
ありがとうございました🙇
[WordPressテーマのcssの末尾にクエリ文字を加えてキャッシュさせないようにする](http://kachibito.net/wordpress/prevent-css-caching.html)
[[Wordpress]Wordpressで修正したCSSを即効でWebサイトに反映させるテクニック](http://d.hatena.ne.jp/cobolty999/20130618/1371516774)
MeowCop に CLI 機能を追加した

こんにちは、Pocke です。今回 MeowCop に CLI 機能を追加したので記事にしました。

MeowCop とは
======


「全てのプロジェクトで有効に出来るCop」のみを集めたRuboCopの設定ファイルを提供するGemです。
RuboCop にはスペースの有無などを検出するStyle系のCopも数多く含まれていますが、それらのCopはプロジェクトによっては相性がよくない可能性があります。
MeowCopではそのようなCopを無効化し、バグを検出するようなCopのみを有効にした設定を提供しています。


CLI 機能とは
======


今回追加された CLI 機能では、新たに `meowcop` コマンドが提供されます。
`meowcop` コマンドでは現在 `init` と `run` の2つのアクションが提供されています。



Installation
-------

CLI 機能は最新の MeowCop に含まれているため、最新の MeowCop をインストールする必要があります。

```bash
$ gem install meowcop
```


`meowcop init`
---------

MeowCop を使い始める時、以前は手で `.rubocop.yml` を編集する必要がありました。
ですが、`meowcop init` コマンドを使用すると、`.rubocop.yml` の初期化を自動で行うことが可能です。

```bash
$ meowcop init
Meow! .rubocop.yml has been created successfully.

$ cat .rubocop.yml
# To use the MeowCop gem.
inherit_gem:
  meowcop:
    - config/rubocop.yml

# Modify the version if you don't use MRI 2.1.
AllCops:
  TargetRubyVersion: 2.1

# You can customize rubocop settings.
# For example.
# Style/FrozenStringLiteralComment:
#   Enabled: true
#   EnforcedStyle: always
```


`meowcop run`
------

通常 MeowCop を使用するには上記のように `.rubocop.yml` を編集する必要があります。
ですが、`meowcop run` コマンドを使用することで、一時的に MeowCop を適用した状態で RuboCop を走らせることが可能となります。

```bash
# デフォルトの設定で RuboCop が実行される
$ rubocop

# MeowCop の設定を使用した状態で RuboCop が実行される
$ meowcop run

# RuboCop にオプションを渡すことも可能です
$ meowcop run --format json
```

これにより、「ちょっと MeowCop を試してみたい」「RuboCop を導入していないプロジェクトだけど一回 Lint をかけてバグがないか見たい」などの場合に、MeowCop を簡単に試すことが可能となります。


まとめ
====

今回の CLI 機能の追加により、MeowCop を試すことが簡単になりました。
デフォルトの設定で RuboCop の警告がうるさくて導入を諦めてしまった方など、これを機に MeowCop を適用して RuboCop を導入してみてはいかがでしょうか？
電卓で16進数 と 10進数などの変換をさらっと確認する

電卓の起動
<kbd><kbd>Win</kbd> + <kbd>R</kbd></kbd>、"calc"で起動。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/ecbbcbec-0fb4-9efd-a7c0-7eb8425995e3.png)

電卓の種類の切り替えは次の通り。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/3bd08d16-4d24-6028-8dcc-166a59f9b538.png)

<kbd><kbd>Alt</kbd> + <kbd>3</kbd></kbd>でプログラマ電卓に切り替え。
![image](https://qiita-image-store.s3.amazonaws.com/0/156225/ef08e524-d094-0090-8cd9-267d208cf4eb.png)

<kbd>F5</kbd>：16進
<kbd>F6</kbd>：10進
<kbd>F7</kbd>：8進
<kbd>F8</kbd>：2進

16進から10進を確認したい場合、<kbd>F5</kbd>で16進での入力を行い、<kbd>F6</kbd>で10進での表示を確認する。


以上