OmniAICreator/Qiita-1.07M huggingface dataset:
[C++]そのinline、大丈夫？

#概要

`inline`指定子は、かつてコンパイラのインライン化を促進するために使われた。
コンパイラが賢くなった現代では、インライン化を促進する意味での`inline`指定子は、実際上何の影響も与えない。
ところが、`inline`指定子にはコンパイラへのヒントだけでなく、特に複数の翻訳単位が有る時、プログラムに影響を与える事がある。

#例1

```cpp
// test1.cpp
#include <iostream>
inline int f() { return 1; }
void g() { std::cout << f() << std::endl; }

int main()
{
  g();
}

// test2.cpp
inline int f() { return 2; }
void h() { f(); }
```

この二つの翻訳単位から成るプログラムをコンパイルすると、面白い結果になる。
すなわち、リンク順序に結果が依存し、コンパイラはエラーも警告も出さない。
`clang++ test1.cpp test2.cpp -o a.out` => 1
`clang++ test2.cpp test1.cpp -o a.out` => 2

C++に慣れた人なら、`inline int f()`がOne Definition Rule違反だと見抜くだろう。
これは、割としられている例で、プログラム全体で、**外部リンケージ**を持つinline functionが多重定義されていた場合、未定義動作を引き起こす。
この未定義動作をコンパイラは検知しなくて良いと規格で定められている。

解決法は簡単で、inline functionが**外部リンケージ**を持たなければ良い。
**内部リンケージ**を持たせるには、`static`指示子を用いたり、無名名前空間内でinilne functionを定義すれば良い。
あるいは、inline指定子を用いなければ良い。

さらに、同様な理由で、コンパイラが検知しない未定義動作を起こす物がいくつかある。
例えば、**外部リンケージ**を持つクラスのメンバ関数のODR違反である。
また、constexpr functionも暗黙にinline specifiedである。

#例2

前の例は、異なって定義された外部リンケージinline functionが問題であった。

同じ定義を持っていてもODR違反となる場合がある。

```cpp
// test1.cpp
#include <iostream>
const int x = 1;
inline int f() { return x; }
void g() { std::cout << f() << std::endl; }

int main()
{
  g();
}

// test2.cpp
const int x = 2;
inline int f() { return x; }
void h() { f(); }
```

この例では、`inline int f()`の定義は、はどの翻訳単位でも同じトークン列である。
また、`const int x`は内部リンケージを持つ。
にも関わらず、このコードは先ほどと同様なリンク順序の非対称性を持つ。

これは、同じトークン列によって多重定義された関数の中で言及される、内部リンケージを持つconst変数は、全て同じ値で初期化されていなければならないという条件を破っている。
これも、規格によってODR違反とされる(例えばC++11標準規格なら、§3.2/5)が、コンパイラはやはり警告してくれない。


#まとめ
外部リンケージを持つinline関数はしばしば未定義動作を起こす。

外部ライブラリによって、グローバル名前空間が汚染されていた場合、もはや安全にグローバル名前空間を使う事はできない。


自分が作っているのが(翻訳単位を分ける事を想定している)ライブラリならば、何を外部リンケージとするか慎重に選んだ方が良い。

また、以上に挙げた以外にも、ODRに関連して未定義動作を引き起こす典型例がある。(参考参照)

勉強になった。

