OmniAICreator/Qiita-1.07M huggingface dataset:
テキスト解析モジュールEsanpyでNEologdを使う

[Esanpy](https://github.com/codelibs/esanpy)は日本語形態素解析など、いろいろなトークナイズが可能なPythonモジュールですが、[NEologd](https://github.com/neologd/mecab-ipadic-neologd)もプラグインをインストールするだけで利用することができます。(Esanpyの導入方法は[Pythonで使える形態素解析モジュールEsanpy](https://qiita.com/shinsuke_sugaya/items/41237a50601125f5529c)を参照してください)

## NEologdプラグインのインストール

Esanpyのサーバを停止してからインストールする必要があるので、停止してから--pluginオプションで指定します。これだけで利用することができます。

```
$ esanpy --stop
$ esanpy --plugin org.codelibs:elasticsearch-analysis-kuromoji-neologd:5.6.1
```

## 動作確認

esanpyコマンドで利用できるか確認してみます。

```
$ esanpy --text "10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。" --analyzer kuromoji_neologd
10日
放送
中居正広のミになる図書館
テレビ朝日
系
smap
中居
中居正広
正広
篠原
篠原信一
信一
過去
勘違い
明かす
一幕
```

ちなみに、普通のkuromojiで実行すると以下のような結果になります。

```
$ esanpy --text "10日放送の「中居正広のミになる図書館」（テレビ朝日系）で、SMAPの中居正広が、篠原信一の過去の勘違いを明かす一幕があった。" --analyzer kuromoji
10
日
放送
中居
正広
ミ
図書館
テレビ朝日
系
smap
中居
正広
篠原
信一
過去
勘違い
明かす
一幕
```

今回、インストールしたプラグインは[Elasticsearch Analysis Kuromoji Neologd](https://github.com/codelibs/elasticsearch-analysis-kuromoji-neologd)になります。Tokenizerなどもあるので、これらを組み合わせることでより柔軟なトークナイズができると思います。
Rails の Time#beginning_of_day と同様のことを、タイムゾーンを考慮しつつ PostgreSQL で行う

# 前提

Rails のタイムゾーンが `Asia/Tokyo` であり、かつ DB のタイムゾーンが `UTC` である。

```rb
Time.zone.to_s
=> "(GMT+09:00) Tokyo"

ActiveRecord::Base.connection.execute('SHOW TIME ZONE').first
#=> { "TimeZone" => "UTC" }
```

# はじめに

例えば Rails に Character というモデルがあり、本日更新された Character レコードを取得したい場合、次の方法があります。

```rb
now = Time.zone.now
#=> Thu, 12 Oct 2017 14:48:11 JST +09:00

beginning_of_today = now.beginning_of_day
#=> Thu, 12 Oct 2017 00:00:00 JST +09:00

beginning_of_tomorrow = now.tomorrow.beginning_of_day
#=> Fri, 13 Oct 2017 00:00:00 JST +09:00

Character
  .where('characters.updated_at >= ?', beginning_of_today)
  .where('characters.updated_at < ?', beginning_of_tomorrow)
  .to_sql
#=> SELECT "characters".* FROM "characters"
#   WHERE (characters.updated_at >= '2017-10-11 15:00:00'
#      AND characters.updated_at < '2017-10-12 15:00:00')
```

本日の開始時刻以降かつ明日の開始時刻より前に更新されたレコードという条件で絞り込んでいます。このとき SQL に含まれる時刻がそれぞれ 9 時間前に自動的に変換されています。つまり ActiveRecord が SQL を生成するときに、タイムゾーンを自動的に UTC に変換してくれていることが分かります。

これと同様のことを Rails (ActiveSupport の Time#beginning_of_day や ActiveRecord) を利用せずに PostgreSQL の SQL のみで完結させるのが今回の目的です。

# 方法

```sql
SELECT
  *
FROM
  characters
WHERE
  characters.updated_at >= ((now()::date)::timestamptz at time zone 'utc') -- beginning_of_today
  AND characters.updated_at < ((now()::date + 1)::timestamptz at time zone 'utc') -- beginning_of_tomorrow
;
```

* `now()` 関数を date 型にキャストすることで時刻情報を取り除き、再度 timestamp with time zone 型に戻す。
* date 型の値に `+1` することで明日の値を取得できる。
* 念のためデータベースの現在の (SELECT 文発行時の) タイムゾーンが UTC 以外になっている場合でも問題ないように UTC に変換する。

```sql
SET TIME ZONE 'Japan';

SELECT
  (now()::date)::timestamptz AS beginning_of_today,
  (now()::date + 1)::timestamptz AS beginning_of_tomorrow,
  (now()::date)::timestamptz at time zone 'utc' AS beginning_of_today_utc,
  (now()::date + 1)::timestamptz at time zone 'utc' AS beginning_of_tomorrow_utc
;
```
```
   beginning_of_today   | beginning_of_tomorrow  | beginning_of_today_utc | beginning_of_tomorrow_utc
------------------------+------------------------+------------------------+---------------------------
 2017-10-12 00:00:00+09 | 2017-10-13 00:00:00+09 | 2017-10-11 15:00:00    | 2017-10-12 15:00:00
(1 row)
```

# 参考

* [PostgreSQL » 4.2. Value Expressions » 4.2.9. Type Casts](https://www.postgresql.org/docs/current/static/sql-expressions.html#sql-syntax-type-casts)
* [timestamp with time zone型はタイムゾーン情報を持っていない](https://qiita.com/yuba/items/7852a29d63d6279c6f6e)
Cognos Analyticsのアンインストール

CognosAnalyticsをアンインストールしようとすると、マニュアルの記載方法は古いままということに気がつく方も多いと思います。
ここではLinux環境のCognosAnalytics11.0.6のアンインストーラーを使用して実際にアンインストールした作業を紹介します。作業をする場合の参考にしてください。

VNCなどのツールを使用してCognosサーバーにログオンし、Cognosが起動している場合はCognos停止します。
次に、インストール場所のディレクトリーに移動します。
"Uninstall_IBM_Cognos_Analytics"という名前の、アンインストーラーを実行してCognosアンインストーラーを起動してください。

起動イメージ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/09bdfaa8-1c89-243f-f79d-23f63c0c7d4b.png)

「Uninstall」ボタンを押してください。

以下のような感じで、完了結果が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/f501c548-cecd-54c8-ae14-14c985d14790.png)

アンインストーラーで削除されなかったファイルは、ユーザーが確認して不要であれば手動で削除してください。
もしも再導入などを行う場合は、一度きれいにディレクトリごと削除してから導入しなおすのがお勧めです。

以上、CognosAnalyticsのアンインストールでした。
開発環境では動くけれどビルドするとエラーを吐くPyQtコード:ボタン(Qt)による終了

# <i class="fa fa-cogs"></i> 検証環境

* Python 2.7 (WinPython-32bit-2.7.10.3)
* Spyder 3.0.0 (同梱)
* PyQt4
* Windows7
* cx_Freeze

# setup.py

```py
from cx_Freeze import setup, Executable

exe = Executable(script = 'script.py',  base = None)

setup(name = 'name',
      version = '0.1',
      description = '',
      executables = [exe])
```


# 症状

exe化したものの実行にのみ発生する。

ウィンドウの閉じるボタンではなく、自作したGUIからQtを終了すると、アプリの動作が停止する。

## エラーメッセージ

通常は出ないが、`base = None`で実行してVSでデバッグを行うと確認できた。

`ハンドルされない例外が 0xXXXXXXXX (QtGui4.dll) で発生しました `

`0xC0000005: 場所 0xXXXXXXXX への読み込み中にアクセス違反が発生しました。`

場所(アドレス)は変動する。

## コード

```py
import sys
from PIL import ImageGrab
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

quit = QtGui.QPushButton('Quit')
quit.clicked.connect(app.exit)

mw = QtGui.QMainWindow()
mw.setCentralWidget(quit)
mw.show()
app.aboutToQuit.connect(app.deleteLater)
app.exec_()
```

# 対処

```py
import sys
from PIL import ImageGrab
from PyQt4 import QtGui

app = QtGui.QApplication(sys.argv)

quit = QtGui.QPushButton('Quit')
quit.clicked.connect(sys.exit)

mw = QtGui.QMainWindow()
mw.setCentralWidget(quit)
mw.show()
app.aboutToQuit.connect(app.deleteLater)
app.exec_()
```

QApplicationを終了するのではなくsys.exitでプログラムを終了させる。
ただし、こちらは自分の開発環境ではカーネルが死んだりするので開発中はappを閉じて、ビルドするときに書き換えたりする。

ウィンドウデフォルトの閉じるボタンを押すエミュレートなどができればそちらがいいだろうか。
二酸化炭素センサー MH-Z19 のPWM入力プログラムを割り込み処理で実現

二酸化炭素センサー MH-Z19 のPWM入力でデータを取得したくて
Arduino用のサンプルプログラムを使ってみたのですが、
このプログラムPWMのパルス長の計測をメイン処理の中でやっていたので、
このままでは他のセンサーとの併用が難しいので、
データ取得部分を割り込み処理に変更してみました。

割り込みには「MsTimer2」ライブラリを使用しています。
またデータのフィルタリングの処理も追加しています。

公開されていた元のプログラム

```c:mh-z19.ino
#define pwmPin A0
#define LedPin 13
 
int prevVal = LOW;
long th, tl, h, l, ppm;
 
void setup() {
  Serial.begin(9600);
  pinMode(pwmPin, INPUT);
  pinMode(LedPin, OUTPUT);
}
 
void loop() {
  long tt = millis();
  int myVal = digitalRead(pwmPin);
 
  if (myVal == HIGH) {
    digitalWrite(LedPin, HIGH);
    if (myVal != prevVal) {
      h = tt;
      tl = h - l;
      prevVal = myVal;
    }
  }  else {
    digitalWrite(LedPin, LOW);
    if (myVal != prevVal) {
      l = tt;
      th = l - h;
      prevVal = myVal;
      ppm = 5000 * (th - 2) / (th + tl - 4);
      Serial.println("PPM = " + String(ppm));
    }
  }
}
```

割り込み処理に変更したプログラム

```c:mh-z19_int.ino
/*
  MH-Z19
  Intelligent Infrared CO2 Module
 
  MsTimer2 is a small and very easy to use library to interface Timer2 with
  humans. It's called MsTimer2 because it "hardcodes" a resolution of 1
  millisecond on timer2
  For Details see: http://www.arduino.cc/playground/Main/MsTimer2
 
  2017/08/20
  NextStep/Kaz Ueno
*/
 
#include <MsTimer2.h>
 
/* Switch on LED on and off each half second */
 
#define     LedPin 13                               /* LED to pin 13 */
#define     pwmPin A0                               /* CO2 data input to pin A0 */
 
boolean     prevVal = LOW;
 
uint32_t    CO2_data = 0L;
uint8_t     data_count = 0L;
 
uint32_t    th, tl, h, l, ppm, ppm_now;
 
uint32_t    ppm_befor = 0L;
uint32_t    tt = 0L;
 
 
 
void flash()
{
  uint8_t myVal = digitalRead(pwmPin);
 
  tt++ ;
  if (myVal == HIGH) {
    digitalWrite(LedPin, HIGH);
    if (myVal != prevVal) {
      tl = tt ; 
      prevVal = myVal;
      tt =0L;
    }
  }  else {
    digitalWrite(LedPin, LOW);
    if (myVal != prevVal) {
      th = tt; 
      prevVal = myVal;
      ppm = 5000 * (th - 2) / (th + tl - 4);         // 取得したデータを二酸化炭素データ(ppm)に変換
      ppm_now = ppm_befor * 0.8 + ppm * 0.2 ;        // 差分方程式のディジタルフィルタ処理
      ppm_befor = ppm_now;
      data_count++ ;
      CO2_data += ppm_now;
      tt = 0L;
    }
  }
}
 
void setup()
{
  Serial.begin(9600);
  pinMode(pwmPin, INPUT);
  pinMode(LedPin, OUTPUT);
 
  MsTimer2::set(1, flash);                            // 1ms毎に割り込みを発生させる
  MsTimer2::start();
  delay(5000);
}
 
void loop()
{
  uint32_t    CO2_data_ave;
  CO2_data_ave = CO2_data / data_count;               // 取得した回数分の平均
  Serial.println("PPM = " + String(CO2_data_ave) +"," + String(ppm_now) +"," + String(ppm));
  CO2_data = 0L;
  data_count = 0L;
 
  delay(5000);
}
```

これで loop()内に他のセンサーの取り込みプログラムが書けます。
なおデジタルフィルタリング処理に関しては
[センサの入力などに使うディジタルフィルタ](https://ehbtj.com/electronics/sensor-digital-filter/)
こちらのページの解説が分かりやすいです。


![割り込みによるCO2でーた取得確認中の様子](http://embed.next-step.asia/wp-content/uploads/2017/08/2cf567115433e7363b259577c35fcda5.png)
GitHubのDependency graphを見る方法


リポジトリが依存しているライブラリなどを可視化するDependency graphというものがリリースされました。
どうやって確認するかわかりにくかったので手順を共有します。

1. 任意のリポジトリにアクセスする
2. Insightsタブを開く
3. Dependency graphメニューをクリックする

↓こんな感じで確認できます
![graph.png](https://qiita-image-store.s3.amazonaws.com/0/18273/db2826cd-51a3-71d8-1ea9-e5c8980d256c.png "graph.png")


参考
https://help.github.com/articles/listing-the-packages-that-a-repository-depends-on/
PHPバージョンアップメモ



下記を読む。

PHP 5.3.x から PHP 5.4.x への移行
http://php.net/manual/ja/migration54.php

PHP 5.4.x から PHP 5.5.x への移行 
http://php.net/manual/ja/migration55.php

PHP 5.5.x から PHP 5.6.x への移行
http://php.net/manual/ja/migration56.php

PHP 5.6.x から PHP 7.0.x への移行
http://php.net/manual/ja/migration70.php



## 確認したほうが良さそうなこと
できるだけ上記リンクからの詳細見るべき、そのなかでの影響ありそうな箇所をリスト

## PHP5.3 → PHP5.4 
* 呼び出し時の参照渡しを非サポート `foo( &$val );`
* $a が文字列時、非数値のオフセットを指定したときのisset, emptyの評価

```php
$a='abcd';
# $a[2]=> "c"


#PHP5.3の場合
>>> $a['b']
=> "a"
>>> empty($a['b'])
=> false
>>> isset($a['b'])
=> true

#PHP5.4の場合
$a['b'] =>
PHP warning:  Illegal string offset 'b' on line 1
>>> empty($a['b'])
=> true
>>> isset($a['b'])
=> false
```

* php.ini タイムゾーンを必ず指定 `date.timezone = "Asia/Tokyo"`
* short_open_tagの設定必要なしで常にshort_open_tag有効
* 継承でメソッドのオーバーライドを継承元と同じメソッド定義にする

```
Notice: Declaration of CsvUploadBehavior::setup() should be compatible with ModelBehavior::setup(Model $model, $config = Array)
```



## PHP5.4 → PHP5.5

* Windows版PHPはVista以降でしか動かない
* SELF::CONSTANT と self::CONSTANTは同じ次扱い    self, parent, static が、どんな場合でも大文字小文字区別しない


## PHP5.5 → PHP5.6
* json_decode() がより厳格に（無効な形式のJSONは影響でる）
* cURLでのファイルアップロード非推奨 CURLFile使う
* iconv および mbstring のエンコーディング設定非推奨 代わりに default_charset
* [PHP 5.6.x における OpenSSL 関連の変更](http://php.net/manual/ja/migration56.openssl.php)
* ストリームラッパーが、SSL/TLS を使っている場合のピア証明書とホスト名の検証にデフォルトで対応 file_get_contens等でhttps://へのアクセス時にエラー出る可能性
* SSL や TLS の、特定のバージョンを指定できる

PHP 5 ChangeLog
http://php.net/ChangeLog-5.php
Gitコマンドメモ

# ブランチ操作
## ブランチの一覧を表示する

```bash
git branch
```
-a オプションをつければリモートブランチも含めたブランチの一覧を表示できる。

## ローカルブランチを作成する
```bash
git branch <branch>
```

## ブランチを切り替える
```bash
git checkout <branch>
```
-b オプションをつけるとブランチの作成と切り替えを同時に実行する。

## 強制的にブランチを切り替える
```bash
git checkout --force <branch>
```
ローカルの変更を無視して強制的にブランチを切り替えます。

## ブランチを削除する
```bash
 git branch -d <branch>
```
## リモートブランチを削除する
```bash
git push --delete origin  <branch>
```
もしくは

```bash
git push origin :<branch>
```

## 他人が削除したリモートブランチを消す
```bash
git fetch --prune
```
または
```bash
git fetch -p
```

## ローカルの変更をもとに戻す
```bash
git checkout  .
```
変更はこれで全部元に戻る。新規追加したファイルに関しては削除されないので、
完全に元に戻す場合は、別途削除する必要がある

# ファイル・ディレクトリを登録する
## インデックスに登録する（add）

ファイルをインデックスに登録する。

```bash
git add <ファイル名>
```

ワーキングツリーに新規作成された、もしくは変更されたファイルをadd。
rmコマンドで削除されたものは反映されない。

```bash
git add .
```

一つ前と最新のステージを比較して、変更があった部分のみをadd。
新しく作られたファイルは、addされない。

```bash
git add -u
```

「git add .」 と「git add -u」を足したもの

```bash
git add -A
```

## git addでファイルを対話的に選ぶ

```bash
git add -i
```

# 比較する
Gitのコマンドを使って、変更した内容の差分を比較します。

## コミット前に差分を比較する
```bash
git diff --cached
```

## 差分のあるファイル名のみ表示する
```bash
git diff --name-only
```
## 指定したブランチと差分を取る
```bash
 git diff <branch>
```
現在のブランチと指定したブランチの差分を表示

## ブランチ間の差分を見る
```bash
 git diff  <branchA>  <branchB>
```
 branchAの方がbranchBより古いものとして差分を表示

## リモートブランチと比較
```bash
 git diff origin/<branch>
```
現在のブランチと指定したリモートブランチの差分を表示

# ローカルリポジトリにコミットする
```bash
git commit -m 'コメント'
```

# ローカルリポジトリの内容をリモートリポジトリに反映させる。

## Pushする

```bash
git push origin <branch名>
```

# 他のブランチの特定のコミットを反映させる

```bash
git cherry-pick <コミットID>
```

Aブランチの変更の一部を、Bブランチに反映させる

```bash
$ git checkout A
$ git log 
commit 7552946cbe62e773c0c8c999679733379440f483
Author: hoge <hoge@fuga.jp>
Date:   Wed Oct 18 09:58:12 2017 +0900

    コミットコメント１

commit 1d229baed516ef723252de54dde1ce754a5766e7
Author: hoge <hoge@fuga.jp>
Date:   Wed Oct 18 09:58:12 2017 +0900

    コミットコメント２

commit dc694af448a8971c8e30b76ede6d0b05f879266e
Author: hoge <hoge@fuga.jp>
Date:   Tue Oct 17 13:36:57 2017 +0900

    コミットコメント３

commit d20bc3c8e336f8403d375592d2f1b3255c4faa86
Author: hoge <hoge@fuga.jp>
Date:   Mon Oct 16 19:06:58 2017 +0900

    コミットコメント４

$ git checkout B
$ git cherry-pick 7552946cbe62e773c0c8c999679733379440f483
```

# ローカルのブランチを強制的にリモートのブランチに合わせる

## リモートの最新を取ってくる
```bash
git fetch origin <branchName>
```

## リモート追跡のブランチに合わせる
```bash
git reset --hard origin/<branchName>
```
PythonでChromeのヘッドレスブラウザを利用してみた。


# VXFD 仮想ヘッドレスト、Chrome Headless の違い。

ブラウザ操作の自動化を行うのにLinux Server上でSeleniumでChromeを動かしたい！ってことで　メモ書き。

今までの方法としてはVXFDを利用して、仮想ディスプレイ上でSeleniumを利用してChromeを操作するといのが一般的？だった。


環境構築は割愛・・・。

※Sampleなので、べた書きなのはご愛嬌

## VXFD利用
```python 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()

browser_path = '/usr/bin/google-chrome-stable'
opts = Options()
opts.binary_location = browser_path
opts.add_argument('--no-sandbox')
browser = webdriver.Chrome(chrome_options=opts)

browser.get('http://www9.plala.or.jp/oyoyon/html/script/newwin.html')
print(browser.title)

ele = browser.find_element_by_css_selector('a.under')
ele.click()

for Handle in browser.window_handles :
	if Handle != browser.current_window_handle :
		browser.switch_to_window(Handle)

print(browser.title)
print(browser.find_element_by_css_selector("p").text)

browser.quit()
display.stop()

```

```python
from pyvirtualdisplay import Display
display = Display(visible=0, size=(800, 600))
display.start()
```
このような感じで仮想ディスプレイを立ち上げる必要があった。

## Chrome Headless を利用すると。。。
VXFD周りのコードを省いて、Chromeのオプションを追加するだけ。

```python 
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

browser_path = '/usr/bin/google-chrome-stable'

opts = Options()
opts.binary_location = browser_path
opts.add_argument('--headless')
opts.add_argument('--disable-gpu')
opts.add_argument('--no-sandbox')

browser = webdriver.Chrome(chrome_options=opts)

browser.get('http://www9.plala.or.jp/oyoyon/html/script/newwin.html')
print(browser.title)

ele = browser.find_element_by_css_selector('a.under')
ele.click()

for Handle in browser.window_handles :
	if Handle != browser.current_window_handle :
		browser.switch_to_window(Handle)

print(browser.title)
print(browser.find_element_by_css_selector("p").text)

browser.quit()

```

```python
option.add_argument('--headless')
option.add_argument('--disable-gpu')
```
ここがミソ。になる。割りと移行も簡単にできると思われる。
ソースコードのみで言うと大したインパクトはないんですがね。。。

### メリット
- 環境構築でVXFD入れたりすると、Dockerのコンテナが肥大化するーということも軽減する。
- Windows・Mac環境で手元で開発するのに仮想ディスプレイを立ち上げるかどうかの制御も不要。
- 仮想ディスプレイを立ち上げるオーバーヘッドがなくなる。

Headlessブラウザとして有名なPhantomJSはChromeのヘッドレスのリリースによって、開発の終了を宣言している。
最近は　FireFoxもHeadlessをサポートし始めているので
近々に試してみることにする。


[google headlessについて](https://developers.google.com/web/updates/2017/04/headless-chrome?hl=ja)
go testの結果をbashで確認する

# やろうとしたきっかけ

* shell scriptでリポジトリ内の全パッケージを再帰的に `go test`をして、かつカバレッジを取るということをやっていた
  * ファイルやテストが増えてきたら、どこで問題が起きているのかがわからなくなってきた
  * せめてテストが起きているパッケージが問題なのかだけでも知りたい

# ボツ案

`go test`**の標準出力結果から末尾の行の PASS/FAIL を正規表現で抜き出して、判定する**

ググったらこれやってる人が結構多かった。
悪くはないのだけれど、改修とかしたくなったらメンテナンスが面倒な感じがしたのでやめた

# 採用

`go test` の戻り値を使ってテストの結果を判定する

## 検証

go testの戻り値に関する情報が見当たらなかったので検証した。

```bash
go test -v # vオプションを指定したのは下記のechoが期待値と一致するか確認するため
echo $? # go test -v の戻り値を取得
```

## 結果

検証結果が下記。

|テスト結果|戻り値|
|:---|:---|
|PASS|0|
|FAIL|1|

これを元にscriptの最後にテスト結果がを出力するようにした
（scriptのコードはいろいろ見せちゃいけないやつがあるので公開できません）
NetBeans IDE PHP版導入手順

<h1>ある日NetBeans PHP版を使うことがあったので<br>インストール手順の忘備録</h1>

<h2>☆インストールするもの</h2>

・Java Runtimeのインストール
http://www.oracle.com/technetwork/java/javase/downloads/jre8-downloads-2133155.html
※すでにjavaSEがインストールされている場合は不要。

・Netbeans本体
https://netbeans.org/downloads/
※PHP版を選択。x86か、x64かは自分のOSに合わせて。

<h2>★編集したほうがいいであろうファイル</h2>

cd /etc/php.d/
vi 15-xdebug.ini

記入内容
<code>
xdebug.remote_enable=1
xdebug.remote_autostart=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000
xdebug.idekey=netbeans-xdebug
</code>

その後Apacheを再起動してください。
<code>service httpd restart</code>

<h2>◎その時入れたプラグイン</h2>
<h3>・PHP Enhancements</h3>
変数名や文字列を消すときに思ったような箇所まで消せないので（たとえば、ワード単位で文字列を削除すると、変数の場合は$まで全部けされたり・・中略
とにかく便利らしい！
<h3>・PHP CakePHP Framework</h3>
当時cakeをさわっていたので
他にもおすすめのプラグイン等ありましたら教えて頂ければ幸いです。

<h2>▽設定</h2>
表示→表示不可能な文字を表示　にチェック
オプション→オプション→PHP→デバッグ→最初の行で停止　のチェックを外す

<h2>◇実行構成</h2>

・Vagrant    → リモート接続
・MAMP/XAMPP → ローカルWebサーバー

<h3>リモート接続の場合</h3>

URL：ブラウザで見る時のURL
FTP：管理→「SFTP」を選択
SFTP設定
・ホスト：127.0.0.1
・ポート：2222
・ユーザー名、パスワード：vagrant
・初期ディレクトリ：/var/www/html

<h3>実行構成の設定</h3>

プロジェクト名右クリック→プロパティ→実行構成→詳細
URLを毎回聞く
サーバーパス：/var/www/html
ローカルパス：プロジェクトのルートディレクトリ
→Cakeの場合は、appとかが並んでいるディレクトリ

ファイルのアップロード：保存時

→ここ2つを合わせてください！！

<h3>その他やって欲しい設定</h3>

プロジェクト名→プロパティ→ブラウザ→Google Chrome　にする

Google Chromeの拡張機能→他の拡張機能を見る→「Netbeans」と検索→「Netbeans Connector」をインストール
20:19
 <h3>△もし動かなかったら・・・</h3>

1. xdebug.iniの「remote_connect_back=1」の行を変える
xdebug.remote_host=IPアドレス
※自分のPCのIPアドレスの調べ方は、
Windows：コマンドプロンプト上で「ipconfig」
Mac：ターミナル上で「ifconfig」

192.168～から始まるものがだいたいそれ

2. ファイアウォールをこじ開ける（Windows）
ファイアウォールの設定→受信の規則→新しい規則→TCP9000番を許可する

3. サーバーパスの設定をもう一度見直す

<h3>◯日本語が文字化ける場合</h3>
Ricty Diminishedをダウンロードしてインストール

<h2>☆まとめ☆</h2>
これで最低限開発ができる環境が整うはず！
以上忘備録でした！
PropertyDescriptorでsetterが見つからない問題

PropertyDescriptorのコンストラクタを呼び出すと、setterが見つからないという例外が発生する問題にハマったのでそのときの解決メモ。

# 起きたこと
以下のようなクラスを作成していた。

```java
public class HogeBean {
  private LocalDate date;

  public String getDate(){
    if(this.date == null){
      return "";
    }
    return this.date.toString();
  }

  public void setDate(LocalDate date){
    this.date = date;
  }
}
```

上記クラスからPropertyDescriptorを以下のように作成した。

```java
PropertyDescriptor property = new PropertyDescriptor("date", HogeBean.class);
```

実行するとIntrosectionExceptionが発生し、「Method not found: setDate」というメッセージが表示された。

# なぜこうなるのか
setDateメソッドがないといわれているが、その名前のメソッドは存在している。
ということで、PropertyDescriptorの中身を調査した。

コンストラクタはざっくりと以下のような処理を行う。

- まずgetterメソッドを探す。
  1. isDateという名前で引数の数が0個のメソッドを探す。
  2. みつからない場合はgetDateという名前で引数の数が0個のメソッドを探す。
  3. それでもみつからない場合はIntrospectionExceptionをスローする。
  4. みつかった場合は、**戻り値の型**を保持しておく。
- 次にsetterメソッドを探す。
  1. setDateという名前で引数の数が1個で、その型が**getterの戻り値の型と一致するメソッド**を探す。
  2. みつからない場合はIntrospectionExceptionをスローする。

つまり今回の例では、getterの戻り値の型と、setterの引数の型がStringとLocalDateとなっていて、一致しないのが問題だった。

# ということで
今回はgetterで日付を文字列に変換するようにしていたが、getterはフィールドをそのまま返却するようにして、変換した値を返却するメソッドは別の名前で定義した方がいいということだった。

```java
public class HogeBean {
  private LocalDate date;

  public LocalDate getDate(){
    return this.date;
  }

  public String getDateString(){
    if(this.date == null){
      return "";
    }
    return this.date.toString();
  }

  public void setDate(LocalDate date){
    this.date = date;
  }
}
```
GoogleAppsScript JavaScriptを用いてCSVをローカルに書き出す実装

# 概要
おおよそソースを見たらわかるようにしているので説明はふわっとです。

## GAS側のメソッドと機能
|メソッド|機能|
|:--|:--|
|**onOpen()**|メニューバーのその他に「CSVで出力」を追加|
|**csvDownload()**|「CSVで出力」をクリックされるとCSVをダウンロード|
|**getData()**|GASからJSにシートのデータを渡す|
|**getFileName()**|出力名を取得（アクティブシート名+現在日時）|

## JS側のポイント
- window.onloadで読み込み時にファンクションを実行
- GAS側からダウンロードデータを作りダウンロードリンクを作成
- 擬似的にlinkオブジェクトを作成してクリックさせる
- google.script.host.close();でダウアログを閉じる


# 実装
```js:function.gs
// メニューバーにカスタムメニューを追加
function onOpen() {
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();
  var entries = [{
    name : "CSVで出力",
    functionName : "csvDownload"
  }];
  spreadsheet.addMenu("その他", entries);
};

// JSを用いてCSVファイルをダウンロードする
function csvDownload() {
  // dialog.html をもとにHTMLファイルを生成
  // evaluate() は dialog.html 内の GAS を実行するため（ <?= => の箇所）
  var html = HtmlService.createTemplateFromFile("dialog").evaluate();
  // 上記HTMLファイルをダイアログ出力
  SpreadsheetApp.getUi().showModalDialog(html, "ダウンロードなう");
}

// JS側で使用
function getData() {
  // スプレッドシート上の値を二次元配列の形で取得
  var sheet = SpreadsheetApp.getActiveSheet();
  var values = sheet.getDataRange().getValues();

  // 二次元配列をCSV形式のテキストデータに変換
  var dataArray = [];
  for (var i = 0; i < values.length; i++) {
    dataArray.push(values[i].join(","));
  }
  return dataArray.join("\r\n");  // 改行コードは windows を想定
}

// JS側で使用
// ファイル名の設定はここで！！
function getFileName() {
  var spreadSheet = SpreadsheetApp.getActiveSpreadsheet();
  var sheet = spreadSheet.getActiveSheet();
  var now = new Date();
  var datetime = Utilities.formatDate( now, 'Asia/Tokyo', 'yyyyMMddHHmm');
  // アクティブシート名+現在日時
  return sheet.getName() + '_' + datetime + '.csv';
}
```

```html:dialog.html
<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
    <script type='text/javascript'>    
      window.onload = function(){
        handleDownload();
      }
      function handleDownload() {
        // 出力データを GAS から取得する
        var content = <?= getData(); ?>;
        var blob = new Blob([ content ], { "type" : "text/csv"});
        var link = document.createElement('a');
        // ファイル名を GAS から取得する
        link.download = <?= getFileName(); ?>;
        link.href = window.URL.createObjectURL(blob);
        link.click();
        // ダイアログを閉じる
        google.script.host.close();
      }
  </script>
  </head>
</html>
```

# 所感
- ダイアログが一瞬開いてしまうのは仕方がない
- VBAの80倍なじみやすい

# 参考
**GASで文字コード指定してファイルを書き出す**
https://qiita.com/jsoizo/items/948e23231417d203eefa
**ローカルにファイルダウンロード**
http://googleappsscript.hatenablog.com/entry/2017/09/06/120000
Mavenで肝心のjarファイルが自動でダウンロードされない

#環境

windows10 64bit
pleiades e4.5

#Eclipseの変更箇所

アーティファクト・ソースのダウンロードのチェックを外しておく。

![image](https://qiita-image-store.s3.amazonaws.com/0/109158/3d89b37e-037a-6d4f-0376-01f7815c5a63.png)
CentOS7にJava OpenJDK8のインストール

## 概要
OpenJDK8のインストール手順です。

## 環境
- CentOS 7.2
- openjdk version "1.8.0_144"
- OpenJDK Runtime Environment (build 1.8.0_144-b01)
- OpenJDK 64-Bit Server VM (build 25.144-b01, mixed mode)

## OpenJDK8のインストール

```
$ sudo yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel 
```

### pathの確認

```
$ dirname $(readlink $(readlink $(which java)))
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64/jre/bin
```

### 環境変数の設定
以下を環境変数として、どこかに設定してください。

`JAVA_HOME`は、前述のpathの確認の、/jre/bin の手前の部分を設定します。

```
$ sudo vi /etc/profile

export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar 
```

```
$ source /etc/profile
```

上記の例は/etc/profileに環境変数を設定していますが、
その他の場所に設定する際は、以下を参考にしてください。

- /etc/environment
    - デフォルトの環境変数を設定するファイル。 システム全体の環境変数を変更する場合はこのファイルを編集する一般的である。
- /etc/profile
    - ログイン時に実行されるシェルスクリプトファイル。 ログインシェルとして登録されているシェルが起動した際に自動的に読み込まれる。
- ~/.bash_profile
    - 特定のユーザーの設定。.bash_profile はログイン時にのみ実行される。
- ~/.bashrc
    -  特定のユーザーの設定。bash を起動する時に毎回実行される。

- 引用元
   - [環境変数の設定](http://lambdalisue.hatenablog.com/entry/2013/06/25/140630)
   - [本当に正しい .bashrc と .bash_profile の使ひ分け](https://qiita.com/magicant/items/d3bb7ea1192e63fba850)


## デフォルトのJDKを設定
別バージョンの JDK がすでにインストールされていた場合、デフォルトを変更する。
以下の例では1つしか入っていない。

```
$ sudo alternatives --config java

There is 1 program that provides 'java'.

  Selection    Command
-----------------------------------------------
*+ 1           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.144-0.b01.el7_4.x86_64/jre/bin/java)

Enter to keep the current selection[+], or type selection number: 1
```

## 動作確認
動作確認用に以下のプログラムを作成する。

```java:day.java
import java.util.Calendar;

class day {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;
        int day = cal.get(Calendar.DATE);
        int hour = cal.get(Calendar.HOUR_OF_DAY);
        int minute = cal.get(Calendar.MINUTE);
        System.out.println(year + "/" + month + "/" + day + " " + hour + ":" + minute);
    }
}
```

### コンパイル

```
$ javac day.java
```

### 実行
現在日時が表示されれば成功

```
$ java day
2017/10/12 4:27
```

## 参考
- [OpenJDK 8 インストール](https://www.server-world.info/query?os=CentOS_7&p=jdk8&f=2)
Vagrant up から進まない！？

#Vagrant up したけど進まないよ？！
Vagrant Ver.1.9.7以降ではこの問題が発生しているようです。
[Vagrant up hangs forever on Windows 7, Vagrant 1.9.7, VirtualBox 5.1.22.r115126](https://github.com/hashicorp/vagrant/issues/8777)

##解決法 その1（お手軽）
**Ver1.9.6以下にダウングレードする。**
[Download older versions of Vagrant](https://releases.hashicorp.com/vagrant/)
この中から1.9.6以下のインストーラーを選んでダウングレードしてください。
1.9.6で正常にVagrant upできるようになるらしいので、1.9.6でいいかと思います。（未確認）

##解決法 その2（おすすめ）
**PowerShellのバージョンを上げる**
「なんで急にPowerShell？！」と思われるでしょう。
実は Vagrant は PowerShell の力も借りて動いています。
そして、その最低バージョンが（恐らく）1.9.7から「3」にあがったのだと思います。

では、なぜ `Vagrant up` が出来なくなるのかと言うと、Windows 7 に搭載されている
 PowerShell のバージョンは「2」なのです。

つまり、

* Windows 7で
* Vagrant 1.9.7以降を使い
* PowerShellをアップグレードしていない

この条件が揃えば `Vagrant up` から進まなくなります。
**というか、普通に Windows7 + Vagrant 使って開発している人ならほぼ間違いなく当てはまります**

さて、この解決法がおすすめな理由としては、最新の Vagrant が使える点です。
その1の方法は確かにお手軽ですが、最新バージョンは使用できない事になります。

##解決法 その2の注意点
多くの方は関係ないかもしれませんが、PowerShell のバージョンを上げますので、「2」でないと不都合がある方は適用できません。
その場合は「その1」で我慢するしかないですね。

##PowerShell のバージョンの上げ方
現時点での PowerShell の最新バージョンは「5.1」になります。
Qiita内でも「5.0」へのバージョンアップの方法は見受けられますが、手順が変わっているので改めて書いておきます。

1. 対象ファイルのダウンロード  
[WMF 5.1 のインストールと構成](https://docs.microsoft.com/ja-jp/powershell/wmf/5.1/install-configure) こちらから対象となる OS のファイルをダウンロードしてください。
（Windows 7 なら x64:Win7AndW2K8R2-KB3191566-x64.ZIP または x86:Win7-KB3191566-x86.ZIP）
1. ダウンロードしたZIPファイルを解凍します
1. PowerShell を**管理者権限**で起動します
管理者権限での起動は、スタートメニューで「プログラムとファイルの検索」に「powershell」と入力し、上に表示される PowerShell を**右クリックから「管理者として実行」**としてください
1. ZIPファイルを解凍したフォルダに移動します
1. フォルダ内にある `Install-WMF5.1.ps1` を実行します

基本的には以上ですが、恐らく
> スクリプトの実行がシステムで無効になっているため、ファイル ●:\...\Install-WMF5.1.ps1 を読み込めません。詳細については、「get-Help about_signing」と入力してヘルプを参照してください。

といったエラーで実行できない方が多いかと思います。
その際は、`Set-ExecutionPolicy RemoteSigned` を実行してください。※コピペ可
これはスクリプトの実行ポリシーの変更になりますので、`Set-ExecutionPolicy Restricted` とすれば全ての PowerShell スクリプトが実行できなくなりますので、バージョンアップ作業がおわったら実行しておきましょう。

あとは再起動すれば `vagrant up` できるはずです！
使えそうな正規表現(随時更新)

わざわざ作成するのが面倒なので、業務で使ったものを備忘録とメモ程度で作るたびに随時追記していこうと思います。
メインはRubyで書いています。
ちなみにここのサイトで試しながらやってます。
Rubular　http://rubular.com/


## 括弧以降を取得

```
pattern = /[(（].+/
```

## アンスコ以降を取得

```
pattern = /[_＿].+/
```

## 特定文字列以前を取得

```
# @以前を取得
pattern = /.+(?=@)/
```

# To be continued ...
続く
MySQLのテーブル別サイズを確認したい

# やりたい事
- mysqlでどのTABLEが大きいのか行数、サイズを確認したい

# 実行するSQL

```:実行するSQL
select
  table_name, engine, table_rows AS "レコード件数",
  avg_row_length AS "平均レコードサイズ(byte)",
  floor((data_length+index_length)/(1024*1024)) AS "テーブル全体(MB)",
  floor((data_length)/(1024*1024)) AS "データ(MB)",
  floor((index_length)/(1024*1024)) AS "インデックス(MB)"
FROM
  information_schema.tables 
WHERE
  table_schema=database()
ORDER BY
  (data_length+index_length) DESC;
```
# 参考サイト
- http://www.rexent.co.jp/blog/mysql-%E5%90%84%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E6%AF%8E%E3%81%AB%E5%AE%B9%E9%87%8F%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B
WindowsでRundeckを運用する

アプリのログデータを収集するためのユーティリティサーバとして利用できるサーバにWindows Serverがある。

現状はタスクスケジューラでバッチをいろいろ動かしているけども、実行するバッチは別のサーバーにあるんだけども依存関係があったりして、今は時間間隔を調整して整合性が取れるようにしている。

しかし、いつかは破綻するのでそろそろちゃんとしたいなということで調査した結果、Jar単体で動作するRundeckを採用した。


## 環境
今回使っている環境は以下の通り

* Windows Server 2008 R2 SP1(64bit)

## セットアップ
インストールの流れは下記の通り。

1. Javaのインストール
2. Rundeckのインストール
3. nssmのインストール
4. Win32-OpenSSHのインストール

Win32-OpenSSHについては、ローカルのWindowsマシンでジョブを実行しないのであれば必要ない。


## アプリケーションの事前準備
以下のツールをダウンロードしておく

名称 | バージョン | 内容
--- | --- | --- 
Rundeck |2.6.9|ジョブ管理
nssm|2.24|アプリケーションのサービス化サポートツール
Win32-OpenSSH||sshサーバ
Java|1.7_79|Oracle Java SE

### Javaのインストール
1. Javaのインストーラーを実行
2. 環境変数JAVA_HOMEを追加する
3. コマンドプロンプトを起動し、```java -version```と入力し、Javaのバージョンが表示されることを確認

### Rundeckのインストール
1. Rundeckを%HOME%以下の任意の場所(例: %HOME%\rundeck)へ展開する
2. コマンドプロンプトを開き、```java -XX:MaxPermSize=256m -Xmx1024m -Xms256m -server -jar rundeck-launcher-2.6.9.jar```を入力してRundeckをStandaloneで起動する
3. Webブラウザで```http://localhost:4440```へアクセスし、ページが表示されることを確認する

3でアクセスできない場合はファイアーウォールの設定で4440のポートを開けるか、Webブラウザの例外設定にlocalhostを入れる。

### nssmのインストール
1. Rundeckの起動スクリプトを作成する
2. コマンドプロンプトより、nssmを展開したディレクトリまで移動する
3. ```nssm install [command name]```を入力し、設定ウィンドウを起動する
4. 必要な情報を入力
5. 

```bat:start.bat
@echo off
java -XX:MaxPermSize=256m -Xmx1024m -Xms256m -server -jar rundeck-launcher-2.6.9.jar %1
```

### Win32-OpenSSHのインストール
1. OpenSSHを%HOME%以下の任意の場所へ展開する
2. 環境変数Pathに、上記のパスを設定する
3. コマンドプロンプトを起動し、```ssh-keygen.exe -A```を実行する
4. ファイアーウォールで受信ルールにTCPに22を追加する
5. コマンドプロンプトで1のパスへ移動し、setup-ssh-lsa.cmdを実行する
6. OSを再起動する
7. ```sshd install```を実行してサービスへインストールする
8. サービスから登録したsshdを起動する
9. コマンドプロンプトから、```ssh [コンピュータ名]```を入力し、ログインする
10. ```ssh-keygen -t rsa```を実行し、公開鍵と秘密鍵を生成する。このとき、パスワード入力を求められるが今回はパスワード入力をスキップさせるため、空欄にしておく
11. etc\\sshd\_configをテキストエディタで開き、PubkeyAuthenticationがyesになっていることと、AuthorizedKeysFileが.ssh/authorized\_keysになっていることを確認する
12. .ssh/id\_rsa.pubを.ssh/authorized\_keysへリネームする
13. sshdを再起動する
14. パスワードなしでログインできることを確認する


## 参考サイト
* http://dev.classmethod.jp/server-side/server/try-rundeck-job/
* http://www.techpaste.com/2015/08/rundeck-windows-nodes-configuration/
* http://yebisupress.dac.co.jp/2016/03/01/rundeck-windows/
* http://dev.classmethod.jp/cloud/aws/aws-windows-sshd/
Javasctiptデザインパターンで使えそうなものをまとめる

## はじめに
Javascriptのソースを綺麗に書くために、デザインパターンを学習しました。
その中で、使えそうなものをまとめました。
参考程度にしてください。

## Javasctiptデザインパターン一覧
Javascriptのデザインパターンを紹介します。
13種類あります。

1. コンストラクタ
- モジュール
- リビーリングモジュール
- シングルトン
- オブザーバ
- メディエータ
- プロトタイプ
- コマンド
- ファサード
- ファクトリ
- ミックスイン
- デコレータ
- フライウェイト

## Javasctiptデザインパターンで使えそうなもの
### １．コンストラクタ
オブジェクト指向言語で常用されているコンストラクタですが、
Javascriptはすべてがオブジェクトであるため、大いに使えるパターンです。

- 一般的なコンストラクタ

例：表に1行追加する処理

```js:javascript
function Table(table){
	this.table = table;

	this.addRow = function(){
		//処理
	};
}

function clickAddRowButton(){
	var table = document.getElementById('table');
	var tableInstance = new Table(table);
	tableInstance.addRow();
}
```
- 問題点

addRowはTable型のインスタンスが作成されるたびに再定義されます。
Table型のすべてのインスタンスに共有されていることが理想です。

- プロトタイプを使ったコンストラクタ

上記の問題点を解決する方法です。
Javascriptの関数にはプロトタイプというプロパティがあります。
コンストラクタで作成されたインスタンスは、コンストラクタのプロトタイプを利用可能になります。
そしてインスタンスすべてに共有されます。

```js:javascript
function Table(table){
	this.table = table;
}

Table.prototype.addRow = function(){
	//処理
};

function clickAddRowButton(){
	var table = document.getElementById('table');
	var tableInstance = new Table(table);
	tableInstance.addRow();
}
```

### ２．モジュール
モジュールはコードを綺麗に分割し組織化するのに役立ちます。

例：表に1行追加する処理

```js:javascript
var tableModule = {
	addRow : function(){
		//処理
	};
}

function clickAddRowButton(){
	tableModule.addRow();
}
```

### ３． シングルトン
シングルトンは、作成されるクラスのインスタンスが１つのみという考え方です。

Javascriptでの実用案を考えてみましたが、まったく浮かびませんでした。
シングルトンでサーバサイドの原子性を保つためのデザインパターンなので
フロントサイドはそこまで必要ないのかもしれません。

### ４． メディエータ
メディエータは仲介役です。
オブジェクト同士のやり取りを仲介することで、オブジェク同士を疎結合にします。
これにより保守性の高いソースを作ることができます。

詳しくはこちらを参照してください。
[【JSでデザインパターン】メディエーター編](https://qiita.com/kenju/items/d00df39e59f4fe606b8d)

### ５． ファサード
大きく複雑なオブジェクト群を１まとまりにし、利用者にそれを意識させないデザインパターンです。
つまり、複数メソッドを１つにまとめたメソッドです。

例：表の行を追加・削除する処理

```js:javascript
var facadeTableModule = (function(){
	var table;
	var _private = {
    set : function(table) {
    	this.table = table;
    },
    add : function(elements) {
    	//処理
    },
    remove :function(elements) {
    	//処理
    }
  };
  
  return {
  	facade : functoin(args){
    	_private.set(args.table);
      if(args.add){
      	_private.add(args.elements);
      }else if(args.remove){
      	_private.remove(args.elements);
      }
    }
  };
}()};

var table = document.getElementById('table');
var elements = document.getElementById('elements');

facadeTableModule.facade({table : table. add : true elements : elements});
facadeTableModule.facade({table : table. remove : true elements : elements});
```

## 参考リンク
- [JavaScriptデザインパターン](http://amzn.asia/2Tm46AC)
- [【まとめ】JavaScriptでデザインパターン](https://qiita.com/kenju/items/4d32598ffddf86af82f2)
CentOS７にScalaをインストール

Scalaの勉強しつつ、何か作ろうかと適当に調べつつCentOSにScalaインストール。

## 1. Java(OpenJDK)をインストール
```
# yum install java-1.8.0-openjdk
```
確認

```
# java -version
openjdk version "1.8.0_144"
```

## 2. Scalaをインストール
```
# yum install scala
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.tsukuba.wide.ad.jp
 * extras: ftp.tsukuba.wide.ad.jp
 * updates: ftp.tsukuba.wide.ad.jp
No package scala available.
Error: Nothing to do
```
ありゃ・・・ダメっぽい

### ダウンロード
最新版は[公式サイト](https://www.scala-lang.org/download/)で確認

```
# wget https://downloads.lightbend.com/scala/2.12.3/scala-2.12.3.tgz
# tar xvzf scala-2.12.3.tgz
# mv scala-2.12.3 /usr/local/scala
```
解凍して任意の場所に移す

### パスを通す
```
# vim /etc/profile
最終行に以下を追加
export SCALA_HOME=/usr/local/scala
export PATH=$PATH:$SCALA_HOME/bin

# source /etc/profile
```

確認

```
# scala -version
Scala code runner version 2.12.3 -- Copyright 2002-2017, LAMP/EPFL and Lightbend, Inc.
```


これでたぶん大丈夫。

## 3. お約束のHello worldを書いてみる。
Scalaもワンライナーで書けるようなので、ベタにHello worldを出力してみる。

```
# scala -e 'println("Hello world")'
Hello world
```

ちょっと遅い気がしたけど、問題なく出力された。
めでたしめでたし
CognosAnalyticsのログについて

CognosAnalyticsを導入すると、製品のログメンテナンスをどうするのかという話があがることがあります。方針を決めるためにも製品ログについてを知る必要がありますが、Cognosのログの種類についてマニュアルなどにあまり情報がまとまっていないため、調べてわかった範囲の情報をこちらに記載しておきます。

CognosAnalyticsの様々なログは、基本的に<Install_dir>/logsディレクトリ以下に出力されます。
全部ではありませんが、気になりがちなlogsディレクトリ以下に出力されるログをざっとまとめると以下のような感じになります。


**・自動ローテーションや削除などが行われず追記もされないファイル**
製品導入後、初めて起動したタイミングで作成される。コンテントマネージャーのコンテントストアの作成に関係する内容が記述されている。

　　001.CMCreateWSRPObjects_results.xml
　　002.CMCreatePageletObjects_results.xml
　　004.CMCreateUserInterfaceProfiles_results.xml
　　005.CMUpdateUserInterfaceProfilesAndFolders_results.xml
　　006.CMUpdateUserCapabilityPolicies_results.xml
　　CMCreateBaseObjectsScript_results.xml
　　CMCreateScript_results.xml


**・自動ローテーションや削除ではなく毎回上書きされるファイル**
サービスの開始や停止、稼働状況などが記録されている

　　cbs_cnfgtest_run_WebSphereLiberty.log
　　cbs_isrunning_WebSphereLiberty.log
　　cbs_run_WebSphereLiberty.log
　　cbs_start_WebSphereLiberty.log
　　cbs_stop_WebSphereLiberty.log
　　cbsdefault.log


**・自動でローテーションやバックアップがされるファイル**
様々な内容が記録されていたり種類もあるのでここでは表にまとめました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/148873/4d1141c5-e17e-75ea-68e8-e6499abf5135.png)


**・増加するが、自動ローテーションや削除などが行われないファイル**
cbs_cnfgtest_xxxxxx(数字)、  ../logs/ffdc以下のファイル、  ../logs/XQE以下のファイルは、製品がファイルを増やしたり中身を追記したりして単純に増加しそうなファイルです。
最後の、XQEフォルダのログファイルの対応方法はこちらのリンクに記載されていますので、必要な方はこちらを参考にしてください。

「Cognos BI XQEフォルダのログフル対応」
http://qiita.com/shinyama/items/faf7e1a86b9ac6fb9653


ここまで、ログメンテナンスで知りたいと思うであろうログの情報の一部をまとめましたが、ほかにも<Install_dir>/temp以下のファイルや、JVMのコアファイルなども合わせて考慮したりします。
こちらの情報がCognosAnalyticsでログメンテナンスを考えるときの参考になれれば幸いです。
Raspberry pi 1 model bで、with pixel　その8

#概要
ファイル検索が見つけられなかったので、gui grepな
regexxerを入れてみた。

#写真

![MVC-002F.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/d9ade642-d494-547c-b603-e9a1b9383d7f.jpeg)

#環境
Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel

#インストール

```
sudo aptitude install regexxer
```

メニューのプログラム＞regexxer検索ツール
に入った。
【初心者向け】UE4、HTML5上でのデバッグの仕方

UE4にてHTML5でパッケージングした時、ブラウザ上でエラーが起きたときのデバッグの仕方を簡潔に書きます。
ただコンソールでログを追うだけの記事なので、UE4、及びHTML5の初心者向け記事になります。

知っている方は当然の知識であるため、読み飛ばしていただいてかまいません。

# ブラウザでデバッグ

ブラウザ上でエラーが起きた場合、当然ですがUE4のエディターではエラーを拾わないので、ブラウザに出力するようにJavaScriptを書くか、開発ツールを使用しなければいけません。
現在でのブラウザであれば標準的にコンソールツールが付いているはずです。

・GoogleChromeの例
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7adb676f-3222-81ae-94f2-0c4c538b7f5a.png)

ブラウザは

「コンソールがついている」
「WebGLに対応している」

ものであれば何を使用しても問題ないです。

WebGLはFireFoxが一番安定しているので、今回はFireFoxの標準開発ツールを利用します。

# FireFoxのコンソールを見てみよう

プラムさんから実際にエラーが起きているバイナリをお借りできたので、これを例にエラーを追っていきましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/ce0a487d-739f-659c-5a60-af7e3f7b3ff6.png)

※このバイナリはUE4.17で出力されているため、18以降では変わる可能性があることをあらかじめご了承ください

UE4から出力されたHTML5は、内部にエラーが発生した場合、上記の画像の通りエラーを画面に表示をしてくれますが、まぁ、きわめてわかりにくいですよねｗ
このままでは何が原因なのかよくわからないので、早速コンソールを見ていきましょう。

## FireFoxのコンソールを開く

FireFoxで開発ツールを表示する場合、以下の画像の通り右端のメニューから開発ツールをクリックして開きます。
![開発ツール.png](https://qiita-image-store.s3.amazonaws.com/0/104377/a1c13264-f655-60d8-ec68-87fceb35a837.png)

※Firebug等のアドオンを入れていない場合、F12のショートカットキーで開きます

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/4504759a-e644-ae2a-f954-9a59da90181e.png)

上記の画像の通り、たくさんのエラーがコンソールに出力されています。
ここから、エラーとなっている原因のログを追っていきます。

## FireFoxのコンソールを見る

実際にコンソールを見ていきましょう。

今回の例では、以下の赤枠で囲ったログが怪しそうです。
![エラー１.png](https://qiita-image-store.s3.amazonaws.com/0/104377/565d89cf-54d1-7411-ca8e-2e3778f59825.png)

どうやらメモリ上限エラーが発生しているようです。
純粋にメモリ不足であれば、プロジェクト設定でHeapSizeを上げるか、HTMLファイルに書かれているメモリ使用量を変更すれば解決です。

![プロジェクト設定.png](https://qiita-image-store.s3.amazonaws.com/0/104377/d5a5bf0b-00ef-a261-1aa0-8cfc0692e971.png)

![HTML.png](https://qiita-image-store.s3.amazonaws.com/0/104377/d62af666-183d-de4b-1dd1-9b222d82c30b.png)
※4.17時点で出力されるHTMLファイルのソースであり、WASMが対応する18以降では変わる可能性あり

このバイナリではメモリ上限が最大の２GBまで確保する設定にしても解決しなかったため、元のソース部分に何かメモリを消費してしまう原因があるようです。

メモリ上限エラーの詳細を見ていきましょう。
▼の部分を押すと、ログの詳細が開かれます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/d772f28f-e024-e219-f18a-a33892ba646d.png)

上記のエラーログを見た場合、怪しいのは以下の部分です。

![エラー２.png](https://qiita-image-store.s3.amazonaws.com/0/104377/791045c4-6204-b64b-441e-dbd0d39b4d71.png)

どうやらどこかのタイムラインを呼び出したときに、メモリ確保の処理が走り、そのまま上限値に達してしまったようです。
赤線の部分をみると「__ZNK17UTimelineTemplate24GetDirectionPropertyNameEv」となっているので、どこかタイムラインのプロパティ名に原因があるみたいです。

これで原因となっている部分が大体絞り込めました

---

プラムさんが再度調査したところ、今回のエラー原因は、タイムラインに日本語を使用していたのが原因でした。

以下の画像はエラーの参考例です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/e53dfd03-7c96-eae1-f211-4dd44766abc5.png)

全てのタイムラインを英語に変換したところ、無事HTML5で動作したとのことです。

---

# まとめ

UE4はHTML5をパッケージングするときにEmscriptenを利用してC++からJavaScriptに変換しているため、エディター上では問題なく動作しても、ブラウザでは動かない、というようなことがよく起こります。

そんな時、ブラウザのコンソールを見れば何が原因なのか特定することがほぼ可能です。

今回はコンソールだけでしたが、FierFoxの開発ツールはパフォーマンスも見ることができるので、どこがボトルネックになっているかの調査も可能です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/104377/7914684e-02d6-fff9-ad79-21a75abfa00e.png)

HTML5でデバッグする場合、かならずブラウザの開発ツールを開くクセをつけましょう。
配列結合について

#配列結合

##array_merge()関数
引数に複数の配列を指定した場合、前の配列に後ろの配列を追加した配列を返す。
数値添字の配列を結合する際に、添字が重複した場合、値は上書きしない
(※ただし連想配列の場合は後ろの配列の値で上書きされる)

##array_merge_recursive()関数
数値添字の配列を結合する場合、array_merge()関数と同じ結果だが、連想配列の結合を行う際に、重複していた場合は配列のネストを①段深くして値を残す

##+演算子
配列は+演算子でも結合できるらしい
数値添字配列、連想配列にかかわらず、添字が重複した場合は、前の配列の値を優先して結合を行う


##サンプル

```
$data1 = ['a']
$data2 = ['A',100=>'B'];

//array_merge() の場合
print_r(array_merge($data1,$data2));
Array
(
  [0]=>a
  [1]=>A
  [2]=>B
)


//array_merge_recursive() の場合
print_r(array_merge_recursive($data1,$data2));
(
  [0]=>a
  [1]=>A
  [2]=>B
)

//演算子で結合した場合
//後ろの配列が優先される
print_r($data1 + $data2);
(
  [0]=>a
  [1００]=>B
)


//連想配列結合の場合
//後半の配列が優先される
$data3 = ['a'=>1];
$data4 = ['a'=>'A','b'=>'B'];

//array_merge_recursive() の場合
print_r(array_merge_recursive($data3,$data4));

Array
(
  [a]=>A
  [b]=>B
)


//array_merge_recursive() の場合
//上書きされず、ネスト化される
print_r(array_merge_recursive($data3,$data4));

Array
(
  [a]=>Array
  (
     [0] => 1
     [1] => A
  )
  [b]=>B  
)

//演算子で結合した場合
//前半の配列が上書きされる
print_r($data3 + $data4);
(
  [a]=>1
  [b]=>B
)
```
nuxt.jsを触ってみた

#nuxt.jsに触ってみた
今回nuxt.jsに触ってみたのでメモついでにおさらい。

#導入
ターミナルで以下のコマンドを実行

```
npm install -g vue-cli
vue init nuxt-community/starter-template nuxt_project
```
↓そうすると以下の質問が出るはず。

```
? Project name nuxt_project
? Project description Nuxt.js project
? Author userName <◯@◯.jp>
```
これは全部ENTERでok!

そうすると様々なファイルと、ディレクトリが入ったnuxt_projectという(自分が作成したプロジェクト)
名前のディレクトリがあるのでそちらに移動

```
cd nuxt_project
```
ここで
`npm install`を行い、
`npm run dev`を実行し
ブラウザでlocalhost:3000を叩くと画面が開かれる。

##まとめ
導入はすごい簡単。
みた感じの印象はrailsと似ているなと。(全然知らないので勘弁してください)
とりあえず楽しそうなので触って行きたいと思います。
Firefox Quantum(57以上)で上部のタブバーを消す

人柱erなのでFirefox Quantumを使い始めたけどTree Style Tabがいるのにタブバーがいてつらい人向けのメモ
曰くAPIがなくてWebExtensionから非表示にできないらしいよ

参考リンク:
[Tree Style Tab is a WebExtension now - gHacks Tech News](https://www.ghacks.net/2017/09/27/tree-style-tab-is-a-webextension-now/)

# Profileを探す

~~そもそもBetaだのNightlyを使うような人が知らんわけないだろ～~~
[プロファイル | Firefox ヘルプ](https://support.mozilla.org/ja/kb/profiles-where-firefox-stores-user-data#w_cucgciaaacceagscauii)

# userChrome編集


``` path
Profiles/hogehoge.default/chrome/userChrome.css
```
が存在しなかったら作る
作ったら以下を追記してブラウザ再起動

```userChrome
/* タブバーを非表示にする */
#tabbrowser-tabs {
  visibility: collapse !important;
}

/* サイドバーのヘッダも非表示にする場合はこちらも */
#sidebar-header {
  visibility: collapse;
}
```

このファイルにいろいろ書くといろいろできるらしい(曖昧な表現)
[Mozilla をカスタマイズする](https://www.mozilla-japan.org/unix/customizing.html)

また、Tree Style Tab上でマウスホイールしてタブを切り替えたい場合は、以下のプラグインを追加すればホイール操作でタブを切り替えられる様になります。
```https://addons.mozilla.org/en-US/firefox/addon/tree-style-tab-mouse-wheel/```


# 戻す時

userChromeに追記した部分を消すだけ

---

[ツリー型タブのWebExtensionsへの移行のおはなし - Qiita](https://qiita.com/piroor/items/21ce5c99d5311973661b)
をみて大変そうだと思った ありがてぇありがてぇ…

# 追記
[復活を望む多くの声にお応え！ 「Firefox 59」で“タブを隠す”機能が試験提供](https://forest.watch.impress.co.jp/docs/serial/yajiuma/1103573.html)
って話もあるらしく、今のところは制限付きらしいですがそのうちこの作業がなくなるといいなーとおもいました
PHPでIPAフォントを使う！最新版


#TCPDFで日本語のフォントの使い方

いろいろ検索するもどれもこれもうまくいかないです。

結局のところ3つのファイルが必要で、IPAからダウンロードしたTTFファイルだけではうまくいきません。

**事前に設定が必要です。ソースコードに書くんじゃないですよ。**

##環境
環境はなんでもいいです。
windows環境でもLinux環境でもテストしました。問題ないく使えます。パスをちゃんと指定してあげればうまくいきます。
ちなみに、phalcon3.1を使ってます。

##FPDI+TCPDFの導入
ということでまずは、TCPDFを導入するのですが、
私は、「FPDI+TCPDF」という組み合わせで利用していますが、フォント部分はTCPDFを使っているのでTCPDFだけ利用する方も同様に導入できると思います。
composer.jsonで以下を記述して導入するのがベストです。

```json:composer.json
{
    "require": {
        "setasign/fpdi-tcpdf": "1.6.1"
    }
}
```

パスが通っていればcomposerコマンドでOK

```csh:command
composer update
```

で、無事導入できたんじゃないかと思います。

vendorのsetasignさんところに配置されてはなくて、そこからさらに以下の項目がありtecnickcomにtcpdfが依存関係で入ります。

```json:composer.json
{ "tecnickcom/tcpdf": "6.2.*" }
```


ということで、そこに「tcpdf/tools/tcpdf_addfont.php」というファイルがあるのを見つけてください。

```bash:command
php ./tcpdf_addfont.php   -b -t ipag -f 32 -i どこかのパス/ipag.ttf
```

> 上記 -tは'TrueTypeUnicode', 'TrueType', 'Type1', 'CID0JP', 'CID0KR', 'CID0CS', 'CID0CT'しか指定できないので日本語が使える「CID0JP」じゃないとだめっぽかったです。

```bash:command
php ./tcpdf_addfont.php   -b -t CID0JP -f 32 -i どこかのパス/ipag.ttf
```


このコマンドで
.\tcpdf\fonts 内に ipag.ctg.z, ipag.php, ipag.z 
という3つのファイルができます。

これでPHPで使えるようになります。

```php:sample.php
$pdf->SetFont('ipagp', '', 10);
```

以上。

#IPAフォントをダウンロードはこちらです
http://ipafont.ipa.go.jp/old/ipafont/download.html
iOS定期購読課金 ステータスが追加された件

レシート検証のステータスが追加されています。

https://developer.apple.com/jp/documentation/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html

## 追加されたステータスコード

| ステータスコード | 説明|
|:-:|:-:|
| 21010  |このレシートは認証できません。購入されなかった場合と同様に扱ってください。|

ステータスが0かつ最新レシートの有効期限が切れている場合に有料解除処理をしていましたが、上記のステータス時も同じ処理が必要そうですね。

また、2017/7にレシートにいくつか項目が追加されています。

## 追加されたレシートフィールド

| キー | 説明|
|:-:|:-:|
| pending_renewal_info  |保留になっている更新情報の配列。保留になっている更新とは、将来実施することになっている更新、あるいは何らかの理由で過去に失敗した更新のこと。|
| is-retryable  |このレシートの検証を再試行してほしいかどうか。ステータスコードが21100-21199(内部データのアクセスエラー)の場合にのみ適用|

### 保留になっている状態とは

推測となりますが、以下のような状態が考えられるかなと思います。この状態のときのレシートについてはまた検証したときに追記します。

- 継続課金はONのままで課金決済ができなかった
    - iTunesカード決済でチャージ不足等
内部ストレージに保存したファイルの中身を見る


Android実機にて、openFileOutputメソッドを使ってContext.MODE_PRIVATEとしてファイルを作成すると、Android Device MonitorのFile Explorerを使っても作られたファイルが確認できないけど、どうしても見たかったので。

# ADB Idea をインストール

「ファイル」→「設定」を選択、プラグインから「ADB Idea」をインストール

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/ae0b9acd-3c6b-e485-de4b-0432dd598d10.jpeg)

※リストになかったら上の検索窓から「ADB」で検索

# プラグインのパスを通す

環境変数「PATH」に以下の値を設定する。

[AndroidSDKのパス]/tools
[AndroidSDKのパス]/platform-tools

AndroidSDKのパスは、Android Studioの「ファイル」→「その他の設定」→「デフォルト・プロジェクト構造」から確認可能

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/21629/4c88d1c1-b35d-9edb-2dfa-6ad06cbbfa48.jpeg)

# ADB起動

Android Studioのターミナルを起動、「adb shell」と入力してエンター

# 実機デバッグモードに

「adb shell」を行った後のターミナルにて「run-as [パッケージ名]」と入力してエンター

ホームディレクトリが「/data/data/[パッケージ名]」となっているハズなので、後はlsやcatで中身を見る。

テキストファイルなどであれば、/data/data/[パッケージ名]/files 以下に格納されている。

# ファイルをPCなどで開くには

そのままだとパーミッションの関係で閲覧できないので、一度「exit」で実機デバッグモード（run-as）から抜けて、

「run-as [パッケージ名] cat files/ファイル名 > [PCなどからアクセスできる場所]/ファイル名」

などとして、外部からもアクセスできる場所へ無理矢理コピーしてしまう方法があります。外部からアクセスできる場所は端末ごとに異なるようなのでご注意を。
timeoutをシェルスクリプトで実現する

gnuのcoreutilsの中にtimeoutというコマンドがある。

これを使うと、「コマンドが一定時間たっても終了しない場合にkillする」という処理が実現できる。
詳しくはこちらをご覧いただきたい。
https://qiita.com/ma2saka/items/741b614418bf8fce04de

通常の環境ではcoreutilsのtimeoutを用いればよい。
ここでは「coreutilsが使えない環境でシェルスクリプトで実現したい」というマニアックな要望を叶えるための方法について記載する。

参考にした記事:

- https://unix.stackexchange.com/questions/43340/how-to-introduce-timeout-for-shell-scripting
- https://qiita.com/dogyear/items/e58ddab9a49bf82ed43f
- https://stackoverflow.com/questions/3299502/how-to-return-spawned-process-exit-code-in-expect-script

# 結論

こちらを.bashrcなり.zshrcなりに書けば終わり。

```bash:timeout.sh
timeout() {

    time=$1

    # start the command in a subshell to avoid problem with pipes
    # (spawn accepts one command)
    command="/bin/sh -c \"${@:2}\""

    expect -c "set timeout $time; spawn -noecho $command; expect timeout { exit 124 } eof; catch wait result; exit [lindex \$result 3]"
}
```

使い方

```
timeout 1 sleep 3    # `sleep 3`が途中でkillされて、1秒で処理が完了する。timeoutした場合の返り値は124
```

# 内容の説明

中でexpectというコマンドを使っている。expectは本来は対話式のコマンドを自動化するためのコマンド。しかしこの中にtimeoutの機能も含まれているのでそれを利用している。

expectの引数で与えるコマンドの中で `set timeout {秒数}` とするとタイムアウトの時間を設定できる。

`spawn -noecho $command;`の spawnというのは外部プロセスを起動するexpectのスクリプトの記法。ここでコマンドを起動している。

`expect timeout { exit 124 } eof` はパターンマッチ的な処理を行なっている。もしタイムアウトによって処理が終了した場合は、リターンコード124を返す。そうではない場合は eofの処理が行われるが、ここでは特別に何かを行なっているわけではない。

`catch wait result; exit [lindex \$result 3]` ここがspawnで起動したコマンドのリターンコードを取得している箇所。resultという変数に結果が入っている。resultは配列になっていて、プロセスの返り値以外の情報も入っている。lindexで返り値のみを取得する。`\$result`というようにエスケープされているのは、変数名がシェルではなくexpectコマンドによって解釈されるようにするため。
CeleryでAmazonSQSを使うとエラーメッセージなしに即終了してしまう

# 課題
CeleryのBrokerにAmazonSQSを選択したのですが、起動しても即終了してしまいます。
ログレベルをDEBUGにしても何も出ません。AmazonSQSの権限周りも特に問題ありません。辛い。
redisを使えば動くんですが、自分で管理したくないので絶対AmazonSQSを使いたいのです。

## 解決策
https://github.com/celery/celery
レポジトリを見るとrequirements以下にいろいろあるではないですか。
brokerによって追加で必要なライブラリがあるのでインストールしましょう。

AmazonSQSの場合、 `celery/requirements/extras/sqs.txt`に書いてますね。
boto3とpycurlが必要っぽいですね。
pycurlを入れてなかったのでインストールしたら動きました！！

pycurlのインストールはちょっと面倒なのでこちらの記事を
https://qiita.com/kirishimaru/items/722776766da890fd853f

あとから見つけたんですがissueにあがってましたね
https://github.com/celery/celery/issues/3630
pycurlの依存関係外してくれ〜っていうissueが立ってますw

## どうやって調べたか
celery.worker.consumer.tasksの49行目付近で`Canceling task consumer`というログを出力してるところに移動してエラーっぽいメッセージを探しました。task_consumerのオブジェクト内にはちゃんとエラーメッセージが残ってるっぽいです。できればコンソールにもエラーメッセージを流してほしいですね！
OSS活動は時間がないのでやめておきます←
【メモ】mysql.connector-python を用いたときにpython floatがInsertできないといわれた時の方法

#mysql.connector-pythonでInsert用いたときのデータ形式
mysql.connector-pythonはどうもnumpy.float形式やtimestamp形式をinsertしてくれないようで

dataはnumpy array １列目がtimestampの設定です。

```numpymysql.py
import numpy as np
import pandas as pd
import datetime as dt
import mysql.connector as ms

class NumpyMySQLConverter(ms.conversion.MySQLConverter):
    """ numpy typeを用いるためのmysql.connector Converter """
    def _float32_to_mysql(self, value):
        return float(value)
    def _float64_to_mysql(self, value):
        return float(value)
    def _int32_to_mysql(self, value):
        return int(value)
    def _int64_to_mysql(self, value):
        return int(value)

def insert_sql(data):
    func_date=np.vectorize(lambda x: dt.datetime(x.year, x.month, x.day, x.hour, x.minute, 0))
    date_data=func_date(data[:,0])
    dbh = ms.connect(
        host=[host_name],
        user=[user_name],
        db=[data_base_name],
        charset='utf8')
    dbh.set_converter_class(NumpyMySQLConverter)
    stmt = dbh.cursor(buffered=True)
    sql = ('INSERT INTO `TABLE`'+
           '(`COLUMN1`, `COLUMN2`) '+
           'VALUES (%s, %s)')
    for i in range(data):
            input_data=(date_data[i], date[i,1])
            #エラーハンドリング
            try:
                stmt.execute(sql, input_data)
            except:
                dbh.commit()
                stmt.close()
                dbh.close()
                return input_data
           #autocommitではないので、明示的にコミットする
           dbh.commit()
    #回線の閉鎖
    stmt.close()
    dbh.close()

```
とりあえず動いたのでこれで良しと
NumpyMySQLConverterがうまくいくのかいまいち理解はしていません。