OmniAICreator/Qiita-1.07M huggingface dataset:
シェルからPerlの正規表現を使って置換してみる

区切りが乱れたテキストをPerlで整えてみます。

```
12345  Spare parts for 2 years shift EUR 223.444,00
45678   Conveyor belt 2 m EUR 223.444,00
35678 thread joint  EUR 223.444,00
```


#`m//`でキャプチャしてプリント
コードです。

```Perl
#!/usr/bin/perl
#パターンマッチを試し、マッチしたらキャプチャした部分をプリント

use strict;
use warnings;

my $regex = '^(\d{5,})\s+(.*)\s+(EUR.*)$';    #1:正規表現パターン

while (my $line = <>) {                       #2:標準入力から一行ごとに読み込む
	if ($line =~ m/$regex/) {                  #3:行が先ほどのパターンとマッチするか？
		print "$1\t$2\t$3" . "\n\n";          #4:マッチしたらキャプチャした箇所をプリント
	}
}
```

1で番号、品名、価格をタブ区切りにします。
2で、標準入力からテキストを読み込みます。
3では、行がパターンとマッチするかどうかを判定します。マッチすれば`print`に進みます。

出力です。タブで区切ることができました。

```
12345   Spare parts for 2 years shift   EUR 223.444,00
45678   Conveyor belt 2 m       EUR 223.444,00
35678   thread joint    EUR 223.444,00
```

#`s///`で置換する
今度はマッチした文字列を置換します。得られる出力は先ほどと同じです。

```Perl
#!/usr/bin/perl
use strict;
use warnings;

my $regex = '^(\d{5,})\s+(.*)\s+(EUR.*)$';

while (my $line = <>) {
	my $line =~ s/$regex/$1\t$2\t$3/;
	print "$line\n";
}
```
VFページ(JavaScriptリモーティング)

###クライアント側JSの例
```javascript:
<script>
//read management for the target object
    $(function(){
        XXXXController.setObjectRead('{!Record.Id}', function (result, event){
            if(event.status){
                //success
                データは result変数に入っている
            }else if (event.type === 'exception') {
                console.log('error:' + event.message);
                console.log('where:' + event.where);
            }else{
                console.log('error:' + event.message);
            }
        });
    });
</script>
```

###サーバー側メソッドの例
```Java:
@RemoteAction
public static void setObjectRead(String objectId){
    //update read state
    XXXXManager.setObjectReadByLoginUser(objectId);
}
```

```java
@RemoteAction
@ReadOnly
public static List<String> getXXXData(){
    List<String> returnData = new List<String>();
    ・・・
    //JS側にはArrayが返る
    return returnData;
}
```
SOSL

###検索キーワードの指定
開発者コンソールでは{}でくくる
`FIND {mykeyword}`
Apexでは ' でくくる
`[FIND 'mykeyword' IN ALL FIELDS ...]`
`'FIND \'' + soslQueryStr + '\' IN ALL FIELDS '`

###ナレッジを検索する例
`FIND {12*} IN ALL FIELDS RETURNING KnowledgeArticleVersion(Id, ArticleType, Title, Summary, LastPublishedDate, KnowledgeArticleId Where publishStatus='online' and Language='ja')`



`
ナレッジ/データカテゴリ

###SOQLでのデータカテゴリの取得
以下のサブクエリで取得できる
`(SELECT DataCategoryGroupName,DataCategoryName FROM DataCategorySelections)`
###データカテゴリを条件として指定
WHERE句の後に定型句を挿入（ORDER BYよりは前に）
`WITH DATA CATEGORY Severity__c below All__c ` 特定のカテゴリ配下全て
`WITH DATA CATEGORY Severity__c (Category1__c, Category2__c)`   個別に指定
Javascriptで名前空間を簡単に使う

# 概要

Javascriptで名前空間を簡単につかう方法を考えてみたよ。

# ヘルパー関数を作る
追記：実際つかってたら動かないことに気付いたので修正した。使用例はそのまま動くはず。

```javascript
(function() {
	function splitNs(nsStr) {
		return nsStr.split(".");
	}

	function ret(nsStr) {
		function ret_helper(rt, symo) {
			if(symo.length > 0) {
				var now = symo.shift();
				if(!(Object.prototype.toString.call(rt[now]) === '[object Object]')) {
					rt[now] = {};
				}
				return ret_helper(rt[now], symo);
			} else {
				return rt;
			}
		}

		return ret_helper(window, splitNs(nsStr));
	}


	window.use = function(nsStr, self) {
		var nss = splitNs(nsStr);
		var obj = self[nss[0]];
		for(var i = 1; i < nss.length; i += 1) {
			obj = obj[nss[i]];
		}
		self[nss[nss.length - 1]] = obj;
	};

	window.ns = function(sym, fn) {
		fn.call(ret(sym));
	};
})();
```

# 使ってみる

- 使用例

```Javascript
ns("a.b", function() {
	this.Cls = function() {
		function qoo() {
			console.log("qoo!");
		}

		var pub = {};
		pub.qoo = qoo;
		return pub;
	};
});
ns("a.b.c", function() {
	this.x = 1;
});

$(document).ready(function() {
	(function() {
		use("a.b.c", this);
		use("a.b.Cls", this);

		console.log("c.x", c.x);
		(new Cls()).qoo();
	})();
});
```

- 出力

```
c.x 1
qoo!
```
Terraformでcountをifのように使う

## はじめに

[Terraform](https://www.terraform.io/)でインフラ構成管理をしていると同じtfファイルを使いながらも、特定の環境だけに作りたいリソースが出てくることがあります。

例えば開発環境には社内からのアクセスのみ許可する、といった具合にです。

Terraformには`if`のような条件分岐がないものの、`count`を使うことで上記のことを実現できます。

## ベースとなるtfファイル

以下の3つのtfファイルをベースにして説明します。なお利用したTerraformのバージョンはv0.8.4です。

```text:provider.tf
provider "aws" {}
```

```text:variables.tf
variable "is_dev" {
  default = "0"
}
```

```text:vm.tf
data "aws_ami" "ubuntu" {
  most_recent = true
  filter {
    name = "name"
    values = ["ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-*"]
  }
  filter {
    name = "virtualization-type"
    values = ["hvm"]
  }
  owners = ["099720109477"]
}

resource "aws_security_group" "test-sg-for-all" {
  name = "test-sg-for-all"
  vpc_id = "vpc-xxxxxxxx"
  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = [
      "xxx.xxx.xxx.xxx/32"
    ]
  }
  tags {
    Name = "test-sg-for-all"
  }
}

