OmniAICreator/Qiita-1.07M huggingface dataset:
private docker registry を使ってみる

# はじめに
自分のイメージの公開、共有には Docker Hub があるため、困りませんね。ただ、社内で開発しているとパブリックにはできませんが、共有したいイメージも出てきます。そんなときは private docker registry の出番です。

# 環境

* OS: Ubuntu14.04
* docker version: 1.4.1

# 前準備
private docker registry はコンテナですので、データの永続性が保証されません。保証するためには、ホストのディレクトリにマウントする必要があります。

```bash
$ mkdir registry
```

また、デフォルトの private registry はセキュア設定を行っていますので、証明書を用意する必要がありますが、ここでは証明書なしでの利用を想定しております。その場合は、docker deamonのオプションを変更する必要があります。

```conf:/etc/default/docker
DOCKER_OPTS="--insecure-registry [DOCKER_REGISTRY]:5000"
```

```bash
$ sudo service docker restart
```

# registryコンテナ起動
```bash
$ sudo docker run -d -p 5000:5000 \
 -v [PATH]/registry:/tmp/registry \
 registry
```

※[PATH]は適宜修正して下さい。

# 簡単な使い方
## テストイメージの作成
```conf:Dockerfile
FROM ubuntu:14.04

MAINTAINER koide

CMD ["/bin/bash", "-c", "tail -f /dev/null"]
```

```bash
$ sudo docker build -t [DOCKER_REGISTRY]:5000/test .
```

※[DOCKER_REGISTRY]は適宜修正して下さい。

## テストイメージのpush
```shell
$ sudo docker push [DOCKER_REGISTRY]:5000/test
```

## テストイメージのpull
```shell
$ sudo docker pull [DOCKER_REGISTRY]:5000/test
```

## Docker Registry API
### Get Status
```shell
curl [DOCKER_REGISTRY]:5000/v1/_ping | jq '.'
```

# おわりに
基本的にはtagを [DOCKER_REGISTRY]:5000/hoge/fuga などしてやれば、private registry にpushすることができます。
mobmap2の動画出力エラー

mobmapの動画出力機能によって、動画エクスポートした場合に、正常に動画が出力されないときのエラー対処法。

出力されたMP4ファイルのコンテナ（動画データ本体を包むヘッダ等の部分）に異常があり、ffmpegで動画を再出力すると、再生可能な動画を出力できる。

ffmpeg -i movie1.mp4 -vcodec copy movie1-repaired.mp4

※今後のversionアップで改良されるとのこと。
Golang基于TCP/IP的简单聊天程序

Server.go

```
package main

import (
	"fmt"
	"io"
	"net"
	"os"
	"strings"
)

func main() {
	addr, err := net.ResolveTCPAddr("tcp", ":4040")
	checkErr(err)
	listen, err := net.ListenTCP("tcp", addr)
	checkErr(err)
	fmt.Println("Start server...")
	for {
		conn, err := listen.Accept()
		checkErr(err)
		go Handle(conn)// 每次建立一个连接就放到单独的线程内做处理
	}
}

const BufLength = 128

var users map[string]net.Conn = make(map[string]net.Conn, 10)

func Handle(conn net.Conn) {
	conn.Write([]byte("欢迎加入2B聊天组~"))
	for {
		data := make([]byte, 0)//此处做一个输入缓冲以免数据过长读取到不完整的数据
		buf := make([]byte, BufLength)
		for {
			n, err := conn.Read(buf)
			if err != nil && err != io.EOF {
				checkErr(err)
			}
			data = append(data, buf[:n]...)
			if n != BufLength {
				break
			}
		}

		cmd := strings.Split(string(data), "|")
		fmt.Println("命令:", cmd)

		switch cmd[0] {
		case "nick":
			fmt.Println("注册名称:" + cmd[1])
			users[cmd[1]] = conn
		case "say":
			for k, v := range users {
				if k != cmd[1] {
					fmt.Println("给" + k + "发送消息:" + cmd[2])
					v.Write([]byte(cmd[1] + ":[" + cmd[2] + "]"))
				}
			}
		}
	}
}

func checkErr(err error) {
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
}

```

Client.go

```
package main

import (
	"fmt"
	"io"
	"net"
	"os"
)

var nick string = ""

func main() {
	addr, err := net.ResolveTCPAddr("tcp", ":4040")
	checkErr(err)
	conn, err := net.DialTCP("tcp", nil, addr)
	checkErr(err)
	// 读取提示
	data := make([]byte, 1024)
	conn.Read(data)
	fmt.Println(string(data))
	// 输入昵称
	fmt.Print("输入昵称:")
	fmt.Scanf("%v", &nick)
	fmt.Println("Hello " + nick)
	conn.Write([]byte("nick|" + nick))

	go Handle(conn)

	for {
		someTex := ""
		fmt.Scanf("%v", &someTex)
		conn.Write([]byte("say|" + nick + "|" + someTex))
	}
}

const BufLength = 128

func Handle(conn net.Conn) {
	for {
		data := make([]byte, 1024)
		buf := make([]byte, BufLength)
		for {
			n, err := conn.Read(buf)
			if err != nil && err != io.EOF {
				checkErr(err)
			}
			data = append(data, buf[:n]...)
			if n != BufLength {
				break
			}
		}

		fmt.Println(string(data))
	}
}

func checkErr(err error) {
	if err != nil {
		fmt.Println(err)
		os.Exit(-1)
	}
}

```
【FileMaker】ユーザマスタからログインする定番な方法


かどうかわからないけれど、ユーザマスタで管理している個人情報をベースにFileMakerのアプリにログインする方法がどんだけ検索しても出てこないので、これしなかいんだろう、と思ってます。

FileMakerにはアクセス権限を管理してログインとアプリ内でのアクションを制限できますが、これってそのアプリで管理しているユーザ情報と一緒に管理するのって煩雑ですよね。

例えば、社員管理アプリとして、社員情報を社員マスタに登録して、さらにそのひとのアカウントをFileMakerのセキュリティ登録をする、という２段階を踏まないとその人は社員管理アプリを使えないことになります。

わー、めんどくさ。

そして、どちらかを登録し忘れたら終わりです。

わー、サイアク。

なので、社員マスタから直接セキュリティ登録をしてあげます。

結論から言うと、

