OmniAICreator/Qiita-1.07M huggingface dataset:
【Processing学習】 3D空間の座標に点を打つ


まずは、3D空間に立方体を描く。
この立方体はY軸に対して回転している。

```java
void setup() {
  size(500, 500, P3D); //P3Dライブラリを使う
  background(0);
  noFill();
  stroke(255);  
}

void draw() {
  background(0);
  
  translate(width/2, height/2);
  rotateY(frameCount / 200.0);
  
  box(300);
}
```

![sketch_150814b.png](https://qiita-image-store.s3.amazonaws.com/0/41889/ae91a131-3eeb-bd0b-451a-cce13841f318.png)

このbox内の座標に点を打つ。全体のコードは以下。

```java

final int AMOUNT = 100;

int[] x = new int[AMOUNT];
int[] y = new int[AMOUNT];
int[] z = new int[AMOUNT];

void setup() {
  size(500, 500, P3D);
  background(0);
  noFill();
  stroke(255);
  strokeWeight(2);
  
  for (int i = 0; i < AMOUNT; i++) {
    x[i] = int(random(-150, 150));
    y[i] = int(random(-150, 150));
    z[i] = int(random(-150, 150));
  }
  
}

void draw() {
  background(0);
  
  translate(width/2, height/2);
  rotateY(frameCount / 200.0);
  
  box(300);
  
  for (int i = 0; i < AMOUNT; i++) {
    point(x[i], y[i], z[i]);
  }
}
```

するとこうなる(画面キャプチャだとわかりにくい...orz)

![sketch_150814a.png](https://qiita-image-store.s3.amazonaws.com/0/41889/67aa52ee-13b4-1038-d5f0-d3508cb837db.png)

ポイントはx軸、y軸、z軸それぞれの配列をつくり、ランダムな数値を格納する。

```java
// setup
...

x[i] = int(random(-150, 150));
y[i] = int(random(-150, 150));
z[i] = int(random(-150, 150));
```

以下のように各配列から座標を取り出して、3D空間に点を描画する。

```java
// draw
...

for (int i = 0; i < AMOUNT; i++) {
  point(x[i], y[i], z[i]);
}
```

-おまけ-

boxを消すとこんな感じ

![sketch_150814a.png](https://qiita-image-store.s3.amazonaws.com/0/41889/ff3da6df-f308-514a-2efe-1dcbcef72516.png)

回転しているので、点の描画の軌跡を描くとこんな感じ

![sketch_150814a.png](https://qiita-image-store.s3.amazonaws.com/0/41889/ad39d1f1-6b06-2ba0-aef3-81ce0cfd4d3a.png)

おわり
さくらのレンタルサーバーでEC CUBE3がインストールできません。

EC CUBE3初心者でございます。

現在、インストールが上手くいかず大変困っております。

仕様
さくらレンタルサーバー　ビジネスプラン
PHP 5.4
MySQL 5.5

1
EC-CUBE公式ページからVersion 3.0.2(zip)をダウンロード

2
Git hubに記載されております、設定がわからずに飛ばしてしまいました。
以下が内容になります。

↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

-------------------------------------------------------------------------------

シェルスクリプトインストーラー

eccube_install.shの51行目付近、Configuration（）以下の設定内容を環境に応じて修正し実行してください。

PostgreSQL
> eccube_install.sh pgsql
MySQL
> eccube_install.sh mysql


-------------------------------------------------------------------------------

3
落としたEC-CUBEのデータをサーバーにアップロードしました。


4
「インストール完了後、 http://{インストール先URL}/admin にアクセス」
とGid hubに記載がございますが、app,htmlに.htaccessでアクセス権限を付与し、プロパティを777に変更した後

http://hoge.net/ecc3/admin のＵＲＬにアクセスをすると Not　Foundになってしまします。


どなたかご教授頂けますと幸いで御座います。



■Git hub URL
https://github.com/EC-CUBE/ec-cube
[PC-6001] カートリッジから起動する

# 概要

* エントリーアドレスは$4000。
* 先頭の2バイト（\$4000~$4001）を`AB`にしておくと、その次の2バイト（\$4002~$4003）に書かれたアドレスにジャンプする。
* ジャンプするタイミングは`How Many Pages?`が表示される直前。
* 普通に`ret`すれば`How Many Pages?`に戻る。

# 使用例

```
        org     $4000
        db      'AB'
        dw      entry

entry:
        ld    a,'@'
        ld    ($821F),a
        ret
```

起動時、画面の右上に`@`を表示する。

![P6VW001.png](https://qiita-image-store.s3.amazonaws.com/0/18828/206ae77e-da50-e37e-fa81-2648a9cab01b.png)
[Perl]HTMLから、特定のタグに挟まれた部分の文字列のみを取り出す処理

	use LWP 5.833;
	use Encode;
	my $browser = LWP::UserAgent->new;

	my $url = "http://www.atmarkit.co.jp/ait/articles/1111/18/news148.html";

	my $response = $browser->get( $url );
	my $html = $response->decoded_content;

	$start = '<div id="cmsMark">';
	$end   = '<div class="ctrl" id="start">';

	$html =~ s/[\r\n]//g;
	$html =~ /$start(.*)$end/;
	$contents = $1;
	$contents =~ s/<.*?>//g;
	$contents =~ s/[\s　]+//g;

	print encode('utf-8', $contents);
SQLで素数列挙

SQLで素数を列挙する
===

SQLパズルです。素数を列挙します。
1から適当な数字まで並んだ数列を含むテーブルSEQがあります。

```{sql}
SELECT * FROM SEQ;
```

1から100までを用意しました。

```{bash}
num
1
2
3
4
5
6
7
(中略)
.
.
.
100
```

この1から100の数列から、素数を列挙するクエリを書いてみましょう。

## 素数列挙　戦略

素数になる条件を書き出して、否定してNOT EXISTS, という戦法でいきます。

自然数$N$が素数になる条件は、「1と$N$の2つでしか割り切れない」です。

否定してみると、「$1 \lt M \leq \sqrt{N}$なる整数$M$で、$N$を割り切るものがある」ですかね。

なので、このような$M$が存在しない、というクエリを書けばよさそうです。

## 素数列挙　クエリ

NOT EXISTSを使って、こんな感じです。

```{sql}
SELECT 
  s1.num
FROM 
  SEQ s1
WHERE
  s1.num > 1
AND
  NOT EXISTS(
    SELECT 
      *
    FROM 
      SEQ s2
    WHERE 
      s1.num >= s2.num * s2.num
    and 
      s2.num > 1
    and 
      s1.num % s2.num = 0
  );
```

結果です。ちゃんと素数ができています！

```{bash}
num
2
3
4
5
7
11
13
17
19
23
(中略)
.
.
.
97
```

## 感想

素数になる条件を考えて、否定してNOT EXISTS、という流れで考えると上手くいきました。

結合しないのに複数のテーブルを持ちだすクエリの作成は、頭を使いますね...

いいパズルでした。

## 参考文献

達人に学ぶSQL徹底指南書
http://www.amazon.co.jp/達人に学ぶ-SQL徹底指南書-ミック-ebook/dp/B00DIM6330
Excelにソースコードの雛形など複数行データを効率的に格納/編集したい

#概要
Excelを使ってc#ソースコードの雛形を管理しています。
ソースコードの自動生成（オリジナルのスキャフォールド）を開発するために、いろいろと試行錯誤した結果、Excelにコードの雛形を入れて、管理する楽な方法をみつけたのでメモします。

#要件
1.ソースコードの雛形などの複数行データを効率的に保存/編集したい
2.編集時は一時的にエディタを使って複数行を楽に編集したい
3.ソースコードの雛形を管理するためのパラメータを保存したい

#実現イメージ
エクセルで管理している複数行のデータをエディタで開いて編集しているところです。
![image](https://qiita-image-store.s3.amazonaws.com/0/78230/0052d082-8c22-917f-b87d-feaa75513673.png)

#実装
2.の部分は、以下のようなVBAでメモ帳アプリとの連携を実現しました。
ソースコードの管理に限らず、複数行のデータをエクセルで管理する場合におすすめです。
ショートカットキー CTRL + E 等と関連付けておくと、更に便利です。

```lang:vba
Option Explicit
Const CodeColumnNo As Integer = 2

Public Sub EditCode()
    Application.ScreenUpdating = False
    Dim FN, Folder As String
    Dim fso, TextFile, wsh As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set wsh = CreateObject("WScript.Shell")

    '--- 適当なファイル名を作成
    FN = Cells(ActiveCell.Row, 1) & "_" & Mid$(CreateObject("Scriptlet.TypeLib").GUID, 2, 36) & ".txt"
    Folder = ThisWorkbook.Path & "\Temp\"
    If fso.FolderExists(Folder) = False Then
        fso.CreateFolder Folder
    End If

    '--- セルに格納されたソースコードをテキストファイルに出力
    With fso.CreateTextFile(Folder & FN)
        .Write Replace(Cells(ActiveCell.Row, CodeColumnNo), vbLf, vbCrLf)
        .Close
    End With

    '--- テキストファイルを開いて閉じられるまで待機
    wsh.Run """" & Folder & FN & """", , True

    '--- テキストファイルに保存された変更内容をセルに書き戻す
    With fso.OpenTextFile(Folder & FN)
        Set TextFile = fso.OpenTextFile(Folder & FN)
        Cells(ActiveCell.Row, CodeColumnNo) = Replace(TextFile.ReadAll, vbCrLf, vbLf)
    End With
    SetCodeColumnStyle ActiveCell.Row
    Application.ScreenUpdating = False
End Sub

Public Sub SetCodeColumnStyle(i_Row As Integer)

    '--- 長いコードは鬱陶しいので縮小モードにする
    With Cells(i_Row, CodeColumnNo)
        If Cells(i_Row, CodeColumnNo) <> "" Then
            .HorizontalAlignment = xlGeneral
            .VerticalAlignment = xlCenter
            .WrapText = False
            .Orientation = 0
            .AddIndent = False
            .IndentLevel = 0
            .ShrinkToFit = True
            .ReadingOrder = xlContext
            .MergeCells = False
        End If
    End With
End Sub
```

・リポジトリ
https://github.com/Implem/Implem.CodeDefiner

・マクロ格納先
https://github.com/Implem/Implem.CodeDefiner/tree/master/Implem.CodeDefiner/App_Data/Definitions
Phoenix.new でエラーが発生する

会社のPCにもElixir+PhoenixFramework環境作ろうとしたところ、
Phoenix.new コマンドで新しいプロジェクト作成するときにエラーが発生した。

>
\> mix phoenix.new hello_phoenix
* creating hello_phoenix/config/config.exs
* creating hello_phoenix/config/dev.exs
* creating hello_phoenix/config/prod.exs
...
Fetch and install dependencies? [Yn] y
* running npm install && node node_modules/brunch/bin/brunch build
* running mix deps.get
npm http GET https://registry.npmjs.org/clean-css-brunch
npm ERR! TypeError: Request path contains unescaped characters.
npm ERR!     at new ClientRequest (_http_client.js:73:11)
npm ERR!     at TunnelingAgent.exports.request (http.js:49:10)
...

npmでパッケージを取得しようとしてるところでエラーになっているようで、
同様のメッセージでググってみたところ、どうやら弊社のプロキシサーバーが原因っぽい
httpsプロトコルのままではうまくいきそうにないので、プロトコルを変更する。

```
>npm config set registry http://registry.npmjs.org/
```

再度、Phoenix.new でプロジェクトを作ると、うまくいきました。
【未完】FBXをwebglで表示したい


- FBXの形式をwebglで見れるようにしたい
- webglを楽に扱うにはthree.jsだ
- three.jsでFBXが使えるか調べる
- そのままでは使えない
- pythonでthree.jsの形に変換するコードがthree.jsのリポジトリにあった！
- 変換DONE
- 早速three.jsのLoaderを使ってロード
- どのLoaderなのか悩む
- SceneLoaderのサンプルコードがあり、それでできるらしい
- SceneLoaderは非推奨になってて```r71```のバージョンでは使えない
- issueを見る
- SceneLoaderはObjectLoaderに置き換えられたらしい
- ObjectLoaderを使ってみる
- type errorになる
- JSONLoaderを使ってロードするとエラーでSceneLoader使えって出てくる
- issue読むと時間がかかりそうだから出来そうにないてきなこと書いてある
- そもそもエラーにsceneだからSceneLoader使えってエラー出さないでほしいが…
- そしてpythonのコンバーターはメンテされてなくてく今後もメンテしないらしい
- 振り出しに戻る <- いまここ
UITextFieldのカーソルの色を変える方法 (swift)


すごく細かいですが、UITextFieldのカーソルの色を変えたいとき。

![iOS_Simulator_-_iPhone_6_-_iPhone_6___iOS_8_1__12B411_.png](https://qiita-image-store.s3.amazonaws.com/0/41889/2e9a1395-1737-1c11-eecf-3603b2961336.png)

これです。テキストの入力位置を指すライン。
ちなみに、これはカーソルではなく**キャレット(caret)**と呼ぶそうです。

デフォルトでは青色なので、背景色によっては気持ちわるいと思うことがあります。

色を変えるコードは以下

```swift

mTextField.tintColor = UIColor.whiteColor()

```

こうなります。

![スクリーンショット_2015_08_14_19_43.png](https://qiita-image-store.s3.amazonaws.com/0/41889/600d6357-26a0-f7bf-4a00-a6b93514d3a4.png)


おわり
COMODO PositiveSSL で HTTPS 通信


youcune.com の SSL/TLS 証明書を更新しようと思いましたが、買ったときより倍額ぐらいになっていたので [GoGetSSL](https://www.gogetssl.com/) に変えてみました。3年間 12.25 USD でした。

youcune.com は適宜読み替えてください。

## サーバーで秘密鍵、 CSR の生成

他の記事では `-des3` など指定してパスフレーズつきで生成している例が多いですが、どうせ最終的には外して利用すると思うので最初から暗号化しないことにします。

```bash
$ openssl genrsa -out youcune.com.key 2048
$ openssl req -new -key youcune.com.key -out youcune.com.csr
```

- `Country Name (2 letter code) [AU]:` には `JP` と答える。間違えて `JA` と書いてて通らなくてハマりました。
- `Common Name (e.g. server FQDN or YOUR name) []:` にはドメイン名を正確に答える。今回の場合 `youcune.com` と答えた。
    - ワイルドカード証明書の場合は、 `*.youcune.com` のように答える。

CSR は、 SSL/TLS 証明書を発行するための署名要求なので、証明書が発行されたら不要になります。

## 証明書の受け取り

はしょりますが、おおまかに下記手順になります。

- [GoGetSSL](https://www.gogetssl.com/) で購入
- 生成した CSR の中身をコピペ
- 所有者確認（今回はメール認証を選択しました。メールアドレスの選択肢の中から認証メールを受け取り、メールの手順にそって verification code を入力してpermitします）
- 所有者確認が終わると、証明書一式が ZIP で送られてくる

## 証明書の設置

ZIP ファイルを展開するとファイルが4つ出てきますが、ぼくの理解ではそれぞれの役割はこう。

|ファイル名|説明|
|----|----|
|AddTrustExternalCARoot.crt|ルート証明書。ブラウザに最初から入っているべきもの|
|COMODORSAAddTrustCA.crt|中間証明書|
|COMODORSADomainValidationSecureServerCA.crt|中間証明書|
|youcune_com.crt|サーバー証明書|

今回使う Nginx は中間証明書を設定できないので、証明書たちをくっつけて1つのファイルにチェーンしてやる必要があります（ Apache など中間証明書を設定できる環境の場合は、別々のファイルにしておくほうが更新作業を考えるとやりやすいのではないかと思います）。自分のドメインの証明書から中間証明書を経由してルート証明書までチェーンした証明書にします（ルート証明書自体はブラウザに入っているべきものなのでなくても動きますが、ルート証明書からチェーンすべきらしいです）。

```bash
$ cat youcune_com.crt COMODORSADomainValidationSecureServerCA.crt  COMODORSAAddTrustCA.crt AddTrustExternalCARoot.crt > youcune.com.bundle.crt
```

そして、最初に作った youcune.com.key と今作った youcune.com.bundle.crt をサーバーに設定します。今回は Nginx に設定したので下記のような感じにしました。

```
server {
  listen 443 ssl;
  server_name youcune.com;

  ssl on;
  ssl_certificate     /etc/nginx/ssl/youcune.com.bundle.crt;
  ssl_certificate_key /etc/nginx/ssl/youcune.com.key;

  # :
  # :
```

## See also

上記設定をしたあとは下記の記事も参考になるかと思います。

- [nginx - 我々はどのようにして安全なHTTPS通信を提供すれば良いか - Qiita](http://qiita.com/harukasan/items/fe37f3bab8a5ca3f4f92)
- [NginxでSSLの評価をA+にする手順 - 9mのブログ](http://blog.kksg.net/posts/nginx-secure-ssl)

## 参考文献

- [Steps to install a Comodo PositiveSSL certificate with Nginx.](https://gist.github.com/bradmontgomery/6487319)
- [SSLストア 1,050円でRapidSSLをnginxに簡単導入！ - 酒と泪とRubyとRailsと](http://morizyun.github.io/blog/ssl-store-nginx-conf-webapp-introduction/)
NSUserDefaults に保存した値を全部削除する

UserDefault に登録した値を全て削除するスニペット。



```objc:resetDefaults
- (void)resetDefaults {
    NSUserDefaults * defs = [NSUserDefaults standardUserDefaults];
    NSDictionary * dict = [defs dictionaryRepresentation];
    for (id key in dict) {
        [defs removeObjectForKey:key];
    }
    [defs synchronize];
}
```




参考:[Delete all keys from a NSUserDefaults dictionary iPhone](http://stackoverflow.com/questions/6797096/delete-all-keys-from-a-nsuserdefaults-dictionary-iphone)
UTF-8のマルチバイト文字まで対応したBaseXXエンコーダ/デコーダを書いてみた

# インストール

- **[mpyw/BaseUTF8](https://github.com/mpyw/BaseUTF8)** … 符号化を扱うやつ
- <del>mpyw/FileTD … 上記を利用した応用スクリプト(後述)</del>



# 何これ

例を見ればわかるので`README.md`からそのまま引用

```php
require 'vendor/autoload.php';
use mpyw\BaseUTF8\Coder;

$coder = new Coder; // Base64
echo $coder->encode('foobar') . PHP_EOL; // Zm9vYmFy
echo $coder->decode('Zm9vYmFy') . PHP_EOL; // foobar
echo $coder->decode("Z  m  \n9v  Y\tmFy") . PHP_EOL; // foobar

$coder = new Coder('ABCDabcd'); // Base8
echo $coder->encode('foobar') . PHP_EOL; // DBacdbbdDAacAbcC
echo $coder->decode('DBacdbbdDAacAbcC') . PHP_EOL; // foobar

$coder = new Coder('ンアッーイキソ！'); // UTF-8 Base8
echo $coder->encode('田所浩二') . PHP_EOL;
echo $coder->decode('！ア！アッッソン！アキンイソンン！アキーッソキア！アアーキッアイ') . PHP_EOL;
```

デフォルトの挙動は[base64_encode](http://php.net/manual/ja/function.base64-encode.php)及び[base64_decode](http://php.net/manual/ja/function.base64-decode.php)とほとんど同じですが

- `=` のようなトレイラーは付加しない
- コントロールシーケンス以外の無効なバイト列を検知したとき`RuntimeException`をスローする

という点だけ異なります。

# 何で作ったの

**「マルチバイト文字で符号化したらかえってバイト長増えるじゃん？」**

はい、確かにその通りなんですが、**文字数**は大きく抑えることが出来ます。先日[TwitterがDMの最大文字数を10000文字まで拡張した](http://www.itmedia.co.jp/news/articles/1506/12/news058.html)ので、これに便乗してDM経由のファイル転送クライアントを作ろうかなーと(厄介)。Twitterはバイト数ではなく文字数でカウントするのがミソです。

# 符号化効率の検証

Base64の場合とBase32768の場合を比較してみます。今回はQiitaのロゴを符号化してみます。

![logo-square-ed574fbb8006572197b178cd7f9ad00c.png](https://qiita-image-store.s3.amazonaws.com/0/25060/d80126f3-6d8f-ebba-f363-b73cc6128490.png)

```php:base64
$coder = new Coder;
$bytes = $coder->encode(file_get_contents('qiita.png'));
printf("Bytes: %d; Chars: %d\n", strlen($bytes), mb_strlen($bytes, 'UTF-8'));

/*
Bytes: 9980; Chars: 9980
*/
```

```php:base32768
$headers = [
    range("\x21", "\x7F"),
    range("\xC2", "\xDF"),
    range("\xE1", "\xEC"),
];
$trailer = range("\x80", "\xBF");
$table = $headers[0];
foreach ($headers[1] as $x) {
    foreach ($trailer as $y) {
        $table[] = "$x$y";
    }
}
foreach ($headers[2] as $x) {
    foreach ($trailer as $y) {
        foreach ($trailer as $z) {
            $table[] = "$x$y$z";
            if (count($table) >= 32768) {
                break 3;
            }
        }
    }
}
$coder = new Coder($table);
$bytes = $coder->encode(file_get_contents('qiita.png'));
printf("Bytes: %d; Chars: %d\n", strlen($bytes), mb_strlen($bytes, 'UTF-8'));

/*
Bytes: 11628; Chars: 3992
*/
```

文字数という視点だと大幅に圧縮できていることが分かります。取り扱うデータによってはこれに[gzdeflate](http://php.net/manual/ja/function.gzdeflate.php)および[gzinflate](http://php.net/manual/ja/function.gzinflate.php)を組み合わせると更に短縮出来るかもしれません。

# 2015/8/16 追記

そもそも任意のバイナリデータは画像に偽装出来、この手段を用いたほうが明らかに効率がいいことに気づいたのでFileTDはやめました
Android のxmlns:appを素早く挿入する

Android Studioのライブテンプレートが便利だ。
`xmlns:app="http://schemas.android.com/apk/res-auto"` はカスタムレイアウトを利用しているとよく打つがすでにデフォルトで登録されている。

![livetemplate.png](https://qiita-image-store.s3.amazonaws.com/0/15000/3e415b02-122c-190d-8e36-97bece9bcdea.png)

Cmd+J > appNs > Enterで挿入される
Google Apps ScriptのClassroom Serviceを使ってみる。


# これは何？
[Google Classroom API](https://developers.google.com/classroom/reference/rest)のラッパーです。
時間割の管理を管理者、先生、生徒で行えるようにするためのもののようです。

# 本日のサンプルコード
このサービスはGoogleの拡張サービスなので、動かす時は、リソース→Googleの拡張サービスで、Google Apps Activity APIを有効にしておいて下さい。当然、 __Developer Consoleでも有効__ にしておきます。ただ、Developer Consoleから探すのは非常に大変なので、おとなしく、検索して下さい。

![classroom_devconsole.png](https://qiita-image-store.s3.amazonaws.com/0/11925/58d0f882-bc3d-0133-c25c-95f1da830f3b.png "classroom_devconsole.png")

![Classroomサンプル1.png](https://qiita-image-store.s3.amazonaws.com/0/11925/0137178c-2d3f-4bf2-b95d-8c843ffd1ef4.png "Classroomサンプル1.png")

## 実行すると、承認を求められるので承認して下さい。
![許可のリクエスト_と_Classroomサンプル1.png](https://qiita-image-store.s3.amazonaws.com/0/11925/9c29d587-212d-7148-585e-03c1407ddee7.png "許可のリクエスト_と_Classroomサンプル1.png")

```js:コード.gs
function getClassroomlist() {
  var optionalArgs = {
    pageSize: 10
  };
  
  var res = Classroom.Courses.list(optionalArgs);
  Logger.log(res);
}

```

# 実行結果
Permission_denied.というレスポンスが得られました。

# 結論
gmailアカウントやらAppsアカウント、for Workアカウントだと使えません。（gmailアカウントでしか試していませんが、多分ダメだと思われる。）
公式にfor Eduで有効にするという事が明記されていました。
https://developers.google.com/classroom/quickstart/apps-script

for Eduのアカウントを持っている方は是非使ってみてください。

## Disclaimer
* この記事は個人的なものです｡私の雇用者とは全く関係はありません｡（一応つけておきます）
話の流れから生まれた、生涯どこにも行き場の無いであろうFizzBuzzを供養する

```zsh
perl -e '($f, $b, $fn, $bn) = (
  (shift or 3),
  (shift or 5),
  (shift or "Fizz"), 
  (shift or "Buzz")
) and
print map{
    $s = ""; 
    $_ % $f or $s .= $fn;
    $_ % $b or $s .= $bn; 
    $s or $s = $_; 
    $s .= "\n"
} 1..(shift or 100)' 
```
Prestoでhistogram関数を使って可視化したいときのクエリ（on TreasureData）

Prestoには、[Histgram関数](https://prestodb.io/docs/current/functions/aggregate.html#histogram)がありますが、返値がMap型になっています。
なので、その結果をどこかに書き出したいと思ってもイマイチ使いづらいです。

```
SELECT 
  method,
  histogram(code) AS hist
FROM
  www_access
GROUP BY
  method
```

![result1](https://i.gyazo.com/36ed90507e6388e82a65e23189d26a3b.png)


こうしたときには、Mapの値を展開して、フラっトな形に直したいです。
そのためには、下記の関数を使います。

- map_keys(x<K, V>)
- map_values(x<K, V>)
    - https://prestodb.io/docs/current/functions/map.html
- unnest
    - https://prestodb.io/docs/current/sql/select.html#unnest


そんでもって、下のようなクエリを書きます。

With句のhist_tableでヒストグラムを作って、split_tableでそれらをkeyとvalueで分けて、最後にUnnestで展開してます。

```
WITH hist_table AS (
  select method, histogram(code) as hist
  from www_access group by method
),
split_table AS (
  select
    method,
    map_keys(hist) as keys,
    map_values(hist) as vals
  from hist_table
)
select * from split_table
CROSS JOIN UNNEST(keys, vals) AS t (k, v);
```


![result2](https://i.gyazo.com/ed0cf275cdc584f9043ffb0c496313bd.png)


ちゃんちゃん。
[MongoDB .NET Driver] UpdateOneAsync & UpdateManyAsync sample

##Driver & Environment & Initialization & Mapping Class
請參考
[[MongoDB .NET Driver] Indexes.CreateOneAsync sample](http://qiita.com/SHUAI/items/f9479f2c1a09bbd7e36b)

##UpdateOneAsync
假設已知PersonId
欲更新其Phone寫法如下

```csharp
var filter = Builders<Member>.Filter.Eq<string>(m => m.PersonId, id);
var update = Builders<Member>.Update.Set(m => m.Phone, phone);
var result = db.GetCollection<Member>(colName).UpdateOneAsync(filter, update).ConfigureAwait(continueOnCapturedContext: false);
```

##UpdateManyAsync
假設已知多筆PersonId
欲更新其ZipCode寫法如下

```csharp
var filter = Builders<Member>.Filter.In<string>(m => m.PersonId, ids);
var update = Builders<Member>.Update.Set(m => m.ZipCode, zipCode);
var result = db.GetCollection<Member>(colName).UpdateManyAsync(filter, update).ConfigureAwait(continueOnCapturedContext: false);
if (result.IsModifiedCountAvailable)
{
    // result.ModifiedCount: 取得更新筆數
}
```
vmwarefusionでDocker Toolboxをセットアップする

Docker Toolboxがリリースされたので環境を更新しようとしたところ、El Capitanのベータ環境のせいか、virtualboxベースのdefault VMが起動しなかったため、回避策を探したところ、VMware fusionを使えばokでした。

1. Docker Toolboxのインストール

普通に [Docker Toolbox](https://www.docker.com/toolbox) からインストーラをダウンロードして実行します。事前にhomebrewなどで入れたものはuninstallしておきました。

2. VirtualBoxベースのdefault VMを削除

toolboxのインストールが完了すると default という名前のVMが
インストールされています。`docker-machine ls`で確認できます。
これは邪魔なので削除します。

```shell-session
docker-machine rm default
```

2. default VMを作る

以下のコマンドでvmwarefusionドライバを利用してVMを作成します。

```shell-session
docker-machine create -d vmwarefusion default
```

名前はdefaultでないとKitematic(Beta)から認識してくれません。

あとは普通に `docker-machine start default`したり、
`eval "$(docker-machine env default)"` したりすればok.

zshのcompletionとかは入らないので、別途入れる必要がありますね。
VBA for Outlook


VBAと言うとExcel向けの情報が多く、Outlookでの活用方法は探してもあまり出てこない。でも個人的には受信したメールをトリガーしてスクリプトでイチャイチャしたりはよくやる。

# Outlookの参照

```vbnet
Set olApp = CreateObject("Outlook.Application")
Set olSession = olApp.Session
```

セッションの取得は、あるいは`GetNamespace`メソッドによる名前空間の取得でも代替できる。`GetNamespace`は名前空間の種類を表す文字列を引数に取るが、使用可能なのは「MAPI」のみ。このあたりはよくわからないので呪文だと思ってそのまま書く。いずれのメソッドを使っても、返り値はNamespaceオブジェクトになる。

# メールの取得

```vbnet
Set olItems = olSession.Folders("受信トレイ").Folders("2015-08").Items

For Each olMail In olItems
  MsgBox olMail.subject & ":" & Format(olMail.ReceivedTime, ' => テストメール : 2015/08/14
Next olMail

Set todayItems = olItems.Restrict("[ReceivedDate] = '" & Format(Date, "yyyy/mm/dd") & "'")
```

基本はNamespaceオブジェクトのFoldersプロパティでFolderオブジェクトのCollectionを取得し、さらにFolderオブジェクトのItemsメソッドでフォルダ内のメール全件が取得できる。全メールを順に処理するのであれば`For Each`でループ処理すれば良いし、さらに条件で絞り込みたいのなら`Restrict`メソッドが使える。

なお、Itemsコレクションにはメールが順不同に収められているので、送信日時順に取り出したいなど、希望がある場合は[Sortメソッド](https://msdn.microsoft.com/JA-JP/library/office/ff866960.aspx)を用いる形になる。

# メール送付

```vbnet
Set olSendmail = olApp.CreateItem(0)
With olSendmail
  .To = sendto@example.jp
  .CC = sendcc@example.jp
  .Subject = "test"
  .Body = "こんにちは！" & vbCrLf & "2行目です！"
  .Attachments.Add "C:\tempfile"
End With
olSendmail.Save
olSendmail.Close(0)
olSendmail.Send
```

OutlookのApplicationオブジェクトに対する`CreateItem`メソッドにより`MailItem`を作成する。なおCreateItemはメールに限らず、種々のItemを作成するためのメソッドであり、引数を0とした場合はMailItem、2とした場合は連絡先情報にあたる`ContactItem`オブジェクトが作られる。各引数は[公式](https://msdn.microsoft.com/JA-JP/library/office/ff869291.aspx)参照。

MailItemに各パラメーターを設定し、Save、Close、Sendによりメールが送付される。

# オブジェクトの解放

使用した各オブジェクトは最後に解放する。ちゃんと見てないけど、解放しないとプロセスが消えないんではないか。。。

```vbnet
Set olApp = Nothing
Set olSession = Nothing
Set olMail = Nothing ...
```


結局のところオブジェクト指向型ではあるので、各オブジェクトのメソッドとプロパティを[公式リファレンス](https://msdn.microsoft.com/ja-jp/library/office/ff866465.aspx)で押さえていけばだいたいの操作は利用できるようになるかと思う。
swift 警告、エラーまとめ


##未使用変数の警告##
使用していない変数がある場合に発生する警告
:memo: 未使用変数を削除するか
>Initialization of immutable value 'videoLayer' was never used; consider replacing with assignment to '_' or removing it

　
##ラムダ式で型が曖昧な場合に出るエラー##
:memo:多々書籍内でも修正前の記述になっているので要注意

```修正前
self.ImageOut.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler:{(imageDataBuffer, error)->Void in
	・・・
})
```

```修正後
self.ImageOut.captureStillImageAsynchronouslyFromConnection(videoConnection, completionHandler:{(imageDataBuffer:CMSampleBufferRef, error:NSError)->Void in
   ・・・	
})
```

>type of expression is ambiguous without more context
Twitterアプリからのアプリtoアプリのリダイレクトでハマったときの備忘録


#概要

AndroidでTwitterアプリからリダイレクトさせて自アプリにディープリンクさせたいなと思ったのですが思うようにいかなかった時の備忘録です。

一昔まえのTwitterアプリではリンクを張るとブラウザが立ち上がってくれていたのでJS側でハンドリングして自アプリへのスキーム起動が容易でした。
※今でも一部OSではそうなる..(例 Twitter version 5.71.0: 端末SH-01E: OS:4.1.2)

がしかし、今のTwitterアプリは「アプリ内ブラウザを使用する」にデフォでなっているため、そう簡単に上手くいきませんでした。

Twitterカード使えば上手くディープリンクできるんじゃねえのって思って使ってみましたが、Twitterアプリからから下記のようにmetaを埋め込んだhtmlを吐き出してもカードが表示されないという...
※ブラウザから吐き出した場合はちゃんと表示されます。

```lang:hoge.html
<meta name="twitter:card" content="app">
...以下省略
```
[Twitterカードについて](http://qiita.com/DJ_kichimura/items/da1aa0c7bfbe6c6b89ee)

#いろいろ他アプリを見てみたところ
そこで、他のアプリはどうしてるんだろうと疑問が湧いた訳です。

まずはアプリの設定をリセットをして初期状態にして確認しました。
![Screenshot_2015-08-14-17-22-35.png](https://qiita-image-store.s3.amazonaws.com/0/54509/cc699119-d501-4024-7cee-b48b54cd1be9.png)


### Instagram
Twitter WebViewでページを開きました。ちゃんとwebページが用意されているので特に不自由ないです。
![Screenshot_2015-08-14-17-27-04.png](https://qiita-image-store.s3.amazonaws.com/0/54509/18594759-f39f-1459-7f65-11e3fadd17b0.png)

### Youtube
Youtubeもちゃんとwebページ用意してるわー。しかもここでちゃんと再生とかできる。。さすがっす。。
![Screenshot_2015-08-14-17-31-25.png](https://qiita-image-store.s3.amazonaws.com/0/54509/9b5e1616-21b3-9d0f-49da-969598d8550a.png)

ちなみにTwitterアプリの右上のToolBarのmenuをタップすると「ブラウザで開く」ってのがあります。それを選択するとYoutubeに直接ディープリングができるんです。
うん、まあそうだよね。

![Screenshot_2015-08-14-17-31-36.png](https://qiita-image-store.s3.amazonaws.com/0/54509/35b3f4bf-369b-0731-6408-a990a5a5b3c7.png)

そう。。私はwebページなんて用意する時間なかったので直接アプリにリダイレクトかましたかったわけですよ。。Twitterアプリ様のWebView使わせて頂いていてなんかすいません的なかんじですが、、



#そこでやったこと
みんな、ちゃんとwebページを用意してるんですが私にはそんな時間も余裕もないのでシンプルに考えてみました。
※ここではGooglePlayに飛ばす例にしています。

###1回目のTry!
```lang:hoge.html
...一部省略

<script type="text/javascript">
    function kakunin(){
  		ret = confirm("GooglePlayを起動します！");
  		if (ret == true){
  			//google play
          location.href= "market://";
  		}
	}
</script>

...一部省略

<form name="test">
<input type="button" name="test" value="アプリ起動Intent発行" onClick="kakunin()">
</form>
```

![Screenshot_2015-08-14-17-50-08.png](https://qiita-image-store.s3.amazonaws.com/0/54509/324768db-490f-118b-6d4f-72c45681ef97.png)

からの

![Screenshot_2015-08-14-17-51-03.png](https://qiita-image-store.s3.amazonaws.com/0/54509/59e0793c-0358-2727-e578-c2c0e7a3ce88.png)

oh..まじかよ、、さすがにこれはまずい、、Twitterさんを停止させてしもうた。。

まだまだー
###2回目のTry!
ちゃんとディープリンクするように指定してみました

```lang:hoge.html
...一部省略

<script type="text/javascript">
    function kakunin(){
  		ret = confirm("GooglePlayを起動します！");
  		if (ret == true){
  			//google play
          location.href= "market://details?id=com.twitter.android";
  		}
	}
</script>

...一部省略
```

![Screenshot_2015-08-14-17-57-30.png](https://qiita-image-store.s3.amazonaws.com/0/54509/9308f99d-6c7c-9088-e972-f70d861aa913.png)

w( ▼o▼ )w ｵｵｫｫ!!
ちゃんとできましたw


#個人的な結論
TwitterWebViewからディープリンクするときは一旦jsからclickイベントを拾ってintentを発行したらディープリンクできました。。schemeだけを指定してアプリを立ち上げようとするとTwitterアプリが強制終了するようです。なんで？？
最終的にはwebページは必要だと思います。今かいたのもTwitterが変わればうまく動かなくなる可能性もあるでしょう。。
std::queue をクリアする方法。

# std::queue をクリアする方法。

clear()しようと思ったらできませんでした・・・。
clear()メソッドがなかったので調べました。

感謝
http://stackoverflow.com/questions/709146/how-do-i-clear-the-stdqueue-efficiently


stdコンテナのクリアについては、空のコンテナとswapするというイディオムがあるらしい。

```c++
void clear( std::queue<int> &q )
{
   std::queue<int> empty;
   std::swap( q, empty );
}
```
上記は下記と同義

```c++
std::queue<int>().swap(q)
```

追記：
上記リンクに以下のような記載があって、なるほどなと思いました。
コンテナを継承してClearメソッドを追加する方法。ー＞このメソッドで元のコンテナオブジェクトをクリアさせるという。

```c++
template<class T>
class queue_clearable : public std::queue<T>
{
public:
    void clear()
    {
        c.clear();
    }
};
```
marked.jsでXSS対策の設定をする

# 概要
Markdownエディタを作るとき、marked.jsは簡単に使えるので「markedでMarkdownエディタつくってみた」ができるのですが、設定をしないとスクリプトを埋め込まれてしまうので設定しましょう。

=== 2021/03/11 追記 ===
これ書いたときはXSSの理解が浅く、今見るとかなり説明が危ない気がしたのと、「marked.js XSS」で検索すると一番上に来てけっこう参照されているようなので追記しました。

# 参考資料
必ず『安全なウェブサイトの作り方』を参照して対策を行ってください。

安全なウェブサイトの作り方 改訂第７版
https://www.ipa.go.jp/files/000017316.pdf

# 問題
たとえば以下のmarkdownをmarkedに通してQiitaのエディタみたくリアルタイムにHTMLを生成すると、アラートが表示されてしまいます。

```lang:markdown
# タイトル
<script>alert('aaa');</script>
```

これを悪用すればいろいろされてしまうので、markedの設定をちゃんとしましょう。

# ===2021/03/11 追記===
「自分が書いたものを自分で編集する」分には問題にはならないので上の説明は正確ではないです。
XSSは**「誰かが入力したものをほかの人が参照する」**という場合に問題になります。
例えば、あるユーザーが書いた記事をその人以外が編集できるような機能を作ったとします。そのとき、記事に「個人情報の入力を促す画面を(JSでゴリゴリ作って)表示して、入力内容をajaxで送るコード」が書かれていて、対策がされていなかったらそれが実行されてしまいます。
まぁそんな怪しげな画面に入力する人はいないかもしれませんが、そういうことができてしまうというのが危ないわけです。

で、「対策としてmarked.js側の設定でやりましょう」というのがこの記事の本旨なんですが、marked.jsでやる以前に参考資料で挙げた『安全なウェブサイトの作り方』の根本的な対策をしましょう。
Markdownエディタの機能としてはHTMLの入力は許可しなくていいはず(と私は思う)なので、

- 『1.5.1 HTMLテキストの入力を許可しない場合の対策』
- 『1.5.3 全てのウェブアプリケーションに共通の対策』

の根本的解決を参照してください。
これをやったうえで次項のmarkedの設定もしないと片手落ちになります。

# markedの設定
[公式のREADME](https://github.com/chjj/marked)を見るといろいろ設定値がありますが、とりあえずsanitizeだけはやりましょう。これでscriptタグの内容がプレーンテキストになります。

```
marked.setOptions({
  sanitize: true,
});
```

# まとめ
「markedでMarkdownエディタつくってみた」という記事をちらほら見かけますが、設定をなにもしていないのが結構ありますので、上述のようにsanitizeの設定だけはしましょう。
Arduino Pro Mini 3.3V/8MHzにFT232RLの3.3V出力を入れて問題ないか？

筆者の手元にあるFT232RLモジュールはディップスイッチで5V動作と3.3V動作が切り替えられます。これがあればArduino Pro Mini 3.3V/8MHzとのシリアル通信にRXD/TXDの両ピンが使えるはずです。

ところで、このモジュールのVCCをArduino Pro Mini 3.3V/8MHzの入力電源として利用して問題ないのか、疑問に思ったので調べてみました。

# 観察してみる

FT232RLモジュールのディップスイッチを切り替えて、VCCの電圧を測定してみました。

* ディップスイッチを5Vにしたときの電圧を測ると5.04V
* ディップスイッチを3.3Vにしたときの電圧を測ると3.51V

3.3Vのときの誤差が大きいような気もします。このモジュール大丈夫かしら…？

# データシートを見る

[FT232RLのデータシート](http://www.ftdichip.com/Support/Documents/DataSheets/ICs/DS_FT232R.pdf)を確認してみると、次のことがわかりました。

* FT232RLは3.3Vレギュレータを内蔵している
    * 電圧はTypical 3.3V（Minimum 3.0V、Maximum 3.6V）

このアダプタの電圧切り替えはFT232RLの機能を使ったものでしょうから、上記測定結果はデータシートの通りということになりますね。

# 3.51VをArduino Pro Mini 3.3V/8MHzのVCCに繋いで大丈夫か

さて、3.51Vというのは3.3Vに対して6%ほどの誤差です。本当に電源として使って問題ないのでしょうか？

とはいえ[Arduino Pro Miniの回路図](https://cdn.sparkfun.com/datasheets/Dev/Arduino/Boards/Arduino-Pro-Mini-v14.pdf)を見るとマトモなデバイスはATmega328PとMIC5205（電圧レギュレータ）くらいなので、特に問題にはならない気がします。むしろ、他に接続する3.3Vデバイスがあるのであれば、それらが大丈夫かどうかが重要でしょう。

大抵のデバイスは±10%くらいマージンが取ってあるので、大丈夫なんだろうとは思います。

実際、この3.51VをArduino Pro Mini 3.3V/8MHzのVCCに接続してみましたが、特に問題はなさそうです。

# 3.51VをArduino Pro Mini 3.3V/8MHzのRAWに繋いでみる

ところで、Arduino Pro Miniは電圧レギュレータMIC5205を内蔵しており、電源がRAWに繋がれた場合にはMIC5205で3.3Vに降圧してVCCとして利用します。

また、[MIC5205のデータシート](http://www.micrel.com/_PDF/mic5205.pdf)を見るとドロップアウト電圧が0.1V程度（50mA、Typical）のようですから、3.51V入力でもギリギリ動作しそうな気がします。

実際にRAWにFT232RLのVCCを接続してみましたが、期待通りに動作しました。この際のArduino Pro Mini側のVCCの電圧は3.26Vでした。

もちろん、この結果はFT232RLの個体差によるもので、もっと電圧が低い場合には動かないと思います。
Elasticsearchへの日本語データ投入と検索の方法（初級）

前提：Kuromojiがインストールされていること。

アナライザの設定

	curl -XPUT 'http://localhost:9200/tokyo' -d'
	  {
	      "index":{
	          "analysis":{
	              "tokenizer" : {
	                  "kuromoji" : {
	                     "type" : "kuromoji_tokenizer"
	                  }
	              },
	              "analyzer" : {
	                  "analyzer" : {
	                      "type" : "custom",
	                      "tokenizer" : "kuromoji"
	                  }
	              }
	          }
	      }
	  }'

日本語データ入力

	curl -XPUT http://localhost:9200/tokyo/shinagawa/1 -d '
	{
	    "title": "私の名前は大和です。",
	    "content": "私は犬が好きです。",
	    "tags": ["赤", "緑", "青"]
	}
	'

	curl -XPUT http://localhost:9200/tokyo/shinagawa/2 -d '
	{
	    "title": "私の名前は田中です。",
	    "content": "私は猫が好きです。",
	    "tags": ["地球", "月", "火星"]
	}
	'

	curl -XPUT http://localhost:9200/tokyo/shinagawa/3 -d '
	{
	    "title": "私の名前は渡辺です。",
	    "content": "私は魚が好きです。",
	    "tags": ["りんご", "みかん", "バナナ"]
	}
	'

検索

	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"title":"大和"}}
	}'


	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"title":"田中"}}
	}'


	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"title":"渡辺"}}
	}'


	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"title":"私は"}}
	}'


	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"tags":"バナナ"}}
	}'

	curl -XGET http://localhost:9200/tokyo/_search -d '
	{
	"query":
	{ "match":{"title":"田中,大和"}}
	}'
DOMノードの取得方法メモ書き

## 内容
javascript, jQuery において，DOM要素の取得方法のメモ書き．

テストしてないものあり．
テストしたものは，Firefox40.0 でのみ．環境によっては書いてるとおりにならないかも．
jQuery のバージョンは 2.1.4

# javascriptにて
## 関連
|function|引数の形式|戻り値|戻り値の型|
|:--|:--|:--|:--|
|`document.getElementById(id)`|id属性の文字列 (`id`)|`id`をid属性に持つ最初の要素|Node|
|`element.getElementsByClassname(class)`[^elem]|class属性の文字列 (`class`)．スペースで区切って複数指定できる．|`element`の子孫要素で`class`の全てをclass属性に持つ要素のリスト|NodeList[^nlist]|
|`element.getElementsByTagName(tag)`|tag名の文字列 (`tag`)|`element`び子孫要素で`tag`である要素のリスト|NodeList|
|`element.querySelector(selector)`[^ie<=8]|cssセレクタ文字列 (`selector`)|`element`の子要素で`selector`にマッチする最初の要素|Node|
|`element.querySelectorAll(selector)`[^ie<=8]|cssセレクタ文字列 (`selector`)|`element`の子要素で`selector`にマッチする要素のリスト|Nodeの配列|

[^elem]: `element`は DOMノード．`document`を使っても可．
[^nlist]: NodeListは静的な配列ではなく，DOMの変更に応じて動的に変化する．NodeList内のNodeへのアクセスは配列へのそれとと同様．
[^ie<=8]: IEでは８以降で利用可能とのこと．[ここ](http://www.atmarkit.co.jp/ait/articles/1110/07/news125.html)より．

# jQueryにて

## jQuery オブジェクトの取得について (**多分こんな感じ**)
[下の表](#jQueryオブジェクト取得手段)の方法を使って要素を取得した場合，jQueryオブジェクトとして取得される．
要素は，取得したオブジェクトの*数値インデックスのプロパティ*にDOMノードとして格納される．
例えば要素が一つだけなら，`取得したjQueryオブジェクト[0]`にそのDOMノードが格納される．
要素が二つなら，`取得したjQueryオブジェクト[0]`と`取得したjQueryオブジェクト[1]`にそれらのDOMノードが順に格納される．

## jQueryオブジェクト取得手段 [^ignore]
|function|引数の形式|取得される要素|
|:--|:--|:--|
|`$(selector[, context])`|cssセレクタ文字列 (`selector`), `document`かDOMノードかjQueryオブジェクト (`context`)|`context`を指定した場合はその子孫要素の，そうでなければ`document`内の，`selector`にマッチする要素のjQueryオブジェクト|
|`jQuery(selector[, context])`|cssセレクタ文字列 (`selector`), `document`かDOMノードかjQueryオブジェクト (`context`)|`context`を指定した場合はその子孫要素の，そうでなければ`document`内の，`selector`にマッチする要素のjQueryオブジェクト|
|`$(element)`[^notDOMAccess]|Node (`element`)|`element`のjQueryオブジェクト|
|`$(elements)`[^notDOMAccess]|NodeList (`elements`)|`elements`のjQueryオブジェクト[^jqarray]|
|`jQueryオブジェクト.find(selector)`|cssセレクタ文字列 (`selector`)|`jQueryオブジェクト`の子孫要素で`selector`にマッチする要素のjQueryオブジェクト|

注意として，cssセレクタの要素を直接指定する部分[^whatSay]に id属性 を指定した場合は，規約に従わずに同じ id属性 を複数箇所で使用していた場合でも，最初の一つの要素にしかマッチしない．
しかし，cssセレクタの，求める要素の親要素を限定する部分に id属性 を指定した場合，同じ id属性 を複数箇所で使用していると，それぞれの親要素の子孫要素が検索される．
規約違反前提なので，ここは環境によって違うかも．

```html:example.html
<div id='duplication'>
    $('#duplication') にマッチ
    <p>$('#duplication p') にマッチ</p>
</div>
<div id='duplication'>
    $('#duplication') ではマッチしない
    <p>$('#duplication p') にマッチ</p>
</div>
```

[^notDOMAccess]: DOMノードは既に取得しているのでそれへのアクセス手段ではないが，ついでに書いとく．
[^jqarray]: getElementsByClassName()などで取得したものでも，NodeListの動的変化の性質は失われている．
[^ignore]: 他にも children とか parent とか parents とかあるけど，どれもcssセレクタを使って同じように使えるし，いいや．
[^whatSay]: 何かいい呼び方ありませんか．
LXCからGUIアプリケーションを起動する

　コンテナ内からFirefoxやNautilusなどのGUIアプリケーションを起動させる設定の備忘です。

　まず、デーモンとして実行中のコンテナで、Firefoxをインストールしておきます。その状態でFirefoxを実行してみると`Error: no display specified`、適当なDISPLAYオプションを指定しても`Error: cannot open display`と返されて起動しません。

    [user@localhost ~]$ sudo lxc-ls --fancy
    NAME      STATE    IPV4            IPV6  AUTOSTART  
    --------------------------------------------------
    ubuntu01  RUNNING  192.168.122.85  -     NO         

    [user@localhost ~]$ sudo lxc-attach -n ubuntu01 --clear-env -- sudo -u ubuntu -i env DISPLAY=$DISPLAY firefox
    Error: cannot open display: :0

　そこで、OSの`/tmp/.X11-unix`をコンテナの`/tmp/.X11-unix`にマウントするように、設定ファイル`/var/lib/lxc/ubuntu01/config`に次の行を追記して、コンテナを再起動します。

    lxc.mount.entry=/tmp/.X11-unix tmp/.X11-unix none ro,bind,create=dir 0 0

再度、firefoxのコマンドを実行を試してみると、OS（Fedora）からUbuntuのFirefoxを起動することができました。

    [user@localhost ~]$ sudo lxc-attach -n ubuntu01 -- sudo -u ubuntu -i env DISPLAY=$DISPLAY firefox

![Screenshot from 2015-08-14 17:28:47.png](https://qiita-image-store.s3.amazonaws.com/0/58/dc620438-5634-173f-d2fd-25b72192325a.png)
AWS cliでキューのメッセージを取得するシェルスクリプト

#AWSのSQSキューからメッセージを取得
エラー等でキューイング処理に失敗したメッセージがデッドキューに行ってしまい、メッセージの内容をサルベージする必要が出てきた。Webページ上から作業するにはあまりに量が多かったので、メッセージ内容を取得してファイルに出力するシェルを書いた。

```shell-session:receiveMessage.sh
#!/bin/sh

cnt=0

while [ $cnt -lt $1 ];
do
  RESULT=`aws sqs receive-message --queue-url "対象キューのURL"`

  echo $RESULT >> ./receiveOutput.txt
  cnt=$(( cnt + 1 ))
done
```

`aws sqs receive-message`で、キューに溜まったメッセージを1つ取得する。
メッセージが20溜まっていたら、実行時の引数に20と指定して実行すれば、その回数分取得。

```zsh:Terminal
./receiveMessage.sh 20
```

すると、receiveOutput.txtに結果が出力される。

##一度の取得個数を変更する
しかしこれだと、VisibilityTimeoutが30秒など短い時に100件を超えるメッセージが溜まっていると、全てのメッセージを取得する前に、処理したメッセージが可視化されてしまい、同じメッセージを取得してしまうことがあった。

抜本的解決にはならないが、一度に取得するメッセージの数を指定することで、ある程度の対応は可能。

```shell-session:receiveMessage.sh
#!/bin/sh

cnt=0

while [ $cnt -lt $1 ];
do
  RESULT=`aws sqs receive-message --queue-url "対象キューのURL" --max-number-of-message "10"`

  echo $RESULT >> ./receiveOutput.txt
  cnt=$(( cnt + 1 ))
done
```

receive-messageのoptionに`--max-number-of-message`と付けることで、一度に取得するメッセージの数を1〜10に変更することが出来る。

ただ、1000を超えるようなメッセージを取得する必要がある時は同じ問題に突き当たってしまう。
どうにか出来ないのだろうか…
viewでForm: could not find implicit value for parameter messages: play.api.i18n.Messages出るときの対処

#元コード
![スクリーンショット 2015-08-14 5.20.34 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/222624ce-65e2-259f-2e0b-2ea47db575a5.png)

#対応
play.api.i18n.Messageへのパスを通す必要があるらしい

@(userForm: Form[User])の後に(implicit messages: Messages)をつけたらエラーでなくなった
![スクリーンショット 2015-08-14 5.20.45 PM.png](https://qiita-image-store.s3.amazonaws.com/0/20307/4d52844e-e7b8-03e5-d8b5-d8ffbf64bb99.png)
unity > fileIO > File.Exists() / System.IO.FileInfo() / fi1.Length

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

ファイル関連の処理の練習。
1. File.Exists()
2. System.IO.FileInfo()
3. fi1.Length

参考
http://dobon.net/vb/dotnet/file/filesize.html

```csharp:CompareScript.cs
using UnityEngine;
using System.Collections;
using UnityEngine.UI;

using UnityEditor; // for ClearConsole()
using System.IO; // for File.XXX, FileInfo()

public class CompareScript : MonoBehaviour {

	public InputField IF1; // filename1
	public InputField IF2; // filename2
	
	[MenuItem ("Tools/Clear Console %#c")]
	static void ClearConsole() {
		var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll");
		var clearMethod = logEntries.GetMethod("Clear", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
		clearMethod.Invoke(null,null);
	}

	void compareFiles(string file1, string file2) {
		if (File.Exists (file1) == false || File.Exists (file2) == false) {
			Debug.Log("file not found");
			return;
		}

		System.IO.FileInfo fi1 = new System.IO.FileInfo (file1);
		System.IO.FileInfo fi2 = new System.IO.FileInfo (file2);

		Debug.Log (fi1.Length.ToString ());
		Debug.Log (fi2.Length.ToString ());

		if (fi1.Length > fi2.Length) {
			Debug.Log("file1 is larger than file2");
		} else {
			Debug.Log("file2 is larger than file1");
		}
	}

	public void CompareClick() {
		ClearConsole ();
		compareFiles (IF1.text, IF2.text);
	}
}
```

![Scene1_unity_-_150814_fileBattler_-_PC__Mac___Linux_Standalone__Personal_.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/72737b54-231a-bd58-d207-bfef852c3506.jpeg)
Elasticsearchへのデータ投入と検索の方法（初級）

前提：Elasticsearchがインストールされており、起動中であること。


データ投入（ためしに３件入れてみる）

	curl -XPUT http://localhost:9200/blog/article/1 -d '
	{
		"title": "My Name Is Yamato",
		"content": "I love dog",
		"tags": ["red", "green", "blue"]
	}
	'

	curl -XPUT http://localhost:9200/blog/article/2 -d '
	{
		"title": "My Name Is Tanaka",
		"content": "I love cat",
		"tags": ["Earth", "Moon", "Mars"]
	}
	'

	curl -XPUT http://localhost:9200/blog/article/3 -d '
	{
		"title": "My Name Is Watanabe",
		"content": "I love fish",
		"tags": ["apple", "orange", "banana"]
	}
	'

検索

	curl -XGET http://localhost:9200/_search?q=title:yamato
	curl -XGET http://localhost:9200/_search?q=title:tanaka
	curl -XGET http://localhost:9200/_search?q=title:watanabe
	curl -XGET http://localhost:9200/_search?q=content:dog
	curl -XGET http://localhost:9200/_search?q=content:cat
	curl -XGET http://localhost:9200/_search?q=content:fish
	curl -XGET http://localhost:9200/_search?q=tags:green
	curl -XGET http://localhost:9200/_search?q=tags:mars
	curl -XGET http://localhost:9200/_search?q=tags:apple
	curl -XGET http://localhost:9200/_search?q=tags:apple,moon
chefメモ

## ubuntu14.04にchefをインストール
### chef-DKをダウンロード

```
$ wget https://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.6.2-1_amd64.deb
```

### chefをインストール

```
$ sudo dpkg -i chefdk*
```

## chefのコマンド
cookbookの作成

```
$ chef generate cookbook cookbooks/awesome_customers
```


## knife
knifeを用いると、それぞれのnodeでcookbookを実行することができる

### chef serverにcookbookをアップロード
cookbookを更新する度に実行する

```
$ knife cookbook upload learn_chef_apache2
```

### knife bootstrapで初期設定
chefをサーバーにダウンロードして、cookbookを実行してくれる

```
$ knife bootstrap {address} --ssh-user {user} --sudo --identity-file {identity-file} --node-name node1 --run-list 'recipe[learn_chef_apache2]'
```

### knife sshで、nodeでcookbookを実行

```
$ knife ssh {{address}} 'sudo chef-client' --manual-list --ssh-user {{user}} --identity-file {identity-file}
```


### berkshelf
berkshelfを使うとChef Supermarketからcookbookを依存関係を含めてダウンロードできる。

```
berks install
```

また、chef serverにcookbookをアップロードできる。
```
berks upload
```
Docker コンテナ構築 ハンズオンに参加してきた

[Docker コンテナ構築 ハンズオン](http://eventdots.jp/event/562953) に参加してきたので内容をメモっておきます。

思い出しながら書いたメモなので一部内容が間違ってるかもしれないので違っていたらコメントなどください

## ハンズオンについて

ハンズオンをしてくださったのは @launcher_test さん
当日ハンズオンで発表された資料は[speakerdeck](https://speakerdeck.com/yapodu/docker-hands-on)に上がってた
またハンズオン内で使用したリポジトリは https://github.com/yapodu/hands-on_Docker

## 内容

ハンズオンの内容は資料の内容まんまだけれど一応まとめると以下のような感じ

- 環境は参加者ごとにVPS?環境(確かさくらVPSとのこと)を用意してあって、そこにssh接続して作業
- ホストOSはCentOS
- はじめにdockerをホストOSにインストールして起動
- 次にCentOSのdockerを立ち上げてattach -> 手動でapacheをインストールして起動をブラウザで確認するところまで
- 確認ができたらこのコンテナをcommit
- 余談だがdocker 1.3 から使えるようになった `docker exec` コマンドが便利とのこと
- commit したコンテナを使って新たなコンテナを起動して動いてるのを確認
- 次にDockerfileを使ってコンテナを起動、commit
- さらにホストOSとコンテナのI/Oの速度の違いを[fio](http://freecode.com/projects/fio/)というツールを使って検証
- fioを使っての検証結果からdockerコンテナ内にファイル書き込みをするのはおすすめできないからdockerのvolumeとfluentdを使ってホストOSのvolumeをマウントしてるディレクトリにファイル書き込みを行うようにするように設定(docker 1.8 から [Fluentd Logging driver](https://github.com/docker/docker/pull/12876) が追加されるのでもしかしたらこれを使うのがスタンダードになるかもしれないとのこと)

## Q&A

ハンズオンが終わったあとのQ&Aはこんな感じだった

- dockerを使う上でI/O以外に気をつけたほうがいいことは？
    - ポートを複数開けると通信が遅くなる？(ちゃんと聞き取れてなかった)とのこと
- dockerの監視をどのようにおこなっている？
    - 実際にdockerを使って運用してるサービスではdockerが立ち上げてる各コンテナの開放ポートを監視することでコンテナの監視を行っているとのこと
- dockerコンテナのprovisiningで複雑な設定をしたいときにDockerfileだとやりにくそう…
    - 1つのdockerコンテナにあまり複雑な仕事をさせるべきではないと考えてるとの事なのでそもそもDockerfileに複雑な設定を書くべきではないとのこと
    - アプリケーションの設定上ある程度複雑な設定が必要な場合は設定済みのコンテナをcommitして、Dockerfileではcommitしたコンテナを使うことでシンプルな記述にするべき
- dockerがセキュリティ的にマズイと言われてるのはどんなところ？
    - dockerプロセスの起動がrootでしかできなくて、dockerコンテナからホストOSを乗っ取る操作ができるからとのこと(方法は聞いてなかった…[これ](http://qiita.com/hikoma/items/8fbfb4f783d31e66b228)かな？)
    - またDocker Hub に登録されてるコンテナがセキュリティ的に未検証のものが多いからとのこと

## 感想

今までネットの情報を見ながら軽くいじったくらいしかなかったので説明してもらいながら基本的な操作の一通りを経験できたのがよかった。
あと監視周りとか実際に運用していく上での疑問を質問できたのでかなり勉強になった！
DebianとiPhoneを L2TP+IPsec（NAPT-NAPT間）接続

#いきさつ
平文の無線LAN対策にVPNが欲しいだけで…
世の中たくさん記事があるけど、うまく行かず。サービス借りるの高いし、無料はまた不安だし。
IDCFクラウドさんなら月額500円未満でもサーバ作れるから使ってみました。（500円からってなってるけど、ストレージ削ると500円切るよね）

今回はL2TP+IPsecが必須。iPhoneから繋ぎたいから。
OpenVPNは専用クライアントだし、PPTPは脆弱なので選択から外しました。

#試したもの
1. Debian 6 (GlobalIP) + Openswan + xl2tpd
2. Debian 6 (GlobalIP) + strongswan + xl2tpd

3. Debian 7 (PrivateIP) + Openswan + xl2tpd
4. Debian 7 (PrivateIP) + strongswan + xl2tpd
5. Debian 7 (PrivateIP) + Softether VPN **（成功）**

#構成
環境はこんな感じでNAPT間で悩む人はこれが最短かも。

Server 10.3.x.x
　　　|
Global IP(NAPT)
　　　|
　Internet
　　　|
Global IP(NAPT)
　　　|
Client 10.x.x.x
　　　|
　　iPhone

サーバもNAPT配下、クライアントもNAPT配下です。
サーバ側はちゃんとポートフォワーディング設定が必須。

#結果
1〜4は撃沈しました。

IPsecのハンドシェイクができたりできなかったり。特にOpenswanのバージョンにハマったんだけど、sourceからは入れたくないから諦めた。

しかしSoftether VPNを試すと10分で完了！今までの時間なに？！
sourceから入れないってのを撤回です。

#やったこと
Softetherのサイトからsourceをダウンロードしてmakeだけ

```sh:shell
# wget http://jp.softether-download.com/files/softether/v4.18-9570-rtm-2015.07.26-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.18-9570-rtm-2015.07.26-linux-x64-64bit.tar.gz
```

```sh:shell
# tar zxvf softether-vpnserver-v4.18-9570-rtm-2015.07.26-linux-x64-64bit.tar.gz -C /usr/local/
```
```sh:shell
# cd /usr/local/
# make
```

そして起動ファイル

```sh:/etc/init.d/vpnserver
#!/bin/sh
### BEGIN INIT INFO
# Provides:          vpnserver
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: SoftEther VPN Server
# Description:       SoftEther VPN Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

test -x $DAEMON || exit 0

case "$1" in
  start)
        $DAEMON start
        touch $LOCK
        ;;
  stop)
        $DAEMON stop
        rm $LOCK
        ;;
  restart)
        $DAEMON stop
        sleep 3
        $DAEMON start
        ;;
  *)
        echo "Usage: $0 {start|stop|restart}"
        exit 1
esac

exit 0
EOT
```

あとはiptablesの開放とWindows版のマネージメントツールからアカウント追加とL2TP、NATの有効化くらい。（コマンドラインベースのマネージャーは使いづらいのでGUIに頼りました）

VPN用のIPは勝手に設定されて192.168.xx.xが付与されました。
証明書ベースでなくて簡単にVPNってだけならこれでいいです。

今回はサーバ側が直接グローバルIP持っていなくて
NAPT配下ってところが少し悩みどころ？
追加でアドレス契約するのもなんなので（IDCFさんごめんなさい）こんな構成になりました。

元々IDCFさんが用意しているVPNがiOS未対応のまま放置されてるの…
これが使えたら一番簡単だった？

ポートフォワーディングも500/udp, 4500/udpだけしとけば
あと全部クローズで問題なし。
unity > debug > Consoleのクリア

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

直近の表示だけわかりやすいようにするためコンソールのクリアをしたい。

http://answers.unity3d.com/questions/707636/clear-console-window.html

以下のようにClearConsole()を用意してそれを使えばいい。

```csharp
using UnityEditor;
...

	[MenuItem ("Tools/Clear Console %#c")]
	static void ClearConsole() {
		var logEntries = System.Type.GetType("UnityEditorInternal.LogEntries,UnityEditor.dll");
		var clearMethod = logEntries.GetMethod("Clear", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);
		clearMethod.Invoke(null,null);
	}

	public void CompareClick() {
		ClearConsole ();
		Debug.Log ("test1");
		Debug.Log ("test2");
	}
```
絶対に安全なパスワードを生成したい

副題: 128 bit 乱数は意外に短いし扱いやすい

# TL;DR

絶対に安全なパスワードを生成するワンライナー

```
$ ruby -r securerandom -e "puts SecureRandom.urlsafe_base64"
```

# 安全なパスワード長

総当たり攻撃に対しては、128 bit あれば 2030 年ごろまでは安全だと言われているようです。

鍵長・アルゴリズムと耐用年数がひと目で分かる便利サイト: http://www.keylength.com/en/

# 128 bit 乱数

Ruby には暗号論的に大丈夫な乱数を作る SecureRandom モジュールがあります。

出力は base64 でも hex でも binary string でも、デフォルトで 128 bit 乱数を生成してくれるので安心です。

```
pry > require 'securerandom'

pry > SecureRandom.urlsafe_base64
=> "V0Tthv9uo_KK-4rHvcmeoA"

pry > SecureRandom.hex  
=> "6e02f273b7954e8fe00741ca8d50234a"

pry > SecureRandom.random_bytes
=> "\xEE\vk#\xB9\x04\x9D\xCC\xA7\xB4%\xC7\xAFt\xB6\\"
```

# 意外に短くて扱いやすい

128 bit って聞くと長いイメージがあるけど、base64 エンコードなら **たった 22 文字** です。

中途半端に 8 文字の乱数で記号混ぜたりするよりもよっぽど扱いやすくて、安心です。
lambda厨。または暴走lambda。

# ここでの’厨’の定義

- それをつかえる隙があればどこでもつかってしまう
- 釘を打つためのハンマーなのに、ハンマーもったらすべて釘にみえてしまう
- やらないほうがいいとわかっていても、やってしまう


# lambdaさえつかえればなんでもよかった

## 一時変数をどんな場合でもconst化するためにやった

```cpp:before
int score = 0;
// Rank が100なら10
if ( Rank == 100 ) {
  score = 10;
}
// 50~99なら5
else if( Rank < 100 && Rank >= 50 ) {
  score = 5;
}
else {
  score = 1;
}
return score;
```

```cpp:lambdar
const int score = [Rank]() {
  if ( Rank == 100 ) {
    return 10;
  }
  else if( Rank < 100 && Rank >= 50 ) {
    return 5;
  }
  return 1;
}();
return score;


// または、、、

return [Rank]() {
  if ( Rank == 100 ) {
    return 10;
  }
  else if( Rank < 100 && Rank >= 50 ) {
    return 5;
  }
  return 1;
}();
```

## 外部から振るまいを変えたくてやった

```cpp:before
class JibaNyan
{
public:
  void Say() { cout << "ジバニャンだニャイーン！" << endl; }
  YokaiType Type() { return YokaiType::Purichie; }
}

class RoboNyan
{
public:
  void Say() { cout << "ロボニャンだ！" << endl; }
  YokaiType Type() { return YokaiType::Goketsu; }
};
```

```cpp:lambdar
#include <functional>
typedef std::function<void()> SayFunction;
typedef std::function<YokaiType()> TypeFunction;

class Yokai
{
public:
  Yokai( SayFunction say, TypeFunction type)
  : _say(say), _type(type) {}
  void Say() { _say(); }
  YokaiType Type() { return _type(); }

private:
  SayFunction _say;
  TypeFunction _type;
}

void usecase
{
  Yokai J([](){ cout << "にゃいーん！"; }, [](){ return YokaiType::Prichie; });
  J.Say();  // にゃいーん！

  Yokai R([](){ cout << "I'll be back!"; }, [](){ return YokaiType::Goketsu; });
  R.Type();  // YokaiType::Goketsu
}
```

## CString::FormatがMutableすぎたからやった
```cpp:before
CString hello;
hello.Format("わたしの名前は%sです", name);

// ...helloに関係ないなにか

hello = "";  // 消える！
```

```cpp:lambdar
const CString hello = [name]() {
  CString fmt;
  fmt.Format("わたしの名前は%sです", name);
  return fmt;
}();

// ...helloに関係ないなにか

hello = "";  // error!！
```

```cpp:lambdar_case2
const auto MyNameIs = [](LPCTSTR name) {
  CString fmt;
  fmt.Format("わたしの名前は%sです", name);
  return fmt;
};

const CString hiroshi_say = MyNameIs("Hiroshi");
const CString masa_say = MyNameIs("Masa");
```

おぼえるのは時間のラ無駄ァ！