OmniAICreator/Qiita-1.07M huggingface dataset:
ズンドコキヨシ Processing

![motion3.gif](https://qiita-image-store.s3.amazonaws.com/0/5542/09e7b455-5f6b-ed81-1436-996c60e40f5e.gif)

```lang:zundoko_sketch.pde
String zun = "ZUN";
String doko = "DOKO";
String kiyoshi = "KI YO SHI!";
String[] expectedReversed = {doko, zun, zun, zun, zun};
String[] history = {};
Boolean preservedShout = false;
Boolean shouted = false;

void setup() {
  size(360, 360);
  background(255);
  frameRate(4);
}
String shout() {
  if (random(1.0) < 0.5) {
    return zun;
  } else {
    return doko;
  }
}
void draw() {
  if (shouted) return;
  
  background(255);
  
  float fontSize = random(48)+24; 
  String output = shout();
  if (preservedShout) {
    output = kiyoshi;
    shouted = true;
    fontSize = 70;
  }
  history = (String[])append(history, output);
  
  Boolean isExpected = false;
  if (history.length >= 5) {
    int count = 0;
    isExpected = true;
    for (int i = history.length-1; i >= history.length - 5; i--) {
      if (expectedReversed[count] != history[i]) {
        isExpected = false;
      }
      count++;
    }
  }
  fill(0);
    textAlign(CENTER);
    textSize(fontSize);
    text(output, width/2, height/2 + fontSize/4);
  noFill();
  
  if (isExpected) {
    preservedShout = true;
  }
}
```

仕事をしよう

# 参考

- [ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
Raspberry Pi > HDMI > AP2331 > optimized for hot-swap applications

http://qiita.com/7of9/items/d46441653e0dcf5f2800#comment-149f2d1d2d4c8e12245e
にて教えていただいたリンクを見ている。

https://www.raspberrypi.org/documentation/hardware/raspberrypi/schematics/Raspberry-Pi-B-Plus-V1.2-Schematics.pdf
の
U9(AP2331W)が気になった。

http://www.diodes.com/_files/datasheets/AP2331.pdf
> The AP2331 is a single channel current-limited integrated high-side power switcher optimized for hot-swap applications.

U9の先はHDMIなのだが、HDMIを活栓挿抜（ホットスワップ）する場合にこのICが役に立つのだろう。
microservicesの調査に向けて〜activator-play-tracingを試してみよう！

## 1. やりたいこと

[以前の投稿](http://qiita.com/letusfly85/items/58fd4bb2d2f083d8d274)で、docker-composeを利用して、zipkinサービスを手元で動かすことができるようになったので、playframeworkを利用して、zipkinにレコードを登録できるかを試してみようと思いました。

[lightbend](http://www.lightbend.com)のサイトを見ると、activatorのtemplateが提供されていたので動かしてみることにしました。

* http://www.lightbend.com/activator/template/activator-play-tracing

## 2. 実施手順

### 2-1. テンプレートをgit clone

```bash
git clone https://github.com/levkhomich/activator-play-tracing.git
```

### 2-2. conf/application.confのZipkinのhostを修正

```bash
cd activator-play-tracing

vim conf/application.conf
```

編集する箇所はhostのみとなります。

```conf/application.conf
akka {
  extensions = ["com.github.levkhomich.akka.tracing.TracingExtension"]
  tracing {
    sample-rate = 1
    enabled = true
    host = "ここを書き換える"
    port = 9410
  }
}
```

上記が、[akka-tracing](https://github.com/levkhomich/akka-tracing)の[TracingExtension.scala](https://github.com/levkhomich/akka-tracing/blob/master/core/src/main/scala/com/github/levkhomich/akka/tracing/TracingExtension.scala#L49:L67)で読み込まれているようです。

activatorのサンプルのソースでは、`GlobalSettings`を使っているようです。。。
そして、akka-tracingのソースでも`GlobalSettings`を使っているような。。。

### 2-3. activatorを起動

```bash
./activator
```

しばらく依存が解消されるのを待つと、コンソールに入ることが出来ました。

### 2-4. applicationを起動

```bash
run
```

起動すると、以下のような画面が立ち上がります。

![Screenshot from 2016-03-18 12-09-34.png](https://qiita-image-store.s3.amazonaws.com/0/49547/4e1d0862-b55e-d0cf-5636-57e334c44d14.png)

### 2-5. ZipkinのWEB UIを確認してみる

![Screenshot from 2016-03-18 12-10-34.png](https://qiita-image-store.s3.amazonaws.com/0/49547/41d5ebbd-163e-3d7d-e869-ab8be5627092.png)

プルダウンに`application`というtagが追加されていることがわかります。

テンプレートから始めれば簡単に利用できる印象です。
ただ、０から自分でつくったプロジェクトで、[チュートリアルの設定](https://github.com/levkhomich/akka-tracing/wiki/Project-setup)をするだけだと、下記のようなメッセージが出て利用不可のように見えます。

```
[error] - com.github.levkhomich.akka.tracing.SpanHolder - Thrift transport error: Cannot write to null outputStream
[error] - com.github.levkhomich.akka.tracing.SpanHolder - Zipkin collector is unavailable. Failed to send 0 spans during postStop.
[info] - play.api.Play - Application started (Dev)
```

接続不良が起きてるような。。

## 3. activator-play-tracingの処理の流れの推測

playのアプリケーションが立ち上がる前に、以下の動きをしていると思います。
（間違っていましたらどなたかご指摘ください（＞＜））

1. GlobalSettingsの仕組みで、[Global.scala](https://github.com/levkhomich/activator-play-tracing/blob/master/app/controllers/Global.scala)にある、`TracingSettings`がよばれる。
2. `TracingSettings`の中で、`conf/application.conf`にある設定を読み込んで、Thriftによる通信コネクションをopen
3. tracerをplay.libs.Akkaのシステムを利用して登録

アプリケーションが開始されると、Controllerであれば、extendsされた`PlayControllerTracing`経由でトレースが実施される。（ここもデバッグしながら確認しようと思います）

## 4. 所感

* `GlobalSettings`って非推奨になるんじゃ。。http://d.hatena.ne.jp/xuwei/20160305/1457174406
* akka-tracingがなんだかわかりにくい。。もうちょっと読んでみよう。
* akka-tracingが内部で、GlobalSettingsのライブラリ読んでるけどこれはありなのかな。module化できないのかな。

---

本日は以上となります。
SignalRのPerformance Counterを取得する

SignalRには、SignalR用のパフォーマンスカウンタが用意されています
※SignalR、ざっくり言うとMicrosoftが開発しているリアルタイムwebを実現するためのオープンソースのライブラリです
　詳細は[ASP.NET SignalR](http://signalr.net/)や[ASP.NET SignalRを知る](http://www.atmarkit.co.jp/ait/articles/1303/19/news099.html)を参照願います


[Using SignalR performance counters](http://www.asp.net/signalr/overview/performance/signalr-performance#perfcounters)
ここに記載のある手順で、SignalR用のパフォーマンスカウンタを追加することができます

実際に追加されるカウンタは以下のようなものです

![image](https://qiita-image-store.s3.amazonaws.com/0/51655/e42723b1-b6ba-0493-2b1f-421ea3862faa.png)

で、これで簡単にカウンタ取得できるかと思いましたが、取得するまでに何個かはまったので共有します

その前にまずは結論

# 結論
アプリケーションプールの実行ユーザである[IIS APPPOOL\\<アプリケーションプール名>]をPerformance Monitor Users グループに追加してマシン再起動
```SignalR.exe ipc```にてカウンタ追加後に上記を実施すればカウンタが取得できるようになります

以下、はまった事です

## はまり１：カウンターの追加時、選択したオブジェクトのインスタンスに何も表示されない

上記の画像の以下の部分です
![image](https://qiita-image-store.s3.amazonaws.com/0/51655/7a20029a-8273-7b05-f7c8-e608b893feb1.png)

今は1つ表示されていますが、インストール直後は何も表示されない場合があります
その状態でカウンタの追加をしても、グラフに項目自体が追加されません

この場合は、
**該当のアプリケーションプールを再起動してください**
これで表示されました
それでも表示されない場合は、実際にアプリケーションを動かしてから確認すると表示されます

## はまり２：インスタンスは表示されたが実際の値が全て「0」になる

インスタンス表示されるようになり、グラフも追加できたが実際の値が「0」になる現象が発生しました

![image](https://qiita-image-store.s3.amazonaws.com/0/51655/08148fad-7a3e-88d2-583b-993b2a2c325a.png)

実際にSignalRを使った処理も動かしているのに。。

この場合対応は以下の2つです

**アプリケーションプールの実行ユーザを```LocalSystemに```に変更しアプリケーションプールを再起動**

![image](https://qiita-image-store.s3.amazonaws.com/0/51655/b160d243-4153-9627-898b-08b38e18261b.png)


これは、以下のstackoverflowにも記載されていました
実際に試して確かに値取得できるようになりました
[SignalR Performance counter not displaying in the performance monitor](http://stackoverflow.com/questions/17469062/signalr-performance-counter-not-displaying-in-the-performance-monitor)

ただ```LocalSystem```だと権限が大きく問題発生時の影響が怖いので、冒頭に記載した

**アプリケーションプールの実行ユーザであるIIS APPPOOL\\<アプリケーションプール名>をPerformance Monitor Users グループに追加してマシン再起動**
の方が影響範囲小さくて済むので良いと思います

IISの再起動ではだめで、マシン再起動まで必要だったのがポイントで権限追加したのにダメだーってなってはまってました

※IIS APPPOOL\\<アプリケーションプール名>のユーザは、IIS_IUSRSグループに所属しています
そのため、IIS_IUSRSグループをPerformance Monitor Users グループに追加出来ると楽なんですが、
ビルトインユーザグループをビルトインユーザグループに入れる事は出来ないようです
そのため、ユーザ個別に追加する必要があります

上記対応で表示されるようになりました
うまく値が取れないという場合は試してみてください
AmazonLinux上にPHPでAPIさくっと作りたい時のアレ【cloudpack大阪】

アレ、つくりました。

「AmazonLinuxでAPIさくっと作りたい」
「PHPもyumでさくっといれたい」
「ルーティングだけはどうしてもほしい」

みたいな要望が自分の中で大きくなったので、とても慣れ親しんだSilex(silex-skeleton)をベースに、DB周りとかサンプルとかも同梱しただけの雑ーなやつを作りましたとさ。
https://github.com/shinichi-takahashi/silex-api

* `yum install -y php php-pdo php-pgsql postgresql postgresql-devel`
* `git clone git@github.com:shinichi-takahashi/silex-api.git`
* `composer install`

あとはアクセスすりゃとりあえずなんか空配列JSONが吐かれてると思います。

開発コスト下げたいので今回はDoctrineORMつかってまてん。
ControllerProviderもつかってまてん。

「なにそれ？」って方はEC-CUBE3のrepositoryを覗くと全容がわかると思います。
XAMPP USB Liteの使い方

XAMPP USB LiteをUSBメモリに設置しwindowsマシンで使用＆Wordpressをインストールします。

### 環境
* windows7

# ダウンロード

[xampp-win32-1.7.7-usb-lite.zip](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0ahUKEwiH59aMlcnLAhWFUqYKHSPvDT4QFggcMAA&url=http%3A%2F%2Fosdn.jp%2Fprojects%2Fsfnet_xampp%2Fdownloads%2FXAMPP%2520Windows%2F1.7.7%2Fxampp-win32-1.7.7-usb-lite.zip%2F&usg=AFQjCNFoNNjMcvuQRz9aIp9_QXQ-GbAEjA&sig2=BlIMM8prel0sb-Xb0O4UAg)をダウンロードします。
解凍し、USBのルートディレクトリにフォルダごとコピーします。
Wordpressもダウンロードしておきます。

# インストール・起動

`setup_xampp.bat`を実行（実行しなくてもいいという記事もありましたが一応）。
実行後は特に何もしなくて大丈夫です。実行後の画面は↓。

![setup_xampp.bat](https://qiita-image-store.s3.amazonaws.com/0/107857/fc8408de-1224-3b98-22a1-32517acb5933.jpeg)

`xampp_control.exe`を起動します。

![xampp_control.exe](https://qiita-image-store.s3.amazonaws.com/0/107857/e47622a3-80e5-e000-4cbf-1898033b0922.jpeg)
"Start"ボタンでApacheとMySQLをON/OFF。

![xampp_control.exe](https://qiita-image-store.s3.amazonaws.com/0/107857/ba697d69-03ac-35e3-5c31-c0c8953e9f9c.jpeg)
スタート後はこんな感じです。


# 表示

ブラウザで`http://localhost`を表示。言語選択の後にスタート画面が表示されれば成功です。

![スタート画面](https://qiita-image-store.s3.amazonaws.com/0/107857/21f33688-c5f7-4cfe-1042-357bb9bb9ef5.jpeg)


### 管理画面が文字化けする場合

今回は文字化けしませんでしたが、以下を参考にします。

_[XAMPP：管理画面の文字化けを直す](http://www.goma.pw/article/2015-02-10-1/)_
_[XAMPP portable lite 1.8.1 zip 版のインストールと初期設定（文字化け対策）](http://monolio.com/memo/webservice/xampp-portable-lite-setting/)_

# セキュリティ設定

最初に設定しておきます。
サイドメニューの「セキュリティ」に移動します。

![セキュリティ画面](https://qiita-image-store.s3.amazonaws.com/0/107857/2c8aa4bd-e8ef-bf6e-e19d-0af415fe33df.jpeg)

### MYSQL項目："ROOT"パスワード

MySQLのパスワード設定です。
"_PhpMyAdminを検出しました。_"はcookieにチェック、パスワードのファイルパスの欄はチェックを入れません。

### XAMPPのディレクトリ制御（.htaccess）

ユーザーとパスワードを設定します。
パスワードのファイルパスの欄はチェックを入れません。

# Wordpressをインストール

### データベースの作成
「PhpMyAdmin」に移動、ログインします。
ユーザー名は__root__、パスワードは先ほど設定した「_MYSQL項目："ROOT"パスワード_」。
データベースを作成します（特別な設定はありません）。

### Wordpressファイルの設置
`/htdocs/`内にwordpressファイルを設置します。
`wp-config.php`を設定しておくか、__http://localhost/wordpressのディレクトリ/__に移動してインストールします。

__終__

# その他
USBへXAMPPとWordpressをインストールしたファイルサイズは大体830MBほど。
各ファイルのダウンロードからインストールまでは30分ほどかかります。
ローカル環境（USBを繋いだ状態）でサイトを確認するときは、`xampp_control.exe`を起動したままlocalhostへアクセスします。

# 参考

[簡単!XAMPP Portable Lite1.8.1を使ってローカル環境にWordPressをインストールする図解手順](http://note100yen.com/en-130328.html)
こんなチュートリアルがすげえ



## screenshot

![cloud9-tutorials.png](https://qiita-image-store.s3.amazonaws.com/0/13451/4103c45a-3644-5498-532c-57c0c17abb06.png)

* 説明
    * cloud9 IDE
    * workspace画面

## 感想

* 初めて見た時に、これが「何」か疑問が出た
* ○位置と関連内容を考えて、チュートリアルじゃないかことがすぐ分かった
* ○をクリックして、やばりチュートリアルだな
* 技術者視点から、実装がしやすいじゃないか？
新人プログラマ応援  > 長期的に繰り返すことに対しては時間短縮する方法を身につける / 単発で行うことに対しては時短を目指さない

- 長期的に繰り返すことに対しては時間短縮する方法を身につける
- 単発で行うことに対しては時短を目指さない

## 例
@yubaさんに教えていただいた方法
[ペイントブラシ > 画像を貼ってそのサイズにする > Ctrl+v / Ctrl+Shift+x [トリミング]](http://qiita.com/7of9/items/92d65acd6bed783ca011)

上記の方法で作業時間が短縮できた。
おそらく生涯であと３万回はキャプチャ処理をするような気がするので、10秒短縮できたと仮定しても30万秒 = 5000分 = 83時間の時間を得すると思われる。(ペイントブラシがなくならない前提)。

こういう時短であれば1時間調べても十分おつりがくる。

Qiitaではこのほかに非常にたくさんの有用な情報を色々な人から教わった。結果として、将来の自分の時間がかなり得られた。

感謝。
IT女子のゼロから始めるIoTーステップ4: Raspberry Pi2で手作り人感センサーを作成しました！

今回は動くものを作りたい・・・！ということで、
光センサーをつかった手作りの人感センサーを作成しました！
今回作成したのは、
人が手を伸ばしたり動いた、ということを感知して、
RICOH THETA Sのシャッターを押すというものです。

例えば小売の店舗などで、棚に手を伸ばした瞬間、とか、
ある瞬間にシャッターを切るという仕組みをつくってみました！

# 用意したもの
* [Raspberry Pi 電子工作入門キット](http://www.amazon.co.jp/%E3%83%8F%E3%83%83%E3%82%AF-%E3%83%A9%E3%82%BA%E3%83%99%E3%83%AA%E3%83%BC%E3%83%91%E3%82%A4-Raspberry-Pi-%E9%9B%BB%E5%AD%90%E5%B7%A5%E4%BD%9C%E5%85%A5%E9%96%80%E3%82%AD%E3%83%83%E3%83%88%E3%80%82/dp/B00G86DOP8#productDetails)にあるA/Dコンバータとセンサーを利用
* LED
* [RICOH THETA S](https://theta360.com/ja/about/theta/s.html)

# 人感センサーの仕組み

* 光センサーとLEDを使って以下のように設置する
    * 間に障害物があるとセンサーの値が小さくなる
    * センサーの値の差分を取得して、障害物が入ってきたこと(人の動き)を感知
* ![スライド2.jpg](https://qiita-image-store.s3.amazonaws.com/0/76550/f7ffe4f1-2a73-51a2-1567-8f0dd8f8cbf1.jpeg)

# システム全体図

* 矢印の方向へ手を伸ばす
* 光センサーが値をキャッチする
* THETAのカメラへ命令を投げてシャッターを押す

* ![システムの図.jpg](https://qiita-image-store.s3.amazonaws.com/0/76550/579c14b8-5d1f-252b-b11d-ef5af1ed6447.jpeg)


# ソースコードサンプル

```lang:filename

require 'pi_piper'
require 'net/http'
require 'json'

def takePucture
  http = Net::HTTP.new('xxx.xxx.x.x', xx)
  JSON.parse(http.get("・・・・・").body)

// THETAのdevelopersサイトにAPIが載っています
 (略)
end

beforeValue = 0;
loop do
  value = 0
  PiPiper::Spi.begin do |spi|
    raw = spi.write [0b01101000,0]
    value = ((raw[0]<<8) + raw[1]) & 0x03FF
  end
  if beforeValue - value > 20 # ここでセンサーの値の差分を取得
    takePicture               # 検知したらTHETAのシャッターを押す
  end
  beforeValue = value
  sleep(1)
end

```

# 完成！

簡単に人感センサーを手づくりできちゃいました！
(電子工作入門キットだけで挑戦できてしまうのでオススメです！)
inline-blockの時の左右の勝手な余白を消す

```
<ul class="aaa">
	<li>A</li>
	<li>B</li>
	<li>C</li>
</ul>

.aaa {
	letter-spacing: -.40em; /* 隙間詰める */
}
 
.aaa li {
	display: inline-block;
	letter-spacing: normal; /* 文字間を戻す */
}
```

文字間を戻さないと、文字が重なっちゃうよ
ubuntu 14.04 の git を2.7.4に更新する

## gitに重大な脆弱性

git に重大な脆弱性が発見されたということで、gitlabサーバーのgitのバージョンを更新しました。

https://ma.ttias.be/remote-code-execution-git-versions-client-server-2-7-1-cve-2016-2324-cve-2016-2315/

## Ubuntu 14.04 の git のバージョンをチェック

まずはgitのバージョンをチェック

```
$ git --version
git version 1.9.1
```

gitlabサーバーのOSは Ubuntu 14.04LTS で git のバージョンは 1.9.1 ですからすぐにでも更新が必要。

Ubuntuのリポジトリからは更新はきていないもよう

```
$ sudo aptitude update
$ sudo aptitude upgrade
The following packages will be upgraded:
  biosdevname gitlab-ce ifupdown libnuma1 usbutils
5 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 267 MB of archives. After unpacking 389 kB will be used.
Do you want to continue? [Y/n/?] n
Abort.
```

## ubuntu 14.04 の git を最新版に更新

GITの公式PPAを使用します。

```
$ sudo add-apt-repository ppa:git-core/ppa
 The most current stable version of Git for Ubuntu.

For release candidates, go to https://launchpad.net/~git-core/+archive/candidate .
 More info: https://launchpad.net/~git-core/+archive/ubuntu/ppa
Press [ENTER] to continue or ctrl-c to cancel adding it

gpg: keyring `/tmp/tmpmsypfa2i/secring.gpg' created
gpg: keyring `/tmp/tmpmsypfa2i/pubring.gpg' created
gpg: requesting key E1DF1F24 from hkp server keyserver.ubuntu.com
gpg: /tmp/tmpmsypfa2i/trustdb.gpg: trustdb created
gpg: key E1DF1F24: public key "Launchpad PPA for Ubuntu Git Maintainers" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
OK
```

```
$ sudo aptitude update
$ sudo aptitude upgrade git
Resolving dependencies...
The following packages will be upgraded:
  git git-man
2 packages upgraded, 0 newly installed, 0 to remove and 5 not upgraded.
Need to get 5,295 kB of archives. After unpacking 4,781 kB will be used.
Do you want to continue? [Y/n/?]
```

```
$ git --version
git version 2.7.4
```

無事 2.7.4 に更新できました。

## gitlabサーバーはシステムのgitを使用していませんでした。

gitlabサーバーはominibusインストールなのでシステムのgitを更新しただけではだめでした＞＜
gitlabに組み込みのgitが使用されています。

素直に gitlab 8.5.7 に更新しました。
[GCP] Docker imageをpullしてオートスケールする！(^(^▽(^▽(^▽^)▽^)▽^)^)

Google Compute Engine(GCE)で、Dockerコンテナでオートスケールさせたい！
Docker imageはインスタンス立ち上がる度にレジストリからpullしたい！
GKE(k8s)使えばいいのだろうけど、もうちょっと手軽にやりたい！


[Container-Optimized Google Compute Engine Images](https://cloud.google.com/compute/docs/containers/container_vms)
使ってやってみます(^^)

# 準備

- [google cloud SDK](https://cloud.google.com/sdk/)インストール。gcloud auth loginしておく
- 動かしたいdocker imageをレジストリにpushしておく - 本記事では[google container registry](https://cloud.google.com/container-registry/)使用

# マニフェストファイルを作成

```yaml:containers.yaml
apiVersion: v1
kind: Pod
metadata:
  name: your-containers
spec:
  containers:
    - name: your-container
      image: us.gcr.io/your-gcp−project/your-image-name
      imagePullPolicy: Always

```

上記マニフェストファイルはKubernetesのPod定義仕様に沿っています。
http://kubernetes.io/docs/api-reference/v1/definitions/#_v1_pod

外向けにport開く場合は別途指定する必要あります。
[ドキュメント](https://cloud.google.com/compute/docs/containers/container_vms#create_the_manifest)に書かれてる例↓

```yaml:containers.yaml
apiVersion: v1
kind: Pod
metadata:
  name: simple-echo
spec:
  containers:
    - name: simple-echo
      image: gcr.io/google-containers/busybox
      command: ['nc', '-p', '8080', '-l', '-l', '-e', 'echo', 'hello world!']
      imagePullPolicy: Always
      ports:
        - containerPort: 8080
          hostPort: 8080
```

# インスタンステンプレート作成

[Container-Optimized Google Compute Engine Images]

Container-Optimized Imageは2016/3/10時点でOpen previewでWEBコンソールから選択できないので、gcloudコマンドを使用します。

```bash
$ gcloud compute --project "your-project-id" instance-templates \
create "your-instance-template" --machine-type "n1-standard-2" \
--network "default" --metadata-from-file google-container-manifest=containers.yaml \
--no-restart-on-failure --maintenance-policy "TERMINATE" --preemptible \
--image container-vm --boot-disk-size "20" --boot-disk-type "pd-standard" \
--boot-disk-device-name "any-disk-name"
```

ミソは--imageに"container-vm"を指定すること。
あと、上記例ではpreemptibleインスタンスを使用してます。

インスタンステンプレートまで作ってしまえば、あとはコンソールから通常の手順でインスタンスグループを作成出来ます。

参考までにgcloudコマンドを記しておきます。

# インスタンスグループ作成

```bash
$ gcloud compute --project "your-project-id" instance-groups managed \
create "your-instance-group" --zone "asia-east1-b" --base-instance-name \
"your-instance-group" --template "your-instance-template" --size "1"
```

# オートスケール設定

最小インスタンス数1, 最大インスタンス数20で設定

```bash
$ gcloud compute --project "your-project-id" instance-groups managed \
set-autoscaling "your-instance-group" --zone "asia-east1-b" \
--cool-down-period "60" --max-num-replicas "20" --min-num-replicas "1" \
--target-cpu-utilization "0.6"
```

# あと・・

外向けにport公開するサ−バー群の場合はロードバランサ準備する必要ありますが、本記事では割愛しますm(_ _)m

# 蛇足

https://cloudplatform.googleblog.com/2016/03/Google-Compute-Engine-boosts-high-availability-controls.html
近いうちにregion指定でインスタンスグループ作れる様になりますね（まだAlpha）。タノシミ(^^)
Hamlを初めて使ってみる @Rails


# インストール
* Gemfileに追加して`bundle install`

```rb
# Haml
gem 'haml-rails'
```

# Hamlとは
* Railsのデフォルトのテンプレートエンジンは`ERB`
* ERBは拡張子を`.erb`にするとビューにRubyのコードを埋め込める
* ただERBはHTMLを簡潔に書く機能はなく、従来通りHTMLタグは書かなくてはならない
* Hamlは「マークアップは美しくあるべき」を原則としてテンプレートエンジン
* 非常に簡潔にHTMLを記述することが出来る(もちろんRubyコード埋め込み等の機能も豊富)
* 拡張子は`.html.haml`にする
* 認識するには`rails s`でサーバー再起動する
* Haml→HTMLの変換をオンラインで試す http://html2haml.herokuapp.com/

# 実際の記法

Hamlの書き方 - Qiita http://qiita.com/watak676/items/525ad3d8a1297e3244e3

RailsのHTMLテンプレートエンジン Haml入門 - Rails Webook http://ruby-rails.hatenadiary.com/entry/20141001/1412097051

上記の2つのサイトを確認すれば大体抑えられるはず

いやーめちゃくちゃ便利。もうタグ書きたくなくなるな。。
【Intellij IDEA】矩形選択する, Alt + マウスドラッグ

## 環境

* Intellij IDEA 14.1.3 で動作確認済み

## Intellij IDEA で矩形選択する

* `Alt` を押しながら、マウスでドラッグする
* マウスの真ん中ボタンを押しながら、ドラッグする

## 参考

* [Android Studioで矩形選択をする - みっちゃんラボ](http://micchan.com/android/2016/01/26/column-selection-mode-in-android-studio/)

以上
ElectronからCSSのurl()を動的に使う場合の注意点

# <i class="fa fa-cubes"></i> 概要

JSから`element.style.backgroundImage`などを設定するとき、
画像のパスを普通に
`require("path").resolve('../image/hoge.jpg')`
や
`__dirname + '/image/hoge.jpg'`
で`url()`に渡すと失敗する

# <i class="fa fa-check-circle-o"></i> 結論

(Windowsでは)`__dirname`のパスの取得や`require("path").resolve()`による相対パスの解決後のパスの区切りは`\`
しかし、CSSの`url()`では`\`をエスケープとみなすので`/`に置換しなければならない
つまり

```js
element.style.backgroundImage = 'url(' + require("path").resolve(path).replace(/\\/g, '\/') + ')'
```

としなければCSSは正しいパスを解釈しない。

# <i class="fa fa-cogs"></i> 検証環境

* Windows7 Professional 64bit
* electron-prebuilt 0.36.4
* node v5.2.0
Sass + Railsの基礎


* Railsではアセットパイプラインで.scssを自動的にコンパイルしてくれるのでコンパイルを意識する必要は無い
* `/app/assets/stylesheets`フォルダに配置するだけ
* オンラインでコンパイル動作を確認するにはここを使う
http://www.sassmeister.com/

# Sassの特徴
* ネストが使える
* &:hoverのようにすると擬似要素に出来る
* 変数定義・変数展開が出来る
* @mixinでスタイル定義の再利用も可能
* @extendを使うと既にあるスタイルを再利用できる
* @importは外部cssをインポートできる(.scssは省略しても可)

# コンパイルの流れ
* application.cssからコンパイルされる
* `.css.scss`, `.scss`どちらでもコンパイルされる
* ファイル名順でコンパイルされる
* reset.cssを最初に読み込みたい時はファイル名を気をつける
* `sass-rails`のgemがデフォルトで入っており、これの恩恵
* アセットパイプラインの処理の流れはココ読む http://rails.hatenadiary.jp/entry/2013/03/03/125801

# プリコンパイルについて
* development環境では`app/assets/stylesheets`配下のスタイルファイルはページが読み込まれる
* production環境ではスタイルファイルを1つに結合して1つの`application.css`として読み込まれるようにプリコンパイルしておく

```rb
rake assets:precompile
```

* この結果、`public/assets/`に結果の`application.css`が生成される。JS関係の`application.js`についても同様
* 一度プリコンパイルして、`public/assets`配下にできてしまうとそれを読み込んでしまうので再度プリコンパイルしないと有効にならない
* `public/assets`配下に出来てしまったファイルを消す時は以下のコマンドを実行する

```rb
rake assets:clean
```

* 開発環境でプリコンパイルされないようにするには`config.assets.compress = false`を`config/environment/development.rb`に設定しておく
* .gitignoreに`public/assets/*`と`tmp`を含めておく
「Webデザインが苦手」を克服するための構成学。

# 前置き
私はデザインが苦手。UIもCSSも、かっこよくならない。でも、かっこいいデザインがしたい、という思いはある。
そういう悩みを私も抱えていて、この本を読んで少し楽になれたので、紹介することにします。
デザイン的学問のススメ。

# 教科書：[美の構成学](http://www.amazon.co.jp/%E7%BE%8E%E3%81%AE%E6%A7%8B%E6%88%90%E5%AD%A6%E2%80%95%E3%83%90%E3%82%A6%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%8B%E3%82%89%E3%83%95%E3%83%A9%E3%82%AF%E3%82%BF%E3%83%AB%E3%81%BE%E3%81%A7-%E4%B8%AD%E5%85%AC%E6%96%B0%E6%9B%B8-%E4%B8%89%E4%BA%95-%E7%A7%80%E6%A8%B9/dp/4121012968)

**構成学**は、芸術をはじめとする「美しさ」が**なぜ**そう見えるのか、その美しさを構成する要素がなんなのかを学術的に分析、研究するための学問です。
> **本文より引用**
構成学を一言でいえば、造形に共通する形態、色彩、材料に関するそれぞれの特性を明らかにするとともに、造形との関わりを掘り下げる研究領域である。

**「なぜ美しいのかわかる」** というのが大きなポイントです。
これがわかれば、**「○○だから美しいんだ！」** と胸をはって言えるから。
（少なくとも、論理的に説明する理由をつけられる、という点で自信になる）

この本から、Webデザインに適用できる（と思われる）考え方をピックアップしてお伝えします。

**注) 私はWebデザイナーではありませんので、やさしく読んでくださいね。(汗**

# 分割とプロポーション

> **言葉の定義** -- 本より引用 --
分割とは、画面を割ることによって得られる視覚的バランスを決定するもの
プロポーションとは、分割によって得られる量の相互の割合

では、美しいプロポーションとは？ 

##黄金比
A:B = B:(A+B)の関係にあるプロポーション
A:B = 1:1.618...

**分割によって生じる大と小の形が適度な抑揚と均衡がある。**

## シンメトリー
A:B = 1:1 の関係にある分割。

**静止したイメージを与え、威圧的にも見える**


## ルート2矩形
A:B = 1:1.414...

印象としては、黄金比と同じ。

## 等量分割
A:B = 1:1, 1:2, 1:3 ... など、整数比による分割。
（日本家屋は基本的にこの等量分割が基本のよう）

**同じものの繰り返し、というシンメトリー性と、数理的単純さが安心感を与える**

1:3 を比率として使用すると、古き良き日本的なプロポーションになる。

#シンメトリー
シンメトリーをうまく使えば美しさを演出できる。
「左右が同じ」であることにより、形に統一感が生まれ、美しいと感じる。

シンメトリーの基本形として、以下の１4パターンがある。

- 左右対称（鏡映）
- 点対称（回転）
- 平行移動（すべり鏡映）
- 拡大（縮小）

2つの組み合わせ
- 鏡映＋回転
- 回転＋移動
- 移動＋拡大
- 拡大＋鏡映
- 鏡映＋移動
- 回転＋拡大

３つの組み合わせ
- 鏡映＋回転＋移動
- 回転+移動＋拡大
- 移動＋拡大＋鏡映
- 拡大＋鏡映＋回転

# 配色
> **言葉の定義** -- 本より引用 --
Aの色面とBの色面が調和し、見る人々に美的な感覚を与える色彩構成をいう。
**つまり、不調和で不快な感覚を与える配色は、配色と呼ばない。**

![IMG_6118.JPG](https://qiita-image-store.s3.amazonaws.com/0/49986/83e260e9-8685-792e-27a7-a8b5bd15ebbc.jpeg)

色を調和（色彩調和という）させるポイントは３つ。

## 同一調和
同じ色の明度を変える。

**同じ色なので調和するが、やや単調になる**

## 類似調和
色環表（カラーパレット）で、３０度〜40度の範囲で離れている色によって配色する。
**やわらかでおちついた感じ**

## 対比調和
色環表（カラーパレット）で、180度離れている色によって配色する。
**強いコントラスト効果があり、派手でダイナミックなイメージ**

#最後に
Webページの構成を考えるとき、少し楽になったなあと思うポイントを挙げてみました。
どうやら、この本、デザイン系の学校では教科書として使われていることもあるようで。。
基本の"キ"的な内容ですが、デザインについても、もっと勉強したいなあと思う今日この頃です。
【Swift】Extensionの書き方


# Extentionの書き方

Objective-CでもFrameの要素を取り出すのにとても苦労して座標を計算するのに長いコードになっていたがExtensionを使うと簡潔にかけるようになったのでSwiftでも同じようなことをしたいな〜と思ったのでどうかくのか試してみたが、すでに世の中には同じことを考えてすでに公開してくれる先達がたくさんいらっしゃるので本当に助かります。m(__)m
http://qiita.com/i6r/items/5ff6224b3b7eea62e906

他にもUIViewのSubViewを前に持ってきたり、後ろに戻したりする際に
bringSubviewToFront、sendSubviewToBackと言うメソッドがあります。
凄くよく使うメソッドですが、メソッド名の始まりがわからず毎回ググッてしまうレベルです！
なので自分のわかりやすいメソッド名にしてしまうExtensionを書いてみました。

``` UIView+Extension.swift
extension UIView {
    func viewToFront(view: UIView) {
        bringSubviewToFront(view)
    }
    func viewToBack(view: UIView) {
        sendSubviewToBack(self)
    }
}
```

``` SampleViewController.swift

class SampleViewController {

    @IBOutlet weak var bgView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view .viewToFront(bgView)       
    }
}
```

Extension今後も活用して行きます！
sudo 経由で rbenv を使えるようにする


普通にシステムワイド(/usr/local/rbenv配下)に rbenv をインストールした際、sudo 経由で rbenv を使いたいが、普通に sudo すると

```
$ sudo rbenv
sudo: rbenv: コマンドが見つかりません
```

という感じで rbenv を見つけることができない。(rbenv で入れた gem コマンドなども同様)

sudores の設定で secure_path という設定で特定のpath以外にはpathは通さない設定になっているのが原因。
対処方法としては3つ

* sudo するときに -i オプションをつける(対象ユーザの.profileなどを読み込んだ状態で実行される)
* secure_path の設定を解除する
* secure_path にrbenvのpathを追加する

今回、できるだけsecureな状態は維持しつつ面倒を省きたいので3番めの方法で対応することにした。

visudo で設定ファイルを開いて、secure_path の設定箇所を以下のように変更

```
(変更前)
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
↓
(変更後)
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rbenv/bin:/usr/local/rbenv/shims
```

これで sudo 経由で rbenv や gem コマンドが使えるようになった。

# 参考

* ~~[rbenvをシステムワイドにインストールする – つくば日記(仮)](http://office.tsukuba-bunko.org/ppoi/entry/systemwide-rbenv)~~ （サイト閉鎖？）
* [bundler や gem コマンドが sudo で実行できない - fugafuga.write](http://blog.tokoyax.com/entry/rbenv/sudo-command-not-found)
* [Man page of SUDO](https://linuxjm.osdn.jp/html/sudo/man8/sudo.8.html)
Concrete CMS で編集できるユーザーを限定させたい。IP制限を書ける方法など


こんにちは。

よくお客さんから、Concrete CMS サイトのセキュリティを向上させたいという要望があります。

以下私がよく行っている方法を共有します。

## 案1：IP 制限を行う

一般的な Apache サーバーで、.htaccess の編集ができるのであれば、
ログインできるページに特定の IP でないとアクセス出来ないように設定できます。

**コードはこちら**
https://concrete5.co.jp/blog/concrete5-access-restriction

元ネタ by Hissy
https://gist.github.com/hissy/5433792


## 案2：Private Domain でのみ編集を許可するようサーバーで設定し、Private Domain ではキャッシュを無効化する

※もっと良い方法を Hissy が、[コンクリートファイブジャパン公式ブログ](https://concrete5.co.jp/blog/)で公開します。

編集用ドメインと公開用ドメインをわけ、何らかの形で公開用ドメインは独自の制限をかける方法があります。

ただ、concrete5 はキャッシュ機能が備わっており、Private Domain でアクセスされた時にキャッシュが生成されてしまうと、ファイル内のパスが Private Domain の絶対パスで記入されてしまいます。

なので、解決策として、Private Domain でアクセスされている際は、キャッシュを生成しないように設定します。（Private Domain でのアクセスはスピードが遅くなります）。

まず、
/application/config/concrete.php
ファイルを作成し、そこに private domain であれば、キャッシュを無効化する設定を書き込みます。

concrete5 は、 config 設定の一部を、ファイルで管理しているので、環境によって読み込む分岐を加えます。

**コードはこちら**
https://concrete5.co.jp/blog/concrete5-access-restriction


上記の設定をした時は、管理画面から一切キャッシュ関連の設定を変更することができなくなるのでお気をつけ下さい。

その他の concrete.php に設定できる項目は

- [config/concrete.php の日本語訳 (5.7.3.1)](https://rescuework.nagoya/blog/config-concrete) 
- 最新バージョンの /concrete/config/concrete.php

をご覧ください。

以上

## 宣伝 & クレジット

この記事が役に立ったら、「 **CMS は concrete5 が一番**」と頭の中で10回唱えてください。

CMS は断然 [concrete5](https://concrete5-japan.org/)で決まり。[コンクリートファイブジャパン株式会社](https://concrete5.co.jp)がサポートできます。
GPS | UTC > 現在のUTC時刻 > サイトによっては秒が正確ではない

GPSで受信している時間とUTCの時間、うるう秒などではまった。

うるう秒 http://qiita.com/7of9/items/5931e824c6a405ec48fb

以下のサイトの「世界協定世界時：」はUTCではないようだ。
http://asai.vis.ne.jp/mikawa/joho/jikan-seikaku.shtml

以下のサイトの時間が（おそらく)UTC。
http://time.is/ja/UTC

2つのサイトで20秒ほどの違いがある。


どこが一番正確なサイトなのかは要調査。
RubyでSFTP


[net/sftp](https://github.com/net-ssh/net-sftp)を用いてsftpを利用する方法を簡単にまとめる。

## 接続

[net/ssh](https://github.com/net-ssh/net-ssh)に依存している

### パスワードを用いて接続する方法

```ruby

option = {
  password: 'password',
  port: 22,
}

Net::SFTP.start('host', 'username', option) do |sftp|
end

```

### 秘密鍵を用いる方法

```ruby
option = {
  keys: '/path/to/your/identity_key',
  passphrase: 'your-identity-key-pass-phrase',
  port: 22,
}

Net::SFTP.start('host', 'username', option) do |sftp|
end

```

## ファイルのput/get

### put

```ruby

Net::SFTP.start('host', 'username', option) do |sftp|
  sftp.upload!('/path/to/local_file', '/path/to/remote_file')
end

```

### get

```ruby

Net::SFTP.start('host', 'username', option) do |sftp|
  sftp.download!("/path/to/remote_file", "/path/to/local_file")
end

```
Pharo Smalltalk の Announcement を使って ズンドコキヨシ してみた。

# 概要
@sumim さんの [Squeak Smalltalkでズンドコキヨシ](http://qiita.com/sumim/items/c94e8fee3128a84f0333) に触発されて、Pharo 
Smalltalk の Announcement を使ってズンドコキヨシをしてみました。
キヨシが「ズン」「ズン」「ズン」「ズン」「ドコ」と歌うと観衆が「キヨシ！」と合いの手を入れます。

# 方針
キヨシはプロの歌手です。沢山の聴衆に向かって歌います。なので、キヨシと観衆が直接結合するのはよろしくありません。
スターと聴衆の間には線引きが必要なのです。

そこで、 Pharo Smalltalk の Announcement メカニズムを使って分離します。

# 実装

## キヨシの実装
クラスを以下のように定義します。

```smalltalk:Kiyoshi
Object subclass: #Kiyoshi
	instanceVariableNames: 'announcer'
	classVariableNames: ''
	category: 'ズンドコキヨシ'
```

announcer の遅延初期化も含めたアクセサを定義します。

```smalltalk:Kiyoshi
announcer
	^ announcer ifNil: [ announcer := Announcer new ]
```

これでキヨシは聴衆に向けてアナウンスを飛ばすことができるようになりました。
では、アナウンス内容を定義しましょう。

```smalltalk:Phrase
Announcement subclass: #Phrase
	instanceVariableNames: 'word'
	classVariableNames: ''
	category: 'ズンドコキヨシ'
```
そしてPhraseにアクセサやインスタンス生成を定義します。

```smalltalk:Phrase
word
	^ word
```
```smalltalk:Phrase
word: aString
	word := aString
```
```smalltalk:Phrase_class
with: aString
	^ self new word: aString
```

Kiyoshiは歌います。

```smalltalk:Kiyoshi
sing: aString
	Transcript show: aString.
	self announcer announce: (Phrase with: aString)
```
トランスクリプトウィンドウに言葉を表示して、それを歌詞(Phrase)としてアナウンスします。

プロともなれば、持ち歌のフレーズはソラで歌えます。当然です。

```smalltalk:Kiyoshi
ズン
	self sing: 'ズン'
```
```smalltalk:Kiyoshi
ドコ
	self sing: 'ドコ'
```

もちろんアドリブだってできます。

```smalltalk:Kiyoshi
singRandom
	(Random new nextInt: 5) = 1
		ifTrue: [ self ドコ ]
		ifFalse: [ self ズン ]
```

## 聴衆の実装

聴衆は、アナウンスを聴いて、「ズン」「ズン」「ズン」「ズン」「ドコ」ときたら、「キヨシ！」と合いの手を入れます。

```smaltalk:Audience
Object subclass: #Audience
	instanceVariableNames: 'memory'
	classVariableNames: ''
	category: 'ズンドコキヨシ'
```

まずは、キヨシの歌を聴きに行きます。

```smalltalk:Audience
listenTo: aKiyoshi
	aKiyoshi announcer subscribe: Phrase send: #hear: to: self
```

キヨシが歌詞(Phrase)をアナウンスしたら、自分に聞かせろ(self hear: aPhrase)ということです。
では、聞きましょう。

```smalltalk:Audience
hear: aPhrase
	self memory add: aPhrase word.
	(self memory endsWith: #('ズン' 'ズン' 'ズン' 'ズン' 'ドコ'))
		ifTrue: [ 
			self sing: 'キヨシ！'.
			self memory removeAll ]
```

ああ、もちろんmemoryの遅延初期化アクセサも定義しないといけません。

```smalltalk:Audience
memory
	^ memory ifNil: [ memory := OrderedCollection new ]
```

そして合いの手。

```smalltalk:Audience
sing: aString
	Transcript show: aString; cr
```

できた！

# テスト

では、プレイグラウンドとトランスクリプトウィンドウを開いて、以下のコードを実行してみましょう。

```smalltalk:Playground
kiyoshi := Kiyoshi new.
audience := Audience new.
audience listenTo: kiyoshi.
```

そして、

```smalltalk:Playground
kiyoshi ズン;ズン;ズン;ズン;ドコ;ズン;ズン;ドコ;ドコ;ズン;ズン;ズン;ズン;ドコ
```

を実行すると、トランスクリプトウィンドウに

![ZunDokotest.png](https://qiita-image-store.s3.amazonaws.com/0/59918/1de3e4a8-64e6-ac62-cd2c-b148d6928347.png)

と表示されます。やった！

ではアドリブを効かせてもう一度！

```smalltalk:Playground
100 timesRepeat: [ kiyoshi singRandom ]
```

するとこんな感じに。

![ZunDokoInprov.png](https://qiita-image-store.s3.amazonaws.com/0/59918/e0f23b54-c5d3-fe79-df70-9c289d926e59.png)

# まとめ

Pharo Smalltalk の Announcement という放送メカニズムを使って、キヨシと聴衆を強結合させないでズンドコキヨシをしてみました。
旧来のchanged:とupdate:に基づく放送メカニズムに比べて、update:にボイラープレートが必要なくなったのと、シンボルだけでなく放送内容のクラスを使って必要な放送を選択できるので、ちょっと自由度は高くなったかなと思います。
ブラウザバックするとボタンが反応しなくなる問題

## 発生した問題
以下の手順で操作すると、Webページのボタンが無反応になる。（クリックしても動かない）
1. Webページでボタンをクリックして画面遷移
2. 画面遷移後、ブラウザバックして前の画面に戻る
3. ボタンをクリックしても反応しない

上記の問題が「Firefox」「IE」「iOSのSafari」などで発生した。
開発に利用しているChromeでは起きないので気がつかないよぉ

## 原因
### ボタンが無反応？
反応しないボタンを調査すると"disable"という属性が……
どうやら、ボタンの二重クリック対策のjavascriptが動作して、ボタンをクリックできないようにしていたよう。
原因はわかったけれど、どうしてこんな属性が？（ブラウザバックだけど）画面を表示しただけだよ


### ボタンがdisableになっている？
どうやら同じ問題に直面している人は多いようで、以外とさくっと原因が判明した。

「Back Forward Cache（BFcache）」という親切（？）機能が原因らしい。
BFcacheの詳細についてはGoogleで検索。
Firefoxではデフォルトでこの機能がONになっているらしいですよ。

それで、以下の流れでこの問題が発生しているよう。

画面A表示（状態1）
画面Aでボタンをクリック
↓
画面Aでスクリプトが動き、ボタンをdiableにする（状態2）
↓
画面Bに遷移
ブラウザバックする
↓
BFcacheにより画面遷移直前の状態、つまり「状態2」の画面Aが表示される
さらに、loadイベントが発生「しない」ので、loadでひも付けたスクリプトが動作しない

## 対策
### 対策１（失敗）
「onloadが動かないならば、動かすようにすればいいじゃない」ということで、以下の処理をスクリプトに追加。

```js
$(document).ready(function(){
    //～ボタンのdisble解除～
    //～ボタン二重対策処理～
});
window.onunload = function(){}
```
※jQuery使ってます

unloadイベントに空の処理を追加することで、ブラウザバック時もloadイベントが動作するというもの
詳細な理由は調べたけど忘れた。
対策後にFirefox、IE11で確認したら、無事に動いている。よかったよかった

iOS mobile Safari「無駄無駄無駄無駄無駄無駄無駄無駄っ！」


iOSのSafariさんが言うことを聞いてくれませんでした。

### 対策２（ほぼ成功）
iOSのSafariでは"load"、"unload"イベントが非推奨になっているようです。
その代わりに"pageshow"、"pagehide"イベントを使うらしい。
ということで、スクリプトを最初修正

```js
window.onpageshow = function(){
    //～ボタンのdisble解除～
    //～ボタン二重対策処理～
}
```

これでiOS Safariでも動きました。解決解決

### 対策３（これで完璧）
満足して他の画面を触っていると、どうも動かないボタンがある。
asp:repeaterコントロールで繰り返し作成されるボタンがクリックしてもウンともスンとも言ってくれない。

それで、このボタンを調べたのだが、どうやらこいつはASP.net側がjavascriptの処理をバインドさせている様子（たぶん。自信ない）
おそらく、クリック時にdisable処理が入ったせいで動いていないようだ。

ということで、disabled属性をつけるタイミングをずらすことで解決した。
最終的な処理はこちら

```js
window.onpageshow = function(){
    var $btn = $("input[type='submit']");
    //～ボタンのdisbled解除～
    $btn.prop("disabled", false);

    //～ボタン二重対策処理～
    $btn.on("click", function(){
        // ボタンクリックに関する一連の処理後にクリック無効化処理を実行させる
        setTimeout(function() {
            $btn.prop("disabled", true);
        }, 0);
    });
}
```

ふう、解決解決。

## 課題
解決解決、と書いたけれど、実はまだ問題が残っている。
"pageshow"イベントが古いIEだと動作しないらしい。（IE10か11から対応）
今回は古いIEの面倒を見なくてもOKということで確認していないが、多分これだと動かない。
なので、古いIE（～IE10）でも　たぶん　動作するようにしたものがこちら。

```js
function notDoubleClick(){
    var $btn = $("input[type='submit']");
    //～ボタンのdisble解除～
    $btn.prop("disabled", false);

    //～ボタン二重対策処理～
    $btn.on("click", function(){
        // ボタンクリックに関する一連の処理後にクリック無効化処理を実行させる
        setTimeout(function() {
            $btn.prop("disabled", true);
        }, 0);
    });
}

if (typeof window.onpageshow != "undefined") {
    window.onpageshow = function() {
        notDoubleClick();
    }
} else {
    window.onload = function() {
        notDoubleClick();
    }
    window.onunload = function () { }
}
```

たぶん、なので動作しないかも。
D3.jsを使ったSTARWARS風ズンドコキヨシ

もう完全にネタ化してるズンドコキヨシですが、以前作ったD3.jsを使ったSTARWARS風六甲おろしを元にしてSTARWARS風ズンドコキヨシを作ってみました。

![img](http://bl.ocks.org/nobuhito/raw/b892f6bf29bbf5978f9d/d4e20fa99e79a7443819be2105e088c2630b497f/preview.png)

[ソースと動作確認はこちら](http://bl.ocks.org/nobuhito/b892f6bf29bbf5978f9d)

[モバイル用のデモはこちらのほうがいいかも](http://bl.ocks.org/nobuhito/raw/b892f6bf29bbf5978f9d)

流行りに流行ってるSTARWARSとズンドコキヨシが夢の饗宴とか最高ですね☆

[ズンドコキヨシまとめ](http://qiita.com/shunsugai@github/items/971a15461de29563bf90)
[Apache] 2.4.18 のソースビルドではまったところメモ

## autoconf, automake, libtool

それぞれ、最新バージョンをGNUよりダウンロードしてビルドする

## LDAP

```text
$ make
...
/usr/include/apr-1/apr_ldap.h:79:18: error: lber.h: No such file or directory
/usr/include/apr-1/apr_ldap.h:80:18: error: ldap.h: No such file or directory
/usr/include/apr-1/apr_ldap.h:136:2: error: #error Support for LDAP v2.0 toolkits has been removed from apr-util. Please use an LDAP v3.0 toolkit.
```

LDAP v3.0 がみつからず。。。しばらく経ったのち

```text
# yum install openldap-devel
```

に行き着きました。

## /usr/bin/ld: cannot find -luuid

```text
# yum install libuuid-devel
```

## PCRE

## OpenSSL
Kotlinでズンドコキヨシ


関数型っぽくしてみたかったのでSequenceを使ってみました。（コード量は気にしてないです）

```java
import java.util.Random

fun main(v: Array<String>) {
    //無限リスト（風）を用意
    val zun = "ズン"
    val doko = "ドコ"
    val getZunOrDoko = { if (Random().nextBoolean()) zun else doko }
    val sequence = generateSequence(getZunOrDoko)

    //畳み込みながら判定していく
    sequence.fold(listOf<String>()) { list, zunOrDoko ->
        println(zunOrDoko)
        val latest = listOf(list, listOf(zunOrDoko)).flatten().takeLast(5) //直近５個を用意
        //Thread.sleep(500)
        if (latest == listOf(zun, zun, zun, zun, doko)) {
            println("き・よ・し！")
            return@main
        }
        latest
    }
}

```
Hubotで対話的ズンドコキヨシ

CoffeeScriptで挑戦した勢いで書きました。

```coffeescript
module.exports = (robot) ->
  zdk = (zun1)->
    zun2 = yield zun1 is 'ズン'
    zun3 = yield zun2 is 'ズン'
    zun4 = yield zun3 is 'ズン'
    doko1 = yield zun4 is 'ズン'
    delete robot.zdk
    if doko1 is 'ドコ' then 'キ・ヨ・シ!!' else false

  nextZdk = (input)->
    robot.zdk.next(input).value

  robot.respond /(ズン|ドコ)$/i, (msg)->
    unless robot.zdk
      robot.zdk = zdk(msg.match[1])
    res = nextZdk msg.match[1]
    if typeof res is 'string'
      msg.send res
    else
      unless res
        delete robot.zdk
```

最後にしゃべらせる部分が微妙な気がしますね。

せっかくなのでSlack上で
![無題.png](https://qiita-image-store.s3.amazonaws.com/0/111100/738ea8cf-c2e0-380f-89c1-fee2f3e7db4d.png)

### 追記
npmに初挑戦がてら登録してみました。
https://www.npmjs.com/package/hubot-zundoko

ご自分のhubotともズンドコしたい!という方はぜひ。
hubotのルートディレクトリに移動したら下記コマンドでインストールできます。

```bash
$ npm install --save hubot-zundoko
$ echo '["hubot-zundoko"]' > external-scripts.json
```

参考
http://qiita.com/satzz/items/0a5875fae0f5731cc8f8
http://saihoooooooo.hatenablog.com/entry/2013/12/07/052150
プロジェクトをうまく進めるための、プロジェクト計画書とキックオフのチェックリスト

今日 2016-03-17 はプロジェクトキックオフだったのですが、裏方で仕込みをしたので、その振り返りという意味を込めてメモ。

みなさんの知っているコツも、下にある「編集リクエスト」や「コメント」で教えてください。

# プロジェクトキックオフ

* 関係者全員を集めて、タイミングをはかって、きちんとやる。
* 第一部: 方針説明
* 第二部: リレーション形成

# プロジェクト計画書(キックオフ版)に書く内容

* プロジェクトが目指す方向
 * 背景 (なぜやるのか)
 * 目的/目標 (なにをやるのか)
 * 必達、ストレッチの2段階で。
 * Biz, Dev, Ops の3つの視点で。
* 方針 …… 今回、これを忘れてた。他の人はきちんと出して巻き込んでた。ぱくる。
* スケジュール …… マイルストーンとプライオリティ
* 体制 …… 出席者全員が「オレのポジションはココね」を理解できるように書く(∵主体性を引き出す)。プロジェクト外部関係者にもふれておく。
* 管理ルール …… きちんと交通整理する。

# プロジェクト計画書(第1版) に盛り込んでおく内容

* 責任体制 (要件責任、開発責任、利益責任)
* 品質指標

# チェックリスト

* プロジェクト計画書は、関係者が見えるところにあるか?
* プロジェクト計画書は、最新化されているか?
* プロジェクト計画書は、変更管理 (変更理由、最新化アナウンス) されているか?
小さいReactアプリケーションのためのライブラリ書いた


[EventEmitterバケツリレースタイル/フレームワークなしで小さくFluxする - Qiita](http://qiita.com/mizchi/items/6a3500e598ec36746509)

これ見て最近は大体自分も同じような感じのことをしているので共通化できる最小限のコードをライブラリにしてみた。

https://github.com/hokaccha/react-micro-container

元記事でも言ってるようにやることはとても少ないのでライブラリ使わないでもいいんだけどそのへんは好み。

## Usage

まず普通のステートレスなReactコンポーネントを作る。`dispatch`という`props`を受け取ってそれを通してイベントを発火するというのが唯一の規約。

```javascript:components/counter.js
import React from 'react';

// Stateless component
export default class Counter extends React.Component {
  render() {
    return (
      <div>
        <div>{this.props.count}</div>
        <button onClick={() => this.props.dispatch('increment', 1)}>+1</button>
        <button onClick={() => this.props.dispatch('decrement', 1)}>-1</button>
        <button onClick={() => this.props.dispatch('increment', 100)}>+100</button>
      </div>
    );
  }
}
```

それをwrapするコンテナコンポーネントを作る。こいつはstateを持ち、子のコンポーネントに`dispatch`を渡してイベントをsubscribeし、適時stateを更新する。

```javascript:container/counter.js
import MicroContainer from 'react-micro-container';
import Counter from '../components/counter';

export default class CounterContainer extends MicroContainer {
  constructor(props) {
    super(props);
    this.state = { count: 0 };
  }

  componentDidMount() {
    this.subscribe({
      increment: this.handleIncrement,
      decrement: this.handleDecrement,
    });
  }

  handleIncrement(count) {
    this.setState({ count: this.state.count + count });
  }

  handleDecrement(count) {
    this.setState({ count: this.state.count - count });
  }

  render() {
    return <Counter dispatch={this.dispatch} {...this.state} />;
  }
}
```

このコンポーネントも単なるReact Componentなのでこのコンテナを普通にマウントするだけ。

```javascript:app.js
import ReactDOM from 'react-dom';
import CounterContainer from './container/counter';

ReactDOM.render(<CounterContainer />, document.getElementById('app'));
```

Ajaxしたり何なりも全部コンテナでやる。汚い部分を全部コンテナが引き受けることでコンポーネントの世界をきれいに保つことができる。そして覚えるのは`dispatch`と`subscribe`だけで、あとは普通にReact使うのと変わらないというのが利点。

大きくなったらFlux的なの使おう。

## 実際に使ってみたか

[Adventar](http://www.adventar.org/)をこれで書き換えてみた。オレオレFlux的な感じでやってたけど、そんなにコード量多くないのでこれで書き換えてだいぶすっきりした。
nginxでSSLサーバーのテスト総合評価Aを取るconfig

**本記事は、2016/3/18時点でさくっとA評価を得るべく、configを作る為作成しています。セキュリティ情報は日々更新されますので、都度見直すようにしてください。**

#環境
nginx/1.8.1

#準備
`openssl dhparam 2048 -out /etc/nginx/ssl/dhparam.pem`
このコマンドは環境によっては時間がかかります。
*2016/03/19 ミスってたので修正＾＾；

#config
```www.conf
server {
    listen       443 ssl spdy default_server;
    ssl on;
    ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'kEECDH+ECDSA+AES128 kEECDH+ECDSA+AES256 kEECDH+AES128 kEECDH+AES256 kEDH+AES128 kEDH+AES256 DES-CBC3-SHA +SHA !aNULL !eNULL !LOW !kECDH !DSS !MD5 !EXP !PSK !SRP !CAMELLIA !SEED';
    ssl_certificate      /etc/nginx/ssl/1_www.crt;
    ssl_certificate_key  /etc/nginx/ssl/ssl.key;
    ssl_dhparam          /etc/nginx/ssl/dhparam.pem;

・・・略

```

#評価サイト
https://www.ssllabs.com/ssltest/index.html
Cassandra 調査メモ

2016/3/18の[「RDB技術者のためのNoSQLガイド」出版記念セミナー](http://connpass.com/event/27331/)の懇親会で「Cassandraの紹介」発表者の原沢さんにいろいろ聞いてみたので、後で調べたこととも合わせて忘れないうちにメモ。

# [Q1]Cassandraならではの罠はないか?

「書いたものがすぐには見えない」などCassandraに限らず一貫性を保証しないNoSQLアーキテクチャ特有の課題があることに注意が必要。
一貫性を保証しないが故に、「readよりwriteの方が速い」という結果になっているとのこと。

# [Q2]事例では何万ものノードを使用しているものもあるが、本当にその規模までスケールできるのか?

現状では、1クラスタだと1000ノード程度までが限界。
Gossipプロトコルでノード間通信をしている(参考: [ノード間のコミュニケーション（ゴシップ）](http://docs.datastax.com/ja/cassandra-jajp/3.0/cassandra/architecture/archGossipAbout.html))が、1000ノードくらいになるとネットワークが溢れる。
ただし、現在Appleがこれを改善しようと頑張っているとのこと。
通常はサービス単位や地域単位でクラスタを分けているのではないか。

# [Q3]想定されるデータ量に対して、どの程度の規模のノードを見積ればよいのか?

最新(3.x)だと1ノード1TBくらいで見積もるとよい。旧バージョンだと500GBくらいとのこと。(1ノードで2-3TBほどさばけるとのことだが、replication factor = 3 とすると取り扱うデータ量の3倍のストレージが必要になるので、だいたい計算に合う)

# その他 (後で調べたことも含む)

* read時に問い合わせる先のノードはクライアント側(のドライバ)が決定する。
    * 直接データを持っているノードにリクエストすることも、空いているノードにリクエストしてそのノード経由で読み込むこともできる。
    * 問い合わせはデータを持っている全てのノードに対して行う。高速なレスポンスが必要なら1つのノードから返ってきた段階で結果を返す、ある程度の整合性が必要なら複数のノードから返ってきた結果が一致したら結果を返す、といった指定が可能。
* 負荷分散やメモリ効率を考慮したデータ構造の設計が必要。
    * Javaベースなので(?)、1つのレコード(?)に大量のカラムを詰め込むと、読み込み時に不要なカラムまでメモリに載ってきて効率が低下する。
    * 特定のノードにのみ負荷が集中したりデータが肥大化したりする場合がある。(参考: [Cassandraのデータ設計で注意していること](http://ameblo.jp/principia-ca/entry-11886808914.html))
* 検索はRDBのようにはいかず、主キー(?)以外のカラムを検索する場合はインデックスを張る必要があるが、公式ドキュメントに「[どのような場合にインデックスを使用しないか](http://docs.datastax.com/ja/cql-jajp/3.3/cql/cql_using/useWhenIndex.html)」という記事まであるので一筋縄ではいかない模様。
* アーキテクチャの特性上、大量に発生するデータを取り扱う必要はあるが厳密な一貫性は求めないIoT関連での引き合いが多いとのこと。
* 有償版の価格はノード数(コア数?)に比例?

* * *

追加すべき点や修正すべき点がありましたらコメントをお願いします。
DMM API・MeCab・マルコフ連鎖でAV作品の紹介文を自動生成

#電子書籍「人工知能ポルノ」出版
<a  href="http://www.amazon.co.jp/gp/product/B01DI4BXJ6/ref=as_li_ss_tl?ie=UTF8&camp=247&creative=7399&creativeASIN=B01DI4BXJ6&linkCode=as2&tag=naoyashiga-22"><img src="https://qiita-image-store.s3.amazonaws.com/0/26043/4688ae23-51e6-befc-27cd-ffe7f11e3d04.jpeg" width="200"/>
人工知能ポルノ: コンピュータが書いたエロい文章</a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=naoyashiga-22&l=as2&o=9&a=B01DI4BXJ6" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
本記事の生成結果を電子書籍にしました。200~400文字程度の文章を100編掲載しています。 ご興味のある方はどうぞ!

# 自動生成してえ
こちらの記事に感銘を受けた。自分も何かやってみたいと思ったが、DeepLearningを用いての自動生成はハードルが高く、まずはマルコフ連鎖を使って自動生成してみようと思った。
[【エヴァンゲリオン】アスカっぽいセリフをDeepLearningで自動生成してみる](http://qiita.com/S346/items/24e875e3c5ac58f55810)

## そうだ!AVだ! :satisfied: 
自動生成にはデータが必要。自分はアニメがわからんので、エヴァンゲリオンの真似をしてもテンションがあがらない。自分のテンションがあがるものは?...すぐ思いついたのがAVの紹介文だ。

### AV紹介文のメリット
- 120字程度でデータが多そう?
    - タイトルと比べれば生成する文にバリエーションが出そう
- 人を興奮させようという熱意ある文章 :chart_with_upwards_trend: 
    - 無機質でないので楽しそう
- DMM APIで取得できる
    - 2016年3月にver3.0が出た
        - 何かしら改良されてるはずなので開発が以前より容易かも


# DMM APIを登録
https://affiliate.dmm.com/api/guide/
とういうことで早速始める。こちらの利用ガイドを参考に。

- DMMアフィリエイト登録
    - アフィリエイトID発行
- API IDを取得

# 作品紹介文を取得


こちらを参考にした。DMMのAPIはver3.0になっているのでそこは修正する必要がある。
http://akms.hateblo.jp/entry/2013/05/24/234703

## コード
1000作品の紹介文を取得してero.txtに書き込んだ。

```rb::dmm.rb
# -*- coding: utf-8 -*-

require 'open-uri'
require 'rexml/document'

def getURL(offsetNum)
	url = "https://api.dmm.com/affiliate/v3/ItemList?"
	queries = []

	params = {
	  "api_id"       => 'YOUR_API_ID',
	  "affiliate_id" => 'YOUR_AFFILIATE_ID',
	  "site"         => 'DMM.R18',
	  "service"      => 'digital',
	  "floor"        => 'videoa',
	  "sort"         => 'rank',
	  "offset"       => offsetNum,
	  "hits"         => 100,
	  "output"       => "xml"
	}

	params.each_pair do |key,value|
	  queries.push("#{key}=#{value}")
	end

	url += queries.join("&")

	return url

end

# 書き込み用テキストファイルを開く
File.open("ero.txt", "w") do |file|

	# 取得したいoffsetの回数だけLoop
	10.times do
		url = getURL(num)
		res = open(url)
		REXML::Document.new(res).elements.each("xml/result/items/item") do |element|
			# 作品紹介文を書き込む
			file.puts element.elements['comment'].text
		end
	end
end
```

# マルコフ連鎖を行う

## MeCabを準備
いろいろなやり方があると思うけど、下の記事を読んで設定した。
http://qiita.com/grachro/items/4fbc9bf8174c5abb7bdd

## マルコフ連鎖のスクリプト準備
こちらのスクリプトを参考にした。
https://github.com/o-tomox/TextGenerator

自分はPython3系で実行したので、上のスクリプトを2系から3系の書き方に修正した。
https://gist.github.com/naoyashiga/4dfaa7e2a5222a9cadd9

#紹介文を自動生成
## 紹介文を取得

```shell-session
$ ruby dmm.rb
```

## dbに書き込む

```shell-session
$ python PrepareChain.py
```

## 自動生成
```shell-session
$ python GenerateText.py
```

### 出力結果
出力できた :sunglasses:

おっと内容が卑猥すぎたようだ!残念ながらここでは公開できない :weary: 

気になる諸君はぜひ自分でやってみよう!

# 考察と展望
- Deep Learningでもやってみたい
- 生成文章量を調節できるようにしたい
- もっと大量の文章をもとに生成してみたい

#追記
ニューラルネットワークを用いてやってみました。
[DMM API、char-rnn(リカレントニューラルネットワーク)でAV作品の紹介文を自動生成 - not good but great](http://naoyashiga.hatenablog.com/entry/2016/11/09/213711)
LTspice > Link > 使い方 (Windows)

交流電源などの追加の仕方がわかりやすい。
http://www.cn.kagawa-nct.ac.jp/~kusama/experiment/cn4/T4_LTspice_1.pdf

Windows版での操作でMac OS X版とはUIが違うので同じ操作でできない部分もある。
電子工作 | LTSpice | AD2 > Link > LC filter

http://qiita.com/7of9/items/19a7540b4ea0f43c8215
にてハムノイズが出ている件の続き。

LCフィルターを使えばいいとのアドバイスを受けて検討中。

youtubeで以下を見つけた。
https://www.youtube.com/watch?v=PT9EOc1sZ94

この回路構成は「バターワース」というものだろうか？
とりあえずLTSpiceを使えば周波数vs応答特性が見れそうだ。
技術英語 > it might buy us some time. / Buy me some time.

@ Star Trek Voyager > PROTOTYPE

活動を停止しそうな装置に対してキムとトレスが方法について議論している。
キムの提案に対してトレスが

> it might buy us some time.

http://ejje.weblio.jp/content/buy+time

<hr>

<font color=red>以下はアニメです。</font>
https://www.youtube.com/watch?v=ImKCt7BD4U4

3:36あたりにアダムが

> ADAM: Buy me some time!
> BLAKE: Are you sure?
> ADAM: Do it.
IISで500エラーが発生したので調査したときのメモ

IISで500エラーが発生したので調査したときのメモです。

# 状況

+ ある対応によって500エラーが発生するようになった
+ ログ(C:\inetpub\logs\LogFiles)を見るとエラー原因が書いてあるが、どのファイルで問題が発生しているか分からない
+ HTMLの返却は可能
+ あるリソースのASPファイルをGETする際にだけ発生するわけではなく、どのASPリソースファイルへのGETでも問題が発生する
+ ASPをHTMLのみの記述にしてもエラーが発生する

# IISの詳細エラーの表示

IISの設定を変更することでどのファイルでエラーが発生しているのかブラウザ上で表示することができます。

[IIS 7以上でクラシックASPの詳細なエラーを表示する](http://kiyokura.hateblo.jp/entry/20131001/p1)

自分の場合、上記エラー設定を有効化することでGlobal.asaの処理の一部に問題があることが分かりました。

# Global.asaとは

[Global.asa リファレンス](https://msdn.microsoft.com/ja-jp/library/cc338723.aspx)

Webページの初回アクセス時に処理を実行することやセッションに値を設定することなどが出来るようです。

確認するとApplication_OnStartとApplication_onEndが記載されていたので、Webページを始めて開いたときにGlobal.asaに記載された処理が実行されたのですが、その処理で問題が発生し、500エラーが発生していました。
char を数字として出力したい!

`char`といえば、もっぱら文字を表すのに使われる型で、`std::cout`はそれを前提とした動作をする。

具体的には…

```cpp
char c = 65 // 文字コードがASCIIなら'A'と同じ
std::cout << c << std::endl

出力
A
```

#流れに逆らう
では、もし`c`を文字ではなく数字として出力したい場合はどうするか。

ググってみるとStack Overflowにこんなのが。
http://stackoverflow.com/questions/14644716/how-to-output-a-character-as-an-integer-through-cout

投票数の多い回答を見ると、単項演算子`+`を`c`に付けるだけでよいという。

つまり、

```cpp
char c = 65 // 文字コードがASCIIなら'A'と同じ
std::cout << +c << std::endl

出力
65
```

仕組みはよくわからないが、元のページによれば「数字として表示される型に昇格される」らしい。
つまりは`int`とかにキャストするのと同じなのだろうか。

#動機
自分は`char`そのものに興味はないのだが、`int8_t`・`uint8_t`は処理系によっては`signed char`・`unsigned char`をtypedefすることで実装されている。
typedefされた型はテンプレート特殊化では元の型と同じ扱いなので、単なる数値型として`int8_t`を使っても`char`向けの特殊化の影響を受けてしまう。
これを回避する方策を探していたのだった。

(噂に聞く「強いtypedef」とかいうのがあればこういう問題もなくなるのだろうか…)

# (2021/2/8追記)原理
約5年経ち「C++完全に理解した」ので原理について調べてみる。
C++ドラフトの[\[expr.unary.op\]の単項+演算子の項](https://eel.is/c++draft/expr.unary.op#:operator,unary_plus)には以下のような記載がある。

> Integral promotion is performed on integral [...] operands.
The type of the result is the type of the promoted operand.

つまり、単項+演算子のオペランドには"integral promotion"なるものが働き、戻り値はその結果の型になるらしい。

"integral promotion"については[\[conv.prom\]](https://eel.is/c++draft/conv.prom#def:integral_promotion)に以下のような記載がある。

> A prvalue of an integer type [...] can be converted to a prvalue of type int

略した部分を含めて大雑把に言えば「intよりも小さい数値型のprvalueはint型のprvalueに変換できる」ということだ。

だが一点問題がある。変数は確かlvalueとかそのへんのやつで、少なくともprvalueではないはずだ。
これに関しては"lvalue-to-rvalue conversion"というのがあるらしい。([\[conv.lval\]](https://eel.is/c++draft/conv.lval#:conversion,lvalue-to-rvalue))

> A glvalue [...] can be converted to a prvalue.

[この記事](https://qiita.com/rinse_/items/cffa87016b7de49391ae#glvalue)によると、glvalueはlvalueとその他の概念の総称らしいので、変数には適用できそうだ。

この2つの変換が合わさって、表題のような効果が得られるのだろう。

参考: https://en.cppreference.com/w/c/language/conversion
ズンドコキヨシをfx-602pで

ズンドコが流行ってるので便乗ズンドコ
http://qiita.com/shunsugai@github/items/971a15461de29563bf90

fx-602pでプログラミングするのは学生時代以来でしたが、若い頃覚えたものは忘れないものですね。
手元のfx-602pが動かなくなってたので、iOS用のシミュレータで動作確認しています。

(2016/03/23 ズンカウント版追記)

ズンをZ、ドコをDとするのは許されるものかどうか。
でも、空白をはさんでディスプレイに5文字表示されるので、そこはこのままで。

以下のリストで乗算記号は * に、除算記号は / に置き換えてます。

```
*** P0
" " 10 Min00
LBL0 "; " DSZ GOTO0
11111 Min01
10000 MinF
LBL1
RAN# * 2 = INT Min00 x=0 GOTO3 GOTO4
LBL2
MR01 / 10 = INT Min01 MR00 * MRF = M+01
MR01 x=F GOTO9 GOTO1
LBL3
";Z " GOTO2
LBL4
";D " GOTO2
LBL9
"Ki.Yo.Shi!"
                ...080steps
```
上がほぼ初版で、やや冗長です。
ズンカウント方式にして、最小STEPを目指したのが下のコードです。
ディスプレイ用バッファに空白を詰め込む処理は、あえて残します。

```
*** P0
" " 10 Min00
LBL0 "; " DSZ GOTO0
LBL1
0 Min00
LBL2
RAN# * 2 = INT x=0 GOTO3
";D " MR00 - 4 = X>=0 GOTO9 GOTO1
LBL3
ISZ ";Z " GOTO2
LBL9
"Ki.Yo.Shi!"
                ...058steps
```
fields_forに既に情報の書かれている情報を渡す

# 概要
fields_forでの新規作成されたインスタンス変数ではなくて、既に情報の書かれたインスタンス変数を渡す時(validation, edit等で)に手こずったのでメモ

# fields_for
一つのフォームで二つ以上のモデルに情報を保存したい時に使用する。
仮にuserテーブルとprojectsテーブルがあるとする。
userはnameカラムがあり、projectはtitleカラムとcontentカラムがある。

```label:user_model.html
has_many :projects
accepts_nested_attributes_for :projects
```

```label:users_controller.html
def new
@user = User.new
end

def edit
@usr = User.find(params[:id])
end

省略
```

```label:new.html.erb
<%= form_for @user |f| %>
<%= f.text_area :name %>
<%= f.fields_for :project |ff|%>
<%= ff.text_area :title %>
```

```label:edit.html.erb
<%= form_for @user |f| %>
<%= f.text_area :name %>
<%= f.fields_for :project, @user.project.title |ff|%>
<%= ff.text_area :title %>
<%= f.fields_for :project, @user.project.content |ff|%>
<%= ff.text_area :title %>
省略
```

edit.htmlの3行目と5行目がわからなかった、それ以外はググったら出てくる。
fields_forで幾つか情報を渡したい時、このように
第二引数として@user.project.titleなどとどの情報をあげるのか指定してあげなければ該当するすべての情報を渡してしまって入力画面のフォームが倍増した。