OmniAICreator/Qiita-1.07M huggingface dataset:
届出電気通信事業 申請ガイド

# はじめに

「電気通信事業」を行うためには、総務省に登録もしくは届出が必要です。

「Mastodon」というマイクロブロギングサービスを運営する機会がありましたので、届出の申請を行ってみました。


# 「電気通信事業」とは？

「電気通信役務を他人の需要に応ずるために提供する事業」と定義されています。

ざっくり言うと「自分の持つ電気通信サービスを他人に使ってもらうようなサービス」です。

提供しているサービス種類によって「登録電気通信事業者」「届出電気通信事業者」の2種類に分けられます。


## 「登録」電気通信事業者

> ① 以下のいずれかの基準に該当する場合
> １）端末系伝送路設備（端末設備⼜は⾃営電気通信と接続される伝送路設備（（例）局舎から利⽤者宅までの間の伝送路設備。同軸ケーブル、光ファイバといった線路設備のほか、無線系の設備も含む。））の
> 設置区域が⼀の市町村（特別区、地⽅⾃治法の指定都市の区・総合区を含む）を超える場合
> ２）中継系伝送路設備（端末系伝送路設備以外の伝送路設備。
> （（例）局舎から局舎までの間の伝送路設備））の設置区間が、⼀の都道府県の区域を超える場合 