この画面↓は、単純に言っちゃうと
![1223_1.png](https://qiita-image-store.s3.amazonaws.com/0/60538/979a4bb8-a76c-d8d5-c3fd-b0976c8b870c.png)

スクリプトでいう、この辺でコントロールできます。
![1223_8.png](https://qiita-image-store.s3.amazonaws.com/0/60538/26ac15dc-6e93-e915-865e-c97d2e2a22ba.png)

あぁ、これに気づいたときの脱力感と言ったら！！

ということで、以下の仕掛けを作っていきます。
社員マスタに登録してあるアカウント情報をFileMakerの使用するファイルのセキュリティ管理に反映し、
![1223_4.png](https://qiita-image-store.s3.amazonaws.com/0/60538/f5511ee7-b672-6d34-fd3a-822405b9a9fd.png)

セキュリティ設定をしたFileMakerファイルを開くときにそのユーザマスタ（とFMのセキュリティ管理）に登録したアカウントでログインします。
![1223_9.png](https://qiita-image-store.s3.amazonaws.com/0/60538/38291a4d-5c5b-1bc3-dedb-958fa48f1fc4.png)

まずは、ユーザマスタをば。
![1223_2.png](https://qiita-image-store.s3.amazonaws.com/0/60538/15352fab-a6e1-1057-c309-72cfd3023f6e.png)
ユーザマスタというくらいなのでもっとたくさん項目はありますが、ログインで必要なのはアカウントID、パスワード、アカウントの有効無効情報くらいで足ります。

有効無効はトリガーになるだけなので、別になんでもいいのですが、FileMakerっぽく値一覧で。
![1223_3.png](https://qiita-image-store.s3.amazonaws.com/0/60538/81806064-9557-1388-c601-843a5af38fc2.png)

レイアウトにはいろいろ散りばめてありますが、ログインするためだけの仕掛けは、ここだけです。
![1223_7.png](https://qiita-image-store.s3.amazonaws.com/0/60538/a42143ab-0c14-5024-99a6-92e34fa497fa.png)
「有効無効」の値一覧で「有効」が選択されたら、スクリプトトリガでセキュリティ管理に新規追加してセキュリティ権限を割り振ります。
ここではアクセス権セットを適当に設定していますが、社員の部署やランクによって設定する分岐を入れるとさらに詳細なアクセス権のコントロールができます。

ログイン対象となるファイルのオプションでは、「次のアカウントを使用してログイン」のところは使用しません。
![1223_10.png](https://qiita-image-store.s3.amazonaws.com/0/60538/26fcb746-4395-70e7-d3c4-82bd2e95fd36.png)
また、最初にメニュー画面が出てきてほしいときは、ファイルを開いたときに表示する画面を指定しておくと便利です。

おまけです。

パスワードを変更するときは、パスワード入力欄にカーソルが来た時に旧パスワードをグローバル変数に一時退避させておき、
![1223_6.png](https://qiita-image-store.s3.amazonaws.com/0/60538/c5b6dcc4-17e1-7bd3-316b-e94439dfbb5b.png)

パスワード変更ボタンが押されたら実際にセキュリティ管理で新旧パスワードを指定して実行します。
![1223_11.png](https://qiita-image-store.s3.amazonaws.com/0/60538/eee76921-d5b7-6e29-0ec8-8d11b2c15319.png)


ちなみに、社員が退社してもう管理しなくなった時は、アカウントと社員マスタのレコードを削除することをお忘れなく。![1223_12.png](https://qiita-image-store.s3.amazonaws.com/0/60538/bbe43b1f-b978-b943-282e-7f9cff199785.png)

こんな感じのことって、だれでもどんなアプリでもやることだから、アカウント設定パッケージみたいにワンクリックで設定できればめんどくさくないのになぁといつも思います。
例えば、使用するアカウント情報のテーブルとフィールドをぽちぽち設定したら出来上がりとかね。

毎回同じことを開発するのがめんどくさいので、ここに残しておきます。

# 続編情報
2018/1/23
その後、ログインアカウント情報をレイアウトで表示するやり方を以下で公開しています。
[【FileMaker】続・ユーザマスタからログインする定番な方法〜ログインユーザを表示したい](https://qiita.com/tyuma/items/45df6d0b8ab110e9bcb7)
ご参考までにどうぞ。
"Unable to start service Intent ..."と言われてサービスが起動しない


# 問題

BroadcastReceiverからIntentServiceを起動しようとしているが、以下のようなログが出力されサービスが起動しない。

```
12-23 10:38:18.057    490-28254/? W/ActivityManager﹕ Unable to start service Intent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10 pkg=info.snaka.unitygcmplugindemo cmp=info.snaka.unitygcmplugindemo/info.snaka.unitygcmpluginlib.GcmIntentService (has extras) } U=0: not found
```

# 解決

AndroidManifest.xml の記述間違い

```
<service android:name=".GcmIntentService" />
```

となっていたものを

```
<service android:name="info.snaka.unitygcmpluginlib.GcmIntentService" />
```

と直した。

アプリ本体のパッケージ名と起動するサービスが属するパッケージが異なる場合、パッケージ名を省略せずクラス名を記述擦る必要がある。
物理って面白いなぁっと思う事


この記事は[物理学アドベントカレンダー 2014](http://www.adventar.org/calendars/534)の23日目の記事です。

最近面白いなぁっと思った事を書きます。

まず、BSプレミアムでやっている[コズミックフロント](http://www.nhk.or.jp/space/program/cosmic.html)ってテレビが面白いです。
重力波の観測とか、ダークマターとか宇宙背景放射とか、火星探査とか、へーって思います。
あと、Eテレの[サイエンスZERO](http://www.nhk.or.jp/zero/)も面白い。結構物理の話しもやってて楽しい。12/28は量子コンピュータな話しらしいですよ。放射性物質の拡散は、水に溶ける奴以外に、鉄とガラスとセシウムの固まりであるセシウムボールってのがあるらしく、これが肺に入ると体から抜けなくて大変らしい。

雑誌の[ニュートン](http://www.newtonpress.co.jp/)は楽しかったけど最近見てないなぁ。


[ホログラフィック原理](https://www.google.co.jp/webhp?sourceid=chrome-instant&ion=1&espv=2&es_th=1&ie=UTF-8#safe=off&q=%E3%83%9B%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF%E5%8E%9F%E7%90%86)というのがあるらしいのを誰かのツイットを見て知ったのだけど、これもなんか興味がわいてきました。

重力波の観測と関係しているらしいんだなぁ。面白い。

良くわかってないので、勝手に想像すると宇宙ってコンピュータみたいになっていて、各場を司る粒子が近くの同じ場を司る粒子でボロノイ図を描くように縄張り争いをしていて泡構造を作り出してたりして、その縄張りの四面体の中で力を受けているだけ何じゃないかなとか思うんだけど、そういう理論ってないのかなと思います。

重力とかで場が歪むのって、そういう事なんじゃないかなぁっと。密度が濃いと、光は遅く進む。

宇宙の端っこの重力子みたいなのは無限遠方まで勢力範囲を持っているというか、外側には重力を持つ粒子は出る事が出来なくて、外側に出ようとすると、重力子も外側に押しやられるみたいなことがあるんじゃないかなとか思います。
OptionMenuの内容を動的に変更する

ユーザーの属性によってActivityのOptionMenuの内容を変更したいことがあります。
例えば、ログインユーザーの場合のみ削除メニューを表示するようなケースです。
`onPrepareOptionsMenu`でメニューを操作することで実現できます。

```java
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onPrepareOptionsMenu(Menu menu) {
    MenuItem deleteMenu = menu.findItem(R.id.action_delete);
    deleteMenu.setVisible(isLoginUser());
    return true;
}
```
BroadcastReceiver が無いって言われる


# 問題


Broadcastが流れた瞬間に以下のようなエラーが出てアプリが落ちる。

```
Caused by: java.lang.RuntimeException: Unable to instantiate receiver info.snaka.unitygcmpluginlib.GcmBroadcastReceiver
```

コピペし損なったが、上記メッセージの後に`java.lang.NoClassDefFoundError` が出ていた。


# 解決

このメッセージのちょっと上を見ると`GcmBroadcastReceiver`のスーパークラスが解決できないってワーニングが出てた。

GcmBroadcastReceiver のスーパクラスは WakefulBroadcastReceiver なので、

sdkの中から該当するjarファイルを探したところ、どうやら adt/sdk/extras/android/support/v7/appcompat/libs/android-support-v4.jar が該当するっぽい。

その jar を Plugins/Android にコピーしたら解決した。
OCamlのPPX_Deriving


この記事は[Advent Calender 2014 ML](http://qiita.com/advent-calendar/2014/ml)の19日目の記事です。

今日はPPX_DerivingっていうPPXを使った機能を使うと便利ですという話です。

URLはこちら: https://github.com/whitequark/ppx_deriving

opamでインストールできて

	opam install ppx_deriving


For example, if you are using ocamlbuild, add the following to _tags to use the default deriving plugins:

	<src/*>: package(ppx_deriving.std)

If you are using another buildsystem, just make sure it passes -package ppx_deriving_whatever to ocamlfind.


だそうです。試してないので試してみてください。＜なんという手抜き記事

たとえば、以下のように書くと、HaskellやRustでおなじみのderiving showが出来ます！

	type point2d = float * float
	[@@deriving show]

素晴らしいppx!

追記:

```test.ml
type point2d = float * float
[@@deriving show]

let _ =
    Printf.printf "%s\n" (show_point2d (1.1,2.2));
```

このようなファイルをコンパイルしたい場合

```
$ ocamlfind ocamlopt -package ppx_deriving.show test.ml -o test
$ ./test
(1.1, 2.2)
```

とします。ppx_deriving.showと__.show__を付けるのがポイントです。

OMakefileを使うなら

```
.PHONY: all install clean

USE_OCAMLFIND = true
OCAMLPACKS[] =
    ppx_deriving.show
FILES[] =
  test
PROGRAM = test
.DEFAULT: $(OCamlProgram $(PROGRAM), $(FILES))
```
とします。
UnityでのAndroidバックボタン対応


###概要
AndroidのBackボタンでアプリケーションを終了させたい
（たまに対応してないアプリがあり、イライラするｗ）
![AndroidBackKey.jpg](https://qiita-image-store.s3.amazonaws.com/0/49072/b223d9cd-e702-6716-3dd1-466303283e51.jpeg)

###バックボタンの判定方法は？
```
void Update()
{
	if (Input.GetKeyDown(KeyCode.Escape))
}
```
これでバックボタンのチェックが出来ます。

これだけだと、どの機種プラットフォームのエスケープキーが
反応してしまうので
（例）PCでのエスケープキー

```Test.cs
// プラットフォームがアンドロイドかチェック
if (Application.platform == RuntimePlatform.Android)
{
	// エスケープキー取得
	if (Input.GetKeyDown(KeyCode.Escape))
	{
		// アプリケーション終了
		Application.Quit();
		return;
	}
}
```

###問題点
上記コードでは、有無をいわさずアプリケーション終了するので、
ダイアログボックスで終了確認する処理を入れたほうが良いでしょう。

AndroidのOS側のダイアログボックスの出し方は別の記事で！
![AndroidDialog.jpg](https://qiita-image-store.s3.amazonaws.com/0/49072/4c6e2c03-fc4b-55ab-7414-e1d1140ad226.jpeg)


###参考サイト
http://gupuru.hatenablog.jp/entry/2014/05/16/204102
FlashのSelenium対応

## 目的
* Adobe Flashで作成されたサイトのUIの自動テストがしたい.
    * http://www.adobe.com/jp/products/flashplayer.html
    * 主に,Click,Drag & Drop, Double Clickなど.

## 問題点
* Web Browserの自動テスト=Seleniumを使う,という安直な思考でSelenium Pythonを選択する.
* しかしながら,FlashはHTML上一つのオブジェクトとしてみなされるため,その子供の要素を指定する方法がSeleniumにはない.

## 解決案
* Selenium Web Driver APIに[move_to_element_with_offset(to_element, xoffset, yoffset)](http://selenium-python.readthedocs.org/en/latest/api.html#selenium.webdriver.common.action_chains.ActionChains.move_to_element_with_offset)というMethodがある.これを利用できないか

## 手順
* Flashゲーム・[艦隊これくしょん](http://www.dmm.com/netgame/feature/kancolle.html)を例にして実装方法を説明する.
    * なお,今回は例に用いただけで,実際のゲームに対して行ってはいけません.

 1. Seleniumで画面のScreenShotを取得する.
 2. 予め用意しておいたReference画像から,OpenCVを用いてTemplate Matcingを用いて対象の座標位置(x, y)を取得する
 3. 基準となるHTML Element(今回は会社のロゴ）を指定
 4. 指定したHTML Elementから対象の座標位置との距離を比較し,offset値を決定,先ほどのMethodを利用して実行する.
 
![kancolle03.png](https://qiita-image-store.s3.amazonaws.com/0/3854/1795fdde-43f1-509f-4f7a-ba7a7df59e4a.png)

## 実装
* 今回は単純なClick動作だけを実装する.
    * なお,Selenium Python APIにはDrag & DropやDouble Clickなども実装されているため,本手法を応用すれば十分に実用が可能ではないかと考えられる.面倒くさいからやらないけど.
* なお,今回はBrowserの起動,　OpenCVによるTemplate Matchingについての処理は割愛し,あくまで手順の3-4についての実装になる.その他の実装方法については各Webサイト等を確認して下さい.

    * [Selenium Python](https://selenium-python.readthedocs.org/getting-started.html#simple-usage)
    * [Template Matching](http://opencv-python-tutroals.readthedocs.org/en/latest/py_tutorials/py_imgproc/py_template_matching/py_template_matching.html)


```py3:click.py
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains

class Browser(object):
    ...

    def click(self, element, x, y):
        """
            element : Target HTML Element
            x : offset_x
            y : offset_y
        """
        self.driver = webdriver.Firefox()
        target = self.driver.find_element_by_id(element)
        off_x = int(target.size["width"]) / 2
        off_y = int(target.size["height"]) / 2
        actions = ActionChains(self.driver)
        actions.move_to_element(target)
        actions.move_by_offset(x - off_x, y - off_y)
        actions.click()
        actions.move_to_element(target)
        actions.perform()

    ...

```

* ActionChainsを用いて一連の動作を登録・実行している.
    * Elementを指定した場合,Elementの中心をClickする仕様になっているみたいなので微調整を行う.
* 最後に指定したElementに再度moveしているのは,そのままにしておくとMouseOver判定を食らう可能性があるから.

## 結論
* なんかもっと楽に出来る方法がありそうな気がするけれども.
BigQueryにデータをバッチでインポートする

BigQueryにデータをインポートする際はBigQuery Streamingを利用する[fluentd-plugin-bigquery](https://github.com/kaizenplatform/fluent-plugin-bigquery)がとてもとても便利ですが、BigQuery Streamingは来年から[有料](https://cloud.google.com/bigquery/pricing#storage)になります。

ストレージの課金が容量(GB)単位なのに対してBigQuery StreamingはInsertされた行数(0.01＄/10万行)単位で課金されるようになるのでデータの流量が多いサービスを運営している場合はその費用が気になるところです。

なので[fluentd-plugin-bigquery](https://github.com/kaizenplatform/fluent-plugin-bigquery)と比べると自動化するのが少々面倒ですが、BigQueryにデータをバッチでインポートする方法を考えてみます。

## BigQueryにデータをインポートする

例えばFluentdで集約したアクセスログを1時間毎に区切ってgzip圧縮して保存したファイルをBigQueryにインポートするとして、

```:fluent.conf
<match access_log>
   type file
   path /var/log/bigquery/access_log
   time_slice_format %Y-%m-%dT%H
   time_format %Y-%m-%dT%H:%M:%S
   time_slice_wait 10m
   format json
   buffer_chunk_limit 4g
   compress gzip
</match>
```

BigQueryのテーブルスキーマはこんな感じにしておきます。

```json:schema.json
[
  {
    "name": "time",
    "type": "INTEGER"
  },
  {
    "name": "remote_addr",
    "type": "STRING"
  },
  {
    "name": "uri",
    "type": "STRING"
  },
  {
    "name": "user_agent",
    "type": "STRING"
  },
  {
    "name": "referer",
    "type": "STRING"
  }
]
```

### GCS(Google Cloud Storage)にからBigQueryにデータをインポートする

ローカルにあるデータをそのままBigQueryに流し込むこともできるのですが、非常に時間がかかります(テストで150MBのデータ放り込もうとしたけど30分経っても終わらず)。一方で一旦GCSにインポートしGCSからBigQueryに流し込むとすぐ終わるのでこちらの方法がオススメです。


```
# GCSのaccess_logバケットにデータを放り込む
gsutil cp /var/log/bigquery/access_log.2014-12-23T09_0.log.gz gs://access_log/
```

BigQueryにテーブルを作成してGCSに保存したデータをBigQueryに流し込みます。

```bash
# テーブル作成
bq mk project_id:dataset.table ./schema.json
# データ投入
bq load --source_format=NEWLINE_DELIMITED_JSON project_id:dataset.table gs://access_log/access_log.2014-12-23T09_0.log.gz ./schema.json
```

## まとめ

 * BigQuery Streamingは来年から有料
 * BigQueryにデータをインポートする際は一旦GCSに放り込んでからやると高速でよい
rubyで使える動画・画像解析ライブラリ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

みなさん、こんにちはでス。ruby関連でこんな

 - [rubyで画像処理できるRMagickの紹介をするよ ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい](http://qiita.com/scleen_x_x/items/14a80fd52e41dfcfb660)
 - [ruby と OpenCV, ffmpeg を使用した画像/動画の認識とパフォーマンスについて ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい](http://qiita.com/scleen_x_x/items/7137a58025fbefdbd18f)
 - [複数の動画を画面n分割で同期した動画をつくるのに ffmpeg, opencv, ruby でやってみた ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい](http://qiita.com/scleen_x_x/items/ef5e49c8dd46c74df9b1)

記事を書いているものでス :smile: ところで、動画・画像処理しているといろんなライブラリにお世話になっていて :cry: 便利なものも多いのでまとめて紹介してみる :scream:

え、動画・画像処理ならc言語でやれって？「うるせぇや」

**この記事では以下の絵文字を大事な個所で使用中**

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

# gem の紹介

## :sunny: ffmpeg 使うなら streamio-ffmpeg

https://github.com/streamio/streamio-ffmpeg

 - ffmpegを通して動画のメタ情報を取得できるのは超いい :+1:
 - もちろん普通にffmpegで動画変換するといった使い方も可能
 - 超複雑な `-filter_complex` にどこまで対応しているかは不明

## :sunny: 画像処理だけなら rmagick

https://github.com/rmagick/rmagick

 - 簡単な画像処理におすすめ
 - 変形、色変換、ちょっとしたエフェクト、gifアニメ作成、タイル画像作成、文字入れ等、といった普通の人が必要としているであろう画像処理はほぼ網羅している

RMagickの詳細記事も是非どうぞ

 - http://qiita.com/scleen_x_x/items/14a80fd52e41dfcfb660

## :sunny: opencv 使うなら ruby-opencv

画像処理で、もっと変態的？なマニアックな処理をさせたい場合、顔の抽出とか特徴抽出とかはRMagickではできないのでopencvを使いましょう。

https://github.com/ruby-opencv/ruby-opencv

 - opencv をrubyから使うならこれ一択
 - 基本的な機能は全て使えるようだ ※最新機能のどこまで使えるかは知らない
 - マニアックな機能が多いので自分で調べて :smile:
Love2D:ゲームエンジンその6


###元記事
http://yal.cc/love2d-shooting-things/
シューティングの原型

```lua:main.lua
player = {
	x = 100,
	y = 100,
	speed = 200,
	heat = 0,
	heatp = 0.1
}
bullets = { }
 
function love.update(dt)
	if love.keyboard.isDown('a') then player.x = player.x - dt * player.speed end
	if love.keyboard.isDown('d') then player.x = player.x + dt * player.speed end
	if love.keyboard.isDown('w') then player.y = player.y - dt * player.speed end
	if love.keyboard.isDown('s') then player.y = player.y + dt * player.speed end
	player.heat = math.max(0, player.heat - dt)
	if love.mouse.isDown('l') and player.heat <= 0 then
		local direction = math.atan2(love.mouse.getY() - player.y, love.mouse.getX() - player.x)
		table.insert(bullets, {
			x = player.x,
			y = player.y,
			dir = direction,
			speed = 400
		})
		player.heat = player.heatp
	end
	-- update bullets:
	local i, o
	for i, o in ipairs(bullets) do
		o.x = o.x + math.cos(o.dir) * o.speed * dt
		o.y = o.y + math.sin(o.dir) * o.speed * dt
		if (o.x < -10) or (o.x > love.graphics.getWidth() + 10)
		or (o.y < -10) or (o.y > love.graphics.getHeight() + 10) then
			table.remove(bullets, i)
		end
	end
end
 
function love.draw()
	-- draw player:
	love.graphics.setColor(0, 255, 0, 255)
	love.graphics.circle('fill', player.x, player.y, 15, 8)
	-- draw bullets:
	love.graphics.setColor(0, 0, 255, 255)
	local i, o
	for i, o in ipairs(bullets) do
		love.graphics.circle('fill', o.x, o.y, 10, 8)
	end
end
 
function love.load()
	love.graphics.setBackgroundColor(0, 0, 0)
end
```
###Zip
作業ディレクトリで以下コマンド発行
zip -r ../${PWD##*/}.love *

###Run
はい出来ました。
![スクリーンショット 2014-12-23 6.06.56.png](https://qiita-image-store.s3.amazonaws.com/0/33317/f9bc197f-b520-4446-7dab-585517997e80.png "スクリーンショット 2014-12-23 6.06.56.png")
vpexpandd

SIMDの天敵として、綺麗に並んでいないデータがあります。


この問題はソフトウェアの設計、仕様とも関わる難しい問題で、一発で問題解決する銀の弾丸は無いのですが、少しでも状況を良くするために、便利そうで便利でない少し便利な命令みたいなのは定期的に追加されてる印象があります。

- 定数しかとれないalignr
- マスク作る余裕があるならpshufbのパターン作れる気がするpmaskmov
- ソフトウェア実装より遅いvpgather


そういうあったらちょっと便利な気がするけど具体例すぐ思い付かない命令ファミリー(vpgatherは確実に便利だけど…)に追加されたのが、vpexpandd, vpcompressd 等のexpand,compress 命令です。

vpexpandd は、マスクの値を使って、連続するデータを飛び飛びにしてくれる命令です。


```cpp
#include <immintrin.h>
#include <stdio.h>

unsigned int in[16] = {100,101,102,103,
                       104,105,106,107,
                       108,109,110,111,
                       112,113,114,115
};

unsigned int out[16];

void test(__mmask16 mask)
{
    for (int i=0; i<16; i++) {
        out[i] = -1;
    }

    __m512i v = _mm512_loadu_si512(out);

    v = _mm512_mask_expandloadu_epi32(v, mask, in);
    _mm512_storeu_si512(out, v);

    printf("0x%04x: ", mask);
    for (int i=0; i<16; i++) {
        printf("%3d, ", out[15-i]);
    }
    puts("");
}

int
main()
{
    printf("      | ");
    for (int i=0; i<16; i++) {
        printf("%3d, ", 15-i);
    }
    puts("\n---------------------------------------------------------------------------------------");

    test(1);
    test(0xaaaa);
    test(0x8888);
    test(0x0303);
    test(0x0462);
    test(0xffff);
}

```


```
      |  15,  14,  13,  12,  11,  10,   9,   8,   7,   6,   5,   4,   3,   2,   1,   0,
---------------------------------------------------------------------------------------
0x0001:  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1, 100,
0xaaaa: 107,  -1, 106,  -1, 105,  -1, 104,  -1, 103,  -1, 102,  -1, 101,  -1, 100,  -1,
0x8888: 103,  -1,  -1,  -1, 102,  -1,  -1,  -1, 101,  -1,  -1,  -1, 100,  -1,  -1,  -1,
0x0303:  -1,  -1,  -1,  -1,  -1,  -1, 103, 102,  -1,  -1,  -1,  -1,  -1,  -1, 101, 100,
0x0462:  -1,  -1,  -1,  -1,  -1, 103,  -1,  -1,  -1, 102, 101,  -1,  -1,  -1, 100,  -1,
0xffff: 115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100,
```


皆さんもこの便利な命令の使いかたを考えてみましょう！(「俺は思い付かなかった」をオブラートに包んだ表現)

一応

https://gcc.gnu.org/wiki/cauldron2014?action=AttachFile&do=get&target=Cauldron14_AVX-512_Vector_ISA_Kirill_Yukhin_20140711.pdf

では、


```cpp

for (j=0, i=0; j<N; j++) {
    if (C[i] != 0.0) {
        B[i] = A[i] * C[j++];
    }
}
```

という例が挙げられてますね。(でもこれやるなら、いくつスキップしたか情報無いと結局マスクをpopcntしないといけない気がするんですが…)



明日は @tanakmura が vpcompressd について書きます。
【インストール不要】標準で使えるWindows TIPS集

## 背景
人の端末で作業したり、人に作業をお願いするときに「あ、あのコマンドが使えない」とか、割と頻繁に発生します（よね？）。

そういう時に重宝するのがWindowsの標準で使える機能を。基本的なものから、少しトリッキーなものまで、よく使うもの、役に立ったものを雑多にメモしていこうと思います。逐一更新していこうかと。

```
> DIR
```
のように先頭に`>'が付いてる例はコマンドプロンプトから実行するという意味です。

## ショートカット系
### エクスプローラーで表示中のディレクトリをコマンドプロンプトで開く
```
Shiftキー + エクスプローラの空白部分右クリック ⇛ 「コマンドウィンドウでコマンドウィンドウをここで開く」
```
意外と知らない人が多いようなので・・・

### 一つ上のディレクトリを開く
```
Altキー + ↑
```

### ファイルの名前の変更
```
ファイル、ディレクトリを選択してF2キー
```

### コマンドプロンプトを開く
```
Windowsマーク + R ⇛ "cmd"とタイプ ⇛ エンター
```
`Windowsマーク + R`で`ファイル名を指定して実行`が開き。cmdでコマンドプロンプト実行

### 電卓を開く
```
Windowsマーク + R ⇛ "calc"とタイプ ⇛ エンター
```
### メモ帳を開く
```
Windowsマーク + R ⇛ "notepad"とタイプ ⇛ エンター
```

### ペイントを開く
```
Windowsマーク + R ⇛ "mspaint"とタイプ ⇛ エンター
```

### 再起動(リモートデスクトップとかバッチとかから)
```
> SHUTDOWN /R /T 0
```
`/R`で再起動`/T 0`で0秒後を指定。`/R`の代わりに`/S`でシャットダウン。

## ファイル操作系
### ファイルの比較(diffの超簡易版)
```
> COMP ファイル1 ファイル2
```

### ディレクトリツリーを表示
```
> TREE /F
```

ディレクトリのみでよければ

```
> TREE
```

標準の機能とはちょっとずれるけど、よくリダイレクトと組み合わせて

```
> TREE /F > tree.txt
↓
tree.txt をサクラエディタで開く
↓
矩形選択で相対パスだけ切り抜いてコピー
↓
エクセルに貼っつけ
↓
数式を駆使してコピーコマンド作成
↓
コマンドプロンプトに貼り付けて実行
```
とかやってます。

### ファイル一覧を取得
```
> DIR /S /B
```

### tail -f
結論からいうと標準で簡単な方法はない。何かしらのソフトを入れたほうが楽。
<small>一応バッチを作ることは可能なようだが・・・そこまでするならね・・・
⇛[http://scripting.cocolog-nifty.com/blog/2007/05/tail_f_0b9c.html]()</small>
Twitter4Jで有名な山本 裕介さんの[侍](http://samuraism.jp/samurai/ja/index.html)とか入れたほうがいいんじゃないか？

### ファイルを新規作成
```
echo > (ファイル名)
```
リダイレクトでテキストファイルを作ってるだけだけど・・・

### テキストファイルを標準出力に
```
> type (ファイル名)
```

### ページャー
```
> MORE (ファイル名)
```

もしくは

```
コマンド | MORE
```

## プロセス系
### タスク一覧
```
> TASKLIST
```

### プロセスを強制終了
```
> TASKKILL /IM /F nnotepad.exe
```
他にもpid指定で終了とかワイルドカードとか使えるのでたまに使う。

## ネットワーク系
### 自端末のipを調べる
```
> IPCONFIG
```

### ping
```
> PING (ipアドレス)
```

### 名前解決
```
> NSLOOKUP (IPアドレス or ホスト名、ドメイン名)
```
ホスト名⇛IPアドレス　の変換だったらping打つ事のほうが多いかも

## コマンド系
### コマンドのヘルプを表示
windows標準のコマンドならばほとんどのコマンドで以下のように`/?`をつけることでHELPが表示される。(Linux系のmanコマンドみたいなもん？)

```
> (コマンド) /?
```

### 環境変数を確認
```
> SET [変数名]
```

### 環境変数を変更
```
> SET 変数名=値
```

### 環境変数を参照
`%変数名%`のようにコマンド内に`%`で囲まれた文字があった場合、実行時に値に変換されてから実行します。C言語のマクロのようなイメージです。その文字列に置き換えられてから実行されるので

```
> SET HOGE=cd
> %HOGE&
```

とすれば結果として`cd`コマンドが実行されます。

### コマンドの実行結果を環境変数に代入
```
> FOR /F "usebackq" %i IN (`コマンド`) DO SET 変数名=%i
> ECHO 変数名=%変数名%
```
linuxなら``変数名=`コマンド```で一発なのにね・・・

### コマンドの実行結果で挙動を変える

```
> コマンド
> IF NOT "%ERRORLEVEL%"=="0" (
>   異常終了時の処理
> )
```

あるいは

```
> コマンド
> IF errorlevel 1 (
>   異常終了時の処理
> )
```
違いは調べて。
opencvのサンプルコードをビルドする方法 ヽ(ﾟｰﾟ*ヽ)(ﾉ*ﾟｰﾟ)ﾉわぁい

忘れぬようにメモ :smile: OpenCV は便利なサンプルコードも一緒に配布されているので何か試したい時に便利 :+1: というわけで個別にサンプルをビルドしようとしたら失敗したので調査 :pencil:

**この記事では以下の絵文字を大事な個所で使用中**

 - :exclamation: 注意点
 - :boom: 予期せぬ例外やエラーメッセージ
 - :sunny: 解決方法・お役立ち情報

# ビルド環境

 - Ubuntu 12.04

# サンプルをビルドする

普通にビルドするとサンプル(`examples`内で配布されているもの)はビルドされないので`cmake`するときのオプションを指定

## :sunny: ビルド時の cmake でオプションを指定する

```
cmake -D BUILD_EXAMPLES=ON .
```

このときコンソール上に

```
--   Tests and samples:
--     Tests:                     YES
--     Perfomance tests:          YES
--     C/C++ Examples:            YES
```

となっていればOK

### :boom: 失敗例

```
--   Tests and samples:
--     Tests:                     YES
--     Perfomance tests:          YES
--     C/C++ Examples:            NO
```

のように`NO`になっていたら何か間違っている。

:exclamation: ちなみに BUILD_SAMPLES だとうまくいかなかった。

# 参考

 - http://stackoverflow.com/questions/13146650/compiling-opencv-samples-unknown-cmake-command-ocv-check-dependencies
erb, haml のトルツメ


たとえばこういうテーブルがあるとしましょうよ。

| 項目 | 内容 |
|------------:|:------------|
|     都道府県|     東京都     |
|      市町村 |    北区    |
|        郵便番号 |    11x-xxxx     |
| モバイル |    example@trick-with.net      |
|       PC|    hogehoge@trick-with.net    |
|     姓|   大久保    |
| 名| 康平|

でね、あるデータでは、PCアドレスが無かったり、市町村が未入力だったりするとします。そういうときは、空の枠を残さずに、以下のようにしたい、としましょう。(俗に言うトルツメ)

| 項目 | 内容 |
|------------:|:------------|
|     都道府県|     東京都     |
|        郵便番号 |    11x-xxxx     |
| モバイル |    example@trick-with.net      |
|     姓|   大久保    |
| 名| 康平|

別のある人は、モバイルアドレスと苗字しか教えてくれませんでした。この場合は、名の行は空で表示したい、としましょう。

| 項目 | 内容 |
|------------:|:------------|
| モバイル |    example@trick-with.net      |
|     姓|   大久保    |
| 名| |

姓も名もなければこうなる、としましょう。

| 項目 | 内容 |
|------------:|:------------|
| モバイル |    example@trick-with.net      |
で、もし何も入力されない場合には、テーブルごとトルツメしたいわけです。

というようなことを Rails で綺麗に実現できまいか、と考えたのがこれ。

```helper/application.rb:ruby
module ApplicationHelper
  def omit(val = nil, &block)
    unless block_given?
      raise 'no parent block' if @_omit.empty?
      @_omit[-1] = false unless val.nil?
      return val
    end
    
    raise "Don't pass a value with block" if val
    @_omit ||= []

    @_omit.push true
    ret = capture(&block)
    return nil if @_omit.pop
    
    @_omit[-1] = false unless @_omit.empty?
    ret
  end
end
```

使い方はこんなん。
omit do ブロック内に omit(value) を並べ、 nil でない value が1つでも存在すれば、ブロック全体を表示、なければブロック全体をトルツメする。
omit をネスト出来るようにするのにけっこう頑張った。

```haml
= omit do
  %table
    %tr
      %th 小分類
      %th 内容
    = omit do
      %tr
        %th 都道府県
        %td= omit user.prefecture
    = omit do
      %tr
        %th 市町村
        %td= omit user.city
    = omit do
      %tr
        %th 郵便番号
        %td= omit user.zip_code
    = omit do
      %tr
        %th モバイル
        %td= omit user.email_mobile
    = omit do
      %tr
        %th PC
        %td= omit user.email_pc
    = omit do
      %tr
        %th 姓
        %td= omit user.family_name
      %tr
        %th 名
        %td= omit user.given_name
```
空文字 ``""`` を無視したい場合は、```omit hoge.presence``` とすればOK.

もし omit メソッドを気に入ってくれて頻繁に使うなら、メソッド名を ``_`` とかにしちゃえば？

rspec も書いといた。 https://gist.github.com/kuboon/6b3084e1b87adb9f8fd3#file-application_helper_spec-rb
[iOS] 「初回のみxxする」「xx回だけyyする」「xxからyy日経過した場合にzzする」的な処理を簡単に書く方法

アプリを作っていると、特定のイベントの回数や実行時間に依存した処理を書くことが必要な場面が多々あります。
例えば以下の様な処理です。

- ある機能を利用する際、初回時のみガイダンスを表示
- ある機能を利用する際、最初の3回のみ使い方の説明を表示
- 広告POPUPを1時間に１回のみ表示
- 起動後にキャンペーンのお知らせを1日に1回だけ表示させたい

これらはイベントの回数や時刻を永続化するだけで簡単に書ける処理ではありますが、毎回同様の処理を書くのは手間でもあります。

そこで、このような用途のためにイベントの回数と時刻を永続化しておくだけのライブラリを書きました。

※Android版は[こちら](http://qiita.com/shoma2da/items/7f399eee4fedcd656540)です。

## SRGEventDateRecorder

https://github.com/soragoto/SRGEventDateRecorder

## 導入してみる
Podfileに以下の行を追加して`pod update`します。

```ruby:Podfile
pod 'SRGEventDateRecorder'
````

導入後は利用するクラスファイルで`SRGEventDateRecorder.h`をimportすれば利用できます。

## 使い方

１イベントごとに１つの`SRGEventDateRecorder`インスタンスを作ります。
インスタンス生成時にそのイベントに対してユニークなKeyを割り当てます
例えば、ある機能を使うというイベントの`key`が`use_my_awesome_feature`だった場合、以下のようになります。

### イベントの記録

```objc
SRGEventDateRecorder *recorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
[recorder record]; // 記録
```

### 記録したデータの利用

```objc
SRGEventDateRecorder *eventRecorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];

// BOOL:イベント１度でも実行(記録）されたかどうか？
eventRecorder.didRecorded;

// NSUInteger: イベントが記録された回数
eventRecorder.recordedCount;

// NSDate:イベントが記録された日付
eventRecorder.recordedDate;

// BOOL: イベントが記録されてから1日経過してるかどうか？
[eventRecorder didElapsedSinceLastRecordedDateWithSeconds:60*60*24];
```

### データのクリア
```objc
SRGEventDateRecorder *eventRecorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
[eventRecorder clear];
````


### 具体例

ある機能の利用をイベントとして扱う時、利用時にイベントを記録しておく

```objc
SRGEventDateRecorder *recorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
[recorder record];
````

機能を使う時、初回だけ特別な動作をさせたいケース

```objc
SRGEventDateRecorder *recorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
if( !recorder.didRecorded ){
    // 機能が１度も利用されてない時のみ実行したい処理を書く
}
```


機能を使う時、3回目までだけ特別な動作をさせたいケース

```objc
SRGEventDateRecorder *recorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
if( recorder.recordedCount <= 3){
    // 3回目までだけ実行させたい処理
}
```

機能を使う時、前回利用から1日以上経過してる場合にだけ特別な動作をさせたいケース

```objc
SRGEventDateRecorder *recorder = [SRGEventDateRecorder recorderWithKey:@"use_my_awesome_feature"];
if( [recorder didElapsedSinceLastRecordedDateWithSeconds:60*60*24){
    // 前回利用から1日以上経過してるときにだけ実行したい処理
}
```

以上、`SRGEventDateRecorder`の紹介でした。
利用することで楽ができそうな画面があれば、使ってみてください。
helper内でのプロパティー定義

ドキュメントによると、Lightningでは、コントローラー内からコントローラー内の別のメソッドを呼ぶ代わりに、ヘルパー関数を呼ぶことが推奨されています。ヘルパー関数から別のヘルパー関数を呼ぶのはthisオブジェクトを使えば問題なくできます。

ヘルパーオブジェクトには、関数以外のプロパティーも定義することができます。（コントローラーでは関数しか定義できません。レンダラーでもプロパティーは定義できるようです。）

```js:ComponentHelper.js
({
    b : false,
    num : 3,
    str : '"data"',
    s : {str : "data"},
    getConstStr : function(){ return 'const'; },
    test : function() {
      	console.log(this.b);
      	this.b = true;
      	console.log(this.b);
      	console.log(this.str);
    }
})
```

しかしながら、正規表現リテラル(/re/)やオブジェクトのnew、あるいは関数の実行結果などを割り当てようとすると保存時にエラーになりますし、"で括られていない文字列を定義するとなぜか実行時エラーになります。

> false||data
`Uncaught ReferenceError: data is not defined`

定数文字列などを簡単に定義したい場合には、上記のように一段オブジェクトの中にしまうか、文字列を返す関数を用意すると良いです。より複雑なことをやりたい場合はアクセス用の関数を用意するという方法もあるかもしれません。

```js:ComponentHelper.js
({
    props : null,
    setProp : function(name, value){
        if (!this.props)
            this.initProps();
        this.props[name] = value;
    },
    getProp : function(name) {
        if (!this.props)
            this.initProps();
      	return this.props[name]; 
    },
    initProps : function(){
        this.props = {d: new Date(), re: new RegExp(), o: {}};
    },

    testProps : function(){
        console.log(this.getProp('d'));
        this.setProp('a', new Date());
        console.log(this.getProp('a'));
    }
})
```

しかしながら、ここまでやるなら、AuraStorageServiceを使うのが本筋と思われます。[AuraStorageServiceについては別記事でご紹介](http://qiita.com/twk/items/6b3285ac66df6948b200)しています。
Juliaで楽しくWebスクレイピング！

#はじめに
科学計算向けスクリプト言語「[Julia（JuliaLang）](http://julialang.org/)」の利点の一つは、
データ前処理と統計処理、そしてその結果のレポートを、Pythonと同じように一貫して行える事にあります。
そして、Juliaは多くのケースでPythonよりも早いと言われています。
しかし、Juliaの最新バージョンは0.4であり、
ライブラリが出揃っている状態ではなく、又、ライブラリの情報も知れ渡っているものではありません。
今回は、JuliaでWebスクレイピング（Webページからデータを抽出する事）に使えそうなライブラリを調べてみました。
（Beautiful SoupをPyCall.jlで使う方法も考えましたが、今回は紹介しません）

#01.Webページをダウンロードする。 [[Requests.jl](https://github.com/JuliaWeb/Requests.jl), [HttpCommon.jl](https://github.com/JuliaWeb/HttpCommon.jl)]
[Requests.jl](https://github.com/JuliaWeb/Requests.jl)の関数「get(URI, クエリ文字列)」でWebページをダウンロードします。
その際、[HttpCommon.jl](https://github.com/JuliaWeb/HttpCommon.jl)の関数「encodeURI(エンコード前の文字列)」でWebページのURIをエンコードしておきます。
getの返り値のメンバー変数「data」からソースコードを読み取ります。

```jl:Webページをダウンロードする.jl
Pkg.add("Requests")
Pkg.add("HttpCommon")

using Requests
using HttpCommon

request = get("http://www.nicovideo.jp/search/" * encodeURI("東方project"), query = {:hft => "0", :itc => "1", :ct => "2", :cip => "1"})
code = request.data
```

#02.Webページのソースコードを解釈する。[[Gumbo.jl](https://github.com/porterjamesj/Gumbo.jl)]
[Gumbo.jl](https://github.com/porterjamesj/Gumbo.jl)のparsehtml(HTMLの文字列)でソースコードを解釈します。
Gumbo.jlはHTML構文解析ライブラリGumbo（Google製）のJuliaラッパーです。

```jl:ソースコードを解釈する.jl
Pkg.add("Gumbo")

using Gumbo

doc = parsehtml(code)
```

#03.指定要素を取得する。
[Gumbo.jl](https://github.com/porterjamesj/Gumbo.jl)で要素を取得する方法は、
ジャグ配列（配列の配列）として指定する方法とイテレーターの中で指定する方法の2つがあります。
CSSセレクターやXPathのような高度な指定方法はないようです。

```jl:ジャグ配列として指定する.jl
elem = doc.root[2][7][1]
elem
  # => HTMLElement{:div}:
  #    <div class="inner"> ……
```

```jl:イテレーターの中で指定する.jl
for elem in preorder(doc.root)
  if isa(elem, HTMLElement)
    #タグの場合
    #(特になし)
  elseif isa(elem, HTMLText)
    #テキストの場合
    println(elem.text)
      # => キーワードで動画検索
      #    niconico ……
  end
end
```

※イテレーター自体の指定方法はpostorder（前から）・preorder（後ろから）・breadthfirst（幅優先）の3つがあります。

#04.指定要素を判別し、値を取得する。
要素にはHTMLElement（タグ）とHTMLText（テキスト）の2種類の型があるようです。
それぞれの型で値を取得する方法は違っています。

```jl:HTMLElementから値を取得する.jl
#タグ名を取得
tag(elem)
  # => ;div

#属性一覧を取得
elem.attributes
attrs(elem)
  # => Dict{String,String} with 1 entry:
  #      "class" => "inner"

#子要素一覧を取得
elem.children
children(elem)
  # => 2-element Array{HTMLNode,1}:
  #     HTMLElement{:div}
  #     HTMLElement{:div}

#親要素一覧を取得
elem.parent
  # => HTMLElement{:section}:
  #    <section class="tagCaption"> ……

#属性を取得
getattr(elem, "class")
  # => "inner"

#属性を設定
setattr!(elem, "id", "divInner")
  # => "divInner"
```

```jl:HTMLTextから値を取得する.jl
txt = doc.root[2][7][1][1][1][1][1][1]

#テキストを取得
txt.text
  # => "Example text"
```

#終わりに
PythonのBeautiful Soupのような高度なHTMLパーサーが欲しい所です。
AuraStorageServiceの使用

`$A.storageService`から[AuraStorageService](https://na16.lightning.force.com/auradocs/reference.app#reference?topic=api:AuraStorageService)にアクセスでき、キーバリューストア的なストレージを使うことができます。

```js
var myStorage = $A.storageService.getStorage("myStorage");
if (!myStorage)
    myStorage = $A.storageService.initStorage("myStorage");        
myStorage.put("key", "value");
myStorage.get("key", function(value){
    $A.assert("value" == value);
});

var yourStorage = $A.storageService.getStorage("yourStorage");
if (!yourStorage)
    yourStorage = $A.storageService.initStorage("yourStorage");
yourStorage.get("key", function(value){
    $A.assert($A.util.isUndefined(value));
});
```

storage名が違うとキーが同じでも値は保持されていません。
`get`メソッドの戻り値は`void`で、コールバック関数で値を受け取らなければならないのが辛いところです。

（ちなみに上記コードでは格好をつけて`assert`メソッドを呼んでいますが、`assert`メソッドの中身は現在空のようなので条件が`false`になっても何も起きません。必要な方は下記のように定義しておきましょう。）

```js
$A.assert = function(condition, msg) {
    if (!condition) { $A.error(msg||"Assertion failed"); $A.trace(); } 
};
```

`initStorage`の2つ目の引数では永続性の設定が可能です。`true`にすると`WebSQLStorageAdapter`が、`false`にすると`MemoryStorageAdapter`が選択されるようです。永続化していると、ページ遷移しても値を保持し続けることができます。

```js
var myStorage = $A.storageService.getStorage("myStorage");
if (!myStorage)
    myStorage = $A.storageService.initStorage("myStorage", true);        
myStorage.get("key", function(oldValue){
    console.log("value before put=?" + oldValue);
    myStorage.put("key", new Date().toLocaleString());
    myStorage.get("key", function(newValue){
        console.log("value after put=?" + newValue);
    });
});
```

`WebSQLStorageAdapter`では値をjsonにして格納していましたので、オブジェクトの格納時はご注意ください。

上記ドキュメントに記載されている`initStorage`のその他の引数については調べていませんが、少なくとも`debugLoggingEnabled`を`true`にしてもログは出力されないようです。

気になる使いどころですが、例えば、UIで選択したソート項目などを保持する目的には有用でしょうか？

なお、storage名が同じだと別コンポーネントからもアクセス可能です。**別名前空間、別アプリからもアクセス可能かは確認していません**が、もし可能だった場合は、ストレージ名に名前空間やアプリ名、コンポーネント名などを含む規約にしないと、思わぬ不具合の原因になりそうですので、試した方は結果を教えていただけると嬉しいです。
html のトルツメ


たとえばこういうテーブルがあるとしましょうよ。

| 項目 | 内容 |
|------------:|:------------|
|     都道府県|     東京都     |
|      市町村 |    北区    |
|        郵便番号 |    11x-xxxx     |
| モバイル |    example@trick-with.net      |
|       PC|    hogehoge@trick-with.net    |
|     姓|   大久保    |
| 名| 康平|

でね、あるデータでは、PCアドレスが無かったり、市町村が未入力だったりするとします。そういうときは、空の枠を残さずに、以下のようにしたい、としましょう。(俗に言うトルツメ)

| 項目 | 内容 |
|------------:|:------------|
|     都道府県|     東京都     |
|        郵便番号 |    11x-xxxx     |
| モバイル |    example@trick-with.net      |
|     姓|   大久保    |
| 名| 康平|

別のある人は、住所を教えてくれなくて、かろうじてモバイルアドレスだけ教えてくれたので、こんな感じに表示したい、としましょう。

| 項目 | 内容 |
|------------:|:------------|
| モバイル |    example@trick-with.net      |
|     姓|   大久保    |
| 名| 康平|

で、もし何も入力されない場合には、テーブルごとトルツメしたいわけです。

というようなことを Rails で綺麗に実現できまいか、と考えたのがこれ。

```helper/application.rb:ruby
module ApplicationHelper
  def omittable(&block)
    omittable = Omittable.new
    ret = capture(omittable, &block)
    omittable.compact.empty? ? nil : ret.html_safe
  end
end

class Omittable < Array
  def <<(val)
    super
    val
  end
end
```

使い方はこんなん。
b は Array で、b に nil 以外の何かがあれば omittable ブロック全体を表示、
b.compact.empty? なら、omittable ブロック全体が nil を返す。

```haml
= ommitable do |b|
  %table
    %tr
      %th 小分類
      %th 内容
    =b<< ommitable do |b|
      %tr
        %th 都道府県
        %td=b<< user.prefecture
    =b<< ommitable do |b|
      %tr
        %th 市町村
        %td=b<< user.city
    =b<< ommitable do |b|
      %tr
        %th 郵便番号
        %td=b<< user.zip_code
    =b<< ommitable do |b|
      %tr
        %th モバイル
        %td=b<< user.email_mobile
    =b<< ommitable do |b|
      %tr
        %th PC
        %td=b<< user.email_pc
    =b<< ommitable do |b|
      %tr
        %th 姓
        %td=b<< user.family_name
    =b<< ommitable do |b|
      %tr
        %th 名
        %td=b<< user.given_name
```
"" を無視したい場合は、```b<< hoge.presence``` とすればOK.

もっと綺麗な実装法ありますかね。
WPFでクリックすると画像の変わるボタン(XMLで描いたベクターイメージ)

PNG画像を張り付けたものはサンプルがあったのですが、
XMLで描いたベクターイメージを張り付けるサンプルは見つからなかったので。。。
せっかくWPF使うならベクターで描きたいですよね。

以下のコードはクリックすると**〇**が<font color=red weight=bold>**ロ**</font>になる`ToggleButton`のサンプルです。

(ネストがひどいことになってるｗ)

```xml:MainWindow.xaml
<Window x:Class="WpfApplication3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <ToggleButton Height="33" Width="33" Margin="68,64,0,0"
                      HorizontalAlignment="Left" VerticalAlignment="Top" Cursor="Hand">
            <ToggleButton.Template>
                <ControlTemplate TargetType="ToggleButton">
                    <Canvas Name="ToggleButtonCanvas">
                        <Canvas.Background>
                            <VisualBrush>
                                <VisualBrush.Visual>
                                    <Canvas>
                                        <Ellipse StrokeThickness="2" Fill="#FFF4F4F5"  Stroke="Black"
                                                 Height="33" Width="33" Margin="5,5,5,5"
                                                 HorizontalAlignment="Left" VerticalAlignment="Top"/>
                                    </Canvas>
                                </VisualBrush.Visual>
                            </VisualBrush>
                        </Canvas.Background>
                    </Canvas>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="ToggleButtonCanvas" Property="Background">
                                <Setter.Value>
                                    <VisualBrush>
                                        <VisualBrush.Visual>
                                            <Canvas>
                                                <Rectangle StrokeThickness="2" Fill="#FFF4F4F5" Stroke="Red"
                                                           Height="33" Width="33" Margin="0,0,0,0"
                                                           HorizontalAlignment="Left" VerticalAlignment="Top"/>
                                            </Canvas>
                                        </VisualBrush.Visual>
                                    </VisualBrush>
                                </Setter.Value>
                            </Setter>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </ToggleButton.Template>
        </ToggleButton>
    </Grid>
</Window>
```
（質問）チェックボックスprintの先でチェックボックスprint

以下のコードについて質問があります。
「ソ連へ行く」を選択すると、飛んだ先は「ここはソ連です」となります。
「ここはソ連です」の欄にもこのコードと同じようなチェックボックスを使うページを作りたいのですが、そのままこのタグをのせるとなると長くなってしまいますし、見辛いと思います。

例えばですが、「ここはソ連です」の欄にもこれと同じコードを反映させたい場合、どのようにすることがオススメですか？
よろしくお願いします。

```php
<?php

if (isset($_POST["submit"])) {
	if ($_POST["morw"] == "ソ連へ行く") {
		print "ここはソ連です";
	}
	elseif ($_POST["morw"] == "満州へ行く") {
		print "ここは満州です";
	}
	else {
		print "どちらかチェックしてから [送信] ボタンを押してください。";
	}
}

?>
ソ連へ行く？それとも満州？<br>
<form action="./radio.php" method="POST">
	<input type="radio" name="morw" value="ソ連">ソ連　<input type="radio" name="morw" value="満州">満州　
	<input type="submit" name="submit" value="送信">
</form>
```
powerlineのfontpatcherメモ(mac)

powerlineが文字化けしているのを治すためにfontpatcherを使いたいと思って試行錯誤した結果３時間くらいもってかれたのでメモ

1.fontpatcherをgit clone

    git clone https://github.com/powerline/fontpatcher.git

2.powerline/fontsをgit clone

    git clone https://github.com/powerline/fonts.git

3.fontpatcher実行

    fontpatcher/scripts/powerline-fontpatcher fonts/SourceCodePro/Sauce\ Code\ Powerline\ Regular.otf

4.Font Bookに登録

    open Sauce Code Powerline for Powerline.otf

5.iTerm2(or Terminal)の環境設定を開く

6.フォント設定を"Sauce Code Powerline for Powerline"にする

以上
[blackbird-named] blackbird で Bind(named) をモニタリングする

# blackbird named plugin

この plugin では named の statistics-channels から様々な情報を取得し、backend にデータを送信します

![named.png](https://qiita-image-store.s3.amazonaws.com/0/40416/f1e40483-e023-12cf-fdf2-0015eda1e5b0.png)


## statistics-channels

bind の機能で統計情報を xml で吐き出す事ができます

詳しくは[こちら](https://kb.isc.org/article/AA-00769/0/Using-BINDs-XML-statistics-channels.html)を参照してください

bind を運用しているところは自前で compile とかしている方も多いと思いますが、compile 時に `--with-libxml2` しないとこの機能は有効になりません

ちなみに redhat 系であれば rpm が提供されていますが、この rpm はありがたいことに `--with-libxml2` で作られています


# Install

## blackbird 本体

[こちら](http://qiita.com/makocchi/items/9166016b2ad4cc43e83f)を参考に install してください

## Install named plugin

setup.py で入れる方法と rpm で入れる方法があります

### setup.py で install

```bash
git clone https://github.com/Vagrants/blackbird-named.git
cd blackbird-named
python setup.py install
```

### rpm で install

```bash
yum install blackbird-named --enablerepo=blackbird
```

# plugin の設定をする

config は `/etc/blackbird/conf.d/named.cfg` にあります

```ini:/etc/blackbird/conf.d/named.cfg
[named]
module = 'named'

# NOTICE
#  - bbd user needs permission to execute rndc.
#    edit /etc/blackbird/defaults.cfg and change user and group.
#
#    user = root
#    group = root
#
#  - if you do not need rndc information, comment out 'rndc-path'
rndc_path = '/usr/sbin/rndc'

# statistics-channels
#  - please set statistics-channels in named.conf
#
# ex)
# statistics-channels {
#         inet 127.0.0.1 port 5353 allow { 127.0.0.1/32; };
# };
#
statistics_host = '127.0.0.1'
statistics_port = '5353'
```

`rndc status` の値もモニタリングするようにできてますが、通常であれば `rndc` は権限的に blackbird が動く bbd user では実行できません

この場合は blackbird の実行権限を root にすることでモニタリング可能になります

```ini:/etc/blackbird/defaults.cfg
[global]
user = root
group = root
```

が、root で動かすのもどうかなって思うので、内部的には `sudo` して叩くように変えようと思います・・(まだ未実装)

監視の間隔は 60 秒がデフォルトですが、変更したい場合は

```ini:/etc/blackbird/conf.d/named.cfg
interval = 30
```

のように指定してください

設定が終わったら `blackbird` を再起動させます

```bash
sudo /etc/init.d/blackbird restart
```

# named.conf で statistics-channels を有効にする

`named.cfg` にも例が書いてありますが、

```
statistics-channels {
        inet 127.0.0.1 port 8080 allow { 127.0.0.1; };
};
```

こんな感じで設定を入れて下さい。port 番号は `/etc/blackbird/conf.d/named.cfg` と合わせて下さい

# Zabbix 上でデータが入ってきているか確認する

Zabbix の Template は [github の repository](https://github.com/Vagrants/blackbird-named/tree/master/templates)にあります
Zabbix に import して対象のサーバーに適用させて下さい

**Zabbix 上の host 名と blackbird が起動しているサーバーの host 名が違う場合は `/etc/blackbird/conf.d/named.cfg` 上で hostname を設定してあげる必要があります**
Zabbix 上と合わせてください

```ini:/etc/blackbird/conf.d/named.cfg
hostname = your_static_hostname
```
Asymptoteで回路図を描く

> これは「[TeX ＆ LaTeX Advent Caleandar 2014](http://www.adventar.org/calendars/553)」の22日目の記事でした．
> （21日目は [termoshtt](http://qiita.com/termoshtt/items/756aec542fb4c812a405) さんです．23日目は ti5942 さんです．）


3年前に作成していた文書で回路図を描く必要があり，Asymptoteで回路図を頑張って書こうとしたお話です．

# LaTeXにおける図形描画

本題に入る前にAsymptoteとTikZの説明をします．テキストベースで，LaTeXまわりで図形を描画するツールとして，Asymptote，TikZがあります (ちなみにAsymptoteは美文書5版，TikZは美文書6版で取り上げられています)．それぞれの特徴を簡単に挙げます．

-   Asymptote
    -   `asy` コマンドで実行
    -   内部でLaTeXコマンドを呼びだすが，インターフェイスとしては独立
        -   LaTeXコードに埋め込めるようなパッケージも存在していたはず
    -   C++のようなソースコード，独立した画像を出力
-   TikZ
    -   tikzパッケージをインクルードして実行
        -   e-TeX拡張の処理系が必要
    -   LaTeXソースコードに埋め込む
    -   ソースコードはTeXマクロ
    -   beamerのアニメーションを描く時に便利

私個人的には，

-   ベタなTeXマクロでなく，Asymptoteの方が書きやすい/読みやすい
-   TeXと分離して処理できる
    -   例えば，TeXに出力するのではなくHTMLに埋め込む時にも取り回しが楽

という理由で好きだったのですが，最近はTikZの方が流行っているように見えます．そもそもAsymptoteがどれほど流行ったのか知りませんが．

## とても簡単なサンプル

どちらも長方形を描く例です．サンプルなのでまどろっこしく書いています．

Asymptoteの例

```asy
void drawRectangle(real x, real y, real w, real h) {
  draw((x,y)--(x+w,y)--(x+w,y+h)--(x,y+h)--cycle);
}
    
drawRectangle(0, 0, 100, 100);
```

TikZの例

```tex
\begin{tikzpicture}
  \draw (0, 0) -- (100, 0) -- (100, 100) -- (0, 100) -- cycle;
\end{tikzpicture}
```

# なぜAsymptoteで描いた?

当時TikZはあったかもしれないですが，私は存在を知りませんでした．どのみち，e-TeX拡張非対応の処理系(TeXLive 2010)も使っていたので使用できなかったと思います．

# 実装

ソースをこちらに置きました : [circuit.asy](https://bitbucket.org/ykitta/circuit-tex/src/78c0c2137d2ef631d57b3417e851087d0980b812/asy/circuit.asy?at=default)

確か長方形や円などはプリミティブで書くコマンドがあったかと思いますが関数で自前で書きなおしています．抵抗やら電圧源などは，パラメータがあって少し複雑に見えますが，ただひたすらベタに書いてます．なんとなく読めるでしょうか?
垂直・水平方向にもパラメータで対応するようにしています．関数では描画の終了した点を返すようにしてパスを書きやすくしています．

実際の回路図の描画では，あまり流れるように図形の描画が宣言できていません．もうちょっと良い設計はあったんでしょうか...

![circuit.png](https://qiita-image-store.s3.amazonaws.com/0/13449/3dbbf854-49d7-28df-acac-8f3bb183023b.png)

# ちなみにTikZでは?

[tikz-circuit.tex](https://bitbucket.org/ykitta/circuit-tex/src/78c0c2137d2ef631d57b3417e851087d0980b812/tikz/tikz-circuit.tex?at=default)

なんと，回路図を描くパッケージがいくつかあります．この例では `circuitikz` を利用しています．
...簡単ですね．


![tikz-circuit.png](https://qiita-image-store.s3.amazonaws.com/0/13449/f1f26241-c5dc-0af1-4a9b-e8193df318a0.png)


# おわりに

確かにTikZの方がパッケージも充実しているのですが，記述性の方はAsymptoteの方が良いように感じるんですが，どうでしょうか．

結論として，

- 図形描画ツールとしてTikZと対比しつつAsymptoteを紹介した
- さくっと図形の構造化ができるAsymptoteで回路図を描いてみた
- その結果，オブジェクトを抽象化して描くことはできた

というお話でした．
昔作ったものをせっかくだからアップしておきたい，と思って書きだしたんですが，書きながら今一つだと感じていますhi
回路図描く時って普通は専用のツール(無料のやつだとQt-Bschとか)使う人がほとんどなんでしょうか．気になります．

ちゃんと確認していないのですが，この記事を書こうと思って探してみたらAsymptoteにもそれっぽいパッケージがありました．車輪の再発明はよくないですねぇ...

<http://sourceforge.net/p/asymptote/patches/14/>
NANDフラッシュ採用時の注意点

製品開発で個人的に初めてNANDフラッシュROMを採用し、設計で苦労したので、
自戒の念を込めて注意点を書かせていただきます。

（１）NORフラッシュROMの採用を検討する。
（２）NANDに合った演算チップを選定する。
（３）代替ブロック利用、ウェア・レベリング処理を検討する。
（４）NANDで最初に起動されるブートプログラムはブロック０に配置する。
（５）ROMライターにバッドブロックマークの検出をさせる。

（１）NORフラッシュROMの採用を検討する。
NANDはNORより集積度が高いですが、これから書くような課題を内在し、費用と工数が発生します。
保存するデータ量、組み込み筐体スペース、トータルでペイするかの観点から、NORの採用をまずは検討してみるべきでしょう。
費用は組み込み機器本体の開発以外に、ROMライターのソフト更新でも発生します。
これらがNAND採用による部品コストダウンより大きいかを比較する必要があります。

NANDはかなり面倒なデバイスだと思うので、使わないで済むならそれに越したことはありません。

（２）NANDに合った演算チップを選定する。
NANDはビットエラーが発生するため、対策として誤り訂正（Error Correcting Code=ECC）が必須です。
ECCの要求仕様はNANDの微細化に伴い、高度化（多ビット化）しています。
ECCの実装方法にはOn-Die、Hardware、Softwareの３つがありますが、
NANDに対応した演算チップを選定し、Hardwareの機能によりECCを実現するのが主流です。
On-Dieは現在、ほとんどないようです。
Softwareは処理負荷が高くなるのと、その演算チップでメーカー保証が受けられない改修になる可能性が高いのが難点です。

私は見事にこのステップを飛ばしてしまい、後からソフトで対応することになりました。
チップメーカーの保証外の機能を使うことになり、メーカー提供ツールのバグもあったりして、
非常にヒヤヒヤする開発をする羽目になりました。

（３）代替ブロック利用、ウェア・レベリング処理を検討する。
ECCの能力を超えるエラービットが発生した場合、そのブロックはバッドブロックとして利用不可になります。
バッドブロック発生時のために以下のような機能を主にソフトで実装する必要があります。
・代替ブロックを用意しておき、バッドブロック発生時にはそちらから読み書きするようにする、
・読み書きの回数が特定ブロックに偏ることによりバッドブロックになりやすくなるのを避けるため、
　アドレスをローテーションさせる（ウェア・レベリング）

（４）NANDで最初に起動されるブートプログラムはブロック０に配置する。
ブロック０は工場出荷時にバッドブロックなしが保証されています。
よって、最初のブートプログラムをブロック０に配置することで製品組み上げ時には確実に起動することが保証されます。
そのためにはブートプログラムは１ブロック分以下のサイズである必要があります。
起動以外に使う保守用の機能などはブートプログラムと分けたほうが良いでしょう。

私はブートプログラムが１ブロック以上のサイズになっており、
不要な機能を見極めてソースコードを整理するのに苦労しました。
始めからサイズを考慮して設計をしておくべきでした。

（５）ROMライターにバッドブロックマークの検出をさせる。
NANDの工場出荷時にバッドブロックだったブロックは、バッドブロックマークが付与されています。
ROMライターソフトではバッドブロックマークを検出し、書き込みをしない処理が必要になります。
この場合は初めから代替ブロックを使うことになります。

初心者が調べ調べして、ようやく開発を乗り切ったという状況ですので、
ご指摘などあれば是非お願いいたします。