OmniAICreator/Qiita-1.07M huggingface dataset:
【Unity】キー入力1つでGameObjectにアタッチされているすべてのスクリプトを開く

※この記事のUnityのバージョンは5.3.5f1です

#はじめに
ゲームオブジェクトにアタッチされたスクリプトを開くとき、マウスを使って
ダブルクリックするの面倒くさいですよね。
そこで、選択しているオブジェクトにアタッチされている全てのスクリプトを
**１回のキー入力で**開けるようにするエディター拡張を作ってみました。

<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/f35ba24b-cfac-7f47-2909-9930058d7875.png" height = 180>


#ソースコード
以下のスクリプトをUnityプロジェクトに入れるだけで使えるようになります.

```EditorOpenComponents.cs
#if UNITY_EDITOR
using UnityEngine;
using UnityEditor;
using System.Reflection;

[InitializeOnLoad]
public class EditorOpenComponents
{
  static EditorOpenComponents()
  {
    bool keyDown = false;
    EditorApplication.CallbackFunction function = () =>
    {
      if (!keyDown && Event.current.type == EventType.KeyDown)
      {
        keyDown = true;

        // . が入力されたらHierarchyで選択しているオブジェクトにアタッチされているすべてのスクリプトを開く
        if (Event.current.keyCode == KeyCode.Period && Selection.activeGameObject != null)
        {
          var mss = Resources.FindObjectsOfTypeAll<MonoScript>();

          foreach (var ms in mss)
          {
            var cls = ms.GetClass();

            if (cls != null)
            {
              if (cls.IsSubclassOf(typeof(MonoBehaviour)) && Selection.activeGameObject.GetComponent(cls) != null)
              {
                // スクリプトを開く
                OpenInEditor(cls.ToString(), 0);
              }
            }
          }
        }
      }

      if (keyDown && Event.current.type == EventType.KeyUp)
      {
        keyDown = false;
      }
    };

    FieldInfo info = typeof(EditorApplication).GetField("globalEventHandler", BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic);
    EditorApplication.CallbackFunction functions = (EditorApplication.CallbackFunction)info.GetValue(null);
    functions += function;
    info.SetValue(null, (object)functions);
  }

  /// <summary>
  /// スクリプトを外部エディタで開く
  /// </summary>
  public static void OpenInEditor(string scriptName, int scriptLine)
  {
    string[] paths = AssetDatabase.GetAllAssetPaths();

    foreach (string path in paths)
    {
      string scriptPath = System.IO.Path.GetFileNameWithoutExtension(path);
      if (scriptPath.Equals(scriptName))
      {
        MonoScript script = AssetDatabase.LoadAssetAtPath(path, typeof(MonoScript)) as MonoScript;
        if (script != null)
        {
          if (!AssetDatabase.OpenAsset(script, scriptLine))
          {
            Debug.LogWarning("Couldn't open script : " + scriptName);
          }
          break;
        }
        else
        {
          Debug.LogWarning("Couldn't open script : " + scriptName);
        }
        break;
      }
    }
  }
}
#endif // UNITY_EDITOR
```

#使い方
1. HierarchyのGameObjectを選択。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/753815cc-c6b4-e0e4-4f06-02797e27f452.png"  width = 512>
<br>

2. キーボードの . を押す。
<br>

3. 押すと選択しているGameObjectにアタッチされているすべてのスクリプトが外部エディタで開かれます。
<img src = "https://qiita-image-store.s3.amazonaws.com/0/44288/4320abd3-ac8d-f507-1592-58fbd3f11dd4.png" width = 512>
筆者はVisualStudioをエディタに設定しているのでVisualStudioが起動しました.

<br>
便利かも？

# 参考
UnityEditorのグローバルEventを取得する - けいごのなんとか
http://anchan828.hatenablog.jp/entry/2013/05/20/135339
ApartmentGemを使ってテナント型Webアプリケーション構築のサンプル (PostgreSQL版)

