OmniAICreator/Qiita-1.07M huggingface dataset:
[memo] Console2 + git bash やめました。

Console2 + git bash を使っていたが、やめた。不満だったのは、

- single quotation が入力できなかった (autohotkey で key 排列をいじっているせいか？)
  - -> autohotkey の script の書き方が原因だった。vk, sc での記述をやめたらできるようになった。
- 日本語が入力できなかった
- 環境変数 (特に path) の設定・表示が simple でなかった。

いまは gnupack の cygwin を使っている。上記不満は解消された。ただ、 `git push` ができなくて困っている。 `git push` だけは git bash でやっている。

# memo
確か、 cygwin と git bash で違う git を起動していた気がする。これが原因の可能性がある。

`which git` すると
- git bash: /bin/git
- cygwin: /c/Users/`<username>`/Appdata/Local/Programs/Git/bin/git

-> apt-cyg で git を install した。すると、

```
$ which git
# => /usr/bin/git
```

となった。
winAppDev > error level > emerg / alert / crit / error / warn / notice / info / debug

http://www.adminweb.jp/apache/log/index4.html

> エラーログにはどのレベルまでのエラーを記録するかを8段階で指定することが可能です。

```
LogLevel 記録するレベル
```

emergなどの8種類のレベルを設定しているようだ。
S3にアップロードしたファイルをLambdaで処理してDynamoDBに入れる


S3 -> Lambda -> DynamoDBという流れでデータを放り込む算段です。データ量によってはタイムアウトするかも（タイムアウトしてて手元では動いてません…）。

# 前提

* IAMロールなどは適切に設定してください


# LambdaでS3のイベントを処理するサンプル

```javascript
var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var dynamodb = new aws.DynamoDB({region: 'ap-northeast-1'});

exports.handler = function(event, context) {
    // Get the object from the event and show its content type
    var bucket = event.Records[0].s3.bucket.name;
    var key = event.Records[0].s3.object.key;
    var params = {
        Bucket: bucket,
        Key: key
    };
    
    // Retrieve object from S3
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
                ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
        } else {
            // ファイルのバイナリは data.Body に入っている
            var string = data.Body.toString('utf-8');
            var payload = JSON.parse(string);
            
            // 型を付ける必要があるかも
            // Object.keys(payload).forEach(function(key) {
            //     payload[key] = {'N': String(payload[key])};
            // });
        
            dynamodb.putItem({"TableName":"s3-upload-history",
                "Item": payload
            }

            context.succeed(data.ContentType);
        }
    });
};
```


# Lambdaの設定

* Event Source Type -> S3
* Bucket -> 任意
* Event Type -> Object Created
* Prefix -> 任意のパス
* Suffix -> 任意の拡張子
スラッシュの重複無くファイルパスを結合させる

# ファイルパスを結合する
ファイルパスを結合させる時に

```php

$pass_A = "../php/abc/";
$pass_B = "/xyz/qiita.php";

$file_pass = $pass_A.$pass_B;

```
なんてやってしまうと、"/"スラッシュが重複してしまい

```
../php/abc//xyz/qiita.php
```

という事になってしまう。

こうならないように、パス同士を結合させる場合の簡単な関数を作りました。


```php

//結合させたいパス
$pass_arry = array($pass_A,$pass_B,$pass_C);

function stick_file_pass($pass_arry) {
	$ret_pass	=	"";//結果の格納用変数
	$trim_str	=	DIRECTORY_SEPARATOR;//ディレクトリの区切り文字

	foreach ($pass_arry as $value) {
		if ($ret_pass == "") {
			$ret_pass	=	$value;
		}else {
			//末尾と先頭(結合部分の区切り文字)をトリム
			$ret_pass	=	rtrim($ret_pass,$trim_str);
			$value		=	ltrim($value,$trim_str);
			//改めて結合部分に区切り文字を入れる
			$ret_pass	=	$ret_pass.$trim_str.$value;
		}
	}
	return $ret_pass;
}
```
Marshal.ReleaseComObject を using ステートメント風に確実に呼び出す

**そもそも必ずしも `Marshal.ReleaseComObject` を呼び出すべきではないというお話もあるようです。またまとめます。**

# COM の呼び出し

```csharp
TaskScheduler taskScheduler = null;
try
{
    taskScheduler = new TaskScheduler.TaskScheduler();
    ITaskFolder folder = null;
    try
    {
        folder = taskScheduler.GetFolder("");
        // 何かする
    }
    finally
    {
        Marshal.ReleaseComObject(folder);
    }
}
finally
{
    Marshal.ReleaseComObject(taskScheduler);
}
```

吐き気がする……吐き気がしない？

# ぼくがかんがえたさいきょうのかいけつさく

```csharp
public static class ComObject
{
    public static void Using<T>(T obj, Action<T> action)
    {
        try
        {
            action(obj);
        }
        finally
        {
            // Marshal.IsComObject による判定はメソッドの先頭でおこない例外をスローするのもアリかも
            if (!ReferenceEquals(obj, null) && Marshal.IsComObject(obj))
            {
                Marshal.ReleaseComObject(obj);
            }
        }
    }
}
```

こういうのを作っておいて、こうじゃ！

```csharp
ComObject.Using(new TaskScheduler.TaskScheduler(), taskScheduler =>
{
    taskScheduler.Connect(null, null, null, null);

    ComObject.Using(taskScheduler.GetFolder(""), folder =>
    {
        // 何かする
    });
});
```

……もう少しなんかいい感じにならないかなぁ。

# (参考) 検討したけどボツにした案

```csharp
using (var taskScheduler = ComObject.Create(new TaskScheduler.TaskScheduler()))
{
    taskScheduler.Value.Connect(null, null, null, null);

    using (var folder = ComObject.Create(taskScheduler.Value.GetFolder("")))
    {
        // 何かする
    });
});
```

`.Value` がウザい……けど、素直っちゃ素直。

`ComObject` の生成をコンストラクタじゃなくてファクトリメソッドにしているのは型引数に対して型推論を効かせたいからです。`Tuple.Create` と一緒ですね。
 
# ネストを防げる妙案！

はぇ～氏からこんな提案を頂きました。

<blockquote class="twitter-tweet">@chocolamint こんな感じとか？ <a href="https://gist.github.com/sayurin/ee9b87ab8786489a438a" target="_blank">https://gist.github.com/sayurin/ee9b87ab8786489a438a</a>
結局のところ、.NETのオブジェクト参照とCOMのオブジェクト参照が一致しないから、GCで回収したくても未使用か判定できないとか、そういう。</p>&mdash; はぇ～ (@haxe) <a href="https://twitter.com/haxe/status/636719585215975424">August 27 ,2015</a></blockquote>

<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
proxmox3.4でpuppetmaster構築

