OmniAICreator/Qiita-1.07M huggingface dataset:
【Qiita初投稿（小学生でも分かる解説）】


#自己紹介
・27歳
・早稲田大学卒
・所有資格数：29個
・金融会社に5年弱勤務
・プログラミングスクールに入学。（2021/2）
・趣味：旅行・音楽・読書・勉強
・プログラミング経験：なし（スクール前）

#Qiita投稿開始
Qiita初投稿。
みんなの投稿を見ると、どれも綺麗な見た目の記事で「こんな記事書けないだろうなあ」と見るばっかだったけど、始めてみようと思う。

投稿に対してのこだわりは、***「分かりやすさ！」***
とにかく！分かりやすさ！
小学生でもわかるくらいの解説を目指す。
なので、口調もかなり雑な感じで書いていく。（わざと:v:）
幼稚な印象を与えてしまうかもしれないけど、ゆるして。。

これから投稿始めたい人も、見る専門の人も、安心して見てほしい。

#なぜ投稿始めた？

投稿始めた理由は主に下記の通り。

・アウトプットして身に付けたい
・解説書等よりも分かりやすく解説できるという根拠のない自信
・投稿、発信している人ってなんかすごそう
・楽しそう
・かっこいい（！？）

ほぼ不純な動機😂
でも、どれかしらでも同じこと思わない！？w

例えば、

```index.html
<h1>Hello,world!</h1>
```

↑このエディタを埋め込んだみないなやつ、カッコよくない！？

すでに、これができただけでも満足。。

#これからの投稿
次回以降からQiitaの始め方〜プログラミングについて、学んだことを小学生でも分かるように解説していく。
「１週間食事取るのを忘れてた！」となるくらい、アホみたいに勉強して、投稿していくので気楽に見ていただけると幸いです。
vueで親コンポーネントと子コンポーネントのクリックイベントを切り分ける

子コンポーネント全体にクリックイベントがあり、親コンポーネントにもクリックイベントがある場合、親コンポーネントをクリックした際に子コンポーネントのクリックイベントも発火してしまう（はず）

例えば親コンポーネントでこういった処理をしたい場合

```
<v-row>
  <v-col @click="parentEvent()"> //親コンポーネントでクリックイベントを上書きしたい
    <ProjectListView></ProjectListView> //このコンポーネント自体にもクリックイベントがある
  </v-col>
</v-row>
```

親コンポーネントの子コンポーネントを使う囲みタグのイベント修飾子にcaptureを設定し、子コンポーネントにはstopを設定する

```
<v-row>
  <v-col @click.capture="parentEvent()">
    <ProjectListView
       @click.stop=""
    ></ProjectListView>
  </v-col>
</v-row>
```


captureでルートからイベントを追って、子コンポーネントではstopでイベントを止める

正直よくわかってません、もっといいやり方あったら教えてください
分子生物学研究室の一般人がPythonで研究する話①環境構築編

蛍光顕微鏡画像の解析でImageJ(フリーの画像解析ソフト)を使っているのが当研究室。
先輩方は手作業でやってて大変そうだな～～と勝手に思っていたら自分でも使うことになってしまった！ってのがM1になった2020年5月くらいの出来事。
この時点では多少Pythonに触れたことはあった(それこそみんなのPythonとかで）が、全くもって使えない状態だったのにもかかわらず。画像解析ってプログラミングでオートメーション化できたら楽じゃない？っていう素人思考に乗っ取られてPythonでの画像解析を開発することに。
https://satoshithermophilus.hatenablog.com/　
とか参考にしながらある程度の画像解析を見よう見まねで作ったは良い物の、自分の思い通りの開発なんてモノは一切出来ないので、改めてPythonを勉強しようとなったのが2021年1月(現在)というわけだ。

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718903/7d32f8b8-d25d-e34a-baae-042185435383.jpeg)

さぁみんなのPythonで勉強するぞ！ってツイートしたら著者に補足されて後に引けなくなった人がpythonで研究できるように色々頑張った話。(みんなのPythonの話は今回はほとんど出てこない)(柴田さんはご丁寧にリツイートまでしてくれた)

※独自の解釈を多分に含む
※こうやると良いよ！ではなくやったことの議事録
○Pythonの導入
Python自体はプログラム言語の一つであるが、加えて数理計算やデータサイエンス、機械学習でよく使う機能をパッケージングしたのがAnacondaである。ざっくり言うとPythonより強い奴、Anacondaだしね。このAnaconda、結構癖が強くて苦しむことになるが、数理計算(グラフ描写等も含めて)は必要な機能なのでAnacondaでの導入をすることにした。
AnacondaのWebサイトでwindows用Anacondaをインストールし、説明の英語はよくわからんので推奨設定のままインストール。

○Pathを通す
ここら辺からプログラムとかパソコンに疎い(研究室の中では強い方)自分には意味がわからないことになってくる。このpathは顔パスのパスと同義(多分)、pathを通すとpythonを開いて！ってコマンドプロンプトで命令するときにC:Users/ユーザー名/Anaconda3/Python.exe　的なことを書かずにPythonって書けば良くなるらしい。何言ってるかわからないと思うが、windowsなら「環境変数を編集」って左下から検索して、ユーザー環境変数のpathをクリックして編集をクリック。新規→参照かPython.exeが保存されているフォルダを選択して環境変数に追加してあげればパスが通ることになるらしい。他にもいろいろPathを通さなければならないらしいが、環境変数の設定についてちゃんと書かれているwebサイトを適宜調べてやるのが良いと思う。
ちなみにAnacondaのインストール時に推奨設定通りではなく一回チェックするとこのpathを通しておいてくれる、言っといてくれよ。

○VScodeの導入
Virtual Studio Codeはプログラムを書くためのツール。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/718903/3e606e5d-5a33-ef89-3fda-6cd16fcee9aa.png)
いろいろ色がついて格好いい・・・のではなく、編集に便利。(下にエラー出まくってるのは気にしないで)
導入もサイトからインストールするだけ、Pythonの実行環境をAnaconda環境やそうじゃない環境で選べるようなのでどこかしらで便利になるだろう。みんなのPython中で使用しているJupyter Notebookが便利なので、VScodeでも使えるようにしておいた(Jupyterの説明は適宜検索)

○ImageJをVScodeで動かせるのか
ImageJでpythonを使っていたときはImageJがJavaで出来ているため、ImageJ内のツールでJython(Java+Python)を使って書いてImageJ内で動かしていた。これを外部のソフト(VScode)から動かせないか、と言う疑問が湧いた(動かせるのであればVScodeの仕様でやった方が楽そう)。外部のPythonからImageJを動かすにはpyImageJというモジュールが必要のようだった。これをcondaを使ってインストール・・・というところでプロキシの問題があって断念(ラボでやったから大学のプロキシに引っかかったくさい)。もう最後のこの文章なんの解説もしてないけどいいや。
体感としてはImageJをVScodeで外から動かすことは出来そうだけど自分の能力的な問題も込みでまだ難しそう。


☆要はどういう環境構築したの
・Python(Anaconda)をインストールしpathを通した。
・VScodeで編集できるようにした
・ついでにJupyterNotebookをVScodeで使えるようにした

とりあえずはこんな感じ。研究に即利用できる感じではないが、勉強するには十分だと思う。
というわけで明日から本当にみんなのPythonを勉強する(はず)。
【Swift】RxSwiftが難しいのでサンプルコードを作った

##RxSwiftが難しい
「RxSwiftについていろんな記事を読みまくったけど、結局わからん」
その気持ちめっちゃわかります。
難しいですよね〜特に独学だとめちゃめちゃ辛い。
とりあえずRxSwiftはデータバインディングができて、
それを利用してMVVMなんかに使われることが多いです。


##RxCocoaと併用しよう
RxSwiftはRxCocoaとよく併用されます。

##ViewModel
![スクリーンショット 2021-01-25 16.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/c4ccdf06-8593-dc9c-3960-d67c7dbfb70f.png)


ModelTypeでInputとOutputのプロトコルを返すことで、
viewModel.outputs.output、
viewModel.inputs.input
のようにそれがoutputsに登録したものなのか
inputsに登録したものなのかが明確になる。
extensionで準拠させよう。

inputsはViewControllerから受け取るイベントで、
受け取りなのでObserverを使う。

outputsはinputsでViewControllerから受け取ったイベントによって
処理をして、その結果をViewControllerに返すのでObservableを使う。

Observerは受信者(監視)、Observableは発信者であるので
それぞれoutputsとinputsで使い分けている。

###output

```Swift
let _output = BehaviorRelay<Bool>(value: false)
self.output = _output.asObservable()
//Observableを代入し変数outputを初期化している。
```



###input

```Swift
self.input = AnyObserver<Bool>() { bool in
//Observerなので、ViewControllerからinputに流れてきた
//イベントをここで受け取る。 boolはそのイベント。
    _output.accept(bool)
    //Observable(発信者)にイベントを発信させるには
    //accept()を使う。
}
```

こんな感じで、ViewModelはVCからイベントをinputで受け取り、
outputで処理結果を返す感じに使う。
VCではinputでViewModelにイベントを送り、
outputを監視して処理結果に応じたUIの更新を行う。