---追記--- 
[ワイルドカードドメイン対応のVirtualHostを記述する](http://qiita.com/Syn256/items/88b7fa38b911b2f1b209)
DNSのワイルドカードドメインを追加した後、Apache側に対応するVirtualHostを書いてあげる必要がありましたが、記述していなかったため、別記事で追加しました。
---追記--- 


Apartment Gemを使った実装のサンプルです。
DBはPostgreSQLを利用しています。
RackサーバのPowを利用してサブドメイン動作を確認しています。
本番環境ではDNSに*レコードを追加することで、マルチドメインに対応することを想定しています。

今回のデモプログラムダウンロード
[ソースコード] (https://github.com/Synashida/apartment_rails_pg)

環境構築方法はデモプログラムダウンロード先のgithubリポジトリのREADME.mdにも記載していますし、他の記事もたくさんありますのでそちらを参考にしてください。

このサンプルでの要点は1行だけで

app/controllers/tenants_controller.rb のdef createメソッド内に
`Apartment::Tenant.create(@tenant.subdomain)`
この記述のみです。

Tenantレコードにデータが追加された直後にテナントを追加しています。
ここを自動化できればあとはDNSレコードにワイルドカードドメインを追加して
subdomain.本番環境のドメイン名/のリンクを利用者に提供するだけで
Web上ですぐにテナントが利用できるようになります。

簡単なので是非お試しください。
CakePHP v2.4.0: CookieComponentを利用しAppControllerでwriteした値をTestControllerでreadできない場合がある

# これは何か？

- CookieComponentを利用しCookieが無い状態でAppController::beforeFilter()でwriteした値をTestController::index()でread出来ない現象に遭遇した時のメモ。

# 次のコードはCookieが無い状態で`http://{your domain}/test`にアクセスしてreadした値が表示されます。

```php:app/Controller/AppController.php
class AppController extends Controller {
    public $components = array('Cookie');

    public function beforeFilter($options = array()) {
        $this->Cookie->write('test', 'value');
        debug($this->Cookie->read('test'));
    }
}
```

```php:app/Controller/TestController.php
public function TestController extends AppController {
    public function index() {

    }
}
```

```html:結果
<div class="cake-debug-output">
<span><strong>/app/Controller/AppController.php</strong> (line <strong>39</strong>)</span>
<pre class="cake-debug">
&#039;value&#039;
</pre>
</div>
```

# 次のコードはCookieが無い状態で`http://{your domain}/test`にアクセスするとreadできません。

```php:app/Controller/AppController.php
class AppController extends Controller {
    public $components = array('Cookie');

    public function beforeFilter($options = array()) {
        $this->Cookie->write('test', 'value');
    }
}
```

```php:app/Controller/TestController.php
public function TestController extends AppController {
    public function index() {
        debug($this->Cookie->read('test'));
    }
}
```

```html:結果
<div class="cake-debug-output">
<span><strong>/app/Controller/TestController.php</strong> (line <strong>5</strong>)</span>
<pre class="cake-debug">
null
</pre>
</div>
```

# これは何故か？？？

`TestController::index()`が呼ばれるあたりで`CookieComponent::startup()`が呼ばれるようで、この際にCookieComponent内部で記録されているプロパティにカラの配列の代入が行われている。
そのため`AppController::beforeFilter()`でセットした`'test'`は、`TestController::index()`が呼ばれるときには既に無い様子。
※Cookieがセットされた2回目以降のアクセスならばCookieから読まれるため問題なく表示される。

# 実行順序を確認する

こちらが参考になりました。
http://qiita.com/ran/items/52a6060bcfbeec69dc34

各メソッドの呼び出しはこのあたりで行われている。
`lib/Cake/Routing/Dispatcher.php#_invoke()`

ControllerのbeforeFilter()の後に
Componentのstartup()が呼ばれているようなので
ControllerのbeforeFilter()でComponentを使わないのが良い模様。
ZYBO > Link > BRAM > ブロックRAMの使い方 > CLBを消費しない

関連 http://qiita.com/7of9/items/0ebeaef714999ec1e663
関連 http://qiita.com/7of9/items/b46c028752710394402f

Zynq関連の資料を読んでいる中でBRAMというのが出てくるが、その概念は未消化であった。

以下のリンクを見つけた。
http://www.nahitech.com/nahitafu/fpgavhdl/bram/bram.html
> FPGA中にメモリを作ろうとしたとき、 普通に配列で作ると、ロジック回路に使うCLBという領域を使います。 このメモリは分散RAMとよばれ、容量などは特に決まっていませんが、 貴重なCLBを湯水のごとく消費するので勿体ない使い方といえます。

>　SpartanIIやVirtexEにはブロックRAMという機能が備わっています。 ブロックRAMは4096ビットのデュアルポートメモリです。 このメモリはプリミティブとして用意されているので、 使ってもFPGAのCLBは消費しません。 大きな塊のメモリが欲しい時につかうと、とてもFPGAを 効率よく使うことができます。

BRAMのBはBlockということを知った。
CLBを消費せずにまとまったメモリを扱えるということも分かった。

リンク先にさらに詳しい使い方などが掲載されている。
ZYBO > Link > XADC > Over Temp Monitoring > Auto shut down is possible. > 10 ms after the trigger level is reached a shut down occurs. 

https://forums.xilinx.com/t5/Xcell-Daily-Blog/Adam-Taylor-s-MicroZed-Chronicles-Part-43-XADC-Alarms-and/ba-p/496468
に紹介されているXADC。

Alarmsに関して以下のリンクを見つけた。
http://adiuvoengineering.com/?p=738

> `2. Over Temp Monitoring – Maximum junction operating temperature allowable for the device – Auto shut down is possible.

![qiita.png](https://qiita-image-store.s3.amazonaws.com/0/32870/9cd56bf3-276e-c7b0-a3a0-44b8d4f713a2.png)


同じリンクの以下の説明があった。上記画像のTriggerの設定を超えてから10msecでshutdownになるようだ。

> The over temperature alarm is slightly different in that it can be configured to trigger an automatic shutdown of the device. To set automatic shut down the four LSB’s of the over temperature register must be set high. Doing this means that 10 ms after the trigger level is reached a shut down occurs.
技術英語 > Nathie Katzoff > where the line between function and art disappear(ed)

Master Craftsman, Nathie Katzoff | HUMAN
https://www.youtube.com/watch?v=m3yVCHj3jA8&list=PL_MJualihC5AxdlHgVUROYKbNAaPJ5PE4&index=61

木工技術者の動画。字幕がしっかり付いている。

(00:48-)
He is truly an artisan, where the line between function and art disappear(ed).

字幕はdisapperだが文法的に間違いでthe lineに対してはdisappersかdisapperedになるはず。disappear(ed)に聞こえる。またはthe lines ... disappearでもいい。

<hr>
lines between ...の用法としてはLOEにてlines between human and animal kingdomとして使用されていたのを覚えている。

<hr>
自分の影響圏で出てきそうなものとしては

the line between function and design
ASP.NET MVC ViewからControllerへ値を渡す方法

自分のメモ代わりですが、Qiitaに投稿してみたくて書いてみました。
この記事では以下の環境を使っています。
・Visual Studio 2015
・ASP.NET MVC5

#viewからcontorllerへ値を渡す方法

以下の様なViewがあるとします。

    @for(int i = 0; i < length; i++)
    {
        <input type="text" name="data1" value="@Model.entryData[i]" />
        <input type="text" name="data2" value="@Model.entryData[i]" />
    }

※上記の記載はformタグで囲まれています。

この値をControllerに渡したいとすると、controller側のアクションの引数を以下の様にすればOKです。

    public ActionResult Action1(string[] name1, string[] name2)
    {
        中身・・・
    }

ポイントは、Viewのinputタグのnameの値と、Controllerのアクションの引数名を一致させる点です。
これで自動的に紐づけをしてくれます。

Controllerへ渡す値がmodelの場合や、
modelのlistの場合なども、自分で使った後に追記していきたいと思います。

以下の記事を参考にさせて頂きました。ありがとうございました。
http://my-clip-devdiary.blogspot.jp/2009/10/viewcontroller.html
AWS Lambda+Scala+POJO


LambdaではPOJOで入出力値の型を定義できるが、Scalaではどうやるかわからなかったので調べら、まさに出てきた。

https://github.com/neil-rubens/aws-lambda-scala-api-gateway

```scala
import com.amazonaws.services.lambda.runtime.{Context, RequestHandler}

class Handler extends RequestHandler[Request,Response]{
  override def handleRequest(input: Request, context: Context): Response = {
    return new Response("hello there: " + input.messageID )
  }
}
```

```scala
import scala.beans.BeanProperty

case class Request(@BeanProperty var messageID: String){

    def this() = this(messageID = "")

}
```

```scala
import scala.beans.BeanProperty

case class Response(@BeanProperty var details: String){

    def this() = this(details = "")

}
```
AWS Lambda+Javaの関数の型


(ドキュメントにあるコード例から想像した部分も多々あるので動く保証はありません)

Lambda+Javaでは次のような3つの関数の形式をサポートしている。

* https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-programming-model-handler-types.html

## プリミティブ

```
    public String handleRequest(int myCount, Context context) {
        return String.valueOf(myCount);
    }
```

## Stream

```
	public void handleRequest(InputStream inputStream, OutputStream outputStream, Context context) {

		...
	}
```

## POJO

```
	public Response handleRequest(Request request, Context context) {

		...
	}
```

`Request` と `Response` は自分で定義すると、Jacksonによっていい感じにJSONからマッピングされる。

* https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-handler-using-predefined-interfaces.html

## `IOException` を投げても良い

```
    public String handleRequest(int myCount, Context context) throws IOException {
        return String.valueOf(myCount);
    }
```

など。

* http://aws.typepad.com/aws_japan/2015/06/aws-lambda-update-run-java-code-in-response-to-events.html

## `RequestHandler` を実装してもよい

```
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.Context; 

public class Hello implements RequestHandler<Request, Response> {
    
    public Response handleRequest(Request request, Context context) {
        String greetingString = String.format("Hello %s %s.", request.firstName, request.lastName);
        return new Response(greetingString);
    }
}
```

など。

* https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-handler-using-predefined-interfaces.html

> あるいはLambdaコアJavaライブラリで利用可能なハンドラインターフェース(RequestHandler::handleRequestもしくはRequestStreamHandler::handleRequest)の1つを実装することも可能です。
> http://aws.typepad.com/aws_japan/2015/06/aws-lambda-update-run-java-code-in-response-to-events.html

## `Event` 呼び出しの場合（非同期呼び出しの場合）はvoidを返す

> Lambda 関数を非同期的に呼び出す（Event 呼び出しタイプを使用）計画の場合、outputType は void である必要があります。
> https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/java-programming-model-handler-types.html
ディープラーニングでFXのシステムトレーディングをするコードを書いた (2) -RNN/LSTM編-

http://qiita.com/ryo_grid/items/7746528f8cae8026b936
の続き。

前回はテクニカル指標群を入力にディープラーニングでUp or Downの分類をした結果を軸にトレードするコードだったけれど、今回は時系列での為替データをRNN/LSTMにかけてみた。
時系列データでの各足の差分の大きさを24種類(1-24の整数値)のコードに符号化して、そのデータ列を入力として学習させる。

結果はまったくダメ。実行時のlossは減っているように見えるのに、予測結果が0.999xxxしか出ない(1,0を予測するので0に近い数字も出ないとおかしい)。
実装が間違っているのだろうか....

500 epoch 回した時の収束具合
>10841/10841 [==============================] - 4s - loss: 0.0091 - val_loss: 0.3569
10841/10841 [==============================] - 4s - loss: 0.0090 - val_loss: 0.3538
10841/10841 [==============================] - 4s - loss: 0.0092 - val_loss: 0.3654
10841/10841 [==============================] - 4s - loss: 0.0085 - val_loss: 0.3777
10841/10841 [==============================] - 4s - loss: 0.0086 - val_loss: 0.3588
10841/10841 [==============================] - 4s - loss: 0.0080 - val_loss: 0.3592
10841/10841 [==============================] - 4s - loss: 0.0091 - val_loss: 0.3685
10841/10841 [==============================] - 4s - loss: 0.0090 - val_loss: 0.3760
10841/10841 [==============================] - 4s - loss: 0.0087 - val_loss: 0.3619
10841/10841 [==============================] - 4s - loss: 0.0087 - val_loss: 0.3861

コードは↓
https://github.com/ryogrid/fx_systrade/blob/a31971596cdce218d8078bcd0bb9ceb729079df0/keras_lstm_trade.py

以下の記事を大いに参考にさせてもらいました。
ありがとうございます。

http://qiita.com/nzw0301/items/f486c9f1691c53816ee7

[続き的なもの]
http://qiita.com/ryo_grid/items/c8d2d268e3f0d64af1e6
Lambda+Amazon API Gatewayでバイナリレスポンスを返す方法


Lambdaでbase64の文字列を返して、API GatewayのTemplateで

```
$util.base64Decode()
```

とやれば良いらしい。

ただしContent-Typeを動的に変えることはできない。つまりimage/jpegのAPIを作ったらそれはimage/jpagしか返せない。

## 参考

* https://clifff.com/2015/10/01/2015-failed-experiments-with-aws-lambda/
* http://stackoverflow.com/questions/35657002/aws-api-gateway-change-content-type/37639963#37639963
* https://github.com/d6y/aws-gateway-mapping-playground
pep8 が pycodestyle に変わった話

## 概要

- [pep8](https://pypi.python.org/pypi/pep8) が [pycodestyle](https://pypi.python.org/pypi/pycodestyle) というパッケージ名に変わってた
- Guido氏の提案が事の発端。

  - https://github.com/PyCQA/pycodestyle/issues/466

- **pycodelint** という案も出てたが、**pylint** と区別がつかないので却下になってた
- 同時に [pep257](https://pypi.python.org/pypi/pep257) も [pydocstyle](https://pypi.python.org/pypi/pydocstyle) という名前に変わった

  - https://github.com/PyCQA/pydocstyle/issues/172
  
- 自分の周りの影響範囲を軽く調べてみた。

## 追記(2018/02/27)

- ツール(ライブラリ)の pep8 の名前が pycodestyle という名前に変わったというだけで、[PEP8](https://www.python.org/dev/peps/pep-0008/) そのものには何も変更はないので気をつけてください。
- pep8がスタイルガイドのPEP8と一緒だと混同しやすいのでツールは名前を変えようという話です。
- pep257 -> pydocstyle も同様に、 [PEP257](https://www.python.org/dev/peps/pep-0257/)は何も変わりません。

## pep8

- https://pypi.python.org/pypi/pep8
- 直接使ってる場合は [pycodestyle](https://pypi.python.org/pypi/pycodestyle) に切り替える必要がある
- **1.7.0** を最後にNever更新されない

## flake8 

- https://pypi.python.org/pypi/flake8/3.0.0b1
- https://flake8.pycqa.org/en/latest/release-notes/2.6.0.html
- **flake8** は 内部で使ってる **pep8** が **pycodestyle** に切り替わった
- 単純に Upgrade するだけで良い

## pep257

- https://pypi.python.org/pypi/pep257
- これも [pydocstyle](https://pypi.python.org/pypi/pydocstyle) に切り替える必要がある
- **0.7.0** を最後に Never 更新されない

## autopep8 

- https://pypi.python.org/pypi/autopep8
- 名前が変わる予定はないっぽい。
- **pep8** を **pycodestyle** に切り替える修正は終わってる
- 多分次のリリースから **pycodestyle** に切り替わるんだと思う
- https://github.com/hhatto/autopep8/commit/3e1c196570204482d1376d4050633b8de6565533

## docformatter

- https://pypi.python.org/pypi/docformatter
- **pep257** を内部で利用してるかと思ったけど使ってなかった
- なので影響は特にない

## まとめ

- **flake8** や **autopep8** 使ってる分には対応してくれているので気にする必要なかった
- **flake8** の **「8とはなんだったのか」感**

## PyCQA is 何？

- lintやら、codeformatterやらのツール&ライブラリのオーサーが集まったゆるいグループらしい。
- http://meta.pycqa.org/en/latest/introduction.html#what-is-the-pycqa
- このグループの元でそれ系のツールを管理していくらしい。
- 似たようなグループにパッケージ関連を取りまとめる [PyPA](https://www.pypa.io/en/latest/) がある。

## 参考

- http://blog.kzfmix.com/entry/1465008955
InDesignで使える正規表現を利用した検索・置き換え

# 半角スペースを取る
Wordのテキストデータやその他のデータで英単語の前後に半角スペースが入ってる場合があるが、そのような時に効率的に削除する方法を解説したい。

## 正規表現での検索＆削除
command+Fか、[編集]メニューから[検索と置き換え]を選び、タブを[正規表記]にする。

![InDesign CCScreenSnapz001.png](https://qiita-image-store.s3.amazonaws.com/0/125657/b0f501ec-0e74-d953-d934-de9b07793b29.png)

正規表現での検索方法の詳しい情報は、[WikiPedia](https://ja.wikipedia.org/wiki/正規表現)の正規表現などを参考にしてほしい。

次に、[検索文字列：]の中に次の様に挿入する。

- 半角文字の次に半角スペースがあり、その次に全角文字がある場合

```
(?<=[\x00-\x7F]) (?=[^\x00-\x7F])
```

- 全角文字の次に半角スペースがあり、その次に半角文字がある場合

```
(?<=[^\x00-\x7F]) (?=[\x00-\x7F])
```

おまけとして全角文字と全角文字の間に半角スペースがある場合も列挙しておく

- 全角文字と全角文字の間に半角スペースがある場合

```
(?<=[^\x00-\x7F]) (?=[^\x00-\x7F])
```

## 結
今回は正規表現の肯定先読み、後読みという方法を使っての検索を行ったが、もしかするともう少しマシな方法もあるかも知れない。
とはいえ、これだけでも充分楽になったのではないだろうか？

# 音引きの検索方法
これもよくある話で、たとえばユーザーとユーザ、サーバーとサーバみたいに、原稿の中で統一されていない場合がある。
これも地道に検索していく方法もあるにはあるが、時間と労力の無駄なので、さくっと全検索・置き換え方法を使っていく


## 割とキモは`^`の使い方
ユーザとユーザーの検索で見ていくことにする。
たとえば、ユーザーをユーザに置き換える場合は、単純に`ユーザー`を全検索をかけて`ユーザ`に置き換えてしまえば問題はない。
問題になるのは、ユーザを検索してユーザーに置き換える場合だ。この場合、単純に`ユーザ`を検索・置き換えにしてしまうと、`ユーザー`の`ユーザ`という部分まで引っかかってしまい、そのまま置き換えをしてしまうと`ユーザーー`となってしまう。
なので、次の様に正規表現で検索する

```
ユーザ(?=[^ー])
```

ユーザまではわかると思うが、後ろにある`(?=[^ー])`は肯定後読みを使い、且つ、`[^ー]`で`ー`を対象外としたことになる。この`^`を前に付けると、後ろの検索部分以外を検索しなさい！という命令になる。
同じように`サーバ`を`サーバー`とする場合も、

```
サーバ(?=[^ー])
```

と正規表記検索を使って、置き換えてあげれば良い。

## 結
今回の肯定後読みと打ち消しだが、実はもっと色々な応用があるが、その辺は自分で色々考えてみてほしい。またInDesginに流し込む前にJeditなりの検索機能を使い、且つ、その設定を保存しておくと、一括で流し込みデータのができるので、これも試してほしいところであったりする。

# 挟まれた文字を検索する
著者に対して太字にしたいので、指定を括弧またはカギ括弧などで行ってほしいという事があり、後でその文字を一括変換に欠けたい場合などに用いる。

検索自体はかなり簡単で、たとえばカギ括弧の場合は次のように指定する。

```
\「.+?\」
```

つまりバックスラッシュの次は検索対称にはなるが、選択対象には入れないということになる。
後は、`検索と置き換え`の正規表記検索に入れて、置き換え形式に太字設定などを入れればいいだろう。その際、「や」などは検索と置き換えで個別に消してあげればいい。

## 結
これも色々応用の利く正規表現などで色々試してほしい。
上記の2つと組み合わせるとかなり絞った検索もできるようになるだろう。

# 同じ文字を繰り返しをマッチする
「これ、なんに使うんだ？」って思う人もいると思うが、実はわりとライティング打ち間違い上位に入るパターンである。
検索方法は次の通りである。

```
(.)\1+
```

上記の正規表現はメタ文字である**.**（.は改行以外全ての文字列を表現している）と、その後の「\1」で後方参照している。よくわからない人は、よく分からなくてもいいが、つまりそう言う事であるっていうことぐらいの柔らかい理解度で問題ない。


## 実際の検索方法

ひらがなだけをマッチさせたい場合は、次の様に書く。

```
([ぁ-ん])\1+
```

カタカナの場合は、次の様に書く。

```
([ァ-ヶ])\1+
```

漢字の場合は次の様に書く。

```
(亜-熙)\1+
```

また、ひらがな、カタカナ、漢字全てをマッチさせる場合は、次の様に書く。

```
([ぁ-んァ-ヶ亜-熙])\1+
```

## 結
結構この検索も使うが、難点は割と文章中にくり返し文字自体はよく使われるので、マッチしたからってそれが誤字ではないこともある。そういう場合は、自分で正誤の判断をしなければならない

# 複数の単語をマッチさせる
複数の単語を検索する場合は、以下のようにするのが簡単である。
使う場面としては、文章中に何個か検索したい単語があり、それを何回も検索するのが面倒だという場合である。
また、検索対象は以下のようにいくらでも増やせるので、対象単語が多く、それに対して一括処理などをしたい場合に重宝する。


```
(検索単語1)|(検索単語2)|(検索単語3)|.....
```

この検索方法はあくまで文章中に検索単語1ないし検索単語2があったらマッチするので、なかった場合はスルーされる。
自分の場合、次のように使用している。
使用方法としては次のようにカギ括弧や括弧などを検索対象にしたい場合など。

```
(「)|(」)
```

```
(（)|(）)
```

または次のように複数の単語をまとめてボールドにしたい場合などだ。


```
\「.+?\」|(テンキーの[1-9])|(Tabキー)|(正面視点)|(真上視点)|(右側視点)
```

## 結
カギ括弧などの検索置換えを馬鹿正直にすると大変面倒などで、正規表現で一括変換するのがお勧めだ。
クロスブラウザ対応の日本語ファイルのダウンロード on Spring MVC

日本語を含むマルチバイトで構成されるファイル名のダウンロードを、Spring MVCで実装してみました。ポイントは、ファイル名のURLエンコーディングの要否なのですが、これはブラウザによって扱いが違うのが厄介です。困ったな〜と思ってググっていたら・・・「`filename`」と「`filename*`」を使えばいいよ！という[ブログ](http://www.negimiso.net/blog/2015/06/19/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%80%81%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%A8%E3%81%AE%E6%A0%BC%E9%97%98/)をみつけました。


# 動作検証バージョン

* Spring Boot 1.3.5.RELEASE
* Spring Framework 4.2.6.RELEASE

# Handlerメソッドの実装

細かい説明はしませんが、Handlerメソッドはこんな感じ。

```java
@Autowired
DownloadSupport downloadSupport;

@RequestMapping(path = "/mocks/{id}/file", method = RequestMethod.GET)
public ResponseEntity<Resource> download(@PathVariable int id) throws UnsupportedEncodingException {
    MockResponse mockResponse = service.findOne(id); // ファイル名とダウンロードデータ(BLOBデータ)はDBから取得
    HttpHeaders headers = new HttpHeaders();
    downloadSupport.addContentDisposition(headers, mockResponse.getFileName()); // サポートクラスをみてね！
    return ResponseEntity
            .status(HttpStatus.OK)
            .contentType(MediaType.APPLICATION_OCTET_STREAM)
            .headers(headers)
            .body(new InputStreamResource(mockResponse.getBody()));
}
```

# Supportクラスの実装

Content-Dispositionヘッダを作成するサポートクラスをこんな感じでつくる。「`filename`」にファイル名、「`filename*`」にURLエンコーディング後のファイル名を設定します。こうすることで、クロスブラウザ対応できてしまう（ようです）！！

```java
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.util.UriUtils;

import java.io.UnsupportedEncodingException;
import java.nio.charset.StandardCharsets;

@Component
public class DownloadSupport {

    private static final String CONTENT_DISPOSITION_FORMAT = "attachment; filename=\"%s\"; filename*=UTF-8''%s";

    public void addContentDisposition(HttpHeaders headers, String fileName) throws UnsupportedEncodingException {
        String headerValue = String.format(CONTENT_DISPOSITION_FORMAT,
                fileName, UriUtils.encode(fileName, StandardCharsets.UTF_8.name()));
        headers.add(HttpHeaders.CONTENT_DISPOSITION, headerValue);
    }

}
```

ブログではJava SEの`URLEncoder`を使っていましたが、半角スペースが「`+`」になっちゃったので、Springが提供している`org.springframework.web.util.UriUtils`を使ってエンコーディングしていますが、これが正しいのかはちゃんと調べてないので、悪しからず。。。。 :sweat_smile: 

とりあえず・・・・

* Chrome 51.0.2704.103 (64-bit) on Mac
* Firefox 47.0 on Mac
* Safari 8.0.8 (10600.8.9) on Mac
* IE 11 on Windows 10
* Edge 25 on Window 10

上では、それっぽく動きました。


# まとめ

ブラウザのバージョンによっても対応状況が変わりそうな気はしますが・・・、対応するブラウザだけをサポートすればOKなら、この方法で対応するのがよさげです。

# 参考サイト

* [ダウンロードファイル名、文字化けとの格闘](http://www.negimiso.net/blog/2015/06/19/%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%90%8D%E3%80%81%E6%96%87%E5%AD%97%E5%8C%96%E3%81%91%E3%81%A8%E3%81%AE%E6%A0%BC%E9%97%98/)
* http://tools.ietf.org/html/rfc6266#section-4.3
Luaで { string:byte } が遅い件

※注 タイトルには string:byte とありますが、どちらかというとLua自身の話だと思います。

文字列を内部コードに変換するとき、 `hoge = { string:byte(1,-1) }` という記述をすると文字列を一気に配列にしてくれて便利なのですが、この書き方だと結構遅いことに気づきました。

## 実行環境

```
LuaJIT 2.1.0-beta1
```

## 例

たとえば、文字列を１文字ずつ変換してtableの配列にぶちこむロジックなのですが

- １文字ずつ実直にループしてtable化
- `{ string:byte }` 形式

という２パターンで比較してみました。  
以下の様なスクリプトです。

```lua
-- display time
function time(title, block)
  local st = os.clock()
  block()
  local ed = os.clock()

  print(title .. ": " .. ed-st.. " sec")
end

-- 速い
local function _string2bytearray_fast(data)
  local i = 1
  local t = {}
  for i=1, string.len(data) do
     t[i] = data:byte(i)
  end
  return t
end

-- 遅い
local function _string2bytearray_slow(data)
  return { data:byte(1, -1) }
end

-- 変換する文字列
msg = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'

-- ロジックチェックしとく
assert(_string2bytearray_fast(msg) ~= _string2bytearray_slow(msg), "_string2bytearray_fast != _string2bytearray_slow")



----------------------------------------------------------------------
-- bench 1
time("_string2bytearray_fast", function()
  for i=0, 1000000 do
     local tmp = _string2bytearray_fast(msg)
  end
end)

-- bench 2
time("_string2bytearray_slow", function()
  for i=0, 1000000 do
     local tmp = _string2bytearray_slow(msg)
  end
end)
```

結果は以下のとおりです。

```bash
$ /opt/openresty/luajit/bin/luajit bench.lua
_string2bytearray_fast: 1.3 sec
_string2bytearray_slow: 31.54 sec
```

30倍？ほど遅い計算になります。  

こちら、おそらく `hoge = { (配列返す関数) }` という記述をした時の話なのでしょうか？
コードは詳細に追ってないのですが、どうしてここまで違うのかはちょっと気になりますね。
Ruby on Rails 基本

基本

# generate

rails g scaffold product_namaeeeeeeee_tansu name:string price:integer

## model作成

rails g model モデル名 フィールド:型:(unique|index) 以降必要なだけ

モデル名* 単数形のモデル名  大文字で始めても良い
例: rails g model user uuid:string:unique name:string

## generateしたファイルらを削除するコマンドも存在する

rails destroy model モデル名

#db作成

bundle exec rake db:create #データベース作成

# tableを空にしてテストデータ作成
rake db:migrate:reset      //tableを空に
rake db:seed_fu     //seed_fuを使っている

rake db:migrate:reset db:seed

# ログ

tail -f log/development.log

本

##Mさんおすすめ
- Rails3レシピブック 190の技
- リファクタリング:Rubyエディション
- パーフェクトRuby

view x model

view の条件式（if）に与える時、例えば、過去に参加したことがあるか？
で、
`0 < user.entry`としてしまいがちだが
これはmodel内で定義して、
`user.entry?`
とメソッドで呼びだそう。

こすれば、もしその「過去に参加したことがあるか？」の定義が変わっても
たった一箇所の修正で済む。

model

中間テーブルをcontrollerで結合して渡してる？

    @market = Market.find_by!(number: params[:number])
    @companies = Company.joins(:entries).merge(Entry.where(market: @market)).page(params[:page]).per(20).decorate

afterなど

has_many
has_and_belongs_to_many
     $ rails g migration create_categories_products category_id:integer product_id:integer

route

こんなエラー

AbstractController::ActionNotFound - Could not find devise mapping for path "/user/sign_out".
This may happen for two reasons:

1) You forgot to wrap your route inside the scope block. For example:

  devise_scope :user do
    get "/some/route" => "some_devise_controller"
  end
...

すなわち解決案はこんな感じ

  devise_scope :user do
    get '/users/sign_out' => 'devise/sessions#destroy'
  end
MySQLで異なるDBに存在するテーブルを結合して表示する方法


## 前提

例えばdb_Aというデータベス内に、user_entryテーブルとusersテーブルがあるとします。

### user_entry

|id|user_id|created_at|
|---|---|---|
|1|3|2016-06-07 13:11:53|
|2|3|2016-06-09 12:04:02|
|3|1|2016-06-13 17:41:30|
|4|2|2016-06-13 18:56:00|
|5|3|2016-06-17 11:14:36|


### users

|id|email|name|
|---|---|---|
|1|abc@gmail.com|taro|
|2|def@gmail.com|hanako|
|3|ghi@gmail.com|takashi|
|4|jkl@gmail.com|yumi|
|5|mno@gmail.com|hiroshi|

ここで、user_entryテーブルのuser_idをキーカラムとして、usersテーブルの内容を結合して表示させる場合、

```mysql
select user_entry.id, user_entry.created_at, users.email, users.name 
from user_entry left join users on user_entry.user_id = users.id;
```

とすれば、

|id|created_at|email|name|
|---|---|---|---|
|1|2016-06-07 13:11:53|ghi@gmail.com|takashi|
|2|2016-06-09 12:04:02|ghi@gmail.com|takashi|
|3|2016-06-13 17:41:30|abc@gmail.com|taro|
|4|2016-06-13 18:56:00|def@gmail.com|hanako|
|5|2016-06-17 11:14:36|ghi@gmail.com|takashi|

このように期待どうりの結果が得られると思います。

しかし、

## 本題

もしも上記の例で、usersテーブルが別のデータベース(db_B)に存在する場合はどうでしょうか。具体的には、以下のような構成です。

### db_A -> user_entry

|id|user_id|created_at|
|---|---|---|
|1|3|2016-06-07 13:11:53|
|2|3|2016-06-09 12:04:02|
|3|1|2016-06-13 17:41:30|
|4|2|2016-06-13 18:56:00|
|5|3|2016-06-17 11:14:36|


### db_B -> users

|id|email|name|
|---|---|---|
|1|abc@gmail.com|taro|
|2|def@gmail.com|hanako|
|3|ghi@gmail.com|takashi|
|4|jkl@gmail.com|yumi|
|5|mno@gmail.com|hiroshi|

このように、異なるデータベース間の結合は難しいのかなーと思っていたのですが、案外簡単でした。以下のような形で結合できるようです。

```mysql
select db_A.user_entry.id, db_A.user_entry.created_at, db_B.users.email, db_B.users.name
from db_A.user_entry
left join db_B.users
on db_A.user_entry.user_id = db_B.users.id;
```

ただこれだと非常に見づらいので、以下のようにテーブルに別名を指定するのが良いかと思います。

```mysql
select x.id, x.created_at, y.email, y.name
from db_A.user_entry as x
left join db_B.users as y
on x.user_id = y.id;
```
忘備録 sh 002

`rsh`で相手先のコマンドを非同期で実行しようとしたとき
`rsh`が自ホストに向かうとスティックする問題が発生したのでメモ


どういう状況かというと
デーモンプロセスを起動するためのラッパーシェルとかによく用いられる

```shell-session
#!/bin/sh

/usr/sbin/hogehoge.sh  >/dev/null 2>&1 &

exit 0
```

みたいなシェルを

```
rsh 127.0.0.1 ”/home/hoge/HogeWrapper.sh -start”
```

と打つと刺さる、(別環境だと刺さらないかもだけど)
(ループバックは自ホストという意味で)
`RHEL5.5`とかだと少なくとも刺さる。


`rsh`で起動される可能性のあるラッパーシェル側で

```
/usr/sbin/hogehoge.sh & 1>&- 2>&-
```
としてやるといいらしい

`>/dev/null 2>&1`でも同じかと思いきや
そもそも出力を待ち受けない？（細かいことはよくわかっていない）
ので`rsh`が出力を待って戻ってこないということがなくなる模様

自ホストに`rsh`送らなきゃいいだけなんだけど、
テストとかでどうしても自ホストに`rsh`飛ばす必要がある時には使えるかもしれない。
【Java】XML文字列を気軽に生成するメソッド

XMLのDOM要素を構築し、それを文字列に変換することを気軽に行えるようにする。以下のように書けることが理想。

```java
// インポート宣言
import org.w3c.dom.Document;
import org.w3c.dom.Element;

// ここから処理
Document document = createXMLDocument("book");
Element root = document.getDocumentElement();

// DOM要素の構築
Element info = document.createElement("info");
info.setAttribute("title", "Java入門");
info.setAttribute("author", "shunya");
info.setAttribute("date", "2016/06/27");
info.setAttribute("version", "1.0");
root.appendChild(info);

// XML文字列として標準出力に出力
System.out.println(createXMLString(document));

//=> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
//=> <book>
//=>   <info author="shunya" date="2016/06/27" title="Java入門" version="1.0"/>
//=> </book>
```

`createXMLDocument`メソッドと`createXMLString`メソッドを定義する必要があるので、以下のように定義する。

```java
// インポート宣言
import java.io.StringWriter;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;

// メソッド定義
public Document createXMLDocument(String root) throws ParserConfigurationException {
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = factory.newDocumentBuilder();

    DOMImplementation dom = builder.getDOMImplementation();
    return dom.createDocument("", root, null);
}

// メソッド定義
public String createXMLString(Document document) throws TransformerException {
    StringWriter writer = new StringWriter();
    TransformerFactory factory = TransformerFactory.newInstance(); 
    Transformer transformer = factory.newTransformer(); 

    transformer.setOutputProperty(OutputKeys.INDENT, "yes");
    transformer.setOutputProperty(OutputKeys.METHOD, "xml");
    transformer.setOutputProperty("{http://xml.apache.org/xalan}indent-amount", "2");

    transformer.transform(new DOMSource(document), new StreamResult(writer)); 
    return writer.toString();
}
```

* Eclipseであれば、ビルドパスにJARファイルを追加したり、プラグインを入れたりする必要はない。
* `Transformer#setOutputProperty()`は、出力するXML文字列の細かな設定を行う。`{http://xml.apache.org/xalan}indent-amount`プロパティの値を`2`にすると、インデントが半角空白文字2文字になる。
忘備録 sh 001

二重起動防止したいときにシェルの`ps`コマンドから`grep -v`してPIDを除外しても、うまくいかないことがあるよという話

```sh
ps -ef | grep ${MyProcName} | grep -v ${MyPid}
```
これをやると`ps`のプロセスからフォークした子プロセスが見えることがある
模様。パイプのタイミングによって見えたり見えなかったりする

先に起動している同名のプロセスがあったら終了なんていうものに組み込んだりするとマズイ

なので仕方なく、

```sh
ps -ef >${TmpDir}/${MyPid}
```
みたいな一時ファイルに退避させて

```sh
awk -v pid=${MyPid} -v pname=${MyProcName} '$2 != pid && $8 == pname { print $2}'  ${TmpDir}/${MyPid}
```
のようにしてPid取れたら多重起動、なければ自プロセスだけと判断するようにした方がいい

結局これも`ps`のタイミング云々では多重起動を許してしまうが、それと上は別の問題
個人的にxcodeで便利だと思うショートカットで打線組んだ

個人的によく使うショートカットで打線組みました。
ポジションや打順に深い意味はありません。

⌥=Option、Optと表記
⌘=Command、Cmdと表記

###1(二) Cmd + (0~)
ナビゲータエリアの操作
0だと閉じる
1~だとそれぞれ選択
ノートPCのような画面が小さい場合によく使用

###2(一) Cmd + Opt + (0~)
ユーリティエリアの操作
同じく０だと閉じて、１以降だとそれぞ選択

###3(中) Cmd + Y(shift + y) 
デバッグエリアを閉じる。

###4(捕) Cmd + Ctrl + j
定義されているとこにジャンプする。
Cmd　+ クリックや右クリックの「Jump to Definition」

###5(右) Cmd + t
タブを追加。
Xcodeに限ったコマンドではないのですが、タブを追加します。

###6(遊) Ctrl + i
選択した行のインデント
コピペした時とか使いまくります。

###7(左) Cmd + O(shift + o)
ファイル名から検索して開きます。ファイル数が多い場合は多用します。
githubでいう「t」のショートカット

###8(三) Cmd + l
入力した列数に飛びます。

###9(投) Cmd + r
ビルドしてrunします。
使いまくります。
ビルドのみは「Cmd + b」停止は「Cmd + .」 です

### 投手陣
先発 Cmd + r、Cmd + . 、Cmd + b、 
中継ぎ Ctrl + 6, Cmd + K(shift + k), 
抑え Cmd + u

ayumu838さんのコメントを参考に追記しました！
### 代打
cmd+opt+c　コミット画面に飛びます。

その他、Opt押しながらの単語移動、Cmd + Enter、Opt+Cmd+Enter、Shift+Opt+Cmd+Enterなどの画面切り替えも便利です。

P.S みなさんのレギュラーメンバーも知りたいです。
TensorFlowをRaspberryPIにインストールする手順

# 公式サイト

公式サイトにはラズパイ用のパッケージはありませんでした。

https://www.tensorflow.org

# GitHub

探してみるとラズパイ用のパッケージがありました。

https://github.com/samjabrahams/tensorflow-on-raspberry-pi

# Pythonのインストール

ラズパイの標準OS(Raspbian)には最初からインストールされていましたが、念のためインストール手順を書きます。

```
$ sudo apt-get install python-pip python-dev
```

# ラズパイ用TensorFlowのダウンロードとインストール

以下のコマンドを実行します。

```sh:
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/blob/master/archive/tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl?raw=true
$ mv tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl\?raw\=true tensorflow-0.8.0rc0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-0.8.0-cp27-none-linux_armv7l.whl
```

追記(2017/7/31)
バージョンがあがって、手順が以下のように変更されていました。

```sh:
$ wget https://github.com/samjabrahams/tensorflow-on-raspberry-pi/releases/download/v1.1.0/tensorflow-1.1.0-cp27-none-linux_armv7l.whl?raw=true
$ mv tensorflow-1.1.0-cp27-none-linux_armv7l.whl\?raw\=true tensorflow-1.1.0-cp27-none-linux_armv7l.whl
$ sudo pip install tensorflow-1.1.0-cp27-none-linux_armv7l.whl
```

※ GitHubで説明されている手順と若干変えてあります。

# 動作確認

http://dev.classmethod.jp/machine-learning/tensorflow-hello-world/

上記サイトにサンプルプログラムがあったので、そのまま流用します。

エディタを起動し、ソースをコピペします。

```sh:
$ nano hello-tf.py
```

```py:hello-tf.py
# hello-tf.py
import tensorflow as tf
import multiprocessing as mp
 
core_num = mp.cpu_count()
config = tf.ConfigProto(
    inter_op_parallelism_threads=core_num,
    intra_op_parallelism_threads=core_num )
sess = tf.Session(config=config)
 
hello = tf.constant('hello, tensorflow!')
print sess.run(hello)
 
a = tf.constant(10)
b = tf.constant(32)
print sess.run(a+b)
```

以下のコマンドでプログラムを実行します。

```
$ python hello-tf.py 
hello, tensorflow!
42
$
```

できたっぽい！

詳細については、上記URLをご参照下さい。
さて、これから何しようかな〜(^-^)

# 追記

ついでにiPython notebookでもTensorFlowを試せるようにしてみた。

![スクリーンショット 2016-06-28 0.58.48.png](https://qiita-image-store.s3.amazonaws.com/0/114240/36f06904-7621-c5dd-44fe-d8a5f0b805c9.png)

さて、これから何しようかな〜(^-^)
dockerで一人から始める社内用ナレッジを作ってみたら周りが捗りまくった話

### 追記(2016/10/03)

リリースノート眺めてたらv1.6.0でスライド対応！
勉強会のスライドとかおけるように！
https://github.com/support-project/knowledge/releases

---

## やりたいこと

- Qiitaってすばらしいんだけど、社内のノウハウ蓄積にも使いたい
- [Qiita::Team](https://teams.qiita.com/)使いたいけど、開発人員が多すぎでコスト高＆保守的な会社なので許可がおりない…


## 使ったもの

- [knowledge](https://support-project.org/knowledge_info/index)
- [Docker Toolbox](https://www.docker.com/products/docker)

## 環境

- Windows7 (Corei5 8GBRAM/会社支給品)


## ちゃちゃっと整備

とりあえず自分用に欲しかったので
適当なディレクトリに永続化用のディレクトリを用意して、docker-compose.ymlを作る

```sh
$ mkdir -p ~/docker/knowledge # docker-compose.ymlを置くディレクトリ
$ mkdir -p ~/docker/knowledge/data # 永続化用ディレクトリ（別のディレクトリでもいいです）
$ cd ~/docker/knowledge
$ vi docker-compose.yml
```

先ほど作ったディレクトリに置いておく

```docker-compose.yml
docker-knowledge:
  image: koda/docker-knowledge
  volumes: 
    - C:\Users\hogehoge\Documents\docker\data:/root/.knowledge
  ports:
    - 8080:8080
  restart: always
```

付属の`Docker Quickstart Terminal`を起動して`docker-compose.yml`があるディレクトリで

```sh
$ docker-compose up -d # upで起動して-dでバックグラウンド実行
```


## 社内ネットワーク向けに公開する

1. Virtualbox起動
2. 起動しているdockerマシンを選択して、右クリック→「設定」
3. 「ネットワーク」タブ→アダプタ1→ポートフォワーディング
4. `docker-compose.yml`のportsで指定したポート（左側）を指定
![image](https://qiita-image-store.s3.amazonaws.com/0/109466/787e34b5-0537-440f-5679-2b52629ff55e.png)
5. `http://PC名:ポート番号`で公開される

## データを守るために

永続化ディレクトリを定期的にバックアップするといいかも
自分の環境はPC起動しっぱなしなので、毎日20時に定期的にプライベートリポジトリへ
`git add . && git commit -m 'update' && git push`している

## knowledgeのイカしたところ

- Qiitaっぽい
- OSS
- 今でも開発が活発


## まとめ

dockerで気軽に1人から始められるようになったので、とりあえず試してみよう的な感じになる
社内のノウハウも外部に漏れるのを気にせずQiitaっぽく書けるので◎
新卒や中途、派遣さんからも大変好評
Squid でbasic 認証設定したら Segmentation fault でコケたときのメモ

# 結論からいうと

htpasswdでパスワードファイル作るときに -d で指定すればok

```
htpasswd -d {パスワードファイルパス} {ユーザーID}
```

# 背景

AWSのElasticsearch service を利用しているのですが、AWSのElasticsearch ServiceはVPCエンドポイントをサポートしていない(インターネット経由でアクセスし放題)ため何かしら対策が必要でした。
kibanaも社内の**一部**の人に直接利用してもらいたかったので一捻り必要でした。


# やろうとしたこと

アプリケーションからはIAM認証を利用することで制御できたのですが、kibanaを利用者に使ってもらうにあたりVPC内にproxyサーバーを構築してelastic IP を割当て、Elasticsearch serviceにそのelastic IPからのアクセス許可を追加して対応しようとしました。
Direct Connectを利用しているため、proxyサーバーまでは社内ネットワークでアクセスできるため、basic認証でもまぁ大丈夫だろうというスタンスです。


# どうしてこうなった

ところがいざ設定を仕込んでも認証がうまく行かず、```/var/log/messages```ログ見ると変なエラーが発生していることに気づきました。

```
Jun 27 13:38:19 xxxxx kernel: [271377.799662] ncsa_auth[327]: segfault at 0 ip 00007fed15294a9a sp 00007ffe7411ced8 error 4 in libc-2.17.so[7fed15162000+1b7000]
```

```/usr/lib64/squid/ncsa_auth {passwdパス}``` とかやってncsa_auth を直接実行しても Segmentation fault ってでてました

メッセージでぐぐったら一発ででてきてすっきり解決しました。

http://askubuntu.com/questions/316659/squid3-ncsa-basic-auth-always-fails

htpasswdの標準のハッシュ方式とsquidのハッシュ方式が違うらしいです。
htpasswd実行時に```-d``` フラグ立ててハッシュ方式指定すればOK

ubuntuではないけども、やってることとエラーの内容が同じだったので大変助かりました。

# まとめ

squidの設定が間違っていると思い込み、squid.confとの戦いにだいぶ時間を使ってしまいました。おかげでだいぶ squid.conf になれることが出来ましたw
ログは見てるつもりでしたが、```/var/log/squid/squid.out``` だけ見てたせいで認証処理そのものが失敗していることに気づくのが遅れました。 ```/var/log/messages```も一緒に読みましょう

# 参考サイト

http://askubuntu.com/questions/316659/squid3-ncsa-basic-auth-always-fails
node.js で Material Icons を好きな色に変更する（jimp )

# 概要

[Material Icons](https://design.google.com/icons/) からダウンロードした画像を自分の好きな色に変更します。
node.jsの [Jimp](https://www.npmjs.com/package/jimp) というライブラリを使用します。

[サンプル]
![test.png](https://qiita-image-store.s3.amazonaws.com/0/43328/9f2a5181-74b3-f5bf-09c9-5635bf04bbd5.png) → ![test2.png](https://qiita-image-store.s3.amazonaws.com/0/43328/099d1ae4-f595-c7e4-f8b9-a86d95c667aa.png)


# 手順

## 画像の準備

[Material Icons](https://design.google.com/icons/) からアイコンを選び、「PNG」でダウンロードします。このとき、dark（黒い丸）にチェックがついていることを確認してください。

<img width="832" alt="ss.png" src="https://qiita-image-store.s3.amazonaws.com/0/43328/33040e66-8e01-458c-ae93-2893c67b1ab8.png">

下の例では `web/ic_face_black_24dp_2x.png` を `test.png` という名前で、スクリプトと同じ場所に配置しています。

```
├ app.js
└ test.png
```

## node.jsプログラムの準備

Jimpをインストール

```
npm install --save jimp
```

プログラムを書く
&nbsp;&nbsp;&nbsp;&nbsp;**`srcImage`**: 変換元のパス
&nbsp;&nbsp;&nbsp;&nbsp;**`destImage`**: 出力する画像のパス
&nbsp;&nbsp;&nbsp;&nbsp;**`newColor`**: 変更後の色

```js:app.js
var Jimp = require('jimp');

var srcImage  = './test.png';
var destImage = './test2.png';
var newColor  = '#79b74a';

Jimp.read(srcImage).then(function(image) {

    image.color([
        { apply: 'xor', params: [ newColor ] }
    ])
    .write(destImage);
    
}).catch(function(err) {
    console.error(err);
});

```

## 実行

```
node app.js
```
`destImage`で指定したパスに処理後のファイルができます。

# おわりに

* 実際に使用するときは、ハードコードの部分をコマンドライン引数にするなどすると便利かと思います。
* ほかの種類の画像にも使えますが、背景が透明である必要があります。
LLDBとGDB対比メモ

[こちらのページ「LLDB　使い方まとめ」](http://qiita.com/BugDig/items/0f94fa2b1e74e76d47f1)、とても参考になりました。

自分が普段gdbで使うコマンドがlldbではどうなってるのかをまとめておくと便利そうな予感がしたのでまとめてみます。次にlldbに触るのが何日後かわからないので…。

#相違があるもの

| gdb | lldb | コメント |
|:--|:--|:--|
| `b A::B::func` | `b func`  | ブレークポイント設定（クラス省略可）|
| `b 1` | `br del 1` | ブレークポイントをdelete |
| `dis 1` | `br dis 1` | ブレークポイントをdisable |
| `en 1` | `br en 1` | ブレークポイントをenable |
| `info b` | `br li` | ブレークポイント一覧  |
| `comm 1 ...` | `br com add 1...` | ブレークポイントヒット時の実行コマンド |
| `info th`|`th l`|スレッド一覧|
| `th 1`|`th se 1`|スレッド移動|
| `disas 0x2abbdeadbeef` | `disas -a 0x2abbdeadbeef`|逆アセンブル|

ブレークポイントヒット時のコマンドについて。

```
(gdb) b func
(gdb) comm
> print x
> cont
> end
```

に相当するのが

```
(lldb) b func
(lldb) br com add
> print x
> cont
> DONE
```

#相違がない（っぽい）もの

| コマンド | コメント |
|:--|:--|
| `s` |ステップ実行 |
| `fin` | 関数を抜ける |
| `c` | cont |
| `bt`|バックトレース表示|
|`print x`|変数の中身をプリント|


# gdbにしかない（っぽい）もの

| コマンド | コメント |
|:--|:--|
|`printf "[%d] %08x\n", i, x[i]`|フォーマット付きプリント|
|`shell xxx`|シェルコマンドを実行|

---

新発見があればまた追記／更新したいと思います。
LaravelのfirstOrNewメソッドでMassAssignmentExceptionエラーが発生した時の対応

## 概要
Laravelで、モデルから新しいレコードを生成し保存するメソッドとして、`firstOrNew`メソッドを使用しているのですが、`MassAssignmentException`エラーが発生して使用できないという問題があったので、その時の対応を備忘録として記します。

## firstOrNewメソッドとは

Laravelの公式ドキュメントには以下のように書かれています。
> http://readouble.com/laravel/5/1/ja/eloquent.html#inserting-and-updating-models
> firstOrNewメソッドもfirstOrCreateのように指定された属性にマッチするデータベースのレコードを見つけようとします。しかしモデルが見つからない場合、新しいモデルインスタンスが返されます。firstOrNewが返すモデルはデータベースに保存されていないことに注目です。保存するにはsaveメソッドを呼び出す必要があります。

以下のように指定することで、条件に合うレコードが存在すれば`first()`メソッドで最初の1件を取得し、存在しなければ新しいインスタンスを取得する、というメソッドです。

```php
// 属性のフライトか、存在しなければ新しいインスタンスを取得する…
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
```
## MassAssignmentExceptionエラーの発生

この`firstOrNew()`メソッドを利用している箇所が動作せず、`MassAssignmentException`エラーが発生していました。
ずっと原因がわからなかったのですが、調べてみると、`save()`や`create()`メソッドを使用するときは、モデルに`$fillable`か`$guarded`属性のどちらかを設定しなければいけないようでした。

公式ドキュメントをよく見ると以下のように書いてあります。
> http://readouble.com/laravel/5/1/ja/eloquent.html#inserting-and-updating-models
> 一行だけで新しいモデルを保存するにはcreateメソッドが利用できます。挿入されたモデルインスタンスがメソッドから返されます。しかしこれを利用する前にEloquentモデルを複数代入から保護するために、モデルへfillableかguarded属性のどちらかを設定する必要があります。

`$guarded`には絶対に変更しないカラムを、`$fillable`には変更するかもしれないカラムを設定する必要があります。
以下の記述を対象のモデルに追加することで、`firstOrNew()`を実行することができました :relaxed: 

```php
// 絶対に変更しないカラム
protected $guarded = ['id'];
```
BLE Nano でLED制御 ～BLE Nano と Android 端末で通信する～

# BLE GATT通信

BLE Nano とスマートフォンの間は、GATT プロファイルを使って通信をします。

BLE Nano がペリフェラル側でGATTのサーバーになります。
スマートフォンがセントラル側でGATTのクライアントになります。

手順としては、こんな感じです。

1. BLE Nano 側がアドバタイズを行なう
2. スマートフォン側でアドバタイズをスキャンし接続する
3. Characteristic を使ってデータを読み書きする

BLE GATT に関する情報はこのあたりが参考になるかと思います。
https://www.bluetooth.com/specifications/gatt
http://blue-crystal.squares.net/doc/ble/gatt.html

# BLE Nano のサンプル・コードをコンパイル

[BLE Nano のページ](http://redbearlab.com/blenano/) からリンクをたどって [サンプル・コードのページ](https://developer.mbed.org/teams/Bluetooth-Low-Energy/)に行きます。
そこに [BLE GATTサンプル](https://developer.mbed.org/teams/Bluetooth-Low-Energy/code/BLE_GATT_Example/) へのリンクがあります。
リンクをたどり、「import this program」ボタンを押すと、mbed の Workspace にコードを取り込むことができます。

![Fig3.png](https://qiita-image-store.s3.amazonaws.com/0/129898/3e0d6447-683d-7d16-0be9-f3edf0bc19ea.png)

コンパイルして、バイナリを BLE Nano に書き込みます。
(コンパイル～書き込みの手順は[前の記事](http://qiita.com/maki02/items/b965331129a959588ce7)と同じです)

# Android アプリを準備

スマートフォン側にも BLE GATT 通信をするためのプログラムが必要となります。
ここでは、既製のアプリ(Nordic の [nRF Master Control Panel](https://play.google.com/store/apps/details?id=no.nordicsemi.android.mcp&hl=ja)) を使ってデータ通信の確認をします。

# データ通信を確認

BLE Nano をライターに挿して USB でPCに接続します。
Teraterm などのソフトを使って、COM ポート経由でシリアル接続しておきます。

![teraterm.PNG](https://qiita-image-store.s3.amazonaws.com/0/129898/700e6faf-c2ef-4064-5cce-c2b0c80c939e.png)

こうしておくと、BLE Nano のコンソール出力を見ることができます。

次に、スマートフォン側で、nRF Master Control Panel を立ち上げ、デバイスをスキャンします。
名前が"ChangeMe!!"というデバイスが見つかるので接続します。
接続すると Unknown Service が定義されていることがわかります。
Unknown Service をタップすると、UUID が 0xA001 のRead Characteristics と 0xA002 の Write Characteristic が見つかります。

![Fig2.png](https://qiita-image-store.s3.amazonaws.com/0/129898/f357399e-3268-ed76-fc52-9361009108f6.png)

Write Characteristic の横の ↑ をタップして、00 という値(1 BYTE)を送ると、BLE Nano 上の LED が点灯し、非0の値(1 BYTE)を送ると LED が消灯します。

![P6260011a.JPG](https://qiita-image-store.s3.amazonaws.com/0/129898/ee3b9451-d143-0742-04a6-ed2dda6fbe76.jpeg)

(このLED、裏になるので見にくいんですよね :sweat: )

シリアル接続したターミナル上にも、LED の ON / OFF が次のように出力されます。

![teraterm2.PNG](https://qiita-image-store.s3.amazonaws.com/0/129898/46a0f240-21b4-9ea0-8755-6d230275e3dc.png)

さらに、スマートフォンから 11223344 のようにバイト列を送信すると、送ったバイト列がにターミナルに表示されます。

![teraterm3.PNG](https://qiita-image-store.s3.amazonaws.com/0/129898/2ece3402-7d5c-9ae2-a3fc-a93254cbb789.png)

また、送信したデータは、BLE Nano が Read Characteristic に書き込みます。
スマートフォン側で、Read Characteristic の横の ↓ をタップすると、BLE Nano から受信したデータを見ることができます。

![Screenshot_20160627-230400.png](https://qiita-image-store.s3.amazonaws.com/0/129898/744c2e03-5517-1465-5c13-be80fdd847e3.png)

これで、BLE Nano と Android 間で基本的な通信ができることが確認できました。
次は、GATT通信と NeoPixel の LED 制御を組み合わせていきます。
同じテーブルを複数回Joinしたい場合

以下のように書くことで、
同じテーブルを複数回JOINすることが可能です。

```mysql

SELECT * FROM table
INNER JOIN join_table AS join1
ON table.id = join1.id
INNER JOIN join_table AS join2
ON table.another_id = join2.another_id
```

JOINするテーブルを`AS`を用いて、それぞれユニークなものにしてやればいいわけですね。
AWSのIPアドレスの範囲からCloudFrontの使用しているIPのみを抽出するワンライナー


## はじめに
CloudFrontを経由してELBへアクセスさせる場合、ELBでCloudFrontのIPのみを許可するケースがあると思います。
その場合、確認するページはここです。

http://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-ip-ranges.html
IPアドレスは`ip-ranges.json`というファイル内に記載があるので、ここからCloudFrontに該当するIPを抽出する必要があります。

でも、ファイルを確認するのは面倒だしIPレンジも更新があるそうなのでここはワンライナーの出番です。

## 実行コマンド
```
curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq  '.prefixes[] | select(.service=="CLOUDFRONT") | .ip_prefix'
```

## 実行結果
```
"52.84.0.0/15"
"54.182.0.0/16"
"54.192.0.0/16"
"54.230.0.0/16"
"54.239.128.0/18"
"54.239.192.0/19"
"54.240.128.0/18"
"204.246.164.0/22"
"204.246.168.0/22"
"204.246.174.0/23"
"204.246.176.0/20"
"205.251.192.0/19"
"205.251.249.0/24"
"205.251.250.0/23"
"205.251.252.0/23"
"205.251.254.0/24"
"216.137.32.0/19"
```

## おまけ
### Route53のヘルスチェックが使用するIPアドレスを抽出するワンライナー
### 実行コマンド
```
curl https://ip-ranges.amazonaws.com/ip-ranges.json | jq  '.prefixes[] | select(.service=="ROUTE53_HEALTHCHECKS") | .ip_prefix'
```

### 実行結果
```
"54.183.255.128/26"
"54.228.16.0/26"
"54.232.40.64/26"
"54.241.32.64/26"
"54.243.31.192/26"
"54.244.52.192/26"
"54.245.168.0/26"
"54.248.220.0/26"
"54.250.253.192/26"
"54.251.31.128/26"
"54.252.79.128/26"
"54.252.254.192/26"
"54.255.254.192/26"
"107.23.255.0/26"
"176.34.159.192/26"
"177.71.207.128/26"
```
lwIP デバイスドライバのインターフェイスを読む

lwIPのTCP/IPとネットワークデバイス間インターフェイスについて、いくつかの実装を調査してみました 。

# まとめ
* lwip/src/netif/etherif.c を ネットワークデバイスに合わせて実装する。
* デバイスドライバは4つの関数を実装する。
* low_level_init() 
 * ethernetif_init()から呼ばれる。
 * network deviceのmtu, flagsを設定する。
* low_level_output() 送信用関数。
　* TCP/IPプロトコルスタックから呼ばれる。
　* TCP/IPプロトコルスタックから来たパケットをドライバに送信する。パケットはlinked listになっており、一度に複数のパケットをまとめて送信することができる。
* ethernetif_recv() 受信用関数
 * 受信ポーリングのループorネットワークデバイスの受信割り込みから呼ばれる。
 * 受信したパケット用のpbufを確保して、コピーして、netif->input()でTCP/IPプロトコルスタックへ渡す。
* ethernetif_init() 初期化
 * netif_add()から呼ばれる。
 * netif->outputとnetif->linkoutputを設定する。



githubあるソースコードから下記の実装を調査しました。
# ESP8266 SDK based on FreeRTOS
* third_party/lwip/netif/ethernetif.c
* low_level_init()
* low_level_output()
* ethernetif_input()
* ethernetif_init()

# Realtek Ameba
* component/common/network/lwip/lwip_v1.4.1/port/realtek/freertos/ethernetif.c
* low_level_init()
* low_level_output()
* ethernetif_recv()
* ethernetif_init()

# Marvell wmsdk
* src/platform/net/lwip/netif.c
* low_level_init()
* low_level_output()
* netif_input()
* netif_init()

# Rockchip RKnanoD
## inno
* Web/Lwip/lwip-1.4.1/src/netif/ethernetif_inno.c
* low_level_init()
* low_level_output()
* ethernetif_input()
* ethernetif_init()

## rk903
* Web/Lwip/lwip-1.4.1/src/netif/ethernetif_rk903.c
* low_level_init()
* low_level_output()
* ethernetif_input()
* ethernetif_init()

# Broadcom WICED
* WICED/network/LwIP/WWD/wwd_network.c
* low_level_init()
* low_level_output()
* host_network_process_ethernet_data()
* ethernetif_init()

# 参考
* http://lwip.wikia.com/wiki/Writing_a_device_driver
* http://www.spansion.com/downloads/MCU-AN-510047-J-11.pdf 
* https://gist.github.com/seiyanuta/ae5de234baaad580dac4
UIToolbar を xib 化するときの Tips

`UIToolbar`を xib化することはあまりないかと思いますが、今回自分でやったときにハマった点があったので共有です。

## 問題
`UIToolbar`を使うとき、状況によって配置する`UIBarButtonItem`を変えたいことがあると思います。
`UIToolbar`も`Item`も`Storyboard`で作成した場合は問題ありませんが、xib上で`UIToolbar`と後から使う`Item`を用意するといった条件下では、いざ`Item`の変更をしようとしたとき、`xib`ロード時に表示されていない`Item`は保持されていないため、アクセスできなくなってしまいます。

コードで追加すれば問題ないと思いますが、せっかくxib化しているので、`Item`も`IBOutlet`として扱いたいです。

## 対策
通常`weak`で宣言する`IBOutlet`を`strong`で宣言します。
これで`xib`から`instantiateWithOwner`した段階で、すべてのパーツがロードされ、しかも最初に`UIToolbar`に配置されていない`Item`もアクセスして配置することができるようになります。

パーツは`ViewController`にstrong参照されているわけではないので、`UIToolbar`が不要になった時点で一緒に廃棄されます。

---
以上、`UIToolbar`をxib化するときのTipsでした。
Android (6.0.x?) で強制RTLレイアウトを有効にした時にシステムUIがクラッシュし続けて文鎮と化したときの対処法

# まえがき
Androidの開発者向けオプションの中に，「強制RTLレイアウト」というものがある．
これは右から左へ読む(Right-to-leftでRTL)アラビア系言語などの表示を，そうでない言語でも再現するためのものである．
しかし，私の所持しているGalaxy S6 edgeではこのオプションを有効にしたところ，システムUIがクラッシュし，厄介なことに再起動しようが設定が消えないのでシステムUI起動→クラッシュをし続けるただの文鎮となってしまった．
今回はこの設定を削除する．

# 方法
ADBデバッグが有効である必要がある．
そうでない場合，リカバリーで初期化する以外の解決方法を私は知らない．

Android 4.1.1から，adb shell経由でContentProviderへ直接リクエストを送れるコマンドが存在しているとのことなので，そちらを用いる．
(参考：[ContentProviderをadbから直接実行するcontentコマンド](http://qiita.com/Yuki_312/items/45824214a0ba62ee7a02))

また，RTLなど開発者向けオプションの項目のURIは，content://settings/global とのこと．
(参考：[unset a setting if it breaks your android OS](https://gist.github.com/bgotink/24a6a9f731fcaba26a5a))

なので，この設定を削除するコマンドは以下の通り．

```
adb shell content delete --uri content://settings/global --where "name='debug.force_rtl'"
```

あとは再起動すれば，文鎮ではなくなる．