OmniAICreator/Qiita-1.07M huggingface dataset:
Jupyterでmatplotlibのグラフが表示されない



http://qiita.com/hik0107/items/de5785f680096df93efa

↑の記事を参考にさせていただき、jupyterで実行してみても`plt.show()`しないとグラフが表示されない。
REPLっぽいからなんとなく`show()`しなくても表示されるものだと思ってたけど、違うのか？と思って調べてみたら、おまじないが必要だったみたい。

### インラインモードに必要な記述
```python
%matplotlib inline

```


### ちなみに実行したコード
```python
# グラフ化に必要なものの準備
import matplotlib
import matplotlib.pyplot as plt

# データの扱いに必要なライブラリ
import pandas as pd
import numpy as np
import datetime as dt

plt.style.use('ggplot')
font = {'family' : 'meiryo'}
matplotlib.rc('font', **font)

url = 'https://vincentarelbundock.github.io/Rdatasets/csv/robustbase/ambientNOxCH.csv'
df_sample = pd.read_csv(url, parse_dates=1, index_col=1)

# dfの準備
df = df_sample.iloc[:, 1:]

# df_monthlyの準備
df_monthly = df.copy()
df_monthly.index = df_monthly.index.map(lambda x: x.month)
df_monthly = df_monthly.groupby(level=0).sum()

df_monthly.plot.bar(y=['ad', 'ba', 'se'], alpha=0.6, figsize=(12,3))
plt.title(u'普通の棒グラフ', size=16)

```
MarkLogicのサンプルスタックを動かす方法


