OmniAICreator/Qiita-1.07M huggingface dataset:
macでopen-ocdを使ってstm32f4discoveryのサンプルプログラムを実行するまで


stm32f4disoveryをmac上で開発するためのメモ。
今回は導入からサンプルを実行するまで。 ![stm32f4disvoery](http://akizukidenshi.com/img/goods/3/M-05313.JPG)

### stm32f4discoveryについて

- ARM Coretex-M4 STM32F407VGT6 Microcontroller
- 1MB Flash
- 128KB + 64KB RAM
- micro usbがあればデバッグ可能
- 電源もmicro usbから供給可能
- mini USBはUSB OTG対応

- もろもろのドキュメントは[ここ](http://www.st.com/web/jp/catalog/tools/FM116/SC959/SS1532/LN1848/PF252419#)

- [データシート](http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/data_brief/DM00037955.pdf) 
- [User manual](http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/user_manual/DM00039084.pdf) ... ハード的な仕様はだいたいここみればわかる
- [Getting started with software and firmware environments](http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/user_manual/DM00037368.pdf)
	- ライブラリとかの説明
	- Win用のIDE前提っぽいので、ところどころ読み飛ばすか、そもそもライブラリのソースのドキュメントを読んだ方が早いかもしれない

### やったこと

1. stm32f4discoveryを買う。
[秋月](http://akizukidenshi.com/catalog/g/gM-05313/)とかで買える。

2. open-ocd(, gcc-arm-embedded) とかを入れる

	``` shell
	curl -L -O https://launchpad.net/gcc-arm-embedded/4.8/4.8-2014-q2-update/+download/	gcc-arm-none-eabi-4_8-2014q2-20140609-mac.tar.bz2
	tar xjvf gcc-arm-none-eabi-4_8-2014q2-20140609-mac.tar.bz2
	brew install open-ocd
	```
3. サンプルコード実行
	今回は、PCMオーディオを再生するサンプルを動かす。

	``` shell
	curl -O http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/	resource/technical/software/firmware/stsw-stm32068.zip
	unzip stsw-stm32068.zip
	cd  STM32F4-Discovery_FW_V1.1.0/Project/Audio_playback_and_record/Binary/
	openocd -f board/stm32f4discovery.cfg -c "program STM32F4-Discovery_Audio_IntFLASH_V1.0.0.hex verify reset"
	```

	しばらくすると再起動して,青ボタンを押すとサンプル音源がなる。
	今回動かした [アプリのドキュメント](http://www.st.com/st-web-ui/static/active/jp/resource/technical/document/application_note/DM00040802.pdf)


TODO:
サンプルはIDE用の設定ファイルしかないので、
gcc-arm-embeddedを使って、terminalからビルドできるように
Makefileを書く。
とりあえず最短でMac環境でAnsibleを使ってる気になるためのメモ

何も考えずにMac環境で[ansible](http://www.ansible.com/home)を使ってみたいとき。

# vagrantやvirtualboxのインストール

[Homebrew Cask](http://caskroom.io/)を使って[vagrant](http://www.vagrantup.com/)や[VirtualBox](https://www.virtualbox.org/)をインストール。

```bash
$ brew tap phinze/homebrew-cask
$ brew install brew-cask
$ brew cask install virtualbox
$ brew cask instlal vagrant
```

# vagrantの用意

boxは[chef/centos-6.5](https://vagrantcloud.com/chef/centos-6.5)を利用する前提で`Vagrantfile`を用意。
このとき、`private_network` の設定を入れるようにする。

```bash
$ vagrant init chef/centos-6.5
$ sed -i -e '/config.vm.network "private_network"/s/# //g' Vagrantfile # private_networkの設定を入れる
$ vagrant up
```

# ansibleの実行

ansibleはinventory hosts fileというところに記載されたhostにしかアクセスしないので、`./hosts`にvagrantのIPを指定。
そうすれば、ansibleの実行ができるように。

```bash
$ echo "192.168.33.10" > ./hosts
$ ansible --private-key ~/.vagrant.d/insecure_private_key -i hosts 192.168.33.10  -u vagrant  -m "ping"
192.168.33.10 | success >> {
    "changed": false,
    "ping": "pong"
}
```

```bash
$ ansible --private-key ~/.vagrant.d/insecure_private_key -i hosts 192.168.33.10  -u vagrant  -a "ls -la"
192.168.33.10 | success | rc=0 >>
total 36
drwx------. 4 vagrant vagrant 4096 Jun 28 01:38 .
drwxr-xr-x. 3 root    root    4096 Mar  7 11:53 ..
drwxrwxr-x. 3 vagrant vagrant 4096 Jun 28 01:38 .ansible
-rw-------. 1 vagrant vagrant   30 Jun 28 01:28 .bash_history
-rw-r--r--. 1 vagrant vagrant   18 Jul 18  2013 .bash_logout
-rw-r--r--. 1 vagrant vagrant  176 Jul 18  2013 .bash_profile
-rw-r--r--. 1 vagrant vagrant  124 Jul 18  2013 .bashrc
drwx------. 2 vagrant root    4096 Mar  7 11:54 .ssh
-rw-r--r--. 1 vagrant vagrant    5 Mar  7 11:54 .vbox_version
```

これで、とりあえず使った気分になれます。
rubyのバッチやデーモンに便利なDBラッパー


# 背景
Socket.IOを使ったスマホ向けSPA(Single Page Application)のサイト[SmartFX](http://smartfx.minkabu.jp)を運用しています。
指値、逆指値等の予約注文を実装するにあたって、DBまわりの処理をいかに効率よく処理するかがポイントとなりました。
なぜなら、為替レートは1秒間に複数回更新されることがあり、また通貨ペアも複数あります。
その更新の度に該当する予約注文があるか検索し、該当レコードがあれば注文を約定する必要があります。
そのため直にSQLを叩く必要があるのですが、Webアプリ自体はRailsで書かれているので、その設定ファイルを活用しつつDBに対して直接クエリを発行できるような[Dbwrapper](https://github.com/takeshy/dbwrapper)というGemを作りました。
また、いくつかの便利メソッドも追加しています。
sqlite3、mysql2、postgresqlに対応。


#install

Gemfileに下記を追加します。

```ruby:gemfile
gem 'dbwrapper'
#sqlite3を使わない場合は下記をコメントアウト
gem 'sqlite3'
#postgresqlを使わない場合は下記をコメントアウト
gem 'pg'
gem 'pg_typecast'
#mysql2を使わない場合は下記をコメントアウト
gem 'mysql2'
gem 'mysql2-cs-bind'
```

#使い方
```ruby
#sqlite3
db=Dbwrapper::DB.new(database: "test.sqlite3",adapter: "sqlite3")
#mysql2
db=Dbwrapper::DB.new(database: "test",adapter: "mysql2",username: "root",password: "xxxx",host: "xxxx")
#postgresql
db=Dbwrapper::DB.new(database: "test",adapter: "postgresql",username: "root",password: "xxxx",host: "xxxx")
#もしくは単にRailsのdatabase.ymlを読み込ませる
db=Dbwrapper::DB.new(YAML::load(File.open('database.yml'))["development"])

#dbのドライバーインスタンスは下記で直接参照可能
db.client

#create tableはDBによって使える型が全然違うので意識が必要 ここはdatetime型を使っているのでmysql2のみ
#create tableの実行 
db.query("create table users (id integer,name text,created_at datetime)")

#insertの実行
db.query('insert users (id,name,created_at) value(?,?,?)',1,"smith","2014-2014-06-26 00:00:00")

#DB種類を意識せず簡単にlast_idを取れる
db.last_id #=> 1

#selectはHashのArrayが返ってくる
db.query("select * from users") #=> [{"id"=>1, "name"=>"smith", "created_at"=>2014-06-26 00:00:00 +0900}]

#update
db.query("update users set name=? where id = ?","hay",1)

#DB種類を意識せず簡単にaffected_rowsが取れる
db.affected_rows #=> 1

#dbの返却値も直接参照可能
db.result

#便利メソッド table名とhashのArrayを渡すことでmultiple insertが可能。
#sqlite3の場合はmultiple insert非対応なので単にレコード数回insertが実行されます。
db.xinsert("users",[{id: 2,name: "hello",created_at: Time.now},{id: 3,name: "good",created_at: Time.now}])

#便利メソッド テーブル名とパスを指定することでpathの配下にテーブル名 + .csvの名前でバックアップが作成されます。
db.backup_table("users","/var/backup")

#truncate もしsqlite3だった場合は単にdeleteが呼ばれます。
db.truncate("users")

#便利メソッド テーブル名とパスを指定することでpathの配下のテーブル名 + .csvのファイルのデータを読み込み、テーブルをリストアします
db.restore_table("users","/var/backup")

#DBのclose postgresqlの場合はfinishが呼ばれる
db.close
```

#まとめ

バッチやデーモンでは大量のinsertを行ったり、複数のレコードを同時にupdateかけたり、複雑なSQLを書きたいことがよくあるので、その際に便利に使えます。
バッチの実行前と実行後で関連するtableのbackupを実行することで問題があった場合の検証にも使えます。
Mac OS MervericksにVagrantでUbuntu 14.04の環境を作ってみる

なんとなくVagrant便利らしいので使ってみようかと思い、現段階でのUbuntu最新版14.04の環境を構築してみました。

#Vagrantのインストール
[Vagrantの公式ページ](http://www.vagrantup.com/)からVagrantをダウンロードしてきます。
特に特殊な操作は必要なくGUIでインストールできます。

インストールできたら
>$ vagrant --version
>Vagrant 1.6.3

で確認できます。(Rubyで出来てるのでversion確認方法も同じですね)

わかりにくかったら、[ここ](http://weblabo.oscasierra.net/install-vagrant-onto-macosx/)のページにあり得ないくらい親切に書いてあるので参照して下さい。

#Virtual Boxのインストール
実際に仮想化ソフトを作り出すバックエンドをしていするのですが、ここでは無料のVirtual Boxを使ってやってみます。

こちらのインストールも[公式サイト](https://www.virtualbox.org/wiki/Downloads)から簡単にダウンロードできます。


#UbuntuのBoxイメージの作成
VagrantはBoxイメージと呼ばれる、仮想マシンを作成する際に必要なOSのディスクイメージファイル等が入ったファイルの集まりで、仮想マシンのテンプレートを作る必要があるそうです。

[http://www.vagrantbox.es/](http://www.vagrantbox.es/)などで配布されている.boxファイルを使用することも出来るのですが一応カスタマイズするときとかにはイメージから作成するらしいので今回は自分で作ってみます。

##Packerのインストール
Virtual Box用のイメージの作成や、AWSのAMIイメージ等を作成するのに便利なツールとしてPackerが有名らしいのでまずPackerのインストール

Homebrewでインストールするのが速そうだったのでそちらで。（[公式サイト](http://www.packer.io/downloads.html)でも.zip形式で配布してるようです）

>$ brew tap homebrew/binary
>$ brew install packer

同様にインストールできたかの確認

>$ packer --version
Packer v0.6.0

##Boxイメージの作成
それではPackerを使ったboxイメージの作成に入ります。
テンプレートを落としてきてからPackerでイメージにbuildする形です。
テンプレートからbuildしたjsonを弄って色々カスタマイズが出来るらしいです。
buildは結構時間掛かりますが私の場合20分掛からず終了しました。

```
$ git clone https://github.com/shiguredo/packer-templates.git
$ cd packer-templates/ubuntu-14.04
$ packer build -only=virtualbox-iso template.json
```

#Vagrantの起動
Boxイメージが出来たらあとはVagrantで設定して終了

```
$ vagrant box add ubuntu-14.04 ubuntu-14-04-x64-virtualbox.box  # イメージファイルを ubuntu-14.04 という名前で登録
$ vagrant box list  # ubuntu-14.04 が box に登録されてかの確認
$ cd /作業ディレクトリ
$ vagrant init ubuntu-14.04  # box の ubuntu-14.04 で Vagrantfile(設定ファイル)を作成する
$ vagrant up  # 起動
$ vagrant ssh # 起動した仮想マシンにsshでログイン
```
docker-enter (docker-attach) スクリプト

`nsenter` を簡単に使えるようにするスクリプト `docker-enter` (`docker-attch`) を書きました。

そして丁度リリースされた CoreOS Alpha の最新版 361.0.0 に搭載しました。
[yungsang/coreos-alpha](https://vagrantcloud.com/yungsang/coreos-alpha)

<ins>追記：boot2docker にも搭載しました。</ins>
[yungsang/boot2docker](https://vagrantcloud.com/yungsang/boot2docker)

```bash:docker-enter
#!/bin/sh

print_usage() {
  echo "Usage: $(basename $0) <container id/name> [{command:-$SHELL} [argments...]]"
}

ID="$1"
if [ -z "$ID" ] ; then
  print_usage >&2
  exit 1
fi
shift

PID=$(docker inspect --format '{{.State.Pid}}' "$ID" 2> /dev/null)
if [ -z "$PID" -o "$PID" = "0" ] ; then
  echo "$ID: no such container is running" >&2
  exit 1
fi

echo nsenter --target $PID --mount --uts --ipc --net --pid -- "$@"
sudo nsenter --target $PID --mount --uts --ipc --net --pid -- "$@"
```

<del>最後の $@ の処理がちょっと気にはなってます。</del>  
`-- $*` <ins>に修正しました。</ins>
`sh -c` <ins>元々要らなかったのですっきりしました。</ins>

Cf.) https://github.com/YungSang/docker-attach

```
$ vagrant init yungsang/coreos-alpha -m
$ vagrant up
$ vagrant ssh
   ______                ____  _____
  / ____/___  ________  / __ \/ ___/
 / /   / __ \/ ___/ _ \/ / / /\__ \
/ /___/ /_/ / /  /  __/ /_/ /___/ /
\____/\____/_/   \___/\____//____/
(alpha 361.0.0)
core@localhost ~ $ docker-enter
Usage: docker-enter <container id/name> [{command:-/bin/bash} [argments...]]
core@localhost ~ $ docker run -d yungsang/busybox nc -p 8080 -l -l -e echo hello world!
core@localhost ~ $ docker ps -l
CONTAINER ID        IMAGE                     COMMAND                CREATED             STATUS              PORTS               NAMES
1a1f6106a222        yungsang/busybox:latest   nc -p 8080 -l -l -e    27 seconds ago      Up 27 seconds                           dreamy_kowalevski
core@localhost ~ $ docker-enter $(docker ps -l -q) sh
nsenter --target 636 --mount --uts --ipc --net --pid sh
/ # ps
PID   USER     COMMAND
    1 root     nc -p 8080 -l -l -e echo hello world!
    7 root     sh
    8 root     ps
/ # exit
core@localhost ~ $ exit
$ vagrant ssh -c 'docker-enter $(docker ps -l -q) sh'
nsenter --target 636 --mount --uts --ipc --net --pid sh
/ # exit
$ 
```
Gruntと連携させてNightwatch.jsでテスト書いたら自動実行するやり方

たぶん後々自分で調べることが出てきそうなので簡単に手順をメモ

## 事前準備

### 必要なモノとか

- 以下のnpm module
  - grunt
  - grunt-contrib-watch
  - grunt-nightwatch
- 上記npmモジュール準備した後に利用するGruntfile.coffee

### npmモジュールインストール

```sh
npm install grunt --save-dev
npm install grunt-contrib-watch --save-dev
npm install grunt-nightwatch --save-dev
```

### Gruntfile.coffeeの準備

```coffee
module.exports = (grunt) ->
  grunt.initConfig
    pkg: grunt.file.readJSON 'package.json'
    watch:
      files:['tests/*.js']
      tasks:'nightwatch'
  
    nightwatch:
      options:{}

  grunt.loadNpmTasks 'grunt-contrib-watch'
  grunt.loadNpmTasks 'grunt-nightwatch' 
  grunt.registerTask 'default', ['watch']
```

## 利用する

ターミナルを立ち上げ、以下コマンド入力します

```sh
grunt
```

そうすると、

```sh
Running "watch" task
Waiting...
```

となるかと思います。

あとは以下の様なファイルを作成＆保存

```javascript
// tests/google.js
module.exports = {
  setUp : function() {

  },

  tearDown : function() {

  },
  'Demo test Google' : function (client) {
    client
      .url("http://www.google.com")
      .waitForElementVisible('body', 3000)
      .assert.title('Google')
      .assert.visible('input[type=text]')
      .setValue('input[type=text]', 'nightwatch')
      .waitForElementVisible('button[name=btnG]', 3000)
      .click('button[name=btnG]')
      .pause(1000)
      .assert.containsText('#main', 'The Night Watch')
      .end();
  }
}
```

ターミナルにこんな感じで実行結果が表示されます

```sh
>> File "tests/google.js" changed.
Running "nightwatch" task
>> Executing "default" tests
```

これで、テストコード書く→ターミナルでコマンド実行というほんのちょっとの手間が省けました
オープンリゾルバ確認 (コマンドライン)

jpcertのHPから[オープンリゾルバ確認サイト公開のお知らせ](https://www.jpcert.or.jp/pr/2013/pr130002.html#cli)を発見。

```bash:[OPEN]だとオープンリゾルバ状態
$ wget -qO - http://www.openresolver.jp/cli/check.html
Configured DNS server: [OPEN] 192.0.2.2(ns.example.com)
Source IP address: [NOT open] 192.0.2.1(gw.example.com)
```

# オープンリゾルバはなぜマズイか？

[あらためてオープンリゾルバ対策の徹底を：過去最大規模のDDoS攻撃が発生、ピーク時には300Gbps以上のトラフィック - ＠IT](http://www.atmarkit.co.jp/ait/articles/1303/28/news139.html)

> DDoS攻撃の多くは、外部からの再帰検索を許可しているDNSサーバ（オープンリゾルバ）を悪用したものだった。
ラジオボタンで選んだ項目によって「次へ」ボタンの挙動が変わる場合の実装

例えば、チケット購入システムの開発で、支払い方法をクレジットカード、コンビニ支払、ギフト券から選ぶとする。

- クレジットカードを選んだ場合
    - そのすぐ下にカード番号や有効期限などを入力する欄が表示される。
    - これらを入力して「次へ」ボタンを押すと、決済完了画面と領収書番号が表示される
- コンビニ支払いを選んだ場合
    - 「次へ」ボタンを押すと、払込票が表示され、プリントアウトしコンビニへ持っていく旨表示される
- ギフト券を選んだ場合
    - ギフト券IDの入力画面が現れる
    - 入力すると、ギフト券利用の完了画面が表示される

# 第1案
よくある実装はこんな感じ

```coffeescript
angular.module("app").controller "SomeCtrl", ["$scope", "$state", ($scope, $state) ->
  radio = $scope.radio =
    credit: "credit"
    conSt: "convenienceStore"
    gift: "gift"
  $scope.selectedValue = radio.credit
  $scope.submit = ->
    switch $scope.selectedValue
      when radio.credit then validate $scope.creditForm
        .then submitCredit
        .then -> $state.go "finishUsingCredit" 
      when radio.conSt then $state.go "usingConvenienceStore"
      when radio.gift then validate $scope.giftForm
        .then submitGift
        .then -> $state.go "finishUsingGift"
]
```

```haml
%input(type="radio" ng-model="selectedValue" ng-value="radio.credit")
  クレジットカード
  %div
    -# creditForm
%input(type="radio" ng-model="selectedValue" ng-value="radio.conSt")
  コンビニ支払い
%input(type="radio" ng-model="selectedValue" ng-value="radio.gift")
  ギフト券を使用
  %div
    -# giftForm
%button(ng-click="submit()")
  次へ
```

この実装方法は、新たに項目、例えば「おねだりする」が加わった時点で破綻する。radio オブジェクトのキーを1つ増やし、submit 内で switch の when 句も増やさなければならない。

# 第2案
実は、`ng-value` に指定する値は文字でなくても良い。オブジェクトでも配列でも、関数でも良い。
というわけで、radio に直接関数を入れてしまえばスッキリ解決する。

```coffeescript
angular.module("app").controller "SomeCtrl", ["$scope", "$state", ($scope, $state) ->
  radio = $scope.radio =
    credit: ->
      validate $scope.creditForm
      .then submitCredit
      .then -> $state.go "finishUsingCredit"
    conSt: -> $state.go "usingConvenienceStore"
    gift: ->
      validate $scope.giftForm
      .then submitGift
      .then -> $state.go "finishUsingGift"
  $scope.selectedMethod = radio.credit
]
```

```haml
%input(type="radio" ng-model="selectedMethod" ng-value="radio.credit")
  クレジットカード
  %div
    -# creditForm
%input(type="radio" ng-model="selectedMethod" ng-value="radio.conSt")
  コンビニ支払い
%input(type="radio" ng-model="selectedMethod" ng-value="radio.gift")
  ギフト券を使用
  %div
    -# giftForm
%button(ng-click="selectedMethod()")
  次へ
```
続・UnityのInspectorで扱えるDictionary

前回の投稿
http://qiita.com/k_yanase/items/fb64ccfe1c14567a907d
でバイナリデータにシリアライズできるかもと思って試したところうまくいったので強化してみた

```
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
//using System.Reflection;

namespace Serialize {

	[System.Serializable]
	public class TableBase<TKey, TValue, TPair> where TPair : KeyAndValue<TKey, TValue> , new (){
		[SerializeField]
		protected List<TPair> list;						
		protected Dictionary<TKey, TValue> table;		

		public TableBase () {
			list = new List<TPair>();
		}

		public Dictionary<TKey, TValue> GetTable () {
			if (table == null) {
				table = ConvertListToDictionary(list);
			}
			return table;
		}

		public TValue GetValue (TKey key) {
			if(GetTable ().Keys.Contains(key)){
				return GetTable ()[key];
			}
			//Debug.LogError(key +" は存在しないKeyです");
			return default(TValue);
		}

		public void SetValue (TKey key, TValue value) {
			if(GetTable ().Keys.Contains(key)){
				//Debug.Log ("SetValue() Change Value.");
				table[key] = value;
			}else {
				//Debug.Log ("SetValue() Add new table.");
				table.Add(key, value);
			}
		}

		public void Reset () {
			table = new Dictionary<TKey, TValue>();
			list = new List<TPair>();
		}
		public void Apply () {
			list = ConvertDictionaryToList(table);
		}

		static Dictionary<TKey, TValue> ConvertListToDictionary (List<TPair> list) {
			Dictionary<TKey, TValue> dic = new Dictionary<TKey, TValue> ();
			foreach(KeyAndValue<TKey, TValue> pair in list){
				dic.Add(pair.Key, pair.Value);
			}
			return dic;
		}

		static List<TPair> ConvertDictionaryToList (Dictionary<TKey, TValue> table) {
			List<TPair> list = new List<TPair>();

			if(table != null){
				foreach(KeyValuePair<TKey, TValue> pair in table){
					TPair type = new TPair();
					type.Key = pair.Key;
					type.Value = pair.Value;
					list.Add(type);
				}
			}
			return list;
		}
	}

	/// <summary>
	/// シリアル化できる、KeyValuePairに代わる構造体
	/// </summary>
	[System.Serializable]
	public class KeyAndValue<TKey, TValue>
	{
		public TKey Key;
		public TValue Value;
	}
}
```

大きな変更点は
・Apply()メソッドが追加されたこと
・KeyAndValueのコンストラクタがなくなったこと
です

GetTableで取得した取得したディクショナリに変更を加えた後、BinaryFommaterなどでバイナリデータに保存したり、UnityのScriptableObjectに変更を保存する前にApplyメソッドを呼ぶことで、
``protected Dictionary<TKey, TValue> table;``
に記録されたデータをシリアライズ可能なList型の
`` protected List<TPair> list;``
に再度適用することが出来るので、保存も可能になりました。

そのかわり、変換の都合でコンストラクタでKeyAndValueを作るのか少しめんどくさくなってますが、実際のところDictionaryクラスを通して編集することになるので、あまり影響はないと思います


また、GetTableを通してDictionaryとして編集が可能なので、Dictionaryクラスの便利な機能も使うことが可能です
【Objective-C】翌日の指定時間のNSDateを取得する。

- xcode 5.1.1
- Mac OS 10.9.3

翌日の指定時間を取得したかったので、色々調べた結果
下記のような感じで書けそう。

```objectivec
NSDate* date = [NSDate date];
NSCalendar *calendar = [NSCalendar currentCalendar];

NSDateComponents *dateComps = [calendar components:NSYearCalendarUnit |
                               NSMonthCalendarUnit  |
                               NSDayCalendarUnit    |
                               NSHourCalendarUnit   |
                               NSMinuteCalendarUnit |
                               NSSecondCalendarUnit fromDate:date];
// 例）翌日の20:00を取得したい。
[dateComps setDay:(dateComps.day + 1)];
[dateComps setHour:20];
[dateComps setMinute:0];
[dateComps setSecond:0];

NSDate * notification_date = [calendar dateFromComponents:dateComps];
NSLog(@"date: %@", notification_date);
```

結果

```
date: 2014-06-19 11:00:00 +0000
```
javaで動的な二次元配列の作り方

二次元配列[i][j]において、iは固定長でjが可変長な二次元配列を作る方法。
簡単に表すとこんな感じ

  1 2 3 4 5 6 7 8 9 
1 - - - - - - -
2 - - -
3 - - - - - - - - - 
4 - -
5 - - - - - -

縦がi,横がj,-が配列の各要素



流れ的には
①二次元配列[5][]を作る
②ArrayListを使って、i行目の可変長部分を取得
③ArrayListから配列に戻す

実際にはこんな感じ
①String[][] s = new String[5][]

②ArrayList<String> list = new ArrayList<String>();
　でリストを定義
  list.add("")をi行目のj分だけfor文で回す

③String[i] s = (String[])list.toArray(new String[0]);
　をiの数だけfor文でまわす
[Emacs] flycheck で hlintを使う

# [Emacs] `flycheck` で `hlint`を使う

## `hlint`のインストール

```console:cabalを使う場合
$ cabal install hlint
```

```console:Ubuntuでパッケージを使う場合（おすすめしない）
$ sudo apt-get install hlint
```

## Emacsの設定

### `flycheck`のインストール

Caskを使う場合、以下をファイル`Cask`に追加する。

```elisp:Cask
(depends-on "flycheck")
```

元から入っているパッケージシステムを使う場合、
`M-x package-install`でパッケージを聞かれるので、`flycheck`を指定してください。

### `haskell-mode`での`flycheck`の設定

```el:.emacs.d/init.el
(add-hook 'haskell-mode-hook
          '(lambda ()
             (setq flycheck-checker 'haskell-hlint)
             (flycheck-mode 1)))
```

#### おまけ

`cabal-dev`使ってたら不都合が出たので、`haskell-ghc`チェッカをオフにしました。

```el:.emacs.d/init.el
(add-hook 'haskell-mode-hook
          '(lambda ()
             (setq flycheck-checker 'haskell-hlint)
             (setq flycheck-disabled-checkers '(haskell-ghc))
             (flycheck-mode 1)))
```

# 参考文献

* `flycheck` [本家](http://flycheck.readthedocs.org/)
    * [Quickstart](http://flycheck.readthedocs.org/en/latest/guide/quickstart.html)
    * [Haskell](http://flycheck.readthedocs.org/en/latest/guide/languages.html#haskell)
[Emacs] flycheck で coffeelintを使う

# [Emacs] `flycheck` で `coffeelint`を使う

## `coffeelint`のインストール

```console:システムのnodeを使う場合
sudo npm install -g coffeelint
```

```console:nvmのnodeを使う場合
npm install -g coffeelint
```

## Emacsの設定

### `flycheck`のインストール

Caskを使う場合、以下をファイル`Cask`に追加する。

```elisp:Cask
(depends-on "flycheck")
```

元から入っているパッケージシステムを使う場合、
`M-x package-install`でパッケージを聞かれるので、`flycheck`を指定してください。

### `coffee-mode`での`flycheck`の設定

```el:.emacs.d/init.el
;; flycheck
(add-hook 'coffee-mode-hook
          `(lambda ()
             (setq flycheck-checker 'coffee)
             (flycheck-mode 1)))
```

`coffee`チェッカーは、`coffee`コマンドで警告以外が出てなければ`coffeelint`を実行するチェッカーです。

# 参考文献

* `flycheck` [本家](http://flycheck.readthedocs.org/)
    * [Coffeescript](http://flycheck.readthedocs.org/en/latest/guide/languages.html#coffeescript)
* `coffeelint` [本家](http://www.coffeelint.org/)
小技　テキストマクロで編集を楽にする

k2eエディタの場合で記述します。
大抵のテキストエディタが同様の機能を有しているので、調べてやってみましょう！！

まずは、メニューを開いてマクロのコマンドを調べます。

k2eの場合の流れは以下の通りです。

（１）マクロ記録
記録開始（Shift+F1）⇒キーボードで覚えさせたい操作を記録⇒記録終了（Shift+F1）

（２）マクロ実行
Shift + F2

◆実際にやってみよう
（１）Shift+F1　または　「その他」⇒　「マクロ記録開始／記録終了」
![imga000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/a12b38d3-0c7c-aa8d-ee28-aa882a02eeda.jpeg)

（２）メニューバーの上部が［★記録中］となったことを確認して、キーボード操作を覚えこませます。
　　ポイント①：記録の開始位置をしっかり
　　ポイント②：homeやendを使って、文字数に関係なく移動できる操作を使うと誤操作防止になります。
![imga000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/1da2fb36-06e8-d3db-ff5a-f4e95e84269f.jpeg)

（３）実際に操作を覚えこませた後に（１）と同様にShift+F1などでマクロ保存をします。［★記録中］が消えたことを確認します。
　　今回はこんな風に打ちました。こうすると最終文字の後に「aaa」を入力して次の行に移動します。
`「End」→「 (Space)」→「|」→「 (Space)」→「aaa」→「Home」→「↓」`
![imga000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/91bc509c-ca73-ac68-26c5-128973b2ec9c.jpeg)

（４）あとはShift+F2連打です！！文字が入る入る
![imga000005.JPG](https://qiita-image-store.s3.amazonaws.com/0/47012/4eab0681-da64-7a13-0b3f-cd9d5d4587d6.jpeg)


以上です。色々応用効かせると、作業がグンと捗ります。
[Groovy]文字とUnicodeの相互変換

そんなに使う機会は無いと思いますが、その機会が来てしまったのでメモ。

```groovy
// こいつを変換してみる
Character c = 'あ'

// 10進数のUnicodeに変換
Integer unicodeAsInteger = c as Integer
println unicodeAsInteger
assert unicodeAsInteger == 12354

// 16進数のUnicodeに変換（String）
// つまり\u3042とも言える
String unicodeAsHex = Integer.toHexString(unicodeAsInteger)
println "0x${unicodeAsHex}"
assert "0x${unicodeAsHex}" == "0x3042"

// 16進数(String)から10進数は以下のように戻せる
Integer intFromHex = Integer.parseInt(unicodeAsHex, 16)
assert intFromHex == unicodeAsInteger

// 10進数のUnicodeからStringを生成する
String str =  new String (unicodeAsInteger as int[], 0 ,1)
println str
assert str == "あ"

// もし生の16進数が分かっているのであれば当然以下のようにも出来る
assert new String(0x3042 as int[], 0, 1) == "あ"
```
[Emacs] flycheck でrubocopとruby-lintを使う

# `flycheck` で`rubocop`と`ruby-lint`を使う

[flycheck](https://github.com/flycheck/flycheck) は、Emacsで編集中に構文チェッカを走らせてエラーを表示してくれるEmacs Lispである。

`flycheck`でRubyのコーディングルールチェッカ、構文チェッカである`rubocop`と`ruby-lint`を走らせてみる

## `rubocop`と`ruby-lint`をインストール

```console:rbenv等の場合
$ gem install rubocop ruby-lint
```

```console:システムのRubyを使う場合
$ sudo gem install rubocop ruby-lint
```

## Emacsの設定

### `flycheck`のインストール

Caskを使う場合、以下をファイル`Cask`に追加する。

```elisp:Cask
(depends-on "flycheck")
```

元から入っているパッケージシステムを使う場合、
`M-x package-install`でパッケージを聞かれるので、`flycheck`を指定してください。

### Ruby modeでの`flycheck`の設定

```el:.emacs.d/init.el
;; flycheck
(add-hook 'ruby-mode-hook
          '(lambda ()
             (setq flycheck-checker 'ruby-rubocop)
             (flycheck-mode 1)))
```

「あれ、`ruby-lint`は？」と思うかもしれませんが、チェッカー`ruby-rubocop'は両方でチェックしてくれます。

# 蛇足

ちょっと前までは、`flycheck`は`rubocop`や`ruby-lint`に対応していなかったらしく、自前で`flycheck`のチェッカを書く必要があったようです。

[rubocop-mode](https://github.com/bbatsov/rubocop-emacs)というのもあったようですが、`flycheck`があれば不要でしょう。

# 参考文献

* 本家
  * [Quickstart](http://flycheck.readthedocs.org/en/latest/guide/quickstart.html)
  * [Rubyの項](http://flycheck.readthedocs.org/en/latest/guide/languages.html#ruby)

* [EmacsでRubyの開発環境をさらにめちゃガチャパワーアップしたまとめ | Futurismo](http://futurismo.biz/archives/2213)
  * 題名の通り、すごいパワーアップしていて、本記事の件以外でも参考になるのでおすすめです
  * `rubocop`, `ruby-lint`のチェッカを自前で書いている
* [RubyMotionアプリ開発に、motion-mode + Rubocop を導入 - Qiita](http://qiita.com/watson1978/items/debafdfc49511fb173e9)
  * やはりチェッカを自前で書いている
作業の役に立つツール

日々の作業で使用している便利ツールメモ
出来るだけフリーのものを使用しています。

■エディタ
k2e
⇒インストールしないで使えるので、色々なところに気軽に入れられます。
http://k2top.jpn.org/?K2Editor

■SSH Client
Tera Term
⇒定番
http://sourceforge.jp/projects/ttssh2/

■ファイル転送
WinScp
⇒SCP、SFTPソフト
http://winscp.net/eng/download.php

■画像ビューワ
VIX
⇒画像の大きさや、解像度落としが出来て便利です。
http://www.vector.co.jp/soft/win95/art/se083112.html

■画面キャプチャ
WinShot
⇒PrintScreenを押した時にクリップボードコピー、印刷、画像保存等ができます。
　エビデンス取得が捗ります。
http://www.vector.co.jp/soft/win95/art/se075666.html

■テキスト比較
DF
⇒シンプルなテキスト比較ソフトです。
http://www.vector.co.jp/soft/win95/util/se113286.html

■クライアント仮想化ソフト
VirtualBox
⇒クライアント仮想化ソフト。他にVmplayer等があるが、商用利用が認められなかったりします。
　スナップショットバックアップ機能等が一番優れていると思います。
http://www.forest.impress.co.jp/library/software/virtualbox/

■リモートソフト
RealVNC
⇒リモート操作ソフトです。リモートデスクトップと違って相手と画面を共有できます。
　Linux、Solarisのvncserverを設定すれば、これらのデスクトップが見れます。
　Oracleのインストール時などGUI必須の場合に役に立ちます。
http://www.vector.co.jp/soft/win95/net/se324464.html

■暗号化
アタッシェケース
⇒フリーの暗号化ソフトです。自己解凍形式で暗号ファイル作ったり便利です。
http://hibara.org/software/attachecase/

■レジストリ関連
レジストリ番犬ロン
⇒設定変更前のレジストリと変更後のレジストリを比較し、どこが変わったか見れます。
　コマンドユーティリティを持っていないソフトも強引に設定変更が可能になります。
http://www.vector.co.jp/soft/winnt/util/se271528.html
FuelPHP+Doctrine2でSQLをログに出すためにやったこと


正しくはDQLがログに出るのだけど、あった方が調査とかし易いのでログに書き出してみた。

FuelPHP+Doctrine2の構成は
http://qiita.com/gyhino@github/items/188d207d26f608269b3a
を引き続き使う。

## 要件

* ログにSQL(DQL)が出力される
* ログにクエリの実行時間が出力される

## Doctrine2でSQLをログに出すためにはどうしたらいい？

Doctrine2には`SQLLogger`を設定することができ、それを使うことで簡単にSQLを出力する事ができる。
`SQLLogger`はInterfaceとして提供されているだけなので、自分で好きに実装する。
https://github.com/doctrine/dbal/blob/master/lib/Doctrine/DBAL/Logging/SQLLogger.php

## FuelPHPのログにSQLを出すために改修をする

今回Doctrine2を扱うのに利用しているライブラリにも`SQLLogger`が用意されている。
https://github.com/aspendigital/fuel-doctrine2/blob/master/classes/Fuel/Doctrine/Logger.php

ライブラリ内で`profiling`が有効になっている場合これを使う様に実装されている。
しかし、この`SQLLogger`の実装はプロファイラにSQLと実行時間が表示されるようになるだけで、ログには書き出されない。

なので、これを拡張する形で進める。

### Fuel\Doctrine\Loggerの拡張

SQLと処理時間をログに出すにはこんな感じで拡張をする。

```php:fuel/app/classes/doctrine/SQLLogger.php
<?php

namespace Sample\Doctrine;

class SQLLogger extends \Fuel\Doctrine\Logger
{
	protected $startTime;
	protected $lastSql;

	public function startQuery($sql, array $params = null, array $types = null)
	{
		parent::startQuery($sql, $params, $types);

		$this->startTime = microtime(true);
		$this->lastSql = $sql;
	}

	public function stopQuery()
	{
		parent::stopQuery();
		
		\Log::info(json_encode(array(
			'sql' => $this->lastSql,
			'elapsedTime' => sprintf('%.10f', (microtime(true) - $this->startTime)), 
		)));
	}
}
```

### namespaceをAutoloaderに設定して読み込まれるようにする

今後のことを考え、PSR-0準拠で読み込むようにする。

```php:fuel/app/bootstrap.php
<?php

//...

// SQLLoggerが属するネームスペースをFuelPHPのAutoloaderに追加
Autoloader::add_namespace('Sample\Doctrine', APPPATH.'classes'.DIRECTORY_SEPARATOR.'doctrine'.DIRECTORY_SEPARATOR, true);

Autoloader::add_classes(array(
));

// Register the autoloader
Autoloader::register();

//...

```

### 拡張したSQLLoggerをDoctrine2に渡す設定をする

拡張したところで設定しないと使われないので、設定をする。

```php:fuel/app/config/db.php
<?php

return array(
	'doctrine2' => array(
		'proxy_dir' => APPPATH.'classes'.DIRECTORY_SEPARATOR.'proxy',
		'proxy_namespace' => 'Proxy',
		'metadata_path' => APPPATH.'classes'.DIRECTORY_SEPARATOR.'entity',
		'init_callback' => function($manager, $connection)
		{
			// Doctrineセットアップ時の一番最後に呼ばれるコールバック
			$manager
				->getConnection()
				->getConfiguration()
				->setSQLLogger(new Sample\Doctrine\SQLLogger($connection));
		},
	),
	//...
);
```

※`profiling`が無効の時は考慮できていないので、おそらく正しく動かない

## おしまい

おしまい。
Symfony2でCompassを使う／環境ごとに設定する(CentOS)

# やること

## サーバーに最新のrubyをインストールし、compassをインストールする

### 参考サイト

* [Rubyを最新ソースからインストール](http://centos.bungu-do.jp/archives/000294.html)
* Compassのインストール `gem install compass`
* Sassも入れておく？ `gem install sass`

## シンボリックリンクを作成

Symfony2はデフォルトで`/usr/bin/compass`を使うようです


```sh
ln -s /usr/local/bin/ruby /usr/bin/ruby
ln -s /usr/local/bin/compass /usr/bin/compass
```

Sass

```sh
ln -s /usr/local/bin/sass /usr/bin/sass
```

## config.ymlを編集

filtersに追加する

```yaml:config.yml
assetic:
    debug:          "%kernel.debug%"
    use_controller: false
    bundles:        ['FooBarBundle' ]
    #java: /usr/bin/java
    filters:
        cssrewrite: ~
#        sass:       ~
        compass:    ~
```

## ディレクトリを作る

こんなディレクトリ構造にするか

```
/src/Foo/FoobarBundle/Resources/assets/sass/main.scss
```

publicにsassディレクトリを作成し、`.htaccess`などでアクセスを禁止するのもいいかもしれない。私はこちら。

```
/src/Foo/FooBarBundle/Resources/public/sass/main.scss
```

```conf:.htaccess
<IfModule mod_authz_core.c>
    Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
    Order deny,allow
    Deny from all
</IfModule>
```


## テンプレートで読み込む

こんな感じ

```twig:layout.html.twig
{% stylesheets filter="compass" "@FooBarBundle/Resources/public/sass/main.scss" %}
    <link href="{{ asset_url }}" media="screen" rel="stylesheet" type="text/css"/>
{% endstylesheets %}
```

# prodモードの時のみCSSを圧縮して出力する

次のそれぞれのymlファイルにcompass:styleの設定を加える。styleはコマンドラインの--output-styleパラメータに対応している。

```yaml:config_prod.yml
# 本番環境ではCSSを圧縮する
assetic:
    filters:
        compass:
            style: compressed
```

```yaml:config_dev.yml
# 開発環境ではCSSを圧縮しない
assetic:
    filters:
        compass:
            style: expanded
```

# 参考サイト

* [Sass, Compass, and Assetic in 10 minutes](http://alexandre-salome.fr/blog/Sass-Compass-Assetic-In-Ten-Minutes)
GoogleアナリティクスでJavascriptエラー収集

（追記 2014/10/25）
※ コメントで教えていただいたのですが、今はUniversal Analyticsで例外トラッキングというのがあるそうです。
https://developers.google.com/analytics/devguides/collection/analyticsjs/exceptions

#きっかけ
- ユーザーの環境によってエラーが出たり出なかったり…
- テスト用の実機用意するのも大変、てかデバッグ死ぬ
- ならユーザー側のJavascriptエラーを全部集めればいいじゃん！
- でもそのためにサーバ立てたりするのは大変
- よし、Googleアナリティクスでさくっとエラーを収集だ

#実装
ポイントはwindow.onerror。エラーが起きた時にGoogleアナリティクスにイベントを投げるようにしている。

``` index.html
window.onerror = function(message, url, lineNumber) {
	var fileName = url.match(".+/(.+?)([\?#;].*)?$")[1]; //URLからファイル名を取得
	var message
		=  fileName + ':' + lineNumber
		+ " - "+ message + ",\n"
		+ 'userAgent:' + window.navigator.userAgent;
		ga('send', 'event', 'JSError', fileName, message);
};
```

ついでに本番との切り分けもしとく。これは上のコードの前に置く。

```
var ga_uid = (location.host == "www.localhost.com")
	? "UA-xxxxxxxx-x"  //本番
	: "UA-xxxxxxxx-x"; //テスト
ga('create', ga_uid, window.location.hostname);
```

#キャプチャ画像
こんな感じでエラーが収集できる
![Screen Shot 2014-06-28 at 0.11.53.png](https://qiita-image-store.s3.amazonaws.com/0/40302/2bad8bbf-8ba4-3188-6924-ecb91e993b5f.png "Screen Shot 2014-06-28 at 0.11.53.png")


#参考リンク
- http://www.yoheim.net/blog.php?q=20130703
- https://developers.google.com/analytics/devguides/collection/analyticsjs/events?hl=ja
- http://qiita.com/gorton@github/items/ded2d128ded9c9f732e8
Windows ホスト名から文字を抜きとるバッチ


ホスト名で処理を分岐させたい時に使うバッチです。
命名規約としてホスト名に設置場所や種類、何号機などを入れておくと運用バッチが作成し易くなります。

例）
APサーバ　⇒　APS001
DBサーバ　⇒　DBS001
ADサーバ　⇒　ADS001

下記バッチはホスト名を変数に入れ、指定の文字数を抜きだすものになります。
インストール作業のバッチや、定期処理のバッチ等に役に立つと思います。

```mojitor.cmd
@echo off

rem ホスト名によって分岐するバッチ

rem ホスト名を変数につめる
set strHost=%COMPUTERNAME%

rem テキストは「&」でつなげましょう
echo "ホスト名は%strHost%です"


rem 先頭から3文字を取る
set strSyurui=%strHost:~0,3%

echo "種類は%strSyurui%です"

pause
```
LinuxでUSBスティックの不良セクタをチェックしつつフォーマットする

USBスティックは頻繁に読み書きするとよく壊れるので、不良セクタのチェックを入れてフォーマットすると良い。

```console:/dev/sdxは適切なデバイスに置き換えてね
sudo mkfs.vfat -I -c -v /dev/sdx
```

`man mkfs.vfat`より

```
-c  Check the device for bad blocks before creating the filesystem.
```

ということで、不良セクタをチェックしてくれる。直す、とは書いていないので、チェックして表示するだけかもしれない。
これを外せば普通にフォーマットする。

`-I`はデバイスにパーティションテーブル作らないオプション、`-v`は処理状況を表示するオプション。
Auto Scaling 環境下でmackerelのステータスを自動更新する方法の検討


# 1. したいこと

1. サーバーが起動したら　ステータスを standby にする
1. サーバーが終了（ターミネート）されたら ステータスを poweroff にする
1. しばらくステータスが　poweroff のやつは自動的に退役する
 → http://qiita.com/u1tnk/items/228e9115a85cf14f019e これでよい？

# 2. 検討内容

/etc/init.d/mackerel-status-update

とかいうスクリプト作って、サーバー起動時に start、終了時に stop オプションで呼ばれるようにする。
こんな感じ → http://qiita.com/inouet/items/11b8338bbd0093989e97 

終了時には、下記のような感じのコードが実行されるようにする。（したい）

```
#!/bin/bash

api_key="YOUR_API_KEY"

host_id=$(cat /var/lib/mackerel-agent/id)

curl -H "X-Api-Key: $api_key" \
     -H "Content-Type: application/json" \
     -X POST \
     -d '{"status": "poweroff"}' \
     https://mackerel.io/api/v0/hosts/$host_id/status \
```

chkconfig で /etc/rc6.d にシンボリックリンクはられるようにする。


# 3. 課題

* 自分自身のサーバーIDを知る方法が分からないので、get_hosts でループしてるのがダサい。自分自身のサーバーIDをスマートに知りたい。
 ⇨　 /var/lib/mackerel-agent/id に入っている。解決。

* 現状、get_hosts で poweroff などのステータスのサーバーが取得できないので、これだと起動時に standbyにできない。(サーバーID知れれば解決）
* いまいち、chkconfigのrun levelの指定方法が分かってない。 rc スクリプトの書き方も怪しいので調査
* 一度退役にしたサーバーにまた当って再度 起動したときどうしよう。 現役復帰させる？それとも、そもそも退役させない？

http://www.atmarkit.co.jp/ait/articles/0206/04/news001.html
Browser App on Qt Creator on Ubuntu12.04 を動かす

# やること

Browser App on Qt Creator on Ubuntu12.04 を動かす。
ただそれだけ。

[Kubuntu14.04 環境はこちら。](http://qiita.com/naohikowatanabe/items/5f4062a49bc72926123e) 

# スクリーンショット
![Screenshot_from_2014-06-27 23:07:30.png](https://qiita-image-store.s3.amazonaws.com/0/35514/cf671e97-79fd-4781-c94b-0d0146bcb270.png)

# 環境構築

## apt-get の場合

```bash
$ sudo apt-get install qt-sdk​
```

とすると、

```
Qt Creator 2.4.1 
Qt 4.8.0 (64 bit)
```

がインストールされた。

## qt-project.org からダウンロードする場合

http://qt-project.org/downloads#qt-creator
Qt Online Installer for Linux 64-bit (22 MB) 
のリンククリックで、
qt-creator-opensource-linux-x86_64-3.1.2.run
がダウンロードされる。

```bash
$ chmod 777 qt-creator-opensource-linux-x86_64-3.1.2.run
$ ./qt-creator-opensource-linux-x86_64-3.1.2.run
```

等として実行。
あとはウィザードに従って、はいはいはい。

```
Qt Creator 3.1.2 (opensource)
Qt 5.3.1 (GCC 4.6.1, 64 ビット) を使用
Built on Jun 23 2014 at 04:09:33
```

がインストールされた。


# Qt Creator 起動

* GUI から Qt Creator を起動
* 新しいプロジェクトの作成 -> 他のプロジェクト -> HTML5　アプリケーション -> 選択 -> 名前とパスを適当に決める -> 次へ -> メイン HTML ファイル の ラジオボタン で好きなものを選択。"URL から読み込む"

* 新しいプロジェクトの作成 
* -> 他のプロジェクト -> HTML5　アプリケーション -> 選択
* -> 名前とパスを適当に決める -> 次へ 
* -> メイン HTML ファイル の ラジオボタン で好きなものを選択。"index.html を生成する" or "既存の .html ファイルをインポートする" or "URL から読み込む"。ここでは "URL から読み込む" を選択したことにする。 -> 次へ
* -> ターゲット設定 でデフォルトのまま、完了
* -> プロジェクト管理 でデフォルトのまま、完了
* 以下のソースが自動生成される

```c++:main.cpp
#include <QtGui/QApplication>
#include "html5applicationviewer.h"

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    Html5ApplicationViewer viewer;
    viewer.setOrientation(Html5ApplicationViewer::ScreenOrientationAuto);
    viewer.showExpanded();
    viewer.loadUrl(QUrl(QLatin1String("http://hogehoge/")));

    return app.exec();
}
```

もしくは、以下でも OK。

```c++:main.cpp
#include <QApplication>
#include <QWebView>

int main(int argc, char **argv) {
    QApplication app(argc, argv);
    QWebView view;
    view.setUrl(QUrl("http://hogehoge/"));
    view.show();
    return app.exec();
}
```

* 左下の実行ボタンクリック or "ctrl + r" でビルド＆実行
* ウインドウが生成され、指定した URL が表示される
* めでたしめでたし

# その他

Proxy を設定する方法が分からなかった。。。Orz
Qt アプリとしてでも、 Qt Creator としてでも。
どなたかご存知の方いらっしゃいますでしょうか？
JavaScriptでページをキャプチャ


html2canvasというライブラリを使用しています。
詳しくは→ http://html2canvas.hertzen.com/

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>JSで撮るスクリーンショット</title>
</head>
<body>
  <h1>JSで撮るスクリーンショット</h1>
  <h2>導入方法</h2>
  <ol>
    <li>html2canvas.jsを読込む</li>
    <li>html2canvas関数を呼ぶ</li>
    <li>onrenderedでSSが書き込まれたcanvasを好きなように使う</li>
  </ol>
  <h2>注意</h2>
  <ul>
    <li>Webサーバーに配置しないとエラーになるかも（firefox30.0でローカルで動作確認）</li>
    <li>このサンプルではブラウザによっては、ダウンロードできないかも</li>
    <li>flashやapplet,iframeはうまくキャプチャできない</li>
  </ul>
  <a href="" id="ss" download="ss.png">スクリーンショット</a>
  <script src="html2canvas.js"></script>
  <script>
    window.onload = function(){
      html2canvas(document.body,{
        onrendered: function(canvas){
          //aタグのhrefにキャプチャ画像のURLを設定
          document.getElementById("ss").href = canvas.toDataURL("image/png");
        }
      });
    }
  </script>
</body>
</html>
```
pip で github のリポジトリをインストール

github のソースを pip でインストールできないのかなー と調べていたら  

`pip install git+url`
でできることを知りました  

ただ `setup.py` と `__init__.py` が必要っぽいのとフォルダをつくるために  

```py
import dir.foo
dir.foo.bar()
```
みたいになるのがツラい

参考用にリポジトリを作成したのでよかったら見てください  

https://github.com/trsqxyz/pig  

```pycon
pip install git+https://github.com/trsqxyz/pig
pig
It is ?  to be a ?  being dissatisfied than a ?  satisfied.
```

# cf.
- [2. setup スクリプトを書く — Python 3.3.6 ドキュメント](https://docs.python.jp/3.3/distutils/setupscript.html)
- [Python の setup.py を書いてみる | CUBE SUGAR STORAGE](http://momijiame.tumblr.com/post/39580970098/python-%E3%81%AE-setuppy-%E3%82%92%E6%9B%B8%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B)
- [python - pip install from git repo branch - Stack Overflow](https://stackoverflow.com/questions/20101834/pip-install-from-git-repo-branch)
- [pip install — pip 18.1.dev0 documentation](https://pip.pypa.io/en/latest/reference/pip_install/)
[コードリーディング] Rails の Rakefile がどのように lib/tasks の rake ファイルを読み込んでいるか

# [コードリーディング] Rails の Rakefile がどのように lib/tasks の rake ファイルを読み込んでいるか

## 概要

Railsの *Rakefile* がどのように lib/tasksのrakeファイルを読み込んでいるかについて
コードリーディングをしました。

## コードリーディング

### Rakefile

*rails new* で生成された *Rakefile* には以下の処理があります。

~~~ruby
Rails.application.load_tasks
~~~

### Rails.application.load_tasks

GitHubの rails リポジトリを検索した結果、
rails / railties / lib / rails / engine.rb
で該当の処理が見つかりました。

https://github.com/rails/rails/blob/master/railties/lib/rails/engine.rb

~~~ruby
# Load Rake, railties tasks and invoke the registered hooks.
# Check <tt>Rails::Railtie.rake_tasks</tt> for more info.
def load_tasks(app=self)
  require "rake"
  run_tasks_blocks(app)
  self
end
~~~

*rake* を *require* して、 *run_tasks_blocks* というメソッドを呼んでいるようです。

### run_tasks_blocks

Rails.application.load_tasks と同一クラスの protected method として定義されています。

~~~ruby
def run_tasks_blocks(*) #:nodoc:
  super
  paths["lib/tasks"].existent.sort.each { |ext| load(ext) }
end
~~~

*paths*は rails / railties / lib / rails / engine / configuration.rb 内の処理で
Railsで扱う各種パスの配列を保持しています。
この配列の中に、下記が含まれています。

~~~ruby
 paths.add "lib/tasks",           glob: "**/*.rake"
~~~

https://github.com/rails/rails/blob/master/railties/lib/rails/engine/configuration.rb

*existent* はファイルの存在チェックをして、存在するファイルのみを抽出しています。

https://github.com/rails/rails/blob/master/railties/lib/rails/paths.rb

つまり、 lib/tasks 配下の全ての *rake* ファイルをソートして *load* しているということになります。

### 試してみる

試しに下記の rake ファイルを作成して検証してみます。

~~~bash
$ cd lib/tasks
$ tree
|-- a
|   `-- a.rake
|-- aaaa.rake
|-- z
|   `-- z.rake
`-- zzzz.rake
~~~

各ファイルには以下のような内容が記述されています

lib/tasks/a/a.rake

~~~ruby
puts "a/a.rake loaded"
~~~

lib/tasks/aaaa.rake

~~~ruby
puts "aaaa.rake loaded"
~~~

lib/tasks/z/z.rake

~~~ruby
puts "z/z.rake loaded"
~~~

lib/tasks/zzzz.rake

~~~ruby
puts "zzzz.rake loaded"
~~~

では、 rake -T を呼び出してみます。

~~~bash
$ rake -T
(in /home/vagrant/work_rails/blog)
a/a.rake loaded
aaaa.rake loaded
z/z.rake loaded
zzzz.rake loaded
rake about                              # List versions of all Rails framew...
rake assets:clean[keep]                 # Remove old compiled assets
# :
# : 以下略
~~~

確かにソートされてロードされているようです。
RuboCop | Style/CyclomaticComplexity

# RuboCop | Style/CyclomaticComplexity

## 概要

RuboCopの「Style/CyclomaticComplexity」警告について。

Rubyの循環的複雑度をチェックします。
RuboCopのソースを確認すると、

~~~ruby
DECISION_POINT_NODES = [:if, :while, :until, :for, :rescue, :when, :and, :or]
# :
# : 略
# :
on_node(DECISION_POINT_NODES, node) { complexity += 1 }
~~~

*[:if, :while, :until, :for, :rescue, :when, :and, :or]* をキーとして、循環的複雑度を加算しているようです。

※ソース全体が気になる方は以下を参照
https://github.com/bbatsov/rubocop/blob/master/lib/rubocop/cop/style/cyclomatic_complexity.rb

## 設定値

Maxに値を設定します。
デフォルトは6です。

## CyclomaticComplexity

各設定値での検証結果をまとめます。

### 検証プログラム

cyclomatic_complexity.rb

~~~ruby
def hoge(msg)
  return 1 if msg.empty?   # => if 1
  return 2 unless msg.nil? # => unless 2
  case msg
  when 'hoge' then 'hoge'  # => when 3
  when 'hige' then 'hige'  # => when 4
  when 'hege' then 'hege'  # => when 5
  else 'other'             # => else 6
  end
rescue                     # => rescue 7
  raise StandardError, 'error'
end
~~~

### 実行結果 デフォルト の場合

.rubocop.yml

※明示的に設定しているが、デフォルト値なので何も設定しなくてもよい

~~~yaml
CyclomaticComplexity:
  Max: 6
~~~

~~~bash
$ rubocop
Inspecting 1 file
C

Offenses:

cyclomatic_complexity.rb:1:1: C: Cyclomatic complexity for hoge is too high. [7/6]
def hoge(msg)
^^^

1 file inspected, 1 offense detected
~~~

### 実行結果 Max を 7 に変更した場合

.rubocop.yml

~~~yaml
CyclomaticComplexity:
  Max: 7
~~~

~~~bash
$ rubocop
Inspecting 1 file
.

1 file inspected, no offenses detected
~~~
Windowsの各種情報収集を行うバッチ

Windows Vista以降はワトソン先生居なくなったんですね・・・
本日人に嘘を教えちゃいました。
贖罪のバッチを下記に作成しました（笑）

```ststemCheck.cmd
rem ログの収集

mkdir c:\log
c:
cd c:\log

rem ------System関連情報
rem システム情報
systeminfo > systeminfo.txt
msinfo32 /report msinfo32.txt


rem IPアドレス情報
ipconfig /all > ipconfig.txt

rem タスク状況
schtasks /query /V > schtasks.txt

rem ネットワークドライブ情報
net use > netuse.txt

rem ネットワーク統計
netstat -sp > netstat_sp.txt
netstat -e > netstat_e.txt

rem TASKの状態
tasklist > tasklist.txt
tasklist /svc > tasklist_svc.txt
tasklist /m > tasklist_m.txt

rem ------Windows 7 及び 2008のログエクスポート
rem システム
wevtutil qe system /f:TEXT > system_log.txt

rem アプリケーション
wevtutil qe Application /f:TEXT > Application_log.txt
```
[超簡単]FuelPHPをgit(github)で管理する方法


#[はじめに]FuelPHPをインストールしてgithubに公開するのは実はちょっと面倒

まず、FuelPHPをインストールする方法は[こちら]
[こちら]:http://fuelphp.jp/docs/1.6/installation/instructions.html



また、設定はこの辺りが参考になります。

[FuelPHPプロジェクトをgit管理するときにすべきこと]
[FuelPHPプロジェクトをgit管理するときにすべきこと]:http://qiita.com/L_e_k_o/items/956bd92645769dece5e7

[FuelPHPで作成するアプリケーションをGitHubで管理する | mawatari.jp ]
[FuelPHPで作成するアプリケーションをGitHubで管理する | mawatari.jp ]:http://mawatari.jp/archives/creating-a-fuelphp-application-repository-on-github


コマンドインストール自体はとても簡単なのですが、既に.gitが生成されているため、gitのメンテナンスやsubmoduleのインストールなど、とても面倒が多いので、初心者向けにもっと簡単な方法を。

#1.githubでリポジトリの作成

参考。
[git勉強内容まとめ9(GitHubを利用した開発手順メモ)]
[git勉強内容まとめ9(GitHubを利用した開発手順メモ)]:http://nwpct1.hatenablog.com/entry/2014/01/13/115232

公開リポジトリを作成したら、クローンします。

```
$ git clone git@github.com:hogehoge/Hoge.git

```
このときリポジトリ内にはREADME.mdしかない状態。

#2.FuelPHPのダウンロード

http://fuelphp.com/

ここからzipファイルをダウンロードします。
解答したら中身のファイルを全てクローンしたディレクトリに移動します。

この状態。

```
$ ls Hoge
CHANGELOG.md    README.md   fuel     CONTRIBUTING.md 
TESTING.md      oil  LICENSE.md      composer.json   
docs            public
```

#3.Composerのインストール
次に、[Composerをインストール]します。
[Composerをインストール]:https://getcomposer.org/download/


```shell
$ curl -sS https://getcomposer.org/installer | php
```

インストールが完了したら、あとはこちらの記事の通りにComposerの設定をします。
[【FuelPHP】composerのアップデート方法]
[【FuelPHP】composerのアップデート方法]:http://qiita.com/maximum80/items/729af0392a84a3196088


```shell
$ git add .
$ git commit -m"Install FuelPHP"
$ git push -u origin master
```
これで完了。
会社の組織と給与

　動的計画法の練習に入ります。私は、動的計画法を実装出来た事が無いです。なのでかなり練習しないとマズいと感じております（・・；）
　また、今回私はボロボロなソースコードを実装して終了しました（泣）メモ化再帰と動的計画法の説明から問題に入ったのですが、動的計画法と再帰をあわせたやり方で解くみたいです（他にも解き方はたくさんあるようです）。メモ化再帰と動的計画法がうまく頭にイメージ出来ていない（深さ優先や幅優先をもう一度やり直した方がいいかもしれない）事が今回の失敗の原因と思われます。
問題元：SRM407 Div2 Level2
問題文：
　あなたは巨大企業のHR部門で働いています。それぞれの従業員は直接のマネージャーを何人か、また直接の部下を何人か持つ事が出来ます。もちろん、部下達はそのまた部下をもつことがありますし、マネージャーたちはそのまたマネージャーを持つ事があり得ます。XがAのマネージャー、AがBのマネージャー、と続いて、DがYのマネージャであるような、従業員A,B.....Dのつながりがあるなら、従業員Xは従業員Yの上司であると言えます。
　もちろん、XがYの直接のマネージャーであるなら、XはYの上司でしょう。もし、AがBの上司であるなら、BはAの上司である事は出来ません。新しい企業ポリシーによると、部下のいない従業員の給与は１です
。もし、従業員に何人か部下がいる場合、その従業員の給与は直接の部下達の給与の合計と等しくなります。
　あなたには、String配列relationsを与えられます。この配列では、従業員iが従業員jの直接のマネージャである場合、i番目の要素のj番目の文字が'Y'になっており、そうでなければ'N'になっています。前従業員の給与の合計を返してください。

コード：

```java:
long totalSalary(String[] relations) {
		if(relations.length == 1) return(1);
		long[][] dp = new long[relations.length + 1][relations[0].length() + 1];
		String comp = makeTop(relations.length);
		for(int r = 0; r < relations.length; r++) {
			if(relations[r].equals(comp)) {
				dp[0][r] = 1;
			}
		}

		for(int r = 0; r < relations.length + 1; r++) {
			for(int c = 0; c < relations[r].length(); c++) {
				if(relations[r].charAt(c) == 'Y') {
                                        //どこをどう足せばいいかわからなくなってしまった
					dp[r][r] += dp[r][c];
				}
			}
			if(r != 0) {
				for(int c = 0; c < relations[r].length(); c++) {
					dp[r][c] += dp[r - 1][c];
				}
			}
		}
		int ret = 0;
		for(int r = 0; r < relations.length + 1; r++) {
			ret += dp[relations.length][r];
		}
		return(ret);
	}
```
$rootScopeのコードリーディングメモ

#on
$broadncast/$emitで発火する関数を登録する
$$litenerに配列として保持している

#$broadcast
$$litenerを舐めて、関数を実行します。
単純にループで回して実行+下位のスコープを探索してる。

#$emit
$$listenerを舐めて関数実行します
上位に向かって探索する

#$apply
$digestのラッパー。$digest中はExceptionを
投げるので要注意

#$digest
watchリストを評価して、実行する。
domとのひも付けのng-bingingもwatchリストに登録されてる。
Androidアプリ開発（Eclipse）で快適なGitHubライフを送る

最近のEclipseにはEgitという、Eclipse上でgitを使うためのプラグインが最初からインストールされているけど、これがとてつもなく使いづらかった。


ターミナル上でのgit操作に慣れていると、
```git merge --no-ff hoge
```
ってEgitでどうやるんだっけ？みたいな感じで、コマンドだと直ぐ叩けるのにEgitだと調べないといけない、みたいな状況が煩わしかった。


なので、EclipseでGit（GitHub）使う時もコマンドで操作するようにした。
WindowsだとGit BASHが便利だった。


Git BASHは以下からダウンロードできる。
[Git for Windows](http://msysgit.github.io/)



## 最初の設定とか


SSH秘密鍵は以下に設置。
C:\Users\hoge\.ssh 


ユーザ名とメールアドレスを設定。
```git config --global user.name "hoge"
git config --global user.email hoge@hoge.com ```


あとは、こんな感じで普通にgitコマンドが叩けるようになる。
![20140525123309.png](https://qiita-image-store.s3.amazonaws.com/0/47437/33ee8692-cf45-62d7-f0d8-a0c45c1de249.png)



## Eclipseとの連携 


よくある使用例としては、GitHubから
``` git clone hoge
```
して、Eclipseで
Import→Android→Existing Android Code Into Workspace
からcloneしてきたプロジェクトを取り込む。


リモートブランチに切り替える時は
```git checkout -t origin/hoge
```
すればEclipse上でも切り替わる。たまに直ぐ反映されないときあるけど、Eclipse上でプロジェクトをリフレッシュすればOK。


mergeやpull、pushなども問題なく動く。プロジェクトに反映されないときは、checkout時と同じくリフレッシュすればOK。



## その他設定とか


Git BASHは日本語の入力ができないっぽいので、commitコメント編集時に、日本語入力できるエディタを呼び出すように設定する。
```git config --global core.editor "'hoge.exe'"
```

あとAndroidアプリ開発時の.gitignoreはこんな感じ。

```.gitigrore
*.apk
*.ap_
*.dex
.DS_Store
*.class
bin/
gen/
local.properties
```

元記事: http://alexam.hateblo.jp/entry/2014/05/25/123643
scp コマンドを使ってリモートサーバーのファイルをローカル環境に保存する

# コマンド例

```console
$ scp -rC username@example.com:~/filename ~/Desktop/
```

# よく使うオプション

- C
    - 通信を圧縮する。
- r
    - ディレクトリ内を再帰的にコピーする
- p
    - コピー元の更新時間とモードを維持する。

# SCP とは

> SSHのプロトコルを使用した，ローカル・ホストとリモート・ホストの間でファイルをコピーするためのコマンド。
> 
> 「scp」とは：ITpro
> ~~http://itpro.nikkeibp.co.jp/word/page/10005103/~~
> -> リンク切れ

# 参考

- ホスト間で安全にファイルをコピーするには  
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/103sshcopy.html
時刻を5分間隔でまるめる

# 時刻データをいろいろな間隔でまるめる（四捨五入）

`round()`関数で1時間毎にまるめる時は，`"hours"`と指定する
```time.x1 <- as.POSIXct(c("2014-06-30 14:05:17","2014-06-30 13:45:17","2014-06-30 14:18:17"),
                      format = "%Y-%m-%d %H:%M:%S",tz="")
print(time.x1)
round(time.x1,"hours")
```
```[1] "2014-06-30 14:05:17 JST" "2014-06-30 13:45:17 JST" "2014-06-30 14:18:17 JST"
[1] "2014-06-30 14:00:00 JST" "2014-06-30 14:00:00 JST" "2014-06-30 14:00:00 JST"
```
14:00:00にまるめられるのは，13:30:00から14:29:59まで

1分毎は，`"mins"`で指定する
`round(time.x1,"mins")`

半端な間隔でまるめたいときは，`xts`パッケージの`align.time()`を使う。
指定した時間間隔（秒）で切り上げるので，予めまるめたい時間間隔の半分の時間を引いておくと良い。

5分毎にまるめる   ```align.time(time.x1 - 5*60/2,  5*60)
```
30分毎にまるめる  ```align.time(time.x1 - 30*60/2, 30*60)
```
2時間毎にまるめる ```align.time(time.x1 - 2*60*60/2,  2*60*60)```

`plyr()`が1.8.1にアップデートされてから`round_any()`関数が何故かおかしくなったのでメモ。`round_any(time.x1,  5*60)`で動いていたはず...
SVNのリポジトリを複製したり差分を反映したりした時のメモ

Windowsの共有フォルダでBarkleyDBで展開されているSVNリポジトリだとLinuxに立てたRedmineから参照するのが困難だし、色々どうしようもなく使いづらいのでLinux機に複製した際のメモ。

共有フォルダでBarkleyDBとか運用の仕方とかが色々アレなのは自覚してるけどその辺りは大人の事情をお察しいただけると幸いです。

-----

* 共有フォルダをネットワークドライブとしてマウントする

    ~~多分svnrdumpでも行けるはずなんだろうけど躓いたので~~
    すみませんむしろsvnrdumpじゃないとダメでした

* フルダンプの取得

    最初svnadminで書いてましたが、同じ手順でやり直したらsvnrdumpじゃないとダメでした

    ```
    >svnrdump dump file:///Z:リポジトリ > ダンプファイル名
    ```

* ダンプしたファイルをリモートのリポジトリにロードする

    この時点でのリビジョンを500とする
    空のリモートのリポジトリは予め作成してある想定（hooksの修正とか必要だけど割愛）

    ```
    >svnrdump load http://リモートリポジトリ < ダンプファイル名
    ```

* 差分をダンプする

    この時点ではリビジョンが510に成長しているとする

    ```
    >svnadmin dump file:///Z:リポジトリ > 差分ダンプファイル名 --revision 501:510 --incremental
    ```

* 差分をロードする

    ```
    >svnrdump load http://リモートリポジトリ < 差分ダンプファイル名
    ```

-----

フルダンプ取得とロードに物凄く時間がかかるのがつらみ。
連続型確率分布

[昨日](http://qiita.com/ynakayama/items/3eccc0e6d11b96977bef)の続きです。

# 連続型の確率分布

完全に覚書です。

## 連続一様分布

```math
U(a,b)
```

U(0,1) に従う一様乱数から所与の確率分布に従う乱数を発生させることができます。

## 正規分布 (ガウス分布)

[以前](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)も書きましたが再掲。

```math
f(x) = \frac 1 {\sqrt{2\pi\sigma}} exp \{-(x-\mu)^2/2{\sigma^2}\} \\
(-\infty \lt x \lt \infty)
```

## 指数分布

これも[以前](http://qiita.com/ynakayama/items/e41f592ad7fe02f23c1c)書きましたが再掲。

```math
f(x) = {\lambda}e^{-{\lambda}x} \\
(x\ge0), 0 (x\lt0)
```

## ガンマ分布

次の確率密度関数をもつ分布。

```math
\frac {\beta^{\alpha}} {\Gamma(\alpha)}x^{\alpha - 1}exp(-{\beta}x) \\
(x \gt 0)
```

## ベータ分布

```math
\frac 1 {B(\alpha, \beta)} x^{\alpha-1}(1-x)^{\beta-1} \\
(0 \lt x \lt 1)
```

## コーシー分布

```math
f(x) = \frac 1 x \frac 1 {x^2 + 1}
```

## 対数正規分布

log X が正規分布 N(μ, σ^2) に従う分布。


## ワイブル分布

```math
cx^bexp(-\frac {cx^{b+1}} {b+1}) \\
(x \gt 0)
```

## ロジスティック分布

```math
F(x) = \frac 1 {1 + exp(-x)}
```

他に多変量正規分布などありますが省略します。