OmniAICreator/Qiita-1.07M huggingface dataset:
railsアプリをデプロイすると２回に１回pumaが落ちる問題

# 先に
以下のissuesを既に読んだ人に新たな知見を与える記事ではありません :bow: 
https://github.com/puma/puma/issues/1308
https://github.com/seuros/capistrano-puma/issues/237

# 結論
pumaの3.9.1にてissuesが上がっています。
~~puma-3.8.2に下げるのが 2017/07/20 現在、解決策として提案されています。~~
[「puma 3.10.0 にて修正された！」という喜びの声が届いています。](https://github.com/seuros/capistrano-puma/issues/237#issuecomment-323382753)

# 経緯
railsをデプロイすると２回に１回サービスが落ちていた。
調べると、`puma:restart`するときにエラーを吐いて落ちていることが判明。
pumaプロセスが無い時は`puma:start`が実行されるので、落ちた次のデプロイは成功する。
pumaプロセスが有る時は`puma:restart`が実行されるので、成功した次のデプロイはpumaが落ちる。
ciは「pumaにrestartを依頼することに成功したよ！」とだけ言ってpumaが正常に上がったかを検知していなかったので、発見が遅れてしまった。

# 同定方法
puma_error.logを確認して以下内容だったら同じ原因である可能性があります。

```puma_error.log
/usr/local/rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems.rb:270:in `find_spec_for_exe': can't find gem puma (>= 0.a) (Gem::GemNotFoundException)
	from /usr/local/rbenv/versions/2.4.1/lib/ruby/2.4.0/rubygems.rb:298:in `activate_bin_path'
	from /var/www/ws_shimapo/shared/bundle/ruby/2.4.0/bin/puma:22:in `<main>'
```
SourceTree v2.1.2.4 > bug: staging areaに変更ファイルが表示されない

```txt:動作環境
Windows 7/8.1/10
```

SourceTree 2.x has major issues displaying staged files
https://jira.atlassian.com/projects/SRCTREEWIN/issues/SRCTREEWIN-7361?filter=allopenissues
> Affects Version/s:
2.1.2.4
...
> 2: Sourcetree 2.x will randomly decide to hide actual files with changes in both staging areas... they will just randomly simply disappear without warning and not come back.
...
> Andrian Zubovic
> We are also seeing the issue where files are randomly appearing and disappearing from the staged and unstaged files lists.
...

VCSとして基本的な機能に不具合があるようだ。

[SourceTreeの一連のバグ](https://jira.atlassian.com/browse/SRCTREEWIN-7616?jql=project%20%3D%20SRCTREEWIN%20AND%20resolution%20%3D%20Unresolved%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC)
がきちんと修正されるのは半年後なのか一年後なのか。

### 関連

http://qiita.com/7of9/items/50d92aef456b180b876c
[クイズ]javascriptと仲良くなるための一歩　第３話「MAX_VALUE, INFINITYの計算」

# 問題「MAX_VALUE, INFINITYの計算」

MAX_VALUEはNumberの最大値を
POSITIVE_INFINITYは正の無限大を表します。

```js
Number.MAX_VALUE
//=> 1.7976931348623157e+308
Number.POSITIVE_INFINITY
//=> Infinity
```

## 第1問

```js
Number.MAX_VALUE*2
//=> ?
```

## 第2問

```js
Infinity/2
//=> ?
```

## 第3問

```js
Infinity*0
//=> ?
```

## 第４問

```js
2/Infinity
//=> ?
```

## 第５問

```js
Infinity/Infinity
//=> ?
```

## 第６問

```js
2%Infinity
//=> ?
```

:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:
:mouse:
:cow:
:tiger:
:rabbit:
:dragon_face:
:snake:
:horse:
:sheep:
:monkey_face:
:bird:
:dog:
:boar:

#答え

## 第1問

```js
Number.MAX_VALUE*2
//=> Infinity
```

## 第2問

```js
Infinity/2
//=> Infinity
```

## 第3問

```js
Infinity*0
//=> NaN
```

## 第４問

```js
2/Infinity
//=> 0
```

## 第５問

```js
Infinity/Infinity
//=> NaN
```

## 第６問

```js
2%Infinity
//=> 2
```
GoogleComputeEngineのVMインスタンスにWinScpでログイン

#環境
Windows10 Home

#概要
コマンドラインでの操作がつらい。GUIでファイル転送したい為にWinScpで接続します

#GoogleComputeEngineの設定
以下を参照して設定する
<a href=http://qiita.com/fukaken5050/items/b8c6d64fb1227fd4c748 target=_blank>GoogleComputeEngine上にサーバを立ててUNETを動かす</a>

#WinScpのインストール
https://winscp.net/eng/download.php

・「Installation package」をダウンロードしてインストール
　エクスプローラ風にした

#WinScp接続設定
・「転送プロトコル」は「SCP」に設定
・「ホスト名」はVMインスタンスの「外部IP」を設定（例:104.198.168.72）
・「ユーザー名」は「gcloud compute ssh」コマンドの時のユーザー名（例:fukaken5050）
・「ポート番号」は22
・「パスワード」は設定しない
・「設定」ボタンを押す
・「SSH」>「認証」>「認証条件」>「秘密鍵」>「...」を押す
・「C:\Users（ユーザー）\ユーザー名\\.ssh」にある「google_compute_engine.ppk」を選択
・「OK」を押す
・「保存」を押す
・「ログイン」でログインする

#隠しファイルの表示
「.bash_profile」等の表示の為
・メニューの「表示」>「環境設定」
・「パネル」>「隠しファイルを表示する」にチェック
displaCyをインストールする(CentOS)

[displaCy](https://demos.explosion.ai/displacy/) はとても便利だが、普通にインストールするとエラーが出てうまくいかない。githubのReadme通りにやったら全然うまく行かなくて20時間ハマった。

sudo権限とか、npmのオプションとか、nodeのバージョンとか様々な壁にぶち当たったがなんとか解決。以下のコマンドを順番に打って行けばインストールできるはず。試したのはCentOS7だけど、おそらく6でも可能。Ubuntuなど別のディストリビューションでも yum を apt-get など適切なコマンドに置き換えれば多分うまくいく。

余計なものをインストールしたり、sudoをつけたりすると取り返しのつかないことになりうるのでやめましょう。

```
# make yum latest version
sudo yum -y update

# install n(node version management tool). Answer "y" to all
sudo yum -y install git
sudo curl -L https://git.io/n-install | bash

# read bashrc to enable n
. ~/.bashrc

# install and switch to node 8.0.0
n 8.0.0

# update npm(node package modules)
npm update npm

# do not use npm scripts as root by default
npm config set unsafe-perm true

# install c and c++ in case npm use it
sudo yum -y install gcc gcc-c++

# install harp
npm install -g harp

# if necessary, download demo and launch server with harp(don’t forget to open port 9000)
git clone https://github.com/explosion/displacy
cd displacy
harp server -p 9000
```
複数の numpy array の 合計(sum)

#numpy array の 合計(sum)
複数(2つ以上)の array を加算して要素ごとの合計を出したい。
numpy には　numpy.sum 関数が用意されているが、この関数では array 内の全ての要素の合計、もしくは row or column ごとの合計をだすものだから使えない（と思ってましたが、コメントでのご指摘通りにやればできました笑）。 
で少し考えた後、 default の sum関数を使ってみたら普通にできた。

```py
>>> import numpy as np
>>> hoge = np.array([1,2,3]) 
>>> sum([hoge,hoge,hoge]) 
array([3,6,9])
```

中の要素を単純に足し合わせる実装だと考えるとできるのは当然といえば当然だけど、、、
あ、でも ```sum(["a","b","c"])```はできない。どうやら ```0``` に加算していく実装になってるっぽい。
（python2.7.13で試したので、3系だとどうかはわからない。）
Raspbian 仮想マシン作成手順

# OS インストール

1: [PIXEL for PC and Mac](https://www.raspberrypi.org/blog/pixel-pc-mac/) から iso ファイルを取得する。

2: Powershell を起動して iso ファイルを vdi ファイルに変換する。

```ps1
cd $env:VBOX_MSI_INSTALL_PATH
# iso -> vdi
VBoxManage.exe convertfromraw 2016-12-13-pixel-x86-jessie.iso 2016-12-13-pixel-x86-jessie.vdi
# vdi を 任意のサイズ(MB 単位で指定)に拡張する。
VBoxManage.exe modifyhd 2016-12-13-pixel-x86-jessie.vdi --resize 32000
```

3: Virtual Box 起動 > 新規

| 項目名         | 値                                          |
|---------------|---------------------------------------------|
| 名前          | raspbian-vbox                                |
| タイプ        | Linux                                        |
| バージョン    | Debian(32-bit)                               |
| メモリーサイズ | 1500 MB                                      |
| ハードディスク | 既にある仮想ハードディスクファイルを使用する      |

4: 設定

| セクション             | 項目名         | 値                  |
|-----------------------|---------------|---------------------|
| システム               | マザーボード   | I/O APIC を有効化    |
|                       | プロセッサー   | 2                   |
| ユーザーインターフェース | ミニツールバー | スクリーンの上部に表示 |

5: 起動

# システム最新化

1: キーボード設定
   raspberry アイコン > Preferences > Mouse and Keyboard Settings

2: システム最新化

```bash
sudo apt-get update && sudo apt-get upgrade
```

# raspi-config による初期設定

1: raspi-config インストール

```bash
sudo apt-get install raspi-config
```

2: raspi-config 起動

```bash
sudo raspi-config
```

3: 下記設定を変更する

| 項目名                | やること                      |
|----------------------|------------------------------|
| Hostname             | ホスト名を変更する             |
| Boot Options         | オートログインを無効化する      |
| Localisation Options | ロケールとタイムゾーンを変更する |

# その他初期設定

1: root ユーザーパスワード設定

```bash
sudo passwd root
su # 確認
exit # 一般ユーザに戻す
```

2: 新規ユーザ追加

```bash
sudo adduser ユーザ名
```

3: グループ設定

```bash
groups pi
sudo usermod -G pi,adm,dialout,...... ユーザ名
groups ユーザ名 # 確認
```

4: 再起動

```bash
sudo reboot
```

5: 2 で作成した新規ユーザでログインできることを確認する。

6: pi ユーザを削除する

```bash
sudo userdel -r pi
```

# Vitual Box Guest Additions インストール

1: ビルドに必要なパッケージをインストールする

```bash
sudo apt-get install build-essential module-assistant linux-headers-3.16.0-4-all
```

2: Insert Guest Additions CD Image......

3: Virtual Box Guest Additions インストール

```bash
sudo sh VBoxLinuxAdditions.run
sudo reboot
```

# 日本語入力有効化

```bash
sudo apt-get install fcitx-mozc --install-recommends -y
sudo reboot
```
CakePHP 3.4.11リリースされました

CakePHPの最新バージョンをもっとよく知るためにリリースノートの翻訳と関連のPRを紹介しています。

## 本家リリース

twitter: https://twitter.com/cakephp/status/887569429051125761
release: https://bakery.cakephp.org/2017/07/18/cakephp_3411_released.html
githug: https://github.com/cakephp/cakephp/releases/tag/3.4.11

## リリース内容 

CakePHP開発チームは、CakePHP 3.4.11 を発表しました。今回のリリースは、いくつかのコミュニティ報告された問題を修正する3.4ブランチのメンテナンスリリースです。

- FormHelperは、配列をentityフィールドに渡したとき、インデックスが定義されていなかった場合にデフォルト値を使用するようになりました。 [Refs #10250 でmaster marge](https://github.com/cakephp/cakephp/commit/ee2ead47b4b5b25a520a91d0b50a039c193af7eb)
  - 3.4.10でマージされた [#10859](https://github.com/cakephp/cakephp/pull/10859) の追加対応のようです
- ロケールの解析が有効で、時刻形式が浮動小数点型の場合における時刻データのマーシャリング処理を修正しました。[#10895](https://github.com/cakephp/cakephp/pull/10895)
- 3.4.10で導入された`ConsoleIo::overwrite（）`のレグレッションを修正しました。[#10897](https://github.com/cakephp/cakephp/pull/10897)
- nullなど''として扱われる複数のメッセージは、特異なメッセージIDにフォールバックするようになりました。これにより、他の翻訳と一貫性を持ちます。[#10911](https://github.com/cakephp/cakephp/pull/10911)

## 過去のリリースノート

[CakePHP 3.4.10リリースされました](http://qiita.com/ryoichi-u/items/46f6ba2f5d34dbfc888f)
[CakePHP 3.4.9リリースされました](http://qiita.com/ryoichi-u/items/62a00b2c3e1d261d89af)
CLOBをSELECTして表示するjavaソース・サンプル(Oracle Database + java)

下記サイトを参考にしながら書いてみたやで。彡(ﾟ)(ﾟ)
ワイ java は不慣れなんで、そこは勘弁やで彡(-)(-)

>
SELECT文サンプル
http://java-reference.com/java_db_select.html
> 
インタフェースClob
https://docs.oracle.com/javase/jp/8/docs/api/java/sql/Clob.html


表定義は下記彡(ﾟ)(ﾟ)

```sql
SQL> DESC LOB_TBL
 Name          Null?    Type
 ------------- -------- ----------------------------
 LOB_ID        NOT NULL NUMBER
 LOB_DATA               CLOB
```

javaソースのサンプルは下記彡(ﾟ)(ﾟ)

```java
import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Clob;

public class LOBSelectSample {
    public static void main(String[] args) throws Exception{
        //initialize
        System.out.println("Init...");
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Clob cl = null;

        //DB connection info
        String path = "jdbc:oracle:thin:@localhost:1521:orcl";  //path
        String id = "xxxxxxxx";  //ID
        String pw = "yyyyyyyy";  //password

        try{
            //JDBC Driver
            Class.forName("oracle.jdbc.driver.OracleDriver");

            //DB Connect
            System.out.println("Connect...");
            conn = DriverManager.getConnection(path, id, pw);

            //SELECT
            System.out.println("Select...");
            ps = conn.prepareStatement("SELECT * FROM LOB_TBL");
            rs = ps.executeQuery();

            //Column count
            int colCount = rs.getMetaData().getColumnCount();
            System.out.println("Get Column:" + colCount);

            //Output
            while (rs.next()) {
                System.out.print(rs.getInt("LOB_ID"));
                System.out.println();
                cl = rs.getClob("LOB_DATA");
                if (cl != null) {
                    System.out.print(cl.getSubString(1, (int)cl.length()));
                    //System.out.print(cl.getSubString(1, 2097152));
                }
                System.out.println();
            }
        } catch(Exception ex) {
            //Exception
            ex.printStackTrace();  //Error
        } finally {
            //Close
            if(rs != null) rs.close();
            if(ps != null) ps.close();
            if(conn != null) conn.close();
        }
    }
}
```

コンパイル、漢は黙って生javaや！彡(ﾟ)(ﾟ)

```shell-session
javac -classpath .:${ORACLE_HOME}/jdbc/lib/ojdbc8.jar LOBSelectSample.java
```


実行コマンド、漢は黙っt(ry

```shell-session
java -classpath .:${ORACLE_HOME}/jdbc/lib/ojdbc8.jar LOBSelectSample
```


実行結果、LOB_DATA列に突っ込んどいたSQLテキストが出て来たやで彡(^)(^)

```sql
Init...
Connect...
Select...
Get Column:2
1

2
with …
：
(中略)
：
… from dual
```
RealSenseSDK2016R3のFaceModuleをUnityで使うとたまにCrashする

###概要
Qiitaに書くような内容ではないと思いますが、タイトル通りです。
解決策としてはR2を使う。くらいしか思いつきませんが、それも未確認です。
質問掲示板ではないぞ。という指摘があれば削除します。

###環境
RealSenseSDK2016R3
Unity2017.1.0f3
SR300

###実装
```csharp
using UnityEngine;
using Intel.RealSense;
using Intel.RealSense.Face;

public class RealSense : MonoBehaviour
{
    SenseManager SenseManager;
    FaceModule FaceModule;
    FaceData FaceData;

    void Start()
    {
        SenseManager = SenseManager.CreateInstance();
        FaceModule = FaceModule.Activate(SenseManager);
        FaceData = FaceModule.CreateOutput();
        SenseManager.Init();
    }

    void OnDestroy()
    {
        FaceData.Dispose();
        FaceModule.Dispose();
        SenseManager.Dispose();
    }
}
```
###備考
以下は気になる情報です。
https://communities.intel.com/community/tech/realsense/blog/2017/06/20/known-issue-crash-in-libpxcfaceidcdll-in-realsense-sdk-r3
複数の顔を検出すると～、ということで上記の内容とは異なるので私の使い方が間違っている可能性もあります。
ただ、2016R3にはUnityのサンプルがRawStreamsしか無い点も不安です。
言語学論文用のLaTeXメモ


## gb4e

例文番号を振ったりするやつ。似たようなものは他にもあるが、これが一番しっくりくるのでこれを使っている。

	\documentclass[uplatex,12pt]{jsarticle}
	\usepackage{gb4e}
	\begin{document}
	
	\ea 吾輩は猫である。
	\ex
		\ea にゃあにゃあ
		\ex にゃあ
		\z
	\z

	\end{document}

![Kobito.MPRRD1.png](https://qiita-image-store.s3.amazonaws.com/0/109010/bfddb778-c9e7-3a3d-ae61-d17948473e50.png "Kobito.MPRRD1.png")

gb4eは上付き文字 ^ と下付き文字 _ を数式モードの外でも有効にする機能があるが、この機能は他のパッケージと衝突しがちで使いにくい。\noautomath で無効にする方が無難。

	\usepackage{gb4e}
	\noautomath

また、gb4eを使うと数式モードの中で\mathrm がエラーを吐くようになる。とりあえず次のようにすると、この問題を回避できる。

	\let\mrm\mathrm
	\usepackage{gb4e}
	\let\mathrm\mrm


## forest

句構造木を書くのに便利。dvipdfmxを読み込まないとちゃんと表示されないっぽい。細かい設定ができるようだが、句構造木を書く場合は linguistics という設定を読み込んでしまうのが手っ取り早い。

	\documentclass[uplatex,dvipdfmx,12pt]{jsarticle}
	
	\usepackage{forest}
	\useforestlibrary{linguistics}
	\forestapplylibrarydefaults{linguistics}
	
	\begin{document}
	
	\begin{forest}
		[S [NP [吾輩は, roof] ] [VP [猫である, roof] ] ]
	\end{forest}
	
	\end{document}

![Kobito.MHS4An.png](https://qiita-image-store.s3.amazonaws.com/0/109010/4a1c1643-fc14-2e7f-87f9-cc71f45abb47.png "Kobito.MHS4An.png")


## tikz-dependency

係り受け図を描くのに便利。

	\documentclass[uplatex,dvipdfmx,12pt]{jsarticle}
	\usepackage{tikz-dependency}
	\begin{document}
	
	\begin{dependency}
		\begin{deptext}
			吾輩は \& 猫 \& である \\
		\end{deptext}
		\depedge{2}{1}{nsubj}
		\depedge{2}{3}{cop}
	\end{dependency}

	\begin{dependency}[arc edge, hide label]
		\begin{deptext}
			吾輩は \& 猫で \& ある \\
		\end{deptext}
		\depedge{1}{2}{D}
		\depedge{2}{3}{D}
	\end{dependency}
	
	\end{document}

![Kobito.mQpsbU.png](https://qiita-image-store.s3.amazonaws.com/0/109010/0058cb45-9390-ddb6-49d9-0e73645a13ad.png "Kobito.mQpsbU.png")


## ebproof

証明図を描くのに便利。bussproofs というのもあるらしい。

	\documentclass[uplatex,dvipdfmx,12pt]{jsarticle}
	\usepackage{ebproof}
	\begin{document}
	
	\begin{prooftree}
	\Hypo{A\to B}
	\Hypo{A}
	\Infer2{B}
	\end{prooftree}
	
	\end{document}

![Kobito.1ERhrR.png](https://qiita-image-store.s3.amazonaws.com/0/109010/1f4b3980-9fb6-bf01-2f56-f5045d664ecc.png "Kobito.1ERhrR.png")
discordrbでBotにEmbedを送信させる

## やりたいこと
Discord向けのBotを作るためのgemである**discordrb** でEmbedを送りたい．

## Embedとは
通常のチャットメッセージではなく，thumbnailやauthorを指定することで決められたフォーマットに沿って整形されるメッセージのことです．

![embed.PNG](https://qiita-image-store.s3.amazonaws.com/0/102294/647377da-7cda-989a-81c5-23f6f822fa51.png)

DiscordでURLを含んだメッセージを送信した時に，URLのWebページに関する内容がインライン表示されている部分がEmbedです．もし，SlackのIncoming Webhookを利用した経験があるなら， [Attachment](https://api.slack.com/docs/message-attachments) と考えれば分かりやすいかもしれません．

## discordrbでBotにEmbedを送信させるサンプル
```ruby
require 'discordrb'

# Discord botのTOKEN,CLIENT_IDを指定する
bot = Discordrb::Bot.new token: TOKEN, client_id: CLIENT_ID

bot.message(with_text: 'bot embed') do |event|
  event.channel.send_embed do |embed|
    embed.title = 'fugafuga'
    embed.url = 'hoge.com'
    embed.author = Discordrb::Webhooks::EmbedAuthor.new(name: 'hoge-san')
  end
end

bot.run
```

チャンネル内で「bot embed」と発言があった際に，Embedを送信するサンプルです．`event.channel.send_embed do |embed|`で発言のあったチャンネルに対してEmbedを送信することが出来ます．
 
titleやurlなどは単純に文字列を渡すだけで指定できますが，AuthorやImageはDiscordrb::Webhooks::EmbedAuthorを用いて指定する必要があります．

[Class: Discordrb::Webhooks::Embed](http://www.rubydoc.info/github/meew0/discordrb/Discordrb/Webhooks/Embed)

## その他：Embedをプレビューする

[Discord Embed Generator](https://cog-creators.github.io/discord-embed-sandbox/)
Webページ上でEmbedとして表示したい情報を入力することでプレビューできて便利です．
FBXを経由したときに化けちゃった日本語文字列をなんとかする

なにげに前回（▼）の続きです。

- 10進数から2桁の16進数を得たい  
http://qiita.com/it_ks/items/55d43baa996860edaabb

シーン内に日本語名がついたオブジェクトがあるとき、
FBXで渡すと下記のようなオブジェクト名に変換されてしまいます。

```
FBXASC229FBXASC137FBXASC141FBXASC233FBXASC171FBXASC1702
```

oh! Fxxk!!

マテリアルやテクスチャ、ブレンドターゲットなんかも同様になりますので、
**かなりいっぱい**こういうのが錬成されます。

# なんとかしたい

以下のようにしてみました。

```python
from binascii import a2b_hex as a2b

def fbxasc_to_chr( target_str ):
    return_list = []

    stock = ''
    for var in target_str.split( 'FBXASC' ):
        # 空だったら無視する
        if not var:
            continue
        # 1文字目がアルファベットだったら対象外　return_listに足して次へ。
        if var[0].isalpha():
            return_list.append(var)
            continue

        # 字数が3より多ければ、3文字目までをint変換
        ex_digit = ''
        if len(var)>3:
            ex_digit = var[3:]
            code_int = int(var[:3])
        else:
            code_int = int(var)

        stock +=hex( code_int )
        try:
            return_list.append( a2b(stock.replace('0x','')).decode('utf8') )
        except UnicodeDecodeError:
            continue

        # decode、appendができたらリセット
        stock = ''

        if ex_digit:
            return_list.append(ex_digit)

    return ''.join(return_list)
```

# ふんわり解説

ﾌｧｯｷﾝFBX文字列をみてみると、**「FBXASC」**というのが定期的に入っていることが観察できます

もっというと

```
FBXASC + 0-255
```

の組み合わせです。
これを一つの単位（1バイト）として、いくつか並んだ時に文字としてデコードできます。
いくつかというのは、1つで成立するときもあるし、3つで成立するときもあるということです。
なかなかにややこしいので詳細はUTF-8の解説@wikipediaにお任せしますが
https://ja.wikipedia.org/wiki/UTF-8#.E6.96.87.E5.AD.97.E7.A8.AE
（▲）この表によると、英数記号は1、「東アジアの諸文字・全角」は3、なようです。
第3・第4水準の漢字の一部は4とありますね。

## hex

0-255のままでは使えませんので、16進数に直します。
これが冒頭でも言及した、前回の記事です。hex関数を使うことにしました。

変換後には必ず`0x`がつきますが、これを、アスキーからバイナリに変換する前にまとめて除去しています。

```
〜〜.replace('0x','')
```

## アスキー -> バイナリ変換

ここまででは、まだ「 0-9a-f でできた文字列」です。
これをバイナリに変換します。
**binasciiモジュール**の**a2b_hex関数**を使います。

- 19.8. binascii — バイナリデータと ASCII データとの間での変換  
https://docs.python.jp/3/library/binascii.html#binascii.a2b_hex
ここではimport時に端的に「a2b」としています。

アスキー -> バイナリ変換後は **decodeメソッド** が使えますが、存在しない番地だとデコードエラーが発生します。
このエラーを拾って、もしデコードエラーが起きるようなら次に持ち越し、連結して再度変換、という流れになっています。

## FBXASC化されてない愉快な仲間たちへの対処

文字列全部が「FBXASC+0-255」になってくれていれば話は早いのですが……

例えば「.」は「FBXASC046」に書き換えられて登場するのですが、
普通の英数は英数のまま文字列に混ざってきます。
なので、単純にFBXASCでsplitしただけだと、得られるリストの中に「4桁の数値*（0-255の幅じゃなくなってしまう）*」や、「3桁＋英文字*（hexに渡す前にint変換できない）*」が含まれてしまいます。
はみ出た桁はex_digit という変数に入れてあとから連結することにしました。

またオブジェクト名が英数字で始まる/終わる場合は、FBXASCでsplitされない要素が最初/最後にどれくらいつくかわかりませんので、なんかそれっぽくなるようifで仕分けします('A`)