resource "aws_instance" "test-instance" {
  ami = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  subnet_id = "subnet-xxxxxxxx"
  security_groups = ["${aws_security_group.test-sg-for-all.id}"]
  tags {
    Name = "test-instance"
  }
}
```

`variables.tf`に定義した`is_dev`変数は、開発環境のときは`1`で、それ以外のときは`0`が指定されているものとします。

## 開発環境のみに作成するリソースを作る

`is_dev`変数を`count`に指定(`count = "${var.is_dev}"`)することで、開発環境のみに作成するリソースを作ることができます。

```text:sample
resource "aws_security_group" "test-sg-for-dev" {
  count = "${var.is_dev}"
  name = "test-sg-for-dev"
  vpc_id = "vpc-xxxxxxxx"
  egress {
    from_port = 0
    to_port = 0
    protocol = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
  ingress {
    from_port = 22
    to_port = 22
    protocol = "tcp"
    cidr_blocks = [
      "xxx.xxx.xxx.xxx/32"
    ]
  }
}
```

## 開発環境のみに作成するリソースと通常のリソースを混ぜて他のリソースで使う

上記で作成した開発環境用の`test-sg-for-dev`と全環境で作成される`test-sg-for-all`を使ったEC2インスタンスを作成するサンプルが以下になります。

```text:sample
resource "aws_instance" "test-instance" {
  ami = "${data.aws_ami.ubuntu.id}"
  instance_type = "t2.micro"
  subnet_id = "subnet-xxxxxxxx"
  security_groups = ["${
    compact(
      concat(
        aws_security_group.test-sg-for-dev.*.id,
        list(aws_security_group.test-sg-for-all.id)
      )
    )
  }"]
  tags {
    Name = "test-instance"
  }
}
```

ポイントは以下の点です。

- `count`を使って作成したリソースを`aws_security_group.test-sg-for-dev.*.id`のようにListで取得する。
- 全環境用のリソースは`list()`を使い、Listにする。
- それら2つのListを`concat`を使い結合する。
- `is_dev=0`のとき`aws_security_group.test-sg-for-dev.*.id`が空文字になるのを`compact`で取り除く。

## まとめ

Terraformの`count`を使って`if`のような条件分岐を実装することができました。

Terraformの[Interpolation Syntax](https://www.terraform.io/docs/configuration/interpolation.html)にはListを扱う様々なSyntaxが用意されているので、これらを利用してある程度は条件分岐を作ることができます。
python pandasでの列（column）へのSeriesの追加

鬼ハマりしたので投下．

## 追加するSeriesのIndexが0からのとき

``` py
>>> s1 = pd.Series(data=[10,20,30])
>>> s1
0    10
1    20
2    30
dtype: int64

>>> s2 = pd.Series(data=[100,200,300])
>>> s2
0    100
1    200
2    300
dtype: int64
```

という2つのSeriesをDataFrameの列（column）として追加する．

```py
>>> df = pd.DataFrame()
>>> df[1]=s1
>>> df[2]=s2
>>> df
    1    2
0  10  100
1  20  200
2  30  300
```

これは簡単．


## 追加するSeriesのIndexが異なるとき

```py
>>> s1 = pd.Series(data=[10,20,30], index=[1,2,3])
>>> s1
1    10
2    20
3    30
dtype: int64
>>> s2 = pd.Series(data=[100,200,300], index=[2,3,4])
>>> s2
2    100
3    200
4    300
dtype: int64
```

s1とs2のindexは0からではなく，共通していないものがある．

このとき先ほどと同じようにDataFrameに追加すると

```py
>>> df[1]=s1
>>> df[2]=s2
>>> df
      1      2
0   NaN    NaN
1  10.0    NaN
2  20.0  100.0
```

と個数固定で勝手に0から入っていってしまう．

元s1[3]が見たいと思って無理やりdfの中身を見ようとするとエラーになる．

```py
>>> s1[3]
30
>>> df[1][3]
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/series.py", line 603, in __getitem__
    result = self.index.get_value(self, key)
  File "/usr/local/lib/python2.7/dist-packages/pandas/indexes/base.py", line 2169, in get_value
    tz=getattr(series.dtype, 'tz', None))
  File "pandas/index.pyx", line 98, in pandas.index.IndexEngine.get_value (pandas/index.c:3557)
  File "pandas/index.pyx", line 106, in pandas.index.IndexEngine.get_value (pandas/index.c:3240)
  File "pandas/index.pyx", line 154, in pandas.index.IndexEngine.get_loc (pandas/index.c:4279)
  File "pandas/src/hashtable_class_helper.pxi", line 404, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:8564)
  File "pandas/src/hashtable_class_helper.pxi", line 410, in pandas.hashtable.Int64HashTable.get_item (pandas/hashtable.c:8508)
KeyError: 3
```

こういうときは，[```pandas.concat```](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html)を使う．

```py
>>> df = pd.DataFrame()
>>> df = pd.concat([df, s1], axis=1)
>>> df
    0
1  10
2  20
3  30
>>> df = pd.concat([df, s2], axis=1)
>>> df
      0      0
1  10.0    NaN
2  20.0  100.0
3  30.0  200.0
4   NaN  300.0
```

引数に```axis=1```を入れるとcolumn方向に追加される．また，ないところには```numpy.nan```が入る．

**ただし，columnが0になる．**
引数で指定できないっぽいので，まずSeriesを1次元のDataFrameにしてからconcatする．

```py
>>> df = pd.DataFrame()
>>> df = pd.concat([df, pd.DataFrame(s1, columns=[1])], axis=1)
>>> df = pd.concat([df, pd.DataFrame(s2, columns=[2])], axis=1)
>>> df
      1      2
1  10.0    NaN
2  20.0  100.0
3  30.0  200.0
4   NaN  300
```
CodeIQ「『キャリー・オーバー』問題」に参加しました。


[CodeIQ「『キャリー・オーバー』問題」](https://codeiq.jp/q/3097)の掲載期間が終わったということで、自分の提出コードを公開します。なおほかの方の解答は[Togetter](https://togetter.com/li/1070843)にまとめられてます。また解説記事もCodeIQMagazineに掲載される――はずなので、その際はリンクを張りたいと思います。おぼえていたら(´・ω・｀)

```rb:3097.rb
n, c = STDIN.gets.split.map(&:to_i)

# ある一桁の足し算に着目したとき、繰り上がりに関する挙動は次の3種類に分類できる。
# type-a : 前桁の繰り上がりに関係なく、繰り上がりが発生する。
# type-b : 前桁が繰り上がったとき、繰り上がりが発生する。
# type-c : 前桁の栗が上がりに関係なく、繰り上がりは発生しない。
# まずはある一桁の計算において、上記のa,b,cに該当する組合せの総数をそれぞれ求める。
types = Hash.new(0)
[*0..9].repeated_permutation(2) do |x, y|
    types[:a] += 1 if x + y > 9
    types[:b] += 1 if x + y == 9
    types[:c] += 1 if x + y < 9
end

# a,b,cを並べて、その並べ方において繰り上がりが発生する回数を記録しておく。
# a,b,cの並べ方は重複順列を利用すると過不足なく求めることができる。
digits = Hash.new{|hash, key| hash[key] = []}
%i(a b c).repeated_permutation(n) do |digit|
    flg = false # 前桁が繰り上がったかどうかを示すフラグ。
    cnt = (0...digit.size).reduce(0) do |sum, i|
        flg = digit[i] == :a || (flg && digit[i] == :b)
        flg ? sum + 1 : sum
    end
    digits[cnt] << digit
end

# 繰り上がりの回数がc回になる、a,b,cの並べ方から求めるF(n, c)を計算する。
ans = digits[c].reduce(0) do |sum, digit|
    a, b, c = %i(a b c).map{|t| digit.count(t)}
    sum + (types[:a] ** a * types[:b] ** b * types[:c] ** c)
end

p ans

```

```py:3097.py

import itertools, collections

if __name__ == '__main__':
    n, c = map(int, input().split(' '))

    types = collections.defaultdict(int)
    for x, y in itertools.product(range(10), repeat=2):
        if x + y >  9: types['a'] += 1
        if x + y == 9: types['b'] += 1
        if x + y <  9: types['c'] += 1

    digits = collections.defaultdict(list)
    for digit in itertools.product(('a', 'b', 'c'), repeat=n):
        flg = False
        cnt = 0
        for i in range(len(digit)):
            flg = digit[i] == 'a' or (flg and digit[i] == 'b')
            if flg: cnt += 1

        digits[cnt].append(digit)
    
    answer = 0
    for digit in digits[c]:
        a, b, c = (digit.count(symbol) for symbol in ('a', 'b', 'c'))
        answer += types['a'] ** a * types['b'] ** b * types['c'] ** c
    
    print(answer)

```

提出言語はRubyとPython3――ですが、違う言語なのに見た目がほぼ一緒ですね(´・ω・｀) 同一人物が同一の思想のもとコード書いているので、似通ってくるのは仕方ないといえばその通りかもしれません(言い訳)

詳しい解き方はRubyのソース内コメントを参考にしていただくとして、簡単な感想だけ述べておきます。本問は足し算において繰り上がりの発生回数を求めるというものでした。考えられる整数の組み合わせすべてを求めたあとその総和を求める、つまりは全探索をすると計算量が大きくなりすぎるので、何とか計算量を減らす必要があります。わたしの場合は「繰り上がりのパターン」による場合分けを利用することにより、計算量を減らすことに成功しましたが、漸化式など、より数学的な回答方法もありそうですね。
Quiverが突然初期化された場合の対処法


Quiverを開くとチュートリアルのメモしかなく、目の前が真っ白になりました。試行錯誤の上、復旧することができたので共有します。（ただし、Dropboxと同期するためにディレクトリを移動させるとまた読み込まなくなります...）

## 状況

* Quiver 3.0.3
* Quiver.qvlibraryをDropbox上で管理している
* Quiverを開くと初期のチュートリアルの状態
* 設定の同期からDropboxのQuiver.qvlibraryを選択してもインデックス作成のプログレスバーは表示されるが元のチュートリアル画面に戻る
* Dropbox上のQuiver.qvlibraryを開くとQuiverが落ちる
* アンインストール・再インストールでも解決しない
* 別のMacBook Proからは同じバージョンのQuiverから同じDropboxのファイルが開ける（！？）

## 対策

※下記の対策は私の環境では上手く行きましたが最悪ノートが消失する可能性がありますので、あくまで参考としてください。

* Quiverをアンインストール
* `$HOME/Library/Containers/com.happenapps.Quiver` を削除
* Quiverをインストール
* DropboxのQuiver.qvlibraryを作業用ディレクトリにコピー（/tmpなど）
* 作業ディレクトリのQuiver.qvlibraryにターミナルで入って作業

```
$ cd /tmp/Quiver.qvlibrary

