OmniAICreator/Qiita-1.07M huggingface dataset:
kubectl でのクラスタの切り替え設定


## gcloud でのGKEクラスタ一覧および切り替え

一覧

```
$ gcloud container clusters list
NAME LOCATION       MASTER_VERSION  MASTER_IP       MACHINE_TYPE        NODE_VERSION  NUM_NODES  STATUS
xxx  asia-east1     1.13.7-gke.8    35.221.128.181  n1-standard-2       1.13.7-gke.8  5          RUNNING
yyy  us-central1    1.13.7-gke.8    35.238.182.245  custom-2-65536-ext  1.13.7-gke.8  1          RUNNING
zzz  us-central1-a  1.13.7-gke.8    35.225.158.168  n1-standard-1       1.13.7-gke.8  3          RUNNING
```

切り替え。

```
$ gcloud container clusters get-credentials $NAME --zone=$ZONE --project $PROJECT_ID
```

または

```
$ gcloud container clusters get-credentials $NAME --region=$REGION --project $PROJECT_ID
```

Tips: `$HOME/.kube/config` に切り替え結果が書き込まれる

`get-credentials` を一度しておくと、 kubectl でのコンテキスト一覧に表示されるようになる。

## kubectl でのコンテキスト一覧および切り替え

一覧

```
$ kubectl config get-contexts
```
切り替え

```
$ kubectl config use-context $CLUSTER_NAME
```

Currentの表示

```
$ kubectl config current-context
```

**おまけ: クラスタおよびコンテキスト一覧と削除**

`get-credentials` がまとめて作ってくれているが、内部的にはクラスタ設定と、コンテキスト(クラスタ+認証)設定が別々に作られている

クラスタの一覧および削除

```
$ kubectl config get-clusters
$ kubectl config delete-cluster $CLUSTER_NAME
```

コンテキストの一覧および削除

```
$ kubectl config get-contexts
$ kubectl config delete-context $CLUSTER_NAME
```

## おまけ: peco および zsh completions を使った切り替え

