OmniAICreator/Qiita-1.07M huggingface dataset:
DP(動的計画法)のコツ

競技プログラミングを始めてばかりで、世間で呼ばれる「蟻本」を参考にして勉強しているところ、2-3章の動的計画法にぶつかりました。
最初に動的計画法について読んだときは、DPのコードを書けるかどうかどころか概念自体が上手く飲み込めない状態でしたが、インターネット上であちこちのサイトを参考にして理解しようとしたところ、やっと自分なりのDPの問題の解き方の「コツ」を見つけました！ここで、このコツについて少し書き記して、もしできたら他のDPを勉強していて僕のように良く分からない方に役に立ったり、将来の自分宛へのメモになれたらなぁ、と思っています。

では、早速見ていきましょう！

*インターネット上でDPに関連し参考になった投稿のリンクを載せました：*
-　[動的計画法（ナップザック問題）](http://dai1741.github.io/maximum-algo-2012/docs/dynamic-programming/)
-　[じじいのプログラミング](http://shindannin.hatenadiary.com/entry/20131208/1386512864)

※注意:ここにあるコツというのは典型的な「ナップザック問題」や「コイン問題」などにしか通用しません。複雑なDP問題にまだ手を出せていませんので…:confounded:

プログラムを組むときの考え方としては、こんな感じです：
**1. 再帰を導入した全捜索のプログラムを考える
2. 捜索がかぶりそうな値にdpのリストを導入する
3. （できたら）漸化式を元にプログラムを組む**
という感じです。

では、例を見ていきましょう。

**問題：宝物がたくさん収蔵されている博物館に、泥棒が大きな風呂敷を一つだけ持って忍び込みました。盗み出したいものはたくさんありますが、風呂敷が耐えられる重さが限られており、これを超えると風呂敷が破れてしまいます。そこで泥棒は、用意した風呂敷を破らず且つ最も価値が高くなるようなお宝の組み合わせを考えなくてはなりません。
*風呂敷が耐えられる重さ W、および博物館にある個々のお宝の価値と重さを読み込んで、重さの総和が W を超えない範囲で価値の総和が最大になるときの、お宝の価値総和を出力するプログラムを作成してください。ただし、価値の総和が最大になる組み合わせが複数あるときは、重さの総和が小さいものを出力することとします。**
**(W ≤ 1,000, 1 ≤ N ≤ 1,000)**
*(PCK2004年予選問題の改造)*

この問題を全捜索で組みますと、

```cpp:zensousaku.cpp
#include <bits/stdc++.h>
using namespace std;

int n, w;
pair<int, int> takara[1050];

int solve(int w, int p){
int res;
if(p == n)res = 0;
else if(w < takara[p].second)res = solve(w, p+1);
else if(w >= takara[p].second)res = max(solve(w, p+1), solve(w-takara[p].second, p+1) + takara[p].first);
return res;
}

int main(){

scanf("%d", &w);
scanf("%d", &n);

for(int i = 0; i < n; i++)cin >> takara[i].first >> takara[i].second;

cout << solve(w, 0) << endl;
}
```
となります。
これに動的計画法をいれると、

```cpp:dp.cpp
#include <bits/stdc++.h>
using namespace std;

int n, w;
int dp[1050][1050];
pair<int, int> takara[1050];

int solve(int w, int p){
int res;
if(dp[w][p] != -1)return dp[w][p];
if(p == n)res = 0;
else if(w < takara[p].second)res = solve(w, p+1);
else if(w >= takara[p].second)res = max(solve(w, p+1), solve(w-takara[p].second, p+1) + takara[p].first);
return dp[w][p] = res;
}

int main(){

scanf("%d", &w);
scanf("%d", &n);

for(int i = 0; i < n; i++)cin >> takara[i].first >> takara[i].second;

memset(dp, -1, sizeof(dp));

cout << solve(w, 0) << endl << ;
}
```

となります。

`zensousaku.cpp`と`dp.cpp`を比べればわかりますが、違いはdpのリストを使っているかどうか、あとはもし既に計算済みの値を関数で要求されると計算済みの値を返す`if(dp[w][p] != -1)return dp[w][p];`しかありません。
このように、全捜索から簡単にDPにコードを変えることができます。

ご参考になりましたでしょうか。何か投稿の問題点やミスなどを見つけましたら、気軽にコメントを残してください！
[Ionic]スクロールイベントでサブヘッダーを出したり消したりする方法

# Keyword

* ion-toolbar
* ngIf
* ion-content
* ViewChild

# Image
![qiita.gif](https://qiita-image-store.s3.amazonaws.com/0/164245/be368135-744c-6a29-437b-c46627c39939.gif)



# Ionic Info
```bash
cli packages: (/Users/xxxxxxx/.nodebrew/node/v8.1.2/lib/node_modules)

    @ionic/cli-utils  : 1.12.0
    ionic (Ionic CLI) : 3.12.0

local packages:

    @ionic/app-scripts : 3.0.0
    Ionic Framework    : ionic-angular 3.7.1

System:

    Node : v8.1.2
    npm  : 5.1.0 
    OS   : macOS Sierra

Misc:

    backend : legacy
```

# How To

htmlファイルを用意

```html
<ion-header>
  <ion-navbar color="primary">
    <ion-title>
      シフトカー
    </ion-title>
  </ion-navbar>

  <!-- このパーツが出たり消えたりする -->
  <ion-toolbar *ngIf="showSubHeader">
    <ion-searchbar></ion-searchbar>
  </ion-toolbar>
  <!---------------------------->

</ion-header>

<!-- スクロールの開始と終了のイベントを拾う -->
<ion-content padding (ionScrollStart)="onScrollEvent($event)" (ionScrollEnd)="onScrollEvent($event)" >
  <ion-list>
    <ion-item *ngFor="let name of list;">
      {{name}}
    </ion-item>
  </ion-list>
</ion-content>
```

表示非表示フラグを用意
ViewChildデコレータでContentを取得

```typescript
@ViewChild(Content) content: Content;
showSubHeader: boolean;
```

スクロールイベントで発火される処理を用意する

```typescript
onScrollEvent(event: ScrollEvent) {
  switch (event.directionY) {
    case 'up':
      this.zone.run(() => {
        this.showSubHeader = true;
        this.content.resize();
      });
      break;
    case 'down':
      this.zone.run(() => {
        this.showSubHeader = false;
        this.content.resize();
      });
      break;
    default:
  }
}
```

ionScrollStartとionScrollEndイベントを拾って
onScrollメソッドが実行される。

## DEMO
[デモ（GitHub Pages）](https://yosshitaku067.github.io/playground/index.html)

## 感想
もっといい方法がある気がするし、
スクロールで見え隠れよりはボタンで明示的に表示/非表示を制御してもいい気がする。
Swift4 配列を渡すと、文字列・偶数・奇数・小数に分けて表示

## **["あいう",  7,  2,  -2,  15,  0.9,  4.98, 9.0]を渡すと、分類表示する関数**

Swiftというかプログラミング初心者ですが書いてみました。
https://qiita.com/circular/items/5e56fc73958f4df1494d の少し発展形になります。

```swift:分類表示する関数
func classify(_ arraySample:[Any]){
    
    //結果出力用配列を準備
    var ArrayDecimal:[Double] = []
    var ArrayEvenNumbers:[Int] = []
    var ArrayOddNumbers:[Int] = []
    var ArrayString:[String] = []

    for element in arraySample{

        //配列の要素の型をチェックしていく
        //swiftのcase節は一つにマッチすると、それ以降のcase節は評価されない
        switch element{
        //isは型チェック演算子　左辺のインスタンスが右辺のクラスであれば、trueを返す
        //Int型の場合
        case is Int:
            //ダウンキャスト　asは型キャスト演算子
            let castedElementInt = element as! Int
 
            //偶数の場合　※Intの場合はtruncatingRemainderが不要(というより使用不可)
            if castedElementInt % 2 == 0{
                ArrayEvenNumbers.append(castedElementInt)
                
            //奇数の場合
            } else if castedElementInt % 2 != 0{
                ArrayOddNumbers.append(castedElementInt)
            }
        //String型の場合
        case is String:
            let castedElementString = element as! String
            ArrayString.append(castedElementString)
            
        //Double型の場合 　※Floatでキャッチしようとすると、小数が全てdefaultに流れていってしまった
        case is Double:
            let castedElementDouble = element as! Double
            ArrayDecimal.append(castedElementDouble)
        
        //switchに与えられた値の型が取りうる全ての値をカバーするcase節が存在するか、default節が存在する必要がある
        default:
            print("Something elseです")
        }
    }
    print("文字列は\(ArrayString)です")
    print("小数は\(ArrayDecimal)です")
    print("偶数は\(ArrayEvenNumbers)です")
    print("奇数は\(ArrayOddNumbers)です")
}


classify(["あいう",  7,  2,  -2,  15,  0.9,  4.98, 9.0])
```

**実行結果**

```:実行結果
文字列は["あいう"]です
小数は[0.90000000000000002, 4.9800000000000004, 9.0]です
偶数は[2, -2]です
奇数は[7, 15]です
```
9.0も小数扱いされてしまうのが問題点です。
[小ネタ]Unix timestamp milliseconds を MacOS X で取得する

よく忘れるのでメモ。
以下のリンクにまとまっていました。

[How do I get current Unix time in milliseconds using bash?](https://serverfault.com/questions/151109/how-do-i-get-current-unix-time-in-milliseconds-using-bash)

Node.js であれば以下。

```bash
$node -e 'console.log(Date.now())'
1506861452421
```

bashであれば`$(command)`によってコマンド置換できるので以下のように使える。

```bash
$aws logs put-log-events --log-group-name "xxxx" --log-stream-name "App1" --log-events timestamp=$(node -e 'console.log(Date.now())'),message='Hello ' --sequence-token xxxxx
```
[Survey] Kaggle - Santander 7位解法まとめ



Kaggle - Santander Product Recommendation[^1]の7位解法[^2]の調査記事です．

Title: #7 solution
Name: Evgeny Patekha
Kaggle Discussion: https://www.kaggle.com/c/santander-product-recommendation/forums/t/26802/7-solution

## 概要

- (12月+1月)モデルと(6月+12月+1月)モデルのアンサンブル(重みは3:7)
- 2015年6月のモデルから税金の確率(reca)を挿入．
- 前月の製品がゼロだった顧客のために別モデルを構築．
- 5ヶ月間の購入履歴をもとに予測
- 欠損値の補間
- 年金支払でのスパイクを減らした
- 2015年3月,2015年5月,2016年6月に特徴量non_pensとnominaが下落(翌月に新製品があることを示唆)
- EUの預金低下を考慮して，すべての短期および中期預金は没収


## References

[^1]: Kaggle, [Santander Product Recommendation](https://www.kaggle.com/c/santander-product-recommendation).
[^2]: Evgeny Patekha, [#7 solution](https://www.kaggle.com/c/santander-product-recommendation/discussion/26802)
av1Codecやってみました。

# 概要

webrtcについて、いろいろ探っていたら目に止まったので、ちょっと動かしてみました。
https://aomedia.googlesource.com/
こいつですね。

# 今回つくったもの。

https://github.com/taktod/aomCheck
とりあえず動作するものが欲しいのでつくってみました。

プログラムは3つ
１つはopencvTest.c
これはaomでencode / decodeする前に必要なものがちゃんと揃ってるか確認する意味で作りました。
ffmpegの内臓コーデックである、avcodecでデコード
opencvの画像表示動作をつかって、デコードしたデータを表示
そのままコード書くと面倒なので、自作ライブラリのttLibCをつかって動作補助してます。

２つ目はencode.c
ffmpegのavcodecでデコード
aomをつかってav1のCodecとしてエンコード
適当なフォーマットがないので(*1)、4byte + frameのbinaryという形のbinファイルに保存

３つ目はdecode.c
encode.cでつくったbinファイルを読み込む
aomをつかってav1のCodecでデコード
opencvで画像を表示

という動作になってます。

# テストした環境

<img width="301" alt="スクリーンショット 2017-10-01 20.55.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/6246/d65f8860-f9c0-fdfb-ab04-fbf68332b109.png">

こんな環境で実施してみました。
ffmpeg、opencvはbrewでインストール済み。
readmeにも書きましたがaomとttLibCはプロジェクトディレクトリ上に展開してコンパイルだけ実施しました。システムは汚さない、コレ大切

# つくってみた感想
なんといってもlibvpxそっくり。
使い方がほぼ一緒でいけたので、楽でした。

いまのところ実験コードである、CONFIG_ANSを有効にしないと、encodeもdecodeもフリーズするみたいです。

encodeは確かに遅いですね。(*2)
ライブ系のサービスやってる人間としては、うわぁ・・・という感じでした。

```
		data->cfg.rc_max_quantizer = 31;
		data->cfg.rc_min_quantizer = 11;
		data->cfg.g_timebase.num = 1;
		data->cfg.g_timebase.den = 60;
		data->cfg.rc_target_bitrate = 500; // 500kbps
		data->cfg.g_pass = AOM_RC_ONE_PASS;
		data->cfg.g_threads = 4;
		res = aom_codec_enc_init(&data->codec, aom_codec_av1_cx(), &data->cfg, 0);
		if(res != AOM_CODEC_OK) {
			puts("filed to initialize aom. part2.");
      return false;
		}
		aom_codec_control(&data->codec, AOME_SET_CPUUSED, 8);
```

一応マルチスレッドで作業させて、SET_CPUUSEDで処理を軽減してみましたが、速度でないですね。
これ、一応webrtcで利用するつもりなんですよね。たぶん。

decodeは、まぁそこそこの速度でますね。さすがにこのPCでHD画質の60fpsの再生やってみたら、うわぁ・・・な結果になりましたが
640x360程度、30fps程度なら、おぉ、やるじゃんという結果になりました。

## メモ
*1: 適当なフォーマットがないと書きましたが、本来はwebm(av1 / opus)になるみたいです。
webmで保存してもよかったのですが、どのように保存するか調べるのも面倒だったし、つくっても今後仕様がかわりそうだったので、スルーしました。
単にdecode動作だけ抜き出してみたかったので、今回はtimestamp等も適当です。

*2: もうちょっとスペックの良いMacBookAirで、前日からこのコードで
big buck bunney(http://bbb3d.renderfarming.net/download.html)の
Standard 2D full HDの60fpsのデータを変換かけてますが、まだ終わらない。
SRE本まとめ（6章 分散システムのモニタリング）

自分の理解を深めるためにまとめてみました。[5章](https://qiita.com/bassbone/items/00c754f86a02b1f22413)の続きです。

## 6章 分散システムのモニタリング

### モニタリングの必要性
- 長期的なトレンドの分析
- 時間や実験グループ間での比較
- アラート
- アドホックな振り返り分析の進行

### 4大シグナル
- レイテンシ
- トラフィック
- エラー
- サチュレーション

### Bigtableでの事例
過剰なアラートが発生していたため、問題切り分けのためにかなりの時間を消費していた。アラートの閾値を下げることでアラートを減らし、根本的な解決のための時間を確保し、結果として早期に安定稼働させることができた。

（[7章](https://qiita.com/bassbone/items/33fbdcde83900c2893db)に続く）
[小ネタ]curl で3xxの時にリダイレクトする

`-L`オプションを付与すればOK.
レスポンスでスタータスコードが3xxでLocationヘッダーにURLが指定されてる場合に、Locationヘッダーに指定されたURLへのリクエストも実施します。

```bash
# -L オプションを付けないとリダイレクトしない
$curl -v https://google.co.jp
* Rebuilt URL to: https://google.co.jp/
*   Trying 172.217.26.3...
* Connected to google.co.jp (172.217.26.3) port 443 (#0)
* Initializing NSS with certpath: sql:/etc/pki/nssdb
*   CAfile: /etc/pki/tls/certs/ca-bundle.crt
  CApath: none
* SSL connection using TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
* Server certificate:
*       subject: CN=*.google.co.jp,O=Google Inc,L=Mountain View,ST=California,C=US
*       start date:  9月 13 17:11:49 2017 GMT
*       expire date: 12月 06 17:09:00 2017 GMT
*       common name: *.google.co.jp
*       issuer: CN=Google Internet Authority G2,O=Google Inc,C=US
> GET / HTTP/1.1
> User-Agent: curl/7.40.0
> Host: google.co.jp
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: https://www.google.co.jp/
< Content-Type: text/html; charset=UTF-8
< Date: Sun, 01 Oct 2017 12:20:42 GMT
< Expires: Tue, 31 Oct 2017 12:20:42 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 222
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
< Alt-Svc: quic=":443"; ma=2592000; v="39,38,37,35"
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.google.co.jp/">here</A>.
</BODY></HTML>
* Connection #0 to host google.co.jp left intact

# -Lオプション付与でリダイレクト
$curl -L https://google.co.jp
```

なお、`man curl`を見ると以下のように記載されていました。

```
       -L, --location
              (HTTP/HTTPS)  If  the server reports that the requested page has
              moved to a different location (indicated with a Location: header
              and  a  3XX  response code), this option will make curl redo the
              request on the new place. If used together with -i, --include or
              -I, --head, headers from all requested pages will be shown. When
              authentication is used, curl only sends its credentials  to  the
              initial  host.  If a redirect takes curl to a different host, it
              won't be able to intercept the user+password. See  also  --loca‐
              tion-trusted  on how to change this. You can limit the amount of
              redirects to follow by using the --max-redirs option.

              When curl follows a redirect and the request is not a plain  GET
              (for example POST or PUT), it will do the following request with
              a GET if the HTTP response was 301, 302, or 303. If the response
              code  was  any  other  3xx code, curl will re-send the following
              request using the same unmodified method.

              You can tell curl to not change the non-GET  request  method  to
              GET  after  a  30x  response  by using the dedicated options for
              that: --post301, --post302 and -post303.
```
インターネットに繋がらないサーバでもyumでパッケージ管理をするための方法

インターネットに繋がらないシステム内にある Linux サーバに対してパッケージ管理をするための方法です。

管理したいサーバのクローン（これはインターネットに繋ぐ）を用意して USB にローカルな yum リポジトリを作って対象の Linux サーバを更新します。CentOS 7.3 (1611) で検証しています。

# 準備するもの

管理サーバと別に、クローンのサーバを用意します。

クローンの OS は管理サーバに入れたものと同じディスクとインストール方法を使ってセットアップしてください。管理サーバと違ってこちらはインターネットに繋げます。

# ローカルな yum リポジトリを作る

この作業は **クローンサーバ** のほうで行います。

管理したいサーバに install or update したいパッケージ全てに対して yum の --downloadonly オプションをつけて RPM のダウンロードのみを行います。保存先のディレクトリは USB ディスクを指定しておきます。

```shell-session
$ sudo yum install --downloadonly --downloaddir=<directory> <package>
```

```shell-session
$ sudo yum update --downloadonly --downloaddir=<directory> <package>
```

必要な RPM を全てダウンロードしたら、そのディレクトリを yum リポジトリにします。

リポジトリの作成には createrepo を使います。`--simple-md-filenames` の意味は `Do not include the file's checksum in the metadata filename.` ということで、私の環境ではローカルのリポジトリでチェックサムは不要なのでオプションをつけています。

```shell-session
$ sudo yum install createrepo
$ sudo createrepo --simple-md-filenames <directory>
```

# ローカルな yum リポジトリからインストールする

ここからの作業は **管理したいサーバ** のほうで行います。

まず USB ディスクに作ったローカルの yum リポジトリを管理サーバにマウントします。（マウントの方法は省略）

次にローカルの yum リポジトリを登録します。

```shell-session
$ sudo vi /etc/yum.repos.d/MyLocal.repo
```

MyLocal.repo は次の通りです。`baseurl=<directory>` の部分はローカル yum リポジトリが `/media` なら `baseurl=file:///media` にします。

```text
[my-local]
name=MyLocal
baseurl=<directory>
gpgcheck=0
enabled=1
```

最後に、登録したローカル yum リポジトリから必要なパッケージを install, update します。

```shell-session
$ sudo yum --disablerepo=* --enablerepo=my-local install <package>
```

```shell-session
$ sudo yum --disablerepo=* --enablerepo=my-local update <package>
```
辞書型のリストから、特定のキーの値を取り出したい(Python3)

# 概要
- Pythonで、辞書型のリストから、特定のキーの値を取り出したい
- 次項に記述しましたが、限られたケースの実装メモです


# 具体的には
- 辞書型のリストから、Key='Name'である要素のKey='Value'の値を取り出したい
- もう少し正確に記述すると、キーが`Key`の値が`Name`の要素を特定して、キーが`Value`の値を取り出したい
- 書くほどに意味不明になりますが、下記の配列から `apple` を取り出したいということです
- こんな冗長な保持の仕方しなくても…と思いますが、APIなどのデータ受け渡しの場面では、まああると思います
- （設計側の気持ちを考えたら理解できます）

```python
[{'Key': 'Name',     'Value': 'apple'},
 {'Key': 'Color',    'Value': 'red'},
 {'Key': 'Quantity', 'Value': 10}]
```

# 実装

サンプルソース

```python
list = [{'Key': 'Name',     'Value': 'apple'},
        {'Key': 'Color',    'Value': 'red'},
        {'Key': 'Quantity', 'Value': 10}]

name_values = [x['Value'] for x in list if x['Key'] == 'Name']
name_value = name_values[0] if len(name_values) else ''
print(name_value)
```

結果

```
apple
```

# 補足

- 要は辞書型要素配列を走査し、キーが`Key`でその値が`Name`だったら、その要素のキーが`Value`の値を取り出す、ということです。（日本語のほうが長い）
- すべての要素が `Key` と `Value` というキーを持っている辞書型である、という前提の記述です
- もっと広く受け入れるのであればキーが存在していることの判定が要りますね
- （データ受け渡し仕様がある前提であれば例外でキャッチでも良いかなとも思ったりしています）

# 追記

- 後から見直したらわかりにくかったので。

```python
def getValue(key, items):
    values = [x['Value'] for x in items if 'Key' in x and 'Value' in x and x['Key'] == key]
    return values[0] if values else None


# 使用例
items = [{'Key': 'Name',     'Value': 'apple'},
         {'Key': 'Color',    'Value': 'red'},
         {'Key': 'Quantity', 'Value': 10}]
print(getValue('Name', items))
# -> apple

print(getValue('Quantity', items))
# -> 10

print(getValue('hoge', items))
# -> None
```
VimでEsc押下時に英数入力に変更する

[目的]
VimでEsc押下時に英数入力に変更する

[対象]
Terminal, iTerm2, Cloud9, MacVim

[環境]
OS X El Capitan 10.11.6 

[手順]
１. Install Karabiner-Elements
Download From https://pqrs.org/osx/karabiner/
２. Create  Setting_File
Launch Terminal or iTerm2
`vi　~/.config/karabiner/assets/complex_modifications/FromEscapeToJapanese_eisuu.json`

```FromEscapeToJapanese_eisuu.json
{
  "title": "Terminal等でESC時に日本語入力を英数に",
  "rules": [
        {
  "description": "Terminal等でESCを押したときに日本語入力を英数に切り替える。",
  "manipulators": [
       {
        "type": "basic",
        "from": { "key_code": "escape", "modifiers": { "optional": [ "any" ] } },
        "to": [ { "key_code": "japanese_eisuu" }, { "key_code": "escape" } ],
        "conditions": [ { "type": "frontmost_application_if",
        "bundle_identifiers": [
          "^com\\.apple\\.Terminal$",
          "^org\\.vim\\.",
          "^com\\.googlecode\\.iterm2$",
          "^org\\.mozilla\\.firefox$",
          "^com\\.google\\.Chrome$",
          "^com\\.apple\\.Safari$"
       ]
      }
     ]
    }
   ]
  }
 ]
}
```
３. Enable  Setting
Launch  Karabiner-Elements
Complex Modifications > Rules > [Add rule]
Enable  rule 'Terminal等でESC時に日本語入力を英数に'
Restart Terminal or Cloud9

[参考]
https://qiita.com/takaeda/items/38ecf7d98d1a3ef99ef0
【Xcode9】ERROR ITMS-90022でひたすらコケる

# 環境
- macOS High Sierra ver 10.13
- Xcode 9.0
- Swift 3.2

# エラー内容

Xcode9にリリース作業をしようと、iTunes Connectにアップロードしようとしたら、

> ERROR ITMS-90022: "Missing required icon file. The bundle does not contain an app icon for iPhone / iPod Touch of exactly '120x120' pixels, in .png format for iOS versions >= 7.0."

とXcode8では出なかったエラー、「アイコンが必要だよ」と怒られてこれ以上進むことができない。
このプロジェクトでは、`Assets.xcassets`に正しいサイズのでアイコンをセットしてるし、`Asset Catalog App Icon Set Name`も正しく設定されている。

どうやら、Xcode9のバグらしく、皆んな苦労している模様…
- https://forums.developer.apple.com/thread/86290

# 解決方法
上記のリンク等に載ってる解決方法を色々試したが、結局うまく行かず…
最終的に、
1. Xcode9で、［Device］を[Generic iOS Device]にする
2. [Product]->[Archive]を押して、アーカイブをする
3. [Window]->[Organizer]を開き、先程アーカイブしたものを選択し、[Export]を任意の場所にする（手順に従う）
4. Exportが終わったら、任意の場所に`アプリ名.ipa`があることを確認
5. Xcode8を[ダウンロード](https://developer.apple.com/download/more/)
6. Xcode8を起動し、[Xcode]->[Open Developer Tool]->[Application Loader]を選択し、アプリをアップロード

自分はこれでエラーがでることなくアップロードすることができました👏
Dell Network Switch Sシリーズ(S4048)コマンドメモ

Dellのエンタープライズ向けスイッチである、Sシリーズ
そのS4048Tを実際に設定した際のメモを記載します。
これ誰あれば、とりあえずの設定は可能かと。
時間があれば、スタックとVRFのコマンドも追加します。

#環境設定
##ホスト名を設定

```
hostname s4048tsw01
```

##SSHを有効

```
ip ssh server enable
```

##SSHアクセスユーザーを作成

```
username admin password password privilege 15
```

##タイムゾーン設定

```
clock timezone japan 9
```

##NTPサーバーを設定 (mfeedを設定)

```
ntp server 210.173.160.86
ntp source Vlan 1
```

##SNMP設定

```
snmp-server community public rw
```

##管理ポートにIPを付与する

```
interface ManagementEthernet 1/1
ip address 192.168.1.254/24
no shutdown
```

##管理ネットワークにデフォルトゲートウェイを設定

```
management route 0.0.0.0/0 192.168.1.1
```


#スイッチ設定
##ポートをトランクモードにする

```
interface range TenGigabitEthernet 1/1 - 1/48
portmode hybrid
```

##スイッチモードにする（でないとスイッチとして動作しない）

```
interface range TenGigabitEthernet 1/1 - 1/48
switchport
```

先にportmode hybridをいれる
それから、switchportを流さないとエラーになる、


##ポートを開ける

```
interface range TenGigabitEthernet 1/1 - 1/48
no shutdown
```

##VLAN設定（作成とタグ割り当て）

```
interface Vlan 10
 no ip address
 untagged TenGigabitEthernet 1/1-1/48
 no shutdown
```

```
interface Vlan 20
 no ip address
 tagged TenGigabitEthernet 1/1-1/48
 no shutdown
```


###40Gのポートを10G４ポートに分割する方法
オクトパスケーブルを利用することで、40Gの口を４つの10Gポートに変更できます。

構文例
```
stack-unit stack-unit-number port number portmode quad
```
スタック番号１で、1/49-52の40Gポートを１０Gに変更したい場合

```
stack-unit 1 port number 49 quad
stack-unit 1 port number 50 quad
stack-unit 1 port number 51 quad
stack-unit 1 port number 52 quad
```

分割されたポートは「1/49/1」のようにサブポートが作成されます
ホームページを作っていて経験したこと

僕が[ホームページ](http://hota1024.com)を作っていて経験したことを載せていきます。

# 完成までに**5つホームページを作った**話
僕のホームページは5つ作ったホームページの中の1つです。
5つ作り終えて一番上出来だったのが今の状態です。

なぜそんなに作ったのかというと厳選をしたかったからです。
5つも作っておけば結構完成度が高いものも出てきますし、フレームワークの使いみちや画面遷移がより良いものになっていきます。

| No | 状態 | 気づいたこと/やれるようになったこと |
|:-:|:-:|:-:|
| 1  | 全てHTML  | HTMLだけだと大したこと出来ない  |
| 2  | PHP  | データベースも使えるようになって簡単な投稿システムが作れるようになった  |
| 3  | Bootstrapを使った  | HTMLフレームワークの使い方が分かった。PHPでBootstrapのnavbarを部品化できた。  |
| 4  | ページに一つフォルダを  | ページの親にフォルダを用意することでアドレスが`hota1024.com/about/`のように出来ることを知った  |
| 5  | jQueryを使い始めた  | JSフレームワークの使い方が分かった。jQueryを使うことで簡単なアニメーションをホームページに加えれたり非同期通信の使い方が分かった  |
|6|製作中...|wordpressをある程度使えるようになった|

# ホームページビルダーを使う前に全てテキストエディタでホームページを作っておくこと
現在ホームページをwordpressで再構成しています。
そこでも気づいたことが、HTMLやCSS、PHP、jQueryを経験したことでより素早く作業を進めれるようになっていることです。

# テキストエディタにはいろいろある
現在僕は[Atom](https://atom.io/)を使っています。
最初は[TeraPad](http://www5f.biglobe.ne.jp/~t-susumu/)を使っていましたがPHPやJSやMySQLが加わってくるとAtomが一番使いやすかったです。
そして感動したのが[Brackets](http://brackets.io/)です。
Bracketsは今でも愛用しています(Atomが一番だけど)。やっぱりライブプレビューは感動しました。PHPもプレビューしてくれるのでたまに使っています。

# 独自のマークダウンエディタを作った話
僕のホームページでは記事をマークダウンで記述しています。
その記事のエディタが自作マークダウンエディタです。
今は僕しか見れませんが今度githubで公開する予定です。
マークダウンエディタはJSとHTMLを使って作りました。
マークダウンパーサーにも色々あるので迷いました。

# 最後に
新しいサイトを見つけるとくせで「ページのソース」を見た後「検証ツール」でサイトを見るようになりました(笑)
cx_Freeze で依存ライブラリのコピー中にこける (Python3, OpenCV3)

# 概要
cx_Freeze 使って Python スクリプトを app にしていたら OpenCV の import に失敗していたので (暫定的な) 解決法をメモ．cx_Freeze の使い方とかはたくさんネットに上がっているので[ここ](http://pc.atsuhiro-me.net/entry/2014/03/09/104759)とか参照してください．

# 症状
環境:

- MacOS: 10.12.6
- Python: 3.5.2
- OpenCV: 3.1.0 (余談ですが MacOS で Python3.6 だと OpenCV3 入らない問題いつ解決されるんですかね)

簡単のために `cv2.imshow()` するだけの main.py を作成．

```Python:main.py
import cv2

window_name = 'sample'
file_name = '/path/to/img'

img = cv2.imread(file_name)
cv2.imshow(window_name, img)

cv2.waitKey(5000)
```

cx_Freeze の build 用スクリプトはこんな感じで ([ここ](http://pc.atsuhiro-me.net/entry/2014/03/09/104759)から拝借)．

```Python:setup.py
import sys
from cx_Freeze import setup, Executable

build_exe_options = {"packages": ["os", 'sys', 'cv2']}

base = None
if sys.platform == "win32":
    base = "Win32GUI"

setup(  name = "test",
        version = "0.0",
        description = "My GUI application!",
        options = {"build_exe": build_exe_options},
        executables = [Executable("main.py", base=base)])
```

build すると依存ライブラリのコピー中にこんなエラーが出ました．

```bash
$ python setup.py build
running build
running build_exe
...
copying mac64/libcilkrts.5.dylib -> build/exe.macosx-10.6-x86_64-3.5/libcilkrts.5.dylib
error: [Errno 2] No such file or directory: 'mac64/libcilkrts.5.dylib'
```

# 解法
他のライブラリはフルパスで指定しているのにこれだけ相対パスになってるからですね．brew で gcc 入れてるからかな〜とも思いましたけど普通に `/usr/local/Cellar/gcc/` 以下も読み行ってるしよく分からないですが，cx_Freeze のバグではって感じです ([このへん](https://github.com/anthony-tuininga/cx_Freeze/blob/79f4dba9554a132f08a2dfe09d4e05b88a4ee571/cx_Freeze/freezer.py#L272))．

圧倒的に脳筋な解法なんですけど，要するに `libcilkrts.5.dylib` が見つからないだけなのでこれがあるところに mac64 って名前でシンボリックリンク貼ったら解決します．

```bash
$ find /usr/local/Cellar -name '*libcilkrts*'
/usr/local/Cellar/gcc/7.1.0/lib/gcc/7/libcilkrts.5.dylib
```
みたいに見つかると思うので，setup.py があるディレクトリで，

```bash
$ ln -s /usr/local/Cellar/gcc/7.1.0/lib/gcc/7/ mac64
```
するだけです．

これで build は通りますが，生成された main 実行すると実行時エラー吐きます．

```bash
ImportError: numpy.core.multiarray failed to import
```

OpenCV を使用するする際には numpy も packages に追加しましょう (Python で `import cv2` するときはよしなにやってくれるんですがね)．setup.py 中の

```
build_exe_options = {"packages": ["os", 'sys', 'cv2']}
```
を，

```
build_exe_options = {"packages": ["os", 'sys', 'numpy', 'cv2']}
```
とすれば無事描画できます．

以上です．cx_Freeze.setup() に `/usr/local/Cellar/gcc/7.1.0/lib/gcc/7/` も読み行けよみたいなオプション与えられればそれで終わるんですけどよくわかりませんでした，どなたかご存知でしたら教えてください．
パラメータひとつでサッとUIViewに枠線を引く


あれ？タッチ反応しない？viewのサイズ合ってる？みたいな事態の時によく使ってます
さっとUIViewに赤い枠線を引いたり消したりするパラメータを追加するextension

#使い方
```
let v = UIView(frame:CGRect(x:0, y:0, width:100, height:100))
v.isDrawRectangle = true //赤い枠線を引く
v.isDrawRectangle = false //赤い枠線を消す
```

#ソース
```swift
extension UIView{
  var isDrawRectangle:Bool{
    get{
      return self.layer.borderWidth > 0
    }
    set(value){
      if(value){
        self.layer.borderColor = UIColor.red.cgColor
        self.layer.borderWidth = 1
      }
      else{
        self.layer.borderColor = UIColor.clear.cgColor
        self.layer.borderWidth = 0
      }
    }
  }
}
```
Macでphpenv+php-buildを利用して複数バージョンのPHPを管理する

# 手順

## 1. phpenvをインストール
```
git clone https://github.com/CHH/phpenv.git
cd phpenv/bin
./phpenv-install.sh
```

## 2. php-buildをインストール
```
git clone https://github.com/CHH/php-build.git ~/.phpenv/plugins/php-build
```

## 3. Macの場合は以下もインストール
```
brew install autoconf
brew install automake
```

上記をインストールしないと、phpenv install 実行時に以下のようなビルドエラーが出るため。

```
[Info]: Loaded extension plugin
[Info]: Loaded apc Plugin.
[Info]: Loaded composer Plugin.
[Info]: Loaded github Plugin.
[Info]: Loaded uprofiler Plugin.
[Info]: Loaded xdebug Plugin.
[Info]: Loaded xhprof Plugin.
[Info]: Loaded zendopcache Plugin.
[Info]: php.ini-production gets used as php.ini
[Info]: Building 5.6.31 into /Users/<username>/.phpenv/versions/5.6.31
[Downloading]: https://secure.php.net/distributions/php-5.6.31.tar.bz2
[Preparing]: /var/tmp/php-build/source/5.6.31

-----------------
|  BUILD ERROR  |
-----------------

Here are the last 10 lines from the log:

-----------------------------------------
configure: WARNING: This bison version is not supported for regeneration of the Zend/PHP parsers (found: 2.3, min: 204, excluded: 3.0).
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.
configure: error: Cannot find OpenSSL's <evp.h>
-----------------------------------------

The full Log is available at '/tmp/php-build.5.6.31.20171001174511.log'.
[Warn]: Aborting build.
```

## 4. PHPをインストール
```
# インストール可能なバージョンの確認
phpenv install --list

# 任意のバージョンをインストール
phpenv install 5.6.31

# インストール済バージョンの表示
phpenv versions

# 使用バージョンの切替
phpenv global 5.6.31

# 使用バージョンの表示
phpenv versions

# PHPバージョン確認
php -v
```

以上
pythonでさくっとスクレイピング（Requests + Beautiful Soup 4）

pythonはスクレイピングなども簡単にできるようなライブラリが多く用意されていますが、いまいち調べてみないとどれが最新の情報なのか分からなかったためまとめました。

今回は、URLを叩いて要素を取得するのにRequests、その後の分析にはBeautiful Soupを使っています。

##Requestsとは
以下は[公式ページの開発ドキュメント](http://requests-docs-ja.readthedocs.io/en/latest/)から

>Requestsは人が使いやすいように作られた、エレガントでシンプルなPythonのHTTPライブラリです。 

Pythonは標準で同様の機能を持つurllib2を持っていますが、ものすんごく使いにくいと評判です。例えば公式で紹介されている例では、ベーシック認証でログインするページの要素を取得する場合です。

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

import urllib2

gh_url = 'https://api.github.com'

req = urllib2.Request(gh_url)

password_manager = urllib2.HTTPPasswordMgrWithDefaultRealm()
password_manager.add_password(None, gh_url, 'user', 'pass')

auth_manager = urllib2.HTTPBasicAuthHandler(password_manager)
opener = urllib2.build_opener(auth_manager)

urllib2.install_opener(opener)

handler = urllib2.urlopen(req)

print handler.getcode()
print handler.headers.getheader('content-type')

# ------
# 200
# 'application/json'
```

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

import requests

r = requests.get('https://api.github.com', auth=('user', 'pass'))

print r.status_code
print r.headers['content-type']

# ------
# 200
# 'application/json'
```

と言うわけで、Requestsを使うとサクッと取得することができます。Anaconda環境ではpipの代わりに`conda install requests`でインストールできます。

##Beautiful Soup(BS)とは
BSは、先ほどのRequestsで取得したHTMLファイルから望むデータを取得するためのライブラリです。最新バージョンは4系でPython3に対応しています。これもcondaを使って`conda install beautifulsoup4`でインストールできます。

##スクレイピングをしてみる
以下のような感じでヤフーのトップページにあるニューストピック一覧を取得してみます。

```getYahooNewsTopics.py
import requests
from bs4 import BeautifulSoup
import re

#初回のみ
target_url = "https://www.yahoo.co.jp/"
#Requestsを使って、webから取得
r = requests.get(target_url)
#要素を抽出
soup = BeautifulSoup(r.text, 'lxml')

#HTMLファイルとして保存したい場合はファイルオープンして保存
with open('originDataOld.html', mode='w', encoding = 'utf-8') as fw:
    fw.write(soup.prettify())

#soup.find_allを用いてリンク先が「news.yahoo.co.jp/pickup」の項目を全て取得
elems = soup.find_all(href=re.compile("news.yahoo.co.jp/pickup"))
for e in elems:
    print(e.getText())

# 出力結果
# 自民の誤算 現職閣僚も危機感
# 中川俊直氏、不出馬を表明
# 北ミサイル 「慣れ」危惧も
# カタルーニャ 独立投票が開始
# 冷蔵庫にカメラ パンフ載らず
# 巨人CS進出逃す 球団史上初
# 瀬戸「水泳なので」長いキス
# 佐々木希 白無垢で10月挙式?

```
やっていることは、Requestsでヤフーのトップページを取得し、そこから正規表現が使えるreライブラリを使用して「news.yahoo.co.jp/pickup」を含むリンクを持つ項目を全て列挙しました。

Soupのfind_all等詳細な説明は参考サイトに詳しく載っていますのでここでは省略します。

具体的にどのような項目を指定して上手くスクレイピングをするかがキモですが、、、力が尽きたのでそのあたりは後ほどアップデートします。。

##参考にしたサイト様
[PythonとBeautiful Soupでスクレイピング](https://qiita.com/itkr/items/513318a9b5b92bd56185)
[Requests の使い方 (Python Library)](https://qiita.com/sqrtxx/items/49beaa3795925e7de666)
[Requests: 人間のためのHTTP](http://requests-docs-ja.readthedocs.io/en/latest/)
[Beautiful Soup 4.2.0 Doc. 日本語訳](http://kondou.com/BS4/)
surround.vimで日本語の括弧を挿入する


Vimのプラグインである[surround.vim](https://github.com/tpope/vim-surround)を使っていますが，デフォルトでは日本語の括弧に対応していないので，設定で追加する方法を調べました．

とりあえず `「」【】（）＜＞｛｝` にだけ追加した設定が以下です．

```vim:.vimrc
""""""""""""""""""""""""""""""
"""" vim-surround {
  " add japanese surrounds
  let g:surround_{char2nr("「")} = "「 \r 」"
  let g:surround_{char2nr("」")} = "「\r」"
  let g:surround_{char2nr("【")} = "【 \r 】"
  let g:surround_{char2nr("】")} = "【\r】"
  let g:surround_{char2nr("（")} = "（ \r ）"
  let g:surround_{char2nr("）")} = "（\r）"
  let g:surround_{char2nr("＜")} = "＜ \r ＞"
  let g:surround_{char2nr("＞")} = "＜\r＞"
  let g:surround_{char2nr("｛")} = "｛ \r ｝"
  let g:surround_{char2nr("｝")} = "｛\r｝"
"""" }
""""""""""""""""""""""""""""""
```


カスタマイズした分は `yss（` などで括弧を追加することはできますが， `cs（＜` での入れ替えなど，他のオペレーションには対応していないようです．詳しくは `:help surround-customizing` でドキュメントが参照できます．

と，ここまで書いたあとで以下のような記事を見つけたので，こちらで紹介されている[vim-operator-surround](https://github.com/rhysd/vim-operator-surround)もいつか試してみたいと思います．

[Vimで日本語を編集するいくつかの方法 - Qiita](https://qiita.com/murashitas/items/f2be0dda2a4498cb7985#surround)
Git操作備忘録


##git　基本操作
ファイルをステージ：
```$git add```

ファイルをアンステージ:
```
$ git reset <FILENAME>
```

ファイルをコミット :
```git commit -m <COMMENT>```

##差分表示
ワークツリーとインデックスの差分を表示：
```$git diff```

インデックスとリポジトリの差分を表示：
```$git diff --cached```

ワークツリーとリポジトリの差分を表示：
```$git diff HEAD```

##履歴表示
コミットの履歴を表示：
```$git log```

コミットの履歴を差分内容を含めて表示：
```$git log -p```

##ステージ
複数の編集を順番に選択方式でステージ：
```$git add -p```

##スタッシュ
ワークツリーの編集をスタッシュ領域へ一時退避：
```$git stash```
スタッシュ領域の中をリスト形式で表示　　　　：
```$git stash list```
スタッシュ領域から取り出す　　　　　　　　　：
```$git stash pop```
スタッシュ領域にあるN番目の内容を削除 　　　：
```$git stash drop stash@{N}```

##amend
直近のコミットを上書きするコミット：
```$git commit --amend```

##リモートリポジトリ
リモートリポジトリを表示　　 ：
```$git remote -v```
リモートリポジトリを追加　　 ：
```$git remote add <NAME> <URL>```
リモートリポジトリを削除　　 ：
```$git remote rm <NAME>```
リモートリポジトリのURLを変更：
```$git remote set-url <NAME> <URL>```

###ファイルを削除してその内容をステージ
```$git rm　<FILENAME>```

###ファイルのリネームしえその内容をステージ
```$git mv　<FILENAME>```
PowerShellでDesignSpark PCBのガーバーファイルをリネームする

elecrowやFusion PCBなどの安いPCBサービスで基板を作るとき、DesignSparkの出力のガーバーファイルはリネームする必要があります。

DesignSparkPCB 8.0でのデフォルトの出力は以下のようなります
（プロジェクト名がtestの場合）

test - Bottom Copper.gbr -> test.GBL
test - Bottom Silkscreen.gbr -> test.GBO
test - Bottom Copper (Resist).gbr -> test.GBS
test - Drill Data - [Through Hole].drl -> test.TXT
test - Top Copper -> test.GTL
test - Top Silkscreen.gbr -> test.GTO
test - Top Copper (Resist).gbr -> test.GTS


変更が面倒で間違えやすいのでリネームするPowerShellを作りました
以下のコードをガーバーファイルのあるフォルダでPowerShellで実行すればリネームされます

~~~
ls | ForEach-Object {
    
    if($_ -match " \- Drill Data.*"){
	$_ | Rename-Item -NewName {$_.Name -replace " \- Drill Data.*",".txt"}
    }elseif($_ -match " \- Bottom Copper \(Resist\).*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Bottom Copper \(Resist\).*",".GBS"}
    }elseif($_ -match " \- Bottom Copper.*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Bottom Copper.*",".GBL"}
    }elseif($_ -match " \- Bottom Silkscreen.*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Bottom Silkscreen.*",".GBO"}
    }elseif($_ -match " \- Top Copper \(Resist\).*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Top Copper \(Resist\).*",".GTS"}
    }elseif($_ -match " \- Top Copper.*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Top Copper.*",".GTL"}
    }elseif($_ -match " \- Top Silkscreen.*"){
        $_ | Rename-Item -NewName {$_.Name -replace " \- Top Silkscreen.*",".GTO"}
    }
}
~~~
Walti.ioを始める際の注意点・躓いたこと

メールボックスあさっていたらWalti.ioのクーポンを見つけたので、早速試したら躓いた
[Walti.io | サーバーサイドのセキュリティスキャンをもっと身近に。](https://walti.io/)
[【キャンペーン終了】毎月500円分が2年間無料になる、Walti.ioさくらクーポンプレゼントキャンペーン](https://www.sakura.ad.jp/request_form/walti-sakura-coupon/)

#スキャンを同時にすると失敗する
会員登録とターゲット設定を終えて、セキュリティ診断を開始した
診断は各項目にわかれているようで、個別にする必要があるらしい

で、この診断を面倒だからまとめて行う（全項目の`FREEスキャン`ボタンを押す）と
失敗しました！失敗しました！失敗しました！になった
![alt](https://qiita-image.cloudremix.net/Walti-Dashboard.jpg)

具体的にはスキャンの進歩状況がバグり
![alt](https://qiita-image.cloudremix.net/Walti-NaN.jpg)

しばらくしたら、FAILEDとなった
![alt](https://qiita-image.cloudremix.net/Walti-Failed.jpg)

#対策？
スキャンは順番に行いましょう。
面倒だからといって一斉に行うと失敗します。

#蛇足
なんかもやもやする

```:メール件名
XXX.XXX.XXX.XXX に対する wpscan が失敗しました。エラーが発生しました。しばらくしてからもう一度お試しください。
```
arulesSequencesの使い方に関するメモ

# はじめに
時系列パターン分析とは、バスケット分析に時系列における順序の要素を加えたものです。これは以下のような条件が満たされる場合には、有効な分析だと思います。
- 顧客IDが付与されている
- 購入順序を決めるデータ（購入日など）がある

cSPADE(Sequential Pattern Discovery using Equivalence classes)は、時系列パターン分析を行うためのアルゴリズムです。RからはarulesSequencesパッケージから利用することができます。arulesSequencesの使い方に関する記述があまり見当たらなかったので簡単にまとめておきます。
本記事では通常のデータフレームから適切なデータ形式に変更するところから紹介します。
コードはWindows7で実行しています。

# 時系列パターン分析の実行
本記事ではテストデータを作成し、このパターンを分析します。arulesSequencesにはテストデータが同梱されてますが、通常、手元にあるデータがそのような綺麗な形式になっていることはないからです。
## ライブラリの読み込み
```
library(arulesSequences)
library(dplyr)
```

## テストデータの作成
5人が商品A, B, Cを購入する簡単な例を作ってみます。

```
set.seed(12)
sequenceID <- c(rep(1, 5), rep(2, 5), rep(3, 5),rep(4, 5), rep(5,5))
Item <- sample(LETTERS[1:3], 25, replace=T)
df <- data.frame(sequenceID, Item)
```

|sequenceID  |Item  |
|---|---|
|1  |A  |
|1  |C  |
|1  |C  |
|1  |A  |
|1  |A  |
|2  |A  |

arulesSequencesにおいて、sequenceIDは顧客IDに対応します。

## データの加工
時系列を表す列を追加します。
顧客ごとに、現在の順番で購入が行われたとしてIDを振ります。

```
df$orderID <- 1:nrow(df)
df <- 
  df %>% group_by(sequenceID) %>% 
  mutate(eventID = order(orderID)) %>% 
  select(sequenceID, eventID, Item)
```

|sequenceID   |eventID  |Item  |
|---|---|---|
|1  |1  |A  |
|1  |2  |C  |
|1  |3  |C  |
|1  |4  |A  |
|1  |5  |A  |
|2  |1  |A  |

sequenceID、eventID共に整数型である必要があります。eventIDに該当するカラムが最初からあることはあまりないと思うので、加工する必要があります。

次にarulesSequencesが識別できる形、transaction形式に変形します。
直接transactionsに変形する方法もあるのですが、ここでは外部ファイルに書き出す方法を紹介します。

```
write.table(df, "temp.csv", sep = ",", row = F, col = F)
temp <- read_baskets("temp.csv", sep = ",", info = c("sequenceID", "eventID"))
```
行名、列名を取って出力するのがポイントです。
sequenceIDとeventIDの名称は固定で、この通りにする必要があります。
## 実行

```
s <- cspade(temp, parameter = list(support=0.2, maxlen=3))
```
cspadeにはいくつかパラメータがあります。
- support : 系列の発生確率の下限（デフォルトは0.1）
- maxsize : 系列に現れるアイテムの種類数の上限（デフォルトは10）
- maxlen  : 系列の長さの上限（デフォルトは10）
- mingap, maxgap  : 系列の連続性において許容するgapの下限と上限（デフォルトはNone）

## 結果の出力
```
rules <- ruleInduction(s, confidence=0.5)
sort(rules, by=c('lift', 'confidence')) %>% inspect
```

|rule|support|confidence|lift |
|---|---|---|---|
|<{A}, {C}> => <{C}>|0.4|1|1.66|
|<{C}, {B}> => <{B}>|0.2|1|1.66|
|<{B}, {C}> => <{B}>|0.2|1|1.66|
|<{B}, {B}> => <{B}>|0.4|1|1.66|
|<{C}> => <{C}>|0.4|0.67|1.11|

ruleInductionは、confidenceが指定した値以上となるルールを抽出します。
ruleの右側は、系列の最後の値を取り出したものです。

念のため出力の各指標の意味をまとめておきます。
- support    : 系列の発生確率。sequenceIDごとに発生有無を判定している。
- confidence : ルールの左辺を条件付けたときの右辺の発生確率。バスケット分析と異なり、右辺が時系列的に後に来る場合の確率を計算している。
- lift       : confidenceを更に右辺の発生確率で割った値。左辺を条件付けると右辺の発生率が何倍になるかを計算している。

バスケット分析の自然な拡張であるため、同じ名前が使われているものと思われます。

# おわりに
可視化等について詳しい人がいたら是非教えてください。
【エラー】Cannot load module 'hogehoge' as 'hogehoge'


ライブラリと同じ名前のプロジェクトを間違えて作っちゃったのが原因。


以下にキャッシュが残ってるので、そっちをみちゃってた。
ゴミを削除して解決。
~/Library/Developer/Xcode/DerivedData/
パフォーマンスの良いアプリを開発するために心がけていること


# 前提
- Laravelを使ったアプリ開発において、パフォーマンス改善のために気をつけていることの備忘録です
- ゲームアプリ開発を前提にしています

# 心がけていること
## その1
- select文（->getメソッド）は不必要なフィールドまで呼び出さない
- 処理で必要なgetメソッドのみを引数に指定するようにする

## その2
- 配列変数を指定する場合には ' で囲む（例：hoge['apple']）

## その3
- 頻繁にIN句するフィールドにはINDEXを貼る

## その4
-  MySQLは1テーブルにつき1つのINDEXしか使用されない
-  同時に複数のフィールドのINDEXを使う場合は複合INDEXを作成する
-  複合INDEXは順番が大事なので使用する場合は注意が必要

## その5
-  JOINはしない
-  テーブルの結合は2つのSELECTを飛ばし、foreachで結合する

```php
// 連想配列への要素の追加
foreach ($hogeList as $hoge) {
    $hoge['追加するキー'] = 追加したい内容
}
```

## その6
- array_pushは使わない
- $array[] = hogehoge; 形式の配列追加を行う

## その7
- 比較演算は厳密な比較を行う（=== または !== など）

## その8
- for()やforeach()などの外で出来ることは外で先に行う

## その9
- コレクションメソッドはforeachで処理するよりも速度が遅い
- 速度が求められる部分や対象となる配列が多い場合はforeachで処理した方が良い
- コレクションは可読性の面でとても優れているのでケースバイケースで扱う

# 参考
- パフォーマンス1000%UP!PHPでMySQLのDB処理を行うと重いときに行うパフォーマンス施策～基礎編～
    - http://guide.websites.jp/2015/01/336.html
- 複合Index
    - http://d.hatena.ne.jp/yk5656/20140205/1392080263
    - [http://blog.xao.jp/blog/mysql/MySQLの超遅いSELECTが劇的に早くなった](http://blog.xao.jp/blog/mysql/mysql%E3%81%AE%E8%B6%85%E9%81%85%E3%81%84select%E3%81%8C%E5%8A%87%E7%9A%84%E3%81%AB%E6%97%A9%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F/)
    - https://qiita.com/EudyptesCapital/items/6a5d771d41168e9b738d
- PHP 高速化に関するメモ書き
    - https://thk.kanzae.net/net/itc/t2379/
- Laravelの Illuminate\Support\Collection と foreach の速度の比較
    - https://qiita.com/acro5piano/items/96b6fe8e4b465447d59c
- Laravel のマイグレーションで複合インデックスにしつつインデックス名を指定する方法
    - https://qiita.com/komatzz/items/9a2fb15c78aad7a63a90
Container Linux Core OSをさくらのVPSに建ててignition設定ファイルを使用する

ignition構成について、そこまで難しい事でもないのに、どこにも書かれていなかったので書きます

# インストール

ここの通り行えばできます（VNC コンソール の作業まで）
https://qiita.com/ignorant/items/924099ad4ed6c615023d#-coreos-container-linux-%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB

# 設定ファイルについて

現在のCoreOS設定は、ignition構成というものを使用する事が推奨されています
ignition後衛ファイルは `Container Linux Config` ファイルから `Config Transpiler（ct）` を使用して生成します

```
Container Linux Config (YAML形式) -> ignition構成ファイル(JSON形式)
```

`cloud-config` からの移行方法も示されています。以下を参照
https://coreos.com/os/docs/latest/migrating-to-clcs.html

# Container Linux Config

構成仕様は以下を参照
https://coreos.com/os/docs/latest/configuration.html

ユーザをdockerグループに追加させる必要はないようです。（何もしなくても所属していた）

```yaml
# This config is meant to be consumed by the config transpiler, which will
# generate the corresponding Ignition config. Do not pass this config directly
# to instances of Container Linux.

passwd:
  users:
    - name: core
      password_hash: "$6$vB3Bm..." # パスワードハッシュ
networkd:
  units:
    - name: 00-eth0.network
      contents: |
        [Match]
        Name=eth0

        [Network]
        DNS=【プライマリDNS】
        DNS=【セカンダリDNS】
        Address=【アドレス】/【サブネットマスク】
        Gateway=【ゲートウェイ】
```

## ユーザ

sshできるユーザを作っておかないと、インストール後にアクセスできなくなります
今回は以下の方法でパスワード認証します

```sh
sudo apt install whois
mkpasswd -m sha-512
Password: # <- パスワード入力
$6$vB3BmN37cI$qLClGN7WPbrGXt8jQhCTh......
```

## ネットワーク設定

今回は上のように手動設定しました
できれば書きたくないですが、対応方法を探すのはクラスタ構成したくなった時にとっておきます

## ファイルの生成

ct(Container Linux Config Transpiler)は以下からダウンロードします
https://github.com/coreos/container-linux-config-transpiler/releases

バイナリを以下のようなコマンドで実行します

```sh
./ct-v0.5.0-x86_64-pc-windows-gnu.exe --in-file config.yml -strict > ignition.json
```

## インストール

以下の手順で進めます。
https://coreos.com/os/docs/latest/installing-to-disk.html

```sh
sudo fdisk -l # -> インストールする物理ディスクを確認
sudo coreos-install -d /dev/vda -i ignition.json
sudo shutdown -h now
```

以下のようなメッセージが出た場合既存のデータを消すことで解決できるようです(私は無理でした)
詳細はこちらを確認してください
https://qiita.com/tubone/items/5995581b8e27c2277ba8#hdd%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%83%8F%E3%83%9E%E3%81%A3%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D

```
blockdev: ioctl error on BLKRRPART: Device or resource busy
Failed to reread partitions on /dev/vda
```

私は仮想マシンをシャットダウンした状態でisoアップロードからやり直したらうまくいきました

# おわり

Qiitaだけでほぼ情報が集まるのは実際すごいと思いました
Authコンポーネント：認証エラー（authError）のメッセージを動的に変更する

コントロラーで特定のロールの場合はアクセスを拒否し、メッセージをそのように表示したいとします。
ドキュメントに記載があるのですが探すのに手こずったため備忘録を兼ねてここでも書きます：

ソース：https://book.cakephp.org/3.0/ja/controllers/components/authentication.html

```
    public function isAuthorized($user = null)
    {
        // Users.roleがadminならば、通過
        if($user['role'] === 'admin'){
            return true;
        }else{
            $this->Auth->config('authError','このページは管理者専用です');
            return false;
        }
        return false;
    }
```
libGDXを使ってみる


# 環境
 - macbook pro
 - MaxOSX Sierra
 - Java 1.8.0_77

# 前提条件
 - mobileへのインストールは考えていません。（必要であれば、Android SDKやその他プラグインをインストールする必要がある）

# プロジェクトの作成

- 後述するコマンドを実行すれば、コマンドラインからプロジェクトを作成することができます。
- 現時点で、ios-moeを除外する方法がわからなかったので、除外したい方は、GUIから作成することをお勧めします。

```
java -jar gdx-setup.jar
```

- コマンドラインからのプロジェクト生成

```
Usage: GdxSetup --dir <dir-name> --name <app-name> --package <package> --mainClass <mainClass> --sdkLocation <SDKLocation> [--excludeModules <modules>] [--extensions <extensions>]

dir ... the directory to write the project files to
name ... the name of the application
package ... the Java package name of the application
mainClass ... the name of your main ApplicationListener
sdkLocation ... the location of your android SDK. Uses ANDROID_HOME if not specified. Ignored if android module is excluded
excludeModules ... the modules to exclude on the project generation separated by ';'. Optional
extensions ... the extensions to include in the project separated by ';'. Optional
```

- 実行例

```
java -jar ../tool/gdx-setup.jar --dir ./ --name sample01 --package com.sample.game --mainClass GameMain --sdkLocation /dummy --excludeModules android;Ios;Ios-moe;Html
```

# eclipseへの取り込み

```
./gradlew eclipse
```

# 実行方法

```
./gradlew run
```
railsでURLに困ったら読む

# layoutに入れているパーシャルをrederで引っ張る時

layoutに入れているパーシャルをrenderで引っ張る時はviewsをルートとしてURLを書く。

```ruby:rei
<%= render 'layouts/postsindex' %>
```

# urlの先頭に/を入れるか入れないか

```ruby:例
<%= link_to(post.content, "/posts/#{post.id}") %>
```

この時/が先頭にあるとルートからでないとこのソースからの相対パスになる。
マナーモード(サイレント／バイブ)であるか判定する拡張関数


## note
- getRingerMode: added in API level 1


```
fun AudioManager.canSound(): Boolean = 
    when (ringerMode) {
        AudioManager.RINGER_MODE_SILENT,
        AudioManager.RINGER_MODE_VIBRATE -> false
        else -> true
    }
```
High Sierra(macOS 10.13)でpyenvがエラーになった時に対処した方法

#発生したエラー
```
pyenv install 3.6.0
Downloading Python-3.6.0.tar.xz...
-> https://www.python.org/ftp/python/3.6.0/Python-3.6.0.tar.xz
Installing Python-3.6.0...
ERROR: The Python ssl extension was not compiled. Missing the OpenSSL lib?

Please consult to the Wiki page to fix the problem.
https://github.com/pyenv/pyenv/wiki/Common-build-problems


BUILD FAILED (OS X 10.13 using python-build 20160602)
```

#対処方法
##初めに
以下のコマンドを実行
```
brew install readline openssl xz
```
##次に~/.env-exporterに以下の記述をする
```shell
# ~/.env-exporter
# about zlib
export CFLAGS="-I$(xcrun --show-sdk-path)/usr/include"
# about readline
export CFLAGS="-I$(brew --prefix readline)/include $CFLAGS"
export LDFLAGS="-L$(brew --prefix readline)/lib $LDFLAGS"
# about openssl
export CFLAGS="-I$(brew --prefix openssl)/include $CFLAGS"
export LDFLAGS="-L$(brew --prefix openssl)/lib $LDFLAGS"
# about SQLite (maybe not necessary)
export CFLAGS="-I$(brew --prefix sqlite)/include $CFLAGS"
export LDFLAGS="-L$(brew --prefix sqlite)/lib $LDFLAGS"
```

##pyenv installを実行するする前

```shell
source ~/.env-exporter
```

##いつもどおりインストール
```shell-session
pyenv install 3.6.0
```


以上で正常にインストールして出来る様になりました。
GitHub Pages で Google Analytics を使うシンプルな設定

# はじめに

GithHub Pages で Google analytics を使うには、ざっと調べたところ
1. ga-beacon を用いる
2. ローカルで Jekyll とそのプラグインを使って build する
3. リポジトリに最低限の上書き用ファイルだけ置いて、ビルドは GitHub に任せる
などの方法があるようです。3 が最もシンプルかもしれないと思いましたが、今はもっとシンプルでした。
https://pages.github.com/themes/ を見たところ、上書き用ファイル
（`_layout/default.html` など）を自前で置く必要もなくなっています。
結論としては、
**4. `_config.yml` に `google_analytics: トラッキングID` という設定を加えて、ビルドは GitHub に任せる**
が一番簡単なようです。

というわけで、やってみます。以下の準備は、すでに終わっている場合は飛ばしてください。

# 準備

## Google Analytics の準備

Googleアナリティクスのトラッキングコードはすでにあるとします。
ない場合は、Googleアナリティクスにログインし、以下の手順でトラッキングIDをコピペもしくはメモしておきます。

1. [管理] > [プロパティ] のプルダウンで [新しいプロパティを作成]
1. [ウェブサイトの名前] に `https://<GitGubアカウント名>.github.io` を登録
1. これでトラッキングIDが表示されているのでコピー

## GitHub Pages の準備

GitHub で Pages を作成しておきます。

プロジェクトごとの Pages を簡単に作成するには以下の手順になります。
master ブランチ直下にファイルを置く場合を説明します。
master ブランチの docs フォルダ以下にファイルを置く場合は適宜読み替えてください。

1. GitHub 側で適当なリモートリポジトリを REAME.md ありで作成します。
1. Settings で GitHub Pages の Source にて `master branch` を選び `Save` を押します。さらに Theme Chooser で適当なテーマを選びます。
1. README.md の編集画面が出る場合は、適宜編集して Commit します。README.md を index.md に名前を変更しておきます。（どちらでもよいです。）
1. Settings の GitHub Pages に現れる URL をたどってデプロイされていることを確認します。（URL は `https://<GitHubアカウント名>.github.io/<リポジトリ名>/` になります。）

もちろん 1 は README.md なしでリモートリポジトリを作成し、ローカルリポジトリで index.md を作成して push してもよいです。

以上で、`_config.yml` という設定ファイルが新たにリポジトリに加わっているかと思います。

**コミットしても更新されなかったりすることがあります。GitHub のスタッフに問い合わせたところ、最大15分かかるそうです。慌てず待ちましょう。（もっとかかっている場合もある気がします(?)）**

# GitHub Pages に Google Analytics を設定する

## リモートリポジトリで作業する場合

`_config.yml` を以下のように編集し、commit します。`theme` のところは選んだテーマによって違いますが特に変更しなくてよいです。

```yaml:_config.yml
theme: jekyll-theme-slate
google_analytics: UA-....
```

`UA-....` は Google Analytics のトラッキングID です。

これだけでアナリティクスに反映されるようになります。

## いったんローカルリポジトリで作業する場合

1. リモートリポジトリのみで Pages を作成した場合は `git clone ...` でローカルに持ってきます。ローカルリポジトリから push して Pages を作成した場合は `git pull origin master` しておきます。
1. ローカルに `_config.yml` という設定ファイルがあることを確認し、上述のように編集します。
1. add, commit, push します。


## 参考になったサイト
https://stackoverflow.com/questions/17207458/how-to-add-google-analytics-tracking-id-to-github-pages
の Answer にある https://desiredpersona.com/google-analytics-jekyll/ を参考にしました。

GitHub の Theme は https://pages.github.com/themes/ を使っているようですが、`_layout/default.html` を見たところ、すでに google analytics を使うためのスクリプトが body の最後に加えられています。`google_analytics` が設定されると自動で追加されるようです。
インテルデベロッパーカンファレンスに行ってきた

###インテルデベロッパーカンファレンスに行ってきた
9/28にミッドタウンで開かれたインテルデベロッパーカンファレンスに行ってきた。
[インテルデベロッパー・カンファレンス2017](https://swdevcon.intel.co.jp/,"インテルデベロッパー・カンファレンス2017")

テーマは4つ。

- HPCツール
- IoT、ロボティックス、ゲーム
- データセンター
- クラウド

小生はクラウドに興味があるのだが、インテルとクラウドがどう結びつくのかよくわからない。黒子に徹して身を取る戦略か。いずれにしても気づいたことをコメントしてみる。

クラウドの講演をいくつか聞いた。
講演はインテルのほか、富士通、さくらインターネット、IIJ、エクイニクス。
なるほど、SIerが来ているところを見るとやはり黒子に徹して身を取る戦略はあながち間違いではないのか。

ん？富士通がクラウドというのは少し違和感があった。K5というクラウドをやっているのはしっていたが、しかも講演テーマが「クラウドネイティブ・アプリケーション開発の普及に向けた富士通の取り組み」とある。

レガシーなイメージの富士通がクラウドネイティブとはいかほどのものか。
ただいろいろ参考になったのでメモ。

### クラウドネイティブ・アプリケーション開発の普及に向けた富士通の取り組み
以下、メモ。

- クラウドアプリで順守すべき条件：12 Factor app(Herokuのエンジニアが提唱)
    - WEB API中心
    - いつ破壊してもよい
    - ステートレス
    -  アプリがバックエンドに影響されない
    -  CI/CDが容易
- 今どきのクラウドWebアプリ
    - Airbnbとか
    - Uberとか
    - Netfilxとか
    - SPAの登場でフロントはバックから分離
    - BFF（フロントエンドにやさしい）
    - 最近はSPA/BFF/WEBAPIの構成が増えている
- K5 Playground
    - 無償
    - クラウドネイティブアプリなWebアプリが作れる
    - SPAとBFFを作る
    - SPA：React,Flux(Facebook?)
- K5 Showcase
    - クラウドアプリ集
    - 料理のレシピサイトの要領で手順と時間

へーいろいろ勉強になります。

###[K5 Playground](https://playground.cloud.global.fujitsu.com/,"K5 Playground")

####トップ画面
おっ、なんかかっこいい（富士通ぽくない。。）
![Playground.png](https://qiita-image-store.s3.amazonaws.com/0/158038/708f713c-42f1-cbbd-f396-3da489ade9a3.png)

####フロントエンドの編集画面
テンプレートを使って編集ができる。こちらはECサイトのテンプレート。
![Frontend.jpg](https://qiita-image-store.s3.amazonaws.com/0/158038/b698e016-0a8e-bafe-12ed-36553067ed91.jpeg)

####バックエンドの編集画面
![Backend.jpg](https://qiita-image-store.s3.amazonaws.com/0/158038/9fb516b6-2c31-fae0-9873-7acf07634542.jpeg)

PayPal、Twilio、Postgres、MongoDBなどのAPIが提供されており、ドラッグして処理を追加することが可能。つまりバックエンドのロジックをカスタマイズできる。
なるほど、これがSPAとBFFかと理解。
ちなみに富士通クラウドK5のAPIはなぜか多くない。

###[K5 Showcase](https://showcase.cloud.global.fujitsu.com/)
####Webアプリ集
![Showcase.jpg](https://qiita-image-store.s3.amazonaws.com/0/158038/7853e364-fa41-8c09-60dd-3ffeb05d9ffc.jpeg)

####作成手順
完成イメージとその手順がある。（ただし英語のみのよう）
![recipe.png](https://qiita-image-store.s3.amazonaws.com/0/158038/945befc8-0fad-2518-a798-9d035348e166.png)

##感想
- SPA/BFFが流行っていることを理解
- なんとくなくPlaygroundの画面を見てSPAとBFFの関係性を理解
- たしかに今どきのクラウドネイティブアプリを意識しなくても作れそう
- ツールは無償（富士通は一体どこで儲けるの？やっぱSI？）
- たしかにアプリは簡単に作れそう。そしてコードもダウンロードできる。
- ダウンロードしたコードをカスタマイズ
- 実行環境はK5のCF(CloudFoundry）が使える。CFは有償。（ここで儲けようとしているのか？）
- コードのインポート機能はないよう。（最初はいいけどメンテができないのはUX的にどうなの？）
- 昔Jimdo使ってWebサイトを作ったけどこちらはもっと誰でも触れるというものではなさそう。その意味で開発者向け。
- なぜか富士通のサイトからはリンクがないよう。ググらないとアクセスできない。
laravel/valetしてた件

# 頭の中ぐるぐるしてるからまとめよう
Laravel環境で自分の開発環境内で検証ができるようにって言うのをやっていたときのお話です。


## とりあえずインストール
`composer global require laravel/valet`
composerがない場合
`brew install composer`
で行ける

`~/.bash_profile`
に
`export PATH=$HOME/.composer/vendor/bin:$PATH`
を入れる。

新しいターミナルを開いて
`valet install`
でパスワードを聞かれる。

インストールしたらプロジェクトのフォルダに移動。
`valet park`
でフォルダを指定する。

指定したフォルダ（Hogehoge）のなかにFugafugaがあれば
http://Fugafuga.dev
で閲覧ができる。

Httpsで閲覧が必要なら
`valet secure`
Httpに戻すときは
`valet unsecure`
.envファイルを環境にあわせて編集

`valet restart`
で再起動ができる。

`valet paths`
パスの確認ができる。

## 必要であれば
Nodeのインストール
`brew install node`
`npm i && npm run watch`

MySQLのスタート
`brew services start mysql`
`mysql -u root -p`
で必要なDBを作る。

作業してるフォルダで
`php artisan migrate --seed`
DB立ち上げる。

`cp -p .env.example .env`
`php artisan key:generate`
`php artisan serve`
を忘れたり、、して泣きそうになった。


## はふぅ。
laravelなー。
とりあえずメモ。
これはいつまで続くのだろう（白目

ちなみに作業用BGMはエウレカセブンAO