MarkLogicのサンプルスタックは、[MarkLogic](http://jp.marklogic.com)というNoSQL製品の機能を一通り体験できるWebアプリです。GitHub上にあります。

https://github.com/marklogic/marklogic-samplestack

動かし方は[README.md](https://github.com/marklogic/marklogic-samplestack/blob/master/appserver/java-spring/README.md#quickstart)に一応書いてありますが、結局何をすれば動くのかが分かりづらかったため、ここにメモしておきます。

> 2017.11.13更新: 現在の最新バージョン(MarkLogic 9)では動作しないようです。サンプルスタックの開発(マージ)は2年前から止まっており、今後の改版見込みも薄そうな感じです。「MarkLogicのJavaのサンプルを手っ取り早く動かす方法 ([Eclipse編](https://qiita.com/makopo/items/c38a43ce41a8ff57ff6b))([コマンドライン編](https://qiita.com/makopo/items/bbd32e5421fd60eacbf5))」は、MarkLogic 9でも動作しますので、そちらの利用をお薦めします。

## 事前にインストールしておくもの

 - MarkLogic 8系
    - インストール済みで起動状態あれば、初期設定されていなくても良い
 - JDK 1.7 または 1.8

gradleは不要(起動スクリプト内で自動で構成されます)

## サンプルスタックのダウンロード

```shell-session
$ git clone --depth 1 https://github.com/marklogic/marklogic-samplestack
$ cd marklogic-samplestack
```

## 設定ファイルの編集

MarkLogicの初期設定を済ませている場合は、```appserver/java-spring/gradle.properties```を編集

```properties:appserver/java-spring/gradle.properties
marklogic.admin.user=<MarkLogic管理者ユーザー名>
marklogic.admin.password=<MarkLogic管理者パスワード>
```

プロキシ等で保護された環境から接続する場合は、[gradleのプロキシ設定](https://qiita.com/koooge/items/294e6a1000d99d92ae72)を参考に、プロキシ情報も追記します。

MarkLogicの初期設定を済ませていない場合は、起動スクリプト実行中に、ユーザー名 admin / パスワード admin で管理者ユーザーが作成されます。

## いざ、起動

MarkLogic が起動されていることを確認してから、以下のコマンドを実行します。

```shell-session
$ cd appserver/java-spring
$ ./gradlew appserver
```

各種ダウンロード、ビルド、samplestackというMarkLogicサーバーの作成、サンプルデータの投入、サーバーの起動が順次行われます。全て終わると、下のような表示で止まります。

```shell-session
>Building 85% > :bootRun
```

## アクセス

### Webアプリ
http://localhost:8090/

![samplestack_1.png](https://qiita-image-store.s3.amazonaws.com/0/10290/bb80a342-463b-b240-dd72-6b181b7c8059.png)

右上のLoginボタンを押して、ログイン

 - joe@example.com パスワード: joesPassword
 - mary@example.com パスワード:  marysPassword

### クエリコンソール
http://localhost:8000/qconsole/

Content Sourceのプルダウンから```samplestack (samplestack-modules: /)```を選択し、Exploreボタンをクリック

![queryconsole.png](https://qiita-image-store.s3.amazonaws.com/0/10290/27ba475b-3453-5add-dfe8-259dde109456.png)

## 後片付け

 - Ctrl + Cで終了 
 - ./gradlew clean 
 - ./gradlew dbteardown
VisualStudioCodeでnpmタスクを実行する

# 概要
visual studio codeでnpmタスクを実行する。
前回gulpのタスクを実行することはやったので、もう少し粒度を小さく。

例えばpm2 を使っているアプリケーションとする。（pm2の使い方については [pm2 - node.js プロセス管理パッケージ](http://nodejs.osser.jp/node/node-pm2/)を参照してくれれば良いかと。）
pm2を使う場合、以下の方法で起動、停止などは以下のように書ける。

```
pm2 start processes.json
pm2 restart processes.json
pm2 stop processes.json
pm2 delete processes.json
```

## npmで実行する
npmでそれを実行しようとするとpackage.jsonには以下のようにかいて

```
{
（中略）
  "scripts": {
    "start": "pm2 start processes.json",
    "restart": "pm2 restart processes.json",
    "stop": "pm2 stop processes.json",
    "delete": "pm2 delete processes.json"
  },
（中略）
}
```

以下のように実行する。

```
npm run start
npm run restart
npm run stop
npm run delete
```

## vscodeでタスクを起動する
vscodeでctrl+shift+pをおしてから「Tasks: Configure Task Runner」を選択する。次にタスクの設定を聞かれるので、npmを指定する。すると、tasks.jsonを.vscodeフォルダに作成される。

この時点でctrl+pをおしてから「task 」とタイプすると、install、update、testというのが選択できるよう状態になっているはず。……start、restartとかがない。
tasks.jsonの中身を見てみると、以下のようになっている

```
{
（中略）
	"tasks": [
		{
			"taskName": "install",
			"args": ["install"]
		},
		{
			"taskName": "update",
			"args": ["update"]
		},
		{
			"taskName": "test",
			"args": ["run", "test"]
		}
	]
}
```

gulpだと勝手にタスク読み込んでくれてたのに…と思ったけど、よく考えてみるとnpmでstartを実行しようとすると、上記でやったように、npm run startって書かないといけない。つまり、run startが引数なわけだ。npm installとかいろいろあるから、仕方ないね。
そういうわけで、startとかを書いてみると書いてみると以下のようになる。

```
{
（中略）
	"tasks": [
		{
			"taskName": "install",
			"args": ["install"]
		},
		{
			"taskName": "update",
			"args": ["update"]
		},
		{
			"taskName": "start",
			"args": ["run", "start"]
		},
		{
			"taskName": "restart",
			"args": ["run", "restart"]
		},
		{
			"taskName": "delete",
			"args": ["run", "delete"]
		},
		{
			"taskName": "stop",
			"args": ["run", "stop"]
		}
	]
}
```

で、この時点でctrl+pをおしてから「task 」とタイプすると、startなどがでてくるはず。

## まとめ
visual studio codeでnpmタスクを実行するところができた。
.vscodeフォルダに入るものは基本共有するべきものじゃない（と思っている）ので、個人的に使う簡単なスクリプトとかを書いておくと便利（フォルダ構成を引数に渡すとか）……かな……
Chef メモ


これは不完全な記事で、メモとして書いたものです。

## 概要

Chef は Configuration Management Tool ってやつで、サーバーのセットアップとかを上手い具合にやってくれるという触れ込み。前から使ってみたかったやつ。

Chef とか使わないならシェルスクリプトで「これまるっと実行すればサーバーのセットアップできるよ」みたいな感じにすることが多いんだけど、これって「サーバーの設定を修正する度にシェルスクリプトを修正する必要がある」のと「一つのサーバーの設定を変更したら兄弟サーバーの設定も同じように変更する必要がある」のとがめんどくさいので、複数台運用とかしだすと破綻しちゃう。なので、「サーバーの設定を上手く管理してくれるインフラ」がほしい感じになる。

Chef についてのドキュメント類は https://learn.chef.io に揃っているので、最終的にはここを参照するのが良いと思う。けど灰色ですごい読みにくかった。文字も小さいし。

### Chef の構造

Chef は基本的には「各ノード（実体は何かのサーバー）の構成情報を管理する Chef サーバー」と、「設定を管理・適用される側のノード（データベースとかアプリケーションサーバーとか）」に分かれていて、さらに Chef を取り扱う主体として Workstation ってのがいる。Workstation ってのは、普通は管理者が実際に使っているローカルマシンになる。

`knife` というコマンドがあって、基本的にはこれをインストールすることで Workstation になるみたい。ただ、`knife` には Chef Server の設定を入れておかないといけないので、ただコマンドがあれば使えるって感じではない。（試した時は WebUI 経由でダウンロードした zip ファイルを knife の設定を置くディレクトリに展開した）

### 通信周り

Chef Server はインストールすると自分で HTTP サーバーになって、勝手に HTTPS 通信を待ち受ける。しかも証明書を自作してくれる。Workstation や Chef Client（ノード）は、ssh 経由で証明書をダウンロードして、サーバーとの通信を暗号化しているらしい。（らしい、というのは細かく調べておらず、適当に試してみた結果をもとに推測しているため。本当かどうかはわからないので各自調べてね）

で、なんで HTTPS なのかっていうと、まあ、オプションではあるみたいなんだけど、WebUI があって、ブラウザ経由でいろいろ捜査できるため。無いならないでも良いんじゃないかな？ 試してないのでわからない。

### Ruby

Chef は中身に Ruby を使っているので、設定ファイルは普通、Ruby で書くことになる。

### クックブック・レシピ

用語が使い分けられているけど、違いがよくわからない。大雑把にいえば「ノードに適用する設定を記述したやつ」って感じ。

### ホスト名

Chef Server は Workstation や Chef Client（ノード）からの通信を受け付けるので、名前解決できたほうが良い。（というか、できないとダメっぽい書かれ方してた）

で、DNSレコード設定してもいいと思うけど、/etc/hosts に記述する方法も書かれていた。ホスト名をグローバルに使用することはないと思うので、こちらのほうが良いかもしれない。アクセス元は限られているわけだし。

## Chef Server

CentOS 7 でインストールした。

- Chef server の rpm をダウンロードしてインストール。
- なんか初期化スクリプト走らせる。
- WebUI 使う時はそれ用のツールも入れる。
- ユーザーを作成する。
- Organization を作成する。Webui 経由でもいい。Webui は HTTPS 使うので、`firewall-cmd --zone=public --add-service=https --permanent; firewall-cmd --reload` する。
- 細かいことは https://docs.chef.io/install_server.html#standalone を見る。
- rpm のダウンロードURLをコピーして curl しても 0 byte のレスポンスだったので、ローカルマシンに落として scp した。めんどかった。
- Chef Server の Organization ごとに Start Kit ってのができて、WebUI 経由でこれを DL した。中には Organization とユーザーの秘密鍵が含まれている。この辺いろいろ謎。

## Chef Client

- https://docs.chef.io/install_bootstrap.html これみる。
- `knife bootstrap` コマンドを Workstation 上で実行する。この時、`knife` コマンドは SSH の接続情報を受け付ける。 `knife` がノードにSSH接続して、Chef Server に対してノードの登録処理を行なう。Chef Client 上で Chef Server と通信するため、Chef Client が Chef Server の名前を解決できる必要がある。`/etc/hosts` に書いたりとかする。
- `knife` が Chef Client 上にも必要なので、先にインストールする感じみたい。その辺りは https://docs.chef.io/install_omnibus.html を参照。
- "Install via URL" と "Bootstrap" がドキュメント上で並列している見出しなのが謎。順序的には "Bootstrap" だけでもインストールできそうなので、もしかしたら Chef Client に `knife` をインストールする必要はない？

## Workstation

MacOS X 向けのインストーラあるのでそれを使ったらいけた。
HerokuへデプロイしてDjangoを動かす。


##開発環境
Python3.5.1
Django1.9.6
PyCharm


##プロジェクトの準備
Pycharmで、Djangoプロジェクトを生成する。
そのままのプロジェクト構成では、`Heroku`へデプロイしても動作しないので、下記のファイルを配置して`Heroku`で認識できるようにする。


##Herokuで必要なファイル

```runtime.txt
python-3.5.1

```

`gunicorn`というPython用の`WSGI HTTP Server`を必要とするのでインストールするように記述する。

```requirements.txt
Django==1.9.6
gunicorn==19.5.0

```

プロジェクトのアプリケーション作成した時に生成された`setting.py`の中に記述された下記のアプリケーション名を`Procfile`に合わせて記述する。
WSGI_APPLICATION = 'myapp.wsgi.application'

```Procfile
web: gunicorn myapp.wsgi --log-file -

```

##Gitリポジトリの設定
```
$ heroku login

$ cd myapp/
$ git init
$ heroku git:remote -a myapp

```

##Herokuへデプロイ
```
$ git add .
$ git commit -am "Init my Project"
$ git push heroku master

```

これで、`Heroku`で動作するはず。
MT: 奇数行/偶数行で背景色を変える方法

# MTで、表の1行ごとに背景色を変えたいような場合の手法

1行1エントリーなら変数 `__odd__`, `__even__`を使う
MTFor, MTLoop, MTEntries, MTPages など、ループ処理を行うブロックタグ内で利用可能。

```html
<mt:Entries lastn="10">
<mt:EntriesHeader>
<table>
</mt:EntriesHeader>

    <tr class="<mt:If name="__odd__">odd<mt:Else>even</mt:If>">
        <td>foo</td>
        <td>bar</td>
    </tr>

<mt:EntriesFooter>
<table>
</mt:EntriesFooter>
</mt:Entries>
```

**ブロックタグに利用できる予約変数**
http://www.movabletype.jp/documentation/mt5/design/templates/loopvariable.html
JSでUWPアプリ

JSでUWPアプリ開発試していて、appxbundle、appxuploadまで作ってみたのですが、なんかリリースがためらわれる状況に陥ってます。
ちなみにロジックはJSだけどAPIのエンドポイントだとか簡単には見せたくない箇所が少しあって、AndroidとiOSではそういうのをネイティブ側に書いたりしていました。

# ここが残念
- VisualStudioで生成したappxをローカルにインストールして、WindowsAppsフォルダを覗いたら生のjsが入っていた。
- WindowsAppsフォルダのjsを直接書き換えたらアプリに反映された。あ、これ~~改竄し放題か！~~ → ストアからインストールしたアプリのjsは改竄できない模様。後述。
- ストアから落としたJSのUWPも生のjsが入っていた。せっかくストア経由なんだからバイナリ化して暗号化でもしれくれたらいいのに。
- cordova-plugin-dialogsのダイアログがネイティブじゃなかった。HTMLで描いてるぅー。えー。地味にショック！ｗ
- CordovaもConfig.xmlからappxmanifestを生成するだけで、UWP向けの考慮が足りないから必要なappxmanifestができない。だったら最初からappxmanifest書かせてくれよと。
- パッケージにConfig.xmlが混入していて、ビルド環境のAppPackagesのフルパスが入っていた。C:\Users\なんたら とかやめてくれｗ

# さてどうしたものか・・・
.NETネイティブでよしなにバイナリになるのかなーって思ってたんだけど甘かったですね。
Cordovaの不備はMicrosoftが悪い意味でオープンソースに丸投げ。
もうC#でWebViewアプリ書いたほうがよいのかな？

# その後
自作アプリのストア登録が完了したので、ストアから落としてみたのを同じようにWindowsAppsフォルダ開いてjsを弄って・・・あれ。書き換えられないや。
[Designing a simple and secure app package – APPX](https://blogs.msdn.microsoft.com/windowsappdev/2012/12/04/designing-a-simple-and-secure-app-package-appx/)
ストア配布アプリのJS改竄は確かにできないみたいでちょっと安心。
HTML: テキスト効果

この記事はテキスト効果を作る方を説明します。
#**1. Marqueeタグを使う**
Marqueeタグでテキストは右から左までで、左から右までで、上から下までで、下から上まででをスクロールできます。特にイメージもできます。
Marqueeタグはnon-standard HTMLですが、ほとんどブラウザのサポートがあります。
##a.スクロール
無限です。

    <marquee behavior="scroll" direction="left">Home up!</marquee>

デモ：https://jsfiddle.net/thanh1992/u6x0f3k5/
directionを変更できます。
##b.スライドイン
一回だけです。

    <marquee behavior="slide" direction="right">Home up!</marquee>
デモ：https://jsfiddle.net/thanh1992/p386ps8f/
directionを変更できます。
##c.オルタネイト
テキストは代替の右から左まででをスクロールした後、左から右まででをスクロールします。無限です。

    <marquee behavior="alternate">Home up!</marquee>
    
デモ：https://jsfiddle.net/thanh1992/27gxrz93/
##d.速度
###Scrollamountを使う
Scrollamountはpixels/frame速度です。

    <marquee behavior="scroll" direction="left" scrollamount="10">Home up!</marquee>

デモ：https://jsfiddle.net/thanh1992/dpL1mzmL/
###scrolldelayを使う
Scrolldelayはframe１からframe２までかかる時間

    <marquee behavior="scroll" direction="left" scrolldelay="100" scrollamount="2">Home up!</marquee>

デモ：https://jsfiddle.net/thanh1992/mcwpu88f/
##e.マウスでstop　start

    <marquee behavior="scroll" direction="left" onmouseover="this.stop();" onmouseout="this.start();">
    Home up!
    </marquee>
    
デモ：    https://jsfiddle.net/thanh1992/evhgyuk6/
#**2. CSSを使う**    
CSSのanimation機能を使います。
以下はオルタネイト効果です。
HTML:

    <div class="wrapper">
      <span class="marquee">Home up!</span>
    </div>
CSS:

    .wrapper{
        max-width: 400px;
        text-align: right;
    }
    
    .marquee {
        white-space: nowrap;
        animation: alternateText 4s linear infinite;
    }
    
    @keyframes alternateText {
        0%   {margin-right:0;}
        50%  {margin-right:100%;}
        100% {margin-right:0;}
    }    

デモ： https://jsfiddle.net/thanh1992/mrxdcdqm/
javaScriptで500の切り上げ、切り捨て計算方法

JavaScriptではMath.floor(),Math.ceil()で少数の切り捨て切り上げは用意されているけど、整数については自前で用意しなくてはいけないっぽい。
（自分がみつけていないだけかも。。）

今回はJavaScriptで500単位の切り上げ、切り捨ての計算を実装してみたので、載せます。

コードとサンプル画面は以下です。
【500切り捨て/切り上げサンプル画面】
[コード](https://github.com/adebadayo/FiveHundredFloorAndCeilByJS)
[サンプル画面](http://adebadayo.github.io/FiveHundredFloorAndCeilByJS/)
※jsのコードは最近はまってるAngularJSを使って実装してます。$scopeだとか文法に癖があるんでご了承ください。。

あと、500切り捨て、切り上げを利用した飲み代割り勘アプリも作ったので、
よかったらみてください。
【飲み代割り勘アプリ】
[コード](https://github.com/adebadayo/nomiCal)
[アプリ](http://adebadayo.github.io/nomiCal/)

#htmlのコード
```html
<body ng-app="myApp" ng-controller="myCtrl">
	<h2>500の切り捨て/切り上げ計算</h2>	
	<input teyp="number" placeholder="enter number" ng-model="num"></input>
	<div>切り捨て:{{floorFiveHundred()}}</div>
	<div>切り上げ:{{ceilFiveHundred()}}</div>
</body>
```

#jsのコード

## 切り捨て

```js
	// 500毎に切り下げる関数
	$scope.floorFiveHundred = function(){
		var num = $scope.num;

		if((num % 1000) == 0){
			// 入力値が1000の倍数である場合、計算不要
			return num;
		}

		// 百桁の値を保持
		var hundredDigit = Math.floor(num / 1000);
		
		if((num % 1000) >= 500){
			// 下３桁が500以上の場合
			return (hundredDigit * 1000) + 500;
		}
		else if((num % 1000) < 500){
			// 下３桁が500より下の場合
			return hundredDigit * 1000;
		}
		else{
			return num;
		}
	};
```

##切り上げ
```js
	// 500毎に切り上げする関数
	$scope.ceilFiveHundred = function(){
		var num = $scope.num;

		if((num % 1000) == 0){
			// 1000の倍数である場合
			return num;
		}

		// 百桁の値を保持
		var hundredDigit = Math.floor(num / 1000);
		
		if((num % 1000) > 500){
			// 下３桁が500より上の場合
			return (hundredDigit + 1) * 1000;
		}
		else if((num % 1000) <= 500){
			// 下３桁が500以下の場合
			return (hundredDigit * 1000) + 500;
		}
		else{
			return num;
		}
	};

```
ESP8266+Arduinoの電源電圧(VCC)の測定方法




# ESP8266を電池駆動すると電池の状態がモニタしたくなる。

ESP8266はADCとしてTOUTが一つだけついている。TOUTの入力を無効にすれば、電源電圧(3V3)端子に入ってくる電源電圧が測定できる仕組みがある。これを使用して電池運用中の電池の状態を監視ができる。

# どうやるの？

1. 電圧測定モードを電源電圧測定モードにする。
 以下のコードはコードブロックの中に書いてもエラーになるので注意。(サンプルコード参照)
 
  ```cpp
  ADC_MODE(ADC_VCC);
  ```
 
2. 測定したいところで、ESP.getVCC()を呼び出す。
 
  ```cpp
   int v3 = ESP.getVcc();
 
  ```
 値の単位はmVであり、3.3Vであれば3300が返されます。

# サンプルコード
```cpp
#include <ESP8266WiFi.h>

// 電源電圧を測定するためにADCを使うことを宣言
// 本マクロは、コードブロック中に宣言できない点注意
// 本マクロ宣言後、analogRead(A0)は常に1024を返します。
ADC_MODE(ADC_VCC);

void setup() {
  Serial.begin(9600);
}

void loop() {

  // 電源電圧を取得します。
  int v3 = ESP.getVcc();

  Serial.println( ":>>"+String(v3));
  delay(1000);                      // Wait for a second
}
```

# 注意点
電源電圧測定は、TOUTのADC機能と排他で設定されているため、この機能を使う場合にはTOUTのADC(0-1V)のanalogRead()は使用できず、常に1024が返されます。かつ、TOUTに信号が入力されると、電源電圧の測定値にぶれが出ると思われます(未検証)

# 参考情報
http://ashiyu.cocolog-nifty.com/blog/2015/08/esp82663v3-1932.html
SublimeText3のSublimeREPLでPyenvでインストールしたpythonを使う



## 事前準備
* SublimeText3をインストール
* SublimeREPLをインストール
* Pyenv経由でpythonをインストール

## 手順
1) Userディレクトリを作成

```sh
cd ~/Library/Application Support/Sublime Text 3/Packages
mkdir -p User/SublimeREPL/config/Python
```

2) 設定ファイルをコピー

```sh
cp -p SublimeREPL/config/Python/Main.sublime-menu User/SublimeREPL/config/Python/
```

3) コピーしたMain.sublime-menuを編集して実行するpythonを変更

cmdで実行されるpythonをpyenv経由に変更する

```json
"cmd": ["~/.pyenv/shims/python", "-i", "-u"],
```

4) REPLを起動

```sh
Python 3.5.1 |Anaconda 2.5.0 (x86_64)| (default, Dec  7 2015, 11:24:55) 
[GCC 4.2.1 (Apple Inc. build 5577)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 

```
みたいに使用されるpythonが切り替わっていれば成功
Atom パッケージ：Browser Refresh on Save

#Atom パッケージ：Browser Refresh on Saveでエラーメッセージ回避

ファイル編集中にcmd+Sのショートカットだけで使用中のブラウザがリロードされる便利モノ。
ディベロッパー的には必須なこのパッケージでいちいちエラーメッセージが出るのが非常に煩わしかったので、とりあえずの回避方法メモ。

> Browser Refresh on Save: 208:211: syntax error: Expected end of line, etc. but found property. (-2741) #65
https://github.com/atom/autosave/issues/65

上記の英語圏やりとりは、私が見た日には、このパッケージ自体の問題ではなく自動セーブの問題みたいだから、報告する先が間違ってるんじゃない？といったコメントで終わっていた。

欲しい機能、動作自体は問題なく、エラーメッセージが邪魔なだけなので、エラーメッセージのアウトプット部分だけ構成ファイル上でコメントアウトするか。みたいな自分のローカルでだけまかり通る乱暴な手段を思いつくが
View Code を開いても該当するエラーメッセージ文が見つからない。

ここで上記の英語圏の「このパッケージ自体の問題じゃない」に信憑性が湧き、エラーメッセージを吐いてるのは別のところから、まではなんとなく理解できたわけだが、出ないようにすればいい、の乱暴な手段は取れないとわかる。

で、めちゃくちゃ単純に
[Browser Refresh on Save]　の設定画面　[Settings]　3選択のチェックボックス
Chrome
Safari
Vivaldi

のうち実際に自分が使うChrome以外の2つを外してみたら、エラーメッセージは吐かれなくなった。
はずした2つのうち、どちらが原因になっていたかまでは未検証。
MacOSXでSNMPを使う設定をする

##予備知識

###ネットワーク管理（Network Management）

ネットワークシステムの状態を監視し、障害の防止や早期発見を行うこと。
稼働状況を一カ所に集めて、集中管理したら便利でしょう。
今回はネットワーク管理の中でも性能管理の話です。

[ネットワーク管理 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E7%AE%A1%E7%90%86 "ネットワーク管理 - Wikipedia")

###SNMP（Simple Network Management Protocol）

IPネットワーク上で、ネットワーク管理システムを構築するためのプロトコル。

SNMPマネージャ:監視する側（snmpwalkなど）
SNMPエージェント:監視される側（snmpdなど）
SNMPコミュニティ:SNMPマネージャとSNMPエージェントとの間で、同じコミュニティ名にすることで情報を共有することができる。

[Simple Network Management Protocol - Wikipedia](https://ja.wikipedia.org/wiki/Simple_Network_Management_Protocol "Simple Network Management Protocol - Wikipedia")

###NET-SNMP

さまざまなUNIXプラットフォームで稼動するSNMP パッケージ。
LinuxでもMacOSでも使える。
snmpdやsnmpwalkはNET-SNMPのツールである。

[Net-SNMP - Wikipedia, the free encyclopedia](https://en.wikipedia.org/wiki/Net-SNMP "Net-SNMP - Wikipedia, the free encyclopedia")

###launchd

良く知らない。というか、初めて知った。
[launchd - Wikipedia](https://ja.wikipedia.org/wiki/Launchd "launchd - Wikipedia")

##やりたいこと

- リモートで状態監視って便利だよね
- LinuxサーバーからMacの状態監視をしたい
- バグやシステムの不具合に悩まされたくないので、監視には枯れた実績のあるシステムがいい
- 監視には多くの稼働実績のあるSNMPを使う

### 前提条件
- Linuxサーバー側の設定は割愛
- LinuxサーバーがSNMPマネージャ、MacがSNMPエージェントという構成になる
- 監視のネットワーク環境は小規模なLANを想定（セキュリティ的に少し緩い）
- SNMPのバージョンはSNMPv2c を使用する
- SNMPで行うのは監視のみ、イベント通知の設定は行わない
- SNMPのコミュニティ名は、慣例に従い「public」としているが、コミュニティ名は本来、秘匿すべき情報である
- Macでsnmpd（SNMPエージェント）を動かすにはlaunchdを使う
- MacOSのバージョンは OS X El Capitan 10.11.4 

## 設定
※NET-SNMPはすでインストールされていると仮定する。

### 起動ファイルを作成

```shell-session
sudo vi /Library/LaunchDaemons/org.net-snmp.snmpd.plist
```
```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
 <key>Disabled</key>
 <true/>
 <key>Label</key>
 <string>org.net-snmp.snmpd</string>
 <key>OnDemand</key>
 <false/>
 <key>Program</key>
 <string>/usr/sbin/snmpd</string>
 <key>ProgramArguments</key>
 <array>
 <string>snmpd</string>
 <string>-f</string>
 </array>
 <key>ServiceIPC</key>
 <false/>
</dict>
</plist>
```

### snmpd の設定

```shell-session
sudo vi /etc/snmp/snmpd.conf
```

LANからのアクセスを許可する

```
（中略）
com2sec local     192.168.1.0/24       public
（以下省略）
```
### snmpdの起動と確認

snmpdの起動

```shell-session
sudo launchctl load -w /Library/LaunchDaemons/org.net-snmp.snmpd.plist
```
snmpdの停止

```shell-session
sudo launchctl unload -w /Library/LaunchDaemons/org.net-snmp.snmpd.plist
```
設定を変更したときは、launchctrl unload を実行してから再度 launchctrl load する必要がある。（これを知らなかったのでいろいろ悩んだ）

snmpdの起動を確認

```shell-session
ps aux |grep snmp
```

### SNMPの接続テスト

ローカルからSNMPの接続を確認（Mac上で実行する）

```shell-session
snmpwalk -v 2c -c public localhost
```

外部からSNMPの接続を確認（Linuxサーバーからネットワーク越しに実行する）

```shell-session
snmpwalk -v 2c -c public MacのIPアドレス
```

SNMPエージェントの設定はここまで。
あとは外部のSNMPマネージャから呼び出して使う。

##おまけ

よし、次はSNMPマネージャの設定だ！と意気込んでいたら、
↓ここに、やろうとしていたことが全部書いてありましたとさ。

[muninでMIB値監視 - Qiita](http://qiita.com/tukiyo3/items/668896c7b3412a01fbf1 "muninでMIB値監視 - Qiita")

じゃんじゃん。
今、Fintechスタートアップを始める時にどんな言語を選ぶべきか？

現在、Fintech系のスタートアップを始めるにあたって、以下の言語で選定を迷っている。

#### フロントエンド（これは決定済み）
- Reactjs
- ReactNative
- redux 

#### バックエンド
- Node.js
- Golang
- Elixir (Phoenix)
- Ruby (RoR)
- Python
- PHP

### どんなプロジェクトか？

- 会計に関する業務オートメーションサービス
- 企業向けとそこの従業員さん向けのサイトとアプリが必要。
- 細かな設定や20種類のレポートページ、情報ダウンロード、データ登録、データ編集がある。
- アクセスは、契約した企業に限定され、同時アクセスは、1000ぐらいを想定しておけば問題ない。
- 会計に関するビジネスロジックには絶対にバグを出せない。
- 長く続けていくプロジェクトなので、今後、優位性のある言語を選びたい

### Node.js

##### 採用すべき理由

- 僕が今最も書ける言語
- npmが本当にすごい
- 構成がシンプル
- 結構早い
- フロントとバックエンドの知識を共有できる
- WEBに情報が多い
- javascriptの文法を知っているプログラマは多い

##### 採用すべきでない理由

- 安定的に動かす仕組みが弱い（シングルスレッド・エラー処理・非同期）
- バグのないコードが書きづらい
- 非同期が多すぎて、読みづらい、バグが出やすい
- co + Promise + yield はいいが学習が必要

### PHP

##### 採用すべき理由

- 僕が２番目に書ける言語
- リクエストごとにコードを一から読むやり方は、問題が少なくて楽
- プログラマの採用がしやすい
- WEBに情報が多い

##### 採用すべきでない理由

- ライブラリ関係が微妙
- 速くない
- 文法が良くない
- 今後、大きな発展が望めない
- 書いていてつまらない
- テスト環境を作るのが、他と比べてめんどくさい
- コードが長くなる
- 強固なコードが書けるわけではない
- エラー処理が優れていない
- 非同期処理がやりづらい

### Ruby

##### 採用すべき理由

- RoRが使いやすい
- 文法がわかりやすい
- 書いていて楽しい
- Gemが充実している
- 採用もそこそこしやすい
- テストが組み込まれており、導入しやすい
- WEBに情報が多い

##### 採用すべきでない理由

- 速くない
- 強固なコードが書けるわけではない
- エラー処理が優れていない
- 非同期処理がやりづらい

### Python

##### 採用すべき理由

- コードが見易い
- 分析系のライブラリが多くある
- コンパイルシステムがある

##### 採用すべきでない理由

- 速くない
- 強固なコードが書けるわけではない
- エラー処理が優れていない
- 非同期処理がやりづらい

### Golang

##### 採用すべき理由

- かなり速い
- 型がある
- 文法が単純で学習コストが低い
- 生産性が低くない
- ライブラリが充実してきている
- 非同期処理がやりやすい
- CPUやメモリを使う処理でも低コストにできる
- go fmtがあり、コードが統一できる
- テストが組み込まれており、導入しやすい
- WEBに情報が多い

##### 採用すべきでない理由

- スクリプト言語に比べて生産性が落ちる
- 文法が少ないせいで冗長なコードになりがち

### Elixir

##### 採用すべき理由

- かなり速い
- Phoenixが使いやすい
- 書いていて楽しい
- Mixがある
- テストが組み込まれており、導入しやすい
- 関数型、ガード、パターンマッチ、パイプ演算子により安全なコードが書きやすい
- 軽量プロセスにより、安全にエラー処理ができ、エラーに対処しやすい
- ホットスワップ機能により、ゼロタイムデプロイがしやすい

##### 採用すべきでない理由

- 採用がしにくい
- 情報が少ない
- 関数型なので、新規概念が多く、学習コストが高い
- ライブラリが少ない
- 人気が出るかわからない
Pull Request / Merge Request の違い

結論から言うと

* featureブランチを開発マスタ用ブランチにマージするなど、あるブランチをあるブランチにマージする依頼を出す点は同じ。
* GitHub と GitLab では使い方の違い上、使われる言葉が違う。  
※ GitHub では、開発する際にリポジトリをForkしてローカルブランチを作成することが想定されている。  
Gitlab では、開発する際に同一リポジトリ内で開発ブランチを作成することが想定されている。

> Merge RequestまたはPull RequestはGitマネジメントアプリケーションで作成され、指定した担当者に2つのブランチをマージするよう依頼します。GitHubやBitbucketでは最初のアクションとしてfeatureブランチをプルするため、Pull Requestという名前を使用します。要求され、最終的に行うアクションという意味でGitLabやGitoriousではMerge Requestという言い回しを使用します。  
>
> 引用元： GitLab flowから学ぶワークフローの実践 http://postd.cc/gitlab-flow/
Fluentd(td-agent)  "Aws::CloudWatchLogs::Errors::InvalidSequenceTokenException" 回避方法

# 事象

fluent-plugin-cloudwatch-logs を使用して複数の AWS EC2 インスタンスから CloudWatch Logs の同一 LogStream へ転送していた際、下記の様な WARNING によりログ転送が行われませんでした。

```
2016-05-14 02:08:24 +0000 [warn]: temporarily failed to flush the buffer. next_retry=2016-05-14 02:42:45 +0000 error_class="Aws::CloudWatchLogs::Errors::InvalidSequenceTokenException" error="The given sequenceToken is invalid. The next expected sequenceToken is: 99999999999999999999999999999999999999999999999999999999" plugin_id="object:XXXXXXXXX1dc"
```

# 原因

仕様のようで、複数の転送元から同一 LogStream への転送時は発生するとのことです。

- [InvalidSequenceTokenException · Issue #32 · ryotarai/fluent-plugin-cloudwatch-logs](https://github.com/ryotarai/fluent-plugin-cloudwatch-logs/issues/32)

# 回避策

LogStream を各インスタンスで固有にします。

## source 部例

例として nginx のログを取得します。

```
<source>
  @type tail
  format /^(?<remote>[^ ]*) (?<host>[^ ]*) (?<user>[^ ]*) \[(?<time>[^\]]*)\] "(?<method>\S+)(?: +(?<path>[^ ]*) +\S*)?" (?<code>[^ ]*) (?<size>[^ ]*)(?: "(?<referer>[^\"]*)" "(?<agent>[^\"]*)" "(?<forwarder>[^\"]*)")?/
  time_format %d/%b/%Y:%H:%M:%S %z
  tag nginx.access
  path /var/log/nginx/access.log
</source>

<source>
  @type tail
  format /^(?<time>\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}) \[(?<log_level>\w+)\] (?<pid>\d+).(?<tid>\d+): (?<message>.*)$/
  tag nginx.error
  path /var/log/nginx/error.log
</source>
```

## インスタンスIDの取得

LogStream を固有にできれば良いのでIDやホスト名等を付与します。今回は InstanceId を付けました。

- fluent-plugin-ec2-metadata で InstanceId を取得
	- 出力タグに InstanceId 付与

```
<match nginx.*>
  type ec2_metadata
  output_tag ${instance_id}.${tag}

  <record>
    instance_id ${instance_id}
    hostname    ${tagset_name}
  </record>
</match>
```

## ログストリームへインスタンスIDを付与

- fluent-plugin-forest で fluent-plugin-cloudwatch-logs の log_stream_name に InstanceId を付与

```
<match *.nginx.*>
  type forest
  subtype cloudwatch_logs

  <template>
    log_group_name ${tag_parts[1]}-${tag_parts[2]}
    log_stream_name ${tag_parts[0]}
    region ap-northeast-1
    auto_create_stream true
  </template>
</match>
```

---

CloudWatch Logs エージェントを使用する場合等、インスタンスIDでログストリームを設定する事が多いですが、
fluent-plugin-cloudwatch-logs で実装していてログが転送されていない場合は確認してみると良いかもしれません。
Apacheのmod_rewriteモジュールで旧ディレクトリへのアクセスをリダイレクトする

# 状況

移設作業に伴い、www.example.com 以下でアクセスするディレクトリが変わる。
旧：www.example.com/old-uri
新：www.example.com/new-uri

old-uriを廃止し、「旧」へのアクセスを「新」へリダイレクトしたい。
new-uriは既に稼働していて、いくつかRewriteRuleが設定されている。


# 要点

1. すでに設定されているRewriteCond の前に RewriteRule を追加
2. R=301による301リダイレクト（永久転送）

1.については、
http://oxynotes.com/?p=7392
>注意点としてRewriteCondの直後に来たRewriteRuleしか有効にならない。2行続けてRewriteRuleを記述しても下の行にはRewriteCondで一致した項目は渡されない。
>もし同じRewriteCondを適応するには以下のように二回書くか、フラグでルールの継続を明示する必要がある。

【before】の2,3行目のつながりを崩さないように、RewriteEngineの直後に設定を追加した。



# before

```sh:before
RewriteEngine   ON
RewriteCond     $1                         !\.someextension$
RewriteRule    ^/new-uri/([0-9a-zA-Z]*);param=(.*)$ /new-uri/$1.someextension;param=$2 [PT,L,QSA]
RewriteRule    ^/new-uri/([0-9a-zA-Z]*)$    /new-uri/$1.someextension [PT,L,QSA]

#--------------------------------------------------------------------------------------------
# old-uri
#--------------------------------------------------------------------------------------------

<Location /old-uri>
    Balancerを呼ぶ設定とか
</Location>

#------------------------------------------------------------------------------
# new-uri
#------------------------------------------------------------------------------

<Location /new-uri>
    Balancerを呼ぶ設定とか
</Location>
```

# after

```sh:
RewriteEngine   ON
RewriteRule     ^/old-uri/(.*)$               /new-uri/$1                [R=301,QSA]
RewriteCond     $1                         !\.someextension$
RewriteRule    ^/new-uri/([0-9a-zA-Z]*);param=(.*)$ /new-uri/$1.someextension;param=$2 [PT,L,QSA]
RewriteRule    ^/new-uri/([0-9a-zA-Z]*)$    /new-uri/$1.someextension [PT,L,QSA]

#------------------------------------------------------------------------------
# old-uri
#------------------------------------------------------------------------------

#<Location /old-uri>
#    Balancerを呼ぶ設定とか
#</Location>

#------------------------------------------------------------------------------
# new-uri
#------------------------------------------------------------------------------

<Location /new-uri>
    Balancerを呼ぶ設定とか
</Location>
```
Let's Encryptしてみました

## Let's Encrypt

無料で利用できるSSL。以下を読むとわかりやすい。

[Let's Encrypt 総合ポータル](https://letsencrypt.jp/)

## 流れ

1. Webサーバに Certbot クライアント をインストール
2. 証明書を取得する
3. Apacheの設定を編集してreload

手順は詳しく書いてあるので省略

[Let's Encrypt 総合ポータル - Let's Encrypt の使い方](https://letsencrypt.jp/usage/)

CentOS7 で実施したが、特にトラブることなく取得できた。
唯一気になったのは、上記ガイド通りに進めるとhttpd停止が必要になった点。
Webroot と呼ばれる方式でサーバ無停止で取得できる。


[Let's Encrypt 総合ポータル - Let's Encrypt ユーザーガイド - Webroot](https://letsencrypt.jp/docs/using.html#webroot)

## 更新の方法

standalon モードでの更新方法

```
cd /path/to/certbot
certbot-auto renew --pre-hook 'systemctl stop httpd' --post-hook 'systemctl start httpd'
```

## おまけ

ついでなのでよりセキュアにしたかったので下記を参考にした。

[TECHSCORE BLOG - ApacheのSSL設定を考えた](http://www.techscore.com/blog/2015/03/07/apache%E3%81%AEssl%E8%A8%AD%E5%AE%9A%E3%82%92%E8%80%83%E3%81%88%E3%81%9F/)
言語処理のための機械学習入門 数学まとめ [サポートベクトルマシン編]

# サポートベクトルマシンを理解する上ので基本的な知識

- [言語処理のための機械学習入門 (自然言語処理シリーズ)](http://www.amazon.co.jp/gp/product/4339027510/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4339027510&linkCode=as2&tag=juke-22)の4.3 サポートベクトルマシンを理解する上で重要な部分をまとめました。

![わかりやすいパターン認識](http://ecx.images-amazon.com/images/I/41GqNGxTbOL._AC_US160_.jpg)

- [言語処理のための機械学習入門 (自然言語処理シリーズ)](http://www.amazon.co.jp/gp/product/4339027510/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=4339027510&linkCode=as2&tag=juke-22)

# 前提

## 訓練データ

```math
x^{(1)}, x^{(2)}, \cdots は訓練時に用いた事例
```

```math
y^{(1)}, y^{(2)}, \cdots は上記のそれぞれの事例に対するクラスラベル(+1 または -1)
```

```math
D =  \{ ( x^{(1)}, y^{(1)} ), ( x^{(1)}, y^{(1)} ), \cdots, (x^{|D|}, y^{|D|}) \}
```

- 正クラス(+1)に属する事例は正例と呼ぶ
- 負クラス(-1)に属する事例は負例と呼ぶ

## 線形分類器

- SVMは線形二値分類器であり、クラス数が2つであるような問題に用いられ、関数は以下のように表す。
    - 文献によっては-bのところが+bとなっているが証明の仕方に都合の良い形式をとると思われるので、気にしない

```math 
w: 2つのクラスを分離する平面の方向ベクトル。向きは正クラスの方向
```

```math 
b: wと分離平面の接点
```

```math
f(x) = w\cdot x - b
```

- 正のクラスラベルは+1で条件は以下の通り

```math
f(x) >= 0
```

- 負のクラスラベルは-1で条件は以下の通り

```math
f(x) < 0
```

## 準備

```math
正例x_+と分離平面を結ぶ垂線の足をx_*とする
```

```math
0 = w\cdot x_* - b\\
w\cdot x_* = b
```

`分離平面から平行`かつ、`分離平面から最短距離にある正例のデータを通る平面`を考えた時に、

```math
正例x_+を通る平面は以下の形で表すことができる
```

```math
k > 0 \\
w\cdot x_+ - b = k \\
```

上記方程式を定数倍しても元の平面と同じなので

```math
w / k \cdot x_+ - b / k = 1 \\
```

となり

```math
w / k は w \\
b / k は b
```

と置き換えてもこれからの計算には影響しないので、以下のように置き換えが可能

```math
w \cdot x_+ - b = 1 \\
w \cdot x_+ = b + 1 \\
```

## マージン最大化

- SVMでは２つのクラスの分離平面が、それぞれのクラスをなるべく遠い位置で分けるようにする問題を取り扱う

```math
平面間のマージンは|x_+ - x_*|となる
x_+とx_*は同じ方向を向いているので
```

```math
w \cdot (x_+ - x_*) = |w| \cdot |x_+ - x_*|
```

先ほど求めた式を利用すると上記は

```math
\begin{align}
w \cdot (x_+ - x_*) &= w \cdot x_+ - w \cdot x_* \\
&= (b + 1) - b \\
&= 1

\end{align}
```

上記2式を合わせると以下のようになり

```math
|w||x_+ - w_*| = 1 \\
|x_+ - w_*| = 1 / |w|
```

2平面間のマージンは以下で表わされるが、

```math
1 / |w|
```

絶対値では扱いにくいので

```math
1 / w^2
```

となり上記を最大化する問題を解くことになるが、

分数も扱いにくいので

```math
w^2
```

の最小化問題へと変換する

あとは本書の内容に沿って読み進めることができる
Qiita の語源は？

= 「聞いた」

# 補足

- 嘘かもしれません。真実を知ってる人がいたら教えてください。
- 「もしかして」と思ってググったら、1記事だけヒットしました。

# 参考

- http://anond.hatelabo.jp/20150127175855



<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# メンター受付


https://menta.work/user/5694

<!-- Update From Qiita API -->
Raspberry Pi で syslog に rsyslogd-2007: action 'action 17' suspended が出た時の対策

Raspberry Pi 3 をごにょごにょし始めて数日、syslogをちょっと見てみようかなと思って見てみたところ、以下のログが頻繁に出てたのでなんだろうと思い調べてみました。

```
# /var/log/syslog
May 14 02:28:38 *** rsyslogd-2007: action 'action 17' suspended, next retry is Sat May 14 02:30:08 2016 [try http://www.rsyslog.com/e/2007 ]
```

どうやらdebianのバグらしく、X Window Systemを使っていない場合、出力されるっぽい。
参考：
https://www.netfort.gr.jp/~tosihisa/notebook/doku.php/raspberrypi/log20151101_rsyslogd-2007
http://xn--u9j0md1592aqmt715c.net/rsyslogd-2007-action-17-suspended/

というわけで、参考を元に以下を実施。

### rsyslog.confを編集
rsyslog.confの（おそらく）一番下にある`xconsole`の設定をコメントアウト

```
$ sudo vi /etc/rsyslog.conf
```

```
#daemon.*;mail.*;\
#	news.err;\
#	*.=debug;*.=info;\
#	*.=notice;*.=warn	|/dev/xconsole
```

### rsyslogを再起動

```
$ sudo /etc/init.d/rsyslog restart
```

以下が出力されればOK

```
[ ok ] Restarting rsyslog (via systemctl): rsyslog.service.
```


無事に該当のログが出力されなくなりました。
macにfluentd(td-agent)をインストールする手順

# 概要

- macにfluentd(td-agent)をインストールする手順です。

# 環境

- OS X Yosemite(バージョン10.10.5)
- fluentd-0.12.19(td-agent-2.3.0-0)

# インストール手順

- [公式サイト](http://www.fluentd.org/download)からtd-agentのdmgをダウンロード
  - 最新版はtd-agent-2.3.0-0.dmgでした（2016/05/14時点） 
- dmgダブルクリックでtd-agent-2.3.0-0.pkgができるのでインストール
  - 全てデフォルト設定でインストール
![スクリーンショット 2016-05-14 8.51.34.png](https://qiita-image-store.s3.amazonaws.com/0/106550/5394bc91-ae39-3391-da80-694a96508588.png)

- td-agentの起動・停止コマンド

``` 
# 起動
sudo launchctl load /Library/LaunchDaemons/td-agent.plist
# 停止
sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
```

- その他

```
# td-agentのインストール先
/opt/td-agent

# td-agentのログファイル
/var/log/td-agent/td-agent.log 

# td-agentの設定ファイル
/var/etc/td-agent/td-agent.conf
```

# 動作確認

## 内容
- 入力(Input Plugin)として、in_exec(日付、ホスト名、OSバージョンのTSV形式になるようにechoコマンド実行）  
  - [exec Input Plugin](http://docs.fluentd.org/articles/in_exec)
- 出力(Output Plugin)として、out_stdout(ログファイルに出力されます) 



## 手順
- `/var/etc/td-agent/td-agent.conf`を編集
  - formatとkeysで、dateTime,hostName,osVersionのタブ区切りだよと指定してます
  - time_keyは、dateTimeを使うように指定
  - タグ名は、なんでも良いがここでは、info.mac
  - 日付フォーマットはtime_formatで指定
  - コマンドの実行間隔は10秒
  - OS名の取得は、`sw_vers -productName`
  - OSバージョンの取得は、`sw_vers -productVersion`

```
<source>
  @type exec
  format tsv
  command echo "$(date +'%Y-%m-%d %H:%M:%S')\t$(hostname)\t$(sw_vers -productName) $(sw_vers -productVersion)"
  keys dateTime,hostName,osVersion
  time_key dateTime
  tag info.mac
  time_format %Y-%m-%d %H:%M:%S
  run_interval 10s
</source>

<match>
  @type stdout
</match>
```

- td-agentの再起動

```
sudo launchctl unload /Library/LaunchDaemons/td-agent.plist
sudo launchctl load /Library/LaunchDaemons/td-agent.plist
```

- ログ確認(stdoutの内容が見れる）

```
2016-05-14 10:41:32 +0900 info.mac: {"hostName":"raimus94-no-MacBook-Air.local","osName":"Mac OS X 10.10.5"}
2016-05-14 10:41:42 +0900 info.mac: {"hostName":"raimus94-no-MacBook-Air.local","osName":"Mac OS X 10.10.5"}
2016-05-14 10:41:52 +0900 info.mac: {"hostName":"raimus94-no-MacBook-Air.local","osName":"Mac OS X 10.10.5"}
```
Javaで画像の解像度(dpi)を取得する

仕事で必要に迫られて調べたのだが、日本語の情報がほとんど見つからなかったのでメモとして残しておきます。

まずは `javax.imageio` のクラスを使って自前でゴリゴリ書くやり方。

```java:GetDpiByImageReader.java
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.metadata.IIOMetadataFormatImpl;
import javax.imageio.metadata.IIOMetadataNode;
import javax.imageio.stream.ImageInputStream;

import java.io.File;
import java.util.Iterator;

public class GetDpiByImageReader {
	public static void main(String... args) throws Exception {
		String imagePath = args[0];
		System.out.println(imagePath);

		try (ImageInputStream iis = ImageIO.createImageInputStream(new File(imagePath))) {
			Iterator<ImageReader> it = ImageIO.getImageReaders(iis);

			if (!it.hasNext()) {
				System.out.println("Can't get ImageReaders");
				return;
			}
			ImageReader reader = it.next();

			reader.setInput(iis);
			IIOMetadata metadata = reader.getImageMetadata(0);
			IIOMetadataNode rootNode = (IIOMetadataNode) metadata.getAsTree(IIOMetadataFormatImpl.standardMetadataFormatName);

			int xDpi = -1;
			int yDpi = -1;

			// 横DPIを取得
			NodeList nodes = rootNode.getElementsByTagName("HorizontalPixelSize");
			if (nodes.getLength() > 0) {
				IIOMetadataNode node = (IIOMetadataNode) nodes.item(0);
				NamedNodeMap nodeAttrs = node.getAttributes();
				Node attr = nodeAttrs.item(0);
				xDpi = Math.round(25.4f / Float.parseFloat(attr.getNodeValue()));
			}

			// 縦DPIを取得
			nodes = rootNode.getElementsByTagName("VerticalPixelSize");
			if (nodes.getLength() > 0) {
				IIOMetadataNode node = (IIOMetadataNode) nodes.item(0);
				NamedNodeMap nodeAttrs = node.getAttributes();
				Node attr = nodeAttrs.item(0);
				yDpi = Math.round(25.4f / Float.parseFloat(attr.getNodeValue()));
			}

			System.out.println(String.format("横 %d DPI", xDpi));
			System.out.println(String.format("縦 %d DPI", yDpi));
		}

	}
}
```

Commons Imagingにズバリdpiを返すメソッドがあるので実際はそれを使えば良いでしょう。

```java:GetDpiByCommonsImaging.java
import org.apache.commons.imaging.ImageInfo;
import org.apache.commons.imaging.Imaging;

import java.io.File;

public class GetDpiByCommonsImaging {
	public static void main(String... args) throws Exception {
		ImageInfo info = Imaging.getImageInfo(new File(args[0]));
		System.out.println(String.format("横 %d DPI", info.getPhysicalWidthDpi()));
		System.out.println(String.format("縦 %d DPI", info.getPhysicalHeightDpi()));
	}
}
```

ImageInfoには、`getPhysicalHeightInch()` というようなDPIとピクセル数から求めたインチを返してくれるメソッドもあるのだが、ミリを返すメソッドはないので自前で計算する。

```
double h = Math.round(info.getPhysicalHeightInch() * 25.4);
double w = Math.round(info.getPhysicalWidthInch() * 25.4);
```
AtomでTexする(Mac)

## はじめに
MacTexだけでTexShopを使えばTexの環境としては十分な機能が提供されるが、
なんかTexShop自体が、UTF-8で保存したら次開いた時文字化けするとかあるので、別のエディタで編集したいと思った

模索しながらだったので、あまり詳細にかけないことをお許し下さい

目標は、Atomでハイライトされて、Command + iしたらtexがコンパイルされて、pdfまで反映される環境。

## MacTex
[ここ](http://qiita.com/_ha1f/items/34aec37688bdf11c49cf#tex%E3%82%92os-x-1011-el-capitan%E3%81%AB%E5%85%A5%E3%82%8C%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%A6%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F)に書いたので、参考にしつつセットアップ
(homebrew, homebrew-caskは先にインストールする必要有)

かなり時間はかかる
＆
`brew cask install mactex`実行時に接続されるサーバーが弱くて、何度もトライしないとつながらないかもしれない。
根気よくトライ。

これでTexShopでTexTexできる

サンプル↓

```tex:sample.tex
\documentclass[a4j,12pt]{jreport}
\title{ {\LaTeX} Texの動作確認}
\author{はるふ}
\date{\today}
\begin{document}
\maketitle

\chapter{おら}

\section{Tex}
うごいてるか？

\end{document}
```

タイプセット！すればpdfができる。

が、一度UTF-8で保存して、再度開くと、文字化けする。。。（僕の環境だけかもしれないが）

ので、他のエディタを使いたくなった。

## コマンドからでも

```bash
ptex2pdf -l -ot "-synctex=1 -file-line-error" "ファイル名.tex"
```

を実行すると、pdfが作成できる

もしできなければ、
`export PATH="/Library/TeX/texbin:$PATH"`
を.zshrcに記述する必要があるかもしれない

## Atom
homebrew-caskでもインストールできるが、バージョンが古いとか、アップデートをAtomからできないとかあるので、直接インストールしたほうが良い（と最近思うようになった）

scriptというパッケージがとても便利なので入れておく（あとで使う）

## AtomでTex(標準)

[Qiita: Mac の Atom で Latex](http://qiita.com/NariseT/items/4b80c80f8e39ea35f597)
とかを見つつ、やってみた。

```bash
apm install latex
apm install language-latex
apm install pdf-view
```

ただ、標準の方法では、英語しかできない

のと、普段pythonとかはCommand+iで実行しているので、同じ感じでタイプセットしたくなった

## scriptを書き換え
Atom -> Preferences
から
Packagesを開いて、settingsのViewCodeを押す

script/lib/grammers.coffeeというファイルを以下のように書き換え

```coffee:grammers.coffee
・・・・・・
  LaTeX:
    "File Based":
      command: "ptex2pdf"
      args: (context) -> ['-l', '-ot', '"-synctex=1 -file-line-error"', context.filepath]

  'LaTeX Beamer':
    "File Based":
      command: "ptex2pdf"
      args: (context) -> ['-l', '-ot', '"-synctex=1 -file-line-error"', context.filepath]
・・・・・・
```

さっきコマンドで実行してた命令をそのままscriptに入れただけですね！

※パッケージをupdateすると、もとに戻るので、再設定が必要です

## 再起動すれば
![名称未設定-1_tex_—__Users_admin_Desktop.png](https://qiita-image-store.s3.amazonaws.com/0/77778/20d59ad5-d2b3-9a36-6a25-966590107934.png "名称未設定-1_tex_—__Users_admin_Desktop.png")
![名称未設定-1_pdf_—__Users_admin_Desktop.png](https://qiita-image-store.s3.amazonaws.com/0/77778/7e3461a4-52b5-368d-c464-6665c0aed51f.png "名称未設定-1_pdf_—__Users_admin_Desktop.png")

できた！


Command + i
で何度でも！

## pbibtex

bibtex使う場合は、以下のようにすると良いかも（自分の環境ではこちら）

```coffee:grammers.coffee
  LaTeX:
    "File Based":
      command: "bash"
      args: (context) ->
        bibName = context.filename.replace /\.tex$/, ""
        ['-c', "ptex2pdf -l -ot \"-synctex=1 -file-line-error\" #{context.filename} && pbibtex #{bibName} -kanji=utf8"]
```

もう一回latex走らせても良いけど、二回やるってことで良いかな

## latexer

autocomplete-plusというパッケージを入れている場合、texに対して補完をきかせるパッケージがあります

`\cite{` とか打つと、bibtexで入れてる論文一覧でてきて選べたり、めっちゃ便利です

```bash
apm install latexer
```
getcharと同じような機能を持った関数をgolangで実現する方法


C言語の`getchar()`の例

```c
#include <stdio.h>
void main()
{
    char ch;
    ch = getchar();
    printf("Input Char Is :%c(%d)",ch, ch);
}
```

goでで実現する場合

```go
package main

import (
    "bufio"
    "fmt"
    "os"
)

func main() {

    reader := bufio.NewReader(os.Stdin)
    input, _ := reader.ReadString('\n')

    fmt.Printf("Input Char Is : %v\n", string([]byte(input)[0]))

    // fmt.Printf("You entered: %v\n", []byte(input))

    // fmt.Println(input)
}
```

golangの場合は、`Enter`が押された時、最後に改行文字`\n`(U+0010)を表示しますが、C言語の`getchar()`では場合は検知することができません　


c言語でこれを検知する場合には、`getch()`を使って、検知をして下さい

参考文献
-----

* https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/zhBE5MH4n-Q
* https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/S9AO_kHktiY
* https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/icMfYF8wJCk
* http://stackoverflow.com/questions/14094190/golang-function-similar-to-getchar
AWSリソース操作権限をタグで絞る　EC2とRDS

##タグで絞った権限付与をしたいという話
リソースの操作権限をインスタンス単位ではなくタグで絞りたい場面ってありますよね。
特定システムに関するタグが付いたリソースだけ、star,stop,restart権限を与えて、
ディベロッパーが効率よく開発できるようにしてあげるとか。
でも、タグで絞れるリソースって限られていて、EC2とRDSしかない認識。

##EC2
EC2 に関してはググればたくさん出てきます。
公式ドキュメントの[ココ](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html"Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可")にタグでしぼれる操作の一覧があります。このドキュメントでCondition Keysに含まれる操作が対象です。

絞れる操作はあまり多くない。EBSのバックアップに関する操作権限があるといいなぁと思ったがなかった。
やはりstart,stop,restartあたりが無難かも。

*ポリシーのサンプル*

```json
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow"
      "Action": [
        "ec2:RebootInstances",
        "ec2:StartInstances",
        "ec2:StopInstances",
      ],
      "Condition": {
        "StringEquals": {
          "ec2:ResourceTag/Nametagtoka": "mobileapplication"
        }
      },
      "Resource": [
        "*"
      ]
    }
  ]
}
```





##RDS
RDSは情報が少ない。

Jimさんのブログ
http://blogs.aws.amazon.com/security/post/Tx2H8VFYCM8A1BF/A-primer-on-RDS-resource-level-permissions

で紹介されており、ドキュメントでは[ココ](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html"Amazon EC2 API アクションでサポートされるリソースレベルのアクセス許可")に記載がある。

RDSをタグで絞るポリシーのサンプル

```json
{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"DenyProductionCreate",
         "Effect":"Allow",
         "Action":"rds:RebootDBInstance",
         "Resource":"*",
         "Condition":{
            "StringEquals":{
               "rds:db-tag/usage":"prod"
            }
         }
      }
   ]
}
```

#おまけ
IAMのポリシーでアンド条件やオア条件とか困る時ありますよね。
http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_elements.html

タグで操作をしぼれるのはEC2とRDSだけの認識です。
他にもある、というのをご存じの方はぜひ教えて下さい。
人工知能を作る人工知能の第一歩をコーディングした(ニューラルネットワークを自動的に進化させる方法)

##概要
理想的には人工知能に人工知能を作らせたい。
しかし現状では難しい点もいくつかあるので、
第一歩としてcifar-10のタスクに対して
最適なニューラルネットワークを自動的に作り出すソースコードを書いた。

##そもそもなぜ作ろうと思ったか？
もし、人間を超えた知能を持つ人工知能の作り方、という答えが存在したとして
それを発見するためにはやはりプログラムなり自動化されたもので探すことで
研究者が手作業で探るより早く発見できる可能性があると思う。
そこで、まずは今のニューラルネットワークでわかっている限りの技術や考え方を取り
入れつつそれを最適に組み合わせるコードを書こうと思った。

##実装したコード
https://github.com/Tlauncher111/automated_evolution

##やったこと
理想的には超難問を用意してニューラルネットワークに解かせるか
問題をadversarial nets的にニューラルネットに作らせる方法がある。
しかしはじめなので、自分のやりたいことを整理しつつ他人に知ってもらう意味をこめて
簡単なタスクでコーディングしてみた。

課題はcifar10の画像認識としてニューラルネットワークの構成を最適化する。
手順は
１．ランダムに複数のニューラルネットワークの構成を作り出す
２．ニューラルネットワークを順位づけして優秀なものから優先的に
　　遺伝的アルゴリズム的に新しいニューラルネットワークを作る
これを繰り返す。

理想としてはニューラルネットワークの構成に最大限の自由な選択肢を与えたい。
ノード・活性化関数・embedding・記憶行列、なんでもすべてありで
すべて自由に構成させたい。むしろニューラルネットワークという概念すらこえた自由な数理モデルを生み出せることが理想だと思う。
今回は、ノードの集まりをクラスターと呼んでそのクラスター単位で自由に
接続を持てるニューラルネットワークの構成にした。

##仕組み
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/ec3d08a3-fc8b-5825-3db7-d448d6710965.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/7f89ae69-f4e9-fe24-0e86-8539200e4e3a.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/fc3dbb72-effd-56f9-3c7d-d7682b4435db.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/8ae77b41-0beb-7dbe-b5a9-c7b7f9c970ae.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/d70605e3-84e2-af82-cfdf-048fd11e4596.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/1af68660-0842-d14d-a7be-6376b732a9d1.jpeg" width="380px">  
<img src="https://qiita-image-store.s3.amazonaws.com/0/124444/224326bd-495e-a3dd-b98f-d36385dd4268.jpeg" width="380px">  

##結果
50000stepで64%程度を達成した。
低いけど今回は精度達成が目標ではないので仕組みづくりとしては成功としたい。
コーディングの改善すべき点として、インプットが分割できない点にある。
つまり、画像を入力するとすべてのクラスターで画像の全画素数値を使うので
畳み込みなど画像を局所的に使って分けて処理するということができないということである。
ここは今後のためにも改善したいが、そこだけ頑張って今更畳み込みやinceptionを発見しても
後出しジャンケン的で意味があまりないので、あくまで未知のニューラルネットワーク構造を
発見させることを目標としたい。

##今後の予定
とにかく人工知能にとって「記憶」はそこから学習する上でも
時系列データを処理する上でも重要なので
言語処理などの時系列タスクを解くために
上よりもっと自由でいろんな機能を作れるコーディングをする予定。

##補足
ニューラルネットワークを自己進化させようと取り組んだ例は過去にもあることは把握している。最も近い例はneuro-evolutionでNeuroEvolution of Augmenting Topologies (NEAT)はゲームのマリオの攻略人工知能などでも使われていた。
ただしアプローチとしてはゲームなどの一見、一つの行動がどう動けば正解か、不正解かがはっきりしないものに対して強化学習的に使われてきたように思う。
あくまで、本プロジェクトの目的は超人工知能を実現するために
自動的に人工知能を作り出す方法を開発することであって
一つの特定のタスクに対してうまくいくようニューラルネットワークを最適化することではない。
データベースからデータを取得する(SELECT)


##列の集計

| 命令        | 内容説明           |
|:-----------|:------------------|
| MAX        | 列の最大値          |
| MIN        | 列の最小値         |
| AVG        | 列の平均           |
| SUM        | 列の合計           |
| COUTN      | 値または行のカウント |

##演算子
| 演算子 | 意味      |
|:------|:---------|
| =     | 等しい    |
| <>    | 等しくない |
| ><    | 等しくない |
| <     | より小さい |
| <=    | 以下      |
| >     | より大きい |
| >=    | 以上      |

下記の記述方法はあまりオススメしませんが、時々古いプログラムを見ると使われている事があるので一応。

| 演算子 | 意味      |
|:------|:---------|
| EQ    | 等しい    |
| NE    | 等しくない |
| LT    | より小さい |
| LE    | 以下      |
| GT    | より大きい |
| GE    | 以上      |


##サンプルプログラム

###行の選択(WHERE)
```
SELECT *
  INTO TABLE itab
  FROM spfli
 WHERE col1  = wa1
   AND col2 <> wa2
   AND col3 IN seltab. // 選択テーブルの場合
```

### 内部テーブルを指定する(INTO TABLE)

```
SELECT *
  INTO TABLE itab
  FROM spfli.
```

###既存内部テーブルに新規行を追加する(APPENDING)

```
SELECT *
  INTO APPENDING [CORRESPONDING FIELD] TABLE itab
  FROM spfli.
```

CORRESPONDING FIELDの使用はオススメしません。
項目などを自動で判別して格納してくれる一見便利そうな機能ですが、その分処理には時間がかかります。
項目の並び順が処理毎に変わらないない限り、取得項目と格納先項目の順番などを合わせて使用しない事をオススメします。

###レコードを１件のみ取得する(SINGLE)

```
SELECT SINGLE *
  INTO TABLE itab
  FROM spfli.
```

他にも、「UP TO 1 ROWS」でも１件のみ取得することができます。
両者の違いについては、下記の比較表にまとめました

| SINGLE | 比較内容 | UP TO 1 ROWS |
|:--|:--:|:--|
| 最初にヒットした1件 | 取得方法 | 全レコードを確認して条件に合う最初の1件 |
| 高い | パフォーマンス | 低い |
| 少ない | バッファ使用量 | 多い |
| 全て含む場合に使用 | 検索条件に主キー(推奨) | 一部のみの場合に使用 |
| 保証されている(マスタなど) | データの存在(推奨) | 保証されていない |

(推奨)は、基本的な考え方の一例です。

###テーブルの名称を静的に指定する(AS)

```
SELECT col1 col2
  INTO table itab
  FROM spfli1 AS s1
       JOIN spfli2 AS s2 ON s1~col1 = s2~col2.
```

###テーブルの動的指定


###全ての列を取得する(*)
全件取得する必要がない限りは個別に項目を指定する事をオススメします。

```

SELECT *
  INTO wa
  FROM spfli.

```

### 列の最大値を取得する(MAX)

```

SELECT MAX(col)
  INTO wa
  FROM spfli.

```

### 列の最小値を取得する(MIN)

```

SELECT MIN(col)
  INTO wa
  FROM spfli.

```

### 列の平均を取得する(AVG)

```

SELECT AVG(col)
  INTO wa
  FROM spfli.

```

### 値または行のカウントを取得する(COUNT)

```

SELECT COUNT(*)
  INTO wa
  FROM spfli.

```

##リンク
[SAP公式サイト(データ読込み)](https://help.sap.com/saphelp_nw70/helpdata/ja/fc/eb3983358411d1829f0000e829fbfe/content.htm?frameset=/ja/fc/eb3983358411d1829f0000e829fbfe/frameset.htm&current_toc=/ja/d3/2e974d35c511d1829f0000e829fbfe/plain.htm&node_id=170&show_children=true#jump170 "Qiita")
AWS Cognito User PoolにiOS SDKを使用してgetSessionしようとするとusername/passwordが正しいのに失敗する問題について

## Cognito UserPoolを使ってみたが、何故かログイン処理が失敗する

**本件、AWS SDK 2.4.2 にてすでに修正されています**

UserPoolへのSDKを使用してログイン処理を実装してみたのですが、
現状、usernameもpasswordも合っているのにgetSession()が失敗する問題があります。
使用しているSDKのバージョンはAWSCognitoIdentityProvider 2.4.1です。

```
// Sign in the user
    AWSCognitoIdentityUserPool *pool = [AWSCognitoIdentityUserPool CognitoIdentityUserPoolForKey:@"UserPool"];
    AWSCognitoIdentityUser *user = [pool getUser];
   [[user getSession:email password:pass validationData:nil scopes:nil]continueWithBlock:^id _Nullable(AWSTask<AWSCognitoIdentityUser *> * _Nonnull task) {
        dispatch_async(dispatch_get_main_queue(), ^{
            if(task.error){
                if (block) {
                    block(nil, task.error);
                }
            }else {
                AWSCognitoIdentityUserSession *session = task.result;
                if (block) {
                    block(session, nil);
                }
            }});
        return nil;
    }];
```

### エラー内容
[Debug] AWSURLResponseSerialization.m line:63 | -[AWSJSONResponseSerializer responseObjectForResponse:originalRequest:currentRequest:data:error:] | Response body:
{"__type":"NotAuthorizedException","message":"Incorrect username or password."}


### 原因はAWS SDKのバグです。
https://forums.aws.amazon.com/thread.jspa?messageID=720209

iOSの言語設定を英語以外に設定した際、正しく日時判定が行えずにログイン処理が失敗しているようです。

新しいSDKがリリースされるまでは、手動でSDKのソースにパッチを当てる必要があります。

```
If you need to patch it before the release, you can add this line before the return statement:

dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];


here:

https://github.com/aws/aws-sdk-ios/blob/master/AWSCognitoIdentityProvider/Internal/AWSCognitoIdentityProviderSrpHelper.m#L266
```

### 上記の問題、GitHubのisuueに登録されたようです。
AWSCognitoIdentityUser getSession fails when device/simulator language differ than english #377
https://github.com/aws/aws-sdk-ios/issues/377