OmniAICreator/Qiita-1.07M huggingface dataset:
macOS Sierra (10.12.3)にOctaveをインストールできなくて困った話

octave-4.2.1がインストールできなくて困った話と解決できた話を紹介したいと思います。

# Octave-4.2.1 リリースの後で
Octave-4.2.1がリリースされて、homebrewで配布されるoctaveも4.2.1になっていました。

気がついたのは、ふと```brew update && brew upgrade```した時でした。

```
==> /usr/local/opt/qt@5.7/bin/qmake qscintilla.pro -config release -spec macx-clang PREFIX=/usr/local/Cellar/octave/4.2.
Last 15 lines from /Users/xxxx/Library/Logs/Homebrew/octave/02.qmake:
2017-03-18 12:09:43 +0900

/usr/local/opt/qt@5.7/bin/qmake
qscintilla.pro
-config
release
-spec
macx-clang
PREFIX=/usr/local/Cellar/octave/4.2.1_1/libexec/qscintilla2

Project ERROR: Could not resolve SDK Path for 'macosx'

READ THIS: http://docs.brew.sh/Troubleshooting.html

```

qtに関連するエラーのようなので、```brew install --without-qt@5.7 octave```でインストールすれば良かったのかもしれませんが、そうするとGUIが使えなくなります。
octaveのGUIを使うか？というと、そんなに使わないのですが(普段は```octave --no-gui```することが多いです)、、、。
# 解決
Xcodeをインストールしてみたところ、解決したようです。

homebrewを使う上では、コンパイラは必須なので、通常はXcodeをインストールしてあるのが当たり前だと思いますが、ストレージ容量の節約のために、```xcode-select --install```でコマンドラインツールのみをインストールして、IDEとしてのXcode.appはインストールしてありませんでした。

なぜ、Xcode.appをインストールすると、上記の```
Project ERROR: Could not resolve SDK Path for 'macosx'```が発生しなくなるのか、正直なところ原因は分かりませんが、これでoctaveを```brew upgrade```できたようです。
JavaFxとleJOSでEv3ラジコンを作る【前編】

