OmniAICreator/Qiita-1.07M huggingface dataset:
Zwoptexを使ってみる


テクスチャアトラスを簡単に作れるツール [Zwoptex](http://www.zwopple.com/zwoptex/ "Zwoptex") を使ってみます。

ツール自体は簡単！
ドラッグアンドドロップでファイルを追加し、Publishボタンを押すだけです。

画面はこんな感じです。
![zwoptex_ss.png](https://qiita-image-store.s3.amazonaws.com/0/30731/b37f067d-14c2-18d3-ea80-fa4b274807cd.png "zwoptex_ss.png")

出力されるファイルは2つあります。

- plistファイル
- pngファイル

黒と白の画像を交互に入れ替えるアニメーションのサンプルです。

```cpp:サンプル
	// 最初にplistファイルを読み込む.
	auto cache = SpriteFrameCache::getInstance();
	cache->addSpriteFramesWithFile("test-0001-default.plist");
	
	// Spriteを表示する.
	auto sprite = Sprite::createWithSpriteFrameName("black.png");
	sprite->setPosition(100, 100);
	this->addChild(sprite);
	
	// アニメーションさせる.
	Vector<SpriteFrame *> frames;
	frames.pushBack(cache->getSpriteFrameByName("black.png"));
	frames.pushBack(cache->getSpriteFrameByName("white.png"));
	Animation *animation = Animation::createWithSpriteFrames(frames, 0.5f);
	Animate *animate = Animate::create(animation);
	RepeatForever *repeat = RepeatForever::create(animate);
	sprite->runAction(repeat);
```

簡単ですね。

以上
メモ: IoT（Internet of Things）のイベント行ってきた

ArduinoやRaspberryPiなどのモジュールを販売している
[SwitchScience](http://www.switch-science.com/)社の[発表資料](http://1drv.ms/1z7ajoZ)がすごくわかりやすくて感動した。

Edisonが1台1Wくらい。買ってみてもいいかも。
64bitではないのでdockerは動かないが、LXCはうごくだろう。
Automated BuildでCentOS7 + systemdのイメージ作った

# 参考

@yunanoさんの[CentOS 7のDockerコンテナ内でsystemdを使ってサービスを起動する - Qiita](http://qiita.com/yunano/items/9637ee21a71eba197345)

# 説明

* ベースとなる`centos:centos7`イメージがbash脆弱性修正済み。
* [GitHubリポジトリ](https://github.com/tukiyo/dockerimage-ja/tree/master/centos7-systemd)

## 1. systemdとvim追加

* [tukiyo3/centos7-ja-systemd](https://registry.hub.docker.com/u/tukiyo3/centos7-ja-systemd/)

```bash:centos7-ja-systemd
docker run --privileged -it -d --name centos7 tukiyo3/centos7-ja-systemd
docker exec -it centos7 bash
```

## 2. systemdとansibleなど追加

* [tukiyo3/centos7-ansible](https://registry.hub.docker.com/u/tukiyo3/centos7-ansible/)

```bash:centos7-ansible
docker run --privileged -it -d --name centos7 tukiyo3/centos7-ansible
docker exec -it centos7 bash
```

## 3. lampp環境php5.6

* [tukiyo3/centos7-lampp](https://registry.hub.docker.com/u/tukiyo3/centos7-lampp/)

```bash:centos7-lampp
docker run --privileged -it -d -p 8080:80 --name centos7 tukiyo3/centos7-lampp
docker exec -it centos7 bash
```

# DockerHubのハマりどころ

* DockerHubのビルドは全タグを一斉にビルドする。
* 自身のタグをfrom指定している場合、元のイメージが更新されていない状態でビルドされる。
* そのためDockerHubリポジトリを分けること。
* またDockerHubリポジトリには１つのDockerfileしか表示されないので不便でしょう。
* GithubへpushしたらAutomated Buildが行われる設定は不便な時もあるので無効にしておいたほうがよい。

![スクリーンショット 2014-10-27 13.55.08.png](https://qiita-image-store.s3.amazonaws.com/0/25728/f6f1658e-7689-25ef-74f4-fae6005f8ea2.png)


## 例:

* tukiyo3/centos7-ja-systemd:systemd
* tukiyo3/centos7-ja-systemd:ansible

というタグがあった場合、

* tukiyo3/centos7-ja-systemd:ansible

が`from tukiyo3/centos7-ja-systemd:systemd`指定していると、
`tukiyo3/centos7-ja-systemd:systemd`側で変更があったら
`tukiyo3/centos7-ja-systemd:ansible`側に変更が取り込まれずビルドされる。
[java8] 3回目：PermGenの廃止

Java8では、色々問題のあったPermGenが廃止され、Metaspace領域が新たに作成された。

## どんな問題があったのか？
"java.lang.OutOfMemoryError: PermGen space"
なんていうエラーを一度は見たことあると思います。


※工事中
/var/lib/docker/を削除してdockerを初期化

# dockerを初期化

* docker ps -a
* docker images

が増えすぎて初期化したくなることがある。
その場合、`/var/lib/docker/`を削除すればよい。

```bash:
pacman -R docker
reboot
```

```bash:
rm -rf /var/lib/docker/
pacman -Sy docker
systemctl enable docker
systemctl start docker
```


## docker ps -a が多い場合は

```bash:~/.bashrc
dcleanall() {
    for c in `sudo docker ps -a | awk '/^[^C]/{print $1}'`
    do
        sudo docker rm -f $c
    done
}
```

で`dcleanall`すればよい。
PHPで日本語メールを送信する

PHP Mailerをダウンロードします
https://github.com/PHPMailer/PHPMailer

SMTPサーバのアドレスはphp.iniに設定してあれば取得されるので設定不要です。

送信用のPHPファイルをUTF-8で作成します。
mb_internal_encoding を UTF-8 とします（指定しないと文字化けする場合があります）
PHPMailerAutoload.php を呼び込みます。

```php:mail.php
mb_internal_encoding("UTF-8");
require 'PHPMailer/PHPMailerAutoload.php';
```

送信者・宛先を指定します。

```php
$mail = new PHPMailer();

// 送信者
$mail->From = 'hogehoge@hogehoge.com';
$mail->FromName = 'Hoge Hoge';

// 宛先
$mail->addAddress('hogehoge@hogehoge.com', 'Hoge Hoge');
```

日本語のサブジェクトは文字化けするのでMIMEエンコーディングします（デフォルトはBASE64）

```php
// 日本語のサブジェクト
$mail->Subject = mb_encode_mimeheader('日本語サブジェクト');
```

本文も文字化けしてしまうので文字コードを指定します。
UTF-8の場合はクライアントによっては文字化けする可能性があります。

```php
// UTF-8 の場合
$mail->CharSet = 'UTF-8';
$mail->Body    = '日本語本文';

// ISO-2022-JP の場合
$mail->Encoding = "7bit";
$mail->CharSet = 'ISO-2022-JP';
$mail->Body    = mb_convert_encoding('日本語本文', "JIS", "UTF-8");
```

HTMLメールの場合はAltBodyも指定します。

```php
// HTMLメールの場合
$mail->isHTML(true);
$mail->Body    = '<html>日本語本文</html>';
$mail->AltBody = '日本語本文';

// テキストメールの場合
$mail->isHTML(false);
$mail->Body    = '日本語本文';
```

添付ファイルの追加

```php
$mail->addAttachment('testfile.pdf');
```

メール送信！

```php
$mail->send()
```
pecoでgitのルートに移動する

Zshでcdrをpecoにかませると便利ですね。
http://qiita.com/syui/items/f2fe51d00378210d10b1
僕はこの方のスクリプトを使わさせてもらっています。

ところで、僕は作業するときにgitのルートディレクトリへ移動してから何をするかを考えるので、cdrと組み合わせてそれを実行させたいと思います。

```zsh
$ cdr -l | awk '{ print "\\ls -d " $2 "/.git" " 2>/dev/null" }' | sh \
      | sed -e "s;^$HOME;~;" | sed -e "s|/\.git$||" | peco
```

これを関数にしてbindkeyして使っています

```zsh

function peco-git-cd() {
    local selected_dir=$(cdr -l | awk '{ print "\\ls -d " $2 "/.git" " 2>/dev/null" }' | sh \
      | sed -e "s;^$HOME;~;" | sed -e "s|/\.git$||" | peco )
    if [ -n "$selected_dir" ]; then
        BUFFER="cd ${selected_dir}"
        zle accept-line
    fi
    zle clear-screen
}
zle -N peco-git-cd
bindkey '^@' peco-git-cd


```

ちょっと実行に時間が掛かるのでシェルの効率化やキャッシュやら作ったほうがいいんでしょうけど、まずは許容範囲という感じです。
RSpecで外部プロセスを必要とするテスト実行するためのスニペット

https://gist.github.com/joker1007/fbf4d42dcdac423afcbe

```ruby
# spec/support下に配置しておく

# @param [Hash] options Any of :log, :env, :pwd, :command, :stdout_log, :stderr_log, :spawn_options, :spawn_checker, :timeout
def spawn_process(options = {})
  env = options[:env] || {}
  command = options[:command]
  stdout_log = options[:stdout_log] ? [options[:stdout_log], 'w'] : :out
  stderr_log = options[:stderr_log] ? [options[:stderr_log], 'w'] : :err
  pwd = options[:pwd]
  spawn_options = {
    :out => stdout_log,
    :err => stderr_log,
  }
  spawn_options.merge!(:chdir => pwd) if pwd
  spawn_options.merge!(options[:spawn_options]) if options[:spawn_options]
  spawn_checker = options[:spawn_checker]
  timeout_sec = options[:timeout] || 30

  ::ActiveRecord::Base.clear_all_connections!
  pid = spawn(env, command, spawn_options)
  ::ActiveRecord::Base.establish_connection

  at_exit do
    begin
      Process.kill(:SIGINT, pid)
      Process.waitpid(pid)
    rescue Errno::ESRCH, Errno::ECHILD
    end
  end

  if spawn_checker
    begin
      timeout(timeout_sec) do
        until spawn_checker.call
          Process.kill 0, pid # live check. Raise Errno::ESRCH if process died
          sleep 0.1
        end
      end
    rescue Timeout::Error, Errno::ESRCH
      STDERR.puts("Failed to start the backend program #{options.inspect}")
      if File.exist?(stdout_log)
        STDERR.puts(File.read(stdout_log))
      end
    end
  end

  pid
end

```

```ruby
# spec_helperの例

  config.before(:each, redis: true) do
    unless $redis_pid
      $redis_pid = spawn_process(
        command: "redis-server #{Rails.root.join('spec', 'redis_test.conf')}",
        spawn_checker: -> { sleep 0.2; true },
      )
    end
    Redis.new(url: redis_url).flushall
  end

  config.before(:each, sidekiq: true) do
    Sidekiq::Testing.disable!

    unless $sidekiq_pid
      log = Rails.root.join('log', 'sidekiq_test.log').to_s
      $sidekiq_pid = spawn_process(
        command: "bundle exec sidekiq -q seirenes -c 1",
        env: {"REDIS_PORT" => "6380"},
        stdout_log: log,
        spawn_checker: -> { File.read(log) =~ /Starting processing/ },
      )
    end
  end

  config.after(:each, sidekiq: true) do
    Sidekiq::Testing.fake!
  end

```
HomebrewをMac OS X 10.8.xにインストールする

社用PCを新たに入手したので、環境構築しました。
以前（去年）社内PCに構築したときは、新卒ホヤホヤということもあり、先輩についていただいたので、実質初めてターミナルで構築しました。

Homebrewのインストール時に、うまくいかず悩んだのでメモしておきます。

Homebrewって？
-------------

Mac向けのパッケージ管理ツール。開発時に必要なコマンドのインストールなどでよく使います。

```
$ brew install package_name
```
で簡単にインストールできるので便利。  

同様のパッケージ管理ツールにMacPortsがあり、色んな記事のインストール例でよく「ports」コマンドの例が出てきます。
ですが、こちらは使うPC内に既にあるシステムを使わず、新たにインストールして構築しようとすること・実行にsudoが必要（管理者権限）なので、嫌がるシステム屋さんも多いようです。


動作確認環境
-----------

* Mac OS X 10.8.5 Mountain Lion
* ruby 1.8.7（デフォルトのもの）
* Xcode, Command Line Toolsインストール済み

### 1. Homebrewインストール
こちらの記事([パッケージ管理システム Homebrew](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc))が分かりやすいので超参考に。Command Line Toolsが必要になります。
MacPortsを既に持っている場合、インストール時にエラーになることもあるそうです。（同記事参照）

インストールは[公式](http://brew.sh/)を参考に下記コマンドで。
```$ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
```

2. XQuartzのインストール
-----------------------

インストールしたら
```$ brew doctor
```
でインストールできているかを確認します。が、OS X 10.8以降の場合、下記のエラーメッセージが出ました。

```
$ brew doctor
Warning: X11 is not installed.
You don't have X11 installed as part of your OS X installation.
This is not required for all formulae, but is expected by some.
You can download the latest version of XQuartz from:
  https://xquartz.macosforge.org
```

[公式のドキュメント](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md#requirements)を見ると、OS X 10.8以降では[XQuartz](https://xquartz.macosforge.org/landing/)のインストールが前提になります。
サイトから ```XQuartz-2.7.7.dmg``` をインストールします。
インストーラーの指示通りインストールして、再び ```$ brew doctor``` でHomebrewが動いていることを確認。


3. インストールできるパッケージ一覧の更新
--------------------------------------

インストールできるパッケージ一覧を更新しておきます。頻繁に更新されるので、インストールする前にやっておくのがセオリーなようです。

```
$ brew update  # インストールできるパッケージ一覧を更新
brew update
Updated Homebrew from 74d50de0 to 3d396673.
==> New Formulae
groovysdk     jenv	    jsoncpp	  lastpass-cli	pinentry-mac  pup	    skinny	  sword		tutum ... # 増えたパッケージ
==> Updated Formulae
aalib			   fontforge		      ilmbase ...
```

Formulaは、Homebrewではビルド手順の書かれたスクリプト、つまりパッケージのことを指しています。


参考：
* [Homebrew](https://github.com/Homebrew/homebrew/blob/master/share/doc/homebrew/Installation.md)
* [パッケージ管理システム Homebrew](http://qiita.com/b4b4r07/items/6efebc2f3d1cbbd393fc)
簡単マルチスレッド（というより遅延バックグラウンド処理？）

時間のかかる処理だからバックグラウンドで処理して、終わったらメインスレッドで処理したい。
そんなcocos2d−xプログラマーの願いを叶えるプログラムが、

http://t-kashima.hateblo.jp/entry/2014/07/10/021715
t-kashimaさん、ありがとうございます。

```cpp
    auto th = std::thread([](){
        // ここで重い処理

        Director::getInstance()->getScheduler()->performFunctionInCocosThread([](){
            // この中はメインスレッド
        });
    });
    th.detach();
```

th.detach();を忘れるとスレッドのエラー出るよ。
こんな感じの
```
\#0  0x00007fff88df8212 in __pthread_kill ()
```

ちなみに、メインループ外のメモリ管理は面倒です。
（ObjCではメインループじゃないとautoreleaseが効かなかったりしたし）

なので、ラムダのキャプチャの部分（[]でくくる部分）はできるだけコピーにした方がいいと思われる。（つまり[&]とかは避ける）
AngularJSのhtmlModeを使いこなす


htmlModeを使えば`example.com/#/aa`となっているのを`example.com/aa`ととてもシンプルにすることができます。
しかし、これをリロードしようとすると、/aaにGETしてしまいます。
対処方法としてはバックエンドのフレームワークで問答無用で同じhtmlを返す事でしょうか…

```CoffeeScript:app.coffee
app = angular
  .module "app", ["ngRoute"]
  .config ($routeProvider, $locationProvider) ->
    $locationProvider.html5Mode true
    $routeProvider
      .when "/",
        templateUrl: "/templates/app.html"
        controller: "IndexCtrl"
      .otherwise
        redirectTo: "/"
    return
  .controller "IndexCtrl", ($scope, $http) ->
    console.log "hhh"
```

```HTML:index.html
<body>
    <base href="/"/>
    <div ng-app="app" class="app_route" ng-view></div>
</body>
```

baseタグがないと動かないようです。

routerにSinatraやExpressを使って、どのルーティングでも`index.html`を書くように書いたら動きそう

--追記--
Nginxのrewrite使っても良さそう
リバースエンジニアリング勉強メモ

会社で必要になりそうな知識なのでリバースエンジニアリングの勉強始めます。
参考書は高いので↓のサイトのpdf読んでます。
"Reverse Engineering for Beginners" free book：http://beginners.re/

チャプター3の途中まで読んだけど、とりあえずわかったことは
・EAXレジスタが関数の戻り値を格納する。
・64bitのLinuxでは関数の引数は6つまでRDI/RSI/RDX/RCX/R8/R9レジスタに
　それぞれ格納され、残りはスタック領域に格納される。

の2つだけだなあ・・・
後でちゃんと読み返します。
Sublime Textのデフォルトのスタイル(Monokai)の色分け

Sublime Textのデフォルトのスタイル(Monokai)の色分けについて

Monokaiとは元々、Wimer Hazenbergが作成したTextmate用のColor Style
http://studiostyl.es/schemes/monokai
https://www.monokai.nl/
https://www.monokai.pro/

サクラエディタをSublime TextのMonokai風に変えてみたり
https://github.com/nightyknite/monokai-sakuraeditor-theme

色分け表

<table>
<tbody>
<tr>
<td style="background-color: #f92672; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="f92672" >#f92672(249,38,114)</font></td>
<td>Tag name</td>
</tr>
<tr>
<td style="background-color: #a6e22e; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="a6e22e">#a6e22e(166,226,46)</font></td>
<td>Function argument</td>
</tr>
<tr>
<td style="background-color: #fd971f; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="fd971f" >#fd971f(253,151,31)</font></td>
<td>Tag attribute</td>
</tr>
<tr>
<td style="background-color: #66d9ef; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="66d9ef" >#66d9ef(102,217,239)</font></td>
<td>Storage type</td>
</tr>
<tr>
<td style="background-color: #ae81ff; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="ae81ff" >#ae81ff(174,129,255)</font></td>
<td>User-defined constant</td>
</tr>
<tr>
<td style="background-color: #e6db74; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="e6db74" >#e6db74(230,219,116)</font></td>
<td>String</td>
</tr>
<tr>
<td style="background-color: #75715e; width: 200px; height: 25px; padding: 5px; margin: 2px;"><font color="75715e" >#75715e (117,113,94)</font></td>
<td> Comment</td>
</tr>
<tr>
<td style="background-color: #272822; width: 200px; height: 25px; padding: 5px; margin: 2px; color: white;"><font color="272822" >#272822(39,40,34)</font></td>
<td> Background</td>
</tr>
</tbody>
</table>

あとQiitaで色つける方法はfontタグぐらいしか無いのかな。
サブドメインからドメインのメールを出すときのSPFレコードの書き方

hoge1.sample.com, hoge2.sample.com ... などのサーバから mail@sample.com のメールを出すときの SPFレコードですが、数が少ないならきちんと

```
example.com. IN TXT "v=spf1 a:hoge1.sample.com a:hoge1.sample.com a:hoge3.sample.com ~all"
```

とか

```
example.com. IN TXT "v=spf1 ip4:192.0.2.1 ip4:192.0.2.2 ip4:192.0.2.3 ~all"
```

というように書けばよいのですが、サーバが非常に多数であったりすると大変になります。（Mail Gateway のようなものを用意できないという前提で）

その場合は、

```
example.com. IN TXT "v=spf1 ptr:sample.com ~all"
```

と書けばよいです。ただし、何度かDNSを引くことになるのであまり勧められてはいないようです。

SPF詳しい訳ではないので、間違いあればご指摘ください！！！
というか推奨の書き方を知りたいです。

参考

* http://www.openspf.org/SPF_Record_Syntax#ptr
* http://salt.iajapan.org/wpmu/anti_spam/admin/tech/explanation/spf/#40


追記（2014/10/27）

各hoge1.sample.comから、@hoge1.sample.com のメールを出す場合には、そのサブドメインに対するAレコードが明示的に記述されている場合は、

```
hoge1 IN TXT "v=spf1 ptr:sample.com ~all"
```

のように、明示的にSPFの設定を各サブドメイン毎に記述する必要があります。

サブドメインをワイルドカードで記述していない限り

```
* IN TXT "v=spf1 ptr:sample.com ~all"
```

と書いても、@hoge1.sample.com のSPF チェックには失敗します。
Elixir Keyword List

# Elixir Keyword List

## 概要
Elixir の Keyword List について。

key-value のペアの配列が必要な場合に利用。

~~~
[key1: "value1", key2: "value2", key3: "value3"]
# => [key1: "value1", key2: "value2", key3: "value3"]
~~~

関数の最後の引数に利用する場合は、ブラケットを省略可能。

~~~
defmodule Hoge do
  def hoge(keyword_list) do
    IO.inspect keyword_list
  end
end

Hoge.hoge [key1: "value1", key2: "value2", key3: "value3"]
# => [key1: "value1", key2: "value2", key3: "value3"]
Hoge.hoge key1: "value1", key2: "value2", key3: "value3"
# => [key1: "value1", key2: "value2", key3: "value3"]
~~~

引数以外でも、リストの最後に KeywordList が必要な場面では同様の記法を利用できる。

~~~
IO.inspect {1, [key1: "value1", key2: "value2", key3: "value3"]}
# => {1, [key1: "value1", key2: "value2", key3: "value3"]}
keyword_lists = {1, key1: "value1", key2: "value2", key3: "value3"}
IO.inspect keyword_lists
# => {1, [key1: "value1", key2: "value2", key3: "value3"]}
~~~
拾い読み WEB+DB PRESS Vol.83


書籍URL
http://gihyo.jp/magazine/wdpress/archive/2014/vol83

##キーワード
・teratail (L-1)：エンジニア向けQ＆Aサービス
　https://teratail.com

・zsh (p83)：Unizコマンドシェルの一つ。補完機能が強い。

・Google BigQuery (p126)：Googleが提供しているビッグデータ処理基板。MapReduceとは異なる。
　https://cloud.google.com/bigquery/?hl=ja

・JIRA (p180)：Atlassian社が開発した課題管理ツール
　http://www.ricksoft.jp/product/atlassian/jira

##話題
###teratailユーザ座談会を開催！(L-1)
stack overflowのようなサイトteratail。寺子屋のイメージ。
@ITに似たようなページがあるけど（http://qa.atmarkit.co.jp/）
盛り上がりによっては面白いことになりそう。


###特集1 強いチームの作り方(p18〜p40）
なかなか抽象的な話題が続いていて最初はピンとこなかったけど第2章から面白くなってきた。
挙手する際に単に「Yes」を示すのではなく、指の数で点数化する「拳から5本指」はじっくり議論を進めるのには適していそう(p25)。
コミュニケーションの使い分け(p31)、会議のルール(p32)は割りとよく言われがちなことを連ねているけど、再認識という点で勉強になった。

###特集3 zshを使おう(p74〜p105）
普段はシェルの種類なんて意識していなかったけど、短いページ数で「zshとは？」「特徴」「導入方法」が書かれていて読みやすく引きこまれてしまった。
補完機能が強みとして挙げられていて、簡単に恩恵を受けそう。今度導入してみよう。

###Google BigQueryでビッグデータ解析(p126〜p134）
サンプルが用意されていてすぐにクエリを投げて速さを実感できる。
![スクリーンショット 2014-10-26 23.09.15.png](https://qiita-image-store.s3.amazonaws.com/0/48665/f5642a6c-6c90-f066-66ff-9626928447b6.png "スクリーンショット 2014-10-26 23.09.15.png")
技術検証として触ってみようかな。。。

##その他
###特集2[実践]画像認識(p41〜p71)
難しかった。ザッピングだけでは理解できないのでじっくり読む必要あり。

###データベース実践活用(p144〜p153）
ID枯渇の話でニコニコ生放送を例に取っていた。生放送数1.9億、生放送ごとの部屋数の合計19億とあって単純にINTを使用していては不足になると記載されていた。ニコ生ってそんなに大規模なんすね。

###もっと知りたい！Markdown(p106〜p114)
この文章もMarkdownで書いている。
kobito http://kobito.qiita.com/ja
javascriptでtableをループ その1

**htmlのループしたい箇所に直接書く基本のパターン。**


```lang:filename
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
<title>テーブルの行をループで処理</title>
</head>

<body>
  <table>
    <thead>
      <tr>
        <td>数字i</td>
        <td>数字i+2</td>
      </tr>
    </thead>
    <tbody id="tbodyID">
      <script type="text/javascript">
        for (var i = 1; i <= 20; i++) {
  	      document.write("<tr><td>", i, "</td>");
  	      document.write("<td>", i + 2,  "</td></tr>");
        }
      </script>
    </tbody>
  </table>
</body>
</html>
```
ClangでC++11を使おうとするとgetsなんて知らんと怒られる件

自前でGCC4.9を入れて、そちらのヘッダファイルを使う方法もありますが、root権限で勝手に色々できる環境なら、`cstdio`に小細工をしてしまってもコンパイル通って実行できました・・・

```diff
--- /usr/include/c++/4.8/cstdio.bak	2014-04-05 03:51:34.000000000 -0700
+++ /usr/include/c++/4.8/cstdio	2014-04-05 03:51:34.000000000 -0700
@@ -117,7 +117,9 @@
   using ::fwrite;
   using ::getc;
   using ::getchar;
+#ifndef __clang__
   using ::gets;
+#endif
   using ::perror;
   using ::printf;
   using ::putc;
```

そのほかコンパイル通すために直した些細な違い、、
* Clangだと`constexpr`な値を得るときに`reinterpret_cast`が使えなかった。
* Clangだと、`enable_if<NUM>::type`がだめで、`enable_if<NUM != 0>::type`としないといけなかった。

※GCC4.8以前のlibc++ヘッダを使うと、勝手に`gets`を参照しようとする問題の回避策です。頑張って`gets()`を使う方法ではありませんのであしからず。
Google Compute Engineを触ってみた

AWS一辺倒なのもあれなのでGoogle Compute Engine(GCE)を触ってみました。ComputeエンジンというかGoogle Cloud全般ですね。

## プロジェクト
GoogleCloudはプロジェクトという単位でものを考えます。Google App Engineや、Google APIをお使いの方にはおなじみかもしれません。
GoogleアカウントのOwnerがプロジェクトを作り、そこにメンバーを招待して、VMインスタンスを作って開発、運用を進めていくという形になります。課金に関してもプロジェクト単位に分けられるようになっています。

数にGCEにまつわる管理アイテムの関連図を示します。（LB、スナップショットなど描いていないアイテムもあります）

![管理アイテムの関連図](https://cacoo.com/diagrams/ucmqfEjJP08qqHkz-C9A31.png)

## VMインスタンスを作る
左サイドのメニューからVMインスタンスを選択して新しいインスタンスを作成します。

イチからインスタンスを作る他に、まだベータ版ではありますがRailsやMEANスタックがインストールされたイメージを作成することもできます。

![Google Developers Console.png](https://qiita-image-store.s3.amazonaws.com/0/31010/710e2e5a-2527-666f-90e8-1633fffc4145.png)

## SSHでつなぐ
AWSと比べて簡単な手順が用意されています。

### 1. Web画面からSSH
SSHボタンを押すと簡易的なSSHターミナルが開きます
![Google Developers Console (2).png](https://qiita-image-store.s3.amazonaws.com/0/31010/94f6f75a-d1b9-b308-a94e-192593f542d8.png)
ちょっと反応は鈍いですが簡単にSSHで確認する手段です。

### 2. gcloudコマンドを使う
SSHボタンの隣の：を押すと後述のgcloudコマンドスニペットを出力してくれます。
```gcloud compute --project "upheld-caldron-***" ssh --zone "us-central1-a" "gitlab-o6nr"```
これをコマンドラインに貼り付けるだけでSSHキーを~/.ssh以下に自動で配置してSSH接続状態にしてくれるという便利さ。
このコマンドで配置されたSSHキーを指定して普通にSSHコマンドで接続することもできます。

AWS-EC2に比べると管理コンソールもスッキリしていて、接続方法なども簡単になっています。

## Google Cloud SDK

何はなくともこのツールが必要です。下記からインストールをしましょう。
https://cloud.google.com/sdk/#download

> Google Cloud SDK contains tools and libraries that enable you to easily create and manage resources on Google Cloud Platform, including App Engine, Compute Engine, Cloud Storage, BigQuery, Cloud SQL, and Cloud DNS.

今までバラバラだったツールがこのSDK一本にまとめられたようです。
今回使用するのはSDKに含まれるgcloud,gcutilというコマンドラインツールです。

```shell-session:gcloud
$ gcloud help
NAME
       gcloud - manage Google Cloud Platform resources

SYNOPSIS
       gcloud
         GROUP|COMMAND
         [--format FORMAT]
         [--help]
         [--project PROJECT]
         [--quiet, -q]
         [--user-output-enabled USER_OUTPUT_ENABLED]
         [--verbosity VERBOSITY]
         [-h]

DESCRIPTION
       The gcloud CLI manages authentication and local configuration, as well as your
       interaction with the Google Cloud Platform APIs.
```

### まずは認証する
コマンドを使用するためには事前に認証してコマンドとアカウントを紐付けておく必要があります。
このSDKはなかなか変わった認証方法になっています。

```shell-session
$ gcloud auth login
Your browser has been opened to visit:

    https://accounts.google.com/o/oauth2/auth?redirect_uri=...


既存のブラウザ セッションに新しいウィンドウが作成されました。
gcloud auth login というコマンドを叩くとブラウザが起動されてGoogleアカウントでログインを促されます。そして、使用許諾を求める画面になります。

You are now logged in as [newgyu].
Your current project is [upheld-caldron-***].  You can change this setting by running:
  $ gcloud config set project <project>

```

AWSと比較すると提供されるサービスの数はまだまだ少ないですが、操作性はシンプルで使い勝手は良いのではないでしょうか。

性能、料金などはまた時間をとって調べてみたいと思います。
requests 使用時の ResourceWarning: unclosed 回避策

[requests](http://docs.python-requests.org/en/latest/) 2.4.3 を使用したコードを書いていて、以下のような警告が発生した。

> ResourceWarning: unclosed \<socket.socket ...>

または

> ResourceWarning: unclosed \<ssl.SSLSocket ...>

ソケットがクローズされていないと言われているようだ。
ResourceWarningはデバッグモードでビルドされていないと無視されるため通常は発生しない(ように見える)が、ユニットテスト実行時に毎回発生するのが気になる。
何より、本当にソケットがクローズされていないなら適切にクローズしないといけないのでは、と思い調べてみた。

## requests リポジトリの issue 確認

本件は issue に報告済みだったのでそちらを見てみる。
[ResourceWarning in python 3.2+ #1882](https://github.com/kennethreitz/requests/issues/1882)
ざっと流し読んだ感じだと、

* バグかどうか判断しかねていて、修正していない。
* requestsではコネクションプーリングの機構があり、コネクションがGCで回収された際にソケットをクローズするようにしている。

ということらしい。
ユニットテストなどでGCが走る前にコードの実行が終了すると警告として現れるが、実質問題にはならないようだ。
これを踏まえて現状取れる回避策を考える。

## 回避策1. 警告を抑止する

身も蓋もないが、

```py3
unittest.main(warnings='ignore')
```

これで警告を出さなくする。
今回の `ResourceWarning` に限っては「The warning is annoying but it's not symptomatic of a problem.」とのことなので無視してもいいかもしれないけど、全ての警告を出さなくするのは乱暴なやり方ではある…。

## 回避策2. Request.connection.close() を呼ぶ

[前述の issue で報告されていた回避策](https://github.com/kennethreitz/requests/issues/1882#issuecomment-44596534)を元に、withブロックで使用できるクラスを作ってみる。

```py3:http_wrapper.py
class HttpWrapper(object):
    def __init__(self, http_method, url, **kwargs):
        self.http_method = http_method
        self.url = url
        self.kwargs = kwargs

    def __enter__(self):
        result = self.http_method(self.url, **self.kwargs)
        self.connection = result.connection
        return result

    def __exit__(self, type, value, traceback):
        self.connection.close()
```

以下のように使用する。

```py3
with HttpWrapper(requests.get, 'http://...', auth=...) as result:
    # resultを使った処理
```

ただし、これではコネクションプールを全く活用していない事になる…。

## 回避策3. Sessionを明示的に使用し、Session.close() を呼ぶ

回避策2とほぼ同じだが、[前述の issue でコミッタと思わしき方が提案されていた回避策](https://github.com/kennethreitz/requests/issues/1882#issuecomment-52282635)を元に、withブロックで使用できるクラスを作ってみる。

```py3:session_manager.py
from enum import Enum
from requests import Session


class HttpMethod(Enum):
    get = 'get'
    post = 'post'
    put = 'put'
    delete = 'delete'

class SessionManager(object):
    def __init__(self, http_method, url, **kwargs):
        self.http_method = http_method
        self.url = url
        self.kwargs = kwargs

    def __enter__(self):
        self.session = Session()
        result = getattr(self.session, self.http_method.name)(self.url, **self.kwargs)
        return result

    def __exit__(self, type, value, traceback):
        self.session.close()
```

以下のように使用する。

```py3
with SessionManager(HttpMethod.get, 'http://...', auth=...) as result:
    # resultを使った処理
```

こちらもやはりコネクションプールを全く活用していない事になる…。

## 結論(…は、出ていないが)

どの回避策も今ひとつのような気がする…。
結局、現時点ではどのようにすればいいのだろうか。
issue も Open のままなので、 requests 側で対応してくれることを期待して今は警告を出しっ放しにしておく、というのが無難かもしれない…。
Node.js@Windows 導入手順メモ（其の壱 : nodist & node.js & express）

# はじめに
* Windows 8.1 64bit で成功確認。
* 自分がハマったところは太字。

# 導入手順
## nodist & node.js のインストール
* 任意の場所に以下を Clone する。

```
git://github.com/marcelklehr/nodist.git
```

* **環境変数を以下のように設定。**

```
PATH=...\nodist\bin (nodist.cmd があるパス)
NODIST_PREFIX=...\nodist (package.json があるパス)
```

* cmd.exe を起動し、以下を叩く

```
nodist update （注 : nodist 依存関係ファイルのインストールらしい。）
nodist add v0.10.32 （注 : 指定バージョン node.js のインストール。使用するバージョンに読み替える。）
nodist v0.10.32 （注 : 使用バージョンの切り替え。上記 add だけでは切り替わらないみたい。）
```

## express のインストール
node.js 単体では、Web アプリの構築が煩雑である。
そこで、 express という node.js の Web アプリケーションフレームワークを用いる。

* **実際にアプリケーションを配置するディレクトリ**に移動し以下を叩く。

```
npm init （注 : ディレクトリ内に package.json を作成する。）
npm install express (--save) （注 : --save は依存関係を保存するオプションらしい。自分はつけたが省略可能？）
```

※上記 1 行目でアプリケーション情報（アプリ名とか作成者とか）プロンプトに入るが、全て空白 or デフォルトでよい。

## express-generator のインストール

さらに、 express アプリケーションの雛形を作成するために、 express-generator をインストールする。
**※これをインストールしないと express コマンドが使えないことに注意。**

```
npm install express-generator -g （注 : -g オプションは node.js のバージョンをまたがるインストールらしい。）
```

## 雛形の作成 & 起動

```
cd ..\
express (サーバディレクトリ名) （注 : 上書き確認プロンプトが出るので yes とする。）
cd (サーバディレクトリ名) && npm install
set DEBUG=(サーバディレクトリ名) & node .\bin\www
```

**追記** 
上記 2 行目で '-e' オプションをつけるとテンプレートエンジンを jade から ejs にできる。
個人的には ejs の方が view がほぼ HTML 形式なので取っ付き易い。

## アクセスしてみよう

* [http://localhost:3000/](http://localhost:3000/)

```
Express

Welcome to Express
```

# おわりに

## 感想
めんどい。

## 今後
* WebSocket やる（[続編書いた](http://qiita.com/Thought_Nibbler/items/f5bc0cd1e42bb28f1381)）。
* Jade ってなんやねん。
わたバグ　ラジオボタンBN_CLICKED

ネットの間違いとかを指摘するつもりが一昨日変な挙動を見つけたのでそれを書くことにする。
発見時はVS2010/Win7だったが再現はVS2013/Win7で行った。

## 再現手順
* VS2013でダイアログベースアプリケーション作成
* ラジオボタンを配置
* ラジオボタンプロパティのAutoをFalseにする
* ラジオボタンにBN_CLICKEDイベントを登録する

```cpp
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
	ON_BN_CLICKED(IDC_RADIO1, &CMFCApplication2Dlg::OnBnClickedRadio1)
END_MESSAGE_MAP()
```

* クリックイベントでメッセージボックスを表示する

```cpp
void CMFCApplication2Dlg::OnBnClickedRadio1()
{
	AfxMessageBox(_T("radio button clicked"));
}
```

## 発生現象
実行してそのラジオボタンをクリックするとダイアログが表示される。
そしてメッセージのOKを押すとまたダイアログが表示される。5～10回程度出てくる。
また、マウスオーバーでクリックイベントが起きることがある。

## 原因
Windowsの仕様と言う名のバグ。
ラジオボタンはSETFOCUSされるとBN_CLICKEDが発行されるらしい。
MessageBoxはご丁寧に前のコントロールにSETFOCUSしてくるようなので、BN_CLICKEDが発行され、またMessageBoxが表示される。
ラジオボタンがBST_UNCHECKEDの状態でのみ起きる。
マウスオーバーでBN_CLICKEDが出るのもフォーカス移動を検知している可能性が高い。

## 対策
AUTORADIOBUTTONにするか、諦めるか、メッセージボックスを出さないようにする。
ラジオボタンがクリックされたとき、それを無かったことにしたいだけなのに
メッセージボックスを出すと問題が起きて制御不能である。
ラジオボタンがチェックされていると発生しないので、FOCUSされたら確実にチェックされるという前提で全ての処理を組んでいるらしい。
BN_CLICKEDを処理させる事はキャンセルもありえるのだが、MSはそれを考慮しておらず、仕様に不具合を抱えている。
ラジオボタンでBN_CLICKEDが使用不可能ならそう書いて置けばいいのに。

## 参考
[Button Messages(MSDN)](http://msdn.microsoft.com/en-us/library/bb775941%28VS.85%29.aspx)
Draws a focus rectangle on the button getting the focus. For radio buttons and automatic radio buttons, the parent window is sent a BN_CLICKED notification code.

## まとめ
.netにしよう。
JAVA_TOOL_OPTIONSの挙動確認メモ

あるプルリクエストを出すつもりで細々と検証している際にやったことのメモ。

* プルリクに載せるつもりのこと：JAVA_TOOL_OPTIONSを明示的に指定させたよ
* 疑問点：実行時にJAVA_TOOL_OPTIONSがある場合は？

検証用コード(Macで作業)

``` Hello.java
public class Hello {
    public static void main(String[] args){
		System.out.println("こんにちは、世界");
    }
}
```

## 単体項目の上書き確認

``` bash
$ echo $JAVA_TOOL_OPTIONS

$ java Hello
����ɂ��A���E

$ JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
こんにちは、世界

$ export JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8
-Dfile.encoding=UTF-8
$ java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
こんにちは、世界

$ JAVA_TOOL_OPTIONS=-Dfile.encoding=MS932 java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=MS932
����ɂ��A���E

$ JAVA_TOOL_OPTIONS="-Dfile.encoding=MS932 -Dfile.encoding=UTF-8" java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=MS932 -Dfile.encoding=UTF-8
こんにちは、世界

```

この挙動を追う限りでは、最悪でもJAVA_TOOLS_OPTIONSが事前に指定されていても、後ろに結合させれば予定通りの動きはしてそう

忘れてたので続き

## envに複数項目されるので対応する確認

``` bash
$ echo $JAVA_TOOL_OPTIONS
-Dfile.encoding=UTF-8 -agentlib:hprof
$ java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 -agentlib:hprof
こんにちは、世界

Dumping Java heap ... allocation sites ... done.
$ JAVA_TOOL_OPTIONS="-Dfile.encoding=MS932" java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=MS932
����ɂ��A���E

$ JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -Dfile.encoding=MS932" java Hello
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8 -agentlib:hprof -Dfile.encoding=MS932
����ɂ��A���E

Dumping Java heap ... allocation sites ... done.
```

ちゃんと引き継がないとダメだった。危ない
Xcode(C++)でブレークポイントがない場所でデバッガが一時停止するときは

てすと投稿。

表題の状況では、同じソースコード内の別の場所のブレークポイントを無効化すると、解決する場合がある。

Xcodeを使ったｃ++開発をしていた。デバッガを走らせると、IDEが「ブレークポイントがあるからプログラムを一時停止した」と言い、プログラムが止まった。しかしそこにはブレークポイントは無い。

ソースコード内の、別の場所にあるブレークポイントを消してみた。すると、先ほどの場所でデバッガが一時停止することがなくなった。
PHP の file_get_contents でステータスコードを取得する

PHP の file_get_contents は外部リソースを手軽に扱えるので、Web サービスの API を使うときに便利です。

手軽に使える反面、例外処理をちゃんと考えておかないと 4xx や 5xx のステータスコードが返ってきたときに Warnning エラーが発生します。 file_get_contents でステータスコードを取得するにはひと手間かける必要があります。

```php
$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));
$response = file_get_contents('http://example.com/', false, $context);

$pos = strpos($http_response_header[0], '200');
if ($pos === false) {
    // 例外処理
}
```

ステータスコードによって処理を振り分けるのであれば、正規表現でステータスコードを取り出します。

```php
$context = stream_context_create(array(
    'http' => array('ignore_errors' => true)
));
$response = file_get_contents('http://example.com/', false, $context);

preg_match('/HTTP\/1\.[0|1|x] ([0-9]{3})/', $http_response_header[0], $matches);
$status_code = $matches[1];

switch ($status_code) {
    case '200':
        // 200の場合
        break;
    case '404':
        // 404の場合
        break;
    default:
        break;
}
```

simplexml_load_file のようにストリームコンテキストを拡張できない関数の場合は、いったん上記の方法で文字列として受け取り simplexml_load_string で処理すればよいでしょう。
unicorn再起動

unicornの設定ファイルを書き換えたので、再起動。
capistrano3-unicornの`legacy_restart`や`restart`ではうまくいかなくて（設定もあるかもしれない）、
`USR2`とかがつく、いわゆる`緩やかな再起動`では設定ファイルを再読み込みしてくれないらしいので、
がっつり止めて、起動する。

### 停止

```bash
kill -QUIT `cat /tmp/unicorn.pid` # cat先はunicorn設定で決めているところ
```

### 起動

```bash
bundle exec unicorn_rails -c /home/vagrant/current/config/unicorn.rb -E development -D
# unicorn.rbのパスは適宜
```
※developmentのところ、RAILS_ENVが入ると思ってました。
違いました。development or none だそうです ⇒ [Rack or Unicorn の E 引数](https://blog.kksg.net/posts/unicorn-environment)
Chefを触ってみた

# 目的
* EC2のインスタンスの初期化を自動化したい
* Specでのテストをできるようにしたい

# 環境
* AWS
* Ubuntu Server 14.04 LTS

# 使用したVersion
| name | version |
|------|---------|
| ChefDK | 0.3.0 |
| knife-solo | 0.4.2 |
| knife-spec | 1.0.0 |
| kitchen-ec2 | 0.8.0 |

# インストール手順
## ChefDKのインストール
http://www.getchef.com/downloads/chef-dk/

```bash
$ wget http://opscode-omnibus-packages.s3.amazonaws.com/ubuntu/12.04/x86_64/chefdk_0.3.0-1_amd64.deb
$ sudo dpkg -i chefdk_0.3.0-1_amd64.deb
```

## knife plugin のインストール
```bash
$ chef gem install knife-solo
$ chef gem install knife-spec
```

## EC2用のkitchen driverのインストール
```bash
$ chef gem install kitchen-ec2
```

# リポジトリの準備
## リポジトリの作成
```bash
$ knife solo init repo_name
```

## cookbook の作成
```bash
$ knife cookbook create cookbook_name -o cookbooks_path
```

## kitchen の初期化
```bash
$ kitchen init --driver=kitchen-ec2
```

## recipe 作成後の validate
```bash
$ knife cookbook test cookbook_name
```

# ChefSpecでのテスト
## berkshelf を利用する場合
```rb
require 'chefspec/berkshelf'
```
の追記が必要

## ChefSpecのコード作成
下記参考
https://github.com/sethvargo/chefspec
https://github.com/sethvargo/chefspec/tree/master/examples

## テスト実行
```bash
$ chef exec rspec
```

## 注意
* masterのサンプルでは `ChefSpec::SoloRunner` を使っているが、stableなバージョンでは、まだ `ChefSpec::Runner` なので注意が必要
* knifeでcookbookを作るとBerksfileが `site :opscode` になっているが、最新だと `source "http://api.berkshelf.com/"` こうしないと動かない

# Test Kitchen + Serverspecでのテスト

## .kitchen.yamlの設定
https://github.com/test-kitchen/kitchen-ec2
ここを参考に設定

AWS の access key ID と secret access key は
AWS のアカウント→ Security Credentials から発行できる

## Test Kitchenの操作
インスタンス作成

```bash
$ kitchen create
```

レシピの適用

```bash
$ kitchen converge
```

spec実行

```bash
$ kitchen verify
```

インスタンス削除

```bash
$ kitchen destroy
```

上記4つを全部実行

```bash
$ kitchen test
```

## Serverspecのコードの作成
下記参考
http://serverspec.org/resource_types.html

## 注意
* repoルートでkitchen実行時に、Berksfileがあると、site-cookbooksが見つからなくなってしまった。一時的にBerksfileをリネームして対応

# Knife SoloでのCookbook の適用

ノードの初期化

```bash
$ knife solo prepare node_name
```

ノードへの適用

```bash
$ knife solo cook node_name
```

## 注意
* cookbook の depends にある cookbook は Berksfile に記載しないと上手くいかなかった
JQuery UI DatePickerで過去月を初期表示

# DatePickerとは

* JQuery UI のプラグイン
* カレンダを表示して日付選択を可能にする
* オプションを使って色々設定・カスタマイズ可能

```js:javascript
    // 基本
    // dateFormat:フォーマット指定（yyyy/mm/dd）
    // showOn:これを書いておくとボタンが表示される
    // buttonText:これを書いておくとボタンのテキストが表示される
    //    デフォルトは「...」
    $('#dateText').datepicker({
        dateFormat: 'yy/mm/dd',
        showOn:     "button",
        buttonText: "選択"
    });

```
```html:HTML
    <!-- これだけ -->
    <input  type="text" id="dateText">
```

# 特定の年月より過去の日付だけを表示させたい

* textboxの中に値が入っていれば、その日付のカレンダが表示されるが、下記のような仕様で制御したい
 * textboxの初期値は空、かつ、カレンダ入力時は特定の月のカレンダを初期表
 * しかも、それより未来の日付は入力させたくない

```js:javascript
    // 「年月」で選択されているyyyy/mmより後の年月日は
    // カレンダに表示しないよう制御
    // 「年月」の年月の翌月の1日からマイナス1日することで
    // 「年月」の最終年月日を取得
    calDate = new Date($("#yearMonth").val() + "/01")
    calDate.setMonth(calDate.getMonth() + 1);
    calDate.setDate(calDate.getDate() - 1);

    // maxDate: 入力できる最大年月を指定
    // numberOfMonth: ついでに、カレンダを2か月分一気に表示
    // デフォルトでは当日以降のカレンダが表示されるが、
    // maxDateを指定しておけば、その月以前の複数の月が表示される
    $('#dateText').datepicker({
        dateFormat: 'yy/mm/dd',
        showOn:     "button",
        buttonText: "選択",
        numberOfMonths: 2,
        maxDate: new Date(calDate)
    });

```

```html:HTML
    <div id="oneOneLabel">年月</div>
    <select id="yearMonth" >
        <option value="2014/01">2014/01</option>
        <option value="2014/02">2014/02</option>
        <option value="2014/03">2014/03</option>
        <option value="2014/04">2014/04</option>
        <option value="2014/05">2014/05</option>
        <option value="2014/06" selected>2014/06</option>
    </select>

    <div id="oneTwoLabel">年月日</div>
    <input  type="text" id="dateText">
```

* これで、「年月」で選択された年月以前2か月をカレンダで表示するようになるはず。
配列の結合


[mpyw](http://qiita.com/pb_tmz08/items/6cc51290be9f5b602abb#comment-afe2a43aabdf0e96307e "mpyw")様からのご教示を受けて配列の結合に関して誤った認識をしていたため、改めて動作を確認してみました。
配列の結合を行う際、大きく分けて方法は２つあります。
（細かくいうとarray関数による方法はもっとあります）

* array_merge()
* ＋（プラス）演算子

ただしその挙動を正しく理解していないと、思わなぬ不具合を招きます。

## array_merge()の場合
```php
<?php
$x = array(
    0 => 'x-0',
    1 => 'x-1',
    2 => 'x-2',
    'a' => 'x-a',
    'b' => 'x-b',
    'c' => 'x-c',
);
$y = array(
    0 => 'y-0',
    1 => 'y-1',
    2 => 'y-2',
    'a' => 'y-a',
    'b' => 'y-b',
    'c' => 'y-c',
);
print_r(array_merge($x, $y));
```
```結果
Array
(
    [0] => x-0
    [1] => x-1
    [2] => x-2
    [a] => y-a
    [b] => y-b
    [c] => y-c
    [3] => y-0
    [4] => y-1
    [5] => y-2
)
```

## ＋（プラス演算子）の場合
```php
<?php
$x = array(
    0 => 'x-0',
    1 => 'x-1',
    2 => 'x-2',
    'a' => 'x-a',
    'b' => 'x-b',
    'c' => 'x-c',
);
$y = array(
    0 => 'y-0',
    1 => 'y-1',
    2 => 'y-2',
    'a' => 'y-a',
    'b' => 'y-b',
    'c' => 'y-c',
);
print_r($x + $y);
```
```結果
Array
(
    [0] => x-0
    [1] => x-1
    [2] => x-2
    [a] => x-a
    [b] => x-b
    [c] => x-c
)
```

## 結論
* + 演算子は常に 連想配列 として 前優先 でキーをセットする
* array_merge 関数は 文字列キーは連想配列 として 後優先 でキーをセットし、 整数キーは通常配列 として 末尾 に新しく要素を追加する
AngularDart入門 第7回 デプロイ

[第6回](http://qiita.com/laco0416/items/f540cf4a40d5a8218d73)ではルーティングについて解説しました。最終回の第7回はアプリのデプロイについて解説します。Angularのトランスフォーマーとpubの`serve`や`build`を使って、モダンブラウザで実行可能なJavaScriptファイルを作成します。

今回の元記事は[7. Deploying Your App](https://angulardart.org/tutorial/09-ch07-deploying-your-app.html)です。

# Angularのトランスフォーマーを使う
AngularDartのアプリケーションをJavaScriptに変換する前に、`pubspec.yaml`にAngularDartのトランスフォーマーを使うことを書く必要があります。

```yaml
transformers:
- angular
```

トランスフォーマーについては[Pub Assets and Transformers](https://www.dartlang.org/tools/pub/assets-and-transformers.html)を参照してください。

Componentで使うHTMLやCSSもトランスフォーマーで宣言しておくのを忘れないようにしましょう。

# サンプルアプリをDartium以外で動かす
今回はアプリケーションに変更は加えないので、第6回と同じソースコードを使います。
[こちら](https://github.com/angular/angular.dart.tutorial/tree/master/Chapter_06)からリポジトリをクローンして、**Chapter_06**ディレクトリで`> pub serve`すればサンプルアプリが起動します。

これまではおそらくDartiumでアプリケーションを実行していたと思いますが、今回はChromeやFirefoxなどのモダンブラウザで開いてみましょう。`pub serve`はブラウザがDartに対応していない場合、JavaScriptを生成してアプリケーションを実行します。JavaScriptの生成には大体30秒ほどかかりますが、一度生成したJavaScriptはキャッシュされ、次回からはすぐに実行できます。

# マルチブラウザ対応
以前にも少しだけ触れましたが、AngularのコンポーネントはShadow DOMを使っています。これをマルチブラウザに対応させるには次のポリフィルが必要です。

```html
<script src="packages/web_components/webcomponents.min.js"></script>
<script src="packages/web_components/dart_support.js"></script>
```

# デプロイ可能なファイルの生成
`pub build`を実行すると、デプロイ可能なアプリケーションのファイルが`build/web`以下に生成されます。

# まとめ

- `pubspec.yaml`にAngularのトランスフォーマーを記述する
- `pub serve`は自動でJavaScriptを生成して実行する
- デプロイするファイルは`pub build`で生成する

これで本家チュートリアルのすべての内容は終わりです。ここから先はAPIドキュメントやフォーラム、Issueなどと格闘してAngularDartを使いこなしましょう。お疲れ様でした！
アウトレットコレクションを利用する

[![アプリ動作](http://img.youtube.com/vi/6RlhNbfCgAQ/0.jpg)](https://www.youtube.com/watch?v=6RlhNbfCgAQ)

###やったこと
* アウトレットコレクションを使う
* 複数のボタンから同じメソッドを呼び出す
* 複数のボタンにそれぞれタグを付ける

###アプリ内容
* （上部）複数フォームから受け取った値を、コンソール出力する
* （下部）色のボタンを押したらそれぞれ英語名をラベルに表示する

「詳細Objective-C iPhoneアプリ開発入門ノート」Chapter4-2の学習記録です。

###コード

```swift:ViewController.swift

class ViewController: UIViewController {

    // テキストボックス配列
    @IBOutlet var Boxes: [UITextField]!
    
    // 色を英語で言うとラベル
    @IBOutlet weak var ColorLabel: UILabel!
    // 色ボタン
    @IBOutlet var ColorButtons: [UIButton]!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    // 周辺タップでキーボードを閉じる
    @IBAction func EndEdit(sender: UITapGestureRecognizer) {
        self.view.endEditing(true)
    }
    
    // コレクションを送信する
    @IBAction func SendList(sender: UIButton) {
        var str:String = ""
        for unit:UITextField in self.Boxes {
            str += unit.text + "\n"
        }
        print(str)
    }
    // ラベルに色名を表示する
    @IBAction func touchWordButton(sender: UIButton) {
        var word:NSString = ""
        switch(sender.tag) {
            case 10: word = "Green"
            case 20: word = "Red"
            case 30: word = "Yellow"
            case 40: word = "Blue"
            default: break
        }
        self.ColorLabel.text = word
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}
```

### ソースアップ
https://github.com/hanoopy/ios_study_outletcolc
Jenkinsで高速にbundle installする方法

#はじめに

JenkinsでRailsのテストやってますか？
肥大化するテストを高速実行するためにテストを複数のJobに分割するというのは有効な手段です。しかし、Railsのテストを行うためにはbundle installによるGemのセットアップが必須です。分割したJobが一斉にbundle installするとトータルでのテスト実行時間は極端に低下してしまいます。
ここでは、時間のかかるbundle installを高速に行うための解説を行います。

#なぜbundle installは遅いのか？

bundle installコマンドを叩くことで、bundlerはrubygems.orgから関連ライブラリをダウンロードしローカルにインストールします。しかし、GemによってはC言語で書かれたコードをコンパイルする事がありインストールに時間がかかります。また、複数Jobが一気にrubygems.orgへ問い合わせることでテスト環境のネットワーク帯域も圧迫されます。

#Gemfile.lockに変更がなければbundle installは高速じゃん？

gitのbranchが1つしかなければ、あまり問題は無いような気がします。しかし、私のプロジェクトでは開発者が好きなタイミングでbranchを指定してJenkinsを実行できるようになっています。もちろんbranchが違えばGemfile.lockが異なる可能性も考えられます。

#キャッシュすることは可能か？

Gemのインストール先はbundleコマンドの--pathオプションで指定することができます。

```shell-session
$ bundle install --path=vendor/bundle
```

ここで指定したpathはGemfileがあるディレクトリと同じ場所の`.bundle/config`に書かれます。

```yaml
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_DISABLE_SHARED_GEMS: '1'
```

と、いうことは`.bundle/config`のBUNDLE_PATHを直接書き換えることができれば、各JobでbundlerがインストールしたGemを共有することができそうです。

# シェルスクリプトを作ってみた

```bash
RUBY_VERSION=`cat .ruby-version`
GEM_SHA1=`openssl sha1 Gemfile.lock | sed -e s/SHA1\(Gemfile.lock\)=.//`
BUNDLE_PATH=$HOME/bundle_box/$RUBY_VERSION/$GEM_SHA1
if [ -e $BUNDLE_PATH ]; then # すでにbundleが存在すればPATHを書き換え
  mkdir -p .bundle
  cat << EOT > .bundle/config
---
BUNDLE_PATH: "$BUNDLE_PATH"
BUNDLE_DISABLE_SHARED_GEMS: '1'
EOT
else
  bundle install --jobs=2 --path=vendor/bundle
  GEM_SHA1=`openssl sha1 Gemfile.lock | sed -e s/SHA1\(Gemfile.lock\)=.//`
  BUNDLE_PATH=$HOME/bundle_box/$RUBY_VERSION/$GEM_SHA1
  if [ ! -e $BUNDLE_PATH ]; then #bundleが存在しなければmvしてPATHを書き換え
    mkdir -p $HOME/bundle_box/$RUBY_VERSION
    echo $BUNDLE_PATH
    mv vendor/bundle $BUNDLE_PATH
    cat << EOT > .bundle/config
---
BUNDLE_PATH: "$BUNDLE_PATH"
BUNDLE_DISABLE_SHARED_GEMS: '1'
EOT
  fi
fi
```

ポイントはRubyのバージョンとGemfile.lockのSHA1ハッシュ値でGemの保存場所を切り分けている点です。
このスクリプトをJenkinsのJobで`bundle install`している箇所に記述すれば、2回目以降はGemがインストールされることはありません。しかも、各Job共通でGemを使いまわすことができます。
なお、今回は`RUBY_VERSION`はローカルの`.ruby-version`ファイルを利用していますがJenkins側で値をセットして自由なRubyバージョンでテストさせてもいいかもしれません。
  
#さいごに
Jenkinsによるテストを高速化することでプログラムのリリースサイクルが向上し開発者のテンションも上がります。時間がかかっている箇所を探して積極的に高速化に取り組みましょう。
プッシュ通知のサービスとプロバイダ

なんとなく初投稿です。
AndroidおよびiOSのプッシュ通知の実装を行うことがあり、その際サービスごとの仕様で混乱したので書いておきます。

* 基本の通知までの流れは
 1. 通知を受ける端末(正確にはインスコされたアプリ)から通知サービスのサーバに端末を登録、端末を識別するトークン(GCMならRegistrationID、APNSならDeviceToken)を取得
 2. トークンを通知を行うプロバイダ()に送信
 3. プロバイダはトークンを使用してサービスのサーバにこの端末に通知送ってくれと依頼

ここまではわかりやすいです。ただテストする上ですこし面倒だったのがアプリとプロバイダとの結びつきです。

## アプリとプロバイダとの関係
### Androidの場合
Androidでは通知を行う際、[GoogleCloudPlatform](https://cloud.google.com/)で作成したプロジェクトの番号をSenderIDとして使用してデバイス登録を行います。これはデバイス登録の関数に引数として渡すだけなので、アプリ起動時にサーバから取得するなど動的に変更するのは比較的容易です。

```java
String senderID = "My-Sender-ID";
String registrationID = GoogleCloudMessaging.getInstance(context).register(SENDER_ID);
```
つまりアプリをビルドしてパッケージにした段階ではプロバイダへの結びつきが特になく、起動してからプロバイダからもらう情報で結びつけるといったことが可能なです。

### iOSの場合
iOSアプリにはプロビジョニングが不可欠ですが、このプロビジョニングがプロバイダのサーバと結びつきます。
プロビジョニングの作成は[iOS Developer Center](https://developer.apple.com/devcenter/ios/index.action)から行います。プッシュ通知も同様にプロバイダとサービス間で使用するSSL証明書が発行できます。AppIDの設定の編集から行えますがSSL証明書はDevelopmentとProductionの2種類が存在します。

|プロビジョニング|SSL証明書|サービス(APNS)での環境|
|---|---|---|
|Development|Development|サンドボックス|
|Distribution|Production|本番|

なぜかDistributionプロビジョニングに対応するのがProductionになってるのでちょっとわかりにくいですが・・・
どのプロビジョニングでアプリを作ったかですでにプロバイダとの結びつきができていて、Androidのように動的に変更したりは出来ないようになっています。

例えばアプリ(Development)でプロバイダ(Production)に接続した場合
１，アプリがデバイス登録を行い、サンドボックス用のデバイストークンを取得
２，プロバイダはデバイストークンを取得
３，プロバイダはサービスに通知をリクエストするが「無効なトークン」エラーが返される

## 最後に

プッシュ通知は複数プラットフォームをすべて自前で実装するのは非常に手間ですが、こういう仕様までちゃんと理解していないとあとで困ったことになりそうです。
Ansibleで複数のroleを並行開発するのにgit subtreeを使ってみた

# role毎に別のgitレポジトリだと開発時の手間が煩雑

[roleを作成してAnsible Galaxyに登録するワークフロー - Qiita](http://qiita.com/hnakamur/items/4c5abbbbbb5623ce46ad)では1つ1つのroleごとにgitレポジトリを作成して、Ansible Galaxyに登録し、`ansible-galaxy install` でローカルに取得して利用していました。

が、それぞれのroleを開発中の場合は、修正してgitレポジトリにあげて、`ansible-galaxy install` を `--force` つきで実行して更新するという手間が面倒でした。

# git subtreeを使ってみたら便利でした

そこで、git subtreeを使って各role毎にgitレポジトリは作成しつつ、その場で修正してコミットするというのを試してみました。

git subtreeを使うのは初めてでしたが、[開発コラボレーションのヒント from Atlassian Blogs (6) Git Submodule の代替: Git Subtree | マイナビニュース](http://news.mynavi.jp/column/atlassian/006/) の記事がわかりやすくて助かりました。ありがとうございます！

実際に作成したプレーブックは[hnakamur/macbook_setup](https://github.com/hnakamur/macbook_setup)にあります。

例えば[macbook_setup/hnakamur.direnv at master · hnakamur/macbook_setup](https://github.com/hnakamur/macbook_setup/tree/master/hnakamur.direnv)は
[hnakamur/direnv-ansible_role](https://github.com/hnakamur/direnv-ansible_role)に `subtree push` してあります。

## role作成の手順
私が試していた手順は以下のとおりです。`hnakamur.direnv` の例で説明します。

### github上でroleのレポジトリを作成
githubのページの[Create new...]/[New repository]メニューでレポジトリを作ります。

### git remoteを追加

```
git remote add direnv https://github.com/hnakamur/direnv-ansible_role
```

### git subtreeを追加

```
git subtree add --prefix hnakamur.direnv direnv master
```

### roleを開発して親レポジトリでコミット

roleのファイルを作成・修正したら親レポジトリでコミットします。

### role毎のレポジトリにプッシュ

roleの開発が一区切りついたらプッシュしておきます。

```
git subtree push --prefix hnakamur.direnv direnv master
```
rbenvを止めてdirenvとPATH変更用の自作zshスクリプトを使うように切り替えた

# はじめに

rbenvは便利ではありますが、個人的にはPATHが切り替えられればそれで十分という思いが以前からあり、またrbenv rehashがどうも面倒な気がしていました。

[sstephenson/ruby-build](https://github.com/sstephenson/ruby-build)のREADMEにはruby-buildはrbenvのプラグインとして使うことを推奨とありますが、スタンドアロンで使うことも出来ると書かれています。

そこでrbenvは止めて、direnvでPATHを切り替える方法を考えてみました。

# 素朴なPATHの切り替えと問題点

まず、個別のバージョンは `/usr/local/ruby-2.1.3` のようにバージョン名付きのディレクトリにインストールして、 `/usr/local/ruby -> /usr/local/ruby-2.1.3` のようにシンボリックリンクを貼ります。

デフォルトのPATHには `/usr/local/ruby/bin` を含めておきます。

例として特定のディレクトリでは `/usr/local/ruby-2.1.2` を使いたい場合を考えます。
direnv用の `.envrc` に以下のように書けば 2.1.2 を使うことは可能です。

```
export PATH=/usr/local/ruby-2.1.2/bin:$PATH
```

ただ、これだとPATHの後ろに `/usr/local/ruby/bin` が残っているので、`/usr/local/ruby-2.1.2/bin` に無くて  `/usr/local/ruby/bin` にあるコマンドだと、そちらが実行されてしまいます。

# PATH変更用スクリプトを自作して解決

そこでPATH変更用にzshスクリプトmodipathを自作しました。

[macbook_setup/modipath at master · hnakamur/macbook_setup](https://github.com/hnakamur/macbook_setup/blob/master/hnakamur.zsh/files/modipath)

PATHの文字列を `:` で分割、結合する方法は[A User's Guide to the Z-Shell](http://zsh.sourceforge.net/Guide/zshguide05.html)を、配列から特定の要素を削除する方法は[shell - Remove entry from array - Stack Overflow](http://stackoverflow.com/questions/3435355/remove-entry-from-array/3435429#3435429)を参考にしました。

.envrcに以下のように書けばPATHから `/usr/local/ruby/bin` を取り除いて、先頭に `/usr/local/ruby-2.1.2/bin` を追加することが出来ます。

```
eval $(modipath remove /usr/local/ruby/bin)
eval $(modipath prepend /usr/local/ruby-2.1.2/bin)
```
rpm -q でパッケージ情報抽出

時々使うけども、毎回忘れてるので、ここにメモしておく。

# 背景

+ インストール済みパッケージから各種情報を取得したかった

# rpm -q ...

## rpm -q --scripts <name>

```
$ rpm -q --scripts jenkins
```

```
preinstall scriptlet (using /bin/sh):
/usr/sbin/groupadd -r jenkins &>/dev/null || :
# SUSE version had -o here, but in Fedora -o isn't allowed without -u
/usr/sbin/useradd -g jenkins -s /bin/false -r -c "Jenkins Continuous Build server" \
        -d "/var/lib/jenkins" jenkins &>/dev/null || :
postinstall scriptlet (using /bin/sh):
/sbin/chkconfig --add jenkins

# If we have an old hudson install, rename it to jenkins
if test -d /var/lib/hudson; then
    # leave a marker to indicate this came from Hudson.
    # could be useful down the road
    # This also ensures that the .??* wildcard matches something
    touch /var/lib/hudson/.moving-hudson
    mv -f /var/lib/hudson/* /var/lib/hudson/.??* /var/lib/jenkins
    rmdir /var/lib/hudson
    find /var/lib/jenkins -user hudson -exec chown jenkins {} + || true
fi
if test -d /var/run/hudson; then
    mv -f /var/run/hudson/* /var/run/jenkins
    rmdir /var/run/hudson
fi

# Ensure the right ownership on files
. /etc/sysconfig/jenkins
chown -R ${JENKINS_USER:-jenkins} /var/log/jenkins
chown -R ${JENKINS_USER:-jenkins} ${JENKINS_HOME:-/var/lib/jenkins}
preuninstall scriptlet (using /bin/sh):
if [ "$1" = 0 ] ; then
    # if this is uninstallation as opposed to upgrade, delete the service
    /sbin/service jenkins stop > /dev/null 2>&1
    /sbin/chkconfig --del jenkins
fi
exit 0
postuninstall scriptlet (using /bin/sh):
if [ "$1" -ge 1 ]; then
    /sbin/service jenkins condrestart > /dev/null 2>&1
fi
exit 0
```

## rpm -q --changelog <name>

```
$ rpm -q --changelog jenkins
```

```
* Sat Apr 19 2014 mbarr@mbarr.net
- Removed the jenkins.repo installation.  Per https://issues.jenkins-ci.org/browse/JENKINS-22690

* Wed Sep 28 2011 kk@kohsuke.org
- See [http://jenkins-ci.org/changelog] for complete details
```
革新的なデバイスまとめ@自分用まとめ（現在更新中）

**pepper**
ペッパー君は、シンギュラリティなのか！
※公式サイト
http://www.softbank.jp/robot/special/pepper/
http://www.softbank.jp/robot/products/
※デベロッパー向け
http://www.softbank.jp/robot/special/tech/

**Double Robotics**
会社に出社しない時代は来るのか？
※公式
http://www.doublerobotics.com/
※記事
http://gigazine.net/news/20140219-double-robotics-review/

**moff**
ハードとソフトの開発が分かれる時代が到来！？
世界中の開発者が手軽におもちゃを開発できる時代！
※公式
http://jp.moff.mobi/

**myo**
筋電センサーで腕の情報を取得する時代か！
※公式
https://www.thalmic.com/en/myo/

**ring**
指先で情報入力は可能なのか！
http://logbar.jp/ring/ja/

**axent wear**
ねこみみヘッドフォン！かわかっこいいデバイス
http://www.axentwear.com/
※記事
http://japanese.engadget.com/2014/10/10/axent-wear-25/

**Arx Pax社**
ついにスケボーが浮く時代が来た！
http://www.hendohover.com/#/
※記事
http://japan.digitaldj-network.com/articles/33429.html

**Project Morpheus**
オキュラスの対抗馬登場か！SONYの底力
※記事
http://www.4gamer.net/games/251/G025118/20140919117/

**smartEyeglass**
全画面表示で左右についているカメラで顔認識や撮影が可能！
おまけにマイクやandroidと連携が可能に！！！！
※公式
http://www.sony.co.jp/SonyInfo/News/Press/201409/14-090/
nginx memo

# nginxのインストール

CentOSならば、yumでインストールできた。

```
$ yum install nginx
```

起動し、chkconfigを on にしておく。

```
$ service nginx start
$ chkconfig nginx on
```

configファイルは下記

```
$ vi /etc/nginx/nginx.conf
```

```/etc/nginx/conf.d/default.conf
$ vi /etc/nginx/conf.d/default.conf

server {
    listen       80;
    server_name  hostname; #ホスト名を設定

    location / {
        root   /var/www/hostname; #ドキュメントルート
        index  index.html index.htm;
    }
}
```