OmniAICreator/Qiita-1.07M huggingface dataset:
hubotとchatworkを連携して定常作業を自動化した話

マイネット Advent Calender14日目の記事です。

## はじめに

弊社ではスマートフォンゲームの運営を行っておりますが、
日々の運用で定常的に発生する作業があります。

**定常作業の例**

- 複数プラットフォームの毎日の売上などの情報を管理サイトから引っ張ってきて足し合わせる
- ○月△日 □時になったら管理サイトで集計を行う
etc...

いずれも作業としては単純ですが、手動で行うと面倒なだけではなく、ミスの原因にもなります。
これらの作業はたいてい単純作業ですが、作業をエンジニアしか行うことが出来ない場合があり、非効率なこともあります。
また、自動化の方法はいくらでもありますが、弊社の特徴として買収・協業を行っているタイトルがあり、その中には以下のような制限が存在することもあります。

- sudoが使えない(権限がない、cron仕込めない、ツールも入れられない)
- 勝手にAPIとか追加できない

そこで、本番環境に触れずに自動で作業を行うにあたり、Hubotに目を付けました。
弊社ではコミュニケーションツールとしてchatworkを使っているので、chatworkのAPIを用いて対話可能にしました。

## hubotの導入
今回は、CentOS6.5上で環境を構築しました。
あらかじめ、chatworkのアカウントを作り、APIKEYを取得します。
まずは必要なものをインストールします。

```
git clone git://github.com/creationix/nvm.git ~/.nvm
cd .nvm/
./install.sh
nvm ls-remote | grep iojs
nvm install iojs-v3.3.1
nvm use iojs-v3.3.1
nvm alias default iojs-v3.3.1
cat ~/.nvm/alias/default
nvm ls

npm install -g npm
npm install -g yo generator-hubot coffee-script
npm install forever -g
```

インストール作業後、適当なディレクトリを作り、hubotの作成を行います。

```
mkdir hoge-hubot
cd hoge-hubot
yo hubot
```

いくつか質問項目がありますが、全てEnterキーを押しても動作します。
また、hubotで使用するツールも入れます。

```
npm install cron --save
npm install hubot-chatwork --save
```

ひとまず準備が完了です。下記で起動が出来ます。

```
bin/hubot
```

以下でPONGが返ってくれば動作しています。

```
hoge-hubot> hoge-hubot ping                                                                                                                                                                                                                  
hoge-hubot> PONG      
```

下記のようにchatwork用に環境変数を設定し、foreverでデーモン化します。

```
export HUBOT_CHATWORK_TOKEN="チャットワークで取得したTOKEN"
export HUBOT_CHATWORK_ROOMS="xxxxxxxx,yyyyyyyy" # 部屋のID(URLのrid以降の数字、複数指定の場合はridカンマ区切りで繋ぐ)
export HUBOT_CHATWORK_API_RATE="500" # 1時間当たりのリクエスト数。多いほどレスポンスが早いが、5分間100回までの制限があるので注意

forever start -c coffee node_modules/.bin/hubot --adapter chatwork
```

## hubot用にスクリプトを書く
基本的にhubotスクリプトはcoffeescriptで記述し、scriptsディレクトリに格納します。
しかし、hubot側でlinuxのコマンドを実行することも可能なので、coffeescriptでrubyやPHPなどを実行すれば他の言語でも対応できます。
hubotによって自動化を行った作業の一例を以下で簡単に紹介します。

### 売上の情報を管理サイトから引っ張ってくる
前日の売上やユーザー数などの情報を取得するためには管理サイトにログインし、該当のページにアクセスして手動で取得していたものを、hubotで毎朝chatworkに呟くようにしました。
このような機能は、cronを用いることで簡単に実装可能です。また、coffeescriptは書きなれていないので管理サイトへのログイン・データ取得部分はRubyで記述しました。

`scripts/cron.coffee`

```
cronJob = require('cron').CronJob
child_process = require 'child_process'

module.exports = (robot) ->
  new cronJob('0 0 9 * * *', () =>
    envelope = room: "xxxxxxxx"
    child_process.exec "ruby external-scripts/get_hoge.rb", (error, stdout, stderr) ->
      if !error
        output = stdout+''
        robot.send envelope, output
      else
        robot.send envelope,"error"
  ).start()
```

coffeescriptでは9時にrubyを実行し、実行結果をchatworkで発言しているだけです。
Rubyのスクリプト部分では、mechanizeを使ってスクレイピングによってデータの取得を行っています。

## 今後やりたいこと
現在は、管理サイトやテスト環境とchatworkの連携のみを行い、定期的な作業や頻繁に実行するコマンドなどを
cronやchatwork上での発言をトリガとしてhubotで行えるようにしています。

今後はGoogle Apps ScriptやSpreadSheetとも連携して、集計系を完全自動化したいと考えています。
[電子工作]意外と深いスイッチの世界

1日にスイッチを押さないことはないと言っても過言ではないくらい身近な電子部品「スイッチ」。
秋葉原の電子パーツ屋さんをぶらりしているとたくさんのスイッチに出会えます。その中で概評的なものをいくつか紹介します。

