OmniAICreator/Qiita-1.07M huggingface dataset:
第27回sedこわいシェル芸勉強会

sed縛り回なのでPHPでやる意味はあんまりない。
普通の言語でやってみたことで普通っていいねという気持ちに。
しかし、PHP芸人であることを強いられているんだ。

[問題](https://blog.ueda.asia/?p=9309)

## Q1

正規表現による置換だとこう。-Rで$argnに標準入力が1行分代入され、スクリプトが毎行実行される。

```bash
echo abcdefghijklmn | php -R 'echo preg_replace_callback("/../", function($s){return $s[0][0].strtoupper($s[0][1]);},$argn);'
```

インデックスで処理するとこうか。

```bash
echo abcdefghijklmn | php -R 'for($i=0;$i<strlen($argn);$i+=2) echo $argn[$i].strtoupper($argn[$i+1]);'
```

## Q2

ふつうにFizzBuzz

```bash
seq 1 100 | php -R 'echo $argn%3?"":"Fizz",$argn%5?$argn%3?$argn:"":"Buzz","\n";'
```

## Q3

$argiに行番号が入ってくるので、それを見て出力と変数格納を切り分けるだけ。

```bash
seq 1 10 | php -R 'if($argi==3)$x=$argn;else echo "$argn\n";if($argi==7)echo "$x\n";'
```

## Q4

Q3とだいたい同じ。設定にもよるけど、手元だと未初期化変数で警告が出るので-Bで初期化する。-Bのコードはプロセス起動後、-Rのコードが実行され始まる前に、1回だけ実行される。

```bash
cat aho.cc | php -B '$x="";' -R 'if(4<$argi&&$argi<10)$x.=$argn;else echo "$argn\n";if($argi==14)echo "$x\n";'
```

## Q5

Q3と似たのが続く。

```bash
seq 1 10 | php -B '$x=null;' -R 'if($x){echo "$argn\n$x\n";$x=null;}else $x=$argn;'
```

## Q6

sed版よりわかりやすいと思う。というか、やはり基本的にsedは行単位で何かするためのツールだと思う……。

```bash
echo 1 | php -R 'for($s=$argn;strlen($s)<10;$s.=$argn){echo "$s\n";}'
```

## Q7

ここはいわば緊縛プレイなのでPHPでやる意味はない。

```bash
php -r 'for($i=1;$i<=10;$i++) copy("a", "a$i");'
```

## Q8

まあふつう。今回はsedのラベルへのジャンプとかホールド・パターンスペースでゴニョるとか、普通の言語にないところがテーマだったので、普通の言語だとまあ、普通になりますね。

```bash
echo 1 | php -R 'for($s=$argn,$t="";strlen($s)<=5;$s.=$argn){$u="$s\n";$t=$u.$t;echo $u;}echo $t;'
```

## 感想

sedで条件式はマゾい（小並感
Job管理ツールAirflowを使ってみる

Job管理ツールを色々探してみている。
今回はAirflowを試してみる。

https://airflow.incubator.apache.org/index.html


# 手順

pipでインストール。今回はMySQLを使うので指定してインストール。

```
$ pip install airflow[mysql]
```

## 初期設定

airflowの設定ファイル群はデフォルトだと $HOME/airflow/ に置かれる。
変更したい場合は 環境変数 $AIRFLOW_HOMEを変更する。

DB接続設定は $AIRFLOW_HOME/airflow.cfg
以下を設定

```:airflow.cfg
sql_alchemy_conn = mysql://[user]:[password]@[host]:[port]/[db]
```

上記で設定した接続先のDBを事前に作っておきます。今回はairflowというDB名にしています。

```sql
CREATE DATABASE IF NOT EXISTS airflow CHARACTER SET utf8;
```

examplesをロードする必要がないのでFalseに設定。
これを指定する場合は様々なデータソースのサンプルが用意されているので、
合わせてmysql以外もインストールしないといけないことがあります。

```:airflow.cfg
load_examples = False
```

上記設定変更が終わったら、DBの初期化処理を走らせます。

```
$ airflow initdb
```

初期化が完了したら下記のようにwebserverを起動させます。
デフォルトは以下の通りに8080ポートになっているので必要に応じてcfgファイルで設定を変更します。

```
$ airflow webserver -D --stdout=/path/to/logs/webserver-stdout.log --stderr=/path/to/log/webserver-stderr.log
```

上記で設定しているオプションに関しては

-D: daemonize
--stdout: 標準出力先
--stderr: 標準エラー出力先
です。
詳しくは https://airflow.incubator.apache.org/cli.html

jobの定義ファイルは$AIRFLOW_HOME/dags/ 以下に置きます。

サンプルはgithub上にあるので、参考にしてみてください。
https://github.com/apache/incubator-airflow/tree/master/airflow/example_dags

bashタスクだと下記のような形式で記述します。
dag_id, schedule_intervalを設定して、
taskのbash_commandを指定するような形です。

```bash
from builtins import range
from airflow.operators.bash_operator import BashOperator
from airflow.operators.dummy_operator import DummyOperator
from airflow.models import DAG
from datetime import datetime, timedelta

args = {
    'owner': 'airflow',
    'start_date': datetime.today(),
}

dag = DAG(
    dag_id='test_dag', default_args=args,
    schedule_interval='0 4 * * *',
    dagrun_timeout=timedelta(minutes=60))


task = BashOperator(
    task_id='task',
    bash_command='echo "do task"',
    dag=dag)
```


タスクの手動実行テストがCUIからできます。Jobが間違ってないかの確認はこれで。

```
$ airflow test [dag_id] [task_id] [実行日]
```

schedulerコマンドを実行することでタスクのスケジューリング設定を有効化できます。

```
$ airflow scheduler -D --stdout=/path/to/logs/stdout.log --stderr=/path/to/logs/stderr.log
```

上記で設定しているオプションに関してはwebserverのオプションと同様です。

# まとめ

* pipで入るので導入はしやすい
* ワークフローの書き方も割とシンプル
* 実行のみをairflowに渡すのであれば、BashOperatorだけで事足りそう
* GUIは実行結果が見やすい。設定はCLIでやることが多くなる。
GIMPでイメージのサイズ変更、別ファイルからの貼付け、自由選択などの自動化

GIMPで次のような事を繰り返していました。

- [画像の生成]-[クリップボードから]（<kbd><kbd>Shift</kbd> + <kbd>Ctrl</kbd> + <kbd>V</kbd></kbd>）
- 範囲選択（毎回同じ場所）
- [画像]-[キャンパスを選択範囲に合わせる]
- 別のイメージを編集中の画像に貼付け（毎回同じ場所）
- 自由選択（なげ輪）で範囲選択（毎回同じ場所）
- [編集]-[消去]（<kbd><kbd>Delete</kbd></kbd>）
- ファイル保存

コレはさすがに自動化したいなと思い、Script-Fuに手をつけました。

# ソースコード
次のようなコードです。

```scm:test01.scm
(define (
	Test01
	img1
	lay1
	)

	(let*
		(
			(filename "C:\\Hoge.xcf")
			(img2 (car (gimp-file-load 1 filename filename)))
			(lay2 (car (gimp-image-active-drawable img2)))
			(floating 0)
		)

		;Undoグループの開始
		(gimp-undo-push-group-start img1)

		;キャンバスサイズの変更
		(gimp-image-resize img1 552 808 -1196 -206)
		;一部上書き用のイメージの範囲選択
		(gimp-rect-select img2 0 0 269 36 REPLACE FALSE 0)
		;コピー
		(gimp-edit-copy lay2)
		;ペースト
		(set! floating (car (gimp-edit-paste lay1 FALSE)))
		;ペーストしたイメージの位置移動
		(gimp-layer-set-offsets floating 283 772)
		;選択領域を固定
		(gimp-floating-sel-anchor floating)
		;アルファチャンネルの追加
		(gimp-layer-add-alpha lay1)
		;自由選択
		(gimp-free-select img1 6 #(538 808 552 792 552 808) 2 FALSE FALSE 0)
		;選択範囲の消去
		(gimp-edit-clear lay1)
		;選択範囲の解除
		(gimp-selection-none img1)

		;undoグループの終了
		(gimp-undo-push-group-end img1)

		;出力
		(gimp-displays-flush)
	)
)

(script-fu-register
    "Test01"
    "<Image>/Script-Fu/Test/Test01"
    "Edit image"
    "R"
    "R"
    "2017"
    ""
    SF-IMAGE "Image" 0
    SF-DRAWABLE "Drawable" 0
)
```

決まった用途なので、座標などそのまま記述しています。

# Python-Fuで書いたもの（現在中途）
折角なのでPython-Fuでも書いてみようとしましたが、一部うまく動かせず、現在途中で断念していますが、その途中のコードです。（後々で直せたら直す予定です）

```py
#!/usr/bin/python
# coding: utf-8
from gimpfu import *

def plugin_main(img1, lay1):
    #Undoグループの開始
    #pdb.gimp_undo_push_group_start(img1)
    #上書き用ファイル
    filename = "C:\\Hoge.xcf"
    img2 = pdb.gimp_file_load(filename, filename)
    lay2 = pdb.gimp_image_active_drawable(img2)
    #キャンバスサイズの変更
    img1.resize(552, 808, -1196, -206)
    #上書き用のイメージの範囲選択
    pdb.gimp_rect_select(img2, 0, 0, 269, 36, 2, FALSE, 0)
    #コピー
    pdb.gimp_edit_copy(lay2)
    #ペースト
    floating = pdb.gimp_edit_paste(lay1, FALSE)
    #ペーストしたイメージの位置移動
    pdb.gimp_layer_set_offsets(floating, 283, 772)
    #フローティングの固定
    pdb.gimp_floating_sel_anchor(floating)
    #アルファチャンネルの追加
    lay1.add_alpha()
    #フリー選択
    #pdb.gimp_free_select(img1, 6, [538, 808, 552, 792, 552, 808], 2, FALSE, FALSE, 0)
    #選択範囲の消去
    #pdb.gimp_edit_clear(lay1)
    #選択範囲の解除
    #pdb.gimp_selection_none(img1)
    #undoグループの終了
    #pdb.gimp_undo_push_group_end(img1)

register(
        "Test01",
        "Test",
        "Test",
        "R",
        "R",
        "2017",
        "<Image>/Script-Fu/Python/Test01",
        "*",
        [],
        [],
        plugin_main)

main()
```

コメントアウトしている部分は、動かすとエラーとなってしまう部分で、原因を特定できていません。
Pythonとしての構文なのか、パラメータなどのミスなのか・・・
なにせ、Pythonは素人で、最初に日本語コメントを書いていて動かない原因がわからなかったくらいですから。おいおい直していきたいと思います。

# 参考にした記事など
- [Script-Fu を書こう](http://kreisel.fam.cx/webmaster/file/script-fu/write-scriptfu.html)
- [PythonでGIMPのスクリプトを書く（Python-Fuの書き方） | d.sunnyone.org](http://d.sunnyone.org/2014/10/pythongimppython-fu.html)
- [GIMP Python Documentation](https://www.gimp.org/docs/python/#plugin_framework)


以上
ショートカットを活用しよう - 18 - (Excel) F11 + α

# Excel での <kbd>F11</kbd>の各種効果など
次の通りです。
<kbd><kbd>F11</kbd></kbd>：グラフシートの追加
<kbd><kbd>Shift</kbd> + <kbd>F11</kbd></kbd>：ワークシートの追加
<kbd><kbd>Ctrl</kbd> + <kbd>F11</kbd></kbd>：マクロシートの追加
<kbd><kbd>Alt</kbd> + <kbd>F11</kbd></kbd>：Visual Basic Editorの起動

<kbd>Alt</kbd>の場合だけ毛色が違うのはなぜなのか・・・

この他にワークシートの追加とマクロシートの追加は次のショートカットもあります。
<kbd><kbd>Shift</kbd> + <kbd>Alt</kbd> + <kbd>F1</kbd></kbd>：ワークシートの追加
<kbd><kbd>Ctrl</kbd> + <kbd>Alt</kbd> + <kbd>F1</kbd></kbd>：マクロシートの追加

ちなみに、
<kbd><kbd>Alt</kbd> + <kbd>F1</kbd></kbd>：現在アクティブなシートにグラフの追加
これもなぜなのか・・・

シートはこの他に、ダイアログシート(MS Excel 5.0 ダイアログ)なるものがあるようですが、こちらはショートカットがあるのかないのかも不明です。(ちょっと調べてみてもわかりませんでした)
追加する場合、シートを右クリックして[挿入...]をクリックした際に表示される[挿入]ダイアログから選択するなどになるでしょうか。

後、ついでなので。シートを削除する際には次のショートカットを利用しています。
<kbd><kbd>Alt</kbd>, <kbd>E</kbd>, <kbd>L</kbd></kbd>
2007以前のバージョンでのアクセスキーです。

以上

|前回|方針|次回|
|:--|:--:|--:|
|[(Excel) <kbd><kbd>Ctrl</kbd> + <kbd>1</kbd></kbd>](http://qiita.com/rrryutaro/items/00e3e52af52b394f1bb4)|[記事の方針](http://qiita.com/rrryutaro/items/74d60a6e31ff149c5710)|[(Excel) <kbd>Space</kbd>の各種効果](http://qiita.com/rrryutaro/items/4b7a01e03cfa594ba615)|
PowerShellでWindowsイベントログから指定日のPC起動/停止時刻を把握

件名の通り。
自分の勤怠を思い出すために作成。

``` 
$targetDate = date('2017/02/10')
$events = get-eventlog system -before $targetDate.addDays(1) -after $targetDate
$events | select-object -last 1 TimeGenerated
$events | select-object -first 1 TimeGenerated
```

指定日のログを取得し、最初の１件と最後の１件を表示。
golangインストール手順

goインストール手順をメモ

## 1.[参考]インストール手順
https://blog.yohei.org/go-golang-install/


## 2. homebrewをインストール
homebrewの詳細はhttps://liginc.co.jp/web/tool/mac-iphone/151069

```
ruby -e "$(curl -fsS http://gist.github.com/raw/323731/install_homebrew.rb)”
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew list
brew update
```

### 参考 unsitallコマンド
```
 ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/uninstall)"
```


# 3.homebrewからgoをインストール	
```
brew search go
brew install go
go version
go version go1.7 darwin/amd64
```

# 4.環境変数設定
```
vim .bash_profile
  export GOROOT="go env GOROOT" or "/usr/local/opt/go/libexec"
  export GOPATH=$HOME/dev/go
  export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
source .bash_profile
go version
go version go1.7 darwin/amd64
```

# 5.hello world を確認
```
vim hello.go
	/* CSS declarations go here */

	package main
	import "fmt"

	func main(){
		fmt.Printf("hello world\n")
	}

go run hello.go
hello world
```
Rustのfold

ふつうの関数型言語の感覚で`fold`すると、参照で詰む。

例題として、任意個の整数の最大公約数の計算を考える。

# 誤ったコード
```rust
fn gcd(a: u32, b: u32) -> u32 {
    assert!(a != 0 || b != 0);
    if a == 0 { b }
    else { gcd(b % a, a) }
}

fn main() {
    let nums = [799459, 28823, 27347];
    if let Some((head, tail)) = nums.split_first() {
        println!("gcd = {}", tail.iter().fold(head, gcd));
    }
}
```

# 正しいコード
```rust
fn gcd(a: u32, b: u32) -> u32 {
    assert!(a != 0 || b != 0);
    if a == 0 { b }
    else { gcd(b % a, a) }
}

fn main() {
    let nums = [799459, 28823, 27347];
    // &head に注意
    if let Some((&head, tail)) = nums.split_first() {
        // &b に注意
        println!("gcd = {}", tail.iter().fold(head, |a,&b| gcd(a,b)));
    }
}
```

* `slice::split_first`は参照を返すので、`&head`で受けて参照を剥がさなければならない
* `fold`する関数の第二引数には参照が渡ってくるので、`&b`で受けて参照を剥がさなければならない

`fold`に渡す関数の引数と戻り値が参照である場合は、この罠には嵌まらない。
Macターミナルvim設定

自分用にターミナルvim設定のメモ。

# OSバージョン
macOS Sierra 10.12.2


# vimインストール
```
brew install vim
```

#行番号追加
```
touch ~/.vimrc
vim ~/.vimrcで下記を追加
  set number
```

# カーソルライン・カーソルカラム
### 参考(http://qiita.com/marrontan619/items/541a1374e1ac672977e6)
```
vim ~/.vimrcで下記を追加
  set cursorline
  set cursorcolumn
  syntax on
  colorscheme molokai
  set title
  set number
  set ambiwidth=double
  set tabstop=4
  set expandtab
  set shiftwidth=4
  set smartindent
  set cursorline
  set cursorcolumn
```

# カラースキームのmorokaiインストール
```
mkdir ~/.vim
cd ~/.vim
mkdir colors
git clone https://github.com/tomasr/molokai
mv molokai/colors/molokai.vim ~/.vim/colors/
```

# 表示名変更
```
vim /etc/bashrc で下記に書き換え
  PS1='[\u:\w]\$ '
```
Spring Tips

#@RequestMappingの合成アノテーション  
**@RequestMapping**の合成アノテーションとして**@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping**が追加されています。

```Spring4.2以前
@RequestMapping(value = "/v1/hoge", method = RequestMethod.OPTIONS)
List<Resource> hoge() {
    return resource;
}
```

```Spring4.3以降
@GetMapping(value = "/v1/hoge")
List<Resource> hoge() {
    return resource;
}
```

# Validatorインスタンスをインジェクション
ValidatorFactoryはDIコンテナから取得してください。 Spring Bootがデフォルトで作成するので、特に設定は不要です。  

```before.java
public void validation(Object obj) {
		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
		Validator validator = factory.getValidator();
}
```

```after.java
@Autowired
Validator validator;
```

#message一覧はmessages.propertiesに定義

メッセージはapplication.propertiesではなく、messages.propertiesに定義して、
* Javaコードからは**org.springframework.context.MessageSource**からメッセージ取得
* Thymeleafのテンプレートからは**#{key}**で取得

#Spring Boot Dev Tools
[**spring-boot-devtools**](http://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html "spring-boot-devtools")は開発を快適するためのモジュールです。
モジュールの依存関係を追加すれば使えます。

```pom.xml
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>
```
```build.gradle
dependencies {
    compile("org.springframework.boot:spring-boot-devtools")
}
```


# JPAエンティティの主キーの型
JPAのエンティティは主キーが**null**かどうかのチェックを各所でするので、**long**のようなnative型を使うのはNGです。

```before.java
@Id
@Column(name = "user_id")
private long userId;
```
```after.java
@Id
@Column(name = "user_id")
private Long userId;
```
React+Redux+Node.js+express+MongoDBインストール手順

自分のメモ用にReact/Node.js/express/MongoDBのインストール手順をメモ。


## nvmインストール
```
git clone git://github.com/creationix/nvm.git ~/.nvm
```

## Node.js
```
nvm install <version>
```

## express
#### まずはグルーバルにインストール
```
npm install express --save -g
npm install express-generator --save -g
npm install ejs --save -g
```

#### そのあとプロジェクトディレクトリにexpressインストール
```
cd ~/dev
mkdir <プロジェクト名>
cd ~/dev/<プロジェクト名>
express -e ./<プロジェクト名>
```
#### 依存モジュールインストール
```
cd ./<プロジェクト名> && npm install
```
#### run the test app
```
DEBUG=<プロジェクト名>:* npm start
```


## MongoDB
#### mongodb自体をインストール
```
brew install mongodb
ln -sfv /usr/local/opt/mongodb/*.plist ~/Library/LaunchAgents
launchctl load -w ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist
```
#### データ格納ディレクトリ作成
```
mkdir -p ~/dev/mongodb/data/db
```

#### 起動
```
mongod --dbpath ~/dev/mongodb/data/db
```

#### 設定ファイル
```
vim /usr/local/etc/mongod.conf
	systemLog:
		destination: file
  		path: /usr/local/var/log/mongodb/mongo.log
  		logAppend: true
	storage:
  		dbPath: ~/dev/mongodb/data/db
	net:
  		bindIp: 127.0.0.1
```

#### expressとの連携のためパッケージインストール
###### Node.js用driver(node-mongo-native)
```
npm install mongodb --save -g
```

###### MongoDB用のO/Rmapper
```
npm install mongoose --save -g
```

###### セッション管理にMongoDBを使うためのモジュール
```
npm install connect-mongo --save -g
```

###### セッション管理を行うモジュール
```
npm install express-session --save -g
```

## React
```
npm install react react-dom --save -g
```
AWS SDK for Ruby (V2) でエラー発生時に生の HTTP リクエスト・レスポンスを確認する

あまり必要ないかもだけど、やってたらできたのでメモしておく。

## 標準のログ出力だとできない

こんな感じで logger/log_level を指定しても、

```ruby
require "aws-sdk"

ENV["AWS_ACCESS_KEY_ID"] = "test"
ENV["AWS_SECRET_ACCESS_KEY"] = "test"
ENV["AWS_REGION"] = "ap-northeast-1"

client = Aws::S3::Client.new(logger: Logger.new(STDOUT), log_level: :debug)
client.list_buckets
```

こんな出力になるだけ。

```
D, [2017-02-12T23:01:43.918174 #191] DEBUG -- : [Aws::S3::Client 403 0.027187 0 retries] list_buckets() Aws::S3::Errors::InvalidAccessKeyId The AWS Access Key Id you provided does not exist in our records.
```

## エラーオブジェクトのコンテキストを参照するとよい

このようにエラーオブジェクトのコンテキストを p すると、

```ruby
require "aws-sdk"

ENV["AWS_ACCESS_KEY_ID"] = "test"
ENV["AWS_SECRET_ACCESS_KEY"] = "test"
ENV["AWS_REGION"] = "ap-northeast-1"

begin
  Aws::S3::Client.new.list_buckets
rescue => e
  p e.context.http_request
  p e.context.http_request.body.read
  p e.context.http_response
  p e.context.http_response.body.read
end
```

このように生の HTTP リクエスト・レスポンスオブジェクトを調査することができる。

```
#<Seahorse::Client::Http::Request:0x00000001e67b10 @endpoint=#<URI::HTTPS https://s3-ap-northeast-1.amazonaws.com/>, @http_method="GET", @headers={"user-agent"=>"aws-sdk-ruby2/2.7.7 ruby/2.4.0 x86_64-linux", "x-amz-date"=>"20170212T230508Z", "host"=>"s3-ap-northeast-1.amazonaws.com", "x-amz-content-sha256"=>"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", "authorization"=>"AWS4-HMAC-SHA256 Credential=test/20170212/ap-northeast-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=af202c352b983e16265c91eb435cf10044f8c0a7da511f61e2a4f7c3132a3a79", "content-length"=>"0"}, @body=#<StringIO:0x00000001cedc08>>
""
#<Seahorse::Client::Http::Response:0x00000001e58e80 @status_code=403, @headers={"x-amz-request-id"=>"73A1F598850BFE18", "x-amz-id-2"=>"FiIfC0BDsbYddCrVVMkrJV+9Toy9/cbq5XbD6xdmwJ9WnTnMaOxfjYkoaf/la6CAhyCeLoh34Vs=", "content-type"=>"application/xml", "transfer-encoding"=>"chunked", "date"=>"Sun, 12 Feb 2017 23:05:07 GMT", "server"=>"AmazonS3"}, @body=#<StringIO:0x00000001e58db8>, @listeners={:headers=>[], :data=>[], :done=>[]}, @complete=false, @done=true, @error=nil>
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>InvalidAccessKeyId</Code><Message>The AWS Access Key Id you provided does not exist in our records.</Message><AWSAccessKeyId>test</AWSAccessKeyId><RequestId>73A1F598850BFE18</RequestId><HostId>FiIfC0BDsbYddCrVVMkrJV+9Toy9/cbq5XbD6xdmwJ9WnTnMaOxfjYkoaf/la6CAhyCeLoh34Vs=</HostId></Error>"
```

## 参考資料

* [Class: Seahorse::Client::RequestContext — AWS SDK for Ruby V2](http://docs.aws.amazon.com/sdkforruby/api/Seahorse/Client/RequestContext.html)
macOS Sierraへのアップグレード以前からインストールされていたbrewを更新する

# 問題

macOS Sierra以前のEl Capitanなどでbrewをインストールし、クリーンインストールではなく上書きインストールした場合、`brew update`を実行しようとするエラーが発生してしまう。

```shell-session
$ brew --version
Homebrew 1.1.9-131-gcf18a99
Homebrew/homebrew-core (git revision bdf98; last commit 2016-04-30)
$ brew update
Error: /usr/local must be writable!
```

# 解決法

`brew doctor`の指示に従って`/usr/local`のオーナーを`sudo chown -R $(whoami) /usr/local`で一時的に変更して`brew update`を実行し、実行後に`sudo chown root:wheel /usr/local`でオーナーを元に戻す。

```shell-session
$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry and just ignore them. Thanks!

Warning: /usr/local is not writable.

You should probably change the ownership and permissions of /usr/local
back to your user account.
  sudo chown -R $(whoami) /usr/local
$ brew update
Updating Homebrew...
==> Auto-updated Homebrew!
（中略）
==> Migrated HOMEBREW_REPOSITORY to /usr/local/Homebrew!
Homebrew no longer needs to have ownership of /usr/local. If you wish you can
return /usr/local to its default ownership with:
  sudo chown root:wheel /usr/local
（後略）
$ sudo chown root:wheel /usr/local
```
Raspberry pi 1 model bで、with pixel　その6

#概要
Raspberry pi 1 model bで、音声合成やってみた。

#生成した音声
http://jsdo.it/ohisama1/wHGc


#環境
Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel
sd_card MF-RUMSD08GL elecom
HDMI to VGA adapter(amazon)
usb keyboard(nec)
usb mouse(nec)
usb audio C-Media Electronics

#インストール
sudo aptitude install open-jtalk
ダウンロード
tohoku-f01-neutral.htsvoice
open_jtalk_dic_utf_8-1.10.tar.gz

#テスト

```
echo "お掃除します" | open_jtalk -x open_jtalk_dic_utf_8-1.10 -ow talk.wav -m tohoku-f01-neutral.htsvoice
```

#サンプルコード

```
#coding: utf-8
import subprocess

txt = "お掃除します"
open_jtalk = ['open_jtalk']
mech = ['-x', 'open_jtalk_dic_utf_8-1.10']
htsvoice = ['-m', 'tohoku-f01-neutral.htsvoice']
outwav = ['-ow', 'talk.wav']
cmd = open_jtalk + mech + htsvoice + outwav
c = subprocess.Popen(cmd, stdin = subprocess.PIPE)
c.stdin.write(txt)
c.stdin.close()
c.wait()
aplay = ['aplay', '-D', 'plughw:1,0', 'talk.wav']
wr = subprocess.Popen(aplay)
```
Device Farm(appium python)からAPI Gatewayにリクエストを投げる

# 結論

**できない**


# 経緯
ふえぇ。結論から先に言えってえらいおにいさんたちが言うから結論から書いたんだよぅ。
というわけで経緯です。

1. 序章：SSL handshake failure編
2. 本題：subprocessでサーバーのぞいちゃうぞ編
3. 終章：俺の２月返してくれ編


## 序章：SSL handshake failure編
ごく普通のイケメンエンジニア、たかはしマンは現在関わっているプロダクトを次の形へと進化させるべく奮闘していた。

AWSのDevice Farm上で動くappium-pythonのコードからAPI Gateway + LambdaでたてたサーバーレスなAPIを利用して、動的にデバイステストを行おうと考えたのだ。

朝起きてすぐに背伸びをするようにパッケージをインストールし、

```bash
$ pip install requests
```

背骨が伸びるとともに吸い込んだ息を吐き出すように、そう、いつものルーチンでrequestsを書いた。

```py
response = requests.post(
    url,
    headers=headers,
    data=json.dumps(payload)
)

return response.json()
```

PHPerからPythonistaになってから毎日やってきた動作だ。何も怖いものなんてない。
優しくパッケージングしてDevice Farmに流し込む。
余談だが、たかはしマンは `deploy.sh` という何もdeployしないパッケージング用のシェルを用意していた。
Device Farmに流し終われば、あとはコードにミスがないかを細かく直していけば終わりだ。

**SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure**

たかはしマンは、息を呑んだ。


## 本題：subprocessでサーバーのぞいちゃうぞ編

めんどくさくなったので本題はさくっと終わらせます。
subprocessで超潜ったのでわかったことだけ書きます。

- SSLv3はPOODLEとかいろんな脆弱性で死んだ
- requests-toolbeltつかってもだめ
- PyOpenSSLいれようとするとwheelが `none-any` になってないからだめ
- もともとPyOpenSSLはいってた
- opensslのバージョンは1.0.0
- 使える最新SSLバージョンはTLSv1
- 暗号スイートはAPI Gatewayにも使えるやつがあった
- curlではTLSv1で外につなぎにいくことが可能


## 終章：俺の２月返してくれ編

- API Gatewayはクライアント側のSNI対応が必須
- Python側は2.7.9からSNIに対応
- Device Farm内のPythonバージョンは2.7.6

リバプロするかcurlで頑張ってパースするしかないんだって...

宝の地図も、宝もあるかわからないところに潜った結果がコレ。
たぶん世界でもこんな罠踏んだ人いないと思うけど、第２、第3の僕が現れたときに何かの役に立ちますように...

**俺の２月返してくれ！**
Raspberry pi 1 model bで、with pixel　その5

#概要
Raspberry pi 1 model bで、USBオーディオトングルやってみた。


#写真
![MVC-012S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/a42abd6b-d395-36b1-7741-3abbd45fe48a.jpeg)


#環境
Raspberry pi 1 model b(element14)
raspbian 2016-11-25 jessie with pixel
sd_card MF-RUMSD08GL elecom
HDMI to VGA adapter(amazon)
usb keyboard(nec)
usb mouse(nec)
usb audio C-Media Electronics

#接続確認
lsusb

```
Bus 001 Device 007: ID 03ee:6402 Mitsumi
Bus 001 Device 006: ID 0409:0019 NEC Corp. 109 Japanese Keyboard with Bus-Powered Hub
Bus 001 Device 005: ID 0409:55aa NEC Corp. Hub
Bus 001 Device 004: ID 0d8c:000c C-Media Electronics, Inc. Audio Adapter
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. SMSC9512/9514 Fast Ethernet Adapter
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
```
#カード、デバイスの確認
aplay -l

```
**** ハードウェアデバイス PLAYBACK のリスト ****
カード 0: ALSA [bcm2835 ALSA], デバイス 0: bcm2835 ALSA [bcm2835 ALSA]
  サブデバイス: 8/8
  サブデバイス #0: subdevice #0
  サブデバイス #1: subdevice #1
  サブデバイス #2: subdevice #2
  サブデバイス #3: subdevice #3
  サブデバイス #4: subdevice #4
  サブデバイス #5: subdevice #5
  サブデバイス #6: subdevice #6
  サブデバイス #7: subdevice #7
カード 0: ALSA [bcm2835 ALSA], デバイス 1: bcm2835 ALSA [bcm2835 IEC958/HDMI]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
カード 1: Set [C-Media USB Headphone Set], デバイス 0: USB Audio [USB Audio]
  サブデバイス: 1/1
  サブデバイス #0: subdevice #0
```

#再生
aplay -D plughw:1,0 test.wav

#音量
amixer sset Mic 20 -c 1

#録音
arecord -f S16_LE -D plughw:1,0 test.wav

#pyaudioのインストール
sudo aptitude install python-pyaudio

#pyaudioで録音

```
import pyaudio
import wave

chunk = 4096
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
RECORD_SECONDS = input('time ')
p = pyaudio.PyAudio()
stream = p.open(format = FORMAT, channels = CHANNELS, rate = RATE, input = True, input_device_index = 2, frames_per_buffer = chunk)
all = []
for i in range(0, RATE / chunk * RECORD_SECONDS):
    data = stream.read(chunk)
    all.append(data)
stream.close()
data = ''.join(all)
out = wave.open('test.wav','w')
out.setnchannels(1)
out.setsampwidth(2)
out.setframerate(RATE)
out.writeframes(data)
out.close()
p.terminate()
```

#pyaudioで再生

```
import pyaudio
import wave

CHUNK = 4096
filename = "test.wav"
wf = wave.open(filename, 'rb')
p = pyaudio.PyAudio()
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()), channels = wf.getnchannels(), rate = wf.getframerate(), output = True)
data = wf.readframes(CHUNK)
while data != '':
    stream.write(data)
    data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()

```
タスク管理についての個人的まとめ

#この記事を書いた理由#
ITとはちょっと外れてしまいますが、自分の仕事のやり方を固めていくために教えられたこと、考えたことを記載していきます。

#進捗報告#
遅れているかそうでないかを伝えるだけでよい。
管理者は予定されている作業が遅れているかどうかを知りたい。
報告の本来の目的は遅れていることへの対策を考えるものだから。
そのため、順調なときは短くでよい。

#リカバリー#
遅延したら、リカバリ方法を言う。思いつかなかったら相談。

|方法|説明|
|:-----------------|:-----------------|
|作業者の見直し||
|優先順位の見直し|複数作業が積まれている場合、取り掛かる順序を検討
|要員増やし||
|納期調整||
|残業||
|作業方法見直し|時間がかかった作業の方法を見直し、省略する|

#上手くいかないときはどうすればいいか#

| 現象       |       原因 |    対策    |
|:-----------------|:-----------------|:------------------|
| オンスケであることを疑われた| 根拠があるかを疑っているため | 自分の作業状況とこれからの段取りを説明する|
|遅延報告がうまくできない|どこで遅れたかを把握できてない。リカバリ方法を考えていない|リカバリ方法を言う。思いつかなかったら相談。|        
|予定外の作業が発生した|急に作業を頼まれた|元々予定されていた作業の実施時間や日程をずらし、作業整理を行う|

#スケジュールの立て方#
さらに日報、メーラーでの予定管理も併用すると確実です。(時間はかかりますが・・・)

| サイクル       | 作業名       |       説明 |    備考    |
|:-----------------|:-----------------|:-----------------|:------------------|
|月次|タスク一覧作成|月に対して、割り当てられた作業を一覧表にする||
|月次|月次計画作成|予定表にタスク一覧から転記。<br>定型作業の実施日をまず先に入れておく。(会議など)<br>すでに依頼されている作業があれば、その作業を記入。<br>時間が余っている場合、上長に仕事の割り振りを依頼||
|週次|見直し|週の初めにその週のTODOを基に計画(スケジュール)、タスク一覧を修正||
|週次|タスク分割|時間がかかりそうな作業(2時間以上のもの)があれば、作業を分解して、分割したものを追記していく|[サラミ・スライス法](http://tokumoto.jp/2014/09/175/)|
|日次|見直し|日中、横入りの作業がある場合はTODOを新たに追記していく||
|日次|見直し|日の終わりに明日のスケジュールの見直し。<br>優先順位にしたがった作業順序にする。絶対に終わらせなければならない作業を先に持っていくこと。それより優先順位が低いものは後回し、もしくは翌日にまわす||
ペアリング暗号ライブラリmclを使ってみる

# 初めに

インターネット上で安全な通信をするために、秘密鍵暗号や公開鍵暗号が使われています。最近では公開鍵暗号の一つとして楕円曲線暗号が使われることも多くなりました。

ここではそういった通常の公開鍵暗号ではなく、より機能が豊富なペアリング暗号を扱います。身近にペアリング暗号が使われているケースはまだあまりないのですが、いろいろ面白いことが実現できます。最近では完全匿名性を実現したと言われる分散型暗号通貨Zcashで使われています。
ペアリング暗号の詳細は拙著『[クラウドを支えるこれからの暗号技術](https://www.amazon.co.jp/gp/product/479804413X)』（秀和システム）をごらんください。

さて、ペアリングは面白いことができるのですが実装するのが難しくなかなか気軽に試せません。そこで使いやすくて高速なライブラリ[mcl](https://github.com/herumi/mcl/)を開発しています。そのライブラリを試してみようというのが本題です。

ちなみに「高速」と書きましたが、どれぐらいの性能かというとx64環境では筑波大学が開発している[TEPLA](http://www.cipher.risk.tsukuba.ac.jp/tepla/)というペアリングライブラリの5.6倍ぐらい速いです。詳細は[Benchmark](https://github.com/herumi/mcl/#benchmark)をごらんください。

# mclのインストール

## mclがサポートする環境

- 64bit Windows上のVisual Studio
- Linux上のx86/x64用gcc, clang
- Linux上の32bit/64bit ARM用gcc

mclはC++で記述されています。WindowsやLinuxのx64だけでなくスマートフォンなどで普及が進んでいる64bit ARMにも対応しているのが特長です。

## チェックアウト

Linuxの場合、次のディレクトリ構成でチェックアウトしてください。

```
git clone https://github.com/herumi/mcl
```

外部ライブラリとして[OpenSSL](https://www.openssl.org/)や[GMP](https://gmplib.org/)を使います。
`apt install libgmp-dev`（Ubuntuの場合）などとしてインストールしてください。

Windowsでは外部ライブラリのコンパイル済みバイナリを提供しています。上記`work`ディレクトリで
```
git clone https://github.com/herumi/cybozulib_ext
```
としてください。

## ビルドとテスト
Linuxなら
```
cd mcl
make test
```
でビルドとテストが走ります。最後に`all unit tests are OK`と表示されればOKです。

Windowsでは
```
cd mcl
mklib
```
でライブラリが作られます。そしてたとえば
```
mk -s test/bn_test.cpp
```
とするとbin/bn_test.exeができるので実行してください。特にエラー表示がなければOKです。

## ペアリングの最小サンプル

無事ビルドができれば簡単なサンプル[sample/pairing.cpp](https://github.com/herumi/mcl/blob/master/sample/pairing.cpp)を動かしてみます。
以下はコードの抜粋です。

```C++:pairing.cpp
#include <mcl/bn256.hpp>

using namespace mcl::bn256;

const char *aa = "12723517038133731887338407189719511622662176727675373276651903807414909099441";
const char *ab = "4168783608814932154536427934509895782246573715297911553964171371032945126671";
const char *ba = "13891744915211034074451795021214165905772212241412891944830863846330766296736";
const char *bb = "7937318970632701341203597196594272556916396164729705624521405069090520231616";

int main()
{
    initPairing();
    G1 P(-1, 1);
    G2 Q(Fp2(aa, ab), Fp2(ba, bb));

    const mpz_class a = 123;
    const mpz_class b = 456;
    Fp12 e1, e2;
    pairing(e1, P, Q);
    G2 aQ;
    G1 bP;
    G2::mul(aQ, Q, a);
    G1::mul(bP, P, b);
    pairing(e2, bP, aQ);
    Fp12::pow(e1, e1, a * b);
    printf("%s\n", e1 == e2 ? "ok" : "ng");
}
```

Linuxなら
```
make bin/pairing.exe
```
で`bin/pairing.exe`が、Windowsなら
```
mk -s sample/pairing.cpp
```
で`bin/pairing.exe`ができます。実行してエラーがなければOKです。

## ライブラリを使う

mclライブラリを使う場合は`mcl/include/`をインクルードパスに、`mcl/lib/`をリンカーのパスに指定して`libmcl.a`や`mcl.lib`をリンクしてください。

# まとめ

今回はペアリングライブラリmclのインストールとサンプルの動かし方を説明しました。
次回以降ではライブラリの説明をしたいと思います。
技術英語 > In Python, a dictionary is also called a dict to [save syllables]

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

> In Python, a dictionary is also called <font color=blue>a dict</font> to **save syllables**.

https://www.merriam-webster.com/dictionary/save
> 3 b :  to avoid unnecessary waste or expense :  economize

You're wasting your tongue.
というような言い回しで「時間を無駄にしているよ」という意味があったように思うが、検索では見つからなかった。

こちらの方の勘違いかもしれない。
http://ejje.weblio.jp/content/waste+breath
メモ: Raspberry Piでsshを有効にする

* 参考: [Eclipse IoT の紹介 - Part1: Eclipse KuraをRaspberry Piにインストールする - Qiita](http://qiita.com/masato/items/18edf2789b50789b93a8) の記事がとてもよかった。

## SSHを有効にする

```
$ touch /mnt/`sdカード`/boot/ssh
```

```
e:
mkdir ssh
もしくは
copy /y nul ssh
```

```
ping -4 raspberrypi.local
```

```
ssh pi@ipアドレス
```

pi : raspberry

## 初期設定

> 2016-05-10にリリースされたJessieイメージから1 Expand Filesystemは初回ブート時に自動的に実行されるようになりました。

```
sudo raspi-config
```

```
4 Internationalisation Options
I1 Change Locale -> ja_JP.UTF-8のまま
I2 Change Timezone -> Asia -> Tokyo
```

```bash:overclock(pi1の場合)
Medium 900MHz ARM, 250MHz core, 450MHz SDRAM, 2 overvolt
```

## ip設定

```rb:/etc/dhcpcd.conf末尾に追記
interface eth0
static ip_address=192.168.0.15/24
static routers=192.168.0.1
static domain_name_servers=192.168.0.1
```
Webpackのバージョンが1か2か判定する

#目的

Webpack 1, 2どちらでも動かせるように実装しなきゃいけない！つらい環境で、
Webpackのバージョンが1か2か判定をして実行する処理を分けたい:thinking:



---
#結論
`webpack.optimize.OccurenceOrderPlugin`を`function`で比較する

---
#参考にしたリポジトリ

> Phenomic
> https://github.com/MoOx/phenomic/

Phenomicについて
https://speakerdeck.com/trkw/phenomic

---
#参考にしたファイル

> https://github.com/MoOx/phenomic/blob/0.20.3/docs/webpack.config.js#L8-L10
> * WARNING: this config is super ultra cool as it support both webpack 1 & 2
> 訳: 警告：この設定はWebpack 1、2の両方をサポートするので**スーパーウルトラクール** です。

こんな書かれていたら、気になるので調べてみる

---

#_utils/webpack-version/index.js
これは判定しているJavaScript

> https://github.com/MoOx/phenomic/blob/0.20.3/src/_utils/webpack-version/index.js

> ```js
> import webpack from 'webpack'
> 
> export default () => (
>   typeof webpack.optimize.OccurenceOrderPlugin === 'function'
>   ? 1
>   : 2
> )
> ```

三項演算子で、`webpack.optimize.OccurenceOrderPlugin` が`function`かどうか判定し
`function`であれば`1`、でなければ`2`を返すという実装のよう

---

#OccurenceOrderPlugin
そもそもこのOptimizeプラグインは、モジュールに振るIDの桁数をより短くすることでよりコードを圧縮するものですが、
Webpack 2ではこれがデフォルトとなっています。

>What's new in webpack 2
>https://gist.github.com/sokra/27b24881210b56bbaff7#occurrence-order

---

Webpack 1.14.0のこの実装を追っていくと、下記ファイルが見つかる

> https://github.com/webpack/webpack/blob/v1.14.0/lib/optimize/OccurenceOrderPlugin.js

> ```js
> /*
> 	MIT License http://www.opensource.org/licenses/mit-license.php
>	Author Tobias Koppers @sokra
> */
> module.exports = require("./OccurrenceOrderPlugin");
> ```

---

このファイルのgitログを追っていくと`occurrence`のtypoだという
下記のIssueと下記のCommitによって修正されている。

> - Typo in OccurenceOrderPlugin #179
https://github.com/webpack/webpack/issues/179

> - fixed #179 typo in OccurenceOrderPlugin
https://github.com/webpack/webpack/commit/48aad3eeee3424e9150cce8df92cb5467213f40c?w=1#diff-fd0105318540761bae6db3485f46cad8L5

---

:bulb: ポイントとしては、このtypoされた`function`がWebpack 1のみに存在し、
Webpack 2には存在しないため、この判定ができること

---

#webpack.config.js
実際に、この_utils/webpack-version/index.jsを利用するとこんな感じ

まずは、`import`
> https://github.com/MoOx/phenomic/blob/0.20.3/docs/webpack.config.js#L11
>
> ```js
> import webpackVersion from "phenomic/lib/_utils/webpack-version"
> ```

---

`webpackVersion()`で条件文をコーディングする

> https://github.com/MoOx/phenomic/blob/0.20.3/docs/webpack.config.js#L173-L191

> ```js
> webpackVersion() === 1
> ? []
> : [
>  // You should be able to remove the block below when the following
>  // issue has been correctly handled (and postcss-loader supports
>  // "plugins" option directly in query, see postcss-loader usage above)
>  // https://github.com/postcss/postcss-loader/issues/99
>  new webpack.LoaderOptionsPlugin({
>    test: /\.css$/,
>    options: {
>      postcss: postcssPlugins,
>      // required to avoid issue css-loader?modules
>      // this is normally the default value, but when we use
>      // LoaderOptionsPlugin, we must specify it again, otherwise,
>      // context is missing (and css modules names can be broken)!
>      context: __dirname,
>    },
>  }),
> ]
> ```

これで、判定できた:innocent:

---

#まとめ
今からコーディングするならWebpack 2で書くので、あまり意識しなくていいけど、
なぜ差分が現れたのか知るのは大事ですね。

もっと簡単に判定できる方法あるのかな？
WerckerのBuild通知をSlackに流す方法【2017/02/13版】

なんかwerckerのslack通知方法がころころ変わっていて参考になるか怪しかったので、メモがてら現時点での最新版を書いておこうかなと思います

## 環境
- Ruby:2.4.0
- Rails: 5.0.1

## 方法
+ slackからIncoming Webhooks用のURLを取得してコピー
+ werckerでで通知させたいApplicationsを開く
+ <> Environmentタブを開く
+ Keyは適当に決める(例:SLACK_WEBHOOK_URL)
+ Valueには、先ほどのSlackのURLを貼り付ける。(https://hooks.slack.com/services/hoge/foo/... みたいなやつね)
    + protectedにチェック入れるとbuild時のログに残らなくなります。
+ wercker.ymlを編集して通知を飛ばすように
    + [step-pretty-slack-notify](https://github.com/wantedly/step-pretty-slack-notify)を使いました。
    + 詳しいオプションとかは公式サイト見てください

```yaml:wercker.yml
# Slackに結果を飛ばす
  after-steps:
    - wantedly/pretty-slack-notify:
      webhook_url: $SLACK_WEBHOOK_URL # 上で設定したkeyを入れる
```

これでslackに通知が飛ぶはず・・・
Rustで「エラトステネスの篩」で「2.6秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた

詳しくはリンク先参照。とりあえずRustで書いてみた。

- [C#で「エラトステネスの篩」で「2.6秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](https://tail-island.github.io/programming/2016/04/15/lazy-primes.html)
- [Golangで「エラトステネスの篩」で「2.1秒で百万個」の素数を計算できる「無限シーケンス」を作ってみた](http://qiita.com/cia_rana/items/2a878181da41033ec1d8)

```rust

use std::collections::HashMap;

fn main() {
    let mut dict = HashMap::new();
    let mut iter = (1..).filter_map(|j| {
        let i = 2 * j + 1;
        let (factor, is_prime) = match dict.remove(&i) {
            Some(f) => (f, false),
            None => (i * 2, true),
        };
        let key = (1..)
            .filter_map(|j| {
                let k = i + j * factor;
                if dict.contains_key(&k) { None } else { Some(k) }
            })
            .next()
            .unwrap();
        dict.insert(key, factor);
        if is_prime { Some(i) } else { None }
    });
    println!("{}", iter.nth(1000_000 - 2).unwrap());
}

```

[step_by](https://github.com/rust-lang/rust/issues/27741)が欲しかった。
flowtype で typescript の *.d.ts のように型定義 *.js.flowを出力する

## やりたいこと

flowで書かれた npmパッケージを作成する時、webpack/browserifyでバンドルされるのを想定してes5水準までコンパイルしつつ、かつflowの型定義も外部ファイルに頼らず提供したい

```
.babelrc
package.json
src/ # ソース
  index.js
  index.test.js
lib/ # コンパイル済み
  index.js
  index.js.flow
```

*.test.js はスキップしつつ、コンパイル済みの index.js と index.js.flow を作成したい

## 方法

babelの設定は省略。yarnを使ってるけどnpmに置き換えれば良いとして、`yarn add babel-cli flow-bin -D` を前提として

```json:package.json
{
  ... 略
  "scripts": {
    "build:flow-gen": "flow gen-flow-files src/ --out-dir lib --ignore '.*.test.js'",
    "build:js": "babel src -d lib --ignore test.js",
    "prepublish": "yarn build:js && yarn build:flow-gen"
  },
  "files": [
    "lib/"
  ]
}
```

テストするときは babel-register なり babel-node なりでそのまま実行すれば良い。正しいコンパイルが行われているかはbabelの責務なので。

## 意味

- babel-cli で src => lib へコンパイル
- flow gen-flow-files で lib へ 型定義ファイルの書き出し
- files で publish 対象を lib に限定
- prepublish で npm publish 前に実行するコマンドとしてフック
mrubyでEchoServerをつくってみる


https://docs.ruby-lang.org/ja/latest/class/TCPServer.html のecho serverのサンプルをmrubyで動かしてみました。

# 経緯

ThreadなしでIOの並列処理やる方法について調べてたところ、selectやpollを使うということを知りました。
mrubyで試そうと思い、まず`mruby-socket`のTCPServerがCRubyのTCPServerと同じように使えるのか調べようとしたところ、Rubyリファレンスマニュアルにいきなりやりたいことそのままなサンプルコードが載ってたのでmrubyで動くか試してみました。

# mgemの設定

mgemでmruby-ioとmruby-socketを追加します。

```ruby
conf.gem :mgem => 'mruby-io'
conf.gem :mgem => 'mruby-socket'
```

# ソースコード

mruby-ioを追加してもCRubyのようにKernelにselectが追加されるわけではないので、`IO.select`で呼び出しています。
その他、好みで`puts`や`<<`を使っている以外はリファレンスマニュアルのコードそのままです。

```ruby
#
# echo_server.rb
# inspired from https://docs.ruby-lang.org/ja/latest/class/TCPServer.html
#
gs = TCPServer.open("127.0.0.1", 12345)
socks = [gs]
addr = gs.addr
addr.shift
puts "server is on #{addr.join(":")}"

loop do
  nsock = IO.select(socks)
  next if nsock == nil
  for s in nsock[0]
    if s == gs
      socks << s.accept
      puts "#{s} is accepted"
    else
      if s.eof?
        puts "#{s} is gone"
        socks.delete(s)
      else
        str = s.gets
        puts "#{s}: #{str}"
        s.write(str)
      end
    end
  end
end
```

# 使ってみる

```bash
./path/to/mruby echo_server.rb
```

で起動後、telnetからアクセスしてみます

```bash
$ telnet 127.0.0.1 12345
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
vn9arh9ahv9pfbhp0dzb dzb o
vn9arh9ahv9pfbhp0dzb dzb o
Hello, mruby!
Hello, mruby!
```

地味ですね。

# IO.selectが使えるクラスはどれ？

`IO`を継承しているクラスなら使えると思うんですが、`mruby-socket`のソースコード追えなかったのでmirbで確かめてみました（というかrubyなら先にそれ試すか普通・・・）

```bash
$ ./mruby/bin/mirb 
mirb - Embeddable Interactive Ruby Shell

> TCPServer
 => TCPServer
> TCPServer.class
 => Class
> TCPServer.superclass
 => TCPSocket
> TCPSocket.superclass
 => IPSocket
> IPSocket.superclass
 => BasicSocket
> BasicSocket.superclass
 => IO
```

`TCPServer`ばっちり`IO`のサブクラスのようです。


# その他参考にしたページ

- [8-18 poll()を利用したデータ受信プログラム:Geekなぺーじ](http://www.geekpage.jp/programming/linux-network/book/08/8-18.php)
  - 最初これを写経しました
- [I/Oを多重化するためのシステムコール(select, poll, epoll, kqueue) - $shibayu36->blog;](http://blog.shibayu36.org/entry/20120101/1325418188)
  - select()とpoll()の違いについてなど
My Alexa の知見2 implementing Alexa to Raspberry Pi zero 

#はじめに
この投稿は私がラズパイで自作Alexaを開発した知見を投稿するシリーズです。
こんかいは、ラズパイゼロにインプリメントしたときのポイントです。
＊ ほとんどラズパイの内容です。

#[ラズパイゼロ]([https://www.raspberrypi.org/products/pi-zero/])
![IMG_2879.jpg](https://qiita-image-store.s3.amazonaws.com/0/49986/f8bf84f1-debb-4f08-3afc-6d57b9835f79.jpeg)

サンプル動画は[こちら](https://www.youtube.com/watch?v=0J2hR6wBscw)

#前提
インプリメントするAlexaのクライアントには[AlexaPi](https://github.com/jaws-ug-kobe/AlexaPi/tree/dev)というpythonで書かれたクライアントを使います。

このクライアントは、
録音に[pyaudio](https://people.csail.mit.edu/hubert/pyaudio/),
再生に[mpg321](http://mpg321.sourceforge.net/)
を使います。
(クライアントのインストールは割愛します。）


#再生/録音デバイス
## 再生デバイス
**aplay -l**で確認。 
<img width="626" alt="スクリーンショット 2017-02-13 2.56.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/7a9592e6-615e-8ff5-7c99-41b0d79906b9.png">
USBスピーカーはデバイス０のカード２なので、alsaのpcm.Name は、**hw:2,0** 


<img width="579" alt="スクリーンショット 2017-02-13 2.56.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/49986/80086905-481e-217a-7677-93f0657e3d85.png">
USBマイクはデバイス０のカード１なので、alsaのpcm.Name は、**hw:１,0** 

~/.asoundrc にcaptureデバイスとplaybackデバイスの設定を記載する。

```json:~/.asoundrc
pcm.!default{
  type asym
  playback.pcm{
    type plug
    slave.pcm "hw:２,0"
  }
  capture.pcm{
    type plug
    slave.pcm "hw:１,0"
  }
}
```

[2017年１月１１日版（作成時点で最新）のRaspbian](https://www.raspberrypi.org/downloads/raspbian/)では、この設定だけでは動作しない場合がある。（ゼロでは動作しなかった）

結論は、**/lib/modprobe.d/alias.conf**を修正して、最初に見つかったUSBデバイスをデフォルトに設定すること。
（他によい方法があればおしえていただきたいところです）

```ruby:/lib/modprobe.d/alias.conf
# These are the standard aliases and dependencies.
# This file does not need to be modified.

# prevent unusual drivers from appearing as the first sound device ###########
options snd-pcsp index=-2
# options snd-usb-audio index=-2 <-- comment outする
options cx88_alsa index=-2
options snd-atiixp-modem index=-2
options snd-intel8x0m index=-2
options snd-via82xx-modem index=-2

# work around other kernel issues ############################################
# The EHCI driver should be loaded before the ones for low speed controllers
# or some devices may be confused when they are disconnected and reconnected.
softdep uhci-hcd pre: ehci-hcd
softdep ohci-hcd pre: ehci-hcd
```


# 電力不足
スピーカーは5V/500mAのELECOMスピーカーを購入。
最初に接続したバータイプのスピーカーは電力消費が大きく、動作不安定になる。

#補足
Alexa からの応答はmp3として保存して再生します。再生するライブラリにはこれまで、[mpg123](https://www.mpg123.de/)を利用してきましたが、再生の最後にノイズが走るので、mpg321に切り替えました。

USBスピーカーをデフォルトにする方法は、ググるとたくさんでてきますが、どれも古いので要注意です。
Ubuntu 16.04 LTS に Docker インストール中

Google先生でいろいろ探していたんですが、これぞというものが見つからず、結局一次情報にたどり着く。

Get Docker for Ubuntu
https://docs.docker.com/engine/installation/linux/ubuntu/#/install-using-the-repository

あとここを補助的に
Docs » Docker Engine » インストール » Ubuntu
http://docs.docker.jp/engine/installation/linux/ubuntulinux.html

/etc/apt/sources.listの編集に少しだけ手間取りますが、それ以外特に迷うこともなく割とあっさりhello-worldにたどり着くことができました。
vagrantのg++をデフォルトでC++11に対応させる

http://www.task-notes.com/entry/20151114/1447492231
こちらのページを参考に入れたのですが
```
$ echo 'source /opt/rh/devtoolset-3/enable' >> /etc/profile.d/devtools
```
権限がありません
```
$ sudo -i
$ echo 'source /opt/rh/devtoolset-3/enable' >> /etc/profile.d/devtools
```
としてもvagrantにログインするたびにg++のバージョンが戻ってしまいました。
色々調べたら以下で解消できましたのでメモです。

sshログインします
```
$ vagrant ssh
```
g++(私の場合デフォ4.4)がどこにあるか確認してみます
```
$　which g++
```
私の場合
/usr/bin/g++
でした。

参考
http://qiita.com/phanect/items/45c67fa55d624e45367b

一旦rootユーザーになってみて、g++(4.9)がどこにあるか確認してみます
```
$ sudo -i
$ which g++
```
私の場合
/opt/rh/devtoolset-3/root/usr/bin/g++
でした。

そこでデフォルトで
/opt/rh/devtoolset-3/root/usr/bin/g++
を使うようにします。
それにはホームディレクトリ直下にある.bash_profileにPATH情報を記載します。

rootから抜けます
```
$ exit
```
.bash_profileは隠しファイルなのでそれも含んだディレクトリ構成を見ます。
```
$ ls -a
```
私の場合
.              .bash_profile                       .pki
..             .bash_profile.2016-05-26@08:16:14~  .rbenv
.ansible       .bash_profiles                      .ssh
.bash_history  .bashrc                             .vbox_version
.bash_logout   .mysql_history                      centos65
でした。

root権限で書き加えます
```
$ sudo vi .bash_profile
```
PATH=/opt/rh/devtoolset-3/root/usr/bin:$PATH
export PATH

これで4.9の方が優先して読み込まれます。

[参考]
http://pocketstudio.jp/linux/?%A5%D1%A5%B9(PATH)%A4%CE%B3%CE%C7%A7%A4%C8%C0%DF%C4%EA%CA%FD%CB%A1%A4%CF%A1%A9
http://archive.blog.hekt.org/archives/4827/
Flowtype で型だけを提供する内部パッケージを定義する

## 動機

型だけ export したファイル `types/types.js` にアクセスしようとすると、

```
import type { Point } from '../../../../../types/types'
```

みたいになってきて、だるくなる

これを

```
import type { Point } from '@internal/types'
```

にする

## 内部パッケージ化

Flowの初期化は省略

monorepo風に `packages/@internal/types` みたいな配置で、 index.js.flow を持つディレクトリを追加

```
$ tree packages/@internal/types
packages/@internal/types/
├── index.js.flow
└── package.json
```

```json:package.json
{
  "name": "@internal/types",
  "private": true,
  "main": "index.js"
}
```

```js:index.js.flow
/* @flow */
export type Point = {
  x: number,
  y: number
};

declare module.exports: void;
```


これを親から Link する

```
npm link packages/@internal/types
```

## 使う

`@internal/types` を使う。

```
$ tree packages/a

packages/a
├── index.js
└── package.json
```

```js:packages/a/index.js
/* @flow */
import type { Point } from '@internal/types'
const p: Point = { x: 1, y: "" } // => Error
```

ちゃんとFlowのErrorになる

```
$ flow
packages/a/index.js:3
  3: const p: Point = { x: 1, y: "" }
                      ^^^^^^^^^^^^^^^ object literal. This type is incompatible with
  3: const p: Point = { x: 1, y: "" }
              ^^^^^ object type
  Property `y` is incompatible:
      3: const p: Point = { x: 1, y: "" }
                                     ^^ string. This type is incompatible with
      4:   y: number
              ^^^^^^ number. See: packages/@internal/types/index.js.flow:4


Found 1 error

```

## 仕組み

flowはファイルの探索で、*.flow を見つけたときは、そちらの型定義を優先する。https://flowtype.org/docs/declarations.html#declaration-files

`@internal/types` の探索で main で指定された index.js を見に行くが、優先的に index.js.flow を優先する。 `import type` は型定義を取り出すだけなので、ファイルの実体がなくても問題がない。この型は開発環境でだけ存在すればいいので、コンパイル時にも影響はない。

## 課題

プロジェクトの初期化で npm link をする必要がある。

`npm link <local-path>` はnode_modulesに対象へのエイリアスを作成するが、`npm install <local-path>` とした場合、ファイルのコピーが走り、ファイルを変更するたびに npm update し直す必要がある。

これは元々monorepoの実験中に考えた解法で、lerna bootstrap で link を貼ってくれる？らしいが、期待した動きではなかった。

https://github.com/lerna/lerna/issues/200

相互にパスを解決したいなら、お互いlinkするのが一番手っ取り早い気がするのだが、あんまり綺麗な気がしない。

参考 https://github.com/mizchi-sandbox/play-lerna
C++のちょっとしたアプリでさっと使いやすい簡易ロガーの実装例

# 概要

「あるある」と言われたトアルあるある話:

```
小さなサンプルアプリ作る
↓
でもまあロガーくらい入れて作りたい
↓
boost::log入れるのめんどくさいしちょっとしたやつ
↓
気づけばいつものロガーコードを書いている
```

こんな時に書いている簡易ロガーの実装例を紹介したい。

# 実装例

ちょっと実用上器用にするための呪文も入れても150行くらいなもの。本質的には100行くらい。

- https://github.com/usagi/usagi/blob/master/include/usagi/log/easy_logger.hxx

要点は後述として、とりあえず使い方↓。

## 使い方

```c++
//↓これを定義すると easy_logger は LOGI などで何も出力しなくなります。
//#define DISABLE_USAGI_LOG_EASY_LOGGER
#include <usagi/log/easy_logger.hxx>

#include <thread>
#include <random>

auto main() -> int
{
  // 単純な使い方
  LOGI << "test1";
  
  // 複数の operator<< で繋いでも綺麗に出力されます。
  LOGD << "test2 multiple output operators in the one line " << 12345 << ' ' << 1.2345f;
  
  // マルチスレッドで競争的にログ出力しても分断されずに綺麗に出力されます。
  std::random_device r;
  auto a = std::thread( [&]{ for ( auto n = 0; n < 16; ++n ) LOGW << "／(^o^)＼ " << r() << ' ' << r()<< ' ' << r() << ' ' << ' ' << r(); } );
  std::thread( [&]{ for ( auto n = 0; n < 16; ++n ) LOGE << "＼(^o^)／ " << r() << ' ' << r()<< ' ' << r() << ' ' << ' ' << r(); } ).join();
  a.join();
}
```

### 実行結果

[ANSI escape code](https://en.wikipedia.org/wiki/ANSI_escape_code)に対応したモダンな端末だとカラフルに表示されます。

![image](https://qiita-image-store.s3.amazonaws.com/0/33891/36a94c1b-d6da-201c-c68b-dfbac486f1c2.png)

未対応端末だと余計な呪文がちらっと表示されるかもしれませんが、実用上はどうってことはないでしょう(´・ω・｀)

## 実装の要点

- `log( "hoge", 123, ... );` だとなんとなくダサい気がする（ variadic template を使えば簡単に実装できるし、安全で無駄なオブジェクトも不要なのは良いけれど...）
    - `cout` へ出力するように `operator<<` で見た目キレイにログを出力したい。
        - `operator<<` を受けてログを出力できるオブジェクトが必要（≃`operator<<`を持つ`class`が必要）
- デバッグ等の助けになる情報を自動的に付加したい
    - `__FILE__` `__LINE__` `__PRETTY_FUNCTION__` （←処理系によって使用できない事もあるので必要に応じて注意）
    - 付加情報をログの前の方に付けると邪魔で読み難くなる → 後ろに付ける
    - `operator<<` の結合性 → 直接 `cout` 等へログを整形しながら流さずに一旦ログオブジェクト内のバッファーへ溜め込んでから、 dtor で付加情報も付けて `cout` 等へ流す必要がある
- 実行時間もログに出力したい
    - `std::chrono::steady_clock` は処理系によって分解能が不十分
        - `boost::timer::cpu_timer` や `boost::chrono::steady_clock` を使う → 外部ライブラリーのリンクが必要になって「さっと使える」度がダウン(´・ω・｀)
        - `std::steady_clock` or `QueryPerformanceCounter` ( Windows ) を使い分ければ実用上わりと困らなくなる → [usagi::chrono::default_clock](https://github.com/usagi/usagi/tree/master/include/usagi/chrono) （こんなこともあろうかと）
- info, warn, error, debug くらいはログの種類分けが欲しい、ついでに種類ごとに色も変えてわかりやすく出したい。
- 一応ログ無効化手段は欲しい → 無効化をマクロ定義されていれば `operator<<` はあるけれど何もしないログオブジェクトに `<<` が接続されるようにする
- 「さっと」使えて「便利」で「見た目かっこいい」のが目的なので、器用な出力切り替えだとか、実行速度上のデメリットだとか、こまかいことは気にしない。とりあえずざっくり動いてさっくり使えればOK。

### 初稿後に追加した変更

- マルチスレッドで使っても崩れずキレイに出力される。
Go言語を使ってみた

# 自分用Golang勉強メモ

## ゴール
とりあえず、インストールから`Hello World`を出してみる

## 環境
- OS: Windows 10 Home (64bit)
- エディタ: 適当なテキストエディタ

## インストールしてみる
- [公式WEB](https://golang.org/#)に"Download Go"のリンクがあるので、クリックする。
- 自分のマシンに合わせたバージョンをダウンロードする。（go1.7.5のインストーラ版にした）
- 適当にインストールを進める。（インストーラ版だと、デフォルトでC:\直下に入る）

## Goのバージョンを確認してみる
ターミナルで以下を打ってみる。  

```
> go version  
go version go1.7.5 windows/amd64
```

インストーラを使えば、自動的にインストールフォルダにpathが通るハズ。  
もし通ってなかったら自分で設定する。

GOROOT: "C:\Go\"

## 「Hello World」を出力してみる
お約束。  
以下のソースを用意する。

```go:Hello_World.go
package main

import "fmt"

func main() {
    fmt.Println("hello, world")
}
```

ビルドする。  
とりあえずターミナル上げて、ソースのあるディレクトリまで移動。

    > go build Hello_World.go

うん。エラーが出た。  
GOHOMEのパスが通ってないよ。とのこと。  
とりあえずソースのあるディレクトリにGOHOMEのパスを通して再度実行。

今度はOKみたい。  
ソースディレクトリを見てみると、`Hello_World.exe`の実行ファイルが出来ている。  
では早速実行してみる。

```
> Hello_World
hello, world
```

ちなみに以下のコマンドで実行すると、実行ファイルを作成せずに実行出来るらしい。

```
> go run Hello_World.go
hello, world
```

## もうちょっと何かやってみる
せっかくなのでもう少し触ってみよう。  
なんか凄く流行ってたので、便乗してみる。  
Goのフレンズは既にいるけど、、、  
元ネタ: [わーい、すごーい](http://qiita.com/t_ishida/items/bae7e62950d81f427f13)

```go:waisugoi.go
package main

import "fmt"

type Friends struct {
	skill string
}

func newFriends(skill string) *Friends {
	friends := new(Friends)
	friends.skill = skill
	return friends
}

func (f Friends) wai() string {
	return "わーい\n"
}

func (f Friends) sugoi() string {
	return "すごーい\n"
}

func (f Friends) tanoshii() string {
	return "たのしー\n"
}

func (f Friends) beFriend() string {
	return f.wai() + f.sugoi() + f.tanoshii() + "君は" + f.skill + "がとくいな、フレンズなんだね!!" + "\n"
}

func main() {
	var friends *Friends = newFriends("クソリプ")
	fmt.Println(friends.beFriend())
}
```

実行する。

```
> go run waisugoi.go
わーい
すごーい
たのしー
君はクソリプがとくいな、フレンズなんだね!!
```

## まとめ
動くところまではもっていけたが、構造体と関数の紐づけもよくわからないまま。  
とりあえず公式のドキュメント眺めながら、基本的な文法等を勉強する必要がありそう。  
せっかくIntelliJが入っているので、次はgolangプラグイン入れて使ってみる。
Swift GPUImage2で画像の平均色を抽出する

![Screen Shot 2017-02-13 at 2.31.51.png](https://qiita-image-store.s3.amazonaws.com/0/8920/fdda903d-7951-e551-a980-8107fbb9fb9a.png)

GPUImage2を使って写真から全体の平均色を抽出します。
GPUImage2はSwiftで書き直されたもので、Mac、iOS、そしてLinuxに対応しています。
他にも平均色の抽出方法はありますが、画像処理にGPUを利用するメリットは大きく、CPUを使う処理と比べて体感できるほど速度に違いが出ます。

# GPUImage2をプロジェクトへ導入

Cocoapodsには1はあっても2はないため、手動で導入します。

1. [BradLarson / GPUImage2](https://github.com/BradLarson/GPUImage2)をダウンロードします。
2. プロジェクト内に`GPUImage-iOS.xcodeproj`をドロップ＆ドラッグで放り込む、もしくは File > Add File to "ProjectName" で追加します。
3. プロジェクトのターゲットを選択し、`Build Phases > Target Dependencies` に `GPUImage`を追加します。
4. プロジェクトのターゲットを選択し、`General > Embedded Binaries` に `GPUImage.framework iOS`を追加します。

# 画像全体の色の平均を抽出

```swift
import UIKit
import GPUImage

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let extractor = AverageColorExtractor()
        extractor.extractedColorCallback = { [weak self] (color: Color) in
            let uiColor = UIColor(red: CGFloat(color.redComponent),
                                  green: CGFloat(color.greenComponent),
                                  blue: CGFloat(color.blueComponent),
                                  alpha: CGFloat(color.alphaComponent))
            self?.view.backgroundColor = uiColor
        }
        let image = UIImage(named: "myImage.jpg")
        _ = image?.filterWithOperation(extractor)
        
    }

}

```