OmniAICreator/Qiita-1.07M huggingface dataset:
【数B】文系卒社会人が統計・機械学習を理解するために勉強した

#サマリ
統計・機械学習を理解するために数学の知識が足らず勉強を始めました。その経緯などは[「文系卒が統計・機械学習を理解するための数学勉強方法」](http://qiita.com/FukuharaYohei/items/0a66c37091dc27c71fe6)を参照ください。
参考リンク
- 数Ⅰ:[「【数Ⅰ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/78ec8690043b34d39020)
- 数A:[「【数A】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/c62e042762fb017cef6b)
- 数Ⅱ: [「【数Ⅱ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/5647cde590902cc42ec4)
※2003年以前の学習指導要領に準拠しています。

|項目|内容 |
|:-----------------|:------------------|
| 総勉強時間        |            **12.5h**(約1か月) |
| 使用教材        |[長岡先生の授業が聞ける高校数学の教科書数学 (考える大人の学び直しシリーズ)](http://amzn.to/2nueRau) <br> 数Bは約100ページの内容です。|
| 勉強開始前の状態 |数学の勉強は高校以来やっていない状態。数学は嫌いではないが、高校2年生くらいで授業についていくのが辛くなり始めていました。ちなみに高校が付属校なので大学受験はしていません。<br>数Ⅰ、数A、数Ⅱは同じ教材で学習済み。|
#やった内容
###1. 数列
####数列とその和
中学受験の内容も含めて思い出してしまいました。
まずは、**基本の等差数列と等比数列**は、それぞれ以下の式で表せます。

|項目|等差数列 |等比数列 |
|:-----------------|:------------------|:------------------|
| 式        | $a_{n+1}=a_n+d\;(n=1,\;2\;,3\cdots)$ |$a_{n+1}=a_n\times r\;(n=1,\;2\;,3\cdots)$|
| 一般項        |$a_n=a_1+(n-1)d$|$a_n=a_1r^{n-1}$|
| 和|$S_n=\frac{1}{2}n[2a_1+(n-1)d]$|$r\neq1$ のとき $S_n=\frac{a(1-r^n)}{1-r}=\frac{a(r^n-1)}{r-1}$<br>$r=1$ のとき $S_n=na$|
そして、EXCELの関数や統計学などで至る所に出てくる**重要な$\sum$です(「シグマ」と読みます)。**合計を意味して以下の式で表せます。

>```math
a_1+a_2+a_3+\cdots+a_n=\sum_{K=1}^na_k
```

また、[階差数列](http://www.geisya.or.jp/~mwm48961/kou2/kaisa.html)なるものあります。
####漸化式と数学的帰納法
**漸化式は、任意の項がそれに先立つ項との関係を一般的に表したもの**です。詳しくは[リンク先](http://enjoymath.pomb.org/?p=1778)を参照ください。漸化式は、結構難しく感じました。
数学的帰納法は[wikipedia](https://ja.wikipedia.org/wiki/%E6%95%B0%E5%AD%A6%E7%9A%84%E5%B8%B0%E7%B4%8D%E6%B3%95)を参照ください。

###2. ベクトル
**ベクトルは$\vec{a}$で表現する有向線分の長さと向きだけを考えたもの**です。
ベクトルの解説をしたいのですが、図を描いたりするのが面倒なので[リンク先](http://www.geocities.co.jp/Technopolis/1505/vx_index.htm)を参照ください。ベクトルを足したり引いたり掛けたりしていきます。
数学Ⅲと数学Cでベクトルを応用した内容はありませんでしたが、機械学習等でよく見る気がします(SVMなどで使う？)。
3次元のベクトルになると、結構難しかったです。
#感想
数学Aよりさすがに難しいですが、**十分理解はできました。**浅く勉強しているせいかもしれませんが、数学Ⅱよりは簡単に感じました。
数学Ⅱでの教訓を踏まえて、**忙しくてもほぼ毎日少しずつ勉強していったため、効率よく比較的短時間で終えることができました**。
$\sum$もベクトルも統計で使う非常に重要な基礎知識です。しかし、いつになったら応用までいけるのやら:sweat:
[「【数Ⅲ】文系卒社会人が統計・機械学習を理解するために勉強した」](http://qiita.com/FukuharaYohei/items/a623a6948a190fc55a38)へ続きます。
terminal-notifier の基本

## <i class='fa fa-question-circle'></i> terminal-notifier とは？
terminal-notifier は Mac OS のユーザー通知を送るためのコマンドラインツールです。

## <i class='fa fa-download'></i> インストール
```bash
$ brew install terminal-notifier
```

## <i class='fa fa-flask'></i> 利用例
### <i class='fa fa-comment'></i> メッセージ＋タイトル
```sh
$ terminal-notifier -title "📜 タイトル" -message "🍎 メッセージ"
```

![sample1.png](https://qiita-image-store.s3.amazonaws.com/0/43480/9f3c8ec9-7c07-49ab-b273-4f3fb194feb8.png)


### <i class='fa fa-comment'></i> URLを開く
通知をクリックすると指定URLでブラウザを開きます

```sh
$ terminal-notifier -message "URLを開く" -open https://github.com/tbpgr
```

### <i class='fa fa-comment'></i> クリック時に音を出す
```sh
$ terminal-notifier -message "音を出す" -sound Submarine
$ terminal-notifier -message "音を出す" -sound Basso
```

Sound Preference から音声を指定できる

* Basso
* Blow
* Bottle
* Frog
* Funk
* Glass
* Hero
* Morse
* Ping
* Pop
* Purr
* Sosumi
* Submarine
* Tink

![mac_sound.png](https://qiita-image-store.s3.amazonaws.com/0/43480/5ce4794e-cf51-d0ce-58bc-7b13e62ea50a.png)

### <i class='fa fa-comment'></i> アプリケーションを起動
通知をクリックすると指定アプリケーションを起動します。
この例では計算機を起動します。

```sh
$ terminal-notifier -message "Open 計算機" -activate "com.apple.calculator"
```

activate には Bundle Identifier を指定します。
起動中のアプリケーションの Bundle Identifier は以下で確認できます。

```
$ lsappinfo info -only bundleid 計算機
"CFBundleIdentifier"="com.apple.calculator"
```

その他の確認方法については下記の記事が参考になります。

[Bundle Identifierを確認する](http://harafuji0613.hatenablog.com/entry/2015/03/22/002953)


## <i class="fa fa-book" style="font-size:1em;"></i> 外部資料
* [julienXX/terminal-notifier - GitHub](https://github.com/julienXX/terminal-notifier)
* [Bundle Identifierを確認する](http://harafuji0613.hatenablog.com/entry/2015/03/22/002953)
* [【OSX】利用しているアプリケーションのBundle Identifierを調べる](http://qiita.com/miyasakura_/items/51e367b13d2fba545698)
【Swift】YouTube動画アプリのサンプルコード（お気に入り登録&削除）

# 概要
YouTubeの動画検索と動画再生のサンプルコードです。

* キーワード検索
* カテゴライズ
* お気に入り登録
* 動画再生

# [前回](http://qiita.com/menomoto/items/dc3882b68a1c5afcda8f)からの変更箇所
* お気に入りの登録＆削除
　→お気に入りボタンタップ時に選択状態を反転（selected = !selected）
* 画面遷移時にタブバーが消えないように変更
　→各タブ毎にnavigationControllerを設定

# 次回以降のタスク
* 新着動画、Featured
* カテゴリをツリー構造に変更
* 検索結果の並び順の調整

# github
https://github.com/menomoto/Sample_Apps/tree/master/dramaVideos

* 利用する場合は[APIキー](https://github.com/menomoto/Sample_Apps/blob/master/dramaVideos/dramaVideos/Components/Constants.swift#L3)を変更してください。

# 結果
![サンプル](http://i.imgur.com/f48uIEl.gif)
MacでiOS向けの"Build and Run"をするとUnityが終了できない！！

タイトルそのまんまです。Mac版UnityEditorでiOSの"Build and Run"をすると、この"Building Player - Build & Install iPhone player"というウィンドウが出てXcodeが起動するんですが、その後もこのウィンドウが閉じられず、"command + option + esc"でアプリを終了するしかなくなってしまいます…。

![BuildingPlayer.png](https://qiita-image-store.s3.amazonaws.com/0/141731/0280bd49-10bb-33ce-a775-53fe66f5de2b.png)

当然作業にならないし、情報も全くないので自分の環境だけかと思っていたんですが、見つけました。

Unity 5 “Build & Install iPhone player” dialog does not disappear
http://stackoverflow.com/questions/40038344/unity-5-build-install-iphone-player-dialog-does-not-disappear

どうやら、Unityのバージョン5.4.1f1(と5.4.1p1?)でのみ発生するようで、5.4.2f2に更新したら直りました。ほっ。

リリースノートにも書いてありました。Xcode8との相性問題だったようです。他にもiOS10やiPhone7に関する更新があるようで、iOS版をビルドする場合は5.4.2にした方が良さそうです。

*iOS: Update Build and Run to work with Xcode 8.*
https://unity3d.com/jp/unity/whats-new/unity-5.4.2
[Swift3.0]iOS・tvOSアプリを実行中に画面ロック（スリープ）しないようにする方法


## 画面ロックしてほしくないこともある

iOS版の[浮世絵時計アプリ](http://toshi586014.net/2016/11/09/ukiyo-e-clock/)を開発しているときに見つけた小ネタです。

浮世絵時計アプリは、iPhoneやiPadを時計代わりにするので、自動的に画面ロック（スリープ）してほしくありません。そこで、自動画面ロックを解除する方法を探して、見つけたのが下記のコードです。

```
UIApplication.shared.isIdleTimerDisabled = true
```

isIdleTimerDisabledプロパティ（初期値はfalse）にtrueを代入することで、スリープ状態へ移行する時間を監視しているIdleTimerをオフにすることができます。

このコードを、画面ロックを解除したい箇所で実行します。
例えば、ある画面だけロックしないようにする場合は、その画面（ViewController）のviewDidLoadで実行します。

```
    override func viewDidLoad() {
        super.viewDidLoad()
        
        UIApplication.shared.isIdleTimerDisabled = true
    }
```

アプリケーションを起動したときに適用したい場合は、下記のようにAppDelegateに書いてしまってもいいかもしれません。

```
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        UIApplication.shared.isIdleTimerDisabled = true
        
        return true
    }
```

## 注意点

isIdleTimerDisabledのリファレンスを読むと、下記のような注意点が記載されています。

>Important
>You should set this property only if necessary and should be sure to reset it to false when the need no longer exists. Most apps should let the system turn off the screen when the idle timer elapses. This includes audio apps. With appropriate use of Audio Session Services, playback and recording proceed uninterrupted when the screen turns off. The only apps that should disable the idle timer are mapping apps, games, or programs where the app needs to continue displaying content when user interaction is minimal.

画面ロックを解除すると、画面がつきっぱなしになるので、バッテリーを消耗してしまいます。ユーザーのバッテリーを無駄にしないためにも、処理が終わったらすぐに画面ロックを元に戻すのをお忘れなく。

浮世絵時計アプリでは、viewDidDisappearで元に戻すようにしました。

```
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        
        UIApplication.shared.isIdleTimerDisabled = false
    }
```

## 追記

tvOS版の浮世絵時計アプリにも、isIdleTimerDisabledを組み込んで動作確認しました。

Apple TVは、操作なしで一定時間経過→スクリーンセーバー表示→スリープという段階を踏みますが、isIdleTimerDisabled = trueの場合は、スクリーンセーバーも表示されなくなりました。

浮世絵時計アプリのように、コンテンツを流しておくアプリを開発する場合は、ぜひお試しください。
2016年11月版 GCEの料金比較（台湾 vs 東京）※AWSもあるよ

## はじめに
Google Cloud Platform (GCP) が東京リージョン公開になったので、普段は台湾リージョンのGoogle Compute Engine (GCE) を使っているので東京リージョンと台湾リージョンで気になる料金を比較します。ちなみにレイテンシーは、東京リージョンは台湾リージョンと比べて日本国内からのアクセスだと平均50-85%高速化したそうです。料金比較するついでにAmazon EC2の東京リージョンの料金も調べました。

## 比較
料金計算は以下の条件です。

- 1ヶ月の使用料金
- GCEは「１ヶ月連続稼動」が前提で、30%のディスカウントを適用
- EC2は「リザーブドインスタンス」「スタンダード1年間」「前払いなし」が前提で、25-37%のディスカウントを適用

|Type |GCP（台湾） |GCP（東京） |AWS（東京） |
|:------|:------|:------|:------|
|Shared CPUx1, 0.6 GB |$5.00 |$5.51 |$10.95 (t2.micro) |
|Shared CPUx1, 1.7 GB |$15.73 |$18.28 |$21.90 (t2.small) |
|CPUx1, 3.75 GB |$28.50 |$34.28 |- |
|CPUx2, 7.5 GB |$56.61 |$68.16 |$79.57 (m4.large) |
|CPUx4, 15 GB |$112.82 |$135.92 |$159.14 (m4.xlarge) |
|CPUx8, 30 GB |$225.24 |$271.43 |$318.28 (m4.2xlarge) |
|CPUx16, 60 GB |$450.08 |$542.47 |$635.83 (m4.4xlarge) |
|CPUx32, 120 GB |$899.76 |$1084.54 |$1589.94 (m4.10xlarge) |

## おわりに
台湾リージョンから東京リージョンへの料金は約10%の値上げですね。GCEの中では、なにげに東京リージョンが一番料金高いです。乗り換えるとしたら、現状のGCEの使われ方と平均50-85%高速化と料金と、この3つの考慮ですね。そしてAWSと比べるとGCPは圧倒的に安いですね。その分AWSの方がEC2以外のサービスが多かったり、ネット上に情報が多かったりするんですけど。私は凝ったことはしないのでGCPで事足りてます。以上、料金比較でした。
JokerScriptの表示名を途中で変更する方法

- jnameを変更する方法が見つからず、試行錯誤してしまったため備忘録
- [プラグインを作成して公開しよう](http://jokerscript.jp/adv/next/plugin)を参考に、以下のスクリプトを作成すればOK
- [chara_set name="指定したname" jname="" jcolor=""]で変更可能（jcolorの指定は必須ではない）



```csharp:PluginComponent.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

namespace Novel{

	public class Chara_setComponent:AbstractComponent
	{
		public Chara_setComponent ()
		{
			this.arrayVitalParam = new List<string>{
			"name","jname"
			};
		}

		public override void start()
		{
			StatusManager.variable.set ("_chara_jname." + this.param ["name"], this.param ["jname"]);
		
			if (this.param.ContainsKey ("jcolor")) {
				StatusManager.variable.set("_chara_jcolor."+this.param["name"] ,this.param["jcolor"]);
			}

			this.gameManager.nextOrder ();
		}
	}

}
```
jupyter上でvimを使う

pythonでデータ解析するときなどに便利なjupyterですが、vimでやっていきたい場合があります。

# 前提条件

以下のパッケージが入っているとします。

+ git
+ pip
+ jupyter

# 設定方法

jupyterの拡張機能を管理するパッケージjupyter_contrib_nbextensionsをインストール
`$ pip install jupyter_contrib_nbextensions`

jupyter_contrib_nbextensionsのjavascript,cssをインストール
`$ jupyter contrib nbextension install --user`

拡張機能を置くディレクトリを作成
`$ mkdir -p $(jupyter --data-dir)/nbextensions`

そのディレクトリに移動
`$ cd $(jupyter --data-dir)/nbextensions`

vimをバインディングするパッケージjupyter-vim-bindingをgitでクローンしてくる
`$ git clone https://github.com/lambdalisue/jupyter-vim-binding vim_binding`

jupyter-vim-bindingを有効にする
`$ jupyter nbextension enable vim_binding/vim_binding`

設定を終えたら`jupyter notebook`でjupyterを起動して確認してみましょう。いい感じに使えるはずです。

# 参考URL
ipython-contrib/jupyter_contrib_nbextensions
https://github.com/ipython-contrib/jupyter_contrib_nbextensions
lambdalisue/jupyter-vim-binding
https://github.com/lambdalisue/jupyter-vim-binding
Jupyter (旧 IPython notebook）の本来あるべき姿を垣間見る
http://lambdalisue.hatenablog.com/entry/2015/12/22/233817
クラスファイル群を整理するためにはpackage!

内容はタイトルの通り"package"
eclipseでは新規プロジェクトを作成する時に作成してる感じですね。
なぜ作成するのかはこの記事を書くまで全然気にしていませんでした。

##そもそもなぜpackageを作成するの？
タイトルの通りですが、クラスファイル群を整理する仕組み＝フォルダリング
調べた要約がこんな感じでした。

クラス名が世界で一つしか使えなかったら不便ですから、各種クラスファイルはフォルダで仕分けて管理する仕組みという事らしいです。

eclipseを使用せずpackageを作成してみる事にします。

今回作成したプロジェクトはこんな感じです。

```text
ドキュメント
    ├──workspase/
        ├──hallojavaworld/
            ├──Hellojava.java
```
このプロジェクトにpackageを作成します。

配置ディレクトリはこんな感じになります

```text
jp\ac\hello\Hellojava.class
```

完全修飾クラス名

```text
jp.ac.hello.Hellojava
```

※完全修飾クラスについては説明をはぶきます。プログラムで利用するという認識で大丈夫だと思います。
完全修飾クラス名中の「ピリオド(.)」は、ディレクトリ区切りを意味するらしいです。

次にHellojava.javaに記述以下の内容を記述しておきます。

```java
package jp.ac.hello;    //←ここでパッケージ名（フォルダ階層）を記述

class Hellojava{
    public static void main (String[] args){
			System.out.println("Hello java Wlorld!)";
	}
}
```

コンパイルをしてプログラムを実行してみましょう！
![test4.png](https://qiita-image-store.s3.amazonaws.com/0/146678/800bb0bd-764d-4664-b10f-26c2e5901182.png)

コンパイルはできてますが、実行は"エラー: メイン・クラスHellojavaが見つからなかったかロードできませんでした"と怒られてしまいました。

どうやらパッケージ自体は自分で作成しないといけないみたいですね…
ここで便利なjavaコンパイラオプションの「-d」を使用します。

-d パッケージ階層のディレクトリを自動生成してくれます。

```bat
javac -d .\ Hellojava.java
```

コンパイルすると以下のようになります。

```text
ドキュメント
    ├──workspase/
        ├──hallojavaworld/
            ├──Hellojava.java
            ├──jp/
                ├──ac/
                    ├──Hellojava.class
```

Hellojava.classがパッケージで宣言された通り(jp/ac/hello)の中に生成されました。

##蛇足
package名の付け方もあるらしくWikiを引用したのがこんな感じです。
>パッケージ名は組織のトップレベルドメイン名と、そのときの組織のドメインといくつかのサブドメインリストが逆順になったもので始まることが推奨されている。
組織はそれらの名前にそのときに特定の名前を選ぶ。パッケージ名は可能ならばすべて小文字にすべきである。

packageについてはすごくまとめるのが難しく、大切な事を言い忘れてる可能性があったらすみません。

編集
ショートカットファイル作成（Windows *.lnkファイル、VB script 利用で）

こんにちは。
Google Chrome へのショートカットファイルを作成する方法を考えてみました（Windows OS の *.lnkファイルです）。

下記内容を VB script のファイルとして保存し、そのファイル（のアイコン）をダブルクリックして実行させれば、目的とするショートカットファイルがデスクトップに作成されます

```shortcut.vbs
'このファイル（のアイコン）をダブルクリックして実行させます。
'create a short cut of Google Chrome exe by using VB script
Set fso = CreateObject("Scripting.FileSystemObject")
Set ws  = CreateObject("WScript.Shell")
desktop = ws.SpecialFolders("Desktop")
Set shortcut = ws.CreateShortcut(desktop & "\chrome.lnk")
With shortcut
  .TargetPath = """C:\Program Files\Google\Chrome\Application\chrome.exe"""
  .Arguments  = "--allow-file-access-from-files --disable-web-security --user-data-dir --enable-easy-off-store-extension-install"
  .WorkingDirectory = desktop
  .Save
End With
```

なおこちらに情報がまとめられています。

- 「[起動オプション](http://chrome.half-moon.org/43.html)」（Google Chrome まとめWiki）
Timemachineで、キーチェーンエラー10001が発生した場合の対処法

先日、timemachideでバックアップを取得しようした際に、キーチェーンエラー　100001が発生してバックアップできませんでした。
OSは、MacOS Sierra(ver10.12.1)です。

## 原因？
原因は、たぶん、別のmacのバックアップデータを、新しいmacに適用した際に、途中でキャンセルしたのが問題だったのかもしれません。
キーチェーンのデータをみたら、ログインユーザーが別のmacのログインユーザーになっていました。

## 対処法
appleのフォーラムにそれらしき問題の解決方法があったので、日本語にしてみました。
ソースはこれです。
https://discussions.apple.com/thread/7329444?start=0&tstart=0

手順
１）command ＋ r ボタンを押しながららMacを起動する

２）起動したら言語選択で日本語選択

３）画面上部のユーティリティからコマンドユーリティを起動

４）白いウインドウが出てきたら、以下の内容を入力
/Volumes/のアンダーバー（_）のところには、自分が使っているHDDの名前を入力します。
デフォルトだと、「Macintosh HD」になっていると思います。

/usr/bin/chflags norestricted,nosunlink “/Volumes/______/Library/Keychains/System.keychain”

デフォルト設定の場合の入力例
/usr/bin/chflags norestricted,nosunlink “/Volumes/Macintosh HD/Library/Keychains/System.keychain”

５）正常に入力されれば、何のメッセージも表示されずに、文字の入力画面に戻ります。
エラーが出たら、たぶん、HDDや他の入力文字が間違っているのかもです。

６）４終了後、左上のリンゴマークから、再起動を選択

７）起動後、バックアップを行う

以上。
オンラインSICP読書女子会 #25 (2.3.1)

[オンラインSICP読書女子会 #25 (2.3.1)](http://ladiespp.connpass.com/event/43214/)

練習問題 2.53 - 2.55

## 2.3 記号データ

### 2.3.1 クォート

シンボル値的なもの.
atom とも言ったような？

```scm
gosh> (define a 1)
a
gosh> (define b 2)
b
gosh> (list a b)
(1 2)
gosh> (list 'a 'b)
(a b)
gosh> (list 'a b)
(a 2)
```

リストに適用するとリストの全部の要素が全部 quote される:

```scm
gosh> (car '(a b c))
a
gosh> (cdr '(a b c))
(b c)
```

```scm
gosh> '(a 1 (b 2))
(a 1 (b 2))
```

`memq` の定義でしれっと `false` っていう定数使ってるけれど gosh さんにはこれない… `#f` だし….

```scm
(define (memq item x)
	(cond
		((null? x) #f)
		((eq? item (car x)) x)
		(else (memq item (cdr x)))))
```

ところで memq ってなんの略? member query? ＝ω＝;

追記: Scheme 標準だったぽい…! [Function: memq obj list](https://practical-scheme.net/gauche/man/gauche-refj/peatorisuto.html#index-memq)

> memqは同一性の判定にeq?を、memvはeqv?を、 memberはequal?を使います。

なるほど？？
[mem]ber by \[q] (=eq?) ってことかな？＝ω＝;


## ex-2.53. quote あれこれお試し

```scm
gosh> (list 'a 'b 'c)
(a b c)
gosh> (list (list 'george))
((george))
gosh> (cdr '((x1 x2) (y1 y2)))
((y1 y2))
gosh> (cadr '((x1 x2) (y1 y2)))
(y1 y2)
gosh> (pair? (car '(a short list)))
#f
gosh> (memq 'red '((red shoes) (blue socks)))
#f
gosh> (memq 'red '(red shoes blue socks))
(red shoes blue socks)
```

## ex-2.54. equal?

```scm
(define (equal? a b)
	(cond
		((eq? a b) #t)
		((and (null? a) (null? b)) #t)
		((or (null? a) (null? b)) #f)
		((and (pair? a) (pair? b)) 
			(and (equal? (car a) (car b)) (equal? (cdr a) (cdr b))))
		(else #f)))
```

```scm
gosh> (equal? 'a 'a)
#t
gosh> (equal? 'a 'b)
#f

gosh> (equal? '() '())
#t
gosh> (equal? '(a) '())
#f
gosh> (equal? '() '(a))
#f
gosh> (equal? '(a) '(a))
#t

gosh> (equal? '(a) '(b))
#f
```

追記: `(eq? '() '())` は真になる模様. これもシンボル値…?
`cond` の2行目の判定はこれにマッチするのでなくてよかった模様.

空リストって pair の一種にはならないのね…！(・ω・;

```scm
gosh> (pair? ())
#f

; おまけ (Erlang の場合).
erl> is_list([]).
true
```

修正版:

```scm
(define (equal? a b)
	(cond
		((eq? a b) #t)
		((or (null? a) (null? b)) #f)
		((and (pair? a) (pair? b)) 
			(and (equal? (car a) (car b)) (equal? (cdr a) (cdr b))))
		(else #f)))
```

(最後に `(else #f)` ってなるの前の条件句と混ぜちゃいたさ少しあるけれど, 可読性がとても落ちそうなのでこのままのほうがよさそう.)


## ex-2.55. (car ''abracadabra)

ダブルクォートっぽいけどシングルクォート2つ＞ω＜

p.153 脚注 34 によると, `'(a b c)` は `(quote a b c)` という特殊形式の syntax sugar になっている.
これに当てはめると,

```scm
(car ''abracadabra)
(car '(quote abracadabra))
```

であり, `(car '(a b c))` が `a` となるのと同様に `(car '(quote abracadabra))` は `quote` となる.
PHPでDBから取得したデータをランダムに表示させる方法


## やりたいこと
・DBの画像情報を一部だけweb上に表示する(毎回ランダム)
・その後の処理のために、全画像の情報も取得しておく

## 処理内容
``` php
<?php 
//変数宣言
$FullData = array();
$TmpData = array();
$RandData = array();

//fetchでDBデータをすべて取得し、配列に格納($StmtはPDOで取得済み)
while ($DbData= $Stmt->fetch(PDO::FETCH_ASSOC)) {
   array_push($FullData,array(image => $DbData['フィールド名']));
}

//データのシャッフル
shuffle($pai_data); 

//array_randでランダムに値を取得
$TmpData = array_rand($FullData, 4);
//更にシャッフル
shuffle($pais_tmp);

//TmpDataで作ったデータをもとに、RandDataにランダム情報を格納
foreach ($TmpData as $data) {
        array_push($RandData, $FullData[$data]);
    }
?>

<!DOCTYPE html>
//HTMLに描画
<?php for ($i = 0; $i< count($pai_data_start); $i++) { ?>
// current処理を使って、配列に格納した画像情報を表示
  <img src=<?= current($pai_data_start[$i])?> > 
<?php } ?>
 
```

→ページを表示する度にランダムでデータが表示される。

## つまづきポイント
・array_randでは配列の番号しか取得できないので、その値をもとにループ処理でデータの取得が必要だった。 
・配列をそのままechoで表示すると、"Array"と表示されてしまうので、current関数を使うとうまく表示ができた。

ランダムのデータ取得は奥が深そうだが、一旦これでよしとする。


・以下参考にさせていただきました
http://kihon-no-ki.com/get-value-at-random-from-array
http://bluesky.holy.jp/blog/bluesky/2015/07/20150729.html
http://doremi.s206.xrea.com/php/tips/array.html
http://qiita.com/shuntaro_tamura/items/784cfd61f355516dfff0
ドメイン コントローラーを Windows Server 2016 に移行した

Windows Server 2016 がリリースされたので、ドメイン コントローラー (以下、DC) 環境のアップグレードの作業内容もまとめておこうと思います。

# 目的
Windows Server 2012 R2 ベースの AD 環境をアップグレードする

# 環境
- DC 1号機 (Windows Server 2012 R2)
- DC 2号機 (Windows Server 2016)

# 条件
- DC 2号機は既存ドメインに参加後、AD DS の役割を追加、DC にしておく
- FSMO は DC 1号機が所有

# 作業内容
1. コマンド プロンプトを管理者モードで起動し、`ntdsuti.exe` を実行します。
2. ntdsutil メニューに切替え後、`roles` コマンドを実行していきます。

```
C:\Windows\system32\ntdsutil.exe: roles
fsmo maintenance: connections
server connections: connect to server dc02
dc02 に結合しています...
ローカルでログオンしているユーザーの資格情報を使って dc02 に接続しました。
```

3.`quit` コマンドを実行して、`fsmo mentenance` に戻ります。

```
server connections: quit
```

4.`Transfer schema master` コマンドじ実行し、DC 2号機にスキーマ マスターを転送します。

```
fsmo maintenance: Transfer schema master
サーバー "dc02" は 5 個の役割を認識しています
スキーマ - CN=NTDS Settings,CN=DC02,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=tokyo,DC=corp,DC=contoso,DC=com
名前付けマスター - CN=NTDS Settings,CN=DC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=tokyo,DC=corp,DC=contoso,DC=com
PDC - CN=NTDS Settings,CN=DC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=tokyo,DC=corp,DC=contoso,DC=com
RID - CN=NTDS Settings,CN=DC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=tokyo,DC=corp,DC=contoso,DC=com
インフラストラクチャ - CN=NTDS Settings,CN=DC01,CN=Servers,CN=Default-First-Site-Name,CN=Sites,CN=Configuration,DC=tokyo,DC=corp,DC=contoso,DC=com
fsmo maintenance:
```

5. 手順 4. と同様に `Transfer naming master`、`Transfer infrastructure master`、`Transfer PDC`、`Transfer RID master` の各コマンドを実行します。

これで、すべての役割が DC 2号機に転送されました。
Windows Server 2016 環境でも、参考 URL に記載された様な作業内容で問題なく移行できたのかなと。
もし、間違いがあれば、ご指摘ください。

# 参考資料
[AD DS] ntdsutilコマンドを利用してFSMOロールを通常転送する方法
http://www.dell.com/support/article/jp/ja/jpbsd1/SLN293648/ja

ドメインコントローラーの入れ替えに伴う基本的な作業について
https://goo.gl/IQfv28
[AWS][CloudFront] CloudFront で HTTPS リクエストを受け付けた場合に X-Forwarded-Proto をちゃんとアプリケーションに渡すには？

CloudFront → オリジンサーバ間は http でやりとりしてて、Web サーバ側では CloudFront に https でリクエストされてることを認識してくれないって時の対処方法。
CloudFront の Behaviors で「Forward Headers」で CloudFront-Forwarded-Proto をオリジンサーバに渡すようにしておくこと。

**Apache での対応**

```text:httpd.conf
SetEnvIf  CloudFront-Forwarded-Proto "https" HTTPS
RequestHeader set X-Forwarded-Proto "https" env=HTTPS
```

**Nginx での対応**

```text:nginx.conf
server {

    ...

    set $proxy_https '';
    if ( $http_cloudfront_forwarded_proto = 'https' ) {
        set $proxy_https 'on';
    }
    if ( $http_x_forwarded_proto = 'https' ) {
        set $proxy_https 'on';
    }
    if ( $scheme = 'https' ) {
        set $proxy_https 'on';
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass   phpfpm;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $script_root$fastcgi_script_name;
        fastcgi_param  HTTPS            $proxy_https  if_not_empty;
        include        fastcgi_params;
    }
}
```
リバースプロキシ経由でSinatraアプリケーションを動かす

# 動機

- Sinatraアプリケーションを動かしたい。
- リバースプロキシを経由したい（URL，SSL，パフォーマンス， etc.）
- URLはルートではなく，サブディレクトリに配置したい

今回のサンプルでは，リバースプロキシとしてApacheを使っているが，nginxなど，他のWebサーバでも同様のはず。

# 準備

## サンプルアプリケーション

```application.rb
require "sinatra"

get "/" do
  "Hello!"
end

get "/redirect" do
  redirect to("dest")
end

get "/dest" do
  "redirected"
end
```

これを

```
$ ruby application.rb
```

とすることで， http://localhost:4567/ でサンプルアプリケーションが起動する。

## リバースプロキシの設定 (Apache 2.4)

上で用意したサンプルアプリケーションを，
http://example.com/example-app/
として動作させたい。
※SinatraアプリケーションとApacheは同じホスト(example.com)上で動作しているとする。

apacheの設定ファイルで，

```
ProxyPass /example-app/ http://localhost:4567/
ProxyPassReverse /example-app/ http://localhost:4567/
```

これで，Webブラウザから http://example.com/example-app/ にアクセスすると，画面に「Hello!」という文字列が表示されるはず。

# 何が問題？

http://example.com/example-app/redirect にアクセスしてみよう。
本当は， http://example.com/example-app/dest にリダイレクトされて，画面に「redirected」と表示されて欲しい。

が，試すと http://example.com/dest にリダイレクトされ，画面には「404 Not Found」エラーが…。

# 原因は？

まず，前提条件として，HTTPによるリダイレクトでは，リダイレクト先はアクセス可能なURIで返さねばならず，相対パスで指定することはできない。
上記のサンプルアプリケーションで

```application.rb
get "/redirect" do
  redirect to("dest")
end
```

でリダイレクト処理が書かれている。ここではリダイレクト先が相対指定されているが，Sinatraのtoヘルパメソッド（実際にはuriヘルパメソッドのエイリアス）によって，正しいURIに書き換えられてクライアントに返される。
この時，toヘルパメソッドの中では，スキーム(http / https)，ホスト名(example.com)，ポート番号，パスを結合してURIが組み立てられている。ただ, リバースプロキシを介してアクセスしている場合，実際にブラウザがアクセスしているURIはSinatraアプリケーションは知らないので，通常であればリダイレクト先として， 
http://localhost:4567/dest
のようなURIを返すはず。このように返してくれれば，上でApacheに設定した

```
ProxyPassReverse /example-app/ http://localhost:4567/
```

の設定により，Apacheがブラウザに返すレスポンスでは，リダイレクト先が
http://example.com/example-app/dest
と書き換えられるはずだ。（そのためのProxyPassReverse設定）

ただ，Sinatraでは，Sinatraが親切にもリバースプロキシの有無をチェックし，リバースプロキシ経由でアクセスされている場合は，toヘルパメソッドでURIを組み立てる際に，自動的にホスト名を書き換えてくれてしまう。その結果，リダイレクト先として
http://example.com/dest
というURIが作られ，これは上記のProxyPassReverseの設定では変換されず，そのままブラウザに返されてしまう。

# 対処方法

Sinatraのtoヘルパメソッド（実際にはuriヘルパメソッド）のソースを見ると，

```base.rb
uri << request.script_name.to_s if add_script_name
```

とあり， request.script_name の内容をアプリケーションのディレクトリ名（今回の例では/example-app）として使用している。であれば，この request.script_name を書き換えてあげればよさそうだ。

そこで，application.rbにbeforeフィルタを追加してやる

```application.rb
before do
  request.script_name = "/example-app"
end
```

こうすることで，toヘルパメソッドで正しいURIが組み立てられ，想定通り
http://example.com/example-app/dest
にリダイレクトされるようになる。

上のコードではハードコードしてしまっているが，実際にはこの部分を設定ファイルなどでアプリケーションの外に出してやれば，アプリケーションの展開環境に応じたディレクトリ名を指定することができる。

## 別解 (Thinを使用している場合）

上の例では，アプリケーション側で対処しているが，実のところ，SinatraのアプリケーションサーバとしてThinを使っているのであれば，Thinの設定で対処することも可能。
Thinの設定ファイル(yaml)内で，

```
prefix: /example-app
```

と指定することでSinatraの request.script_name に設定される。

ただ，今回の環境では，アプリケーションサーバとしてPumaを使っているため，上記の方法が使えず，アプリケーション側で対応することにした。
Jenkinsのログファイルをタイムスタンプ付きで保存する

## はじめに
Jenkinsのログにタイムスタンプを残したいと思ったことはないでしょうか？
何かあったときに後から確認したい、監査に使いたい、等々。

ただ見たいだけであれば、Timestamperプラグインを入れることで、JenkinsのGUIの画面上から確認することはできます。

しかし、ログがたくさんたまったらアーカイブして…ということをしていると、古いログのタイムスタンプは見れなくなってしまいます。（そんな古いログのタイムスタンプを見る必要があるかどうかは置いておいて…）
<img width="545" alt="スクリーンショット 2016-11-09 20.12.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/b3987faf-e767-e9ef-c5b2-3a22414ea44d.png">


上記に該当するログファイルを見ても、以下のようにGUIの画面では見えていたはずのタイムスタンプが見当たりません。

```
root@test ~]# cat /var/lib/jenkins/jobs/test-job/builds/1/log
Started by user ha:AAAAlx+LCAAAAAAAAP9b85aBtbiIQTGjNKU4P08vOT+vOD8nVc83PyU1x6OyILUoJzMv2y+/JJUBAhiZGBgqihhk0NSjKDWzXb3RdlLBUSYGJk8GtpzUvPSSDB8G5tKinBIGIZ+sxLJE/ZzEvHT94JKizLx0a6BxUmjGOUNodHsLgAzWEgZu/dLi1CL9xJTczDwAj6GcLcAAAAA=admin
Building in workspace /var/lib/jenkins/jobs/test-job/workspace
[workspace] $ /bin/sh -xe /tmp/hudson4221146535790319885.sh
+ echo Hello
Hello
Finished: SUCCESS
```

## 方法
JenkinsのAPIを使い、以下のURLにアクセスすると、タイムスタンプ付きのログのみをテキストで見ることができます。
`http[s]://[url]/job/[job_name]/[build_number]/timestamps/?time=HH:mm:ss&appendLog`

<img width="683" alt="スクリーンショット 2016-11-09 20.20.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/113160/80bbac4b-adf1-d210-b7a7-fd26224d8da7.png">

これを利用して以下のように `curl` コマンドや `wget` コマンドを使うことで、タイムスタンプ付きのログファイルを保存することができます。

```
[root@test ~]# curl -u test:test "http://192.168.10.20:8080/job/test-job/1/timestamps/?time=HH:mm:ss&appendLog" -o test-job.log
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
121   242    0   242    0     0   1172      0 --:--:-- --:--:-- --:--:--  1174
```

## 注意点
これに対応しているのが、Timestamper 1.8.0からなので、それより新しいバージョンでないと使えません。

## 参考
- Timestamper - Jenkins - Jenkins Wiki
https://wiki.jenkins-ci.org/display/JENKINS/Timestamper
Facebook Messanger Platform ver 1.3　変更点まとめ

#概要
ついにやってきましたバージョンアップ。マイナーアップデートながら、新しい形式のメッセージが送れるようになったり、メッセンジャーへのリンクにパラメーターを埋め込めるようになったりと盛りだくさんの内容となっています。
[公式ブログ](https://messengerblog.com/platform-updates/introducing-messenger-platform-v1-3-and-new-ways-to-drive-the-conversation/)で発表された内容を簡単にまとめたいと思います。

# 1.　メッセンジャーへのリンクにパラメータを埋め込み可能に
今までどのチャネルから自分たちが運営しているメッセンジャーへ流入したかわかりませんでした。今回のバージョンアップにより、**どのチャネルが一番有効に機能しているのか、機能していないのかわかる**ようになりました。

それだけではく、**パラメーターによってチャットボットの反応を変えること**ができるようになります。例えば、キャンペーン特設サイトに訪れた人々には特別にクーポンを配ったり、お問い合わせフォームからやってきた人にはいきなり問い合わせのための選択肢を提示してあげたりなど、ユーザーに最適なメッセージの送付ができるようになりました。

[参考動画](https://videos.files.wordpress.com/Aie8aecP/02-m-me-params_deep-linked_dvd.mp4) 公式ブログから引用

# 2.縦型のリストボックスメッセージ送付が可能に
従来には横型カルーセル上のメッセージが送れるようになっていましたが、一度に選択肢をざっと見ることは少し苦手でした。今回の縦型のメッセージにより、商品をザット並べたり、オススメの商品を目立たせたりすることが可能になりました。(画像は公式ブログから引用)
![15009340_357972421204990_6632199180343312384_n.png](https://qiita-image-store.s3.amazonaws.com/0/78362/463fa819-e374-f7a3-204c-cdb56786af0d.png)


# 3.チェックボックスプラグインが利用可能に
![15011737_703346206470657_206140859496792064_n.png](https://qiita-image-store.s3.amazonaws.com/0/78362/d9cf2230-aeb8-6c40-0e54-b1aa700dc42a.png)

既存のお問い合わせフォームやログイン、新規登録フォームに**メッセンジャーから連絡を送っても大丈夫か聴けるチェックボックスプラグインが追加されました**。これにより、楽天市場で商品を購入する際にメール配信を希望するか聴けるように、メッセンジャーで今後の連絡をしていいかという事を聴けるようになりました。

[ドキュメント](https://developers.facebook.com/docs/messenger-platform/plugin-reference/checkbox-plugin)を見た限り、Facebook Javascript　SDKが必要になって、ユーザーが確認ボタンを押したらイベントが発生して、コールバック先に必要なデータがポストされるようになっていました。


# 4. ページのメッセージタブにどのチャットボットが追加されているか確認可能に
Facebook作成のボット管理機能ではない、サードパーティーのチャットボット管理機能でできたチャットボットは今まで公式ページではトラッキングできていませんでしたが、可能になりました。


# 5. ペイパル、ストライプ以外の決済サービスが利用可能に(米国のみ)
従来では、ペイパルやストライプといったFacebook側が指定した決済サービスのみしかチャットボット提供者は利用できませんでしたが、選ばれた開発者は**他の決済サービスが選択可能になりました**。サービス利用者が決済した際には、一度Facebook上の安全なバーチャルなカードに蓄積され、後から引き落とすという形になるそうです。まだ日本では決済機能が導入されていませんが、どんどんアメリカでは決済システムの開発が進んでいそうです。


#まとめ
Facebookのメッセンジャープラットフォームの開発がどんどん進んでいく中で、なかなかLINEのチャットボットの開発スピードが上がっていません。10月中に詳細を発表すると言っていた賞金1000万円のコンテストもまだ詳しく発表されていませんし、Facebookの開発者コミュニティーのようにLINEの開発コミュニティーが盛り上がっているようにも見えません。
どれだけオープンかつ様々な機能が用意されたプラットフォームにするかが鍵になりそうです。

#APOLO(みんなの音楽コンシェルジュについて)
実は自分もチャットボット開発に取り組んでいて、先日サービスとしてリリースいたしました。

サービス名はAPOLOで、キャッチコピーは「みんなの音楽コンシェルジュ」です。

<img width="800" alt="icon_facebook.png" src="https://qiita-image-store.s3.amazonaws.com/0/78362/768cfd00-dcc4-f8b3-5f8a-40ffd6ead236.png">

公式キャラクターのポアルンと話しながら、音楽が探せて聞けるというサービスになっています。
![poarunicon.png](https://qiita-image-store.s3.amazonaws.com/0/78362/37da9215-ed6b-3ad4-c5fb-12706b10c987.png)


【APOLOのここがすごい!!】
①**ダウンロード不要。友達追加するだけ。**
APOLOはスマホで使えるアプリではなく、LINEで使えるチャットボットです。
是非ともLINEの検索窓から友達を検索するように、APOLOを検索してみてください。

②**ポアルン(APOLOの公式キャラクター)が言葉を読み取って、その時の気分に合った音楽をレコメンド。**
独自のアルゴリズムにより、ポアルンにオススメを聞くボタンがあるのですが、そこを押してポアルンにその時の気分を伝えるとその気分に合った音楽が帰ってきます。
今までにない体験をしてみてください。

③**グループで音楽をオススメし合える。**
グループ内にAPOLOを追加してもらえればみんなでポアルンとの会話を楽しみながら、音楽をオススメし合えます。
この曲いいんだよ！！とかこの曲最高！！という調子でぜひみんなで音楽を聴く体験をしてもらえればと思います。
まだまだなので温かい目で見てもらえると。。。


HP:http://apolochat.com/
LINE:https://line.me/R/ti/p/%40urm8576z

LINEの検索窓で「@apolo」と検索してもらえると、すぐに友達追加できて利用することができますので、ぜひとも使ってみてください。
Markdownの使い方

## Markdownとは
書きやすくて読みやすい記述方式で、文章をHTMLに変換してくれる


## ブロック
タブでコードをブロックできる

```
(tab)
こんにちは
```

結果
>	
	こんにちは

シングルクウォート×3、チルダ×3でもブロック記法できる

ブロックにファイル名をつけることもできる

	
	```.rbenv
	echo $http_proxy
	```


結果

>```.rbenv
echo $http_proxy
```



## 引用
```
> こんにちは、小川です。
> いい天気ですね。
>> やー
```

結果
> こんにちは、小川です。
> いい天気ですね。
>> やー


## コード
シングルクウォートで囲むとコード表示

```
インストールコマンドは`gem install hoge`です
```

結果
>インストールコマンドは`gem install hoge`です


## 見出し
\#(ハッシュ)の数と見出しのレベルが一致する

```
# 見出し1
## 見出し2
### 見出し3
```

結果
># 見出し1
>## 見出し2
>### 見出し3 


## 箇条書きリスト
-(ハイフン)、+(プラス)、*(アスタリスク)のいずれかで箇条書きリストを記述

```
- リスト1
	- リスト1-1
	- リスト1-2
- リスト2
- リスト3
```
結果
>- リスト1
	- リスト1-1
	- リスト1-2
		- リスト1-2-1
- リスト2
- リスト3


## 番号付きリスト

```
1. list1
2. list2
3. list3
```  
結果
>1. list1
2. list2
3. list3


##段落と改行
半角スペース2つ以上入れると改行される

```
文章1（半角スペース2つ）  
文章2
文章3
```
結果
>文章1  
文章2
文章3

##強調
*(アスタリスク)で強調したい部分を囲む

```
文章1 **文章2** 文章3
```
結果
>文章1 **文章2** 文章3


## 水平線
_(アンダーバー)、*(アスタリスク)、-(ハイフン)のどれかを3つ以上連続させる

```
***
____
- - - - - - - - -
```

結果
>***
____
- - - - - - - - -


## リンク
\[表示文字](リンクURL)でリンクを記述できる

```
[Google](https://www.google.co.jp/)
```
結果
>[Google](https://www.google.co.jp/)

同じリンクの参照を繰り返す場合は、リンク先への参照を定義することができる。

```
[Google](1)
文章1
[Google](1)
文章2
[Google](1)
[1]:http://google.com/ "Google"
```

結果
>[Google](1)
文章1
[Google](1)
文章2
[Google](1)
[1]:http://google.com/ "Google"


## テーブル
```
| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |
```

結果

>| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |


## 画像の挿入
```
![タイトル](画像のURL)
```

画像のサイズを指定できる

```
![　](URL =100x100)
![　](URL =100x)
![　](URL =x100)
```

## チェックボックス
```
- [] マグロ
- [] コハダ
- [x] エンガワ
```

結果
- [ ] マグロ
- [ ] コハダ
- [x] エンガワ


## はてなブログでの画像のサイズ変更
:w300とつける
[f:id:xxxx:2015yyyyyyy:plain:w300]

## 特殊記号を普通の文字として使う
特殊記号の直前に`\`を付加すれば普通の文字として扱うことができる。
\を表現したいときは`\\`とする。
Eclipse PDTが9000番ポートをListenしてしまうのをやめさせる

PHP開発をするのに Eclipse (Neon.1a 4.6.1) を入れて PDT (4.1.0) を入れて使い始めようとしたら、
別で9000/tcpを使うツールが起動しなくなってしまった。

9000/tcpはxdebugがデフォルトで使う設定になっていたので、
Preferencesからそのポートを9100に変更し、php側のxdebug.remote_portも揃えて変えて
PHPのデバッグが出来る事は確認したが、相変わらず別なツールの方が起動しない。

netstatを見たところ、javaが9100/tcpと9000/tcpの両方をListenしていた。なんじゃこりゃ。

ツールの方のポートを変える事もできないことはないが、無駄にListenされているのが気持ち悪い。

ホームディレクトリ内のeclipse絡みのファイルを調べたところ、
ようやくこれ絡みのファイルを見つけ、直す事ができた。

直すファイルはこれ。

```plaintext:(workspace)/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.php.debug.core.prefs
eclipse.preferences.version=1
org.eclipse.php.debug.core.xdebugDebuggerSettingsProvider=<settings><proxyEnable>false</proxyEnable>
<clientPort>9000</clientPort>　　　　　★★★←本当は一行になっているけどここ★★★
<ownerId>php-server-d6070fba-d4fd-40c2-8c36-5c2435d46eed</ownerId><proxyIdeKey>ECLIPSE_DBGP_xxx</proxyIdeKey><proxyAddress></proxyAddress></settings>
org.eclipse.php.debug.core.xdebug_arrayDepth=3
org.eclipse.php.debug.core.xdebug_capturestderr=1
org.eclipse.php.debug.core.xdebug_capturestdout=1
org.eclipse.php.debug.core.xdebug_children=51
org.eclipse.php.debug.core.xdebug_data=1024
org.eclipse.php.debug.core.xdebug_idekey=
org.eclipse.php.debug.core.xdebug_multisession=true
org.eclipse.php.debug.core.xdebug_port=9100　　　　★★★←ここは設定ダイアログで変更される★★★
org.eclipse.php.debug.core.xdebug_proxy=
org.eclipse.php.debug.core.xdebug_remotesession=1
org.eclipse.php.debug.core.xdebug_showSuperGlobals=true
org.eclipse.php.debug.core.xdebug_useproxy=false
（以下略）
```

`org.eclipse.php.debug.core.xdebugDebuggerSettingsProvider`の値の`<clientPort>`の値を
揃えて9100にしたところ、期待通り9100/tcpだけListenされるようになってくれた。
Cognos BI でのバックアップ対象

Cognos BIもシステムなので、障害時にはリストア復旧が必要です。

日頃、どんなものをバックアップ取っておくべきなのか、というのを経験上からまとめました。

■ マニュアルでの情報

【InfoCenter：Back Up Data】
http://publib.boulder.ibm.com/infocenter/cbi/v10r1m0/index.jsp?topic=%2Fcom.ibm.swg.im.cognos.ug_cra.10.1.0.doc%2Fug_cra_id14269BackUpData.html

※この中では、以下がバックアップ対象としてガイドされています。
・Content Store
・ReportServer/ContentManagerの<CognosInstallPath>/configurationディレクトリ
・Framework Managerのプロジェクトディレクトリ (配置場所は任意)


■ ReportServerでのバックアップの対象となる事が多いもの。

　① <CognosInstallPath>/configurationディレクトリ

　② レポートに使用しているImageファイル(gif,jpgなど) ⇒ ゲートウェイ上に存在。ディレクトリは任意。ただしWebServerで設定されたパス。

　【Web サーバーの設定】
http://publib.boulder.ibm.com/infocenter/c8bi/v8r4m0/index.jsp?topic=/com.ibm.swg.im.cognos.inst_cr_winux.8.4.1.doc/inst_cr_winux_id6024ConfigureaWebServer.html

　③ JavaScriptを使用している場合、そのプログラムファイル（*.js） ⇒ ディレクトリは任意

　④ SDKを使用している場合、そのプログラムファイル（*.java, *.classなど） ⇒ ディレクトリは任意

　⑤ PowerCubeを使用している場合、Cubeファイル（*.mdc） ⇒ ディレクトリは任意


■ バックアップ対象となる可能性が考えられるもの。
※以下の全ファイルを取得が必要というわけではなく、明示的に変更しているファイルを取得。

　① system.xmlファイル（カスタマイズしている場合）⇒ <CognosInstallPath>/templates 以下の層に複数

　② cogdm*.iniファイル（カスタマイズしている場合）⇒ <CognosInstallPath>/bin

　③ *.cssファイル（カスタマイズしている場合）⇒ ファイルにより任意。よく使用されるものは以下。

　　　・<CognosInstallPath>/webcontent/skins/＜スタイル＞/portal/default.css

【IBM Cognos Connection の外観の変更】
http://publib.boulder.ibm.com/infocenter/c8bi/v8r4m0/index.jsp?topic=/com.ibm.swg.im.cognos.ug_cra.8.4.1.doc/ug_cra_i_ModifyingtheCognosConnectionStyleSheet.html

・GlobalReportStyles.css ⇒ <CognosInstallPath>以下の複数箇所。

【IBM Cognos 8 のスタイル シートの全体的な変更】
http://publib.boulder.ibm.com/infocenter/c8bi/v8r4m0/index.jsp?topic=/com.ibm.swg.im.cognos.ug_cra.8.4.1.doc/ug_cra_i_style_sheet.html



その他、環境・要件によっては以下の項目もバックアップ対象としてご検討ください。

・ Metric Managerを使用している場合、Metrics Store DB

　・ 監査用DBを構成している場合、そのデータベース

・ Transformer使用時のモデルファイル（.mdl、.pyi） ⇒ ディレクトリは任意

　・ IHSやWASなどM/Wのバックアップに関しては、各製品のガイドに従ってください。

・ 運用/メンテナンス用のスクリプト

・ Cognos 10 でDynamic Query Modeを使用している場合、<CognosInstallPath>/log/XQE

・ Cognos 10 でAnnotation Service や Human Task Servicesで専用のDBを使用している場合そのデータベース

参考：データベースによるバックアップを選択しない場合は、こちらの配布ツールによるバックアップになります。
http://publib.boulder.ibm.com/infocenter/cbi/v10r1m1/topic/com.ibm.swg.ba.cognos.ug_cra.10.1.1.doc/t_deployhumantaskandannotation.html#DeployHumanTaskAndAnnotation
【Unity】ScriptからuGUIのTextにアクセスして内容を変更する

# 経緯
Unity3DでScore情報などを画面に2Dで出すuGUIを操作中、Text(自分)の文字をScriptから取得して変更しようとしてもなかなかうまくいかなかった。
超初歩的な内容だが、**インターネットにuGUI以前のUnityGUIに関する情報が混在している**ことや、**自身の間違った推測**、ましてや自分がUnity自体初心者なため**ScriptとUnityとの関係性やつなぎ方**が分かっておらず、かなりはまってしまったので、備忘録と、もしかしたらいるかもしれない第二の自分のために。

#方法
##事前準備
1. 「Hierarchy -> Create -> UI -> Text」でCanvas/TextをHierarchyに追加
2. 「Project -> Assets」で右クリックをして「Create -> C# Script」でNewBehaviourScriptを作成して適当にリネーム
3. 「Hierarchy -> Canvas/Text」にさっき作ったC# ScriptをAdd Compornent

##追加する記述
```csharp:
using UnityEngine;
using System.Collections;
using UnityEngine.UI; // <---- 追加1

public class ***: MonoBehaviour
{
	private Text targetText; // <---- 追加2

	void hoge(){

		this.targetText = this.GetComponent<Text>(); // <---- 追加3
		this.targetText.text = "ChangeText"; // <---- 追加4

```

#ポイント
**1.  using UnityEngine.UI; //<---- 追加1**
まずはまったポイントがコレ。UnityEngine.UIを追加し忘れていた。
追加し忘れていたというか、てっきり自分は1行目の

```
using UnityEngine;
```
でUnityEngine配下と思われるUnityEngine.UIも利用できるようになっているのかと思ってしまったが、別途UnityEngine.UIをusingで指定する必要があった。これがないと、追加2でエラーが出る。

**2.  private Text targetText; //<---- 追加2**
privateでText型のtextを宣言している。追加1でUnityEngine.UIを追加していないと、そもそもこの「Text」って何？というエラーが出る。

**3.  this.targetText = this.GetComponent\<Text>(); //<---- 追加3**
自身のComponent「Text」の値をとってくる、というもの。これがないとどのText(Component)を変更するのかをscriptから判断できない。ちなみにUnityのUI上でここを指定することもできる。その場合はこの記述はいらない(補足1)。

**4.  this.targetText.text = "ChangeText"; //<---- 追加4**
Textクラスのフィールド「text」に値を代入する。


#補足
**補足1 this.targetText.GetComponent\<Text>();を使わず、UnityのUI上で済ましてしまうやり方**
Script上の「private Text targetText」のアクセス修飾子をpublicに変更することで、Unityの
「Hierarchy -> Canvas/Text」選択時の
「Inspector ->***(Add ComponentしたC# script) -> Text」の項目が
「None (Text)」となっていることがわかる。

ここに、
「Hierarchy -> Canvas/Text」
をドラッグ&ドロップすると、Unity UI上でscriptの
「public Text targetText」に「Hierarchy -> Canvas/Text」がアタッチされ、移行targetTextはアタッチしたCanvas/Textを参照するようになる。

こうすれば、上記の

```
this.targetText.text = this.GetComponent\<Text>();
```
は不要になる。

**補足2 上記scriptを「Canvas/Text」ではなく「Canvas」にAddComponentしたら動かない**
ちなみに、上記scriptをCanvas自身にAddComponentしたらこのコードは動かない。
理由は

```
this.targetText.text = this.GetComponent\<Text>(); //追加3
```
の「this.」がCanvas自身になってしまい、Canvas自身にはTextがないので動かない。
この場合、取得したいTextは子要素になるため、

```
GameObject child = transform.Find("Text").gameObject;
this.targetText.text = child.GetComponent\<Text>();
```
とすることで、子要素を取得し、その子要素にAddされているComponent\<Text>を取得することもできる。

しかし、個別のText等のコンポーネントにいちいちScriptをAddComponentしていくのは非現実的なのと、子要素の名前を指定して取得するケースはGameObjectの構成を変更した途端に全て修正する必要ができてしまう。
そのため、例外的に対応する以外は、やはり大元となるGameObjectにControllerのようなclassを用意し、多数ある子GameObjectをpublicにしてUnity上からアタッチするほうがよいと思われる。

###おわりに
何かご指摘やもっと良い方法等がありましたらコメントお願いします！
Cognos BI でデータ量の制限をする方法

Cognos BI でデータ量の制限をする方法をまとめました。

データ量の制限とは、Cognosのレポートを実行するとクエリーがデータベースに投げられて処理されますが、結果セットが何万行とかなると、CognosがCPUやMemoryリソースを大量に消費してしまい、全体のスローダウンにつながるので、その前にさっさとエラーにしてしまうための設定です。

CQM(Compatible Query Mode)とDQM(Dynamic Query Mode)で違うので、以下に記載します。


**CQMの場合**

Framework Managerのメニューで、「プロジェクト」→「ガバナーを編集」で表示される、以下の2項目で制限をかける事ができます。
特に使うのは、「取得した行の最大数」「クエリー実行時間の上限」ですかね。
これはパッケージ単位に設定する事ができる事になります。
![CQM.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/afbe1cec-04a8-1f8e-b2d5-610e2edd8159.png)


**DQMの場合**
DQMの場合は、上記のガバナーの設定は効かないので、こちらのTechnoteの設定が必要です。
これはQuery Service単位の設定なので、ディスパッチャー全体への設定になりますね。

【Preventing large queries from exceeding memory capacity by specifying a tuple limit】
 http://www.ibm.com/support/docview.wss?uid=swg21691156

Query Service の advanced setting に qsMaxCrossjoinOrderOfMagnitude と数値を設定します。
数値は0～10の間を指定のようですが、検証した限り、小数でも良いようです。
この数値は、結果セットのTuple(セルのようなイメージ)の制限値を、10のべき乗で制限されます。
例えば、6に設定した場合、10の6乗なので、1,000,000個のTupleの制限となります。

Tupleの指定ですが、DMRのパッケージだけでなく、Relationalのパッケージでも使用できます。

#Cognos Analytics 11 でのデータ量制限
Cognos Analytics 11に関しては、こちらをご参照下さい。

**Cognos Analytics 11 でのデータ量制限設定の動作**
https://qiita.com/shinyama/items/fcf7682687df00bbb96d
# Erlangのトレースツールttbを使ってみる

実行時のトレース結果を見ていると特定の関数が目立って呼ばれているとか、処理の流れを俯瞰できたりと役に立ちましたので紹介します。
Erlang 19.1で動作確認しています。  

## 準備

トレースするプログラムを用意します。

```erlang:calc.erl
-module(calc).

-export([inc/1]).
-export([add/2]).

inc(A) -> add(A, 1).
add(A, B) -> A + B.
```

トレース処理はやや煩雑ですので便利関数を用意します。
また出力を見やすく整形します。

```erlang:util.erl
-module(util).

-export([start/1]).
-export([stop/0]).

%% see http://erlang.org/doc/apps/observer/ttb_ug.html
%% see http://erlang.org/doc/man/dbg.html

start(Mods) ->
    ttb:tracer(),
    ttb:p(all, call),
    lists:foreach(fun(Mod) -> ttb:tp(Mod, caller) end, Mods).

stop() ->
    {stopped, Dir} = ttb:stop(return_fetch_dir),
    ttb:format(Dir, {handler, {fun show/4, []}}).

%% private
show(_Fd, Trace, _TraceInfo, State) ->
    case Trace of
    {_, _, _, {M1, F1, A1}, {M2, F2, A2Length}, TimeStamp} ->
        {_, _, MicroSec} = TimeStamp,
        {{Y, M, D}, {HH, MM, SS}} = calendar:now_to_universal_time(TimeStamp),
        io:format("time:~p/~p/~p ~p:~p:~p:~p\tfrom:~p:~p/~p\tto:~p:~p/~p~n", [Y, M, D, HH, MM, SS, MicroSec / 1000.0, M2, F2, A2Length, M1, F1, length(A1)]);
    _ ->
        io:format("unknown ~p~n", [Trace])
    end,
    State.
```

## 動作デモ
```txt
% erl
Erlang/OTP 19 [erts-8.1] [source] [64-bit] [smp:4:4] [async-threads:10] [kernel-poll:false]

Eshell V8.1  (abort with ^G)

# コンパイル
1> c(calc).
{ok,calc}
2> c(util).
{ok,util}

# トレース開始
3> util:start([calc]).
ok

# トレース対象の処理を実行
4> calc:inc(1).
2
5> calc:add(1, 2).
3

# トレース終了、結果表示
6> util:stop().
Stored logs in /home/tadokoro/git/erlang_ttb/ttb_upload_ttb-20161109-185813
time:2016/11/9 9:58:13:949.357  from:erl_eval:do_apply/6        to:calc:inc/1
time:2016/11/9 9:58:13:949.717  from:erl_eval:do_apply/6        to:calc:add/2
unknown end_of_trace
ok
```

## トレースの流れ
1. 最初に ttb:tracer() します
2. ttb:p(all, call) 等としてトレース対象を決めます。callの他にはsend, receive, messageなど色々。詳細は[dbg](http://erlang.org/doc/man/dbg.html)のp(Items, Flags)
3. ttb:tp(Mod, caller) 等としてトレースを有効化するモジュール、トレース位置(呼び出し時か、戻り時か)を決めます。詳細は[ttb](http://erlang.org/doc/man/ttb.html)
4. トレースしたい処理を実行します
5. {stopped, Dir} = ttb:stop(return_fetch_dir) 等としてトレースを止めて、ログ保存先を取得
6. ttb:format(Dir) とするとトレース結果が表示されます。出力フォーマットを変えたい場合は ttb:format(Dir, {handler, {fun show/4, []}}) 等としてフォーマット関数(この例ではshow)を指定します。詳細は[ttb](http://erlang.org/doc/man/ttb.htm)

## 備考
トレース実行後は以下のようなファイルが自動で作成されます

```txt
ttb_last_config
ttb_upload_ttb-20161109-184359/
├── nonode@nohost-ttb
└── nonode@nohost-ttb.ti
```

ttbが使えるはずなのに、rebar3でビルド後に「exception error: undefined function ttb:tracer/0」などと表示される場合は、rebar.configのrelxのdepへobserverを追加すると良です  
エラーが消えてttbが使えるようになります

## まとめ
rubyのtracerに似たものがErlangにもないかと調べたところ、ttbが見つかったので使ってみました。
linux / sed / bash > ファイル名を変更 + 内容変更 > 同じルールで > bashスクリプト

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
GNU sed version 4.2.1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
```

### やりたいこと

```
$ cat AA_201611 
20161101,3.141592
20161102,3.141592
20161103,3.141592
```

```
$ cat BB_201611 
20161101,2.718281
20161102,2.718281
20161103,2.718281
```

上記のようなファイルが30個程度ある。
201611は2016年11月を示す。
これらのファイルを2017年12月用に変更したい。

以下の変更をする

- ファイル名の変更
   - 例: AA_201611をAA_201712に
- ファイル内容の変更
   - 例: 201611を201712に

つまり、変更ルールは「ファイル名変更」「ファイル内容変更」ともに同じルール。

### bashスクリプト

```replace_exec
#!/usr/bin/env bash

fmt='s/201611/201712/g' ## change this

mkdir OLD

for oldfile in $(ls *_201611);do ## change this
#	echo $oldfile
	newfile=$(echo $oldfile | sed $fmt)
	echo $newfile
	sed $fmt $oldfile > $newfile
	mv $oldfile OLD/
done
```

```txt:実行
$ bash replace_exec 
AA_201712
BB_201712
```

以下のように変更できた。これでSublime Textで一括置換 x N回の作業はしなくていい。

```
$ cat AA_201712 
20171201,3.141592
20171202,3.141592
20171203,3.141592
```

```
$ cat BB_201712 
20171201,2.718281
20171202,2.718281
20171203,2.718281
```

注意点としては、置換の文字列が本当にユニークなものかどうか。
ファイル内容に無関係の数値があり、そこに201611などがあれば余計な置換をしてしまう。

## v0.2 置換行数の表示

diffを使って置換した行数+アルファを表示するようにした。

```replace_exec
#!/usr/bin/env bash

fmt='s/201611/201712/g' ## change this

mkdir OLD

for oldfile in $(ls *_201611);do ## change this
#	echo $oldfile
	newfile=$(echo $oldfile | sed $fmt)
	echo $newfile
	sed $fmt $oldfile > $newfile
	diff $oldfile $newfile | wc
	mv $oldfile OLD/
done
```

```txt:結果
$ bash replace_exec 
AA_201712
      8      14     132
BB_201712
      8      14     132
```

こうしておくと、余計な置換をしたファイルがあればすぐに見つかる。
Cognos BI の一時領域のメンテナンス

Cognos BI の一時領域(Temp領域)のメンテナンスについて、知っている限りの情報をまとめました。

この領域のファイルは、セッション終了後やCognos BI再起動時に削除されるはずなのですが、実際の環境では色々とファイルが残ってしまい容量を圧迫する事があるので、メンテナンスが必須になります。

基本的には、Cognos BIの停止のタイミングでTempフォルダ配下を全て削除頂ければ問題ないですが、とオンラインで削除可能、オフライン必須などあるようなので、まとめました。
※Tempフォルダのcbs.prefsファイルを削除すると、Cognosが起動できなくなるという事例もありますので、cbs.prefsファイルは削除しない事が無難です。
※以下のTechnoteによると、cbs.prefsの削除が問題となるのは、Tomcat/Oracle Sun JRE環境でのみ発生するとの事です。
https://www.ibm.com/support/pages/temp%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E4%B8%8B%E3%81%AE%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%89%8A%E9%99%A4%E5%BE%8C%E3%80%81cognos-10%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E3%81%8C%E8%B5%B7%E5%8B%95%E3%81%97%E3%81%AA%E3%81%84

**Cognosでレポート実行エラーに出くわした時に最後にやって欲しい事**
https://qiita.com/shinyama/items/0b051f8fe0b473f31dc1

【Can temp files be deleted】
http://www-01.ibm.com/support/docview.wss?uid=swg21340266


<c10_64>/temp/vmm* について

以下のTechnoteをご参照ください。
巨大な結果セットのレポートを実行した時に、メモリーからあふれたデータを保持するバーチャルメモリーのような領域になります。

【Large vmm* files created in the report server temp directory】
http://www-01.ibm.com/support/docview.wss?uid=swg21666987

ファイル消去に関しては、現時点で実行されているレポートがこの領域を使っているとエラーになるが、使っているレポートが無ければ削除しても良い、になります。
また、ディスパッチャーを再起動すると、これらのファイルは削除されるはずです。


<c10_64>/temp/XQE/xqe_FileBasedPersistedResultSet_*.tmp
<c10_64>/temp/XQE/xqe_ScrollableTabularCache_*.cache
<c10_64>/temp/XQE/xqe_TabularCacheIterator_*.cache
について

上記のファイルに関しては、DQMで生成されるファイルで、レポート実行時に取り扱われるデータ容量によりサイズが大きくなります。
これらのファイルは、Cognosがクラッシュした時に残ってしまう事があり、削除にはCognosの停止が推奨されています。


<c10_64>/data/mfw4j/PMCs/ (以下ディレクトリ) 
について

以下のTechnoteの記載より、ディメンションのメタデータをキャッシュしている領域のようです。

 【Unable to see change in Analysis Studio after RefreshMDXHierarchy in TM1】
http://www-01.ibm.com/support/docview.wss?uid=swg21620942

消去をする際は、Cognosの停止が必須の領域となります。

<2018/6/5 追記>
一時領域上に作成されるファイルに関して、以下のようなTechnoteもありますので、リンクを置いておきます。

UDA*ファイル、CCLVPageファイル、dmbTempxxxxx.dmcファイル、Axisxxxaxisファイルに関する記述があります。
**What are the files and directories located in the ../cognos/temp directory used for ?**
http://www-01.ibm.com/support/docview.wss?uid=swg21338680

UDAファイルに関する記載が詳細に述べられています。
**What are UDA Temp Files?**
http://www-01.ibm.com/support/docview.wss?uid=swg21358858

# Cognos Analyticsでの考慮事項(2022/3/14 追記)
こちらのようなTechnoteがリリースされています。
**Cleaning temporary Java workarea in Cognos Analytics**
https://www.ibm.com/support/pages/cleaning-temporary-java-workarea-cognos-analytics

以下も削除対象として認識のUpdateが必要ですね。
```html
<cognos_home>\wlp\usr\servers\dataset-service\workarea\*
<cognos_home>\wlp\usr\servers\cognosserver\workarea\*
<cognos_home>\javasharedresources\*
```
既に作成したテーブルにカラムを追加する


```
¥ rails g migration クラス名 カラム名:データ型
```

クラス名には、以下みたいにすると良いみたい

- 追加する場合：`AddXXXToYYY`
- 削除する場合：`RemoveXXXToYYY`

```
$ bin/rails generate migration AddPartNumberToProducts part_number:string
```

`AddPartNumberToProducts`がクラス名になって、`part_number:string`がカラム名と型です。


詳細は、Ruby on Rails ガイドで。
[2.1 単独のマイグレーションを作成する](http://railsguides.jp/active_record_migrations.html#%E5%8D%98%E7%8B%AC%E3%81%AE%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)
「Movable Type 6.3 より前のバージョンでは、MySQL5.6 / 5.7 では、sql_mode が 初期状態では動作しません」とはどういうことなのか

Movable Type 6のドキュメントの「[注意事項、制限事項と既知の問題点](https://www.movabletype.jp/documentation/mt6/restrict/)」の「既知の問題」部分に以下の記述があります。

> Movable Type 6.3 より前のバージョンでは、MySQL5.6 / 5.7 では、sql_mode が 初期状態では動作しません。

いまいちはっきりとしない書き方ですが、これはMySQL5.6以降で``sql_mode``の初期値に``STRICT_TRANS_TABLES``が設定されるようになったため、SQLモード[^1]が厳密モードになっているMySQLでは動かないということを示しています。なのですが、普通にMovable Typeの管理画面を使用していると特にエラーになるような機能などは無く、普通に使えてしまいます。

が、遂にこれが原因であろうエラーに遭遇しました。
Data APIを使ってカスタムフィールドの存在するエントリーを追加すると以下のエラーが発生します。

> Failed to execute INSERT INTO mt_entry_meta
(entry_meta_entry_id, entry_meta_type, entry_meta_vchar, entry_meta_vchar_idx, entry_meta_vdatetime, entry_meta_vdatetime_idx, entry_meta_vinteger, entry_meta_vinteger_idx, entry_meta_vfloat, entry_meta_vfloat_idx, entry_meta_vblob, entry_meta_vclob)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
 with entry_id, type, vchar, vchar_idx, vdatetime, vdatetime_idx, vinteger, vinteger_idx, vfloat, vfloat_idx, vblob, vclob: DBD::mysql::st execute failed: Incorrect integer value: '' for column 'entry_meta_vinteger_idx' at row 1 at /var/www/htdocs/extlib/Data/ObjectDriver/Driver/DBI.pm line 396.

``entry_meta_vinteger_idx``カラムの型は``int(11)``で、そこに``''``を入れようとしていますが、空文字列を数値に変換できずにエラーになっているようです。

``mt_entry_meta``テーブルはカスタムフィールドの値などを保存するためのテーブルです。MTのmeta系のテーブルは何でも保存できるテーブルとして設計されていて、``entry_meta_type``に保存する値の種類を入れ、保存したい値の型ごとにカラムが用意されているという構造になっています。``entry_meta_vinteger_idx``カラムは整数型の値用のインデックスの張られたカラムです。このような構造なので種類によって使わないカラムが出てくるわけですが、そのようなカラムには``NULL``が入るようです。つまり``NULL``を入れようとして``''``を指定しているのではないかと思われます。エラーが起こるカラムが``entry_meta_vinteger_idx``なのは``INSERT``文に指定されたカラムのうち、最初の文字列形以外のカラムだからということですね。

ということで、Movable Type 6.3 より前のバージョンでSQLモードが厳密モードになっているMySQLを使うと、数値を保存するタイプ以外のカスタムフィールドがあるとData APIでエントリーが作成できないのでした。


[^1]: [MySQL 5.6 リファレンスマニュアル: 5.1.7 サーバー SQL モード](https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html)