OmniAICreator/Qiita-1.07M huggingface dataset:
ESP8266のファームウェアを更新する

[前回](http://qiita.com/masato/items/a3b71f8a17b876be8f76)はESP8266 ATファームウェアを使いWi-Fiの接続を確認しました。ATコマンドを使って接続処理を書くのは面倒なのでなにかよい方法を探しています。あとでファームウェアを更新することになるので、ATコマンドが使えるカスタムファームウェアを使い手順を確認することにします。以下のサイトを参考にしました。

* [Getting started with the esp8266 and Arduino](http://www.madebymarket.com/blog/dev/getting-started-with-esp8266.html)
* [ESP8266Firmware](http://www.electrodragon.com/w/ESP8266_Firmware)
* [How to update the ESP8266 Module's firmware](https://developer.mbed.org/users/sschocke/code/WiFiLamp/wiki/Updating-ESP8266-Firmware)


## ブレッドボード配線

Arduino Unoは3.3Vの電源供給に使います。ファームウェアのアップロードをする場合は[前回](http://qiita.com/masato/items/a3b71f8a17b876be8f76)の配線に加えて、ESP8266のGPIO0をGNDに接続します。ESP8266と接続したUSB-TTLシリアル変換ケーブルをOSXに接続し、Arduino UnoのUSBケーブルは電源アダプタにつなぎます。

* RX (ESP8266) -> TX (USB-TTL)
* TX (ESP8266) -> RX (USB-TTL)
* CH_PD (ESP8266) -> VCC (Arduino Uno 3.3V)
* VCC (ESP8266) -> VCC (Arduino Uno 3.3V)
* GND (ESP8266) -> GND (Arduino)
* GND (USB-TTL) -> GND (Arduino)
* GPIO0 (ESP8266) -> GND (Arduino)

![ESP8366-firm.png](https://qiita-image-store.s3.amazonaws.com/0/43745/0172a96b-ae86-f288-a77d-f39a72ef814d.png)

## esptool

[esptool](https://github.com/themadinventor/esptool/)を使ってファームウェアをESP8266に書き込みます。システムワイドにインストールします。

``` bash
$ cd ~/arduino_apps
$ git clone https://github.com/themadinventor/esptool/
$ cd esptool
$ sudo python setup.py install
...
Installed /Library/Python/2.7/site-packages/pyserial-2.7-py2.7.egg
Finished processing dependencies for esptool==0.1.0
$ which esptool.py
/usr/local/bin/esptool.py
```

## ファームウェアダウンロード

ATコマンドでファームウェア更新の確認をしたいので、[Electricdragon](http://www.electrodragon.com/)の[Customized AT-thinker Firmware](http://www.electrodragon.com/w/ESP8266_Firmware)を使います。[Googleドライブ](https://drive.google.com/folderview?id=0B_ctPy0pJuW6d1FqM1lvSkJmNU0&usp=sharing)から`AI-v0.9.5.0 AT Firmware.bin`を`esp8266.9.5.0.bin`にファイル名を変更してOSXに保存します。


## ファームウェアの書き込み

esptool.pyを使ってファームウェアを書き込みます。

``` bash
$ esptool.py -p /dev/tty.usbserial write_flash 0x000000 esp8266.9.5.0.bin
Connecting...
Erasing flash...
Writing at 0x0007ec00... (100 %)

Leaving...
```

書き込みが終了したら、GPIO0とGNDの接続を外してESP8266の電源を入れ直します。OSXの[CoolTerm](http://freeware.the-meiers.org/)を起動してATコマンドのテストをします。ファームウェアのバージョンは`0.9.5`に上がりました。

```
AT+GMR
00200.9.5(b1)
compiled @ Dec 25 2014 21:40:28
AI-THINKER Dec 25 2014

OK
```

![firmware-0950.png](https://qiita-image-store.s3.amazonaws.com/0/43745/35e1c0f7-8a6c-a7d3-07b2-7aa00e363132.png)
Struts2におけるリクエストパラメータの扱い（中・上級）～複数DTOとDTO利用のメリット

# ActionからDTOへ格納する機能

リクエストパラメータをActionのDTO(DataTransferObject)へ格納する方法として、Struts2は以下のことを自動実行します。

* リクエストパラメータ(String)からフィールドの型へ自動型変換を試みる
* クラスの構造をたどって値を格納する

Actionが持つDTOの個数に制限はありません。

ただしModelDrivenやScopeModelDrivenを使う場合は1個のみであり、フィールド名はmodelに固定されます。

## 複数のDTOを持つ場面

複数のDTOを持つ場面、つまり画面からのリクエストを複数のクラスに分類している状態と言えます。次の例は UserとJob、2つのDTOを受け取る例です。

```java:SamplaAction.java
public class SampleAction extends ActionSupport  {

	/**
	 * デフォルトアクション。
	 */
	@Action("")
	public String start() throws Exception {
		return SUCCESS;
	}
	@Getter @Setter
	private User user;

	@Getter @Setter
	private Job job;
}
```

このActionクラスに対するリクエストパラメータ名は、user.フィールド名、ないしは、job.フィールド名となります。

このようにリクエストパラメータ名もActionクラスのデータ構造をそのまま反映できます。

## DTO利用のメリットは何か

ActionにDTOを置くことにより、Actionクラスの実装が軽くなる意外にもメリットがあります。

* 入力値検証(Validation)もDTOに定義できる。
* 自動型変換(TypeConvertion)もDTOに定義できる。

入力値検証や自動型変換は本来Actionクラスに対して定義するものですが、この定義をDTOへ委譲できます。特に入力値検証の委譲は、VisitorFieldValidator クラスが用意されており、これを使うだけです。
（自動型変換は特に宣言なく利用できます）

## VisitorFieldValidatorの利用例

先ほどのSampleActionに対し、入力値検証(Validation)の設定をしたActionクラスは次のようになります。

```java:CheckAction.java
@Validations(
	visitorFields = {
		@VisitorFieldValidator(appendPrefix=true , fieldName="user") ,
		@VisitorFieldValidator(appendPrefix=true , fieldName="job") ,
	}
)
public class CheckAction extends ActionSupport {

	/**
	 * デフォルトアクション。
	 */
	@Action("check")
	public String check() throws Exception {
		return SUCCESS;
	}

	@Getter @Setter
	private User user;

	@Getter @Setter
	private Job job;
}
```

@VisitorFieldValidatorの属性にて定義している内容は以下の通りです。

|属性名|内容|
|:---|:---|
|appendPrefix|入力値検証エラーを検出したときに、エラー項目名へActionクラスのフィールド名を接頭辞につけるか否か。
|fieldName|入力値検証を実施するActionクラスのフィールド名|

appendPrefix=true としたとき、入力値検証エラーの項目名にActionクラスのフィールド名がつきます。例えば、Userクラスにusernameのフィールドがあった場合は、UserクラスはActionクラスでは user の名前で利用しているので、エラー項目名は user.username となります。

1つのActionで複数のDTOを扱う場合は、appendPrefixをtrueにしますし、単一のDTO、特にScopedModelDrivenを使う場合は appendPrefixはfalseにします。
python の unittest で selenium の phantomjs webdriver を使う

# python の unittest で selenium の phantomjs webdriver を使う

## 肝

* 先に `pip install selenium` しておく
* `phantomjs` にパス通しておく
* useragentの指定は `desired_capabilities` でできるらしい
* ついでにwebdriverの設定はクラスのデコレータに切り出してみた
* 最後に `driver.quit()` しておかないとスクリーンショットが保存されなかったりする

```py:test.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import os
import unittest
import commands

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException

USER_AGENT = "Mozilla/5.0 (iPhone; CPU iPhone OS 7_1_2 like Mac OS X) AppleWebKit/537.51.2 (KHTML, like Gecko) Version/7.0 Mobile/11D257 Safari/9537.53"


def unittest_phantomjs_webdriver_decorator(klass):
    def __setUpClass(cls):
        (status, phantomjs_path) = commands.getstatusoutput("which phantomjs")
        if not status == 0:
            raise StandardError("phantomjs is not found!!")

        cls.driver = webdriver.PhantomJS(
            executable_path=phantomjs_path,
            service_log_path="/dev/stdout",
            desired_capabilities={
                'phantomjs.page.settings.userAgent': USER_AGENT,
            },
            # proxy通す場合
            #service_args=[
            #    '--proxy=127.0.0.1:9999',
            #    '--proxy-type=http',
            #],
        )
        cls.driver.set_window_size(1400, 1000)
        cls.driver.implicitly_wait(1)

    def __tearDownClass(cls):
        cls.driver.quit()

    klass.setUpClass = classmethod(__setUpClass)
    klass.tearDownClass = classmethod(__tearDownClass)
    return klass


@unittest_phantomjs_webdriver_decorator
class AccessTest(unittest.TestCase):

    def test_google(self):
        driver = self.driver
        url = """http://google.com"""
        driver.get(url)
        driver.save_screenshot("google.png")

    def test_amazon(self):
        driver = self.driver
        url = """http://amazon.com"""
        driver.get(url)
        driver.save_screenshot("amazon.png")

if __name__ == "__main__":
    unittest.main()
```
映像入出力ハードウェアの話


テレビとゲーム機やPCを接続したりするときに、こいつらって接続できんの？変換可能なの？みたいなやつらをまとめてみた。

## 各種コネクタと画像や名前

とりあえずBaffaloの「知ってなっとく接続規格」を見るのが良い
http://buffalo.jp/products/connect/


**デジタル**　

- DVI
- DisplayPort
- HDMI


**高性能アナログ**

- コンポーネント端子（赤青緑のやつ）
- D端子

**アナログ**　

- コンポジット端子(RCA) (赤白黄の黄色のやつ)
- S端子
- D-sub 15ピン(VGA)


## DVI

Digital Visual Interface
http://ja.wikipedia.org/wiki/Digital_Visual_Interface

デジタルのみ(DVI-D), アナログのみ(DVI-A), 兼用(DVI-I)の物がある。
より高速なデュアルリンクという2回線目を持ったものがある。
HDMIのデジタル映像部分とシングルリンクの部分が互換性がある。


## ディスプレイポート

http://ja.wikipedia.org/wiki/DisplayPort

DVIやHDMIでは満たせない小型化や今後の高速化の余地を残した新インターフェースで、この2つと互換性を持つ。


## コンポーネント端子

http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E7%AB%AF%E5%AD%90

ハイビジョン映像を送れるアナログ端子。
色が赤緑青だが、それぞれがRGBなわけではなく、[コンポーネント映像信号](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9D%E3%83%BC%E3%83%8D%E3%83%B3%E3%83%88%E6%98%A0%E5%83%8F%E4%BF%A1%E5%8F%B7)を送っている。
緑がY[輝度]、青がPb/Cb[色差(青)]、赤がPr/Cr[色差(赤)]となっている。


## D端子

http://ja.wikipedia.org/wiki/D%E7%AB%AF%E5%AD%90

日本独自仕様でコンポーネント信号用のケーブルを一本にまとめ、識別信号も送れるようにしたもの。ただし、著作権保護のAACS規定により今後対応する製品が出てこないはず。

## コンポジット端子(RCA)

http://ja.wikipedia.org/wiki/RCA%E7%AB%AF%E5%AD%90

[コンポジット映像信号](http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%B3%E3%83%9D%E3%82%B8%E3%83%83%E3%83%88%E6%98%A0%E5%83%8F%E4%BF%A1%E5%8F%B7)を送る。
黄色のみ映像用で、赤は右音声、白は左音声用。
ちなみに、色分けはされているがそれぞれのケーブルに通常違いはなく、さらに、コンポーネント端子のケーブルとも違いはない。


## S端子

http://ja.wikipedia.org/wiki/S%E7%AB%AF%E5%AD%90

コンポジット信号を輝度信号と色信号の2系統に分離 (Separate) して送るのでS端子と呼ばれる

## D-sub

15ピンのものはVGAとかも呼ばれたりする。

### 参考：シリアルポート
- http://en.wikipedia.org/wiki/RS-232
- http://www.cqpub.co.jp/hanbai/books/46/46071/46071_p113-116.pdf
[小ネタ]Ubuntu でttyUSB0(USBシリアル変換)が権限関連で使えない場合の対処方法

超小ネタです。

UbuntuにUSBシリアル変換ケーブルを接続すると、/dev以下にこういったデバイスが追加されたりします。

```shell:
crw-rw---- 1 root dialout 188, 0  4月  7 15:21 /dev/ttyUSB0
```

で、minicomなどで一般ユーザとして使用すると、当然のことながら「権限がありません」というメッセージが出て使えないので、なんとかしようということです。

とはいっても、単純な話でdialoutグループに使用したいユーザを追加すれば問題なく使えます。
（デフォルトで入ってないのが不便ですね。。）

他にもudevの設定を書き換えて今のユーザグループに追加するってのもありですが、折角ある専用グループにユーザ追加したほうが理にかなってそうですし、楽ですね。

```shell:
sudo gpasswd -a ユーザ名 dialout
```

で、ユーザを追加した後、一旦ログアウトしてログインしなおせば、わざわざrootになることなく一般ユーザでもminicomで開けるという話でした。
.NET Framework覚書 64bitOS環境で、.NET Frameworkアプリケーションを32bitモードで動かす方法

やりたかったのは、iPadアプリ→IIS→ASP .NET→Oracleという流れで、Oracleからデータ取得する事でした。

そのため、Windows7 64bit環境にOracle Client 11g R2(32bit)をインストール。
さらにIISにASP.NET(.NET Framework2)を設定。
（基本設定→アプリケーション編集→アプリケーションプールで「DefaultAppPool」を選択）
それから、ポート８０の解放(http://wiki.mcneel.com/ja/zoo/window7firewall)

（ちなみにOracle Client 11g R2(32bit)をインストールしたのは、SI ObjectBrowser9を使用したかったから^^;）

SI ObjectBrowser9でもデータベースに接続できたし、さぁ、いよいよ接続テストだ！！
とiPadアプリを動かしてみたのですが…「データベースに接続できませんでした」の文字。

IISのlogで、ASPまでは辿り着いている事を確認。
次に、ASPのlogを確認してみたら下記のエラーが出てました。

「 Oracle クライアント ライブラリを読み込もうとしましたが、BadImageFormatException が発行されました。この問題は、32 ビットの Oracle クライアント コンポーネントがインストールされている環境で 64 ビット モードを実行すると発生します。」

調べてみると、どうやらOracleClientは32bitなのに対して、ASP.NETアプリケーションが64bitで動いている事が原因らしい。

SI ObjectBrowser9を諦めて、OracleClient　64bitを入れるか悩んでいたら、下記のサイト様を見つけました！！Oracle側ではなく、ASP.NET側を32bit化する事で対応できるんだそうです。なんてありがたい(^^)

**NET Frameworkアプリケーションを64bit OS上で32bitモードで動かす方法**
(http://niyodiary.cocolog-nifty.com/blog/2009/05/net-framework64.html)

この中で紹介されている「■ASP.NETアプリケーションの32bit化」を実施したところ、みごと接続する事が出来ました(^^)ありがとうございました。
Treasure Agent 2.2.0のリリース


すでにアナウンス済みですが，Treasure Agent(td-agent) 2.2.0を出しました

[td-agent 2.2.0 - Google Groups](https://groups.google.com/forum/#!topic/fluentd/71DsaY73fBM)

パッケージ内の更新は以下の通りです．

- fluentd [v0.12.7](https://github.com/fluent/fluentd/blob/master/ChangeLog)
- fluent-plugin-s3 [v0.5.7](https://github.com/fluent/fluent-plugin-s3/blob/master/ChangeLog)
- fluent-plugin-mongo [v0.7.8](https://github.com/fluent/fluent-plugin-mongo/blob/master/ChangeLog)
- td [v0.11.8.2](https://github.com/treasure-data/td/blob/master/ChangeLog)
- fluentd-ui [v0.3.18](https://github.com/fluent/fluentd-ui/blob/master/ChangeLog)
- ruby 2.1.5
- json 1.8.2
- cool.io 1.3.0
- Amazon Linux support

## fluentd v0.12

このバージョンから，fluentdがv0.10ではなくv0.12系が使われるようになりました．その結果，Filter/Label，forwardプラグインでのat-least-onceなどが使えるようになります．
これらの機能に関しては，v0.12のリリース時に書いたので([Fluentd v0.12のリリース](http://qiita.com/repeatedly/items/78fcd7e14e31b931f7eb))，そちらの記事も参照してください．

すでにv0.12をプロダクションで使っている例はあるので，大きなバグが潜んでいる可能性は少ないとは思っていますが，何か問題があれば教えてもらえればと思います．

## Amazon Linuxのサポート

最近td-agentユーザが増えてきたのもあり，正式にrpmパッケージを提供することにしました．Amazon Linux 2015.03(ami-1ecae776)でビルドしているので，これより前のバージョンでの利用は推奨しません．
インストールに関しては，すでにクラスメソッドさんが記事をあげてくれているので([td-agent2をAmazon Linuxで実行する](http://dev.classmethod.jp/cloud/td-agent2-amazon-linux/))，こちらも参照してみてください．

Amazon Linux，RHEL/CentOS系と微妙に差異があり，rpmのビルドスクリプトがちょくちょく動かなくて，違いを調べるのがかなり疲れました(同僚のyuuさんにもアドバイス貰った)．Amazon Linux，いちいちインスタンス立てるの面倒なので，ローカルでテスト出来る仕組みを提供して欲しいと切に願っております…

## 2.1.5-1での変更点

rpmのinitスクリプトでstatusがうまく動かないバグの修正がメインで大きなアナウンスはしてなかったんですが，2.1.5-1が実はリリースされてました．目に見えた変更点は少なかったんですが，

- パッケージサイズを前バージョンの60%くらいまで縮小
- sqlプラグインやredshiftプラグイン向けにpg gemをインストール出来るようパッケージを追加

を行ってました．パッケージングの仕組みをもう少し改善して，今後パッケージサイズをもう少し小さくする予定です．

## まとめ

td-agent 2.2.0のリリースにともない，fluentd-docsをv0.12の記述をデフォルトにする予定です．今でもv0.12をつければ見られるようになっているので，filterプラグインとかをみたい方はv0.12から辿って見てください([http://docs.fluentd.org/v0.12/articles/quickstart](http://docs.fluentd.org/v0.12/articles/quickstart))．

皆さん，どんどんtd-agent 2.2.0を使って行きましょう！
Unity5+iOS+imobileで広告の表示ポジションがおかしくなる問題

##Unity5+iOS+imobileで広告の表示ポジションがおかしくなる問題
Unity5
i-mobile(iOS sdk 2.0.8 , unity sdk 2.0.6)


i-mobileだと、こんな感じで表示指定するけど、Unity5+iOSだと変な位置に表示される（Androidだと正常に表示される）

	IMobileSdkAdsUnityPlugin.show (spotId_banner, IMobileSdkAdsUnityPlugin.AdType.BANNER,IMobileSdkAdsUnityPlugin.AdAlignPosition.LEFT, IMobileSdkAdsUnityPlugin.AdValignPosition.MIDDLE);
##解決するために
Unity4.6系を使おう（Unity4.6系+iOSだと正常に広告が表示される。）

Unity5系だとどうしても外部sdkが正常に動作しないことが多いね（・ω・）
Greasemonkeyで読み込んだjQueryが本体のjQueryを上書きしてしまう

Greasemonkeyを使う際は毎回jQueryを読み込んでいるが、user.jsで触った所以外のレイアウトが崩れる現象が発生。

原因を探ると適用側の読み込みjQueryとGreasemonkey側での読み込みjQueryのバージョン違いが原因でした。

軽く触れているのが[このあたり](http://www.otchy.net/20110607/use-jquery-on-greasemonkey-for-chrome/)ですが、周知の事実でしょうか。

***

#結論

* `$.browser`は[jQuery1.9から廃止された](http://hyper-text.org/archives/2013/02/jquery_core_19_upgrade_guide_ja.shtml#jquery-browser-removed)
* 適用ページではjQuery1.5.2を使用していた
* 適用ページでは`$.browser`を使ってIEのバージョン判定をしていた
* GreasemonkeyではjQuery1.11.0を読み込んでいた
* GreasemonkeyでのjQueryの読み込みをやめると、正常に戻り、Greasemonkey内でもjQueryは使えた
* おそらく、GreasemonkeyがjQuery1.11.0を読み込むことで`$`が1.11.0仕様になった？

GreasemonkeyでjQueryが使いたいときは読み込み前に適用側のソースを確認しなければならない、ということでしょうか。
GreasemonkeyではjQueryをコピペで毎回
`// @require  http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js`
と読み込んでいたが、汎用的にするには変数`$` (`jQuery`)が未定義の場合に\<script>を追加し、そこで読み込む…などとするのがいい…？

#エラーが出たコード

```js
$(document).ready(function() {
	if ( $.browser.msie ) {
	}
.
.
.
}
```

`TypeError: $.browser is undefined`

`$.browse`でエラーが出るため、それ以降の処理が行われなかった。
PHPUnit-seleniumでウィンドウを指定する

よくWebページではリンク先が新しいウィンドウにいくことがある。
なので、そのページの確認をする際は、新しいウィンドウに移動しなければならない。
**が！その方法が分からなかった。**

いろいろ調べた結果、
`$this->windowHandles()`
で、ウィンドウのパラメータ群が取得できることが分かった。
新しいページが立ち上がる毎に記録が増えていく。
なので、

```php:test.php
//ウィンドウパラメータ取得
$windowList = $this->windowHandles();
//一番新しいページに移動
$latestNum = count($windowList) - 1;
$this->window($windowList[$latestNum]);
//一番古いページに移動 
$this->window($windowList[0]);
```
これでOK。
PHPのHTMLメール送信する際にテンプレートファイル内でPHPの変数を利用する方法

PHPからHTMLメールを送る時に、HTMLテンプレート内でPHPの変数を使う方法がわからなかったので、手順をまとめました。

## やりたいこと
* HTMLはファイルとして外部からインポートして使いたい(`echo <body>テキスト</body>`みたいなことをしたくない)
* HTML内で外部から渡したPHPの変数を使って動的に内容を出力したい

## PHPの変数を使うには、拡張子は.php
* 最初は`template.html`のようにhtml拡張子のファイルを読み込むようにしていましたが、これだとPHPとして認識されず、ファイル内でPHPの変数が利用出来ないのでファイルの拡張子を`.php`に変更します

## file_get_contentsではなく、include
* 外部ファイルのインポートには、`file_get_contents`を使う方法がメジャーですが、これだとHTMLが全て文字列として読み込まれてしまいます。
* PHPとして、ファイルを読み込むには`include`を利用します。

`require`でも結果は同じですが対象ファイルが存在しない時に、`fatal error`になってしまうので`include`を利用します。

## 直接、includeの値を返すと嵌る
ただし、includeは、正常に値を読み込めた場合はintの1を返すという仕様で最初ハマりました。

これを回避するには、includeをラップする関数を作り、結果をバッファに取得してその値を返すという風にします。

```php
function get_include_contents($filename) {
    // ファイルが存在する場合
    if (is_file($filename)) {
        // バッファに結果を取得する
        ob_start();
        include $filename;
　　　　　// 取得した内容を返し、バッファを空にする
        return ob_get_clean();
    }
    return false;
}
```
## HTMLテンプレート内で利用する変数をセットする
最後に先ほど作成した関数でテンプレート内で利用する変数をセットします。

```php
function get_include_contents($filename, $variablesToMakeLocal) {
    extract($variablesToMakeLocal); // ← ここを追記
    // ファイルが存在する場合
    if (is_file($filename)) {
        // バッファに結果を取得する
        ob_start();
        include $filename;
　　　　　// 取得した内容を返し、バッファを空にする
        return ob_get_clean();
    }
    return false;
}
```

上記のコードを呼び出す場合は以下のようにします。

```php

$data['language'] = 'ja';
$data['name'] = 'テスト太郎';

$html = get_include_contents('html_template.php', $data);
$ses->send(array('test@gmail.com'), 'test', $html);
```

第二引数で指定した配列を`extract`で変数に格納しテンプレート内で利用できるようにしています。

## 最後に
今回の方法でPHPでHTMLメールを送る際に外部ファイル内でPHPの変数を自由に使うことが出来るようになりました。
よくある用途だと思うので、ぜひ参考にしてください。

## 参考サイト
* php mailer and html includes with php variables 
  Stack Overflow http://stackoverflow.com/questions/6688343/php-mailer-and-html-includes-with-php-variables

* PHP: include 
  Manual http://php.net/manual/ja/function.include.php
PHPUnit-seleniumでalert処理をする

PHPUnit-seleniumで自動テストを流している時に直面した問題が**「alertが出ると処理の続きが出来ない」**ということだった。
手動テストだったらOKボタンを押せば済むのに、自動テストだと出来ない！押せない！

そして、２〜３日以上にわたり迷走して出てきた解決策がコレである。
**`$this->acceptAlert();`**
コレだけ流せばOKだった。
まぁ、初期の頃だったので探し方とかが下手だったのもあり時間かかってしまいましたね。
ブログネタに困ったときにYahoo知恵袋を叩く

Yahoo APIを使ってYahoo知恵袋のエントリー新着を叩くだけのスクリプト。
例によってUnicodeエスケープ問題を外部ファイルで解決する甘え。


```python:chie.py

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
import requests
import json,urllib2
import sys, codecs
sys.stdout = codecs.getwriter("utf-8")(sys.stdout)

url = "http://chiebukuro.yahooapis.jp/Chiebukuro/V1/getNewQuestionList?"
appid = "&appid=YoueID"
output = "&condition=open&output=json"
req_seq = url + appid + output

r = requests.get(req_seq)
res = r.json()

lists = json.dumps(res, sort_keys=True, indent=4)

f = open("chie.txt", "aw")
for x in lists:
	f.write(str(x))
	f.close

f = open("chie.txt", "rb")
data = f.read()
f.close()
print data.decode("unicode-escape")
```

chie.txtがなければ作る、あれば上書きされるので2回目以降の実行のときは作られたchie.txtを削除しないと面倒なことになることを解消したい。
C# WPF DataGridViewのUIパフォーマンス問題、仮想化処理で解決出来ない場合の第三の選択

C# の WPF デフォルトコンポーネント DataGridView は、1万件程度の表示でUIがハングアップし、
ユーザーがアプリケーションが停止したのかと勘違いしてしまう問題がある。
仮想化処理をすると解決するとの記述が幾つかのサイトで見られるが、
それでも解決しない場合、サードパーティー製の　Extended WPF Toolkit　をオススメ
http://wpftoolkit.codeplex.com/

これの DataGrid は、UIがハングアップせず、データの読み込みは遅延しているのだがUIはハングアップしていないので
ユーザーがアプリケーションが停止したと勘違いすることは無い。

純正 DataGridViewのUIハングアップはバグではないかと言う指摘も有り。

なお、それ以外の解決方法では <b>最後の行</b> のサイズ設定を "Auto" では無く "*" にすると解決する場合もある。
http://www.thebestcsharpprogrammerintheworld.com/blogs/wpf-datagrid-rendering-is-very-slow.aspx
Deviceのeditで"wrong number of arguments (1 for 0)"

「あれ？どうしたらいいの？」と思ったけど、とりあえずダメ元で

「"wrong number of arguments (1 for 0)" devise edit」
のワードで検索したら下記がヒット！感謝！

http://stackoverflow.com/questions/16364626/rails-3-2-13-devise-2-2-3-method-authenticate-scope-throws-error-wrong-nu

ようするに、`authenticate_user!` のオーバーライドの仕方が間違えているということでした。あぁ、そうか。そうだよね。

```rb
    def authenticate_user!(options={})
        super(options)
    end
```

stackoverflow（英語）はやっぱり凄いな。
docker on Mac OS X

# 目的
[公式ドキュメント](https://docs.docker.com/installation/mac/)をもとに Mac で docker をセットアップして、Nginx で HTML を表示するあたりまで。

# boot2docker セットアップ

boot2docker をインストール

    $ brew install boot2docker

自分の環境ではエラー発生

    Error: The `brew link` step did not complete successfully
    The formula built, but is not symlinked into /usr/local
    Could not symlink bin/docker
    Target /usr/local/bin/docker
    already exists. You may want to remove it:
      rm '/usr/local/bin/docker'

    To force the link and overwrite all conflicting files:
      brew link --overwrite docker

    To list all files that would be deleted:
      brew link --overwrite --dry-run docker

    Possible conflicting files are:
    /usr/local/bin/docker
    ==> Summary
    🍺  /usr/local/Cellar/docker/1.5.0: 9 files, 7.2M
    ==> Installing boot2docker
    ==> Downloading https://homebrew.bintray.com/bottles/boot2docker-1.5.0.yosemite.bottle.tar.gz
    ######################################################################## 100.0%
    ==> Pouring boot2docker-1.5.0.yosemite.bottle.tar.gz
    ==> Caveats
    To have launchd start boot2docker at login:

すでにあった docker を削除してシンボリックリンク作成

    $ rm -f /usr/local/bin/docker
    $ brew link --overwrite docker

Boot2Docker VM を作成します

    $ boot2docker init

Boot2Docker VM を起動します

    $ boot2docker start

環境変数を確認します

    $ boot2docker shellinit

環境変数を設定します。環境ごとに必要なので、.bashrc などに書くとよいかも。

    $ eval "$(boot2docker shellinit)"


boot2docker の状態確認と docker のバージョン確認をします

    $ boot2docker status
    $ docker version

hello-world コンテナを使ってセットアップできたか確認します

    $ docker run hello-world


# Nginx コンテナを起動して、Mac のブラウザからアクセス

Docker Host 上で Nginx コンテナを起動します

    $ docker run -d -P --name web nginx

実行中のコンテナを表示します

    $ docker ps

コンテナと Docker Host のポートのマッピングを表示します

    $ docker port web
    443/tcp -> 0.0.0.0:49156
    80/tcp -> 0.0.0.0:49157

このまま 0.0.0.0 を localhost に置き換えて Mac のブラウザで http://localhost:49157 にアクセスしても、
Nginx にアクセスできません。
理由は、Mac 上で動いてるんではなく、Docker Host 上で動いているからです。
なので、Docker Host の IP を取得します。

    $ boot2docker ip
    192.168.59.103

ブラウザで http://192.168.59.103:49157 にアクセスすると、Nginx のようこそ画面が表示されます。

コンテナの停止と削除は以下のコマンドを実行します。

    $ docker stop web
    $ docker rm web


# コンテナに Volume をマウントします

boot2docker は起動時に自動で /Users を共有します。
コンテナにディレクトリをマウントするために、この共有ポイントを使用することができます。

Mac 上に html ファイルを作成します。

    $ mkdir -p ~/site
    $ cd ~/site
    $ echo "my new site" > index.html

作成した site ディレクトリをマウントするように Nginx コンテナを起動します。

    $ docker run -d -P -v $HOME/site:/usr/share/nginx/html --name mysite nginx

コンテナのポートを確認します

    $ docker port mysite
    $ 80/tcp -> 0.0.0.0:49166
    $ 443/tcp -> 0.0.0.0:49165

ブラウザで http://192.168.59.103:49166 にアクセスして、作成した html("my new site") が表示されれば成功です。

html ファイルをリアルタイムに追加できます。

    $ echo "This is cool" > cool.html

ブラウザで http://192.168.59.103:49166/cool.html にアクセスして、追加した html("This is cool") が表示されれば成功です。

コンテナの停止と削除をします。

    $ docker stop web
    $ docker rm web
eccube_install.shを変更しないで叩いちゃったときの対処法

[EC-CUBE3のメモ - 開発環境 -](http://qiita.com/chihiro-adachi/items/645fee870d50a985dc88)で
`eccube_install.sh` を変更せずに叩いちゃったときに、本来変更しないといけない箇所がわからなくなっちゃったときの対処法です。

[足立のVagrant](https://github.com/chihiro-adachi/eccube3-vagrant)を前提としてます。

`eccube_install.sh` を叩くと、

* `app/config/eccube/config.php`
* `app/config/eccube/config.yml`

上記２つの設定ファイルが作成されます。
`config.php` は、LC_Page_XXXX系が参照していて、  
`config.yml` は、Silexに乗せ換えたControllerが参照しています。

この中身を手動で書き換えてあげましょう。

[足立のVagrant](https://github.com/chihiro-adachi/eccube3-vagrant)を利用していれば以下と同じになります。

```php:config.php
<?php
define('ECCUBE_INSTALL', 'ON');
★define('HTTP_URL', 'http://192.168.33.10/ec-cube/html/');
★define('HTTPS_URL', 'http://192.168.33.10/ec-cube/html/');
★define('ROOT_URLPATH', '/ec-cube/html/');
define('DOMAIN_NAME', '');
define('DB_TYPE', 'pgsql');
define('DB_USER', 'cube3_dev_user');
define('DB_PASSWORD', 'password');
define('DB_SERVER', '127.0.0.1');
define('DB_NAME', 'cube3_dev');
define('DB_PORT', '5432');
define('ADMIN_DIR', 'admin/');
define('ADMIN_FORCE_SSL', FALSE);
define('ADMIN_ALLOW_HOSTS', 'a:0:{}');
define('AUTH_MAGIC', 'droucliuijeanamiundpnoufrouphudrastiokec');
define('PASSWORD_HASH_ALGOS', 'sha256');
define('MAIL_BACKEND', 'mail');
define('SMTP_HOST', '');
define('SMTP_PORT', '');
define('SMTP_USER', '');
define('SMTP_PASSWORD', '');
```

```yaml:config.yml
database:
    driver: pdo_pgsql
    host: 127.0.0.1
    dbname: cube3_dev
    port: 5432
    user: cube3_dev_user
    password : password
    charset: utf8
mail:
    host: localhost
    port: 25
    username: 
    password: 
    encryption: 
auth_mode: 
auth_type: HMAC
auth_magic: droucliuijeanamiundpnoufrouphudrastiokec
password_hash_algos: sha256
use_point: true
option_favorite_product: true
mypage_order_status_disp_flag: true
★root: /ec-cube/html/
★tpl: /ec-cube/html/user_data/packages/default/
★admin_tpl: /ec-cube/html/user_data/packages/admin/
shop_name: EC-CUBE SHOP
release_year: 2015
mail_cc:
    - admin@example.com
stext_len: 50
sample_address1: 市区町村名 (例：千代田区神田神保町)
sample_address2: 番地・ビル名 (例：1-3-5)
```

★をつけた箇所が間違えやすいので、気を付けてください。
EntryやContactにアクセスしたときに、CSSがあたってないデザインの場合は、
だいたいの場合、 `tpl`の設定が間違っていることが多いです。
ブラウザですぐJavaScriptを実行するためのブックマークレット

以下のスクリプトをブックマークに追加するだけなのでとても簡単です。

- アドレスバーにjavascript:～と打ったりデベロッパーツールを開くより速い
- PCブラウザでアドレスバーにjavascriptスキームをコピペするとjavascript:の部分が消えるという煩わしさが解消される
- デベロッパーツールのないスマホでも扱える

```js
javascript:eval(prompt(''))
```

クロージャーにしたい場合

```js
javascript:!function(){eval(prompt(''))}()
```
ScalaでFizzBuzzを書いてみた

#FizzBuzzとは
1から順番に数を表示する、その数が3で割り切れるなら"Fizz"、5で割り切れるなら"Buzz"、両方で割り切れるら"FizzBuzz"と表示するもの。今回は入力された数字までのFizzBuzzを出力するものを書きました。

```FizzBuzz.scala
object FizzBuzz {
  def main(args: Array[String]) = {
    println("Enter top num")
    val top: Int = readInt
    fizzBuzz(top)
    def fizzBuzz(x: Int) = {
      for(i <- 1 to x) {
        if(i % 15 == 0) {
          println("FizzBuzz")
        }else if (i % 3 == 0) {
          println("Fizz")
        }else if (i % 5 == 0) {
          println("Buzz")
        }else {
          println(i)
        }
      }
    }
  }
}
```
JavaScriptのスクレイピングを使用した印刷機能の実装メモ

# JavaScriptのスクレイピングを使用した印刷機能の実装メモ


## メモ
JavaScriptを使用したスクレイピング、および任意箇所の印刷機能のメモ。HTMLにすでにある特定のタグ間のデータを抽出し、印刷対象に指定します。JavaScriptの実装となり、スクレイピングした範囲をwindowオブジェクトにコピーし、printメソッドを指定。最後に生データを戻すことにより、通常の印刷にも支障のないようにしています。



```html:hoge.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML lang="ja">
<HEAD>
  <TITLE>ほげほげ</TITLE>
  <link href="css/hoge.css" rel="stylesheet" type="text/css">
  <script src="js/hoge.js"></script>
</HEAD>

<BODY>
<a onClick="PrintScript();"><image src="/img/printer.png" alt="印刷"/></a>

<!--PrintStart-->
  <div>
    ほげほげ
  </div>
<!--PrintEnd-->
</BODY>
</HTML>

```


```js:hoge.js

function PrintScript() {
    //印刷範囲を設定
    htmlcode = window.document.body.innerHTML; 
    sprnstr  = "<!--PrintStart-->"; 
    eprnstr  = "<!--PrintEnd-->"; 
    var prnhtml = htmlcode.substr(htmlcode.indexOf(sprnstr)+sprnstr.length); 
    prnhtml = prnhtml.substring(0,prnhtml.indexOf(eprnstr)); 
    window.document.body.innerHTML = prnhtml; 
    window.print(); 
    window.document.body.innerHTML = htmlcode;
}


```
Unityプラグイン経由Androidのjar内でパス取得

随時追記

**import com.unity3d.player.UnityPlayer;** を使用するにはclass.jarをインポートしておく必要あり

*********************
activity.getCacheDir()の中身
　　　　　　　　　　　　/data/data/com.test.miyaactivityzip/cache
activity.getFilesDir()の中身
　　　　　　　　　　　　/data/data/com.test.miyaactivityzip/files



```java:MiyaActivityZip.java
import com.unity3d.player.UnityPlayer;
import com.unity3d.player.UnityPlayerActivity;

public class MiyaGetCachePath 
{
    public void ZipRelease()
    {
        final Activity activity = UnityPlayer.currentActivity;
		
        Log.d("getCacheDir=", activity.getCacheDir().toString());
        Log.d("getFilesDir=", activity.getFilesDir().toString());
    }
}
```
MELPAの package-install で発生する Not found エラーを回避する

## Not found エラー
MELPAで公開されたパッケージを package install でインストールしている最中に、次のようなエラーが発生してインストールが止まってしまうことがある。

    file-error "http://melpa.milkbox.net/packages/XXXXX-2015MMDD.HHMM.el" Not found

## 対処1<a id="sec-1-1" name="sec-1-1"></a>

    M-x package-refresh-contents

を実行したあとにもう一度 package-install を実行する。これで解決すればめでたしめでたし。

## 対処2<a id="sec-1-2" name="sec-1-2"></a>

上記の対処で解決しない場合、原因は (各パッケージにではなく) melpaサーバ にある可能性がある。

list-packages ではまず各パッケージのメタ情報 (<http://melpa.org/packages/archive-contents>) を取得して一覧を作成する仕組みになっているが、この archive-contents と、実際に公開されているパッケージの間でバージョン情報の不整合がかなり頻繁に発生している。具体的には melpa サーバが提供している archive-contents の更新が遅い。これが Not found エラーの原因である。

list-packages で表示されるバージョン情報と、実際に <http://melpa.org> に掲載されているバージョン情報を比べてみて、異なっていればこのケースである [^1]。

[^1]: 頻繁にアップデートされる helm なんかではこの不整合がよく発生することを確認している。


なので対処法としては **2〜3日後に、メタ情報が更新されたのを見計らってまた改めて package-install を実行する** というのが正しい。

ただ、どうしても今インストールしたいというケースはありますね。以下のようにやりましょう。

### どうにかインストールする方法<a id="sec-1-2-1" name="sec-1-2-1"></a>

1.  インストールしたいパッケージのバージョンを、<http://:/melpa.org> で調べる。

2.  *(PACKAGE\_USER\_DIR)*/archives/melpa/archive-contents を開く。
    -   *PACKAGE\_USER\_DIR* はelpaパッケージを格納しているディレクトリパスで、変数 package-user-dir に設定されている。

3.  archive-contents の内容を改竄する。
    
    例として helm のパッケージ情報は次のような記述になっており、(20150402 2318) というのがバージョンである。
    
    ```lisp
        (helm . [(20150402 2318) ((emacs (24)) (cl-lib (0 5)) (async (1 2))) "Helm is an Emacs incremental and narrowing framework" tar ((:url . "https://emacs-helm.github.io/helm/"))])
```
    
    これを、melpa.org で調べたものに書き変える。melpa.org で示されたバージョンが 20150404.2303 であれば、
    
     ```lisp
(helm . [(20150404 2303) ((emacs (24)) (cl-lib (0 5)) (async (1 2))) "Helm is an Emacs incremental and narrowing framework" tar ((:url . "https://emacs-helm.github.io/helm/"))])
```
    
    とするのが正解。
    
    編集に失敗しても M-x package-refresh-contents を実行すれば元の (不整合のある) archive-contents に戻せるので気にすんな。

4.  改竄が終了すればセーブして emacs を再起動。

5.  再起動後すぐに、M-x package-list-packages-no-fetch を実行。ここから通常通りの操作で最新版がインストールできるようになっているはず。
JAMonの外し方

モニタリングのためにJAMon（ http://jamonapi.sourceforge.net/ ） をいれたが、javamelodyに変えることにしたので、外したときに躓いたこと。

libのjamon.jartと、webapp/jamon.warをはずしたのに、なぜかjamon.xmlを見て配備しようとしている。
調べてみたら、${CATALINA_HOME}/conf/Catalina/localhost　の下にjamon.xmlがいた…　

こいつも消せば解決。
CからMacの通知センターへ簡単に通知する方法


[こちらの記事](http://qiita.com/zakuroishikuro/items/cfba3e7734036e389768)を少し意識して書いてますｗ

ちなみに、厳密には **AppleScript** を使って通知センターへ送っています。
Cでやっているのは外部プログラムを起動するだけです。


## AppleScriptで通知センターに通知を送る

Marvericksから、AppleScriptで通知センターに通知できるようになったようです。
そこで、AppleScriptを使ってCから通知センターに通知を送る方法です。

### AppleScriptの書式

以下のようにすることで通知を送れます。

```applescript
display notification "Message"
```

また、タイトルとサブタイトルも設定することができます。
（残念ながらアイコンは変えられないようです）

```applescript
display notification "Message" with title "Title" subtitle "Sub title"
```

ターミナルから実行する場合はこんな感じ。

```console
osascript -e 'display notification "Message" with title "Title" subtitle "Sub title"'
```

これを、Cから実行します。

### `execl`で実行する

```c
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    if (argc < 4) {
        printf("Usage: %s <message> <title> <subtitle>\n", argv[0]);
        return 1;
    }

    char *message  = argv[1];
    char *title    = argv[2];
    char *subtitle = argv[3];

    char command[255];
    sprintf(command, "display notification \"%s\" with title \"%s\" subtitle \"%s\"", message, title, subtitle);

    if (execl("/usr/bin/osascript", "/usr/bin/osascript", "-e", command) < 0) {
        perror("execl");
        return 1;
    }

    return 0;
}
```

やっていることはシンプルで、引数で受け取った3つの文字列をそのまま送っているだけです。
起動は`execl()`を使って`-e`オプションを伴って起動します。


## ちなみに`popen`使ったバージョン

最初、`-e`オプションのことを知らず、パイプで渡すものだと思っていたので、最初に作ったのは`popen()`を使ったものでした。
ということで、メモとして残しておきますｗ

```c:pipe-version
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]) {
    if (argc < 4) {
        printf("Usage: %s <message> <title> <subtitle>\n", argv[0]);
        return 1;
    }

    char *message  = argv[1];
    char *title    = argv[2];
    char *subtitle = argv[3];

    char command[255];
    sprintf(command, "display notification \"%s\" with title \"%s\" subtitle \"%s\"", message, title, subtitle);

    FILE *fp;
    fp = popen("osascript", "w");
    if (fp == NULL) {
        perror("popen");
        return 1;
    }

    if (fputs(command, fp) < 0) {
        perror("fputs");
        pclose(fp);
        return 1;
    }

    pclose(fp);

    return 0;
}
```
Androidでボタン押して外部ブラウザ起動すると showStatusIcon on inactive InputConnection

タイトルの通りですが、単に指定したURLのページをブラウザで開くボタンを作ってぽちっと押すと以下のWarningが出たので対応した話。

```
W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection
```

同じページ内に置いているEditTextにフォーカスがあたっている状態でブラウザ起動するIntentを発行しているのが原因でした。

なので、適当なViewにfocusableInTouchModeを指定してあげてStartActivity前にフォーカスを違うViewに移動してあげると解決。

### こんな感じ

適当なViewをonCreateView時にタッチ可能にしとく

```java
mView.setFocusableInTouchMode(true);

```

Intentを発行するボタンのClickListenrの中でEditTextからフォーカスを外す

```java
        // 親Viewにフォーカスを移し、EditTextからフォーカスを外す
        // W/IInputConnectionWrapper﹕ showStatusIcon on inactive InputConnection 対策
        mView.requestFocus();

        Uri.Builder builder = new Uri.Builder()
                .scheme("http")
                .encodedAuthority("hogehoge.com");
        Intent intent = new Intent(Intent.ACTION_VIEW, builder.build());
        startActivity(intent);
```
【俺用メモ】pandocでmarkdownからredmineのwiki文法に変換するで引っかかったこと

# 起承転結
## 起
* OS X Mavericksで
* md -> textileをやりたかった

## 承
* ggる
* qiitaの以下の記事が出る

> [pandocでmarkdownからredmineのwiki文法に変換する](http://qiita.com/ryurock/items/cf7e6e251add75578d3d)

* やってみる

## 転

* ``cabal install cabal-install``でこける

```
Warning:
/var/folders/_l/l80jvc3x7sg6l5m10hv6hjfn_fd027/T/pkgConf-Cabal-1.22.212461.0:
Unrecognized field data-dir on line 68
/var/folders/_l/l80jvc3x7sg6l5m10hv6hjfn_fd027/T/pkgConf-Cabal-1.22.212461.0:
Unrecognized field key on line 4
Installed Cabal-1.22.2.0
cabal: Error: some packages failed to install:
HTTP-4000.2.19 depends on network-2.6.0.2 which failed to install.
cabal-install-1.22.2.0 depends on network-2.6.0.2 which failed to install.
network-2.6.0.2 failed during the building phase. The exception was:
ExitFailure 1
zlib-0.5.4.2 failed during the building phase. The exception was:
ExitFailure 1
```

## 結

* エラーメッセージでggる
* github issueが引っかかる

> [Cabal-install generates error when packages link to gmp #35203](https://github.com/Homebrew/homebrew/issues/35203)

> I've just had this issue too, which I fixed by installing the Xcode Command Line Tools, make sure the output of ``brew --config``, contains a version for the CLT and not N/A, you can install the CLT by running ``xcode-select --install``

* 内容を吟味もせずに言われるがままに実行
  * いい子は真似しちゃいけないよ

```
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```

* GUIでインストールするポップアップが出てくる
* インストールする旨を選択
* インストール完了後、再度``cabal install cabal-install``
* 無事インストール
* 改めて``cabal install pandoc``してpandocをインストールして終わり
* markdownの[orderd list表記](https://help.github.com/articles/markdown-basics/#ordered-lists)以外は概ね良好:)
RubyからSQLServerのストアドを呼び出す

##概要
Rubyを使用して簡単にSQLServerのストアドを呼び出す。
##やりたいこと
Rubyを使用してSQLServerのストアド(usp_read_m_user)を使用してユーザーマスタを参照する。

m_userのテーブル構造

| UserID | UserName |
|:-----------|------------:|
| 00000001     |      藤沼悟 |
| 00000002     |    雛月加代| 

##環境
* Windows 8.1 
* Ruby 2.1.5p273
* SQLServer 2008R2
* activerecord-sqlserver-adapter (3.2.12)
* tiny_tds (0.6.1 x86-mingw32)

1.ストアド

```tsql:ストアドプロシージャー
CREATE PROCEDURE [dbo].[usp_read_m_user]
@UserId nvarchar(10)
AS
BEGIN
	SELECT * FROM m_user
	WHERE UserID = @UserID;
END
```

2.GemFile

```ruby:GemFile
source "https://rubygems.org"

gem 'activerecord-sqlserver-adapter', '3.2.12'
gem 'tiny_tds', '0.6.1'
```

3.database.yml

```ruby:database.yml
development:
  adapter:  "sqlserver"
  host:     "ホスト名(端末名,IPアドレス等)"
  username: "ユーザー名"
  password: "パスワード"
  database: "データベース名"
```

4.コントローラー

```ruby:app.rb
# coding:utf-8
require 'activerecord-sqlserver-adapter'
require 'tiny_tds'

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(:development)
use ActiveRecord::ConnectionAdapters::ConnectionManagement

def readData
    rtns = ActiveRecord::Base.execute_procedure :usp_read_m_user, UserId: '00000002'
	rtns.each do |r|
		r.each{|key,value|
			puts key,value
		}
	end
end
```
####構文
**ActiveRecord::Base.execute_procedure :ストアド名, パラメータ1, パラメータ2, パラメータ3**
又は
**ActiveRecord::Base.execute_procedure :ストアド名, named: パラメータ**

5.実行結果

![名称未設定-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/29940/c51df1ec-84ce-5c4c-ae42-766db39cb4de.jpeg)

参考:[activerecord-sqlserver-adapter](https://github.com/rails-sqlserver/activerecord-sqlserver-adapter "activerecord-sqlserver-adapter")
文字列を式として評価する方法４種


他にもありそう。

```js
// type 1
eval('var a=10; alert(a + 7)');

// type 2
new Function('var a=10; alert(a + 7)')();

// type 3
var f = function(){}
f.constructor('var a=10; alert(a + 7)')();

// type 4
location='javascript:var a=10; alert(a + 7)';
```

new Functionは引数が取れたりして面白い。

```js

var str =  'return x + y';
var f = new Function('x', 'y', str);

f(10, 7); //->17
```
manifest.json でWebアプリを「ホーム画面に追加」自動バナー表示に対応させる


これも Service Worker Hackathon で聞いてきたネタ。
Android Chrome 42 から、Web サイトにて、 **アプリのインストールや「ホーム画面に追加」のためのバナーを自動表示できる** ようになっているらしい。

なお、Service Worker を使う = SSL サイトであることが必須となるので、SSL 化してない場合は、あきらめる。

# 前提

* Working Draft の仕様を前提に書いているので、今後実装方法などは変わるかもしれない。
* Android Chrome Beta (42.0.2311.68) で動作確認した。

# Service Worker を用意する

[参考記事で紹介されているようなカスタムオフラインページを実現する](https://github.com/GoogleChrome/samples/blob/gh-pages/service-worker/custom-offline-page/service-worker.js) サンプルでも良いし、Service Worker さえあれば良いので、空でもOK。

これを /sw.js で取得できるように配備。(取得時のパスが scope になるので、注意。)

# Service Worker の Register 処理を書く

Service Worker をインストールするページで以下が実行されるようにする。

```javascript:register_sw.js
window.addEventListener('load', function() {
  if ('serviceWorker' in navigator) {
    navigator.serviceWorker.register('/sw.js');
  }
});
```

# manifest.json を用意する

```start_url``` がホーム画面追加する際の URL となる。
```short_name``` と 144x144 のアイコンは必須らしい。参考記事参照。
```display``` は Web アプリを端末上で表示したときに、表示をどのように扱って欲しいかを指定するもので、 ```fullscreen```, ```standalone```, ```minimal-ui```, ```browser``` から選択する。これも参考記事を参照。

```json:manifest.json
{
  "lang": "ja",
  "name": "webapp name",
  "short_name": "webapp name",
  "icons": [{
        "src": "/app-icon.png",
        "sizes": "144x144",
        "type": "image/png"
      }],
  "start_url": "https://example.com/",
  "display": "standalone"
}
```

ちなみに、仕様には明記されていないが、 [Google I/O 2015 のサイト](https://events.google.com/io2015/) で配信されている manifest.json には以下のような記述があった。関連する Android アプリがある場合は、このように書けるのかもしれない。

```json
  "chrome_related_applications": [{
    "platform": "web"
  }, {
    "platform": "android",
    "location": "https://play.google.com/store/apps/details?id=com.google.samples.apps.iosched"
  }]
```

なお、Service Worker の Push Notification を使いたいときは、ここに GCM 関連のプロパティを書いたりする。

# HTML 側に manifest.json を読み込む設定をする

```link``` 要素を使う。

```html:index.html
<!doctype>
<html>
<head>
<link rel="manifest" href="manifest.json">
```

# 公開してみた結果

* 1回目のアクセスだと何も起こらない。(```chrome://inspect/#devices```でService Workerが入っていることは確認できる。)
* 端末の日付を1日進めてリロードしたところ、下からニュッとバナーが表示された！
![Kobito.4Gd1vX.png](https://qiita-image-store.s3.amazonaws.com/0/1329/c1f63af1-547b-42e1-ee05-431ea5bf79f5.png "Kobito.4Gd1vX.png")

# 参考

* [Manifest for a web application](https://w3c.github.io/manifest/) Living Document / W3C Working Draft 26 March 2015
* [Increasing engagement with Web App install banners](http://updates.html5rocks.com/2015/03/increasing-engagement-with-app-install-banners-in-chrome-for-android)
* [Push Notifications for the web](https://docs.google.com/presentation/d/12SlNQ4sOWdW-OS9SatodSiABlNxoprubWSfMXmQl55I/pub?start=false&amp;loop=false&amp;delayms=3000&amp;slide=id.g2bc30331f_2_0)
MacJapanese, CP932, Shift_JIS の違いと Ruby での取り扱い

# 前置き
　文字コードに混乱させられて酷い目にあったので、犠牲者を減らすため整理しました。３つの文字コードについての話題です。Shift_JIS (http://ja.wikipedia.org/wiki/Shift_JIS), MacJapanese (http://ja.wikipedia.org/wiki/MacJapanese), CP932 (http://ja.wikipedia.org/wiki/Microsoftコードページ932) の違いについてまとめます。また、それらを Ruby で扱う際の注意点について説明します。

# MacJapanese, CP932, Shift_JIS の違い
　上にあげた３つの文字コードは文字-バイト列の変換方式であり、文字-バイト列の対応表でもあります。いずれも同じ変換方式を使いますが、持っている対応表が異なります。この中では Shift_JIS の対応表が最も小さなものになります。MacJapanese, CP932 は Shift_JIS の対応表をそれぞれ独立に拡張したものです。たとえば文字 `あ` は Shift_JIS, MacJapanese, CP932 のどれでも `0x82A0` に対応します。しかし文字 `Ⅰ` (ローマ数字の1) は Shift_JIS には存在せず、MacJapanese では `0x859F` であり、 CP932 では `0x8754` に対応します。表にすると下のようになります。

|                  | Shift_JIS | MacJapanese |  CP932 |
|------------------|-----------|-------------|--------|
| あ               | 0x82A0    |      0x82A0 | 0x82A0 |
| ローマ数字の1 | 無し      |      0x859F | 0x8754 |

ローマ数字のⅠ,Ⅱ,Ⅲ... の他に囲み文字 ①,②,③... もそれぞれ異なるバイト列になります。

# MacJapanese が使われているアプリケーション
　ほとんど見かけないのですが、絶滅しているわけではありません。Microsoft Excel のファイル *.xls または *.xlsx を Mac 版 Office で CSV 出力すると MacJapanese になります。Windows 版 Office で同じ操作をすると CP932 の CSV ファイルが出力されます。非常にややこしいですね。また、Mac 標準のメーラーも MacJapanese を使っているようです。

# Ruby での取り扱い
　Ruby で Shift_JIS, CP932, MacJapanese のファイルを読み込むことを考えます。Shift_JIS や CP932 であれば、`File.read("hoge.txt", encoding: 'CP932')` のように引数で文字コードを指定すれば良いので問題ありません。

　ところが MacJapanese の場合は文字コードを指定してもエラーになります。なぜならば、Ruby は MacJapanese の変換表を持たないためです。たとえば `"あ".encode("MacJapanese")` を実行すると `Encoding::ConverterNotFoundError` が発生します。（そのスクリプト自体を MacJapanese で書けばエラーは起こらないかもしれません）

　最も良い方法は、MacJapanese で書かれたファイルを仕様から外すことです。与えられたファイルが Shift_JIS か MacJapanese か CP932 かを判断するのは困難ですし、ファイルを作成したユーザさえそのことを知らないのが普通です。MacJapanese が作られる状況は限定的ですので「Mac 版エクセルを使用しないでください」で事足りる場合も多いと思います。

　次善策として、全てのファイルを Shift_JIS として扱う方法があります。この方法は、ほとんどの文字に対して、期待した結果が得られます。もちろん、文書中に①などの文字が使われている場合、簡単にはいきません。たとえば `"①".encode("Shift_JIS")` は `Encoding::UndefinedConversionError` を発生させます。この例外を rescue して、無効な文字に置き換えるか、ユーザに訂正を促すなどの対処が必要です。ただこの場合は CP932 も引っかかってしまうので、傷口が広がってしまうかもしれません。
Galaxy端末系におけるSerializationException

```
I/Unity﹕ SerializationException: Field "Test" not found in class HogeFuga
```

Galaxy系端末でのみ上記のようにシリアライズのExceptionが発生したのでメモ

そもそもリフレクションとか使って色々あってInterfaceを実装したクラスをシリアライズしたかった。
そのため、パブリックなfieldではなくpropertyをシリアライズの対象とする必要があった。
その際、下記のようなコードだと端末によってExceptionが発生したのであった。。。

解決方法としては自動プロパティ使えよってことなんだけど、そもそもなんで自動プロパティ使わなかったかは・・・忘れたｗ(そもそもC#にまだ慣れてない)

他の解決方法としてDataContracやDataMember系のAttribute使うとイケそうなんだけどUnityとMonoのVersionの関係上これは使えそうになかった。
###ダメだったコード
```lang:C#
[System.Serializable()]
public class HogeFuga : IFuga
{
  private int test;
  public int Test { get {return this.test;} set {this.test = value;} }
}

public interface IFuga
{
  int Test { get; set; }
}
```

###問題なく動作したコード
```lang:C#
[System.Serializable()]
public class HogeFuga : IFuga
{
  public int Test { get; set; }
}

public interface IFuga
{
  int Test { get; set; }
}
```

###参考
- 同様の事例
  - http://answers.unity3d.com/questions/800413/best-way-to-persist-data-while-we-are-in-a-not-fin.html
- 自動プロパティのシリアライズ
  - http://www.ruche-home.net/%A4%DC%A4%E4%A4%AD%A4%B4%A4%C8/2011-05-28/%BC%AB%C6%B0%A5%D7%A5%ED%A5%D1%A5%C6%A5%A3%A4%CE%A5%B7%A5%EA%A5%A2%A5%E9%A5%A4%A5%BA%A1%CAC%A1%F4%203.0%A1%CB
- DataContract系記事
  - https://msdn.microsoft.com/en-us/library/ms731138(v=vs.110).aspx
- DataContractリファレンス
  - http://www.nudoq.org/#!/Packages/Unity.Interception.Serialization/Unity.Interception.Serialization/Unity.InterceptionExtension.Serialization.DataContract
- DataCotractor
  - http://answers.unity3d.com/questions/925359/datacontract-serialization-not-compatible-with-uni.html
windowsPC タスクバーが太くなっているのを直したい


# タスクバーが太くなっているのを直したい
タスクバーを私は横に設置しているのですが、
気が付くと太くなっていて(何故でしょう‥)、とても邪魔です。

## 以下元の太さに戻す方法
1.タスクバーの何もないところで右クリック
2.「タスクバーを固定する」でチェックが入っていたら外す
3.タスクバーの端の境界線あたりにマウスを持っていくと、
　「←→」マウスポインタがこんな感じになっていると思います。
4．その状態のまま、左クリック（押したまま）したまま自分がしたいタスクバーの太さにする。
5.その後、「タスクバーを固定する」をチェック入れる。
でおｋ。
AWS CLIでS3バケットを同期

AWS CLIを使ってS3のあるバケットから別のバケットへファイルをsyncする
`aws s3 sync s3://sync元バケット s3://sync先バケット --dryrun`
dryrunオプションで実行内容を確認し、
`aws s3 sync s3://sync元バケット s3://sync先バケット`
で実行。
約8万ファイルを約20分でsync完了。

参考URL：http://docs.aws.amazon.com/cli/latest/reference/s3/index.html
pbxplorer: XcodeのProjectファイルを読み込むRubyライブラリ

はじめに
=======

Xcodeのビルド設定などは、 `project.pbxproj` というファイルに書かれています。
ビルドの設定は主にGUIで行いますが、うっかりGUIの操作ミス（マウスを意図せずクリックしたとか）によって設定値が変わってしまってビルドがおかしくなることが、稀にあります。

他にも外部のチェックスクリプトと連携させたいときとかに、Xcodeのビルド設定を見たい時があります。

そのようなときに使える Rubyのライブラリが `pbxplorer` です。

使い方
======

Install
-----

```
gem install pbxplorer
```

こんな感じ
---------

```
irb(main):001:0> require 'pbxplorer'
irb(main):002:0> pf = XCProjectFile.new 'SimpleDemo.xcodeproj/project.pbxproj'
...
irb(main):003:0> pj = pf.project
...
irb(main):004:0> pj.targets[0].build_phases[0].build_files.map{|x| x.file_ref.to_h['path']}
=> ["ViewController.m", "AppDelegate.m", "main.m"]
```

さいごに
========

めったに使うことはないでしょうが、、、
いざとなったら重宝します。
MAMPでmysqlがうまく使えない時の対処法

#対処法

デフォルトだと元々入っているmysqlを使用してしまう。/tmp/mysql.sockを使おうとする。
そのため、MAMPのmysqlを使うときはシンボリックリンクを貼ってMAMPのmysql.sockを使うようにする。

```
$ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock
```

これで

```
$mysql -u (ユーザ名) -p
```
でmysqlにアクセス出来る。


#シンボリックリンクを貼りたくないなら…
上記対処が一番良いと思いますが（現状）、シンボリックリンクを使わずに以前はmysqlを使用していたのでその時の方法も念のため、記載しておきます。

MAMPのコマンド群は以下のディレクトリに格納されている
/Applications/MAMP/Library/bin/

ゆえに

```
$cd /Applications/MAMP/Library/bin/
```

後

```
$ ./mysql -u (ユーザ名) -p
```
これでmysqlにアクセス出来る


＊＊＊＊＊
実用面を考えて、
~/.zprofileに(~/.bash_profile等でも)
alias mysqlroot='/Applications/MAMP/Library/bin'
のエイリアスを作った

こうすると、

```
$mysqlroot -u (ユーザ名) -p
```
で

```
$mysql -u  (ユーザ名) -p
```
と同じ感覚で利用出来ます。

#追記

元々シンボリックリンクを貼らなくてもそう困ることはなかったのですが、railsでmysqlを選択するときにシンボリックリンクを貼ることであっさり繋げたので、はじめからシンボリックリンクを貼っておくのが楽だったと思いました。
Androidで DebugやReleaseビルドでWebAPI接続先などの環境設定を変える方法


はじめに
=======

gradle の Android Pluginには色々便利な機能があります。
「ビルドバリアント」を使ってソースセット(java, res, assets)などを切り替えるのは特に使いどころがあると思うので共有します。

Version
--------

* Android Studio 1.1.0
* Gradle Android Plugin 1.1.0


ビルドバリアント
==========

ビルドバリアントは andoird pluginの機能で、詳細はここにあります。
http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Build-Variants

そして、Android Studioもサポートしていて、GUIでどのビルドバリアントを編集するかをスイッチすることができるのがかなり画期的です。

そして このQiitaの記事
[Android Studio で Build Variants](http://qiita.com/kojionilk/items/0b34ad03497dae1093ff)
がとてもよくまとめられていて、もう特に書くことないですね。。。

DebugやReleaseビルドでWebAPI接続先などの環境設定を変える
-----------------

一応続きを書きます。

つまり、

* `src/main/{java,res,assets}/...`: に通常の共通のソースコードやリソースを置く
* `src/debug/{java,res,assets}/...`: に Debugビルドのソースコードやリソースを置く
* `src/release/{java,res,assets}/...`: に Releaseビルドのソースコードやリソースを置く

ということができるので、

`src/{debug,release}/java/com/example/BuildTypeConfig.java` などに

```java:BuildTypeConfig.java

public class BuildTypeConfig {
    public static final boolean DEBUG = true; // or false
    public static final String API_HOST = "debug.example.com"; // or release.example.com
}
```

などとしておくだけで、切り替えることができます。
GoogleMapのKeyやGoogleAnalyticsのIDなどもこうしておくと便利ですね。

さいごに
========
毎回手作業やJenkinsなどで動的に書き換えるよりも安全なので、是非活用したいところです。
cocos2d-x の Node系オブジェクトに resume() という名前の関数を定義するとEventListenerなどが動作しなくなる


タイトルの通りです。以下の様にresume()という関数を定義します。

```
class GameScene : public Layer
{
public:
	void resume();
}

void GameScene::resume()
{
    // resume って名前の関数はデフォルトのNodeに定義されているので、それをブロックするとおかしくなる
	CCLOG("どっかから呼ばれてくる。 BreakPoint指定するとよくわかる");
}
```

すると、本来であれば `CCNode.cpp` で定義されている `Node::resume()` で行われるはずの処理が行われず、EventListenerなどが動作しなくなります。

## まとめ

* 継承したクラスに関数を追加するときは、オーバーライドしちゃってないか気をつけよう
* overrideキーワードなどで明示的にオーバーライドしていることを示さないとコンパイルエラー出る言語が増えてきたので未来はきっと明るい
Specs2でインメモリDBを用いたテストを行う場合につまづいたこと(slickを利用)



In Memory DBを用いてDBを利用した際に困ったことをメモ。
BeforeExample, AfterExampleを使って、事前処理にテストデータの作成を、事後処理にテストデータの破棄を行おうとしました。例えば

```scala

  def before = new WithApplication(FakeApplication(additionalConfiguration = inMemoryDatabase(options=Map("MODE" -> "MySQL")))){
    
    DB withSession{implicit session =>
      slickDataHandler.insert(data)
    }
  }
  
  def after = new WithApplication(FakeApplication(additionalConfiguration = inMemoryDatabase(options=Map("MODE" -> "MySQL")))){
    
    DB withSession{implicit session =>
      slickDataHandler.filter(_.id === data.id).delete
    }
  }
  
```

のような感じ。この時、beforeを出るとデータがなくなっていることがわかり、そもそもテストデータを事前処理で入れるということが出来なかった。何かいい手が無いか探り中。


---
[追記]
https://www.playframework.com/documentation/2.1.0/ScalaTest
に書かれている下記コードのような感じでいけるのかも。試してみる。

```scala
abstract class WithDbData extends WithApplication {
  override def around[T](t: => T)(implicit evidence: (T) => Result) = super.around {
    prepareDbWithData() 
    t
  }
}

"Computer model" should {

  "be retrieved by id" in new WithDbData {
       // your test code
  }
  "be retrieved by email" in new WithDbData {
       // your test code
  }
}
```
sassでz-indexをまとめて管理しておく＆配列順に番号をつけてくれる関数


`z-index`を使っていると、この要素ってどのぐらいの値なんだっけ・・。と迷うことがあったり
とりあえず`99999`とか大きい数字つけとくかなーみたいな考えになったりしちゃう時がありますね＾＾；

そんなことにならないように1つのところでz-indexを管理して、見やすくなるような関数を作ってみました。

http://codepen.io/kame/pen/ogRWbm

## sass

	$z-index: (
  		test2
  		test1
  		test3
	);

	@function z-index($name, $list: $z-index) {
		@return abs(index($list, $name) - length($list) - 1);
	}


	@each $name in $z-index {
		#{'.' + $name} {
			z-index: z-index($name);
		}
	};

## 出力css
	.test1 {
		z-index: 2; 
	}
	.test2 {
		z-index: 3; 
	}
	.test3 {
		z-index: 1; 
	}

`$z-index`に追加したり配列の順番をかえたりすると、
配列通りに上から並んでくれるので、分かりやすいかなぁと思います。
MeteorのTutorialを試してみる（２

https://www.meteor.com/try/4

[前回](http://qiita.com/kazusa-qooq/items/6298513c59556e64e8a2)に引き続き、MeteorのTutorialに挑戦していきます。
今回はタスク入力フォームの作成までです。

#Adding tasks with a form
前回は直接DBに書き込みましたが、ユーザがタスクを追加できるようUIにフォームを追加しましょう。
Bodyタグ内のheaderを次のように変更します。

``` simple-todos.html
・・・
    <header>
      <h1>Todo List</h1>
        <form class="new-task">
          <input type="text" name="text" placeholder="Type to add new tasks" />
        </form>
    </header>
・・・
```

そうすると画面が次のようになります。
![image](https://qiita-image-store.s3.amazonaws.com/0/71988/81649dc9-0b55-6be9-3d72-6c8b94fcdd14.png)

この例ではinputに文字列を打ち込みエンターを押すとsubmitが発生します。submitを受け取り、DBを更新しましょう。
simple-todos.jsのTemplate.body.helpersセクションの後に次のコードを記述します。

``` simple-todos.js
・・・
  Template.body.events({
    "submit .new-task": function (event) {
      // This function is called when the new task form is submitted
  
      var text = event.target.text.value;
  
      Tasks.insert({
        text: text,
        createdAt: new Date() // current time
      });
  
      // Clear form
      event.target.text.value = "";
  
      // Prevent default form submit
      return false;
    }
  });
・・・
```
とりあえず動作を確認しましょう。適当に入力して反映されることを確認してください。また画面を２つ開くと同期されていることがわかると思います。

##Attaching events to templates
ではコードの解説に移りましょう。
ヘルパーと同じような感じで`Template.body.events()`を使ってイベントリスナーも定義することができます。今回の例では.new-taskクラスをもつフォームからのsubmitイベントに対してリスナーを定義しています。
リスナーは引数としてeventを取得できます。
入力フォームはevent.targetで取得でき、そのinputはevent.target.textで取得できます。

##Inserting into a collection
DBへの値の登録はTasks.insert()で行います。この際、現在日時をフィールドとして追加しています。このように、好きにフィールドを追加することができます。
しかし、クライアントサイドから好きにデータを書き込めるのはセキュリティ上よくありません。今はこのままにしておきますが、後の章で制限を設けます。

##Sorting our tasks
現在、タスクリストが登録順に並んでいますが、新しいものが先にくるようソーティングを見直します。
そのためにヘルパのfindにソーティングオプションを追加します。

``` simple-todo.js
・・・
return Tasks.find({}, {sort: {createdAt: -1}});
・・・
```

切りがいいので一端きります。
このあたりでCloud9のワークスペースがメモリ不足になりました。ローカルでやったほうがいいかもしれませんね・・・
[次回](http://qiita.com/kazusa-qooq/items/76db65223b61348f35e6)