OmniAICreator/Qiita-1.07M huggingface dataset:
FileMakerで動的値一覧

#FileMakerで動的値一覧を作る
下記公式サイトにも記載があります。
https://support.filemaker.com/s/answerview?language=ja&anum=11960

今回は、動的値一覧を使って
・選択2の内容を選択1によって絞り込み
・選択3の内容を選択2によって絞り込み
この2つを説明いたします。

##メインのテーブルとレイアウト
メインのテーブルとレイアウトを用意します。
![q001.png](https://qiita-image-store.s3.amazonaws.com/0/235280/6eabeb70-c154-baf9-553a-1ece70c8b0a8.png)
テーブル名とレイアウト名は、「test001」
フィールド名は、「選択1」「選択2」「選択3」の３つ
タイプは全て「テキスト」

入力画面となるので、レコードを1つ作っておきます。

##値一覧用テーブル
次に、値一覧用のテーブルを用意して行きましょう。
###値一覧用テーブル1
![q002.png](https://qiita-image-store.s3.amazonaws.com/0/235280/578d17e2-2a2d-f6e4-2aee-59d8dc03a5e5.png)

テーブル名とレイアウト名は、「valueList」
フィールド名は「ID_VL1」「value」
タイプは「数字」「テキスト」

###値一覧用テーブル2
![q003.png](https://qiita-image-store.s3.amazonaws.com/0/235280/5c956df3-2ee1-56d9-c695-3e9f731f7ed9.png)
テーブル名とレイアウト名は、「valueList2」
フィールド名は「ID_VL1」「value2」
タイプは「数字」「テキスト」

###値一覧用テーブル3
![q004.png](https://qiita-image-store.s3.amazonaws.com/0/235280/7dcbc724-7584-893d-a0f1-ab665f7a5f62.png)
テーブル名とレイアウト名は、「valueList3」
フィールド名は「value2」「value3」
タイプは全て「テキスト」

以上でテーブルとレイアウトの用意は、終了です。
値一覧用のデータは、画像を参考に入力してみてください。

##リレーションの設定
###選択2用の動的値一覧用のリレーション
リレーションを設定して行きます。
![q005.png](https://qiita-image-store.s3.amazonaws.com/0/235280/84e56928-c070-3bc5-fea8-fc3bdc2a8893.png)
オカレンス（テーブルオカレンス）「test001」の「選択1」とオカレンス「valueList」の「value」
オカレンス「valueList」の「ID_VL1」とオカレンス「valueList2」の「ID_VL1」
それぞれに「＝」でリレーションを設定します。

この段階で、選択2用の動的値一覧は作成可能なのですが、
選択3用の動的一覧用リレーションの設定も終わらせたいと思います。
###選択3用の動的値一覧用のリレーション
オカレンス「valueList2」を複製
![q007.png](https://qiita-image-store.s3.amazonaws.com/0/235280/6654b19d-6456-c590-3e04-9941183c8d3b.png)
オカレンス「valueList2」を選択後、「選択したオブジェクトを複製」ボタンを押下してください。

オカレンス「valueList2 2」が画像の様に作成されます。

続いて、選択3用の動的一覧用のリレーションを設定します。
![q008.png](https://qiita-image-store.s3.amazonaws.com/0/235280/5d11bb3f-7ce1-8e5f-0a78-d923eeb0b62e.png)
オカレンス「test001」の「選択2」とオカレンス「valueList2 2」の「value2」
オカレンス「valueList2 2」の「value2」とオカレンス「valueList3」の「value2」
それぞれに「＝」でリレーションを設定します。

以上で、準備は終了となります。
本題の値一覧を作成し、設定して行きましょう。
##値一覧の設定
![q009.png](https://qiita-image-store.s3.amazonaws.com/0/235280/6c72ac8b-3d4d-7281-28d0-73bba5893ffb.png)

フィールド名「選択1」を選択し、インスペクタのデータタブ内にある、コントロールスタイルにて、
ドロップダウンリストを選択し、値一覧の新規作成を行います。
1.値一覧名「値一覧」、フィールドの値を使用。
2.最初のフィールの値を使用から、「valueList」を選択。
3.フィールド「value」を選択し、「OK」を押下。

![q010.png](https://qiita-image-store.s3.amazonaws.com/0/235280/1b09a576-278e-68b2-83fe-6bdb9ab0830f.png)

フィールド名「選択2」を選択し、インスペクタのデータタブ内にある、コントロールスタイルにて、
ドロップダウンリストを選択し、値一覧の新規作成を行います。
1.値一覧名「値一覧2」、フィールドの値を使用。
2.最初のフィールドの値を使用から、「valueList2」を選択。
3.フィールド「value」を選択。
4.「次のテーブルから関連レコードの値のみ含める」に変更し、「valueList」を選択、「OK」を押下。

![q011.png](https://qiita-image-store.s3.amazonaws.com/0/235280/9b90a36d-600d-9ba7-2362-70add4576577.png)

フィールド名「選択3」を選択し、インスペクタのデータタブ内にある、コントロールスタイルにて、
ドロップダウンリストを選択し、値一覧の新規作成を行います。
1.値一覧名「値一覧3」、フィールドの値を使用。
2.最初のフィールの値を使用から、「valueList3」を選択。
3.フィールド「value3」を選択。
4.「次のテーブルから関連レコードの値のみ含める」に変更し、「**valueList2 2**」を選択、「OK」を押下。

以上で完成です。

![q012.png](https://qiita-image-store.s3.amazonaws.com/0/235280/118a9c15-381f-3af9-5cc7-7c0ce40797d3.png)
実際に「選択1」「選択2」「選択3」の動きを確認してみてください。


##最後に
今回は値一覧の絞り込みの動きとリレーション設定の紹介を行いました。
また、今回は説明の為に全て別テーブルの値を用いていますが、
「IDを元に紐付けするパターン」と、「名称を元に紐付けするパターン」に分けました。

以上です。
EVMのstorage,memory,stack

EVMにはアイテムを収納する領域が3つある。

##storage
すべてのコントラクト変数が存在する。すべてのコントラクトは自らのstorageを持ち、関数の呼び出し間で永続的である。構造体や配列を呼び出した関数内で変更する場合storageにしないと変更が反映されない。

##memory
一時的な値を保持するために使用される、（外部の）関数呼び出し間で消去される。

##stack
小さなローカル変数を保持するために使われる。

##変数の保存場所のデフォルト
- 状態変数は常にstorage
- 関数の引数はmemory
- ローカルな構造体、配列、mappingはstorage
- その他のローカル変数はstack
UE4でゲームを製作するときに気をつけること

# UE4でのゲーム制作で気をつける事をまとめてみました。

　あくまでも自分の経験と好みなので、必ずしもこの通りが良いというものではありません。
　自分の忘備録的な意味合いもあるので、追々追記していきます。

## フォルダ
　フォルダの構成は良く考えて決めたいところですが、基本的にはアセットの種類と関連性で分類します。その辺はプロジェクトによりますが、個人的意見では

- BlueprintやBlueprint Classをあちこちにばらまかないで、なるべくフォルダにまとめる。
- ゲームに組み込むまでのテストはデベロッパーフォルダーで作業し、十分テストしてから正式なフォルダに移動。

[デベロッパーフォルダの説明](https://docs.unrealengine.com/latest/JPN/Engine/Content/Browser/UserGuide/DevelopersFolder/index.html)

デベロッパーフォルダはデフォルトでは表示されていないので、コンテンツブラウザの右下の「表示オプション」をクリックし、「デベロッパーフォルダを表示」にチェックを入れることで表示されます。
 ![2018-03-08_17h03_23.png](https://qiita-image-store.s3.amazonaws.com/0/147177/3061abba-f644-4144-ecaf-b26513341b0d.png)
自分のユーザー名のフォルダがあるので、そこを使用します。

## 参照

参照について基本的な知識として

- ハード参照とソフト参照がある
- ハード参照されているアセットは参照元のアセットが読み込まれると自動的に読み込まれる
- ソフト参照されているアセットは使用前にプログラムやBlueprintから読み込む必要がある

レベルやGameInstanceなどからハード参照されているものは一緒に読み込まれてしまうので、なるべく不要なものはハード参照にしないようにしましょう。
ハード参照かソフト参照かは、アセットを右クリックして、「リファレンスビューアー」を選択すると確認できます。白い線でつながっているのがハード参照、マゼンタの線でつながっているのがソフト参照です。

注意が必要なのは、BlueprintからClassを参照しただけで、そのClassからハード参照されているアセットが全て読み込まれてしまいます。
具体的には、Blueprintが特定のClassの変数を持っている場合や、Blueprintで*Cast*や*GetAllActorsOfClass*でClassに指定している場合です。
どうしてもGetAllActorsを使う場合は、*Tag*や*GamePlayTag*で検索するようにして、Classでの検索を使わないようにしましょう。

参照に気をつけないと、エディタでプロジェクトを開くのにかかる時間がどんどん増大します。

## マテリアルの階層

マテリアルはマテリアルに機能を実装して、そのマテリアルのインスタンスを作成して、インスタンスにパラメーターを設定するのが一般的です。後の機能変更などを考慮して、マテリアルを直接使わず、マテリアルインスタンスを使うようにしましょう。

詳しくは下記のリンクを見てください。
[Unreal Engine Material Management Deep Dive](http://3dnchu.com/archives/ue4dd/)
この時点のUE4と違い、現在のUE4ではマテリアルの共有部分が進化しているので、そこまでメモリに大きな影響は無くなりましたが、ポイントは

- ある程度共通の機能を持ったベースマテリアルを作る
- ベースマテリアルの機能をSwitchで切り替えた機能別のマテリアルインスタンスを作る
- 機能別のマテリアルインスタンスのインスタンスをつくり、パラメータなどを設定して使用する

という使い方が良いと思います。

## Blueprint

Blueprintは便利ですが、落とし穴もたくさんあります。
Unreal Festでのバイキングさんの[講演](https://www.slideshare.net/EpicGamesJapan/ue4-bp18)などを参考にしてください。
最初のうちはBlueprintでも良いのですが、プロジェクトが進むにつれて、メモリやパフォーマンス的に厳しくなってくることが多いです。
特にTick内など、毎フレーム実行される処理をBlueprintで書く場合は注意が必要です。
GetAllActors系など、重たい処理をTickに書かないように注意が必要です。

また、Blueprintの変数は全てUObjectを継承しているので、大量のBlueprintで大量の変数を使用すると、メモリの使用が増大し、ガベージコレクションの時間が増大するので、不用意に変数を増やさない方が良いです。

## Load関連

ロード関連は闇が深いので、適宜加筆します。

注意点としては

### レベルをロードする際には、レベル名だけを指定せずに、フルパスで名前を指定する。
　パッケージされた状態でレベル名だけを指定すると、パッケージ内を頭から検索するのですが、同じレベル名が複数ある場合に、先に見つかったほうが読み込まれます。また、この検索に非常に時間がかかる場合があり、プラットフォームによっては数十秒かかることがあります。
kubernetes/minikube/gke コマンド覚書

# kubernetes
### 起動中のサービスでコマンドを実行する
```
$ kubectl exec -it [pod_name] [command]
```

### PODのログを表示する
```
$ kubectl logs (POD | TYPE/NAME) [CONTAINER_NAME]
```

### deployment/serviceなどの作成

```
$ kubectl create -f [foo.yaml]
```

### deployment/serviceなどの削除

```
$ kubectl delete -f [foo.yaml]
```

or

```
$ kubectl delete pod [pod_name]
```
(for pod)

### deployment/serviceの再起動
```
$ kubectl replace --force -f <resource-file>
```

### nginx secretの作成
```
$ kubectl create secret tls nginxsecret --key [foo.key] --cert [foo.crt]
```

### nginx configmapの作成
```
$ kubectl create configmap nginxconfigmap --from-file=[default.conf]
```

### PODのフォルダをローカルへコピー
```
$ kubectl cp <some-namespace>/<some-pod>:/tmp/foo /tmp/bar
```

### デプロイしたファイルの編集
```
$ kubectl edit configmap/nginxconfigmap
$ kubectl edit deployment/backend
$ kubectl edit service/backend
$ kubectl edit replicationcontroller/frontend
```

### デプロイしたファイルの履歴確認
```
$ kubectl describe configmap/nginxconfigmap
$ kubectl describe deployment/backend
$ kubectl describe service/backend
$ kubectl describe replicationcontroller/frontend
```

### Podが削除されない場合の強制削除（＊クラスタ内にプロセスが残ってしまう場合あり）
```
$ kubectl delete pod [Podの名前] --grace-period=0 --force
```

# minikube
### minikubeのスタート
```
$ minikube start
```

### minikubeでローカルのDockerイメージを使いたい場合
```
$ eval $(minikube docker-env)
```

### minikubeのserviceの状況をブラウザで表示
```
$ minikube service [service_name]
```

### minikubeのダッシュボードをブラウザで見る
```
$ minikube dashboard
```

# gcloud
### GCRにDockerイメージをpushする
```
$ gcloud docker -- push gcr.io/[project_name]/[image_name]
```
ユーザのブラウザで起きた JavaScript のエラーを収集する

## なぜエラーを収集するのか

- バグ探し
    - バグを見つけて潰していくため
- ユーザからのバグ報告の補助
    - ユーザに報告の負担をかけないため

## エラーを取得する

### 取得タイミング

- `window.onerror`
- Promise のエラー
- フレームワーク毎の特定のタイミング

#### `window.onerror`

`window.onerror` にメソッドを登録しておくことでエラー発生時にそのメソッドが呼ばれる。try-catch でハンドリングしていないエラーが流れてくる。

```javascript
window.onerror = (message, file, lineNo, colNo, error) => {
}
```

古いブラウザでは [error オブジェクト](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)が取得できないので注意すること。

#### Promise のエラー

`window.onerror` では Promise が reject された際のエラーハンドリングを行っていないエラーは検出できません。

つまり以下のようなコードでは反応してくれないということです。

```javascript
window.onerror = (a,b,c,d,e) => {
  console.error('window.onerror', a,b,c,d,e);
};

const promise = new Promise(() => {
  throw new Error('error dayo~');
});
promise.then(() => {
  console.log('kurae!');
});
```

そこで登場するのが [`unhandledrejection` イベント](https://developer.mozilla.org/en-US/docs/Web/Events/unhandledrejection)です。

```javascript
window.addEventListener("unhandledrejection", function (event) {
  console.warn("WARNING: Unhandled promise rejection. Shame on you! Reason: "
               + event.reason);
});
```

[2018/03/09 現在主要ブラウザでは Chrome と Safari のみこのイベントに対応しています。](https://caniuse.com/#search=unhandledrejection)

#### フレームワーク毎の特定のタイミング

使用しているフレームワークによっては `window.onerror` でエラーを取得できない場合がある。例えば Angular では `ErrorHandler` として実装する必要がある。
[Sentry のサイト](https://docs.sentry.io/clients/javascript/integrations/) を見ると各フレームワークでの雰囲気が掴める。

### 取得する情報

- スタックトレース
- UserAgent
- URL
- 現象が起きたページ ID
    - URL を割り振っていない場合とか
- ユーザ情報
    - 無名化
- その他有るとバグの特定に便利なものを見つけたら教えてください

#### stacktrace.js

`window.onerror` で取得したエラー情報をそのまま文字列で送ってもいいけどライブラリを使うともっと扱いやすい。
[stacktrace.js](https://www.stacktracejs.com/) を使うと sourcemap を解釈してくれるので大変便利。
sourcemap ファイルを非公開にしている場合は [Sentry 等の仕組み](https://docs.sentry.io/clients/javascript/sourcemaps/#uploading-source-maps-to-sentry)に乗るか stacktrace.js 以外を検討する必要あり。

## エラーを収集する

### 収集先の選別

- エラー収集系サービス
    - [一覧](https://github.com/cheeaun/javascript-error-logging)
    - 大抵 `window.onerror` でなく個別の仕組みが用意されている
    - 既に使ってるサービスがあればそこに JavaScript のエラーも投げつけると良さそう
- 自前サーバ
    - Ajax でエラー内容を送りつける

### 自前サーバに投げるときの注意点

別ドメインにある JavaScript ファイルを読み込んでいる場合 CORS を突破する必要がある。
さもないとエラー内容が全て `Script error.` に置き換わってしまう。とても悲しい。

対応しないといけないのは以下の2つ。

- crossorigin 属性
- CORS ヘッダ

#### crossorigin 属性

スクリプトを読み込んでいる箇所に `crossorigin="anonymous"` を付与する。

```html
<script src="http://another-domain.com/app.js" crossorigin="anonymous"></script>
```

#### CORS ヘッダ

JavaScript ファイルを提供するサーバのレスポンスに `Access-Control-Allow-Origin` ヘッダを付与する。
二重配列で複数の条件でソート

三項演算子使ってできたのでメモ。

## コード
```
arr = [[1, 2, 3], [2, 3, 4], [2, 4, 4], [2, 4, 5]]
arr.sort!{ |a, b|
  a[0] == b[0] ? (a[1] == b[1] ? b[2] <=> a[2] : b[1] <=> a[1]) : b[0] <=> a[0]
}

arr.each { |item|
    print "#{item[0]} #{item[1]} #{item[2]}\n"
}
```

## 結果
```
2 4 5
2 4 4
2 3 4
1 2 3
```
5行で書ける、jQueryを使ったJSONテンプレートプラグイン

Ajaxで受け取ったJSONを表示するために、簡単テンプレートプラグインの書き方。

## jQueryプラグインを書く

```javascript:プラグインを記述
$.fn.jsonAllocator = function(json){
    for(name in json) {
        this.find('[data-name="' + name + '"]').html(json[name]);
    }
}
```

これだけ。

# 使い方


## JSONデータの例
次のようなJSONデータを受け取り、`title` と `author` の内容をHTML中に表示したいとする。

```json:受け取るJSON
{
    "title":"SLAM DUNK",
    "author":"井上雄彦"
}
```

## HTMLに`data-name`属性を記述
HTML側ではデータを表示したい要素に`data-name`属性を記述し、**JSONデータのキー名**を指定する。

```html:HTML
<section id="disp-section">
    <h1 data-name="title">タイトル</h1>
    <p data-name="author">作者名</p>
</section>
```

ちなみに、`data-***` はHTML5のカスタムデータ属性なので、`data-name`という属性名が何かと被って使えない時は好きな名前に変えてOK。
要素の中は空でもいいんだけど、デザイナーが作業する時に確認しやすいので、ウチではテキストを入れておく事が多い。



## Ajaxを実行
```javascript:使用時

// Ajax で受け取ったJSONを、#disp-section の内部で表示
$.ajax(option).
done(function(json, status, jqXHR) {
    $('#disp-section').jsonAllocator(json);
}).
fail(function(jqXHR, status) {
    ....
});
```

これで、AjaxでJSONを受け取ると、`#disp-section`要素の表示を書き換えてくれる。

# もうちょっと便利に
実際には form と合わせて使うことが多いので、`<input name="title">` にも対応できるように書いている。

```javascript:inputにも対応版
$.fn.jsonAllocator = function(json){
    for(name in json) {
        this.find('[data-name="' + name + '"]').html(json[name]);

        // input にも対応
        var selector = 'input[type!="radio"][name="' + name + '"]input[type!="checkbox"][name="' + name + '"]';
        this.find(selector).val(json[name]);
    }
}
```

こうしておくと、 `data-name="title"` だけでなく、`<input name="title">`もJSONの内容で置き換えてくれる。
ラジオボタンとチェックボックスはvalue値を書き換えてしまうとマズいので省いている。

ここに、ラジオボタンなどの選択式要素にも対応したり、href や src などの属性値の書き換えにも対応できるようにしたりと、お好みで拡張して使うのが吉。

# 実際に、この方法で表示しているサイト

拙作のサイトでもこの手法を使っております。
よろしければチェックしてみてください。

「超波動式マンガ紹介所」
http://bm.tashinoso.xyz/
その人の「好み」に合わせた、面白マンガを紹介するサービスです。
EC2内部のSSL証明書からALB + ACMへの移行手順

EC2内部にファイル保存しているSSL証明書から、AWSのマネージドSSL証明書ACMに移行する手順です。ACMはEC2に直接つけられないため、EC2の前段にALBをかませる必要があります。

![LU88wc5EK2Wv59AN-21BC0 (1).png](https://qiita-image-store.s3.amazonaws.com/0/99248/68491715-32ec-ed34-c152-ecf8460d6052.png)


## ACM証明書を作成する
- AWS Certificate Managerを開く（ALBを作成するリージョンを選択する）
- 証明書のリクエスト -> `hoge.example.com` 、「別の名前を追加」から `*.hoge.example.com`を入力する。

## ALBを作成するサブネットを作成する（存在しなければ）
- ALBは2つ以上のAZに配置する必要があるので、ここではAZ-AとAZ-Cに一つずつ作成する
- ルーティングにInternet Gatewayへの経路を入れる

## ALBにつけるセキュリティグループを作成する
- グローバルからのHTTPS(443)アクセスを許可する

## ALBを作成する
- EC2 -> ロードバランサー -> ロードバランサーの作成 -> Application Load Balancerを選択

### ロードバランサーの設定
#### 基本的な設定
- 名前：任意
- スキーマ：インターネット向け
- IPアドレスタイプ：ipv4

#### リスナー
- ロードバランサーのプロトコル：HTTPS
- ロードバランサーのポート：443

#### アベイラビリティーゾーン
先ほど作成したALB用のサブネットをAZ-AとAZ-Cそれぞれ選択

### セキュリティ設定の構成
- 「ACM から証明書を選択する」-> 作成したACMを選択

### セキュリティグループの設定
- 作成したセキュリティグループを選択

### ルーティングの設定
- ターゲットグループを設定
    - ターゲットグループ: 新しいターゲットグループ
    - 名前: 任意の名前（Webとか）
    - プロトコル：HTTP
    - ポート：80
    - ターゲットの種類：instance
    - ヘルスチェック
        - プロトコル：HTTP
        - パス：`/`など、200レスポンスが返るところを指定

### ターゲットの登録
- ALB配下に入れるインスタンスを選択 ->登録済みに追加


## EC2のセキュリティグループに設定を追加する
ALBからEC2に対してアクセスができるように、EC2のセキュリティグループにALBのセキュリティグループIDからのHTTPアクセス許可を追加

- タイプ： HTTP
- プロトコル： TCP
- ポート範囲： 80
- ソース： `<ALBのセキュリティグループID>`

## 確認
- ALBに生成されたDNS名にブラウザからアクセスしてみる。
    - 証明書のドメインとALBのドメインが異なるので、ブラウザに「保護されていない通信」と出る。

## Route53の設定
- 設定するドメインのHosted Zoneを選択
- 設定するドメイン（or サブドメイン）のRecord Setがすでに存在する場合はそれを選択する。ない場合は作成する。
- Type： A
- Alias： Yes
- Alias Target： 作成したALB（プルダウンメニューから選択できる）
    - `dualstack.xxxxxxxxx.ap-northeast-1.elb.amazonaws.com`みたいな感じの表示になる

    
## 確認
- 設定したドメインに対してHTTPSでアクセスしてみる。
- ブラウザURLバーの「保護された通信」から証明書を確認してAmazonの証明書になっていることを確認する。
Docker-for-windowsでErrorActionPreference

##概要
SurfaceなどのSSD容量少ないものはSDカードに重いものはぶんなげたくなるものです
しかし、実際にやろうとすると…

##世界はそんなに甘くなかった

```:log
[15:12:26.319][HyperV         ][Warning] Unable to download logs: ユーザー設定変数 "ErrorActionPreference" または共通パラメーターが Stop に設定されているため、実行中のコマンドが停止しました。"MobyLinuxVM" という名前の仮想マシンが見つかりません。
```

こんなエラーが出るようになり、起動しなくなってしまいます…。

**ErrorActionPreference**で検索しても原因のようなものはヒットせず

いろいろパターンを変えてググったところ、先人の書き込みが…
https://qiita.com/ryohey/items/8e84cf570734a9549bdc

そしてMicrosoftの公式ドキュメント
https://docs.microsoft.com/ja-jp/virtualization/hyper-v-on-windows/user-guide/troubleshooting


>これらのファイル システムはアクセス制御リスト (ACL) を指定しないため、また、4 GB より大きいファイルをサポートしないため、Hyper-V では FAT または FAT32 でフォーマットされたディスク ドライブをサポートしません。 ExFAT でフォーマットされたディスクは、ACL 機能を制限付きで提供するため、セキュリティ上の理由により、サポートもされません。 PowerShell では、"システムで '[path to VHD]' を作成できませんでした: ファイル システム制限のため、要求された操作を完了できませんでした (0x80070299)。" のエラー メッセージが表示されます。
代わりに、NTFS フォーマットのドライブを使用します。


## そして…
もうNTFSでSDカードをフォーマットすればいいんじゃないか？という事で
NTFSでやってみています(/・ω・)/

## しかしやっぱり制限が
**>>> Docker hv-sock proxy (vsudd) is not reachable <<<**
等出た場合はそっとDocker-For-Windowsをrestart
Vimの使い方で新しい事を学習したのでまとめ(ウィンドウ操作、インサートモード時のショートカットなど)

こんにちは。

かれこれ5年くらいVimを使っている者です。

この度、ちょっと色々Vimの使い方を改めて調査してみたら、5年も使ってるのにVimの機能を全然使えてなかったことが判明したので、備忘録として記事にしておきます。

新しいプラグインを入れるとか言ってる場合じゃないぜ。話はデフォルトの機能をそこそこ使えるようになってからだ。

Qiitaって備忘録を書く場所ってことでいいんですよね？合ってます？

最初のプランでは、まず一通り「既に使っている機能」を列挙して、その後「今回学んだ機能」を書こうと思ったのですが

「既に使っている機能」が多すぎるので、後者だけ書くことにしました。

レベル感を伝えるために簡単に書くと、`/`で検索とか`y`でヤンク(コピー)とか`:e`でファイルを開くとかは既に使ってます。

では。

##ノーマルモード

###`Ctrl+w`シリーズ
これ、でかいです。複数のファイルを同時に開いて、片方のファイルの内容を確認しながらもう片方のファイルを編集する、っていう場面、結構ありますからね。

####`Ctrl+w s`
ウィンドウ分割。
`:split`か`:sp`でも同じことができます。

####`Ctrl+w hjkl`
カーソルを各方向のウィンドウに移動

#### `Ctrl+w c`
カーソルのあるウィンドウを閉じる(**c**lose)

#### `Ctrl+w o`
カーソルのあるウィンドウだけ残して他を閉じる(**o**nly)

この辺のウィンドウ操作をわかっていなかったせいで、例えば`:help`とかやって別ウィンドウでヘルプが出た後、そのウィンドウをどうすれば元の操作に戻れるのかがわからなくて困ってました。困ってるなら調べて解決しとけやって話なんですけど。

次行きます。

### `yy`一行ヤンク(コピー)
今まで、`Shift+v y`ってやってました。一行選択→ヤンクってことですね。`yy`の方が速いですね。

###`gg`文頭に移動 `G`文末に移動

いままでは`9999k`とか`9999j`とかやってました。ダサいですね。

###`Ctrl+v I` 短形挿入
エルじゃなくて、大文字のアイです。`Ctrl+v Shift+i`ってことです。
まとめてコメントアウトするときとかに便利ですね。
そういうプラグインもありますけど、とりあえずデフォルト機能でできるので覚えておこう。

##インサートモード

###`Ctrl+[` インサートモードを抜ける
これはやはり最速でやりたい操作ですね。めちゃめちゃ頻繁にやるので。
今までは親指と中指で`ESC`と`英数`を同時押しして抜けてました。
(私の環境はmacの日本語キーボード)

一度完全に左手をキーボードから上げることになるので無駄が大きい。

`英数`も押す理由は、確実に日本語入力モードを抜けたかったからです。
ノーマルモードで日本語入力をすることはありませんからね。

今後はとりあえず`Ctrl+[`で慣れることを目指そう。

`jj`にキーバインドするという方法もあるようですが、とりあえずデフォルトで出来るところまでやってみる。

ここはまだ最適化の余地がありそうだなあ。

(追記：最適化しました。[Vimでインサートモードを抜ける時に日本語入力を解除したい〜Mac+JISキーボード+Karabiner編〜](https://qiita.com/agajo/items/6a4fe2dc20608790a6e1))

###`Ctrl+h` 一文字削除
バックスペースと同じ機能です。
バックスペースはキーボードの右上にあるので、それよりもこのショートカットの方が素早く押せますね。

###`Ctrl+u`行頭まで削除
途中まで書いて「やっぱやめた！」って言う時に便利らしいです。覚えとこう。

###`Ctrl+g j(k)`前の行(次の行)に移動
これ、時々やりたい場合があるんですよね。
インサートモードのまま行移動。覚えておきましょう。

###`Ctrl+n`補完
これですよ！これが今回二番目の大きな学びです(一番はウィンドウ操作)
Vimの保管機能あったんですね。ないと思ってた。
長い関数名とか全部打ち込んでましたよ。ようやるわ。
これはちょっと、ガンガン使って慣れよう。だいぶ速くなるはず。

###`Ctrl+e` 補完ウィンドウを閉じる
`Ctrl+n`とセットですね。

##プラグイン
###NERD tree
冒頭で「プラグインとかいれてる場合じゃない」みたいなこと言いましたが、これだけ入れました。
いちいちVimを抜けずにファイルを操作できます。
ウィンドウ操作と組み合わせて使うと便利です。





それでは！

~~Macで、一瞬でインサートモードを抜けて、確実に日本語入力も解除する方法があったら教えてください！~~(追記：ありました。[Vimでインサートモードを抜ける時に日本語入力を解除したい〜Mac+JISキーボード+Karabiner編〜](https://qiita.com/agajo/items/6a4fe2dc20608790a6e1))
AWSのtimestampと仲良くする

# 前置き
CloudWatchからSNS経由でLambdaにデータを渡した際に時刻フォーマットがUTCなので、それと戦う

# 作った便利関数
```python
def utc_to_jst(str_utc, date_format='%Y-%m-%d %H:%M:%S'):
    time = datetime.datetime.strptime(str_utc, '%Y-%m-%dT%H:%M:%S.%f%z')
    # UTC と JST の時差は+9時間だから9時間加算
    time += datetime.timedelta(hours=9)
    return time.strftime(date_format)
```

# 使い方
この`utc_to_jst`関数にawsのstr_utcを第一引数に渡すと、`%Y-%m-%d %H:%M:%S`フォーマットの文字列に変換して吐き出してくれる

# サンプル
```python
>>> import datetime

>>> def utc_to_jst(str_utc, date_format='%Y-%m-%d %H:%M:%S'):
...     time = datetime.datetime.strptime(str_utc, '%Y-%m-%dT%H:%M:%S.%f%z')
...     time += datetime.timedelta(hours=9)
...     return time.strftime(date_format)
...
>>> utc_to_jst('2018-03-08T07:23:38.636+0000')

'2018-03-08 16:23:38'
```
ローカルの複数ブランチを一括で削除するときのコツ



```
git branch | grep [文字列] |  while read branch ; do git branch -d ${branch} ; done ;  
```

とするので、以下の様にブランチ名に一貫性をもたせる。

```
br2011
br2001
br2020
master
```

実行するときは

```
$ git branch | grep br | while read branch ; do git branch -d ${branch} ; done ;  
```

最初 `|grep br2011 br2001 |` と書いていたけど、2つ目は「ファイル名」らしいので注意。

## 参考
https://eng-entrance.com/linux-command-grep
Amazon FreeRTOSのOTA

Amazon FreeRTOSのOTAについてちょっと調べてみました。

Amazon FreeRTOSOTA (On the Air) はインターネットからデバイスのファームウェアをアップデートする機能です。

2018年３月時点のver 1.2.2の情報です。

# OTA対応プラットフォーム
OTA PALが実装されているプラットフォーム
* Texas Instruments - CC3220SF-LAUNCHXL
* Microchip - Curiosity PIC32MZEF
* Windows Simulator

# OTA PAL
OTA PAL (Physical Abstraction Layer) は　OTAイメージの読み書き、ブートセレクタの設定を行うAPI.
aws_ota_pal.hで定義されている。

# クラウド(AWS IoT)から見たOTAの機能
* AWS IoTを使ってMQTTプロトコルでファームウェアを転送する。
* 展開する前に、ファームウェアにデジタル署名し、暗号化する。
* 新しいファームウェアイメージを、単一のデバイス、デバイスのグループ、または艦隊全体に安全に展開する。
* グループに追加、リセット、または再プロビジョニングされると、デバイスにファームウェアを展開する。
* 新しいファームウェアがデバイスに配備された後、新しいファームウェアの真正性と完全性を確認する。
* 展開の進行状況を監視する。

https://docs.aws.amazon.com/freertos/latest/userguide/freertos-ota-dev.html

# OTA lib
デバイス開発者はOTA libを使用することで、FreeRTOSタスクとして実行されるOTAエージェントを制御する。

# サンプルコード
https://github.com/aws/amazon-freertos/blob/master/demos/common/ota/aws_ota_update_demo.c
https://docs.aws.amazon.com/freertos/latest/userguide/ota-demo.html

# 感想
* デバイスを管理する側からはとても便利そうです。
Gitのコミットフックでprettierの強制フォーマットがかかるようにする

VSCodeのprettierフォーマッタが効かなくなってしまった。
[prettierの公式ドキュメント](https://prettier.io/docs/en/precommit.html)を見ながら、Gitのコミットフックで矯正するようにする。

```
npm install --save-dev prettier lint-staged husky
```

で必要なものをインストール。

`package.json` に以下を追記。現状に合わせてうまく追記する。

```javascript
  "scripts": {
    "precommit": "lint-staged"
  },
  "lint-staged": {
    "*.{js,json,css,md}": ["prettier --write --single-quote=true", "git add"]
  }
```

シングルクオートのオプションを付けて上書きするようにしてある。scripts プロパティとかは既にあったら差し込む。そしたら commit の度ステージにあるものをチェックしてくれる。

```sh
~/w/n-coin-bot (master) $ git commit -am "TEST: bad format"
husky > npm run -s precommit (node v8.9.4)

 ✔ Running tasks for *.{js,json,css,md}
[master 363326a] TEST: bad format
```

こんな感じ。これでOK。なお過去のものの全変換は。

```
find . -name \*.js | grep -v node_modules/ | grep -v public/ | xargs node_modules/.bin/prettier --write --single-quote=true
```
みたいなワンライナーでやると便利。
IntelliJ IDEAをアップデートしたら.inc（インクルード）ファイルがPascalに関連付けされてしまっている

IntelliJ IDEAをアップデートしたらインクルードファイル（*.inc）がPascal言語に関連付けされてしまっていて、警告がでまくっていたので修正しました。

.inc拡張子がおそらくPascalの拡張子としてIntelliJ IDEAに登録されているので、
.inc拡張子をHTMLのファイルタイプに修正します。

[Preferences(⌘,)]　>　Editor　>　File Types　> Pascal Source

Pascalに関連づけられている拡張子の*.incを消します。
<img width="1016" alt="intellij-idea-pascal.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/3c1d093c-2791-f831-7d50-49ba9977ce31.png">

次に、File Types の HTMLに移動し、今度は逆に追加してあげます。
<img width="1022" alt="intellij-idea-html.png" src="https://qiita-image-store.s3.amazonaws.com/0/50783/cfcab41a-cd97-786e-3ad9-829d958cc6ec.png">

Applyを押すと再起動なしで関連づけが修正されます。
フォーカス系イベントの発生順を知る

特にVB6しか使ってこなかった人によくあるやつの説明用。

# MSDN #
[Control.GotFocus](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.gotfocus%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)
[Control.LostFocus](https://msdn.microsoft.com/ja-jp/library/system.windows.forms.control.lostfocus(v=vs.110).aspx)

どちらにも発生順がちゃんと記されてあって、タブ遷移とマウス遷移によって、LostFocusの発生順が違うことが分かる。

Note部をGoogle先生に頑張って翻訳してもらうと
>GotFocusおよびLostFocusイベントは、WM_KILLFOCUSおよびWM_SETFOCUS Windowsメッセージに関連付けられている低レベルのフォーカスイベントです。 通常、GotFocusイベントとLostFocusイベントは、UICueを更新するとき、またはカスタムコントロールを作成するときにのみ使用されます。 代わりに、ActivateイベントとDeactivateイベントを使用するFormクラス以外のすべてのコントロールに対して、EnterイベントとLeaveイベントを使用する必要があります。 GotFocusおよびLostFocusイベントの詳細については、WM_SETFOCUSおよびWM_KILLFOCUSトピックを参照してください。

つまり、コントロールを作成する時以外に、GotFocus, LostFocusなんてつかわん、ということ。

# 試す #
```C#:Form1.cs
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            textBox1.GotFocus += TextBox1_GotFocus;
            textBox1.LostFocus += TextBox1_LostFocus;
        }

        private void TextBox1_LostFocus(object sender, EventArgs e)
        {
            Console.WriteLine("LostFocus");
        }

        private void TextBox1_GotFocus(object sender, EventArgs e)
        {
            Console.WriteLine("GotFocus");
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            Console.WriteLine("Enter");
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            Console.WriteLine("Leave");
        }

        private void textBox1_Validated(object sender, EventArgs e)
        {
            Console.WriteLine("Validated");
        }

        private void textBox1_Validating(object sender, CancelEventArgs e)
        {
            Console.WriteLine("Validating");
        }
    }
```

発生順は以下の通り。

- タブによるフォーカスイン
  1. Enter
  1. GotFocus
- タブによるフォーカスアウト
  1. Leave
  1. Validating
  1. Validated
  1. LostFocus
- マウスによるフォーカスイン
  1. Enter
  1. GotFocus
- マウスによるフォーカスアウト
  1. LostFocus
  1. Leave
  1. Validating
  1. Validated
- ウィンドウのアクティブ化
  1. GotFocus
- ウィンドウの非アクティブ化
  1. LostFocus

MSDNに記されている通り、タブとマウスによるフォーカスアウトでは、LostFocusの発生順が一定ではない。
更にGotFocus, LostFocusは、ウィンドウのアクティブ状態によっても発生する。

つまり、GotFocus, LostFocusを利用しなければならない明確な理由がない以上は、**何も考えなくていいからEnter, Leave使おう**
問題

```math
\begin{align}
\fbox{1}~~&(1)複素数xがx^4-2x^3+3x^2+1=0を満たすとする。\\
&~~~~~y=x+\frac{1}{x}とおくと，yの満たす2次方程式は\fbox{$~~$(ア)$~~~$}=0\\
&~~~~~である。したがって元の方程式の解を複素数の範囲ですべて\\
&~~~~~求めると\fbox{$~~$(イ)$~~~$}となる。\\
\\
&(2)実数x,yがx^3+y^3+xy-3=0を満たすとする。\\
&~~~~~s=x+y,t=xyとおくとtはsを用いてt=\fbox{$~~$(ウ)$~~~$}と表せる。\\
&~~~~~さらに，このときsのとりうる値の範囲は\fbox{$~~$(エ)$~~~$}である。\\
\\
&(3)3で割った余りが1となる自然数nに対し，\\
&~~~~~(x-1)(x^{3n}-1)が(x^3-1)(x^n-1)で割り切れることを証明しなさい。
\end{align}
```
PythonでCopy,Pasteを使用する

#####環境

　　Ubuntu Studio 17.10
　　Python 3.6.3
　　LibreOffice6.0

PythonでCopy,Pasteを使用できるパッケージを見つけたのでインストールしました。

```python:Pyperclip
pip3 install pyperclip
```

エラーが出てしまうので検索すると、PyperclipのHPに載っていました。

WindowsとMacではエラーが出ないが、linuxではエラーがでるそうです。
以下の４つをインストールすれば良いそうです。（このHPはかなり以前に作成されているようです。）
1.sudo apt-get install xsel
2.sudo apt-get install xclip
3.pip install gtk（pip3 searchで検索すると、gtkはありません。PyGTKと言うのがあるのですがエラーがでてインストール出来ません。）
4.pip install PyQt4（これもエラーが出てインストール出来ません。）

ネットで検索すると、いろいろ不足しているかも？ということでインストールしようとしても、古いバージョンそうで名前も違うのですがインストールしようとしても、エラーで全てがインストール出来ません。

結論から言うと使用出来るようになったのですが、何をインストールしたので使用出来るようになったのかわからないのです。

まず、この段階でエラーがでないか確認します。

もし、まだエラーが出るようでしたら、次をインストールしました。
エラーが出ずにインストール出来たものは、下記の３つです。（Ubuntu Studio 17.10の場合です。また以前に色々インストールしているので、まだ必要なパッケージがあるかも知れません。）
1.sudo apt install python3-lxml
2.sudo apt install python3-libxml2
3.sudo apt install libxml++2.6-dev
この３つが全て必要なのかどうかわかりません。

LibreOfficeバンドルのPython3.5.4でも使用出来るようになりました。
LibreOfficeバンドルのPythonで使用出来るようにするには。
https://qiita.com/ty21ky/items/3b944a7abe23e3bcaf8f
を参考にしてください。

サンプルコード

```python:sample
>>> import pyperclip
>>> pyperclip.copy('Hello world!')
>>> pyperclip.paste()
'Hello world!'
```
F# の http クライアントの使い方 (Post)

RestSharp.dll というライブラリーを使います。
RestSharp.dll　へのシンボリックリンクを　コンパイル、実行するフォルダー内に作成します。

```fsharp:http_post.fs
// ----------------------------------------------------------------
//
//	http_post.fs
//
//						Mar/08/2018
//
// ----------------------------------------------------------------
open System
open RestSharp
// ----------------------------------------------------------------
[<EntryPoint>]
let main argv =
    Console.Error.WriteLine("*** 開始 ***") 
    let host_in = "https://httpbin.org"
    let user = "jiro"
    let password = "123456"
    printfn "host_in = %s" host_in
//
    let client = new RestClient(host_in)
    let request = new RestRequest("/post", Method.POST)
    let _ = request.AddParameter("user", user)
    let _ = request.AddParameter("password", password)
//
    let response = client.Execute(request)
    let content = response.Content
    printfn "%s" content
    Console.Error.WriteLine("*** 終了 ***") 
    0
// ----------------------------------------------------------------
```

```text:Makefile
http_post.exe : http_post.fs
	fsharpc http_post.fs -r:RestSharp.dll
clean:
	rm -f *.exe
```

コンパイル

```text
$ make
fsharpc http_post.fs -r:RestSharp.dll
F# Compiler for F# 4.0 (Open Source Edition)
Freely distributed under the Apache 2.0 Open Source License
```

実行コマンド

```bash
mono ./http_post.exe
```
F# の http クライアントの使い方 (Get)

RestSharp.dll というライブラリーを使います。
RestSharp.dll　へのシンボリックリンクを　コンパイル、実行するフォルダー内に作成します。

```fsharp:http_get.fs
// ----------------------------------------------------------------
//
//	http_get.fs
//
//						Mar/08/2018
//
// ----------------------------------------------------------------
open System
open RestSharp
// ----------------------------------------------------------------
[<EntryPoint>]
let main argv =
    Console.Error.WriteLine("*** 開始 ***") 

    let host_in = "https://httpbin.org"
    printfn "host_in = %s" host_in

    let client = new RestClient(host_in)
    let request = new RestRequest("/get", Method.GET)
    let response = client.Execute(request)
    let content = response.Content
    printfn "%s" content

    Console.Error.WriteLine("*** 終了 ***") 
    0
// ----------------------------------------------------------------
```

```text:Makefile
http_get.exe : http_get.fs
	fsharpc http_get.fs -r:RestSharp.dll
clean:
	rm -f *.exe
```

コンパイル

```text
$ make
fsharpc http_get.fs -r:RestSharp.dll
F# Compiler for F# 4.0 (Open Source Edition)
Freely distributed under the Apache 2.0 Open Source License
```

実行結果

```text
$ mono ./http_get.exe
*** 開始 ***
host_in = https://httpbin.org
{
  "args": {}, 
  "headers": {
    "Accept": "application/json, application/xml, text/json, text/x-json, text/javascript, text/xml", 
    "Accept-Encoding": "gzip, deflate", 
    "Content-Length": "0", 
    "Host": "httpbin.org", 
    "User-Agent": "RestSharp 104.1.0.0", 
    "X-Amzn-Trace-Id": "Root=1-62ef3c35-114a557008ed9e653a2a142b"
  }, 
  "origin": "219.126.135.211", 
  "url": "https://httpbin.org/get"
}

*** 終了 ***
```

Post の例はこちら
[F# の http クライアントの使い方 (Post)](https://qiita.com/ekzemplaro/items/fbe221e216f51068ec4a)
SQLServerのオンライン学習サービス [Brent Ozar Unlimited] がすごい

#Brentozarについて
海外サイトですが、 [brentozar](https://www.brentozar.com/)というサイトがありまして、ここのオンライン動画学習サービスを使って3か月ほど勉強してました。[レクチャーページ](https://www.brentozar.com/product/sql-constantcare/)（有料）


内容は大きく2つに分かれていまして、

DBA training videos
Performance tuning videos

の2種類。僕はひとまずPerformance tuning videosを勉強してました。


このレクチャー動画、本当に素晴らしい内容なのですが、最大にして唯一の欠点として英語版しか無いです。。（動画によっては字幕あり）
とはいえ日本語だとそもそもここまでクオリティの高い動画が無いのでどうしてもこれがベストな選択となってしまいます。
スピーカーによってはゆっくり、ハッキリ話してくれて聞き取りやすかったです。


Performance tuning videosはさらに以下の5つのトピックに分かれています。全部で2,30時間くらいかと思われます。
それぞれ簡単に感想をかいておきます。


# 1_Start Here Wait Stats

　→パフォーマンスに問題が生じている場合に数値が高くなりがちなwait statsの種類について


# 2_How to Tune Indexes

　→DMVのmissing indexではクラスタ化インデックスについての助言はないから自分で考えなきゃダメ、等とても細かい、でも有用な情報がちりばめられていました。それ以外にも

　　・盲目的にレコメンドされたmissing indexを作成するのはダメで、他のクエリとの兼ね合いも考えて総合的に考えるべき

　　・ヒープでのデータスキャンがいかに効率が悪いかの図解がわかりやすい

　　・dmvを使って特定のインデックスを使っているクエリリストを取得する方法

　　などなど、ためになることが沢山。


# 3_Statistics SQL Server’s Guessing Game

　→統計情報についての説明。かなり踏み込んだ内容のため、SQLServerの統計情報について以前より理解度が確実に上がったという時間が得られた。

　　SQLServer2012までと2014からの基数推定アルゴリズムをそれぞれ解説してくれているため、実行プランの「予測行数」が統計情報を使って具体的にどう計算されているのかが理解できる。

　　また、それによって、確かに統計情報が古いままだと変な実行プランになるだろうな、という納得感も得られた。

　　さらに統計情報に関する「Ascending order problem」（今日の日付で絞り込んだ時だけ、やけにクエリが重くなるときがある問題）がなぜ起きるのかと対策についての話は、今まで原因不明だけど確かに実感していたためスッキリと分かって感動した。


# 4_T-SQL Level Up Level 2

　→計算列、CTE、フィルター化インデックスなどクエリを速くするための様々な手段についての解説。これだけだとネットや本で書いてある程度の内容だけど、「計算列にスカラ関数を含めるとクエリやインデックス再構築が並列化できず直列実行になっていまう欠点がある」といった、なんでそんなこと知ってるの？レベルの細かい内容についても触れられている。SQLServerは各機能に必ずと言っていいほど隠された制限や欠点があるため、実現可能かつ最適な対応をとるためにはこの粒度まで把握しておいたほうがいいのかも。


# 5_How to Read Query Plans

　→実行プランの読み方や、そもそもSQLServerってどうやって実行プランつくってるの、みたいなお話。

#最後に
英語が聞き取れる人には絶対的におすすめできる内容です。

また、英語苦手でも逆に英語の勉強とSQLServerの勉強が同時にできて一石二鳥という考えもできるかもしれません。


とにかく素晴らしいクオリティでした。
設定を残しながらPyCharmをupdateする方法

## 目的
設定を残してPyCharmをアップデートすること
## 前置き
自分の環境で設定を残してアップデートできた方法の備忘録なので、不適切な方法かもしれません。あくまで自分用のメモです。
### ぶつかっていた問題
- アップデートはできるが、設定が引き継がれない
- 公式サイトで設定引き継ぎアップデートする方法が見つからない(インストール方法の説明はある)
[参考サイト] (https://www.jetbrains.com/help/pycharm/requirements-installation-and-launching.html)

## 環境
- Ubuntu 16.04
- PyCharm Community Edition 2016.2.1

## 手順
ここからが本題です。
### 最新バージョンのダウンロード
1.公式サイトからダウンロード
2.ダウンロードファイルの展開

```bash
sudo tar xf <pycharm-community>-*.tar.gz -C /opt/
```

### 設定ファイルの引き継ぎ
- アップデート前の設定があるディレクトリ

`~/.PyCharm2016.2`

- アップデート後の設定があるディレクトリ

`~/.PyCharmCE2017.3`

- 設定ファイルのコピー

```bash
cp -r ~/.PyCharm2016.2/* ~/.PyCharmCE2017.3/
```

### pycharmコマンドのリンク先の変更
- 変更前

`/usr/local/bin/pycharm -> /opt/pycharm-community/bin/pycharm.sh`

- 変更後

`/usr/local/bin/pycharm -> /opt/pycharm-community-2017.3.4/bin/pycharm.sh`

- リンク先の変更

```bash
$sudo ln -fs /opt/pycharm-community-2017.3.4/bin/pycharm.sh /usr/local/bin/pycharm
```
スーパーユーザーとは


OSにはユーザーという概念がある。ユーザーはコンピュータにログインする際に使ったりする。ユーザーはコンピュータリソースの分割単位になってる。一つのコンピューターには、複数のユーザーを作ることができて、それぞれに別々の設定をすることができる。

ユーザーには権限（パーミッションとも）が与えられてて、ファイルやフォルダの読み書きや実行などに制約がつく。例えば、同じコンピュータに２つのユーザがいても、ユーザーAはユーザーBのデスクトップフォルダを覗けないのは、この仕組みのおかげである。

一般的に、（気づいていないとしても、）ユーザーは権限が制限されている。しかし、コンピュータには一切制限を受けない特別なユーザがいる。このユーザーは、端的に言えば、そのコンピュータにあるどんなファイルでも読み書きでき、どんなプログラムでも動かせる権限をもつ。このようなユーザをわかりやすく、`スーパーユーザー`と呼ぶ。他にも、`管理者(Admin)`や、`root`と呼ばれることもある。そしてそのユーザが持つ全能の力を、スーパーユーザー権限、管理者権限、root権限と呼んだりする。

TIPS: なぜ、スーパーユーザーのことをrootと呼ぶかは、昔のUNIX（Linuxの前身）では、スーパーユーザーのホームディレクトリがルートフォルダ(/)だったことに由来するという説がある。(c.f., http://www.linfo.org/root.html)


スーパーユーザーは、例えば新しいプログラムを、そのコンピューターを使ってる全てのユーザーに対してインストールする時などに使われる。（そのユーザーしか使わないプログラムのインストールにはスーパーユーザーでなくても良いこともある）

スーパーユーザの力を使いたいとき、シンプルな方法は２つある。一つは、自分はログアウトして、スーパーユーザーとしてログインすることだ。スーパーユーザーとしてログインすれば、文字通り、なんでもできる。２つ目は、スーパーユーザの権限だけを使わせてもらうことだ。これは、スーパーユーザ権限を使ってもいいよ、という許可制になっており、許可さえもらえば、いつでもスーパーユーザーの権限だけもらうことができる。

権限だけ使いたい時は`sudo`コマンド経由でできる。使い方は、スーパーユーザー権限で実行したいコマンドの先頭に`sudo`とつけるだけだ。これで、そのコマンドは、スーパーユーザーが実行したのと同じことになる。これならいちいちスーパーユーザにならなくて済むので、より手軽である。

さて、スーパーユーザは文字通り”スーパー”なので、誤って乗っ取られると、危険極まりない。例えば悪意のあるハッカーやウイルスは、まずはスーパーユーザ権限を奪取することを目標にしてくる。なので、近代的なOSはスーパーユーザーを持たないことが良いという案もあるくらいだ。くれぐれも、スーパーユーザになったままで席を離れたりしないように。。。;)
Visual Studio 2017 で Linux C++ 開発 (Boost C++ Libraryを使う)

#準備
Boost C++ Library を利用するためインストールする必要がありますが、Linux 側だけでなく Windows 側にもインストールします。

ただし、Windows 側の Boost はビルドに使う訳ではなく、チェックに使われるだけなので、仮になくてもビルドはできてしまいます。

Ubuntu の場合はつぎのコマンドでインストールできます。(最新版が必要な場合は、Windows の場合と同じ場所からダウンロードして、独自にインストールします)

> sudo apt install -y libboost-dev

Windows 側は次のサイトから Unix 用をダウンロードして、展開した後、適切なフォルダにコピーしておきます。

　http://www.boost.org/users/download/


#プロジェクトの作成
プロジェクトの作成ですが、下記の投稿を参考にしてください。

　[Visual Studio 2017 の Linux C++ 開発機能](https://qiita.com/tadnakam/items/4660d8fa5b1b72f9eb70)

Windows 側では Boost の場所をプロジェクトに教えてやる必要があります。プロジェクトのプロパティで Boost を保存したディレクトリをインクルードディレクトリに追加します。(参考 Fig.1)

![BoostIncludePath.png](https://qiita-image-store.s3.amazonaws.com/0/62802/d157e287-05e2-9bc3-4ef5-10e2cc514823.png)

Fig.1 インクルードパスの追加

#サンプルプログラム
次のサンプルプログラムは、Boost の機能を利用して、文字列を指定した区切り文字で分割し、再び結合するものです。

List1. サンプルプログラム

```C++
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/join.hpp>
#include <boost/foreach.hpp>
#include <boost/algorithm/string/classification.hpp>
 
using namespace std;
using namespace boost;
 
//
//  Boost: 文字列の分割と結合のテスト
//  =================================
int main()
{
    const wchar_t* str0 = L"This is a pen.";
    vector<wstring> result;
 
    result = algorithm::split(result, str0, is_any_of(L" "));
 
    BOOST_FOREACH(wstring s, result)
    {
        wcout << s << endl;
    }
 
    wstring joined = algorithm::join(result, L",");
 
    wcout << joined << endl;
 
    // getchar();
    return 0;
}
```

プロジェクトを実行すると、最初の回だけ Linux への接続のためのダイアログが開きます。接続情報を入力するとビルドが行われ、エラーがなければプログラムが Linux 側で実行されます。もし、ブレークポイントを設定しておけば、そこで停止します。

Linux Console は「デバッグ」メニューの中にあるので、メニューをクリックして開きます。

![BoostLinuxConsole.png](https://qiita-image-store.s3.amazonaws.com/0/62802/e98992c2-285b-08fe-fe43-8d90662c4ae5.png)
Fig.2 Linux Console

-
大量リクエストをノンプログラミング（ほぼ）で捌くEvent Hubs、Stream Analyticsの勘所

[以前の記事](https://qiita.com/yoshiro_ma/items/2f98603787ad2b0d244e)でも紹介していますが、AzureのEventHubs、StreamAnalyticsを利用することで簡単に大量のリクエストデータを捌き、リアルタイムにデータを登録することができます。この2サービスの利用にあたり事前に知っておいたほうがよさそうなポイントをまとめました。

## Event Hubs
受信したメッセージは[最大7日間](https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-faq#what-is-the-maximum-retention-period-for-events
)の保存が可能ですが、これは意図した再処理や定常的に過去の集計処理を行う場合に利用することを目的としています。

StreamAnalyticsなどを利用してリアルタイムにデータ登録を行う場合は不要で、受信したメッセージを単純に保存しておきたい場合は[Capture機能](https://docs.microsoft.com/ja-jp/azure/event-hubs/event-hubs-capture-overview)を利用します。

CaptureはEventHubsのストリームデータを監視し、定めた時間間隔またはデータ量に達した場合に[Avro](http://avro.apache.org/)形式でStorageに格納されます。
※ただしストリームデータが無い場合も時間毎にファイルが作成されます。

格納ファイルは以下のような形式指定することで、日付ごとのフォルダに時間・パーティション単位のファイルが作成できます。
```{Namespace}-{EventHub}/{Year}-{Month}-{Day}/{Hour}{Minute}{Second}-{PartitionId}```

上記構成でスループットユニットを1として1ヶ月間稼働した場合のコストは約100ドル前後となります。

## Stream Analytics
### 参照データの更新
マスタデータなどをStorageにjson形式で用意することで、参照データとしてストリームデータと紐付けて出力することができます。

``` sql
SELECT
  IEH.item_no, 
  SMJ.item_name, 
  dateadd(hour,(9),System.Timestamp) AS create_at
INTO
  [outputsqldb] OSD
FROM
  [inputeventhubs] IEH
JOIN 
  [storagemstjson] SMJ 
ON 
  IEH.item_no = SMJ.item_no 
```
ただし参照データを更新した際は**StreamAnalyticsの再起動**が必要となります。※REST APIを利用した起動／終了は[こちら](https://docs.microsoft.com/en-us/rest/api/streamanalytics/stream-analytics-job#start)

### エラー時のデータ特定と再処理
EventHubsと連携する想定で、受信メッセージが出力先の形式に変換できない場合、Data Conversion Errorsが発生します。この時、EventHubs内のどのメッセージがエラーとなったか特定することができません。

なので、データ内にはメッセージ毎に一意となる情報を持たせることで、Captureから特定して再送信することが実現できます。

エラーポリシーを再試行としている場合、エラー時は失敗したデータが蓄積され内部のメモリ使用量が増加していきます。この状態が続くと最終的にはStreamAnalyticsは再起動または停止となります。

EventHubs連携時のデータの流れについて、まず、StreamAnalyticsからEventHubsにデータ送信リクエストを送り、それに応える形で、 EventHubsがメッセージをStreamAnalyticsに送ります。これによりエラー発生時はEventhubsの「Incoming Requests（StreamAnalyticsからのデータ送信要求）」と「Outgoing Messages（要求に答えて送ったメッセージ数」の値も増加することになります。

### SUの設定値
1SU（ストリーミング ユニット）はジョブのテストなどを行うための利用を目的としており、必要に応じて使用可能なメモリ量の**約60％程度までシステム稼働の為に使用**されます。

なので、データ量が一定でもメトリクス上で、メモリ量の変動が見られるケースがあります。公式の[ジョブに必要な数](https://docs.microsoft.com/ja-jp/azure/stream-analytics/stream-analytics-streaming-unit-consumption#how-many-sus-are-required-for-a-job)では6から始めて値を調整する方法を推奨しています。

### 降格済み
稼働中に「降格済み」といったアラートが表示される場合があります。StreamAnalyticsでは、いつのデータを読み取って出力したかの管理が非常に重要で、これを日時 (TIMESTAMPまたはTIMESTAMP BY) の情報を使用して実現しています。

例えばTIMESTAMP BYを指定しているにも関わらず、入力データに指定の列が含まれない場合、到着日時を代わりに本データのTIMESTAMPとします。これが**降格する**という状況です。

この影響としては出力先のデータに抜け落ちが発生する可能性があります。なのでTIMESTMP BYで指定する列は入力データに必ず含まれる列を指定する必要があります。
タスク管理専用のGitLabプロジェクトの作り方

# はじめに
> GitLabは、バージョン管理システムを主体としたRuby on Rails製のアプリケーション開発支援ツールです。

　[GitLab実践ガイド](https://www.amazon.co.jp/dp/4295003034/)より[^1]

　とあるように、Gitリポジトリ管理、issue管理、CI/CD、Wiki、コンテナレジストリ、GitLab Pages（静的サイトホスティング）、モニタリング、Kubernetes連携機能もあり、アプリケーション開発・運用のために統合的な機能を提供するGitLabですが、その中でもプロジェクトをissue管理専用として使いたい（ソースコードの管理はしない）という状況がありましたので、その解決策を共有させていただきます。


# Issuesのみを表示する
　何を言っているかというと、プロジェクト作成時、デフォルトではIssues、Repository、Merge Requests、CI/CD、Wiki、Snippetsが表示されていますが、Issuesのみを表示したいということです。
 
 　以下はプロジェクト作成時の初期状態のトップページですが、Repositoryが表示されます。このプロジェクトではソースコードの管理などは想定していないため、このトップページのままなのは少し気になります。（READMEを書いてもいいですが、、、）
 
<img width="1437" alt="Screen Shot 2018-03-06 at 10.03.25.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/3d2eb3fd-9049-a33d-5b74-2cd53751a415.png">


　これをIssuesのみの表示にするためには、Settings > General > Permissions から設定を行うことができます。今回はIssuesのみを利用したいので、Repository（Merge Requests、Pipelines、Container registry）、Wiki、Snippetsは無効にして保存します。
 
**変更前(プロジェクト作成時の初期状態)**
![Screen Shot 2018-03-07 at 19.00.22.png](https://qiita-image-store.s3.amazonaws.com/0/160547/eff5f6b4-c18d-28c0-349b-72da31214584.png)


**変更後**
![Screen Shot 2018-03-10 at 17.36.24.png](https://qiita-image-store.s3.amazonaws.com/0/160547/1af46b06-9806-1b70-1788-caff7b068e51.png)


　その後、プロジェクトのトップページを確認してみます。（写真はわかりやすいようにissueを作成してあります。）左側に表示されているタブバーを確認してみても、Repository、Wiki、Snippetsが表示されていないことがわかります。

 
<img width="1440" alt="Screen Shot 2018-03-06 at 10.19.07.png" src="https://qiita-image-store.s3.amazonaws.com/0/160547/64d1ac4b-9744-8c98-31ab-4645332a873e.png">

実際のGitLab Projectです。
↓↓↓↓↓↓↓↓↓↓↓↓↓↓
https://gitlab.com/jumpyoshim/only-issues

# もしうまくいかなかったら
　User Settings > Preferences > Behavior の設定がデフォルト状態ではないかもしれません。デフォルトの設定に変更してあげることで期待通りの挙動になるかもしれません。試してみてください。（User Settingsは右上のアイコンをクリックすると表示されます。）

![Screen Shot 2018-03-07 at 20.05.13.png](https://qiita-image-store.s3.amazonaws.com/0/160547/bd4e33e8-65ac-7085-1328-bba6b3e16477.png)


# おわりに
> GitLabのビジョン
誰しもがすべてのデジタルコンテンツを共同作業できるようにし、チームが効果的に協力し合いよりよい成果をより早く達成できるようにすることです。

　[GitLab実践ガイド](https://www.amazon.co.jp/dp/4295003034/)より

　注目していただきたいのは、「誰しもが」 という点です。また、以下のようにも述べられています。

> GitLabを利用すべきメリットは、誰しもが容易に利用できるWebインターフェイスを社内環境に構築できることです。コンソールを利用せずともブラウザからすべてのコンテンツ管理ができるので、エンジニアだけでなく、経営層やマーケティングといったビジネス側のメンバーとも共通の目線でコンテンツを共有することができます。 

　こういったGitLabのビジョンやメリットを考慮したとき、チーム内のいろんな職種の人の利用が想定され、かつタスク管理としてしか利用しない場合は、不要なRepositoryやSnippetは非表示にした方が良いような気がします。多機能は必ずしもユーザにとって使いやすいとは言えません。
 
 　何はともあれ、簡単に設定できるのでぜひ活用してみてください。
  
 
[^1]: GitLab実践ガイド第1章は[無料公開](https://impress.tameshiyo.me/9784295003038)されています。
Rubyでa == 1 && a == 2 && a == 3をTrueにする

# はじめに
何番煎じかわからないですが、rubyでやってみた記事が見つからなかったのでやってみました。
結論から言うと、言語仕様で演算子のオーバーライドが許可されてるので、非常に簡単でした。

# コード

```ruby
class MyClass
    def ==(other)
        true
    end
end

a = MyClass.new

puts a == 1 && a == 2 && a == 3
```

# 元ネタ
[Can (a== 1 && a ==2 && a==3) ever evaluate to true?](https://stackoverflow.com/questions/48270127/can-a-1-a-2-a-3-ever-evaluate-to-true)
ubuntuサーバをansible制御下に置くための準備

centosの時よりも詰まったり準備が必要でした。
今後も何度か行いそうなので、こちらに忘備録を残します。

ubuntu16.04

## やること
* 実行ユーザ作成
* (nano -> vimにする)
* ansibleのsudo追加
* 鍵の設定
* (~/.ssh/configに追記)
* python2.7のインストール
* dry-runのためにpython-aptをインストール

## 実行ユーザ作成
```
$ sudo adduser ansible
```

## nano -> vimにする
vimmerが多いところは変えておいてあげると親切です。

```
$ sudo update-alternatives --config editor
```

## ansibleのsudo追加
構築系の処理は `become: yes` を使うことが多いので、その際パスワードをなしにsudo使えるようにしておくと良いかもです。

```
$ vi /etc/sudoers.d/users

#以下を追記
ansible ALL=(ALL)   NOPASSWD: ALL
```

## 鍵の設定
ansibleがインストールされているサーバで作成した、該当の公開鍵をクライアントの方に登録します。
以下のコマンドをansibleが入っているサーバから実行。

```
$ ssh-copy-id -i ~/.ssh/[[対象の公開鍵]].pub ansible@<target_host>
```

## ~/.ssh/configに追記
ansibleを実行させた時にスムーズにsshさせるために、クライアントの情報を追記します。
ansibleサーバ: ~/.ssh/config に以下を追記。

```
host [[対象サーバのホストを記入]]
StrictHostKeyChecking no
IdentityFile ~/.ssh/[[秘密鍵]]
```
↑最低限の設定

## python2.7のインストール

ansibleはデフォルトではpythonの2系を使うので、2.7をインストールします。
最初はpyenvでバージョン管理しようとしたのですが、playbookでsudoのtasksを実行させようとした時にできなかったので、結局普通に2.7をインストールしてパスを書き換えました。
もっと他にいいやり方があるかもしれません..

```
$ sudo apt-get install python2.7
```
デフォルトではpython2.7と3.6が入っているらしいですが、minimalインストールの時は2系が入っていなかったので、無ければいれます。

このままだと `python2.7 -V` のようにしないとコマンドがつかえないので、以下のようにシンボリックリンクを作ります。

```
$ ls -la /usr/bin/python*
#pythonコマンドがないことを確認してから

$ sudo ln -s /usr/bin/python2.7 /usr/bin/python

#確認
$ ls -la /usr/bin/python
lrwxrwxrwx 1 root root       9 Nov 24 09:52 /usr/bin/python -> python2.7
$ python -V
Python 2.7.12
```

ちなみにansibleでpython3系を使わせるようにしたい時は、playbook実行時に以下のオプションをつけると動きます。
`-e 'ansible_python_interpreter=/usr/bin/python3'`

## dry-runのためにpython-aptをインストール

これが無ければ --check モードでの実行ができません。

```
$ sudo apt-get install python-apt
```
個人的にはよく使うので python-selinuxも入れておく。
(ansibleのaptモジュール使って入れようとすると毎回エラーが出てつまるから。)

以上。
[C#][EntityFramework]EntityFrameworkでPostgreSQLにアクセスする

業務で使ったので備忘録。
以下のURLを参照。
http://cream-worker.blog.jp/archives/1062859618.html

***注意点は自動でapp.config（もしくはweb.config）に設定される以下の部分の「oldVersion」と「newVersion」をNugetでインストールされたNpgsqlのバージョンに合わせること***

```
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Npgsql" publicKeyToken="5d8b90d52f46fda7" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-2.2.7.0" newVersion="2.2.7.0" /> // <= ココのバージョンを合わせる
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
```

あと複合キーについてもメモ。
https://qiita.com/hahifu/items/58819f6f36433f20884d

以上。
Project Euler 49「素数数列」

[2つ前の激遅コード](https://qiita.com/yopya/items/6706f79766b576c70b0d)を自分なりに高速化しようと試みるもパクり以外に思いつかない。
なので気分転換に先へ進む。
もうちょっと成長したら再トライしようと思う。~~（多分しない）~~

# Problem 49 「素数数列」
項差3330の等差数列1487, 4817, 8147は次の2つの変わった性質を持つ.

(i)3つの項はそれぞれ素数である.
(ii)各項は他の項の置換で表される.
1, 2, 3桁の素数にはこのような性質を持った数列は存在しないが, 4桁の増加列にはもう1つ存在する.

それではこの数列の3つの項を連結した12桁の数を求めよ.

```python
def hoge():
    f = lambda n: sorted(list(str(n)))
    for n in range(1000, 3340): # 10000 - 6660 = 3340
        if n == 1487: continue # 問の例はスキップ
        N = [ n + 3330 * i for i in range(3) ]
        if all( is_prime(m) for m in N ) and \
           f(N[0]) == f(N[1]) == f(N[2]):
            return ''.join( str(m) for m in N )

def is_prime(n):
    if n < 2: return False
    if n == 2: return True
    if n % 2 == 0: return False
    return all(n % i != 0 for i in range(3, int(n ** 0.5) + 1, 2))

print(hoge())
```
超新人プログラマー(見習)がまず手にした本と参考にしたWEBサイト〜python編〜

#初めましての投稿

まず自己紹介を。

都会で頑張る田舎者です。
文系大学卒の元OLです。
ひょんなことからデータサイエンシストへ弟子入りし、プログラミングの世界に導かれやってきました。
Python、git、docker、Ubuntu、raspberry piなどなどを修行しております。
何卒よろしくお願いいたしますm(_ _)m

そこで、まずはPythonについて。
→[Gitについてはこちら](https://qiita.com/petadimensionlab/items/14af9ef7c3260e02c103)

どの本・どのサイトを使用して修行しているかをご紹介したいと思います。
同じようにプログラミングの世界に飛び込もうか考え中の方にも参考になれば幸いです。

#参考本
###1.[たった1日で基本が身に付く! Python超入門](https://www.amazon.co.jp/%E3%81%9F%E3%81%A3%E3%81%9F1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%E8%BA%AB%E3%81%AB%E4%BB%98%E3%81%8F-Python%E8%B6%85%E5%85%A5%E9%96%80-%E4%BC%8A%E8%97%A4-%E8%A3%95%E4%B8%80/dp/4774191124/ref=sr_1_1?s=books&ie=UTF8&qid=1520475852&sr=1-1&keywords=1%E6%97%A5%E3%81%A7%E5%9F%BA%E6%9C%AC%E3%81%8C%08%E8%BA%AB%E3%81%AB%E3%81%A4%E3%81%8Fpython)
（分かり易度：★★★）

こちら、本当に最初に手にした本です。
プログラミング？ぱ、ぱいそん？え、なにそれ？？　のレベルのものでも分かりやすく進めることができます。とても親切で優しい本です。
また、sampleデータをダウンロードすることが出来ます。（本に記載されているコードが全てはいっております）
なので、じっくりと実際に自分でも動かしながら学ぶことができます。
すばらしい！！


###2.[Pythonエンジニア ファーストブック](https://www.amazon.co.jp/Python%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2-%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%83%96%E3%83%83%E3%82%AF-%E9%88%B4%E6%9C%A8-%E3%81%9F%E3%81%8B%E3%81%AE%E3%82%8A/dp/4774192228/ref=sr_1_1?s=books&ie=UTF8&qid=1520477141&sr=1-1&keywords=python%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E3%83%95%E3%82%A1%E3%83%BC%E3%82%B9%E3%83%88%E3%83%96%E3%83%83%E3%82%AF)
（分かり易度：★★☆）

こちらの本”他のプログラミング言語の知識がある前提”で執筆されており、仕事のために必要な「はじめの一歩」として書かれた本のようで、スクレイピング・データ解析・webアプリケーション開発など多岐に渡っております。（この本でGitなるものを知りました。）
慣れてきたてpythonを生かしてステップアップしたい！と思う方にオススメです。

実はというとまだ半分までしか読めておりません。ところどころ気になる箇所をつまみ食いしている次第です。
読破したらまた感想などを更新したいと思います！

#参考Webサイト
###1.公式チュートリアル
https://docs.python.jp/3/tutorial/index.html
（分かり易度：★★☆）
公式の和訳です。こちらも若干のプログラミング知識がないと難しいと感じます。「たった1日で基本が身に付く! Python超入門」を読んでから触った方が良いかな？と思います。

###2.pytho-izm（学習サイト）
http://www.python-izm.com/
（分かり易度：★★☆）
私の感覚では、公式より手を出しやすかったです。内容は公式と同等です。

###3.Udemy
https://www.udemy.com/courses/search/?q=python&src=ukw
（分かり易度：★★★）※コースによりけり。
有料動画学習サイトです。再生スピードを変えられるので、初心者でも安心。また、入門レベルから応用レベルまでのコースがあり、私は「実践 Python データサイエンス」を主に視聴してます。1コース10,000円以上しますが、頻繁に出血大サービスセールをするようなので値下がりした時に。


* * *
あと、、、[ドットインストール](https://dotinstall.com/lessons/basic_python_v3)も良いみたいですね。
上記の本・webを見漁った後に知りました。とても初心者に優しいみたいなので、復習もかねて後日見てみたいと思います。（git・dockerはお世話になりました！）

以上です！他色々役立ちそうな本・サイトを見つけ次第更新したいと思います。
Travis CI: しばらくの間、ヘッドレスChromeはbetaを指定したほうがいい

追記 2018-09-14: 現在では、安定版のChromeでもエラーは出なくなりました。
下記のようにベータ版を使う必要はありません。

- - -
私は、Laravelで作った簡素なCRUDのテストをTravis CIで行っています。
:link: 関連記事: [Laravel: TravisCIでテストしてCodecovでカバレッジを取得する](https://qiita.com/sutara79/items/2e4c77024364193c06cb)

今日もコミットをGitHubへプッシュして、Travis CI上のヘッドレスChromeでブラウザテストを実行してもらっていたら、下記のようなエラーが。

```text:TravisCIのログ
$ php artisan dusk

(中略)

There were 5 errors:
1) Tests\Browser\LoginTest::testLogin
Facebook\WebDriver\Exception\UnknownServerException: unknown error: call function result missing 'value'
  (Session info: headless chrome=65.0.3325.146)
  (Driver info: chromedriver=2.33.506092 (733a02544d189eeb751fe0d7ddca79a0ee28cce4),platform=Linux 4.4.0-101-generic x86_64)
```

`call function result missing 'value'`でググると、chromedriverのv2.35ならば解決するそうです。

:link: [Stack Overflowの質問](https://stackoverflow.com/questions/48609069/org-openqa-selenium-webdriverexception-unknown-error-call-function-result-miss)

Travis CIではどうすればいいのかと思いましたが、chromeアドオンのベータ版を利用することで解決しました。
:link: [Travis CIの公式ドキュメント](https://docs.travis-ci.com/user/gui-and-headless-browsers/#Using-the-Chrome-addon-in-the-headless-mode)


```diff:.travis.yml
 dist: trusty # Linux環境
 addons:
-  chrome: stable
+  chrome: beta

(中略)

 script:
-  - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
+  - chrome --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
```
.Net Core で F# を使う

次のベージを参考にしました。
[Getting started with F# and .NET Core](https://julienblanchard.com/articles/getting-started-with-fsharp-and-dotnet-core)

次のバージョンで確認しました。

```text
$ dotnet --version
6.0.302
```

サンプルプログラムの用意

```bash
mkdir example
cd example
dotnet new console -lang f#
dotnet add package Newtonsoft.Json
```

Program.fs が出来るので、そのファイルを次のように改造します。改行コードも変更して構いません。

```fsharp:Program.fs
﻿// Learn more about F# at http://fsharp.org

open System

[<EntryPoint>]
let main argv =
    printfn "こんにちは"
    printfn "Hello World from F#!"
    printfn "2022年8月7日"
    0 // return an integer exit code
```

コンパイル

```bash
dotnet build
```

実行

```text
$ dotnet run
こんにちは
Hello World from F#!
2022年8月7日
```

実行ファイル（バイナリー）を作成するには、

```bash
dotnet publish -c release -r linux-x64
```

作成した実行ファイル（バイナリー）を実行

```text
$ ./bin/release/net6.0/linux-x64/example
こんにちは
Hello World from F#!
2022年8月7日
```

C# の使い方はこちら
[Linux で .Net Core を使う](https://qiita.com/ekzemplaro/items/8f72ebc77f15dcd6871e)