OmniAICreator/Qiita-1.07M huggingface dataset:
Nexus5 Android5.0 preview(LPX13D)のroot化手順

0. はじめに
---

Root化はリスクを認識した上で行ってください. 
本稿が原因で発生するあらゆる損害に対しても責任は負いません. 
全て自己責任でお願いします. 

 - メーカ保証対象外と成る
 - 端末データが初期化される
 - 端末が起動しなくなる

Root化にあたっては Nexus5 と Android5.0 preview(LPX13D) で確認しています. 
Nexus7ではありません.


1. 用意するもの
---

**Android SDK Tools(adb, fastboot)**
開発で使う"いつもの"です. 詳細は省略. fastbootを使うのにAndroidSDKに環境変数`PATH`を通しておきます. 

**ブートイメージ - LPX13D**
[nexus5-hammerhead-lpx13d-kernel.zip](http://download.chainfire.eu/580/SuperSU/nexus5-hammerhead-lpx13d-kernel.zip)

**SuperSU.zip**
[UPDATE-SuperSU-v2.14.zip](http://download.chainfire.eu/578/SuperSU/UPDATE-SuperSU-v2.14.zip)

**ClockworkModリカバリ**
[Google Nexus 5 Download Touch Recovery 6.0.4.5](http://download2.clockworkmod.com/recoveries/recovery-clockwork-touch-6.0.4.5-hammerhead.img)

2. Root化
---

### Step1. SuperSU.zipを端末にコピー

パスは実行する環境に合わせて読み替えてください. 
push先のパスは後ほど指定する必要があるので覚えておいてください. 
USBは作業が終わるまで接続し続けてください.

```bash
adb push UPDATE-SuperSU-v2.14.zip /mnt/sdcard/
```

### Step2. ブートローダのアンロック

```bash
adb reboot bootloader

# 端末再起動されるのでブートローダ起動されたら次を実行. 
# 端末データは初期化されます. これ以降メーカ保証対象外となります. 
fastboot oem unlock
```

アンロックの再確認があれば"YES"でブートローダアンロックしてください. 


### Step3. リカバリイメージを書き換える

今回はリカバリイメージをflashしません(問題なければflash). 
端末再起動後に再度CWMリカバリモードを起動するにはコマンドを再発行してください. 

```bash
fastboot boot "recovery-clockwork-touch-6.0.4.5-hammerhead.img"
```


### Step4. SuperSUを導入

Clockworkmodが起動したらadb pushしておいたSuperSU.zipをインストールします. 
Clockworkmod画面でパスを辿ってインストールします. 

```bash
# 下記は例. adb pushした場所まで移動しインストールします. 
install zip > choose zip from /sdcard > /0 > UPDATE-SuperSU-v2.14.zip
```

インストールの確認があるので"YES"を選択します. 

SuperSUのインストールが完了した後は, [GO BACK]を選択してブートローダ画面まで戻ります. 


### Step5. ブートイメージを導入

ブートイメージ - LPX13D(nexus5-hammerhead-lpx13d-kernel.zip)に含まれるboot.imgを導入します. 
こちらもflashはしていません. 

```bash
fastboot boot boot.img
```

これで再起動がかかり, root化は一通り完了です. 再起動がかからないようであれば `fastboot reboot`.


### Step6. flash

root化して一通り問題ないことが確認できたら各種イメージの類いをflash(ROM書き込み)しておきます. 

```
# リカバリイメージをflash
fastboot flash recovery "recovery-clockwork-touch-6.0.4.5-hammerhead.img"

# bootイメージをflash
fastboot flash boot boot.img
```

以上です.
ファイルへのユニークな追記

とあるプログラムのインストールスクリプトを作っていて、何度も実行してテストしてたんだけどそのたびに.bashrcに設定が追記されて面倒だったので
書きたい文言が既に書かれてたら書かない、書いてなかったら書く　みたいな関数を作った。

##中身
grepして何も帰ってこなかったら書いてないとみて追記するだけ。
引数足りなかったらおわる。
ファイルなかったら書いておわる。

```shellscript:uniqadd()
function uniqadd() {
    if [ $# != '2' ] ;then
        echo "usage: uniqadd() need 2 args..."
        echo "usage: $ uniqadd filename add_article"
        return 0
    fi

    local dst=$1
    local article=$2

	if [ -e "${dst}" ] ;then
		echo ${article} > ${dst}
		return 0
	fi

    local written=`grep ${article} ${dst}`

    if [ "$written" = "" ] ;then
        echo ${article} >> ${dst}
    fi
}
```

##使い方
```
$ cat hoge.txt
hoge

$ uniqadd hoge.txt hoge
$ cat hoge.txt
hoge

$ uniqadd hoge.txt hogefuga
$ cat hoge.txt
hoge
hogefuga

```

##だけども
grepして書いてるか確認するとこは使ったけど、この関数は結局使わなかった。
オブジェクト指向その②


## <オブジェクトの種類>

javaScriptでは、さまざまなオブジェクトを利用出来ますが、大きく以下の様に分別できるようです。

①すべての環境で利用出来る物
・関数や制御構文等の基本性能
・組み込みオブジェクト、、、とは「JavaScriptにあらかじめ組み込まれた標準的なオブジェクトの事で、JavaScriptを動かす環境に関わらず、共通して利用出来るオブジェクト」です。



|オブジェクト | 意味 |
|:-----------:|:------------:|
| (Grobal)       | JavaScriptの基本性能 |
| Array        | 配列の操作 |
| String     | 文字列の操作 |
| Number      | 数値の操作 |
| Math         | 数値演算の実行 | 
| Date       | 日付の操作 |
| RegExp      | 正規表現に関する機能 |
| Object       | 全オブジェクトのひな形となる機能 |
| Error       | エラー情報の管理 |
| Function       | 関数の操作 |
| Boolean       | 真偽値の操作 |

とこれだけ有る様ですが、これ以上詳しい事については今の私には理解出来なかった為、いつか分かる日を夢見て先に進みます。

②特定の環境でのみ利用できるもの

|オブジェクト | 概要 |
|:-----------:|:------------:|
| ブラウザオブジェクト       | ブラウザの機能を扱うオブジェクト |
| Ajaxオブジェクト | -------------------- |
| DOMオブジェクト | DOMツリー階層における「ノード」というオブジェクト |

と３つ有る様です。「Ajaxオブジェクト」は今は全く分かりません。いつか分かる様になりたいです。

気を取り直して、、、「ブラウザオブジェクト」やります。


## <ブラウザオブジェクト>

ブラウザオブジェクトとは、ブラウザ操作のための機能を集めたオブジェクト達の「総称」です。

ざっと上げると以下↓

![キータ005.png](https://qiita-image-store.s3.amazonaws.com/0/35975/948ee34f-995b-e6ef-3c62-90a0b3e34480.png "キータ005.png")


と「Windowオブジェクト」を頂点に、これだけのオブジェクトがあります。

全部のオブジェクトと向き合ってると気持ちが折れそうなので、赤枠でかこったのだけ勉強したいと思います。

## windowオブジェクト

windowオブジェクトは「ウィンドウ操作の為の機能」の他、「ダイヤログ表示」や「タイマー設定」などの機能を主に提供している様です。

以下メソッドです。

### alertメソッド
概要　 : 
使い方 : `window.alert('おはよう、忠吉さん！');`
結果　 :　[http://m-uehara.com/js_001/](http://m-uehara.com/js_001/ "出来上がり")

ちなみに、「OK」ボタンがクリックされるまで、それ以降のスクリプトの実行は待っていてくれるそうです。

### confirmメソッド
概要 : 「OK」と「キャンセル」ボタンが用意されたダイアログボックスです。
使い方 : そのまま、`window.confirm("行ってきまーす");`と書いただけだと「ボタンを押しておしまい」です。→　[http://m-uehara.com/js_002/test2.html](http://m-uehara.com/js_002/test2.html "出来上がり")

なので以下の様に使ったりするのが現実的でしょうか、、、。

```js

if (window.confirm('晴れてると良いですか？')) {
  window.alert('はい！いい気分です');
} else {
  window.alert('でも、、新しい傘を買ってもらったので雨もいいかも、、');
}


```
結果 : [http://m-uehara.com/js_002/](http://m-uehara.com/js_002/ "出来上がり")
ちなみにブラウザによって、ダイヤログボックスに追加のメッセージが出る事も有ります。

### setIntervalメソッド

概要 : 一定時間ごとに決められた処理を実行する。
以下、書き方と例文です。

```text

window.setInterval(function() {
  一定時間おきに実行する処理
}, 時間間隔);

```

結果 : [http://m-uehara.com/js_002/test3.html](http://m-uehara.com/js_002/test3.html "出来上がり")

というか、、、あと残りの「メソッド」、「オブジェクト」ついて以前まとめていました。

こちらと合わせれば大丈夫かも、、、[http://qiita.com/tsukishimaao/items/39d22fd9178546d6cdeb](http://qiita.com/tsukishimaao/items/39d22fd9178546d6cdeb "出来上がり")
[iOS] Get Date From Formatted String Or Make a Formatted Date String

If you have a string like `2014-10-22 00:54:00`. You can convert the string to the `NSDate`.

```swift
var dateFormater = NSDateFormatter()
dateFormater.dateFormat = "yyyy-MM-dd HH:mm:ss"
var startTime = dateFormater.dateFromString("2014-10-22 00:54:00")
``` 

If you have a `NSDate`, you also can use the `NSDateFormatter` to generate a formatted string.

```swift
let dateFormater = NSDateFormatter()
dateFormater.dateFormat = "yyyy-MM-dd HH:mm:ss";
let dateString = dateFormater.stringFromDate(today)
```
nMQTT: Subscribeできない


- [nmqtt](https://github.com/markallanson/nmqtt) をさわってみた
- プロトコルレベル = 3 でちょっと古いようです


# MqttConnectMessage

~~~
10-11-00-06-4D-51-49-73-64-70-03-02-00-1E-00-03-61-6E-79
~~~

- 10: 0x10 == CONNECT
- 11: 17バイトのメッセージ
- 00-06 : 6バイトの Protocol Name が続く([UTF-8 encoding string長](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos02/mqtt-v3.1.1-cos02.html#_Toc398718016))
- 4D-51-49-73-64-70 : 

~~~
    >>> binascii.unhexlify('4D-51-49-73-64-70'.replace('-',''))
    'MQIsdp
~~~

- 03: MQIsdp なので、 Protocol Level = 3
- 02: Clean Session(0x02)だけが Connect Flagsに設定されている
- 00-1E: Keep Alive = 30秒
- 00-03: Payload サイズ = 3バイト (UTF-8 encoding string 長)
- 61-6E-79: Payload はClientId(=any)だけ指定されている(明示的に指定した)

~~~
    >>> binascii.unhexlify('61-6E-79'.replace('-',''))
    'any'
~~~    

問題ないような気が。

# MqttSubscribeMessage

~~~
80-14-00-01-00-0F-6D-79-2F-74-6F-70-69-63-2F-73-74-72-69-6E-67-00
~~~

- 80: 0x80 == SUBSCRIBE
- 14: 20バイトのメッセージ
- 00-01: パケット識別子
- 00-0F: [UTF-8 encoding string長](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos02/mqtt-v3.1.1-cos02.html#_Toc398718016)
- 0F-6D-79-2F-74-6F-70-69-63-2F-73-74-72-69-6E-67: トピック(my/topic/string)
- 00 : Topic QoS バイト

~~~
>>> binascii.unhexlify('6D-79-2F-74-6F-70-69-63-2F-73-74-72-69-6E-67'.replace('-',''))
'my/topic/string'
~~~

コントロールパケットタイプが 0x82 じゃなければいけないような(0x02はControl Packet Type Flag)

# Control Packet Type Flag

[2.2.2. Flags](http://docs.oasis-open.org/mqtt/mqtt/v3.1.1/cos02/mqtt-v3.1.1-cos02.html#_Toc398718022) を参考にとりあえず、Flagを追加してみた。

Nmqtt.MqttHeader:

~~~csharp:MqttHeader.cs

		static byte[] ControlPacketFlag = new byte[16]{
			0,0,0,0,0,0,2,0,2,0,2,0,0,0,0,0
		};
			
        /// <summary>
        ///     Gets the value of the Mqtt header as a byte array
        /// </summary>
        private List<byte> HeaderBytes {
            get {
                var headerBytes = new List<byte>();

                // build the bytes that make up the header. The first byte is a combination of message type, dup,
                // qos and retain, and the follow bytes (up to 4 of them) are the size of the payload + variable header.
                headerBytes.Add(
                    (byte)
					((((int) MessageType) << 4) 
						+ ControlPacketFlag [(int)MessageType]			// ADD by HDKNR
						+ ((Duplicate ? 1 : 0) << 3) + (((int) Qos) << 1) + (Retain ? 1 : 0)));
                headerBytes.AddRange(GetRemainingLengthBytes());
                return headerBytes;
            }
        }
~~~        

- これでrabbitmq-mqttに接続後、PythonのPahoのパブリッシャーからメッセージもらえた
- フォークしてプロトコルレベル4で動作確認必要
[Git] About Rebase

#### git pull --rebase

This command will get rebase the remote branch with the local branch.

*Before*

```
        D --- E  local branch
       /
A --- B --- C  origin branch
```
*After*

```
              D --- E  local branch
             /
A --- B --- C  origin branch
```

#### git rebase --onto master server client

This will "Check out the client branch, figure out the patches from the common ancestor of the client and server branches, and then replay them onto master." (From [here](http://git-scm.com/book/ch3-6.html)). That is to say:

The parts H, I, J will be picked up and add to the master branch.
Why pick up the H, I, J? Because the client and server have the same ancestor D, "from the common ancestor" that is to say from D.

*Before*

```
A --- B --- C  master 
       \
        D --- E --- F  server
         \
          H --- I --- J  client
```

*After*

```
              H --- I --- J  client
             /
A --- B --- C   master 
       \
        D --- E --- F  server
```
Open a Facebook page from the ios application



This url can't open the Facebook page always from the ios application.
`http://facebook.com/:username`

If the native Facebook app is installed, it doesn't open the page of `:username`. it just opens Facebook app.

Solution is below.
`fb://profile/:facebookid`

This url can open the Facebook page you want. Even if the native Facebook app is installed.

Note that it requires `facebookid`, not `username`.
You can check the `id` to open this url with your browser.
`graph.facebook.com/:username`
茨城県と栃木県のデータがおかしいときに確かめること


都道府県別のデータを扱う機会ってありますよね．
私もとあるサービスの都道府県別データを解析しておりました．

```
 $ wc -l location_data/location-*.csv | sort | head
       0 location_data/location-8.csv
       0 location_data/location-9.csv
      12 location_data/location-38.csv
      14 location_data/location-36.csv
      20 location_data/location-31.csv
      26 location_data/location-32.csv
      29 location_data/location-16.csv
      33 location_data/location-18.csv
      48 location_data/location-39.csv
      52 location_data/location-35.csv
```

あれ，8と9がおかしい．いくらなんでもゼロってことはないだろう...
ちなみに8と9というのは茨城県と栃木県の都道府県コード（JIS規格）です．

![](http://i.gyazo.com/fe31626fa455fca56eb74ab262619c55.png)

http://www.kenchikushikai.or.jp/touroku/documents/code-todoufuken.pdf

なにかがおかしいなぁ．

# parseInt("08") と parseInt("09") は "0" になる！！！！

いろいろ調べてたらたどり着きました．

[javascript parseInt() 08 09 ではまる。](http://exposed.egoism.jp/wordpress/?p=309)



嘘だろと思って，近くにあった mongo shell でたしかめました．

```
> parseInt("09")
0
> parseInt("08")
0
> parseInt("07")
7
```

本当でした．

```
> parseInt("09", 10)
9
> parseInt("08", 10)
8
> parseInt("07", 10)
7
```

第二引数で10進数だよ〜と指定すればよいそうです．幸いDBには "08", "09" 形式で格納されていたので大事に至らなそうです．

これがDBに格納するときに "0" になっていたらガクブルです．

茨城県と栃木県のデータがおかしいときは，parseInt を思い出しましょう．
そして，テストデータには茨城県と栃木県を含めましょう．
一人ハッカソンをやった


Facebookグループのスレッドが流れるとスレッド探すの大変！という意見を聞き、Ionic Frameworkの練習がてらアプリを作った。

[MyThreadBookmark-for-Facebook](https://github.com/sakamaki/MyThreadBookmark-for-Facebook)

使い方はGitHub参照
本当は鯖立てて公開したいのだが、Facebookのアプリ登録があまりにも面倒なので、辞めた。尽き果てた。

あと、一人でハッカソンしても、Qiitaにしか結果発表するところがなくて、とても虚しいことがわかったｗ
次はみんなとワイワイしながらやろうと思う。

## ハマった点
Facebookのgraph apiの以下のデータを取得するのに時間がかかった。
ドキュメントと睨めっこしながら、ひたすらGraph API Explorerでトライ・アンド・エラーを繰り返す。
結局は以下の情報を取得しただけである。
・Facebookグループ一覧
・Facebookグループのスレッド一覧

あとは、CodePenのionicのギャラリーを参考にひたすらコーディング
[CodePen:ionic](http://codepen.io/ionic/popular-list/)

ああ、それとアプリのモックアップ作成にはpopを使いました。
紙とペンとiPhoneさえあれば簡単にペーパープロトタイピングができます。
[pop](https://popapp.in)
ActionBarの背景と文字を変更してみよう！


よくあるこんな感じのActionbarの背景を変更してみます。
![スクリーンショット 2014-10-21 13.43.48.png](https://qiita-image-store.s3.amazonaws.com/0/11200/f02943d5-330c-89a9-60fc-c188c15ca24a.png "スクリーンショット 2014-10-21 13.43.48.png")


<h1>必要なもの</h1>
・colors.xml
色情報を格納するためのXMLファイルです。
格納する場所はres/valuesに入れます。
valuesの中には他にdimens.xmlやstrings.xmlといったファイルが入ってると思います。


```XML:colors.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="start_color">#e56200</color>
    <color name="end_color">#FFE1CC</color>
</resources>
```

・gradation.xml
Actionbarに使う背景色です。
drawableのフォルダの中に格納します。

```XML:gradation.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:angle="90"
        android:startColor="@color/start_color"
        android:endColor="@color/end_color"
        android:type="linear"
    />
</shape>
```

色はこんな感じです。

![スクリーンショット 2014-10-21 14.37.04.png](https://qiita-image-store.s3.amazonaws.com/0/11200/b48a6490-00bf-2c2b-b779-1e9ebf22f129.png "スクリーンショット 2014-10-21 14.37.04.png")

・styles.xml
アプリのデザイン(スタイル)を決めるXMLファイル。
一言で言えばCSSみたいなものです。

```XML:styles.xml
<resources>
    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="android:actionBarStyle">@style/ActionBarStyle</item>
    </style>

    <style name="ActionBarStyle" parent="android:Widget.Holo.ActionBar.Solid">
        <item name="android:titleTextStyle">@style/ActionBarTitleStyle</item>
        <item name="android:subtitleTextStyle">@style/ActionBarSubitleStyle</item>
        <item name="android:background">@drawable/gradation</item>
        <item name="android:backgroundStacked">@android:color/white</item>
    </style>

    <style name="ActionBarTitleStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Title">
        <item name="android:textStyle">bold|italic</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

    <style name="ActionBarSubitleStyle" parent="@android:style/TextAppearance.Holo.Widget.ActionBar.Subtitle">
        <item name="android:typeface">monospace</item>
        <item name="android:textColor">@android:color/white</item>
    </style>

</resources>
```

![スクリーンショット 2014-10-21 14.50.26.png](https://qiita-image-store.s3.amazonaws.com/0/11200/99b29d8c-a05d-abb9-84ec-92049b8ef183.png "スクリーンショット 2014-10-21 14.50.26.png")


うまく適用できました！٩('ω' )و
渡る世間(?)はバグばかり OwnerDraw

時がいくら流れようとも過去を無かったことには出来ず、色んな情報と共に間違いが累積されて行く。
Qiitaは間違いを指摘してうｐでとしていくのが利点として挙げられていた気がするので、インターネットにあるサンプルコードの間違いや負の遺産を少しずつ載せたいと思う。
今時MFCの需要がどんだけなのか良く分からないけど、遺産はいくらでもあるので、間違いを指摘したい。
Win32も永いので、その変遷によって動かなくなったのかも知れないが、それも指摘する。
###オーナードローコントロール
オーナードローで使うサブクラス化コードは以下のようになっていることが多いが間違いである。

```cpp
void CMyButton::PreSubclassWindow() 
{
    ModifyStyle( 0, BS_OWNERDRAW );
    CButton::PreSubclassWindow();
} 
```

ボタンスタイルの下位4ビットは数値扱いで上位28ビットばビットマスク扱いという変なことになっている。
ModifyStyleはビットマスク用なので、最初からビットが立ってるとORで追加されてしまう。
なお、ボタンでは4ビットなだけで、他のコントロールは5ビットだったりするのでチェックする必要がある。

```cpp
//WinUser.h
#define BS_PUSHBUTTON       0x00000000L
#define BS_DEFPUSHBUTTON    0x00000001L
#define BS_CHECKBOX         0x00000002L
#define BS_AUTOCHECKBOX     0x00000003L
#define BS_RADIOBUTTON      0x00000004L
#define BS_3STATE           0x00000005L
#define BS_AUTO3STATE       0x00000006L
#define BS_GROUPBOX         0x00000007L
#define BS_USERBUTTON       0x00000008L
#define BS_AUTORADIOBUTTON  0x00000009L
#define BS_PUSHBOX          0x0000000AL
#define BS_OWNERDRAW        0x0000000BL
#define BS_TYPEMASK         0x0000000FL
```
なのでラジオボタンなど0x04を含むボタンでは先にあげたコードではオーナードローに成らない可能性がある(偶然0x0Bになれば動作はする)。正しくは以下のようにModifyStyleの第1引数で落とすフラグを指定してオーナードローに書き換えなければならない。

```cpp
void CMyButton::PreSubclassWindow() 
{
    DWORD dwStyle = GetStyle();
    ModifyStyle( dwStyle&BS_TYPEMASK, BS_OWNERDRAW );
    CButton::PreSubclassWindow();
} 
```

通常のボタン以外でオーナードローしようとする奴なんて殆ど居ないだろうけど間違いは間違いである。

###今日のバグ
ここは頭痛が痛いコード紹介所である。本編とはあまり関係ない。
うろ覚えなものを再現しているのでコンパイル出来なくても一笑に付して欲しい。なおコメントも再現している。

```cpp
//カスタムCListCtrlの内部で
DWORD dwStyle = GetExtendedStyle();
dwStyle |= LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT | LVS_SHOWSELALWAYS;
// 自動選択されるバグ対策
if( dwStyle&LVS_EX_TRACKSELECT ) {
    dwStyle &= ~LVS_EX_TRACKSELECT;
}
SetExtendedStyle( dwStyle );
```

3つ間違いがある。
拡張スタイルに通常スタイルをぶち込んだことと、それを打ち消して直したつもりになったことである。
LVS_SHOWSELALWAYSとLVS_EX_TRACKSELECTは同じ数値と言うオチに気付いていない。
更に修正でSHOWSELALWAYSが反映されないバグをそのままにしている辺りが痛い。

これはまだ微笑ましいバグであった。これを書いた人間はメモリ破壊や例外や到達不能コードやモジュール結合度高すぎコードやメモリリークや確率的動作やバグコピペや超非効率コードやありとあらゆるバグを量産しながら試験もろくにしないで地獄を地上に具現化させた実力の持ち主であった。
俺はバグが4重、5重を超えた辺りから頭痛が酷くなった。

*バグでバグを上書きして追加していくのは絶対にやめよう（提案）*
Ruby で日本国内の株価のデータを取得する

株価は企業の業績を示す定量的な指標として最もポピュラーなものと言えるでしょう。

株の投資においては、銘柄を選ぶ時株価指標の PER, EPS, PBR, BPS, ROE, ROA, 自己資本比率、流動比率等の数値が[参考にされます](http://kabukabu-kenkyu21.com/sihyou.html)。

しかし投資ではなく、ある企業における株価以外の何らかの情報と、定量的な数値として単純に株価と突き合わせるという場面では、とりあえず取引日各日の[四本値](https://www.nomura.co.jp/terms/japan/yo/yonhonne.html)だけを用意しておけば良さそうです。

## 四本値を取得するライブラリ

[JpStock](http://www.ninxit.com/blog/2012/03/25/jpstoc/) は日本国内の株に対応しており、現在もメンテナンスされていて動作するライブラリです。

JpStock
[https://github.com/utahta/jpstock](https://github.com/utahta/jpstock)

これはいわゆる [Yahoo! ファイナンス](http://finance.yahoo.co.jp/)のスクレイピングをするライブラリです。

### 銘柄に対する株価を取得する

銘柄コード (4 桁) を引数に .price メソッドを叩けば取得できます。

```rb
require 'jpstock'
stock = JpStock.price(:code => code)
```

### CSV ファイルへ保存する

あとは、たとえば次のように CSV ファイルへ保存すれば良いでしょう。

```rb
  def write_price(stock)
    CSV.open(filename, "a") {|csv|
      csv << [
        stock.date.strftime("%Y-%m-%d"),　# 日付
        stock.code,  # 銘柄コード
        stock.open,  # 初値
        stock.close, # 終値
        stock.high,  # 高値
        stock.low,   # 安値
        stock.volume # 出来高
      ]
    }
  end
```

### Fluentd へ出力する

最近は [Fluentd](http://www.fluentd.org/) という素晴らしいログ収集ソフトウェアがあり、これに出力してしまえば RDBMS や KVS や JSON 形式のテキストファイル、あるいは Amazon S3 など自由自在に保存できますから、これを使うと便利でしょう。

```rb
  def save_to_fluentd(stock)
    @fluentd.post('stock.price', {
      :created_at => stock.date,
      :code => stock.code,
      :open => stock.open,
      :close => stock.close,
      :high => stock.high,
      :low => stock.low,
      :volume => stock.volume
    })
  end
```

### 過去からの株価履歴を取得する

過去にさかのぼって株価情報を取得する場合は .historical_prices メソッドを使います。これで年単位さかのぼって株価を取得できます。

```rb
date = Date.parse(start_date)
stocks = JpStock.historical_prices(
  :code => code, 
  :start_date => date, 
  :end_date => Date.today # 今日まで
)
```

### 株価を可視化する

ためしに株式会社 [DTS](http://www.dts.co.jp/) の 2001 年以降の株価を [matplotlib](http://matplotlib.org/) を使って可視化してみます。

![stock_9682.png](https://qiita-image-store.s3.amazonaws.com/0/38501/cbe7f3e2-20fd-fb84-ef00-5d14a3d3989e.png)

このように収集したデータを可視化することができます。


## まとめ

株価と業績は連動しますから、このライブラリを利用すれば何らかの外部の要因と、企業の株価との関連性をおおまかに調べるといったことができるわけです。
generator-hubot@0.1.1 が動かない

# その後

`generator-hubot@0.1.3` がリリースされた。問題なく動いているので、下記の対応は不要である。

# 問題

hubot@2.9.x から必須になった generator-hubot 。

公式に書いてある通りの手順をためしたが `generator-hubot@0.1.1` が動かない。

```bash
$ npm install -g yo generator-hubot
$ mkdir myhubot
$ cd myhubot
$ yo hubot
Error hubot

You don't seem to have a generator with the name hubot installed.
You can see available generators with npm search yeoman-generator and then install them with npm install [name].
To see the 0 registered generators run yo with the `--help` option.
```

動くわけがないよね。README と package.json しかファイルが入ってないんだから。

```bash
$ npm install generator-hubot
$ ls node_modulles/generator-hubot/
README.md  node_modules  package.json
```

# 解決策

待つ。待てば直るとは思う。

もし、待てない場合は global install されるディレクトリに GitHub のリポジトリから `generator-hubot` インストールする。

例。Ubuntu で nvm などは使っていない場合の例。

```bash
$ cd /usr/local/lib/node_modules
$ sudo git clone git://github.com/github/generator-hubot.git
$ cd generator-hubot
$ sudo npm install
$ cd
$ mkdir myhubot
$ yo hubot
```

# まとめ

generator-hubot@0.1.1 は様子見が賢明。
HtmlHelper::linkでのURLフラグメント（#書き）の指定の仕方



`'#'=>'フラグメント'`という書き方をすればよい。

```php
<?php
echo $this->Html->link(
    "ユーザー詳細",
    array(
        'controller' => 'users',
        'action' => 'detail',
        8,
        '#'=>'top'
    )
);

```

これで以下のようなリンクが生成される。

```
<a href="/users/detail/8#top">ユーザー詳細</a>
```

## ところで
`#`でURLの最後にid要素を入れるのって、一般的になんて呼ばれるんですかね？ 「Webを支える技術」には「URLフラグメント」という書き方をされていましたが、あまり聞いたことがなく。このことばはそこそこ使われているのでしょうか。
【SublimeText2】新規タブで開く

SublimeText2では、アイコンにファイルをドロップして開くと新規ウィンドウで開いてしまう。これを新規タブで開くようにするにはどうすればいいのか調べてみた。

#設定を変更する
Sublime Text 2＞Preferences＞Settings - Userに下記を追加

```json
"open_files_in_new_window": false
```

参考：[Sublime Text 2 ファイルを開く時「新規タブ」で開くようにする設定方法](http://www.madeinthepain.com/sublime-text-open-files-in-new-window/)
新米SEのWebアプリ開発学習計画

文系出身、新米SE。
Webアプリ開発のお仕事をはじめたので
一回自分で作ってみよう！

## 【目標】
1. Java、JSP、MySQLで簡単なWebアプリを作成すること
2. HTML5, CSS3を画面に導入すること
3. AngularJSでシングルページアプリケーションにすること

まずはこれを消化してから次のことを考えよう。
Itamae | Node Attributes #devops #itamae

# Itamae | Node Attributes #devops #itamae

## 概要
プロビジョニングツール Itamae

Node Attributes について。

json ファイルで定義した Node Attributes を利用して、
レシピの内容を動的に変更して、柔軟性を高めることが出来ます。
例えば、version指定を Node Attributes にすることで、
別バージョンを指定するだけのレシピを何度も作成せずに、
一つのレシピで管理出来ます。

## 前提
* 下記記事で作成した resource を流用します。
[resource plugin で 板前へのトイレ操作をプラグイン化します](http://qiita.com/tbpgr/items/6fd0610b5ccfd3b1770a)

* toilet はインストール済みとします

## 試行

### レシピを作成
~~~ruby
require 'itamae/plugin/resource/toilet'

node[:toilets].each do |t|
  t[:text]
  toilet t[:text] do
    filters t[:filters] if t[:filters]
  end
end
~~~

### Gemfile を作成

~~~ruby
source 'http://your_gem_server:your_port/'

gem 'itamae'
gem 'itamae-plugin-resource-toilet'
~~~

~~~bash
# geminabox（private gem server） から itamae-plugin-resource-toilet を install
$ bundle install
$ gem list | grep itamae
itamae (1.0.1)
itamae-plugin-resource-toilet (0.0.1)
~~~

## node.json を作成

~~~json
{
  "toilets": [
    {
      "text": "hoge",
      "filters": ["gay"]
    },
    {
      "text": "hige",
      "filters": ["gay", "flip"]
    },
    {
      "text": "hage",
      "filters": ["gay", "border"]
    },
    {
      "text": "hege"
    }
  ]
}
~~~

### 実行

※実行前に toilet はインストール済みとする

~~~
$ bundle exec itamae local --node-json node.json recipe.rb
 INFO : Starting Itamae...
 INFO : Loading node data from /home/vagrant/node_attributes_test/node.json...
 INFO : Recipe: /home/vagrant/node_attributes_test/recipe.rb
 INFO :    toilet[hoge]
 INFO :       action: run
 INFO :
#
 # mm    mmm    mmmm   mmm
 #"  #  #" "#  #" "#  #"  #
 #   #  #   #  #   #  #""""
 #   #  "#m#"  "#m"#  "#mm"
                m  #
                 ""
 INFO :    toilet[hige]
 INFO :       action: run
 INFO :
"        #
  mmm   mmmm     mmm   mm #
 #  "#  #" "#    #    #  "#
 """"#  #   #    #    #   #
 "mm#"  #"m#"  mm#mm  #   #
        #  m
         ""
 INFO :    toilet[hage]
 INFO :       action: run
 INFO :
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x                            x
x #                          x
x # mm    mmm    mmmm   mmm  x
x #"  #  "   #  #" "#  #"  # x
x #   #  m"""#  #   #  #"""" x
x #   #  "mm"#  "#m"#  "#mm" x
x                m  #        x
x                 ""         x
mqqqqqqqqqqqqqqqqqqqqqqqqqqqqj
 INFO :    toilet[hege]
 INFO :       action: run
 INFO :
#
 # mm    mmm    mmmm   mmm
 #"  #  #"  #  #" "#  #"  #
 #   #  #""""  #   #  #""""
 #   #  "#mm"  "#m"#  "#mm"
                m  #
                 ""
~~~

![node_attributes.png](https://qiita-image-store.s3.amazonaws.com/0/43480/696f69d5-85f6-af71-ad3b-b0ccc8fc5ba8.png)

## 参照
* [Itamae GitHub](https://github.com/ryotarai/itamae)
* [vagrant-itamae GitHub](https://github.com/chiastolite/vagrant-itamae)
* [軽量・高速版 Chef 「Itamae」。 プロビジョニングツールの学習コスト低下。Berkshelfからの解放。Chef Solo から Chef Zero への移行からの解放 #devops #itamae](http://qiita.com/tbpgr/items/3b6796c1cfc3c3e5521f)
Hubot 2.9.0 で削除された `src/scripts` はどこに行ってしまったのか

# 問題

`hubot@2.9.0` で `src/scripts` が削除された。

`hubot ping` は `hubot img` は `hubot die` はどこへ行ってしまったのか。また使えるようにするにはどうすれば良いのか。

# 解決策

`generator-hubot` を使った際に生成されるプロジェクトを参考に、`npm install` せよ。

`generator-hubot` は yeoman のジェネレーターである。`hubot@2.9.1` で削除された `hubot --create` の代替手段。従来のテンプレートに近いものは、これを使えば生成できる。

```bash
$ sudo npm install -g yo generator-hubot
$ mkdir myhubot
$ cd myhubot/
$ yo hubot
```

理想では……。実際には 0.1.0, 0.1.1 は npm publish に失敗しているらしく、`npm install -g generator-hubot` では、まともに動かない。`git clone git://github.com/github/generator-hubot.git` して `npm install` するなどすれば動かせるが、面倒なので、詳しくは説明しない。

以前の標準スクリプトは `package.json` の `dependencies` に追加された上で、`external-scripts.json` で参照されている。`github/hubot-scripts` が `hubot-scripts/*` という Org に移行された時点で予想できた自体だが、今後は Hubot スクリプト開発の標準的なスタイルになるだろう。

# 補足情報

補足情報というか最も重要な情報なのだが、各スクリプトのゆくえをメモする。

リポジトリ名がわかれば、 `npm install` して `external-scripts.json` に加えるだけなので、なんとかなるだろうから。

`hubot@2.8.3` の `src/scripts` の Hubot スクリプト。

hubot@2.8.3             | コマンド                            
------------------------|-------------------------------------
events.coffee           | fake event                          
google-images.coffee    | image me / animate me / mustache me 
help.coffee             | help                                
httpd.coffee            | (/hubot/ping での待ち受けなど)      
maps.coffee             | map me                              
ping.coffee             | ping / adapter / echo / time / die  
pugme.coffee            | pug me / pug bomb                   
roles.coffee            |                                     
rules.coffee            | the rules                           
storage.coffee          | show storage / show users           
translate.coffee        | translate me                        
youtube.coffee          | youtube me                          


`generator-hubot@0.1.0` で追加される Hubot スクリプト。

hubot@2.9.0             | コマンド                             | 備考
------------------------|--------------------------------------|------------------------------------------
hubot-diagnostics       | ping / adapter / echo / time         | **die がなくなっている！**
hubot-google-images     | image me / animate me / mustache  me |
hubot-google-translate  | translate me                         |
hubot-help              | help                                 |
hubot-heroku-keepalive  |                                      | HUBOT_HEROKU_URL の代替
hubot-maps              | map me                               | 
hubot-pugme             | pug me / pug bomb                    |
hubot-redis-brain       |                                      | 以前は hubot-scripts.json に入っていた。
hubot-rules             | the rules                            |
hubot-shipit            |                                      | 以前は hubot-scripts.json に入っていた。
hubot-youtube           | youtube me                           |

# まとめ

**`hubot die` は死んだ。**
Elixir Regular Expressions

# Elixir Regular Expressions

## 概要
Elixir の Regular Expressions について。

Elixir の 正規表現は

~~~
~r/regex/opts
~~~

のフォーマットで利用します。
囲み文字のスラッシュは他の文字でも代用できます。詳しくは [Sigils](http://qiita.com/tbpgr/items/4d3ac136940ddb6aa595) 参照。

opts はオプションです。

Elixir の正規表現は PCRE (Perl Compatible Regular Expressions) を採用しています。

## compile(source, options \\ "")

正規表現をコンパイルする。
不正な正規表現を指定した場合は、

~~~
{:error, {'missing terminating ] for character class', 4}}
~~~

のような値が返却される。

~~~
Regex.compile("hoge")
Regex.compile("A-Z")
Regex.compile("[A-Z]")
Regex.compile("[A-Z]", "i")
Regex.compile("[A-Z", "i")
~~~

* 出力

~~~
{:ok, ~r/hoge/}
{:ok, ~r/A-Z/}
{:ok, ~r/[A-Z]/}
{:ok, ~r/[A-Z]/i}
{:error, {'missing terminating ] for character class', 4}}
~~~

## compile!(source, options \\ "")
正規表現をコンパイルする。
compile との違いは、不正な正規表現指定時に例外が発生すること。

~~~
Regex.compile!("[A-Z", "i")
** (Regex.CompileError) missing terminating ] for character class at position 4
    (elixir) lib/regex.ex:140: Regex.compile!/
~~~

## escape(string)
正規表現のキーワードをエスケープする。

~~~
IO.inspect Regex.escape("test")
IO.inspect Regex.escape(".")
IO.inspect Regex.escape("{")
~~~

* 出力

~~~
"test"
"\\."
"\\{"
~~~

## match?(regex, string)
正規表現に一致するか真偽値で判定する。

~~~
IO.inspect Regex.match?(~r/h.ge/, "hoge")
IO.inspect Regex.match?(~r/h.ge/, "hige")
IO.inspect Regex.match?(~r/h.ge/, "hohe")
~~~

* 出力

~~~
true
true
false
~~~

## named_captures(regex, string, options \\ [])
名前付きキャプチャを利用した正規表現の実行

~~~
reg = ~r/(?<prefix>.*?)\|(?<main>.*?)\|(?<sufix>.*)/
IO.inspect Regex.named_captures(reg, "pre_value|main_value|sufix_value")
~~~

* 出力

~~~
%{"main" => "main_value", "prefix" => "pre_value", "sufix" => "sufix_value"}
~~~

## names(regex)
名前付きキャプチャを利用した正規表現の名前のみを取得

~~~
reg = ~r/(?<prefix>.*?)\|(?<main>.*?)\|(?<sufix>.*)/
IO.inspect Regex.names(reg)
~~~

* 出力

~~~
["main", "prefix", "sufix"]
~~~

## opts(regex)
正規表現中のオプションを取得

~~~
IO.inspect Regex.opts(~r/hoge/im)
~~~

* 出力

~~~
"im"
~~~

## replace(regex, string, replacement, options \\ [])
正規表現を利用した置換

~~~
IO.inspect Regex.replace(~r/xyz/, "vwxyz", "@")
IO.inspect Regex.replace(~r/v(x|y)z/, "vxzvyz", "[\\1]")
IO.inspect Regex.replace(~r/v(x|y)z/, "vxzvyz", fn _, x -> x <> "@" end)
~~~

* 出力

~~~
"vw@"
"[x][y]"
"x@y@"
~~~

## run(regex, string, options \\ [])
正規表現を実行し、最初にマッチした結果のみを返却する

~~~
IO.inspect Regex.run(~r/h.ge/, "hogehigehage")
~~~

* 出力

~~~
["hoge"]
~~~

## scan(regex, string, options \\ [])
正規表現を実行し、最初にマッチした結果全体を返却する

~~~
IO.inspect Regex.scan(~r/h.ge/, "hogehigehage")
~~~

* 出力

~~~
[["hoge"], ["hige"], ["hage"]]
~~~

## source(regex)
正規表現のソースを取得する

~~~
IO.inspect Regex.source(~r/h.ge/i)
~~~

* 出力

~~~
"h.ge"
~~~

## split(regex, string, options \\ [])
正規表現で対象文字列を配列に分割する

~~~
IO.inspect Regex.split(~r/[,\|\t]/, "hoge,hige\thage|end")
~~~

* 出力

~~~
["hoge", "hige", "hage", "end"]
~~~

## 参照
http://elixir-lang.org/docs/stable/elixir/Regex.html
Unityメモ  同時タッチ数ごとに処理を分ける [Android]

```csharp:TouchManager.cs
public class TouchManager : MonoBehaviour {

    // タッチ
    Touch touch;


	void Update () 
    {
	    if (Input.touchCount > 0) 
        {
            this.touch = Input.touches[0];

            if (this.touch.phase == TouchPhase.Began)
            {
                Debug.Log("Input.touchCount == " + Input.touchCount);
                switch (Input.touchCount)
                {
                    case 1 : // 1本指でタッチ
                        Debug.Log("Single Touch");
                        break;

                    case 2 : // 2本指でタッチ
                        Debug.Log("Double Touch");
                        break;
　　　　　　　　　　　
　　　　　　　　　　　case 3 : // 3本指でタッチ
                        Debug.Log("Triple Touch");
                        break;
                }
            }
        }
    }
}
```
多対多関連時に、has_manyで名称を指定したい時は、sourceを指定する。


```rb
class Note < ActiveRecord::Base
end
```

```rb
class Tagging < ActiveRecord::Base
  belongs_to :note
  belongs_to :tag
end
```

```rb
class Tag < ActiveRecord::Base
  has_many :tagging
  # has_many :notes through: :tagging  通常は、モデル名とシンボルが一致。
  has_many :note_list through: :tagging, source: :note # 名称がモデル名と異なる時には、sourceで明示する。
end
```
--------
参考

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html
Date#afterとDate#before実行結果まとめ

##概要

日付を扱うクラス*java.util.Date*。
その中で日付の大小(前後)を比較するときに使用するメソッド2つ。
　・public boolean after(Date when)
　・public boolean before(Date when)
コーディング作業中にDateオブジェクトと引数どちらにどれを指定すればよいの？？
未来日？過去日？…同日はどういう結果になるのだ？？
と混乱したため忘備録として各種サンプルと実行結果を記載。

##実行サンプル
```java:BeforeAfterTest 
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;


public class BeforeAfterTest {
	
	// 日付文字列指定でDate型を生成
	public static Date toDate(String str) {
		// 日付フォーマットを作成
		SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
		
		// Date型へ変換
		try {
			return dateFormat.parse(str);
		} catch ( ParseException e ) {
			return null;
		}
	}
	
	public static void main(String[] args) {
		Date a = toDate("2014/01/01");
		Date b = toDate("2013/01/01");
		
		System.out.println("A:" + a);
		System.out.println("B:" + b);
		System.out.println("a.after(b)の結果：" + a.after(b));
		System.out.println("b.after(a)の結果：" + b.after(a));
		System.out.println("a.before(b)の結果：" + a.before(b));
		System.out.println("b.before(a)の結果：" + b.before(a));
		System.out.println("a.after(a)の結果：" + a.after(a));
		System.out.println("a.before(a)の結果：" + a.before(a));
	}
}
```

・実行結果(AがBより未来日の場合の実行結果)
　A:Wed Jan 01 00:00:00 JST 2014
　B:Tue Jan 01 00:00:00 JST 2013
　a.after(b)の結果：true
　b.after(a)の結果：false
　a.before(b)の結果：false
　b.before(a)の結果：true
　a.after(a)の結果：false
　a.before(a)の結果：false
***
Manually select the device with `ti build` command


With the default settings, the device is selected automatically, when you execute the `ti build` command.

This command allows you to select it manually.

```
ti config ios.autoSelectDevice false
```


Now, execute `ti build` again.
It asks you to select a device type.

For instance, in a simulator, like this.
`ti build -T simulator`

```
Which simulator do you want to launch your app in?
8.1
   1)  iPhone 4s
   2)  iPhone 5
   3)  iPhone 5s
   4)  iPhone 6 Plus
   5)  iPhone 6
   6)  iPad 2
   7)  iPad Retina
   8)  iPad Air
   9)  Resizable iPhone
  10)  Resizable iPad
```
CoreOS用のcloud-config.ymlを晒しておく

etcd/fleet/dockerの自動起動、 TimeZoneのJST化、固定IP化、ユーザ作成(ssh鍵2つ入り)ができるcloud-config.ymlを晒します


```:cloud-config.yml
#cloud-config

hostname: coreos01

coreos:
  update:
    reboot-strategy: best-effort
  etcd:
    discovery: https://discovery.etcd.io/{HASH}
    addr: 10.200.0.66:4001
    peer-addr: 10.200.0.66:7001
    bind-addr: 0.0.0.0
  fleet:
    public_ip: 10.200.0.66
  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: docker.service
      command: start
    - name: timezone.service
      command: start
      content: |
        [Unit]
        Description=timezone
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/ln -sf ../usr/share/zoneinfo/Japan /etc/localtime
    - name: 10-static.network
      runtime: no
      content: |
        [Match]
        Name=eth0

        [Network]
        Address=10.200.0.66/24
        Gateway=10.200.0.1
        DNS=10.200.0.2
        DNS=10.200.0.3

users:
  - name: coreuser1
    passwd: `openssl passwd -1`
    groups:
      - sudo
      - docker
    ssh-authorized-keys:
      - ssh-rsa AAAA...68= user1@example.jp
      - ssh-rsa AAAA...3h1= user2@example.jp
```

※10/22: コメントでのアドバイスを基に変更

users.passwdは、`openssl passwd -1`の結果を貼り付けてください。それ以外にもmkpasswdやperl/pythonを使う方法があるようです

{HASH}は https://coreos.com/docs/cluster-management/setup/cluster-discovery/ を見て得るか、自前でetcdサーバを立てた時のものを使ってください

cloud-config.ymlのデバッグ方法
------------------------------

`coreos-cloudinit`コマンドが利用できます

```
$ sudo coreos-cloudinit -from-file=./cloud-config.yml
```

現在のOS設定がcloud-config.ymlの内容に書き換わっちゃうので要注意



参考資料
--------

* [Customize with Cloud-Config](https://coreos.com/docs/cluster-management/setup/cloudinit-cloud-config/)
* [CoreOS + etcd + fleetによるクラスタリング事始め - さくらのナレッジ](http://knowledge.sakura.ad.jp/tech/2519/)


あとがき
--------

まぁ、こんなもんか
Yii2の削除確認ダイアログをかっこ良くする

せっかく最初からBootstrapなんだし、削除確認などに使われてるあのOS標準ダイアログなJSの `confirm()` ももっとかっこ良くしたい。というわけで Bootbox であれをオーバーライドします。

http://bootboxjs.com/

フレームワークの中から探しだした `yii.js` にはこう書いてあります。

```js
/**
 * Displays a confirmation dialog.
 * The default implementation simply displays a js confirmation dialog.
 * You may override this by setting `yii.confirm`.
 * @param message the confirmation message.
 * @param ok a callback to be called when the user confirms the message
 * @param cancel a callback to be called when the user cancels the confirmation
 */
confirm: function (message, ok, cancel) {
    if (confirm(message)) {
        !ok || ok();
    } else {
        !cancel || cancel();
    }
},
```

おや

> **You may override this by setting yii.confirm**

すばらしいですね。やってみましょう。

`composer.json` に `bower` の `bootbox` を追加。ご存知のとおり、Yii2 では Composer を使って、Packagist からだけでなく、bower や npm からでもいろいろインストールできます。

```json
{
    "require": {
        "php": ">=5.4.0",
        ...略
        "bower-asset/bootbox": "~4.3.0"
    },
}
```

別のプロジェクトでも使いまわせるようにBootbox用のアセットを定義し、

```php
<?php
namespace app\assets;

use Yii;
use yii\web\AssetBundle;

class BootboxAsset extends AssetBundle
{
    public $sourcePath = '@vendor/bower/bootbox';
    public $js = [
        'bootbox.js',
    ];
}
```

つねにロードしておいて欲しいのでそれを `app\assets\AppAsset` に追加。

```php
namespace app\assets;

use yii\web\AssetBundle;

class AppAsset extends AssetBundle
{
    // ... 略
    public $depends = [
        'yii\web\YiiAsset',
        'yii\bootstrap\BootstrapAsset',
        'app\assets\BootboxAsset', // ここ
    ];
}
```

ここまでで、基本、全てのページに `bootbox.js` が入ります。

いよいよ標準の確認ダイアログのオーバーライドです。たとえばこういう実装でいかがでしょう。

```php
class BootboxAsset extends AssetBundle
{
    // ... 略
    public static function overrideSystemConfirm()
    {
        Yii::$app->view->registerJs('
            yii.confirm = function(message, ok, cancel) {
                bootbox.confirm(message, function(result) {
                    if (result) { !ok || ok(); } else { !cancel || cancel(); }
                });
            }
        ');
    }
}
```

というような、JSを登録できるメソッドを作っておいて、`views/layouts/main.php` あたりのこのへんからこう。

```php
<?php
// ... 略
AppAsset::register($this);
BootboxAsset::overrideSystemConfirm(); // これ (もしかしたら $this 渡したほうが...?)
?>
<!DOCTYPE html>
```

![スクリーンショット 2014-10-21 21.24.41.png](https://qiita-image-store.s3.amazonaws.com/0/11525/2e3f587c-c58a-adf9-3b58-e96cb472bbd4.png)

よーし!

ようするに、単に、`yii.confirm` を自分の関数に置き換えてるだけです。が、Yiiのアセットマネージャーを使うと、いい感じの場所で透過的にそうなってくれるので、何も気にしなくてもよくてありがたいですね。

おや、[これが可能になったときのコミット](https://github.com/yiisoft/yii2/commit/b4c4b4053a72b3cffaf64393ff438ff45b1c99f2#diff-6ed25333dcd29100ab12768833283a45R228) にどこかで見た名前が。
脆弱性のあるwebサービスを攻撃してみた

# はじめに
先日セキュリティを題材にワークショップを受けてきたのでそのメモ。iOSのクライアント側の開発ばかりやってきた自分にとって新鮮で面白い内容でした。講義の内容はXSSやSQLインジェクション、CSRFの脆弱性などでとりあえずXSSの初歩についてまとめてみる。

>**XSSとは**
ネットワークを通じた攻撃手法の一つで、保安上の弱点(脆弱性)のあるWebサイトを踏み台に、悪意のあるプログラムをそのサイトの訪問者に送り込む手法。また、そのような攻撃に利用される脆弱性のこと
[クロスサイトスクリプティングとは 【 XSS 】 【 Cross Site Scripting 】 - 意味/解説/説明/定義 ： IT用語辞典]
(http://e-words.jp/w/E382AFE383ADE382B9E382B5E382A4E38388E382B9E382AFE383AAE38397E38386E382A3E383B3E382B0.html)

# 初めてのXSS
`http://localhost:8888/enquiry-form.php?msg=aaaa`
上記のようにURLのmsgを受け取って

```lang:html
<dd>
    <textarea style="width: 300px; height: 300px;">
        aaaa
    </textarea>
</dd>
```

このようにhtmlを表示するとき

```lang:php
<dd>
    <textarea style="width: 300px; height: 300px;">
        <?php print isset($_GET['msg']) ? $_GET['msg'] : '' ?>
    </textarea>
</dd>
```
とphpが記述されていた場合、以下のようなURLでscriptを実行することができる。

`http://localhost:8888/enquiry-form.php?msg=</textarea></dd><script>alert(document.cookie)</script>`


これで簡単にcookieが取得できてしまう。
例えば攻撃者が誰かにこのようなURLを踏ませてcookieを送信させればcookieをゲットできてしまう。
対処法としてphp部分を以下のように変更することで解決できる。

```lang:php
<dd>
    <textarea style="width: 300px; height: 300px;">
        <?php print htmlspecialchars(isset($_GET["msg"]) ? $_GET["msg"]: '')?>
    </textarea>
</dd>
```
ここで使っているのがhtmlspecialchars関数で以下のような特徴を持つ。

>**htmlspecialchars関数とは**
HTMLには特殊な意味（役割）を持っている文字（特殊文字）があり、その文字をHTMLでの意味（役割）としてではなく、ただの文字（見た目は記号）として表示する（させる）ために文字参照値（という言い方が正しいかどうかは分からないが）に置き換える機能を持つ関数。
フォームなどでユーザー（他者）からの悪意ある入力を無害化するのに用いられ、安全性を高めるためにも指定しておくことが望ましい。
[htmlspecialchars関数](http://d.hatena.ne.jp/porco_webangya/20130904/1378259713)

これでさっきのscriptは無効化できる。
楽しい٩( 'ω' )و
子プロセスと標準入出力を接続する時の悩み事

シェルの Wrapper のようなものを Java で実装するときに 15 年くらい悩んで解決していない問題なんだけど、良いアイディアがある人が居たらコメントに残しておいて頂けると助かります。

要件は Java で子プロセスを起動して親の標準入力に流し込まれたデータをすべて子に渡す & 子が出力したデータをすべて親の標準出力に流す、という処理。

```java
import java.io.*;
import java.util.concurrent.*;
class Foo {
  // 入力から読み込んだデータをそのまま出力するだけの処理
  public static void rw(InputStream in, OutputStream out) {
    try {
      while(true){
        int ch = in.read();
        if(ch < 0) break;
        out.write(ch);
      }
    } catch(IOException ex){ /* */ }
  }
  public static void main(String[] args) throws IOException, InterruptedException {
    ExecutorService threads = Executors.newFixedThreadPool(3);
    Process proc = new ProcessBuilder(args).start();
    final InputStream in = proc.getInputStream();
    final InputStream err = proc.getErrorStream();
    final OutputStream out = proc.getOutputStream();
    threads.submit(new Runnable(){ public void run(){ rw(in,  System.out); }});
    threads.submit(new Runnable(){ public void run(){ rw(err, System.err); }});
    // threads.submit(new Runnable(){ public void run(){ rw(System.in, out); }});  // ※このスレッドが終了できない
    proc.waitFor();
    threads.shutdown();
    System.out.printf("-- Exit: %d%n", proc.exitValue());
  }
}
```

これ、標準入力から読み込んで子に渡すスレッドが標準入力に対しての I/O ブロックに入っているので、子プロセスが終了しても終了できないんですね。

そもそも同期で読み込んでいることが問題なので、System.in ではなく `FileDescriptor.in` を使用して非同期 I/O でとも考えましたが `FileChannle` はそもそも `SelectableChannel` ではないので非同期 I/O 化は行えませんでした。また `AsynchronousFileChannel` も `Path` 指定なので `FileDescriptor` を指定することは出来ません (デバイスファイルとかある環境なら良いかもしれませんが)。

無理矢理実装するなら入力をデーモン化してオレオレ非同期化ですかね。

1. System.in に対して Java プロセス全体で共通の読み出し用 daemon スレッドを張り付ける。
2. そのスレッドが読み込んだデータを非同期で受け取る Listener 的なものを add したり remove したり。
3. プログラム終了時にそのスレッドは消えるのでそのまま終了 (標準入力の `close()` は意図通りに機能しない環境があるかも)。

メリット: 親プロセスから何種類かの子プロセスを起動する場合でも Listener の attach/detach でうまく対処できる。
デメリット: 子プロセスが読み込みを行わなずどんどん入力するといずれパイプ用のバッファがいっぱいになり読み込みスレッドが停止する、InputStream の抽象性が生かせず実装が非標準的なことになる、他のライブラリで System.in から読み込むものがいたら競合する、ちょっとした処理でやるには大げさ、等々。

うーん、あまり綺麗ではないですがどこを妥協するかですね。

あるいは:

1. 子プロセスが終了したら無理繰り `Thread.stop()` する。

以後の System.in の状態が保障されない事になると思いますが、子プロセスが終了したら親もすぐ終了するからという場合なら選択肢にはなりそう。

そもそも標準入出力と子プロセスの入出力が非同期 I/O に対応した `SelectableChannel` として使えるなら無駄なスレッドを張り付けることをしなくても良いんですけどー。難しいですね。
【PHP】URLが存在しているかの確認

#はじめに
前回書いた『[PythonでURLが存在しているか確認](http://qiita.com/fantm21/items/6996a4f681c53a1338e8)』の派生版です。今回はPHPでURLが存在している確認します。

~~実際にURLが存在しているか確認できるサイトを作りました。
→『URLチェック|FantmSite』~~(公開を終了しました)

#サンプルコードの一部
今回はちょっとすべてを書いてしまうのは問題がありそうなので、URLが存在しているかを確認するプログラムを少し変えて記載しておきます。

```php:hoge.php
if($fp = @fopen($url,'r')){
fclose($fp);
echo "<li>Found:".$url."</li>";
}else{
echo "<li>Not Found:".$url."</li>";
}
```

~~実際に今回作ったサイトhttp://fantmsite.heteml.jp/qiita_sample/checkURL/~~(公開終了しました。)では、存在していれば『Found』、存在していなければ『Not Found』というのを変数に格納しているので上記のコードとは異なるのですが、行っていることは同じです。まぁ、今回も[前回](http://qiita.com/fantm21/items/6996a4f681c53a1338e8)と同様にURL先を開いて読めれば存在している、それに失敗したら存在していないというものです。


# サンプルとして作成したサイトについて
* ~~上記でも書きましたが、サンプルとして作成したサイトとして『URLチェック|FantmSite』を作成しました。~~(公開終了しました。)
ちょっと考えが甘かったようでルート検索までされてしまっていたので対応策として『http://』もしくは『https://』のいずれかが含まれていないURLに関しては検索できないように設定をかけました。
* 存在するURLのものに対してはリンク先にクリックすることでそのサイトにいけるようにしました。
grunt serve で Cannot find where you keep your Bower packages. がでたときの解決方法

# grunt serveでエラー
YeomanでつくったAngularJSの環境で、grunt serveしたらエラーがでました。

```
grunt serve
Running "serve" task

Running "clean:server" (clean) task

Running "wiredep:app" (wiredep) task
Cannot find where you keep your Bower packages.
```

これを解決するにはbower installをするといいみたいです。

```
bower install
```
bower installをしたらgrunt serveがうまくいきました(☝ ՞ਊ ՞)

# 参考
http://stackoverflow.com/questions/22367837/what-is-causing-grunt-serve-to-throw-no-bower-components-found
UISplitViewControllerの戻るボタンを変更する

# 結論

splitViewController.displayModeButtonItemが変更できないため、ボタンを作り、
そのボタンのtargetとactionをsplitViewController.displayModeButtonItemのそれらに設定してあげる

```objc:MasterController.m
detailController.navigationItem.leftItemsSupplementBackButton = YES;
id target = self.splitViewController;
SEL action = self.splitViewController.displayModeButtonItem.action;
detailController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Menu" style:UIBarButtonItemStyleBordered target:target action:action];
```

## ついでに

splitViewControllerで選択項目を制御したい場合はsetPreferredDisplayModeを指定してあげればいいが、
アニメーションもなく閉じてしまう。

```objc:MasterController.m
[self.splitViewController setPreferredDisplayMode:UISplitViewControllerDisplayModePrimaryHidden];
```

閉じるアニメーションが必要な場合は、上記のSELを実行してあげれば、いい。
※undeclared-selector警告が出るが問題ないので、抑制する。

```objc:MasterController.m
id target = self.splitViewController;
SEL action = self.splitViewController.displayModeButtonItem.action;
#pragma GCC diagnostic ignored "-Warc-performSelector-leaks"
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[target performSelector:action];
#pragma clang diagnostic pop
```
Googleスプレッドシートで分かち書きされた要素を数え上げ

Googleスプレッドシートで、分かち書きされた要素を数え上げます。

## スクリプト
下記の2つの記事で紹介しているスクリプトを、Googleスプレッドシートの [ツール]→[スクリプトエディタ]から貼りつけ、保存してください。

- http://qiita.com/shirayuca/items/c4d7c47ee0519c94f2ef
- http://qiita.com/shirayuca/items/3412c03675a10f964499

下記のように、各々のスクリプトファイル（〜.gs）を作成します。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/48375/27952c95-fb78-bff5-5e87-a26384568ee8.png)



## 使い方
下記の公開スプレッドシートにて、実際の使い方の例を示しています。

- https://docs.google.com/spreadsheets/d/17SPL31fsaraUZhsxnBTxRZaGiXbYdISFWA_7UV3mKMg/edit?usp=sharing


#### 使い方1：分かち書き
まず、任意のテキスト群を用意します。今回は、素敵な鬼女様（ http://sutekinakijo.com/ ）の新着タイトルを`=IMPORTXML()`関数で取得しました。A2セルにはブログURLが入っています。

```
=importxml(A2,"//h1[@class='article-title']")
```

その後、テキストの隣のセルに、`=wakachigaki()`関数と`=TRANSPOSE()`関数を組み合わせ、分かち書きされた要素を横列に表示します。B2セルにはブログタイトルテキストが入っています。

```
=transpose(wakachigaki(B2))
```

![22.png](https://qiita-image-store.s3.amazonaws.com/0/48375/c097dace-a8c5-9243-7991-23a2558e8bbf.png)


#### 使い方2：数え上げ
新しいシート上で、`=wordCount()`関数を実行し、先ほど横列に順次表示された分かち書き後要素を数え上げます。`=wordCount()`関数では、分かち書きされた要素がある範囲全てを参照してください。

![3.png](https://qiita-image-store.s3.amazonaws.com/0/48375/4e7910a5-bf4d-8d99-6ec7-92a8f3ad8a1a.png)

数え上げ結果は、新しいシートで値として貼付けしソートする等、適宜活用してください。

![5.png](https://qiita-image-store.s3.amazonaws.com/0/48375/b6679f12-5588-713c-89e1-2410b1106b98.png)



## 参考
- http://chasen.org/~taku/software/TinySegmenter/
jQueryのdatatablesで、正規表現でsearchを実行する例

例えば、「IDの列が、10か11か12のレコードのみを表示したい」という場合に使います。

```
var targetRowIds = [];//行のidxの配列。ここにあるものだけを表示したい。
//配列に値を入れます。ここらへんは状況によりけり。
targetRowIds.push('10');
targetRowIds.push('11');
targetRowIds.push('12');
//正規表現でsearchメソッドを実行するために、正規表現用の文字列へと置換する。行頭と行末の記号を忘れないでね。
for (var i = 0,len = targetRowIds.length; i < len; i++) {
    targetRowIds[i] = '^' + targetRowIds[i] + '$';
}
var regexStr = targetRowIds.join('|'); //正規表現では、|ってor条件なんですよね。
//検索します。
var table = $('#hogehoge_table').DataTable();
table.columns(0).search(regexStr,true).draw();
```

これで検索結果が表示されます。
対話式のコマンドをスクリプト化する方法

れれ?? Qiitaのフォント変わった?

さて、今日はexpectを使います。

# expectコマンドとは
コマンドの返答を識別して次の入力を自動的に行うコマンドー

```
expect -c "
spawn [実行したいコマンド]
expect [コマンドの返答]
send -- [次のコマンド]
"
```
といった感じで使います。

## 実装例1：Linuxにユーザーを追加

**利用するコマンド** 

* expect
* useradd
* passwd

事前にexpectをインストール

```
yum install expect
```
シェルスクリプトを作成

````bash:set_user.sh
#!/usr/bin

useradd UserName 
expect -c "
spawn passwd UserName
expect \"New password:\"
send -- \"hogehoge\n\"
expect \"Retype new password:\"
send -- \"hogehoge\n\"
expect \"passwd: all authentication tokens updated successfully.\"
send -- \"exit\n\"
"

```
で、実行

```
$ chmod +x set_passwd.sh 
$ ./set_passwd.sh 
```


## 実装例2：CSVのデータを元にLinuxにユーザーを追加

**仕様**

1. [ユーザー名]と[パスワード]をCSVに記入
2. csv内の値を引数に、useradd, passwdを順次実行


**実装**

ユーザーとパスワードをhoge.csvに記入
こんな時vim便利ね☆

```csv:hoge.csv
user1,hogehoge
user2,fugafuga
user3,hafuhafu
user4,puripuri
```
シェルスクリプトを作成

```bash:set_user.sh
#!/usr/bin/
csvfile=hoge.csv
for line in `cat ${csvfile} | grep -v ^#`
do
    user=`echo ${line} | cut -d ',' -f 1`
    pass=`echo ${line} | cut -d ',' -f 2`
    useradd $user
    expect -c "
    spawn passwd ${user}
    expect \"New password:\"
    send -- \"${pass}\n\"
    expect \"Retype new password:\"
    send -- \"${pass}\n\"
    expect \"passwd: all authentication tokens updated successfully.\"
    send -- \"exit\n\"
    "
done
```
で、実行

```
$ chmod +x set_passwd.sh 
$ ./set_passwd.sh 
```



以上



# 追記
本当はLinuxのユーザーのパスワードを200件ほど書き換えたくて効率的な方法を探していた。。
今回はexportを利用したが、記事を書き終えてすぐ chpasswdなるコマンドーの存在を知っていま絶望している........。。。。。

```
chpasswd < testpass.txt
```

[参考：ユーザパスワード一括変更 ～Linux編～](http://orebibou.com/2014/04/%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%91%E3%82%B9%E3%83%AF%E3%83%BC%E3%83%89%E4%B8%80%E6%8B%AC%E5%A4%89%E6%9B%B4-%EF%BD%9Elinux%E7%B7%A8%EF%BD%9E/)
Atomでvim-modeを有効にしていると、undoの挙動がおかしい問題を回避

# 修正対象ファイル
/Applications/Atom.app/Contents/Resources/app/node_modules/text-buffer/lib/history.js

# 修正内容

```javascript
History.prototype.beginTransaction = function() {
  if (++this.transactionDepth === 1) {
      return this.currentTransaction = new Transaction();
  }
};
```

↓↓↓

```javascript
History.prototype.beginTransaction = function() {
  /**
   * ここでtransactionDepthを0にしないと、vim-mode利用時の
   * undoで変更が前に戻りすぎるというのがおきる
   */
  this.transactionDepth = 0;
  if (++this.transactionDepth === 1) {
      return this.currentTransaction = new Transaction();
  }
};
```

## 最後に
もっといい方法あれば教えて下さい