OmniAICreator/Qiita-1.07M huggingface dataset:
CentOS / NetCDF > yum installでインストールした状況 > 関連ファイルの表示

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

```
# yum list installed | grep netcdf
netcdf.x86_64           4.1.1-3.el6.5   @epel                                   
netcdf-devel.x86_64     4.1.1-3.el6.5   @epel                                   
netcdf4-python.x86_64   1.0.2-1.el6     @epel      
```

yum でインストールしたNetCDF環境では`netcdf.a`が見つからない。

ソースからのインストールに切り替えるとする。

現状のファイルについて以下で確認した。

```
# locate *netcdf* | grep -v yumdb | grep -v gz | grep -v py | grep -v doc | grep -v home
/usr/bin/grib_to_netcdf
/usr/include/netcdf.h
/usr/include/netcdf.hh
/usr/include/netcdf.inc
/usr/include/netcdfcpp.h
/usr/lib64/libnetcdf.so
/usr/lib64/libnetcdf.so.6
/usr/lib64/libnetcdf.so.6.0.0
/usr/lib64/libnetcdf_c++.so
/usr/lib64/libnetcdf_c++.so.5
/usr/lib64/libnetcdf_c++.so.5.0.0
/usr/lib64/libnetcdff.so
/usr/lib64/libnetcdff.so.5
/usr/lib64/libnetcdff.so.5.0.0
/usr/lib64/gfortran/modules/netcdf.mod
/usr/lib64/pkgconfig/netcdf.pc
/usr/share/mime/application/x-netcdf.xml
```
surround 覚え書き


