OmniAICreator/Qiita-1.07M huggingface dataset:
GCPデプロイメモ

## 手順

1. gcpとgithubを連携させる https://github.com/apps/google-cloud-build
2. githubの作業リポジトリを「Source Repositories」に同期
3. .envを暗号化
4. cloud buildの設定
5. ブランチにpushされたときの動作をcloudbuild.yamlに記述

## githubの作業リポジトリを「Source Repositories」に同期

- 「Source Repositories」をクリック
- リポジトリの追加
- 外部リポジトリの接続
- gitプロバイダを「GitHub」にする
- githubにログインした状態で該当リポジトリを選択
- github「aeon-ec-support」のdevelop/masterブランチにpush
- 「Source Repositories」にデータが反映されることを確認

### 参考サイト

- [リポジトリの設定 | Cloud Source Repositories | Google Cloud](https://cloud.google.com/source-repositories/docs/setting-up-repositories?hl=ja)

## .envを暗号化

- 管理している.enｖファイルをセキュリティのため暗号化する
- 暗号化したものをcloud.yamlで復号化
- 設定は`セキュリティ/暗号鍵`
- [Cloud KMS API の有効化](https://console.cloud.google.com/flows/enableapi?apiid=cloudkms.googleapis.com)
- [Cloud SDKのインストール](https://cloud.google.com/sdk/downloads?hl=JA)

### 暗号鍵を作成

 - セキュリティ/暗号鍵でキーリング作成
 - 目的 対称暗号化/復号化
 - デフォルトのアルゴリズム Google対称キー

### .envを暗号化

``` terminal
// ログイン
$ gcloud auth login

// Google Cloud SDK が Google アカウントへのアクセスをリクエストを許可してから
$ gcloud config set project {プロジェクトID}

// 暗号化
$ gcloud kms encrypt \
  --plaintext-file=.env \
  --ciphertext-file={ファイル名 例).env.enc} \
  --location=global \
  --keyring={キーリング名} \
  --key={キー名} \
  --project={プロジェクトID 例) hoge-fuga}
```

### 参考サイト

- [暗号化されたリソースの使用](https://cloud.google.com/cloud-build/docs/securing-builds/use-encrypted-secrets-credentials?hl=ja)
- [gcloudをzshにインストールする](https://qiita.com/Y_Fujikawa/items/2c468eb85f3dec52c374)
- [Cloud KMS を gcloud コマンドで試す](https://qiita.com/takasp/items/99270cf3bf0546f7e55e)
- [gcloud configで複数の設定を持って切り替える](https://qiita.com/sky0621/items/597d4de7ed9ba7e31f6d)

## cloud buildの設定/起動

- ビルド履歴のAPIを有効にする
- ビルドトリガー「トリガーを作成」
- トリガーのタイプ「ブランチ」
- ブランチはstgなら「develop」/prodは「master」

### cloudbuild.yamlにカスタムビルドを設定

- .envを復号化
- npmをinstall
- package.jasonで指定したfirebase deployコマンドを実行
- `cloud build`のトリガーに環境変数を定義`${_KMS_KEYRING}`、`${_KMS_KEY}`

``` yaml:cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/gcloud'
  args: [
    'kms',
    'decrypt',
    '--location=global',
    '--keyring=${_KMS_KEYRING}',
    '--key=${_KMS_KEY}',
    '--ciphertext-file=.env.enc',
    '--plaintext-file=.env'
  ]
- name: 'gcr.io/cloud-builders/yarn'
  args: ['install']
- name: 'gcr.io/cloud-builders/yarn'
  args: ['build']
- name: 'gcr.io/cloud-builders/yarn'
  args: ['run deploy']
```

## 参考サイト

- https://medium.com/google-cloud/how-to-set-up-cloud-build-for-firebase-cloud-functions-cffcf2812302
- https://medium.com/google-cloud-jp/google-cloud-build-%E3%81%A7-ci-cd-firebase-hosting-%E7%B7%A8-60a86125be41

## app.yamlを作成

- アプリをデプロイするために`app.yaml`を作成

``` yaml:app.yaml
# [START app_yaml]
runtime: nodejs8
# [END app_yaml]
```

## App Engineを作成

- アプリ作成のためのプラットフォーム
- Node.jsで動かすので`package.json`にversion8を指定

``` json:package.json
"engines": {
  "node": "8.x.x"
},
```

``` terminal
// App Engineを作成
$ gcloud app deploy --version 1 app.yaml --project=hoge-fuga

// localでデプロイコマンド
$ gcloud app deploy --version 1 app.yaml
```

### 参考サイト

- [Google App Engine Node.js スタンダード環境のドキュメント](https://cloud.google.com/appengine/docs/standard/nodejs/?hl=ja&_ga=2.101850504.-861702066.1528776595)
ExcelSimpleOutputコンポーネントの使いどころ

ASTERIA Warp 1906 で新しく追加されたExcelファイルを出力するコンポーネントの使いどころを見ていきたいと思います。

#比較
まず何がシンプルなのかをExcelOutputコンポーネントと比較してみます。ちなみにExcelOutputコンポーネントは1906でExcelPOIOutputから改名されました。

||ExcelSimpleOutput  |ExcelOutput  |
|---|---|---|
|出力ストリーム  |なし/入力ストリーム  |作成したExcelファイルのバイナリデータ  |
|テンプレートファイル  |制約あり<br>設定するカラムやレコード以下のセルが存在してはいけない。  |使える  |
|ファイル保存|保存先のパスを指定できる |できない |
|処理|追加のみ|クリア＆上書き<br>上書き<br>追加<br>挿入<br>更新<br>削除 |
|シート名|指定可能|指定可能|
|セル出力|できる（書式は未対応）|できる|
|レコード出力|できる（書式は未対応）|できる|
|レコードデータ量|制限ゆるめ|制限きつめ<br>日本語2文字で80万セル|
|レコード拡張|できる|できる（拡張・固定選択可能）|
|レコード同値非表示|できない|できる|
|レコード罫線|できない|できる|
|画像|できない|できる|
|ライセンス|CoreでOK|別途購入|

目立った違いはこれくらいでしょうか。
機能はかなりシンプルになってます。
#使いどころ
ExcelSimpleOutputコンポーネントの一番よいところは、Coreのライセンスで動作することです。

今までExcelOutputコンポーネントを使っていたユーザーからすると、ExcelSimpleOutputコンポーネントはできないことがいろいろあるのですが、テンプレートがほぼ使用できないのが特に気になるかもしれません。帳票などは当然テンプレートがあり、そこには属性を指定したセルが存在しているのでExcelSimpleOutputコンポーネントでは使用できません。

ExcelSimpleOutputが得意なのは、大量のデータを素早く処理することです。実行中のメモリー使用量も抑えられますので、ExcelOutputコンポーネントのようにメモリーを使いきって落ちることもありません。

ExcelSimpleOutputコンポーネントは新規のシートへ大量のデータを出力するためのものといったところでしょうか。もちろん少量のデータでも問題ありませんが、真価を発揮するのは大量データになります。対してExcelOutputコンポーネントは帳票などのテンプレートへ定量データを出力するためのものと言えます。

それぞれのコンポーネントの機能を比較しながら適材適所で使ってみてください。
【解決】Original Error: You must have the ImageMagick or GraphicsMagick installed Image Failed to manipulate with MiniMagick, maybe it is an image?

画像（image）を投稿しようとしたらエラー`Original Error: You must have the ImageMagick or GraphicsMagick installed Image Failed to manipulate with MiniMagick, maybe it is an image?`が出てきて投稿できないけど**imagemagick**をインストールしたら解決したのでメモ。

# 解決策

### MacOSの場合

`brew`をアップデート

```
$ brew upgrade
```

`imagemagick`のモジュールをMacにインストール

```
$ brew install imagemagick
```

### Windowsの場合

`apt-get`をアップデート

```
sudo apt-get update
```

`imagemagick`のモジュールをWindowsにインストール

```
sudo apt-get install libmagickwand-dev
sudo apt-get install imagemagick --fix-missing
```

## 該当のエラー分

```
Original Error: You must have the ImageMagick or GraphicsMagick installed Image Failed to manipulate with MiniMagick, maybe it is an image?
```

参考
https://stackoverflow.com/questions/31193495/error-original-error-imagemagick-graphicsmagick-is-not-installed
https://stackoverflow.com/questions/29377651/rails-error-imagemagick-graphicsmagick-is-not-installed
https://stackoverflow.com/questions/57965548/how-to-solve-failed-to-manipulate-with-minimagick-maybe-it-is-not-an-image-ori
MySQLで文字コードに苦戦している人向けのメモ

#重要なvariables
各セッションで以下がutf8mb4となっているとよい

- `character_set_client`
- `character_set_connection`
- `character_set_result`

できればグローバルで設定しておきたい。

##character_set変数群の解説
`SHOW VARIABLES LIKE 'character\_set\_%';`

|character_set |解説 |
|---|---|
| character_set_client |クライアントが送ってくるとサーバーが想定している文字コード |
|character_set_connection   |クエリを実行する文字コード |
|character_set_database |使っているデータベースの文字コード。変える必要はないしsetで変えてはいけない。|
|character_set_filesystem| ファイル名の文字コード。デフォルトでいい|
|character_set_results |クライアントに結果を返すときの文字コード|
|character_set_server| 新規にデータベースを作るときの文字コード。設定しておくと楽。いろいろ継承されるが上書きできる。|
|character_set_system| テーブル名とかを保存する文字コード。デフォルトでいい|

#my.cnfで設定するもの
##サーバ側
###`skip-character-set-client-handshake`
4.xからの移行用であまりおすすめしない。
設定すると以下の3つを強制的にcharacter_set_serverの内容に変更する。
- `character_set_connection`
- `character_set_client`
- `character_set_result`

この状態でも `set names` すると上記3つが上書きされる。


###character-set-server = utf8mb4
そのまま
## クライアント側
### [client]の `default-character-set=utf8mb4`
文字コード無指定のクライアントはここを読む。
ドライバの実装によっては読まないこともある。
アプリケーションからMySQL接続する際は、アプリケーション内の設定に明記したほうがよい

my.cnf内で`[]`はグループを指す。
`[mysql]`と`[client]`はだいたい同じ。`[mysql]`はmysqlコマンドを指す。


## JDBC
`characterEncoding`と`characterSetResults`を`UTF-8`とすれば、utfmb4扱いとなる。
ここは直接utf8mb4を指定しない。JDBCはMySQL以外も扱うため。
Kubernetes 1.15: SIG Cloud Provider の変更内容

## はじめに

本記事では、Kubernetes 1.15 の CHANGELOG から SIG Cloud Provider の取り組みについてまとめています。

- https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.15.md

AWS、Azure、GCPなどにも関連する内容がありますが、筆者が利用しているOpenStackまわりについてのみまとめます。


## その他の変更 (Other notable changes)

### Cloud Provider

- GCE固有のフラグ`cloud-provider-gce-lb-src-cidrs`をexternal cloud providerでオプションになりました。([#76627](https://github.com/kubernetes/kubernetes/pull/76627), [@timoreimann](https://github.com/timoreimann))
- cloud-controller-managerがノードを複数回初期化する不具合を修正しました。 ([#75405](https://github.com/kubernetes/kubernetes/pull/75405), [@tghartland](https://github.com/tghartland))

### OpenStack

- OpenStack cloud provider用のkubeconfig fileを定義できるようになりました。 ([#77415](https://github.com/kubernetes/kubernetes/pull/77415), [@Fedosin](https://github.com/Fedosin))
 
:pencil:今まではin-cluster configのみであったが、この変更によりkubeletがpod以外で起動してもOpenStack cloud providerを有効にできるようになるとのことです。

- OpenStackのユーザークレデンシャルがローカルファイルの代わりにSecretリソースから取得できるようになりました。 ([#75062](https://github.com/kubernetes/kubernetes/pull/75062), [@Fedosin](https://github.com/Fedosin))


:pencil:指定したSecretリソースの`clouds.conf`から設定ファイルを参照する機能です。これにより、OpenStackのパスワードを平文で扱う必要がなくなったので、よりセキュアにOpenStackの接続情報を扱えるようになりました。OpenStack周りのパスワード管理については懸念があったので、この機能を利用することで改善できそうです😎
webを支える技術-学びとなったことの書き出し-

## URIはリソースを表現する名詞にする
URIにはメソッド名、セッションIDなどは含めないようにしよう。
プログラミング言語に依存した拡張子なども含めないようにするべき。

## 拡張子でファイルの性質を表現することもありっちゃあり
`https://example.test/text.ja`
`https://example.test/text.en`
というようにしてリソースを分けることもして良いらしい。

## マトリクスURI
階層構造を表現するスラッシュの代わりに、;で区切ってリソースを表現することができる。
`https://example.test/hoge/par1=1234;par2=5678`
セミコロンで区切っても良いということは知らなかった・・・。


## HTTP通信の流れ
1.クライアントがリクエストを作成する
2.ネット接続からDNSを利用して名前解決を行う
3.NSからNSをまたぎ、目的のホストを見つける
4.見つけたらそこに対してリクエストがたどり着く
5.ホストはリクエストの内容によってレスポンスを元の経路を辿って返す
6.例えばhtmlが返ってきたときに、スタイルシートや画像などのリソース元が書いている場合は手元のコンテンツが十分になるまでクライアントはリクエストを発行し続ける。

## HTTPメソッド
### DELETEの冪等性
1回目のリクエストでリソース削除が成功し、200が返ってきて
2回目のリクエストではリソースが存在していないので404が返ってくるが
両方ともリソースは削除されている（存在していない）という同じ情報を受け取っているので冪等性があると言える。
また、エイリアスリソースのような特殊なリソース（リソースの中身が状況によって変化するようなリソース）は特別な理由がない限りは削除しないようにするべきである。

### PUTの冪等性
リソース内容の相対的な差分を送信すると、PUTは冪等性をなくす。なるべく完全な表現を送信するようにするべき。
tcp timewait tcp_tw_reuse メモ



tcpタイムウェイトがたまる時の対処法
tcp timewaitたまる -> アクセス受けられなくなる -> tcp_tw_reuseの設定を変更すれば対処できる。


https://askubuntu.com/questions/538443/whats-the-difference-between-port-status-listening-time-wait-close-wait

```
cat /proc/sys/net/ipv4/tcp_tw_reuse
0
```
デリゲートを利用して配列に関数を格納する

# はじめに
Unityでゲームを制作中、
「関数を配列に入れて、変数1つ変えるだけで使う関数を変えたい」
と思ったんです。

具体的には、
要素0.はかいこうせん
要素1.だいもんじ
要素2.ソーラービーム

として要素1呼んだら、だいもんじみたいな...

# コード
```c#
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System; //追記

public class UseSkill : MonoBehaviour
{
    public int skillNum; //スキル番号
    private int skillKindNum = 3; //スキルの種類数

    private Action sFunc[]; //スキルの関数を格納する配列

    public void SkillSet()
    {
        sFunc = new Action[skillKindNum];
        sFunc[0] = Hakaikosen;
        sFunc[1] = Daimonzi;
        sFunc[2] = Solarbeam;
    }

    private void Start(){
        SkillSet();
    }

    private void Update(){
        if(Input.GetButtonDown("Fire1")){
            sFunc[skillNum]();
        }
    }

    public void Hakaikosen(){
    }
    public void Daimonzi(){
    }
    public void Solarbeam(){
    }
}
```

これで"Fire1"が押されたらskillNumの関数が呼び出されます。

デリゲートもラムダ式もまだ理解が浅いので、もっと楽な方法がありそうです(絶対ある)。

# 終わりに
Unityで、初めてのWiiのTank!のようなゲームを作っています。
github: https://github.com/Papyrustaro/UnityTankGame

プレイヤーの使うスキルを簡単に変えるために利用したのが、今回の記事です。
もっと良い書き方等ありましたら、気軽にコメントください^^

Twitterもやってます: https://twitter.com/papyrustaro

(2019/07/02 20:30追記)
Actionを利用することにより、より簡潔に書くことができました
コメントしてくださったalbireoさんありがとうございます^^

(2019/07/06 11:59追記)
説明をわかりやすくするために、さらに簡潔にしました。
Windowsでコマンドプロンプトを指定のフォルダで素早く開く

#PowerShellは開発には向かない？
素人の意見なのであっているかわからないのだけど、3年くらいpythonを独学して分かったことは、PowerShellはプログラミングには使いにくいということである。OSがWindows10にアップデートされてから、通常のターミナルがコマンドプロンプトからPowerShellに置き換わっている。見た目や響きはカッコイイPowershellだけど、コマンドプロンプトの方が使えるようだ。
###仮想環境で作業できない
Pythonでアプリを作る際には、仮想環境を構築して作業を行うが、どうもPowerShellと仮想環境の相性が良くない。何が問題かというと、Powershellを使って仮想環境をアクティベーションし、仮想環境上でpythonのコマンドの```pip install``` を実施し、``` pip freeze > requirements.txt```を実施すると、パソコンにインストールされているライブラリ全てが書き出されてしまう[^1]。仮想環境については「[仮想環境とは][link]」にまとめた。
[^1]: （追記20190703）PowerShellを開くフォルダによって動作が異なることが分かった。デスクトップ上のフォルダでは上記の問題は発生しなかったが、クラウドストレージと同期しているフォルダ上では問題が発生した。

#指定のフォルダでコマンドプロンプトを素早く開く
PowerShellは指定フォルダ内の任意の場所で```Shift + 右クリック```するとメニュー画面に「PowerShellウィンドウをここに開く(S)」という項目が出てくるが、「コマンドプロンプトを開く項目」は表示されない。以下の方法で素早くコマンドプロンプトを開くことができる。
1. 指定フォルダ内で```alt + d```を押下し、アドレスバーに移動する。

![スクリーンショット 2019-07-02 20.57.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/dd4a7c7e-20cc-b741-142b-1592bb3c1f81.png)


2. アドレスバー内で```cmd```と入力し、```Enter```を押す。

![スクリーンショット 2019-07-02 20.54.50 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/0c279f3d-e827-f8ed-ea28-ac2dff3e7f9b.png)

3. 指定のフォルダ上でコマンドプロンプトが開らかれる
![スクリーンショット 2019-07-02 20.55.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/452364/b2776cd4-7c70-24b7-6853-d2b2a14bad2a.png)

是非、試してみて下さい。感想あればコメント頂けると嬉しいです。

[link]:https://qiita.com/Wanicosan/items/cd4d7e9de778bd79aae4
javascriptでのDOM操作　まとめ等🐴

#javascriptでのDOM操作　まとめ
前回jsでのDOM操作で詰まったところをまとめたが、（[jsでのDOM操作（初学で詰まったとこ)](https://qiita.com/irico/items/fc219185dac6bddf2c05）))
使用できるメソッド等が紹介したもの以外でもいっぱいあって混乱しそうだったので、簡単にまとめます。🐴

**今日の学び一覧**
・親要素と子要素のとりかた🐎
・子要素として追加する方法色々🐎
・DOMContentLoaded🐎
・クラスについての操作🐎
・カスタムデータの取得について🐎
・要素の複製（querySelector × appendChildの罠）🐎
・preventDefaultメソッド🐎


##親要素と子要素のとりかた🐎

```javascript
var get = element.parentNode     //elementの親要素が代入される
var get = element.children     //elementの子要素が代入される
```

##子要素として追加する方法色々🐎
①まず基本のappendChild。

```javascript
element.appendChild(div); //最後の子要素として追加
```

しかし、子要素を最初に入れたり、特定の位置で入れた場合が出てくる。
その時は**insertBeforeメソッド**を使用する。

②**エレメント.insertBefore(追加する要素,ここので指定した要素の直前に追加される)**
以下、使用例

```javascript
element.insertBefore(div, element.firstChild); //最初の子要素として追加

element.parentNode.insertBefore(div, element); //element要素直前に追加
```

##DOMContentLoaded🐎
ここでjavascriptで要素のチェックしよう！
→あれ、うまくいかないぞ、、
ということがあった場合に考えられるのが、**要素の読み込みがまだ終わっていない**という状況です。
javascriptの方が早く読まれてしまってるんですね。

それを防止できるのが**DOMContentLoaded**です。
これを使うと、HTMLの読み込みが終わったらこの処理を開始、ということができます。

```javascript
document.addEventListener('DOMContentLoaded',()=>{
   //読み込み後に行いたい処理
});
```

##クラスについての操作🐎

```javascript
element.className ="horse"
```

これでエレメントにつくクラスをhorseにすることができます。
ただ問題があって、**元々ついてた他のクラスも外してしまいます。**
elementにanimalクラスがついていた場合、horseのみしかつかないということです。

追加や削除をしたい場合はclassListメソッドが便利です。

```javascript
//クラス名の追加
document.getElementById('element').classList.add('active');
//クラス名の削除
document.getElementById('element').classList.remove('active');
//トグル
document.getElementById('element').classList.toggle('active');
//要素が指定したクラス名を持っているか
document.getElementById('element').classList.contains('active');
```

トグル・・・ついてない場合はつける、ついてる場合は外します。
条件分岐を書かないでいいので楽です🏇

containsに関しては返り値がブーリアン型になります。


##カスタムデータの操作について🐎

```HTML
<h1 data-top-size="big"></h1>
```
このようなカスタムデータがついている場合、カスタムデータは

```javascript
var customData = document.querySelector('h1.dataset.topSize') 
//bigが入る
```

CSSのプロパティ取得でもそうですが、
ハイフンが入る場合はハイフンを消してキャメルケースに直さなければいけません。🐴
data-top-size　→dataset.**topSize**

##要素の複製（querySelector × appendChildの罠）🐎
要素を複製したい場合に、単純にquerSelectorなどで取得した要素を
appendChildで子要素に付け足した場合、
**元の取得した部分は実は消えてしまいます！**

複製には**cloneNode**を使います。

```javascript

    var clone = news.firstElementChild.cloneNode(true); //複製する
    news.appendChild(clone):  //それをくっつける
```

引数部分はtrueだと孫要素ごと丸っとコピー、
falseだと子要素はコピーしない！となります。

##preventDefaultメソッド🐎
ブラウザが元からもつ動き、要素が元からもつ動きを封じることができます。

例えば、（このaタグが押されたらアニメーションをつけたい、けどリンクのせいで飛ばされちゃう...)
といった時、aタグのリンクジャンプ機能を封じることができるようです。

```javascript
element.addEventListener( 'click', function(e){
  e.preventDefault(); //クリックした時の元の動きを封じる
});
```
深層学習（前編 2）：「Section4 : 畳み込みニューラルネットワークの概念」

ニューラルネットワークの入力層、全結合層、出力層の間に畳み込み層とプーリング層をいれた構造をもったニューラルネットワークのことを畳み込みニューラルネットワークと呼ぶ。主に画像認識で使用されており、最近では自然言語処理(NLP)など他の用途にも使われ始めている。畳み込み層は縦、横、チャンネルの3次元のデータをそのまま学習し、次につなげる役割を持ち、プーリング層は重要な情報を残しながら元の情報を縮小していく役割をもつ。
DataDog APM をサポート外のフレームワークで利用する

公式ドキュメントを読んでいくと[こちら](https://docs.datadoghq.com/tracing/setup/java/)に実装方法が記載されており、サポートしているフレームワークの一覧がある。
ここだけ読むとサポート対象でないフレームワークでは利用できないように思えるが、サポートに問い合わせてみたところ、自動検出ではなくマニュアルで実装する方法があるとのこと。


マニュアルでの実装方法も[公式ドキュメントのこちら](https://docs.datadoghq.com/tracing/advanced/manual_instrumentation/?tab=java)にあるので、これに従って実装すれば良い

Javaアプリケーションの場合は下記のようにアノテーションをつけるだけでよい。

```java
import datadog.trace.api.Trace;

public class MyClass {
  @Trace
  public static void myMethod() {
    // your method implementation here
  }
}
```
Delphi の機能 (GetIt) インストーラで、デフォルトのフォルダ以外にインストールしたい

Delphi （C++Builder/RAD Studio) の機能 (GetIt) インストーラでは、そのまま何も指定せずにインストールを行うと

Windows 32bit OS の場合は
C:\Program Files\Embarcadero\Studio\20.0

Windows 64bit OS の場合は
C:\Program Files (x86)\Embarcadero\Studio\20.0

以下にデフォルトでインストールされます (10.3 Rio の場合です)

あー Program Files の下にインストールしたくないッ！という方もいると思います
（私がそうです）

以外に気がつかないところで、インストール先のフォルダは指定できるんですよ

## インストールフォルダの指定
10.3.1 Rio のインストーラの画面です
( バージョンによっては若干異なります )


最初に表示されるこの画面で、[オプション]のボタンをポチっとな
![install01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/8c1996eb-f853-c832-335b-e9b127604df5.png)

するとインストール先のフォルダが指定できるんですわ
![install02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164551/6d095570-869e-2024-f5a9-2abcf49cee65.png)

インストール先を
C:\Embarcadero\Studio\20.0
とか、自分の好きなパスに変更して、[OK]ボタンをポチっと押して、前の画面に戻り、後はインストール作業を続けるだけです
ホクホクのイモ

Goで書くとこうなるやつの話。

```go
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().UnixNano())
    s := ""
    rs := []rune("ホイクモ")
	for _, j := range rand.Perm(4)[:2] {
        s += string(rs[j])
    }
    s += s + "の"
	for _, j := range rand.Perm(4)[:2] {
        s += string(rs[j])
    }
    fmt.Println(s)
}
```

実行結果

```
ホクホクのクホ
ホイホイのイモ
イモイモのモイ
```

C++ だとこうなる

```cpp
#include <algorithm>
#include <iostream>
#include <vector>
#include <locale>
#include <iterator>
#include <random>
#include <codecvt> 

std::string
wstring2string(std::wstring& w) {
  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> cv;
  return cv.to_bytes(w);
}

int
main() {
  std::random_device seed_gen;
  std::mt19937 engine(seed_gen());

  std::wstring out;

  std::wstring hokuimo = L"ホクイモ";
  std::shuffle(hokuimo.begin(), hokuimo.end(), engine); 
  out = hokuimo.substr(0, 2);
  std::shuffle(hokuimo.begin(), hokuimo.end(), engine); 
  out += out + L"の" + hokuimo.substr(0, 2);
  std::cout << wstring2string(out) << std::endl;
  return 0;
}
```

※ mingw でも実行できる様に wout を使わない様にしています。実行結果は utf-8

Perl だとこう

```perl
use strict;
use warnings;
use utf8;
use List::Util qw/shuffle/;  

binmode STDOUT, ':encoding(utf-8)';
my @hokuimo = split('', 'ホクイモ');
my $hoku = join('', (shuffle(@hokuimo))[0..1]);
my $imo = join('', (shuffle(@hokuimo))[0..1]);
print "${hoku}${hoku}の${imo}";
```

やはりこういうのを書かせると Ruby の良さは際立つなぁと思いました。

```ruby
puts '%1$s%1$sの%2$s'%((%w[ホイクモ]*2).map{|x|x.chars.sample(2).join})
```

(`1$` は ujihisa さんに教えて貰った)
pg_dumpコマンドを複数バージョン入れる方法

AWSのRDS(PostgreSQL)等を利用していて、DBのバージョンを上げたりすると、以下のように接続元サーバーとのpg_dumpとのバージョン差異で怒られる場合がある

```
/usr/bin/pg_dump 接続先サーバー情報
pg_dump: server version: 9.5.15; pg_dump version: 9.3.14
pg_dump: aborting because of server version mismatch
```

接続元のサーバーがWEBサーバーだったりするとバージョンを上げたときにサーバープログラムへの影響度がわからないのでバージョンアップは避けたい。

別のディレクトリにPostgreSQLをソースからインストールすることで簡単に回避が可能


# 対象のPostgreSQLのソースを探す
https://www.postgresql.org/ftp/source/

上記のサイトから自分が取得したいバージョンを探してください

今回は、9.5.15をインストールしたいので
https://www.postgresql.org/ftp/source/v9.5.15/

![スクリーンショット 2019-07-02 15.07.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/132493/64065bce-25fc-ef22-db57-4ea68b3cc873.png)



上記から、 postgresql-9.5.15.tar.gzを右クリックして「リンクのアドレスをコピー」

# インストール


```
cd /usr/local/src
wget https://ftp.postgresql.org/pub/source/v9.5.15/postgresql-9.5.15.tar.gz
tar -xvzf postgresql-9.5.15.tar.gz
cd postgresql-9.5.15
```

ここで、初めに作成したインストール先のディレクトリをprefixで指定し、インストール

```
./configure --prefix=/usr/local/postgresql-9.5.15/ --with-pgport=5432
make
make install
```

これで、以下のようなパスにpg_dumpがインストールされました

```
/usr/local/postgresql-9.5.15/bin/pg_dump
```

以上です
DBのデータをVIEWに表示

自分用。

まずはデータをallで取り出し。

   def index
      @products = Product.all
   end

VIEWの記述。
全体の箱で繰り返し処理をeachで行い。
必要箇所で、表示させる。
product.product_introductionは「productテーブルのproduct_introduction」を表示。


.box-contents
  - @products.order('created_at DESC').limit(4).each do |product|
    .items-box
      .items-box_photo
        = image_tag product.product_introduction, size: "210x200"
      .items-box_body
        %h3.items-box-name
          = product.product_name
        .items-box-num
          .items-box-price  
            = product.price
          .items-box-icon
            %i.far.fa-heart
            8
        .items-box-tax
          (税込)
AtCoderProblemsの存在に気づいた灰色Coderの話

###先週のABCの感想
　さて、ABC132が開催されましたね！
　今回はA問題にかなり時間をとられて、D問題を考える時間が足りず惜しい結果になってしまいました。ちなみに今回のコンテストで僕は茶色への道が見えてきました。
<img width="971" alt="スクリーンショット 2019-07-02 12.51.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407528/822f3407-9d82-6fee-96c2-a30df126f1c5.png">
###本題
　今回の記事で書きたかったのは[AtCoderProblems](https://kenkoooo.com/atcoder/#/table//)についてです。最近見つけたサイトなのですが、これが競プロ初心者に非常に優しい！
<img width="1440" alt="スクリーンショット 2019-07-02 13.07.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407528/e0f3648a-4aa6-5a8b-6f7b-ab35ed6bd852.png">
上の画像の黒丸印のところにUserID（僕でいうkamecha）を入力するし、Enterをおすと、
<img width="1440" alt="スクリーンショット 2019-07-02 13.10.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407528/3a1fb9d6-48af-11af-52db-00d7ce73faa4.png">
上の画像の様に色づけされて、自分の解いた問題が視覚的に分かるのです！
ちなみに、上のUser PageやList、Tableを押すことでそれぞれの詳細へ行くことができます。そして、それぞれの問題をクリックすることにより、その問題に挑戦することができます。その結果が反映されるのに多少時間がかかりますが、それはあまり気にならないと思うので大丈夫でしょう...
そして、このサイトを活用することにより、平日はABCの過去問を解き、週末にコンテストに参加するという、いわゆる競プロerの生活ができちゃうのです。自分はまだ灰色Coderなので偉そうなことは言えませんが、これから精進したいなぁと思ってます！
Invalid storage size for engine name postgres and storage type....

Cloudformationで管理しているRDSのストレージサイズを変更しようと思ったらエラーにあたったのでメモします。

【CloudFormationでのエラー内容】
状況：UPDATE_FAILED
タイプ：AWS::RDS::DBInstance
状況の理由：
Invalid storage size for engine name postgres and storage type gp2: xxx
(Service: AmazonRDS; Status Code: 400; Error Code: InvalidParameterCombination; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)

【原因】
今回は下記が原因でした。
現行より10%以上大きい値をセットしなければ、エラーとなる。
参考）https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_PIOPS.StorageTypes.html
[ストレージ割り当て] を増加する場合、少なくとも 10 パーセント増加する必要があります。10 パーセント以下で増加しようとすると、エラーが表示されます。

【解決策】
現行より10%以上大きい値をセットし、再実行する。
（現行が20GiBの場合、22GiB以上の値をセットする）


ちなみにRDSインスタンスを直接変更する手順だと、わかりやすくエラー表示してくれるのですぐに気づけたと思います。
![無題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130739/e4a6edb4-41af-5279-7344-ed4fe61b1632.png)
![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/130739/244b9f6c-cc2f-f14a-9c6c-5ca7963a9683.png)
[勉強用] React hooksで非同期処理を書く (ステップ6)

## はじめに

[前ステップ](https://qiita.com/daishi/items/a6a1caeb28f599b10517)から続き、勉強用のuseFetchを書いていきます。今回のテーマはfetchのオプションです。

## 課題

これまでは、単純なHTTP GETのみを想定してきましたが、HTTP POSTやヘッダー指定などが必要となる場面もあるでしょう。[Fetch API](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API)には、オプションが渡せるようになっています。また、これまではJSONを取得することを前提としていましたが、JSON以外のデータも扱いたいかもしれません。

（今回は、ストリームまでは扱いません。hookでストリームをどう扱うかはより複雑な問題になりそうです。）

## ステップ6: fetchオプション

```javascript
const defaultOpts = {};
const defaultReadBody = body => body.json();
const useFetch = (
  url,
  opts = defaultOpts,
  readBody = defaultReadBody
) => {
  const [result, setResult] = useState({});
  useEffect(() => {
    let cleanedUp = false;
    const abortController = new AbortController();
    const fetchData = async () => {
      try {
        const response = await fetch(url, {
          ...opts,
          signal: abortController.signal
        });
        if (!response.ok) throw new Error(`status: ${response.status}`);
        const data = await readBody(response);
        if (!cleanedUp) {
          setResult({ data });
        }
      } catch (error) {
        if (!cleanedUp) {
          setResult({ error });
        }
      }
    };
    setResult({ loading: true });
    fetchData();
    const cleanup = () => {
      cleanedUp = true;
      abortController.abort();
      setResult({});
    };
    return cleanup;
  }, [url, opts, readBody]);
  return result;
};
```

注意点としては、`defaultOpts`と`defaultReadBody`は、useFetchの外側で定義してあることです。

## 動作確認

実際に動くコードはこちらです。[codesandbox](https://codesandbox.io/s/immutable-glade-oi50p)

`opts`を指定する場合は、コンポーネントやhookの外側で定義することが基本です。renderで新しいオブジェクトが作られると、useEffectが無限ループになります。propsに依存したオプションを設定したい場合は`useMemo`などでmemoizeする必要があります。(その場合はexhaustive-depsのルールでdepsが適切か確認しましょう。)

## おわりに

本ステップでuseFetchの実装は完了しました。これをそのままでも、これをベースに修正を加えてでも、利用することができると思います。

[こちらの記事](https://qiita.com/daishi/items/f12f524e9d1df0b52d2b)で紹介したuseFetchはほぼ同じ機能を持ちますが、useReducerで実装されていることと、その他変数名などが多少異なります。好みで使い分ければ良いと思います。
【Python】 プロジェクトオイラー　Problem 5

#####2520 は 1 から 10 の数字の全ての整数で割り切れる数字であり, そのような数字の中では最小の値である

#####では, 1 から 20 までの整数全てで割り切れる数字の中で最小の正の数はいくらになるか

Problem4は**[こちら](https://qiita.com/projecteuler/items/3f1bdb3e7d9fd1ff2def)**から

なるほど、つまりif文で2から20まで割りきれたときのみ変数に出力すればいいと

とりあえず上限を**5億**にしてやってみる

```python
for a in range(500000000):
	if a % 2 == 0 :
		if a % 3== 0 :
			if a % 4 == 0 :
				if a % 5 == 0 :
					if a % 6 == 0 :
						if a % 7 == 0 :
							if a % 8 == 0 :
								if a % 9 == 0 :
									if a % 10 == 0 :
										if a % 11 == 0 :
											if a % 12 == 0 :
												if a % 13 == 0 :
													if a % 14 == 0 :
														if a % 15 == 0 :
															if a % 16 == 0 :
																if a % 17 == 0 :
																	if a % 18 == 0 :
																		if a % 19 == 0 :
																			if a % 20 == 0 :
																				b = a
																				print(b)

0
232792560
465585120

```

[http://kingyojima.net/pje/005.html:title]

正解は232792560とのことなので上限を3億にしてみる

さすがにもう一度は書き込みませんが上限を3億にしておわりです

はっきり言って全く**参考にならない**と思いますがこういうやつもいると思ってください...

problem6は**[こちら](https://qiita.com/projecteuler/items/171af35f50c3d14f2227)**から
React コンポーネント化する時の考え方 【snippets】

# Reactでコンポーネントをつくる際の考え方メモ

例えばReactで``SearhBox``などを一つのコンポーネントとしてつくる際、下記のようにしていました。

プレイスホルダーに``Search Products``とあり、
Eコマースなどで商品を検索するイメージです。

```react:SearchBox.jsx
  export const SearchBox = () => (
  <input
    className="search"
    type="search"
    placeholder="Search products"
    onChange={(e) => console.log(e.target.value)}
  />
);
```

そしてこれを``App.js``に追加し、

```react:App.js
  return (
      <div className="App">
        <SearchBox />
      </div>
    );
```


ただし、例えばProducts検索ではなく画像検索の際は新たに新しくSearchBoxを作らなければなりません。

Reactの**使い回しができる**という視点が抜けていたので、わざわざ似たようなコードを書いていましたが、下記のような書き方によって再利用可能なコンポーネントになります。

```react:SearchBox.jsx
  export const SearchBox = ({ placeholder, handleChange }) => ( // 追加
  <input
    className="search"
    type="search"
    placeholder={placeholder} // 変更
    onChange={handleChange} // 変更
  />
);
```

親コンポーネントであるApp.jsは下記に変更


```react:App.js
return (
      <div className="App">
        <SearchBox
          placeholder="Search Image"
          handleChange={e => console.log(e.target.value)}
        />
      </div>
    );
```

かなり簡易化しており、あくまでも**使い回しするためにこんな考え方があるよ！**というのを学んだ際の例ですのであしからず・・・。



書いてみるととても基本的なことではありますが、このような視点を入れるとメンテナンスなどもしやすく、コードがキレイになると聞きましたので、積極的にこの視点を取り入れてみたいと思います！
Homebrewで「Warning: Unbrewed .pc files were found in /usr/local/lib/pkgconfig.　・・・」とエラーが出た際の解消法

## 1.環境
PC : mac
OS : macOS Mojava バージョン10.14.4
Homebrew : バージョン 2.1.6


## 2. エラーが出るコマンドの例

~~~
brew doctor
~~~
これは、インストール問題をチェックするコマンドです。
※ その他にもエラーの出るコマンドはあるかもしれません。そこまで確認出来ていません。ごめんなさい。



## 3. エラーの出力部分

>username$ brew doctor
Warning: Unbrewed .pc files were found in /usr/local/lib/pkgconfig.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

>Unexpected .pc files:
  　/usr/local/lib/pkgconfig/tcl.pc
 　/usr/local/lib/pkgconfig/tk.pc


## 4. 解決策
今回のエラーの場合
1.　ターミナルを起動

2.　ターミナルに以下のコマンドを入力

~~~
$ rm -rf /usr/local/lib/pkgconfig/tcl.pc
~~~

~~~
$ rm -rf /usr/local/lib/pkgconfig/tk.pc
~~~

## 5. 参考文献

[TASK NOTES | 【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて](https://www.task-notes.com/entry/20141223/1419324649)
Homebrewで「Warning: Unbrewed static libraries were found in /usr/local/lib.　・・・」とエラーが出た際の解消法

## 1.環境
PC : mac
OS : macOS Mojava バージョン10.14.4
Homebrew : バージョン 2.1.6


## 2. エラーが出るコマンドの例

~~~
brew doctor
~~~
これは、インストール問題をチェックするコマンドです。
※ その他にもエラーの出るコマンドはあるかもしれません。そこまで確認出来ていません。ごめんなさい。



## 3. エラーの出力部分

>$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

>Warning: Unbrewed static libraries were found in /usr/local/lib.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

>Unexpected static libraries:
　/usr/local/lib/libtclstub8.6.a
　/usr/local/lib/libtkstub8.6.a

## 4. 解決策
今回のエラーの場合
1.　ターミナルを起動

2.　ターミナルに以下のコマンドを入力

~~~
$ rm -rf /usr/local/lib/libtclstub8.6.a
~~~

~~~
$ rm -rf /usr/local/lib/libtkstub8.6.a
~~~

## 5. 参考文献

[TASK NOTES | 【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて](https://www.task-notes.com/entry/20141223/1419324649)
Homebrewで「Warning: Unbrewed header files were found in /usr/local/include.　・・・」とエラーが出た際の解消法


Homebrewを使っている際、
アップデートやインストール問題のチェックを行うと出るエラーが出ることがあります。

## 1.環境
PC : mac
OS : macOS Mojava バージョン10.14.4
Homebrew : バージョン 2.1.6

 
## 2. エラーが出るコマンドの例

インストール問題のチェック

~~~
brew doctor
~~~

## 3. エラーの出力部分
>$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

>Warning: Unbrewed header files were found in /usr/local/include.
If you didn't put them there on purpose they could cause problems when
building Homebrew formulae, and may need to be deleted.

>Unexpected header files:
  　/usr/local/include/fakemysql.h
  　/usr/local/include/fakepq.h
  　/usr/local/include/fakesql.h
  　/usr/local/include/itcl.h
  　/usr/local/include/itcl2TclOO.h
  　/usr/local/include/itclDecls.h
  　/usr/local/include/itclInt.h
 　 /usr/local/include/itclIntDecls.h
 　 /usr/local/include/itclMigrate2TclCore.h
 　 /usr/local/include/itclTclIntStubsFcn.h
  　/usr/local/include/mysqlStubs.h
  　/usr/local/include/odbcStubs.h
  　/usr/local/include/pqStubs.h
  　/usr/local/include/tcl.h
  　/usr/local/include/tclDecls.h
  　/usr/local/include/tclOO.h
  　/usr/local/include/tclOODecls.h
  　/usr/local/include/tclPlatDecls.h
  　/usr/local/include/tclThread.h
  　/usr/local/include/tclTomMath.h
  　/usr/local/include/tclTomMathDecls.h
  　/usr/local/include/tdbc.h
  　/usr/local/include/tdbcDecls.h
  　/usr/local/include/tdbcInt.h
  　/usr/local/include/tk.h
  　/usr/local/include/tkDecls.h
  　/usr/local/include/tkPlatDecls.h

## 4. 解決策
1.　ターミナルを開く
2.　以下のコマンドを実行
フォルダを移動するコマンドです。

~~~
cd ~/../../usr/local/include/
~~~

3.　以下のコマンドを実行
そのフォルダでファインダーを開くコマンドです。

~~~
open .
~~~

4.　__エラーの出力のなかに書いてあるファイルをすべて削除してください。__

僕の場合、以下の
>  　/usr/local/include/fakemysql.h
  　/usr/local/include/fakepq.h
  　/usr/local/include/fakesql.h
  　/usr/local/include/itcl.h
  　/usr/local/include/itcl2TclOO.h
  　/usr/local/include/itclDecls.h
  　/usr/local/include/itclInt.h
 　 /usr/local/include/itclIntDecls.h
 　 /usr/local/include/itclMigrate2TclCore.h
 　 /usr/local/include/itclTclIntStubsFcn.h
  　/usr/local/include/mysqlStubs.h
  　/usr/local/include/odbcStubs.h
  　/usr/local/include/pqStubs.h
  　/usr/local/include/tcl.h
  　/usr/local/include/tclDecls.h
  　/usr/local/include/tclOO.h
  　/usr/local/include/tclOODecls.h
  　/usr/local/include/tclPlatDecls.h
  　/usr/local/include/tclThread.h
  　/usr/local/include/tclTomMath.h
  　/usr/local/include/tclTomMathDecls.h
  　/usr/local/include/tdbc.h
  　/usr/local/include/tdbcDecls.h
  　/usr/local/include/tdbcInt.h
  　/usr/local/include/tk.h
  　/usr/local/include/tkDecls.h
  　/usr/local/include/tkPlatDecls.h


のファイルをすべて削除しました。
※　エラーの出ていないファイル・フォルダがある可能性もあるので注意してください。

以上で解決で私は解決出来ました。

## 5. 参考文献
[一馬力のメモ帳 | Homebrewの問題を確認する"brew doctor"コマンドとWarning対策集[macOS]](https://ichibariki.hatenablog.com/entry/2018/03/24/213524#Warning-Unbrewed-header-files-were-found-in-usrlocalinclude)
Homebrewで「Warning: "config" scripts exist outside your system or Homebrew directories　・・・」とエラーが出た際の解消法

## 1.環境
PC : mac
OS : macOS Mojava バージョン10.14.4
Homebrew : バージョン 2.1.6
__anacondaを使用中__


## 2. エラーが出るコマンドの例

~~~
brew doctor
~~~
これは、インストール問題をチェックするコマンドです。
※ その他にもエラーの出るコマンドはあるかもしれません。そこまで確認出来ていません。ごめんなさい。



## 3. エラーの出力部分

>username$ brew doctor
Please note that these warnings are just used to help the Homebrew maintainers
with debugging if you file an issue. If everything you use Homebrew for is
working fine: please don't worry or file an issue; just ignore this. Thanks!

>Warning: "config" scripts exist outside your system or Homebrew directories.
'./configure' scripts often look for *-config scripts to determine if
software packages are installed, and which additional flags to use when
compiling and linking.

>Having additional scripts in your path can confuse software installed via
Homebrew if the config script overrides a system or Homebrew-provided
script of the same name. We found the following "config" scripts:
  　/anaconda3/bin/icu-config
  　/anaconda3/bin/krb5-config
  　/anaconda3/bin/freetype-config
  　/anaconda3/bin/xslt-config
  　/anaconda3/bin/libpng16-config
  　/anaconda3/bin/python3.7-config
  　/anaconda3/bin/libpng-config
  　/anaconda3/bin/xml2-config
  　/anaconda3/bin/python3.7m-config
  　/anaconda3/bin/python3-config
  　/anaconda3/bin/curl-config
  　/anaconda3/bin/ncursesw6-config
  　/anaconda3/bin/pcre-config




## 4. 解決策
今回のエラーの場合
1.　ターミナルを起動

2.　現在ユーザのホームディレクトリに移動
ターミナルに以下のコマンドを入力

~~~
cd ~
~~~

2.　今回の場合「.bash_profile 」ファイルの末尾に「alias brew="env PATH=${PATH/\/anaconda3\bin:/} brew"」を追記  

~~~
echo 'alias brew="env PATH=${PATH/\/anaconda3\bin:/} brew"' >> ~/.bash_profile 
~~~

※1　「alias brew="env PATH=${PATH/\/anaconda3\/bin:/} brew"」の`${PATH/\/anaconda3\/bin:/}`の部分は適宜自分のエラーが出ているフォルダに変更してください。 今回の場合、「3. エラー出力の部分」の下の方を見ました。  
  ※2 `${PATH/\/anaconda3\/bin:/}`は、`PATH`の`/anaconda3/bin`と言う文字列を空文字に置き換えています。
  ※3 `\（バックスラッシュ）`は文字列の　`/(スラッシュ)`が置換記法の`/(スラッシュ)`と認識されないようにつけています。

>--ご意見をいただき一部修正しました--
${FOO/xxx/yyy} は環境変数 FOO に含まれる文字列 xxx を文字列 yyy に置き換えるという意味です。ここでは PATH に含まれる文字列 /anaconda3/bin: を空文字列に置き換えています。

## 5. 参考文献

[TASK NOTES | 【Homebrew】brew doctorのWarning対処方法 (その3) + envコマンドについて](https://www.task-notes.com/entry/20141223/1419324649)
[cBlog | HomebrewとAnacondaの相性の悪さについて](https://yaritakunai.hatenablog.com/entry/2017/08/18/181000)
[ようへいの日々精進XP | Bash で変数内の文字列を置換するショートメモ](https://inokara.hateblo.jp/entry/2016/02/07/110113)
Homebrewで「Warning: The following directories are not writable by your user:」とエラーが出た際の解消法

Homebrewを使っている際、
アップデートやインストール問題のチェックを行うと出るエラーが出ることがあります。

## 1.環境
PC : mac
OS : macOS Mojava バージョン10.14.4
Homebrew : バージョン 2.1.6
__このPCではanacondaを使用しています__
 
## 2. エラーが出るコマンドの例

アップデート  

~~~
brew update
~~~
<br>
インストール問題のチェック

~~~
brew doctor
~~~

## 3. エラーの出力部分
>Warning: The following directories are not writable by your user:
/usr/local/lib/pkgconfig
/usr/local/share/info
/usr/local/share/man/man3
/usr/local/share/man/man5

>You should change the ownership of these directories to your user.
  sudo chown -R $(whoami) /usr/local/lib/pkgconfig /usr/local/share/info /usr/local/share/man/man3 /usr/local/share/man/man5

>And make sure that your user has write permission.
  chmod u+w /usr/local/lib/pkgconfig /usr/local/share/info /usr/local/share/man/man3 /usr/local/share/man/man5


## 4. 解決策
今回のエラーの場合

~~~
sudo chown -R $(whoami) /usr/local/lib/pkgconfig /usr/local/share/info /usr/local/share/man/man3 
~~~

正確には

~~~
sudo chown -R $(whoami) エラーのあるフォルダのパス
~~~

です。まあ、正直エラーのにどうすればこのエラーが解消されるか書いてありますね。。
これは、僕調べではフォルダのユーザー権限を変更するコマンド見たいです。


## 5. 参考文献
[システムデザイン研究所 | Homebrewがupdateできないときの対処](http://fukuzawalab.com/blog/archives/1301)
[Qiita | homebrewとは何者か。仕組みについて調べてみた](https://qiita.com/omega999/items/6f65217b81ad3fffe7e6)
Kubernetes 1.15: SIG-Auth の変更内容

## はじめに

このページではKubernetes v1.15におけるSIG-Authに関連する取り組みをまとめています。

:pencil: がついた文章は、CHANGELOGの公式内容ではなく筆者の補足です。

## アップグレード時の注意点 (Urgent Upgrade Notes)

- Rancher クレデンシャルプロバイダーが除去されました。これは1.6の古いバージョンのRancherを使っている場合に影響があります。([#77099](https://github.com/kubernetes/kubernetes/pull/77099), [@dims](https://github.com/dims))

:pencil: Rancherの1.6ブランチで対象のコードを参照していたようですが現在の2.2では利用されておらず、またRahcner以外で利用されていないため除去されたようです。

## 注目機能 (Notable Features)

#### Beta

- GMSAアカウントのサポート機能はベータ用の新しいAPIに移行しました。 またそのための特別なアノテーションは廃止されました。([#75459](https://github.com/kubernetes/kubernetes/pull/75459), [@wk8](https://github.com/wk8))

:pencil: Windowsノードで動作するPod/ContainerにGMSAを設定することができる機能です。この機能ではGMSACredentialSpecというCRDを定義し、Podから参照されますが、これまでアノテーションでそのリソースのNameを指定していたものが、PodのSpecとして指定できるようになりました。

#### Misc

- サービスアカウントコントローラのクライアントはTokenRequest APIを使用するようになり、トークンは定期的にローテーションされます。([#72179](https://github.com/kubernetes/kubernetes/pull/72179), [@WanLinghao](https://github.com/WanLinghao))

:pencil: 安全にSAトークンを扱うにあたって、これまで固定のSAトークンを使っていたものを、まずはTokenRequest APIを使い期限付きのトークンを発行してローテーションされるようにしていくようです。

## その他の注目機能 (Other notable changes)

- OIDC認証でclient secretに特殊文字を含んだ場合にリフレッシュが正しく動作しない不具合を修正 ([#76914](https://github.com/kubernetes/kubernetes/pull/76914), [@tsuna](https://github.com/tsuna))
- `kubectl auth can-i` コマンドでスコープ外のリソースにアクセスしようとした場合のエラー処理を改善 ([#76014]((https://github.com/kubernetes/kubernetes/pull/76014)), [@WanLinghao](https://github.com/WanLinghao))
- `tokenreviews`, `subjectaccessreviews`, `localsubjectaccessreviews`, `selfsubjectaccessreviews`, `selfsubjectrulesreviews` のリソースに対する CREATE 操作において、Validating admission webhooks が正しく呼ばれるようになりました。 ([#76959](https://github.com/kubernetes/kubernetes/pull/76959), [@sbezverk](https://github.com/WanLinghao))
【DB未使用 初級PHPアプリケーション】投票アプリ作ってみた。

## 最初に
何番煎じだよってなるかもしれませんが
PHP初心者におすすめのCSVを使用した投票アプリ作成してみました。
jquery.cookie.jsでCookieを利用した多重投票無効機能付きです。
公開方法はGitHubからHerokuへデプロイしました。

[DEMO](https://voting-php.herokuapp.com/)
[GitHubRepository](https://github.com/TK-bone/Voting_php)


## 使用言語
 * PHP
 * JavaScript
 * HTML
 * CSS

## 使用ライブラリ＆プラグイン
 * [jQuery](https://jquery.com/)
 * [jquery.cookie.js](https://github.com/carhartl/jquery-cookie)
 
## License
MIT
【Python】 プロジェクトオイラー　Problem 4

####<i>左右どちらから読んでも同じ値になる数を回文数という. 2桁の数の積で表される回文数のうち, 最大のものは 9009 = 91 × 99 である.

####では, 3桁の数の積で表される回文数の最大値を求めよ.</i>

Problem2は**[こちら](https://qiita.com/projecteuler/items/fea990abdd397842a1e9)**から


解くために必要なことは

①**三桁かける三桁の計算**

②**左右から読んで同じ数字を抜き出す**

③**その中の最大の値を求める**

で、できるはず

とりあえず①に関しては、for関数を使えばなんとかなりそう

②には今のところ全く解き方が思い浮かばないのでググる

③は抜き出した数値を変数に「今の変数の値より大きいときのみ」上書きすればできるはず

ということでとりあえず①から解いてみる

```python

for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                
        print(seki)

99900
100899
101898
102897
省略
995004
996003
997002
998001
```

端折りましたがかなりの数が出てきたので多分成功しているはず

これで変数sekiに3桁かける3桁の解を1回は出力させれたはずなので

②の回文数の求め方をググります

びっくりするくらいぴったりのやり方を見つけられた

[https://qiita.com/okkn/items/54e81346d8f35733ab5e:title]

ここのサイト曰く

> 逆順にしたけりゃ[リストor文字列][::-1]にしとけ！！

とのことなので**[::-1]を使えばリストの中の数字が逆順になるらしい**

試してみる

```python
a = [1,2,3,4,5,6,7,8,9]
print(a[::-1])

[9,8,7,6,5,4,3,2,1]
```

逆順になっているのでこのまま②の部分までプログラムを作ってみる。

とりあえず、[::-1]を使って逆順にした変数と元の変数がイコールの時のみ抜き出したい。

```python
for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = seki[::-1]
                if seki == seki_gyaku:
                    kaisuu = seki
                    print(kaisuu)
```

**エラーが出てしまった...**

何が違うのか考える。

先ほどのサイトに答えが書いてあった...

[::-1]を使えるのは、**リストか文字列のみ**みたい

書き直してみる

```python
for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki[::-1])
                if seki == seki_gyaku:
                    kaisuu = seki_gyaku
                    print(kaisuu)
```
またもやエラー

調べてるうちに

###### if seki == seki_gyaku:

のsekiとseki_gyakuとで**属性がちがう**らしい

詳しく言うと、sekiはint（整数）でseki_gyakuはstr（文字列）とのこと

考えてみれば、strで属性を変えたものと変える前を比べたらできないのが当たり前かも

というわけで同じstr同士でif文を作てっみる

```python
for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki)
                if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    print(kaisuu)


省略
282282
119911
906609
514415
580085
```

いろいろ出てきたけど回数文しか出てきてないから成功のはず

あとは最大値を抜き取るだけ

最大値はif文を使えばできそう

とりあえずkotaeという変数を用意してそこに答えを詰め込む

```python
kotae = 0
省略
if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    if kaisuu > kotae:
                        kotae = kaisuu
                        print(kotae)

```

先ほどの続きで書いたけどエラー

でもこれはすぐわかった

さっきと同じでint型とstr型を比べているから

なんとかkaisuuをstr型からint型にしたい

ググる

[https://note.nkmk.me/python-str-num-conversion/:title]

int()でint型にできるらしい

ということで

```python
kotae = 0
for a in range(100,1000):
        for b in range(100,1000):
                seki = a * b
                seki_gyaku = str(seki)
                if seki_gyaku == seki_gyaku[::-1]:
                    kaisuu = seki_gyaku
                    if int(kaisuu) > kotae:
                        kotae = int(kaisuu)
print(kotae)

906609
```

[http://kingyojima.net/pje/004.html:title]

あってるーーーー

Problem5は**[こちら](https://qiita.com/projecteuler/items/15479b99ef38ae936fde)**から
Laravel のキャッシュをやみくもに削除したいとき

Laravel のキャッシュをとりあえず消すやりかたのメモ
(いっつも忘れるので)

```bash
php artisan clear-compiled
php artisan optimize
php artisan config:cache
```

`composer purge-laravel-cache` とかで `composer` 経由で叩けるようにしておくと楽ですね:

```json:composer.json
{
    "scripts": {
        "purge-laravel-cache": [
            "php artisan clear-compiled",
            "php artisan optimize",
            "php artisan config:cache"
        ]
    }
}
```

config の変更が反映されてなくて、
キャッシュのせいにするときに叩き放題です。
mysqlshを使ってinnodbclusterのサービス停止、起動について

#背景
Mysql設定変更じなどメンテナンス作業時クラスタを完全に再起動したい場合があるかと思います。
クラスタを完全停止した場合は、サービス起動⇒Groupreplicationを起動するだけでクラスタを起動できません。
と言ってクラスタを作り直したり、memberをjoinし直したりするのもよろしくなかったので
試行錯誤で以下の方法にたどり着いたんですが、もっといい方法があれば教えていただければと思います。

#環境

instance1: primary
instance2: secondary
instance3: secondary
OS: Centos7.3
mysql: mysql-community-server-8.0.16

#サービス停止
普通に全インスタンスで`systemctl stop mysqld`を実行すればよいですが、
`single primary`モードで`Failover`させたく無い場合は、secondaryから停止する必要があります。

#サービス起動
新規にクラスタを作るのではなく、既存クラスタを`iteractive:off`で再起動する方法を紹介(既にご存じ？)します。

###mysqld起動
```
systemctl start mysqld
```

###Group Replication停止

```
#/bin/mysqlsh user@ip:port --sql -e 'stop group_replication;'
```
>・group_replication_start_on_boot=onの場合はサービス起動時に`start group_replication`を起動してくれ、
クラスタが既に起動している場合のみ自動参加されますが、クラスタ自体は起動してくれません。(なので少なくともprimaryは停止する必要があります。)
>・user@ip:portはmyloginに設定しておけば、パスワード聞かれずに実行可能です。

###Group Replication開始(primary)
```
#/bin/mysqlsh user@ip:port --py -e 'dba.reboot_cluster_from_complete_outage("cluster_name", {"removeInstances": [],"rejoinInstances": [], "clearReadOnly": True})'
```

>reboot_cluster_from_complete_outage で既存のクラスタを再起動します。
>removeInstances: 言葉の通り、クラスタ起動時に消したいメンバーを書きます。聞かれたくないので[]を指定します。
>rejoinInstances: 言葉の通り、クラスタ起動時にJoinしたいメンバーを書きます。すぐsecondaryのgroup_replicationを起動する場合は、指定しなく([]にする)てもよいです。
>clearReadOnly: replication_groupを離れる場合のオプションによって、readonlyになる可能性があるため、念のためTrueにします。
>なお、reboot_cluster_from_complete_outageを実行することによって`group_replication_start_on_boot=on`に設定されます。`mysqld-auto.cnf`で確認できます。offにしたい場合は
`#/bin/mysqlsh user@ip:port --sql -e 'set persist group_replication_start_on_boot=off'`

###primaryが起動されていることを確認
```
sql>select MEMBER_ID,MEMBER_HOST,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
MEMBER_ID       MEMBER_HOST     MEMBER_STATE    MEMBER_ROLE
0cffd742-98b6-11e9-b857-fa163e0290da    instance1        ONLINE  PRIMARY
```

###Group Replication開始(secondary)※起動されている場合は不要
```
#/bin/mysqlsh user@ip:port --sql -e 'stop group_replication;'
```

###secondaryが起動されていることを確認
```
sql>select MEMBER_ID,MEMBER_HOST,MEMBER_STATE,MEMBER_ROLE from performance_schema.replication_group_members;
MEMBER_ID       MEMBER_HOST     MEMBER_STATE    MEMBER_ROLE
0cffd742-98b6-11e9-b857-fa163e0290da    instance1        ONLINE  PRIMARY
4e9c38f8-98b6-11e9-a435-fa163e020899    instance2        ONLINE  SECONDARY
4ead6a0f-98b6-11e9-ac78-fa163e02119d    instance3        ONLINE  SECONDARY

```

#終わり
gitignoreが反映されない時は

#あとから変更した .gitignore が反映されない場合
* [参考サイト](http://www-creators.com/archives/1662)
* 一度git addをしたファイルは、インデックスに追加され、.gitignoreファイルに追記してもｋ
追跡対象に含まれてしまう。
* 下記コマンドでインデックスからファイルを削除しれば、トラッキング対象から除外できる。

```
git rm --cached <FILE_NAME>
```

* インデックス領域を示すオプション「--cached」をつけることで、ファイル実体はそのままで、
インデックスからのみファイルを削除でる。
【備忘録】M5Stackでif(M5.BtnA.wasPressed())以下のプログラムが動かない時

＊M5Stack初心者向けの記事です。
M5Stackには３つの操作ボタンが付属しています。
![Qiita.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412023/640ebefd-dde0-25d2-53c1-4ae13483920b.png)


これらのボタンは左からA,B,Cと振り分けられているのですが、ボタンAを押した時に変化が起こるようなプログラムを書きたかったので以下のようなコードを書きました。

```ruby:qiita.ino

void setup(){
}
void loop(){
/*諸々のプログラム*/

if(M5.BtnA.wasPressed()){
/*実行したい内容*/
}

}
```
このままでは動かなくて、他のサンプルコードを調べてみたら、loop関数内にどのコードもM5.update();が入っていて、これをプログラム内に挿入したらボタン入力にきちんと反応するようになりました。正しいコードは以下になります。

```ruby:qiita.ino

void setup(){
}
void loop(){
/*諸々のプログラム*/

if(M5.BtnA.wasPressed()){
/*実行したい内容*/
}
M5.update();

}
```

M5.update()は、M5Stackのボタン操作の状況を読み込む関数なので、ボタン操作を行うコードを書く時には必須のようです。
ちなみにこちらの記事 https://scrapbox.io/sayamake/M5.update では、ボタン操作をした後に記載しますと書かれていますが、自分の場合はM5.BtnA.wasPressed()の前に記載しても問題なく動きました。
Rust で Web サーバーから HTTP リクエストを送信する（だけのことがなんだかむずかしかったのでなにかまちがっているのではないか）

# はじめに

* Rust で Web サーバーの HTTP ハンドラの中から別のサービスへ HTTP リクエストを送信するだけのコードを書こうと思ったのですが意外にむずかしくてびっくりしました。
* 一応動くものはできましたが、なんだか仰々しくなってしまい何か間違っている気がするので「普通はもっとこうするよ」とかご指摘あったら大歓迎の気持ちで公開してみます。

# コード

```toml:Cargo.toml
[dependencies]
hyper = "0.12"
hyper-tls = "0.3.2"
futures = "0.1"
```

```rs:src/main.rs
use futures::future::Future;
use hyper::rt::{self, Stream};
use hyper::service::service_fn_ok;
use hyper::{Body, Client, Request, Response, Server};
use hyper_tls::HttpsConnector;

fn main() {
    let addr = ([127, 0, 0, 1], 3000).into();

    // HTTP ハンドラの登録
    let new_svc = || service_fn_ok(handler);

    // HTTP サーバーの作成と実行
    let server = Server::bind(&addr)
        .serve(new_svc)
        .map_err(|e| eprintln!("server error: {}", e));
    hyper::rt::run(server);
}

fn handler(_req: Request<Body>) -> Response<Body> {
    // 別スレッドで HTTP リクエストを送信する
    rt::spawn(rt::lazy(|| {
        // HTTPS 対応したクライアントを作る
        let https = HttpsConnector::new(4).unwrap();
        let client = Client::builder().build::<_, hyper::Body>(https);

        let uri = "http://httpbin.org/ip".parse().unwrap();

        // リクエストを実行する Future を作って返す
        client
            // get リクエスト
            .get(uri)
            // エラーだったらここで処理
            .map_err(|e| println!("request error: {}", e))
            // エラーでなければこれを実行
            .and_then(|res| {
                // レスポンスの Body の取得も Future で行う
                res.into_body()
                    .concat2()
                    // Body の取得エラーがあればここで処理
                    .map_err(|err| {
                        println!("Error: {}", err);
                    })
                    // Body が正常に取得できたら文字列にして表示
                    .map(|chunk| {
                        let v = chunk.to_vec();
                        let s = String::from_utf8_lossy(&v).to_string();
                        println!("HTTPS Body {}", s);
                    })
            })
    }));

    Response::new(Body::from(""))
}
```

# 解説

* HTTP サーバーの実行は hyper の Example の通りです。
* HTTP ハンドラ関数 `handler` では HTTP クライアントの `hyper::Client` を使って HTTP リクエストを送信しています。
* hyper::Client のリクエストの実行方法はちょっと変わっていて、get() などでリクエストを行うと Future という処理のリストを返し、Future を非同期処理ライブラリが受け取ると Future に記載の処理が非同期で順番に実行される、という流れになります。
* コードで見ると `map_err` や `map` や `and_then` なんかが Future で処理を定義するメソッドで、ユーザーはここにリクエストに成功した場合や失敗した場合などの処理を実装していきます。

# おわりに

* 最初は reqwest 使ってサクッとできるだろうと思ったのですが、tokio::runtime が nested だぜ！だめだぜ！とか怒られてできませんでした。非同期な reqwest も検討しましたが hyper とあまり変わらないことになりそうだったのでやめました。
* hyper にも非同期にもこだわっていないのでもっと簡単な方法あったら誰か教えてください！
gulp4 + gulp-sass が出力するファイルのタイムスタンプが更新されないのを解決

下記のような環境でsassのコンパイルをすると、**出力ファイルのタイムスタンプがソースファイルと同一になってしまう問題**がありました。

- node v10.15.3
- gulp v4.0.2
- gulp-sass v4.0.2

```
# ソースファイル
-rw-r--r--   1 dada  staff  338  5 17 00:50 common.scss
# 出力ファイル
-rw-r--r--   1 dada  staff  159063  5 17 00:50 common.css
```

[無事解決できたので](https://teratail.com/questions/197051)Qiitaにも記録しておきます。

# through2 を使う

ここにそのものズバリな答えが書かれています。
https://github.com/dlmanning/gulp-sass/issues/706

```bash
$ npm i --save-dev through2
```

```js:gulpfile.js
const gulp = require('gulp');
const sass = require('gulp-sass');
const through2 = require('through2');

gulp.task('sass', () => {
  return (
    gulp
      .src('./src/sass/*.scss')
      .pipe(sass().on('error', sass.logError))
      // タイムスタンプを書き換える
      .pipe(through2.obj((chunk, enc, callback)=>{
        const date = new Date();
        chunk.stat.atime = date;
        chunk.stat.mtime = date;
        callback(null, chunk);
      }))
      .pipe(gulp.dest('./dist/css/'))
  );
});
```

through2 についてはこのへんも詳しいです。

gulpプラグインの基本構造（プラグイン開発者向け）
https://qiita.com/morou/items/1297d5dd379ef013d46c