結果、なんかもっとあるだろという気がしてなりません（笑

あと今気づいたんですが、これだともとから0-255の数字が含まれていた場合逆に化けちゃうのじゃないかという謎の心配がありますー疲れたのでまいいや:wink::wink::wink:

# まとめ

シーン内に日本語を含めた車輌は全員シベリア送り25ルーブルよ！

## 参考

- Python3で文字列を処理する際の心掛け  
http://qiita.com/FGtatsuro/items/f45c349e06d6df95839b
- 16進文字列と文字列の変換  
http://qiita.com/atsaki/items/6120cad2e3c448d774bf
- [修正] Python 文字列の英数字判定でハマった  
http://qiita.com/fujiy/items/f738aa9d0bb7427e07a4
AWS EC2上でdb:migrateした際に起きたエラーの対応


* <h4>概要</h4>
作成していたアプリケーションをAWSのEC2上で動作させる準備をしていた時に起きたエラーについてまとめます。Githubから作成したアプリケーションをEC2上にプルし、下記マイグレーションを実行した際にエラーが生じました。

```ruby:EC2server
[ec2-user@ip xxx ~]$ rails db:migrate RAILS_ENV=production
```

* <h4>エラー内容</h4>
<img width="944" alt="Qiita_1_1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/170254/0dfa58c3-db7c-b037-641d-f3e28b23bac9.jpeg">