##ViewController
![スクリーンショット 2021-01-25 16.32.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/5b266e4f-4a9b-de0c-392b-8f86e4023e47.png)
Instantiateを使うとbundleNameとか使わなくても、
storyboardを呼び出せる。(別々のstoryboardを使っていてもこれで一発なので超便利)
dependencyやinjectは依存性的な感じ。ここは自分で調べてください。

```Swift
var viewModel: RxSwiftViewModelType!
//viewModelをModelTypeで型宣言してあげることで、
//inputs, outputs変数(プロトコル)を通さなければならなくなり、
//イベントがinputsなのかoutputsなのかはっきりする。(重要)
```

###input

```Swift
let _ = viewModel.inputs.input.onNext(true)
//ViewModelにイベントを送りたいときは、onNextメソッドを使う。
//画面更新が入る時など
```

###output

```Swift
let _ = viewModel.outputs.output
    .subscribe(onNext: { [weak self] bool in
    //viewModelからのイベント結果を監視し、イベントがきたら発火する
    //weak selfはメモリリーク対策
        guard let self = self else {return}
        //guard let もメモリリーク対策
        //イベント結果がきた時にしたい処理を書く
     }).disposed(by: disposedBag)
//disposedBagを入れることで、購読の重複を防ぐ。
//(詳しくは調べてください)

```

##遷移
![スクリーンショット 2021-01-25 16.33.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585922/540123d7-0af3-b12c-0512-67292ff8042f.png)

instantiateライブラリを使っているので、遷移の仕方は少し特殊
この場合はnavigationControllerを使ったパターン。


##まとめ

RxSwift、難しいですよね。
さらっとやったらあとは実務でゆっくり身に付けるのが一番効率が良さそうです。

ちなみに、RxSwiftの参考書なら RxSwift研究読本がおすすめです。
WSLのターミナルの表示を良い感じにする

# 概要
最近PCが壊れてリカバリしたばっかりなので環境構築ネタの中から１つ。
WSL(Ubuntu)のpromptの標準表示がイケてないので改善していきます。

## Before
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/e29b38d7-9090-5bd3-6cad-88ade1ef23ca.png)
※白塗りはマシン名

**Beforeの課題点**
- Windowsのフォルダ表示が「背景緑」「文字青」でとても見づらい
- WSLでユーザー名やマシン名が見えても特にうれしくない
- フルパス表示は長すぎる
- gitの管理下であればカレントのbranch名も出してほしい

## After
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/c6dd98d8-87cc-309e-e535-154877bd6cdb.png)


**Afterの改善点**
- Windowsのフォルダ表示が「背景水色」「文字黒」に変更
- ユーザー名やマシン名を削る
- フルパスからフォルダ名表示のみに変更
- カレントのbranch名を出力
- ついでにホワイトエンジニアたるもの時間を常に意識する気持ちは大事なので時刻表示を追加

# やりかた

- git-promptをダウンロード

git branch名を取得するためにgit公式が提供しているgit-promptをダウンロードしてきます。

```shell
cd ~ && curl https://raw.githubusercontent.com/git/git/master/contrib/completion/git-prompt.sh -o ".git-prompt.sh" && chmod +x .git-prompt.sh
```

- dirclorsをファイルに出力

```shell
dircolors -p > ~/.dircolors
```

- dircolorsを編集

```diff:~/.dircolors
- OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
+ #OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky
+ OTHER_WRITABLE 30;46
- STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
+ #STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable
+ STICKY 30;44
```

- bashrcを書き換え

```diff:~/.bashrc
+source ~/.git-prompt.sh
 if [ "$color_prompt" = yes ]; then
-    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+#    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
+    PS1='\[\e[30;47m\] \t \[\e[30;46m\] \W $(__git_ps1 "\[\e[30;42m\](%s)")\[\e[0m\]\$ '
 else
-    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+#    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
+    PS1='\t \W $(__git_ps1 "(%s)") \$'
 fi
+
+# dircolors
+eval $(dircolors -b ~/.dircolors)
```

- 反映

```
source ~/.bashrc
```

- WSLでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/7f31c192-89c3-fc6b-fe5e-625e3cb4d607.png)

- Windows Terminalでの表示
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536869/b008bbf6-0e16-df94-7f92-45bf28ce5188.png)

ちなみにgit管理ディレクトリではない場合にはgit branchは出力しないようにしています。
ターミナルによって若干色は違いますが見やすくはなっていると思います。

みなさんもpromptをカスタマイズして良いハックライフを！

# 参考記事

[ターミナルプロンプトの表示・色の変更 - Qiita](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)
[WSLのWindowsのフォルダの色が見づらいのを直す](https://www.kwbtblog.com/entry/2019/04/27/023411)
SourceTreeでグラフが消えちゃった時の対処法

# 何もしてないのに壊れました
ある日突然自分が使っていたSourceTreeのグラフが消えました
https://community.atlassian.com/t5/image/serverpage/image-id/3881iC0709C23A42BB460?v=1.0

この画像で言う左の部分がごっそりなくなりました

# 対処方法
説明と書かれている部分を右にドラッグする
![ezgif-6-b52ce215a7e9.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262297/8a2f1f7a-d11e-2236-68d3-8cd3eeb1ad9d.gif)

以上
MacOS CatalinaでVisualStudioCodeの環境設定【Python3】

# はじめに
Python3の開発環境構築の忘却録。

## pyenvのインストール
```
cd ~/
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
```
Pythonのバージョンを複数切り替えて使いたいので、GitHubからDownload。

## .zshrcに設定追加
```
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```
Terminal立ち上げ直すか、`source`で読み込み直しする。

## 該当のPythonをインストール
```
pyenv install --list // Versionリスト表示
pyenv install 3.9.0  // 現時点で最新版
pyenv global 3.9.0   // globalで使用許可
python --version
```

## 仮想環境の構築
```
mkdir python-app
cd python-app
python3 -m venv venv
```
`python3 -m venv [任意名]`で環境作成出来る。

## VSCodeダウンロード
Downloadはこちらから
https://azure.microsoft.com/ja-jp/products/visual-studio-code/

## プラグインのインストール
![スクリーンショット 2021-01-25 16.20.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/e8ce966a-6d38-64d5-4519-c5ef908dfdd1.png)
![スクリーンショット 2021-01-25 16.20.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/6be4f192-1d6e-385f-6d75-2cefc85028d1.png)
![スクリーンショット 2021-01-25 16.21.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/ed13d30c-f44c-fa1b-54d4-51e6a020513f.png)
こちらをインストールする。

## setting.jsonの用意
![スクリーンショット 2021-01-25 16.44.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/cad65295-134f-c585-c6b6-dd51acf6d337.png)
左下の赤丸部分を押下するとPython選択画面が出てくる。
![スクリーンショット 2021-01-25 16.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022988/18cce16b-8e52-ab12-5b88-567c3f13f3e3.png)
該当のPythonを選択すると`.vscode`ディレクトリと`setting.json`が作られる。

## Hello World
``` hellow.py
print("Hello World")
```
該当ディレクトリに`hello.py`作成し、右上の「▷」で挙動確認。
Terminalが立ち上がり`Hello World`が表示される。
Linuxサーバーへの外付けHDDのマウント方法

# 本記事に含まれる内容
- Linuxサーバーへの外付けHDDのマウント方法

# Linuxサーバーへの外付けHDDのマウント方法

外付けHDDのデバイスファイルを探す

```bash
$ sudo fdisk -l
```

マウント

```bash
$ sudo mount -t ntfs-3g {記憶デバイスのpath} {mount先のpath}
```

アンマウント

```bash
$ umount {mount先のpath}
```
Linuxで新規ユーザーを追加する方法

Linuxでユーザーを追加する際にいつもコマンドを調べているので、備忘録として書く。

# 本記事に含まれる内容
- Linuxでの新規ユーザーの追加方法

# Linuxでの新規ユーザーの追加方法

ユーザーの追加

```bash
$ sudo useradd -m {NEWUSER}
# -m --create-home ユーザーのホームディレクトリが存在しない場合、作成する
```
指定グループに追加

```bash
$ sudo gpasswd -a {NEWUSER} {GROUPNAME}
```

passの設定

```bash
$ sudo passwd {NEWUSER}
```

指定グループに正しく加えられているかの確認

```bash
$ getent group {GROUPNAME} 
```
[Swift]数字の配列から合計(sum)と平均(average)を計算


swiftで数字の配列`[1, 2, 3, 4, 5]など`から合計と平均を出す機会が何度かあったのですが、毎回調べて実装していたので、まとめてみました。

## Array.reduceを使う

数字の配列の合計を計算する場合、愚直にforEachを使う方法もありますが、Array.reduceを使うと簡潔に書けます。

```swift
[1, 2, 3, 4].reduce(0, +)
=>結果は10
```

第１引数は初期値（今回は０）です。
第２引数はオペレーターです。`+-*/`の４つが使えます。

参考
https://developer.apple.com/documentation/swift/array/2298686-reduce

## extensionを使い、合計と平均を簡単に計算する

Int配列を例に、合計と平均を出すmethodを定義します。
Arrayのベース

```swift

extension Collection where Element == Int {
    
    func sum() -> Int {
        return reduce(0, +)
    }
    
    func average() -> Double {
        let value = sum()
        return Double(value) / Double(count)
    }
    
}
```


## ソース
Intだけでなく、Float, Doubleの配列についてもextensionにしたソースを以下に置きました。
https://gist.github.com/usk2000/230d46869c9eba401978a8865d2f66fa

## 終わりに
今回はよく使う合計と平均について書いてみましたが、もっと数学的なものも書いてみたいですね。

## 参考

https://qiita.com/motokiee/items/cf83b22cb34921580a52
https://developer.apple.com/documentation/swift/array/2298686-reduce
Metabaseでドリルダウン・ドリルスルーのような機能を実装する

#課題
Metabaseの公式ドキュメントを見てみたが、ドリルダウン・ドリルスルーが実現できるのか不明・・・

ディスカッションを検索しても良く分からず。

https://discourse.metabase.com/search?q=drill


#解決策

集計用のダッシュボードと、ドリルダウン先のダッシュボードを作成して、疑似ドリルダウンを実装する。
このやり方でも、意外と色々実現できると思われる。


##①フィルタを実現する

* ドリルダウン先のデータを作成する。


* SQLのwhereに変数を使用する。


* ここでは、 {{ID}}で、ID変数を使用している。
* where以降を　[[　where ～ ]]　と囲むと、条件指定が抜けていても動作するようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389658/8f407bd9-f074-e28b-e9f1-4522c7573b99.png)


