OmniAICreator/Qiita-1.07M huggingface dataset:
Windows 10でMAiX IIにアクセスする

#0.初めに
前回の記事でUbuntuからMAiX IIのmaix linuxにアクセスするのにpicocomと言うツールをつかいました。今回はWin10環境でシリアル通信アプリを使ってアクセスしてみます。

#1.PCとMAiX IIの接続（物理）
使用したPCはWin10 Pro バージョン2004、ビルド19041.746です。
PCからMAiX IIをリモートで操作するには、MAiX IIをLANにぶら下げてLAN経由でアクセスするか、直接接続するかをえらべます。が、LANへの接続はWiFiを使わなければならず、技適の壁があるため、今回はPCとMAiX IIをUSB Type Cケーブルで直結します。MAiX側はUARTインターフェースに接続してください。
まだMAiXのファームを書き込めていない場合は[こちらの記事](https://qiita.com/airpocket/items/0c06772712d8d5cfbe4b)を参照してSDカードにファーム（Maix linux）を書き込みましょう。

#2.PCとMAiX IIの接続（通信）
Ubuntuではpicocomを使いましたが、Win10ではRloginを使用します。これまではPuttyを使用していたのですが、評判よさげなRloginをためしてみました。もちろんTeratermやほかのシリアル通信アプリでもOKです。

設定は次の通りです。

①デバイスマネージャを開いて、MAiX IIが接続されているCOMポートを確認する。MAiX IIを接続するとポートが二つ現れますので若い方の番号のポートを使用します。どのポートかわからない場合は、デバイスマネージャを開いた状態で抜き差ししてみましょう。
![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/60b2774b-a75e-9551-0a91-8eb39f159e7e.png)

②Rloginを立ち上げ「ファイル」→「サーバーに接続」。Server selectウインドウが立ち上がるため、「新規」を選択。
![010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/c70884ae-8953-3474-838c-3cf6f21cfad6.png)

②プロトコルを「com」にチェック、TCPポートは①で調べたCOMポートを選択。エントリー/コメントは好きな名前を付けましょう。
![011.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/d282c453-c468-2000-d0ec-ec78139267a7.png)

③シリアルの「設定」を開き、ビット/秒(B)を115200に変更して「OK」。
Server New Entryウィンドウも「OK」
![012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/c21f9823-e512-a7a8-ba60-b1fa05efae59.png)

④Server Selectウィンドウに今作った設定ができているので、選択して「OK」で接続できます。そのまま中をさまようもよし、resetボタンを押してブートシーケンスを眺めるもよし。楽しんでください。

#4.おまけ

##4-1.SDカード
SDカードはSanDisk Ultra 64GBを使用しています。class10 A1のやつです。
インストール後のディスク使用量はこの程度でした。![005.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/feb606e8-bfcb-15ae-346d-dda3473b601e.png)


##4-2.MaixPy3
せっかくなのでMaixPy3をインストールします。
リモートログインしている状態でつぎのコマンドですが、最初からインストールされてた気もします。未確認。

```sh
opkg update
pip3 install maixpy3
```
ついでに

```sh
opkg list
pip3 list
```
でどんなパッケージが入っているか眺めると楽しいかも。
あとはドキュメントを読み込んで足りない部分は想像力で。。

[MaixPy3 中国語ドキュメント](https://maixpy.sipeed.com/maixpy3/zh/origin/difference.html)
[MaixPy3 英語ドキュメント（GitHub)]
(https://github.com/sipeed/MaixPy3)

MaixPy3(実行上はpython3.8.5）も立ち上げてモジュールを眺めておきます。
![004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496179/af142646-f6e5-fc92-465e-ac38d6bfaa7c.png)

#5.まとめ
pythonに関しては追加モジュールを入れて動作を確認していきたいところです。MaixPyはできることが限られていましたが、こちらはかなりの拡張性が期待できそうです。Jupyter notebookも使ってみないとね。
iOSのウィジェットを対応する上で知っておきたかった点

業務で自分がウィジェット対応した際に必要だった知見が何個かあったのでまとめておく:iphone:
これからウィジェット対応する人の手助けになれば:muscle:

## サイズ指定
[supportedfamilies](https://developer.apple.com/documentation/widgetkit/staticconfiguration/supportedfamilies(_:))で指定

```swift
struct SampleWidget: Widget {
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "sample", provider: SampleWidget.Provider()) { entry in
            SampleWidgetEntryView(entry: entry)
        }
        .supportedFamilies([.systemSmall, .systemMedium])
        .configurationDisplayName("displayName")
        .description("description")
    }
}
```

## WidgetBundleで複数ウィジェット

[WidgetBundle](https://developer.apple.com/documentation/SwiftUI/WidgetBundle)で複数パターンのウィジェットを設定可能

`@main`アノテーションを忘れずに

```swift
@main
struct Widgets: WidgetBundle {
    var body: some Widget {
        Widget1()
        Widget2()
        Widget3()
    }
}
```

## Imageの角丸
ウィジェット自体が角丸なので、画像も角丸にするのが定石だと思うので
`clipshape`と`RoundedRectangle`で可能

iOS14から登場した`.clipShape(ContainerRelativeShape())`でOSが自動で角丸描画してくれるが、近接する要素によって思い通りの角丸にならないケースがあるので注意

```swift
  struct ImageView: View {
        let image: UIImage
        var body: some View {
           Image(uiImage: image)
                .resizable()
                .scaledToFit()
                .clipShape(RoundedRectangle(cornerRadius: 8))
        }
    }
```


## プレビュー
ライトモード、ダークモード、プレースホルダー、サイズ違いを一気に確認したいと思うので

##### ウィジェットサイズ
[previewContext](https://developer.apple.com/documentation/widgetkit/widgetpreviewcontext)
`.previewContext(WidgetPreviewContext(family: .systemMedium))`で指定

##### ライトモード、ダークモード
[colorScheme](https://developer.apple.com/documentation/swiftui/colorscheme)
`.environment(\.colorScheme, .light)`で指定
 
##### プレースホルダ
`.redacted(reason: .placeholder)`で指定


```swift
struct SampleWidget_Previews: PreviewProvider {
    static var previews: some View {
        /// ライトモード
        SampleEntryView(entry: .init(date: Date())
            .previewContext(WidgetPreviewContext(family: .systemMedium))
            .environment(\.colorScheme, .light)
        /// ダークモード
        SampleEntryView(entry: .init(date: Date())
            .previewContext(WidgetPreviewContext(family: .systemMedium))
            .environment(\.colorScheme, .dark)
        /// プレースホルダー表示
        SampleEntryView(entry: .init(date: Date())
            .previewContext(WidgetPreviewContext(family: .systemMedium))
            .redacted(reason: .placeholder)
    }
}

```

## SpacerのminLength
[docページ](https://developer.apple.com/documentation/swiftui/spacer/init(minlength:))

12ProMaxから初代SEまでのレイアウトに対応しなくていけなく、`Spacer(minLength: length)`を結構使った

指定した座標分最低限スペースを取り、描画領域に余裕があれば自動で広がってくれるのでとても便利！
RxSwift まとめ

# はじめに
<!-- 発端や概要を記載 -->
RxSwiftについてまとめた内容をアップします。（ま今後も随時編集していきます）

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [RxSwiftが受け入れられる理由は？](#RxSwift)
1. [Driver](#driver)
1. [Trait](#trait)
1. [Hot-Cold](#hot-cold)
1. [参考文献](#reference)


<a id="#RxSwift"></a>
# RxSwiftが受け入れられる理由は？

- メソッドチェインを使いつなげた関数型プログラミング
- 時間の概念を取り入れたリアクションをコードにできる（ ex: debounceメソッド）
- MVVMによる処理の分離テストと書きやすさ



<a id="#driver"></a>
# DriverとSignal

###Driver の効力
##### subscribe +
- メインスレッドで通知
- shareReplayLatestWhileConnected を使った Hot変換
- エラーを伝達しないことを前提とする

**参考**: [Rxcocoaが提供するDriverって何？](https://qiita.com/k5n/items/44ef2ab400f47fb66731)

###Signal 
replayされないDriver
⇨ replayされない = 過去のイベントを保持せず、なおかつ値を保持しないこと。
  UIButtonのタップイベントなどに向いている。

<a id="#Trait"></a>
# Trait


**メリット**
Observableの生成 + read-only
ex) Single, Completable, Maybe

**参考**: [RxSwift Traitについて](https://qiita.com/shoheiyokoyama/items/40b9a2e9f8ae747c477a)


<a id="#Hot-cold"></a>
# Hot-Cold
- HotなObservableはsubscribeされなくても動作する。
- HotはObservableは前のColdを動作させる。
- HotなObservableは分岐できる。
- HotなObservableはObserverを複数持てる。
- HotなObservableのイベントは各Observerで共有される。
- 各Observerに対して同じイベントが送出される。つまりそこまでのColdは何度も呼ばれない(分岐の性質)。
- すでに流れたイベント(Next)は送出されない。つまり途中からsubcribeすると途中からしか受け取れない。
- ColdなObservableはsubscribeするまで動作しない
- ColdなObservableは分岐できない
- ColdなObservableはObserverを１つしか持てない。2つ持とうとするとストリームが2つになる。

**参考**: [今日こそ理解するHot / Cold @社内RxSwift勉強会](https://www.slideshare.net/yukitakahashi3139241/hot-cold)

<a id="#Hot変換"></a>
# Hot変換
- Hot変換するには
    - ConnectableObservableに変換後、connect()を呼ぶ
    - RefCountに対して1つ以上subscribeを行う。（RefCountはsubscribeすることによって内部でconnect()を呼び出す）

**参考**: [今日こそ理解するHot変換](https://www.slideshare.net/yukitakahashi3139241/hot-64131190)

<a id="#reference"></a>
# 参考文献
- [オブザーバーパターンから始めるRxSwift入門](https://qiita.com/k5n/items/17f845a75cce6b737d1e)
- [Rx研究読本 I ]
(https://booth.pm/ja/items/1076262)
AWS CLIでECSタスクを止める

# コマンド

```
$ aws ecs stop-task --cluster {クラスタ名} --task $(aws ecs list-tasks --cluster {クラスタ名} --query "taskArns[0]" --output text)
```

## 参考

`--output text`を指定することでダブルクォートを排除できるため、` | sed -e 's/"//g'`などsedを使う必要がない。

AWS CLI からのコマンド出力の制御 - AWS Command Line Interface
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output.html
Dockerコンテナ内で矢印キーが使えない現象について

#はじめに
非常に不便に感じていた、Dockerコンテナ内で矢印キー（またはCtrl+PとかCtrl+N）が使えない現象。
ようやく解決できたので、解決手順の備忘録残しときます。
**ごめんよDocker。僕が悪かった…。**

（※ 根本的な解決策ではないと思います。もし原因が分かる方いたらご指摘いただけるとありがたいです。）

#起こっていた現象
`$ docker-compose exec #{container} sh`でコンテナ内に入ると、
↑矢印キーが`^[[A`、↓矢印キーが`^[[B`などと判断され、ショートカットできない。

`#{container}`はサービス名（コンテナ名）。
Docker学習開始時からこの現象に悩まされ、渋々コンテナ外部からrailsコマンド等の操作をしていました…。

#解決方法
`$ docker-compose exec #{container} /bin/bash`とすることで解決。

なぜ`sh`ではダメで、`/bin/bash`だといけるのかはよく分からないんですが、
[こちらのサイト](https://nishinatoshiharu.com/create-sandbox-with-docker/#ABCD)をヒントに、ターミナル上で`$ echo $SHELL`を打ったところ、


```terminal:ターミナル
$ echo $SHELL
/bin/bash
```
と表示されたので、`/bin/bash`を試しました。

何となくですが、`bash`と`sh`それぞれのシェルスクリプトの働きの違いによるものなのかな…と感じています。
もう少し調べてみる必要がありますね（汗）
【Rails】Kaminariで、ページネーションを解除する方法

# 結論
ページネーションしているインスタンスに、以下の記述を追加する。

```ruby
.except(:limit, :offset)
```

## もう少し詳しく

```ruby
# 全件取得
@users = User.all

# 全部で100件
@users.count # => 100



# 30件ごとにページネーションして、１ページ目を取得
@users = @users.page(1).per(30)

# 全部で30件
@users.count # => 30



# ページネーションを解除
@users.except(:limit, :offset)

# 全部で100件
@users.count # => 100
```
二部グラフの隣接行列を Biadjacency Matrix を用いて省メモリに持つ 

グラフ$G=(V, E)$は$|V|\times |V|$の行列で表すことができます．この行列を${\bf A}$とした時，${\bf A}_{ij}$を頂点$i$と$j$を接続するエッジの重みとした行列を隣接行列 (Adjacency Matrix) と呼びます．

ところで，同一の集合内の頂点を接続するようなエッジが存在しないようにグラフの頂点集合を2集合に分割できるようなグラフを二部グラフ (Bipartite Graph) と呼びます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227269/c76da63c-4b2b-6756-8a36-cab3e609303a.png)
この図のグラフは，赤い集合，青い集合それぞれの要素である頂点同士を接続するエッジが無いので二部グラフです．赤い線で囲まれた頂点集合を$V_{\rm red}$，青い線で囲まれた頂点集合を$V_{\rm blue}$と呼びます．また，このように隣接する頂点が存在しない頂点集合を「独立集合」と呼ぶことにします．

当然ですが，二部グラフも隣接行列を用いて表すことができます．図の二部グラフを隣接行列で表すと

```math
{\bf A} =
\begin{bmatrix}
0 & 0 & 1 & 0 & 0 & 0\\
0 & 0 & 0 & 1 & 0 & 0\\
1 & 0 & 0 & 0 & 0 & 0\\
0 & 1 & 0 & 0 & 1 & 1\\
0 & 0 & 0 & 1 & 0 & 0\\
0 & 0 & 0 & 1 & 0 & 0\\
\end{bmatrix}
```

この行列は十分に疎なので，それを利用して省メモリに持つことも可能なのですが，今回は二部グラフの性質を利用してみます．

グラフにおいて重要なのは，頂点の接続情報です．よって，一般に頂点番号は自由に入れ替えてしまって構いません．このことを利用して，頂点番号を独立集合ごとにまとめてしまいます．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227269/a61b4142-a2d4-b6f4-21b5-3cd526082db5.png)
この図では，$V_{\rm blue}$側を若い番号でまとめましたが，逆でも構いません．この状態で隣接行列を書き出してみます．

```math
{\bf A} =
\begin{bmatrix}
0 & 0 & 0 & 0 & 0 & 1\\
0 & 0 & 0 & 0 & 1 & 0\\
0 & 0 & 0 & 0 & 0 & 1\\
0 & 0 & 0 & 0 & 0 & 1\\
0 & 1 & 0 & 0 & 0 & 0\\
1 & 0 & 1 & 1 & 0 & 0\\
\end{bmatrix}
```

よく観察すると，${\bf O}_{n\times n}$を$n\times n$の零行列として，このような形で表現できることがわかります．

```math
{\bf A} =
\begin{bmatrix}
{\bf O}_{|V_{\rm blue}|\times |V_{\rm blue}|} & {\bf B}_{|V_{\rm blue}|\times |V_{\rm red}|}\\
({\bf B}^T)_{|V_{\rm blue}|\times |V_{\rm red}|} & {\bf O}_{|V_{\rm red}|\times |V_{\rm red}|}\\
\end{bmatrix}
```


二部グラフにおいて，同一の独立集合内の頂点同士が接続されないことと，頂点番号を独立集合ごとにまとめたことにより，行と列それぞれが若い番号 (今回で言うと$|V_{\rm blue}|$以下の値)となる左上の部分と，それより大きい番号(今回で言うと$|V_{\rm blue}|$より大きい値)となる右下の部分がすべて0となります．
よって，二部グラフの接続情報は行列${\bf B}$にすべて集約することができ，$|V|\times |V|$の行列から$|V_{\rm blue}|\times |V_{\rm red}|$の行列で表せるようになりました．また，この${\bf B}$を**Biadjacency Matrix**と言います．(日本語訳するとしたら「二部隣接行列」？)

# 余談
Biadjacency Matrix という単語を聞いたことすらない上に，日本語記事もWikipedia くらいしか見つけられなかったので書いてみました．
実は[NetworkX](https://github.com/networkx/networkx)に[ライブラリ](https://networkx.org/documentation/stable/reference/algorithms/generated/networkx.algorithms.bipartite.matrix.biadjacency_matrix.html)があったり，[EcologicalNetworks](https://github.com/EcoJulia/EcologicalNetworks.jl)における二部グラフはこの形式で扱う必要があるようです．
また，[二部グラフのコミュニティ検知に関する論文](https://journals.aps.org/pre/abstract/10.1103/PhysRevE.76.066102#fulltext)で式変形などの際に用いられたりしているようです．

あと省メモリ目的なら疎行列であることを活かしてCSR形式などで持った方が良い気がします．(書いた後に気付きました)
環境変数の命名規則

#プログラミング勉強日記
2021年2月10日
環境変数の命名規則を知らなかったので、備忘録として残す。

#環境変数の命名規則


- 半角英数字と`_`(アンダーバー)が使用できる
- 先頭は必ず大文字
- 変数名の長さに制限はないが、setコマンドは4096文字以上で実行はできない
- 英文字の大文字・小文字は区別する
- 値に空白等の特殊文字を含む場合は値全体を`"`,`'`(クォーテーション)で囲む

(基本的には大文字で書くらしい…？)

#Windowsの場合
　Windowsの場合は、環境変数名の小文字の使用可否を指定するVAR_ENV_NAME_LOWERCASEパラメーターの指定によって使用できる環境変数名が変わる。

##VAR_ENV_NAME_LOWERCASEパラメーターを無効にした場合

- 小文字を含む環境変数名は使えない(小文字が含まれる変数をエクスポートするとエラーになる)

##VAR_ENV_NAME_LOWERCASEパラメーターを有効にした場合

- 小文字を含む環境変数名を使用できる
- `adsh`から始まる環境変数名は小文字で定義してはいけない

#参考文献
[4.86 環境変数の設定](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/setup/set.html)
[5.1.2　変数](http://itdoc.hitachi.co.jp/manuals/3021/3021313330/JPAS0163.HTM)
Centos8 + Softether 設定メモ

自分用メモ。
Windows 10に何も入れずにSoftether踏み台を利用する。
(より簡単かも　https://curio-shiki.com/blog/diary/awsvpn )

# 必要なもの
- ドメイン
- パブリックネットワークにあるサーバー

# 手順
1. サーバーを契約。IPを調べる。
2. IPにドメインを設定。
3. サーバーの設定
    - Softether VPN Server, httpd, certbotを入れる
        - snapインストール　https://computingforgeeks.com/install-snapd-snap-applications-centos-7/
        - Softeherインストール　https://blog.blue.wirednet.jp/2020/02/09/90/freebsd%E3%81%A7lets-encrypt%E3%81%AA%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%A7softether%E3%82%B5%E3%83%BC%E3%83%90%E3%82%92%E7%AB%8B%E3%81%A6%E3%82%8B/
        - certbot用apache設定　https://hacknote.jp/archives/48748/
        - Softetherに証明書を設定　https://hacknote.jp/archives/4928/
        - firewalld設定。certbot設定時だけhttpを有効にしておく。https://blog.cles.jp/item/7295
4. WindowsにVPN Server設定ツール入れて諸々設定
    - 仮想HUB作る
    - IPSEC/L2TPを有効化。共有キーを覚えておく。
    - ユーザーを作っておく
5. Windowsの設定でVPN接続を作る
    - ドメイン名で指定
    - 事前共有IPSEC/L2TP
    - アカウントは４で作ったものを入れる
6. Windowsのネットワークアダプタの設定変更
    - VPNのアダプタのプロパティを変更
        - 種類はIPSEC
        - 暗号化が必要
        - MS-CHAPだけ有効化
      
# エラーのときのチェックリスト
- サーバーのfirewallルールは正しいか？
- ルーターのIPSECパススルーはOK？
- 共有キー、ユーザー名/パスワード

# おまけ
- エラーメッセージ役に立たねー（Firewallが空いてないのにセキュリティうんぬんとか）
- AssumeUDPEncapsulationContextOnSendRule は設定不要。

# もしかすると
Softetherのツールで生成する証明書でも動くかも。
データ分析の時に覚えておきたいファイルフォーマットの話

# 上司「え？このテーブル、Pickleで保存してるの？」

PythonのpandasやDask、VAEXなどでデータ分析をしていると
保存するデータが大きくなってしまいディスク容量がひっ迫したり
読み込み、書き込みに時間がかかって作業が進まなくなってしまうことがあります。
そういう時には保存するファイルフォーマットを変えてみるといいかもしれません。

Pickleの話
---
Pickleを分析対象のデータのメインの保存形式にすることはおすすめしません。
なぜなら、Pickleは長期保存に適さないからです。

PickleはPythonに標準装備されているバイナリフォーマットの保存方法です。
あらゆるPythonモジュールをそのままバイナリ化して保存することができるので非常に扱いやすく、
バイナリフォーマットなのでIOもCSVよりも圧倒的に早くなります。

Pickleを使う際のデメリットは以下の２つです。
- Pythonのバージョン、ライブラリのバージョン間の互換性がない。
- Python以外の言語、ツールでは扱えない。

つまり、少しでも使用環境が変われば使えなくなってしまいます。
Celeryなどを使ったデータ処理の中間データを使う分にはPickleでいいと思いますが、
長期的に使う場合やチームメンバーに共有したい場合はPickleの使用は避けるべきだと思います。

HDF5
---
HDFはHierarchical Data Formatの略で階層的にデータをあつかうフォーマットです。
複数のExcelファイルをまとめて一つのHDF5ファイルにするなんてこともできます。
HDFViewというJavaベースのGUIもあるらしいです。使ったことはありません…
h5pyで大体の構造はわかるので今のところ事足りています。

バイナリフォーマットということもあり読み書きの速さはCSVと比べて10~20倍早いです。

Pythonでビッグデータの分析をするためのライブラリにVAEXがありますが
VAEXではほとんどの使用例がHDF5で書かれており、HDF5でなければ本来のパフォーマンスを発揮できません。
（VAEXのHDF5の形式とpandas, DaskのHDF5の保存形式は異なるので注意が必要です。）

APIもCSVとほぼ同じです。
Daskでも使う場合は`format="table"`を忘れないようにしましょう。

```python 
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_hdf.html
df = pd.DataFrame([[1, 1.0, 'a']], columns=['x', 'y', 'z'])
df.to_hdf('./store.h5', 'data', format="table") # Dask用にformatを追加
reread = pd.read_hdf('./store.h5')
```
Apache Parquet
---
使ったことはありませんがHDF5との比較でよく見かけます。
圧縮ファイルサイズが小さく、読み書きの速度は若干HDF5より遅いですがCSVよりは圧倒的に早いです。
AWS AthenaなどのAWSのサービスとの互換性が高く使えるという点もHDF5より優れています。
こちらも同様のAPIで使えます。

```python 
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_parquet.html

df = pd.DataFrame(data={'col1': [1, 2], 'col2': [3, 4]})
df.to_parquet('df.parquet.gzip',
              compression='gzip')  
pd.read_parquet('df.parquet.gzip')  
```

結論：HDF5かParquetを環境や条件に合わせて使いましょう。

AWSなどの解析環境と使えるストレージによってHDF5、Parquetを使い分けるといいです。
データの行数、列数によってまた優劣が変わるらしいのでその辺も今後調べていきたいです。

---
記事を書いてからこちらの記事を見つけました。
圧倒的に詳しくてわかりやすい…
https://qiita.com/simonritchie/items/a1a18a36de3c658cf816
WSL2にcode-serverをインストールして外部アクセス可能にする

#code serverのインストール
```
curl -fsSL https://code-server.dev/install.sh | sh
```

#WSL2でcode serverの起動
passwordは任意のものを入れておく

```
PASSWORD=password code-server --bind-addr=0.0.0.0:8080 --auth=password --allow-http
```

#windows側のポートフォワードの設定
netshを使ってポートフォワードする

ポートフォワードするにはまずWLS2のIPアドレスを知る必要がある。
これは再起動するたびに可変なので注意

wls2側で実行
```
hostname -I
```

IPアドレスが確認できたので、上記IPアドレスを使ってポートフォワードの設定を行う。
管理者権限でのpowershellにて実行

```
netsh.exe interface portproxy add v4tov4 listenport=8080 connectaddress={WLS2 IP}
```
設定できたかの確認は以下

```
netsh interface portproxy show v4tov4
```

#8080ポートの解放
Windows PowerShellにて実行

```
New-NetFireWallRule -DisplayName 'WSL 2 Firewall Unlock' -Direction Inbound -LocalPort 8080 -Action Allow -Protocol TCP
```
Nest.js で簡単な  WebAPI を作成

ほぼ、こちらのページと同様です。
[NestJS CLIで初心者でも簡単にNode.js REST APIが作れる！](https://qiita.com/FukuharaYohei/items/71d2293a084d71b27b54)
>バージョンと、題材を日本文学にしたことが異なります。

環境
Arch Linux で動かしました。

```text
$ nest info

 _   _             _      ___  _____  _____  _     _____
| \ | |           | |    |_  |/  ___|/  __ \| |   |_   _|
|  \| |  ___  ___ | |_     | |\ `--. | /  \/| |     | |
| . ` | / _ \/ __|| __|    | | `--. \| |    | |     | |
| |\  ||  __/\__ \| |_ /\__/ //\__/ /| \__/\| |_____| |_
\_| \_/ \___||___/ \__|\____/ \____/  \____/\_____/\___/


[System Information]
OS Version     : Linux 5.15
NodeJS Version : v17.3.0
NPM Version    : 8.3.0 

[Nest CLI]
Nest CLI Version : 7.6.0 

[Nest Platform Information]
platform-express version : 7.5.1
common version           : 7.5.1
core version             : 7.5.1
```

プロジェクトの作成

```bash
nest new -p npm project02
```

動作の確認

```bash
cd project02
npm run start:dev
```

クライアントでアクセス

```text
$ curl http://localhost:3000
Hello World!
```

Module の作成

```bash
nest generate module test
```

Interface の作成

```bash
nest generate interface test/test
```

src/test/test.interface.ts の修正

```ts:src/test/test.interface.ts
export interface Test {
	id: string;
	name: string;
	author: string;
}
```

Service の作成

```bash
nest generate service test
```

src/test/test.service.ts の修正

```ts:src/test/test.service.ts
import { Injectable } from '@nestjs/common';
import { Test } from './test.interface';

@Injectable()
export class TestService {
private readonly test: Test[] = [
    {id: 't101', name: '草枕', author: '夏目漱石' },
    {id: 't102',  name: '走れメロス', author: '太宰治' },
    {id: 't103', name: '千曲川のスケッチ', author: '島崎藤村' },
    {id: 't104', name: '高瀬舟', author: '森鴎外' }
]

// private readonly test: Test[] = [{id: 'a', name: 'Alex'}, {id: 'b', name: 'Bob'}, {id: 'c', name: 'Cathy'}];

  listTest(): Test[] {
    return this.test;
  }

  getTest(id: string): Test {
    return this.test.find(value => value.id === id);
  }
}
```

Controller の作成

```bash
nest generate controller test
```

src/test/test.controller.ts の修正

```ts:src/test/test.controller.ts
import { Controller,Get, Param } from '@nestjs/common';
import { TestService } from './test.service';
import { Test } from './test.interface';

@Controller('test')
export class TestController {
    constructor(private readonly testService: TestService) {}

    @Get()
    listUsers(): Test[] {
      return this.testService.listTest();
    }

    @Get(':id')
    getTest(@Param('id') id: string): Test {
      return this.testService.getTest(id);
    }      
}
```

サーバーの起動

```bash
nest start
```

クライアントでアクセス

全件取得

```test
$ curl http://localhost:3000/test | jq .
[
  {
    "id": "t101",
    "name": "草枕",
    "author": "夏目漱石"
  },
  {
    "id": "t102",
    "name": "走れメロス",
    "author": "太宰治"
  },
  {
    "id": "t103",
    "name": "千曲川のスケッチ",
    "author": "島崎藤村"
  },
  {
    "id": "t104",
    "name": "高瀬舟",
    "author": "森鴎外"
  }
]
```

id を指定して取得

```text
$ curl http://localhost:3000/test/t102 | jq .
{
  "id": "t102",
  "name": "走れメロス",
  "author": "太宰治"
}
```
FFmpeg で現在時刻入りのテスト映像ソースを作ろう！

# やりたいこと
FFmpeg で現在時刻入りのテスト映像ソースを作って、RTMP でライブ配信サービスに突っ込んで、配信サービスの遅延をテストしたい。

こんな感じのやつ。
![スクリーンショット 2021-02-10 173556.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/199379/43caee16-f70f-095a-59aa-2abe207f2811.png)

# 手順
## 必要なソフトのインストール
FFmpeg をどうにかしてインストールしてください。筆者は Windows 10 で実験しましたので、下記リンクから Windows 用のバイナリを落としてきて、C:\bin\ffmpeg に ffmpeg.exe を置きました。

[Download FFmpeg](https://ffmpeg.org/download.html#build-windows)

## ライブ配信用のサービスのセットアップ
筆者は Azure のなかの人なので、Azure Media Services の Live Channel を作りました。
（ここの手順はあとで別記事で書きたいと思います。）
たぶん RTMP/RTMPS で受けられるサービスなら何でもいいと思います。

Azure Media Services の Live Streaming の機能を使う場合、[このあたりのドキュメント](https://docs.microsoft.com/ja-jp/azure/media-services/latest/live-streaming-overview)の手順に従って、ライブ配信の準備をした結果として、インジェスト用の URL として以下のようなものがポータルに表示されました。

```bat
rtmp://ライブチャンネル名.channel.media.azure.net:1935/live/自動生成されるパラメーター
```

そこにおまじないを一言加えた以下の URL を使うと、動画のインジェストが可能です。

```bat
rtmp://ライブチャンネル名.channel.media.azure.net:1935/live/自動生成されるパラメーター/mystream1
```

## あとはコマンド一発
コマンドプロンプトを開いて、以下のコマンドで RTMP でインジェストが始まります。コマンドの最後の URL のところを、自分が使っているインジェスト先に変えれば、どこのサービスにも RTMP でこのテストソース映像を打ち上げられると思います。

```bat
ffmpeg.exe -re -f lavfi -i "sine=frequency=440:sample_rate=44100" -f lavfi -i smptehdbars -vf drawtext="fontfile=monofonto.ttf: fontsize=24: box=1: boxcolor=black@0.75: boxborderw=5: fontcolor=white: x=(w-text_w)/2: y=((h-text_h)/2)+((h-text_h)/4): text='%{localtime}'" -strict -2 -c:a aac -b:a 128k -ar 44100 -r 30 -g 60 -keyint_min 60 -b:v 400000 -c:v libx264 -preset medium -bufsize 800k -maxrate 400k -f flv rtmp://ライブチャンネル名.channel.media.azure.net:1935/live/自動生成されるパラメーター/mystream1
```

# まとめ
FFmpeg のコマンドオプション、順番によって動いたり動かなかったりと大変面倒なのですが、これがどなたかの役に立ちましたら幸いです。

もっといいコマンドあるよ！というコメントもお待ちしております！
[Rails] credentials.yml.enc、master.keyについて。

## 結論

秘密鍵: master.key

公開鍵:  credentials.yml.enc

## master.keyとは
・暗号化された「credentials.yml.enc」の記述を復号化するための鍵のようなもの
####・アプリを消して、同じものをクローンした時点で、無くなっているから、credential.yml.encを再生成する必要がある。
[[Rails] ActiveSupport::MessageEncryptor::InvalidMessageの解決方法](https://qiita.com/kazumawada/items/c1dd676a42f9286bfccf)

## credentials.yml.encとは

中身はこんな感じで暗号化されている

```bash
LEebK7Oel2pwADz3qzaLXWYHR12UexPU097wLK9FPnnRjZXPY7ZtSBsr96yCcC5r3dKRZrzzvwkmHO7hmuMgF+fiEOEWczncvQ50XuqMC2GDXiAsK0AyuF59eJ7EzzjiYT6FLS9Hvqk8W6IKHvFRf6BsgmVjGKVhp6KIyCeU/wzTpI5s75cl4ahn1CUCfLsxjXeGKFxlYIdgFgi1h+bYPhFPs2EVagdDHir/g2pWlofJkCAdbuJFstA/qNc40mC3Pb8DPoCP1HGCXDMPGrOPSPpEefJhw2lHj5l5TOvcRWNh5q0+fjhgrUbEGD/R+uu4VqSDVXQ+eNUvS5BQbGK/09L/woCq3zz8Wg77KV53TD2uuYV83bTYTWtOvcegd4jfJFBu8i5GfTBC2yO
```

暗号とくとこんな感じ

```erb
# aws:
#   access_key_id: 123
#   secret_access_key: 345

# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: 8be8e637d755f79c799048bed8be0c...
```

編集するコマンド

```bash
EDITOR="vi" bin/rails credentials:edit
```


もっと詳しく
https://zenn.dev/banrih/articles/f22f0a70bbead2a02110
Vue2 + composition-api + TypeScript + Storybook

# Vue2 + composition-api + TypeScript + Storybook

## 既存の Vue プロジェクトに追加する流れ

### 1. Storybook の追加

下記のコマンドを実行する。

```sh
$ npx -p @storybook/cli sb init
```

### 2. Storybook の addon を追加

```sh
$ npm i @storybook/addon-knobs --save-dev
```

他にも、いろんな addon があるけど、knobs があればコンポーネントへの入力パラメータの設定が楽にできる。

### 3. Storybook の設定

#### 3-1 .storybook/main.js を編集する。

```js
module.exports = {
  stories: ["../src/**/*.stories.mdx", "../src/**/*.stories.@(js|jsx|ts|tsx)"],
  addons: [
    "@storybook/addon-links",
    /* 削除 "@storybook/addon-essentials", */
    /* essentials は option 指定して controls を非表示とする */
    {
      name: "@storybook/addon-essentials",
      options: {
        controls: false,
      },
    },
    /* knobs を追加 */
    "@storybook/addon-knobs",
  ],
};
```

#### 3-2 .storybook/preview.js を編集する。

```js
export const parameters = {
  actions: { argTypesRegex: "^on[A-Z].*" },
};

/* composition-api を使用する場合、ここでuse()する */
import Vue from "vue";
import VueCompositionApi from "@vue/composition-api";
Vue.use(VueCompositionApi);
```

## Storybook の実行

```sh
$ npm run storybook
```

## stories ファイルの作成

Storybook でコンポーネント一覧に表示させるために、vue と同じフォルダに `(任意名称).stories.ts` を作成する。
（社内ルールであって、実際はどこでも良い）

```ts
import { storiesOf } from "@storybook/vue";
import { action } from "@storybook/addon-actions";

/* パラメータのtypeによって適宜importを追加する */
import { text } from "@storybook/addon-knobs";

/* 表示したいコンポーネントを importする */
import SampleComponent from "../components/SampleComponent.vue";

/* ここから定義開始 */
storiesOf("サンプルコンポーネント", module).add("default", () => ({
  /* 'template' で使用するコンポーネントを指定 */
  components: { SampleComponent },
  /* コンポーネントの入力プロパティを定義する */
  props: {
    propval: {
      default: text("文字列値", "hello"),
    },
  },
  /* コンポーネントから発行されるイベントを受け取る関数を定義 */
  methods: {
    gotevent: action("got the event"),
  },
  /* レンダリングする templateを記述 */
  template: `<SampleComponent :value="propval" @sampleevent="gotevent" />`,
}));
```
[Svelte]GitHub Pageへデプロイ

タイトル通り。Gatsbyで同じようなことをしてたのでまんま同じだけど一応メモ書き。

## tl;dr

- GitHub Actionでビルド、その結果を`gh-pages`ブランチにデプロイする
- GitHubのSettingsにてホスティング先を`gh-pages`ブランチに設定する
- 実際にアクセスしたらホスティングされてる

## e.g.

https://github.com/snamiki1212/example-svelte/commit/a648afa826109d537d967d18f8fbedf2084bc17c
[Rails] ActiveSupport::MessageEncryptor::InvalidMessageの解決方法

## なぜこのエラー？

credentialとmaster.keyの整合性が取れていない。
[[Rails] credentials.yml.enc、master.keyについて。](https://qiita.com/kazumawada/items/fb63806d74d89cbdf70f)

>「端的にcredentials.yml.encの文字列とmaster.keyの文字列の組み合わせが不正解であるということです。」

https://hirocorpblog.com/rails-credentials-master/

他にも
> if you delete your project local and clone it again your master.key will be lost.

> The only way to fix this is by setting up new credentials.yml.enc and add your AWS credentials to it again.
First you need to remove the existing credentials.yml.enc and then run: rails credentials:edit to create a new one.

https://stackoverflow.com/questions/63348058/couldnt-decrypt-config-credentials-yml-enc-perhaps-you-passed-the-wrong-key

つまり、master.keyがなんらかの理由で(gitからclone, docker再ビルドetc)変わった、無くなった。

↓

credential.yml.encと整合性が取れない。

## 解決方法

credential.yml.encファイルの消して、

```bash
rm credentials.yml.enc
``` 

```bash
EDITOR=vim bin/rails credentials:edit
```

でmaster.keyを再び作る

<br>

こういう書き方でも出来ました

```
# rm credentials.yml.enc
# rails credentials:edit
No $EDITOR to open file in. Assign one like this:

EDITOR="mate --wait" bin/rails credentials:edit

For editors that fork and exit immediately, it's important to pass a wait flag,
otherwise the credentials will be saved immediately with no chance to edit.
# EDITOR="mate --wait" bin/rails credentials:edit
Adding config/master.key to store the encryption key:*******************

Save this in a password manager your team can access.

If you lose the key, no one, including you, can access anything encrypted with it.

      create  config/master.key

File encrypted and saved.

```
vs2010でmfc その2

#概要

vs2010でmfcやってみた。
fizzbuzzやってみた。

#手順

- mfcアプリケーション、ダイアログベースでプロジェクト名は、mfc0で作る。
- IDD_MFC0_DIALOGを開く
- edit controleを貼る。
- OKボタンをクリック。
- コードを書く。
- 実行。

#サンプルコード

```
void Cmfc0Dlg::OnBnClickedOk()
{
	CString str;
	CString v;
	int i;
	for (int i = 1; i <= 100; i++) 
	{
		if ((i % 15) == 0)
		{
			v.Format(_T("%s\r\n"), _T("FizzBuzz"));
		}
		else if ((i % 3) == 0)
		{
			v.Format(_T("%s\r\n"), _T("Fizz"));
		}
		else if ((i % 5) == 0)
		{
			v.Format(_T("%s\r\n"), _T("Buzz"));
		}
		else
		{
			v.Format(_T("%d\r\n"), i);
		}
		str = str + v;
	}
	SetDlgItemText(IDC_EDIT1, str);	
}

```

以上。
【Rails】 SimpleCovの概要・導入・オプション

#はじめに
「SimpleCovって何？」っていう状態から導入をしましたので、調べたことについてまとめておきます。
全くSimpleCovについて知らない方が、個人開発や業務で導入して設定するまでの参考になれば幸いです。

ちなみに筆者は最近エンジニアとして働き出したレベルの者です。

#目次
- [そもそもSimpleCovとは](#そもそもSimpleCovとは)
- [コードカバレッジとは何か](#コードカバレッジとは何か)
- [導入方法](#導入方法)
- [使い方](#使い方)
- [オプションの設定](#オプションの設定)

#対象読者
・SimpleCovってそもそも何という方
・SimpleCovは知っているけど実際の導入の仕方を知りたい方
・導入はとりあえずできるけど、追加でどんなオプションがあるか知りたい方

#環境
- Ruby 2.7.2
- Rails 6.0.3
- rspec-rails 4.0.2
- simplecov   0.21.2

#そもそもSimpleCovとは
・Ruby用のコードカバレッジ分析ツール
（分かりやすく言うと、コードカバレッジを計測するためのgemです。）

[公式ドキュメント] https://github.com/simplecov-ruby/simplecov
>SimpleCov is a code coverage analysis tool for Ruby.

#コードカバレッジとは何か
- テストの対象となるプログラムコードのうち、テストされたコードの割合（％で表示される）

##### 余裕がある方向け
- コードカバレッジには、厳密には3つの種類がある（C0,C1,C2）
 - C0（ステートメントカバレッジ）:テストの対象となるプログラムコードのうち、命令文を実行した割合。
 - C1（ブランチカバレッジ）:テストの対象となるプログラムコードのうち、分岐の真/偽を実行した割合
 - C2（改良条件判定カバレッジ）：テスト対象となるプログラム中において、各ユニット内の条件・判定を網羅した割合
- そのうちSimpleCovが計測するコードカバレッジはC0（ステートメントカバレッジ）

##### 調べる中でテストカバレッジとコードカバレッジの違いが分からない方向け 
- コードカバレッジはテストカバレッジの一種
- テストカバレッジには、コードカバレッジ以外に機能カバレッジやデータカバレッジがある

#導入方法
###①Gemfileに以下を追加（→bundle insatll）
 
```:Gemfile
gem 'simplecov', require: false, group: :test
```

###②spec/spec_helper.rbの一番上の部分に以下を追加
```spec/spec_helper.rb
require 'simplecov'
SimpleCov.start

#デフォルトで記載されている部分
RSpec.configure do |config| 
.
.
end
```
#使い方
###①rspecを実行する
```
bundle exec rspec 
```
###②出力されたcoverage/index.htmlをブラウザで開く
コードカバレッジの計測結果（下の画像のようなもの）が出ていればOK
>[公式ドキュメントのサンプル画像] https://github.com/simplecov-ruby/simplecov
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866926/aa9b329b-6d56-60c2-69fe-9dbfab1b640b.png)

#オプションの設定
ここからは、オプションの設定について説明していきます。

###①フィルター
計測対象から指定したファイル名を含むファイルを除外する
導入方法の②で追加した`SimpleCov.start`にブロックでオプションの設定を渡していきます。

```spec/spec_helper.rb
SimpleCov.start do
 add_filter "/test/" #tesｔを含むファイルが計測対象から除外される
end
```
###②グループ化
計測結果を指定した内容でグループ化し、タブに分けて表示する
（グループ化していないものは`Ungrouped`というタブとなる）
導入方法の②で追加した`SimpleCov.start`にブロックでオプションの設定を渡していきます。

```spec/spec_helper.rb
SimpleCov.start do
 add_group "Models", "app/models" #add_group "グループ化名", "グループ化したいパス"
 add_group "Controllers", "app/controllers"
end
```

###③計測結果をCircleCIのARTIFACTSタブに表示
CircleCIでRspec実行後、CircleCI上の`ARTIFACTS`タブに`coverage/index.html`が含まれるようになる
（＊これは、`spec/spec_helper.rb`ではなく`circleci/config.yml`に下記コードを追加する）

```circleci/config.yml
- store_artifacts:
   path: coverage
```
Gravio 4のCO2データを送信する間隔を調整する

「[Gravio 4とPower BIでCO2を可視化する](https://qiita.com/zrock/items/08148659ebf523f5c160)」では、受信したCO2のデータをそのままPower BIに送信しました。GravioのCO2センサーは10秒毎にCO2を受信しますので、ちょっと頻度が多いかなと思うときがあります。
頻度を調整したいときは、トリガーの「間隔」で調整することが可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/16501d8c-9512-a357-d1b3-d82ce7d772cc.png)

この間隔は、トリガーの条件を評価する間隔だと考えてもらえればいいと思います。
`0`を指定した場合、はすべての受信したデータに対してトリガーが実行されます。
ミリ秒単位で時間を指定すると、その時間内は条件が合致してもトリガーは実行されません。

1分毎にしか実行したくない場合、ここを「60000」としておけばいいわけですが、実際にはちょうどぴったり10秒後にデータを受信した場合に動かなくなったりするかもしれないので、ここはちょっと余裕を見て「59000」と指定しておきます。

Power BI側でも約1分毎にデータが受信されるようになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/87b94ee0-883a-2b90-c3d4-59352d2c947a.png)

ちなみに、どうせなら1分間の平均値を使ったりしたいなぁと思いますが、それはちょっと作り方が変わるのでまた後日に。。


# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0

# 参考
* [Gravio][]
* [デバイストリガー](https://doc.gravio.com/manuals/gravio4/1/ja/topic/event-trigger)

[Gravio]:https://www.gravio.com/jp
🔰JavaScript　for文、if文の星の出力

自分用のメモです。

【表示させたい①】
★☆★
★☆★
★☆★
以下script.js　：
for(var a=1; a <4; a++){
    for(var i=0; i<3; i++){
        if(i%2 ==0){
            document.write("★");
        }else{
            document.write("☆");
        }
    }
document.write("<br>");
}
「解説：・１行につき、２つの星を交互に表示する。改行が必要。→２つのfor
文を使う。親要素は改行、子要素は、星を交互に表す。→偶数か奇数かの２パターン。」

【表示させたい②】
★☆★☆★☆
☆★☆★☆★
★☆★☆★☆
★☆★☆★☆
☆★☆★☆★
以下script.js　：
for(var i=1; i<= 25; i++){
    if(i % 2 == 1){
        document.write("★");        
    } else {
        document.write("☆");
    }
    if(i % 5 == 0) {
        document.write("<br>");
    }
}
「解説：・１行につき５つの星５行表示する、星を交互に表示する。→全部で星は２５個。５で割った時の余が０なら改行。偶数か奇数かで星の色を変える。」

【表示させたい③】
☆★★★★
★☆★★★
★★☆★★
★★★☆★
★★★★☆
以下script.js　：
for (var i = 0; i < 5; i++){
    for (var a=0; a <5; a+=1){
        if(a != i){
            document.write("★");
        } else{
            document.write("☆");
        }
    }    
    document.write("<br>");
}
「解説：１行につき２種類の星を５つ表示する。５つのうちの１つは、一番左から始まり、１つづつ右に移動する。→全部で５行必要。親要素のfor文の数が子要素と一致するかしないかの２パターンで星を表示する。」
Gravio呼び鈴のLINE通知を夜中は動かないようにする

「[Gravio 4で呼び鈴をバージョンアップしてLINE通知を追加してみる](https://qiita.com/zrock/items/0296b6d69f780605c933)」で呼び鈴を押したときにLINE通知するようにしてみましたが、始終通知されるのはウザいので業務時間内だけにしてみる。これ、とっても簡単。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/335d41cb-bc98-d31b-daec-d7d165d5d70b.png)

トリガーで「有効時間を指定する」にチェックし、開始時刻と終了時刻を指定するだけ。
これでオフタイムに呼ばれることはなくなります（笑）

逆にオフタイムだけなにかしたい場合は逆にすることも可能。これ地味に便利。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41603/21d370b1-6f31-c615-fa32-6057179bd29c.png)

こういうのが簡単にできるのがノーコードツールのよいところですね。

# 使用環境

* Raspberry Pi 4 Model B w/4GB RAM
* Ubuntu Server 20.04.1 LTS
* Gravio HubKit v4.1.0-6380
* Gravio Studio v4.1.5432.0

# 参考
* [Gravio][]
* [デバイストリガー](https://doc.gravio.com/manuals/gravio4/1/ja/topic/event-trigger)

[Gravio]:https://www.gravio.com/jp
Python実行時にVisual Studio Codeでデバッグ中かどうかを判定する

ある処理をデバッグ時とそれ以外で分けたい（※）ときに、どちらなのかを判定する方法 in VSCodeです。
※ PythonとC++の混合モードデバッグをしたいので、デバッグ時はデバッグ ビルドのpyd、それ以外はリリースビルドのpydを使いたい場合とか

`拡張機能インストール先\ms-python.python-2021.1.502429796\pythonFiles\lib\python\debugpy\launcher\__main__.p
y`（2021.1.502429796は今回確認したバージョン）に

```python:__main__.py
...略...
if __name__ == "__main__":
    # debugpy can also be invoked directly rather than via -m. In this case, the first
    ...長いコメント...
    if "debugpy" not in sys.modules:
        # Do not use dirname() to walk up - this can be a relative path, e.g. ".".
        sys.path[0] = sys.path[0] + "/../../"
        __import__("debugpy")
        del sys.path[0]
...略...
```

とあるので、実行したいスクリプトに以下のように書く:

```python:
import sys

if "debugpy" in sys.modules:
    print('VSCodeからデバッグされてます')
else:
    print('VSCodeからデバッグされてません')
```

('Д`)ふぅ...
WindowsユーザーがMacOSに慣れるまで（初級編）

# MacBookProが欲しい

当方しがないSEなんですが、iPhoneアプリの開発をしてみたいと思い立ち、何の気なしにMacBookProを買いました(無計画)。

# iPhone使ってるから余裕余裕

えっ、🍏ですよね？普段から使ってます、はい。

# あれ？
以下、備忘録
## 右クリックガナイ。。。
```
command + クリック
```

## 英数カナ切替。。。
当方、Windowsでは「Caps Lock」で切替しているのですが、Macではその位置は「control」


## P.S.
随時更新します。
【Laravel】初級　用語メモ

#MVCモデル
ルーティング→コントローラー←→モデル←→データベース
ルーティング→コントローラー→ビュー
ルーティング→ビュー

##モデル
データベースとやりとり
##ビュー
見た目
##コントローラー
処理
##*ルーティング
アクセスの振り分け
##*マイグレーション
データベースの履歴管理
Python Pycharmのインストール　

皆さん、記事主モノ（[My Twitter](https://twitter.com/El4lQmonosiwnf) へ）です。
今回も学んだことについて、一つ一つアウトプットを兼ねて、Pythonに関する知識や理解を皆さんと共有できたらと思います。
インストール方法は概ねWindowsもMacも変わりません

ではやっていきましょう！

#統合環境開発（IDE）ってなに？
まずPythonの統合開発環境IDEというのを説明させていただきます。
IDEというのは、 Integrated Development Environment の略であり、ソフトウェア開発に必要なソフトウェアを一つに組み合わせたもので、同じ操作画面から統一的な操作法で利用できるようにしたソフトウェアパッケージとなります。
そしてこのIDEは、プログラムを記述し、コードをコンパイルし、実行してデバックするという流れがあり、このプロセスを単一のツール上で行うことができます。
##IDEの一つPycharmについて
今回使っていくPycharmはjetbrains（[リンク先](https://www.jetbrains.com/ja-jp/)）社が提供するPython用のIDEです。
このIDEを使うときはpythonで中～大規模なアプリケーションを開発するときにオススメで、もちろん小規模でも大丈夫です。

唯一の欠点としては、高機能な分、起動に時間がかかります。

#それではPycharmをインストールしていきましょう！！

①[Pycharm](https://www.jetbrains.com/pycharm/)にアクセスをして、まずはインストールからです！
「DOWNLOAD」をクリックしてください

②そうしますと下記の画面に飛ぶので、「windows」（Macの方はそちらを）が選択されてるのを確認したら、「community」のdownloadをクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/2d386c8b-f7ac-6dc2-bc73-055f84eb93be.png)

③そうしたらダウンロードが開始されるのでしばらく待ちましょう。
今回ダウンロードするのはPyCharm Community（pycharm-community-2020.3.3.exe）がダウンロードされます。今回ダウンロードしたPyCharm Communityが、無料でオープンソースのIDEとなります。もうひとつののProfessionalは[こちらのサイト](https://pleiades.io/help/pycharm/quick-start-guide.html)をご覧いただけると幸いです。

④ダウンロードが完了しましたらファイルを実行して、問題なければ「Next」をクリックです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/56e8d978-88a3-ce67-df33-b014fbd4f25c.png)

⑤インストールするフォルダを確認したら、「Next」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/17cd26c4-6b19-25a0-4f23-a772ba5d27d5.png)

⑥インストールオプションの設定画面が出ますので、必要な項目があればチェックを入れてインストールしていきましょう。特に必要無ければショートカットの作成のみで大丈夫です。

↓項目の紹介です。（※[ランチャーとは](https://www.tvk.co.jp/faq/%E3%83%A9%E3%83%B3%E3%83%81%E3%83%A3%E3%83%BC%E3%81%A8%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F/)）
Create Desktop Shortcut：IntelliJ IDEAのランチャーデスクトップショートカットを作成する

Update PATH variable：IntelliJ IDEAコマンドラインランチャーを含むディレクトリを環境変数に追加する

Update context menu：コンテキストメニューに「プロジェクトとしてフォルダーを開く」を追加する

Create Associations：特定のファイル拡張子をIntelliJ IDEAに関連付けて開く

問題なければ「Next >」をクリックして進みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/b799dad9-c144-fb78-564d-b64a54bb31e7.png)

⑦スタートメニューのフォルダ名を確認したら、「install」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/15e5b7f2-5afc-01a1-b2be-2974c120f38f.png)

⑧最後に「finish」をクリックして、インストールは終了となります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/e987879f-8802-3bf5-4eda-3c3c1a4b8c0d.png)

##Pycharmを起動するには、スタートメニューの「JetBrains」→「PyCharm Community Edition 2020.3.3」をクリックします。
初めての起動の場合以下のような画面が出ますので「OK」をクリックしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/887bd2bb-38d1-2464-6f81-21d630256e1f.png)

そしてこの画面がでたら完了です。ここまでお疲れさまでした！！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/927177/918a670e-97cc-ccd4-530b-5613c9985f51.png)


#まとめ
今後アプリ開発など行っていくにはIDEが必要だなと思いまして、今回アウトプットも兼ねて書かせていただきました。
また最初は英語なので、日本語にする方法もあります。そちらは[こちらのサイト](https://mebee.info/2020/03/09/post-6394/)を参考にしてみてください。

今回も読んでいただいた方ありがとうございました！！

ではまた！
wordpressを使用したwebサイトの作成手順

下準備・ローカル環境でwordpressの構築作業
下準備・テスト環境（サブディレクトリ）へアップして、本番公開時にドメイン設定を本番用に切り替え

１・ローカル環境でのwordpress設定
・MAMP,XAMPPのインストールでローカルサーバ環境を作る。
・ローカルサーバ環境にwordpressをインストールする。
２・プラグインのインストール・設定
・一般設定、wordpressアドレス、サイトアドレスなど必要な設定を行なって、コーティング前の設定を完了。
・All in one SEO pack(SEO対策)、Google sitemap XML(SEO対策)、WP-PAGE NAVI(ページング機能)、BASIC AUTH(ベーシック認証)、SITE　GUARD PLUGIN（セキュリティ）
３・テーマファイルの設置
４・コーティング
・sublime text やdreamweaverなどのソフトを使用して、コーティング作業を進める。
・画像パスの変換。
・特定のカテゴリの記事のみを特定箇所に出力するなどの、HTML・CSSではできない動的なシステムの処理の作業を行ってCMSとして機能していくような作業をしていく。
５・動作検証やバグ修正
６・ドメイン・サーバ設定
・ドメインとサーバの紐付け。
７・サーバへアップロード
・サブディレクトリにwordpressをインストール、コーティングしたデータをアップロード。
・Basic認証をかけておく。
８・動作検証やバグ修正
９・公開作業
・FTP接続でindex.phpをダウンロードしてパスの表記を変更。
・管理画面のサイトアドレスのサブディレクトリのパスを削除。
・Basic認証の解除。
１０・運用開始
[Android] Kotlin の sealed class でステートマシン


```kotlin
class MainFragment : Fragment(R.layout.main_fragment) {

    override fun onResume() {
        super.onResume()

        lifecycleScope.launch {
            // 命令を与える例
            MainFragmentState.currentState.onHoge(this@MainFragment)
            
            // 現在のステータスを確認する例
            when {
                MainFragmentState.currentState.isIdle() -> {}
                MainFragmentState.currentState.isState1() -> {}
                MainFragmentState.currentState.isState2() -> {}
            }
        }
    }

    sealed class MainFragmentState {
        private object Idle : MainFragmentState() {
            override suspend fun onHoge(mainFragment: MainFragment) {
                // do something..
                delay(3_000)
                changeState(mainFragment, State1)
            }
        }

        private object State1: MainFragmentState() {
            override suspend fun enter(mainFragment: MainFragment) {
                // do something..
                delay(3_000)
                changeState(mainFragment, State2)
            }
        }

        private object State2: MainFragmentState(){
            override suspend fun enter(mainFragment: MainFragment) {
                // do something..
                delay(3_000)
                changeState(mainFragment, Idle)
            }
        }

        protected open suspend fun enter(mainFragment: MainFragment) {} // ステータス開始時の処理
        protected open suspend fun exit(mainFragment: MainFragment) {} // ステータス終了時の処理
        protected suspend fun changeState(mainFragment: MainFragment, nextState: MainFragmentState) {
            this.exit(mainFragment)
            // 裏でステータスが変わっている場合、または、次が同じステータスの場合は何もしない
            if (currentState != this || nextState == this) return
            currentState = nextState // 保持しているステータスを上書き
            nextState.enter(mainFragment)
        }

        // 外からの命令郡
        open suspend fun onHoge(mainFragment: MainFragment) {}
        open suspend fun onFuga(mainFragment: MainFragment) {}
        open suspend fun onPiyo(mainFragment: MainFragment) {}

        // 外からの命令で、どのステータスでも共通の処理はここにロジックを書いてしまう
        @CallSuper // 継承を許す場合は open にして @CallSuper アノテーションを付与しておく
        open suspend fun init(mainFragment: MainFragment) {
            changeState(mainFragment, Idle)
        }

        // サブクラスは外へ公開していないので、確認用のメソッドを別途用意
        fun isIdle(): Boolean = this is Idle
        fun isState1(): Boolean = this is State1
        fun isState2(): Boolean = this is State2

        companion object {
            // ここにステータスを保持する
            var currentState: MainFragmentState = Idle // 初期値
                private set // 外からの更新は禁止
        }
    }
}
```
Pandasで2つのデータフレームに共通する行だけ残す・削除する方法

Pandasで2つのデータフレームを比較して処理を行う方法をまとめます。<br>

例として以下のデータフレームを使用します。

```py
import pandas as pd

df_2017 = pd.DataFrame({'種類':[1, 2, 3, 1, 3], 'サイズ': ["S", "S", "M", "L", "S"], '平均価格': [200, 120, 250, 300, 260]}) 
df_2020 = pd.DataFrame({'種類':[2, 2, 1, 1], 'サイズ': ["S", "M", "L", "M"], '平均価格': [130, 180, 340, 280]}) 
```
 	
2017年のデータ

||種類 	|サイズ 	|平均価格|
|:----:|:--------:|:------------:|:------------:|
|0 	|1 	|S 	|200|
|1 	|2 	|S 	|120|
|2 	|3 	|M 	|250|
|3 	|1 	|L 	|300|
|4 	|3 	|S 	|190|

2020年のデータ

||種類|サイズ|平均価格|
|:----:|:--------:|:------------:|:------------:|
|0|2|S|130|
|1|2|M|180|
|2|1|L|340|
|3|1|M|280|


## 1. 共通する列を抽出する
2017年と2020年の両方に含まれる条件を抽出します。


```py
df = pd.merge(df_2017,df_2020, suffixes = ["_2017", "_2020"], on=['種類', 'サイズ'])
#両方に共通の列名があるため、suffixesで添え字を指定する。デフォルトは_xと_y。
```
結果

||種類|サイズ|平均価格_2017|平均価格_2020|
|:----:|:--------:|:---------:|:------:|:------:|
|0 	|2 	|S 	|120 	|130|
|1 	|1 	|L 	|300 	|340|

## 2. 共通する列を削除する
2017年のデータから、2020年のデータにはない条件のみを抽出します。

```py
df = pd.merge(df_2017,df_2020, on=['種類', 'サイズ'], how='outer', indicator=True)
#indicatorでどちらのデータフレームにあったかという情報を取得する
#mergeという列が追加され、both, left_only, right_onlyのいずれかが入る
df = df[df['_merge'] == 'left_only'].iloc[:,:3]
```
結果

||種類|サイズ|平均価格_2017|
|:----:|:--------:|:---------:|:------:|
|0 	|1 	|S 	|200.0|
|2 	|3 	|M 	|250.0|
|3 	|3 	|S 	|190.0|

以上です。
もっと楽なやり方があれば教えてください。
【頭の中の整理】やりたいことが定まらずにモヤモヤしている時にいつもやること

# 「最近、モヤモヤするなー」という症状
#### 「何か新しいことに取り組みたいけど、何から着手していいかわからない」

#### 「目の前に降ってくるタスクが多すぎて、それをさばくのに手一杯」

#### 「とにかくスッキリしない。モヤモヤする」
という症状、たまにありませんか？

私自身、サラリーマンエンジニアとして働いている中で、
ろくに優先順位も付けずに、がむしゃらに働いてしまうことが頻繁にあります

頭の中を整理しないことで、ふとした瞬間に、
「そういえばこれやるべきだった・・・」とか、
「他に忘れてること無いかな・・・」とか、不安になったり、

モヤモヤしている状態で開発に取り組むことで集中できずに生産性が上がらなかったりしますよね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/5e7526db-7a1c-0ea9-2056-71fb5a72eca0.png)

# モヤモヤ状態 ⇒ 頭の中を整理する
モヤモヤ状態におちいったときは、時間に少し余裕を持たせて、頭の中を整理するに限ります
その余裕が無いって人は、朝イチの時間（始業直前くらい）を使うのがオススメです
それすら取れないって人は、まずは早く寝てください
夜型の人は、夜にやるのも勿論OKです

それでは、頭の中を整理するオススメの方法を記載していきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/574ba606-ebd6-a701-b213-918a35a42b97.png)

# 頭の中を整理するオススメの方法
用意するのは、
・A4用紙
　圧倒的にオススメなのは、片面に印刷済みのA4用紙の裏
　 ⇒雑紙（ざつがみ）と読んでいたりします
　家に雑紙が無いという方は、まっさらなA4用紙でOK
・太めの水性ペン
　細めのペンでも良いが、スラスラ書ける水性サインペンあたりがオススメ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/f261d3f6-d976-3e5e-4d68-49ee4680126b.png)

手順は、たった1つ

### 「頭に浮かんだ言葉をひたすら箇条書きする」

単語でも、文章でもいいですが、
思考の流れを淀みなく書くために、簡素な文字で書けると良い

雑紙を使うのも、水性ペンを使うのも、
この「思考の流れを淀みなく書く」という行為のためのアイテムです

雑紙ではなく、まっさらなA4用紙や、メモ帳だと、
「キレイに書き上げたい」という気持ちが入って、書き出しが思うようにいかない

水性ペンではなく、ボールペンだと、
ほんのわずかな紙とペンの引っかかりが気になる

#### とにかく、頭の中に浮かんだこと
#### まずは仕事でやるべきこと、そして趣味としてやりたいこと、友人や家族との思い出づくり、
#### すべて洗いざらい書き出して、頭の中スッキリ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/88b593b4-ba70-ae53-f775-1f274960a4ef.png)

ある程度書き出せたら、
「今やるべきこと（Must）」
「今できていること（現在の自分の状態、Can）」と、
「今後やりたいこと（目標、ミッション、Will）」に大まかに分類します

今後やりたいことに対して、優先順位を付けて、達成していくための道筋を描くところは、
また別の話になってくるので割愛します

#### 閑話休題

実施する上でのFAQをいくつか

Q: 箇条書きするのであれば、パソコンで打ち込んでもいいの？紙とかめんどい
A: パソコンに入力する時点で、思考⇒キーボードの打鍵のわずかなラグが生じるため、紙とペン（アナログ）が優位です

Q: 紙だとかさばるから、データでやりたい
A: 書いてスッキリさせたらさっさと捨てるので紙でOK. 
　 すぐ捨てられるように雑紙に書く（きれいな紙に書いたら、取っておきたくなりますよね）

Q: それを捨てるだなんてとんでもない
A: 捨ててOK
　 また見返したいとなったら、自分の頭の中の引き出しから、さっと書き出せばいいんです
　 ドキュメントを見返す、という時点で、自分の頭の中が整理できていない証拠

Q: 恥ずかしい
A: 誰にも見せないものなので、恥ずかしいことなんてないはず

この際、恥も外聞も無く、夢とか野望を書いてみると意外な発見があるかも
パッと思いつきで「音楽作ってみたい/ピアノを引いてみた映像を動画に編集してみたい」とか「趣味の〇〇を△△の技術と組み合わせてちょっとしたサービスを作りたい」とか

# 効果あるの？
効果は一時的なものです
1回やったからと言って、永続的に効果のあるものではありません

私自身、「最近目の前のことに囚われすぎてるな」と思ったときに、
週1回、少なくとも2週に1回程度やっています

実施していくたびに、
書き出しのストレスが低減されていくのが実感できます

そうすると、自分が「何を今大切にしているか」が段々と明確になってきます

「仕事：家族：友人：その他趣味」
の割合がどの程度のものなのか

仕事の中でも、
顧客対応に時間を取っているのか、製品開発/要素技術の開発に時間を割いているのか、
仕事を更に充実させて自己実現するためにやりたいけど時間を取れていないことは何なのか、
業務時間内であっても主体的な活動が出来ているのか

最近、連絡取れていないけど、遠方の家族や友人に連絡してみようとしたり、
好きなことで活動できるグループ、サークルに参加したり、

効果は多岐にわたると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/454916b0-0131-a3f8-01fd-83042ca27a8c.png)

# おわりに
今回は、頭の中を整理するためにやってみると良いことを書きました

配偶者がいる場合には、ご家族でやってみると、面白い発見があるかもしれません
妻と、「やりたいこと/将来やってみたいこと」をお互いにA4用紙に箇条書きしてお互い発表し合うのをたまにやってますが、夫婦間のモヤモヤ解消につながっている気がします


「新しいことに挑戦したい」、「既存の業務で手一杯で先々のことが見通せない」
という方の一助になれば幸いです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188038/7519485f-014b-e7df-5d8c-daa177f15955.png)
CSSだけでハートを作る方法

# どうも7noteです。フォントの♥では面白くないので、CSSでオリジナルハートを作ります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/15b565d8-5c26-bef4-448b-c727d7a33889.png)

CSSだけでできちゃうハートの作り方です。
正直な話、使いどころはあまり思いつかないですが、結構自由に作ることができると思うので
画像じゃなくCSSの勉強として取り組んでみるのはアリかなと思います。

## ハートの作り方

```index.html
<div class="heart"></div>
```

```style.css
.heart {
  width: 100px;  /* 正方形を作る */
  height: 100px; /* 正方形を作る */
  position: relative;/* 基準位置とする */
}
.heart::before,
.heart::after {
  content: "";  /* 疑似要素に必須 */
  width: 50%;   /* ハートの丸い部分の大きさにかかわる */
  height: 80%;  /* ハートの高さにかかわる */
  background: #E0548E; /* ハートの色 */
  border-radius: 25px 25px 0 0; /* ハートの半円を生成 */
  display: block; /* ブロック要素にする */
  position: absolute; /* 相対位置に指定 */
}
.heart::before {
  transform: rotate(-45deg); /* 左に回転 */
  left: 14%;                 /* 左からの位置を指定 */
}
.heart::after {
  transform: rotate(45deg);  /* 右に回転 */
  right: 14%;                /* 右からの位置を指定 */
}
```

## 解説

上部が半円の長方形を2つ、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/86af76d5-68b4-1609-c0aa-076788d9dba2.png)


こいつを回転させて、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/f2cd11d3-9035-8251-0f3b-0860902f9d3e.png)


フュージョン！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/89e7dab9-d534-8f3e-9621-ca35e811c566.png)

**完成。**

## まとめ

CSSに慣れてくれば結構様々な形が作れるようになります。
まぁCSSで作る必要のないものも多いですが、いろいろな形を作れるということはそれだけCSSのプロパティを使いこなせているという自信にもつながるのでぜひ思いついたものをCSSで作ってみたりしてください。結構楽しいです。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
ブランチの内容を他のブランチにmergeする(ローカル)

#ブランチの内容を他のブランチにmergeする
自分が毎回下記の事象が落ちたとき調べるのが手間だったので記録。
メモ程度なので読みづらいと思いますがお許しを:disappointed_relieved:(後々修正します)

リモートではLGTM待ち中でまだmergeできない！
ローカルで新しいブランチを切って次の機能を実装したいけど、まだリモートでLGTM待ちでmerge出来ていない内容を反映させた上でないと、次の機能が実装できないというとき！

私はローカルのみでmergeするという手段をとっています。(もっと良い方法があるかもしれませんが)
そして、リモートでmergeが出来たら、pullをします。
例えば、リモート上でのレビューの結果コードに修正が必要になったとしても、ブランチをもとに戻して編集してpushし、mergeをしてあとでpullしたときにコンフリクトが起こったら、どちらか正しいほうの記述を残すことで解消出来ます。


#ローカルでmergeする方法


**例)** 
***feat/wish--new = LGTM待ち中のブランチ***
***feat/wish--delete = 新しく実装したい機能のブランチ***

feat/wish--deleteに移動する

```ターミナル.
$git checkout feat/wish--delete
```

feat/wish--newをmergeする

```ターミナル.
$git merge feat/wish--new
```
【WinMerge】差異のみ表示されない原因

# WinMergeで差異のみを表示させたい時の方法
**メニューの表示＞Diffコンテキスト**　から**「0」**を
選択すれば差異のみを表示させることが出来ます。

#### しかし、上記の設定を何度やってもなぜか全行表示されてしまう
というのが今回の問題でした。


# 結論
### 全行の末尾に半角スペースが入っていたことが原因でした
正規表現で末尾のスペース「 $」を置換で解決。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1064900/33b9fd00-5449-5ae8-5e2d-480f40df8ddc.png)
rubygems.org に接続できない

`bundle install` や `gem update` が実行できない問題に遭遇した

```powershell
PS > bundle install
Fetching source index from https://rubygems.org/
Retrying fetcher due to error (2/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (3/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Retrying fetcher due to error (4/4): Bundler::HTTPError Could not fetch specs from https://rubygems.org/
Could not fetch specs from https://rubygems.org/
```

```powershell
PS > gem update bundler
ERROR:  While executing gem ... (Gem::RemoteFetcher::UnknownHostError)
    no such name (https://rubygems.org/specs.4.8.gz)
```

#### 原因？

ネットで調べると rubygems.org に対して IPv6でアクセスできないとか

#### 解決方法

hostsにIPv4アドレスを記載する

```powershell
PS > nslookup.exe "rubygems.org"
# 出力された ipv4アドレス（4件くらい）をメモ
```

`hosts` を編集

```text:Windows\System32\drivers\etc\hosts
# XXX.XXX.XXX.XXX にメモしたipv4アドレスを記載
XXX.XXX.XXX.XXX rubygems.org
XXX.XXX.XXX.XXX rubygems.org
XXX.XXX.XXX.XXX rubygems.org
XXX.XXX.XXX.XXX rubygems.org
```

上記の対応でgemやbundleコマンドの実行ができた