# タクトスイッチ
![P-03647.JPG](https://qiita-image-store.s3.amazonaws.com/0/55103/24258405-c714-6a60-691f-5d249024dac4.jpeg)
[タクトスイッチ（黒色）：秋月電気通商](http://akizukidenshi.com/catalog/g/gP-03647/)
指で押すタイプのスイッチ。電子工作界隈の人はほぼ全員持っているんじゃないか？ というくらいの定番スイッチ。指で押している間にONになり、離すとOFFになるタイプです。

# トグルスイッチ
![P-03774.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/45d8f2ff-fd4e-ed28-6623-cdb1b2b1218d.jpeg)
[トグルスイッチ１回路２接点（ＯＮ－ＯＮタイプ）：秋月電気通商](http://akizukidenshi.com/catalog/g/gP-03774/)
指で特定方向にバーを傾けるタイプのスイッチ。タクトスイッチのようにON/OFFではなく、端子が2パターンあるので、どちらかと言うとModeA/ModeBのように状態を切り替えることが得意なスイッチです。もちろんタクトスイッチのようにON/OFFでつかうこともできます。傾けたかんじが気持ちいいスイッチ。

# スライドスイッチ
![P-02736.jpg](https://qiita-image-store.s3.amazonaws.com/0/55103/f48ff59f-8839-7d2c-62ba-6adccf92732d.jpeg)
[	
小型スライドスイッチ　１回路２接点　ＳＳ１２Ｄ０１Ｇ４（４個入）：秋月電気通商](http://akizukidenshi.com/catalog/g/gP-02736/)
指でバーをずらすタイプのスイッチ。動作はトグルスイッチと同じ。

# ディップスイッチ
![P-00587.JPG](https://qiita-image-store.s3.amazonaws.com/0/55103/e3079e53-bf89-48b9-5a1d-d113aaf9fca5.jpeg)
[DIPスイッチ ８P：秋月電気通商](http://akizukidenshi.com/catalog/g/gP-00587/)
スライドスイッチがたくさん集まったようなスイッチ。動作をコントロールするというよりは、あるモジュールを複数のスイッチでON/OFFさせて初期設定するという用途で使われることが多いスイッチ。

# チャタリングに気をつけよう
普段何気なく押しているスイッチですが、ONになる瞬間にミリ秒単位で高速にON/OFFが走ってしまいます。それをチャタリングと言います。電子工作で物理スイッチを使用する場合は、高速に連続でON/OFFされないように少し待ち時間をもたせると良いでしょう。

みなさんも楽しい電子工作LIFEを！！
Treasure Dataで「本日のデータ」を集計する

Treasure Data(Presto)において「本日のデータ」を集計するためには、
WHERE句で、Presto UDFの ``TD_TIME_FORMAT`` と  ``TD_SCHEDULED_FORMAT`` を併用するのが良い。

##サンプル
```
WHERE TD_TIME_FORMAT(TD_SCHEDULED_TIME(), 'yyyy-MM-dd') = 
      TD_TIME_FORMAT(time, 'yyyy-MM-dd')
```
##上記記述の意味
``TD_SCHEDULED_TIME()``は、当該クエリがスケジューリングされた時刻を示す。
``TD_TIME_FORMAT()`` は、datetimeを任意の形式で出力する。

## 参考リンク
Treasure Data の Presto UDF Document
* https://docs.treasuredata.com/articles/presto-udfs
Git bash + ConEmu+AutoHotkeyでLinuxのようなターミナル環境を整える

#目的
windows環境でLinuxのようにctrl+alt+tでGit bashを開くようにする。

#使用ソフト
* Git for Windows
* ConEmu
* AutoHotkey

#手順
##Gitbash(Git for Windows)の導入
Git for Windows導入時にGitbashが利用可能になります。
ダウンロードは以下から。
https://git-for-windows.github.io/

##ConEmu
###ConEmuの導入
各種シェルを統合的に扱うソフト。
ダウンロードは以下から。
https://osdn.jp/projects/conemu/

###ConEmuの設定
#### Git bashを開くための設定
インストール後、右上のメニュー(横線3本のアイコン)から[Settings]を選択し、
左側のタブから[Startup]->[Tasks]を選択する。
左側のシェルの一覧から{Bash::Git bash}を選択し、右下のテキストエリアに以下のテキストを入力する。

```
"${Gitディレクトリのパス}\Git\bin\sh.exe" --login -i -new_console:d:{端末で最初に開くディレクトリのパス}
```

例) "C:\Git\bin\sh.exe" --login -i -new_console:d:C:\Users\RIT80\

####その他の設定
日本語のカーソルを合わせるため
右上のメニュー->[Settings]->[Main]で左上のMonospaceのチェックを外す。



##AutoHotkey
自作でショートカットキーを設定できるソフト。
Windows10に予め備わっているショートカットキー作成方法では起動に時間が掛かることが問題(以前の環境では不明)。
起動時間が気にならないなら不必要。
ダウンロードは以下から。
https://autohotkey.com/download/

###AutoHotkeyの設定
適当な場所に以下の内容を記述したahkファイルを作成する。

```
!^t::
IfWinNotExist, ahk_class VirtualConsoleClass
{
  Run "${ConEmuのディレクトリのパス}\ConEmu64.exe"
  WinWait ahk_class VirtualConsoleClass
}
WinActivate
return
```

Windows起動のたびに自動的にショートカットきーを有効にするため、
作成したahkファイルのショートカットを作成しスタートアップに登録する。

##その他の設定
ls時に日本語が文字化けするので${HOME}のディレクトリ(おそらく-new_consoleで設定したディレクトリ)に.bash_profileを作成し以下の内容を記述する。

```bash
alias ls='ls --show-control-chars'
```

#参考
* Git bashとConEmuの導入と設定
http://qiita.com/1000k/items/4a2f9419b19fdc9ed5f4
* ConEmuの設定 http://qiita.com/CyberMergina/items/69cd5890f05d502716c8
* AutoHotkeyの自動起動 http://www.nikoli.com/ja/misc/autohotkey.html
innerHTMLをjQueryで書く



```js
document.getElementById("ID").innerHTML = "HTML-VALUE";
```
と、

```js
$("#ID").html( "HTML-VALUE" );
```
は、同様の動作をします。

要素を作成した時に、jQueryで扱えるようにするには

```js
var span = document.createElement('span');
```
となっているのを、``$()``で括ってあげる。

```js
var span = $(document.createElement('span'));
```
これでjQueryの要素として扱えます。
（``span``はjQueryの関数が使えるようになります。）

まとめ、

```js
var span = document.createElement('span');
span.innerHTML = "HTML-VALUE";
```

は、jQueryでは

```js
var span = $(document.createElement('span'));
span.html( "HTML-VALUE" );
```

と書けます。

基本的なことですが、普通の要素とjQueryの要素が統一されておらず、混ざっていると結構悩みましたので、できるだけ統一していくようにしましょう。
**（JavaScriptの要素とjQueryの要素は別々の型のようです）**


```js
var span = document.createElement('span'); // Javascriptの要素
span.html( "HTML-VALUE" ); // にjQueryの関数はない
```
だと、エラーになるので注意しましょう。
[iOS] SimulatorでMacのキーボードからの入力を可能にする

![Screen Shot 2015-12-14 at 18.44.14.png](https://qiita-image-store.s3.amazonaws.com/0/18705/d45e7dff-7d7e-24ac-e420-221bc0c8e16a.png)


1. iOS Uses Same Layout as OS X
2. Connect Hardware Keyboard ⇧⌘K

- Toggle Software Keyboard ⌘K
【MySQL】select時のデフォ順序

以下の認識で合ってるか詳しい人教えてください。きっかけは素朴な疑問。

プライマリキーがある場合とない場合で違う。

①プライマリーキーがある場合
プライマリーキーでソートされる。

参考：[MySQLはデフォルトで索引構成表](http://d.hatena.ne.jp/kkz_tech/20100813/1281687361)

②プライマリーキーがない場合
取得時のデータ量などにより異なる。

参考：実体験
HiRDB Tips

HiRDB Tips

# HiRDB Tips 集
昔、HiRDBのクラスタリング環境を作るというミッションがあり、盛大に嵌りました。多分今までのエンジニア人生で一番、折角なので色々学んだTipsを書きます。

## 別スキーマへの参照権の付与
+ まずは参照させるユーザでログインする
+ GRANT SELECT ON テーブル名 TO 参照させるユーザ;

## SQLで日付を使う（oracleのsysdateみたいなもん）
+ CURRENT_TIMESTAMP
+ CURRENT_DATE
+ CURRENT_TIME

## pdsqlでAutoCommit

SET AUTO COMMIT ON;
 で auto commit
 
SET AUTO COMMIT OFF;
 で auto commit off
 
 ## RDエリアを拡張する
 まずファイルを作る
```
expand rdarea RDエリア名
file name "作成したファイルシステム領域"
initial 2000 segments ;  ←2000セグメント追加 
```

pdmod -a フルパスで上記ファイル

## ロックを探す
 pdls -d lck
 
 ## SQL実行時のトレースログを出す（チューニング時に使うとか）
PDSQLTRACE=0          ・・・トレースファイルサイズ0無制限
PDCLTPATH=/xxxx/yyy   ・・・トレースファイル格納ディレクトリパス
PDSQLEXECTIME=YES     ・・・SQL実行時間をトレースログに出す
PDUAPREPLVL=a　　　　　　・・・統計情報をトレースログに出す
を環境変数にセットして、pdsql経由でSQLを実行

## テーブル一覧を検索する 

 ```
SELECT TABLE_SCHEMA,TABLE_NAME,TABLE_TYPE,N_COLS FROM MASTER.SQL_TABLES WHERE TABLE_SCHEMA='スキーマ名'
```
これを使えば、その他のシステム系テーブルの名前が分かり便利です。
Columテーブルとか、Indexテーブル、RDエリアテーブルとか
Oracleのdba_tablesとかmysqlのinfomationschemaみたいなもん

##テーブル定義を出力(Oracleのdesc)
columns テーブル名

## ファイルに記載されたSQLを実行
pdsql < ファイル名（SQLが記述）
pdsql < ファイル名（SQLが記述）> 結果がファイルに出力

※参考情報　pdsqlでSQLの結果をファイルで出力
putfile 

## HiRDBに接続中のユーザの強制削除（実行中のSQL毎）
返って来ないSQLを強制終了もします。マニュアル読みつつ自己責任で実行して下さい。

pdcancel -x [サーバ名] -i [プロセスID] -d
pdcancel -X [ユニット名] -i [プロセスID] -d　（パラレルサーバ）

プロセスIDはpdls -d prc で見つける

## データがnullだった場合の初期値（Oracleのnvl）
COALESCE(ID, 'aaaaa')AS ID 　…　IDがnullだったらaaaaaという文字列を返す

## データ全削除 (Oracle のtruncate table)
PURGE TABLE テーブル名;

## RDエリアの閉塞解除
pdrels -r [RDエリア名] -o
※RDエリア名は*でワイルドカードな指定が可能

## トリム
LTRIM,RTRIM

## 差集合検索（Oracleのminus）
exceptまたはexcept all
※union みたいに使う

## 日付フォーマット変換 (Oracle のto_charみたいなもん)
VARCHAR_FORMAT(日付カラム,'YYYY-MM-DD ') 
VARCHAR_FORMAT(日付カラム,'HH-MI-SS.N')

## 文字位置検索
 position('def' in 'abcdefc' from 1)



# 最後に
上記色々書きましたが、当時一番苦労したのが
HiRDBのパラレルサーバで、クラスタリング環境を構築するタスクでした。
マニュアルと格闘しつつサポートに頼りつつ、相当苦労しました。

最終的には何とかなりましたが
Unix初心者が手を出せる領域じゃないんだなぁと実感しました。
同じ苦労をしている人がいたら、頑張って下さい！！
Mockitoの使い方メモ(初級)


JUnitでMockitoを使ったテストをしたので、使い方をメモメモ。


- NonStrictExpectations

```Java:テストコード(抜粋)
@Mocked
protected TimeServiceImpl timeServiceImpl; // @Mockで、モック化したいクラスを定義

    @Test
    public void doTest() {
        new NonStrictExpectations() {
            {
                // 呼び出しする日付をモック化
                Date now = new Date();
                timeServiceImpl.getCurrentTimeDate();
                result = now; // getCurrentTimeDate()を呼んだ時に返ってきてほしい値を書く
            }
        };
        testService.testMethod();
    }
```

この中で、mock化したいメソッドを呼び出し、変数resultに期待値を定義する。
テストコードから該当メソッドが呼ばれた時の結果がmockされる。

- Verifications

```Java:テストコード(抜粋)
@Mocked
protected CloseableHttpClient mockHttpClient; // @Mockで、モック化したいクラスを定義

    @Test
    public void doTest() {
        testService.testMethod();
        new Verifications() {
            {
                List<HttpUriRequest> requestList = new ArrayList<>();
                
                mockHttpClient.execute(withCapture(requestList));
                times = 1; // 呼び出し回数の検証
                
                HttpUriRequest request = requestList.get(0);
                assertThat(request, instanceOf(HttpPost.class)); // 型の検証
        
                HttpPost post = (HttpPost) request;
                assertThat(post.getURI().toString(), is(fixture.uri)); // URI検証
            }
        };
    }
```

検証用。
この例だと、「mockHttpClient.execute」メソッドを呼んだ際の情報をrequestListに保持してくれているので、
その内容が正しいかどうか、Listから取り出して検証をする。
例だとget(0)で、1回目しか見てないけど何度も呼んでる場合は拡張for文等で全部見る。
変数timesは、該当メソッドを呼び出した回数で、代入の形で検証ができる。(回数が違っているとassertエラーでJUnit失敗になる)
Strongtalk - オプショナルな静的型チェック機能を有したSmalltalk

昨日まで開催されていた RubyKaigi で名前が出てきた Strongtalk について少し。

- [Strongtalk: A High-Performance Open Source Smalltalk With An Optional Type System](http://www.strongtalk.org/index.html)
- [Strongtalk: Documents](http://www.strongtalk.org/documents.html)


</br>
かなり前に遊んでから後、追っかけていないのでその後どんなふうになっているのかまったくわからないのですが、本家サイトよりは少し新しめの情報がありそうな Google Code のページを見つけました（これも十分古いですが）。

- [Downloads - strongtalk - Strongtalk is a very fast Smalltalk implementation, with an optional type system - Google Project Hosting](https://code.google.com/p/strongtalk/downloads/list)

どうやら Mac版もあるようですが GUIはついていないようです。Linux版もおそらく同じでしょう。とりあえず、Windows 版を動かす手順を書きます。

上の三番目のリンクから、strongtalk-r189-image+sources.tgz をダウンロードして展開し、必要なら適当な名前（たとえば Strongtalk-r189 ）に付け替えます。その中に同じページからダウンロードできる strongtalk-r200.exe を入れてダブルクリックすれば起動するはずです（OS サイドのセキュリティ関係はよしなに）。

Strongtalk Launcher で恒例の 3 + 4 （Smalltalk-72 でメッセージ式として初めて実行されたコード）を右クリック → Show It で評価してみましょう。

![Strongtalk01.png](https://qiita-image-store.s3.amazonaws.com/0/49275/b1e4151e-cf95-83e0-e2a9-41f0e7e27a6b.png)

</br>
初回起動時に同時に開く Strongtalk Start Page には役立つ情報が満載です。Browse Documentation → Introduction and System Tour とリンクをクリックして進むと A Tour of the Strongtalk System が始められます。

![Strongtalk02.png](https://qiita-image-store.s3.amazonaws.com/0/49275/a35f06bb-2d6a-e28b-d636-728684b83cf3.png)

</br>
Pharo/Squeak などと違い、ネイティブGUIウィジェットを使っているため気づきにくいのですが、この HTMLビューワーも Strongtalk で記述され動いています。

チュートリアルではこの HTMLビューワーを拡張する（具体的には、戻るボタンしかないところに進むボタンを追加する）手順が書いてあって Strongtalk を学びながら体験できるようになっています。

次図は提示されたメソッドを、新規メソッドとして定義しようとコピペして ctrl + shift + enter でコンパイルすると、あらかじめ仕組まれたバグにより型エラーが発生する様子です。

![Strongtalk03.png](https://qiita-image-store.s3.amazonaws.com/0/49275/16bc245f-48cb-04c4-62c6-0358f57ba6e0.png)

もちろん、きちんと型に合うように修正するとコンパイルが通ります。

![Strongtalk04.png](https://qiita-image-store.s3.amazonaws.com/0/49275/de15dc3c-c056-d993-b352-ab545cf33d3a.png)

</br>
同じく指示通りもうひとつ新規メソッド（#forwardButton）を 'private' に追加してから既存のメソッド（#toolBar）に他のボタンに倣って進むボタンを表示するための add: self forwardButton; を追加してコンパイルすれば作業は完了です。

![Strongtalk05.png](https://qiita-image-store.s3.amazonaws.com/0/49275/0dc7b9cd-0efb-8a0b-003d-a0e6ca012ee9.png)


次回表示以降、HTMLビューワーには進むボタンが追加されます。

![Strongtalk06.png](https://qiita-image-store.s3.amazonaws.com/0/49275/8eed1f0e-c859-2762-919c-737085b38e2c.png)

</br>
残念ながら Windows 限定ですが、ぜひお試しあれかし。
XcodeでArchiveした時、login.keychainにcodesignがアクセスできない場合の対策

OS X 10.11にアップデート後、Xcodeで"Product" -> "Archive"する際に「codesignがlogin.keychainキーチェーンにアクセス許可を求めています」というダイアログが表示され、「許可」「常に許可」のボタンを押しても全く反応しない場合があります。

![keychainDoNotAllow.png](https://qiita-image-store.s3.amazonaws.com/0/30970/6a4f83b2-6d41-3b25-0458-272c6569fa44.png)


この現象は、MagicPrefsなどのマウス関連のユーティリティが動作している場合に起こる可能性があります。
ユーティリティを無効化した後、上記のダイアログが出ても「許可」「常に許可」のボタンをクリックできました。

参考: [code sign wants to sign using key - Doesn't allow or always allow but deny works](https://forums.developer.apple.com/thread/25092)
c++ builder XE4, 10.2 Tokyo > TDateTime | TeeChart > データの時刻に合わせて、グラフの時刻範囲を自動変更する

```txt:動作環境
C++ builder XE4
    TeeChart Lite v2013.08.130414
RAD Studio 10.2 Tokyo Update 2 (追記 2018/01/10)
    TeeChart v2016.17.160129 32bit VCL
```

やりたいこと

- データの時刻に合わせて、時間軸を自動的に変更したい

関連 http://qiita.com/7of9/items/de690c703d2d3e758607

```Unit1.cpp
#include <DateUtils.hpp>

...

#if 0
static const int kRangeMinutes = 10;
#else
static const int kRangeMinutes = 2;
#endif

TDateTime __fastcall TFormGraphTemplate::TimeAxis_getRoundedDateTime_each10min(TDateTime srcDt)
{
    int dt_min = srcDt.FormatString(L"nn").ToInt();
    int reduce_min = dt_min % kRangeMinutes ; // for every 10 min
    int reduce_sec = srcDt.FormatString(L"ss").ToInt();

    TDateTime outDt = IncMinute(srcDt, - reduce_min);
    outDt = IncSecond(outDt, - reduce_sec);

    return outDt;
}

void __fastcall TFormGraphTemplate::TimeAxis_autoChangeRange_10min(TDateTime srcDt)
{
	TDateTime curEdDt = Chart1->BottomAxis->Maximum;

	if (srcDt <= curEdDt) {
		return; // do nothing
	}

	TDateTime setStDt = TimeAxis_getRoundedDateTime_each10min(srcDt);
	TDateTime setEdDt = IncMinute(setStDt, kRangeMinutes);

	Chart1->BottomAxis->SetMinMax(setStDt, setEdDt);
}
```

関連ページと比べて「現在時刻の秒」も対応した。

kRangeMinutes はテスト用に入れたconst変数。リファクタリングでは取り除く。


TimeAxis_autoChangeRange_10min()はデータがプロットされるたびに呼んでおけば、データの時刻がグラフの時間軸範囲を超えたときに、時間軸が変更される。

実際やってみたところ、自動変更はされるが見た目はいまいち。

現在試験実装している別の表示の仕方の方がよさそうだが、簡易的な実装としてはこれでもいい。
fluentdのプラグインの各パラメータの説明


[Fluentd v0.12.16でプラグインの設定をコマンドラインから確認する方法](http://www.clear-code.com/blog/2015/10/9.html)

クリアコードさんのブログで既に書かれてますが，fluentdはv0.12.16から，プラグインの各パラメータを定義する`config_param`に説明が付与できるようになってます．今だと二つ付与する方法があります．以下は`out_stdout`の`output_type`の例です．

- :descオプション

```rb
config_param :output_type, :default => 'json', :desc => 'Output format.(json,hash)'
```

- descメソッド (v0.12.17から)

```rb
desc 'Output format.(json,hash)'
config_param :output_type, :default => 'json'
```

結果:

```sh
% fluentd --show-plugin-config=output:stdout
2015-12-14 17:59:58 +0900 [info]: Show config for output:stdout
2015-12-14 17:59:58 +0900 [info]: 
log_level: string: <nil> # Allows the user to set different levels of logging for each plugin.
output_type: : <"json"> # Output format.(json,hash)
```

`:desc`オプションの方はv0.12.16以前でも単に無視されるだけなので，様々なバージョンを考慮するのであれば，こちらの方が良いです．

built-inのプラグインはクリアコードの方々にたくさんパッチを送ってもらい，これらの対応をしました．いずれfluentd-uiでこの機能を利用して自動で設定画面を生成する仕組みを実装しようかなと考えているので，もし時間がある方は，是非`:desc`を付与してもらえると助かります！
Jekyllで変数と文字列を連結する方法


Jekyllのhtml内でページ変数に別の文字列を付加して使いたい時に下記のように普通に連結しようとしても認識されない。

```
{% assign new_var = page.id + '_hogehoge' %}
```


文字列を連結したい場合は`capture`というロジックを用いるようです。

```
{% capture new_var %}{{page.id}}_hogehoge{% endcapture %}
```

これで新しい文字列を変数にセットすることが出来ました。


via: http://stackoverflow.com/questions/23688939/contatenate-append-a-string-to-another-one-in-jekyll-liquid
Mroonga5.10ではノーマライザーをオプションで指定すると全文検索クエリ以外では利用されない

[Groonga Advent Calendar 2015](http://qiita.com/advent-calendar/2015/groonga)の14日目の記事です。

Mroongaでは以下のようにCOMMENTにnormalizer "NormalizerAuto"などと書くことにより全文検索時に利用するNormalizerを変更することができます。

```sql
CREATE TABLE IF NOT EXISTS `tags` (
  `tag` varchar(255) NOT NULL,
  `text` varchar(1000) NOT NULL,
  PRIMARY KEY (`tag`),
  FULLTEXT KEY `text` (`text`) COMMENT 'normalizer "NormalizerAuto"'
) ENGINE=Mroonga DEFAULT CHARSET=utf8;
```

このようにすることでたとえば㍑をリットルで全文検索できます。

```sql
mysql> INSERT INTO tags VALUES("Hoge", "㍑");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM tags WHERE MATCH(text) AGAINST("リットル" IN BOOLEAN MODE);
+------+------+
| tag  | text |
+------+------+
| Hoge | ㍑  |
+------+------+
1 row in set (0.00 sec)
```

しかし、2015/11/29リリースMroonga5.10時点では、全文検索以外の一致検索には通常の照合順序が使われます。デフォルトだとutf8_general_ciが使われます。

```sql
mysql> SELECT * FROM tags WHERE text = "リットル";
Empty set (0.00 sec)

mysql> SELECT * FROM tags WHERE text = "㍑";
+------+------+
| tag  | text |
+------+------+
| Hoge | ㍑  |
+------+------+
1 row in set (0.00 sec)
```

これではちぐはぐですね。そのうち、なんとかしたいです。

### 解決編

[Mroongaで全文検索以外でGroongaのノーマライザーを使う方法](http://qiita.com/naoa/items/63e0aa295395a28cd08f)
PHPのjsonテンプレートjbuilder/commonを動かしてみる


## JBuilderを動かす

https://github.com/dakatsuka/JBuilder


## composerでライブラリをインストール
以下みたいな感じでcomposerを作成

~~~composer.json
{
    name: jbuilderTest,
    require: {
        psy/psysh: ^0.6.1,
        jbuilder/common: ^1.0
    },
    authors: [
        {
            name: hoge,
            email: hogehoge@test.com
        }
    ]
}
~~~

## composerでライブラリをインストール

~~~sh
$ composer install
~~~


## psySHを起動し、公式に書いてある例からcommentsのオブジェクトを外して書いてみる

~~~php
$ vendor/bin/psysh # composerでインストールしたライブラリはカレントディレクトリのvendor配下に入る
>>> require 'vendor/autoload.php'; # composerからライブラリを読み込む
>>> use JBuilder\Common\Encoder;
=> false
>>> echo Encoder::encode(function($json) {
    $json->title = "This is a pen";
    $json->created_at = (new DateTime())->format(\DateTime::ISO8601);
    $json->updated_at = (new DateTime())->format(\DateTime::ISO8601);
    $json->author(function($json) {
      $json->name  = "Dai Akatsuka";
      $json->email = "d.akatsuka@gmail.com";
      $json->url   = "https://github.com/dakatsuka";
  });
});
{"title":"This is a pen","created_at":"2015-12-14T17:09:14+0900","updated_at":"2015-12-14T17:09:14+0900","author":{"name":"Dai Akatsuka","email":"d.akatsuka@gmail.com","url":"https:\/\/github.com\/dakatsuka"}}⏎
~~~

以上

もし、以下の様なエラーが出た場合

~~~sh
Exception with message 'DateTime::__construct(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone.'
~~~

php.iniに以下を追加

~~~php.ini
date.timezone = 'Asia/Tokyo'
~~~
GoogleMapsAPIで複数のマーカーにInfoWindowを表示する

GoogleMapsAPIで複数のマーカーにそれぞれ吹き出しのようなInfoWindowを表示させる際にはまったのでメモ。
### 正解
```html
<div id="map"></div>
<script type="text/javascript">

var markers = [{name:'Tokyo', lat:35.681382, lng:139.76608399999998},
              {name:'Shibuya', lat:35.6581823, lng:139.702043},
              {name:'Ueno', lat:35.7121365, lng:139.77624709999998},
              {name:'Ikebukuro', lat:35.7298477, lng:139.71192859999996}];

var map;
function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat:35.681382, lng:139.76608399999998},
    zoom: 13
  });

  markers.forEach(function (val, index, arr) {
    var marker = new google.maps.Marker({
      position: {lat:val.lat, lng:val.lng},
      map: map
    });
    google.maps.event.addListener(marker, 'click', function (event) {
      new google.maps.InfoWindow({
        content: '<p>' + val.name + '</p>'
      }).open(marker.getMap(), marker);
    });
  }
}

</script>
<script async defer
  src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>
```

### 間違い
はまった内容は、以下のコードでどのマーカーをクリックしてもforループの最後のマーカーのクリックイベントだけが実行されるということ。(この場合どれをクリックしても「Ikebukuro」が表示される。)

```html
<div id="map"></div>
<script type="text/javascript">

var markers = [{name:'Tokyo', lat:35.681382, lng:139.76608399999998},
              {name:'Shibuya', lat:35.6581823, lng:139.702043},
              {name:'Ueno', lat:35.7121365, lng:139.77624709999998},
              {name:'Ikebukuro', lat:35.7298477, lng:139.71192859999996}];

var map;
function initMap() {
  map = new google.maps.Map(document.getElementById('map'), {
    center: {lat:35.681382, lng:139.76608399999998},
    zoom: 13
  });

  for (var i = 0; i < markers.length; i++) {
    var val = markers[i];
    var marker = new google.maps.Marker({
      position: {lat:val.lat, lng:val.lng},
      map: map
    });
    google.maps.event.addListener(marker, 'click', function (event) {
      new google.maps.InfoWindow({
        content: '<p>' + val.name + '</p>'
      }).open(marker.getMap(), marker);
    });
  }
}

</script>
<script async defer
  src="https://maps.googleapis.com/maps/api/js?callback=initMap">
</script>
```
調べて見るとほとんどのサンプルはクリックイベントをイベントリスナーに追加する処理を別functionで定義していた。自分の場合、イベント追加は最初の処理でしか使わなかったため、functionを定義してもその後は出番もなく、面倒だったので今回のforEachを採用。
原因としては、forEachを使えばうまくいっていることから、forループのところがnon thread safeだったため。
pipでインストールしたはずのmoduleが実行されない

pipでインストールしているはずのmoduleが実行されなくて困った時に確認することをメモしておく。

実行環境
- python 2.7.10
- MacOS10.10.5

今回はまった現象

```pycon
>>> from scipy.stats import multivariate_normal
Import Error: cannot import name multivariate_normal
```

scipyのバージョンが古いのかと思い、調べて見ても最新(0.16.1)

```console
$ pip list | grep scipy
scipy (0.16.1)
```

## いろいろと確認してみた。
pipでmoduleの更新確認

```console:update確認
$ pip install --upgrade scipy
Requirement already up-to-date: scipy in /usr/local/lib/python2.7/site-packages
Cleaning up...
```
python内部でのmodule参照先の確認

```console:参照確認
$ python -c 'import scipy; print scipy.__file__'
/Library/Python/2.7/site-packages/scipy/__init__.pyc
```
pipのインストール先と違う？

```console
$ ls /Library/Python/2.7/site-packages/site-packages | grep scipy
scipy
scipy-0.13.0-py2.7.egg-info
```
module参照pathの確認

```console
$ python -c 'import sys; print sys.path'
['', '/Library/Python/2.7/site-packages/pip-1.5.6-py2.7.egg', '/Library/Python/2.7/site-packages/Django-1.7.4-py2.7.egg', '/usr/local/lib/python2.7/site-packages/pip-1.5.6-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/PyObjC', '/Library/Python/2.7/site-packages', '/Library/Python/2.7/site-packages/setuptools-8.2.1-py2.7.egg', '/usr/local/lib/python2.7/site-packages']
```

## 結果
自分のpython環境にはsite-packagesが2つあり片方のsite-packagesはpipでのインストール先となっているsite-packagesより優先的に読み込まれるらしい。そして、優先のsite-packagesにいつの間にか古いscipyをインストールしてしまっていたことが原因。
とりあえずpipで管理していないライブラリを消して解決。
そういえばDjango環境を作った時にこの辺の設定をいじったようななかったような。
B-Treeインデックスの話

# はじめに
この記事は株式会社アイスタイルアドベントカレンダーの16日目の記事です。

DBAの@toshifusaがお送りする今日のお話は、RDBMSのインデックスのお話。
今までとは打って変わって地味で基本的な話ですがお付き合い下さい。

# アイスタイルのデータベース環境
SQL Server、MySQL、PostgreSQLが使われていますが、メインのデータベースはSQL Serverです。

SQL Serverが使われているのって、Web業界では珍しいと思うのですが、創業当時に採用されたデータベースがSQL Serverでした。性能面での問題がほとんど発生しないので、そのまま使い続けています。

# こんな疑問がわいた経験ないですか？

LIKE検索で先頭に%を指定して後方一致検索をした時や、検索対象カラムに関数を使ったときに、インデックスを使ってくれないのはなぜなのか疑問に思った事無いでしょうか？

複合インデックスを定義したテーブルで、インデックス定義の第2カラムを指定したクエリではインデックスを使わないのはなぜなんだろうとか、複合インデックスを定義するとき、どのカラムを第一列にしたら良いんだろうとか。

それらはB-Treeインデックスの構造を知れば納得がいくと思います。

# B-Treeインデックスの基本構造
こんな感じのツリー構造になっています。
インデックスを作成すると、**定義の第一カラムをもとに、検索木を作成し**、リーフノードにはテーブルの行へのポインタを格納します。


![B-Tree.PNG](https://qiita-image-store.s3.amazonaws.com/0/66855/71359a3b-01dd-317d-0993-2b5cea3dfce2.png)

# 単一カラムのインデックス
簡略化して図にしましたが、一つのカラムを指定してB-Treeインデックスを作ると、こんな感じのツリー構造をが作られます。

![single_column_b-tree.JPG](https://qiita-image-store.s3.amazonaws.com/0/66855/90ad2a4b-8710-b497-1748-a14fc4c6713c.jpeg)

これを見ると、以下の疑問に納得がいくと思います。

Q. Like検索で先頭に"%"を指定すると、なぜインデックスを使わないんだろう
A. 先頭文字が分からないと、検索木をたどることが出来なくなるから、使えないんです


Q. 検索対象カラムに関数を使うと、なぜインデックスを使わないんだろう
A. 関数適用前の値で検索木が形成されているので、検索木をたどることが出来なくなるから、使えないんです

# 複合インデックス
簡略化して図にしましたが、複数のカラムを指定してB-Treeインデックスを作ると、こんな感じのツリー構造をが作られます。
**複数のカラムを指定してインデックスを作成しても、定義の第一カラムをもとに、検索木を作成します。**

![multi_column_b-tree.JPG](https://qiita-image-store.s3.amazonaws.com/0/66855/747ed848-3c2d-3a9c-351d-fc2b779f7e9e.jpeg)

これを見ると、以下の疑問に納得がいくと思います。

Q. インデックス定義の第2カラムを指定したクエリではインデックスを使わないのはなぜなんだろう
A. 検索木は第一カラムで作られているので、使えないんです

Q. 複合インデックスを定義するとき、どのカラムを第一列にしたら良いんだろう
A. 検索木が枝分かれするよう、カーディナリティが高いカラムを指定した方がいいよね

第一カラムに何を指定するかで、形成される検索木はまったく変わります。
カーディナリティの少ないカラムを指定すると、一つの枝のリーフノード多すぎて、ぜんぜん絞り込めませんよね。

複合インデックスを作成するときは、よく指定するカラムを第一カラムに指定した方が汎用性が上がるのですが、論理削除を使っていて、必ず指定するからって理由で削除フラグを第一カラムに指定したりすると、検索木は二つにしか枝分かれしないですよ。

# まとめ
ルールやノウハウとして覚えるのではなく、内部構造を知ることで確かな知識を身につけたいですね。

# 参考文献
- [テーブルとインデックスのデータ構造のアーキテクチャ](https://technet.microsoft.com/ja-jp/library/ms180978(v=sql.105).aspx)
- [SQL Server 2008 自習書シリーズ](https://www.microsoft.com/ja-jp/server-cloud/local/sqlserver/2008/self-learning/default.aspx)
[stm]STM32F4でGDBする(Windows)

NUCLEOでWindowsからGDBでデバッグするために、[texane/stlink](https://github.com/texane/stlink)をcygwinでビルドしようとしていた。
やっぱり、mbedで作ったソースもデバッグしたいし。
pyOCDというのが検索すると出てくるのだが、STM32F4には対応していないようなことが書かれていた([PyOCDを使ってmbedをデバッグする(2015年末ver)](http://tnishinaga.hatenablog.com/entry/2015/12/09/040952))ので、試さずにやめた。

[GNU ARM Eclipseの"How to install the debugging components?"](http://gnuarmeclipse.github.io/debug/install/)には、STM32 ST-Link UtilityはWindowsだけだけどGDB Serverがあるように書かれていたのだけど、ドキュメントに"gdb"という単語が出てこないので、あきらめた。

その次の候補が、texane/stlinkだ。

ネットで検索すると、AtollicのTrueSTUDIOに同梱されているgdbserverを使う手段がよく出てくるのだが、うちでやってもerror 37が発生して接続してすぐ切断されてしまう。
[マイコン徹底入門:"ST-LINK(VL Discovery)を用いてのデバッグについて"](http://miqn.net/node/320)に、あるバージョン以降ではTrueSTUDIO以外から使用できなくなったようだ、ということが書かれていた。
Atollic付属のgdbを使っても同じだったので、まあ今回はあきらめよう。
(TrueSTUDIOが嫌なわけではなく、今使っている環境だけで作ってみたいだけ。)

---
長くなったが、ここまでは前置きだ。
本題は、最初に書いた通り、texane/stlinkのビルドについてだ。

うちはWindows7なので、ビルドはcygwinで行った。
Linux向けみたいだから、Macでもいけるのかな？

手順は書いてある通り。

    $ ./autogen.sh
    $ ./configure
    $ make

autogenは動いたが、configureでいろいろ詰まった。

まず、pkgconfigがない、と怒られた。
これは、インストーラで追加すれば良かった。

その次が、こういうエラーだ。

    ./configure: line 4427: syntax error near unexpected token `USB,'
    ./configure: line 4427: `PKG_CHECK_MODULES(USB, libusb-1.0 >= 1.0.0,,'

[検索した](http://stackoverflow.com/questions/11067037/configure-ac-not-finding-dependencies-under-cygwin)ところ、これはcygwinというよりも、パスの設定らしい。
環境変数PKG_CONFIG_PATHに設定がいるとのこと。
ふんふんと設定してconfigureしたのだが、やっぱりエラーが出る。
指定したパスにはlibusb-1.0.pcがあるので、正しいはずなのだが。

何気なくautogen.shをもう一度実行したら、configureも通った。
うん、PKG_CONFIG_PATHを設定したら作り直すこと。

---

makeしたら、いろいろ実行ファイルができる。
st-util.exeを実行すると、ポート4242で待ち受けているので、eclipseなどでデバッグを開始する。
うちでは「GDB Hardware Debugging」を使っている。
ビルドしたELFファイルを"C/C++ Application"に、GDBの実行ファイルを"GDB Command"に、ポート番号を"Port Number"に(IPアドレスはlocalhostにした)。
実行してすぐ止めたいときは、Runtime OptionsでSet breakpoint atでmainを指定しておくとよいのではないか。
Pythonによる機械学習の環境構築メモ


MacOSXでの構築を前提としています。

とりあえず手元のhomebrewの環境を最新にしておく。

```
$ brew update
$ brew upgrade
```

## pyenvをインストール

```
$ brew install pyenv
```

## デベロッパーツールのインストール
まだインストールしていない場合は XCodeのデベロッパーツールをインストールしておく。

```
$ xcode-select --install
```

## 環境変数の設定

`~/.bash_profile` に以下を追記。

```~/.bash_profile
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

## Pythonのインストール

インストール可能なpythonのバージョンを確認する。

```
$ pyenv install --list
```

ここでは `3.4.3` をインストールする。

```
$ pyenv install 3.4.3
```

使用するPythonのバージョンを先ほどインストールした3.4.3に切り替える。

```
$ pyenv global 3.4.3
$ pyenv rehash
```

## 機械学習関連ライブラリのインストール

```
$ pip install numpy
$ pip install scipy
$ pip install matplotlib
$ pip install scikit-learn
```

以上。
c++ builder XE4, 10.2 Tokyo > TDateTime > 指定時刻に近い時刻を得る (10分区切り)

```txt:動作確認
C++ Builder XE4
Rad Studio 10.2 Tokyo Update 2 (追記: 2017/12/27)
```

やりたいこと

- 指定の時刻に近い10分区切りの時刻を取得したい
  - 例: 17:13 >> 17:10
  - 例: 18:10 >> 18:10

参考: [kazuさんの投稿](http://qiita.com/kazu56/items/6ea0b85aa356a1afeebf)

```Unit1.cpp
#include "DateUtils.hpp"

...

static TDateTime getRoundedDateTime_each10min(TDateTime srcDt)
{
	int dt_min = srcDt.FormatString(L"nn").ToInt();
	int reduce_min = dt_min % 10; // for every 10 min

	TDateTime outDt = IncMinute(srcDt, - reduce_min);

	String msg = DateTimeToStr(outDt);
	OutputDebugString(msg.c_str());

	return outDt;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
	TDateTime srcDt1 = VarToDateTime("2015/12/14 17:13");
	TDateTime outDt1 = getRoundedDateTime_each10min(srcDt1); // 17:10

	TDateTime srcDt2 = VarToDateTime("2015/12/14 18:10");
	TDateTime outDt2 = getRoundedDateTime_each10min(srcDt2); // 18:10
}
```

テストケースとして、同値と境界値のチェックは上の２つでいいのだろうか。

参考のページについては、最初、検索で見つけられなくなってしまっていた。
自分がコメントしたのを覚えていたので、自分のコメント一覧からたどったが、コメントの方も検索できないので、見つけるのに2分くらいの時間がかかってしまった。

こうして、参考になる記事が日々うずもれていくのはどうにかしたいものだ。
第一回 機械学習勉強会ノート


## 機械学習の概要

* 機械学習とは「データの集合から」「その法則性」を学ぶこと。
* 目的は以下のようなものがある。
	* 入力と出力の因果関係の抽出
	* カテゴリ判定
	* クラスタリング
	* 異常値検知

### 特徴ベクトルとは
 特徴ベクトルとは、対象の特徴を示す数値を並べたもの。すなわち、法則性を見つけるために項目ごとにデータを整理したものであり、法則性を導き出す前段階として適切な形式に変換する前処理によって生成される。
 
 ```json:特徴ベクトルの例
 
  {
  	templature: 27,
  	humidity: 76,
  	season: 3
  	...
  }
    
 ```
 
 
### 機械学習のアルゴリズムの例
 
例として、室温等のデータから空調の故障を検知するための２つのアルゴリズムを上げる。
 
#### 外れ値検知
 
 データ全体を見て、典型的なパターン（正常なパターン）とは異なる、特異なパターンを外れ値（異常値）として検出する。
 この方法では、正常値をあらかじめ与えておく必要がないのが特徴。

#### 分類
過去のデータをもとに、故障時と正常時のデータ（あるいはいずれか一方）を与えておき、それをもとに現在の状態が正常か異常かを判断する方法。

## 機械学習を使う利点

状況が複雑かつ流動的で、経験と勘による場合分けやルール作りが難しい場合に威力を発揮する。

 * 状況が一定ならプログラミングによって直接、法則を与えれば良い。それができない場合、例えば条件が季節によって変わるとか、対象によって閏値が異なるなどの場合には、機械学習によって法則性を見つけさせる。

## 学習プロセスとモデル

モデル : 学習の結果得られた法則性を表すもの。

* 初期状態が与えられたモデルにデータを与えてアルゴリズムを適用すると、パラメータが更新されたモデルが得られる。これを繰り返してモデルによる出力の精度を上げていく。


## 機械学習の問題設定

機械学習で扱う問題設定は「教師あり学習」と「教師なし学習」の大きく２つに分けられる。

#### 教師あり学習とは

既存の情報から未知の情報を予測するのが「教師あり学習」

#### 教師なし学習とは

訓練データを使わずにデータ内のパターンを発見するのが「教師なし学習」

## 教師あり学習

### 回帰

サンプルデータをもとに実数値を予測する。

#### 線形回帰

入力に対して出力が比例する機械学習のモデルを「線形回帰」という。

##### 損失関数と目的関数

* 損失関数とは予測の誤りを表す指標。
* 回帰問題では、`二条誤差 = (実際の値 - 予測値)2乗` が損失関数としてよく用いられる。
* 全ての場合で損失関数が小さくなるようなパラメータが良いパラメータと言える。

#### リッジ回帰

### 分類

#### ロジスティック回帰

## 教師なし学習

### クラスタリング

クラスタリングはデータ内のサンプルをグループ分けすることが目標。

#### K平均法

* サンプルをK個のグループに分割する。
* 最初にランダムにグループ中心を決める。
* その後、グループ中心と所属グループを交互に決めていく。
	1. 各サンプルの所属グループを推定する。
	2. 各ブループのグループ中心を推定する。

#### 混合正規分布

1つのサンプルに対して、各グループへの所属確率を割り当てる方法。

  
    
### 次元削減

多くの変数からなるデータの次元を減らし、データを要約することを目指す。
Kibanaの設定をまるっと別のElasticsearchに移したい！

※こちらの記事は[個人ブログ](https://tech.tsukapah.com/migrate-kibana-settings/)に移行しました

新しく[こちら](http://qiita.com/tsukapah/items/91cb093ddfa6ede10b02)の記事を書きましたのでそちらを参照することをオススメします。

---

Kibanaの設定は全部Elasticsearchの`.kibana`というインデックスに入っているので、単純にインデックスのお引越しの手順になります。

Snapshot/Restoreを直接APIから実行するのもそんなにむずかしいことではありませんが、
もっと簡単にできそうだったのでESClientというツールを使ってみます。

# 確認した環境
+ Elasticsearch 2.1.0
+ Kibana 4.3.0

# 手順
## ESClientインストール
```bash
$ pip install esclient
※必要に応じてsudoをつけてください
```

## .kibanaインデックスのエクスポート
```bash
$ esdump --url http://<Old Elasticsearch Host>:<Old Elasticsearch Port>/ --indexes .kibana --bzip2 --file kibana.bz2
```

## .kibanaインデックスのインポート
```bash
$ esimport --url http://<New Elasticsearch Host>:<New Elasticsearch Port>/ --file kibana.bz2
```

# 補足
移行対象のデータに日本語が含まれていると、エンコードエラーが出るかもしれません。
その場合、pythonのデフォルトエンコードをUTF8にするなどで回避できます。

---

とりあえず動作確認の環境が欲しければ[こちら](http://qiita.com/tsukapah/items/24bab0f5ab9bb4e12309)もどうぞ。
Reactでシンプルなwebサイトが作れそうなテンプレートを作った

元ブログからの転載です。
http://blog.negic.net/?p=691

---

React.js Advent Calendar 2015の13日目の記事です。

先日Reactを使ったWebサイトを公開しました。
正直、Reactを使ったメリットをあまりつかえていないようにも感じてますが。。

## 実際作ったサイト
http://beokinawa-pr.jp/secret/
http://beokinawa-pr.jp/surprise/

## テンプレート
このサイトを作るさいに、まずReactの勉強ということで簡単なテンプレートみたいなものを作りましたので、それを公開したいと懷います。一応言語切機能みたいなものも付いていますが、ディレクトリを切っての言語切替しか対応していません。

https://github.com/negic/template-react

## ライブラリ
必要なパッケージはpackage.jsonとbower.jsonを見てもらえればわかると思いますが、react関連だけに絞ると、react-routerしか使っていません。参考サイトではreact-mixinsは使っています。

## 雑感
最初はjQueryも併用して使っていたのですが、途中から使う必要がないことに気づき、取っ払ってしまいました。react-routerの使い方が最初いまいちわからなくて戸惑っていましたが、Saqooshaさんの記事などを参考にしたら色々理解できました。

## 参考サイト
http://qiita.com/advent-calendar/2014/reactjs
http://qiita.com/Saqoosha/items/597466bdcd76b2ddfdcf
https://github.com/dot-by-dot-inc/dotby.jp-2015
WordPressをAPI化する5つの方法

# はじめに

WordPressは好きではないけれど、WordPressと同レベルの機能（ユーザー認証、予約投稿、WYSIWYG、メディア管理、プレビュー etc.）を一から開発するのはなかなか大変です。
そこで、WordPressにはCMSとしてDBにデータを作成するところまでを任せ、データ表示は別のシステムで自由に行えるように、WPをAPI化する方法をリストアップします。

# 1. XML-RPC APIを利用する

WordPressにはXML-RPCのAPIが用意されています。
http://codex.wordpress.org/XML-RPC_WordPress_API

※ XML-RPCにはセキュリティ上のリスクがあり、使用には注意が必要です
参照：http://www.atmarkit.co.jp/ait/articles/1403/13/news133.html


下記のようにしてデータを取得します。

```php:
function get_api_data()
{
    $param = xmlrpc_encode_request($method_name, $params);

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_TIMEOUT, 0);
    $results = curl_exec($ch);
    curl_close($ch);
    
    return xmlrpc_decode($results);
}
```


# 2. プラグインを利用する

WP REST APIというプラグインがあります。
http://wp-api.org/

インストールして有効化すると `/wp-json` や `/wp-json/taxonomies` でデータが取得可能となります。
どんなAPIがあるかは上記のサイトを参照してください。


# 3. 自作プラグインを開発する

2のWP REST APIのようなものを自力で作成する方法です。
開発の佳境でプラグインの不具合が見つかることや、開発中の要望の変化にプラグインが対応できなくなることがあるので、時間が取れるなら自作してしまうのもいいですね。

# 4. wp-load.phpを読んでWPの関数を使う

`wp-load.php` を読めば、独自のプログラムの中でWordPressの関数が使えるようになります。

```php:データ取得
require_once(WORDPRESS_ROOT.'/wp-load.php');

class WordpressPost
{
    /**
     * postを1件取得
     */
    public function getPost()
    {
        $res = array();
        $posts = get_posts($args);
        if ($posts) {
            setup_postdata($post);
            foreach ($posts as $post) {
                $res[] = $post;
            }
        }

        return $res;
    }
}
```

# 5. DBから直接データを取得する

WordPressのことは忘れて、MySQLから直接データを取得します。
以下はFuelPHPで書いた場合の例です。

```php:データ取得
class Model_Wp_Post extends Model
{
    /**
     * postを1件取得する
     */
    public function getPost($id)
    {
        $query = \DB::select(
            'ID',
            'post_date',
            'post_title',
            'post_content'
        )
        ->from('wp_posts')
        ->where('ID', '=', $id)
        ->and_where('post_status', '=', 'publish');
        $ret = $query->execute()->as_array();

        return !empty($ret[0]) ? $ret[0] : null;
    }
}
```
ステートが変わったらモーダルを強制的に閉じたい

　
## 背景

- AngularJSで画面を作っている
- ui-routerを利用している
- APIからの戻りがエラー(500番系)だったら、エラー専用画面に state.go('error_画面') で飛ばしている
- 登録フォームなどはモーダルでポップアップさせている

## こまった点

- 上記のような環境で、モーダル画面経由でAPIにPOSTした
- APIから500番エラーが返ってきて、一応　state.go('error_画面') に飛んでくれたところまでは想定内

でも、モーダルが閉じられず、ボタンを押してもモーダルが閉じてくれないという結果に...。
一画面だけならいいのですが、その他にも同じようにしている箇所があり、モーダルが特定できない。

でも、エラー専用画面に遷移したら、モーダルは閉じて欲しい。


## 対策 / $modalStack を利用

$modalStack.dismissAll() を使うと、モーダルを撤収してくれました。

以下、angular.module("アプリケーション").run(..) のところで差し込みした例。

```source:CoffeeScript
if response.status => 500
   $modalStack.dismissAll()
   $state.go("error_画面")
```
PyMOL COMMAND REFERENCE

#PyMOL コマンドリファレンス
PyMOLのコマンド集（メモ用）

##　角度または2面角の測定
get_dihedral [atom1], [atom2], [atom3], [atom4]
get_angle [atom1], [atom2], [atom3]

## コマンドのログを画面に表示する
set overlay, 1　　#1: on; 0: off

## きれいな図
set ray_shadow, off 　#影を消す 
set depth_cue, 0　　#奥行のもやを消す

##turn and rotate
turn x, 180   #camera turns
rotate x, 180   #coordinates of objects rotate

##set valence  #double bond etc.
set valence, 1　　
　　　　stickモデルで、builderモード等で二重結合に表示を変えたいとき
set valence_mode, 1 #bonds inside

##SHOW COORDINATES OF SPECIFIC ATOMS
iterate_state 1, idx 99, print name, x, y, z     # show the coordinates of the atom (the internal num. of 99)
　　　　ある原子の座標を知りたいとき

##RAY_TRACE_MODE
set ray_trace_mode, 1     # trace mode on
set ray_trace_gain, 1     # change thickness
set ray_trace_color, black     # change color
　　　　きれいな図

set cartoon_loop_radius, 0.3
　　　　cartoon表示の大きさ変更

##RAY SETTING
set ray_opaque_background, 0     # create the transparent backgrounds
　　　　背景を透明にする

##LABEL
label 1igt & n. ca, resn + resi     # show residue name and residue number
set label_color, black　　　#ラベルの色を変える
label sele & n. ca, “%.2f” %b     # show temperature factor to two decimal place
　　　　書式付きでラベルを作れる

##COLOR
spectrum b, blue_white_red, 0_17AB,27.3,28.5 # color by B-column
　　　　B因子（温度因子）により色を変えて表示する
　　　　B因子の列に表示したい任意の値に置き換えることでいろいろ使える

##BOND DASH REPRESENTATION
set dash_radius, 0.1     # change the thickness of dash line such as hydrogen bonds
　　　　結合を示す線の太さを変える

##SELECTION
select loop, A/94-103/    　 # equivalent to “c. a & i. 94-103”
select srr, byres loop around 4　  #select residues, 4 angstroum around loop


##CREATE ASYMMETRIC UNITS
symexp zzz, 08_4M7K, h3, 15     
　　　　結晶構造単位を表示する

zzz: new object name, 08_4M7K: pdb object including information, h3: selection name, 15: cutoff length from selection

#MOVIE　ムービーの操作
`set movie_delay, 1000     # How ms (m sec) per 1 frame; 1000 → 1 frame / s; 500 → 2 frame / s`
`mplay #play movie`
`frame 100 #move to 100 step`

##CHANGE SECONDARY STRUCTURE
alter 4M61Fv & c. b & i. 97-109, ss='L'  # helix: ss='H', strand: ss='S'
rebuild
　　　　指定した領域の二次構造を変更する

##SHOW DISTANCEs
distance hbonds, i. 210-222 & (n. o+n), all & (n. o+n), 3.5, mode=2
　　　　二原子間の距離を測る
hbonds: selection name
3.5: show distance within 3.5A between "i. 210-222 & (n. o+n)" and "all & (n. o+n)"

##きれい
set_color oxygen, [1.0,0.4,0.4]
set_color nitrogen, [0.5,0.5,1.0]
remove solvent
as spheres
util.cbaw
bg white
set light_count,10
set spec_count,1
set shininess, 10
set specular, 0.25
set ambient,0
set direct,0
set reflect,1.5
set ray_shadow_decay_factor, 0.1
set ray_shadow_decay_range, 2
unset depth_cue
viewport 400,400
![ex.png](https://qiita-image-store.s3.amazonaws.com/0/99215/8b7cdd1f-1865-07b9-4fa7-4145a4084536.png)
ディレクトリパスを直接指定してimport

既存プロジェクトでImportErrorでテストが通らなかったのでメモ

プロジェクト構成が以下のような場合
※submoduleは"git submodule"で追加したモジュール想定

```
root/
　├ module/
　│　└ submodule/
　│　　└ to_import_module
　└ tests/
　　└ test1.py
```
test1.pyにてto_import_moduleをインポートしようとして

```import module.submoule.to_import_module```
としても
```ImportError: No module named to_import_module```
と突き返されてしまいます。かといってこのためにパス指定やら
プロジェクト設定やらを変更するのも億劫です。
なのでここはsysとosモジュールを使って

```
import os
import sys
sys.path.append(os.path.dirname(os.path.abspath(__file__)) + '/../module/submodule')
import to_import_module
```
と探査パス範囲を拡張してやることによりインポートが可能になります。
他環境でも動くように相対パス指定がいいですね。

ただこの方法だと"pep8 E402"に怒られますが、
**テスト実行はコード規則より重い**
ので勘弁してくださいｵﾅｼｬｽ。
もちろん本命コードに用いるのはNG
iPhoneからsocksプロキシ使ってプライベートなサーバにアクセスしたい

http://qiita.com/uraura/items/3bfb8f003b3b01b901c1

なんか色々やったんですが，これはひとえにiPhoneではsocksプロキシ設定できないと思ってたからでした．

なんていうか，普通にできるんですね．というわけでメモ．

## 対象サーバにSSH
```bash
ssh -D 1080 -g ec2-user@target-server
```

`-g`がポイント．これにより，他のマシン(今回だとiPhone)からSSHを実行しているマシンのポートフォワードが利用できるようになります．

## 設定ファイルを作成し，HTTPアクセスができる場所に配置
```js:socks.pac
function FindProxyForURL(url, host) {
    return "SOCKS 192.168.xx.xx:1080";
}
```

dropboxにでも置いておけば良いでしょう．

## iPhoneのプロキシの設定
<img width="414" alt="image" src="https://qiita-image-store.s3.amazonaws.com/0/18974/192a6f33-42c8-2d5e-77e2-889be0c985d2.png">

HTTP PROXYの設定をAUTOにし，さきほどdropboxにあげたpacファイルを指定します．

## 以上
これでtarget-server内で稼動しているサーバにアクセスできたり，あるいはtarget-serverを経由して別のサーバにアクセスしたりできるようになります．

一応確認

```shell-session
uraura@rosemary$ echo "via socks proxy">index.html

uraura@rosemary$ python -m SimpleHTTPServer
Serving HTTP on 0.0.0.0 port 8000 ...
```

プロキシ設定を変えたiPhoneから localhost:8000 へアクセス

```
127.0.0.1 - - [14/Dec/2015 07:38:36] "GET / HTTP/1.1" 200 -
```

アクセスできた!!

注) iPhoneのChromeからだと通りましたが，Safariからだと`channel 9: open failed: administratively prohibited: open failed`と言われて開けませんでした．．．なぜだろう :ghost: 

---
2015-12-14

`-vvvv`付きでSSHしてログを見てたところ，

```:Safariからアクセスした場合
debug2: channel 15: dynamic request: socks5 host www.localhost.com port 8000 command 1
channel 15: open failed: administratively prohibited: open failed
debug2: channel 15: zombie
debug2: channel 15: garbage collecting
debug1: channel 15: free: direct-tcpip: listening port 1080 for www.localhost.com port 8000, connect from 192.168.xx.26 port 59393 to 192.168.xx.33 port 1080, nchannels 16
...
```

```:Chromeからアクセスした場合
debug2: channel 6: dynamic request: socks5 host localhost port 8000 command 1
debug2: channel 6: open confirm rwindow 2097152 rmax 32768
127.0.0.1 - - [14/Dec/2015 08:59:22] "GET / HTTP/1.1" 200 -
debug2: channel 6: rcvd eof
debug2: channel 6: output open -> drain
debug2: channel 6: obuf empty
debug2: channel 6: close_write
debug2: channel 6: output drain -> closed
debug2: channel 6: read<=0 rfd 14 len 0
debug2: channel 6: read failed
debug2: channel 6: close_read
debug2: channel 6: input open -> drain
debug2: channel 6: ibuf empty
debug2: channel 6: send eof
debug2: channel 6: input drain -> closed
debug2: channel 6: send close
debug3: channel 6: will not send data after close
debug2: channel 6: rcvd close
debug3: channel 6: will not send data after close
debug2: channel 6: is dead
debug2: channel 6: garbage collecting
debug1: channel 6: free: direct-tcpip: listening port 1080 for localhost port 8000, connect from 192.168.xx.26 port 59402 to 192.168.xx.33 port 1080, nchannels 7
```

なぜかSafariの場合は`www.localhost.com`へアクセスしにいってる．．．?

---

`http://localhost.localdomain:8000` とベタベタに指定すればSafariでも行けました．
Rubyを少しでも書けるために最低限知っておく必要な知識 後編

## 前編
[Rubyを少しでも書けるために最低限知っておく必要な知識 前編](http://qiita.com/kodaitakahashi/items/fffc8c218666a20be78e)

## メソッド
Rubyのメソッドは3種類に分けることができる

* インスタンスメソッド
もっとも一般的なメソッド

* クラスメソッド
レシーバがインスタンスではないメソッド

* 関数的メソッド
レシーバーがないメソッド
※ 実際にレシーバがないわけではないが、今回はないと表現する。

※ インスタンスの説明はクラスでする。

### インスタンスメソッド
あるオブジェクト(インスタンス)があったときに、そのオブジェクトをレシーバというものをメソッドと言う。
オブジェクトに対してどのようなインスタンスメソッドを使うかはオブジェクトの種類(クラス)に決められている。

文字列のオブジェクトが属しているクラス **[String](http://docs.ruby-lang.org/ja/2.1.0/class/String.html)**
数値のオブジェクトが属しているクラス **[Numeric](http://docs.ruby-lang.org/ja/2.1.0/class/Numeric.html)**
配列のオブジェクトが属しているクラス **[Array](http://docs.ruby-lang.org/ja/2.1.0/class/Array.html)**
ハッシュのオブジェクトが属しているクラス **[Hash](http://docs.ruby-lang.org/ja/2.1.0/class/Hash.html)**

```ruby:instance.rb
person = Person.new
person.hogehoge # オブジェクト(インスタンス).インスタンスメソッド
```

### クラスメソッド
レシーバがインスタンスではなくクラスそのもだった場合、そのメソッドはクラスメソッドとなる

```ruby:classmethod.rb
numbers = Array.new # オブジェクト(インスタンス) = クラス.クラスメソッド
```

### 関数的メソッド
関数的メソッドは、レシーバの状態によって結果が変わることがないように作られている。printメソッドやsleepメソッドなどはレシーバの状態から影響を受けず、同じ結果を出力します。

```ruby:function_method.rb
print 'test'
sleep(10)
```

### メソッドの定義
一般的な構文
def メソッド名(引数1, 引数2, ...) ~ end

> インスタンスメソッドやクラスメソッドを定義するには先にクラスの定義が必要である。
クラスの定義をせずにメソッドを定義すると関数的メソッドとして呼び出しがされる。

```ruby:hello.rb
def hello(name) # def メソッド名(引数)
	puts "Hello #{name}" # 実行する文
end

hello('bob')  # Hello bob
```

引数にはデフォルト値を指定することができる。
デフォルト値とは引数を省略してメソッドを呼び出したときに代入される値である。
構文
def メソッド名(引数 = デフォルト値) ~ end

```ruby:hellol_default.rb
def hello(name='bob') # def メソッド名(引数)
	puts "Hello #{name}" # 実行する文
end

hello  # Hello bob
```
> 引数を省略または引数がない場合は()なしで実行が可能である。

メソッドの結果を戻す処理を書くことが多々ある。
その場合、メソッドの中にreturn文を書くことに実行結果を戻り値として指定することができる。

```ruby:method_return.rb
def add(num,num1)
	return num + num1
end

total = add(1, 2)
```

return文は省略が可能である。その場合、メソッドの中で最後に得られる値が戻り値とある。

```ruby:method_return.rb
def add(num,num1)
	num + num1
end

total = add(1, 2)
```


## クラス(class)
オブジェクト指向にとって重要な用語の1つである。
オブジェクトの種類を表すものであり、オブジェクトの振舞を決めるものである。設
計図と例えられることが多い。
そのクラス(設計図)からできるものがインスタンス(オブジェクト)と言われるものである。
新しいインスタンス(オブジェクト)を生成するときは、各クラスのnewメソッドを使う。
配列のインスタンス(オブジェクト)を生成するときはArray.newを使う。

```ruby:class.rb
array = Array.new
#または
array = []
```

クラスを定義する場合、定義名の先頭文字は大文字にする必要がある。

クラスの一般的な構文
class クラス名 ~ end

```ruby:class.rb
class Test
	
end

test = Test.new
```
## モジュール(module)
代表的な使い方として名前空間の提供がある。
名前空間とは、メソッドや定数クラスの名前を区別して管理する単位のことである。
モジュールはそれぞれが独立した名前空間であり、
モジュールAの中のメソッドCとモジュールBの中のメソッドCは別ものとなる。

モジュールを定義する構文
module モジュール名 ~ end
 
 ```ruby:module.rb
 module Test
 	class Test
 	end
 end
 
 test = Test::Test.new
 ```

## 参考文献
[たのしいRuby 第4版](https://tanoshiiruby.github.io/4/)
AVPlayerを秒指定でシークする

AVplayerを司る時間の概念がCMTimeの為、非常に分かりにくいのがAVPlayerの良くないところです。

#基礎知識

##ビデオの長さを取得する
`let duration = player.currentItem?.asset.duration`
これでプレイヤーにセットされているアセットの再生時間が取得出来ます。
型はCMTime型です。

##CMTimeを秒に変換する
`let maxTime = CMTimeGetSeconds(duration)`
CMTimeGetSecondsを取得することで、現実で何秒間のアセットなのかを取得することができます。
上記の例では、ビデオの長さを秒に変換しています。

##秒をCMTimeに変換する
`let interval:CMTime = CMTimeMakeWithSeconds(0.01, Int32(NSEC_PER_SEC))`
秒で計算後、playerにセットする場合はまたCMTimeに戻す必要があります。
CMTimeMakeWithSecondsでは、秒数とタイムスケールを指定します。
タイムスケールは難しいので理解する必要はありません。
Int32(NSEC_PER_SEC)を指定することで、現実の時間と同じ大きさのタイムスケールが指定されます。

#1.3秒後にシークしてみよう

```swift 
var currentTime:Float64 = CMTimeGetSeconds(player.currentTime())
currentTime += 1.3
player.seekToTime(CMTimeMakeWithSeconds(currentTime,Int32(NSEC_PER_SEC)), toleranceBefore: kCMTimeZero, toleranceAfter: kCMTimeZero)
```

現在時刻を秒で取得したら、普通に1.3を加算します。
あとはCMTimeに戻してseekToTimeでシークすればOKです。
tileranceBefore/Afterを指定しないと1秒単位でしかシークされないので注意。
NSLogの内容をテキストファイルに書き出してそれをPCに持ってきたい

##概要
テスト用に作った ipa とかでも `NSLog` のログみたいんだけど・・・
デバッグしてる時しか見れないの？
どうすりゃいいんだ(´；ω；`) <- 昨日までの自分

##答え
>http://stackoverflow.com/questions/7271528/how-to-nslog-into-a-file

＾＾あるじゃないの　そういうのが
もっと早く知りたかった・・・

##対応
- `info.plist` で `Application supports iTunes file sharing` を作って値を `YES` にする<br>
（参考：http://qiita.com/aquaviter/items/d3471e279f316a56272a）
- `-application:didFinishLaunchingWithOptions:` の頭とかに以下を仕込む<br>
（FileUtilsみたいな部分は当然自作で。Swift でもだいたいおんなじや）

```objc:AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *path = [NSString stringWithFormat:@"%@log_%@.txt", [FileUtils documentsPath], [DateUtils YYYYMMdd_HHmmss]];
    freopen([path cStringUsingEncoding:NSASCIIStringEncoding], "a+", stderr);
    
    // ・・・
    return YES;
}
```

- 日付でファイル名決めればアプリ起動するたびに、Documentsにログが追加されていく<br>
そうすれば `iTunes->App->ファイル共有` からログがDLできちゃう<br>
よかったよかった
<br><br><br>

***

<br>
あいぽんアプリって Documents でしかファイルやりとりできないのね(´･ω･`)
そこに気づくのにも時間かかった
plist のフラグで iTunes　で見れたりする　ということに気づくのにも時間がかかった
ログ出力の必要なくなったらちゃんと plist 戻して freopen とかも消そう
やたらメモリを消費してスワップ死する開発VMをなんとかする方法

メモリ2Gあって速攻死んでたんだけど200M〜500Mくらいしか減らなくなった

```
<IfModule prefork.c>
StartServers            2
MinSpareServers         2
MaxSpareServers         5
ServerLimit             5
MaxClients              5
MaxRequestsPerChild     1
</IfModule>

<IfModule worker.c>
StartServers            2
MaxClients              2
MinSpareThreads         2
MaxSpareThreads         5
ThreadPerChild          5
MaxRequestsPerChild     1
</IfModule>
```