* ダッシュボード側で、IDと変数のIDを紐づける。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389658/90e90234-57b0-d7f3-0041-382a0cb9a9b5.png)



##②絞り込みを実現する

* ドリルダウン元となる集計データを作成する。
* ドリルダウン用のリンク列を追加するのがポイント！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389658/debffa0e-d4dd-2c34-0933-252bdfca23aa.png)


##③動きを確認する
* ドリルダウン元となるダッシュボードを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389658/4d8e0985-3ab9-b8cb-0687-3987cde633b8.png)

* 表示をクリックするとドリルダウン先のダッシュボードへ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/389658/8d3c025d-0a89-7e70-58da-32ada9a52b47.png)


## ④これをベースとして、他の情報を配置して拡張する
* 関連するデータを配置し、同様にID変数をもとにフィルタをかければドリルダウン機能の実現が可能となる。
bulletml.jsの研究


# 概要

bulletml.jsの研究です。
タグを調べてみた。

# bulletml>

BulletML本体を定義します。

type属性は、この弾幕が縦スクロールシューティング用か、 横スクロールシューティング用かを規定します。

# bullet>

弾の方向、速度およびアクションを定義します。
ラベル属性でラベル名をつけることができます。 ラベル付けされたbullet要素は、bulletRef要素によって参照されます。

# action>

弾のアクションを定義します。 ラベル付けされたaction要素は、actionRef要素によって参照されます。

# fire>

弾をdirection度方向に速度speedで撃ちます。 ラベル付けされたfire要素は、fireRef要素によって参照されます。

# changeDirection>

弾の方向をdirection度にtermフレームかけて曲げます。 1フレームは1/60秒です。

# changeSpeed>


弾の速度をspeedにtermフレームかけて変えます。

# accel>


弾を水平方向にhorizontal、垂直方向にvertical、 termフレームかけて加速します。

# wait>

NUMBERフレーム待ちます。

# vanish>

弾を消します。

# repeat>

アクションをtimes回繰り返します。

# direction>

方向を度単位で指定します。

typeが"aim"の場合、自機を狙う方向が0の相対値になります。

typeが"absolute"の場合、NUMBERは絶対値（上方向が0で時計回り）です。

typeが"relative"の場合、NUMBERはこの弾の方向が0の相対値になります。

typeが"sequence"の場合、直前の弾を撃った方向が0の相対値になります。

# speed>



速度を指定します。

typeが"relative"の場合、 changeSpeed要素内では現在の弾の速度との相対値、 それ以外の要素内ではこの弾の速度との相対値です。

typeが"sequence"の場合、 changeSpeed要素内では弾の速度を連続的に変化させ、 それ以外の要素内では直前の弾の速度との相対値です。

# horizontal>


水平方向の弾の加速度を指定します。

typeが"relative"の場合、現在の弾の速度との相対値です。 typeが"sequence"の場合、加速度を連続的に変化させます。

# vertical>


垂直方向の弾の加速度を指定します。

typeが"sequence"の場合、現在の弾の速度との相対値です。 typeが"sequence"の場合、加速度を連続的に変化させます。

# term>

期間を指定します。

# times>

繰り返し回数を指定します。

# bulletRef>


ラベル付けされたbullet要素を参照します。 この要素は同名のラベルでラベル付けされたbullet要素と同じに扱われます。

参照されたbullet要素内の変数（$1, $2, $3, ...）は、 param要素に指定された数値に置き換えられます。 （最初に出現したparam要素が$1に、次に出現したparam要素が$2に、...）

# actionRef>


ラベル付けされたaction要素を参照します。 この要素は同名のラベルでラベル付けされたaction要素と同じに扱われます。

参照されたaction要素内の変数は、param要素に指定された数値に 置き換えられます。

# fireRef>


ラベル付けされたfire要素を参照します。 この要素は同名のラベルでラベル付けされたfire要素と同じに扱われます。

参照されたfire要素内の変数は、param要素に指定された数値に 置き換えられます。

# param>

パラメタを指定します。

STRING
ラベル用文字列です。

NUMBER

数値を指定するための式です。

四則演算と剰余算、括弧、変数（パラメタ用に$1, $2, $3...、 乱数（0から1までの値）用に$rand、難易度（0から1までの値）用に$rank） が使えます。



以上。
Manjaroで日本語入力(公式パッケージ編)

#はじめに
2020年6月以降、Manjaroの日本語入力が公式にサポートされました。
従来の方法でも使用可能ですが、公式パッケージが用意されたので
より簡単に設定することが出来るようになりました。
`.xprofileの追記など不必要`
https://gitlab.manjaro.org/packages/community/manjaro-asian-input-support

##パッケージの種類と組み合わせ
|manjaro-asian-input-support-|対応する日本語入力|オプション|
|:-----------|:-----------|:-----------|
|fcitx|fcitx-mozc||
|ibus|ibus-anthy|ibus-mozc(AUR)|

### fcitx or ibus  ?
Appimageアプリでfcitxが動作しないことがあるので
そういう時はibusを試してみましょう。
筆者は、それに遭遇したので、ibus-mozcにして使っています。
`manjaro-asian-input-supportは、fcitxとibusを同時にインストールできないので
切替える際は、インストール済の方をアンイストールしてから行う必要があります。
`
#インストール
##fcitx-mozc
```
sudo pacman -S manjaro-asian-input-support-fcitx fcitx-mozc
```
↓デスクトップがKDEの場合

```
sudo pacman -S manjaro-asian-input-support-fcitx fcitx-mozc kcm-fcitx
```
##ibus-anthy（ibus-mozcと共存可）
```
sudo pacman -S manjaro-asian-input-support-ibus ibus-anthy
```
##ibus-mozc（ibus-anthyと共存可）
gtk2が依存関係で必要になるのとAURが使えるようにyayもインストールしておく

```
sudo pacman -S manjaro-asian-input-support-ibus gtk2 yay
```
AURでビルドする（問合せは、全てデフォルトでOK）

```
yay -S ibus-mozc
```
##有効化
再起動、または再ログイン後に日本語入力できるようになります。

#補足（GUI）
パッケージをインストールするだけなので、パッケージマネージャー（Pamac）からでも
ManajroHelloの簡易インストーラーからでも導入できます
↓ 参考例
https://gae-fan.blogspot.com/2020/06/manjaro-linux.html
【Rust プログラミング入門】を読んだ感想

# はじめに

私は普段KotlinやC++(1x)について使っていたり仕様をおいかけたりしていました。
Rustという言語が最近流行ってきていると言うことで入門書を購入して読んでみました。

https://www.amazon.co.jp/dp/4798061700

# 感想

## よかった点

* まず手に取ったときに本の構成が読みやすいですね。環境構築から始まって簡単な概念の説明や文法の説明、徐々に具体的なユースケースに入っていくので少しずつ理解していくことができました。
* ムーヴ・セマンティクスや所有権のような概念はC++を知っているととっつきやすかったです。

## もうちょっと理解したい点

* Kotlinに慣れているとnullの扱いやエラーハンドリングがとっつきにくく感じました。（Kotlinのエラー処理は他の言語に比べてもかなり書きやすいですね。）

# おわりに

* 実行速度が速いところや、ゼロコスト抽象化はとても興味深いのでもっと勉強していつの日かプロジェクトに取り入れてみたいです。
【Salesforce】項目が多すぎてapex:pageBlockから突き抜ける→回避のため上下に横スクロールバーを配置する→今度はカレンダーが突き抜けたので配置を調整したい

# 動作確認

![Qiita用＿日付びょーん_修正.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/76aa44e3-b7df-9600-284d-cc080bf7fc35.jpeg)

↓

![スクリーンショット 2021-01-25 163045.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/492812/68b11478-a62f-1ecf-18a1-b678f22c62ef.jpeg)

# 実現方法