## はじめに
この記事はleJOSの開発環境が整っていることが前提にしています。
詳しくはこちらの記事を参考にして下さい。
>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築前編】
](http://qiita.com/murotani/items/2790f1ef5afed3a5d13c)

>
[【leJOS】mindstorm-EV3をJavaでプログラミングしよう【環境構築後編】](http://qiita.com/murotani/items/0972e6f36676c61e3f57)

##概要
leJOSのリモートコントロール用クラスとJavaFxを使ってEv3を制御するGUIアプリケーションの開発方法を簡単なサンプルプログラムを使って解説します。今回作成するものは簡単なラジコンアプリです。前編ではアプリ開発のための環境構築方法を解説します。

クリックで動画再生
[![IMAGE ALT TEXT HERE](http://img.youtube.com/vi/sTPPtlvEhs4/0.jpg)](https://www.youtube.com/watch?v=sTPPtlvEhs4)


leJOSのリモートコントロールに関してはこちらの記事を参考にして下さい。
>
[【leJOS】JavaでEV3のモーターをリモートコントロールしよう](leJOS】JavaでEV3のモーターをリモートコントロールしよう)
>
[【leJOS】JavaでEV3のセンサー値をリモートから取得する](http://qiita.com/murotani/items/e14c4b05b781ecf893d3)

## 環境
- mindstorm-EV3
- PC : MacBook OS X
- Eclipse Version: Neon.2 Release (4.6.2)
- leJOS leJOS_EV3_0.9.1-beta
- Java System Library [JavaSE 1.8]

##SceneBuilderのインストール
SceneBuilderはJavaFxのGUI構築ツールです。こちらのリンクからインストールして下さい。
[http://gluonhq.com/products/scene-builder/](http://gluonhq.com/products/scene-builder/)
##Eclipse側の設定
Eclipse起動画面のメニューバーからEclipse -> 環境設定 -> JavaFxを選択します。そこにSceneBuilderの実行ファイルへのパスを設定します。
私の環境では```/Applications/SceneBuilder.app```と設定しました。
![スクリーンショット 2017-03-13 23.36.08.png](https://qiita-image-store.s3.amazonaws.com/0/149019/e6354ce3-371a-f9cb-7f9b-7f8a583c6299.png)


##新規プロジェクトの作成
Package Explorerを右クリックしてNew -> Otherを選択します。
次の画面が出てくるのでJavaFx -> JavaFx Projectを選択します。 
![スクリーンショット 2017-03-13 23.14.36.png](https://qiita-image-store.s3.amazonaws.com/0/149019/cae7a996-2a21-7463-6af1-d7836445c89c.png)

プロジェクト名はJavaFxEv3としました。
FinishではなくNextを選択します。
![スクリーンショット 2017-03-13 23.15.36.png](https://qiita-image-store.s3.amazonaws.com/0/149019/98554f7a-55fd-43f2-a161-cfb37645a06c.png)
この画面では特に設定は不要です。Nextを選択します。
![スクリーンショット 2017-03-13 23.15.51.png](https://qiita-image-store.s3.amazonaws.com/0/149019/fd1703b4-058d-9c37-8b79-6b94acf8712d.png)
GUIについての設定です。言語をFXML、ファイルを名をForm、コントローラ名をFormControllerとしました。
![スクリーンショット 2017-03-13 23.16.22.png](https://qiita-image-store.s3.amazonaws.com/0/149019/66e96782-c831-1cae-dc19-fa26cd516cda.png)

##leJOS Runtimeの追加
Package Explorerに作成されたJavaFxEv3プロジェクトを右クリックしleJOS EV3 -> Convert to leJOS Projectを選択します。
プロジェクトのファイル構成は以下のようになるはずです。
![スクリーンショット 2017-03-13 23.17.58.png](https://qiita-image-store.s3.amazonaws.com/0/149019/a4bf3254-7153-2d3b-bb30-58aa86e807c7.png)

##実行してみる
以上で開発するための準備は整いました。
まずは何も編集していない状態でプログラムを実行してみましょう。Java Applicationとして実行します。
![スクリーンショット 2017-03-14 0.01.18.png](https://qiita-image-store.s3.amazonaws.com/0/149019/a7b1df99-1522-8d02-9110-632c84cde741.png)

何もない空欄のウィンドウが表示されたら成功です。
![スクリーンショット 2017-03-14 0.11.01.png](https://qiita-image-store.s3.amazonaws.com/0/149019/38cbd243-ce81-70cd-6a7e-bc9cb0252a6a.png)

##まとめ
以上でJavaFxとleJOSのアプリケーションを作るための下準備が整いました。
後編では実際のプログラムを解説します。
UbuntuでGUIのメッセージを表示する

UbuntuでGUIのメッセージを表示するPythonのプログラム

GUIのライブラリのダウンロード

```
sudo apt-get install python-qt4
```

```python
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *

class UI(QMainWindow):
    def __init__(self):
        super(UI, self).__init__()
        self.initUI()

    def initUI(self):

        # Warning Message box
        QMessageBox.warning(self, "Message", u"something wrong")

        self.show()


def main():
    app = QApplication(sys.argv)
    ui = UI()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()
```

参考URL
http://myenigma.hatenablog.com/entry/2016/01/24/113413
GAEのログをlatencyを条件にしてBigQueryで検索する

# 色々考慮することがある

* FLATTEN
* FLOAT
* REGEXP_REPLACE
* module

# Query

```sql
SELECT * FROM 
FLATTEN(
  FLATTEN(
    gaelog_from_bqstreaming.appengine_googleapis_com_request_log_20170318
    , metadata.labels.value
  )
  , protoPayload.line.time
)
WHERE FLOAT(REGEXP_REPLACE(protoPayload.latency, r's', '')) >= 60.0
AND protoPayload.moduleId is null
```

# 説明

* まずnestedなcolumnをflattenにする
* latencyのclumnがstringで末尾にご丁寧に`s`がついてるので取り除く
* stringをfloatに変換
* default moduleはnullなのでnullを条件にする

# いつか役立つだろう

たぶん
VPythonで簡単なオブジェクトを表示させてみる

# インストール

```text
pip install vpython
````
Python3.6環境で普通に動いた。

# 動かしてみる

```py3
import vpython as vs
import numpy as np

s1 = vs.sphere(pos=vs.vector(0,0,0),radius=0.1,color=vs.color.green)
s2 = vs.sphere(pos=vs.vector(0,0,0),radius=0.1,color=vs.color.yellow)
s3 = vs.sphere(pos=vs.vector(0,0,0),radius=0.1,color=vs.color.red)
s1
```
![p.png](https://qiita-image-store.s3.amazonaws.com/0/133885/fe03d4cb-78a1-5061-6449-9a3b930efe4f.png)

原点をぐるぐる周るだけ。
このコードだと近日点移動しまくります。

```py3
class Obj:
    def __init__(self, x, y, vx, vy, o):
        self.x = x
        self.y = y
        self.vx = vx
        self.vy = vy
        self.o = o
    def update(self):
        self.x += self.vx
        self.y += self.vy
        self.o.pos = vs.vector(self.x, self.y, 0)
    def f(self):
        t = np.arctan2(self.y, self.x)
        r2 = self.x * self.x + self.y * self.y
        F = - 0.5 / r2
        self.vx += F * np.cos(t)
        self.vy += F * np.sin(t)

b1 = Obj(-4.5, 0.0, 0.05, 0.3, s1)
b2 = Obj(-2.5, 0.0, 0.23, 0.45, s2)
b3 = Obj(-10.5, 0.0, 0.03, 0.15, s3)
b1.update()
b2.update()
b3.update()

for i in range(0, 2000):
    vs.rate(10)
    b1.f()
    b1.update()
    b2.f()
    b2.update()
    b3.f()
    b3.update()
```
非同期処理を含む関数を書く時は、迷ったらpromiseをreturnしよう

JavaScriptは非同期処理が基本の言語です。
非同期処理が基本であるがゆえ、同期的な言語では書けないような効率的なコードを書くことができます。

ですが、非同期処理は結果をコールバックで扱うためいわゆる`コールバック地獄`に陥りがちです。
これは`Promise`という仕組みを使うと少し楽ができます。
参考: [Promiseと仲良くなって気持ち良く非同期処理を書こう](http://qiita.com/progre/items/03626b7f4655007d8cb2)

さて、ここからが本題。
JavaScriptのライブラリ作者の方にお願いがあります。

**非同期処理を含む関数（メソッド）を書いたとき、戻り値に迷ったらPromiseをreturnしてほしい！　ということです。**

例えばJavaScriptの汎用バリデータライブラリである`validatorjs`では、カスタムルールとして非同期処理（例: DBに問い合わせを行ってユーザ名の重複をチェックする）を含むルールを作成することができます。
https://github.com/skaterdav85/validatorjs#asynchronous-validation

ところが`check()`メソッドがこのルールに対応していません。わざわざ`checkAsync()`という別メソッドを準備して非同期的ルールを処理しています。
もし`check()`メソッドがpromiseを返していれば、非同期ルールがあるないに関わらず

```javascript
var v = new Validator(/* data */, /* rules */);
v.check()
    .then(function(){
        // validation が通った場合
    })
    .catch(function(){
        // validation に失敗した場合
    });
```
のような書き方ができます。

各ルールはtrue/false（同期的ルール）かPromise（非同期的ルール）をreturnする。ということにすれば、`check()`メソッドは以下のように統一的に実装できます。

- とりあえず新規に`Promise`をreturnする。(*)
- ルールを評価する。
- Promiseを返すルールがあった場合は`Promise.all()`でそれらの結果を待つ。
- 全てのルールの結果が揃ったら、(*)のPromiseに対して`resolve()`または`reject()`をコール。

数年前に自分用に書いたバリデーションライブラリでは(jQueryのPromiseベースですが)同じようなことをやってました。
時間があったらvalidatorjsを改造してみたいと思います。

同じようなリファクタリングをした人もいるみたいです。 https://github.com/skaterdav85/validatorjs/issues/106
次のバージョンではこのアプローチを採用してほしいところですね。
Macの機能拡張をアンインストールする


Mac 上で Xcode Source Editor Extension などの機能拡張をお試しで作ってデバッグ実行すると、システム環境設定の機能拡張にそのお試しアプリが登録されてしまいます。いつまでも設定が一覧に残っているのでそのうちアンインストールしたくなるわけですが、アプリ単体の場合と違ってファイルが各所に散らばっていて簡単ではありません。

機能拡張をアンインストールする手順をまとめてみました。

1. お試しアプリのエクステンションの方のバンドル名を控えておきます。(Xcode でプロジェクトの General から TARGETS でエクステンションを選択すると`Bundle Identifier`に表示されている値です。)
2. Xcode を終了します。
3. ユーザーごとのライブラリフォルダを開きます。(Finder の`移動`メニューをシフトキーを押しながら開くと`ライブラリ`という項目があるのでそれを選択します。)
4. `Application Scripts`フォルダを開いて、控えておいたバンドル名と同じ名前のフォルダを削除します。
5. `Containers`フォルダを開いて、控えておいたバンドル名と同じ名前のフォルダを削除します。
6. アプリ本体とエクステンションで情報共有するなどのために App Groups を使用している場合は、`Group Containers`フォルダを開いてアプリで使っている App Groups の ID と同じ名前のフォルダを削除します。

ちなみに、Xcodeからエクスポートしたアプリを単独で実行した場合は、[AppCleaner](https://freemacsoft.net/appcleaner/)を使ってアプリをアンインストールするとついでに機能拡張もアンインストールされます。

以上です。

---
2021-05-06
手順が面倒なので、ユーザーライブラリにあるバンドルのフォルダ名をダンプするスクリプトを書いてみました。

```sh
#!/bin/sh
#
#  List app's bundle folders in the user library
#

targets=($(xcodebuild -list | awk '/Targets:/,/^$/' | grep -Ev '(^$|:)' | sed -e 's/ //g'))
for target in ${targets[@]}
do
    bundles=($(xcodebuild -showBuildSettings -target ${target} | awk '/PRODUCT_BUNDLE_IDENTIFIER/ {print $3}'))
    for ((bundle_i = 0; bundle_i < ${#bundles[@]}; bundle_i++))
    do
        bundle=${bundles[$bundle_i]}
        
        echo "# ${bundle}"
        dirs=(
            "Application Support"
            "Containers"
            "Group Containers"
        )
        for ((dir_i = 0; dir_i < ${#dirs[@]}; dir_i++))
        do
            dir=${dirs[$dir_i]}
            
            path="${HOME}/Library/${dir}/${bundle}/"
            if [ -d "${path}" ]
            then
                echo ${path}
            fi
        done
    done
done
```
Ruby | メソッドを最小限しか持たないクラス ( ブランクスレート ) を作る

BasicObjectを継承するだけで良い。

```rb
class Blank < BasicObject
end
```

最小限のインスタンスメソッドだけを持った状態になる。

```rb
Blank.instance_methods

# => [:!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
```

継承ツリーの上にはBasicObjectだけが置かれる。

```rb
Blank.ancestors

# => [Blank, BasicObject]
```

# 解説

継承クラスを指定しなかった場合は `Object` からの継承になる。

```rb
class NotBlank
end
```

```rb
NotBlank.instance_methods

# => [:instance_of?, :public_send, :instance_variable_get, :instance_variable_set, :instance_variable_defined?, :remove_instance_variable, :private_methods, :kind_of?, :instance_variables, :tap, :is_a?, :extend, :define_singleton_method, :to_enum, :enum_for, :<=>, :===, :=~, :!~, :eql?, :respond_to?, :freeze, :inspect, :display, :send, :object_id, :to_s, :method, :public_method, :singleton_method, :nil?, :hash, :class, :singleton_class, :clone, :dup, :itself, :taint, :tainted?, :untaint, :untrust, :trust, :untrusted?, :methods, :protected_methods, :frozen?, :public_methods, :singleton_methods, :!, :==, :!=, :__send__, :equal?, :instance_eval, :instance_exec, :__id__]
```


```rb
NotBlank.ancestors

# => [NotBlank, Object, Kernel, BasicObject]
```


# 環境

- Ruby 2.3.1

# 参考

- メタプログラミングRuby 第二版








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
numpy > 2次元の[0,1)の値を得る実装

```txt:動作環境
GeForce GTX 1070 (8GB)
ASRock Z170M Pro4S [Intel Z170chipset]
Ubuntu 14.04 LTS desktop amd64
TensorFlow v0.11
cuDNN v5.1 for Linux
CUDA v8.0
Python 2.7.6
IPython 5.1.0 -- An enhanced Interactive Python.
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
GNU bash, version 4.3.8(1)-release (x86_64-pc-linux-gnu)
```

```test_numpy_170318a.py
import numpy as np

MAXVAL_PLUS_ONE = 5
ints = np.random.randint(MAXVAL_PLUS_ONE, size=(5,2))
print(ints)

flts = ints / float(MAXVAL_PLUS_ONE)
print(flts)

for xval,yval in flts:
	print(xval, yval)
```

```txt:結果
$ python test_numpy_170318a.py 
[[3 2]
 [0 4]
 [4 0]
 [1 4]
 [4 1]]
[[ 0.6  0.4]
 [ 0.   0.8]
 [ 0.8  0. ]
 [ 0.2  0.8]
 [ 0.8  0.2]]
(0.59999999999999998, 0.40000000000000002)
(0.0, 0.80000000000000004)
(0.80000000000000004, 0.0)
(0.20000000000000001, 0.80000000000000004)
(0.80000000000000004, 0.20000000000000001)
```

np.random.randint()にfloatバージョンは未確認。
ブラウザ上で動くMarkdownエディタを作ってみた

# Markdownエディタを作った

HTML5 + JavaScriptでMarkdownエディタを作ってみて、せっかくなので公開してみた、という話。
Google Chromeが入ってる環境ならインストール不要で動くので、個人的にMarkdownの編集に使ってます。
※今のところ画像を表示するときのパスがlme.htmlがある場所を指すので注意。

# 動作環境

- OS : Windows 10 x64
※OS変えたときに見た目がどう変わるかはテストしてないのでわかりません。

- ブラウザ : Google Chrome 56.0.2924.87 (64-bit)

※追記 : ArchLinuxのChromiumでも動作しました。

- OS : ArchLinux x64
- ブラウザ : Chromium

# 使用しているライブラリなど

- jQuery
DOM操作に使用。

- Ace.js
エディタ部に使用。

- marked.js
MarkdownをHTML化するのに使用。

- github-markdown-css
githubっぽい見た目にするのに使用。

# 使い方

1. Google Chromeでlme.htmlを開く

2. 画面右側のエディタにMarkdownを書く

3. DOWNLOADボタンクリックでダウンロード、または右クリックから保存。

4. LOADボタンでファイルを開く。

# 置き場所

[githubで公開してます](https://github.com/singy15/lme)
golangでtar.gzファイルを読む

業務で複数のcsvファイルがtar.gzで圧縮されており、その一つのファイルを読みだす必要があった。

Golangの場合、標準パッケージの`archive/tar`と`compress/gzip`を使って、ひたすらReaderを重ねていくだけで、実現できた。

```go
package main

import (
	"archive/tar"
	"compress/gzip"
	"encoding/csv"
	"fmt"
	"io"
	"os"
)

func main() {

	file, _ := os.Open("target.tar.gz")
	defer file.Close()

	// gzipの展開
	gzipReader, _ := gzip.NewReader(file)
	defer gzipReader.Close()

	// tarの展開
	tarReader := tar.NewReader(gzipReader)

	for {
		tarHeader, err := tarReader.Next()
		if err == io.EOF {
			break
		}

		// ファイルの特定
		if tarHeader.Name == "target.csv" {

			// あとはCSVの処理
			csvReader := csv.NewReader(tarReader)
			for {
				row, err := csvReader.Read()
				if err == io.EOF {
					break
				}
				fmt.Println("csv:", row)
			}
		}
	}
}

```
homebrewでインストールしたmysqlを自動起動できない→できた

```
$ brew tap homebrew/services
```

homebrew-servicesインストールして、

```
$ brew services start mysql
```
ってやればええやん？

```
Error: Formula `mysql` is not installed.
```

あれ?

```
$ brew list | grep mysql
mysql55
```

ははーん、5.5だったのねめんごめんご

```
$ brew services start mysql55
Error: Formula `mysql@5.5` is not installed.
```

ぐっ・・・

```
$ brew services start mysql@5.5
Error: Formula `mysql@5.5` is not installed.
```

ぐぬぬぬ・・・mysqlを再インストールしてみよう

```
$ brew install mysql55
```

```
Warning: mysql55 already installed, it's just not migrated
You can migrate formula with `brew migrate mysql@5.5`
Or you can force install it with `brew install mysql@5.5 --force`
```

既にインストールされてますよ、と。
・・・んん?migrateしろ??

```
$ brew migrate mysql@5.5
```

```
==> Migrating mysql55 to mysql@5.5
==> Unlinking mysql55
Moving to: /usr/local/Cellar/mysql@5.5
==> Linking mysql@5.5
```

そいやっ

```
$ brew services start mysql@5.5
==> Successfully started `mysql@5.5` (label: homebrew.mxcl.mysql@5.5)
```
( ´∀｀)bｸﾞｯ!

ラベルがmysql55 → mysql@5.5 に変わったから、と理解しております

以上です

## 追記

登録自体はされるのですが、PC起動してもmysqlが自動起動してないようだ・・・
mysql の起動はroot権限でしかできないので、serviceへの登録もroot権限で行わないとだめみたいですね。
なので

```
$ sudo brew services start mysql@5.5
```

で( ´∀｀)bｸﾞｯ!
「The Hitchhiker's Guide to Python」のサイトを全訳した

# 「The Hitchhiker's Guide to Python」のサイトを全訳した

## 1. 概要

オライリー洋書に 「[The Hitchhiker’s Guide to Python](http://shop.oreilly.com/product/0636920042921.do)」 というPython 初学者向けの本がありますが、その書籍の元となる [英語版サイト](http://docs.python-guide.org/en/latest/) を [日本語訳](http://python-guideja.readthedocs.io/ja/latest/) しました。

## 2. サイト

日本語版： http://python-guideja.readthedocs.io/ja/latest/
英語版　： http://docs.python-guide.org/en/latest/

[Sphinx](http://www.sphinx-doc.org/) でドキュメント作成、[Read the Docs](https://readthedocs.org/) にホスティングとなっています。

## 3. 公開に至るまで

はじめたきっかけは、以前からドキュメントの翻訳に興味があったことと、Sphinxに慣れたかったことが主な理由でした。

もともと少しだけ日本語訳されていましたが、3年ほど更新が滞っていました。
本家リポジトリを fork、日本語へ翻訳し、Read the Docs に公開。

公式サイト管理者の kennethreitz さんへ日本語訳を更新したよ、と連絡したところ、リンクを貼ってもらえ日本語オフィシャルとなりました。

![20170128_1.png](https://qiita-image-store.s3.amazonaws.com/0/43280/1bb7740d-ec8e-e71e-8694-dbb628c5d7a5.png)

## 4. 備考

* 筆者は英語は大の苦手なため、翻訳が至らないところが多々ありますので、ご指摘いただけると幸いです。
* プルリクエストを送っていただければ、内容を確認して反映したいと思います。 （一人で翻訳していたため作業に慣れていませんが。。）
* 日本語版での出版はオライリー・ジャパンさんは予定していないみたいです。
Visual Studio CodeでPython開発環境を整える

# 0. はじめに
以前、[Visual Studio Codeを使ってHTML作成環境を整える](http://qiita.com/84zume/items/476a29264fdc98d98201)というQiitaを書きましたが、昨今、機械学習（深層学習を含む）が流行っており、Pythonをベースにした書籍が多く出版されています（[Amazon:Python機械学習プログラミング](http://amzn.to/2mS7vu5)、[Amazon:ゼロから作るDeep Learning ―Pythonで学ぶディープラーニングの理論と実装](http://amzn.to/2n7hVb7)、など）。そこで今回はVisual Studio CodeでPython開発環境を準備してみることにしました。

対象のVisual Studio Codeのバージョンは **1.63.2** です。Pythonのバージョンは **3.10.1** です。

# 1. Windows環境にPythonをインストール
パッケージマネージャーの[chocolatey](https://chocolatey.org/)を利用します。
chocolateyをインストールしていない場合は、下記のコマンドでインストールを実行。

```shell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

インストールはすぐに終わります。コマンドプロンプトを立ち上げなおして、chocoコマンドでpythonを導入。

```
choco install python
```

## 1-2. VSCodeにPython拡張をインストール
下記のPython拡張用のアドインはコーディングに必要な一通りの機能（デバッグ、インテリセンス、等）が揃っています。

|プラグイン|名前とリンク|用途|
|:-------|:--------|:-------|
|![image](https://ms-python.gallerycdn.vsassets.io/extensions/ms-python/python/2021.12.1559732655/1639078344000/Microsoft.VisualStudio.Services.Icons.Default)|[Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python)|Linting, Debugging (multi-threaded, remote), Intellisense, code formatting, refactoring, unit tests, snippets, and more.|

Visual Studio CodeでCtrl+Pでコマンドパレットを開き、下記のコマンドを実行。

```
ext install Python
```

拡張機能ペインから「Python」を選択し、「インストール」をクリック。

## 1-3. リンターをインストール

ソースコードの自動フォーマットのためにリンターをインストールします。最近のおすすめはblack。別のQiitaにまとめましたので、そちらを参照してください。

https://qiita.com/84zume/items/ac969931b5f08fef0841


# 2. おわりに
これでセットアップ完了です。特に引っかかることもなかったです。

## 参考

- [Python on Visual Studio Code](https://code.visualstudio.com/docs/languages/python)
- Pythonの参考書籍：[みんなのPython 第4版](http://amzn.to/2CXAt2K)
- Visual Stuio Codeの参考書籍：[はじめてのVisual Studio Code](http://amzn.to/2CYWjTA)
Ruby | クラスに言語要素的メソッドを実装する ( メタプログラミングRuby )

# 課題

こういう `attr_accesor` みたいなものは、自分で作れるのだろうか？

```rb
class Programming
  attr_accesor :ruby
end
```

# 回答

作れる。
実はすごく簡単で、クラスメソッドを定義するだけで良い。

```rb
class Programming
  def self.flexible(language)
    puts "#{language} is so Flexible!"
  end

  flexible :ruby # ruby is so Flexible!
end
```

だがこの書き方だと、順番を反対にすると動かない。

```rb
class Programming
  flexible :ruby # undefined method `flexible' for Programming:Class (NoMethodError)

  def self.flexible(language)
    puts "#{language} is so Flexible!"
  end
end
```

## クラスの先頭で使いたい

継承を使うとクラスの先頭で書ける。

```rb
class Flexible
  def self.flexible(language)
    puts "#{language} is so Flexible!"
  end
end

class Programming < Flexible
  flexible :ruby # ruby is so Flexible!
end
```

オープンクラスで二回同じクラスを開いてみても、同じようなことが出来る。

```rb
class Programming
  def self.flexible(language)
    puts "#{language} is so Flexible!"
  end
end

class Programming
  flexible :ruby # ruby is so Flexible!
end
```

# ちなみに

既存の言語要素的メソッドも上書きできたりする。

```rb
class Programming
  def self.attr_accessor(language)
    puts "Hacked accessor! can not set #{language}"
  end
  
  attr_accessor :ruby # Hacked accessor! can not set ruby
end

programming = Programming.new
programming.language = :ruby # undefined method `language=' for #<Programming:0x007f8a6b170f28> (NoMethodError)
```


# 環境

- ruby 2.3.1

# 参考

- メタプログラミングRuby 第二版








<!-- Update From Qiita API -->

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
sympyで置換積分

①もっと短くなるような気もします。
②KのIntegral(1, t)の第1引数１の拾い方を教えて下さい。

```python
#sympyで置換積分
from sympy import *
var("x a b t c d")
f=1/(1+x**2)
print(integrate(f, (x, a, b)))
#--------------------------------------------
a=0
b=1
print(integrate(f, (x, a, b)))
#--------------------------------------------
J=Integral(f, x)
g=tan(t)
#K=J.transform(x, g)
#print(K)
L=J.transform(x, g).doit()
print(L)
print(L.subs(t, atan(b))-L.subs(t, atan(a)))
#-atan(a) + atan(b)
#pi/4
#t
#pi/4
```
(参考)Pythonで積分
http://qiita.com/ykchat/items/5fc04bf80d24928a241c
(参考)車輪を再発明不定積分する> 不定積分する。定積分する。symbolを用いて定積分する。
http://taromaru-kun.hatenablog.com/entry/2015/03/14/214822
(参考)高校数学の美しい物語＞置換積分の公式の証明と例題＞例題2
http://mathtrain.jp/substitutionint
特定の文字列を含む配下にbrタグ以外の要素を持たない要素を選択する

`foo`という文字列を含むが配下に`br`タグ以外の要素を持たない要素を選択する xpath.

```
//div[contains(.,"foo") and (not(*) or br)]'
```

特に`div`タグはそこらじゅうで使われているので入れ子構造の一番中のもののみ選択しないと困ったことになるので使います。

もちろん`id`要素やその他のもっとわかりやすい物で取得できならそちらを使いましょう。これはテキストしか要素に唯一性が無い時の対処方法です。
技術英語 > [If you recall], we already used one of them, / As you may recall,

@ Introducing Python: Modern Computing in Simple Packages by Bill Lubanovic
(No. 2743 / 12833)

> If you recall, we already used one of them, 

PythonのGeneratorの話。

上記をどう訳すのが妥当だろうか。

訳案1「覚えているでしょうか? 我々はGeneratorsの一つをすでに使用しています。」

http://www.dictjuggler.net/yakugo/?word=if%20you%20recall
> if you recall：おぼえてますか

https://american-phrases.blogspot.jp/2014/03/as-i-recall.html
> As you may recall,...ですと，「あなたは覚えているかもしれないですが．．．．」という意味になります．
Blenderをpythonで動かす

Blenderはマウスで操作するのが殆どかもしれませんが、pythonで実行するといろいろ手間が省けます。
コードを書くには、Scripting　→　Text Editiorを選択


![無題2.png](https://qiita-image-store.s3.amazonaws.com/0/109578/e4185bf1-d8d5-eca9-086d-8cf25138b79e.png)

![無題.png](https://qiita-image-store.s3.amazonaws.com/0/109578/3730cda3-20f8-949c-303d-1e9954ad15c9.png)





#### モードの切り替え
>bpy.ops.object.mode_set(mode='OBJECT', toggle=False)#オブジェクトモード
bpy.ops.object.mode_set(mode='EDIT', toggle=False)＃編集モード。基本的に回転などの操作はEDITモードにする。

##### 平行移動
>bpy.ops.transform.translate(value=(x,y,z)) 

##### 拡大・縮小
>bpy.ops.transform.resize(value=(x,y,z))#1以上なら拡大

##### 回転
>bpy.ops.transform.rotate(value=0,axis=(x,y,z))#value=回転量

##### 面の全選択・選択解除
>obj = bpy.context.edit_object#編集モードにする
 me = obj.data#データ取得
 bm = bmesh.from_edit_mesh(me)
 for i, f in enumerate(bm.faces):#面ごとに処理(iは面の順番)
        f.select=False　#Falseは面の選択解除、Trueなら編集

##### 画面の更新
>bmesh.update_edit_mesh(me, True)

#### 他の書き方
カーソルを合わせれば出てくるので、参照できる。


![無題.png](https://qiita-image-store.s3.amazonaws.com/0/109578/e165d687-b2b6-0874-9d2e-52a2c1a09adf.png)

引数の使い方に関しては公式のAPIドキュメント
http://docs.blender.org/api/blender_python_api_2_67_1/bpy.ops.transform.html
facebook/reason と BuckleScript で JavaScript の関数を呼び出すパターン

とくに新出のトランスパイラだと、バインディングが少ないので、いかにしてFFI叩くかが勝負になる

参考: https://bloomberg.github.io/bucklescript/Manual.html

```ocaml:main.re
let add a b => a + b;
Js.log "this is console.log";
Js.log(add 3 4);

/* function call */
external imul : int => int => int = "Math.imul" [@@bs.val];
Js.log(imul 3 4);

/* function call with unit */
external now : unit => int = "Date.now" [@@bs.val];
Js.log(now());

/* new */
external create_date: unit => string = "Date" [@@bs.new];
Js.log(create_date());

/* value */
external dirname : string = "__dirname" [@@bs.val];
Js.log dirname;

/* require */
external resolve_path : string => string => string = "resolve" [@@bs.val] [@@bs.module "path"];
Js.log(resolve_path "a" "b");
```

コンパイル後

```js

// Generated by BUCKLESCRIPT VERSION 1.5.2, PLEASE EDIT WITH CARE
'use strict';

var Path = require("path");

function add(a, b) {
  return a + b | 0;
}

console.log("this is console.log");

console.log(7);

console.log(Math.imul(3, 4));

console.log(Date.now());

console.log(new Date());

console.log(__dirname);

console.log(Path.resolve("a", "b"));

exports.add = add;
/*  Not a pure module */
```
echo で謎のぬるぽ

# echo で謎のぬるぽ

こんなコードを書いてたら、謎のぬるぽに遭遇

``` golang

func check(c echo.Context) error {
    result := echo.ErrUnauthorized
    //　中略
    for _, hoge := range fuga {
        if checkHoge(c) {
            result = nil
        }
    }
    return result
}

```

result　の nil がerror インターフェイスになっちゃってて、
それでぬるぽになってた、、　orz
std::vectorのinsertを正しく使う

# TL;DR;
std::vectorの`insert()`や`erase()`はイテレータを返すし、連続してそのvectorに操作する場合そのイテレータを戻り値で受け取らないのはバグの温床になりがちなので気をつけましょう。

## 初めに
std::vectorは適切に使えば配列のサイズやらリサイズやらを意識の外に追いやれるので大変便利です。
`vector.insert(iter, value)` を使うと、`iter`が指す場所に新たに`value`を挿入し、その後ろの値をいい感じにずらしてくれます。
`vector.erase(iter)` を使うと `iter`が指している場所の値を消去し、配列のその後ろの値をずらして隙間を埋めてくれます。
どっちも手動で実装すると下らないミスをしがちなので`vector`のメソッドを頼りましょう。

`insert`も`erase`も、操作をした瞬間に使用したiteratorが指す場所は不定になるのでそのまま使用しては行けません。

正しい使い方はこんな感じ。
`[9, 8, 7, 6]`という配列の`3`番目の位置に、`[0, 1, 2, 3, 4]` を挿入したいという時

```cpp:insert.cpp
#include <vector>
#include <iostream>

int main() {
  std::vector<int> a = {9, 8, 7, 6};

  auto it = a.begin();
  ++it;++it;  // これでitは a[3] == 7を指す

  // ここが本題
  for (int i = 0; i < 5; ++i) {
    it = a.insert(it, i);
    it++;  // ここでインクリメントしないと同じ位置に挿入し続けてしまう
  }

  // 以下デバッグ出力
  for (int i = 0; i < a.size(); ++i) {
    if (0 < i) std::cout << ", ";  // このidiomは綺麗に間にコンマが入るから好き
    std::cout << a[i];
  }
  std::cout << std::endl;
}
```


```:出力:
9, 8, 0, 1, 2, 3, 4, 7, 6
```

なお、ループ中の `it++;` を無くすと

```:出力:
9, 8, 4, 3, 2, 1, 0, 7, 6
```

という感じに逆順になる。
一旦受けてその値を即インクリメント、というのは知らないと直感に反するので手に馴染ませましょう。(充分直感的ではあるけれど)

## ダメな例

```cpp:dame.cpp:
  for (int i = 0; i < 5; ++i) {
    it = a.insert(++it, i);
  }
```

使う前にインクリメントしてやればいいじゃんとか思ってこんなふうに書くと、itの位置が1つだけずれるがおよそ同じような結果が得られる。

```:結果:
9, 8, 7, 0, 1, 2, 3, 4, 6
```

しかし、この記法ではvectorの長さが0の時にSEGVする。
長さ`0`の配列の`[1]`に触ろうとしてしまうのだから当然といえば当然である。
ieServer.NET DDNSのIPを更新するDockerイメージ作った

最近自宅サーバに戻ってきたので，数年ぶりに[ieServer.Net](http://www.ieserver.net/)のダイナミックDNSサービスを使わせてもらってます．ありがたや．

本家スクリプトを参考に， 更新スクリプトを自作してみたのですが，ついでにDockerイメージも作ってみました．

* [GitHub - tac0x2a/docker-ieserver-updater](https://github.com/tac0x2a/docker-ieserver-updater)
* [DockerHub - tac0x2a/docker-ieserver-updater](https://hub.docker.com/r/tac0x2a/docker-ieserver-updater/)

[README.ja.md](https://github.com/tac0x2a/docker-ieserver-updater/blob/master/README.ja.md)

# 使い方
環境変数として，`USERNAME`, `DOMAIN`, `PASSWORD` と，cronのフォーマットで更新スケジュールを記載した `CRON_SCHEDULE` を与えます．
cronフォーマットについては，"man 5 crontab" を参照．

## 例
ドメイン `host.domain.jp` を 5分おきに更新する．

## docker-compose を使う場合
`docker-compose.yml` を以下のように編集します

```yml
version: '2'
services:
  ieserver-updater:
    restart: always
    image: tac0x2a/ieserver-updater
    container_name: ieserver-updater
    volumes:
      - ./volume:/work/volume
    environment:
      USERNAME: host
      DOMAIN: domain.jp
      PASSWORD: <password>
      CRON_SCHEDULE: "*/5 * * * *"
```

その後，以下コマンドで起動します．

```sh
$ docker-compose up -d
```

## docker run を使う場合

```sh
$ docker run -d -v /your/host/dir:/work/volume -e USERNAME=host -e DOMAIN=domain.jp -e PASSWORD=<Password> -e CRON_SCHEDULE="*/5 * * * *" tac0x2a/docker-ieserver-updater
```
ErgodoxのキーマップをDockerでビルドする。

# はじめに
今回Dockerを利用してhexファイルのビルドが手軽にできたので備忘録として残しておく。

# 自前の環境

```bash
$ sw_vers 
ProductName:	Mac OS X
ProductVersion:	10.12.3
BuildVersion:	16D32

$ docker -v
Docker version 17.03.0-ce, build 60ccb22
```

# 本家
- リポジトリ
 - https://github.com/qmk/qmk_firmware
- wiki
 - https://github.com/qmk/qmk_firmware/wiki

#手順

## qmk_firmwareのリポジトリからクローン
gitのリポジトリからクローンする。

```bash
git clone https://github.com/qmk/qmk_firmware.git
```

## keycap.cの作成
keymaps配下に自分のキーマップ置き場(hidekingerz)を作成し、keymap.cを作成する。
なお、hidekingerzは、ビルド時の投入コマンドのオプションで利用する。

```bash
cd qmk_firmware/keyboards/ergodox/keymaps
mkdir hidekingerz
```

keymap.cの作成時に本家wikiが参考になるので読むと良い。
[本家wiki - Keycodes](https://github.com/qmk/qmk_firmware/wiki/Keycodes "Keycode")
[本家wiki - Layer switching](https://github.com/qmk/qmk_firmware/wiki/Key-Functions "Layer switching")

## ビルド

[本家wiki - Build Environment Setup](https://github.com/qmk/qmk_firmware/wiki/Build-Environment-Setup#docker "Build Environment Setup")に記載がある通り、下記コマンド一発でDockerイメージのダウンロードがらビルドまで実施される。

```bash
docker run -e keymap=hidekingerz -e subproject=ez -e keyboard=ergodox --rm -v $('pwd'):/qmk:rw edasque/qmk_firmware
```

## Teensy2.0への焼き込み

下記ページからloaderをダウンロードして、通常通り焼き込めば良い。
http://www.pjrc.com/teensy/loader_mac.html

# 参考：Docker Image

イメージサイズが700MBほどあるので、素直にビルド環境を構築したほうが、ディスクサイズ的にはエコかもしれない。

```bash
$ docker images
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
edasque/qmk_firmware   latest              bf79900cf897        6 weeks ago         714 MB
```
Rails DEVISE ユーザー登録時に管理者側にもメールが送信されるようにする。

# ユーザー登録時に管理者側にもメールが送信されるようにする。
Devise::Mailer を継承したカスタムメーラクラスを作成し、その中でCCを設定する。
このやり方でやれば、Deviseの複数モデルであっても(例 User、Company)、両方のsign_up時に管理者側にメールが送信される。

$ rails g mailer MyMailer sendmail_confirm

```config/initializers/devise.rb:
Devise.setup do |config|
  ...
  config.mailer = "MyMailer"
  ...
end
```

```app/mailers/my_mailer.rb
class MyMailer < Devise::Mailer
  def confirmation_instructions(record, token, opts={})
    super(record, token, opts.merge(cc: "hogehoge@gmail.com"))
  end
end
```
LYTRO ILLUMで撮った写真を見る

LYTRO ILLUMの第二世代はまだまだお高いけど、旧LYTRO ILLUMは中古なら手が届く値段になってきた！！

![図2.png](https://qiita-image-store.s3.amazonaws.com/0/109578/d84866ae-0100-1374-154e-dc04e875b1e8.png)

ライトフィールドカメラは、一般的な使い方だと撮影後のリフォーカスなどがありとても便利です。
しかし、ILLUMで撮影した画像を読み込むのって案外大変。
何故か？


**拡張子がlfpだから**

こんな拡張子なかなか無いので、当たり前ですがopencvでは読み込めないです。
そこで、読み込む定番ソフトウェアとしてLytro Desktop。https://www.lytro.jp/desktop
これでリフォーカスなどの最低限の処理はできますし、研究とかしないんだったらこれでいいんじゃないかなと思ってます(私も最近はこればっか)。
* ちなみにlfpファイルには、raw sensor データ，Frame MetaData, Privateのメタデータがすべて入っているので容量は大きいです。(dm.lfp みたいなDepth データのみが格納された軽量なデータもあります。)


### LYTRO meltdown
http://optics.miloush.net/lytro/

非常に便利なサイトです。Lytro カメラに関する詳細な説明から、画像を読み込むviewerなどもあります。
タブのresources から自分の好きなコードをダウンロード。私はpython派なので、一番下のPython LFP readerをダウンロード。

![図1.png](https://qiita-image-store.s3.amazonaws.com/0/109578/19a3e410-20b0-be7d-5426-5391478f967f.png)

http://code.behnam.es/python-lfp-reader/
に使い方は書いています。もしコマンドラインでやるのがイチイチめんどくさいという人は、Spyderで動かしましょう。このコードで、lfpファイルにあるデプスデータなどを取り出すことができる。


![キャプチャ.JPG](https://qiita-image-store.s3.amazonaws.com/0/109578/99f7d9ba-6564-dd69-ef35-324f222e45a1.jpeg)



##　注意事項
- 拡張子lfp の他に、stk-lfpなどがある。これはwebレンダリング用である。
- 撮影時にRAWとXRAWがあるが、これはキャリブレーションデータがあるか，ないかの違い。(マイクロレンズとCMOSセンサーの構造に個体ごとの差から、各個体につきキャリブレーションデータがあったほうがいいが、容量は倍になる。)
TCPの再送タイムアウトを制御したい

今回は軽い話(笑)

2013年の2月にこんな記事を書いたのを思い出した。
「[TCPの再送タイムアウトを制御したい](https://thatsdone-j.blogspot.jp/2013/02/tcp.html)」

ざっくり、Webサーバのインターネット側とバックエンド側で、TCPの再送タイムアウトを変えたいような場合に便利に使える機能である。TCPのコネクション単位で、ミリ秒単位で再送をあきらめるタイムアウトを指定できる。

この機能以外では、/proc/sys/net/ipv4/tcp_retries2 に値を設定して調整するしかなかった。これはシステム全体に一様に効いてしまうほか、だんだん長くなるリトライ間隔を足しあげて調整するしかない。
ちなみに、tcp_retries2 については int128 さんのすばらしい記事があるので、興味があれば読んでみてほしい。
「[TCPカーネルパラメータによる障害復旧時間の短縮](http://int128.hatenablog.com/entry/20100514/1273865819)」(by int128さん)

さて、この機能はlinux 2.6.37 から利用できるようになった(もちろんLinux固有機能)のだが、setsockopt() に指定する当該機能のオプションの TCP_USER_TIMEOUT が、当時は kernel header にしかなくて...という話があったのだった。

それでは今はどうかと言えば、以下のように Ubuntu Xenial でも CentOS7 でも普通に利用できるようになっているようだ。

Ubuntu Xenial の場合

```
stack@xenial-work:~$ uname -a
Linux xenial-work 4.4.0-64-generic #85-Ubuntu SMP Mon Feb 20 11:50:30 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
stack@xenial-work:~$ find /usr/include/ -type f | xargs grep TCP_USER_TIMEOUT
/usr/include/netinet/tcp.h:#define TCP_USER_TIMEOUT      18 /* How long for loss retry before timeout */
/usr/include/linux/tcp.h:#define TCP_USER_TIMEOUT       18      /* How long for loss retry before timeout */
stack@xenial-work:~$
```

CentOS7 の場合

```
[stack@centos7-work ~]$ uname -a
Linux centos7-work 3.10.0-514.10.2.el7.x86_64 #1 SMP Fri Mar 3 00:04:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
[stack@centos7-work ~]$ find /usr/include/ -type f | xargs grep TCP_USER_TIMEOUT
/usr/include/netinet/tcp.h:#define TCP_USER_TIMEOUT      18 /* How long for loss retry before timeout */
/usr/include/linux/tcp.h:#define TCP_USER_TIMEOUT       18      /* How long for loss retry before timeout */
[stack@centos7-work ~]$
```

余談だが、[ひとつ前の記事](http://qiita.com/thatsdone/items/23cba711af84c5b916ec)で書いた例は、このオプションを使い、とあるサービスがDBサーバに向かって作成するTCPコネクションのみ、DBサーバの障害時にすばやく切れるようにしたかったのだった。
「とあるサービス」や、それが依存するライブラリ等には手を加えられない事情があったので、connect(2)をhookしてDBサーバ向けのコネクションの場合のみ TCP_USER_TIMEOUT を設定するというえぐいことをしていたのだった...(とおいめ
Kituraを使ったプロジェクトをQuickでテストする

普段はiosアプリ開発をしていてQuick/Nimbleを使ってテストを書いています。
先日のtry!Swiftに参加したときにモチベーションが上がって、今更ながらサーバサイドswiftやってみようと思い立ちました。
FrameworkにはKituraを採用しました。Kituraの導入方法についてはQiitaにもたくさん記事があるので省略します。
今回は、いつものようにQuick/Nimbleを導入しようとした際にいくつかハマったポイントをまとめておきます。

# 気をつけること
##  carthageでbuildしたframeworkはmac用のを使う
普段ios開発だけやっていて、--platform iOSが自分の中でデフォルトになってたのですぐに気づけませんでした。。

 ```
 carthage update --platform mac
 ```
## 対象のTargetのBuild SettingsでEnable TestabilityをYESにする
Noになっているとテスト実行した際に
「Module 'XXX' was not compiled for testing」　
と怒られます。

<img width="491" alt="スクリーンショット 2017-03-15 23.32.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/a98b0e23-598e-b229-cbe4-4e5afffa03a9.png">

## テストTargetのBuild PhaseでTarget Dependenciesに対象のTargetを指定する
これも指定していないと先ほどと同様に
「Module 'XXX' was not compiled for testing」
のエラーが出ます。

<img width="393" alt="スクリーンショット 2017-03-15 23.33.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/372a5f12-d413-7b80-172c-1c8cbcc6a098.png">

## Tests.swiftの配置場所

```
$ swift test
error: the package has an unsupported layout, unexpected source file(s) found: XXX/Tests/SampleTests.swift
fix: move the file(s) inside a module
```

これはXcode上のテスト実行では問題なかったんですが、コマンドからswift testでテストしようとすると怒られました。
Tests直下じゃなく一つディレクトリ切ってあげれば大丈夫です。
ただしディレクトリ名をXXXTestsとする必要があります。

# 結果
<img width="896" alt="スクリーンショット 2017-03-15 22.46.09.png" src="https://qiita-image-store.s3.amazonaws.com/0/130686/812575f3-a1f0-0a2b-ddad-7aee7b59394b.png">

無事にQuickでテストできるようになりました。
【初心者投稿-3】祝 「HTML&CSS 学習コース 初級編」完了

#昨日までのおさらい
* 初心者の僕が初めてマークダウンで投稿
* Progateにハマる

今日になって気づいたけど、7割型忘れていますね。。。
年老いたのかなんなのか謎ですけど、反復練習が必要かもしれません。

#初心者ながらに思うこと
これむずくね？

創造性がないと全然ついていけません。
次から次へと要素が出てきて、エンジニアの人のことを素直に尊敬しました！

#学習の記録
* Progate2日目
* 今日の勉強時間：1時間
* 総学習時間：3時間10分
* 今日学んだこと：問い合わせフォーム案外簡単に作れるのね。。。
* 今日の感想：どのタイミングからエンジニアを名乗れますか？
Macでtsharkを使ってProve requestを取得する

WiFiの子機が出しているProve requestを取得する方法についてのメモ。
Prove Requestの詳細な説明については他記事に譲る。

Qiita初投稿だが，書き方よくわからん。

### 準備したもの
- Android携帯(WiFi接続可能な端末)
- Macbook Pro

### 手順
1. Wiresharkをインストールしておく。homebrewなどでインストールできる。
2. WiFiを有効にし，かつ，特定のAPに接続しない状況にしておく。
（近くのAPに接続してしまう場合は，APを一旦消してWiFiの有効/無効を切替えるなど)
3. Macでtsharkを使ってProve requestを取得する
4. Wiresharkでパケットキャプチャを開始する。
5. Android携帯(WiFi接続可能な端末)のWiFiを無効から有効に切り替える

上記の4.を実行後から周りにWiFi端末があればProve Requestの受信が確認できる。
5.の操作で明示的にProve Requestの発信を始めたり，止めたりする様子が確認できるはずです。

### Wiresharkでのキャプチャするためのコマンド

Prove requestは自身との通信ではないので，モニターモードでキャプチャする必要がある。

#### モニターモードでパケットキャプチャを開始する

```shell-session
sudo tshark -I -i en0
```

#### Prove requestのみキャプチャする

モニターモードでキャプチャすると流れが早いのでProve requestに絞る方法

```
sudo tshark -I -i en0 -Y "wlan.fc.type_subtype eq 4"
```
Raspberry Pi サーボモーターとOpen CVで顔追跡カメラ（Haar-like）

物体追跡カメラに続いて、顔追跡カメラもRaspberryPiで作ってみました。Python3系で動きます。OpenCVで顔認識されたものを追尾します。「サミュエル・L・ジャクソン（のフィギュア）」で試してみます。

![2017-03-17 23_42_29.gif](https://qiita-image-store.s3.amazonaws.com/0/47128/6e4c1070-16ba-0ee1-7cbb-8fb9be3ca781.gif)

## 環境

[前回記事](http://qiita.com/PonDad/items/4d50ea908a0fc75f4cea)と同じです。

## Haar-like特徴分類器を使った顔認識

OpenCVで顔認識するのって、あまり深く考えずに利用していたのですが、以下の記事で詳しくまとめられていましたので改めて見直してみました。

[OpenCVで物体検出器を作成する② ～Haar-Like特徴～ - 技術者ブログ ](https://www.pro-s.co.jp/engineerblog/opencv/post_6231.html)

OpenCVでのデフォルトで利用出来るカスケード分類器は明暗部分を利用しているんですね。

![OpenCV Face Detection: Visualized on Vimeo 2017-03-17 23-55-14.png](https://qiita-image-store.s3.amazonaws.com/0/47128/423480f1-78b2-4f26-880f-8be333987be6.png)


[OpenCV Face Detection: Visualized - Vimeo](https://vimeo.com/12774628)

`haarcascade_frontalface_alt.xml`を利用した顔認識を使うと、`cascade.detectMultiScale(）`メソッドを利用して顔の範囲を表す座標を取得する事が出来ます。

この座標から顔の中心点の座標を計算し、画像の中心点から顔座標が移動した分だけサーボモータを使いカメラを移動させてみました。

[face_tracking.py - Gist](https://gist.github.com/PonDad/ba5d124bb2f303e689d3ac366f2232bf#file-face_tracking-py)

[PCA9685.py - Gist](https://gist.github.com/PonDad/ba5d124bb2f303e689d3ac366f2232bf#file-pca9685-py)

## まとめ

サンプルはフィギュアを使ったGifを載せていますが、自分の顔でももちろん反応します。

モーターの制御をもう少し工夫すれば、顔を追跡して笑顔を自動シャッターとか手軽に出来るかもしれませんね。では。
NSDで動的にdebugログをだす

#NSDで動的にdebugログをだす
NSDでは標準のログの他に、--enable-checkingオプション付きでコンパイルすると、debug logを出すことができます。

しかし、nsd起動時の引数として渡す必要があり、nsd-controlではlog verbosityは変えることができますが、debug logのON/OFFはできません。

そこで、gdbで動いているプロセスにattachしてdebug logを有効にします。

gdbをインストールしていない場合は、gdbをインストールします

```bash
$ sudo yum install gdb
```

nsdのPIDを探します

```bash
$ ps -ef | grep nsd
nsd      19685     1  0 23:28 ?        00:00:00 /var/service/ans/nsd/sbin/nsd
nsd      19686 19685  0 23:28 ?        00:00:00 /var/service/ans/nsd/sbin/nsd
nsd      19691 19686  0 23:28 ?        00:00:00 /var/service/ans/nsd/sbin/nsd
````

gdbでプロセスにattachします。

```bash
$ sudo gdb /usr/local/sbin/nsd
(gdb)attach 22997
```

debug levelの変数の値を変更します。

```gdb
(gdb)print nsd_debug_level
$1 = 0 # debug leveが0の状態
(gdb)print nsd_debug_level=1
$2 = 1
(gdb)quit
```

なお、attach中はそのプロセスの処理が止まります。

今回は、ゾーン転送周りのdebugログを出したかったので、PPID 1のプロセスをattachしています。そのため、ゾーン転送や、nsd-control処理が止まります。DNSレスポンスを返すのは別のプロセスなため、そこまで影響はないと思われます。
Mind言語で 疑似乱数関数 を作ってみた

#概要
日本語プログラミング言語「Mind」version 8 用です。
version 8 で小数が使える様になり、自作プログラムで 乱数 が欲しくなり 作りました。
「Mind」のソースコードが どんなものか見てもらいたくもあり 公開します。

#ソースコード

```Mind:Random.src
※ 乱数種値を指定したい場合には メインの初期化部にて 乱数種値 に値を入れる。
乱数種値は　変数。	

簡易小数表示とは　（小数　→　・）
	５桁で　小数形式で表示すること。


※ 0.0以上～1.0未満 の 乱数を戻す  
一様乱数とは　関数　小数出力
			Ｙ２は　変数
			Ｙ１は　小数変数
	※ xorshift32 アルゴリズム 
	乱数種値を　Ｙ２に　入れる 		
	Ｙ２を　１３　左シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　１７　右シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　１５　左シフトし、　Ｙ２と　ＸＯＲし、　Ｙ２に　入れる
	Ｙ２を　乱数種値に　入れる
	
	Ｙ２を　絶対値を　小数化し　Ｙ１に　入れる
	Ｙ１を　2147483648.0で　ｆ割り　Ｙ１に　入れる
	Ｙ１をもどす
。


ガウス分布乱数とは　関数　小数入力(平均値)　小数入力(シグマ値)　小数出力
			シグマ値は　小数変数
			平均値は　小数変数
			Ｚ１は　小数変数
			Ｚ２は　小数変数
			Ｚは　小数変数
	シグマ値に　入れる
	平均値に　入れる
	※ 「引数　（」を　表示し、　平均値を　簡易小数表示し、　「 , 」を　表示し、　シグマ値を　簡易小数表示し、　「)」を　表示し、　改行
	Ｚを　クリア
	一様乱数()を　Ｚ１に　入れる
	一様乱数()を　Ｚ２に　入れる
	[　Ｚ　:= sqrt(　-2.0　×　log(Ｚ１)　)　×　sin(　2.0　×　π　×　Ｚ２　 )　]
	[　Ｚ　:= 平均値　＋　シグマ値　×　Ｚ　]
	Ｚをもどす
。


※-- テスト用 --
メインとは
※Random＿テスト＿メインとは
			乱数値は　小数変数
	20170316を　乱数種値に　入れる
	「乱数種値:」を　表示し、　乱数種値を　数値表示し、　改行

	50を　回数指定し
		乱数値を　クリア
		ガウス分布乱数（ 0.0 , 0.5 ）を　乱数値に　入れる
※		 一様乱数()を　乱数値に　入れる
		「関数戻り値：」を　表示し、　乱数値を　簡易小数表示し、　改行
	繰り返す

	スタック検査し
。
```

アルゴリズムのメモ書き的な 疑似コードにみえるかと思われますが **動く**のですよ これ。

#参考サイト
[Mind プログラミングマニュアル](http://www.scripts-lab.co.jp/mind/ver8/doc/index.html)
[Google Chromeが採用した、擬似乱数生成アルゴリズム「xorshift」の数理](https://blog.visvirial.com/articles/575)
[C言語による乱数生成](http://www.sat.t.u-tokyo.ac.jp/~omi/random_variables_generation.html)
JetBrains IDE で vagrant ssh したいなら sss

`Cmd + A` からの `ssss` で Start SSH Session にヒットします。

<img width="447" alt="ssss.png" src="https://qiita-image-store.s3.amazonaws.com/0/11525/d01a314a-4f87-7fd8-8ca2-15b410c22db1.png">

まあ、プラグインの機能名にコンフリクトがなければ `sss` でも十分です。で、もしプロジェクト設定で Vagrantfile の場所を設定してればこう...

![host.png](https://qiita-image-store.s3.amazonaws.com/0/11525/dd2369d8-43ad-f2d0-ad89-f38fa09fb4b4.png)

何が嬉しいかというと、実はこれ `Option + F12` の Terminal のシェルで `vagrant ssh` するより起動が速いのです。

通常、`vagrant ssh-config` コマンドの実行は3〜5秒かかり、`vagrabnt ssh` は内部的にそれやってからのSSHなので、ちょっともたっとします。が、PhpStorm など JetBrains の IDE はこの `vagrant ssh-config` の結果をキャッシュしているようです。なので、毎回の待ちが起きない。

てかやっぱ、なんか `s` キー4回ダダダダッとやるのが気持ちいい。それがフルスペル打つ操作よりメリットあるってうれしくてつい。
さくらvpsでCentOSの日本語化

さくらVPSのサーバー環境構築のメモです。
[ドットインストール](http://dotinstall.com/lessons/basic_sakura_vps/8004)によると、CentOSで日本語表示にするには`/etc/sysconfig/i18n`の`LANG="C"`を`LANG="ja_JP.UTF-8"`と変更すれば良いと行っていますが、これだけだと、ログインのたびに
```-bash: warning: setlocale: LC_CTYPE: cannot change locale (UTF-8): そのようなファイルやディレクトリはありません```
のような文が出てしまって鬱陶しいです。これを消すには、`/etc/sysconfig/i18n`ファイルに以下の文を追加すると治りました。

```
LC_CTYPE="ja_JP.UTF-8"
```

目出度し。
凄すぎて大草原不可避な.NET デコンパイラdnSpyを使ってみる

# 何これ?

午前中に､Twitter見てたらneuecc先生が
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">改めてdnSpy、とんでもなく素晴らしい出来で、本物のハッカーだなぁという感じ。本物のハッカーはGUIも完璧に作れる……。 <a href="https://t.co/DoZFNTpDUg">https://t.co/DoZFNTpDUg</a></p>&mdash; neuecc (@neuecc) <a href="https://twitter.com/neuecc/status/842347923094478848">2017年3月16日</a></blockquote>

というツイートをしていて､何これ?と思いつつ､仕事戻ってきていじってみた。
そしたら、まぁ凄すぎて草しか生えなかったので､拙速は巧遅に勝る[^1]の精神でとにかく書いてみた｡ということで､最後までお付き合い頂ければ幸い｡


C#やら､VBやらのデコンパイラはIL Spyとかが有名ですが､その遙か上を突き抜けたようなデコンパイラ｡
何が凄いって言うと

 1. dnSpy単体でデバッグ可能
 2. dnSpy単体で有りモノのアセンブリを編集可能
 3. ILレベルでステップデバッグ可能

などなど､上げればキリが無いほど素晴らしいツールになってます｡

# 入手と配置

[**ここ**](https://github.com/0xd4d/dnSpy)から入手可能です｡

Readmeの部分にある"Binaries"から､ダウンロード可能です｡(下図参照)
![image](https://qiita-image-store.s3.amazonaws.com/0/9662/f2ac2546-cffd-8b30-2511-43ff1b28f366.png)

落としてきたら､Zipを適当な場所に展開すれば配置は完了｡

# 実行方法

デコンパイルだけで有れば､特に問題にはならないですが､dnSpyでデバッグする場合は､32bitと64bitでアプリケーションを分ける必要があります｡
32bitアセンブリの場合は**dnSpy-x86.exe**を､64bitアセンブリの場合は**dnSpy.exe**を使います｡
また､AnyCpuでビルドしている場合は､ビルドオプション中の32bitの優先が入っていれば､32bit版､入っていなければ64bit版のアプリケーションを使って下さい｡

実行後､
 1. File
 2. Open
 
の手順を踏んで､目標のファイルを開くか､又は対象となるファイルをドラッグ&ドロップすればOKです｡

# ちょっとした注意

IL Spyとは異なり､参照中のアセンブリはファイルロックされるので､コンパイルし直すなどする場合は､Assembly Explorerから対象となるアセンブリを指定後Deleteするなど､参照を解除することが必須となります｡


# 使い方

後はほとんどVisual StudioとUIもUXも同じなので､VisualStudioをお使いになってる方は不自由なく使えるかと思います｡
余りまだいじってないのですが､現時点で個人的に少しハマったところは､

#### メソッドの編集
編集したいメソッドを選択して､ショートカットメニューから､**EditMethod**を選択｡編集後に必ず右下の**Compile**を選択して､Editorを抜ける

ぐらいでした｡

# まとめ

アセンブリのみ存在する状態で､デバッグ､エディットが可能な上､Visual Studioでやろうとするととんでもなく面倒なことになるILレベルのステップデバッグが可能という､素晴らしいツールでした｡

# 雑記:IL Spyはいらない子?

最初dnSpyだけで良いかなって思ったけど､IL Spy必要なの?と言われればYesだね!
先に挙げたとおり､Fileロックかかるので､PerCompilingとの相性があんまり良くない｡
なので､適宜妥当に使い分けると多分幸せになれると思います｡

[^1]: 編集回数見て頂ければ､推して知るべきかと｡｡｡
DecoratorとDecomakerを一つの関数で定義する方法


Pytestでfixtureを定義するとき、デコレータ`fixture`は括弧と引数無しでも、`(scope="session")`といった括弧と引数がある使い方でもどちらでもサポートしています。次のコードはPytestのドキュメントにある両方の使い方の例です。

引用元: [Pytestのドキュメント](http://docs.pytest.org/en/latest/fixture.html)

*括弧と引数無しの使い方*

```py:
@pytest.fixture
def smtp():
    return smtplib.SMTP("smtp.gmail.com")
```
*括弧と引数有りの使い方*

```py:
@pytest.fixture(scope="module")
def smtp():
    return smtplib.SMTP("smtp.gmail.com")
```

どうやってこのようなデコレータを記述しているのか、調べてみました。

正確に記すと、前者の括弧と引数無しの用法での`fixture`はデコレータと呼び、後者の括弧と引数有りの用法では`fixture`はデコレータを作成するデコメーカー(`decomaker`)というものです。([PEP 318 -- Decorators for Functions and Methods]
(https://www.python.org/dev/peps/pep-0318/#current-syntax))

Pytestの[fixtureのソース](https://github.com/pytest-dev/pytest/blob/75ec893d758ba9c376e849eb8fd6aadc38ed38eb/_pytest/fixtures.py#L841)では、fixtureは次のように実装されていました。

```py:
def fixture(scope="function", params=None, autouse=False, ids=None, name=None):
    """ (return a) decorator to mark a fixture factory function.

    This decorator ....(略)    
    """
    if callable(scope) and params is None and autouse == False:
        # direct decoration
        return FixtureFunctionMarker(
                "function", params, autouse, name=name)(scope)
    if params is not None and not isinstance(params, (list, tuple)):
        params = list(params)
    return FixtureFunctionMarker(scope, params, autouse, ids=ids, name=name)
```
括弧と引数無しのデコレータとして`fixture`が用いられた場合、`fixture`の引数`scope`には、デコレータに続く関数定義で定義された関数オブジェクト(上記の例では`smtp`)が渡されます。

`if callable(...`の行で、`scope`が`callable`であるかどうか（と同時に後に続く引数がデフォルト値であるか）を調べ、そうであった場合、デコメーカー`FixtureFunctionMaker`のインスタンスを作成し、さらにその`()`に`scope`を渡しています。

一方、括弧と引数有りでfixtureが使用された場合、デコレータ（デコメーカーのインスタンス）自体を返しています。Pythonは、返されたデコレータに`smtp`を渡して返り値を名前`smtp`にアサインします。

最初引数`scope`を全く別の目的に使用している点が気持ち悪いですが、一つの関数に集約できてユーザーにとっては使いやすいデコレータのインターフェースができます。
XSLリンクと選択肢(Choice)型のフィールドのテンプレートの書き方

SharePointのXSLリンクの話です。中々情報がないので苦労しました。

公式はこちらですので、先にご覧ください。
[方法] リスト ビューでのフィールドのレンダリングをカスタマイズする
https://msdn.microsoft.com/ja-jp/library/office/ff606773(v=office.14).aspx

サーバー表示の場合、次のXSLコードが既定で動作します。
%ProgramFiles%\Common Files\Microsoft Shared\web server extensions\14\TEMPLATE\LAYOUTS\XSL\fldtypes.xsl

XSLリンクでは、指定した名前だったり属性をもつフィールドで、この既定の規則を上書きします。


``xsl:template``タグのmatch属性でフィールドの内部名をマッチングするわけですが、
 
- 下記のサンプルコードではFooがそれにあたります。 
- fldtypes.xslからオーバーライドする既定のtemplateを探し、mode属性を探します。
- xslリンクファイルで、xml:tempalteを定義します。その際、mode属性には上記のものを記述します。


mode属性は、例えばフィールドがDateTime型だったら、mode="DateTime_body" といったような。
フィールドの型の英語表記がわからなかったら以下のドキュメントを参考に。

Field 要素 (フィールド)
https://msdn.microsoft.com/ja-jp/library/office/aa979575.aspx
※Type属性のあたりに詳しく記述があります。

さて、今回私がXSLリンクで上書きしたいフィールドは選択肢(Choise) 型でした。
困ったことにfldtypes.xslでどのテンプレートが該当するのかわかりませんでした（汗）
よくよくxslを読むと、いずれでもなかったら ``mode=body`` を指定すると！なんと！

以下のサンプルコードは選択しの数値によって、天気の日本語表記に変換するXSLです。
xslファイルはエンコードをUTF8にして保存します。

``` code:custom.xsl
<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
                xmlns:d="http://schemas.microsoft.com/sharepoint/dsp"
                version="1.0"
                exclude-result-prefixes="xsl msxsl ddwrt"
                xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
                xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
                xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer" 
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                xmlns:SharePoint="Microsoft.SharePoint.WebControls"
                xmlns:ddwrt2="urn:frontpage:internal">
 <xsl:include href="/_layouts/xsl/main.xsl"/>

 <xsl:template match="FieldRef[@Name='Foo']" ddwrt:dvt_mode="body" mode="body">
    <xsl:param name="thisNode" select="."/>
    <xsl:variable name="fieldValue">   
      <xsl:call-template name="FieldRef_ValueOf_DisableEscape">
        <xsl:with-param name="thisNode" select="$thisNode" />
      </xsl:call-template>
    </xsl:variable>	
    <xsl:choose>   
      <xsl:when test="$fieldValue=1">
        晴れ
      </xsl:when>
      <xsl:when test="$fieldValue=2">
        くもり
      </xsl:when>
      <xsl:when test="$fieldValue=3">
        雨
      </xsl:when>
      <xsl:when test="$fieldValue=4">
         その他
      </xsl:when>
      <xsl:otherwise>
      </xsl:otherwise>
    </xsl:choose> 
  </xsl:template>
</xsl:stylesheet>
```

さて、これをWebパーツを「サーバー表示」にして、の XSLのURLを指定して出来上がりです。
Swift3 - UISearchBarで検索押してるのにsearchBarSearchButtonClicked呼ばれない

```
class ViewController: UIViewController, UISearchBarDelegate{

```

` UISearchBarDelegate ` してない

` SearchBar.delegate = self `　してない

```swift

/*
     Searchボタンが押された時に呼ばれる
*/
    func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {

        self.view.endEditing(true)
        print("反応してる？")
    }
```
Pynq-Z1でHDMIパススルー

Pynqのサンプル
https://pynq.readthedocs.io/en/latest/9_base_overlay_video.html#Starting-and-stopping-the-controller
の簡易版です．

## HDMI INコントローラーの初期化
HDMIを使用するには，HDMIソースを接続し，次のセルを実行してください．HDMIソースが検出されない場合，エラーでタイムアウトします．
#### in[1]:
```py3:JupyterNotebook
from pynq import Overlay
from pynq.drivers.video import HDMI

Overlay("base.bit").download()

hdmi_in = HDMI('in')
```

## HDMI INの確認
HDMI INコントローラーの状態を確認します．

#### in[2]:
```py3:JupyterNotebook
hdmi_in.state()
```
#### out[2]:
```py3:JupyterNotebook
2
```

状態は以下の整数として返されます．

- 0:切断
- 1:ストリーミング中
- 2:一時停止中

HDMIソースが接続されている場合，HDMIソースの解像度を取得できます．

#### in[3]:
```py3:JupyterNotebook
hdmi_in.start()

width = hdmi_in.frame_width()
height = hdmi_in.frame_height()
print('HDMI is capturing a video source of resolution {}x{}'\
      .format(width,height))
```
HDMI is capturing a video source of resolution 1280x720

## HDMI OUTコントローラーの初期化
HDMI出力を使用するのは,HDMI入力を使用する場合と似ています.HDMI OUTポートにディスプレイデバイス等を接続します.
#### in[4]:
```py3:JupyterNotebook
hdmi_out = HDMI('out')
````

## HDMI OUTの確認¶
HDMI OUTコントローラーの状態を確認します．
#### in[5]:
```py3:JupyterNotebook
hdmi_out.state()
````
#### out[5]:
```py3:JupyterNotebook
0
```
状態は以下の整数として返されます．

- 0:停止中
- 1:動作中

## HDMI OUTの解像度の設定
初期化直後は解像度は最低レベルの 640x480 60Hzとして設定されます．
現在の状態を確認するには以下のようにします．

#### in[6]:
```py3:JupyterNotebook
hdmi_out.mode()
```
#### out[6]:
```py3:JupyterNotebook
'640x480@60Hz'
````
現在のモードが文字列として出力されます．モードを変更するには引数にインデックスを渡して mode() を呼び出します．

#### in[7]:
```py3:JupyterNotebook
hdmi_out.mode(2)
```
#### out[7]:
```py3:JupyterNotebook
'1280x720@60Hz'
```
有効なモードは以下の通りです．

- 0:640x480, 60Hz
- 1:800x600, 60Hz
- 2:1280x720, 60Hz
- 3:1280x1024, 60Hz
- 4:1920x1080, 60Hz

## HDMI INからHDMI OUTへ出力
HDMI　INからの入力画像をキャプチャしてHDMI OUTに表示するには，HDMI INとHDMI OUTの双方で同じフレームリストを共有するようにします．一方のフレームリストをもう一方のコンストラクタの引数として渡すことで双方のフレームリストを共有させることができます．

#### in[8]:
```py3:JupyterNotebook
hdmi_out = HDMI('out', frame_list=hdmi_in.frame_list)
hdmi_out.mode(2)
```
#### out[8]:
```py3:JupyterNotebook
'1280x720@60Hz'
```

## HDMI INからHDMI OUTへ出力
HDMI　INからの入力画像をキャプチャしてHDMI OUTに表示するには，HDMI INとHDMI OUTの双方で同じフレームリストを共有するようにします．一方のフレームリストをもう一方のコンストラクタの引数として渡すことで双方のフレームリストを共有させることができます．
#### in[8]:
```py3:JupyterNotebook
hdmi_out = HDMI('out', frame_list=hdmi_in.frame_list)
hdmi_out.mode(2)
```
#### out[8]:
```py3:JupyterNotebook
'1280x720@60Hz'
```
コントローラーを開始することにより，HDMI INからの画像がHDMI OUTから表示されます．
#### in[9]:
```py3:JupyterNotebook
hdmi_out.start()
```
#### in[10]:
```py3:JupyterNotebook
print(hdmi_in.state())
print(hdmi_out.state())
```
1
1

コントローラーを停止し，オブジェクトを解放する．
#### in[11]:
```py3:JupyterNotebook
hdmi_out.stop()
hdmi_in.stop()
del hdmi_out
del hdmi_in
```