OmniAICreator/Qiita-1.07M huggingface dataset:
Pentaho用語集

用語集。そのうち埋めていく予定。。

- Mondrian
    -  Analyze all your data in real-time.
    -  An open source Online Analytical Processing server (OLAP) written in JAVA.
- Kettle
    - PDI(Pentaho Data Integration)参照。
- BI Server
    - Business Intelligence Server
    - sourceforgeに行くと、最新のダウンロードがPDIになっているので、どうもPDI(Kettle)と同義のよう。
- Reporting
- Weka
    - Data Mining参照。
- CDF
    - Community Dashboard Framework
    - http://wiki.pentaho.com/display/COM/Community+Dashboard+Framework
- CBF
    - Community Build Framework
    - http://wiki.pentaho.com/display/COM/CBF+-+Community+Build+Framework
- Saiku Analytics
    - https://github.com/OSBI/saiku
- Flash Charts
    - https://code.google.com/p/pentahoflashcharts/w/list
- Commons
    - http://wiki.pentaho.com/display/COM/The+Pentaho+Commons
- Data Access
    - http://wiki.pentaho.com/display/COM/Pentaho+Data+Access
- Agile BI
    - http://wiki.pentaho.com/display/AGILEBI/Welcome+to+Agile+Business+Intelligence
- Big Data
    - 
    - http://wiki.pentaho.com/display/BAD/Pentaho+Big+Data+Community+Home
- Product Management
    - http://wiki.pentaho.com/display/COM/Community+Wiki+Home
- Sparkl
- Data Mining
    - Wekaのこと。
- OLAP
    - online analytical processingの略。
- ETL
- Pan
- Spoon
- Kettle
- Sparkl
- CTOOLS
- JFree Report
    - Pentahoのレポーティングエンジン。元々Pentahoと独立したプロジェクトだったが、Pentahoが吸収した。
- PDI
    - Pentaho Data Integrationの略。Kettleと同義。データの抽出・変換・ロードが出来る。
    - 原文は以下。Data Integration (or Kettle) delivers powerful Extraction, Transformation, and Loading (ETL) capabilities, using a groundbreaking, metadata-driven approach.
- Pentaho Analysis
    - Mondrianのこと。
- BA
    - Business Analyticsの略。
- JIRA
    - issue and bug tracking system.
Terminalから接続中のWi-Fiのパスワード確認する(macOS)

環境:**OS X Yosemite 10.10.4**

ターミナルを開き、以下のコマンドを入力する。
ポップアップ表示されるkeychainのロック解除を許可するとパスワードが表示される。
※ ssid_of_my_home_networkには自分が使用しているssidを挿入する。



``` bash
# 利用中のSSIDを表示
networksetup -getairportnetwork en0
# パスワードを確認
security find-generic-password -ga "ssid_of_my_home_network" -w
```

