OmniAICreator/Qiita-1.07M huggingface dataset:
Raccでプチ言語自作した

# 注意
実用性は皆無で勉強用です。私メモ用の記事になります。

# 経緯
mruby等をみてて、言語を作るのってどうしてるんだろうってのに興味を持ったので、さわりだけ理解してみたいと想い、字句解析器、構文解析器を作ってみようと思い立ちました。mrubyはbisonを使っていますが、c言語ベースなので私には敷居が高いツールでした。raccはrubyベースのyaccのようなものですので、まだ敷居が低いかなと。

# 参考資料
[mruby (on github)](http://github.com/mruby/mruby): 言わずと知れたrubyの組み込み言語。mrbgemsとしてmruby-compilarというのがあり、その中に*.yファイルがあります。
[streem (on github)](http://github.com/matz/streem): matzが開発している新しい思想のプログラミング言語。*.yファイルが比較的小さいので、基礎的な構文の理解の助けにもなるのではと思って参考にしました。
[Raccの使い方](http://i.loveruby.net/ja/projects/racc/doc/usage.html)
[Ruby: Racc](http://qiita.com/lnznt/items/ecbc16cae8ab9c641391)

# プチ言語仕様

commandという名前の関数を指定できる。指定した引数を表示するのみ。

- 引数内で指定される数値は整数として生成される。
- 文字列はダブルクオテーションをつけるつけない関係なく文字列として処理される。
- 括弧をつけると、バイナリ文字列として生成される。
- コメントは一行コメントのみ。#を先頭につけることでそれ以降行の終端までコメントとなる。

```command.txt
# aaa
command(1,any_val1,3,4,5,
  "aa bb cc",
  (ee ff),
  1
)

# bbb
command(2,any_val2,1,1,1,1,
  "aa bb cc dd",
  (ee ff),
  1
)
```

## 出力

```
command {
  1
  "any_comment1"
  3
  4
  5
  "aa bb cc dd"
  "\xEE\xFF"
  1
}
command {
  1
  "any_comment2"
  1
  1
  1
  1
  "aa bb cc dd"
  "\xEE\xFF"
  1
}
```

# *.y

`command.rb` に command関数の定義を記述してあり、*.yファイル内のstmt で command.rb をロードして、command関数に引数を渡しているだけです。

```rb:lex.rb.y
class MyLexParser
rule
    all_stmt : stmt stmt
             | stmt
    stmt    : cmd left args right
    {
      load("#{val[0]}.rb")
      self.send(val[0].to_sym, val[2])
    }
    cmd     : IDENT
    number  : DEC            { result = val[0].to_i }
    left    : '('
    right   : ')'
    ids     : ids IDENT      { result = val[0]+val[1] }
            | IDENT
    args    : args ',' args  { result = [val[0], val[2]].flatten }
            | left ids right { result = [val[1]].pack("H*") }
            | number         { result = [val[0]] }
            | STRING         { result = [val[0]] }
            | IDENT          { result = [val[0]] }
  end

---- header
require 'pp'
require 'strscan'

---- inner
def parse(str)
  s = StringScanner.new(str)
  @q = []

  until s.eos?
    s.scan(/#[^\n]*\n/) ? nil  :
    s.scan(/\d+/)       ? @q << [:DEC, s.matched]   :
    s.scan(/\s+/)       ? nil  :
    s.scan(/,/)         ? @q << [',', s.matched]    :
    s.scan(/\"([^\\\"]|\\.)*\"/) ? @q << [:STRING, s.matched[1..-2]]    :
    s.scan(/[a-zA-Z0-9\-\_]+/) ? @q << [:IDENT, s.matched] :
    s.scan(/\(/)        ? @q << ['(', s.matched]    :
    s.scan(/\)/)        ? @q << [')', s.matched]    :
                          (raise "scanner error")
  end

  do_parse
end

def next_token
  @q.shift
end

---- footer
if __FILE__ == $0
  parser = MyLexParser.new

  begin
    parser.parse(File.read("command.txt"))
  rescue Racc::ParseError => e
    $stderr.puts e
  end
end
```

```rb:command.rb
def command(vals)
  puts "command {"
  vals.each do |line|
    if line.class == String
      puts "  " + line.inspect
    else
      puts "  #{line}"
    end
  end
  puts "}"
end
```

# 実行

```bash
$ racc -g -o out.rb lex.rb.y
$ ruby out.rb
```
Snort使ってみた

# 概要
自宅のCentOSのセキュリティ対策として、
Snortを使ってみた。

# インストール＆起動
## インストール

```
wget https://www.snort.org/downloads/snort/daq-2.0.6-1.centos7.x86_64.rpm 
wget https://www.snort.org/downloads/snort/snort-2.9.8.0-1.centos7.x86_64.rpm

yum install daq-2.0.6-1.centos7.x86_64.rpm
yum install snort-2.9.8.0-1.centos7.x86_64.rpm
```

## ルールの取得

公式ページでユーザ登録をして、
ルールファイルを取得する。
取得したルールファイルを展開する。

```
tar zxf snortrules-snapshot-CURRENT.tar.gz -C /etc/snort
```

## 設定ファイルの編集

①内部ネットワークの指定
ipvar HOME_NET any
　↓
ipvar HOME_NET <内部ネットワークアドレスを指定(例：192.168.1.0/24)>

②内部ネットワークを不正アクセスとして扱わないように設定
ipvar EXTERNAL_NET any
　↓
ipvar EXTERNAL_NET !$HOME_NET

③各種パスの設定
hoge_PATHを適宜設定

④white_listとblack_listのファイルを作成
WHITE_LIST_PATHとBLACK_LIST_PATH配下に、
white_list.rulesとblack_list.rulesを作成する。
（今回は空のファイルを作成した。）

## 起動

```
systemctl start snortd
```

# 動作確認

## pingで動作確認

/etc/snort/rules/local.rulesに以下を追記。

```
alert icmp $HOME_NET any -> $HOME_NET any (msg:"ICMP traffic";sid:777;)
```

snortを再起動

```
systemctl restart snortd
```

他サーバから以下を実行

```
ping <snortをインストールしたサーバのIPアドレス>
```

以下にログが出力されていること。
/var/log/snort/alert
Webを使った新人研修　～Linuxコマンド編 - mkdir・rmdirコマンド～

######[Webを使った新人研修　～Linuxコマンド編～](http://qiita.com/fujisystem/items/63b787ac71e9bdcaf3f6)

#mkdirコマンド 「ディレクトリの作成」
Linuxにおける「ディレクトリ」≒Windowsにおける「フォルダ」
と考えてよいと思います。
（実際、WindowsのDosプロンプトでmkdirするとフォルダが作成できます）

まずは、「実践」してみましょう。

##実践する
LinuxマシンのエミュレートされているWebページを開きましょう。
・jor1k
http://s-macke.github.io/jor1k

早速「ディレクトリの作成」してみましょう。
左側の黒いウィンドウで「mkdir test」と入力します。次に確認用として「ls -l」と入力します。
各行の最後にエンターキーを押して下さい。

```
mkdir test
ls -l
```

![mkdir.png](https://qiita-image-store.s3.amazonaws.com/0/110729/5a843e20-68e9-bbf6-2d80-ca5d86efcbb5.png)

上記のようにmkdirコマンド実行後に、青い文字でtestが表示されるはずです。
無事ディレクトリが作成されました。

##解説
「今、windowsでいうところのフォルダを作成しました。」の説明で事足りるとは思いますが
mkdirコマンドの実行前後での指差し確認などの慎重さを教えたいところです。

Man page of MKDIR
https://linuxjm.osdn.jp/html/GNU_fileutils/man1/mkdir.1.html


#rmdirコマンド 「ディレクトリの削除」
今度は、削除です。

##実践する
左側の黒いウィンドウで「rmdir test」と入力します。次に確認用として「ls -l」と入力します。
各行の最後にエンターキーを押して下さい。

```
rmdir test
ls -l
```

![rmdir.png](https://qiita-image-store.s3.amazonaws.com/0/110729/87004c94-6bbe-6bbe-a7b2-f77dcc106e8d.png)


##解説
先ほど作成した「test」ディレクトリが削除されていることを確認します。先ほどと同様に、指差し確認を行います。
```rmdir```コマンドは、ディレクトリの中身が空でないと
Directory not empty
とエラー表示され、処理失敗します。


Man page of RMDIR
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/rmdir.2.html

余談ですが、似たようなコマンドに```rm```コマンドの-rオプションがありますが、
新人に最初に教えないほうが良いと思います。
rmdirコマンドよりリスクが高いと思われますので。

例題を示して記憶の定着を図ってみます。

##例題
１．mkdirコマンドでtestディレクトリを作成
２．作成した「test」ディレクトリに「testFile」ファイルを作成する。
３．「test」の親階層からrmdirコマンドを実行し、エラー表示させる。
４．「test」ディレクトリで、testFileファイルを削除
５．「test」ディレクトリを削除

```
ls -l
mkdir test
echo 'hoge' > test/testFile
rmdir test
rm test/testFile
rmdir test
ls -lR
```

![mkdir_rmdir.png](https://qiita-image-store.s3.amazonaws.com/0/110729/6933eb99-de78-076b-50bb-ab0197ee0913.png)

上記のように、testディレクトリに直接入らずにtestFileを作成しています。
```ls -lR```で子ディレクトリ・ファイルを階層ごとに表示することができます。
ファイル・ディレクトリを自由に作成させて、```ls -lR```を試すよう指示すると
理解が深まると思います。

～本日はここまで
Web Audio APIを利用してオーディオビジュアライザを作成する ~getByteFrequencyDataで取得する配列のどの要素がどの周波数(Hz)の波形データを格納しているか確認する~

# 特定の範囲の周波数の波形データを描画する
![freq.jpg](https://qiita-image-store.s3.amazonaws.com/0/69667/a98abd59-5e00-a926-59b1-45b176d0302a.jpeg)

[デモ](http://hira777.github.io/qiita/web-audio/demo3/index.html)**(ページを開くと音が流れるので音量注意)**

デモのサンプルコードは以下にあります
[soarflat-prototype/web-audio/docs/demo3/](https://github.com/soarflat-prototype/web-audio/tree/master/docs/demo3)

上のビジュアライザーは**0Hz~約20000Hz**、下のビジュアライザーは**0Hz~約2000Hz**の範囲の
波形データを描画しているものです。(下のビジュアライザーは少し描画を調整しています。)
このような描画をしたい場合、getByteFrequencyDataで取得する配列のどの要素がどの周波数(Hz)の
波形データを格納しているか知る必要があります。

# getByteFrequencyDataで取得する配列のどの要素がどの周波数(Hz)の波形データを格納しているか確認する
デモのようなWeb Audioでオーディオビジュアライザーを制作する際に、
以下のように`getByteFrequencyData`で周波数領域の波形データ(スペクトル)を取得すると思います。

```js:
var audioCtx = new AudioContext();
var analyser = audioCtx.createAnalyser();
var bufferLength;
var frequency;
var value;

analyser.fftSize = 2048;                    // デフォルト2048
bufferLength = analyser.frequencyBinCount;  // analyser.fftSizeの半分のため、1024
frequency = new Uint8Array(bufferLength);

analyser.getByteFrequencyData(frequency);

for(var i = 0; i < bufferLength; i++) {
  value = frequency[i]; // 波形データ 0 ~ 255が格納されている。
}
```

今回`analyser.fftSize`はデフォルトの2048のため、
`frequency`配列には周波数毎の要素が1024個格納されています。
どの要素がどの周波数(Hz)の波形データを格納しているかは、以下の計算で確認することができます。

~~**配列のインデックス * AudioContextのサンプルレート(48000固定) / AnalyserNodeのfftSize**~~
**配列のインデックス * AudioContextのサンプルレート(44100固定) / AnalyserNodeのfftSize**

この計算で、上記の例の`frequency[i]`にどの周波数(Hz)の波形データが格納されているかわかります。
`AnalyserNode`の`fftSize`は2048であり、`frequency`配列の要素は1024個のため、
0Hz~22028Hzの波形データが格納されています。

```js:
for(var i = 0; i < bufferLength; i++) {
  value = frequency[i]; // (i * 44100 / 2048)Hzの波形データ 0 ~ 255が格納されている。
}

// 0 * 44100 / 2048 = 0.0 Hz
// 1 * 44100 / 2048 = 21.53 Hz
// 2 * 44100 / 2048 = 43.06 Hz
// 3 * 44100 / 2048 = 64.59 Hz
// ...
// ...
// 1023 * 44100 / 2048 = 22028 Hz
```

今回の例では22028Hzまでの波形データが取得できますが、人間の可聴音域は20000Hzと言われており、
実際の音楽でも20000Hz付近の波形データが0のことが多いため、この範囲まで取得する必要は必ずしもないと思います。
(高い周波数が出る曲もあるため、高い周波数の範囲だけ取得してうまく描画に利用するのも良いと思います。)
0Hz~2000Hzのように範囲を狭めた波形データを取得し、それらを細かく調整して描画した方が
動きに抑揚があってビジュアライザーっぽくなると思いました。

# 参考
- [What does the FFT data in the Web Audio API correspond to?](http://stackoverflow.com/questions/14789283/what-does-the-fft-data-in-the-web-audio-api-correspond-to)
Java SSHでコマンド実行(known_hosts不要)

## はじめに
事前に以下のライブラリを用意します。

- JSch
    - http://www.jcraft.com/jsch/
    - ※"jsch-0.1.54.jar"のリンクからダウンロード

## 実装例
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:SSHTest.java
import com.jcraft.jsch.ChannelExec;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 *
 * @author tool-taro.com
 */
public class SSHTest {

	public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {

		//サーバ
		String host = "ホスト名";
		//ポート
		int port = 22;
		//ユーザ
		String user = "ユーザ";
		//パスワード
		String password = "パスワード";
		//コマンド
		String command = "date";

		JSch jsch;
		Session session = null;
		ChannelExec channel = null;
		BufferedInputStream bin = null;

		try {
			//接続
			jsch = new JSch();
			session = jsch.getSession(user, host, port);
			//known_hostsのチェックをスキップ
			session.setConfig("StrictHostKeyChecking", "no");
			session.setPassword(password);
			session.connect();

			channel = (ChannelExec) session.openChannel("exec");
			channel.setCommand(command);
			channel.connect();

			//コマンド実行
			bin = new BufferedInputStream(channel.getInputStream());
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int length;
			while (true) {
				length = bin.read(buf);
				if (length == -1) {
					break;
				}
				bout.write(buf, 0, length);
			}
			//標準出力
			System.out.format("実行結果=%1$s", new String(bout.toByteArray(), StandardCharsets.UTF_8));
		}
		finally {
			if (bin != null) {
				try {
					bin.close();
				}
				catch (IOException e) {
				}
			}
			if (channel != null) {
				try {
					channel.disconnect();
				}
				catch (Exception e) {
				}
			}
			if (session != null) {
				try {
					session.disconnect();
				}
				catch (Exception e) {
				}
			}
		}
	}
}
```
## 動作確認

```
$ javac SSHTest.java
$ java SSHTest
$ 実行結果=Mon Feb  8 01:26:47 JST 2016
```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
Xcode Playgroundで出た実行エラーの解消

# はじめに

Playgroundを使おうとしたところ以下のエラーが出ました。このままではPlaygroundでコードを入力しても何も実行されず、エラーのダイアログだけが表示されてしまう状態です。

### 環境
Xcode 7.2.1

### エラー内容

> Error running playground.
> Unable to find execution service for selected run destination.

![スクリーンショット 2016-02-08 0.58.51.png](https://qiita-image-store.s3.amazonaws.com/0/11090/8d2518a4-702c-fd7f-27b9-802b331d5933.png)

# 原因

Playgroundの実行で使用するSimulatorがXcodeに設定されていないため、Playgroundが実行できないというエラーのようです。

以前、beta版などをインストールしたところSimulatorの表示がおかしくなったため、一度全て削除した後で以下のように手動で追加した状態でした。

Simulatorの設定内容はXcodeのメニューバー→Window→Devicesから表示します。

![スクリーンショット 2016-02-08 1.06.37.png](https://qiita-image-store.s3.amazonaws.com/0/11090/7f0059f8-7f5b-07eb-aaad-b3cb51c43c12.png)

# 対処方法

検索したところ、以下のサイトでiPad ProのSimulatorを追加するとありましたので試してみました。
[Playground gives an error: “Unable to find execution service for selected run destination”](http://stackoverflow.com/questions/33311116/playground-gives-an-error-unable-to-find-execution-service-for-selected-run-de)

この記事を参考にPlaygroundで使用されるSimulatorを手動で追加します。

### 1. デバイスの追加

以下のようにデバイスを設定します。

![スクリーンショット 2016-02-08 1.07.17.png](https://qiita-image-store.s3.amazonaws.com/0/11090/2b165a0d-5c38-c3e5-4b50-df50fa3e5b82.png)

### 2. 追加後

以下のようになります。

![スクリーンショット 2016-02-08 1.08.30.png](https://qiita-image-store.s3.amazonaws.com/0/11090/90456b63-7a2e-0ced-19e5-19eeffb3d3a5.png)

### 3. Xcode再起動

最後にXcodeを再起動してPlaygroundを開いて動作を確認します。先ほどまでエラーが出ていましたが、無事動くようになりました。
標準出力に表示をしながらファイルにも保存して、かつローテーションもする

Linux/Macなどのターミナル上での作業を想定しています。

「出力を表示しつつもファイルに書き出す」操作は、teeへパイプを結ぶことで実現できます。得られた出力を目視しつつ、ログファイルとして保存する時などに重宝します。

```bash
$ echo "hoge" | tee hoge.log
hoge
$ cat hoge.log # => hoge
```

## 書き出すファイルをローテートさせる
teeはとてもシンプルで便利なコマンドなのですが、要求が複雑になると対応が難しくなります。

- 上の例でいう`hoge.log`が巨大になってしまう
- いつ頃に出力されたのか日付入りのファイルに出力させたい

こんな時には、teeでは力不足になってしまいます。

そこで、ログローテートをしてくれるコマンドにパイプするようにします。例えば、[rotatelogs](https://httpd.apache.org/docs/2.4/programs/rotatelogs.html)や[cronolog](http://linux.die.net/man/1/cronolog)があります。

ここではrotatelogs[^rotatelogs]を使ってみました。`-n`オプション[^old-rotatelogs]と出力先ファイル、1つあたりのファイルサイズを指定すると、ファイルにsuffixを付けた上でローテートしてくれます。

[^rotatelogs]: だいぶ歴史があるらしいログローテート用のコマンドだけあって、多機能で便利です。ただ軽く実験した限り、ファイルサイズ上限が小さすぎるとローリングが間に合わない（？）こともあるようなので、厳密なファイル分割には向かないのかも？

[^old-rotatelogs]: ちなみに`-n`は比較的新しいバージョンでしか利用できません（2.4.5かららしいです）。

```bash
# 3194880 = 3M (3 * 1024 * 1024)
$ yes hoge | head -c 3194880 | rotatelogs -n 3 /tmp/hoge.log 1M
$ wc -c /tmp/hoge*
 1064960 /tmp/hoge.log
 1064960 /tmp/hoge.log.1
 1064960 /tmp/hoge.log.2
 3194880 total
```

## 表示もさせたい
ファイル出力についてはいい感じになったのですが、rotatelogsは標準入力を吸い取ってしまうので、そのまま使うとteeのように表示と保存を両立させることができません。

解決法として単純なのは、rotatelogsには`-e`オプションがあるのでそれを使うことです。標準入力をそのまま標準出力に流してくれます。

```bash
$ echo "hoge" | rotatelogs -e -n 3 hoge.log 1M
hoge
```

別のアプローチとして、[process substitution](https://en.wikipedia.org/wiki/Process_substitution)を使う方法が考えられそうです。

```bash
$ echo "hoge" | tee >(rotatelogs -n 3 hoge.log 1M)
hoge
$ cat hoge.log
hoge
```

つまり、teeでターミナルに出力させつつ、ファイルの書き出し先を名前付きパイプにした上で、そちらにrotatelogsの標準入力をつなぎます。前述のcronologには`-e`のようなオプションがなさそうですし、こちらのほうがより汎用性が高そうに見えます。

## まとめ
- 標準出力を保存するときはteeが使える
- 保存先にローテートなどの工夫をしたい時はrotatelogsなどを導入するとよさそう
- process substitutionは色々と応用が利きそう
Java SFTPでアップロード・ダウンロード(known_hosts不要)

## はじめに
事前に以下のライブラリを用意します。

- JSch
    - http://www.jcraft.com/jsch/
    - ※"jsch-0.1.54.jar"のリンクからダウンロード

アップロードする以下のファイルを使います。

```txt:put.txt(UTF-8)
テストファイルです

```
## 実装例
今回は、アップロードしたファイルをダウンロードして内容確認することとします。
サンプルでは、動作確認しやすいようにmainメソッドで実行できるようにしてあります。

```java:SFTPTest.java
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

/**
 *
 * @author tool-taro.com
 */
public class SFTPTest {

	public static void main(String[] args) throws JSchException, SftpException, FileNotFoundException, IOException {

		//サーバ
		String host = "ホスト名";
		//ポート
		int port = 22;
		//ユーザ
		String user = "ユーザ";
		//パスワード
		String password = "パスワード";
		//ディレクトリ
		String dir = "/ディレクトリ";
		//アップロード・ダウンロードするファイル名
		String fileName = "put.txt";

		JSch jsch;
		Session session = null;
		ChannelSftp channel = null;
		FileInputStream fin = null;
		BufferedInputStream bin = null;

		try {
			//接続
			jsch = new JSch();
			session = jsch.getSession(user, host, port);
			//known_hostsのチェックをスキップ
			session.setConfig("StrictHostKeyChecking", "no");
			session.setPassword(password);
			session.connect();

			channel = (ChannelSftp) session.openChannel("sftp");
			channel.connect();
			//ディレクトリ移動
			channel.cd(dir);

			//アップロード
			fin = new FileInputStream(fileName);
			channel.put(fin, fileName);

			//ダウンロード
			bin = new BufferedInputStream(channel.get(fileName));
			ByteArrayOutputStream bout = new ByteArrayOutputStream();
			byte[] buf = new byte[1024];
			int length;
			while (true) {
				length = bin.read(buf);
				if (length == -1) {
					break;
				}
				bout.write(buf, 0, length);
			}
			//標準出力
			System.out.format("ダウンロードしたファイル=%1$s", new String(bout.toByteArray(), StandardCharsets.UTF_8));
		}
		finally {
			if (fin != null) {
				try {
					fin.close();
				}
				catch (IOException e) {
				}
			}
			if (bin != null) {
				try {
					bin.close();
				}
				catch (IOException e) {
				}
			}
			if (channel != null) {
				try {
					channel.disconnect();
				}
				catch (Exception e) {
				}
			}
			if (session != null) {
				try {
					session.disconnect();
				}
				catch (Exception e) {
				}
			}
		}
	}
}
```
## 動作確認

```
$ javac SFTPTest.java
$ java SFTPTest
$ 取得したファイル=テストファイルです

```
## 環境
- 開発
	- Windows 10 Pro
	- JDK 1.8.0_112
	- NetBeans IDE 8.2

- 動作検証
	- CentOS Linux release 7.2
	- JDK 1.8.0_112

Webツールも公開しています。
[Web便利ツール@ツールタロウ](http://tool-taro.com/)
[Swift] Assertion failure in -[UITableView _endCellAnimationsWithContext:] 解決方法

#目的
セルをスワイプで削除した時に発生したエラー
Assertion failure in -[UITableView _endCellAnimationsWithContext:]を解決する.


#解決方法
今回、問題だったのは、tableView(tableView: UITableView, numberOfRowsInSection section: Int)の内部が原因だった。
セクションあたりのセルの個数を別の変数で管理していたため、セルをスワイプで削除した後、再描画される時に、セクションあたりのセルの個数が誤った数値を返していた。
解決方法は単純で、tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)の前にセクションあたりのセルの個数を決める変数の値を一つ下げてやれば上手くいく。
underscoreコードリーディング（mapObject）


underscoreに詳しくないので、勉強半分でソースコードを読む。



##利用するバージョン
[underscore.js(v1.8.3)](https://github.com/jashkenas/underscore/tree/1.8.3)


##mapObjectとは


###[underscorejs.orgのmapObject](http://underscorejs.org/#mapObject)

こんな説明。
>####_.mapObject(object, iteratee, [context]) 
>Like map, but for objects. 
>Transform the value of each property in turn.

```javascript
_.mapObject({start: 5, end: 12}, function(val, key) {
  return val + 5;
});
=> {start: 10, end: 17}
```
------------- 
mapに似ているけれど、objectのためのものです。
それぞれのプロパティの値を順々に変化させます。


###[underscore.compose](https://github.com/jashkenas/underscore/blob/1.8.3/underscore.js#L863)
コード的にはこのあたり。

```javascript
  // Returns the results of applying the iteratee to each element of the object
  // In contrast to _.map it returns an object
  _.mapObject = function(obj, iteratee, context) {
    iteratee = cb(iteratee, context);
    var keys =  _.keys(obj),
          length = keys.length,
          results = {},
          currentKey;
      for (var index = 0; index < length; index++) {
        currentKey = keys[index];
        results[currentKey] = iteratee(obj[currentKey], currentKey, obj);
      }
      return results;
  };

```

obj,iteratee,contextを引数に取る。
iterateeをcbに私、返り値をiterateeに上書きする。
keysにobjを_.keysに渡した返り値を、lengthにkeysの長さを格納し、resultsに空のオブジェクト、currentKeyを宣言する。

for文をindex=0からlengthまで回す。
currentKeyにkeysのindex番目を代入する。
resultsのcurrentKey番目にiterateeにobj[currentKey]とcurrentKey,objを渡した返り値を格納する。
for文の走査が終わったあとにresultsを返す。
みんなのPythonを読んで（書き途中）

とりあえずメモ的に殴り書き（あとでまとめます）

Chapter1

* Pythonでは、ブロックはインデントで定義される
* Pythonで扱うデータはすべてオブジェクト
* Pythonのスクリプトファイルは拡張子を「.py」にするのがよい＞windowsなら勝手に関連付けされるから
* ファイルの文字コードはUTF8にする。sjisじゃあ動かなかった…
* 「#」から始まる行はコメント
* Linux、MacOS Xでは最初の行に、「#!/usr/bin/env python3」
* おすすめされたIDE「PyScripter」「EclipseのPython用プラグイン(PyDev)」
* Pythonは、代入を行うことで新しい変数を作るので、Pythonは、変数の宣言が不要。
* Python3から変数名に日本語がつかえるようになった＞ただし特別な理由がない限り変数名は英数字がよい。
* 


```lang:Pythonの処理の考え方
>>> b = b + 1

```

まず、[b=」という部分を見て、新しい変数を定義しようとします。次に、新しい変数bのなかに何を入れればよいかを考えます。イコールの右側にはbという変数がありますが、この時点では変数は定義されていません。結果として「'b'という変数は未定義です」というエラーを出力するのです。
C++のビルド高速化方法まとめ

# C++ のビルド高速化方法まとめ

C++ のビルド高速化について調査したことがあったので、その結果を残しておきます。

## 諸注意

- 効果についてはプロジェクト依存すると思います。あくまで目安程度にご覧ください。
- 一部 MSBuild 以外のビルド環境で検証したものもあります。VisualStudio で効果がなかったらごめんなさい。

## 方法一覧

|種類|効果|方法|詳細|
|---|---|---|---|
|ビルド時間全体|◎|並列実行をする|Visual Studio で並列実行したり、IncrediBuild を使ったりすることで、コンパイルを並列に実行し、全体のビルドを短くする。|
|ビルド時間全体|◯|PC のディスクを高速にする|ビルド時の入力・出力があるディスクを SSD などにすることで、ファイル入出力に必要となる時間を短縮する。|
|ビルド時間全体|◯|一部のソースをライブラリにする|あまり編集しないモジュールをライブラリにして、常にビルドしないようにする|
|コンパイル時間|◯|大量の cpp を1つの cpp にまとめる|１つにまとめることで、ファイル入出力などや依存解決のプリプロセス時間を減らす。|
|コンパイル時間|△|ヘッダファイル検索順|使用頻度が高いヘッダファイルを早く読むようにシステムインクルードディレクトリなどの順番を変更することで高速化する。|
|コンパイル時間|◎|プリコンパイル済ヘッダを使う|プリコンパイル済ヘッダを使い、使用頻度の高いヘッダをあらかじめ処理することで、時間短縮を見込める。|
|コンパイル時間|△|最適化オプションを無効にする|最適化オプションを無効にすることでコンパイル時最適化処理を行わなくなる。|
|コンパイル時間|◯|ヘッダのリンクに気をつける|不要なヘッダをリンクしない。hに他のhを極力リンクしないことで、依存が減りコンパイルを短くできる。（ Pimpl イディオムなども有効）|
|コンパイル時間|△|pragma once を使う|インクルードガードしてもヘッダの入出力は発生してしまうが、pragma once では２回めファイルを開かなくなるため有効。|
|リンク時間|◯|動的ライブラリにする|静的ライブラリを動的にすることでリンク時間をなくす。|
|リンク時間|◎|インクリメンタルリンクを使う|MSBuild のインクリメンタルリンクを使うことで差分リンクができリンク時間の短縮が見込める|
Swiftのclosure省略記法

他の方々のソースを読んでいる時に、この書き方何？っていうのが特にClosureのあたりに多いので自分なりに一部まとめてみようと思いました。

***
### ちなみにClosureの基本形

```lang:closurewithbasic.swift
let closure = {(param1:String, param2:String)-> Bool in
                // 処理内容
                return param1 == param2
              }
```

# 省略記法
## 型推論による省略

```lang:sample.swift
// 変数宣言部にInt -> Int とあるので関数型が推論でき、この場合変数名だけの記述で良い。
let square : Int -> Int = {num in return num * num}

// さらに処理内容がreturnだけならreturnも省略できる
let square2 : Int -> Int = {num in num * num}

// なんなら引数のデフォルトで$0, $1も使えるようで"パラメータ in"も省略できる
let square3 : Int -> Int = {$0 * $0}

```

## 引数の末尾がClosureの場合の省略（というか書き方）

```lang:sample.swift
// これは普通の書き方
let total = calcSum(10, {(num:Int) -> Int in return num * 2})

// 関数のパラメータの末尾がClosureの場合は以下のように書くことができる
let total = calcSum(10) {(num:Int) -> Int in return num * 2}
```

## 関数のパラメータがClosure１つだけだった場合の省力

```lang:sample.swift
// これは普通の書き方
let twice = calcTwice({(num:Int) -> Int in return num * 2})

// 関数のパラメータがClosure１つだけだった場合はこのように関数の括弧を省略できる
let twice = calcTwice {(num:Int) -> Int in return num * 2}
```


# まとめ
こういう省略を覚えるとつい自分も使いまくりたくなりますが可読性を考えつつ使いたいものです。
しかしながら他の方のコードを読むときはこういうの知っておくと地味にリーディング速度が上がるのでよろしいかと思います。
ConoHa上のCoreOSからDBサーバー接続用ネットワークを使うには


ConoHaではVPSの他にPaaSのDBサーバーを借りることも出来ます。インスタンスとLANで接続するためにはネットワークの設定をしなければいけないのですが、だいぶ難儀して1ヶ月くらい悩んでいたので共有したいと思います。

[このべんの解説ページ](https://www.conoha.jp/conoben/archives/9103)や[CoreOS公式リファレンス](https://coreos.com/os/docs/latest/network-config-with-networkd.html)にも書いてあるのですっかり混乱してしまったのですが、どうやらゲートウェイ (`Gateway=***.***.***.***`) を指定する必要がないようでした。

指定した状態で`networkd`を再起動するとSSHのアクセスが一切出来なくなってしまうため、ひたすらイメージからインスタンスを再構築しながら確認してました。

```text:/etc/systemd/network/conoha-db-private.network
[Match]
MACAddress=[shared-172-***-***-0-23のMACアドレス]
# インターフェース名が特定できているのであれば、Name=eth1などでも特に問題ない

[Network]
Address=[shared-172-***-***-0-23のIPアドレス/サブネットマスク]

[Route]
Destination=[収容リージョンのネットワークアドレス]
# 東京リージョン (tyo1) の場合は172.21.74.0/23
```

ファイル名はこちらの独断で決めていて命名規則完全無視なので、適宜自由に読み替えて.networkファイルを作成してください。作成後は`sudo systemctl restart systemd-networkd`を実行して変更を適用します。

`ip addr`を実行すると指定したIFにIPアドレスが割り当てられていることが確認できるかと思います。`ping -c 3 private.***.tyo1.database-hosting.conoha.io`で疎通が確認できれば、コンテナからもDBサーバーにアクセスすることが出来るはずです。

この作業をするまでWANからDBにアクセスしていた人は要注意なのですが、LANからアクセスする場合にユーザーへ設定する接続許可ホストは、インスタンスに割り当てられているグローバルIPアドレスから、[shared-172-***-***-0-23のIPアドレス]へ変更になるので、忘れずに変更しましょう（現在はコンパネから変更できないのでユーザー作り直しになっちゃいますが）。
RubyでJavaのCountDownLatchを実装してみる

テストコードで別スレッドの作業の完了待ち的な処理を行いたく、Rubyの標準ライブラリでJavaのCountDownLatch的なクラスは無いものかと探してみたものの見つからなかったので、試しにJava同じようなインターフェースでシンプル実装してみました。(実用には耐えないと思います)

```rb
class CountDownLatch
  def initialize(count)
    raise ArgumentError, 'count < 0' if count < 0
    @count = count
    @lock = Monitor.new
    @condition = @lock.new_cond
  end

  def count_down
    @lock.synchronize do
      @count -= 1 if @count > 0
      @condition.broadcast if @count == 0
    end
  end

  def await
    @lock.synchronize do
      @condition.wait if @count > 0
    end
  end
end

count = 10
latch = CountDownLatch.new(count)
t1 = Thread.new do
  latch.await
  puts 'Finished.'
end

t2 = Thread.new do
  count.times do |i|
    puts "Count #{i}"
    latch.count_down
  end
end

t1.join
t2.join

```

### 出力結果
```
Count 0
Count 1
Count 2
Count 3
Count 4
Count 5
Count 6
Count 7
Count 8
Count 9
Finished.
```
gnuplotでx軸とy軸のスケールを一致させたいとき

gnuplotで、x軸方向とy軸方向のデータの単位が同じな時。

例えばxもyもmmで2次元上のプロットを見たいのに、gnuplotは親切にフィッティングしてくれちゃうので、縦に長いグラフとかは横に伸びてしまう。

ググると`set size ratio 1,1`とか`set size square`とかは出てくるけど、これはグラフの大きさをフィットしてくれるだけなので求めているものではない。

正しいやり方はこう。

```
set size ratio -1
```

参考: http://gnuplot.sourceforge.net/docs_4.2/node230.html
> The meaning of a negative value for r is different. If r=-1, gnuplot tries to set the scales so that the unit has the same length on both the x and y axes (suitable for geographical data, for instance). If r=-2, the unit on y has twice the length of the unit on x, and so on.
IntelliJ IDEA15でNode.jsを使うまで

YoutubeのNode.jsの動画を見ながら勉強してたんですが
動画では動いているjsが動かない！
というかrunマークが死んでる！
となったのでrunするまでのメモ。

まずIntelliJ IDEAはDefault状態だとNode.jsが入っていない！
のでpluginをインストールしなくてはいけません。

<ol>
<li>projectを開いていたら一旦閉じて「Welcome to IntelliJ IDEA」の画面に戻ります。</li>
<li>右下のConfigureをクリックしPluginsを選択</li>
<li>左下のInstall JetBrains Plugin...をクリック</li>
<li>検索バーに Node.js　を入力し検索</li>
<li>右の画面のInstallボタンをクリックしインストール</li>
<li>右下のcloseボタンをクリック</li>
<li>右下のokボタンをクリックすると「Platform and Plugin Updates」とアラートが
出て再起動するか確認されるのでRestartを選択</li>
<li>再起動後Projectを開き右上の三角のRunマークの左にあるアイコンから「Edit Configurations」を選択</li>
<li>立ち上がったウィンドウの左上の＋マークをクリックしNode.jsをクリック</li>
<li>右下のOKをクリック</li>
</ol>

以上で終了です。
これでRunマークをクリックすると無事jsが動きます。
SikuliからMongoDBにアクセスする（その２）－画像を保存

# SikuliからMongoDBにアクセスする（その２）－画像を保存

[SikuliからMongoDBにアクセスする（その１）](http://qiita.com/Helicobacter_pylori/items/6eb018bc4d970155ffb8)の続きとなります。

|ソフト等|バージョン|備考|
|:------|:--------|:---|
|Windows 10 Pro||64ビット|
|Java 8|update 71|
|sikuli|1.1.1|20151126.001204-18(Jython2.7.0)|
|Java MongoDB Driver|3.0.4||

## まずは、mongofilesで動作確認。

色々調べてみたのですが、いまいち登録のイメージが分からなかったので、mongofiles.exeを使って、登録してみます。
スクリーンショットくらいならGridFS使う必要無いかもしれませんが、今後のことを考えてGridFSを使ってみます。
ローカルに用意したファイル（C:\mongoDB\20160207-202331.png）を、mongofiles.exeを使って、imgデータベースに登録してみた結果が次の通り。

```text:
C:\mongoDB\bin>mongofiles /v /host:S2016TP4 /db:img put c:\mongoDB\20160207-202331.png
2016-02-07T20:51:23.409+0900    using write concern: w='1', j=false, fsync=false, wtimeout=0
2016-02-07T20:51:23.414+0900    connected to: S2016TP4
2016-02-07T20:51:23.414+0900    handling mongofiles 'put' command...
added file: c:\mongoDB\20160207-202331.png
```

Robomongoでimgデータベースを見ると、fs.chunksとfs.filesの２つのコレクションが出来ています。

![chunks.png](https://qiita-image-store.s3.amazonaws.com/0/111541/2cf6a48c-3f5a-20d9-3463-16a2447fedcc.png)

![files.png](https://qiita-image-store.s3.amazonaws.com/0/111541/fc41a9b9-520d-4d97-a137-3e36f0e68dc9.png)

## Sikuliで登録。

なんとなく登録のイメージが分かったところで、ネットを検索しまくりつつSikuliで組んでみたソースが次のもの。

```py
# -*- coding: UTF-8 -*-
import java.io.File
import datetime

# MopngoDB JDBCドライバ
load("C:\mongoDB\mongo-java-driver\mongo-java-driver-3.0.4.jar")
import com.mongodb.MongoClient;
import com.mongodb.gridfs;

# Client,DB,GridFSの接続
cli = com.mongodb.MongoClient( "s2016tp4" );
db = cli.getDB( "img" );
gridfs = com.mongodb.gridfs.GridFS(db);

# 画面キャプチャ
filename = java.io.File(capture(SCREEN));

# GridFSにファイルを設定
gfsinputfile = gridfs.createFile(filename);
gfsinputfile.setContentType("image/png");

# ファイル名は扱いやすいよう「日-時」にしておく
now = datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
gfsinputfile.setFilename("%s.png" % now);

# 登録する
gfsinputfile.save();
```

Sikuliは、capture(SCREEN)で画面イメージをテンポラリのpngファイルにしてファイル名を返してくれるので、それをMongoDBのGridFSを使ってimgデータベースに登録します。
実行した後のMongoDBの状況が次の通り。なんとなく登録できたっぽいです。

![chunks2.png](https://qiita-image-store.s3.amazonaws.com/0/111541/93737d35-6f95-c566-ee12-7aaae01eb82a.png)

![files2.png](https://qiita-image-store.s3.amazonaws.com/0/111541/768022ff-c9a9-e1c6-3c61-2cd3c5cb2ff8.png)

## mongofiles.exeで取り出してみる。

今日は時間切れなので、取り出しはmongofiles.exeでやってみます。

```text
C:\mongoDB\bin>mongofiles /v /host:s2016tp4 /db:img get 20160207-231053.png
2016-02-07T23:20:27.253+0900    using write concern: w='1', j=false, fsync=false, wtimeout=0
2016-02-07T23:20:27.261+0900    connected to: s2016tp4
2016-02-07T23:20:27.262+0900    handling mongofiles 'get' command...
finished writing to 20160207-231053.png
```

取り出せたようです。

![local.png](https://qiita-image-store.s3.amazonaws.com/0/111541/0e7de9a6-e983-5e6d-5331-25662f81c305.png)

以下が実際に取り出したファイルそのものになります。

![20160207-231053.png](https://qiita-image-store.s3.amazonaws.com/0/111541/7be29752-1ec7-daad-bba8-cede42e5bbd2.png)

なぜか、右と下に不要な黒枠がついてしまっていますが、原因究明はまた今度。。。
【AWS】DynamoDBにDataPipeline以外でのデータインポート


今までDynamoDBに対してデータを取り込む際、
データ件数が少なくてもDataPipelineを毎回使っていました。
ですが、DataPipelineも何度も使うとお金がかかってくるので
他に一括でデータを入れる方法がないか考えました。

## 事前準備
### AWS CLIのインストール
コマンドラインからAWSを操作するためのAWS CLIをインストールします。
今回はEC2から行うため、Amazon Linux上から行います。

動作環境としてPythonが必要なため、インストールします。

```bash:python_install
$ sudo yum install python-setuptools
$ sudo easy_install pip
```

インストールしたpipからawscliをインストールします。

```bash:awscli_install
$ sudo pip install awscli
```

インストール後、`aws --version`でバージョン確認ができればOKです。


### AWS CLIの基本設定
CLIからアクセスするための、IAMユーザを作成し
アクセスキーと、シークレットアクセスキーを取得します。


その後、以下のコマンドでCLIのコンフィグを設定します。

```bash:CLI
$ aws configure
AWS Access Key ID [None]: ****************MYZA
AWS Secret Access Key [None]:****************Vz+l
Default region name [None]: ap-northeast-1
Default output format [None]: text
```
__Default region__はデフォルトで利用するリージョンをせってします。
__Default output format__はCLIの実行結果を出力する際の、ファイル形式を設定します。
今回はtextにしますが、json、tableも設定可能です。

設定したconfigはホームディレクトリの.awsディレクトリに保管されます。


## CLI操作

awsのコマンドからJSON形式で登録が出来る

```bash:CLI
aws dynamodb put-item --table-name <テーブル名> --item '<JSON>' --return-consumed-capacity TOTAL
```

JSONの形式はDataPipelineで使用したものでOK


## 実行した感想
今のところ、1回のコマンドで1行分のJSONしか読み込み方がわからなかったので
とりあえず、行数分コマンドをExcelで生成して一気に流してみました。
100件とかその程度のデータなら、コマンドのほうがよっぽど早い

DataPipeline使うにしても行数分のJSONデータは作らないといけないので、
データの準備は変わらないし件数が少ない場合はDataPipelineよりコマンドかな。
DataPipelineだとインスタンスの起動時間とかで結構時間もかかる。

ただ、1000件以上のデータだとちょっと時間がかかる。。。
ひょっとしたらこっちはDataPipelineのが早いかもしれない。
ユニットは書き込みに15振ってあるけど、3ぐらいしか使えてないし、
もっとコマンドに付け足しで効率よくユニット使えれば早くなるかもです。

## まとめ
今日やりたかった事は、データ件数が少なくてもDataPipelineを
使っていることに対するコスト削減なのでとりあえず完了です。
ユニットをもうすこし効率よく使えないかは今後の課題にします。
Mac OS X El Capitanで NAOqi 2.4.2 Python SDK を使う 


どうも Mac OS X El Capitan では System Integrity Protection(SIP) という新しいセキュリティー機能が原因で、NAOqi Python SDK が使えないようです。

こんな感じでエラーが出てきたら、それは SIP によるセキュリティー機能によるものです。

```
>>> import naoqi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/tkawata/naoqi/pynaoqi-python2.7-2.4.2.26-mac64/naoqi.py", line 9, in <module>
    import qi
  File "/Users/tkawata/naoqi/pynaoqi-python2.7-2.4.2.26-mac64/qi/__init__.py", line 66, in <module>
    from _qi import Application as _Application
ImportError: dlopen(/Users/tkawata/naoqi/pynaoqi-python2.7-2.4.2.26-mac64/_qi.so, 2): Library not loaded: libboost_python.dylib
  Referenced from: /Users/tkawata/naoqi/pynaoqi-python2.7-2.4.2.26-mac64/_qi.so
  Reason: unsafe use of relative rpath libboost_python.dylib in /Users/tkawata/naoqi/pynaoqi-python2.7-2.4.2.26-mac64/_qi.so with restricted binary
>>> 
```

SDK が参照しているライブラリーの参照方法が問題のようで、正式には SDK が修正されるのを待つしかありません。（各 NAOqi 2.4.2 SDK は Mac は現状 Yosemite がサポート OSです） 

暫定的な対応になりますが、パッチを当てるスクリプトを作ってみました。

```bash:patch_naoqi_python_sdk_for_elcaptain.sh
#!/bin/bash

if [ $# -ne 1 ]; then
  echo "パラメータエラー" 1>&2
  echo "sh patch_naoqi_python_sdk_for_elcaptain.sh  naoqi_python_sdkのパス" 
  exit 1
fi

NAOQIDIR=$1 # "${HOME}/naoqi/pynaoqi-python2.7-2.4.2.26-mac64"

if [ ! -e ${NAOQIDIR}/naoqi.py ]; then
	echo "指定されたパスは naoqi python SDK ではないようです"
	exit 1
fi

cd ${NAOQIDIR}

for file in `ls *.dylib *.so`
do
	# patch all library internal cross references
	echo "Patching " $file "..."
	for fileother in `ls  *.dylib *.so ;ls qi *.dylib *.so`
	do
		# library
		echo "  Patching " $fileother " with " $file "..."
		install_name_tool  -change $file $NAOQIDIR/$file $fileother
	done
	# patch Python reference for the library
	install_name_tool -change /Library/Frameworks/Python.framework/Versions/2.7/Python /System/Library/Frameworks/Python.framework/Versions/2.7/Python $file
done

for file in `ls *.dylib *.so`
do
	# patch all library internal cross references
	echo "Patching " $file "..."
	fileother="qi/plugins/libqimodule_python_plugin.dylib"
	# library
	echo "  Patching " $fileother " with " $file "..."
	install_name_tool -change $file $NAOQIDIR/$file $fileother
	# patch Python reference for the library
	install_name_tool -change /Library/Frameworks/Python.framework/Versions/2.7/Python /System/Library/Frameworks/Python.framework/Versions/2.7/Python $file
done
```

パラメータで NAOqi SDK のパスを指定します

```
sh patch_naoqi_python_sdk_for_elcaptain.sh  PythonNAOqiSDKのパス
```
線形予測分析（LPC）（= formant 分析）

こんにちは。
「[線形予測分析（LPC）](http://aidiary.hatenablog.com/entry/20120415/1334458954)（Pythonで音声信号処理（2011/05/14）の第20回目：LPCスペクトル包絡を求める）」（= formant 分析）という記事を見つけたので、そこのコードをほぼそのまま動かしてみました。母音「あ」の例です。
![a.wav.png](https://qiita-image-store.s3.amazonaws.com/0/54617/9a256396-8264-335d-770b-2e16a21f5a9c.png)

走らせたコードは、そこに置いてあるそのままなのですが、書いておきます（```levinson_durbin.py``` もそこから取ってきました）：

* なお「[Python(NumPy, SciPy)でフォルマント分析を行う](http://blog.wktk.co.jp/ja/entry/2013/06/14/formant-detection-with-numpy)」という記事でもこれを利用しているようです。
* 母音の音声ファイル a.wav もどこからか入手しました。

```py
# coding:utf-8
from __future__ import division
import wave
import numpy as np
import scipy.io.wavfile
import scipy.signal
import pylab as P
from levinson_durbin import autocorr, LevinsonDurbin

"""LPCスペクトル包絡を求める"""

def wavread(filename):
    wf = wave.open(filename, "r")
    fs = wf.getframerate()
    x = wf.readframes(wf.getnframes())
    x = np.frombuffer(x, dtype="int16") / 32768.0  # (-1, 1)に正規化
    wf.close()
    return x, float(fs)

def preEmphasis(signal, p):
    """プリエンファシスフィルタ"""
    # 係数 (1.0, -p) のFIRフィルタを作成
    return scipy.signal.lfilter([1.0, -p], 1, signal)

def plot_signal(s, a, e, fs, lpcOrder, file):
    t = np.arange(0.0, len(s) / fs, 1/fs)
    # LPCで前向き予測した信号を求める
    predicted = np.copy(s)
    # 過去lpcOrder分から予測するので開始インデックスはlpcOrderから
    # それより前は予測せずにオリジナルの信号をコピーしている
    for i in range(lpcOrder, len(predicted)):
        predicted[i] = 0.0
        for j in range(1, lpcOrder):
            predicted[i] -= a[j] * s[i - j]
    # オリジナルの信号をプロット
    P.plot(t, s)
    # LPCで前向き予測した信号をプロット
    P.plot(t, predicted,"r",alpha=0.4)
    P.xlabel("Time (s)")
    P.xlim((-0.001, t[-1]+0.001))
    P.title(file)
    P.grid()
    P.show()
    return 0

def plot_spectrum(s, a, e, fs, file):
    # LPC係数の振幅スペクトルを求める
    nfft = 2048   # FFTのサンプル数
    fscale = np.fft.fftfreq(nfft, d = 1.0 / fs)[:nfft/2]
    # オリジナル信号の対数スペクトル
    spec = np.abs(np.fft.fft(s, nfft))
    logspec = 20 * np.log10(spec)
    P.plot(fscale, logspec[:nfft/2])
    # LPC対数スペクトル
    w, h = scipy.signal.freqz(np.sqrt(e), a, nfft, "whole")
    lpcspec = np.abs(h)
    loglpcspec = 20 * np.log10(lpcspec)
    P.plot(fscale, loglpcspec[:nfft/2], "r", linewidth=2)
    P.xlabel("Frequency (Hz)")
    P.xlim((-100, 8100))
    P.title(file)
    P.grid()
    P.show()
    return 0

def lpc_spectral_envelope(file):
    # 音声をロード
    wav, fs = wavread(file)
    t = np.arange(0.0, len(wav) / fs, 1/fs)
    # 音声波形の中心部分を切り出す
    center = len(wav) / 2  # 中心のサンプル番号
    cuttime = 0.04         # 切り出す長さ [s]
    s = wav[center - cuttime/2*fs : center + cuttime/2*fs]
    # プリエンファシスフィルタをかける
    p = 0.97         # プリエンファシス係数
    s = preEmphasis(s, p)
    # ハミング窓をかける
    hammingWindow = np.hamming(len(s))
    s = s * hammingWindow
    # LPC係数を求める
#    lpcOrder = 12
    lpcOrder = 32
    r = autocorr(s, lpcOrder + 1)
    a, e  = LevinsonDurbin(r, lpcOrder)
    plot_signal(s, a, e, fs, lpcOrder, file)
    plot_spectrum(s, a, e, fs, file)
    return 0

if __name__ == "__main__":
    file = "a.wav"
    lpc_spectral_envelope(file)
    exit(0)
```
vvvv Midiキーボードが手元にない時に仮想Midiキーボードをつかう

# Midiを扱いたいけどMidiキーボードが手元にない時の対処
 いつも手元に１つはあるMidiキーボードがなかったので、小さいMidiキーボードを購入しに出かけようかと思った。しかし、こういう場面が今後沢山あるだろうと思い、Midiキーボードがなくても対応できるようにしてみた。

## Midiのサンプルを開く
Midiを取り扱いするサンプルパッチの場所
(vvvv.exeのあるフォルダ)/girlpower/IO/Midi/01_ReceivingMidiData_Overview.v4p

Midiキーボードが接続されていない場合、サンプルパッチを開くとMidiキーボードが１も存在していないので、ノードにエラーが出ている

![01_ReceivingMidiData_Overview_2016.02.07-21.59.33.png](https://qiita-image-store.s3.amazonaws.com/0/111261/03e88abc-7ed2-817b-ee9f-a2706856cdd0.png)

## 仮想Midiキーボードを用意する
仮想 Midiキーボードで検索したら、一番最初に見つかった
[Rainbow Keyboard](http://www.gigafree.net/media/midi/rainbowkeyboard.html)をダウンロードし、rbkey.exeを実行する。
![VirtualMidiKeyboard002.png](https://qiita-image-store.s3.amazonaws.com/0/111261/d4497978-ca55-dacc-954e-6062c4c04615.png)

## 仮想Midiケーブルソフトを用意する
仮想Midiケーブルソフト[loop Midi](http://www.tobias-erichsen.de/software/loopmidi.html)をダウンロードし、インストールする。

ショートカットか(インストールフォルダ)/Tobias Erichsen/loopMIDI/loopMIDI.exe、からloopMidi.exeを実行する

![VirtualMidiKeyboard003.png](https://qiita-image-store.s3.amazonaws.com/0/111261/81282018-0472-5d2b-6ccc-10f089789027.png)

## 仮想Midiキーボードから仮想MidiポートにMidi出力するように設定する
 loopMidiに仮想Midiポートを作成する。+ボタン押下でPortが作成される

![VirtualMidiKeyboard004.png](https://qiita-image-store.s3.amazonaws.com/0/111261/407f4ffa-aa17-fdd4-8ba3-014bac77f924.png)


Rainbow Keyboardの設定画面を開く（オプション(O)->設定）
設定画面でMidi出力デバイスを「loopMidi Port」に設定する。

![VirtualMidiKeyboard005.png](https://qiita-image-store.s3.amazonaws.com/0/111261/474bb2d7-0a35-c000-647f-5e321c5520c9.png)

これで仮想Midiキーボードが仮想デバイスとして認識されるが、vvvvのパッチには変更が反映されていない。
![VirtualMidiKeyboard006.png](https://qiita-image-store.s3.amazonaws.com/0/111261/99316815-6e9b-5bef-4a03-22fde68abc9e.png)

## vvvvの再起動
 vvvvを再起動するとloopMidiで作った仮想MidiPortが選択されている。Rainbow KeybordをMidiデバイスとして使用することができるようになった。

![VirtualMidiKeyboard007.png](https://qiita-image-store.s3.amazonaws.com/0/111261/f277a120-a390-b053-926a-4b92c4bc3560.png)
μITRONメモ

μITRON(主にNORTi)を使用して気が付いたことなどをメモ。

# dry_tskとrot_rdq
優先度の高いタスクが実行権を握り続けないようにするためにdry_tskを使用する、
というコードやコメントをよく見かけます。
その目的の場合rot_rdqを実行することで、指定したタスク優先度に実行することができるため、
ラウンドロビンのように実行順を制御することができます。
各タスクの優先度が適切に設定されていれば、不要にdry_tskをして処理を遅らせる必要がなくなります。
(他に動きたいタスクがいなければ、自タスクが動けるので)

# rel_wai
slp_task,wai_flg,wai_sem,rcv_msg等により、他タスクから待ち状態になっているタスクを強制的に待ち解除できます。
キャンセル処理等に使用できますが、待ち状態になる各システムコールの戻り値がE_RLWAIで返ることを想定していないソースコードもあるので注意が必要です。(μITRON3.0以前の古いコードには無かったので)

# ミューテクスとセマフォ
ミューテックスは、セマフォと同様に資源の排他制御に使われます。
違いとしては、
　ミューテクス：ロックしたタスクしかロック解除できない。
　　　　　　　　ロックしたタスクが終了すると、自動的にロックが解除される。
　　　　　　　　優先度継承プロトコルや優先度上限プロトコルにより優先度逆転を防ぐことができる。
　　　　　　　　資源の数が1個固定。(セマフォの最大値1と同じ)
　セマフォ：ロックしたタスク以外でもロック解除できる。
　　　　　　ロックしたタスクが終了しても、ロック解除されない。
　　　　　　優先度逆転が起こる可能性がある。
　　　　　　最大値、初期値を変更できる。(0や1以外も可)
などがあります。
使い方にもよりますが、排他制御としてはミューテックスを使用したほうが安全です。
Cygwinでコマンドの出力結果をクリップボードにコピーする

# 実行環境
Windows7 64bit版
Cygwin 64bit版

# 方法
コマンドの出力結果を *clip* へリダイレクトするだけ

```shell-session
echo "hello" | clip
```
上記コマンド実行後は、クリップボードに「hello」という文字列がコピーされる。

# *clip* とは
受け取った入力をクリップボードにコピーできるコマンド。
Windows標準のコマンドなので、コマンドラインでも使用可能。
推薦システム 〜 協調フィルタリング〜

# 協調フィルタリング
「この商品を買った人はこんな商品も買っています」
「あなたと同じ商品を買っている人はこんな商品も買っています」
を実現する手法である。

# どの様なサービスを作る上で向いているのか
1人のユーザがECサイト、映画・書籍等における複数回の消費をある程度短い期間に行なう様なサービスに向いている。

# 協調フィルタリングを適用するにおける前提
サービス内での購買情報がある程度蓄積されていることが前提である。
そのため新規サービスやサービス内の新商品、新規ユーザに対して協調フィルタリングを適用できない。

# 協調フィルタリング実装（ユーザベース）するにあたって

> ユーザベース協調フィルタリング
ユーザ同士の近さからアイテムを推薦する協調フィルタリング

協調フィルタリング実装するには、過去にユーザがどのアイテムに
どのような評価をしたかといったデータを扱う。
例）ECサイトでユーザがアイテムに対してつける評価値、商品を購入したか購入していないのかといった0もしくは1で表現したようなデータを用いる。
ユーザベースを用いることで、「この商品を買った人はこんな商品も買っています」
「あなたと同じ商品を買っている人はこんな商品も買っています」
を実装できる。

# アイテムベース協調フィルタリング実装するにあたって
ベクトル表現にしたユーザの評価データからアイテムどうしの類似度を
求め、類似度の高いアイテムを推薦する。

アイテムベースでも、「この商品を買った人はこんな商品も買っています」を実装できる。
XAMPP PortableをWINDOWSで使うときのPHPは初期設定でextensionsが無効！？

* コメントより標題をXAMPP → XAMPP Portableに書き換えました。（2016年2月7日22:32）

2014年6月15日（初版第２刷発行）のPHP+MySQLマスターブック
![PHP+MySQLマスターブック](https://book.mynavi.jp/files/topics/24425_ext_06_0.jpg)
をさっと学習したいので、指示通りに進めていたところのお話です。

## 1. XAMPP導入
WINDOWSだからと言って何でもインストールしていると障害にあったときにつらい思いをするので
[xampp-portable-win32-7.0.2-1-VC14.zip](http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/7.0.2/) を `C:\xampp` のように展開しました。

* コマンドプロンプトやﾊﾟｯﾜｼｪﾙをご利用の方はWindowsキー押していただき、 `変数` と入力していただければ、直ぐに編集できます

## 2. 文字列を操作するには
というページがありまして、 `mb_strlen` を使うことになるのですが、

```
PHP Fatal error:  Uncaught Error: Call to undefined function mb_strlen() in C:\xampp\htdocs\mb_strlen.php:16
```

致命的なエラーに驚きまして、[Windows 用 PHP 拡張モジュール](http://php.net/manual/ja/install.windows.extensions.php)より

```php.ini

extension_dir = 'C:\xampp\php\ext' // line:726
extension = php_mbstring.dll         // line:877
```

以上で問題解決です。
vagrantのPublic NetworksでIPを固定させる

vagrantは使い方が簡単でIT業界の初心者でも使える仮想環境ツールです。
私もプライベートではいつも愛用しています。
そういう便利なやつですが、うまく使いこなしたら、サーバー単体でのテストだけではなく、サーバー間の通信が必要なテストなどにも使えます。例えば、冗長構成とかですね。

vagrantのネットワーク構成にはいろんな種類があります。
HostとGuestだけ通信ができるするとか、GuestがGuestではなくもう一つのHostのように位置づけさせることも可能です。
今回は私がよくつかう、「Public NetworksでIPを固定」の方法について紹介します。

###やりたいこと
HostPCのvagrantでLinuxを立ち上げ₍サーバーAとします₎、HostPCのブラウザからサーバーAで起動しているApacheなどのWebページにアクセスする。ただし、PortForwardingは使わない。

###設定方法
Vagrantfileに以下の設定を追加

```
config.vm.network "public_network", ip: "192.168.123.120"
```

これだけで終わりです。

ただ、正しいipアドレスを指定する必要があります。

多くの場合普段使うネット環境は固定ipアドレスではなくDHCPによる動的ipアドレスを使うと思いますが、
動的ホスト端末からipconfig(Windows基準)してみると自分の端末に割り振られたipアドレスがわかります。
そのipアドレスの4番目の数字だけを動的に割り振られてなさそうな番号にします。
例えば、
自分のipアドレスが「192.168.123.103」の場合「192.168.123.120」にする
とかです。

ちなみにvagrantのバージョンによってはできないようです。私が使用しているバージョンは1.8.1です。
YouTubeにアップロードされた動画の情報取得[Python]

YouTubeの動画の情報
(タイトル,説明)
を取得してみようかと思います。
2016/02/07、現在の仕様では動作します。
将来仕様が変われば使えなくなる？かもです。

まず、スクレイピングに便利なbs4を使用しますのでインストールしていない人はインストールしておいてください。
これが無いと動作しません。
まず、私が確認できたタグは
タイトル, 説明欄
watch-title, eow-description
でした。今すぐ変わることは無いでしょう。

##入力サンプル
```
python GET_YouTube_Video_info.py https://youtu.be/9bZkp7q19f0
```

##出力サンプル
```
PSY - GANGNAM STYLE(강남스타일) M/V
PSY - DADDY(feat. CL of 2NE1) M/V @ https://youtu.be/FrG4TEcSuRgPSY - 나팔바지(NAPAL BAJI) M/V @ https://youtu.be/tF27TNC_4pcPSY - 7TH ALBUM '칠집싸이다' on iTunes @ http://smarturl.it/PSY_7THALBUMPSY - GANGNAM STYLE(강남스타일) on iTunes @ http://smarturl.it/PsyGangnam#PSY #싸이 #GANGNAMSTYLE #강남스타일More about PSY@http://www.psypark.com/http://www.youtube.com/officialpsyhttp://www.facebook.com/officialpsyhttp://twitter.com/psy_oppahttp://iTunes.com/PSYhttp://sptfy.com/PSYhttp://weibo.com/psyoppahttp://twitter.com/ygent_official
```
##コード
```py:GET_YouTube_Video_info.py
#coding: utf-8

import csv, sys, re
import urllib2 as request
#要インストール: bs4
from bs4 import BeautifulSoup


class Main:
    def __init__(self, url):
        self.url = url
    def request_(self):
        watch_title_list = []
        eow_description_list = []

        response = request.urlopen(self.url)
        body = response.read()
        soup = BeautifulSoup(body)

        watch_titles  = soup.find_all(attrs={'class': 'watch-title '})
        eow_descriptions = soup.find_all('p', {'id': 'eow-description'})

        for watch_title, eow_description in zip(watch_titles, eow_descriptions):
            watch_title_list.append(watch_title['title'])
            eow_description_list.append(eow_description.text)

        return watch_title_list, eow_description_list


if __name__ == '__main__':
    Main = Main(sys.argv[1])
    res_title, res_description = Main.request_()
    for title, description in zip(res_title, res_description):
        print title
        print description
```
CentOS7のfirewalldについて

CentOS6 → 7 になって大きな変更点の一つであるのがDefaultアクセス制御方式がiptablesからfirewalldに変わったことです。もちろんiptablesが使えないわけではありません。手間はかかりますが、インストールしたらiptablesも使えます。また、その場合はfirewalldは無効にします。₍両方使っても意味がないので₎

CentOS7ではfirewalldがDefaultで有効状態なっているとのことですが、私の場合₍「Opscode centos-7.0」のvagrantのBoxを使っている₎はなぜか最初は無効状態でした。
ということで、firewalldの起動、停止、追加などを調べてみました。

###自動起動設定になっているかの確認

```
# systemctl is-enabled firewalld
```

###自動起動にする

```
# systemctl enable firewalld.service
```

###起動させる

```
# systemctl start firewalld.service
```

###リストを確認

```
# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```

###ルール追加

```
# firewall-cmd --zone=public --add-port=8080/tcp --permanent
# firewall-cmd --zone=public --add-service=http --permanent
```
--permanent オプションはOSの再起動時にも有効にするためのものです。また、すぐ反映はしなくなり、以下の手順で行うreloadをしてあげる必要があります。もし、つけない場合はreloadしなくても即反映はしますが、OS再起動したらなくなってしまいます。
上記の例、一般的にport番号が80である「http」をサービス名で追加を行っています。
firewall-cmd --zone=public --add-port=80/tcp --permanent　とport指定で追加をするのと同じです。

###リロード

```
# firewall-cmd --reload
# firewall-cmd --list-all
public (default, active)
  interfaces: enp0s3
  sources:
  services: dhcpv6-client http ssh
  ports: 8080/tcp
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:
```


###ルール削除

```
# firewall-cmd --zone=public --remove-port=8080/tcp --permanent
# firewall-cmd --zone=public --remove-service=http --permanent
```
※OS再起動時にも反映されるように「--permanent」オプションを忘れないようにしましょう。
ffmpegでDVDの字幕を動画に焼きこむ

DVDのVOBファイルは以下のような構成になっている。

Stream #0:0[0x1bf]: Data: dvd_nav_packet
Stream #0:1[0x1e0]: Video: mpeg2video (Main), yuv420p(tv), 720x480 [SAR 32:27 DAR 16:9], 6000 kb/s, 30.37 fps, 59.94 tbr, 90k tbn, 59.94 tbc
Stream #0:2[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
Stream #0:3[0x81]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s
Stream #0:4[0x20]: Subtitle: dvd_subtitle
Stream #0:5[0x21]: Subtitle: dvd_subtitle

このうち stream 0:1がvideo、
0:2が英語の音声、0:3が日本語吹き替え
0:4が日本語字幕、0:5が英語字幕
となっている。

動画0:1と0:2の英語音声、0:4の日本語字幕を用いる場合

http://xanadu62.blogspot.jp/2013/05/ffmpegdvd.html
を参考に

cat VTS_01_[1234].VOB | \
nice ffmpeg -analyzeduration 120M -probesize 120M \
-ifo_palette VTS_01_0.IFO -i - \
-filter_complex "[0:1][0:4]overlay[1]"  \
-map [1] -c:v libx264 -preset veryfast \
-map 0:2 -c:a ac3 test.mp4
Rubyインストールから始める、「sinatra」でWebAPIを作る


# 概要
Rubyのフレームワークで簡単に軽いアプリケーションを作ることができる「sinatra」君で今回はWebAPIを作ろう！

Rubyのインストールから始めるsinatra
1.Rubyをインストール
2.Sinatraをインストール
3.Sinatraで文字を表示する
4.URLで取得したパラメータを使う

# 1.Rubyのインストール
　私はwinマシーンなので http://rubyinstaller.org/ からインストールできるパッケージを実行しインストール。簡単。
 
 # 2.Sinatoraをインストール
 Windowsマシーンなのでコマンドプロンプトを起動。
 
```rb
ruby -v
```
を打ってrubyのバージョンが出ればとりあえずオッケー。

さぁsinatraをインストールしていきましょう。

```rb
gem install sinatra
gem install sinatra-reloader
```

長いですが頑張って待ちましょう。

## エディタ
エディタは別になんでもいいですが僕はandroid以外はsublimeですべて解決させています。

# 3.Sinatraで文字を表示する

早速リクエストしちゃいましょう。

```rb:helloWorld.rb
require "sinatra"

get '/' do 
	"Hello World!"
end
```

まず上をしゃきょって（写経しちゃって）ください。

```rb
require ' sinatra'
```
は単純にsinatra読みこんでね、といった具合

そして次に

```rb
get '/' do 
	"Hello World!"
end
```

「''」で囲まれた部分がリクエストされた場合↓をを返してね、といった具合です。
今回の場合だと「/]がリクエストされた場合["helloWorld"」を返してね、といった具合です。

sinatraは基本的に「ほにゃららされたらほにゃららする」が基本形です。
それをどんどん追加していくことで機能を実装していきます。

# 実行しよう

```rb
ruby helloWolrd.rb
```
を実行するとローカルにwebサーバーが立ち上がります。
確認方法は　http://localhost:4567
です。今回はリクエストパラメータに /　を指定しているのでhttp://localhost:4567/　でhttpリクエストしましょう！

# sinatra/reloader
先ほどsinatraと一緒にダウンロードしたsnatra/reloaderの話をします。
sinatra/reloaderなんですが逆にない場合の話をします。
導入しない場合ソースを変更した際にいちいちサーバーをいちいち立て直さないと変更が適用されません。
例えば先ほどのコードに微修正をそのまましてみてください。（終了の仕方は ctr c です。）

```rb
require "sinatra"

get '/' do 
	"Hello World!"
end

get '/sasaki' do
	"sasaki is good"
end
```
先ほどのにそのまま追加してみてもらえばいいんですがもしリアルタイムで反映されるとしたら　http://localhost:4567/sasaki　で　「sasaki is good」と表示されるべきなんですがエラーぽい画面が出るかと思います。

そんな時に上部のrequireに さらに追加することでリアルタイムに反映させることができます。


試しに一度やってみましょう（もう一度 ctr cでサーバーを落とし、）

```rb
require "sinatra"
require "sinatra/reloader"

get '/' do 
	"Hello World!"
end

get '/sasaki' do
	"sasaki is good"
end
```
でサーバーを起動。
一旦 http://localhost:4567/sasaki でリクエスト。
おそらく　「sasaki is good」が表示されます。
エディタに戻って変更してみます。なんでもいいんですが、

```rb
require "sinatra"
require "sinatra/reloader"

get '/' do 
	"Hello World!"
end

get '/sasaki' do
	"sasaki is gooddess"
end
```
などにしてサーバーを再起動せずに保存だけしてみましょう。
おそらく僕が瞬く間にいい人から女神に早変わりしたでしょう。


# URLで取得したパラメータを使う

```rb
get '/hello/:name' do
    "hello #{parmas[:name]}"
end
```

[:]以降は変数となり#{parmas[]}の中身の物が表示されることになります。
例えば今回 http://localhost:4567/hello/sasaki のパラメータを渡した場合
hello sasaki といったようにページに表示されます。
また、これはかなり省略することができます。

```rb
get '/hello/:name' do |a|
    "hello #{a}"
end
```
といった具合です。

ワイルドカードを用いて二つ以上のパラメータを渡す場合

```rb
get '/from/*/to/*' do |f,l|
	"from #{f} to #{l}"
end
```
http://localhost:4567/from/Y/to/Y
といった形で渡してあげましょう。

数字のみ渡したい場合正規表現を用いて、
```rb
get %r{/users/([0-9]*)} do |i|
	"users Id =  #{i}"
end
```
このような感じでしょうか。