OmniAICreator/Qiita-1.07M huggingface dataset:
ロミオとジュリエットで学ぶ「ポートが開いてる」と「Listenしている」の違い

Linuxサーバ初心者向けに、「ポートが開いてる」と「Listenしている」の違いをわかりやすく説明してみます。

# まずはこちらをご覧ください

![image](https://teleidoscope360.files.wordpress.com/2013/11/2romeo__juliet_balcony-papjan.jpg)

ロミオとジュリエットが窓越しに会話をしています。
HTTPで例えると、左のロミオがWebブラウザ(HTTPクライアント)、右のジュリエットがApache(HTTPサーバ)です。
ロミオがHTTPリクエストを送るとジュリエットはHTTP レスポンスを返してくれます。

この会話(=通信)が成り立つのは、

* 屋敷の窓が開いていて
* ジュリエットが聞く耳を持っている

ときだけです。
重要なのは、「窓が開いているかどうか」と「ジュリエットが聞く耳をもっているかどうか」は別々のことなのです。

|   |ジュリエットが聞く耳を持っている|ジュリエットが聞く耳を持っていない|
|---|---|---|
|窓が開いている|○|x|
|窓が閉じている|x|x|

○のときだけロミオは会話ができます。

# 「ポートが閉じている」＝ 窓が閉じている

窓が閉じている場合は、ジュリエットがどれだけロミオを待ち構えていても、会話はできません。

技術的に言うと、「ポートを閉じる」とは、パケットを転送しないで捨ててしまうことです。
やり方は何通りかあって、よくつかわれるのは次の２つの方法です。

## ルータ機器によるファイアーウォール機能でポートを閉じる

![image](https://c1.staticflickr.com/3/2034/1647623411_a9c303c879_b.jpg)

城門が閉まっていると、敷地内に入ることすらできません。
ルータ(城門)でポートを閉じると、サーバ(屋敷)にパケット(声)が到達できなくなります。

クラウドの場合は物理的なルータを扱えないことが多いですが、似たような機能がサービスとして用意されてたりります。
例えばAWS EC2の場合は`SecurityGroups`という機能がファイアーウォールの役割を果たしてくれます。

## サーバのパケットフィルタ機能でポートを閉じる

![image](http://cdn.c.photoshelter.com/img-get/I0000loMF23mMRhU/s/620/closed-window-shutters.jpg)

城門(ルータ)が開いていれば屋敷(サーバ)の前まで行くことができますが、部屋の窓が閉じていると、ロミオの声はジュリエットに届きません。

サーバにはパケットフィルタ機能というものがあって、外から入ってくるパケットを遮断することができます。

Linuxではfirewalldとかiptablesという名前で呼ばれている機能で、内部的にはカーネルモジュールとして実装されています。

# 「Listenしている」= なかのひとが聞き耳をたてている

"Listenする"とは、なかのひと（＝プロセス)が聞く準備ができている状態をいいます。

![image](http://s3.freefoto.com/images/14/14/14_14_82_web.jpg)

たとえ窓（ポート)が開いていたとしても、なかのひとが眠っていたり死んでいたりすると、こちらから話かけても会話はできません。

`netstat`や`ss`コマンドでポートのListen状態を調べることができます。これは、「聞き耳を立てているひと(プロセス)がいるかどうか」を調べるときに使います。逆に、`netstat`や`ss`は窓の開閉を調べるのには使えません。


## 窓は複数ある

１つのサーバ(=家)には窓が複数あるのが普通です。
開いている窓と、中のひとが聞き耳をたてる窓は一致している必要があります。
例えば、80番目の窓しか開いてないのに、中の人が間違って8080番目の窓に聞き耳を立てても、会話は成立しません。

## なかの人も複数人いる

ジュリエットが80番目の窓に聞き耳をたてているときに、ジュリエットの妹が22番目窓に聞き耳をたてる、というのは可能です。
webサーバの場合は普通sshdとhttpdの通信を許可しますので、そういう状態になっています。

一方、ジュリエットの妹が、既にジュリエットが張り付いている80番目の窓に聞き耳をたてにいこうとすると、エラーで失敗します。

## １人が複数の窓に同時に聞き耳をたてることはできる

ジュリエットが80番の窓と443番の窓に聞き耳をたてる、ということは可能です。
よくあるのがApacheが80番ポートと443番ポートをListenしているケースです。
【javascript】サクラエディタ用マクロテンプレート（自分用）

さくらエディタで良くつくかうマクロ用テンプレート

簡単に説明すると
最初の3行でオブジェクトを用意して、
Editor.IsTextSelected() でテキストの選択状態を判定して、
lines がエディタの一行区切りのデータを持っているので
それぞれに合わせた処理を記述する。

非選択状態のところのコメントとbreakを外して、
非選択の時は全体に処理を行うようにすると挙動として自然になる、
というか自分の趣味に合う。

```js:base.js
var document = new ActiveXObject('htmlfile');
var window   = document.parentWindow;
var editor   = Editor;


switch(Editor.IsTextSelected()) {
    // 非選択状態
    case 0:
        //editor.SelectAll();
    break;
    // 選択状態
    case 1:
        select = editor.GetSelectedString(0);
        
        var lines = select.split(/\r\n|\r|\n/);
        var n = ['\r\n', '\r', '\n'][editor.GetLineCode()];

        /* ここに素敵な処理を書く*/

    break;
    // ブロック選択状態
    case 2:

    break;
    default:
        /* ignore */
    break;
}
editor.InsText(select);


editor   = null;
window   = null;
document = null;
```

あとはこれをファイルとして保存し、サクラエディタに設定すればいい。
メモリー不足を事前に検知する

#はじめに

`MemoryStream`や`byte`配列で大量のリソースをを確保する場合、貧弱なPC環境では時としてメモリー不足の例外(`OutOfMemoryException`)が発生する事があります。
try～catch()により例外を補足後、データを保護するため保存や操作を続行させたい場合、リソース不足により何も出来なく結果としてプログラムの続行を中断するしかないです。
`MemoryFailPoint`を使用すれば、ある程度余力を持たせてメモリー不足を検知する事が可能です。

#使い方
##初歩的な使い方
使用方法は簡単です。`MemoryFailPoint`のコンストラクターを呼び出すだけです。
引数は、必要な容量を[M]バイトで指定します。

```csharp:MemoryFailPoint.cs
/// 実行前に十分なメモリ リソースがあるかどうかをチェックします。
/// 不足している場合は InsufficientMemoryException 例外を発生
using (new System.Runtime.MemoryFailPoint(sizeInMegabytes))
{
}
```

指定された容量が確保できない場合は、`InsufficientMemoryException`例外を発生します。
この例外は、`OutOfMemoryException`を継承しますので、以下のように大量のリソースを必要とする処理に於いて、 `OutOfMemoryException`をcatchすれば良いです。
すでに `OutOfMemoryException`処理を含めているコードに対しては、超簡単に機能拡張することが可能です。

```csharp:example.cs
try
{
    ... 処理
    var allocSize = 10 * 1024 * 1024;  // 10MB
    using (new System.Runtime.MemoryFailPoint(allocSize / 1024 /1024))
    {
    }
    var bytes = new byte[allocSize];
    ... 処理
}
catch (OutOfMemoryException)
{
    // メモリー不足が発生しましたのメッセージ表示など
}
```
完全なメモリー不足の検知は不可能ですが、例外発生の可能性がある部分へ挿入することにより、救われることが可能と思います。

##本格的な使い方
コンストラクタに指定する容量の計算方法については、その処理で必要な容量を見積もりし、メモリー不足の検知精度を100%に近づけたいのであれば、`MemoryFailPoint`の[コンストラクター :point_right: ](https://msdn.microsoft.com/ja-jp/library/system.runtime.memoryfailpoint.memoryfailpoint.aspx)の解説の説明にあるよう`GC.GetTotalMamory`を利用して事前に調査することも可能です。


#おわりに
`MemoryFailPoint`をGoogle検索してもヒットする件数が少ないですが、.Net の Version 2 の時代から存在しています。
もし、メモリー不足を検知し回避策を提供したいアプリがあるなら、採用してみてはいかがでしょうか。
C# WPF Window,Page,UserControlの違い

意外と説明しているところが無かったので

**WPF Window**
独立して表示可能な存在、PageやUserControlのホストになる存在。

**WPF Page**
ホスト下で表示し、「進む」「戻る」などのナビゲーションアプリケーションでの使用を前提とした使い方。
ホストで使用するにはフレームコントロールを経由して使います。

**WPF UserControl**
コントロールを自作します。これ単体では独立して動作せず、Window内に設置する必要があります。
自作した後、<b>一度プロジェクトをビルドしないと</b>コントロールを設置出来ません。
自作コントロールの使い方は通常コントロールと使用方法は同じです。
コントロールに固有名詞を設定すれば、メインウィンドウからメソッドの呼び出しも可能です。

例：自作コントロールに固有名詞 MyControlを設定

```lang:自作コントロール内部のメソッド
        void DoWork()
        {
        ///自作コントロールに実行させたい挙動
        }
```

メインウィンドウからボタンを押すと、MyControl内の DoWorkメソッドを実行する場合

```lang:メインウィンドウからボタンを押すと、自作コントロール内のメソッドを呼び出す
        private void Button_Click(object sender, RoutedEventArgs e)
        {
         MyControl.DoWork();
        }
```

メインウィンドウとは無関係に、自作コントロール内のボタンを押した場合の挙動は、自作コントロール側に挙動を書き込みます。
これは深いことを考えず、ウィンドウにボタンを設置してその挙動を書く時のコードと同じです。
CLIでブックマークするgookmark

あ～このディレクトリをブックマークしたい
===================================
僕はwindowsでもlinuxでもコンソールを使うことが多く、
社内の共有ファイルサーバーとかにもコンソールで侵入していきます。
そんな時思うのが「**あ～このディレクトリをブックマークしたい**」

Go言語で作ってみた
================
[nocd5/gookmark](https://github.com/nocd5/gookmark)
ざっくりと使い方は

```bash
$ pwd
 -> /foo/bar/hoge/moge
$ gookmark add
$ gookmark add ../..
$ gookmark list
 -> /foo/bar
    /foo/bar/hoge/moge
```
`add`したものを`list`で標準出力に表示するだけです。
front endは**peco**あたりで書いた方がいいな。と思ったのでこうなりました。
どうせディレクトリ移動するにはシェルスクリプト書く必要がありますからね。

nyagos用にpecoを使ったfront end
==============================
```lua:pgm.lua
--------------------------------------------------------
-- gookmark Front End
function nocd5_pgm(args)
  local target = nyagos.eval('gookmark list | peco')
  if target ~= nil then
    if is_dir(target) then
      nyagos.exec('cd "' .. chomp(target) .. '"')
    else
      nyagos.exec('open ' .. target)
    end
  end
end
-- 
function is_dir(f)
  return nyagos.eval('file ' .. f):find(': directory')
end
function chomp(src)
  return string.gsub(src, "[\r\n]+$", "")
end
--------------------------------------------------------
alias{ pgm=nocd5_pgm }
```
選択したものがディレクトリなら`cd`
ディレクトリ以外ならとりあえず`open`(関連付けで開く)しています。

csh, bash
---------
Githubのリポジトリにcshとbash用のサンプルスクリプトも追加しました。
[nocd5/gookmark/examples](https://github.com/nocd5/gookmark/tree/c0f1033858/examples)
参考になれば幸いです。

おわりに
=======
なぜGo言語になったか
------------------
最初に浮かんだのが、
`bookmark add` `bookmark list` `bookmark remove`
こんなサブコマンドを持つコマンドでした。
windowsでは主にnyagosを使ってるのでluaで書くことも考えたのですが、
それだとlinuxで使えないし、サブコマンド持つスクリプト書くのは面倒くさそう。
「そうだ!**cli-init**を使おう!」
ということでGo言語になりました。

ほとんどGo言語は書いたことがないので大変でした
-----------------------------------------
まぁ規模が小さいので、大したことではなくて
自分で書いた関数から返す`error`どうするかなぁとか
errorがあった時、`panic`や`log.Fatal`とか、どれ使うんだろう？とか
(結局すべて`fmt.Fprintln(os.Stderr, err)`にしましたが)
しょうもないことですが。
Clojureでキーボード操作をエミュレートする

Clojureでキーボード操作をエミュレートするには`java.awt.Robot`を使えばできます。
awtbotという`java.awt.Robot`をラップしたライブラリもありますが、基本的な関数しかないのでもっと簡単に使える関数を作ってみます。

```robot.clj
(ns robot.sample
  (:import [java.awt Robot]
           [java.awt.event KeyEvent]
           [javax.swing KeyStroke]))

(defn static-fields [^Class class fields]
  (map #(load-string (str (.getName class) "/" %)) fields))

(defn modifiers->vks [modifiers]
  (->> (map #(when (pos? (bit-and modifiers %1)) %2)
            (static-fields KeyEvent '[SHIFT_DOWN_MASK CTRL_DOWN_MASK ALT_DOWN_MASK ALT_GRAPH_DOWN_MASK META_DOWN_MASK])
            (static-fields KeyEvent '[VK_SHIFT VK_CONTROL VK_ALT VK_ALT_GRAPH VK_META]))
       (filter identity)))

(defn stroke->vks [^String stroke]
  (let [^KeyStroke ks (KeyStroke/getKeyStroke stroke)
        vks (modifiers->vks (.getModifiers ks))]
    (concat vks [(.getKeyCode ks)])))

(def ^:dynamic *sleep-time* 100)
(defn emulate-stroke [^Robot robot ^String stroke]
  (Thread/sleep *sleep-time*)
  (let [vks (stroke->vks stroke)]
    (doseq [vk vks]
      (.keyPress robot vk))
    (doseq [vk (reverse vks)]
      (.keyRelease robot vk))))

(defn emulate-strokes [^Robot robot & strokes]
  (doseq [stroke strokes]
    (emulate-stroke robot stroke)))
```

これを以下のように使います。
キーの文字列は`javax.swing KeyStroke/getKeyStroke`で指定できるものが使えます。

```use_robot.clj
(def bot (Robot.))
(emulate-strokes bot "P" "shift T" "B" "shift A" "TAB")
```

ctrlとshiftを同時押しするキーの場合、環境によってはNumLockが有効だとshiftが有効にならないという問題があるようです。
また、java.awt.ToolkitのsetLockingKeyStateやgetLockingKeyStateでNUM_LOCKの状態の設定と参照ができそうですが、バグっててうまく働かないようです。残念
iOSからxpcを叩けるようにする

普通使わないけど、MacOSX10.10.sdkからxpcヘッダを拝借して叩けるようにする。
iOS 8のExtensionとかStoreKit.frameworkのあれとか、Social.framworkのあれとか、xpcだよね。ああいうのしたい時。

```bash:iPhoneOS_sdk_ln.sh
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/launch.h /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/xpc /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/usr/include
```

```bash:theos_ln.sh
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/xpc /opt/theos/include
sudo ln -s /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk/usr/include/launch.h /opt/theos/include
```
CoreGraphicsでの画像の色変更（単色塗りつぶし）

検索しても、すんなり見つからなかったので一応。

#概要
UIImageViewを用いるなら、tintColorを変えるだけで良いのですが、
UIImageだけならばそうはいきません。

と言っても、やる事はシンプルで、
>画像のレンダリングモードを、テンプレートに指定する。
コンテキストで、塗りつぶし色を指定し、その画像を描画する。

それだけです。

#詳細

```objc
CGRect rect = CGRectMake(0, 0, 24, 24);
UIColor *color = [UIColor yellowColor];
UIImage *baseImage = [UIImage imageNamed:@"hoge"];

// レンダリングモードをテンプレートにした画像を取得
UIImage *image = [baseImage imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];

// コンテキストの開始
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0);

// 塗りつぶし色の指定
[color setFill];
// 描画
[image drawInRect:rect];

// 生成イメージの取得
UIImage *editedImage = UIGraphicsGetImageFromCurrentImageContext();
// コンテキストの終了
UIGraphicsEndImageContext();
```

ボタンアイコンのカラーバリエーションや、押下時のハイライト画像の利用などに。
![スクリーンショット 2015-04-20 14.38.44.png](https://qiita-image-store.s3.amazonaws.com/0/46091/7f18c5d4-d0b5-3bac-cdd5-861adbc9ae3e.png)
[Processing&Java] 数字を順番に足していくやつ…

##問題
　今度もまた数字ゲームだが，学生が別な問題を持ってた。「２人がお互いに最初は両手の指を１本ずつ立てた状態でスタートして，自分がどちらかの手で相手のどちらかの手を指すと，自分のその手の立っている指の数だけ，指された相手の手の指をさらに立てる，ということをお互いに繰り返していき，先に相手のどちらかの手の５本の指をすべて立てた方が勝ち，というゲーム」なのだそうだ。

##とりあえず書いてみる
　学生に，最初の部分だけ例を示してみた。ゲームの進め方は，次のようになるだろう。
1. 自分のターンでは，まずどちらの手を選ぶかを入力
2. 次に，相手のどちらの手を指すかを入力
3. 相手の手の指の本数を再計算する
4. 相手のターン
5. …
　画面表示と相手（コンピュータ）のターンの処理はまだ書いていないが，自分で書いてみてくださいね！
　ここでも，データをどのように表現するかがポイントになってくる。さらにもう一つ，Processingならではの工夫のしどころとして，２つの情報をキーボードで入力する必要があるが，その度にkeyPressed()が呼ばれるため，入力モードを保持してキーが入力されるたびにモードを遷移させるアルゴリズムが必要である。変数の使い方として，値そのものが意味を持つ使い方と，もう一つ今回のように状態を表す使い方とがあるが，前者よりも後者の方が初心者にはわかりづらいようである。

```
int keyIndex = -1;

int you_right = 1;
int you_left = 1;
int cmp_right = 1;
int cmp_left = 1;

int choosednum = 0;

int mode = 0; //0 ... choose my hand, 1 ... choose cmp hand

void setup() {
  size(320, 200);
  noStroke();
  background(0);
}

void draw() { 
  // keep draw() here to continue looping while waiting for keys
}

void keyPressed() {
  if (key != 'r' && key != 'l') {
    // error
    keyIndex = -1;
  } else {
    if(mode == 0)[
      swich(key){
        case 'r':
          choosednum = you_right;
          break;
        case 'l':
          choosednum = you_left;
          break;
        default:
          break;
      }
      mode ++;
    }
    else{
      swich(key){
        case 'r':
          cmp_right += choosednum;
          break;
        case 'l':
          cmp_left += choosednum;
          break;
        default:
          break;
      }
      
      // Computer turn
      
      //
      
      choosednum = 0;
      mode = 0;
    }
  }
}
```
StoryBoardでToolbarにUISegmentedControl を配置する方法

普通に操作するとToolbarに設置することが出来ません。
以下の手順を行うことで設置することが可能です。
##1.ナビゲーションバーへ一度配置する
![segmented1.png](https://qiita-image-store.s3.amazonaws.com/0/37947/53f2a2ee-f7c1-a9d8-2efe-50343e93452f.png "segmented1.png")

##2.追加されたBarButtonItemをToolbarへドラッグ
![segmented2.png](https://qiita-image-store.s3.amazonaws.com/0/37947/197cce0a-2532-bd67-fad4-c6233a2115a6.png "segmented2.png")

一度ナビゲーションバーへ配置してUIBarButtonItemでラップすることがポイントです。
【javascript】ログインID・パスワードを入力するのが面倒くさい（自分用）

何処でも使うとセキュリティ的に問題があるけど
例えばテストなんかで毎回ログイン処理を通らなければならない時
あるいは自分しか使わないパソコン
などで使うと便利だと思う。

１．まずjsで処理を用意する

```js:javascript
javascript:(function(url){
  var loginInfoObj = {
    "(location)":{"(idkey)":"(idval)" ,"(pswordkey)":"(passwordval)"}
  };
  for (var key in loginInfoObj[url]){
    document.forms[0][key].value = loginInfoObj[url][key];
  }
})(location.hostname + location.pathname);
```

(location) = ログインページの(location.hostname + location.pathname)にあたる部分を書く
(idkey) = ログインIDにあたるインプットの名前
(idval) = ログインID
(pswordkey) =パスワードにあたるインプットの名前
(passwordval) =パスワード

大体のログインチェックは2値でやっているけど
要素を増やせばどのフォームにも対応できるはず。

例としてGMail

```js:javascript
javascript:(function(url){
  var loginInfoObj = {
    "accounts.google.com/ServiceLogin":{"Email":"(loginID)" ,"Passwd":"(password)"}
  };
  for (var key in loginInfoObj[url]){
    document.forms[0][key].value = loginInfoObj[url][key];
  }
})(location.hostname + location.pathname);
```

２．ブラウザの機能でブックマークを作成
Firefoxだとブックマークバーを右クリック
↓
新しいブックマーク(B)…
↓
![1.png](https://qiita-image-store.s3.amazonaws.com/0/75797/71367e4f-48ec-8b7c-6716-fbfbd69909e4.png)
ここにさっきのスクリプトを貼り付ける。
↓
スペースやタブは%20に置き換わるけどきにしない。
適当な名前（ログインはどうかと思う・・・）を付けて保存

目的のログイン画面を表示させて、このブックマークを押せば
ログインIDとパスワードを入力させてくれる。
（ちょっと処理を足せばログイン自体も済ませてくれるけど、ブラウザごとに挙動が違う＋テスト用を想定してるのでそこは入れてません。）
emscriptenで変換してCの関数をnode.jsで使うには

# 背景

emscriptenでhtml出力させて、そこで使う分には問題にならないが、
node.jsでjs化したCの関数を呼び出したい時、requireではうまく行かなかった

もっとスマートな方法がいまいち分からずの投稿です。

# とりあえずうごくやり方

```js
var fs = require('fs');
eval(fs.readFileSync('hoge.js'));
// 以降、Moduleが使えるようになる
var hogeFunc = Module.cwrap('hoge', 'number', ['string']);
```

# Link

- [Interacting with code — Emscripten 1.29.12 documentation](http://kripken.github.io/emscripten-site/docs/porting/connecting_cpp_and_javascript/Interacting-with-code.html)

# 関連投稿

- [emscriptenをアップデートする - Qiita](https://qiita.com/kjunichi/items/1ec7d56e86bdaa07446f)

# 関連記事

- [libiconvをemscriptenでjs化し、node.jsで使った](https://abrakatabura.hatenablog.com/entry/2015/04/18/115323)
- [公式のOpenCVでWASM版OpenCV.jsがビルドできたのでnode.jsで動かそうとした件](https://abrakatabura.hatenablog.com/entry/2017/11/29/063247)
Aurelia翻訳ログ (docs.md 4/17 line: 1060 to last)


なんとか最後まで修正が終わりました。まとまったドキュメントの翻訳はこれが初めての経験です。

では、今回の最後の変更点の紹介です。

### カスタムエレメント中で使える固有のデコレータ

以前はメタデータで定義していましたが、デコレータに変わっています。また、いくつか変更されています。使えるデコレーターは、下記の4つです。

* `@syncChildren(...)`
* `@skipContentProcessing`
* `@useView(path)`
* `@noView()`

以前は `.useShadowDOM()` とかあったのですが、無くなっています。`@syncChildren`と `@skipContentProcessing` は新規ですね。

### 変更を終えて

今回章立てが変わったのですが、diffで追えなくて苦労しました。最初に章立てを考えることは大事だなと実感します。

AureliaはDurandalの経験もあってなんだと思いますが、バージョンの割にドキュメントが揃っていて、多くの人が試してフィードバックをgitterに書き込んでいます。
このgithub - gitter - pull request / issues のフィードバックループはかなり効率的に機能しています。見ていて楽しいですね。

Aurelia documentsのpull requestの反映は最大一週間程度かかります。これはAurelia本体のpull requestやissuesの反映が優先なためだと思います。が、必ず反映されるので翻訳ミスなど気楽に反映していただけると嬉しいです。

また、私のpull requestはfork先からやっているので、最新版の日本語ドキュメントがすぐに見たい、という方は、[fork先リポジトリ](https://github.com/bohnen/documentation/blob/update-japanese-docs/Japanese) を見ていただければと思います。

翻訳で時間を取られて実際にget-startedやdocsに書いてあることが本当に動作するのか確認ができていないので、試してみてゆるゆる紹介していくつもりです。
[PostgreSQL] dmpファイルからデータベースを復元するには

# dmpファイルからの復元手順

## データベースを初期化して起動

DATABASE_PATHはデータベースのファイルを格納するディレクトリです

```
$ initdb -E UTF8 -D ${DATABASE_PATH}
$ pg_ctl start -D ${DATABASE_PATH}
```

※既にDBが稼働している時は初期化せず、同じ名前のデータベースがあればdropdbで削除してください

```
$ dropdb -U ${DB_USER} -p ${DB_PORT} ${DB_NAME}
```

## 新しくデータべース作ります

```
$ createdb -U ${DB_USER} -p ${DB_PORT} ${DB_NAME}
```

## dmpファイルからデータベースを復元します
```
$ pg_restore -p ${DB_PORT} -d ${DB_NAME} -U ${DB_USER} db_dumpfile.dmp
```

復元が完了したら、DBの中にデータがあることを確認します
MMDAgentで踊らせて途中で止めてみる2

覚書程度に

音声を同時再生
未だ踊りきった時、途中でやめさせた時どちらも待機状態に戻るようになりました

```
1    131   RECOG_EVENT_STOP|踊って               MODEL_DELETE|menu
131  132   <eps>				RECOG_EVENT_START
132  133   <eps>				SOUND_START|dance|Motion¥hoge¥hoge.mp3
133  134   <eps>				MOTION_ADD|mei|dance|Motion¥hoge¥hoge.vmd
134  135   RECOG_EVENT_STOP|もういいよ		SOUND_STOP|dance
135  141   <eps>				MOTION_DELETE|mei|dance
134  141   SOUND_EVENT_STOP|dance		MOTION_DELETE|mei|dance
141  142   <eps> 			        MODEL_ADD|menu|Accessory¥menu¥menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
142  143   <eps>				MOTION_ADD|mei|base|Motion¥mei_wait¥mei_wait.vmd|FULL|LOOP|OFF
143   2    <eps>                                MOTION_ADD|menu|rotate|Motion¥menu_rotation¥menu_rotation.vmd|FULL|LOOP|OFF
```

HOGE_STOPとHOGE_EVENT_STOPの違いが理解できてなかったみたいです。
次回は曲を選択できるようにしたい。
[Processing&Java] 数字を順番に引いていくやつ…

## 問題
　研究室の学生から，「もとの数から交互に１〜３の数字を順番に引いていって先に０にできた人が勝ちというゲームのプログラムを作りたいんですが…」というお悩み相談を受けた。これに似たルールはいろいろとあるがゲームの名前が思いつかない（苦笑）。それ自体は大したことではないがちょっともどかしい。
　単純なゲームであるが，まだ，Javaのプログラミングを始めたばかりの学生なので，実装は難しいのかなとも思ったが，その難しさの原因としては，
1. ユーザインタフェースの作り込みでつまづいている
2. アルゴリズムの検討でつまづいている
3. データの扱い方でつまいている
などが考えられそうである。
## とにかく書いてみる
　１点目のつまづきは，その学生が最初からNetBeansなどの本格的なIDEを使っていることにも原因がありそうだ。まずは，小学生からでも使えるScratchなどのビジュアルプログラミング言語などでもよいが，JavaであればとProcessingを勧めた。

```
int keyIndex = -1;

int goal = 20;

void setup() {
  size(320, 200);
  noStroke();
  background(0);
}

void draw() { 
  // keep draw() here to continue looping while waiting for keys
}

void keyPressed() {
  if (key < '1' || key > '3') {
    // error
    keyIndex = -1;
  } else {
    keyIndex = key - '0';
  }

  if (keyIndex > -1) {
    int remain = goal - keyIndex;
    int cmpchoose = 0;

    println("you choose = ", keyIndex);
    println("current number = ", remain);
    if (remain == 0) {
      println("YOU WIN!!");
      goal = 30;
      println("PLAY AGAIN!!");
      println("-----");
    } else {
      println("-----");
      if (remain < 3) {
        cmpchoose = (int)random(1, remain);
      } else {
        cmpchoose = (int)random(1, 3);
      }

      println("computer choose = ", cmpchoose);
      remain -= cmpchoose;
      println("current number = ", remain);
      if (remain == 0) {
        println("YOU LOSE!!");
        goal = 30;
        println("PLAY AGAIN!!");
      }
      println("-----");
      goal = remain;
    }
  }
}
```
shell > 前に打ったコマンドを再度実行 > !cat / !ls 

```txt:動作環境
CentOS 6.5
bash
```

!catとすると最後に実行したcatコマンドを、!lsとすると最後に実行したlsコマンドを再実行できるようだ。
[SO](http://stackoverflow.com/questions/5693959/is-there-a-way-to-show-the-output-of-last-command-in-vim])のやり取りの中で記載されていた。

```
$ cat sample.dat
と実行したあと
$ !cat
とすると cat sample.dat と同じ動作になるようだ
```
!lsなど他のコマンドでも同じようだ。

これを利用すると
```
$ ifort func_nanigashi.f func_koremoHoshii.f func_kotiramoHitsuyoudarou.f main.f -lm -lpthread -lNankanoLibrary
```
を実行して、そのあとにshellで色々作業した後、再度コンパイルしたい時
```
$ !ifort
```
一発で済む。


(ctrl+rでifortの過去履歴を探すのとどちらが便利かは今のところわからない)

<hr>
(2015/05/02追記)
http://www.gnu.org/software/bash/manual/bash.html#Event-Designators
> !string
> Refer to the most recent command preceeding the current position in the history list starting with string

上記のリンク先の9.3.1に他の説明もある。
(Thanks to ~kbk).
技術英語 > percent (or %) / percentage > 3.14 percent (%) / the percentage of the population

percent (もしくは%)
と
percentage
を混同する時がある。

http://www.biomedicaleditor.com/word-usage-percent.html
によると
具体的な数値がともなう場合は「percent(%)」を使う、とのこと。具体的な数値がともなわない場合は「percentageを使う」

```txt:例
3.14 percent
3.14 %
The percentage of the population ...
```

```sample.c
#include <stdio.h>

int main(void)
{
    double young_percent;
    double old_percent;
    
    young_percent = 34.15;
    old_percent = 100.0 - young_percent;
    ... 
}
```

変数名に_percentという単位を表す接尾辞をつけるべきか、別の略称を使うべきかは考えものである。
別の略称の場合、規約で決めておかないと後々でわからなくなりそう。
ボタンは<button>で実装しよう

# はじめに

\<div class="button">や\<a class="button">といったように、
ボタンを\<button>以外で実装するのは極力避けよう、という話。

# キーボード操作の問題

## フォーカス
\<button>と違い、\<div>やhref属性のない\<a>には、フォーカスがあたりません。
フォーカスをあてるためには、tabindex属性が必要です。

```html
<div class="button" tabindex="0">
<a class="button" tabindex="0">
```

## ENTERキー/SPACEキーを押した時の処理

\<button>にフォーカスしてENTERキー/SPACEキーを押すと、clickイベントが発火します。
このため、\<button>の場合は、clickイベントハンドラを実装しさえすれば
キーボードでボタンを押すことができます。

\<div>やhref属性のない\<a>の場合、このような気の利いた処理は行われないため、
自分でkeyupイベントハンドラを実装する必要があります。[^1]

```
function handleClick() {
  //ボタンが押された時の処理
}

function handleKeyUp() {
  if (押されたのはENTERキーかSPACEキー?) {
    if (ボタンにフォーカスしている?) {
      //ボタンが押された時の処理
    }
}
```

[^1]: [mozillaのdeveloperサイト](https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/ARIA_Techniques/Using_the_button_role)にも、キーボード操作を自力で実装する必要性が解説されています。


# スクリーンリーダーの問題

スクリーンリーダー(視覚障害者の方などが使う音声読み上げソフト)は、\<button>を、その要素が「ボタン」だとわかるように読み上げます。
例えば、以下の内容をスクリーンリーダー(ここでは[NVDA](http://www.nvda.jp/))で読み上げると、「保存、ボタン」と読み上げられます。

```html
<button>保存</button>
```

\<div>や\<a>で実装した場合、ブラウザは、その要素が「ボタン」であると解釈できないため、
「ボタン」と読み上げません。\<a>に至っては「リンク」と読み上げてしまいます。
「ボタン」と読み上げるようにするには、role="button"をつける必要があります。

```html
<div class="button" tabindex="0" role="button">保存</div>
```

# \<button type="button">を使おう

フォームと連動することを理由に、\<button>を敬遠する人もいます。
\<button>のtype属性には、submitやresetの他に、buttonという属性値が用意されており、
これを指定すると、フォームに対して何もしないボタンを作ることができます。[^2]

[^2]: [HTML5仕様書](http://www.w3.org/TR/html5/forms.html#attr-button-type)にも「Does Nothing」と明記されています。

```html
<button type="button">保存</button>
```

type="button"については「[コーディングWebアクセシビリティ](http://www.amazon.co.jp/dp/4862462669)」という書籍でも
解説されているので、一読されることをおすすめします。

# まとめ

ボタンは\<button>で実装しましょう。
もし\<div>や\<a>で実装する場合、\<button>と同じ動きをさせるには、以下の対応が必要です。

 - tabindex="0"をつける
 - keyupイベントハンドラを実装する
 - role="button"をつける
FlashAirで固定IPを設定する


FlashAirはアドレスを固定にする方法が無く、DHCPの無いネットワークでは使えないらしい。DHCP振り出し時にMACアドレス指定で割り振るしかIPを固定できないので困っているとの話。なんとなくできそうな雰囲気だったので、自分も会社帰りにビックカメラで購入してやってみました。

（追記）当初はLuaでやるしかなかったのですが、その後CONFIGで設定される方法が公開されました。デベロッパーサイトもクローズになり、情報がリンク切れだったので更新しておきました(21/07/27)

# 設定ファイルにて設定する方法

WLANSD/CONFIGに設定を入れます。

```:WLANSD/CONFIG 
DHCP_Enabled=NO
IP_Address=192.168.1.200
Subnet_Mask=255.255.255.0
Default_Gateway=192.168.1.1
Preferred_DNS_Server=8.8.8.8
Alternate_DNS_Server=192.168.1.1
....
```

https://seesaawiki.jp/flashair-dev/d/IP%A5%A2%A5%C9%A5%EC%A5%B9%A4%F2%B8%C7%C4%EA%B2%BD%A4%B9%A4%EB

## その他パラメータ

http://fc.jpn.org/yamada/dokuwiki/doku.php?id=flashair:0100-0110config

# Luaスクリプトを使って頑張ってやる方法

## 注意(追記）15/5/2

DHCP初期化に失敗すると、インターフェースがdisableになってしまうようで、繰り返しセットしたり書き込みタイミングでIPを再設定しようとしてもセットできませんでした。

ということで以下はDHCPでIPを取得後に任意のIPに変更する方法になります。



## できなさそうだけど...

[FlashAirをいじってわかったこと。](https://sites.google.com/site/gpsnmeajp/electricmemo/flashair)

ここに

> ・FlashAirには、隠し(非公開/未公開/内部用)関数が存在する。
　簡単なLuaの知識だけで一覧を閲覧できるので、探すとよい。
　現在のFlashAirに割り当てられたIPアドレス、固定IPアドレスの設定、ゲートウェイのIPアドレス取得、内部APへの接続子機数、ping、WPS機能の開始、時刻設定、ファイルの削除・変更(fsを使わず)、接続状態の取得、SPI通信、無線チャネルの設定、より応用的なHTTP通信などができる、ようだ。

と書いてあるのでできそうと判断。

##関数一覧の取得

とりあえず、隠し関数一覧を探すことに。LuaスクリプトはHashテーブルのようになっているようなので、faの一覧ができれば良さそう。

Luaで一覧を表示するコードを書いてみる。ブラウザーからアクセスするのでHTTPヘッダーを最初に出力しないといけないのに注意。

```list.lua
print("HTTP/1.1 200 OK\n")
for key,val in pairs(fa) do 
  print (key)
end
```

これをブラウザーで表示すれば以下のような結果が表示された。

> ip
Disconnect
SendHTTPMessageByFile
SendHTTPFileByFile
ClrSecretCode
ConnectNum
SetCurrentTime
HTTPGetFile
GetSecretCode
SendHTTPSSLMessageByFile
pio
Connect
SetRmHeader
SetChannel
remove
spi
IBSS
Scan
request
Bridge
WlanLink
StartWPS
ftp
ReadResponse
md5
ping
rename
GetScanInfo
ReadStatusReg
SetSecretCode
getStatus
SendHTTPSSLFileByFile
Establish

ということで、[関数リファレンス](https://flashair-developers.com/ja/documents/api/lua/reference/)にはありませんが、fa.ipコマンドで取得できそうという事が判明

## IP取得

ということで引数無しにfa.ipを呼ぶことでLuaでIPが取得できるようだ。返り値としてip,netmask,gatewayがかえってきているので、以下のように取得する。

```getip.lua
print("HTTP/1.1 200 OK\n")
myip,netmask,gateway = fa.ip()
print(string.format("IP:%s,NETMASK:%s,GW:%s",myip,netmask,gateway))
```

> IP:192.168.1.117,NETMASK:255.255.255.0,GW:192.168.1.1

## IP固定

ということはfa.ip()で値をセットすればOK。以下のようにすると設定できた。

```setip.lua
print("HTTP/1.1 200 OK\n")
myip,netmask,gateway = fa.ip()
myip = "192.168.1.222"
fa.ip(myip,netmask,gateway)
print("OK!")
```
セットした直後にIPが変更されるので、最後のOKは表示されない。

## 起動時のIP固定化

という事で初期化時にスクリプトを実行するように設定！

```SD_WLAN/CONFIG
LUA_RUN_SCRIPT=/setip.lua
```

やってみると最初のIP固定スクリプトではうまくいきません。調べてみると起動スクリプトは電源ONの５秒後に実行されるようですが、DHCPでのIP取得にはそれ以上かかっているので反映されない模様。

ということで初期化するスクリプトに使うにはsetip.luaにwaitをいれてみるとうまくいきました。手元環境では次のように１０秒程ウエイトを入れると初期化できるようになりましたとさ（最小値は特に探していません）


```
sleep(10000)
```

##ポイント

+ DHCPの無い環境下では固定できない（追記）
+ Luaスクリプトなので第三世代限定かと
+ 非公式APIなので無くなっても泣かない
+ IPはスクリプト直書きではなくip.txt等ファイルに入れたほうが良さそう

##参考
* [FlashAir Develppers](https://flashair-developers.com/ja/documents/api/lua/)
* [FlashAirをいじってわかったこと。](https://sites.google.com/site/gpsnmeajp/electricmemo/flashair])
Raspberry Pi 2のCPU温度と消費電流を測定した

Raspberry Pi 2のCPU温度と消費電流を測定してみました。結果は下記の通りです。

|           | CPU温度 | 消費電流 | 消費電力 |
|-----------|--------:|--------:|--------:|
| shutdown時 | - ℃ | 0.07A | 0.35W
| アイドル時   | 35℃ | 0.24A | 1.2W |
| 1コアCPU利用率100%  | 40℃ | 0.30A | 1.5W |
| 4コアCPU利用率100%  | 58℃ | 0.46A | 2.3W |

この測定は朝7時から9時頃に行ったので、温度はブレがあると思います。とはいえ、これなら夏場でもファンやヒートシンクは不要な気がしますね。

# 測定条件

* 室温：約20℃
* モデル：Raspberry Pi 2 Model B
* ケース：Pibow Coupé（密閉型）
* OS：Raspbian
* 有線LAN接続
* USB機器、HDMIディスプレイ、カメラモジュールその他接続なし
* CPU温度は`/opt/vc/bin/vcgencmd measure_temp`で測定
* 消費電流はUSB電流計で測定
* `openssl speed`でCPU負荷をかけた

# 参考データ

我が家の古いミドルタワー型PC（Core i7-920 2.66GHz）の消費電力はアイドル時120W、全8コアに負荷をかけた状態で230Wでした。常時起動しておくことを考えると99%の省エネということになります。ステキですね。
ItamaeでGitのプライベートリポジトリをcloneする


Itamaeには、Git resourceがあるんだけど、プライベートリポジトリの認証はオプションになかった。
今回、プライベートリポジトリをcloneしたかったので、実現した方法を2つ。
実現できたんだけど、いまいちベストプラクティスが分からない…。

なお、どちらの方法もVagrantで起動したVMに対して実行する前提。

## cloneするURLに認証情報を埋め込む方法
さすがに、レシピ自体に認証情報を埋めたくなかったので、node.jsonに書くようにした。
ユーザ名でメールアドレスを使う場合は、エスケープしなきゃかも。

```recipe.rb
homeDir = "/home/vagrant"
fugaDir = "#{homeDir}/fugaScope"
githubUser = node["git-env"]["user"]
githubPassword = node["git-env"]["password"]

git fugaDir  do
	repository "https://#{githubUser}:#{githubPassword}@github.com/hoge/fuga.git"
	user "vagrant"
	not_if "test -d #{fugaDir}"
end
```

```node.json
{
	"git-env": {
		"user": "hoge",
		"password": "hogehoge"
	},
}
```

実行は以下の通り。

```bash
$ itamae ssh --vagrant -h vagrant --node-json node.json recipe.rb
```

## git-credentialsを使う方法
.netrcじゃなくて、git-credentialsを使うんだ！というのをどこかで見かけたのでやってみた。
node.jsonと実行方法は一緒。

```recipe.rb
homeDir = "/home/vagrant"
fugaDir = "#{homeDir}/fugaScope"
githubUser = node["git-env"]["user"]
githubPassword = node["git-env"]["password"]
credentialUrl = "https://#{githubUser}:#{githubPassword}@github.com"

execute "GitHub auth setting" do
	command "git config --global credential.helper store;
		echo '#{credentialUrl}' >> .git-credentials
	"
	user "vagrant"
	not_if "grep '#{credentialUrl}' #{homeDir}/.git-credentials"
end

git fugaDir  do
	repository "https://github.com/hoge/fuga.git"
	user "vagrant"
	not_if "test -d #{fugaDir}"
end
```
Hash.newのクールな初期化方法/Cool Way to initialize your Hash in Ruby


```hash.rb
h = Hash.new{ |h,k| h[k] = "fuga: #{k}" }
h["c"]
p h
```

何が返ってくると思いますか？
What do you think will return?

`{"c" => "fuga: c"}`

なんです。
Above is what you will get.

クールですね！
Isn't it cool?

下記のように、パラメータを伴ったメソッド呼び出しを[メモ化](http://qiita.com/kk_Ataka/items/6bbc26159d2efdf6fbb9) したいときに使えるそうです！
You could use this to memoize your function which takes a paramter.

```memoization.rb
def top_cities(order_by)
  @top_cities ||= Hash.new do |h, key|
    h[key] = where(top_city: true).order(key).to_a
  end
  @top_cities[order_by]
end
```

出典/Originally written in
http://www.justinweiss.com/blog/2014/07/28/4-simple-memoization-patterns-in-ruby-and-one-gem/
通った経路を可視化する機械学習的なもの on Canvas

![eeeer.gif](https://qiita-image-store.s3.amazonaws.com/0/57193/db161236-90a5-0290-4aaa-0c3310eb5172.gif)


##動機
帰り道、pasmoを使っていて思ったこと。「カードとお札を同時に入れたら大体チャージするんだからチャージ画面に遷移してほしい」と。んで、こういう経路から行く確率が色合いになって見えるcanvasを作ってみようと思いました。機械学習の練習的な意味もありつつ。今回は生のCanvasを使いました。


##動かし方
キーボードの右左を押すと動きます。
通った経路を学習して濃度を記憶していきます。
濃さが100になったところのみ記録しておけば、何かができる感じ。
これだけじゃ、抽象的ですが。。

##意味
よく通る経路を学習していこうっていう方向性です。
機械学習はまだ全然分からないので我流です。JSで何かできないか知りたいですね。

##コードが変
殴り書きなので、変というか雑ですね・・

##全体のイメージ
まずピラミッド状を描きます。pyramidingとmakeAnalizerって関数が対になってるのですが、pyramidingは入れ子でループしてます。makeAnalizerも同じく入れ子でループしてますが、こいつはピラミッド探索用のやつ。
someProcessは一応クラスで、この図だとひとつの円です。応用編ではひとつのプロセスを指すようになるはずです、たとえばSuicaとお札を同時に入れた時、とか。

##コード
jsdoit : http://jsdo.it/hp0me_/eiCT

```html:practice.html

<script>

var canvas;
var ctx;
var pyramid = [];
var analyzer = [];
var cnt = 0;
var cntForAnalyzer = 0;
var currentPos = [];

function setup(){
  canvas = document.getElementById('MyCanvas');
  if ( ! canvas || ! canvas.getContext ) { return false; }
  ctx = canvas.getContext('2d');

  makeAnalizer(10);

  //x,y,加点グラデーション
  process(1,0,10);

}


function process(x,y,graduation){

  ctx.clearRect ( 0 , 0 , canvas.width, canvas.height );

  currentPos = [x,y];
  if(currentPos[0] > 8){
    currentPos = [1,0];
    analyzer[1][0]+=10;
  }

  //analyzer = [];
  //pyramid = [];
  analyzer[x][y] += graduation;
  cnt=0;
  pyramiding(10);
}


var pyramiding = function(max){

  if(cnt==10)return;
  pyramid[cnt] = [];

  for(var i =0;i<cnt;i++){
    var graduation;

    graduation = analyzer[cnt][i];
    if(graduation<1)graduation = 1;

    pyramid[cnt][i] = new someProcess(i * 30 + 180 -cnt*14,cnt * 30,graduation);
  }

  cnt++;
  pyramiding(cnt);

};



var makeAnalizer = function(max){

  if(cntForAnalyzer==10)return;

  analyzer[cntForAnalyzer] = [];

  for(var i =0;i<cntForAnalyzer;i++){
    analyzer[cntForAnalyzer][i] = 0;
  }

  cntForAnalyzer++;
  makeAnalizer(cntForAnalyzer);

}


var someProcess = function(x,y,graduation){

  if(graduation > 100)graduation=100;
  this.graduation = graduation;

  ctx.beginPath();
  ctx.arc(x, y, 10, 0, Math.PI*2, false);
  ctx.globalAlpha = this.graduation / 100;
  ctx.fill();
}


document.onkeydown = function (e){

  //右
  if(e.which == 39){
    //x,y,加点グラデーション
    process(currentPos[0]+1,currentPos[1]+1,5);
  }

  //左
  else if(e.which == 37){
    //x,y,加点グラデーション
    process(currentPos[0]+1,currentPos[1],5);
  }
};


</script><html><head><meta charset="utf-8"><style type="text/css">canvas { background:#fff;}</style></head><body onload="setup();"><p id="info"></p><canvas id="MyCanvas" width="500" height="500"></canvas></body></html>

```
SVG bookmark

SVG bookmark
==========

■ SVGスプライト
----------

アイコン画像をSVGスプライトにしたい話 - Qiita
: http://qiita.com/takana8/items/2dc26454e9eb2d692d37

SVGスプライトをつくってみよう1 | Design Report – デザインレポート
: http://glitter-style.jp/labo/web-resource/make-svg-sprites/

アイコンフォントからSVGへ！より手軽にベクター画像を表示しよう | Webクリエイターボックス
: http://www.webcreatorbox.com/tech/svg-vector/
MongoDBの基本コマンド - MySQLとの対応

初めてMongoを触ったので備忘録的に。
自分が使ったものを随時足していく予定です。
便利なものあれば教えてくださいませ。

## データベースの操作
### データベース一覧取得 (SHOW DATABASES)

```
show dbs
```

### データベース削除（DROP DATABASE データベース名）

```
use データベース名
db.dropDatabase()
```

## テーブルの操作
Mongoではtableではなく、collectionといいます。

### テーブル一覧取得（SHOW TABLES）

```
show collections
```

### テーブル削除 （DROP TABLE テーブル名）

```
db.コレクション名.drop()
```

## レコードの操作
### レコード取得（SELECT * from テーブル名 WHERE カラム名 = 値）
Mongoではrecordではなくdocument, columnではなくfieldとよびます。

```
db.コレクション名.find({フィールド名: 値})
it # 20件ごとしか表示されないので、次へ
```

### レコード取得（SELECT * from テーブル名 WHERE カラム名 like "%値%"）
Mongoではrecordではなくdocument, columnではなくfieldとよびます。

```
db.コレクション名.find({フィールド名: /値/})
```

### レコード挿入（INSERT INTO テーブル名(カラム1, ...) VALUES （値1, ...））
スキーマがないので、なんでも入っちゃいます

```
db.コレクション名.insert({フィールド1: 値1, フィールド2: 値2, ...})
```

### レコードの削除(DELETE テーブル名 WHERE カラム名 = 値)
```
db.コレクション名.remove({フィールド名: 値})
```


### クエリの調査(EXPLAIN SELECT ...)
```
db.コレクション名.find().explain()
```

##その他


その他の基本操作は、tutorialが提供されているので、そちらをどうぞ
http://docs.mongodb.org/manual/applications/crud/
hubot-slack3.xがいつの間にかプライベートチャンネル対応してたので設定メモ

久々にheroku上にいるhubotをデプロイしたら
botが動かなくなってしまったので色々調べてたら
slack <-> hubot 連携がバージョンアップしてたらしい。
そしてプライベートチャンネルでも普通にhubotが動くようになってた。

さらに、世に出ている``SlackとHubotの設定記事`` のようなものも
古いバージョンの設定が多いので
最新版という位置づけでここにメモしておく。
（2015/4/15時点）

<br>

## 手順まとめ

- Slack上の Hubot Integration を新バージョンにする
- hubot-slackを3.xにアップグレードする
- Herokuの環境変数を設定し直す
- hubotインテグレーションしたいチャンネルにhubotユーザをinviteする

<br>

## Slack上の Hubot Integration を作り直す
[ここから](https://my.slack.com/services/new/hubot)Hubotインテグレーションの新規追加を行います（新バージョン用のフォームになっています）。
ちなみに、ここで入力する ``Customize Name`` がbotnameになるようです。

## hubot-slack を3.xにアップデートする
以下、基本的には [hubot-slackのREADME](https://github.com/slackhq/hubot-slack#upgrading-from-earlier-versions-of-hubot)に載っている手順です。

### package.json のhubot-slackをアップデート
以下のコマンドでpackage.jsonを作り直します。
既にpackage.jsonにhubot-slackが記述されている場合、
最新版に置き換えたいので行を削除してから実行しましょう。

```
npm install hubot-slack --save
```

### 環境変数削除＞再設定
まず、旧バージョンを利用していた場合のみですが
古い環境変数(HUBOT_SLACK_*)を削除しておきます。

```
heroku config:unset HUBOT_SLACK_TOKEN
heroku config:unset HUBOT_SLACK_TEAM
heroku config:unset HUBOT_SLACK_BOTNAME
```

その後、新バージョンの画面で表示されている HUBOT_SLACK_TOKEN を再登録します。
新バージョンでは ``HUBOT_SLACK_TOKEN`` のみ設定すれば良いようです。

```
heroku config:set HUBOT_SLACK_TOKEN=xxxxxxxxxxxxx
```

### デプロイ
package.jsonを更新しているのでデプロイします。

```
git push heroku master
```

アップグレード手順は以上です。
問題なく動作しているようであれば、
Slack上に残っている古いhubot設定を削除してしまいましょう。

<br>

## Hubotインテグレーションしたいチャンネルにhubotユーザをinviteする
前バージョンでは勝手にhubotインテグレーションが始まりましたが、
新バージョンでは **hubotユーザをinviteする方式** に変更されているようです。
この変更により、プライベートチャンネルでもhubotが動くようになっています。

![スクリーンショット 2015-04-15 1.58.15.png](https://qiita-image-store.s3.amazonaws.com/0/9099/7ea2413e-36c7-8124-65dc-87101f197840.png)
ActiveSupport::Logger.broadcast を使って Bugsnag.notify した時の小話

サンプルがてら gem にしてみたのが以下。

- [koshigoe/rails_error_logger](https://github.com/koshigoe/rails_error_logger)

以下、小話。

## ActiveSupport::Logger.broadcast

`Rails.logger.extend ActiveSupport::Logger.broadcast` を使う事で、複数のロガーに出力できる様になる。

```ruby
error_logger = ActiveSupport::Logger.new(STDOUT)
error_logger.level = Logger::ERROR
Rails.logger.extend ActiveSupport::Logger.broadcast(error_logger)
```

上記の様にセットアップすることで、 `Rails.logger.error` した時に通常のログと追加したエラーログに対して出力される様になる。

## 罠

`ActiveSupport::Logger.broadcast` は、以下の様にロガーの各メソッドを親に伝播させる働きをするモジュールを作る。そして、このモジュールを `Rails.logger.extend` してロガーを拡張していく形になる。

```ruby
def self.broadcast(logger) # :nodoc:
  Module.new do
    ...
    define_method(:level=) do |level|
      logger.level = level
      super(level)
    end
```

代入系メソッドがやっかいで、自分と親にたいして同じ値を代入する実装になっている。全てのロガーで同じレベルやフォーマッタを使っている場合は問題ないが、そうでない場合に問題になるかもしれない。
ロガーごとにレベルやフォーマッタを切り替えている場合、 `Rails.logger.extend` した後に `Rails.logger.level = ` などとしてしまうと、それまで extend しているロガー全てが同じレベルに設定されてしまう。

### quiet_assets

quiet_assets gem を使って、RAILS_ENV development では /assets/ のログを出力しない、という事を良くやる。
quiet_assets は Rails.logger.level= を呼び出すため、broadcast との相性がすこぶる悪いので注意が必要。

### ActiveSupport::Logger#silence

`LoggerSilence` (`ActiveSupport::Logger#silence`) とも相性悪そうに見える。

```ruby
def silence(temporary_level = Logger::ERROR)
  if silencer
    begin
      old_logger_level, self.level = level, temporary_level
      yield self
    ensure
      self.level = old_logger_level
    end
  else
    yield self
  end
end
```

レベルの異なるロガーを束ねる際は、 `ActiveSupport::Logger#broadcast` は使わない方が良い、というかそういう使い方を想定されていない、のかな？

## Bugsnag.notify とバックトレース

Bugsnag.notify は Bugsnag にエラー情報を送信できるメソッド。例外オブジェクトのバックトレースや caller を読み取って一緒に送る事もしてくれる。

- [bugsnag/bugsnag-ruby](https://github.com/bugsnag/bugsnag-ruby)

`logger.error` が呼ばれたときに `Bugsnag.notify` が呼ばれる様な独自 Logger を実装する場合、バックトレースの先頭が Logger 実装の `Bugsnag.notify` 呼び出し行になってしまってうれしくない。

ここで、bugsnag-ruby の実装を眺めてみると、バックトレースのファイルパスが `lib/bugsnag` と該当する行を読み飛ばしてくれる様になっている。

- [bugsnag-ruby/notification.rb at master · bugsnag/bugsnag-ruby](https://github.com/bugsnag/bugsnag-ruby/blob/master/lib/bugsnag/notification.rb#L372)

という事で、そういう階層構造に強引にしてしまうことでそれなりに読みやすいエラー情報にする事ができた。

※ Bugsng.notify に渡す例外オブジェクトの作り方で制御できそうな気はするけど、力不足でそこまで調べられていない。
文字列中に（曖昧な）ワードが含まれているか調べる

ふと、「ハリー・ポッターとアズカバンの囚人」って文字があるとして、「ハリーポッター」（ナカグロなし）が含まれてるかどうかって、PHPでどうやるんだ？
という疑問が湧いたので作ってみた。

```php
function str_in_str($source = NULL, $keyword = NULL, $encoding = NULL) {
	static $splitted = array();

	if (empty($source) || empty($keyword)) {
		return FALSE;
	}

	if (empty($encoding)) {
		$encoding = mb_internal_encoding();
	}

	if (empty($splitted[$keyword])) {
		// キーワードを1文字ずつ分解
		$split = array();
		$len = mb_strlen($keyword, $encoding);
		for ($i = 0; $i < $len; $i++) {
			$split[] = mb_substr($keyword, $i, 1, $encoding);
		}

		$splitted[$keyword] = $split;
	} else {
		$split = $splitted[$keyword];
		$len = count($split);
	}


	// 含まれている数がキーワードの文字数より少なければFALSE
	if (preg_match_all('/('.implode('|', $split).')/u', $source) < $len) {
		return FALSE;
	}

	// 一文字ずつ調べてヒットするたびに文字を削っていく。
	$copy = $source;
	$count = 0;
	foreach($split as $val) {
		$pos = mb_strpos($copy, $val, 0, $encoding);
		if (false !== $pos) {
			$copy = mb_substr($copy, $pos, NULL, $encoding);
			++$count;
		}
	}

	// ヒット数がキーワード文字数以上ならTRUE
	return ($count >= $len);
}
```

以下のような結果が出た。

```php
$word = 'ハリーポッター'; // これが含まれるか調べたい

str_in_str('ハリー・ポッターとアズカバンの囚人', $word); // TRUE

str_in_str('はりもぐハーリー', $word); // FALSE

str_in_str('ポリー・ハッターと謎のプリン', $word); // FALSE

str_in_str('ハリーポのツイッター', $word); // TRUE ヒットしてしまう・・・
```

結果、辞書でもない限り確実なのは無理なので、どうでもいいプロジェクト向け。
MMDAgentで踊らせて途中で止めてみる

やってみてできたことを書いているだけ

MMDAgentで踊らせるのはなんとなくできたけど、
「やめて」とか「もういいよ」で終わらせられなかったので一年ぶりに再チャレンジ

```
1    131   RECOG_EVENT_STOP|踊って               MODEL_DELETE|menu
131  132   <eps>				RECOG_EVENT_START
132  133   <eps>				MOTION_ADD|mei|dance|Motion¥sumple¥sumple.vmd|FULL|ONCE
133  138   SYNTH_EVENT_STOP|mei                 <eps>             
138  139   <eps>                                MODEL_ADD|menu|Accessory¥menu¥menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
140   2    <eps>                                MOTION_ADD|menu|rotate|Motion¥menu_rotation¥menu_rotation.vmd|FULL|LOOP|OFF
133  134   RECOG_EVENT_STOP|もういいよ		SYNTH_EVENT_STOP|mei
134  135   <eps>				MOTION_DELETE|mei|dance
135  136   <eps> 			        MODEL_ADD|menu|Accessory¥menu¥menu.pmd|0.0,-4.5,0.0|0.0,0.0,0.0|OFF|mei
136  137   <eps>				MOTION_CHANGE|mei|base|Motion¥mei_wait¥mei_wait.vmd|FULL|LOOP|OFF
137   2    <eps>                                MOTION_ADD|menu|rotate|Motion¥menu_rotation¥menu_rotation.vmd|FULL|LOOP|OFF

```

これだと踊りきった場合がうまくいかない
Aura for PHP 雑感 (と PHPフレームワークについて徒然)

誰かさんみたいに、●●雑感、という記事を書いてみたかっただけ、というのもあります。

まず Aura について知らない人が居たら、とりあえずこのあたりを参考に:

* [PHPフレームワーク「Aura v2」がクリーン過ぎるので試してみる](http://blog.a-way-out.net/blog/2014/02/05/try-aura-v2-web-project/)

で、とりあえずこの記事では、Aura の使い方を説明するとかではなくて、それを取り巻く全体的なナニカについて徒然と書いてみようかと思います。

トピック的にはこんなかんじ:

* 良質で軽量・クリーンなコンポネント群
* Framework of Framework


## 良質で軽量・クリーンなコンポネント群

Aura がなにか、と言われたら多分フレームワークではなくコンポネント群である、という感じ。

Aura.Di (Dependency Injection) があり、Aura.Router (URL 解析とアクションの確定) があり、Aura.Dispatcher (アプリケーション実行) があり、Aura.Web (HTTP Request, Response 関連) などがあり、アプリケーション構築に必要なコンポネントが揃っている。

あれ、この感じどこかで、と思った方は多分思い出していると思うけど、そうそう、Symfony2 の [Symfony Components](http://symfony.com/components)。

Symfony と Aura を比較して、簡単に例えるなら、ガチムチ Symfony と 細マッチョ Aura、という雰囲気。(適当)
Aura のコードは全体を割りとサクっと読める。

おそらく、Aura のことを (これまで他にあったような) Web Application Framework だと思って挑むと、いったいどのように使ったら良いのか、何から始めたら良いのかわからないと思う。一応チュートリアルはあるものの。


ちなみに、[Aura の Web Site](http://auraphp.com/) には、それ全体のことを「フレームワーク」とはどこでも言っていない Aura は **High-quality tools for high-quality applications.** であり、それ以下でも以上でもない。
メニューバーに Framework とあるけど、実はそこがミソで、おそらく、巷でイメージされるフレームワークという用語において、ここにおいてあるのは、 `Aura.Framework_Project` や `Aura.Web_Project` などのいわゆる **フレームワーク** っぽいものがあるが、これは簡単に言えば Aura のコンポネントを利用した Web Application  Framework のサンプル実装 だと思うと理解が早い。(CLI Frameworkもある)
Aura はフレームワークありきで存在しているのではなく、コンポネントが集まっていて、それを利用した Web Application Framework のサンプル実装もソコにおいてあるよ、という感じ。


## Framework of Framework

で、 @koriym さんの BEAR とかもそうなんだけど、最近でいうと、Symfony Component を利用した Laravel とかのように、

* 良質なコンポネント群を提供する OSS プロジェクト
* それを利用した Web Application Framework を提供する OSS プロジェクト

という感じに、2つの大きな流れがあるのかな、と。

Perl とかって CPAN のパッケージを組み合わせて Web Application Framework を作ったりしてるイメージなんだけど(最近の状況しらないけど。スイマセン)、最近PHPもそうなってきてるんじゃないかな、と。 
PHP でこれまでなぜそれが起こってなかったか、あるいは今更になってなぜこういう流れになってきたのかを考えると、いくつかの要因を思いつくのだけど、

* PHPは元々言語そのものが、HTTP からのディスパッチとか、パラメーターのやりとりとかをしてくれていたからあまり必要性がなかった
* PHP 5.3 以降の言語仕様自体の進化によって再利用可能なライブラリを作りやすくなった
* PSR-0, PSR-4 ([PHP-FIG](http://www.php-fig.org/)) と composer の台頭

あたりかなと。

第二次PHPフレームワーク大戦争 (symfony1 や CakePHP1 やそれこそ Ethna とかなんとかの時代) の時期に起こった、みんな同じようなコードをたくさんの人がたくさんのフレームワークで再実装している状況が少しなくなって、良い時代になってきた。あれ、何気 PHP-FIG (PHP Framework Interop Group) の狙った通りになってきてるのでは？

まぁもともと(多分)同じような考え方で Zend Framework は存在していたわけだけど、ちょっと時代が早かったのかもしれない。PHP本体の言語仕様の成長や取り巻く環境に合わせて、ライブラリやコミュニティが変化してきた、という感じかな。


ただし、それでいうと、今 Laravel 以外の大きな勢力が無い。CakePHP User や CodeIgniter User たちが割りと Laravel に集結してきてて、コンポネント時代は今のところ Symfony コンポネントとそれを利用した Laravel に軍配が上がっている(個人的な見え方)。
あ、もちろん勝ち負けとかではないけどね。

![image](https://qiita-image-store.s3.amazonaws.com/0/59/6bac81c3-e1e7-44c2-d60e-a1d3c5de1eea.png)


## で、これからどうするべきか

結局のところ、これから何かしらのフレームワークを選びたいとしたら、Laravel。
それが使いづらかったら Aura や Symfony あたりのコンポネントを組み合わせて独自フレームワーク作っちゃえば良いのではないか、という感じもする。使いづらい、というのは、単に書き方だけでなく、重さ、拡張性、メンテンナンス性などの総合的な視点でね。
素の PHP や、例えばこれまで社内で使ってきたライトな独自フレームワークを、Aura や Symfony のコンポネントを使うように rewrite するとか、そのあたりが筋の良い選択になるのではないかね。
JSのコメントからmarkdownファイルを生成するgulpプラグイン作った


コメントからドキュメント生成するのは結構あるけど、単純にそのままmarkdownとして出力するものは探したけどなかったので作った。（あるぞという場合は教えてくださいm(_ _)m すごくありそうな気がする...）

https://www.npmjs.com/package/gulp-comment2md

## インストール

```sh
$ npm i --save-dev gulp gulp-comment2md
```

## 使い方

```javascript
/*md
 * Title
 * =====
 * 
 * - one
 * - two
 * - three
 */
function hello () {
  console.log('hello!!');
}
```
↑のように`/*md`もしくは`/*markdown`で始まるブロックコメントを書く。

```javascript
var gulp = require('gulp');
var comment2md = require('gulp-comment2md');

gulp.task('markdown', function () {
  return gulp.src('src/**/*.js')
    .pipe(comment2md())
    .pipe(gulp.dest('doc/'));
});
```

このようなtaskを書いて実行すると、`src/hello.js`の場合、`doc/hello.md`という感じで出力する。
出力ファイル名を変えたい場合は、引数に文字列か、関数を渡すことで変更できる。

```javascript
comment2md('new-name.md') // new-name.mdで出力

// `file`はvinyl
// https://github.com/wearefractal/vinyl
comment2md(function (file) {
  return 'new-name.md'; // new-name.mdで出力
})

```

## 開発・テスト

https://github.com/pirosikick/gulp-comment2md

- babelを使ってES6で書いた
  - [参考：ライブラリをES6で書いて公開する所から始めよう](http://efcl.info/2015/01/09/write-es6/)
- eslint使った。
  - .eslintrcの`parser`に[babel-eslint](https://github.com/babel/babel-eslint)を指定
  - 初めは[ルール一覧](http://eslint.org/docs/rules/)を見ながら書いていたが、かなり辛かったので、デフォルトでeslintを実行して、エラーの出る部分を修正しながらeslintrcを書いた
    - 抜けがありそうなので、いつか書き直したい
- テストはmocha + espower-babel
- streamのテストは[gulp-concat](https://github.com/wearefractal/gulp-concat)を参考に、[stream-assert](https://www.npmjs.com/package/stream-assert)を使って書いた。
- gulp使おうか迷ったけど、結局npm scriptsで頑張った。

バグや要望があれば、[issue](https://github.com/pirosikick/gulp-comment2md/issues)にくださいなー
zsh環境構築


[prezto_hp]:https://github.com/sorin-ionescu/prezto
[zsh-completions_hp]:https://github.com/zsh-users/zsh-completions
[peco_hp]:https://github.com/peco/peco

## zsh
mac標準の __zsh__ はバージョンが古いので __Homebrew__ で最新の __zsh__ をインストールします。
この辺は __Brew-file__ を導入してあれば一発でインストールされます。

### zshのインストール

```bash:
$ brew install zsh
```

### ログインシェルの変更
```/etc/shells``` にインストールした __zsh__ の __PATH__ を追加する。

```txt:/etc/shells
/usr/local/bin/zsh
```

ログインシェルを変更する。

```bash:
$ chsh -s /usr/local/bin/zsh
```

## prezto
__prezto__ は __zsh__ の構成フレームワークです。
特にこだわりなければこれを導入すると幸せになれます。

### preztoのインストール
github：[prezto][prezto_hp]

以下を実行し、 ```~/``` に __prezto__ を __clone__ してくる。（自前の設定とかガリガリ書きたい場合は __Fork__ するのもあり。）

```bash:
git clone --recursive https://github.com/sorin-ionescu/prezto.git "${ZDOTDIR:-$HOME}/.zprezto"
```

完了したら以下のコマンドを実行し、 ```~/``` 以下にdotfile群を作成する。既に使用しているdotfileが存在する場合は予め退避しておく。

```bash:
setopt EXTENDED_GLOB
for rcfile in "${ZDOTDIR:-$HOME}"/.zprezto/runcoms/^README.md(.N); do
  ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile:t}"
done
```

### preztoのアップデート

```bash:
$ git pull && git submodule update --init --recursive
```

## zsh-completions
__zsh-competions__ は __zsh__ の自動補完機能をより強力にしてくれます。
こちらも __Homebrew__ でインストールします。

### zsh-completionsのインストール
github：[zsh-completions][zsh-completions_hp]

```bash:
$ brew install zsh-completions
```

### .zshrcに設定を追記

```txt:~/.zshrc
fpath=(path/to/zsh-completions/src $fpath)
```

### zcompdumpのリビルド

```bash:
rm -f ~/.zcompdump; compinit
```

## peco
__peco__ は「標準入力から受けた行データをインクリメントサーチして、選択した行を標準出力に返す」というツールです。
こちらも __Homebrew__ でインストール可能です。

### pecoのインストール
github:[peco][peco_hp]

```bash:
$ brew install peco
```
AWS初心者向け資料置き場（Web系）


他チームへの説明用資料置き場です。
「AWSって聞いたことあるけど・・・」程度の人が、ここらの資料を読めば、
AWSを活用したWeb系システムの作り方・考え方をひと通り理解出来る。ものをまとめています。
(先人の知恵を拝借させていただきます・・)

## プロダクトについての理解編
> ### EC2
> - 概要、特徴：[2015/04/01 AWS Blackbelt EC2](http://goo.gl/y9xSyK)
> - EC2起動時の詳細説明：[Amazon EC2再入門 2015年1月版
](http://goo.gl/s9c8qU)
> - EC2作成時の実施事項：[Amazon EC2(Linux)システム管理で知らないとハマる5つの環境設定](http://goo.gl/2l5yxM)

　
> ### EBS
> - 概要：[2015/04/08 AWS Blackbelt EBS](http://goo.gl/D7Rbvz)
> - EBS作成後のディスク拡張：[EC2でOS別EBSストレージを拡張する方法まとめ](http://goo.gl/hJSnjg)

　
> ### RDS
> - 概要：[2014/09/30 AWS Black Belt Techシリーズ Amazon Relational Database Service (RDS)](http://goo.gl/Mo6U4a)
> - RDS起動時の詳細説明：[0から始めるAWS入門④：RDS編
](http://goo.gl/IrajPL)

　
> ### Route53
> - 概要：[AWS Black Belt Techシリーズ Amazon Route53](http://goo.gl/5NFyyt)
> - 構築：[Amazon Route53編～サイトを公開してみよう！パート①～](http://goo.gl/CnyUY8)
> - DNSフェイルオーバー：[Amazon Route 53のDNSフェイルオーバー機能を利用したリージョンを跨いだバックアップサイトの構築（EC2 to S3編）](http://goo.gl/IPmovO)

　
> ### ELB
> - 概要：[AWS Black Belt Techシリーズ Amazon Elastic Load Balancing](http://goo.gl/Pfh0WJ)
> - 構築：[0から始めるAWS入門③：ELB編](http://goo.gl/SM9xXJ)
> - 特徴(詳細)：[もっとELBを活用する](http://goo.gl/vL6BLH)

　
> ### VPC
> - 概要：[AWS Black Belt Techシリーズ Amazon VPC](http://goo.gl/9FKwDL)
> - 構築：[0から始めるAWS入門①：VPC編](http://goo.gl/c29kLl)
> - 設計の考慮ポイント：[【AWS】VPC環境構築ノウハウ社内資料 2014年4月版](http://goo.gl/kuVEZv)

次回はWebシステム構築編。