[peco](https://github.com/peco/peco) や zsh completions で一覧からの選択切り替えができるようにしておくと便利

```zsh:.zshrc
function gke-activate() {
  name="$1"
  zone_or_region="$2"
  if echo "${zone_or_region}" | grep '[^-]*-[^-]*-[^-]*' > /dev/null; then
    echo "gcloud container clusters get-credentials \"${name}\" --zone=\"${zone_or_region}\""
    gcloud container clusters get-credentials "${name}" --zone="${zone_or_region}"
  else
    echo "gcloud container clusters get-credentials \"${name}\" --region=\"${zone_or_region}\""
    gcloud container clusters get-credentials "${name}" --region="${zone_or_region}"
  fi
}
function kx-complete() {
  _values $(gcloud container clusters list | awk '{print $1}')
}
function kx() {
  name="$1"
  if [ -z "$name" ]; then
    line=$(gcloud container clusters list | peco)
    name=$(echo $line | awk '{print $1}')
  else
    line=$(gcloud container clusters list | grep "$name")
  fi
  zone_or_region=$(echo $line | awk '{print $2}')
  gke-activate "${name}" "${zone_or_region}"
}
compdef kx-complete kx
```

`kx [TAB]` で補完が表示され、選択すると切り替え。
もしくは `kx[ENTER]` とすると peco で絞り込み検索ができます。
【Unity】 batch mode で Import Package するときにハマったこと

# TL;DR
- Unityのバージョンは 2018.3.6f1 です。
- 普通の AssetDatabase.ImportPackage だと処理完了前にprocess が終わってしまって取り込めない
- internal Method だけど AssetDatabase.ImportPackageImmediately というのがあるのでそれをReflectionで使いましょう

```csharp:importpackage.cs
public static void ImportPackage()
{
    var packageName = "Sample.unitypackage";
    var type = typeof(AssetDatabase);
    var binding = BindingFlags.NonPublic | BindingFlags.Static;
    var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding);
    assetDatabaseMethodInfo.Invoke(type, new object[] {packageName});
}
```

# batch mode で ImportPackage がうまくいない
- スクリプトリファレンスに記載されているAPIは [AssetDatabase.ImportPackage](https://docs.unity3d.com/ja/current/ScriptReference/AssetDatabase.ImportPackage.html)
- 普通にこれで試す

```csharp:importpackage.cs
public static void ImportPackage()
{
    //batch mode なので第2引数の interactive は false
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}
```

- 結果、うまくインポートできてない
- Logを見ても実行自体には成功している

# MenuItem にしてGUI上で試す
```csharp:importpackage.cs
[MenuItem("ImportPackage")]
public static void ImportPackage()
{
    //batch mode なので第2引数の interactive は false
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}
```
- 普通にAsset/ImportAsset/CutstomPackage の流れでImportしたときと同じように取り込まれる
- ちゃんと取り込まれてるのはGit差分でわかる。

？？？？？？？？

# callback を定義してどこまで行ってるか見る
- [AssetDatabase-ImportPackageCallback](https://docs.unity3d.com/ScriptReference/AssetDatabase.ImportPackageCallback.html) でそれぞれのタイミングでLogを吐き出させる

```csharp:importpackage.cs
public static void ImportPackage()
{
    AssetDatabase.importPackageCompleted += ImportCompleted;
    AssetDatabase.importPackageCancelled += ImportCancelled;
    AssetDatabase.importPackageFailed += ImportCallBackFailed;
    AssetDatabase.importPackageStarted += ImportStarted;
    AssetDatabase.ImportPackage("Sample.unitypackage", false);
}

static void ImportCompleted(string packageName)
{
    Debug.Log ("Completed " + packageName);
    AssetDatabase.importPackageCompleted -= ImportCompleted;
}

static void ImportCancelled(string packageName)
{
    Debug.Log ("Cancelled " + packageName);
    AssetDatabase.importPackageCancelled -= ImportCancelled;
}

static void ImportCallBackFailed(string packageName, string _error)
{
    Debug.Log ("Failed " + packageName);
    AssetDatabase.importPackageFailed -= ImportCallBackFailed;
}

static void ImportStarted(string packageName)
{
    Debug.Log ("Started " + packageName);
    AssetDatabase.importPackageStarted -= ImportStarted;
}
```
- 実行したLogを見ると Started Sample.unitypackage しか出てない
- おかしいぞ？

# AssetDatabaseの実装を見に行く
- ImportPackageImmediately というのが ImportPackageとは別にあるのを見つける
- 絶対これやんけ！！！
- ただし、internal method なので普通には使えない
- Reflectionで解決しよ。。。

```csharp:importpackage.cs
public static void ImportPackage()
{
    var packageName = "Sample.unitypackage";
    var type = typeof(AssetDatabase);
    var binding = BindingFlags.NonPublic | BindingFlags.Static;
    var assetDatabaseMethodInfo = type.GetMethod("ImportPackageImmediately", binding);
    assetDatabaseMethodInfo.Invoke(type, new object[] {packageName});
}
```

- 結果、無事 batchModeでImportPackageできました。
Gitコマンド


### Gitの設定
- 設定ファイルを作る
  - `git config`
  - `git config --list`　※Gitの設定内容を確認する


### リポジトリの作成
- カレントディレクトリにローカルリポジトリの作成する
  - `git init`


### コミットの作成
- ステージングエリアに変更を登録する　=コミット予約
  - `git add`
  - `git add .`　※カレントディレクトリ配下の全てのファイルを追加
  - `git add subDirectory`　※「subDirectory」ディレクトリ配下のファイルを全て追加
  - `git add subDirectory/file1.md`　※「subDirectory」ディレクトリ配下の file1.md を追加

- 変更したファイルをまとめてステージングエリアに追加する
  - `git add -A`　※「-A」は、「--all」とも書ける

- コミットを作成する
  - `git commit`
  - `git commit -m "コミットメッセージ"`　※1行コミットのみ 

- 更新されたファイルをステージングエリアに追加して、そのままコミットする
  - `git commit -am "コミットメッセージ"`　※新規ファイルの場合はgit addコマンドを使う必要がある


- Git管理下のファイルやディレクトリを削除する
  - `git rm`
  - `gir rm -r`　※ディレクトリの場合は「-r」オプションを付ける


### 状態の確認
- ローカルリポジトリの状態を確認する　※ファイルの状態を確認
  - `git status`  
  (git statusコマンドは使用中のブランチを確認することもできる)

- コミットの履歴を確認する
  - `git log`
  - `git log -p`　※ファイルの差分も確認できる


### 差分を確認
- ファイルの差分を確認
  - `git diff`　※ローカルリポジトリ(ワークツリー)とステージングエリア
  - `git diff --cached`　※ステージングエリアとGitディレクトリ(前回のコミット)の差分

- 今使っているブランチをmasterブランチと比較
  - `git diff master`


### 状態の復元
- 編集内容を取り消す
  - `git checkout ファイル名`  
    　　例）git checkout -- Git_memo.md  
  　　※ファイルの状態が直前のコミット(または直前のステージングエリア)に戻る。  
  　　※ファイルを新規作成したり、ファイル名を変更した時は、操作を取り消せないので自分で削除する

- ステージングを取り消す（編集内容は残る） = コミット予約の取り消し
  - `git reset ファイル名`  
　  　例）git reset HEAD Git_memo.md  
　  　※HEADは最後にコミットした状態。つまり最後のコミットと同じ状態にリセットする  
　  　※ファイルの状態はそのままでステージングエリアへの登録だけを取り消す


### 戻る
- 特定のコミットに戻す
  - `git reset --hard コミットid`  
  ※コミットidは、git logコマンドで調べて、戻りたいコミットのidを指定  
  ※戻った以降のコミットをなかったことにする(コミットログが消える)  
  ※masterではなくブランチの場合は切り替えを忘れずに。

  - `git revert コミットid`  
  ※コミットログを残したまま戻る。
  ※非推奨

- 特定のファイルのみ、コミットのバージョンを戻す
  - `git checkout コミットid ファイルパス`


### ブランチ
- ブランチの作成
  - `git branch ブランチ名`

- 使用中のブランチを確認
  - `git branch`　※先頭にアスタリスクが付いているのが今使っているブランチ

- ブランチ切り替える(=チェックアウト)
  - `git checkout master(使いたいブランチ名)`

- チェックアウトと同時にブランチを作成する
  - `git checkout -b ブランチ名`

- ブランチの削除(ローカルレポジトリ) ※マージ済みのブランチを削除する
  - `git branch --delete ブランチ名`  
  　　　or
  - `git branch -d ブランチ名`

- ブランチの削除(ローカルレポジトリ) ※マージ状況に関わらずブランチを削除する
  - `git branch -D ブランチ名`

- ブランチの削除(リモートレポジトリ)
  - `git push --delete origin ブランチ名`  
  　　　or
  - `git push origin :ブランチ名`


### アップロード
- 現在のローカルリポジトリの内容をリモート側（GitHub側）にアップロードする
  - `git push`  
　  　例）git push origin master  
　  　例）git push origin ブランチ名　※originはプッシュ先のリモートリポジトリの名前を表す


### merge と rebase
- rebase
  - `git rebase` つなぐ元にするブランチ名
  - `git rebase -i` ひとまとめにする地点の一つ前のコミットID

- merge
  - `git merge マージ元(取り込みたいブランチ名など)`


### リモートリポジトリの内容をローカルリポジトリに取り込む
- pull (取得内容がワークツリーにまで反映される)
  - `git pull origin master(プルするブランチ名)`  
  ※originはプル先のリモートリポジトリの名前を表す

- fetch (ローカルリポジトリへの取得しか行わず、ワークツリーには反映させない)
  - `git fetch origin`  
  ※originはフェッチ先のリモートリポジトリの名前を表す

**注意
ブランチを切り替えずにgit pullコマンドを実行すると、今使っているローカルリポジトリのブランチに、リモートリポジトリのmasterブランチがマージされてしまうので注意しましょう。**

  
  
- ローカルリポジトリに存在しないブランチを取得するコマンド
  - `git fetch origin`  
　　　　↓続けて  
  - `git checkout ブランチ名`



### リモートレポジトリの設定
- リモートレポジトリの設定を確認する
  - `git remote -v`

***

### コミット&プッシュのサイクル

`$ git add ファイル名`
　　　↓
`$ git commit -m "コミットメッセージ"`
　　　↓
`$ git push origin master`
ruby オブジェクト設計



### 単一責任

変更に対応できるように


```

- wheelの切り出し

単一責任の為に

- initailizeの while=nil

変動に対応する

class Gear 
  attr_reader :chainring, :cog, :wheel

  def initialize(chainring, cog, wheel=nil)
    @chainring = chainring
    @cog = cog 
    @wheel = wheel
  end

  def ratio
    chainring / cog.to_f
  end

  def gear_inches
    ratio * wheel.diameter
  end
end

class Wheel
  attr_reader :rim, :tire
  
  def initialize(rim, tire)
    @rim = rim
    @tire = tire
  end

  def diameter
    rim + (tire * 2)
  end

  def circumference
    diameter * Math::PI
  end
end

@wheel = Wheel.new(26, 1.5)

p @wheel.circumference

gear2 = Gear.new(11,11,@wheel)


p gear2.gear_inches
```



###　引数のコントロール

- ハッシュで格納

arges = ハッシュ

- 引数の格納順番への依存はなくなる

```
class Gear
  
  attr_reader :chinring, :cog, :wheel

  def initialize(arges)
    @chinring = arges[:chinring]
    @cog = arges[:cog]
    @wheel = arges[:wheel]
  end

  def fog
    chinring + cog + wheel
  end
end

class Wheel
  attr_reader :ring

  def initialize(ring)
    @ring = ring
  end

  def ee
   ring
  end

end

p Gear.new(chinring: 52, cog: 11, wheel: Wheel.new(11).ee ).fog


```
GhostScriptを使ってPDFファイルを印刷する

PDFファイルの印刷といえばAcrobat Readerですが、PDFファイル印刷の別解としてオープンソースのGhostScriptを使う方法があります。この記事ではWindows版GhostScriptのCUIエンジンgswin64c.exe(32ビット版はgswin32c.exe)を使ってPDFファイルを印刷します。

# 前提
この記事ではWindows10にインストールしたgswin64c.exeを使っています。
実行するためには https://www.ghostscript.com/download/gsdnld.html からインストーラーをダウンロードし、実行パソコンにGhostscriptをインストールする必要があります。
コマンドライン引数に与えるファイル名、パラメータは適宜読み替えてください。

# 実行方法
コマンドプロンプトで以下の通り入力して実行します

```ruby:コマンドプロンプト
C:\Program Files\gs\gs9.27\bin\gswin64c -r300 -dNOPAUSE -dBATCH -sDEVICE=mswinpr2 -sOutputFile="%printer%EPSON LP-S950" d:\123456.PDF  
```

このコマンドで、PDFファイル「D:\123456.PDF」がローカルプリンタ「EPSON LP-S950」に確認ダイアログなしで印刷できます。ポイントは-(ハイフン)付きの実行時オプションをファイル名の前に記載することです。ファイル名の後に記載するとそのオプションは無効になります。
一先ず印刷できればOKな方は、プリンタ名とファイル名を読み替えて実行すればプリンタに出力されます。
オプションについて詳しく知りたい方は、GhostScriptのドキュメント https://www.ghostscript.com/doc/9.27/Use.htm を参照ください。
AE　Radar Chart （サンプルプロジェクト有）

#作成例
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">レーダーチャートを作る機会があったので作成してみました。<br>プロジェクトをダウンロード出来ます。<br>詳しくはキータにて<a href="https://t.co/RN4OH1Qrd5">https://t.co/RN4OH1Qrd5</a> <a href="https://t.co/ozpyG0SQIq">pic.twitter.com/ozpyG0SQIq</a></p>&mdash; YouTool (@YouTool3) <a href="https://twitter.com/YouTool3/status/1124166552817811458?ref_src=twsrc%5Etfw">2019年5月3日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>



#取説
Global Control（調整レイヤー）に変更出来るパラメータがいくつか入っています。
まずは頂点の数でｎ角形を選べます。制限は3～10角形までとなっています。
あとは点のvalueを決めるPoint n(1~10)までのパラメータ変更
PointのサイズとPointのカラーです。

エクスプレッションの参考になればと思います。

#サンプルプロジェクトダウンロード先
https://www.dropbox.com/s/cyfs3rih02mqs4w/Radar%20Chart.aep?dl=0
Cocos Creator のチュートリアルをTypeScriptで書き直してみた

# 概要
https://docs.cocos2d-x.org/creator/manual/en/getting-started/quick-start.html
Cocos Creatorのquick start(チュートリアル) は2019年5月3日時点でJSのしかないようだったので勉強がてらTypeScriptで書き直しながらやってみた。

# 手法
基本は本家の方を見た方がいいが英語が苦手な方は以下で日本語の翻訳されていたりするのでこちらもオススメです！
https://qiita.com/hirodragon/items/aa73490b52ec4ca7f5ec
ただし上記の記事よりCocos Creatoorのバージョンがあがっているため最新だと動かない部分があります。cc.random0To1などの乱数系が最新だと廃止されているので最新のチュートリアルだとMath.random()を使ったものに変わっています。

Cocos CreatorでのTypeScriptの使い方は下記の公式のものを見るのがオススメです。
https://docs.cocos2d-x.org/creator/manual/en/scripting/typescript.html

他書き方で迷うようなことがあれば以下のリポジトリに書き直したものをあげたのでご活用ください。
Cocos Creatorのバージョンは2.10.0 です。Cocos Creatorのバージョンがあがると動かなくなる可能性もあるのでご注意ください。
https://github.com/nmrtkhs/start_project
「Android Studio」と全角で入力しても「案dロ位d」「s辻男」と誤変換しないようにする方法

## About
分からないことがあって調べるときに、検索ボックスに「Android Studio」と入力したはずが全角モードになっていて変な文字列になって入力し直し...ということがよくあったので、対策方法を考えました。


## 解決方法
ユーザー辞書ツールに単語として登録することで、スペースキーを押したときに正しく変換されるようにします。


## やり方（Windows 10の場合）
※ここではWindowsでのやり方を紹介していますが、Macでも辞書に登録するという同じ流れでできると思います。
１．タスクバーのIMEアイコンを**右クリック**する。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409628/7ed64043-4a1f-7393-cdce-4e0928c18901.png)
↓
２．「単語の登録」をクリックする
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409628/9ea65eed-45f6-2ef8-01fe-6d3a930cb374.png)
↓
３．下のスクリーンショットのように入力する。入力したら、「登録」ボタンをクリックする。
**単語：「Android」**
**よみ：「あんｄろいｄ」（全角にして「Android」とキーボードを押す）**
※分かりやすくするためにユーザーコメントに「変換ミス防止用」と入力してもOK
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409628/5d23a461-f05c-a0d0-5497-5b236ad2b20c.png)
↓
４．次にStudioを登録する。入力したら、「登録」ボタンをクリックする。
**単語：「Studio」**
**よみ：「ｓつぢお」（全角にして「Studio」とキーボードを押す）**
※分かりやすくするためにユーザーコメントに「変換ミス防止用」と入力してもOK
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409628/d9315ab4-6427-bf1d-10ea-ddfcee87ee9b.png)
↓
５．ウィンドウを閉じて完了！




