OmniAICreator/Qiita-1.07M huggingface dataset:
Laravelのコレクションをfilterするとインデックスがずれる

Laravelのコレクションのfilterは`array_filter`を使用しているためインデックスがずれてしまいます

なぜ`array_filter`でインデックスがずれるかは
[PHPの配列](http://php.net/manual/ja/language.types.array.php)と[array_filter](http://php.net/manual/ja/function.array-map.php)
をご参照ください

# 例
簡単なコレクションを作成

```php

$collection = collect([]);
$collection->push(collect(['id' => 1, 'name' => 'A']));
$collection->push(collect(['id' => 2, 'name' => 'B']));
$collection->push(collect(['id' => 3, 'name' => 'C']));

dump($collection);
```
↓

```php
Illuminate\Support\Collection {#26de15
  #items: array:3 [
    0 => Illuminate\Support\Collection {#2623
      #items: array:2 [
        "id" => 1
        "name" => "A"
      ]
    }
    1 => Illuminate\Support\Collection {#2609
      #items: array:2 [
        "id" => 2
        "name" => "B"
      ]
    }
    2 => Illuminate\Support\Collection {#2616
      #items: array:2 [
        "id" => 3
        "name" => "C"
      ]
    }
  ]
}
```

これをfilter

```php
$filterd = $collection->filter(function ($v) {
  return $v['id'] > 1
});

dump($filterd);
```
↓

```php
Illuminate\Support\Collection {#2610
  #items: array:2 [
    1 => Illuminate\Support\Collection {#2609
      #items: array:2 [
        "id" => 2
        "name" => "B"
      ]
    }
    2 => Illuminate\Support\Collection {#2616
      #items: array:2 [
        "id" => 3
        "name" => "C"
      ]
    }
  ]
}
```
この時点でインデックス0がなくなったことがわかります

# 解決策
基本的には`array_filter`でずれてるだけなので以下の記事のように`array_value`を使用します
[PHP の array_filter を通すとインデックスに差が生まれる](https://qiita.com/ameyamashiro/items/ba4367e1a3586ae097e3)

しかしLaravelのコレクションの場合valuesメソッドとして用意されているのでこちらを使用します。

```php
$filterd = $collection->filter(function ($v) {
  return $v['id'] > 1
})->values();

dump($filterd);
```
↓

```php
Illuminate\Support\Collection {#2596
  #items: array:2 [
    0 => Illuminate\Support\Collection {#2609
      #items: array:2 [
        "id" => 2
        "name" => "B"
      ]
    }
    1 => Illuminate\Support\Collection {#2616
      #items: array:2 [
        "id" => 3
        "name" => "C"
      ]
    }
  ]
}
```

無事インデックスが振り直されました

他の言語触ってるとこういうこと忘れてしまいがちなので気を付けたいですね

# 参考
[Laravelでコレクションをfilterするとインデックスが連続でなくなる](https://yoshinorin.net/2018/05/26/laravel-filterd-items-key/)
ISTQB Certified Tester Advanced Level Syllabus Test Automation Engineer No.1

# 趣旨

ここでは、ISTQBにて提供されている"Test Automation Engineer" Syllabusを自分なりに解釈（そのままの翻訳もあり）したものである
そのため、実際の試験と相違がある場合もありますのでご注意
原本↓
https://www.istqb.org/downloads/category/48-advanced-level-test-automation-engineer-documents.html


#1. Introduction and Objectives for Test Automation
## 1.1 Purpose of Test Automation
### テスト自動化がすること
- テスト環境の構築（データ作成等）
- テストの実行
- テスト結果と期待値の比較（Validation）

一番目のテスト環境の構築は有意義。テストデータ、特にSTRESS TESTといった大量のデータを必要とする場合、たとえば１００００予約データを作成するといったものは、自動化で一気に作ったほうが工数削減になる。


### テスト自動化の効果
- 多くのテストケースを継続的、繰り返し実行
- さまざまなテスト環境で実施
- 人の操作を介さず実施

### テスト自動化のツールに求められる要素
- テスト自動化のテストケースを作成
- テスト自動化の実行の監視、制御
- テスト自動化の結果をレポート

テスト自動化において、実行させるSCRIPTを書くことはエンジニアであればすぐに取っつける。ただ、レポートの機能が後追いになりがち。テストが失敗したときに、どこに問題があったのか等の、その後の対応に適切な情報を提供できる仕組みがないと、テストを実行しているだけのソフトウェアになってしまう。

### テスト自動化の目的
- テスト効率改善
- テストカバレッジを上げる
- テストコストを下げる
- パフォーマンステスト
- テスト速度を上げる
- テストサイクルを上げる（例えば 10+ deploys per day)

よくあるのが、テスト自動化のコストを躊躇して導入検討に時間がかかること。
今まで見てきた資料であるのは、３～４回そのテストを実行したら、元が取れるといったもの。
そこにだけフォーカスして導入可否に時間を要するのはもったいないと思う。それ以外の効果、テストフィードバックを大きく改善することを忘れてはいけないと思う。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/267085/e7631d0a-0ba7-229c-0503-1df578231a19.png)
あるあるの manual vs automation 

### テスト自動化のメリット
- アプリのbuild毎のテストを増やせる
- マニュアルでできなかったテスト、複雑なテストができる場合がある
- テスト実行が早い、そして結果のフィードバックが早まる
- マニュアルテストのような人手によるミスがなくなる
- リソースの効率化が図れる
- テストの一貫性が上がり、システムの信頼性が上がる

### テスト自動化のデメリット
- 追加コストが発生する（初期コストとメンテナンスコスト）
- 自動化の環境構築、スクリプティング等のスキルが要求される
- 本来の自動化の目的を忘れる傾向がある（品質であるはずが、カバレッジが目的になってしまう等）
- テストが複雑になりうる

自動化を継続して使い続けるには、デメリットにもあるように以下のようなメンテナンスをしっかりしていかないと、意味のないものになる。
- 機能変更に追従して回収すること
- エラーが起きた時の対応（放置しない）
- Flaky な自動化スクリプトを放置しない（定期的な、無意味なエラーレポートに悩まされる）

### テスト自動化の制約
- すべてのマニュアルテストを自動化できるわけではない
- テスト自動化は機械が理解できることしかチェックできない（スクリプトでvalidateできないものは自動化できない）
- 探索的テストはできない

## 1.2 Success Factors in Test Automation
テスト自動化の成功要素

### Test Automation Architecture
テスト自動化で、どの機能要件、非機能要件をカバーするかを明確にする
保守性、パフォーマンス等を考慮して設計すること

### Testability
自動化のscriptingを行いやすくするため、システムはテストしやすい設計が求められる

- GUIでパーツの情報を一意に特定できる
- APIのI/Fを提供する

WEBでは、HTML TAGのclass nameの定義。一意にかつ意味のある名前にすることで、SCRIPTINGでそれを特定しやすくなる

### Test Automation Strategy
テスト自動化では以下のことを考慮する

- 保守性、継続性
- コスト
- 利点
- リスク

### Test Automation Framework
テスト自動化のフレームワークに求められる要素

- Implement reporting facilities: システムの品質の情報提供
- Enable easy troubleshooting: テスト失敗時の対応のしやすさ（バグ、環境問題　等）
- Address the test environment appropriately: 一貫性のあるテスト環境（不安定な環境では、テストが失敗する）
- Document the automated test cases: テスト目的を明確にする
- Trace the automated test: テストケースの各ステップを理解しやすくする
- Enable easy maintenance: テストscriptの保守性。システム変更に追従しやすくする
- Keep the automated tests up-to-date:もし仕様変更など発生したら、scrpitも更新する
- Plan for deployment:テストscriptのリリースをしやすくする
- Retire tests as needed: 不要になったscriptは廃棄しやすくする
- Monitor and restore the SUT:実環境でテストを実施続け、エラーが起きたら対処する

test scriptのメンテナンス性を高めるために求められる要素

- よく変更の入るI/Fは自動化しない
- 特定のデータに依存、変更の入りやすいデータにかかわる部分は自動化しない 
- 変更の入りやすい環境、環境依存な部分を自動化しない

このほかに

- 複雑なテストscriptにしない（テストscriptをテストする？）
- 誰が見てもわかるscript（プログラミングと同じ）
- 一回しか発生しないイベントを自動化しない（復元手段がある場合は別）
- ブラウザ等に依存する機能を自動化しない（クロスブラウザテストをする場合）
ionic browserでビルドしたアプリをFirebase Hostingにデプロイする


## ionicのビルド

```
ionic cordova platform add  browser
ionic cordova build  browser
```

## Firebaseにデプロイ

- index.htmlが作られたディレクトリに移動


```
cd  platforms/browser/www
```

- Firebaseへのログインと初期設定

```
 $ firebase login

   ブラウザが立ち上がるのでログインする

 $ firebase init

     🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥     🔥🔥🔥     🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥     🔥🔥 🔥🔥       🔥🔥     🔥🔥  🔥🔥   🔥🔥  🔥🔥       🔥🔥
     🔥🔥🔥🔥🔥🔥    🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥   🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥
     🔥🔥        🔥🔥  🔥🔥    🔥🔥  🔥🔥       🔥🔥     🔥🔥 🔥🔥     🔥🔥       🔥🔥 🔥🔥
     🔥🔥       🔥🔥🔥🔥 🔥🔥     🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥 🔥🔥🔥🔥🔥🔥🔥🔥  🔥🔥     🔥🔥  🔥🔥🔥🔥🔥🔥  🔥🔥🔥🔥🔥🔥🔥🔥

You're about to initialize a Firebase project in this directory:

{PATH}/ionic/msg-firestore/platforms/browser/www

? Which Firebase CLI features do you want to setup for this folder? Press Space to select features, then Enter to confirm your choices. Hosting: Configure and deploy Firebase Hosting sites

=== Project Setup

First, let's associate this project directory with a Firebase project.
You can create multiple project aliases by running firebase use --add,
but for now we'll just set up a default project.

? Select a default Firebase project for this directory: {PROJECT_NAME}

=== Hosting Setup

Your public directory is the folder (relative to your project directory) that
will contain Hosting assets to be uploaded with firebase deploy. If you
have a build process for your assets, use your build's output directory.

? What do you want to use as your public directory? ＜＜公開したいドキュメントルートなので、不要な場合は入力しない
? Configure as a single-page app (rewrite all urls to /index.html)? Yes
✔  Wrote /index.html

i  Writing configuration info to firebase.json...
i  Writing project information to .firebaserc...

✔  Firebase initialization complete!
```

- firebase.jsonが出来上がる

jsonの設定などは、下記を参考に設定する。
シングルページアプリケーションなので、全てindex.htmlに飛ばしている

[デプロイ構成  \|  Firebase](https://firebase.google.com/docs/hosting/full-config)


```
{
  "hosting": {
    "public": "./",
    "ignore": [
      "firebase.json",
      "**/.*",
      "**/node_modules/**"
    ],
    "rewrites": [
      {
        "source": "**",
        "destination": "/index.html"
      }
    ]
  }
}
```

- デプロイ


```
$ firebase deploy

=== Deploying to '{PROJECT_NAME}'...

i  deploying hosting
i  hosting[{PROJECT_NAME}/]: beginning deploy...
i  hosting[{PROJECT_NAME}/]: found 61 files in ./
✔  hosting[{PROJECT_NAME}/]: file upload complete
i  hosting[{PROJECT_NAME}/]: finalizing version...
✔  hosting[{PROJECT_NAME}/]: version finalized
i  hosting[{PROJECT_NAME}/]: releasing new version...
✔  hosting[{PROJECT_NAME}/]: release complete

✔  Deploy complete!

Project Console: https://console.firebase.google.com/project/{PROJECT_NAME}/overview
Hosting URL: https://{PROJECT_NAME}.firebaseapp.com

```

- URLにアクセスして表示されることを確認

Hosting URL: https://{PROJECT_NAME}.firebaseapp.com
KiCad Tips

# シルクに四角の塗りつぶしを描く

基板裏に油性ペンでシリアル番号とか書くとき、シルクで入力欄みたいのを入れときたい。どうしても。
**KiCadできないのか？**とお嘆きの場合は以下のように。

結論から言うと、できます！ベタGND描くときと同じ感じです。

1. 右ツールバーの`塗りつぶしゾーンを追加`<img width="16" alt="0.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/30474/bdf6534e-b810-582a-7a76-417e90c7d99a.jpeg">をクリック

2. このダイアログでレイヤーや線幅などを選択してOKを押す
<img width="179" alt="1.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/30474/6336cf06-e210-8eb3-8737-4534d50eaba7.jpeg">

3. あとはベタGNDを敷くときと同じ要領で。

矩形以外にも多角形も行けるっぽいです。

# マウスポインタが画面端に行くと勝手にスクロールするのを無効化

配線中に勝手にスクロールするのがウザくて **もうKiCadやめようかな…** とか思っている人はとりあえず以下のように。

- Mac: KiCad > 設定
- Win: 設定 > 一般設定

`オブジェクト移動時に表示領域を移動`のチェックを外す
![11.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/10d6a120-4669-5df1-4ff5-4616ee79e847.jpeg)

回路図エディタ、基板エディタそれぞれに同じ設定あり。

# マウスホイールでスクロール

デフォルトではマウスホイールはズームに割り当てられています。
**ホイールでスクロールできないCADなんて！** とか思っている人は、とりあえず以下のように。

- Mac: KiCad > 設定
- Win: 設定 > 一般設定

`画面のパンにタッチパッドを使用`にチェック
![一般設定 2018-09-04 07-34-21.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/d357d5c9-cd5f-77e4-ccb6-812fffe707c0.jpeg)

横スクロールは`SHIFT`押しながらでお願いします。
回路図エディタ、基板エディタそれぞれに同じ設定あり。

# 配線のネット名を変更する

すでに配線してる導体のネット名を変更したい場合、Eagleでは`name`コマンドで簡単にできます。しかし、現状のKiCadにはありません[^1]。

[^1]: KiCad 4.0.7

**Eagleならできるのに！！** とか思っている人は、とりあえず以下のように。

1. 左ツールバーの`デザインルールチェックを無効化`![icon1.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/7fdf68db-7b65-88a5-91f9-f0cbdad41bf2.jpeg)
をクリック
1. 接続したい導体に接続
1. ファイルを保存
1. 基板エディタを閉じる
1. ファイルを開き直すと、ネット名が変更されている
1. ![icon1.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/7fdf68db-7b65-88a5-91f9-f0cbdad41bf2.jpeg)
を再度クリックし、DRCを有効化しておく

## 例

![1x.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/f1a2997a-e738-816f-9594-80e547d328d6.jpeg)
上にある名無しの導体を下のGNDの導体に![track.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/c4d187b4-b514-332f-d3aa-40fa540f2555.jpeg)で接続したい。

DRCが効いている状態では接続しようとしてもキャンセルされるが、![icon1.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/7fdf68db-7b65-88a5-91f9-f0cbdad41bf2.jpeg)を押してDRCを無効化すると問題なく接続できる。

一旦保存して開き直すと下のようになる。
![2x.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/bcce6d2d-b447-a142-22e5-9370e9bb4f7c.jpeg)


ファイルを開き直すので、それまでのUndo情報がなくなるのがちょっとつらいところ。

## 参考
[Kicad - Change add unconnected/unnamed trace to an existing net](https://electronics.stackexchange.com/questions/207187/kicad-change-add-unconnected-unnamed-trace-to-an-existing-net)

# 配線のレイヤーを変更する

すでに配線してある導体のレイヤーを変更したいときは **Eagleなら…** とか言わずに、とりあえず以下のように。

1. `表示` > `描画キャンバスを OpenGL(3D) に切替`
1. マウスポインタを導体の上に合わせる
1. `e`を押して、`配線とビアのプロパティ`を開く
1. 変更したいレイヤーを`レイヤー`で選ぶ
![4.jpg](https://qiita-image-store.s3.amazonaws.com/0/30474/0339f186-63c9-5ceb-e36d-508307086409.jpeg)
5. `表示` > `描画キャンバスを 標準 に切替`で描画キャンバスを元に戻す。

## 参考
[Missing “Change Segment/Track Layer”](https://forum.kicad.info/t/missing-change-segment-track-layer/7986/2)

# その他

まあ、あれです。
住めば都というやつです。
ionicでfirebaseへ画像アップロードできるように

# 前提
* ionic環境準備とプロジェクトを作成
 * https://qiita.com/alingogo/items/fc5eece405cdc6ffc025
* Firebase configとアプリ設定、モジュールのインストール、config内容を導入を以下の文書を参照してください
 * https://qiita.com/alingogo/items/a049a73f1ec20a243573


# native plugin導入

```
$ ionic cordova plugin add https://github.com/apache/cordova-plugin-camera.git
```

# firebase storageのルールを変更
* 開発 -> storage -> ルール

```
service firebase.storage {
  match /b/<appname>.appspot.com/o {
    match /{allPaths=**} {
      allow read, write;
    }
  }
}

```

# 実装

* アップロードページを作成

```
$ ionic g page image_upload
```

* html

```html:image_upload.html
<ion-content padding>
  <div style="justify-content:center">
    <button ion-button (click)="capture()">写真を撮る</button>
  </div>
  <img [src]="captureDataUrl"  *ngIf="captureDataUrl"/>
  <button ion-button (click)="upload()" *ngIf="captureDataUrl">アップロード</button>
</ion-content>
```

* ロジック

```typescript:image_upload.ts
import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { Camera, CameraOptions } from '@ionic-native/camera';
import firebase from 'firebase';

@IonicPage()
@Component({
  selector: 'page-image-upload',
  templateUrl: 'image-upload.html',
})
export class ImageUploadPage {
  captureDataUrl: string;

  constructor(private camera: Camera) {
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad ImageUploadPage');
  }



  capture() {
    const cameraOptions: CameraOptions = {
      quality: 50,
      destinationType: this.camera.DestinationType.DATA_URL,
      encodingType: this.camera.EncodingType.JPEG,
      mediaType: this.camera.MediaType.PICTURE,
    };

    this.camera.getPicture(cameraOptions).then((iData) => {
      this.captureDataUrl = 'data:image/jpeg;base64,' + iData;
    }, (err) => {
      console.log('error');
    });
  }

  upload() {
    let sRef = firebase.storage().ref();
    const filename = Math.floor(Date.now() / 1000);
    const imageRef = sRef.child(`images/${filename}.jpg`);

    imageRef.putString(this.captureDataUrl, firebase.storage.StringFormat.DATA_URL).then((snapshot)=> {
      console.log('upload succes');
    });
  }
}

```
便利な tar コマンド早見表


僕が使っている tar コマンドです。
使うんだけれどいつも忘れるので備忘録です。

サーバー同士でファイルを転送する時・・・特に、Web 関連のファイルで、ファイルのオーナーが apache だったり SSH ユーザーだったりするファイルが混在してそれを保持したまま転送したい時などに使えます。

(ZIP ファイルは、読・書・実行情報しか残してくれない)


## 圧縮ファイル作成


```
tar -cvzpf [ファイル]_$(date +%Y%m%d%H%M%S).tar.gz -C [ベースPath] [圧縮対象 (複数指定可)]
```

- ファイル名に今日の日付時刻 (タイムスタンプ) を加える
- c: 新しい tar ファイルを作る
- v: 処理したファイルを詳しく出力する
- z: アーカイブをgzip形式で圧縮する
- p: 所有者などのファイル属性を保持する
- f: アーカイブファイル名を指定する
- C: このパスをベースに圧縮ファイルを作成する

「-C」オプションはかゆいところに手が届くオプション。


## 解凍

```
tar -xvzpf [tarファイル名].tar.gz
```

- x: 解凍する
- v: 処理したファイルを詳しく出力する
- z: compress形式で圧縮されたアーカイブを展開する
- p: 所有者などのファイル属性を保持して展開する
- f: アーカイブファイル名を指定する

# サーバー独自のコマンド

僕が日頃使っているコマンド集です。

## etc の中を日時付きのタイムスタンプで保存する

UNIX系サーバーの設定ディレクトリを home ディレクトリに tar として保存する。
ファイル名に自動的に tar したときの日付を YYYYMMDDHHMMSS のフォーマットで付与する。

```
cd
sudo tar -cvzpf etc_$(date +%Y%m%d%H%M%S).tar.gz -C /etc/ ./
```

サーバーの中の設定ファイル一覧をまとめて tar にしてローカルに落として確認する時に使えます。


# 参考記事

## @IT

http://www.atmarkit.co.jp/ait/articles/1608/15/news015.html
Bluemix(IBM Cloud)にCachetをたててみる

status : [cachet.mybluemix.net](https://cachet.mybluemix.net/), [@syui@syui.cf](https://mstdn.syui.cf/@syui)

bluemix(ibm cloud)のほうで[CachetHQ/Cachet](https://github.com/CachetHQ/Cachet)というステータスページを試してみました。

docs : https://docs.cachethq.io/docs/installing-cachet

```sh
$ git clone https://github.com/CachetHQ/Cachet
$ cd Cachet
$ git checkout v2.4

$ cat manifest.yml
applications:
- path: .
  name: APP_NAME
  memory: 256M
  buildpack: https://github.com/cloudfoundry/php-buildpack
  command: null
  routes:
  - route: APP_NAME.mybluemix.net

$ cat .bp-config/options.json
{
    "COMPOSER_INSTALL_OPTIONS_DEBUG": [ "--no-dev", "-o"],
    "PHP_VERSION": "{PHP_71_LATEST}",
    "COMPOSER_VENDOR_DIR": "vendor",
    "WEBDIR": "public",
    "PHP_EXTENSIONS": ["bz2", "pdo", "zlib", "curl", "mcrypt", "mbstring", "mysqli", "gd", "zip", "pdo_mysql", "pdo_sqlite","iconv",  "openssl" ]
}

$ cp .env.example .env

# mysqlはherokuのdbを使わせてもらうことに。bluemixでは、free(lite)で使えるdbがdb2(dashDB)とかしかないので、cachet(db:mysql)に対応していない
$ heroku create $APP_NAME
$ heroku addons:add cleardb -a $APP_NAME
$ heroku config -a $APP_NAME
mysql://${DB_USERNAME}:${DB_PASSWORD}@{DB_HOST}/${DB_DATABASE}

# url, mysqlのuriを入れていく
$ vim .env
APP_URL=https://APP_NAME.mybluemix.net
DB_DRIVER=mysql
DB_PREFIX=null
DB_HOST=
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
DB_PORT=3306

# vim .env
CACHE_DRIVER=file
SESSION_DRIVER=file
QUEUE_DRIVER=sync

# 初期設定
$ composer install --no-dev -o
$ php artisan key:generate

# bluemixにdeployする
$ git add .
$ git commit -m "support bluemix"
$ bx cf push $APP_NAME

# logを確認
bx cf logs cachet --recent

# sshしてlogを確認
$ bx cf ssh $APP_NAME
$ cat app/storage/logs/l*
```

bluemixのライトプランは制限が結構きついです。使えるdb(db2)からmemory:256Mやinstance:1、そして、custom-domain:falseなど。
Rustをやっていきたい



c++の代替みたいな感じですかね。速いことで有名。single coreを余すことなく使うらしい。

基本的には、`cargo`でinstallしたりbuildしたり。`cargo.toml`を作ります。`rocket`というフレームワークが便利そう。dbとの接続は`diesel`を使う感じ。

とりあえず、rocketから触ってみることに。

https://github.com/SergioBenitez/Rocket/tree/master/examples/json

api server立てるっぽいやつを動かしてみる。ここでコードの内容も見ていく。

```sh
$ rustc -V
$ cargo -V

$ git clone https://github.com/SergioBenitez/Rocket
$ cd Rocket/example/json
$ rustup override set nightly

$ cat Cargo.toml
$ cargo build
$ cargo run

$ cat src/main.rs

# check
$ curl localhost:8000/message/1
# post
$ curl -H 'Content-Type:application/json' -d '{ "contents": "Hello, world!" }' localhost:8000/message/1
# get
$ curl localhost:8000/message/1
```

次は、dbを組み合わせた感じのものを見ていきます。

```sh
$ heroku create $APP_NAME
$ heroku addons:create heroku-postgresql:hobby-dev -a $APP_NAME
$ heroku config -a $APP_NAME

$ git clone https://github.com/ghotiphud/rust-web-starter
$ cd !$:t
$ docker-compose up

$ curl localhost:3000/api
or
$ wrk -t12 -c400 -d30s http://localhost:3000/api
```

この場合は、`./web`がfrontendで`./api_server`がbackendになります。つまり、`./api_server`がrustで書かれています。herokuなどにdeployする場合は、Procfileに以下のように記述すればいいでしょう。frontendはnpmするだけのものが多いので、特にありません。react使ってる人が多い印象。

```sh
$ cargo build --release
$ echo "ROCKET_ENV=prod target/release/api_server" >> Procfile
```

重要なのはreadmeにも書いてますけど、`diesel`になります。大抵、repoに`./migrations`が用意されてますので、`diesel migration run`すればpreviewはできます。

```sh
$ cargo install diesel_cli
$ echo "DATABASE_URL=postgres://user:pass@localhost/name" > .env
$ diesel migration generate name
$ diesel migration run
```

コードの内容については、[こちら](https://medium.com/p/1867308352d8/)が参考になりそうな感じだった。

## 感想

rustは、依存パッケージでハマると、ものすごく時間を浪費してしまう感じで、その点はつらいですね。

その分、api serverとかをrustで選択するのは、やりやすそうな感じでした。書けると選択肢広がりそうな言語です。
Arch LinuxでVPN Serverを気軽に立てる方法



## softethervpn serverの設定

ここでは`IPsec / L2TP`で接続できるようにします。

![](https://raw.githubusercontent.com/mba-hack/images/master/archlinux_softethervpn_server_01.png)

```sh
$ sudo pacman -S dhclient --noconfirm

$ yay -S softethervpn
```

```sh
$ sudo systemctl start softethervpn-server
$ sudo systemctl status softethervpn-server

$ vpncmd /server
Hub DEFAULT 

GroupCreate
	default

UserCreate
	syui

UserPasswordSet
	xxx

IPsecEnable
	yes
	yes
	yes

SecureNatEnable
	yes

NatEnable
	yes

$ ip a
192.168.11.14
```

なお、`Default Virtual HUB in a case of omitting the HUB on the Username:`は`DEFAULT`にしておきます。これがないとclientのアカウント/ユーザー名で`user@DEFAULT`とかにしないといけない感じかな。分かりませんけど。

error 52(権限が不足しています)が出る場合は、`quit`した直後にまた立ち上げて実行したりすれば、それは出ません。なぜなら、そこは管理者として実行している領域だからです。`Hub DEFAULT`とかすると、`DEFAULT`上で実行されますので、その関係において、特定のコマンドが権限上、実行できない場合があるみたいです。

で、設定ができたらあとは、clientから接続するわけですが、mac/ios/androidの場合は、`IPsec / L2TP`ならnetwork設定から簡単に設定できます。winはやったことないので知りません。なんかソフトが必要?

archだと` xl2tpd`, `openswan`が必要みたいな感じです。

`softethervpn`のclientを利用する場合は、以下のよう感じだと思いますが、良く分かりません。

```sh
$ vpncmd /client
AccountCreate test /SERVER:localhost:500 /HUB:DEFAULT /USERNAME:user /NICNAME:user /PASSWORD:xxx /TYPE:standard

AccountConnect test
```

正直、こっちは定番のclientを使ったほうがいい気がしますね。

さて、これを外部から使うとなると、いつもと同じようにルーターのポート転送の設定とか、あとはglobal ip addressの通知、もしくは、ddnsの設定とかする感じですかね。

おわり。
Windowsはパッケージマネージャーのscoopが便利



[lukesampson/scoop](https://github.com/lukesampson/scoop)

現時点で一番オススメなのは、`pwsh`+`scoop`を使った環境です。



基本的には、`~/scoop/shims/`にシンボリックリンクかな、それが置かれてます。実体は`~/scoop/apps/$APP_NAME/current/bin/$APP_NAME.exe`とかにある感じかな。

なので、

```sh
$ scoop install curl

$ cd ~/scoop/apps/curl/current/bin

$ ./curl.exe github.com
```

とかしても実行できる感じですね。まあ、appごとに構成は変わってきますが。

もし仮にデフォルトのbucketにpackageが見つからなければ、

```sh
$ scoop bucket add extras

$ scoop install mpv
```

とかやって追加してくと、扱えるpackageが増えます。

そんな感じで、`scoop`の紹介終わります。
[関数系] str_replaceの罠 ~nullを添えて~

# 概要

str_replaceを使っていてまじかと思ったことをメモ。


# str_replace

## まずは仕様を確認

```php
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
```

> この関数は、subject の中の search を全て replace に置換します。
(正規表現のような) 技巧的な置換ルールを必要としない場合、 preg_replace() の代わりにこの関数を常用するべきです。

php -aとかで確かめてみる。

```php:sample_null.php
var_dump(str_replace('sample', 'sample', null));
```

こうすると、結果は

```shell
php > var_dump(str_replace('sample','sample',null));
string(0) ""
```
となる。

・・・空文字・・・だと・・・！？

みなさんnullが入ってきそうな箇所でstr_replaceを使う時には気をつけましょう。

#　おまけ

なぜnullが空文字になるのかソースコードを読みにいってみた。
ついでに数値が数字になって返ってきたりもしているため、なんか変換処理がありそうな気がした。
そうしたら多分ここなんじゃねーかみたいなところがあった。

```c:string.c(php_str_replace_commonメソッド)[4450行付近]
|  | /* Make sure we're dealing with strings and do the replacement. */ |
|--:|:--|:--|:--|
|  | if (Z_TYPE_P(search) != IS_ARRAY) { |
|  |  | convert_to_string_ex(search); |
|  |  | if (Z_TYPE_P(replace) != IS_STRING) { |
|  |  |  | convert_to_string_ex(replace); |
|  |  | } |
|  | } else if (Z_TYPE_P(replace) != IS_ARRAY) { |
|  |  | convert_to_string_ex(replace); |
|  | } |
```

このようにstringでない場合にはconvert_to_string_exという自作関数を利用して変換をかけており、おそらくこれをそのまま返している。まだ最後まで読んでいないので、ちゃんとしたことは言えないけど、多分これがそのまま返されているためだと思われる。ちゃんと読んだら追記する。


# 参考

[str_replace - php.net](http://php.net/manual/en/function.str-replace.php)
WEBRickで作ったなんちゃってWeb APIサーバーをなんちゃってHTTPS対応させる

## 前回までのあらすじ

前回「 [開発用なんちゃってWeb APIサーバーを作ってみた](https://qiita.com/suketa/items/52574bf727a712d66295) 」は、WEBRickを使って開発用のダミーの Web APIサーバーを作るお話でした。 


## 今回のお話

今回は小ネタですが、これを HTTPS対応させてみたいと思います。
前回のソースコードに手を加えていきましょう。

## https 用のライブラリを require する

まずは、 https の通信ができるように必要なライブラリを require します。

```ruby:ueb_api.rb
require 'webrick'
require 'webrick/https' # この行を追加する
require 'json'
```

## SSLの切り替えができるようにする

`UebAPI` の `initialize` メソッドを修正して ssl を使うかどうか指定できるようにします。

```ruby:ueb_api.rb
  def initialize(bind_address: '127.0.0.1', port: 18_080, ssl_enable: false)
    @srv = WEBrick::HTTPServer.new(
      BindAddress: bind_address,
      Port: port,
      SSLEnable: ssl_enable, # この行を追加
      SSLCertName: [['CN', WEBrick::Utils.getservername]], # この行を追加
    )
    @mount_procs = {}
  end
```

- `initialize` メソッドに、 `:ssl_enable` 引数を追加します。 デフォルトは、 `false` です。
- `WEBRick::HTTPServer.new` メソッドを呼び出す時に、 `:SSLEnable` と  `:SSLCertName` の２つの引数を指定します。
- `:SSLEnable` が `false` の時は、 HTTPS ではなく、 HTTP として動作します。
- `:SSLCertName` を上記のように指定しておけば、起動時に、自前で証明書が作成されるようです。

## UebAPI オブジェクト生成箇所を修正する

UebAPI オブジェクトを生成させるときに、 `:ssl_enable` パラメータを指定します。

```ruby:ueb_api.rb
# ssl_enable: true を指定して HTTPS として動作させる
# ssl_enable: false の時、 :ssl_enable を省略した時は、HTTPで動作する。
srv = UebAPI.new(ssl_enable: true)
```

## まとめ

小ネタですがHTTPS対応させてみました。
スコープについて

スコープを調べると、範囲と出るので、有効範囲のある変数です。
たとえば、

```java

for(int x = 0; x < 10; x++){

}

```

このfor文だと
for{
}

int xはこのfor文の中でしか有効ではありません。

```java

for(int x = 0; x < 10; x++){

}

x =　3;
```

としてもエラーになります。

```java
int x = 0

for(; x < 10; x++){

}

x =　3;
```

こんな風にfor{}の外側で記述しておけばforを抜けても使用することができます。


```java

for(; x < 10; x++){

}
```

省略したfor文になりましたがこれに関してはまたいつかまとめ用と思います。
関数とメソッド

https://qiita.com/hp_kj/items/85b911688155f9fc251a#comment-4a8cf9d5132387ed5106

こちらで指摘いただいたのですが、関数とメソッドが分からなくなり検索。

IT用語事典によると

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。

メソッドとは、オブジェクト指向プログラミングにおいて、各オブジェクトが持っている自身に対する操作。
という感じの意味だそうです。


```java
//メソッドの定義
class Add {
	int add(int x,int y) {
		return x + y;
	}
}
//メソッドの呼び出し
public class Main {
	public static void main(String[]args) {
		Add a = new Add();
		a.add(1, 3);
		
	}
}
```

```java
public class Main {
//関数の定義
	int add(int x, int y) {
		return x + y;
	}
//関数の呼び出し
	int c = add(1,2);
}
```

javaだとこんな感じになるんだと思います。
関数をおなじクラス内で使っていると関数。
関数をクラスで定義して、そのクラスからインスタンスを生成し、別のクラスで使用するとメソッドと呼ばれる。

参考にさせていただきました。
https://qiita.com/T-N0121/items/ecf5b911463ac9fa1d3e
php-master-changes 2018-09-03

# 2018-09-03
## petk: Remove AC_C_CONST
- https://github.com/php/php-src/commit/8e230d364d9d86b7b4d1eec1cbc2a26d843393be
- ext/mbstring と ext/xmlrpc で autoconf のマクロ AC_C_CONST がいらないので削除
- const をサポートしない C89 以前の処理系のため、const をプリプロセッサで消す用のもの

## petk: Remove AC_HEADER_TIME
- https://github.com/php/php-src/commit/f86d3de87f143ebb2f4a29a5d76edc62256a386b
- ext/mbstring と ext/xmlrpc で autoconf のマクロ AC_HEADER_TIME がいらないので削除
- <sys/time.h> と <time.h> が両方同時に include できるかチェックする用
- 今のシステムなら両方あるなら両方 include できる、という話らしい

## bukka: Fix stream_security_level.phpt with OpenSSL 1.1.1
- https://github.com/php/php-src/commit/cd0a37994e3cbf1f0aa1174155d3d662cefe2e7a
- ext/openssl のテスト stream_security_level.phpt でセキュリティレベルの指定を下げている
- PHP閉じタグ増やしてるのは何だろ

## dstogov: Fixed reference-countingin ZTS build.
- https://github.com/php/php-src/commit/7fde2243a712bb1cdc0b07cef2ba5ce13ec5259b
- trait のバインドでクラスにメソッドを追加する際、内部関数でも参照カウントを増やすよう修正？
- 先日の[この部分の修正](https://github.com/php/php-src/commit/709e4e4f17ddbeb99b366c293c3e2eaa16480a7a)を直した形
- ZTSで、というのは、非 ZTS だとデータの持ち場所で問題にならない箇所なのかな、ちょっとよく分からず

## cmb69: Update to Oniguruma 6.9.0
- https://github.com/php/php-src/commit/3e863ff29e8822d031d15fe8c4122c01e393b0c9
- ext/mbstring の鬼車を 6.9.0 にアップデート

## cmb69: Fix off-by-one errors in skip reasons
- https://github.com/php/php-src/commit/f543476e899d5b1f0df5aac15758c4e0db18cb17
- ext/intl のテストのスキップ理由テキストで、ICU 4.8 より上、となっていたのを以上に修正

## dstogov: Fixed condition
- https://github.com/php/php-src/commit/887e126240acc71359429c79f485959d5c9a4a86
- 早期バインドの判定で、親クラスが読み込まれていてかつ、その親が内部クラスでないか、compiler_option に ZEND_COMPILE_IGNORE_INTERNAL_CLASSES が含まれてない、という条件だったのを、ZEND_COMPILE_IGNORE_INTERNAL_CLASSES が含まれている、という判定だったのを修正
- [ZEND_COMPILE_IGNORE_INTERNAL_CLASSES](https://github.com/php/php-src/blob/6136a20544a3f8a116bb38e404dadd500006b134/Zend/zend_compile.h#L1030) は内部クラスを継承した子クラスでは早期バインドを行わないようにする、というオプション（名前から分かり辛いわ）

## weltling: Fixed bug [#76832](https://bugs.php.net/bug.php?id=76832) ZendOPcache.MemoryBase periodically deleted by the OS
- https://github.com/php/php-src/commit/f26172f9343cf49d62bbefff355bb76d6adf7ebe
- Windows 環境で opcache 有効だとエラー吐いて落ちたりする問題の修正
- Windows 10 Creator Update では、OSが勝手にユーザの Temp ディレクトリを掃除する（cleanmgr.exe）
- opcache が起動時一度だけ ```ZendOPcache.MemoryBase@...``` みたいなファイルを作り、プロセス再起動までこれは再生成されないので、Windows に消されると困るという話
- 1 週間くらい放置されたファイルしか消しにこないようなので、定期的に touch() すりゃいいか、ということで、タイムスタンプ更新するコードが入った
コマンドを実行しつつコマンド名をechoするbash関数

コマンドを列挙するようなスクリプトファイルを書いているときに、どのコマンドを実行しているのか明示することができます。

```bash
function trace {
  # コマンドがわかりやすいように青の太文字
  echo -e "\033[1m$@\033[0m" >&2

  "$@"
}
```

```bash:使い方
$ trace ls -al
ls -al
drwxr-xr-x+ 138 hk    staff   4.3K  9  4 04:10 .
drwxr-xr-x    6 root  admin   192B  9 16  2017 ..
...
```
フロントエンド初心者がgrunt-file-dependenciesを改造してみた

# はじめに

JavaScriptの結合処理を行おうとすると、依存関係に悩まされていました。
https://qiita.com/taka-vagyok/items/db2684fd1545853dfe2e

それらは、grunt-file-dependenciesを使えば解決できると見込み、
かつ、定義部分と利用部分をコード上から解析するため、次のような設定を追加しました。

```gruntfile.js
 file_dependencies: {
      ...: {
        options: {
          extractDefinesRegex: /(?!:["'])(PRJ(?:[\.][a-zA-Z]+)*)(?:\s*=)/g,
          extractRequiresRegex: /(?!:["'])(PRJ(?:[\.][a-zA-Z]+)*)(?:\s*^=)/g,
        }
```

しかし、そう簡単にはいかないもので、２つの問題が発生しました。

* 同じファイルが、定義と要求に追加され循環参照エラー
* 循環参照エラーの詳細が不明
  * どの定義情報が問題なのかを提示してくれない
  * 循環参照エラーのファイルを参照するファイルもエラーとして表示される

そこで、循環参照エラーの本丸を見つけるため、プラグインを改造して上記問題を解決しつつ、
参照関係を視覚化することにしました。

# grunt-file-dependencies の改造

プラグインの改造のポイントは４つです。

* 定義と要求が同じ場合に無視する
* 循環が発生しているファイルだけに絞り込めること
* 循環が発生している定義を絞り込めること
* 上記を満たしつつ視覚化できること

上３つは、プラグインの一部の関数を変更、下１つは、dotファイルを作成する仕組みを
組み込んでみることにしました（dotファイルはGraphvizで画像化できる）。
https://github.com/taka-vagyok/grunt-file-dependencies
※ 詳細は上のforkを参照してください。


視覚化した画像はどうなったかというと、以下のような感じになります。
![cycle.png](https://qiita-image-store.s3.amazonaws.com/0/281608/2f5ff173-5c60-8953-979c-f79f5c9ab5a8.png)
※ Graphvizのインストール＆パス追加と、VSCodeにGraphviz Previewというプラグインをインストールしました。

2018/9/4現在、cyclemap.dot というファイル名固定で作っているため、Pullしてもらう品質ではなく、
node_modules\grunt-file-dependencies\tasks\file_dependencies.js
を手動で置き換える必要があります。が、結構使えるツールになったとおもいます。

# TODO

追加したオプションは勝手につけくわえたものなので、optionで切り替えができることと、
DRYの法則に反しているので、より良い修正方法に切り替える必要がありますが、
ひとまず、使えるようになったのでメモとして残しておきます。

* 同一ファイルのスキップ
* dot ファイルの出力の有無
* dot ファイルの名称

とても良いプラグインなので、これらができたら、取り込んでもらいたいなーと思っています。
[Ruby on railsメモ]Rubocopていう自動修正ツールがあるらしい

#Rubocopとは

コードを自動修正してくれるライブラリ機能らしい。gemをいれる。

ていうかもしかしたら初歩の初歩くらいに知る（かもしれない）ようなこの機能を、rails触り始めてから４ヶ月で知るという...。

勉強しよう。

#こうやって入れました
Gemfileにて、

```Gemfile.
group :development, :test do
gem 'rubocop', require: false
end
```

次にターミナルにて、

```
bundle install
```

```
bundle exec rubocop
```

で、コードをチェックしてくれる。
コードを修正したいときは、

```
bundle exec rubocop -a
```

で、できるそう。
ContainerViewにWKWebViewを表示

#初学者のメモです。間違いや凡ミスなどありましたら、ごめんなさい。

###コードで作っていきます。StoryBoardは使いません。

概要のみ

WKWebvViewを生成

```swift
webView = WKWebView()
webView.frame = self.view.frame
省略
self.view.addSubView(webView)
```


別ViewControllerでContainerViewを生成。

```swift
let containerView = UIView()
containerView.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(containerView)
NSLayoutConstraint.activate([containerView.leadinfAnchor.constraint( ~//constraint省略

//WKWebViewを定義したViewControllerを生成
let webView = ViewController()
addChildViewController(webView)
//この後willMove(toParent:)は自動的に呼び出されるので必須ではない。

webView.view.translatesAutoresizingMaskIntoConstraints = false
containerView.addSubview(webView.view)
NSLayoutConstraint.activate( ~//constraint省略

webView.didMove(toParentViewController: self)//カスタムのContainerViewを実装する場合、
//遷移がある場合はその完了後、ない場合はaddChild(_:)の後に、このメソッドを明示的に呼び出さなければならない。
```

また追記していきます。
[Ruby on railsメモ]before_actionを設定するときに、onlyなどで複数アクションを指定する。

```hoge_controller.rb
class HogeController < ApplicationController
before_action :hoge_action, only: %i[index edit_page ...]

def index
...
end

def edit_page
...
end

def ...
...
end

end
```

というかんじで、
%iをつけてアクションを複数指定するようでした。

Rubocopっていう自動修正ツールを使って直してたらこうなってました。
学習記録：PHP　その２

#9月1～２日　PHP

今回の3章は画像のようなページを作ることが目標

![c1d9fa26-e45e-44bf-b15c-fb40be54aa98.jpg](https://qiita-image-store.s3.amazonaws.com/0/284313/b6977b68-1afa-d14b-31bd-8cd83a372eed.jpeg)

・メニュー4品の４の部分はメニュー数に合わせて変わるように
　インスタンスが生成されるたびに１加算し、その結果を数字として表示するように
・飲み物は「アイス・ホットの情報」、食べ物は「辛さの情報」が
　それぞれ表示されるようにファイルを分けて定義

続けて4章ですが

![3419d356-c455-4d2f-b339-7d460a39fd67.jpg](https://qiita-image-store.s3.amazonaws.com/0/284313/897c9dff-b1ed-baff-dda8-0f36d7aa21f4.jpeg)

・商品名をクリックで飛べるリンク先ページの生成
・クリックした商品に合わせたレビューページの作成
・レビュー者情報が重複しないような仕組みの構築

いやぁ…ほんと、これ難しすぎです…。

##　個人的なメモ

**クラスプロパティ**
個々のインスタンスではなく、クラスが持つデータ（クラスプロパティ）
の定義とアクセス方法について

```php:menu.php
  <?php
class Menu { 
//クラスプロパティを定義する場合は「static クラスプロパティ名」とする
//ここのインストラクタに関与させない場合には、staticをつける
private static $count = 0 ; 
//クラス内でクラスプロパティにアクセスする場合は「self::$クラスプロパティ名」とする
self::$count ++ ;
}
  ?>
```

```php:index.php
<?php 
  //クラスプロパティにアクセスする　クラス名::$クラスプロパティ名
  echo Menu::$count 
?>
```

**継承した親クラスのメソッドの呼び出し（オーバーライド）**

```php:drink.php
  <?php
//別のクラスを継承する場合は 「class 子クラス名 extends 親クラス名」とする 
 class Drink extends Menu {
  private $type;
  public function __construct($name, $price, $image, $type) {
    // 親クラスのコンストラクタを呼び出す場合は「parent::メソッド名」
    parent::__construct($name, $price, $image) ;
    $this->type = $type;
  }
  ?>
```

**PHP内でifやforを使用する場合**
if文、for文、while文、witch文foreach文を書く場合は、
「endif」「endfor」「endwhile」「endswitch」「endforeach」を使用して閉じる


```php:index.php
// $menuで呼び出されたクラスがドリンクであれば実行したい
// →　instanceof で判定させる
//改行を含まない<?php ?>の場合は、<?php : ?>のようにコロンを使用する
<?php if ($menu instanceof Drink): ?>
　<p class="menu-item-type"><?php echo $menu->getType() ?></p>
//<?php else : ?>で条件分岐をさせているが、:を使用することに注意
<?php else : ?>
 <p><?php echo '辛さ:'. $menu->getSpiciness() ?></p>
//<?php if ?>を閉じるために<?php endif ?>を置く。:は使用しない。
<?php endif ?>
```
**クエリ情報の追加**
URLの末尾の「?」以降に「キー名=値」の形で簡単な情報をのせることができる。
これをクエリ情報といい、クエリ情報を用いてリンク先のページに情報を渡すことができます。

Q.なぜ情報を渡す必要があるのか？
A.クエリ情報に入っている内容によって、表示させる内容を変えるため（たぶん）

```php:index.php
<a href= "show.php?name= <?php echo $menu->getName()?> " >
 <?php echo $menu->getName() ?>
</a>
```

```php:show.php
<?php
// クエリ情報の値(?以降の情報)を受け取るには、$_GET['キー名']で定義する。
 $menuName = $_GET['name'] ;
//　第２引数にはクエリ情報に入力された商品名が入り、第１引数は配列化されたmenusの値が順番に入る
//　findByNameのクラスメソッドでは、クエリ情報と配列の一致した値を戻り値としている
 $menu = Menu::findByName($menus, $menuName);
?>　
```


```php:show.php
<?php
class Menu {
…
//getreviewsに$reviewsForMenuの値が戻り値として入る。
  public function getReviews($reviews) {
//　空の配列
    $reviewsForMenu = array() ;
    foreach($reviews as $review) {
      if ($review->getMenuName() == $this->name) {
// $reviewsForMenu[]の配列の末尾に値を追加する。
//最終的に$reviewsForMenuの配列には、特定の商品名のreviewがすべて入った状態になる。
        $reviewsForMenu[] = $review ;
      }
    }
   return $reviewsForMenu ;
   } 
}
?>
```
three.jsでPC内の画像を使うときはローカルサーバーを立てる


##はじめに
three.ｊｓ初心者です。three.jsの基本を学んでいる途中です。
qiitaも初めてです。
[このページ](https://ics.media/tutorial-three/material_basic.html)でマテリアルに地球儀の画像を貼り付けて表示出来るらしいのですが、もうひと手間必要だったということで投稿します。(初投稿になります)
ローカルサーバを立ててそのファイルにアクセスしないと上手く行きませんでした(地球儀が表示できない)。
linuxのOSでやってますので他のOSでは下記の通りにいくかどうかは存じ上げません。
##１，書いてあるとおりにする
先述のサイトのサンプルコードを保存し、地球儀の画像もそのサイトのリンクから保存し、同じディレクトリに格納する。
[サンプルソース-github](
https://github.com/ics-creative/tutorial-three/blob/master/samples/material_texture.html)
(コード内の'imgs/earthmap1k.jpg'を'earthmap1k.jpg'に書き換えるか、同ディレクトリにimgsディレクトリを作りその中に画像を格納する)
[地球儀](https://github.com/ics-creative/tutorial-three/tree/master/samples/imgs)
##２，上手く行かない
サンプルファイルをダブルクリックしても、ほぼ真っ黒のシーンにわずかなライトのみ表示される。
![picture.png](https://qiita-image-store.s3.amazonaws.com/0/247105/819da576-6737-411b-d5e2-4c85292ac51a.png)

ローカルのサーバーを立てないといけない様です。
##３，そんな時は、phpでサーバーを立てる
端末でコードのあるディレクトリに移動し、コマンドを打ちます。

```Bash:bash
php -S localhost:9000
```
その後ブラウザで

localhost:9000/ソースコードのファイル名


　と打てば地球儀が現れます(ました)。
![alt](https://ics-creative.github.io/tutorial-three/imgs/material_texture.png)
PythonでImportErrorが起きたときの確認事項まとめ

## 概要

初心者が躓きがちなimportエラーの対処法をまとめてみました。

以下`$` から始まるものはターミナルで、`>>>`で始まるものはpythonコンソールで実行してみてください。

## 1. pythonのバージョン

###1. 1. ターミナル

```sh
$ python -V
=> Python 3.6.5
```

pyenvなどを使ってる場合は、ちゃんと使いたいインタプリタかを確認。

```sh
$ pyenv versions
 system
* 3.6.5 (set by /home/user/.pyenv/version)

$ which python
/home/user/.pyenv/shims/python3
```

### 1. 2. 実行環境
```python
>>> import sys
>>> sys.executable # インタプリタへのパス
'/path/to/executable/bin/python'
>>> sys.version # バージョン
'3.6.5 (default, Jul 20 2018, 02:34:00)]'
```
2系と3系が共存している場合は3のつもりが2を呼び出してたりすることがあります。

## 2. パッケージがインストールされているか
```sh
$ pip freeze | grep numpy 
=> numpy==1.14.4
```
ここにない場合は`pip install`などでインストールしましょう。
自作パッケージの場合は次の項目へ。

## 3. パスが通っているか
import文を読むとpythonは既定のパスにパッケージを探しに行きます。
そこにないとimportできないので確認。

```python
>>> import sys
>>> sys.path
['', '/home/user/.pyenv/versions/3.6.5/lib/python36.zip', '/home/user/.pyenv/versions/3.6.5/lib/python3.6', '/home/user/.pyenv/versions/3.6.5/lib/python3.6/lib-dynload', '/home/user/.local/lib/python3.6/site-packages', '/home/user/.pyenv/versions/3.6.5/lib/python3.6/site-packages']
```

パスが通っていない場合は、以下のいずれかを試してください。

### 3. 1. パッケージをパスが通っている場所に置く
上記で調べたうちのどこか（`path/to/python3.6/site-packages`など）に置くか、シンボリックリンクを張ってください。

### 3. 2. パスを追加する

```python
>>> sys.path.append('/path/to/module/')
```

### 3. 3. PYTHONPATHを設定する

```sh
$ export PYTHONPATH="/path/to/your/module/:${PYTHONPATH}"
```

などとシェルの設定ファイル(bashrcやzshrc)に書いて反映させる。

### 自作パッケージの場合、\_\_init\_\_.pyを忘れないように

mydirディレクトリのmymoduleモジュールをimportする場合

```python
from mydir import mymodule
```
などと書きますが、from mydirの部分でImportErrorが出ることがあります。
これは\_\_init\_\_.pyがディレクトリ下にないとmydirがパッケージとして認識されないからです。
空でいいので\_\_init\_\_.pyをおいておきましょう。

## 4. 相対importの場合、実行場所に気をつける

相対importとは、

```python
from . import mymodule
from ..foo import bar
```

のように、相対的なパス指定でのimportのことです。
この場合、このコードを実行している場所からの相対パスになるので注意しましょう。

## 5. 同じ名前の別のファイルやフォルダがプロジェクト内にないか

たとえば`import os`をしたい場合に、osという同じ名前のファイル(os.py)やフォルダが
実行ファイルの付近にあるとそちらが優先的にimport対象となります。
意外と盲点なので、名前をつけるときは被らないように気をつけましょう。

## 6. 循環importをしていないか

```a.py
import b
```
```b.py
import a
```

これは循環参照なのでエラーになります。
最近作ったAWS EC2インスタンス上で`git-completion`が動かなくなってたのでGit最新版を入れたよってお話

# git-completion is 何
gitのコマンドを色々とよしなに補完してくれる便利なやつだよ。
https://github.com/git/git/blob/master/contrib/completion/git-completion.bash

# 背景
Vagrantで構築しているEC2インスタンス上で、いつの間にか`git-completion`が動かなくなっていた。
`git-completion`を取得するときは↑のMasterリポジトリから取得しているんだけど、
どうも`git version 1.18`から新たなオプションが追加されたらしく、Masterブランチの`git-completion`にはそれが取り込まれているが、EC2インスタンスにyum経由で入るGitは`< 1.18`なので補完しようとタブキーを押すとエラーを吐くようになってしまった。
`git reb`までタイピングして補完する癖が染み付いているので結構なストレスだったので問題解消することにした。

# 事前準備
依存ライブラリがない場合はインストール

```sh
sudo yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel
```

# やったこと
以下を実行すれば(多分)解決する。
単純にgitの最新版ソースからインストールしているだけ。

```sh
# yumで入っているgitでgit最新版を持ってくる
git clone git://git.kernel.org/pub/scm/git/git.git
# 持ってきた最新版のgitのディレクトリに入る
cd git
# git tag でタグ確認 → git checkout tagname でバージョンタグにチェックアウトしたほうが安全
# makeしてinstall
make prefix=/usr/local all
sudo make prefix=/usr/local install
```

# 確認
```sh
git --version
#=> git version 2.18.0
```

これで`git-completion`も問題なく動くようになった。

# 参考にしたサイト
+ [Gitのインストール](https://git-scm.com/book/ja/v1/%E4%BD%BF%E3%81%84%E5%A7%8B%E3%82%81%E3%82%8B-Git%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)
CloudFront=>ELB=>EC2(nginx) で、接続元 IP アドレスを取得する

# まとめ

- `X-Forwarded-For` ヘッダの右から 2 つ目が接続元 IP アドレスです。
- ただし `X-Forwarded-For` の不正な書き換えを防止するため、 CloudFront=>ELB=>EC2 それぞれの通信を保護する必要があります。

# CloudFront => ELB を保護する

[CloudFrontのELBオリジンへ直接アクセスする通信を制限する方法 ｜ Developers.IO](https://dev.classmethod.jp/cloud/aws/how-to-restrict-elb-origin/) に詳しいです。

要約すると、

- CloudFront のカスタムヘッダに秘密の文字列を設定し、 ELB や EC2 側でそれを検証する
- ELB のセキュリティグループで、 CloudFront の IP アドレスだけを許可するよう設定する (要定期更新)

の 2 種類になります。

# ELB => EC2(nginx) を保護する

EC2 のセキュリティグループで、 ELB (もしくは ELB 用のセキュリティグループ) からのアクセスのみを許可するように設定すれば達成できます。

# nginx 設定例

```
set $real_ip "";

# X-Forwarded-For の右から 2 つ目の IP アドレスを接続元として扱う。
# CloudFront => ELB => nginx という構成で、それぞれの通信が保護されている前提。
if ($http_x_forwarded_for ~ "([^, ]+) *, *[^, ]+ *$") {
  set $real_ip $1;
}

if ($real_ip = "") {
  # X-Forwarded-For が何かおかしい。安全のため、 400 Bad Request で終了する。
  return 400;
}
```

## バックエンド (Rails など) にリバースプロキシするなら

```
proxy_set_header X-Forwarded-For $real_ip;
# や
proxy_set_header X-Real-IP $real_ip;
# など
```

で渡せます。

- バックエンド側で、 nginx 自身の IP アドレスを転送元として信頼するよう設定する必要があるかもしれません。
- CloudFront/ELB どちらも `X-Real-IP` は使わないので、不正な値が設定されないよう、上書きするか、消しておくかしたほうが良いです。

## FastCGI (php-fpm など) に渡すなら

```
fastcgi_param REMOTE_ADDR $real_ip;
# や
fastcgi_param HTTP_X_FORWARDED_FOR $real_ip;
# や
fastcgi_param HTTP_X_REAL_IP $real_ip;
# など
```

で 渡せます。

- FastCGI なら `REMOTE_ADDR` も上書きできます。
- やはり、不正な値が設定されないよう、 `HTTP_X_REAL_IP` は上書きするか消すかしたほうが良いです。

## アクセス制限に利用するなら

```
http {
  map $real_ip $ip_type {
    default "default";
    1.1.1.1 "Foo";
    2.2.2.2 "Bar";
  }

  server {
    set $real_ip "";
    # 略。上記の $real_ip 関連の設定。
    
    if ($ip_type = "default") {
      return 403;
    }
  }
}
```

のような書き方が可能です。
※本当は `set_real_ip_from` などを使ったほうが綺麗だと思うのですが、 nginx レベルで CloudFront の IP アドレスを管理する手間が……。

なお、アクセス制限をするのであれば、 CloudFront に AWS WAF をつけるほうがシンプルかつパフォーマンスも良いかと思います。

- ウェブ ACL 1 つで $5/月
- IP アドレス制限用のルール 1 つで $1/月
    - 1 ルールに複数の IP アドレスを登録できます
    - 他、国や URL などの条件も同じルールとして設定できます (1 ルール＝複数の条件のグループ)
- ルール 1 つごとに 100 万ウェブリクエストあたり $0.60

なので、 \$6/月＋100 万ウェブリクエストあたり $0.60 で利用可能です。

# 後書き

CloudFront => ELB => WordPress という構成で、 WordPress のブルートフォース攻撃から保護するプラグイン用に上記のような設定を使いました。
※接続元 IP アドレス単位でアクセスをブロックしたりするので、正しく IP アドレスを伝える必要があった。
※何もしないと CloudFront や ELB の IP アドレスがブロックされてしまって、結果すべてのアクセスがブロックされる可能性があった。
ラーメン二郎GAN～家二郎のその先へ～


# はじめに
[SushiGAN 〜人工知能は寿司を握れるか？〜](https://qiita.com/shionhonda/items/1c43081a4c038667a694)に触発されて、ラーメン二郎GANを作ってみた。

画像公開用の記事。
ロジックの細かい説明は、GAN(DCGAN)の他の記事を参考にしてください。

# GAN(DCGAN)
GANとは、潜在変数と呼ばれるノイズから「本物っぽい」画像などを生成するためのニューラルネットワーク。

画像を生成する「Generator」と画像が本物かどうかを判別する「Discriminator」という2つのニューラルネットワークで構成される。

本物の画像を直接投入して学習させるのは「Discriminator」だけであり、「本物っぽい」画像を生成する「Generator」は本物を知らないのがポイント。

また、各ピクセル情報を独立に学習するのではなく、隣り合うピクセルの関係も含めて学習させるために、畳み込み処理を行うようにしたのがDCGAN。

# データセット
画像検索で適当に拾ってきた二郎の画像181枚。（少なっ）
文字が入っていたり、余計なものが色々映り込んでいる画像は除外。
お遊びなので、どん二郎（どん兵衛の二郎版）の画像も紛れ込ませてみた。

# 結果

ほぼ未学習だとこんな画像。
![train_00_0099.png](https://qiita-image-store.s3.amazonaws.com/0/286635/ceff3d69-0b09-daf2-e279-0975c384b255.png)

学習を繰り返すと二郎っぽい画像が！
![train_190_0109.png](https://qiita-image-store.s3.amazonaws.com/0/286635/32dcc112-825d-1868-aa3f-27d7012cb417.png)

GIFにしてみました。
![ダウンロード.gif](https://qiita-image-store.s3.amazonaws.com/0/286635/12c7352f-e03f-5b50-34fd-2b83b0244e13.gif)

# おまけ

明らかに過学習を起こしたもの。
![test_arange_0.png](https://qiita-image-store.s3.amazonaws.com/0/286635/9cbd5378-2af2-c549-8387-69ff9120d9c0.png)

ほぼ教師データのコピー。
これじゃ、汎化性ないっすわな。
![jiro (42).jpg](https://qiita-image-store.s3.amazonaws.com/0/286635/e2bfed36-ddc4-4134-9878-78a9d208b5a1.jpeg)
VBA GetSystemMatrix WinApi 64/32 共用Class

#WinAPI はClassモジュールにするのが有効かもしれない
今の共用関数は長いので、単純に値を返すものは有効みたいです
[ここで](https://qiita.com/Q11Q/items/a17570f769a928cb4793)も取り上げましたが、画面のサイズというか解像度、それを返すGetSystemMatirxです

##注意点
Classモジュールの名前は指定した名前にしてください。
それがオブジェクト名になります。
厳密に言うとオブジェクト名ではありませんが、インテリセンスが発動するのです。


#コード
##標準モジュール

Sub DisplaySizeClassUsingStandardModle()
'https://www.moug.net/tech/acvba/0020033.html
'ここのサンプルからClassモジュールを作成し書き換えました
'この Sub Procedure(サブプロシージャ)は標準モジュール用のコードです
'Display 画面の縦と横のサイズ(解像度)を長整数型(long)で取得します。単位はPixcelです
'このSub Procedure(サブプロシージャ)はDisplaySizeClassが必要です。
'Class 用の変数とNew命令
Dim c As DisplaySizeClass : Set c = New DisplaySizeClass
Debug.Print c.GetDisplaySizeXPixels, c.GetDisplaySizeYPixels
End Sub


##Classモジュール

```vb
Option Explicit
'----------------------------
' Display Class Module
'----------------------------
'このScriptはVBAのクラスモジュール用です
' 標準モジュールでは動きません
' Classモジュールの名前をVBEにおいてF4を押しプロパティウィンドウを出し、(オブジェクト名)に半角で
' DisplaySizeClass
' と入力してください
' GetsystemMetrixとは...
'"たとえば、GetSystemMetrics 関数は、オペレーティング システムの異なる機能を指定する 75 個の定数のいずれかを取得します。
'関数により返される情報は、渡した定数により異なります。GetSystemMetrics を呼び出すには、75 個のすべての定数ではなく、使用する定数のみを含めます。
'メモ   定数を表す値を渡すよりも、定数を定義する方法をお勧めします。定数は Microsoft 製品がバージョンアップしても変わりませんが、定数値は変更する可能性があります。
'DLL 関数に必要な定数は一般的に予測不可能なものが多いので､特定の値を返すためには､目的の関数のドキュメントを参照して､渡す定数を確認する必要があります｡


#If VBA7 Then
Private Declare PtrSafe Function GetSystemMetrics _
Lib "USER32" _
(ByVal nIndex As Long) As Long
#Else
Private Declare Function GetSystemMetrics Lib "USER32" (ByVal nIndex As Long) As Long
#End If
Private Const SM_CXSCREEN As Long = 0
Private Const SM_CYSCREEN As Long = 1

'取得 Property Get
'設定 オブジェクト Property Set
'設定　それ以外 Property Let

'アクセサ
Property Get GetDisplaySizeXPixels() As Long
GetDisplaySizeXPixels = GetSystemMetrics(SM_CXSCREEN)
End Property
Property Get GetDisplaySizeYPixels() As Long
GetDisplaySizeYPixels = GetSystemMetrics(SM_CYSCREEN)
End Property

'Sub DisplaySizeClassUsingStandardModle()
''https://www.moug.net/tech/acvba/0020033.html
''ここのサンプルからClassモジュールを作成し書き換えました
''この Sub Procedure(サブプロシージャ)は標準モジュール用のコードです
'Dim c As DisplaySizeClass
'Set c = New DisplaySizeClass
'Debug.Print c.GetDisplaySizeXPixels, c.GetDisplaySizeYPixels
'End Sub
```

# 長所

##標準モジュールが軽くて見やすくなる
Mougのページのコードを共用のClassに変えました
こうすると標準モジュールではDim と Set NewでClassが使えます。
しかし、
標準モジュールの上部にはDeclare、宣言がなくなります。Class用の1行だけ増えただけです。
zsh ユーザーなら zargs　を使う。


xargs の zsh 版みたいなやつ。


### 先ずは

```bash:zsh
autoload -U zargs
```

### 基本的な使い方

```bash:zsh
zargs -- **/*(.) -- ls
```

こんな感じで zsh の修飾子や拡張 glob を知っていると、すごく便利に使える。


verbose オプション `-t` をつけて、max-args を 3 `-n3` とかにするとこんな感じ。

```bash:zsh
% zargs -t -n3 -- {1..10} -- echo                                                                                  
echo 1 2 3
1 2 3
echo 4 5 6
4 5 6
echo 7 8 9
7 8 9
echo 10
10	
```

`-P` オプションとかで並列実行するとかもできるし、引数を渡す位置を変更したければ、 `-i` オプションを用いる。

```bash:zsh
% zargs -P0 -i{} -- **/*.jpg -- command -i {} -o ./output
```



### help

```zsh
% zargs --help                                                                                                                                                                                                    Usage: zargs [options --] [input-args] [-- command [initial-args]]

If command and initial-args are omitted, "print -r --" is used.

Options:
--eof[=eof-str], -e[eof-str]
    Change the end-of-input-args string from "--" to eof-str.  If
    given as --eof=, an empty argument is the end; as --eof or -e,
    with no (or an empty) eof-str, all arguments are input-args.
--exit, -x
    Exit if the size (see --max-chars) is exceeded.
--help
    Print this summary and exit.
--interactive, -p
    Prompt before executing each command line.
--max-args=max-args, -n max-args
    Use at most max-args arguments per command line.
--max-chars=max-chars, -s max-chars
    Use at most max-chars characters per command line.
--max-lines[=max-lines], -l[max-lines]
    Use at most max-lines of the input-args per command line.
    This option is misnamed for xargs compatibility.
--max-procs=max-procs, -P max-procs
    Run up to max-procs command lines in the background at once.
--no-run-if-empty, -r
    Do nothing if there are no input arguments before the eof-str.
--null, -0
    Split each input-arg at null bytes, for xargs compatibility.
--replace[=replace-str], -i[replace-str]
    Substitute replace-str in the initial-args by each initial-arg.
    Implies --exit --max-lines=1.
--verbose, -t
    Print each command line to stderr before executing it.
--version
    Print the version number of zargs and exit.
```
ルーティング設定を行ったAngularアプリをFlaskで動かす

新たにAngularでアプリを作成してHerokuで動かそうとした際に、同時にPythonで作成したバックエンドのアプリも使いたいときがありました。
その時に、バックエンドをPythonサーバー・フロントエンドをAngularにすればいいのでは！と思ってアプリを構築した際の手順の忘備録です。

# 開発環境
PythonサーバーにはFlaskを採用しました。
* Flask 1.0.2
* Angular CLI 6.1.1

# Angularアプリのビルド
FlaskでAngularのアプリを表示するために、Angularアプリをビルドします。
デフォルトの設定ではビルドするとdistというディレクトリが作成されると思います。このディレクトリの内部のファイルが公開用に使うものとなっています。
ここでは、テスト用のアプリを作成し、ビルドを行うまでのコマンドを記載しています。
testコンポネントはのちのAngularのルーティング設定に使うために作成しました。

``` bash
$ ng new MyApp
$ cd MyApp
$ ng g component test
$ ng build --prod
```



# FlaskでAngularで作成したアプリを表示
上記でビルドしたファイルを表示するための設定を行っていきました。

``` python:main.py
# -*- coding:utf-8 -*-
import sys
from flask import Flask


#import MeCab

app = Flask(__name__, static_url_path='', static_folder='./dist/MyApp')
app.config['JSON_AS_ASCII'] = False

@app.route('/', methods=['GET'])
def getAngular():
    return app.send_static_file('index.html')

if __name__ == '__main__':
    app.run()
```
> static_folder='./dist/MyApp'

ここにビルドしたAngularアプリを指定します。

> @app.route('/', methods=['GET'])
def getAngular():
    return app.send_static_file('index.html')

ルーティングの設定を行ない、index.htmlを表示するように設定しました。

``` bash
$ python main.py
```
上記でflaskを実行し、http://localhost:5000 にアクセスすることでAngularで作成したアプリが表示されるようになりました。

# Angularのルーティング設定
上記までの方法でAngularのアプリを表示することができました。
しかし、Angularでルーティングを設定しURLによる画面遷移を実装した際に、正しくページ遷移がされず404が表示されてしまうということが起きてしまいました。
Flaskの設定を参照してしまい、ルーティングが設定されていないと判定されてしまうのでエラーになってしまったのが原因と推測しています。
一応AngularのRouterのNavigateなどを使えば画面遷移することができたのですが、リロードをすると404が表示されてしまいました。
リロードした際に404が表示されるのはちょっと嫌だったので、Angularの設定を変更しハッシュリンク・フラグメント形式でページとURLを対応付けることでこの問題を解決しました。
( < url>/#/test みたいな形式です)

``` TypeScript:app.module.ts
import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';

import { AppComponent } from './app.component';
import { TestComponent } from './test/test.component';
import { RouterModule, Routes } from '@angular/router';
const myRoutes = [
  { path: 'test', component: TestComponent },
];

@NgModule({
  declarations: [
    AppComponent,
    TestComponent
  ],
  imports: [
    BrowserModule,
    RouterModule.forRoot(myRoutes,{useHash:true})
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
```

> const myRoutes = [
  { path: 'test', component: TestComponent },
];

ここで、ページ遷移のルーティングを設定しています。ここではtestというパスを登録しました。

> RouterModule.forRoot(myRoutes,{useHash:true})

ルーティングの設定を行う箇所にてuseHashを有効にすることで、Angularのルーティングがハッシュリンク・フラグメント形式に変更することができました。試しにFlaskを起動し、http://localhost:5000/#/private にアクセスしてみても画面を表示することができました。
この状態でリロードを押しても404が返ってこなかったので、無事Angularアプリを表示することができました！