OmniAICreator/Qiita-1.07M huggingface dataset:
C#のシリアル通信練習

<img width="277" alt="キャプチャ.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/162162/2b39165a-fae5-26cc-0564-2ba33dc55646.png">

```C#:Form1.cs
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        string rxString;
        string comNum;

        public Form1()
        {
            InitializeComponent();

            foreach (var coms in System.IO.Ports.SerialPort.GetPortNames())
            {
                comBox.Items.Add(coms);
            }
        }

        private void startButton_Click(object sender, EventArgs e)
        {
            if (startButton.Text == "接続")
            {
                startButton.Text = "接続中";
                serialPort1.Open();

            }else if(startButton.Text == "接続中")
            {
                startButton.Text = "接続";
                serialPort1.Close();
            }
        }

        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
        {
            rxString = serialPort1.ReadLine();
            this.Invoke(new EventHandler(DisplayText));
        }

        private void comBox_SelectedIndexChanged(object sender, EventArgs e)
        {
            
        }

        private void DisplayText(object sender, EventArgs e)
        {
            textBox1.AppendText(rxString + Environment.NewLine);
        }

        private void comBox_TextChanged(object sender, EventArgs e)
        {
            comNum = comBox.Text;
            serialPort1.PortName = comNum;
            serialPort1.BaudRate = 19200;
        }

        private void sendButton_Click(object sender, EventArgs e)
        {
            string message;
            message = textBox1.Text;
            serialPort1.WriteLine(message);
        }
    }
}

```

```C#:Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    static class Program
    {
        /// <summary>
        /// アプリケーションのメイン エントリ ポイントです。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

```
Pythonのdictにおいて属性でのアクセスと挿入順の保持を実現する方法

Pythonの`dict`において、以下を実現する方法についてまとめます。

* 属性でのアクセス

```py:例
d.a = 1
```

* 挿入順の保持

#実現するオブジェクト
##属性でのアクセスのみ
`attrdict.AttrDict`で実現できます。
###インストール方法
```bash
$ pip install attrdict
```
##属性でのアクセスと挿入順の保持
`collections.OrderedDict`で実現できます。
###初期化の際の注意
以下のように記述すると順番が保持されなくなります。

```py:良くない例
# coding=utf-8
import collections

# メイン処理
if __name__ == '__main__':
    # 引数として要素を与えて初期化を行うと順番が保持されない
    d = collections.OrderedDict(a=1, b=2, c=3, d=4)

    # dのkeyとvalueを順番に表示
    for k, v in d.items():
        print('{} : {}'.format(k, v))

```

そのため、初期化を行いたい場合には以下のようにタプルにする必要があります。

```py:良い例
# coding=utf-8
import collections

# メイン処理
if __name__ == '__main__':
    # タプルとして要素を与えて初期化を行うと順番が保持される
    d = collections.OrderedDict((('a', 1), ('b', 2), ('c', 3), ('d', 4)))

    # dのkeyとvalueを順番に表示
    for k, v in d.items():
        print('{} : {}'.format(k, v))

```

