OmniAICreator/Qiita-1.07M huggingface dataset:
unity > TDD > 動作テスト用gameobjectの作成と使用

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

UDPで受信したデータを元にグラフ表示をするソフトを実装している中、動作テストにlinuxからUDP送信を実行するスクリプトを走らせるのが面倒になってきた。

ふと、テスト用のGameObjectを作って最初はfalseにしておいて、それをSetActiveにすればいいと思った。

## 手順

1. Test_weeklyというGameoOjectを作成して、スクリプトとしてTest_weekl.csを新規作成する
2. Test_weekly GameObjectは名前の左側のチェックをOFFにして、最初は起動しないようにしておく。
3. プレイモードで実行後、インスペクタでTest_weeklyをActiveにすると、中のスクリプトが実行される。

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/2aba3747-ad2c-cd09-fcef-79ee68597188.jpeg)

下記がTest_weekly.csの中身。時系列グラフのデータに3点のデータをセットする処理を実装。

```Test_weekly.cs
using UnityEngine;
using System.Collections;

public class Test_weekly : MonoBehaviour {

	void Test_addWeeklyData() {

		string [] dts = new string[]{ "09:30", "11:30", "13:30" };
		float [] vals = new float[] { 0.5f, -0.9f, 0.9f };

		System.DateTime curDt;
		float yval;
		int idx = 0;

		foreach(var dt in dts) {
			curDt = System.DateTime.Parse(dt);
			yval = vals[idx];
			timeGraphScript.SetXYVal(curDt, yval);
			idx++;
		}
	}

	void Start () {
		Test_addWeeklyData ();
	}
	
	void Update () {
	
	}
}
```

##使用例

playmode起動直後。グラフには何も描かれていない。

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/c0aaed08-56ca-e043-0a8c-0b623d416a30.jpeg)

インスペクタでTest_weeklyをActiveにすると3点のデータをセットするスクリプトが実行され、以下のようになる。

![Main_unity_-_150908-udpTimeGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/f6019453-b402-d62c-a9bb-7ec2c8c2f3c4.jpeg)

これでテスト駆動開発ができるようになる。

今はインスペクタでSetActiveにしているが、通信コマンドでActiveにするものを用意してもいいかと思う。

コルーチンを使ってWait付きの処理もできそう。
技術英語 > He is the very man for accounting. / He is the last person to do that.

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

> Mr. Adams is the very man for accounting.
(アダムスさんは正に経理に向いてますね)

<hr>

...に向いている、というフレーズで2000年くらいにEnglish Journalで見たのが「cut out to be」だった。

http://ejje.weblio.jp/content/be+cut+out+to+be
> （～に）適している；（～になる）素質がある

