OmniAICreator/Qiita-1.07M huggingface dataset:
ListViewで学ぶコレクションのBind通知


## ListViewの実装
まずは最小構成でListViewを実装。

```xml:MyNote.xaml
     <ListView x:Name="lstMemo">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell  Text="{Binding Title}"/>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
```

```csharp:MyNote.xaml.cs
    public partial class MyNotePage : ContentPage
    {
        private List<MemoData> memos;

        public MyNotePage()
        {
            InitializeComponent();

			// データを設定
			memos = new List<MemoData>();
			for (int i = 0; i < 10; i++)
			{
				MemoData memo = new MemoData();
				memo.Title = "title" + i.ToString();
				memos.Add(memo);
			}

            // リストビューのソースに設定
            lstMemo.ItemsSource = memos;
        }
    }


    public class MemoData
    {
        public string Title
        {
            get;
            set;
        }
    }
```

実行すると以下の画面が表示されます。
<img width="680" alt="スクリーンショット 2017-07-05 23.03.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/38569388-0dd3-2d93-2af6-886bc734055d.png">


## コレクションが変更された場合のバインド通知
確認用のボタンを実装しコレクションに対してレコードを追加してみます。

```xml
<Button x:Name="btnListAdd" Text="リスト追加" />
```

```csharp
// ボタンイベント
btnListAdd.Clicked += (sender, e) => {
     memos.Add(new MemoData() { Title = "NewData" });
};
```

この状態で実行ボタンを押下しても

<img width="680" alt="スクリーンショット 2017-07-05 23.09.29.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/4b5e95f5-ee9d-4c3b-dfab-61a3ff0743cd.png">

リストには追加されず。

コレクションの要素を動的にバインド通知を行う場合は、ObservableCollectionを利用します。
List→ ObservableCollectionに変更するだけでOKです。

```csharp
//private List<MemoData> memos;
private ObservableCollection<MemoData> memos;
```

```csharp
//memos = new List<MemoData>();
memos = new ObservableCollection<MemoData>();
```

再ビルドし確認すると今度はリストに追加されるようになります。
<img width="680" alt="スクリーンショット 2017-07-05 23.15.16.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/8055d51b-709a-92a0-2cc3-c50cbfb6458e.png">



## コレクション内のアイテムの要素が変更された場合のバインド通知
コレクション内部の要素を更新してみます。

```xml
<Button x:Name="btnItemUpdate" Text="要素更新" />
```

```csharp
btnItemUpdate.Clicked += (sender, e) => {
    memos[0].Title = memos[0].Title + "update";            
};
```

ボタンをクリックしてみますが、更新はされず。
<img width="680" alt="スクリーンショット 2017-07-05 23.32.58.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/2b26ec04-c56a-c869-bc83-873f9501aed8.png">

コレクション内の要素を動的にバインド通知を行う場合は、
設定しているクラスにお馴染みの変更通知イベントを設定する必要があります。


```csharp
    public class MemoData : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private string title;
        public string Title
        {
            get{ return this.title; }
            set{
                if (title != value)
				{
                    title = value;
					if (PropertyChanged != null)
					{
						PropertyChanged(this, new PropertyChangedEventArgs(nameof(Title)));
					}
				}
            }
        }
    }
```

再ビルドして実行するとBind通知が行われる事が確認できます。
<img width="680" alt="スクリーンショット 2017-07-05 23.38.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/48623/edca7ee8-fd0e-9104-fe6c-89e80351bc59.png">
MacBook 12inch 2017のCPUをいろいろ測定してみた

新しく macbook 2017を購入したので、CPUについてちょっと検証します。
スペックは、 i7, 16Gメモリ, 256GB SSDです。

##Intel Power Gadgetを利用する

Intel Power Gadgetを利用して、CPUの動作周波数を見てみました。
結果は以下の通り。

平常時

<img width="472" alt="スクリーンショット 2017-06-30 22.26.00.png" src="https://qiita-image-store.s3.amazonaws.com/0/44954/7f30af15-9676-e9fa-8582-a7b90b071a91.png">


最低周波数の 1.30GHzで安定しました。消費電力は、0.25W... すごい...
熱はだいたい50℃いかないくらいです。

負荷時

<img width="444" alt="スクリーンショット 2017-06-30 22.20.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/44954/775f7f0b-6ee4-c2af-7d9e-909028c92060.png">


CPUが100%に張り付くyesコマンドを実行し、負荷を見てみます。
結果はこんな感じ

3.2GHzまでブーストした後、2.5GHzで安定しました。
3.2GHz出た際は、96℃くらいだった温度は、2.5GHzでは87℃くらいで安定します。
サーマルスロットリングが発生しているようです。

コマンドを止めたら、すぐにCPUは落ち着いたみたいです。


##プロジェクトをビルドしてみる

python3.5.2のビルドを測定しました。

time makeした結果が以下。

```
make  67.19s user 6.03s system 94% cpu 1:17.46 total
make  62.36s user 5.39s system 94% cpu 1:11.71 total
```

time make -j3 した結果は以下。

```
make -j3  112.48s user 8.07s system 291% cpu 41.401 total
make -j3  113.23s user 8.11s system 291% cpu 41.662 total
```
中々速い。

MacBook Pro Early 2015 (i5 2.7GHz, 8G)と比較してみました。

make

```
make  69.58s user 6.72s system 93% cpu 1:21.63 total
make  76.14s user 7.29s system 92% cpu 1:29.84 total
```

make -j3

```
make -j3  112.59s user 10.37s system 279% cpu 43.996 total
make -j3  112.13s user 10.35s system 280% cpu 43.737 total
```
MacBook 12inchのほうが速いだと。。。

MacBook Proは、初期化してからまだ間もないため、本来の性能が出ているはずです。 驚きだ。。。

買ってよかった MacBook

###転載

以下の自ブログより転載です。
http://yujilow.hatenablog.com/
ElixirでExcelファイルを読み込む


Elixirの練習にと、Excelの特定のセルの値からCSVを吐いてみた。
もとのExcelのファイルレイアウトは以下の感じ。
あえて、空欄があったり、文字にスペースが含まれていたりするので、良い題材。

Excel読み込む為に、Excelion というライブラリを使用した。


### 入力用Excelファイル