参考: [Vim のプラグイン紹介 〜 surround.vim でカッコつける 〜 - Vim のブログ](http://vimblog.hatenablog.com/entry/vim_plugin_surround_vim)

## カーソルがある単語を括る

```
ysaw"
```

## 選択したテキストを括る

```
S"
```

## 削除

```
ds"
```

## 置換

```
cs'"
```
node 7.0.0 に上げたら internal-fs の互換性のない変更により辛いので brew で node 6 系を入れた

node 7.0.0 に上げたら次のようなエラーが出た。

```
Error: Cannot find module 'internal/fs'
    at Function.Module._resolveFilename (module.js:472:15)
    at Function.Module._load (module.js:420:25)
    at Module.require (module.js:500:17)
    at require (internal/module.js:20:19)
```

https://github.com/nodejs/LTS によれば node 6 系は 2018年4月までサポートされるらしい。しばらくこれで大丈夫ですね。

```bash
$ brew tap homebrew/versions
$ brew uninstall node
$ brew install node6-lts
```
NetCDF > link > [netCDF #FMU-973850]: installing netcdff.la or [netcdf.a]

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

```
# yum list installed | grep netcdf
netcdf.x86_64           4.1.1-3.el6.5   @epel                                   
netcdf-devel.x86_64     4.1.1-3.el6.5   @epel                                   
netcdf4-python.x86_64   1.0.2-1.el6     @epel      
```

`netcdf.a`が見つからない状況にいる。

`netcdf.a`をgoogle検索しても無関係の情報が多量に表示される。

見つけたのが以下。

http://www.unidata.ucar.edu/support/help/MailArchives/netcdf/msg11534.html

> To read netCDF data from Fortran, you also need to get and install the 
netcdf-fortran software, which has been separate from the netCDF-C 
library since the 4.1.3 release.  After you have installed the netCDF C
library, the netCDF-fortran library can be built and installed following
these instructions:

>  http://www.unidata.ucar.edu/netcdf/docs/netcdf-fortran-install.html

上記はリンク切れ
http://qiita.com/7of9/items/98c2da475af39fddd14a
<amp-img layout="responsive"> の width 属性値は反映されないことに注意

AMP(Accelerated Mobile Pages)ページで画像を表示するには\<amp-img\>タグを使用します。デフォルトでは指定したwidth/heightの固定表示ですが、layout属性にresponsiveを設定すると、画面幅に応じて自動的に伸縮表示できます。

とても便利ですが、layout="responsive"を指定した際のwidth/height属性値の扱われ方を正しく理解していないと、意図せず画像が引き伸ばされてしまうことがあります。

たとえば、以下のようなコードはどちらも画面（正確には親要素）いっぱいの横幅で表示されます。下のコードの画像は横幅2pxで表示されるわけではないことに注意しましょう。

```
<amp-img src="xxxxx.png"
         width="1200"
         height="600"
         layout="responsive">
</amp-img>
```



```
<amp-img src="xxxxx.png"
         width="2"
         height="1"
         layout="responsive">
</amp-img>
```



## なぜ？？

\<amp-img\>タグのlayout属性を指定しない場合、画像は width/height のサイズ通りに表示されます。しかし、layout="responsive" を指定すると、width/height はアスペクト比（縦横比）の算出にしか使われず、表示サイズは親要素の横幅により決定されます。つまり、縦横比を保ちながら親要素の横幅いっぱいに表示されます。

一定以上の横幅に引き伸ばされたくない場合はCSSでmax-widthを指定する、といった対処が必要になります。

### 実例
実際のAMPページでサンプルを見るのがわかりやすいと思います。サンプルは　[AMPでレスポンシブ・レイアウト指定した画像のwidthは反映されないことに注意](https://www.craneto.co.jp/examples/amp/image_layout/) を参照ください。



地味にハマることがあるかもしれないので、参考になれば幸いです。
NetCDF > link > Building the NetCDF-4.2 and later Fortran libraries

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

NetCDF関連で`netcdf.a`が見つからない状況。
関連 http://qiita.com/7of9/items/374323a390482a6969cf
関連 http://qiita.com/7of9/items/60255794936bdb3d8a69
関連 http://qiita.com/7of9/items/193f19a750e3384c8d2e

インストール情報は以下
(google検索時にリンク切れに遭遇する)

http://www.unidata.ucar.edu/software/netcdf/docs/building_netcdf_fortran.html

`netcdf.a`はstaticライブラリだと思う。

> Building with static libraries

が関係するのだろうか。
linux > locate > ファイルの場所を表示 > netcdf.aは見当たらなかった

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

NetCDF関連の`netcdf.a`が見当たらない状況になっている。

@tukiyo3 さんの[コメント](http://qiita.com/7of9/items/60255794936bdb3d8a69#comment-522a9c50f9f13c3c1a4f)にてファイル検索にldd, locate, findなどを教えていただいた。

RedHat5.2からのlinuxユーザ(その前はFreeBSDユーザ)で、実はlocateを使ったことがありませんでした（もしくは忘れてました）。

```
# locate libgcc.a
/usr/lib/gcc/x86_64-redhat-linux/3.4.6/libgcc.a
/usr/lib/gcc/x86_64-redhat-linux/3.4.6/32/libgcc.a
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/libgcc.a
/usr/lib/gcc/x86_64-redhat-linux/4.4.4/32/libgcc.a
```

```
# locate netcdf.a
```

netcdf.aは入ってないようです。

問題の切り分けができました。
情報感謝です。

```
# yum list installed | grep netcdf
netcdf.x86_64           4.1.1-3.el6.5   @epel                                   
netcdf-devel.x86_64     4.1.1-3.el6.5   @epel                                   
netcdf4-python.x86_64   1.0.2-1.el6     @epel         
```

~~上記のパッケージでは足りないのかは調査中。~~

解決しました。
http://qiita.com/7of9/items/9ab581c15fe89127f429
【iOS】iOS Developerに一括でDeviceを登録する方法【Tips】

 iOS Developerに端末を大量登録する場面があった時に役立つTips


# 登録方法

以下のようなフォーマットでUDIDと登録名をタブ区切りで記載した`.txt`ファイルを用意する

例)
```
Device ID    Device Name
A123456789012345678901234567890123456789  hoge_iPhone7
B123456789012345678901234567890123456789  fuga_iPhone6sPlus
...
```

もしサンプルファイルが欲しい場合はAppleが公式で用意しており、以下のURLからダウンロードできる
https://devimages.apple.com.edgekey.net/downloads/devices/Multiple-Upload-Samples.zip

  

ファイルが用意できたら
あとはiOS Developerにログインして
Devices -> +ボタンからデバイス登録画面を開き
Register Mutaple Devicesにチェックを入れて、ファイルをアップロードすることで登録完了！

![スクリーンショット 2015-11-10 17.03.52.png](https://qiita-image-store.s3.amazonaws.com/0/63597/fc17922a-40c6-2a15-4ac8-008b0798a6c7.png)
Mac の File Open ダイアログで隠しファイルを表示する

# Mac の File Open ダイアログで隠しファイルを表示する方法

**Alt + Shift + 「.」**

File Open ダイアログが表示された状態で Alt + Shift + 「.」 を押すと隠しファイル（/tmpなど)が表示される。
NetCDF > インストール情報の表示 > nc-config --all

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

自分の環境において、netcdf.aファイルが見当たらない。
インストールが失敗しているのか。
http://qiita.com/7of9/items/193f19a750e3384c8d2e

NetCDFの情報をみる方法を調べた。
参考 https://groups.google.com/a/hycom.org/forum/#!topic/forum/YPp3H-93V3w

以下のコマンドを使うようだ。

```
$ nc-config --all
This netCDF 4.1.1 has been built with the following features: 

  --cc        -> cc
  --cflags    -> -I/usr/include
  --libs      -> 

  --cxx       -> c++
  --has-c++   -> yes

  --fc        -> gfortran
  --fflags    -> -I/usr/include
  --flibs     -> 
  --has-f77   -> yes
  --has-f90   -> yes

  --has-dap   -> yes
  --has-nc2   -> yes
  --has-nc4   -> yes
  --has-hdf5  -> yes
  --has-hdf4  -> no
  --has-szlib -> no

  --prefix    -> /usr
  --includedir-> /usr/include
  --version   -> netCDF 4.1.1

```

インクルードパスは分かるが、ライブラリパスは不明。
Index付きのObservableが欲しい


OSSである[rx-extras](https://github.com/davidmoten/rxjava-extras)の[mapWithIndex](https://github.com/davidmoten/rxjava-extras#mapWithIndex)を使えば簡単に実装できました。

導入

```build.gradle
dependencies {
    compile 'com.github.davidmoten:rxjava-extras:0.8'
}
```

コード（Kotlinです）

```kotlin
import com.github.davidmoten.rx.Transformers

Observable.just("a", "b", "c")
          .compose(Transformers.mapWithIndex<String>())
          .forEach { Log.d("test", "${it.index()} : ${it.value()}") }
```

他にも色々メソッドがあるので、便利なのが見つかるかも。
NetCDF > undefined reference to `nf_enddef_' > -L指定の場所が異なる

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
openmpi-1.8.x86_64 とその-devel
mpich.x86_64 3.1-5.el6とその-devel
gcc version 4.4.7 (とgfortran)
```

WRF(Weather Research and Forecasting Model)に関して。

NetCDFファイルを処理するFortran90プログラムをコンパイルしていて、以下のエラーが出た。

> undefined reference to `nf_enddef_'

http://forum.wrfforum.com/viewtopic.php?f=27&t=870

libの場所が異なるようだ。

> and so you should change 
>
-L/home/wrf/netcdf/netcdf-4.0/lib -lnetcdf
>
to
>
>-L/home/wrf/netcdf/netcdf-4.0/lib -L/home/wrf/netcdf/netcdf-4.0/fortran/.libs/ -lnetcdff -lnetcdf


<hr>
以下にて解決しました。

http://qiita.com/7of9/items/9ab581c15fe89127f429
シェルの変数展開のデフォルト値の扱い

シェルスクリプトを書く際に、変数展開で、代替値やデフォルト値をよく使用する。
これらは、コロン付きと無しで、値が空の時と変数が未定義の時の挙動が変化するのだが、毎回忘れて、確認しているので、覚え方と共にまとめておく。

## コロン付き代替値 `:+`

空の場合は、代替値を使用しない。変数に1文字以上の値が入っていれば、値があるものとして、代替値を使用する。
**人が中身を見た時に見た目に値があれば、代替値**

```bash
hoge=Hello
foo=""
 
echo ${hoge:+exist}
# exist
echo ${foo:+empty}
#
echo ${bar:+undefined}
#
```

## コロン無し代替値 `+`

変数が定義済みであれば、空文字でも、代替値を使用する。
**変数が定義済みならば、代替値**

```bash
hoge=Hello
foo=""

echo ${hoge+exist}
# exist
echo ${foo+empty}
# empty
echo ${bar+undefined}
#
```

## コロン付きデフォルト値 `:-`

値がある場合は、存在する値を使用する。
空の場合と変数未定義は、デフォルト値を使用する。
**人が中身を見たときに、値が見えなければデフォルト値**

```bash
hoge=Hello
foo=""

echo ${hoge:-exist}
# Hello
echo ${foo:-empty}
# empty
echo ${bar:-undefined}
# undefined
```

## コロン無しデフォルト値 `-`

変数未定義のみ、デフォルト値を使用する。
**変数が未定義ならば、デフォルト値**

```bash
hoge=Hello
foo=""

echo ${hoge-exist}
# Hello
echo ${foo-empty}
#
echo ${bar-undefined}
# undefined
```

## まとめ

コロン`:`付きである場合は、表示した際に**人が見て中身があるかどうかが分かること**が重要と覚えておこう。
コロン無しの場合は、システム的に該当変数が存在しているかどうかで判別されているみたい。
とにかく、**コロン=人**
位置情報の座標系から南北東西で指定した距離の座標を得る方法

#位置(lat,lon)から南北nkm、東西nkm離れた地点の座標を得る関数

Android Javaでサンプルを載せます。
経度が緯度により1度あたりの長さが変わりますので、その辺を求めたら四則演算で済ませます。
ソース中LatLngはgoogle map apiのクラスですが、latlonをバラバラに保持するのがめんどいので使ってるだけですので適当に読み替えてください。

```java

package com.example.y_hoshi.maptest.com.example.y_hoshi.maptest.util;

import com.google.android.gms.maps.model.LatLng;

/**
 * GeocodeingUtil
 *
 * 位置情報系の便利関数クラス
 * Created by y_hoshi on 2016/10/26.
 */

public class GeocodeingUtil {
    public static final double DISTANCE_ONE_DEGREE_LATITUDE = 111.3194908;
    public static final double RADIAN_COEFFICIENT = 0.017453293;

    /**
     * 経度1度あたりの距離(km)を返す
     * @param latiudeDegree 距離を求める座標の緯度
     * @return 経度1度あたりの距離(km)
     */
    public static double getDistanceOneDegreeLongitude(double latiudeDegree){
        double res = Math.cos(latiudeDegree * RADIAN_COEFFICIENT) * DISTANCE_ONE_DEGREE_LATITUDE;
        return res;
    }

    /**
     * 指定した座標から南北方向及び東西方向で指定した距離(km)分ずらした座標を返す
     * @param here 現在座標
     * @param toSN 南北方向の移動距離(緯度の正方向を正数、逆を負数で)
     * @param toEW 東西方向の移動距離(経度の正方向を正数、逆を負数で)
     * @return 新しい座標
     */
    public static LatLng getAwayCoordinate(LatLng here, double toSN, double toEW){
        double distanceOneLongitude = GeocodeingUtil.getDistanceOneDegreeLongitude(here.latitude);

        double addLatitudeDegree = toSN / DISTANCE_ONE_DEGREE_LATITUDE;
        double addLongitudeDegree = toEW / distanceOneLongitude;

        return new LatLng(here.latitude + addLatitudeDegree, here.longitude + addLongitudeDegree);
    }
}
```

一応googleのplace picker起動のサンプルも置いておきます。
渋谷駅を中心に600m四方のピッカーを起動するサンプル

```java
PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
builder.setLatLngBounds(
        new LatLngBounds(GeocodeingUtil.getAwayCoordinate(
                new LatLng(35.658100,139.701742), -0.3d, -0.3d)
                ,GeocodeingUtil.getAwayCoordinate(
                new LatLng(35.658100,139.701742),0.3d,0.3d)
        )
);
try {
    startActivityForResult(builder.build((Activity)MainActivity.this), PLACE_PICKER_REQUEST);
} catch (GooglePlayServicesRepairableException e) {
    e.printStackTrace();
} catch (GooglePlayServicesNotAvailableException e) {
    e.printStackTrace();
}
```

##結果
こんなんが指定座標を中心としたnkm範囲で起動できる
<img src = "https://qiita-image-store.s3.amazonaws.com/0/43688/f5b3f4cd-8323-690e-f5fd-401d975f4edf.png" height=640 width=360>
jQuery UIのAutocompleteの_renderItem関数を書き換えて、候補リストにFont Awesomeアイコンを表示


# 背景
[Font Awesomeのアイコン](http://fontawesome.io/icons/)は

```
<i class="fa fa-address-book" aria-hidden="true"></i>
```

のようにタグで指定します。しかし、

[jQuery UIのAutocompleteのリストに画像を表示させる - Qiita](http://qiita.com/kyohei8/items/d9a0c525af73fb76a842)

> JavaScriptでオートコンプリート機能を実装する場合、
jQueryUIにAutocompleteという便利な機能があります。
http://jqueryui.com/autocomplete/
しかし、jQueryUIのAutocompleteで表示する候補リストは
テキストでしか表示できないようになっています。

# 方法

> そこでjQueryUIネイティブの_renderItem()関数を置き換えることで
htmlタグを利用できるようにします。

同じように`_renderItem`を書き換えます。

書き換える前の、[オリジナル](https://github.com/jquery/jquery-ui/blob/1.12.1/ui/widgets/autocomplete.js#L578)は

```
	_renderItem: function( ul, item ) {
		return $( "<li>" )
			.append( $( "<div>" ).text( item.label ) )
			.appendTo( ul );
	}
```
です。これを良い感じに書き換えます。

例えば、labelに入っている`@`を[globe](http://fontawesome.io/icon/globe/)アイコンに置き換えます。

```
  $.ui.autocomplete.prototype._renderItem = function(ul, item) {
    const [label, url] = item.label.split('@')

    return $("<li>")
      .append($(`<div>${label} <i class="fa fa-globe"></i>${url}</div>`))
      .appendTo(ul)
  }
```
Gmail振り分け - フィルタルールの作成とTips

# フィルタの作成
- Gmail を開きます。
- 目的のメールの横にあるチェックボックスをオンにします。
- [その他] をクリックします。
- [メールの自動振り分け設定] をクリックします。
- フィルタ条件を入力します。

# フィルタ条件の入力
- 特定の件名でフィルタしたい場合[件名]に文言を入力して下さい
- その際に下記のように自分のメールアドレス（以下だとhoge@gmail.com）を含まないに入れておくとダイレクトメールのみ受信トレイに出てくるので便利です（オススメ）

<img width="531" alt="スクリーンショット 2016-10-26 9.45.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/34936/1912add3-a84c-55a9-d10b-e12d86a8faa4.png">
raspberry pi 1 model bで、node-red　その７

#概要
raspberry pi 1 model bの、node-redで、serialでhelloworldしてみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#回路図
![ras9.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/8df3c69b-7101-ee2b-8fb3-add6b6b23fd9.jpeg)

#写真
![ras10.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a6586ee9-d38a-03ab-3328-c459406b21ad.jpeg)

#uartの設定
/boot/cmdline.txt を修正します。
具体的には "console=ttyAMA0,115200" を削除。
サービスを削除します。
sudo systemctl stop serial-getty@ttyAMA0.service
sudo systemctl disable serial-getty@ttyAMA0.service
#サンプルコード
```
[{"id":"31aeed8b.df1222","type":"inject","z":"addc1b17.459d98","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"x":192,"y":156,"wires":[["46046e9c.a9ffb"]]},{"id":"8eccd597.5bce98","type":"serial out","z":"addc1b17.459d98","name":"","serial":"bf19e4f6.9d9348","x":202,"y":364,"wires":[]},{"id":"46046e9c.a9ffb","type":"template","z":"addc1b17.459d98","name":"hello","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"hello world!","x":202,"y":262,"wires":[["8eccd597.5bce98"]]},{"id":"bf19e4f6.9d9348","type":"serial-port","z":"addc1b17.459d98","serialport":"/dev/ttyAMA0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","newline":"\\n","bin":"false","out":"char","addchar":true}]
```
td-agentをAmazon Linuxに導入する

ただの手順書です

# 事前準備

インストールするのに[事前条件](http://docs.fluentd.org/articles/before-install)があるので確認し、満たしていないなら対応します。

まず、ファイルディスクプタの最大値を調べます。

```
$ ulimit -n
1024
```

65535という条件を満たしていないので、以下で設定し、再起動します。

```
sudo vi /etc/security/limits.conf

以下を末尾に追加
root soft nofile 65536
root hard nofile 65536
* soft nofile 65536
* hard nofile 65536
```

なお再起動したくない場合は、rootになってから ```ulimit -n 65536``` を行うと値がかえれますが、再起動後も反映されていることを確かめるために再起動をおすすめします。

次に、ネットワーク設定を行います。

```
sudo vi /etc/sysctl.conf

以下を末尾に追加
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 10240    65535

その後、以下で反映させます。
sudo sysctl -p
```

# td-agentのインストール

[Installing Fluentd Using rpm Package](http://docs.fluentd.org/articles/install-by-rpm)を参考にしてインストールします。

```
以下を実行します。
curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

インストール後起動します
sudo /etc/init.d/td-agent start

サーバリブートしても自動で起動するようにします
sudo chkconfig td-agent on
```

# BigQueryに接続できるようにする

[ユーザの行動ログをBigQueryで分析！RubyからFluentdを通して、BigQueryへ任意のログをJSON形式で保存する](http://qiita.com/wapa5pow/items/72bc70b37a8ed042a16d)を参考に設定する

まず必要なプラグインをインストールします

```
sudo td-agent-gem install fluent-plugin-bigquery
sudo td-agent-gem install fluent-plugin-forest
```

設定ファイルを変更する

```
# バックアップする
sudo cp /etc/td-agent/td-agent.conf /etc/td-agent/td-agent.conf.bk

# 編集する
sudo vi /etc/td-agent/td-agent.conf 

<source>
  @type forward
  port 24224
</source>

<filter action.**>
  @type record_transformer
  <record>
    tag ${tag}
  </record>
</filter>

<match action.**>
  @type copy
  <store>
    @type forest
    subtype bigquery
    <template>
      method insert

      auth_method json_key
      json_key xxx.json

      buffer_type file
      buffer_path /var/log/td-agent/buffer/${escaped_tag}

      project xxx
      dataset xxx
      table ${escaped_tag}_%Y%m%d
      auto_create_table true
      convert_hash_to_json true

      time_format %s
      time_field time
      schema_path /etc/td-agent/action_schema.json
    </template>
  </store>
  <store>
  @type stdout
  </store>
</match>
```

スキーマの作成

```
sudo vi /etc/td-agent/action_schema.json

[
  {
    "name": "tag",
    "type": "STRING"
  },
  {
    "name": "time",
    "type": "INTEGER"
  },
  {
    "name": "message",
    "type": "STRING"
  }
]
```

td-agentを再起動する

```
sudo /etc/init.d/td-agent restart
```

試しに、ログをなげてみます。BigQueryに入っていれば完了です。

```
echo '{"message": {"key": "value"}}' | /opt/td-agent/embedded/bin/fluent-cat action.new_log
```

# 最後に

今回の設定はバッファが溢れてデータロスとか考えていないので、必要な場合は、S3などにバックアップしてください
javax.swingのHello WorldをClojureで書く

ふと思いついたのでオラクル社が提供しているチュートリアルをやってみた。

http://docs.oracle.com/javase/tutorial/uiswing/start/compile.html


## Java版

``` java
package start;
 
/*
 * HelloWorldSwing.java requires no other files. 
 */
import javax.swing.*;        
 
public class HelloWorldSwing {
    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("HelloWorldSwing");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 
        //Add the ubiquitous "Hello World" label.
        JLabel label = new JLabel("Hello World");
        frame.getContentPane().add(label);
 
        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }
 
    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}
```


## Clojure版

``` clj
(ns start.core
  (:import [javax.swing JFrame JLabel SwingUtilities]))

(defn start []
  (let [frame (JFrame. "HelloWorldSwing")
        label (JLabel. "Hello World")]
    (-> frame .getContentPane (.add label))
    (doto frame (.setDefaultCloseOperation JFrame/DISPOSE_ON_CLOSE) .pack (.setVisible true))))
```

- Clojure版の方はreplからstart関数を呼ぶだけで結果が確認できるのでmain関数を書かなかった。
- Clojure版の方は(.setDefaultCloseOperation JFrame/EXIT_ON_CLOSE)するとreplを道連れにしてしまうのでDISPOSE_ON_CLOSEとした。
ハッシュのハッシュになっているyamlをsnakeyamlで読み込む時のサンプルソース

# やりたいこと

- こういうYAMLをsnakeyamlで読み込みたい。ハッシュのハッシュのかたち。

```personData.yaml
yamada:
  id: 100
  address: 東京
  age: 20
tanaka:
  id: 101
  address: さいたま
  age: 22
```

# 実現の条件

- キャストはしたくない。
- `@SuppressWarnings("unchecked")` なんてやりたくない。
- なるべくソースを書きたくない。
- `Yaml.loadAs()`とかをうまく使ってなるべく楽したい。

# 適用の検討

ハッシュなので`java.util.Map`で`Yaml.loadAs()`したとする。これだと型パラメータを指定できないのでキャストとか面倒事が増える。

```java
Yaml y = new Yaml();
Map<?, ?> personMap = y.loadAs(PersonDataYamlTest.class.getResourceAsStream("/personMap.yaml"), Map.class);
```

こんな`personMap`は使いたくない。しかし、型パラメータを直接指定するようなAPIはなさそうなので、別のやり方をとる。

妥協案的に、yamlを以下の形式に変える。

```personData2.yaml
personData :
  yamada:
    id: 100
    address: 東京
    age: 20
  tanaka:
    id: 101
    address: さいたま
    age: 22
```


読み込むコード

```PersonDataYaml.java
package testsnakeyaml;

import org.yaml.snakeyaml.TypeDescription;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.Constructor;

import java.util.Map;

public class PersonDataYaml {
  public Map<String, Person> personData;

  static PersonDataYaml loadSetting(String file) {
    Constructor constructor = new Constructor(PersonDataYaml.class);
    TypeDescription desc = new TypeDescription(PersonDataYaml.class);
    desc.putMapPropertyType("personData", String.class, Person.class);
    constructor.addTypeDescription(desc);
    Yaml y = new Yaml(constructor);
    return y.loadAs(PersonDataYaml.class.getResourceAsStream(file), PersonDataYaml.class);
  }

  static class Person {
    public int id;
    public String address;
    public int age;
  }
}
```



テストコード

```PersonDataYamlTest.java
package testsnakeyaml;

import org.junit.jupiter.api.Test;
import org.yaml.snakeyaml.Yaml;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class PersonDataYamlTest {
  @Test
  void testRawMap() {
    Yaml y = new Yaml();
    Map<?, ?> personMap = y.loadAs(PersonDataYamlTest.class.getResourceAsStream("/personData.yaml"), Map.class);

    assertTrue(personMap.values().iterator().next() instanceof Map);
  }

  @Test
  void testBean() {
    PersonDataYaml yaml = PersonDataYaml.loadSetting("/personData2.yaml");
    assertEquals(100, yaml.personData.get("yamada").id);
    assertEquals("東京", yaml.personData.get("yamada").address);
    assertEquals("さいたま", yaml.personData.get("tanaka").address);
  }
}
```

# 考えたこと

- 読み込むYAML全体を、`PersonDataYaml.java`とし、`personData`なるフィールドに型がつけられた`Map`を保持させる。
  - 階層が1個増えたが妥協なので我慢。
- ハッシュのキーは、JavaBeansの仕様に合わせる必要があるようなので、ここでは簡単にpublicフィールドとする。
  - 要件次第でsetter,getterを付ける。
- staticなファクトリメソッドで読み込み処理をやらせる。必要なデータと操作を全て押し込める事ができたようなのでこれで良しとする。
- もっと簡素に書けるなら、そのように修正したい。

# 利用したバージョン

- SnakeYAML 1.17


# ネタ元

- https://bitbucket.org/asomov/snakeyaml/wiki/Documentation#markdown-header-type-safe-collections
- https://bitbucket.org/asomov/snakeyaml/src/tip/src/test/java/org/yaml/snakeyaml/constructor/TypeSafeCollectionsTest.java?fileviewer=file-view-default

(このwiki記事と内容一緒なんですが、ベストプラクティス的になってないのでわたしなりのを書いてみた次第。)
Zabbix 3.2のエージェントをAmazon Linuxに導入する

ただの手順書です

# Amazon LinuxへのZabbixエージェントのインストール

インストール

```
sudo rpm -ivh http://repo.zabbix.com/zabbix/3.2/rhel/6/x86_64/zabbix-release-3.2-1.el6.noarch.rpm
sudo yum install -y zabbix-agent zabbix-get
```

設定ファイルを以下のように編集する

```
# バックアップ
sudo cp /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.bk

# 編集
sudo vi /etc/zabbix/zabbix_agentd.conf

以下のように編集する。ただし、zabbix.example.jpは任意の値にかえる
$ diff /etc/zabbix/zabbix_agentd.conf /etc/zabbix/zabbix_agentd.conf.bk
95c95
< Server=127.0.0.1,zabbix.example.jp
---
> Server=127.0.0.1
136c136
< ServerActive=127.0.0.1,zabbix.example.jp
---
> ServerActive=127.0.0.1
147c147
< Hostname=acc001-dev3.example.jp
---
> Hostname=Zabbix server
```

起動とブート時起動設定

```
sudo service zabbix-agent start
sudo chkconfig zabbix-agent on
```

起動後、Zabbixサーバ側で正しく設定されているか確認する。

# 追記: Server <=> Agentを暗号化する

* http://qiita.com/wapa5pow/items/10dcf5099ca35ec14117
linux > ls と less組合せ時に複数列表示を保つ > ls -x | less  または ls -C | less

```txt:動作環境
CentOS 6.8
```

多量のファイルがあるディレクトリにおいて、ls実行時には3列などの表示になる。

`ls | less`にするとこれが1列表示になる。

複数列でのls+lessの表示は

http://askubuntu.com/questions/89173/preserving-multi-column-output-from-ls-when-paging

によると

`ls -x | less`
もしくは
`ls -C | less`
とのこと。

やってみたら2列では表示された。3列にはならない。

関連 http://qiita.com/7of9/items/d62e96ac4630a033276a
Qiita > 要望 > 検索結果に「ストックした（日時による）順番」を追加してほしい

現在Qiitaでは検索結果に以下の順番でのソート機能があります。

- 関連順
- 新着順
- ストック数順

上記に加えて「ストックした（日時による）順番」というソートが欲しいです。

「ストックした順番」があれば、野口悠紀雄さんの「超整理法」の「押し出しファイリング」が実施できます。
http://ameblo.jp/mezaone28/entry-11873943583.html

手順

1. 直近で作業する内容に関する複数の記事をストックしなおす
2. 「ストックした順番」でソートして使う

こうすることで、自分が作業する関連情報だけを逐次まとめることができて、作業が捗るように思います。

ただし、これをするには「ストックした日時」という項目がデータベースに必要になるでしょう。
Boost.MSMと包含を利用してprivate空間にアクセス可能なクラス内有限状態マシンを実装する

Boost.MSMをPimplイディオムと組み合わせることで、外部に隠蔽しつつ、privateな空間にもアクセス可能なクラス内有限状態マシンを実装する。
ヘッダファイルにBoost.MSMを使用している痕跡を残さずに、有限状態マシン内で基本オブジェクト(ここではFooオブジェクト)に自由にアクセスすることができる。


```cpp:Foo.h
#pragma once

#include <memory>

struct Foo
{
    Foo();
    ~Foo();
    
    void changeState();
private:
    struct Impl;
    std::unique_ptr<Impl> pImpl;
};
```

```cpp:Foo.cpp
#include <iostream>
#include <boost/msm/front/state_machine_def.hpp>
#include <boost/msm/back/state_machine.hpp>

struct Foo::Impl
{
// *** ポイント１
// Implクラスのクラス内クラスとしてBoost.MSM用クラスを定義する

    // 状態の定義
    struct RunState : boost::msm::front::state<>{

        // Fooクラスのprivate変数にアクセスしている。
        template<typename Event, typename FSM>
        void on_entry(Event event, FSM fsm)
        {
            std::cout << "Run  : " << ++(fsm.base->pImpl->value) << std::endl;
//          std::cout << "Run  : " << ++(value) << std::endl;   // Foo::Impl::valueには直接アクセスできない
        }
    };
    struct StopState : boost::msm::front::state<>{
        template<typename Event, typename FSM>
        void on_entry(Event event, FSM fsm)
        {
            std::cout << "Stop : " << ++(fsm.base->pImpl->value) << std::endl;
        }
    };

    // イベントの定義
    struct ChangeEvent {};

    // 有限状態マシンの定義
    struct Machine_ : boost::msm::front::state_machine_def<Machine_>
    {
        // 状態遷移テーブル
        struct transition_table : boost::mpl::vector
            < _row< RunState, ChangeEvent, StopState >
            , _row< StopState, ChangeEvent, RunState >
            > {};

        // 初期状態
        using initial_state = StopState;
        
// *** ポイント２
// 有限状態マシンの定義内で基本オブジェクト(Fooクラスのオブジェクト)を保持する

        // 基本オブジェクトのポインタを保持。ここから基本オブジェクトにアクセスする
        Foo*const base;

        // 有限状態マシンのコンストラクタ
        Machine_(Foo*const obj) : base(obj){}
    };

    // 有限状態マシンクラスの定義
    using Machine = boost::msm::back::state_machine< Machine_ >;
    Machine machine; // 有限状態マシンをImplクラス内で保持する(包含)
    
    Impl(Foo*const obj)
        : machine(obj)
        , value(0)
    {
    }
    
    // プライベート変数
    int value;
};

Foo::Foo()
    :pImpl(new Foo::Impl(this))
{
    pImpl->machine.start();
}

Foo::~Foo()
{}

void Foo::changeState()
{
    pImpl->machine.process_event(Impl::ChangeEvent());
}
```

```cpp:main.cpp
#include "Foo.h"

int main()
{
    Foo foo;
    foo.changeState();
    foo.changeState();

    return 0;
}
```

```:result
Stop : 1
Run  : 2
Stop : 3
```
TensorFlow > link > Inception / retraining (Transfer Learning)

Train an Image Classifier with TensorFlow for Poets - Machine Learning Recipes #6
https://www.youtube.com/watch?v=cSKfRcEDGUs

4:57頃
Inceptionというものが紹介されている。

- One of Google's best image classifiers
- Trained on 1.2 million images
- Training took 2 weeks

上記はたくさんのGPUを使って学習されたようだ。
データはIRISというものらしい。

その学習結果を「retraining (Transfer Learning)」して使うことで、一般のPC上での学習を加速する効果があるようだ。

詳細は未消化。

### 関連

神嶌 敏弘 さんの資料
http://www.kamishima.net/archive/2010-s-jsai_tl.pdf

@ 朱鷺の杜Wiki
http://ibisforest.org/index.php?%E8%BB%A2%E7%A7%BB%E5%AD%A6%E7%BF%92

http://cs231n.github.io/transfer-learning/
技術英語 > some of which are more commonly performed by [specialized test personnel] / staffとpersonnel

@ Code Complete (No. 16202 / 36077)

Developer Testingの章 (Chapter 22)

> some of which are more commonly performed by <font color=red>specialized test personnel</font>:

<hr>
staffとpersonnelの違いについて

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11144482736

> 超要約すると、
Personnelは、社長以下すべての従業員
staffは課長未満の従業員

上記が正しい理解かは未消化。

<hr>
staffとstuffはよく間違える英語。

自分の場合は

STAFF
の
A
は人が足を広げて立っているイメージ、として記憶した。
raspberry pi 1 model bで、node-red　その６

#概要
raspberry pi 1 model bの、node-redで、スイッチを監視してみた。
#開発環境
raspberry pi 1 model b
raspbian 2016_09_23 jessie lite
#回路図
![ras8.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/dd4bbf21-708a-3438-1512-ba197e1cba29.jpeg)

#写真
![ras7.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/c0dff5ec-c90e-262e-7ab3-69b51b59bbe4.jpeg)

#サンプルコード
```
[{"id":"471fb530.4d5c6c","type":"debug","z":"addc1b17.459d98","name":"","active":true,"console":"false","complete":"payload","x":433,"y":324.0714416503906,"wires":[]},{"id":"26e992a8.cce58e","type":"rpi-gpio in","z":"addc1b17.459d98","name":"gpio17","pin":"11","intype":"up","debounce":"25","read":true,"x":162.5,"y":322,"wires":[["471fb530.4d5c6c","307893d8.6450dc"]]},{"id":"307893d8.6450dc","type":"rpi-gpio out","z":"addc1b17.459d98","name":"gpio4","pin":"7","set":"","level":"0","out":"out","x":418.5,"y":241,"wires":[]}]
```
IchigoJamと8x8マトリックスLEDでつくる電光掲示板

IchigoJamに8x8ドットのマトリックスLEDをつないで電光掲示板を作ってみました。

8x8ドットなので表示できるのは一文字分ですが、右から左に文字が流れて行くようにLEDを点灯させることで、電光掲示板を作ることができます。

電光掲示板に表示する文字は、IchigoJamバージョン1.2から使える文字列変数を使用しているので、変数の文字を変えるだけで簡単に変更することができます。
IchigoJamで使えるすべての文字が使えます。キャラ文字も使えます。

こちらに電光掲示板が動いている様子の動画があります。
[サンプル動画](https://www.facebook.com/ynosepi/videos/557537741103870/)

# 機材
- IchigoJam  
    バージョンは**1.2**以上が必要です。
- マトリックスLED  
    aitendoの[I2Cマトリックスキット](http://www.aitendo.com/product/12823)を使っています。  
組立キットなので、はんだ付けが必要です。  
IchigoJamには**I2C**で接続します。

## 接続方法
| IchigoJam | -> | マトリックスLED | 
|----------:|:--:|:---------------|
| VCC       | -> | VCC            | 
| GND       | -> | GND            | 
| IN3 (またはSDA)| -> | SDA | 
| EX1 (またはSCL)| -> | SCL |

# プログラム
```IchigoJamBASIC:MatrixLED.txt
1 'MatrixLED Sample

10 CLS:CLV
20 T="IchigoJam "

100 @INIT
110 C=#70:D=#783:M=#800
120 POKE #780,#21,#81,#E1,#00
130 FOR A=#780 TO #782
140  IF I2CW(C,A,1,#780,0)?"E"
150 NEXT

200 GSB @MSG
210 GSB @CLEAR

300 END

900 @CLEAR
901 LET [0],0,0,0,0,0,0,0,0

910 @MLED
911 Z=I2CW(C,D,1,M,16) 
912 RTN

920 @SCROLL
921 FOR S=0 TO 7
922  FOR I=0 TO 7
923   IF L>0 THEN [I]=([I]<<1|[L+I]>>(7-S)) ELSE [I]=([R+I]<<(7-S)|[I]>>1)
924  NEXT
925  GSB @MLED
926  WAIT 1
927 NEXT
928 RTN

930 @MSG
931 L=10:R=0:?STR$(T)
932 FOR X=0 TO LEN(T)-1
933  FOR I=0 TO 7
934   [10+I]=PEEK(ASC(T+X)*8+I)
935  NEXT
936  GSB @SCROLL
937 NEXT
938 RTN
```

# プログラムの解説
- `20行目`: マトリックスLEDに表示する文字を変数`T`に代入します。  キャラ文字も含めてIchigoJamで使える文字を表示することができます。  末尾のスペースは、最後の文字をスクロールアウトさせるために入れてあります。
- `100～150行目`: マトリックスLEDの初期化を行います。
- `300行目`: プログラムを終了します。
- `200行目`: `@MSG`サブルーチンを呼び出し、マトリックスLEDに文字を表示します。
- `210行目`: `@CLEAR`サブルーチンを呼び出し、マトリックスLEDの表示を消します。
- `900～912行目`: マトリックスLEDを消灯する`@CLEAR`サブルーチンです。910～912行目は`@MSG`サブルーチンに続いています。
- `910～912行目`: マトリックスLEDを点灯する`@MSG`サブルーチンです。
- `920～928行目`: マトリックスLEDの表示をスクロールさせる`@SCROLL`サブルーチンです。
- `930～938行目`: マトリックスLEDに表示する文字を設定する`@MSG`サブルーチンです。

* * *
電光掲示板の文字は、プログラム20行目の変数`T`の文字を変えるだけで簡単に変更できます。
ぜひ好きな言葉を表示させて遊んでみてください。
D言語でBasic認証

[std.net.curl](https://dlang.org/phobos/std_net_curl.html)を使えば簡単にできた。探すのにすこし時間がかかったのでサンプル的なものを書く。

``` d
import std.stdio : writeln;
import std.net.curl : HTTP,get;
void main()
{
    auto url = "URL";
    auto user = "USER";
    auto pass = "PASS";

    auto http = HTTP();
    http.authenticationMethod = HTTP.AuthMethod.basic;
    http.setAuthentication(user,pass);

    auto content = get(url,http);
    writeln(content);
}
```

HTTP.AuthMethodは[etc.c.curl.CurlAuth](https://dlang.org/phobos/etc_c_curl.html#.CurlAuth)のエイリアス。
AppGroupsでデータ共有 (準備編)

#はじめに
AppGroupsでアプリ間の共有を初めてやりました。
準備編として、AppGroupsの登録〜Xcodeでの設定についてまとめます。


アプリ間で文字列の共有と画像の共有してみました。
→[AppGroupsでデータ共有](http://qiita.com/okuderap/items/8d579e8442dbc4322487)

#App Groupsの登録
まずは、Apple Member CenterでAppGroupsを登録します。
![ss01.png](https://qiita-image-store.s3.amazonaws.com/0/103695/036e296c-4969-9bb3-5ec1-729ece79e856.png)

Identifierは逆ドメイン記法でかきます。
![ss02.png](https://qiita-image-store.s3.amazonaws.com/0/103695/68bc7643-ebf7-2848-0cc0-90849e05f40a.png)


内容を確認して登録します。
![ss03.png](https://qiita-image-store.s3.amazonaws.com/0/103695/42d86114-236f-349c-e81f-2129d86b9f30.png)


登録したものがAppGroupsのリストにあることを確認できると思います。

#Xcodeでの設定
AppGroupsを使うアプリのプロジェクトファイルのCapabilitiesを開きます。
![ss04.png](https://qiita-image-store.s3.amazonaws.com/0/103695/4ddfee03-0cbe-2e5f-5003-ad6b388f46a4.png)

AppGroupsをONにして、Member Centerで登録したGroupにチェックをします。
![ss05.png](https://qiita-image-store.s3.amazonaws.com/0/103695/ec8110d2-fad9-03cf-6f07-1806ca533d6e.png)
**こちらで選択したAppGroupsのidentifierはソースコード上でも使用します。**

これで、準備が完了しました。

#さいごに
今回はAppGroupsを使用する前の準備をまとめました。
1回だけレスポンスを返すだけのHTTPサーバー(俺得)

タイトルの通り、**1回だけリクエストに対してレスポンスを返した後にそのまま終了するHTTPサーバー**のスクリプトです。
他にもうちょっとスマートな実装があっても良さそうなのですが、

https://gist.github.com/attakei/c09232241c5a24b4206c7f4758fe8b75

# 主な構成要素

* http.serverモジュールによる、シンプルなサーバー実装
* signalモジュールによる、やっつけな終了処理

## http.serverを軽く取り扱う

いわゆる「ワンライナーでHTTPサーバー」がLL系のプログラミング言語には当たり前のように備わっています。

Python3では`python -m http.server`がそれに当たりますが、これはリクエストを処理するhandler_classに`SimpleHTTPRequestHandler`を用いたものです。（`--cgi`を引数に与えると、`CGIHTTPRequestHandler`が使われます）
`SimpleHTTPRequestHandler`は実行時のカレントディレクトリをルートにする静的ファイル限定のHTTPサーバーとみなしてリクエストを処理します。

閑話休題

`http.server`がサーバとして動しているインスタンスは`HTTPServer`なのですが、`serve_forever()`というメソッドしかありません。[^1]
そのため、1回だけしかリクエストを受け付けないようにするためには、どうにかリクエストの処理の時点でサーバーには死んでもらう必要があります。

で、こんなコードを書きました。

```python3
class OnceHttpServer(HTTPServer):
    def shutdown_by_signal(self, sig_num, frame):
        self.server_close()
        sys.exit(0)

    def process_request(self, request, client_address):
        super().process_request(request, client_address)
        signal.setitimer(signal.ITIMER_REAL, 0.5, 0.5)


def run(server_class=OnceHttpServer, handler_class=SimpleHTTPRequestHandler):
    server_address = ('0.0.0.0', int(os.environ.get('PORT', 8000)))
    httpd = server_class(server_address, SimpleHTTPRequestHandler)
    signal.signal(signal.SIGALRM, httpd.shutdown_by_signal)
    httpd.serve_forever(2)

```

`OnceHttpServer`は`HTTPServer`を継承しているのですが、１個のメソッド追加と１個のメソッド拡張を持っています。

### process_request()

拡張したほう。
基本的にリクエストを受け付けた時点でその処理をするメソッドなのですが、大元の処理終了後に**ひたすらSIGALRMを投げ続けさせる命令**を追加します。
これで、最初のリクエストを処理以降、何処かのタイミングでSIGALRMに対応された処理を実行しようとプロセスが躍起になります。

### shutdown_by_signal()

追加したほう。
サーバーのクリーンアップを行なったのちに、**`sys.exit(0)`を実行してプロセスをまるっと停止させます。**
このメソッドは、run()内でSIGALRMに対する処理として登録します。

こうすることで、

0. SIGALRMにshutdown_by_signal()を登録してからサーバー待ち受け開始
0. 最初のリクエストを処理すると当時にSIGALRMを定期的に送信（死ぬまで）
0. シグナルを受け付けたshutdown_by_signalが自ら死を選ぶ

こんな感じの挙動すします。


# 誰得？

**極めて俺得です。**
他の人向けの使い道としては、特定のステータスコードを返すようにしてHTTPリクエストをするクラスのモックには使えるんじゃないでしょうか。

本来、自分がやりたかったことのために作ってみたコードなのですが、
それについてはまた書きます（例によってErrBot関係です）


[^1]: http.serverで動かした際も基本的にはKeyboardInterupt待ちです
Ubuntu 16.04 LTS 作業用ユーザ追加

Ubuntu 16.04 LTSの初期設定にて、作業用ユーザ追加時に行った作業です。

# 目的
作業用ユーザを作成して、ホームディレクトリとログインシェルの設定を行います。

# ホームディレクトリ作成設定
Ubuntuはデフォルトの状態では、ユーザを作成痔にホームディレクトリが作成されません。
ユーザ作成時にホームディレクトリが作成されるよう設定します。
`/etc/login.defs` をviなどのエディタで開き、`CREATE_HOME yes`を追加します。

# ユーザ追加
root権限のユーザでログインし、useraddコマンドでユーザを作成します。
`useradd hoge` 

ホームディレクトリ`/home/hoge`が作成されていると思います。 
ホームディレクトリのパスを変更したい場合には、`/etc/default/useradd` ファイルのHOMEを編集してください。

# パスワード設定
作成したユーザーにパスワードを設定します。
`passwd hoge`
パスワードの入力を2回求められます。
※パスワードは画面出力されません。

# ログインシェルの設定
パスワードの設定までで、作業用ユーザの作成は完了していますが、ログインシェルの設定が抜けているため、
`.bashrc`などの設定が読み込まれていない場合があります。
その場合は、ユーザに対してログインシェルの設定を行います。

まず、ユーザ情報からログインシェルを確認します。
`cat /etc/passwd | grep hoge`
結果として、以下のような出力があるかと思います。ホームディレクトリパスの次にログインシェルの設定が表示されます。
`hoge:x:1000:1000::/home/hoge:`
上記の場合だと、ログインシェルが設定されていない状態です。

ログインシェルが設定されていないので、ログインシェルを設定します。
`usermod -s /bin/bash hoge`
上記コマンドによって、hogeユーザーのログインシェルにbashが設定されます。

誤記についてのご指摘や、よりよい方法のご提案などは歓迎します！
以上です。お疲れ様でしたー。

# おまけ
ファイル編集など回りくどいことをしましたが、`useradd -m -s /bin/bash hoge` でも同様の結果が得られます。
状態の変更であったり、デフォルトの設定を覚えておいた方があとで応用が利くので、どちらも覚えておくとよいと思います。
※自分の備忘目的ですが・・・！
pythonでディレクトリを丸ごとアーカイブ、圧縮する

# はじめに
バックアップを取ろうと思い、Googleで
　　[ python + ディレクトリ + 圧縮 ]
を検索。
検索上位にズバリがヒットしなかったのでメモ。

# ディレクトリを圧縮

```tar_dir.py
import tarfile

# ディレクトリ名
dir_name = 'data'
# 圧縮ファイル名
tar_name = dir_name + '.tar.gz'

# 圧縮処理
archive = tarfile.open(tar_name, mode='w:gz')
archive.add(dir_name)
archive.close()
```
ディレクトリを指定すれば、ディレクトリを圧縮可能です。

# ディレクトリ構成
このようなディレクトリが圧縮できます。
　　data/
　　　├ mydir/
　　　│　├ nestdir/
　　　│　│　├ aaa.txt
　　　│　│　├ bbb.txt
　　　│　│　└ foo.csv
　　　│　├ bar.csv
　　　│　├ ccc.txt
　　　│　└ ddd.txt
　　　├ eee.txt
　　　├ fff.txt
　　　└ hoge.csv

# モード一覧
tarfileには、下記のモードがあります。（Python 3.5で調査）

文法１： `filemode`
文法２： `filemode[:compression]` （ランダムシーク用）
文法３： `filemode[|compression]` （ストリーム用）
デフォルト： `r`

|**mode**|**action**|
|:-------|:---------|
|'r' または 'r:*'|圧縮方法に関して透過的に、読み込み用にオープン|
|'r:'|非圧縮で読み込み用にオープン|
|'r:gz'|gzip 圧縮で読み込み用にオープン|
|'r:bz2'|bzip2 圧縮で読み込み用にオープン|
|'r:xz'|lzma 圧縮で読み込み用にオープン|
|'x' または 'x:'|圧縮せずに tarfile を排他的に作成. ファイルが存在していたらFileExistsError|
|'x:gz'|gzip 圧縮で tarfile を作成. ファイルが存在していたらFileExistsError|
|'x:bz2'|bzip2 圧縮で tarfile を作成. ファイルが存在していたらFileExistsError|
|'x:xz'|lzma 圧縮で tarfile を作成. ファイルが存在していたらFileExistsError|
|'a' または 'a:'|非圧縮で追記用にオープン. ファイルが存在しなければ新規作成|
|'w' または 'w:'|非圧縮で書き込み用にオープン|
|'w:gz'|gzip 圧縮で書き込み用にオープン|
|'w:bz2'|bzip2 圧縮で書き込み用にオープン|
|'w:xz'|lzma 圧縮で書き込み用にオープン|
|'r｜*'|圧縮方法に関して透過的に stream を読み込み用にオープン|
|'r｜'|非圧縮の stream を読み込み用にオープン|
|'r｜gz'|gzip 圧縮の stream を読み込み用にオープン|
|'r｜bz2'|bzip2 圧縮の stream を読み込み用にオープン|
|'r｜xz'|lzma 圧縮の stream を読み込み用にオープン|
|'w｜'|非圧縮の stream を書き込み用にオープン|
|'w｜gz'| stream を書き込み用にオープン|
|'w｜bz2'| stream を書き込み用にオープン|
|'w｜xz'| stream を書き込み用にオープン|

※ stream用のモードは`｜`（全角）を`|`（半角）に置き換えてください。

# コマンドライン
コマンドラインから、ディレクトリのアーカイブ、圧縮が可能です。

> $ python -m tarfile -c tar_name.tar.gz  dir_name/

tarファイルの拡張子で圧縮方法を切り替えてくれます。

|拡張子|圧縮方法|
|:--|:--|
|.gz|gz|
|.tgz|gz|
|.xz|xz|
|.txz|xz|
|.bz2|bz2|
|.tbz|bz2|
|.tbz2|bz2|
|.tb2|bz2|

tarfileのコマンドラインのオプション一覧

|オプション|フルオプション|引数|備考|
|:--|:--|:--|:--|
|-v|--verbose||デフォルトは False|
|-l|--list|\<tarfile>||
|-e|--extract|\<tarfile> \<output_dir>||
|-c|--create|\<name> \<file>||
|-t|--test|\<tarfile>||


# 参考情報
本家のドキュメント
　　tarfile（[リンク](http://docs.python.jp/3/library/tarfile.html)）
Power BI Desktopインプレッション

無料につられてインストールしたまま放置していたPower BI Desktopを、やっと少し触ってみました。

使い方ですが、マイクロソフト公式webに掲載されているドキュメントは分かりにくいという、90年代のWindows NT+BackOffice以来続いてきた経験則は今も健在です。他の人が書いた記事を読みましょう！qiitaの[PowerBIタグ](http://qiita.com/tags/PowerBI)が効果的です。

#Power BIとは何なのか

RDBか、それと同じような「表・列・行」構造のデータを読み込み、それを折れ線グラフとか棒グラフにプロットするというものです。まあ何というか、現代に蘇ったGNUPLOTといったところでしょうか。

本物のGNUPLOTに比べると、さすがに最近の製品なだけに80年代的なダサさはありません。また、地図上にプロットする機能があります。しかし、3次元グラフはないし、ローソク足はないしで、グラフの種類が少ないのはかなり不満です。

#インストールしたはいいが何をすればいいのか分からず真っ白の画面の前で途方に暮れる日々からの脱却

まず、データを用意します。データの要件はRDB的な「表・列・行」構造になっていること。もちろんRDBそのものでもよく、Accessとかのデータがあれば簡単です。CSVやExcelでも構いませんが、その場合は1行目が列名で、2行目以降がデータという形であることが必要です。適当なデータがない場合は、手入力することもできます。

データが用意できたら、今度は起動したPower BIの操作です。

1. 上の左から2番目
2. 右
3. 右から2番目の上

この順番を覚えてください。以下順を追って説明します。

##1. 上の左から2番目

リボン「ホーム」タブの「外部データ」です。これでデータをインポートします。

##2. 右

黒いタブバー「フィールド」です。ここで重要なのは__チェックボックスをクリックする順番__。最初にクリックしたものが横軸、2番目にクリックしたものが縦軸になります。間違えてクリックしたら、もう一度クリックしてチェックを外せば最初からやり直せます。

##3. 右から2番目の上

黒いタブバー「視覚化」です。これでグラフの種類を選びます。

以上！これでページ上にグラフが現れます。ここまで来れば、一通りPower BIの雰囲気がわかってくると思います。

ここまでの操作は、YouTubeに落ちている[この動画](https://www.youtube.com/watch?v=h6AIAxMEDiw)が分かりやすいと思いました。インド訛りの英語なので言葉の壁はありますが。

#基本的な概念と文化

Power BI内部のデータ構造はRDBみたいな「表・列・行」ですが、普通のRDBとは以下のような違いがあります。

1. SQLではなく、DAXという言語で操作する。
2. テーブルとビューの区別がない。

例えば列1と列2の和を求めるような場合、SQLであれば

```sql
CREATE VIEW myview AS SELECT 列1+列2 FROM mytable;
```

こんな感じになるわけですが、Power BIでは 列1+列2 を表す「計算列」をテーブルに追加します。

。。。正直いって、かなり隔靴掻痒的な操作感という印象です。SQLに慣れていて、バックエンドにRDBを使っているなら、そっちで``CREATE VIEW``してしまい、Power BIはグラフのプロットに徹してDAXはあまり使わない棲み分けでもいいんじゃないかという気がします。まあ、そこはお好みで。

#Power BIはお勧めか？

困ったことに、Power BIで作ったグラフをPowerPointに貼り込めないんです。しかし、開発は進行中で、[powerbi.comではプレビュー版がリリースされた](https://ideas.powerbi.com/forums/265200-power-bi-ideas/suggestions/6708045-power-point-integration)そうですので、Desktop版にもそのうち展開されて来るでしょう。

こんな調子ですので、ビジネスでPower BIを本格的に使うのはもうちょっと先の話と考えて、今のところは慣熟訓練に留めるのがいいんじゃないかという気がします。

#R言語との連携

Power BI Desktopには、R言語そのものは内蔵されていません。しかし、別途R言語をインストールすれば、Power BIからR言語を呼び出すという使い方ができます。

ちなみに、Cygwin版R言語はPower BI側から認識されませんでした。処理系を選ぶようです。[CRAN版R for Windows](https://cran.r-project.org/bin/windows/)は使えます。

#リファレンス

##マイクロソフト公式

Power BI Desktop 概要ガイド
https://powerbi.microsoft.com/ja-jp/documentation/powerbi-desktop-getting-started/

Microsoft Power BI 自習書 No.1
http://download.microsoft.com/download/0/5/0/0500A648-3580-4E48-8CD4-62041F6A9A9E/PowerBI_SelfLearning01.pdf

Microsoft Power BI 公式YouTubeチャンネル
https://www.youtube.com/user/mspowerbi
CentOS7+nginx+PHP-FPM+PHP7でSymfony3の実行環境構築


## 注意
とりあえずWelcomeページが出るところまでの作業メモです。

## 環境(ホスト)
Mac OSX Yosemite 10.10.5

## ざっくり手順
- ローカル環境でSymfony3をインストールして動かす
- Vagrant環境で動くように設定する

## 1. Symfony3のローカル環境構築
[本家](http://symfony.com/doc/current/setup.html)の手順にのっとって実行。Welcomが表示されるところまで確認。
ここは全くはまらなかった。Symfonyのインストーラー様様:pray:
(2016/10/26追記)※demoアプリケーションを動かす場合、プロジェクトの新規作成のところで 

`$ symfony demo`

とする。
参考：[日本語ページ](http://symdoc.kwalk.jp/doc/book/installation)


## 2. VagrantでCentOS7+nginx+PHP-FPM+PHP7環境構築
「[VagrantでCentOS7にNGINX+PHP-FPM+PHP7の環境構築](http://qiita.com/yanagikouta/items/6c2b0cbd02876e61c71c)」を参考にさせていただきました。

### 読み替えたところ
- VagrantFile
 - 先にローカル環境で動かしてしまっていたので、project rootにsyncするディレクトリをSymfonyのディレクトリに変更 
 - cache/logの書き込みができなかったので、mount optionを変更
  
  参考：「[【vagrant】共有フォルダのパーミッションで悩んだ話【chmodできない】](http://ism1000ch.hatenablog.com/entry/2014/04/05/232935)」

 ```
 node.vm.synced_folder "./", "/var/www/", create: false, mount_options: ['dmode=777','fmode=777']

 ```
 
- nginxのconf
 - [本家](http://symfony.com/doc/current/setup/web_server_configuration.html)のnginxの設定をまるっとコピー。(今回は`/etc/nginx/conf.d/app.conf`を作った。)
`fastcgi_pass unix:/var/run/php5-fpm.sock;`
 は
`fastcgi_pass unix:/var/run/php-fpm.sock;`
に読み替え。

## 3. その他設定したこと
「[Vagrant上のCentOS7にSymfony2.7をインストールし，ついでにアプリをデプロイする](http://qiita.com/lethe2211/items/bc03e8b987d7de27434c)」を参考にゲストOSからconfig.php/app_dev.phpにアクセスできるように設定。

## 感想
環境構築苦手。。。めっちゃ助かりました。
「[VagrantでCentOS7にNGINX+PHP-FPM+PHP7の環境構築](http://qiita.com/yanagikouta/items/6c2b0cbd02876e61c71c)」

`chmod`してるのにパーミッションが変わらなくてだいぶ焦りました。
  参考：「[【vagrant】共有フォルダのパーミッションで悩んだ話【chmodできない】](http://ism1000ch.hatenablog.com/entry/2014/04/05/232935)」
  
今後はこの環境をベースに[Symfony Best Practice](http://symfony.com/doc/current/best_practices/index.html)のお勉強予定。
Elasticsearchのfuzzy queryを使って、あいまい検索を試してみる


elasticsearchでは、[fuzzy query](https://www.elastic.co/guide/en/elasticsearch/guide/current/fuzzy-query.html)の機能を用いることで、いわゆる曖昧検索を実現することができます。これにより、検索クエリ文字列のタイプミス(挿入、欠落、置換等)を吸収することが可能です。

## 簡単なサンプル

例えば、"title" というフィールドに、以下のような値が登録されているとします。tokenizerには一般的なkuromoji_tokenizerを使用しているとします。

```json
"title" : "ベンチャー企業就職のススメ"
```

これに以下のようなクエリを投げると、当然ですがヒットします。

```json
"query": {
  "match": {
    "title": {
      "query": "ベンチャー"
    }
  }
}
```

fuzzy queryを使うには、"fuzziness" を設定するだけです。

```json
"query": {
  "match": {
    "title": {
      "query": "ベそチャー",
      "fuzziness" : "AUTO"
    }
  }
}
```

これなら、クエリが**べチャー**でも**ベンちャー**でもヒットさせることができます。

## fuzzinessの設定

上のsampleではfuzzinessが"AUTO"に設定されていますが、これはelasticsearch側で、置換・挿入・欠落を許容する文字数を自動で判断してくれる設定です。0 〜 2 の値を明示的に設定することで、許容可能な範囲はある程度調節可能です。

```json
"fuzziness" : 0 # 1~2文字向け
"fuzziness" : 1 # 3~5文字向け
"fuzziness" : 2 # 6文字以上向け
```

この値次第では、例えば **モブチャー** でも、**チャー** でも "ベンチャー"にヒットするというような極端な設定にすることも可能です。

## 注意点

注意すべき点としては、まずスコアリングに関してです。例えば、"ベンチャー"という文字列に対して、完全一致の"ベンチャー"でヒットさせても、一文字違いの"ベそチャー"でヒットさせても、**両者にScoreの違いは生まれないと**いうことです。また、なんらかの想定しない挙動になることが十分考えられるので、**サジェスト等他の手段**を用いることを公式でも薦めています。

一見便利そうな機能ですが、運用する場合には、十分な注意が必要そうです。

## おまけ(Railsでのサンプル)
以下は、自分がRailsでサンプル作った時の検索メソッド(の一部)です。

```rb
Article.__elasticsearch__.search(
  query: {
    bool: {
      should: [
        {
          match: {
            title: { query: query, operator: 'or', analyzer: 'search_analyzer', fuzziness: 'AUTO'}
          }
        }
      ]
    }
  }
).records
```
Browserify/WebPack時と、node.jsの実行時で読み込むファイルを変える

Browserifyを使うと、node.jsと同じような書き方ができて便利です。WebPackも人気ですよね。

ですが、node.jsとブラウザでは読み込ませるファイルを分けたいことがよくあります。各環境のロケールを取得するに、ブラウザだと ``navigator.language`` 変数をのぞくだけでOKです。デスクトップ環境とかサーバでは [os-locale](https://www.npmjs.com/package/os-locale)パッケージを使いたいですよね。でもos-localeパッケージをブラウザにバンドルしたくはないです。

それぞれ、次のようなファイルで同じAPIで関数を用意します。

```js:for_node.js
const osLocale = require('os-locale');

module.exports = () => {
    return new Promise((resolve, reject) => {
        osLocale((err, locale) => {
            if (err) return reject(err);
            resolve(locale);
        });
    }); 
};
```

```js:for_browser.js
module.exports = () => {
    return new Promise(resolve => {
        resolve(navigator.language);
    });
};
```

これらのファイルを読み分けます。

もちろん設定ファイルを書いたり、コマンドライン引数を駆使すればBrowserifyでもWebPackでも、バンドルからファイルを除外したりできます。でもライブラリとして配布したいパッケージの場合、使われる側でいろいろ設定してもらわないと動かないのは不便です。ライブラリ内だけでこういう設定を完結させたいですよね。

node.jsには ``module.require()`` という関数があり、 ``require()`` の代わりに使うと、node.js上ではファイルのロードができるけど、Browserify/WebPackからは無視される、というのが実現できます。

```js:main.js
var locale;
if (module.require) {
    locale = module.require('./for_node');
} else {
    locale = require('./for_browser');
}

locale().then(lang => {
    console.log(lang);
});
```

```shell-session
$ node main.js
en_US
```

そのままnode.jsで実行してみます。

```shell-session
$ browserify main.js -o browserify.js
$ node browserify.js
(node:33019) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): ReferenceError: navigator is not defined
```

BrowserifyとWebPackでconcatしてから実行するとエラーになりました。無事、ブラウザ用のパッケージができました。めでたしめでたし。

```shell-session
$ webpack main.js webpack.js
Hash: a8f46f9fd8813681c2a2
Version: webpack 1.13.2
Time: 73ms
  Asset    Size  Chunks             Chunk Names
webpack.js  2.2 kB       0  [emitted]  main
   [0] ./main.js 176 bytes {0} [built]
   [2] ./for_browser.js 109 bytes {0} [built]
    + 1 hidden modules
$ webpack.js
(node:33135) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): ReferenceError: navigator is not defined
```
PHPのディレクトリ権限変更系を3ケタの数字で設定すると陥る罠と理由

## 事象

PHP経由で複数階層にわたるディレクトリを作りたくて以下のようなコマンドを実行する

```php:php
mkdir('./hoge/huga', 777, true);
```

しかしこれはエラーになり
以下のように1階層目のディレクトリだけができて終わってしまう。

```bash:lsの結果
drwxrwxrwx 3 user group 4096 Oct 10 09:19 .
drwxr-xr-x 7 user group 4096 Oct 10 04:00 ..
dr----x--t 2 user group 4096 Oct 15 08:00 hoge
```

## 解決法

（解決法って話でもないんですが）
ディレクトリ権限を指定する場合は4ケタの数字を指定する。

```php
mkdir('./hoge/huga', 0777, true);
```

## 解説

`777` ではなく `0777` ではないと
権限が `411` になってしまい
しかもユーザー権限が `x` ではなく `t` というものができるのか
順を追って説明します。

### ディレクトリ権限の t とは

まず `t` とは何を表現するのか
これはスティッキービットと呼ばれるものだ。

>スティッキービット（Sticky Bit）とは、ディレクトリに設定される特殊なアクセス権の事です。
>スティッキービット（Sticky Bit）が設定されたディレクトリでは、すべてのユーザーがファイル・ディレクトリを書き込めますが、所有者だけ（rootは除く）しか削除できなくなります。
[スティッキービット（Sticky Bit） \- 特殊なアクセス権](http://kazmax.zpp.jp/linux_beginner/stickybit.html)

上記のような特殊なアクセス権のことを指す。
そしてこのスティッキービットを設定する場合は
以下のように `chmod` を実行する

```bash:chmodする場合のコマンド
$ chmod 1777 dir
```

従来の権限設定に加えて、4ケタ目に1を指定することで
スティッキービットが設定される

### PHPの権限変更の設定

PHPの `chmod` や `mkdir` の権限設定の引数はint型だが
`0777` とか `0755` など、必ず0を指定するように書かれている。

理由としては `chmod` のリファレンスページに書かれている

> 自動的には 8 進数と見なされないので注意してください。 意図した操作を行うには、mode の前にゼロ(0)を付ける必要があります
[PHP: chmod \- Manual](http://php.net/manual/ja/function.chmod.php)

そのため、従来のシェルスクリプトの `$ chmod 777` を実現したいような場合は `0777` を指定しないと実現しない。

そのため `777` を指定すると、10進数を指定されたことが想定される、そのため8進数に置き換えた `1411` を指定したことになる。

結果、 `1411` の権限を指定したことになるので
スティッキービットが適用された `411` が適応されて
ディレクトリが作られることになる。

### 余談：mkdirの権限

PHP の `mkdir` は `umask` の制限を受ける。

>モードを八進数で指定したくなることもあるかもしれません。 その場合は先頭にゼロをつける必要があります。 また、モードは、現在設定されている umask の影響も受けます。 umask を変更するには umask() を使用します。
[PHP: mkdir \- Manual](http://php.net/manual/ja/function.mkdir.php)

umaskとmkdirの関係に関して以下のページがまとまっているので参照のこと。
[【PHP】mkdirのパーミッション（属性）の指定が機能しない原因 – ysklog](http://ysklog.net/php/2877.html)

大概は umask は `0022` が指定されているため
今回は影響なかったが、 `1777` 等を指定していたら
`1755` とかになっていたハズ。

## 参考

### 参考URL

* [今さら聞きづらい「ファイルパーミッション」について \(フェンリル \| デベロッパーズブログ\)](http://blog.fenrir-inc.com/jp/2012/02/file_permission.html)
* [chmod ：SUID、GUID、スティッキービットまとめ \- Qiita](http://qiita.com/aosho235/items/16434a490f9a05ddb0dc)
* [データ型](http://wisdom.sakura.ne.jp/programming/php/php5.html)
* [ファイルの属性情報を探る 権限編 \- ザリガニが見ていた\.\.\.。](http://d.hatena.ne.jp/zariganitosh/20130411/attribute_permission)


### 検証環境

Ubuntu
PHP 7.0.8