I am not cut out to be XXX. (私はXXXには向いていません）という使い方をしようと思い憶えた記憶があるが、その後15年近く、そのフレーズを他では見聞きしなかった。
たまたまなのだろうか。

<hr>
the very manをトリガに思い出したのが

the last person
http://ejje.weblio.jp/sentence/content/the+last+person
> He'd be the last person to do something like that
> 彼に限ってそんなことはしない。

<hr>
BitLocker 暗号化されたディスクを Linux でマウントする

 BitLockerによって暗号化されたディスクを、Linuxでマウント（読取り専用）する手順の備忘です。パスワードをクラックする方法ではありません。前提として、デバイスが正常に接続されていて、 `lsblk` や `fdisk -l` 等のコマンドでデバイスファイルを特定できている必要があります。復号には `dislocker` 、`fuse-dislocker` パッケージが必要です。

 手順は、まずディスクを復号して `dislocker-file` という名前のファイルを取得し、これをループデバイスとしてマウントします。復号と復号後とでマウントは二度必要です。

 1. **復号**
    対象のデバイスファイル、復号方法、ループデバイスのマウントポイントを指定して `dislocker-file` を取得します。ここではデバイスファイルを `/dev/sdx` とします。

    ```
    $ sudo dislocker -v -V /dev/sdx -u{*パスワード*} -- /media/removable1
    ```

    正常に複号できていれば、マウントポイントに `dislocker-file` があることを確認できます。

    ```
    $ sudo file /media/removable1/dislocker-file
    /media/removable1/dislocker-file: DOS/MBR boot sector, ...
    ```

 2. **マウント**
    復号して得られた `dislocker-file` をループデバイスとしてマウントします。

    ```
    $ sudo mount -o loop,ro /media/removable1/dislocker-file /media/removable2/
    ```

### 参考

- [Wikipedia - Disk encryption](https://en.wikipedia.org/wiki/Disk_encryption)
- [Wikipedia - Comparison of disk encryption software](https://en.wikipedia.org/wiki/Comparison_of_disk_encryption_software)
- [ArchWiki - ディスク暗号化](https://wiki.archlinuxjp.org/index.php/%E3%83%87%E3%82%A3%E3%82%B9%E3%82%AF%E6%9A%97%E5%8F%B7%E5%8C%96)
電子部品通販業者の送料・カード対応・領収書対応について(2015)

電子部品を通販で買う時に、１回あたりどのくらいの送料がかかるか、どの会社のカードが対応しているか、領収書は発行してくれるかを調べました。(2015.8月)


[秋月電子通商](http://akizukidenshi.com/catalog/contents2/buy.aspx)
送料一律500円、代引き300円
銀行振込、カード(VISA,Master)、代引き
領収書は代引きのみ

[千石電商](http://www.sengoku.co.jp/guide.html#pay)
送料一律432円、一万円以上無料
銀行振込、カード(各社)、代引き、コンビニ・ネットバンク・Edy決済
領収書は発注時の備考欄で対応してくれる。代引き、コンビニ決済は業者の領収書

[マルツパーツ](http://www.marutsu.co.jp/pc/static/guide/payment)
送料450円、5000円以上送料無料
銀行振込、カード(各社)、代引き、コンビニ決済
領収書は発注時の備考欄で対応してくれる。

[共立エレショップ](http://eleshop.jp/shop/pages/carriage.aspx)
送料480円、7500円以上送料無料 (一部の部品は定形外郵便での発送あり)
銀行振込、カード、代引き
領収書は発注時の備考欄で対応してくれる。

[ストロベリーリナックス](https://strawberry-linux.com/catalog/howto)
送料380円
銀行振込、代引き
領収書は発注時の備考欄で対応してくれる。

[スイッチサイエンス](https://www.switch-science.com/info/how/)
送料〜400円、3000円または5000円以上で送料無料
銀行振込、カード(VISA/JCB/Master)、PayPal、代引き
領収書は発注時の備考欄で対応してくれる。
wintersmithでbrowser sync する方法 


`gulp-jade`使うくらいなら、wintersmith使えと言われたので、wintersmithで色々試行錯誤しております。

wintersmith向けにはlivereloadのプラグインが用意されたりしていて、まぁそれ使えばなんとかなるのですが、livereload周りのソース汚れる感じが嫌いなので、
wintersmithのpreviwをbrowserSyncに飛ばす方法を考えます。

## gulpfileの書き方

browserSync のproxyを使って、wintersmithのpreviewサーバと接続する。

その後、contents などの操作対象ディレクトリをwatchしながら、browserSyncのリロードを掛ければOK。

````
"use strict"
var gulp = require("gulp");
var browserSync = require("browser-sync")
var wintersmith = require("wintersmith")


gulp.task("winter",function(){
    var env = wintersmith("./config.json");

    env.preview(function(error,server){
        //console.log(server);
    })
    
    browserSync.init({
        proxy: "http://localhost:8080"
    });
    gulp.watch('./contents/**/*', function(){
        browserSync.reload();
    });
})
````

http://localhost:8080 のベタ書きがイモくて嫌なら、cbのserverから値が取れるはずなので、そこをパースしてやればいいと思います。

だれか綺麗なパースの記法考えついたら教えて下さい。
割と手軽にFormの座標・サイズを復元するクラス

# 手軽にFormの座標・サイズを復元するクラス
```FormSizeSaver.cs
using Codeplex.Data;
using System;
using System.Drawing;
using System.IO;
using System.Windows.Forms;

/// <summary>
/// フォームの大きさ、座標を記録する機能を付加します
/// </summary>
public class FormSizeSaver
{
  private static readonly string SaveFilePath = "form_size_init.json";

  /// <param name="target">Boundsを記憶するフォーム</param>
  public FormSizeSaver(Form target)
  {
    // Loadイベントが呼ばれる前に設定する必要がある
    // Showイベントを対象にしても動く
    target.Load += target_Load;
    target.FormClosed += target_FormClosed;
  }

  void target_Load(object sender, EventArgs e)
  {
    Form target = sender as Form;
    if (target == null) return;

    if (!File.Exists(SaveFilePath)) return;

    using (StreamReader sr = new StreamReader(SaveFilePath))
    {
      var json = DynamicJson.Parse(sr.ReadToEnd());
      Rectangle rect = json.Deserialize<Rectangle>();
      target.Bounds = rect;
    }
  }

  void target_FormClosed(object sender, FormClosedEventArgs e)
  {
    Form target = sender as Form;
    if (target == null) return;

    using (StreamWriter sr = new StreamWriter(SaveFilePath))
    {
      sr.WriteLine(DynamicJson.Serialize(target.Bounds));
    }
  }
}
```

Loadで設定ファイルがアレば復元して、
FormClosedで設定ファイルを書き出しているだけ。


# 使い方

```Form1.cs
public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
    new FormSizeSaver(this);
  }
}
```

使用するフォームを表示する前に登録するだけ。
使用する側が一文で機能を追加できるのがメリット。


# 使用ライブラリ
neue cc - DynamicJson - C# 4.0のdynamicでスムーズにJSONを扱うライブラリ
http://neue.cc/2010/04/30_256.html
svgファイルのsvg内のスタイルを変更して表示

XMLHttpRequestでsvgファイルを取ってくるので、同一ドメインのsvgファイルのみが対象です。

[デモ](http://jsdo.it/ksk1015/2Bmi)

```html:svgファイルのsvg内のスタイルを変更して表示.html
<h1>svgファイルのsvg内のスタイルを変更して表示</h1>

<h2>元画像</h2>
<img src="/static/assets/logo/01/jsdoit_logo.svg">

<h2>data-svg-srcでパスを指定</h2>
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg">

<h2>data-svg-fillでfillを指定</h2>
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="red">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="yellow">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="green">

<h2>data-svg-strokeでstrokeを指定</h2>
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="red">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="yellow">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="green">

<h2>data-svg-stroke-widthでstroke-widthを指定</h2>
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="red" data-svg-stroke-width="1">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="red" data-svg-stroke-width="5">
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="none" data-svg-stroke="red" data-svg-stroke-width="10">

<h2>data-svg-cssでstyleを直接指定</h2>
<img data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-css="*{fill:yellow; stroke: black; stroke-width: 5;} *:first-child{fill:red;}">

<h2>data-svg-bgで背景画像として表示</h2>
<div class="bg" data-svg-src="/static/assets/logo/01/jsdoit_logo.svg" data-svg-fill="white" data-svg-bg></div>
```

```javascript:svgファイルのsvg内のスタイルを変更して表示.js
function loadSvg(elem){
    var svgSrc = elem.getAttribute('data-svg-src');
    var svgCss = elem.getAttribute('data-svg-css') || '';
    if( elem.hasAttribute('data-svg-fill') ) svgCss += '*{fill:' + elem.getAttribute('data-svg-fill') + '}';
    if( elem.hasAttribute('data-svg-stroke') ) svgCss += '*{stroke:' + elem.getAttribute('data-svg-stroke') + '}';
    if( elem.hasAttribute('data-svg-stroke-width') ) svgCss += '*{stroke-width:' + elem.getAttribute('data-svg-stroke-width') + '}';
    
    var xhr = new XMLHttpRequest();
    xhr.open('GET', svgSrc, true);
    xhr.onload = function(){
        if (this.status !== 200) {
            return;
        }
        var matched = this.responseText.match(/(<svg[\s\S]+?)<\/svg>/m);
        var svgData = matched[1];
        if(svgCss) svgData += '<style>' + svgCss + '</style>';
        svgData += '</svg>';
        svgData = 'data:image/svg+xml,' + encodeURIComponent(svgData);
        if ( elem.hasAttribute('data-svg-bg') ) {
            elem.style.backgroundImage = 'url(' + svgData + ')';
        } else {
            elem.src = svgData;
        }
    };
    xhr.send();    
}

[].forEach.call(document.querySelectorAll('[data-svg-src]'), loadSvg);
```
[CSS][HTML] floatした要素の親要素の高さが0になって困る場合の対処方法

loatは文字通り、「浮いている」ことになるので親要素の高さには計算されない

```html
<ul class="items">
  <li class="item">
  <li class="item">
  <li class="item">
  <li class="item">
</ul>
```

高さが決まっている場合は、親要素に高さ指定でOK。これはよくやると思う

```css
.items {
    width: 400px;
}
.item {
    float: left;
}
```

高さが可変の場合は、変わってしまう場合overflow: auto もしくは overflow: hidden

```css
.items {
    overflow: auto;
}
.item {
    float: left;
}
```
ユーザー作成


この記事は[Web開発をするまで](http://qiita.com/FSMS/items/6db6178a564ef32926f6)の一部です


### hogeという名前のユーザを追加する場合

```
useradd hoge
```

### 作成したユーザの確認

```
id hoge
```

uid=1001(hoge) gid=1001(hoge) groups=1001(hoge)

上記のようなレスポンスがあれば、ユーザーが作成されています。

id: hoge: no such user
上記のレスポンスの場合はユーザーを作成できていません。


### hogeユーザでログイン

現在、最初にログインしたrootユーザでログインしている状態のはずです。

```
su - hoge
```

上記のコマンドでhogeユーザに変わる事ができます。
僕は非nullなスマートポインターがほしいと思ったんだ


# 前略姉さんヌルポが怖いですめんどいです不要です
ヌルポインターは怖い。いまさら言うまでもなく、怖い
だがヌルポチェックは面倒くさい。よく忘れるし、よくさぼる

だがしかし
冷静に考えてみればnewはnullを返さない
無効値ならばoptionalのように明示的に無効値を表明したほうがスマートだ
本当の本当にnullptrが必要な場面というのはそうそう多くないはずだ

だから僕は非nullなスマートポインターがほしいと思ったんだ

なおここでスマートポインターとは

+ share_ptr 
+ unique_ptr 

の2種を指す

# コンストラクタはどうあるべきか

**nullptrを引数にとれるコンストラクタやデフォルトコンストラクタをすべて潰し、生成にはmake_shared , make_uniqueなどを用いる**
 
+ 内部状態がnullになってはならないので当然nullptrを引数にとるコンストラクタはあるべきではない
+ デフォルトコンストラクタについてはTがデフォルトコンストラクタを持っているのならば`new T()`してもよいのだが、デフォルトでnewするのはコストが大きく余計なお世話な感じがあるので潰してしまうべきだ

# moveはどうするべきか
moveされたオブジェクト(つまり普段はnullになっていた右辺値のほう)はどうあるべきか

## moveせずコピーする?

```
a=std::move(b);  //a=b;と等価
```

shared_ptrの場合計算コストが増えてしまうが、まあ良いだろう
unique_ptrの場合そもそもコピーが使えない

## フラグを保持しておき、所有権の有無を表す?
```
a=std::move(b);  //b==(ptr=p,flag=false)
```

nullableな普通のスマートポインタの劣化に過ぎないし、使うか分からないフラグを持ち続けるのはなかなかにばかばかしい


## 気にせずnullをぶち込め!!
```
a=std::move(b);  //b==nullptr ??
```
非nullポインターにnullをぶち込む非常識極まりない畜生行為。人間の所業と思えない

だがしかし、「move後のbの挙動については合法な範囲内でどのような状態になってもよい」とされている

つまり、非ヌルスマポが「この状態はnullptrだが特例的に合法」であると言い張れば何も問題ないのではなかろうか

例えば一般のunique_ptrはmove後nullptrかそれとも元の値を保持しているかは、「ご自由に」である
ご自由に、だとどうなっているのかさっぱりわからないので再代入されるまで触るべきでない
bは再代入されるまで触るべきではない値だったのだ

どうせ再代入で書き換えられるのでnullでも使う上で問題ないのでは？
しかもこの行動はもともとのスマートポインターと同じ速さで動く


#結論としては

非nullptrが超限定的にnullになる可能性を受け入れれば、非nullスマートポインターが完成する。という大変後味の悪い話となった

正直move後の値を触る奴のプロダクトなんて知らん、という感じはするのだが
そのバカをやるのは締切直前の自分だったりするので
コピーコンストラクタとoperator=にassertで事前チェックを仕込むぐらいのやさしさはあってもいいかもしれない
linker command failed with exit code 1 (use -v to see invocation) でシミュレータが使えない

CocoaPods を導入後、
```linker command failed with exit code 1 (use -v to see invocation)```
というエラーが吐き出されて、
iPhone などの実機ではデバッグ、実行出来ますが
iOS シミュレータでデバッグ、実行することが出来なくなってしまいました。
なぜこのような事態になったかはわかりませんが、解決方法を書いておきます。

#エラーメッセージの確認

```linker command failed with exit code 1 (use -v to see invocation)```
のメッセージの上にこのようなファイルパスがあると思います。
```Ld /Users/(ユーザー名)/Library/Developer/Xcode/DerivedData/(Xcode のプロジェクト名)/Build/Products/…(略```

#Finder で開く

とりあえず、このファイルパスを Finder で開きます。
Products ディレクトリの中には、最低2つ、ディレクトリがあると思います。
一つは```Debug-iphoneos```で、
もう一つは```Debug-iphoneos```ですね。

#存在しないファイルをコピー

この2つを比べてみると、
実機デバッグ可能で、シミュレータデバッグ不可能の場合、
```Debug-iphoneos```にあって```Debug-iphoneos```に存在しないファイルがあると思います。
とりあえず、存在しないファイルのみをコピーしましょう。

#Xcode に戻ってデバッグ
どうでしょうか。シミュレータでもデバッグ可能になったと思います。



スクリーンショットは都合上、掲載していません。
わからないことがあればコメントなどでどうぞ。
CentOS7でノートPCを閉じてもサスペンドさせない


この記事は[Web開発をするまで](http://qiita.com/FSMS/items/6db6178a564ef32926f6)の一部です


ノートPCはバッテリーがついてるので、ブレーカーが落ちたり停電があっても落ちないので軽くサーバを立てて遊んでみようという場合には便利です。

ただ、サーバ用途で使ってるノートPCを閉じてサスペンドされると不便なので機能を停止します。

CentOS7からsystemdで管理されています。

LidSwitchが蓋を閉じた時の制御
SuspendKeyがサスペンドキーを押した時の制御
HibernateKeyがハイバーネートキーを押した制御

どれも無効にしてしまいます。


```bash
vi /etc/systemd/logind.conf
```

```diff
-#HandleSuspendKey=suspend
-#HandleHibernateKey=hibernate
-#HandleLidSwitch=suspend
+HandleSuspendKey=ignore
+HandleHibernateKey=ignore
+HandleLidSwitch=ignore
```

反映させます

```
systemctl restart systemd-logind.service
```
ターミナルで文字を2倍の大きさで表示する

```rb:puts_big.rb
def puts_big(str)
  str.each_line do |line|
    puts "\e#3#{line}"
    puts "\e#4#{line}"
  end
end

str = <<EOS
＿人人人人人人人人人人人＿
＞　おはようございます　＜
￣Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^￣
EOS

# 標準の大きさで表示
puts str

# 2倍の大きさで表示
puts_big str
```

![スクリーンショット 2015-09-13 0.38.46.png](https://qiita-image-store.s3.amazonaws.com/0/18902/51cd6255-a331-3a12-e94c-bca1ccc78d69.png)

# 補足

```text:echo
echo -e "\033#3 🌞  \n\033#4 😃  ㍆㌋㌋㌆㌨㌰㌣㌈"
```

![スクリーンショット 2015-09-13 18.27.10.png](https://qiita-image-store.s3.amazonaws.com/0/18902/0b480c2a-8a6a-dd19-81d9-e03dcb83643c.png)

`\e#3`は現在行を2倍にして上半分、`\e#4`は下半分表示するよ。
`\e`と`\033`と`\x1b`とは書き方が違うだけで同じだよ。
(でもechoは`\e`だと認識してくれないよ。)

※注：MacのTerminalでしか動作確認してないよ。

# 参考
↓神サイト

- [エスケープシーケンスを体感する - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20150224/escape_sequence)
- [ASCIIコードの秘密 - ザリガニが見ていた...。](http://d.hatena.ne.jp/zariganitosh/20150209/ascii_code_secrets)
- [＞　突然の死　＜ ジェネレーター](http://www.osstech.co.jp/cgi-bin/echo-sd)
gradle-retrolambdaを使ってビルドした時に `you must set the path to jdk8` エラーが出た時の対処法


[retrolambda](https://github.com/orfjackal/retrolambda)の導入で[gradle-retrolambda](https://github.com/evant/gradle-retrolambda)を使った時に、以下のエラーが出た時の対処法です。

```shell
Error:Execution failed for task ':app:compileDebugJavaWithJavac'.
> When running gradle with java 5, 6 or 7, you must set the path to jdk8, either with property retrolambda.jdk or environment variable JAVA8_HOME
```

※ コマンドはMacの場合だけしか書いてません。すみません。。。


# 1. java8がインストールされているか
Macの場合、 `/usr/libexec/java_home -V` で確認できるはずです。
Java8がなかったら[Oracleのページ](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html)からインストールしましょう。

```
% /usr/libexec/java_home -V
Matching Java Virtual Machines (3):
    1.7.0_71, x86_64:   "Java SE 7" /Library/Java/JavaVirtualMachines/jdk1.7.0_71.jdk/Contents/Home
    1.6.0_65-b14-462, x86_64:   "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
    1.6.0_65-b14-462, i386: "Java SE 6" /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home
```

# 2. JAVA8_HOMEが設定されているか
`echo $JAVA8_HOME` で確認しましょう。

```
% echo $JAVA8_HOME
/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/
```

もしセットされていなければセットしましょう。

```
export JAVA8_HOME=`/usr/libexec/java_home -v 1.8`
```

# 3. gradleで `JAVA8_HOME` が読み取れているか
`println` で、 `System.getenv("JAVA8_HOME")` の値がちゃんと読めているか確認します。

```build.gradle
apply plugin: 'com.android.application'
apply plugin: 'me.tatarka.retrolambda'

android {
    ...
}

retrolambda {
    println("***************** ---------- *******************")
    println("JAVA8_HOME: " + System.getenv("JAVA8_HOME"))
    println("***************** ---------- *******************")
    jdk System.getenv("JAVA8_HOME")
    defaultMethods true
}

dependencies {
    ...
}

```

もしnullだとしたら、AndroidStudioに環境変数を渡せていないです。

```shell
***************** ---------- *******************
JAVA8_HOME: null
***************** ---------- *******************
```

`launchctl` で、環境変数を渡してやります。[AndroidStudioに環境変数を渡す](http://qiita.com/tmiyamon/items/ed660dff7846f5ec95d3) を参考に。

```shell
launchctl setenv JAVA8_HOME $JAVA8_HOME
```
Macで閲覧中の全ページのMarkdownリンクをコピー (JXA)

```js:get_browser_markdown_links.scpt
function get_all_page_with_markdown_links(browser){
	if(browser == "Safari") {
		tab_title = "name"
	} else if (browser == "Chrome" || browser == "Google Chrome"){
		tab_title = "title"
	} else {
		throw "Unknown Browser: " + browser
	}

	all_tabs = Application(browser).windows.tabs()
	
	return all_tabs.map(function(tabs){
		return tabs.map(function(tab){
			url = tab.url()
			title = tab[tab_title]().replace(/[\[\]]/g,"\\$&").replace(/\\$/, "")
			
			return "- [" + title + "](" + url + ")"
		}).join("\n")
	}).join("\n\n")
}

// Markdown作成
safari_links = get_all_page_with_markdown_links("Safari")
chrome_links = get_all_page_with_markdown_links("Chrome")
all_links = safari_links + "\n\n" + chrome_links

// コピー
app = Application.currentApplication()
app.includeStandardAdditions = true
app.setTheClipboardTo(all_links)
```

SafariとChromeで開いている全ウィンドウをMarkdownリンクにしてコピーします。
ウィンドウ毎に2行改行します。
スクリプトメニューに置いて使います。

![スクリーンショット 2015-09-13 17.09.40.png](https://qiita-image-store.s3.amazonaws.com/0/18902/badb98f5-754a-b36e-56cc-9111bc3b49c4.png)

※Filefoxをハブってるのは、SafariとChromeに比べてスクリプトの機能が貧弱貧弱ゥだからです。
[Mac - JXAでSafari, Chrome, Firefoxを操作する際の違い - Qiita](http://qiita.com/zakuroishikuro/items/194223d63b0f95ab7a63)

追記：どう考えてもワンライナーよりスクリプトメニューに置いたほうが便利なのでワンライナーはやめました。

----

[Qiita - Markdownのリンクを作成するブックマークレット - Qiita](http://qiita.com/zakuroishikuro/items/bc316367742963b13b16)
percol_select_history が糞重くなったので対処する

これがないと生きていけないってほど活用している ` percol_select_history `
これが最近重くなって辛かったので原因究明してみた

---

.zsh_history の分割？
---

これは意味がなかった

まず単純に考えうるのは .zsh_history の巨大化
1万行ほどあった .zsh_hisotry ファイルを5000行に分割, 2000行に分割, と試してみたが全く効果がなかった

ゴミシェル
---

次に percol_select_history で処理が重くなるパターンについて考察してみた
`ssh iw` ←ここの[w]での絞り込みが必ず時間がかかる

![Screen Shot 2015-09-13 at 00.15.57.png](https://qiita-image-store.s3.amazonaws.com/0/40717/02842944-7ff4-5a52-abdc-a627fb4eea7e.png)

そして絞り込み結果に含まれるとても怪しいハッシュ...

![Screen Shot 2015-09-13 at 00.08.47.png](https://qiita-image-store.s3.amazonaws.com/0/40717/eb9b0961-7ab1-4503-6bf7-f00a8df663fc.png)

.zsh_history を見てみたらこんなゴミが
(この echo しようとしていた文字列は 91K あった)

結果
---

上にあるのを.zsh_history から抹消するという過去改変で劇的に早くなった
これで生きていける

ハッシュとか, バイナリをクリップボードからターミナルに直接コピペってのは出来るだけ避けて
ファイルから入力ってするのが正しいのかなと思った．反省

あとはこれ早めに気づかないとhistory内からハッシュとか探しだすの面倒そうだし(改行とか行の文字数で絞り込む？)
zsh でログを取る時の文字数制限とか出来るのかな
JavaのStreamでHaskellのzipっぽいやつ

なんで無いんでしょう？ 無いので作りましたというお話です。

#zipとは？
ファイル圧縮形式の話ではありません。
2つのリストから、それらの要素をペアにしたリストを返す関数です。

* リスト1 ： `[1, 2, 3 ..]`
* リスト2 ： `['a', 'b', 'c' ..]`
* 生成されるリスト ： `[(1, 'a'), (2, 'b'), (3, 'c') ..]`

java.util.stream.Stream でこれと同等の機能が提供されているだろうと思い探したのですが、標準ライブラリでは提供されていないようですね。

#作成したものと使い方

* [javadoc](http://nmby.github.io/toolbox/api-docs/xyz/hotchpotch/util/stream/ZippedStream.html)
* [ソース](https://github.com/nmby/toolbox/blob/master/project/src/main/java/xyz/hotchpotch/util/stream/ZippedStream.java)
* [リポジトリ](https://github.com/nmby/toolbox)

ZippedStream というクラス[^1]と、付随するクラスを作成しました。
次のように使用します。

```java:利用例
Stream<Integer> stream1 = Stream.of(1, 2, 3);
Stream<String> stream2 = Stream.of("a", "b", "c");

Stream<Pair<Integer, String>> zipped = ZippedStream.of(stream1, stream2);

zipped.forEach(System.out::println);
```

```text:出力例
(1, a)
(2, b)
(3, c)
```

ソースストリームが無限ストリームの場合は、生成されるストリームも無限ストリームになります。
ソースストリームに対して遅延バインディングでバインドしますので、（ソースストリームも遅延バインディングであれば、）終端操作の開始前までに大元のソースデータに対して行った変更は、ストリームの要素に反映されます。

また、生成されるストリームの Spliterator の各種特性[^2]は、ソースストリームの Spliterator の特性を反映したものになります。（ここを作りこむのが一番面倒でした！）

比較的ちゃんと作ったつもりですので、よろしければご利用ください。
[⇒ jar ファイル](https://github.com/nmby/toolbox/releases)

#疑問
しかしなぜ、zip の機能が標準 API で提供されていないのでしょうか？
java.util.stream 周りの思想と相いれない**やってはいけない何か**があるのでしょうか？！
どなたかアイディアお持ちの方がいれば、コメントいただけると有難いです。

＜2015/9/19追記＞
zip、java8 のプレビュー版では入っていたものの、正式リリース版で外されたようですね...
自分で色々とテストする中で、少しだけ難しさを理解してきました。Concurrent まわりとか、Spliterator まわりとか、プリミティブ型要素のストリームはどうするんだとか...
色々と難しいっすね。


---
[^1]: そこは「StreamUtil#zip」やろ！という話もありますが、諸事情と nmby の好みにより「ZippedStream#of」という名前にした次第です。

[^2]: ORDERED, DISTINCT, SORTED, SIZED, NONNULL, IMMUTABLE, CONCURRENT, SUBSIZED の各特性。詳細は [Spliterator の API ドキュメント](http://docs.oracle.com/javase/jp/8/docs/api/java/util/Spliterator.html) を参照してください。
WCSessionで絶対にやってはいけないこと


## 絶対にやってはいけないこと
**それは`delegate`を設定する前に`activateSession`を呼び出すこと。**残念ながら例外とかエラーとか発生しないので呼び出す場所によってはアクティベートに失敗していることに気が付きません。

以下のコードはアクティベートに失敗します。

```swift
if WCSession.isSupported() {
    let session = WCSession.defaultSession()
    session.activateSession()    
    session.delegate = self
}
```


## 解決方法

[ドキュメント](https://developer.apple.com/library/prerelease/watchos/documentation/WatchConnectivity/Reference/WCSession_class/index.html)に書いてある通りに`WCSession`をアクティベートすること。

```swift
if WCSession.isSupported() {
    let session = WCSession.defaultSession()
    session.delegate = self
    session.activateSession()
}
```

"IMPORTANT"としっかりと書いてあります。`isSupported()`もちゃんと呼びなさいということです。

> 
IMPORTANT
>Always assign a delegate and activate your session before calling any session-related methods. The session must be configured and activated before sending messages or obtaining information about the state of the connection. Before activating the session, you may call the isSupported method to make sure that current device can use the Watch Connectivity framework.

## まとめ

ちゃんとドキュメントに目を通しましょうってことなんですよね。。。
ATtiny841でVUSBとSPI（REMAP）同居したい人居る? （リンクのみ）

## リンクのみ

なんだか苦戦しましたが、ギリギリ動きましたので、リンク貼っておきます。

https://github.com/tadfmac/mi-muz/blob/master/arduino/libraries/HybridMidiAttiny/examples/dual_MCP4131_h/dual_MCP4131_h.ino

## ちょっとだけ

何のコード？

- [mi:muz:expr#2](https://github.com/tadfmac/mi-muz/tree/master/boards/expr2)というI2CとVUSBのどっちでもMIDI流せるボード用。[HybridMidiATtiny](https://github.com/tadfmac/mi-muz/tree/master/arduino/libraries/HybridMidiAttiny)というライブラリでI2CとVUSBのどちらかを自動判定して繋げてくれている。(スケッチ側はほとんど意識しなくて良い)
- MIDI Control Changeを受けたらSPI経由でMCP4131というSPIで制御するデジタルポテンショメータにデータを送っている
- 2つのデジタルポテンショメーターはDelayエフェクターの可変抵抗を置き換えた。[こんな感じ](https://www.youtube.com/watch?v=Mvd4191JFK8)でMIDI Controllerからいじれるようになった。

以上です。
JavaScriptの継承を復習してみよう

## はじめに

JavaScriptの継承を復習します。継承には、プロパティの継承とメソッドの継承があります。プロパティの継承はapplyを使ったものがあり、メソッドの継承はprototypeを使ったものがあります。

## プロパティの継承

まずは、プロパティの継承を確認します。

JavaScriptでは、プロパティの継承は継承先のコンストラクタで継承元のコンストラクタをapplyを使って呼び出すことで実現します。

SuperClass, SubClassというコンストラクタを定義して、SuperClassを継承元、SubClassを継承先とすると、SubClassでSuperClassのコンストラクタをapplyを使って呼び出すことで実現します。

applyはapplyのレシーバを関数、applyの第１引数をその関数のコンテキスト、applyの第２引数をその関数の引数とします。ここではレシーバがSuperClass、第１引数がthis、第２引数が[subdata]としています。気を付けることは第２引数が配列ということです。つまり、関数の引数は配列で渡しています。

余談ですが、JavaScriptのapplyはLispのapplyに、JavaScriptのcallはLispのfuncallに似ていると思うのは私だけでしょうか？

```
var assert = function (val1, val2) {
  if (val1 !== val2) alert(`those are not equal: ${val1} !== ${val2}`);
}

var SuperClass = function (data) {
  this.data = data;
}

var superclass = new SuperClass("super class");
assert("super class", superclass.data);
assert(SuperClass, superclass.constructor);
assert(undefined, superclass.prototype);
assert(Function, SuperClass.constructor);
assert("object", typeof SuperClass.prototype);
assert(SuperClass, SuperClass.prototype.constructor);

var SubClass = function (subdata, info) {
  this.info = info;
  SuperClass.apply(this, [subdata]);
}

var subclass = new SubClass("sub class", "sub info");
assert("sub class", subclass.data);
assert("sub info", subclass.info);
assert(SubClass, subclass.constructor);
assert(undefined, subclass.prototype);
assert(Function, SubClass.constructor);
assert("object", typeof SubClass.prototype);
assert(SubClass, SubClass.prototype.constructor);
```

## メソッドの継承

次に、メソッドの継承を確認します。

JavaScriptでは、prototypeを使ってメソッドの継承を実現します。

具体的には、まず、継承先のコンストラクタのprototypeに継承元のオブジェクトを指定します。そして、自然な感じに仕上げるために、継承先のコンストラクタのprototype.constructorに継承先のコンストラクタを指定します。

そうすると、継承元で定義した関数を継承先で呼び出すことができるようになります。

```
var assert = function (val1, val2) {
  if (val1 !== val2) alert(`those are not equal: ${val1} !== ${val2}`);
}

var SuperClass = function (data) {
  this.data = data;
}

SuperClass.prototype.getData = function () {
  return this.data;
}

var superclass = new SuperClass("super class");
assert("super class", superclass.getData());
assert(SuperClass, superclass.constructor);

var SubClass = function (data, info) {
  this.info = info;
  SuperClass.apply(this, [data]);
}

SubClass.prototype = new SuperClass;
SubClass.prototype.constructor = SubClass;

var subclass = new SubClass("sub class", "sub info");
assert("sub class", subclass.getData());
assert(SubClass, subclass.constructor);
```

## まとめ

プロパティの継承とメソッドの継承を復習しました。

オブジェクトのプロパティにprototypeがないということが分かり、かなり整理できました。
プログラマ（だけ）のための英単語帳

## 背景

Qiitaの英語タグには面白さが無いと思ったので書いた。
こういう語を探すのは大変なので、皆さまコメントください。

## 本文

**legacy**
遺産
プログラマ的には「負の遺産」という意味で使われる。本来の語とテストコードは関係ない。

**default**
欠席、不履行
default valueは指定が「無かった」時の値であり、本来はdefaultに「初期」という意味はない。

**string**
紐、弦
文字列の「列」。本当は文字じゃなくても良いのだろうが……

**float**
浮く、浮いたもの
浮動小数点数の「浮動」であり小数の意味はない。Webデザイナーにはなじみの語。

**hash**
細切れにする
データ全体を細切れにし小さな値にまとめたものをハッシュ値と呼ぶ。さらにハッシュ値をキーとした連想配列をHashMap、Ruby言語などでは略してHashと呼ぶ。

**wrap**
包む、くるむ
プログラミング用語としては、254→255→0→1 のように、値が限界を超えた時に反対側の限界値にもどること。レースの周回 (lap) とは関係ない。

**port**
港
プログラミング用語としてはTCP/IPのポート番号としてしか利用されない。import/exportの語源だが、portとimportが同じ文脈で使われることは無い。

**boot**
ブーツ（長靴）
起動の意味は無い。なぜIT界隈だとbootが起動の意味に使われるようになったかは、諸説あるようだ。
Rails4 rails_config から config へ変更する

rails_config が config ( https://github.com/railsconfig/config/ ) という gem 名に変わりました。
変更するためには、若干のソース修正が必要です。

# 参考

https://github.com/katsuhiko/sample_app_rails_4/commit/7275dac9ae2e89bab2c80db5710aeebcad85542e

# 変更手順

## Gemfile の変更

rails_config を config に変更します。
変更後 bundle install します。

```rb:Gemfile
# gem "rails_config"
gem "config"
```

## RailsConfig から Config を利用するように変更

config/initializers/rails_config.rb を config/initializers/config.rb へリネームします。

そのあとクラス名を Config に変更します。

```rb:config/initializers/config.rb
# RailsConfig.setup do |config|
Config.setup do |config|
  config.const_name = "Settings"
end
```

以上で変更は完了です。
選択したテキストをMacVimで編集するAutomator


超単純。

![image](http://i.imgur.com/ptrdNtY.png)

```bash
declare -x scratchfile=/tmp/"$(osascript -e 'tell application "System Events" to get name of (path to frontmost application)')"-"$(date '+%s')"-"$$"
cat - > "$scratchfile"
mvim -f +"set noconfirm noswapfile" && cat "$scratchfile"
```

* 選択したテキストを一時ファイルに保存。
* MacVimで編集。
* 元のテキストと置き換える。

## ダウンロード

http://cl.ly/d5mv/Edit%20with%20MacVim.workflow.zip
Succinct Multibit Tree: Compact Representation of Multibit Trees by Using Succinct Data Structures in Chemical Fingerprint Searchesを読んだ

# Succinct Multibit Tree: Compact Representation of Multibit Trees by Using Succinct Data Structures in Chemical Fingerprint Searchesを読んだ

## どんなもの？
化合物の類似検索の高速でメモリ効率の良い手法を提案

## 先行研究と比べると？
メモリ効率が良い。同じデータを保持するのに10分の1ですんだ。
検索が早いのは従来のmultibit treeをそのまま持つ場合だったが
メモリの使用量は一番多かった

## 技術や手法のキモはどこ？
- multitbit tree,fingerptint dbの簡潔データ構造を作った

## どうやって有効だと検証した？
punchemのデータベースで従来法と比較した。

## 次に読むべき論文は？
- A tree-based method for the rapid screening of chemical fingerprints
capistrano3 デプロイ時に git revision をファイルに出力する

# 追記

この記事の内容を gem として作り、rubygems に登録しました。

* https://github.com/katsuhiko/capistrano3-revision/
* https://rubygems.org/gems/capistrano3-revision

以下のサイトを参考にしました。

* gem の作成方法
  * [capistrano3-notification作った](http://qiita.com/masarakki/items/049b2a1d02269e928d72)
* rubygems への登録方法
  * [作ったgemをリリースするまで](http://qiita.com/kyohei8/items/b292f727e213ed7db9d7)


# バージョン

| version | 
|:---|
| capistrano 3.3.5 |

# 参考

- http://qiita.com/yuku_t/items/75bbd1bf6422d4a59b94

# capistrano のタスクを作成する

タスク部分のみで他は省略しています。

https://github.com/railsconfig/config を利用しているので、
出力先は config/settings.local.yml にしています。

```rb:config/deploy.rb
namespace :deploy do

  desc 'Save current revision'
  task :save_current_revision do
    on roles(:app), in: :groups, limit: 10, wait: 5 do
      within release_path do
        execute :echo, "'revision: #{fetch :current_revision}' > config/settings.local.yml"
      end
    end
  end

  before :updated, :save_current_revision
end
```

これで view に表示することもできます。erb の場合は以下です。

```rb
(rev.<%= Settings.revision %>)
```
ネストしたコントローラーに対してrootにルーティングを設定する

今回次のような形でプロジェクト内にコントローラー、ビューが配置されている。

```project:proto_project
proto_project
 /app
  /controllers
   /prototypes
    latest_controller.rb
    ranking_controller.rb

  /views
   /prototypes
    /latest
     index.html.haml
    /ranking
```

変更前

```rb:routes.rb
Rails.application.routes.draw do
  namespace :prototypes do
    resources :ranking, only: [:index]
    resources :latest, only: [:index]
  end
    
end

```

develop環境にてlocalhost:3000/にアクセスした時にlatest#indexアクションを起動するようにしたい。次の様に書くことでルーティングを設定する。

変更後

```rb:routes.rb
Rails.application.routes.draw do
  root to:  'prototypes/latest#index'  

  namespace :prototypes do
    resources :ranking ,only: [:index]
  end 
end

```

ここで次のように/controllers/prototypes/latest_controller.rbと階層があるので上記のコードのように`root to: 'prototypes/latest#index'` と書くことで期待したルーティングを設定することができた。
Ansibleでgitの更新の時のみコマンド実行

最近ChefからAnsibleに移ってきたのですが、git周りで少し手こずったので、ここでまとめておきます。

`git`のレポジトリを更新する時に、新しくなった場合のみコマンドを実行し、それ以外の時は何もしないようにしたかったのですが、[ドキュメンテーション](http://docs.ansible.com/ansible/git_module.html)を見てもあんまりそれらしい情報が見つかりませんでした。

ソースコードを少し見てみたら、`register`を使う場合は`myvar.changed`でレポジトリが変わったかどうかを判定できることが分かったので、こんな感じで書くことができました。

```yaml
- name: Fetch project
  git: repo={{ repository }} accept_hostkey=yes dest={{ project_dir }}
  register: gitclone

- name: Build project
  command: make
  when: gitclone.changed
  args:
    chdir: "{{ project_dir }}"
```

`register`を使う時はどのような値が使えるかがドキュメンテーションを読んでもあんまり分からなかったのですが、各モジュールのソースコードで`module.exit_json`を探せば分かるようです。例えば[gitモジュール](https://github.com/ansible/ansible-modules-core/blob/devel/files/copy.py#L320)を見ると`changed`が設定されてることが分かります。
MaxでApplicationビルドした時にPresentationモードで実行されるようにする

# MaxでApplicationビルドした時にPresentationモードで実行されるようにする

よく忘れてしまうので

### 1.パッチ上で右クリックし、Inspector Windowを開く

![max_patch_inspector.png](https://qiita-image-store.s3.amazonaws.com/0/35267/700c03ca-74b9-450f-dcee-21d3a22d3e54.png)

### 2.Inspectorの Open Presentation にチェックを入れる

![patch_inspector_window.png](https://qiita-image-store.s3.amazonaws.com/0/35267/6b2b4cf8-904f-a2df-3356-e7ce10f999d4.png)

### 3.アプリケーションビルドすると、自動的にプレゼンテーションモードで実行されるようになります
unity > System.DateTime > "09/10 13:30"をパース > FormatException: String was not recognized as a valid DateTime. > 2015/09/10 13:30でないとだめ

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

横軸が1週間のグラフの実装をしていて、日付のパースに失敗した。

`09/10 13:30`という日時を読み取ろうとして

```
System.DateTime dt = System.DateTime.Parse ("09/10 13:30");
Debug.Log (dt.ToString ());
```

したら、以下のエラーとなった。

```
FormatException: String was not recognized as a valid DateTime.
```

以下の結果であった。

- 2015/09/10 13:30 : OK
- 15/09/10 13:30 : NG
- 09/10 13:30 : NG

後者２つがダメな理由としてはどれがmonth, dayなのか判別できないからなのだろう。

ただし、2015/09/10がyyyy/mm/ddの場合とyyyy/dd/mmの場合もあり、このあたりはyyyy/mm/dd固定なのだろう。
Tor Browserのインストール

* 今まで別のグローバルIPからの表示確認に自宅にリモート接続して確認していたが、これを使えば同一端末で確認ができて便利
* わりと早い (TTL 250msecくらい？)

## 参考

* [Torを使って個人情報をコントロールする方法 - Qiita](http://qiita.com/syui/items/ebd6734a8102c7906cc1)

## Downloads

* [Download Tor](https://www.torproject.org/download/download-easy.html.en#linux)

```bash:解凍
tar xf tor-browser-linux64-*.tar.xz
```

## 起動

```bash:
tor-browser/start-tor-browser
```

----

# torのインストール

```bash:インストール
sudo apt-get install -y tor
```

    * インストールしたら自動で起動する。

```bash:グローバルIP確認
curl -sL ipinfo.io
```

```bash:Tor経由のグローバルIP確認
curl -sL ipinfo.io --socks5 127.0.0.1:9050
```

## firefoxをTor経由で通信

![tor.png](https://qiita-image-store.s3.amazonaws.com/0/25728/91521c52-f226-f67f-e300-d04f98427642.png)
unity > System.DateTime > 1週間を[0,1]で表す時、現在日時はどこにくるか、の実装

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

##計算概要

日時X: 2015/09/12 19:02:09

日曜始まりの1週間表示のグラフを作る時、上記の日時Xはグラフのどのあたりに来るかの計算。

手順
1. 日曜日の日付を取得
2. 日数(X - 日曜)を取得 : 整数
3. 時分の割合を取得 
4. (2+3)を1週間の日数の7で割る


[v0.2 on github](https://github.com/yasokada/unity-150912-weeklyGraph/releases/tag/v0.2)


```MyScript.cs
using UnityEngine;
using System.Collections;
using System; // for TimeSpan

/*
 * v0.2 2015/09/12
 *   - add getDayHourMinFractionOfWeek()
 * v0.1 2015/09/12
 *   - get days from sunday
 */

public class MyScript : MonoBehaviour {

	System.DateTime getSundayH00M00S00(System.DateTime dt) {
		System.DateTime res = dt;
		dt -= new TimeSpan ((int)dt.DayOfWeek, dt.Hour, dt.Minute, dt.Second);
		return dt;
	}

	float getDayHourMinFractionOfWeek(System.DateTime dt) {
		System.DateTime sunday = getSundayH00M00S00 (dt);
		
		int daysdiff = dt.Subtract (sunday).Days;
		
		int hourMin_min = dt.Hour * 60 + dt.Minute;
		float hourMinFraction = (float)hourMin_min / (24f * 60f); // 24 hours x 60 minutes
		float ddhhmmFraction = (float)daysdiff + hourMinFraction;

		Debug.Log ("target: " + dt.ToString ());
		Debug.Log ("sunday: " + sunday.ToString ());
		Debug.Log ("days: " + daysdiff);
		Debug.Log ("ddhhmmFraction: " + ddhhmmFraction);

		return ddhhmmFraction / 7.0f; // 7 days a week
	}


	void Test_weekly() {
		float daysFraction;
		daysFraction= getDayHourMinFractionOfWeek (System.DateTime.Now);
		Debug.Log (daysFraction.ToString ("0.000"));
	}

	void Start () {
		Test_weekly ();
	}
	
}
```

結果

![Main_unity_-_150912-weeklyGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/b7ae4a35-e33b-4fd9-3a55-0be12df46d82.jpeg)

1. 9月12日は日曜日9月6日から6日経過。
2. 19時02分は1日を[0,1]で表すと (19時間 * 60 + 2分) / (24時間 * 60分) = 0.793。
3. 1+2の結果 : 6.793
4. 6.793 / 7日 = 0.970
GitLabからwebhook+PHPで超簡易自動デプロイシステムを作る

GitLabの`release`ブランチにpushイベントがあったとき（⊃ マージされた時）に`release`ブランチに自動反映できるようにします。
GitLab CI等のCIツールを入れるほどじゃない小さなアプリケーションを複数人で高速にサクッと開発していきたいときには、これぐらいでもいいのかなと考えています。

スクリプトは非常に簡単にPHPで書きます。

## 初心者向け：そもそもWebhookって何？

特定のアクションをトリガーとしてある指定したURLにHTTPリクエストを送ることのできるAPIのことです。
GitLabのwebhookではpushイベントをトリガーにできるので、
あとはURLだけ指定すれば決まったリクエストがpushイベントのたびに送られます。

これを使うと、特定のブランチにpushイベントが有ったときに何らか動作をさせる、という動作が可能になる、というわけです。

ぱっとググッたらここがわかりやすかったです。
https://sendgrid.kke.co.jp/blog/?p=1851

## どんなふうに作るか

GitLabはpushイベント時にwebhookが使えるので、
`http://webhook.mydomain.com/release.php`で叩き、
同サーバー内のアプリケーションのディレクトリで`git pull origin release`を実行させるようにする。


## スクリプト

```php:release.php
<?php

$secret_key = "secretkey"; // GitLab以外からのリクエストを受け付けないためのキー
$git_username = "bot"; // gitlabのログインパスワード
$git_password = "password"; // gitlabのログインパスワード
$log_file = '/path/to/webhook_log.txt';
$date = (new DateTime())->format('Y-m-d H:i:s');
$path_to_repository = '/path/to/repository';
$branch_name = 'release';
$git = '/usr/local/bin/git';

if ( !isset($_GET['key']) || !($_GET['key']==$secret_key) ) {
    echo "Invalid key";
    $is_logged = error_log("[{$date}] Error: Invalid key\n",3,$log_file);
    exit;
}

$json_string = file_get_contents('php://input');
$json = json_decode($json_string,true);

error_log("[{$date}] Pushed to {$json['ref']}\n",3,$log_file);

if ($json['ref']=="refs/heads/{$branch_name}") { // releaseブランチのpushイベントの時のみ実行
    $git_remote = "http://{$git_username}:{$git_password}@gitlab.mydomain.com/group/repository_name.git";
    $command = "cd {$path_to_repository} && ${git} pull {$git_remote} {$branch_name} 2>&1";
    exec($command, $output, $exit_status);

    if ($exit_status > 0) {
        $error_msg = "[{$date}] Error: \n";
        foreach ($output as $line) {
            $error_msg .= "    {$line}\n";
        }
        error_log($error_msg,3,$log_file);
    } else {
        error_log("[{$date}] Updated successfully\n",3,$log_file);
    }
}

```

`webhook.mydomain.com`のようなサブドメインを作ってApacheなどでvirtualhostを作り、このドキュメントルートにこの`release.php`を入れればOK。

また、`git pull origin release`が実行されるのはApacheの実行ユーザーなので、コマンドやリポジトリのパスは絶対パスで指定したほうがいい。またリポジトリの所有権をApacheの実行ユーザーにしておいている。

GitLabのpushイベントのPOSTデータの中身は以下を参照。
https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/web_hooks/web_hooks.md

## GitLabでの設定

リポジトリのsettingの中にwebhookという項目があるので、そこで`push`にチェックを入れて以下のURLを入力すればOK。

```
http://webhook.mydomain.com/release.php?key=secretkey
```

`secretkey`は攻撃を受けないためのささやかな対策。

## 終わりに

超簡単ですがこれで反映ができるようになりました。
スクリプトはまだまだ改善の余地あり。
エラーじゃないのにerror_logでログはいてたり、権限設定がすごく面倒だったり。

あと、自動デプロイだけではバグが本番で見つかった場合に戻すのが手動なので、`git clone`しなおしてシンボリックリンクを張り替える形式にしたほうがよいのかもしれないです。
iOS swiftにおけるクラスinitializeメモ

swiftの`init`に関するメモ

```swift:test.swift
class Test:NSObject{
   var obj1:NSObject;
   var obj2:NSObject = NSObject()

   init(){
      obj1 = NSObject();//クラス変数宣言の時に初期化していない変数は`super`の前に初期化しないとエラー

      super.init();
      obj2 = NSObject();//クラス変数宣言の時に初期化済の変数は`super`のあと
   }
}
```
unity > System.DateTime > 日曜日からの日数を計算する > nowとsundayを取得 / int daysdiff = now.Subtract (sunday).Days;

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

現在時刻が前の日曜日から何日目かを知りたい。

[v0.1 @ github](https://github.com/yasokada/unity-150912-weeklyGraph/releases/tag/v0.1)

```MyScript.cs
using UnityEngine;
using System.Collections;
using System; // for TimeSpan

/*
 * v0.1 2015/09/12
 *   - get days from sunday
 */

public class MyScript : MonoBehaviour {

	System.DateTime getSundayH00M00S00(System.DateTime dt) {
		System.DateTime res = dt;
		dt -= new TimeSpan ((int)dt.DayOfWeek, dt.Hour, dt.Minute, dt.Second);
		return dt;
	}

	void Test_weekly() {
		System.DateTime now = System.DateTime.Now;
		System.DateTime sunday = getSundayH00M00S00 (now);

		int daysdiff = now.Subtract (sunday).Days;

		Debug.Log ("now: " + now.ToString ());
		Debug.Log ("sunday: " + sunday.ToString ());
		Debug.Log ("days: " + daysdiff);
	}

	void Start () {
		Test_weekly ();
	}
	
}
```

![Main_unity_-_150912-weeklyGraph_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/40c39c7a-d189-e0fe-1f5a-3c146d62fe4e.jpeg)

きちんと6日が取得できた。
unity > System.DateTime > Negate() > マイナス値を返す > int daysdiff = now.Subtract (sunday).Negate ().Days;

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

```sample.cs
int daysdiff = now.Subtract (sunday).Negate ().Days;
```

参考
http://stackoverflow.com/questions/1905443/subtract-2-datetime-fields-to-get-the-days-left-difference
Ruby-Processing 画像をマウスカーソルに向けて回転


矢印画像を回転させて、マウスカーソルのほうを向くサンプルです。

![rp5-arrow.gif](https://qiita-image-store.s3.amazonaws.com/0/1900/5faccadc-b58a-536e-5ff4-d1d7463cd525.gif "rp5-arrow.gif")

マウスカーソルに対する矢印画像の回転角度の計算はベクトルの内積で求めています。

```ruby:vector-dot.rb
load_library :vecmath

# X, Y は数学座標系(Y 軸、上方向を正)

# ベクトル a とベクトル b のなす角度(ラジアン)を求める
def calc_angle(a, b)
  cos_theta = a.dot(b) / (a.mag * b.mag)
  theta = Math::acos(cos_theta)
  theta
end

def with_matrix
  if block_given?
    push_matrix
    yield
    pop_matrix
  end
end

def setup
  size 400, 400

  @vecs = [] # 矢印画像の座標
  [
    [40, 40],
    [0, 80],
    [60, -50],
    [-90, 10],
    [-50, -90],
  ].each {|x, y|
    @vecs << Vec2D.new(x, y)
  }

  @image = load_image('./arrow.png')
  image_mode(CENTER)
end
def draw
  background 255

  rect_mode(CENTER)

  # マウス位置に円を描画
  ellipse(mouse_x, mouse_y, 10, 10)

  translate(width/2, height/2) # 原点を画面中央にする
  line(-width, 0, width, 0)
  line(0, -height, 0, height)

  # ベクトル a (マウス位置)
  a = Vec2D.new(mouse_x - width/2, -(mouse_y - height/2))
  @vecs.each {|b|
    # ベクトル c を求める
    c = a - b

    rad = calc_angle(Vec2D.new(1, 0), c)
    with_matrix do
      translate(b.x, -b.y)
      rotate(a.y >= b.y ? -(rad-90.radians) : (rad+90.radians))
      image(@image, 0, 0)
    end
  }
end
```

コマンドラインから次のように実行します。

```
$ rp5 --nojruby run vector-dot.rb
```

補足: `--nojruby` オプションを付けない場合は、`load_image()` には絶対パスを指定しなければならないようです。参考: https://github.com/jashkenas/ruby-processing/issues/83
Python3.3未満ならDoS対策に-Rオプションか環境変数PYTHONHASHSEED="random"を使おう

Python3.3未満では、str、bytes、datetime型の「ある値」を含む`dict`を作ると計算がものすごーーーーく大変でCPUに莫大な負荷をかける場合があって、第三者が悪用するとサービスを停止させることができます。

これを防ぐには、 `python` コマンドに`-R`オプションを付けるか、環境変数`PYTHONHASHSEED="random"`を指定する必要があります。[^1]

[1. コマンドラインと環境 — Python 3.3.6 ドキュメント](http://docs.python.jp/3.3/using/cmdline.html#miscellaneous-options)の`-R`オプションの説明にはこう書かれています。

```
以前のバージョンの Python では、このオプションはハッシュのランダム化を有効にします。これにより、 str, bytes, datetime 型の __hash__() 値が予測不可能な乱数で “salt” 化されます。ハッシュ値は各 Python プロセスでは固定ですが、 Python を繰り返し再実行した場合は別の予測不能な値になります。

ハッシュのランダム化は、 dict の生成コストが最悪の O(n^2) になるように注意深く選ばれた入力値を与えることによる DoS 攻撃への防御策として提供されています。詳細は http://www.ocert.org/advisories/ocert-2011-003.html を参照してください。
```

Python3.3以上ではデフォルトでハッシュのランダム化をやってくれますが、互換性のために上記オプションは残っています。
たぶん、まだPython2系を使っている人は多いと思いますので、ご注意ください。

[^1]: "random"は「ランダムな文字列を入れる」という意味ではなくて、書いてある通り"random"と設定するという意味です。
Dockerでsbtの初回起動のダウンロード分をキャッシュする

#要件
`sbt`のテスト環境をdockerを作っていたところ、毎度`docker run image sbt test`が遅いので早くする。

#方法
筋肉で解決 :muscle: 

```
RUN sbt -sbt-version 0.12.2                                                                                                                                                    
RUN sbt -sbt-version 0.12.3                                                                                                                                                    
RUN sbt -sbt-version 0.13.4                                                                                                                                                    
RUN sbt -sbt-version 0.13.0                                                                                                                                                    
RUN sbt -sbt-version 0.13.1                                                                                                                                                    
RUN sbt -sbt-version 0.13.2                                                                                                                                                    
RUN sbt -sbt-version 0.13.3                                                                                                                                                    
RUN sbt -sbt-version 0.13.4                                                                                                                                                    
RUN sbt -sbt-version 0.13.5                                                                                                                                                    
RUN sbt -sbt-version 0.13.6                                                                                                                                                    
RUN sbt -sbt-version 0.13.7                                                                                                                                                    
RUN sbt -sbt-version 0.13.8                                                                                                                                                    
RUN sbt -sbt-version 0.13.9
```
ASP.NET Web APIを業務アプリ開発で使う時の勘所

# ASP.NET Web APIの勘所
日本マイクロソフト株式会社の赤間さんのセッションを見た時のメモ

## Web APIというとRESTful型、JSONエンコードというイメージがあるがRPC型、XMLエンコードもいいよ

## サーバー・クライアント間の通信
### RESTfulスタイル
エンティティオブジェクトのCURD処理の形で実装

### RPCスタイル
処理伝票の送信と結果伝票の受信の形で実装

ASP.NET Web APIのサンプルでRESTfulなサーバーAPIを開発するというのをよく見かける

## ASP.NET Web APIはRESTfulスタイル用の技術ではない！
マッピングルールを変更するとRPCスタイルも使える
ASP.NET Web APIの既定のマッピング

* URL：コントローラクラス名
* HTTP Verb：メソッド名

|HTTP Verb|意味|
|---|---|
|GET|READ|
|POST|CREATE|
|PUT|UPDATE|
|DELETE|DELETE|

## JSON vs XML
### JSONを使うよりXMLを使った方が使い勝手がよい場合もある
JSONはシリアル化/デシリアル化で問題がでやすい

### なぜ？
JSONでは標準で扱えるデータ型が限られている
JSONの型：整数型、浮動小数点型、文字列型、boolean、配列、オブジェクト、null以外で問題が出やすい
問題が出る例：日付型、byte[]型など

### ASP.NET Web APIでシリアル化形式を変更する
```vbnet:VB.Net
Dim httpClient = New System.Net.Http.HttpClient
httpClient.DefaultRequestHeaders.Accept.Add(New Net.Http.Headers.MediaTypeWithQualityHeaderValue("text/xml"))
```
※参照設定にSystem.Net.Httpが必要

## WCFとASP.NET Web APIの本質的な違い
||WCF|ASP.NET Web API|
|---|---|---|
|API設計スタイル|RPC型のみ|自由(RESTfulなど)|
|メッセージフォーマット|SOAPのみ|自由(JSONなど)|
|通信プロトコル|自由(HTTP、TCP/IPなど)|HTTP|
* WCFはAPIスタイルが限定されているが通信方式は自由
* ASP.NET Web APIは通信方式が限定されているがAPIスタイルは自由
WordPressからデータを取得するメモ

要件に合わせる為に（或いは管理画面作成コストを下げたい）、WordPressをカスタマイズしたいという話は多いので。

# 拡張フィールド
拡張フィールドはこれを使うのが簡単。
Advanced Custom Fields
http://www.advancedcustomfields.com/

# データを取得する
WordPressシステム外からデータを取得したい場合、以下のようなソースになる。

```php:hoge.php
require_once('wp/wp-load.php');
// require_once('wp/wp-blog-header.php');

print_r(get_list());
// print_r(get_list_by_sql());

exit();

/**
 * SQLで取得する
 */
function get_list_by_sql() {
	global $wpdb;

	// 拡張フィールドも含んでみる
	$sql = <<<_EOD_
	SELECT p.*, pm.meta_value
	FROM {$wpdb->prefix}posts p
	LEFT JOIN {$wpdb->prefix}postmeta pm 
	ON pm.post_id = p.id AND pm.meta_key = 'address'
	WHERE pm.meta_value LIKE %s
_EOD_;
	
	// オブジェクト形式でデータが戻って来る
	$list = $wpdb->get_results($wpdb->prepare($sql, "%東京%"));
	
	return $list;
}

/**
 * WP_Queryを利用する
 */
function get_list() {

	$list = array();

	$the_query = new WP_Query(array(
			'nopaging' => '1',
		));
	if ($the_query->have_posts()) {
		while ($the_query->have_posts()) {
			$the_query->the_post();
			$row = array();
			$row['id'] = get_the_ID();
			$row['title'] = get_the_title();	
			$row['address'] = get_field('address');
			$list[] = $row;
		}
	}

	wp_reset_postdata();
	
	return $list;
}
```

# wp-blog-header.php
wp-blog-header.php は以下の処理を行う。
通常は wp-load.php で構わない。

1. wp-load.phpを呼び出す。
2. wp() を呼び出して、クエリパラメータ解析及びデータを読み込む。
3. テンプレートを読み込む。

# プレビュー表示について
WordPressフォルダ配下以外ではWP管理画面の認証情報は引き継がれない。
(cookieが制限されている）
プレビュー表示などは注意が必要。

# 投稿ポスト
場合によっては独自の投稿タイプを作成する。

```functions.php
function my_create_post_type() {
	register_post_type(...);
}
add_action( 'init', 'my_create_post_type' );
```

# 似たような話
http://qiita.com/xylitol45@github/items/cbda18e55c857ed9bb74
UnityでUDPを受信してみる


UdpServer かなっと思ったら、UDP::Receive だった。

```C#:UDPServer.cs
using UnityEngine;
using System.Collections;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;

public class UDPReceive : MonoBehaviour
{
	int LOCA_LPORT = 22222;
	static UdpClient udp;
	Thread thread;

	void Start ()
	{
		udp = new UdpClient(LOCA_LPORT);
		udp.Client.ReceiveTimeout = 1000;
		thread = new Thread(new ThreadStart(ThreadMethod));
		thread.Start(); 
	}

	void Update ()
	{
	}

	void OnApplicationQuit()
	{
		thread.Abort();
	}

	private static void ThreadMethod()
	{
		while(true)
		{
			IPEndPoint remoteEP = null;
			byte[] data = udp.Receive(ref remoteEP);
			string text = Encoding.ASCII.GetString(data);
			Debug.Log(text);
		}
	} 
}

```

netcat で確認

```sh
echo 'hello' | nc -u 127.0.0.1 22222
```

送信はこちら
http://qiita.com/nenjiru/items/d9c4e8a22601deb0425b
The file “MyApp.app” couldn’t be opened because you don’t have permission to view it”

デバッグしていて思い出したのでメモ

#1 Derived Dataを消す
ググると一番多く出てくる解決策
こちらを参考に実行
swift - "The file "MyApp.app" couldn't be opened because you don't have permission to view it" when running app in Xcode 6 Beta 4 - Stack Overflow
http://stackoverflow.com/questions/24924809/the-file-myapp-app-couldnt-be-opened-because-you-dont-have-permission-to-vi

でも動かなかった(´・ω・`)

#2 Build PhasesのCompile Sourcesにmain.mファイルを追加
これで解決
その他の必要な.mファイルも消えている可能性があるのでチェック
![qiita01.png](https://qiita-image-store.s3.amazonaws.com/0/48148/103ec157-69bc-fd40-df6a-a0c8e14d7fba.png)