OmniAICreator/Qiita-1.07M huggingface dataset:
Siv3Dでソナグラムをやってみる

ソナグラムと言えば，周波数スペクトルのパワーを時間軸で見れるようにしたグラフです．スペクトルの時間変化を確認したい時に使われます．

ソナグラムを確認するためのビジュアライザを作ってみたかったので，Siv3Dで作ってみました．こんな感じになります．

![無題.jpg](https://qiita-image-store.s3.amazonaws.com/0/32219/ad9f4844-17db-503e-ef96-615e335fbd7c.jpeg)


```cpp
# include <Siv3D.hpp>

void Main()
{
	const Font font(30);

	Window::Resize(1024, 1024);
	Recorder::SetBufferLengthBySec(s3d::RecorerSamplingRate::S44100, 60 * 5);

	Image image = Image(1024, 1024, Color(0, 0, 0));
	DynamicTexture texture = DynamicTexture(image);

	if (!Recorder::Start())
	{
		return;
	}

	int count = 1;

	while (System::Update())
	{
		if (Recorder::IsEnd())
		{
			Recorder::Restart();
		}

		Waving::FFT(Recorder::GetWave(), Recorder::GetPos(), Waving::SampleLength::Default);

		const float* p = Waving::FFTBuffer();

		for (int i = 0; i < Window::Height(); ++i)
		{
			image[i][count] = HSV(-log(p[i]) * 10);
		}

		//Texture(image).draw();
		texture.fill(image);
		texture.draw();

		Line(count, 0, count, Window::Height()).draw();
		if (++count >= 1024)
			count = 0;
		//count++;
	}
}

```

~~ちなみに，どうやらTexture(image).draw()を何度もやっていると，終了時にエラーが出て落ちるみたいです．一応，アセットが大量に生成と削除を繰り返している，と警告が出ていたので気になってはいたのですが案の定です．アセット周りの警告が出ないように設定を弄ったので，本当にまずい方法だったんですね（）~~

~~現状，あまり気にするようなデモではないのですが，気になる人は他の方法を考えたほうがいいのかもしれません．~~

DynamicTextureを利用したらうまく行きました．
Goのtime.Tickをselect caseで受ける時にdefault節を記述した場合の挙動メモ

## time.Tick とは？
* `time.Tick(<Duration>)` は __指定した間隔で時刻を配信する同期チャネル__ を返す関数
    * `tick := time.Tick(time.Millisecond)`した場合の`tick`は1ms間隔で時刻を送信する
* 通常のチャネル同様に`<-tick`で受ける
* チャネルなので`select case`文や`for t := range tick { ... }`文で受信処理が可能


## select caseでTickを受ける場合
* 結論から言うと __`select case`でTickを受ける場合は`default`節は書かないように！__


### default節なし

```go
package main

import (
  "fmt"
  "time"
)

func main() {
  tick := time.Tick(time.Millisecond * 1)

  go func() {
    for {
      select {
      case t := <-tick:
        fmt.Println("ticked", t)
      }
    }
  }()

  time.Sleep(time.Second)
}
```

* デモはこちら → http://play.golang.org/p/5OAsXaNXRB
* 期待通り、1ms毎にメッセージとTickから受信した時刻が出力される

### default節あり

```go
package main

import (
  "fmt"
  "time"
)

func main() {
  tick := time.Tick(time.Millisecond * 1)

  go func() {
    for {
      select {
      case t := <-tick:
        fmt.Println("ticked", t)
      default:
        fmt.Println("unticked")
      }
    }
  }()

  time.Sleep(time.Second)
}
```

* デモはこちら → http://play.golang.org/p/i3IwSN2cT3
* __Tickから受信するcase節が全く処理されず、`default`節の"unticked"ログがひたすら出力され続ける__


## 推測
* Tickを受けるselect caseに`default`節を記述した場合、処理が走った __その瞬間のタイミング__ で送受信可能なチャネルが無いと`default`節の処理が走る
* Tickに限らず、時刻配信系のチャネルは同様かも(`time.After`とか)
Goで外部リクエストが関わる処理をテストする

外部リクエストを含める処理の場合のテストの書き方
いわゆるリクエストのモックの作り方について。

例えば`fetch()`という外部のURLをGETで取得する関数があったとする。

```go:app.go
package main

import (
  "fmt"
  "io/ioutil"
  "log"
  "net/http"
)

func fetch(url string) []byte {
  res, err := http.Get(url)
  fmt.Println(url)
  if err != nil {
    log.Fatal(err)
  }
  defer res.Body.Close()

  body, err := ioutil.ReadAll(res.Body)
  if err != nil {
    log.Fatal(err)
  }
  return body
}

func main() {
  clientId := "<client id>"
  body := fetch("https://api.instagram.com/v1/media/popular?client_id=" + clientId)
  fmt.Printf("%s", body)
}
```

ただ、外部サービスへのリクエストは送りたくない。
その場合`httptest`パッケージを使って、特定のURLの場合に返すheaderの値を設定し
そちらのURLにリクエストを送信するという簡易なモックサーバーを作成する。

この場合[httptest](http://golang.org/pkg/net/http/httptest/)パッケージというものを利用してwebサーバーのモックを用意して
そこにアクセスするようにする

## 使い方

`func NewServer(handler http.Handler) *Server`を
使ってリクエストで返したいhandlerを登録する。

```go
  handler := func(w http.ResponseWriter, r *http.Request) {
    // Check request.
    if g, w := r.URL.Path, request.path; g != w {
      t.Errorf("request got path %s, want %s", g, w)
    }

    // Send response.
    w.Header().Set("Content-Type", request.contenttype)
    io.WriteString(w, request.body)
  }

  server := httptest.NewServer(
     http.HandlerFunc(handler),
  )
```

`app.go`を使うと以下のような感じ。(json parseは適当)

```go:app_test.go
package main

import (
  "encoding/json"
  "io"
  "net/http"
  "net/http/httptest"
  "testing"
)

type Response struct {
  path, query, contenttype, body string
}

func TestApp(t *testing.T) {

  response := &Response{
    path:        "/v1/media/popular",
    contenttype: "application/json",
    body: `{
      "meta": {
        "code": 200
      },
      "data": [{
        "attribution": null,
        "comments": {
          "count": 0,
          "data": []
        },
        "filter": "Normal",
        "created_time": "1407830189",
        "id": "785258998994306042_21773839"
      }]
    }`,
  }
  handler := func(w http.ResponseWriter, r *http.Request) {
    // Check request.
    if g, w := r.URL.Path, response.path; g != w {
      t.Errorf("request got path %s, want %s", g, w)
    }

    // Send response.
    w.Header().Set("Content-Type", response.contenttype)
    io.WriteString(w, response.body)
  }

  server := httptest.NewServer(http.HandlerFunc(handler))
  defer server.Close()

  res := fetch(server.URL + "/v1/media/popular")

  var media map[string]interface{}
  err := json.Unmarshal(res, &media)
  if err != nil {
    t.Fatal(err)
  }

  dataArr := media["data"].([]interface{})
  data := dataArr[0].(map[string]interface{})

  if data["id"] != "785258998994306042_21773839" {
    t.Fatal("Error")
  }
}
```

# まとめ

* `httptest`パッケージで任意のレスポンスを返すことが出来る
  * リクエストと、レスポンス結果の両方にテストが書けるようになる。
* ただし、URLが固定されるのでリクエストは引数などで外から設定出来る必要がある
8/12 本日の共有

### Parse
[mBaaSを使ってみよう！超簡単にSwiftでTwitterライクなポスト機能を作る(Xcode6 beta4, Parse.com) - Qiita](http://qiita.com/kiiita/items/bc62293f6c4d479993c1)
[Parse](https://www.parse.com/products)ってremote notificationしか使ったことなかったけどこんなことできるのか。
・Parse Core: クラウドにデータを保存、サーバー上でのバックグラウンド処理、等々
・Parse Push: remote notification
・Parse Analytics: アプリの使用分析

クラッシュレポートの機能はない：クラッシュレポートを自前で取得してParseに上げて見ることはできる。
[iOS auto crash report | Parse](https://www.parse.com/questions/ios-auto-crash-report)

自分でもちょっとやってみた
[Quick Start | Parse](https://www.parse.com/apps/quickstart#parse_data/mobile/ios/native/new)
ここから出来合いのプロジェクトを落としてきてセットアップ、データの保存まで。
ただ一点詰まったのは、カスタムテーブルにデータを保存しようとして

```objc
	PFObject *hoge = [PFObject objectWithClassName:@"Hoge"];
	hoge[@"1"] = @"1";
	hoge[@"2"] = @"4";
	hoge[@"3"] = @"9";
	[hoge saveInBackground];
```

みたいなコードを書いたら

```
Error: invalid field name: 3 (Code: 105, Version: 1.2.20)
```

とのこと。カラム名に制限があるらしい。テーブルも作成されなかった。


### コードTips
[Safx: Key-value observingを使う際のtips](http://safx-dev.blogspot.jp/2013/01/key-value-observingtips.html)addObserver:forKeyPath:options:context:のcontext引数にselectorを入れて、observeValueForKeyPath:ofObject:change:context:でinvokeするとメソッドが肥大化せず切り分けられる。
うまいこと考える人がいるもんだ。

### 発見
うちはバケツ水田で小エビとプラナリア飼ってるんだけど、餌はレバーを用意しなくてもメダカの粉末餌で十分育つことがわかった。
ヤマタノオロチとか作り出したい。

### その他
[扉の向こうは10年後の未来！　マイクロソフトが考える未来の世界「Envisioning Center」を見てきた - ねとらぼ](http://nlab.itmedia.co.jp/nl/articles/1408/11/news131.html)
.emacs.dをさらす


* 特段，人様にお見せするような工夫はしていない
* よく使うコマンドをよく慣れたキーバインドにする
* 自分のためにさらす
* vimこわい

;; -*- mode: emacs-lisp; coding: utf-8; indent-tabs-mode: nil -*-

;;
;;
;; emacs-24.3/bin/.emacs.d/init.el
;; 20131215 
;; for Windows GNU Emacs
;; Dropboxにおくこと

;;=============================================================
;; set encode utf-8
;; 
(set-language-environment 'utf-8)
(set-default-coding-systems 'utf-8)


;;==============================================================
;; set font
;;
(when window-system
  (progn
    (set-default-font "Inconsolata-14")
    (set-fontset-font (frame-parameter nil 'font)
                      'japanese-jisx0208
                      (font-spec :family "Meiryo UI" :size 18 ))
    (setq default-frame-alist
	  (append
	   '(
	     (width . 80)
	     (height . 45)
	     (font . "Inconsolata-14")
	     )
	   default-frame-alist))
    ))



;;=============================================================
;; set color 
;; 

;; 正規表現
(set-face-foreground 'font-lock-regexp-grouping-backslash "#66CC99")
(set-face-foreground 'font-lock-regexp-grouping-construct "#9966CC")

;; カーソル行 rv環境で使うこと前提
(global-hl-line-mode t)
(set-face-background 'hl-line "darkslategray")

;; カーソル色
(defun update-cursor-color ()
  (interactive)
  (if current-input-method (set-cursor-color "#91C3FF")
    (set-cursor-color "#AAAAAA")))
(update-cursor-color)
(run-with-idle-timer 10 t 'update-cursor-color)
 
(add-hook 'input-method-activate-hook
          (lambda () (set-cursor-color "#91C3FF")))
(add-hook 'input-method-inactivate-hook
          (lambda () (set-cursor-color "#AAAAAA")))
 
(when (and (eq window-system 'ns) (= emacs-major-version 23))
  ;; when IME is ON
  (mac-set-input-method-parameter
   "com.google.inputmethod.Japanese.base" 'title "G"))
 
(when (and (eq window-system 'ns) (= emacs-major-version 24))
  ;; when IME is ON
  (mac-set-input-method-parameter
   "com.google.inputmethod.Japanese.base" 'title "グ"))

;;　カーソル点滅 
(blink-cursor-mode -1)



;;==============================================================
;; key bind
;;
(define-key global-map (kbd "C-z") 'undo) ; undo
(define-key global-map (kbd "C-o") 'comment-dwim) ; コメントアウト
(define-key global-map (kbd "C-a") 'mark-whole-buffer) ; 全て選択
(define-key global-map (kbd "C-+") 'text-scale-increase) ; フォントサイズ拡大 
(define-key global-map (kbd "C--") 'text-scale-decrease) ; フォントサイズ縮小

(add-hook 'python-mode-hook '(lambda () (hs-minor-mode 1)))
(define-key global-map (kbd "C-\\") 'hs-toggle-hiding) ; ブロックをたたむ

;;=============================================================
;; back ground color

(custom-set-faces
 '(default ((t
             (:background "black" :foreground "LightCyan")
             ))))

;;透過
(add-to-list 'default-frame-alist '(alpha . (0.85  0.85)))
;; ======================================================
;; line number
;; 
(custom-set-variables
 '(global-linum-mode t))

;;==========================================================
;; others
;; 
(tool-bar-mode 0)                       ;ツールバーを消す
(setq make-backup-files nil)            ;バックアップファイルを作らない
(setq auto-save-default nil)            ;オートセーブ無効
【Chrome Apps】Packaged AppsでWebコンテンツをロードして表示する

Chrome Packaged Appsはローカルで動作するアプリケーションを作ることができますが、既存のWebサービスをPackaged Appsで提供したい場合のTipsです。

#方法と実装
webviewタグ（[公式ドキュメント](https://developer.chrome.com/apps/tags/webview)）を使ってWebからのライブコンテンツをロードして、Chromeのアプリケーションに埋め込みます。

webviewタグを使うには、manifest.jsonの"permissons"の項目で"webview"を許可します。

```json:manifest.json
{
    "manifest_version": 2,
    "name": "Sample",
    "description": "Sample Chrome Packaged App",
    "version": "0.0.1",
    "app": {
        "background": {
            "scripts": ["index.js"]
        }
    },
    "icons": {
        "16": "icon-16.png",
        "48": "icon-48.png",
        "128": "icon-128.png"
    },
    "permissions": [
        "webview"
    ]
}
```

続いて、アプリケーションのHTML内にwebviewタグを埋め込みます。
`<webview src="https://example.com"></webview>`

あとはCSSでwebviewの大きさ・配置を調整すればWebサービスをPackaged Appsで提供することができます。

##問題点
ただし、Packaged Appsでは、アプリケーション内でリンクをクリックしても遷移できなかったり、alert()が使えなかったりといくつか機能が制限されているので、そのままでは問題になる場合があります。ここでは、この２点について対応策を書いておきたいと思います。

##解決策
新しいブラウザウィンドウを開こうとしたときのイベント"newwindow"、また、alert()の実行は制限されていますが、"window.alert"、"window.confirm"、"window.prompt"を実行したときに呼ばれるイベント"dialog"はそれぞれ準備されています。これらを使って、

```js:main.js
var webview = document.getElementById('mainWebView');

webview.addEventListener('newwindow', function(e) {
    webview.src = e.targetUrl;
});

webview.addEventListener('dialog', function(e) {
    messageAlert.Alert(e.messageText);
});
```

とすれば対応することができます。しかしながら、window.alert()に変わるものは用意されていないようなので、アラーとウィンドウは自作する必要がありそうです（例の"messageAlert.Alert(e.messageText)"部分）。

#おまけ
簡単なアラートウィンドウの実装です。messageAlert.Alert()を'dialog'イベントリスナーの中に入れておけばwindow.alert()の代わりに自作アラートウィンドウを表示できます。

```html:index.html
<div id="screenLock"></div>
<div id="alertBox">
    <div id="alertTitle">メッセージ</div>
    <div id="alertBody"></div>
    <div id="alertButton">
        <button id="okBtn">OK</button>
    </div>
</div>
```

```js:messageAlert.js
var messageAlert = (function() {
    function Hidden(){
        document.getElementById("screenLock").style.visibility = 'hidden';
        document.getElementById("alertBox").style.visibility = 'hidden';
    }

    function Show(){
        document.getElementById("screenLock").style.visibility = 'visible';
        document.getElementById("alertBox").style.visibility = 'visible';
    }

    return {
        Alert: function(messageText){
            document.getElementById("okBtn").style.display = 'inline';
            document.getElementById("alertBody").innerHTML = messageText;
            Show();

            document.getElementById("okBtn").onclick = function(){ Hidden(); };
        }
    }
})();
```

#Sample
CSSも含めたサンプルは[こちら](https://github.com/moshisora/ChromePackagedApp)からどうぞ。webviewタグの中を自由に変更してみてください。webviewをウィンドウ全体に最大化しているのでブラウザのように動きますが、戻るボタンがないのでちょっと不便かもしれませんね…。
※"index.html"を直接ブラウザで開いても動作しません。Google Chromeにインストールして試してみてください。インストール方法は[こちら](http://qiita.com/moshisora/items/0d45b11095183a8254ad)の末項。
ネットワークドライブ上のファイルのローカルバックアップをスケジューリングする

##やること
* ファイルサーバ上にあるファイルを定期的バックアップしたい
* バックアップ先はサーバと同一LANにあるローカルマシンである
* このバックアップをスケジューリングしたい

ローカルマシンはWindows7．
バックアップ先はWin機にマウントしている外付けHDD（F:\）とする

##前提: ファイルサーバのドライブマウント
後々にコピーをコマンドで実行するために，ファイルサーバをWindows上でマウントしておく．

`$> net use * \\[ServerName]\[UserName] * /user:[UserName] /persistent:yes`

このコマンドをWindowsのcmd上で実行することで，ファイルサーバ上のホームディレクトリ/共有ディレクトリを参照できるようになる

##バックアップ
バックアップ元: 
  サーバー名"Server"のディレクトリ/home/hogehoge

バックアップ先:
  Win機の外付けHDD(Fドライブとしてマウント)

使うコマンドはrobocopy
[パソコンのファイルをrobocopyで手堅くバックアップする方法](http://amaotolog.com/backup/entry187.html)
[robocopyでフォルダをバックアップ／同期させる](http://www.atmarkit.co.jp/ait/articles/0704/20/news130.html)

`$ robocopy \\Server\hogehoge F:\backup\hogehoge /mir`
上記のコマンドをDOS上で実行すると差分コピーが一回完了するはず．

コピー元のディレクトリが，サーバー中に"/home/hogehoge" のパスで存在していたとしても，Win機側から見ればパスは"\\Server/hogehoge" である

## バックアップのスケジューリング
前述のrobocopyコマンドに，Read/Writeのオプションなどを付け加える．
`robocopy \\Server\hogehoge F:\backup\hogehoge /mir /log:"C:\Users\hogehoge\Desktop\log.txt" /r:0 /w:0 /NDL /FFT /NP`

/R:0, /W:0
読み書き共に0回までの再試行を行う

/NDL
出力にファイルパスを表示しない

/FFT
更新時間の比較に2秒の誤差を許す
(バックアップ元がネットワーク上であるため必要)

/NP
進行中の状況を非表示

このコマンドをバッチファイルにする．

タスクスケジューラを起動する
"タスクの作成"より，
[全般]タブ
* "ユーザがログオンしているかどうかにかかわらず実行する"
* "最上位の特権で実行する"

[トリガー]タブより，
* 毎日/毎週/毎月などのスケジュールを設定

[操作]タブより，
* "プログラムの開始"
* プログラム/スクリプトに作成したバッチファイルのパスを指定する
* "開始"フォームにバッチファイルを置くディレクトリのパスを指定する

以上，パスワードを入力すると
スケジューリング設定はここまで．

設定したタスクを手動で実行してみる．

（Windows上でのユーザ名/パスワードが，ファイルサーバ上でのユーザ名/パスワードと異なるとコピーが成功しない？）
Chrome Appsを作る（Packaged Apps編）

先日、Chrome Apps（Hosted Apps）に続いて、今回はPackaged Appを作ってみたいと思います。Hosted AppsとPackaged Appsの概要は[Chrome Appsを作る（Hosted Apps編）](http://qiita.com/moshisora/items/0d45b11095183a8254ad)に簡単に書いてありますが、Packaged Appは、HTML、CSS、JavaScriptで記述できるWebアプリですが、ウィンドウも独立し、デスクトップアプリのようにふるまうことができるアプリです。ローカル環境にWebアプリをそのままインストールしてやろう、という方式です。

#必要なファイル
基本的にはHosted Appsの場合と同じですが、いくつか追加と変更しないといけない部分があります。必要なファイルは、Hosted Appsの場合のmanifestファイル、アイコン画像ファイルに加えて、アプリケーション本体を構成するファイル群が必要になります。
![スクリーンショット 2014-08-12 17.16.31.png](https://qiita-image-store.s3.amazonaws.com/0/48393/7f062890-abcf-df34-aec3-53430e20dd08.png)
図の"index.html"、"index.js"、"style.css"にアプリケーションに内容を書いていきます（名称は任意）。

##manifest
manifestファイルの必要箇所に変更を加えます。一部分だけですが、"app"の内容を下記のようにします。

```json:manifest.json
{
    "manifest_version": 2,
    "name": "Sample",
    "description": "Sample Chrome Packaged App",
    "version": "0.0.1",
    "app": {
        "background": {
            "scripts": ["index.js"]
        }
    },
    "icons": {
        "16": "icon-16.png",
        "48": "icon-48.png",
        "128": "icon-128.png"
    },
    "permissions": [
        
    ]
}
```

##アプリケーション起動時の設定
先ほどmanifestに指定した"index.js"にアプリケーション起動時の挙動を記述します。アプリケーションが実行されたときのイベントが用意されているので、次のように呼び出すHTMLファイルとウィンドウサイズの大きさを設定します。例では、スクリーンサイズいっぱいに表示するようにしてありますが、定数で指定することも可能です。

```js:index.js
chrome.app.runtime.onLaunched.addListener(function() {
    chrome.app.window.create('index.html', {
        bounds: {
            width: window.parent.screen.width,
            height: window.parent.screen.height
        }
    });
});
```

##アプリケーションの中身
"index.html"にアプリケーションの内容を書いていきます。通常のWebアプリケーションと同様に記述できます。今回はHello,worldでご容赦を…。

```html:index.html
<!DOCTYPE html>
<html lang="ja">
    <head>
        <meta charset="UTF-8">
    </head>
    <body>
        Hello, World!!
    </body>
</html>
```

#実行、テスト
Chromeでの実行方法もHosted Appsの場合と同じです。[こちら](http://qiita.com/moshisora/items/0d45b11095183a8254ad)を参照ください。Chromeのデベロッパーツールを使ってWebアプリケーション同様にデバッグもできます。拡張機能の対象アプリ欄に次のような「ビューを調査」という項目があるので、ここから「index.html」のほうを選択します（任意で名称を変更している場合は指定した名称で出てきます）。

![スクリーンショット 2014-08-12 17.36.22.png](https://qiita-image-store.s3.amazonaws.com/0/48393/6840f76e-68cd-17b3-eed8-47dd34bf16bb.png)

「index.html」が出てきていない場合は一度「バックグラウンド ページ」を選択してみてください。選択後改めて確認すると、「index.html」が出現しているのですが、理由はよくわかりません…詳しい方いらっしゃいましたら、ご教授いただけるとありがたいです。

実行するとこのように独立したウィンドウで実行されます。
![スクリーンショット 2014-08-12 17.43.31.png](https://qiita-image-store.s3.amazonaws.com/0/48393/61795bbe-5f09-4e4c-932b-52f56977180c.png)

#Sample
[GitHub](https://github.com/moshisora/ChromePackagedApp)にHelloWorldのサンプルをフォルダごと置いてあります。
Pythonでテキストの読み書き

今回も私がよく使うPythonでのテキストの読み書きについてです。

#1. サンプルコード

```py:sample.py
#-*- coding:utf-8 -*-

if __name__ == '__main__':
	print "\ntest.txtを作成して改行しながら1~100まで入力させます。"
	fw = open("test.txt","w")
	for line in range(0,100):
		number = line + 1
		if line == 0:	fw.write("%s"%number)
		else: fw.write("\n%s"%number)
	fw.close()
	print "入力が終了しました。\n"

	print "次に、test2.txtを作成してタブで感覚をあけながら1~100まで入力させます。"
	fw2 = open("test2.txt","w")
	for line2 in range(0,100):
		number = line2 + 1
		if line2 == 0:	fw2.write("%s"%number)
		else: fw2.write("\t%s"%number)
	fw2.close()
	print "入力が終了しました。\n"

	print "test.txtに入力した行数をこれから表示します。"
	fr = open("test.txt","r")
	for line in fr:
		len_item = sum(1 for line in fr)
		print "テキスト内には%s行あります。\n"%(len_item+1)
	fr.close()

	print "test2.txtに入力したをこれから表示します。"
	fr2 = open("test.txt","r")
	for line2 in fr2:
		print line2,
	print ''
	fr2.close()	
	print "表示が終了しました。\n"

	print "このプログラムは以上です。お疲れ様でした。\n"
```

#2.説明？
いろいろと細かい小ネタをちょっと入れています。
例えば`"test.txtに入力した行数をこれから表示します。"`内で書いている`sum(1 for line in fr)`という書き方。
これはファイル内にどれだけの行数があるかを出してくれます。
しかも、外の`for line in fr`の中で回して求めるより、`sum(1 for line in fr)`で書いた方が高速に演算してくれるらしいです。

他にも、`"test2.txtに入力したをこれから表示します。"`内で
```print line2,
print ''```
という部分。こう書くことで、要素を一つずつプリントすることができます。


#3. お世話になったサイト紹介
とても参考にさせていただいているサイト：『[Pythonでファイルを読む](http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/python/readfile.html)』
サンプルが多くあり、かなり重宝させていただいていますm(_ _)m
vagrantで作ったVMでipython notebookを立ち上げてローカルからアクセスする

ハマったので書いておく。

```
$vagrant up
$vagrant ssh -- -L 8888:localhost:8888
[vagrant@localhost ~]$ ipython notebook
```

後はローカルPCのブラウザで[http://localhost:8888](http://localhost:8888)を開けば、ipython notebookが見える。

Vagrantfileで
```
config.vm.network "forwarded_port", guest: 8888, host: 8888
```
とか設定してみたけど、こっちはダメだった。何でダメだったのかは不明・・・。
エラー "cp: preserving permissions for `hogehoge`: サポートされていない操作です" が出た

## 現象
Sambaで共有構築しているファイルサーバ中のディレクトリを，
別にマウントしてるHDD中のディレクトリ以下にコピーしようとするとタイトルのようなエラーが発生することがあった．
コピー元ディレクトリ中の全てのファイルに対してではなく，ごく一部のファイルに対して起こる．
管理者権限で実行しても変わらない．

`$ cp -cpR [cp Src] [cp Dist]
cp: preserving permissions for 'hogehoge': サポートされていない操作です`

## 結論と解決策
参照:
[Samba とACL機能](https://users.miraclelinux.com/technet/document/samba/samba0006.html)
[SETFACL](http://linuxjm.sourceforge.jp/html/acl/man1/setfacl.1.html)

Samba上でのファイルへのアクセス制御（Access Control List: ACL）における**拡張ACLエントリ**に，
コピー先のファイルシステム（具体的にはなんだろう？）が対応していないと発生するエラー，だと理解．
（そもそもこの設定を保持したままコピーはできない？）

とにかく，このACLエントリを削除すれば正常にコピーできるようになる．
`$ setfacl -bR *.*`

-b: 全ての拡張ACLエントリを削除（基本ACLエントリは保持）
-R: recursive

ここまで．
SourceTree　Git チェックアウトして自分のブランチへ

①新規/クローン作製
②リモートリポジトリを選択
③チェックアウト
④チェックアウトしたローカルブランチを選択
⑤ブランチボタンをクリック　任意の名前を作成
⑥自作ブランチをダブルクリック
Vagrant + chef-solo + berkshelfで分析環境を構築する

ぶっ壊れてもいい環境が欲しかったのでやってみた。

#手順

初期構築の場合
1. chefのリポジトリを作る(knife solo init)
2. recipeを作る(knife cookbook create)
3. 公開recipeを登録する(berks install && berks vendor)
4. Vagrantの初期設定を行う(vagrant init)
5. Vagrantを起動する(vagrant up)


#環境構築

- gemはインストール済みとする。
- Vagrantのインストーラをダウンロードして実行
 - http://www.vagrantup.com/downloads.html
-VirtualBoxのインストーラをダウンロードして実行
 - https://www.virtualbox.org/wiki/Downloads

```bash
# berkshelfのインストール
gem install berkshelf
# knife-soloのインストール
gem install knife-solo
# vagrant pluginのインストール(vagrant-omnibusとsahara)
vagrant plugin install vagrant-omnibus sahara
```

saharaは無くても問題ないが、VMのスナップショットを作れるのであったほうが便利。

#chefのリポジトリを作成する

```bash
mkdir vagrant_work
cd vagrant_work

```

#recipeを作る

```bash
knife cookbook create [レシピ名]
```

レシピは以下を設定すればだいたいおｋ。
- recipe/default.rb
- attributes/defaut.rb

#公開recipeを登録する

まずはBerksfileを編集する

```bash
vim chef-repo/Berksfile
```

Berksfileには、recipeを探索先としてopscodeを記述。
cookbook 'レシピ名'と書くと、opscodeが公開しているレシピを引用することになるみたい。
path指定だと、ローカルにあるrecipeを登録できる。
opscode以外のgitも登録できるみたいで、cookbook 'レシピ名', git: 'git://リポジトリパス'と書けばいけるみたい(未確認)

```vim:Berksfile
site :opscode

cookbook 'yum-epel'
cookbook 'build-essential'

cookbook "python",      path: "site-cookbooks/python"
```


berks installを実行すると、Berkshelf.lockに依存関係も含めてrecipeが登録される。
また、Berksfileで指定したrecipeは~/.berkshelf/cookbooks/に配置される。
他の記事を見ると`berks install --path PATH`になっているが、`berks install --path`は`berks vendor`に変わったようなのでこちらを使う。`berks vendor`は`--berksfile=PATH`でパスも指定できる。パスを指定しない場合は、カレントのberks-cookbooksが作成されて出力される。なお、出力先は環境変数BERKSHELF_PATHでも変更できるらしい(未確認)。

```bash
berks install
berks vendor
```

#Vagrantの初期設定を行う

まずはVagrantの初期設定を行う

```bash
cd ~/vagrant_work
vagrant init
```

vagrant initを実行すると、Vagrantfileが作成される。
VMを作成する時は、Vagrantfileの内容に添って実行されるので、これを編集する必要がある。
VM作成時に実行するrecipeもここで指定するので要注意。

```bash
vim Vagrantfile
```

いろいろ弄るんだが、以下のポイントをおさえればいい。

- box名(config.vm.box)
- vmの元となるboxのURL(config.vm.box_url)
- vmのnetwork(config.vm.network)
- vmの名前、CPU数、メモリ(config.vm.provider)
- chefで実行するrecipe(config.vm.provision)

意外とVMのCPU数とメモリが重要で、デフォルトだとCPU数=1、メモリ400MBなのでscipyがインストール中にタイムアウトとかしたりする。多めの方がいい。


```vim:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.box = "CentOS6.4_minimal"
  config.vm.box_url = "http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20131103.box"

  config.vm.network "private_network", ip: "192.168.33.10"

  config.vm.provider "virtualbox" do |vb|
    vb.name = "stats_vm"

    vb.cpus = 2
    vb.memory = 4096
  end

  config.vm.provision :chef_solo do |chef|
    chef.run_list = [
      "base",
      "python"
    ]
  end
end
```

#Vagrantを起動する

vagrant upでVMの作成が始まる

```bash
cd ~/vagrant_work
vagrant up
```

VMが無事できたら、vagrant sshでVMにログインできる。抜ける時はexit

```bash
vagrant ssh

exit
```

#saharaの使い方

vagrantのpluginでsaharaをインストールしておくと、簡単にスナップショットを取れるので結構便利。
スナップショットを取る時は、vagrant haltでVMをシャットダウンしている方が早く終わるみたい。

```bash
# スナップショットを作成する
vagrant sandbox on

# 現在の状態でスナップショットを更新する
vagrant sandbox commit

# 直前のスナップショットに戻す
vagrant sandbox rollback
```
PHPで英数記号8ケタパスワードを生成する

#PHPでパスワード用文字列を作る
Drupal開発で別途パスワードを自動的に生成する必要があったのでメモ。


```lang:MYMODULE.module
/*
 *
 * 英数小文字8ケタのパスワードを生成する
 * @params $length: 
 */
function create_passwd( $length = 8 ){
    //vars
    $pwd = array();
    $pwd_strings = array(
        "sletter" => range('a', 'z'),
        "cletter" => range('A', 'Z'),
        "number"  => range('0', '9'),
        "symbol"  => array_merge(range('!', '/'), range(':', '?'), range('{', '~')),
    );

    //logic
    while (count($pwd) < $length) {
        // 4種類必ず入れる
        if (count($pwd) < 4) {
            $key = key($pwd_strings);
            next($pwd_strings);
        } else {
        // 後はランダムに取得
            $key = array_rand($pwd_strings);
        }
        $pwd[] = $pwd_strings[$key][array_rand($pwd_strings[$key])];
    }
    // 生成したパスワードの順番をランダムに並び替え
    shuffle($pwd);

    return implode($pwd);
}

```
$pwd_strings部分を調整して、「英数小文字のみ」とかにできる。
MinGW + mintty -> Windows8.1

## モチベーション
* カッコいいターミナルを使えばカッコいいアレが出来ると思っている
* Unixコマンドで生きていきたい
* Windows環境でどうにかしたい

Windowsネイティブのターミナル(cmd, PowerShell)は残念だと色々な人が言うけれど，だってWindowsなんだからしょうがないじゃんと思っていた．

とはいえ日常的にLinux環境を使うようになると，
Win上でもdirではなくlsを打ちたくなる．
というかDOSのコマンドを覚えられない

cygwinは超重たいので他のはないかな？

minttyというのがカッコいいらしい．
入れてみます．


## やること
Windows8.1上にMinGWとminttyインストールの上，
シェルをminttyにしてその他諸々の環境作り


## 環境
Surface Pro2, Windows8.1 Pro 64bit


## 参照
[Windows に MinGW と mintty を入れてシェル環境改善](http://zarari.hatenablog.com/entry/2013/08/22/235819)
[mintty を使えるようにする](http://dogmap.jp/2011/11/15/mintty/)

これらのページを参考に行ったが，やってみると細かいところが変わってたりする．


## MinGWのダウンロード/インストール
[MinGW - Minimalist GNU for Windows](http://sourceforge.net/projects/mingw/files/)
ここからインストーラ(mingw-get-setup.exe)をダウンロード．
2014/08/12現在，latest versionは2013/10/04更新のものだった．

ダウンロードしたファイルを起動して，[Install]->[Continue].
![0.JPG](https://qiita-image-store.s3.amazonaws.com/0/29240/7f6b8dd9-95f9-1ec9-661b-1838af0cdfaa.jpeg)
すぐ終わる．


MinGW Installerがインストールされるのでこれを起動．
最初の起動時にパッケージリストのダウンロードがある．
![1.JPG](https://qiita-image-store.s3.amazonaws.com/0/29240/46456141-1df7-87f6-fdcd-0dbeab45a3fa.jpeg)
パッケージ"mingw-developer-toolkit" のチェックボックスを右クリックして，"Mark for Installation" をクリックしてアクティブにする．
すると最下段の"msys-base"もアクティブになるはず．

これだけやって，タブ[Installation]->[Apply Changes]をクリック

MinGWのインストールは以上

## minttyのインストール
### 環境変数の追加
minttyを入れる前に環境変数に手を加える．

* PATHに"C:\MinGW\msys\1.0\bin;" を追加
* HOMEを"C:\Users\[ユーザー名]" に変更(ホームディレクトリはお好み)

環境変数を変更したらWindowsを再起動する．

### minttyのインストール
minttyを入れるためにまずMinGW Shellを起動する．
参照しているページだと"MinGW Shell" がスタートメニューに追加されているとのことだが，
私の環境ではどうひっくり返しても見つからなかった．
(Win8.1だからかな？)

よくよく調べてみると，
**"C:\MinGW\msys\1.0\msys.bat" が該当のファイルとのこと．**
これを立ち上げる．

出てくるターミナル上で以下を入力
`$ mingw-get update
$ mingw-get install msys-mintty`
…したいのだけれど，mingw-getコマンドがnot foundになる．

パスに追加したディレクトリの"C:\MinGW\msys\1.0\bin" 以下に"mingw-get.exe" が無いことが原因．
このファイルは"/C/MinGW/bin/" 以下にある．
`$ /C/MinGW/bin/mingw-get update
$ /C/MinGW/bin/mingw-get install msys-mintty`
とフルパスで指定してインストール．
（PATHに"C:\MinGW\bin;" を追加してもいい）

インストールできたら，
`$ mintty`
でminttyを起動する．

そのままだとshでログインするので，
mintty.exeのショートカットを作成，プロパティからパス名の末尾に" -"(スペースハイフン)を追加する．
タスクバーに固定しておくとよし．

## インストール後
バーを右クリック->[Options]から，"Transparency"をいじると
ウィンドウの透過が設定できる．
![2.JPG](https://qiita-image-store.s3.amazonaws.com/0/29240/42348523-d01f-1647-bb22-7b7ec9c5e8c5.jpeg)


## 今後やること
* フォントの設定(Inconsolata)
* その他環境の確認

* gitのインストール
* sshのインストール
* vimを試す
Githubみたいにブランチの状態を一覧する.sh

ブランチの進捗どうですか。

Gistからどうぞ https://gist.github.com/unarist/bd912e7c6024c9ade792

# 実行例

```console
$ git-branch-stats.sh
 feature/a merged =origin
 feature/b +5-2 commits >origin/feature-b
 my_local_branch +1-0 commits =???
 master  =origin
```

* masterとのマージ起点を割り出して、そこから双方で進んだコミットの数を表示
* マージ済みならその旨を表示
* upstreamのrefspecを表示（remote以外同じなら省略）
* upstreamと比較して(=|<|>|<>)を表示

# 実装周り

upstream周りは`git for-each-ref`任せ。

`git rev-list`は「コミットAから辿れる&&コミットBから辿れない&&...」なコミットを列挙するコマンドでちょっとおもしろい。あまり複雑なことはできないようだけど。

ahead/behindは行数版も実装したものの、個人的にコミット数の方が見たかったのでコメントアウト。

# 今後の課題

* マージ済みのブランチにマージ日時とか表示したい
    * rev-listを使うなら、ブランチがマージコミットを指しているのか、マージ直前のコミットを指しているのかで処理が変わるような
* マージ起点じゃなくてブランチを作った時点からのdiffがいい？（可能なのかわからないけど）
    * merge-baseに--fork-pointという操作があるけど、reflogを見るようなので多分ここでは使えない
* マージする方向が適当でもうまく動くのだろうか
* わかりにくい
    * upstreamが消えると`<>`と表示される（masterと比較している・・・？）
    * `+2-1`じゃなくて`[ahead 2, behind -1]`とか

# 参考

StackOverflowであたりをつけてmanを読み込むいつもの流れ。

* [How can I tell if one commit is a descendant of another commit?](http://stackoverflow.com/questions/3005392/how-can-i-tell-if-one-commit-is-a-descendant-of-another-commit)
* [Find merge commit which include a specific commit](http://stackoverflow.com/questions/8475448/find-merge-commit-which-include-a-specific-commit)
* [Finding a branch point with Git?](http://stackoverflow.com/questions/1527234/finding-a-branch-point-with-git)
* [How to get the git commit count?](http://stackoverflow.com/questions/677436/how-to-get-the-git-commit-count)
* [How can I calculate the number of lines changed between two commits in git?](http://stackoverflow.com/questions/2528111/how-can-i-calculate-the-number-of-lines-changed-between-two-commits-in-git)
* man git
Grunt.jsでTeXのコンパイルを自動化する

最初に断っておきますが，TeX歴は半年です．とりあえず使えるようになることに専念してきたので，TeXの一般的な使い方などはまだ良く分かっていまいせん．

「Emacsを使えば幸せになれるのだろうな・・・」と思いつつ，任意のエディタを使って，保存されたタイミングでコンパイルしてみようと考えたのがキッカケです．他にも良い方法があると思いますが，覚えたてのGrunt.jsを使ってみたくて書いています．

なお，OSはMacOS Xを使っています．他のOSの方は適宜読み替えてください．

# 前提条件とインストール
必要なソフトウェアはTeXです．私はMacTex2013をインストールした後でTeXShopを上書きインストールしました．TeXは様々な実装が有り，どれを使って良いか分からないので，TeXShopの環境設定 - 内部設定 を見て「simpdftex」というコマンドを選びました．

また，node.jsやnpmも必要なのでインストールしておいてください．

npm周りでインストールするパッケージは以下のものです．

```
grunt
gtunt-cli
grunt-contrib-watch
grunt-exec
```

順番にインストールしましょう．基本的にノーエラーでインストールできるはずです．

```
$ npm install grunt-cli -g  // すでにインストールしあるなら不要です
$ mkdir tex
$ cd tex
$ npm init  // 質問に適当に回答してください．
$ npm install grunt --save-dev
$ npm install grunt-contrib-watch --save-dev
$ npm install grunt-exec --save-dev
```

# Gruntfileの内容

次にGruntfile.jsを作成します．この例では，test.texをコンパイルしてPDFを出力します．また，分割コンパイルに対応するため，watch対象を*.texとしています．

```js:Gruntfile.js
module.exports = function(grunt) {
	'use strict';
	grunt.initConfig({
		watch: {
			tex: {
				files: ['*.tex'],
				tasks: ['exec:build']
			},
		},
		exec: {
			build: {
				cmd: 'simpdftex platex --mode dvipdfmx --maxpfb --extratexopts "-file-line-error" test.tex'
			},
		},
	});

	grunt.loadNpmTasks('grunt-exec');
	grunt.loadNpmTasks('grunt-contrib-watch');

	grunt.registerTask('default', ['exec:build', 'watch']);
};
```

# 使い方

```
$ grunt
```

を実行すると，即座にコンパイルすると共にwatch状態に入ります．test.texを任意のエディタで編集して保存すると，保存されたことをトリガとして，TeXのコンパイルが実行されます．

出力ファイルであるtest.pdfをプレビュー.appで開いていれば，コンパイル終了後にプレビュー.appに切り替えるだけで更新されたPDFが表示されます．

#まとめ
「わざわざこんな面倒なことしなくても！」とか「普通，これを使うよね！」とかのお叱りがありましたらお寄せください．
C++でテキストに書き出す方法

基本的な事柄だが、頻繁に利用するので書き留めておくことに。

手始めに基本となるサンプルコードを。

```lang:outputfile01.cpp
#include<iostream>
#include<fstream>

using namespace std;

int main()
{
    ofstream outputfile("test.txt");
    outputfile<<"test";
    outputfile.close();
}
```

`fstream`をincludeして、`ofstream 変数名("吐き出したいテキスト名")`で定義します。
そして、`変数名<<書き出したい内容;`で吐き出したい内容を記入。
最後は、`変数名.close();`と書いて終了させる。

他にもちょっとだけサンプルコードを下に書き残しておきます。

```lang:outputfile02.cpp
#include<iostream>
#include<fstream>

#define F "test.txt"

using namespace std;

int main()
{
    char inputTxt;
    ofstream outputfile(F);
    
    cout<<"何か文字を記入してください。:";
    cin>>inputTxt;
    cout<<"あなたが記入した文字を"<<F<<"に書き出しました。"<<endl;
    
    
    outputfile<<inputTxt;
    outputfile.close();
}
```

```lang:outputfile03.cpp
#include<iostream>
#include<fstream>

#define F "test.txt"
#define n 9

using namespace std;

int main()
{
    int i,j,input[n][n];
    ofstream outputfile(F);
    
    cout<<"\n九九を表示します。\n\n"<<endl;
    outputfile<<"\n九九を表示します。\n\n\n";
    
    for (int i=1; i<=n; i++) {
        for (int j=1; j<=n; j++) {
            input[i][j]=i*j;
            outputfile<<input[i][j]<<"\t";
            cout<<input[i][j]<<"\t";
        }
        outputfile<<"\n";
        cout<<endl;
    }
    outputfile<<"\n";
    cout<<endl;
    outputfile.close();
}
```
Rails4 + Bootstrap3 + Glyphicons


production環境だとconfig.assets.digest = trueなので、Glyphiconsのパスを正しく出力するためにsprocketsが必要。

```ruby:Gemfile
gem 'bootstrap-sass', '~> 3.0'
```

```css:app/assets/stylesheets/applicaion.css
/*
 *= require bootstrap
*/
```

```ruby:app/assets/stylesheets/custom.css.scss
@import 'bootstrap-sprockets';
@import 'bootstrap';
```
RDS(MySQLエンジンにてタイムゾーンを変更する方法を整理)

# RDS(MySQL)のタイムゾーンを変更する
## init_connectで設定することの問題点
RDSのパラメータグループに`init_connect`とあり、以下のように設定することで
接続毎にタイムゾーンをデフォルトのUTCから変更することが出来る。

```sql
SET SESSION time_zone = IF(POSITION) = 1,'UTC','Asia/Tokyo')
```

しかしこの方法は、現状公式も推奨していない
[ほぼ週刊AWSマイスターシリーズ Reloaded ~Amazon Relational Database 
Service~](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=8&cad=rja&uact=8&ved=0CFgQFjAH&url=http%3A%2F%2Fadsj-contents.s3.amazonaws.com%2Fmeister-reloaded%2F20120508_AWS-Meister-Reloaded-RDS-public.pdf&ei=L4XpU46pBsbo8AXD7IHwDw&usg=AFQjCNEKfHgDqr8MV7NspfVoFmsEL__2Tg&bvm=bv.72676100,d.dGc "ほぼ週刊AWSマイスターシリーズ Reloaded ~Amazon Relational Database 
Service~")

というのも、この設定を施した上でRDSが再起動もしくはfailoverするとMySQL接続後クエリを発行出来なくなるという不具合があるからである。

ちなみにその場合の対処としては、
パラメータ`init_connect`を一旦UTCなど別の値に変更・適用した後、再度MySQL接続することである。

```sql
SET SESSION time_zone = IF(POSITION('rdsadmin@' IN CURRENT_USER()) = 1,'UTC','UTC')
```

> `init_connect`はデフォルトnullですが、nullに戻そうとするとエラーとなるため。。上記のような対応となります。


## 現状出来る対処
**ストアドプロシージャを定義しCALLで呼び出す**

### ■1.ストアドプロシージャ定義
※既存のデータベースmysqlに定義する場合
※ストアドプロシージャ名は任意、今回は「adjust_time_zone」としています

```sql
mysql> DELIMITER |

mysql> CREATE PROCEDURE mysql.`adjust_time_zone`()
    -> IF NOT (POSITION('rdsadmin@' IN CURRENT_USER()) = 1) THEN
    ->    SET SESSION time_zone = 'Asia/Tokyo';
    -> END IF |
mysql> DELIMITER ;
```
※`rdsadmin`というRDS特有のMySQLユーザでログインしている際にTimezoneを`UTC`以外に変更すると不具合が起きるとのこと。
そのため、上記では`rdsadmin`以外のユーザの時のみ、Timezoneを変更するよう定義しています。

### ■2.プロシージャをCALL(ストアドプロシージャの定義が正しいことの確認)

```sql
mysql> CALL mysql.adjust_time_zone;
Query OK, 0 rows affected (0.00 sec)
```

### ■3.Timezoneの変更を確認

```sql
mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

### ■4.パラメータグループよりストアドプロシージャを呼び出す

| Name | Value |
|:-----------:|:-----------:|
| init_connect|CALL mysql.adjust_time_zone|

### ■5.パラメータ反映のため、数秒待つ
`init_connect`オプションの`Apply Type`は`dynamic`(即時反映)であるため、
反映される(Parameter Groupのステータスが`applying`から`in-sync`になる)まで数秒待つ

### ■6. 動作確認
MySQL接続し、Timezoneが自動的かつ設定どおりに変更されていることを確認する。

```bash
[root@web01 ~]# mysql -h *****.*****.ap-northeast-1.rds.amazonaws.com -u ***** -p
Enter password:
```

```mysql
mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2014-08-12 23:01:35 |
+---------------------+
1 row in set (0.00 sec)

mysql> show variables like '%time_zone';
+------------------+------------+
| Variable_name    | Value      |
+------------------+------------+
| system_time_zone | UTC        |
| time_zone        | Asia/Tokyo |
+------------------+------------+
2 rows in set (0.00 sec)
```

上記のように自動的にtimezoneが変更されていることを確認出来ました。

以上になります。
[MSVC 2005] printf系で64Bit型整数に気をつけよう

小ネタです。

Visual C++2005でunsigned long long などの64bitな値をprintf系関数やcstring::formatで書式化すると妙なことになる場合があったので、バッドノウハウとしてメモしておきます。


例えば、下のようなコードがあったとします。

```cpp:

void testmain()
{
	unsigned long long vv = 0x0000000012345678ULL;
	unsigned long long uu = 0x0000000000000000ULL;

	printf("%x,%x,%s,%s\n",vv,uu,"test","words");
}

```

普通ですと、`12345678,0,test,words`と表示されるのですが、MSVCでは`12345678,0,(null),(null)`というふうに後ろの可変長引数がすっ飛ばされてしまいます。

なお、gccの場合は普通に表示されます。
(ただし、コンパイル時に親切にも警告を出力されます)

また、vvの値を`0xFFFFFFFF00000000`などの本当に64Bit値をもたせると、MSVCでは実行時エラーとなり、gccでは上位32Bitが切られて表示されます。
(これはgccの動作が正しいですね)



なお、このように書式文字列に`%x`を指定するのではなくて`%llx`とするとちゃんと表示できます。

```cpp:

void testmain()
{
	unsigned long long vv = 0x0000000012345678ULL;
	unsigned long long uu = 0x0000000000000000ULL;

	printf("%llx,%llx,%s,%s\n",vv,uu,"test","words");
}

```

つまりこれは`%x`指定では、ライブラリは数値の長さを分からずにすっ飛ばしてしまうということで問題が出てしまったのかもしれません。
(gccみたいに警告を出してくれるといいのですけどね)

あと、STLでお馴染みの`<<`系で出力すれば問題なく出力出来ました。

```cpp:

void testmain()
{
	unsigned long long vv = 0x0000000012345678ULL;
	unsigned long long uu = 0x0000000000000000ULL;

	cout << hex;
	cout << vv << "," << uu << "," << "test" << "," << "words" << endl;
}

```

ということで、64Bit整数を扱う場合は書式文字列に気をつけましょうということで...
PHP向けSublimeText3の設定(Windows編)

#はじめに
Windows環境でPHP開発を行うにあたり
SublimeText3の設定を行った自分用メモです。

#ダウンロード及びインストール
##SublimeText3 
http://www.sublimetext.com/3

##PHP
http://windows.php.net/download/
最新版をダウンロードし"c/php"に解凍

##PHPUnit

※インストールはしますがまだ未設定です。すみません；
下記へアクセスしgo-pear.pharという名前で保存する。
http://pear.php.net/go-pear.phar

保存したgo-pear.pharをC:phpに配置。コマンドプロンプトを管理者モードで開き下記を実行。

###pearコマンドのインストール
PHPUnitの前にpearコマンドのインストールを行います。
※インストール済みの場合は飛ばしてください。

``php go-pear.phar``
> (system|local) [system] :（そのままリターン）
> 1-12, 'all' or Enter to continue: all
11番目のName of configuration fileのところで「$prefix\pear.ini」と指定する。

最後に、環境変数にPEARの設定を追加するコマンドを実行し再起動。
``PEAR_ENV.reg``

再起動後管理者モードで開き下記を実行。

1.pear config-showを実行。
2.pear config-set auto_discover 1を実行。
3.pear install pear.phpunit.de/PHPUnitを実行。
4.phpunit --versionを実行してバージョンを確認。
5.バージョンが表示されればOKとする
 
##PHPCS, PHPMD関連

###php.iniの設置
"C:\php\php.ini-development"をコピー/ペーストしphp.iniにファイル名を変更する。
 ※php.iniが存在する場合上記は行わなくて良い。

###openSSLを有効する
C:\php\ext\php_openssl.dllがある事を確認し1で作成したphp.iniに下記を追加する
``extension_dir = "ext" 
extension=php_openssl.dll
``

下記を実行しopensslが有効になっているか確認する
``C:\php>php -i | findstr openssl
openssl``

###Composerをインストール
下記からwindowsのインストラーをダウンロードし実行する。
https://getcomposer.org/download/
途中PHPの場所を聞かれるので"c\php"を設定する。

###環境変数の追加
コンピューター -> システムプロパティ -> システムの詳細設定 -> 環境変数 - 新規
SublimeTextから実行できるように環境変数PATHに下記を追加する
```変数名: PATH
変数値: c\php;C:\php;C:\Users\%USER_NAME%\AppData\Roaming\Composer\vendor\bin;``

###PHPCS, PHPMDのインストール
下記を実行する
``composer global require squizlabs/php_codesniffer=*
composer global require phpmd/phpmd=*
``
実行後インストールできたか確認する
``C:\php>phpcs --version
PHP_CodeSniffer version 1.5.4 (stable) by Squiz (http://www.squiz.net)
C:\php>phpmd --version
PHPMD @package_version@ by Manuel Pichler
``

#個人設定
preferences->Settings-defaultは設定内容をコピーし
preferences->Settings-Userを開いてペーストし修正する
``// フォントとサイズの指定
"font_face": "Consolas",
"font_size": 11,
// 行番号の表示
"line_numbers": true,
// ガター表示
"gutter": true,
// ガーターとコードの間
"margin": -10,
// ルーラー（カンマ区切りで複数指定可能）
"rulers": [0,80],
// タブサイズ
"tab_size": 4,
// タブをスペースに変換（タブのままが良い人はfalseに）
"translate_tabs_to_spaces": true,
// 自動折り返しを有効
"word_wrap": true,
// ミニマップにボーダー線を表示
"draw_minimap_border": true,
// フォーカス中の行をハイライト
"highlight_line": true,
// 対応する山括弧（HTMLタグなど）の強調
"match_brackets_angle": true,
// 行間指定
"line_padding_top": 0,
"line_padding_bottom": 3,
// スペースの表示
"draw_white_space": "all",
// 空白の削除
"trim_trailing_white_space_on_save": true,
// 文字コード
"default_encoding": "UTF-8",
// オートコンプリートの選択をタブに
"auto_complete_commit_on_tab": false,``

#Package Controlのインストール
Package Controlのインストールタグを下記からコピーする。
https://sublime.wbond.net/installation
コピー後”Ctrl+`”を実行しペーストしEnterを押下する

上記設定後再起動を行い"Ctrl+Shift+p"
から”install”を入力しPackage Control: install Packageを選択して
packageのインストールを行う

#インストールしたpackage一覧
※随時更新します


+ HTML5 : HTML5の補完
+ Phpcs : PHPの補完
+ BracketHighlighter：開始/終了{}などの強調表示
+ IMESupport：日本語インライン入力関連
* SFTP : SFTP関連
* SyncedSideBar : 現在開いているファイルと、サイドバーのファイルを同期してくれるパッケージ
* ConvertToUTF8 : Shift-JIS、EUC-JPの文字化け対応


###コードチェック関連
+ SublimeLinter
+ SublimeLinter-php
+ SublimeLinter-phpmd
+ SublimeLinter-phpcs
なぜdelegateはunowned(unsafe)+Implicitly Unwrappedなの？

またも机上の空論で投稿を書いてしまった。。。
仕事が忙しくなると逃避したくなるよね。

## 疑問1 なぜImplicitly Unwrappedなのか？
Implicitly Unwrappedはdelegateがnilの場合に危険なので、普通のOptionalで使った方が安全に思われます。でも、そもそもunowned(unsafe)定義をしている時点で、nilチェックしても安全性はチェックできません。

そもそも「初期化後にnilである可能性がある」場合には、unownedではなく、weakを使うべきです。つまり正しい組み合わせは下記の二つです。

* weak + Optional
* unowned(unsafe) + Optional Implicitly Unwrapped

[The Swift Programming Language](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html)

```text
Use a weak reference whenever it is valid for that reference to become nil at some point during its lifetime. Conversely, use an unowned reference when you know that the reference will never be nil once it has been set during initialization.
```

## 疑問2 なぜweakじゃなくてunowned(unsafe)なのか？
本来の趣旨からいけば、初期化時のパラメタとして与える必須のdelegateについてはunowned、後から設定できるoptionalなdelegateはweakにするのが正しいように思われます。前者の例はUIAlertView、後者の例はUITextViewなどですね。

Cocoaではすべてのdelegateがunownになっているようですが、これはフレームワークとしてはARCが無い場合にも対応したいからでしょうか。誰かご存知ですか？

## 疑問3 Implicitly Unwrappedはいつ使うのか？
これには、[Two-Phase Initialization](https://developer.apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html#//apple_ref/doc/uid/TP40014097-CH18-XID_329)が関係してきます。
Swiftの初期化において、第一フェーズが終わりすべての変数に初期値が設定されるまでは、そのインスタンスは使用する事ができません。

ここで、AとBが相互参照するケースを考えると、AはBの初期化が完了するまでBを参照できず、BはAの初期化が完了するまでAを参照できません。これを回避するため、AからBの参照をOptionalとし、nilで初期化することでAの初期化を完了させます。これでAの参照が使用できるようになるので、これを用いてBを初期化します。最後に、初期化が完了したBをAから参照します。

この場合、どちらか一方は弱参照にしないと循環参照となるため、一方をunowned(unsafe)に設定する必要があります。これが、unowned(unsafe)+Implicitly Unwrappedの正しいユースケースのようです。
Serverspecで複数ホストのテストをする時、途中でfailしても、最後までspecを実行させる。

# Rspec::Core::RakeTask#fail_on_errorをfalseにする

これで途中でfailするexampleがあっても最後まで全ホスト分のspecを実行してくれます。

## 例

```rb:Rakefile
namespace :serverspec do
  task :all => properties.keys.map {|key| 'serverspec:' + key.split('.')[0] }
  properties.keys.each do |key|
    desc "Run serverspec to #{key}"
    RSpec::Core::RakeTask.new(key.split('.')[0].to_sym) do |t|
      ENV['TARGET_HOST'] = key
      t.pattern = 'spec/{' + properties[key][:roles].join(',') + '}/*_spec.rb'

      # 途中でfailしてもspec実行を続ける
      t.fail_on_error = false
    end
  end
end
```

# ちなみに

実は、本件はServerspecと直接関係がありません。
Rakeコマンド（プロセス）とRakeタスクの関係です。

例のRakefileでは、
複数ホストへのServerspecを
```1ホスト=1Rakeタスク```
として、テストしたいホストの数だけRspecのRakeタスクを実行します。

デフォルトではfailするexampleがあると、そのRakeタスクが異常終了して
Rakeコマンドがabortしてしまうので
```fail_on_error```を```false```にして（異常終了しないようにして）それを防いでいます。

## 参考
* [How to use host specific properties](http://serverspec.org/advanced_tips.html)
* [Rspec::Core::RakeTask#fail_on_error](http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#fail_on_error-instance_method)
Herokuで思うように動かないWebSocketのサンプルたち

[JavaWebSockets(本家のサイト！)](http://www.playframework-ja.org/documentation/2.0.8/JavaWebSockets)とか[Websockets in Play 2.0 - Blueprint Forge.](http://blueprintforge.com/blog/2012/02/13/websockets-in-play-2-dot-0/)とかのサンプルコードがスッキリ動いてくれなくて激しくハマったのでメモ。

```java:コントローラ
public static WebSocket<String> index() {
  return new WebSocket<String>() {
      
    // WebSocket のハンドシェイクが完了すると呼ばれます。
    public void onReady(WebSocket.In<String> in, WebSocket.Out<String> out) {
      
      // ソケットで受け取ったイベント毎に
      in.onMessage(new Callback<String>() {
         public void invoke(String event) {
             
           // コンソールにイベントのログを出力する
           println(event);  
             
         } 
      });
      
      // ソケットが閉じた時
      in.onClose(new Callback0() {
         public void invoke() {
             
           println("Disconnected")
             
         }
      });
      
      // 単一の `Hello!` というメッセージを送る
      out.write("Hello!");
      
    }
    
  }
}
```
WebSocket のハンドシェイクが完了すると呼ばれるらしい`onReady`の中で、WebSocketの入力チャンネルに`onMessage`と`onClose`のハンドラを設定し、出力チャンネルの`write`でクライアントにWebSocket通信を試みているコード。

これがHerokuだと思うように動かない。localhostでは動く。

'動かない'というのは、

```
out.write("Hello!");
```
でWebSocketの出力チャンネルに書き込んだハズなのに、クライアント側のJSのWebSocketオブジェクトのonmessageイベントがfireされないということ。

localhostでは、クライアントのonmessageはすぐに反応するが、Herokuに配置したアプリケーションでは、onmessageはいつまでたっても反応せず、サーバとの通信がないまま55秒経ってしまうと、[Herokuのタイムアウト](https://devcenter.heroku.com/articles/request-timeout#long-polling-and-streaming-responses)に引っ掛かってWebSocketが断絶してしまう。さらに不思議なことに、その際、上記`out.write("Hello!");`で書き込んでいた内容が、突然onmessageでキャッチされる。out.writeは決して書き込み失敗したのではなく、何故か待ち状態になってしまっているように思われる。

##解決策
**onReadyの中でout.writeしない**

onReadyはハンドシェイクが完了したら呼ばれる、と書いてあるが、これがイマイチ釈然としない。out.writeをするということは、できたばっかりのWebSocketのoutを使って通信をするということであるが、これがうまくいっていない模様。ハンドシェイクが'本当に'完了する前にoutを使ってしまい、そこで処理が止まってしまっているのではないだろうか。試しにout.writeを取り除いてみると、思った通りの、定義通りの挙動をするようになった。onReadyの中で無理にクライアントに通信を返す必要は特段ないので、今後はこのような対応を取ることにする。しかし[APIリファレンス](https://www.playframework.com/documentation/2.0/api/java/play/mvc/WebSocket.html)が貧弱で困る。
tmuxをインストールする

##tmuxとは
tmuxを使うと一つのターミナルで複数のウィンドウを表示することができる。
ソースコードの編集とサーバーの起動を同時にできるので便利です。

似たようなアプリケーションにscreenがありますが、
先輩社員にscreenは**オワコン**って言われたのでこちらを導入しました。

##RPMforgeリポジトリをインストールする
RPMforgeリポジトリ：標準のyumコマンドではインストールできないパッケージを追加する。

[ここ](http://pkgs.repoforge.org/rpmforge-release/)から使用しているLinuxに合ったものをダウンロードする。
(CentOS6の64bitなら”rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm”)

wgetコマンドを使ってダウンロード

```
$ wget http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
```

rpmコマンドを使ってインストール

###rpmコマンド
rpmパッケージをインストールする。
"-i"はインストールのオプション，"-v"と"-h"は情報表示のオプション。

```
$ sudo rpm -ivh rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm
```

”/etc/yum.repos.d/”ディレクトリにはyumのリポジトリファイルが入っている。
インストールが正常に完了していれば”rpmforge.repo”ファイルが確認できる。

##tmuxをインストールする

yumコマンドを使ってインストール

```
$ sudo yum -y install tmux
```

きっとtmuxコマンドでtmuxが立ち上がるはず･･･

##参考URL
http://centossrv.com/rpmforge.shtml