```HTML:test.page

<apex:inputField value="{!日付項目}" styleClass="slds-input"/>

// ↓

<apex:inputField type="date" value="{!日付項目}" styleClass="slds-input" showDatePicker="false"/>

```

# 参考リンク

[apex:inputField
](https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/pages_compref_inputField.htm)

[【Salesforce】対象ブロックの上下に横に動くスクロールバーを設置したい
](https://qiita.com/RyoheiKobayashi/items/cb1582cad8baf58bfa6a)
Python で環境変数を読むときのいろいろ

# Python で環境変数を読み込む際の Tips

Python で環境変数を読むときの書き方をメモっておきます。

## 環境変数の取得方法

* 取得方法は 3 つあります。
    * `os.getenv(name: str) -> Optional[str]`
    * `os.environ[name: str] -> str  # or raise KeyError`
    * `os.environ.get(name: str) -> Optional[str]`
* いずれも値を取得できた場合、必ず str 型で返却します。
* `os.getenv` と `os.environ.get` に違いはありません。個人的には文字数の少ない前者(**os.getenv**)を推奨します。

```py
import os  # 以降、省略します

# 値がない場合に None を返す
os.environ.get('HOME')
# '/home/user'
os.getenv('UNKNOWN_ENV')
# None

# 値がない場合に KeyError 発生
os.environ['UNKNOWN_ENV']
# => KeyError: 'UNKNOWN_ENV'
```

## 基本

### 初期値

* `os.getenv(name: str, default: str)` で初期値をセットすることができます。
* 初期値には str 型以外の値もセットできますが、**os.getenv() の結果は必ず str 型** ですので、通常は合わせるべきです。os.getenv() の外で型を変換します。

```py
os.getenv('MESSAGE', 'hello')
# 'hello'

num = int(os.getenv('NUMBER_ENV', '5'))
print(num, type(num)
# 5, <class 'int'>
```

### フラグ

* bool 型の値を扱う際は、以下のようにするとスマートです。
* **True に該当しなければ False** （もしくは、 **False に該当しなければ True**）という設計がよいかと思います。
   * 必要に応じて、True/False/それ以外は例外 という設計にします。
* 様々なケースに対応した書き方をのせているので、必要なパターンをお使いください。

```py
# 以下、環境変数 'FLAG' をフラグとする。

# True とみなす文字以外は False とする
os.getenv('FLAG', 'False') == 'True'  # 'True' のみ True
os.getenv('FLAG', 'F') == 'T'  # 'T' のみ True

# 大小問わず true 以外は False とする
os.getenv('FLAG', 'False').lower() == 'true'
# True  : 'true', 'TRUE', 'True', ...
# False : 他。セットしていない場合も含む。

# true/false/エラー
os.environ['FLAG'] == 'true'
# True  : 'true'
# False : 'false'
# 他は KeyError

# 初期値あり
{'true': True, 'false': False}[os.getenv('FLAG', 'false')]
# True となる値: 'true'
# Falseとなる値: 'false', セットしていない
# 他は KeyError

# 初期値あり、エラーなし
os.getenv('FLAG', 'false') == 'true'
# True  : 'true'
# False : 他。セットしていない場合も含む。

# 1, 0 をフラグとする
bool(int(os.getenv('FLAG')))
# True  : '1'
# False : '0'
# 他は ValueError (int に変換できないため)

# 1, 0 をフラグとして初期値は False
bool(int(os.getenv('FLAG'), '0'))
# True  : '1'
# False : '0', セットしていない
# 他は ValueError (int に変換できないため)

# いろんなパターンに対応した True
os.getenv('FLAG', 'False').lower() in ['t', 'true', '1']
# True  : '1', 't', 'T', 'true', 'True', 'TRUE', ...
# False : 他

# いろんなパターンに対応しつつ、不明な値で例外
bool({'t': 1, 'true': 1, 'f': 0, 'false': 0}[os.getenv('FLAG')])
# True  : 't', 'T', 'true', 'True', 'TRUE', ...
# False : 'f', 'F', 'false', 'False', 'FALSE', ...
# 他は KeyError
```

## ファイルパスからファイル読み込み

* 1 行で書けます。

```py
# 文字列として読み込む
content: str = open(os.getenv('FILE_PATH'), 'r', encoding='UTF-8').read()
# 初期値あり
content: str = open(os.getenv('FILE_PATH', 'file.txt'), 'r', encoding='UTF-8').read()

# JSON ファイルを dict として読み込み
import json
config: dict = json.load(open(os.getenv('CONFIG_PATH', 'config.json'), 'r', encoding='UTF-8'))

# CSV ファイルを list[list[str]] で読み込み
import csv
[r for r in csv.reader(open(os.getenv('CSV_DATA', 'data.csv'), 'r', encoding='UTF-8'))]
# CSV ファイルを 1 行ずつ list[str] で読み込み
for row in csv.reader(open(os.getenv('CONFIG_PATH', 'test.csv'), 'r', encoding='UTF-8'):
    print(row)
```
kivyMDチュートリアルに入門する

## kivyMDとは

kivyMDとは以下マニュアルにある通りで、クロスプラットフォームで開発できて
マテリアルデザインなフレームワークとなっています。

以下参照の原文とgoogle翻訳した文を冒頭だけ載せておきます。

```
kivyMD Is a collection of Material Design compliant widgets for use with, 
Kivy cross-platform graphical framework a framework for cross-platform, 
touch-enabled graphical applications. The project’s goal is to 
approximate Google’s Material Design spec as close as possible 
without sacrificing ease of use or application performance.

kivyMDは、Kivyクロスプラットフォームグラフィカルフレームワークで使用する
マテリアルデザイン準拠のウィジェットのコレクションであり、クロスプラット
フォームのタッチ対応グラフィカルアプリケーション用のフレームワークです。
プロジェクトの目標は、使いやすさやアプリケーションのパフォーマンスを犠牲
にすることなく、Googleのマテリアルデザインの仕様を可能な限り近似することです。

```

> 参照マニュアル
> https://kivymd.readthedocs.io/en/latest/

## てかお前誰よ

初めての投稿なのに手慣れてる感出してしまいました、すみません。
virtyと言い、都内でITエンジニアをしている者です。
言うまでもなく、好きな言語はpythonです。
あとは、他に気になっている技術は次のようなものがあります。

* docker/kubernetes
* Kotlin
* Flutter
* AWS/GCP

## どうしてまたkivyMDなの？

誰も聞いてないよ！みたいな声が出てきそうですが、勝手に喋らせてもらいます。
もともとkivyであるアプリを作りたいなぁと考えていました(ちなみに今更ながら
GUIアプリ)。で、UIがなんか昔っぽいなぁ(コントリビューターの方すみません！)
と感じていてこれだと他のものにしようかなと考えていたところ、kivyMDに出会って
しまいました(確か、stackoverflowで見たのかな)。おほーいいですねぇと思い
即決して、そこからは色々と情報を漁っていたりしていました。

## ですが、

これを見た方もご存知ですが、情報がありませんね。びっくりしました。これはQiitaに
投稿し始めた理由にもなるのですが、情報が無さすぎるのとせっかくチュートリアルを見るので
あれば忘備録として世の中に共有しようと考えたのです(余計なお節介)。今までネットの情報
に助けてもらった恩返しを！というのは大げさですが、そろそろコピペして読み取り専用となる
のを脱却するためにも良い機会でした。

## これからの展望

これからはというと、参照マニュアルの方で色々と書かれているものを実際に動かしてみて
あれやこれや調査していこうと思います。changelogとかまで調べていくのは大変なので、
下記項目にフォーカスしようかと思っています。

* Getting Started
* Themes
* Components
* Behaviors
* API(余力あれば)

なお、ここではkivyの使い方などは基本触れていかないでいこうと思います(というか
自分も完全にはわかっていない)。ですので、そちらを知りたい！という方は以下の情報
を見るとなるほどそうだったのか！となるかもしれませんしならないかもしれません。

### Kivyによるアプリケーション開発のすすめ (Jun okazaki) - PyCon JP 2017
https://www.youtube.com/watch?v=iVOVpIXzbYY&feature=youtu.be

### Kivyプログラミング ―Pythonでつくるマルチタッチアプリ―(書籍)
https://www.asakura.co.jp/books/isbn/978-4-254-12896-3/

あとは、自分以外にも色々書かれている方いらっしゃいますのでそちらを参照してもらえればと。

## おわりに

というまぁ、なんか終始ふわふわしてますがこんな感じで進めていこうかと思います。
基本休日とかにやるので、週1くらいが目安で進めていくかなと。あとは気になっている
技術に浮気して、先にそちらを取り掛かるかもです。よろしくお願いします。

ごきげんよう(謎の上品感を出す)。

## 参照

> Welcome to KivyMD’s documentation!
https://kivymd.readthedocs.io/en/latest/
Gitで間違ってPRをマージした時にRevertして再度PRを出す方法

## 対象者
- Gitでrevertした後、再度Mergeしようと思ってプルリクを出したら差分がないと言われて困っている人。
- 他の記事で「RevertのRevertをする」という言葉を見て、頭がこんがらがった人。

## 何が起きたのか
1. developブランチ -> masterブランチ にプルリクを出してMerge
1. やっぱりMergeを取り消したいのでRevert
    - revertボタンを押してrevertブランチ -> master にrevertプルリクを出してMerge
1. 再度 develop -> master にプルリクを出す
    - すると、<b>There isn't anything compare.</b>

<font color="crimson"><b>差分がない</b></font>となってしまう。。

## どうすればよいのか
Revertと聞くと、「戻す」というイメージを持つかもしれないが、実際は新たな修正をMergeしているに過ぎない。つまり上記の例のようにrevertした直後は、「masterの状態が最新、developブランチは古い状態」となっている。なので、再度プルリクを出すには以下の手順を踏む必要がある。

1. localのdevelopブランチにmasterの変更を取り込んで、origin/master（リモートのmasterブランチ）とlocalのdevelopの状態を同じにする。
1. developブランチに修正を加える
1. develop -> masterへのプルリクを出す。

## 実際の作業
### masterの変更をdevelopに取り込む
まずはlocalのdevelopブランチにmasterの変更を取り込んで、origin/masterとlocalのdevelopの状態を同じにする。

```bash
$ git checkout develop
# 一応logを確認しておく
$ git log
$ git pull origin/master
```

### developブランチに修正を加える
軽微な内容であれば手動で修正してもよいが、変更内容が大きい場合、先程のrevert前のソースを取り込みたい。

まずは現在のgit logを見てみる。

```bash
$ git log
# Revert内容のMerge
commit ew183be83aec39vngkd58884a5c5ee08e6irot
Merge: 362266b 029fe1b
Author: Esfahan
Date:   Mon Jan 25 13:59:02 2021 +0900

    Merge pull request #553 from EsfahanRepo/revert-552-develop

    Revert "ソースコードの修正"

# Revert用のcommit
commit 009fe2b20b059a2da3b48air943f4a35a643296
Author: Esfahan
Date:   Mon Jan 25 13:20:10 2021 +0900

    Revert "ソースコードの修正"

# develop -> masterへのマージ。
commit 362226b7f594if45328b237bf5e738fc1887217b
Merge: 6cdf2e1 2de7734
Author: Esfahan
Date:   Mon Jan 25 13:18:11 2021 +0900

    Merge pull request #552 from EsfahanRepo/develop

    ソースコードの修正
```

logの一番上の変更をRevertする。

<b>[Revert内容のMerge] commit番号: ew183be83aec39vngkd58884a5c5ee08e6irot</b>

このcommit番号の変更内容が先程Revertしたものなので、「RevertのRevertをする」という表現がなされるのだ。実際にやっていることは、「先ほどRevertする前の変更内容を、現在のlocalのdevelopブランチに取り込む」ということだ。ただし、実際にはrevertコマンドを使うので、「取り込む」という表現は適切でないのかもしれない。頭がこんがらがったのなら考えなくて良い。

### develop -> masterのマージをする前の状態に戻す
Revertを実施する。`-m 1`というオプションを付けているが、これを付けないとエラーとなる。

```bash
$ git revert ew183be83aec39vngkd58884a5c5ee08e6irot -m 1
```

このcommitの詳細を確認すると、`Merge: 362233b 009ve1b`という行がある。

```bash
$ git show ew183be83aec39vngkd58884a5c5ee08e6irot

commit ew183be83aec39vngkd58884a5c5ee08e6irot
Merge: 362233b 009ve1b
Author: Esfahan
Date:   Mon Jan 25 13:59:02 2021 +0900

    Merge pull request #553 from EsfahanRepo/revert-552-develop

    Revert "ソースコードの修正"
```

このcommitはMergeなので、どちらのブランチの状態に戻すのかまで指定しなければならないのだ。
`-m`(mainlineという意味)で1か2を指定するのだが、それぞれ以下の意味となる。

- 1: マージ元のブランチ(この場合はdevelop)
- 2: マージを適用するブランチ(この場合はmaster)

今回は、先程のMerge、つまりRevertプルリクのdevelopの状態に戻したいので、`1`を指定する。

実行。

```bash
$ git revert ew183be83aec39vngkd58884a5c5ee08e6irot -m 1
```

以下コマンドで、localのdevelopとリモートのmasterの差分を確認して想定どおりになっていれば、再度develop -> masterへのプルリクを出すことができる。

```bash
$ git diff develop origin/master
```

以上

## 参考
- [GitHubでマージ済のプルリクをrevertした後に引き続きrevertされたブランチで作業を続行したい時](https://qiita.com/bigplants/items/3d1d3ada97d0c86d2548)
shell の時間処理

いつも調べるので、ここでメモ

文字列 ⇒ Date
以下全部いけし、妥当性チェックもやってくれる：

```shell
date -d '20121212 7 days'
date -d '12-DEC-2012 7 days'
date -d '2012-12-12 7 days'
date -d '2012-12-12 4:10:10PM 7 days'
date -d '2012-12-12 16:10:55 7 days'
```

Date ⇒ 文字列

```shell
date '+%Y%m%d'
```

これで足りると思う
参考：https://stackoverflow.com/questions/11144408/convert-string-to-date-in-bash/11144983
【Ruby】レシーバのないメソッド呼び出し

Rubyにおいてレシーバのないメソッドでは、暗に`self`をレシーバとしているらしい。

```ruby
puts "hello"
# => hello
```

は下の文と等しい。

```ruby
self.puts "hello"
# => hello
```

トップレベルでの`self`は`main`という名前のObjectクラスのインスタンスであり、
ObjectクラスはKernelモジュールをincludeしている。
Kernelモジュールにputsメソッドが定義されているため、トップレベルでputsが使えるということらしい。

#### 参考

[【Ruby】メソッドの前のレシーバがない（ように見える）場合の考え方)](https://qiita.com/akihiro_kubota/items/de7d78204257a3ffa5f9)

[プロを目指す人のためのRuby入門](https://www.amazon.co.jp/%E3%83%97%E3%83%AD%E3%82%92%E7%9B%AE%E6%8C%87%E3%81%99%E4%BA%BA%E3%81%AE%E3%81%9F%E3%82%81%E3%81%AERuby%E5%85%A5%E9%96%80-%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA%E3%83%BB%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E6%8A%80%E6%B3%95%E3%81%BE%E3%81%A7-Software-Design-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4774193976)
p.300
pytestでデバッグする際の個人的頻出オプション

## はじめに
個人的に頻繁に使うオプションの紹介です。
こちらで紹介しているのは最低限ですので気になった方はご自身で調べてみてください。

|オプション|結果|
|----|----|
|-k|特定のテストケースを実行する|
|-s|printを出力する|
|--pdb|テスト失敗時にデバッグモードにする|

## 環境
```
$ pytest -V
pytest 6.0.1
```

## オプション
### 特定のテストケースを実行する

```test.py
def test_success():
    assert(1+2) == 3

def test_success2():
    assert(2+3) == 5

def test_failed():
    assert(1+2) == 4
```

テストを実行します。今回は成功ケースのみを対象にします。

```
pytest -k test_success
```

3件のテストケース中、2件が実行されました。
部分一致になるのでこのメソッド名だと`test_success`1件だけを実行できない点に注意が必要です。

```
collected 3 items / 1 deselected / 2 selected 
tests\test_app.py ..
[100%] 
=================== 2 passed, 1 deselected in 3.02s===================
```

### printの中身を出力する
テストがpassするとテストケースの中に記述したprint文はコンソール上に出ないので、意図的に出したい時に利用します。


```test.py
def test_success():
    sample = 1+2
    print("変数sampleの中身：",sample)
    assert(sample) == 3
```

```
pytest -s
```

成功ケースですが`print`の中身がコンソール上に出力されました。

```
collected 1 item

tests\test_app.py 変数sampleの中身： 3

tests\test_app.py . 
[100%] 
=================== 1 passed in 0.25s===================
```

### テスト失敗時にデバッグモードになるようにする
```
pytest --pdb
```

```
tests\test_app.py:183: AssertionError
>>>>>>>>>>>>>>>>>>>>>>>>> entering PDB>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>PDB post_mortem (IO-capturing turned off)>>>>>>>>>>>

(Pdb) print(sample)
3
(Pdb) 
```
終了時は`q`を入力してエンター
pdbはpythonの対話型デバッガーです。
https://docs.python.org/ja/3/library/pdb.html
MPCNC作成のためのお話（その１）-はじめに-

##はじめに
初回になりますので僕の紹介も軽く踏まえつつMPCNCについて軽く押さえていこうと思います。
僕はコンピュータエンジニアですが、ベンチャーやら大手企業への派遣やらゲーム会社やらなどのあと、実家の木工所に入って自由に色々作ったり請け負ったりしてます。
アプリ開発やサービス開発ばっかりだったので、ちょっと木工絡みでなにかしてみたいなと思い、2019年ごろYoutubeで見かけた３Dプリンタの技術動画で有名なトーマス・サンラデラー氏のMPCNC制作ライブを見かけて、MPCNCをゆっくり作って2020年の夏頃完成させました。

日本では、このMPCNCはまだあまり知られていないようで、検索しても作成している人の情報や日本語の情報は見つけられなかったので、せっかく作ったので色々情報共有しようと思います。

ちなみに僕の作ったのはBurly editionで、現在書いている2021年1月時点で最新のPrimoの一つ前バージョンになります。
Burlyの良いところは小さめの３Dプリンタでも、大きいパーツを切り分ければギリギリ制作できるところにあります。


|<img src="https://www.v1engineering.com/wp-content/uploads/2018/10/renb1-1.jpg" width="300px">|<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79204/a6fec91f-9988-c72c-f8a1-b1fb99d945c5.jpeg" width="300px">  |
|:-:|:-:|
| MPCNC Burly edition | 僕が作ったもの | 

##動作の様子
こんな感じで動きます。（ブラウザによっては埋め込みのまま自動再生されません）
<p class="codepen" data-height="555" data-slug-hash="YzGoQOJ" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 0; padding: 0;">
</p>
<script async src="https://static.codepen.io/assets/embed/ei.js"></script>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


##MPCNCについて
MPCNCとは Mostly Printed CNCのことで、ほとんどのパーツを３Dプリンタで作成したCNCのことです。
CNCはComputerized Numerical Control、コンピュータ数値制御で動く工作機のことで、Gコードと呼ばれる機械制御の移動位置情報やらが記述されたプログラムコードで動作します。
いわゆる３DプリンタもこのGコードで動作しています。


##最近のCNC
市販のCNCはバカ高く、以前は一千万円余裕でするようなものがザラでしたが、現在ではデスクトップCNCと呼ばれる小さいものは２万円〜５万円程度の格安で販売されています。
ただ1m以上になるサイズのCNCはだいたい20万以上はするので以前よりはかなり安くはなっていますが購入するには高めのPC以上にするので個人の購入や、あまりコンピュータ制御での工作機械が難しそうだなぁと思っている方には、ちょっと敷居が高いかと思います。
この記事ではそのあたりを解消していこうと、MPCNCの作り方をはじめ、データの作り方や、ソフトウェアを安く揃えていく方法をまとめようと考えています。



##MPCNCの公開サイト
https://www.v1engineering.com/
このv1engineeringというサイトですべての情報が手に入ります。
プリントアウトするパーツ以外に、必要なスチールパイプやボルト＆ナット、ベアリングなどの情報を得ることが出来ます。
また、作りたいCNCサイズを計算するためのカリキュレータも備えています。



##ライセンスや販売について
オープンソースとして公開されていますが、以下のことに注意が必要です。
v1engineering.comサイトのSHOPを通じて自分で作ったパーツを売ることは出来ます。
このMPCNCは自由に利用できますが、このサイト以外で売ったりMPCNCのサポートで商売したりすることは禁止されています。
このMPCNCから着想を得て全く違うデザインを行い自分で売り出したりサービスを行うことは認められています。
このMPCNCで作成したものの著作は、もちろんそれを作ったあなたにあります。
ただし利用したデータが他者のものであった場合、制作物の利用許諾範囲はその著作者の意思に従います。

今回は軽く紹介として、次回は制作の説明になります。

次回　[パーツ作成](https://qiita.com/nyos/items/cf9a27159239b25bbc10)
とても迷wk...ありがたいChromeトラップのソースを見てみる


[リンク](https://feetwindyoung-10.live/1443026120/?utm_campaign=QPF8euu28II5lw7O2iHhCidoSOXmw5oLxD6bwphw43U1&t=main7d&f=1&sid=t4~fh4ncetyfqwe5jkzcyy10pg0&fp=RmXrhPF7I0KHy2ZB7FbvofdZRg3urWrQvHo8x%2Bfv7Y7VdM60te%2Bt89R09u2bBmET%2BdHp9fWGoZ62sQwuZEumCEHki%2BbRnazr55s4xkqfqXIPjg4jkthMa3PfPh9zNlLKjT6ysBPZab2ZRdyD7R5wtaMDey25Wh0JRb39UZNKAQwXRcPf3xd6sJ0fOKe9pT%2B4Jgb34G7dRnWAExE6q0PFLm%2FrQQcFqtFM3GKMupCcMYcs2l652TQ0r9Dr3P%2FywOtRUVfJyDZHZse3Pohkxi0%2F%2F%2Bu5zBKC3h5GpH1nbacLkXbsrg5ZGJriQraVYstvneS1APSjL35tF6s9%2BJ%2BgJN28DUL1GNrDmhxHOvMMAmUS35Xt%2FYXdRMeTp3%2Bx5d4TspSxCqqlQEtlk4NtvutK2XWBns%2FeYXCislcvHHVTCPdhjwGEWjvXM8WQ7s9QtPSHxnWOSwK6EYlA24KwKoPtVO%2BueXhanNUNmgfAjhntjGZHSCV82X84BwlLj%2BTtekMTwLB57YlHiTNajz9ckN%2FapvV5XH4Budb%2BbrBlSxg0y0mV%2FGblkUPY2ijFp8bQBqYJfAQM0nBTog%2BxD6kFjl2MRHC60S9gHgSdc7K5m3rjj67Ab%2BKLKcBRDDvKjpIXSWB7lM%2ByG5Rxht1kECiF1x2IszgwCfhOn5JEmP%2BzJSEMMnJCs1OIPWG%2FpFRsYViv677HGwFsnO4XcwUnnwJE0SRm2P18NqYhBltS%2BOENyUTDbVjzlTHM7gxwlQXXDvEBY2Sw%2BPRTiYcUj28IJ78d%2FjUtJacUpIP5s0VXZNb1clS5odo8Gb0RPR1cjvxqqJxuq5bc8zr9rGo8BawrG6KBkOrSejYbJ1CpSeKcpcdrbmM1dST0BzXEfiG7dpDHNC81f60YnEaOSbs4k6DpmLdlPl%2BnzjSpFYt%2FuhTctdhxTsIzMkiYCz1vsjhh3w0iYTxg63OalPW%2BBwE4atKyUoIzdplUHFFW0lDL7988Y%2FtFS%2Bs23%2BPBkATu%2FtYiWhaHQfIY%2FNKyjl3RI3yS2pkDC7atw9wz%2FvuxCLCTqs1OmmVk60VMObpKhj9T35dBRv8ibT%2BwIqkkJFRZ%2FfW0pjq67INxE4FvX5a1yFv2kY0s2RSWvjBERYd9ptEegXN4wVxl2Ix1CyoSfphS7ElBmuzrd1pn6VIbBKjTwXzNZrpInqbD1k42E5biyVU1KHQ7TXkvVJphOPh%2BghHozVboMz%2FPIM1bzspw1O3IBolXPCDYpnfsVr%2BSlNdzLYZ4gPgG%2F4oIKG%2FS1AxvxZYXS70pxStWg0SXHXv4JY1YGN83X%2BhH96KYehsYUbrQKOufoAR2F1C8UKutPmxvsvJlIGTVe0oK0kM9zSd6hrOvV3dHk3FdN8vStRDzbG9dWGyBDFFMC98R65Tp%2FfPFEbYFKX%2BkKbOM942rTfcbfdMi4YonfIxCc%2FjqTAiFvEgciYxyKoep1z92OuXxygNRCcW0LJvBSEgn0qRApDEd4c4e%2BUbWTLUvsJRSdrgsxQdU6dQ%3D)
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953829/9ba26791-3964-9410-f353-6ac53b164ba7.png)
怪しさしかありませんねwww
###適当な質問
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953829/cf98193c-5992-5243-a37a-f9b9d3616944.png)
###プログレスバーを使って回答を送信、在庫情報の受信をしているように見せかけて
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953829/ae67dc22-0d91-e643-5be5-42d6321f969d.png)
###結局リストは１つしかないという
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953829/0102ec1d-0d82-5193-9691-f10c1cff6f29.png)
###ついさっき実在の人物がコメントしたかのよう
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/953829/3261997f-d071-803f-a1cd-3de0fb9376d1.png)

