OmniAICreator/Qiita-1.07M huggingface dataset:
最低限のGit・GitHubの使い方

個人開発をするうえでの最低限のGit・GitHubの使い方をまとめました。

#リポジトリセットアップ

###①作業ディレクトリへ移動

``` 
$ cd ~/environment/<アプリ名>
```

###②ローカルリポジトリを作成

```
$ git init
```

###③現在のディレクトリにあるファイルをステージにすべて追加

```
$ git add -A
```

###④ステージにある変更をローカルリポジトリへ反映

```
git commit -m "コミットメッセージ"
```

#GitHub(リモートリポジトリ)にアップロード

###①Newリポジトリを作成
![スクリーンショット 2021-01-17 6.19.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879803/d4b29ff6-d632-437a-3d64-fbd55a33c2b0.png)

###②リポジトリ名、PublicかPrivateを選択
![スクリーンショット 2021-01-16 19.42.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879803/fa98a62e-d70d-dac5-9c06-2d915d7e0ab6.png)

###③HTTPSを選択し、URLをコピー
![スクリーンショット 2021-01-17 6.26.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/879803/b05728dc-e763-e185-eb54-4c03fb0991af.png)


###④IDEのターミナルでコードを入力

```
$ git remote add origin <コピーしたURL>
```
GitHubをリポジトリのoriginとしてGitの設定ファイルに追加する。

```
$ git push -u origin master
```
-uで過去のブランチ履歴を辿ることができるようになります。


これでGitHubへアップロード完了。
***

少し応用編
#ブランチ
ブランチとは、複数機能を開発するためにリポジトリのコピーをし元ファイルを触らずに開発すること。

```
$ git checkout -b <ブランチ名>
```
新たにブランチを作成し、作成したブランチへ移動します。
このブランチをトピックブランチといいます。
元のファイルのブランチをマスターブランチといいます。

```
$ git status
```
変更したファイルのチェックができます。

```
$ git add -A
$ git commit -m "<コミットメッセージ>"
```
addでステージに追加し、コミットでリポジトリに反映。
この時点ではまだマスターブランチには反映されてません。

###マージ
マージとは、マスターブランチに変更内容を統合すること。

```
$ git checkout master
```
checkoutはブランチの移動(マスターへ移動)

```
$ git merge <トピックブランチ名>
```
マスターブランチへマージする。

```
$ git branch -d <トピックブランチ名>
```
マージしたのでトピックブランチを削除する。

```
$ git push
```
pushでGitHubに反映させる。
最新版 ChromeCanary の ChromeDriver を取得する方法

SeleniumでChrome Canaryを使っていると、Chrome Canaryのアップデートでエラーが出たりします。
その度に最新版のChromeDriverCanaryに置換する必要があるのですが、ちょっと手順が必要なので記事にしておきます。

## 1. ダウンロードページに行く

使っているOSごとに、以下のリンクにアクセスしてください。

Linux (64-bit): https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Linux_x64/
Mac OS X (64-bit): https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Mac/
Windows (32-bit): https://commondatastorage.googleapis.com/chromium-browser-snapshots/index.html?prefix=Win/

## 2. 「LAST_CHANGE」と検索する

ページ上部の検索ボックスに、「LAST_CHANGE」と入力して検索します。
検索結果が表示されるまで１分程度かかる場合があります。

![スクリーンショット 2021-01-17 8.09.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/a595a47e-9421-f88e-e76c-0c37f77867cf.png)

## 3. 「LAST_CHANGE」をダウンロードする

「LAST_CHANGE」ファイルをダウンロードします。
これはただのテキストファイルです。
中に最新バージョンのハッシュ値みたいなのが書いてあるので、それをコピーします。

## 4. 「最新バージョン」を検索する
「LAST_CHANGE」ファイルに書いてあったハッシュ値みたいなやつを、ページ上部の検索ボックスに入力して検索します。

すると検索結果が表示されるので、それをクリックして、利用するChrome Driverをダウンロードしてください。

![スクリーンショット 2021-01-17 8.10.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227791/1bf16bff-d512-89ba-46e5-d1640e5dd6ce.png)

いろいろ出てきますが、Macの場合だと「chromedriver_mac64」をダウンロードすれば良いです。
Azure IoT Hub の SAS トークンの作り方