* <h4>解決方法</h4>
結論としてGithubから.envファイルに入れた環境変数がプルされていないことが原因でした。
（間違っても.envファイル内のAWSのシークレットキーなどをGithubにプッシュしないように。大火事になります。）
下記参照↓
http://qiita.com/mochizukikotaro/items/a0e98ff0063a77e7b694  
EC2サーバー上でvimコマンドにより.envファイルを作成しました。
AWSのシークレットキー周りの作業になるので、ビクビクしながら対応しました。。。  
※.envファイル作成後、lsコマンドで.envディレクトリを確認すると表示されませんでした。
デフォルトでターミナルには表示されないようです。テキストエディタでは確認出来ました。
今回は試しませんでしたが、SCPコマンドでローカルのファイルを転送するのが一般的なようです。
Jenkinsでメモリリークを回避する例

以前Jenkins2のPipeline（旧Workflow Plugin）で作られたジョブをテストで何百回も回すテストに出会ったことがありました。その際ビルドを繰り返すたびに使用メモリが増えてメモリリークしJenkinsの応答がなくなるという現象に出会いました。（Pipeline自体にメモリリークの原因があったはず）このときにテストが終わるまでにJenkinsの応答が無くならないように対応した例を記載しておきます。

## 使用したPlugin

* Monitoring
https://wiki.jenkins.io/display/JENKINS/Monitoring
JVMの情報等を確認するために使用しました。APIが便利です。
Jenkinsの管理画面からMonitoringの画面にアクセスし、```/monitoring?format=json&part=jvm```
これで現在使用中のメモリと最大メモリが取得できます。