これらすべてがフロントにスタティックに書かれているのが面白いです。
Wordpress REST APIで画像投稿する場合はMIME typeを指定するようになってる

```post_image.php
function post_image($image){
    $WP_USERNAME = 'user';
    $WP_PASSWORD = 'pw';
    $url = 'http://example.com/wp-json/wp/v2/media';
    $file = $image;
    
    $data = wp_remote_get($file);
    
    $image_response = wp_remote_post( $url, array(
    'headers' => array(
        'Authorization' => 'Basic ' . base64_encode($WP_USERNAME.':'.$WP_PASSWORD),
        'Content-Disposition' => 'attachment;filename=' . basename($file),
        'Content-Type' => 'image/jpeg' 
        //ここを指定しないとendpointが403を返す。Wordpress5.4.4まではなくてもいけた
        //mime_content_type()はネットワーク越しだと動かなかったのでとりあえず手打ち
    ),
    'body' => $data["body"]
    ));
 
    $data = json_decode($image_response['body']);
    $media_id=$data->id;
    return $media_id;   
}
```
Raspberry Pi zero wにOSをインストールし、ラズパイカメラからwifi経由でPCブラウザにプレビュー表示するまで

#はじめに
Raspberry Pi zero w基板とRaspberry Pi用のフレキのカメラを買ってきて、Windows10 PCを利用して(linux PCとか使わずに)、ラズパイカメラからwifi経由でPCブラウザにプレビュー表示するまでの手順を記します。

