OmniAICreator/Qiita-1.07M huggingface dataset:
C++ Builder XE4 > TeeChart > TPointSeries > はまり: ValueColor[]をclTeeColorにしないと色変更できない

```txt:動作環境
C++ Builder XE4
TeeChart Lite v2013.08.130414 32bit VCL
```

### 概要

- TeeChartにてTPointSeriesを追加した
- TPointSeriesの色を変更しようとしたが変更できなかった
    - ValueColor[]をclTeeColorにしないと色変更できない
        - 参考: [TPointSeries and colors of pointer](https://www.steema.com/support/viewtopic.php?t=13538)

### 実装

```Unit1.h
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <System.Classes.hpp>
#include <Vcl.Controls.hpp>
#include <Vcl.StdCtrls.hpp>
#include <Vcl.Forms.hpp>
#include <Vcl.ExtCtrls.hpp>
#include <VCLTee.Chart.hpp>
#include <VCLTee.Series.hpp>
#include <VCLTee.TeEngine.hpp>
#include <VCLTee.TeeProcs.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:	// IDE で管理されるコンポーネント
	TChart *Chart1;
	TPointSeries *Series1;
	TButton *Button1;
	void __fastcall Button1Click(TObject *Sender);
private:	// ユーザー宣言
public:		// ユーザー宣言
	__fastcall TForm1(TComponent* Owner);
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif
```

```Unit1.cpp
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include <DateUtils.hpp>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
	// 1. ダミーデータの追加
	Chart1->Series[0]->XValues->DateTime = true;
	Chart1->BottomAxis->DateTimeFormat = L"nn:ss";
	//
	TDateTime dt;
	//
	dt = Now();
	//
	double yval;
	for (int idx=0; idx < 10; idx++) {
		yval = (1+ idx) % 2;
		Series1->AddXY(dt, yval, "", clRed);
		dt = IncSecond(dt, 1);
	}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
	// 2. 色の変更

	for(int idx=0; idx<Series1->Count(); idx++) {
		Series1->ValueColor[idx] = clTeeColor;  // 一旦clTeeColorにしないと下記の色設定は有効でない
	}

//	Series1->Color = clBlue;
//	Series1->Brush->Color = clBlue;
//	Series1->Brush->Style = bsSolid;
	Series1->SeriesColor = clBlue;
}
//---------------------------------------------------------------------------
```

### 動作例

Button1押下前 (デザインで赤色にしている)
![2018-11-21_16h54_29.png](https://qiita-image-store.s3.amazonaws.com/0/32870/55217d49-b2e8-4a6f-3a86-9988cfc909fb.png)

Button1押下後
![2018-11-21_16h54_43.png](https://qiita-image-store.s3.amazonaws.com/0/32870/785b23fb-b818-9258-56e8-f87ecc9712d5.png)


### 関連

- [C++ Builder XE4 > TeeChart > クリックした点に近い系列データの明示 > 点と値の表示 > v0.3: 線からはずれていても縦方向の走査により線を見つける](https://qiita.com/7of9/items/624007066d734e3e5e0f)
JenkinsでSonarQubeのQualityGateがFailedの場合にビルドを失敗させたい (プラグインを使わない場合)

# JenkinsでSonarQubeのQualityGateがFailedの場合にビルドを失敗させたい
- 事情によりSonarQubeプラグインを使用することが困難だったため、SonarQubeプラグインを使わずにJenkinsからSonarQubeのQualityGateの状態を取得し、エラーだったらパイプラインをこけさせるように設定してみました。

## バージョン
### SonarQube
6.7.3 

### Jenkins
2.71


## Jenkinsfile

```Jenkinsfile

QGSTATUS_WAITINTERVAL=5
QGSTATUS_TIMEOUT=60

@NonCPS
def jsonParse(text) {
    return new groovy.json.JsonSlurperClassic().parseText(text);
}

pipeline { 
    stages {
        stage('チェックアウト') {
            steps {
                git branch: 'develop', credentialsId: 'aaaaaaaaaaaaaaaaaaaaa', url: 'http://repository/project.git'
            }
        }
        stage('Build/UT/Upload to SonarQube') {
            steps {
                dir("project-root/") {
                    // テスト実行
                    sh "mvn -DskipTests=false -B -Dmaven.test.failure.ignore=true clean install"

                    // SonarQube解析
                    sh "mvn -Dmaven.test.skip=true --quiet sonar:sonar -Dsonar.host.url=http://example.com:9000 -Dsonar.branch="develop"
                }
                script {

                    // API経由でプロジェクトのQualityGateの状態を取得
                    sh "curl http://example.com:9000/api/qualitygates/project_status?projectKey=your_project_key -o qualityGate.json"

                    // 評価対象ファイルが存在するか確認する
                    def timer = 0
                    def executeFlag = false
                    while(true){
                    	sleep("${QGSTATUS_WAITINTERVAL}")
                    	timer = timer + QGSTATUS_WAITINTERVAL
                    	if(fileExists("qualityGate.json")){
                    		executeFlag = true
                    		break
                    	}
                    	if(timer > QGSTATUS_TIMEOUT){
                    		break
                    	}
                    }

                    if(executeFlag == true){
                    
                        // Jsonオブジェクトに変換
                        def qualitygate = jsonParse(readFile('qualityGate.json'))
                        echo qualitygate.toString()

                        // Statusがエラーだったらビルドを失敗させる
                        if ("ERROR".equals(qualitygate["projectStatus"]["status"])) {
                            error "Quality Gate failure"
                        }

                        // 評価対象ファイルを削除する
                        sh "rm -f ./qualityGate.json"
                    }
                }
            }
            post {
                always {
                    // ...
                }
            }
        }
    }
     post {
        success {
            // ...
        }
        unstable {
            // ...
        }
        failure {
            // ...
        }
    }
}

```

## project_keyの取得方法
- 「Administration」→ プルダウンのUpdate Keyで取得可能
機械学習用に画像を集めたい

[hellock/icrawler: A multi-thread crawler framework with many builtin image crawlers provided.](https://github.com/hellock/icrawler)

自分でクローラーを書いてもいいのですが、今回はライブラリを使いました。

# pipのインストール
```shell
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py --user
export PATH="$HOME/Library/Python/2.7/bin:$PATH"
pip install icrawler --user
```

# 確認
```shell
$ pip -V
pip 18.1

$ pip install matplotlib
```

# ~/.matplotlib/matplotlibrcの設定
```
backend : TkAgg
```

```plot.py
import matplotlib.pyplot as plt

x = [1, 2, 3, 4, 5]
y = [2, 3, 5, 7, 8]

plt.plot( x, y )
plt.show()
```

```
$ python plot.py
```

<img width="631" alt="スクリーンショット 2018-11-21 13.34.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/95172/07fe89e1-f3f3-1aaa-4787-d5e5c2cfb96b.png">


# 使い方
```python
# coding:utf-8

from icrawler.builtin import GoogleImageCrawler
    
crawler = GoogleImageCrawler(storage={"root_dir": "images"})
crawler.crawl(keyword="猫", max_num=100)
```

実行すると以下のようにダウンロードが始まります。

```
2018-11-21 13:43:26,450 - INFO - icrawler.crawler - start crawling...
2018-11-21 13:43:26,450 - INFO - icrawler.crawler - starting 1 feeder threads...
2018-11-21 13:43:26,451 - INFO - feeder - thread feeder-001 exit
2018-11-21 13:43:26,451 - INFO - icrawler.crawler - starting 1 parser threads...
2018-11-21 13:43:26,452 - INFO - icrawler.crawler - starting 1 downloader threads...
...
...
```

# マニュアル
http://icrawler.readthedocs.io/en/latest/

# ちょっと変えた
```nogizaka.py
# coding:utf-8

from icrawler.builtin import GoogleImageCrawler
import sys
import os

argv = sys.argv

if not os.path.isdir(argv[1]):
    os.makedirs(argv[1])


crawler = GoogleImageCrawler(storage = {"root_dir" : argv[1]})
crawler.crawl(keyword = argv[2], max_num = 1000)
```

## 乃木坂の画像を集めた
```
$ python nogizaka.py image/nogizaka 乃木坂46
```

<img width="877" alt="スクリーンショット 2018-11-21 16.52.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/95172/2bc0d016-6e98-7354-bd85-ac7e8afb3ba4.png">

## 他も試した
<img width="967" alt="スクリーンショット 2018-11-21 16.53.35.png" src="https://qiita-image-store.s3.amazonaws.com/0/95172/3bc961b1-3d1c-c05a-41b9-9002710d7c1e.png">


## 次回
集めた画像を使ってDeepLearningモデルを学習させたりできそう。
The answer to "Exercise: Equivalent Binary Trees" in A Tour of Go

https://go-tour-jp.appspot.com/concurrency/8

```go
package main

import (
        "fmt"
        "reflect"
        "sort"

        "golang.org/x/tour/tree"
)

// Walk walks the tree t sending all values
// from the tree to the channel ch.
func Walk(t *tree.Tree, ch chan int) {
        if t == nil {
                return
        } else {
                ch <- t.Value
        }
        Walk(t.Left, ch)
        Walk(t.Right, ch)
}

// Same determines whether the trees
// t1 and t2 contain the same values.
func Same(t1, t2 *tree.Tree) bool {
        n := 10
        a1 := make([]int, n)
        a2 := make([]int, n)

        ch1 := make(chan int, 1)
        go Walk(t1, ch1)
        for i := 0; i < n; i++ {
                a1[i] = <-ch1
        }
        close(ch1)
        ch2 := make(chan int, 1)
        go Walk(t2, ch2)
        for i := 0; i < n; i++ {
                a2[i] = <-ch2
        }
        close(ch2)

        sort.Ints(a1)
        sort.Ints(a2)
        fmt.Println(a1, a2)
        return reflect.DeepEqual(a1, a2)
}

func main() {
        //fmt.Println("%v,%T", argn, argn)
        ch := make(chan int, 1)
        //x, _ := strconv.Atoi(argn)
        x := 1
        go Walk(tree.New(x), ch)
        for i := 0; i < 10; i++ {
                fmt.Println(<-ch)
        }
        fmt.Println(Same(tree.New(1), tree.New(1)))
        fmt.Println(Same(tree.New(1), tree.New(2)))
}
```
```
10
5
3
1
2
4
7
6
9
8
[1 2 3 4 5 6 7 8 9 10] [1 2 3 4 5 6 7 8 9 10]
true
[1 2 3 4 5 6 7 8 9 10] [2 4 6 8 10 12 14 16 18 20]
false
```

# Refs.
* [sort](https://gobyexample.com/sorting)  
https://mattn.kaoriya.net/software/lang/go/20161004092237.htm  
https://golang.org/pkg/sort/  
https://qiita.com/Sekky0905/items/2d5ccd6d076106e9d21c  
* [channel](https://qiita.com/Vermee81/items/30ad42a7265375b1b7b1)  
https://go-tour-jp.appspot.com/concurrency/2
* [append](https://tour.golang.org/moretypes/15)  
* [variable size array initializing](https://stackoverflow.com/questions/38362631/go-error-non-constant-array-bound)
* [Atoi](https://qiita.com/quicksort/items/c9522793a941edf074fd)
* [os.Args](https://gobyexample.com/command-line-arguments)
* [if else](https://qiita.com/high5/items/3fe34d2feeff2c11f5ca)
* https://qiita.com/Blufe/items/1f7efbedf015a5c2ba9b
【TIPS】SQL Server Expressに接続できない

> **Note:** 本記事は、2018年11月時点の内容です。

# 【Q】SQL Server ExpressにLocalからは接続できるが、同一ネットワーク上の別マシンから接続できない。なんで？

* なお、Azure上の仮想マシンにインターネット越しに接続できない方は、↓こちらをおすすめします。

> **Azure での SQL Server 仮想マシンへの接続** 

> * https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/sql/virtual-machines-windows-sql-connect

> **Qiita : 【備忘録】SQLServerの名前付きインスタンスに外から接続したい** 

> * https://qiita.com/tenn25/items/86702e0226d35eb5512e


# 【A】名前付きインスタンスだとポートが1433ではなく、動的ポートになる。それに応じてやることがいくつかあるので注意。

* 名前付きインスタンスでポートを1433に固定することができるが、アクセス時にポート付きでアクセスすることになる

* ポート付きでのアクセスだと困るケースがあり、動的ポートのままポートなしでのアクセスを可能とする手順を以降に紹介する。

* ポイントは、SQL Server Configuration Managerとファイヤーウォール設定。

## 作業の手順
1. 事前設定確認
2. SQL Server Configuration Managerの起動
3. TCP/IPの有効化
4. Firewall設定の変更
5. SQL Server Browserの起動
6. SQL Serverの再起動

### 【手順1】事前設定確認
* `SQL Server Management Studio` にて、以下の設定を済ませておく
    * `SQL Server混合認証モード` に変更
    * `リモート接続を許可する` をONにする

### 【手順2】SQL Server Configuration Managerの起動
* 対象のマシンにログインして、`SQL Server Configuration Manager`を起動する

### 【手順3】TCP/IPの有効化
* SQL Server Configuration ManagerでTCP/IP機能を有効化(Enable)する
    * 左ツリービューで[SQL Server Network Configuration] > [Protocols for XXX]を選択
    * 右の一覧の[TCP/IP]を右クリック。`Enable` を選択

### 【手順4】Firewall設定の変更
* Windows Firewallの詳細設定を開く
    * [コントロールパネル] > [Windows Defender ファイヤーウォール] > [詳細設定]

* SQL Server Expressを許可する設定を行う（動的ポートなので、プログラム指定で行う）
    * `新しい規則` をクリック
    * `プログラム` を選択して、`次へ` を押下
    * `このプログラムのパス` を選択して、`sqlserver.exe` を選択し、（インストールしたパスのbinnを探す）`次へ` を押下
    * `接続を許可する` を選択して、、`次へ` を押下
    * `ドメイン` `プライベート` `パブリック` をチェックして、`次へ` を押下
    * `名前` を入力して、`完了` を押下（名前は、MS_SQLなど任意）
   
* SQL Server Browserを許可する設定を行う（Port1434のUDPを許可する）
    * `新しい規則` をクリック
    * `ポート` を選択して、`次へ` を押下
    * `UDP` を選択して、`特定のローカルポート` に `1434`を入力。`次へ` を押下
    * `接続を許可する` を選択して、、`次へ` を押下
    * `ドメイン` `プライベート` `パブリック` をチェックして、`次へ` を押下
    * `名前` を入力して、`完了` を押下（名前は、MS_SQL_BROWSERなど任意）

### 【手順5】SQL Server Browserの起動
* `SQL Server Configuration Manager`から`SQL Server Browser` が起動していない場合は、起動する

### 【手順6】SQL Serverの再起動
* `SQL Server Configuration Manager`から`SQL Server` を再起動する
C# > ファイル サイズが、許可された制限を超過しているため、保存できません。




System.IO.IOException: ファイル サイズが、許可された制限を超過しているため、保存できません。


処理は以下のような感じ
Sharepoint上のファイル（WebDAV）にアクセスした際に、System.IO.IOExceptionが表示された。


```csharp
// ファイルを読み取りモードで開く
using (var fs = new System.IO.FileStream(fileFullPath, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    // データ格納用の配列を確保する
    result = new byte[fs.Length];

    // バイナリデータを非同期的に読み込む
    await fs.ReadAsync(result, 0, (int)fs.Length);
}
```


↓こちらに記載あり
[Web フォルダーから 50000000 バイトより大きいファイルをダウンロードするときのフォルダーのコピー エラー メッセージ](https://support.microsoft.com/ja-jp/help/900900/folder-copy-error-message-when-downloading-a-file-that-is-larger-than)


## 方法1 レジストリを変更する。

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\WebClient\Parameters

FileSizeLimitInBytesの値を変更する。

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/571e3247-81a6-9e7f-22bb-101ed4541031.png)


## 方法2 Fix itを使う

こっちが簡単
値を入れて次へを押すだけ。

このページの
https://support.microsoft.com/ja-jp/help/900900/folder-copy-error-message-when-downloading-a-file-that-is-larger-than

![image](https://qiita-image-store.s3.amazonaws.com/0/49910/1f24e5a8-e42a-bdac-05c1-65e4837368f8.png)


![image](https://qiita-image-store.s3.amazonaws.com/0/49910/65614778-bdb3-f308-dca0-ace14749f53e.png)


その後、PCを再起動
「地下ホテル」の情報をスクレイピングしてみた！

皆さんは中国・上海市の「地下ホテル」を聞いたことがありますか？

今日、中国・上海市に世界で最も海抜の低い5つ星ホテル「インターコンチネンタル上海ワンダーランド(InterContinental Shanghai Wonderland)」が正式開業しました。このホテルは、2002年まで安山岩の採石場だった場所で、深さ88ｍ、幅280ｍほどの巨大な穴の中に建てられたことから「地下ホテル」や「深い穴のホテル」とも呼ばれています。ホテルは崩れやすく複雑な形をした穴の壁面に建設されたため、構想から完成まで12年かかって、ようやく今年、完成しました。

ソーシャルメディアで大きな話題を集めているこのホテルは今日から宿泊を受け付けますが、初日はすでに予約でいっぱいになっています。宿泊料金は１泊、日本円で6万〜170万円らしいです。
![5587608.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/e8ae228e-023c-12bc-3ad4-11cb3658b348.jpeg)
![微信图片_20181120180753.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/344c7dd3-c8ae-4a10-3e19-8a24cec7877a.jpeg)



開業するに、このホテルの真実はメディアに公開され、世界中の記者たちも惹かれています。日本のメディアが報道した後、多くの日本ネチズンは非常に好評し、一度行きたいと言いました。
![Catch2961.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/fdcaa36c-9267-27e6-3c5e-f5f88735ab4f.jpeg)


今回はちょうど最近[リリースされた新機能](https://www.octoparse.jp/tutorial/whats-new-in-octoparse-71/)：タスクテンプレートを利用して、Twitterから皆さんの「地下ホテル」に対する評価を取得しようと思います。[Octoparse](https://www.octoparse.jp/)の新しいタスクテンプレートは、誰でも簡単にWebスクレイピングを利用できるように設計されています。あらかじめ作成されたタスクテンプレートを使用すると、スクレイピングタスクを設定する必要はありません。すぐに使用できるタスクテンプレートは学習時間を短縮し、すぐにデータを取得できます。

さて、始めましょう！

 

**1.　Task Templatesの下にある「 +Task」をクリックします。**
![图片1.png](https://qiita-image-store.s3.amazonaws.com/0/262932/df8bc3cf-2cdf-daa3-c7f9-84c43b4d8af5.png)



**2.　Social Mediaをクリック、Twitter　→　Tweetsを選択します。それから「Use template」をクリックします。**
![图片1.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/1d4672d5-eaf1-f62a-a83c-ef6d37130abb.jpeg)
 

**3.　キーワード「地下ホテル」を入力します。必要に応じて、Task nameとTask groupを変更できます。**
![图片5.png](https://qiita-image-store.s3.amazonaws.com/0/262932/ef6354e2-97ed-a47e-a872-49f04d30f167.png)


**4.　「Save and run」をクリックして、「Local Extraction」または「Cloud Extraction」（有料版のみ）を選択し、タスクを実行します。**
![图片6.png](https://qiita-image-store.s3.amazonaws.com/0/262932/d6279853-c274-c80b-f6e0-9b3c966d47cb.png)

 

いかがでしょうか？簡単でしょう！タスクテンプレートを使うと、プログラミング知識の少ない/ない人でも簡単にWebスクレイピングを達成できます。パラメータ（ターゲットページのURL、検索キーワードなど）を入力するだけで、データがどんどん抽出されてきます。この時点で、Amazon、Indeed、Instagram、Twitters、YouTube、食べログなどの多くの人気サイトがカバーされています。皆さんも試してみてください。

 
取得したツイートを簡単に分析したところ、だいたい2種類分けられます。一つは「このホテルすごい、行ってみたい！」で、もう一つは「崩れたり、水没したりなどの恐れがあり、行きたくない」です。皆さんはどう思いますか？

ネチズンの評価とは別に、この「地下ホテル」にもっと詳しいために、メディア側の情報をより多く収集しました。ここでは、皆さんに紹介したいと思います。

佘山は中国の国家レベル森林公園で、上海の裏庭とも呼ばれます。風景が美しくて、毎年数多くの観光客が訪ねてきています。しかし、公園の南側にある採石場がどうもしっくりこない気がします。2006年、シマオグループ（Shimao Group）はこの深い穴を改装し、廃棄された採石場に世界初の5つ星ホテルを建設し、この「傷跡」を世界の注目を集める「ダイヤモンド」に変えようとしました。

複雑な地盤のために工事は難航で、完成まで12年かかり、20億元（約３２６億円）を費やし、この超豪華なホテルは完壁に完成されました。中国メディアによると、マグニチュード９規模の地震にも耐えられる構造だということで、アメリカのナショナルジオグラフィックチャンネル「NG Megastructures」による「世界の建築奇跡トップ10」の1つに選ばれました。
![微信图片_20181120180906.jpg](https://qiita-image-store.s3.amazonaws.com/0/262932/3b503b52-0739-f5c3-1516-fd129117a8da.jpeg)



すごいと思わない？もし余裕があれば、一度でも行ってみましょう！
Laravel5.5 FormRequestで配列チェック時にメッセージへ項目番号などを表示させたい場合のやり方

# やりたいこと
LaravelのFormRequestで配列をバリデートするとき。
エラーメッセージに番号をつけたかった！

# 前提
Laravel 5.5
PHP 7.2.9

# 当初の書き方
```php:ルール設定
public function rules()
{
    return [
        'todos.*.title' => 'required',
        'todos.*.body' => 'required'
    ];
}
public function messages()
{
    return [
        'required' => ':attributeは必須です。',
    ];
}
public function attributes()
{
    return [
        'todos.*.title' => 'タイトル',
        'todos.*.body' => '内容'
    ];
}

```

```:POSTする値
todos[0][title] : ''<ブランク>
todos[0][body] : 'TODO内容１'
todos[1][title] : 'TODOタイトル'
todos[1][body] : ''<ブランク>
```
```:表示されるメッセージ
タイトルは必須です。
内容は必須です。
```

どっちのエラーなのか、ぱっと見わからないね！！！

# 対応
ちょっと泥臭い方法ですが。

```php:
public function attributes()
{

    $attributes = [];

    foreach ($this->request->get('todos') as $key => $value){

        $todoNumber = $key + 1;

        $attributes = array_merge(
            $attributes,
            [
                "todos.$key.title" => "TODO No.$todoNumber タイトル",
                "todos.$key.body" => "TODO No.$todoNumber 内容",
            ]
        );
    }

    return $attributes;
}
```

```:表示されるメッセージ
TODO No.1 タイトルは必須です。
TODO No.2 内容は必須です。
```

どっちのエラーなのか、わかりやすくなりましたね！
Facebook Instant Gamesのように子iframeでゲームを再生するには？


**Facebook Instant Games** のように親のページ内に`iframe`で子コンテンツとしてゲームを表示したい

子コンテンツの高さを親側・子側でどう決めるのかを**Facebook Instant Games**のHTMLをみてみる

# ヘッダー

```html
<head>...
<meta name="viewport" content="user-scalable=no,initial-scale=1.0001,maximum-scale=1.0001">
<meta name="referrer" content="default" id="meta_referrer">
<meta name="apple-mobile-web-app-capable" content="yes">
...
</head>
```
## meta name=viewport
viewport は、ビューポートの初期サイズ(モバイル機器のみで使用)

|属性値|意味|
|----|----|
|user-scalable=no|no を設定すると、ユーザーはページのズーム不能に **iOS 10 以降は既定で無視**|
|initial-scale=1.0001|デバイスの幅 (ポートレートモードでの device-width またはランドスケープモードでの device-height) とビューポートの寸法との比率|
|maximum-scale=1.0001|ズームの最大値。**iOS 10 以降は既定で無視**|

引用: https://developer.mozilla.org/ja/docs/Web/HTML/Element/meta

## meta name=referer
この文書からリクエストを送信する場合に HTTP の Referer ヘッダーへ付加する内容を制御
ブラウザーによっては、 referrer に非推奨の値である always, default, never に対応していることがあります。

引用: https://developer.mozilla.org/ja/docs/Web/HTML/Element/meta

## meta name=apple-mobile-web-app-capable

`apple-mobile-web-app-capable=yes`でフルスクリーンモードを指定する。しかし、Webページをホーム画面に追加し、ホーム画面からページを表示させたときのみに機能。

おまけで
`<meta name=”apple-mobile-web-app-status-bar-style”>`は、ホーム画面でのステータスバー(ブラウザーのヘッダではなくiPhoneの時刻表示部分)の表示方法の指定

|指定値|意味|
|----|----|
|default|不透明（デフォルト色）で表示|
|black|不透明（黒）で表示|
|black-translucent|半透明で表示|

引用: https://www.symmetric.co.jp/blog/archives/93


# body
```html
<body tabindex="0" style="min-height: 567px; background-color: rgb(255, 255, 255);">
<div id="viewport" data-kaios-focus-transparent="1" style="min-height: 567px;">
:
<div style="height: 567px;">
:
```

# iframe
```html
<iframe 
class="_6f96" 
allow="autoplay" 
frameborder="0" border="0" cellspacing="0" 
src="https://apps-508237932874005.apps.fbsbx.com/..." 
sandbox="allow-pointer-lock allow-same-origin allow-scripts allow-orientation-lock">
</iframe>
```


## allow =autoplay 属性
iframe の機能ポリシーを指定するために使用

引用: https://developer.mozilla.org/ja/docs/Web/HTTP/Feature_Policy


## sandbox属性
|sandbok属性値|意味|
|----|----|
|allow-pointer-lock|埋め込みの閲覧コンテキストにPointer Lock API の使用を許可|
|allow-same-origin|コンテンツが通常のオリジンを持つとみなします。このキーワードが使われない場合は、埋め込みコンテンツは独自オリジンを持つとみなされます。|
|allow-scripts|埋め込みの閲覧コンテキストにスクリプトの実行を許可します (ただしポップアップウィンドウは作れません)。このキーワードが使われない場合はこの操作は行えません。|
|allow-orientation-lock| 埋め込みの閲覧コンテキストが、スクリーンの向きをロックする機能を無効化することを許可します。|

引用: https://developer.mozilla.org/ja/docs/Web/HTML/Element/iframe

## Pointer Lockとは？

> たとえばブラウザ上の3Dゲームなどでは、マウスがウィンドウの外に出てしまってゲームが続行できなくなることがある。今標準化作業が進められているPointer Lock APIを使うと、デベロッパはマウスの動きをウィンドウの内側に制約できる

引用: https://jp.techcrunch.com/2012/09/26/20120925chrome-pointer-lock-api/

# iframe内のhtml

```html
<head>
<meta name="viewport" content="width=device-width, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
</head>
<body bgcolor="#000000" style="margin : 0px; overflow: hidden;">
<div id="screen" style="margin-left: 0px; margin-top: 18.092px;">
<canvas width="750" height="1248" id="fb_othello" style="display: block; touch-action: none; user-select: none; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); width: 319px; height: 530px;"></canvas>
</div>
:
</body>
```
golangをwinのローカル環境で開発できるようにする

#前提条件
PC Windows10 にインストールする
PCには管理者権限でログインしている

#golangをwinにインストール

###①winにgolangをインストールする
下記URLから Microsoft Windows版を選択する
https://golang.org/dl/
go1.10.windows-amd64.msi （2018年3月時点のver）

動作確認

```
$ go version
go version go1.10 windows/amd6
```

###②ローカル環境に作業スペースを作成
任意のフォルダを作業スペースとして作成

```
C:\Users\CarlosGhosn\workspace\go
```

上記で作成した「go」ディレクトリ内に下記3点フォルダー作成
・bin
・pkg
・src

###③システム環境変数の追加
- 1 winのスタートボタンをクリック　すかさず「contro」と打つとコントロールパネルが表示されるのでクリック
- 2 コントロールパネルから「システム」を選択
- 3 システム詳細設定を選択
- 4 タブの「詳細設定」「環境変数」選択
- 5 システム環境変数に新規追加

```
変数名：GOPATH
値：C:\Users\CarlosGhosn\workspace\go
```
```
確認
　　　 システム環境変数に「GOROOT」が設定されていること
変数名：GOROOT
値：C:\Go\ （①のインストール時に決定している）
```

###④必要なツールのinstall
ディレクトリ「C:\Users\CarlosGhosn\workspace\go」にて下記コマンドを実行する
glide(vendor管理)

```
go get -u github.com/Masterminds/glide
```

go-assets-builder(バイナリ生成ツール)
go get -u github.com/jessevdk/go-assets-builder

goa(フレームワーク)

```
go get -u github.com/goadesign/goa/...
　　　　　　　　　　　　　　　　　　　↑↑...もそのままコピーすること！！
```

```
export $PATH:$GOPATH/bin（.bash_profile　に記述する方法もあり）
```

###⑤Gitからリポジトリ取得
ディレクトリ「C:\Users\CarlosGhosn\workspace\go\src」にて下記コマンドを実行する

```
git clone git@github.com:istyle-inc/content_repository_api.git
```


###⑥glide install でvendor配下に置くパッケージ群を取得
※git clone したリポジトリ配下で実行

```
cd content_repository_api
glide install
```


###⑦make コマンドを使えるようにする
Complete package, except sources を下記から取得

```
http://gnuwin32.sourceforge.net/packages/make.htm
```

ダウンロードしたmake-3.81.exeを、ローカルにインストールする

環境変数 path に下記を追加

```
環境変数：PATH
値：インストール先フォルダ\bin　（だいたい、ProgramFile(x86)にGnuWin32がある。その中にbinがある）
```

###⑧Cloneしたリポジトリをセットアップ
ディレクトリ　「/c/Users/CarlosGhosn/workspaces/go/src/content_repository_api」にて下記コマンドを実行
vender配下に置くパッケージ群を取得

```
glide install
```


環境設定ファイルを作成

```
make confinit
```


環境設定ファイル変更

```
vim config/dev.toml
```
で開いたファイルの下記を自身の使えるポート番号に変更

```
config/.dev.toml
PortNum = 29910
```

ビルド(とか諸々)

```
make all
```

実行

```
make run
```

　　　　以上でGoが動いている状態となります
docker18.09.0にあげたらdocker.serviceが起動しなくなった

# 何が起こったか :writing_hand:
dockerをアップデートし、PCを再起動したらdocker.serviceが立ち上がらなくなった。

```
$ systemctl start docker
```

とコマンドを打つと

```
Failed to load listeners: no sockets found via socket activation: make sure the service was started by systemd
```

とログに吐かれる。

```
$ docker version
```

とコマンドを打つと

```
Client:
 Version:           18.09.0
 API version:       1.39
 Go version:        go1.10.4
 Git commit:        4d60db4
 Built:             Wed Nov  7 00:48:57 2018
 OS/Arch:           linux/amd64
 Experimental:      false
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

と出る。

こだまでしょうか。
docker.sock is 誰:relieved:

# 環境
ubuntu 16.04LTS
dockerの過去バージョン 17.09.1~ce-0~ubuntu→18.03.1-ceっぽい。
ログから探した情報です。

# 解決方法 :relaxed:
まずは即解決したい方向けにどうやって解決させたかを書きます。
以下を参照しました。
https://github.com/docker/for-linux/issues/476#issuecomment-437210470

/etc/systemd/system/docker.service.d/docker.conf以下のファイルに記載されている`-H fd://`を消す

before

```
[Service]
Environment="DOCKER_NETWORK_OPTIONS=--dns XXX.XXX.XXX.XXX"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
```

after

```
[Service]
Environment="DOCKER_NETWORK_OPTIONS=--dns XXX.XXX.XXX.XXX"
ExecStart=
ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS
```

# なぜこんなことが起こったのか :confused:

まず今回起こった事象は、docker.socketが存在しないのに呼び出そうとしていることで起こりました。

socketってなあに？については以下が参考になります。
https://www.slideshare.net/moriwaka/systemd/15

docker.serviceがdocker.socketをlistenするはずが、docker.socketがないからdocker.serviceが起動しないという事態になりました。

## なぜdocker.socketが消えたのか :open_mouth:

docker.socketのパッケージ自体1.12からなくなっていたようですが、それでもうまく動くようになっていたのですね。
[こちら](https://github.com/moby/moby/issues/38119)のissueを見ると、その設定が18.0.9から変わったようです。

docker.socketが存在している時は`-H fd://`でdocker.serviceからdocker.socketを呼び出す設定にしていました。
その後パッケージがなくてもうまく動くようになっていたところが18.0.9ではdocker.socketが存在しないときに`-H fd://`を指定すると怒られるようになってしまった、というわけです。

なお、docker.socketはdocker.sockをうまく扱うために存在していました。

## じゃあみんな起こるの？ :thinking:

[こちら](https://github.com/docker/for-linux/issues/476#issuecomment-437210470)を見ると、
「通常設定ファイルは上書きされるはずだがどこかでユーザーが手を入れているのであればその値は上書きされない」
とあります。
私の環境では/lib以下は最新の設定になっていたのですが、/etc以下に`-H fd://`記述が残っていたので、こちらの設定が優先されてしまいました。
なのでdockerの設定ファイルに手を入れていなければ現象は起こらないはずです。
docker.socketも存在していなければそれを呼び出すこともない、ということですね。

## そして解決方法へ :innocent:

じゃあなぜ`-H fd://`を消してなおったかという話です。
本来18.0.9では`-H fd://`がない状態を想定しており、これがなければdocker.serviceが直接docker.sockを用意する動作をデフォルトとしています。
なので`-H fd://`を消すと解決！！です。

## このあとこの事象はどうなるか :slight_smile:

この`-H fd://`が書かれていると動かないということで沢山の人が困っているのを受け、`-H fd://`が書かれていても動くようにするようです。

[こちら](https://github.com/docker/for-linux/issues/476#issuecomment-440360941)には

"I think the goal is to have a release early/mid december, but there are some issues still being looked into that are desirable for inclusion, so the "safe" answer is "when it's done"."

と書かれています。
12月初～中旬くらいを目指しているけど"safe"な回答は"when it's done"(できたときがそのとき）とのことです。

ご協力いただいた皆様、ありがとうございました！！:laughing:
chrome,chromedriverインストールのItamaeレシピ

VPS上のUbuntuでheadlessのchromeを使うためのインストールレシピ

```chrome_recipe.rb
package 'gdebi'
execute 'install chrome' do
  deb_name = 'google-chrome-stable_current_amd64.deb'
  commands = [
      'cd /tmp',
      "wget https://dl.google.com/linux/direct/#{deb_name}",
      "gdebi --n ./#{deb_name}"
  ]
  command commands.join(' && ')
  not_if 'command -v google-chrome'
end

execute 'install chromedriver' do
  commands = [
      'cd /tmp',
      'wget https://chromedriver.storage.googleapis.com/2.44/chromedriver_linux64.zip',
      'unzip chromedriver_linux64.zip -d /usr/local/bin'
  ]
  command commands.join(' && ')
  not_if 'command -v chromedriver'
end
```

### gist
https://gist.github.com/ironsand/24f83e63d10a499b23fe2c08420a6d7b
【PHP】翌月の課金日を算出

#前提条件
よくコンテンツの定期課金にて、入会日を毎月の決済日とする仕様があります。
15日に入会した場合、その人の課金日は15日という仕様。あるあるです。

では、もちょっと掘り下げてみましょう。

#サンプルストーリー
例）Aさんが2019年1月20日に入会した場合、Aさんの毎月の課金日は20日となります。
ここまではOKですよね。

例）、Bさんが2019年1月31日に入会した場合、Bさんの毎月の課金日は31日ですが
2019年2月31日は存在しない為、Bさんの2月の課金日は28日となります。

当然ですが、仮にうるう年であった場合でも、問題なく算出できる処理を書きます。
年をまたいだ時の処理も考慮します。

#ポイント
ここでのポイントは
月と日を分けて考えることです。

```
public function serviceStartAt()
{
　　//一か月後を算出する
　　// $year = 2018;
　　// $month = 11;
　　// $day = 31;

　　//本日の年月を算出する
　　$year = date('Y', time());
　　$month = date('m', time());
　　$day = date('d', time());

　　//月だけを算出する
　　//月が11のときまで、1を加算する　12のときは1にする
　　if($month == '12'){
　　++$year;
　　$month = 1;
　　}

　　++$month;
　　//実在する年月日かをチェックし、存在しなければ1日づつ減らす
　　$i = $day;
　　while($i <= 31){
　　//実在する日があるかをチェックする
　　$checkDate = checkdate($month, $i, $year);
　　if(!empty($checkDate))
　　break;
　　$i--;
　　}
　　$format = "%s-%s-%s";
　　$oneMonthLater = sprintf($format, $year, $month, $i);

　　return $oneMonthLater;

}
```
xcodebuildでExportしたIPAをApp Store Connectにアップロードする

Xcode10では、`xcodebuild`コマンドでエクスポートしたIPAをApp Store Connectに直接アップロードできます。

## エクスポート用のplistを準備する
エクスポート時の設定を.plistに書き出しておけば、`xcodebuild`の実行時に読み込めます。

`xcodebuild -help`を実行すれば、`Available keys for -exportOptionsPlist:`以下で設定可能な項目・値を確認できます。

今回はApp Store Connectにアップロードするだけの設定を準備します。

```xml:exportOption.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>teamID</key>
        <string>YOUR_TEAM_ID</string>
        <key>method</key>
        <string>app-store</string>
        <key>destination</key>
        <string>upload</string>
    </dict>
</plist>
```

## .archiveの作成とエクスポートの実行
`exportOption.plist`の作成が終わったら、`xcodebuild`で.archiveを作成してエクスポートしましょう。


```zsh:.archiveの作成とexportの実行
$ xcodebuild -project YOUR_PROJECT.xcodeproj -scheme YOUR_SCHEME -configuration YOUR_CONFIGURATION archive -archivePath PATH_TO_ARCHIVE_FILE
note: Using new build system
2018-11-21 13:38:09.157 xcodebuild[11213:208140]  DTDeviceKit: deviceType from a36e24c26102017fd3d4ef01600f87d5659c1866 was NULL
2018-11-21 13:38:09.178 xcodebuild[11213:208133]  DTDeviceKit: deviceType from 0f40ac13860c8fd55912060619991b13575f2615 was NULL
2018-11-21 13:38:09.188 xcodebuild[11213:208179]  DTDeviceKit: deviceType from 7a8a7db4a9c163c0d5a13d2a6d978ff115c2f233 was NULL
note: Planning build
note: Constructing build description

// 中略

** ARCHIVE SUCCEEDED **
 
$ xcodebuild -exportArchive -archivePath PATH_TO_ARCHIVE_FILE -exportPath PATH_TO_EXPORT_DIR -exportOptionsPlist exportOption.plist -allowProvisioningUpdates
2018-11-21 14:26:44.527 xcodebuild[27596:282693] [MT] IDEDistribution: -[IDEDistributionLogging _createLoggingBundleAtPath:]: Created bundle at path ''.
2018-11-21 14:27:56.959 xcodebuild[27596:282871] Starting upload
2018-11-21 14:27:57.064 xcodebuild[27596:282871] Progress 2%: Extracting archive...
2018-11-21 14:28:00.832 xcodebuild[27596:282871] Progress 4%: Creating App Store Connect API analysis file…

/// 中略

Uploaded HOGE
** EXPORT SUCCEEDED **
```
setTimeoutで引数を与える簡単な方法

setTimeout関数で引数を与える方法についてのシンプルなメモです。
MDNに載っている通り第３引数以降を使えばおｋ。
ちなみにsetInterval も同じ感覚で使えます。

## 構文
```javascript
var timeoutID = scope.setTimeout(function[, delay, param1, param2, ...]);
var timeoutID = scope.setTimeout(function[, delay]);
var timeoutID = scope.setTimeout(code[, delay]);
```

## 例文
```javascript
    setTimeout(function(val){
      console.log(val);
    },1000,"test");
```

## 実行結果(1000ms後)
```
test
```

## 参考資料
WindowOrWorkerGlobalScope.setTimeout() - Web API | MDN
https://developer.mozilla.org/ja/docs/Web/API/WindowTimers/setTimeout

setTimeout、setIntervalでコールバックに引数を渡したい！ - Qiita
https://qiita.com/yanyan_ys/items/6cd0f12b7084eb86a8bc

setInterval()やsetTimeout()で関数に引数を与えるには - Qiita
https://qiita.com/kouhe1/items/9c23604901039832d385
Macでコマンドラインからターミナルを開く方法

## やりたいこと

macOSでコマンドを打って、ターミナルを立ち上げたいです。

## モチベーション

IntelliJとかPyCharmとかVSCodeとかに付属しているターミナルだと、純正と挙動が違うことがあります。そこで純正のターミナルを開きたくなったときに、この方法が欲しくなりました。


## やりかた

以下の方法で、`pwd`の場所で新しいターミナルが開けます。

```
open -a Terminal .
```

より一般的にするなら、以下のになります。

```
open -a Terminal 任意のパス名
```


## おまけ

ただのエイリアスです。

```
alias terminal="open -a Terminal"
```
【TIPS】Azureで仮想マシンの仮想ネットワークを変更したい

> **Note:** 本記事は、2018年11月時点の内容です。

# 【Q】Azureの仮想マシンを別の仮想ネットワークに変更（移動）したい。どうしたらよい？



# 【A】いくつかやり方があるが、仮想マシン再作成が手っ取り早そう。

* ↓こんな丁寧な記事があるが、インフラ屋さんでないと、なにぶん分かり辛い。。。

> **利用中の Azure 仮想ネットワークを変更する** 

> * https://blogs.msdn.microsoft.com/ainaba-csa/2017/06/16/change-azure-vnet-configuration/

* 仮想ネットワークを変更するというのが王道のようだが、分かりづらい。

* 手っ取り早くやるには、仮想マシンを一度消して再作成。OSディスクを再マウントする。

> **PowerShell を使用して Azure VM で使用される OS ディスクを変更する** 

> * https://docs.microsoft.com/ja-jp/azure/virtual-machines/windows/os-disk-swap


* 以下手順は、自己責任でお願いします（くれぐれも間違ってディスクは消さないようにご注意ください。）

## 作業の手順
1. 仮想マシンの削除
2. 仮想マシンの新規作成
3. Azure Cloud Shellの起動
4. OSディスク名の確認
5. Powershellコマンドの実行

### 【手順1】仮想マシンの削除
* 対象の**仮想マシンのみ**削除する。（ディスクは消さない。）

### 【手順2】仮想マシンの新規作成
* 仮想マシンを作成する
* ネットワークは、変更したい先の仮想ネットワークを選択して作成する
* ディスクも元のOSディスクを指定したいところだができない。この時点では、デフォルトで作っておき、この後の手順で変更する。

### 【手順3】Azure Cloud Shellの起動
* AzureポータルからAzure Cloud Shellを起動する

> **Azure Cloud Shell の PowerShell のクイックスタート** 

> * https://docs.microsoft.com/ja-jp/azure/cloud-shell/quickstart-powershell


### 【手順4】OSディスク名の確認
* AzureポータルからOSディスク名を確認しておく

### 【手順5】Powershellコマンドの実行
* 以下コマンドを順に実行

> **Note:**
> 以下手順では、`<myResourceGroup>` を使用するリソースグループ名に、
> `<newDisk>` を使用するOSディスク（付け替えたい元のディスク）に置き換えてください。


* VMの取得

```powershell
# Get the VM 
$vm = Get-AzureRmVM -ResourceGroupName <myResourceGroup> -Name myVM 
```

* VMの停止（すでに停止している場合はスキップ）

```powershell
# Make sure the VM is stopped\deallocated
Stop-AzureRmVM -ResourceGroupName <myResourceGroup> -Name $vm.Name -Force
```

* OSディスク情報の取得と設定

```powershell
# Get the new disk that you want to swap in
$disk = Get-AzureRmDisk -ResourceGroupName <myResourceGroup> -Name <newDisk>

# Set the VM configuration to point to the new disk  
Set-AzureRmVMOSDisk -VM $vm -ManagedDiskId $disk.Id -Name $disk.Name 

# Update the VM with the new OS disk
Update-AzureRmVM -ResourceGroupName <myResourceGroup> -VM $vm 
```

* VMの起動

```powershell
# Start the VM
Start-AzureRmVM -Name $vm.Name -ResourceGroupName <myResourceGroup>
```
pip install neovim しても「ERROR: Neovim Python client is not installed.」と怒られる場合

2018/11/18 の neovim アップデートによって pip の neovim というパッケージが使えなくなりました。
というか、リネームされて pynvim というパッケージに変わりました。
参考: https://github.com/neovim/neovim/wiki/Following-HEAD#20181118

今までは正常に動いていた neovim を起動させるとこんなエラーが出るようになります。

### :checkhealth の結果
```
## Python 3 provider (optional)
  - INFO: Using: g:python3_host_prog = "/usr/local/bin/python3"
  - INFO: Executable: /usr/local/bin/python3
  - ERROR: Command error (job=7): `'/usr/local/bin/python3' -c 'import sys; sys.path.remove(""); import neovim; print(neovim.__file__)'` (in '/Users/bruce/work/encoding-service')
    Output: Traceback (most recent call last):  File "<string>", line 1, in <module>ModuleNotFoundError: No module named 'neovim'
  - INFO: Python3 version: 3.7.1
  - INFO: python3-neovim version: unable to load neovim Python module
  - ERROR: Neovim Python client is not installed.
    Error: unable to load neovim Python module
    - ADVICE:
      - Run in shell: pip3 install neovim
```

### 対処法
neovim を uninstall して pyneovim を install しましょう。

```
pip uninstall neovim
pip uninstall pynvim # only if you tried to upgrade already and it failed
pip install pynvim
```

これでもダメな場合は `pip install -U pynvim` とかやるといいかもしれません。

### 結果
うまくいったようです。

```
## Python 3 provider (optional)
  - INFO: pyenv: /Users/mshibata/.pyenv/libexec/pyenv
  - INFO: pyenv root: /Users/mshibata/.pyenv
  - INFO: Using: g:python3_host_prog = "/Users/mshibata/.pyenv/shims/python3"
  - INFO: Executable: /Users/mshibata/.pyenv/shims/python3
  - INFO: Python3 version: 3.7.1
  - INFO: python3-neovim version: 0.3.1
  - OK: Latest python3-neovim is installed: 0.3.1
```
メモ : PostgreSQL の トリガー確認

MySQLの `SHOW triggers` とかにあたるクエリを忘れがちなので。

- トリガーリスト表示

```
SELECT * 
FROM information_schema.triggers
```

- トリガーに紐づく関数/プロシージャの確認

```
SELECT tgname, proname 
FROM pg_trigger t, pg_proc f 
WHERE t.tgfoid = f.oid 
AND tgname = トリガー名
```

- pronameの内容確認

```
SELECT prosrc 
FROM pg_proc 
WHERE proname = 関数名
```
centos7のisoをマウントして、yumを使えるようにする

■色々な現場に行くと、当然ですがサーバが外のネットワークにつながっておらず、
 yumインストールできないことがあります。

その際にcentos7のisoをマウントして、yumを使えるようにしました。
環境
・Esxi6.5
・centos7

①まず、Esxi6.5上で、centos7のisoを接続させる。
　対象サーバで右クリック→仮想ハードウェアのCD/DVDドライブを接続中にする。
　CD/DVDメディアをcentos7のisoを参照させる。
　完了後、OKを選択する。

②対象サーバにteratermから入り、以下のコマンドを入力する
　/mediaがあるか確認する　
　ls -l /media 
　/mediaにマウントさせる
　mount /dev/cdrom /media
※mount: /dev/sr0 is write-protected, mounting read-onlyが表示させると思う

③df -hコマンドをたたくと、以下のようにマウントされている
ファイルシス　サイズ　使用　残り　使用%　マウント位置
/dev/sr0 　　4.2G 　4.2G 　0 　100% 　/media

④ls -l /mediaでファイルが見えていればOK

⑤vi /etc/yum.repos.d/media_default.repoでファイルを新規作成し、以下を入力する
【media_default】
baseurl=file:///media
gpgcheck=0
enabled=0

⑥yum --disablerepo=\* --enablerepo=media_default list でリストが表示されることを確認する
※【media_default】←名称を指定したらこの名称を指定してあげる。
media_default list

⑦⑥がうまくいけば、こちらでインストール
yum --disablerepo=\* --enablerepo=media_default install -y bind bind-chroot

これでうまくいきます。
せっかくなのでjsのthisについて超ざっくりとメモとサンプルコード

```javascript
// jsのthisは、関数自身が所属しているオブジェクトへの参照
// jsのthisは、関数自身が所属しているオブジェクトがない場合は、windowへの参照になる
// allow関数のthisは定義された関数内のthisへの参照を持つ

const a = {
	hoge() {
		function fuga() {
			console.log(3, this) // 3 Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
		}
		console.log(2, this) // 2 {hoge: ƒ}
		console.log(fuga())
	}
}
console.log(1, a) // 1 {hoge: ƒ}
a.hoge()

function b() {
	console.log('b', this)
	const fuga = () => this
	console.log('allow', fuga())
	// 'allow'と'b'のthisは同じ
}
b() // b Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
const c = { b }
console.log(c) // {b: ƒ}
c.b() // b {b: ƒ}

const d = () => {
	console.log('d', this) // d Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
}
d()
const e = { d }
console.log(e) // {d: ƒ}
e.d() // Window {postMessage: ƒ, blur: ƒ, focus: ƒ, close: ƒ, parent: Window, …}
```
curlを連続で叩くperlスクリプト

なにかとAPIの使用回数チェックや負荷テストの攻撃したい時に毎回ちょっと忘れるのでメモ。
301回実行の場合

```test.pl

#!/usr/bin/perl                                                           
                                                                          
for ( 0..300 ) {                                                          
  system "curl <ここにURL>";
}                                                                         
                                                                          
1;                                                                        
```

```
$ perl test.pl

# URL叩いたレスポンスが返ってくる
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">                                
<html><head>                                                                                   
<title>302 Found</title>                                                                       
</head><body>                                                                                  
<h1>Found</h1>                                                                                 
</body></html>                                                                                 
```

### メモ

`#!/usr/bin/perl` は環境によって違うので適宜書き換え。
どこにperlがいるかは、 `whereis perl` で探せる。

```
$ whereis perl
perl: /usr/bin/perl /usr/share/man/man1/perl.1.gz
```
Docker RegistryをCLIから操作できるregがとても便利だった

regとは、Docker Registry v2のCLIクライアントで、リポジトリの一覧や削除ができる。このツールにはWebサーバもついていて、GUIでレジストリを見ることもできる。あと、セキュリティ診断もついていて、イメージの脆弱性を調べることもできる。

## regをインストールする

```
go get github.com/genuinetools/reg
```

## regの使い方

```
reg -  Docker registry v2 client.

Usage: reg <command>

Flags:

  --auth-url           alternate URL for registry authentication (ex. auth.docker.io) (default: <none>)
  -d                   enable debug logging (default: false)
  -f, --force-non-ssl  force allow use of non-ssl (default: false)
  -k, --insecure       do not verify tls certificates (default: false)
  -p, --password       password for the registry (default: <none>)
  --skip-ping          skip pinging the registry while establishing connection (default: false)
  --timeout            timeout for HTTP requests (default: 1m0s)
  -u, --username       username for the registry (default: <none>)

Commands:

  digest    Get the digest for a repository.
  layer     Download a layer for a repository.
  ls        List all repositories.
  manifest  Get the json manifest for a repository.
  rm        Delete a specific reference of a repository.
  server    Run a static UI server for a registry.
  tags      Get the tags for a repository.
  vulns     Get a vulnerability report for a repository from a CoreOS Clair server.
  version   Show the version information.
```

## レポジトリ一覧を表示する

`reg ls レジストリのアドレス`でリポジトリを一覧できる。

```
$ reg ls registry.example.com
Repositories for registry.example.com
REPO                TAGS
php                 7.0, 7.1, 7.2
```

## タグ一覧を表示する

`reg tags レジストリのアドレス/リポジトリ`でタグの一覧を表示できる。

```
$ reg tags registry.example.com/php
7.0
7.1
7.2
```

## イメージを削除する

`reg rm レジストリのアドレス/リポジトリ:タグ`でイメージを削除できる。ちなみに、削除できるようにするには、[Docker Registryの設定で削除を許可](https://docs.docker.com/registry/configuration/#delete)しておかなければならない。

```
reg rm registry.example.com/php:7.0
```

## GUIを立ち上げる

`reg server -r レジストリのアドレス`でGUIを立ち上げることができる。

```
reg server -r registry.example.com
```

<img width="883" alt="registry_alis_cloud.png" src="https://qiita-image-store.s3.amazonaws.com/0/889/57320b79-83bd-e483-af50-18fe53de2aa8.png">
"Python(Xlwings)を使ってExcelを操作してみる"を読んで

https://qiita.com/katzhide/items/60d0336b322105bf8fe9

https://www.jibunkijyun.net/entry/2016/06/03/192654

Excel VBAからPythonを起動したい私にとってこの二つの記事は
とても参考になったのだが、記事の通りにやっても下記のエラーがでてうまくいかず、少々時間を食ってしまった。

```error
---------------------------
Error
---------------------------
Traceback (most recent call last):

  File "<string>", line 1, in <module>

  File "c:\python\VBA_Test.py", line 1, in <module>

    from xlwings import Workbook, Range

ImportError: cannot import name 'Workbook' from 'xlwings' (C:\Program Files\Python37\lib\site-packages\xlwings\__init__.py)



Press Ctrl+C to copy this message to the clipboard.
---------------------------
OK   
---------------------------

```


初めて書いた記事に見る人がいるとは思わんが
解決方法を備忘録として書いておく。

http://docs.xlwings.org/en/stable/migrate_to_0.9.html#cheat-sheet
![sample.PNG](https://qiita-image-store.s3.amazonaws.com/0/315749/724753f5-f261-d5f9-b974-a316cb7b4778.png)

書き方が単純に変わっていたのである。
・WorkbookをBookに置換
これで私は解決した。
KinesisFirehose経由でElasticsearch@AWSに入力された緯度経度の値をgeo_point型として扱うには


問題
---

KinesisFirehose経由でElasticsearchにデータを流す際にindex rotationの設定を行った場合、
指定したindex名にsuffixとして`hogehoge-2018-11-01` といったindex名が自動で作られていく。

<img width="1125" alt="スクリーンショット 2018-11-21 10.41.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/18331/8707053c-b9aa-3936-70db-3666f2e33dec.png">

このときtypeがなければ作られるのだが、KinesisFirehoseから挿入されるデータが下記のようなgeo_pointの形式をちゃんと守っている場合でも

```
  "location": { 
    "lat": 41.12,
    "lon": -71.34
  }
```

kinesisFirehoseが自動でtypeを作ってしまうと、下記のような残念なmappingがされてしまう。

```
"location": {
  "properties": {
    "lat": {
      "type": "float"
    },
    "lon": {
      "type": "float"
    }
 }
},
```

理想形は下記。

```
"location": {
  "type": "geo_point"
},
```


対応方法
---

ElasticsearchのTemplate機能を使う。
https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-templates.html

結局手動かよ！と思ってしまったが、Kibanaの可視化で緯度経度として扱えるのはメリットなので我慢

下記のようなjsonを用意して、

template.json

```
{
    "index_patterns": ["hogehoge-*"],
    "mappings": {
        "hogehoge_mapping": {
            "properties": {
                "location": {
                    "type": "geo_point"
                }
            }
        }
    }
}

```

ESのendpointに対し、template作成リクエストを行う。

```
curl -XPUT -H "Content-Type: application/json" 'https://your-domain.ap-northeast-1.es.amazonaws.com/_template/my_template' -d @temlate.json
```
JavaScriptでのクロージャのメモ

今作ろうとしているhtmlワンページミニゲームの課題がクロージャで解決できそうな気がするんだけど、何度見てもややこしいので基本のおさらい。
なお既にあるミニゲームは以下です。
[gitHub - games](https://github.com/simarei/games)

- マインスイーパ
- ライフゲーム

（ライフゲームが何なのかについては[Wikipedia](https://ja.wikipedia.org/wiki/%E3%83%A9%E3%82%A4%E3%83%95%E3%82%B2%E3%83%BC%E3%83%A0)参照）

# サンプルと動きを見た方が早いと思います

```javascript
function outerFunc() {
  // クローズされる変数
  var x = 1;

  // 無名関数
  return function() {
    alert (x);
    x+=1;
  }
}

function main() {
 var f = outerFunc();  
  f();    
  f(); 
  f();
}
```

mainを呼んだ場合の実行結果（アラートが三回、一回毎に以下が出る）

```
1
2
3
```

# どういうことなの

- mainでは、outerFunc関数内で定義された無名関数が変数fに代入され、f()で呼び出される。
※JavaScriptでは関数もオブジェクトなので変数に代入できます
- 無名関数はxをクローズ（閉じ込め）している。xは本来outerFunc関数の外（ここではmain関数）からは参照できないが、無名関数を呼び出すことでその中のx呼び出し（alert）をキックできる。**ここまではいい。**
- 問題なのは**無名関数の中でやってるxへのインクリメントが、再呼び出しされてもリセットされていない**こと。
- これがクロージャのキモ。変数の解決を、実行時ではなく**定義時のコンテクストで静的に**行う。
- mainというコンテクストで毎回outerFuncが実行されるわけではなく、**静的な変数xが毎回無名関数に呼び出されている**。
- 何を言ってるかわからねーと思うが私も正直直感的には理解できない。気持ち悪い

# 使いどころって？

一回しか押させたくないボタンのプッシュカウントなど、ページがリロードされない限りは保っておきたい変数をいじるのにはいいようです。
グローバル変数を定義するのとどう違うのかは…ページロード時ではなく呼び出し時（つまり任意のタイミング）で初期化できるってところ…かな…？

# こんなこともできるよ

上記でいうouterFunc関数や、その中の無名関数に引数を渡すこともできる。

```javascript
function outerFunc(foo) {
  return function(bar) = {alert(foo + (bar*2));};
}
```

こいつの呼び出し方ごとの結果は以下のような感じになる。

```javascript
var f = outerFunc(3);
alert(f(5));  // 13と出る（fooが3、barが5）

var f2 = outerFunc(4);
alert(f(7));  // 18と出る
```

この無名関数の中でまたfooをいじって再呼び出ししたらどうなるのか（予測通り静的変数として扱われるのか）は後ほど確認して更新します。
やー、ややこしい。
基本情報技術者試験の合格体験記


10月に基本情報技術者試験(FE)を受けてきました。
さきほど合格発表があったので、記念に合格体験記を投稿します。

# なぜ受けたか
- 文系にも理系にもどっちつかずな感じで生きている情報系の大学３年生です。最近はネイティブアプリのフロントを書いたり、webサイト作ったり、なんとなく機械学習に手を出したりしています。
- 情報技術を広範囲に勉強するきっかけになるかなと思ったのと、就活のESにも書けたら嬉しいなと思い、研究室の人と一緒に受験を申し込みました。
- 【追記】↑通信系の技術職に決まりました。就活でも役立ったかな…！？と思っています。

# 勉強スケジュール
**<9月5日~9月14日>　勉強時間：10時間**
「やばい、あと1ヶ月半しかない」ということに気付き、勉強を始める。
[『基本情報技術者合格教本』](https://www.amazon.co.jp/%E5%B9%B3%E6%88%9030%E5%B9%B4%E5%BA%A6%E3%80%90%E6%98%A5%E6%9C%9F%E3%80%91%E3%80%90%E7%A7%8B%E6%9C%9F%E3%80%91-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E8%A7%92%E8%B0%B7/dp/4774193143/ref=sr_1_1?s=books&ie=UTF8&qid=1542776693&sr=1-1&keywords=%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85+%E5%90%88%E6%A0%BC%E6%95%99%E6%9C%AC)の基礎理論からノートにまとめた。
しかし最初の5日間ほどで勢いは衰え、結局10日間かけて基礎理論をまとめるので精一杯。アルゴリズムは教本を読んだだけではよく分からず、すっ飛ばす。

**<9月15日~23日>　勉強時間：10時間**
気分を変え、マネジメント系を勉強。用語を覚えるのに時間がかかった。SOAとかEAとか、アルファベットだけで覚えるのではなく、正式名称で覚えたほうがイメージにつながりやすい。大学始業前でばたばたし、この週もあまりちゃんと勉強できず。

**<9月24日~10月8日> 勉強時間：20時間**
「このペースだと終わらんくね？」と思ったので、勉強方法を再検討。
新しい教本 [『キタミ式 基本情報技術者』](https://www.amazon.co.jp/%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88IT%E5%A1%BE-%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85-%E5%B9%B3%E6%88%9030%E5%B9%B4%E5%BA%A6-%E6%83%85%E5%A0%B1%E5%87%A6%E7%90%86%E6%8A%80%E8%A1%93%E8%80%85%E8%A9%A6%E9%A8%93-%E3%81%8D%E3%81%9F%E3%81%BF%E3%82%8A%E3%82%85%E3%81%86%E3%81%98/dp/4774193496/ref=sr_1_1?ie=UTF8&qid=1542776437&sr=8-1&keywords=%E3%82%AD%E3%82%BF%E3%83%9F%E5%BC%8F%E3%82%A4%E3%83%A9%E3%82%B9%E3%83%88it%E5%A1%BE+%E5%9F%BA%E6%9C%AC%E6%83%85%E5%A0%B1%E6%8A%80%E8%A1%93%E8%80%85)を購入。イラスト＆わかり易い説明ですらすらと読み進めることができ、2週間で午前のすべての単元の勉強を終わらせた。
**キタミ式でふわっと理解する→合格教本で足りていない知識の補填をする→教本に載っている過去問を解いて確認、という流れが良かった。**

**<10月9日~15日> 勉強時間：15時間**
過去問に着手。H30春の午前を解いたら80点ほど取れてしまい、調子に乗る。
間違えたところはノートにまとめ、二度と間違えないようにする。
午前の過去問は5回分ほど解いた。

**<10月16日~17日> 勉強時間：8時間**
午後の過去問を解いてみて、嫌な汗を書く。午後試験を完全に舐めていた。
特に必須のアルゴリズムと選択式のプログラミング言語のやばさに気づく。
慌ててJavaを2日で勉強したが、問題が全然解けず絶望的な気持ちに。

**<10月19日> 勉強時間：4時間**
Javaを諦め、簡単そう(※イメージ)な表計算に方向転換。
午後の過去問も4年分解いたのでだいぶ自信がつく。

**<試験前日> 勉強時間：？**
合格教本と過去問の解説をだらだら読みながら体調を整える。
まず起床情報技術者試験に合格しないといけないので、0時前には就寝。

# 結果
<img width="477" alt="6ll0r6DfFq78DAx1542775934_1542776039.png" src="https://qiita-image-store.s3.amazonaws.com/0/204818/33d1c712-0bc4-4995-b58f-db4f5e720ad2.png">

**合格しました！**
しっかりと勉強した成果を出せたので、とても嬉しいです。
午前のほうはあと１問できていたら上位100人だった・・・惜しい！
次は応用情報技術者試験も受けてみようと思います。
Oculus Goに固定IPを設定する

## 手順
1. Oculus Goを立ち上げる
2. ホームの設定からwifiを選択
3. 接続中のネットワークアダプターにカーソルを当てる
4. タッチパッドを長押しでクリックする
5. ネットワーク削除 ・ 変更の項目が現れるので、変更をクリック
6. DHCP or 固定IPの設定をする
Windowsのロック画面の画像を取得

Windowsを使っていて、ロック画面の画像が気に入ったのでそれを保存する方法を探していました。
すると以下のサイトさんにたどり着き、ロック画面の画像が入ったフォルダを見つけられました。

[Windows 10のロック画面に表示される「気に入りましたか？」の写真を保存する](https://dekiru.net/article/14136/)

簡単にまとめると、

1. Win-Rを押す
2. これをコピペする
```
%LOCALAPPDATA%\Packages\Microsoft.Windows.ContentDeliveryManager_cw5n1h2txyewy\LocalState\Assets
```
3. ファイルがいっぱい入ったフォルダが出てくる

といった感じ。しかし、フォルダ内には拡張子の付いていないファイルが沢山あり、どれがどれだかよくわからない状況に。
リネームして、ファイル名の最後に ".png" をつければいいらしいけど、そもそも多すぎてどれをリネームしたらいいのかもわからない・・・
<img width="492" alt="c4763523cdc2bf42436d0ab026209847.png" src="https://qiita-image-store.s3.amazonaws.com/0/282139/11851d5a-9347-3bb6-894e-4cfcb1d4df36.png">

それじゃあ全部リネームしてしまえ！ということで、pythonでフォルダ内のファイル全てに ".png" をつけるというスクリプトを実装をしてみました。
フォルダの階層は以下のようになっていることが前提です。

```
何かしらのフォルダ
　├ rename.py
　└ リネームしたい全ファイルが入っているフォルダ
　 　└ リネームしたい全ファイル
```

rename.pyの中身は以下の通り↓

```rename.py
import os
import glob

# ファイルを取得する
list = glob.glob("./リネームしたい全ファイルが入っているフォルダ/*")
 
# ファイル名を一括で変更する
for i, file in enumerate(list):
  os.rename(file, './リネームしたい全ファイルが入っているフォルダ/' + str(i) + '.png')
```

今回は0からの番号を順にファイル名にしていってます。
また ".png" の部分はお好きな拡張子に変えください。

rename.pyを実行すると・・・

<img width="817" alt="8c38815d3fd02b377413d184b6596c5d.jpg" src="https://qiita-image-store.s3.amazonaws.com/0/282139/864927cc-ce1f-373e-8ef9-c3873126c24e.jpeg">

無事全てのファイルを画像に変換できました！
あとはお好きな画像を取得して終わりです。
![16.png](https://qiita-image-store.s3.amazonaws.com/0/282139/9acf49ae-9dbc-b362-a522-30f2a88f2e21.png)
きれいや～