OmniAICreator/Qiita-1.07M huggingface dataset:
ストアドプロシージャで複数テーブルのデータを全削除

テーブル数が増えてくると、データを一気に消したいときが結構手間です。
ストアドプロシージャをつかうと、バッチ処理なSQLが発行できて捗ります。

<a href="http://qiita.com/kantomi/items/5c432ce13fd1aff263eb" target="_blank">O/Rマッパーではなくストアドプロシージャで！ - Qiita</a>

を参考にしました。ありがとうございます。

追記：コメントにて削除時のパフォーマンスが`TRUNCATE TABLE`（テーブルの削除、再構築）のほうが良いと教えていただきましたので追記しました。ありがとうございます。

## データを全削除（TRUNCATE TABLE版）


```sql

DROP PROCEDURE IF EXISTS TABLES_RESET;

DELIMITER $$
/* TABLES_RESET
 * テーブルのデータをすべて削除する
 */
CREATE PROCEDURE TABLES_RESET
    ()
BEGIN
    SET FOREIGN_KEY_CHECKS = 0;
    TRUNCATE TABLE Address;
    TRUNCATE TABLE Phone;
    TRUNCATE TABLE Email;
    TRUNCATE TABLE Note;
    TRUNCATE TABLE Contact;
    TRUNCATE TABLE User;
    SET FOREIGN_KEY_CHECKS = 1;
    SELECT 0 AS errid, 1 AS row_count, '正常に削除されました。' AS msg;
End
$$
DELIMITER ;
```


`User(code)`,`Contact(id)`等の外部キー制約があるテーブルに対して`TRUNCATE TABLE`は失敗を返すため、`SET FOREIGN_KEY_CHECKS`によって外部キー制約のチェックを無効化したうえで削除を実行しています。（無効化するのは真っ当な方法なのだろうか？）

<a href="https://dev.mysql.com/doc/refman/5.6/ja/truncate-table.html" target="_blank">MySQL :: MySQL 5.6 リファレンスマニュアル :: 13.1.33 TRUNCATE TABLE 構文</a>

## データを全削除（DELETE FROM版）

```sql

DROP PROCEDURE IF EXISTS TABLES_RESET;

DELIMITER $$

CREATE PROCEDURE TABLES_RESET()
BEGIN
    DELETE FROM Address;
    DELETE FROM Phone;
    DELETE FROM Email;
    DELETE FROM Note;
    DELETE FROM Contact;
    DELETE FROM User;
    SELECT 0 AS errid, 1 AS row_count, '正常に削除されました。' AS msg;
End
$$
DELIMITER ;
```

## 削除の実行

```sql:確認なしで全削除されるので気をつけて！
CALL TABLES_RESET();
```

## テーブルデータの削除順について

今回の例のリレーションシップはこんな感じになっています。
（DB初級者のためリレーションの貼り方とか、名前とか間違っている可能性があります。コメント、ご指摘等、歓迎です！）