#環境
* Raspberry Pi zero w 基板
* Raspberry Pi用Camera V2.1(フレキケーブルでラズパイ基板本体と接続)
* 32GB SDカード
* USB 標準Aオス⇔micro USBオス　のケーブル(ラズパイへの電源供給用)
* Windows 10 PC
* WiFiルーター
* Tera Term Version 4.105
* テキストエディタ（[サクラエディタ](https://sakura-editor.github.io/)を使った）

#OSのインストール
1. インストーラのダウンロード
[Raspberry Pi公式サイトのソフトのサイト](https://www.raspberrypi.org/software/)で自分に合ったOSのパッケージをクリックする。
ここでは、Windows 10 PCにSDカードを挿してインストールするので
Download for Windows をクリック。(↓2021/1/26時点のサイトのスクショ)
![スクリーンショット 2021-01-26 085402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/f878e6a5-3b28-f34c-e410-fe1ef531e772.png)


2. インストーラの実行
ダウンロードした実行ファイルを実行する。
OS　は　推奨OS(デフォルト選択)
SD CardはインストールしたいSDドライブを選択
WRITEボタン押下
確認ダイアログが表示されるので、書き込みOK となるほうをクリック
書き込み中のプログレスバーの%表示が増えていって、Verifyも終わったら、「SDカードをreaderからremoveしてもいいよ」という意味の英文が表示されるので、抜く。

#SDカード上のファイルをWinで編集、作成。
##SSH有効化
SDカードのルートフォルダに ssh という名前の空ファイルを作成する。
##WiFi接続有効化
SDカードのbootパスに以下の内容の wpa_supplicant.confファイルをテキストエディタ等で作成する。

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="SSID"
    psk="Passphrase"
}
```

#カメラの接続と動作確認
##フレキで接続
[CodeZine Raspberry Pi Zeroとカメラを接続して定点観測しよう](https://codezine.jp/article/detail/11194)
の写真付説明が比較的わかり易かった。

##SSH接続
* ラズパイのUSB端子にUSBケーブル接続して電源供給する。
* WiFiルーターの　DHCPクライアント表示機能などを用いて、ラズパイ基板のIPアドレスを調べる。デフォルトのままだとホスト名　raspberrypi　がラズパイ。
* TeratermのSSH接続で上記IPアドレスに接続する。(ユーザー名：pi、パスワード（デフォルトなら）：raspberry）

##ラズパイ環境のソフト更新
TeratermのSSHコンソールで以下を実行。

```
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install -y wget
sudo apt-get dist-upgrade
```

##カメラ有効化
WiFi経由でTeratermでSSH接続し、

```
sudo raspi-config
```
Interfacing Options→P1 Camera→Would you like the camera interface to be enabled?で<はい>を選択する。

※**少しハマったところ！** SSHコンソールやシリアルコンソールでraspi-configのメニューを選択する時の話。カーソルキーやタブキーで項目間移動が出来る。ただし、選択した項目を実行するのはリターンキーではなく**スペースキー**。

##静止画撮像確認
* TeratermでSSHコンソールで以下を実行。

```
$ raspistill  -w 1920 -h 1080 -o test.jpg
$ ls -l
```

* Teratermメニュー→ ファイル → SSH SCP... で　下側のFromにラズパイ上に作成された（上記なら test.jpg）のフルパスを、下側のTo:にWindows上のフルパス(参照ボタン使用可)をそれぞれお入力し、Receiveボタン押下で、ラズパイからwin 10にファイル転送　![2021-01-22 (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131546/78b8b08d-507c-8efe-3074-af4222821596.png)

* 適当なビューワー(IrfanViewとか)でtest.jpgを表示。それらしい画像になってることを確認。

#ラズパイでカメラ画像をストリーム配信させて、PCブラウザで表示
##MJPG-streamerのインストール
[mjpeg-streamerのインストール&設定](https://raspi-katsuyou.com/index.php/2020/06/30/11/10/44/644/)　に沿ってMJPG-streamerというパッケージをインストール。

`sudo apt install git cmake libjpeg8-dev`のコマンド実行中にディスク使用容量確認されるので Yを入力しEnter押下。

* 自動起動しないなら、`2.起動スクリプトを作成`までを実行すればOK

##MJPG-streamerの実行し、PCブラウザカメラ画像を表示
インストール後に作成した　start.sh　を実行し、PCブラウザ(Google Chrome等)で　ラズパイのIP:8080 にアクセスし、start.shに記載してある ユーザIDとパスワードを入力すれば、MJPG-Streamerのデモ画面？が表示される。Streamingをクリックするとプレビュー表示可。

*参考にしたURL
https://www.richardcastera.com/blog/setting-headless-raspberry-pi-zero-w-camera/
https://codezine.jp/article/detail/11194
https://qiita.com/go-to/items/409e32116213bdf4b1ce
有難うございました。
【Vuetify】v-data-table のレスポンシブデザインがデプロイ後に崩れる

## 環境
Vue.js 2.6.12
Vuetify 2.3.21

## 事象
開発中のアプリケーションの一部にVuetifyのexpanded付きv-data-tableを利用しています。expandedの配列の中にs3にアップロードした画像URLが含まれています。まずデバッグツールでテスト操作を行い問題ないことを確認後にデプロイ、スマホ端末で実際にサイトにアクセスし確認してみるとレスポンシブデザインが崩れるという問題が発生していました。
Qiitaやstackoverflowなど色々当たっても同様の報告が見当たらなかったので、ご参考まで私自身の回避策を共有させていただきます。

具体的には下の動作を見ていただいた方が早いかと思います。（横方向へのスライド操作は想定していません）
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641876/8cc02dc0-5f72-0afd-9f4c-91fe0ebaec44.gif)
(説明)
スマートフォンではユーザー毎の投稿を下方向にスライドして見ることが出来、かつ「^」の展開ボタンをクリックすると投稿に紐づくさらに詳細なグラフやコメントが確認できるようになります。
本来は下方向にしかスライドできないはずなのに、1:展開ボタンをクリックして投稿の詳細を展開 2:展開ボタンをさらにクリックして展開された行を閉じると、何故か次の投稿が**横方向に並んで**しまいます。原因がハッキリしておらず推測ですが、expandedに画像データを含めると発生してしまうため、展開されるexpandedの情報の中に画像データが最初にURLとしてレンダリングされる事と関係しているのかと考えています。

## 回避策
モバイル端末での閲覧時には展開ボタンをクリック時に強制的に再レンダリングを行うように変更する強制的にtableタグのwidthを固定させる事で解決しました。(styleでのwidth指定やvue.jsのwatchを使ったwidth操作は色々試しましたがうまくい機能しませんでした・・・)
ポイントは
1. mixinによる`window.addEventListener`を使った`isMobile`props(boolean型)による閲覧端末がモバイル端末か否かの判定
2. `v-data-table`タグ内の`:key`propsの設定です

## isMobileの判定
私は以下のmixinを`app.vue`にimportをして常に`isMobile`の情報を取得するようにしました。

```javascript:mixin
export default {
  data: () => ({
    isMobile: false,
  }),
  beforeDestroy () {
    if (typeof window === 'undefined') return
    window.removeEventListener('resize', this.onResize, { passive: true })
  },
  mounted () {
    this.onResize()
    window.addEventListener('resize', this.onResize, { passive: true })
  },
  created () {
  },
  methods: {
    onResize () {
      this.isMobile = window.innerWidth < 450
    },
  },
}
```

## v-data-tableのprops
ここの`:key`に`isMobile`がtrueの時のみ`expanded.length`がバインドされ、変更時に`v-data-table`が再レンダリングされます。`expanded.length`は現在展開している行数となるので、つまり、展開ボタン『^』をクリックするたびに再レンダリングされ`table`タグの`width`が強制的に固定されます。

```javascript
    <v-data-table
      <!-- 省略 -->
      :single-expand="singleExpand"
      :expanded.sync="expanded"
      show-expand
      <!-- ポイント -->
      :key="isMobile ? expanded.length : ''"
      calculate-widths
      widths="100%"
    >
```

なんとか解決できました。
![タイトルなし.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/641876/a6d193e5-82c5-8521-43a1-a83c9df58954.gif)
USキーボードで入力ソースを簡単に切り替える

## まえがき

USキーボードで日本語と英語入力の切り替えにしばらく苦戦していましたが、決着がついたのでまとめました。

## 設定方法

### Google 日本語入力

Appleの変換が怪しい時があるので、こちらを入れています。

https://www.google.co.jp/ime/
下記画像のように、入力ソースをひらがなと英数だけにしています。
![スクリーンショット 2021-01-25 15.48.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178646/8e008b25-ecf4-3844-681e-6cb7ae27e4fb.png)


### Karabiner-Elements

キーボードのカスタマイズを行うために、Karabiner-Elementsというソフトをインストールします。
いろいろなことができますが、ここでは入力ソースの変更のみを設定します。

![スクリーンショット 2021-01-25 15.22.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178646/2415198f-e75e-cf2c-0dfa-402f57ccb5e4.png)

`Complex modifications`→`Add rule`→`Import more rules from the Internet(open a web browser)`からルールをインポートする。
[For Japaneseで検索](https://ke-complex-modifications.pqrs.org/?q=For%20Japanese)で検索して、`For Japanese （日本語環境向けの設定） (rev 6)`をインポートする。

![スクリーンショット 2021-01-25 15.33.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178646/accbde77-3d18-0287-5f58-044930fec4c2.png)

再度ルールの追加に戻り、`コマンドキー(左右どちらでも)を単体で押したときに、英数・かなをトグルで切り替える。(rev 2)`を適用すると、コマンドキーの押下で入力ソースを切り替えられるようになる。

![スクリーンショット 2021-01-25 15.34.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178646/2ac9a788-6731-bab1-e041-76b775a80d85.png)


## あとがき

Karabiner-Elementsをもっと活用すればいろいろなことをショートカットできそうなので、なにかおすすめあったら教えていただきたいです。
Go: MQTT の pub/sub

次のページを参考にしました。
[GoでMQTTのpub/subを試す](https://tutuz-tech.hatenablog.com/entry/2019/12/29/194537)
ブローカーは broker.emqx.io です。

## subscribe

```go:subscribe.go
// ---------------------------------------------------------------
//
//	subscribe.go
//
//					Jan/25/2021
// ---------------------------------------------------------------
package main

import (
	"fmt"
	"log"
	"os"
	"os/signal"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	msgCh := make(chan mqtt.Message)
	var f mqtt.MessageHandler = func(client mqtt.Client, msg mqtt.Message) {
		msgCh <- msg
	}
	opts := mqtt.NewClientOptions()
	opts.AddBroker("tcp://broker.emqx.io:1883")
	cc := mqtt.NewClient(opts)

	if token := cc.Connect(); token.Wait() && token.Error() != nil {
		log.Fatalf("Mqtt error: %s", token.Error())
	}

	if subscribeToken := cc.Subscribe("go-mqtt/sample", 0, f); subscribeToken.Wait() && subscribeToken.Error() != nil {
		log.Fatal(subscribeToken.Error())
	}

	signalCh := make(chan os.Signal, 1)
	signal.Notify(signalCh, os.Interrupt)

	for {
		select {
		case m := <-msgCh:
			fmt.Printf("topic: %v, payload: %v\n", m.Topic(), string(m.Payload()))
		case <-signalCh:
			fmt.Printf("Interrupt detected.\n")
			cc.Disconnect(1000)
			return
		}
	}
}

// ---------------------------------------------------------------
```

実行の準備

```bash
go mod init subscribe
go mod tidy
```


実行コマンド

```bash:subscribe.sh
go run subscribe.go
```

## publish

```go:publish.go
// ---------------------------------------------------------------
//
//	publish.go
//
//					Jan/25/2021
// ---------------------------------------------------------------
package main

import (
	"os"
	"fmt"
	"log"
	"time"

	mqtt "github.com/eclipse/paho.mqtt.golang"
)

// ---------------------------------------------------------------
func main() {
	fmt.Fprintf (os.Stderr,"*** 開始 ***\n")
	opts := mqtt.NewClientOptions()
	opts.AddBroker("tcp://broker.emqx.io:1883")
	cc := mqtt.NewClient(opts)

	if token := cc.Connect(); token.Wait() && token.Error() != nil {
		log.Fatalf("Mqtt error: %s", token.Error())
	}

	for it := 0; it < 5; it++ {
		now := time.Now ()
		text := fmt.Sprintf("こんにちは %d ", it) +
			fmt.Sprintf ("%s",now)
		token := cc.Publish("go-mqtt/sample", 0, false, text)
		token.Wait()
	}

	cc.Disconnect(250)

	fmt.Println("Complete publish")
	fmt.Fprintf (os.Stderr,"*** 終了 ***\n")
}


// ---------------------------------------------------------------
```

実行の準備

```bash
go mod init publish
go mod tidy
```

実行コマンド

```bash:publish.sh
go run publish.go
```

## 確認したバージョン

```text
$ go version
go version go1.19.2 linux/amd64
```
Xcodeインストール時の容量不足の対処方法について

# 環境
- MacBook Air(2019)
- Catalina バージョン 10.15.7

# 問題
- Xcodeのインストール時に容量不足でインストールが出来ない。
- 14GBの空きディスク容量でもインストール出来ない。

# 対処方法
1. 空きディスク容量を確認する
「🍎」　→　「このMacについて」　→　「ストレージ」

2. 容量を増やす
 - ゴミ箱を空にする
 - 不必要なアプリケーションを削除する 

3. 下記URLからダウンロードする
https://developer.apple.com/download/more/

4. 最新バージョンだと容量が大きいため、過去のバージョンをダウンロードすると問題無く、インストール出来る
※ただし、古すぎるバージョンだと自分のMacに対応していない可能性もあるので、下記記事を参考に確認する
https://qiita.com/thinkalot/items/1dfdba642906c1bf1fd2

# 注意点
Xcode 10.xip(5.4GB)をダウンロードしたい時に約2倍近くのGBが必要になる。
実際は、展開するとXcode 10(12GB)になる。
しかし、12GB分容量を用意しても容量不足でインストール出来ない事があり、その場合は空き容量を増やす事で解決できる。

# 最後に
Xcode容量デカすぎ！！
変えるなら今しかない！Windowsで「npm install」を早くする方法

今回は「npm install」について書いていきます。

ところで皆さん、「http」と「https」の違いって分かりますか？

簡単に言うと、

- http（Hyper Text Transfer Protocol）： 暗号化されていない
- https（Hyper Text Transfer Protocol Secure）： 暗号化されている
かなりアバウトですが、イメージはこんな感じです。

文字通り、httpsの方が安全ということです。

また、サイトを実際のサーバーにあげるときも、https化していないと検索結果の上位に行かないらしいです。（本当かはわからない）

それは当然ですよね。

今の世の中、セキュリティ対策をしていないサイトなんてほぼないんじゃないかって印象です。

このhttpsには証明書と言うものが必要で、これを発行していないとhttps化はできない仕組みになっています。

まぁ、この話はこの辺にしておいて、npmは実際に``https://registry.npmjs.org``と言う場所からインストールしています。

ちゃんと「https」になっていますね！

ただ、npmのインストールが遅い原因はここにあります！！！

httpsは先ほども言ったように、証明書と言うものが必要で、かつそれが本当に正しいのかを判断しています。

これが原因で「npm install」が遅くなってしまいます。

なので、これをhttpと設定してあげます。

以下のコマンドを打つことで設定することができます。

```
npm config set registry http://registry.npmjs.org/ --global
```

再起動も忘れずに。

ちゃんと解決されました！

ただ、僕自身まだセキュリティに関してはそこまで詳しくないので、悪魔でこれは**自己責任**でお願いします。

以上、「変えるなら今しかない！Windowsで「npm install」を早くする方法」でした！

良ければ、LGTM、コメントお願いします。

また、何か間違っていることがあればご指摘頂けると幸いです。

他にも初心者さん向けに記事を投稿しているので、時間があれば他の記事も見て下さい！！

Thank you for reading
Material-UIのBadgeにスタイルを適用する方法

日本語情報が見つからなかったため(※1)備忘録として残しておきます。

※1: Material-UIの公式ドキュメントの日本語訳に**おそらく**存在するが、わしゃーわからん

# 状況

ページ上部のツールバーをデフォルトよりも狭くしているため、アイコン＋バッジ表示をさせるとしっかりと収まりきらないのでなんかもやもやする

```react
const useStyles = makeStyles((theme) => ({
  navbar: {
    height: 32,
    minHeight: 32,
  },
}))
```
```react
  <AppBar position="static">
    <Toolbar className={style.navbar}>
      <IconButton aria-label="show 17 new notifications" color="inherit">
        <Badge badgeContent={17} color="secondary" >
          <Notifications fontSize="small" />
        </Badge>
      </IconButton>
    </Toolbar>
  </AppBar>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/a1640e9b-903c-7726-ca18-95101cc9e29d.png)