Inbox, Trash, Tutorialの復旧は諦める
$ rm -rf Inbox.qvnotebook Trash.qvnotebook Tutorial.qvnotebook

他のノートブックを新規インストールしたQuiverのデータディレクトリに移行
$ mv *.qvnotebook "$HOME/Library/Containers/com.happenapps.Quiver/Data/Library/Application Support/Quiver/Quiver.qvlibrary/."
```

* この時点でQuiver上のノートブックが復旧されている
Railsのログをsyslogに出す

## 概要
Railsのログをsyslogで出す。
エラーレベルによってファイルを分けたかったのだが、rails側で設定するのが大変そうだったので、syslogを使うことにした。

## 関連記事
- [任意のログをlogrotateを使って管理する](http://qiita.com/Esfahan/items/a8058f1eb593170855a1)
- [PythonでSysLogHandlerを使ってsyslogでログを出力する](https://qiita.com/Esfahan/items/7888914dca0e8d23eac3)

## 環境
- CentOS release 6.7
- ruby 2.3.1p112
- Rails 5.0.0.1

## gem
syslog-loggerというgemをインストール
https://github.com/ngmoco/syslog_logger

```rb:Gemfile
gem 'syslog-logger', '~> 1.6', '>= 1.6.8'
```

## railsの設定
ログをsyslogに出す環境の設定ファイルに下記を追記。

```rb:config/environments/production.rb
Rails.application.configure do
# *snip*

  config.logger = Logger::Syslog.new
  config.logger = Logger::Syslog.new('appname', Syslog::LOG_LOCAL7)

# *snip*
end
```

## syslogの設定

/etc/rsyslog.confに下記を追記

```bash:/etc/rsyslog.conf
!rails
# 全てのログを記録
*.*  /var/log/production-all.log
# notice以上のログを記録
*.notice  /var/log/production-notice.log
# errのみを記録（crit, alertなどは記録されない）
*.=err  /var/log/production-err.log
# noticeとerrの2つを記録
*.=notice;*.=err  /var/log/production-notice-err.log
```

このままではrailsのログが、/var/log/messagesにも出力されてしまうので、出ないように下記の部分を変更する。

```bash:/etc/rsyslog.conf
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
- *.info;mail.none;authpriv.none;cron.none;                /var/log/messages
+ *.info;mail.none;authpriv.none;cron.none;appname.none                /var/log/messages
```


## rsyslogを再起動
再起動して設定を反映

```
# /etc/init.d/rsyslog restart
```

## ログレベル
ログのプライオリティ一覧
上から順にプライオリティが高い。

| ログレベル | 内容 |
| :-- | :-- |
| emerg | システムが使用不能なレベル |
| alert | すぐになんとかしないといけない状態 |
| crit | クリティカルなレベル |
| err | エラー |
| warning | ワーニング |
| notice | ちょっと注意したほうがいいレベル |
| info | 情報 |
| debug | デバッグレベル |

引用元: http://www.usupi.org/sysad/207.html





## 余談
ググると、こちらのgemの情報もたくさん出てきたが、
assetsのログを出さないために、
`config.assets.quiet = true`
を設定するとエラーが起きるため、使用を断念した。

**gem**
http://github.com/seattlerb/sysloglogger

```rb:Gemfile
gem 'SyslogLogger'
```

**エラーになる設定**

```rb:config/environments/production.rb
Rails.application.configure do
# *snip*

  config.logger = Logger::Syslog.new
  config.logger = Logger::Syslog.new('appname', Syslog::LOG_LOCAL7)

  # この設定がtrueだとエラーになる
  config.assets.quiet = true

# *snip*
end
```

**エラー内容**

```
#<NoMethodError: super: no superclass method `silence' for #<Syslog::Logger:0x007f74d6141098>>
```

参考:https://github.com/dwbutler/logstash-logger/issues/86


## ログローテートの設定はこちら
[任意のログをlogrotateを使って管理する](http://qiita.com/Esfahan/items/a8058f1eb593170855a1)


## 参考
[今すぐ実践！Linuxシステム管理](http://www.usupi.org/sysad/207.html)
nodebrew のインストール (Mac OS X 10.11 + Homebrew)

```
% brew install nodebrew
% nodebrew -v # インストール確認
% nodebrew setup # 初期設定 (~/.nodebrew が作成される)
Fetching nodebrew...
Installed nodebrew in $HOME/.nodebrew

========================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================
```

上記の通りにパス設定．

```bash
# Nodebrew
[ -d "$HOME/.nodebrew/current/bin" ] && export PATH=$HOME/.nodebrew/current/bin:$PATH
```

参考:

- [Macにnode.jsをインストールする手順。 - Qiita](http://qiita.com/akakuro43/items/600e7e4695588ab2958d)
- [Macにnodebrew（node.js, npm）をインストールする手順 - Qiita](http://qiita.com/oreo3@github/items/622fd6a09d5c1593fee4)
- [Homebrew で nodebrew をインストールしたら少々はまった - ngzmのブログ](http://ngzm.hateblo.jp/entry/2016/09/22/172500)
【Rails】form_forの使い方

#form_forとは
モデルの新規インスタンスに値を追加して保存したい時に使用するヘルパーメソッド。
フォームが簡単に作成でき、入力されたデータをテーブルに保存できる。

#フォームの作成
レビューのフォームを想定。
###コントローラーの実装

```ruby:reviews_controller.rb
  def new
    @review = review.new
  end

  def create
    Review.create(create_params)
    render action: :new #表示したいビューを表示
  end

  private
  def create_params
    params.require(:review).permit(:text)
  end
```
###ビューの実装
```ruby:new.html.haml
%h1 Review
  = form_for @review do |f|
    = f.label :text, "レビュー"
    = f.text_field :text
    = f.submit "Send"
```

・モデルのインスタンスを引数に持つ。

・引数のインスタンスが何も情報を持っていなければcreateアクション、すでに情報を持っている場合はupdateアクションに自動的に振り分けられる。

・フォームに入力された値は、submitボタンを押した瞬間にモデルクラスの新規インスタンスにそれぞれの属性の値としてセットされ、対応するテーブルのカラムに保存される。

#ネストをした場合
groupsとmessagesが１対多関係。
ネストした場合、引数のインスタンスは二つになる。

```ruby:config/routes.rb
resources :groups do 
  resources :messages
end
```
```ruby:message/new.html.haml
= form_for [@group, @message] do |f|
...
```
/proc/[pid]/oom_adjとは？

# /proc/[pid]/oom_adjとは？

oom_adjはプロセスごとに設定できる値で、これによってOOM KillerにKillされる優先度を変更できます。
[Linux OOM Killerについて](http://qiita.com/konpyu/items/20d1989d1251d805cf3b)

## 子プロセスに継承される
新しいプロセスは親のoom_adjを受け継ぎます。

## 設定できる値の範囲

- 1～15: 大きいほどkillされやすい
- 0: 初期値
- -16～-1: 小さいほどkillされづらい
- -17: killされない

## 俺さん(20代♂, 会社員)の場合
- dockerでサーバーを起動しているが、アクセス次第でメモリ消費量が増えてOOM killerが発動することがある。
- サーバーが落ちたら再起動するスクリプト経由でサーバーを起動しているので、サーバー本体がkillされれば問題無いのだが、なぜかいつも再起動するスクリプト本体がkillされてしまう。
- サーバー本体のoom_adjを上げてサーバー本体が先にkillされるようにした。

```bash:例1_簡単な使い方
./change_oom_adj.sh 5 ls
```

```bash:例2_サーバー起動スクリプト
while :
do
  ./change_oom_adj.sh 5 bundle exec unicorn_rails -c /myapp/config/unicorn.rb -E ${RAILS_ENV} -p 3000
  sleep 1
done 
```

## oom_adj変更スクリプト
```bash:change_oom_adj.sh
#!/bin/bash

set -e

usage_exit() {
  echo "Usage: $0 [oom_adj] command" 1>&2
  exit 1
}

oom_adj=$1
shift;

number_regex='^-?[0-9]+$'
if ! [[ $oom_adj =~ $number_regex ]] ; then
  usage_exit
fi

pid=$$
echo $oom_adj > /proc/$pid/oom_adj