![image](https://qiita-image-store.s3.amazonaws.com/0/2883/908bbd5c-04b7-7946-b93f-7ce7c176ac55.png)

`Contact`は、`User(code)`にリレーションが貼られているので、いきなり`User`テーブルは削除できません。
それと同様に、`Address`も、`Contact(id)`にリレーションが貼られています。

ストアドプロシージャでのデータの削除順も子→親となるように削除しています。

## ER図作成ツール

ER図の作成は<a href="http://a5m2.mmatsubara.com/" target="_blank">A5:SQL Mk-2 - フリーの汎用SQL開発ツール/ER図ツール</a>でおこないました。すばらしいです。
イラストで学ぶ機械学習を読んで決定株分類のAdaBoostをpythonで実装

#やりたいこと
決定株分類器をブースティングアルゴリズムの一つであるAdaBoostを用いて実装する

ちなみに前回はバギングを用いて実装した
前回：http://qiita.com/241824182418/items/6c19024f6e26fa9f9344
###バギングによる学習結果
- 2000の弱学習器を組み合わせている
- 2000では全てを識別しきれなかった

<img width="300" alt="baging" src="https://qiita-image-store.s3.amazonaws.com/0/141196/388fe552-a6ec-17a7-539e-46bf7f1a16bc.png">


#環境
 - OS X El Capitan
 - Python 3.4.3-0
 - Anaconda - spyder:Version 2.3.5.2 


#参考
イラストで学ぶ機械学習　小二乗法による識別モデル学習を中心に (KS情報科学専門書)
アンサンブル学習の章にあるAdaBoost
https://www.amazon.co.jp/dp/4061538217

#分類するデータ
結果を比較したいので前回バギングと同じデータを使用する
<img width="300" alt="scatterData" src="https://qiita-image-store.s3.amazonaws.com/0/141196/4bc7528e-613b-7a8d-25cb-c279ffbbfd52.png">

#使用する学習法
##Adaboost
-イメージ-

- 弱学習器を順々に学習していくという方法（バギングは各々別々に学習していた）
- 一個前の弱学習器でうまく分類できなかったデータに対して重みを持たせたデータで次の弱学習器を学習させるということを繰り返していく
- 重みも付加した状態での誤分類率の低い学習器に対して大きな重みを持たせ、最終的なアウトプットは全ての学習器の重み付き和で表す
- 詳しいアルゴリズム等は本を読んでください

#動かす
お手製のAdaBoostプログラムを動かしてみる（codeは最下にリンク貼ります）

- バギングの時と同じように2000回学習させる

```py3:AdaBoost.py
>>>t = Adaboost(LearnData,teachData)
>>>t.learn(2000)#2000回学習
>>>t.plot(350)#出力領域の目の細かさを350等分にしてplot
```
すると・・・。
<img width="400" alt="scatterData" src="https://qiita-image-store.s3.amazonaws.com/0/141196/52c8b505-e412-c8e5-14de-d48c11dee9e2.png">

学習されました！！
バギングの時よりしっかりと分けられているように見えますがどうでしょう？
比較するために前回の識別境界を重ねてみます
<img width="400" alt="scatterData" src="https://qiita-image-store.s3.amazonaws.com/0/141196/7ca9f673-676f-0475-f777-4df395ccacd2.png">

青に近かった奴もきちんと識別できるようになりました
ただ、バギングは過学習しにくいのが良さでもあるので一概にAdaBoostがいいわけでもない模様

今回はこれでおしまい
#感想等（メモ）
- データをもっと複雑してみようかな
- 汎化性能とかも測ってみると面白いかも
- プログラム自体ももっと汎用できる形にすればよかったと後から思った
- 学習時間とかを見てみるのもあり

#コード
- https://github.com/kwacgit/decision_kabu/blob/master/AdaBoost.py
C > define多重定義のチェック > 3つまで > #if (defined(USE_CASE0)+defined(USE_CASE1)+defined(USE_CASE2)) != 1 #error "Wrong number of selected cases" #endif

```txt:動作環境
C++ Builder XE4
```

Cの実装においてテストデータを試験的に切り替えたい。
`#define`は多用したくないが、とりあえず3つの定義をした。

```cpp
// 以下のいずれかを有効にしてください。
#define USE_CASE0
//#define USE_CASE1
//#define USE_CASE2
```

上記の場合、2つ以上の定義をされたくない。
({0,1}, {0,2}, {0,1,2}, {1,2})をはねる。

以下とした。

```cpp
#if !( defined(USE_CASE0) || defined(USE_CASE1) || defined(USE_CASE2) )
#error "Line17: No case is selected"
#endif

#if ( defined(USE_CASE0) && ( defined(USE_CASE1) || defined(USE_CASE2) ) )
#error "Line21: Too many cases selected"
#endif

#if ( defined(USE_CASE1) && defined(USE_CASE2) )
#error "Line25: Too many cases selected"
#endif
```

もっと綺麗な書き方があるかもしれない。

http://ideone.com/N8wQrj

### 改良版

@SaitoAtsushi さんによる[コメント](http://qiita.com/7of9/items/8f9fab70fe556b5b6e5c#comment-8d87b710f374d58f1537)
に改良コードがあります。

情報感謝です。
Bash on WindowsからローカルのMySQLサーバに接続できないと思ったら

# 現象
Windows版MySQL_serverがすでにインストールされている環境で, bashからローカルのMySQLサーバに接続できない

# 対応

```
mysql -u root -p
```

ではなく

```
mysql -u root -p -h 127.0.0.1
```

とホストを明示的に指定してアクセスする

# 問題の原因
ホストとしてlocalhostを指定した場合（あるいはホストの指定を省略した場合）, mysqlのクライアントは  
mysql.sockを使ってサーバとの通信を行おうとするが. windows環境では当然そんなソケットファイルは存在しないので  
接続エラーになるようです.


# 参考
UNIXドメインソケット : https://ja.wikipedia.org/wiki/UNIX%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%82%BD%E3%82%B1%E3%83%83%E3%83%88
RoBoHoN開発導入時のトラブルシューティング

- 新規プロジェクトの作成が出来ない、ビルドが出来ない場合
公式マニュアルにあるテンプレートの導入（pluginsフォルダコピー）をした場合
新規プロジェクトのビルドが出来なくなる場合があります  
Android Studioのバージョンがマニュアルと相違している場合に
コピーしたファイル中のrecipe.xml.ftlとbuild.gradle.ftlが互換性が無いことが原因です
正しい記載に直すかAndroidStudioをマニュアルのバージョンに合わせるのが楽です
マニュアル（10/5時点）で2.1.2となっています（0801_SR01MW_Instructions_for_Installing_RoBoHoN_SDK_Libraries_V01_00_01.pdf）

- 発音しない場合 
サンプルアプリ、RoBoHoNテンプレートから作成したままのアプリが発音しない場合
以下の作業を行うと解決するかもしれません
 - Instant Runの無効化  
公式マニュアルにも記載されています  
[Settings]→[Builds, Exception, Deployment]→[Instant Run]
Enable Instant Run to hot swap code/resource changes on deploy(default enabled)
のチェックを外します
![image](https://qiita-image-store.s3.amazonaws.com/0/97222/d1b0478d-2a99-02af-96f4-bf51f793e676.png)  
  
 - onVoiceUIRejection(発話棄却通知)が発生していないか確認  
発話が破棄された場合にVoiceUIListenerにあるonVoiceUIRejectionが呼ばれます  
テンプレートを使った新規プロジェクトであればはじめからでオーバーライドされておりLogが出力されているので確認が可能です  
発生する理由はAPIリファレンス曰く
発話中のシナリオより優先度が低いなどで発話できなかった等...
ということらしいですが詳細は不明ですが、
導入したアプリを全てアンインストール、デバッグ中のアプリも一度アンインストール
することで解消することがあります
macOS で GitHub にGPG署名付きでコミットできるようにする

macOS に向けて書いてますがLinux でもやることは殆ど変わりません。

## 必要なライブラリをインストール
```zsh
brew install gnupg gpg-agent pinentry-mac
```

### PATH を追加
```zsh:~/.zshenv
typeset -U path PATH
path=(
	/usr/local/opt/gnupg/libexec/gpgbin(N-/)
	$path
)
```

## GPG 署名を作成する
```zsh
$ gpg --gen-key
```

## gitに署名を設定する
```zsh
$ gpg --list-secret-keys --keyid-format LONG
/Users/ress/.gnupg/secring.gpg
------------------------------
sec   4096R/XXXXXXXXXXXXXXXX 2016-10-11
uid                          Aoi Tachibana (ress997) <39e@users.noreply.github.com>
ssb   4096R/YYYYYYYYYYYYYYYY 2016-10-11
```

上の中の `XXXXXXXXXXXXXXXX` という部分が署名のIDです。これを以下のコマンドで gitconfig に追加します。

```zsh
$ git config --global user.signingkey XXXXXXXXXXXXXXXX
```

次に、`gpg` コマンドのパスを以下のコマンドで設定します。

```zsh
$ git config --global gpg.program $(which gpg)
```

最後に、以下のコマンドで自動的に署名付きでコミットするように設定します。

```zsh
$ git config --global commit.gpgsign true
```

## GitHub に署名の公開鍵を登録
以下のコマンドで公開鍵を取得してください。 

```zsh
$ gpg --armor --export $(git config --get user.signingkey) | pbcopy
```

取得した公開鍵をコピーして下記のURLにアクセスし登録します。

- <https://github.com/settings/keys>

## 参考
- [GitHubでGPGによりデジタル署名されたコミットにバッジが表示されるようになったので設定してみる](http://qiita.com/prince_0203/items/ef0e12f2f6d150ff0485)
- [macOS Sierraで、GitHubにGPG署名付きでコミットできるように設定する。](http://qiita.com/miya0001/items/0b50fd2c482d61479f54)
Heroku の deploy hook をつけるときのあれ


Slack にHerokuのDeploy Hookをつける方法はいくらかありますが、

Slack のIntegration に余裕があるのであれば、 Slack App を使用する方法が一番シンプルで楽です。

## 1 Slack Appの追加

チャットメッセージで以下をタイプして、Heroku Appを開く

````
/apps heroku 
````

## 2 Configuration を追加

Configuration を追加。チャンネルを選択するとURLが発行される。

````
$ heroku addons:create deployhooks:http --url https://hooks.slack.com/services/xxxxxxx/xxxxxxx/xxxxxxxxxxxxxxxxxxx
````

このURLを用いると、指定したchannelに対するdeployhookを任意のアプリに追加出来るようになる。

## 3 Heroku App との連携

本格的に運用するHeroku AppではPipeline等で複数のAPPが生えているケースも多いのですが、

これらにまとめてdeployhookを適用する場合には `-a {appname}` を追加し、各種 Heroku App にaddonsを追加していきます。

````
$ heroku addons:create deployhooks:http --url https://hooks.slack.com/services/xxx... -a hoge_app
$ heroku addons:create deployhooks:http --url https://hooks.slack.com/services/xxx... -a hoge_app_dev
$ heroku addons:create deployhooks:http --url https://hooks.slack.com/services/xxx... -a hoge_app_release
````

## 4 補足 現在のHeroku Addon 一覧を見る

以下のコマンドでアドオンの一覧が確認可能

````
# アクセス可能な全アプリの確認
$ heroku addons 
# 特定のアプリの状況を確認
$ heroku addons -a hoge_app
````
多想一下

最近一年半載遇到一些不是很好的 UX
大多數都是沒有考慮到使用情境和流程是不是合理

目前自己的想法是，想要起步做好 UX 其實應該沒有那麼困難

可以跳脫工程和專案管理思維，先從「多想一下」開始

像是：
- 假如自己是使用這個 app 的人，會不會對這種流程反感
- 假如自己是使用這個 app 的人，某個畫面放置的方式會不會不好操作
- 像這個情境，其他人是怎麼做的？可不可以擷取或是改善

... 等等

我自己是認為只要稍微多想一下，多換位思考一下，
產品就有機會往更好的方向前進

當日常生活中越常反覆的這樣思考、反覆檢視
久了以來對 UX 的直覺也會越來越迅速和靈敏

這時候要往更深處的 UX 理論和驗證方法來走也就比較有體驗
畢竟當思考久了之後，一定會去想有沒有什麼科學的方法可以驗證自己想法
AWS ElasticSearch Service2.3(ESS2)の古いログを定期的に削除

[前回のESS2とcuratorの問題](http://qiita.com/mint/items/89ff3c187f93d2e5d029)があったのでcuratorとTTLは使用しません。
(curatorバージョンが上がってESS2に対応できるようになったら移行するつもりです（笑）ちなみ、予想通りESS2はcurator3も使用できなかったです。)

#古いログを削除する方法
restAPIというやらを使いcurlコマンドで古いインデックスを削除します。
これにシェルスクリプトを書いてcrondで一日ごとに実行します。


```
#cd ~
#touch ESS-delete.sh
#chmod u+x ESS-delete.sh
#vi ESS-delete.sh
```

以下10日前の古いログは削除するスクリプト

```bash:ESS-delete.sh
#!/bin/bash

domain=[ESSのエンドポイント]
logstash=[logstash_prefixを入力]
date=`date -d '10 days ago' +"%Y.%m.%d"`

curl -XDELETE https://$domain/$logstash-$date >/dev/null 2>&1
```

crontabの設定
`#crontab -e`

以下は毎日朝11時に実行されます。
`00 11 * * * /root/ESS-delete.sh`

以上です。後は好みに日にちやcrontabの時間を変更したりなんなり…
AutoLayoutでアイテムをViewの中心に設定する

#control + ドラッグ　でアイテムを親Viewへドラック

(雑に書いてすみません）
<img width="695" alt="スクリーンショット 2016-10-11 12.30.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/8a9ee15c-355a-a06f-0a78-c1523fb8f36e.png">


`Center Horizontal Center in Container `を選択

`Center Horizontal Center in Container `はコンテナ内でアイテムを横方向へ中央揃えさせます

<img width="1011" alt="スクリーンショット 2016-10-11 12.31.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/477428e2-bdcf-b2ff-8df6-9bf1b8f8ddee.png">

#すると赤くなります（なぜだかは知りません）



<img width="758" alt="スクリーンショット 2016-10-11 12.33.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/67d7d078-a5bd-1e9a-578e-2ea11ba9fbec.png">


右下でAdd MIssing Constraints をしましょう

Add MIssing Constraintsは、十分に制約が与えられていないビューに対して
足りない制約を自動的に付与して赤を取り除いてくれる魔法の機能です


<img width="1006" alt="スクリーンショット 2016-10-11 12.35.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/aa46d83d-bd6c-772f-3f5d-6b4c2b35d446.png">

#んで、アップデートフレーム

<img width="1008" alt="スクリーンショット 2016-10-11 12.42.31.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/65c9bb1a-5b5f-4aa6-afc2-5ee8e851379c.png">


次、一番最初にやったように、control + ドラッグ　でアイテムを親Viewへドラックします

center vertically in containerを選びましょう
（画像の位置が変わってすみません。はじめっから真ん中にあったので、下の方にわざと制約をずらしました）

center vertically in containerはコンテナ何で縦方向へ中央揃えを実現させます


<img width="766" alt="スクリーンショット 2016-10-11 12.44.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/59d96f5b-63ca-9848-b375-a9dab3c13597.png">

んで、また赤くなるので（なんでかは知らない）右下でAdd MIssing Constraints をしましょう

Add MIssing Constraintsは、十分に制約が与えられていないビューに対して
足りない制約を自動的に付与して赤を取り除いてくれる魔法の機能です

<img width="765" alt="スクリーンショット 2016-10-11 12.48.08.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/abdca348-85f1-29d0-a7a4-68001c7604de.png">

はい、うまくいきましたね

<img width="750" alt="スクリーンショット 2016-10-11 12.51.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/97b03409-3372-c3a2-5173-de2289d261a6.png">

#ちなみに、これでうまくAdd MIssing Constraintsがでない場合は裏技あります

一度Clean Constraintsで今設定されている制約を消して、すべての制約が消えた状態（でも横中央に揃えられた形は維持されたまま）でcenter vertically in containerをやってください。そして、アイテムが縦中央に揃えられたところで

#Reset to Suggested Constraintsする

もう一度Clean Constraintsですべての制約を消し去った後に、Reset to Suggested Constraintsをすればば完璧です
Reset to Suggested Constraintsは、キャンバス上の位置情報に基づいて制約を与える機能です

すみません、もっと上手なやり方、まだ今の自分じゃ知りません
リモート会議用のツールを調べてみた１（ほぼ未検証）


##事前インストールとかしなくても簡単に使える会議室ツールを調べてみた。

## appear.in
オンライン会議室 事前アカウントなしでURL共有で使える。
Edgeは使えんらしい。OperaがOKなのは個人的にうれしい。
https://appear.in/

## twiddla
オンラインホワイトボード こっちも事前アカウントなしでURL共有で使える。
スマホからだと見えるけど編集はできんかった。なんかやり方あるのかね？
http://www.twiddla.com/

##SlideShare　(閲覧ならアカウント不要)
PowerPointやPDF、Keynote、LibreOfficeあたりをアップロードして共有できる。
プレゼン資料とかならここに上げておけば会議の前から共有できる。
http://www.slideshare.net/

##Qiita議事録テンプレート(閲覧ならアカウント不要)
そんな使い方もあったのか・・・知らんかった。
要調査。ただ、共有は難しいかな?

##SIGN(アカウント必須)
議事録共有ツール。設定なんかも必要そうなのでお手軽ではないかな？
もちっと簡単に使えるツールが欲しい。
https://svgn.biz/

<br>
とりあえずこんなところかな～？
また使ってみたら次を書くか。
circle ci のCLIツールを試す

毎回Webで確認するの面倒だなぁと思っていたら、こういうのがあった。

https://github.com/circle-cli/circle-cli

## 導入

````
$ gem install circle-cli
$ circle token <your token>
````

tokenは左メニューのAccountSettingより API Tokens を選択して取得できる。

https://circleci.com/account/api

## 使い方

現在のブランチのビルドを起動する。

````
$ circle build
````

まだAdd Project とかしていないプロジェクトだと何も置きずに止まるだけっぽい。

Add Project しているプロジェクトだとgithubから最新のBranch Tipを取ってくる。

Github 連携かけている場合ほとんど必要ない？

````
$ circle status
````

ビルドの進行状況を確認できる。

但し表示されるのは、タイトルのみの省略フォーマット

````
udpate

Build status    Failed
Started at      Oct 11, 3:33 AM
Finished at     Oct 11, 3:33 AM

Steps:
Starting the build                                                          
Start container                                                             
Enable SSH                                                                  
Restore source cache                                                        
Checkout using deploy key: xx:xx:xx:xx:xx:xx:xx:xx:xx:xx  
Configure the build                                                         
Exporting env vars from circle.yml                                          
set php version to 7.0.4                                                    
Restore cache                                                               
Exporting NODE_ENV                                                          
Exporting PATH                                                              
npm install                                                                 
composer install                                                            
php artisan migrate --force                                                 
Save cache                                                                  
make test                                                                   
Collect test metadata                                                       
Collect artifacts                                                           
Disable SSH        
````

詳細は、Webページから見るのが良さそう。

現在進行中のビルドは`cancel`コマンドでキャンセル出来る。

````
$ circle cancle
````

最後に以下のコマンドでCircle CIのWebページを開くことが出来る。

````
$ circle open 
````

なんだかんだ、これが一番便利そう。
Camunda BPM Engine のテーブル一覧

[Camunda BPM Engine](https://camunda.org/) を読み解くにあたって、テーブル群の全体像を掴みたかったので、テーブル一覧をまとめておきます。テーブル毎の説明は必要に応じて適宜追加していきます。Camundaのバージョンは7.5.0です。

主要なテーブルのER図は[公式ドキュメント - Database](https://docs.camunda.org/manual/7.5/user-guide/process-engine/database/)にあります。

# テーブル一覧

- Camunda BPM Engine は全部で44個のテーブルから構成されています。

- 全てのテーブル名はACT_で始まります。これはCamundaが[Activiti](http://activiti.org/)からフォークされて出来たことに由来します。

- ACT_の後の二文字 (RE, RU, ID, HI, GE) でそのテーブルのユースケースを表します。これは大まかにAPIと一致しています。

## Repository Tables (リポジトリテーブル)

プロセス定義などの、静的(static)なデータを保持するテーブル。

|テーブル名|説明|
|---|---|
|ACT_RE_DEPLOYMENT||
|ACT_RE_PROCDEF|プロセス定義を保持するテーブル。BPMNデータ(XML)自体は、`ACT_GE_BYTEARRAY`に保持する。|
|ACT_RE_CASE_DEF||
|ACT_RE_DECISION_DEF||

## Runtime Tables (実行時テーブル)

プロセスインスタンス、ユーザータスク、変数、ジョブ等の実行時データを保持するテーブル。エンジンはプロセスインスタンスが実行中のみ実行時データを保存し、プロセスインスタンスが終了すればデータを削除します。これは実行時テーブルを小さく速く保つためです。

|テーブル名|説明|
|---|---|
|ACT_RU_AUTHORIZATION|あるリソースに対するグループもしくはユーザーの権限を保持する。<br/><br/>__タイプ (TYPE_)__<br/>0: Global: 全ユーザー・グループ共通のデフォルト権限を付与<br/>1: Grant: 特定のユーザー・グループに権限を付与<br/>2: Revoke: 特定のユーザー・グループから権限を剥奪<br/><br/>__リソースタイプ (RESOURCE_TYPE_)__<br/>0: アプリケーション / 1: ユーザー / 2: グループ / 5:フィルター / 7: タスク / 8: プロセスインスタンス / 11: テナント|
|ACT_RU_VARIABLE|プロセス実行時に設定されるあらゆる変数の名前と値を保持する。|
|ACT_RU_BATCH||
|ACT_RU_CASE_EXECUTION||
|ACT_RU_CASE_SENTRY_PART||
|ACT_RU_EVENT_SUBSCR||
|ACT_RU_EXECUTION||
|ACT_RU_EXT_TASK||
|ACT_RU_FILTER||
|ACT_RU_IDENTITYLINK||
|ACT_RU_INCIDENT||
|ACT_RU_JOB||
|ACT_RU_JOBDEF||
|ACT_RU_METER_LOG||
|ACT_RU_TASK||

## History Tables (履歴テーブル)

過去のプロセスインスタンスや変数、タスクなどの履歴データを保持するテーブル。

|テーブル名|説明|
|---|---|
|ACT_HI_ACTINST||
|ACT_HI_ATTACHMENT||
|ACT_HI_BATCH||
|ACT_HI_CASEACTINST||
|ACT_HI_CASEINST||
|ACT_HI_COMMENT||
|ACT_HI_DECINST||
|ACT_HI_DEC_IN||
|ACT_HI_DEC_OUT||
|ACT_HI_DETAIL||
|ACT_HI_IDENTITYLINK||
|ACT_HI_INCIDENT||
|ACT_HI_JOB_LOG||
|ACT_HI_OP_LOG||
|ACT_HI_PROCINST||
|ACT_HI_TASKINST||
|ACT_HI_VARINST||

## Identity Tables (IDテーブル)

個人を識別するためのデータを保持するテーブル。

Camundaではユーザーを、テナント - グループ - ユーザーの３階層で管理する。

テナントは会社名に該当するような最上位カテゴリー、グループはテナント内の中間グループ、ユーザーは個人を表す。

|テーブル名|説明|
|---|---|
|ACT_ID_USER|ユーザー (個人)|
|ACT_ID_GROUP|グループ (部署・チームなど)|
|ACT_ID_TENANT|テナント (会社・組織など)|
|ACT_ID_INFO|デフォルトでは使われてないっぽい。|
|ACT_ID_MEMBERSHIP|`ACT_ID_USER`と`ACT_ID_GROUP`のリレーションテーブル。(多対多)|
|ACT_ID_TENANT_MEMBER|`ACT_ID_TENANT`と`ACT_ID_USER`、`ACT_ID_TENANT`と`ACT_ID_GROUP`のリレーションテーブル。(多対多)|

## General Tables (その他テーブル)

上記に当てはまらないデータを保持するテーブル。

|テーブル名|説明|
|---|---|
|ACT_GE_BYTEARRAY|BPMN(XML)やPDFなどのデータを保持する。|
|ACT_GE_PROPERTY|定数テーブル|

# 参考URL

[公式ドキュメント - Database](https://docs.camunda.org/manual/7.5/user-guide/process-engine/database/)
book > 深層学習 by 岡谷貴之さん

```txt:本
MPL (機械学習プロフェッショナルシリーズ)
深層学習 by 岡谷貴之さん
```

本屋でTensorFlow関連の本を物色して見つけて書籍版を購入した。

17年前にNeural Networkを少しかじった程度の自分には合う。Self Organizing MapやHobbなんたらとかなつかしい。

この本で概念と関連キーワードをつかむことで、Deep LearningをDeep Learning中の7of9の学習速度が向上することを望む。

この本の一つ残念な点はKindle板はマーキング(ハイライト)対応してないこと。１つの本を何度も読み返すときに、毎回重要でない部分も含めて読むことになる。時間が限られる人にとってはKindle版は魅力的ではない。
「本をどこにやったか問題」の回避１つのためにKindle版を買いなおすかは今後検討する。
python > link > from __future__ import absolute_import

TensorFlowというDeep Learning関連のもので、mnist.pyというpythonコードを学習中。

https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101
そのmnist.pyにある以下の記述について

```
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
```

さりんじゃーのプログラミング日記
http://salinger.github.io/python/20140211-future-module/
の
absolute_import節参照。

> Python 3 では相対インポートではなく、絶対インポート優先になる。標準モジュールと同名のモジュールがカレントディレクトリにある場合、Python 2 系ではカレントディレクトリのモジュールが優先されていたので、これを使うことで標準モジュールを意図せず上書きしてしまう可能性がなくなる。
python > link > from __future__ import print_function > Python 2.XにおいてPython 3.Xのprint()を使用できるようにする

TensorFlowというDeep Learning関連のもので、mnist.pyというpythonコードを学習中。
https://www.tensorflow.org/versions/master/tutorials/mnist/tf/index.html#tensorflow-mechanics-101

そのmnist.pyにある以下の記述について

```
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
```

http://salinger.github.io/python/20140211-future-module/
> `__future__` モジュールは Python 2 系用のモジュール。Python 3 系に実装されている Python 2 系 と互換性の無い機能をPython 2 系で使用できるようにする。

...
> 3系では print は文から関数 print()になった。また予約語からも削除された。
プログラミング　一次情報　まとめ

自分用メモ
順番は適当

# android  
- 公式APIガイド : https://developer.android.com/guide/index.html
- 公式リファレンス : https://developer.android.com/reference/packages.html (多分コード見た方が早い)
- マテリアルデザインガイドライン（日本語版）: https://material.google.com/jp/
- Android Studio User Guide : https://developer.android.com/studio/intro/index.html

- Gradle : http://gradle.monochromeroad.com/docs/userguide/userguide.html
- Android Plugin DSL Reference : http://google.github.io/android-gradle-dsl/current/index.html
- retrofit : http://square.github.io/retrofit/

#java
- コーディング規則 : http://objectclub.jp/community/codingstandard/CodingStd.pdf (レイアウト崩れててちょっと読みにくい)
- The Java Tutorial : http://docs.oracle.com/javase/tutorial/

#iOS
- 公式ライブラリ(英語) : https://developer.apple.com/library/ios/navigation/ (目的のdocument探すのが難しい)

- 日本語ドキュメント : https://developer.apple.com/jp/documentation/
	- cocoa向けコーディングガイドライン : https://developer.apple.com/jp/documentation/CodingGuidelines.pdf

# swift
- 公式ドキュメント : https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/

#realm
- 公式 : https://realm.io/jp/
	- java : https://realm.io/jp/docs/java/latest/#getting-started
	- swift : https://realm.io/jp/docs/swift/latest/#getting-started

#mysql
- MySQL 5.6 リファレンスマニュアル : https://dev.mysql.com/doc/refman/5.6/ja/
- MySQL 5.7 Reference Manual : http://dev.mysql.com/doc/refman/5.7/en/

#python
- python Documentation contents :http://docs.python.jp/2/contents.html
- pythonチュートリアル : http://docs.python.jp/2/tutorial/
Xcode8でStoryboardからActionを紐付けられない場合の対処方法

Xcode8で、これまでやっていたように`controlキー`を押しながら`UIButton`などにActionを紐付けると、勝手に`xxxWithSender`のような名称と紐付けが行われる上に実際実行してみると`unrecognized selector`を発生させる現象に悩まされました。

なお、onClickWithSenderというメソッドを書いて紐付けると、WithSenderWithSenderとか作られます。

## 原因

Xcode8で、`Use Legacy Swift Language Version`が`YES`になっている場合に起こる不具合のようです。
`SWIFT_VERSION = 2.3`が指定されているときに発生を確認しています。
詳細な解説については、以下で回答している方がいますのでそちらを参照。

■ [Xcode 8 drag and connect @IBAction incorrectly adds “WithSender” on connection inspector IB](
http://stackoverflow.com/questions/39646599/xcode-8-drag-and-connect-ibaction-incorrectly-adds-withsender-on-connection-i)


## 解決策
Swift3.0で実装する…のが一番正しいですが、ライブラリの関係などで行えないことも多いと思います。
上記内で書かれているように、右クリック（副ボタンのクリック）からイベントを選択して紐付けを行うと正常に紐付けすることができます。
（見た目上は変わらないんですが。。。）

この場合はボタンなので、`Touch Up Inside`を選択
![スクリーンショット 2016-10-11 12.13.23.png](https://qiita-image-store.s3.amazonaws.com/0/34166/f4ee8849-a73e-8106-ec82-2b04d097888f.png)

![スクリーンショット 2016-10-11 12.13.43.png](https://qiita-image-store.s3.amazonaws.com/0/34166/1aac7377-2732-a819-b5ab-c7d331da67b1.png)


## 蛇足
不安だったら、もうコードで.addTargetしちゃうのがいいと思います。
ElectronでTypeError: win.loadUrl is not a function


Electronメモ。 Web上に古い情報も多くて紛らわしいですね苦笑

## loadUrl()でエラー

メインプロセスのmain.jsにて

```
  win.loadUrl(`file://${process.cwd()}/index.html`);
```

という記述をしてたところ

```
Uncaught Exception:
TypeError: win.loadUrl is not a function ...
```

![](https://i.gyazo.com/62b59d1b9539d5ba56128d510ea0d727.png)

というエラーが。

## loadURL()で解決

スタックオーバーフローの[loadUrl is not working in electron](http://stackoverflow.com/questions/37614054/loadurl-is-not-working-in-electron)にもあるように

```
loadUrl() was renamed to loadURL() a while back.
```

`win.loadUrl()`の部分を`win.loadURL()`に書き換えるとうまくいきました。
リーダブルコード~より良いコードを書くために~(3/3)

#概要
前回の続き[リーダブルコード~より良いコードを書くために~(2/3)](http://qiita.com/SocVioEn_yuki/items/47c8c6833dfe23d15c45)

#11.一度に一つのことを
>例)1関数内:オブジェクトを生成して、データを綺麗にして、入力をパースして.....多すぎ!

- コードはひとつずつタスクを行うようにする(関数に限らずクラス等も)

    - 1.コードが行っているタスクを全て列挙する(書き出す)
    - 2.その中で使っているキーワードやフレーズに注目する =>分割する下位問題かどうか分かる
    - 3.タスクをできるだけ異なる関数に分割する

#12.コードに思いを込める
- 「おばあちゃんに分かるように説明できなければ本当に理解したとは言えない - アルバート・アインシュタイン」
    - 1.コードの動作を簡単な言葉で同僚にも分かるように説明する
    - 2.その説明の中に合わせてコードを書く

- コードを簡潔に書くためにライブラリを知る
    - わざわざデバッグの手間かけて自前で作るよりもライブラリがあったらそっちを使う方が安全かつ楽


- 技法「ラバーダッキング」
    - 問題を物に話しかけることで、話しているうちに頭の中で問題が整理され、解決法が導かれる

>例)デバッグに悩む学生が問題を声に出して説明するだけで、学生は解決策が見つかった

#13.短いコードを書く
- 最も読みやすいコードは何も書かれていないコード
    - 「その機能の実装についてそんな悩まないで、きっと必要ないから」
    - 最も簡単に解決問題を解決できるような要求を考える
   
- 汎用的なユーティリティコードを作って重複コードを削除する(10.無関係の下位問題の抽出　参照)
- 未使用のコードや無用な機能を削除する
- プロジェクトをサブプロジェクトに分割する
- コーディングするよりもUnixなどOS(その他)がもつツールを使おう
    - プログラムを書かなくてもコマンド一発で解決できる場合もある

#14.テストと読みやすさ
- テストを読みやすくする
    - 大切でない詳細はユーザーから隠す
 
- エラーメッセージを読みやすくする
    - 変数の値も同時に出力するようにあらかじめしておく
    - よりよいassert()を使う

```
// Boost C++ライブラリを使って...

BOOST_REQUIRE_EQUAL(output,expected_output);

// ↑テストに失敗するとエラーメッセージ & 変数の中身も表示してくれる
```

- テストの適切な入力値を選択する
    - 最も単純な入力値の組み合わせ

```
// 良くない例)
CheckScore(0,1,4,-90000) // <= -90000とか何の意味があるの?
```

```
CheckScore(0,1,4,-1) // <=　「任意のマイナス値をテスト」するなら"-1"で十分
```

- テストの機能に名前をつける
    - 「テストするクラス」や「テストする関数」、「テストする状況やバグ」
    - テストの名前は長くなっても構わない(もしろ詳細が分かる方が良い)

> 例) Test_関数名_状況(){}

- テストに優しい開発 = テストを意識開発
- 例えばテスト駆動開発(TDD)...本物のコードを書く前にテストを書くプログラミング手法


#おわりに

※当初では2部構成で 「リーダブルコード~より良いコードを書くために~」をまとめる予定だったが以外と後半部分の量が多かったので,3部構成となってしまいそうです．ごめんなさい．
本記事はほんとにざっくりとまとめているので深く理解するにはやっぱ書籍[(リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック)](https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655)を買うことをオススメします．


#おまけ

書籍内には下記の書籍もいくつか紹介/推奨していた

1.Code Complete 第2版<上><下>-完全なプログラミングを目指して-
2.リファクタリング-プログラムの体質改善テクニック
3.プログラミング作法
4.達人プログラマー - システム開発の職人から名匠への道
5.Clean Code-アジャイルソフトウェア達人の技
[PHP] laravelでsqliteを利用

# laravelインストール記事
1. [[PHP] laravelを利用したので、インストールメモ](http://qiita.com/kshimadutsu/items/3e7ea97f39145da7be09 )
2. [PHP] laravelでsqliteを利用
3. [[PHP] laravelでseederを利用](http://qiita.com/kshimadutsu/items/f2558419718b47ed0c5d)

# sqliteはインストールしておく

```:
# yum install sqlite sqlite-devel
```

```:
$ cd {プロジェクトディレクトリ}
$ sqlite3 database/development.sqlite3
sqlite> .tables     <- 0byteのファイルができます。 (touch database/development.sqlite3 でも可)
sqlite> .q
```
# .gitignoreにファイルをsqliteファイルを追記

```:.gitignore
/database/*.sqlite3
```

# config

```ini:.env
#DB_CONNECTION=mysql
#DB_HOST=127.0.0.1
#DB_PORT=3306
#DB_DATABASE=homestead
#DB_USERNAME=homestead
#DB_PASSWORD=secret
DB_CONNECTION=sqlite
DB_DATABASE=database/development.sqlite3
```

# tinkerを使って変更内容を確認 (tinkerとは、laravelのconsoleです。)

```:
$ php artisan tinker
Psy Shell v0.7.2 (PHP 5.6.24 — cli) by Justin Hileman
>>> env('DB_CONNECTION')
=> "sqlite"
>>> env('DB_DATABASE')
=> "database/development.sqlite3"
```


# migration
準備されているusers, password_resetsテーブルを作成する。

```:
$ ls database/migrations/
2014_10_12_000000_create_users_table.php  2014_10_12_100000_create_password_resets_table.php
$ php artisan migrate
Migration table created successfully.
Migrated: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_100000_create_password_resets_table
$ sqlite3 database/development.sqlite3
SQLite version 3.6.20
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
migrations       password_resets  users
```

テーブル作成まで。
XBox One Kinectセンサー（ Kinect v2 ) 開発のはじめかた

# BootcampにWindows10をインストール
- Macの場合はBootcampでWindows10を入れるほうがスムーズです。
- インストール方法については以下を参考にしました
    - http://pc-karuma.net/mac-bootcamp-windows-10-install/

# kinectの購入
- 最新版は「XBox One Kinectセンサー」になります。
    - https://www.amazon.co.jp/dp/B01HSRQ6R8

![ダウンロード (5).jpeg](https://qiita-image-store.s3.amazonaws.com/0/34936/2fe735d8-08f2-83b7-ecae-8ae84d98ac51.jpeg)

- Kinect v1 -> Kincet v2 -> XBox One Kinectセンサーの順で最新になります
    - Kinect v2と Xbox One Kinectセンサーとの違いは、XBox One KinectセンサーはWindowsからもXboxとも両方接続可能になっています。
- PCと接続するためには「Xbox 用 Kinect アダプター」も必要です。
    - http://www.xbox.com/ja-JP/xbox-one/accessories/kinect/kinect-adapter

<img src="https://qiita-image-store.s3.amazonaws.com/0/34936/1fa53350-b145-f2a7-6e0c-a5cae0db8859.jpeg" width="400px">


# Kinectの設定
## 以下のSDKをダウンロードする
- Kinect for Windows SDK v2
    - https://developer.microsoft.com/ja-jp/windows/kinect/tools
    - SDK v2で提供されるツール
        - Kinect Studio
        - Visual Gesture Builder
        - Kinect v2 Configuration Verifier

##　サンプルプログラムを動作させる
- SDK Browser v2.0を起動します
    - 幾つかサンプルプログラムがあるので、Runボタンで試してみて下さい

## Unityでの開発の準備
- Unity5のインストール
    - Download
        - https://unity3d.com/jp/get-unity/download
    - インストール方法についてはこちら
        - http://qiita.com/takish/items/9c3f7183cf204db7e0aa
- Unity用アドオン
    - https://go.microsoft.com/fwlink/p/?LinkId=513177
- ダウンロードしたパッケージの内容
    - Kinect.2.0.1410.19000.unitypackage
        - 基礎パッケージ
    - Kinect.Face.2.0.1410.19000.unitypackage
        - Face関連のパッケージ
    - Kinect.VisualGestureBuilder.2.0.1410.19000.unitypackage
        - ジェスチャー関連のパッケージ
    - KinectViewフォルダー
        - 基本的なものが入っています
    - GreenScreenフォルダー
        - グリーンスクリーンによる背景除去のサンプル

# Unityちゃんを動かしてみる
- 参考リンク
    - http://www.buildinsider.net/small/bookkinectv2/0601
jqueryで画像読み込み後に実行したい時

初期表示時はこれでOK
```Javascript
$(window).load(function(){
    /* 読み込み後の処理 */
});
```

これだとうまくいかなかった.
```Javascript
var img = $('.hoge'); //該当画像
img.bind('load', function(){
/* 読み込み後の処理 */
});
```
tnsnames.oraを利用したthinドライバーからjdbc接続

# tnsnames.oraを利用したjdbc thinドライバー接続

tnsnames.oraを利用した接続を行いたいが、
oci 接続なら上手くいくのにthinでは何故かうまくいかない

以下の設定を入れることで、接続できた。

## IntelliJ

`Data Sources and Drivers` -> `Oracle` -> `Advanced` 

| `<user defined>` | `<valid>` |
|----------------|---------|
| oracle.net.tns_admin | /opt/oracle/xxxxxx/network/admin |


## Embulk

```
java -Doracle.net.tns_admin=/opt/oracle/xxxxx/network/admin -jar embulk.jar preview config.yml
```


## なぜ Thin？

OCI8 はなんか遅い（体感）
修正も早い（らしい）


## 参考

[How to connect to the Oracle database using JDBC thin driver with TNSNames Alias Syntax](http://stackoverflow.com/questions/14518635/how-to-connect-to-the-oracle-database-using-jdbc-thin-driver-with-tnsnames-alias?noredirect=1&lq=1)


良き Thin Driver Life を
Androidでレイアウトファイルをテンプレート的に使いたい

# 極力避けて通りたいレイアウトファイル
めんどくさいよね。
できれば、書きたくないし、アプリって大体UI統一されてるよね、ってことで、xmlをテンプレート的に扱うための簡単なソリューションです。

# Fragment使えよ・・・
そうですね、そうですね、よくわかりますよ。
でもActivityだけで完結させたいことってあるじゃないですか。
私にはあるんです・・・。
Fragmentあまり好きじゃない（ボソ・・・

# 本題
どうやって解決しようか悩みました。
xmlにテンプレート機能なんてないんですもの。
でも、基本的なレイアウトは統一したい・・・。
悩んだ結果、私は、親になるActivityを作ることにしました。

## コードはこんな感じ
BaseActivityを作って、以下のメソッドを作っておきます。

```
    /**
     * テンプレートにレイアウトをはめ込む
     *
     * @param layoutID
     */
    protected void setContentViewByTemplate(int layoutID) {
        View contentView = getLayoutInflater().inflate(R.layout.template_main_layout, null);
        FrameLayout layoutContainer = (FrameLayout) contentView.findViewById(R.id.layout_container);
        // MainActivityのレイアウトを追加
        layoutContainer.addView(getLayoutInflater().inflate(layoutID, null));
        setContentView(contentView);

    }
```

### 説明
基本的には、Fragmentと同じ考え方だと思います。
親のレイアウトに、layout_containerっていうViewを作ってきます。これはLinearLayoutでもFrameLayoutでもなんでもいいです。
このcontainerに、Viewをaddしています。

## 使い方
そして、MainとなるActivityからはこんな風に使います。

```
public class MainActivity extends BaseActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentViewByTemplate(R.layout.activity_main);

以下略
```

## 説明
activity_mainは、アクションバーとかボトムナビとかを除いた、その画面だけのレイアウトです。
例えば、こんな感じ

```
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <!-- HelloWorld -->
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="hello world!" />

</RelativeLayout>
```

こうしておくことで、もしそのActivityの画面Fragmentにしてよって言われた時、そのままFragmentのレイアウトとしても使えるので、結構便利です。

# まとめ
こうしておくと、コードの切り分けもできます。
ActionBarやBottomNavigationなど共通する部分の処理は、BaseActivityに、その画面特有の処理はそのなんちゃらActivityにって感じで書けます。

エラーメッセージなんかのダイアログやプレグレスなんかも、BaseActivityに書いておくと便利です。
extendsしておけば、そのまま使えますからね。

まだ開発中って時なんかは、ActionbarとかBottomnaviとか変更が多発したりするんですよ・・・。
でも、こうしておけば、共通部分のレイアウトに変更があった時なんかも修正箇所が少なくて済んでいます。

以上、テンプレート的に扱いたい場合のソリューションでした。
mac ショートカット 「ゴミ箱へ入れる」 Command + delete

<img width="537" alt="スクリーンショット 2016-10-11 11.03.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/135794/4e685df4-6570-2b21-0c04-949e5471f6be.png">
Rails の strong_parameters でネストされた要素を require チェックする

## [strong\_parameters](https://github.com/rails/strong_parameters) の require

```json
{
    "user":{
        "email": "aaaa",
        "name": "bbbb"
    }
}
```

上記のような json で post される場合、 [strong\_parameters](https://github.com/rails/strong_parameters) の説明では、

```ruby
def user_params
  params.require(:user).permit(:name, :email)
end
```

のように、 user は必須で name と email を `permit` しましょうって書いてあるのをよくみる。

でも name や email も `require` で必須チェックする必要が出たのでやってみた。

## やり方

```
def user_params
  params.require(:user).require(:name)
  params.require(:user).require(:email)
  params.require(:user).permit(:name, :email)
end
```

1 行ずつ書いたらできた。

user.name と user.email をそれぞれ require チェックして、最後に `permit` する。
そうすると上から評価されていくので、 name や email が存在しなければ require で弾かれることになる。
AWS CLI を使って S3 bucket 内のオブジェクトを一括に削除する

[AWS Command Line Interface](https://aws.amazon.com/jp/cli/)

AWS のサービスをターミナルで操作できる便利な API。

今回、とある S3 バケット内のオブジェクト一括で消す用事があったので、`rm` コマンド使いました。他にも `ls`, `mv`, `cp` なんかもあったりします。

実際に叩いたコマンドが下記になります。

# 削除コマンド

```
aws s3 rm s3://#{bucket_name} --recursive --exclude '*' --include '一致させたいパターン'
```

これだけでパターンにマッチしたオブジェクトを一括で消せます。
今回は、削除したいオブジェクトは全て prefix が同じだったので

```
aws s3 rm s3://#{bucket_name} --recursive --exclude '*' --include 'hogehoge_*'
```

という感じのコマンドを叩きました。

また、いきなりやるのは怖かったので、まず模擬的に `--dryrun` オプションを使って実行しました。
これで実際に削除はせずに、動作した場合の挙動が確認できます。
（その他にもいろいろオプションがあるので、ご参考までに -> [リファレンス](http://docs.aws.amazon.com/cli/latest/reference/s3/rm.html)）

たった一発で 20000 件近いオブジェクトが消せた。AWS-CLI 便利！
MonoDevelopでコーディングするときに捗る設定

できれば MonoDevelopを使いたくないけれど、
やんごとなき状況で使わざるをえないときに捗る個人的な設定メモ

# 設定

Microsoft Visual Studioにしとく.
ほかのEditorともフォーマット合わせやすいけど, 好みがわかれるかも.

![スクリーンショット 2016-10-11 10.14.19.png](https://qiita-image-store.s3.amazonaws.com/0/15000/10e7c4ae-4cea-34e0-39ea-8c8c41db9858.png)

Format document on saveにチェック.
よくフォーマット忘れしちゃうので、保存時にフォーマット.

あと Viモードがないとやってけないのでチェック.

![スクリーンショット 2016-10-11 10.14.39.png](https://qiita-image-store.s3.amazonaws.com/0/15000/5214609e-8128-2adb-54c6-66fcb7a99bb2.png)

SourceAnalysisを有効に.
利用してないImportをdisableにしてくれる.

![スクリーンショット 2016-10-11 10.25.00.png](https://qiita-image-store.s3.amazonaws.com/0/15000/71a2d915-5085-ca3e-01eb-3104c9c5a5e8.png)
Elixirのwith文の挙動


## 環境

- Elixir 1.3.3

## やったこと

Elixir 1.2から追加されたwith文の挙動が気になったので調べてみた。with文の公式ドキュメントは[こちら](http://elixir-lang.org/docs/stable/elixir/Kernel.SpecialForms.html#with/1)。

```elixir
with "aaa" <- "aaa",
  do: true
#=> true
# with文内のパターンマッチが全部成功しているのでdo文が実行される

with "aaa" <- "aaa",
  do: "ok"
#=> "ok"
# with文内のパターンマッチが全部成功しているのでdo文が実行される

with "aaa" <- "bbb",
  do: "ccc"
#=> "bbb"
# with文内のパターンマッチが失敗した場合最後に失敗した`<-`の右式が評価される

with "aaa" <- "aaa",
     "bbb" <- "bbb",
  do: true
#=> true
# 複数式ある場合も同様に全パターンマッチの試行に成功するとdo文が実行される

with "aaa" <- "aaa",
     "bbb" <- "ccc",
  do: true
#=> "ccc"
# 複数式ある場合も同様に失敗した`<-`の右辺が評価される

with a = "aaa",     
  do: true
#=> true
# a
#=> nil
# 変数のスコープはwith文内のみに制限される
```

まとめると

- 上から順番にマッチするか評価
- 全てマッチした場合`do: `が実行される
- マッチしない場合はその時点でのマッチしなかった右式の結果が返る
- with文内での変数はスコープがwith文内に制限される

またElixir 1.3から追加されたwith文のelseとguardの挙動

```elixir
with "aaa" <- "aaa"
do 
  true
else
  _ -> false
end
#=> true
# パターンマッチに成功しているのでdo文が実行される。elseが無い場合と特に変わりない。

with "aaa" <- "bbb"
do 
  true
else
  _ -> false
end
#=> false
# パターンマッチに失敗した時点での`<-`の右式がelse内でパターンマッチされる

with "aaa" <- "bbb"
do 
  true
else
  "bbb" -> false
  _ -> "ccc"
end
#=> false
# "bbb"がelse内で"bbb"と一致したため式全体としては`false`となる

with "aaa" when "aaa" == "bbb" <- "aaa",
  do: true
#=> "aaa"
# with文内でGuardも使える

with "bbb" <- "aaa" do
   true
 else
   "bbb" -> false
 end
#=> ** (WithClauseError) no with clause matching: "aaa"
# else内でもマッチしない場合WithClauseError Exceptionになる
```

まとめると

- マッチに失敗したときの結果をelse内でマッチ出来る
- パターンマッチなのでwith内でGuard式も使える
- elseにマッチする条件がない場合`WithClauseError` Exceptionになる

## 使用例

### case文のネスト

例えばこのようなcase文のネストを

```elixir
case Map.fetch(%{a: 1, b: 2}, :a) do
  {:ok, data} -> 
    case data do
      nil -> false
      data -> data
    end
  :error ->
    false
end
```

withで書き直すと

```elixir
with {:ok, data} when not is_nil(data) <- Map.fetch(%{a: 1, b: 2}, :a)
do
  data
else
  {:ok, nil} -> false
  :error -> false
end
```

となる。

### パイプライン

パイプラインを組んで前の処理の結果を次に渡したい時、パイプラインが長くなってくると前の処理の結果をチェックするために関数の頭でエラーチェックをしてそれを次に渡して…ということをするため、少々見辛くなる。

```elixir
Map.fetch(%{a: 1, b: 2}, :a)
|> process
|> process2

defp process(%{:ok, data}), do: data
defp process(%{:ok, nil}), do: false
defp process(:error), do: false

defp process2(false), do: false
defp process2(data) do
  Map.fetch(%{1: "a", 2: "b"}, data)
end
```

これをwith文で書き直すと

```elixir
with {:ok, data} <- Map.fetch(%{a: 1, b: 2}, :a),
     {:ok, result} <- Map.fetch(%{1: "a", 2: "b"}, data)
do
  result
else
  {:ok, nil} -> false
  :error -> false
end
```

のようになる。
見やすくなった気がする。

## まとめ

- with文の挙動と簡単な使用例を確認した
- 実はElixir本体やEctoのような代表的なライブラリでもwithはあまり使用されていないし、José Valim(Elixirの作者)もあまり使うところはないかもしれないと言っている。
- with文は確かに便利だけど挙動がパイプラインほど明示的ではないし、取っ付きにくさはあるので使うところは見極めた方がいいかもしれない。ここぞというときに使えばハマると思う。
- with文が必要なほどソースが込み入って来たらその時点で設計が悪いか実装を見直した方がいいのかもしれない。
macOSのTerminalでログの自動生成

ログ出力用のディレクトリを作成する

```bash
$ mkdir -p /Users/${USER}/Documents/Terminal-Logs
```

[ターミナル.app]を起動し、メニューの[ターミナル] - [環境設定]を開く

![2016101101.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/cfb73d71-3d50-8647-0893-93c8b5c53a79.jpeg)

[設定]- [シェル]を開いて、[コマンドを実行]にチェックを入れる

![2016101102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143947/19267340-9374-9920-69fa-85e3e669eab2.jpeg)

以下のソースを改行コードを入れずに1行でテキストボックスに入力する

```bash
NOW=`date +%Y%m%d%H%M%S`;LOGFILE=/Users/${USER}/Documents/Terminal-Logs/terminal-log_${NOW}.log;script ${LOGFILE}
```

[ターミナル.app]を再起動する。
UnityのJsonUtilityでJSON配列を処理する

# 本Qiitaについて

JSONの配列をJsonUtilityで処理する方法について記載

# 関連Qiita


* [DayDream開発機の設定](http://qiita.com/akira-sasaki/items/582d84b6e3e717aaf661)
* [UnityでのDayDreamデモアプリのBuild](http://qiita.com/akira-sasaki/items/6065e926b76620c12424)
* [DayDream Readyのスマフォ](http://qiita.com/akira-sasaki/items/4d648f9da28ff89973d4)
* [DayDream開発機の作り方](http://qiita.com/akira-sasaki/items/78e86d82dd307c494596)
* [DayDream関連リンク](http://qiita.com/akira-sasaki/items/3f37d7908be802191705)
* [Unity向けのWebSocketライブラリの組み込み](http://qiita.com/akira-sasaki/items/18a72f6b99acaa9601b8)
* [UnityでRESTでアクセス](http://qiita.com/akira-sasaki/items/09e4556ec4ad55a19a14)


# JsonUtility

```
{[
{a:11,b:12},
{a:21,b:22},
{a:31,b:32},
]}
```

は処理できない。

```
{Items:[
{a:11,b:12},
{a:21,b:22},
{a:31,b:32},
]}
```

は処理できる。

# Livedoorのお天気WebAPIを使ってサンプルを作る

会津若松の天気のJSON
http://weather.livedoor.com/forecast/webservice/json/v1?city=070030

"forecasts" :の配列を取得し格納してみる

JsonHelper.cs

```csharp
using System;
using UnityEngine;
using System.Collections;

public static class JsonHelper
{
	public static T[] FromJson<T>(string json)
	{
		Wrapper<T> wrapper = UnityEngine.JsonUtility.FromJson<Wrapper<T>>(json);
		return wrapper.forecasts;
	}

	[Serializable]
	private class Wrapper<T>
	{
		public T[] forecasts;
	}
}
```

RestClient.cs

```csharp
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
using System.Text;

[System.Serializable]
public class tenki
{
	public string dateLabel;
	public string telop;
	public string date;
}

public class RestClient : MonoBehaviour {

	public tenki[] tenkiInstance;

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		if (Input.GetKeyUp("g"))
		{
			Debug.Log ("GET");
			StartCoroutine(Get("http://weather.livedoor.com/forecast/webservice/json/v1?city=070030"));
		}
	}

	public IEnumerator Get (string url) {
		Debug.Log ("GET");

		var request = new UnityWebRequest();
		request.downloadHandler = new DownloadHandlerBuffer();
		request.url = url;
		request.SetRequestHeader("Content-Type", "application/json; charset=UTF-8");
		request.method = UnityWebRequest.kHttpVerbGET;
		yield return request.Send();

		if(request.isError) {
			Debug.Log(request.error);
		}
		else {
			if (request.responseCode == 200) {
				Debug.Log ("success");
				Debug.Log ("--------------------------------");
				Debug.Log(request.downloadHandler.text);
				Debug.Log ("--------------------------------");
				tenkiInstance = JsonHelper.FromJson<tenki>(request.downloadHandler.text);

				for (int i = 0; i < tenkiInstance.Length; i++) {
					Debug.Log (tenkiInstance [i].dateLabel);
					Debug.Log (tenkiInstance [i].telop);
					Debug.Log (tenkiInstance [i].date);
				}
			} else {
				Debug.Log ("failed");
			}
		}
	}
}
```

# ToDo

入れ子の配列の処理.
lvh.meでのアクセス

「パーフェクトRoR」の中でlocalhostに接続する際にlvm.meというドメインを使用するとあるが正しくはlvh.me(local virtual hostの略)らしい。
というただのメモ。

```bash
$ bundle exec rails s
$ curl http://lvh.me:3000
```

で接続できればOK

って事書いたけど、ぐぐるとかなりの人が同じところで詰まっているらしかった。
centos6 に zabbix を最短でインストールするよ。

## 前提事項

* zabbixは2.2 LTS版としておきます。
* DBはMySQLとします。

とにかく、yumでさくっとインストールするまでを解説。
それと、デフォルトで日本語にすると、グラフの文字化けが起きるのでそこも修正。

## リポジトリのインストール

まずは、リポジトリをインストール

```
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm
```

## zabbix本体のインストール

インストール前に、この辺りはアップデートしておきましょう。
```
yum --enablerepo=epel,remi-php56 update
```

enablerepoの部分は、環境に合わせて下さい。

```
yum --enablerepo=remi-php56 install zabbix-server-mysql zabbix-web-mysql
```

## mysqlへのデータ設定

zabbix ユーザの設定、スキーマインポート

```
mysql -uroot -p<password>

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> grant all privileges on zabbix.* to zabbix@localhost identified by '<password>';
mysql> quit;

cd /usr/share/doc/zabbix-server-mysql-2.2.15/create
mysql -u zabbix -p zabbix < schema.sql
mysql -u zabbix -p zabbix < images.sql
mysql -u zabbix -p zabbix < data.sql
```


## 設定ファイルの修正

セットアップしたＤＢに合わせて、設定ファイルの各項目を編集

```
vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=<password>
```

タイムゾーンを変更。

```
vi /etc/httpd/conf.d/zabbix.conf

php_value date.timezone Asia/Tokyo
```


## zabbix server 起動
service zabbix-server start

## httpd 再起動
service httpd restart


## ページにアクセス

`http://<your http server access>/zabbix`

初期ユーザのデフォルトは、Adimin / zabbix


## グラフが文字化けする件

zabbixの設定画面から、日本語指定すると、まあ、グラフが文字化けします。
ここは、ipaフォントで対応。

yum でipafontを検索

```
yum search ipafont
ipa-gothic-fonts.noarch : Japanese Gothic-typeface OpenType font by IPA
ipa-mincho-fonts.noarch : Japanese Mincho-typeface OpenType font by IPA
ipa-pgothic-fonts.noarch : Japanese Proportional Gothic-typeface OpenType font by IPA
ipa-pmincho-fonts.noarch : Japanese Proportional Mincho-typeface OpenType font by IPA
```

お好きなフォントを入れれば良いけど、グラフ画像なんで、可変幅フォントが良いと思う。
ここでは、ipa-pgothic-fontsにします。

```
yum install ipa-pgothic-fonts

# 念のためフォントのインストール先を確認
ls /usr/share/fonts/ipa-pgothic
ipagp.ttf

# zabbixのインストール先にシンボリックリンク作成
ln -s /usr/share/fonts/ipa-pgothic/ipagp.ttf /usr/share/zabbix/fonts/ipagp.ttf
```

Zabbixのフォント指定箇所を修正します。

```
vi /usr/share/zabbix/include/defines.inc.php

# 変更箇所
define('ZBX_GRAPH_FONT_NAME', 'ipagp'); // font file name
define('ZBX_FONT_NAME', 'ipagp');
```

再起動とかは必要ないですよぉ・・・
画面再描画したら直ってるはず。
OpalでRubyをJavaScriptにコンパイルする

`opal`コマンドは、通常RubyのスクリプトをJavaScriptに変換し、実行まで行います。

```
$ cat test.rb
p "hello"
$ opal test.rb
"hello"
```

Rubyスクリプトを実行せずに、JavaScriptに変換する場合には、`-c`オプションをつけます。

```
$ opal -c test.rb
(function(undefined) {
  // @note
  //   A few conventions for the documentation of this file:
  //   1. Always use "//" (in contrast with "/**/")
  //   2. The syntax used is Yardoc (yardoc.org), which is intended for Ruby (se below)
  //   3. `@param` and `@return` types should be preceded by `JS.` when referring to
  //      JavaScript constructors (e.g. `JS.Function`) otherwise Ruby is assumed.
  //   4. `nil` and `null` being unambiguous refer to the respective
  //      objects/values in Ruby and JavaScript
  //   5. This is still WIP :) so please give feedback and suggestions on how
  //      to improve or for alternative solutions
  //
  //   The way the code is digested before going through Yardoc is a secret kept
  //   in the docs repo (https://github.com/opal/docs/tree/master).

  if (typeof(this.Opal) !== 'undefined') {
    console.warn('Opal already loaded. Loading twice can cause troubles, please fix your setup.');
    return this.Opal;
  }

  var nil;

  // The actual class for BasicObject
  var BasicObject;
(以下略)
```

最初の部分はOpal本体で、末尾に変換したRubyスクリプトが続きます。変換スクリプトのみを出力するには、`-O`オプションも追加します。

```
$ opal -cO test.rb
/* Generated by Opal 0.10.2 */
(function(Opal) {
  var self = Opal.top, $scope = Opal, nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;

  Opal.add_stubs(['$p']);
  return self.$p("hello")
})(Opal);

/* Generated by Opal 0.10.2 */
(function(Opal) {
  var self = Opal.top, $scope = Opal, nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;

  Opal.add_stubs(['$exit']);
  return $scope.get('Kernel').$exit()
})(Opal);
```

`/* Generated by Opal 0.10.2 */`が２つあり、２つの無名関数が出力されています。後者の方は雰囲気的に`Kernel.exit()`のようなものを実行しているように見えます。これはopalがあえて追加しているもので、これを削るには`-E`オプションをさらに追加します。

```
$ opal -cOE test.rb
/* Generated by Opal 0.10.2 */
(function(Opal) {
  var self = Opal.top, $scope = Opal, nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;

  Opal.add_stubs(['$p']);
  return self.$p("hello")
})(Opal);
```

これで必要最低限のコードのみ出力されるようになります。

なお、`method_missing`を使っていない場合は、`-M`オプションを追加するともっと短くなります。

```
$ opal -cOEM test.rb
/* Generated by Opal 0.10.2 */
(function(Opal) {
  var self = Opal.top, $scope = Opal, nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;

  return self.$p("hello")
})(Opal);
```
ReactNativeのWebviewでhttpを許可する

React　Nativeのwebviewでhttpを表示しようとすると
>Error Loading Page
Domain: NSURLErrorDomain
Error Code: -1022
Description: The resource could not be loaded because
the App Transport Security policy requires the use of a
secure connection

となって表示できないので対処法。
プロジェクト内のinfo.plistをXcodeで開いて下の方にある `App Transport Security Settings`項目の`Exception Domains`に適当な名前でtypeはDictionaryで追加します。
さらにその項目内にtypeはbooleanで`NSTemporaryExceptionAllowsInsecureHTTPLoads`を追加してValueをYESにします
![image](https://qiita-image-store.s3.amazonaws.com/0/29354/07dfc5c2-d3e5-fd83-459c-65983b9c27c4.png)


以上です。

##参考
- [Opening non HTTPS sites in WebView in React Native](http://blog.bigbinary.com/2016/07/27/open-non-https-sites-in-webview-in-react-native.html)
snippet: postfix

## Received ヘッダの削除

* [Postfixの設定](http://www.infra.jp/debian/postfix.html)

> IGNORE 現在の行を入力から削除し、次の入力行を検査します。

```perl:/etc/postfix/header_checks
/^Received:.*127\.0\.0\.1*/ IGNORE
/^Received:.*192\.168\..*/ IGNORE
```

```diff:main.cf
- header_checks =
+ header_checks = regexp:/etc/postfix/header_checks
```

```rb:
sudo postfix check && sudo service postfix restart
```


## /etc/postfix/main.cf が無い場合(ubuntu)

```
cp /usr/share/postfix/main.cf.debian /etc/postfix/main.cf
sudo dpkg-reconfigure postfix
service postfix reload

sudo apt install mailutils
mail | mail $USER
mail
```
RailsでArray#sumを使う時に配列が空なら0じゃなくて nil を返して欲しい時

### やり方

`Array#sum`はデフォルトを指定できますので、`nil`を設定しましょう。

```.rb
[].sum #=> 0
[].sum(nil) #=> nil
```

### 参考

http://apidock.com/rails/Enumerable/sum
値渡しと置換 Javaの問題をTypeScriptにしてみる　9-2

次のプログラムの実行結果を選びなさい

```java:java.java
public class Main{
 public static void main(String[] args){
  String str = "hoge, world";
  hello(str);
  System.out.println(str);
 }
 private static void hello(String msg){
  msg.replaceAll("hoge","hello");
 }
}
```

A.「hoge,world」と表示される
B.「hello,world」と表示される
C.「hello」と表示される
D.「hello,hello」と表示される
E.コンパイルエラーが発生する
F.実行時に例外がスローされる

正解はA
Stringは一度作ると内容を変えることはできません。
helloメソッドでhogeをhelloに変えているようにも見えますが、戻り値で新しいオブジェクトを作成しているわけではないので、結局引数に使った文字列をそのまま出力しています。

これをTypeScriptで書くと

```ts:TypeScript.ts

  var str:string  = "hoge, world";
  hello(str);
  console.log(str);

 function hello(msg:string):void{
  msg.replace("hoge","hello");
 }

```
こちらでも、同じように「hoge,world」と表示されます。
Maltego使ってみた (ネットワーク調査ツール)

## 参考

* [Maltego : Wi-Fiハッキング＆クラッキング可能な「Kali Linux」が激ヤバ過ぎるツールな件 - NAVER まとめ](http://matome.naver.jp/odai/2143374749289800801/2143376135303036603)
* [Maltego on Ubuntu 14.04 - Ask Ubuntu](http://askubuntu.com/questions/503353/maltego-on-ubuntu-14-04)

## インストール

* 公式サイトから[Maltego CE](https://www.paterva.com/web7/downloads.php#tab-3)をDownload
    * Community 版は[Register](https://www.paterva.com/web7/community/community.php#tab-1)が必要。
    * 初回起動時に認証を求められます。
* Ubuntu 16.04.1では以下が必要でした。(jre8)

```
sudo apt install -y default-jre
```

## 使い方

* 起動したらHomeタブを `×` をクリックし閉じます。

![top.png](https://qiita-image-store.s3.amazonaws.com/0/25728/39f5cf90-571d-afe9-54e8-8ee447c33716.png)

* 左上の新規プロジェクトの開始っぽいアイコンをクリック

![1.png](https://qiita-image-store.s3.amazonaws.com/0/25728/2eeba466-03b5-4fda-15a8-4f7db7af17e1.png)

* 左側のアイコンをなにか真ん中にドラグアンドドロップします

![2.png](https://qiita-image-store.s3.amazonaws.com/0/25728/71c8c5ee-0f18-a1db-f86b-08609b055a23.png)

* 今回は`DNS Names`を選択しました。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/25728/a3a29086-965f-19c0-3b12-6418206d121f.png)

* 右側のDetailView内のエントリをダブルクリックすると編集画面になります。
* DNS Name を何か入力し 右下のOK をクリック

![4.png](https://qiita-image-store.s3.amazonaws.com/0/25728/daf82313-9a4e-a238-7d7e-770c23877c80.png)

* `DNS Name`を右クリックしおもむろに選択したら以下になります。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/25728/894bddd5-9f81-201c-a41c-d5821dd62b22.png)

使い方よくわからないですね。