# 対応策

`Badge`の`classes`に`{badge: style}`の形でスタイルを渡してやるとうまくいくらしい

```react
const useStyles = makeStyles((theme) => ({
  navbar: {
    height: 32,
    minHeight: 32,
  },
  badge: {
    height: 15, // デフォルトは20
    fontSize: '0.6rem' // デフォルトは0.75rem
  }
}))
```

```react
  const style = useStyles();
  <AppBar position="static">
    <Toolbar className={style.navbar}>
      <IconButton aria-label="show 17 new notifications" color="inherit">
        <Badge badgeContent={17} color="secondary" classes={{badge: style.badge}} >
          <Notifications fontSize="small" />
        </Badge>
      </IconButton>
    </Toolbar>
  </AppBar>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85205/39c8f092-71c6-e611-5ed3-bfb34182d01e.png)

# 結果

収まったけど文字が小さい

# 参考

[How to style the badge component? - Stack Overflow](https://stackoverflow.com/questions/57076205/how-to-style-the-badge-component)


> You can add styles to the inner span using the classes attribute:
`<Badge badgeContent={"11"} classes={{badge: classes.myBadge}}>`
>Where myBadge is defined in makeStyles:
`const useStyles = makeStyles((theme) => ({
  myBadge:{
    right: "inherit",
  }
}));`