OmniAICreator/Qiita-1.07M huggingface dataset:
Slackの豆腐をころすマンをHubotで実装する(暫定版)


最近Macのクライアントを使ってSlackを打つと結構な確率でバックスペースが入り豆腐になるので、ちまたで流行りの豆腐殺すマンをHubotで実装。

![tofu_korosu.png](https://qiita-image-store.s3.amazonaws.com/0/6892/54da2f72-03d5-f5da-113d-b33f4e80e972.png "tofu_korosu.png")

nodeのBufferの使い方がいまいち分からなかったのでRubyで書いてる部分が暫定だよ。
一応Botに引用っぽく発言させて会話を阻害しないようにしてます。

```js:no_more_tofu.coffee  
# Description:
#   Mac版のエージェントで発生する豆腐を人間語に翻訳しなおします
#
# Author:
#   miyay

exec = require('child_process').exec

module.exports = (robot) ->
  robot.hear /.*/, (msg) ->
    exec "ruby -e 'puts [%q(#{msg.message.text}).unpack(%(H*)).first.each_char.each_slice(2).map(&:join).map{|a| a == %(08) ? nil : a}.tap{|t| exit if t.all?}.join].pack(%(H*))'", (error, stdout, stderr) ->
      if stdout
        data =
          content:
            text: stdout
            mrkdwn_in: ["text"]
          channel: msg.envelope.room
          username: "tofu_changer"
          icon_emoji: ":black_medium_square:"
        robot.emit "slack.attachment", data

```
VMで開発中にchromeがJSの更新を反映してくれない時

##環境
- ホストOS: Windows7
- VM: Vagrant,Chef,VirtualBox
- ゲストOS: CentOS 7 

##経緯
ローカル上のVM(VirtualBox)にApacheサーバーをたててDjangoアプリを開発。
アプリのJSを編集してchromeで確認するも、キャッシュが効いて反映されず。
ハードリロードでキャッシュパージ等をするも改善せず。

##対応
VMのApache設定(/etc/httpd/conf/httpd.conf)の該当部分を、以下のように編集する。

```text:/etc/httpd/conf/httpd.conf
<Directory / "共有フォルダのパス">
　　# 追記
    EnableSendfile Off
</Directory>
```
自分の場合、chefを使ってVMを整備してるので、site-cookbooks/apache/templates/default/httpd.conf.erbも上記と同じように編集します。

##参考
[JavaScriptファイルを変更し，ブラウザ(chrome)をリロードしても変更内容が反映されません．](https://teratail.com/questions/1608)
[vagrantのsynced_folderをapacheで利用しているときのキャッシュ回避](http://jun-ya.hatenablog.com/entry/2013/08/09/170335)
[Vagrantドキュメント](https://www.vagrantup.com/docs/synced-folders/virtualbox.html)
[Apacheドキュメント](http://httpd.apache.org/docs/2.4/mod/core.html#enablesendfile)
滝沢カレンの理解不能な文章を言語解析してみた。

滝沢カレンのインスタグラムの文章に中毒者が続出してるらしい。
[滝沢カレンの理解不能なインスタｗｗｗｗｗｗｗｗｗｗｗｗ](http://blog.livedoor.jp/goldennews/archives/52000256.html)




[![ss.jpg](https://qiita-image-store.s3.amazonaws.com/0/83738/7e3543f8-c1d2-09d0-a6b7-d6fe88df162e.jpeg)](https://www.instagram.com/takizawakarenofficial/)
引用元: https://www.instagram.com/takizawakarenofficial/


#どのような文章構造になっているのだろう

実際に滝沢カレンの文章を読んでみると、日本語としてはなんとなく読めるのだが、文章の意味がなかなか頭に入ってこない。はじめは、何となく、ディープラーニング（RNN系かなにか）でコーパスを学習して、文生成した結果なのかとも思った。


このように感じる要因は色々あると思うのだが、言語処理的に、どのくらい理解不能な文章なのかを調べるために、滝沢カレンの文章を構文解析して、結果を可視化した。

##手法
- [CaboCha](https://taku910.github.io/cabocha/)を使って構文解析を試みた。
- 滝沢カレンの文章には句点「。」がほとんど使用されず、句点のかわりに絵文字が使われている。そのため、絵文字の連続を文の切れ目として文章を文単位に分割した。
- 構文解析結果のグラフ構造を[pydotplus](https://pypi.python.org/pypi/pydotplus)を用いて可視化した。


##事例1

###入力文

***誕生日翌日にして、少し24歳の一年間を思い出しつつも、25歳へのバトンタッチにやや戸惑いを隠しながら、もはや目もはっきりしないままノソノソと行き着いた先に、私の開きもしない目に入って来たのがこのチラシでした***

###解析結果


![graph0.jpg](https://qiita-image-store.s3.amazonaws.com/0/83738/564b41f3-3dc5-f986-31d6-4e9285bec397.jpeg)



この例をみてみると、複雑な構文構造になっているものの、係り受け自体は、ほぼ正しく解析できていて、日本語としては正しい構文構造を持っていることがわかる。ただし、1文が長く、係り受けが並列関係になっているケースが多いため、人にとっては捉えにくい文章なのだと思われる。

グラフ上の各ノードを出現順序の順番に追っていって、文章を読んでみると、グラフ中での移動距離が大きい、と感じられると思う。つまり、文の意味をシーケンシャルに頭の中で追う際に、構文グラフ上の移動距離が大きく、脳内のワーキングメモリをたくさん消費することになり、理解しにくくなっている（のかもしれない・・・よくわからない）。


##事例2

###入力文


***ふと振り向くと、たくさんの味方がいてたくさんの優しい人間がいることを、わざわざ自分の誕生日が来ないと気付けない自分を奮い立たせながらも、毎日こんな、湖のようななんの引っ掛かりもない、落ちつき倒し、音一つも感じさせない人間でいれる方に憧れを持てたとある25歳の眩しき朝のことでした***






###解析結果
![graph0.jpg](https://qiita-image-store.s3.amazonaws.com/0/83738/81aef515-b80f-9cd8-96e6-475d8de03ddc.jpeg)

なかなかファンキーな複雑さである。このような構文木を人が脳内で展開できるとは思えず、シーケンシャルに読んで理解できるはずがない。文が長く構造が複雑なため、構文解析上の解析誤り（？）も発生しているように見える。特許の文章に匹敵する理解しにくさなのではないだろうか。


## ニュース記事の解析例

対比として、普通の文章での構文解析の結果を載せてみる。

###入力文


***全国４７都道府県と２０の政令指定都市のうち、災害時の行方不明者の氏名公表について、基準を設けていない自治体が７割に上ることがわかった。改正個人情報保護法の３０日施行に合わせ、朝日新聞が各自治体にアンケートした。氏名を「公表しない」という回答も５自治体あった***
引用元: https://www.asahi.com/

###解析結果


![graph0.jpg](https://qiita-image-store.s3.amazonaws.com/0/83738/5096f567-3f89-6b19-8eac-27f8acd94ff5.jpeg)


上記のように、ニュース記事のように、読みやすく編集された、普通の（？）文章の場合は、文はそこそこ長くとも構文構造の並列度が何となく低いため、読むのに苦労しない。


# まとめ

- 滝沢カレンのインスタの文章を、言語処理で解析（構文解析）してみたら、たしかに人にとって読みにくい文構造を持っていることが何となくわかった。


- ただし、文章の読みやすさ（読みにくさ）には、構文構造以外の要素がたくさんあるのだと思う。構文構造的には受理される文である（非文でない）が、意味レベルでの破綻、矛盾が含まれている場合がある。構文解析ではそのレベルの破綻検出はできない。

- 意味レベルで、どうして面白いのか？や、中毒性があるのか？　も解析してみたい。どうやるのだろうか。

今回使ったコードです。https://gist.github.com/naoyu822/6703e3b22eb98230ab76596918c6779e
tips Laravel5.4のmigrationでnullableに変更できない時

```
class ChangeNullableFooColnumBarTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('bar', function (Blueprint $table) {
            $table->text('hoo')->nullable()->change();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('bar', function (Blueprint $table) {
            $table->text('hoo')->nullable(false)->change();
        });
    }
}
```

nullable(false)->change()
というミニTipsでした。



謝謝
node v8.0.0でWebAssembly試してみる

## 概要

node v8.0.0 がリリースされました。このバージョンからWebAssemblyがデフォルトで使用できるようになったので、試しにnode module([re2](https://github.com/google/re2)のvalidateするだけ)を作ってみました([re2\-validator](https://github.com/ukyo/re2-validator))。

## 準備

submoduleにre2を引っ張ってきてre2をconfigure makeします。

```
$ cd re2
$ emconfigure ./configure
$ make
```

## コンパイル

emccで普通にコンパイルします。

```
$ emcc -Ire2 --bind -o dist/re2.js  re2_binding.cc re2/obj/libre2.a -s WASM=1 --llvm-lto 1 --llvm-opts 3 -s NO_FILESYSTEM=1  -s EXPORTED_RUNTIME_METHODS="[]" --closure 1 -Oz --pre-js pre.js --post-js post.js
```

ここでre2本体以外にre2_binding.cc、pre.js、post.jsという自作のファイルを使用しています。それぞれ説明すると、

re2_binding.ccで関数を`Module._validate`から使えるようにします。

```cpp:re2_binding.cc
#include "re2/re2/re2.h"
#include <emscripten/bind.h>

using namespace emscripten;
using std::string;

bool validate(const string& str) {
  RE2 re(str, RE2::Quiet);
  return re.ok();
}

EMSCRIPTEN_BINDINGS(_re2_) {
  function("_validate", &validate);
}
```

pre.jsで`Module.wasmBinaryFile`を設定して、正しいパスを指すようにします。これをやらないとパスがずれます。

```js:pre.js
var Module = {};
if (typeof __dirname === "string") Module["wasmBinaryFile"] = __dirname + "/re2.wasm";
```

post.jsで実際にJavaScriptから使いやすいように加工します(emccからclosure compilerのオプションを設定する方法がわからなかったので、es5的な感じで)。`validate`関数で文字列をutf8の`Uint8Array`に変換して`Module._validate`に渡します。`ready`は`Module._validate`の準備が完了するまで待つ`Promise`です。emscripten内部では`WebAssembly.instantiate`を使用して非同期にwasmモジュールがコンパイル、インスタンス化されるので必要です(対話環境だったら、あんまり気にしないですけどね)。

```js:post.js
var re2_buffer = new Uint8Array(1024);

module.exports['validate'] = function(s) {
  var size = stringToUTF8Array(s, re2_buffer, 0, 1024);
  return Module['_validate'](re2_buffer.subarray(0, size));
};

module.exports['ready'] = new Promise(function(resolve) {
  var intervalId = setInterval(function() {
    if (!Module['_validate']) return;
    clearInterval(intervalId);
    resolve();
  }, 1);
});
```

動作確認してみます。

```
$ node
> var re2Validator = require('./dist/re2');
> re2Validator.validate('(?!hello)'); // false
```

## publishしたライブラリを使用する

すでに、node moduleとしてpublishしたものとします。`npm i`して、まぁ、動作確認でやったことなんですが、動かしてみます。

```
$ npm i --no-save @ukyo/re2-validator
$ node
> var re2Validator = require('@ukyo/re2-validator');
> re2Validator.validate('(?!hello)'); // false
```

これでWebAssemblyを使用したnode moduleを公開できましたね!


## まとめ

node v8.0.0で動作する、WebAssemblyを使用したnode moduleを作ってみました。node環境では特に問題なく動くことが確認できました。ブラウザ環境でwasmのパスどうするんだっていう課題はありますね(wasmを配列とかbase64にして埋め込むしかないのかな?)。
EditorConfigのススメ

## EditorConfigってなんぞ
複数人で作業していると、インデントがタブだったりスペースだったり、インデント数が2つの人もいれば4つの人がいて逐一プロジェクトごとにエディタの設定を変えるのは面倒ですよね。
で、EditorConfigに対応したエディタを開くだけでコーディングスタイルと整えてくれます。

以下、公式の訳です。
>EditorConfigは、開発者がさまざまなエディタとIDE間で一貫したコーディングスタイルを定義し、維持するのに役立ちます。 EditorConfigプロジェクトは、コーディングスタイルを定義するためのファイルフォーマットと、エディタがファイルフォーマットを読み込んで定義されたスタイルに従うことを可能にするテキストエディタプラグインのコレクションで構成されています。 EditorConfigファイルは読みやすく、バージョン管理システムでうまく動作します。

なのでgitのリポジトリに置いておけば、みんなで設定を共有できるので楽チンという。
しかもGitHubがeditorconfigをネイテイブサポートしているため、ファイル表示時にもインデントが綺麗になってる幸せが味わえます、やったね。

## 設定方法
設定は簡単。各editorからeditorconfigのパッケージをイントールして、
プロジェクトのルートに.editorconfigファイルを置くだけ。
.editorconfigの内容はこの後に書きます。

## サンプルコード
以下、公式サンプルの訳です。
下記をみるとなんとなく書き方がわかると思います。

```:.editorconfig
# ルートの設定（.editorconfigはプロジェクトのルートに置くと良いです）
root = true

# 改行コードと改行後ろの空白削除の有無を指定したいとき
[*]
end_of_line = lf
insert_final_newline = true

# 特定の複数拡張子を指定するとき
# 文字コードの設定するとき
[*.{js,py}]
charset = utf-8

# スペース4つのインデントにしたいとき
[*.py]
indent_style = space
indent_size = 4

# タブインデントにしたいとき
[Makefile]
indent_style = tab

# libディレクトリ配下の~.jsにのみ適用させたいとき
[lib/**.js]
indent_style = space
indent_size = 2

# package.jsonまたは.travis.ymlに合致しているとき
[{package.json,.travis.yml}]
indent_style = space
indent_size = 2
````

## 指定内容

- <b>indent_style（インデント）</b>
tab または space

- <b>indent_size（インデントサイズ）</b>
数値指定

- <b>tab_width(タブ幅)</b>
数値指定
インデントをタブで選択したときのみ、指定可能

- <b>charset（文字コード）</b>
latin1, utf-8, utf-8-bom, utf-16be, utf-16le
のいずれか

- <b>end_of_line(改行コード)</b>
lf, cr, crlf
のいずれか

- <b>trim_trailing_whitespace(行末スペースを削除)</b>
true または false

- <b>insert_final_newline（ファイル末尾の改行）</b>
ture または false
trueに設定すると、保存時に改行でファイルが終了し、保存されない場合はfalseに設定されます。

- <b>root(プロジェクトルート)</b>
true または false
これをfalseまたは指定していないと、.eidtorconfigファイル以上の階層でも適用されちゃいます。trueがマスト。

## まとめ
これでプロジェクトが変わるごとにエディターの設定を変えなくて済みます！
いろんな人が触ってもインデントが崩れることがないので、コードも見やすいですね！

## 参考
- http://editorconfig.org/
- http://qiita.com/elim/items/482928844664493a507b
- http://qiita.com/spiegel-im-spiegel/items/a1b4d1ad2a6693ae33e4
MacでMysqlとTomcat


Mysql Install

## Homebrewのインストール

以下インストール
[Homebrew](https://brew.sh/index_ja.html)

## MySQLのインストール    

```shell-session
brew install mysql
```

Mysql起動

```shell-session
mysql.server start
```

## データベースインポート

以下のSQLを実行する
sql/sample.sql

```shell-session
mysql -u root <sample.sql
```

## Tomcat6インストール

Tomcat6はここからダウンロード
https://tomcat.apache.org/download-60.cgi

これ
[tar.gz (pgp, md5)](http://ftp.meisei-u.ac.jp/mirror/apache/dist/tomcat/tomcat-6/v6.0.53/bin/apache-tomcat-6.0.53.tar.gz)

[このサイト参照](http://gungnir-odin.hatenablog.com/entry/20110210/1297338414)


## eclipse設定

Preferencesを右上の検索窓で探して起動

![____________________________2017-05-24_17.40.58_1024.png](https://qiita-image-store.s3.amazonaws.com/0/135925/860eaffc-29fe-e2af-6754-341c9620372f.png)

Server->Runtime Environments

![____________________________2017-05-24_17.41.32_1024.png](https://qiita-image-store.s3.amazonaws.com/0/135925/64b360ed-0267-bb5c-8820-136e024bcaae.png)

Apache Tomcat v6.0を選んでNext

![____________________________2017-05-24_17.41.39_1024.png](https://qiita-image-store.s3.amazonaws.com/0/135925/a4001b6b-2c25-feb6-8639-ab8df9d6922d.png)

Tomcat installation directoryにTomcatをインストール下ディレクトリを設定する

![____________________________2017-05-24_17.41.51_1024.png](https://qiita-image-store.s3.amazonaws.com/0/135925/2ca5a7cc-3e9b-2c95-889a-06ab5ff24bf9.png)

こうなっていたらOK

![____________________________2017-05-24_17.42.02_1024.png](https://qiita-image-store.s3.amazonaws.com/0/135925/cc5c3a06-14fb-42df-9a7c-7404da42a92d.png)
ことりん学習帳（Kotlin）

[from umentu import stupid](https://www.blog.umentu.work/) でKotlinを学習しているので、学んだ内容をまとめています。

# 基本

## オブジェクト
[MacでHello Kotlin](https://www.blog.umentu.work/kotlin_hello_world/)
[配列](https://www.blog.umentu.work/kotlin_array/)
[リスト](https://www.blog.umentu.work/kotlin_list/)
[セット](https://www.blog.umentu.work/kotlin_set/)
[マップ](https://www.blog.umentu.work/kotlin_map/)
[レンジ](https://www.blog.umentu.work/kotlin_range/)

## 条件分岐

[if文](https://www.blog.umentu.work/kotlin_if/)
[when文](https://www.blog.umentu.work/kotlin_when/)

## ループ
[for文](https://www.blog.umentu.work/kotlin_for/)
[while文、do-while文](https://www.blog.umentu.work/kotlin_while/)

## 関数
[関数の定義](https://www.blog.umentu.work/kotlin_func_def/)
[名前付け引数とデフォルト引数](https://www.blog.umentu.work/kotlin_parameter/)
[ローカル関数](https://www.blog.umentu.work/kotlin_local_func/)
[Not 値を返さない関数](https://www.blog.umentu.work/kotlin_unit/)

## 関数オブジェクト
[関数オブジェクト](https://www.blog.umentu.work/kotlin_func_object/)
[高階関数](https://www.blog.umentu.work/higher_order_func/)
[ラムダ関数](https://www.blog.umentu.work/kotlin_lambda/)
[クロージャ](https://www.blog.umentu.work/closure/)
[無名関数](https://www.blog.umentu.work/kotlin_anonymous_func/)

## オブジェクト
[オブジェクトを作る](https://www.blog.umentu.work/kotlin_make_object/)
[インターフェース](https://www.blog.umentu.work/kotlin_interface/)
[プロパティ](https://www.blog.umentu.work/kotlin_property/)

## クラス
[クラスを作る](https://www.blog.umentu.work/kotlin_class/)
[プロパティ（カスタムゲッター・カスタムセッター）]()
[コンストラクタ](https://www.blog.umentu.work/kotlin_constructor/)
[セカンダリ・コンストラクタ](https://www.blog.umentu.work/kotlin_class_property/)
[イニシャライザ](https://www.blog.umentu.work/initializer/)
[クラスの継承](https://www.blog.umentu.work/qiita_inheritance/)
[メソッドの継承]
(https://www.blog.umentu.work/kotlin_method_inheritance/)
[抽象クラス](https://www.blog.umentu.work/kotlin_abstract_class/)
[データクラス](https://www.blog.umentu.work/kotlin_dataclass/)



## Null安全
[Null安全](https://www.blog.umentu.work/kotlin_null_safety/)
[スマートキャスト](https://www.blog.umentu.work/kotlin_smartcast/)
[安全呼び出し](https://www.blog.umentu.work/kotlin_safe_call/)
[!!演算子・requireNotNull関数](https://www.blog.umentu.work/kotlin_requirenotnull/)
[エルビス演算子]()

## インターフェース
[インターフェースとクラスの継承](https://www.blog.umentu.work/kotlin_interface_and_class/)
[インターフェースの継承](https://www.blog.umentu.work/kotlin_interface_inheritation/)

# 応用
[tailrecで末尾再帰](https://www.blog.umentu.work/kotlin_tailrec/)
[イテレータを持ったオブジェクトを作成](https://www.blog.umentu.work/kotlin_for/)
msys2でopenコマンド

# Msys2+Windows
- MACの「open」、Cygwinの[cygstart]をmsys2でも使いたかった。
- ネットを探しても見つからなかったので、以下を.bashrcに追加

```.bashrc
function opencmd()
{
    cmd 2>&1 | start $1
}

alias open='opencmd'
```
[WPF][MVVM] TreeViewItemの右クリックメニューからViewModelのCommandを実行する

WPFのTreeViewの子要素を右クリックするとメニューを出して、そのアイテムを利用したコマンドを実装したかったんですが、やたらと実装が難航したので設定方法をメモ。

# 実装例

```xml:ContextMenu側XAML
<UserControl.Resources>
    <ContextMenu x:Key="SampleContextMenu">
        <MenuItem Header="右クリックメニューアイテム"
                  Command="{Binding
                        Path=PlacementTarget.Tag.Command,
                        RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"
                  CommandParameter="{Binding
                        Path=PlacementTarget.DataContext,
                        RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}}}"/>
    </ContextMenu>
</UserControl.Resources>
```

```xml:TreeView側XAML
<TreeView ItemsSource="{Binding Path=...}">
    <TreeView.ItemContainerStyle>
        <Style TargetType="{x:Type TreeViewItem}">
            <Setter Property="Tag" Value="{Binding Path=DataContext, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TreeView}}}"/>
            <Setter Property="ContextMenu" Value="{Binding Source={StaticResource SampleContextMenu}}"/>
        </Style>
    </TreeView.ItemContainerStyle>
    <TreeView.ItemTemplate>
        <!-- 省略 -->
    </TreeView.ItemTemplate>
</TreeView>
```

# やりたかったこと

1. 右クリックメニューのクリックで、ViewModelに実装したCommandを実行する
2. その際の引数として、右クリックしたTreeViewItemのデータを利用したい
3. イベントハンドラは使わずに実現したい（コードビハインドに書くのは最後の手段）

# 内容解説

まず注意する必要があるのは、WPFのContextMenuはXAMLのVisualTreeの定義とは別管理？（※要調査）になるらしく、単純にViewModelのCommandはそのまま定義しても見えないということです。右クリックメニューを出したアイテムが見たい場合は `PlacementTarget` を利用する必要があるようです。

TreeViewの場合は、Templateの関係でDataContextが書き換わってしまっています。そのため2のTreeViewItemのデータはPlacementTargetのDataContextを利用すれば良いです。

ViewModelに定義しているCommandを使いたい場合はさらに上のDataContextを参照する必要があります。Templateの親を指定できる `TemplatedParent` はContextMenuからでは使えません。なので、TreeViewItemのTagプロパティに親のDataContextを事前にBindしておき、ContextMenuから `PlacementTarget.Tag` で参照できるようにします。

（ちなみにTagプロパティは任意のデータを格納する専用のプロパティのようです。）
[FrameworkElement.Tag プロパティ (System.Windows)](https://msdn.microsoft.com/ja-jp/library/system.windows.frameworkelement.tag(v=vs.110).aspx)

これでTreeViewItemのContextMenuからViewModelのCommandを実行できるようになりました。
Templateを使用しているListViewでも同様のことが起きると思いますが、上記の実装で同様に対処できるかと思います。


# 参考
[WPF ContextMenu woes: How do I set the DataContext of the ContextMenu? - Stack Overflow](https://stackoverflow.com/questions/15033522/wpf-contextmenu-woes-how-do-i-set-the-datacontext-of-the-contextmenu)
[WPF/XAML で右クリックメニューへの DataContext の引き回し - graphics.hatenablog.com](http://graphics.hatenablog.com/entry/2014/03/30/011812)
PostgreSQLでslaveのみバックアップ実行するスクリプト


#はじめに
PostgreSQLのMaster/Slave構成で、普段Slaveでバックアップ取得しているとして、HA構成などでフェイルオーバが発生すると今までSlaveだったノードがMasterになってしまい、よろしくありません。

そこでバックアップ実行前に自分がSlaveかどうか確認する処理を入れます。

このスクリプトをMaster/Slave両方で定期実行させればSlaveのみバックアップを取得できます。

#前提
rootで実行されることを想定

#スクリプト

```Bash:スクリプト
#!/bin/sh

hostname=`/bin/hostname`
date=`/bin/date +"%Y%m%d_%H%M"`
filename="/PATH/TO/BACKUP/${hostname}_${date}.sql.gz"
is_slave=`sudo -i -u postgres psql -t -c "select pg_is_in_recovery()"`

if [ $is_slave = "t" ]; then
    /usr/bin/pg_dumpall | gzip - > ${filename}
else
    exit 1
fi

exit 0
```
[pug] ダブルクオーテーション " が &quot; になるのを防ぐなど、String Interpolation で変数を Unescaped にする方法

pugのテンプレート内に変数を展開する String Interpolation で、エスケープさせる方法とさせない方法についての確認です。

ただ [ドキュメント](https://pugjs.org/language/interpolation.html) をちゃんと読めば済む話ですが、なかなかたどり着くことができなかったので、メモしておきます。

```jade:escapeする場合
- var hogeVar = "hoge";
script.
  const valEscaped = #{hogeVar};   // => &quot;hoge&quot;
```

```jade:escapeしない場合
   const valUnescaped = !{hogeVar}; // => "hoge"
```
５・３１

#人工知能学会全国大会　LSTMを用いた句のベクトル表現学習
この研究ではLSTMを用いて句の特徴を獲得し，句のベクトル表現を学習するモデルを提案するというようなものでした．LSTMは単語列などの系列データを扱えるニューラルネットワークの一種である．
内部にメモリを持ち，入力ベクトルによってメモリを更新し，更新したメモリの値から出力ベクトルを求めることで，入力した系列データの時系列関係を考慮することができる。
手法としては，LSTMを用いて句を表現し，句の尤もらしさ(句が文章中に現れるか否か)を学習することで，主語 S,動詞 V ,目的語Oからなる句のベクトル表現を獲得するモデルを提案する．提案モデルが対象とする句は，主語・動詞・目的語の 3 単語からなる句である．テキストや発話を大規模に集めたコーパス(テキストや発話を大規模に集めてデータベース化した言語資料)を構文解析することで主語・目的語が名詞である動詞を句として抽出する．抽出した句から学習用データを作成し，この学習用データを提案するモデルに入力することで，句のベクトル表現を獲得する．
#HARKを用いた録音

まずは、以下の図のように録音ネットワークを作成する。
![sample2.png](https://qiita-image-store.s3.amazonaws.com/0/165517/3d2fcaaf-7778-8cf1-39fb-cc37cd98f7b1.png)![sample3.png](https://qiita-image-store.s3.amazonaws.com/0/165517/e8a6ccb3-43ef-5198-58b6-5a1efcd3d6d3.png)

次にいくつかのパラメータ値を自分で割り当てる。
サンプリング周波数を16000Hzとし、今回は5秒間録音したいので録音フレーム数を5[sec] = (512+(fram-1)*160)/16000より498と設定する。
チャンネル数を8とし、使用するデバイスの種類をDS、使用するデバイス名をTAMAGO-03と設定。
実際に実行してみると。
![sample4.png](https://qiita-image-store.s3.amazonaws.com/0/165517/eea59acf-90f3-c701-557b-b2c2e018be0d.png)
networksのところにsep_0からsep_7までの音声ファイルが確かに保存されていた。
#HARKを用いた音源定位
こちらでもまず、録音ネットワークを作成
![sample6.png](https://qiita-image-store.s3.amazonaws.com/0/165517/1a3e8350-3302-70fd-3b18-05b22bc7a356.png)
![sample5.png](https://qiita-image-store.s3.amazonaws.com/0/165517/de72388b-7580-5210-626f-7b0b45439e62.png)
パラメータの設定の際にA_MATRIX のパラメータ値として定位用伝達関数ファイルのファイル名を入力する必要がある。なので定位用伝達関数ファイルを作成する必要がある。
定位用伝達関数ファイルを作成するには、まずマイクロフォン位置情報ファイルとインパルス応答リストファイルを作成する必要がある。
とりあえずデフォルト値で作成したものをプロットしたものが以下のようなものになった。
![sample7.png](https://qiita-image-store.s3.amazonaws.com/0/165517/97ab4d07-5eae-4625-ace7-ac7d8b85fb27.png)
![sample8.png](https://qiita-image-store.s3.amazonaws.com/0/165517/34baa4c9-c577-8a84-95d9-a99ac72e8a73.png)
この二つを用いて定位用伝達関数ファイルを作成しようとしたところでエラーが出たので今回はここまでしかできていません。
Dockerを使って簡易的なwebサーバーを作成する

webアプリケーションを作成していると、WEB-APIの実装はまだ完了していないけど、
とりあえず、JSONデータを返すモックサーバーのようなものが欲しいといったことが
あります。こういった時に使用できるようにDockerで簡易的なwebサーバーを構築
してみます。

## ベースイメージの動作確認
webサーバーとして使えるdocker imageは色々あります。今回はh2oのサイトでも
紹介されているlkwg82/h2o-http2-serverを元にサーバーを作成しました。
まずは、lkwg82/h2o-http2-serverのイメージを起動してみます。

```
$ docker run -p "8080:8080" -ti lkwg82/h2o-http2-server
[INFO] raised RLIMIT_NOFILE to 1048576
h2o server (pid:5) is ready to serve requests
```
上記のコマンドを打つと、dockerのイメージが起動してh2oが動作していることが
わかります。

```
$ curl --head http://127.0.0.1:8080
HTTP/1.1 404 File Not Found
Date: Wed, 24 May 2017 12:41:04 GMT
Connection: keep-alive
Content-Length: 9
Server: h2o/2.2.2
content-type: text/plain; charset=utf-8
```
返ってくる結果は404ですが、少なくともサーバーが動いていることは、確認出来ました。
docker psでdockerのプロセスを確認しても、h2oが動いていることが確認できます。

```
$ docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                              NAMES
d08eed931b64        lkwg82/h2o-http2-server   "/bin/sh -c 'h2o -..."   10 minutes ago      Up 10 minutes       0.0.0.0:8080->8080/tcp, 8443/tcp   frosty_keller
```

## イメージの内部の調査
webサーバーを起動出来たので、webサーバーの内部がどうなっているかを確認します。

```
$ docker exec -ti d08eed931b64 ash
/etc/h2o # ls
h2o.conf
/etc/h2o # cat h2o.conf
hosts:
  default:
    listen:
      port: 8080
    paths:
      /:
        file.dir: /var/www/html
        file.dirlisting: ON

access-log: /dev/stdout
error-log: /dev/stderr
```

コンテナの中には/etc/h2o.confがあり、file.dirが/var/www/htmlを示しています。
先ほど404エラーが出ていたので、/var/www/htmlがこのコンテナにはないことをわかります。
このイメージをベースとして/var/www/htmlのディレクトリを作成したイメージを作成すれば、
webサーバーとして動作することが想定されます。
状況の確認が出来たので、起動しているコンテナは停止しておきます。

```
$ docker kill d08eed931b64
d08eed931b64
```

## イメージの修正とコンテナの起動
/var/www/htmlのディレクトリを作成するDockerfileを作成します。

```Dockerfile
From lkwg82/h2o-http2-server:latest

RUN mkdir -p /var/www/html
```
Dockerfileを修正したら、イメージをbuildして、docker runを実行します。

```
$ docker build ./ -t simple_server
$ docker run -p "8080:8080" -v {$pwd}/:/var/www/html -d simple_server
585346cc6eff75082911c33eaf6a5c7823dc9dd27a36f05a19800e5ec787bf76
```

-vオプションを使用することでホストのディレクトリをコンテナにマウントすることができます。
{$pwd}の部分にホストのディレクトリの絶対パスを入れます。例えば/tmpを指定していた
としてファイルを作成して、curlで参照すると、

```
$ echo "hello world" > /tmp/hello_world
$ curl http://127.0.0.1:8080/hello_world
hello world
```

上記のような結果となり、webサーバーとして機能していることが確認出来ました。
TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）

# はじめに
- ここからはネタも含めたお遊び系で技術とは何ら関係ないです。

# 検証
## 検証① 京と阿部サダヲははたして本当に似ているのか

![FireShot Capture 31 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/7938ddb8-f1ea-f1ec-20a2-f50a6fc31e12.png)

やはり噂は本当だった

## 検証② 阿部つながりで阿部寛

![FireShot Capture 32 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/06841f57-068a-0575-6660-345179721f04.png)

眉間の皺あたりではないかと勝手に予測

## 検証③ 女性代表の椎名林檎

![FireShot Capture 33 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/a14f70b5-741c-bbe7-4497-9dac36e7fba4.png)

女型だけはある

## 検証④ 会長（怒られるシリーズ）

![FireShot Capture 34 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/8c452e0b-d0d5-0cf5-8dd1-b5e728169ec7.png)

(((( ；ﾟДﾟ)))ｶﾞｸｶﾞｸﾌﾞﾙﾌﾞﾙ 

## 検証⑤ 社長（怒られるシリーズ）

![FireShot Capture 35 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/83bd72fc-9a3e-1c93-d192-8800f2790b72.png)

(||ﾟДﾟ)ﾋｨｨｨ! 

# まとめ
- 学習結果が良くても学習素材が少なすぎるせいかあまり精度がでなかった。
- OpenCVでうまい顔抽出やそもそも画像がなぜ上手く読み込めないものがあるのか、もう少し画像について勉強が必要。
- とりあえず動かしたのでプログラムの中身やニュートラルネットワークについて勉強しやすくなりました。
- 環境構築が一番やっかい。
- 元画像集めるのが大変。
- 学習モデル部分以外の処理は結構普通に理解できる。
- こういう面白いのを今後もまた作っていきたいです。　http://qiita.com/shu223/items/bd9102a10dd4ec8a86be?utm_source=Qiita%E3%83%8B%E3%83%A5%E3%83%BC%E3%82%B9&utm_campaign=21fc884cc0-Qiita_newsletter_262_30_05_2017&utm_medium=email&utm_term=0_e44feaa081-21fc884cc0-33130669

# 全ページリンク
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編](http://qiita.com/neriai/items/bd7bc36ec42c8ef65b2e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ②環境構築編](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ③画像収集編](http://qiita.com/neriai/items/bac92c54ca77ebb32ecc)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編](http://qiita.com/neriai/items/cedc0de9e3722f53287a)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑤学習データ準備編](http://qiita.com/neriai/items/b525b6c9beb5b5d2f8fb)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑥学習プログラム編](http://qiita.com/neriai/items/6a662a49054bc544806d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑦学習モデル編](http://qiita.com/neriai/items/bd4b880e968fd41119f1)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑧学習実行編](http://qiita.com/neriai/items/791e6f4dd8d08775542b)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編](http://qiita.com/neriai/items/a7b47127462ecf0fcc1d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑩顔分類試験編](http://qiita.com/neriai/items/652ced2227b0283ce35e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑪Web公開準備編](http://qiita.com/neriai/items/bb88858cb5004cbb24d9)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編](http://qiita.com/neriai/items/808ee49e276060457c14)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)
TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編

# はじめに
- いよいよ大詰めです。

# 公開
## 起動
```zsh
python web.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 230-574-426
```
## 確認
```
http://localhost:5000/
```
### 投稿画面
![FireShot Capture 29 - Dir en grey顔チェッカー - http___localhost_5000_.png](https://qiita-image-store.s3.amazonaws.com/0/90598/c31d5ce1-a37b-e3f1-16bf-46839543da4f.png)

### 結果画面
![FireShot Capture 30 - Dir en grey顔チェッカー - http___localhost_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/fdb8d38d-f24f-3716-1def-a10680032cc5.png)

＼(^o^)／

# 全ページリンク
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編](http://qiita.com/neriai/items/bd7bc36ec42c8ef65b2e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ②環境構築編](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ③画像収集編](http://qiita.com/neriai/items/bac92c54ca77ebb32ecc)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編](http://qiita.com/neriai/items/cedc0de9e3722f53287a)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑤学習データ準備編](http://qiita.com/neriai/items/b525b6c9beb5b5d2f8fb)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑥学習プログラム編](http://qiita.com/neriai/items/6a662a49054bc544806d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑦学習モデル編](http://qiita.com/neriai/items/bd4b880e968fd41119f1)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑧学習実行編](http://qiita.com/neriai/items/791e6f4dd8d08775542b)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編](http://qiita.com/neriai/items/a7b47127462ecf0fcc1d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑩顔分類試験編](http://qiita.com/neriai/items/652ced2227b0283ce35e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑪Web公開準備編](http://qiita.com/neriai/items/bb88858cb5004cbb24d9)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編](http://qiita.com/neriai/items/808ee49e276060457c14)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)
マルチスレッドプログラミングのデザインパターンをSwiftで書いてみた。 

「Java言語で学ぶデザインパターン入門 マルチスレッド編」（結城 浩）を参考にSwiftでマルチスレッドプログラミングを書いてみました。

+ Single Threaded Execution (同時にできない)
+ Immutable (不変)
+ Guarded Suspension (用意できるまで待つ)
+ Balking (用意できないならやめる)
+ Producer-Consumer (生産者と消費者をわける)
+ Read-Write Lock (書く人は一人、読むのは誰でも)
+ Thread-Per-Message (処理を他のスレッドに任せる)
+ Worker Thread (スレッドを貯めておいて仕事を振る)
+ Future (任せておいた仕事の結果を同期的に受け取る)
+ Two-Phase Termination (適切な終了処理)
+ Thread-Specific Storage (スレッド毎に保存できる領域を確保しておく)
+ Active Object (自律的なオブジェクト)

コードは以下に置いてあります。
https://github.com/KatagiriSo/MultiThreading
raspberry pi で、MCP23017 の入力ポートを使う Node.js 版

```js:mcp23017_node_input.js
#! /usr/local/bin/node
//
//	mcp23017_node_input.js
//
//					May/31/2017
//
// ------------------------------------------------------------------
function read_proc (wire)
{
	wire.readBytes(0x13, 1, function(err, res)
	{
	console.log (res)

	console.log (res[0].toString(16))
	console.log ("*** end ***")
	})
}

// ------------------------------------------------------------------
console.log ("*** start ***")
var i2c = require('i2c')
const address = 0x20
var wire = new i2c(address, {device: '/dev/i2c-1'})
	// point to your i2c address, debug provides REPL interface 

wire.writeBytes(0x01, [0xff], function(err, res)
	{
	wire.writeBytes(0x0d, [0xff], function(err, res)
		{
		read_proc (wire)
		})
	})

// ------------------------------------------------------------------
```
react-decoration で @ がだめだと言われたときに通す方法は transform-decorators-legacy を使う


# @ が通らなくなった問題発生

React の [react-decoration](https://github.com/mbasso/react-decoration) を使っていたところ、バージョンアップしたら


```
ERROR in ./hoge.js
Module build failed: SyntaxError: Unexpected token (16:2)

  14 |   }
  15 | 
> 16 |   @debounce(375)
     |   ^
```

などと、`@` が変だと言われるようになってしまった。

# you ばべっちゃっいなよってことで次のように babe ったらなおった

[README](https://github.com/mbasso/react-decoration)にしたがって (詳細は [react-decoration/Introduction.md](https://github.com/mbasso/react-decoration/blob/master/docs/Introduction.md) を参照のこと)、

```sh
$ yarn add babel-plugin-transform-decorators-legacy
```

と `babel-plugin-transform-decorators-legacy` という npm を追加し、さらに `.babelrc` に、

```json
{
  "plugins": [
    ...,
    "transform-decorators-legacy",
    ...
  ],
  "...": ...
}
```

と追加したら `@` が再び使えるようになった。よかった。

legacy という名前だということは、今は違う方法が推奨されているのかも知れないが、そこまでは勉強していない。

- react-decoration v1.4.1

# babel 6

babel 6 だと起きるということです。Thanks, @eielh.
TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編

# はじめに
- グラフ化されるとちょっとできる感でていいですね。

# 可視化
## 起動
```zsh
tensorboard --logdir=/workspace/dir/data
```
## 画面確認
```
http://localhost:6006/
```
## 結果
### 学習精度のグラフ
![FireShot Capture 27 - TensorBoard - http___localhost_6006_.png](https://qiita-image-store.s3.amazonaws.com/0/90598/b24d3d94-97f5-bd23-29c6-fe2d655b4a10.png)

### 学習モデル構造の図
![FireShot Capture 28 - TensorBoard - http___localhost_6006_.png](https://qiita-image-store.s3.amazonaws.com/0/90598/7b556fe2-53ed-6666-88ec-5d941fc2e259.png)

# 全ページリンク
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編](http://qiita.com/neriai/items/bd7bc36ec42c8ef65b2e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ②環境構築編](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ③画像収集編](http://qiita.com/neriai/items/bac92c54ca77ebb32ecc)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編](http://qiita.com/neriai/items/cedc0de9e3722f53287a)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑤学習データ準備編](http://qiita.com/neriai/items/b525b6c9beb5b5d2f8fb)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑥学習プログラム編](http://qiita.com/neriai/items/6a662a49054bc544806d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑦学習モデル編](http://qiita.com/neriai/items/bd4b880e968fd41119f1)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑧学習実行編](http://qiita.com/neriai/items/791e6f4dd8d08775542b)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編](http://qiita.com/neriai/items/a7b47127462ecf0fcc1d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑩顔分類試験編](http://qiita.com/neriai/items/652ced2227b0283ce35e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑪Web公開準備編](http://qiita.com/neriai/items/bb88858cb5004cbb24d9)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編](http://qiita.com/neriai/items/808ee49e276060457c14)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)
keynote に貼る Syntax Highlight


![image.png](https://qiita-image-store.s3.amazonaws.com/0/18843/42e33e7f-9677-213f-26a1-8f1e487a9ad5.png)

コードを綺麗に貼りたい場合に、 highlight が便利。

```console
$ brew install highlight
```

 azusa のコード貼り付けるテンプレは dark 背景なのでそのままだと見えない。。
毎回 thema であったり、 font を調べてcommandにするのがめんどくさいのでメモ。

- yaml の場合

```console
$ highlight -l -k monaco -K 33 -s Candy -S yaml -O rtf file 名 | pbcopy
```


- golang の場合

```console
$ highlight -l -k monaco -K 33 -s Candy -S go -O rtf file 名 | pbcopy
```

- ruby の場合

```console
$ highlight -l -k monaco -K 33 -s Candy -S ruby -O rtf file 名 | pbcopy
```

- python の場合

```console
$ highlight -l -k monaco -K 33 -s Candy -S python -O rtf file 名 | pbcopy
```

- shellscript の場合

```console
$ highlight -l -k monaco -K 33 -s Candy -S sh -O rtf file 名 | pbcopy
```

- 使っている option

```console
 -S, --syntax=<type>            specify type of source code
 -O, --out-format=<format>      output file in given format
                                  <format>=[html, xhtml, latex, tex, odt, rtf,
                                  ansi, xterm256, truecolor, bbcode, pango, svg]
 -k, --font=<font>              set font (specific to output format)
 -K, --font-size=<num?>         set font size (specific to output format)
 -l, --line-numbers             print line numbers in output file
 -s, --style=<style>            set colour style (theme)
```

- `-k monaco`

コードを書いてるフォントに合わせて指定する。自分は monaco 使っているので monaco 指定している

- `-K 33`

デフォルト 10px は実際に張ってみると小さいので指定する。 

- `-s Candy`

ここにテーマがあるので、コードを貼る背景の色に合わせて指定する

http://www.andre-simon.de/doku/highlight/en/theme-samples.php

- `-S syntax`

コードのシンタックスを選べる。

http://www.andre-simon.de/doku/highlight/en/langs.php
gitプッシュ時にSlackに投稿する

# gitプッシュ時にSlackに投稿する

hooks/post-receiveに以下を記載

```sh:post-receive
#!/bin/bash                                                                                                                                   

MESSAGE=$(git log -1 --pretty=format:"%h - %an : %s" --branches)
TEXT="text="${MESSAGE}
TOKEN="token=[取得したToken]"
CHANNEL="channel=[投稿したいチャンネル]"
USER="user="$(whoami)

curl -XPOST -d ${TOKEN} -d ${CHANNEL} -d "${TEXT}" -d 'as_user=true' -d ${USER} 'https://slack.com/api/chat.postMessage'
```
Rubyの配列,ハッシュ,シンボルの学習



## 配列
array1 = [1,2,3,4]
p array1        # [1, 2, 3, 4]

array2 = ["a","b","c",1]
p array2        # ["a", "b", "c", 1] 文字/数値が混在でもOK

## ハッシュ
hash1 = {}
hash1["key1"] = 'value'
p hash1         # {"key1"=>"value"}
p hash1["key1"] # "value"

### ハッシュは以下のようにも書ける
hash2 =  { "key2" => "value2", "key3" => "value3" }
p hash2["key2"] # "value2"

## ハッシュとシンボルの組み合わせ（key4は古い書き方）
hash3 =  { key3: "value3", :key4 => "value4" }
p hash3         # {:key3=>"value3", :key4=>"value4"}
p hash3[:key3]  # "value3"

### ただしハッシュはkeyを文字列かシンボルかで区別しているので、この書き方ではnilになる
p hash3["key3"] # nil

## シンボル
### 変数やクラスやメソッドを作るとシンボルが自動で作られる
puts Symbol.all_symbols
TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編

# はじめに
- 基本パクリです。特にソースコードはほぼ丸パクリです。ただし、そのままだと動かないので手は加えてます。
- ディープラーニングの基礎知識が皆無です。動かしたい欲望だけで作りましたので、ご了承ください。
- 開発期間は約１週間くらいです。
- Pythonわかりません。TensorFlow初めてです。とかいうレベルです。
- Dir en greyについては、https://ja.wikipedia.org/wiki/DIR_EN_GREY
  こちらで勉強してください。
- ちょっと記憶が曖昧なところがあるので間違ってたらさーせん。
- Qiita初投稿です。わからないことだらけです。

# パクリ元
- [ディープラーニングでザッカーバーグの顔を識別するAIを作る①（学習データ準備編） - Qiita](http://qiita.com/AkiyoshiOkano/items/72f3e4ba9caf514460ee)
- [TensorFlowによるディープラーニングで、アイドルの顔を識別する - すぎゃーんメモ](http://memo.sugyan.com/entry/20160112/1452558576)
- [TensorFlowによるももクロメンバー顔認識（前編） - Qiita](http://qiita.com/kenmaz/items/4b60ea00b159b3e00100)

# 説明
Dir en greyのメンバーの顔を学習させ、Web上から人物の画像を登録するとどのメンバーの顔に近いか検出してくれます。
今回は３名（京、薫、Shinya）を学習させてます。
ちなみに、本人達の画像をいれると結構高い精度で当ててくれます。

阿部サダヲ系の顔だと京によります。
![kyo.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/08eb3e1f-b1ef-776e-9163-d2617c2add49.jpeg)

髭面、おっさん系の顔だと薫によります。
![kaoru.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/a37245b3-8fd8-4de9-ad3f-fdf40ce37672.jpeg)

女性系の顔だとShinyaによります。
![shinya.jpg](https://qiita-image-store.s3.amazonaws.com/0/90598/5fede76c-61c9-5516-e490-2e7613a0e79a.jpeg)

# 完成したもの
![FireShot Capture 26 - Dir en grey顔チェッカー - http___127.0.0.1_5000_post.png](https://qiita-image-store.s3.amazonaws.com/0/90598/808d9269-7f52-9607-eb05-c091803f8c35.png)

## 結果だけ見たい方はこちら
[TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)

# 全ページリンク
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ①紹介編](http://qiita.com/neriai/items/bd7bc36ec42c8ef65b2e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ②環境構築編](http://qiita.com/neriai/items/c0114af9c2eae627b6ce)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ③画像収集編](http://qiita.com/neriai/items/bac92c54ca77ebb32ecc)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ④顔抽出編](http://qiita.com/neriai/items/cedc0de9e3722f53287a)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑤学習データ準備編](http://qiita.com/neriai/items/b525b6c9beb5b5d2f8fb)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑥学習プログラム編](http://qiita.com/neriai/items/6a662a49054bc544806d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑦学習モデル編](http://qiita.com/neriai/items/bd4b880e968fd41119f1)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑧学習実行編](http://qiita.com/neriai/items/791e6f4dd8d08775542b)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑨データ可視化編](http://qiita.com/neriai/items/a7b47127462ecf0fcc1d)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑩顔分類試験編](http://qiita.com/neriai/items/652ced2227b0283ce35e)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑪Web公開準備編](http://qiita.com/neriai/items/bb88858cb5004cbb24d9)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑫Web公開編](http://qiita.com/neriai/items/808ee49e276060457c14)
- [TensorFlowを使ってDir en greyの顔分類器を作ってみた - ⑬遊んでみる編（最終回）](http://qiita.com/neriai/items/6c984fa1e7876e5140cf)
dump1090-mutabilityのインストール方法とWebサーバーの設定

# dump1090-mutabilityのインストール
dump1090-mutabilityのインストール自体はそれほど難しくはない。
基本的には、次の通りに行えばインストールできる。

```
$ git clone https://github.com/mutability/dump1090.git
$ sudo apt-get install librtlsdr-dev libusb-1.0-0-dev pkg-config debhelper
$ cd dump1090
$ dpkg-buildpackage -b
$ cd ..
$ sudo dpkg -i dump1090-mutability_1.15~dev_armhf.deb
```

ただし、このままだとリスタートしても`dump1090-mutability`が立ち上がらないことがあるので、以下のようにnanoで/etc/default/dump1090-mutabilityを開く。

```
sudo nano /etc/default/dump1090-mutability
```

次に以下のように`START_DUMP1090="no"`を`START_DUMP1090="yes"`とする。

```
# Set to "yes" to start dump1090 on boot.
START_DUMP1090="yes"
```

後はリブートしてtopコマンド当たりでdump1090-mutabilityが動いているかどうか確認する。


# Webからdump1090-mutabilityを確認する
上記のインストールではなぜかWebサーバーが立ち上がってないことがあるようなので、`lighttpd`をインストールする。

```
$ sudo apt-get install lighttpd
$ sudo lighty-enable-mod dump1090
$ sudo service lighttpd force-reload
$ sudo reboot
```

後は、`http://[Raspberry PiのIP Address]/dump1090/`にアクセスすればWebページが見れるはずだ。

![Safari001.jpg](https://qiita-image-store.s3.amazonaws.com/0/125657/36db4eaa-f436-f41c-8aa8-e2d6bb1ed7ee.jpeg)


# 終（または結）
エアバンド受信には必須ともいえるdump1090であるが、やってる人が少ないのか、あまり情報がない。
特にWebサーバー関連の情報は全然なくて、私自身かなりの時間をかけて調べて調べて、該当のページになんとかこぎ着けた感じではある。
通常は、ただのdump1090を落として`./dump1090`で起動する方法が解説されていたりするが、これだとリスタートごとに毎回立ち上げなきゃならないので割と面倒臭いし、なんかの拍子で落ちてしまうと、落ちたこと自体気がつかず、そのまま運用とかもあり得るので、やはりパッケージインストールの方が楽だろう。
ElixirでJSON日時の差を取得～Timexの利用～

（この記事は [Elixir (その2)とPhoenix Advent Calendar 2016](http://qiita.com/advent-calendar/2016/elixir2_and_phoenix) 22日目の記事です）

社内のElixirハッカソン＆アイデアソンにて、カスタマーサポートから「お客さんからの問い合わせから返信まで何時間かかっているかを知りたい」というアイデアが出てきたので、チケットシステムから「チケット発行日時」から「最初にお客さんに返信した日時」までの差を拾うことになりました

その際、Timex周りを使った日時差の取得に関して、Timexがバージョンアップしている影響か、あまりWebページやサンプルも無く、Timexのhexdocs見ながらで試して、ややハマったんで、その解説いきます

ちなみに、チケットシステムは「Zendesk」で、[Zendesk API](https://developer.zendesk.com/rest_api/docs/core/introduction)というものを使うと、チケット情報と、チケット配下のコメント群情報が、JSONで拾えます

<b>目指せ、カスタマーサポートからマネージャまで、Elixirでツールをサクっと作ってしまう世界！</b> :sunrise:

# Timexモジュールのインストール

いつも通り、適当なElixirプロジェクトのmix.exsに下記エントリー追加して、deps.getします

```ex:mix.exs
defmodule WebMiniAi.Mixfile do
　…
	defp deps do
　…
		{ :timex, "~> 3.0" },
　…
```

モジュール取得します（要ネット接続）

```
# mix deps.get
```

# ハマり①：JSON中の日時文字列を日時値に変換

Poisonモジュールで、JSONからパースした日付は、文字列のため、こんな感じで変換します

```ex
"yyyy-mm-ddThh:mm:ssZ" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )
```

※parse()の"%Y-%m-%dT%H:%M:%SZ"の部分は、パースする文字列のフォーマットによって変わります

試してみましょう

```ex
iex> "2017-04-11T09:08:58Z" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )
{:ok, ~N[2017-04-11 09:08:58]}
```

:okとセットのタプルで返ってくるので、実際に使うときは、こんな感じで、タプルのパターンマッチで受けます

```ex
iex> { :ok, created_at } = "2017-04-11T09:08:58Z" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )
{:ok, ~N[2017-04-11 19:08:58]}
iex> created_at
~N[2017-04-11 19:08:58]
```

# ハマり②：日時の差を出す

こんな感じで取得できます

```ex
Timex.diff( datetime_to, datetime_from, :hours )
```

※:hoursのところは、出したい単位によって変わりますが、[単位の全量はこちらにあります](https://hexdocs.pm/timex/Timex.html#diff/3)

では、試してみましょう

```ex
iex> Timex.diff( ~N[2017-04-12 09:08:58], ~N[2017-04-11 19:08:58], :hours )
14
```

時単位での差分が出せました

toとfromが逆転するパターンも試しましょう

```ex
iex> Timex.diff( ~N[2017-04-11 19:08:58], ~N[2017-04-12 09:08:58], :hours )
-14
```

マイナス表記になりました

単位を変えてみましょう

```ex
iex> Timex.diff( ~N[2017-04-12 09:08:58], ~N[2017-04-11 19:08:58], :minutes )
840
iex> Timex.diff( ~N[2017-04-14 09:08:58], ~N[2017-04-11 19:08:58], :days )
2
```

うまく動作しました
Vyatta 検証(1) VMware 上に Vyatta をデプロイする


まず、[ここにある方法](http://virtual.cocolog-nifty.com/virtualmachine/2011/02/esx-esx-41-3d04.html
)でデータストアにアクセス。
vSphere Web Client ではダメな模様。vSphere Client 経由で実施した。
具体的には、こんな手順でデプロイしたよ。

- ファイルを Upload するホストを選択して「構成」タブを開く
- 対象のデータストアを選択して右クリック「データストアの参照」
- 出てきたブラウザのメニュー上の「ファイルのアップロード」を選択

<img width="313" alt="スクリーンショット 2017-05-31 11.34.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/105131/83e69fc4-54c3-ab03-cb14-dc5b4b25b2be.png">

- アップロードするファイルを選択してアップロード開始

参考：
http://ichibariki.hatenablog.com/entry/2017/01/29/133610


そして、アップロードした ISO ファイルをマウントして仮想マシンをデプロイ。
ここからは、vSphere Web Client で作業。

ナビゲータ:ホーム > ホストおよびクラスタ から対象のボリュームを選択して右クリック「新規仮想マシン」から仮想マシンの作成を開始。
このとき、「ハードウェアのカスタマイズ」で 新規ネットワーク > アダプタタイプ：VMXNET 3 を選択すること。
さらに、「新規 CD/DVD ドライブ」にて「データストア ISO ファイル」を選択。
<img width="635" alt="スクリーンショット 2017-05-31 12.00.19.png" src="https://qiita-image-store.s3.amazonaws.com/0/105131/f4dc2372-2d05-48f9-9cc2-560a618734aa.png">

先ほどアップロードしたデータストアから Vyatta の ISO イメージを選択する。

## 注意

-すべてのVyatta vRouterのLinuxディストリビューションは、Debian GNU/Linuxです。


アーキテクチャとディストリビューションバージョンは、Vyatta vRouterのバージョンによって異なります。

参考：
https://hds.networld.co.jp/helpdesk/support/FaqFacadeServlet?TaskType=Detail&seriesId=VT&id=00002959&categoryId=0225&JspUrl=/support/FrequentlyDetail.jsp
svnコミット時にSlackに投稿する

# svnコミット時にSlackに投稿する

hooks/post-commit に以下を記載

```sh:post-commit
#!/bin/bash

REPOS="$1"
REV="$2"
TXN_NAME="$3"
export LANG=ja_JP.utf8
AUTHOR=`svnlook author -r $REV $REPOS`
COMMENT=`svnlook log -r $REV $REPOS`

SHORTREPOS=`basename ${REPOS}`
TEXT="text="${SHORTREPOS}:${COMMENT}
USERNAME="username="${AUTHOR}
TOKEN="token=[取得したToken]"
CHANNEL="channel=[投稿したいチャンネル]"

curl -XPOST -d ${TOKEN} -d ${CHANNEL} -d "${TEXT}" -d 'as_user=false' -d ${USERNAME} 'https://slack.com/api/chat.postMessage'
```
URIってなんだろうと思っていた

標準添付ライブラリ紹介 【第 8 回】 uri, pathname
http://magazine.rubyist.net/?0015-BundledLibraries

URI : URL と URN
https://www.alib.jp/html/uri.html

> URI (Uniform Resource Identifiers; RFC 3986) とは、 世界中のリソースを一意に表現するためのもので、 URL (Uniform Resource Locators; RFC 1738) 以外に URN (Uniform Resource Names; RFC 2141) も含んだ呼び方です (参考:http://www.alib.jp/html/uri.html)。 さらに URI を多言語に対応させた IRI (Internationalized Resource Identifier; RFC 3987) というものもあります。
URN は、「urn:ietf:rfc:2141」のように「urn:」で始まる URI です。 URN や IRI は今回は扱いませんが、そういうものがあるということを知っておくと役に立つことがあるかもしれません。


個人的まとめ
URI = 　URL 　や、 URN (あとはIRIとかあるらしい)　を包括した呼び方。URLは大まかにいえばurn:　から始まらないもの。（http:やftp:から始まるもの）
rails コロンの意味

Railsのコロンの意味（書き方）がわからなかったので調べた。

--- 
Rubyで使われるコロンの意味を調べてみた
http://blog.naoshihoshi.com/entry/2016/11/11/083000

Ruby on Rails 入門のための知識 1（シンボルとハッシュ）
http://ruby-newbie.hatenablog.com/entry/2012/12/30/201905

--- 

シンボルは同じものを参照してるから文字列で指定より、早いってことみたい。

書き方は、
```
{:aaa => "bbb"}
{aaa: "bbb"}
```
が同じ、ってことみたい。(矢印を省略できる？)

つまり
`@contents = Content.all.order(created_at: :desc)`
は
`@contents = Content.all.order("created_at" => "desc")`
とも書ける。
.gitignoreで除外していたファイルを追加した際のエラー対処法

## 概要
当初`.gitignore`でgitの管理から除外していたファイルを、git管理下へ含めて`git pull`しようとした。
以下のようなエラーが発生し、pullすることができなくなってしまった。

```ruby:エラー内容
error: Untracked working tree file 'path/to/file' would be overwritten by merge.  Aborting
```

これは、`.gitignore`で除外されているファイルがcommitに存在することが原因のようです。

## 対処法１
対象のファイルを削除する。
これによって新たにファイルを追加することが可能になります。
既に動いているサーバー上で、ファイル削除→`git pull`の時間でもサーバーダウンしてしまうなど、
諸々の事情でファイルを削除出来ない場合は、以下の対処法２を行いましょう。

## 対処法2
remoteのrepositoryを`origin`として、`master`というブランチで作業を行う場合は以下の操作を行います。

```ruby:操作
git fetch --all
git reset --hard origin/master
```
remoteの変更を全て取得し、強制的に`origin`の最新にリセット（この場合状態は進めていますが）しています。

## 参考文献
[[Git]エラー：The following untracked working tree files would be overwritten by merge:](http://to-developer.com/blog/?p=1162)
[Git – Force Overwrite of Untracked Working Tree Files](http://ageekandhisblog.com/git-force-overwrite-of-untracked-working-tree-files/)
SQLのin句でテーブル検索結果がNULLの時は全件、それ以外は絞り込み結果を返す

昔調べて書いてあるサイトを見つけたきがするけど、見つからないのでメモ書き

```sql
select
	*
from TestTable
where key in (select key from TestTable where col1 > 100)
```

この形式で複数件をINできる・・・んだけど、件数0件のときはNULLでIN検索するため0件検索される。

0件のとき全件検索をしたい場合は


```sql
select
	*
from TestTable1
where 1 = case when (select count(key) from TestTable where col1 > 100) = 0 then 1 
               when key in (select key from TestTable where col1 > 100) then 1 
               else 0 end
```

つまり、0件なら問答無用で正しい条件、1件以上あればデータがあるときのみ正しい条件となるようにCase式でWhere条件を記載する

もうちょっとスマートなやり方もありそうだけど・・・
jQuery を使ってボタンクリックでファイルをダウンロードする

```html:index.html
<!DOCTYPE html>
<html lang="ja">
<head>
<meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="button_download.js"></script>
</head>
<body>
<button id='button_download'>Download</button>
<hr />
<div id="outarea_aa">outarea_aa</div>
<div id="outarea_bb">outarea_bb</div>
<div id="outarea_cc">outarea_cc</div>
<div id="outarea_dd">outarea_dd</div>
<div id="outarea_ee">outarea_ee</div>
<div id="outarea_ff">outarea_ff</div>
<div id="outarea_gg">outarea_gg</div>
<div id="outarea_hh">outarea_hh</div>
<hr />
Dec/09/2021<p />
</body>
</html>
```

```js:button_download.js
jQuery  (function ()
{
	jQuery("#outarea_aa").text ("*** start ***")

	var content = "ファイルの中身\n"
	content += "May/31/2017\n"

	jQuery('#button_download').click( function()
		{
		jQuery("#outarea_bb").text ("*** clicked ***")
		var link = document.createElement('a')
		link.href = window.URL.createObjectURL( new Blob( [content] ) )
		link.download = "filename.txt"
		link.click()
		})

	jQuery("#outarea_hh").text ("*** end ***")
})
```

![download_dec09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/d461f5ff-bdf4-1a08-13c4-c4fd4cfddd23.png)

filename.txt というファイルがダウンロードされます。
MacでUTF-8のCSVファイルをExcelで開くと文字化けするときに簡単にBOMを付ける方法


はじめに
========
CSVファイルを出力したのは良いが、普通にUTF-8で出力してしまうとExcelでは開けないですよね。
ShiftJISに変換するか、ファイルの先頭にBOMを付けてあげると良いのですが、なんとなくShiftJISに変換するのは嫌なのでBOMを付けた上で開く方法のメモです。


BOMを付ける方法
=========

`a.csv` というUTF-8のファイルがあるときに、

```bash
(printf "\xEF\xBB\xBF"; cat a.csv ) > b.csv
```

とすると、`b.csv` は Excelで文字化けせずに開けるようになります。


さいごに
======

もっとかっこ良い方法があるといいなぁ。
ATOM 1.17 でエディタのフォーカスがプロジェクトフォルダーサイドバーに奪われてしまう事象への対応

ATOM 1.17 でエディタのフォーカスがプロジェクトフォルダーサイドバーに奪われてしまう事象への対応について

## <i class='fa fa-history'></i> 背景
ある日、ATOMのバージョンがあがったらエディタのフォーカスが
プロジェクトフォルダーサイドバーに奪われてしまい一切編集できなくなってしまいました。

## <i class='fa fa-warning'></i> 原因
synced-sidebar Packageの以下のバグによるもの

[Issue33 - peterdotjs/atom-synced-sidebar](https://github.com/peterdotjs/atom-synced-sidebar/issues/33)

## <i class='fa fa-check-circle'></i> 対応
[comment - Issue33 - peterdotjs/atom-synced-sidebar](https://github.com/peterdotjs/atom-synced-sidebar/issues/33#issuecomment-302125183)

synced-sidebar と同等の機能は ATOM の標準機能になっているので、
synced-sidebar をアンインストールして標準機能の該当機能を有効にする
brew doctor が通らなくてやったメモ

アップデートしたら ……

```
$ brew update
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: Some installed formula are missing dependencies.
You should `brew install` the missing dependencies:
  brew install openssl@1.1

Run `brew missing` for more details.
```

とのこと

```
$ brew install openssl@1.1
==> Downloading https://homebrew.bintray.com/bottles/openssl@1.1-1.1.0f.sierra.bottle.tar.gz
######################################################################## 100.0%
==> Pouring openssl@1.1-1.1.0f.sierra.bottle.tar.gz
==> Using the sandbox
==> Caveats
A CA file has been bootstrapped using certificates from the system
keychain. To add additional certificates, place .pem files in
  /usr/local/etc/openssl@1.1/certs

and run
  /usr/local/opt/openssl@1.1/bin/c_rehash

This formula is keg-only, which means it was not symlinked into /usr/local,
because this is an alternate version of another formula.

If you need to have this software first in your PATH run:
  echo 'export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"' >> ~/.zshrc

For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/openssl@1.1/lib
    CPPFLAGS: -I/usr/local/opt/openssl@1.1/include

==> Summary
🍺  /usr/local/Cellar/openssl@1.1/1.1.0f: 6,421 files, 15.5MB
```

なるほど

```
$ /usr/local/opt/openssl@1.1/bin/c_rehash
Doing /usr/local/etc/openssl@1.1/certs
```

.zshrc に以下を追記

`export PATH="/usr/local/opt/openssl@1.1/bin:$PATH"`

```
$ source ~/.zshrc
$ openssl version
OpenSSL 1.1.0f  25 May 2017
$ brew doctor
Your system is ready to brew.
```

通った。

後で何かハマったら関係あるかもメモ
```
For compilers to find this software you may need to set:
    LDFLAGS:  -L/usr/local/opt/openssl@1.1/lib
    CPPFLAGS: -I/usr/local/opt/openssl@1.1/include
```