OmniAICreator/Qiita-1.07M huggingface dataset:
JavaScriptで、divとかの要素を好きな位置にドラッグで動かせるやつ作ったんやで

# はじめに
DIVとかを手軽にドラッグ可能にしたかったので、作ってみました。
GitHubとか、なんか初めて公開する気がする。



# 作ったやつ
↓ここで、サンプルとかものせてます。
https://github.com/nnahito/dragpos




# コード
```javascript
var Dragpos = (function() {
    /**
     * コンストラクタ
     * @param       {Object}    element     ドラッグさせたいオブジェクト
     * @constructor
     */
    function Dragpos(element) {
        // 初期値で与えられた要素をプロパティとして持たせる
        this.panel = document.getElementById(element);


        // フラグを（一応）初期化しておく
        this.drag = false;

        // アクションをすべてバインド
        document.addEventListener('mousedown', this.mouseDown.bind(this), false);
        document.addEventListener('mouseup', this.mouseUp.bind(this), false);
        document.addEventListener('mousemove', this.mouseMove.bind(this), false);

    }


    // クリックされたとき
    Dragpos.prototype.mouseDown = function(e){
        // クリックのターゲットが自分かどうかを確認
        if ( e.target == this.panel ){
            // 自分自身なら、ドラッグを許可
            this.drag = true;

        } else {
            // 自分でなければ、ドラッグを不許可
            this.drag = false;
        }


    }



    // クリックが離されたとき
    Dragpos.prototype.mouseUp = function(e){
        this.drag = false;
    }



    // マウスが移動したとき
    Dragpos.prototype.mouseMove = function(e){
        if (this.drag == true){
            this.move(e);
        }
    }



    // 要素の座標を移動させる処理
    Dragpos.prototype.move = function (e) {
        var offsetX; // スクロール位置（横）
        var offsetY; // スクロール位置（縦）
        var x; // x座標
        var y; // y座標
        var rect = {}; // 四角形の(x, y, w, h)が入る

        // 四角形の(x, y, w, h) = (X座標, Y座標, 幅, 高さ)を取得
        rect.x = this.panel.offsetLeft;
        rect.y = this.panel.offsetTop;
        rect.w = this.panel.clientWidth;
        rect.h = this.panel.clientHeight;

        // 四角形の中央を求める
        offsetX = rect.w / 2;
        offsetY = rect.h / 2;

        // マウスの位置がドラッグを行いたい要素の中なら
        if (e.pageX > rect.x && e.pageX < rect.x + rect.w) {
            if (e.pageY > rect.y && e.pageY < rect.y + rect.h) {
                // 要素をマウスに付い順させて動かす
                x = e.pageX - offsetX;
                y = e.pageY - offsetY;

                // 要素のスタイルと場所を変更
                this.panel.style.position = 'absolute';
                this.panel.style.top = y + 'px';
                this.panel.style.left = x + 'px';
            }
        }

    }

    return Dragpos;
})();

```


