OmniAICreator/Qiita-1.07M huggingface dataset:
go-qmlのWebViewでローカルWebサイトを表示するときの注意

分かってしまえば簡単だけど、まるまる一週間はまってしまったのでメモ（訂正あり）。

go言語に[go-qml](https://github.com/go-qml/qml)とQt5でWebView画面を持つGUIを作り、さらに自分自身を[martini](https://github.com/go-martini/martini)でWebサーバーにして自分自身をリッスンさせようとしていた。

条件:
- Mac OS X Yosemite
- Qt: 5.5 
- Go: 1.4.2
- martiniとgo-qmlを`go get`でインストール

qml、テンプレート、メインのgoを以下のような感じで書いた。

```qml:qml/main.qml
import QtQuick 2.4
import QtQuick.Window 2.2
import QtWebKit 3.0

Window {
    property int win_width: 1280
    property int win_height: 800

    visible: true
    width:  win_width
    height: win_height

    WebView {
      id: resultwebview
      anchors.fill: parent
      url: "http://localhost:3000/"
  }
}
```

```html:template/hello.tmpl
<h2>Hello {{.}}!</h2>
```

```go:main.go
package main

import (
	"fmt"
	"os"

	"github.com/go-martini/martini"
	"github.com/martini-contrib/render"
	"gopkg.in/qml.v1"
)

const (
	QMLPATH = "qml/main.qml"
)

func main() {
	m := martini.Classic()
	// render html templates from templates directory
	m.Use(render.Renderer())

	m.Get("/", func(r render.Render) {
		r.HTML(200, "hello", "jeremy")
	})

	go m.Run()

	if err := qml.Run(run); err != nil {
		fmt.Fprintf(os.Stderr, "error: %v\n", err)
		os.Exit(1)
	}
}

// Runs QML GUI.
func run() error {
	engine := qml.NewEngine()

	controls, err := engine.LoadFile(QMLPATH)
	if err != nil {
		return err
	}

	// Shows default messages.

	window := controls.CreateWindow(nil)
	window.Show()

	window.Wait()
	return nil
}
```

`go run main.go`すると、一応期待どおりに動いたものの、[Web-Starter-Toolkit](https://developers.google.com/web/fundamentals/getting-started/web-starter-kit/?hl=ja)を入れてから挙動がおかしくなった。一度表示したWeb-Starter-Toolkitのデモ画面とCSSが固定されてしまい、cssやhtmlを試しに削除してもデモ画面がずっと表示され続けてしまう。

明らかに存在しないはずのhtmlやcssが取得される様子は、ちょっとしたホラーだった。どこのキャッシュだかゴミ捨て場だかを参照していたのかは結局わからず。

数日かけてQtからmartiniまでひたすら調べたところ、Web-Starter-Toolkitのせいではなく、QMLの`url: "http://localhost:3000"`でおかしなところからWeb画面を取得しているっぽかった。

もしやと思ってこの箇所を`url: "http://127.0.0.1:3000"`に変えると、あっさり正常に復帰した。理由は不明だけど、ここには`localhost`を指定すべきではないらしい。もともとそんな利用法は想定していないと思うので仕方ないとは思うけど。

こんなことに一週間もかかるとは...いずれにしろ、これでやっと[Web-Starter-Toolkit](https://developers.google.com/web/fundamentals/getting-started/web-starter-kit/?hl=ja)を本格的に楽しめそう。

# 訂正
その後しばらくしてまた同じ現象が起きた。結局、URLを変えるとその場は解消することがわかった。アドレスやポートのどこかを変えればよいが、ポートを変えるのが楽。

おそらく、レンダリングエンジン（たぶんChromeのやつ）でCSSキャッシュがなにかのはずみで更新されなくなるのだろう。Railsのアセットパイプラインみたいにcssファイル名にハッシュを含められるかどうか調べてみるつもり。
UICollectionViewで綺麗な横スクロールページング

UICollectionViewを使用しての横スクロールを実装するUIは多々あると思いますが、検索して出てくる情報ではかなり微妙な動作が多く、自分の決定版として作成方法をまとめます。
今回の作成はAutoLayoutは使用しておりません。

完成イメージ (画像は今回作成段階で参考にさせていただいた[euraka様のブログ](http://eure.jp/blog/ui_collection_facebook/)より転載させていただいてます)
<img src="http://eure.jp/wp-content/uploads/2014/07/blogmain_18_2.png" />

## 参考記事のように作成する
まず、はじめにeureka様がまとめてくださっている記事のように実装してみました。
[タイムラインの実装に欠かせない！UICollectionViewで作るFacebook風レイアウト](http://eure.jp/blog/ui_collection_facebook/)

作成してみると確かに綺麗にTimeline風の横スクロールが実装されています。
しかし、作成の過程上、左右にすき間が発生してしまい、スクロール判定がきかない箇所ができてしまいます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/1500/d643f308-becc-5576-1735-db91dbb1e6cb.png" width="400px" />

表示枠のでかいcellの作るのでしたらあまり気にならない部分ではありますが、どうしても端からスクロールするときにひっかかってしまい良い動作とは言えません。

## 両サイドをタップ可能にする
そこで、この問題を解決するために、UICollectionViewの前に１枚UIViewをはさみ両サイドの部分をタップできるようにします。

今回作成したデモアプリをGithubの方にあげていますので、ぜひ確認してください。
https://github.com/Econa77/PagingCollectionView

変更点は以下の部分です。
・CollectionViewを直に使用せず、UIViewをはさむ
・UIViewのhitTestを使用して本来CollectionViewが無い部分の動作をcollectionView動作させる

```swift
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
    if !CGRectContainsPoint(self.collectionView.frame, point) {
        return self.collectionView
    }
    return super.hitTest(point, withEvent: event)
}
```

内部のcellのサイズは現状決め打ちとなっていますので、使用する際は自由に変更してください。
基本的に重要なポイントはeureka様のブログの方に綺麗にまとまっています。

## 別の方法
実装の方法を調べている中でよく上がっているのは、Layoutファイル内のスクロール動作を制御してページングを行っている方法です。

```objc
- (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity {}
```
http://stackoverflow.com/questions/13492037/targetcontentoffsetforproposedcontentoffsetwithscrollingvelocity-without-subcla
http://shingt.com/blog/2014/08/31/cell-paging-for-uicollectionview/

この方法の場合、CollectionViewの余計なpaddingなど気にせずに横スクロールは実装できますが、綺麗なページング動作を行ってくれません。
具体的には、勢いを付けて横スクロールをすると、１ページ飛ばしてスクロールしてしまいます。
また、UIcollectionViewにヘッダーやフッターを追加した際のページング動作の定義がされていないため、ヘッダーとフッターページの時にページング動作を行うことができません。

こちらの方法は実装は簡単ですが、動作に癖がありますので、実装する際は使用用途を考えた上で実装してください。
[Marcurial] Amazon LinuxにMarcurialをインストールする

EC2のインスタンス(Amazon Linux)にMarcurialをインストールしてみます。

前提条件
========

* EC2インスタンスに対してec2-userでSSHログインできること。


1. インストール
=============

```bash:コマンド:
sudo wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
```

```text:結果(例):
(略)
apt.sw.be (apt.sw.be)|193.1.193.67|:80 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 12649 (12K) [application/x-redhat-package-manager]
`rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm' に保存中

rpmforge-release-0. 100%[=====================>]  12.35K  37.9KB/s 時間 0.3s   

2015-07-19 11:20:38 (37.9 KB/s) - `rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm' へ保存完了 [12649/12649]
```

```bash:コマンド:
sudo rpm -Uhv rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
```

```text:結果(例):
警告: rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm: ヘッダー V3 DSA/SHA1 Signature、鍵 ID 6b8d79e6: NOKEY
準備しています...              ################################# [100%]
更新中 / インストール中...
   1:rpmforge-release-0.5.2-2.el5.rf  ################################# [100%]
```

```bash:コマンド:
rm rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
```


```bash:コマンド:
sudo yum install mercurial -y
```

```text:結果(例):
インストール:
  mercurial-python26.x86_64 0:2.6.3-1.25.amzn1                                  

依存性関連をインストールしました:
  mercurial-common.x86_64 0:2.6.3-1.25.amzn1 python26.x86_64 0:2.6.9-1.80.amzn1
  python26-libs.x86_64 0:2.6.9-1.80.amzn1   

完了しました!
```



2. 確認
=============

```bash:コマンド(EC2インスタンス):
which hg
```

```text:結果(例):
/usr/bin/hg
```

```bash:コマンド(EC2インスタンス):
hg --version
```

```text:結果(例):
Mercurial - 分散構成管理ツール(バージョン 2.6.3)
(詳細は http://mercurial.selenic.com を参照してください)

Copyright (C) 2005-2012 Matt Mackall 他
本製品はフリーソフトウェアです。
頒布条件に関しては同梱されるライセンス条項をお読みください。
市場適合性や特定用途への可否を含め、 本製品は無保証です。
```


3. 環境設定
===============

コミットに必要なユーザ情報を登録します。

```bash:コマンド::
cat << EOF > ~/.hgrc

[ui]
username = Your Name
ssh = ssh -C
verbose = True
EOF
```


完了
======
[Sphinx] Amazon LinuxにSphinxをインストールする

EC2のインスタンス(Amazon Linux)にSphinxをインストールしてみます。

前提条件
========

* EC2インスタンスに対してec2-userでSSHログインできること。


1. インストール
=============

```bash:コマンド(EC2インスタンス):
sudo pip install sphinx
```

```test:結果(例):
You are using pip version 6.1.1, however version 7.1.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Collecting sphinx
  Downloading Sphinx-1.3.1-py2.py3-none-any.whl (1.3MB)
    100% |████████████████████████████████| 1.3MB 356kB/s 
Collecting sphinx-rtd-theme<0.2,>=0.1 (from sphinx)
  Downloading sphinx_rtd_theme-0.1.8-py2.py3-none-any.whl (418kB)
    100% |████████████████████████████████| 421kB 1.1MB/s 
Collecting snowballstemmer>=1.1 (from sphinx)
  Downloading snowballstemmer-1.2.0.tar.gz (49kB)
    100% |████████████████████████████████| 53kB 7.1MB/s 
Requirement already satisfied (use --upgrade to upgrade): six>=1.4 in /usr/lib/python2.7/dist-packages (from sphinx)
Collecting Pygments>=2.0 (from sphinx)
  Downloading Pygments-2.0.2-py2-none-any.whl (672kB)
    100% |████████████████████████████████| 675kB 709kB/s 
Requirement already satisfied (use --upgrade to upgrade): docutils>=0.11 in /usr/lib/python2.7/dist-packages (from sphinx)
Collecting babel>=1.3 (from sphinx)
  Downloading Babel-1.3.tar.gz (3.4MB)
    100% |████████████████████████████████| 3.4MB 140kB/s 
Requirement already satisfied (use --upgrade to upgrade): Jinja2>=2.3 in /usr/lib/python2.7/dist-packages (from sphinx)
Collecting alabaster<0.8,>=0.7 (from sphinx)
  Downloading alabaster-0.7.6-py2-none-any.whl
Collecting pytz>=0a (from babel>=1.3->sphinx)
  Downloading pytz-2015.4-py2.py3-none-any.whl (475kB)
    100% |████████████████████████████████| 475kB 1.1MB/s 
Requirement already satisfied (use --upgrade to upgrade): markupsafe in /usr/lib64/python2.7/dist-packages (from Jinja2>=2.3->sphinx)
Installing collected packages: sphinx-rtd-theme, snowballstemmer, Pygments, pytz, babel, alabaster, sphinx
  Running setup.py install for snowballstemmer
  Found existing installation: Babel 0.9.4
    Uninstalling Babel-0.9.4:
      Successfully uninstalled Babel-0.9.4
  Running setup.py install for babel
Successfully installed Pygments-2.0.2 alabaster-0.7.6 babel-1.3 pytz-2015.4 snowballstemmer-1.2.0 sphinx-1.3.1 sphinx-rtd-theme-0.1.8
```

2. 確認
=============

```bash:コマンド(EC2インスタンス):
which sphinx-build
```

```text:結果(例):
/usr/local/bin/sphinx-build
```

```bash:コマンド(EC2インスタンス):
sphinx-build --version
```

```text:結果(例):
Sphinx (sphinx-build) 1.3.1
```

```bash:コマンド(EC2インスタンス):
which sphinx-quickstart
```

```text:結果(例):
/usr/local/bin/sphinx-quickstart
```

完了
======


# 参考

- pipが利用できればOSを問わずインストールできるはずです。
- Sphinxの更新履歴は http://docs.sphinx-users.jp/changes.html で公開されています。
Elixirの基本的な型


[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
[2. Basic types](http://elixir-lang.org/getting-started/basic-types.html)です。

# Basic arithmetic
* floatは64bitの倍精度
* `/`演算子は常にfloatを返す

```iex
# integer
iex> 1
1
iex> 1_000_000
1000000
iex> 0xff
255
iex> 0xFF
255
iex> 0b11
3
iex> 0o77
63

# float
iex> 1.0
1.0
iex> 1.0e+4
1.0e4
iex> 1_000_000.001
1000000.001

# 演算
iex> 1 + 2
3
iex> 2 - 1
-1
iex> 0xff + 1
256
iex> 1 + 2.0
3.0
iex> 3 * 4
12
iex> 5 / 2
2.5
iex> div(5, 2)
2
iex> rem(5, 2)
1
iex> trunc 3.5
3
iex> trunc 3.4
3
iex> round 3.5
4
iex> round 3.4
3
```

# Booleans
* Booleanは`true`/`false`
* 型チェックは`is_foobar/1`

```iex
iex> true
true
iex> false
false
iex> is_boolean(1 == 1)
true
iex> is_boolean(1)
false
iex> is_float(5/2)
true
```

# Atom
* Rubyではシンボル
* `true`/`false`もシンボル

```iex
iex> :hello
:hello
iex> is_atom(false)
true
iex> is_boolean(:false)
true
```

# Strings
* ダブルクォート
* UTF-8
* Ruby風のString interpolation
* バイナリとして扱われる

```iex
iex> "こんにちは"
"こんにちは"
iex> "hello #{:world}"
"hello world"
iex> IO.puts "こんにちは
...> 世界"
こんにちは
世界
:ok

iex> byte_size("こんにちは")
15
iex> String.length("こんにちは")
5

iex> String.upcase("Hello")
"HELLO"
```

# Anonymous function
* 匿名関数の実行には`.`が必要
* 匿名関数はクロージャ

```iex
iex> add = fn a, b -> a + b end
#Function<12.54118792/2 in :erl_eval.expr/5>
iex> add.(1, 2)
3
iex> is_function(add)
true
iex> is_function(add, 1)
false
iex> is_function(add, 2)
true
iex> is_function(add, 3)
false
```

# (Linked) Lists
* いわゆる片方向リスト
* 先頭への要素挿入は速い
* 要素数の計算には線形時間かかる

```iex
iex> [1, true, 1.0]
[1, true, 1.0]
iex> length [1, 2, 3]
3
iex> [1, 2, 3] ++ [4, 5, 6]
[1, 2, 3, 4, 5, 6]
iex> [1, true, 2, false, 3, true] -- [true, false]
[1, 2, 3, true]
iex> hd([1, 2, 3])
1
iex> tl([1, 2, 3])
[2, 3]

iex> [0] ++ [1,2,3] #速い
[0, 1, 2, 3]
iex> [1, 2, 3] ++ [4] #遅い（リスト全体の再構築が必要）
[1, 2, 3, 4]
```

* 表示可能なASCII番号のリストを表示するとき、文字リストとして表示する
* 文字リストと文字列は別物

```iex
iex> [97, 98, 99]
'abc'
iex> [97, 98, 99, 1]
[97, 98, 99, 1]
iex> is_list('abc')
true
iex> is_list("abc")
false
iex> 'abc' == "abc"
false
```

# Tuples
* タプルの要素はメモリ上で連続した場所に保存される
* インデックスでアクセスできる
* インデックスでアクセスしたり、要素数の計算したりは速い

```iex
iex> tuple = {:ok, "hello"}
{:ok, "hello"}
iex> elem(tuple, 1)
"hello"
iex> tuple_size tuple
2
iex> put_elem(tuple, 1, "こんにちは")
{:ok, "こんにちは"}
iex> tuple
{:ok, "hello"}
```

# その他
* 数を数える関数について、計算時間が`O(1)`となるものは`size`、それよりかかるものは`length`という名前が使われる

# 参考
* [アリティ](https://ja.wikipedia.org/wiki/%E3%82%A2%E3%83%AA%E3%83%86%E3%82%A3)
Sinatraでformを使ってPOSTしてみる

# はじめに

1. http://qiita.com/ms2sato/items/7c07b2079b48c49fad2a
1. http://qiita.com/ms2sato/items/eed1e3c929ac8f6195a9
1. http://qiita.com/ms2sato/items/5bd201c84dab858ee501

の続き。

今度は簡単にデータをPOSTしてみる。問い合わせ内容を入力して、その内容を確認するまで。

# index.erbでformを表示するように修正

```html+erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <p>
    <a href="about">このサービスについて</a>
  </p>
  <h1>お問い合わせ</h1>
  <form action="confirm" method="POST">
    <div>
      email:<input type="text" name="email" value="">
    </div>
    <div>
      本文:
      <textarea name="message" rows="5"></textarea>
    </div>
    <div>
      <input type="submit" value="送信する">
    </div>
  </form>
</body>
</html>
```

# app.erbでPOSTされたデータを受け取ってみる
```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  erb :index  
end

get '/about' do
  erb :about
end

post '/confirm' do
  @email = params[:email]
  @message = params[:message]
  erb :confirm
end
```

# confirm.erbで受け取ったデータを確認する 

```html+erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <h1>お問い合わせ内容確認</h1>
  <div>
    <div>
      email: <%=@email%>
    </div>  
    <div>
      本文:
      <p>
        <%=@message%>
      </p>
    </div>    
  </div>
</body>
</html>
```

# おしまいに
これで、トップ画面で`email`と`本文`を入れて、次の画面で入れた内容を確認できればOK！
「進捗・どう・です・か」をPHPで書いてみた

# 「進捗・どう・です・か」をPHPで書いてみた

[「進捗・どう・です・か」をランダムに表示し「進捗どうですか」が完成したら煽ってくるプログラム](http://elephnote.com/blog/archives/936)

## 方針
進捗どうですかを後ろから照合していく

## コード
```php

$source = array('進捗', 'どう', 'です', 'か');

$words = array();
$n     = 0;

while (true) {
    $randomWord = $source[mt_rand(0, 3)];
    $words[]    = $randomWord;
    echo $randomWord;
    if ($n > 2 &&
        $words[$n]   == 'か' &&
        $words[$n-1] == 'です' &&
        $words[$n-2] == 'どう' &&
        $words[$n-3] == '進捗'
    ) {
        break;
    }
    $n++;
}

echo '???';
echo '<br>';
echo (mb_strlen(implode('', $words), 'UTF-8')) . ' 文字で煽られた';

```
Sinatraでページを作ってリンクしてみる

# はじめに

1. http://qiita.com/ms2sato/items/7c07b2079b48c49fad2a
1. http://qiita.com/ms2sato/items/eed1e3c929ac8f6195a9

の続き

# about.erbの作成

```html+erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <h1>このサービスについて</h1>
  <p>これはSinatraのテストサービスです</p>
  <div>
    <a href="/">トップへ戻る</a>
  </div>
</body>
</html>
```

# app.rbの修正

```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  erb :index  
end

get '/about' do
  erb :about
end
```

この時点で `http://localhost:4567/about`にアクセスすれば「このサービスについて」のページが見れちゃう！

# トップからaboutページへリンク

```html+erb
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
こんにちは。HTMLで書きました。
<p>
<a href="about">このサービスについて</a>
</p>
</body>
</html>
```

これで、トップページとaboutページは行ったり来たりできますね！

# おしまいに

簡単なページの追加についてできたらOKです！
homebrew-fileで後からアプリをする方法

# はじめに
homebrew-fileを使ってBrewfileを管理している場合、brew cask install した後でbrew file updateするとアンインストールされてしまいます。

# やりかた
そこで後からbrew caskでアプリをインストールする場合、以下のようにしてBrewfileにも追加してあげる必要があります。

```
% brew file brew cask install [パッケージ名]
```

```lang:実行例
% brew file brew cask install pycharm-ce
```
Sinatraでerbを使う

# はじめに
http://qiita.com/ms2sato/items/7c07b2079b48c49fad2a の続き

とりあえず何か動かせたので、もう少しちゃんとしていく。

# erbを使う

## erbファイルの作成

前回作った`sinatform`のディレクトリの中に、`views`というディレクトリを作成して、`index.erb`というファイルを作成します。中身は下記のような感じで。

```html
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
こんにちは。HTMLで書きました。
</body>
</html>
```

## app.rb の修正

`app.rb` を下記のように修正します。

```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  erb :index # :indexの部分はviewsの下に作ったファイル名に合わせる
end
```

これで、 `http://localhost:4567` をリロード！
「こんにちは。HTMLで書きました。」と表示されていたらOKです！
エディタ用ゲームモジュールを作る

[この記事](http://qiita.com/go_astrayer/items/5d001a9cde182488f9f3)のおまけとして、エディタ用ゲームモジュールを作ってみます。

# エディタ用ゲームモジュールとは？
エディタ用ゲームモジュールとは、**エディタビルド(Development Editor などの Editor の付くビルド)**では読み込まれるけど、**スタンドアローンビルド(Development ビルドなどの Editor の付かないビルド)**では読み込まれないゲームモジュールのことです。(UE4 用語ではないので、ご注意を。)

この方法は UE4 で用意されているプラグインでも行われていて、ゲームアプリ側でもエディタ拡張などを入れたい場合に使えるかと思います。

# エディタ用ゲームモジュールを作ってみる。
[この記事](http://qiita.com/go_astrayer/items/5d001a9cde182488f9f3)で作った、LocalizationSample をエディタ用ゲームモジュールにしてみます。

## ～.Target.cs の書き換え
Source/UE4Samples.Target.cs を開いて・・・

```csharp:
OutExtraModuleNames.AddRange( new string[] { "UE4Samples", "LocalizationSample" } );
```

これを以下のように変更します。

```csharp:
OutExtraModuleNames.AddRange( new string[] { "UE4Samples" } );
```

これでスタンドアローンビルドの際は LocalizationSamples がビルドされないようになりました。

# ～.uproject の書き換え

UE4Samples.uproject を開いて・・・

```:
        {
            "Name": "LocalizationSample",
            "Type": "Runtime",
            "LoadingPhase": "Default"
        }
```

これを以下のように書き換えます。

```:
        {
            "Name": "LocalizationSample",
            "Type": "Editor",
            "LoadingPhase": "Default"
        }
```

これで、LocalizationSample モジュールはエディタビルドの時のみ読み込まれるようになりました。

## 確認する
これで準備完了です。

確認方法ですが、破棄されたモジュールの情報がログとして出力されていますので、今回はそれを使います。

```:
[2015.07.19-09.47.01:850][115]LogModuleManager: Shutting down and abandoning module LocalizationSample (82)
```

これが LocalizationSample モジュールが破棄された時のログです。

このログは Development Editor ビルドで実行した場合、エディタを終了すると出力されますが、Development ビルドで実行した場合、アプリを終了しても表示されません。

表示されないということは、モジュールの破棄が行われていない、つまりはモジュールが読み込まれていないということになります。

確認方法はこの他に・・・

* モジュールクラス(FDefaultGameModuleImpl を継承したクラス)の StartupModule 関数にログを仕込む。
* ↑ の関数にブレークポイントを仕込む。

などがあります。
ACCONを使用して実装されたブログ管理機能の画面遷移図

## [ACCON](https://kurobuta.jp/books/book/manual/accon/ "ACCON")(Powered by FuelPHP)を使用して実装されたブログ管理機能の画面遷移図

ACCONに同封されている実装サンプルのブログ管理機能、その画面遷移図です。  

![ブログ管理機能の画面遷移図](https://lh3.googleusercontent.com/7QtOSMLhGjY__x5MejtbMHFuVsaIKs_SB3ndEiVAhus=w1394-h1978-no "ブログ管理機能の画面遷移図")

[拡大](https://photos.google.com/share/AF1QipPlhrzWO4ciUpXv8ywcQBUFzt37BVelsIO5NXHm49m0PTzD8QXB_tuF_VfDQD4nNA/photo/AF1QipNNfMi0udKLnxBnkgBymmfdGYaEebz9QV2rXPUY?key=UmdfRlk1ZmRSUFNKOEVZWWJiZGJjVDNNS0FKSTVR "ブログ管理機能の画面遷移図")

[公開（フロント）の画面遷移図](http://qiita.com/maemori/items/42f381cbb4daf7e7a81e "公開（フロント）の画面遷移図")
はじめてのSinatra

# 下準備
https://it.typeac.jp/article/show/5
http://route477.net/w/Sinatra.html
をさらっと眺めてみた。とっても簡単そう。

# 前提
環境構築はあらかた済んでいる前提です。

- rbenv installed
- ruby ver 2.2.2（ heroku をあとで使う可能性があるので合わせた ）

# インストール

とりあえずサンプル用のディレクトリを作成した。`sinatform`はとりあえずの名前で、作りたいサービスなど好きな名前でやって良いと思います。

```bash
$ mkdir sinatform
$ cd sinatform
$ echo '2.2.2' > .ruby-version
$ gem install sinatra
$ gem install sinatra-reloader
```

# 初めてのファイル作成（コードを書く）
shinatformのディレクトリの中に、app.rbというファイルを作成します。

```rb
require 'sinatra'
require 'sinatra/reloader'

get '/' do
  'this is sinatform'
end
```

# 初めてのサーバ起動
`sinatform` のディレクトリで下記を打ちます。

```bash
$ ruby app.rb
```

下記のように表示されて`WEBrick`が起動

```bash
[2015-07-19 18:55:25] INFO  WEBrick 1.3.1
[2015-07-19 18:55:25] INFO  ruby 2.2.2 (2015-04-13) [x86_64-darwin14]
== Sinatra (v1.4.6) has taken the stage on 4567 for development with backup from WEBrick
[2015-07-19 18:55:25] INFO  WEBrick::HTTPServer#start: pid=31899 port=4567
```

`http://localhost:4567` へアクセスすると `this is sinatform` と表示されるはず。

サーバを止めたい場合には、Controlを押しながらCを押します。

# おしまいに
ひとまず起動してブラウザに出力できればこの段階はクリア！
VTKによる3Dオブジェクトの幾何学変換

#VTKによる3Dオブジェクトの幾何学変換

##はじめに
VTKで3Dオブジェクト(`vtkPolyData`)を並進や回転などの
幾何学変換を行う方法について，[公式サンプル](http://www.vtk.org/Wiki/VTK/Examples/Cxx/Filtering/TransformPolyData)を元にして解説する．
手順としてはまず変換に関するクラスのオブジェクトを生成し，変換に関するプロパティを設定する．その変換を行うオブジェクト(`vtkTransformPolyDataFilter`)で変換を実行する．

##並進と回転の変換
3Dオブジェクト(`vtkPolyData`)を並進・回転させるためには，`vtkTransform`を用いる．

```cpp
vtkSmartPointer<vtkTransform> tra = vtkSmartPointer<vtkTransform>::New();

//並進
tra->Translate(5.0,5.0,5.0);//x, y, z方向の並進量
//回転
tra->RotateWXYZ(45, 0, 1, 0);//回転軸と回転量を指定．
tra->Update();

vtkMatrix4x4* matrix = tra->GetMatrix();//変換行列を取得．
```

##3Dオブジェクト(`vtkPolyData`)を変換を実行
`vtkTransformPolyDataFilter`を用いる．

変換元のオブジェクト(`vtkPolyData`)と変換(`vtkTransform`, `vtkLandmarkTransform`,`vtkIterativeClosestPointTransform`など)をセットして，`vtkTransformPolyDataFilter::GetOutput()`で変換したオブジェクトを得る．


```cpp
vtkSmartPointer<vtkTransformPolyDataFilter> filter = vtkSmartPointer<vtkTransformPolyDataFilter>::New();

filter->SetInputData(polydata);//変換元のvtkPolyDataをセット．
filter->SetTransform(transform);//変換をセット．．
filter->Update();

vtkPolyData* output = filter->GetOutput();//変換後
```

##対応関係を用いた変換
`vtkLandmarkTransform`を用いる．変形前後における対応関係が既知の点を`vtkPoints`として，入力する．[公式サンプル](http://www.cmake.org/Wiki/VTK/Examples/Cxx/Filtering/LandmarkTransform)

```cpp
vtkSmartPointer<vtkLandmarkTransform> landmark = vtkSmartPointer<vtkLandmarkTransform>::New();

//対応関係をセットする．
landmark->SetSourceLandmarks(sourcePoints);
landmark->SetTargetLandmarks(targetPoints);

landmark->SetModeToRigidBody();
landmark->Update();

vtkMatrix4x4* matrix = landmark->GetOutput();
```
いちいちgit configしたくないがgithubなどで公開したくない設定をする場合の対処法

例えば、`hub browse`で社内のGithub Enterpriseを使用したい場合、

```.~/.gitconfig
[hub]
  host = host.github
```
とすれば良いが、githubでdotfileを管理していてhostを公開したくない場合は、`.gitconfig.local`を作成し、

```.~/.gitconfig.local
[hub]
  host = host.github
```
`.gitconfig`で読み込む

```.~/.gitconfig
[include]
  path = .gitconfig.local
```
と便利
[ffmpeg] 動画からMP3/WAVファイルを作る、WAVファイルの音声を動画の音声にする

# 準備

ffprobeで音声が記録されているストリームのmapを確認します

実行例

```
$ ffprobe 00475.MTS
ffprobe version 2.4.git Copyright (c) 2007-2014 the FFmpeg developers
... (省略) ...
Input #0, mpegts, from '00475.MTS':
  Duration: 00:57:33.47, start: 0.567378, bitrate: 8597 kb/s
  Program 1
    Stream #0:0[0x1011]: Video: h264 (High) (HDMV / 0x564D4448), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc
    Stream #0:1[0x1100]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 256 kb/s
    Stream #0:2[0x1200]: Subtitle: hdmv_pgs_subtitle ([144][0][0][0] / 0x0090), 1920x1080
```

上記の場合、"0:1" が音声のストリームです

# 動画ファイルに記録されている音声からMP3ファイルを作成する

```
ffmpeg -i "00471.MTS" -map 0:1 -vn -ac 2 -ab 256k -acodec libmp3lame -f mp3 "output.mp3"
```

mapの"0:1"は上の手順で確認したストリームを指定してください

# 動画ファイルから音声部分をWAVに書き出す

撮影場所の状況やマイクの調整ミスによって音が小さすぎたり大きすぎたりした場合に、一旦WAVに書き出してaudacityで調整してから動画に書き戻す際に使用します

```
ffmpeg -i "00471.MTS" -map 0:1 -vn -ac 2 -acodec pcm_s24le -f wav "output.wav"
```

音楽CD用のWAVファイルを作る場合には以下のようにサンプリングレートとビット数を設定します

```
ffmpeg -i "00471.MTS" -map 0:1 -vn -ac 2 -ar 41000 -acodec pcm_s16le -f wav "output.wav"
```

# 動画ファイルの音声部分をWAVファイルの音に置き換える

"-i"オプションを複数使用して、映像と音声のファイルを指定します。"-map"オプションの最初の数字で指定したファイルの順番を示します。以下の例の場合"0:"が"00472.MTS"を指し、"1:"が"00472.wav"を指します。動画ファイルの映像ストリーム(0:0)をcopyして、WAVファイルの音声ストリーム(1:0)をaacにエンコードしてMTSファイルを作成します

```
ffmpeg -i "00472.MTS" -i "00472.wav" -map 0:0 -c:v copy -map 1:0 -c:a libfdk_aac -profile:a aac_he -afterburner 1 -b:a 256k -strict experimental "output.MTS"
```

動画ファイルの長さとWAVファイルの長さを揃えてください。そうしないと、正しくシークできなかったり、最後まで再生できないファイルが出来上がってしまいます。
Carthageの配布の仕方（すっごい簡単！）


iOS開発のデフォルトスタンダードとなっている依存関係管理システムといえば[CocoaPods](https://cocoapods.org/)ですが、最近登場した[Carthage](https://github.com/Carthage/Carthage)は様々な点でCocoapodsに勝るメリットが享受できます。特に、 **プロジェクトのビルドが速くなる** という点で圧倒的に素晴らしいです。CarthageはCocoapodsの様にクリーンインストールの都度ライブラリのビルドをし直すということをしないので、その分高速なんですね。

先日、大きめのプロジェクトの一部をCocoapodsからCarthageに変えたところ、ビルド時間を40パーセントも（！）削減できました。そして、これは素晴らしいのでもっと広まって欲しいと思いました。そこでCartahge形式で配布をしたことがない人向けに記事を書いておきます。

とっても簡単なので、ライブラリや、個人プロジェクトなどで利用してみてください。

## 1. 新しいターゲットをフレームワークとして作成する

![target.png](https://qiita-image-store.s3.amazonaws.com/0/24041/4f8b8d4c-c000-3725-4539-9ebff37cc445.png "target.png")


新しいTargetの追加から、

![00_framework.png](https://qiita-image-store.s3.amazonaws.com/0/24041/769d177b-0808-76cf-fbe3-937216a5932b.png "00_framework.png")

Cocoa Touch Frameworkを選択します。

## 2. Schemeをシェアする

![01_manage_schemes.png](https://qiita-image-store.s3.amazonaws.com/0/24041/db6e1285-f573-c5e5-8a9b-07d55568b76b.png "01_manage_schemes.png")


Manage schemes...から、

![03_shared.png](https://qiita-image-store.s3.amazonaws.com/0/24041/abe3771d-b207-3313-b97c-bff0bc5a08a6.png "03_shared.png")

Sharedにチェックを入れる

## 3. ビルドして生成物をチェックする

```bash
$ carthage build --no-skip-current
```

上記コマンドでビルドします。`Carthage/Build`というディレクトリが出来上がるのでその中身で生成されたフレームワークをチェックします。

## 4. git push

問題がなければRepositoryにプッシュします。

## 5. タグをつける

リリースのタブを開いて新しいタグをつけます。

![04_release.png](https://qiita-image-store.s3.amazonaws.com/0/24041/1cc70ae0-c3b7-9420-bedf-92ac6d2989b6.png "04_release.png")

たったこれだけでCarthageの配布準備できます！ライブラリとしてなくても個人的に使うだけでも便利です。



## 参考

- [Carthage/Carthage](https://github.com/Carthage/Carthage)
ESLint object-shorthandまとめ

ESLintのルール`object-shorthand`についてドキュメントを読んだだけだとちょっと分からなかったので、纏めてみた。

http://eslint.org/docs/rules/object-shorthand

## ルールの書き方

特筆すべきところはないが一応。。。

```yaml
object-shorthand:
   - 2
   - "always"
```

最初の引数は共通の設定

```
0... エラー/警告にしない
1... 警告にする
2... エラーにする
```

## オプションについて
こっちが本題。
第二引数には４つのオプションをとる。
`methods`, `properties`, `always`, `never`。

### "methods"  
`function`を使った記法を許可しない。
以下の記法はエラー/警告になる

```js
let foo = {
  bar: function(){
  	return true;
  }
};
```

なので、functionを省略した記法で書く

```
let foo = {
  bar(){
    return true;
  }
};
```


### "properties" 
ES2015ではキーと変数名が同一の場合、
省略した書き方ができるため以下の書き方の場合エラー/警告となる

```js
let foo = {
  x: x
};
```

以下のように省略した記法を使う

```
let foo = {
　x
};
```

###"always" 
上記２つの`methods`,`properties`両方をチェックし、可能な限り省略記法を使うようにする

### "never" 
いずれの省略記法も使わない。省略記法を記述した場合はエラー/警告となる。

---

ちなみにarrow functionを使った場合はどちらの対象ともならない

```js
let foo = {
  bar: () => true
};
```
sublime text2 > プロジェクトを複数開いている時に特定のプロジェクト内だけ検索する

```txt:動作確認
Windows7 Pro
```

FOLDERSにおいて複数のプロジェクトを開いているけど、特定のプロジェクト内だけで検索したい時がある。

以下の手順を行う。
1. 左上のFOLDERSの該当プロジェクト上で右クリック -> Find in Folder...選択
2. 下部に指定フォルダでの検索設定が表示される。ただし、拡張子のフィルタがないので 右下の ... -> Add Include Filterで拡張子の条件を追加する
3. Find: にキーワードを入れて検索する

一度上記を実行してからは Ctrl+Shift+Fでフォルダの設定すみの検索条件が使えるので２回め以降は楽に検索できる。
Sensuでネットワーク監視やってみた


7/15〜17に開催された[JANOG36](http://www.janog.gr.jp/meeting/janog36/)のライトニングトークに応募して，落選したネタです．
プレゼンテーションもSlideShareにアップロードしています．

  - [Sensuでネットワーク監視やってみた - SlideShare](http://www.slideshare.net/hico_horiuchi/sensu-50675554)

## Sensuの特徴

[Sensu](http://sensuapp.org)は2011年に開発が開始された，オープンソースの監視フレームワークです．
広く使われている[Nagios](http://nagios.org)の置き換えを目的に，下記の特徴があります．
これらは，サーバ構成が頻繁に変わるクラウドに適したものとなっています．

  - sensu-client起動時に，監視サーバに自動登録．
  - 設定ファイルはJSON形式で，構成管理ツールでの生成を推奨．
  - 監視サーバと依存ミドルウェアのスケールアウトが可能．
  - sensu-apiを用いることで，フロントエンドとの連携が容易．

Sensuについては，技評やヤフーの記事が参考になります．

  - [第361回　Sensuでサーバーのリソースを可視化しよう … 技術評論社](http://gihyo.jp/admin/serial/01/ubuntu-recipe/0361)
  - [Sensu と Graphite による大規模インフラの監視 - Yahoo! JAPAN Tech Blog](http://techblog.yahoo.co.jp/operation/2014-sensu-and-graphite/)

## Sensuプラグイン

Sensuプラグインには，下記の2種類があります．

  - Check (クライアントサイド)
    - sensu-client上で動作し，sensu-serverからの指示で実行．
    - 監視の実行やメトリクスの測定を行い，結果をsensu-serverに送信．
  - Handler (サーバサイド)
    - sensu-server上で動作し，sensu-clientからのデータを処理．
    - アラートメールの送信や，メトリクスのNoSQLへの保存を行う．

公式では[Community Plugins](https://github.com/sensu-plugins)が公開されており，大抵のものが揃っています．
ただ，多くがRuby製でオーバーヘッドが大きいため，個人でGo言語によるプラグイン開発を進めています．

  - [Sensu with Golang - SlideShare](http://www.slideshare.net/hico_horiuchi/sensu-with-golang)
  - [Sensuプラグイン開発用のGo言語パッケージを作った - Qiita](http://qiita.com/hiconyan/items/4347900263290f24d011)

## Sensuの構成

私が所属する[最所研究室](https://air.eng.kagawa-u.ac.jp/)では，下記の構成で運用しています．

![image1.png](https://qiita-image-store.s3.amazonaws.com/0/58742/7751bef1-3275-c819-4baf-15444c527def.png "image1.png")

Server，Client，APIが基本的なコンポーネントで，[RabbitMQ](https://www.rabbitmq.com)と[Redis](http://redis.io)が依存するミドルウェアです．
可視化には[Elasticsearch](https://www.elastic.co/products/elasticsearch)と[Kibana](https://www.elastic.co/products/kibana)を利用しています．

他にも，私の趣味で開発したツールが幾つか動いています．

  - [Go言語でSensuのCLI「ohgi」を作った - Qiita](http://qiita.com/hiconyan/items/d82cee8e891bb5b0341e)
  - [Go言語でSensuのStatusPage「chikurin」を作った - Qiita](http://qiita.com/hiconyan/items/4794fe10ecfbac74af82)

## スイッチの監視

スイッチ監視用のsensu-clientを用意し，各スイッチの通信量を取得してみました
[metrics-snmp](https://github.com/hico-horiuchi/sensu-plugins-go/blob/master/metrics/metrics-snmp.go)を[Go言語](http://golang.org)で実装し，SNMPで下記MIBを測定しています．

  - `1.3.6.1.2.1.2.2.1.10.x`: 各ポートの受信バイト数
  - `1.3.6.1.2.1.2.2.1.16.x`: 各ポートの送信バイト数

メトリクスの測定結果を[handler-elasticsearch](https://github.com/hico-horiuchi/sensu-plugins-go/blob/master/handler/handler-elasticsearch.go)を使って保存し，Kibanaで可視化してみました．
青線が全ポート受信バイトの合計，黄線が全ポート送信バイトの合計です．

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/58742/897303e2-34a6-29f5-a857-1db5bcec2bf5.png "image3.png")

## もっと出来そうなこと

他にもSensuを使ったネットワーク監視として，どんなことが出来るか考えてみました．

  - スイッチにPINGを飛ばして死活監視
  - スイッチの全体/特定ポートの通信量が閾値を超えたら通知
  - 各ポートの通信量を個別に可視化

## JANOG37に向けて

JANOG37では「ネットワーク監視どうしてますか?」というタイトルで，ルータやスイッチの監視，トラフィックやパケットの可視化についてのBoFを応募しようと思っています．
cpp > クラス内での静的定数の宣言 > class MyAPI { public: static const int MAX_NAME_LENGTH; ... 

引用: C++のためのAPIデザイン by マーティン・レディ
第７章　パフォーマンス

> クラス内のこの定数を宣言できる場合は、もっと優れた方法がある。つまり、静的定数として宣言すればよいのだ（オブジェクトごとのメモリ容量に勘定されなくなる）。

```txt:myapi.h
class MyAPI
{
public:
    static const int MAX_NAME_LENGTH;
    static const int MAX_RECORDS;
    static const std::string LOG_FILENAME;
};
```

>これで、関連する.cppファイルでこれらの定数用の値を定義できる。

```cpp:myapi.cpp
const int MyAPI::MAX_NAME_LENGTH = 128;
const int MyAPI::MAX_RECORDS = 65525;
const std::string MyAPI::LOG_FILENAME = "filename.log";
```
Arduino Pro Miniでスケッチアップロード時のAuto Resetが最初の1回しか動かない

MacOSX上でArduino IDEからスケッチのアップロードをすると、USBケーブル接続直後の1回目のみ成功し、それ以降は失敗してしまう状況に悩まされていました。

どうやらApple純正FTDIドライバの問題だったようで、FTDI社のドライバを別途インストールしたところ解決しました。

## 環境

- Mac OS X 10.9.5 (Mavericks)
- Arduino IDE 1.6.5
- Arduino Pro Mini互換ボード
- FTDI FT232RLボード

# 現象

- FT232とPro Miniは下記のように接続
    - DTR - DTR
    - RX - TX0
    - TX - RX1
    - VCC - VCC
    - CTS - GND
    - GND - GND
- Arduino IDEからスケッチのアップロードをすると、USBケーブル接続直後の1回目のみ成功
- その後2回目のアップロードをすると下記エラーが出て書き込みに失敗する

```
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0x00
avrdude: stk500_recv(): programmer is not responding
（以下略）
```

# 調査

テスターを当ててみたところ、初回書き込み時にDTRがHIGHからLOWに落ちてATmega328Pがリセットされるものの、その後ずっとLOWのままになっているようで、2回目以降の書き込みではリセットがかからないようでした。

また、DTRの代わりにRSTを接続して試してみたものの、やはり同じ状況でした。

同じ構成のままWindows7環境で確認してみたところ、こちらは何度でもアップロードできました。

つまり、MacOSX同梱のFTDIドライバが怪しいのでは…？

# FTDI社のドライバをインストール

というわけでFTDI社純正ドライバをインストールしてみました。

FTDI社の[VCPドライバ ダウンロードページ](http://www.ftdichip.com/Drivers/VCP.htm)から「Mac OS X 10.9 and above (64 bit)」をダウンロードします。Mavericks(10.9)以降ということなので、おそらくYosemiteにも対応していると思います。

ドライバをインストールして再起動すると、FTDI社のドライバが有効になります。FT232RLモジュールをMacにつないだ状態で下記コマンドを打つと、2つのドライバの情報が表示されます。

```
$ kextstat | grep -i ftdi
  131    0 0xffffff7f80f08000 0x7000     0x7000     com.apple.driver.AppleUSBFTDI (1.0.1b3) <116 36 5 4 3>
  132    0 0xffffff7f821a6000 0x7000     0x7000     com.FTDI.driver.FTDIUSBSerialDriver (2.3) <116 36 5 4 3 1>
```

この状況ではFTDI社ドライバが有効になるようで、無事Auto Resetが何度でもできるようになりました。


他の方の記事を見ると、以前は明示的にAppleのドライバを無効にする必要があったようですが、現在では特に何もせずにうまく動くようです。
Mac OSXにanyenv/exenvでElixirをインストールする

[Elixir](http://elixir-lang.org/)の[Getting Started](http://elixir-lang.org/getting-started/introduction.html)をやろうと思いまして、そのメモです。

# はじめに
まずはGetting Startedの[1.Introduction](http://elixir-lang.org/getting-started/introduction.html)です。
内容は次の3つです。

* Installation
* Interactive mode
* Running scripts

# Installation
公式サイトの[インストールガイド](http://elixir-lang.org/install.html)でMac OSXは`brew install elixir`でインストールするようになってます。
楽ちんでいいですが、やっぱりバージョン切り替えとかできたほうがいいよなーってことで[exenv](https://github.com/mururu/exenv)を使います。
最近[anyenv](https://github.com/riywo/anyenv)でexenvをインストールできるようになったみたいなので、exenvのインストールにはanyenvを使います。

anyenvにerlenvとexenvが入ったのは最近っぽいので、アップデートしておきましょう。
（anyenv-updateがインストールされてる必要があります）

```bash
anyenv update
```

## Erlangインストール
ElixirにはErlangが必要なので、まずはErlangからインストールしていきます。
Erlangもanyenv経由の[erlenv](https://github.com/talentdeficit/erlenv)で管理しますが、なんとerlenvにはインストールコマンドがまだないため自分でビルドします。

erlenvをインストールします。

```bash
anyenv install erlenv
exec $SHELL -l
```

Erlangのビルドにあったほうがいいっぽいものをインストールしておきます。

```bash
brew install unixodbc wxmac fop
```

Erlangをerlenv配下の`releases`ディレクトリにインストールします。
anyenv環境下では、`~/.anyenv/envs/erlenv/releases`になります。

```bash
wget http://www.erlang.org/download/otp_src_18.2.1.tar.gz
tar zxf otp_src_18.2.1.tar.gz
cd otp_src_18.2.1
./configure --prefix=$HOME/.anyenv/envs/erlenv/releases/18.2.1
make -j 4
make install
erlenv global 18.2.1
erlenv rehash
```

ちゃんとインストールできてるか確認してみます。

```bash
$ erl
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V7.2.1  (abort with ^G)
1> halt().
```

最後に、ソースファイルはもう使わないので削除しておきます。

```bash
cd ..
rm -rf otp_src_18.2.1 otp_src_18.2.1.tar.gz
```

## Elixirインストール

exenvをインストールします。

```bash
anyenv install exenv
```

exenvにはインストールがあります。
最新版の1.2.3をインストールします。

```bash
exenv install 1.2.3
exenv global 1.2.3
```

インストールの確認にバージョンを表示してみます。

```bash
$ elixir -v
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.2.3
```

# Interactive mode
```bash
$ iex
Erlang/OTP 18 [erts-7.2.1] [source] [64-bit] [smp:4:4] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.2.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> 40 + 2
42
iex(2)> "hello" <> " world"
"hello world"
iex(3)>
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution
a
```

# Running scripts
```bash
$ cat simple.exs
IO.puts "Hello world
from Elixir"

$ elixir simple.exs
Hello world
from Elixir
```

# 参考
* [Mac OS Xに**env管理ツールのanyenvをインストール](http://qiita.com/nownabe/items/72096340ed59e3b3e348)
cocos2d-x ローカルデータの暗号化、SQLCipherを爆速化する方法

## SQLCipherについて
SQLiteを暗号化してくれるツールです。
cocos2d-xなんかでデバイスにデータを保存する場合、管理を楽にする為にSQLiteを使い、チート対策の為にSQLCipherで暗号化している方もいらっしゃるかと思います。

SQLCipherはビルド済みライブラリを使用する場合は有償ですが、自分でビルドしてライセンスを明記すれば無償で商用利用可能です。
導入方法は多くの方が執筆しており、特に困ることは無いと思うので割愛します。

ただ、SQLCipherを利用すると、利用していない時と比べてアクセス速度が格段に落ちるので、何か出来ないかとドキュメントを読んでみました。

## keyの形式を変えて爆速に

結論から言うと、自由なパスフレーズは渡せなくなるものの、sqlite3_keyに渡す文字列を変更すると爆速になりました。

```
-    string key = 'passphrase';
     sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));

+    string key = "x'2DD29CA851E7B56E4697B0E1F08507293D761A05CE4D1B628663F411A8086D99'";
     sqlite3_key(db, key.c_str(), static_cast<int>(strlen(key.c_str())));
(keyは独自のものに変えてください)
```

keyを任意のパスワードでは無く、64文字の16進数で与えます。公式ドキュメントによると、文字数はきっちり64文字である必要がある様です。
https://www.zetetic.net/sqlcipher/sqlcipher-api/#key
>Example 2: Raw Key Data (Without Key Derivation)
>Alternatively, it is possible to specify an exact byte sequence using a blob literal. With this method, it is the calling application's responsibility to ensure that the data provided is a 64 character hex string, which will be converted directly to 32 bytes (256 bits) of key data.

アプリを触って感じる範囲では、通常のSQLiteを使用している場合と動作速度はほぼ変わりませんでした。

## セキュリティ面と動作について
そもそもSQLCipherが遅い理由は、パスフレーズにPBKDF2関数を繰り返し(デフォルトだと64,000回)適用することでセキュリティ強化している為です。
ブルートフォース攻撃と辞書攻撃を防ぐ為ですが、パスフレーズにこだわりが無く、カジュアルに暗号化する場合はRaw Keyを使用する方法で良いと思います。

上記の様にRaw Keyを使う以外の方法として、kdf_iterの数値を変更することでPBKDF2関数の適用回数を減らせば、
任意のパスフレーズを使いながら大幅に速度を変えることが可能かも知れません(試してません)。
ただし、当然セキュリティ面は弱くなると思います。
https://www.zetetic.net/sqlcipher/sqlcipher-api/#kdf_iter
>As previously noted, SQLCipher uses PBKDF2 key derivation to strengthen the key and make it resistent to brute force and dictionary attacks. The default configuration uses 64,000 PBKDF2 iterations (effectively 256,000 SHA1 operations). PRAGMA kdf_iter can be used to increase or decrease the number of iterations used.

##免責的なもの
私自身はセキュリティのプロでも何でもないので、この方法の結果損失を生じても保証し兼ねます。申し訳ありません。
公式ドキュメントを参照し、自己責任で実装していただければと思います。
一応頑張って調べたので大丈夫だとは思います。
Scalaの末尾再帰(tailrec)のサンプルコード

末尾再帰の関数のサンプルコードです。再帰関数を使うより、Listの`map`や`flatMap`などのAPIを使ったほうがシンプルに書けるケースがあります。


## リストの要素に1を足すサンプル

```scala
@tailrec
def increment(set: Seq[Int], result: Seq[Int] = Seq()): Seq[Int] = {
  set match {
    case Nil          => result
    case head :: tail => increment(tail, result :+ head + 1)
  }
}

println(increment(Seq(1, 2, 3)))
//> List(2, 3, 4)
```

ちなみに、この程度であれば`map`のほうが簡潔。

```scala
Seq(1, 2, 3).map(_ + 1)
```

## ツリー構造を平らにするサンプル

```scala
sealed trait Node {
  def filename: String
}
case class Directory(filename: String, children: Set[Node]) extends Node
case class File(filename: String) extends Node

val fileTree = Set[Node](
  Directory("Users", Set(
    Directory("alice", Set(
      File(".bashrc"),
      Directory(".Trash", Set()),
      Directory("Desktop", Set(
        File("photo.jpg"),
        File("document.docx"),
        File("spreadsheet.xlsx")
      ))
    ))
  ))
)

@tailrec
def flattenFilenames(tree: Seq[Node], filenames: Seq[String] = Seq()): Seq[String] = {
  tree match {
    case Nil => filenames
    case File(filename) :: nodes =>
      flattenFilenames(nodes, filenames :+ filename)
    case Directory(filename, children) :: nodes =>
      flattenFilenames(children.toList ::: nodes, filenames :+ filename)
  }
}

println(flattenFilenames(fileTree.toList))
//> List(Users, alice, .bashrc, .Trash, Desktop, photo.jpg, document.docx, spreadsheet.xlsx)
```
c++ builder XE4, 10.2 Tokyo > 別ソフトの起動 > ShellExecuteW(NULL, L"open", appPath.c_str(), param.c_str(), NULL, SW_SHOWNORMAL);

```txt:動作確認
C++ Builder XE4
OS: Windows7
```

現在のソフトから別ソフトを起動するには。

```cpp
String appPath = L"C:\\Windows\\notepad.exe";
String param = L"/param1=abcde";

if (FileExists(appPath) == false) {
    return; // not found
}

ShellExecuteW(NULL, L"open", appPath.c_str() , param.c_str(), NULL, SW_SHOWNORMAL);
```

パラメータ付きで起動したい場合には paramにパラメータ(例: L"/param=abcdef")を記載しておく。

<hr>
管理者権限で起動したい場合は以下が参考になる。
http://mrxray.on.coocan.jp/Delphi/plSamples/490_CmdPrompt1.htm


### 10.2 Tokyo
(追記 2017/12/26)

```txt:動作環境
Rad Studio 10.2 Tokyo Update 2
```

10.2 Tokyoでも同じ動作となることを確認した。
うんざりするほど正解パスが長い迷路の作り方

# 概要

迷路を自動作成すると、正解パスがあまり複雑にならないことが多い。そこで、迷路の全領域にわたって無駄に歩かされる迷路を作りたい。

最終的にはこんな迷路を作る。

![maze.png](https://qiita-image-store.s3.amazonaws.com/0/79744/7fab890f-cd70-73a4-234b-8d2ffc2ffa91.png)

# 正解パスの作成

とりあえず、最初に正解パスを作る。正解パスが与えられたら、それが正解パスとなるような迷路は[クラスタリングアルゴリズム](http://apollon.issp.u-tokyo.ac.jp/~watanabe/tips/maze.html)を使えば良い。

で、まずこんな正解パスを与え、始点と終点を固定したまま、これを変形していくことにする。

![r0000.png](https://qiita-image-store.s3.amazonaws.com/0/79744/6a2271af-cf43-1b49-ab91-15232f2efa0a.png)

変形の仕方は以下の二種類。

まずは90度に曲がっている箇所をひっくり返すフリップ。
![flip.png](https://qiita-image-store.s3.amazonaws.com/0/79744/3eca37f4-b178-bd61-c1fa-7d1118cb000f.png)

２つ目は、辺をひっぱって伸ばすストレッチ。

![stretch.png](https://qiita-image-store.s3.amazonaws.com/0/79744/c98e2c5b-e618-d09a-bb1f-404ac76270ef.png)

上の例では元が一直線になっているが、曲がっていても可能であれば伸ばすようにしている。

上記の操作をランダムに繰り返せばいずれ正解パスが迷路をうめつくすだろう、そう思ってやってみると・・・

![r0022.png](https://qiita-image-store.s3.amazonaws.com/0/79744/d4484dd2-33a9-8e94-51b5-d89eb569cb32.png)

こんな感じに、最初に与えたパスが太っていく感じになる。確かに最終的には迷路をうめつくすのだが、正解パスが左右にうねうねしながら左下から右上にすすんでいく形になり、あまり「迷路全体を歩かされている感」が出ない。

# フラクタルの概念を導入

そこで、まずより粗いスケールで全体を埋め尽くし、少しずつ格子を細かくしていくことにする。こんな感じ。

![fn1_s.png](https://qiita-image-store.s3.amazonaws.com/0/79744/fe3aeed9-a987-242b-e9a6-e010dcec3eb6.png)
![fn2_s.png](https://qiita-image-store.s3.amazonaws.com/0/79744/bf58fff8-3c5a-1b87-4c60-98ad095a4d6f.png)
![fn3_s.png](https://qiita-image-store.s3.amazonaws.com/0/79744/8d3afdf4-35f0-9e71-f87f-a6431716e8f5.png)

で、できた「埋め尽くしたパス」を、二段階細かくした上で、上記のフリップ、ストレッチを繰り返すことで最終的な迷路を作ると、最初に示したような迷路ができる。

# 迷路作成プログラム

迷路作成プログラムを[Github/painful_maze](https://github.com/kaityo256/painful_maze)に上げておいたので、興味のある方は試されたい。

# できる迷路の性質

この迷路の性質は、「正解パスが通る道の長さが迷路全体に占める割合」で表現される。この割合が100%なら、全く分岐がなく、正解パスが(もはやそう呼べないが)迷路をうめつくす。割合が小さくなれば、正解パスは短くなるが、分岐は増える。

フラクタルの概念を取り入れているため、作ることができる迷路が2のべき乗になる。さらに、最後に4倍にしてから迷路を複雑化させているため、正解パスの割合の最小は25%になる。また、適当に伸ばしているので、割合の最大値はせいぜい95%程度で、100%の迷路は作ることができない。

# おまけ

[Github/painful_maze](https://github.com/kaityo256/painful_maze)では、正解パスを作る過程を表示する機能をつけてある。興味のある人は

    $ make uneune.gif
    $ make fracune.gif

を試されたい。パスがうねうね伸びていく過程をアニメーションgifで出力する(要ImageMagickのconvert)。
PHPビルトインサーバでWordpressを動かす際にHomebrewでMySQLだと動かない問題


MacでWordpressを動かそうとしたらMAMPを入れると簡単にできるというが、それなりにWordpressを動かすまで設定するのは面倒臭い

そこでPHP5.4からサポートしたPHPビルトインサーバの登場だ
こんな感じで、ホスト名とポートを指定してやればローカルサーバ立ち上がり、PHPが実行可能になりブラウザから動作を確認することが出来て超便利

```
php -S localhost:8000
```

さてこの超便利なビルトインサーバなんですが、Wordpressをローカルで立ち上げるようなMySQLに接続することをやらせようとすると、どうもDB接続エラーが出る。

MySQLに接続するDB名や、ユーザ名、パスワードはあっているのに、接続エラー出てしまう

簡単なDB接続するPHPのコードでもエラーが発生してしまう。


原因を調査すると、MySQLをHomebrewでインストールしている場合、このような現象が発生していることがわかった。

## PHPのMySQL接続用のソケットを確認する

### 現在動いているMySQLの接続用のソケットを格納する

```
# MySQLソケットプロセスの場所を確認
> mysql_config --socket
/tmp/mysql.sock
```

/tmp.sysql.sock で実行している

### PHPの接続しているMySQLソケットプロセスの場所を確認

PHPはMySQLの接続ライブラリを組み込みで持っていて、少なくとも素のWordPressではこいつを利用してDB接続しているようだ

PHPが接続詞しに行くMySQLソケットプロセスの場所を確認する

```
> php -i | grep socket

mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
mysqli.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
pdo_mysql.default_socket => /var/mysql/mysql.sock => /var/mysql/mysql.sock
```

とこのように、見に行くソケットが違うためPHPがMySQLに接続できないことがわかる

* /tmp/mysql.sock
* /var/mysql/mysql.sock


## PHPのMySQL接続ソケットの場所を変更する

### PHPの設定ファイルの位置を確認する

以下のファイルを作成してビルトインサーバを起動する

```info.php
<?php
phpinfo();
?>
```

```
> php -S localhost:8000
```

ブラウザでlocalhost:8000/info.phpにアクセスし、
Loaded Configuration Fileの項を確認する

オレの場合は空だったので、デフォルト値を見ていることになるだろう。

### PHP設定ファイルの作成

/etcディレクトリにはphp.ini.defaultと言うファイルがあり、デフォルト設定があるのでとりあえずこれをコピーし、必要部分書き換える

```
sudo cp /etc/php.ini.default /etc/php.ini
sudo emacs /etc/php.ini
```

以下の設定箇所の=の右側にHomebrewで入れたMySQLが作るソケットプロセスのパス'/tmp/mysql.sock'を入れてやる

```
mysql.default_socket = '/tmp/mysql.sock'
mysqli.default_socket = '/tmp/mysql.sock'
pdo_mysql.default_socket = '/tmp/mysql.sock'
```


もう一度PHPのMySQL接続するソケットプロセスの場所を確認すると、変更されていることがわかる

```
> php -i | grep socket

mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
mysqli.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock
```

あとはビルトインサーバでもWordpressが動くぜ。これでも動かなかったらMysqlの設定か、DB接続情報が間違っているはず
C#でXOR交換が使えなかった話

ソートとかで2つの変数の値を入れ替えるのはよくあることですが
C#ではなぜかXORで交換するアルゴリズムが(VS2010で)うまく動作しませんでした。
(この際一時変数を使うのが速いとか言う話は置いておきます)
まず
### Cでの実装
----
```c:xorswap.c
#include <stdio.h>
int main(void)
{
    int a, b;
    a = 45450721;
    b = 19198080;

    printf("RawData a:%d b:%d\n", a, b);

    a ^= b ^= a ^= b;

    printf("Swapped a:%d b:%d\n", a, b);

    return 0;
}
```
こんな感じ。
### Cの結果
----
RawData a:45450721 b:19198080
Swapped a:19198080 b:45450721

よきに。

### CSharpでの実装
----
```csharp:xorswap.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
    class Program
    {
        public static void Main(string[] args)
        {
            int a = 45450721;
            int b = 19198080;

            Console.WriteLine("RawData a:{0} b:{1}", a, b);

            a ^= b ^= a ^= b;

            Console.WriteLine("Swapped a:{0} b:{1}", a, b);

            Console.ReadKey();
        }
    }
}
```
### CSharpの結果
RawData a:45450721 b:19198080
Swapped a:0 b:45450721

良くわからない動作ですね。
XOR交換において0になるというのはaとbが同じアドレスの時だと思いますが、
違う変数なので当然アドレスは違うでしょうし、bは正常に交換が終了しています。
### バラしてみる
----
```csharp:a.cs
a ^= b ^= a ^= b;
```
を

```csharp:b.cs
    a ^= b;
    b ^= a;
    a ^= b;
```
にしてみます。

### バラした結果
RawData a:45450721 b:19198080
Swapped a:19198080 b:45450721

C#ちゃんは一気になんかやると死ぬっぽいというのがわかります。

### unsafeしてみる
----
ダメでした。

### もしかしてC#は
----
式中に同じ変数2回出て来た時に値が変わってると未定義動作なのではないかと思って

C

```c:ipp.c
#include <stdio.h>

int main(void)
{
    int i = 2;
    i += (i += 1);
    printf("%d\n", i);
    return 0;
}
```
結果は
6

CSharp

```csharp:ipp.cs
using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
    class Program
    {
        public static void Main(string[] args)
        {
            var i = 2;

            i += (i += 1);

            Console.WriteLine("{0}", i);

            Console.ReadKey();
        }
    }
}
```
5

ということは、要するにiの値が式の途中で変更されても一番左のiの参照すべき値が更新されずに2のままで、
+1されたiの値である3と足し合わされて5になったと推測できます。
つまり元々の a ^= b ^= a ^= b;では、一番左の参照すべきaの値(a = a ^ (~)のシンタックスシュガーなので2番目のaのこと)
は式全体を評価する前からC#では決まっているということになります。
なのでXOR交換が使えないと。なるほどね。
### 解決方法
----
要するに一番左じゃなくしてあげればいいので

```csharp:correct.cs
a = b ^ (a ^= b ^= a ^= b);
```
とすればよいです。

[追記]
一番左だけじゃなかったみたいですね。+=展開するときに変数を読みに行かないであらかじめ値が固定になるっぽいです。
あとa = b ^ (a ^ (b ^= a ^= b)); のほうが速いです。
でも一時変数を使って交換した方が2倍以上速いです。
進捗どうですかブームに乗り遅れてみる

gaucheで。
scheme初心者なのでもうちょい色々な実装見てみたいなぁ（チラ

```scm
(use util.queue)
(use math.mt-random)
(define mt (make <mersenne-twister> :seed (sys-time)))

(define (doudesuka? arr-src)
  (define (get-one lst)
    (let loop ((c (mt-random-integer mt 4)) (arr lst))
      (if (= c 0)
          (car arr)
          (loop (- c 1) (cdr arr)))))
  (define q (list->queue (list (get-one arr-src)
                               (get-one arr-src)
                               (get-one arr-src)
                               (get-one arr-src))))
  (let loop ((d "") (sum-chars 0) (chk-lst q))
    (if (equal? (queue->list q) arr-src)
        (begin
          (map (lambda (x) (set! sum-chars (+ sum-chars (string-length x)))) arr-src)
          (map (lambda (x) (display x)) (queue->list q))
          (newline)
          (print sum-chars "文字で煽られました。" arr-src "!!!"))
        (begin
          (display (set! d (dequeue! q)))
          (loop d (+ sum-chars (string-length d)) (enqueue! q (get-one arr-src)))
          ))))

(doudesuka? '("進捗" "どう" "です" "か"))
```

>進捗進捗進捗進捗どう進捗どうですどうどうどうどうです進捗ですですどうかどう進捗か進捗か進捗かかか進捗進捗かかどうですかですかどうですどうかですどう進捗進捗かどう進捗ですか進捗ですですかどう進捗ですですかです進捗進捗か進捗か進捗か進捗どう進捗です進捗進捗です進捗ですかかどうどう進捗か進捗どう進捗ですどう進捗か進捗進捗ですどう進捗かどうどうどう進捗どうですか
>178文字で煽られました。(進捗 どう です か)!!!
解像度変換方式(PhotoshopとImageMagickの比較)


# はじめに
PhotoshopとImageMagickとで解像度変換処理に差があるのか調べたので、まとめる。
NearestNeighbor(NN)とBiLinear(BL)を対象とする。

# 環境
Photoshop: PhotoshopCC(2015) 32bit版 (20150529.r.88)
ImageMagick: ImageMagick-6.9.1-4-Q16-x86-dll

# 対象画像
640x480のグレースケール画像。
一番左端から右端に向かって階調が連続している。
これを8bitRAW画像として保存。

![sample-640x480.png](https://qiita-image-store.s3.amazonaws.com/0/52878/108537ea-f867-2808-f8f6-361db0a7c5c2.png)

# 比較条件
まずは横軸方向での解像度変換を実施する。

|解像度変換方式|
|:---------------|
|50%NN|
|50%BL|
|33%NN|
|33%BL|
|200%NN|
|200%BL|

# 解像度変換手法
## Photoshop
画像を開き、メニュー「イメージ」-「画像解像度」にて変換する。
開いたウィンドウにて変換方式を指定する。


## ImageMagick
以下のコマンドにて解像度変換を行う。

```text
convert -size 640x480 -depth 8 gray:sample-640x480.raw -filter point -interpolate Nearest -distort Resize 50%x100% -depth 8 gray:sample-50per-320x480-IM-NN.raw
convert -size 640x480 -depth 8 gray:sample-640x480.raw -filter point -interpolate Bilinear -distort Resize 50%x100% -depth 8 gray:sample-50per-320x480-IM-BL.raw
など
```

# 結果
|解像度変換方式|Photoshop/ImageMagickの比較|
|:---------------|:-:|
|50%NN|一致|
|50%BL|一致|
|33%NN|一致|
|33%BL|不一致|
|200%NN|一致|
|200%BL|不一致|

33%Bilinearは、不一致。画像中に差が点在している。
整数倍の処理(50%と200%)は一致すると思っていたが、200%のBilinearが不一致であった。
ImageMagickでの解像度変換では、画像の右端の1ピクセル列が191(=0xBF)となっており、Photoshopでの結果255(=0xFF)と差があった。
NSOutlineView の使い方

# OSX の特殊なディレクトリであるパッケージの内容を表示するアプリの例。

![x.tiff](https://qiita-image-store.s3.amazonaws.com/0/73493/7d1a7448-cbf6-4ec3-99d2-144751c6e9ef.tiff)

# プロジェクトの作成
Cocoa Application を Use Storyboards と Document Based にチェックして作成する。
Tragets - Info - Document Types で
　Extensions を指定する。（この例では xcodeproj）
　Document si distributed as a bundle をチェックする。



# Documentクラスに書き加える内容

```
var	fileWrapper	= NSFileWrapper( directoryWithFileWrappers:[:] )
override func
readFromFileWrapper(
	fileWrapper		: NSFileWrapper
,	ofType typeName	: String
) throws {
	self.fileWrapper = fileWrapper
}
```


# NSFileWrapper クラスの拡張

```
extension
NSFileWrapper {
	func
	children() -> [ NSFileWrapper ]? {
		if let wFWs = fileWrappers {
			var v = [ NSFileWrapper ]()
			for ( _, value ) in wFWs {
				v.append( value )
			}
			return v
		} else {
			return nil
		}
	}
	func
	isLeaf() -> Bool {
		return !directory
	}
}
```

# Storyboard
NSTreeController と NSOutlineView を配置

* NSTreeController の Key Paths

* * Children に chidren

* * Leaf に isLeaf

* * (Count は空白でいい)


* NSOutlineView

* * cell based にする。

* * Columns を１に


# バインディング
* NSTreeController / Content Array

* * Bind to ViewController

* * Controller key / 空白

* * Model key Path / view.window.windowController.document.fileWrapper.children

* NSOutlineView / TableColumns

* * Bind to Tree Controller

* * Controller Key / arrangedObject

* * Model Key Path / filename


# ソース

[GitHub　https://github.com/Satachito/Samples　上に置いておきました。](https://github.com/Satachito/Samples)