[出典：電気通信事業参入マニュアル［追補版］(総務省)  ※PDF注意](https://www.soumu.go.jp/main_content/000477428.pdf)

ざっくり、広域にわたり自社で通信ケーブルを敷設できるような業者（NTTやケーブルテレビなど）や、携帯電話のキャリア、インターネットプロバイダなどが該当するようです。



## 「届出」電気通信事業者

> ② ①に該当しない電気通信回線設備
> （例）同⼀市区町村内におけるＣＡＴＶアクセスサービス 
> ・他の電気通信事業者の電気通信サービスを再販する場合
> ・サーバやルータ等の伝送路設備以外の機器のみを設置・提供して電気通信サービスを提供する場合

[出典：電気通信事業参入マニュアル［追補版］(総務省) ※PDF注意](https://www.soumu.go.jp/main_content/000477428.pdf)

単一の市町村内で完結するような、小規模な回線業者や
自社で回線は持っていないけども、電気通信サービス（Webサービス含む）を提供する場合が該当するようです。



# 提供予定のサービスは届出が必要？

電気通信事業参入マニュアル［追補版］の7～10ページにフローチャートがあります。
また、11～19ページにサービスの具体例が載っているため、参考にしてください。

[電気通信事業参入マニュアル［追補版］(総務省) ※PDF注意](https://www.soumu.go.jp/main_content/000477428.pdf)


今回、提供しようとしている「Mastodon」というWebアプリと運営形態は

* 誰でも自由に登録ができ、他の誰とでもやりとり（リプライやDM）ができる（電気通信設備を他人の通信の用に供する。他人の通信を媒介する。クローズドチャットに該当）
* 本格的にサービスインするつもり（電気通信事業である）
* (仕組み上)全世界の誰でも登録でき、また誰とでもやりとりができる（狭域サービスではない）
* もしかすると寄付やアフィリエイトなどによって収益があるかもしれない（電気通信事業を営む）
* VPS上に構築する（電気通信回線設備を設置しない）

という流れだったため、「届出」が必要であると判断しました。




# 届出してみよう

## どのタイミングで届出すればいい？

サービスイン前に行う必要があります。


## 届出手続きに費用はかかる？

手続きそのものに費用はかかりません。届出後も定期的に費用がかかったり、税金を課されるということもありません。
ただし、住民票が必要である他、書類を送るための封筒、申請用紙、郵便料金は別途必要です。


## どんな書類を用意すればいい？


各様式のテンプレートは総務省のWebサイトに用意されています。

[総務省：関東総合通信局：申請・届出書類（届出認定電気通信事業）のダウンロード](https://www.soumu.go.jp/soutsu/kanto/com/jigyo/tetuzuki/tetuzuki04.html)

また、記入例や注意事項を記した文書を上げてくれているので参考にしてください。

**個人で申請する場合は、以下の5アイテムを用意します。**


### 1. 電気通信事業届出書（様式８）

基本情報を記入する用紙です。

提出年月日、住所、氏名、電話番号、メールアドレス、提供区域、事業開始予定年月日を記入します。
提供区域は「全国」とします。
他の項目は非該当なので空白としました。

### 2. 提供する電気通信役務（様式４）

どのようなサービスを提供する予定かを記入します。

今回は「クローズドチャット」として申請するため、
「30 インターネット関連サービス（ＩＰ電話を除く。）」の「提供する役務」に「クローズドチャット」と記入しました。

### 3. ネットワーク構成図（様式３）

届出者、インターネット、利用者の位置関係が分かるようなネットワーク構成図を描きます。
図そのものは割とざっくりでOKなようです。

VPSやレンタルサーバの類を使用する場合は、提供業者を記入する必要がありました。

![ネットワーク構成図サンプル](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129737/bb6f793f-3c91-6d8d-6b1f-dabca2865553.jpeg)


### 4. 住民票

役場などで新しく取得してください。
コピーでは不可です。

### 5. 返信用封筒

切手を貼って、住所氏名を記入しましょう。

## 書類の送り先は？

各地域の総合通信局・総合通信事務所です。

[総務省：管区行政評価局・行政評価事務所・行政監視行政相談センター](https://www.soumu.go.jp/menu_kyotsuu/chihou.html)

また、記入について分からないことがあれば、それぞれの総合通信局に問い合わせるとよいです。


# 申請後、届出内容に変更があったら？

たとえば、引っ越したり、サーバー業者を乗り換えたり、サービスを行わなくなった場合などは
同じように各地域の総合通信局にその旨申請しましょう。



# おわりに

はじめての経験だったので、戸惑う部分もありましたが
電子通信事業についての理解が深まったのでよかったなと思いました。

また本記事の内容を鵜呑みにせず、総務省のWebサイト等で最新情報を参照するようにしてください。
WSL2 に必要な msi が見つからない人へ

# 対象読者
`wsl_update_x64.msi` が見つからない人

# 結論

[英語版](https://docs.microsoft.com/en-US/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package) にアクセスしよう

# 本文

WSL1 を WSL2 に変更するためには、`/enable-feature` したあとに `wsl --set-default-version 2` あるいは `wsl --set-version <distribution> 2` を実行します。そうすると、

```
wsl --set-default-version 2
WSL 2 を実行するには、カーネル コンポーネントの更新が必要です。詳細については https://aka.ms/wsl2kernel を参照してください
```

と表示されるので https://aka.ms/wsl2kernel から更新プログラムを入手する必要があります。

ところが、地域を日本に設定していると [このページ](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package) に飛ばされるのですが、肝心の `wsl_update_x64.msi` がどこにも見当たりません！(証拠: [install-win10.md](https://github.com/MicrosoftDocs/WSL.ja-JP/blob/2946eb3fd0836daedd3305551ee10ec7203a590f/WSL/install-win10.md))

|<img width="60%" alt="日本語のドキュメントには wsl_update_x64.msi へのリンクがない" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244870/34e2d4ec-f11d-a9c7-79f1-ad8b4610765b.png">|
|:-:|

こんなときは、英語版を見てみましょう。「英語で読む」を押しても翻訳されるだけで内容は変わらないので、URL を `ja-jp -> en-us` に[書き換える](https://docs.microsoft.com/en-US/windows/wsl/install-win10#step-4---download-the-linux-kernel-update-package)と、今度はちゃんとダウンロードリンクがあります (証拠: [install-win10.md](https://github.com/MicrosoftDocs/WSL/blob/e7ebace828ea92c8b51122355a1d52fc919f491c/WSL/install-win10.md))！

|<img width="60%" alt="英語のドキュメントには wsl_update_x64.msi へのリンクがある" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/244870/bd8908d5-8bd5-93d6-293e-db2f2c39b843.png">|
|:-:|

翻訳が追いついていないようなので、みんなで commit しよう！[^pr]

追記 (2020/9/20 10:40): 関連する issue が既に 3 つもあります: [#16](https://github.com/MicrosoftDocs/WSL.ja-JP/issues/16)、[#17](https://github.com/MicrosoftDocs/WSL.ja-JP/issues/17)、[#18](https://github.com/MicrosoftDocs/WSL.ja-JP/issues/18)。日本ではシルバーウィークだけど、レビュアーもお休みなのかな…？

[^pr]: とりあえずこの件については [PR](https://github.com/MicrosoftDocs/WSL.ja-JP/pull/15) をたてたので、マージされたらこの記事は不要になるはず…！
MaxでMIDI鍵を弾く強さによって音の大きさが変わるポリフォニックシンセサイザーを

#前の記事
[Maxで和音を奏でられる（ポリフォニック）シンセサイザーを](https://qiita.com/waokitsune/items/da173954f2ee047a0628)

#バージョン

Version 8.1.5（9359645）（64-bit windows）

#鍵盤を弾いた強さはどうやって取得するの？
noteinオブジェクトのVelocityから取ってくるぞい！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/d4b388b2-e7d3-6bad-dca9-9821aa45756d.png)
一番弱く弾いた時のVelocityの値は1、逆に一番強く弾いた時の値は127でごわす。


#キーボード番号とベロシティをセットにしたメッセージにしてあげる必要あり
味噌になるのが **pack** オブジェクト。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/85607ac4-9572-d139-5ab3-6e730a2586ef.png)
packオブジェクトでキーボード番号とベロシティを一つにまとめてあげないといけない。

『キーボード番号を第1引数、ベロシティを第2引数にして音を作る部品に渡す』という風に作るとうまくいかなかった(´・ω・`)

#音を作る部品を呼び出す側はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/fdfd8756-7629-9ee0-578d-668131d80fd8.png)
**print** オブジェクト（=Maxコンソールに出力するやつ）に繋げるとpackが何をしているのかが分かるっ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/ed962a8e-4d5e-bb31-6303-0c85517c34b2.png)
60番の鍵盤を116の強さで弾いた時の例。コンソールは2行にならずに1行にまとまってる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/81357c80-63ba-8df4-79b7-a92dd8c924f9.png)

#packされたメッセージを受け取った側ではpackの逆を
**unpack** オブジェクで届いたメッセージを分解しまする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/44e44199-5c5e-c4bd-52cc-099f01e0935f.png)

#ベロシティの値にはscaleとdbtoaをかませる
ベロシティの値を単純に÷127せずに、まずはデシベルに変換します。
その為に **scale** オブジェクトを使う！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0812ec53-b1b7-19e8-3142-df1faa97c399.png)
んでもってデシベルを音の大きさをコントロールする値に変換！
**dbtoa** オブジェクト。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/582b295a-cf5e-df78-3458-cf40cd009849.png)

参考サイトさん https://music.arts.uci.edu/dobrian/maxcookbook/use-midi-velocity-amplitude-envelope
参考サイトさん https://natuch.com/2014/12/26/decibel/

#音を作る部品はこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/0b27be4a-6b28-0c31-bfad-c4c93945c4e7.png)
（音を作る部品はsynth_cycle.maxpatという名前のファイルにしています）

#次の記事
[Maxで音の波の加算合成（AM）](https://qiita.com/waokitsune/items/a5e8d4397d423d7291b6)
【Git】GitLabでSquash&mergeした後の差分がおかしい

## はじめに
タイトルで「おかしい」と書きましたが、正確には「既にマージ済みの内容が差分と表示されている」ということが起きましたのでまとめます。

## 事象
・`development`ブランチから`master`ブランチへSquash & mergeした後、別のマージリクエストで`master`ブランチへマージしようとしたとき、Squash & mergeした時の内容が差分に表示されている。

・`git diff development master`コマンドを打った時も同様に、既にマージ済みの内容が差分として表示される

## 解決方法
・Squash & mergeをしない

…解決方法、ではないですね。

### featureからdevelopmentへ

Gitの運用方法は職場・現場によって様々だと思いますが、多くのところでは`master` > `staging` > `development` > `feature`とブランチが切られているのではないでしょうか。

この時、`development`ブランチから、個人の開発用・issueブランチとして`feature`ブランチを切って作業をする場合、微修正コミットや、ローカルでは動作が確認できないのでとりあえずPushしてリモート環境で確認するためのコミットを連発してしまった、などでブランチ内のログを荒らしてしまったことはありませんか？僕はあります。

上記のような場合には、GitLabで`development`に向けてマージリクエストを作成する時に、「Squash commits」にチェックを入れてコミットを一纏めにすると同時に、「Delete source branch」にもチェックを入れることでマージ後には`feature`ブランチを削除する、という流れがきれいだと思っており、実際にこの方法で運用しています。

`git rebase`でコミットをまとめる方法もありますが、上記のような、①ターゲットブランチに対して新規のコミットである、②全てのコミットが自分だけである、③粒度がそれほど大きくならない、という状況であればSquash & mergeの方が早くて簡単かなと個人的に思っています。

### developmentからmaster(staging)へ

個人開発用・issueブランチはマージリクエスト完了後、つまりそのissueを解決した後は削除した方がごちゃごちゃせずに済むかと思います。リモートブランチには`master` `staging` `development`ブランチが存在し、進行中の`feature`ブランチだけが残っている状態が簡潔で良いです。

さて、今度は`development`から`master(staging)`へ向けてマージしたいと思います。`feature`は都度削除をしていましたが、今回は`development`ブランチなので「Delete source branch」にはチェックを入れずに、「Squash commits」だけチェックを入れ、Squash & merghを行います。作成したマージリクエスト上で特にコンフリクトがなければそのままマージしてしまいます。問題なくマージが完了しました。

GitLabの`Compare`から、`development`と`master`の差分を確認すると、マージしたばかりなので差分もなくきれいな状態になっているハズ…あれ？たった今マージした内容が全て表示されている…だと？

`feature`ブランチは開発が終わる事に削除していたため気づきませんでしたが、Squash & mergeでコミットをまとめてマージした場合、そのまとめたコミットは新規のコミットとして扱われるため、まとめた複数のコミットと中身は同じですが、異なるものとして判定され差分が表示されてしまったのではないかと思っています。

ここら辺が、自分のほうで調べても確定的なことがわからなかったのですが、今回のようなケースはソースコードは全く一緒なので、gitの差分はコミット（ソースコードのスナップショット）で判断しているのではないかと思っています。が、間違えていたらご指摘頂けますと幸いです。

`feature`の方でSquash & mergeしても良いときの条件を自分なりに書きましたが、`development`から`master`へのマージですと、粒度がかなり大きくなってしまい、内容も様々なものが混ざったコミットが出来上がってしまうので良くないですね。ここは自分でもわかっていたはずなのですが、今回やらかしてしまいました…反省ですね。

ちなみに、試験的に、今回のような既にマージ済みの内容が差分として表示されている状態で、強制的にマージしてみましたが、問題なく新規の変更点だけが変更された形になっていました。ただし、差分は依然として残り続けます。

## まとめ
・`development`ブランチのような、常に残り続ける大きなブランチから`master`ブランチなどへのマージの際は、Squash & mergeをしないようにした方が良い
【gulp エラー】Error: PostCSS plugin autoprefixer requires PostCSS 8. Update PostCSS or downgrade this plugin.

## エラーが発生した状況

npm で autoprefixer を v9 から v10 にアップデートし、gulp のCSSタスク(postcss関連含む)を走らせた時に発生

## 原因

* autoprefixer v10 で、必要とする postcss が v8 以上となった
* gulp-postcss(v8.0 ２年前から更新されていない) が依存している postcss が v7 のためエラーとなる
* 補足：postcss-cli も同様らしい

## 一時的な対処法

__★★TODO: 後でちゃんと対処(時間がないのでとりあえず)__


* autoprefixer のバージョンを9の最新版に下げる
  - `npm uninstall autoprefixer`
  - `npm install --save-dev autoprefixer@9.8.6`

## 解決法メモ (未検証)

* gulp-postcss の処理を、postcss で直接処理させるよう置き換える？
* 補足：一応 node.js を最新版(v14.11.0)にアップデートしておく
* gulpプラグインではない素の postcss 最新版(v8.x.x) をインストール `npm install --save-dev postcss`
* gulp-postcss の処理を、postcss で直接処理させるよう置き換え
* 正常に動作していることを確認後、gulp-postcss を削除

```JavaScript
// @link https://www.npmjs.com/package/autoprefixer#javascript
// 参考用
const autoprefixer = require('autoprefixer')
const postcss = require('postcss')
 
postcss([ autoprefixer ]).process(css).then(result => {
  result.warnings().forEach(warn => {
    console.warn(warn.toString())
  })
  console.log(result.css)
})
```

## 参考記事

* [Version 10 is broken! · Issue #1359 · postcss/autoprefixer · GitHub](https://github.com/postcss/autoprefixer/issues/1359)
* [Releases · postcss/autoprefixer · GitHub](https://github.com/postcss/autoprefixer/releases)
* [Release 8.0 “President Ose” · postcss/postcss · GitHub](https://github.com/postcss/postcss/releases/tag/8.0.0)
* [postcss/plugin.md at master · postcss/postcss · GitHub](https://github.com/postcss/postcss/blob/master/docs/guidelines/plugin.md)
* [GitHub - postcss/autoprefixer: Parse CSS and add vendor prefixes to rules by Can I Use](https://github.com/postcss/autoprefixer#gulp) 動かないコード
覚えておきたいコマンドたち

##はじめに

開発するうえで覚えておきたいコマンドたちをまとめていきます。随時更新します。
初心者の覚え書きです。
あまり書きすぎても身につかないので、使ったことのあるものを書いていきます。

##Git

* <font color="Blue">git clone <コピーしたいリポジトリのURL></font>
    * git リポジトリを自分のPCにコピーする
   <br>
* <font color="Blue">git branch <ブランチ名></font>
    * 新たなブランチを作成
 <br>
* <font color="Blue">git branch -d <削除したいブランチ名></font>
    * 指定したブランチを削除
    <br>
* <font color="Blue">git switch <切り替えたいブランチ名></font>
    * 指定したブランチに切り替える
    <br>
* <font color="Blue">git push origin <ローカルブランチ名></font>
    * ローカルリポジトリの変更をリモートリポジトリへ反映させる
    * originの部分には、リモートリポジトリ名を指定する
    * 2回目以降は git push のみでよい
<br>

* <font color="Blue">git commit --amend</font>
    * 直前のコミットを上書きする
<br>
* <font color="Blue">git reflog</font>
    * 今のブランチのこれまでのすべてのコミット履歴を表示
 <br>
* <font color="Blue">git reset -soft HEAD^</font>
    * ワークディレクトリの内容はそのままにして、直前のコミットを取り消す
    * 何回か前のコミットを取り消したい場合は、HEAD~〇 の〇の部分に取り消したいコミットが何回前かを指定する（git reflogを活用）
<br>
* <font color="Blue">git reset -hard HEAD^</font>
    * 直前のコミットを取り消す。-soft との違いは、こちらはワークディレクトリの内容を書き換えるという点。作業内容が消えるので注意！
<br>
* <font color="Blue">git add <ファイル名></font>
    * ワーキングツリーにあるすべてのファイルやディレクトリのステージング登録をする
    * ファイル名でなく. を指定すると、全てのファイルのステージング登録ができる
    * *ステージング登録の役割…一つのコミットには一つの機能の変更だけを含めるのが原則。ステージング登録することで、複数の機能を一気に変更してしまった場合でも、一つの機能分だけコミットすることができる
* <font color="Blue">git commit -m 'コメント'</font>
    * コミット
<br>

* <font color="Blue">git fetch <リポジトリ> <ブランチ></font>
    * リモートリポジトリの変更をローカルリポジトリに持ってくる（ローカルリポジトリが更新されるだけで、ファイルが変更されたりはしない）
    * origin/master が更新されるイメージ
    <br><br>
 *git の origin/master と master の違い: origin/master はローカル/リモートリポジトリをみている。master はローカルの作業ディレクトリに結びついている。
    * ローカルリポジトリの中にある master はまだ更新されていない。これを更新するのが merge
* <font color="Blue">git merge origin/master</font>
    * リモートリポジトリの更新をローカルのmaster ブランチに反映させる  
* <font color="Blue">git pull <リポジトリ> <ブランチ></font>
    * リモートリポジトリの変更を取得し、ローカルリポジトリに反映させる
    * git fetch と git merge を一気に実行する
    * ローカルリポジトリとリモートリポジトリで別々に変更されているときに使う

##Requirments.txt 関連
* <font color="Blue">pip install -r requirements.txt </font>
    * pipでrequirments.txt に従ってパッケージを一括インストール
    * requirments.txt はコマンドを実行するディレクトリにおいてあることを想定。そうでないときはパスを指定する。
<br>
* <font color="Blue">pip freeze</font>
    * 現在の環境にインストールされたパッケージとそのバージョンが、requirments.txtに使える書式で書き出される。
    * リダイレクトを用いて <font color="Blue">pip freeze > requirments.txt</font> とすることで、requirements.txt を書き出すことができる。

#おわりに
一度使った基本的なコマンドは、使うごとに覚えていきましょう～ 
がんばります
フライトシミュレータのSDKとか必要そうなサイト

#目次
Microsoft Flight Simulator (MSFS2020)
Prepar3D (P3D)

#Microsoft Flight Simulator (MSFS2020)
###オフィシャルサイト
https://www.xbox.com/ja-JP/games/microsoft-flight-simulator
####SDK概要
https://docs.microsoft.com/en-us/previous-versions/microsoft-esp/cc526948(v=msdn.10)
####Event IDs
https://docs.microsoft.com/en-us/previous-versions/microsoft-esp/cc526980(v=msdn.10)
####Simulation Variables
https://docs.microsoft.com/en-us/previous-versions/microsoft-esp/cc526981(v=msdn.10)

####Python
https://pypi.org/project/SimConnect/
####Python git
https://github.com/hankhank10/MSFS2020-cockpit-companion

#Prepar3D (P3D)
###オフィシャルサイト
https://www.prepar3d.com
####SDK概要
http://www.prepar3d.com/SDKv4/LearningCenter.php
####Event IDs
http://www.prepar3d.com/SDKv3/LearningCenter/utilities/variables/event_ids.html
####Simulation Variables
http://www.prepar3d.com/SDKv3/LearningCenter/utilities/variables/simulation_variables.html
Uglifier::Error: Unexpected character '`'　デプロイ時のエラー解消方法

<h1>エラー内容

ターミナルでデプロイを実行したところ、

<strong>Uglifier::Error: Unexpected character '`'　

というエラーが表示され、デプロイが完了しなかった。


<h1>解決方法

config/environments/production.rb内にある以下の記述をコメントアウトする。

```ruby:production.rb
config.assets.js_compressor = :uglifier　
```
config/environments/production.rbファイルとは
参考: https://railsguides.jp/configuring.html

その後、コミット&プッシュで問題は解決しました。


<h1>参考

 https://railsguides.jp/configuring.html
https://qiita.com/mikd/items/e10805343f2d7534d52c
【監視ツールの比較】Grafana vs. New Relic

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/2cd4dba1-fa2c-ae27-7c5d-43afe3027eba.png)

#Grafanaとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/0bb6a181-18c1-8f5a-c920-fcd5b5b24ca9.png)

Grafanaは、1つの統合ダッシュボードですべてのメトリックを表示および分析できる視覚化ツールです。 Grafanaは、GraphiteやPrometheusなどの任意のソースからメトリックをプルし、そのデータを表示して、ダッシュボードでデータに直接注釈を付けて理解することができます。 

- Grafanaダッシュボードは、ヒストグラムやヒートマップから世界地図まで、さまざまな方法で情報を視覚化できるように設計されている
- Grafanaには、Slack、PagerDutyなどを通じて通信できるアラート機能が存在 
- ダッシュボードは、分析を容易にする何百ものプラグインで共有、ダウンロード、または拡張できます。 
- Grafanaはオープンソースであり、マネージドされたGrafanaサービスはMetricfireを通じて利用できます。

[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20New%20Relic)ではGrafanaをすぐに利用開始できる無料トライアルを提供しております。Grafanaダッシュボードの作成をすぐに始めるために、まずは[デモを予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20New%20Relic)してGrafanaの利用が最適かどうかを直接ご確認ください。

#New Relicとは？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c6561163-39b4-e899-9dfe-5496c2bb3dfa.png)


New Relic Oneは、New Relicのプラットフォーム全体の名前です。 

- ログ、メトリック、トレース、およびアプリケーション監視をすべて1か所に統合できます。 
- New Relic Oneはそれ自体を観測可能性ツールとして主張することが可能
- クラウドおよびデータセンターベースのシステムで利用可能
- New Relic Oneはシステムのどこからでもデータを取り込むことができ、システムに接続し続けるためのアラートを提供 
- New Relicはプログラムも可能で、チームはビジネスに最適な新しいアプリケーション監視システムを設計可能
- New Relicには、ページの読み込み時間の短縮とエラーの特定に焦点を当てたブラウザー監視サービスもあり、チームが最も必要な場所に開発者を割り当てることが可能

#いつGrafanaを使用するべきか？

次の場合にGrafanaを使用が適しています。

- 美しくシンプルな注釈付きグラフが欲しい
- メトリックまたはログのソースが複数あり、それらを1か所で確認する必要がある
- ダッシュボードを組織全体で共有する必要がある
- 特定のチームのニーズに基づいて情報を再編成する必要がある
- 使いやすいクエリビルダーが必要である
- イベントのアラートが必要である

#いつNew Relicを使用するべきか

次の場合にNew Relicを使用が適しています。

- ログ、トレース、メトリック、インフラストラクチャ、アプリなどを監視したい。
- 可観測性のダッシュボードを作成したい。
- ブラウザの速度またはモバイルブラウザの速度を監視したい。

#価格比較

- Grafanaはオープンソースであり、無料です。
- GraphiteやPrometheusを元々GrafanaとセットアップされたMetricfireによるビジネス対応のマネージドされたGrafanaは、月額99米ドルからです。
- New Relic for businessは、ホストあたり月額149米ドルから始まり、エンタープライズプライシングステージはそれ以上です。

#重要なポイント

- Grafanaは、さまざまなコレクター、エージェント、ストレージエンジンと統合できます。
- Grafanaはオープンソースであり、無料です。
- New Relicには、1つのプラットフォームで組み立てて観測可能ダッシュボードを作成できるさまざまな製品があります。

マネージドされたMetricFireのHosted Grafanaなら、セットアップやメンテナスが不要となります。あなたのモニタリング環境にどのようにGrafanaが適合するかをMetricfireのサポートチームと是非確認してください！ [デモの予約](https://www.metricfire.com/demo/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Grafana%20vs.%20New%20Relic)はこちらからになります。

それでは、またの記事で！
訓練データとテストデータ（X_train, y_train, X_test, y_test）①

今回は教師あり学習における
訓練データとテストデータについて説明します。

## ■ 訓練データとテストデータ

訓練データ：モデル式（データの関連性を表す式）を作るデータ
テストデータ：作成した式がどのくらい正確性のあるものかを確認するデータ

自分がデータの関連性を式で表せたとしても、それを試すデータがなかったら困りますよね。

では、簡単な具体例を挙げて説明していきます。

例えば、下記のようなデータがあるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/a6e1cd3f-400f-29e8-2862-1fc8c5eaeb2a.png)
ここで、この表のデータを下記のように分割します。<br>

訓練データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/285a7ad7-efd1-15e7-6a13-c850f4cc37e3.png)
テストデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/4c3e7507-d620-0941-6840-687a022544a6.png)
このとき、まずデータの関連性を見つけたいので
訓練データから y と x の式（モデル式）の候補を考えます。

候補1：$y=3x$
候補2：$y=2x+1$

訓練データを用いてモデル式を作成しました。
ただこれだけでは、本当にこの式が成り立つのかは分かりません。
そのために、検証用としてテストデータがあるのです。

作成したモデル式に対して、下記のデータでも成り立つか確認をします。
確かめる方法は、モデル式にテストデータの x を代入して、本当に y となるかどうかです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/4c3e7507-d620-0941-6840-687a022544a6.png)
候補1：$y=3x=3\\times3=9$
候補2：$y=2x+1=2\times3+1=7$
正解：$y=7$

このことから、今回用意したデータに関しては
候補1ではなく候補2の方が正確性が高いことが分かりました。

このように、機械学習では訓練データからデータの関連性を見つけ出し（モデル式の作成）
テストデータにて実際に正確であるかどうかをチェックする仕組みを取っています。

## ■ X_train, y_train を当てはめる

では、X_train, y_train, X_test, y_test とはいったい何なのでしょうか？

train：訓練データ（トレーニングの略）
test：テストデータ（モデル式を検証するデータ）

今回用意したデータに当てはめるとこのようになります。

訓練データ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/0c1c8747-4160-29a5-f646-f53116193126.png)
テストデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/76564c90-3b1d-3bc6-7ed8-43ab1b9c6df1.png)
先ほどと同じように、訓練データからモデル式を考えます。

候補1：$y=3x$
候補2：$y=2x+1$

これでモデル式が完成しました。
あとは、これらがどのくらいの正確性を示すのかを、テストデータを用いて検証します。

先ほどは、モデル式にテストデータの x を代入して、予測値 y を出し
実際の y と一致するかといったように検証をしました。

このときの予測値を y_pred と表記します。（predict：予測する）

テストデータ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/725082/76564c90-3b1d-3bc6-7ed8-43ab1b9c6df1.png)
候補1：$y_{pred}=3x_{test}=3\\times3=9$
候補2：$y_{pred}=2x_{test}+1=2\times3+1=7$
正解：$y_{test}=7$

よって、今回作成したモデル式では
候補2の方が正確性が高いということが分かりました。

つまり、まとめると下記になります。

X_train, y_train：モデル式（データの関連性の式）を作るためのデータ
X_test：モデル式に代入をして、自分の回答 y_pred を出すためのデータ
y_test：本当の正解データ（数学の模範解答と同じ）、自分で出した y_pred と答え合わせするためのもの

y_test のみが模範解答として扱われるのは、少し分かりづらいですよね。

教師あり学習（テストデータあり）では、基本的にこの考え方をもとに
様々なモデル式の作成・検証を行っています。
30TB以上のbtrfs領域をマウントする際のオプション

30TB以上のbtrfs領域をマウントする際、「-o space_cache=v2」オプション付きでファイルシステムをマウントした方が良いらしいです。

キャッシュ機能の変更があり、ボトルネックが解消されたとの事。※ただし開発途中

約100TBの領域で試してみたけれど、ベンチマーク上は特に変化なく。。。
なんとなIOが下がった気はします。
AWS SAA合格体験記

AWSの合格体験記
　たくさんありますよね。
何番煎じかわかりませんが、
　これから受ける人の役に立てれば
　　いいと思っています。

---

## AWS SAAとは
- AWS Solutions Architect -Associateの略
- 主にAWSを**構築**する人向け
- 運用者向けはSysOpsAdministrator
- 開発者向けはDeveloper

---
こんな感じのすみ分け
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178136/6ec1c583-2ff7-2b33-0905-e9fb96e8649f.png)

---

## なぜSAAを取ろうと思った
- AWSの知識をちゃんと身に着けたい
- EC2やS3,VPCといった基本的なサービスを学ぶので、範囲も広く体系的に学べそう
- 内外的にAWSを知っている人という保証が欲しかった

---

## 勉強期間
- 3ヶ月強ぐらい（結構長い）
- 平日の毎朝毎晩と土曜日（日曜日は休みたかった）

## 勉強方法
次のudemyの教材を中心に勉強
書籍は参考書として活用

---

## 使った教材
### udemy
- これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座（SAA-C02試験対応版）
- 【SAA-C02版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）

問題に関しては３回ぐらい解いて90%ぐらいまで正答率を上げた

### 書籍
- [AWS認定資格試験テキスト AWS認定 ソリューションアーキテクト-アソシエイト](https://www.amazon.co.jp/AWS%E8%AA%8D%E5%AE%9A%E8%B3%87%E6%A0%BC%E8%A9%A6%E9%A8%93%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-AWS%E8%AA%8D%E5%AE%9A-%E3%82%BD%E3%83%AA%E3%83%A5%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%88-%E3%82%A2%E3%82%BD%E3%82%B7%E3%82%A8%E3%82%A4%E3%83%88-NRI%E3%83%8D%E3%83%83%E3%83%88%E3%82%B3%E3%83%A0%E6%A0%AA%E5%BC%8F%E4%BC%9A%E7%A4%BE/dp/479739739X/ref=pd_bxgy_img_2/358-4839130-6198730?_encoding=UTF8&pd_rd_i=479739739X&pd_rd_r=d74f8e1a-11a3-4de8-a4ff-61b43b683bd0&pd_rd_w=jWJMr&pd_rd_wg=dEu6D&pf_rd_p=e64b0a81-ca1b-4802-bd2c-a4b65bccc76e&pf_rd_r=3J54XX997K1S8RHZWQPB&psc=1&refRID=3J54XX997K1S8RHZWQPB)

※2018年に試験がupdateしているので古すぎるものは注意

---
## 感想（勉強）
- AWSの知識はもちろんインフラそのものの知識がなかったのでそこから学べた
- udemyのハンズオンを行ったので実際の経験としても身についた（NATゲートウェイを削除し忘れて高額な請求が来たことも思い出）
- とって終わりではなく、活かしていかないともったいない（本当にそう）

---
## 感想（試験）
- 個々のサービスは分かっていてもまず、問題文で何を求められているか理解するのに時間がかかった
- udemyの問題集ほど細かいところは聞かれなかった印象
- 受験料15,000円はちょっと高い
【DOSバッチ】年月日フォルダ作成とデーターバックアップ



# 年月日フォルダ作成

このバッチファイルと同じ位置に

YYYYMMDD_HHMI_

のフォルダを作成します

```bat:日付フォルダ作成.bat

@echo off

rem 年月日取得

rem 年
set sYear=%DATE:~0,4%

rem 月(ゼロ埋め対応)
set sMonth=0%DATE:~5,2%
set sMonth=%sMonth:~-2,2%

rem 日(ゼロ埋め対応)
set sDate=%DATE:~8,2%


rem 時間の取得（０時～９時までのゼロ埋め対応）
set sNowTIME=%TIME: =0%


rem 時(ゼロ埋め対応)
set sHour=%sNowTIME:~0,2%

rem 分(ゼロ埋め対応)
set sMinute=%sNowTIME:~3,2%

rem =====================================================
rem 年月日(YYYYMMDD)
set sYYYYMMDD=%sYear%%sMonth%%sDate%

rem 年月日(YYYY-MM-DD)
set sYYYY-MM-DD=%sYear%-%sMonth%-%sDate%

rem 年月(YYYYMM)
set sYYYYMM=%sYear%%sMonth%

rem 年月日(YYYY年MM月DD日)
set sYYYY_MM_DD=%sYear%年%sMonth%月%sDate%日

rem 年月(YYYY年MM月)
set sYYYY_MM=%sYear%年%sMonth%月

rem 時間
set sHHMISS=%sHour%%sMinute%

rem 年月日時間
set sYYYYMMDD_HHMISS=%sYYYYMMDD%_%sHHMISS%
rem =======================================================

rem フォルダ作成
mkdir %sYYYYMMDD_HHMISS%_

rem =====================================================


```

# バックアップ


このバッチファイルと同じ位置に
バックアップ用のフォルダを作成し
LOGファイルのみを移動させます。

時間の場合は時間が１０時前の場合に位置ずれ
が生じるため最初のスペースをゼロに変換しています

```bat
rem 時間の取得（０時～９時までのゼロ埋め対応）
set sNowTIME=%TIME: =0%
```


```bat:バックアップ.bat

@echo off

rem echo 01)フォルダ設定
rem ===============================================================
rem       フォルダ設定
rem ===============================================================

rem バックアップフォルダ名
set sBakUpNAME=bak

rem バックアップフォルダ元
set sBakUpDIR=.\%sBakUpNAME%\

rem 移動ファイル
set sMoveFile=./*.log

rem echo 02)日付設定

rem ===============================================================
rem       日付設定
rem ===============================================================


rem 年月日取得
rem 年
set sYear=%DATE:~0,4%

rem 月
set sMonth=%DATE:~5,2%

rem 日(ゼロ埋め対応)
set sDate=%DATE:~8,2%


rem 時間の取得（０時～９時までのゼロ埋め対応）
set sNowTIME=%TIME: =0%


rem 時(ゼロ埋め対応)
set sHour=%sNowTIME:~0,2%

rem 分(ゼロ埋め対応)
set sMinute=%sNowTIME:~3,2%

rem 日付フォルダ名
set sYYYYMMMDDHHMM_DIR=%sYear%-%sMonth%-%sDate%_%sHour%%sMinute%

rem echo 03)ファイル移動
rem ===============================================================
rem       ファイル移動
rem ===============================================================

rem バックアップ用フォルダ作成(存在するときは無視)
IF NOT EXIST %sBakUpNAME% (
	mkdir %sBakUpNAME%
)


rem フォルダ作成
mkdir %sBakUpDIR%%sYYYYMMMDDHHMM_DIR%

rem 移動
move %sMoveFile% %sBakUpDIR%%sYYYYMMMDDHHMM_DIR%\

echo バックアップをしました


Timeout 5

```
AWS QuickSight ～ demo

#2つのCSVファイルをjoinする#

エディションは「Enterprise」を利用してください。
![tempsnip1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/903b8422-08a6-ce99-7b06-b0afc155dc8d.png)

必要項目を入力します。”Enable autodiscovery of…”にチェックすることを忘れない。
![tempsnip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/89db2b74-aeb8-2d8c-05ce-e8b44abb64e6.png)

「ファイルのアップロード」から、CSVファイルをSPICE領域にアップロードする。
![tempsnip3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/572412ce-835e-055b-2da3-0f72cf14865b.png)

特定の列を基準にJOINするため、「データを追加」よりもう一つのcsvファイルをアップロードする。
![tempsnip4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/5e783424-d12a-3614-f3b9-0100471c6fe5.png)

2つの円のようなアイコンを選択し、JOINする列を指定し、結合タイプはInnerを指定する。
※InnerはONで指定した条件が、結合する両方のテーブルにマッチするレコードのみを返します。
![tempsnip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/6ec64e0f-e225-c7c2-5035-3a6290b13c0d.png)

これで2つのCSVファイルが、結合されました。


#データタイプを変更する#

自動的にInt（整数）型で認識されているものを、String型（文字列）に変更する。
![tempsnip6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7baaaa12-99ba-8728-01c1-0a8e651681c3.png)


#視覚化#

「保存して視覚化」後、SPICEに取り込んだデータを可視化していきます。
左からフィールドをDrag & Dropすることでそのフィールドのデータをもとに可視化が行われます。
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/963a0d48-aed8-8476-12fd-dfdbea53b7cb.png)


#ML（機械学習）インサイトの機能#

与えられたデータから予測値をだすことができます。「予測を追加」から行えます。
![tempsnip8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/2101ed2d-f861-c61f-03d6-c45f72961fe5.png)

結果は次のとおり。
![キャプチャ9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/9b2569be-1f40-5911-f7e2-481dd3f30814.png)


#ドリルダウン#

X軸に3つの項目(A B C)、Y軸に１つの合計の値があったとします。
「ドリルダウン」を利用すると、AのBの値というように視覚化することが可能になります。
![スクリーンショット 2020-09-12 17.38.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/c2f435aa-5ae4-b436-ea19-4e19e02d6580.png)


#コントロールとフィルタ#

フィルタするためのコントロールを作成し、その作成したコントロールでフィルタを作成していきます。
例えば●月●日〜●月●日までの合計や平均とか。

「パラメータ」は次の通り作成していく。
![スクリーンショット 2020-09-12 17.52.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/42945dca-2a91-d44d-fe81-b7b72bdae674.png)

作成すると、続いてパラメータの接続先を選択するダイアログが出るので、「コントロール」を選択します。
![スクリーンショット 2020-09-12 17.57.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/811a8372-c017-6f11-6077-eef768e8b042.png)

次の通り開始日のコントロールを追加。
![スクリーンショット 2020-09-12 17.58.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/7721d5c6-d54c-0a41-479c-ae25fb7b1c6e.png)

同じ要領で終了日のコントロールも追加。
![スクリーンショット 2020-09-12 18.04.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/093e28cd-0051-28a6-850d-d23dec38b1b5.png)

これで開始日と終了日のコントロールが作成できたので、「フイルタ」を次の条件で作成していく。
![スクリーンショット 2020-09-12 18.08.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280929/a7af1f2d-25f4-3ee6-a35b-8cebec2136f9.png)

後は好きにフイルタの日付を変更して、グラフが変わるか確認して見るだけ。
ウェブコンテンツを効率的に高速で配信できるネットワークのCDNについて

#プログラミング勉強日記
2020年9月18日
Next.jsについて調べているときにCDNという言葉を見かけたので、調べてみた。

#CDNとは
　CDNはContent Delivery Networkの頭文字をとったもの。タイトルにもあるようにウェブコンテンツを効率的に高速に配信できるように工夫されたネットワークのこと。簡単にいうと、サイトの負荷を肩代わりしてくれるレンタルサーバーのようなもので、アクセスが集中したりコンテンツが大容量化したりしても、ホームページの表示やコンテンツの配信に影響が及ぼさないことができる。
　
　CDNではオリジナルのウェブコンテンツが存在するサーバーを<b>オリジンサーバー</b>という。
　CDNを使用しない場合はウェブコンテンツは保存されているサーバーに直接アクセスしてダウンロードすることになる。
![0917.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/b65a1033-ed50-c06a-2bbd-1bce40dc3d93.png)

　CDNではウェブコンテンツを配信するのはオリジンサーバーだけでなく、オリジンサーバーからウェブコンテンツのコピーを取得した複数の<b>キャッシュサーバー</b>が、オリジンサーバーの代理でウェブコンテンツを配信する。オリジンサーバーの負荷を分担することで効率的なウェブコンテンツを配信することができる。
![0917-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/642821/8a19debb-0401-c445-35d7-fdc48153bee0.png)

　※このキャッシュサーバーは世界中に配置されている。オリジンサーバーと比べてネットワーク的に距離が近いキャッシュサーバーにアクセスできるので、ウェブコンテンツ配信を高速にできる。

#クラウドサービスのCDN
　CDNはクラウドサービスでも使うことができる。クラウドサービスは、クラウドプラットフォームからインターネット経由でコンピューティング、データベース、ストレージ、アプリケーションをはじめとした様々なITリソースを使用できる仕組みのこと。
　CDNはAWSではAmazon CloudFrontというサービス名で提供されている。

#参考文献
[【CDNとは?】初心者にもわかりやすく解説](https://www.wafcharm.com/blog/cdn-for-beginners/)
[CDNってそもそも何？なんかサーバの負荷が下がるって聞いたんだけど！〜Web制作/運営の幅が広がるCDNを知ろう第1回〜](https://knowledge.sakura.ad.jp/19191/)
[【図解】CDNとは？仕組みと技術の基礎知識](https://www.kagoya.jp/howto/network/cdn/)
UiPath　年度の値を取得する方法

業務で使用するフォルダが年度ごとで分かれていることがあるので、ファイルパスの年度のところを変数にして使用しています。そのためString型で取得しています。
以下の方法では、2019年度　や　19年度　といった値を取得します。
※年度が4月～3月の場合

UiPathで年度を文字列で求めたい時の例


Invoke code（コードを呼び出し）アクティビティへ以下コードをコピペ

```
Dim nendo	As String
Dim nendo2 	As String

nendo = DateAdd("m", -3, Now).ToString("yyyy")
nendo2 = Mid(nendo,3,2)
fy_name = nendo2　&　"年度" 
```

```
出力結果；yy年度　　※nendo2変数をなくせばyyyy年度にもできます
```



Invoke codeの引数設定は以下のようにします。

|名前|方向|型|値|
|:-----------|------------:|:------------:|:------------:|
|fy_name|出力|String|FY|


変数設定は以下のようにします。

|名前 |型|スコープ|規定値|
|:-----------|------------:|------------:|------------:|
| FY| string|環境にあわせる|ブランク|


※普段はこのコード内に前月、翌月などの値を取得するコードも記述させて使用しています。
以前までは代入アクティビティを何個も使って年度の値、前月の値、翌月の値を取得していてかなり見づらかったですが、これならアクティビティ1個だけで行えるので見た目がすっきるすると思います。
OracleからAzure DB（PostgreSQL）へ移行する~⑦文字コード/ロケール

今回はPostgreSQLの文字コードとロケールに関して記載します。

#文字コード
PostgreSQLでは日本語をサポートしている以下の文字コードが利用可能なので、参考にいただければと思います。
ちなみに、サーバ、クライアント共に、設定することが可能なのですが、文字コードが異なる場合、変換が暗黙的に行われるためパフォーマンスに影響するといわれています。サーバと、クライアントの文字コードは合わせることが推奨となります。

|文字コード名|内容|
|:--|:--|
|EUC_JP|日本語拡張Unixコード|
|EUC_JIS_2004|日本語拡張Unixコードの一種|
|SJIS|Shift JISコード。主にWindows系OSで使用される文字コード。|
|SHIFT_JIS_2004|Shift JISコードの一種|
|UTF-8|UTF8 Unicodeで定義された文字列を表現するコード|


#ロケール
ロケールとは地域（国）によって異なる表記や比較規則の設定を行う設定値です。具体的には、単位、記号、日付、通貨などに適用される規則となります。

##ロケール設定のメリット
ロケールを設定するメリットを以下に記します。

* 文字列関数で半角英数字と全角英数字を等価に扱えるようになる。（厳密に区別したい場合は適さない）
* 文字列に対してORDER BYを指定した場合、バイトコード順ではなくロケール辞書による並び替えを行える。
* 通貨型を参照した場合、ロケールに従った通貨記号が付与される。

##ロケール設定のデメリット
ロケール設定するとメリットだけではなく、デメリットも存在します。ロケール設定のデメリットに関して記載します。

* 並び替え、インデックス作成処理にてロケール処理によるオーバーヘッドが発生。
* 前方一致検索（LIKE ‘条件%’)でインデックスが利用されなくなる。
* OSのロケールに依存するため、OSのバージョンやライブラリバージョンが異なると挙動がかわる。
* ロケールを指定することで指定できる文字コードが固定される可能性がある。（UTF-8以外の文字コードでロケールを利用することは推奨されない）

##ロケールの設定をどうしたらいいのか？
Oracle DatabaseからAzure for PostgreSQLの移行を考えたときに、ロケールの設定に関してあまりメリットを感じることが出来なかったため、__ロケールは設定しない（locale=C）事が望ましい__と考えます。

#最後に
文字コードとロケールに関して記載しましたが、ご参考にいただければと思います。

##次回は
OracleからPostgreSQLの機能的な違いに関して紹介していきたいと思います。機能的な違いを把握することは、OarcleからAzure Database for PostgreSQLへの移行を考えるうえで重要な事のように思います。
TypeScript: メソッドが上書きできてしまう仕様を回避する小技

この投稿では、TypeScriptでclass構文で定義したメソッドを`readonly`にする小技を紹介します。

## 実はTypeScriptのメソッドはミュータブルなプロパティ

TypeScriptでもJavaScript同様のclass構文でクラスを定義することができます:

```ts
class Person {
}
```

TypeScriptはJSを拡張していて、フィールドには`readonly`修飾子をつけることができます。これは、フィールドに値を再代入(=上書き)させないようにすることができます。

```ts
class Person {
  readonly name: string
  
  constructor(name: string) {
    this.name = name
  }
}

const person = new Person('山田')
person.name = '佐藤' // 再代入しようとする
// エラー: Cannot assign to 'name' because it is a read-only property.(2540)
```

この例では、`name`フィールドが`readonly`なので、これに新しい値の「佐藤」を再代入するコードがコンパイルエラーになっています。

一方、メソッドは次のようにして生やすことができるのですが、メソッドには`readonly`修飾子をつけることができません:

```ts
class Person {
  getName() {
    return this.name
  }
}
```

メソッドを再代入することは一般的に考えにくいですよね。であれば、きっとTypeScript的にはメソッドは常に`readonly`扱いのはずです……。

と思っていましたが、実は**メソッドはもろにミュータブル(再代入可)**なのです！

このコードを見てください:

```ts
class Person {
    constructor(private readonly name: string) {}
    getName(): string {
        return this.name
    }
}

const person = new Person('山田')

console.log(person.getName())
//=> 山田

// ↓ メソッドを再代入するコード
person.getName = () => '佐藤' // コンパイル通る！

console.log(person.getName())
//=> 佐藤
```

このコードは`Person`の`getName`メソッドを置き換えていますが、コンパイルエラーになることはありません。


調べてみると、TypeScriptのイシューに「[メソッドにもreadonlyがほしい](https://github.com/Microsoft/TypeScript/issues/22315)」という要望は上がっているようですが、今のところ対応される様子はありません。

## メソッドを`readonly`にする小技

メソッドを`readonly`にする方法としては、ファクトリメソッドを作る方法があります。

まず、クラスを直接`new`されると、メソッドを守りようがないので、コンストラクタはprivateにします。

その上で、インスタンスを作るためのメソッド(=ファクトリメソッド)を定義します。そして、ファクトリメソッドの戻り値の型をユーティリティ型`Readonly<T>`にして、返されるインスタンスをイミュータブルな型にします。

先ほどの`Person`クラスでこれを実践すると次のようなコードになります:

```ts
class Person {
    // コンストラクタを直接呼べないようにする
    private constructor(private readonly name: string) {}

    // ファクトリメソッド
    static readonly new = (name: string): Readonly<Person> => new Person(name)

    getName(): string {
        return this.name
    }
}
```

こうすることで、メソッドの再代入がコンパイル時に不可能なクラスを作ることができます:

![20200918092346@2x.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/889/23966eec-a8ef-4713-629a-2acfa88efc27.png)


---

最後までお読みくださりありがとうございました。Twitterでは、Qiitaに書かない技術ネタなどもツイートしているので、よかったらフォローお願いします:relieved:→[Twitter@suin](https://twitter.com/suin)
【Flutter】 unixtimeから見やすいフォーマットに変換する

unixtimeからxxxx年xx月xx日みたいな感じで見やすみ形に変換する処理を残しておきます。

```dart
  String convertTime(int t) {
     //int型からDateTime型に変換
    DateTime date = DateTime.fromMicrosecondsSinceEpoch(t);
    String time = DateFormat("yyyy年MM月dd日").format(date).toString();
    return time; //例 2020年08月14日
  }
```

y(年）、M（月）、d(日）を使えば好きなフォーマットにすることができます。
完全未経験からのIT業界への転職

初めまして。

以前は親の仕事(施工建築関係)を手伝っていましたが、幼いころからパソコンをいじることが好きで(いじると言っても内部の物やサーバーなどではない)次働くならなんとなくIT業界が良いなあという感覚で生きていました。

そんなときひょんなことから上京することが決まり、去年の7月くらいから東京で生活しています。

こっちに来た時に、知り合いの紹介でSES事業と言われ入った企業では、週5日フルタイムで仕事、週に1度の研修があるといったものでした。

ちなみに仕事内容は、携帯販売会社の中で回線の営業をすることでした。その頃は、ITと言えばプログラミング!みたいな感覚でしたので研修では皆でHTMLとCSSを講師の人と学んでいましたが、Twitterなどで調べていくと、詳細は省きますが、このままじゃあんまり意味ないぞ・・・ってなってきまして、半年ほどでやめて、そこからまずは土台が必要だと思いコロナ禍による緊急事態宣言もあり家でひたすらITパスポートの勉強し1発取得、今現在はLpic level1を目標に毎日最低3時間の勉強を取り入れてます。

これから、学習記録や思ったことをたまに記事にしようと思いますので、よろしくお願いします。
【javascript】配列内の要素を指定INDEXの前（後）に移動

紆余曲折を経てこの形に落ち着きそう。

（追記）delete演算子を使うのはよろしくなかったかな？

#引数解説

||変数|型|説明|
|:--:|:--:|:--:|:--|
|1|arr|Array|処理対象の配列|
|2|idx|Number|移動する要素のINDEX|
|3|mIdx|Number|移動先のINDEX|
|4|after|Boolean|true : mIdxの後方に挿入<br>false / 省略 : 前方に挿入|



#コード

```javascript

const moveElement = (arr, idx, mIdx, after=false) => {
	//事前処理は省略
	arr = [...arr];
	if (after) mIdx++;
	
	const elm = arr[idx];
	delete arr[idx];
	
	arr.splice(mIdx, 0, elm);
	return Object.values(arr);
};

//連番生成
const array = [...Array(10).keys()];

moveElement(array, 2, 8, true);		// [0, 1, 3, 4, 5, 6, 7, 8, 2, 9]
moveElement(array, 8, 2);			// [0, 1, 8, 2, 3, 4, 5, 6, 7, 9]

```

#やっている事（追記）

1. 移動する要素を取得
2. 取得した要素の位置を`delete`でempty状態にする
3. 配列の長さは変わらないので指定INDEXの前後へ`splice`で挿入
4. `Object.values()`でempty状態の要素はスルーして配列を再構成

falsyな要素が消えても構わない場合は、`delete`する代わりに`空文字`を代入。
`Object.values()`ではなく`filter(Boolean)`でreturnするのもありでしょう。
Puppeteerの`waitFor`は`waitForTimeout`に書き換えた方がよいみたい（v5.3.0）

# 概要

警告が出たので調査

```
waitFor is deprecated and will be removed in a future release. See https://github.com/puppeteer/puppeteer/issues/6214 for details and how to migrate your code.
```

# 結論

* Puppeteerのバージョンはv5.3.0
* 警告に表示されたリンクを見ただけ: https://github.com/puppeteer/puppeteer/issues/6214
* 単純に `waitFor` を `waitForTimeout` に置き換えれば良さそう

```diff
-  await page.waitFor(5000)
+  await page.waitForTimeout(5000)
```  

## 補足

TypeScriptを利用している場合は `@types/puppeteer` も最新にすること。

# 参考

詳しく書いてあるので詳細はGitHubのページを参照してください

* https://github.com/puppeteer/puppeteer/issues/6214
* https://github.com/puppeteer/puppeteer/releases/tag/v5.3.0
* https://github.com/puppeteer/puppeteer/pull/6268
【メモ】vue-routerを使ったアプリで画面が真っ白になる

# 問題

vue.jsの画面が真っ白になって表示されない。

# 前提

1. vue-routerを使っている。
2. サブディレクトリにデプロイしている


# TL;DR

vue-routerにbaseプロパティでサブディレクトリ(ベースURL)を教える必要がある。

もう少し詳しく説明すると<code>/var/www/html/subdir</code>にデプロイすることで、URLが<code>https://www.example.com/subdir/</code>がアプリケーションのトップとなる場合に、ベースURLとして、<code>/subdir/</code><b>(前後のスラッシュ必須)</b>をvue-routerに教える必要がある。

以下のように初期化処理で<code>base</code>プロパティで教えてあげる。

https://router.vuejs.org/ja/api/#mode

```javascript
import Vue from 'vue'
import Router from 'vue-router'

Vue.use(Router)

const routes = [
  {
    path: '/',
    component: xxxxxx,
    children: [
      {
        path: '',
        name: 'top',
        component: () => import(xxxxxxx)
      },
      {
        path: '/login',
        name: 'login',
        component: () => import(xxxxxxx)
      },
    ]
  }
]

export default new Router({
  mode: 'history',
  base: '/subdir/', <-これ
  routes
})
```

今回は、どこに設置するかわからなかったので、<code>base</code>プロパティを環境変数で設定するようにした。

例えば、<code>base</code>が以下のような場合は、ベースURLの判定ができずに、ルーティングできずに画面が真っ白になる。

* /subdir  ：最後のスラッシュがない
* //　：　スラッシュが２個ある。
* https://example.com/subdir/ : URLになっている

環境変数で適当に設定するようにしちゃったので、書き方が統一されなくて画面が真っ白になっていました。


一度、設定すれば問題ないので、忘れちゃいます。
自戒をこめて記載しました。
[AWS] マネジメントコンソールのLambdaの管理画面からStep Functionsのワークフローを確認できるようになりました

# Launch

9/17に、「[AWS Lambda adds console support for visualizing AWS Step Functions workflows](https://aws.amazon.com/jp/about-aws/whats-new/2020/09/aws-lambda-adds-console-support-for-visualizing-aws-step-functions-workflows/)」ということで、LambdaのコンソールでStep Functionsのワークフローのビジュアライズ機能がLaunchされました。

# Lambdaの管理画面
メニュー蘭に「Step Functions state machines」の項目があります。
![lambda1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/08dda447-242d-4b7e-5e4c-a3765c776119.png)

Step Functions state machinesのメニューを選択すると、上部にStep Functionsの使い所のようなものが説明されていて、その下にState machineの一覧があります。
今回は、「[[AWS] Step Functionsで遊んでみる（SAM + Lambda） Part.3（分岐編）](https://qiita.com/herohit-tool/items/440a57769f043110648b)」のものをDeoloyしてあります。
![lambda2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/1a7f682c-480f-1279-3731-865c740c27a6.png)

State machineのリンクを選択すると、そのステートマシンのいつものグラフが表示されます。
![lambda.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/9bc63f32-10ff-ec84-cc68-d3143ec04cd3.png)

そして、その下に、ステートマシンから呼び出しているLambdaが一覧表示されます。
今回はシンプルな例なので1つしかないですが、このステートマシンで使用しているLambdaと、どのStepで使用しているかが一目でわかるようになりました。
![lambda4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/427998/28ecab31-9f24-0e4e-efd8-638e62d8ae7a.png)

# まとめ
これまで、Step Functionsの管理画面から、ARNを確認しながら追う必要がありましたが、その必要がなくなりました。
ステートマシンで複数のLambda関数を呼び出しているケースでは、Lambda間の相関がわかりやすくなったのではないでしょうか。
Pythonによる画像処理100本ノック#3 二値化

## はじめに
どうも、らむです。
これまた画像処理ではお馴染みの二値化を実装します。

## 3本目：二値化
二値化は画像を白黒の2色のみのモノクロ画像に変換する処理です。
通常グレースケール画像に対し行います。
また、二値化の際に閾値と呼ばれる基準の値を決めます。閾値未満の画素値は白、閾値以上の画素値を持つ画素は黒に置き換えます。

```binarization.py
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.gray()


def binarization(img):
  # 画像コピー
  dst = img.copy()
  # グレースケール化
  gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)

  # 閾値
  th = 128
  # 二値化
  idx = np.where(gray < th)
  gray[idx] = 0
  idx = np.where(gray >= th)
  gray[idx] = 255

  return gray


# 画像読込
img = cv2.imread('../assets/imori.jpg')

# 二値化
mono = binarization(img)

# 画像保存
cv2.imwrite('result.jpg', mono)
# 画像表示
plt.imshow(mono)
plt.show()
```

<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/6e6ca74e-7b7c-a641-553c-7280c2f12d1d.jpeg">　<img width="300" alt="ファイル名" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519081/dfb9b39c-d832-0a7e-63d1-e5f21195295a.jpeg">

画像左は入力画像、画像右は出力画像です。
グレースケール画像のように灰色が無く白と黒のみの画像になっています。

## おわりに
もし、質問がある方がいらっしゃれば気軽にどうぞ。
imori_imoriさんの[Github](https://github.com/yoyoyo-yo/Gasyori100knock/blob/master/Question_01_10/answers_py/answer_2.py)に公式の解答が載っているので是非そちらも確認してみてください。
EBCLIのインストール

EBCLIのインストールについて[公式ドキュメント](https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/eb-cli3.html)を簡単にまとめる

# EB CLIとは
 - AWS Elastic Beanstalkのコマンドラインインターフェイス
 - ローカルリポジトリからの環境の作成、更新、およびモニタリングを簡素化

# EB CLIのインストール
## セットアップスクリプトの利用(推奨)
GitHubで入手できる[セットアップスクリプト](https://github.com/aws/aws-elastic-beanstalk-cli)を使用する
このスクリプトは、Pythonとpipを含めて、EB CLIおよびその依存関係をインストールする
このスクリプトは、EB CLI用の仮想環境を作成する
インストール手順は[GitHub](https://github.com/aws/aws-elastic-beanstalk-cli-setup)を参照
### GitHubからのインストール
#### 前提条件
Gitがインストールされている
Pythonでは、オペレーティングシステムごとの条件を満たす必要がある

#### インストール
リポジトリをクローン

```bash
git clone https://github.com/aws/aws-elastic-beanstalk-cli-setup.git
```

## 手動インストール
ここではmacOSのインストール(homebrew)
1. Homebrewが最新バージョンであることを確認

```bash
brew update
```

２. `brew install awsebcli`を実行

```bash
brew install awsebcli
```

３. EB CLIが正しくインストールされたことを確認

```bash
eb —version
```
このとき、`SyntaxWarning`が出る場合以下を実行すれば解消される

```bash
pip uninstall jmespath && pip3 install jmespath
```
Flutter プラグインの中で CoreData のモデル (.xcdatamodeld) を読み込む

実際のところ Flutter プラグイン固有の Tips ではなく、 Pods や Framework の中から .xcdatamodeld をロードする方法の Tips ですが、iOSネイティブ開発慣れしていないと、とても分かりにくいと思ったのでメモとして残しておきます。

# 問題
Core Data の使い方ガイドでは、以下のようなコードでサクッと MyModel.xcdatamodeld を読み込む方法が紹介されていますが、Flutter プラグインの中に .xcdatamodeld ファイルをもたせた場合、このコードを書いても読み込めません（ちなみに、この段階ではエラーにならず、エンティティ生成時にクラッシュします）。

```:Objective-C
_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"MyModel"];
```

# 原因
問題は2点です。

1. Flutter プラグインは、Flutter アプリ本体とは別のフレームワークとしてビルドされますが、Flutter プラグインの初期設定では、.xcdatamodeldがバンドルされません。
2. フレームワークにうまく MyModel.xcdatamodeld をバンドルした場合でも、モデル名だけではリソースを読み込めません。フレームワーク内のリソースには、そのリソースを指すパスでアクセスする必要があります。

# 対策
まず、.xcdatamodeld がフレームワークにバンドルされるようにします。
次のスクリーンショットは plugin_example という名前の Flutter プラグインのフォルダ構造です。
ios/Resources フォルダを作り、そこに MyModel.xcdatamodeld ファイルを置きます。

![Screen Shot 2020-09-18 at 6.48.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43781/2dce853e-98fe-b118-a47d-05bf4fdbcb30.png)

そして、podspec に次の行を追加します。

```:.podspec
  s.resources = 'Resources/MyModel.xcdatamodeld'
```

次に、モデル読み込みのコードを以下のとおり書き換えます。

```:Objective-C
NSURL *modelURL = [[NSBundle bundleForClass:self.class] URLForResource:@"MyModel" withExtension:@"momd"];
NSManagedObjectModel *model = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"MyModel" managedObjectModel:model];
```

self.class の self は Flutter プラグインに所属しているクラスのインスタンスを与えます。Flutterプラグインの初期化コードあたりに書けば良いと思います。

拡張子を momd に指定しているのは、MyModel.xcdatamodeld ファイルはビルドされ、 実際には MyModel.xcdatamodel.momd という名称でバンドルに保存されるためです。
ワークシートでショートカット割当設定【Excel VBA】


## 使い方

* 「設定」というシートを用意し、下記のようなリストを用意する

| キー1   | キー2   | キー3   | 動作           |
|---------------|------|---------|----------------|
| Ctrl   | E       |        | 例1       |
| Ctrl   |Shift    |E     | 例2       |

* F5やTABなどは{}で囲み、 →や←なども{RIGHT}、{LEFT}などとする（置換リスト作るのが面倒なので）<br>
参考：[Onkeyメソッド コードリスト](https://docs.microsoft.com/ja-jp/office/vba/api/excel.application.onkey)

## コード
### 標準モジュール

``` vb
Sub ショートカットキーの割り当て()
        Dim キー As String
        Dim i As Integer
        
    i = 4
    Do While Sheets("設定").Cells(i, 4) <> ""
        With Sheets("設定")
            キー = .Cells(i, 1).Value & .Cells(i, 2).Value & .Cells(i, 3).Value
            キー = Replace(キー, "Ctrl", "^")
            キー = Replace(キー, "Alt", "%")
            キー = Replace(キー, "Shift", "+")
            キー = Replace(キー, "Enter", "~")
            Application.OnKey キー, .Cells(i, 4).Value
            キー一覧 = キー一覧 & キー & ","
        End With
        i = i + 1
    Loop
    
    SaveSetting "MyMacro", "設定", "ショートカット登録分", キー一覧
    
End Sub

Sub ショートカットキーの解放()
    キーArray = Split(GetSetting("MyMacro", "設定", "ショートカット登録分"), ",")
        
    For i = 0 To UBound(キーArray) - 1
        Application.OnKey キーArray(i)
    Next i

End Sub
```

### ThisWorkbookモジュール
アクティブ化、非アクティブ化した際に動作するようにします

``` vb
Private Sub Workbook_Activate()
    Call ショートカットキーの割り当て
End Sub

Private Sub Workbook_Deactivate()
    Call ショートカットキーの解放
End Sub
```

### シートモジュール
こちらもアクティブ化、非アクティブ化した際に動作するようにします

``` vb
Private Sub Worksheet_Activate()
    Call ショートカットキーの割り当て
End Sub

Private Sub Worksheet_Deactivate()
    Call ショートカットキーの解放
End Sub
```
ブック内の全角英数を半角に一括変換する【Excel VBA】

社内でいろんな人がいじるブックに全半角が入り交じっており

- 検索がかけられない
- 転記マクロの検索対象に引っかからない

などの不満があったので作ったやつ。<br>


## 機能概要
全角英数を1文字ずつ検索しては半角に変換して回るだけ。
（カタカナは半角にはしない。@や,などの記号も適用外）

## コード
```vb
Option Explicit

Sub Main_ブック内の全角英数を半角に一括変換する()
  Debug.Print Time
  Application.ScreenUpdating = False

  Dim wb As Workbook: Set wb = ActiveWorkbook
  Dim ws As Worksheet
  Dim cnt As Long: cnt = wb.Sheets.Count
  
  Dim st As Long
  For st = 1 To cnt
    Set ws = Sheets(st)
    Call シート内全→半(ws)
  Next st
  
  Debug.Print Time
  Application.ScreenUpdating = True

End Sub

Sub シート内全→半(ws As Worksheet)
  Dim strAssm As String, strPart As String
  
  Dim rLast  As Long: rLast = LastCell.Row
  Dim cLast  As Long: cLast = LastCell.Column
  Dim Arr As Variant: Set Arr = ws.Cells(1, 1).Resize(rLast, cLast)
  Dim rg 
  Dim s As Long
  Dim k As Long: k = 1
  For Each rg In Arr
    strAssm = ""
    For s = 1 To Len(rg)
      strPart = Mid(rg, s, 1)
      strPart = 英数のみ全→半(strPart)
      strAssm = strAssm + strPart
    Next s
    Arr(k) = strAssm
    k = k + 1
  Next rg

  Cells(1, 1) = Arr

End Sub

Function 英数のみ全→半(strPart)
  Select Case strPart
    Case "０" To "９", "ａ" To "ｚ", "Ａ" To "Ｚ": 英数のみ全→半 = StrConv(strPart, vbNarrow)
  Case Else
    英数のみ全→半 = strPart
  End Select
End Function

Function LastCell() As range
  Dim r As Long
  Dim rLast: rLast = 1000 '1000行以内には収まるだろう
  Do Until WorksheetFunction.CountA(Rows(rLast)) > 0
    rLast = rLast - 1
  Loop
  
  Dim cLast: cLast = 100 '100列以内には収まるだろう
  Do Until WorksheetFunction.CountA(Cells(rLast, cLast)) > 0
    cLast = cLast - 1
  Loop
  
  Set LastCell = Cells(rLast, cLast)
End Function

```
【ExcelVBA】区切り文字を指定してSplit貼り付け

## メインコード

``` vb
Dim 文字列 As Variant
Dim WB As Workbook
Dim WS As Worksheet

Sub 区切り文字を指定してSplit貼り付け()
    Set WB = ActiveWorkbook
    Set WS = ActiveSheet
    
    文字列1 = Split(クリップボードからデータを取得する, vbCrLf)
    Dim 区切り文字: 区切り文字 = InputBox("区切り文字を入力して下さい")
    
    Dim i As Long, j As Long
    For i = 0 To UBound(文字列1)
        文字列2 = Split(文字列1(i), 区切り文字)
        
        For j = 0 To UBound(文字列2)
            ActiveCell.Offset(i, j).Value = 文字列2(j)
        Next
    
    Next
End Sub

Private Function クリップボードからデータを取得する()
    Dim buf As String, buf2 As String, CB As New DataObject
    With CB
        .GetFromClipboard   ''クリップボードからDataObjectにデータを取得する
        buf2 = .GetText     ''DataObjectのデータを変数に取得する
    End With
    クリップボードからデータを取得する = buf2
'    MsgBox buf2
End Function

```

## 右クリックメニューに追加／削除するコード
``` vb 

Sub 右クリックメニューに区切り文字を指定してSplit貼り付けを追加()
    Dim Newb
    Set Newb = Application.CommandBars("Cell").Controls.Add(Before:=1)
    With Newb
        .Caption = "区切り文字を指定してSplit貼り付け"
        .OnAction = "区切り文字を指定してSplit貼り付け"
        .BeginGroup = False
    End With
End Sub
Sub コマンド削除_区切り文字を指定してSplit貼り付け()
  CommandBars("Cell").Controls("区切り文字を指定してSplit貼り付け").Delete
End Sub

```
【ExcelVBA】yymmdd入力とhhmm入力

``` vb

Sub hhmmで時刻入力()
    Application.EnableEvents = False '無限ループ対策

    On Error Resume Next
    flag = True 'Falseなら見積等計算プロシージャで自動計算させない
    
    buf = InputBox("4桁で時刻を入力してください" & vbCrLf & "（hhmm形式）")

    
'        If ActiveCell.NumberFormatLocal = "h:mm;@" Then
            Select Case True
            '先頭に0が付く場合は桁数が減るので各パターン用意
            Case buf Like "#"
                buf = "00:0" & buf
            Case buf Like "##"
                buf = "00:" & buf
            Case buf Like "###"""
                buf = "0" & Left(buf, 1) & _
                        ":" & Right(buf, 2)
            Case buf Like "####"
                buf = Left(buf, 2) & _
                        ":" & Right(buf, 2)
            Case buf Like "#:##", "##:##"    '何もしない
            Case buf = "": flag = False      '見積等計算プロシージャで自動計算させない
            Case Else
                MsgBox "4桁の数値か時刻形式で入力してください"
                flag = False
                buf = ""
            End Select  'True
'        End If  'NumberFormatLocal
        
    ActiveCell.Value = buf
    Application.EnableEvents = True

End Sub
```

``` vb

Sub mmddかyymmddで日付入力()
   Dim buf
   
   buf = InputBox("4桁または6桁で日付を入力してください" & vbCrLf & "（mmdd形式またはyymmdd形式）")
    
    Select Case True
    '先頭に0が付く場合は桁数が減るので各パターン用意
        Case buf = "": GoTo Cancel
        Case buf Like "####"
            buf = Year(Date) & "/" & Left(buf, 2) & "/" & Right(buf, 2)
        Case buf Like "######"
            buf = Left(Year(Date), 2) & Left(buf, 2) & "/" & Mid(buf, 3, 2) & "/" & Right(buf, 2)
        Case Else
            MsgBox "4桁or6桁の数値で入力してください"
            buf = ActiveCell.Value
    End Select
    ActiveCell.Value = buf
Cancel:
End Sub


```