![20150720122513.png](https://qiita-image-store.s3.amazonaws.com/0/26393/5a6c2214-c29c-addf-e1ed-fe2245fb9987.png)


security コマンドは keychainと Security.framework に対するコマンドラインインターフェイス。
指定された keychain に対し、与えられた条件に合致するパスワード項目を検索し、内容を出力する。

自分の keychain に格納しているパスワードをssidで引いているので、すでに登録済みに Wi-Fi のパスワードなら済みなら出力可能。

## メモ
- keychainに保存されたwebページのパスワードを確認。

``` bash
security find-internet-password -gs "www.amazon.co.jp" -w 
```

- 接続可能なアクセスポイントの情報(SSID等)を確認。 

``` bash
/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport -s
```

## 参考URL
https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/security.1.html
http://www.labnol.org/software/find-wi-fi-network-password/28949/
arduinoでoled

オークションで手に入れた、oledをarduino unoにつないで見ました。


##写真
![MVC-002S.JPG](https://qiita-image-store.s3.amazonaws.com/0/18104/32b61edf-722f-0cc1-0f26-dc4026c73b67.jpeg)

##回路図
![old.PNG](https://qiita-image-store.s3.amazonaws.com/0/18104/9d5f99bb-cd21-2e41-f0e4-90c7346c3f52.png)

##サンプルコード
```
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 		4
Adafruit_SSD1306 display(OLED_RESET);
#define XPOS 			0
#define YPOS 			1
#define DELTAY 			2

void setup()
{
	display.begin(SSD1306_SWITCHCAPVCC, 0x3c);
	display.clearDisplay();
	display.display();
	display.setTextColor(WHITE);
}

void loop()
{
	display.clearDisplay();
	display.setTextSize(2);
	display.setCursor(0, 0);
	display.print("Display 1");
	display.setCursor(0, 25);
	display.setTextSize(4);
	display.print("Hello");
	display.display();
}

```
並列分散処理に必要なインスタンスの数を見積もる

「[リトルの法則]
(https://ja.wikipedia.org/wiki/%E3%83%AA%E3%83%88%E3%83%AB%E3%81%AE%E6%B3%95%E5%89%87)」という、待ち行列の待ち時間を計算するための計算式があります。
これを使って並列分散処理に必要なインスタンスの数を見積もることができます。

```
L = λW

L: 並行実行する数
λ: 秒間リクエスト数の平均
W: リクエストの処理時間の平均
```

```
L = λW / u

L: インスタンスの数
λ: 秒間リクエスト数の平均
W: リクエストの処理時間の平均
u: 1台当たりのスレッド数
```
unity > dictionary > 格納したkey,valueをデバッガで見る > keySlots / valueSlotsを見る

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

http://qiita.com/7of9/items/3a8d8f2791e5abc6ff34
で作っているソフトのデバッグにてDictionaryのkeyとvalueを見たいと思ったが、わからなかった。

以下の手順で確認できた。

## 方法1
1. MonoDevelopにて[実行]->[プロセスにアタッチ]->Unity Editor(Unity)にアタッチして
2. Dictionary読込み後にブレークするようブレークポイントを設定
3. Unityを実行し、手順2のブレークポイントまで実行する
4. 読み込みたいDictionary変数 (今回の場合 telbook )の上にマウスカーソルを持って行き表示される telbook の左側の▶をクリック (図1参照)
5. telbookのプロパティ?が展開されるので、その中から keySlots（図2参照)もしくは valueSlots の左側の▶をクリックすることで、それぞれの値を見れる


図1. 
![MonoDevelop_と_Assembly-CSharp_-_CheckButtonControl_cs__-_MonoDevelop-Unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/037ceb77-40f5-cd3c-53e9-a5e70b18620a.jpeg)

図2.
![MonoDevelop_と_Assembly-CSharp_-_CheckButtonControl_cs__-_MonoDevelop-Unityb.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/dfb20827-9e6c-3417-c12d-bc8f8e965221.jpeg)

##方法2
方法1がまどろっこしい。すぐに値が見たいという場合、方法1の手順3まで実行してブレークポイントで止めたあと、画面右下の「イミディエイト」を選択し以下のように入力する。

```
> telbook.keySlots[0]
```
そうすると0番目の値が返される (図3参照)。

```
"072988312"
```

図3
![Assembly-CSharp_-_CheckButtonControl_cs__-_MonoDevelop-Unity.jpg](https://qiita-image-store.s3.amazonaws.com/0/32870/007df4cb-34f3-cb1d-792b-9788201541c2.jpeg)
csharp > checkedステートメント: checked { 処理 } / checked演算子: checked(変数)

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.6 オーバーフローのチェック

本の例によると、<font color=red>checkedステートメント</font>ではステートメント内でオーバーフローがあると例外が発生するようだ。

```csharp
checked
{
  // ブロック全体でオーバーフローをチェック
  byte x = 255;
  ++x; // 例外が発生する
}
```

checked演算子では個々の変数に対してのオーバーフローチェックができるようだ。

```csharp
int x = 256; // byteの範囲に収まっていない
byte y = checked( (byte)x ); // 例外が発生する
byte z = unchecked( (byte)x ); // 例外は発生しない
```
csharp > switch > 数値のほかに文字列も判別できる

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.5 制御構文

> また、C#では、switchに渡す式として、数値のほかに文字列も使えます。文字列やNull許容型を使った場合は、caseラベルにnullを置くことも可能です。

```csharp
var s = Console.ReadLine();

switch (s.ToLower())
{
  case "one": return 1;
  case "two": return 2;
  case "three": return 3;
  case null: return -1:
  default: return 0;
}
```

C#を使える環境では上記のようにすることで、if文よりは可読性が高まりそう。

<hr>
(追記 2015/08/26)
@yuba さんのコメントをもとに上記のコードを以下のようにした。
[ideone](http://ideone.com/A1lp29)で動作確認できる。

```csharp
using System;

public class Test
{
	public static int checkString(string src) {
		switch(src?.ToLower()) {
			case "one": return 1;
			case "two": return 2;
			case "three": return 3;
			case null: return -1;
			default: return 0;
		}
	}
	
	public static void Main()
	{
		int res;
		res = checkString("one");
		Console.WriteLine("one:" + res.ToString());
		res = checkString(null);
		Console.WriteLine(":" + res.ToString());
	}
}
```

動作結果

```
Success	time: 0.05 memory: 23880 signal:0
one:1
:-1
```

もともとのコードでは`checkString(null);`を実行時にruntime errorが出ていた。
csharp > switch > フォールスルー (fall through)は禁止 > breakを書かないとエラー

引用: 即効入門 C#プログラミング すぐに現場で使える知識 by 中 博俊さんら
3.5 制御構文

> switchステートメントでは、breakのつけ忘れによるバグが常に問題になります。そこで、C#では、フォールスルー(caseラベルを超えてその下を実行すること）を禁止しました。breakステートメントなどを書かないとコンパイルエラーになります。

実際に以下のようなコードを書いてコンパイルエラーが出ていたが、上記の情報を得てからはエラー原因をすぐに発見できるようになった。

```csharp
switch(idx){
case 1:
   // process1
   break;
case 2:
   // process2
   break;
default:
   // process3
}
```

上記ではdefaultでbreakがないのでエラーが出る。


関連して思い出した Code Completeのfall throughの使い方を抜粋しておく。

```cpp
// Example 15-15. C++ Example of Documenting Falling Through the End of a case Statement
switch(errorDocumentationLevel) {
  case DocumentationLevel_Full:
    DisplayErrorDetails( errorNumber );
    // FALLTHROUGH -- Full...
  case DocumentationLevel_Summary:
    DisplayErrorSummary( errorNumber );
    // FALLTHROUGH -- Summary...
  case DocumentationLevel_NumberOnly:
    DisplayErrorNumber( errorNumber );
    break;
  default:
    DispayInternalError( "Internal Error 905: Call customer support.");
}
```
GitHub PagesでSSL(HTTPS)に対応する

##1) s/http/https/ の置換

まずソースに書かれた`http://`の部分を`https://`に置換します。ただし、外部スクリプトの一部は`http`でしか動かないものもあるので注意。

次に、`<head>`内に以下を追記。環境変数は`jekyll`のものです。

```html:head.html
<link rel="canonical" href="{{ site.url }}{{ page.url }}" />
```

`jekyll`の場合は、設定ファイルも例外なく`http`の部分は`https`に書き換えます。

```html:_config.yml
site.url = https://syui.github.io
```

##2) http > httpsへのリダイレクト処理

次に、`http`を`https`にリダイレクトする処理を`javascript`で書きます。以下は、`jekyll`での記述の仕方です。

```html:head.html
<script type="text/javascript">
{% if site.enforce_ssl %}
    var enforce = "{{ site.enforce_ssl }}";
    if ((enforce == window.location.host) && (window.location.protocol != "https:"))
    window.location = window.location.toString().replace(/^http:/, "https:");
{% else %}
    var host = "syui.github.io";
    if ((host == window.location.host) && (window.location.protocol != "https:"))
    window.location.protocol = "https";
{% endif %}
</script>
```

```html:_config.yml
site.enforce_ssl = syui.github.io
```

参考

[enforce SSL on production domain ](https://github.com/sunlightlabs/congress/commit/6426761a671d46df6fc5d2526bdaf506c39d789c)

3) EV SSL

ついでに関係ありませんが`EV SSL`の話をします。これを導入すると、アドレスバーが緑色になります。FirefoxやChromeなど。

SSLサーバ証明書には、信頼性の高い順に、「EV SSL証明書」「企業認証（OV）証明書」「ドメイン認証（DV）証明書」という種類があります。

これらは、SSL証明書を購入して登録しなければなりません。

[GeoGetSSL](https://www.gogetssl.com/)がおすすめらしいです。

以下の記事が登録までの手順を詳しく説明してくれています。

[年額8.85ドル（約1,100円）の SSLサーバ証明書「RapidSSL」を試してみる](http://akiyoko.hatenablog.jp/entry/2015/07/27/013148)
技術英語 > a Thursday in mid-May

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

> It was a Thursday in mid-May. (それは５月中旬のある木曜日のことでした)
>
> ...における不定冠詞は、「ある」と訳せ...

「技術英語」から外れる(「日常英語」である）が、気になったので憶えておく。
YAPC::Asia TOKYO 2015に行ってきた

[YAPC::Asia TOKYO 2015](http://yapcasia.org/2015/)にいってきました．
今年で最後ということらしいので，最初で最後のYAPCでした．

非常に充実した2日感でした．両日遅刻したのが悔やまれます…。
聴きたいセッションの会場がいっぱいで別のセッションを聴いたりしましたがどれも面白い内容でした．

本エントリーは聴講したセッションのうち気になったいくつかをピックアップし，それのざっくりとした概要とゆるい感想+αです．

## 聴講したセッションなど

### 1日目
* TBD
* 若手エンジニアたちの生存戦略
* うっかりをなくす技術
* LT
* 懇親会

### 2日目
* 実はホットでオープンなMicrosoft Azure
* Adventures in Refactoring
* オープンソースエンジニアのためのWindows入門
* LT
* クロージング

リアルタイムなtwitterでのつぶやきはこちら: https://twitter.com/kyohei_shimada

## 特に気になったセッション
### 1日目 13:10〜14:10 TBD

発表スライド: https://drive.google.com/open?id=0BwazarpZ-dOvNFAtOXZEcmQyblE
言わずと知れたRubyの__創始者__Matz氏の発表．
FAQとして「今，新しい言語を設計したらどんな言語にしますか？」を題材にして，Ruby反省(悪口！)を挙げていたのが印象的でした．

* Rubyの悪いところ: Perlの影響(なぜか拍手が起こる！)
    * "$=" など変数のようなグローバルに状態がわかるような変数は避けたほうがよかったとのこと
    * "Fixnum, Bignum", "String, Symbol", "Proc, Lambda"などの使い分けはさせずにRubyプログラマからは透過的に扱えるべきだった

とのこと．

確かに，Rubyを使っているときにほとんどFixnumとBignumを使い分けるシチュエーションは今のところ無いし，String, SymbolもActiveSupportにあるHashWithIndifferentAccessがあるように，特別使い分ける必要もないし，ProcとLambdaは引数の取り方やリテラルに違いはあるせいで使い分けをするものの．インターフェースはほぼ変わらないので，使い分けをさけ，型よりも振る舞いを重視することを考えると「なるほど！確かに！」という感じだった．

### 1日目 14:20〜15:20 若手エンジニアたちの生存戦略

社会人2年目なので聴いてきた．
なんと同期がディスカッションにいてびっくり(登壇者見てなかった！)

登壇者が最初にビールを一杯やってからディスカッションするというフリーダムっぷり
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">🍺&lt;ｶｼｭｯ <a href="https://twitter.com/hashtag/yapcasiaD?src=hash">#yapcasiaD</a></p>&mdash; Kyohei SHIMADA (@kyohei_shimada) <a href="https://twitter.com/kyohei_shimada/status/634596942434070528">2015, 8月 21</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

### 得られた教訓
* 若手と呼ばれてるうちの特権を利用しよう
* 生存戦略なし！未来のことなんてわからないので今を全力で生きれば未来が開ける
* 老害にならないために若い人の意見は聞こう

### 2日目 13:10〜14:10 Adventures in Refactoring

発表スライド: https://s3.amazonaws.com/dinosaur/refactoring+-+yapc+2015.pdf
これが自分の中でのベストトーク賞でした．
発表の内容自体は [YAPC::Asia 2015 リファクタリングの話 - omohayui blog](http://omohayui.hatenablog.com/entry/2015/08/26/004419)で非常にキレイにまとめてくださっていたので，そちらを是非御覧ください．

中でも印象的な点は「抽象化はDRY，文法の統一などは良いことだが，それだけをリファクタリングの動機とするのはよくないということ」でした．最近つらいコードを見る機会が増えていますが，なぜリファクタリングをするのかの原点に立ち返る必要があるなと思いました．
自分のことを振り返ると，スライドでいう「Developer Happiness」の総量を上げるためには，リファクタリングしたい理由を「チームのメンバーと共有できること」への努力や理解を得ることもものすごく大切になる気がしました(そのための:hocho:なのか！)．

Rubocopとかのwarningが減ったとかはMeasure Successになるのかは気になるところ．
共通のスタイルガイドという位置づけになるのかな？

## その他

学生時代に1,2日しか会っていなかった方と久しぶりにお会いした．
(お互いに忘れていたので，どこで会ったのかを思い出すまで5分くらいお互い質問攻めしましたｗ)
短い間でしたがさまざまなお話が聞けて楽しかったです．

## 最後に

発表者の方々，スタッフの皆様をはじめ，開催に尽力された方々ありがとうございました！ & おつかれさまでした！
GKRandomSourceの基本的な使い方

iOS9 で追加されたGameplayKitの乱数生成器の使い方のまとめ

```swift:random
// 初期化
let random:GKRandomSource = GKRandomSource()
// シャッフル対象の配列を初期化
let arr:Array<Int> = [1,2,3,4,5,6,7,8,9,0]
// シャッフルして表示
print(random.arrayByShufflingObjectsInArray(arr))
// => [5, 4, 6, 2, 9, 7, 0, 1, 8, 3]
```



おおまかに上記のように使う。

初期化の部分を切り替えることで、乱数生成器を切り替えることが可能。
用意されているのは下記の3つ

GKARC4RandomSource
GKLinearCongruentialRandomSource
GKMersenneTwisterRandomSource

それぞれarc4random、線形合同法、メルセンヌ・ツイスタを乱数生成器として用いているようだ。
上記3つの乱数生成器は場合によって使い分けるのが良いのだろう。

参考
[擬似乱数というかarc4random()の話。](http://quesera2.hatenablog.jp/entry/2015/07/08/014248)
[良い乱数・悪い乱数](http://www001.upp.so-net.ne.jp/isaku/rand.html)
Rubyで和暦・旧暦を扱うライブラリ (パースもできるよ！)

# Yet another ruby 和暦ライブラリ

Pure ruby な日本の和暦を扱うライブラリ、名前はまんま "**[wareki](https://rubygems.org/gems/wareki)**" を作りました。割と網羅的な物になったと思うので、ぜひ使ってみて下さい。

[コードと README は github に置いてあります](https://github.com/sugi/wareki)。

# 特徴

 * 和暦と西暦を相互変換
 * 日本語の日付文字列をパースして Date に
 * 元号は大化から全部サポート
 * 旧暦は445年からサポート
 * 特殊記法（旧字体、略字、月の別名、晦日や朔日など）対応

# コードサンプル
## 簡単な例

require 'wareki' すると、標準ライブラリの Date クラスの parse と strftime を上書きします。（もしこの挙動が嫌な場合は wareki/date を直接 require してください。）

```rb
d = Date.parse("平成二七年 08月 ２２日")
d.strftime("%F")   # => "2015-08-22"
d.strftime("%JF")  # => "平成二十七年八月二十二日"
d.strftime("%Jf")  # => "平成27年8月22日"
```

普通にパースして、strftime で出力できます。フォーマット文字列は色々ありますので、[ドキュメントを参照してください](https://github.com/sugi/wareki#%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88%E6%96%87%E5%AD%97%E5%88%97)。

まあ、半角数字で出る`%Jf` (例: 平成27年8月22日) と、全部漢数字の `%JF` (例: 平成二十七年八月二十二日) があれば大体困らないと思います。

## パース

旧暦を含むの日本語の日付文字列パースして、組み込み Date オブジェクトに変換できます。この時、慣例的に使われていたい色々な表記も解釈できます。(標準では Date::ITALY な Date オブジェクトに変換しますが、第3引数の start に改暦日を渡せます。)

```rb
Date.parse("㍻一〇年 肆月 晦日")    # => #<Date: 1998-04-30 ...
Date.parse("安政七年 弥生")        # => #<Date: 1860-03-22 ...
Date.parse("元仁元年閏七月朔日")    # => #<Date: 1224-08-17 ...
Date.parse("萬延三年 ５月 廿一日")  # => #<Date: 1862-06-18 ...
Date.parse("皇紀二千皕卌年")       # => #<Date: 1580-01-17 ...
```

## 和暦・旧暦へのフォーマット

日本では明治5年まで、グレゴリオ暦でもユリウス歴でもない旧暦が使われていました。これもフォーマット文字列経由で透過的に扱えます。

旧暦の場合の月日 (`%Jm`, `%Jd`) と、グレゴリオ暦やユリウス暦での月日 (`%m`, `%d`)は違うものを出力します。

こんな感じ。

```rb
d = Date.civil(1860, 4, 7)
dj = d.new_start(Date::JULIAN)
d.strftime                     # => "1860-04-07" (グレゴリオ暦)
dj.strftime                    # => "1860-03-26" (ユリウス暦)
d.strftime("%Jf")              # => "安政7年3月17日" (日本の旧暦)
d.strftime("皇紀%Ji年%Jm月%Jd日") # => "皇紀2520年3月17日" (日本の旧暦で神武天皇即位紀元年)
```

## もっと

基本的には直接扱う必要はありませんが、Date::Wareki を直接扱うともうちょっと細かいこともできます。ただし、ここのドキュメントはまだ未整備です。

```rb
wd = Wareki::Date.new("天和", 3, 5, 4, true)
wd.leap_month? # => true (閏月かどうか)
wd.era_name    # => "天和"
wd.era_year    # => 3 (その元号での年)
wd.year        # => 1683 (旧暦の年)
wd.jd          # => 2335942 (ユリウス日(JDN))
wd.to_date     # => #<Date: 1683-06-28...
```

# リファレンス

最初は「ユリウス歴って何？」という状態だったので、調べながら作っていて凄く面白かったです。興味がある人は以下のURLを読んでみると楽しいかもしれません。

 * [ユリウス通日 - Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A6%E3%83%AA%E3%82%A6%E3%82%B9%E9%80%9A%E6%97%A5)
 * [旧暦 - suikawiki](http://wiki.suikawiki.org/n/%E6%97%A7%E6%9A%A6)
 * [元号一覧 (日本) - Wikipedia](https://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_%28%E6%97%A5%E6%9C%AC%29)
 * [太陰太陽暦と歴史表記、乱暴な明治改暦](http://www.ganshodo.co.jp/mag/moon/files/m_c101.html)
 * [明治改暦の周辺事情・国家財政の危機？(No.0103)](http://koyomi8.com/reki_doc/doc_0103.htm)
Rubyで＋演算子を再定義する

## はじめに

* `Ruby`では`+`演算子をはじめ、様々な演算子が再定義可能
* `1+2`の結果が`100`なんていうめちゃくちゃな定義も可能

## コード

```rb:new_plus_operand.rb
class MyString
  # インスタンス変数valueにアクセスできるようにする
  attr_accessor :value

  # コンストラクタ
  def initialize(new = 'sample')
    @value = new
  end

  # +演算子の再定義
  def +(target)
    # targetがMyStringクラスでなければエラーを返す
    return 'error' unless target.is_a?(MyString)
    # この+演算子を使用するとviaが付くようになる
    "#{@value}#{target.value} via new plus operand"
  end
end

# 普通のStringクラスの+演算子
puts '普通の文字列結合'
a = 'aaa'
b = 'bbb'
p a+b
puts

# 新しく定義したMyStringクラスの+演算子
c = MyString.new('ccc')
d = MyString.new('ddd')
e = MyString.new()
puts '各オブジェクトの中身を確認'
p c.value
p d.value
p e.value
puts '新しく定義した文字列結合'
p c+'a'
p c+1
p c+d
p c+e
```

## 結果
<pre>
普通の文字列結合
"aaabbb"

各オブジェクトの中身を確認
"ccc"
"ddd"
"sample"
新しく定義した文字列結合
"error"
"error"
"cccddd via new plus operand"
"cccsample via new plus operand"
</pre>

## 問題1
1+1の時だけ100になるように+演算子を再定義してみましょう。
新しくMyFixnumを定義しても良いしFixnum自体を上書きしても良い。

## 問題2
+演算子を再定義して加算の結果が3の倍数と3の数字がつく時だけ`アホ`を返すようにしてみましょう。

<pre>
10+1 => 11
10+2 => 'アホ'
10+3 => 'アホ'
10+4 => 14
10+5 => 'アホ'
</pre>

## おわりに

今回は新しくMyStringという新しいクラスを定義してそこの演算子を定義しましたがStringクラスの+演算子を再定義することも可能です。
根本の動きから変更してしまうので十分注意して使用するべし。

## Appendix

私が問題を解いたものを解答例として載せる

### 問題1解答例
```rb
class Fixnum
  # +演算子を再定義する前に後で使用するために保持しておく
  alias_method :old_add, :+

  def +(target)
    return 100 if(self == 1 && target == 1)
    self.old_add(target)
  end
end

p 1+0
p 1+1
p 1+2
p 1+3
```
結果
<pre>
1
100
3
4
</pre>

### 問題2解答例
```rb
class Fixnum
  # +演算子を再定義する前に後で使用するために保持しておく
  alias_method :old_add, :+

  def +(target)
    result = self.old_add(target)
    # 3の倍数か3が含まれている時
    if(result % 3 == 0 || result.to_s.include?('3'))
      return 'アホ'
    else
      return result
    end
  end
end

10.times do |i|
  p 10+i
end

```
結果
<pre>
10
11
"アホ"
"アホ"
14
"アホ"
16
17
"アホ
</pre>
chromeで擬似的に「タブを複製」をするショートカット


タブを複製するというピンポイントのショートカットがなく、いつもやっているので共有しておきます。

macであれば、`command + l`でchromeの検索バーが選択状態になるので、その後`command + shift + return`で新しく現在表示しているページのタブが生成されます。

windowsの場合、`ctrl + l`, `alt + enter`で確か大丈夫です。
SublimeTextでタブとスペースを変換するショートカットを設定


例えばmacなら、`View > Indentation > Convert Indentation to Spaces (か、 Tabs)`　でタブとスペースを変換できるのですが、デフォでショートカットキーが設定されていないのでやや不便です。

そこで、メニューバー（左上）の`Sublime Text > Preferences > Key Bindings - User` にて、以下の記述を追加するとラクに変換できるようになります。

```Default(OSX).sublime-keymap
[
	// スペースをタブに変換
	{ "keys": ["ctrl+shift+x"], "command": "unexpand_tabs", "args": { "set_translate_tabs": false } },
	// タブをスペースに変換
	{ "keys": ["ctrl+shift+y"], "command": "expand_tabs", "args": { "set_translate_tabs": true } }
]
```

- 参考
	- http://stackoverflow.com/questions/14388223/how-to-set-a-keyboard-shortcut-for-converting-from-tabs-to-spaces-in-sublimetext
itamaeでremote_fileを実行した際に「SCP did not finish successfully:  (Net::SCP::Error)」が出る場合の対処法



LinuxのディストリはScientific Linux 6.0です。

```bash
$ cat /etc/redhat-release
Scientific Linux release 6.0 (Carbon)
```

itamaeでremote_fileを実行した際に、下記のようなエラーが発生しました。

```bash
$ itamae ssh -h servername -u root recipes/vim_setting.rb --log-level debug

 INFO : Recipe: /Users/yuto/Work/vagrant/dahack/recipes/vim_setting.rb
DEBUG :   remote_file[/root/.vimrc]
DEBUG :     remote_file[/root/.vimrc] action: create
DEBUG :       (in pre_action)
DEBUG :       Sending a file from '/Users/yuto/Work/vagrant/dahack/recipes/remote_files/vimrc' to '/tmp/itamae_tmp/1440518054.496387'...
/Users/yuto/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/net-scp-1.2.1/lib/net/scp.rb:365:in `block (3 levels) in start_command': SCP did not finish successfully (127):  (Net::SCP::Error)

```


[Stackoverflow](http://stackoverflow.com/questions/4465690/netscperror-scp-did-not-finish-successfully)によると、該当するファイルが存在しない場合にこのエラーが出るとのことでしたが、ファイル名やパスは間違っておらず、実行ユーザーのアクセス権も問題ありません。

該当するgemのコード（scp.rbの365）行目あたりを読んでみると、下記のようなコードが発行されていました。

```bash
scp -t /tmp/1440518054.496387
```

サーバーにログインして上記コードを実行してみると、そもそもscpコマンドがインストールされていないことがわかりました。

[CentOS 6.x/Scientific Linux 6.xサーバーへscpコマンドを使う場合](http://d.hatena.ne.jp/ytooyama/20110930/1317372389)

上記ブログによると、最小構成でインストールしたScientific Linuxにはscpコマンドがインストールされない、とのこと。
scpはopenssl-clientパッケージに含まれているそうなので、remote_fileを実行するレシピの前にpackageでopenssh-clientsをインストールするように修正して解決しました。
Fabricがエラーが出て使えなくなった→バージョン変えたら改善


以前まで使ってたFabricが
pkg_resources.DistributionNotFound: paramiko!2.40, =>2.10 (バージョンのところは疎覚え)
とか、clangがなんかとか出て使えなくなりました。

pythonがイマイチ分からなくて敬遠してたんですが、一念発起。
pyenvで使用バージョンを2.7.6から2.7.8以上にすると問題の依存関係とか解決されると聞きつけ、藁をも掴む新情報と思いトライしました。

```
pyenv install 2.7.8
pyenv global 2.7.8
pyenv rehash
easy_install fabric
fab -v
```

これで解決しました。
バージョン代えてインストールし直しただけです。
はじめのインストールが簡単だけあって、何かあると困りました。

（簡単ですが、Qiitaに投稿してみることにチャレンジの回ということでよろしくお願いします。）
書籍「Haxeプログラミング入門」気がついた点・FlashDevelopセットアップで発生する不具合と対応など

　ちょっと試してみて、記述ミスや気付いた点があったのでメモ＆情報共有など。
　※メモは初版に対してです。改訂される場合があります。
***

# 誤字
P45
誤：[2]「index.hxml」という名前をつける。
正：[2]「index.html」という名前をつける。
***

# P24「FlashDevelop」のセットアップに関して、発生する不具合と対応
**：不具合**
【MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした。】エラー
**：対応**
「Microsoft Visual C++ 2010 再頒布可能パッケージ」をインストールする
> [『MSVCR100.DLL が見つからなかったため、アプリケーションを開始できませんでした。』解決メモ](http://d.hatena.ne.jp/yasuhallabo/20111105/1320504409)


**：不具合**
【Error details: System.BadImageFormatException: 間違ったフォーマットのプログラムを読み込もうとしました。】エラー
**：対応**
　JAVAが必要なのはもちろん、**OSが64ビットでもJAVAは32ビット版が必要**らしい。32ビット版JAVAのインストールと、JAVA_HOME の設定を行なう。
> [PATHの設定及び環境変数JAVA_HOMEの設定 - Javaダウンロードとインストール](http://www.javadrive.jp/install/jdk/index4.html)
> [Adobe Flash development workbench | すなのかたまり](https://msmania.wordpress.com/2014/08/16/adobe-flash-development-workbench/)
改行(\n)をスペースに置換するコマンド

##改行の置換

改行の置換は、非常に厄介です。改行を表す文字コードは、`CR+LF`などがそれにあたります。正規表現は、Linuxの場合は、`\n`です。Macの場合は、`\r`です。

注意としてはここでの`¥`は`\`(小文字)として読み替えてください。

コマンドによっても正規表現を認識するコマンドがいくつかあります。たとえば、`tr`です。

```bash
#改行をスペースに変える
tr '\n' ' '
```

しかしこれだと文字数が多い場合は無理です。この場合、`sed`を使いたいところですが、sedの場合は、非常に厄介です。こんな感じに`loop`を回す必要があります。

```bash
#linux
sed -e ':loop; N; $!b loop; s/\n/ /g'
#mac
sed -e :loop -e 'N; $!b loop' -e 's/\n/ /g'
```

これがPerlやRubyだとすごく楽にできます。流石です。

```bash
# Perlで改行を置換するワンライナー
perl -pe 's/\n/ /g'
```
gottyによるttyのブラウザ経由での共有

tty共有ツールの gotty を試してみました。
tty出力をhttp(ws)経由で出力し、(設定すれば)ブラウザからのキー入力を受け付けることも出来ます。

# gottyとは
## 開発者ページ

https://github.com/yudai/gotty

## 免責

(言うまでもないとは思いつつ)ttyを共有でき、また設定次第(-Wオプション)ではブラウザ画面からのtty操作も可能なツールです。接続制限範囲などにはじゅうぶん注意して下さい。

# gottyを使う

## インストール

homebrewで一発インストールです。

```
brew tap yudai/gotty
brew install gotty
```

## 起動

gottyを起動します。今回はお手本通りにtmuxで利用してみます。
ブラウザ接続の際のbasic認証として、ユーザーhoge:パスワードfugaを指定しています。
basic認証がそれほどの強度がないとしても入れておくことをおすすめします。

```
% gotty -c hoge:fuga tmux new -A -s gotty
```
```
2015/08/24 12:22:16 Using Basic Authentication
2015/08/24 12:22:16 Server is starting with command: tmux new -A -s gotty
2015/08/24 12:22:16 URL: http://::1:8080/
2015/08/24 12:22:16 URL: http://127.0.0.1:8080/
2015/08/24 12:22:16 URL: http://fe80::1:8080/
(以下略)
```
接続可能なURLが表示されます。
(以下略)の部分にIPv4/IPv6など接続可能なURLがひと通り出てきます。
ほぼノーガードで接続できますので接続範囲設定などにはじゅうぶん注意して下さい。

## tmuxなので操作コンソールも立ち上げましょう。

tmuxのセッションを借りて作業を出来る状態にします。
`gotty` なる名前のtmuxに接続します。

```
tmux new -A -s gotty
```

## 利用

http://localhost:8080/ に接続します。
先ほど指定した hoge:fuga を認証情報として利用すれば接続できます。
(Safariでの挙動が期待する状態ではなかったので、Firefox/Chromeで確認しました)

Enjoy!
Buffalo AirStationで内部ホストをインターネットに公開するときの注意事項

# 話の概要

AirStationの設定をミスってしまい、手元のストリーミングサーバ用ラズパイが**意図せず何でもアクセスできるSandbox**と化していたという、お粗末なお話がありましたので、注意事項を簡単にまとめてみました。

# シチュエーション

* 外部（インターネット側）からラズパイにhttpでアクセスできればOK!
* セキュリティを考え、外部からはtcp/10080でアクセスして、AirStationのNAPTでhttp(tcp/80)に捻じ曲げて渡したい。

# ポート変換のみでOK!!

以下、設定例です。

![bu1.png](https://qiita-image-store.s3.amazonaws.com/0/55302/e6c046c7-624f-dee6-ee1b-503551711ff2.png)


* AirStation側で待ち受けするポートを紐づける
   * プロトコル: [任意のTCPポート] 10080
* ラズパイのLAN側IPアドレスと、使用するポート番号を入力
   * LAN側IPアドレス: 192.168.1.100
   * LAN側ポート: 80 (tcp/udpの指定なし) 

これだけでOKです!!

→[設定詳細(buffaloのサイト)](http://buffalo.jp/download/manual/html/air9/router/whrg/chapter16.html)

# はまったポイント

必要かと思い、AirStationのDMZ機能でラズパイのIPアドレスを登録してしまいました。

![bu2.png](https://qiita-image-store.s3.amazonaws.com/0/55302/7b306080-7d21-9759-c2ca-159521416287.png)


結果、インターネットからルータ宛の通信をsshなどすべて(tcp/10080以外も!!)ラズパイに素通ししていたようです…

## DMZ機能は不要

DMZ機能をOFFにしても、外部(インターネット側)からtcp/10080でhttpに問題なくアクセスできることを確認。
特定のポートだけアクセス可にしたい場合は、ポート変換のみでOKなのが分かりました。

# ちなみに

## なぜSandbox化しているかわかったか？
たまたま、ラズパイの/var/log/auth.logを見て、sshのアクセス拒否のログが大量に記録されていたのが発端です。

理由がわかるまで、かなり悩みました…

## Sandboxでさらしていて大丈夫だったか？

**SSHを鍵交換認証必須にしていた**ため、特に不正ログインされた記録もなく、大丈夫でした。
やはり、セキュリティ対策は重要ですね…
ちなみに、ラズパイ(rapsbian)デフォルトIDの"pi"での試行記録は見つかりませんでした。案外メジャーなアカウント名ではないのかもですね。
この辺りは、別途纏めてみたいと思います。

以上、お粗末様でした…
vagrantのCent6にpostgres9.2をインストールする

勉強のため、PCにVirtualBox + Vagrantの環境でLinuxを用意した。
postgresql9.2を使いたかったのだが、標準で入っているパッケージが8.4だった。なので9.2を指定して入れる必要があるみたい。

###1. postgresql9.2をyumのリポジトリに登録する
`yum install http://yum.postgresql.org/9.2/redhat/rhel-6-x86_64/pgdg-centos92-9.2-6.noarch.rpm`
※URLは公式から参照した。
`/etc/yum.repos.d`にpgdg-92-redhat.repoがあることを確認

###2.postgresql9.2のインストール
`yum install postgresql94-server postgresql94-contrib`

###3.データベースの初期化
`service postgresql-9.2 initdb`

###4.postgresql起動
`service postgresql-9.2 start`

###5.確認してみる
`psql --version`
psql (PostgreSQL) 9.2.13　と表示された！やった！

参考にしたサイト
[CentOS6.6(x86_64)にPostgresql9.4をインストールする](http://opensourcetech.hatenablog.jp/entry/2015/07/14/CentOS6_6%28x86_64%29%E3%81%ABPostgresql9_4%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)
MacPortsでQt5のインストール場所

表題の件について少し困ったので，情報量が少ないですが，とりあえずのメモがてらに書いておきます．

```shell-session
sudo port install qt5-mac 
# sudo port install qt5-creator-mac
```

により， /opt/local/libexec/qt5-mac 以下にインストールされます．
`-v` オプションを付けて確認しました．

少し(`/opt` 以下も，ネット上も)探してみてもどこにインストールされた場所が見つからなかったので困っていたのでした．

qmake や，Qt Creator.app などは， `/opt/local/libexec/qt5-mac/bin` 以下にインストールされます．
何故，`/opt/local` 以下にインストールされないのだろう...
Brunch 有り／無しで Phoenix プロジェクトを生成してファイルの差分を見てみた

`mix phoenix.new PATH` に `--no-brunch` を渡すか渡さないかで生成されるプロジェクトがどう変わるかが気になったので調べた。

同名のプロジェクトを2つ、 Brunch 有りと無しで生成して `git diff` で差分を取った。

```bash:生成して差分を取るスクリプト
mkdir without_brunch with_brunch
( cd without_brunch ; yes n | mix phoenix.new sample --no-brunch )
( cd with_brunch    ; yes n | mix phoenix.new sample )
git diff --no-index --stat without_brunch with_brunch
```

```text:差分
 {without_brunch => with_brunch}/sample/.gitignore  |   10 +-
 /dev/null => with_brunch/sample/brunch-config.js   |   66 ++
 .../sample/config/config.exs                       |    2 +-
 .../sample/config/dev.exs                          |    2 +-
 .../sample/config/prod.secret.exs                  |    2 +-
 .../sample/lib/sample/endpoint.ex                  |    2 +-
 /dev/null => with_brunch/sample/package.json       |   12 +
 .../sample/priv/static/css/app.css => /dev/null    |   80 --
 .../sample/priv/static/favicon.ico => /dev/null    |  Bin 1258 -> 0 bytes
 .../priv/static/images/phoenix.png => /dev/null    |  Bin 13900 -> 0 bytes
 .../sample/priv/static/js/app.js => /dev/null      |    0
 .../sample/priv/static/js/phoenix.js => /dev/null  | 1196 --------------------
 .../sample/priv/static/robots.txt => /dev/null     |    5 -
 .../sample/web/static/assets/favicon.ico           |  Bin 0 -> 1258 bytes
 .../sample/web/static/assets/images/phoenix.png    |  Bin 0 -> 13900 bytes
 .../sample/web/static/assets/robots.txt            |    5 +
 .../sample/web/static/css/app.css                  |   80 ++
 .../sample/web/static/js/app.js                    |   21 +
 .../sample/web/static/js/socket.js                 |   62 +
 19 files changed, 259 insertions(+), 1286 deletions(-)
```

結果、 Brunch との統合を有効にすると、無効のものに比べて：

- brunch-config.js と package.json が追加されている
- .gitignore で web/static が無視されている
- web/static にあったファイルが priv/static に移動されている
- config/dev.exs で watcher の設定が追加されている

（config/{config,prod.secret}.exs, lib/$module/endpoint.ex の差分はランダムなトークン文字列の変化によるもので Brunch の有無とは関係ない）

config/dev.exs の差分の内容は以下のとおり：

```diff
diff --git a/without_brunch/sample/config/dev.exs b/with_brunch/sample/config/dev.exs
index e3f59b8..b5c7bb7 100644
--- a/without_brunch/sample/config/dev.exs
+++ b/with_brunch/sample/config/dev.exs
@@ -11,7 +11,7 @@ config :sample, Sample.Endpoint,
   debug_errors: true,
   code_reloader: true,
   cache_static_lookup: false,
-  watchers: []
+  watchers: [node: ["node_modules/brunch/bin/brunch", "watch", "--stdin"]]
 
 # Watch static and templates for browser reloading.
 config :sample, Sample.Endpoint,
```

`watchers` オプションの値は `[{command, [args...]}, ...]` の形式のリスト。 `mix phoenix.server` でサーバを起動すると指定したコマンドを実行する。
Sprayでscala-redisを使ってみる



どうも
今回はSprayでRedisを使ってしまおうというお話
主にScalaのRedis Clientである`scala-redis`についてです

SprayとRedisの用意はしておいて下さい


scala-redisの使い方なのでsbt使ってればSprayじゃなくても大丈夫です
Redisは必須です

まずはbuild.sbtに以下のコードを追加しましょう
`"net.debasishg" %% "redisclient" % "3.0"`

IntelliJを使っている方であれば追加したタイミングで保存してもらえれば勝手にIDEAがやってくれます

さっきのコードを追加したらほぼ終わったようなものです
アプリのrootディレクトリで

```
sbt
>update
>console
```

と入力してREPLで一旦Redisを操作してみます
Redisは立ち上げといて下さい

```
redis-server
redis-cli
127.0.0.1:6379>
```

ScalaのREPLで
まずはscala-redisをインポートします

```
scala> import com.redis._
import com.redis._
```
次にRedisに接続します

```
scala> val red = new RedisClient("127.0.0.1", 6379)
red: com.redis.RedisClient = 127.0.0.1:6379
```

最後は値のセットと取得です

```
scala> red.set("scala", "最高")
res0: Boolean = true

scala> red.get("scala")
res1: Option[String] = Some(最高)
```



ここまで出来たら次はRedisの対話モードで値が保存されているか確認しましょう
ここで
`get キー`

```
127.0.0.1:6379> get scala
"\xe6\x9c\x80\xe9\xab\x98"
```

おっと、最高な形ではなくなってしまいました
セッションのキーを保存する予定なのでマルチバイトは考えないことにします笑

`最高`が`saikoh`だったら

```
127.0.0.1:6379> get scala
"saikoh"
```

になっているだけです、最高です


次にSprayの中にも書いていきましょう

```
object Redis {
  import com.redis._

  val red = new RedisClient("127.0.0.1", 6379)
  def set(key: String, value: String): Boolean = red.set(key,value)
  def get(key: String): String = red.get(key).getOrElse("")
}
```

とりあえずこんなやつを書いて
Redisを立ち上げつつ

```
respondWithMediaType(`application/json`) { complete { s"""{"key scala": value is ${ Redis.get("scala") }"}""" } }
```

かっこ多杉内と思っている方ご安心下さい
大事なのはここだけです
`Redis.get("scala")`
Redisに保存してあるkeyがscalaというものの値を取得しています

上のレスポンスがブラウザ上でこうなります

```
{"key scala": value is 最高"}
```


どうですか
ScalaでRedisを使うのはかなり簡単でしたね
SlickでMySQLに繋ぐよりもはるかに単純で分かりやすいところが素敵です

参考
ここ見ればわかります
[scala-redisのGitHubページ](https://github.com/debasishg/scala-redis "scala-redisのGitHubページ")


Redisの公式にもクライアントはたくさん載ってあるので時間を見つけて他のクライアントもさわっていきたいと思います
http://redis.io/clients#scala



今回もかなり雑な説明でしたが以上になります
では
Windows Server 2016 TP3 での Docker (2) Azure上での環境構築 

# はじめに
Windows Server 2016 TP3 で Docker が使える環境を構築してみます。基本的には TP3 上でコンテナの機能を有効にするのですが、現時点(2015/8/25)では３つの方法が公開されています。

**設定済みの環境を利用する場合**

* Microsoft Azure で、設定済みの Windows Server 2016 TP3 仮想マシンを作成する

**自分で環境を構築する場合**

* Hyper-V上の VM として構築  
  Hyper-V ホスト上で MS が提供しているスクリプトを実行することにより、Docker ホストとして設定されたVMを作成できる。
* 物理・仮想マシン上で、コンテナを有効化する  
  Windows Server 2016 TP3 をインストールして、その上で MS が提供しているスクリプトを実行して、Docker ホストとして設定する。

今回は一番簡単な Microsoft Azure を活用する方法を試しました。

# 手順

Azure 上で VM を作るのですが、「Windows Server Container Preview Windows Server 2016 Technical Preview 3 Core Installation」というVMイメージが用意されているのでそれを選択します。
![Azure01.png](https://qiita-image-store.s3.amazonaws.com/0/79316/891e0f6b-c9fe-d19a-4bc4-7b26e231f2bb.png)

他に特別な設定は不要で、あとは通常通り VM を作成していきます。
![Azure02.png](https://qiita-image-store.s3.amazonaws.com/0/79316/f9f7010c-880a-7535-4e65-68a9d5976b0e.png)

VM の作成後、RDP に乗り込んでみるとこのような画面になってます。ServerCore としてインストールされているようで、コマンドプロンプトしか表示されていません。
![Azure03.png](https://qiita-image-store.s3.amazonaws.com/0/79316/10b3ea3a-7625-9589-1ce7-c62012ce71ed.png)

```docker version``` を実行してみます。まだ正式リリースされてない 1.9 が動作しています。
![Azure04.png](https://qiita-image-store.s3.amazonaws.com/0/79316/d9e8a0ac-603c-4840-5b30-dfc5c0360211.png)

```docker info``` を実行してみます。Docker Engine としては、特に Storage Driver と Execution Driver が Windows 固有の部分になりそうです。 

* Storage Driver はイメージのファイルシステムを扱うモジュールで、Linux では devicemapper や aufs などになります。 
* Execution Driver はコンテナを作成・管理するモジュールで、Linux だと native-0.2 などとなります。
![Azure05.png](https://qiita-image-store.s3.amazonaws.com/0/79316/ab6c4b4c-44f3-63cb-ca51-52279125ce13.png)

```docker images``` でイメージを表示させてみます。デフォルトで、ローカルに Windows のイメージがあります。
![Azure06.png](https://qiita-image-store.s3.amazonaws.com/0/79316/ffbeedb8-23f6-50a0-7dd2-4ba2d5b7d046.png)

最後にタスクマネージャで Docker Engine(Docker デーモン)を確認しておきます。"docker daemon" で起動されており、たしかにデーモンとして動作しています。
![Azure07.png](https://qiita-image-store.s3.amazonaws.com/0/79316/7c131838-39e3-b659-bf9d-0d06a1c7fbb9.png)

では、次回は実際に Windows 上でコンテナの起動や作成をしてみます。

# 参考サイト
https://msdn.microsoft.com/virtualization/windowscontainers/quick_start/azure_setup
Windows Server 2016 TP3 での Docker (1) 概要まとめ

2015/8/19(米国時間)に [Windows Server 2016 の Technical Preview 3(TP3) が公開](http://www.microsoft.com/en-us/evalcenter/evaluate-windows-server-technical-preview)され、Windows Server 上で Docker が使えるようになりました。

TP3 では、Windows Server にコンテナの技術が実装され、その上で動作する Docker Engine が提供されたことにより、Windows 上で Docker のイメージの実行や作成ができるようになっています。

以下では、Windows Server 2016 上のコンテナ/Docker について概要をまとめます。

# 概要

**Windows Server 2016 でのコンテナ技術は次の２つがあるが、今回実装されたのは Windows Server Container のみ。**

* Windows Server Container  
  Linux のコンテナ技術と同様。コンテナ間でカーネル部分は共有するが、名前空間によりコンテナを隔離する方式。
* Hyper-V Container  
  Hyper-V の技術を用いて、より強くコンテナ間を隔離する方式。各コンテナが Windows カーネルのコピーと、自身に割り当てられたメモリを持つ。

なお、Hyper-V Container の公開は 2015年年末～2016年と言われている。

**これらの2つのコンテナは、どちらも Docker API と Docker クライアントから操作可能。**
つまり、Windows Server Container だけでなく Hyper-V Container も Docker Engine で管理される。

![server-cloud-apr8-1.png-720x0.png](https://qiita-image-store.s3.amazonaws.com/0/79316/a0ccb370-39a7-28fc-3013-b23ed68c5905.png)
【[Microsoft Announces New Container Technologies for the Next Generation Cloud](http://blogs.technet.com/b/server-cloud/archive/2015/04/08/microsoft-announces-new-container-technologies-for-the-next-generation-cloud.aspx)から引用】

また、Docker API と Docker クライアントで操作できることから、Linux と Windows のコンテナを同じ Docker コマンドで管理できるだけでなく、オーケストレーションツールから Linux と Windows の両方の Docker ホストを管理できるようになると思われる。

**TP3 では、ほとんどの Docker コマンドが使えるようになっている**
ただし、まだ ```docker push``` はサポートされていない。

**Windows Server Container は、PowerShell でも操作可能**
ただし TP3 の段階では、PowerShell で作成したコンテナは Docker コマンドから管理できない、逆に Docker コマンドで作成したコンテナは PowerShell で管理できない、という制約がある。

**Windows の Docker イメージは、Windows Server Container と Hyper-V Container のいずれでも動作する**
例えば、DockerHub に Push された Windows のイメージは、修正なしでどちらのコンテナとしてでも動作させることができる。

**Linux の Docker イメージは、Windows Server 上では動作しない**
コンテナ技術はホスト側のカーネルを共有するので、まぁそうでしょう。

**Windows 版の Docker Engine は、Docker のオープンソースプロジェクトの一部として開発されている**
Docker プロジェクトは[ここで公開](https://github.com/docker/docker)されており、単一のコードベースから Linux 版と Windows 版の Docker Engine がビルドされている。

**Windows 版 Docker Engine が動作するのは Windows Server 2016 TP3 以降**
コンテナを実現するために Windows カーネルに修正が入っているが、その修正を利用可能なのが TP3 以降のため。

# 参考サイト

* http://blogs.technet.com/b/server-cloud/archive/2015/08/19/what-s-new-in-windows-server-2016-and-system-center-2016-technical-preview-3.aspx
* https://satonaoki.wordpress.com/2015/08/18/container-docker-windows/
* http://azure.microsoft.com/blog/2015/08/17/containers-docker-windows-and-trends/
* https://blog.docker.com/2015/08/tp-docker-engine-windows-server-2016/
* https://msdn.microsoft.com/virtualization/windowscontainers/containers_welcome
* http://blogs.msdn.com/b/msgulfcommunity/archive/2015/06/21/what-is-windows-server-containers-and-hyper-v-containers.aspx
* http://blogs.technet.com/b/server-cloud/archive/2015/04/08/microsoft-announces-new-container-technologies-for-the-next-generation-cloud.aspx
* http://cloud.watch.impress.co.jp/docs/news/20150820_717091.html
* http://news.mynavi.jp/news/2015/08/21/280/
* http://www.publickey1.jp/blog/15/linuxwindows_server_container.html
unity > fileIO > ファイルを一気にstringに読込む > string text = System.IO.File.ReadAllText("myfile.txt"); / 書込み > System.IO.File.WriteAllText("myfile.txt", line);

http://answers.unity3d.com/questions/279750/loading-data-from-a-txt-file-c.html

```csharp
string text = System.IO.File.ReadAllText("myfile.txt");
```

ファイルを一気に読んでから以下の処理と組み合わせばとりあえずcsvファイル読込みはできそう。
http://qiita.com/7of9/items/be98775f512babb63895


反対に書込みは以下でできそう。

```csharp
string line = "AAA,BBB";
System.IO.File.WriteAllText("myfile.txt", line);
```

Windows上で動かした時、VirtualStore関連はどうなるのかわからない。
とりあえずAndroidで動けば目的は果たせそう。
Pythonでsort uniq的なことをしたい


* よくLinuxマシンでsort uniqして重複分を消していたので、同じ事をPythonでしたかった
* 最初は下記のように書いていた

```Befor.py
previousHoge = ""
    for hoge in HogeList :
        if (hoge != previousHoge):
            print hoge
        previousHoge = hoge
```

* だがダサいので、もっとかっこいい書き方はないか探し、下記になった

```After.py
sorted(set(HogeList), key= HogeList)
```
レプリケーションを受けているMySQLを安全に停止したい

```sql
SET GLOBAL innodb_fast_shutdown=0;
stop slave IO_THREAD;
```

してから

```
show slave status\G
```

して`Read_Master_Log_Pos`と`Exec_Master_Log_Pos`が一致していることを確認する

一致していたら

```
stop slave all;
```

してから止める
unity > Dictionary > ContainsKey() / new() / add() / res = telbook[Key:string]

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

Dictionaryを使う。

参考
http://kazuooooo.hatenablog.com/entry/2015/05/17/140447
http://gamesonytablet.blogspot.jp/2012/12/unity_8031.html


```csharp
using System.Collections.Generic;

...
	private Dictionary<string,string> telbook = new Dictionary<string, string>();
...
	void testDic() {
		string key = "012345678";
		string value = "Myself";

		if (telbook.ContainsKey (key) == false) {
			telbook.Add (key, value);
			Debug.Log("added");
		}
		var res = telbook ["012345678"];
		Debug.Log (res);
	}
```

キーが登録されていない時だけDictionaryに追加する。
DataOutputStreamが遅い


DataOutputStreamでfloatのデータを大量に書き込みたい時に、

```java:
float[] data = ...;
DataOutputStream out = ...;

for(int i = 0; i < data.length; i++){
    out.writeFloat(data[i]);
}

```

というように書くのが常套手段ですが、これは非常に遅いです。何故遅いかを調べてみました。

#中の実装はどうなっているか

(ざっくり再現したコードで、JDKと全く同じではありません）

##floatをintに変換

書き込むためにはバイナリにしなければいけないため、float型の値を同じビットレイアウトで表現されたint型に変換されます。そのためにFloat#floatToIntBits(float)が呼ばれます。

```java:
float f = ...;
int v = Float.floatToIntBits(f);
```

##intをbyteに変換

JavaのOutputStreamは原則byteかbyte配列の書き込みしかサポートされていません。そのためintはbyteに変換されます。

```java:
float f = ...;
int v = Float.floatToIntBits(f);

byte b1 = (byte) ((v >>> 24) & 0xff);
byte b2 = (byte) ((v >>> 16) & 0xff);
byte b3 = (byte) ((v >>> 8 ) & 0xff);
byte b4 = (byte) ((v >>> 0 ) & 0xff);
```

##書き込む

最後に1byte毎に書き込みます。floatだけではなくintも同じ挙動になります。

```java:
float f = ...;
int v = Float.floatToIntBits(f);

byte b1 = (byte) ((v >>> 24) & 0xff);
byte b2 = (byte) ((v >>> 16) & 0xff);
byte b3 = (byte) ((v >>> 8 ) & 0xff);
byte b4 = (byte) ((v >>> 0 ) & 0xff);

out.write(b1);
out.write(b2);
out.write(b3);
out.write(b4);
```

#doubleだと・・・？

doubleやlongの場合も同じようなコードになりますが、OutputStream#write(byte[])が呼び出されるためかなり速いです。

```java:
double d = ...;
long v = Double.doubleToLongBits(d);

buffre[0] = (byte) (v >>> 56) & 0xff);
buffre[1] = (byte) (v >>> 48) & 0xff);
buffre[2] = (byte) (v >>> 40) & 0xff);
buffre[3] = (byte) (v >>> 32) & 0xff);
buffre[4] = (byte) (v >>> 24) & 0xff);
buffre[5] = (byte) (v >>> 16) & 0xff);
buffre[6] = (byte) (v >>>  8) & 0xff);
buffre[7] = (byte) (v >>>  0) & 0xff);

out.write(buffer);
```

#何が結局速いのか

自分が実装したコードでは、

1. intへの変換(Float#floatToRawIntBits(float)を呼び出す)
2. byte配列に直接書き込む
3. byte配列の終端に来たらOutputStream#write(byte[])を呼び出す

を行って高速化しました。面倒なのは1byte書き込むことに発生する境界チェックです。

もし書き込むデータが4bytes単位しかなく、バッファ用の配列サイズも4bytesの倍数であれば、floatの書き込み1回ごとに配列の境界チェックができます。
pythonのprint内で変数に代入されている数字や文字を表示する

Python初学者にとってprint文で変数とテキスト同時に表示したいと思って検索してもなかなかでないので簡単ではあるがここで解説したいと思う。

#変数xに代入された文字をprintで表示する
ここでは3つの方法を解説する。
1.テキスト＋変数を表記する
2.%dや%sといった変換指定文字を使う
3.format関数を使う


1.テキスト＋変数を表記する

```python:test1.py

x = 3
print "xは"+str(x)+"です"
 
```


```python:test1.py出力
'xは3です'
```

Xをstring型に変換するのを忘れないようにする。



2.%dや%sといった変換指定文字を使う

```python:test2.py

x = 3
print "xは%dです" % x
 
```

```python:test2.py出力
'xは3です'
```

またlocals()を使って以下のような書き方もできるらしいです。

```python:test2_1.py

x = 3
print "xは%(x)sです" % locals()
```


```python:test2_1.py出力
'xは3です'
```


3.format関数を使う

```python:test3.py

x = 3
print "xは{0}です".format(x)
 
```

```python:test3.py出力
'xは3です'
```

```python:test3_1.py

x = 3
print "xは{x}です".format(**locals())
 
```

```python:test3_1.py出力
'xは3です'
```


個人的には.format()が便利だと思う。formatは変数の型を気にしなくて良いし、変数が増えてきたら{0},{1}...というように増やしていけばいいだけ。後ろのformatは(変数1,変数2...)としておけば良い。

` 追記　2015/9/24にご指摘がありましたので訂正しました`
CircleCIでService Account使ってGAE/goへdeployする 

![c_to_gae.png](https://qiita-image-store.s3.amazonaws.com/0/15818/07bb6e5c-9965-e256-d277-e345a3eeee41.png)


CircleCIのDocumentにはGoogle App EngineへのDeploy方法が書いていますが
Googleのパスワードを入力することになるのであまり気持ちよくなかったので
なんとかServiceAccountからDeployできないか模索しました

# 環境
Mac os x
gae go sdk: 1.9.24

# ServiceAccountの作成

GCPのConsoleへ行きプロジェクトを開いてメニューから
[API Manager]->[認証情報]から[認証情報を作成]というボタンを押してService Accountを作成します。
作成した時鍵のエクスポートをするように促されます。
JSONでダウンロードしておきます。

# 鍵ファイルの暗号化と復号化用のスクリプトの用意
Gitで管理する際、鍵ファイルをリポジトリに含める場合は一応暗号化をしておきましょう

Travisだとこのへんはコマンドで簡単にできて楽してたんですが
コマンドラインツールは公式ではサポートされていないので自分で雑に用意しました。

https://gist.github.com/k2wanko/bc792b86f52dbe7f72e6

使い方は カレントディレクトリの直下にある.secretディレクトリ内のファイルを暗号化します。

```bash
# 暗号化したいファイルの作成
echo "チョココロネ" > .secret/important_confidential_documents
# 暗号化
$ SECURE_KEY=hogehoge script/encrypt
# .secret/important_confidential_documents.enc ができている
# 復号化
$ SECURE_KEY=hogehoge script/decrypt
```

gitignoreで.encだけをバージョン管理に含むように設定しておきましょう

CircleCIの方でSECURE_KEYという名前で適当な長さのランダムな文字列を入れておきます。

# プロジェクトとcircle.ymlの作成

お試し程度なら適当なDemoアプリでプロジェクトを作っておいてください

そしてcircle.ymlを作成します。

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
  environment:
    ACCOUNT: xxxxxxxxx@developer.gserviceaccount.com
    GAE_GO_SDK_VERSION: 1.9.24

dependencies:
  pre:
    - curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
    - unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
  override:
    - $HOME/go_appengine/goapp build
    - $HOME/go_appengine/goapp test -v ./...
    
deployment:
  appengine:
    branch: master
    commands:
      - script/decrypt
      - gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
      - gcloud preview app deploy --set-default --version=1
```

DemoアプリならこれでDeployまでできるのですが
gcloudコマンドのAppEngineのはまだpreview版で依存を解決してくれませんでした
つまり外部のフレームワークやパッケージを使っていた場合`gcloud preview app deploy --set-default --version=1`ではdeployできません

なので`appcfg.py`を使うのですが
今度は`appcfg.py`はサービスアカウントをそのままでは読み込んで使えないのでサービスアカウントからAccessTokenを取得します。

gcloud でアカウントが設定されていれば、以下のコマンドでトークンが取得できます。

```
$ gcloud auth print-access-token
```

後はcircle.ymlを修正しておしまいです

```yaml:circle.yml
machine:
  timezone:
    Asia/Tokyo
  environment:
    GAE_GO_SDK_VERSION: 1.9.24
    PATH: $PATH:$HOME/go_appengine

dependencies:
  pre:
    - curl -o $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip https://storage.googleapis.com/appengine-sdks/featured/go_appengine_sdk_linux_amd64-${GAE_GO_SDK_VERSION}.zip
    - unzip -q -d $HOME $HOME/go_appengine_${GAE_GO_SDK_VERSION}.zip

test:
  override:
    - goapp build
    - goapp test -v ./...
    
deployment:
  appengine:
    branch: master
    commands:
      - script/decrypt
      - gcloud auth activate-service-account $ACCOUNT --key-file ./.secret/key.json
      - appcfg.py update --oauth2_access_token $(gcloud auth print-access-token 2> /dev/null) .
```

自動でDeployできるようになりました
【Go】Go 1.3 から 1.5 へのアップデートでエラー

Go 1.5 がリリースされたとのことで、アップデートを試みました。
このとき、Go 1.3 からのアップデートで躓いたので残しておきます。

## サーバー環境
```bash
$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=12.04
DISTRIB_CODENAME=precise
DISTRIB_DESCRIPTION="Ubuntu 12.04 LTS"

$ arch
x86_64
```

## アップデート

[goを1.5にアップデートして1.4とベンチを取る](http://qiita.com/masahikoofjoyto/items/4ced298989e6ab346f15)

上記記事を参考にアップデートを行いました。
ソースをダウンロードし、all.bashを実行したときに、下記エラーが出ました。

```bash
$ ./all.bash
##### Building Go bootstrap tool.
cmd/dist
# _/tmp/go/src/cmd/dist
cmd/dist/test.go:164: undefined: os.Unsetenv
```

なかなかエラーについて調べてもわからなかったのですが、
[GVM で go1.5 のインストール](http://qiita.com/msaito3/items/3aef86e9864990b16b4c)
の記事に

> go1.5 からは、動作する go1.4 以上がブートストラップに必要になった。

と書いてあり、恐らくそこかな…と。
違っていたらすみません。

## とりあえず

面倒ですが、1.3 → 1.4 → 1.5 と順々にアップデートを行えば無事 1.5 にアップデートできました。
[Intel Edison] 起動したら自動で Wifi につながるようにする


Intel Edison を入手したら Switch Science さんの解説
[Intel Edisonを手に入れたらやること](http://trac.switch-science.com/wiki/IntelEdisonStart)
で Wifi で接続したあと、ssh でログインした状態で

`root@yuji-edison:~# systemctl enable wpa_supplicant`

とします。再起動して ifconfig で確認してみましょう。

```shell-session:
root@yuji-edison:~# ifconfig
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

usb0      Link encap:Ethernet  HWaddr   
          inet addr:192.168.2.15  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::9813:aeff:fee2:2f92/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

wlan0     Link encap:Ethernet  HWaddr (ここにMACaddrが表示される）  
          inet addr:(ここにアドレスが表示される)  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:240 errors:0 dropped:14 overruns:0 frame:0
          TX packets:188 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:27580 (26.9 KiB)  TX bytes:27011 (26.3 KiB)
```

usb0 というのは USB で接続しているイーサネットアダプタですので、これではありません。
wlan0 というのが Wifi 接続です。繋がってますね。めでたし。


ついでに時計合わせも最初にやったほうがよいですね。タイムスタンプがずれたファイルが存在すると、のちのちひどい目に会いそうです。
[Intel Edisonにntpdateコマンドをインストールする](http://qiita.com/yuyakato/items/81e1e1e70a43b90755e0)
こちらを参照のこと。

追記：時刻合わせについては [Intel Edisonの時刻合わせ（systemd-timesyncd,timedatectl）](http://qiita.com/CLCL/items/e991e23f4bdbca5ff28b) こちらを参照するのがよさそうです。CLCL さん、ありがとうございます。
SmalltalkからScratchをいじる(0) 状態の保存(イメージの説明)

Scratch 1.4 は Smalltalkで実装されており、モードを切り替えるとSmalltalkの開発環境を使うこともできます。
Smalltalkはとても自由度が高く、システムのコアな部分もいじることができます。その代償として壊れやすい環境でもあります。こまめな保存を心がけましょう。また、いじるまえの綺麗な環境も別途保管しておきましょう。

# イメージをコピーする
Scratchがインストールされたディレクトリにある"Scratch.image"を同じフォルダにコピーして名前を変えます。
![files.png](https://qiita-image-store.s3.amazonaws.com/0/12251/0742b46c-d024-84b9-0d49-3c51d98b68dc.png)
このファイルは"イメージファイル"と呼ばれ「現在の状態」が保存されています。

# イメージファイルを指定して、Scratchを開く
Scratchの実行ファイルに、**コピーしたイメージファイル**をドラッグ&ドロップしてください。
![dragndrop.png](https://qiita-image-store.s3.amazonaws.com/0/12251/899e678d-61ee-4bf8-6876-6b222cdcb3a4.png)
コピーしたイメージファイルを使って、Scratchを始めます。

# Smalltalkを使えるモードにする

1. Scratchを起動して、画面右上のSCRATCHのロゴの"R"の部分をShiftキーを押しながらクリックするとメニューが開きます。一番上の"turn fill screen off"をクリックします。
![1_turn.png](https://qiita-image-store.s3.amazonaws.com/0/12251/e749fea5-cded-c397-83ab-8593c91c0479.png)
    
2. Scratchのウィンドウの外側の背景が表示されます。背景部分をクリックするとメニューが表示されます。この状態がSmalltalkが使えるモードです。
![backgroud.png](https://qiita-image-store.s3.amazonaws.com/0/12251/1a8425a7-5360-b96a-41a6-f8c81b384034.png)

3. 元に戻すには、再度、SCRATCHのロゴの"R"の部分をShiftキーを押しながらクリックして、メニューが開きます。一番上の"turn fill screen on"をクリックすると元に戻ります。
![fill_screen_on.png](https://qiita-image-store.s3.amazonaws.com/0/12251/160d4b5e-b584-af39-6d8c-0e0f0f8e0c0e.png)

# 現在の状態を保存する

1. 再度Smalltalkを使えるモードにして、適当に「現在の状態」を変えてみます。スプライトの位置を変更してもよいですし、背景クリックからopen→workspaceで適当なウィンドウを開いてもよいです。
![open_something.png](https://qiita-image-store.s3.amazonaws.com/0/12251/f167d6fc-68d7-d911-0cd3-4cee0286ace4.png)

2. Smalltalkを使えるモードのまま終了すると、現在の状態を保存するかを聞かれます。Yesを選択すると保存されます。または、背景クリックから"save"や"save as"からも保存可能です。
![save_or.png](https://qiita-image-store.s3.amazonaws.com/0/12251/d3bae403-9a39-50a3-7197-172927959e04.png)

3. もう一度、さきほどのイメージファイルをドラッグ&ドロップで開くと、壊れたかのような表示になり、ダイアログが2回表示されますが、とりあえずOKをクリックしてください。※補足参照
![broken.png](https://qiita-image-store.s3.amazonaws.com/0/12251/f16826cc-62ac-2a4d-6fad-f6dde0ed4ad8.png)

4. 最後に保存した状態が再現されます。

# まとめ
Smalltalkはあらゆる状態がイメージファイルに保存されます。普通にScratchを使用している場合は状態の変更をイメージファイルに反映しないで破棄しています。このため、常に初期状態のイメージから起動するようになっています。

Smalltalkを使えるモードにすると、イメージの保存が可能になり、状態の再開が可能になります。逆にこのイメージで動くScratchは通常のScratchとは異なるものとなっていることに注意が必要です。改造したScratchで保存したScratchのプロジェクトを通常のScratchで実行した場合、改造部分に依存する処理がある場合は動作しません。


# ※補足 ソースコード付のイメージ
 先の警告のダイアログは、通常配布されているScratchはソースコードが入っていないための警告になります。
ソースコードつきイメージはこちらからダウンロード可能です。
http://wiki.scratch.mit.edu/wiki/Scratch_1.4_Source_Code

ただし、こちらのコード付のイメージはライセンスに注意してください。主要な項目の日本語での説明はこちらにあります。
http://itpro.nikkeibp.co.jp/article/COLUMN/20111019/371085/