#参考
[The One Definition Rule in C++11 and C++14: Constant Expressions and Inline Functions](http://www.codeproject.com/Articles/762413/The-One-Definition-Rule-in-Cplusplus-and-Cplusplus)
[stackoverflow:Is it an undefined behavior to have different definitions of an inline function?](http://stackoverflow.com/questions/11200805/is-it-an-undefined-behavior-to-have-different-definitions-of-an-inline-function)
[本の虫:C++11参考書](http://ezoeryou.github.io/cpp-book/C++11-Syntax-and-Feature.xhtml#basic.def.odr)
[本の虫:テンプレートの実体化の実装方法とODR違反について](http://cpplover.blogspot.jp/2013/12/odr.html)
awscliを使ってs3からファイルをさくっとダウンロードする

awscliをインストールする。

```shell-session
sudo easy_install pip
sudo pip install awscli
aws --version
```

awscliを使ってログをダウンロードする。

```
export AWS_ACCESS_KEY_ID=your_access_key
export AWS_SECRET_ACCESS_KEY=your_secret_access_key

aws s3 sync s3://path/to/source/ ./path/to/destination --region ap-northeast-1
```

これは楽だー。
AWS Redshiftでテーブル名と容量の一覧を出力する

下記のSQLを管理者ユーザーで実行する。
単位はMB。

```sql
select name, cnt from
(
  select tbl, count(*) as cnt
  from stv_blocklist
  where tbl in (
  select id
  from stv_tbl_perm)
  group by tbl
) block_list
inner join stv_tbl_perm
on block_list.tbl=stv_tbl_perm.id
group by tbl, stv_tbl_perm.name, block_list.cnt
order by cnt;
```
ui::ListViewのリスト内で選択した行を取得する

[CocosStudioのUIEditorで作ったListViewを使う]()の続きです。
配置したリストの行選択のイベントを拾う方法になります。

# デモ

![a295046bf0065399464c5fe9100335e0.gif](https://qiita-image-store.s3.amazonaws.com/0/40887/d466b0b7-c0b9-d961-e1d7-d1379c49ddb4.gif)

# ソースコード

```cpp:HelloWorldScene.cpp
    listView->addEventListener([](Ref *ref, ui::ListView::EventType eventType){
        if (eventType == ui::ListView::EventType::ON_SELECTED_ITEM_END) {
            auto listView = static_cast<ui::ListView*>(ref);
            // 選択状態を色を元に戻す
            for (auto widget : listView->getItems()) {
                widget->getChildByName<ui::Text*>("Label_2")->setColor(Color3B::WHITE);
            }
            // 選択した行の色を変える
            auto selectedIndex = listView->getCurSelectedIndex();
            listView->getItem(selectedIndex)->getChildByName<ui::Text*>("Label_2")->setColor(Color3B::GREEN);
            
            CCLOG("selected index %ld", selectedIndex);
        }
    });
```

GitHubに公開しているソースは[こちら](https://github.com/kyokomi/NeglectClient/commit/9c98a2178a1ffd05d1a5892aa24582e2d1454f6f)になります。
SmartyでSmarty too many shorthand attributesというエラーが出たときの原因と対処

日本語のページがなかったので役に立つたたないはともかく残しておきます。

元々のPHPのコード自体もなかなかに複雑だったけど、省略。

Smartyのテンプレートの該当部分だけ抜粋。
エラーが出たときのコード

```php
{$num = $items|@count}
    {if $num > 0}
        {foreach item=item from=$items}
            {section name=j start=0 loop $num - 1}
                {assign var=member value=member_|cat:$smarty.section.j.iteration}
                    // something working codes
            {/section}

            {section name=k start=2 loop $num - 1}
                 {assign var=pages value=pages|cat:$smarty.section.k.iteration}
                 // pagenatation codes
            {/section}
         {/foreach}
    {/if}
```

結論から言ってしまうとただのシンタックスエラーです。
原因はここ
> {section name=j start=0 loop $num - 1}
> {section name=k start=2 loop $num - 1}

loopに=を入れ忘れたため、startの引数としてloop, $num - 1っていうstartで期待される引数の数(1つ) を超えちゃってるよって怒られてます。

コードの重複になりますが解決編

```php
{$num = $items|@count}
    {if $num > 0}
        {foreach item=item from=$items}
            {section name=j start=0 loop = $num - 1}
                {assign var=$member value=member_|cat:$smarty.section.j.iteration}
                    // something working codes
            {/section}

            {section name=k start=2 loop = $num - 1}
                 {assign var=$pages value=pages|cat:$smarty.section.k.iteration}
                 // pagenatation codes
            {/section}
         {/foreach}
    {/if}
```
sbt をインタラクティブに使うときに覚えておくと便利なこと


sbt をインタラクティブに使うときに知っておくと便利なんじゃないでしょうか。

## その1. console

sbt を立ち上げて console と打つと scala の REPL が起動します。Scala を別途インストールする必要がなく便利です。

REPLから sbt に戻るのは `:q` で。

````
> console
[info] Resolving org.fusesource.jansi#jansi;1.4 ...
[info] Done updating.
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.10.4 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_67).
Type in expressions to have them evaluated.
Type :help for more information.

scala> println("Hello")
Hello

scala> :q

[success] Total time: 9 s, completed Oct 27, 2014 6:23:15 PM
````

## その2. consoleQuick

console 便利なんですが、書き換え途中などでコンパイルできないコードがあるときに起動できないので困ったりします。
consoleQuick は自分のプロジェクトのコードを読み込みません。自分のコードがコンパイルできなくても REPL を起動できます。

## その3. set

set で一時的に設定を追加できます。

普段 build.sbt に書く `libraryDependencies` ですが、一時的に試してみたいときは set で設定するのとファイルに書かなくて良いので楽です。

````
> set libraryDependencies += "com.github.nscala-time" %% "nscala-time" % "1.4.0"
````

## その4. ++

`++2.11.2` などとすることで scala の version を一時的に切り替えられます。`set scalaVersion := "2.11.2"` としても良いですが、こちらのほうが短くて便利。
scala のいろんなバージョンでコードを試したい時に使う。


## その5. help

help と実行すればここに書いたことは全部書いてありますし、もっと詳しいことが書いてあります。
また、たとえば `compile` ってなんだったかな？と思った時も `help compile` すれば教えてくれます。

````
> help compile
Compiles sources.
````

結局 help だけ覚えておけばいいのかもしれない。
iOS8でフルスクリーンモードをスリープさせると、setTimeout/setIntervalが使えない

# 2014/11/18 iOS8.1.1追記

**この現象は無事修正されてました。万歳！**

----


```html
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="default" />
```

のように記述したウェブサイトを、ホーム画面に追加し、そのアイコンから起動するとフルスクリーンモード（正式な名称は何て言うんだろう・・・）で起動できます。

このアイコンから起動した後、**一度スリープにし、そして復帰させると、setTimeout/setIntervalが動かなくなります**。
動かしている途中だったものも、新しく呼び出したものも全て動かなくなりました。


# 参考

http://www.sencha.com/blog/apple-shows-love-for-html5-with-ios-8

> Home Screen Apps Lose Timing Functions After Lock/Wake
Google IO 2014公式アプリのインストール(Android 5.0向け)

Google IO 2014公式アプリのソースコードがLollipop公開に合わせて最新版になってました。-> <https://github.com/google/iosched>
Nexus 5 にlollipop preview最終版を入れた(<http://qiita.com/tomoima525/items/0191d75bc4d4da9f6970>)ので、インストールしてみました。
以前バージョン(Android L版)のインストール手順はこちら(<http://tomoima525.hatenablog.com/entry/2014/08/03/165152>)にあります。


### アプリのビルド方法
アプリはGradleベースで実装されてるので、Android Studio必須です。

#### 1.必要なものをDLしてインストール

   * Android SDK: <http://developer.android.com/sdk/index.html>
   * Gradle: http://www.gradle.org/downloads>
   * Android Studio: <http://developer.android.com/sdk/installing/studio.html>
 
Android StudioをインストールすればAndroid SDK, Gradleは不要です。   
これらは普通に手順にそってDLしてインストールすればOK。

#### 2.Githubからprojectソースコード取得
自分のワークディレクトリ直下で以下コマンド実行。

```
git clone https://github.com/google/iosched.git
```

lsするとioschedというディレクトリができてそこにソースコードが来てます。

#### 3.SDK ManagerでLのSDKなどインストール
Android Studioを起動し、Tools -> Android ->SDK Managerまたはタブのドロイド君を選択し、SDK Managerを起動して、以下をインストールします。

   * Tools > Android SDK Platform-tools (rev 21 or above)
   * Tools > Android SDK Tools (rev 23.0.5 or above)
   * Tools > Android SDK Build-tools version 20
   * Tools > Android SDK Build-tools version 21.0.2
   * Android 4.4 > SDK Platform (API 20)
   * Android 4.4W > SDK Platform (API 21)  <- wearを利用しない場合は不要
   * Android 5.0 > SDK Platform (API 21)
   * Extras > Android Support Repository（最新）
   * Extras > Android Support Library(最新)
   * Extras > Google Play services(最新 6.1以上)
   * Extras > Google Repository

こんな感じで出ているはずなので、選択してインストールすればOK。


#### 4.Android Studioにインポート,ビルド
* local.properties.exampleをの中身を書き換えます。local.properties.exampleを開くと、sdk.dirが書いてあるので、

```
sdk.dir=（SDKがあるディレクトリ）
```

とします。あとリネームします。

```
mv local.properties.example local.properties
```

* Files -> Import Project でioschedを選択してインポートします。


* debug.keystoreが適切に設定してあるか確認します。モジュールディレクトリ(iosched ->android)を開いて、build.gradleを開きます。

```
   signingConfigs {
        debug {
            storeFile file("../android/debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
        release {
            storeFile file("../android/debug.keystore")
            storePassword "android"
            keyAlias "androiddebugkey"
            keyPassword "android"
        }
    }
```

storeFile file ()内に、debug.keystoreの宛先を設定または上記ディレクトリにコピーします。  
debug.keystoreはmacやlinuxならホームディレクトリ直下/.android/以下にあります。  
debug.keystoreがなければ、作成して、ディレクトリ([ワークディレクトリ]/iosched/android/配下)にコピーします。 
-> <http://qiita.com/taka0125/items/c408df4061a0af49c9b3>

* (オプション)Android Wear版のプロジェクトも入っているので、それはビルドしないようにします。  
build.gradleから　-> wearApp project(':Wearable')を省きます  
settings.gradleから -> ':Wearable'を省きます  


* Android Studioのタブでビルド対象がWearableではなくandroidとなっていることを書くにして、Build -> Make Projectでビルドします  

* マテリアルデザインに完全対応したアプリをビルドするにはAndroid L PreviewSDKでビルドします。

```
./gradlew clean assembleDebug
```

端末にインストールする場合は、以下実行します。
```
./gradlew installDebug
```

### 重要1.javaSDKを7にする
Android SDK 21からはJDKを7以上にしなくてはいけません。
JDK 7の導入手順は以下を参考にしました。
http://ameblo.jp/kurabeat/entry-11713103139.html
CocosStudioのUIEditorで作ったListViewを使う

`ui::ListView`は`ui::ScrollView`を継承して作られています。
`ui::Widget`単位でリストにいい感じで並べてくれるので、かなり使いやすいです。

Cocos2d-x2.x時代に使っていたTableViewに比べるとやることがほとんどなくて、とても楽でした。

# CocosStudio側の作業
ListViewを配置したベースのLayoutとListViewに表示するパーツを用意します。

UIEditorを使います。

## ListViewを配置したベースとなるLayoutを作成

変数名とか雑になってますが、単純にリストコンテナを配置するだけです。

![6c56a4c5e9bf0ee152e3012b6a9c6f3c.png](https://qiita-image-store.s3.amazonaws.com/0/40887/63883fb2-7bfe-d406-7207-6a8bd33c67f4.png)

細かい設定でよく使いそうなのは以下で行えます。

- 縦リストにする場合: `スライド方向`に`Vertical`を指定する
- 横リストにする場合: `スライド方向`に`Horizontal`を指定する
- スクロールの最後でバウンドさせる場合:  `リバウンドオープン`のチェックボスをONにする

### 横リスト

![b5efe63a1cd68e44037a635ff76f6dc5.gif](https://qiita-image-store.s3.amazonaws.com/0/40887/6f69bf26-7e55-c374-13a7-e2fa2b0eed56.gif)

### 縦リスト

![1eb4a11b159e7e3541b8bb817a55a52a.gif](https://qiita-image-store.s3.amazonaws.com/0/40887/630a9d82-ee8c-b5df-6025-9588fe4dd399.gif)

### 縦リストのリバウンドON

![2678ef0daf332e81ee90074cd0dadcd3.gif](https://qiita-image-store.s3.amazonaws.com/0/40887/b3ce7d5c-2dd5-618d-d22d-e785bd536d7d.gif)

## ListViewに表示するパーツの作成

キャンバスサイズを`250x50`に調整して、LabelとButtonを配置しました。

![168b5e7c9b2bcbb22a8ebd64e922784d.png](https://qiita-image-store.s3.amazonaws.com/0/40887/3261232d-3232-9e3a-ec90-03f45d7d51e4.png)

特別な設定は特に無いです。

# Cocos2d-x側の作業
CocosStudioでExportしたファイルの取り込みと、ソースコード上でListViewへWidgetを配置します。

## ファイルの取り込み
詳しくは、以前書いた記事「[CocoStudioのAnimationEditorを使って簡単なアニメーションを実装する](http://qiita.com/kyokomi/items/29cd1d44eb35c0068df4#2-7)」に書いているのでそちらを御覧ください。

![スクリーンショット 2014-10-27 18.08.03.png](https://qiita-image-store.s3.amazonaws.com/0/40887/828558f3-2a8d-91ca-485a-64d764f2b743.png)

## ListViewにパーツを配置する

```cpp:HelloWorldScene.cpp
bool HelloWorld::init()
{
    // 〜省略〜

    // CocosStudioのLayout読み込み
    auto layout = GUIReader::getInstance()->widgetFromJsonFile("ListScene/ListScene.json");
    // Listを取得
    auto listView = layout->getChildByName<ui::ListView*>("ListView_2");
    // Listの中身をセット
    for (int i = 0; i < 10; i++) {
        auto listParts = GUIReader::getInstance()->widgetFromJsonFile("ListParts/ListParts.json");
        auto text = StringUtils::format("Label Text %d", i);
        listParts->getChildByName<ui::Text*>("Label_2")->setString(text);
        listView->pushBackCustomItem(listParts);
    }
    this->addChild(layout);

    return true;
}
```

ソースコードは[こちら](https://github.com/kyokomi/NeglectClient/blob/1984f7ac62963c12f3c0726041e0adf57a05fcc3/Classes/HelloWorldScene.cpp#L91)に公開していますので、興味があればご覧ください。

---

**追記:**

上記の配置したリストの選択行を取得する方法については、「[ui::ListViewのリスト内で選択した行を取得する](http://qiita.com/kyokomi/items/4d27edd2ea85264e0fab)」をご覧ください。
MEGADOCKでタンパク質ドッキングをやってみる

#概要
タンパク質ドッキングとは，２つのタンパク質の構造情報をもとに複合体の構造を推定することです．
この記事では[MEGADOCK](http://www.bi.cs.titech.ac.jp/megadock/index_ja.html)というツールを使ってタンパク質ドッキングをやってみるところまで解説します．

#インストール
##必要なもの
今回は普通のPCで動かす場合の説明をします．
GPUとかスパコンとか使いたい人はhttp://www.bi.cs.titech.ac.jp/megadock/install_ja.html を参照して下さい．

* MEGADOCK
* FFTW3 - http://www.fftw.org 

##FFTW3のインストール
FFTWのサイト http://www.fftw.org からFFTW3系のtarballを取ってきます．その後，以下のようにインストールして下さい．

```lang:FFTW3のインストール
$ tar xzf fftw-3.X.X.tar.gz
$ cd fftw-3.X.X
$ ./configure --enable-float --enable-sse2 --prefix=/as/you/like
  (SIMD化が効く場合，--enable-sse または --enable-sse2 オプションによってSSEまたはSSE2を有効にすると性能向上が見込めます．)
$ make
$ make check
$ make install
```

##MEGADOCKのインストール
MEGADOCKのサイト http://www.bi.cs.titech.ac.jp/megadock/ からmegadock-4.0.tgzをダウンロードします．その後以下の操作で解凍します．

```lang:tarの解凍
$ tar xzf megadock-4.0.tgz
$ cd megadock-4.0
```
次に`Makefile`を編集します．`Makefile`の該当箇所を以下に沿って編集して下さい．（FFTWのパスはインストール時に設定したものを入力して下さい．）

```lang:Makefile
FFTW_INSTALL_PATH ?= your/fftw/library/install/path
                     (デフォルト: /usr/local )
CPPCOMPILER       ?= icpc, g++ など
OPTIMIZATION      ?= -O3
OMPFLAG           ?= -openmp (intel) または -fopenmp (g++)

USE_GPU := 0
USE_MPI := 0
```

そして`make`します．

```
$ make
```

すると，`megadock`という名前のバイナリファイルが生成されます．

#MEGADOCKを使う
MEGADOCKに2つのPDBファイルを入力すると，ドッキング計算をしてくれます．

```lang:MEGADOCKの実行
$ ./megadock -R A.pdb -L B.pdb -o docking.out
```
```lang:MEGADOCKのオプション
-o [filename]    : 出力ファイルの名前 (デフォルト："$R-$L.out")
-O               : 詳細な出力ファイルを生成します
-N [integer]     : 生成する候補構造の数 (デフォルト：2000)
-t [integer]     : リガンド回転角ごとに出力する候補構造の数 (デフォルト：1)
-D [integer]     : リガンド回転角の刻み幅を6°刻みにします（-Dを付けない場合は15°刻み）
                   6°刻みの場合54000通りの角度，15°刻みの場合3600通りの角度で計算します．
                   （例えば -t 2 -D とした場合，-Nは最大108000まで設定可能です．）
-e [float]       : 静電相互作用の項の重み倍率 (デフォルト：1.0)
-d [float]       : 脱溶媒和項の重み倍率 (デフォルト：1.0)
-a [float]       : rPSC形状相補性のレセプターコアの値 (デフォルト：-45.0)
-b [float]       : rPSC形状相補性のリガンドコアの値 (デフォルト：1.0)
-f [1/2/3]       : スコア関数の設定
                   (1: rPSC形状相補性のみ, 2: rPSC+静電, 3: rPSC+静電+脱溶媒和, デフォルト：3)
-h               : ヘルプを表示
```

予測した複合体の構造の情報はdocking.outというファイルに書き込まれます（デフォルトではスコアの良いものから2000個分）．正確にはこのファイルにはリガンドの相対的な移動情報しか書かれていないので，PDBファイルにするには以下の操作を行います．

```lang:複合体PDBの生成
$ ./decoygen 1.pdb B.pdb docking.out 1
(./decoygen [候補構造のファイル名] [使用したリガンドPDB] [ドッキング出力ファイル] [出力する候補構造の順位])
```

これで複合体の（１位の）構造`1.pdb`ができました．
PyMOL (http://pymol.org) などのビューワで実際に見てみましょう．

```lang:PyMOL
$ pymol 1.pdb
```
![20130909235624.png](https://qiita-image-store.s3.amazonaws.com/0/57626/7583a42f-8deb-a0c5-3bb9-c15ded166154.png)

##スレッド並列
MEGADOCKはOpenMPでスレッド並列化されています．

```lang:スレッド並列
$ export OMP_NUM_THREADS=2
```

などで適当なスレッド数を指定してあげると速く実行できます．

##GPUで動かす
Makefileの編集のときに `USE_GPU := 1` とするとGPUで計算するバイナリを生成できます．
かなり高速に計算できますので，是非GPUを使ってやってみてください．

#参考情報

* MEGADOCKのHP http://www.bi.cs.titech.ac.jp/megadock/
* 生物物理夏の学校2013 計算ハンズオンセミナー http://www.bi.cs.titech.ac.jp/~ohue/bps2013/
MacからAndroid Lollipop Preview版インストール方法

Android Lollipop Preview版の最終バージョンがリリースされていたので、Nexus5にインストールしてみた手順です。

###Step 1:Nexus 5用Android 5.0 Lollipop Developer Previewをダウンロード
こちらからDLできます。
http://storage.googleapis.com/androiddevelopers/finalpreview/hammerhead-lpx13d-preview-f7596f51.tgz

どこか適切な場所にファイルを解凍します。

###Step 2: デバイスをUSBにつなぐ
開発者モードでUSBデバッグモードを有効にしておいてください。
Nexus5での方法は
1.設定>端末情報>ビルド番号を7回タップする
2.設定>開発者向けオプションがでてくるので、USBデバッグにチェックを入れる


###Step 3:デバイスをfastbootモードで起動
Macからterminalを起動し、以下コマンドでfastboot起動する

```
$ adb reboot bootloader
```

bootloaderをunlockする。これによってカスタムOS(今回ならLollipop)が入れられるようになります。

```
$ fastboot oem unlock
```

端末側に確認画面がでるので、Yesを選択。(この時点でファクトリーリセットされるので注意)
選択操作はタッチパネルが効かないので、端末の音量ボタンで選択、ロックボタンで有効化します。


###Step 4:OSインストール

ターミナルから先ほどのOSを解凍したディレクトリに行き、以下を実行する。

```
$ ./flash-all.sh
```

OSのインストールが開始されます。5-10分くらいで完了します。

###Step 5:設定
previewモードで起動するので、各種設定をします。

なお、oem lockを戻す場合は、以下を実行します。

```
$ adb reboot bootloader
$ fastboot oem lock
```
秘密鍵、証明書、CSRの整合性のチェック

ApacheのSSL更新等で秘密鍵や証明書を組み込む場合、
整合性がとれないとエラーとなりApacheが落ちてしまう。

実は秘密鍵や証明書はApacheに入れる前に整合性チェックを行う事ができる

秘密鍵の内容を確認

```
openssl rsa -text -noout -in [秘密鍵]
```

CSRの内容を確認

```
openssl req -text -noout -in [CSR]
```

証明書の内容を確認

```
openssl x509 -text -noout -in [証明書]
```

上記コマンドで出力された「modules」の値を見比べて
完全に一致していれば整合性がとれている。

### 中間証明書と証明書の整合性

```
openssl x509 -issuer_hash -noout -in [証明書]
```

```
openssl x509 -subject_hash -noout -in [中間証明書]
```

同じ値が出力されれば整合性が取れている
[VBScript] コマンドラインから UAC 昇格

`cscript please.vbs プログラム名` とすると、管理者権限でそのプログラムを起動します。プログラム名を省略すると、CMD.EXEが起動します。

直前に投稿した「[Windows で vipw っぽく、システムのデフォルト%PATH%を変更する](http://qiita.com/zetamatta/items/2919f0a794e6373eb964)」の副産物です。

```VBScript:please.vbs
Option Explicit
Dim program
If WScript.Arguments.Count <= 0 Then
    program = "CMD.EXE"
Else
    program = WScript.Arguments(0)
End If
Dim argv : argv = ""
If WScript.Arguments.Count >= 1 then
    Dim i
    For i=1 To WScript.Arguments.Count-1
        argv = argv & " " & WScript.Arguments(i)
    Next
End If
Dim shellApp : Set shellApp = CreateObject("Shell.Application")
shellApp.ShellExecute program,Trim(argv), "" , "runas"
Set shellApp = Nothing
```
POST値をログ出力 (mod_log_post)

epelリポジトリから追加。

```bash:
yum install mod_log_post
```

# 設定ファイル

* /etc/httpd/conf.d/log_post.conf

# ログ

* /var/log/httpd/post_log

結構な勢いでログが残るのと、複数行で出力されるため抽出しにくいので注意。
「リアルタイムWEBを実現する技術」の触りを知っておく為のまとめ


# 概要
socket.ioについて周辺技術の触りをまとめておく
これだけ知ってれば後から調べやすいはず

## 覚えること

* Socket.io
* Websocket
* ノンブロッキングI/O
* node.js

## Socket.ioって何？

Socket.ioのページを参照
「Socket.IOは、リアルタイム双方向イベントベースの通信を可能にします。」
「これは、信頼性とスピードに均等に焦点を当て、すべてのプラットフォーム、ブラウザやデバイス上で動作します。」

解りにくいので簡単に書くと
幾つかの通信方式とサーバー、ブラウザ、デバイス間の通信を抽象化してくれるライブラリでいいはず


## Socket.ioが対応している通信方式

[Socket.IO protocol](https://github.com/Jxck/socket.io-spec)

* xhr-polling
* xhr-multipart
* htmlfile
* websocket
* flashsocket
* jsonp-polling

抽象化しているので意識せずにこれらが使えるということ

[リアルタイムWebを構築しやすくする「Socket.IO」とは](http://codezine.jp/article/detail/7075)見れば触りは解る

詳しく知るなら下記がよさそう

* [リバース Ajax: 第 1 回 Comet の紹介](http://www.ibm.com/developerworks/jp/web/library/wa-* reverseajax1/)
* [リバース Ajax: 第 2 回 Comet の紹介](http://www.ibm.com/developerworks/jp/web/library/wa-reverseajax2/)
* [リバース Ajax: 第 3 回 Comet の紹介](http://www.ibm.com/developerworks/jp/web/library/wa-reverseajax3/)

## Socket.ioのバージョンはどれを使うの？

HOMEの[In other languages](https://github.com/Automattic/socket.io/wiki)を参照
主に0.9が主流で1.0以降の対応が遅れている
[History.md](https://github.com/Automattic/socket.io/blob/master/History.md)を見ると1.0.0のリリースは2014-05-28となっている

## Socket.io 0.9から1.0で改善されたこと

* 初回接続速度の問題を修正
* 同時接続数、データストアが改善されスケールがしやすくなった

[Socket.IO 1.0の変更点・内部的な話](https://speakerdeck.com/nkzawa/socket-dot-io-1-dot-0falsebian-geng-dian-nei-bu-de-nahua)を参照
0.9から1.0ではプロトコルが違うので移行時に障壁がある

## Websocketって何？
websocketはTCPソケットを利用、HTTPリクエストではない
* 強力な双方向通信
* 低レイテンシー(デバイスに対し転送要求をしてから、結果返送までの遅延時間)
* エラーも簡単に処理できる

## WebSocket互換API
内部的にはsocket.send(data) と socket.on('message', callback) を使用。
send() は内部的には eventname を 'message' に固定しているだけ。

[Socket.IO API 解説](http://jxck.hatenablog.com/entry/20110730/1312042603)から引用


## ノンブロッキングI/Oって何？
コンピュータ内部のCPUと周辺装置のデータ入出力(I/O)において、データの送受信の完了を待たずに他の処理を開始する方式。並列処理の一種。(IT用語辞典 e-wordsから引用)

## ノンブロッキングI/Oを使う理由
従来のスレッド生成モデルだと接続毎にスレッド立てるのでメモリ消費が多い。
接続が増えても1スレッドで非同期で処理するイベントループの仕組みの方がメモリ消費が抑えれるメリットがある。


## node.jsの特徴

* サーバーサイドのJavaScriptインタープリター
* ノンブロッキングI/O
* GoogleのV8 VMを実行環境に使うので高速

## node.jsを始める
* [Nodeビギナーズブック]
(http://www.nodebeginner.org/index-jp.html)を読むのをおすすめします

# 他おすすめ

* [Introducing Socket.IO 1.0](http://socket.io/blog/introducing-socket-io-1-0/)[[翻訳](
http://yosuke-furukawa.hatenablog.com/entry/2014/05/30/093103)]
* [socket.ioの日本語訳](https://github.com/Jxck/socket.io/wiki)
PKCS #12 ファイルから秘密鍵,証明書,中間CAを取り出す

hoge.pfxみたいなファイルで渡されたけどApacheで利用するのでそれぞれのファイルを抜き出す。

秘密鍵の取り出し

```
openssl pkcs12 -in hoge.pfx -nocerts -nodes -out sample.key
```

証明書の取り出し

```
openssl pkcs12 -in hoge.pfx -clcerts -nokeys -out sample.crt
```

中間証明書の取り出し

```
openssl pkcs12 -in hoge.pfx -cacerts -nokeys -out sample.ca-bundle
```

取り出したファイルは上に余計なものがついてるので
-----BEGIN CERTIFICATE-----　～　-----END CERTIFICATE-----　みたいな部分以外は削除して利用する
javascriptでグローバルナビをループ その2

**・メニュー名を配列に入れる**
**・jsでグローバルメニューのliを回してメニュー名を配列からとってきて入れていく**
**・メニュー幅を、メニュー数に依存せずに常にwidthを等倍にする**

```lang:html
<div class="nav" id="navID">
</div>
```

```lang:css
*{ margin: 0; padding: 0;}
.nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
  width: 100%;
}
.nav ul li {
  display: inline-block;
  background: #ddd;
  width:-webkit-calc(100%/6);
  width:-moz-calc(100%/6);
  width:calc(100%/6);
  /*border:1px solid #ff00ff;*/
}
.nav ul li a {
  display: block;
  text-decoration: none;
  color: #4e4e51;
  padding: 10px;
  border:1px solid #d4d4d4;
  /*width:100%;*/
}
.nav ul li a:hover {
  background-color: #999;
  color: #fff;
  border:1px solid #999;
}
/*
a:hoverでのポイント
li は margin:0; padding:0; に
その中のaタグをdisplay:block;にしてブロック要素とし、そこでpaddingを設定する。
こうすることでhoverした時にli全体にhoverの変化が反映される(margin0かつpadding0だから)
*/
```

```lang:javascript
window.onload = function(){
  /*navをjson形式でnavメニュー名を取得し、ループで回す*/

      /*ulのIDを取得(この中で処理します)*/
      var navID = document.getElementById('navID');
      /*メニューデータ用配列*/
      var menuData = ['メニュー1','メニュー2','メニュー3','メニュー4'];
      /*ulを生成*/
      var ul = document.createElement('ul');

      /*メニューのループ*/
      for(var i = 0;i < menuData.length; i++){
          /*liエレメントを生成(生成だけで未表示)*/
          var li = document.createElement('li');
          /*生成したliエレメントのwidthを調整  100% をメニュー数のぶん割り算(borderありの時は調整が必要かも)*/
          li.style.width = 100 / menuData.length + '%';
          /*innerHTMLで、配列に入ってるデータをli内に入れるtextを入れ込む。*/
          li.innerHTML = '<a href="#">' + menuData[i] + '</a>';
          /*設定したliをulの中に入れ込む*/
          ul.appendChild(li);
      }
      /*ループで生成したliをulの中にいれていく*/
      navID.appendChild(ul);
}
```
IE11（互換モード）UAにはMSIEがある

## 現象
（おおまかに言うと）こういう感じの分岐をやってるところで、

```js
var ua = navigator.userAgent.toLowerCase();
var hogeElement = document.getElementById('hoge');

if (/msie/.test(ua)) {
	hogeElement.attachEvent('click', iehoge);
} else {
	hogeElement.addEventListener('click', hoge, false);
}
```

通常、IE11は、「`MSIE`」が含まれないのでセーフだが、
互換モードの IE11は、UAが以下の様になるのでアウト。
という事象を見た。

```
Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)
```

## 改善
自力で判定するにしても、`addEventListener`用の判定なので、`addEventListener` で判定すべき。


```js
if (el.addEventListener){
  el.addEventListener('click', modifyText, false);
} else if (el.attachEvent){
  el.attachEvent('onclick', modifyText);
}
```
> https://developer.mozilla.org/ja/docs/Web/API/EventTarget.addEventListener


（念のため）両方ある IE9 には少し注意しましょう。
ビュー、サブビューの操作、画像表示


![アプリ画面](http://i.gyazo.com/25584a0d13868e32f8c4c42e931f9352.gif)

### やったこと
* ビュー、サブビュー、シーンについて確認
* ビューをプログラムから生成
* ボタンでビューを削除
* 画像を表示（GUIのみ）

### コード
```Swift:ViewController.swift

class ViewController: UIViewController {
    
    // 削除対象のラベル
    @IBOutlet var TargetViewStrong: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        // プログラムでラベルを追加
        var myLab:UILabel = UILabel()
        myLab.text = "いいね！ラベル生成"
        // 中央寄せ
        myLab.textAlignment = NSTextAlignment.Center
        myLab.textColor = UIColor.greenColor()
        myLab.backgroundColor = UIColor.orangeColor()
        // 24ポイントの太字にする
        myLab.font = UIFont.boldSystemFontOfSize(24)
        // 座標とサイズを指定
        myLab.frame = CGRectMake(20, 100, 350, 30)
        
        // ビューに追加
        self.view.addSubview(myLab)
    }

    // ビュー削除
    @IBAction func RemoveLabelView(sender: UIButton) {
        if (self.TargetViewStrong.isDescendantOfView(self.view)) {
            // トップのサブビューであれば削除
            self.TargetViewStrong.removeFromSuperview()
            
            // 非表示にするコード
            //self.TargetViewStrong.hidden = true
        } else {
            // 追加
            self.view.addSubview(self.TargetViewStrong)
        }
        
        // .superviewで親ビューをコンソール確認
        print(self.TargetViewStrong.superview)
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}
```

### コメント
DB操作とか早くしたいのだけど、つまらない細かい部分でなかなか進まない。
メモ: Apache + phpはアクセス数増えると死ぬ

[uu59のメモ | Apache + PHPでloadavgがじわじわ上がっていく現象と対策](http://blog.uu59.org/2012-02-18-prefork-mpm-with-php.html)

> ここから論理的に導かれる結論は、「1秒間のリクエスト数が MaxClients / KeepAliveTimeout の数を超えた状態が続くと問答無用でサーバが応答不能になる」ということです。ネットブックだろうがスパコンだろうが死にます。PHPの負荷は関係なく、静的ファイルの配信しかしてなくても死にます。

勉強になる。


> ちなみにApacheにもnginxと似たような戦略を取るevent MPMというのがあります

なるほど、event MPMを試してみよう。
KIFを使おうとしてハマったこと


[KIF](https://github.com/kif-framework/KIF)
まぁこの本家を見てインストールしてけば間違いないんだけど、英語だし、、、と思って、
情報古いかもしれないけど、、、と思いつつ、日本語の記事を見てインストールしてたら、ところどころハマったのでメモ。

結局、本家を見て解決しました。

## 参考
[KIFを使ってUIテスト](http://qiita.com/edo_m18/items/f4824b7b66bfd08de5d9)

## テストのターゲットで、CocoaPodsでインストールする
[KIFを用いた結合テスト](https://github.com/mixi-inc/iOSTraining/wiki/11.4-KIF%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E7%B5%90%E5%90%88%E3%83%86%E3%82%B9%E3%83%88)を参考にインストールしてみるも、ターゲット作成の部分が古かったのでしょうか、ハマりました。
プロジェクト作成時に勝手にできるテスト用のターゲットを使うか、新たにターゲットを作りましょう。

![スクリーンショット 2014-10-14 10.48.29.png](https://qiita-image-store.s3.amazonaws.com/1139/23116/c43fa207-948a-5b5b-61d7-8baa641b15d4.png "スクリーンショット 2014-10-14 10.48.29.png")

## xctestのままで
2.0でも3.0でも変わらんだろってことで、[KIFとNLTHTTPStubServerを利用して最低限のIntegrationTestを実現する](http://qiita.com/okitsutakatomo/items/c06c1450f1697382e802)を参考にインストールしたら、ハマりました。

xctestをoctestにするってとこは無視で。

## Command + U でテストを実行する
Xcodeでターゲットをテストにして実行ボタンを押してもビルドが成功するだけです。
恐る恐る```Command + U```をやってみると、、、ビルドしてシミュレータが起動してテストが実行されました。

## AccessibilityLabelじゃなくても動くぞ
UIButtonのテキストに入れた文字でも動いた。

## キーボードが出ない！？
テキストフィールドなどの入力で、

```objc
[tester enterText:@"hogehoge" intoViewWithAccessibilityLabel:@"textarea"];
```
としてもキーボードが出ずに、そのままテスト失敗になった。
そういうときは、シミュレータが起動して、テスト実行中、入力のところで
```iOS Simulator -> Hardware -> Keyboard -> Toggle Software Keyboard```
もしくは
```⌘ + K```
javascriptでグローバルナビをループ その1

**メニュー名を配列に入れ、jsでグローバルメニューのliを回してメニュー名を配列からとってきて入れていく**

```lang:html
<body>
  <div class="nav" id="navID">
  </div>
</body>
```

```lang:css
/*
a:hoverでのポイント
li は margin:0; padding:0; に
その中のaタグをdisplay:block;にしてブロック要素とし、そこでpaddingを設定する。
こうすることでhoverした時にli全体にhoverの変化が反映される(margin0かつpadding0だから)
*/
*{ margin: 0; padding: 0;}
.nav ul {
  margin: 0;
  padding: 0;
  list-style: none;
  width: 100%;
}
.nav ul li {
  display: inline-block;
  background: #ddd;
  width:-webkit-calc(100%/6);
  width:-moz-calc(100%/6);
  width:calc(100%/6);
  /*border:1px solid #ff00ff;*/
}
.nav ul li a {
  display: block;
  text-decoration: none;
  color: #4e4e51;
  padding: 10px;
  border:1px solid #d4d4d4;
  /*width:100%;*/
}
.nav ul li a:hover {
  background-color: #999;
  color: #fff;
  border:1px solid #999;
}
```

```lang:javascript
  window.onload = function(){
    /*navをjson形式でnavメニュー名を取得し、ループで回す*/

        /*ulのIDを取得(この中で処理します)*/
        var navID = document.getElementById('navID');
        /*メニューデータ用配列*/
        var menuData = ['メニュー1','メニュー2','メニュー3','メニュー4','メニュー5','メニュー6'];
        /*ulを生成*/
        var ul = document.createElement('ul');

        /*メニューのループ*/
        for(var i = 0;i < menuData.length; i++){
            /*liエレメントを生成(生成だけで未表示)*/
            var li = document.createElement('li');
            /*innerHTMLで、配列に入ってるデータをli内に入れるtextを入れ込む。*/
            li.innerHTML = '<a href="#">メニュー' + menuData[i] + '</a>';
            /*設定したliをulの中に入れ込む*/
            ul.appendChild(li);
        }
        /*ループで生成したliをulの中にいれていく*/
        navID.appendChild(ul);

  }
```
Gmailの委任機能

## 委任機能とは？

Google for WorkのBusiness, EducationのGmailでは「委任」という機能が使えます。特定のアカウントで、メールボックスへのアクセス権を他の人に委任する設定をすると、アクセス権を委任された人がログインした時に、マルチアカウントでログインしている時のように委任元のアカウントへ切り替えることができる、という機能です。

![Screen_Shot_2014-10-27_at_2_14_31_AM.png](https://qiita-image-store.s3.amazonaws.com/0/1387/845b5e7b-6fa3-6dfa-515f-f0acfa9d14a5.png)

上の図は委任先のアカウントだけがログインした時の画面で、マルチログイン状態の時と同じように複数アカウントが表示されています。が、委任元アカウントには`delegated`という表示がされていて、このアカウントでログインしたわけではありません。この状態で`delegated`なアカウントを選択すると、マルチアカウントと同じように、そのアカウントのGmail画面が開いてメールの送受信が可能になります。

## API的にはどうなるの？

### Gmail API

UIと同様に、委任された側の権限で委任元のメールを読めるかとおもいきやそうではないです。委任については、あくまでもUI上の話だけのようです。

### Email Settings API

[Manage Delegation Settings](https://developers.google.com/admin-sdk/email-settings/#manage_delegation_settings)という機能があり、それを使うことで委任先をAPIから制御できそうです。

### OAuthの認可

Gmail上ではいかにもマルチアカウントでログインしているように見えますが、マルチアカウントログインの場合はOAuth2の認可の前にアカウントの選択が表示されるのに対し、Gmailの委任状態の場合はログインしているわけではないため、委任先のアカウントでのみ認可することができます。
fluentdのforward inputに任意の言語で直接ログを流しこむ方法

背景
-----

fluentdは多様なinput/outputプラグインを持ち、またプラグインの作成も容易であるため、自分で作成したプログラムに合わせてinputプラグインを用意できます。しかし、自身でプログラムを作成している場合は出力側の自由がきくので、third partyあるいは自作のプラグインを利用することなく直接forwardで入力する方法を試してみました。（これが本当に最も低コストな入力なのかは未検証です）

fluentd側の設定
--------------------------

forward入力プラグインを設定ファイル（fluentd.confなど）に記述します。

    <source>
      type forward
      port 24224
      bind 0.0.0.0
    </source>

送信クライアント側の実装
--------------------------

今回はC++で実装しましたが、基本的な手順はどの言語でも共通するはずです。

### TCPでforward入力プラグインに接続する

通常のネットワークプログラミングの手順でTCPにソケットで接続する。
C++の場合は以下のとおり。

    int connect_tcp(std::string host, std::string port) {
      struct addrinfo hints;
      struct addrinfo *result, *rp;
      int sock;
      int r;

      memset(&hints, 0, sizeof(struct addrinfo));
      hints.ai_family = AF_UNSPEC;
      hints.ai_socktype = SOCK_STREAM;
      hints.ai_flags = 0;
      hints.ai_protocol = 0;

      // IPアドレスを一括で取得
      if (0 != (r = getaddrinfo(host.c_str(), port.c_str(),
                                &hints, &result))) {
        std::string errmsg(gai_strerror(r));
        throw std::runtime_error("getaddrinfo error: " + errmsg);
      }

      // 取得したIPアドレスを順次接続してみる
      for (rp = result; rp != NULL; rp = rp->ai_next) {
        sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);
        if (sock == -1) {
          // 接続失敗、次へ
          continue;
        }

        if (connect(sock, rp->ai_addr, rp->ai_addrlen) != -1) {
          // 接続成功
          break;
        }
      }
      
      // 結果を解放
      freeaddrinfo(result);
      
      if (rp == NULL) {
        // 接続できるアドレスがなかった
        throw std::runtime_error("no avaiable address for " + host);
      }
      // socket descriptorを返す
      return sock;
    }

### Msgpackの構造データを作る

こちらも普通にパッキングして、シリアライズできればOK。データ構造を`[tag, [[time,record], [time,record], ...]]`にするのがポイント。~~http://documents.mazgi.com/fluentd/doc/plugin.html#forward には[tag, time, record]も許容するとあったが、fluentd-0.10.53では正しく読み込まれなかった。~~
(2014.11.2 追記) `[tag, time, record]` でもできました。試行錯誤している段階で何かミスが有ったようです。`[tag, time, record]` 版のコードを[gist](https://gist.github.com/m-mizutani/d82f0245349a9dc8570a)に貼っておきます。


以下、C++の場合のコード例。

    struct timeval tv;
    msgpack::sbuffer buf;
    msgpack::packer <msgpack::sbuffer> pk (&buf);

    std::string tag("test.tag");
    std::string k1("a"), k2("b");
    gettimeofday(&tv, NULL);
    pk.pack_array(2);   // [_, _]
    pk.pack(tag);       // ["test.tag", _]
    pk.pack_array(1);   // ["test.tag", [_]]
    pk.pack_array(2);   // ["test.tag", [[_, _]]]
    pk.pack(tv.tv_sec); // ["test.tag", [[123400xxx, _]]]
    pk.pack_map(2);     // ["test.tag", [[123400xxx, {}]]]
    pk.pack(k1); pk.pack(1); // ["test.tag", [[123400xxx, {"a": 1}]]]
    pk.pack(k2); pk.pack(2); // ["test.tag", [[123400xxx, {"a": 1, "b": 2}]]]

### fluentdに送信する

パックしたmsgpack形式のデータをシリアライズしてsocketに書き込む。

    write(sock, buf.data(), buf.size());


まとめ
------------

C++のコードは[gist](https://gist.github.com/m-mizutani/1b0a153120f611aec26e)においてあります。。デバッグが必要なときは標準入力からうけたmsgpackの内容をダンプするコードとかを書いて `nc -l 24224 | msgpack_dump.rb` みたいにすればすぐ中身が見えるので便利です。
Arduinoのポートが認識されない時の対処法

ArduinoをMacに接続してもポートが認識されない時の対処法

##ポートの確認方法
Arduinoを繋いだ状態で調べる
####ArduinoのMacアプリから
`Arduino > ツール > シリアルポート`
一覧が出てくる。だいたい `/dev/tty.usbmodem1411`みたいなのがArduinoのシリアルポートになる

####ターミナルから
`Terminal > $ ls -l /dev/tty.*`
一覧が出てくる

##ポートからArduinoが認識されない
ArduinoをMacにつないで上記の方法を試しても`/dev/tty.usbmodem1411`の用なポートが認識されない時

##再起動
まずはPC再起動。これで直る時がある

##再起動でも直らない
`システム環境設定 > ネットワーク > 左のWi-Fiなど緑ランプで接続されているもの以外の赤色のをすべて削除する`
その後再起動。
これで無事認識されるようになった。
Windows で vipw っぽく、システムのデフォルト%PATH%を変更する

という VBScript を書いてみました(Windows7 向け)

1. 起動すると、UAC のダイアログが表示されます。
2. 「はい(Y)」とすると、メモ帳で %PATH% の内容が開かれます
（この時点で、セミコロン「`;`」は改行に置換されています）。
4. 修正してセーブすると（改行をセミコロン「`;`」に置き換えて）システム環境変数のデフォルト値へ変更内容を書き込みます。

お使いの PC の設定を変更するスクリプトですので、 **ご利用は計画的に**。

```chpath.vbs
if WScript.Arguments.Count <= 0 then
    Set shellApp = CreateObject("Shell.Application")
    shellApp.ShellExecute "wscript.exe","""" & WScript.ScriptFullName & """ uac" , "" , "runas"
    Set shellApp = Nothing
    WScript.Quit
end if
Set wshShell=CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set sysEnv=wshShell.Environment
Path = sysEnv.Item("Path")
TempName = objFSO.GetTempName()

Set objWriter = objFSO.CreateTextFile(TempName,True,False)
objWriter.WriteLine( Replace(Path,";",vbcrlf) )
objWriter.Close()
Set objWriter = Nothing

Set objExec = wshShell.Exec("notepad " & TempName)
Do While objExec.Status = 0
    WScript.Sleep 100
Loop
output = objExec.StdOut.ReadAll
if len(output) > 0 then
    WScript.Echo output
end if
output = objExec.Stderr.ReadAll
if len(output) > 0 then
    WScript.Echo output
end if

Set objReader = objFSO.OpenTextFile(TempName,1)
Path = Replace(objReader.ReadAll,vbcrlf,";")
if Right(Path,1) = ";" then
    Path = Left(path,len(path)-1)
end if
objReader.Close()
Set objReader = nothing

rem WScript.Echo Path
objFSO.DeleteFile(TempName)
sysEnv.Item("Path") = Path
Set objFSO = Nothing
```

# 参考にしたページ

* [Server World - VBScript を管理者権限で実行](http://www.server-world.info/query?os=Other&p=vbs&f=1)
Goutteが怖い・・・・

こんにちは、なめこです。
Goutteで怖い目にあいました(といってもGoutteが原因かは不明）
Goutte
https://github.com/fabpot/goutte

レンタルサーバ（エックスサーバ）でスクレイピングツールを作ってます。

```php:test.php
$pram = POST値
$url = 対象URL
// ユーザーエージェントの取得
$useragent = HttpHeaderUtil::getUserAgent();
$client = new Client(['HTTP_USER_AGENT'=>$useragent, 'HTTP_ACCEPT-LANGUAGE'=>'ja,en']);
$options = JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_PRETTY_PRINT;
echo $datetime . '開始だよ！';
$client->request('POST', $url, array(), array(), array('HTTP_CONTENT_TYPE' => 'application/json'), json_encode($param, $options));
echo $datetime . '終了だよ!';
$response = $client->getResponse();
$c = $response->getContent();
$c->seek(0);
$c = $c->getContents();
```
上記はJSONをPOSTして、JSONを返却してくるAPIをスクレイピングしたときの例です。
（WebAPIなのでGoutteでやる意味あんのか！？）
たくさんアクセスするので、上記のようなコードをぐるぐる回す感じです。
さてさて、プログラムを動作させて5時間後？ぐらいでしょうか
ふとログを見ると
<pre>
～～～省略～～～
10/27 20:00 開始だよ！
10/27 20:03 終了だよ!
10/27 20:03 開始だよ！
10/27 20:04 終了だよ!
10/27 20:05 開始だよ！
</pre>

あれ・・・途中でとまってる。
現在の時刻は・・・10/27 23:00
え！？3時間も止まってるの！？

もちろん、エラー出力もありませんし、プロセスはちゃんと生きてます。（ただしプロセスのメモリの変動は止まったまま）
$client->requestの部分は
Symfony\Component\BrowserKit\Clientにあるメソッドです
Goutte自体はうまい感じにライブラリをラップしてるだけなので、Goutteが悪いわけではないと思います。

妄想ですが、
どっかで無限ループに陥るのかもしれません
外部ライブラリにデバッグ文埋め込むまではしていないので、確実な理由はわかりませんが、
requestメソッドの前後にログを入れたので、たしかにそこで応答が返ってこない現象が起きています。

長時間スクレイピングでこの事象に何回か遭遇し、Goutteが怖くなりました（Goutteのせいじゃない）

なのでcurlでスクレイピング処理を書き直したところ、問題は解決しました。（Goutteを使わない）

誰かこの現象になった人いないかな？
RailsなプロジェクトにJasmineを導入する

# きっかけ
ひょんなことから別のプロジェクトに新規導入することになったので、備忘録的な。
# Gemfile

以下を追加

```ruby
group :test do
  # jsのunitテストjasmineを使用
  gem 'jasminerice', :git => 'https://github.com/bradphelan/jasminerice.git'
  # ajaxモック化等。sinon.jsを使用可能に
  gem 'sinon-rails', ' =1.7.3'
  # guard-jasmineコマンドで実行出来るように。jenkins用？
  gem 'guard-jasmine', ' =1.19.0'
end
```

# 必要ファイル作成
```
$ bundle exec rails g jasminerice:install
```

spec/javascripts配下にファイルが作成される

## 作成されたファイルを修正
spec.js.coffee

```
#= require application
```

(プロジェクトによって違うかも)

application.jsをrequireしておけば必要なライブラリは大抵includeされるはず。

# 実行
適当なテストを追加した後, 

```
$ bundle exec guard-jasmine
```

以上。簡単ですね。
AndroidSDKのライセンス文書処理とjavaのデフォルトエンコーディングにまつわるトラブル

わりと特定条件下で発生する問題。（潜在的には多そうな話？）


## 特定条件下って

おおまかにこの2条件が成立すると起きる現象だと思ってます。該当しない人には無関係だと思うのでスルーしてください。

* java実行時のファイルエンコーディング設定を明示していない。もしくは、明示しているがUTF-8ではない。
* Android SDKのライセンス文書自体を取り扱う。文書の最終取り扱い先がUTF-8で動く。

## AndroidSDK のライセンス

* https://developer.android.com/sdk/terms.html
* https://dl-ssl.google.com/android/repository/repository.xml

よく見ると、Androidリポジトリのxmlに記述されているライセンス文書のうち、
セクション12.1.だけに **全角アポストロフィ** が入っている。

```
全角：12.1 -略- (including reasonable attorneys’ fees)
半角：12.1 -略- (including reasonable attorneys' fees)
```
（上がもともとあったもの、下が半角にしたもの）


## 起きた実例

[kivy-buildozer](https://github.com/kivy/buildozer) では、androidアプリのビルド時にAndroidSDKの各パッケージをダウンロードするように動いている。
これは内部的に、
> 「`$ tools/android update sdk`コマンドを実行して、出力をキャプチャして表示しつつ、[y/n]のダイアログを見つけたらyを投げる」

という処理をしているのだが、java実行時のfile.encodingがUTF-8になっていないと、コマンド側で出力されるテキストがUnicodeで出力されずに、python側がデコード失敗するというものだった。

## 対処

基本的には「呼び出す側のプログラムと呼び出される側(今回はandroid)での、処理エンコーディングのミスマッチ」が原因っぽいので次のような対処をしていけばいい？

### 1. java実行時のエンコーディングを明示して実行させる
buildozerでの対応はこれ。
`JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8` で指定できるので、あらかじめenvに入れておくか、実行時に指定できるようにしておけばOK
（多分こっちが正答）

### 2. デコード失敗を無視して処理を進める
対処の方式として一つの手ではあるけど、肝心なところがこの現象に引っかかったりすると良くない。
あと、ライセンス文書を加工するのってまずいような。

### 3. java のエンコーディングに呼び出し側を合わせる
思いつきで書いたけどたぶん無理。直前にわからないから

### 4. 呼び出す側をjavaで作る
もともと、javaのプログラム上でandroidコマンドを実行する分にはエンコーディングが揃ったままなので行ける気もする。試してないけど

### 5. androidコマンドは別に実行する
buildozerのケースでも、失敗後にandroid-GUIでパッケージをインストールさせてしまえば以降はそんなに問題にならないとは言える。
でもそれじゃせっかくのツールが意味が無いかな、と。


## 所感
書けば書くほど、レアケース感がすごい。（javaのファイルエンコーディングに関する記事はBlogでかなり見るので、あらかじめ指定してそうなのが強い）
が、後で思い出す時に便利そうなのと、Pull Requestを投げるいい機会になったので、とりあえず書いてみた。
javascriptでtableをループ その2-2

**HTML直書きしないことを想定してtrごと回してみたバージョン**

```lang:html
<table>
  <thead>
    <tr>
      <td>項目1</td>
      <td>項目2</td>
      <td>項目3</td>
    </tr>
  </thead>
  <tbody id="tbodyID">
    <!-- ここをループ -->
  </tbody>
</table>
```

```lang:javascript
 <script>
      /*ページ(DOM)読み込み後に実行*/
      window.onload = function(){

          //tbodyのIDを取得(この中で処理します)
          var tbody = document.getElementById('tbodyID');

          for (i = 0; i < 5; i++){
              //tr エレメントを新規作成(ただ生成するだけ)
              var tr = document.createElement('tr');
              //列(td)用のループ
              for (j = 0; j < 5; j++){
                  //tdエレメントをを生成
                  var td = document.createElement('td');
                  //tdの中に入れたいモノをセット
                  td.innerHTML = 'こんにちは' + j;
                  //生成したtdをtrにセット
                  tbody.appendChild(td);
              }//列用のループ閉じ
              //tr エレメントをtbody内に追加(ここではじめて表示される)
              tbody.appendChild(tr);
          }//行用のループ閉じ

      };
  </script>
```
SciPyのバージョンがあがらない(Mac)


pipでSciPyのアップグレードを行ったのですが、呼び出すと昔のバージョンが使われてしまってました。
参考サイト通りにやっただけなのですが、色んなマシンでやらないといけないのででまとめ直しておきます。

#環境
- OS
 - Mac OS X 10.9 (Mavericks)
- Python
 - 2.7.5
- scipy
 - 0.14.0

#参考
- [Mac: How to Upgrade to SciPy 0.13](http://mogproject.blogspot.jp/2014/03/how-to-upgrade-to-scipy-013.html)
本当にこの通りやりました。ありがとうございます。

#手順
最初に現在のバージョンを確認しておきます。
```console
$ python -c "import scipy; print scipy.version.full_version"
0.11.0
```

SciPyを普通にpipでアップグレードします。

```console
$ sudo pip install scipy --upgrade
 [~/Downloads/KDD_2012_Track2-master/modeling]
Downloading/unpacking scipy from https://pypi.python.org/packages/cp27/s/scipy/scipy-0.14.0-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl#md5=d3728a6d43c326500
3db3781cbd4660f                                                                                                                                                                       
  Downloading scipy-0.14.0-cp27-none-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.whl (26.7MB): 26.7MB downloaded                                                           
Installing collected packages: scipy                                                                                                                                                  
  Found existing installation: scipy 0.11.0                                                                                                                                           
    Uninstalling scipy:                                                                                                                                                               
      Successfully uninstalled scipy                                                                                                                                                  
Successfully installed scipy                                                                                                                                                          
Cleaning up...
```

バージョンを確認してみます。

```console
$ pip show scipy
---
Name: scipy
Version: 0.14.0
Location: /Library/Python/2.7/site-packages
Requires: 
```

確かにアップグレードされているようです。
Pythonから呼び出してバージョンを確認してみます。

```console
$ python -c "import scipy; print scipy.version.full_version"
0.11.0
```

これが何故か`0.11.0`になってしまっています。
旧バージョンが検出されているとのことなので、私は消しました。

```
$ sudo sudo rm -rf /System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/scipy
```

この状態で確認すると
```console
$ python -c "import scipy; print scipy.version.full_version"
0.14.0
```

無事にアップグレードされました。
Android のボタンクリックイベントをスキップしたいとき

# 概要

Button オブジェクトにイベントリスナーが登録されている状況下で、

1. 特定の条件下だけボタンをクリックイベントをスキップしたい。
2. ボタンの画面表示をグレーアウトさせたくない。

# うまくいかない方法

### 方法： setEnabled(false)

`setEnabled(false)` を呼ぶことでクリックできなくすることはできる。
しかしこの場合はボタンがグレーアウト表示されてしまうため目的 2 に合致しない。

### 方法：View.setClickable(boolean)

`View.setClickable(boolean)` という、目的を叶えられそうな関数があるが、この関数は setOnClickListener にオブジェクトが登録されていると今回の目的どおりに動作しない。
リスナーが登録されているとボタンの clickable 属性が false になっていても自動的に true に変更されてしまうとのこと。

【参考】
http://mycode.snow69it.net/864/
http://stackoverflow.com/questions/18825747/button-setclickablefalse-is-not-working

# うまくいった方法

### onTouch 関数で true をリターン

スキップさせたいボタンに対して OnTouchListener を登録して、
スキップさせたい条件のときには true をリターンするようにしたらうまくいった。

### サンプルコード

```java

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

	    final TextView text = (TextView)findViewById(R.id.textView);

	    Button button = (Button)findViewById(R.id.button);

        // ボタンがクリックされたらテキストビューにハローワールドを表示する
	    button.setOnClickListener(new View.OnClickListener() {
		    @Override
		    public void onClick(View v) {
			    text.setText("hello, world");
		    }
	    });

	    button.setOnTouchListener(new View.OnTouchListener() {
		    @Override
		    public boolean onTouch(View v, MotionEvent event) {

            if(/* スキップしたい条件 */) {
			    return true;
            }
            
            return false;
		    }
	    });

    }

  /* ... */

}

```
javascriptでtableをループ その2-1

**HTML直書きしないことを想定して回してみたtdバージョン**

```lang:html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <title>外部jsからtbody内を繰り返し処理したい</title>
</head>
<body>

<table>
  <thead>
    <tr>
      <td></td>
    </tr>
  </thead>
  <tbody>
    <tr id="tbodyID">
      <!--ここを回す-->
    </tr>
  </tbody>
</table>
</body>
</html>
```

```lang:jsvascript
<script>
    /*ページ(DOM)読み込み後に実行*/
    window.onload = function(){

        /*tbodyのIDを取得(この中で処理させる)*/
        var tbody = document.getElementById('tbodyID');

        for (i = 0; i<5; i++){
            //tr エレメントを新規作成(ただ生成するだけ)
            var tr = document.createElement('tr');
            tr.innerHTML='こんにちは'+i;
            //tr エレメントをtbody内に追加(ここではじめて表示される)
            tbody.appendChild(tr);
        }

    };
</script>
```
CentOS 7(XFS)でLVMディスク拡張でハマったこと

CentOS 7でLVMディスク拡張するときに、ハマったことがあるので共有。

LVの拡張まで行って、最後にファイルシステムを拡張しようとするときに、CentOS 6の時代と同じくresize2fs とやると以下のエラー

```
[root@localhost ~]# resize2fs /dev/centos/root
resize2fs 1.42.9 (28-Dec-2013)
resize2fs: Bad magic number in super-block while trying to open /dev/centos/root
Couldn't find valid filesystem superblock.
```

調べていくと、CentOS 7 からデフォルトになっているXFSでは`resize2fs`は利用できないということ。

XFSでは`resize2fs` の代わりに `xfs_growfs` を使えばＯＫ

```
[root@localhost ~]# xfs_growfs /dev/centos/root
meta-data=/dev/mapper/centos-root isize=256    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 13107200 to 39321600
[root@localhost ~]# echo $?
0
```

うまくいきました。
AngularDart入門 まとめ

AngularDart 1.1の入門記事まとめです。

## 第1回 はじめてのAngularDart
AngularDartを使うための準備と、最も単純なバインディングについて
http://qiita.com/laco0416/items/5cad659d6b278c4a2081

## 第2回 HelloWorld改
AngularDartのモデル、スコープ、コンポーネントを知る
http://qiita.com/laco0416/items/d8cbc50e15b39ce9be35

## 第3回 Angular Components
コンポーネントを使って独自elementを作る
http://qiita.com/laco0416/items/1e969a20c92b9e3c0a3c

## 第4回 既存のHTML要素を拡張する
デコレーターを使って独自attributeを作る
http://qiita.com/laco0416/items/f23289ad85e5715a1d33

## 第5回 FormatterとService
フォーマッターとサービスの使い方と作り方
http://qiita.com/laco0416/items/08ddc2f674b2407f0669

## 第6回 ルーティングとビューの切り替え
URLのルーティングとビューの切り替え
http://qiita.com/laco0416/items/f540cf4a40d5a8218d73

## 第7回 デプロイ
AngularDartアプリをJavaScriptに変換する
http://qiita.com/laco0416/items/18e36df9439a8844201c
homebrew-caskを単純なダウンローダとして使う

# 目標

こういうことをする。

![ss3.png](https://qiita-image-store.s3.amazonaws.com/0/19622/dc97123c-8368-cefe-7a29-108807f6790f.png)

# 理由

1. __pkg形式__で配布されているアプリケーションはインストール時にオプションをカスタマイズ出来ることが多い。
2. にも関わらず`brew cask install`を使うと、それらのオプションを選べずにインストールされてしまって悲しい。
3. `brew cask`でfetchまでは自動化して、インストール自体は手動でやろう(スマートではないが。)

# 方法

## 準備

以下のようなシェルスクリプトを書いて、__/usr/local/bin/brew-smash__ など任意の実行パスに配置し、`chmod +x /path/to/brew-smash`等で実行権限を与える。

```bash:/usr/local/bin/brew-smash
#!/bin/sh
# Usage: brew smash app-name

if [ -z "$1" ] ; then
  echo "Usage: brew smash app-name"
  exit 1
fi

if [ ! -d "Casks" ] ; then
  KEEP_CLEAN=true
else
  KEEP_CLEAN=false
fi

HOMEBREW_CACHE=. brew cask fetch "$1"

if [ "$KEEP_CLEAN" = true ] ; then
  rm -r "Casks"
fi
```

もしくは直接ダウンロードしても良い。

```session
$ curl https://gist.githubusercontent.com/uetchy/eb625f922eff16eb404b/raw/brew-smash.sh -o /usr/local/bin/brew-smash
$ chmod +x /usr/local/bin/brew-smash
```

## 実際に使う

以下のように`brew smash`コマンドを叩く

```bash
$ brew smash send-to-kindle
==> Fetching resources for Cask send-to-kindle
==> Downloading https://s3.amazonaws.com/sendtokindle/SendToKindleForMac-installer-v1.0.0.220.pkg
######################################################################## 100.0%
==> Success! Downloaded to -> ./send-to-kindle-1.0.0.220.pkg
```

# シェルスクリプトの解説

難しいことはやってないが、`brew cask fetch`コマンドはキャッシュ先に__Casks__ディレクトリを生成するので、それを除去している。また、元々カレントディレクトリにCasksという名前のディレクトリがある場合、それを削除してしまわないようにしている。

# 本当にやりたかったこと

こういう機能いれてくれ

```bash
$ brew cask install virtualbox
==> Fetching resources for Cask virtualbox
==> Downloading http://download.virtualbox.org/virtualbox/4.3.18/VirtualBox-4.3.18-96516-OSX.dmg
######################################################################## 100.0%
==> Cask virtualbox has installation options
==> Do you need to install 'Oracle VM VirtualBox Command Line Utilities'? [y/n]
==> y
==> Success!