"$@"
```

## 参考文献
- http://man7.org/linux/man-pages/man5/proc.5.html
githubで自分のリポジトリをforkする

先人がいますが、もう少し簡単にできたので

http://qiita.com/JhonnyBravo/items/21feb3d599fc22743224

1.ヘッダーの「＋」からImport repositoryを選択
![スクリーンショット 2017-01-24 22.10.02.png](https://qiita-image-store.s3.amazonaws.com/0/32169/35118909-cce4-c98d-d78b-51698817979e.png)

2.forkしたいリポジトリのURLを入れる
![スクリーンショット 2017-01-24 22.10.10.png](https://qiita-image-store.s3.amazonaws.com/0/32169/d8f4c340-ee7e-9af1-53fa-59dd00565634.png)



これだけ。正確にはforkにはなっておらず、
「forked from hoge/hogehoge」とかは出ない模様
eZ Publish で動的に項目値を追加する eZMatrix 属性

「関連オブジェクト(複数)」属性でも実現できるが、入力値がテキストのみの場合は [eZ Matrix クラス](http://pubsvn.ez.no/doxygen/4.7/html/classeZMatrix.html)で定義されている「行列」属性を使うと、属性値を比較的容易に動的に追加できる。

* [ezmatrix / Objects / Reference / 4.x / Technical manual / eZ Publish / Documentation - Doc](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Objects/ezmatrix)

## 使用例
例えば1列目にURL、2列目にリンクテキストを入力させる前提のfoo属性を作成した場合。なお、`{foreach}` を使って2列以上を同時に取得する場合は、列の識別子名を使うことはできないようだ。

```smarty
<ul>
{foreach $node.data_map.foo.content.matrix.rows.sequential as $row}

  <li><a href="{$row.columns[0]}">{$row.columns[1]}</a></li>
{foreach}

</ul>
```

## Drupal
Drupal では標準で、フィールドの「値の数」に「無制限」を設定することで対応できる。
brewでimagemagickをupgradeしてしまい、rmagickでエラーが出る場合

少々ハマったのでメモ。

うっかりbrew upgradeを実行して、imagemagickが７系になってしまうと、rmagickがエラーを吐いて動かなくなる場合があります。そんな場合の対処法

```bash
brew unlink imagemagick
brew uninstall imagemagick
brew install imagemagick@6
brew link imagemagick@6 --force
```

imagemagick@6ってのがバージョン６系で、rmagick用に残してあるみたいです。
ライブラリが絡むbrew upgradeは慎重に、、、
RailsのFormオブジェクトの日本語化


ちょっとハマったのでメモ。


## 環境

- Ruby 2.3.0
- Rails s5.0


## やりたかったこと

独自に定義したFormオブジェクトの日本語化したい。

## 原因とその対応

例えば以下のようなFormオブジェクトを作成したときに、

app/models/forms/share.rb

```ruby
class Forms::Share
  include ActiveModel::Model
  attr_accessor :group_id, :user_id
end
```

ja.ymlにてactiverecordアトリビュート以下に書いても反映されない。

```yml
ja:
  activerecord:
    attributes:
		forms/share:
			group_id: グループ
			user_id: ユーザー
```

正しくは、activemodelアトリビュート以下に書く。

```yml
ja:
  activemodel:
    attributes:
		forms/share:
			group_id: グループ
			user_id: ユーザー
```

## 調べ方

bundle openでActiveModelを開いて、human_attribute_nameメソッドあたりをにbinding.pryを置いて動作を調べた。

```ruby
module ActiveModel
  module Translation
  
  	~(省略)~

    def human_attribute_name(attribute, options = {})
      
      ~(省略)~
      
      options[:default] = defaults
      I18n.translate(defaults.shift, options)
    end
```

最後の行をhuman_attribute_nameメソッドの最後の行を実行してみると、

```ruby
> I18n.translate(defaults.shift, options)
=> "translation missing: ja.attributes.group_id"
```

"translation missing"が発生しているので日本語化できていないんだなと。で、そのパラメータを見てみると、

```ruby
> defaults.shift
=> :"activemodel.attributes.forms/share.group_id"
```

activemodel.attributesという値を渡していることがわかり、ja.ymlの設定ミスに気づいたのでした。



## 参考にした記事

原因の調べ方のあたり特に参考になりました。

[Railsのvalidate周りのi18n対応でハマったこと](http://qiita.com/astap/items/c07e0b08273fd97aaa91)
ConoHaにWEBサーバーを立ち上げる（１）

ConoHaVPSを使って、WEBサーバーを立ち上げるまでの手順の記録

## 目標

- Python+Flask+mySQL+ReactなWEBアプリを複数立ち上げる
- ソース管理はGitで行い、ローカルのPCからpushしたソースがWEBアプリに反映される
- プロジェクト管理をRedmineで行い、Gitと連携する

## ConoHaでサーバーを構築する

ConoHaのコントロールパネルからサーバー追加を選ぶ
![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/8e66dacf-c15b-2a2d-f220-9770fe7f9b70.jpeg)
、

イメージタイプ：「アプリケーション」
アプリケーション：「Redmine」
rootパスワードを設定し「追加」

SSH Keyを「新しいキーを登録」登録方法「自動生成」にして「キー登録ボタン」を押す
![13.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/5098dfa9-d9e8-56eb-1e84-e0f62dd446b2.jpeg)

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/7e960ddd-fd26-447c-a3fb-e6f895628521.jpeg)
「保存」を押す

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/52692cc2-7a58-18a2-c57e-1b97ab9da7ee.jpeg)
ダイアログが出たら「ダウンロード」を押す

![7.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/75839e86-6322-9699-1821-fe283ce52671.jpeg)
ダウンロードしたファイルを、任意の場所に保管しておく


出来上がるまで待つ

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/75c0531e-7fd9-88a8-d85f-fb3b3d5ffa94.jpeg)
ステータスが「起動中」になったらネームタグを押す

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/5b521058-4dcd-a4fe-a730-4ee1341e3ed2.jpeg)
ipアドレスを記録しておく

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/5babe32a-0bda-1114-aec2-ce4aabfb29a2.jpeg)
左側の「SSH Key」ボタンを押して画面が切り替わったら「パブリックキー」ボタンを押す

## 構築したサーバーにSSHでログインする

![8.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/55f73b5f-976d-da60-9b0b-443e228796a6.jpeg)
Tera Termを立ち上げ、「キャンセル」ボタンを押す

メニューから「設定」-「SSH認証」を選ぶ
![9.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/822fae0f-5a99-0ebc-8faa-30bae537e529.jpeg)

![10.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/89adfc1d-2f46-c6ae-01ac-36dd2ecddce1.jpeg)
ユーザー名：root
秘密鍵ボタンを押して、「パブリックキー」ボタンを押して得たファイルを選択して、OKボタンを押す

「ファイル」-「新しい接続」と選ぶ
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/863fd2dc-5553-3c9b-f838-cc2db966198e.jpeg)
ホストの欄にサーバーのIPアドレスを入れてOKを押す（セキュリティ警告が出ても続行）

![12.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/55695cad-8db7-2d49-3cbb-cc3728c78783.jpeg)
パスフレーズにrootのパスワードを指定してOK

![14.jpg](https://qiita-image-store.s3.amazonaws.com/0/99652/24df0e92-a77b-b0aa-14df-f38c2289b09f.jpeg)
サーバーに接続

ここに表示されているIPアドレスにアクセスすると、いきなりredmineが立ち上がります


（IPアドレスが、微妙に違うのは、サーバーを作り直して再度キャプチャしたからです。
ちなみに、このサーバーも現在ありません）
初めてCakePHP3をインストールしてみる


Qiitaに初めて投稿してみました。
今後は徐々に投稿していけたらなぁ〜と思ってます。
まだまだプログラムについて分からないことだらけだけど、そろそろCakePHP3を勉強したいなぁ〜と思いはじめたので、
今回初めてCakePHP3のインストールに挑戦してみたいなと思います。

[CakePHP Cookbook](https://book.cakephp.org/3.0/ja/installation.html "CakePHP Cookbook") のインストールを参考にしてインストールしたいと思います。

## システム要件

* HTTPサーバー（Apache。mod_rewrite が推奨）
* PHP 5.5.9 以上 (PHP 7 も含む)
* PHP mbstring 拡張
* PHP intl 拡張

システム要件として上記は必要最低限準備が必要なので、今回はVagrant上にシステム要件を満たす仮想環境を準備しました。

## インストール方法について

Composerを使用してインストールする方法と[GitHub](https://github.com/cakephp/cakephp/tags "GitHub")にプリインストール版があるので、そこからダウンロードしてインストールする方法があるみたいです。
今回は折角なのでComposerを使用してインストールしてみたいと思います。
**※Composerは事前にサーバにインストールしておく必要があります。**

## CakePHP プロジェクトを作成

CakePHP のプロジェクトを作成するためには下記のコマンドを実行します。

```
php composer.phar create-project --prefer-dist cakephp/app my_app_name
```

または Composer にパスが通っているのであれば下記のコマンドを実行します。

```
composer self-update && composer create-project --prefer-dist cakephp/app my_app_name
```

**my_app_name はインストール先のフォルダを指定します。**


![スクリーンショット 2017-01-24 21.21.13.png](https://qiita-image-store.s3.amazonaws.com/0/13180/b9c2a6b6-59c6-5b60-13e6-c705833f4140.png "スクリーンショット 2017-01-24 21.21.13.png")

とりあえずCakePHP3のインストールは無事完了しました。
いやーComposerを使用してインストールするのは楽だなぁ〜（笑）

次はチュートリアル等やっていきたいと思います。
macOS NSCollectionViewを使いたくて唯一動かせた サンプル（2017/01/24）

# こちらが唯一動かせたサンプル

https://www.youtube.com/watch?v=26yik3rnPiQ&list=LLYsi52KnsdBJZQPSsXJ4FNA&index=1

## コメント
まる二日間くらい、NSCollectionViewを動かして見るために頑張った。やっとたどり着いたサンプルをここに貼っておく。
以下の２つが上手く行かなかった。その他stackOverflowの回答を試したけど、動かせたものがなかった。

- https://www.raywenderlich.com/120494/collection-views-os-x-tutorial
- http://qiita.com/hanamiju/items/8015bce7b345a1dbde4d

普段書いているノートをまとめてくれるアプリを作成しようと頑張ってます。
その開発を進めるにつれてノートをまとめていきたい。

swiftのmacOSの日本語リファレンス少ない！
ネスト構造について

ネスト構造はRailsに限らず、SCSSやhamlにも使う概念なのでここで説明したいと思います。


ネストはある記述の中に入れ子構造で別の記述をする方法です。


下記はあるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することを記述しています。この場合はcommentsのルーティングのパスの中にコメントに結びつくツイートのidの情報になります。

##rails版
```
Rails.application.routes.draw do
  devise_for :users
  root 'tweets#index'
  resources :tweets do
    resources :comments, only: [:create]
  end
  resources :users, only: [:show]
