OmniAICreator/Qiita-1.07M huggingface dataset:
Dockerfileを書いてみる

# やること

Docker fileの書き方、仕組みを理解する。
[Dockerを0から勉強する](http://qiita.com/nl0_blu/items/07e5047041ebe009dd06)
ではDockerfileを使わない方法を記載しています。

##流れ(イメージ)
※2017/5/4 図の間違えを修正
![Dockerfile図.png](https://qiita-image-store.s3.amazonaws.com/0/161771/acb79a98-68a8-8594-0d5a-7d6af287841a.png)



##開発環境

* Vitualbox(5.1.0)
* Vagrant(1.9.1)
* Docker(1.13.1)
* Ubuntu(16.04)
* CentOS7  

##1. Dockerfileの作成

```
$ vim Dockerfile
```

```Dockerfile
# どのイメージを基にするか
FROM centos
# 作成したユーザの情報
LABEL maintainer="Admin <admin@admin.com>"
# RUN: docker buildするときに実行される
RUN echo "now building..."
# CMD: docker runするときに実行される
CMD echo "now running..."
```

Dockerfileをビルドして"admin/echo"イメージの作成  
-t : ビルド成功後メッセージ表示

```
$ sudo docker build -t admin/echo .
```

"admin/echo"イメージからコンテナの作成

```
$ sudo docker run admin/echo
```

##2. webサーバの立ち上げと編集の流れ

###①webサーバの立ち上げ

```
$ vim Dockerfile
```
```Dockerfile
# どのイメージを基にするか
FROM centos
MAINTAINER Admin <admin@admin.com>
# RUN: buildするときに実行される
# RUN echo "now building..."
# CMD: runするときに実行される
CMD echo "now running..."

# httpdのインストール
RUN yum install -y httpd
# ホストのindex.htmlをImage内にコピー
ADD ./index.html /var/www/html/
#ポート80を開ける
EXPOSE 80
#runした時にapache起動
CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
```

ホスト側のポートの8080番をコンテナ側の80番にリダイレクト

```
sudo docker run -p 8080:80 -d admin/httpd
```

ブラウザ上でホストの「ipアドレス:8080」にアクセス

-->表示されればOK

###②編集して再度イメージを作る

実行しているプロセスを切る

```
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMES
b34ac75ca77d        admin/httpd         "/usr/sbin/httpd -..."   48 seconds ago      Up 48 seconds       0.0.0.0:8080->80/tcp   loving_booth

$ sudo docker kill b34
```

適当に編集してみる

```
[直接編集]
$ sudo docker run -i -t admin/httpd /bin/bash
$ exit
[index.htmlの編集]
$ vim index.html
[etc.....]
```

編集後、イメージを更新する

```
$ sudo docker build -t admin/httpd .
```


コンテナを再度、作って動作確認

```
$ sudo docker run -p 8080:80 -d admin/httpd
```

##3. イメージをDocker hubにプッシュする

Docker hubにsign upより登録しておく
[https://hub.docker.com](https://hub.docker.com)

loginする(ユーザ名など聞かれる)

```
sudo docker login
```

pushする

```
sudo docker push admin/httpd
```

Docker hubにログインして、Repositoriesのところにadmin/httpdがあればOK

これをpullしたい時は

```
$ sudo docker pull admin/httpd
```

をすれば良い
redmineのmarkdown方式のwiki内テーブルで改行を使う

## 対象読者
- とりあえずmarkdown方式のwiki内テーブルで改行を使いたい
- redmine本体のコードを修正できる（していい）方

## 筆者環境
- redmine3.3
- Heroku
 
## 手順

以下のファイルを修正します。
\lib\redmine\wiki_formatting\macros.rb

```ruby:\lib\redmine\wiki_formatting\macros.rb
# Builtin macros
      desc "Sample macro."
```

上記メソッドの下に下記を追加します。

```ruby:\lib\redmine\wiki_formatting\macros.rb
      desc "br."
      macro :br do |obj, args|
        raw "<br>"
      end
```

redmineを再起動。
以上です。

## 使い方
```
|h1 |h2 |
|---|---|
|d1{{br}}d1|d2|
```

|h1 |h2 |
|---|---|
|d1<br>d1|d2|



## 終わりに

本来はプラグインとかで作るところだと思いますが、とりあえず。
メンバの存在を判定する

Swift について、そしてそれをいくつかの言語と比較する興味深い記事が投稿されているのを読みました。

≫ [Swiftの強力な機能であるstaticメソッド制約の紹介と、Kotlin, TypeScript, Java, Scala, C++との比較](http://qiita.com/omochimetaru/items/621f1ef62b9798ee5ff5)

比較対象になっている言語の内で私がよく知っているのは C++ だけなので他の記述は流し読みではあるのですが、ある型の性質を強制する仕組みとして C++ では「コンセプト」という概念がかなり前から検討されています。 (テンプレートが受け入れ可能な型の性質を記述する形で使い、ある型が特定のインターフェイスを満たしていることを表現するものではないという点でプロトコルとは異なるようです。) それがなかなか決定に至らないので、まわりくどい様々なやり方で制約を表現する方法が生み出されてきました。 今回は、あるクラスが特定の名前と型をもつメンバを持っているかどうかを判定する方法を紹介します。

元記事の `IsLoadable` を置き換える形で説明します。 元記事の C++ 版はあるクラスが loadable であるということの表現をふたつに分離しています。

- loadable の要件を満たす (クラスがメンバ関数 `load` を持つ)
- loadable であると定義する (`IsLoadable<T>::value` が真値である)

のふたつです。

この機能を使うプロジェクトできちんと規約を守ることができるならばよいのですが、可能であれば

- loadable の要件を満たすならば loadable である

という形に一本化したいわけです。

それを満たすトレイト `is_loadable` は以下のように定義できます。 

```cpp
template<class T>
class is_loadable {
  template<class U, U (*)(Iterator<std::string>&)>
  struct helper_t { typedef T type; };

  template<class U, class V = T>
  struct helper : std::false_type {};

  template<class U>
  struct helper<U, typename helper_t<U, &U::load>::type> : std::true_type {};

public:
  static const bool value = helper<T>::value;
};
```

クラス `T` が `load` を持ち、なおかつその型が `T (*)(Iterator<std::string>&)` であれば `is_loadable<T>::value` は真です。

クラス `Employee` が loadable であることを陽に表したいのであれば、`Employee` を定義した後に以下の記述を入れておけばよいでしょう。

```cpp
static_assert(is_loadable<Employee>::value, "Employee is not loadable");
```

あるいはマクロにしてしまった方がいいかもしれません。

```cpp
#define declare_loadable(t) \
  static_assert(is_loadable<t>::value, #t " is not loadable")

declare_loadable(Employee);
```

以上は応用範囲の広い手法なので、活用すればできることは多いと思います。
Chef Server インストール@Ubuntu

## ディレクトリの準備
- Chef Serverのdebファイルを格納するディレクトリを準備します。
    - mkdir コマンドで/repo/chef/Paclages というディレクトリを準備。

```
inohana@ino-ubuntu:~$ pwd
/home/inohana

inohana@ino-ubuntu:~$ sudo mkdir /repo/chef
mkdir: cannot create directory ‘/repo/chef’: No such file or directory

inohana@ino-ubuntu:~$ sudo mkdir ./repo
```
- 再帰的にディレクトリを作成する場合には -p オプションをつけます。

```
inohana@ino-ubuntu:~$ sudo mkdir -p ./repo/chef/Packages
```

## Download Chef Server
- 該当のOSのChef Serverを入手。
https://downloads.chef.io/chef-server#ubuntu

- UbuntuのVersionを確認しておき、該当するdebファイルをダウンロードします。

```
inohana@ino-ubuntu:~$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04 LTS"
inohana@ino-ubuntu:~$
```
- ダウンロードしたファイルを作成したディレクトリ配下に置きます。
    - FTP、SCPで何度か転送失敗したのですが、結局理由はUbuntu側に作成したディレクトリの権限が問題でした。
        - その場合には、chmod コマンドで権限を変更します。

```
inohana@ino-ubuntu:~/repo/chef/Packages$ pwd
/home/inohana/repo/chef/Packages
inohana@ino-ubuntu:~/repo/chef/Packages$ ls
chef-server-core_12.13.0-1_amd64.deb
inohana@ino-ubuntu:~/repo/chef/Packages$
```

- dpkg -i コマンドでダウンロードしたファイルをインストールします。

```
inohana@ino-ubuntu:~/repo/chef/Packages$ dpkg -i chef-server-core_12.13.0-1_amd64.deb
dpkg: error: requested operation requires superuser privilege
inohana@ino-ubuntu:~/repo/chef/Packages$ sudo dpkg -i chef-server-core_12.13.0-1
_amd64.deb
sudo: unable to resolve host ino-ubuntu
Selecting previously unselected package chef-server-core.
(Reading database ... 58000 files and directories currently installed.)
Preparing to unpack chef-server-core_12.13.0-1_amd64.deb ...
Unpacking chef-server-core (12.13.0-1) ...
Setting up chef-server-core (12.13.0-1) ...
```

[参考]debパッケージをインストールする
http://itpro.nikkeibp.co.jp/article/COLUMN/20060228/231209/

## Chef Serverの初期設定
- chef-server-ctl reconfigure を実行。

```
inohana@ino-ubuntu:~/repo/chef/Packages$ sudo chef-server-ctl reconfigure
```

- エラーが出てしまいました。
    - Disk の容量不足のようです。

```
================================================================================
    Error executing action `run` on resource 'execute[initialize_cluster_/var/opt/opscode/postgresql/9.2/data]'
================================================================================
  
================================================================================
    Error executing action `init` on resource 'private_chef_pg_cluster[/var/opt/opscode/postgresql/9.2/data]'
================================================================================

STDERR: FATAL:  could not write to file "base/12003/11810": No space left on device
```


[参考]
http://qiita.com/anikundesu/items/389f5bb91c26dcc0a778


- ディスクを拡張した結果、インストールに成功しました。

```
(略)
Chef Client finished, 312/478 resources updated in 03 minutes 15 seconds
Chef Server Reconfigured!
```

[参考：Ubuntu ディスク容量の拡張](http://qiita.com/inoko/items/7d0fe68aadf7c3a79cc7"タイトル")
Pythonでテキストマイニング　①形態素解析

Pythonでテキストマイニングに挑戦。(Python3系対象)
以下のステップで取り組む。

①形態素解析(本記事)
②Word Cloudで可視化(次回)

---

*この記事は最終的に目的を達成できていません。[続報](http://qiita.com/furipon/items/0d626f4a943c99fe32c6)を参照してください。*

---

#形態素解析のライブラリ
日本語の文章を単語に分割するのに必要な形態素解析。
よく示される分かりやすい例として
「すもももももももものうち」
を
「すもも　も　もも　も　もも　の　うち」
に分割するもの。

日本語は英語のように単語の区切りが明確ではなく文章を単語に分割することが非常に難しいので、自前のコードで処理するのは現実的ではない。

そこで、オープンソースで公開されている「[MeCab](http://taku910.github.io/mecab/)」というライブラリを使う。(恐らく日本語形態素解析では最もメジャーなもの。「めかぶ」と読むらしい)

#MeCabのインストール
MeCabをPythonで使えるようにするためには、
・MeCab本体のインストール
・辞書のインストール
・Pythonバインディングのインストール
が必要。

ただし、Windows用のバイナリパッケージには辞書が含まれるため、辞書のインストールは不要。
ここではWindowsにインストールする想定で手順を記載。

まず、[公式サイト](http://taku910.github.io/mecab/)に記載されているダウンロードサイトから、
・mecab-0.996.exe
・mecab-python-0.996.tar.gz
をダウンロード。

次に、mecab-0.996.exeを起動して本体をインストール。
途中で辞書の文字コードを選択するが、デフォルトのShift-JISを選択。(UTF-8にしなくてよいのか若干不安ではあるが…)

この時点でmecabコマンドが使えるはずだが、PATHが通っていないようで使えない。手動でインストールディレクトリのbinをPATHに追加する。

試しにコマンドラインのmecabを使ってみる。
例によって「すもももももももものうち」を。

```
>mecab↓
すもももももももものうち↓
すもも  名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
も      助詞,係助詞,*,*,*,*,も,モ,モ
もも    名詞,一般,*,*,*,*,もも,モモ,モモ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
うち    名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ
EOS
```

#MeCab Pythonバインディングのインストール
次に、mecab-python-0.996.tar.gzを適当なディレクトリに解凍。
解凍したディレクトリに移動し、READMEに従ってbuildとinstallを実行。
以下、実行した結果。

```
>python setup.py build
'mecab-config' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
Traceback (most recent call last):
  File "setup.py", line 13, in <module>
    version = cmd1("mecab-config --version"),
  File "setup.py", line 7, in cmd1
    return os.popen(str).readlines()[0][:-1]
IndexError: list index out of range
```

いきなりbuildでつまづく。
setup.pyの中で呼んでいるmecab-configというコマンドがないらしい。
PATHは通っているが、binの下を見てもそれっぽい実行ファイルが見当たらない。

ググってみると、どうやらWindowsでPythonバインディングを入れるのはかなり面倒そう。頑張ってもいいけど、テキストマイニングすることが目的でWindowsでMeCabを動かすことが目的ではないので中断。
別のLinux環境に入れることにする。

＜参考サイト＞
[RとPythonでMeCabを使う環境構築(Windows, Mac)](http://y-mattu.hatenablog.com/entry/2016/01/06/030929)
Akka HTTPでgzip圧縮を有効にする方法

`encodeResponseWith` を使いましょう。公式ドキュメントは[こちら](http://doc.akka.io/docs/akka-http/10.0.3/scala/http/routing-dsl/directives/coding-directives/encodeResponseWith.html)。

```scala
import akka.http.scaladsl.coding.Gzip
import akka.http.scaladsl.server.Directives._

encodeResponseWith(Gzip) {
  complete("content")
}
```

ただこれだと`Accept-Encoding`を見てくれなくて常にGzip圧縮されてしまう。curlとかでそのままアクセスすると悲惨なことになります。そういう挙動が嫌な場合は次のようにすれば解決です。

```scala
import akka.http.scaladsl.coding.{ Gzip, NoCoding }
import akka.http.scaladsl.server.Directives._

encodeResponseWith(NoCoding, Gzip) {
  complete("content")
}
```

よく見たらちゃんとドキュメントに書いてあった…
ApacheのWebDAVでファイルはあるのにディレクトリが空に見える問題

Apacheのバージョンを2.2.14から2.4.7にバージョンアップしたところ、WebDAVで一部のフォルダの中身が空になってしまうという現象が発生しました。実際にファイルが無くなっている訳ではなく、WebDAVから見るとなぜか何も無いように見えるようです。

WebDAVのアクセスログを見ると、ディレクトリをPROPFINDしたときに405が返っているので、ファイルリストの取得に失敗して何も無いように見えるという結果になるようです。

調べてみると、これはApacheのバグのようです。

Bug 54914 - mod_dir DirectoryIndex breaks WebDAV PROPFIND / DELETE / MOVE
https://bz.apache.org/bugzilla/show_bug.cgi?id=54914

index.htmlなどの'DiretoryIndex'ディレクティブに指定されているファイルが存在している時にディレクトリにアクセスするとmod_dirが何かをやらかして405応答になるようです。確かに見られるディレクトリにはindex.htmlが存在せず、空に見えるディレクトリにはindex.htmlが存在していました。

mod_dirを無効にするか、WebDAV領域の設定に以下のように空の``DiretoryIndex``を指定することでこの問題を回避することができます。

```apache
DiretoryIndex
```

修正は2.5系にしか入っていないっぽいので、まだしばらく悩まされそうです……
php-fmpのインストールができません。

Nginxをインストールするためphp-fmpをインストールしようとしているのですが,うまくいきません。どうの様にすればよいのでしょうか。

●試したコード
yum --enablerepo=remi install php-fpm

▪️▪️出力されるメッセージ▪️▪️
読み込んだプラグイン:fastestmirror, security
インストール処理の設定をしています
Loading mirror speeds from cached hostfile
 * base: ftp.nara.wide.ad.jp
 * epel: ftp.riken.jp
 * extras: ftp.nara.wide.ad.jp
 * remi: mirror.smartmedia.net.id
 * remi-safe: mirror.smartmedia.net.id
 * updates: ftp.nara.wide.ad.jp
依存性の解決をしています
--> トランザクションの確認を実行しています。
---> Package php-fpm.x86_64 0:5.4.45-13.el6.remi will be インストール
--> 依存性の処理をしています: php-common(x86-64) = 5.4.45-13.el6.remi のパッケージ: php-fpm-5.4.45-13.el6.remi.x86_64
--> 依存性解決を終了しました。
エラー: パッケージ: php-fpm-5.4.45-13.el6.remi.x86_64 (remi)
             要求: php-common(x86-64) = 5.4.45-13.el6.remi
            インストール: php-common-5.6.30-1.el6.remi.x86_64 (@remi-php56)
                php-common(x86-64) = 5.6.30-1.el6.remi
            利用可能: php-common-5.3.3-47.el6.x86_64 (base)
                php-common(x86-64) = 5.3.3-47.el6
            利用可能: php-common-5.3.3-48.el6_8.x86_64 (updates)
                php-common(x86-64) = 5.3.3-48.el6_8
            利用可能: php-common-5.4.45-12.el6.remi.x86_64 (remi)
                php-common(x86-64) = 5.4.45-12.el6.remi
            利用可能: php-common-5.4.45-13.el6.remi.x86_64 (remi)
                php-common(x86-64) = 5.4.45-13.el6.remi
 問題を回避するために --skip-broken を用いることができません
 これらを試行できます: rpm -Va --nofiles --nodigest

●●調べたコード●●
yum list | grep php-fpm
▪️▪️出力されるメッセージ▪️▪️
php-fpm.x86_64                            5.3.3-48.el6_8               updates  
php54-php-fpm.x86_64                      5.4.45-13.el6.remi           remi-safe
php55-php-fpm.x86_64                      5.5.38-7.el6.remi            remi-safe
php56-php-fpm.x86_64                      5.6.30-1.el6.remi            remi-safe
php70-php-fpm.x86_64                      7.0.16-1.el6.remi            remi-safe
php71-php-fpm.x86_64                      7.1.2-1.el6.remi             remi-safe
Apexで環境変数を切り替える話

# Apexで環境変数を切り替える話

## Apexについて

http://apex.run/

あとclassmethodのblog記事とか読むといいと思います。
http://dev.classmethod.jp/cloud/aws/how-to-manage-aws-lambda-functions-with-apex/

## やりたいこと1 devとかprodとかで環境変数を切り替えたい

[このへん](http://qiita.com/gaishimo/items/af2a05bcaf4cb96e534b#%E7%92%B0%E5%A2%83%E3%81%94%E3%81%A8%E3%81%AB%E3%82%BB%E3%83%83%E3%83%88%E3%82%92%E5%88%87%E3%82%8A%E6%9B%BF%E3%81%88%E3%82%8B) のやり方とかつらつら見てたんですが、最新(現在v0.13.0)だと公式でサポートされていました。

```
├── functions
│   └── function-name
│       ├── index.js
│       └── package.json
└── project.json
```

なところを、

```
├── README.md
├── functions
│   └── function-name
│       ├── index.js
│       └── package.json
├── project.development.json
├── project.json
├── project.production.json
└── project.staging.json

```

てな感じに分けて、

```
$ apex deploy -e development
```

とすればproject.development.jsonが読み込まれるし、

```
$ apex deploy -e staging
```

とすればproject.staging.jsonが読み込まれます。
VPCが違うとか、RDSの接続先が違うとかはこれで解消。

## やりたいこと2 手元で実行する際もどうにかしたい

- Lambdaの環境変数はprocess.env.KEYに渡される
  - poroject.jsonのenvironmentをprocess.envに突っ込めばいい
- 手元実行なのかLambdaで実行しているのかを判断したい
  - Lambda上でしか使われない環境変数があるかどうかで判断すればいい
  - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/current-supported-versions.html#lambda-environment-variables

といったあたりを踏まえて、↓のような処理を追加。
※ 別途project.local.json作ってます。

```
if (!process.env.AWS_LAMBDA_FUNCTION_NAME) {
  var path = '../../project.local.json';
  if (process.env.NODE_ENV) {
    path = '../../project.' + process.env.NODE_ENV + '.json';
  }
  var parsedObj = JSON.parse(fs.readFileSync(path, 'utf8'));

  Object.keys(parsedObj.environment).forEach(function (key) {
    process.env[key] = process.env[key] || parsedObj.environment[key];
  });
}
```

これで手元でもLambdaでも同じノリで設定が書けるようになりました。

## まとめ

PHP書くって当初聞いていたんですが、なぜかNode.jsを書いています。
iframe内のelementから親frameを含むpos座標を取得する方法

## 問題
iframe内のelementを起点に、そのelementのブラウザ上の座標を取得したい

## 解決
```html:parent.html
<!DOCTYPE html>
<html>
  <head>
    <title>parent html</title>
  </head>
  <body>
    <h1>parent html</h1>
    <div style="display:flex;">
      <iframe src="child.html" style="width:500px; height:200px; margin:auto;"></iframe>
    </div>
  </body>
</html>
```
```html:child.html
<!DOCTYPE html>
<html>
  <head>
    <title>child html</title>
    <script type="text/javascript">
      function getPos() {
        const pos = { top: 0, left: 0 };

        const el = document.getElementById('targetElement');
        pos.top = el.getBoundingClientRect().top;
        pos.left = el.getBoundingClientRect().left;

        var doc = el.ownerDocument;
        var childWindow = doc.defaultView;

        while (window.top !== childWindow) {
          pos.top += childWindow.frameElement.getBoundingClientRect().top;
          pos.left += childWindow.frameElement.getBoundingClientRect().left;
          childWindow = childWindow.parent;
        }

        console.log(pos);
      };
    </script>
  </head>
  <body>
    <h1>child html</h1>
    <div id="targetElement" style="width:20%; height:20%; margin:auto; border:1px solid black;">target</div>
    <button onClick="getPos();">get pos</button>
  </body>
</html>
```
Rubyのwin32oleを使ってPowerPointのシェイプのグループ化


# 初めに
ページ数が多いPowerPointファイルの各ページでシェイプをグループ化する必要に迫られたので，やり方を調べた．

# やり方

手っ取り早くサンプルコードを書く．PowerPointのファイルを開いて，その3枚目のスライド上の2番目と4番目のシェイプをグループ化するコードは以下．

```rb

require 'win32ole'

pp = WIN32OLE.new( 'PowerPoint.Application' )
pp.Visible = true

presen = pp.Presentations.Open :FileName => 'filepath'

presen.Slides(3).Shapes.Range(Array[2, 4]).Group
```
PHP+MySQL で構築した CMS の一括編集機能とやらがバグってるから治せって言われた

## 状態
* PHP5.4 + MySQL5.5 で構築されたオリジナル CMS
* フレームワークは CakePHP2 系 (詳しいことは不明)
* ものすごい件数のアイテムに属性をつけたり外したりする一括編集機能がある
* ほとんどが設定した値になるが、一部ならないものがある
* 更新対象は 1000 以上

## ソースコードを確認
POST されたデータを for で回しつつ、そのアイテムが存在するか確認し、あれば update なければ insert みたいなことをやっていた。
1000件分。
最初に見たときは、 ~~ゴミかと思った~~「これはメモリ食いつぶしてしまって途中で処理が止まったんじゃないか？」と思った。

## 実際は違った
リファクタリングして for ループを廃止し、クエリの発行も select, update, insert を1つずつ発行し、最大3回で済むように改善した。
だが、やはり保存されていないアイテムがあった。

## ログを吐き出してみた
POST で受け取ったはずのアイテムデータの件数が少なかった。
更新対象は1000件以上あったはずなのに実際に受け取っているのは900件程度だった。

## php.ini
POST の何らかの制限がかかっているのだろうと思い、 `/etc/php.ini` を開いてみた。
真っ先に確認したのは以下の3つ(最後のは今回は関係ないが念のため)。
* memory_limit
* post_max_size
* upload_max_filesize
これらの何もそれなりのサイズが設定されており、1000件程度のデータでオーバーするとは思えなかった。

## max_input_vars
メモリ量じゃなければ単純に件数の制限がかかっているのかもしれないと思い確認して見ると、`max_input_vars` の行がコメントアウトされていた。
デフォルトでは **1000** らしい。
まさに。
とりあえずこの値を2000くらいにして見て Apache を再起動させて見ると、すべてのデータが保存されるようになった。
めでたしめでたし。

## 蛇足

### バルクインサート
`$model->save()` を1回だけ書けば、普通 Insert のクエリは1回しか発行されないと思うのだが、CakePHP2 は 残念なことに件数分のクエリを発行する。
なので、自分で生クエリを生成するか、そういう関数を作っておく必要がある。
その際はインジェクション対策を自分で実装する必要があるので、しっかりテストするべし。
(なお Update は `$model->updateAll()` という関数が準備されている。ただし一癖あるので良くテストしたほうがいい)

#### 理想

```sql
INSERT INTO table ( name, status, created, modified ) VALUES ( 'name1', 1, now(), now() ),  ( 'name2', 1, now(), now() ),  ( 'name3', 1, now(), now() );
```

#### 現実

```sql
INSERT INTO table ( name, status, created, modified ) VALUES ( 'name1', 1, now(), now() );
INSERT INTO table ( name, status, created, modified ) VALUES ( 'name2', 1, now(), now() );
INSERT INTO table ( name, status, created, modified ) VALUES ( 'name3', 1, now(), now() );
```
特定のディレクトリだけRubyのバージョンを指定する

特定のディレクトリだけバージョン指定をする場合
```
$ rbenv local 指定したいバージョン
```

全ての環境にバージョン指定をする場合

```
$ rbenv global 指定したいバージョン
```

参考：　http://dev.classmethod.jp/server-side/language/build-ruby-environment-by-rbenv/
Meadow1.15をWindows10/64bitで使うときのメモ

なんでMeadow? それも古い1.15? って言われそうですが。。。

##### 1. temacsの設定
temacs.exeのプロパティを出して、Windows7の互換モードで実行するように設定したうえで、MeadowNT.exeを作成します。

##### 2. .emacsへのフォント設定追加

```
;; ;;; TrueType フォント設定
(w32-add-font "msgothic-ascii"
              '(;(default-ascent . 0)
                ;(relative-compose . 0)
                (encoding-type . 0)
                (overhang . 0)
                (base . 12)
                (height . 14)
                (width . 6)))

(w32-change-font-logfont "msgothic-ascii" 0
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-ascii" 1
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-ascii" 2
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 t nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-ascii" 3
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 t nil nil 128 1 3 49))

(w32-add-font "msgothic-katakana"
              '(;(default-ascent . 0)
                ;(relative-compose . 0)
                (encoding-type . 4)
                (overhang . 0)
                (base . 12)
                (height . 14)
                (width . 6)))
(w32-change-font-logfont "msgothic-katakana" 0
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-katakana" 1
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-katakana" 2
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 t nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-katakana" 3
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 t nil nil 128 1 3 49))

(w32-add-font "msgothic-jisx0208"
              '(;(default-ascent . 0)
                ;(relative-compose . 0)
                (encoding-type . 4)
                (overhang . 0)
                (base . 12)
                (height . 14)
                (width . 6)))
(w32-change-font-logfont "msgothic-jisx0208" 0
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-jisx0208" 1
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 nil nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-jisx0208" 2
        '(w32-logfont "ＭＳ ゴシック" 0 -12 400 0 t nil nil 128 1 3 49))
(w32-change-font-logfont "msgothic-jisx0208" 3
        '(w32-logfont "ＭＳ ゴシック" 0 -12 700 0 t nil nil 128 1 3 49))

(new-fontset "fontset-msgothic" 
             '((ascii . "msgothic-ascii")
               (katakana-jisx0201 . "msgothic-katakana")
               (japanese-jisx0208 . "msgothic-jisx0208")))
(setq default-frame-alist (append (list '(foreground-color . "orange")
					'(background-color . "black")
					'(border-color . "white")
					'(mouse-color . "orange")
					'(cursor-color . "orange")
					'(ime-font . "msgothic-jisx0208")
					'(font . "fontset-msgothic")
					'(width . 96)
					'(height . 40))
				        default-frame-alist))
```

![meadow.png](https://qiita-image-store.s3.amazonaws.com/0/167175/5572aa63-6db8-f1a3-a425-ac1e2537fc63.png)
chainerで2つの違うモーダルを共通空間に射影するときのモデルコード

```python:model.py
# Network definition
class MLP(chainer.Chain):

    def __init__(self, n_units, n_out):
        super(MLP, self).__init__(
            # the size of the inputs to each layer will be inferred
            l1=L.Linear(None, n_units),  # n_in -> n_units
            l2=L.Linear(None, n_units),  # n_units -> n_units
            l3=L.Linear(None, n_out),  # n_units -> n_out
        )

    def __call__(self, x):
        h1 = F.relu(self.l1(x))
        h2 = F.relu(self.l2(h1))
        return self.l3(h2)

class CommonNet(chainer.Chain):
    def __init__(self, _model1, _model2):
        super(CommonNet, self).__init__(
            model1 = _model1,
            model2 = _model2,
        )

    def __call__(self, x, y):
        h1 = self.model1(x)
        h2 = self.model2(y)
        self.loss = F.mean_squared_error(h1, h2)
        reporter.report({'loss': self.loss}, self)
        return self.loss
    
enc1 = MLP(10,10)
enc2 = MLP(10,10)

model = CommonNet(enc1, enc2)
```

上記のようなモデルを組み，あとは，tupled_datasetで2つのデータを用意して，trainerでtrainさせればよい．
Cognos レポート 日時単位のデータを午前・午後の単位で集計したい

##概要
最近質問を受けたので投稿しておきます。
こんな感じに、時刻単位で持っているデータを、その日の午前と午後で集計(平均)して、出力したいという問い合わせでした。
日にち単位だったら簡単そうだけど、特定の範囲（0時～11時⇒午前、12時～23時⇒午後）で括るのって、どうやるのだろうと思った時に思い出して見てください。

![003.PNG](https://qiita-image-store.s3.amazonaws.com/0/147246/1972c582-e081-ec4e-1ae1-30ae411335c1.png)

##実装
以下のようにそれぞれのデータアイテムを実装しています。
case文を使って、条件の範囲でカスタマイズされた集計範囲（午前・午後）を新たに作成し、平均のaverage関数のforで、その集計範囲（午前･午後）を指定する、という感じです。

**日付午前午後のデータアイテム**
substring(cast([DB2SAMPLE].[TIMESALES].[STIME],char(19)),1,10)
||
case
when substring(cast([DB2SAMPLE].[TIMESALES].[STIME],char(19)),12,2) between 0 and 11 then ' 午前'
when substring(cast([DB2SAMPLE].[TIMESALES].[STIME],char(19)),12,2) between 12 and 23 then ' 午後'
end

**平均SALESのデータアイテム**
average([DB2SAMPLE].[TIMESALES].[SALES] for [日付午前午後])
【VFW】OS付属のmp3コーデックでMP3のエンコードをする

今さらVFWのコーディングをするのもなんですが、
レガシーなコードを引き継いでちょっとしたプログラムを書いてaviファイルを作成するのに都合がいいのでメモっておきます。
EternalWindowsさんとか、ネットにわかりやすい解説がまだまだ残ってますしね。

##### 1. レジストリの修正

```
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Drivers32
(64bit版はHKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows NT\CurrentVersion\Drivers32 も)
```
のmsacm.l3acmをl3codecp.acmに修正。

##### 2. WAVEFORMATEX, MPEGLAYER3WAVEFORMATの設定
2チャンネル、16ビット、32000Hzの録音入力を、128khz,CBRでエンコードするときの設定

```
#define AUD_CAPTURE_SAMPLINGFREQUENCY 32000  // 32000Hz
#define AUD_CAPTURE_CHANNELS 2               // stereo
#define AUD_CAPTURE_BITSPERSAMPLE 16         // 16bit/sample
#define MP3_BITRATE (128*1000)               // 128khz CBR
#define MP3_SAMPLESPERFRAME 1152             // mp3 v1 layerIII
#define MP3_FRAMESIZE (MP3_SAMPLESPERFRAME*(MP3_BITRATE/8)/AUD_CAPTURE_SAMPLINGFREQUENCY)

  WAVEFORMATEX wfx;
  memset(&wfx, 0, sizeof(WAVEFORMATEX));
  wfx.wFormatTag=WAVE_FORMAT_PCM;
  wfx.nChannels=AUD_CAPTURE_CHANNELS;
  wfx.nSamplesPerSec=AUD_CAPTURE_SAMPLINGFREQUENCY;
  wfx.wBitsPerSample=AUD_CAPTURE_BITSPERSAMPLE;
  wfx.nBlockAlign=wfx.wBitsPerSample/8*wfx.nChannels;
  wfx.nAvgBytesPerSec=wfx.nSamplesPerSec*wfx.nBlockAlign;
  
  MPEGLAYER3WAVEFORMAT mp3wf;
  memset(&mp3wf, 0, sizeof(MPEGLAYER3WAVEFORMAT));
  mp3wf.wfx.wFormatTag=WAVE_FORMAT_MPEGLAYER3;
  mp3wf.wfx.nChannels=AUD_CAPTURE_BITSPERSAMPLE;
  mp3wf.wfx.nSamplesPerSec=AUD_CAPTURE_SAMPLINGFREQUENCY;
  mp3wf.wfx.wBitsPerSample=0;
  mp3wf.wfx.nBlockAlign=1;
  mp3wf.wfx.nAvgBytesPerSec=MP3_BITRATE/8;
  mp3wf.wfx.cbSize=MPEGLAYER3_WFX_EXTRA_BYTES;
  mp3wf.wID=MPEGLAYER3_ID_MPEG;
  mp3wf.fdwFlags=MPEGLAYER3_FLAG_PADDING_OFF;
  mp3wf.nFramesPerBlock=1;
  mp3wf.nBlockSize=MP3_FRAMESIZE*mp3wf.nFramesPerBlock;
  mp3wf.nCodecDelay=1393;
```

aviに入れてvideoと同期させるのにMP3-CBRの方がコーディング上は楽なんです。
MP3のacmの変更はライセンス的にどうなんだろうってのがありますけどね。
sedコマンドでcsvファイルの各行の末尾のカンマを消しちゃう

# 概要
* sedコマンドで行末のカンマを空白に置換

# 環境
* Ubuntu 14.04LTS (VMWare上)

# sedとは
* 文字列を全置換したり、行単位で抽出したり、削除したり、いろいろなテキスト処理のできるコマンドのこと
* 置換の場合
```sed "s/<置換前>/<置換後>/"```
てな感じでやる。
ファイルを直接書き換える場合は、`-i`コマンドを追加する。
    * <置換前>の後に`\$`追加すると行末にある文字列<置換前>を置換してくれる。

# やり方

```by_comma.sh
sed -i -e "s/,\$//" comma.csv
```

# 参考文献
* http://itpro.nikkeibp.co.jp/article/COLUMN/20060227/230879/
* https://hydrocul.github.io/wiki/commands/sed.html
* http://moruho.cocolog-nifty.com/blog/2012/07/post-4bf1.html
* http://qiita.com/takech9203/items/b96eff5773ce9d9cc9b3
Elastic Beanstalk (tomcat)でHTMLにtext/plainのMIMEがついてしまうときの対処法

# 障害内容
* 他社開発のwarをElastic Beanstalkにdeployしたら一部のHTMLがtext/plainで表示された

# 原因
* Elastic Beanstalkはロードバランサーの下でアプリケーションサーバーを動かしている 
* 構成：インターネット ⇔ ELB(Apache) ⇔ EC2(Tomcat) 
* ELBに使用されているApacheの挙動としてMIMEがセットされていないコンテンツにデフォルトでtext/plainを追加してresponseを返している
* 一部のページにMIMEがセットされていなかった orz

# 対策
* 対策案①：MIMEをちゃんと付けるようにプログラムを修正
* 対策案②：ELBにnginxを使用する
* 対策案③：ELBのApacheの挙動を修正する
* 本来①を実施したいところだが、今回は他社開発プログラムなので①が実施できない、②も動作保証環境から外れてしまうため③を採用

#### zip 構成
```
deploy.zip
├ .ebextensions
│　└ httpd
│　　└ conf.d
│　　　└ ex_httpd.conf
├ fuga.war
└ hoge.war
```

#### ex_httpd.conf 内容
```
DefaultType None
```
組込みC > enumと#defineの違い

```txt:動作対象
MSP430
```

```c
#define IDX_CMD (1)
#define IDX_UTC_TIME (2)
#define IDX_STS (3)
#define IDX_LAT (4)
#define IDX_NS (5) // North or South
#define IDX_LON (6)
#define IDX_EW (7) // East or West
#define IDX_VELOCITY (8)
#define IDX_DIRECITON (9) // or orientation
#define IDX_UTC_DATE (10)
```

```c
enum {
  IDX_CMD = 1,
  IDX_UTC_TIME,
  IDX_STS,
  IDX_LAT,
  IDX_NS, // North or South
  IDX_LON,
  IDX_EW, // East or West
  IDX_VELOCITY,
  IDX_DIRECITON, // or orientation
  IDX_UTC_DATE,
  // etc
};
```

どちらがメモリ使用効率が良いか?という疑問を持った。

MSP430の開発環境でのメモリ使用結果は、ともに以下だった。
GPSの値をUARTで読み取って、AQM1602(I2C接続のキャラクタLCD)に表示する実装。

```
5 434 CODE
  239 DATA (+19 absolute)
   25 CONST
```

自分の理解では、`#define`の場合はプリプロセッサでコードの該当箇所が数値に置き変わる。そのため、余分なメモリ消費がない。
一方で、enumの処理はどうなのかは不明。
上記のメモリ消費だけを見れば、enumの場合もプリプロセッサで置換が起きているとも考えられるが、未消化。

WIP (Work In Progress)。

以下は上記の疑問の回答にはなっていない。
http://stackoverflow.com/questions/10006700/does-defining-enum-type-has-a-heavy-memory-imprint
http://stackoverflow.com/questions/136946/difference-between-enum-and-define-statements
gulp-pleeeaseでremの基準値指定が機能しない際の対処

postcssとしてautoprefixerもmqpackerも両方まかなえて設定がラクなのでgulp-pleeeaseを使用していたが、
どうもremの書き出しがうまくいかない。

```css
html{
  font-size: 62.5%;/* rem基準値を10pxにする */
}
body{
  font-size:1.4rem;/* 14px相当になる */
}
```

というcssから、
pleeeaseがrem非対応用pxの場合も書き出すのだが、
処理後は

```css
body{
  font-size:22.4px;/* pleeeaseによる補完 */
  font-size:1.4rem;
}
```
とpleeeaseデフォルトの「16px」を基準に変換してたりする

そこで、gulp-pleeaseのオプション http://pleeease.io/docs/#rem
にあるremを指定するも効いてくれない

##うまくいかなかった設定
```js:gulpfile.js
gulp.task('compilecss', function() {
  return gulp.src('src/scss/**/*.scss')
    .pipe(sass({
      style: 'expanded'
    }))
    .pipe(pleeease({
      rem: ['10px',{replace:false}],
      mqpacker: true,
      autoprefixer: ['last 2 version', 'iOS >= 8.1', 'Android >= 4.3'],
    }))
```

解決策を探したら
[gulp-pleeeaseのremを10px基準にしたい場合の指定方法について](http://ja.stackoverflow.com/questions/6080/gulp-pleeease%E3%81%AErem%E3%82%9210px%E5%9F%BA%E6%BA%96%E3%81%AB%E3%81%97%E3%81%9F%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E6%8C%87%E5%AE%9A%E6%96%B9%E6%B3%95%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)
~~というのがあったが、gulp-pleeeaseに3.0.0がない。2.0.2しかない。。。~~
**gulp-pleeeaseのverではなく、node_modules/gulp-pleeease/package.json内の pleeease のverのことでした**
**ただ、元々4.0.0あたりが指定されてるので、指定が効かなかったのは自分の環境だけだったのかも、、、**

なので、node_moduleの中のpleeeaseのオプション指定を辿ったところ、
##うまくいった設定
```js:gulpfile.js
gulp.task('compilecss', function() {
  return gulp.src('src/scss/**/*.scss')
    .pipe(sass({
      style: 'expanded'
    }))
    .pipe(pleeease({
      rem: {rootValue: '10px'},
      mqpacker: true,
      autoprefixer: ['last 2 version', 'iOS >= 8.1', 'Android >= 4.3'],
    }))
```

とrootValueとして指定したら、ちゃんと 10px 基準で

```css
body{
  font-size:14px;/* pleeeaseによる補完 */
  font-size:1.4rem;
}
```
ってなりました。

###補足
ちゃんと調べてないので関係あるかわかりませんが、
```npm i -D pixrem```
っていう関係ありそうなやつも入れましたが関係あるかわかりません。

rootValueもどこにそんな説明あったのかわかりませんでした。。。
Windows 10 で LaTeX, Beamer を手軽に使えるようにする手順

# おおまかな流れ
* cygwin 環境を gnupack で用意して、TeX Live をインストールする. 
  * gnupack: cygwin 環境と emacs を手軽に使えるようにするパッケージ

# 手順
1. [gnupack プロジェクトのページ](https://ja.osdn.net/projects/gnupack/) から、開発者向けの最新の安定版 gnupack_devel-13.06-2015.11.08.exe をダウンロードし、インストールする。
1. gnupack から cygwin のターミナルを立ち上げる（startup_cygwin.exe を実行する）。
1. TeX Live のインストールに必要な wget, perl, ghostscript が gnupack/cygwin にインストールされているか、確認する。例えば、`ghostscript` の確認は次の通り。
  * `cygcheck -c ghostscript`
1. おそらく ghostscript だけが入っていないのでインストールする。
  * `apt-cyg install ghostscript`
1. cygwin のターミナル上で [TeX Live の公式パッケージ](https://texwiki.texjp.org/?Cygwin#texlive)の説明に従い、TeX Live をインストールする。

以上で LaTeX が利用できるようになり、beamer なども使えるようになります。

# PDF ビューワ

LaTeX を（dvi から）PDF にコマンドで変換するとき、PDF ビューワの種類によっては PDF の変更（上書き）が禁止されることがあります。そうすると、いったん PDF ファイルを閉じて、変換してから開き直す手間がかかります。
[SumatraPDF (portable)](https://portableapps.com/apps/office/sumatra_pdf_portable) はそのような手間がなく、PDF ファイルを開いたままで PDF ファイルを変更でき、変更後自動でビューワの表示が更新されます。

# 注意 
Windows 10 で gnupack が利用できることを確認した上でこのメモを書いていますが、gnupack プロジェクトはその利用を保証していません。
MySQLの文字コードとCollation

散々、書かれていることで、何度もでてくる話なので、自分用にまとめ。

# 文字コード

まずMySQLの文字コードですが絵文字のみでなく、JIS X 0213の第3・4水準漢字の
一部にUTF8 4バイト文字があり（まぁまず使われないと思いますが）、
MySQLの文字コードはこれからはutf8mb4一択のようです。
charsetは、サーバ、クライアント、サーバー/クライアント感の接続、データベース、、テーブル、カラムで個別に指定でき、
問題を起こさないようにするには、すべて揃えたほうが無難であります。

```
character_set_server=utf8mb4
character_set_client=utf8mb4
character_set_connection=utf8mb4
character_set_database=utf8mb4
character_set_results=utf8mb4
```

参考：
https://www.slideshare.net/tmtm/mysql-62004569

# Collation

で、問題のCollationですが、utf8mb4で指定できるCollationは

```
utf8mb4_general_ci
utf8mb4_unicode_ci
utf8mb4_unicode_520_ci
utf8mb4_bin
```

の４種類がCollationの候補ですが、

**utf8mb4_general_ci**
   A = a 区別しない
   :sushi: = :beer: 区別しない
   は≠ぱ≠ば 区別する

**utf8mb4_unicode_ci**
   A = a 区別しない
   :sushi: = :beer: 区別しない
   は=ぱ=ば 区別しない

**utf8mb4_unicode_520_ci**
   A = a 区別しない
   :sushi: ≠ :beer: 区別する
   は=ぱ=ば 区別しない

**utf8mb4_bin**
   A ≠ a 区別する
   :sushi: ≠ :beer: 区別する
   は≠ぱ≠ば 区別する

区別するしないはwhere句やJoin、ソート順で影響がでます。
要件によると思うのですが、utf8mb4_general_ciかutf8mb4_binが選択肢として候補になり、制約条件付きで提案してどちらかでOKをもらう（誰に）
Zeppelin0.7.0でLDAP認証する

# 概要
Zeppelin0.7.0のLDAP認証でハマった時のメモです。

# 問題
[公式の手順](https://zeppelin.apache.org/docs/0.7.0/security/shiroauthentication.html)でorg.apache.zeppelin.realm.LdapGroupRealmを使って認証すると、パスワードに何も入力せずにLoginボタンを連打しているとログインできてしまう事があった。

# 回避策
http://d.hatena.ne.jp/apyo/20120525/1337961637
上記ページを参考に、下記要領でJndiLdapRealmを使用すれば回避できた。

```shiro.ini(抜粋)
[main]
ldapRealm = org.apache.shiro.realm.ldap.JndiLdapRealm
ldapRealm.userDnTemplate = uid={0},xxxx
ldapRealm.contextFactory.url = ldaps://ldap-host
ldapRealm.contextFactory.authenticationMechanism = simple
securityManager.realm = $ldapRealm
```

以上です。
ドメインパートを残してメールアドレスをマスクする @ MySQL

# 概要
アンチパターンまっしぐらな以下の要素をマスクしてくれる素敵なストアドファンクションを作りました。

カンマ区切りのメールアドレスが入ったカラムとかアンチパターン以外の何物でもないので、
このファンクション使う機会がなければいいと思います。
でも時には必要になることもあるでしょう。あるでしょうとも！！！

### 要件
* カンマで区切られた複数のメールアドレスが存在する
* ドメインパートを残した状態でメールアドレスをSHA1でハッシュ化する
* なるべく早い方がいい

# ストアドファンクション
ストアドファンクションそのものの説明はここでは避けます。
内容はこちら。

``` mask_mail.sql
DELIMITER //
CREATE FUNCTION mask_mails(mail VARCHAR(255)) RETURNS VARCHAR(255)
BEGIN
    SET @mail = mail;
    SET @tmp = '';
    SET @masked = '';
    WHILE 
        IF LEFT(@mail, LOCATE(',', @mail)) = ''
            THEN RETURN CONCAT(@masked, SHA1(LEFT(@mail, LOCATE('@', @mail) - 1)), MID(@mail, LOCATE('@', @mail)));
        ELSE
            SET @tmp = LEFT(@mail, LOCATE(',', @mail) - 1);
            SET @masked = CONCAT(@masked, SHA1(LEFT(@tmp, LOCATE('@', @tmp) - 1)), MID(@tmp, LOCATE('@', @tmp)), ',')
            SET @mail = MID(@mail, LOCATE(',', @mail, 1) + 1);
        END IF;
    END WHILE;
END;
//
DELIMITER;
```
Zabbix で ログ監視をする

# Zabbix でログ監視をする
いつも調べ直すのでよく使うトリガー条件式などをメモとして残す(zabbix2.4)

## 1. ホストのマクロ
　OSによってシステムログのパスが違うのでホストのマクロに登録する
　```{$SYSLOG} = /var/log/mesasges```

## 2. アイテムのキー値
　ログに出力された内容はすべてサーバに収集する。アイテムはテンプレートの中に作ること。
　```logrt[{$SYSLOG}]```

## 3. 正規表現
　検知したい文字列と検知したい文字列を含んでしまうけど除外したい文字列を正規表現に定義する。
　```syslog_regexp = err | warn | fail | panic　結果を真　大文字小文字を区別```
　```syslog_exclude = test　結果を真　大文字小文字を区別```

## 4. トリガー条件式
　検知文字列を受信した場合のトリガーと、除外文字列を受信したときのトリガーを”＆”でくくる
　ログ監視は自動的に正常に戻らないので基準時間(5分)を決めておき定期的に障害状態を解除する条件も追加する
　```{hostname:logrt[{$SYSLOG}].regexp(@syslog_regexp)}=1```
　```&```
　```{hostname:logrt[{$SYSLOG}].regexp(@syslog_exclude)}=0```
　```&```
　```{hostname:logrt[{$SYSLOG}].nodata(300)}=0```
SQLで改行コードを置換しようとしたが置換できなかった場合の対処方法

MySQLのSELECT文で下記のような書き方でリプレイスを行えます。

```
SELECT REPLACE(column,'対象文字列','置換後') FROM test;
```

例)

```
※columnには「test」が入っている想定

SELECT REPLACE(column,'te','ea') FROM test;

#結果　= east;
```

##改行コードが変換されないときの確認方法
さくらエディタで改行を確認します。
下記のどの改行コードかによって置換方法が変わってきます。

|項目 | 記号 |
|:-----------|------------:|
|CRLF|↵|
|CR　|←|
|LF　|↓|

###○CRLF：　↵の場合
```
SELECT REPLACE(column,'\r\n',' ') FROM test;
```

###○CR：　↵の場合
```
SELECT REPLACE(column,'\r',' ') FROM test;
```

###○LF：　↵の場合
```
SELECT REPLACE(column,'\n',' ') FROM test;
```
【Django】プルダウンメニュー作る


以下の通り

```forms.py
from django import forms

CHOICE = (
	('', '選択肢から選んでください><'),
	('0', 'キュート'),
	('1', 'クール'),
	('2', 'パッション'),
)

def SampleForm(forms.Form):
	select = forms.ChoiceField(widget=forms.Select, choices=CHOICE)
```

はい
さくらで取得したドメインから、特定のサブドメインをFirebase Hostingで表示する（ドメイン設定）

## はじめに

いつごろだったか忘れましたが、Firebase Hostingのドメイン設定で特定のサブドメインに対してFirebase Hostingでデプロイしたサイトに適用することができるようになりました。

今回はちょうどさくらインターネットで取得したドメインの中で、あるサブドメインだけをHostingでデプロイしたサイトに接続したかったので、その時にやった内容を共有します。

というタイミングで、 **Hostingのコンソール画面がちょっと変わった** ために、キャプチャの一部などに差異があります。ご了承ください。

いちおう注意として、自分はこのあたりのネットワーク知識がガバガバなので、解説もかなりガバガバです。なにかやろうとしてることのヒントになればという思いを込めての公開です（いい感じの修正リクエストをお待ちしています）。

## 作業内容

### Firebase Hostingでサイトをデプロイします。

この手順は省略します。

### ドメインを接続する

Firebase Hostingの管理画面を開き、「ドメインを接続」ボタンをクリックします。

![Firebase_console.png](https://qiita-image-store.s3.amazonaws.com/0/4560/983e4c24-1a99-3ec3-7374-a647a6ac61cc.png "Firebase_console.png")


すると接続したいサイトの入力を求められるので、接続したいサブドメインを入力しましょう。

![Firebase_console2.png](https://qiita-image-store.s3.amazonaws.com/0/4560/80dfd3b9-2f60-f9f6-57c5-5cc30fdc51a8.png "Firebase_console2.png")

自分が作業したときにはなかった「既存のウェブサイトにリダイレクト」が最近追加されたみたいですね。説明は吹き出しの内容どおりだと思います（未検証）

### ドメインの検証を行う

サブドメインを入力して「続行」ボタンを押すと、ドメインの検証作業を指示されます。

![Firebase_console3.png](https://qiita-image-store.s3.amazonaws.com/0/4560/f592aa62-6cf6-df5c-fed9-e7013eaa4fcb.png "Firebase_console3.png")

さくらの会員メニューからドメインのゾーン編集へ移動し、指定されたTXTレコードを追加します。

![sakura_console1.png](https://qiita-image-store.s3.amazonaws.com/0/4560/5a73d33a-45b6-a970-f025-422e4a20eada.png "sakura_console1.png")

ちなみに自分が作業したときはTXTレコードが2つだったはずなんですが、いま現在確認のために作業したものはレコード1つですね…。これは作業先のFirebaseプロジェクトが既に別ドメインに接続しているからとかあるかもしれませんが詳細は不明です。とりあえず言われるがまま設定し、Hostingの管理画面に戻って「確認」ボタンを押してください。

さくらのゾーン編集の反映に時間がかかると、確認ボタン押しても即反映されないかもしれません。（この辺知識ないので認識違うかも）

### Aレコードを追加する

所有権の確認が完了すると、最後に2つのAレコードの追加を指示されます。これも以前はCNAMEかAレコードのどちらかを設定するように指示されたんですが（しかも推奨されたのはCNAME）、いまはAレコード固定のようですね。CNAMEは非サポートになってるし、当時もうまく設定が反映されませんでした。

![Firebase_console4.png](https://qiita-image-store.s3.amazonaws.com/0/4560/e47294fd-fb81-dffe-33e5-1fbb8e3e22d2.png "Firebase_console4.png")

ということで、さくらのドメインからのゾーン編集で **サブドメイン** に対してAレコードを追加します。この画面の指示だと＠に対してやるようにも見えますが、サブドメインの場合は違います。

![sakura_console2.png](https://qiita-image-store.s3.amazonaws.com/0/4560/a3b31189-1f62-8c9e-1b54-52c07432b4c6.png "sakura_console2.png")

上記の設定が完了すると、だいたい24時間以内に反映されます。おつかれさまでした。
MSP430 > UART > 4800bpsの設定

```txt:動作環境
MSP430F2x
```

4800bpsのGPSを読み取る場合、UARTの設定は以下のようになる。

```c
void uartPC_init(void)
{
    P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
    ME2 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
    UCTL0 |= CHAR;                            // 8-bit character
    UTCTL0 |= SSEL0;                          // UCLK = ACLK
    // 9600bps
    //UBR00 = 0x03;                             // 32k/9600 - 3.41
    //UBR10 = 0x00;                             //
    //UMCTL0 = 0x4A;                            // Modulation
    // 4800bps
    UBR00 = 0x06;                             // 
    UBR10 = 0x00;                             //
    UMCTL0 = 0xEF;                            // Modulation
    //
    UCTL0 &= ~SWRST;                          // Initialize USART state machine
    IE2 |= URXIE0;                            // Enable USART0 RX interrupt  
}
```

参考 http://www.win.tue.nl/san/education/2IN26/MSP430%20UART.pdf
のTable 2.


本家の資料では
http://www.ti.com/sc/docs/products/micro/msp430/userguid/ag_12.pdf
のTable 12.1にて`UBR00`は0x06で、`UMOD(UMCTL0)`は0x6Fという記載もある。

前者ではMEAN ERRORが-0.71%で、後者はmax errorが-9/11%。異なる値ではどちらがいいとも言えない。
検索機能　titleとtextで検索できる機能

あ、初投稿です。

textで検索できる機能はつけれたのですが、
textとtitle両方で検索できる機能は
どうやって書けますか？

ちなみに、railsとsequel proを使用してます！

ファイルは"product_controller.rb"です。

```def search
    @products = Product.where('text LIKE(?)', "%#{params[:keyword]}%").limit(20)
end```



よろしくお願いします。
ES2015 mapとset

# mapオブジェクト
オブジェクトを格納するためのオブジェクトという認識。

## mapオブジェクトの生成

``` js
//オブジェクトを作成する
const teacher1 = {name:"shinichi"};
const teacher2 = {name:"noguchi"};
const teacher3 = {name:"madoka"};

//作成したそれぞれのオブジェクトに値を割り当てる
const mapObj = new Map([
  [teacher1,"国語"],
  [teacher2,"英語"],
  [teacher3,"数学"]
]);
```

## mapオブジェクトが特定のキーを保持しているかを判定
``` js
if (mapObj.has(teacher1)) {
  //マップオブジェクトがteacher1のキーを持っていたら。  
}
```

## mapオブジェクトが保有するオブジェクトの個数を取得
```
console.log("teacherの数："　+ mapObj.size); 
```

## mapオブジェクトにオブジェクトを追加
```
const teacher4 = {name:"saito"};
mapObj.set(teacher4,"理科");
```

## mapオブジェクト内の特定のオブジェクトの値を特定
mapオブジェクト.get(オブジェクト名)で何の値を紐づけられているかを確認することができる。

``` js
console.log("teacher1の担当："　+ mapObj.get(teacher1)); //teacher1の担当：国語
```

## mapオブジェクトのすべての値を取得する。
### keyを全部取得。keys()。
``` js
const keys = mapObj.keys(); 
for (let key of keys) {
    console.log("キーたち：" + key);
}
```

### 全部の値を取得。values()。
``` js
const values = mapObj.values(); 
for (var value of values) {
    console.log("値たち："　+ value);
}
```

### すべての要素(キーと値の対応関係)を取得する。entries()。
``` js
for (let teacher of mapObj.entries()){
  console.log("ティーチャー名："　+ teacher[0].name　+ "の");
  console.log("担当教科は："　+ teacher[1]);
}
```

## mapオブエジェクトから特定の要素を削除
``` js
mapObj.delete(teacher2);

for (let teacher of mapObj.entries()){
  console.log("残ったティーチャー："　+ teacher[0].name);　//残ったティーチャーはshinichiとmadokaとsaitoになった。
}
```

# setオブジェクト
set(集合)の意味。配列とは異なり、重複した値を格納することができない。

## setオブジェクト生成
``` js
const subject = new Set();
```

## 値を追加
``` js
subject.add("数学");
subject.add("理科");
```

## 値の取得、その1
``` js
for (let value of subject.values()) {
    console.debug(value); 
}
```

## 値の取得、その2
``` js
for (let value of subject.entries()) {
    console.debug(value); 
}

```
【メモ】access.log 監視 → サービス再起動用シェルスクリプト

サービスのリスタート用のシェルスクリプトを用意したのでそのメモ

```bash
#!/bin/sh

if [ $$ != `pgrep -fo $0`  ]; then
echo `basename $0` is already running.
exit 1
fi

restart(){
while read i
do
   echo $i | grep " 499 " | grep -v "除外条件"
 if [ $? = "0" ];then
   sudo -S /etc/rc.d/init.d/php-fpm restart
 fi
done
}

tail -n 0 --follow=name --retry /var/log/nginx/access.log | restart
```
原因不明の http status code 499 でサービス提供が停止してしまう現象が発生中。php-fpm のリスタートで、とりあえず復旧するので、暫定対応のため作成。たまに使いたくなる時があるはずなのでメモを残す。

シェルスクリプトは苦手だわ。。。
前半が重複起動抑止のためのスクリプト。後半がリスタート用。
tail -f を受け、499 に合致し、除外条件を含まないものが来た時、php-fpm のリスタートを実行。
NiconicoAPIを作るメモ(材料編)

#モジュール、ライブラリの違い

##module
独立して扱えるソフトウェアやハードウェアの集まり

##Library
プログラムで使う関数やサブルーチン、データなどの集まり

>http://tatsu-umi.hateblo.jp/entry/20150302/1425301642

#便利そうなライブラリ

##Apache commons
Lang: java.langにあるような基本的なクラスを追加で提供してくれる
Codec: Base64とかBinaryとかのコーデック
IO: ファイルの入出力やファイル名を取り扱う機能など

>http://www.mwsoft.jp/programming/scala/commons.html

##Apache HttpComponents
Httpクライアント。
途中からCoreとClientに分担

##Jsonic
JSONエンコーダ・デコーダ

>https://jsonic.osdn.jp/

##Xerces
XMLプロセッサ

>http://msugai.fc2web.com/java/XML/xerces.html

##Junit
Javaプログラムの単体テストを行うためのツール

>http://www.techscore.com/tech/Java/Others/JUnit/index/

##log4j
Java用ログAPI

>http://www.techscore.com/tech/Java/ApacheJakarta/Log4J/1/

#クラスをまとめる時の用語
##entity
エンティティとは、一単位として扱われるデータのまとまり。なんらかの標識に対し、その"実体"であるデータの集合を指す

##method
手続き

##snapshot
開発中のプログラムのソースファイルや、稼働中のデータベースファイルなどを、特定のタイミングで抜き出したもの

#パッケージ名のルール
- わかりやすいネーミング
- 小文字で統一
- ドメインを逆にする

>https://mechalog.com/java-package
《JavaScript》範囲指定したランダムな値を得るスクリプト。


範囲指定のできるランダムな整数を返すスクリプトです。
引数に与えた値の`min`以上、`max`以下の値を返します。


## 関数本体

```js

const randRange = (min, max) => Math.floor(Math.random() * (max - min + 1) + min);

```

### 解説

```js
Math.random() * (max - min + 1) + min
```

`min`の値を基準として、そこにランダムな増減値を加算する、というような計算方法です。
ランダムな増減値は、`max - min`で増減する幅をもとめて、そこに`1`を足して、`Math.random()`関数の0以上1未満のランダムな値と掛け合わせることで表現することができます。

これで取り出せた値を `Math.floor()`関数で小数点以下を切り捨てて、整数値を取り出しています。

### 呼び出し

```js

console.log(randRange(10, 100));
// ランダムな10以上、100以下の整数

```

## おまけ

ES5で記述したやつ。

```js

var randRange = function (min, max) {
  return Math.floor(Math.random() * (max - min + 1) + min);
};

```

ちなみにこの`+1`の部分を取りはずすと、「`max`未満」の値を返すランダム関数になります。

おわります。
コンピュータ囲碁プログラム ゲームデータを作ろう

前回の記事 : 「コンピュータ囲碁プログラム 設定を作ろう」 http://qiita.com/muzudho1/items/51ae95477b669ba61f29

盤を使ったボードゲーム（今なぜ同義反復したのか）では　盤のデータを記憶するのに、
board （ボード、盤）と呼ばず position （ポジション、局面）と呼ぶ。

囲碁盤は１つだが、その上には　たくさんの局面がある。コンピューター・ゲームとしては　局面データを記憶している、という発想をする。

# ポジション
囲碁では次の **６つ** をポジション・データとして持っておけばいいのではないか。

- **盤面**
- **アゲハマ**　※黒白別
- **手番**
- **コウの位置**
- **最後の着手はパスだったか**　※連続パスは終了という重要なルールがあるので、局面ハッシュにも、最後の着手がパスだったかどうかを含意しておきたい
- **パス回数**　※黒白別に、パスを何回したか覚えておく。中国ルールの勝敗判定でパスは1回につき-1目

ここで、**局面ハッシュ** という言葉が出た。

# 局面ハッシュ
チェスなら３回、将棋なら４回、囲碁なら２回、同じ局面が出てきた時点で　対局は終了になる。バラバラでワロスｗｗｗｗ

繰り返しが許される回数で言えば、チェス１回、将棋２回、囲碁０回だ。
囲碁は盤面がでかいので　何回同じだっけ？、とか **１回だって覚えてられない** し、将棋では「おいおい千日手やる気かよ」「千日手でも構いませんよ」という間があって　**それぞれ面白い**。

**同形反復、千日手** を調べるために、今までに指した　ポジションを覚えておいて比較する必要があるわけだが……。
で、例えば　棋譜で１００手ぐらいの手数が続いたとしよう。

そこだけ見ると　たった１００手だが、思考中（指し手の探索中）は　局面を作っては消し、の繰り返しだ。将棋でも初期局面から　１手で３０局面、２手で９００局面、３手で２７０００局面ぐらいにはなるだろう。

ポジションをそんなに作ったり消したり　してられないのは分かるだろう。そこで登場するのが **局面ハッシュ** だ。

例えば　１局面が　long型の整数1つ　で表現できたりする。このような数字を局面ハッシュという。

ただし、ハッシュから　局面データに復元することはできない。データは欠損している。１つの局面から同じハッシュが出てこないかというと　そんなことはなく、ほんとは数学的に調べないといけないんだが、まあ数字をとにかくでかくして、実用的には衝突なんか起こらないようにすれば、千日手の判定とかに使える、という　数のでかさ　を利用したなかなか実践的な話しだ。

省メモリで高速、実装が楽で　なお嬉しい　**ゾブリスト・ハッシュ**　というのを１つ覚えておくといいだろう。

##同形反復を調べるために必要な情報って何だろう

ちょっと休んでから続きを書く。

- 黒石の位置
- 白石の位置
- コウの位置
- 前の対局者がパスしたか（最後に置いた石の位置が「パス」か否か）

この４つが　同形反復を調べるために必要な情報だろう。

じゃあ、アゲハマ、手番、パス回数とは何だったのか……。

日本ルールでは **アゲハマ**（取った石）は　相手にマイナス点として計算される。中国ルールでは盤上の石だけ見るので　取った石なんか勝敗に関係ないんで　アゲハマとか無い。

前述したように、中国ルールでは **パス回数** は　相手にマイナス点として計算されるので勝敗判定のために覚えておく必要がある。日本ルールではパスし放題なんで回数とか覚えておかなくていい。囲碁では基本的に何もしないよりは石を置けば有利なので、ほんとに置くと損するという場面でパスをする。

あれっ、**手番** は？ 棋譜を見ると、黒、白、黒、白、と並んでいるな？ パスをしたからといってこの順番は崩れない。あとは分かっただろう。0番目をスタートとして、0番目の局面ハッシュは手番が黒だし、もっと言えば　偶数番目の局面ハッシュは手番が黒で　奇数番目の局面ハッシュは手番が白だ。

ただ、ほんとに手番なんか関係なく　盤面だけ見て　同形反復を判定するのかもしれない。どうなんだろうか。

##コウって何？
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011818a4.png?raw=true)

取られた場所に　すぐ置くと　取り返せるケースがあるんで、その場合は　１回だけ別の場所に置いたあとでないと置けない、というルールがある。その、置いてはいけない場所を　**コウ**　と言ったり、そのコウを作ることを狙うのを「コウを狙う」、コウに石を打ち込むのを避けたりすることを「コウを避ける」とか言う。

コウを避けるために別の場所に石を置くことを「**コウ立て**」と言う。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011818a5.png?raw=true)

すると、「コウ立て」すると相手が１手　得するじゃないか、ということなんだが、
将棋で言うところの「面倒をみなければならない」ようなところに「コウ立て」を打てば　相手はコウ立てに付き合ってくれるので、
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011818a6.png?raw=true)
（図は悪手なんだが……まあ何か黒が白のめんどうを見た）

相手に面倒を見させれば　自分の手番が回ってきて　相手が「コウを作れる」場所を　こっちが先に取ってやることができる。
このとき、相手が面倒をみなければならないコウ立てを打てる場所を **コウ材** という。
![Gazo](https://github.com/muzudho/HowToMakeGame/blob/master/img/2017-03/201703011818a7.png?raw=true)
（図は、見事な捨て石が決まった。相手に小さなところを取らせて　自分は大きなところを取るという、囲碁の遊び方だ。ただ、この適当に書いたデタラメな例えの図を見ると白は大悪手すぎて黒有利に見えるが……）

コウ材を多く持っていると、コウの取り合いでは勝てるわけだ。

このコウというルールは、囲碁のルールの欠陥ではなく、囲碁を面白くするルールとなっているようだ。

# 解説おわり
これで　囲碁のゲームデータにあたる　ポジション　について解説できた。

あと、コンピュータ囲碁用語の　連（れん）　と、自殺手、勝敗判定などの説明をすれば　囲碁をするプログラムは **動かすだけなら** だいたい書けるかと思う。
それが強いか弱いかは　おいておいて……。

なんというか、モンテカルロ木探索アルゴリズム　が登場して、それ以前と比べると　ある意味で　囲碁プログラムは一気に　簡単ですっきりしたし、逆に　ディープラーニングが出てきて　ちゃんと数学を勉強してないといけなくなって、ずっと２強であとは団子状態と思われたコンピューター囲碁は　さらに頂上が果てしなくなった。プログラムとしてとっつくには、**面白いのではないか**。
Sassを始めよう:その1[導入]

# はじめに
今回は、Sassの導入をなるべく分かりやすく紹介していこうと思います。

### 環境
- macOS Sierra 10.12.3

# 導入
### 1. Terminal.appを開こう
今回はCUIで操作をしていきますので、Terminal.appを開きましょう。
ここで躓く人はIT機器を全部売って田舎へ帰ってください。

### 2. Homebrewのインストール
Homebrewのインストールを行います。すでにインストール済みの人は飛ばして構いません。

まずはHomebrewのHPにアクセスして、真ん中あたりに出てきたコマンドをコピー、Terminal.appにペーストして実行しましょう。
公式ページ: https://brew.sh/index_ja.html

こんな感じのコマンドがコピーできます。(下記のコマンドは投稿時点での最新になります。)

```shell-session:Terminal.app
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

エラーを吐かなければ成功ですので次に進みましょう。

Permissionがなんちゃらというエラーを吐いた場合、


```shell-session:Terminal.app
sudo /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

このようにはじめに"sudo"を付加して実行してください。パスワードを聞かれますが、お使いのPCのパスワードです。

### 3. Rubyをインストールする
Rubyは先ほどインストールしたHomebrewを使ってインストールします。2と同じく、既にインストールしている方はスルーしてください。

```shell-session:Terminal.app
brew install ruby
```

上記のコマンドをTerminal.appで実行します。特にエラーを吐かなければインストール成功です。

2と同じく、Permissionなんちゃらと言われた場合、sudoを付加しましょう。

### 4. Sassをインストールする。
最後はSassをインストールしましょう。
Sassというか、Sassファイル(.css)を.CSSファイル(.css)に変換するための機能です。
既にインストールしている方はこのページをそっ閉じしてください。

```shell-session:Terminal.app
gem install sass
```

これでエラーを吐かなければ導入は終了です。

Permissionなんちゃらはsudoをつけて解決させましょう。

### 5. 確認
今回の記事を見て、導入1から実行している人は特に問題なく導入が完了しているはずですが、1,2をすっ飛ばしている人は途中でつまづいている可能性があります。
インストールがどうしてもうまくいかない方は、homebrewやrubyを更新して見てください。**だいたい解決します。**
それでも動かなかった場合は、コメントにでも書いておくと返信するかもしれないです。

# Sassに触れる
みなさんとっととSassを触りたいかと思いますので、早速使って見ましょう。
といきたいところですが、今回は導入回ですのでちょっとした触りまで。

### とりあえず何か書こう
適当なディレクトリに入って、test.scssファイルを作りましょう。

```scss:test.scss
.sample {
  margin: 10px;
}
```
こんな感じで記述します。

次にTerminal.appから、test.scssのあるディレクトリにアクセスして、

```shell-session:Terminal.app
sass test.scss:test.css
```
と入力して実行しましょう。

すると、test.scssと同じ階層にtest.cssが生成されます。

```css:test.css
.sample {
  margin: 10px;
}
```
こんな感じになっていれば成功。簡単ですね。

同一階層に.sass-cacheフォルダとsourcemapファイルが生成されていますが、無視していいです。

# 最後に
導入お疲れ様でした。

今回の導入だけ見ても「Sassの何がいいんだよ...」と思ってしまうでしょう。
ですので、その辺は後々説明していきたいと思います。

次回は「Sassを活用してみよう」的なことをやっていこうかと思います。