![スクリーンショット 2017-07-05 22.20.06.png](https://qiita-image-store.s3.amazonaws.com/0/3184/36ef815e-4af5-5ec3-fe06-59e81fa319d7.png "スクリーンショット 2017-07-05 22.20.06.png")

何を処理しているかは、ソース内にコメントで説明。


```convert_ex_csv.ex

defmodule ExcelSample do
    def convert do
        sheet_no = 0
        result = "roster.xlsx"  #=> 入力Excelファイル名
          |> Excelion.parse(sheet_no, 1)  # ExcelionでExcelファイル読み込み
          |> elem(1)                      # 戻り値の要素1番目を取得
          |> Enum.map(&([Enum.at(&1,2), Enum.at(&1,7)]))  # Cell[C]列と[H]列を指定
          |> Enum.filter(&(Enum.at(&1,0) != ""))  # 空欄行を排除
          |> Enum.filter(&(Regex.run ~r{[0-9]}, Enum.at(&1,0)))  # ヘッダ行を排除(背番号のみ)
          |> Enum.map(fn([no, name])->[no, String.split(name)] end) # Cellデータのスペース除去
          |> Enum.map(fn([no, [last_name, first_name]]) -> "\"#{no}\",\"#{last_name}\",\"#{first_name}\"\n" end)   # CSV整形

        File.write("roster.csv", result)  # ファイル出力
    end
end

```

吐かれたCSVは下記。

### 出力CSV

![スクリーンショット 2017-07-05 22.23.01.png](https://qiita-image-store.s3.amazonaws.com/0/3184/b0a83531-006f-dcc7-8d85-0a20325f50d6.png "スクリーンショット 2017-07-05 22.23.01.png")

時間が掛かったが、慣れてくると結構楽しい。
masterブランチを別のブランチに書き換え方法

作ったブランチ（sub-branch）を用いて、masterブランチを完全に書き換える。

```bash

$ git checkout sub-branch
$ git merge -s ours master
$ git checkout master
$ git merge sub-branch
$ git push origin master
```

__-s ours = --strategy=ours__
```
Use the given merge strategy; can be supplied more than once to specify them in the order they should be tried. 
If there is no -s option, a built-in list of strategies is used instead (git merge-recursive when merging a single head, git merge-octopus otherwise).
```

以上です。

参照
[git-merge](https://git-scm.com/docs/git-merge)
Java REPLでメソッド/フィールド一覧を簡単に確認する方法

今さらな話題です．

Javaでプログラム中にメソッド/フィールド一覧が欲しいときに[Java REPL](http://www.javarepl.com/)を使うと簡単に調べられます．もちろん，Javaプログラムとして記述しても良いですが，**簡単に**調べたい場合にお使いください．

### メソッド/フィールド一覧

以下の例では、Stringクラスのメソッド/フィールド一覧を表示しています．調べたいクラス名に置き換えてお使いください．

```java:Stringクラスのメソッド一覧
java> String.class.getMethods()
```
```java:Stringクラスのメソッド一覧
java> String.class.getFields()
```

### 全メソッド/全フィールド一覧

```getMethods``` および```getFields```メソッドは，publicなメソッド/フィールドしか表示しません．privateなどを含めた全メソッド/フィールドを表示したい場合は以下のように実行してください．

```java:Stringクラスの全メソッド一覧
java> String.class.getDeclaredMethods()
```

```java:Stringクラスの全フィールド一覧
java> String.class.getDeclaredFields()
```

### 全メソッド/全フィールド一覧（加工版）
このままだと見づらいという方は，少し長くなりますが以下のように実行してください．

```java:Stringクラスの全メソッド一覧（加工版）
java> Arrays.asList( String.class.getDeclaredMethods() ).forEach( System.out::println )
```

```java:Stringクラスの全フィールド一覧（加工版）
java> Arrays.asList( String.class.getDeclaredFields() ).forEach( System.out::println )
```

### 標準で読み込まれないクラスの場合
Java Replでは標準で読み込まれないクラスの場合，事前にimportするかパッケージ名込みで記述してください．

```java:Colorクラスの全メソッド一覧（加工版）
java> Arrays.asList( java.awt.Color.class.getDeclaredMethods() ).forEach( System.out::println )
```
## おわりに

以上，5年から10年ほど遅れた話題でした．

## 参考

[Java：クラスの全フィールドの名前と値の一覧を出力する方法](http://did2memo.net/2013/09/10/java-reflection-how-to-display-all-java-field/)

[JavaのリフレクションAPIでフィールド取得](http://pppurple.hatenablog.com/entry/2016/08/01/225120)
Linux で openFrameworks を実行するときに便利な shell script


こんな感じの shell script を run.sh とかで保存して。

```
#!/bin/sh

curdir="${PWD##*/}"
rm bin/$curdir
make -j$(nproc)
make run
```

特定のアプリケーションのディレクトリへ移動して、以下のコマンド実行してやれば、だいたい動く。

```
$ sh run.sh
```

便利だ！！！！
アプリケーションプールに既定値を設定して作成

サーバー全体で既定値を統一できるなら前半の内容で。
既定値がある場合は後半のテンプレート用意する感じになります。
いずれにしてもIIS操作するので管理者権限必要です。

## 環境

| | |
| ---- |  ---- | 
| OS | Windows Server 2012 R2 |
| PowerShell | 5.0 | 


## 既定値のアプリケーションプールを作成する

IISマネージャーからも作成できますが、何台も同じ事やる場合はこっちが楽です。

```PowerShell
# IIS管理モジュール
PS> Import-Module WebAdministration
# 既定の設定でアプリケーションプールを作成
PS> New-WebAppPool sample

Name                State        Applications
----                -----        ------------
sample              Started
```

### 既定値の設定方法

こちらもPowerShellで。。。は面倒だったのでIISマネージャー使います。
`PowerShell` 使う場合は `Set-ItemProperty` とか駆使してできるかも(；´∀｀)

- 対象サーバーを選択
    - アプリケーション プール
        - 操作 > アプリケーション プールの既定値の設定

構成エディタからいじる場合は、`system.applicationHost/applicationPools` > `applicationPoolDefaults` あたり。

`New-WebAppPool` はここの設定値を元にアプリケーションプールを作成します。


## 既存のアプリケーションプールをコピーする

うちの会社で採用した方法がこっち。
アプリケーションプールの用途によって設定が微妙に違ったので `applicationPoolDefaults` は使わなかった。
今考えると可変個のプールは全部同じ設定だったので最初の方法でもよかったかもしれないけど(´・ω・｀)
ちなみに既存からのコピーはIISマネージャーではやり方わかりません。

```PowerShell
# IIS管理モジュール
PS> Import-Module WebAdministration
# アプリケーションプールのルート
PS> cd IIS:\AppPools
# 既存のコピー
PS> cp .\sample .\sample2 -Recurse
# 設定の調整、うちの場合はテンプレートでは autoStart = Falseだったので明示的な開始が必要
PS> Start-WebAppPool sample2
PS> Get-Item sample2 | select autoStart,state

autoStart state  
--------- -----  
     True Started
```

これでやると `applicationPoolDefaults` 以外の既定値でアプリケーションプールを新規に作成できます。


### ハマりポイント?

コピー元のアプリケーションプールに、リサイクル > 特定の時間 の設定を追加していると、コピー時にエラーで落ちていた。
そのためテンプレートには特定の時間 のリサイクル設定を入れないでコピー後に無理やり設定していた。

```PowerShell
PS> Set-ItemProperty -Path IIS:\AppPools\[apppool] -Name Recycling.periodicRestart.schedule -Value "01:30:00"
```

。。。だったけど今試したら問題なくコピーできた。。。ここは原因不明です(；´Д｀)
Laravelの.envファイルをアップロードするdeployerレシピ


deployerのLaravelレシピには.envファイルをアップロードするタスクが入ってなかったので作成した。deploy.phpでrequireすれば`dotenv`タスクが使えるようになる。

<script src="https://gist.github.com/grohiro/3733be33da4a36f363a135c13530c4c7.js"></script>
https://gist.github.com/grohiro/3733be33da4a36f363a135c13530c4c7

デプロイするたびにアップロードされてしまうと間違えることもありそうなので`deploy`タスクに入れるのはおすすめできない。ファイルを更新したいときだけ手動でタスクを実行したほうがいいかも。

アップロードするファイルはアプリケーションのルートに保存しておく。deployerのstageが`prod`のときは`.env.prod`がアップロードされる。

```console
# .envファイルをアップロードしてLaravelのconfigキャッシュも再生成する
$ deployer dotenv prod

# アップロードだけしたいときは dotenv:upload を使う
$ deployer dotenv:upload prod
```
Android と iOS の、複数の非同期処理の完了を待つ処理

はい
##クラス
|Android|iOS|
|:--|:--|
|java.util.concurrent.**[CountDownLatch](https://docs.oracle.com/javase/jp/8/docs/api/java/util/concurrent/CountDownLatch.html)**|**[DispatchSemaphore](https://developer.apple.com/documentation/dispatch/dispatchsemaphore)**|
##例
#####CountDownLatch
```java
public void Test() {

    int max = 10;

    CountDownLatch count = new CountDownLatch(max);

    for (int i=0; i < max; ++i) {
        new Thread() {
            public void run() {
                Log.d("Hoge", "count = " + i);
                count.countDown();
            }
        }.start();
    }

    count.await();

    Log.d("Hoge", "finish");
}
```
#####DispatchSemaphore
```swift
func Test() {

    let max:  Int = 10;

    let sema: DispatchSemaphore = DispatchSemaphore(value: 0) // <- 注意

    for i: Int 0..<10 {
        DispatchQueue.main.async {
            print("count =", i)
            sema.signal()
        }
    }

    for _ in 0..<max { sem.wait() } // <- はい

    print("finish")
}
```
##動作確認
してない
##キーワード
排他制御
##^ν^「こうやったほうがいいよ！」
きいてないです
iMac (MID 2010)のクリーンインストール

プログラミング技術と全く関係ないけど、長年の使用でもっさりモサモサぜんぜん仕事が進まなくなった古いiMacをきれいにしようとしたらハマりまくったので解決までの道のりをまとめておきます。

Appleサポートのチャット支援は本当にありがたかったです。

## こんな方におすすめ。
- 古いiMacをきれいにしたい。
- Wi-Fiしか使えない状況。

## 遭遇したハマリポイントは３つ
### 1. メインのHDD初期化しておきながらmacOSインストールできずに電源OFFしちゃった
そもそもcommand+Rで、macOSユーティリティのディスクユーティリティからHDD初期化してすぐにmacOSインストールしようとしたんだけど、Apple IDを２ファクタ認証にしていたから普通のパスワードが使えなくて、３回リトライしてからそれに気づき、その日は「これ以上認証はできない」と言われて、諦めて電源OFFして後日にまわしてしまった。メモリ上にmacOSユーティリティがいる状態なだけで消したら終わり！
> ### 解決方法
> #### 困るからmacOSインストールでApple ID入れる前に2ファクタ認証は一旦切っとこう
> 2ファクタ認証では主端末（僕の場合はiPhone）に入れてる同じAppleIDに確認が行き、6桁の数字が出るんだけど、なんかしらんけど出たらすぐ消えたりする。で、macOSインストール時はApple IDのパスワードに続けて末尾にこの6桁の数字を入れなきゃいけない。それに気づくまでに何度かリトライしているうちに扱えなくなったという始末。
> それを踏まえたうえで、HDD初期化したらそれを実行中のmacOSユーティリティも初期化されることを忘れるな！ってことね。

### 2. インターネットリカバリでWi-FiのSSID選択画面が出ないことを当たり前と思ってた
電源切っちゃったので、command+RしてもmacOSユーティリティは表示されず、インターネットリカバリが始まります。ネット経由でmacOSユーティリティを拾ってきて実行するってやつ。
しかし古いiMacのせいなのか、インターネットリカバリの準備（１２分位かかる）が終わってもmacOSユーティリティが開かない！アップルロゴが出たままうんともすんとも言わなくなっていた。
> ### 解決方法
> #### option起動よ！
> ネット上のみんなは遭遇していなかった風。普通にWi-FiのSSID選択が出ている様子。でも僕の使っているiMac(MID 2010)では出ない！
> 実はoption押しっぱなし起動であればWi-Fi接続してから起動ディスク（ネットディスクや、インターネットリカバリ）のアイコンをクリックして実行できるってことがわかりました。そういえばBootcamp入れてたときにoption起動を使った覚えがはるか昔にあったことをすっかり失念してましたわ。

### 3. Wi-Fi接続できたからずっと繋がっていると思ってた。
ようやくmacOSユーティリティが開き、macOS Sierraインストールが選べるように！でも、「macOSをダウンロードして復元するために、お使いのコンピュータの適格性がAppleで検証されます。」と表示されて「続ける」をクリックしても、その画面から次に進まなかった。本当は同意画面に遷移するはずなのに。なぜなのよーなぜー。
> ### 解決方法
> #### 画面右上よく見てー！
> option起動で認証したWi-FiのことなどスッカリmacOSユーティリティちゃんは知らぬ存ぜぬらしい。Wi-Fiアイコンが灰色ですがな！
> 接続したら、ようやくmacOSインストーラは進みましたとさ。

###以上！
ちなみに、Sierraインストール中に画面が消えてBeep音が1回鳴った時は、完全に文鎮化したかと思って焦りました。
その時は電源ボタンを何度押しても、押し続けても、うんともすんとも言わなかったです。でも放っておけば大丈夫。
これが噂のEFI ROM アップデート中ってやつだったのかもしれません。
AWS CodeDeploy の Auto Scaling対応

以前、 [AWS CodeDeployを使ってPHPアプリケーションをデプロイしてみた](http://qiita.com/kazumax55/items/38349431b8db107fd05d)
という記事でAWS CodeDeployの一連の流れについてまとめましたが、
今回はAWS CodeDeployをAuto Scalingと連動させてみようと思います。

## Auto Scaling is 何？
Auto Scalingとは、ざっくりいうとCPU使用率などの閾値や、あらかじめ指定したスケジュール等に起因してインスタンス数を自動的に増減する仕組みの事です。

## Auto Scaling対応のデプロイ
Auto Scalingに対応したデプロイを実現するためには、

**A:** Auto Scaling起動時のAMIを、常に最新ソースコードがデプロイ済みのものになるよう管理する
**B:** Auto Scalingによって起動されたインスタンスに対して、起動時に最新のソースコードが自動でデプロイされるようにする

等の仕掛けが必要となります。

**A** の場合、日々の運用の手間が増える事となります(デプロイイベントをフックして、Packer等でAMI化とAuto Scallingの起動設定修正を自動化する等しとかないと辛い)。
**B** の場合、自前でデプロイ処理を書いて起動時に呼び出す。または CodeDeployを利用する等の方法が考えられます。

## CodeDeployでやる場合
CodeDeployでやる場合、以前紹介したEC2に指定したタグを元にデプロイ対象を特定する方法でやろうとすると、

* 新規起動したデプロイ対象のインスタンスだけを対象とするタグを付与する必要がある
* 複数インスタンスが同時に起動されることを考慮すると、２重でcodedeployを起動できなくする排他制御を入れる または インスタンス毎に単一のタグが振られるようにする必要がある

など考慮する必要があり、とても面倒な事が予想されます。
そこでCodeDeployでは別の方法として 

AWS CodeDeployをタグではなくAuto Scalingと連動させるという方法を取ることができます。

AutoScalingと連動させることにより、新規起動したインスタンスだけを対象に最新のソースを自動でデプロイしてくれるようになります(*1)。

> **Q: AWS CodeDeploy は Auto Scaling とどのように連動しますか?**
Auto Scaling Group をデプロイグループと関連付けることで、新しく開始したインスタンスに常にアプリケーションの最新のリビジョンがデプロイされるようにできます。Auto Scaling Group に新しい Amazon EC2 インスタンスが追加されるたびに、まず状態が Pending になり、前回デプロイグループで成功したリビジョンのデプロイが新しい Amazon EC2 インスタンスに対して開始されます。デプロイが正常に完了すると、Amazon EC2 インスタンスの状態が InService に変更されます。デプロイに失敗した場合、その Amazon EC2 インスタンスは終了し、新しい Amazon EC2 インスタンスが Pending の状態で開始されます。その後新しい Amazon EC2 インスタンスに対してデプロイが開始されます。

AWS Codedeployの[よくある質問](https://aws.amazon.com/jp/codedeploy/faqs/)より引用

## CodeDeployのAuto Scaling対応
細かい部分はほぼ前エントリと同じなので割愛し、変更点のみを記載します。

#### Auto Scalingの設定
事前にデプロイ対象のAuto Scalingグループと起動設定を作成しておきます。
ググればたくさん情報が出てくるので詳細は割愛します。

#### CodeDeployの設定
基本的には前エントリの設定と同じなので、変更点のみを記述します。
インスタンスの追加時に、タグタイプを `Amazon EC2` ではなく `Auto Scaling group` にします。

![c40f30f3-ef4f-62a3-59e8-24d736cbce09.png](https://qiita-image-store.s3.amazonaws.com/0/38574/6b862b06-b505-3588-6908-7d1c4a3c7f29.png)

これだけ!とても簡単ですね！

これで手動デプロイ対象が、オートスケールにより起動中のインスタンス全てとなり、
オートスケールによりインスタンス数が増えた際は、新規インスタンスに対してのみ自動的にデプロイが実行されるようになります。
※新規インスタンスに対して自動デプロイを成功させる為には、最低1回手動デプロイを実行しておく必要があります。


## まとめ
オートスケール対応のデプロイはCodeDeployを使うことでとても簡単に実現できますね！
CodeDeployを使って快適なDeployライフをお楽しみください！
Twitterのストリームをさくらのクラウドに格納した

さくらのクラウドが提供しているデータベースにTwitterのストリームのデータを格納する方法のメモです。

# やりたいこと
Twitter Streaming APIからパブリックタイムラインを取得し、さくらのクラウドのデータベースアプライアンス（MariaDB）にツイートをどんどん格納する。

# やったこと

## さくらのクラウドでデータベースアプライアンスの作成
さくらインターネットのクラウドサービスが提供している[データベースアプライアンス](http://cloud.sakura.ad.jp/specification/option/index.html#option-content01)を利用・
これはコントロールパネルから作成。
1日1回の自動でのバックアップ取得やphpMyAdminが組み込まれておりWebUIから全部完結するのは便利。
あと、IP制限もコントロールパネルから設定できるので手軽でした。

## TwitterのAPIキーの取得
[Twitter Developers](https://dev.twitter.com/)からアプリケーションのカスタマーキーなどを取得


## データを集めるFluentdサーバの作成、設定

今回はCentOS 7のサーバを作成。
そこにfluentdなどを入れてゆきます。

* [fluentd CentOS7 インストール](http://docs.fluentd.org/v0.12/articles/install-by-rpm)
* [fluent-plugin-twitter](https://github.com/y-ken/fluent-plugin-twitter)
* [fluent-plugin-mysql](https://github.com/tagomoris/fluent-plugin-mysql)

これらをインストールして  td-agent.conf に追記します。

```
<source>
  @type twitter
  consumer_key hogehoge
  consumer_secret hogehoge
  access_token hogehoge
  access_token_secret hogehoge

  tag input.twitter.sampling
  timeline sampling
  lang ja
  output_format flat
</source>

<match input.twitter.sampling>
  @type mysql
  host 192.168.10.100
  database sakura
  key_names id, user_id, text, created_at
  sql INSERT INTO publictw (id, userid, text, createat) VALUES (?, ?, ?, STR_TO_DATE(?, "%a %b %d %H:%i:%s +0000 %Y"))
  username sakura
  password hogehoge
  flush_interval 10s
</match>
```

hogehogeの部分は適切な値に変更してください。
MySQLの設定はデータベース名やUsername/Passwordもコントロールパネルから設定したものを入力してください。ちなみに今回はデータを格納するためのテーブルとして `publictw` と言うものを作成しています。


# 結果
![count.PNG](https://qiita-image-store.s3.amazonaws.com/0/190723/b745cc81-b0b2-dc22-91d4-272fb2771c41.png)
ちゃんとRDBMSにデータを格納できました。

![select.PNG](https://qiita-image-store.s3.amazonaws.com/0/190723/d0095c40-c459-367f-58cf-c51d070f0c50.png)
こんな感じで見えます。


![qiita.PNG](https://qiita-image-store.s3.amazonaws.com/0/190723/a6beb1f8-1995-eef9-f708-cf2750bb74ec.png)
RDBMSなのでもちろんLike構文とか使えます。

こういうデータはDynamoDBなんかのNoSQLデータベースに格納するのが鉄板かなと思っていたんですが、本物のSQL構文が使えデータの読み書きに課金されないRDBMSが今のところはベストだと思います。
RDBMSはデータ量が増えたときに辛くなりますが、それくらいのデータを蓄えてから考えたいと思います。

# 参考情報
以下の情報を参考にさせていただきました。ありがとうございます。

* [【特別連載】 さぁ、自然言語処理を始めよう！（第1回： Fluentd による Tweet データ収集）](https://datumstudio.jp/backstage/569)
* [さくらのクラウドニュース データベースアプライアンス](https://cloud-news.sakura.ad.jp/database/mariadb/)
AWSを個人で使うときにハマったメモ

# とにかく暇だった
のでとりあえずAWSで個人環境作って置こうと思ったのでメモる。
## クレジットカードは無いと駄目らしい。
デビットカードか、ちゃんとしたクレジットカードじゃないと駄目らしい
## EC2のインスタンスたった
パーミッションでつまずくらしいので
落として来たpemは600にパーミッションを変更する。
`chmod 600 〜.pem `
## SSHする
いつもの、SSH。
`ssh -i ~.pem ec2-user@amazonaws.com `
## LAMP環境を作ろう。
いつもこのページ見てる気がする
[チュートリアル: Amazon Linux への LAMP ウェブサーバーのインストール](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)
公式だからわかりやすい。
セキュリティーグループの設定でHTTPを許可するの忘れるからここだけは気をつける。

まずはそんな。
PowerCMSで表示値と送信される値の違う複数選択のチェックボックスを作成する

### 何が問題か

MovableTypeProの法人向け拡張であるPowerCMSには、複数選択のチェックボックスがあります。
ラジオボタンならば、「01=北海道,02=青森県...」みたいに書けば、
``` <label><input type="radio" value="01" /> 北海道</label> ``` みたいなものが作れますが、
複数選択のチェックボックスで同じことはできません。
普通に「北海道,青森県」のように書くと、``` <label><input type="checkbox" value="北海道" /> 北海道</label> ``` みたいなものが出来ます。
実際に送信される値は「01」にしたいってこと、よくあると思います。そんなことを実現する方法はあるのでしょうか？

### 答え：スニペットを使う

自前でHTMLタグとMTMLタグを駆使してゴリゴリ書くしかありません。
私のほうで都道府県の複数チェックボックスを生成するサンプルを作りました。
以下の方法に従えば、期待しているものが作れます。まあPowerCMSの導入コストが高すぎるので役に立つかは未知数ですが…

1. カスタムフィールド > 新規 で、システムオブジェクト：記事、種類：スニペットを選択
2. オプションにname属性に入れたい値(例: prefectures)を入力して保存をクリック
3. 既定値のところに以下の内容をコピペして保存をクリック

```
<mt:SetVar name="prefectures" value="北海道,青森県,岩手県,宮城県,秋田県,山形県,福島県,茨城県,栃木県,群馬県,埼玉県,千葉県,東京都,神奈川県,新潟県,富山県,石川県,福井県,山梨県,長野県,岐阜県,静岡県,愛知県,三重県,滋賀県,京都府,大阪府,兵庫県,奈良県,和歌山県,鳥取県,島根県,岡山県,広島県,山口県,徳島県,香川県,愛媛県,高知県,福岡県,佐賀県,長崎県,熊本県,大分県,宮崎県,鹿児島県,沖縄県">
<mt:Var name="prefectures" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length">
<mt:For var="i" from="1" to="$length">
<mt:Var name="prefectures" regex_replace="/^([^,]+).*/","$1" setvar="value">
<mt:Var name="prefectures" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="prefectures">
<label><input type="checkbox" name="prefectures" value="<mt:Var name="i" zero_pad="2">"<mt:loop name="prefectures_loop"><mt:if name="snippet_option" eq="$i">checked="checked"</mt:if></mt:loop>/><mt:Var name="value"></label>
</mt:For>
```

4. 記事のところで表示オプションで該当のカスタムフィールドを表示

### 値の取得

``` <mt:Entries><mt:HogeHoge key="prefectures" /></mt:Entries> ```とかで取得できます。
カンマ区切りで ``` "01,02,21,30,47" ``` みたいな内容が取得できます。
あとはそれをPHPでexplodeするなりよしなに。

### 追記

上のやつだと、valueに01、02とかの連番しかできませんでした。
しかし、valueに任意の値を入れたいことも多いと思います。
それに対応したバージョンも作りました。Foreach的なことができたらこんなまどろっこしいことしなくていいんですけどね。。

```
<mt:SetVar name="categories" value="aaa=あああ,bbb=いいい,ccc=ううう">
<mt:Var name="categories" regex_replace="/[^,]/g","" cat="," count_characters="1" setvar="length">
<mt:For var="i" from="1" to="$length">
<mt:Var name="categories" regex_replace="/^([^,]+).*/","$1" setvar="value">
<mt:Var name="value" regex_replace="/^(.*?)=.*$/","$1" setvar="code">
<mt:Var name="value" regex_replace="/^.*?=(.*)$/","$1" setvar="name">
<mt:Var name="categories" regex_replace="/^([^,]+,?)(.*)/","$2" setvar="categories">
<label><input type="checkbox" name="categories" value="<mt:Var name="code">"<mt:loop name="categories_loop"><mt:if name="snippet_option" eq="$code">checked="checked"</mt:if></mt:loop>/><mt:Var name="name"></label>
</mt:For>
```
EC2が勝手に再起動されたときに見るべきログ

AWSのEC2が勝手に再起動するときが時々ある。
メトリクスなどを見てもどうもこちらに問題があるようには思えない…
そういったとき見るべきログについて記載する。

## 勝手に起動されたときに見るべきログ

基板側に問題があると思われるので、その際は「CloudWatch」の「StatusCheckFailed_System」を見てみる。
再起動が発生した時間帯に、「StatusCheckFailed_System」が「1」になっていたら基板側に問題があったということ。

サーバーの監視をする際は、この項目も監視するようにしておいたほうがよさそう。
<http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html#creating_status_check_alarms>
Quantopianチュートリアル LESSON 8

[前回](http://qiita.com/driller/items/c4b0c50f2d7913ec56fa) の続きです。

# LESSON 8 Your Portfolio and Plotting Variables

## context.portfolio
これまでグローバル変数の受け皿みたいに用いていた `context` オブジェクトですが、配下に `portfolio` オブジェクトが用意されています。このオブジェクトにはポートフォリオに関するさまざまな情報(プロパティ)が格納されています。

プロパティ|内容
---|---
capital_used|取引によって消費された現金
cash|ポートフォリオに残っている現金
pnl|実現損益と含み損益
positions|セキュリティIDをキーとしたすべての未決済のポジション
portfolio_value|現金と未決済ポジションの合計
positions_value|未決済ポジションの合計
returns|ポジションの累積損益(10%のリターンは0.1)
starting_cash|初期資本
start_date|開始日時(UTC)、ライブトレードの場合はアルゴリズムを実行した日時

下記のコードは所有しているポジションをすべて決済しています。

```python
for security in context.portfolio.positions:
    order_target_percent(security, 0)
```

## Plotting Variables
`record()` 関数を用いることでユーザ自身が記録したいデータをグラフ化することができます。記録(プロット)可能なデータの種類は5個までです。

下記のコードでは、AAPLのロングとSPYのショートをそれぞれ50%ずつ毎日の寄りで執行し、毎日の引けで `recode()` 関数を用いて使用した現金と残った現金を記録しています。[^1]

```python
def initialize(context):
    context.aapl = sid(24)
    context.spy = sid(8554)

    schedule_function(rebalance, date_rules.every_day(), time_rules.market_open())
    schedule_function(record_vars, date_rules.every_day(), time_rules.market_close())

def rebalance(context, data):
    order_target_percent(context.aapl, 0.50)
    order_target_percent(context.spy, -0.50)

def record_vars(context, data):
    record(capital_used=context.portfolio.capital_used,
           cash=context.portfolio.cash)
```

![image.png](https://qiita-image-store.s3.amazonaws.com/0/22023/feb25448-3413-d90a-d761-c858f00f6500.png)

[^1]: [元のチュートリアルのコード](https://www.quantopian.com/tutorials/getting-started#lesson8)を変更しています。

[LESSON 7](http://qiita.com/driller/items/c4b0c50f2d7913ec56fa) <--> [LESSON 9](http://qiita.com/driller/items/9364610e87370bc98075)
あらゆる家電製品をIoTに対応させる「スマートコンセント」

#ざっくり言うと
「家のコンセントに差して、普通の家電製品をスマホで遠隔操作可能にするコンセント」なるものがある。
　……タイトルのまんまです。
　「スマートコンセント」とは元々、「消費電力等をモニタリングし、遠隔操作や一括管理を行うことができる」コンセントで、私が確認した限りでは2010年ごろには既に存在していた模様です。
　しかし当時は大型のハブや各端末の消費電力のモニタリングでLANケーブルや無線機が必要で、設置費用もかかるものでした。

　現在では一般向けとして「スマートフォンを利用した遠隔操作」へとシフトし、従来より小型かつ安価で設定も簡易なものが販売されております。

#使用方法と機能
　①家のコンセントに「スマートコンセント」を差す。
　②本体のスイッチをONにする。
　　これによってWi-Fi経由で自宅のインターネットに接続される。
　③使用する家電製品のプラグを「スマートコンセント」に差す。

　これによって、スマートフォンの専用アプリからインターネットを経由して家の中の「スマートコンセント」の電源をON/OFFすることができるようになります。
　また、ON/OFFのタイマーや簡単なスケジュール設定が可能で、指定した時間に自動でスイッチを切り替えることができます。

#こんな時に使えるかもしれません
　・子供がテレビを見る時間やゲームをする時間を管理したい。
　・起床時に部屋の照明や、季節に合わせて電気ストーブやらエアコンやらを自動で付けてほしい。
　　反対に、就寝時に自動で消してほしい。
　・ペットを飼っていて、留守中にエアコンで室温管理をしたい。
　・同じく留守中に、留守だと悟られないように照明等を操作したい。
　・付けっぱなしだったかもしれない電気ストーブやらアイロンの電源を切りたい。
　・起床時や帰宅時に合わせて電気ポットでお湯を沸かしたりコーヒーメーカーでコーヒーを入れたい。

#デメリット
　・ON/OFFの切り替えしかできないので、動かせる製品は限られてくる。
　・スマートフォンで専用アプリを入れる必要があり、PC等からは操作できない。
　・スマートフォンが必要不可欠になる。

#日本の製品
　・Link Japan「ePlug」
　　⇒他にも「eシリーズ」として、Wi-Fi経由で赤外線を発信するものや室内環境をセンサーで測るIoT製品が出ております。
　・Belkin「WeMo」
　・Koogeek「Apple HomeKit」
　　⇒iOSのみ対応のよう。

#海外では
　クラウドファンディングサイトの「Indiegogo」にて、アメリカの「Life cnct」が提案したプロジェクトにて「intelliPLUG」という商品が作られております。

　↓クラウドファンディングサイト「Indiegogo」の「intelliPLUG」リンク
　https://www.indiegogo.com/projects/intelliplug-your-friendly-wi-fi-smart-plug-home-gadgets#/

　※そもそも「クラウドファンディング」とは
　　「あるプロジェクトやサービス、その他アイデア等を提案し、その実現のためにインターネットを通して
　　　不特定の人からの投資、協力を募る」仕組みです。
　　今回の「intelliPLUG」のプロジェクトの場合は、既に製品として完成しているのでその製品の
　　　「購入」という形でプロジェクトに投資することとなります。　

　現在日本で販売されているものと異なる点として次のようなものがあります。
　・別途Amazon開発の人工知能「Alexa」を搭載したものや、Googleの「Google Home」といった「スマートスピーカー」を用意することで、音声認識によってスイッチを切り替えることができるようになります。
　・今後対応するスピーカーの拡大や機能追加等が行われる可能性があり、その際には自動でアップグレードしてくれます。
　・日本で購入できる製品が4000円～7500円前後なのに対し、「intelliPLUG」は3000円以下（今は60%OFFでさらに安く）購入できるようです。

　……ただし今現在では日本への配送は予定なしとのことです。

#個人的には
　今後このようなコンセントを介して操作できることが増えれば…
　⇒エアコンや加湿器等を外出中でも操作して、室内環境を管理したり
　⇒留守中に使わない家電製品の電源をOFFにして消費電力を節約したり

　一方で、非常に怖いものであると感じる部分も多いです。

　⇒自宅のインターネット環境に外部が侵入するきっかけとなりうるのでは？
　⇒このようなコンセントが「普通のコンセントや電源タップ」として売られていたら……
　　普通のタップだと思って自宅のコンセントに差したらそこにつないだ電化製品が
　　勝手に動作したり、ハッキングを受けたり…？

セキュリティに関しては「スマートコンセント」に留まらずIoTの最大の問題点であることは言うまでもありませんが……。
MacでDjangoをはじめてみた①　環境設定編

webサイトを作る際に、PythonでサーバーサイドをやってみようということでDjangoの導入しましたが、導入にかなり手間がかかったので記事にまとめて見ました。

##Djangoとは


##環境
macOS Sierra(version10.12.2)を使用しました。
ちなみに今回はpython2.7をしようすることを前提に書いております。

##Pythonのインストール
pythonはmacにはあらかじめ導入されているのでそのバージョンの確認をしてください。

```
$ python -V
```

##PYTHONPATHの設定
パスを通さないと他の設定ができなくなります。

```
$ echo $PYTHONPATH
```
打ってみても何もでてこないというパターンが多いと思います。これはまだPYTHONPATHの設定ができていない為です。そのため、どこにパスを通すべきなのか確認をしてみましょう。

```
$ python
Python 2.7.10 (default, Jul 30 2016, 19:40:32)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.34)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>>import site
>>>print(site.getsitepackages()[0])
ここにパスが表示される
>>>exit()
```

これでパスをコピーしておき、これを、bash_profileまたはbashrcに以下のように書き加えます。これでもう一度パスを確認すれば変わっているはずです。ちなみに僕はカスがまた消えてしまいましたがなぜか動いているので大丈夫かと思います。

```
export PYTHONPATH="<ここにパスを入れる>:$PAYTHONPATH"
```


##setupツールのダウンロード
setupツールのダウンロードは[公式pythonパッケージサイト](https://pypi.python.org/pypi/setuptools/1.1.6)から行うことができます。ダウンロードするファイル名はsetuptools-1.1.6.zip です。

```
$ cd setuptools-1.1.6
$ sudo python ez_setup.py
```


##pipのインストール

```
$ sudo easy_install pip
```


##仮想環境のインストール
ここでは、djangoを動かすためのvirtualenvとvirtualenvwrapperのインストールをします。では早速virtualenvのインストールを以下のコマンドからやってみましょう。

```
$ sudo pip install virtualenv
$ pip list インストールできたかどうかを確認用
```
もしリストにvirtualenvが入っていなければ導入できていませんのでご注意ください。
さて、virtualenvwrapperのインストールですが本来なら

```
$ pip install virtualenvwrapper
```
としたいところ、僕の時はなぜか入らず、別の機会で再度やってみてもやっぱりだめでした。そこで調べて試したところこれをしたらうまく入りました。

```
$ sudo pip install pbr
$ sudo pip install --no-deps stevedore
$ sudo pip install --no-deps virtualenvwrapper
```

##仮想環境の始動
では早速動かしてみましょう。

```
$ source virtualenvwrapper.sh
$ mkvirtualenv seven
$ workon seven
(seven)$
```
これで動けば環境構築はだいたい大丈夫です。


##参考リンク集
参考にさせていただいたリンクです。もっと詳しく知りたい方はぜひご活用ください。
-[Tango with Django](http://www.tangowithdjango.com/)
-[Can't install virtualenvwrapper on OSX 10.11 El Capitan](https://stackoverflow.com/questions/32086631/cant-install-virtualenvwrapper-on-osx-10-11-el-capitan)
[Swift3][個人的メモ]AlamofireのRouter

# Router.swift

```swift
import Alamofire

enum Router: URLRequestConvertible {
    static let serverURL = "http://example.com"
    
    case page1
    case page2(String)
    case page3([String])
    case page4(String,[String])

    var method: Alamofire.HTTPMethod {
        switch self {
        case page1:
            return .post
        default:
            return .get
        }
    }
    
    var path: String {
        switch self {
        case .page1:
            return "/page1"
        case .page2(let str):
            return "/page2/\(str)"
        case .page3:
            return "/page3"
        case .page4(let str,_):
            return "/page4/\(str)"
        default:
            return "/"
        }
    }
    
    func asURLRequest() throws -> URLRequest {
        let url = URL(string: Router.serverURL)!
        var urlRequest = URLRequest(url: url.appendingPathComponent(path))
        urlRequest.httpMethod = method.rawValue
        
        switch self {
        case .page3(let parameters):
            return try Alamofire.JSONEncoding.default.encode(urlRequest, with: parameters)
        case .page4(_, let parameters):
            return try Alamofire.JSONEncoding.default.encode(urlRequest, with: parameters)
        default:
            return urlRequest
        }
    }
}
```

実際にURLの送信先を増やす際にはcaseを増やせば良いです

#呼び出す時
```swift
//引数なし
Alamofire.request(Router.page1)
//引数あり
Alamofire.request(Router.page2("test1"))
//引数と送信時のパラメーターあり
Alamofire.request(Router.page4("test2",["param1","param2"])
```
data.frame関数のカンマ(,)1つでエラー

今回はしょうもないエラーで時間もかけたくせに、解決方法はいたって簡単でした。
エラーメッセージでググっても完全に同じエラーがなく、
理解するまでに時間がかかったので、書いておきます。

＃バージョンはR-3.3.1です

##エラー内容

```
data.frame(a=A, b=B, c=C, d=nrow(D),　　でエラー：引数がありませんし、省略時既定値もありません
```
なんのことだ。
ググると、大抵は**引数"y"がありません**など、何が足りないかを表示してくれる模様。
しかし、自分のところに表示はなく、スクリプトを眺めたり、試すこと数時間。
その時はあっさりやってきました。

##解決方法
スクリプトをよく見てみると、

```
result <- data.frame(a=A,
 b=B,
 c=C,
 d=nrow(D),
 .
 .
 .
 x=nrow(X),
)
```
最後の引数のところにカンマが。
これを消してみると、エラーを吐くことなく、うまくいきました。

```
result <- data.frame(a=A,
 b=B,
 c=C,
 d=nrow(D),
 .
 .
 .
 x=nrow(X)
)
```
これだけ。
たかがカンマ、されどカンマ。
私がカンマを入れてしまったがために、Rはわざわざ「へいへい、まだ引数を入れたいんじゃないのかい？」と聞いてくれていたんですね。
~~なかったことにしてくれいいんですけど。~~

以上、R嫌いを悪化させたR初心者のトラブルでした。
【エラー対処】　java.lang.IllegalArgumentException: already added:～

# 症状
ビルド時に以下のようなエラーが発生し、ビルドに失敗する  
```java.lang.illegalargumentexception already added landroid/support/v4/～```

# 症状が解消した対応
以下のNuGetパッケージのバージョンを揃えた
- Xamarin.Android.Support.~
CloudFront でのクッキーの扱いについて

## ドキュメント

* http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Cookies.html

## デフォルト

デフォルトでは、CloudFront はクッキーを考慮しない。

リクエストの `Cookie:` ヘッダは、オリジンに転送されない。
レスポンスの `Set-Cookie:` ヘッダはビューアに転送されない。

## 設定

ビヘイビアで、以下のいずれかを選べる。

 * None (デフォルト)
 * Whitelist
 * All

![20170705161229.png](https://qiita-image-store.s3.amazonaws.com/0/2596/76e2396d-eb43-59bc-de7a-bd212b2c8c39.png)

この設定は、以下の3つの挙動に影響する。

 * オリジンに `Cookie:` を転送するかどうか
 * キャッシュのキーに `Cookie:` を使うかどうか
 * オリジンが返した `Set-Cookie:` をビューアに転送するかどうか

ドキュメントを読んでもいまいち正確にわからなかったので、実際に設定して挙動を確認した。

|           | `Cookie:` をオリジンに転送 | キャッシュのキーに `Cookie:` を | `Set-Cookie:` をビューアーに |
|-----------|--------------------------|-------------------------------|------------------------------|
| None      | しない                     | 使わない                        | 返さない                     |
| Whitelist | 一部する                   | 一部使う                        | **全て返す**                     |
| All       | 全てする                   | 全て使う                        | 全て返す                     |

基本的に想像通りなのだが、Whitelist の `Set-Cookie` の扱いだけ例外的で、ホワイトリストに関わらず全てのクッキーをビューアに返す。

なので、**Whitelist で制限しているつもりでも、例えばセッションIDがキャッシュで配信されてしまう**ことに注意が必要。場合によっては、とても危険な状態になり得る。

[ドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/Cookies.html)は以下のように書かれている。
> ホワイトリストにない Cookie がオリジンからの応答に含まれている場合、CloudFront はその Cookie もビューアに返します。 

一方で、以下の説明もあり、矛盾しているように思えるのだけれども、

> オリジンがホワイトリストに登録された Cookie と登録されていない Cookie の両方を返した場合、CloudFront はホワイトリストに登録された Cookie のみをキャッシュします

これは、`Cookie:` をキャッシュのキーに使うかどうかの話が混ざっているのではないかと思う。

自分が試した限りでは、CloudFront は `Set-Cookie:` ヘッダをキャッシュする。`X-Cache: Hit from cloudfront` のレスポンスに、ホワイトリストに載っているかどうかに関わらず、`Set-Cookie:` ヘッダが設定される。

[こちらのドキュメント](http://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html)にも、

> Set-Cookie – Cookie を転送するように CloudFront を構成している場合、Set-Cookie ヘッダーフィールドがクライアントに転送されます。

とあり、ホワイトリストで制限されるとは書かれていない。

## 実験

以下 `x_*` をホワイトリストに設定したビヘイビアのレスポンス。

```
$ curl -b 'x_1=1; a=1' -vvv 'https://...'

< HTTP/1.1 200 OK
< Content-Type: text/html
< Content-Length: 52
< Connection: keep-alive
< Date: Wed, 05 Jul 2017 07:35:49 GMT
< Server: nginx
< Set-Cookie: a=5; path=/
< Set-Cookie: b=6; path=/
< Age: 30
< X-Cache: Hit from cloudfront
< Via: 1.1 xxxxxxxxxxxxxxxx.cloudfront.net (CloudFront)
< X-Amz-Cf-Id: xxxxxxxxxxxxxxxxx

1499240149 array(1) {
  ["x_1"]=>
  string(1) "1"
}
```

ビューアは `x_1` と `a` の2つのクッキーを送信しており、オリジンには `x_1` だけが届いている。

オリジンはホワイトリストに含まれない `a` と `b` の2つのクッキーを返しており、`X-Cache: Hit from cloudfront` のレスポンスに `Set-Cookie` が含まれている。

オリジンに置いた PHP ソース。

```php
<?php
setcookie('a', '5', 0, '/');
setcookie('b', '6', 0, '/');

echo time();
echo ' ';
var_dump($_COOKIE);
```
WindowsでJenkinsのシェルでAWS CLIが使えない場合の原因と対処法

## 現象

AWS CLIを使い、S3にファイルをアップしたいので

```
> aws s3 cp hoge.zip s3://hoge/hoge/
```  

とすると

```
The config profile could not be found
```
とエラーが出てアップロードできない

しかし、Jenkinsではなくコマンドプロンプトで

```
> aws s3 cp hoge.zip s3://hoge/hoge/
```
は成功する

## 原因

Jenkinsの実行ユーザーがAWS CLIを実行できる権限をもっていない

1. コマンドプロンプトで

```
> whoami
ec-hogehoge\administrator
```  
つまり通常のコマンドプロンプトではadministratorで実行していることが確認できる

Jenkinsのシェルの実行で

```
> whoami
```
とすると違うユーザー名が表示されるため、administratorに変更する必要がある


## 対処法

Jenkinsの実行ユーザーをadministratorに変更する

1. [コントロールパネル]-[システムとセキュリティ]-[管理ツール]-[サービス]  
2. Jenkinsの項目を右クリック → プロパティ → 上のタブからログオンを選択
3. アカウント横の参照  
4. 選択するオブジェクト名を入力してくださいに「administrator」を入力する（先ほど調べたユーザー名を入力する）  
5. 名前の確認  
6. OK 
7. OK  

8. Jenkinsを再起動する
サービスの中のJenkinsを右クリック → 再起動

9. 確認

```
> aws s3 ls
```
Jenkins上でS3のバケット一覧が取得できれば、OKです

## ちなみに

IAMの設定が出来ていないと、config profileが本当に存在していなくてアップロード出来ないです

その場合はIAM（認証情報）のセットアップを行ってください

参考 → http://www.task-notes.com/entry/20141026/1414322858
Laravelの $builder->paginate() はクエリを2回走らせる

コレクションの全体から総数を計算しているのかと思ったが、そんなことは無かった。
考えてみれば `LIMIT .. OFFSET ..` かけているから当然だった。

SQL発行回数が増えるので、Paginate対象が重いSQLだと注意。

以下証拠。

```php
Route::get('test', function() {
    $interns = App\Models\User::paginate(30);
    throw new \Exception;
});
```

![image](https://qiita-image-store.s3.amazonaws.com/0/103885/8df825c2-e9a5-d53e-1575-a2e8ac20854a.png)

ちなみに軽量版である `simplePaginate()` でも同様。

```php
Route::get('test', function() {
    $interns = App\Models\User::simplePaginate(30);
    throw new \Exception;
});
```
WZR-HP-AG300HをDD-WRT化

#Abstract
Buffalo WZR-HP-AG300Hを入手したので，Firmwareをアップデートしようとしたら，Diagランプが2回点滅を繰り返す文鎮と化したので，TFTPを用いてDD-WRTを導入した．

#Introduction
とあるつてで，Buffalo WZR-HP-AG300Hを入手した．
Firmwareのバージョンが1.73だったので，Webの管理画面から，1.75にアップデートを行った．
その後，20分経っても終わらずACを抜いたところ，Diagランプが2回点滅を繰り返す文鎮と化した．

#DD-WRTとは

>DD-Wrtは、ゲートウェイ、無線LANアクセスポイントなどの組み込みシステム用ファームウェアとして開発されているLinuxディストリビューションの一種である。OpenWRTを元にして作られている。組み込みシステムはパソコンとは違い、規格が統一されていないため、各製品毎に対応が図られている。各製品毎の対応状況は、公式サイトの"Router Database"で型番から検索して確認することが出来る。家庭用ルーターの非公式ファームウェアの中では最も有名である。

Wikipedia:[DD-WRT](https://ja.wikipedia.org/wiki/DD-WRT,"DD-WRT")より引用

#インストール
##DD-WRTをDownload
以下のURLからDownload
[buffalo_to_ddwrt_webflash-MULTI.bin](ftp://ftp.dd-wrt.com/betas/2013/05-27-2013-r21676/buffalo_wzr-hp-ag300h/buffalo_to_ddwrt_webflash-MULTI.bin)

##TFTPを有効化
1.「Windowsの機能の有効化または無効化」より，「TFTP クライアント」のチェックボックスを入れる．

##ネットワークの設定
1.Firewallを無効化する．
2.WZR-HP-AG300HのLANポートとWindowsを接続する．
3.接続しているWindowsのネットワークを以下の値に変更する．
<dl><dt>IPアドレス</dt><dd>`192.168.11.2`</dd><dt>サブネットマスク</dt><dd>`255.255.255.0`</dd><dt>ゲートウェイ</dt><dd>`192.168.11.1`</dd></dl>に変更する．
4.管理者権限でコマンドプロンプトを開き，以下のコマンドを入力する．(ただし，`02-aa-bb-cc-dd-20`はそのまま入れること)

```bat
netsh interface ipv4 set neighbors "ルータを接続しているインターフェース名" 192.168.11.1 02-aa-bb-cc-dd-20
```
5.`arp -a`コマンドで登録されているか確認する．

##下準備
1.管理者権限でコマンドプロンプトを開く
2.`cd`コマンドを用いて，DD-WRTのファイルをおいてあるフォルダまで移動する．
3.`move`コマンドを用いて，ファイル名に`tftp`を入れる．

##実行
1.WZR-HP-AG300Hの電源を切る．
2.コマンドプロンプトに次のコマンドを入力する．(実行しない)

```bat:
tftp -i 192.168.11.1 put "DD-WRTのファイル名" 
```

3.WZR-HP-AG300Hの電源を入れる
4.LANポート側の全てのLED(USB,LAN,WAN)が点灯する．
5.全てのLEDが消え，USBポートのLEDが点灯する．
6.USBポートのLEDが消え，LANとWANのポートが点灯する．
7.LANとWANのポート消え，Windowsと接続しているLANのポートが点灯する．
8.4秒以内にコマンドプロンプトに入力したコマンドを実行する．
9.転送結果の成否はコマンドプロンプトに表示される．

##後片付け
1.固定していたIPアドレス，サブネットマスク，ゲートウェイと自動取得に戻す．
2.Firewallを有効化する
3.WZR-HP-AG300Hから，IPアドレスが振られたら，ブラウザで<a href=http://192.168.1.1>http://192.168.1.1</a> へアクセス．
4.UserとPasswordを設定する画面がでたら，成功．

#Results
* Firewallの無効化を忘れると，転送がタイムアウトになる．
* Windowsに2つ以上のLANを繋いでいても問題ない．

#Conclusions
* このあと，DD-WRTの設定がまためんどくさい．
* DD-WRTの_TX Power_は電波法により，必ず10以下にすること．

#P.S.
* WHR-G54Sはmacアドレスの変更は不必要．

#Reference
* [ dd-wrt.com - Buffalo WZR-HP-AG300H](https://www.dd-wrt.com/wiki/index.php/Buffalo_WZR-HP-AG300H) 閲覧日:2017/07/05
* [ ばっくらっしゅの備忘録 - WZR-HP-AG300H を tftp で純正ファームに戻す](http://koyama4284.blogspot.jp/2016/10/wzr-hp-ag300h-tftp.html) 閲覧日:2017/07/05
Mac 上で開発しているシステムを VM上の Microsoft Edge で動作確認する方法

## 背景

Mac 上で Web サイトを作っているときに、Microsoft Edge や IE でも動作確認する必要がありました。
詳細は下記を参照ください。
- [vagrant で modernIE](http://hpcmemo.hatenablog.com/entry/2017/01/14/001422)

## やりたいこと

VM 内から、mac 上の 8000 番ポートにアクセスしたい。

## 解決策

VM 内の Edge から `http://10.0.2.2:8000` にアクセス。

出典: [Addressing localhost from a virtualbox virtual machine](https://stackoverflow.com/questions/1261975/addressing-localhost-from-a-virtualbox-virtual-machine)
ChainerでLSTMを使う (NStepLSTM, NStepBiLSTM)

ChainerでLSTMを使いたい方向けに簡単に使い方を書きます。


# 入力形式
```
import numpy as np
from chainer import Variable
import chainer.functions as F
import chainer.links as L

# 入力データの準備
x_list = [[0, 1, 2, 3], [4, 5, 6], [7, 8]] # 可変長データ (4, 3, 2)の長さのデータとする
x_list = [np.array(x, dtype=np.int32) for x in x_list] # numpyに変換する
```
上記のデータはバッチサイズ3, 長さがそれぞれ4,3,2のデータです。

# Word Embeddings
```
n_vocab = 500
emb_dim = 100
word_embed=L.EmbedID(n_vocab, emb_dim, ignore_label=-1)
```


# NStepLSTM, NStepBiLSTM
```
use_dropout = 0.25
in_size = 100
hidden_size = 200
n_layers = 1

bi_lstm=L.NStepBiLSTM(n_layers=n_layers, in_size=in_size,
                      out_size=hidden_size, dropout=use_dropout)
```
単方向の場合はNStepLSTM, 双方向LSTMの場合はNStepBiLSTMを使いましょう。
NStepBiLSTMの場合はhidden_sizeの2倍のベクトルがconcatされたベクトルが返ってきます。

# LSTMに入力データを渡す
NStepLSTM, NStepBiLSTMへの入力はVariableのリストです。
この例だと[(4, 100), (3, 100), (2, 100)]というshapeをそれぞれ持つVariableのリストを渡しています。

```
# Noneを渡すとゼロベクトルを用意してくれます. Encoder-DecoderのDecoderの時は初期ベクトルhxを渡すことが多いです.
hx = None 
cx = None 

xs_f = []
for i, x in enumerate(x_list):
    x = word_embed(Variable(x)) # Word IndexからWord Embeddingに変換
    x = F.dropout(x, ratio=use_dropout) 
    xs_f.append(x)

# xs_fのサイズは
# [(4, 100), (3, 100), (2, 100)]というVariableのリストになっている

hy, cy, ys = bi_lstm(hx=hx, cx=cx, xs=xs_f)
```
`ys`がNStepBiLSTMの最終層のベクトルの各ステップのベクトルが返ってきます。


# 出力
## ys
```
for h in ys:
    print h.data.shape

#     # print ys
#     [<variable at 0x10996f990>, <variable at 0x10996fa50>, <variable at 0x10996fb90>]
#     (4, 400)
#     (3, 400)
#     (2, 400)
```
ysはリストのVariableが返ってきます。
中身は各timestepのhidden vectorが入っています。
Bi-LSTMの場合の場合は双方向のLSTMのconcatが入っています。
POS TaggingやNERなどのタスクの場合各タイムステップのベクトルに対して適切なタグを予測するように学習させていきます。

※ n_layers = 2と多層にした場合も　ysは

```
#     # print ys
#     [<variable at 0x10996f990>, <variable at 0x10996fa50>, <variable at 0x10996fb90>]
#     (4, 400)
#     (3, 400)
#     (2, 400)
```

です。つまり最後の層の全てのtimestepのhidden vectorが返ってきます。

## hy
```
print(hy.shape)
# (2, 3, 200)
```
hyはVarialbeが返ってきます。
BiLSTMの場合は (2 * n_layers, batchsize, hidden_size)が返ってきて,
単方向LSTMの場合は (1 * n_layers, batchsize, hidden_size)が返ってきます。

これは最後のtimestepのhidden vectorが返ってきます.
BiLSTMの場合はforward-LSTMの最後のtimestep (t=T)のベクトルとbackward-LSTMの最後のtimestep (t=0)のベクトルがconcatされて返ってきます。

最後のtimestepのみ必要な場合はhy, 
全てのtimestepが必要な場合はysを使うと良いと思います。

※多層の場合, 例えば n_layers=3で単方向LSTMの時　hyは  (3, batchsize, hidden_size)　のshapeになっているので注意が必要です。




質問や間違い訂正などは @aonotas までお願いします。

NStepLSTM, NStepBiLSTMの部分を 
NStepRNN, NStepGRUに置き換えるとRNN, GRUが使えるようになっています。
【すっきりしたい】即時関数の記載が気持ち悪い

他の言語でも同じことだと思う。
けど、JavaScriptで遭遇しがちなのでJavaScript用の記事に。

# 目的
Aさん「即時関数の記述方法が気持ち悪い・・」
Bさん「なんであんな書き方なの・・」

そんなあなたをすっきりさせたい。

あと、自分もちょいちょい忘れるので、メモしたい。

```js:気持ち悪い
(function () {
  //気持ち悪い
})();
```

# 参考記事
http://unitopi.com/js-function/

これがとてもわかりやすいのだが、
忘れた時に探しに行く苦労や、記事自体がなくなってしまったら
私が泣いてしまうので、自分のメモ代わりに転載。

# 説明
**[1]関数を使うことを考える**

```js
hoge();
```

**[2]hoge(の名前のところ)を即時関数にしてみる**

```js
(
function hoge(){}
)();
```

**[3]hogeという名前すらいらなくなる(無名関数化)**

```js
(
function () {}
)();
```

**[4]整えて、完成**

```js:もう気持ち悪くない
(function () {
  //もう気持ち悪くない
})();
```

# ね！
Javascriptでライトボックスを作ってみたのでメモ

参考までに

ポイントは、子要素を取得するために、forがすごく活躍しました。
あと、要素の取得のされ方も、かなり調べました。個性のあるかんじです笑
javascript

```js
let dom = {

  body : document.getElementsByTagName("body"),
  overlay : document.getElementById("overlay"),
  sample : document.getElementById("sample"),
  sampleA : document.querySelectorAll(".sample"),

  processing_style : function(){

    h = window.innerHeight;
    w = (document.body.clientWidth/2)-400;
    t = document.body.scrollTop;
    v = dom.overlay.children;
    dom.overlay.style.height = h + "px";
    dom.overlay.style.display = "block";
    dom.overlay.style.left = "0" + "px";
    dom.overlay.style.top = t + "px";
    dom.overlay.style.opacity = '1';

    for(let i = 0; i < v.length; i++){
      t = document.body.scrollTop+200;
      v[i].style.left = w + "px";
      v[i].style.top = t + "px";
      v[i].style.opacity = "1";
    }

  },

  behavior : function(x){

        q = x.children;
        for (let i = 0; i < q.length; i++){
          type = q[i].getAttribute("src");
          k = document.createElement("img");
          k.setAttribute("src", type);
          dom.overlay.appendChild(k, dom.overlay);
        }

    dom.processing_style();

  },
};

  let overlay = function(){
      r = dom.overlay.children;
      for (let i = 0; i < r.length;i++) {
        dom.overlay.removeChild(r[i]);
        dom.overlay.style.display = "none";
      }
  };

  let clickbox = function(){

    g = dom.sample.children;

    for (let i = 0; i < g.length; i++){
        g[i].addEventListener("click",function(){
          dom.behavior(this);
        },false);
      }

      dom.overlay.addEventListener("click",overlay,false);

    };

  clickbox();

```

css

```css
#main {
  clear: left;
  margin: 20px auto;
  padding: 5px 20px;
  width: 800px;
}
#sampleA {
  margin: 10px auto 400px auto;
  width: 800px;
  padding: 20px;
}
#sampleA ul:after {
  content: "";
  display: block;
  visibility: hidden;
  height: 0.1px;
  font-size: 0.1em;
  line-height: 0;
  clear: both;
}
#sampleA li {
  float: left;
}
#sampleA li img {
  cursor: pointer;
  width: 155px;
}
#overlay {
  position: absolute;
  display: none;
  top: 0;
  width: 100%;
  z-index: 1;
  background: url(images/black.png);
}
#overlay img {
  display: inline-block;
  position: absolute;
  width: 800px;
}

```
html

```html
  <div id="overlay"></div>
  <div id="main">
    <div id="sampleA">
      <ul id="sample">
        <li><img class="sample" src="images/pic1.jpg" /></li>
        <li><img class="sample" src="images/pic2.jpg" /></li>
        <li><img class="sample" src="images/pic3.jpg" /></li>
        <li><img class="sample" src="images/pic5.jpg" /></li>
        <li><img class="sample" src="images/pic6.jpg" /></li>
        <li><img class="sample" src="images/pic7.jpg" /></li>
        <li><img class="sample" src="images/pic8.jpg" /></li>
        <li><img class="sample" src="images/pic9.jpg" /></li>
      </ul>
    </div>
  </div>
```

参考までに
Pythonのアンダーバーと暗い道

すっごい小ネタです。

```py3:myclass.py
class MyClass:
    def __init___(self):
        print('2')

print('1')
MyClass()
print('3')
```

```shell-session
$ python myclass.py
1
3
```

教訓はありません。アンダーバーの数には気をつけろということです。
Play Billing Library - Developer Preview 1の紹介



## 前置き

この記事はAndroid Developers Blogの「Money made easily with the new Google Play Billing Library」をもとに作成しています。

[Android Developers Blog: Money made easily with the new Google Play Billing Library](https://android-developers.googleblog.com/2017/06/money-made-easily-with-new-google-play.html)

## はじめに

現在、Androidアプリで課金処理を実装するためには「In-app Billing version 3」と呼ばれるAPIを使って実装する必要がありました。

- [In-app Billing API | Android Developers](https://developer.android.com/google/play/billing/api.html?hl=ja)
- [アプリ内課金を実装する | Android Developers](https://developer.android.com/google/play/billing/billing_integrate.html?hl=ja)

この実装はAIDLと呼ばれるファイルをわざわざextras内の特定ファイルからコピペするなど、他のAndroidの機能実装に比べて少々特殊でした。その上 v3自体のリリースは2013年でそれ以降APIの更新はありませんでした。（いちおうversion 5までは存在するようですが、裏側だけの変化なのかAPIのドキュメントは存在しません）

そんな状況から、よりわかりやすい形でアプリ内課金を実装できることを目的に、新しいアプリ内課金ライブラリである「Play Billing Library」が公開されました。現在はDeveloper Preview 1としてリリースされています。

- [Android Developers Blog: Money made easily with the new Google Play Billing Library](https://android-developers.googleblog.com/2017/06/money-made-easily-with-new-google-play.html)
- [Play Billing Library | Android Developers](https://developer.android.com/google/play/billing/billing_library.html)


## 明確な変更点

### 実装方法の変更（AIDL不要、Gradleでの記述）

Support Libraryなどと同様に、`build.gradle`のdependenciesに1行追加するだけでOKになりました。もうAIDLファイルをコピペする必要はありません。`AndroidManifest.xml`にBILLINGのPermissionを追加することはお忘れなく。

```gradle:app/build.gradle
dependencies {
    ...
    compile 'com.android.billingclient:billing:dp-1'
}
```


### Activityのライフサイクルに依存しない作り

これまでのIn-app Billingは購入結果を`onActivityResult`で処理する必要がありましたが、Play Billing Libraryでは各購入処理が専用のClientクラスやListerクラスが用意されているため、明示的に課金周りの処理を切り離して実装することができるようになっています。

…と書きつつ、実はまだ実装して試せていない部分もあるのでここの記述は曖昧です。現在はこれらの紹介記事はほとんどないため、下記に照会するTrivalDrive v2のコードを見るのが一番かと思います。


## TrivialDrive v2（サンプルアプリ）の登場

Play Billing Libraryの公開に伴い、課金アプリのTrivialDriveのPlay Billing Library対応版であるv2がGoogleSamplesに公開されています。

https://github.com/googlesamples/android-play-billing

v2になったことでwearやtv対応もしていますが、基本的にはコアの課金周りの実装は`shared-module`モジュール内にて記述されています。

## さいごに

Play Billing LibraryはDeveloper Preview 1とあるように、現在正式リリースに向けて絶賛開発中です。IssueTrackerなどへの意見やバグ報告を絶賛募集中とのことなので、もし既存のIn-app Billingで思うところがある方など、どしどし意見を送るのもよいのではないかと思います。
Cognos のゲートウェイをISAPIに変更してCognos Mobileがつながらない場合

##内容
Cognos BIでゲートウェイをcognos.cgiからcognosisapi.dllに変更する事は、通常良くある構成だと思います。

しかしながら、ISAPIに変更した環境で、Cognos Mobileから普通に接続しても、接続できない事が良く起こります。というか、私の経験上、毎度接続できません。

そんな時は、私は深く考える事なく、以下のファイルを修正して解決しています。

C:\Program Files\ibm\cognos\c10_64\webcontent\m\mobilelauncher.html

修正前

```html
			function splashLoaded(img){
				img.style.visibility = "visible";
				var referrer = document.referrer.split('/');
				if (referrer[referrer.length-1] == "") referrer.pop();
				
				if (referrer[referrer.length-1] == "isapi") {
					window.setTimeout("window.location.replace('../cgi-bin/cognosisapi.dll?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else if (referrer[referrer.length-1] == "mod") {
					window.setTimeout("window.location.replace('../cgi-bin/cognos_module?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else if (referrer[referrer.length-1] == "p2pd" || (referrer[referrer.length-1] == "index.html" && referrer[referrer.length-2] == "p2pd")) {
					window.setTimeout("window.location.replace('../servlet/dispatch?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else {
					window.setTimeout("window.location.replace('../cgi-bin/cognos.cgi?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				}
			}
```

修正後
※下から3行目の、cognos.cgiをcognosisapi.dllに変更しています。

```html
			function splashLoaded(img){
				img.style.visibility = "visible";
				var referrer = document.referrer.split('/');
				if (referrer[referrer.length-1] == "") referrer.pop();
				
				if (referrer[referrer.length-1] == "isapi") {
					window.setTimeout("window.location.replace('../cgi-bin/cognosisapi.dll?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else if (referrer[referrer.length-1] == "mod") {
					window.setTimeout("window.location.replace('../cgi-bin/cognos_module?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else if (referrer[referrer.length-1] == "p2pd" || (referrer[referrer.length-1] == "index.html" && referrer[referrer.length-2] == "p2pd")) {
					window.setTimeout("window.location.replace('../servlet/dispatch?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				} else {
					window.setTimeout("window.location.replace('../cgi-bin/cognosisapi.dll?b_action=xts.run&m=portal/main.xts&startwel=yes')",5);
				}
			}
```

ファイル修正後は、IISを再起動しましょう。

ISAPIに変更してCognos Mobileからつながらない場合に、とりあえず試してみて頂ければと。