#元ネタ
* [Pythonの辞書を属性としてアクセスできるようにする - Qiita](http://qiita.com/yutaka2487/items/a7c57960c2b6befa5edf)
* [別法： Pythonの辞書を属性としてアクセスできるようにする - Qiita](http://qiita.com/shiracamus/items/16fb4b3809dbd89c2f56#_reference-8b6c0e86935e21687823)

#参考文献
* [attrdict 2.0.0 : Python Package Index](https://pypi.python.org/pypi/attrdict)
* [python　OrderedDict便利だが注意が必要 | Shannon Lab](http://shannon-lab.org/?p=1743)
* [OrderedDictのバグ？ - kk6のメモ帳*](http://kk6.hateblo.jp/entry/20110914/1315983436)
ステージをランダムに移動させる


RPGの「始まりの街」でランダムに歩いているNPCみたいなやつ

## AIThirdPersonController
Ethanがもっている`AIThirdPersonController`を使用

※Ethanを削除して動かしたいキャラを`AIThirdPersonController`の配下に置くが、キャラにrigidbodyがついていると追従してくれないので設定しない

### NavMeshAgent
キャラがどのようにシーンを動くのかを決める

### AICharacterControl
`AICharacterControl`スクリプトのTargetに`WalkTarget`をセット
`WalkTarget`をランダムな位置に表示して、そこを目がけてキャラを動かせる

```c:RandomPosition.cs
﻿using UnityEngine;
using System.Collections;

public class RandomPosition : MonoBehaviour {

	void Start () {
		StartCoroutine (RePositionWithDelay());
	}

	IEnumerator RePositionWithDelay() {
		while (true) {
			SetRandomPosition ();
			// コルーチンを遅延させてから再開させる
			yield return new WaitForSeconds (5);
		}
	}

	void SetRandomPosition() {
		float x = Random.Range (-5.0f, 5.0f);
		float z = Random.Range (-5.0f, 5.0f);
		Debug.Log ("x,z: " + x.ToString ("F2") + ", " + z.ToString ("F2"));
		transform.position = new Vector3 (x, 0.0f, z);
	}
}
```

> 参考
https://github.com/oreilly-japan/unity-virtual-reality-projects-ja
Eclipseセットアップ・不具合対応メモ

いつかまた使う時の為のメモ。

# インストール

[公式サイト](http://www.eclipse.org/)または[Pleiades](http://mergedoc.osdn.jp/)の日本語化バージョンを入れる。
色々な言語をやりたい場合はとりあえずPleiadesから全部入りを落とせば良い。

## 入れておくと良い（かもしれない）プラグイン
|名称|備考|
|:------------------|:------------------|
|[Emmet](http://emmet.io/)|コードの入力を楽にするやつ|
|[Eclipse Color Themes](http://eclipsecolorthemes.org/)|インストール用URLは http://eclipse-color-theme.github.com/update 。他のテーマ機能を持つプラグインと競合するので注意|
|[EclipseCoder](http://fornwall.net/eclipsecoder/)|TopCoderを始めようと思ったので入れてみた。[此方の記事](http://d.hatena.ne.jp/gnarl/20100201/1264971398)を参考に入れる|

# EclipseをLaTeXエディタ・コンパイラとして使う

*このセクションはEclipseのバージョンはKepler、OSはMacのMavericksでの話。*

[TeXlipse](http://texlipse.sourceforge.net/)を使う。**既にコマンドラインでTeXがコンパイル出来る環境にあること**が前提。
自動Buildにチェックを入れておけば、.texの変更の保存操作だけでPDFまで作ってくれる。詳しい機能などは[Wiki](https://texwiki.texjp.org/?TeXlipse)を参照。

## TeXlipseのインストール
TeXlipseは他のプラグイン同様、Help→Install New Softwareからインストールできる。

|Name|URL|
|:--|:--|
|TeXlipse Update Site|http://texlipse.sourceforge.net|

検索すると三つほど出てくるが、全てにチェックを入れてインストール。

## コンパイラのパスを設定

Macのアプリケーションフォルダ内のUpTeXのパッケージ内のコンパイラを指定してもコンパイルできない。TeX Wikiさんがリスト化している/usr/texbin/uplatex等のパスを一つ一つ設定。引数の方も適宜変更。

此処の設定が上手くいかないと

>"jarticle.cls" not found

的なエラーが出る。

## デフォルトエンコードの設定

Eclipseの環境設定のGeneral→Content typeでTeXファイルを探し出し、.texを選択して下のエンコードを入力する欄にutf-8等、自分が使うエンコードを入力して適用。
.texの横にlockedとか書かれていますが多分気にしなくて大丈夫。

## 実行するコマンドの設定

![TeXlipse command](https://qiita-image-store.s3.amazonaws.com/0/150389/95d3f6e3-cbe5-2905-3fad-c2f2c4429c96.jpeg)

**プロジェクトごとに設定。**プロジェクトを作成する時か、作成してしまった後はメニューのProjectからプロジェクトのプロパティ設定で以下の様に設定。

|項目|設定|
|:--|:--|
|Output Format|PDF|
|Build commands|latex+dvipdf|

platex+dvipdfmじゃなくても、コンパイラの設定の方でUpTeXが指定されていれば大丈夫。

設定については此方の記事も[参考](http://ankyo.blog.so-net.ne.jp/2012-12-01)になる。

## Pdf4Eclipseについて

TeXlipseをインストールすると一緒に入る、Eclipse内で開けるPDFビューワは、日本語が文字化けする。
ビューワの設定は結局上手く出来なかった。

# [Aptana Studio](http://www.aptana.com/products/studio3/success_plugin.html)の不具合への対応メモ

FTP接続もEclipseでやりたくなったのだが他のプラグインと競合しやすいのか、エディタに不具合が出たのでアンインストールした。有効な策はわからない。

**アンインストールの際はエディタやUIのテーマをデフォルトに戻しておく**。でないと設定メニューから消えてしまって元に戻せなくなる。
効果的なフォームをデザインする

## はじめに
フォーム設計のミスについてよくまとまった記事です。デザイナーと開発者は必見だと思います。

## まとめ
### 横に広がらない
![](https://cdn-images-1.medium.com/max/2000/1*XhzxeTnAuWoaeJmlPBP0bw.jpeg)

### 項目表示はフォームの上に
![](https://cdn-images-1.medium.com/max/2000/1*tnR_OXAKMJW8S9cqRy416A.jpeg)

### 項目表示と入力欄はできるだけ近づける
![](https://cdn-images-1.medium.com/max/2000/1*obwyjb54NCWy3sOPfm2WEg.jpeg)

### 大文字にしない
![](https://cdn-images-1.medium.com/max/2000/1*w6nZOf5pZSha6FoWu3YtRw.jpeg)

### 選択肢が5つ以下ならドロップダウンにせず全て表示させる
![](https://cdn-images-1.medium.com/max/2000/1*VvQeOFsY57NJxtZmKyRnHA.jpeg)

### プレースホルダーをラベルとして使用しない
![](https://cdn-images-1.medium.com/max/2000/1*XvUnJwHtQhJ3Wl8Apj9lhQ.jpeg)

### チェックボックスは縦に並べた方が見やすくなる
![](https://cdn-images-1.medium.com/max/2000/1*VLqTEZP8OrH24FooksePbQ.jpeg)

### CTAを分かりやすく表示する
![](https://cdn-images-1.medium.com/max/2000/1*VzlN4tj2hQRUel2iNzM9dw.jpeg)

### エラーは埋め込みで表示する
![](https://cdn-images-1.medium.com/max/2000/1*-NXH_4cKK_ngIgrcqShTbg.jpeg)

### ユーザーが入力している最中にではなく「入力後」にエラーを表示させる
![](https://cdn-images-1.medium.com/max/2000/1*aGO8yGo2jqu9XgntfFvlsQ.jpeg)

### ヘルプ表示は隠さない
![](https://cdn-images-1.medium.com/max/2000/1*D2A7FGZdYdtt9YC1q7IAUw.jpeg)

### アクションにおける優先順位を示す
![](https://cdn-images-1.medium.com/max/2000/1*STZ7rbj0wO5u2sn0bsR-KQ.jpeg)

### アフォーダンスの観点から入力欄の長さを決定する
![](https://cdn-images-1.medium.com/max/2000/1*3rOjyzcj68Dm7badROWuxg.jpeg)

### 「*」は取り去り、「任意」にする
![](https://cdn-images-1.medium.com/max/2000/1*riNfOVAxTChvaQ29n-6IPQ.jpeg)

### 入力情報ごとにグルーピングする
![](https://cdn-images-1.medium.com/max/1600/1*nmeMIuW7csU9uVTB9BIBTg.jpeg)
就活をして思ったこと

こんにちは。きむちゃん。です

実は、僕は最初のうちは院進学100％で考えてたのですが、ある理由があり就活っぽいことをしていまいした。そこで感じたことがあったのでこれから就活の人の指針になればいいなと思って投稿させていただきました。

---
###ある理由とは
**院進学しても、2年間のビジョンがぶっちゃけよくみえない。**
そんな人は多いと思います（僕もそうでしたし）。そこで、企業を見ることによって院卒業後を考えることができます。逆算的に院の2年間でどういうことを自分ですれば良いかが見えてくるという理論で企業説明会などに参加してました。  

---
なんやかんやあり、就活の本質を感じたので書かせていただきます。    



#本当の自分が見つかる
就活すると自己分析しますよね、自己分析しなくても面接を通して勝手に自己分析されるようになってます。で、自分の内から本当に出る内的動機を大切にしてほしい。
就職する気がなくて開発意欲が湧かない人も、就活で本当に自分のやりたいことのヒントがつかめると思います。

#自分の生き方を見つけてほしい
社会人って人生の半分くらいの時間普通は属するものなのです。それをただの金稼ぎにするのはもったいなさすぎる。
[年収って1000万とかあってもそんなにいらないかなと思いました](http://gendai.ismedia.jp/articles/-/41296)
[エンジニアってそこまでお金に困んなくね？](https://tech-camp.in/note/1009/)
じゃあ、内的動機が湧く職場で働いたほうが満足度は高いなぁと。  
あと、面接とか落ちたっていうのは企業がこの人会社に合わないなって判断してくれたことなので、仮に入ってもあんまり満足はしないのかなと思うので気にしなくていいし、むしろ合わないところに行かなくてよかったと思います。

#業種で選ぶのではなく企業を見てほしい
本当に自分に合った企業は、企業をちゃんと見ないとわかんないです。
ので、いっぱい企業の情報を集めましょう。合同説明会とかぱぱっと企業の感じがわかって回転率早いので効率いいと思います。


とりあえずこんな感じです。なんとなーくどこでもいいやー。とか思ってる人は考え直してもいいんじゃないかなーって思います！それでは！
【Tips】意外と知らない？:nth-childで〇番目以降"且つ"偶数・奇数の指定をする小技【CSS】

# 書き方
```
li:nth-child(n+3):nth-child(even) {
  3番目以降の要素、且つ偶数のスタイル
}

li:nth-child(n+3):nth-child(odd) {
  3番目以降の要素、且つ奇数のスタイル
}
```
コードを見て分かる通り、「:nth-child」は連結して使うことが可能なようです。
なので、今回は「〇番目以降の要素、"且つ"奇数の時と偶数の時」という指定をしましたが、
この方法を使えば色々な**"且つ"**に使えそうですね。

# まとめ
「:nth-child」が連結出来るなんて全然知らなかったです...汗
パッと調べた限りではそういった記事を見つけられなかったので、誰かの為になればと思い書いてみました。

そして、昔であれば実現出来ることが少なかったですが、
「連結して書けば良いのでは？」と適当に書いたにも関わらず、思った通りの動きになってしまう便利な時代です（笑）
PAY.JPでのクレカ決済について、勉強会で発表しました

# 概略とか
世の中にはクレジット決済代行サービスなんていう便利なものがあるようで、クレカ決済処理を実装する際にPAY.JPというサービスを使って実装してみました。
その際の知見をまとめて勉強会で発表する機会を会社でいただけました。
[SlideShareへのリンク](http://www.slideshare.net/dcubeio/payjp)

内容としては、簡単に決済処理を行えるサービスであるPAY.JPを元に
* セキュアな処理であるクレジットカード決済処理はどのような仕組みで行われているのか
* 課金処理・外部サービス利用において気をつけなければいけない点
* ビジネス面で気をつけなければ行けない点（法律面・サービス停止時のデータ移行など）
* 実際の開発・運用の中で感じたメリット・デメリット
について説明しました。

こんな感じの大仰な告知文打ったところ、50名ぐらいが見に来てくださったので、感謝の限りです。
>『マネタイズ』
ネットサービスにおいて非常に重要な概念かと思います。

>顧客からサービス利用料をいただく際に実装必須な課金処理ですが、
システムの性質によって、求められる要件は大きく異なります。

>例えば、一般的な金融機関における決済処理のイメージは、、、

>* 厳密性が問われる機能であるため、テストを何重にもに行う必要がある
* 堅牢性を求められるため、絶対に落ちないような構成を取らなければいけない。
* セキュリティの関係上、あらゆる穴になりうる箇所に注意しなければならない。

>といったイメージがあるかと思います。
しかし、決済処理はWEBサービスにおいては、サービス上競争の源泉力にはなりえないので、なるべく工数をかけずに実装したいものです。
クレカ決済代行サービスを使うと上に記載したデメリットをとることなく
非常に手軽に決済処理の実装が行なえます。


# 思ったこと
* ハンズオン無しで45分ということで話す内容あるのかと思いましたが、業界の背景とか話すと意外とそのぐらいいく
* 勉強会の客層が、Web系が多いかと思いきや意外とほとんどおらず。決済サービス関連会社の人が見に来てくれていた（多分、実際のユーザが決済サービスをどんな目線で見ているのかに興味があったのではないかと思われます）
* 勉強会の準備とか、Qiitaへの投稿とか、なかなか大変。継続し続けている人は偉大だ。
Swift3 での vDSP_ctoz 引数キャスト

DSPComplex 配列から DSPSplitComplex に変換するための vDSP_ctoz の第１引数は DSPComplex 配列へのポインタです。しかしここには FFT の下準備としてサンプリングデータをそのまま渡すことがあり、以下のようなキャストをよく見かけたかと思います。

```swift
var samples: [Float]
//
var src = UnsafePointer<DSPSplitComplex>(samples)
//
vDSP_ctoz(src, 2, &complex, 1, fftsize_harf)
//
```

swift3 ではこれがエラーになるので、はて、どうしたものかと考えましたが、以下でいいようですね。

```swift
var samples: [Float]
//
var src = UnsafeRawPointer(samples).bindMemory(to: DSPComplex.self, capacity: fftsize_harf)
//
vDSP_ctoz(src, 2, &complex, 1, fftsize_harf)
//
```

この vDSP_ctoz の使い方自体が、もともとのサンプリングデータ列を DSPComplex の配列（real, image, real, image... の並び）に擬してコンバートするという裏技的な処理ですから、意図が見えて良いコードになったと言えますね。

この時、src の型は `UnsafePointer<DSPComplex>` になっています。

全体としては：


```swift
var realp = [Float](repeating: 0.0, count: fftsize_harf)
var imagp = [Float](repeating: 0.0, count: fftsize_harf)
var complex = DSPSplitComplex(realp: &realp, imagp: &imagp)
var src = UnsafeRawPointer(samples).bindMemory(to: DSPComplex.self, capacity: fftsize_harf)
vDSP_ctoz(src, 2, &complex, 1, fftsize_harf)
vDSP_fft_zrip(setup, &complex, 1, fftsize_log2N, FFTDirection(FFT_FORWARD))
```

こんな感じになります（いろいろ省略）。

## 環境

- Apple Swift version 3.0.2 (swiftlang-800.0.63 clang-800.0.42.1)
- Target: x86_64-apple-macosx10.9
【ev3dev】pythonでLCDにbmp画像を表示する方法


## はじめに
この記事は、EV3にev3devをインストールし、SSH接続できている状態であることを前提にしています。環境構築ができていない方はこちらの記事を参考にしてください。
>
[mindstorm-EV3をLinuxで制御しよう! ev3dev OSのインストールとSSH接続](http://qiita.com/murotani/items/46f905bec33b1673c41a)


## 概要
python製ev3devライブラリの[ev3dev-lang-python](https://github.com/rhempel/ev3dev-lang-python)を使ってLCD画面にbmp画像を表示する方法を紹介します。公式ドキュメントに書いてある方法ではうまく行かなかったので、この記事が参考になれば幸いです。

## bmp画像のダウンロード
LCD表示に適したサイズのbmp画像がライブラリのホームページに提供されていました。
zipファイルをダウンロードして展開し、EV3に保存しましょう。
[BMP image collection](https://sites.google.com/site/ev3python/learn_ev3_python/screen/bmp-image-collection)
![image_catalog.png](https://qiita-image-store.s3.amazonaws.com/0/149019/cd33013b-5fed-b737-1d9a-f7724e532471.png)

##失敗する方法
LCDにbmp画像を表示させてみましょう。

[公式ドキュメント](https://media.readthedocs.org/pdf/python-ev3dev/latest/python-ev3dev.pdf)にはimageメソッドが説明されています。
> 
### image
Returns a handle to PIL.Image class that is backing the screen. This can be accessed for blitting images to the screen.
Example:
```
screen.image.paste(picture, (0, 0))
```

しかし実行してみるとimageメソッドが定義されていないようでエラーが発生してしまいます。

```
robot@ev3dev:~$ python
Python 2.7.9 (default, Aug 13 2016, 17:33:18)
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
  
>>>from PIL import Image, ImageDraw, ImageFont, ImageOps
>>>import ev3dev.auto as ev3
>>> screen = ev3.Screen()
>>>logo = Image.open('test.bmp')
>>> screen.image.paste(logo,(0,0))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Screen' object has no attribute 'image'
```

##成功する方法

次のプログラムで上手く動きました。

```py:bmp_lcd.py

mport ev3dev.auto as ev3
from PIL import Image, ImageDraw, ImageFont, ImageOps

screen = ev3.Screen()
logo = Image.open('EV3_BMPs/Awake.bmp')
#screen.draw.bitmap((0, 0), logo.convert("L")) #色が反転してしまう
screen.draw.bitmap((0, 0), ImageOps.invert(logo.convert("L"))) # 成功

screen.update()
```

```logo.convert("L")``` で画像を8-bitピクセルのモノクロに変換しています。
しかしこの状態ではLCD表示した時に白黒が反転してしまう減少が起きるので```ImageOps.invert()``` を使って元に戻しています。

このように表示されました。
![awake.png](https://qiita-image-store.s3.amazonaws.com/0/149019/51f9fc2c-2323-86d1-bbad-7c3a95d45896.png)

## 参考
>
[https://sites.google.com/site/ev3python/learn_ev3_python/screen/bmp-image-collection](https://sites.google.com/site/ev3python/learn_ev3_python/screen/bmp-image-collection)
>
[http://pillow.readthedocs.io/en/3.3.x/handbook/concepts.html#modes](http://pillow.readthedocs.io/en/3.3.x/handbook/concepts.html#modes)

>
[【ev3dev】pythonを使ってLCD(画面)をキャプチャーするプログラムを作る](http://qiita.com/murotani/items/8f301c57d3e5741ea8f7)
外部キー制約でハマったので(rails)

railsで掲示板を作っているときに外部キー制約がわからなくてハマったのでメモ。

##前提
- スレッドを投稿でき、各スレッドにコメントができる掲示板を作っている
- スレッド(my_threadsテーブル)とコメント(commentsテーブル)はthread_idで紐づけられている(以下参照)

```
class CreateComments < ActiveRecord::Migration[5.0]
  def change
    create_table :comments do |t|
      t.string :content
      t.references :my_thread, foreign_key: true

      t.timestamps
    end
  end
end
```

[外部キー制約の書き方はこっち](https://suin.io/547)

##ハマったこと

```my_threads_controller.rb
def destroy
  @my_thread.destroy
  redirect_to my_threads_url, notice: 'My thread was successfully destroyed.'
end
```
としても
Cannot delete or update a parent row: a foreign key constraint fails 
ってでてきてスレッドの削除ができない。

##原因
###外部キー制約を定義すると参照整合性が保証される

####参照整合性とは
外部キーテーブルのデータへのリンクが無効になるような変更を主キーテーブルのデータに加えることができない

つまり、主キーのない外部キーがあってはならないので
**外部キーを残したまま主キーを消そうとするとエラーになる**

[参照整合性についてはこっち](https://msdn.microsoft.com/ja-jp/library/ms179610.aspx#FKeys)

##解決策
has_manyの後にdependentオプションを追加

```
class MyThread < ApplicationRecord
  has_many :comments, dependent: :destroy
  validates :title, presence: { message: "入力してください" }
end
```
[Railsガイドの下の方に書いてある](https://railsguides.jp/association_basics.html#has-many%E9%96%A2%E9%80%A3%E4%BB%98%E3%81%91%E3%81%AE%E8%A9%B3%E7%B4%B0)


こうすることで
*関連付けられたオブジェクトもすべて同時にdestroy*
してくれる
S3 互換のシンプルなオブジェクトストレージ Minio を使う

# 概要

[Minio](https://www.minio.io/) (https://www.minio.io/) は AWS の S3 と互換の API を持ったオブジェクトストレージ。
golang で書かれており実行ファイル 1つを起動するだけでストレージサーバーになるという気軽さが売り。

分散化は必須では無くて、その分簡単にオブジェクトストレージが構築できるのでスモール環境で利用したり、S3 利用アプリケーション開発時のローカルテスト用に使うと便利。

久しぶりに触ってみたら案外良い感じに仕上がっていたのでお勧め記事を書くことにした。


# Minio サーバーの起動

## インストール

公式サイトから wget 等でダウンロードするか、go でビルド。

```
go get -u github.com/minio/minio
```

## コマンドラインから

特に準備は必要なく、保存先ローカルストレージパスを指定して minio を起動するだけ。
起動時コンソールにアクセスキーとシークレットキー、リージョン名が表示されるのでメモしておく。

```
minio server /mnt/store
```

bind を指定するには `--address` スイッチを指定する。指定の書式は `IP:PORT` で省略時のデフォルト値は `:9000`。

```
minio server --address 192.168.0.1:9000 /mnt/store
```


## Docker コンテナで起動

コンテナでの起動が最近のお勧めパターンらしい。

```
docker run -p 9000:9000 -d --name minio minio/minio server /export
```

引数(minio/minio 部分以降)は minio にそのまま渡されるので変更可能だけれども、通常このままでOK。
この例だと /export はコンテナ内ファイルシステムなので実際は永続化のために /export を volume でどこかに配置することになると思う。

Docker のコンソールログにアクセスキーとシークレットキー、リージョン名が表示されるので表示させてメモしておく。

```
docker logs minio
```

最近のインテルCPUを搭載したミドルランク以上な NAS では仮想化環境として Docker コンテナを実行できるものがある。(QNAP や Synology など)
そういった NAS の上で Minio コンテナを起動すると NAS のストレージ部分をマウントして使えてとても魅力的なシステムとなる。


# Minio を利用するクライアントサイド

## ブラウザUI

![miyuki.yippee_2017-02-19_12-44-29.jpg](https://qiita-image-store.s3.amazonaws.com/0/50737/8494f46d-f053-e3b9-bec1-485bf1707a19.jpeg)

起動後 API のアドレスにブラウザでアクセスするとファイル管理ができる UI が表示される。
ファイルのアップロード、ダウンロード、削除とかがここでできるのでこれだけでも十分有用だったりする。

アクセス時の認証にアクセスキーとシークレットキーを聞かれるので入力する。
複数アカウントに対応しているわけではないので、そういう意味でも簡易 UI として捉えるのが良い。


## cli クライアント

コマンドライン上からファイルをコピー等管理するために [mc](https://www.minio.io/downloads/#minio-client) (minio-client) という名前のコマンドが用意されている。
昔から Linux を使っている人は Midnight Commander (mc) とコマンド名が重なっていて気になるかもしれない。

mc も go で書かれているので実行ファイル 1つだけのお手軽さ。

実行の際には `~/.mc/config.json` の設定が必要。ここにアクセス先サーバーとアクセスキー等を「サーバー名」毎に予め設定しておく。

```config.json
{
  "version": "8",
  "hosts": {
    "(任意のサーバー名)": {
      "url": "http://(サーバーのアドレスとポート):9000/",
      "accessKey": "(minio 起動時に表示されるアクセスキー)",
      "secretKey": "(minio 起動時に表示されるシークレットキー)",
      "api": "S3v4"
    }
  }
}
```

config ファイルを直接編集しなくても mc コマンドで追記することもできる。

```
mc config host add <ALIAS> <YOUR-S3-ENDPOINT> <YOUR-ACCESS-KEY> <YOUR-SECRET-KEY> <API-SIGNATURE>
```

S3 サーバーも記述できるので利用するサーバーを複数登録しておいてサーバー名で分別しながら使う事が可能。

サーバー名やバケットはパス名として与える形になる。

```
mc ls (サーバー名)/(バケット名)/(ファイルパス)
```

これまで S3 アクセスの cli は `s3cmd` を好んで使っていたけれども、mc はそれに近い感じだったので乗り換えることにした。
S3 互換なので当然 AWS cli や s3cmd も使えるので、お好みで選択する。


## Minio SDK

公式に存在している [Minio SDK](https://www.minio.io/downloads/#minio-sdk) は go/java/node/python となっている。
といっても AWS SDK の S3 も使えるのでそれ以外のプログラミング言語(rubyとか)でも困ることは無い感じ。

product 環境が S3 を指向しているとしたら最初から AWS SDK を使う場面が多いかもしれない。


# 使いどころ

オブジェクトストレージはファイルシステムと違って疎結合なのだけれども、それゆえにマシンや環境に依存しない形でファイルストアしたい時には有用ではないかと考える。

常に悩まされ続ける Docker の永続ストレージ問題だけれども、マイクロサーバーアーキテクチャや環境依存性を考慮すると Volume Driver に依存するより API 経由でのやりとりの方が簡潔になったりする。
読み書きが頻繁なシステムに適用はできないけれども、日々データを収集し続けて蓄積して行くようなシステムではオブジェクトストレージの方が簡素に構成できる。

といったわけで使い道が見つかり次第なのだけれども、それが見つかると便利かつお手頃なので気軽に試して貰いたい次第。
Golang個人的めも・スニペット

随時追加していきます。

めも
--------------------

### Golang固有のもの
- `error` と `panic` の使い分け
    - エラーを受け取って、後続で回避する方法があるときのみ `error` を返却
    - 対処のしようがない場合は `panic`
- 略語は大文字/小文字で統一する。
    - OK : `DBManager`, `dbManager`
    - NG : `DbManager` 
- 複数の返却値が同じ型を持つ場合は、返却値に名前をつけるとよい
    - `func Location() (lat, lng float64, err error) `
- `package`名を `class`名や `func`名に使用しない（冗長になる）
    - OK : `db.Manager`
    - NG : `db.DbManager`
- `make`、 `new` はなるべく避ける
    - OK : `[]int{}`
    - NG : `make([]int, 0)`
    - 例外 : `make([]int, 32)` ※サイズが決まっている場合

### 一般的なもの
- スコープの狭い変数は短く、遠くで使う変数は説明的に長く

スニペット等
--------------------

### 非エクスポート `func` のテスト

テスト対象を自パッケージとして扱えばOK

```go
package foo_test

import (
    . "foo"
)
```

### `for` 文

for-each文の感覚で `for elem := range list` とするとインデックス取っちゃう

```go
for i, elem := range list {
    fmt.Printf("%d, %+v", i, elem)
}
```

### 型アサーション

```go
var e interface{}
unknown = 10
known, ok := unknown.(int)
if !ok {
    fmt.Println("NG")
}
```

### 型スイッチ

```go
switch unknown.(type) {
case int:
    fmt.Println("int")

case string:
    fmt.Println("string")
}
```

### `switch` で `if-else`

```go
switch {
case a == True && b == True:
    fmt.Println("case 1")

case a == True && b == False:
    fmt.Println("case 2")

case a == False && b == True:
    fmt.Println("case 3")

case a == False && b == False:
    fmt.Println("case 4")
}
```
motionの動体検知の開始/一時停止をcronで制御する

# はじめに
[Motion Web](http://www.lavrsen.dk/foswiki/bin/view/Motion/RemoteControlHttp)で紹介されているmotionの動体検知の開始/一時停止をcronで制御する方法を試したらハマったので紹介します。
Raspberry Piでmotionを起動している前提で話を進めます。


```:紹介されている方法
0 9 * * * root /usr/bin/lwp-request http://localhost:8080/0/detection/start > /dev/null
0 18 * * * root /usr/bin/lwp-request http://localhost:8080/0/detection/pause > /dev/null
```

# 環境
- モデル：Raspberry Pi 3 Model B
- raspbian：8.0
- moiton：3.2.12
- LWP：6.18

# 手順
1. LWPのインストール
2. ターミナルから実行して動作確認
3. cronの仮設定 & 動作確認
4. cronの本設定

# 1. LWPのインストール
最初にLWPをインストールします。

```
$ perl -MCPAN -eshell

cpan> install Bundle::LWP
cpan> quit
```

# 2. ターミナルから実行して動作確認
いきなりcronで実行するのではなく、まずはターミナルから実行して動作確認します。
下記のコマンドを実行してmotionの一時停止ができるか確認します。

```
$ lwp-request http://localhost:8080/0/detection/pause
```
 
Webブラウザからmotionの動体検知状況を確認します。下記の手順で確認ができます。

http://[Raspberry PiのIPアドレス]:8080/
detection
status

「Detection status PAUSE」と表示されると成功です。

"> /dev/null"までコマンドを実行すると出力が破棄されエラーがあってもわからないのでターミナルでの動作確認時は抜くとよいです。


# 3. cronの仮設定 & 動作確認
いよいよcronから制御させます。ターミナルで下記のコマンドを実行してcrontabの設定ファイル編集を行えるようにします。

```
$ crontab -e
```

動作確認のため直近で実行されるように仮設定します。

```
11 * * * * /usr/local/bin/lwp-request http://localhost:8080/0/detection/pause > /dev/null
```

※ 11の箇所は現在時刻の2分後以降を設定
※ crontab -eで設定するとユーザ名は不要なためrootを削除しています
※ Raspberry PiでLWPをインストールすると"/usr/local/bin/"にインストールされるためパスを変更しています

crontab設定後にターミナルでcronを再起動します。

```
$ sudo /etc/init.d/cron restart
```

Webブラウザからmotionの動体検知状況を確認してstatusがPAUSEだったら成功です。

# 4. cronの本設定
cronからの動作確認がとれたら後は本設定のみです。お好みの時刻に動体検知の開始/一時停止を設定します。下記にMotion Webに紹介されているのと同じ実行時刻設定の例を示します。

```
0 9 * * * /usr/local/bin/lwp-request http://localhost:8080/0/detection/start > /dev/null
0 18 * * * /usr/local/bin/lwp-request http://localhost:8080/0/detection/pause > /dev/null
```



# 参考
[perlでLWP(WWWアクセスのためのライブラリ)を使う場合のモジュールインストール](http://ameblo.jp/welx/entry-11137263518.html)

[LinuxでWebカメラを使う（ライブカメラ、防犯カメラ等）[motion]](http://www.bird-soft.net/mt/2009/06/linuxwebmotion.html)
[自習メモ]Vagrantでの仮想マシン構築

◇Virtualboxのインストール
　https://www.virtualbox.org/
◇Vagrantのインストール
　https://www.vagrantup.com/

◇Virtualboxの起動
$ virtualbox

◇Vagrantのバージョン確認
$ vagrant --version
Vagrant 1.8.4

◇仮想マシンOSの取得(trusty64)
$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

◇取得OSの確認
$ vagrant box list
trusty64 (virtualbox, 0)

◇仮想マシンの初期化
$ vagrant init trusty64

◇仮想マシン設定ファイルの修正
＄ vi Vagrantfile

◇仮想マシンの起動
$ vagrant up

◇仮想マシンへのssh接続
$ vagrant ssh
ファイル1枚分のメモリで画像ファイル編集を行う

画像ファイルを読み込み、画像編集して保存する場合に、プロセスで使用するメモリを最小限に抑える方法の1つについてまとめる。

処理のフローは以下の通り。
①FileStreamクラスで編集対象の画像ファイルを読み込む
②画像処理用にBitmapクラスを作成する
③Graphicsクラスで任意の画像処理を行う
④画像処理の内容を①のFileStreamクラスが見えるメモリに反映する
⑤ファイルを保存する
***

実際のコードは以下のようになる。

	Bitmap bitmap = null;
	/* ①FileStreamクラスで編集対象の画像ファイルを読み込む(このSTEPではファイルは読み込まれない) */
	using ( FileStream bitmapStream = new FileStream( *画像ファイルのパス*, FileMode.Open, FileAccess.ReadWrite, FileShare.None ) )
	{
		/* ②画像処理用にBitmapクラスを作成する(ここでStreamとあわせて1枚ぶんの画像が読み込まれる) */
		bitmap = new Bitmap( bitmapStream ) as Bitmap;

		/* ③Graphicsクラスで任意の画像処理を行う */
		using ( Graphics bmpGraphics = Graphics.FromImage( bitmap ) )
		{
			bmpGraphics.FillRectangle( System.Drawing.Brushes.Black, new RectangleF( 0, 0, 1000, 1000 ) );
		}

		/* ④画像処理の内容を①のFileStreamクラスが見えるメモリに反映する */
		bitmap.Save( bitmapStream, bitmap.RawFormat );
		bitmapStream.Seek( 0, SeekOrigin.Begin );

		/* ⑤ファイルを保存する(FileStreamのcloseをもって反映) */
	}
	bitmap.Dispose();


別名保存や別形式保存する場合は「⑤ファイルを保存する」を以下のように書き換える。

	/* ⑤ファイルを保存する(別名保存) */
	BitmapFrame bmpFrame = BitmapFrame.Create( bitmapStream, BitmapCreateOptions.DelayCreation, BitmapCacheOption.None );
	using ( FileStream fileStream = new FileStream( *画像ファイルのパス*FileMode.Create, FileAccess.ReadWrite, FileShare.None ) )
	{
		BmpBitmapEncoder bitmapEnocder = new BmpBitmapEncoder();
		bitmapEnocder.Frames.Add( bmpFrame );
		bitmapEnocder.Save( fileStream );
	}

この場合①のオープン属性はReadのみにしておく。

***

確認環境は下記の通り。
OS：Windows 10 Home 64-bit
Language: Japanese
CPU：Intel(R) Core(TM) i3-3227U CPU @ 1.90GHz (4 CPUs), ~1.9GHz
Memory：4096MB RAM
.NetFrameWork：4.5.2
Visual Studio：Community 2015
画像処理で出来ることをまとめてみた

# はじめに
「デジタル画像について知りたい，加工したいけどどんなこと出来るの？」という人向け記事になります．
「実際に画像処理を知りたいぞ」って人には物足りないと思います．

※ 注意
実装などに関しては一切書いておりません．
個別に「解説＋実装」と言う形で記事にしていくのでご了承ください

## 画像処理の全体像
画像処理の基本となる以下について，記載してあります．

* ピクセル Pixel
* 色調補正 Coloring
* フィルタ処理 Filtering
* 形状変形 Deformation, Transformation
* 合成 Blending, Composition

他に，分類Clusteringや解析Analysis，動画像を対象にした移動物体追跡Object Trackingもある．
さらに領域分割，周波数領域での画像処理など高度な技術を用いたものもあります．
そのうち記事にできるといいな，って感じです．

## ピクセル / Pixel
ピクセルは画像を構成する最小要素となり，この値を操作して画像処理を行う．
ちなみに，3次元で立方体で構成するオブジェクトの最小要素がボクセル/Boxelと呼びます．
ピクセルの特徴は以下の通り．

* ピクセルは赤青緑の3色の情報で構成されている
* 各色の情報は0～255の整数値（負数や256以上の値がない）
* つまり，1ピクセルで256^3=16,777,216の色が表現できる

代表的な色をピクセルで表現すると以下の数値を指定する

```math 
\begin{align}
Color&=(r,g,b)\\
\\
White&=(255,255,255)\\
Black&=(0,0,0)\\
\\
Red&=(255,0,0)\\
Green&=(0,255,0)\\
Blue&=(0,0,255)\\
Yellow&=(255,255,0)\\
Cyan&=(0,255,255)\\
Magenta&=(255,0,255)\\
\end{align}
```

## 色調補正 / Coloring
ピクセルのRGBの値を操作して，画像を加工する方法．
スマートフォンの撮影アプリや画像編集アプリにある「XXX調」は色調補正によるものがほとんど．

色相を自動補正させるColor Harmonizationという技術なんかもある．

* N階調
    * 2値化
* モノクロ化
    * RGB平均によるモノクロ化
    * Y値によるモノクロ化
* トーンカーブ
* セピア調
* 他の色空間を用いた色調補正
    * HSV系
    * XYZ系
    * La*b*系

## フィルタ処理 / Filtering
フィルタ処理には，鮮鋭化や平滑化など色調補正だけではできないピクセルの操作ができるようになる．
数学的に言えば，「畳み込み演算」ってやつです．
ディープラーニングのCNN(Convolutional Neural-Network)では基本となる処理ですね．

* 鮮鋭化
    * 鮮鋭化フィルタ
* 平滑化
    * Average Filter
    * Gaussian Filter
    * Median Filter
* エッジ抽出
    * Laplacian Filter
    * Sobel Filter
    * Canny Edge Detector

## 形状変形 / Deformation, Transformation
拡大縮小や回転など．
形状変形には，変形手段と変形計算，補間（Interpolation）の3つがキーとなる．
変形手段は画像全体を一律変形させる方法と，メッシュを利用して局所的に変形させる方法などがある．
メッシュ変形は柔軟性があるため，割りと重宝する．
3Dモデリングソフトではボーンを使った変形があり，それを2次元で応用することもある．（ボーン操作は直感的なので，インタフェイスとして打ってつけのため）

変形計算には，基本となるアフィン変形や射影変換がある．
高度な技術に調和関数（Harmonic Functions）を利用したHarmonic CoordinatesやGreen Coordinatesなどがある．（もう古いかな？）
Adobe Photoshopにある「コンテンツに応じて伸縮（？）」という機能は，画像変形の「Seam Carving」という技術を使ったものである．

* アフィン変形 / Affine Transformation
    * アフィン変形は以下のことがまとめてできる
        * 拡大縮小
        * 回転
        * スキュー
* 射影変換 / Projection Transformation
    * 3次元で板・紙を傾けて見たときの見え方(?)のような変形が出来る
        * 手前は大きく広く，奥は小さく窄まって見える感じ
* メッシュ変形
    * 三角形や四角形をたくさん敷き詰めた”メッシュ”を変形させて部分的に自由に変形させる
* 補間
    * 最近傍法 / Nearest Neighbors
    * バイリニア法（双二次補間法） / Bi-linear
    * バイキュービック法（双三次補間法） / Bi-cubic

## 合成 / Blending, Composition
2つの画像を1つに混ぜることを合成・混成などと言う．（単にブレンディングとも）
身近なものでは透過処理も1つの合成方法と言える．
ピクセルのRGBの他に合成度合いを示すアルファチャンネルを追加し，その度合いに応じて合成すると言うものが基本アイディアとなる．
これはアルファブレンディングという方法である．
画像の保存形式の1つでもあるPNGはこのアルファチャンネルも一緒に保存している．

* 単純合成
    * 貼り付け処理 / Paste
    * アルファブレンディング / Alpha Blending
        * 割合に応じて合成
* Hybrid Image
    * 周波数領域で画像を合成する技術
    * 人間の目が輪郭と色調の認識/識別する能力が，物体の距離によって変化することを利用した技術である．
* Poisson画像合成 / Poisson Image Composition
    * 合成する際に色調をある程度なじませる事ができる技術
    * 土台となる技術はPoisson方程式
    * 一癖のある技術だが，個人的に好き

# 最後に
各項目は，個別に詳細記事にしようと思います．
各項目の記事が完成したら，この記事にリンクを付けて一覧的なものにしていく予定です．
また，画像処理系の学会（おもにSIGGRAPH）で発表された論文を解説する記事を書く予定です．

大学の研究で使っていた技術を優先した結果，内容が合成・変形に重みが強い内容になってしまいました．
簡単なファイル操作をするためのパッケージ filer

簡単なファイル操作をするためのパッケージ filerの紹介

# はじめに

pythonでcsvファイルを読み込む場合、

```py
import csv

with open('name.csv', 'r') as f:
    reader = csv.reader(f)
    for row in reader:
        print row
```
などとする必要があるが、毎回これをやるのはめんどくさい・・・
関数として保存しておけばいいが、パッケージ化すれば導入が楽じゃん！！
ということでpipに登録しました。

# 導入

2系ならば

```text
pip install filer2
```

3系ならば

```text
pip install filer3
```
としてください。（filer2とfiler3で微妙に中身が違うができることは同じ）

# 使い方

filerで使える関数は

* read_csv
* write_csv
* read_tsv
* write_tsv
* read_txt
* write_txt
* read_pkl
* write_pkl
* conv_encoding

の9種類。
例えばcsvファイルを読み、書き込みは、

```py
from filer2 import Filer

# csvファイルの読み込み
data = Filer.read_csv('inputpath')
# csvファイルの書き込み
Filer.write_csv(data, 'outputpath')
```
でできる。

同様に、tsvファイル、txtファイル、pklファイルの操作も可能。

conv_encodingは文字のエンコーディングを出力する関数

```py
from filer2 import Filer

print Filer.conv_encoding(string)
```
として使う。

# 終わりに

ちょっとしたファイル操作をするとき便利です。
まあ、そもそもpandasのread_csvを使えばいいのですが・・・

# 余談
久々にpypiの登録を行ったのですが、
現在はどうやら

```text
python setup.py register
```
とすると、
Server response (410): This API is no longer supported, instead simply upload the file.
というエラーが出ました。
どうやら、setup.pyのregsiterは推奨されていないようです。
今はtwineというパッケージを使って、

```text
twine register dist/*
twine upload dist/*
```
がいいそうです。
詳しくはこちら
http://qiita.com/tokyo-noctambulist/items/cafcbd589e39d45d693f
http://elicon.blog57.fc2.com/blog-entry-422.html
Apache の VirtualHost 設定のメモ


# 設定例

httpd.conf(または分割先の設定ファイル)に、以下のように設定する

``` /etc/httpd/conf.d/vhosts.conf
NameVirtualHost *:80

<VirtualHost *:80>
    ServerName mysrv.local
    DocumentRoot /var/www/vhosts/mysrv.local/public
    ServerAdmin root@mysrv.local

    # DocumentRoot
    <Directory "/var/www/vhosts/mysrv.local/public">
    	Options All
    	AllowOverride All
    	Require all granted
    </Directory>

    # Log
    CustomLog logs/mysrv.local/access_log combined env=!resources
    CustomLog logs/mysrv.local/resource_log combined env=resources
    CustomLog logs/mysrv.local/referer_log referer env=!is_intra_referral
    ErrorLog logs/mysrv.local/error_log

</VirtualHost>
```

↑ここで設定したディレクトリやログファイルは、事前に作成しておく


# 注意
## デフォルトのサイト
前述のような設定がされている場合、デフォルトのホスト名もVirtualHost設定をする必要がある。
でないと、一番上のVirtualHost設定が適用される。
たとえば上記の設定だけがある状態でlocalhostでアクセスすると、mysrv.local にアクセスしたのと同じ動きになる

## アクセス制御の書き方

Apache 2.3以降では、

        AllowOverride All
        Order allow,deny
        Allow from all

        ↑ではなく、↓のように書く (じゃないと 403 になる)

        AllowOverride All
        Require all granted
unicorn【自分用】

##
Unicorn起動

Railsフォルダで

```
bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```

##Unicorn起動確認


```
ps -ef | grep unicorn
```

##終了

```
kill -QUIT [PID]
```

```
kill -QUIT `cat /var/run/unicorn/unicorn.pid`
```


```
kill -9 `cat /var/run/unicorn/unicorn.pid`
```
scalametaでの型パラメータとコンストラクタ

# tl;dr

直接、annotation classの型パラメータやコンストラクタにはアクセス出来ない。
その代わりに、`this`を用いてパターンマッチで取得することが出来る。

# 題材

mix-in injectionとかminimal cake patternと呼ばれる、DI対象となるclassをmix-inするmacro annotationを実装した。

- `Uses[MyService]`とすると`val myService: MyService`がフィールドに追加される
- `MixIn[MyService](new MyServiceImpl)`すると`val myService: MyService = new MyServiceImpl`がフィールドに追加される

こんな感じで使用する。

```scala
trait MyService { def double(n: Int) = n * 2 }
object MyServiceImpl extends MyService

trait OtherService { def triple(n: Int) = n * 3 }
class OtherServiceImpl extends OtherService

@Uses[MyService]
@Uses[OtherService]
trait UsesFieldTarget {
  def showDouble(n: Int) = println(this.myService.double(n))
  def showTriple(n: Int) = println(this.otherService.triple(n))
}

@MixIn[MyService](MyServiceImpl)
@MixIn[OtherService](new OtherServiceImpl)
class UsesFieldTargetImpl extends UsesFieldTarget

object UsesFieldApp extends App {
  val impl = new UsesFieldTargetImpl
  impl.showDouble(100) // 200
  impl.showTriple(100) // 300
}
```

annotationの実装は[scalameta-prac/uses.scala](https://github.com/petitviolet/scalameta-prac/blob/master/modules/metas/src/main/scala/net/petitviolet/metas/uses.scala)で、
サンプルコードは[scalameta-prac/UsesApp.scala](https://github.com/petitviolet/scalameta-prac/blob/master/modules/app/src/main/scala/net/petitviolet/metas/app/UsesApp.scala)。

ちなみに、IntelliJ上ではうまく解決出来ておらず`Macro expansion failed`とか表示されるし、補完もされない...。
こんな感じ。。

![スクリーンショット](https://petitviolet.s3.amazonaws.com/public/image/uses_mixin.png)

このような話もあるので期待したい。
[IntelliJ IDEA 2016.3 RC: Scala.Js, Scala.Meta and More | IntelliJ Scala plugin blog](https://blog.jetbrains.com/scala/2016/11/11/intellij-idea-2016-3-rc-scala-js-scala-meta-and-more/)

# macro annotationで型パラメータと引数を処理する

上のような使い方をするには型パラメータと引数を処理しなければならないが、inline macroの場合はちょっと特殊。

## 型パラメータを取得する

```scala
class Uses[T] extends scala.annotation.StaticAnnotation {
  inline def apply(defn: Any): Any = meta { ??? }
}
```

このような`Uses[T]`において、`T`には直接アクセス出来ない。
`this`を用いると`T`が`Term.ApplyType`として取得できる。

```scala
class Uses[T] extends scala.annotation.StaticAnnotation {
  inline def apply(defn: Any): Any = meta {
    val typeParam: String = 
      this match {
        case Term.New(Template(_, 
            Seq(Term.Apply(
              Term.ApplyType(
                _, 
                Seq(Type.Name(name: String))
              ), _)), _, _)) =>
            name
        case _ => None
      }
      ???
  }
}
```

これで型パラメータとして渡された`T`のコンパイル時における型名が文字列として手に入る。
つまり`Uses[MyService]`みたいになっていると`MyService`という文字列が取れる。

## コンストラクタを処理する 

`Uses[T]`でねじ込んだ`T`型のフィールドに実装を与える`MixIn[T](t: T)`を作る。
そのためにはコンストラクタを手に入れる必要がある。
これも型パラメータと同様に`this`に対するパターンマッチで取り出す。

型パラメータとコンストラクタをそれぞれ取り出すパターンマッチは以下のように書ける。

```scala
this match {
  case Term.New(Template(_, Seq(
    Term.Apply(
      Term.ApplyType(_, Seq(Type.Name(name: String))),
      Seq(implArg: Term.Arg)
    )
  ), _, _)) =>
    (name, implArg)
```

`Term.Apply`に与えられる引数の`Term.ApplyType`と`Seq[Type.Arg]`として型パラメータとコンストラクタが得られる。
これで`MixIn[T](t: T)`の`T`と`t`が無事に得られる。

ちなみに、引数を渡すから型パラメータは型推論で解決してくれるだろう、と思ってもダメ。

> Error:wrong number of type arguments for MixIn, should be 1

みたいな型パラメータが足りませんよ、というエラーが出てしまう。
nginx【自分用】

##エラーログ

```
tail /var/log/httpd/error_log
```

##起動

```
nginx
```

##停止

```
nginx -s stop
```

##再起動

```
nginx -s reload
```

##設定ファイルのチェック

```
nginx -t
```

##設定ファイルの場所
##メインの設定ファイル

```
cd /etc/nginx/
```

##各サーバー甩設定ファイル

```
cd /etc/nginx/conf.d/
```


##ログファイルの場所

```
/var/log/nginx/access.log
```



##起動

```
sudo service nginx start
```

##再起動

```
sudo nginx -s reload
```

##停止

```
nginx -s stop
```

##設定ファイルのチェック

```
nginx -t
```

##設定ファイルの場所

##メインの設定ファイル

```
cd /etc/nginx/
```

##各サーバー甩設定ファイル

```
cd /etc/nginx/conf.d/
```
LINE Simple BeaconをGenuino 101で使うには

LINE Beaconのビーコン部分のみを自前で実装できる[LINE Simple Beaconの仕様が公開されました](https://engineering.linecorp.com/ja/blog/detail/117)。Raspberry PiやNode.jsでblenoを使ったサンプルコードも合わせて公開されておりますが、いずれもビーコンとして動かすには重量級なデバイスかなと思い、BLEを扱えるマイコンで動作させてみました。

## 使ったデバイス

- Arduino (Genuino) 101

手元にあったBLEの電波を出せるものがこれだったので使っています。

## 実装内容

- LINEのUUIDでAdvertisingが飛んでいる
- Advertisingに適切なデータが含まれている

これらが揃っていればLINEのアプリ側が反応し、サーバに通知します。

## Arduinoのコード

https://github.com/bneedhamia/CurieEddystoneURL

こちらのEddystoneを実装するためのコードを参考にしました。Arduinoのリファレンスには、まだAdvertisingに関する機能の詳細が載っていないのですが、コードは実装されているという状態です。

```
BLEService lineService("FE6F"); // LINEの16bit UUIDをサービスに設定
BLEPeripheral ble;
void setup() {
  ble.setAdvertisedServiceUuid(lineService.uuid()); 
  ble.setAdvertisedServiceData(lineService.uuid(), data, 8); // Advertisingの際のデータを設定
  ble.begin(); // Advertiseの開始
}
```

## どんなデータを入れるのか

最低限必要なのは 

- frameTypeData
- hwidData
- measuredTxPowerData

の3点で、8バイトになります。これらが入ると、LINEアプリはビーコンの存在を認識します。

## コード

https://github.com/niccolli/LINESimpleBeaconForCURIE

実際のコードはこちらを参照ください。HWIDのみご自身のものに書き換えると、利用できます。
macOS Sierraのマシンセットアップ

新しいMacのマシンを使う必要が出てきたので現行の私のSierraのセットアップ手順をまとめておく。自分用メモ。

## Command Line Toolsのインストール
```
$ git
```

Xcodeをいれずに普通にインストールしてしまう。

## dotfilesのclone & install
```
$ cd
$ git clone --recursive https://github.com/k0kubun/dotfiles src/github.com/k0kubun/dotfiles
$ cd src/github.com/k0kubun/dotfiles
$ ./install.sh
```

## Google Chrome
https://www.google.com/chrome/browser/desktop/index.html

## Nocturn
https://github.com/k0kubun/Nocturn/releases

## Slack
https://slack.com/downloads/osx

## Terminal.appの設定
- プロファイル > Proを選択しデフォルトにする
- プロファイル > Pro > テキスト
  - フォントを18ptにする
  - 濃い青、赤の色を適当に調節する
- プロファイル > Pro > シェル
  - 起動 コマンドを実行: /bin/zsh
- プロファイル > Pro > キーボード
  - 「メタキーとしてOptionキーを使用」にチェックをいれる
- プロファイル > Pro > 詳細
  - 「ビジュアルベル」のチェックを外す

`brew install tmux`、`brew install reattach-to-user-namespace`、.tmux.conf.local→.tmux.conf.darwinのsymlinkをしてから再起動 (そのうち自動化)

## Karabiner-Elements fork
https://github.com/wwwjfy/Karabiner-Elements/release

- ~/.config/karabiner/karabiner.json の設定(一部抜粋)

```json
{
    "global": {
        "check_for_updates_on_startup": false,
        "show_in_menu_bar": true,
        "show_profile_name_in_menu_bar": false
    },
    "profiles": [
        {
            "devices": [],
            "name": "Default profile",
            "selected": true,
            "simple_modifications": {
                "caps_lock": "escape",
                "left_command": "left_control",
                "spacebar": "left_shift"
            },
            "standalone_keys": {
                "spacebar": "spacebar"
            },
            "virtual_hid_keyboard": {
                "caps_lock_delay_milliseconds": 0,
                "keyboard_type": "ansi",
                "standalone_keys_delay_milliseconds": 200
            }
        }
    ]
}
```

## キーリピート
- システム環境設定 > キーボード > キーボード
  - キーのリピートとリピート入力認識までの時間を両方最速にしておく

## AquaSKK
https://github.com/codefirst/aquaskk/releases

U.S. の削除: https://zenn.dev/yoshiyoshifujii/articles/78798db6472bf4

## Hammerspoon
https://github.com/Hammerspoon/hammerspoon/releases

- アクセシビリティを有効にする
- ~/.hammerspoon/init.lua をいじる

## 1Password
App Storeから入れる
jenkinsでrbenvとpyenvのチェックが再起動時に外れる問題を解決する


# 解決策

`ruby-runtime`というPluginのVersionを0.13から0.12に下げることで、解消。


# 注意
すでに`pyenv`, `rbenv`が入ってしまっている場合には、先に、この2つをUninstallする必要がある。


#参考ページ
https://issues.jenkins-ci.org/browse/JENKINS-38809
Popoverを消した時に出た警告と対処方法

#はじめに
Popoverを消した後でこの警告が出ました。
**[Warning] <_UIPopoverBackgroundVisualEffectView 0x7fe5b7e2cb60> is being asked to animate its opacity. This will cause the effect to appear broken until opacity returns to 1.**

致命的ではないので気にしなければよいのもかれしませんが、気持ちが悪いので、警告を消す方法を探しました。対処方法についてメモを残します。

#対処法
`dismiss(animated: true, completion: {})`
を呼んだ時点で警告が表示されています。

この点、animatedにfalseを指定することで解決しました。
`dismiss(animated: false, completion: {})`

#感想
iOSのバグなら善処してほしいですね。VisualEffectViewやopacityというキーワードが出てきたので、無駄にコードを見返してしまいました。見慣れないエラーメッセージは、一度、直接に検索する癖をつけたほうが生産的かもしれません。
サーバにgitレポジトリを作成

参考URL
https://blog.apar.jp/linux/2300/

```
# yum install -y git
# useradd -s /usr/bin/git-shell git 
# mkdir /home/git/.ssh 
# touch /home/git/.ssh/authorized_keys
# chown -R git:git /home/git/.ssh 
# chmod 700 /home/git/.ssh 
# chmod 600 /home/git/.ssh/authorized_keys 
# mkdir /opt/git 
# mkdir /opt/git/sample.git
# cd /opt/git/sample.git/ 
# git init --bare
# chown -R git:git /opt/git/sample.git/ 
```


クライアントPCのSSH公開鍵をクリップボードにコピー

```
# cat ~/.ssh/id_rsa.pub
```

サーバにペースト

```
# vim /home/git/.ssh/authorized_keys
```

```
# vi /etc/ssh/sshd_config
...
# LogLevel DEBUG
...
```

```
# service sshd restart 
# git clone ssh://git@[domain]/opt/git/sample.git 
```
getUserMediaで取得した映像でリアルタイム顔認識 [HTML5, openCV]

## 方針
まず、HTML5のAPI ```getUserMedia``` を使ってローカルカメラの映像を取得できる。映像は静止画をコマ送りすることで実現しているので、特定のタイミングで画像を切り出し、その画像に対して顔認識を適用すればよい。
顔認識はサーバサイドで行う。ローカル側で切り出した画像をbase64エンコードしてAjaxでサーバに送信し、サーバ側ではbase64をデコードして顔認識器に入力する。そして、その結果をクライアント側に返す。

## 環境
環境はなんでもいい。以下は自身の環境で実績のあるもの。

- フロントエンド
  - jquery
- サーバ
  - node v.6.2
  - 顔認識
    - python 2.7
    - openCV 2系 

## 顔認識
base64を受け取って顔認識するやつ
http://qiita.com/komakomako/items/91eb5bba927b23587ed4

##フロントエンド


~~~html
<header class="hero-unit" id="banner">
  <div class="container">
    <h1>顔認識します</h1>
  </div>
</header>

<div class="container">
  <div class="row">
    <div class="col-lg-12">
      <br>
      <button class="btn btn-lg btn-success" onclick="startVideo()">Start</button>
      <br>
      <canvas style="display:true;" width="640" height="480"></canvas>
      <video id="local_video" width="640" height="480" autoplay style="display: true;"></video>

    </div>
  </form>
</div>

<script type="text/javascript">
  var localVideo  = document.getElementById('local_video');
  var canvas = document.querySelector('canvas');
  var ctx = canvas.getContext('2d');
  var localStream = null;

  // 顔認識結果を四角い枠で描画するための座標
  var x = []

  var base64 = ''

  // ローカルビデオをスタートさせる
  function startVideo() {
    navigator.mediaDevices.getUserMedia({video: true, audio: false})
    .then(function (stream) { // success
      localStream = stream;
      localVideo.src  = window.URL.createObjectURL(localStream);
    }).catch(function (error) { // error
      console.error('mediaDevice.getUserMedia() error:', error);
      return;
    });
  }

  // カメラ画像キャプチャ
  var capture = function() {
    if (localStream) {
      ctx.drawImage(localVideo, 0, 0);
      ctx.beginPath();
      ctx.rect(x[0], x[1], x[2], x[3]);
      ctx.stroke();
      base64 = canvas.toDataURL('image/webp');
    }
  }

  //認識
  var detect = function() {
    var request = {
      url: 'http://localhost:9000/api/detect',
      method: 'POST',
      data: {
        image: base64.replace(/^.*,/, '')
      }
    };
    $.ajax(request).done(function(data){
       console.log(data)
       if(data.face) {
         for(var i=0; i<data.face.split(' ').length; i++){
           x[i] = data.face.split(' ')[i] - 0 ;
         }
         console.log(data.face.split(' '));
       }
    });
  }

  setInterval("capture()",100);
  setInterval("detect()",500);

</script>
~~~


## サーバ

エンドポイント ```http://localhost:9000/api/detect``` をPOSTでたたくと、以下の関数にルーティングされるようにしておきます。

~~~javascript
export function detect(req, res) {

  const exec = require('child_process').exec;
  exec('python /path/to/detect_base64.py "' + req.body.image + '"',
    function(err, stdout, stderr) {
      if (err) { console.log(err); }
      console.log(stdout);
      return res.status(201).json({"face": stdout});
    }
  );

}
~~~
BlockBitmapを生成してみよう。

```javascript:galapagos.js
createBlockBitmap=function(a,b,c){
  const bitmap=android.graphics.Bitmap.createBitmap(128,128, android.graphics.Bitmap.Config.ARGB_4444);
  const canvas=new android.graphics.Canvas(bitmap);
  const paint=new android.graphics.Paint();
  const matrix=new android.graphics.Matrix();
  matrix.postSkew(0.28,0.28);
  matrix.postRotate(-45);
  matrix.postTranslate(6,32);
  canvas.drawBitmap(android.graphics.Bitmap.createScaledBitmap(a,64,64,false),matrix,paint);
  if(!a.isRecycled())
    a.recycle();
  matrix.reset();
  matrix.postSkew(0,0.55);
  matrix.postTranslate(6,32);
  canvas.drawBitmap(android.graphics.Bitmap.createScaledBitmap(b,59,64,false),matrix,paint);
  if(!b.isRecycled())
    b.recycle();
  matrix.reset();
  matrix.postSkew(0,-0.55);
  matrix.postTranslate(65,63);
  canvas.drawBitmap(android.graphics.Bitmap.createScaledBitmap(c,57,64,false),matrix,paint);
  if(!c.isRecycled())
    c.recycle();
  return bitmap;
};
```

あとは簡単

Bitmapを 上面 横面 横面 の順で渡してあげるだけ。
gulp, less初心者が簡単に動かせるようになるまで

gulpもlessも初心者の自分が動かせるようになるまで。
（gulpじゃなくて、有料の`codekit`っていうのがもっと簡単。アプリをインストールしてドラッグするだけ）

# lessってなに
コードの書き方がcssより良いらしい。

[CSSをシンプルに書くことができるLESS使ってみた](http://www.webopixel.net/html-css/503.html) によると、
・子のスタイルを書くときが楽
・変数使える（`@window-width: 1000px` とかで）
・関数使える(`doubleWidth(20px)` とかで20pxを2倍にする関数つくったり)
・計算ができる(`@window-width + doubleWidth(20px)`とか。1040px になるのかな？)

「子のスタイルを書くときが楽」というのは、

```css
.parent .child {
  color: red;
}
.parent .child a {
  color: white;
}
```
が

```css
.parent {
  .child {
    color: red;
    a {
      color: white;
    }
  }
}
```

で書けるということ。確かに書いてて楽。

**ただ、lessを書いただけじゃブラウザは認識してくれないとのこと。**
「lessの変更が反映されない！！」って悩んでる人はいないでしょう・・・。

# gulpに頼る
ブラウザが認識できるcssに、lessをコンパイルしてくれるのが`gulp`。（他にもある）

導入方法は[遅すぎたgulp実践導入 (Mac編)](http://qiita.com/kabane/items/186017e24d9ed606b4ae) で丁寧に書かれてます。
（ありがとうございます！）

**lessをcssにコンパイルさせるためだけ**にgulpを使ったので、僕の`gulpfile.js`はこんな感じ。

```js

// gulp本体のパッケージ及びタスクで使用するパッケージの呼び出し
var gulp = require("gulp"),
    less = require('gulp-less'),
    server = require('gulp-webserver');

// gulpで処理を行うファイルのパス情報
var paths = {
    less: './less/test.less',
    css_build: './css'
};

// lessコンパイル
gulp.task('less', function() {
    gulp.src(paths.less)
        .pipe(less())
        .pipe(gulp.dest(paths.css_build));
});

// Webサーバー
gulp.task('server', function() {
    gulp.src('./') // サーバのルートパス
        .pipe(server({
            livereload: true, // ライブリロード有効化
            open: true // serverタスク実行時、ルートに指定した階層をブラウザで立ち上げる
        }));
});

gulp.task('default', ['server'], function(){
    gulp.watch(paths.less,['less']);
});
```

`gulp less`とコマンドで打てば、`test.less`がコンパイルされて`css`ディレクトリに`test.css`が作成されます。

gulp.dest()で指定した**ディレクトリ**がなくても、勝手に`mkdir`してくれて、cssファイルを出力してくれる。

すべてのlessをcssに一括でしたかったら、[遅すぎたgulp実践導入 (Mac編)](http://qiita.com/kabane/items/186017e24d9ed606b4ae) にあるように、

```js

var paths = {
    less: 'less',
    ...
};

gulp.task('less', function() {
    gulp.src(paths.less+'/*.less')
    ...
});
```

にしたらできるのです。

`gulp server`とコマンドを打てば、webサーバーが立ち上がり、http://localhost:8000 でサイトが見れるようになります。

`gulp server`と`gulp less`を一緒にやりたい場合は、

```
gulp.task('default', ['server'], function(){
    gulp.watch(paths.less,['less']);
});
```
と記述してあるので、`gulp`とコマンドを打てばOK!!!

# ゴール
最終的に、ターミナルで、gulp!!!と打ってみて、このように出力されれば成功。

```bash
$ gulp
[05:01:32] Using gulpfile /usr/local/var/www/htdocs/test_project/gulpfile.js
[05:01:32] Starting 'server'...
[05:01:32] Webserver started at http://localhost:8000
[05:01:32] Finished 'server' after 16 ms
[05:01:32] Starting 'default'...
[05:01:32] Finished 'default' after 11 ms
[05:01:36] Starting 'less'...
[05:01:36] Finished 'less' after 9.38 ms
```
[python, openCV] base64画像での顔認識

### 環境
- OSX 10.11.4
- python 2.7.11

### リポジトリ
https://github.com/hirokoma/face_detection_of_base64_string

### コード

~~~python
#!/usr/bin/python
# -*- coding: utf-8 -*-

import sys
import cv2, os
import numpy as np
from PIL import Image
import base64
from StringIO import StringIO

import scipy.misc

# Haar-like特徴分類器
cascadePath = "/path/to/haarcascade_frontalface_default.xml"
faceCascade = cv2.CascadeClassifier(cascadePath)

def readb64(base64_string):
    sbuf = StringIO()
    sbuf.write(base64.b64decode(base64_string))
    pimg = Image.open(sbuf)
    return pimg
    #cv2.cvtColor(np.array(pimg), cv2.COLOR_RGB2BGR)

def detect():
    # グレースケールでbase64を読み込む
    image_pil = readb64(sys.argv[1].replace("\\", "\\\\")).convert('L')
    # NumPyの配列に格納
    image = np.array(image_pil, 'uint8')
    # Haar-like特徴分類器で顔を検知 (パラメータは適当)
    faces = faceCascade.detectMultiScale(image,1.1,9,0)

    scipy.misc.imsave('outfile.jpg', image)

    # 検出した顔画像の座標を表示
    for (x, y, w, h) in faces:
        print x,y,w,h

detect()
~~~
RailsでPDFのテキストを読み込んでみる pdf-reader編

## gemのインストール

* Gemfileに`gem 'pdf-reader'`を追加して`bundle install`


## Pdfの読み込み
* Railsのタスクに登録して見る

```lib/tasks/read_pdf.rake
namespace :read_pdf do
  desc 'PDF読み込み' # rake -T で表示する説明
  task read: :environment do
    # Report.pdfの読み込み処理
    reader = PDF::Reader.new('xxxx.pdf') # 読み込むPDF名
  
    reader.pages.each do |page|
      puts page.text # 読み込んだテキストの出力
    end
  end
end
```

`rails -T` でタスクに登録されているか確認する。

```
$ rails -T
~~~~~略~~~~~
rails read_pdf:read                      # PDF読み込み
~~~~~略~~~~~
$
```

ちゃんと登録されているようなので、`rails read_pdf:read` で実行する。
[こちら](http://www.php-factory.net/demo/news/news05/photo_news/upimg/1025956a18f66dddf4_0.pdf)のPDFサンプルを読み込んでみる

```
$ rails -T
1%' αϯϓϧσʔλ




 ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ 1%'

αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧσʔ
λ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ

1%' αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧ

σʔλ͓஌Βͤ 1%' αϯϓϧσʔλ

                    ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ
                    1%' αϯϓϧσʔλ͓஌Βͤ 1%' α

                    ϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧ

                    σʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓
                    ஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ

                    1%' αϯϓϧσʔλ͓஌Βͤ 1%' α

                    ϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧ
                    σʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓

                    ஌Βͤ 1%' αϯϓϧσʔλ




 ͓஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ

1%' αϯϓϧσʔλ͓஌Βͤ 1%' α

ϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧ
σʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓

஌Βͤ 1%' αϯϓϧσʔλ͓஌Βͤ

1%' αϯϓϧσʔλ͓஌Βͤ 1%' α
ϯϓϧσʔλ͓஌Βͤ 1%' αϯϓϧ

σʔλ͓஌Βͤ 1%' αϯϓϧσʔλ͓

஌Βͤ 1%' αϯϓϧσʔλ
$
```

めっちゃ文字化けした。。。
[GitHub](https://github.com/yob/pdf-reader)の説明を見たら、PDFのエンコードによらずUTF-8でに変換されると。。。

エンコードを指定できなさそうなので、他のGemを探すことに。。。