OmniAICreator/Qiita-1.07M huggingface dataset:
FastlyのImage Optimization(画像最適化)の概要

# Image Optimization on Fastly

Fastlyでは、オリジンに設置された画像をクエリパラメータによって最適化し、デバイスやサービスごとに異なるイメージを動的に生成することが可能です。
これにより、煩わしい画像生成及び設置の手間を省くことができます。また、一度最適化された画像は通常のコンテンツ同様にFastlyのPOPサーバ上にキャッシュさせることが可能なため、キャッシュ後は瞬時にクライアントへ画像を提供することができます。

- [Image optimization setup and use](https://docs.fastly.com/guides/imageopto-setup-use/)

## デモ環境
- 下記のURLでGUIから自由にFastlyのImage Optimizationを体験することができます。  
https://www.fastly.com/io/  
※上記ページで使える機能は一部にすぎません。

![スクリーンショット 2017-08-21 22.57.53.png](https://qiita-image-store.s3.amazonaws.com/0/19942/65cb5f97-1e40-896d-83b2-b96f97b8843e.png)


## サポートされる機能
- サポートされる最適化機能は下記にまとまっていますが、参考までに日本語を下記にまとめます(2017年8月時点)  
[Image API reference](https://docs.fastly.com/api/imageopto/#image-api-reference)

|Name|Parameter|Notes|
|:-----------|:------------:|:------------:|
|Width|width|画像の横幅(width)を設定します。|
|Height|height|画像の縦幅(height)を設定します。|
|Pixel Ratio|dpr|指定されたdpr(Device Pixel Ratio)画像を表示します。|
|Fit Mode|fit|指定されたサイズ範囲内で画像がどのように収まるかを設定します。|
|Crop|crop|画像から指定ピクセル分を削除します。|
|Trim|trim|画像の端から指定ピクセル分を削除します。|
|Pad|pad|画像の端に指定ピクセル分を追加します。|
|Canvas|canvas|画像のcanvasサイズを大きくします。|
|Background Color|bg-color|画像の背景色を設定します。|
|Orientation|orient|画像の向きを設定します。|
|Overlay|overlay|画像をオーバーレイ表示します。|
|Overlay Align|overlay-align|オーバーレイ画像の位置を設定します。|
|Overlay Repeat|overlay-repeat|オーバーレイ画像のリピート方法を設定します。|
|Overlay Width|overlay-width|オーバレイ画像の横幅(width)を設定します。|
|Overlay Height|overlay-height|オーバレイ画像の縦幅(height)を設定します。|
|Overlay Pad|overlay-pad|オーバーレイ画像の端に指定ピクセル分を追加します。|
|Format|format|画像の出力形式を設定します。（フォーマット変換）|
|Quality|quality|不可逆圧縮画像の場合、画像の圧縮レベルを設定します。|
|Auto|auto|最適化機能を自動的に有効にします。|
|Disable|disable|デフォルトで有効になっている機能を無効にします。|
|Resize Filter|resize-filter|画像リサイズ時の画素補間フィルタを設定します。|


## 画像最適化にあえてFastlyを使うことのメリット
皆さんの会社によっては、既に自社で画像を動的にリサイズするためのマイクロサービスを作って利用しているところも多いと思います。(例、nginx + image_filter_module)
もちろんFastlyはCDNが主軸ですので、

- リサイズした画像をキャッシュ
- リサイズした画像のキャッシュ時間を自由にコントロール可能
- [surrogate keys](https://docs.fastly.com/guides/purging/getting-started-with-surrogate-keys)を使うことでキャッシュコンテンツをタグ付けしてカテゴライズすることが可能になり、任意のkeyをもとに特定のタグがついたキャッシュだけを効率よくpurgeすることが可能

など、上記は一部にすぎませんが様々なメリットを受けることが出来ます。

## 利用に際しての注意事項など
- Image Optimization機能を利用したい場合、事前に[Sales](mailto:sales@fastly.com)へのリクエストが必要です。デフォルトではImage Optimization機能は有効化されておらず使うことはできません。
- Image Optimizationの料金は通常の課金体系と異なります。詳しくは前述へコンタクトして確認が必要です。
Python - bitflyer チャット内容取得

# bitflyer APIでチャット内容取得

## ソース

```py
import pybitflyer

API_KEY = "XXXXXXXXXXXXX"
API_SECRET = "XXXXXXXXXXXXXXXXXXXX"

if __name__ == '__main__':
    api = pybitflyer.API(api_key = API_KEY, api_secret = API_SECRET)
    
    chat = api.getchats()
    
    print(str(chat[:3]))
```

## 結果

```
[{'nickname': 'UserD11D621', 'date': '2017-08-16T13:52:44.453', 'message': '47に守護神いるから大丈夫'}, {'nickname': 'デカイ・ガラ', 'date': '2017-08-16T13:52:47.753', 'message': '酔ってて見れてない電車も乗り過ごした'}, {'nickname': 'モチロール', 'date': '2017-08-16T13:52:47.65', 'message': 'ﾄﾞﾝﾄﾞｺﾄﾞﾝﾄﾞｺ(^o^)\u3000ｳｺﾞｹｰ'}]
```
GeoJSON (simplestyle) の表示（mapbox.js 利用）

こんにちは。
GeoJSON with [simplestyle](http://qiita.com/kkdd/items/46906cb1110488828d9e) の表示（可視化）には、mapbox.js 利用が簡単です。ローカルファイルを地図上にドロップして表示させるように仕立ててみました[^1]。

[^1]: これは [geojson.io](http://geojson.io), [geojson.io](https://github.com/mapbox/geojson.io) と同じことになります。

表示例は、この geojsonデータ を使用しました。

- [simplestyle.geojson](https://www.nps.gov/lib/npmap.js/3.0.18/examples/data/simplestyle.geojson), [simplestyle.geojson](https://github.com/nationalparkservice/npmap.js/blob/master/examples/data/simplestyle.geojson)


![map.png](https://qiita-image-store.s3.amazonaws.com/0/54617/b7733c31-5727-a34c-b77c-f4db78105621.png)


```html
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>L.mapbox.simplestyle with L.geoJson</title>
<meta name='viewport' content='initial-scale=1,maximum-scale=1,user-scalable=no' />
<script src="https://d3js.org/d3.v4.min.js"></script>
<script src='https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.js'></script>
<link href='https://api.mapbox.com/mapbox.js/v3.1.1/mapbox.css' rel='stylesheet' />
<style>
  body { margin:0; padding:0; }
  #map { position:absolute; top:0; bottom:0; width:100%; }
</style>
</head>
<body>
<div id='map'></div>
<script>
// L.mapbox.accessToken = <your access token here>;
var map = L.mapbox.map('map', 'mapbox.streets')
  .setView([38, -96], 2);
var simplestyle = L.mapbox.simplestyle.style;
var layerOptions = {
	style: simplestyle,
	pointToLayer: function(feature, latlon) {
	    if (!feature.properties) feature.properties = {};
	    return L.mapbox.marker.style(feature, latlon);
	}
};

var handleDragOver = function(evt) {
    evt.stopPropagation();
    evt.preventDefault();
    evt.dataTransfer.dropEffect = 'copy';
};

var handleDropGeojson = function(evt) {
	evt.stopPropagation();
	evt.preventDefault();
	var bounds = new L.LatLngBounds();
	var files = evt.dataTransfer.files;
	for (var i = 0; i < files.length; i++) {
	    var url = URL.createObjectURL(files[i]);
		d3.json(url, function(err, geojson) {
		    if (err) return;
	        var geojsonLayer = L.geoJson(geojson, layerOptions).addTo(map);
	        bounds.extend(geojsonLayer.getBounds());
	        map.fitBounds(bounds);
		});
	}
};

var mapEl = document.getElementById("map");
mapEl.addEventListener('dragover', handleDragOver, false);
mapEl.addEventListener('drop', handleDropGeojson, false);
</script>
</body>
</html>
```
XAMPを使ってPHPでPostgreSQLにアクセスする際の諸注意

XAMPを使ってPHPを動かしているのですが、PostgreSQLに接続しようとしたところでエラーに陥ったので共有です。
すごい初歩的なノウハウで大変恐縮ですが何かしらの参考になれば幸いです。

まず、PDOでPostgreSQLに接続しようとした際に以下のようなコードを記述しました

```php
//接続するデータベースの情報
$dsn = 'pgsql:dbname=test host=localhost port=5432';
$user = 'posgre';
$password= 'posgre';

//データベースへの接続開始
try{
    $dbh = new PDO($dsn, $user, $password);
    print ('接続成功');
//データベースへの接続に失敗した場合
}catch(PDOException $e){
    print ('接続失敗:' .$e -> getMessage());
    die();
}
```

PODでDBに接続する設定はおかしなところはないと思うのですが、**could not find driver**というエラーが出力されました。

調べてみたところ、php.iniに設定されている.dllファイルを読み込む設定のところで、
**php_pdo_pgsql.dll**のセミコロンを取り除かなければならないようです。

変更前
;extension=php_pdo_pgsql.dll

変更後
extension=php_pdo_pgsql.dll

変更後はApacheを再起動することもお忘れなきよう。（数分間これで悩んでしまいました・・・。）

**参考**
PDOでPostgreSQLにつなぐときのエラー
http://fmfmfm.hatenablog.com/entry/2012/05/01/115642
Raspberry Pi3で音声録音

## 環境情報

* Raspberry Pi3 Model B
* OS:Rasbian JESSIE
* USBマイク：USB Mini Microphone fo PC or Mac Model MI-305

## デバイス状態の確認

以下のコマンドで、USBデバイスの状態を確認

~~~
$ lsusb
~~~

結果は以下

~~~
Bus 001 Device 004: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
~~~

Bus 001 のデバイスが、マイク。

ハードウェアデバイスの認識状態を確認

~~~
$ arecord -l
~~~

結果は以下

~~~
**** ハードウェアデバイス CAPTURE のリスト ****
カード 1: Device [USB PnP Sound Device], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
~~~

上記で、カード１、デバイス０として認識していることがわかる。

## マイクボリュームの調整

マイクボリュームは、alsa mixer で実施する。

~~~
amixer sset Mic 50 -c 1
~~~

上記は、Mic(マイク)に gain 50 を設定。 -c は、カードの指定、USBマイクは、arecordの結果カード1だったので、1を指定する。

※ここで指定している、50は、要調整。

## 音声録音の実施

録音は、arecordコマンドで実施。

~~~
arecord -D plughw:1,0 mic.wav
~~~

上記は、-D デバイス指定。カード1 , デバイス0 を指定。
ファイルは、mic.wav として保存。

実行すると、以下のように結果が出る。

~~~
録音中 WAVE 'mic.wav' : Unsigned 8 bit, レート 8000 Hz, モノラル
^Cシグナル 割り込み で中断...
~~~

止めるのは、Ctrl+Cで。
aplay mic.wavで実施すると、ガーガーピーピーで雑音？がする。
理由は、arecord で録音した時の、レートが、8000 Hzになっていることが
原因。 -f cd で今利用しているpHATのスピーカーのレート4410 Hzで録音できる。

~~~
arecord -D plughw:1,0 -f cd  mic.wav
~~~

実行結果は以下

~~~
録音中 WAVE 'mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
~~~

再生結果は以下

~~~
$ aplay ./mic.wav 
Using device: speaker-phat
再生中 WAVE './mic.wav' : Signed 16 bit Little Endian, レート 44100 Hz, ステレオ
^Cシグナル 割り込み で中断...
~~~
Python - bitflyer ビットコイン売買

# bitflyer APIでビットコイン売買

## pybitflyerのインストール

```
pip install pybitflyer
```

## API Key

登録後以下から取得可能
https://lightning.bitflyer.jp/developer

## ソース

```py
import pandas as pd
import pybitflyer
import time
from datetime import datetime

# size : 注文数量、price : 価格(省略可)
def buy(api, size, product_code = "BTC_JPY", child_order_type = "MARKET", price = None, minute_to_expire = 10000, time_in_force = "GTC"):
    if price is None:
        buy_btc = api.sendchildorder(product_code=product_code, child_order_type=child_order_type, side="BUY",size=size, minute_to_expire=minute_to_expire, time_in_force=time_in_force)
    else:
        buy_btc = api.sendchildorder(product_code=product_code, child_order_type=child_order_type, side="BUY",size=size, minute_to_expire=minute_to_expire, time_in_force=time_in_force, price=price)

# size : 注文数量、price : 価格(省略可)
def sell(api, size, product_code = "BTC_JPY", child_order_type = "MARKET", price = None, minute_to_expire = 10000, time_in_force = "GTC"):
    if price is None:
        sell_btc = api.sendchildorder(product_code=product_code, child_order_type=child_order_type, side="SELL",size=size, minute_to_expire=minute_to_expire, time_in_force=time_in_force)
    else:
        sell_btc = api.sendchildorder(product_code=product_code, child_order_type=child_order_type, side="SELL",size=size, minute_to_expire=minute_to_expire, time_in_force=time_in_force, price=price)

API_KEY = "XXXXXXXXXXXXXX"
API_SECRET = "XXXXXXXXXXXXXXXXXXXXXX"

if __name__ == '__main__':
    api = pybitflyer.API(api_key = API_KEY, api_secret = API_SECRET)
    
    # 0.001BTC買い
    buy(api=api, size=0.001)
    
    # 0.001BTC売り
    sell(api=api, size=0.001)
```
Python - bitflyerからBTC/JPY板情報取得

#bitflyerからBTC/JPY板情報取得

## ソース

```py
import pybitflyer
import time
from datetime import datetime
from pytz import timezone
from dateutil import parser

BOARD_KEYS = ["asks",
              "bids",]

API_KEY = "XXXXXXXXXXXXXXXXXXXXXXX" # bitflyerマイページから取得
API_SECRET = "XXXXXXXXXXXXXXXXXXXXXXX" # bitflyerマイページから取得
       
def to_jst(datestr):
    return parser.parse(datestr).astimezone(timezone('Asia/Tokyo'))
       
if __name__ == '__main__':
    api = pybitflyer.API(api_key = API_KEY, api_secret = API_SECRET)
    
    board = api.board(product_code="BTC_JPY")
    
    for board_key in BOARD_KEYS:
        print(board_key + " : " + str(board[board_key][:5])) # 5つだけ表示
```

## 結果

```
asks : [{'size': 0.11494513, 'price': 444899.0}, {'size': 0.0418758, 'price': 444900.0}, {'size': 0.00975, 'price': 444998.0}, {'size': 0.94526412, 'price': 444999.0}, {'size': 10.1291162, 'price': 445000.0}]
bids : [{'size': 2.51806335, 'price': 444350.0}, {'size': 0.0035, 'price': 444300.0}, {'size': 0.496, 'price': 444274.0}, {'size': 0.01, 'price': 444100.0}, {'size': 0.01193694, 'price': 444000.0}]
```
【GAS@SpreadSheet】行ごとにコンテンツを含む Last Column の番号を取得

***sheet.getLastColumn()*** 関数の返り値は、シート全体の一番ラストのコンテンツを含む Column 番号の値となります。尚、あるデータデーブルのフィールド項目は固定ではなく、追加可能の場合は、行ごとに Last Column 番号は異なる可能性があります。つまり、行ごとに Last Column 番号を取得する必要があります。
以下のコードは１行目の Last Column 番号を取得します：

``` gas:code.gs
function get_currentLastColumn() {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = ss.getSheetByName("sheet");
 
  var lastColumn = sheet.getLastColumn(); // Integer — last column of the sheet that contains content

  var iRow = 1 // current row number
  var currentRow = iRow;
  var temp, currentLastColumn;
  
  for (var i = lastColumn; i > 1; i--) {
    temp = sheet.getRange(currentRow, i).getValue();
    if (temp != "") {
      currentLastColumn = temp;
      break;
    }
  }
}
```
メモ : csvを読み込んで縦横入れ替え in Ruby

#### はじめに
メモです。

#### コード
```
array = []
File.open('csvfile').each do |l|
  array << l.chomp.split(',')
end
array.transpose.each do |a|
  puts a.join(',')
end
```

#### 例
```
田中,佐藤,鈴木
1,2,3
10,20,30
100,200,300
```
これが、

```
田中,佐藤,鈴木
1,2,3
10,20,30
100,200,300
```
こうなる。

#### おわりに
Excelで出来ることには後で気づいた。
Python - bitflyerから一定間隔でビットコインレートBTC/JPYを取得してファイルに保存

# Bitflyerから一定間隔でビットコインレートを取得してファイルに保存

## pybitflyerのインストール

```
pip install pybitflyer
```

## API Key

登録後以下から取得可能
https://lightning.bitflyer.jp/developer

## bitFlyer Lightning API

・制限
https://lightning.bitflyer.jp/docs?lang=ja&_ga=2.103916546.34290189.1503318908-1417182779.1500704462

```
API制限

HTTP API は、以下のとおり呼出回数を制限いたします。

Private API は 1 分間に約 200 回を上限とします。
IP アドレスごとに 1 分間に約 500 回を上限とします。


1 日の平均約定単価が 0.01 未満のユーザーは、翌日の Private API 呼出回数が 1 分間に約 10 回まで制限されることがあります。
マニュアル発注は制限されません。
```

・Tickerの取得

https://lightning.bitflyer.jp/docs?lang=ja&_ga=2.103916546.34290189.1503318908-1417182779.1500704462#ticker

## ソース
5秒間隔で取得

```py
import pybitflyer
import time
from datetime import datetime
from pytz import timezone
from dateutil import parser
import pytz

TICKER_KEYS = ["product_code", 
                "timestamp", 
                "tick_id", 
                "best_bid", 
                "best_ask",
                "best_bid_size",
                "best_ask_size",
                "total_bid_depth",
                "total_ask_depth",
                "ltp",
                "volume",
                "volume_by_product"]

API_KEY = "XXXXXXXXXXXXXXXXXXXXXX" # Bitflyerログイン後のマイページから取得
API_SECRET = "XXXXXXXXXXXXXXXXXXXXXXXXXX" # Bitflyerログイン後のマイページから取得
                
def to_jst(datestr):
    return pytz.timezone('UTC').localize(parser.parse(datestr)).astimezone(timezone('Asia/Tokyo'))
     
if __name__ == '__main__':
    api = pybitflyer.API(api_key = API_KEY, api_secret = API_SECRET)
    
    now = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
    ticker_data = open(now + "_ticker_data.tsv", "w")
    for ticker_key in TICKER_KEYS:
        ticker_data.write(ticker_key + "\t")
    ticker_data.write("\n")
    while True:
        ticker = api.ticker(product_code="BTC_JPY")
        for ticker_key in TICKER_KEYS:
            if ticker_key == "timestamp":
                data = to_jst(str(ticker[ticker_key]).replace("T", " ")).strftime("%Y/%m/%d %H:%M:%S")
            else:
                data = str(ticker[ticker_key])
            ticker_data.write(data + "\t")
        ticker_data.write("\n")
        ticker_data.flush()
        time.sleep(5)
    ticker_data.close()
```

## 結果

![cap.PNG](https://qiita-image-store.s3.amazonaws.com/0/38382/80cd5bb4-7367-fc52-8aa2-99c306931580.png)

## 備考

結構接続エラーで落ちるため、ちゃんとやるならエラー対策が必要。
Javaプログラミング基礎の練習～for文で三角形を表示させたい①

新人の時に作ったプログラムを、2年目になった今作ってみました。
再びfor文。

結論：
三角形を表示できなかったので、順を追ってみようと、四角形を表示させることにしました。

#問題
* ソースファイル名「Check32.java」
* 頂点の高さを整数で入力します
* 以下の実行結果のように、「*」を使って入力した高さの三角形を表示します

```
三角形の高さを入力してください
5
*
**
***
****
*****
****
***
**
*
```

#途中経過
三角形を作るにはどうしたらいいのか分からず。。。
去年も苦戦したことだけは覚えています。
とりあえず、入力した整数を長さとする四角形を作るように、実装するところまでやってみました。

```Check32.java
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Check32 {

	public static void main(String[] args) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("四角形の長さを入力してください");
		String line;
		try {
			line = reader.readLine();
			int hight = Integer.parseInt(line);
			for( int i = 0; i < hight; i++) {
				for (int j = 0;j < hight;j++) {
					System.out.print("*");
				}
				System.out.println();
			}
		} catch (NumberFormatException e) {
			System.out.println("整数を入力してください");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```

実行結果は以下のようになります。

```
四角形の長を入力してください
5
*****
*****
*****
*****
*****
```

#感想
自力で完成させることはできませんでした。（まだ完成途中ですが）
そもそもどのようなキーワードで検索をかければ良いのか？というところでも苦戦していました。
[こちらのサイト](http://javamania.blog25.fc2.com/blog-entry-13.html)を参考にして、できました。
forをネストさせると表ができることを知りました。

本命の三角形は次に持ち越します。
AWSのec2インスタンスを別アカウントのec2で立ち上げる


お客さんから、「EC2でシクヨロ」って言われて自分の環境にEC2立ち上げたら
「あ、AWS契約したからこっちで契約したAWS上でシクヨロ！」
って言われることよくありますよね。いや、ない。

そんな時でも大丈夫。簡単に移設できます。そう、AWSならね。

## EC2をまず立ち上げましょう
立ち上げます。
多分PHP+Nginx+php-fpm+mysql+WP+laravelとかですよね。
そのうち、↑をAnsibleで一発で立ち上げるやつ書きます。


## お客さんにAWS契約したからこっちでシクヨロ！って言われる
はい、がっかりします。
泣きながらお客さんのAWS環境にログインしましょう。
もちろん、EC2のアクセス権限はもらいましょう。

## さっき立ち上げたEC2をAMI化しましょう。
AMI化手順は以下の通り。
移設したいEC2を選択して、

 * アクション＞イメージ＞イメージの作成

を選択。以下図。

![1.png](https://qiita-image-store.s3.amazonaws.com/0/42110/9009589f-76de-7b61-733a-fc9f390f6ed2.png)

なんか血しぶきみたいになっちまった:scream:


そして、作成したらこんな画面になるので適当にわかりやすい名前を付けます。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/42110/d311d637-4f26-8461-3005-170bbcac3b0b.png)

麦茶を飲んで待ってれば出来上がります。
出来たかどうかは左メニューからAMIを選んでみましょう

![3.png](https://qiita-image-store.s3.amazonaws.com/0/42110/ef5ebba1-bc60-c711-a74f-57e7435d5872.png)

はい、順調に作成されていますね。

## さあ共有。

ん？見慣れない文字、AWSアカウント番号？？

![4.png](https://qiita-image-store.s3.amazonaws.com/0/42110/b6af2911-0bcd-bc50-17f3-eac19819915c.png)



## AWSアカウント番号とは！？

あわてない、あわてない。一休み、一休み。
右上のサポート＞サポートセンターを選択するとなんと！見ることが出来ます。
移行先のアカウント番号を入力して、イメージパーミッションの変更は終了です。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/42110/9eddac00-a681-3698-e2d0-5a49fd3b5d97.png)


## 移行先のEC2管理画面を開いてみよう

EC2 ＞ イメージ ＞ AMI を選択してみて下さい。
移行先のEC2管理画面を見てみると、はいありました。
あとはこれを選択して上のほうの作成ボタンを押すとちょっと待てば出来上がり！


この記事で絶望の淵にいた人を一人でも救えるとうれしいな。
【Vue.jsエラー】hogehoge is assigned a value but never used

オブジェクト使ってないってことなので、newだけして回避するか、あるいはなんか使ってあげればよい。


```bash:
 ERROR  Failed to compile with 1 errors                                                                                                               20:49:45

 error  in ./src/main.js


  ✘  http://eslint.org/docs/rules/no-unused-vars  'app2' is assigned a value but never used  
  src/main.js:17:5
  var app2 = new Vue({
       ^


✘ 1 problem (1 error, 0 warnings)


Errors:
  1  http://eslint.org/docs/rules/no-unused-vars

 @ multi ./build/dev-client ./src/main.js
```

コードはこんな

```js:
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

var app2 = new Vue({
  el: '#app2',
  data: {
    message: 'Hello Vue!'
  }
})

// console.log(app2)

```

## app2オブジェクトをなんでもいいので使ってあげると通った。


```js:
// The Vue build version to load with the `import` command
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue'
import App from './App'
import router from './router'

Vue.config.productionTip = false

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

var app2 = new Vue({
  el: '#app2',
  data: {
    message: 'Hello Vue!'
  }
})

console.log(app2)

```

## newだけして回避してもいい。

```
new Vue({
    router
}).$mount('#app')
```
GooglePlayでAndroidアプリをリリース時、対応端末数が極端に少なかった際の対応

先日、GooglePlayにてAndroidアプリのアップロードを行ったのですが、リリース直前で対応端末数が**15端末**しかないことに気がつきました。

![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/178137/2f3793b1-9a1f-1253-cf4f-e1ca37782d70.png)

結果的にリリースには無事間に合ったのですが、ググっても中々出てこなくて、結構手こずったので、こちらに記載します。

# 1．環境
- Android Studio
- Android Java

# 2．現象
アプリ自体は実機テスト等を出来ていたのだが、いざGooglePlayにアップロードしてみると、対応可能端末が15端末しか存在しなかった。

# 3．原因
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/178137/f3a8c0be-b842-09b8-3d27-c41f706a6a53.png)
画像で赤く囲っている、ネイティブプラットフォームというところで、対応するプラットフォームに制限がかかってしまい、対応端末数が極端に絞られてしまっていたことが原因です。

そしてそれは、ライブラリ構成がおかしいと起こってしまうようです。
通常のライブラリはルートディレクトリから、パッケージごとにディレクトリが分かれて配置されています。

```
/<APP_HOME>/org
               /bitcoinj
               /fusesource
               /iq80
           /...
```


今回、生成されたAPKをzipにして解凍してみると、

```
/<APP_HOME>/org
               /bitcoinj
               /fusesource
               /iq80
           /lib
               /x86_64/darwin/libscrypt.dylib
           /...
```
というファイルが生成されていたので、どうやらこちらのライブラリがプラットフォーム制限をかけてしまっている模様。


# 4．解決策
このライブラリを除外して、ビルドをするように設定を行ったところ、プラットフォーム制限をなくし、対応端末数を通常通りにすることが出来ました。

特定のライブラリを除外し、ビルドをするためには、gradleに記載が必要で、下記のように行います。

```java:App.gradle
android ｛
  ...
  packagingOptions {
    exclude 'lib/x86_64/darwin/libscrypt.dylib'
  }
  ...
}
```

<img width="626" alt="スクリーンショット 2017-08-20 18.41.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/178137/f69f44c9-d3b0-212e-d4ab-9c2b6c03f92f.png">
※端末数が増え、ネイティブプラットフォームの制限が削除された。

ググってもクックパッドさんの記事くらいしか出てこなかったので、記事にしてみました。
自分は解くのに結構時間がかかってしまったので、同じように悩む人の救いになれば幸いです。

# 5．参考文献
- [正常なAndroidアプリをビルドできない問題とその対策](http://techlife.cookpad.com/entry/2014/10/28/115057)
- [apkを作る時に特定CPUの共有nativeライブラリを除外したい](http://serenegiant.com/blog/?p=3155)
apacheの設定(メモ)

ただのメモ用

# セキュリティ設定
https://www.rem-system.com/apache-security01/

# httpd.conf の load module設定
http://oki2a24.com/2013/12/14/my-use-apache-module/

# キャッシュ設定
http://qiita.com/hkusu/items/468cc0ee0d767e7cc790

# ssl 設定
http://good-stream.com/goodstream/server/apache/tips/htttps-port.htm
fastlaneの勉強 その1

iOSの開発だけでなく、Androidの開発のおともに、fastlane。
あらゆるリソースでその手軽さや機能の豊富さが語られていますが、自分自身、どんな機能が使えるか理解できていなかったので、今回はfastlaneのグローバルコマンドをまとめようと思います。

※ 今回は、fastlaneのインストール方法については述べません
※ fastlaneのバージョンは、2.53.1の時点のものです

# fastlane help

まず手始めに、`fastlane help`コマンドで、どんなコマンドがあるのかを見てみます。
英語で出てくるので、何となくそれを意訳してみます。

```
  fastlane

  CLI for 'fastlane' - iOSとAndroidアプリのベータ版配信からリリースまでを自動化する最もかんたんな方法

        `fastlane [platform] [lane_name]` で実行します。
        レーン(lane)に値を渡すには `fastlane [platform] [lane_name] key:value key2:value2` と書きます。

  コマンド: (* default)
    action                 指定したコマンドの詳細情報を表示
    actions                利用可能なfastlaneコマンドを表示
    add_plugin             fastlane setupにプラグインを追加
    docs                   Fastfileをもとにマークダウンドキュメントを生成
    enable_auto_complete   Tabによる自動補完の有効化
    env                    fastlaneの環境設定を表示, GitHubにissueを投稿するときに使用する
    help                   グローバル または [command] のヘルプドキュメントを表示
    init                   fastlaneの初期設定をガイドする
    install_plugins        プロジェクトに全プラグインをインストール
    lanes                  利用可能なlaneとその説明を一覧で表示
    list                   利用可能なlaneのみを一覧で表示
    new_action             fastlaneのアクションを新規追加
    new_plugin             fastlaneで使用するプラグインを新規作成
    run                    1度きりのfastlaneアクションを、full lane無しで実行
    search_plugins         プラグイン検索、クエリはオプション
    trigger              * 指定したlaneを実行。lane名とプラットフォーム名を渡す
    update_fastlane        fastlaneを最新版に更新
    update_plugins         依存プラグインを更新

  グローバルオプション:
    --verbose             
    --capture_output     実行中の出力をキャプチャし、issueテンプレートを生成
    --troubleshoot       拡張verboseモードを有効化。警告するけどこれ、センシティブなデータを含みます。CIでは使用しないように. 
    -h, --help           ヘルプドキュメントを表示
    -v, --version        バージョン情報を表示

  トリガーのオプション:
    --env STRING[,STRING2] `dotenv`で環境変数を渡せる
```

以上を見てわかるように、laneと呼ばれる、いわゆるワークフローを実行できるところが特徴のようです。

# 次回

もちろん、laneで使用できるコマンドもたくさんあるようです。そちらも一つ一つ見てみたいと思います。
RailsでLEFT OUTER JOINとIN句を同時に使う方法

# 実装方法

SQLの`LEFT OUTER JOIN`の`ON`の条件に`IN句`を書ければいいのですが、Railsではそれが出来ないようでした。
Railsで同様のことをやるには、以下のように`WHERE`の`IN句`の条件に`nil`を追加します。

```rb
# ユーザ別の最新のUserLocationのidを取得
latest_user_location_ids = UserLocation.group(:user_id).maximum(:id).values
users = User.
  includes(:user_locations).
  # IN句の条件にnilを含めないと、inner joinと同じ結果になってしまう
  where(user_location: { id: latest_user_location_ids.push(nil) }
```

# 参考

- [SQLのouter joinの罠にハマった話](http://nenono.hatenablog.com/entry/2014/05/25/223705)
Tinker Board でLチカ

[Tinker Board](https://www.asus.com/jp/Single-Board-Computer/Tinker-Board/)買ったので初期設定方法（Lチカまで）をメモ。

作業環境はMac (OS10.12)です。

## OSイメージをダウンロード

まずASUSの公式サイトからTinker-OS-Debian をダウンロードします。

https://www.asus.com/jp/Single-Board-Computer/Tinker-Board/

## SDカードにOS書き込み

SDカードはFAT32でフォーマット後、アンマウントしておきます。
`diskutil list` でSDカードの名前を把握しておきます。 私の環境では `/dev/disk2` となっていました。

ダウンロードしたzipファイルを解凍し「tinker-os-v1.8.img」にリネームして「~/」に配置後、
下記コマンドでコピーします。(リネームしないとファイル名が長い...)

> sudo dd bs=1m if=~/tinker-os-v1.8.img of=/dev/disk2

結構時間がかかるが頑張って待ちます。(私の環境では30分くらいかかった)

## 起動

SDカードをTinker Boardに挿入後、キーボード、マウス、モニターを接続し電源を入れます。電源はmicro USBケーブルの結構電流たくさん流れそうなやつ＋強そうなUSB充電器を使いましょう。

Desktop画面起動完了後、WIFIの設定を行います。(右下の↓↑なアイコンをクリックする)

WIFIの調子が悪い時は、BluetoothをOFFにします。
BluetoothのOFFは `Preferences > Services` から bluetoothのチェックを外します。
パスワード聞かれるので ` linaro ` と入力します。

WIFI接続後、さっそく、

> sudo apt-get update
> sudo apt-get upgrade

を実施してアップデートしときましょう。

## Tinker-Config を入れてローカライズ設定

これをやっとかないと、キーボードで打てないキー（「｜」とかの場所が違う）が出てくるので、先にやっときます。

下記に情報があります。

https://www.tinkerboarding.co.uk/forum/thread-400-post-1257.html

> wget https://raw.githubusercontent.com/mikerr/tinker-config/master/tinker-config

で入れて。

> sudo sh tinker-config

で起動。

- ロケール
- タイムゾーン
- キーボード

を設定しておきましょう。Raspberry Piの「Raspi-Config」とだいたい同じなので適宜ググればたいたい問題なし。

終わったら、

> sudo reboot

で再起動しときます。

## node.js を入れる

Lチカ何でやってもいいんだけど、node.jsでやりたいですね！
しかし、Tiker Boardのパッケージにはnode.jsがいないみたいなので、下記のようにして入れます。

> sudo curl -sL https://deb.nodesource.com/setup_6.x | sudo bash -
> sudo apt install nodejs

これで、node.js v6.11.2、npm v3.10.10 が入ります。

## vsftpd 入れる

PCからファイルも入れたいので、とりあえずFTP入れときます。
設定方法はRaspiと同じ。

http://yamaryu0508.hatenablog.com/entry/2014/12/02/102648

などを参考にして基本は同じです。違いは、

/etc/vsftpd.chroot_list

に設定するユーザーは、`pi`ではなく`linaro`に。これだけ。

最後に、

> sudo service vsftpd restart

でサービス再起動すればPCからファイルをアップロードできるようになります。

ここでPCのFTPクライアントからFTP接続できることを確認するためにIPアドレスを調べる。
Tinker OSでは `ifconfig` にパスが通ってないので、そのまま入力しても実行できない。
なので、下記のように入力してIPアドレスを調べます。

> /sbin/ifconfig

ようするにフルパスで書いただけ。。。

# Node.jsからLチカしてみる

## test.js

最初にLチカプログラムを作りましょう。

```test.js
var gpio = require("tinker-gpio");

var port = 31;
gpio.export(port,'out',()=>{
  var v = 0;
  setInterval(()=>{
    v ^= 1;
    gpio.write(port,v);
  },500);
});
````

これを、~/Desktop/test/test.js など任意のパスに保存します。
(CUI慣れてない人はDesktop配下に保存しとくといろいろ楽なので！！)

> cd ~/Desktop/test
> npm install tinker-gpio

実はこれだけだと動きません。
`tinker-gpio` は、Cライブラリに依存しているようです。
なのでCライブラリを入れます。

## GPIO Cライブラリ

なんか、8/21現在公式サイトからのリンクが切れてるので、探すと下記が正しいみたい。

http://dlcdnet.asus.com/pub/ASUS/mb/Linux/Tinker_Board_2GB/GPIO_API_for_C.ZIP

これをダウンロードして、適当なパスに入れてビルド・インストールします。
今回は、`~/gpio`でビルドする手順を。

> cp ~/Downloads/GPIO_API_for_C.ZIP ~/gpio/
> cd ~/gpio
> unzip GPIO_API_for_C.ZIP
> sudo chmod +x build
> sudo ./build

これでインストールまで完了しているようです。

## Lチカ！

Tinker BoardのGPIOとLEDを下記のように繋ぎます。

- LEDの+側を 抵抗(470Ω使ったけど色により適宜変更)経由で31ピンへ
- LEDの-側を GNDに

GPIOのピンの位置は

https://github.com/FrankWu100/tinker-gpio

を参考に。

下記でLチカ完了のはずです。

> cd ~/Desktop/test
> node test.js

以上！
Google Maps JavaScript API を使うときには必ず region の設定をしてくださいおねがいします

3年くらい前に

* [Googleマップ禁止令が出たのなら、地理院地図をGoogleマップで使えばいいじゃない - Qiita](http://qiita.com/amay077/items/979dfc858a21c8bbb7a9)

という記事を書きました。

これはGoogleマップにて、「竹島や北方領土などが政府方針と反する名称で表記されているケース」があることに対して、ならば「地理院地図」を使えばいいじゃん？という内容でした。

その後、Googleマップ側でも対応がなされ、「ローカライズ」という機能を使うことで、「その国の法律に準拠した地図」にすることができるようになりました（これについても前述の記事の「2013.10.17 追記」に書きました）。

このローカライズについて、もう一度書きます。

**日本向けのWebサービスでGoogleマップを使う場合は、必ず「ローカライズ」の機能を使用してください**

具体的には、 次の通りです。

* [Google Maps JavaScript API / マップのローカライズ](https://developers.google.com/maps/documentation/javascript/localization?hl=ja)

Google Maps JavaScript API の埋め込みスクリプトタグで、

```html
<script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&language=ja&region=JP">
</script>
```
のように ``region=JP`` を付けてください、これだけです。

## 対応どうでしょう？

さて著名なWebサービスではちゃんと設定してくれてますよね？
※Google Maps のスクショを貼るのは規約で禁止されているのでボカしてます（これでクリアできているとも思いませんが）。

### 期待される表記

いわゆる「政府方針の通りの表記」のみがされている状態

![](http://blog.amay077.net/assets/images/posts/should_set_region_jp_to_googlemaps_01.png)

### 楽天トラベル

あぼーん

![](http://blog.amay077.net/assets/images/posts/should_set_region_jp_to_googlemaps_02.png)

### じゃらん

ぐえぇぇ

![](http://blog.amay077.net/assets/images/posts/should_set_region_jp_to_googlemaps_03.png)

### ぐるなび

ぎゃあぁぁあ

![](http://blog.amay077.net/assets/images/posts/should_set_region_jp_to_googlemaps_04.png)

### たべろぐ

お、おぅ

![](http://blog.amay077.net/assets/images/posts/should_set_region_jp_to_googlemaps_05.png)

ぜ、全滅だと・・・・。

## まとめ

お願いですからGoogleマップを使うときは「ローカライズ」をしてください。
私自身はそんなに気にしないのですが、へんなツイートみちゃったか[ら](https://twitter.com/yamazogaikuzo/status/899396971433086976)。こういうことに税金使われたい？
Amazon RDSの情報からmysql_config_editorを一気に設定するスニペット

AWS CLIとJQを使ってmysql_config_editorのコマンドを生成するスニペットです。
PWは自分で入れる感じです。

```
$ aws rds describe-db-instances | jq -r '.DBInstances[] | ["mysql_config_editor set", "--login_path="+.DBInstanceIdentifier, "--host="+.Endpoint.Address, "--user="+.MasterUsername, "--password"] | join(" ")' | xargs -I{} sh -c 'echo {}; {}'
mysql_config_editor set --login_path=hogedb --host=hogedb.aaaaaaaa.ap-northeast-1.rds.amazonaws.com --user=masteruser --password
Enter password:
```
【R】[shiny] shinyにJavascriptを組み込む 1.導入

# JavaScriptベースのウィジットの構築方法

![スクリーンショット 2017-08-23 午後1.35.22.png](https://qiita-image-store.s3.amazonaws.com/0/143058/d7e12bd9-d4ce-99ed-a488-e579033ba7da.png)

[How to build a JavaScript based widget] (https://shiny.rstudio.com/articles/js-build-widget.html) を和訳しながら学びます

##目次

1.導入
　1.1 ダッシュボードアプリの作成
　1.2 ダッシュボードデータ
　1.3 ダイナミックヘルプシステムの作成
　1.4 バインディングの作成
　1.5 チュートリアル資料

[※widgetとは] (https://kotobank.jp/word/%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88-990)

## 1.1 ダッシュボードアプリの作成
 
これから作成するウィジットはすべて、[d3.js](https://d3js.org/)を元とした[c3.js](http://c3js.org/)に基づいています。[c3.js](http://c3js.org/)は、ゲージ・円グラフ・積み上げ棒グラフ・積み重ねエリアチャート・時系列を表示するグラフなど、さまざまな種類のチャート、さらには、レンダリング後の図の状態にアクセスし、アップデートするための[API](http://c3js.org/examples.html)やコールバックを提供します。
　
　
このチュートリアルでは、ウィジット作成技術習得のために、色々なhtmlウィジットを含むインタラクティブなダッシュボードアプリケーションを作成します。
(イメージ画像)
![example.png](https://qiita-image-store.s3.amazonaws.com/0/143058/9d881caa-85c0-64ad-226f-6292358f63ed.png)

(一部略)

## 1.2 ダッシュボードデータ

ダッシュボードに表示するデータは、保険会社から得られた以下のようなデータで、保険期間中に新規に新たな保険に加入する人に関する情報を表します。

| id | date | score | result | branch | product | label |
|:--:|:----:|:----:|:----:|:----:|:----:|:----:|
| 1  | 2014-04-10 |     0  | GREEN  |Generated  |Property |      Claims |    Phone |
| 2  | 2015-10-22 |    60  | AMBER  |Generated  |Property |     New car |    Phone |
| 3  | 2015-11-10 |   150  |   RED  |   Damage  |Property |  Acceptance | Internet |
| 4  | 2015-11-06 |    25  | GREEN  |   Damage  |Liability|     Claims  |   Phone  |
| 5  | 2014-09-29 |    10  | GREEN  |   Damage  |   Pets  |Acceptance   |Internet |
| 6  | 2014-01-28 |     5  | GREEN  |   Damage  |Property | New driver  |  Agency |

データは、行が保険に対する審査結果を示します。
ID      :ID
date    :審査年月日
score   :推定リスクスコア(高いほどハイリスク)
result  :結果(score:0~50→GREEN,score:51~75→AMBER,score:100~→RED)
最後の4列:保険申込書(policy applications)のデータ

(イメージ画像)の4つのゲージは、特定の期間におけるREDの割合を示しています。ユーザーは左のトップダウンメニューで、リスクグループを選択する事ができます。
ゲージの下の円グラフでは、様々なプロセス、ラベル、商品、支店ごとの審査結果の分布が示されています。
中央の棒グラフと折れ線グラフでは、灰色の棒グラフが週ごとの審査数を表し、GREEN,RED,AMBER,BLACKがそれぞれの推定スコアに対応しています。
一番下の図は、絶対値表示か、割合による表示かを切り替えて表示することができます。
それぞれの図の種類に対して、別々のhtmlウィジットを作成します。

## ダイナミックヘルプシステムの作成

ウィジットの作成方法に加えて、本チュートリアルでは、インタラクティブなダイナミックヘルプシステムの作り方も合わせて扱います。ヘルプシステムは、[intro.js](http://introjs.com/)というJavascriptのライブラリーにもとづいており、Webサイトの段階的なガイドを作成できます。
アノテーションレイヤーとナビゲーションシステムを組み合わせて、選択した要素の周りに素敵なボックスを表示します。
(イメージ画像)
![example2.png](https://qiita-image-store.s3.amazonaws.com/0/143058/668f95b5-409b-143a-f013-0c7bc330a490.png)

## バインディングの作成

チュートリアルの終盤で、カスタム入力バインディングを作成します。入力バインディングは、クライアントからイベントを取得し、それをshinyに送信する部品です。(例：action button)


## チュートリアル資料

例に出てくるコンテンツは[Github](https://github.com/FrissAnalytics/shinyJsTutorials)に掲載されています。





---
今回はここまで！



### 参考

[How to build a JavaScript based widget] (https://shiny.rstudio.com/articles/js-build-widget.html)


続きはこちらから
[【R】[shiny] shinyにJavascriptを組み込む 2.Stand alone example ~ 4.First example](http://qiita.com/sasaki_K_sasaki/items/fd2919156481ba243d6d)
[【R】[shiny] shinyにJavascriptを組み込む 5. Extending the gauge ~ tutorial1の終わりまで](https://qiita.com/sasaki_K_sasaki/items/ffa8bec3a30ed1ed9538)
コンテナベースの環境に移行したTravisでsudoを使わずにtimezoneの設定を行う

Travisでは最近、コンテナベースの環境がデフォルト環境として移行が進んでいます。

[参考：Travis 公式ブログ](https://blog.travis-ci.com/2017-07-11-trusty-as-default-linux-is-coming)

そして、その移行後の環境の制約として、before_scriptなどで`sudo`コマンドが使えないというものが付きました。

弊社ではRailsのアプリをTravisでテストしてからデプロイを行なっていますが、これまでタイムゾーンの設定を以下のようにsudoコマンドに依存した形で設定していました。

```yaml:.travis.ymlの抜粋
sudo: required
dist: precise
language: ruby
rvm:
- 2.3.4
bundler_args: "--without development staging production"
cache: bundler
addons:
  postgresql: "9.3"
before_script:
  - echo 'Asia/Tokyo' | sudo tee /etc/timezone
  - sudo dpkg-reconfigure --frontend noninteractive tzdata
  - psql -c 'create database travis_ci_test;' -U postgres
  - cp config/database.yml.travis config/database.yml
```

ちなみに、`sudo: required`と`dist:precise`は移行後もsudoを使える以前の環境でビルドしたいときに設定するもので、これまではこの設定があるから`sudo`を使っていても大丈夫でした。

しかし、そろそろコンテナベースの環境へ移行したかったので、以下のように変えました。

```yaml:.travis.ymlの抜粋
sudo: false
language: ruby
rvm:
- 2.3.4
bundler_args: "--without development staging production"
cache: bundler
addons:
  postgresql: "9.3"
before_script:
  - export TZ=Asia/Tokyo
  - psql -c 'create database travis_ci_test;' -U postgres
  - cp config/database.yml.travis config/database.yml
```

ポイントは、`sudo:false`を指定しているのと、
before_scriptのところで、以前は`sudo`を使って

```yaml
  - echo 'Asia/Tokyo' | sudo tee /etc/timezone
  -   - sudo dpkg-reconfigure --frontend noninteractive tzdata
```

としていたのを

```
  - export TZ=Asia/Tokyo
```

に変えたところですね。
意外とこの変更について日本語で記載している人がいない気がしたので記事を書いてみました。
気になる記事

[AMPページをGoogleアナリティクスで計測するベストプラクティス
](https://ayudante.jp/column/2017-08-21/08-00/)

[人工知能（AI）を実現するディープラーニング（深層学習）の
プログラムを生成できる「コアライブラリ」をオープンソース化](https://www.sony.co.jp/SonyInfo/News/Press/201706/17-065/)

[人とAIの共存を主とする「Google PAIR」、機械学習（NN含む）をブラウザ上で全て実行できるWebMLライブラリ「deeplearn.js 0.1.0」をリリース](http://shiropen.com/2017/08/12/27359)

---
kintoneプラグイン『機能拡張スタンダード All-In』を使って自動計算でのレコード一括更新を行う

kintoneプラグイン[『機能拡張スタンダード All-In』](https://spica.tokyo/bluelaunch)の<strong>自動計算を使ったレコード一括更新機能</strong>についての説明です。

#使いかた

##更新開始ボタン
一覧ページに一括更新を開始するボタンを設置して使用します。
![bl_ss_1.6.0_17081701.png](https://qiita-image-store.s3.amazonaws.com/0/67365/62cd6511-a6dd-738a-ba5f-57e01cdf64bc.png)

ボタンの設置はプラグイン設定「一覧管理」で設定します。
![bl_ss_gen_005_01.png](https://qiita-image-store.s3.amazonaws.com/0/67365/5d2eb847-2684-dec0-0234-397aa5e89cc8.png)

##ボタンを設置するユーザーの制限

プラグインをインストールした初期状態では、一括更新ボタンは表示されません。<strong>全てのユーザーに表示する</strong>か、<strong>アカウントを指定して表示する</strong>かを設定します。
![bl_ss_1.6.0_17081702.png](https://qiita-image-store.s3.amazonaws.com/0/67365/a74dbdc4-369f-5442-ebbf-f72b97d1e542.png)

#自動計算による一括更新の概要

プラグイン機能「自動計算」の設定内容を使用して、更新対象レコードで再計算を行い、一括更新を行います。
更新対象は一覧ページで絞込条件にマッチするレコードです。
「一括更新」ボタンを押すと、ダイアログが表示されウィザード形式で更新内容の設定と実行を進めます。

自動計算の設定についてはこちらを参考にしてください。
[kintoneプラグイン『機能拡張スタンダード All-In』を使って自動採番を行う](http://qiita.com/spica/items/803af7cd540ae0b8f718)

#一括更新の手順

##1. 更新方法の選択
「自動計算を実行する」を選択します。
![bl_ss_1.6.0_17081703b.png](https://qiita-image-store.s3.amazonaws.com/0/67365/68610bce-8724-4c86-ec7e-ef0e0d80ee50.png)

##2. 自動計算のオプション設定

ふたつのオプション設定を行います。
![bl_ss_1.6.0_17081704.png](https://qiita-image-store.s3.amazonaws.com/0/67365/3ab24414-d91e-6779-e9af-a6e364db9557.png)

###・「新規レコード編集に限定」と指定されている計算の再計算を行うか

自動計算の設定では、<strong>新規レコード作成時に限定した計算処理</strong>を作ることができます。
この計算処理を一括更新での再計算でも行うかどうかの設定です。
自動採番を振り直したい場合などを想定したオプションです。

###・インデックス算出の基準とする日時フィールド

自動計算には、<strong>年次インデックス</strong>や<strong>月次インデックス</strong>といった、自動採番のための機能があります。

通常これらのインデックスはレコードの作成日時を基準として算出されていますが、一括更新では基準とする日時フィールドを選択することができます。

任意の日時データで自動採番の振り直しなどを行いたい場合や、バックアップのCSVデータ読み込みでレコードを多数登録した場合などを想定したオプションです。

##3. 更新内容の確認

オプション内容を確認します。
![bl_ss_1.6.0_17081705.png](https://qiita-image-store.s3.amazonaws.com/0/67365/529ab827-8821-bed8-cff1-b27245f8d1d8.png)

<font color="Crimson">一括更新を実行する前にCSVファイル等にバックアップをとることをおすすめします</font>

##4. 更新の実行

絞込条件にマッチしているレコードを対象に更新が開始され、進捗が表示されます。
APIコールは、レコード100件につき2回行われます。
![bl_1.5_ss_06.png](https://qiita-image-store.s3.amazonaws.com/0/67365/d52b9547-c300-7dd6-6b5b-1dd5bef84030.png)

途中でエラーが発生した場合でも処理は中断せず、すべての対象レコードに対して更新を実行します。

##5. 実行結果の表示

正常に更新できると実行終了となります。
![bl_1.5_ss_07.png](https://qiita-image-store.s3.amazonaws.com/0/67365/14154c40-3bb3-a496-8938-3714c7e4623c.png)

エラーがあった場合はエラー内容が表示されます。
![bl_ss_1.6.0_17081706.png](https://qiita-image-store.s3.amazonaws.com/0/67365/78bcb3f7-8b56-c9d5-5594-47bacd443c36.png)

---
#このプラグインについて
・自動計算・自動採番 - [kintoneプラグイン『機能拡張スタンダード All-In』を使って自動採番を行う](http://qiita.com/spica/items/803af7cd540ae0b8f718)
・条件書式 - [kintoneプラグイン『機能拡張スタンダード All-In』を使って条件書式を設定。CSSも使ってみる](http://qiita.com/spica/items/24027003e9dfb9363819)
・フィールド属性 - [kintoneプラグイン『機能拡張スタンダード All-In』を使ってルックアップ編集や再利用指定などなど条件毎に設定する](http://qiita.com/spica/items/73107bda2cff4a94cf41)
・選択数制御 - [kintoneプラグイン『機能拡張スタンダード All-In』を使ってユーザー選択、複数選択などの選択数を制御する](http://qiita.com/spica/items/1c3ba3927b844b6bb72b)
kerasのLSTMでアイテム購入履歴からロイヤルカスタマーになるか予測

アイテムの買い方のパターンから、この顧客がロイヤルカスタマーになりそうか判定したいというニーズがあると仮定します。
そこで、自然言語処理で単語の出現順に時系列扱いで学習させて感情判定するのを応用し、最初の10個までの購入アイテム履歴から、このユーザーが101個目まで購入しているか予測してみました。

#データとスクリプト
元データ
[UCI Online Retail Data Set](http://archive.ics.uci.edu/ml/datasets/online+retail)

- アイテムをインデックス化する（単なる識別子のため順不同）
- 1顧客1行とし、アイテムを購入された順に当該アイテムのインデックス番号を若いカラムに格納
- 購入されていないカラムはNull

jupyterで見れるスクリプトと加工後のデータはこちら
https://github.com/tizuo/keras/blob/master/is_future_purchase.ipynb
https://github.com/tizuo/keras/blob/master/purchacedata_base.csv

##注意点
以下の理由から、今回のデータは本来的に適していないので注意。あくまでも手法の覚書になります。
サンプルにちょうど良いデータがあったら教えてください。

- 1回の購入アイテム数の最頻値は2となり、最大749と幅広く歪度の高い分布
- ホールセール業者への販売記録になるため、総購入回数の75%点でも5回と少ない（つまり、101個目を買っているか予測してもあまり意味がない。。）

#必要なパラメタの説明
最大index：アイテム数でなく、インデックスがとりうる最大の数に1を足した数を入れる
履歴の枠数：1顧客につき、データセット内に格納したアイテム履歴の数

今回はアイテムに振られたインデックスの最大値が4213、渡す履歴の数が10なので以下のように記述。

```python
top_words = 4214 # insert max index of items + 1
max_length = 10 # length of sequential data
```

#データの読み込みと加工

Yの値がソートされているので、学習用データとテスト用データをランダム抽出します。
抽出したらkerasに投入するためにndarrayに変換します。

```python
df = pd.read_csv("purchacedata_base.csv", header=0)
df = df[df.columns[0:(max_length + 2)]].dropna().astype(int)

train_X, test_X, train_Y, test_Y = cross_validation.train_test_split(df[df.columns[2:(max_length + 2)]], df["Y"])

train_X = train_X.values
train_Y = train_Y.values
test_X = test_X.values
test_Y = test_Y.values
```

#モデルの構築
embedding_vector_length　に出力数を代入します。LSTMのステップ数は最頻値の2より1足して3にしました。増やしてもあまり変わらないので、やはりこのデータだとあまり意味がなさそうです。

```python
embedding_vector_length = 5
model = Sequential()
model.add(Embedding(top_words, embedding_vector_length, input_length=max_length))
model.add(LSTM(3))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
print(model.summary())
model.fit(train_X, train_Y, validation_data=(test_X, test_Y), epochs=3, batch_size=64)
```
##検証
```python
scores = model.evaluate(test_X, test_Y, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))
```

テストデータの正答率は72.41%でした。

#今後の展望
一回あたりに購入する数が異なるので、畳込み的に圧縮して購入毎のシーケンスが作れないものかと考えています。
JUMAN++, KNP, pythonを使うためのDockerコンテナを立てたときのメモ

# 目的
JUMAN++ と KNP を使って係り受け解析をしたかったのですが、手元にwindows PCしかないために、Docker for Windowsを使って環境構築をしました。

# 問題
jumanpp の ./configure が通らない。

```
checking for boostlib >= 1.57... configure: We could not detect the boost libraries (version 1.57 or higher). If you have a staged boost library (still not installed) please specify $BOOST_ROOT in your environment and do not give a PATH to --with-boost option.  If you are sure you have boost installed, then check your version number looking in <boost/version.hpp>. See http://randspringer.de/boost for more documentation.
configure: error: "Error: cannot find available Boost library."
```

# 原因
2017/08/21現在、pythonコンテナのlatestはDebian(jessie)なんですが、
jessieのlibboost-devパッケージのバージョンが1.55だった。

https://packages.debian.org/ja/jessie/libboost-dev

stretchのlibboost-devパッケージのバージョンは、1.62
https://packages.debian.org/ja/stretch/libboost-dev

# 解決策
pythonコンテナをDebian(stretch)で使う。
僕は`3-stretch`を使用しました。

# 迷走した理由

以下のページにまとめてくださっている方がいて、同じエラーだったので大丈夫だと思ってしまったのが理由です…。
大丈夫だと思ってしまったので、他のところに原因があるのではないかと思い迷走しました。

> 追記 configureでエラーが出たら
> [...]
> 以下のコマンドでインストールすると解決する場合があるようです。実際に自分の環境ではこれで解決できました。
>`sudo apt-get install libboost-all-dev`
> 
> 引用：[MeCabよりも高精度なJUMAN++をUbuntuにインストールしたよ | Foolean – 備忘録風雑記ブログ](https://foolean.net/p/499)
JMeter覚書【Javaアプリでmultipart/form-dataのサンプリングを行う場合の設定】

ちょっとハマったので自分用に覚書

###JMeterでJavaアプリのmultipart/form-dateをサンプリングする場合

HTTP プロキシサーバのHttp Sampler settingsのType：を「Java」にする。

![Image 1.png](https://qiita-image-store.s3.amazonaws.com/0/98458/332631ee-1105-72fe-4e36-ad882dd6d167.png)

この設定を行わない場合、multipart/form-dateはデフォルトであろうと思われるHttpClient4の形式で送信されることになる。
受け取ったJavaアプリが解析できずにExceptionを吐くことになる。
(　´∀｀)＜ぬるぽ
■━⊂(　・∀・) 彡 ｶﾞｯ☆`Д´)ﾉ
Unity5.6.2 Android ビルドエラー対応

**xmlns:tools="http://schemas.android.com/tools"** をAndroid Manifestに足したら行けた。

参照URL：http://answers.unity3d.com/questions/1355793/error-while-saving-blame-file.html


```
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     package="com.unity3d.player"
     android:installLocation="preferExternal"
     android:versionCode="1"
     android:versionName="1.0">
```
StorybookをVuejsで使う

![Screen Shot 2017-08-21 at 17.08.26.png](https://qiita-image-store.s3.amazonaws.com/0/7565/3baf1c3e-520a-9c3c-0d14-b4b46518b7f1.png)


[Storybook](https://storybook.js.org/)3.2からVuejsのサポートが追加されたので、さっそく使ってみます。

Storybookはコンポーネントのカタログを簡単に作成できるツールで、プロジェクト内の自作コンポーネント一覧や使いかたをカタログにできます。

![Screen Shot 2017-08-21 at 16.54.49.png](https://qiita-image-store.s3.amazonaws.com/0/7565/899f8ef8-1dd4-5e4c-8dfb-56e431a37b6c.png)


## storybook/cli のインストール

```bash
npm i -g @storybook/cli
```


## 既存のVuejsプロジェクトで準備

```bash
cd vuejsのプロジェクトがあるディレクトリ
```

## ストーリーブックのインストール

```bash
getstorybook
```

## storybookサーバの起動

```
yarn run storybook
```

この状態で、http://localhost:6006/ を開くと初期設定の画面が開きます。

## コンポーネントの追加

ストーリーブックにコンポーネントを追加するには、`getstorybook`で作成された、`stories` ディレクトリの `index.js` に定義を追加していきます。

この `stories` ディレクトリは、 `.storybook/config.js` を編集することで変更することができます。



## 参考資料

* [Introducing: Storybook for Vue  🎉 – Storybook – Medium](https://medium.com/storybookjs/introducing-storybook-for-vue-940f222541c5)
* [Announcing Storybook 3.2 – Storybook – Medium](https://medium.com/storybookjs/announcing-storybook-3-2-e00918a1764c)
* [storybook/MIGRATION.md at master · storybooks/storybook · GitHub](https://github.com/storybooks/storybook/blob/master/MIGRATION.md#from-version-31x-to-32x)
ちょっとずつ読むドメイン駆動設計 第一部 ドメインモデルを機能させる 序章3

# ドメインモデリングとは何か
> - ドメインモデリングとは、モデルをできるだけ「写実的に」作成することではない(第一部 序章より)
> - ドメインモデリングは、必要な結果を出力するソフトウェアの仕組みを構築するだけでもない(同上)
> - ある目的に従って、現実の概要を表現しているのだ(同上)

活動としてのドメインモデリングについて。

["モデルとは"](http://qiita.com/YasuhiroKimesawa/items/386b43d684518656fd10)、["ドメインとは"、"ドメインモデルとは"](http://qiita.com/YasuhiroKimesawa/items/9d883ffa063472538ce5)での話しと同様の内容ではありますが、大事だと思ったのは、 **"必要な結果を出力するソフトウェアの仕組みを構築するためだけにモデリングをするのではない"** ということ。

作成するViewに沿っただけのドメインモデルを構築してしまいがちだけど、それはドメインについての深い考察を無視しているようなもの。

それだけではなく、**ビジネスの問題を解決するために"現実の概要として表現"する** ということを忘れてはいけないということですね。

ドメインモデルは現実の概要を表現する。
laravel namespace routing

```php
//prefix -> url /admin/...

//namespaceは下のControllerを読み込みため書いておく
Route::prefix('admin')->namespace('admin')->group(function () {
    Route::get('menu', function () {
        return view('admin/menu');
    });
    Route::resource('projects', 'ProjectController', ['only' => ['index', 'create', 'store']]);
    Route::resource('users', 'UsersController', ['except' => [
        'show'
    ]]);
    Route::get('daylog', 'DayLogController@index');
});
```
iPhoneアプリ作ってみたい人にオススメ！　参考書紹介

#この記事をオススメする人
・プログラミング知識はないけど、iPhoneアプリを作ってみたい人
・プログラミング知識はあるけど、初めてXcodeを触る人
・Xcodeの使い方がわからなくて挫折した人
・どんな参考書使って良いかわからないという人
・白黒の参考書は苦手・・・という人
・とにかく動くものを作ってみたい！という人

私自身、Webアプリケーションのプログラミング知識はあったものの
Xcodeはeclipseと全然違いすぎて使い方が全く分からず挫折した経験を持っていました。

#オススメの参考書

[これからつくる iPhoneアプリ開発入門 ～Swiftではじめるプログラミングの第一歩～](http://amzn.asia/32ARxYp)


#おすすめする理由3つ

##説明がとてつもなく丁寧
1クリックごとに説明が記載されているのではないかと思うほどの説明が丁寧です。
80歳のおばあちゃんでも参考書通り進めて行くとアプリが作れるはず。

##動くものが作れる！
説明通り進めていくと、サンプルアプリを作ることができます。

##カラーで見やすい
全編カラーなので見やすいです。

#追記：
丸の内の某大型書店で30冊以上ある中から1時間かけて吟味して購入しました。
今までプログラミング問わず、参考書と呼ばれるものはたくさん購入してきましたが、一番わかりやすい参考書です。
Windows > Miniconda + GFortran > Anaconda Prompt利用により、パス設定は不要

```txt:動作環境
Windows 7 Pro (32bit)
Python 3.6 Miniconda: 32-bit (exe installer)
```

Windows上でFortranプログラムを実行する環境として、Minicondaを試した。

[Windows版Minicondaでf2py](http://qiita.com/tenomoto/items/57f46652ecef1ee03c10)

上記の「gfortranのインストール」を実行するのだが、同じ手順ではなく、以下のようにした。

1. Miniconda3インストール
2. スタートメニュー > Anaconda3 (32bit) > Anaconda Prompt
    - 管理者権限で実行
        - gcc-fortranインストールのため
3. `conda install m2w64-gcc-fortran`を実行
4. Anaconda Promptを終了

GFortranを利用するユーザにて

1. スタートメニュー > Anaconda3 (32bit) > Anaconda Prompt
    - 一般ユーザ権限で実行
    - gfortran.exe へのパスも通っている
        - pathコマンドで確認できる
2. `gfortran ファイル名`でコンパイル

場合によっては「環境変数」に設定をする必要があるかもしれないが、自分の利用用途としては上記でよさそうだった。
Azure face APIで遊んでみよう　その3~双子の識別

#双子の識別
さて、顔認識について誰でも疑問に思うだろうこと、それは似ている顔の人をちゃんと区別できるのかということです。幸いにも我が家には双子の娘がいるので、どれくらいの精度で区別できるかを試してみたいと思います。

##顔の検証
前回試してみたように、face groupを作成し、個人の顔を識別することが可能ですが、トレーニングが必要だったりと少し面倒です。そこで今回は、顔の検証の[Face - Verify](https://westcentralus.dev.cognitive.microsoft.com/docs/services/563879b61984550e40cbbe8d/operations/563879b61984550f3039523a)を使用してみたいと思います。
このメソッドは、顔がface groupに含まれるか、あるいは2つの顔が同じ人物かを検証することが可能です。

まず、2人の顔が映っている写真を用いて、Detectメソッドで顔の検出を行います。
以下のようなレスポンスがありました。3歳なので、ageもほぼほぼ正確です。

```json:response1
[
  {
    "faceId": "c51b3384-0661-4171-9454-5fbbf804f887",
    "faceRectangle": {
      "top": 194,
      "left": 469,
      "width": 174,
      "height": 174
    },
    "faceAttributes": {
      "smile": 0.999,
      "gender": "female",
      "age": 2.9
    }
  },
  {
    "faceId": "f5acd026-a13a-4862-8060-7f67fa11b67a",
    "faceRectangle": {
      "top": 157,
      "left": 93,
      "width": 144,
      "height": 144
    },
    "faceAttributes": {
      "smile": 0.996,
      "gender": "female",
      "age": 3.9,
      }
   }
]
```
次にVerivyメソッドを呼び出します。
https://westcentralus.api.cognitive.microsoft.com/face/v1.0/verify

以下のように2つのFaceIdをデータとして渡すことが可能です。

```json:verify.json
{
    "faceId1":"c51b3384-0661-4171-9454-5fbbf804f887",
    "faceId2":"f5acd026-a13a-4862-8060-7f67fa11b67a",
}
```

さて、注目の結果ですが、
{
  "isIdentical": true,
  "confidence": 0.78104
}

confidence 0.78で同一人物と判定されました。なんともいえない微妙な結果ですが、明らかに別人と判断されないという意味では正しい結果といえます。6歳の兄の写真で再び試してみましたが、以下のような結果になりました。

```json:verify2.json
{
  "isIdentical": false,
  "confidence": 0.42475
}
```
双子じゃなければ同一人物かどうかはそれなりの精度があると思われます。

##まとめ
似ている顔で写っている写真を選んだというのもありますが、Verifyメソッドだけを用いて、双子の写真を区別するのはなかなか難しそうです。今回はトレーニングを伴わないVerifyメソッドを使用しましたが、トレーニングを行った場合にはおそらくもう少し精度が高くなると思われます。APIドキュメントにも、
> For the scenarios that are sensitive to accuracy please make your own judgment.

と書いてありますし、認識精度が必要なシナリオの使用法については慎重に検討する必要がありますね。
あと、こういったAPIについて記事を書くとき、元の写真にオーバーレイで認識した顔を矩形表示したりしないと、JSONの中身を見るだけで楽しくないことが分かりました。
ということで、今後はOpenCVなども使っていこうと思います。
SELinuxよりNginxの４０３エラーについて

新しくインストールしたNginxのhtmlフォルダに他箇所に作成したファイルをコーピーし、403になた。

おおむね操作の流れ

```
# yum install nginx

# cd /tmp

# echo "hello" > result.html

# mv result.html /usr/share/nginx/html/

```

エラーログ`/var/log/nginx/error.log`にこうなっています。

```
2017/08/21 02:33:21 [error] 10738#0: *5 open() "/usr/share/nginx/html/result.html" failed (13: Permission denied), client: 10.0.2.2, server: _, request: "GET /result.html HTTP/1.1", host: "localhost:8080"
```

Nginxのユーザは`nginx`、それにファイルシステムにちゃんとあってます。

```
drwxr-xr-x. 2 nginx nginx 4096 Aug 21 02:38 html
```

パーミッションが正しくなっているのに、ログに`Permission denied`が出ったのはおかしいです。

```
# getenforce
Enforcing
# setenforce Permissive
```

結果的にはSELinuxのが原因です。

ちょっと調べたら、こういうことです。

```
# ls -Z 
-rw-r--r--. nginx nginx system_u:object_r:httpd_sys_content_t:s0 index.html
-rw-r--r--. nginx nginx unconfined_u:object_r:user_tmp_t:s0 result.html
```

`result.html`ファイルのラベルが明らかに違います。

解決案は、SELinuxを無効にるか、または`restorecon`などのコマンドよりラベルをリフレッシュするか。

```
# restorecon result.html
# ls -Z  
-rw-r--r--. nginx nginx unconfined_u:object_r:httpd_sys_content_t:s0 result.html
```

`user_tmp_t`から`httpd_sys_content_t`になったことがわかると思います。

参考：

* http://totech.hateblo.jp/entry/2015/04/05/223714
* http://qiita.com/hmuronaka/items/6236d541085efb25a92c
* http://enakai00.hatenablog.com/entry/20121112/1352693845