## 完成した様子（GIF）
![screen_20190503_121741.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409628/ce0c49c7-ff08-33d0-4988-327266bb6fa7.gif)
「Android Studio」と入力したつもりでスペースキーを押しても、、、ご覧の通り！！
sidekiq　と redis

### sidekiqって？

action malerと使うことが多い

### ドキュメント

https://github.com/mperham/sidekiq/wiki/The-Basics

### 設定

このファイルに設定 `config/initializers/sidekiq.rb`

※設定ファイルは基本initilizerに書くみたい

`config/sidekiq.yml`

```
※毎回上記のオプションを入力するのは面倒なので、設定ファイルを作成します。

:verbose: false　（冗長な）
:pidfile: ./tmp/pids/sidekiq.pid
:logfile: ./log/sidekiq.log
:concurrency:  25
:queues:
  - default
  - event

```

###　コマンド

起動

`bundle exec sidekiq -q default event`

### 注意点

sidekiqはデプロイ時にプロセスが切れることがあるみたい


※capistranoで再起動する


https://qiita.com/nysalor/items/94ecd53c2141d1c27d1f


### 記事

http://thoames.hatenadiary.jp/entry/2018/03/23/020616


これもよさげ

http://shiro-
16.hatenablog.com/entry/2015/10/12/192412

### redis（インメモリDB）

Redis provides data storage for Sidekiq.

sidekiqのための ストレージみたい

### 設定

https://github.com/mperham/sidekiq/wiki/Using-Redis

```
Sidekiq.configure_server do |config|
  config.redis = { url: 'redis://redis.example.com:7372/0' }
end

Sidekiq.configure_client do |config|
  config.redis = { url: 'redis://redis.example.com:7372/0' }
end
```


### ジョブとは？

バックエンドでさまざまな方法によるキュー操作を実行する


### 用語


job
バックグラウンドで実行を操作する

エンキュー（enque）
　queに入れること
AWSでの自然言語処理開発環境整備

#EC2サーバーのセットアップ
##ec2 t2smallインスタンスを使用
##セキュリティーグループ・PEMファイル

#Python環境の構築
##pyenv・virtualenv

参考：AWS EC2内でpython環境セットアップからJupyter(ipython notebook)まで覚書
https://i101330.hatenablog.com/entry/2016/03/31/190236
##python ver3.8

#パッケージのインストール
##必要なパッケージの確認
numpy, pandas, tensorflow, schedule, 
どのpipかの確認

###mecabのインストール
####mecab本体のインストールとpython上で動かすための用意
https://qiita.com/elm200/items/2c2aa2093e670036bb30

####mecab-ipadic-neologd辞書
参考：neologd辞書のインストール方法
https://github.com/neologd/mecab-ipadic-neologd/blob/master/README.ja.md

#gitで使うものを引っ張ってくる
##その前に、メッセージ取得の方のslackAPIの再構築とそれを用いた編集
##AWS用に調整
##試してみる

#その他
##S3との接続
いらないかも
##共有ファイルでの編集にするには？
わからないです。・\p0o
var-dumperのスタイルシートを上書きする関数を作ってみた