* proxmox3.4(debian7)にて実施。ホスト名を`prime.local`とする。
* [以前CentOS用に書いた記事]((http://qiita.com/tukiyo3/items/54c32ecfb8cc6cd76073))があるが、debianでも実施してみた。

## インストール

```bash:
apt-get install -y puppetmaster git
```

## 設定

* rootで操作

```bash:自分自身が登録されていることを確認
puppet cert --list --all
```

```bash:
cd /etc/puppet/
git config --global user.name tukiyo3
git config --global user.email tukiyo3@gmail.com
git init && git add -A && git commit -m "init"
cd manifests
```

## パッケージのインストール

```bash:/etc/puppet/manifests/site.pp
node 'prime.local' {
  package { ['w3m', 'vim', 'nkf', 'git']:
    ensure => installed,
  } 
}
```

```bash:動作確認
# テスト実行
puppet agent --server=prime.local --test --verbose --noop
# オプション短縮形
puppet agent --server=prime.local -t -v --noop
```

* もしroot権限のため実行できないと出た場合は`--enable`オプションをつける。

```bash:適用
puppet agent --server=prime.local -t -v
```

* port 8140 を使う。[puppet - puppetmaster behind firewall - Server Fault](http://serverfault.com/questions/487774/puppetmaster-behind-firewall)

## ファイル配布(proxmox用)

```bash:ディレクトリ作成
mkdir -p /etc/puppet/files/proxmox
```

```bash:/etc/puppet/files/proxmox/pve-enterprise.list
#deb https://enterprise.proxmox.com/debian wheezy pve-enterprise
deb http://download.proxmox.com/debian wheezy pve-no-subscription
```

```bash:/etc/puppet/manifests/site.pp
node 'prime.local' {
  file { '/etc/apt/sources.list.d/pve-enterprise.list':
    source => "puppet:///proxmox/pve-enterprise.list",
    # ファイルが更新された時にapt-get updateする
    notify => Exec['apt-update'],
  }
  # 定義
  exec { "apt-update":
    command => "/usr/bin/apt-get update"
  }
}
```

```bash:/etc/puppet/fileserver.conf
[proxmox]
  path /etc/puppet/files/proxmox
  allow *.local
```

* fileserver.confを書き換えはpuppetmasterの再起動は不要。

```bash:~/bin/puppetrun.sh
#!/bin/sh
set -eu
SERVER=prime.local

puppet agent --server=$SERVER -t -v --noop
echo "press enter to execute.."
read ENTER
puppet agent --server=$SERVER -t -v
```

```bash:
sh ~/bin/puppetrun.sh
```
IE8でbaseタグを使う方法

IE8でbase要素を使おうとしたらハマってしまったので備忘録に。。。

```html
<base href="www.example.com">
 <!--[if lt IE 8]><script type="text/javascript">
(function() {
  var base = document.getElementsByTagName('base')[0];
  base.href = base.href;
})();
</script><![endif]-->
```

[こちら](http://stackoverflow.com/questions/3926197/html-base-tag-and-local-folder-path-with-internet-explorer)のStackOverflowを参考にさせていただきました。
hrefにhrefを入れなおすと上手く動作するみたいです。
挙動が謎すぎます。。。(´・ω・｀)
[Node.js]sequelizeのmigrationメモ

Node.jsのMySQLとかのO/Rマッパーであるsequelizeのmigrationについてざっくりメモ。

## 何ができるの？

以下コマンドでmigrationsディレクトリ内にあるファイルを実行してmigrationしてくれる。

```
sequelize db:migrate
```

## どんな仕組みで動いてるの？

どうもmigrations/[日付]-[適当な名前]-migration.jsもしくは一番若いファイル1つ実行するらしい(後者はバグな気がしないでもないが)。

とりあえず以下コマンドで作られたファイルに処理を書きましょう。

```
sequelize migration:create
```

これを実行すると、migrations/20150827083024-unnamed-migration.jsみたいなファイルが生成されます。
実際のmigrationではこれの日付が若い順に実行されます。

## はまったこと

とりあえずここにファイル作ればいいからと言われてそれに倣ってmigrations/にファイルを作ったけど、なんか1つしかmigrationが走らなくて、うんうん唸ってた。
ググっても日本語の記事はヒットしないし、英語でnodeのsequelizeのmigrationでmigrationsディレクトリ以下のファイルが一つしか実行されない不具合についてみたいなググり方分からないしで結構つらかった。

ちなみにmigration失敗したとき戻す処理とかあるので、順番大事=ファイル名でちゃんと連番になる仕組みがないと詰むよねということで、命名規則には納得できるが、未だに1ファイルだけ実行された謎の現象があるので、そこについてはソースの中を調べないといけないかな。でも例え調べても正規手順でやれとしか言いようがないのでまぁいいかなと思ってます。以上。
typoしてpushしてしまったコミットコメントを修正してpushしなおす方法

# はじめに

チーム内の共有ブランチから自分の作業ブランチを切って作業していた際、
コミットコメントを打ち間違えてしまったのでコメントを修正します。
コミットの履歴の改変になるので作業は注意をしながら行います。
また、共有ブランチでは行わないようにしてください。

# コミットをやり直す方法

## 使用するコマンド

`git commit --amend` 

直前にしたコミットをやり直します。
前回のコミットにファイルの追加を行ったり、コミットコメントの変更を行ったりできます。

## 使用例

たとえば以下のようなコミットがあったとします。

```bash
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: xxxx <xxxx@xxxx.com>
Date:   Wed Aug 26 12:57:24 2015 +0900

    Added text1.txt

A       sample/text1.txt
```

上記のコミットにtext2.txtを追加して、コミットを修正するには以下のようにします。

```bash
$ git add text2.txt
$ git commit --amend -m "Added text1.txt & text2.txt"
[sample-branch 7448937] Added text1.txt & text2.txt
 2 files changed, 2 insertions(+)
 create mode 100644 sample/text1.txt
 create mode 100644 sample/text2.txt
```

すると下記のようにコミットが修正されていることがわかります。

```bash
commit xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Author: xxxx <xxxx@xxxx.com>
Date:   Wed Aug 26 13:00:53 2015 +0900

    Added text1.txt & text2.txt

A       sample/text1.txt
A       sample/text2.txt
```

今回はコミット内容はそのままでコミットコメントのみ修正します。
`git add` でファイルの追加はせずに `git commit --amend` を行い、コメントの修正を行いました。

# リモートリポジトリーに再pushする方法

ローカルでの編集が終わったのでリモートにpushしようとしましたが、ローカルのコミットを改変したためリモートとローカルに不整合が生じてしまいpushに失敗してしまいます。

これを解決するために強制的にローカルのブランチをリモートに上書きできるコマンドを実行します。
強制的に自分の変更をリモートに反映させるため操作を行う際は十分に注意します。
※共有のブランチでこの作業は絶対しないようにしてください。

## 使用するコマンド

`git push -f [repository] [branch]`
オプション `-f` を付けることで強制的にpushできます。

## 使用例

```bash
$ git push -f origin xxxx
Counting objects: 1, done.
Writing objects: 100% (1/1), 183 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To xxxxxxxx
 + xxxxxxx...xxxxxxx xxxx -> xxxx (forced update)
```

これで今回の変更をリモートにも適用することができました。

# 参考サイト

[【派閥別】Gitのコミットを間違えたときの対処法まとめ](http://freak-da.hatenablog.com/entry/20111105/p1)
[[git reset (--hard/--soft)]ワーキングツリー - Qiita](http://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)
fencing_topology動作の変更

Pacemaker1.1.14(今後のリリース予定、現在の最新は1.1.13)からfencingのtopologyにAND設定を行った場合の動作が変わりました。
変わるのは、STONITHのアクションにreboot指定をしたデバイスの場合で

fencing_topology \
 NODE1 : Stonith1, Stonith2, Stonith3 \
 NODE2 : Stonith4, Stontih5, Stonith6

のような設定の場合で、各デバイスがrebootアクションでの実行だった場合です。

Pacemaker1.1.13では、NODE1のSTONITHが実行される場合、Stonith1～Stonith3を全て実行(AND設定なので）する時に、全てにrebootアクションが実行されていました。
Pacemaker1.1.14（予定）では、Stonith1(off)～Stonith2(off)～Stonith3(off)～Stonith1(on)～Stonith2(on)～Stonith3(on)の動作に自動的にstonithdプロセスによって振り替えられます。

変更の意図は不明ですが、rebootを全て実行するよりはreboot完了までの時間の早くなります。
PHPでExcelを使う(libxl)

    この記事の内容はCentOS7で実行しましたが多分他のlinuxでもつかえます。
PHPでExcelを使うには[PHPExcel](https://phpexcel.codeplex.com/)を使うのが楽ですが、スピードとメモリ使用量が結構キツイです。
なので有料ですがC++で書かれた[libxl](http://libxl.com/)を使うと色々といい感じなので、そのインストール方法

libxlはCのライブラリなのでそのままではPHPから使えません。
素晴らしいことにこれを使用するための[extensionが公開されています](https://github.com/iliaal/php_excel/)。
PHPExcelと紛らわしいですが・・・。

```bash
wget http://libxl.com/download/libxl-lin-3.6.2.tar.gz
tar zxf libxl-lin-3.6.2.tar.gz
cp libxl-3.6.2.0/lib64/libxl.so /usr/local/lib64/
git clone https://github.com/iliaal/php_excel.git
cd php_excel
phpize
./configure --with-libxl-incdir=../libxl-3.6.2.0/include_c/ --with-libxl-libdir=/usr/local/lib64/
make
make install
```

phpizeを使うにはphpの開発環境（php-develパッケージ）をインストール。
libなのかlib64なのかは環境に合わせて。

これでphp.iniに下記を追加。

```
extension=excel.so
excel.license_name=hogehoge
excel.license_key=linux-xxxxxxxxxxxxxxxxxxxxxxxx
```

ライセンスはここで書いてもいいし、excelインスタンスを作るときでもどっちでも。

xlsで日本語を使うと化ける場合は下記の様にします。

```php
setlocale(LC_ALL, 'ja_JP.UTF-8');
$book = new ExcelBook("hogehoge", "linux-xxxxxxxxxxxxxxxxxxxxxxxx",false);
$book->setLocale('ja_JP.UTF-8');
```
Amazon Linux で Numpy, Scipy, scikit-learnを利用する

## 背景
　* Numpy、Scipy 、scikit-learn を使う必要があった
　* インフラは AWS EC2 一択
　* ちょっとハマった

## 前提
 * Python は pyenv を使う
build 済のバイナリなら、yum install で一発なんだけど。。。

## ハマったこと
 * 公式ページで指定された依存ライブラリだけでは、エラーが出た
 * Amazon Linux では SRPM がリポジトリにないため、 yum-builddep が使えない

## 手順

ざっくり、必要そうなのは全部入るように groups install を使うことにしました

```shell-session
$ sudo yum groups install "Development tools" -y
$ sudo yum groups install "Development Libraries" -y
$ sudo yum install sqlite sqlite-devel  -y
$ sudo yum install lapack-devel blas-devel fftw-devel atlas-devel suitesparse-devel swig -y
$ pyenv local 2.7.8
$ pip install numpy scipy scikit-learn
```

fftw-devel とかが必要なのを見極めるのに結構時間を要した。

## おまけ

pip で強制再インストールを行うには、下記のコマンドを使う

```shell-session
$ pip install --upgrade --force-reinstall numpy scipy scikit-learn
```
サーバの編集でたまにviを使う人間のviメモ


サーバ管理でたまにViを使う際にいろいろ忘れるのでメモ。

###モード
モードがあるのはもちろん知っておりますが、種類と名前

* ノーマルモード（起動時の状態。escでいつでもこのモードに）
* 挿入モード（入力するモード。i,aで切り替え）
* コマンドラインモード（ノーマルモードで:で切り替え）
* ビジュアルモード(v,V,ctr+vで切り替え）

###検索

* ノーマルモードで/で検索モード？に。
* nで次のマッチに移動。

###入力モードでの作業
切り替えてしまえば、普通のエディタと変わらない。

* i 挿入（カーソルの位置に挿入）
* a 追加（カーソルの右隣から挿入）

###ノーマルモードでの作業

####移動

* k　上
* j　下
* h　左
* l　右
* shift + G 最終行へ移動
* gg 先頭行に移動
* :10 10行目に移動
* ^ 行の文字先頭に移動
* $ 行末に移動
* 0 行頭に移動
* ctl + f 前にページ送り
* ctl + b 後にページ送り
* w 1文字送り
* b 1文字戻り

####選択

* v エリア選択
* V 行選択
* ctl + v 矩形選択

####編集

* x 1文字（指定エリア）削除
* dd 1行削除
* u undo
* ctl + r redo

###保存・終了

* :w 保存
* :wq 保存して終了
* :q! 強制終了
要望: Qiitaページデザイン

# トップページについて

![1.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/175b921c-5daa-0bfd-7873-606875e027e3.jpeg)

* 記事のおおまかな長さも表示してもらえると嬉しいです。

## トップページで記事内容の表示について

![2.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/0152fa21-8790-f715-c01e-ea10d44f3909.jpeg)


# 下書き

![3.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/db73da6d-5fbc-f2c5-b363-f20dba03d63a.jpeg)

# 記事

![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/f0574c1f-c436-8d58-dc92-f5c075a63deb.jpeg)

## その2

![6.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/a0f490a1-d226-614c-7414-4e381e261500.jpeg)


# 検索窓

![5.jpg](https://qiita-image-store.s3.amazonaws.com/0/25728/34b20d20-3114-d10b-d4ac-315fcb72aa87.jpeg)

もしくは入力枠の上に入力支援文字の出現

# マイページ

* 最近の投稿とは別に、最近編集した順に記事一覧が見たい。
arduinoで7セグメントLED　その２

オークションで、手に入れた、QYF-TM1638をarduino unoにつないで見ました。

##写真
![MVC-004S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/f3a848d6-b8f6-bdec-f04a-33c2165d5cd8.jpeg)
##回路図
![tm1638.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/2d57a3da-511c-f25b-0ada-95758c10124d.png)
##サンプルコード
```
#include <TM1638.h>
#include <TM1638QYF.h>

TM1638QYF module(3, 2, 5);
word mode;
unsigned long startTime;
void update(TM1638QYF * module, word * mode) 
{
	word buttons = module->getButtons();
	unsigned long runningSecs = (millis() - startTime) / 1000;
	if (buttons != 0) 
	{
		* mode = buttons >> 1;
		if (* mode < 128) 
		{
			module->clearDisplay();
			delay(100);
		}
	}
	switch (* mode) 
	{
	case 0:
		module->setDisplayToDecNumber(runningSecs, 1 << 6);
	break;
	case 1:
		module->setDisplayToDecNumber(runningSecs, 1 << 5, false);
	break;
	case 2:
		module->setDisplayToHexNumber(runningSecs, 1 << 4);
	break;
	case 4:
		module->setDisplayToHexNumber(runningSecs, 1 << 3, false);
	break;
	case 8:
		module->setDisplayToBinNumber(runningSecs, 1 << 2);
	break;
	case 16:
		char s[9];
		sprintf(s, "Secs %03d", runningSecs % 999);
		module->setDisplayToString(s, 1 << 1);
	break;
	case 32:
		if (runningSecs % 2 == 0) 
		{
			module->setDisplayToString("TM1638QY", 1);
		} 
		else 
		{
			module->setDisplayToString(String("LIBRARY "), 1);
		}
	break;
	case 64:
		module->setDisplayToError();
	break;
	case 128:
		module->setDisplayToDecNumber(* mode, 0);
	break;
	case 256:
		module->setDisplayToString("ABCDE", 1 << (runningSecs % 8));
	break;
	default:
		module->setDisplayToBinNumber(buttons & 0xF, buttons >> 8);
	}
}
void setup() 
{
	startTime = millis();
	module.setupDisplay(true, 7);
	mode = 0;
}
void loop() 
{
	update(&module, &mode);
}

```
unity > platformの確認 > if (Application.platform == RuntimePlatform.Android) {

```txt:動作確認
Unity 5.1.2-f1 on MacOS X 10.8.5
```

動作しているのがandroidなのか、Windowsなのかなど知りたい。

Application.platformを使うようだ。
http://docs.unity3d.com/ScriptReference/Application-platform.html

```csharp
if (Application.platform == RuntimePlatform.Android) {
   verText.text = "Android";
} else {
   verText.text = "Other";
}
```
arduinoでLCD その3

aitendoで購入したTS206をarduino unoにつないで見ました。
##写真
![MVC-003S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/ae082a75-9ff6-88e1-b005-ffbd06ab4e64.jpeg)

##回路図
![ts206.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/e2594eef-56e3-40d3-5659-523418943fb0.png)



##ライブラリー作りました。
https://github.com/ohisama/Ts206

##サンプルコード
```
#include <Ts206.h>

Ts206 lcd(10, 9, 7);
// data, wr, cs

void setup()
{
	int i;
	lcd.begin();
	lcd.disp(1, 'H');
	lcd.disp(2, 'e');
	lcd.disp(3, 'l');
	lcd.disp(4, 'l');
	lcd.disp(5, 'o');
	lcd.disp(6, ' ');
	lcd.disp(7, '2');
	lcd.disp(8, '0');
	lcd.disp(9, '6');
}
void loop()
{

}

```
Visual Studio 2013 Update 5適用後の不具合

#はじめに
Visual Studio 2013 の Update 5を見つけたので、アップデートしたところ、Team Foundation Server Express 2013が正常に動作しなくなった。
現象としては、TFSの作業内のクエリで一覧がみられなくなった。
テキストボックスにエラーメッセージらしきものが表示されていた。

#環境
Windows Server 2012 R2
Visual Studio 2013 Pro Update 3 適用済み
Team Foundation Server Express With Update 3

#解決
[Microsoft Visual Studio Team Foundation Server Express 2013 Update 5](http://www.microsoft.com/ja-jp/download/details.aspx?id=48158)をダウンロードしてsetupしたところ復旧した。
csharp > 既定値 > 数値:0 / 論理値: false / 参照型: null / 構造体: すべてを規定値で初期化 > var n = default(int); // (int)0

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.10 既定値

> C#には、既定値(数値の場合は0, ~~論理値~~論理型の場合はfalse, 参照型の場合はnull, 構造体の場合はすべてのフィールドを既定値で初期化したもの)を取得するための、default式というものがあります。

```csharp
var n = default(int);  // (int)0
var s = default(string); // (string)null;
```

ideoneで実装してみた。
http://ideone.com/1LktI3

いまいち使いどころが分からない。`default(int)`とか書くと「default値ってなんだ？」ということになるので`var n = (int)0;`など書いたほうがいいように思う。

あるいは、「この値はdefault値に戻している」という意図をコードとして残すのだろうか？ `n = 0;`と書いた時「0ってなんだ?」になるより、`n = default(int)`として「デフォルト値に戻しているのか」と分かる？ ただ、その場合でも、自分でconst定義した数値を入れるほうがデフォルト値を0以外にできるだろう。

<hr>
(追記 2015/08/27)
@potimarimo さんのコメントにより、上記の疑問が解決しました。

ジェネリックの場合、既定値を0などで設定しているとまずいのでdefault()が役に立つということでした。
操作の本体と事前条件を合成する

## 参考書籍
![](http://ecx.images-amazon.com/images/I/414qGlNpcHL._SX352_BO1,204,203,200_.jpg)
http://www.amazon.co.jp/JavaScriptで学ぶ関数型プログラミング-Michael-Fogus/dp/4873116600

## 事前条件と計算の本体
ある関数に渡る引数の妥当性を検証するために、その関数の内部でチェック処理を実装する事はよくある。プログラマが意図した適切な戻り値を生成するために必要な前処理は、**事前条件**として定義される。繰り返しになるが、この事前条件は関数を設計する際にごく当たり前に存在するし、プログラムに実装すべきものである。

ちなみに自分がなにか趣味でプログラムを作るときには、この事前条件は一旦無視して、本質的な操作だけを実装している。あとから必要に応じて、事前条件を追加で実装している形だ。（理由は面倒だから、がきっと一番の理由なのだろう）

今回の記事は、この事前条件を計算の本体と分離して実装したらいろいろシンプルになって便利だなぁ、ということがわかった話です。

## 関数の実装に手を入れる事なく、計算の本体と事前条件を合成する

たとえば、1引数関数を取る関数を定義してみる。

```hs
uncheckedSqr :: Int -> Int
uncheckedSqr = n * n
```

実用的な意味はないが、仮に次のような事前条件があるとする。

* 0以下は受け付けない
* 5より大きい整数は受け付けない

ストレートに実装するなら、次のようになるだろう。

```hs
checkedSqr :: Int -> Int
checkedSqr n
    | or [(n <= 0), (n > 5)] = error "Invalid."
    | otherwise = n * n
```

今回は、この関数を次のように分解して考え、最後に合成する。

```hs
--  1引数とって、真偽値を返す関数とエラーメッセージを組み合わせたEither値を返す
validator :: String -> (a -> Bool) -> a -> Either String a
validator msg p a = if p a then Left msg else Right a

-- 事前条件と操作の本体を合成するための関数
-- 事前条件を満たさない場合、エラーメッセージがリストに溜まり、Left値となる
checker :: [(a -> Either String a)] -> (a -> b) -> a -> Either [String] b
checker [] f n = Right (f n)
checker fs f n = if length lst > 0 then Left lst else Right (f n)
  where
      lst = foldr pm [] es
      es = map (\g -> g n) fs -- es -> eithersの略
      pm (Left msg) msgs =  msg : msgs -- pm -> pattern matchの略
      pm (Right _) msgs = msgs


-- 今回の事前条件と、uncheckedSqrの本体を合成している
checkedSqr = checker
    [(validator "invalid value: under zero" (<= 0)),
     (validator "invalid value: greater than 5" (> 5))
    ] uncheckedSqr


checkedSqr (-3) --Left ["invalid value: under zero"]
checkedSqr 8    --Left ["invalid value: greater than 5"]
checkedSqr 5    --Right 25
```
 
## ちなみに`javascript`では
今回のキモである、`validator`関数と`checker`関数は参考書籍で次のように定義されている。
※上の定義と微妙に異なっているが、考え方は同じはず。

```js
var _ = require('underscore')

function validator(message, fun) {
    var f = function() {
        return fun.apply(fun, arguments);
    };
    f['message'] = message;
    return f;
}

function checker( /* predicates */ ) {
    var validators = _.toArray(arguments);
    return function(obj) {
        return _.reduce(validators, function(errs, check) {
            if (check(obj)) {
                return errs;
            } else {
                return _.chain(errs).push(check.message).value();
            }
        }, []);
    };
}
```

## 終わりに
コード量は増えたが、各々の関数の汎用性は増した。事前条件の関数は他でも使えるだろうし、合成関数は、部分適用すれば他の操作に対しても適用できる。
単体テストもシンプルになる。

操作の本体と事前条件を合成する。これは関数型プログラミングを学んでいて良かったなぁ、と思えるわかりやすいケースだった。

なお、事前条件と本体との分離という意味では、Haskellなら`newtype`とモジュールを利用して、絶対に事前条件を満たした値しか生成されないような型を作ることで、その目的を果たすこともできる。
csharp > as演算子 > キャスト演算とは異なり、変換できない場合にはnullを返す

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.9 型情報

> as演算子は型変換の一種ですが、キャスト演算とは異なり、変換できない場合にはnullを返します。

<hr>
http://qiita.com/calmbooks/items/11e881f79b056e381cbc
の

```
GameObject gCube = Instantiate(pCube) as GameObject;
```
の`as GameObject`などはas演算子なのだろう。

Instantiate()自体はObject.Instantiate()の場合戻り値はObject型になるので、それをGameObject型に変換しているのだと思われる。
技術英語 > in order of importance

引用: 冠詞マスター教本 by 石井隆之さん

> in order of size
> in order of age
> in order of importance

> orderは無冠詞で、ofの後も無冠詞の抽象名詞が来る

<hr>
https://github.com/first20hours/google-10000-english

> a list of the 10,000 most common English words <font color=red>in order of frequency</font>

<hr>
https://github.com/RonaldTreur/graviton.TaskManager

> in order of (continuously updated) priority

<hr>
https://github.com/AndrewsJava/FarOutAstronomyTour

> Android app displaying astronomical images in order of distance
rakeで引数を使う場合の注意


rakeで引数を使おうとしてつまったので、書き留めておきます。rakeのバージョンは10.4.2です。

rakeで引数を使う場合、rakefileに次のように書く。

```rakefile
desc "hogehoge"
task :hoge, [:foo, :foo2] do |t, args|
  p t, args
end
```

descの部分はなくてもかまわないが、`rake -T`で表示されるようになります。`rake -T`の表示をみると、ここで定義したタスクhogeが登録されて`rake hoge[foo,foo2]`のように使うという説明があります。

ですが、`rake hoge[1,2]`のようにしても、上手くいかないので、調べてみたところ、[https://github.com/ruby/rake/issues/42](https://github.com/ruby/rake/issues/42)にissueが立っていました。

結論は、`rake hoge\[1,2\]`のように、バックスラッシュをいれなければいけないということでした。 `[`や`]`が単なる文字とみなされないので、エスケープしなければならないようです。
git clone で fatal: early EOF

最近codebreak;を使ってgitで遊んでいたら発生したエラーについてなんとか解決できたので備忘録に

環境：MacOSX 10.10.5, Windows7

プロジェクトのサイズは当時200MB程度。
すでにclone済みのローカルからはfetchやpull, pushなどが行えますが
新規でcloneする場合のみ以下のようなエラーが発生していました。

```
git clone https://<ユーザー名>@git.codebreak.com/<ユーザー名>/<プロジェクト>.git
Cloning into '<プロジェクト>'...
POST git-upload-pack (224 bytes)
remote: Counting objects: 1240, done
remote: Finding sources: 100% (3/3)
remote: Getting sizes: 100% (2/2)
fatal: The remote end hung up unexpectedly MiB | 337.00 KiB/s   
fatal: early EOF
fatal: index-pack failed
```

先に対応と結果を書きますが
https接続からssh接続に変更したら解消しました。

```
git clone ssh://<ユーザー名>@git.codebreak.com/<ユーザー名>/<プロジェクト>.git
Cloning into '<プロジェクト>'...
remote: Total 1917 (delta 0), reused 1917 (delta 0)
Receiving objects: 100% (1917/1917), 183.34 MiB | 633.00 KiB/s, done.
Resolving deltas: 100% (808/808), done.
Checking connectivity... done.
Checking out files: 100% (1071/1071), done.
```

はじめは以下のページなども参考にさせていただきましたがちょっと違ったようです
http://urashita.com/archives/2293

本現象がgitだから発生したのかcodebreak;だから発生したのかはわかりませんが
ひとまず解決ってことにしています。
Macで"壊れているため開けません"の古いappを開く

## 壊れているAppを開く方法

Macの古いアプリなど、「“App 名”は壊れているため開けません。"ゴミ箱"に入れる必要があります。」と言われて開けない場合がある。
以下のコマンドで開くことができる。

```bash
xattr -rc /Applications/LegacyAwesome.app
```

[参考:Damaged and can't be open app error message](http://apple.stackexchange.com/questions/58050/damaged-and-cant-be-open-app-error-message)

## セキュリティ設定の変更による解決方法

Apple公式や他の多くの記事では、セキュリティ設定の変更で解決しているものが多い。
> Gatekeeper のオプションは、Apple メニュー >「システム環境設定」>「セキュリティとプライバシー」>「一般」タブの「ダウンロードしたアプリケーションの実行許可」
[OS X：Gatekeeper について](https://support.apple.com/ja-jp/HT202491)

個人的には設定の変更は、逐一元に戻さないのであればあまりやるべきではないと思う。
他参考、
[壊れているため開けません。“ゴミ箱”に入れる必要があります。」の対処法](http://teku2tech.hateblo.jp/entry/20130525/1369484771)

## xattrのオプションについて

[XATTR manual](https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xattr.1.html)

`xattr -rc`の場合
r -> directory recursive , c -> clear all attributes

## Mac OSXのExtended Attributesについて

他調べたこと

+ [-rw-r--r--@って？ Mac OSXのExtended Attributesを除去する](http://havelog.ayumusato.com/computer/software/e152-osx-remove-xattr.html)

lsでExtended Attributesを表示

```bash
$ ls -l@ ~/Downloads

$ ls -l@ /Applications
drwxr-xr-x@  3 user  admin   102  9 19  2014 LibreOffice.app
	com.apple.FinderInfo	  32
	com.apple.quarantine	  71
```

+ [メモ：com.apple.quarantine 拡張属性](http://kazutomi.blogspot.jp/2013/12/comapplequarantine.html)

Extended Attributesの詳細を表示

```bash
$ xattr -l /Applications/LibreOffice.app/
com.apple.FinderInfo:
00000000  00 00 00 00 00 00 00 00 00 00 FF FF FF FF 00 00  |................|
00000010  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  |................|
00000020
com.apple.quarantine: 0061;5446731d;Google\x20Chrome.app;E97AB148-AA5D-4113-8498-B2BE6BDD3F8D
```
Rails の部分テンプレートが表示されなくて躓いたメモ

無駄な時間を過ごした
ファイル名, ファイルパスは合ってる．エラーも起こらない
スーパーリロードしても反映されない
だがやはり何故か埋め込んだ部分のみ表示されない

```diff
- <% render 'shared/menu' %>
+ <%= render 'shared/menu' %>
```

まだ rails 慣れてないなと感じた
[質問]swift コードでのlayoutについて

コードでストーリーボードのpin で行うような制約はどうすればよいですか?

コードで生成後、autolayoutで制約をつけたラベルを基準にした制約をつけたいのですが方法がわかりません。
設置完了後にラベルを基準にと指定したらエラーになりました

よろしくお願いします
[iOS]ミュート状態・音量を取得したい


# やりたいこと
特定の画面を音が聞こえる状態で使ってもらいたいので、本体が消音状態 or ボリューム小だったらアラートとか出したい
→iPhone本体のmuteスイッチ状態、ボリューム値を取得したい

結論としては「MPVolumeViewを使いなさいよ」ということなんだが、ちょっと調べた内容をメモしておきたい。

# ミュート状態取得する方法

- [サイレントモード＜サイレントスイッチ＞の状態を取得する - 散歩しながら 〜〜アプリ開発〜〜](http://sanposhinagara.hatenadiary.jp/entry/2015/02/26/193829)
- [Rich2k/RBDMuteSwitch · GitHub](https://github.com/Rich2k/RBDMuteSwitch)

音声ファイル再生してみることによって消音状態の判別を行うアイディアの実装。

検出（音声再生）要求をcall → 判定結果のdelegateが呼ばれると状態が分かるという寸法。
見つけたときは「おおっ！」と思ったが、同期的に取得できる方法が欲しかったのと、ミュート状態取得がそこまでMUSTではなかったので今回はこの方法はパス。
”音量値をできるだけ簡単に参照する方法”を探した。


# 音量取得する方法
## ×：MPMusicPlayerController(deprecated)

- [iOS - LumberMill's Notes](http://www.lumber-mill.co.jp/notes/tips/130609_ios.html)

```objectivec
NSLog(@"app:%f", [MPMusicPlayerController applicationMusicPlayer].volume);
NSLog(@"sys:%f", [MPMusicPlayerController systemMusicPlayer].volume);
```
とやってみると 0.0 -> 1.0 の範囲で取得される

- 本体サイドのvolを +/- 操作 →値変化しない
- iPod（音楽再生中）のvol +/- 操作 →値変化する

名前のとおり、取得できるのは "MusicPlayer" のボリューム値
一応これが所望の音量ではあるかな？

しかし、"volume"プロパティはiOS7からdeprecated


## ×：ObjectAL経由 = AvAudioSession(deprecated)

- [ObjectAL for iPhone and Mac](http://kstenerud.github.io/ObjectAL-for-iPhone/)

音声ファイル再生のために利用しているライブラリ
ObjectAL > OALSimpleAudio

ヘッダを眺めてみるとmuteとかがプロパティとして定義されていたり、音声ファイル再生時のパラメータとして"volume"があったり。
これはシステムの再生音量というよりは、再生しようとする音声データ（入力）のレベルだと理解している。

```objectivec
OALSimpleAudio *osa = [OALSimpleAudio sharedInstance];
BOOL muted = osa.muted; // NO
BOOL bgMuted = osa.bgMuted; // NO
float vol = osa.bgVolume; // 1
```

動作させてみたらコメント部の値。
本体MuteスイッチのON／OFFでmuted/bgMutedの値は変わらず。
bgVolumeもボリューム操作しても変わらず。
そもそも"bg"だし、用途が違うっぽい。（todo:詳細はちゃんとヘッダとかドキュメント読む）

```objectivec
//HardwareDemo.m, line117あたり
volume = [OALAudioSession sharedInstance].hardwareVolume;
muted = [OALAudioSession sharedInstance].hardwareMuted;
```

AvAudioSessionからハードウェアの音量取得できそう？


`AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareOutputVolume)`

しかしながら、`AudioSessionGetProperty`もiOS7から使えなくなっている様子。


# ◯：MPVolumeViewを利用

- [【iOS】【MPVolumeView】スライダー移動で音量を変更したときにシステムの音量表示のオーバーレイが表示されてしまうときの対処法 | わびさび少年のブログ](http://tokyo-wabisabi-boys.net/blog/iosobjective-c/hide_mpvolumeview_overlay)


MPVolumeView -> MPVolumeSlider を取得 -> UISlider経由で現在の音量値を得る というアイディア。
さすがです先輩。
元記事では最終的にやってることが異なるが、その過程のサンプルコードが役立ちました。


公式に提供されている音量を”変更する”手段なわけだが、あくまでも”変更”であって、”参照”する方法は明示的には提供されていないっぽい。

「MPVolumeViewやUISliderは表示せず、音量取得のためだけに裏で使う」
ということ。

```objectivec
// viewDidLoadとか、適当なとこで
MPVolumeView *volumeView = [[volumeView alloc] init];
float volume = -1.0;
for (UIView *view in [volumeView subviews]) {
    if ([view.class.description isEqualToString:@"MPVolumeSlider"]) {
        UISlider *volumeSlider = (UISlider *)view;
        volume = volumeSlider.value;
        break;
    }
}

NSLog(@"%f", volume) // -1.0のままの場合は取得できていない
```

音量取得の方法が解決したと同時に、”オブジェクトの中を参照する”というやり方も勉強になりました。

以上。
pandoc をつかって markdown で簡単にレポート的なものをつくる

# レポートを残そう
学生でなくとも、何か実験なり計測なりしたときは簡単にレポートのようなものにデータをまとめておくと後々役に立つ。

データやグラフだけをフォルダにつっこんでおくと後で見返したときにどれがどれなのか、何が目的で何を得られたのかわからなくなる。あるいは解読にとても時間がかかる。

データを文章で繋いで一連の流れでまとめておく。目的と方法と結果と考察と課題を簡単に書いておくといい。他人が読んでもわかるようにしておけばだれかが発掘したときに財産になる。

そういうときに、pandoc をつかうと簡単にそこそこの見栄えのレポートが書ける。

# インストール
まずはインストール

```zsh
brew install pandoc
```

# 必要なものを揃える

```zsh
mkdir test_report
cd test_report
touch main.tex
touch contents.md
touch makefile
```

# main.tex をつくる
手順としては markdown → tex → pdf という変換手順をふむ。
main.tex はドキュメントクラス等の設定やタイトルや著者情報などを書く。
一度つくったらタイトルだけ変えて使いまわす。

```main.tex
\documentclass[11pt,a4paper]{jsarticle}

\usepackage{amsmath,amssymb}
\usepackage{bm}
\usepackage{ascmac}
\usepackage[dvipdfmx]{graphicx,color}
\usepackage{longtable}
\usepackage{booktabs}

\title {タイトル}
\author {書いたひと}

\begin {document}
\maketitle
\input {contents}
\end{document}
```

# contents.md をつくる

本文はcontents.mdに書く

```contents.md
# 見出し
## 小見出し
### 小小見出し

# 表
markdown のテーブル記法がそのままつかえる

| Left align | Right align | Center align |
|:-----------|------------:|:------------:|
| This       |        This |     This     |
| column     |      column |    column    |
| will       |        will |     will     |
| be         |          be |      be      |
| left       |       right |    center    |
| aligned    |     aligned |   aligned    |

# 図の挿入
図\ref{fig1}で相互参照もできる。

![\label{fig1}図の名前](fig.png)

# tex記法
tex の記法がそのまま使える。

\begin{equation}
  x^2 - 6x + 1 = 0
\end{equation}
```

こんなかんじ。注意点としては

* 図の挿入は上下1行必ず空ける
* 表のタイトルとラベルがつけられない

# makefile をつくる
あとは変換していくだけなんだけどいろいろとめんどくさいので make をつかう。

```mf
TEX=platex
DVI2PDF=dvipdfmx
MKDFILE=contents.md
ROWTEX=rowtex.tex
TEXFILE=contents.tex

SOURCES = \
	main.tex \
	$(NULL)


all: makexbb md2tex converttex dvi2pdf clean

makexbb:
	@extractbb *.png

md2tex:
	@pandoc $(MKDFILE) -o $(ROWTEX)

converttex: $(ROWTEX)
	@cat $^ \
	| sed 's/includegraphics/includegraphics[width=1.0\\columnwidth]/g' \
	> $(TEXFILE)

.tex.dvi: main.tex
	@${TEX} $<
	@${TEX} $<

dvi2pdf: $(SOURCES:.tex=.dvi)
	@${DVI2PDF} $^

clean:
	@rm -f *.dvi *.aux *.log $(ROWTEX)
```


# 完成
あとは素材を揃えてmakeすれば完成。

```zsh
make
```

# 妥協
細かいところでレイアウトが崩れてしまうこともある。そういうのは気にせず、とにかく楽に早く書くためのものとして使っている。

# 参考にしたページ
参考にしたページが見付からない、見付かったら追記しよう。
ngrokで一時的なローカルウェブアプリケーションの公開

ngrokは手許で検証しているウェブアプリケーションを手軽に外部から接続できる中継アプリケーションです。
デプロイ前のアプリケーションを一時的に外部接続して試験するなどの使い道が考えられます。

# ngrokをつかってみる

## インストール

手許のOSXではhomebrewでの構成ができなかったので、公式ダウンロードページからのダウンロードにて入手しました。

```
https://ngrok.com/download
```

入手したzipファイルを展開し、利用できる状態にします。

## Authtokenを取得

利用する際に必要になるAuthtokenを取得します。
`ngrok auth` で取得したAuthtokenを設定して下さい。

https://dashboard.ngrok.com

## 起動

Safariでは正しく動かないようなので、Chrome/Firefoxで稼働を確認しました。
以下の例では

- ユーザーhoge:パスワードfugaでのbasic認証を設定
- ローカルのHTTP8080を外部に公開

という指定を行っています。

```
% ./ngrok http -auth="hoge:fuga" 8080
```

接続する一時URLなどがコンソールに表示されますので、指定に従いブラウザで確認して下さい。
`http://127.0.0.1:4000` は管理コンソール画面となります。

```
ngrok by @inconshreveable                                  (Ctrl+C to quit)

Tunnel Status                 online
Version                       2.0.19/2.0.19
Web Interface                 http://127.0.0.1:4040
Forwarding                    http://xxxxxxxx.ngrok.io -> localhost:8080
Forwarding                    https://xxxxxxxx.ngrok.io -> localhost:8080

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.0
```

Enjoy!
Three.jsでCannon.jsを使う


Three.jsは見た目上のオブジェクトを作成するものなので、オブジェクト同士を衝突させようと思ってもすり抜けてしまいます。そこで、Three.jsでオブジェクト同士の衝突を行うために物理エンジンのCannon.jsを使ってみます。

##考え方
見た目上の世界を作成しいるThree.jsと、物体が実際に衝突等を起すCannon.jsの世界がある。
Cannon.jsの世界の各オブジェクトの位置をThree.jsの各オブジェクトにコピーする。
すると、見た目上でも実際にオブジェクト同士が質感をもって動く。

##物理演算ワールド
Three.jsと同様にまずは物理演算の対象となる世界を作成します。

```
var world = new CANNON.World();
world.gravity.set(0, -10, 0);	//重力を設定
world.broadphase = new CANNON.NaiveBroadphase();	//ぶつかっている可能性のあるオブジェクト同士を見つける
world.solver.iterations = 8;		//反復計算回数
world.solver.tolerance = 0.1;		//許容値
```
1行目に物理演算ワールドを作成します。
2行目で重力を設定しています。
3行目にぶつかっている可能性のあるオブジェクト同士を見つけています。物理演算は処理の重いものなので、全てを計算するのではなく、ぶつかっている可能性のあるものをピックアップし、その後実際に計算しています。
4行目は反復計算回数といって計算を何回行うかを決定します。しかし、ここでいう計算というのは正確なものではなく、ざっくりとしたものです。なので、その計算を複数回繰り返すことで誤差を小さくしていきます。大体5~10回すれば不正確さは収束するそうです。
5行目で誤差をどのくらいまで許容するかを決めています。

##オブジェクトを作る
ボックスと床を作成します。

```box
var mass = 1;
var shape = new CANNON.Box(new CANNON.Vec3(5, 5, 5));

var phyBox = new CANNON.Body({mass, shape});
phyBox.angularVelocity.set(0, 5, 10);   //角速度
phyBox.angularDamping = 0.1;　　　//減衰率
world.add(phyBox);
```
始めに重さと形を設定し、その値をしようしてオブジェクトを作成しています。
angularVelocityは初期の角速度を設定します。
angularDampingでは減衰率を設定しています。時間が経つにつれ回転が遅くなっていきます。
<br>

```plane
var mass = 0;
var shape = new CANNON.Plane();

var phyPlane = newCANNON.Body({mass, shape});
phyPlane.quaternion.setFromAxisAngle(new CANNON.Vec3(1, 0, 0), -Math.PI / 2);	//X軸に９０度回転
world.add(phyPlane);
```
床は動かないようにする必要があるため質量を0にします。こうすることで動かないオブジェクトが作成できます。
<br>

##物理演算ワールドの時間を進める
```
world.step(1 / 60);
```
時間を進めます。
ここでは60FPS(約0.016s)に設定しています。
<br>

##Cannon.jsの値をThree.jsにコピーする
```
box.position.copy(phyBox.position);  
box.quaternion.copy(phyBox.quaternion);  
```
positionとquaternionの値をコピーします。
quaternionは四元数と呼ばれるもので、ここでは回転を表しています。

<br><br>

Cannon.jsはThree.jsととても相性が良いので、普段Three.jsを使っている方でしたら、特に問題なく自然と使えると思います。
バイナリ・カウント問題 53バイト

[オリジナル](https://codeiq.jp/q/1539)は既に見れないのですが、[PDF](http://riverplus.net/codeiq/const-q.pdf)が公開されていたのでやってみます。
みんなのコード：http://togetter.com/li/823763


53バイト。

```php
<?for(;$i++<4;$l+=substr_count(decbin($i),1))?><?=$l;
```

引数版60バイト。

```php
<?for(;$i++<$argv[1];$l+=substr_count(decbin($i),1))?><?=$l;
```

バイナリカウント(10^3) = 4938
バイナリカウント(10^10) = 164293127179

長いよsubstr_count。

単純数え上げなので、10^3は一瞬で求まりますが、10^10は手元のマシンで1時間かかりました。
まともな時間で求めるなら、[もっと効率のいいアルゴリズム](http://ideone.com/MMrT8f)を実装する必要があるでしょう。


この問題はこれ以上縮めようがない気がするんだがどうだろうか。
mp3を自前Podcastにする

# 動機

ラジオで録音した語学番組（mp3）をiPhoneなどiOS端末で聞く場合、普通はMusicアプリで聞くしかありません。
Musicアプリでは以下のような不便な点があります。

* 細かな前後への移動ができない
* 前回の停止位置から再生されない（先頭から再生される）

上記のような機能を持った再生アプリを探せばいいのかもしれませんが、普段使っているpodcastアプリで再生できれば上記の点が解消されます。そこで、なんとかmp3ファイルを簡易にPodcast番組にする方法を探してみました。

# 仕組み

Podcastは、RSSフィードの仕組みを使って公開されます。

そのためには、以下のものが必要です。
(1) RSSファイル：公開する項目に関する各種情報のリスト

- 通常は、Webサイトの記事の要約とリンク先。
- Podcastの場合は、番組に関する情報（タイトルや要約など）と音声ファイルのURL.


(2) RSSファイルを公開するWebサーバ
これは、iOSデバイスに転送したい時だけ使えればいいので、rubyに付属のwebrickを使いました。


# RSSファイルの生成
RSSファイルは、XMLのファイルなので、[Appleのサイト](http://www.apple.com/jp/itunes/podcasts/specs.html)の仕様をみて、テキストエディタでも作れますが、音声ファイルがたくさんあると面倒なので、rubyのスクリプトファイルを探しました。
見つけたのが下記のスクリプトで、これを利用しました。

*  [Personal Podcast Generator Script](https://gist.github.com/kelan/1659457#file-generate_personal_podcast-rb)

あとで見つけたのですが、「[指定ディレクトリ内のmp3ファイルから必要最低限のPodcast用RSSを生成する](https://gist.github.com/matchy2/5552631)」というのもありました。
こちらの方が、スッキリしている気もします。


元のスクリプトを若干修正をしました。
スクリプト本編は、上のリンクを参照してください。

修正箇所は、以下の3点です。
後の2点は、日本語関係の問題なので、ファイル名などが英語の場合は、不要と思います。

* ベースURLを下で使うWebサーバのURLにします。

```
public_url_base = "http://192.168.1.6:8000"
```

* ラジオで録音した時のファイル名が*.MP3と、拡張子が大文字になっていたので、ファイル名のフィルタに"MP3"を追加しました。

```
    next unless file =~ /\.(mp3|m4a|MP3|M4A)$/  # only use audio files
```

* フォルダ名、ファイル名に日本語が入っているとiTunesやiOS端末でアクセスした時にエラーになり、ファイルをダウンロード出来ませんでした。そこで、音声ファイルのURLをパーセントエンコードするようにしました。

追記：最初`URI.encode_www_form_component()`を使ってましたが、ファイルパスの'/'もエンコードされてしまうので、`URI.escape()`に変えました。

```
require 'uri'
...
item_url = "#{public_url_base}/#{URI.escape(file)}"
```


また、このスクリプトではmdlsコマンドでMacOSXのSpotLight検索用のメタデータから概要などを生成してますが、今回使ったファイルではそのようなメタデータを設定していないため、不要なものをコメントアウトしました。


# RSSファイルの生成

上のスクリプトファイルをmp3のファイルと同じディレクトリに置きます。
ターミナルソフトで、そのディレクトリに移動し、次のコマンドで実行します。

`./generate_personal_podcast.rb`

すると 'podcast.rss' というファイルが作成されます。

RSSの公開は、rubyのwebrickを使いました。
上と同じディレクトリで、以下のコマンド（ワンライナー）を実行します。

```
ruby -rwebrick -e WEBrick::HTTPServer.new(:DocumentRoot => "./", :Port => 8000).start
```

# iOS端末へのダウンロード
- iTunesでpodcast.rssのurlを登録し、iOS端末に同期しました。
iTunesのファイルメニュー/Podcastを購読を選択し、下のURLを入力するとPodcastとして各音声ファイルのタイトルが表示されます。

```
http://192.168.1.6:8000/podcast.rss
```

iTunesを使わずに、直接iOS端末でダウンロードするやり方もあるようです。
podcast.rssのurlをメールで送って、そのメールをiOS端末で開いて、URLをクリックすると登録できるそうです。

（試してみましたが、うまくいきませんでした。ご存知の方がおられたら教えてください。）
[Unity] Unity プログラムを Intel Edison で自動起動する


#実行はできたけど

[[Unity] Intel Edison で Unity を実行する](http://qiita.com/dsedb/items/bd11a10167accfcbe70e)
にて Unity のプログラムを実行することができました。が、これはログインして実行コマンドを入力しています。
つまりこういう状態で、
![IMG_1385.jpg](https://qiita-image-store.s3.amazonaws.com/0/90046/74f1a582-76b4-d63c-4891-fb9b72c69486.jpeg "")
ログインして、シェルから実行コマンドを入力しているわけです。これはいただけません。
ガジェットならガジェットらしく、独立で起動してくれないと夢が広がらないですね。

というわけで、Unity プログラムを自動起動させます。

#サービスを設定する
作成した実行ファイルが `/var/linux.x86` だとして、
`/lib/systemd/system/unityplayer.service`
というファイルを、以下の内容で作成します。

```
[Unit]
Description=Unity Player
Requires=wpa_supplicant.service
After=wpa_supplicant.service

[Service]
Environment="HOME=/usr/root"
ExecStart=/var/linux.x86 -batchmode -nographics
#ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target
```

まだ systemctl の理解が浅くて、この記述が最適なのか自信がありません。（rc.init の頃と比べて洗練された気はしますが、どうも難しいですね）
実際、wifi の接続を待ってから起動するようにしたかったのですが、効いてないようです。なので
`After=wpa_supplicant.service`
このあたりの記述には意味がないかも。

そしてこの設定ファイルでは、自動実行（非ログイン実行）する際の Unity の問題をひとつクリアしています。
`Environment="HOME=/usr/root"`
これです。どうやら Unity Player は、環境変数 HOME が未定義だと落ちてしまうようです。この事実を見つける難易度が高かったのですが、わかってしまえばこのように、回避は容易です。

#サービスを登録する
`/lib/systemd/` で、
`systemctl enable unityplayer.service`
を実行します。

```shell-session:
root@yuji-edison:/lib/systemd/system# systemctl enable unityplayer.service 
ln -s '/lib/systemd/system/unityplayer.service' '/etc/systemd/system/multi-user.target.wants/unityplayer.service'
```
これで自動起動に登録されました。準備完了です。

#単体で起動してみる
PC ではなく壁に刺します。

![IMG_1386.jpg](https://qiita-image-store.s3.amazonaws.com/0/90046/a81dac5e-5805-fe32-3491-fd331484f9dc.jpeg "")

さあ、どうだ！前回使用した受信プログラムを走らせます。

![スクリーンショット 2015-08-26 23.36.19.png](https://qiita-image-store.s3.amazonaws.com/0/90046/2d6d056d-eb2b-3fd3-662a-c74952a18ff1.png "")


動作しています。めでたしめでたし。
送信プログラムでアドレスを送っているので、そのアドレスに ssh でログインすることもできます。

#今後
これで、電源さえ供給すれば、Break Out Board すら外した状態で Unity で作ったプログラムを動作させられるはずです。何ができますかねー
iOS9で追加されたGKStateMachine の基本的な使い方

iOS9から導入されたGKStateMachineによってStateパターンに則ったコードが書きやすくなりそう。
最低限実装に必要な部分をメモ。


各状態クラスはGKStateを継承して作成する。
いくつかのメソッドをオーバーライドして次のようなことを行う

- 各状態における動作
- どの状態に遷移可能かを判定
- 状態遷移直後の処理
- 状態遷移直前の処理

```swift:StateNormal
import UIKit
import GameplayKit

class StateNormal: GKState {

    var normalTime:Double = 0

    override func isValidNextState(stateClass: AnyClass) -> Bool {
        return true
    }
    
    override func updateWithDeltaTime(seconds: NSTimeInterval) {
        noarmalTime += seconds
        print(normalTime)
        if(normalTimeTime>1.0){
            stateMachine!.enterState(StateNormal)
        }
    }
    
    override func didEnterWithPreviousState(previousState: GKState?) {
        print("change to normal")
        normalTime=0.0
    }
    
}

```


```swift:StateDown
import UIKit
import GameplayKit



class StateDown: GKState {
    
    var downTime:Double = 0
    
    override func isValidNextState(stateClass: AnyClass) -> Bool {
        return true
    }
    
    override func updateWithDeltaTime(seconds: NSTimeInterval) {
        downTime += seconds
        print(downTime)
        if(downTime>1.0){
            stateMachine!.enterState(StateNormal)
        }
    }
    
    override func didEnterWithPreviousState(previousState: GKState?) {
        print("change to down")
        downTime=0.0
    }

}
```


上記の2つの状態クラスを使用する状態機械を定義して使用している。
やっているのは主に下記の2つ

- 状態機械を事前に定義した状態を使用して初期化している
- 初期状態の決定
- 状態機械の処理実行

```swift:ViewController
class ViewController: UIViewController {
    
    // 状態機械を初期化
    var sm:GKStateMachine = GKStateMachine(states: [StateNormal(),StateDown()])

    // ボタン押下時の処理
    @IBAction func changeState(sender: AnyObject) {
        sm.updateWithDeltaTime(0.3)
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 状態機械の初期状態決定
        sm.enterState(StateNormal)
    }

}

```

```swift:実行結果
change to normal
0.3
0.6
0.9
1.2
change to down
0.3
0.6
0.9
1.2
change to normal
0.3
0.6
0.9
1.2
change to down
0.3
0.6
```


StateMachineのupdateWithDeltaTimeメソッドを呼ぶとその時の状態クラスのupdateWithDeltaTimeメソッドが呼ばれるところがポイント。

本来ならば、StateMachineのupdateメソッドはspritekit経由で呼んでやるものなのだろうけど、今回は簡略化のためにその辺りを飛ばしているので注意されたし。
CSSで作ったフキダシの矢印にひと工夫加える

# 今回作るもの
下の画像のようなフキダシを作ります。内容としては、以前投下した、[枠線だけ色のついたフキダシをCSSで作る](http://qiita.com/rukiadia/items/66d1cb2dc41deaea7da0)の続きになります。

下の2つのフキダシを見てください。

![スクリーンショット 0027-08-26 23.23.30.png](https://qiita-image-store.s3.amazonaws.com/0/10371/c182db25-bdb1-ac88-add0-9a7815f6385d.png)

![スクリーンショット 0027-08-26 23.21.39.png](https://qiita-image-store.s3.amazonaws.com/0/10371/916a0d95-5c85-2e9f-3d0a-f0ba54c96b28.png)

2番目のようなフキダシをCSSで作るのはよく有るケースだと思いますが、1番目のように矢印の形が特殊な場合はどうでしょうか？

今回はこんな少し変わったフキダシをCSSで作るやり方を説明します。

## デモ
https://jsfiddle.net/b7sL1buz/

## 作り方
### 1. フキダシにしたい要素を作成
```index.html
<div class="balloon">
    <!-- フキダシ文言を挿入 -->
</div>
```
```index.css
.balloon {
    position: relative;
    width: 100px;
    height: 100px;
    background: #000000;
}
```

矢印をafter要素で配置するため、position: relativeを付与しています。

### 2. 矢印を作成
```index.css
.balloon:after {
    position: absolute;
    top: 100%;
    left: 50%;
    width: 0;
    height: 0;
    content: '';
    border-top: 0;
    border-right: 20px solid transparent;
    border-bottom: 20px solid transparent;
    border-left: 20px solid #000000;
    margin: 0 0 0 -10px;
}
```
大体は普通のフキダシを作る時と同じですが、ポイントはborder-topの値です。
![スクリーンショット 0027-08-26 23.37.34.png](https://qiita-image-store.s3.amazonaws.com/0/10371/a87a5bab-0b00-0634-68ab-213b9f0de418.png)

border-topを0にすることで、このような上半分が欠けた三角形を表現しています。
※各borderの値を調整することで、微妙に形を変えた三角形を表現できるので興味のある方は試してみてください。

後は矢印を付けたい位置をtopやleftで調整してやれば完成です。

## まとめ

デザイナーさんのデザインを元にHTMLとCSSにコーディングする際、可能な限り画像を使わずに表現することをかなり意識するようになりました。

「ここの部分、CSSで作れるんじゃないか・・？」と思って試行錯誤していると、案外いけたりするので色々試してみることをオススメします。

「悩みすぎて時間が無くなった」というオチになっては元も子も無いので、そこは程々に。
【プラグイン】新着商品・最近購入された商品

取り急ぎ、「新着商品」「最近購入された商品」プラグインを作ってみました。
ver3.0.3で検証済みです。

###新着商品
***
トップページ新着情報の上に表示されます。
ソースはGithubにupしてます。
[https://github.com/ohtacky/ECCUBE-NewItem](https://github.com/ohtacky/ECCUBE-NewItem)
<img src="https://raw.githubusercontent.com/ohtacky/ECCUBE-NewItem/image/1.png" width="650px">

###最近購入された商品
***
商品詳細の商品サブ画像の下に表示されます。
ソースはGithubにupしてます。
[https://github.com/ohtacky/RecentlyPurchaseItem](https://github.com/ohtacky/RecentlyPurchaseItem)


####作ってみて
***
#####新着商品
新着商品はEvent内でProductからfindBy idで取得。
取得したProductをtwigに渡して表示。
リポジトリが登録されているため、ファイル数も少なく簡単でした。

####最近購入された商品
新着商品と同様、Event内でOrderDetailからfindBy idで取得。
取得したOrderDetailをtwigに渡して表示。
OrderDetailはリポジトリが登録されていない為、自身で登録する必要ありました。
既に公開されている「関連商品プラグイン」も同様の処理をしてました。←参考にさせて頂きました。
Ruby on Rails に Apache は必要ない

Railsは自前のウェブサーバーを持っている。
だからApacheは必要ない。

なので、httpd.conf なんかを見て
「RailsとApacheはどこでつながってるんだ？」なんて調べてみても、何も見つからないぞ。

Perl+Apache とか。
PHP+Apache とか。

「ウェブではまず Apache が必要」という認識があったので。
Rails を触り始めて1ヶ月ぐらいなのに、まったく気づかなかった。というかよく考えてなかった。

(DocumentRootはどこだ？　なんて探していた)

---
　
ただ、Railsのサーバーは簡単なライブラリらしいので。
本番環境ではApacheとかnginxとかと連携させる必要があるはずだ。








<!-- Update From Qiita API -->

# チャットメンバー募集


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

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





# Twitter


https://twitter.com/YumaInaura


<!-- Update From Qiita API -->
Ruby-Processing 矩形の重なりを求める


2 つの矩形の重なっている領域を求めるプログラムです。2 つの矩形のうち、ひとつはマウスカーソルで移動します。

![overlap-rect.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/25b2c634-af89-c7ef-60f1-239f44488c20.gif "overlap-rect.gif")


```ruby:overlap-rect.rb
# 矩形の重なりを求める
# 矩形は X 軸、Y 軸に平行

def setup
  size 400, 400
  no_fill
end

# 矩形の重なりを求める
def calc_overlap_rect(x1, y1, width1, height1,
                      x2, y2, width2, height2)
  sx = [x1, x2].max
  sy = [y1, y2].max
  ex = [x1 + width1, x2 + width2].min
  ey = [y1 + height1, y2 + height2].min

  w = ex - sx
  h = ey - sy
  if w > 0 && h > 0
    [sx, sy, w, h]
  else
    nil
  end
end

def draw
  background 255

  # 矩形のサイズ
  w1, h1 = 60, 30
  w2, h2 = 80, 120

  no_fill
  rect mouse_x, mouse_y, w1, h1
  rect width/2, height/2, w2, h2

  overlap = calc_overlap_rect(mouse_x, mouse_y, w1, h1,
                              width/2, height/2, w2, h2)
  if overlap
    fill 128
    # 重なり部分の矩形
    x, y, w, h = overlap
    rect x, y, w, h
  end
end
```

コマンドラインから以下を実行します。

```
$ rp5 run overlap-rect.rb
```
FileMaker - 上下ボタンでポータル行を並び替える

今回お客様用のソリューションで、ポータル行の入れ替え機能を作成しました。これは多分ニーズがありそうなので実装方法について説明することにしました。

#概要
ポータル行の上下入れ替えをボタンで行うというものです。
下の画面にある上下のボタンをクリックすることで、クリックした行の上下の行と位置が入れ替わります。
*※並び順は動作確認用に表示していますが、レイアウト上に無くても問題動作に支障はありません*

![ポータル行入れ替え.png](https://qiita-image-store.s3.amazonaws.com/0/68589/3845ab6e-eef4-7ab0-5e31-fdb893883dce.png "ポータル行入れ替え.png")

今回のサンプルですと、子テーブルの「並び順」フィールドの値は1からの連番であることが条件です。スクリプトを連番以外に対応させるか、行の削除時に連番になるような処理の工夫が必要ですのでその点は注意して下さい。

##カスタム関数の利用について
今回のサンプルでは、スクリプト引数の受け渡しおよび受け取りでカスタム関数を利用しています。
使用したカスタム関数については、以前に解説を書きましたのでそちらを参照して下さい。
[スクリプト引数に関する説明はこちら](http://qiita.com/hajisan/items/027940a94392e004c83d)

#詳細説明
##テーブルの定義
ポータルを利用するのでテーブルは親と子の2つ定義します。
サンプルでは最低限の項目だけ定義しました。
設定の詳細はサンプルファイルを参照して下さい。

![テーブル定義.png](https://qiita-image-store.s3.amazonaws.com/0/68589/254039c4-fb25-c5b7-97e7-c8cdd027cd8b.png "テーブル定義.png")

##スクリプトの定義
ボタンが押された時に、実際に並びを変更するスクリプトを定義します。
今回はなるべく汎用的に使えるようなスクリプトとして1つだけ作成しています。

```FMScript:スクリプト名「ポータル行移動(並びフィールド名;向き)」
 1 # ========================================
 2 # 	概要:
 3 # 			ポータル行の並びを入れ替える
 4 # 	戻り値:
 5 # 			null
 6 # 	パラメータ:
 7 # 			並びフィールド名：並び順指定に使用しているフィールド名(テーブルオカレンス名も含める)
 8 # 			移動の方向：アクティブ行を上に移動->"up", アクティブ行を下に移動->"down"
 9 # 	呼出元:
10 # 			並びを入れ替えたいポータルの上下ボタンのクリック時
11 # 	補足説明:
12 # 			アクティブなポータル行を指定された向きに移動するように行の入れ替えをする
13 # 	History:
14 # 			2015-08-26 新規作成
15 # ========================================
16 If [ #Assign ( Get(スクリプト引数) ) ] 
17 	変数を設定 [ $recsu ; 値: Count(GetField($並びフィールド名)) ] 
18 	If [ $向き = "up" and (GetField($並びフィールド名) ≠ 1) // 一番上の行の時は無効 ] 
19 		フィールドを名前で設定 [ $並びフィールド名 ; GetField ( $並びフィールド名 ) - 1 ] 
20 		ポータル内の行へ移動 [ 前の ] 
21 		フィールドを名前で設定 [ $並びフィールド名 ; GetField ( $並びフィールド名 ) + 1 ] 
22 	Else If [ $向き = "down" and ( $recsu > GetField($並びフィールド名) ) // 一番最後の行の時は無効 ] 
23 		フィールドを名前で設定 [ $並びフィールド名 ; GetField ( $並びフィールド名 ) + 1 ] 
24 		ポータル内の行へ移動 [ 次の ] 
25 		フィールドを名前で設定 [ $並びフィールド名 ; GetField ( $並びフィールド名 ) - 1 ] 
26 	End If
27 	レコード/検索条件確定 [ ダイアログなし ] 
28 End If
```

簡単に解説すると、指定された向きに合わせて並び用のフィールド値を隣接する行と入れ替えているだけです。
移動先行の値を確認せずに1を加減しているだけなので、連番であることが前提になっています。

##ポータルの定義
ポータルでは並び順フィールドによるソートを指定しています。
![ポータルの定義.png](https://qiita-image-store.s3.amazonaws.com/0/68589/3b661d5f-163b-d56f-0603-879434f7dbbf.png "ポータルの定義.png")

##ボタンの定義
最後に上下ボタンの定義です。
クリック時に呼び出すのは先ほどのスクリプトです。
まずは「上」ボタンから。
![上ボタンの定義.png](https://qiita-image-store.s3.amazonaws.com/0/68589/3fffac5c-b105-dc1e-42db-bb213f9e908d.png "上ボタンの定義.png")

次に「下」ボタン。実際には引数の"向き"の値が違うだけです。
![下ボタンの定義.png](https://qiita-image-store.s3.amazonaws.com/0/68589/ca40805e-7d6c-2cfc-de81-4a64cfd3fe1a.png "下ボタンの定義.png")

説明は以上です。
スクリプトは汎用性があるので、そのままコピーして使うことも可能かと思います。（ただし自己責任でお使いください）

今回のサンプルは以下の場所に置きましたので、詳しくはファイルを参照して下さい。
[サンプルファイル](http://it-komons.jp/filemaker/samples/portal_rec_move.zip)