end
```

上記はあるコントローラへのルーティングの記述の中に、別のコントローラへのルーティングを記述することを記述しています。この場合はcommentsのルーティングのパスの中にコメントに結びつくツイートのidの情報になります。


##haml版

```.text-main
        .text-header
            .text-header__left
                
            .text-header__right
```

hamlの構造でも同じことが言えます。この場合はtext-mainの中にrext-mainの中にtext-headerが入れ子構造になっており、text-hederがtext-heder__leftとtext-heder__rightにいりこ構造になっています。ここで注意しておきたいのがネスト構造をしっかり行わないとそれに伴うscssなどが反映されないことに注意したいところです。
ユーザーエージェントでスマホとPCを判別し、処理を変化させるPHPネタ

#やりたいこと
スマホにはアレ、PCにはコレ
っていうのをPHPでやる。

Web担なので、HTMLの内容を端末によってちょこっと変えたいときに使う。
(できればやりたくないが…)

#コード
最初にPHPでこう定義すればOK

```php
function ua_smt (){
//ユーザーエージェントを取得
$ua = $_SERVER['HTTP_USER_AGENT'];
//スマホと判定する文字リスト
$ua_list = array('iPhone','iPad','iPod','Android');
 foreach ($ua_list as $ua_smt) {
//ユーザーエージェントに文字リストの単語を含む場合はTRUE、それ以外はFALSE
  if (strpos($ua, $ua_smt) !== false) {
   return true;
  }
 } return false;
}
```

#使い方
```php:PHP
if (ua_smt() == true) {
 //スマホの場合の処理
} else {
 //それ以外の場合の処理
}
```

サイトで使うときはこういう感じで使っている

```html+php:HTML+PHP
<html>
<body>
あなたは…<br>

<?php if (ua_smt() == true): ?>
  <!-- スマホの場合 -->
  <p>スマホで閲覧中です。</p>

<?php else: ?>
  <!-- それ以外の場合 -->
  <p>PCで閲覧中です。</p>

<?php endif; ?>

</body>
</html>
```

これと組み合わせて使ったりなど
[PHP条件分岐と文字列検索を使ってHTMLを出し分けする](http://qiita.com/bass-inu/items/86cf7c963b3557284e72)


## コピペ用

```php:コピペ用
<?php
function ua_smt (){
$ua = $_SERVER['HTTP_USER_AGENT'];
$ua_list = array('iPhone','iPad','iPod','Android');
foreach ($ua_list as $ua_smt) {
if (strpos($ua,$ua_smt) !== false){return true;}
} return false;
}
?>


<?php if (ua_smt() == true): ?>

<?php else: ?>

<?php endif; ?>
```
ヒーリングマップ の作りかた

ヒーリングマップは、近所にあるちょっとした林や川辺の自然がどれくらいの数の人に癒しを与えているか、視覚化したものです。
今回は、埼玉県内の都市地域を対象に、ヒーリングマップを作りました。
計算には QGIS（ArcGIS でも可）と 地図公開のため CARTO を使用しました。

# 都市の自然の抽出
1. はじめに、「第6-7回自然環境保全基礎調査植生調査」（[環境省生物多様性センター](http://biodic.go.jp)）の国土数値情報 [都市地域データ](http://nlftp.mlit.go.jp/ksj/gml/datalist/KsjTmplt-A09.html)）に該当する部分を抽出しました。
1. 今回は、植生区分がブナクラス域自然植生、ブナクラス域代償植生、ヤブツバキクラス域自然植生、ヤブツバキクラス域代償植生のもの、もしくは大区分が湿原・河川・池沼植生、竹林のものを、都市の自然として扱いました。その凡例の植生を抽出しました。

# 都市の自然が癒しを与える範囲を算出
都市の自然は住民に癒しを与える範囲は、被らないものとします。手順としては
1. 都市の自然の重心点を作成
2. 重心点を使い、ボロノイマップを作成しました。

![hawto.png](https://qiita-image-store.s3.amazonaws.com/0/52806/c18c532e-d989-7ef6-b2ee-32362bc0bfb7.png)

都市の自然が多く点在する地域では癒しを与える範囲は小さく、都市の自然が少ない地域では広範囲に癒しを与えることになります。

# 癒しを与える範囲の人口を算出
人口データは、「平成22年国勢調査（小地域）」（[政府統計の総合窓口](http://www.e-stat.go.jp)）を使用しました。このデータは小地域（町丁・字）ごとに区切られているため、面積按分し、癒しを与える範囲の人口を推定しました。

1. 国勢調査データとボロノイマップをインターセクト
2. インターセクト後の人口 <- 小地域の人口 * ( インターセクト後のフィーチャの面積 / 小地域の面積 )
3. ボロノイマップの人口 <- インターセクト後の人口の合計

# 都市の自然に人口データを付与
算出したボロノイマップの人口を都市の自然データに空間結合しました。
これで、都市の自然データに癒しを与えられている範囲の人口（＝癒されている人数）が付与されました。

# 公開用地図を作る
1. carto.com にログイン
2. 完成したデータをドラッグ＆ドロップでアップロード
3. 都市の自然を癒しを与えられている範囲の人口で段階的に色分けする
4. パブリッシュボタンで URL を共有

# 作品ページ
[みんなのヒーリングマップ](http://idea.linkdata.org/idea/idea1s2204i)（LODチャレンジ2016 作品ページ）
おもしろいなと思ってくださった方はリンク先でいいねしてくれると嬉しいです o(._.)o
Windows API Code Pack - Shellを使用してディレクトリを指定するダイアログを開く

NuGetからWindows API Code Pack - Shellをインストール
[Windows API Code Pack-Shell](https://www.nuget.org/packages/WindowsAPICodePack-Shell/)

```csharp:MainWindow.xaml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.WindowsAPICodePack.Dialogs;

namespace OpenDirectoryDialogSample
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OpenDirectoryButton_Click(object sender, RoutedEventArgs e)
        {
            var dialog = new CommonOpenFileDialog();
            dialog.IsFolderPicker = true;
            CommonFileDialogResult result = dialog.ShowDialog();

            if(result == CommonFileDialogResult.Ok)
            {
                var directoryPath = dialog.FileName;
                DirectoryPathTextBlock.Text = directoryPath;
            }
        }
    }
}
```

参考
[wpf - Open directory dialog - Stack Overflow](http://stackoverflow.com/questions/1922204/open-directory-dialog)
CircleCIでタイムゾーン変更

# Why

タイムゾーンがサーバとDBで違う場合にCircleCIでのテスト環境を揃えたい

# What

- サーバが`Asia/Tokyo`
- DBが`UTC`

AWSのEC2/RDSを使ってるとよくある構成（RDSも最近はTZ設定できるけど）

# How

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
database:
  pre:
      - mysql -e "system date; show variables like '%time_zone%'; select now();"
      - mysql -e "set GLOBAL time_zone = '+00:00';"
      - mysql -e "system date; show variables like '%time_zone%'; select now();"
```

### Result