Laravelのコードリーディングをしている時に、オブジェクト($app)などの中身を調べるのに[var-dumper](https://github.com/symfony/var-dumper)の`dump()`を使っていました。
かなり便利な関数なのですが、CSSが見づらいです。
以下のコードで`dump()`を使っていると・・・

```php:resources/views/test.blade.php
$route_collection = (array)(((array)$app)["\0*\0instances"]["routes"]);
dump($route_collection);
```

このような出力になります。

![dumper.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381183/14c27db3-112b-f794-2d41-ae43b727c311.jpeg)


`#000000`の背景に`#ffffff`の文字や、`<pre>`の外の`<body>`の背景色(`#ffffff`)で目が痛くなってきます。
なので目にやさしい`<style>`を作ることにしました。

```php:app/helpers.php
<?php
if (! function_exists('dump_css')) {
    /**
     * style sheet for var-dumper
     *
     * @return void
     */
    function dump_css()
    {
        $css = "<style>
            pre.sf-dump, pre.sf-dump .sf-dump-default { 
            font: 20px Arial, Helvetica, sans-serif;
            background-color: #dddddd;
            color: #4c4c4c;
        }
        pre.sf-dump .sf-dump-note {
            color: #012c42;
            font-weight: bold;
        }
        pre.sf-dump .sf-dump-key {
            color: #2d771d;
            font-size: 22px;
        }
        pre.sf-dump .sf-dump-public {
            color: #777777;
            font-size: 22px;
        }
        pre.sf-dump .sf-dump-protected {
            color: #3a3a3a;
        }
        pre.sf-dump .sf-dump-str {
            color: #2d6021;
        }
        pre.sf-dump .sf-dump-ellipsis {
            color: #ad5b03;
        }
        pre.sf-dump .sf-dump-meta {
            color: #736377;
        }
        </style>";
    
        echo $css;
    }
}
```

するとこうなります。

![dump-after.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381183/3f9922fb-7e86-40de-9c43-3736ead9558d.jpeg)

かなり見やすくなりました。
docker and vscode not visual studio code, docker(139)


#microsoft
Visual Studio のコンテナー ツール
https://docs.microsoft.com/ja-jp/visualstudio/containers/?view=vs-2019
>Docker ツールと Kubernetes ツール、およびコンテナー ベースの開発プロジェクトを管理するための Azure サービスについて説明します。

Quickstart: Docker in Visual Studio
https://docs.microsoft.com/ja-jp/visualstudio/containers/container-tools?view=vs-2019

チュートリアル: NET Core アプリのコンテナー化
https://docs.microsoft.com/ja-jp/dotnet/core/docker/build-container


# vscode on docker

Ubuntu / DebianにコマンドでVSCode (Visual Studio Code) をインストールする方法
https://www.karelie.net/ubuntu-debian-command-install-vscode/

# visual studio code on ubuntu

簡単にUbuntuにVSCode (Visual Studio Code) をインストールする方法
https://www.karelie.net/install-vscode-ubuntu/

Ubuntu 18.10にVisual Studio Codeをインストールする
http://note.kurodigi.com/ubuntu1810-code/

Dockerコンテナ内でVSCodeを起動する(Ubuntu)
https://qiita.com/kanosawa/items/0c83f8d8eaaa4a72e1cd

# docker gcc
gcc
https://hub.docker.com/_/gcc/

```
$ docker run -it gcc /bin/bash
```
docker上で

```
$ apt update
# apt upgrade
# apt install clang
```

docker gcc(g++) and llvm(clang++)
https://qiita.com/kaizen_nagoya/items/059874ea39c4de64c0f7

apt-get install llvm, apt-get instll clang
https://researchmap.jp/jo206c93q-1797580/?lang=japanese

Ubuntu 18.04.1 desktop にclangをインストール
http://mojelder.hatenablog.com/entry/clang01

# X windows on docker

# 参考資料(reference)
VSCodeでのPythonのデバッグと、Dockerコンテナ環境に接続してリモートデバッグする方法
https://qiita.com/Ryuichirou/items/6327ab5012ca1729d72f

Docker × Visual Studio CodeでPHP開発【デバッグ実行】
https://qiita.com/MasanoriIwakura/items/a310c75e6c5b347adf37

Docker用VS Code拡張機能の使い方　Angular7のコンテナ化
https://qiita.com/SOhtsu/items/32c0df5820e039c8c0f6
### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
Javaを使ってブラウザに「HelloWorld」を表示させる

【Javaで「Hello World」を表示させる　】

環境
・OS:macOS バージョン10.14.4
・Eclipseインストール済み

オペレーション
・まずはEclipseを起動。
・Eclipse後、メニューから「ファイル」-「新規」-「プロジェクト」をクリック。
￼
・「web」-「動的 Web プロジェクト」をクリック。
・「次へ>」をクリック。
￼
・「プロジェクト名：」には任意の名前を入力。
　今回は「HelloWorld」を使用。
・完了をクリック。
￼
・プロジェクトが作成されることを確認する
￼
・作成したプロジェクト(「HelloWorld」)で右クリック。
・「新規」-「ファイル」をクリック。
・「HelloWorld」-「WebContents」をクリック。
・ファイル名に任意の名前を入力。
　今回は「HelloWorld.jsp」を入力。
・完了をクリック。
・下記ソースを入力し保存する。
<!DOCTYPE html>
<html>
<head>
<title>HelloWorld</title>
</head>
<body>
<div>HelloWorld</div>div>
</body>
</html>

・作成したファイル(HelloWorld.jsp)を右クリック。
・「実行」-「サーバーで実行」をクリック。
・「完了」をクリック。
￼
・画面に以下のような表示がされる。
￼
・パスをコピーする。
￼
・ブラウザにコピペしてエンター。
・以下のように表示されたら成功。
￼
Javascriptでブランケット付きのURLパラメータをオブジェクトに

# 概要

railsで（たしかPHPも？）`foo[bar][quz]=123&foo[bar][qux][]=1`みたいなクエリーをつけると

```rb
{
  foo: {
    bar: {
      quz: 123,
      quz: [1]
    }
  }
}
```

というHashが得られますが、それをJavascript側でもオブジェクト化したくて、自分で実装するのも地味に大変そうな気がして探したけど見つけるのに手間取ったので載せておきます。

# qs

https://github.com/ljharb/qs

これで期待通りの結果が得られました。
json(object) to form-encoded

ふとform-encodedなpostリクエストをしたくなったのですが、みんなjsonの事ばっかり考えていて困ったことがあったので備忘

※URIエンコードの予約文字回避（2019/5/17）

# やりたい事
javascriptのobjectをx-www-form-urlencodedなbodyに変えたい
↓こんなのを

```objcect.js
var obj = {
    first: {
        firstA:"a",
        firstB:"b"
    },
    second: "seconds",
    third: {
        thirdA: {
            thirdAA: "aaa",
            thirdAB: "bbb"
        },
        thirdB: "bbb"
    }
}
```

↓こんなのに

```string.js
first%5BfirstA%5D=a&first%5BfirstB%5D=b&second=seconds&third%5BthirdA%5D%5BthirdAA%5D=aaa,third%5BthirdA%5D%5BthirdAB%5D=bbb&third%5BthirdB%5D=bbb
```

# こうした
色々パターン考えかったんですけど、脳みそパワー不足で１パターンのみなンだわ

```result.js
  public createFormEncordedBody(obj) {
    let keys = [];
    let ret = [];
    for (const key in obj) {
      if (typeof obj[key] === "object") {
        keys.push(key);
        ret = ret.concat(this.encodedLoop(keys, obj[key]));
        keys = [];
      } else {
        ret.push(encodeURIComponent(key) + "=" + encodeURIComponent(obj[key]));
      }
    }
    return ret.join("&");
  }

  public encodedLoop(keys, obj) {
    if (typeof obj === "object") {
      const ret = [];
      for (const key in obj) {
        keys.push(key);
        ret.push(this.encodedLoop(keys, obj[key]));
        keys.pop();
      }
      return ret.join("&");
    } else {
      let str = "";
      for (const k in keys) {
        if (k === "0") {
          str += keys[k];
        } else {
          str += encodeURIComponent("[" + keys[k] + "]");
        }
      }
      str += "=" + encodeURIComponent(obj);
      return str;
    }
  }
```

# 助けて
<del>汎用的に書く意味は全く無く、普通jsonだしformでもエンドポイントごとに整形すればいいじゃん。</del>
もっとかっこよくイテラブルにやったりしたい。
kubectlで「Unable to connect to the server」

Docker for Macで以前インストールしたKubernetesでクラスタ情報を取得しようとしたら

```
$ kubectl cluster-info
Kubernetes master is running at https://localhost:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Unable to connect to the server: EOF
```

というエラーが発生した。また、Docker for Macのメニューから「Preferences」で設定画面を開くと、以下のキャプチャのように`Kubernetes is starting`のままrunningの状態に遷移しなかった。

<img width="612" alt="スクリーンショット 2019-05-03 10.07.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/26e187dc-79fa-10ed-e3b6-fc1e913d378b.png">

以下のキャプチャようにDocker for Macの設定画面から利用できるリソースの上限を変更して、数分待ったら、`Kubernetes is running`の状態に遷移した。

<img width="612" alt="スクリーンショット 2019-05-03 11.24.27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76958/1010be5f-b61d-634e-6c89-4e0a2ce487f9.png">


## 参考
[[helm] elasticsearchをinstallしたらkubectlが「Unable to connect to the server:」しか返さなくなった](https://qiita.com/secondly/items/9c0ecd9c3ce583f6e0d3)
Leetcode #91: Decode Ways

Straightforward but slow solution

```swift
private let decodeSets: Set<String> = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10",
                                       "11", "12", "13", "14", "15", "16", "17", "18", "19", "20",
                                       "21", "22", "23", "24", "25", "26"]
private var dict = [String: Int]()

func numDecodings(_ s: String) -> Int {
    if s.count == 0 {
        return 0
    }
    return helper(Array(s), 0)
}

private func helper(_ s: [Character], _ startIndex: Int) -> Int {
    if startIndex > s.count - 1 {
        return 1
    } else if startIndex == s.count - 1 {
        if s[startIndex] != "0" {
            return 1
        }
        return 0
    }
    if decodeSets.contains(String(s[startIndex...startIndex+1])) {
        if dict[String(s[(startIndex+1)...])] == nil {
            dict[String(s[(startIndex+1)...])] = helper(s, startIndex + 1)
        }
        if dict[String(s[(startIndex+2)...])] == nil {
            dict[String(s[(startIndex+2)...])] = helper(s, startIndex + 2)
        }
        return dict[String(s[(startIndex+1)...])]! + dict[String(s[(startIndex+2)...])]!
    } else {
        if s[startIndex] != "0" {
            if let value = dict[String(s[(startIndex+1)...])] {
                return value
            } else {
                dict[String(s[(startIndex+1)...])] = helper(s, startIndex + 1)
                return dict[String(s[(startIndex+1)...])]!
            }
        } else {
            return 0
        }
    }
}
```

DP solution

```swift
func numDecodings(_ s: String) -> Int {
    let s = Array(s)
    var dp = Array(repeating: 0, count: s.count)
    
    for i in 0..<dp.count {
        // consider 1 digit
        if s[i] != "0" {
            dp[i] += (i >= 1) ? dp[i-1] : 1
        }

        // consider 2 digits
        if i >= 1 {
            let combined = Int(String(s[i-1...i]))!
            if combined >= 10 && combined <= 26 {
                dp[i] += (i >= 2) ? dp[i-2] : 1
            }
        }
    }
    return dp.last ?? 0
}
```
Pythonコード補完ソフトKite、ついにLinuxサポート追加

![00596E88-34DA-4B1C-8B9B-13A56FA967B4.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409670/fd68c354-3150-e7ae-011a-2240a1d5b298.jpeg)

Kiteは、数週間前@KeisukeToyotaさんも[この記事](https://qiita.com/KeisukeToyota/items/75c3b4964b65a18d46d4)で話していた、Pythonのスマートコード補完や参考書検索ができるツールです。もともとWindows、macOSにてPyCharm、VS Code、Vim、Sublime、Atomなどのエディタで使えますが、今日持ってLinuxサポートも追加したようです。

具体的な情報は[公式サイトの発表記事](https://kite.com/blog/kite-adds-linux-support-opens-line-of-code-completions-to-more-python-devs)まで。Ubuntu、Fedora、Arch Linux、Linux Mint、openSUSEなど、色々なLinuxで使えると言っています。デスクトップはKDE、XFCE、Gnome 2・3どれでもオーケーのようです。

数年前からLinuxサポートを約束していたので、ついに発表されて嬉しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409670/7b2b231b-1919-5fda-bfd1-c408f8ef064b.png)

Kiteのダウンロードは[公式サイト](http://kite.com/download)から。上の@KeisukeToyotaの記事にインストール手順が書いてあります。是非試して見ましょう。
控えめ予算で自作キーボードに入門してみる【パーツ集め編】

にわかに話題の自作キーボード。
自分も作ってみたい、と思っても、だいたい制作費が平均1万円強ということで中々手をだしにくいなあと思っていました。
しかし、自力で安いパーツを集めるなど、労力と時間をかければかなり材料費を抑えることも可能でした。
初心者でもお金をかけずに自作キーボードを制作できたよ、の記録です。

##どんなキーボードを作るか

自作キーボードの[沼は広い](https://salicylic-acid3.hatenablog.com/entry/2018/11/21/国内自作キーボード一覧とKWSK)。
まず大まかに左右分割型or一体型のどちらがいいか、キーの配列はどういうのがいいか、から的を絞っていく感じになると思います。
私は左右分割型でキーの配列は格子状になっているものが良く、
かつ、安く仕上げるためになるべくキー数が少なく基板サイズが小さいものを探した結果、[foobar](http://www.40percent.club/2017/09/foobar-10.html)というキーボードを見つけたので、これを作ることにしました。
foobarは、左右のキーボードが3行×5列で両手の合計でも30キーしかない、かなりミニマルなキーボードです。
なぜキー数が少ない方が良かったかというと、単純にキーキャップとキースイッチの数が少なければそれだけパーツ代が安くなるというのと、基板のサイズが100mm×100mm以内に収まれば安く発注できるサービスが結構あるからです。

##PCB（プリント基板）を発注する

foobarの場合、プリント基板発注用のデータが[github](https://github.com/di0ib/Misc/tree/master/foobar)に公開されているので、これを使って自分で基板プリントサービス会社さんに発注をかけます。
[seeedstudio](https://www.seeedstudio.io)というところは100mm×100mmならかなり安い値段で作ってくれるサービスを定期的にやっているので、今回はここで発注しました。
さきほどのgithubからダウンロードしたzipデータ(←fooba1_1.zipというやつだけでいいです。その下のbottomとかplateとかのファイルは、上下プレートできちっと[はさみ込むタイプ](http://www.40percent.club/2017/09/foobar-11-with-plates.html)のfoobarを作る時には必要になりますが、今回は安くあげるため基板むき出しタイプでいきます)をPCB発注画面にアップロードし、その下の詳細設定のところはサイズ指定を（61.9mm*95.3mm）にした以外はデフォルトでいけたと思います。
（サイトや時期によって発注方法が違ったりするかもしれないので念のためfoobar公式の[発注方法解説](http://www.40percent.club/2017/03/ordering-pcb.html)をチェックするといいと思います）
私の場合は送料含め基板5枚が910円でオーダーできました。

##パーツ集め

キーキャップやスイッチ、pro microなどの主要パーツはAliExpress、その他は秋葉原のパーツ屋で購入しました。その時の値段はこんな感じ。

| パーツ           | 値段(円)        | 
|:------------    |------------:|
| promicro互換品×2 |600|
| TRRSケーブル     |300 |
|キーキャップ×30    |630|
|キースイッチ×30    |1000|
|AliExpress送料    |200|
|1N4148ダイオード×50    |100|
|TRRSジャック(PRT12639)×2    |200|
|タクタイルスイッチ×2    |100|
|テープLED(ws2812B)    |500|
|スペーサー/ネジ(M2規格)×8    |500|


これにAliExpressの初回買い物クーポンがあったので-500円、合計3630円でパーツを集めることができました。
さらにテープLEDはキーボードの機能としては本来必要ないのでなくても良いです（が今回はどうしても光らせたかった…）。TRRSケーブルも安いものは100円ぐらいから売ってました（が今回はどうしてもスプリング付きのにしたかった…）。
キーキャップやキースイッチはCherry MX互換のものならなんでも良いですが、TRRSジャックはPRT12639、リセット用のタクタイルスイッチは[表面実装用の5.2mm*5.2mmのもの](https://lcsc.com/product-detail/Tactile-Switches_5-2mm-5-2mm_C92584.html)と規格が決まってるので注意が必要です。
ws2812Bが載ったテープLEDは[遊舎工房さん](https://yushakobo.jp)がお安かったです。店舗で販売されているスペーサーやネジもサイズの取り揃えがすごくて便利です。

これで必要なパーツの準備はできましたので、あとは組み立てていきます。
【ビルド編】に続く。。。
CentOS7でlocaleを日本語にしたい（「can't set the locale; make sure $LC_* and $LANG are correct」って怒られたときの解決方法）

## こうゆう設定ってすぐ忘れちゃうよね

いつも調べ直しちゃいます。なので、備忘録として残す。

## 経緯
`can't set the locale; make sure $LC_* and $LANG are correct`って怒られたので設定しました。
最初にやっとくべき設定ですね。

## 現在のロケールを確認

```bash
localectl
```

```bash:出力
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: n/a
```

`ja`になってません。`en`だって。つまり日本のじゃない。

## 日本語のロケールをインストール

日本語のロケールがあるか確認

```bash
localectl list-locales | grep -i ja
```

なかった（゜゜）

ので、インストールする

```bash
sudo yum -y install glibc-common
```

確認

```bash
 localectl list-locales | grep -i ja
```

```:出力
ja_JP
ja_JP.eucjp
ja_JP.ujis
ja_JP.utf8
japanese
japanese.euc
```

`ja`があるので良さそう。


## 日本語のロケールを設定

なので、以下のようにコマンド打ちましょ

```bash
localectl set-locale LANG=ja_JP.UTF-8
```

これだけじゃ反映しませんので、以下で反映させる

```bash
source /etc/locale.conf
```

## 設定の確認

```bash
localectl
```

```bash:出力
   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: n/a
```

おっけい

## おわり
f.collection_selectについて

題記について、Railsドキュメントを見てもあまり良く理解出来なかったので、まとめてみる。

# Railsドキュメントより

1. form_for, form_tagにて使用可
2. 取ることができる引数について、Railsドキュメントによると、

**(プロパティ名, オブジェクトの配列, value属性の項目, テキストの項目 [, オプション])**

と記載されており、例では、

```ruby
<%= f.collection_select(:name, @categories, :id, :name) %>
```
とコードを書くと、HTMLは、

```html
<select id="page_name" name="page[name]">
  <option value="1">Railsの基礎知識</option>
  <option value="2">Rubyの基礎知識</option>
</select>
```
にて生成されるらしい。

参考：[Railsドキュメント](http://railsdoc.com/)

# もう少し詳しく

Railsドキュメントに挙げられている例をもう少し詳しく見てみる。

####状況は？
1. Pageモデル(テーブル)が存在する。
2. Pagesテーブルは以下のような構成になっている。

|            id |           name |
|:-------------:|:--------------:|
|             1 |  Railsの基礎知識 |
|             2 |    Rubyの基礎知識|

3.

```ruby:
@categories = Page.all
```
としてすべてのオブジェクトをインスタンス変数に代入しているとする。

####引数と生成されるHTMLページの関係性は？

1. 第一引数（プロパティ名）は、selectタグのid属性とname属性に関係する。  
id="page_<font color="Red">〜</font>" name="page[<font color="Red">〜</font>]"といった具合に設定される。※今回の場合は<font color="Red">:name</font>としており、pageはモデル名となっている。
2. 第二引数（オブジェクトの配列）は、何となく理解できるので省略
3. 第三引数（value属性の項目）は、value="<font color="Red">〜</font>"にて設定したい値のカラム名が入る。そのため、idカラムの値を設定したい場合は、<font color="Red">:id</font>となる。
4. 第四引数（テキストの項目）は、optionタグ内のテキストに設定したい値のカラム名が入る。そのため、nameカラムの値を設定したい場合は、<font color="Red">:name</font>となる。
Nuxt.jsでAPIサーバーへのproxyをつくる（serverMiddlewareだけで）

# 概要

クライアントがNuxt、WEB+APIサーバーがその他（実際にはFlask）のアプリを作るにあたって、Nuxtは`npm run dev`で起動しておきながら、APIサーバーにも自由にアクセスをさせたいという場合があり、そのためのproxyをできるだけ簡単に構成します。
ここでWEB+APIサーバーと書いたサーバーは、本番ではNuxtのビルド済のファイルを返すWEBサーバーとAPIサーバーを兼ねるものです。

# そのような事をしたい理由

要件としては、最終的に返却するドメインがNuxtのファイルもAPIも同一になるような環境を作る事です。（ポートも同じ）

このような構成のNuxtのアプリを開発するには、おそらく概念的には２通りの考え方があって、

- Nuxtのビルドをwatchにする
- Nuxtはdevで立ち上げて、そこからAPIサーバーの内容をproxyで返す（今回の構成）

このうち、もともとは前者の方法を考えていたのですが、この辺はnuxt自体の課題でもあるらしく、`npm run generate --watch`というのがあまりうまく機能しなかったのと、仮にできたとしてもなんだかんだビルドの時間等がかかるな？ということになり、後者の方法を検討して、実現した物の基礎的な部分について記述します。

なお、初版ではcookieを通していなかったのですが、cookieをそのまま素通しするようにしました。
その他のヘッダーも、同様にやればできると思います。

# やること

nuxt.config.jsを編集して、以下のようなjsを作成します。

```js:nuxt.config.js(の一部)
import bodyParser from 'body-parser'

export default {
  // 略
  serverMiddleware: [
    bodyParser.json(),
    { path: '/api/path/dayo', handler: '~/api/proxy.js' },
    { path: '/api/path/desu', handler: '~/api/proxy.js' }
  ],
  // 略
}
```

※apiフォルダを作って、api/proxy.jsとします。APIサーバーはlocalhost:5000で動いているものとします。
（ほかでも書き換えれば動きます）
やりとりはすべてJSONなので注意してください。

```js:proxy.js
import axios from 'axios'

export default function (req, res, next) {
  axios({
    method: req.method,
    url: 'http://localhost:5000' + req.originalUrl,
    headers: req.headers,
    data: req.body
  }).then(otherRes => {
    if (otherRes.headers && otherRes.headers['set-cookie']) {
      res.setHeader('Set-Cookie', otherRes.headers['set-cookie'])
    }
    res.write(JSON.stringify(otherRes.data))
    res.end()
  })
  // next()
}
```

# 結果

APIのやりとり形式がJSONである前提で、メソッドとbodyを維持してproxyしてくれます。
style="height: 50px"とかつい直書きしたくなるシーンに有効なcssライブラリー作ったので共有

#CSSライブラリ作りました

Htmlのレイアウトを作成する時, paddingやwidthなどのpxを細かく指定したい時に以下のように記述したいと思いました。

```html
<p class="p-45px height-100px max-width-300px"></p>
```

なので、そういう記述ができるライブラリを作りました。
https://github.com/programmerkgit/dot-style


これで名前空間を汚さず、styleへの直書きもせずにアトミックなクラスの組み合わせでスタイルを記述できるようになります。

z-index, height, width, min-max height, width, padding, margin, position(top, left, bottom, right)などに対応しています。


以下、使用例です　(拙い英語で書いたReadmeそのまま載せます。)


# Usage

### Box Spacing
You can style padding, margin.

You can choose number from between 0 to 500, incremented step by 2.

### Padding
```
<p class="pt-30px"></p>
<p class="pr-30px"></p>
<p class="pb-30px"></p>
<p class="pl-30px"></p>
<p class="px-30px"></p>
<p class="py-30px"></p>
<p class="p-30px"></p>
```

### Margin
```
<p class="mt-30px"></p>
<p class="mr-30px"></p>
<p class="mb-30px"></p>
<p class="ml-30px"></p>
<p class="mx-30px"></p>
<p class="my-30px"></p>
<p class="m-30px"></p>
```


### Dimension
You can set `width`, `max-width`, `min-width`, `height`, `max-height`, `min-height`

```
<p class="width-30px"></p>
<p class="max-width-30px"></p>
<p class="min-wdith-30px"></p>
<p class="height-30px"></p>
<p class="max-height-30px"></p>
<p class="min-height-30px"></p>
```

You can choose number from between 0 to 1000, incremented step by 5.


### Line height
You can set `lien-height`

```
<p class="line-height-30px"></p>
```

You can choose number from between 0 to 100, incremented by step 2.

### Positioning
You can set `top`, `right`, `bottom`, `left`. 


You can choose number from between 0 to 1000, incremented by step 5.

```
<p class="t-30px"></p>
<p class="r-35px"></p>
<p class="b-40px"></p>
<p class="l-45px"></p>
<p class="x-50px"></p>
<p class="y-55px"></p>
```

### z-index
You can set `z-index`.


you can choose number from between 1-50 and from between 2000-2050.

```
<p class="z-index-1"></p>
<p class="z-index-2"></p>
<p class="z-index-2000"></p>
<p class="z-index-2001"></p>
```


### Golden ratio of font-size, line-height and margins
Font size and line height and text block margin has a golden ratio.


You can set golden ratio by specifying fontsize.

```
<p class="gr-16px"></p> => font-size is set 16px, and correspoinding line-height, margin-top, margin-bottom are set. 
```



##追加開発してきます
以下の点を満たすようなライブラリーにしようと考えています。

1. 主要なPropertyを全てclassで指定できる。
`class="p-30px flex-grow-3 pointer-cursor"` などのように、classでほぼ全てのプロパティーを指定できるようにします。これによってついつい style="" の直書きをしたくなるようなシーンを無くします。

2. component指向ではなくアトミックな機能群の提供。
CSSライブラリの多くが提供しているcomponentを使用すると素早くレイアウトができる代わりに、望まぬデフォルトのOutlineや色などが付与されてしまいます。
なので、class名を見るとどのプロパティーがどう内部で変化するかがすぐにわかるような機能群を作っていきます。
Leetcode #90: Subsets ||


```swift
func subsetsWithDup(_ nums: [Int]) -> [[Int]] {
    var subsets: [[Int]] = [[]]
    var ar = [[Int]]()
    var dict = [Int: Int]()
    for num in nums {
        if let value = dict[num] {
            dict[num] = value + 1
        } else {
            dict[num] = 1
        }
    }
    for key in dict.keys {
        ar += [Array(repeating: key, count: dict[key]!)]
    }
    var tmp = [Int]()
    helper(ar, &tmp, 0, &subsets)
    return subsets
}

private func helper(_ nums: [[Int]], _ tmp: inout [Int], _ startIndex: Int, _ subsets: inout [[Int]]) {
    for i in startIndex..<nums.count {
        for j in 1...nums[i].count {
            for _ in 0..<j {
                tmp.append(nums[i][0])
            }
            subsets.append(tmp)
            helper(nums, &tmp, i + 1, &subsets)
            for _ in 0..<j {
                tmp.removeLast()
            }
        }
    }
}
```
Backyard Revolution By Zack Bennett

Backyard Revolution is definitely the extraordinary plan will guide one to split clear of your reliance on the greedy huge power  organizations. It doesn't matter what's happening in the planet, but you will certainly be secure and also safe. You can also develop <a href="http://backyardelectricity.com/">Backyard Revolution By Zack Bennett</a>, renewable, as well as environmentally friendly power  that you simply at any time want in your own house. Backyard Revolution On-line Assistance
Discovery DemoをDiscovery News 日本語版で使うために

# はじめに
[Disocovery Demo](https://discovery-news-demo.ng.bluemix.net/) をDiscovery News 日本語版に対応させて使いたい！
ということで、Githubから[Discovery Demoのソース](https://github.com/watson-developer-cloud/discovery-nodejs)を入手してからCollectionをDiscovery News 日本語版に切り替えるまでをお送りします。

# Discovery Demoを動かすまで
[Disocovery Demo](https://discovery-news-demo.ng.bluemix.net/) にある手順の通りで、そのまま動かすところまではいけます。
Windowsの方、.env.exampleから.envファイルを作る際、エクスプローラでは「.env」というファイル名が作れないため手順通りコマンドでコピーしましょう。
![20190502_DD_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/f586276b-b892-bb04-cf1e-248bb1cffcc8.png)

# 日本語版のための2つの変更点
.envを変更すればいけるでしょ！と思っていましたが甘かった……ですよ。

## 1.固定されている Collection ID を変更する
.envに以下の項目がありますが、ここのCOLLECTION_IDを設定してもCollection IDは変わりません。

```JavaScript:.env
ENVIRONMENT_ID=<environment>
COLLECTION_ID=<collection>
```
プログラム内で定義されているのでそちらを書き換える必要がありました。
app.jsの4行目 NEWS_COLLECTION_ID を'news' から 'news-ja'に書き換えます。

```JavaScript:app.js
//const NEWS_COLLECTION_ID = 'news';
const NEWS_COLLECTION_ID = 'news-ja';
```

これで検索対象のCollectionがDiscovery News 日本語版にかわります。

## 2.英語filterを外す
1の対応だけではまだ動きません。
Requestが意図した通りのurlに投げられていることはわかりましたが、Responseが0件になってしまいます。
https://gateway.watsonplatform.net/discovery/api/v1/environments/system/collections/news-ja/query

同じワードでDiscovery ToolからDiscovery News(Japanese)を検索すると結果が返ってくるとは確認できているのでqueryの問題そう。

Disocovery Demoの画面上からQueryを確認してみると…… language:(english|en) なるfilterがかかっているじゃないか。
![20190502_DD_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/2272f4ab-291c-660b-cf26-29fbe110c50b.png)

原因が判明したので、該当箇所がある src/query-builder.js の27行目、英語フィルタ部分をコメントアウト。

```JavaScript:src/query-builder.js
    params.filter = `${fields.language}:(english|en)`;
    if (query.date) {
      params.filter = [
        //params.filter, ← ここをコメントアウト
        `${fields.publication_date}>${moment(query.date.from).format(ISO_8601)}`,
        `${fields.publication_date}<${moment(query.date.to).format(ISO_8601)}`,
      ].join(',');
```

再度ビルドして実行！動いた！！
![20190502_DD_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/fd3aa832-ad1d-5bce-0abe-a8ae16cd46d6.png)


# （おまけ）はまったところ
ここから先は大変だった感想的な……気が付けば単純なことなのに、長い道のりでした
## 準備編
以前npmを使った時に使ったproxy設定が残っていて、installに苦戦しました。
![20190502_DD_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25840/b3a9f438-183d-abce-bea4-d60f6813571c.png)

[npm でプロキシを設定／解除する](https://qiita.com/ymaru/items/cf513ab05fe0ebac7d3b) を参考に以下の対応をして事なきを得ました。


`npm -g config list`　現在の設定を確認、proxy設定がばっちり残っている
`npm -g config delete proxy`　
`npm -g config delete https-proxy`　
`npm -g config delete registry`　
`npm -g config list`　削除後の設定を確認、proxy設定削除完了！

## ソース編
実はDemo画面上のQuery表示で英語filterが確認できることに気づいたのは、日本語化した後でして、わかるまでが長かった～！

app.jsの「news」を「news-ja」に変えればいいんでしょ？
`const NEWS_COLLECTION_ID = 'news-ja';`
と思って試してみたけど……甘かった！だめ。日本語がだめなのかと思ってスペイン語でもダメしてみたけどやっぱりだめ。
`const NEWS_COLLECTION_ID = 'news-es';`
エラーにはならないけどResponseが0件。むむむ。
日本語もスペイン語もDiscovery Toolだとちゃんと結果が返ってくるのに。
結局console.logを色々なところに挟んで、やっと英語filterがかかっていることに気づいたのでした。
iPhoneのショートカットアプリ使ってみた。[自作アプリあり]

iOS12から新しく使うことができるようになった。「**ショートカットアプリ**」についての紹介です。
・ショートカットアプリを使用したことのない人
・どうやって使っていったらいいかわからない人
に向けて記事を書いていこうと思います。
#0.はじめに
毎日、家族に、「今から帰ります。」LINEを送るために何回画面をタップしているか考えたことありますか？
また、iPhoneのバッテリーがもう10%を切っていてヤバイ！なんてことになったらデータ通信やBluetoothを切断して画面の明るさを真っ暗にして…みたいな作業をいちいちおこなっていませんか？

**そんな悩みを解決してくれるのが、このApple純正「ショートカットApp」**
![スクリーンショット 2019-05-03 1.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/e364ef99-41e5-bf97-1963-38e955019dcf.png)

ユーザーは、複数の手順を組み合わせたカスタムのショートカットを作成することができ、様々な作業を効率化することができる。
これはSiriショートカットとの相性もいいので、HeySiriを使えばハンズフリーで上で行っていた作業を済ますことができる。


**Sirikitの他にも機械学習フレームワーク、「Core ML 2」や2D画像のフルトラッキング機能が追加された「ARKit 2」なども追加されこれからの近未来的な何かに一歩近づいている気がします。**

#1.まずダウンロードしてみよう。

[ショートカットAppダウンロードリンク](https://itunes.apple.com/jp/app/%E3%82%B7%E3%83%A7%E3%83%BC%E3%83%88%E3%82%AB%E3%83%83%E3%83%88/id915249334?mt=8)
iPhone版とiPad版のみです。

#3.0試しに使ってみる。
![ezgif.com-video-to-gif (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/28f26a25-e2be-82ef-5e89-cae50f0db3a7.gif)


**全く初めて使う人は、右下のギャラリーというボタンを押して見てください。**

このギャラリーは、Appleが**「お前らこんな機能ほしいだろ？作ってあげたぞ使え！」**
みたいな感じで予め用意してくれたショートカットで、自分が使えそうなものをライブラリに追加してあげるだけ。あとはライブラリタブに戻り、ボタンを押せば実行される。
**めっちゃ簡単:monkey:**

##3.1自作してみる。
今回は、「**気持ちの良い朝**」というショートカットを作っていきたいと思います。
どんなショートカットかというと、

1. 自分 「HeySiri　**気持ちの良い朝**(ショートカット名)。」
2. Siri 「おはようございます！まず、部屋の電気をつけてください。」
3. Siri 「では朝の顔の体操をしましょう。表情筋の体操です。
4. Siri 「A(えい)。I(あい)。O(おう)。U(ゆう)。」(すべての発音を全力で広角を上げて行います。ボイトレの先生に教えてもらいましたw)
3. Siri 「今日,2019/○/○も最高の一日になりますように！！」
4. ・・・2秒待機・・・
5. 予めセットしていたプレイリストから音楽が流れる。(爆音)
6. **googleカレンダー**を開く。(一日のスケジュールを把握するため)

Apple純正アプリだけでなく**他社アプリも使える**のも良い！


---

![ezgif.com-video-to-gif (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/240708/139c4c37-5722-4de9-4d7a-954a58a75428.gif)

HeySiriでも呼び出せるように編集してみてください。
やり方は、gifのように行えば簡単です。
フレーズは「起こして。」でも「ねむい。」でも何でもいいです。
自分の好きなフレーズにしてみてください。

##3.2完成品[気持ちの良い朝ショートカット](https://www.icloud.com/shortcuts/932fd38a4ea54896bb24cf9731736128)

##3.3このショートカットの趣旨
皆さん朝の起きるの辛くないですか？
目覚ましが鳴ってとりあえず布団から手を伸ばして、アラームを止めて、布団の中で「あーだるいなー」あとちょっと寝よっと！アラームを再セット...To Be Continue...スャァ

休日はこんな感じで、だらしなく朝を過ごしてしまっていたので、どうにかこの負の連鎖を断ち切らねば！！と思ったのでこのショートカットを作ってみました。

**顔の体操**が意外と効果がある。そして、勝手に爆音で音楽が流れて気分が起きる気分じゃなくなる。激しめの音楽がいいかも！
これを使い始めてから、二度寝が減りました。


#4.0終わりに
このショートカットAppはこれから面白い使い方ができるなと感じました。今現在は使える機能などかなり制限されていますが、これからの発展に期待しておこうと思います。
次回はどのようにしてカスタマイズしていくのかを記事にしたいと思います。
リストオブジェクトの共有

# はじめに(5月4日追記)
コメント欄の @shiracamus さんのご説明が非常に分かりやすく参考になると思います．
この記事の本文よりも，是非コメント欄をお読みください．

# 自己紹介
データサイエンスに関する研究(理論と応用)をしている学生です．
これまでR言語しか使ってきませんでしたが，最近Pythonの学習を始めました．
RとPythonで全然違うなあと思った点や，使い分ける上で注意すべき点をまとめていきます．
今後，ご指摘やアドバイスなど，よろしくお願いいたします．

# たとえば

```test.R
lis1 = list(1,2)
lis2 = lis1
lis1[[1]] = 100
print(lis2)

# 出力
[[1]]
[1] 1

[[2]]
[1] 2

```

Pythonだと，全然違う結果になる．
~~参照渡しが行われている．~~

```test.py

lis1 = [1,2]
lis2 = lis1
lis1[0] = 100
print(lis2)

# 出力
[100, 2]
```

Rっぽく扱う(~~値渡し~~)をするためには，copyモジュールとやらを使えばよさそう．
CPU パワーが半減 0.8Ghzで頭打ちになる

Lenovo X1 Extremeを購入。
Windows10をクリーンインストールし、LenovoVantegeからドライバーの導入。
BIOSも最新版。
BIOSでの設定もパフォーマンスを設定。
しかし、AC電源を使わないバッテリー駆動にするとCPUが頭打ちになる現象が発生。
特にVisualStudioCodeを利用しているときに0.8ghz付近でCPU速度が低下してしまう。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/157360/9405d285-b889-d8da-7b16-c2e2cdc2c380.png)

モバイルかつ、開発用マシンとして購入したExtremeなのにCPUがフルに使えないのであれば魅力激減。
やってみたことの手順としては、
・電源管理をチェック
・LenovoVantegeをチェック
・BIOSの設定をチェック
してみたが変わらず。

解決方法は、
ThrottleStopというソフトをダウンロードし実行。
こちらのBD PROCHOTのチェックを外すと不思議なことにCPUがフルに使える！CUPを壊さないよう安全回路が働くようで、それが悪さをしている。
はずれのCPUを引いたのであれば残念。
とりあえずこちらで解決。
世代間格差の象徴としての自動車と計算機(書きかけ)

世代間格差は、自動車と計算機。

# 自動車
小学生の頃、初めて自動車が家にきた世代と、生まれた頃から自動車がある世代。そして今、自動車が廃れていく世代。

### ガソリン自動車

排ガス規制で、計算機制御になった。

### 電気自動車
　電気自動車の歴史は古い。

我が国で最初に走った電気自動車
http://www.ei.u-tokai.ac.jp/morimoto/docs/我が国最初の電気自動車1.pdf

「デンソーにおけるHV/EV向け製品開発の歴史」（デンソーテクニカルレビューVol. 16より）山田 好人
https://www.denso.com/jp/ja/news/other-topics/2012/120208-01.html

デンソーにおける車両の電動化技術
田中政一 蛭間淳之 梅田敦司 大木島俊　谷恵亮 井村彰宏
https://www.denso.com/jp/ja/innovation/technology/dtr/v22/keynote-03.pdf

### 自動運転車
自動運転開発がLinuxなどのオープンソースを利用し始めるまで、
自動車におけるオープンソースの利用は限定的だった。


# 計算機
計算機は20歳で触った。生まれた時からパソコンがある世代との格差はある。
ロボットが出始めた頃と、生まれた時からロボットがある世代とは少し違うかも。

まだまだロボットは限定的な利用で、工場に大量にいる。計算機は、生まれたときから医療機器の中にあり、家庭にあり、仕事場にある。

### 8bit CPU

### 16bit CPU

### 32bit CPU

### 64bit CPU

### 量子計算機

最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
bundle installでmysql2がエラーになる件

## 背景

とある教材を見ながらプロジェクトを作成していたところ、bundle install を実行したらエラーが発生したのでメモ。

「Mysqlの導入で発生したエラー解消」という内容で、最終的に「bundleのオプション指定」することにより解消できた。



### 実行したコマンド

```
$ rails new myapp --database=mysql --skip-bundle --skip-test
$ cd myapp
$ bundle install
```

### エラー内容

```
（省略）
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
（省略）
linking shared-object mysql2/mysql2.bundle
ld: library not found for -lssl
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make: *** [mysql2.bundle] Error 1

make failed, exit code 2

Gem files will remain installed in /var/folders/mj/93db0vd975799gg9w3nnr3_r0000gn/T/bundler20190503-14531-xlyd6cmysql2-0.5.2/gems/mysql2-0.5.2 for inspection.
Results logged to /var/folders/mj/93db0vd975799gg9w3nnr3_r0000gn/T/bundler20190503-14531-xlyd6cmysql2-0.5.2/extensions/universal-darwin-18/2.3.0/mysql2-0.5.2/gem_make.out


An error occurred while installing mysql2 (0.5.2), and Bundler cannot continue.
Make sure that `gem install mysql2 -v '0.5.2'` succeeds before bundling.

In Gemfile:
  mysql2
```





## 考えたこと

- そういえばプロジェクト作成のときにDBをmysqlで指定したのは始めてだな。
- mysql2 0.5.2 をインストールできないということかな。
- `gem install mysql2 -v '0.5.2'`を実行しなさいと言ってるのかしら？
- Gemfile でmysql2 のバージョンは何になってる？
- ひとまずググるか。





## やったこと

### Gemfile の確認


```
gem 'mysql2', '>= 0.3.18', '< 0.6.0'
```
Gemfile 内の記述は以下の通り。

ダメな部分があるか否かが不明のため、ひとまず確認のみ。


### エラーログに記載されているコマンドを実行

```
$ gem install mysql2 -v '0.5.2'
ERROR:  While executing gem ... (Gem::FilePermissionError)
    You don't have write permissions for the /Library/Ruby/Gems/2.3.0 directory.
```
結果、エラーの解消にはつながらなかった。


### ググる！→このコマンドでエラー解消！【解決】

エラーの原因特定、解消方法を調べてみたところ、下記コマンド実行にて解決した。

```
$ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
$ bundle install
```
※追記：解消方法コマンド1行目に`$ bundle config --local build.mysql2 "--with-cppflags=-I/usr/local/opt/openssl/include"`という記述をしておりましたが、後で実行されるコマンドで上書きされるため不要ということがわかり削除しました。（@keik 様、ご指摘いただきありがとうございます）


その後、下記コマンドを実行することで「You’re on Rails」画面を開くことができたので今回のエラーは解決とする。

```
$ rails db:create
$ rails s
```



## 原因・学び

今回のエラー解消に際し、色々と調べる中で学んだことをメモ。

### エラーについて

どうやら、今回は下記エラーログがポイントだった模様。

```
ld: library not found for -lssl
```

原因を言語化すると、opensslのパスがビルドの時に必要（ビルドのときにLDFLAGSとかCPPFLAGSとかにパスを追加する記述が必要）ということ。

#### ld とは？

`ld`はGNUリンカーと呼ばれるコマンドとのこと。`$ man ld` で内容を確認できる。

`-lssl` は、mysql2 gemインストール時に`ld`コマンドに与えられたオプションの一つらしい。

ここでは詳細の掘り下げはせずに置いておく。。



### 解決策について

#### bundle config とは？

下記ページにて詳細を確認する事ができた。

[http://ruby.studio-kingdom.com/bundler/bundle_config/](http://ruby.studio-kingdom.com/bundler/bundle_config/)

コマンド`bundle config`により、Bundlerの設定システムを操作することができるとのこと。

なお、 Bundlerは自身の設定を下記の優先順位で取得する。

　1. ローカルのアプリケーション(`app/.bundle/config`)
　2. 環境変数
　3. ユーザーのホームディレクトリ(`~/.bundle/config`)

また、`--local`オプションをつけることで、ローカルのアプリケーションに対して設定が可能。つまりプロジェクト単位の設定となる。

## 宿題

- bundle config で指定する「LDFLAGS」「CPPFLAGS」についてもう少し調べるべし。
- ld コマンドについてももう少し。（仮）
UIAlertController をRxSwiftを使って拡張してみました。

# UIAlertController RxSwiftでUIViewController拡張

[RxSwift](https://github.com/ReactiveX/RxSwift)を使って、UIViewControllerを拡張してみました。


引用：
https://qiita.com/katafuchix/items/50266e0eb52a032c9629


## cocoapod 

```
pod 'RxUIAlert'
```

## Carthage

```
github "RxSwiftCommunity/RxAlert"
```

これで動きます。

## Sample code

```swift

override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        alert(title: "WOW", actions: [AlertAction(title: "OK", type: 0, style: .default)], vc: self).subscribe(onNext: { (num) in
            
        }).disposed(by: disposeBag)
    }
```

[RxCommunity](https://github.com/RxSwiftCommunity/RxAlert)