# 参考
- [http://www.findxfine.com/programming/javascript/995556137.html](http://www.findxfine.com/programming/javascript/995556137.html)
- [https://teratail.com/questions/91305](https://teratail.com/questions/91305)
[備忘録]railsでcookiesで配列を保存したいときは気をつける。

cookiesのリファレンスにある具体例には以下のようにあります。

|[cookiesのリファレンスにある具体例](http://railsdoc.com/references/cookies)|
|---|
|![](https://i.gyazo.com/0fc72e213b6c0d2cb15ed71b4209f8ff.png)|

#実装してみると・・・

例にならってcookiesに配列を代入します。

```
cookies[:hoge] = [1,2]
```

これを参照しようとすると、
要素にjoin("&")したような形で文字列になって返ってきます。
配列として扱えない。

```
cookies[:hoge] #=> "1&2"
```

そのため、このまま使うならsplit("&")のような処理をしてarrayで処理するか、
そもそもarrayで保存せずにstringで保存してjoin(",")など任意の文字で配列に変換できる文字列を保存するかになるのですが、
これだと、join(",")からjoin("-")などに変更すると、
すでにユーザーのクッキーに前の状態のデータ（`join(",")`などで生成した文字列）が保存されていると、
そのための処理が必要になります。
なので、ここはJSON.parseしてしまいましょう。

#JSON.parseでの実装

配列の代入

```
my_array = [1,2]
cookies[:hoge] = JSON.generate(my_array)
```

参照

```
JSON.parse(cookies[:hoge])
```

stackoverflowなどを見ると、配列に`join(",")`して文字列で保存して変換して使う方法も書いてありますが、
私はこちら推しです:hugging_face:
fetch API でも POST したい！

# fetch API でも POST したい！

ちなみに fetch API は WHATWG HTML Living Standard で定義されていて、W3C HTML 5.1 でもなければ ECMAScript2017 でもないです。

2017年現在 Safari や IE では未サポートなので https://github.com/github/fetch などの polyfill を使うと良いです。

## post (application/x-www-form-urlencoded)

```js
const obj = {hello: "world"};
const method = "POST";
const body = Object.keys(obj).map((key)=>key+"="+encodeURIComponent(obj[key])).join("&");
const headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8'
};
fetch("./new", {method, headers, body}).then((res)=> res.json()).then(console.log).catch(console.error);
```

## post (multipart/form-data)

```js
const obj = {hello: "world"};
const method = "POST";
const body = Object.keys(obj).reduce((o,key)=>(o.set(key, obj[key]), o), new FormData());
const headers = {
  'Accept': 'application/json'
};
fetch("./new", {method, headers, body}).then((res)=> res.json()).then(console.log).catch(console.error);
```

## post (aplication/json)

```js
const obj = {hello: "world"};
const method = "POST";
const body = JSON.stringify(obj);
const headers = {
  'Accept': 'application/json',
  'Content-Type': 'application/json'
};
fetch("./new", {method, headers, body}).then((res)=> res.json()).then(console.log).catch(console.error);
```
Sublime TextでSassをコンパイルしてみる

#概要
若手HTMLコーダーがSassのコンパイル環境の構築に苦戦しているようだったので、少し調べてみる。コンソールに不慣れだろうから、Sublime Text上でコンパイルできる環境を構築する。

Sublime Textを選択した理由は、昔動画をみて惚れたが、私の日常では活躍の場が少なかったため。普段はIntelliJで開発してますし。。

#環境
MacOS Sierra
※Windowsの場合は、rubyのインストールから必要です。

#やること
1. sassとcompassをインストール
2. Sublime Textをインストール
3. Sublime Package Controlをインストール
4. Sass関連のプラグインをインストール
5. Sassをコンパイル

## sassとcompassをインストール
ターミナルを立ち上げ、以下のコマンドを順番に入力してください。
途中パスワードを聞かれるので、PCのログインパスワードを入力してください。

```bash
# gem本体のアップデート
sudo gem update --system

# sassをインストール
# MacOSX El Capitan 以降は、インストール先の指定する必要がある。
sudo gem install -n /usr/local/bin sass

# 念のためインストールできているか確認（バージョンが表示されればOK）
sass -v
# Sass 3.5.1 (Bleeding Edge)

# compassをインストール
sudo gem install -n /usr/local/bin compass

# 念のためインストールできているか確認（バージョンが表示されればOK）
compass -v
# Compass 1.0.3 (Polaris)
# Copyright (c) 2008-2017 Chris Eppstein
# Released under the MIT License.
# Compass is charityware.
# Please make a tax deductable donation for a worthy cause: http://umdf.org/compass
```

## Sublime Textのインストール
[公式ページ](http://www.sublimetext.com/)からダウンロードしてください。

## Sublime Package Controlをインストール
必須ツールと言ってよい。数多のプラグインを探したり管理するのに使用します。

1. [公式ページ](https://packagecontrol.io/installation#Simple)にアクセス
2. SUBLIME TEXT 3のタブの内容をコピーする<br>![capture_20170906.png](https://qiita-image-store.s3.amazonaws.com/0/17376/e8eb1035-c4b1-4192-2ea6-5f6f2d697913.png)
3. Sublime Textを起動し、メニューから「View > Show Console」を選択する。
4. 表示される入力欄に、先ほどコピーした内容を貼り付けて Enterキーを押す。
5. Sublime Package Controlがインストールされるので、終わったらSublime Textを再起動して完了。

## Sass関連のプラグインをインストール
最低限、「SCSS」と「Compass」プラグインをインストール。

- SCSS：sassの構文を色付けしてくれる。
- Compass：Compassでコンパイルできる。

インストール方法は、以下の通り。

1.Sublime Textを起動
2.「command + shift + P」を押し、コマンドパレットを表示する。
3.表示された入力欄に「install」と入力すると「Packege Controll:Install Package」がリストに表示されるので選択する。
4.表示される入力欄に、「scss」と入力すると「SCSS」がリストに表示されるので選択する。（SCSSがインストールされる）
5.2-3を繰り返し、次は「compass」と入力。「Compass」がリストに表示されるので選択する。（Compassがインストールされる）

## Sassのコンパイル方法
1. プロジェクトディレクトリをSublime Textで開く（ドラッグなど）
2. 一番上の階層にconfig.rbファイルを作成。（書き方は[Compassの公式ページ](http://compass-style.org/help/documentation/configuration-reference/)を参照）
（例）config.rb
![スクリーンショット 2017-09-07 1.18.06.png](https://qiita-image-store.s3.amazonaws.com/0/17376/331c931b-03e6-921d-fdf4-a849e1cade9f.png)

3. メニューから「Tool > Build System > Compass」を選択する。
4. 「command + B」でコンパイルを実行します。（上の例だと、cssディレクトリにコンパイルされたCSSが作成されます。）

# まとめ
最後の方、説明が雑になってしまった。
Sublime TextとかCompass、Sassの書き方などは、それぞれをメインにした良い記事がいっぱいあるのでそれらを参考にしてください。
micro:bitメモ

#日本語は一部の表記がバグっている。
特に入出力系。

#画面表示は時間がかかる
というか、意図的にウェイトが挟んである様子。
LED系命令なら問題ないかもしれない

#音の出力先を変更する、をうん10回繰り返すと、
メモリ不足エラー020でリセットされる

#スマホから書き込む時は、常にペアリングモードにするとやりやすい。
ペアリング後リセットしない、でもいいし、
ペアリングモード！の表示中でもFlashは受け付けられている。

#スマホから書き込めなくなった時は、PCから
書き込むと復帰する。

#バッファローの高速コピーツールが導入されているPCではコピーに失敗した旨の表示が出ることがある
が、実際には成功しているので中止ボタンで中止してよい。

#電子コンパスは調子があまりよろしくない様子。
コンパスキャリブレーションの際に、ゆっくりと様々な方向に傾けてから、
円を描くとよいようである。

#ブロックプログラミングにおいては三角関数が使えない。
というか、浮動小数点数さえ使えない様子。

#Bluetooth系のプログラムは、iPhoneで使えない？
というかよくわからない。

#裏面に給電パッドがある。
ここに、スイッチ付きの電池BOXをはんだ付けしてしまうのが、持ち運びにも便利で一番楽かもしれない。
https://www.kitronik.co.uk/blog/powering-your-bbc-microbit/

#シリアル通信、SPI、I2C、BT-UARTなど、かなりいろいろなことができる。
スマホから回路の動作確認するツールとして携帯しておきたいレベル。
http://qiita.com/yoshiwatanabe/items/20e57de4e94227f6320a


#ブレッドボード用アダプタ
https://twitter.com/marutsuakiba2/status/903842509897383936
Unity : ScrollRectを拡張したい！

##ScrollRectを拡張したい！
　UnityのScrollViewは便利なんですが、無限ループとか指定したアイテムの位置に移動させるとかできないとか。
そういったなんか製品だとできるようなUIの動きを実装していきたいと思います。

実装とかやってられっか！って人は AssetStoreに Picker for uGui(有料) をつかうといいかも
>Picker for uGUI
>https://www.assetstore.unity3d.com/jp/#!/content/31412


無限ループさせるのは無料の模様
>NGUI Infinite Pickers
>https://www.assetstore.unity3d.com/jp/#!/content/10024


##無限ループ
まず最初にスクロールを無限ループさせることを考えます。

一番単純なモデルで、表示されているのは単一のオブジェクトのみ、それがスクロールさせた際に無限に続くように作ってみます。（広告バナーのスライドのイメージ）

###ループする広告バナーを作る
下準備として、 ScrollView以下のContentには GridLayoutGroupを付けておきましょう。
単一サイズのものを複数並べる際に有効です。
![unity=gridlayoutgroup.PNG](https://qiita-image-store.s3.amazonaws.com/0/151071/deb9f211-813e-e3c3-2e9d-3687f7ffc694.png)

初期の表示はこんな感じ。
![Initial.PNG](https://qiita-image-store.s3.amazonaws.com/0/151071/ed1a134e-33ae-dffe-7911-027f7efb5da1.png)

真ん中に広告とかがあって、左右に前後に動かすボタンがあります。

実際にループさせてみます
![ド.gif](https://qiita-image-store.s3.amazonaws.com/0/151071/21999b70-38bd-a5d3-ebac-684a4363f5aa.gif)

ループできてますね！（アニメーションとかがないのでアレですが。。。）

コードはこんな感じ

```csharp:simpleLoopScrollRect.cs
using UnityEngine.UI;

public class CustomScrollRect : ScrollRect
{
	private int contentCount;

	protected override void Awake()
	{
		base.Awake();

		contentCount = content.childCount;
	}

	public void Next()
	{
		content.GetChild(0).SetAsLastSibling();
	}

	public void Prev()
	{
		content.GetChild(contentCount - 1).SetAsFirstSibling();
	}
}
```

https://gist.github.com/kannan-xiao4/e5171a50b305294e872e4f5a9936dc09

ひとまず今回はここまで～
次回は、変更時をアニメーション？させたく思います
[Python]超便利なデバッグ

## pythonで楽にデバッグしたい方へ
pythonをコマンドラインで走らせるとき、

```
$ python hoge.py -m pdb
```
のように"-m pdb"をつけるとデバッグモードで実行してくれます。
（最近知りましたがこれだけでもめちゃ便利）

## 任意の場所で処理を止めたい時は・・・

Eclipseのようにブレークポイントを置きたい時は、

hoge.pyに

```python:
assert False
```

を挿入してデバッグモードで実行すればよいです。

assert Falseに反応してそこで止まってくれるので、あとはやりたい放題です。

短いですが以上です！
Java屋さんがPHPを書いたときに驚いたこと

JavaとJavaScript（ちょっと）しか知らない私が、お仕事でPHPを触ることになり、その前に勉強がてらオレオレフレームワークを作ってみました。そのときにえっ！と驚いたことや、嵌ったことなどをざっくばらんに描いていきます。

念のため断っておくと、この記事にはJava界隈にいる私がPHPを触ってみて思ったことを素直に書くだけで、PHPが悪いとか、Javaは優れてるか、そいういうことを主張する意図は一切ありません。　　　　　　　

### 文字列の連結は`.`(ドット）
Javaでは`インスタンス.メンバ()`のように`.`でオブジェクトのメンバにアクセスします。
対して、PHPでの`.`は文字列の連結を行う演算子です。ついつい`objcet.doSomething()`って書いちゃってなんで動かないのよと悩むこと多々・・・

### 関数のオーバーロードできない
これはまぁPHPに限った話ではありませんが、関数はオーバーロードできません。デフォルト引数があるからうまく使いましょう。

### 親クラスのコンストラクタは明示的に呼ばれない
これ、一番衝撃的だったかもしれない。Javaの世界じゃ親クラスあっての子クラスなので、親クラスが正しく初期化されないと子クラスが存在できません。親が初期化されない状態で子インスタンスが存在できるというのは衝撃的でした。

### 失敗を表す戻り値false
PHPでは処理の失敗を表す戻り値としてfalseがしばしば用いられます。正常終了なら文字列を返すのに失敗するとfalseを返すなんて、Javaの感覚で聞くと心臓がハカハカしてしまいますが、そういうもんなんですね。

### 配列は値渡し
Javaでは配列を引数に渡すとそれは参照渡しになります。渡した先で配列を呼び元の配列に影響します。
しかし、PHPの標準では値渡しなので呼び元の値には影響をあたえいません。`function callFunc(&$array)`のように関数定義時に引数の前に&をつければ参照渡しになります。値渡しだとなんとなく性能のネックになりそうな気がするけど、あまり気にしなくていいのかなぁ→あまり気にしなくていいらしいです（コメント参照）

### byte型がない
phpでバイト処理を行うときは文字列型の変数を使います。packやunpackと言った関数を駆使してバイナリの海を泳ぐようです。なれないとなかなか難しいです。

### 文字列の内部エンコーディング
文字列周りなので次はこちら。Javaの文字列は中身はUTF-16で持っているので単純ですが、PHPの内部エンコーディングは実行環境によって異なるようです。その辺意識してコードを書かないと、すぐに文字化け地獄。

### private static final 相当がない
PHPには定数を表す方法がいくつかある。defineやconst。でもこれ、どっちにしてもpublicスコープになっちゃうのよね。クラスの中だけに閉じた定数って作れないんだねー。→新しいPHPだと作れるそうです（コメント参照）

### noticeはcatchできない
しばしば目にする`Notice hogehoge`。これ、裏側で例外が投げられていてそれをキャッチすれば適切なハンドラに処理を移譲できるなーとか思ってたら、こいつはキャッチできない。もちろん代替法があるようだが、はじめはびっくりした。

### getSession(false)がない
ここからはJavaEEのSessionのはなし。PHPにはgetSession(false)相当の処理がない。
「セッションが開始されてなかったら」という処理を書くのにちょっと工夫が必要がでした。。

### セッションにオブジェクトは格納できない

セッションには文字列か数字しか乗りません。

<small>→正しくは「参照型を格納できない」なので「文字列か数字しか乗らない」正確ではありませんでした。</small>

オブジェクトや配列をセッションに載せる場合はserializeしてから格納する必要があります。取り出すときはunserializeします。


### 
セッションCookieの有効期限は自動的に伸びない


PHPでもセッションの有効期限を決めることができます。でも、ここで決められる有効期限はセッションスタートしてからの時間なのです。セッションの有効期限は30分だとします。時刻0でセッションを作成しました。時刻10分で再び画面にアクセスしたとき、Javaならこの時点でセッションの有効期限はそこから30分伸びます。つまりタイムアウトの時間は時刻40分ですしかし、PHPのCookieは伸びませんあくまで最初に決めた時間にタイムアウトするのです。Javaに似たセッション戦略にするには少々工夫しなければなりません

こちら、ちょっと根本的に理解が間違ってる可能性があるので調査してから編集します

### セッションを消してもCookieは消えない
phpでは`session_destroy`関数を使ってセッションを破棄できます。
しかし、これで消えるのはサーバ側のセッションデータのみでブラウザ側のセッションクッキーは残ってしまいます。セッションを消すときは、サーバー側のセッションデータ破棄→ブラウザのcookie削除という手順を踏まなければなりません。

### User Contributed Notes
最後なのできにいった部分を。PHPのリファレンスにはUser Contributed Notesといって実際のユーザが書いたTipsとかが読めるようになってます。この文化は羨ましいなぁとおもいました。
vscodeでEmmetがTab(ショートカットキー)で動かない人へ

ずっとTabキーでEmmetの展開をしていた私が最近vscodeに移行して困ったのでメモ。

#Emmetは2.0で提案・自動補完に変更された
vscodeの公式でEmmet2.0の仕様について説明がありますが、提案型に変更されてました。
そのため、初期設定では今までのようにTabキーで展開ができないものがあり、代わりに候補として展開後が表示されるようになりました。
しかし、その候補で全て補完できれば良いのですが、できないものも多くあります。
ただ、以下のように設定を変更すると以前のような入力方法も可能です。


## バージョン1.27 以上の設定
1. 画面左下の「歯車アイコン」 から「設定」、もしくは 「Ctrl（MacはCmd） + ,（カンマ）」 をクリックして「Settings」ファイルを開く
2. 左側のカテゴリメニューにある「拡張機能」をクリックしてメニューを展開
3. 「Emmet」の項目があるのでクリックして右側にEmmetの設定内容が表示される
4. 「Trigger Expansion On Tab」の項目にある「有効にすると、TABキーを押したときにEemmet省略記法が展開されます。」と記述があるのでクリックしてチェックボックスにチェックを入れる
（※Eemmetは多分誤字だと思うけど記載されている通りに記述しています。）



## バージョン1.26以下の設定 & settings.jsonファイルを直接編集する場合
1. 画面左下の「歯車アイコン」 から「設定」、もしくは 「Ctrl（MacはCmd） + ,（カンマ）」 をクリックして設定ファイルを開く
2. ２分割画面の左側にある各種設定項目をスクロールしてEmmetの項目をクリックして展開
3. Emmetの項目の中にある **"emmet.triggerExpansionOnTab": false** を見つけ、左側のペンアイコンをクリック
4. クリックしたらtrueとfalseが表示されるので、ここを**true**にする

以上でTabキーでも展開が可能になります。

ちなみにEmmet2.0の仕様については以下の公式に掲載されてますのでそちらからご確認ください。
[Emmet 2.0 in Visual Studio Code](https://code.visualstudio.com/blogs/2017/08/07/emmet-2.0)
Unity Transform取得時間を削減する

Transformを取得しUpdateやFixedUpdateの中で毎フレーム計算するような処理を書くことは多いだろう
特に大量のObjectを処理する場合Transformの取得が処理を食うこともある

#検証コード
```csharp:TransformObject.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformObject : MonoBehaviour 
{
	Transform _Transform;

	void Awake()
	{
		_Transform = transform;
	}

	public void GetTransform()
	{
		var position = transform.position;
	}
    
    //thisを付けたバージョン
	public void GetThisTransform()
	{
		var position = this.transform.position;
	}

    //AwakeでキャッシュしたTransformから取得する
	public void CacheTransform()
	{
		var position = _Transform.position;
	}
}
```

```csharp:TransformTest.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformTest : MonoBehaviour 
{
	static readonly int OBJECT_NUM = 10000;
	TransformObject[] _transformObjects = new TransformObject[OBJECT_NUM];

	void Start () 
	{
        //TransformObjectを1万個生成する
		for (int i = 0; i < OBJECT_NUM; i++) {
			var go = new GameObject ();
			_transformObjects[i] = go.AddComponent<TransformObject> ();
		}
	}
	
	void Update () 
	{
        //毎フレーム各関数を呼び出す
		for (int i = 0; i < _transformObjects.Length; i++) {
			_transformObjects [i].GetThisTransform ();
		}

		for (int i = 0; i < _transformObjects.Length; i++) {
			_transformObjects [i].GetTransform ();
		}

		for (int i = 0; i < _transformObjects.Length; i++) {
			_transformObjects [i].CacheTransform ();
		}
	}
}}
```
#検証結果
![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/dbfab1a3-c7bb-04d0-c07e-57080006b7cb.png)
キャッシュしたTransformを使うのが圧倒的に速いことがわかる


![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/6bcdcadf-7658-1bff-4412-a0b9cb74f1af.png)
もう少し詳しく見てみると、Transform.get_position()やTransform.INTERNAL_get_position()にかかる時間は3種とも大差ないが
キャッシュしない場合は「Component.get_transform()」が呼ばれており処理時間がかかっている。

#GameObject編
以下のコードを追記してGameObjectに対しても同様のテストを行った

```csharp:TransformObject.cs
    public void GetGameObject()
    {
        var go = gameObject;
    }

    public void GetThisGameObject()
    {
        var go = this.gameObject;
    }

    public void CacheGameObject()
    {
        var go = _GameObject;    //_GameObjectはAwakeでキャッシュしている
    }
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/105021/50be130d-8a02-7062-c276-053753fcdafa.png)

やはりキャッシュすると圧倒的に速くなる

#結論
TransformやGameObjectは毎回取得せずにキャッシュすべし
インフラのUnitテスト観点について

今日はインフラのUnitテストについて自分なりに経験したことを書いていければ良いと思っています。

ちなみにwikipediaでは、以下のように書かれています。

```
プログラムを構成する比較的小さな単位（ユニット）が個々の機能を正しく果たしているかどうかを検証するテスト
```

なるほど。確かにそうだと思います。
システムの一部のモジュールの正否判定をして、
望む挙動になるか、変な引数を入れたらエラーになるかなどを確かめます。

でもインフラのUnitテストはちょっと違うように思います。

## インフラのUnitテストとは
簡単に言うと、
インフラエンジニアがソフトウェアに対して行った設定が正しく設定されているか、
正しく動作しているかを確かめるテストです。

具体例を挙げるとすると、
Postfixの場合だと「mydomain」でメールアドレスで使うドメイン名が正しく設定されているかを確認します。

Postfixの設定ファイルにgmail.comというドメイン名が設定されているとします。

```:main.cf
mydomain = gmail.com
```

それをコマンドで標準出力させ、
期待する正しい値を確認します。
ここでいうと「mydomain = gmail.com」が返ってくれば単体テストは正とします。

```
# grep mydomain /etc/postfix/main.cf
mydomain = gmail.com
#
```

ちなみにデフォルト値の確認などは行いません。

なぜならシステム要件によって変更しなければいけない値だからこそ、
確認する必要があるからです。

デフォルト値はシステム要件とは関係ないので、
デフォルト値なんです。

## Unitテスト項目
テスト観点を踏まえて、
Unitテストで主に確認しなければいけないと言われている点は以下になります。

・パラメータ確認
・プロセス確認
・サービス起動確認
・ポート確認
・起動停止確認、二重停止二重起動確認
・ログ確認
・エラーログ確認
・PP機能確認(Postfixならばメールが送れることを確認)


最近はServerspecやGospecなどのインフラの自動テストツールがありますが、
根本的にこの考えが出来ていないとテストコードが作れません。

皆さんの参考になれば幸いです。
Monologに、サーバー情報および実行時の環境情報（$_SERVERの各情報）を出力させるには（Symfony2の場合）


## はじめに
Symfony2で、ログにサーバー情報および実行時の環境情報（$_SERVERの各情報）を出力させるのはとても簡単ですという話です。

尚、Silexの場合は、2015年の記事ではありますが、下記のリンクが参考になるかもしれません。

- [MonologのSlackHandlerに、サーバー情報および実行時の環境情報（$_SERVERの各情報）を出力させるには](http://qiita.com/imunew/items/4255b683b56f7d36707e)

## 設定方法
`app/config/services.yml`に設定を追加して、`$ app/console cache:clear`するだけで、ログに追加情報が出力されます。

```yml
# app/config/services.yml

services:
    monolog.processor.web:
        class: Monolog\Processor\WebProcessor
        arguments:
            - null
            -
                http_method : 'REQUEST_METHOD'
                url         : 'REQUEST_URI'
                referrer    : 'HTTP_REFERER'
                ip          : 'REMOTE_ADDR'
                user_agent  : 'HTTP_USER_AGENT'
                server      : 'SERVER_NAME'
                server_ip   : 'SERVER_ADDR'
        tags:
            - { name: monolog.processor }
```

ログの各行に、下記のように情報が追加されます。

```txt
{"http_method":"GET","url":"/app_dev.php/home","referrer":null,"ip":"192.168.50.1","user_agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36","server":"localhost","server_ip":"192.168.50.220"}
```

## おわりに
設定だけでできるのは、嬉しいんですけど、ちょっとカスタマイズしようとすると、結局、ドキュメントなりコードなりをがっつり見る羽目になりますね。 
ではでは。 

## 参考URL
- [How to Add extra Data to Log Messages via a Processor (2.8)](http://symfony.com/doc/2.8/logging/processors.html)
- [The Dependency Injection Tags (The Symfony Reference)](http://symfony.com/doc/2.8/reference/dic_tags.html#monolog-processor)
has_secure_passwordのバリデーションの有無を特定条件によって切り替える

# やりたいこと
Rails の　[has_secure_password](http://api.rubyonrails.org/classes/ActiveModel/SecurePassword/ClassMethods.html) を設定しているモデルを，自身のタイプによってパスワード有無を切り替えたい．

# 前提条件
* Rails 5.1.3

# サンプル

あるモデルが公開タイプを3つ持っているケースで考える．

```ruby:db/schema.rb
  create_table "sample_models", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=utf8" do |t|
    t.integer "publish_type", default: 0, null: false
    t.string "password_digest"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end
```

```ruby:app/models/sample_model.rb
class SampleModel < ApplicationRecord
  enum publish_type: {
    open: 0,
    open_with_pw: 1,
    secret: 2
  }

  has_secure_password
  validates :password, length: (6..32), presence: true, confirmation: true, if: :validate_password?

  private

  def validate_password?
    self.open_with_pw?
  end
end
```

`publish_type` が `open_with_pw` のケースだけバリデーションをかけたかったが，
上記だとバリデーションして欲しくないときにもバリデーションが実行されてしまう．

# `has_secure_password(validations: false)` にする

[`has_secure_password` の記述で処理される内容はシンプル](https://github.com/rails/rails/blob/master/activemodel/lib/active_model/secure_password.rb#L55-L83)なので，バリデーションは敢えて無効にして，自分のタイミングでだけバリデーションするように変更する．

```ruby:app/models/sample_model.rb
class SampleModel < ApplicationRecord
  •••
  has_secure_password(validations: false)
  validates :password, length: (6..32), presence: true, confirmation: true, if: :validate_password?
  •••
end
```

# `open_with_pw` でない時はパスワードを空にする

パスワードが不要なタイプの時は，パスワードをクリアする処理も追加した．

```ruby:app/models/sample_model.rb
class SampleModel < ApplicationRecord
  before_validation :clear_password

  •••

  private

  •••
  def clear_password
    unless self.open_with_pw?
      self.password = nil
      self.password_confirmation = nil
    end
  end
end
```


# 参考
https://groups.google.com/forum/#!topic/rubyonrails-talk/_s4ZCA7HeaU
SVNManagerの導入した時のメモ

###あまり最近の記事がなくて導入時に詰まってしまったとこがあったので自分用メモ

## 環境情報
・svnmanager1.10
・Apache/2.4.6
・PHP 5.4.16
・svn バージョン 1.7.14 (r1542130)


##基本はここを参照
http://park1.wakwak.com/~ima/centos_svnmanager0001.html


##詰まったとこ１
権限設定画面にてPATHごとに設定できるはずが、「/」しか表示されない。

上記リンクの手順にある
```
pear install VersionControl_SVN-0.4.0
```
を
```
pear install VersionControl_SVN-0.5.2
```
に変更する。

##詰まったとこ２
詰まったとこ１の対応をすると、そもそも画面遷移時にエラーが発生するように。。。

エラー内容

```
InternalError

VersionControl_SVN_Exception: "svn_path" is not a valid option
#0 /usr/share/pear/VersionControl/SVN.php(267): VersionControl_SVN_Command->setOptions(Array)
#1 /usr/share/pear/VersionControl/SVN.php(226): VersionControl_SVN::init('list', Array)
#2 /usr/local/svnmanager-1.10/svnmanager/RepositoryModule/GroupPrivilegesEditPage.php(214): VersionControl_SVN::factory(Array, Array)
#3 /usr/local/svnmanager-1.10/prado-2.0.3/framework/Web/UI/TControl.php(419): GroupPrivilegesEditPage->onLoad(Object(TEventParameter))
#4 /usr/local/svnmanager-1.10/prado-2.0.3/framework/Web/UI/TPage.php(1079): TControl->onLoadRecursive(Object(TEventParameter))
#5 /usr/local/svnmanager-1.10/prado-2.0.3/framework/Web/UI/TPage.php(947): TPage->onLoadRecursive(Object(TEventParameter))
#6 /usr/local/svnmanager-1.10/prado-2.0.3/framework/TApplication.php(483): TPage->execute()
#7 /usr/local/svnmanager-1.10/index.php(5): TApplication->run()
#8 {main}
```

ソースをいじって対応。

### 対象file
- /usr/local/svnmanager/svnmanager/RepositoryModule/UserPrivilegesEditPage.php
- /usr/local/svnmanager/svnmanager/RepositoryModule/GroupPrivilegesEditPage.php

```
$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ARRAY, 'svn_path' => $svn_cmd);

上記の行を以下のように修正

$options = array('fetchmode' => VERSIONCONTROL_SVN_FETCHMODE_ARRAY);
```

エラーが解消されPATHごとの権限設定が可能に。

## 詰まったとこ３
　inviteメールが送れない問題が発生。

メールログ

```
/var/log/maillog

postfix/smtpd[1753]: connect from localhost[127.0.0.1]
postfix/smtpd[1753]: warning: Illegal address syntax from localhost[127.0.0.1] in MAIL command: <svnmanager@172.0.0.1>
postfix/smtpd[1753]: lost connection after RSET from localhost[127.0.0.1]
postfix/smtpd[1753]: disconnect from localhost[127.0.0.1]
```

`UserModule/InviteManagePage.php`
`UserModule/InvitePage.php`
ここら辺でsmtpの設定をlocalhostで決め打ちするとメールは送られた。
ただ、根本解決ではないので他の方法を探すことに。

調べると、原因はapacheのservernameをIPで指定したことにあるみたい。

servernameを実際に使うドメインに変更して、再度挑戦するも同じエラーが。。。

DNSの設定前だったので検証はサーバのip指定でsvnmanagerを利用していたのが原因だった。

-> `UseCanonicalName On`
 これをapacheにて設定していないとclientが指定したホスト名がphp内のservernameに渡される。

設定することでip指定でsvnmanagerの画面にアクセスしても無事メールが送られるようになった。
HTMLで吹き出し風のTipsみたいなのを表示する

吹き出し風の画面を Android の Toast みたいなノリで表示したかったので、
調べたことを整理がてらメモします。

# 開発環境及び動作環境

- OS: Windows 7 x64
- Browser: Chrome 61.0.3163.79

# DEMO

[DEMO](https://chibi929.github.io/chibi-html/)

# 吹き出しを作る

まずは CSS で吹き出しを作ります。

```css:style.css
.balloon-left {
    position: absolute;
    display: inline-block;
    margin-left: 20px;
    padding: 7px 10px;
    min-height: 40px;
    min-width: 120px;
    line-height: 40px;
    background: #5cc507;
    box-shadow: -4px 4px 8px -1px #999999;
}

.balloon-left:before{
    content: "";
    position: absolute;
    top: 50%;
    left: -30px;
    margin-top: -15px;
    border: 15px solid transparent;
    border-right: 15px solid #5cc507;
}

.balloon-left p {
    margin: 0;
    padding: 0;
}
```

それをHTMLに設定します。

```html:index.html
<button id="button">SHOW</button>
<div id="balloon-tips" class="balloon-left">
  <p>吹き出し風Tips</p>
</div>
```

# フェードイン/フェードアウト

CSS でアニメーションを作ります。

```css:style.css
.fadein {
    opacity: 0;
    visibility: hidden;
    transition: opacity 0.5s ease-out, visibility 0.5s ease-out;
}

.fadein.visible {
    opacity: 1;
    visibility: visible;
}
```

それをタグに適用します。

```diff:index.html
  <button id="button">SHOW</button>
- <div id="balloon-tips" class="balloon-left">
+ <div id="balloon-tips" class="balloon-left fadein">
    <p>吹き出し風Tips</p>
  </div>
```

# ボタンを押した時に表示されるようにする

あとは、jQueryなり何なりで、クリック処理とclassのON/OFFを行います。

```js:main.js
$(function() {
  var timer;
  $("#button").on("click", function() {
    clearTimeout(timer);
    $("#balloon-tips").toggleClass("visible");
    timer = setTimeout(function() {
      $("#balloon-tips").toggleClass("visible");
    }, 3000);
  });
});
```

# 完成

[DEMO](https://chibi929.github.io/chibi-html/)
https://github.com/chibi929/chibi-html

# 参考サイト

[CSS3でフェードイン・フェードアウトするダイアログ](http://qiita.com/noobar/items/7b552240178541d8c2f8)
Chefクライアントを任意のバージョンを指定してインストールしたい

マニュアルにも書かれているしあちこちで記事になっているのでいまさらですが自分の備忘録として書いておきます。

[Install via URL — Chef Docs](https://docs.chef.io/install_omnibus.html#install-script-options)

`-v` オプションとやらがあるらしいです。これを使って任意のバージョンのものをインストールします。

> -v (-version on Microsoft Windows)
The version of the package to be installed. A version always takes the form x.y.z, where x, y, and z are decimal numbers that are used to represent major (x), minor (y), and patch (z) versions.

1. [Chef Downloads](https://downloads.chef.io/) でインストールしたいバージョンの Chefクライアントを探す。
  - Chef Client のリンクから最新バージョンのページに進むと、`PREVIOUS VERSIONS (STABLE)` と書かれた以前のバージョン一覧があるので確認できる。
2. インストールしたいバージョンをパラメーターにセットして、前述の「URL経由でのインストール」を実行する。

こんな感じです。

```bash:インストールスクリプトの実行
$ curl -L https://omnitruck.chef.io/install.sh | sudo bash -s -- -v 12.21.4
```

なお自分は CentOS の環境でしかやっていませんが、マニュアルによれば Windows でも同様のことができるようです。
RailsのActiveModel::Dirtyによるインスタンス変数の監視

# はじめに
趣味として、RailsのReadmeやDocumentを読んでいる。そこで「へー」と思うのだけれども、すぐに忘れてしまうため記事としてしっかり研究したい。今回は、`ActiveModel::Dirty`がクラスの監視の役割を持っているということを知った。

# Rails
Railsの`ActiveRecord::Base`を継承しているモデルでは、そのインスタンス変数を監視することができる。具体的に例を見てゆく。
### `Dirty#changed?`
Saveされるまでで、そのインスタンスの値が変わったかどうかで、`true`もしくは`false`を返す。

```ruby
goku = Saiya.new
goku.changed? # 作成されたばかりのものはもちろん、falseを返す。
# 実際に変更を加えてみる
goku.name = "悟空"
goku.changed? # nameが変更されたのでtrue
```

これまではなんの驚きもない予測どおりな仕様である。では変更を加え、`save`した直後は何を返すのか。

```ruby
goku.save
goku.changed? # false を返す。
```

レコード(DBのテーブルに入っている値)と、現在のインスタンスの値の差ということかと思われます。`save`が失敗すれば`changed?`は`true`を返します。同じ値を再代入しても、`false`を返します。

```ruby
goku.name = "カカロット"
goku.save
# => 失敗した時
goku.changed? # true

goku = Saiya.where(name: "悟空")
goku.name = "悟空"
goku.changed? # false
```

これはバリデーションのロジックを組む時に便利なメソッドですね。

ちなみに、特定の一つのレコードだけが変化したかどうかを確かめるためのメソッドも、Railsの方で用意してくれてます。

```ruby
goku = Goku.new
goku.name = "悟空"
goku.changed? # true
goku.name_changed? # true
goku.power_changed? #false
```
[Unity]ワールドアイに3D空間を描画する


# ニューワールドアイ
を買ってみました。ニューが出てるのでそちらを。これ、HDMIで出力できるとなれば、なんでもできますね。なかなか面白いデバイスなので、自由に描画することを目指します。ちなみに値段が変動しているようですが、僕が購入した先週は8,400円でした。

# 特性評価

まずはデバイスの特性を把握します。チェック模様を描画させてみましょう。さらに白線で真円を書いておきます。PCからHDMIで接続しておけば、セカンドディスプレイとして表示できました。
![IMG_2768.png](https://qiita-image-store.s3.amazonaws.com/0/90046/2dae6824-d3d7-c615-4928-40ad449efb2f.png "")


平面を出すとこうなります。頑張って空間に対応しましょう。



# 正距方位図法（Azimuthal Equidistant Projection）

あれこれ観察した結果、マッピングは正距離方位図法を使うのがよさそうです。

Wolframさまより：
http://mathworld.wolfram.com/AzimuthalEquidistantProjection.html

```math
x=k'cos\phi sin(\lambda-\lambda_0) \\
y=k'{cos\phi_1 sin\phi - sin\phi_1 cos\phi cos(\lambda - \lambda_0) } \\
k'=\frac{c}{sin c} \\
cos c = sin\phi_1 sin\phi + cos \phi_1 cos \phi cos(\lambda-\lambda_0)
```

素晴らしい。こんな式、自力で導出できる気がしません。

# キューブマップを作る

まずは全方向に対応するとして、６方向でカメラを６つ用意してレンダリングします。結果はキューブマップそっくりになりますね。そして、各面に矩形のメッシュを想定し、それぞれの頂点を緯度経度に変換してから正距離方位図法の式に入れてメッシュを作ります。

ただし背面については特異点があるので、穴を開けておきます。背面の変換前。よく見ると中央に穴が空いているのがわかるでしょうか：

![スクリーンショット 2017-09-06 23.00.31.png](https://qiita-image-store.s3.amazonaws.com/0/90046/9c1ea78f-c264-1645-7012-8fa771a5b1f6.png "")

６面の変換後：

![スクリーンショット 2017-09-06 22.58.42.png](https://qiita-image-store.s3.amazonaws.com/0/90046/b044ef86-1b32-32f7-86f9-ad7d18be336b.png "")

実際の変換のレンダリングはキューブマップではないです。もっともシンプルなシェーダで済みます。

そしてワールドアイの特性上、背面は必要ないので、６面でなく５面だけレンダリングします。（６面は単にやってみたかっただけ）

![スクリーンショット 2017-09-06 23.07.52.png](https://qiita-image-store.s3.amazonaws.com/0/90046/78b30fac-4138-a47b-b8fd-bdef0d380769.png "")

こうなります。なお、ワールドアイの描画範囲が完全なる半球だとすると、参照するのは上下左右の４つの面の半分しか使いません。背面だけを除くのではまだ余計にBlitしていることになります、が、どうせカメラは５つぶん描画するのだし、転送のシェーダも軽いことだし、たいした無駄ではないでしょう。将来ワールドアイの表示領域が270度まで広がるかもしれないしね！

# 完成
![worldeye.gif](https://qiita-image-store.s3.amazonaws.com/0/90046/846f3eeb-33d1-10dd-0dc3-9f8bd4a2cfd7.gif "worldeye.gif")

YouTube：
https://www.youtube.com/watch?v=2Vrm3TNCzUc
https://www.youtube.com/watch?v=2lHPjGVEFHo

# ソースコード含むプロジェクト
はこちら：
https://github.com/dsedb/WorldEyeProjection

使ってもらうにしてはあんまり丁寧な作りではないですが、シンプルなプロジェクトなのでシーンにある物体やらを取り除けば好きに使えると思います。

# 注意
環境によって、アスペクトが狂うときがあるようです。4:3になっているかなっていないか、みたいな差が出る模様。
AzimuthalEquidistantProjection.cs
をAddしたオブジェクトをインスペクタで見たときの
`Consider Aspect'
をオンオフすることで調整してみてください。Windowsだとチェックを入れて、Macだとチェックを入れない、で合うようだ、というのが目下の観察結果です。
![スクリーンショット 2017-09-06 23.15.11.png](https://qiita-image-store.s3.amazonaws.com/0/90046/8499d593-adf7-95ae-7a49-63558defaa5b.png "")
RaspberryPi3用rootfs作成 by Buildroot

# RaspberryPi3用rootfs作成
buildrootなるツールがあることを知ったので試してみた。
buiidrootとは公式ページによれば、"Making Embedded Linux Easy"ためのツール。

## 環境
OS: Ubuntu16.04 x86_64
CPU: Intel(R) Core(TM) i7-3517U CPU @ 1.90GHz
Target: RaspberryPi 3 Model B

## 手順
### 1. RaspberryPi3用デフォルト設定でフルビルド

```bash
$ curl -O https://buildroot.org/downloads/buildroot-2017.02.5.tar.gz
$ tar zxvf buildroot-2017.02.5.tar.gz
$ cd buildroot-2017.02.5/
$ make raspberrypi3_defconfig
$ make -j8 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
$ make -j8  ※注：-j8はNG！詳細は後述
```

Core i7＋光回線の環境で最後の`make -j8`に1時間弱。
ホストツール・カーネルイメージ・デフォルトのターゲットツールすべてインターネットから取得してこの時間は早いなぁ。


※後で[マニュアル]
(https://buildroot.org/downloads/manual/manual.html#_buildroot_quick_start)に、

> You should never use make -jN with Buildroot: 
> top-level parallel make is currently not supported. 
> Instead, use the BR2_JLEVEL option

と書かれているのを発見。。。未確認だがもう少し遅くなるかも。


### 2. SDカードにイメージ書き込み

※トラブル防止のために、書き込み前にgnome-disksなどでパーティションを削除しておいたほうがいいかも

```bash
$ sudo dd if=./output/images/sdcard.img of=/dev/sdb bs=8192
```

### 3. 起動
HDMI出力
![DSC_0721.JPG](https://qiita-image-store.s3.amazonaws.com/0/37714/770fe69b-dbed-caf7-c5bd-2d9b6c716c15.jpeg)

上記そのままの手順の場合は、ユーザ名"root"でパスワードなしで入れる。

## 感想
簡単すぎて笑えた。
これだけ簡単に使えるようになってるのはメンテナの皆さんがすごい頑張ってくださってるからなんだろうなぁ。。。
感謝感謝です。

Dockerみたいなコンテナ環境も楽でいいけど、ソース集めてビルドするってのはやっぱりわかりやすい。
ローカルビルドもサポートしているみたいだし、必要十分に絞ればビルド時間ももう少し短くできるはず。

設定パラメータもかなり大量に用意してくれているようなので、いろんなケースで取っ掛かりとして使えそう。

ちなみに、デフォルト設定で作成したイメージファイルは全体で94MB。
うちbootが32MBでrootfsが64MBだった。小さいなぁ。

# 参考ページ
[Buildroot](https://buildroot.org/)
[Raspberry Piへbuildrootでのrootfs構築](http://jujurou.blog34.fc2.com/blog-entry-404.html)
[Raspberry Pi3 / arm64](http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201606-rpi3-presentation.pdf)
[Raspberry PiへのOSインストールの手順 ddコマンド編](https://veryberrypi.wordpress.com/2013/05/04/raspberry-pi%E3%81%B8%E3%81%AEos%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AE%E6%89%8B%E9%A0%86-dd%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E7%B7%A8/)
音声認識、リアルタイム翻訳してくれるOfficeアドイン「Dictate」使ってみたのでメモ

自宅でタイピングがめんどくさいとき、想像より良い精度で音声認識かつ翻訳機能が備わった
Officeアドインを見つけたので記録です。
Microsoft GarageでダウンロードできるDictateです。
インストール後、Officeのリボンから使えるようになります。

■Dictate
https://www.microsoft.com/en-us/garage/profiles/dictate/

■ITメディアの紹介記事
http://www.itmedia.co.jp/news/articles/1706/21/news091.html

リアルタイム翻訳はなんと60言語！Congnitiveサービスなどを使っているようで、最新の技術満載ですね。
実際使うときはOfficeの１つのソフトのみの起動が良さそうです。複数起動させておくと特にOutlookで認識が遅くなりました。
以上、ありがとうございました。
tmux yank to clipboard(version > 2.3)

# はじめに
tmux yankする方法をググったら情報が少し古い気がしたので書く

# 参考
* http://qiita.com/c8112002/items/71361e347e430f9bb14e
* http://nyangryy.hatenablog.com/entry/2016/10/18/180944

# .tmux.confの書き方の変更
どうやら2.3以降、tmuxに変更が入ったらしくconfの書き方が変更になっている。
下記のように修正すればok

```
# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -t vi-copy v begin-selection
bind-key -t vi-copy y copy-pipe "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind -t vi-copy Enter
bind-key -t vi-copy Enter copy-pipe "reattach-to-user-namespace pbcopy"
```

↓

```
# Use vim keybindings in copy mode
setw -g mode-keys vi

# Setup 'v' to begin selection as in Vim
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "reattach-to-user-namespace pbcopy"

# Update default binding of `Enter` to also use copy-pipe
unbind-key -T copy-mode-vi Enter
```

# 終わりに
Enjoy!
【Eclipseプラグイン開発】javadocの取得

誰も興味がないと思うけど、見つけるのに少し苦労したので備忘のため書いておきます。

`org.eclipse.jdt.ui.JavadocContentAcces#getContentReader`というメソッドを使います。



```java
import org.eclipse.jdt.core.IMember;
import org.eclipse.jdt.ui.JavadocContentAccess;
//・・・

	public static String getJavadoc(IMember member) {
		try {
			Reader reader = JavadocContentAccess.getContentReader(member, false);
			if (reader == null) {
				return null;
			}
			try {
				StringBuilder buf = new StringBuilder();
				int ch;
				while ((ch = reader.read()) != -1) {
					buf.append((char) ch);
				}
				return buf.toString();
			} finally {
				reader.close();
			}
		} catch (IOException | JavaModelException e) {
			return null;
		}
	}
```

* MEMO

    `org.eclipse.jdt.ui.JavadocContentAccess`は、**`org.eclipse.jdt.ui`**、
    `org.eclipse.jdt.core.IMember`は**`org.eclipse.jdt.core`**
    を依存関係に入れると使えます。

    `IMember`は、Field、Method、Class、Constructor（IInitializer）等の親インターフェースです。

    どうやって`IMember`までアクセスするかは、`IJavaProject`や`IType`あたりをググって
    [Hishidamaさん](http://www.ne.jp/asahi/hishidama/home/tech/eclipse/plugin/develop/jdt/JavaProject.html)や、個人的なEclipseプラグイン開発のバイブル、[Eclipse/プラグイン開発のTIPS集](http://www.masatom.in/pukiwiki/Eclipse/%A5%D7%A5%E9%A5%B0%A5%A4%A5%F3%B3%AB%C8%AF%A4%CETIPS%BD%B8/)あたりをなめれば出てくると思います。
（気が向いたら記事書きます）
Fetch APIでPOSTしたら、$_POSTで取得できなかった

Content-Typeをちゃんと指定しないとダメだった。

# バージョン
## php
```
# php -v
PHP 5.3.3 (cli) (built: Mar 22 2017 12:27:09) 
Copyright (c) 1997-2010 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
```

## Firefox
55.0.3
https://www.mozilla.org/en-US/firefox/55.0.3/releasenotes/

# ダメだったやつ
```js
fetch(
	url,
	{
		method: 'POST',
		mode: 'cors',
		body: 'key1=value1&key2=value2'
	}
).then(function(response) {
	console.log(response);
}).catch(function(e) {
	console.error(e);
});
```

# OKだったやつ
```js
fetch(
	url,
	{
		method: 'POST',
		headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
		mode: 'cors',
		body: 'key1=value1&key2=value2'
	}
).then(function(response) {
	console.log(response);
}).catch(function(e) {
	console.error(e);
});
```
Heroku上のSprocketsキャッシュを削除する

# どういう問題が起こったか
使わないcoffee_scriptのgemとcoffeeファイルを含むアプリケーションをheroku上にdeployしてしまいsprocketsがcofeeのキャッシュを生成してしまったため、coffee_script gemを除外してもtmp/cache/assets をクリアしない限り

```
cannot load such file -- coffee_script
```

というエラーがassets:precompileタイミングで発生してしまう。という割とあるあるのトラブルをheroku上で発生させてしまった。

# 普段(heroku外)の解決方法
herokuではなくローカル等あれば ``` rails tmp:clear ``` で解決する。

heroku console で ```Rails.cache.clear```を実行したり

```heroku run rails tmp:clear``` を実行したりしてみたもののキャッシュのストア、リストアタイミングの問題でビルド時には再度エラーになってしまい解決しない。

# Herokuで解決した方法

https://github.com/heroku/heroku-repo

heroku-repo の機能を使って purge-cacheすることで解決した。

```
heroku plugins:install heroku-repo
heroku repo:purge_cache -a appname
```

もろもろクリアされてしまうため、bundlerやYarn等のインストールも完全に再実行になってしまう点に注意

# その他
多分cacheが使われないようにapplication.jsファイル等のキャッシュを利用しようとして問題になってるファイルを無駄に編集したりするとかでも解決するんじゃないかと思われる(未確認)

今回は慣れてないheroku上のトラブル & 趣味で解決を急がない状態だったので根本解決したく、強引な解決方法はとらず、キャッシュされてるtmpファイルを削除する方法を探した。
例外処理の指針

C言語上がりの私にとって、例外処理という存在そのものは知っていたが、概念がC言語になかったので扱いにかなり戸惑う。
そして色々調べてみたけど、例外に関する指針・考え方は本当に多岐にわたっていて、混乱する。

ここでは、自分の解釈をまとめていくのを目標としています。
少しずつ、少しずつ、加筆してまとめていけたらと思います。

# 例外処理の前提
個人的には、「契約による設計」を前提とした例外処理の考え方がしっくりくる。
なので、基本的にはその考え方から例外処理を扱っていきたいと思う。
会社に買ってもらった「[オブジェクト指向入門 第2版 原則・コンセプト](http://amzn.asia/1Vmg1Ik)」に契約による設計の説明と例外処理のコンセプトが書いてあるっぽい。たぶん必読なので、読む。（ぱっと見たところ、疑似言語とか出てきてて決して読みやすそうとは思わなかったが・・・）

# 関数失敗時に例外処理を投げるか戻り値で通知するかの指針について
某所で質問したもののまんまになるが、個人的な解釈を以下にまとめる。

## 論点
* 関数失敗時に例外処理を投げるか、戻り値（例えばboolなど）で通知するか？
* そもそもどういうときに例外を投げるべきか？

### 前提
事前条件とは・・・メソッドを呼ぶ前に、呼び出し側が成立させる条件。つまり、引数が正しいことや、呼び出すタイミングが正しいことなど。
 
## 例外として扱うもの

* 事前条件を満たさない場合、または事前条件を満たさないことによりメソッド内でエラーが起きた場合  
（事前条件を満たすのは呼び出し側の責任であるという「契約による設計」の考え方）  
    * 引数異常を起因としてメソッドが正常に動作できなくなった場合もここに該当する
* 事前条件を満たしているが、失敗責任の所在がメソッド内で閉じていない場合（失敗がネットワークなどに起因する場合）
* 事前条件を満たしているが、メソッド内で回復できないエラーが発生した場合
 
## 例外として扱わないもの

* 事前条件を満たしており、メソッド内で想定内の処理失敗（＝回復可能なエラー）した場合
* 事前条件を満たしており、メソッドの事後条件に処理失敗時のことが規定されている場合  
    * `TryParse`メソッドのように、「失敗したらfalseを返す」ということが予め表明されている場合がここに該当する

# 例外の指針として、参考になったものリスト
* **「例外は呼び出す側が契約条件を満たしたが、呼び出された側が契約を履行できなかったときに投げるもの」**（出典：[例外設計における大罪](https://www.slideshare.net/t_wada/exception-design-by-contract)の27ページ目）
* [契約による設計から見た例外](http://qiita.com/Kokudori/items/2e4bd32abf7abea3186f)
* [再度、契約による設計と例外について](http://qiita.com/draftcode/items/d9c1aa0ef63b100923dd)
* [Java/Androidにおける例外設計、あるいは「契約による設計」によるシンプルさの追求](http://qiita.com/yuya_presto/items/3b651d6b0cf38f77e933)
rtcwakeの使用方法

#rctwakeコマンドとは

システムスリープ・ウェイクアップを管理するコマンド。
crontabと組み合わせて定期的にスリープ・ウェイクアップを行うと言った使い方が可能。

停電の際に以下の用に使用して遠隔操作だけで電源断からの自動電源ONが可能

`$ sudo rtcwake -m off -s 86400`

コマンド実行時点で電源断となり、24時間後に通電していれば起動します。

参考
[rtcwake - 指定時間になったらスリープ/休止状態/電源OFFから自動的に復帰](http://linux.ikoinoba.net/index.php?UID=1347981483)

##余談(背景)
土曜の夜に翌日が研究室の全館停電であることを知り、管理しているサーバのshutdownは出来るけど、
遠隔から電源ONは出来ないモノかと悩んだ結果、ダメ元でトライして上手く行きました。
ちなみに、自宅から研究室は片道2時間なので。

##修正:2021/02/15
開始時間を指定するならこちら
`$ sudo rtcwake -m off -l -t $(date +%s -d "2020-08-31 09:30:00")`

-l オプションは、ハードウェアクロックがローカル時間に設定されている場合に必要なオプション。
ハードウェアクロックがUTCの場合は、-l は不要。（つけると、9時間ずれます）

ハードウェアクロックの確認方法は、以下の通り
~~`$ sudo hwclock --show`~~
hwlockでは、必ずローカルタイムが表示されてしまう。

`/etc/adjtime`
上記ファイルの3行目にLOCALまたはUTCのどちらが記載されているかを確認することで判断可能。
ファイルがない場合は、ハードウェアクロックはUTC。

参考:http://lfsbookja.osdn.jp/svn-sysdja/chapter07/clock.html
プログラム内で development と production で動作を変更させる場合は Rails.env でどっちなのかを確認できる。



if Rails.env == 'production'
    # 本番環境用の処理
end
もしくは、Rails.env.development? などのように記述できる。

if Rails.env.development?
    # 開発時用の処理
end
 
if Rails.env.production?
    # 本番環境用の処理
end
ブラウザから見て開発と本番を区別したいという場合には以下の Gem を利用するのが良いだろう。
簡単なRESTful

# RESTの基本  
1. HTTPメソッドを使用する。
2. ステートレスにする。
3. 見やすいURI(※1)にする。(ディレクトリー構造に似ている。)  
4. データの転送にXMLまたはJSONを使用する。

# HTTPメソッドについて  
CRUD(create、read、update、delete)とHTTPメソッドが1対1に対応づけられている。　　

- リソースを取得するためにGETを使用する。(read)
- リソースを作成するためにPOSTを使用する。(create)
- リソースを更新するためにPUTを使用する。(update)
- リソースを削除するためにdeleteを使用する。(delete)

# ステートレスについて  
Webサービスを拡張性のあるものにするため、完全かつ独立したリクエストを送信する必要がある。そうすることで仲介サーバなどはローカルで情報を保持しなくてもよくなる。  

# 見やすいURI 
ディレクトリー構造に似たURIを定義する。  
`http://www.test.com/user/{id}`

# データの転送について　　
転送方法にはXMLまたはJSON形式を使用する。
>リソース表現は、クライアントが要求した時点でのリソースの状態と属性を表す。XMLやJSONで転送することで、様々なプラットホームが使用できる。
KotlinのInterfaceをJRubyのクラスに実装してKotlinから呼びだす


GUIはKotlin、処理はRubyで書きたくて、RubyとJavaのクラスを相互に扱う必要があったのでメモ
[JavaのInterfaceをJRubyのクラスに実装してJavaから呼びだす](http://qiita.com/enkatsu/items/5de9df8327008581289c)の元ネタ
Kotlinの方がスッキリかける


```bash
$ tree
.
├── out
│   └── production
│       └── JRubyKotlin
│           ├── META-INF
│           │   └── JRubyKotlin.kotlin_module
│           ├── MainKt.class
│           └── TestInterface.class
├── ruby
│   ├── TestInterface.jar
│   └── test_class.rb
└── src
    ├── Main.kt
    └── TestInterface.kt
```

```kotlin:TestInterface.kt
interface TestInterface {
    fun hello(): String
}
```

```ruby:test_class.rb
java_import 'TestInterface'

class TestClass
  include TestInterface
  def initialize name
    @name = name
  end

  def hello
    "hello #{@name}"
  end
end
```

```kotlin:Main.kt
import java.io.File
import javax.script.ScriptEngineManager
import javax.script.ScriptException

fun main(args: Array<String>) {
    val m = ScriptEngineManager()
    val rubyEngine = m.getEngineByName("jruby")
    val context = rubyEngine.context
    try {
        rubyEngine.eval(File("./ruby/test_class.rb").reader())
        val name = "'Taro'"
        val classTest = rubyEngine.eval("TestClass.new " + name, context)
        if (classTest is TestInterface) {
            println(classTest.hello())
        }

    } catch (e: ScriptException) {
        e.printStackTrace()
    }
}
```
Laravel5.4でroutingとcontrollerとviewを使って画面を表示する


以下の記事の続きです。
##### Cloud9上にLaravel5.4を導入する
http://qiita.com/n10432/items/83d1133eaf7189691eb4

環境構築が終わりましたのでいよいよLaravelを触っていきます。

今回は

- routing
- controller
- view

を使って画面を表示させる方法を説明していきます。

## laravelのフォルダを作成する

前回のおさらいですが、以下のコマンドでlaravelのフォルダを作成します。

```bash
laravel new laravel

#以下を~/.bashrcに登録していない場合は実行しておく
export PATH=~/.composer/vendor/bin:$PATH

#warningが出た場合は以下のコマンドを実行
composer global require "laravel/installer"
```

## routingを実施する
laravelはMVCモデルなので、何をするにしても最初にroutingが問題になります。
laravelでroutingを設定する役割はroutes/web.phpが担っています。

このファイルに特定のURLにアクセスが実施されたときに実行するべき処理を書き込みます。
以下は初期状態でのweb.phpのコードです。

```php:routes/web.php
/*web.phpは初期状態では以下のコードとなっている*/
<?php
Route::get('/', function () {
    return view('welcome');
});
```
これは「welcome(正確にはresources/viewsフォルダに含まれるwelcome.blade.php)」というテンプレートファイルを返すことを表現しています。

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

```php:routes/web.php
<?php
Route::get('/', function () {
    return view('welcome');
});
Route::get('/users', 'UserController@index');
```
追記した行は「[元URL]/users」にアクセスが来た際に、「UserController」というコントローラのindex関数を実行することを意味しています。

## UserControllerの実装
上記で定義したUserController用のファイルを作成します。
作成場所は「app/Http/Controllers/」
ファイル名は「UserController.php」とします。

```php:app/Http/Controllers/UserController.php
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class UserController extends Controller
{
    public function index()
    {
        return view('test');
    }
}
```
上記のコードの

```php:app/Http/Controllers/UserController.php
    public function index()
    {
        return view('test');
    }
```
の部分は「UserController」のindex関数であり、testビュー(正確にはresources/viewsフォルダに含まれるtest.blade.php)を返すことを示しています。

## testビューの実装
testビューを用意します。
「resources/views/」に「index.blade.php」を作成し、以下のように記述します。

```php:resources/views/test.blade.php
<!doctype html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <h1>Hello test</h1>
</body>
</html>
```

## 動作確認

ここまで作成出来たら、前回の記事にあるようにCloud9上のRun Projectを押してLaravelのホーム画面に接続します。
その後URLの末尾に「/users」を追記して接続すると以下のような画面が得られるはずです。

![test.png](https://qiita-image-store.s3.amazonaws.com/0/197560/6955771d-86bd-e4d8-fe76-d07eb515ab72.png)
ESNextのbind operatorを使って拡張メソッドみたいな事をする

# bind operatorとは
`func.call(obj)`を`obj::func()`と書けるシンタックスシュガーです。
`::obj.func`と書くと`obj.func.bind(obj)`となる構文もありますが今回は不要なのでスルーします

# 今までのJavaScript
ここでは例として引数の文字列を2倍して返す関数twoを作ります

```js
function two(str){
  return str+str;
}
```

呼び出し

```js
two('x');//'xx'
```

# 問題点
この程度なら特に問題はありません。
しかし、文字列加工の処理などで以下のような事になってしまう事ありますよね？

```js
z(y(x(str)));
```

まず括弧の対応が分かりにくいです。
そして関数はx→y→zの順に呼び出されるのに、見た目はz→y→xと逆になってしまいます。
# プロトタイプ拡張は？
名前の衝突などの危険があるので使いたくない。
# bind operator
```js
function two(){
  return this+this;
}
```

呼び出し

```js
"x"::two();
```

この構文なら綺麗に書けます。
名前衝突の心配もありません。
さっきの`z(y(x(str)))`も`str::x()::y()::z()`と書けます。
# 注意
babelが必要です。
あとstage-0なので仕様が変わるかも

# tc39
*
Java8のFunction, Consumer, Supplier, Predicateの調査

# 動機
Java8でlambdaとかStreamとか追加クラスとかあるけど、Function, Consumer, Supplier, Predicateなどが基礎になっている気がするのでちゃんと理解する。

# Function
## 使い方
Javaにおけるメソッドの挙動をインスタンスで扱う仕組み。
従来、以下のようにしていたメソッド定義を、

```java:MethodDefinition
R functionName(T arg) {
    return new R();
}
```

以下のような形で、インスタンス定義に変えることが出来る。

```java:ConventionalDefinition
Function<T, R> functionalInstance = new Function<T, R>() {
    @Override
    public R apply(T arg) {
        return new R();
    }
};
```

これだと面倒なので、lambda式を使って以下でも良い。

```java:InstanceDefinition
Function<T, R> functionalInstance = arg -> new R();
```

メソッド定義の場合だと、以下のようにして呼び出ししていたが、

```java:MethodCall
R returnValue = functionName((T) argument);
```

`Function`を使った場合は、applyメソッドを使って、

```java:InstanceCall
R returnValue = functionalInstance.apply((T) argument);
```

とする。

Javaにおけるメソッドは第一級オブジェクトではないけれど、そういうスタイルを導入しやすいように新しく仕組みを作ったという感じだろうか。

# Consumer
Functionが分かればあとは簡単で、Consumerは引数を消費するインスタンスを定義するためのインターフェイス。
引数は取るが返り値は存在しないので、ジェネリクスによる型指定は引数側の一つだけ。

イメージとしては、以下のメソッドのインスタンス版。

```java
void consumer(T arg) {
    something(arg);
}
```

定義方法は、以下の通り。acceptというメソッドをオーバーライドして挙動を定める。

```java
Consumer<T> consumer = new Consumer<T>() {
    @Override
    public void accept(T arg) {
        something(arg);
    }
```

lambdaなら、以下。

```java
Consumer<T> consumer = arg -> something(arg);
```

呼び出しは、以下のように実施する。

```java
consumer.accept((T) argument)
```

# Supplier
Supplierは、引数を取らないが返り値は存在する挙動を定義するためのインターフェイス。

イメージとしては、以下のメソッドのインスタンス版作るためのもの。

```java
T consumer() {
    return new T();
}
```

以下のように定義する。

```java
Supplier<T> supplier = new Supplier<T>() {
    @Override
    public T get() {
        return new T();
    }
}
```

lambdaなら以下。

```java
Supplier<T> supplier = () -> new T();
```

使用する場合は以下のようにする。

```java
supplier.get();
```

# Predicate
Predicateは、ある引数を受け取って、真偽値を返すインターフェース。

```java
// 引数が1だったらtrue、それ以外はfalse
Predicate<Integer> predicate = arg -> arg == 1;

Integer argument = 1;
if (predicate.test(argument)) {
    System.out.println("argument is 1");
} else {
    System.out.println("argument is not 1");
}
```
という感じで使う。

`Function<T, Boolean>`に近いと思うが、この場合だとBooleanからbooleanへのアンボクシングが入るので、それを避けるのが一つの目的だろうか。
andとかorというメソッドもあるようだが、あまり使わなさそうなので省略する。

## synchronizedについて完全理解したいなら
[synchronizedの解説と典型的誤り例](https://qiita.com/subaru44k/items/13c52151b8d08fbc0380)
を書いたので、こちらもどうぞ。経験的に、7割くらいの人がなにか間違っています。
熱力学的遺伝アルゴリズムモドキで巡回セールスマンを解いてみた

####**モドキを作った理由**
熱力学的遺伝アルゴリズムの計算コストを小さくしたかった。
親集団と子集団が同じ数でも世代交代に10秒ほど時間がかかり、
一様交叉と突然変異、淘汰のみの比較的シンプルなGAだと1秒で何世代も進む

####**ソースコード**
https://github.com/2a3oiUA3zfDtr3py/Misc/tree/master/GA_TSP
全ての乱数はrand()の代わりに/dev/urandomから取得

####**アルゴリズム**
遺伝子は都市の訪問順に記録する
評価関数をこんな感じにしたいため

```c
距離 = 0;
for(i=0;i<(都市の数-1);i++)
{
  距離 += 都市と都市の距離を求める関数なり二次元配列なり(遺伝子[i+1],遺伝子[i]);
}
距離 += 都市と都市の距離(遺伝子[0],遺伝子[都市の数-1]);
```

これにより交叉や初期集団の生成に、同じ都市に2度行く遺伝子や一度も行かない都市がある様な遺伝子が発生しない様にする必要がある。

Step 1
温度Tに初期値T0を代入する
親集団のサイズを都市の数のα倍にする
子集団のサイズを親集団のβ倍にする
子集団と同じ数の初期集団をランダムに生成し子集団に入れる

Step2
親集団は空にしておく
二都市間の経路の出現回数を記録する領域を用意し0で初期化する

Step2-1
子集団の全ての個体のエントロピーモドキを計算する
エントロピーモドキの計算方法は
Pxは親集団における 二都市間の経路 xの出現回数
エントロピーモドキS = -log( (Px + 1) / 親集団のサイズ)

Step2-2
エントロピーモドキが大きい順に個体をγ個子集団から取り出し親集団に入れる

親集団が満たされるまで、Step2-1 Step2-2を繰り返す

Step3
親集団の移動距離を計算する
親集団の個体の順位を移動距離で決める

Step4 (子集団の生成)
Step4-1 (交叉)
ルーレット選択で親を二つ選ぶ
遺伝子と同じ長さの乱数を取得し2の剰余を計算する
それに基づいて片方の遺伝子を子の遺伝子にコピー
参考

```c
for(i=0;i<遺伝子長;i++)
{
  if(乱数[i] % 2 == 0)
  {
    子遺伝子[i] = 親遺伝子[i]
  }
}
```

子遺伝子の残りをもう一方の親遺伝子から出現順序に基づいてコピー
ただしすでに子遺伝子に有るものはスキップ


Step4-2 (突然変異)
適当な乱数に基づいて確率δの割合で
生成された子遺伝子の一部の訪問順序を逆にし
確率εの割合で生成された子遺伝子の一部の訪問順序をデタラメに並べ替える


Step4-1 Step4-2を子集団が満たされるまで繰り返す

Step5
親集団は空にしておく
二都市間の経路の出現回数を記録する領域を用意し0で初期化する
Step5-1
Step2-1と同様に子集団のエントロピーモドキSを計算し
子集団の各個体の移動距離Dを計算する
そして全ての個体の
自由エネルギーモドキF = D - T*S
を計算する

Step5-2
自由エネルギーモドキが小さい順に個体をγ個子集団から取り出し親集団に入れる

親集団が満たされるまで、Step5-1 Step5-2を繰り返す

Step6
温度Tを更新する
T = T * ζ

Step7
終了条件を判定する
終わっていないならStep3へ

####**結果**
2次元空間上に配置した100都市では、貪欲法+2-OPTより良い結果になる。
2次元空間上に配置した500都市では、貪欲法+2-OPTより悪い結果になる。
8次元空間上に配置した200都市では、貪欲法+2-OPTより悪い結果になる。

2次元空間上に配置した100都市で温度を常に0にして通常の遺伝アルゴリズムとして動作させても上手いこと行かなかった事を考えると
多様性の維持に成功しているっぽい？

そしてモドキでは無い熱力学的遺伝アルゴリズムを2時間かけて1回だけ回した結果は貪欲法よりマシで貪欲法+2optより悪い

####**改良**
モドキの改良によって上手いこと探索できる確率が上がった

```c
t2 = parent_distance[0];
while(1)
    {
        sort(index,parent_distance,num_parent);//Step3
        evaluate_entropy(parent_gene,&t1,num_parent);//親集団のエントロピーを取得
        printf("%f\n",t1);
        if(Entropy < t1)
        {
            Entropy = t1;
        }
        Entropy *= 0.999;
        if(Entropy * 0.8 > t1)
        {
            Temperature *= 1.05;
        }
        else if(t2 - 0.001 >= parent_distance[index[0]])
        {
            Temperature *= 0.99;
        }
        else
        {
            Temperature *= 1.005;
        }
//Step4以後が続く
```

Step7を消してStep3の後に温度を動的に決める仕組みを組み込んだら貪欲法より悪い答えになる確率が下がった