参考ページ
[az iot hub generate-sas-token](https://docs.microsoft.com/en-us/cli/azure/ext/azure-cli-iot-ext/iot/hub?view=azure-cli-latest#ext_azure_cli_iot_ext_az_iot_hub_generate_sas_token)

```bash
az iot hub generate-sas-token -n iot-aa
```

実行結果

```text
$ az iot hub generate-sas-token -n iot-aa
{
  "sas": "SharedAccessSignature sr=iot-bb.azure-devices.net&sig=dsEOdeubZMhRFMab7KhTcijzc%2BNaiYjlDcig8lqTrpE%3D&se=1610847623&skn=iothubowner"
}
```

Python で作成する場合

```py:main_sas_token.py
#! /usr/bin/python
# -*- coding: utf-8 -*-
#
#	main_sas_token.py
#
#						Jan/17/2021
# ------------------------------------------------------------------
import	sys
import	os
from dotenv import load_dotenv

from generate_sas_token import generate_sas_token
# ------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")
dotenv_path = '.env'
load_dotenv(dotenv_path)
IOTHUB = os.environ.get("IOTHUB")
DEVICE = os.environ.get("DEVICE")
MAIN_KEY = os.environ.get("MAIN_KEY")

sys.stderr.write(IOTHUB + "\n")
sys.stderr.write(DEVICE + "\n")
sys.stderr.write(MAIN_KEY + "\n")
#
uri = IOTHUB + ".azure-devices.net/devices/" + DEVICE 
#
key = MAIN_KEY
policy_name = None
iexpire = 3600
#
try:
	sas_token = generate_sas_token(uri, key, policy_name, iexpire)
except Exception as ee:
	sys.stderr.write("*** error *** in generate_sas_token ***\n")
	sys.stderr.write(str(ee) + "\n")
#
print(sas_token)
sys.stderr.write("*** 終了 ***\n")
# ------------------------------------------------------------------
```

generate_sas_token.py はこちら
[Azure IoT Hub に paho で publish](https://qiita.com/ekzemplaro/items/8a2f8ac7bae35a9c91d4)

```text:.env
IOTHUB='iot-aa'
DEVICE='pansy'
MAIN_KEY='2eQ2wF5OjZLP7tq6PG123456789RTfAnMJbZ8wtJPu4='
```
BulkAPIではサポートされていないオブジェクト

AcceptedEventRelation

AssetTokenEvent

AttachedContentNote

CaseStatus

ContentFolderItem

ContractStatus

DeclinedEventRelation

EventWhoRelation

PartnerRole

QuoteTemplateRichTextData

RecentlyViewed

SolutionStatus

TaskPriority

TaskWhoRelation

TaskStatus

UndecidedEventRelation

https://www.stitchdata.com/docs/integrations/saas/salesforce/

```
Entity '________' is not supported by the Bulk API.
```
fastapi 文字化けを解消する

## 環境
centOS8
mariadb(文字コード: utf8mb4)


## 対象コード
```
from sqlalchemy import create_engine

user_name = "user"
password = "pass"
host = "localhost"
database_name = "dbname"
# この部分
DATABASE = f'mysql://{user_name}:{password}@{host}/{database_name}?charset=utf8mb4'

engine = create_engine(
    DATABASE,
    #encoding="utf-8",
    echo=True
)
```

## 修正前
```
DATABASE = f'mysql://{user_name}:{password}@{host}/{database_name}'
```

## 修正後
```
DATABASE = f'mysql://{user_name}:{password}@{host}/{database_name}?charset=utf8mb4'
```
CLIP STUDIO のアプリ設定クラウドバックアップの仕様注意点

#何がともあれまずは公式ドキュメント

バックアップの機能を充実させてくれるかもしれないから、時々チェックした方がいいね！
（この記事の情報が古くなっちゃう可能性もあるってこと）

| リンク | せつめい |
|:-----------|:------------|
| [クラウドサービスの使い方](https://tips.clip-studio.com/ja-jp/series/73) | クラウドサービスのトップページ。アプリ設定だけでなく作品や素材の同期設定についても書いてあります。 |
| [アプリ設定バックアップ対応表](https://www.clipstudio.net/guide/ja/cloud) | **何が対応済** で **何が未対応** なのかが書かれてます。**自分にとって大切な設定が実はバックアップ対象外だった…** なんてことが無いように、ザックリでもいいから目を通しておいた方がいいと思います。 |


#バックアップが走るタイミング

**CLIP STUDIO を起動した時** です。
CLIP STUDIOを起動しなければバックアップはされません。

例えば『2021年1月16日は1回もCLIP STUDIOを起動しなかった』時は下記だよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/20d10358-c158-2c83-d3c6-5b1ed7e99867.png)

どんな時でも毎日バックアップして欲しいんじゃー！って時は『CLIP STUDIOを起動するタスクスケジューラー的なもの』を設定しよう！

#1日の中で何回もCLIP STUDIOを起動したらどうなる？

↓2021年1月17日の6:43と7:00にCLIP STUDIOの起動をやった時。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0ec8536e-f491-85cc-4608-0cfcd68d5826.png)

* バックアップは1日1回です。
* 1日の中でも **CLIP STUDIOが最初に起動した時刻のバックアップ** がクラウドに残ります。

#蛇足

『設定ファイル用フォルダに加えて依存関係のファイルまで丸ごとバックアップするバッチ』を自作したくなります。
んで、そのバッチをタスクスケジューラーを使って好きなタイミングで実行！
さらに発展させて、特定の設定だけをデバイス間で自動同期できたらベストだなあ…。

↓関連リンク
[CLIP STUDIO PAINTのショートカットキー設定と設定のバックアップ＆リストア](https://qiita.com/waokitsune/items/7e361e93db9f510be1f7)
[CLIP STUDIO PAINTでカラーセットの設定だけを別デバイスに引き継ぎたい](https://qiita.com/waokitsune/items/25b8e66aa177074c8e1b)

#バージョン

CLIP STUDIO （32ビット） Version 1.10.5
mariadbの文字コードをutf8mb4にする

# 修正前
```
MariaDB [stock]> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8                         |
| character_set_connection | utf8                         |
| character_set_database   | utf8mb4                      |
| character_set_filesystem | binary                       |
| character_set_results    | utf8                         |
| character_set_server     | latin1 ★                     |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.003 sec)
```

```
MariaDB [stock]> SHOW VARIABLES LIKE 'collation%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | latin1_swedish_ci ★|
+----------------------+--------------------+
3 rows in set (0.001 sec)
```

## サーバ側 修正

vi /etc/my.cnf.d/mariadb-server.cnf

```
[mysqld]
character-set-server=utf8mb4
```

## クライアント側 修正

vi /etc/my.cnf.d/client.cnf

```
[client]
default-character-set=utf8mb4
```

## 再起動
```
systemctl restart mariadb
```

# 修正後
```
MariaDB [stock]> SHOW VARIABLES LIKE 'character_set%';
+--------------------------+------------------------------+
| Variable_name            | Value                        |
+--------------------------+------------------------------+
| character_set_client     | utf8mb4                      |
| character_set_connection | utf8mb4                      |
| character_set_database   | utf8mb4                      |
| character_set_filesystem | binary                       |
| character_set_results    | utf8mb4                      |
| character_set_server     | utf8mb4 ★                    |
| character_set_system     | utf8                         |
| character_sets_dir       | /usr/share/mariadb/charsets/ |
+--------------------------+------------------------------+
8 rows in set (0.001 sec)
```

```
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8mb4_general_ci |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+
3 rows in set (0.001 sec)
```
【エラー】`cannot load such file -- mime/types/data (LoadError)`

#はじめに
payjpをGemfileに記述しbundle installs後rails sをすると大量に文字が羅列され
`cannot load such file -- mime/types/data (LoadError)`
とういうエラーが出た時の解決したプロセスを記事にしました。
環境やエラーへの辿り着き方で、それぞれ違う解決方法が存在する思いますので、参考程度にしてください〜


#環境
macOS Catalina バージョン 10.15.7 
Homebrew 2.7.1
rbenv 1.1.2
ruby 2.6.5p114 (2019-10-01 revision 67812) [x86_64-darwin19]
gem 3.2.4
Bundler version 2.1.4


#エラー
####エラー文
`cannot load such file -- mime/types/data (LoadError)`
大量に文字が羅列されたエラー分をよく確認すると`MIME: :Types`が既に定義されてるという文がありました。


#確認と考察
`gem list`でローカルのgemがどうなってるか確認しました。


![スクリーンショット 2020-12-29 16.06.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/9493c577-f5da-db3d-878a-2ecb31a16dc2.png)
`mime-types-data`が2バージョン入っていいデフォルトに設定されてる。
むーーこれが悪いのか？？

いろいろ調べてると、`default`が設定されるには、`gem update --default`らいし。
そんなんことした事ないが、このコマンドを打つと、gemの最新バージョンが一度にインストールされ、かつ最新バージョンがデフォルトに設定されてしまうらしい。


#対応
ひとまず、アンインストールしデフォルトを解除することにしました。
まずはデフォルト解除

```:ターミナル
cd #ホームディレクトリへ移動
cd /Users/[ユーザー名]/.rbenv/versions/[バージョン]/lib/ruby/gems/[バージョン]
　#上記で確認したパスに移動します
ls #中を確認します
build_info  doc gems
cache   extensions  specifications ←この中にdefault設定が記述されています

rm -rf specifications/default/ 
　#specificationsのなかのdefaultディレクトリ削除します（これでdefaultが解除されます）
```
`mime-types-data`のアンインストール

```:ターミナル
gem uninstall mime-types-data
bundle install
```



確認します。

```
gem list
```

![スクリーンショット 2021-01-02 14.39.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/769854/e0556c14-eff1-1368-51a4-db175202f6e2.png)
バージョンが一つでdefaultが解除されてました。

payjpをGemfileに記述し`bundle install`、rails sをするとサーバーが立ち上がりました！


#まとめ
今回のエラーはmime-types-dataが原因でした。
本文では記述しておりませんが、調べた事を何も考えずに実行しニ次災害、三次災害が発生し、結果解決までに3日かかってしまいました。
ターミナルでのコマンドはなんの為のもので、どう動くかを理解した上で進める事をおすすめします。






#参考

https://qiita.com/zQmjRAb73seN5RM/items/ecb9e19ee8f3e9af6018

https://mophie-blog.com/2020/08/17/oops-i-did-gem-update-not-bundle-update-rails-no-work/

https://qiita.com/Okame-chan/items/39052dc4d4c3cebfb1ee
Macのgrepでgrep: empty (sub)expressionと出る場合の対処法

- Macを利用して業務や趣味でgrepをかけて検索や集計等を行うことが多い。
- その際に表題の通りのエラーに遭遇する場合がある。
- そのため今回は、このエラーが出た時の対処法を2点記録する。

## 結論
- 方法としては以下の2点。**※先をお急ぎの方はGNU版導入を推奨。**
    - `brew install grep`でGNU版のgrepを導入。
        - **※Mac標準のgrepはBSD版。**
    - BSDでも動作するようなgrepの書き方に修正する。

- **※詳細内容は以下の[内容](#内容)蘭で説明。**

## 環境
- Mac OS X 10.15.6
- Darwin 19.6.0

## 内容

### エラー元
- エラーは以下のような例で起きます。


```bash
# 文字列の中から、Hello or World or 空 かを検索する。
echo -e "Hello\nWorld" | grep -E '(Hello|World|)'

# エラー出力
grep: empty (sub)expression
```

### 原因

- 原因として、以下が考えられます。
    - **正規表現での検索で、候補に空を加えている。**
    - **GNUとBSD版で細かな挙動が違うと耳に入ったことがある。**
- 検証のため、Dockerで用意したGNU grep環境で検証したところ、上記の書き方でも問題は無かった。
- このことから空選択時の処理で、細かな挙動の違いが原因であるとわかった。

### 解消
- 原因特定のため、以下の2点の方法で解消する。
    - GNU版grepをインストールする。
    - BSDでも動作するようなgrepの書き方に修正する
- 1つ目のGNU版は以下のコマンドをうつだけで完了。
    - `brew install grep`
- 2つ目は、以下のように空選択時の処理を変更する。

```bash
# 行頭・行末の記号で認識させる。
echo -e "Hello\World" | grep -E '(^|Hello|World)'

# 空選択処理自体を削除。
echo -e "Hello\nWorld" | grep -E '(Hello|World)'
```

- **※空選択は、両方のやり方に一長一短があるため、無難の方を選択**

## まとめ
- 上記のことから、各OS・ライブラリによっての細かな挙動の違いを認識。
- そのため可搬性の高い記述を意識。

## 参考
- https://unix.stackexchange.com/questions/238888/egrep-empty-subexpression-when-attempting-to-filter-out-words-from-a-list
- https://apple.stackexchange.com/questions/282779/egrep-empty-subexpression-unexpected-behaviour-for-bash-loop-on-mac
ラインをまたいだ検知

TradingViewではpinescriptという、これまた独自すぎるプログラミング言語（と仕様）があります。

インジを作るにせよ、EAをつくるにせよ「線をまたいだ」ということを検知するのはとても重要です。
pinescriptでは crossOver, crossUnderなどの関数があり、簡単なのですがMQLにはなかったので作りました。
スニペットみたいなもんなんで張り付けておきます。

リファレンス：
https://jp.tradingview.com/pine-script-reference/#fun_crossover

```
/*
crossover
`x`の値が` y`の値よりも大きく、 `x`の値が現在のバーの直前のバーの` y`の値よりも小さかった場合、'x'系列は'y'系列を超えていると定義されています。
crossover(x, y) → series[bool]
戻り
`x`が` y`を越えた場合はtrue、そうでない場合はfalse
引数
x (float) データ系列'x'。
y (float) データ系列'y'。
*/
bool isCrossOver(double latestX, double prevX, double y){
   return (latestX > y && prevX < y);
}
/*
crossunder

`x`の値が` y`の値よりも小さく`x`の値が現在のバーの直前のバーの` y`の値より大きかった場合、'x'系列は'y'系列の下で交差していると定義されています。
*/
bool isCrossUnder(double latestX, double prevX, double y){
   return (latestX < y && prevX > y);
}
```

使い方は、例えば現在価格がボリバンの1シグマを上抜いたかを知りたいのであればこんな風に使えます。

```
if(crossOver(latestPrice, prevPrice, Up1Buffer[0])){
 // 上抜いた時の処理
}
```

ちなみに、OnTickなどで毎フレーム（？）チェックするのであれば、各情報をこんな風に取得、

```
 MqlTick last_tick; 
 if(SymbolInfoTick(Symbol(),last_tick)){ }
//    Print(last_tick.time,":Bid=",last_tick.bid,"Ask=",last_tick.ask,"Volume = ",last_tick.volume); 
```

もし時間足更新などであれば更新のたびに価格を取得して対応してください。

```
   int shift = 0;
   datetime time  = iTime(Symbol(),Period(),shift); 
   double   open  = iOpen(Symbol(),Period(),shift); 
   double   high  = iHigh(Symbol(),Period(),shift); 
   double   low   = iLow(Symbol(),Period(),shift); 
   double   close = iClose(NULL,PERIOD_CURRENT,shift); 
   long     volume= iVolume(Symbol(),0,shift); 
   int      bars  = iBars(NULL,0); 
   Comment(Symbol(),",",EnumToString(Period()),"\n", 
          "Time: " ,TimeToString(time,TIME_DATE|TIME_SECONDS),"\n", 
          "Open: " ,DoubleToString(open,Digits()),"\n", 
          "High: " ,DoubleToString(high,Digits()),"\n", 
          "Low: "   ,DoubleToString(low,Digits()),"\n", 
          "Close: " ,DoubleToString(close,Digits()),"\n", 
          "Volume: ",IntegerToString(volume),"\n", 
          "Bars: " ,IntegerToString(bars),"\n" 
          ); 
```
SPA のしくみ

SPA の仕組みを書いた記事が見当たらなかったので、自分の理解を書いてみます。

## 普通のページ遷移

SPA じゃない普通の Web ページの場合、まず `https://example.com/` にアクセスすると `GET /` な HTTP リクエストが飛んで、ドキュメントルートにある `index.html` (静的ページの場合) が返ります。

ここで `<a href="/about/">` なリンクを踏むと、`https://example.com/about/` に遷移することになり、`GET /about/` な HTTP リクエストが飛んでドキュメントルートの `about` ディレクトリの中の `index.html` (以下 `/about/index.html` のように書きます) が返ることになります。

__静的 Web サイトのファイル構成__

```
% tree /var/www/html
/var/www/html
├── about
│   └── index.html  # GET /about/ で返るやつ
└── index.html      # GET / で返るやつ
```

## SPA のページ遷移

SPA の場合、例えば react-router の `<Link to="/about/">` を踏むと、ブラウサの [Hitsory API](https://developer.mozilla.org/ja/docs/Web/API/History_API) を使って、実際にページ遷移を行う代わりに、仮想的に `https://example.com/about/` へのページ遷移が行われたことにします。このため、`GET /about/` な HTTP リクエストは発生しません。

また、その後ブラウザの戻る・進むボタンが押された場合も、ページ遷移は発生せずに JavaScript のイベントが通知されて、router が表示コンポーネントの切り替えを行います。

__SPA のファイル構成__

```
% tree /var/www/html
/var/www/html
├── bundle.js
└── index.html
```

## SPA でリロードした場合

問題は、about ページを表示した状態でリロードした場合です。この場合、現在位置は `https://example.com/about/` なので、ブラウザは `GET /about/` な HTTP リクエストを行います。この際、Web サーバー側に `/about/index.html` が存在しなければ 404 エラーになってしまいます。

これを防ぐため、Web サーバー側では `/about/` などの `<Link to="〜">` でリンクされる可能性のある URL (または、ファイルが存在しない URL すべて) のリクエストに対して、`/index.html` の内容を返すような設定にする必要があります。開発中は webpack-dev-server なら [historyApiFallback](https://webpack.js.org/configuration/dev-server/#devserverhistoryapifallback) で簡単に設定できます (create-react-app した場合は勝手にそうなってます) が、ビルドしてデプロイする場合は自分で Web サーバーを設定しないといけません。

また、`index.html` から `bundle.js` などに対して相対パスでアクセスしている場合、`/about/bundle.js` へのアクセスも発生してしまうので、こちらの対応 (絶対パスでアクセスするか `<base href="〜">` を設定するなど) も必要です。
おしゃれなのに地味な扱いのHTTPデバッギングProxyツール: Proxyman

Mac向けのHTTPデバッギングProxyツール[Proxyman](https://proxyman.io/)がおしゃれ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/3086e9d3-0b58-e179-d01b-604f8995daa9.png)

なぜかQiitaでは紹介記事が全くなく、存在が地味だったので同じく地味な私が紹介してみます。

#1. HTTP Debugging Proxyってなに？
クライアントサイドのソフトウェアをデバッグしているときに、サーバサイドのレスポンスが実際と異なる別のものだった時にどう振る舞うか確認したい時ありますよね？例えば、顧客データ取得するAPIを使ったクライアントを作るときに、リリース前だから顧客データ取得できないしテストデータを入れる権限がない時とかあると思います。サーバサイドの開発であってもクライアントからのリクエストを操作したいシチュエーションありますよね。

ネイティブアプリが発するHTTPS通信を覗いてみたい時もあるでしょう。

HTTP Debugging Proxyは、そういったシチュエーションで、HTTP/HTTPS通信を確認し、インターセプトしてリクエストやレスポンスを操作する機能を提供してくれます。

以下のように動作します。

![無題の図形描画 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/b36d33d8-e316-90da-a108-8f0ec9ad40e9.png)


Proxyman以外には、[Fiddler](https://www.telerik.com/fiddler)なんかも有名です。ProxymanはMacでしか動かないので、WindowsユーザはFiddler使ってください。

#2. Proxymanのインストール
[公式サイト](https://proxyman.io/)よりダウンロードしインストールします。インストールすると以下のように自動でproxyの設定がされます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/bc69eb73-7b84-21b4-ebe7-9354f2e9a7d2.png)


#3. HTTPS通信を確認する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/d3fb13c5-1d90-6a30-2fc3-ef54eb9939b5.png)

暗号化で保護されたHTTPS通信の中を覗いたり操作したりするため、Proxymanは通信の中間で、一度複合化し暗号化するという操作を行います。その時に証明書がサーバの証明書ではなくProxymanが提供する証明書になってしまいます。通常クライアントは安全のためにそういった通信を弾く仕組みがありますが、弾かせないようにProxymanの証明書を信用させる必要があります。

メニューバーから、Certificate > Install Certificate on this Mac...を選択し証明書をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/e931ba94-eff1-9c3c-e40e-a88d4de697f6.png)

Enable only this domain をクリックするとHTTPS通信の詳細を確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/9e2deb77-e564-fa24-bb35-f8efb26b5591.png)

Google ChromeであればDevelopper Toolsでも同様のことが確認できます。しかし、ブラウザ以外のネイティブアプリでもHTTPS通信の詳細を確認することができます。

#4. 通信を操作する
Proxymanは通信を操作する（manipulateする）方法として、「手動操作」とJavaScriptによる「Scripting」が提供されています。

Qiitaはプログラミング情報のナレッジコミュニティなので、プログラミングを扱わないとコメント欄が荒れることもあるそうなので、本記事ではScriptingの方法を紹介します。

また、通信を操作する行為はサーバ所有者の意図通りでない可能性があるので、自身が管理するサーバで試すかサーバ利用ポリシーを順守するようにしてください。

メニューバーから、Scripting > Script List... を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/18774807-7266-d909-69b9-92d8cbc401a5.png)

スケルトンとしてスクリプトがあらかじめ記載されてるので、なんとなく使い方はわかるでしょう。

URLに操作対象のURLを記載し、なにをするか記述します。レスポンスを返す際（onResponse）、レスポンスボディをそっくり書き換えてしまいましょう。以下の行をonResponse関数に記載し、Cmd+sを押します。

```javascript:
response.body = "manipulated!";
```

当該URLにアクセスしてみると以下のようにレスポンスの内容が変わったことがわかります。
<img width="600" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/984649/e0e82538-5dac-0d87-7cd9-6b03b4e7c338.png">

このようなリクエストやレスポンスの操作を行う場合は、こういったツールがあると非常に便利です。Google Chromeでこういったことをやる場合はエクステンションが必要でしょうか。

Scritptingでできることについては、[公式ガイド](https://docs.proxyman.io/scripting/snippet-code)を参照ください。こちらを確認すると一通りやりたいことができることがわかります。

RFCに準拠しないようなリクエストやレスポンスを処理しようとした時に、おそらくパーシングできずエラーになってしまいます。なので、そういった通信を扱う場合は、別のツールを使うか準拠するように修正しましょう。

以上です。ぜひ楽しんでください。
arduino(Blynk)のオブジェクトポインタの考え方について（Qiita質問履歴）

# やりたかったこと
[Blynk](https://www.blynk.cc/)で[Timeinput](https://docs.blynk.cc/#widgets-interface-time-input)のウィジェットを使ってStart,Stopの時間を入力して、

- 入力されたStart時間以降に何かしらの処理を定期的に実行
- 入力されたend時間以降に定期的に実行していた処理を停止

ということをさせたかったです。

# この記事について

Qiita質問に投げたものをただこっちにリンク貼り付けしたかっただけです。
（Qiita質問って検索にも引っかからないし、質問クローズしたら誰も見れなくなったので持ってきました・・・）


# これです
[Qiita質問　arduino(Blynk)のオブジェクトポインタの考え方について](https://qiita.com/wakisuke/questions/6988cea4581250d1da1b)

で、厄介なことに、Qiita質問のリンクは3割の確率で404を返します。なんでですかね、、、
Unreal Engine 4.25 でAポーズ用のアニメーションをTポーズ用にリターゲットする

Aポーズのグレイマン用のアニメーションを、Tポーズで作られている別のスケルタルメッシュで使えるように変換する手順についてのメモ。キャプチャ画面は 4.25 のものですが、4.26 でも同じ手順でできることは確認しました。

# やること

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/71fb6b03-1085-294d-1d92-a94d804d8671.png)

Aポーズ用のアニメーションをTポーズのスケルタルメッシュに適用すると、手を広げたポーズになってしまう。これをどうにかしたい。

# 参考

- [キャラクターにアニメーションを適用する](http://msyasuda.hatenablog.com/entry/2016/11/12/015616)
- [リターゲットされたアニメーションを使用する](https://docs.unrealengine.com/ja/AnimatingObjects/SkeletalMeshAnimation/AnimHowTo/Retargeting/index.html)
- [リターゲット マネージャー](https://docs.unrealengine.com/ja/AnimatingObjects/SkeletalMeshAnimation/Persona/BasePoseManager/index.html)

ほぼ上記の3つの記事を見たらできる。

#　ざっくりした手順

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/4effde8f-bc93-a14b-7131-98bff2cecb60.png)

- Tポーズになっているスケルタルメッシュを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/1ec1f043-2665-c442-173e-9f7aecf6b30f.png)

- 「リターゲットマネージャー」を開く。必要に応じてボーンの対応付けをする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0b4588b1-c321-271b-6815-095820039364.png)

- 肩の部分を回転させてTポーズなのをAポーズにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/6b8a5732-8bf7-af71-e4a2-b075150cf361.png)

- リターゲットベースポーズを管理の「ポーズを変更」を押して「現在のポーズを使用する」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/d0abc872-6d68-2bdf-8d98-2973d758858d.png)

これでベースのポーズがAポーズになるので、あとは普通にリターゲットする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0893e6c8-9165-b3dc-d144-c73641f27563.png)

ちゃんと手が下がった。角度は微調整が必要なことが多い。
NextCloudのLogin flow v2でアプリパスワードを取得する

NextCloudのAPIを使う時に、ユーザー名・パスワードの代わりに「アプリパスワード」を使うことができます。これはユーザー自身が設定画面から作成できるものです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25051/7a1438e9-a534-908e-e8d5-dabfe97c14e4.png)

……でも今の時代、もうちょっとスマートにやりたくないですか。

そんなあなたに Login flow v2。

これを使うと以下のような流れでアプリパスワードを取得できます。

1. アプリ側で「NextCloudでログイン」的なボタンを押す
2. アプリに表示されたURLをブラウザで開く
3. ブラウザでNextCloudにログインして、アクセスを許可する
4. アプリに戻るとログインが完了している 🎉

以降、順を追って紹介します。

## 注意

この記事は Nextcloud 20.0.5 で動作確認しながら書いています。
バージョン違いなどで動作が異なる場合は、以下の公式ドキュメントを参照してください。

https://docs.nextcloud.com/server/latest/developer_manual/client_apis/LoginFlow/index.html#login-flow-v2

## 1. トークンとログインURLを取得

まず `/login/v2` にPOSTします。この時の User-Agent がアプリ名として確認画面やセッション一覧に表示されるので、いい感じの値を設定しておきましょう。

※以降、example.comの部分は適当に読み替えてください。index.phpが必要な場合は足してください。

```shell-session
$ curl -A "myapp/1.2" -X POST http://example.com/login/v2
{
  "poll": {
    "token": "wsEf...HfkC",
    "endpoint": "http://example.com/login/v2/poll"
  },
  "login": "http://example.com/login/v2/flow/q2P6...DS5U"
}
```

`poll` の中身はあとで結果をポーリングする時に使うので取っておきます。 `login` に入っているURLをユーザーに伝えて、開いてもらいます。

## 2. ブラウザでアクセスを許可する

1で得られたURLにユーザーがアクセスすると、以下のように画面が遷移していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25051/70aa0001-2fc5-c03d-0d3d-40c1c72a945f.png)
（ログインしてなければここでログイン画面が入る）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25051/c6f4d391-34d5-6505-6036-15d7db2911d3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25051/9f849638-0b45-eaa8-5acb-296d3bab0940.png)

これでアプリパスワードの発行が行われました。設定 → セキュリティ を見ると、画面で生成したのと同じように一覧に表示されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25051/9e1accbb-0a9b-804c-4bec-7e41e959f423.png)


## 3. アプリパスワードを取得する

1で取っておいた `poll` の情報を使います。 `poll.endpoint` に入っていたURLに対して、 `token=<poll.tokenの値>` という形でクエリパラメータをつけてPOSTすると、ユーザー名とアプリパスワードが得られます。

```shell-session
$ curl -A "myapp/1.2" -X POST http://example.com/login/v2/poll -d "token=wsEf...HfkC"
{
  "server": "http://example.com",
  "loginName": "testuser",
  "appPassword": "8Ekh....Zu4n"
}
```

このとき、アクセスの許可が済んでいない場合は404レスポンスが帰ってきます。
ユーザーにURLを提示してすぐポーリングを始める場合は404が帰ってくる間リトライを続けることになります。

## 4. アプリパスワードでAPIを呼び出す

あとはこのユーザー名とアプリパスワードをBASIC認証に指定すれば、APIを呼び出せます。

例えば[WebDAV](https://docs.nextcloud.com/server/latest/developer_manual/client_apis/WebDAV/index.html)を使うならこんな感じに。

```shell-session
$ curl -A "myapp/1.2" -u "testuser:8Ekh...Zu4n" http://example.com/remote.php/dav/files/testuser/path/to/file
```
２回目以降のデプロイ

前提条件としてご自身のアプリケーションが既にデプロイされている状態とします。



<strong>まず、アプリのファイルが変更されていればGitHubでコミット〜マージまで行いましょう！


<h1>変更点をHerokuに反映させる</h1>

ターミナルに以下のコマンドを打ちましょう

```terminal:ターミナル
% git add .   
% git commit -m "変更した内容がわかるような説明をここにいれる、日本語でもおk"
```

リポジトリのプッシュ

```terminal:ターミナル
% git push heroku master 
```


<strong>※1/27追記

<h1>上記のコマンドで「Everything up-to-date」とターミナルに表示されたら！！！！ </h1>

% git push heroku master のコマンドで「Everything up-to-date」が表示されたら更新ができていない状態になります(今は最新の状態ですよと言ってる)。

githubでマージしてすぐに上記のコマンドを打つと僕はよく起こります。
その場合は空のコミットを更新すればいい。
以下のコマンドをそのまま順番に実行して更新できればおk



```
% git commit --allow-empty -m "空のcommit" 
% git push heroku master
```
<br></br>
上記のコマンドでも無理なら他に原因があると思われます。以下の記事を参考にしてみてください
https://www.zunouissiki.com/entry/cannot-git-push-everything-up-to-date/

https://qiita.com/kahorno/items/323c58d0dfaa3212f442

<br></br>
<br></br>
マイグレーションの実行

```terminal:ターミナル
% heroku run rake db:migrate  
```

お疲れ様です、これでエラーが出ていなければ完了です！



もしエラーが出たときの対処、以下のコマンドを実行してヒントを得る

```terminal:ターミナル
% heroku logs --tail --app <<アプリケーション名>>
```

最後まで見ていただいてありがとうございます！誰かの参考になれば幸いです
Material-ui　インストールコマンド

##Material-uiのインストールコマンド

### 下記コマンドを実行
```
npm install --save @material-ui/icons @material-ui/core @material-ui/system @material-ui/styles
```

####意味
@matesial-ui/core→Material-uiを入手する
@material-ui/icons→公式マテリアルアイコンを使用できる
@material-ui/system→"style functions" と呼ばれる低レベルのユーティリティ関数を提供し、強力な設計システムを構築する
@material-ui/styles→Material-UIコンポーネントを使用していないReactアプリケーションのスタイルを設定する


公式ドキュメントはこちら
https://material-ui.com/ja/
ゲーム理論入門１

## Combinatorial game 
1. There are two players. 
2. There is a set, usually finite, of possible positions of the game.
3. The rules of the game specify for both players and each position which moves to other positions are legal moves. 
4. The players alternate moving.
5. The game ends when a position is reached from which no moves are possible for the player whose turn it is to move. Under the **normal play rule**, the last player to move wins. Under the **mis`ere** play rule the last player to move loses. If the game never ends, it is declared a draw. However, we shall nearly always add the following condition, called the **Ending Condition**.
6. The game ends in a finite number of moves no matter how it is played.

### Two sub categories
1. **Impartial** : two players have the same options of moves
2. **Partizan** : otherwise

### PN-state
* P-state : Winning state for the previous player
* N-state : Winning state for the next player

### Building winning strategy 
1. List all `terminal position`, the state when the game ends
2. All terminal positions are P
3. All states that can reach a P state in one move is N
4. All states that can be moved to N is P
5. If no P is found, end otherwise return to 2

### 考え方
1. terminal state はP （normal rule）
2. N になったらヘマしなきゃ勝てる（Pに行ける）
3. Pなら勝てない
ConoHaのイメージ保存が保存中→ジョブ消失

# 何が起きた

ConoHaの[イメージ保存](https://support.conoha.jp/v/saveimages/)押すと、ステータス`保存中`が追加される。

![alt](https://qiita-image.cloudremix.net/Conoha-image-backup-is-in-progress.jpg)

そしてしばらく待つと消える！？なんで？


![alt](https://qiita-image.cloudremix.net/ConoHa-image-backup-lost.jpg)

# 保存容量オーバー

イメージ保存はバックアップ対象のVPSプランとか関係なく50GBまで無料
つまり、100GBが提供される1GB以降のプランだと容量不足でエラー

![alt](https://qiita-image.cloudremix.net/Cause-of-loss-of-ConoHa-image-backup.jpg)

となるとオプションの追加バックアップ容量（1,500円/500GB）を買うしかないのだが、
今は亡き[CloudGarage](https://nhn-techorus.com/news/2017_271.html)のサポートに教授してもらった方法を試したところ、無事50GBの枠に収まった。

> バックアップサイズは現在の使用率ではなく、一度でも使用したことがあるサイズで取られる仕様となりますので、不要なファイルを削除し、使用ディスクを減らしてもバックアップファイルのサイズは大きいままとなります。
> 
> バックアップファイルの肥大化をなくすためには、”現在使用していない領域を0で埋める”というような作業手順を踏んでいただいた後に、バックアップ取得を 実施いただくことをお試しください。
> 
> \# df -h (インスタンスの空き容量を確認)
> \# dd if=/dev/zero of=/tmp/tmpzero.tmp bs=G count=[空き容量 ※1]
> 
> (空きスペースに0データを書き込む)
> ※1 確認いただいた、空き容量が150でしたら149 count=149 としてください。
> 
> \# cd /tmp/
> \# rm tmpzero.tmp　(書き込んだ0データを削除)
> 
> 上記を作業後、イメージバックアップを取得しサイズを確認ください。
Windows Defenderのパターンファイルのみ自動更新

#1.対象者
・WindowsOSを利用している
・ウイルス対策ソフトへのコストを抑えるためWindowsDefenderを利用したい
・Windows Updateは任意のタイミングでインストールしたい

#2.概要
昨今のテレワークにより仕事で利用する端末のセキュリティへ目が向けられている。
Windows10以降に標準搭載されているWindows Defenderは昔に比べれて、性能も上がりご検知も減っている。他のウイルス対策ソフトと比較しても、問題無く利用できるレベルである。

ウイルスを用いた攻撃は日々進化しており、ウイルス対策ソフト側は攻撃情報を日々更新する必要があるため、提供元からパターンファイルというものが配信される。

Windows Defenderのパターンファイルは、
Windows Updateにて提供される品質更新プログラムの一部として提供しており、Windows Updateを自動更新にしていれば、日々のパターンファイルを最新に保つことができる。

しかし、WindowsOS利用者の中にはWindows Updateを任意のタイミング適用するため自動更新を無効にしている者もいるだろう、

今回は、そういった方々にWindows Defenderのパターンファイルのみを自動更新する方法をお伝えしたい。


※セキュリティの観点から行くとWindows Updateはなるべく早急に適用するべきである。

#3.手順
######①Windowsキーとrキーを同時に押下し、taskschd.mscを入力後OKをクリックする。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/cccef785-a532-719e-1654-46593880833c.png)
######②タスクスケジューラライブラリを選択し、基本タスクの作成をクリックする。
![キャプチャ_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/e6caeadc-7b73-4d8b-880c-6f8a75e94c67.png)
######③任意のタスク名と説明を入力し、[次へ]をクリックする。
![無題_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/6dd321e4-4fc9-3cdb-1cab-f959d82dff52.png)
######④トリガータブにてタスクの開始タイミングを選択し、[次へ]をクリックする。
※設定時間は環境によって適正がありますが、1日3回パターンファイル更新があるという都市伝説があります。
![無題_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/3996c7be-477a-f122-4bb5-8fb7f2f1c805.png)
######⑤操作タブにて「プログラムの開始」を選択し、[次へ]をクリックする。
![無題_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/18de8429-94f0-e5aa-b051-47ba4f068d5c.png)
######⑥以下を入力し、[次へ]をクリックする。
<dl>
  <dt>プログラム/スクリプト</dt>
  <dd>"C:\Program Files\Windows Defender\MpCmdRun.exe"</dd>
  <dt>引数の追加</dt>
  <dd>-SignatureUpdate</dd>
  <dt>開始</dt>
  <dd>C:\Program Files\Windows Defender</dd>
</dl>
![無題_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/3e5f688c-d855-7df0-65bc-154738a5f332.png)
######⑦完了タブを確認のうえ、[完了]をクリックする。
![無題_7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428525/21f4d6d1-8f43-c930-7708-a995ebfaf7d9.png)


以上です。画像が英語ですみません。。。
VSCodeでRMarkdownを使う

よくわからないけれど動いたという備忘録です．
rmarkdown や knitr などの package のインストールが必要です．
使っているOSはWindowsです．

## VSCode での R のセットアップ
英語ですが VSCode での R のセットアップは
https://medium.com/analytics-vidhya/a-fresh-start-for-r-in-vscode-ec61ed108cf6
が参考になります．

## vscode-r の R Session Watcher をオンにする
その後，VSCode の settings.json に

```settings.json
"r.sessionWatcher": true
```
を追加し， R Session Watcher を使えるようにします．

## keybinding の設定
https://github.com/Ikuyadeu/vscode-R#creating-keybindings-for-r-commands
に書いてある通りに VSCode の keybindings.json に

```keybindings.json
    {
        "description": "knit to html",
        "key": "ctrl+i",
        "command": "r.runCommandWithEditorPath",
        "when": "editorTextFocus",
        "args": "rmarkdown::render(\"$$\", output_format = rmarkdown::html_document(), output_dir = \".\", clean = TRUE)"
    }
```

を追加します．
これで rmd ファイルを開いているときに ctrl+i で，VSCode で開いているディレクトリ直下へ html として出力できます．
## Preview
ちなみに
https://github.com/Ikuyadeu/vscode-R/issues/103#issuecomment-567054476
にあるとおりに R のコンソールで

```
rmarkdown::run("path to rmd file")
```
を実行すると preview を見ることができます．

##参考
https://medium.com/analytics-vidhya/a-fresh-start-for-r-in-vscode-ec61ed108cf6
https://github.com/Ikuyadeu/vscode-R#creating-keybindings-for-r-commands
https://github.com/Ikuyadeu/vscode-R/issues/103#issuecomment-567054476
AZ-900合格しまちた

# AZ-900の合格までの勉強法
* Microsoft Learn(Azureの基礎)
* AZ-900問題集

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1031955/ae498ca7-6b5c-869e-5072-2db38b78c2c4.png)

基本的には、Microsoft Learnの内容をしっかりと理解していれば問題ないと思いますが、漏れがあるとしっかり落ちてしまう試験だと思います。
過去問などが出回っていないので、どのような形式なのか確認するために問題集を使いました。（問題の難易度はそこまで高くないので、あくまで問題形式を確かめる程度で考えたほうが良いです）

# AZ-900意外と難しくね？
自分普通に落ちましたね、2回受けて何とか合格できました。合格点700で792点でした。
試験を受けている感覚では、もっと取れてると思っていましたが、まだまだでした。精進します。
1回目の試験ではMicrosoft LearnのAzureの基礎を軽く見て、まぁ基礎だからとなめてかかっていました。
<font color="Red">舐めてたら落ちるよ</font>
クラウドの知識も特になくこの業界に入った人間が舐めてしまってすいませんでした。。
もっとAzureの勉強しないとな～

#どんな問題がでたか
* Azure ADについて
    * 3つぐらいの独立した文章をそれぞれ「はい」か「いいえ」で答える問題が出ました。
    * それ以外でもAzure ADはよく出た印象です
* Azureコアサービスは満遍なくでる
    * コアサービスの中でも特に難しいと感じたのは、ネットワークですかね。単純にインフラの知識が乏しいということもあり理解という面でまだ不十分だったのかも
    * お客さんの課題に対して、ベストなサービスを選ぶ問題がよく出ました。その部分に関してはそれぞれのサービスを表面的に覚えるのではなく、サービスごとに何ができて、どのような場面で使うのかというのを理解しておく必要があります。


簡単にですが、自分が感じた試験の感想でした。
次はAZ-204の取得目指して勉強します。
【Ruby初心者向け】配列の要素を自由に削除する方法を解説！

配列の中の"特定の要素を消すメソッド"をお探しですか？

当記事では、それに該当するdelete()とdelete_ifを紹介します！

Ruby初心者に向けてできるだけ丁寧に解説していきますので、是非最後までお付き合いください！

## 配列の特定の要素を削除するdelete( )

まずは指定した要素を削除することができるdelete( )を紹介します。

このメソッドは引数として削除したい要素を指定してあげるだけで、その引数と一致する要素を配列から削除することができます。

```ruby:delete()の使用方法
a = [1, 2, 3, 1, 2, 3]

#配列から3の要素だけ削除する

a.delete(3)

a  #=> [1, 2, 1, 2]
```

上記はdelete( )の使用例です。

まずはaに配列を引数として渡してあげて、aに対してdelete( )メソッドを使って3という要素を削除するように命令します。

そして、正確に実行されると、上記のような結果になるわけです。

## 削除する配列の要素の条件を指定するdelete_if

次にdelete_ifについて解説していきます。

delete_ifは、delete( )と比べると広範囲な配列の要素の削除が可能です。

例えば、配列内の奇数の要素だけを削除したいとします。

```ruby
a = [1, 2, 3, 1, 2, 3]

#配列から奇数の要素だけを削除する

a.delete_if do |n|

 n.odd?

end

a  #=> [2, 2]
```

まず、配列を用意します。

そして、delete_ifで奇数である場合に要素を削除するように命令します。

結果として、奇数が削除されます。

## まとめ

ターミナルなどで配列を操作したいときにこのようなメソッドを覚えていると便利ですね。

初心者の方は忘れがちなメソッドなので、覚えておくと少し他の人と差別化することができるかもしれませんね！

これからそのような情報を記事として取り上げていこうと思っているので、よかったら見て頂けると幸いです！

ではまた！
【Rails + Webpacker】assetsの画像を使いたい！ Vue.jsで画像を表示できるまで

RailsとWebpackerで開発している時に、画像どうやって読み込むのかなと思って調べてみた記録です。
# WebpackerのREADMEをのぞいてみる
WebpackerのREADMEの Paths > [resolved](https://github.com/rails/webpacker/tree/3-x-stable#resolved) を参照してみると、assetsをもつアプリとimagesを共有したいときは、`webpacker.yml`で`resolved_paths`と書いて読み込める、とあります。今回はこれに習って実装しています。

```config/webpacker.yml
resolved_paths: ['app/assets']
```

## ただし、コンパイルの速度に影響アリ
以下にあるように…
> Please be careful when adding paths here otherwise it will make the compilation slow, consider adding specific paths instead of whole parent directory if you just need to reference one or two modules

でかいディレクトリ単位で読み込むとコンパイルが遅くなる、ということのようです。表示速度を気にする場合は注意したいです。

# 実装例

## webpacker.ymlにpathをかく
上でみたように `webpacker.yml`に記述していきます。今回は`assets/images`配下しか必要としていないので、先ほどの注意点も考慮してimagesまでpathを指定してみました。

```config/webpacker.yml
  resolved_paths: ['app/assets/images']
```

## Vue.jsで使うには
今回は、Vue.jsのコンポーネントで読み込みたかったので、一緒に書いておきます。

```sample.vue
<template>
  <div>
    <!-- imgタグでsrcに"~"をつけてimportしたファイルを指定する -->
    <img src="~logo.svg" /> 
  </div>
</template>

<script>
  import 'logo.svg'; // ここでimport
</script>
```

こうやって書いてみるととってもシンプルですね。

以上、少しでも参考になれば嬉しいです。
Heroku MySQLにクライアントから接続したい

# やりたいこと
HerokuのアプリにアタッチしているMySQLへ、MySQL Workbenchなどのクライアントから接続したい
# 方法
## 情報を取得する
#### アプリ名を取得
herokuにデプロイしているアプリケーションの名前を取得します。
この場合はhogehogeというアプリをデプロイしていることとします。
herokuのアプリ名は、ど忘れしてたり、被らないように特殊にしている場合があるのでcliで取得してコピーしましょう。

```bash
$ heroku list
hogehoge
fugafuga
```

#### アプリの情報を取得

アプリケーションhogehogeの情報を取得します。
アプリケーションに設定されている環境変数が出力されます。
Heroku上にあるアプリケーションにMySQLをアタッチしている多くの場合において、DATABASE_URLは以下のようになっていると思います。

```bash
$ heroku config -a hogehoge
=== hogehoge Config Vars
CLEARDB_DATABASE_URL: mysql://fizz:buzz@foo.cleardb.com/heroku_barbarbar?reconnect=true
DATABASE_URL: mysql://fizz:buzz@foo.cleardb.com/heroku_barbarbar?reconnect=true
以下略
```

#### MySQLの接続情報を抜粋する
環境変数の値から接続情報のすべてを読み取ることができます。

```plaintext
// 元が以下だとしたら
mysql://fizz:buzz@foo.cleardb.com/heroku_barbarbar?reconnect=true

// このように読み替える
mysql://username:password@host/schema?reconnect=true

// つまり以下のようになる
MySQLホスト
=> foo.cleardb.com

DB Schema
=> heroku_barbarbar

Username
=> fizz

Password
=> buzz
```

以上になります。
あとは使っているクライアントに情報を入れて接続してあげるだけです。

# 最後に

HerokuってデフォルトのデータベースがPostgreSQLなんですが、
MySQLに変えることもできます。
僕の場合には仕事、プライベート、開発環境、本番環境問わず、MySQLを使うことが多いため、PostgresからMySQLへ変えてみました。

変え方については検索すればいくらでもヒットするのでそちらを。
ちなみにクライアントからアクセスして使ってみた感じだと速度が遅めです。まぁ無料なのでそこは仕方ないですね。
WebStormでPrismaの型がコード補完されないとき

あなたはPrisma、もしくはPrismaフレームワーク（Blitzのような）をつかっていますか？

あなたはWebStormをつかっていますか？

私はtype safeなPrismaを気に入っています。しかし、なぜか私のWebStormは言うことを聞いてくれませんでした。コード補完がされないのです。おかしい。VSCodeは言うことを聞いているのに。

![](https://miro.medium.com/max/1400/1*fZEeupgYq_2lhtyNVpLJ_w.png)

# 解決策
`.prisma folder -> Mark Directory as -> Cancel Exclusion`


> https://github.com/prisma/prisma/issues/2359#issuecomment-739921212

そう、原因は、node_modules配下を除外しているから。
Prismaがジェネレートした定義ファイル、`.prisma`を除外から削除しましょう。それは動作します。

![](https://miro.medium.com/max/1400/1*kW0B9QaOXacDxeLzPGiOOw.png)
![](https://miro.medium.com/max/1400/1*2xJg8oSZLmzjPk964J8_Xw.png)

さぁ、Prismaを楽しんでください！

---

English: https://sa-nitawaki.medium.com/how-to-do-working-prisma-code-completion-for-webstorm-intelij-e7f0c4c4706c
jupyter notebookでazure MLを動かす

##前提
・jupyter notebookでazure machine learningの実験を実行
・azureのワークスペースの作成などは省略
・動作環境はmacOS

##手順
###1.jupyter notebookを起動
1-1.仮想環境を作成　`conda -n create 仮想環境名`
1-2.仮想環境を有効化　`conda activate 仮想環境名`
1-3.upyter notebookを起動 `jupyter notebook`

###2.準備
2-1.Azure mlのパッケージをインストール　
`pip install azureml`,`pip install sklearn`
2-2.Azureのワークスペースをimport
この時、Azureのワークスペースでconfigファイルをダウンロードして、ipynobファイルと同じフォルダに格納しておく

```python
from azureml.core.workspace import Workspace
ws = Workspace.from_config()
```

```python
%matplotlib inline
import matplotlib.pyplot as plt
import sklearn
from sklearn import preprocessing, metrics, model_selection
from sklearn.preprocessing import MinMaxScaler, StandardScaler, LabelEncoder, OneHotEncoder, LabelBinarizer 
from sklearn.model_selection import KFold, StratifiedKFold, GridSearchCV, train_test_split
from datetime import datetime, date, timezone, timedelta
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
import os, gc
```

###3.データの読み込み

```python
PATH = '/Users/〇〇/Desktop/jupyter/〇〇/'

## ファイル読み込み
data = pd.read_csv(PATH+'〇〇.csv')

## 学習、バリデーション、テストデータに分割
from sklearn.model_selection import train_test_split
train_data, test_data = train_test_split(data, test_size=0.4 ,shuffle=False)
train_data, validation_data = train_test_split(train_data, train_size=0.66 ,shuffle=False)

## 不要なデータを削除
no_label = "CO"
train_data = train_data.drop(no_label,axis=1)
test_data = test_data.drop(no_label,axis=1)
validation_data = validation_data.drop(no_label,axis=1)

## ターゲットカラムを選択
label =  "NOX"
 
test_labels = test_data.pop(label).values
```

###4.モデル作成
モデル作成のプログラムを示します。
今回はタスクを回帰にしたかったので、`task='regression'`を指定
　(分類タスクなら'classification'、時系列解析なら'forecasting')
その他、AzureのGUIで変更できない設定を変えられるところが魅力です。
ちなみに私はデータ分割を指定したかったためjupyter notebookより実行しています。
　(デフォルトでは行数に応じた分割数の交差検証)

```python
from azureml.train.automl import AutoMLConfig

automl_config = AutoMLConfig(task='regression',
                             primary_metric='r2_score',
                             experiment_timeout_minutes=60,
                             training_data=train_data,
                             label_column_name=label,
                             validation_data = validation_data,
                             debug_log='automated_ml_errors.log')
```

実験の開始(モデルの作成と検証)

```python
from azureml.core.experiment import Experiment
experiment = Experiment(ws, "〇〇")
local_run = experiment.submit(automl_config, show_output=True)
```
〇〇には任意の実験名を入れてください

##最後に
私は、モデル作成の際の設定で参照できるサイトが少なく、時間を使ってしまったので、同じことを実装したい方がすぐにできるよう、一例としてコード付きで記事を書かせていただきました。
ライブラリのバージョン管理やpythonのインポートのパスを通す作業にも少し手こずりました。
まだまだエンジニアとしてわからないことが多いですが、少しずつ勉強していきます。^ ^

##参考サイト
microsoftドキュメント
・https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-configure-cross-validation-data-splits
・https://docs.microsoft.com/ja-jp/azure/machine-learning/how-to-auto-train-forecast

ブログ記事
・https://www.simpletraveler.jp/2019/12/08/tried-azuremachinelearning-on-local-jupyter/
ノーコード（bubble.io）でファミコンのレビューサイトを作ってみた。

#はじめに
今まで何度か自分のサービスを作ろうとしては挫折していたのですが、ノーコード（bubble.io）を触り１時間もかからずアカウント登録の実装ができたので、「これなら完成までいける！」と確信し挑戦してみました。

#やりたかったこと
・ファミ通のクロスレビュー風のレビューサイト
・荒井清和先生風タッチの画像ジェネレーター
・twitterログインあり
・SNSっぽく「いいね」をつける

#挫折
vue.js+firebaseで作ろうとするも環境構築で挫折。
プログラマーの人は本当にすごいと思います。webpackの設定だったり、つまづきポイントが多すぎてリリースまでいける気配がしませんでした。

#触り慣れてくると機能を増やしたくなる
マーク・ザッカーバーグの名言
>Done is better than perfect.
>（完璧であることより、まず終わらせることが重要だ）

を自分に言い聞かせて、作業しながら「あれもしたいこれもしたい」という欲望を捨て、やりたいことだけを実装してリリースすることだけに集中しました。

#できたもの
ファミレビュー
~~https://famireview.bubbleapps.io/~~
https://famireview.bubbleapps.io/version-test/
![ファミレビュー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561145/a9774419-c65c-da03-7ac4-15e599d93fcc.png)

トップページ

![レビューとデータベース.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561145/7cc6e5f7-9123-40fa-0384-6ea9d18dc208.jpeg)
ファミコンのデータベースとジェネレータ

デザインツールなど
figmaを使用してロゴやアイコン作成。ベクター編集ツールとして使用。
画像ジェネレータの素材作成は、使い慣れたphotoshopを使用し筆圧感知ありのペンタブで素材を準備。

#全体として
ページ数は23ページで特にサイトマップなどは作らず行き当たりばったりで作りました。
![sitemap.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/561145/000f89cd-cc37-a640-6bd6-58eb6e400876.jpeg)
共通エレメントはヘッダーとフッターのみ共通で使用しています。もっと使うべきな気がします...

#辛かったこと
##ファミコンソフトのデータベース登録
googleで「ファミコン　データベース CSV」などで検索すると様々な方がまとめていたので、使用させてもらおうと思ったのですが、
bubble.ioは無料枠の場合、データベースの更新にCSVアップロードが使えません！
なので
1000本以上あるのをファミコンソフトを手動でデータベースに登録したのですが
実はこの作業が一番時間がかかった箇所になりました...（40時間くらいだったと思います）

##bubble.ioの基本`repeat group`の理解
登録されているデータベースの表示には`repeat group`を使用するのですが、どう紐付けたらいいか今だにわからない時があります。
（サンプルなどにRGと名前付けされていて`repeat group`の略だとわかるのにも時間がかかりました。）
ちゃんと紐づいていない時はわかりやすくエラーが表示されるので、一旦保留にして違う作業をするなどして頭をリセットしてから調べ直すなど、焦らずちょっとずつ解決していきました。

##レスポンシブ対応
レイアウト周りは結構癖があるなと感じました。
なのでスマホのみで横幅375pxで１カラムとしました。
リリースするのが目的なのもあり、割り切るのも大事かなと思います。

##助けてもらったサイト
###ノーコード ラボ
https://blog.nocodelab.jp/
手順をおって解説がありわかりやすいです。画像も多く理解が慣れるまで何度も訪れました。
ノーコードラボさんはプラグインも作成しており、ジェネレータ部分は
Element to PNG
https://blog.nocodelab.jp/entry/elementtopng
を使用させていただいています。
すごい！

###Bubble Forum
https://forum.bubble.io/
「bubble.io 英単語A 英単語B」くらいで検索すると基本的にbubble.ioのフォーラムが出てきます。つまづいた時はこれしかないです。ここに載っていない、読んでも理解できないのは実装せず（夢を膨らませず）次の工程に一旦進むのがいいです。

#リリースしてみての不安
・youtubeのサムネイルを使用していることは問題ないか？（一応youtubeにはリンクさせている）
・画像ジェネレータの素材は荒井清和先生が描いた似顔絵をトレースしていること
・ファミ通のクロスレビューを意識しすぎて怒られるのではないか。
・利用規約などはざっくりと準備
などありますが、突っ込まれたら取り下げたり直したりなどしていこうと思います...

#まとめ
作業を始めてから３ヶ月ほどで作ることができ、コードを全く書かずにそれっぽいサービスができ上がるのには驚きました。
コードを書かずにといっても、ノーコードの仕様だったりUIなどに慣れるのにはやはり時間はかかりました。
結果的に合計100時間くらいはかけたと思います。
ですがリリースまで辿り着けるという成功体験を得られるのは大きいことでした。
今後はちびちびとバージョンアップをしていこうかなと思っています。
VSCodeでKotlinの競プロ環境構築

# 環境
・OS：Windows10
・エディタ：Visual Studio Code(以下VSCode)

# 手順
### Kotlin環境の構築
VSCode自体はKotlinコードのコンパイル機能を持っていないので、`kotlinc`コマンドはあらかじめインストールしておく必要があります。

1. [こちら](https://github.com/JetBrains/kotlin/releases/tag/v1.4.21)から`v1.4.21`をダウンロード  
2. C:\Program Files直下にkotlincを移動
3. 環境変数のPathに`C:\Program Files\kotlinc\bin`を追加

### プラグインをインストール
`Kotlin Language`プラグインをインストールします。
これにより、Kotlinコードのシンタックスハイライトが有効になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241229/2d1a620f-6f23-3175-8e75-977cd8a21f7e.png)

`Code Runner`プラグインをインストールします。
これにより、ショートカットキーからKotlinコードを実行できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241229/c35f1a4b-4eea-3749-0ea2-d223a70cac45.png)


### Code Runnerの設定変更
`Code Runner`はデフォルトで出力タブに出力してしまうため、
ターミナルに出力して標準入力が行えるようにしたいです。

setteing.jsonに以下を追記します。

```
// 実行前にログをクリアしてくれる。便利。
"code-runner.clearPreviousOutput": true,
// 本題のターミナルで実行させるための設定。
"code-runner.runInTerminal": true

```

### 動作確認
標準入力をそのまま返却する簡単なコードを書いて実行してみます。

```test.kt
fun main(args: Array<String>) {
    println(readLine())
}
```

`test.kt`を開いた状態で`Ctrl + Alt + N`で実行。

```console
cd "c:\GitHub\sample-kotlin\" ; if ($?) { kotlinc test.kt -include-runtime -d test.jar } ; if ($?) { java -jar test.jar }
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.intellij.util.ReflectionUtil to method java.util.ResourceBundle.setParent(java.util.ResourceBundle)
WARNING: Please consider reporting this to the maintainers of com.intellij.util.ReflectionUtil
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
Hello World! // 標準入力
Hello World! // 返却される値
```

うまくできましたね！

# あとがき
実行時にWORNING出てくるのが煩わしいので、その辺りの解決法が見つかったらこの記事も追記します。
（有識者の方コメントいただけると非常に助かります。。）

良い競プロライフを！

# 参考
- https://marketplace.visualstudio.com/items?itemName=formulahendry.code-runner
- https://maku77.github.io/kotlin/intro/vscode.html
- https://ymdevx3.hatenablog.com/entry/2019/08/26/012848
- https://murabitoleg.com/vscode-runner/
日本の都道府県 API

日本に関するデータを取得するためのAPIを作成しました
私は日本の文化と人々が大好きです!
https://japan-api.github.io/docs/

### 仕組み
- Python & Flask 上にてビルド
- Heroku にてホスティング
- ほとんどのデータはウィキペディアから取得されます

### URL
#### 東京
https://japan-api.herokuapp.com/api/v1/tokyo

```json 
{
  "area": "2,194.07 km2",
  "area_code": "03x042",
  "area_mi": "847.14 sq mi",
  "area_rank": 45,
  "capital": "Shinjuku",
  "capital_kanji": "新宿区",
  "climate": "Humid subtropical",
  "density": "6,349/km2",
  "density_mi": "16,440/sq mi",
  "economy": [
    "Finance",
    "Light industry"
  ],
  "governor": "Yuriko Koike",
  "island": "Honshu",
  "iso_code": 13,
  "local_dishes": [
    "Monja Yaki",
    "Fukagawa Don",
    "Kusaya"
  ],
  "name": "Tōkyō",
  "name_kanji": "東京都",
  "population": "13,929,280",
  "population_rank": 1,
  "region": "Kantō",
  "symbols": [
    "Bird: Black-headed gull",
    "Flower: Yoshino cherry",
    "Tree: Ginkgo"
  ]
}
```
#### 日本
https://japan-api.herokuapp.com/api/v1/japan

```json
{
  "area": "377,975 km2",
  "area_mi": "145,937 sq mi",
  "area_rank": "61st",
  "calling_code": "+81",
  "capital": "Tōkyō",
  "capital_kanji": "東京都",
  "climate": "Predominantly temperate",
  "currency": "Japanese yen (¥) (JPY)",
  "density": "334/km2",
  "density_mi": "865.1/sq mi",
  "density_rank": "24th",
  "driving_side": "left",
  "economy": [
    "Industry",
    "Agriculture",
    "Fishery",
    "Services",
    "Tourism",
    "Science and Technology"
  ],
  "emperor": "Naruhito",
  "gdp_nominal": "$4.911 trillion, By head: $39,048",
  "gdp_ppp": "$5.236 trillion, By head: $41,634",
  "gini": "33.9 - medium",
  "hdi": "0.919 - very high",
  "islands_number": "6,852",
  "iso_code": "JP",
  "local_dishes": [
    "Sushi",
    "Sashimi",
    "Ramen",
    "Onogiri",
    "Nabe",
    "Miso",
    "Tempura",
    "Soba",
    "Yakitori",
    "Kaiseki",
    "Udon",
    "Sukiyaki",
    "Tonkatsu",
    "Donburi",
    "Curry"
  ],
  "name": "Nippon",
  "name_kanji": "日本国",
  "national_language": "Japanese",
  "population": "125,710,000",
  "population_rank": "11th",
  "prime_minister": "Yoshihide Suga",
  "time_zone": "UTC+09:00 (JST)"
}
```
#### その他
https://japan-api.herokuapp.com/api/v1/all - 日本を含むすべての都道府県
http://japan-api.herokuapp.com/api/v1/population_rank/int:population_rank - 人口ランクで探す（全都道府県中）
https://japan-api.herokuapp.com/api/v1/area_rank/int:area_rank - エリアランクで探す（全都道府県中）
http://japan-api.herokuapp.com/api/v1/iso/int:prefecture_iso -  ISOコードで検索

### ライセンス

MITライセンス

### リンク

GitHub
https://github.com/japan-api
批評してください