OmniAICreator/Qiita-1.07M huggingface dataset:
PHPでメール受信してヘッダー情報をゴリゴリ成型したい

#PHPでstdinしたメールヘッダー情報を成型
```php
<?php
//PEARライブラリの読み込み
require_once("Mail.php");
require_once("mimeDecode.php");

//言語設定、文字コード設定
mb_language("Japanese");
mb_internal_encoding("UTF-8");

//標準入力
$stdin = file_get_contents("php://stdin");
```

**$stdin**にメールヘッダー情報をぶち込んでいるわけですがPEARの**Mail.php**や**mimeDecode.php**などのライブラリを利用して【件名】、【メール送信者】、【メール本文】、【添付ファイル】などの情報を抽出してそれをデータベースに登録したいのだけど、データベースへ登録した時に文字化けするわ、本文が空のまま登録されるわ(ここ重要！)、デバイス(メーラー)によって文字化けするヶ所が違うわで、もう訳わからん状態になってます。

8/25追記

```php
<?php
//PEARライブラリを使用して成型する為の準備
$params['include_bodies'] = true;
$params['decode_bodies']  = true;
$params['decode_headers'] = true;
//標準入力でヘッダー情報を$paramsへ代入
$params['input'] = file_get_contents("php://stdin");
$params['crlf'] = "\r\n";
//mimeDecodeクラスを使って$structureへ成型後の値を代入
$structure = Mail_mimeDecode::decode($params);

/*　中略　*/

//各変数の中身をテキストデータとして吐き出し
//予定としてはmimeDecodeクラスで成型した値が入る(けど、両方0バイト！)
file_put_contents("structure.txt", $structure);
file_put_contents("part.txt", $part);

//各種データがテキストファイルで吐き出される
file_put_contents("params.txt", $params['input']);
file_put_contents("subject.txt", $subject);
file_put_contents("mail.txt", $mail);
file_put_contents("body.txt", $m_body);

```

**$params**の各キーへPEARのライブラリを使用して成型してるわけですが、これの扱い方がいまいち解らない。解るところもあるけどもライブラリを2つ使用していることでどの値がどの変数のどのキーに入っているのかが理解できてない。**$structure**を*file_put_contents*で内容を吐き出すようにコードを書いているのだが**$structure**と**$part**の中身は空になるという。

オブジェクト指向がまだ全然理解出来てないのでそこがネックになっている気はするが解決策が解らない状態。**$structure**がオブジェクトだからテキストで吐き出せないのかな？**$part**はスコープが*foreach*内だけだから参照できないのかな？という感じです。

この問題は解決しなければ先に進めないので重点的にしていきます。


PEARライブラリの*Mail.php*の中身をある程度理解しないと成型できない気がするのでこっちの中身も少し見てどういった返り値が来てるのか、調べてみたいと思います。
Scalaでソースファイル(*.scala)をいきなりscalaコマンドで実行できる（Classファイルの生成無し）

　以下のように __scala__ コマンドを利用するだけです。__scalac__ コマンドを介さずにいきなり実行コマンド __scala__ でソースファイルを実行します。

　どこにも「FooBaa.class」や「FooBaa$.class」などのクラスファイルは存在しません。一時的にはどこかに作成されているのでしょうけど、それらの痕跡はどこに残っていないように見えます。

　ちょうどインタプリタ系のスクリプトを実行している感じに近いです。Scalaの対話型実行環境である __REPL__ のソースファイル版みたいな感じでしょうか？。
###実行コマンド
`> scala FooBaa.scala`
###実行結果
```
とびお　：　＜会社＞クラス の　従業員
まゆか　：　＜会社＞クラス の　従業員
```
###ソースファイル
```FooBaa.scala
class 人類 {}
class 人間 extends 人類 { println( "＜人間＞クラス" ) }
class 従業員 extends 人間 { println( "＜従業員＞クラス" ) }

class 会社[ A <: 人間 ]( 名前: String ) {
  println( f"$名前　：　＜会社＞クラス の　従業員" )
}

object Main extends App {
  val とびお = new 会社[ 従業員 ]( "とびお" )
  val まゆか = new 会社[ 人間 ]( "まゆか" )
}
```
　こちらのWebサービスで実行して確認することができます
###実行確認Webサービス
https://paiza.io/projects/ooeko-nrBvQMtraKYaFHkA
AV1 specification を読む (再構成と逆量子化) 

#AV1 specification 日本語訳

非可逆圧縮された変換係数を、予測値と元画像との差分である残差に戻すための処理です。

----
##再構成と逆量子化

本節では、逆量子化と逆変換を使ったブロックの再構成について説明します。

###逆量子化関数

本節では、逆量子化に必要な関数 get_dc_quant, get_ac_quant を定義します。

量子化パラメタはルックアップテーブルで求めます。

関数 dc_q(b) = dc_lookup[(BitDepth-8)>>1][Clp3(0,255,b)] と定義します。
dc_lookup は以下の通りです。

```C++
dc_lookup[3][256] = {
	...
}
```

関数 ac_q(b) = ac_lookup[(BitDepth-8)>>1][Clp3(0,255,b)] と定義します。
ac_lookup は以下の通りです。

```C++
ac_lookup[3][256] = {
	...
}
```

関数 get_qindex() は、カレントブロックの量子化インデックスを返します。

 * seg_feature_active(SEG_LEL_ALT_Q)==1ならば、以下の手順を適用します。
  1. data = FeatureData[segmant_id][SEG_LVL_ALT_Q]
  2. segmentation_abs_or_delta_updates==0ならば、data = base_q_idx + data
  3. return Clip3(0, 255, data)
 * そうではなければ、base_q_idx ｗ返します。

関数 get_dc_quant(plane) は、特定の plane のDC係数の量子化値を返します。

 * plane==0ならば、return dc_q(get_qindex() + deltaQYDc)
 * そうではなければ、return dc_q(get_qindex() + deltaQUVDc)

関数 get_ac_quant(plane) は、特定の plane のAC係数の量子化値を返します。

 * plane==0ならば、return ac_q(get_qindex())
 * そうではなければ、return ac_q(get_qindex()+ deltaQUVAc)

###再構成処理

再構成処理は、逆量子化・逆変換・再構成を処理するために呼ばれます。
この処理は、6.4.21節で説明した残差シンタックステーブル内の関数呼び出しで呼び出されます。

この処理の入力は以下の通りです。

 * 再構成するプレーンを指定する plane
 * カレント変換ブロックの CurrFrame[plane] 内の左上座標 x,y
 * 変換ブロックサイズ txsz

この処理の出力は、かれんとふれーむ　 CurrFrame の再構成された画素です。

再構成と逆量子化処理は以下の手順です。

dqDenom = (TxSz == TX_32X32) ? 2 : 1
n = 2 + txSz　（変換ブロックのlog2）
n0 = 1 << n （変換ブロックの幅）

以下の手順を適用します。

 1. Dequant[i][j] = (Tokens[i*n0 + j] * get_ac_quant(plane)) / dqDenom, i=0..(n0-1), j=0..(n0-1) 
 2. Dequant[0][0] = (Tokens[0] * get_dc_quant(plane)) / dqDenom
 3. nを入力として8.7.2節の2次元逆変換処理を呼び出します。逆変換出力は Dequant バッファに格納します。
 4. CurrFrame[plane][y+i][x+j] = Clip1(CurrFrame[plane][y+i][x+j] L Dequant[i][j]), i=0..(n0-1), j=0..(n0-1)

ステップ1,2のDequant配列にかかれる値は、8+BitDepthビットの符号付き整数で表現できる必要があります。
PHPでcase[式]を造りたい

こういう `_case` 関数があるといいな。あるのかな。無かったら作ろうか。

```php
<?php

use PhpCase\_case;

$x = 1;

echo _case($x % 3, $x % 5, $x % 15, function($when, $_) use ($x) {
    return $when($_, $_, 0)->then('FizzBuzz')
        ->when($_, 0, $_)->then('Buzz')
        ->when(0, $_, $_)->then('Fizz')
        ->else($x);
});

// => 1
```

絶対誰かが作ってる気がする。

[追記] 作った。

https://github.com/acro5piano/php-case
AV1 specification を読む (デコード処理：イントラ予測の解説)

#イントラ予測モードの図示

AV1 specification を読む (デコード処理：イントラ予測)について、図を交えて解説します。 
http://qiita.com/srmfsan/items/4e3936243baaf4975b82


AV1のイントラ予測は8方向＋TM予測＋DC予測で、H.264/AVCとほぼ同等です。
予測方向を示します。