```bash
$ mysql -e "system date; show variables like '%time_zone%'; select now();"
Tue Jan 24 20:32:47 JST 2017
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | SYSTEM |
+------------------+--------+
+---------------------+
| now()               |
+---------------------+
| 2017-01-24 20:32:47 |
+---------------------+

$ mysql -e "set GLOBAL time_zone = '+00:00';"

$ mysql -e "system date; show variables like '%time_zone%'; select now();"
Tue Jan 24 20:32:51 JST 2017
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| system_time_zone | JST    |
| time_zone        | +00:00 |
+------------------+--------+
+---------------------+
| now()               |
+---------------------+
| 2017-01-24 11:32:51 |
+---------------------+
```
Mac標準「スクリーンショット」の意外と知られていないTips


※ "意外と知られていないか"の基準は筆者の主観です。
※ 動作確認環境は、MacOSX Yosemite（10.10.3）です。


## ウィンドウ単体を撮る👌
1. `command + shift + 4 `
カーソルが十字に。

1. `space`
スペースキーを押下するとカーソルが📷(camera)に。

1. 撮りたいウィンドウにカーソルを重ねる
ウィンドウが青くハイライトされる

1. そのまま画面をクリック

![window.png](https://qiita-image-store.s3.amazonaws.com/0/82699/ec9e0601-eb03-a793-a3c5-aceb4d717284.png "window.png")


すると、所定の場所にスクリーンショットを保存できます。

⚠️ ウィンドウがアクティブじゃなくとも、マウスカーソルを合わせることさえできれば無問題
⚠️ ハイライト色は、[環境設定] > [一般] > [強調表示色]で変更可

## メニューウィンドウだけを撮る☝️
また、上記の応用という扱いですが、全く同じ手順で、メニューウィンドウのみのスクリーンショットを撮ることもできます。

こんな具合ですね！

![menu.png](https://qiita-image-store.s3.amazonaws.com/0/82699/d30e5ca1-d3c5-1dba-8577-b10442570d44.png "menu.png")


⚠️ Qiitaのヘッダーにもあるような、Webページ内のHTML等で作られた'メニュー'は不可


## クリップボードに直接保存する👊
また、これらのスクリーンショットに関わるコマンドに`control`を追加押下することで、所定の場所ではなくクリップボードに直接コピーすることができます。

例えば選択範囲を撮る場合は、`command + shift + 4` ではなく、以下のようにします。

`control + command + shift + 4`

⚠️ 保存はされず **クリップボードにコピーされるだけ**であることに注意

## ウィンドウ単体をクリップボードにコピーする✋
複合技ですが、

1. `command + shift + 4 `
1. `space`
1. 撮りたいウィンドウにカーソルを重ねる
1. **`control`を押下しながら**、画面をクリック　←ｺｺ!!

あとはそのまま、標準のプレビュー.app（`⌘N`）デザインソフトに貼り付けてお好きなように編集するだけです。
こうすることで、デスクトップが散らかり、処分が大変！！なんてことが減りそうです。

⚠️ ひとつ目のコマンドで`control`を追加押下してもクリップボードに保存されないことに注意


## スクリーンショットの撮影を途中でやめるには👇
`esc`を押下

どのタイミングであっても`escape`キーを押下するとキャンセルすることができます。
エンジニアなら比較的すぐに気づく方が多いと思うのですが、escapeキーにあまり馴染みのない人にとっては、無駄なスクリーンショットを撮ってしまうということもあったかもしれません。


## おわりに

また何か発見したら追加したいと思います。それではまた👋
人工知能、機械学習関連ニュースbot始めました


どうも、2017年初エントリーです。人工知能ブログのはずが、色々あって雑多なものになってきていますね。脱線している感を感じつつも、これはこれで良いんだろうなと思ってしまっています。

今日のテーマはタイトルにある通り、人工知能、機械学習関連のニュースbotを作った話です。実装の部分に触れるつもりはないので、まぁさらっと想定対象とかデータソースなどを書いて行こうかなと思っています。

とりあえず[こちらが作ったbot](https://twitter.com/u_kan_data)
ついでに運営しているブログははこちら：[努力1mm](http://www.doryoku-1mm.tech/)


## 目的

人工知能関係の良いニュースbotってあんまり無い印象がありました。加えて、RSSリーダー使って独り占めしてるのもなんかもったいないし、どうせなら公開してしまおうと思って作っています。作ったからには半年で1000フォロワーくらい行くと良いなぁ、、とか夢見てます。

## 想定対象

想定対象は機械学習を実際に実装して実務で使っている人たちです。お手軽の入門とかはなるべく流れてこないようにしています。というのも機械学習なんて手を動かさないと分からないし、頭で理解することなんて**雀の涙程の価値もない**からです。手を動かさないでエセプログラマーをやってると、[こんな風に](http://rudiments.hatenablog.com/entry/bokumetu-who-anyone)煽られちゃうよ。プログラマーよ、手を動かせ。


## データソース

qiitaやはてぶがメインですが、それだけだとあまり面白みがないので色々と追加しています。というのも、機械学習関連の分かりやすいコンテンツはSlideShareやOpenDeck系のサービスにあるような印象なので、その辺も追加されています。

以下がその一覧。本当はもうちょっとSlideShare足したいけど、なんか挫折した。

- SlideShare : 機械学習Tagのついているもの
- 六本木で働くデータサイエンティスト
- StatsFragments
- Qiita: 機械学習タグが作られたもの
- はてなキーワード：AI
- はてなキーワード：データサイエンス
- はてな本文含む：データ分析
- はてな本文含む：機械学習
- はてな本文含む：自然言語処理


## 最後に

この投稿も僕のbotに流れるのでしょう、笑
そして読んでるだけでは、量産型プログラマーがおぎゃーと一体生まれるだけです。手を動かそう！！
[memo]Laravel5.3 + ログファイル名の設定

適当にヘルパーファイルを作って以下を記述

```php

use Monolog\Logger;
use Monolog\Handler\RotatingFileHandler;

if ( !function_exists( 'custom_logs' ) ){
  
  /**
   * @param       $name  出力ファイルの名前
   * @param       $type
   */
  function custom_logs( $name, $type = 'yearly' ){
    if( empty( $name ) ){
      return;
    }
    //  ここの引数がはいる.INFO
    $log    = new Logger( $name );
    // 第一引数はログを吐き出すまでのパスと拡張子を指定
    $RotatingFileHandlerClass = new RotatingFileHandler( storage_path() . '/logs/.log', 0, Logger::INFO );
    $log->pushHandler( $RotatingFileHandlerClass );
    // setFilenameFormat の第一引数のファイル名に `{date}` を入れないとエラーになるようになったみたいなので、それを対応。
    // 第二引数もdate formatが必須に変わったのでsingleはコメントアウト
    switch( $type ){
      case 'daily':
        $RotatingFileHandlerClass->setFilenameFormat( mb_strtolower( $name ) . '_{date}', 'Y-m-d' );
        break;
      case 'monthly':
        $RotatingFileHandlerClass->setFilenameFormat( mb_strtolower( $name ) . '_{date}', 'Y-m' );
        break;
      case 'yearly':
        $RotatingFileHandlerClass->setFilenameFormat( mb_strtolower( $name ) . '_{date}', 'Y' );
        break;
//      case 'single':
//        $RotatingFileHandlerClass->setFilenameFormat( mb_strtolower( $name ) . '_{date}', '' );
//        break;
      default:
        break;
    }
    
    $log->addInfo( 'ここにログ内容' );
    
    return;
  }
  
}
```

あとはお好みで引数をいじってログに出したいデータを渡したり、date formatの部分やLogger::INFOを変数にしたりしてみるもいいかも。
Amazonでは買い物しかしたことがないおっさんがAWSを使ってみた

# Amazonではかいもんしかしたことがない

初めて買ったのは1996年ごろかな。エアレイサーの図面集みたいなのを船便で買った。
(当時はAmazon.comって洋書や日本未発売のCDを買うサイトだった)

https://www.amazon.co.jp/dp/0933424019

# そんなことはどうでもいいんだ

今回は、「httpsで静的リソースを分間50000リクエストさばくWebサーバを作って、マッハで。」という依頼が無茶なのかどうかを、肌間隔で知ってみたいとゆう欲望から、以下の手順にレッツチャレンジ一年生です。

1. S3にコンテンツを置いてWebサーバとしてアクセスできるようにする。
2. CloudFrontを通してS3のコンテンツにアクセスできるようにする。
3. ACMを使ってhttpsでリクエストできるようにする。

*追記:*
*CloudFront自体にSSLオプションがあるので、今回の目的を達成するのに3.はいらない。*

なおワタクシ、実際の仕事的には立場的には発注される側じゃなくて、発注する側です。
やってみて俺にもできたとき、発注先が「無理っす」ってゆったら、生暖かい目で見ようとゆう魂胆。

# まずはAWSのアカウントをつくる

20分ぐらいかけて作ってみた。

感想:PINコードをナニする電話の女性の声いいよね。

# 1. S3にコンテンツを置いてWebサーバとしてアクセスできるようにする

やっと本題だよ。

ログインすると、こんな画面が。
ちなみに老害は「学習」が嫌いなので、見たほうがいいかもと思いつつも「構築の学習」はスルーの方向で。

![s3-01.png](https://qiita-image-store.s3.amazonaws.com/0/34041/a2b18b88-0284-4701-eb8c-457a3bc12015.png)

「～5分」とかマジかよ。と思いながら、「静的ウェブサイトのホスティング」をクリック。

![s3-02.png](https://qiita-image-store.s3.amazonaws.com/0/34041/81db50d3-3e62-7d79-d743-dfa5c5749d5c.png)

websiteの名前を入力して、Create your websiteを押す。

![s3-03.png](https://qiita-image-store.s3.amazonaws.com/0/34041/805b3111-b252-62a0-32f9-7bd1c04f311c.png)

独自ドメイン、いらん。
ソースコード、サンプルっぽいのをさっき上げた、いらん。
CDN、いまんところいらん。

で、クリックしたら。

![s3-04.png](https://qiita-image-store.s3.amazonaws.com/0/34041/91630324-e0f6-ad62-7268-8a6b4829e7c6.png)

できてる…。

ここまでかかった時間はこんな感じ。

- 構築の学習を見るか悩む: 30秒
- websiteの名前を考える: 3分
- サンプルサイトのアップロード: 10秒
- その他(クリックとか): トータル15秒ぐらい?

すげぇな、S3。

# 2. CloudFrontを通してS3のコンテンツにアクセスできるようにする

で、コンソールに戻ってきたらですね、さっき「CDN、いまんとこいらん。」って無視したところの表示が変わってるんですよね。

![cf-01.png](https://qiita-image-store.s3.amazonaws.com/0/34041/7bb6603c-4d04-4684-b8ca-16a9d404ec67.png)


このURLクリックすると、サンプルサイトが見える、ちゅーことは自動的にCloudFrontまで設定された感じなの? ねぇ、そうなの?

とはいえ、それを検証するすべを今時点では持たないので、これはもうステップ2の「CloudFront編」は完了終了おめでとう、ってことにしましょう。

# 3. ACMを使ってhttpsでリクエストできるようにする

ところで先ほどの画像、おわかりいただけただろうか…?

![acm-01.png](https://qiita-image-store.s3.amazonaws.com/0/34041/b5b54dc6-5151-dbce-843b-70e85ecc3eee.png)

はい、ステップ3、しゅうりょー。

*追記:
これはACMが自動的に適用されたんじゃなくて、CloudFrontにSSLオプションがあるから。*
> 独自 SSL 証明書 - Amazon CloudFront | AWS
> https://aws.amazon.com/jp/cloudfront/custom-ssl-domains/


# あとは負荷テスト

正直インフラ屋ではないのでやりかたがわからないんだが、エービーとかジェーメーターとかエフゴアタックとかきいたことがあるので、まずはそれをアレして、あとはやったら請求がどれくらいになるのかを調べて後日やってみたいと思う。

# 結論

分間50000リクエストさばけるかどうかわかんないけど、httpsで静的リソースをばらまくWebサーバはAWSでマッハで作れる。ただし、websiteの名前に悩まなければ。
Docker+Grafanaでアカウントを横断してCloudWatchを可視化する

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

ちょっとしたモニタリングだったらCloudWatchでも十分。
ただ、普段コマンドラインツールで操作していることもあるし、複数アカウントを持っていたりするのでマネージメントコンソールだと使い勝手が悪い。
そんな悩みをGrafanaが解決してくれたので自分用にメモメモ。
# 必要なもの
+ AWSのIAM User
+ aws-cli
+ Docker for Mac(Docker Machineでも可)

# credentialsの登録

自分が普段使っているMacでは、aws-cliを使ってprofileをいくつも登録してある。
登録するときはこんな感じ。
`profile`名は適宜変更すること。
すでに作成済みの場合は実施不要。

```bash
$ aws configure --profile hogehoge
AWS Access Key ID [None]: aaaaa
AWS Secret Access Key [None]: bbbbb
Default region name [None]:
Default output format [None]:
```

すると、以下の感じで必要な情報が登録されているはず。

```bash
$ cat ~/.aws/credentials
[hogehoge]
aws_access_key_id = aaaaa
aws_secret_access_key = bbbbb
```

credentialの取り扱いには気をつけること！

# DockerでGrafanaを起動

上記で作成したcredentialsを`-v`オプションでGrafanaコンテナに渡す。
公式イメージあるので捗る。
Grafanaは3000ポートでListenしているのでそれもあわせてマッピング。

```bash
$ docker run -d -p 3000:3000 -v ~/.aws/credentials:/usr/share/grafana/.aws/credentials --name grafana grafana/grafana
3d7de10094f1d84dbedd8a77fb55ef5c997ccdde31722a114bcd25388b1a8b3d
```

起動した。

# Grafanaにデータを追加

接続してみる。

```bash
$ open http://localhost:3000
```

![screencapture-localhost-3000-login-1484041461957.png](https://qiita-image-store.s3.amazonaws.com/0/32208/89b5cc36-ef2d-de38-2854-fe5e86ed7500.png "screencapture-localhost-3000-login-1484041461957.png")

デフォルトのログインID/PWは`admin/admin`。
ログインするとこんな感じ。
![Kobito.cKv8Tt.png](https://qiita-image-store.s3.amazonaws.com/0/32208/7ea01852-2ca2-daed-844d-d63f92e0af53.png "Kobito.cKv8Tt.png")
なんか前見たときよりUIがよくなってるかも。
ちょっと目立つ感じになってる`Add data source`ボタンを押す。

![Kobito.b6Dvv3.png](https://qiita-image-store.s3.amazonaws.com/0/32208/f8a13f8e-721e-965c-5d0e-5d97d08b9366.png "Kobito.b6Dvv3.png")
こんな画面になる。
Nameには任意のData Sourceの名前をつけてる。
Typeのプルダウンから`CloudWatch`を選択。
Auth Providerは`Credentials file`以外にも`Access & secret key`やARNが選択できるが、変更せずに`Credentials file`を指定する。
Default Regionは適宜選択すること。
Custom Metrics namespaceはなにかあれば入力するが、とりあえず空のままでOK。
左下の`Add`ボタンを押して、`Success`と表示されれば登録できてるっぽい。

![Kobito.KIPEF2.png](https://qiita-image-store.s3.amazonaws.com/0/32208/cf34f400-3211-b981-fce3-4d0fbe213c9f.png "Kobito.KIPEF2.png")
こんな感じで登録できた。

あとはdashboardでポチポチグラフを追加していい感じの画面を作ればOK。
![Kobito.TV43uj.png](https://qiita-image-store.s3.amazonaws.com/0/32208/794fceed-20b8-1b24-ddea-675974f952a4.png "Kobito.TV43uj.png")

---

Dockerで起動しているのでこのままだとデータの永続化とかはできてないけど、とりあえず簡単に起動できて便利。
Railsの config.eager_load はModelやControllerを読み込むタイミングを制御できる

アプリケーション起動時にModelやControllerをごにょごにょするgemを開発していて気付いたことをメモ。
本記事は、ActiveRecordの`eager_load`とはまた別の話なので注意。

## eager load について

説明できる自信がないので、Railsの[公式ドキュメント](https://railsguides.jp/configuring.html)の説明に預けます。

> config.eager_loadをtrueにすると、config.eager_load_namespacesに登録された事前一括読み込み(eager loading)用の名前空間をすべて読み込みます。ここにはアプリケーション、エンジン、Railsフレームワークを含むあらゆる登録済み名前空間が含まれます。

Railsのapp以下にあるクラス(ModelやController)をブート時に全て読み込む....といった感じでしょうか。

この`config.eager_load`は通常、Railsの環境別に`config/environments/xxxxxxxx.rb`で設定されています。(rails newした時にそうなっているはず)

```ruby:config/environments/development.rb
SampleApp::Application.configure do
#...(略)...
  # Do not eager load code on boot.
  config.eager_load = false
#...(略)...
end
```

### eager load をしない場合の挙動

Railsアプリケーションで、`config.eager_load = false`になっていると、そのクラスが存在するか？(定数が存在するか?)を確認しようとしても、クラスにアクセスする前ならば`false`が返ってきます。

コードを実行してみると、以下のような感じです。

```ruby:irb
irb(main):001:0> Object.const_defined?('User')
=> false
irb(main):002:0> Object.const_defined?('UsersController')
=> false
irb(main):003:0> User
=> User(id: integer, name: string, email: string, created_at: datetime, updated_at: datetime, password_digest: string, remember_token: string, admin: boolean)
irb(main):004:0> Object.const_defined?('User')
=> true
irb(main):005:0> UsersController
=> UsersController
irb(main):006:0> Object.const_defined?('UsersController')
=> true
```

### eager load をする場合の挙動

`config.eager_load = true`にしている場合です。
以下の通り、クラスにアクセスする前から、クラスの存在確認(定数定義の確認)をできるようになっています。

```ruby:irb
irb(main):001:0> Object.const_defined?('User')
=> true
irb(main):002:0> Object.const_defined?('UsersController')
=> true
```

### eager_load! で強制的に読み込ませることもできる

ここまで述べてきた通り、`config.eager_load`の値をtrueにすることで、Railsアプリケーション起動直後からクラスの存在確認をできるようになります。
が、どうしても、`config.eager_load`の値によらず、クラスの存在確認をできるようにしたい場合、どうすればよいのでしょうか？

そこで登場するのが、`Rails.application.eager_load!`というメソッドです。
このメソッドは、`config.eager_load = true`の時と同じロード処理をその場で実行してくれます。
(それなりの規模のアプリケーションだと実行に時間がかかるかと思います)

動かしてみると、こんな感じです。

```ruby:irb
irb(main):001:0> Rails.application.eager_load!
=> ["/Users/ym/works/sample_app/app/assets", "/Users/ym/works/sample_app/app/controllers", "/Users/ym/works/sample_app/app/helpers", "/Users/ym/works/sample_app/app/mailers", "/Users/ym/works/sample_app/app/models", "/Users/ym/works/sample_app/app/controllers/concerns", "/Users/ym/works/sample_app/app/models/concerns"]
irb(main):002:0> Object.const_defined?('User')
=> true
irb(main):003:0> Object.const_defined?('UsersController')
=> true
```

通常は使わない方法かと思いますが、gem側で強制的にクラス存在確認を有効にしたい時など、どうしても必要になる時があるかもしれません。
開発時に eZ Publish のキャッシュをオフにする

eZ Publish 4 または 5 のレガシーの INI 設定で以下のように設定するとキャッシュがオフになり、テンプレートを編集するたびにキャッシュクリアする必要がなくなる。

```ini:settings/override/site.ini.append.php
[TemplateSettings]
DevelopmentMode=enabled
TemplateCache=disabled

[OverrideSettings]
Cache=disabled
```

* [DevelopmentMode / [TemplateSettings] / site.ini / Configuration files / Reference / 4.x / Technical manual / eZ Publish / Documentation - Doc](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/site.ini/TemplateSettings/DevelopmentMode2)
* [TemplateCache / [TemplateSettings] / site.ini / Configuration files / Reference / 4.x / Technical manual / eZ Publish / Documentation - Doc](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/site.ini/TemplateSettings/TemplateCache)

* [Cache / [OverrideSettings] / site.ini / Configuration files / Reference / 4.x / Technical manual / eZ Publish / Documentation - Doc](https://doc.ez.no/eZ-Publish/Technical-manual/4.x/Reference/Configuration-files/site.ini/OverrideSettings/Cache)
インタフェースデザインの心理学

# インタフェースデザインの心理学

メモリーバンク
ジオン、ジオンは２４個
人は本能的にパターンを探す
大都会の雑踏の中で家族の顔を見分けれる
物はやや上から斜めに見た形で思い浮かべる
色覚遺伝子は大部分が X 染色体上にあります。男性には X 染色体がひとつしか なく、女性にはふたつあるので、女性より男性に色覚の問題が出やすくなります。
色は精神状態に影響
ワーキングメモリ
人が一度に記憶できるのは５個から９個


### フォント
ポイント、アセンダ、エックスハイト、ミーンライン、ベースライン

人がどれだけ忘れるか
R = e(-t/S)
忘却曲線

忘却曲線

人は３０％の時間はぼんやりしてる

ユーザーが注意散漫になった時もすぐに現在地がわかるような仕組みを用意しましょう
人間が注意散漫になるのは仕方のないこと

UCD : User Centered Design

## デザインの心理学

### 1章 人はどう見るのか

### 2章 人はどう読むのか

### 3章 人はどう記憶するのか

### 4章 人はどう考えるのか

### 5章 人はどう注目するのか

### 6章 人はどうすればヤル気になるのか

### 7章 人は社会的な動物である

### 8章 人はどう感じるのか

### 9章 間違えない人はいない

### 10章 人はどう決断するのか
Scotch BoxでPHP7でCakePHP3を動かしてみた

## 前提条件
* Vagrant, VirtualBox はインストール済み

[Scotch Box](https://box.scotch.io/) は LAMP 環境が入っている Vagrant Box です。
現時点では、Ubuntu に PHP 5.6 なんですが、PHP 7 を使いたかったのです。

あと Laravel 推しなのかな？ Laravel 関連のモノも入っています。
私も最初 Laravel で開発しようと思って見つけたのですが、気が変わって CakePHP3 を動かしてみました。

## Scotch Box を準備
Scotch Box 公式サイトに書いてある手順通りです。非常に親切で簡単。
https://box.scotch.io/

### PHP 7.0 のインストール
`vagrant up` ができたら、`vagrant ssh` で入ります。
PHP 7.0 のインストール方法も、Scotch Box の GitHub に書いてあるのを実行で OK です。
https://github.com/scotch-io/scotch-box#php7-install-instructions

### intl, mbstring のインストール

上記の GitHub ページで、`php-mbstring` をインストールするよう書いてあるんですが、それでも CakePHP3 ではエラーが出てしまいました。
あと `intl` エクステンションも必要というエラーが出るので、インストールします。

```bash
sudo apt-get install php7.0-intl php7.0-mbstring
sudo service apache2 restart
```

## CakePHP3 をインストール

Vagrant 上の `/var/www/` 以下か、ローカルの Scotch Box のディレクトリ内で、CakePHP をインストールします。

```bash
composer self-update && composer create-project --prefer-dist cakephp/app my_app_name
```

インストール手順の詳細は CakePHP3 のドキュメントに書いてあります。
https://book.cakephp.org/3.0/ja/installation.html
適宜 logs や tmp のパーミッション変更等してください。

### public を CakePHP のドキュメントルートに変更する

Vagrant 上の `/var/www/` に `public` というディレクトリがあるので、それを削除して、シンボリックリンクにします。

```
cd /var/www/
rm -rf public
ln -s my_app_name/webroot public
```

## おわり
http://192.168.33.10/ にアクセスして CakePHP3 の表示がされれば OK です。
非常に楽ちんでした:blush:
Vagrantのインストールと利用（MacOSX & Virtualbox）


MacOSX（10.12.2）にVagrantとVirtualboxをインストールし、仮想環境を構築します。

##Vagrantのインストール

https://www.vagrantup.com

上記より、Vagrantをダウンロードしてインストールします。
インストール後、vagrantコマンドが使用できるようになります。

```
$ vagrant -v
Vagrant 1.9.1
```

##Virtualboxのインストール

https://www.virtualbox.org

次に、上記よりVirtualboxをダウンロードしてインストールします。
アプリケーションフォルダにVirtualBox.appが追加されます。
（今回インストールしたバージョンは5.1）

##VagrantとBox

Vagrantを用いるとあらかじめ用意されたテンプレート（Box）を用いて、Virtualbox用の仮想環境を構築できます。

Box一覧（使用したいテンプレートを選択）
(1)  https://atlas.hashicorp.com/boxes/search
(2)  http://www.vagrantbox.es

まず、開発用のフォルダ（ディレクトリ）を作成して、移動します。

```
$ mkdir dev
$ cd dev
```

上記(1)のテンプレートを利用する際は、下記の最初のコマンドでVagrantfile（下記例はUbuntuのXenial）を作成し、次のコマンドでVirtualboxの仮想環境を構築して起動します。

```
$ vagrant init ubuntu/xenial64
$ vagrant up --provider virtualbox
```

上記(2)のテンプレートを利用する際は、box addオプションで最初にBox（下記ではhogeという名前で）を作成し、その後initとupを行います。

```
$ vagrant box add hoge https://atlas.hashicorp.com/gbarbieru/boxes/xenial
$ vagrant init hoge
$ vagrant up --provider virtualbox
```

作成した仮想環境を利用（ログイン）するには、開発用のフォルダ内で下記のコマンドを実行します。

```
$vagrant ssh
```

仮想環境を停止する際は「vagrant halt」、破棄する際は「vagrant destroy」を実行します。