* Startup Trigger
https://wiki.jenkins.io/display/JENKINS/Startup+Trigger
jenkins起動時に設定したジョブを実行することができます。

## 回避方法

* jenkinsが起動されたら実行される再起動確認用ジョブを作成する（中身は空でも良いです）
* テストの中で定期的にMonitoringのAPIからメモリ使用率を取得する
* 閾値を超えたら現在の再起動確認用ジョブのAPIから現在のビルド番号を取得しておき、safeRestartでjenkinsの再起動を行う
* 再起動を実行したら再起動確認用ジョブのAPIから現在のビルド番号を取得して（jenkinsが停止している間があるので何回か繰り返して取得する）直前に取得しておいたビルド番号と比較して異なっていたら再起動が成功したという認識でテストを先に進める
Laravelで実装したAPIを動作確認できるlaravel-api-testerを使ってみた

## 概要
APIを実装していて、プロジェクト内のAPIの仕様+動作確認できるものがないかなーと
探してみたらこんなものがあったので使ってみた。
[asvae/laravel-api-tester](https://github.com/asvae/laravel-api-tester)

僕が動作確認したのはLaravel5.4でしたが、
**Laravel5.1以上**で動くらしいです。

## できること
* ルーティング一覧表示
* リクエスト先のコントローラーやアクションメソッドなども見れる
* `GET/POST/DELETE/PUT/PATCH` によるリクエスト
* リクエスト用のJSONを書くためのエディタ付き
* レスポンスもヘッダ・ボディともに確認できる(html, jsonのプレビュー付)
* リクエストは保存可能

## イメージ　(readmeより)
![image.png](https://qiita-image-store.s3.amazonaws.com/0/138750/edeaf283-7de3-638b-4961-b3ed72c0903d.png)


## 導入
まずはインストール

```sh
composer require asvae/laravel-api-tester
```
からの
`Asvae\ApiTester\ServiceProvider::class` を
`config/app.php` に追加するだけでおkです。

```php:config/app.php
・
・
    'providers' => [
        Illuminate\Broadcasting\BroadcastServiceProvider::class,
        Illuminate\Bus\BusServiceProvider::class,
        Illuminate\Cache\CacheServiceProvider::class,
        .
        .
        Asvae\ApiTester\ServiceProvider::class, //追加
    ],
・
・
```

`/api-tester` にアクセスすると、ページが表示されると思います。

## 感想

### 良い

* 見やすい。リクエストも保存できて便利

### 悪い

* セッションが保持できない？？
    * Laravelの `make:auth` で作成したログイン機能に対してPOSTリクエストでログインした結果、ログインは成功するもリダイレクト先で即座に**unauthorized**を食らってしまった。
    * 認証付き（ログイン済みの場合のみ利用可能）のAPIは、ブラウザで通常通りログインをした状態で試してみたら一応動作しました。
* エディタの動作が変
    * **ace**というエディタが仕様されているようですが、なぜかカーソルの位置とと入力される位置がずれていてきもい。。（僕だけ...?）
    * JSONを書く場合は別のエディタで書いてコピペしたほうが早いみたいになってしまったorz
   

これを使わなくても「こんな良いのあるぜ★」　的なものがあれば
ぜひ紹介してください(ﾉ_-｡)
大量のPDFファイルを、pdfminerを使ってtextファイルに変換する 

# 本日のメニュー
[大量の英文pdfファイル](https://github.com/songrotek/Deep-Learning-Papers-Reading-Roadmap)を読みたいのだけれど、英単語がそもそもわからない。
ひとまずpdfファイルをtextファイルに変換して、単語をリスト化して、頻出単語を上から順番に暗記しよう。きっとその方が早く読める！と信じることにした。

そういうわけで、大量の英文pdfファイルを鍋に投入し、茹でてtextファイルに変換することにした。
気分はさながら椀子そば大会のために大量のそばを茹でる気分。


# 調理台の環境
macOS
Python3.6
anaconda

# 食材
消化に困る大量のpdfファイル

# 調理器具
pdfminer　←インストール方法末尾の参照URLをチェック
os
re

PyPDF2よりも、pdfminerの方が良い結果を得られる、らしい。


# 調理の失敗として想定されること
日本語の文章には対応していない（と思われる）ので、ご留意ください。


# 今日の鍋
```py3:PdfToTextConverter.py
#! python3
# PdfToTextConverter.py
# PDFファイルの内容を読み込んで、textファイルとして出力

import os
import re
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO

pdf_folder_path = os.getcwd()			                # 現在のフォルダのパスを取得
text_folder_path = os.getcwd() + '/' + 'text_folder'		# pathの表記がmac仕様。windowsの場合は、'/'を'\'に修正する。

os.makedirs(text_folder_path, exist_ok=True)
pdf_file_name = os.listdir(pdf_folder_path)

# name がPDFファイル（末尾が.pdf）の場合はTRUE、それ以外はFALSEを返す。
# こちらの投稿を引用・一部変更しました　→　http://qiita.com/korkewriya/items/72de38fc506ab37b4f2d
def pdf_checker(name):
	pdf_regex = re.compile(r'.+\.pdf')
	if pdf_regex.search(str(name)):
		return True
	else:
		return False

# PDFをtextファイルに変換
def convert_pdf_to_txt(path, txtname, buf=True):
    rsrcmgr = PDFResourceManager()
    if buf:
        outfp = StringIO()
    else:
        outfp = file(txtname, 'w')
    codec = 'utf-8'
    laparams = LAParams()
    laparams.detect_vertical = True
    device = TextConverter(rsrcmgr, outfp, codec=codec, laparams=laparams)

    fp = open(path, 'rb')
    interpreter = PDFPageInterpreter(rsrcmgr, device)
    for page in PDFPage.get_pages(fp):
        interpreter.process_page(page)
    fp.close()
    device.close()
    if buf:
        text = outfp.getvalue()
        make_new_text_file = open(text_folder_path + '/' + path + '.txt', 'w')
        make_new_text_file.write(text)
        make_new_text_file.close()
    outfp.close()

# フォルダ内のpdfファイル名取得してリスト化
for name in pdf_file_name:
	if pdf_checker(name):
		convert_pdf_to_txt(name, name + '.txt')		# pdf_checkerを使い、TRUE（末尾が.pdfの場合）は変換に進む）
	else:
		pass									    # PDFファイルでない場合にはpass
	
	
```

# 完成品
胃もたれしそうな大量のtextファイル


# 次の調理
大量のtextファイルを椀に移して、頻出単語を500個くらい抽出する。
その単語の意味を覚える（英文を早く読むのに効果があるかは、不明）


# 参考文献、参照URL
http://qiita.com/korkewriya/items/72de38fc506ab37b4f2d
→pdfファイルをtextファイルに変換する部分は、こちらの記事から引用（一部改変）しました。

https://kusanohitoshi.blogspot.jp/2017/01/python3cstringiostringio.html
→StringIOのインポートエラーへの対処はこちらを参考にしました。

「退屈なことはPythonにやらせよう」
→osモジュールの使い方

http://www.unixuser.org/%7Eeuske/python/pdfminer/index.html
→pdfminerのページ

https://github.com/conda-forge/pdfminer-feedstock
https://conda-forge.org/feedstocks
→anaconda環境におけるpdfminerのインストール手順はこちらを参考にしました。
Rubyで標準入力から値を取得するには

#はじめに
paizaでスキルチェックをやろうと思ったのですが、
サンプルで提示された標準入力からの取得方法が上手くいかずどん詰まってしまいました。。。
その際に使用した別の方法を載せておきます。
※本当はもっと効率の良いやり方があると思いますが。。。

###前提
使用する言語はRubyです

##1行に1項目のみ存在する場合の取得方法

```
標準入力

hoge
```
``` get_stdin.rb
fline = readlines
p fline
```
```
出力結果

["hoge"]
```

##1行にスペース区切りの項目がn個存在する場合の取得方法
```
標準入力

hoge fuga foo
```
``` get_stdin.rb
fline = readlines
fline = fline[0].split(" ")
p fline 
```
```
出力結果

["hoge","fuga","foo"]
```

##改行コードを含む項目がn行にわたりが存在する場合の取得方法
```
標準入力

hoge
fuga
foo
```
``` get_stdin.rb
fline = readlines

p fline 
```
```
出力結果

["hoge\n","fuga\n","foo"]
```

これだけでも取得できますが、上記の通り改行文字が入っているので取り除いちゃいます。

``` get_stdin.rb
fline = readlines
len = fline.length
i = 0

while i < len
    fline[i] = fline[i].chomp
    i += 1
end

p fline 
```
```
出力結果

["hoge","fuga","foo"]
```

基本的にはこれで何とかなると思います。

ちなみに出力結果をご覧いただくとわかるとおり、標準入力で受け取ったものは文字列なので、
数値項目として扱いたい場合は to_i してください。

```
標準入力

123
```
``` get_stdin.rb
fline = readlines
fline = fline[0].to_i

p fline 
```
```
出力結果

123
```
【Excel】OFFSETで過去n日間平均を計算

例えば月間数値変動レポートで、
「過去7日間の平均を常に見たい。でもまだ7日分のデータが溜まっていない時は全平均として動いて欲しい」という時に使用する数式。
このような時は[OFFSET関数](http://qiita.com/AQRiL_1132/items/4bbe44717bc08c2ee39f)を使用して平均の計算対象となる範囲が状況に応じて変化するような数式を作る。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/c9437ceb-6304-6332-1579-902b7d2c4c9e.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/76b7ef29-3763-a20f-8e43-12d199c652c0.png)

```:C7セルの数式
=AVERAGE(OFFSET($D7,0,COUNTIF($D7:$O7,">="&0)-1,1,MIN(COUNTIF($D7:$O7,">="&0),$C$3)*-1))
```

```:C7セルの数式の意味
=AVERAGE(OFFSET([1日目のセル],0,[溜まっているデータ数]-1,1,MIN([溜まっているデータ数],[平均算出日数])*-1))
```

指定した平均算出日数分以上データが溜まっていればこれを用いた直近の数日の平均が算出される。
それ未満のデータ量しかない場合は溜まっているデータだけで平均の計算を行う。
[OFFSET関数](http://qiita.com/AQRiL_1132/items/4bbe44717bc08c2ee39f)により最新のデータが入っているセルを**計算対象範囲の始点**とし、そこから**平均算出日数分**（あるいは**データ量分**）**左側に計算対象範囲を拡大**する。

過去n日の日数変更も楽々

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/1f63e038-8f33-5b85-8331-316278c3229c.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/103957/558939a9-a3c2-2c95-e1d2-750c6b33fc0f.png)

個人的に[OFFSET関数](http://qiita.com/AQRiL_1132/items/4bbe44717bc08c2ee39f)を自在に使いこなすことがロジカルにExcel関数を使いこなす第一歩だと考えています。一見面倒に見えますが、分かってしまえばとても単純で柔軟、そして強力な関数なので、是非マスターすることをオススメいたします。
Material-components-iOSでiPhoneにマテリアルデザインを組み込む



使ってみてよかったので共有する
今回使用するファイルはこちら
https://github.com/material-components/material-components-ios


## インストール

Githubの手順通りに進めていく

1. cocoapodsのインストール（インストール済みの場合はスキップ）

```
sudo gem install cocoapods 
```

2. podファイル作成(作成済みの場合はスキップ)

```
pod init
```

3. podファイルに下記を追加

```
pod 'MaterialComponents'
```

4. コンポーネントのインストール

```
pod install
```

5. Xcodeで開くワークスペースを変更


![スクリーンショット 2017-08-08 23.07.50.png](https://qiita-image-store.s3.amazonaws.com/0/139360/c27e72a6-afbd-cdb4-8a88-843338b8ffcd.png "スクリーンショット 2017-08-08 23.07.50.png")


## 使ってみる

### Raised button

storybordにボタンを追加してclassを「MDCButton」にする

![スクリーンショット 2017-08-08 23.11.37.png](https://qiita-image-store.s3.amazonaws.com/0/139360/7b2b9c31-4ed5-d7c7-a935-1411b943df2d.png "スクリーンショット 2017-08-08 23.11.37.png")

すると、マテリアルボタンができる

![MaterialButton.gif](https://qiita-image-store.s3.amazonaws.com/0/139360/e3247bf0-4992-0254-8c8d-2bbd94186fee.gif "MaterialButton.gif")


### Floating action button

これも同じ手順で下記を「MDCFloatingButton」を設定する

![スクリーンショット 2017-08-08 23.15.30.png](https://qiita-image-store.s3.amazonaws.com/0/139360/ac743488-337b-af18-7e8a-961d0846a806.png "スクリーンショット 2017-08-08 23.15.30.png")

すると、Floating Buttonが作成できる	

![FloatingButton.gif](https://qiita-image-store.s3.amazonaws.com/0/139360/c3f330d3-b799-f236-c3eb-183f9c270eec.gif "FloatingButton.gif")


### ボタンの色や、背景色を変更する場合は下記のコードを追加


- 文字色の変更

```swift
materialButton.setTitleColor(UIColor.white, for: .normal)
```


- 背景変更

```swift
materialButton.setBackgroundColor(UIColor.blue, for: .normal)
```

### Material dialog

- podファイルに下記を追加する

```
pod 'MaterialComponents/Dialogs'
```

- インストールする

```
pod install
```

- ダイアログを出したいときに下記のコードを追加する

```swift
let alertController = MDCAlertController(title: "Material Dialog", message: "This is Material Dialog! Let's Start Now!")
let action = MDCAlertAction(title:"OK")
alertController.addAction(action)
        
present(alertController, animated:true)
```

すると、ダイアログが出る

![MaterialDialog2.gif](https://qiita-image-store.s3.amazonaws.com/0/139360/e70c8878-064e-6647-a792-37b4671a17ed.gif "MaterialDialog2.gif")


他にもいろんなcomponentが用意されているのでぜひ使ってみてください
https://material.io/components/ios/
PHPにおけるセッションデータの取り除き方いろいろ

PHPでセッション管理を行う際に使用する$_SESSIONですが、一度セットしたセッションデータを削除する方法について調べたことについてまとめます。

# セッションの削除方法
1. session_destroy()
2. \$_SESSION = array()　
3. unset($_SESSION["セッションの名前"])

それぞれ説明していきます。

#セッション内のデータを全て消す場合
##session_destroy()
セッションデータを一括削除してくれます。
すべてのセッションが空になってしまうので、特定のセッションデータだけを削除したいときにこれは使えない

##$_SESSION = array()
セッションは元より連想配列のため、空の配列を代入することでセッションデータを空に置き換え、結果的にセッションを削除することができる

##unset($_SESSION["セッションの名前"])
セッションデータを格納する際に設定したセッションの名前を指定して、そのセッションデータだけを個別に削除できる

#少し変わったセッションの削除方法
セッションデータを取得するためにはクライアントごとに割り振られたセッションIDを参照して、セッションIDが一致してしているクライアントにサーバー内のセッションデータを返す、というもの。
そのため、クライアントで保持しているセッションIDをリセットしてしまえば、サーバー内のセッションデータを参照できなくなくなり、結果的にセッションデータを削除したように見える。

##setcookie("PHPSESSID",'',time() - 1800,'/')

セッションIDはPHPSESSIDに格納される（php.iniの初期設定に依存している）。
セッションIDの有効期限を過去にすることで、セッションIDが消去される。

ただ、この方法でセッションIDを削除したとしても、ブラウザのリロードなどでセッションIDを参照した後でセッションIDを削除しているようです。
つまり、セッションIDの有効期限を過去にして、セッションIDを削除したとしても、ブラウザの表示上からは削除されていないような挙動を起こす、ということです。
TouchDesigner × Arduinoでインタラクティブな炎をつくる(2/2)

次にArduinoで息の吹きかけをセンシングして、TouchDesignerの炎と連携させます。

#Arduinoで息の吹きかけをセンシング
今回、センサーは**気圧センサーLPS25H**を使用しています。
回路の組み立てとスケッチの作成は、以下を参考にしました。
[http://skomo.o.oo7.jp/f47/hp47_51.htm](http://skomo.o.oo7.jp/f47/hp47_51.htm)


#TouchDesignerとArduinoを連携する
Serial DATを使うと、ArduinoとTouchDesignerをシリアル通信させることができます。
<img width="855" alt="スクリーンショット 2017-08-08 17.37.32.png" src="https://qiita-image-store.s3.amazonaws.com/0/195560/99054854-163b-6b72-c518-4c2548aa547d.png">

<dl>
<dt>▶︎serial1</dt>
<dd>Connectページ > Port：<b>Arduinoで指定したシリアルポートを選択</b></dd>
<dd>Received Dataページ > Maximum Lines：<b>1</b></dd>
</dl>

#インタラクティブに炎を揺らがせる
気圧センサーに息を吹きかけると、気圧の値が変化します。
これを使って、炎を揺らがせるようにノードを組んでいきたいと思います。

まず、息を吹きかけたかをConvert DAT, Select DAT, DAT to CHOP, Math CHOP, Logic CHOPを使って0,1で判定します。

<img width="1171" alt="スクリーンショット 2017-08-08 17.56.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/195560/eacc3958-0105-a908-1e79-c5a501372329.png">


<dl>
<dt>▶︎convert1</dt>
<dd>Split Cells at：<b> =</b> (※半角スペースと=)</dd>
<dt>▶︎select1</dt>
<dd>Selectページ > Select Cols：<b>by Index</b></dd>
<dd>Selectページ > Start Col Index：<b>1</b></dd>
<dd>Selectページ > End Col Index：<b>1</b></dd>
<dt>▶︎datto1</dt>
<dd>DAT toページ > First Row is：<b>Ignored</b></dd>
<dd>DAT toページ > First Column is：<b>Values</b></dd>
<dt>▶︎math1</dt>
<dd>Mult-Addページ > Multiply：<b>100</b></dd>
<dt>▶︎logic1</dt>
<dd>Logicページ > Convert Input：<b>Off When Outside Bounds</b></dd>
<dd>Logicページ > Combine CHOPs：<b>Not Or</b></dd>
<dd>Logicページ > Bounds：<b>適当な閾値(常気圧と息吹きかけ時の気圧の間くらい)</b></dd>
</dl>

math1では、気圧センサーから得られる値の変化が小さすぎるので100倍しています。
logic1では、指定した閾値を超えた値を取得した時**1**を返し、閾値の範囲内では**0**を返します。


続いて、logic1のトリガーに応じてparticle1の動きを変化させます。
<img width="974" alt="スクリーンショット 2017-08-08 22.33.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/195560/3f138637-8932-7e68-2246-a7f521224d3d.png">

<dl>
<dt>▶︎math2</dt>
<dd>Mult-Addページ > Multiply：<b>5</b></dd>
<dd>Mult-Addページ > Post-Add：<b>3</b></dd>
<dt>▶︎math3</dt>
<dd>Mult-Addページ > Multiply：<b>2</b></dd>
<dd></dd>
</dl>

null1, null2を上の写真のようにparticle1のWind,Turbulenceにエクスポートします。

最後に、炎に少し動きを加えます。
<img width="1219" alt="スクリーンショット 2017-08-10 23.06.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/195560/9ae9c978-c8e1-4e02-872c-6fc25b08e6fa.png">

lfo1を追加し、以下のようにパラメータを設定してparticle1のTurb Periodにエクスポートします。

<dl>
<dt>▶︎lfo1</dt>
<dd>LFOページ > Type：<b>Gaussian</b></dd>
<dd>LFOページ > Amplitude：<b>0.4</b></dd>
</dl>



これで、息を吹きかけた時に炎が揺らぐようになりました。
![fire7.gif](https://qiita-image-store.s3.amazonaws.com/0/195560/3c06c976-624e-99a5-cef9-dd35b69aa63e.gif)



#まとめ
最終的なノード構成は以下のようになります。
<img width="1504" alt="スクリーンショット 2017-08-10 23.11.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/195560/46e76884-d78e-0fb0-c2e6-4a4153e4c6d1.png">



まだTouchDesignerの経験が浅いため、理解の間違っている点などありましたらご指摘いただけると幸いです。
TensorFlow | ADDA > 線形方程式の初期値用データの学習 (TFRecords版) > 出力層を１ノードにした場合のlossの経過 | データの標準化が必要?

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 16.04 LTS desktop amd64
TensorFlow v1.1.0
cuDNN v5.1 for Linux
CUDA v8.0
Python 3.5.2
IPython 6.0.0 -- An enhanced Interactive Python.
gcc (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
```

学習コードv0.1 http://qiita.com/7of9/items/5819f36e78cc4290614e

http://qiita.com/7of9/items/feeae410f3931e6d0fd0
の続き。

### 概要

This article is related to [ADDA (light scattering simulator based on the discrete dipole approximation)](https://github.com/adda-team/adda/).

- TFRecordsを読込んで学習する
- input: 5 nodes
- output: 6 nodes
- サンプル数: 223,872
- 学習データ: ADDAにより計算した値
    - #input
    - x,y,z: dipole position
    - refractive index: real and imaginary part
    - #output
    - initial values for linear equation solution for (x,y,z),(real,imaginary)

### 出力層の変更

6つの値を出力層にとってネットワークの学習をしていたが、１つの値だけを出力層にして様子を見ることにした。

6つの値をそれぞれ学習した時のlossの経過は以下。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9de7fb39-2bae-eb31-14b5-434bde1a37bf.png)

EXRだけlossの減少が見られない。

### EXRの値

EXRの値の例。
表示されたものでは、プラスマイナス0.2程度の値になっている。
(左が学習元、右は学習結果)

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/7e424837-c5dd-a563-f58e-c6006d8966c2.png)

### EXR * 4.0の学習

EXR(や他の値）に関して平均と分散を計算して、データの標準化をした方がいいのかもしれない。

とりあえず4.0倍(適当に決めた）したEXRで学習をしてみた。

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/37ca93e2-9075-7faf-8f65-a35085fcb6ea.png)

EXRに関してもlossが減少するようになった。

### TODO

学習に用いるTFRecordsファイルを読み取り、EXR, EXI, EYR, EYI, EZR, EZIそれぞれの平均と分散を計算する。平均と分散を用いてデータを標準化し、それをoutput layerに用いて学習する。
nginx-docker で rtmp ストリーミング配信

# 動機
リアルタイムで動画配信技術を使ってもしかしたらユニバーサルデザインの社会ができるのでは？この技術と違う、自分がこれから学ぶかもしれない技術、もしくは、学んだ技術や誰かとの共同で新たなイノベーションが起きるのかもしれないかなと思って始めてみました。

#### 参考にさせていただいたサイト
- [nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)

# いつも通り Vagrant で仮想環境を構築（準備）
```rb:Vagrantfile
  config.vm.define "server" do |node|
      node.vm.box = "centos7"
      node.vm.network "forwarded_port", guest: 80, host: 8080
      node.vm.network "forwarded_port", guest: 1935, host: 1935
      node.vm.network :private_network, ip: "192.168.33.10", virtualbox__intnet: "intnet"
  end
```

# Docker コンテナー作成
## 参考にさせていただいたサイトを見ながら今後もすぐに使えるように Dockerfile を作成  
**nginx の自動起動はまだできていないです**　　

- [nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)

```yaml:Dockerfile
FROM docker.io/centos
RUN yum update -y
RUN yum groupinstall -y "Development Tools"
RUN yum -y install pcre-devel zlib-devel openssl-devel unzip wget
WORKDIR /usr/local/src/
RUN wget http://nginx.org/download/nginx-1.12.1.tar.gz
RUN tar xvzf nginx-1.12.1.tar.gz
RUN wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
RUN unzip master.zip
WORKDIR nginx-1.12.1
RUN ./configure --with-http_ssl_module --add-module=../nginx-rtmp-module-master
RUN make
RUN make install

COPY conf/rtmp.conf /usr/local/nginx/conf/
COPY conf/index.html /usr/local/nginx/html/
RUN cat /usr/local/nginx/conf/rtmp.conf >> /usr/local/nginx/conf/nginx.conf
```

```
$ sudo docker build -t name --rm=true ./
$ sudo docker run -it -p 80:80 -p 1935:1935 container_id /bin/bash
```

# OBS で配信する
## 参考にさせていただいたサイトを見ながら OBS を設定
- [nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)

# 配信した内容をブラウザでアクセスして確認
## [http://localhost:8080 ](http://localhost:8080/)

# 最後に
本当に、「[nginx-rtmp-moduleでお試しLive配信環境を作る](http://qiita.com/sparkgene/items/c3ac042f30cc5d0fe324)」サイトを参考にさせて頂きました。
動作の状態として、ストリーミング配信を確認する html ファイルを クライアント上に作っても表示されなかったので Docker サーバのドキュメントに配置したら表示できたのでどうしてなのかな？が今も疑問に思っていることです。
tl; dr is 何？

## 意味
1. too long didn't read（長すぎたから読まなかった）の略語・インターネットスラング。
2. 転じて要約の意。Qiita等で見かけるときはこちらがメイン。

## 20191211 追記
わりとギークよりの言葉で正式な文書などでは控えた方がよさそうです。
こちらの記事により詳しい解説があります。

https://qiita.com/kei_0121/items/2e2e070702a82a79de8e

## 参考
http://lifememo.jp/english/tldr/
https://eow.alc.co.jp/search?q=tldr
https://en.wikipedia.org/wiki/TL;DR
JINS MEME ES_Rの計測データにおいてパケロスの確認方法

#### **課題**
JINS MEME ES_R（アカデミックパック）では100Hzでサンプリングされたデータが，100HzのBLE通信によってパソコン本体に記録される．そのためパケットロスの発生がクリティカルな場合は注意が必要なので，記録データからパケロス発生箇所を見つける方法をメモしておく．


####  **解決方法**
1. 記録データ(csv）をエクセルで開く．
2. （必要であれば）時間表記を時：分：秒に直す．  
参考：[時間表記変更方法](http://qiita.com/UJinc/items/ed9b6764dd9d678a9150)
3. １サンプルごとの時間差をとる．
4. 差が0.01（※1,※2）より大きい箇所を見つける．

※1 **100Hzで通信しているので，パケロスがなければ0.01秒ずつインクリメントされる．**
※2 **JINS MEMEデータロガーでは，仕様としてパケロスの影響はNUM（B列）には表れない．つまり，B列は取得データに連番がうたれており，単純に取得データ数となる．**
***
#### 具体的な手順．
1. 記録データ(csv）をエクセルで開く．
![Screen Shot 2017-08-08 at 21.15.45.png](https://qiita-image-store.s3.amazonaws.com/0/108112/39934bd9-80f8-ca6d-0188-438cedab23c3.png)
<br>

2. （必要であれば）時間表記を時：分：秒に直す．
C列目の時間表記がエクセルの初期設定となり，本来の表記![Screen Shot 2017-08-08 at 21.17.30.png](https://qiita-image-store.s3.amazonaws.com/0/108112/1d1fe979-4f80-9cae-0274-d653992f8afc.png)と異なるので，[時間表記変更方法](http://qiita.com/UJinc/items/ed9b6764dd9d678a9150)を参考にして直しておく．
<br>

3. D列，E列に空の列を追加して，D列にはC列をそのままコピペ，E列ではサンプル間の差を計算する．
![Screen Shot 2017-08-08 at 21.25.16.png](https://qiita-image-store.s3.amazonaws.com/0/108112/7020e3e4-155d-b0bf-bc8b-3a39c626f360.png)
<br>

4. フィルタ機能を使って，E列で計算した差が0.01より大きい箇所を見つけます．
![Screen Shot 2017-08-08 at 21.28.41.png](https://qiita-image-store.s3.amazonaws.com/0/108112/3c1bafee-6676-36bf-ef50-ad4695edc2d8.png)

差が0.01より大きい行のみ表示させます．今回の例では1340行目ではサンプル間の差が２となっているので，1339行目で得られたデータの後に**１サンプル分のパケロスが生じている**ことがわかります．
![Screen Shot 2017-08-08 at 21.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/108112/d25f9b1b-6167-4dba-1ed3-be1e2d66180e.png)
Gitのマージ済リモートブランチを削除するPowerShell

[gitでマージ済みの(リモート|ローカル)ブランチを全て削除.md · GitHub](https://gist.github.com/miukoba/fc3c10a25c1c675c1e97)

に掲載されているリモートブランチの方のコードをPowerShellに移植した感じです。

```
<# 
.SYNOPSIS 
  マージ済のブランチを削除します。 
.DESCRIPTION 
  - git branch コマンドでリモートのマージ済ブランチの一覧を取得します 
  - master, release/x.x は除外します 
  - git push --delete コマンドでリモートブランチを削除します 
.PARAMETER test 
  テスト実行モード(ブランチ名の表示のみ) 
.INPUTS 
  なし 
.OUTPUTS 
  なし 
.NOTES 
  本スクリプトはローカルリポジトリの直下で実行してください 
.EXAMPLE 
  .\delete_merged_branch.ps1 test 
  削除対象ブランチの表示 
.EXAMPLE 
  .\delete_merged_branch.ps1 
  ブランチ削除 
#> 
Param([string]${test}='') 

git fetch origin 
git branch -r --merged master | ? { 
  $_ -NotMatch 'master|release' 
} | % { 
  ${branch} = $_ -Replace '^\s*origin/', '' 
  if (${test} -ne '') { 
    echo ${branch} 
  } else { 
    git push --delete origin ${branch} 
  } 
}
```

- master や release などの削除したくないブランチ名は環境に応じて適宜設定してください。
AccessVBAの文字コードにハマった話

VBAで文字列のバイト数により処理を分岐させるプログラムを実装したとき、
**半角英数と全角文字列を区別してくれない。。だと。。！？**
て感じでハマったのでメモ。access2016を使用。
##VBAでの文字列はUnicodeになる
VBAでは文字列がUnicode形式になるので、すべての文字が2バイトになる。
例えば文字列のバイト数を返すLenB関数を使ったとき、
下記の例では両方とも結果が2になる。

```vbnet
lenB("a")'2が返る
lenB("あ")'2が返る
```

##半角英数は1バイトで処理したいとき
半角英数は1バイトで処理したいとき、StrConv 関数を使って、
下記みたいな感じでUnicode からANSI に変換させる必要がある。

```vbnet
lenB(strconv("a",vbFromUnicode))'1が返る
lenB(strconv("あ",vbFromUnicode))'2が返る
```

```vbnet
Dim str As String
str = StrConv(str,vbFromUnicode)'ANSI に変換
'処理を記述
str = StrConv(str,vbUnicode)'Unicode に戻す
```


以上、AccessVBAでバイト数に依存したコードを
書くときは、注意が必要ってはなしでした。
機械学習のド素人が、2週間でTensorflowのLTするためにやったことのメモ

## 発表資料
[Tensorflowで"お姉さん"なのか"おばさん"なのかはっきりさせる](https://speakerdeck.com/munaita_/tensorflowde-ozi-san-nafalseka-obasan-nafalsekahatukirisaseru)

## やったこと

### 1. TensorflowをMacにインストールした(with virtualenv)
- 資料: [Installing TensorFlow on Mac OS X](https://www.tensorflow.org/install/install_mac#installing_with_virtualenv)

### 2. Hello worldでinstallの確認した
- 資料: [Run a short TensorFlow program](https://www.tensorflow.org/install/install_mac#run_a_short_tensorflow_program)

### 3. Getting Started触りながら感覚つかんだ
- 資料: [Getting Started With TensorFlow](https://www.tensorflow.org/get_started/get_started)
- テンソル、ノード、セッション、損失関数を軽く調べたりした
- cross-entropyとかはわからなかったので理解を諦めた
- モデル作って損失関数減らすようにがんばるんだなってかなり雑に理解した

### 4. Mnistの初級者用を動かして色々いじってみた
- 資料: [MNIST For ML Beginners](https://www.tensorflow.org/get_started/mnist/beginners)
- 画像をベクトルに変換して、変数を少しずつかえて評価しながら学習していくイメージ掴んだ

### 5. Mnistの上級者用を動かして色々いじってみた 
- 資料: [Deep MNIST for Experts](https://www.tensorflow.org/get_started/mnist/pros)
- 正直ここはよくわからなかったので理解することをあきらめて、とりあえず作ってみることにした

### 6. 独自画像使って学習させている記事を検索し、眺め、発表テーマ決めた
  - [TensorFlowでアニメゆるゆりの制作会社を識別する] (http://kivantium.hateblo.jp/entry/2015/11/18/233834)
  - [ディープラーニングで顔写真から巨乳かどうかを判別してみる (うまくいったか微妙)]( http://qiita.com/summer4an/items/db0124eee8103c1d3b85)
  - [ある美女が，どの大学にいそうかを CNN で判別する] (http://qiita.com/pika_shi/items/3c8ab1a8ecc655b33851)
  - [TensorFlowでキルミーアイコン686枚によるキルミー的アニメ絵分類]( http://qiita.com/domkade/items/fc9903c2119fdfa9a234)
  - これらの記事を参考に人の顔の世代別の分類してみようと思った
    - 男の画像を毎晩眺めるのはいやになりそうなので女性に絞った
 
### 7. 必要な画像を集めた
  - [[bing_image_getter.py]](https://github.com/shogo807/tensorflow_easy_tools/blob/master/bing_image_getter.py) : bingから検索ワード指定で画像をDLするスクリプトを作った
  
    - スクリプト内の `API_KEY`, `OUT_PUT_PATH`, `SEARCH_ITEM` を好きなものに書き換えて`python bing_image_getter.py` で実行
    - 無料枠豊富だったので[bing image search API](https://azure.microsoft.com/ja-jp/services/cognitive-services/bing-image-search-api/) を使った
    - API_KEYの発行は[このあたり](http://techblog.adish.co.jp/entry/2016/12/03/Bing_Search_API_v2_%E3%81%8B%E3%82%89_v5_%E3%81%B8%E7%A7%BB%E8%A1%8C%E3%81%97%E3%81%9F%E8%A9%B1)

### 8. 画像を加工した
  - [[face_detector.py]](https://github.com/shogo807/tensorflow_easy_tools/blob/master/face_detector.py): DLした画像を、OpenCVで顔だけ切り取るスクリプトを作った 
    - `READ_PATH`と`OUTPUT_PATH`を指定して、`python face_detector.py`で実行
    - `OUTPUT_PATH`以下にtrainとtestのディレクトリができて8:2の割合で切り抜かれた顔写真が入る
    
### 9. 学習させた
  - [[cnn_sample.py]]
 (https://github.com/shogo807/tensorflow_easy_tools/blob/master/cnn_sample.py): 28*28で、CNNで学習させるたスクリプトを作った
javascriptのミックスインについてまとめて見た



##JavaScriptの多重継承、インターフェース？

何かしらのオブジェクト指向言語を触ったことがある方はご存知かもしれませんが、オブジェクト指向言語には「多重継承」と呼ばれる**複数のスーパークラスを継承したサブクラスを作る**機能を備えた言語が存在します。

では、クラスベースではないオブジェクトベースのオブジェクト指向言語であるJavaScriptはどうなっているでしょうか？

結論から言うとJavaScriptは単一継承しか出来ません。
しかし、多重継承やインターフェースのような役割に近い、**ミックスイン**と呼ばれる機能が存在しています。

では、例を元に見ていきましょう

##ミックスイン

```js
class Human {
  constructor() {
  }
}

class Team {
}

function belong(m) {
  m.addMember = (p) => { this.member = p; }
  m.getMemberData = () => { return this.member; }
  m.isMember = () => { return !!this.member; }
}

belong(Human);

const member = new Human();
member.addMember(new Team()); //==> error

```

ここではクラスHumanとTeam,関数belongが定義してあります。
しかし、このコードは`member.addMember`の部分でエラーを引き起こしてしまいます。
`belong(Human)`の部分で私たち人間の感覚であれば、人間が所属するんだなと解るかもしれませんがJavaScriptはそう識別してくれないのです。

では、belongの部分を変えていきましょう

```js
const member = new Human();
belong(member);
member.addMember(new Team());
console.log(member.isMember()); //==> true
```

このように個々のオブジェクト（member）に対して適用してあげればうまく動作するようになります。

しかし、このままでは毎回belongを呼び出さなければなりません。
これを解決してくれるテクニックが一つあります。

```js
belong(Human.prototype);

const member = new Human();
member.addMember(new Team());
console.log(member.isMember()); // ==> true
```

こうすることによってbelongをクラスHumanの一部にすることが出来ます。
これがミックスインです。
これでうまく二つのクラスを保守できるようになるでしょう。


##まとめ

* JavaScriptは多重継承が出来ない。
* JavaScriptにはミックスインと言う機能がある。
* ミックスインの方法の例
macOS Sierraでconfigure: error: Cannot find libzの対処法

# 注： Mojaveの場合は下記記事をご覧ください。

https://polidog.jp/2018/11/28/mojave_phpenv/

# ここからは Sierra の場合

phpenvでphp7.2をインストールしようとしたらエラーが出ました。

```
 phpenv install 7.2.0beta2
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 7.2.0beta2 into /Users/DQNEO/.phpenv/versions/7.2.0beta2
[Skipping]: Already downloaded and extracted https://downloads.php.net/~pollita/php-7.2.0beta2.tar.bz2
[Preparing]: /var/folders/zf/c8_mrv213wvf5nydz0mffls80000gn/T//php-build/source/7.2.0beta2

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: ).
configure: error: Cannot find libz
-----------------------------------------

The full Log is available at '/tmp/php-build.7.2.0beta2.20170808200356.log'.
[Warn]: Aborting build.
```


## 対処法

```
$ xcode-select --install
```
WindowsアプリケーションからGmail送信する

よくある話題ですが、たまたまちょっと、ちょっとしたメール送信処理が必要で、いつものように適当なWindowsフォームアプリケーションで作ってみたというものです。

<font color=red>**【まとめ】**
・アプリなどからGmailの送信をするには、アプリパスワードが必要
・アプリパスワードの利用には2段階認証を有効にする必要がある
　それぞれ設定はこちらから→[ログインとセキュリティ](https://myaccount.google.com/security)
・サンプルのソースコードは以下を参照</font>

#サンプルコード

```c#
using System.Net.Mail;
 :

private string mailID;
private string mailPassword;
private string mailFrom;
private string mailTo
private string mailSubject;
private string mailBodyt
 :

private void SendMail()
{
    try
    {
        SmtpClient smtp = new SmtpClient();
        smtp.Host = "smtp.gmail.com";
        smtp.Port = 587;

        smtp.Credentials = new System.Net.NetworkCredential(mailID, mailPassword);
        smtp.EnableSsl = true;
        MailMessage msg = new MailMessage(mailFrom, mailTo, mailSubject, mailBody);
        smtp.Send(msg);

        MessageBox.Show($"{mailTo} にメール送信しました。");
    }
    catch (Exception e)
    {
        MessageBox.Show(e.Message);
    }
}
```

#参考まで、事の経緯
**何かサンプルコードを探す**
たまたま見つかった次の記事を参考にしました。
[c#でgmailを利用してメールを送るだけのプログラム - 39Si](http://inner2.hatenablog.com/entry/2014/12/02/232518)

しかし、これでは次のエラーとなります。
>SMTP サーバーにセキュリティで保護された接続が必要であるか、またはクライアントが認証されていません。 サーバーの応答:5.5.1 Authentication Required. Learn more at

**アプリパスワードが必要とわかる**
ちょっと調べてみると、現在はアプリパスワードなるものが必要とのこと。
次の記事を参考：[C# - GMail送信について(70064)｜teratail](https://teratail.com/questions/70064)

では、アプリパスワードについて調べてみると次のヘルプが。
[アプリ パスワードでログイン - Google アカウント ヘルプ](https://support.google.com/accounts/answer/185833?hl=ja)

しかし今度は、次のメッセージが
>お探しの設定はお使いのアカウントでは利用できません。

**アプリパスワードの発行は2段階認証が必要とわかる**
どうやら、2段階認証を有効にしていないと発行できないようですね。
なので、2段階認証を設定して、アプリパスワードを設定すれば、無事メール送信できるようになります。

2段階認証やアプリパスワードの設定は次のページから。
[ログインとセキュリティ](https://myaccount.google.com/security)

後は画面の指示通りに進めば簡単な内容でした。


以上
Android x Google Play Servicesで取得するconfidenceが理解しにくかったので私なりにまとめてみた。

#きっかけ
仕事でGoogle Play Servicesの ActivityRecognitionApiを使うことになった。
Google Play Servicesの ActivityRecognitionApiはユーザーの行動を取得する API で、徒歩で移動中か、自転車で移動中かなど「ユーザーが何をしているか」ということが把握できるので使用してみました。が！DetectedActivityで取得するconfidenceがなんとも理解しにくい！
activityTypeを使っている例がいっぱいあるけど、confidenceを使っている例がないので、ちょっと覚書のためにメモ。

#やってみたこと
activityTypeはわかるんです。
「IN_VEHICLE」や「on_foot」など車なのか？歩いてるのか？走っているのか？って値がactivityTypeなのでif文で使うと

```
if(activityType === 0 )
```
てな感じになる。
しかし、confidenceの説明が公式サイトにはこう書いてあります。

```
value from 0 to 100 indicating how likely it is that the user is performing this activity.
ユーザーがアクティビティを実行している可能性があることを0〜100の値で示す。(Google先生翻訳)
```
とのこと....可能性？ if文でどうやって使うの？と思ったので色々なケースでif文を書いてみた。

#検証した結果

```
confidenceの値が100の場合
if(activityType === 0 && confidence > 100)
(間違いなく車やな！)
```

```
confidenceの値が100の場合
if(activityType === 0 && confidence > 75)
(多分、車とちゃうかなぁ〜)
```

```
confidenceの値が100の場合
if(activityType === 0 && confidence > 50)
(あれ？車とちゃうかなぁ〜でも、ビミョー)
```

こんな感じで使えるのだと思う。一応、ちゃんと動いている....
ん〜でも、これだとactivityTypeが0で全て通ってしまわないのだろうか？

#まとめ
まとめるほどではないが、公式文章を読むと書いてあることはわかるんだけど、何に使うかわからない時は使ってみて覚えるのが一番だなぁ〜と思った。
でも、くだらない内容なので、あまり誰も役にも立たないと思うw

#参考にしたサイト
[公式ページDetectedActivity](https://developers.google.com/android/reference/com/google/android/gms/location/DetectedActivity)