![IntraDirection.png](https://qiita-image-store.s3.amazonaws.com/0/142927/db3b4311-be91-bbd6-64f3-db0232199a25.png)

予測ブロックサイズ＝変換ブロックサイズです。
予測ブロックに隣接する画素を使って、予測ブロック内の画素を生成します。

隣接画素は、1-2-1フィルタ・1-1フィルタ・単純コピーのどれかを適用します。
このページでの表記法は以下の通りとします。

![IntraNotation.png](https://qiita-image-store.s3.amazonaws.com/0/142927/3cc22bcb-abd0-3c92-5f06-546a7661cf70.png)

●で開始する矢印は隣接画素にフィルタを適用したものを、矢印の先の画素の予測値とするものです。
画素中心に●がある場合（上段）では、隣接３画素に1-2-1フィルタを適用します。
画素間に●がある場合（中段）では、隣接２画素に1-1フィルタを適用します。
単なる矢印（下段）では、フィルタを適用せずに画素をコピーします。

橙色の隣接画素は、その予測モードでブロックを予測する場合に参照される画素です。



では、順番に予測モードごとの処理をみていきましょう。

##V_PRED, H_PRED

V_PREDは垂直方向の予測、H_PREDは水平予測の予測です。
それぞれ、上・左の隣接画素の単純コピーです。

![IntraVH.png](https://qiita-image-store.s3.amazonaws.com/0/142927/91380c54-3550-7153-5b13-0b97dc212e63.png)

##D45_PRED, D135_PRED（45度方向の予測）

D45_PREDは右上-左下方向の予測です。
1-2-1フィルタをかけて予測します。
予測ブロック右下端だけは特殊で、1-3-0 フィルタとなります。
これは、右上方向の隣接画素の制限によるものです。

![IntraD45.png](https://qiita-image-store.s3.amazonaws.com/0/142927/8d3f487f-8cb6-6a3e-6d24-90a675f99872.png)

D135_PREDは左上-右下方向の予測です。
D45_PREDと同様、1-2-1フィルタをかけて予測します。

![IntraD135.png](https://qiita-image-store.s3.amazonaws.com/0/142927/aebe7136-c644-81ec-00e4-5e8c4b300ee0.png)

##D117_PRED, D153_PRED

斜め方向の予測です。
D117_PREDでは、偶数行と奇数行に分けて図示しています。
予測方向に対する隣接画素の位置に応じて、1-2-1フィルタ、1-1フィルタを使い分けていることに注意しましょう。

![IntraD117.png](https://qiita-image-store.s3.amazonaws.com/0/142927/069108aa-ef61-5635-c1ba-cf46295c8483.png)

D153_PREDはD117_PREDを90度回転させたものです。

![IntraD153.png](https://qiita-image-store.s3.amazonaws.com/0/142927/06c11f5a-3e71-e29a-d66f-bda537e19eb0.png)

##D63_PRED, D207_PRED

こちらも斜め方向の予測です。

D63_PREDでは、偶数列と奇数列に分けて図示しています。
予測方向に対する隣接画素の位置に応じて、1-2-1フィルタ、1-1フィルタを使い分けていることに注意しましょう。
また、連続する2行の画素値が同じになることにも注意しましょう。

![IntraD63.png](https://qiita-image-store.s3.amazonaws.com/0/142927/4105acb1-90d5-ae5f-b42d-e9f7cdab0f56.png)

D207_PREDはD63_PREDを90度回転させたものです。

![IntraD207.png](https://qiita-image-store.s3.amazonaws.com/0/142927/b469afe6-a866-798d-8580-6b00b45d0113.png)

##TM予測

TM_PREDは予測対象の画素の真上・真左・左上画素を使って予測します。
H.264のPlane予測、H.265のPlanar予測と似ていますが、予測対象ブロックが平面や曲面となるような予測ではありません。
傾きを予測するのではなく直接画素値を使用するので、隣接画素のテクスチャ情報を保存したまま予測することになります。

![intraTM.png](https://qiita-image-store.s3.amazonaws.com/0/142927/37829123-3323-9929-9c6c-3ed5fded9ab5.png)

##隣接画素の取得

イントラ予測では、予測モードに応じて予測ブロックの右上・上・左上・左の隣接画素を必要とします。
隣接画素は常に利用可能 (available) であるわけではなく、画面端・未処理ブロックなどのために利用できない (not available) 場合があります。

ここでは、どのように隣接画素を取得するかについて説明します。

・・・後で書く


----
中学２年がRailsでWebサービスを作ってみた


Twittter↓↓
**[ツイッター](https://twitter.com/_anharu)**

#中学生でWebサービスを作る方法
##1.TECHCAMPなどのプログラミングスクールを受講する
これが手っ取り早いです。これでWebサービスのことはほぼ理解し**Webサービスをつくれる**ようになりました。
##2.入門書を買う
私のおすすめの本はこれです。初心者向けで簡単に入門できます。しかしこれだけで**オリジナルなWebサービスを作ることは難しい**です。
[Ruby on Rails5　超入門](https://www.amazon.co.jp/Ruby-Rails-5-%E8%B6%85%E5%85%A5%E9%96%80-%E6%8E%8C%E7%94%B0%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798048321)
![](https://images-na.ssl-images-amazon.com/images/I/51GLBK7MuVL._SX385_BO1,204,203,200_.jpg)

#中学生が作ったWebサービス
##読書記録＆ランキングサービス
[URLはこちら](https://intense-waters-57765.herokuapp.com)
こんな感じです。
PC版
![キャプチャ.PNG](https://qiita-image-store.s3.amazonaws.com/0/188304/f64d1464-b04c-74d6-0b59-177e81d6c58c.png)
スマホ版
![キャプチャ1.PNG](https://qiita-image-store.s3.amazonaws.com/0/188304/d5d696ae-9a9f-effd-70bf-179a21015af9.png)
ソースコード: http://github.com/anharu2394/lib-log
まだエラーが多発しています。
すみません。出来るだけ早く解決したいと思います。




はてなブログで詳しく見る↓↓
[はてなブログ](http://programing-haru.hatenablog.com/)


## 追記

lib logは開発していません。
## 追記2 2018年11月14日

エンジニアのための情報共有サービス「たぐまる」をリリースしました。
http://tagmaru.me
なお、lib logは放っておいてます。
JWTAuth test

# Laravel 5.4 と JWTAuth テスト

## ソースコード

https://github.com/toknsi/apispacms

```php
        $userActingAs = factory(User::class)->create();
        //$this->actingAs($userActingAs);
        //echo $userActingAs->email;
        //echo $userActingAs->password;  
        //echo $userActingAs->id;                
        $token = JWTAuth::attempt(['email' => $userActingAs->email,'password'=>'secret']);
        $this->call('POST', '/api/contents', 
        ['json' => ' { "type": "string" }'] , [] ,[],
        ['HTTP_Authorization' => 'Bearer '.$token])
        ->assertStatus(200)->assertJson(['user_id' =>$userActingAs->id]);
```
JUMAN++, KNP, python(for pyKNP)を使うためのDockerコンテナを作りました。

# 目的

JUMAN++ と KNP を使って係り受け解析をしたかったのですが、手元にwindows PCしかないために、Docker for Windowsを使って環境構築しました。
手作業では辛い作業があったので、pyKNPも使えるようにしたかった。

## Dockerコンテナはこちら

[yusanish/jumanpp_knp](https://hub.docker.com/r/yusanish/jumanpp_knp/)

簡単な説明です。

- pythonの3-stretchを継承してます。
- 日本語化済み
- pyKNPは初期状態では入っていないです。
- デカイです。3GBあります…。

## 使い方

基本的には、コンテナの標準出力を繋いでコンテナ内のJUMAN++とKNPを利用します。
CMDには`/bin/bash`を指定してます。

```
docker run -it --name jumanpp_knp yusanish/jumanpp_knp:latest

root@CONTAINER_ID:~#
root@CONTAINER_ID:~# echo "今日のご飯はカレーです。" | jumanpp | knp
今日の═════╗　　　　　<体言><NE:DATE:今日>
        ご飯は═════╗　<体言>
          カレーです。<体言><用言:判><格解析結果:ガ/ご飯;ガ２/->
EOS
root@CONTAINER_ID:~#
```

## pyKNPを使いたいとき

[pyKNPのインストール方法はこちらをどうぞ。](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c#pyknp%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)

とても簡単なサンプル

```
>>> import pyknp
>>> knp = pyknp.KNP()
>>> knp = pyknp.KNP(jumanpp=True)
>>> result = knp.parse("今日の晩御飯はカレーだった。")
>>> result.draw_bnst_tree()
```

使用できる関数や変数に関しては、こちらに詳しくまとめてあります。
[pyKNPについてのメモ](https://gist.github.com/pizzacat83/f314d48bfd9c3f69757e40cee4805e9b)


## 参考文献・コード

- JUMAN++ のコンテナ [yamitzky/jumanpp](https://hub.docker.com/r/yamitzky/jumanpp/~/dockerfile/)
- [JUMAN++をPythonから使う](http://qiita.com/riverwell/items/7a85ebf95647eaf18a6c)
- [Dockerで立てたDebianコンテナの日本語環境を整えた](https://7me.oji.0j0.jp/2016/debian-locale-japanese.html)
TouchDesigner 処理が重くなっている個所を見つける方法


TouchDesignerのmap内で、どの個所のOPによる負荷が大きくなって処理速度に影響を及ぼしているのかを可視化してくれるContainerの紹介をします。

<img width="285" alt="pallet.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160720/d515ce66-b8f8-8742-0c99-1ddee3a0e853.png">

Palette内のTools->probeを負荷状態を調べたい階層のmap内にドラッグアンドドロップで設置します。
(作業中にPalletを消してしまった場合はtoolバーのDialog->Pallet Browserから開くことができます。)

<img width="448" alt="probenode.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160720/635719af-de21-cf57-803d-5d06d413a643.png">
＜probe Container＞
Ctrl+Pでprobeのウィンドウを開きます。


<img width="1122" alt="all.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/160720/b9183bab-1c5c-2baa-d750-a238a5d4a99a.png">

上の画像で、左下に設置しているprobe windowから負荷がかかっている位置を視覚的に見つけることができます。ピンの根本が赤色に近いほど処理が重くなっています。
画像では中央上部のあたりの処理が重そうだということがわかります。

プロジェクトの軽量化を行う際にぜひ使ってみてください。
【Arduino】GROVE 超音波距離センサモジュールをArduinoUNOで使ってみる【電子工作】

# 環境

[Arduino UNO](https://www.switch-science.com/catalog/789/)
[Groove 超音波センサーモジュール（Grove Ultrasonic Ranger）](https://www.switch-science.com/catalog/1383/)

# ハードの接続
余り考えずに購入したのですが、[Grove ベースシールド](https://www.switch-science.com/catalog/1293/) を使うと接続が簡単だったようです。

が、買ってないのでジャンパーワイヤーで直接つなぎます。
[メーカーのサイト](https://www.seeed.cc/project_detail.html?id=241)にブレッドボードで繋いでいる画像があったので参考にしようとすると、どうやらこのセンサーモジュールはV2.0で説明にあるのは前バージョンなのか、基盤に書いてある文字が違います。
説明には「echo pin」とか「Trigger pin」とかいてあるけどそんなのは書いてない。
手元のセンサーにはGND,VCC,NC,SIGと書いてあります。

GNDはGNDに、VCCは5Vにつなぐのはなんとなくわかりますが、なにせ電子工作初心者なのでNCってなに感じです。
ググってみると、どうもNCは使わない記号ぽい？のでSIG（Signalの略と推測）をつなげばよいと考え、 Degital７ピン[^1] に接続します。
[^1]: 7ピンに接続したのはサンプルスケッチに `Ultrasonic ultrasonic(7);` とあったからなんとなく予想

# スケッチ
メーカーサイトからライブラリを[ダウンロード](https://github.com/Seeed-Studio/Grove_Ultrasonic_Ranger/archive/master.zip)してArduinoIDEのlibrariesフォルダに配置します。
ArduinoIDEを起動してサンプルスケッチ「UltrasonicDisplayOnTerm」をArduino UNOに書き込みます。

# 結果
うまくいったようで、シリアルモニタに測距した結果が表示されました。
定規をあてて確認してみましたが、それほどずれはないようです。

<img width="500" alt="代替テキスト" src="https://qiita-image-store.s3.amazonaws.com/0/198489/2f834408-2b94-3628-98a7-8c0c402ab89f.png">
「キーリングに必要なキーがありません」の対処法

`sudo pacman -Syu`を実行しようとしたとき、以下のエラーがでて更新ができない場合の対処法

```
error: key "A..." could not be looked up remotely
エラー: キーリングに必要なキーがありません
```

## 対処法

https://bbs.archlinux.org/viewtopic.php?id=193382

上記サイトを見ると、以下のコマンドを実行すると正常に更新ができたとあります。

```bash
$ sudo pacman -S archlinux-keyring && sudo pacman -Syu
```

また、上記コマンドを実行して、以下のようなエラーが出ることがあります。

```
エラー: 処理を完了できませんでした（衝突しているファイル）
ca-certificates-utils: /etc/ssl/certs/ca-certificates.crt がファイルシステムに存在しています
エラーが発生したため、パッケージは更新されませんでした。
```

その際は、以下のように、エラーメッセージに記載されているファイルを一旦削除した上で実行し直せばうまくいきます。

```bash
$ sudo rm /etc/ssl/certs/ca-certificates.crt
```
Haskellで二重ループ的なこと

[エンジニアとして世界の最前線で働く選択肢](https://www.amazon.co.jp/dp/B01626P712/) という本にあったコーディング面接の問題を、勉強がてらHaskellで解いてみた。

ちなみに原文ではJavaを使って3パターンの実装方法を示している。
その中で最も単純な、二重ループを使った `o(n^2)` の解法を再現した。

# お題

入力として、intからなる配列と、ターゲットとなる数が一つ与えられます。
和がターゲット数となるような2つの数を配列から取り出す関数を書いて下さい。

補足

- 返り値は、整数値(Int) 。片方がわかればもう片方は自明だから
- 複数ある場合も、一つを返せば良い
- 無かった場合は 0 を返す
- 同じ値は使えない
- 入力の配列はソートされていない

# 実装

```main.hs
hasPartner :: Int -> Int -> [Int] -> Bool
hasPartner _ _ [] = False
hasPartner t x (y:ys)
    | x + y == t = True
    | otherwise = hasPartner t x ys

getPair :: Int -> [Int] -> Int
getPair _ [] = 0
getPair t (x:xs)
    | hasPartner t x xs = x
    | otherwise = getPair t xs

main :: IO ()
main = do
    print $ hasPartner 5 2 [2, 3] -- => True
    print $ hasPartner 10 2 [2, 3] -- => False
    print $ getPair 6 [3, 2, 1, 3] -- => 3
    print $ getPair 10 [1, 2, 3, 2, 5, 3] -- => 0
```

[追記]

@hirakata さんに教えて頂きました！
わずか3行、一つの関数だけで処理が書けます。
こちらの方が簡潔で、めっちゃいいと思います。

```hs
import Data.List (tails)

getPair :: Int -> [Int] -> Int
getPair t xs = case [n | (n:ns) <- tails xs, n' <- ns, n + n' == t] of
    (n:_) -> n
    [] -> 0

main = do
    print $ getPair 6 [3, 2, 1, 3] -- => 3
    print $ getPair 10 [1, 2, 3, 2, 5, 3] -- => 0
```

[/追記]

# メモ・感想

- for文が無くてもプログラムって書けるんだな
- 再帰が書けるようになってくると楽しい
- 原文では見つからなかった時に `ValueNotFoundException` を投げている。例外の投げ方は後で勉強しよう
- もっと良い書き方がある気がするので教えてもらえたら非常に喜びます
Pythonでデバッグしたい

Pythonはエラー発生時にスタックトレースを表示してくれるのはいいのですが何分どこがいけないのかがよくわからない。

そこで、Pythonスクリプトでデバッグを行う方法をメモしておきます。

下記サイト様が非常に簡単にまとめてくださっていたのですが、デバッグ用語に関する細かい説明がなかったため、補足説明を加えさせていただきます。
http://racchai.hatenablog.com/entry/2016/05/30/070000

Pythonでのデバッグは、pdbモジュールを使用します。

使い方は簡単。怪しげな場所の直前に、下の一行を追加するだけ。

```
import pdb; pdb.set_trace()
```

この状態でスクリプトを実行すると、当該箇所で対話型デバッガが起動します。
あとはひたすら`step`コマンドを打って一行ずつ実行していきます。（これを**ステップイン**といいます）
また、デバッグ中に変数の中身が見たい場合は、`p`コマンドを使用します。`p hoge`と打ち込むと`hoge`に格納されている値を確認することができます。

# コマンド早見表

|コマンド|説明|備考|
|---|---|---|
|s(tep)|ステップイン（行単位で実行）|処理中に関数に入った場合は関数内でも1行ずつ停止する|
|n(ext)|ステップオーバー（行単位で実行）|関数呼び出しも含めて1行を一気に実行する|
|r(eturn)|ステップアウト（関数単位で実行）|実行時の関数が返るまで実行する|
|l(ist)|現在行前後のソースの表示||
|a(rgs)|現在いる関数の引数を表示||
|p|変数の値をチェック|`p hoge`といった風に使う|
|c(ontinue)|次のブレークポイントまで実行||

# 参考サイト
http://docs.python.jp/2/library/pdb.html
http://racchai.hatenablog.com/entry/2016/05/30/070000
Javaプログラミング基礎の練習～for文で三角形を表示させたい②

新人の時に作ったプログラムを、2年目になった今作ってみました。
再びfor文。[前回の記事](http://qiita.com/salmonosushi/items/6065797b3ba0d2e52c3f)のつづきです。

結論：
理系同期に手伝ってもらいながら、何とか完成

#問題
* ソースファイル名「Check32.java」
* 頂点の高さを整数で入力します
* 以下の実行結果のように、「*」を使って入力した高さの三角形を表示します

```
三角形の高さを入力してください
5
*
**
***
****
*****
****
***
**
*
```

#実装

以下のように作りました。

```Check32.java
package practice;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Check32 {

	public static void main(String[] args) {
		BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("三角形の高さを入力してください");
		String line;
		try {
			line = reader.readLine();
			int hight = Integer.parseInt(line);
			for( int i = 0; i < hight; i++) {
				for (int j = 0; j < i ;j++) {
					System.out.print("*");
				}
				System.out.println();
			}
			for( int i = hight; i > 0; i--) {
				for (int j = 0; j < i; j++) {
					System.out.print("*");
				}
				System.out.println();
			}
		} catch (NumberFormatException e) {
			System.out.println("整数を入力してください");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}
```
#感想
「j < i」にすることを、思いつきませんでした。
あとはfor文を書くときに、ついつい、
for( 初期設定 ; <b>終了条件</b> ; 継続処理 ){　}
と書いてしまい、思った通りに動作しないということがありました。
【Laravel】【DDD】ちょっと待って！そのEloquent、本当にドメインモデルにしちゃって大丈夫？

## お題目
- Eloquentはとっても便利！
- あまりにも便利なのでEloquentをそのままドメインモデルにしたくなっちゃう！
- でも、何も考えずにドメインモデル化すると酷い目に合うかも…？

## なんで？ 何がいけないの？
Eloquentが扱う問題領域（DB操作）は本来インフラストラクチャ層が正解。
つまり、Eloquentをドメインモデルとして扱ってしまうと、レイヤー構造（≒責務の範囲）の侵犯による副作用が発生する。

## つまり…どういうことだってばよ？
### 1.他層のDB操作に歯止めが掛からなくなる　
ドメインクラスを経由すればどこでもDBを弄れるので、最悪だと「アプリケーション層からInsertを書く」なんて芸当が可能。
「ヘボグラマーが各種バリデーションやエラー処理を迂回してDBにダイレクトアタックできてしまう」と言い換えると危険性が伝わりやすいかも？
ユビキタス言語なんて知ったこっちゃねえSQLは高級言語だ世界共通だ、という文化圏の人間でもなければオススメできない世界である。（SIだと稀に見かけるから笑えない）　

### 2.多重責務にEloquentが肥え太る
DBと直接折衝するクラスは取り扱うデータ種が多くなりがち。
データの種類≒扱う責任の種類なので、意識しなければコード量があっという間に肥大していく。
「Order」なんてヘビーなテーブルを扱うEloquentにドメインロジックを生やしてしまえば…後はわかるな？
DDDで推奨される「低粒度なドメインクラスへの分割＆マッピング」は、このような問題を強制解決する効能もある。


## まとめ
- インフラストラクチャ層はRepositoryを通じてドメイン＆アプリケーション層から隠蔽しよう！（教科書的発想）
- 問い合わせ条件を上手に取り扱いたい場合は[Specificationパターン](http://phpmentors.jp/post/54629162352/practical-ddd-1-specification)が便利だよ！
- とはいえ、小〜中規模システムならEloquentをドメインモデル化した方がコストメリット的に有利なことも事実（小声）  
 - 「そもそもフルスペックのDDDって必要だっけ？」という問いも時には必要
 - どうせ使うならLaravelっぽくGlobal Scopeを活用してモデルを細分化しよう！（[参考：Laravelでつくる、深くて表現豊かなモデル - Eloquent\Model を継承はするが、テーブルと一対一で対にならないクラス](http://qiita.com/nunulk/items/0820fd19690066d092d5#eloquentmodel-%E3%82%92%E7%B6%99%E6%89%BF%E3%81%AF%E3%81%99%E3%82%8B%E3%81%8C%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB%E3%81%A8%E4%B8%80%E5%AF%BE%E4%B8%80%E3%81%A7%E5%AF%BE%E3%81%AB%E3%81%AA%E3%82%89%E3%81%AA%E3%81%84%E3%82%AF%E3%83%A9%E3%82%B9)）

## オマケ：？？？「キサマはRubyistを嘗めたッッッ」
「キサマ等のいる場所は既にRailsが2000年前に通過した場所だ！（訳：[「マジックビーンズ sql」](https://www.google.co.jp/search?hl=ja&q=%E3%83%9E%E3%82%B8%E3%83%83%E3%82%AF%E3%83%93%E3%83%BC%E3%83%B3%E3%82%BA+sql)で検索するとより詳しくこの問題について調べられるよ！）」
Docker + nginxでLet's Encrypt

[合同会社kumanote](https://kumano-te.com/)のTanakaです。

今回は自社HPを[Let's Encrypt](https://letsencrypt.org/)を使ってHTTPS化したので、そのメモになります。
**オープンソースのため、無料**で実施できます。

[docker で全自動 Let's encrypt - Qiita](http://qiita.com/kuboon/items/f424b84c718619460c6f)これとかすごいんですが・・・
後々のことを考えて、自分で[certbot](https://certbot.eff.org/)使ってやってみることにしました。

## nginxのDockerfile

ポイントとしては以下です。

- certbot をインストール
- cron を使って `certbot renew` を行い、証明書のリフレッシュ

```Dockerfile
FROM debian:jessie
MAINTAINER kumanote,LLC.

RUN apt-get update && \
  apt-get install -y apt-transport-https nginx

RUN echo "deb http://ftp.debian.org/debian jessie-backports main" >> /etc/apt/sources.list
RUN apt-get update && \
  apt-get install -y certbot -t jessie-backports

RUN mkdir -p /var/www/kumano-te.com

RUN apt-get update && apt-get install -y cron
RUN echo '00 0 * * 6 root /usr/bin/certbot renew >> /var/log/cron.log 2>&1' >> /etc/cron.d/certbot-cron
RUN chmod 0644 /etc/cron.d/certbot-cron
RUN touch /var/log/cron.log

EXPOSE 80 443

CMD cron && nginx -g 'daemon off;'
```

## docker-compose.yml

container内の`/var/www/kumano-te.com`フォルダと`/etc/letsencrypt`フォルダをマウント（volume）しておきます。
その状態で、nginxのコンテナを立ち上げます。

この際、nginxのhttpのconfファイルに以下を記載しておきます。（`/.well-known/acme-challenge/`配下を読み取れるようにするため）

```
    location ^~ /.well-known/acme-challenge/ {
        root /var/www/kumano-te.com;
    }
```

そのコンテナに`/bin/bash`で接続します。

```
docker exec -it XXXXX /bin/bash
```

その後、以下を実行して鍵を作成します。

```
certbot certonly --webroot -w /var/www/kumano-te.com -d kumano-te.com -d www.kumano-te.com
```

ここまでで、コンテナ内の`/etc/letsencrypt`フォルダにわらわらとファイルが作成されています。

## sslのnginx.confの作成とコンテナ再起動

最後に、以下のように、ssl用のnginxのconfファイルに追記して、コンテナを再起動します。
上の手順で作成された、鍵を利用します。

- /etc/letsencrypt/live/kumano-te.com/fullchain.pem
- /etc/letsencrypt/live/kumano-te.com/privkey.pem

```
    ssl on;
    ssl_certificate            /etc/letsencrypt/live/kumano-te.com/fullchain.pem;
    ssl_certificate_key        /etc/letsencrypt/live/kumano-te.com/privkey.pem;
    ssl_prefer_server_ciphers  on;
    ssl_ciphers                'ECDH !aNULL !eNULL !SSLv2 !SSLv3';
    add_header                 Strict-Transport-Security "max-age=31536000; includeSubdomains";
```

これで、はれてhttps化を行うことができました。

以上になります。
Visual Studio 2015 Express for Windows Desktop 日本語版

Visual Studio 2105 Express for Windows Desktop 日本語版を探すの苦労したので共有
ここから、[ダウンロード](https://www.visualstudio.com/ja/post-download-vs/?sku=xdesk&clcid=0x411&telem=ga#)する
wdexpress_JPN__1119885877.1503402606.exeをダウンロードして実行するとインストーラが起動してインストールが始まる。
但し、必要なパッケージをダウンロードしながらインストールなので遅い・・・
せっかくなのでオフラインでインストールできるようにしたい。。。

以下のコマンドをコマンドプロンプトで実行すると、インストールに必要なファイルがダウンロードされる。
ファイル名が長いのでリネームして、wdexpress_JPN.exe をD:ドライブ直下に格納したと想定して、

```
D:\>wdexpress_JPN.exe /layout
```
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/197306/1181793a-c100-f59b-b731-e7979feb64fe.png)
ダウンロード先を指定してダウンロード...
最後の「オプション項目」のダウンロードにやたらと時間がかかる・・・
環境にもよるだろうが、1時間30分かかったorz　9.18GB あります。

# 追記
久しぶりに覗いたら、ここから[ダウンロード](https://www.visualstudio.com/ja/post-download-vs/?sku=xdesk&clcid=0x411&telem=ga#)できなくなってますね。最新版のダウンロードPageが表示されます。
以前のバージョンはここから[ダウンロード](https://visualstudio.microsoft.com/ja/vs/older-downloads/)できるようです。
Microsoftアカウントでのログインが求められます。

#### Visual Studio Subscriptions
Visual Studio以外の製品も色々とダウンロードできるようですが、肝心の「Visual Studio 2015 Express for Windows Desktop 日本語版」は見つかりませんでした。
代わりと言っちゃなんですが、「Visual Basic 2005 Express Edition 日本語版」はあるようです。
検索窓に「Visual Basic 2005 Express Edition」と入力して検索してみてください。
![スクリーンショット 2024-12-27 101615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197306/ad839dd0-9a6e-d160-07b3-2b624376d3c2.png)
OpenCVで顔にモザイクをかけてみる

[前回](http://qiita.com/haseshin42/items/29d5fa87074463d00cf3)は認識した顔を四角で囲うところまでやってみました。今回は、顔にモザイクを書けてみたいと思います。

##モザイクのアルゴリズム
モザイクは画像のサイズを一度小さくし、元の画像サイズに単純に拡大することで簡単に実装できます。縮小時に画素の平均値が取られたりしているわけですので、実際のアルゴリズム自体はもう少し複雑ですが、処理自体は単純に縮小→拡大してあげればOKです。

以下のようなコードになります。

```python
for rect in facerect:
    #矩形描画
    cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), (255,255,255),3)
    #顔部分の画像の切り出し
    cut_img = img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
    #20分の1のサイズに縮小
    cut_img = cv2.resize(cut_img,(rect[2]//20, rect[3]//20))
    #元のサイズに戻す。cv2.INTER_NEARESTを使わないと滑らかになる。
    cut_img = cv2.resize(cut_img,(rect[2], rect[3]),cv2.INTER_NEAREST)
    #切り出した画像で元の画像を置き換え
    img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]=cut_img
```
python2.7系と3系だと少しコードの書き方が異なります。3系ですと、rect[2]/20ではなくて、//を使う必要があります。また、cv2.INTER_NEARESTもpython2だとcv2.cv.cv_INTER_NNになる点に注意です。

また、imgは[y:y+h,x:x+w]と、顔の配列の(x,y,w,h)と順番が異なることにも注意しましょう。

最終的には以下のようなコードになりました。

```python:mosaic.py
# -*- coding: utf-8 -*-

import cv2
import time

cascade_path="D:\python\OpenCV\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml"
window = "Push ESC key to stop this program"

def detect_face(img):
    cascade = cv2.CascadeClassifier(cascade_path)
    facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
    
    #顔の数だけ処理
    if len(facerect) > 0:
        for rect in facerect:
            #矩形描画
            cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]), (255,255,255),3)
            
            cut_img = img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]
            cut_img = cv2.resize(cut_img,(rect[2]//20, rect[3]//20))
            cut_img = cv2.resize(cut_img,(rect[2], rect[3]),cv2.INTER_NEAREST)
                  
            img[rect[1]:rect[1]+rect[3],rect[0]:rect[0]+rect[2]]=cut_img
    cv2.imshow(window, img)
    print(facerect)

if(__name__ == '__main__'):
   
    # デフォルトカメラは0
    capture = cv2.VideoCapture(1)
    
    # キャプチャ処理
    while(True):
        key = cv2.waitKey(5)
        if(key == 27):
            print("exit.")
            break
        
        # 画像キャプチャ
        ret, img = capture.read()
        
        # 取り込み開始になっていなかったら上の処理に戻る
        if(ret == False):
            print("Capture Failed. ")
            break
        
        #顔検出
        detect_face(img)      
        time.sleep(0.050)
    
    capture.release()
    cv2.destroyAllWindows()
```
実行してみましたが、無事に顔にモザイクがかかりました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/117736/594180ee-0d1e-7b26-4037-d09b0cb3bce5.png)

##まとめ
今回は認識した顔にモザイクをかけてみました。一見複雑そうな画像処理もシンプルなアルゴリズムで実現できるケースがあるのですね。これまではサンプルに付属した分類器を利用していましたが、次回は、この分類器を自分で定義してみたいと思います。

注：動かしてみると、たまに止まるのでこのプログラムには何処かに問題があると思われます。
【Javascript】Knockout.jsでclickバインディングを使うとcheckedバインディングが機能しなくなる！！【初心者向け】

# 本記事の内容について

 Knockout.jsを使い始めた際に引っかかる click + checked　についての解説です。
というよりも自分が嵌ったので調べた結果です。

# まずはそれぞれ実装してみる

　取り敢えずそれぞれのバインディングを実装してみます。

## checkedについて

> checked バインディングは ViewModel のプロパティと チェックボックス (<input type="checkbox">) や ラジオボタン (<input type="radio">) などのチェックできるフォーム部品をリンクします。
ユーザが関連付けられたフォーム部品にチェックを入れると、ViewModel の値が更新されます。 反対に、ViewModel の値を変更することでフォーム部品のチェック状態を変更することができます。

参考：[Knockout.js 日本語ドキュメント](http://kojs.sukobuto.com/docs/checked-binding)

### checkedを実装

``` html:test.html
 <label><input type="checkbox" data-bind="checked: isChecked" />テストチェックボックス</label>
```

``` Javascript:test1.js
    var viewModel = {
        isChecked: ko.observable(true) // 最初はチェックされた状態
    };
```


この実装に関してはKockoutに関して少し調べた方なら特に問題はないと思います。

## clickについて

>click バインディングは関連付けられた DOM エレメントがクリックされたときに、 指定した JavaScript 関数を実行するイベントハンドラを追加します。 button や input、a などで最もよく使用しますが、 可視エレメントであればなんでも使うことができます。

参考：[Knockout.js 日本語ドキュメント](http://kojs.sukobuto.com/docs/click-binding)

要するに、バインディングされているform部品をクリックしたときにそのイベントハンドラを実行します。

### clickの実装

``` html:test.html
 <input type="button" data-bind="click: clicked">クリック</input><label data-bind="text: count"></label>
```


``` Javascript:test2.js

var viewModel = {
    count : ko.observable(0),
    clicked : function() {
        var previousCount = this.count ();
        this.count (previousCount + 1);
    }
};

```

ここも特に問題ないと思う。


# clickバインディングとcheckedバインディングを同時に使ってみる

 さて、ここまではそれぞれ１つの実装だったので問題はないと思います。では、ここからが本題で２つ同時実装してみようと思います。

## まずは普通に実装

``` html:test.html
 <label><input type="checkbox" data-bind="checked: isChecked,click:clicked" />テストチェックボックス</label>
<p data-bind="text: isChekd"></p>
```

``` Javascript:test3.js
var viewModel = {
    isChecked: ko.observable(false),
    clicked: function() {
       // 何かしらの処理
    }    
};
```

　これで実行してみても上手くいかない。clickは動いていると思いますが、checkedが正常に動作していないはずです。

## 何がダメなのか。原因は？？

knockout.jsの日本語ドキュメントを読んでみました。

>(注3) デフォルトのクリックの挙動を許可する
通常、Knockout はクリックイベントによるデフォルトの挙動を抑止します。 これは、もし a (リンク)タグに click バインディングを使用した場合、 例えば、ブラウザはハンドラ関数を呼び出すのみでリンク先への遷移は行いません。 通常は click バインディングにてリンクは、ハイパーリンクではなく ViewModel を操作するための UI 部品として使われるためこのような仕様となっています。
もしもクリックイベントのデフォルトの挙動を行わせたい場合は、 click のハンドラ関数にて true を返却してください。


つまり、正しく動作させたい場合は「tureを返せ」ということらしい。

## さっそく実装

``` Javascript:test3.js
var viewModel = {
    isChecked: ko.observable(false),
    clicked: function() {
       // 何かしらの処理
        return true; // ここを追加
    }    
};
```


今回はうまく動きましたね。
clickバインディングだけを実装してた時には気にも止めていませんでしたが、しっかりとドキュメントは読んだほうがいいなぁと今回のことで思いました。



# 参考
- [Knockout.js 日本語ドキュメント](http://kojs.sukobuto.com/tips/)
- [Knockout.js Checkbox checked and click event](https://stackoverflow.com/questions/22019571/knockout-js-checkbox-checked-and-click-event)
sota君のbuild&deployを楽にしてみる

## sota開発時に困ったこと
+ 自分自身Javaを書くのは１０年近くぶり
+ オフィシャルのサンプルコードがantを利用してデプロイしていて理解できなかった
+ eclipseのプロジェクト構成がよくわからなかった

## やりたいこと
せいぜい以下の内容です。簡単ですね。
+ build
+ jarにまとめる
+ sotaにdeploy
+ メニューからアプリを起動できるようにする

## 以下のリポジトリにベースとなるプロジェクトを置いてあります。
https://github.com/kunihiko-sugiura/gradle-sota-boilerplate

## 開発環境構築
mac環境を利用しています。

### Homebrew
Macのアプリケーション管理にHomebrewを利用します。
以下のurlを参照しインストールします。
https://brew.sh/index_ja.html

### Javaのインストール
```
brew update && brew cleanup
brew cask install java
```

#### インストール確認
```
/usr/libexec/java_home -V
```

#### 設定
```
vi .bash_profile
```

```
export JAVA_HOME=`/usr/libexec/java_home -v 1.8`
```

```
java -version 
```

### Gradleのインストール
```
brew install gradle
```


### Gradleの環境依存パラメータを設定
以下のファイルをコピーし環境依存設定を修正します。
```
cp gradle.properties.dest gradle.properties
```

## Build & Deploy

### Build only
```
gradle build
```

### Build & Deploy
```
gradle deploy
```

## Sota君のアプリケーション起動設定
```
vi /home/vstone/vstonemagic/app/jar/app.properties
```

```
length=<<登録アプリ数：デフォルト0>>
Debug=false
TimeZone=Asia/Tokyo

app1.title=<<アプリタイトル>>
app1.workingdir=<<実行ファイルが存在するディレクトリ>>
app1.jar=<<実行jarファイル>>
app1.type=app
app1.trigger=
app1.triggeroption=
app1.execoption=-Dfile.encoding=UTF8 -Djava.library.path=/usr/local/share/OpenCV/java/
```

再起動すると、メニューからアプリの起動が可能となります。

## 参考にさせて頂いた情報
http://qiita.com/yamarobo/items/5c71336b4dfa4c6c3c3e
Bash On Ubuntuでneovimをインストール。そしてpython3の設定



neovimのインストール

```
$ sudo apt-get install software-properties-common

$ sudo add-apt-repository ppa:neovim-ppa/unstable

$ sudo apt-get update

$ sudo apt-get install neovim
```

python3サポートの設定

```
$ sudo apt-get install python3-dev python3-pip

$ sudo pip3 install neovim
```

neovimを起動して

```
:echo has('python3')
```

が１となればOK

[Ubuntu 16.04にNeoVim を導入する](http://qiita.com/rkaneko/items/25de56f4fd3a05558d87)を参考にさせて頂きました。
プログラミングのライブラリパッケージ管理まとめ

アプリケーションパッケージ管理ではなくて，プログラミングライブラリ用ね！

- Node.js
NPM, https://www.npmjs.com/
Yarn, https://yarnpkg.com/lang/ja/
Yarnの中身はNPMで，NPMをもうちょっといい感じにするやつっぽい。基本はyarnでいいとか。猫でかわいいし。

-  Node-RED
Node-RED Library (中身はNPM)

- Ruby
RubyGems, gem, https://rubygems.org/


- Python
PyPI, https://pypi.python.org/pypi
pip, PyPA PyPI ???
http://www.yunabe.jp/docs/python_package_management.html

- .NET 用パッケージマネージャー NuGet
C#
http://yohshiy.blog.fc2.com/blog-entry-236.html

- C/C++ (gcc)
Conan, https://conan.io/
http://qiita.com/gasuketsu/items/6bea2465f0425c4cf5ab

- Arduino IDE
Library Manager, IDEから追加できる
リポジトリはGithub


- Java
Maven
Maven Central Repository, http://search.maven.org/

- Go
go get
Godep
Vendoring
Glide
参考: https://liginc.co.jp/305623


- D言語
ビルドツール DUB, dub, http://code.dlang.org/


- Perl
モジュール管理
cpan2rpm
Carton
参考: http://gihyo.jp/dev/serial/01/perl-hackers-hub/002102

- R
CRAN, install.packages()


- TeX
CTAN 
参考: https://texwiki.texjp.org/?CTAN

- LabVIEW
VIPM (VIパッケージマネージャ)
参考: http://www.ni.com/tutorial/12397/ja/


- PHP
composer, https://getcomposer.org
でもyumとかで入れちゃう。


### ついで

- xyzzy
NetInstaller, http://www7a.biglobe.ne.jp/~hat/xyzzy/ni.html


- emacs
package.el, Emacs 24.1から標準装備
初期リポジトリ: GNU Emacs Lisp Package Archive(ELPA)
追加リポジトリ: Marmalade
追加リポジトリ: MELPA
Cask
参考: http://syohex.hatenablog.com/entry/20140424/1398310931
Pallet
rdallasgray/palletはpackage.elとCaskを統合するライブラリ

- VIM
Vimのプラグインマネージャの種類と選び方
https://qiita.com/nil2/items/ddcf23f1163d0abd805b




### アプリケーションパッケージ

正確にはWikiを見るのが早い。ここでは更に全体像として。
https://ja.wikipedia.org/wiki/パッケージ管理システム

- Red Hat系 Linux (RHEL, CentOS, Fedora)
今はdnf (Dandified Yum)、装ったyumって感じの意味で、yumがpython2だったので、python3用にしたって感じ。
昔はyum (Yellowdog Updater Modified)Yellow Dog LinuxのYellowdog Updater (YUP)が前身とのこと。
さらに昔はrpm（yumの内部で動いている, rpm = Redhat Package Manager）
参考:https://qiita.com/aki3061/items/0350fe81337fa73dd561


- Debian系 (Ubuntu, Raspbianなど)
今はapt
ちょいまえはaptitude（apt-getやapt-cacheなどを統合しようとした）
その前はapt-get, apt-cache
昔はdpkg（aptの内部で動いている, Debian package）
参考:https://qiita.com/aki3061/items/0350fe81337fa73dd561

- Linux汎用系
snapdというのが出てきた。クロスプラットフォームなパッケージ管理ツール、ディストリビューションに依存せず汎用的に利用できるパッケージ管理システムらしい。
OpenCVで顔認識して四角で囲ってみる

さて、[前回](http://qiita.com/haseshin42/items/3aff7a84d4fe697f8815)はWindows上に構築したOpenCV+Pythonの環境でカメラの画像から顔を認識するところまでやってみました。今回は、認識した顔を四角で囲って表示してみたいと思います。

##矩形表示
OpenCVでは簡単に画像上に矩形を表示するメソッドが用意されています。その名も[rectangle()](http://docs.opencv.org/3.3.0/d6/d6e/group__imgproc__draw.html#ga07d2f74cadcf8e305e810ce8eed13bc9)です。(しかし、OpenCVのドキュメントは分かりにくいですね、、、)

```python
cv2.rectangle(img,pt1,pt2,color,thickness)
```
これで、img上にpt1を左上の頂点、pt2を右下の頂点とする矩形をthicknessの太さの線でcolorの色で表示します。

一方、顔認識の結果は以下のような配列で返されます。
[[258 224 217 217]]
左から、x,y,width,heightです。

pythonを初めて触るのでどうやってやるのが正しいのかなかなか分からなかったのですが、以下のようなコードに落ち着きました。

```python
 for rect in facerect
    cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),(255,255,255),3)
```
これで、cv2.rectangle(img,(258,224),(475,441),(255,255,255),3)と同じことになります。
もう少しスマートなやり方がありそうですが、とりあえず良しとします。

最終的には以下のコードになりました。

```python:facedetect.py
# -*- coding: utf-8 -*-

import cv2
import time


cascade_path="D:\python\OpenCV\opencv\sources\data\haarcascades\haarcascade_frontalface_default.xml"
window = "Push ESC key to stop this program"

def detect_face(img):
    cascade = cv2.CascadeClassifier(cascade_path)
    facerect = cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=1, minSize=(100, 100))
   
    #顔の数だけ処理
    if len(facerect) > 0:
        for rect in facerect:
            #矩形描画
            cv2.rectangle(img, tuple(rect[0:2]),tuple(rect[0:2]+rect[2:4]),(255,255,255),3)
    cv2.imshow(window, img)
    print(facerect)

if(__name__ == '__main__'):
   
    # デフォルトカメラは0
    capture = cv2.VideoCapture(1)
    
    # キャプチャ処理
    while(True):
        key = cv2.waitKey(5)
        if(key == 27):
            print("exit.")
            break
        
        # 画像キャプチャ
        ret, img = capture.read()
        
        # 取り込み開始になっていなかったら上の処理に戻る
        if(ret == False):
            print("Capture Failed. ")
            break
        
        #顔検出
        detect_face(img)
        time.sleep(0.050)
  
    capture.release()
    cv2.destroyAllWindows()
```
では、早速実行してみましょう。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/117736/16a39640-00e7-006d-ba46-986209eaf3f9.png)

スマホに有名なlennaさんの写真を移してカメラにかざしてみましたが、見事に認識し、四角で囲まれました！
##まとめ
今回は、認識した顔の上に四角を表示しました。OpenCVを用いることでこのようなことが簡単にできます。次回は単なる矩形表示ではなく、顔にモザイクをかけてみたいと思います。
python requestsでリトライ処理をする

ソース: https://stackoverflow.com/a/35504626

backoff_factorで指定した秒数xリトライ回数の分だけ間隔を空けてリトライしてくれる。以下の場合はリトライ1回目は1秒、2回目は2秒。
status_forcelistで指定されたステータスコードが返ってきた場合、もしくはタイムアウトした時にリトライする。
Retryへ指定できるパラメータは[ここ](http://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#urllib3.util.retry.Retry)に書いてある。


```python
import requests
from requests.packages.urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter

s = requests.Session()

retries = Retry(total=5,
                backoff_factor=1,
                status_forcelist=[ 500, 502, 503, 504 ])

s.mount('https://', HTTPAdapter(max_retries=retries))
s.mount('http://', HTTPAdapter(max_retries=retries))


r = s.request('GET', 'http://localhost:5000', timeout=2, headers={'Authorization': 'foobar'})
r.raise_for_status()
```

## 追記
[retry](https://github.com/invl/retry)というライブラリ使えば行けそう！と思ったけど、このライブラリだとステータスコードによる処理の振り分けとかができないみたい。
Raspberry PiとSORACOM Airで動画と連携するハードウェアを作る

Maker Faire Tokyo 2017で①ヒートガンでポップコーンを作り、②キャンディーを砕いて溶かしてポップコーンに色付けするという展示をしました。写真と動画はこちら。

https://sweetelectronics.wordpress.com/2017/08/09/mft2017/

私が担当したパートは

- srt.jsを使ってYouTubeの字幕としてハードウェアにコマンドを送信
- Raspberry Piでコマンドを受信して、接続されたソレノイドを駆動してキャンディを砕く
- 砕かれたキャンディを手作業で心を込めてフライパンで溶かす

というシステム構成で仕立てたのですが、多くの来場者から不思議がっていただきまして、特にRaspberry PiにSORACOMのSIMを挿してPusher（WebSocket）で待ち受けるという構成は様々なところで使えると思いますので、書いてみることにします。

# 事前にすること

## お買い物

スイッチサイエンスさんで入手できます。

Raspberry Pi 3
https://www.switch-science.com/catalog/2800/

SORACOMスターターキット
https://www.switch-science.com/catalog/2767/

## Pusherにお申込み

こちらを参考にしてください。
http://qiita.com/alingogo/items/a52dfccc2e4711c5f521

## PHPでPusherへ送る

こういうのを置いて、`push.php?text=1`にアクセスしてPusherのデバッグ画面に文字列が届いてると成功です。

```push.php
require_once('external/Pusher.php');

$pusher_ini = parse_ini_file("api.ini",true)["pusher"];
$text = $_GET["text"];

$pusher = new Pusher(
    $pusher_ini["key"],
    $pusher_ini["secret"],
    $pusher_ini["app_id"],
    ['encrypted'=>true]
);
$data['message'] = $text;
$pusher->trigger('test_channel', 'my_event', $data);
```

# Raspberry PiとSORACOM SIMが届いたら

## Rasberry Piをソラコムに認識させる

このあたりを参考に。
http://qiita.com/CLCL/items/95693f6a8daefc73ddaa

## node.jsでPusherから受け取り、Arduinoへ送信

こういうのを置きました。

```pusher.js
var Pusher = require('pusher-js/node');
var SerialPort = require('serialport');
var conf = require('config');
var fs = require('fs');

var sp = null;

// Arduinoが刺さっているポートを探索
var files = fs.readdirSync('/dev/');
files.forEach(function(file){
    if( file.match(/tty.usbmodem/) ){
        sp = new SerialPort('/dev/'+file, {
            baudRate: 115200
        });
    }
})

if( sp == null ){
    console.log("disconnected");
    return;
}else{
    var pusher = new Pusher(conf.app_id, {
        encrypted: true
    });
    var channel = pusher.subscribe('test_channel');
    channel.bind('my_event', function(data) {
        // 送られてきた文字が数字１桁のときだけArduinoに送信
        if( data.message.match(/^[0-9]$/) ){
            sp.write(data.message);
        }
    });
}

```

## Raspberry Piにサービスとして登録

このあたりを参考に。
http://qiita.com/yosi-q/items/55d6d3d6834c778ae2ea

# まとめ

Maker Faire Tokyoのようなイベントでネットワーク環境を構築するのも一苦労だし、構築してもWiFiもBluetoothも混線しがちで一苦労なところを、ソラコムの登場により一気に解決した気がします。
TinkerOS ヘッドレス利用 初期設定

TinkerBoardを購入したので早速初期設定します。
ヘッドレス利用(モニタ・キーボード・マウス接続なし)で利用するためにやることを記載します。


# 初期ユーザのパスワードを変更する

```
$ passwd
```
まずはじめに初期ユーザパスワードを変更します。

# ネットワークの設定をする

参考URL: https://www.debian.org/doc/manuals/debian-reference/ch05.ja.html#_the_legacy_network_connection_and_configuration

ヘッドレスで使う場合は旧来のネットワーク設定方法に従って設定します。
モダンなやり方でネットワークを設定してしまうとユーザログインするまではネットワークが使えないので
起動してもsshでログインできないので何もできなくなってしまいます。

```
$ sudoedit /etc/network/interfaces
```

# パッケージの更新と再起動

```
$ sudo su -
# apt update && apt upgrade -y && apt dist-upgrade -y && sync && reboot
```

# ホスト名変更

```
$ sudoedit /etc/hosts
$ sudo hostnamectl set-hostname <ホスト名>
```

新しいホスト名を/etc/hostsにも登録しておきます(sudoしたときに警告がでてしまうので)

# GUIモードからマルチユーザモードへ

```
$ sudo systemctl set-default multi-user.target
$ sudo /sbin/reboot
```
# パッケージの自動更新を有効にする

```
$ sudo apt install -V unattended-upgrades
$ sudo dpkg-reconfigure -plow unattended-upgrades
```

# xrdpをインストールしてRDPで接続できるようにする

```
$ sudo apt install xorgxrdp xrdp
```
【R】[shiny] [googleVis] shiny appにinteractiveな図を加える

# R × [googleVis]でinteractiveな図を描く

## はいけい

shinyに図を載せるにあたって、クリックしたり動かしたりできる図を描こうと思いました.

## かいけつさく

[c3.js](http://c3js.org/)でshinyにJavaScriptを組み合わせる方法を調べていたところ、
[googleVis](https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html) を使えば動的な図が描けるのを発見しました.

こちらのほうが敷居が低そうなので試してみます.

### 例　Bubble chart


Google Bubble Chart with R

data: データフレーム,X,Y,idvarの列が必要
idvar: IDに使う変数
xvar: x軸に表示する変数
yvar: y軸に表示する変数
colorvar	: バブルの色分けに使われれる変数
sizevar: バブルの大きさ
values in this column are mapped to actual pixel values using the sizeAxis option.

```r:app.R

library(googleVis)
library(shiny)

shinyApp(

# Server.R
server = server <- function(input, output) {
　
　#表示させるデータフレーム
  df_for_bubble <- read.csv(textConnection("
                              NAME,YEAR,VALUE,VALUE2,SIZE
                              A,2015,90,90,90
                              A,2016,80,95,80
                              A,2017,95,70,80
                              B,2015,80,50,50
                              B,2016,87,54,54
                              B,2017,75,50,50
                              C,2015,89,15,40
                              C,2016,82,16,30
                              C,2017,90,50,54 "))
  
  output$Bubble_Plot <- renderGvis({
    # 表示方法を書く
    Bubble <- gvisBubbleChart(df_for_bubble, 
                              idvar="NAME", 
                              xvar="VALUE",
                              yvar="VALUE2",
                              colorvar="YEAR", 
                              sizevar="SIZE",
                              options=list(
                                hAxis='{minValue:60, maxValue:100}',
                                vAxis='{minValue:0,maxValue:120}')
    　　　　　　　　　　　　　　　)
    return(Bubble)
  })
},
# ui.R
ui = ui <- fluidPage(
  titlePanel("Bubble Chart"),
    mainPanel(
      htmlOutput("Bubble_Plot")
  　)
  )

)


```

### 出力

カーソルを合わせるとpointの説明が出力されるバブルチャートが作成できました.
#### before

![bubble.png](https://qiita-image-store.s3.amazonaws.com/0/143058/38ed20b7-cdd6-9296-255b-46c466bc9a9e.png)

#### after
![bubble2.png](https://qiita-image-store.s3.amazonaws.com/0/143058/22f6915e-35e8-ec92-f346-017988d5c29f.png)

実際に動く様子は以下のアプリで確かめてみてください.

[googleVis_test](https://sasakik.shinyapps.io/GoogleVis_test/) 


## 参考


[First steps of using googleVis on shiny](http://www.magesblog.com/2013/02/first-steps-of-using-googlevis-on-shiny.html)

[googleVis examples](https://cran.r-project.org/web/packages/googleVis/vignettes/googleVis_examples.html)

[c3.js](http://c3js.org/)も平行してカバーしていきます
Electronで消えたAndroidSDKのGUIを復活させようとしている

Android SDK Tools v25から、公式GUIツールのandroid(android.bat)が非推奨になり、起動しようとしてもメッセージが出て代わりに**CUIならsdkmanagerを使え！GUIならAndroid Studioを使え！**と出るようになりました。
個人的にはSDKの操作のためにわざわざAndroid Studioを立ち上げるのは億劫だったため、公式GUIは非常にありがたかったのですが・・・。

**ないものは作れ。**

ということで、GUIを自作してみることにしました。

# 作ってるもの
<img width="676" alt="sdk.png" src="https://qiita-image-store.s3.amazonaws.com/0/44992/871690dc-15c4-0e94-7ee3-575f6182f3bd.png">

GitHubで公開中です。

Android SDK GUI
https://github.com/kuluna/androidsdkgui

といっても現時点(0.0.2)ではできることがAndroid Studio未満です。
ミニマムゴールは公式GUIとほぼ同じぐらいの使い勝手、プルスウルトラで視認性の良さやソートといった機能が追加できればいいなぁと思っています。

# 技術選定
まずツールとして最低限抑えておかなければならないのとして下記があります。

- Android SDKを操作できる  
ツールからローカルにあるsdkmanagerを実行できるようにしなければなりません。Webブラウザアプリではだめということですね。
- クロスプラットフォームに対応できる  
Windows、mac共にGUIツールが非推奨となってしまったので、両方に対応する必要があります。

この2つを考慮した結果、両方ともクリアできしかも割と最近の開発手法の恩恵を得られるものとして選んだのが**[Electron](https://electron.atom.io/)**です。

Electronであればローカルの実行ファイルを実行することができますし、クロスプラットフォームも容易に対応できます。そして最近のWebの技術も使うことができます。

Webのフロント側ですが、現在Angularを勉強中なのでAngularで書くことにしました。

# electron-forgeを使う
とはいえ最近のWeb側のカオスさもあるので極力コードを書くことに集中しつつ、めんどそうなのはよしなにやってくれそうなのはないかなーと探した結果、**[electron-forge](https://electronforge.io/)**を見つけましたのでこれを使っています。

electron-forgeを使えば、初期プロジェクトの作成から、開発モード実行(ライブリロードON)、パッケージ化までを全部やってくれます。
プロジェクトのテンプレートにAngularもあるのでまさにぴったりです。(もちろんReactやVueもあります)

Angularの場合はこのコマンドでプロジェクトが作成できます。

```bash
npm install -g electron-forge
electron-forge init my-new-project --template=angular2
cd my-new-project
electron-forge start
```

あとは普通にAngularでWebを開発するのと同じ感じでごーりごーり書いていきます。
普通のWebと違うのはchild-processとかをインポートできるところですね。child-processを使うことによってローカルのファイルを実行できます。

# プロジェクト作成後にやるといいもの
## Angularのバージョンアップ
まずAngularのバージョンを最新版にします。package.jsonを開き、`@angular`とついているものを最新バージョンにします。

```package.json
{
  "@angular/common": "^4.3.5",
  "@angular/compiler": "^4.3.5",
  "@angular/core": "^4.3.5",
  "@angular/platform-browser": "^4.3.5",
  "@angular/platform-browser-dynamic": "^4.3.5"
}
```

## @angular/router の追加
アプリ内でページ遷移をする場合はAngularでルーティングするライブラリを追加します。

```bash
npm install @angular/router --save
```

次にルーティング情報を書きます。通常はHTML5のHistoryAPIを使ってURLを書き換えるのですが、リロードした際はindex.htmlしかないので404になってしまいます。
なのでルーティングの方法をHistoryAPIではなく、URLの後ろにハッシュ(#)をつける方法に変更します。
`useHash: true`とすることで変更できます。

```approuting.module.ts
import { RouterModule, Routes } from '@angular/router';
.
.
.

const routes: Routes = [
  { path: '', redirectTo: 'sdk', pathMatch: 'full' },
  { path: 'avd', component: AvdComponent },
  { path: 'sdk', component: SdkComponent },
  { path: 'setting', component: SettingComponent }
];
@NgModule({
  imports: [RouterModule.forRoot(routes, { useHash: true })],
  exports: [RouterModule]
})
export class AppRoutingModule {}
```

あとは作成したモジュールを読み込ませれば完了です。

```app.module.ts
import { AppRoutingModule } from './approuting.module.ts';

@NgModule({
  imports: [
    AppRoutingModule,
    BrowserAnimationsModule,
.
.
.
```

# さいごに
Electron + Angularでやりたいことを実装できつつ、新しい開発手法で開発できているので**electron-forge**割とよさげです。

ただパッケージ化にwebpackとかを使っておらず、どうもTypeScriptで書いたものをそのまま実行できるように作っている感じがします。
アプリ実行時にいちいちトランスパイルする分パフォーマンスはどうかなと思ったのですが、今開発してる分に関してはあまり問題なさそうに感じます。
Bootstrap4で日本語を使ったときに不格好になるのを和らげる「jpn.css」をつくりました

Bootstrapで日本語を使うとものすごく残念な見た目になってしまうので、タイポグラフィ周りだけ調整して残念感を和らげてくれる**「jpn.css」**というものをつくりました。

![jpncss.gif](https://qiita-image-store.s3.amazonaws.com/0/57867/f58777d0-6363-71f7-2cb8-0f7cf9f66765.gif)

[GitHub](https://github.com/kokushin/jpn.css)、[npm](https://www.npmjs.com/package/jpn.css)にてMITライセンスで公開しております。使い方や実際のデモなどは下記のページでご確認ください。

[https://kokushin.github.io/jpn.css/](https://kokushin.github.io/jpn.css/)

## 技術的なお話

このままではただの宣伝になってしまうので技術的なお話を少々...

### フォントは「游ゴシック」を指定

jpn.cssで指定しているフォントは以下のような感じです。

```
$font-family-sans-serif: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", "游ゴシック Medium", "Yu Gothic", YuGothic, YuGothicMedium, "Hiragino Kaku Gothic ProN", Meiryo, sans-serif !default;
```

「游ゴシック」はWindows, Macともに新しいOSバージョンに共通で搭載されている美しい日本語フォントです。ただ、Windowsだと以下のようなバグがあるようです。

1. IE10, 11でフォントの下部に余分な空きができてしまう
2. Chromeでみた際にウェイトが細くなってしまう

上記の1の問題は、IE10, 11だけ「メイリオ」を適用させるという方法で解決しました。（[参考ページ](http://qiita.com/unagi-man/items/f309ffc0c661ef81c4e7)）
2の問題に関しては、Windowsには「游ゴシック Medium」を指定してあげることで解決できました。（[参考ページ](http://www.tomotanuki.com/entry/yugothic-weight)）

英語に関しては「Helvetica Neue」だけフォントの太さを調整しています。

### HTMLの言語が日本語のときだけスタイルを当てる

jpn.cssを使っている時点で日本のページだとは思いますが念のため。

下記のように属性セレクタを使うことで分岐できます(要SASS)。langがja以外だった場合はBootstrap標準のスタイルが適用されます。
これはわりと多言語対応の案件で使ったりするテクニックです。

```scss
.text {
  /* 標準のスタイル */
  font-size: 1rem;
  
  [lang=ja] & {
    /* 他の言語の場合にスタイルを上書き */
    font-size: .875rem;
  }
}
```

### npm script を使ってみた

今まではgulpなどタスクランナーでSASSのコンパイルを行っていましたが、今回はnpm scriptでSASSのコンパイル部分を書いてみました。

手順としては `node-sass` をインストール後、package.jsonに下記のscriptを追加します。

```bash
"compile": "node-sass --include-path scss [ソースファイル(*.scss)のパス] [書き出すファイル(*.css)のパス] --output-style expanded"
```

上記はscssファイルをcssへコンパイルして書き出すというシンプルなタスクです。
末尾の「--output-style expanded」はオプションで、CSSの整形方法を指定できます。

なので、リリース時など圧縮して使用したい場合はオプションを「--output-style compressed」として、buildタスクを作っておくと良いでしょう。

あとは、watchですね。
*.scssファイルを監視し、変更が加わったら勝手にコンパイルしてくれるようにします。
末尾に追加された「-w」というオプションがwatchのオプションになります。

```bash
"dev": "node-sass --include-path scss [ソースファイル(*.scss)のパス] [書き出すファイル(*.css)のパス] --output-style expanded -w"
```

上記コマンドが実行されている間は自動でコンパイルしてくれます。Ctrl+Cで解除できます。

これで「開発用のタスク」「リリース用のタスク」をつくることができました。
他にもシェルスクリプトが使えたり、もうちょい複雑な処理をかけたりするので、使いこなせるようになりたいですね。

## 今後の予定

ドキュメントページにもあるように、Bootstrap以外にも対応するフレームワークを増やしていきたいです。
あとは、全てのパターンでテストしきれていないので実際に使ってみて随時アップデートしてく必要がありそうです。

フォントサイズやマージン感は一応全て均等に調整しているつもりではありますが、どうしてもここが気になる・こうした方が良いんじゃない？などあれば是非、プルリクエストをいただけますと幸いです。
fastlaneの勉強 その2

[前回](http://qiita.com/sutchan/items/ab1b7d21cbc48e812d04)は、グローバルコマンドを調査した。今回は、実際にできることが何なのかを調べてみようと思う。
まず、fastlaneのドキュメントサイトを見てみることにした。

https://docs.fastlane.tools/getting-started/android/setup/

左カラムのメニューを見れば一目瞭然。
大きな機能として、*スクリーンショット*、*ベータデプロイ*、*アプリストアへの配信*がある。
これらのタスクを、コマンド一発で出来るようになる、という感じだろうか。

<img width="150" alt="スクリーンショット 2017-08-22 20.08.10.png" src="https://qiita-image-store.s3.amazonaws.com/0/75329/96265d1a-4fb7-6f15-8510-01b70c5134a7.png">


ひとつずつ、その中身を見てみようと思う。

# iOS

## スクリーンショット

* スクリーンショットの自動キャプチャ
    * 各端末サイズでキャプチャできる！（デザインチェックに有効）
    * UIテストとしても有効
* スクリーンショットのApp Storeへの自動アップロード
    * `fastlane deliver`コマンドが使えるらしい！
* `fastlane frameit`を使えば、端末のフレームとテキストを入れてストア用のスクショを作れるらしい
    * ImageMagicが必要

## ベータデプロイとアプリストア配信

ここではいろいろなアクションが利用できるようなので、これについては次回、まとめておこうと思う。
利用するコマンドは、`fastlane actions`