OmniAICreator/Qiita-1.07M huggingface dataset:
WindowsとLinuxの違いを大雑把にまとめた



LinuxとWindowsはそれぞれ別のOSである事は多くの人にとっては理解している事かと思いますが、この2つがどう違うのか？について答えられないなんて人も居るのではないでしょうか？

ここではそんな２つのOSの違いについて解説します。

#LinuxとWindowsの違いをざっくり紹介

|Windows|Linux|
|:--|:--|
|クローズドソースである|オープンソースである|
|ライセンスに限りがある|自由に使える|
|GUIがメイン|CUIがメイン|
|有償サポート|ボランティアメインのサポート|


##クローズドソースとオープンソース

オープンソースとは、無償で公開され誰でも好きなように改変できるソースのことです。
Linuxは、オープンソースです。
一方で、Windowsはクローズドソースとなります。

別の視点から見れば、Linuxはソースコードが公開され誰かの手で改善される事を前提に成り立っています。
逆に、Windowsは、ソースコードが隠ぺいされ、どこに弱点があるのか隠されている為、悪意のある攻撃から守られやすいといえます。
##ライセンスの有無

ライセンスの有無とは、ソフトウェアを自由に使えるかどうか？である。

Linuxは、ある程度の制約はあれど原則的に自由な改変が可能である。
一方、Windowsはそういった事は認められない。

他にも、Linuxは自由に使ってOKという条件があるので、何台のPCにでも導入する事ができる。
一方、Windowsはライセンスの数に制約を受けるので好きな台数のPCにインストールする問う言う事が出来ません。

##CUIとGUI

CUIとはコマンドラインである。
解らない人向けに説明するなら、映画などで天才プログラマーが黒い背景のウィンドウに文字列入力でPCを動かしているアレである。
効率的なプログラミングにおいては、必須の機能と言えます。

一方GUIとは、いわゆる普通のウィンドウである。
Youtubeを見るために開かれる右上に×マークやら全画面マークやらが設置してあるものがつまりGUIなのである。
どんな人でも手軽に直感的に使う事ができるものです。


##LinuxとWindowsのサポート体制

Linuxは、解決の手法が電子メールやフォーラムへの投稿からの、返信と言う形になります。
よくある安価にサポートを行う形式のサービスに近い形式で、Linuxのサービスは成り立っています。

一方Windowsは、有償ではありますがWindows自体と有償のサービスを持っており、そちらからのサービスを受け取る事を可能にしている。



#まとめ

他にも違いはありますが、大まかに見てLinuxとWindowsがどう違うのか理解する一助になれば幸いです。
Microsoft Learn 33日目

2019年12月に Advent Calendar を使って [Microsoft Learn](https://docs.microsoft.com/ja-jp/learn/) で学んでいく...と試みてなんとか完遂した([記事はこちら](https://qiita.com/advent-calendar/2019/d01tsumath_learn))。
しかし、スローペースだったのもあり25日間毎日受講しているとは言え、コースの半分しか終わってない。
そこで、「Azure の基礎」コースが終わるまで続けていこうと思う。毎日できるかは不明、でもがんばる。

と、いうことで。以下、受講記録のはじまりはじまり～。

1/2は
Azure Policy でインフラストラクチャの標準を適用して監視する
 - Azure Policy を使用して IT のコンプライアンスを定義する
 - イニシアティブを使用してポリシーを整理する
を受講した。

# Azure Policy でインフラストラクチャの標準を適用して監視する
## Azure Policy を使用して IT のコンプライアンスを定義する
Azure Policy はポリシーの作成、割り当て、管理に使用する Azure サービスのこと。
これらのポリシーにより、リソースにさまざまなルールと効果が適用されて、それらのリソースが会社の標準とサービスレベルアグリーメントに準拠した状態に保たれる。
### ポリシーの作成
ポリシーを適用するには、次の手順を実行する。

1. ポリシー定義を作成する
2. リソースのスコープに定義を割り当てる
3. ポリシーの評価結果を表示する

#### ポリシー定義とは
評価対象と対処方法を表す。
すべてのパブリック Web サイトを HTTPS で確実に保護する、特定の種類のストレージが作成されないようにする、または特定のバージョンの SQL Server の使用を強制することなどが可能。
ポリシー定義自体は JSON ファイルとして表され、ポータルで事前に定義された定義のいずれかを使用するか、独自に定義することができる。
#### Azure Policy の適用
ポリシーを適用するには、Azure portal を使用するか、または `Microsoft.PolicyInsights` 拡張子を追加することで Azure PowerShell などのいずれかのコマンドラインツールを使用することができる。
プロバイダーを登録後、ポリシー割り当てを作成できる。
#### 準拠していないリソースの特定
適用されたポリシー定義を使用して、Azure portal でポリシー割り当てに準拠していないリソースを特定することができる。
この結果は、Azure portal 内のポリシー割り当ての[リソースコンプライアンス]タブに表示される内容と同じ。
また、コマンドラインツールを使用して、ポリシー割り当てに準拠していない、リソースグループ内のリソースを識別することもできる。
#### リソースのスコープに定義を割り当てる
ポリシー割り当てはすべての子リソースによって継承され、リソースグループに適用されたポリシーは、そのリソースグループ内のすべてのリソースに適用される。
ポリシーを割り当てるには、Azure Portal、PowerShell、または Azure CLI を使用する。
ポリシー定義を割り当てるときは、定義されているすべてのパラメーターを指定する必要がある。
#### Policy の効果
Azure Policy によって最初に評価されるのは、Azure Resource Manager を使用したリソースの作成または更新の要求で、リソースに適用されるすべての割り当ての一覧が作成された後、各定義に対してリソースが評価される。
リソースがポリシーに違反した場合に不要な処理を回避するために、適切なリソース プロバイダーに要求が渡される前にさまざまな効果が処理される。
#### ポリシーの評価結果を表示する
Azure Policy を使用すると、検証に合格していないリソースでも作成でき、このような場合は Azure Policy ポータルまたはコマンドラインツールで表示できる監査イベントをトリガーすることができる。
#### ポリシー定義の削除
ポリシー要件を削除するにはポータルを使用するか、または PowerShell コマンド `Remove-AzPolicyAssignment` を使用する。

## イニシアティブを使用してポリシーを整理する
ポリシー定義の管理が多数ある場合、イニシアティブを使用する。
イニシアティブ定義は、一連のポリシー定義またはポリシー定義のグループであり、大きな目標に向けてコンプライアンスの状態を追跡することができる。
ポリシーが1つの場合でも、時間の経過と共にポリシーの数が増えると予想される場合は、イニシアティブを使用することがベター。
一度定義されるとポリシーと同様に割り当てることができ、関連するすべてのポリシー定義が適用される。
### イニシアティブの定義
一連のポリシーを1つの項目にグループ化することで、ポリシー定義の管理と割り当てのプロセスが簡略化される。
Azure portal またはコマンドラインツールを使用してイニシアチブを定義可能。

# おまけ。
現在の進捗具合。
![Azureの基礎2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141029/57153e5e-05fa-ce28-d545-9743b8a52f61.png)
個人的にプログラムでこれだけ気をつけてれば良いところ

思ったことのまとめ。
分かりやすコードを書くために、これだけ守っててば普通にOK。
フロントやサーバ全てで対象です。

自分が今まで見た現場のコードで読むのが辛かったものリストでもある。

# チェックリスト

## 特に重要
以下の二つが守れていれば、自然と「読みやすく、テストが書きやすく、移行もしやすく」なる。

### ・関数には、１個の役割だけ持たせる。
複数箇所から呼び出すと、内部でifとか付けたくなるけど、付けずに我慢する。
複数の関数に分けないと、どんどん関数が肥大化してしまう。
以下の例のように、「呼び出し元で分岐させる」と「最低限の役割」で処理を実行できる。

・複数の役割を持ってる場合

```go
// Adminだったら、「adminName」、違ったら「userName」を返す
func GetUser(isAdmin bool) string {
  if isAdmin {
    return "adminName"
  }
  return "userName"
}

// 呼び出し元
func GetUserDetail() string {
  isAdmin := getIsAdmin()
  return GetUser(isAdmin)
}
```

・役割で関数を分割した場合

```go
// Adminの情報を返す
func GetAdmin() string {
  return "adminName"
}

// Userの情報を返す
func GetUser() string {
  return "userName"
}

//呼び出し元
func GetUserDetail() string {
  isAdmin := getIsAdmin()
  if isAdmin {
    return GetAdmin()
  }
  return GetUser()
}
```

上のように「呼び出し元」で、処理を分岐させることによって、最低限にできる。

### ・変数には、１個の役割だけ持たせる。
気付いたら複数の役割を持っていることがある。
変数の影響範囲を小さくして、なるべく外部から呼び出せないようにする。

## かなり重要
・1つのクラスに関数が増えすぎたら、「private変数/関数の効果」が薄れるので、中の役割を見てクラスを分割する。
だいたい「役割が複数存在する」ので分けれる。

・複雑なロジックは関数に分ける。
複数箇所から呼び出されなくても分ける。

・フォルダでは処理の役割を、わかりやすい単位で分ける。
例：データ取得、変換、整形、保存、出力

・staticは基本的に使わない。
使う場合は、一個のフォルダに全てまとめておく。

## めっちゃ重要
・使ってない処理は全て消す。その後使う可能性あっても徹底的に消す。
・継承は滅多に使わないはずなのに、気軽に使えてしまうので封印。
・例外出さずに、エラーは引数で返す。（これは言語によるが、できれば）
・public, privateは必ずつける。
・DBを扱う処理は、全てフォルダにまとめて外部に出さないでおく。

## 次に重要
・グローバル変数っぽいものは、複数の役割を持ちやすくなってしまうので、なるべく一番上の階層から、下に受け渡していく。
・なるべくnullは使わない。
（何もないという曖昧な役割を持っているため。）
・変数名は簡単な英単語にする。
・「bool型の変数や関数」は「is,isNot,can,has,〜Exist」などを使う。
・インターフェースは、無理やり使わなくてもおk。
・コメントは、「何のために、何をしている」まで書く。
「コメントと処理」で「情報量が同じ」ならコメント書かない。

これが守れてれば、普通に読みやすいコードになる。

## 普通に重要
・「複雑なロジック」や「エラーしたら会社が倒産する処理」は、関数にして、テストを書く。
・interfaceで依存性の逆転は、めっちゃ関数が増えたり状態が変わるものにつける。
（不変なものには付けなくてもおk）
・テストする時のモックは、「テストが通るモック」を書かないようにする。

## なぜ必要
自分のためではなく、新しく参加する人のために必要です。
自分で書く分には、全体の構成を覚えているのできれいに書かなくてでも問題ないと自分は思います。
きれいに役割で分割されていると、新しく入ってきた人への説明が不要になったりその人の無駄な時間を削減できます。
ただ、きれいに役割で分割されているとテストは書きやすいです。

## こだわりすぎなくてもおk
最初から無理に分割しなくても、書いてみてからわかることがあるので、一段落してから綺麗にする。
使われないと意味がないので、初期は開発速度の方が、圧倒的に大事。
読みやすさに関しては、新しい人が参加する前に直ってればおk。でも新しい人はだいたい突然入ってくるので、やっぱたまにリファクタ大事。

## まとめ
後から誰でも参加できるように、手直し大事。
PHP for文まとめ

# 目的

- PHPにおけるfor文の書き方をまとめる

# 書き方の例

- for文はループ条件に応じてループ処理を実行する。
- 回数を指定したループ処理に使用する。
- 下記にfor文の書き方の例をまとめる。

```php
for (ループ条件に使用する変数の初期化; ループ条件; 変数の更新){
  ループ処理で実際に実行したい処理;
}
```
# より具体的な例

- 変数`i`に初期値として1を格納する。
- 変数`i`が１０に達するまで処理をループさせる。
- ループ処理では「変数iには現在nが格納されています。」と出力される処理を記載する。
- 変数`i`は一回のループごとに２足される。
- 下記に前述の条件で処理を繰り返すfor文を記載する。

```php
for ($i = 1; $i <= 10; $i++){
  echo "変数iには現在{$i}が格納されています。";
  echo '<br>';
}
```

# 強制的にループ処理を抜ける

- 前述の処理でfor文のループ条件はそのままに、$iに5が格納された時にループ処理内で強制的に処理を中断する書き方を下記に記載する。(break文)

```php
for ($i = 1; $i <= 10; $i++){
  if ($i > 5){
    break;
  }
  echo $i;
  echo '<br>';
}
```

- $iが5以降の処理を停止する。

```php
for ($i = 0; $i < 10; $i++) {
    if ($i == 5) {
        break;
    }
    echo $i;
}
```

# 強制的に指定のループ処理のみをスキップする

- 前述の処理でfor文のループ条件はそのままに、$iに3の倍数が格納されたときのみループ処理をスキップする書き方を下記に記載する。(continue文)

```php
for ($i = 1; $i <= 10; $i++){
  if ($i % 3 == 0){
    continue;
  }
  echo $i;
  echo '<br>';
}
```

 - $iが5の時の処理のみスキップする。

```php
for ($i = 0; $i < 10; $i++) {
    if ($i == 5) {
        continue;
    }
    echo $i;
}
```
SpringBootのタスク管理ツールで使用したアノテーションたち

#概要
UdemyのReactとSpring Bootを使ってタスク管理ツールを作るコースをやっていて、アノテーションが全然わからなかったので使用したアノテーションをまとめていきます。

#使用したアノテーションたち

##Controller.java
| アノテーション |  意味 |
|:-----------------|:------------------|
|@RestController|WebAPIのエントリポイントとなるクラスを作る場合に使用|
|@RequestMapping|パスやHTTPメソッドのマッピングをする|
|@CrossOrigin|CORSの設定で、アクセス許可する|
|@PostMappting|POSTリクエスト用のアノテーション|
|@GetMapping|GETリクエスト用のアノテーション|
|@DeleteMapping|DELETEリクエスト用のアノテーション|
|@PatchMapping|PATCHリクエスト用のアノテーション　|

##Service.java
| アノテーション |  意味 |
|:-----------------|:------------------|
|@Service|アプリ起動時にSpringBootのコンテナが管理|
|@Autowired|beanをインジェクトする|

##Repository.java
| アノテーション |  意味 |
|:-----------------|:------------------|
|@Repository|アプリ起動時にSpringBootのコンテナが管理|
|@Override|必ずメソッドをオーバーライドを行う|

##Exception.java
| アノテーション |  意味 |
|:-----------------|:------------------|
|@ControllerAdvice|Controller専用の特殊なメソッド(@Exceptionhandlerなど)を@RestControllerを付与したクラスで共有できる|
|@RestController|Controllerとして認識|
|@ExceptionHandler|Controllerクラス内で発生した例外に対する設定を行うことができる|
|@ResponseStatus|HTTPステータスコードを設定する|

##Domain.java
| アノテーション |  意味 |
|:-----------------|:------------------|
|@Entity|JPAエンティティーであることを定義|
|@Id|@GeneratedValueを適応させる|
|@GeneratedValue|主キーを生成する|
|@OneToOne|1対1の関係を作れる。カスケードも指定できる|
|@OneToMany|1対多の関係をれる。カスケードも指定できる|
|@ManytoOne|多対1の関係を作れる。カスケードも指定できる|
|@JoinColumn|カラムを追加する際に使用|
|@JsonIgnore|Json出力の対象外となる|
|@NotBlank|必須。null、空文字、スペースは入れられない|
|@Size|文字数制限をかけられる|
|@Column|カラムの設定ができる|
|@JsonFormat|出力したいフォーマットに変換して、出力できる|
|@PrePersist|オブジェクトの永続化前に実行する処理を指定|
|@PreUpdate|オブジェクトの属性が更新前に実行する処理を指定|
データベース(DB)設計のメモ

#ERDのモデル例を見れるサイトのリンク
####google画像検索
キーワード: website database design examples
https://www.google.com/search?sxsrf=ACYBGNRlOq_4PwjFipAtMWIwt-BN0jFIDQ:1578393794369&q=website+database+design+examples&tbm=isch&source=univ&sa=X&ved=2ahUKEwjdi7eLp_HmAhUZPnAKHfkXCaIQsAR6BAgKEAE&biw=1920&bih=1097#imgrc=GVxkn9Ua-8RSHM:

####VisualParadigm.com
https://online.visual-paradigm.com/diagrams/templates/entity-relationship-diagram/


#youtubeの動画を観て５分でER図つくった。超楽ちん！

https://www.youtube.com/watch?v=UI6lqHOVHic&list=PLUoebdZqEHTwbYD8oo6Wr81Xb7uCAh_oz
![IMG_20200102_172102.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/57a3b08e-b1c6-afda-86ac-d4579f246ef5.jpeg)

#ダイアグラムのテンプレート
https://www.lucidchart.com/pages/templates
![5b99a7c6-ee3a-44b9-99e5-4dc7242e01bb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/282788/3ac939b3-4cc0-cb52-f0e1-6a34cabd54a9.png)



#エンティティの出し方
１. まず核となるものから考える。学校で例えると`生徒`とか`先生`とか`講義`とか。
２. あとは芋づる式に想起していけばよい。
３. これといったやり方はないので手を動かす。

#リレーションの結び方
３人称単数で考えて、理にかなうか考えるだけ。これも正解はないので適当に決めたら良い。下記に例を挙げてみる。

####一人の生徒からみてクラスは１つ
○　Aくんは３年B組だ
☓　Aくんは３年B組とC組だ

####１つのクラスには複数の生徒がいる
○　３年B組にはAくん、Bくん、Cくん...Nくんがいる
☓　３年B組とC組にはAくんがいる


>簡単だね！!もうなんでもつくれるよね？
>Dontウォーリーだね！これで僕もあなたも週１ペースでぱっぱっと開発できちゃいそうだね！
v-forのkeyについて

この記事はvue.js入門者向けに書いています。
そもそも公式ガイドを見れば書いてあるんですが、公式ガイドすらよく分からない人向け、自分のメモとして書いておこうと思います。
自分が開発する上で詰まったことは誰かも同じように、つまづいていると言うことだと思い、初心者目線で記事を書いていこうと思います。


#v-forのkeyとは
それではvueのガイドにどのように書いてあるかと言うと以下のように書いてありました。

>Vue が各ノードの識別情報を追跡できるヒントを与えるために、また、先ほど説明したような既存の要素の再利用と並び替えができるように、一意な key 属性を全てのアイテムに与える必要があります。

厳密には間違っているかもしれませんが、表示させたい情報を追跡したり、並び替えをしたりするときに結びつきを強くするための情報がkeyです。

#:key="index"がよくない理由
keyの値は一意の値が必要ということでした。

**　一意　＝　ダブっていない**

indexは一見ダブらない数字ですが、データの削除などを行った場合にindexの値も変化するため、適切な動作にならないこともあり、避けた方が良いでしょう。
作業効率を飛躍的にアップさせるVS codeショートカット集

# 概要
ショートカットの中でも特に使用回数が多く、
覚えておくと作業効率が格段に上がりそうなものをピックアップしました。

# 環境

+ OS: Windows

# 基本操作
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[shift]+[p] | コマンドパレット表示|
| [ctrl]+[,]|ユーザー設定を表示|

# エディタ基本操作
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[x]| 行のカット|
| [ctrl]+[Enter]| 行下に改行を追加(+カーソルを移動)|
| [ctrl]+[Shift]+[Enter]|行上に改行を追加(+カーソルを移動)|
| [Home] / [End] | 行の先頭/末尾に移動 | 
| [Ctrl] + [Home]/[End] | ファイルの先頭/末尾に移動 | 


# 範囲選択
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[d] | 単語を選択 | 
| [ctrl]+[d]<連続> | 同じ単語をマルチ選択 | 


# 検索
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[shift]+[o]| シンボルを検索/移動|
|[ctrl]+[g]|行を指定して移動|


# ウィンドウ操作
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[@] |ターミナルに移動|
| [ctrl]+[b] | サイドバーの表示切替|

# ファイル操作
| キー入力| 説明 |
|:----|:---|
| [ctrl]+[s]|ファイルの保存|
| [ctrl]+[k] -> [s] |全てのファイルを保存|
| [ctrl]+[k] -> [w] |全てのファイルを閉じる|

# その他
| キー入力| 説明 |
|:----|:---| 
| [ctrl]+[/] | コメント行の追加 | 
| [ctrl]+マウスクリック|定義にジャンプ|
| [alt]+[shift]+[f] | ファイルのフォーマット（整形）|
GNS3 Remote Server

# はじめに
Network 関係で色々と遊ぼうとすると、どうしても物理的な構築が必要になる。でも、プロトコルの動作を知りたいとか、Router の Config の書き方や実際の Packet を見たい、速度なんざいらない、という時には仮想環境でやったほうが面倒がない。そもそも実機をかき集めるとなると、電力だけで地獄を見る。

というわけで [GNS3](https://gns3.com/). GNS3はもともと Cisco IOS を動かすための Dynamips のラッパーとして細々開発が続けられていたが、2016年くらいからかな、何かの資本が入ったのか、精力的に開発が進められている。

検証用とはいえ、仮想 Router や サーバを複数台動かそうとするとメイン PC で賄うのはつらい。そこで、ESXi サーバ上にGNS3サーバを立て、メインPCは　GNS3クライアントとして動作させることにした。

## 前提
#### GNS3
- GNS3 2.2.3 を利用。**Server/Clientでバージョンを合わせる必要がある**。 

#### Remote Server
- Ubuntu 18.04.1 を最小インストールで用意。
- Partition は、/のほか、/optを別に分けた。GNS3 Serverで動作させる仮想マシン群はこのディレクトリに配備される。/optを分けておかないと、GNS3 上に無尽蔵に仮想マシンを立てていって突然ディスク容量が足りない！となって サーバすら起動しなくなる（なった）。

#### Local Client 
- Windows 10 で用意。Linux でもやるべき手順は変わらない、と思う。

#### OpenVPN
- Client - Server 間は OpenVPN を利用してトンネル化する。Server を Internet 上のクラウドで構築することを想定しての構成。NAPT 変換前の Private 空間で直接つなぐのなら正直いらないのだが、公式手順に合わせて利用することにした。

## Remote Server 構築
### 事前準備
```console
sudo apt install curl
sudo adduser gns3
```
curlはGNS3謹製ツールを動作させるために必要。gns3ユーザアカウント追加は正直いらない気もするのだが、これが入っていないと、gns3-remote-install.sh が途中で止まった。

### GNS3 Serverのインストール
元ネタは[ここ](https://www.gns3.com/community/discussion/openvpn-download-gns3vm-ovpn).

```console
cd /tmp
curl https://raw.githubusercontent.com/GNS3/gns3-server/master/scripts/remote-install.sh > gns3-remote-install.sh
sudo bash gns3-remote-install.sh --with-openvpn --with-iou --with-i386-repository
```
インストールスクリプトでインストールできる。openvpn のクライアント用opvnファイル（`client.ovpn`）が/root/に作成されていればOK. 

## Client側の設定
公式サイトからOpenVPNを[ダウンロード](https://www.openvpn.jp/download/)し、インストール。
Server側で生成された `client.ovpn` ファイルを Client 側 PC へコピーし、OpenVPNへインポートして、接続する。
接続に成功すると、VPN接続用のIP アドレスがアサインされる。

### Private 空間で利用するときの注意
インストーラで生成された `client.opvn` を Pvitate 空間で使う場合（言い換えると Server / Clientがどちらもローカルにある場合）、ファイルの一部を書き換える必要がある。
`connection`タグ配下に 接続先アドレスを指定するところがあるが、そこをローカル側のアドレスに変更する。

```html:client.opvn
（ファイル末尾）
<connection>
remote Global IP Address 1194 udp ← ここをローカルアドレスへ書き換え
</connection>
```

### GNS3 Client の設定
GNS3 の Edit → Preference → Server → Server Preferenceを設定する。User/Passwordはデフォルトでできた。
- Enable local server のチェックを外す。
- Remote main ServerのホストにVPN 接続用の IPアドレスを設定する。

![Preference.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409463/447e2bdc-2a60-2a1e-c13f-492b86b33a38.png)
距離センサモジュールVL53L0Xをarduinoを使って距離を測る

# 目的
距離センサモジュールVL53L0XをArduinoを使って距離を測った際の備忘録です

# 準備
Arduino
[VL53L0X Time-of-Flight 距離センサモジュール](https://www.switch-science.com/catalog/2869/)

# 回路図
以下をジャンパーピンで接続すれば良い。

Arduino側　- 距離センサ側
SCL - SCL
SDA - SDA
VCC - VCC
GND - GND

# コード

```
/* This example shows how to use continuous mode to take
range measurements with the VL53L0X. It is based on
vl53l0x_ContinuousRanging_Example.c from the VL53L0X API.

The range readings are in units of mm. */

#include <Wire.h>
#include <VL53L0X.h>

VL53L0X sensor;

void setup()
{
  Serial.begin(9600);
  Wire.begin();

  sensor.setTimeout(500);
  if (!sensor.init())
  {
    Serial.println("Failed to detect and initialize sensor!");
    while (1) {}
  }

  // Start continuous back-to-back mode (take readings as
  // fast as possible).  To use continuous timed mode
  // instead, provide a desired inter-measurement period in
  // ms (e.g. sensor.startContinuous(100)).
  sensor.startContinuous();
}

void loop()
{
  Serial.print(sensor.readRangeContinuousMillimeters());
  if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); }

  Serial.println();
}
```

# テスト
距離センサを近づけてRGB値を取得できればOK
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">距離センサを使って距離情報をプロット <a href="https://t.co/IN7jI2Z4mN">pic.twitter.com/IN7jI2Z4mN</a></p>&mdash; st (@st17890027) <a href="https://twitter.com/st17890027/status/1212571340923736066?ref_src=twsrc%5Etfw">January 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

以下はシリアルプロッタで取得したグラフです。
<img width="880" alt="distancesensor-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/344880/6bb99c66-251f-b87b-8447-318af8cc5e65.png">


# CodingError対策
特になし

# 参考
[VL53L0X Time-of-Flight 距離センサモジュール](https://www.switch-science.com/catalog/2869/)
[Arduino UNOでVL53L0X Time-of-Flight 距離センサモジュールを使う](https://qiita.com/ikekou/items/15d070d9260a7711c54e)
[Arduino IDEで数値をグラフ表示する「シリアルプロッター」](https://qiita.com/umi_kappa/items/632c02d5d749004619ef)
（プログラミングを）やり抜く人の9つの習慣について


# 9 things successful people do differently（やり抜く人の９つの習慣）

Daigoさんの動画をみて、その日にTSUTAYAに言って買って、その日に読んでしまいました。

さくっと1時間で読めるし、自分自身のやるべきことをはっきりさせる内容の濃い本だと思うので、読んでない方は是非読んでみてください。


わたしの意志力、その他過去こんな感じ↓
・自分は意志力に自身がある方じゃないし、計画性がある方でもない。
・プログラミングの実力があるわけでもない
・体育会系の営業をずっとやってた

そんなやつが9つの習慣をやってみたらどうなるだろう？
っという企画です。

※あくまで自分のためにやってるため、あしからず・・・。厳しいご指摘いただけるのであればお願いいたします。


#■具体的な目標を決める
・いつなにをする
・障害は何か
・小さな目標一つの達成した時の感情を味わう
・未来の感情をイメージ
・メンタルコントラスト（成功とは何か？成功への障害は何か？）


#■if then プラニング
・もし○なら○をする
・意識しなくても行動できる環境にする
・迷わないようにする

#■目標までの距離
・これまで思考よりこれから思考を意識することでモチベUP


#■現実的楽観主義
・非現実的楽観主義になるな
・障害を探し挑むこと


#■成長することに集中する
・目標はこれから何ができるようになりたいかが重要
・能力は生まれつきで決まっていない（多くの研究で実証済み）
・証明ゴール（できること）と成長ゴール（出来なかった事ができる）
・証明ゴール（できること）を意識しすぎている傾向がある
・失敗を学びと思えば成長ゴールにつながる
・興味のあることが活力を高める

#■やり抜く力とは
・成功に必要な基本的なことは、
　①努力すること
　②正しい戦略をたてること
　③詳細なプランをたてること
　④成功をつかむまであきらめないこと
・拡張的知能観（能力は伸ばせる）
・苦手なことを振り返る
・注意深く思い込みを観察する、そして悪い思いこみを治す


#■意志力を鍛える（筋肉のように）
・if thenでやってみる
・意志力が強い人を思い浮かべる
・何か誘惑になるものをやめる
・意志力は有限
・意志力を回復させるため、休んだり動画をみたりすること

#■自分を追い込まない（意志力を無駄にしない）
・限りある意志力を有効に使う
・難しい目標をたてる必要なし
・自分を過大評価しすぎている傾向があるため、できるだけ簡単な目標をたてる
・やめるなら一度にいっぺんにやめること！（少しならいいよね〜では絶対に無理）

#■やめるべきことより、やるべきことに集中する
・シロクマを考えるなと言われると考えてしまうのと一緒、やるべきことを考えることに時間を注げ
・代替えif thenプランを立てる

以上！
もし、興味のある方はこちらへ

やり抜く人の９つの習慣
https://amzn.to/2MKuBRd
cscの作法 その20 webrequest

#概要

cscの作法、調べてみた。
webrequest使ってみた。

#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Net;
using System.Text;

class form1: Form {
	form1() {
		Text = "open";
		ClientSize = new Size(200, 200);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 50);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		Encoding enc = Encoding.GetEncoding("Shift_JIS");
		string url = "http://carmania.dip.jp";
		WebRequest req = WebRequest.Create(url);
		WebResponse res = req.GetResponse();
		Stream st = res.GetResponseStream();
		StreamReader sr = new StreamReader(st, enc);
		string html = sr.ReadToEnd();
		sr.Close();
		st.Close();
		MessageBox.Show(html);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}




```


以上。
Matplotlibのcolorbarに複数の値を割り当てる方法

とりあえず、こうしました。
cbar.ax.set_yticklabelsticksでラベルを変更しているが、全ての値が適用されなかったりする。
正規のやり方あったら教えてほしいです。

![pic.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101736/59981ba2-3896-7209-e9c0-31c4eeed6702.png)

```
import matplotlib.pyplot as plt
import numpy as np 
plt.rcParams['font.size']=18

#もとの値から表示したい値を返すの関数
def convert(org):
    return org*org


rand=np.random.rand(100, 100)*1e4
max=rand.max()
fig = plt.figure(figsize=(7,5))
ax = fig.add_subplot(111)
im=ax.imshow(rand,cmap='gray')

#ここからカラーバー
cbar=fig.colorbar(im, ax=ax,pad=0.02,shrink=1.0,ticks = [0,max/4,max/2,3*max/4, max])
ticks = cbar.get_ticks()
new_ticks=[]
for t in ticks:
    new_ticks.append(str(t.round(-3))+'/'+str(convert(t).round(-3)))
cbar.ax.set_yticklabels(new_ticks)
plt.show()

```
今更ながらRails削除の仕方

#ローカル環境に置けるRailsの削除の仕方
今更！？
と思う方も多いと思いますが、意外と一つの記事にまとまってなかったので、ここに残させていただきます。

##経緯
僕のmacには**rails6系**が入っていました。
しかし、なかなかに参考記事もまだ少なく、js関連の時は特に苦労してました、
なので、**rails6は消そう**と思い検索しましたが、何記事かまたいでしまいました。

##ロールにインストールされているバージョン確認

```
gem list | grep rails
```
・意外にもrubyのバージョン検索記事はいっぱいあるが、
railsのバージョン検索記事は少なくここで手間取ってしまった。。。

```
gem list | grep rails
~~~
~~~
fullcalendar-rails (3.9.0.0)
jquery-rails (4.3.5, 4.3.3)
jquery-ui-rails (6.0.1)
momentjs-rails (2.20.1)
rails (6.0.2.1, 6.0.1, 5.2.4, 5.2.1)
rails-dom-testing (2.0.3)
rails-html-sanitizer (1.3.0)
sass-rails (6.0.0, 5.1.0)
~~
~~
```
・ここで求めていた**railsのバージョン一覧**が出てきた

##削除
```
gem uninstall rails --version 6.0.2.1
```
・指定した削除コマンドを打つだけ

```
Successfully uninstalled rails-6.0.2.1
```
・成功するとこんな感じででる。

#まとめ
すごい初歩的だが、Ruby記事は多くてもRails記事は少ない。
ググり力の問題もあると思いますが、ここに一式まとめておきます。
誰かの参考になればなと思います。
作って理解するOS_メモリ管理の仕組み(コンピューターの基礎構成まとめ)

第二部突入。x86系PCのアーキテクチャの理解めも
#コンピュータの基礎構成
##BIOS(Basic Input/Output System)
基本入出力ソフトウェア群。電源投入時に外部記憶装置からメモリに、起動プログラムをロードする。メモリのROMにある。つまり、「一番最初に起動するプログラム」とは**BIOS**である。基本的な流れは↓
起動
↓
POST(Power on Self Test)：最低限のHW Check
↓（ここで周辺機器エラーか特定キー押下で再起動電断待ちへ）
512バイト読み込み：0x7C00番地にロード
↓（ブートコードでなければ再起動電断待ちへ）
末尾２バイトを確認し、ブートコードを起動

0x7C00番地（必ずこの番地）にロードされたUserが作成可能な最初のプログラムをブートコードと呼ぶ。
徐々にOSなどのプログラム全体をロードしていく（**ブートストラップ**）

##入出力装置（ポート）の役割
CPUと外部入出力装置との電気的な接点。
キーボードの操作の場合、キーボードとCPUの間にはキーボード制御に特化した**キーボードコントローラ**KBCが介される。これがCPUのポートと接続する。KBCはキーボードごとの差異を吸収する。
キーが押されるとKBCの出力ポートが変化するが、CPUがそのキーを検知する待機時間がめっちゃ長くて無駄。そのため、KBCはCPUに対して割り込みをかけることができる。
##割り込みコントローラ
そもそも割り込みとは？・・・**プログラムの実行アドレスを特定の値に書き換えること**。ここで第一部で出てきた割り込みベクタテーブル。こいつに書き換える値が格納されてる。
割り込みベクタテーブルにアドレスを設定しておくと、ほかのプログラムから割り込み番号だけで処理を依頼できる。

また、様々な機器から来る割り込み情報はいったん割り込みコントローラに接続され、優先順位付けされる。

#CPUの基本機能
16ビットの8086について、まずは理解する。
##8086のレジスタ
**・汎用レジスタ**：一般的な算術演算等で使用可能なレジスタ。AXは乗除計算、ポート入出力命令でのデータ格納。BXはポインタレジスタ。CXは繰り返し時のカウンタレジスタ。DXはAXと同様。これらは16ビットだが、上位下位を8bitに分割して利用可。
**・フラグレジスタ**：制御フラグと状態フラグに大別される。詳細は表参照
**・セグメントレジスタ**：ポインタレジスタが示すアドレスの開始位置を示すためにあるもの。
**ポインタレジスタ**：CPUがアドレスを指定するときに使用する
#80386では
汎用レジスタが32ビットになり、また、「セグメント」の意味が、保護されたメモリ空間に変化した（8086はポインタレジスタでアクセス可能な分割されたメモリ空間の意味だった）。（その他は略）
#外部インターフェース
メモリとのデータのやり取りは、データバス幅32ビットを考慮したデータ保存アドレスを調整する必要がある（データアラインメント）。つまり4バイト境界でデータを配置するといいということ。
##エンディアン
x86系CPUではリトルエンディアン方式でデータが記憶される。同じアドレスに異なるデータサイズでアクセスする場合、潜在的な問題として認識しておく必要がる。
##ポート
入出力ポートで外部周辺機器へ「データ＜＝＞電気信号」の界面を提供する。4ビット入出力の周辺機器内部に対してCPUは8ビットの入出力を行うが、PIOの中のレジスタが入力用、出力用に分けられているため、CPUと周辺機器双方の通信が可能になる。（CPU<=(8ビット通信)=>PIO<=(4ビット通信)=>周辺機器)
【コピペで簡単】WordPressで作った不動産ホームページに住宅ローンシュミレーション( Javascript）を設置する

# 【コピペで簡単】WordPressで作った不動産ホームページに住宅ローンシュミレーション( Javascript）を設置する

この記事では、ホームページにjavascriptで作成した住宅ローンシュミレーションを設置します。コピペで簡単に設置できるのでご利用下さい。

## 元利均等でのローンシュミレーション
### 元利均等ローンシュミレーションの計算式
元利均等でのローンシュミレーションで、毎月の返済額が試算できます。
コードをコピペで簡単に設置できますが、計算式を覚えておくと利用方法やカスタマイズの幅が広がるかと思いますので、記載します。

【計算式】
毎月の返済額＝（借入金額*（借入金利/12）*（1+（借入金利/12））^返済回数）/（（1+（借入金利/12））^返済回数－1）
計算式に数字を入れていくと下記になります。
エクセルに＝以降を入力すると確認できます。
借入金額：3000万円
借入金利：0.75％
返済回数：420回

81235.45＝(30000000*(0.0075/12)*(1+(0.0075/12))^420)/((1+(0.0075/12))^420-1)
## Javascriptで元利均等ローンシュミレーションを作成する

コピペするのは、javascriptとフォームの2つです。

フォーム
【解説】
設置箇所：記事内
inputの各要素に下記のnameを割り当てて、ユーザーが入力後に計算ボタンをクリックすると、javascriptで作成されたPMT（）関数が実行されてinputの要素の値が変わります。
借入金額：pv
融資金利：ir
返済期間（月数）:np

<pre>&lt;form method="post" target="_top" name="loan"&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;td&gt;借入金額：&lt;input name="pv" id="pv" value="4000" size="10" min="1"&gt;万円&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;融資金利：&lt;input type="number" name="ir" id="ir" value="0.625" size="10" min="0.3"&gt;%&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;返済期間（月数）：&lt;input type="number" name="np" id="np" value="420" size="10" min="1" max="420"&gt;ヶ月&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;div style="text-align:center; margin-top:20px;"&gt;&lt;button type="button" class="square_btn" onclick="a.value = PMT ();"&gt;計算&lt;/button&gt;&lt;/div&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;返済月額&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;input name="a" class="satei_result" value="（計算結果）"&gt;&lt;span class="red"&gt;円&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;/form&gt;
</pre> 
Javascript
【解説】
設置箇所：一つの記事で使用するのであれば記事内に、複数の記事で使用するのであればfooter.phpにペーストして下さい。
下記の変数を宣言し、formのinput要素を代入します。
借入金額：pv　＝　document.loan.pv.value
融資金利：ir　＝　document.loan.ir.value
返済期間（月数）:np　＝　document.loan.np.value
「parseFloat関数」は文字列を数値に変換する関数です。
「floor関数」は小数点以下の値を切り捨てた結果を返します。
「pow関数」は1番目の引数を、2番目の引数で累乗した値を返します。
「toLocaleString関数」で整数部分を3桁毎に区切り文字を挿入した形式で文字列に変換した結果を返します。（ロケールに応じたNumberクラスのオブジェクトの文字列表現を返します。）

<pre>
&lt;script&gt;
function PMT() {
var pv = parseFloat(document.loan.pv.value);
var ir = parseFloat(document.loan.ir.value);
var np = parseFloat(document.loan.np.value);
   return Math.floor((pv *10000 * (ir / 100 / 12) * (Math.pow(1 + (ir / 100 / 12), np))) / (Math.pow(1 + (ir / 100 / 12), np) -1)).toLocaleString();
}
&lt;/script&gt;

</pre>
Djangoでbitflyerの収支管理アプリを作ってみる（91.ディレクトリ構成を理解する。）

ちょいちょいファイルやディレクトリを追加したので、いったん整理してみます。

---

```
C:\Users\Owner\Desktop\bitflyer_monitor>tree /f
```

コマンドプロンプトで上記コマンドを使って、ファイル名まで一通り取得してみましょう。
ちなみにコマンドを叩く場所はプロジェクト作成時に作ったディレクトリ内です。



```
C:.
└─bfmonitor
    │  db.sqlite3
    │  manage.py
    │
    ├─bfmonitor
    │  │  asgi.py
    │  │  settings.py
    │  │  urls.py
    │  │  wsgi.py
    │  │  __init__.py
    │  │
    │  └─__pycache__
    │          settings.cpython-36.pyc
    │          urls.cpython-36.pyc
    │          wsgi.cpython-36.pyc
    │          __init__.cpython-36.pyc
    │
    └─login
        │  admin.py
        │  apps.py
        │  forms.py
        │  models.py
        │  tests.py
        │  views.py
        │  __init__.py
        │
        ├─migrations
        │  │  __init__.py
        │  │
        │  └─__pycache__
        │          __init__.cpython-36.pyc
        │
        ├─static
        │  └─login
        │      └─css
        │              style.css
        │
        ├─templates
        │  └─bfmonitor
        │          dashboard.html
        │          login.html
        │          registration.html
        │
        └─__pycache__
                admin.cpython-36.pyc
                forms.cpython-36.pyc
                models.cpython-36.pyc
                views.cpython-36.pyc
                __init__.cpython-36.pyc
```

ツリーにして俯瞰してみると、ちょっとわかりやすくなりますね。
__pycache__の中身はいつの間にか勝手に追加されてるものなので、気にせずいきます。

HTMLファイル、CSSファイルなどは途中で追加しています。
配置場所ミスって動かなかったとか結構ありますので、トラブったときには疑ってみましょう。

[プロジェクト]=[bfmonitor]
[アプリケーション]=[login]

[login]アプリケーションの中に、ログイン画面・ユーザー登録画面・ダッシュボードを作りました。
それ以外のアプリケーションを作成・追加して機能を拡張していくことも可能です。

というわけで、今回はざっとディレクトリ構成と簡単な機能確認でした。
python でのjson取り扱い

**一番最小限を教えて欲しいっていう需要がある気がしたので。まぁ僕です**

まず読み込み

```python
import json
f = open("./file_name.json", 'r')

#ココ重要！！
json_data = json.load(f) #JSON形式で読み込む
```

次に書き出し


```python
import json
data = {"a":"alpha"}

fw = open('./file_name.json','w')
# json.dump関数でファイルに書き込む
json.dump(data ,fw,indent=4)
```
Gitのcore.editorをVS Codeにする時につまずいた事

#目的
gitでVisual Studio Codeをデフォルトエディターとして使用したい


#設定
```
git config --global core.editor "code --wait"
```


#つまずいた点
git commit を入力すると以下の内容が返ってくる。

```
hint: Waiting for your editor to close the file... code --wait: code: command not found
error: There was a problem with the editor 'code --wait'.
```

##原因
VS Code内にてcodeコマンドを使用する設定ができていない為。

#解決した方法
表示 > コマンドパレット を開いて、以下のコマンドを実行する。

```
Shell Command: Install 'Code' command in path
```
cscの作法 その19 wav


#概要

cscの作法、調べてみた。
練習問題やってみた。

#練習問題

wavファイルを作れ。

#サンプルコード


```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.IO;
using System.Text;

class form1: Form {
	form1() {
		Text = "wav";
		ClientSize = new Size(200, 200);
		Button btn1 = new Button();
		btn1.Location = new Point(50, 50);
		btn1.Text = "test";
		btn1.Click += btn1_Click;
		Controls.AddRange(new Control[] {
			btn1
		});
	}
	void btn1_Click(object sender, System.EventArgs e) {
		string FileName = "test.wav";
		FileStream filStream = new FileStream(FileName, FileMode.Create, FileAccess.Write);
		BinaryWriter br = new BinaryWriter(filStream);
		byte[] dat = new byte[44];
		Array.Copy(Encoding.ASCII.GetBytes("RIFF"), 0, dat, 0, 4);
		Array.Copy(BitConverter.GetBytes((UInt32) 88232), 0, dat, 4, 4);
		Array.Copy(Encoding.ASCII.GetBytes("WAVE"), 0, dat, 8, 4);
		Array.Copy(Encoding.ASCII.GetBytes("fmt "), 0, dat, 12, 4);
		Array.Copy(BitConverter.GetBytes((UInt32) 16), 0, dat, 16, 4);
		Array.Copy(BitConverter.GetBytes((UInt16) 1), 0, dat, 20, 2);
		Array.Copy(BitConverter.GetBytes((UInt16) 1), 0, dat, 22, 2);
		Array.Copy(BitConverter.GetBytes((UInt32) 44100), 0, dat, 24, 4);
		Array.Copy(BitConverter.GetBytes((UInt32) 88200), 0, dat, 28, 4);
		Array.Copy(BitConverter.GetBytes((UInt16) 2), 0, dat, 32, 2);
		Array.Copy(BitConverter.GetBytes((UInt16) 16), 0, dat, 34, 2);
		Array.Copy(Encoding.ASCII.GetBytes("data"), 0, dat, 36, 4);
		Array.Copy(BitConverter.GetBytes((UInt32) 88200), 0, dat, 40, 4);
		br.Write(dat);
		for (int i = 0; i < 44100; i++)
		{
			double rad = (double) i / 44100 * 2 * Math.PI;
			double Wave = Math.Sin(rad * 440);
			short dd = (short) (Wave * 10000);
			br.Write(BitConverter.GetBytes((UInt16) dd));
		}
		MessageBox.Show("ok");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
cscの作法 その18 mouseを追いかけるやつ

# 概要

cscの作法、調べてみた。
練習問題やってみた。

# 練習問題

mouseを追いかけるやつ。

# 写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2d22580a-496b-6c1d-f397-0fa7f466301a.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	int posx;
	int posy;
	form1() {
		Text = "mouse";
		ClientSize = new Size(300, 300);
		this.MouseMove += new MouseEventHandler(mouseMove);
	}
	void mouseMove(object sender, MouseEventArgs e) {
		Text = "mouse: (" + e.X + ", " + e.Y + ")";
		posx = e.X;
		posy = e.Y;
		Invalidate();
	}
	protected override void OnPaint(PaintEventArgs e) {
		Graphics g = e.Graphics;
		Brush red = new SolidBrush(Color.Red);
		double x;
		double y;
		double b;
		double a;
		if ((posx - 24) == 0) return;
		a = Math.Atan((posy - 24) / (posx - 24));
		if (a < 0)
		{
			b = -6;
		}
		else
		{
			b = 6;
		}
		x = Math.Cos(a) * b + 24;
		y = Math.Sin(a) * b + 24;
		g.FillEllipse(red, (int) x, (int) y, 10, 10);

		if ((posx - 54) == 0) return;
		a = Math.Atan((posy - 24) / (posx - 54));
		if (a < 0)
		{
			b = -6;
		}
		else
		{
			b = 6;
		}
		x = Math.Cos(a) * b + 54;
		y = Math.Sin(a) * b + 24;
		g.FillEllipse(red, (int) x, (int) y, 10, 10);
		g.DrawEllipse(Pens.Blue, 19, 19, 20, 20);
		g.DrawEllipse(Pens.Blue, 49, 19, 20, 20);
		base.OnPaint(e);
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}





```

以上。
"buildconfigs.build.openshift.io xxxx already exists"の対処方法

OpenShiftやminishiftを利用していて、oc new-buildコマンドを実行したときにタイトルのようなエラーメッセージが出力される場合があります。その場合の対処方法の１つを紹介します。

# エラーメッセージ

```
error: buildconfigs.build.openshift.io xxxx already exists
```

# 調査方法

まず、過去に同じ名前でアプリケーションをビルドしようとしていた場合は、ビルドコンフィグの状態がどのようになっているかを確認します。

```
$ oc get bc
NAME           TYPE   FROM   LATEST
xxxx           Docker Binary  1
```

上記のように、過去に登録して今は利用していないビルドコンフィグが残り続けていることが原因のことが多いです。

# 対処方法

ビルドコンフィグが不要な場合は削除します。

```
$ oc delete bc xxxx
buildconfig.build.openshift.io "xxxx" deleted
```

# 参考

- [OpenShift - BuildConfigの削除](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.2/html/builds/builds-basic-delete-buildconfig_basic-build-operations)
シェルスクリプトで部分文字列の取得時に「substring expression < 0」と出るときの対処

ファイル名から`.md`の拡張子のみ除外したいと思い、`${str:start:end}`の構文で以下のように実現しようと思った。

```
#!/bin/bash

str="hello.md"
echo ${str:0:-3}
```

この処理は「文字列の先頭から終端の3文字前までのstrを出力する」であるため、`hello`と表示されるのが望ましい。

しかし、これを実行すると`-2: substring expression < 0`とエラーが出てしまう。

これを解決するには、変数に格納された文字列の長さを表す`#`を利用し、以下のように修正すると正常に動作する。

```
#!/bin/bash

str="hello.md"
echo ${str:0:${#str}-3}
```

## 参考
- [string manipulation \- Bash 4\.3 Substring Negative Length on OS X \- Super User](https://superuser.com/questions/1033273/bash-4-3-substring-negative-length-on-os-x)
毎日のごはんを楽に記録する Part4

#はじめに
前回投稿した[毎日のごはんを楽に記録する Part3](https://qiita.com/kaji-tan/items/b1e5545ead076cc6beca)の続きです。
今回は***毎週土曜日の朝になったら、先週食べた晩ごはんリストをSlackに自動投稿する機能***を作ります。

#動作フロー
1. [毎日のごはんを楽に記録する Part3](https://qiita.com/kaji-tan/items/b1e5545ead076cc6beca)で作成したデータベースをもとにします。
2. GASで土曜日のAMにトリガーをかけ、データベースから先週の晩ごはんデータを収集し、SlackへPOSTします。

#できるようになったこと
毎週土曜日の朝になったら、先週食べた晩ごはんリストがSlackに自動投稿されます。
これにより、先週はお肉が多かったな　とか、外食が多かったな　と振り返ることができます。
![おうちハック.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545683/b4d88211-8a82-d725-82d5-38a9b6e2ee40.jpeg)


#詳細
よくよく考えると、[毎日のごはんを楽に記録する Part3](https://qiita.com/kaji-tan/items/b1e5545ead076cc6beca)で実装した処理を少しいじって、さかのぼる日数を変更するだけで実現できることに気づきました。
なので、[Part3](https://qiita.com/kaji-tan/items/b1e5545ead076cc6beca)の処理を関数呼び出しだけで完結できるようにしました。<br>
修正点は以下のみです。
1. 引数termを設定し、さかのぼる日数を指定できるようにした。
2. Slackに投稿する際の文言に、さかのぼる日数を踏まえるように修正した。

#関連箇所のコード抜粋
```Java:weeklyCheck.gs
//毎週土曜日のAMにトリガーがかかる
//EatListから先週の晩ごはんの内容を抽出し、Slackの特定チャネルへPOSTする。
function weeklyCheck() {
  var dinnerlist = ansEatList(7);  //とりあえず1週間（7日）
  postSlack(dinnerlist);  //SlackへPOST
}
```


```Java:main.gs
//リスト出力要請があったらSlackへ出力
function ansEatList(term){
  
  //必要情報の取得
  var today = new Date();                                                     //現在日付を取得
  var currentday = Utilities.formatDate(today,"JST","yyyy/MM/dd");            //日付を切り出し
  
  //listシートを指定
  var url = "https://docs.google.com/spreadsheets/d/XXXXXXXXXXXXXX/edit#gid=0";
  var SpreadSheet_Input = SpreadsheetApp.openByUrl(url);
  var Sheet_Input = SpreadSheet_Input.getSheetByName("list");
  
  //最終行取得
  var lastrow = Sheet_Input.getLastRow();
  
  //さかのぼる期間を設定(とりあえず2週間)
  var startday = new Date(today.getYear(), today.getMonth(), today.getDate() - term);
  
  //startdayからcurrentdayまでの晩御飯を取得して配列に格納する
  //格納用配列宣言
  var array = []; //date, menu
  
  for(var i = 2; i <= lastrow; i++){
    //まずD列の日付を見て対象期間かを判断する
    var setday = Sheet_Input.getRange(i, 4).getValue();  
    
    if(setday >= startday){
      //F列の分類を見て晩御飯かを判断する
      var setmenutype = Sheet_Input.getRange(i, 6).getValue();

      //晩御飯と判断して日付とメニューを配列へ格納する
      if(setmenutype.match(/晩/) || setmenutype.match(/夜/) || setmenutype.match(/夕/)){
        var setmenu = Sheet_Input.getRange(i, 2).getValue();
        var setday2 = Utilities.formatDate(setday,"JST","MM/dd");  
        var content = [setday2, setmenu];
        array.push(content);
        
      }else{
        //晩御飯でなければ何もしない
      }
    }else{
      //対象期間外なので何もしない
    }
  }
  
  //配列の中身をSlack投稿用に整える
  var ret = "直近" + (term/7) + "週間の晩ごはんリストです。\n" + array.join("\n");
  
  return ret;
}
```

#得た知識
固定値はすべて外だししておくことで、再利用が簡単になるので、
関数定義の際は意識する必要がある。
PHP マジックメソッドと遅延静的束縛

## マジックメソッド
- インスタンスがある特定の条件になったときに、明示的にcallしなくても暗黙的にcallされるメソッド。
- 名前の先頭2文字がアンダースコア(__)になっている。
- 必ずpublicで定義する必要あり。
- マジックメソッドの引数は参照渡しはできない。

```php
<?php
class SampleClass
{
    private $values = array();

    //getter
    public function __get($name)
    {
        echo "__get: $name", PHP_EOL;
    }

    //setter
    public function __set($name, $value)
    {
        echo "__set: $name setted to $value", PHP_EOL;
        $this->values[$name] = $value;
    }

    //アクセス不能なプロパティにisset()を実行
    public function __isset($name)
    {
        echo "__isset: $name", PHP_EOL;
        return isset($this->values[$name]);
    }

    //アクセス不能なプロパティにunset()を実行
    public function __unset($name)
    {
        echo "__unset: $name", PHP_EOL;
        unset($this->values[$name]);
    }

    //アクセス不能なメソッドを呼び出す
    public function __call($name, $args)
    {
        echo "__call: $name", PHP_EOL;
    }

    public function __invoke($name)
    {
        echo "__invoke: $name", PHP_EOL;
    }
}

$obj = new SampleClass;

//アクセス不能プロパティに10を代入する
//__set()が呼ばれる
$obj->foo = 10;

//アクセス不能プロパティの$fooを取得する
//__get()が呼ばれる
$obj->foo;

var_dump(isset($obj->foo)); //true

//アクセス不能なプロパティに対してunset()を実行
//__unset()が呼ばれる
unset($obj->foo);
var_dump(isset($obj->foo)); //false

//アクセス不能なメソッドを呼び出す
//___call()が呼ばれる
$obj->bar();
```

## 遅延静的束縛(Late Static Bindings)
- 継承されたクラスのメソッドなどを親クラスで解決する機能
- 直近の `非転送コール` のクラス名を保存します。
- `static`キーワードをつける。
- 普通にインスタンスからアロー演算子でアクセスする時と同じような挙動になる。

####非転送コール
- self:: や parent::、static:: による静的なコール

####転送コール
- クラス名::といったクラス名を明示したコール

####self::の制限
>self:: あるいは \__CLASS__による現在のクラスへの静的参照は、 そのメソッドが属するクラス (つまり、 その>メソッドが定義されているクラス) に解決されます。

https://www.php.net/manual/ja/language.oop5.late-static-bindings.php



```php
<?php
class Foo
{
    public function helloGateway()
    {
        self::hello();
    }

    public static function hello()
    {
        echo __CLASS__, ' hello!', PHP_EOL;
    }
}

class Bar extends Foo
{
    public static function hello()
    {
        echo __CLASS__, ' hello!', PHP_EOL;
    }
}

$bar = new Bar();
//Fooを継承しhello()メソッドをオーバーライドしたBarクラスでも
//自分自身の親が持つメソッドを参照することができない。
$bar->helloGateway(); //Foo hello!
```
staticキーワードを用いることで、実行時に最初にコールされたクラスを参照する。

```php
<?php
class Foo
{
    public function helloGateway()
    {
       static::hello(); //遅延静的束縛
    }

}
--------------------
$bar = new Bar();
$bar->helloGateway(); //Bar hello!
```

## 参考

公式ドキュメント
https://www.php.net/manual/ja/language.oop5.magic.php
https://www.php.net/manual/ja/language.oop5.late-static-bindings.php
とりあえずjupyterにimportしとくやつら

更新していきたいやーつですね。

不要なものはimportしないほうが良いのは百も承知ですが、
どんな敬虔なエンジニアも言うて前のソースからコピペしてると思うので。

```python
import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
# Suppress warnings 
import warnings
warnings.filterwarnings('ignore')
import gc

# matplotlib and seaborn for plotting
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

#追記
import json
import datetime
import math

#importじゃないけど、個人的には省略されて良いことがあまりないので・・
pd.set_option('display.max_columns', 500)
pd.set_option('display.max_rows', 1000)

```
ちなみにjupyterに自動でimportする方法は以下の記事などに詳しいです。
今度試そう。
https://recruit-tech.co.jp/blog/2018/10/16/jupyter_notebook_tips/
[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン ～Prototype～

この記事シリーズは、iOS/Swiftエンジニアである執筆者個人が、
**ごく普通のiOSアプリ開発でよくある状況**や
**Swiftのコアライブラリやフレームワークで使われているパターン**に
着目してデザインパターンを学び直してみた記録です。

**関連記事一覧**
[[iOS/Swift] アプリ開発の実務的アプローチで学ぶデザインパターン](https://qiita.com/y-some/items/96db5f24ded4a1fab48f)

# Prototypeパターン概要

- **生成済みのインスタンスを元に別のインスタンスを作り出すパターンです。**
- GoFのデザインパターンでは**生成に関するパターン**に分類されます。

# 使い所

- Swiftのclassは参照型なので、classAのインスタンスを変数Xから変数Yに代入すると、いずれも同じインスタンスへの参照になってしまいます。大抵の場合は、classAの新しいインスタンスを生成して変数Yに格納すれば済む話だったりしますが…
- classAに、「変数Xのプロパティ値をそのまま変数Yに引き継ぎたい」という場面が多い、という特性がある場合にはPrototypeパターンが使えるかもしれません。
- 具体的な例としては、Realmデータベースにおけるオブジェクトコピーです。（参考）[Realmオブジェクトのクローン](https://www.ukeyslabo.com/development/iosapplication/realm/copy-realm-object/)


# サンプルコード

Swiftバージョンは 5.1 です。

```swift
class Person {
    var firstName: String
    var familyName: String

    init(firstName: String = "", familyName: String) {
        self.firstName = firstName
        self.familyName = familyName
    }

    // 自分自身の値をセットして新しいインスタンスを生成する
    func clone() -> Person {
        return Person(firstName: self.firstName, familyName: self.familyName)
    }
}

let prototype = Person(familyName: "Yamada")

let person1 = prototype.clone()
person1.firstName = "Taro"
print("firstName: \(person1.firstName), familyName: \(person1.familyName)")
// firstName: Taro, familyName: Yamada

let person2 = prototype.clone()
person2.firstName = "Hanako"
print("firstName: \(person1.firstName), familyName: \(person1.familyName)")
// firstName: Taro, familyName: Yamada
print("firstName: \(person2.firstName), familyName: \(person2.familyName)")
// firstName: Hanako, familyName: Yamada
```
[RubyonRails]ちょくちょく出てくる「We're sorry, but something went wrong.」の解決の流れ

お疲れ様です！
サーバを立ち上げると、ちょくちょく目にする

# 「We're sorry, but something went wrong.」
#→直訳すると「申し訳ございません。不具合が発生しました。」

毎回、検索してしまいます。

解決の流れは、

##db/development.logを参考にしています。

```
Completed 500 Internal Server Error in 66ms (ActiveRecord: 45.1ms | Allocations: 10687)
```
大体の確率で500エラーが発生しており、新しく実装するビューの構文エラーが多いような気がします。
(それ以外のケースをまだ見たことがないので、追加であった場合には追記します。)

ありがとうございました！
VSCodeを使い始めてみた。

#VSCodeを使ってみた。

Qiita初めての投稿です。
現場では、ViualStudioを主に使っているのですが、ライセンス料がそれなりに、高い。

正直ビルドが激重いので、
それなりの高スペックのＰＣが必要。
プログラミングの時間よりもビルドに時間がかかる。

最近、VSCodeというツールを教えてもらって
軽量で豊富なライブラリツールも、容易にインストールできると
知って、趣味で使ってみようかなと思い始めた次第です。
ゆる～く投稿していこうかなと思ってます。

##環境
・Windows 10 

##インストール
※インストール方法は、省きます。
https://code.visualstudio.com/


インストールして起動すると、起動速度もはやっ!
でも、英語で起動される。。。
次は、googleで検索して、日本語表示にしてみようかな。。

![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498128/6b3ca607-7c12-67d3-acc9-35e4b9b7a948.png)
centos 8 に docker,docker-composeをインストールする方法


## 前提環境
```
[root@localhost ~]# cat /etc/redhat-release
CentOS Linux release 8.0.1905 (Core)

[root@localhost ~]# uname -r
4.18.0-80.el8.x86_64
```

## 更新
```
# dnf -y update
```
#repo登録

```
# dnf repolist
# dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.2-3.3.el7.x86_64.rpm
dnf install containerd.io-1.2.2-3.3.el7.x86_64.rpm

```

# systemctl設定
```
# systemctl start docker
# systemctl enable docker
```

# docker-composeのインストール
```
# curl -L "https://github.com/docker/compose/releases/download/1.25.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# chmod +x /usr/local/bin/docker-compose
```

# docker version確認
```
# docker --version
Docker version 19.03.5, build 633a0ea

# docker-compose --version
^[[Adocker-compose version 1.25.0, build 0a186604
```
【Vue.js】ドットインストールTodoリストに、一括選択機能を追加してみた

ドットインストールの[「Vue.js入門」](https://dotinstall.com/lessons/basic_vuejs_v2)という、Vue.jsでTodoリストを作るレッスンがあるのですが(有料)、リストを一度に全部選択する「一括選択機能」を追加したかったので付け加えてみました。

Vue初心者、かつ[「Vue.js入門」](https://dotinstall.com/lessons/basic_vuejs_v2)を終えた、かつ「一括選択機能を追加したい」と思った人にしか参考にならないかもしれませんが、、書かせて頂きます。

# 完成イメージ
![todos.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/486397/d42a3de9-6790-0cb6-5556-28b57bcfc5eb.gif)


# index.html 追加コード

```index.html

    <button @click="selectAll">Select All</button>
    <button @click="rmvAll">Remove All</button>
```
`Select All` と `Remove All` のボタンを追加。
それぞれのボタンにv-onディレクティブを設定。

# main.js 追加コード

```main.js
selectAll: function() {
      for(var i=0; i<this.todos.length; i++) {
        this.todos[i].isDone = true
      } 
    }, 
rmvAll: function() {
      for(var i=0; i<this.todos.length; i++) {
            this.todos[i].isDone = false
          }             
```
【処理内容】
・`Select All`をクリックすると、todos配列のisDoneキーの値がtrue(= チェックボックスにチェック)になる。
・`Remove All`をクリックすると、todos配列のisDoneキーの値がfalse(= チェックボックスのチェックがなし)になる。


```todos配列の動き.js
//Remove Allボタンをクリックで isDone:true → isDone:false になる
//Select Allボタンをクリックで isDone:false → isDone:true になる
todos: [
  {title: "aaa", isDone: true}, 
  {title: "bbb", isDone: true},
  {title: "ccc", isDone: true},
  {title: "ddd", isDone: true}
]
```


# まとめ
本当は、1つのボタンで一括選択⇄一括解除の切り替えができるようにしたかったのですが、詰まってしまったので、まずはそれぞれのボタンを作成することで作成してみました。
Synology NAS で let's encrypt を使って証明書を発行する

DSMにログインして、[コントロールパネル]→[セキュリティ]→[証明書]→[追加]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/5d4495f5-32b8-8f9e-a8c1-7ec83b815fd7.png)
[新しい証明書を追加してください]を選択して次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/9555a99e-bb9c-556a-98d2-c68babfeabec.png)
[Let's Encrypt からの証明書をお受け取り下さい]を選択して次へ
Synology NAS内で使う既定の証明書に設定したい場合は、[規定値としての証明書に設定します]にもチェックを入れておきましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/818275d3-40b8-86b4-3f34-84dd51db94a4.png)
必要な項目を入力します。
ドメイン名は発行するドメイン名が別途決まっているならそれを、
Synology NASで使うものであれば、別途発行したものでもSynology NASで発行したものでもDDNSのホスト名を入力すればいけると思います。
メールアドレスは普通に自身のメールアドレスを、
サブジェクトの別名は任意の項目です。空でも構いません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/0f8ea6dd-6dfe-6a70-521a-1991f9cd07e2.png)
適用を押すと少しグルグルしてから問題が無ければ、新しく発行されます。
一覧の上の[構成]をクリックすると既存の証明書使用箇所で使う証明書を切り替えることが出来ます。
証明書を右クリックすると更新やエクスポートすることが出来ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100313/3c998aab-e016-d477-7396-3d2af9ccee5d.png)

エクスポートした場合、
`archive.zip` というファイル名でzipがダウンロードできて
展開すると
- cert.pem
- chain.pem
- privkey.pem
の３ファイルを取得できます。
cscの作法 その17 mouse

#概要

cscの作法、調べてみた。
mouseイベント使ってみた。

写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2c653b1c-4649-7eb9-ed11-c9235afbd9f3.png)


サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;

class form1: Form {
	form1() {
		Text = "mouse";
		ClientSize = new Size(300, 300);
		this.MouseMove += new MouseEventHandler(mouseMove);
	}
	void mouseMove(object sender, MouseEventArgs e) {
		Text = "mouse: (" + e.X + ", " + e.Y + ")";
	} 
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}


```

以上。
cscの作法 その16 datagrid

# 概要

cscの作法、調べてみた。
datagrid使ってみた。

# 写真
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/6522da6a-7946-8cd3-4410-c8d08724603b.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;

class form1: Form {
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(400, 300);
		DataGridView gd0 = new DataGridView();
		gd0.Location = new Point(50, 20);
		Controls.AddRange(new Control[] {
			gd0
		});
		OleDbConnection con = new OleDbConnection();
		con.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\test.mdb";
		con.Open();
		OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM blog_data;", con);
		DataTable dt = new DataTable();
		oda.Fill(dt);
		gd0.DataSource = dt;
		con.Close();
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}

```

以上。
ラズパイによる自宅Gitサーバー構築

githubという無料で便利なサイトがありますが、公開してはならない大事なファイルが含まれるときや、Web上にアップしたくない、他の人に公開したくない時は、自宅内サーバーが有効です。Raspberrypi4の登場で使わなくなった古いラズパイの活用として省電力なラズパイにGitサーバーを構築することにしました。

### ラズパイ 側

ラズベリアンをインストールしたら、

固定IPアドレスにする

```
$sudo vi /etc/dhcpcd.conf 
```

テキストを編集し、IPアドレスが他の機器と被らないようにして自分の環境は以下のようにした。
私の場合は、viではxキーでコメントアウト（＃）を削除し以下のように編集しました。
LANケーブル使用している場合はeth0

```
interface eth0
static ip_address=192.168.10.100/24
static routers=192.168.10.1
static domain_name_servers=8.8.8.8 1.1.1.1
```

escキーを押して:xと入力し再起動します。

```
$sudo reboot
```

パッケージをインストール（最近のものはインストール不要かもしれません。）

```
$sudo apt-get install git-core
```

takeochanという任意の名前のユーザーとフォルダを作ります。
ユーザーを切り替える（アクセス制限のため）

```
$sudo adduser takeochan
```

パスワードを設定したら、piからtakeochanへユーザーを切り替えて

```
$su takeochan
```

```
$cd /home
```

```
$mkdir takeochan
```

```
$mkdir /takeochan/testgit
```

```
$cd /takeochan/testgit
```
ノンベアレポジトリで作成（作業ディレクトリを持たない）

```
$git init --bare
```

HEAD、Branchなどファイルができる。

## クライアント側（PC）
ターミナルを起動し
例：Windows11を使用した場合、Windowsキーを押しながら、Rボタンを押して、cmdと入力する。
ファイル名を指定して実行のテキストボックスにcmdと入力する。

Windows Bashを起動させる。

```
C:\Users\usersname>bash
```

ログインする

```
takeo@PCname:/mnt/c/Users/usersname$
```

作業ディレクトリを作成して移動する(Cドライブのユーザーディレクトリに作られる。)

```
$ mkdir TakeoChanEagleFiles
```

```
$ cd TakeoChanEagleFiles
```

gitを初期化する。

```
$git init
```

.gitファイルができているか確認する。

```
$ls -alt
```

テスト用に適当なファイルを追加し、更新するファイルを登録。

```
$git add .
```

更新する場合は、

```
$git add -u
```

コメントを残す。

```
$git commit -m 'FirstComitment'
```

ローカルレポジトリとリモートリポジトリを関連付けし、登録する。

```
$git remote add origin takeochan$192.168.10.100:/home/takeochan/testgit
```

参考：登録を変更する場合は、
登録済みリポジトリを確認

```
$git remote -v
```

参考：登録変更

```
$git remote set-url origin takeochan$192.168.10.100:/home/takeochan/testgit
```

リモートレポジトリへ更新する

```
$git push origin master
```

リモートレポジトリから更新する

```
$git pull origin master
```


以上

#gitメモ

レポジトリごとクローンする場合
`
$git clone takeochan@192.168.10.100:/home/takeochan/testgit
`


状態を確認する
`
$git status
`

差分を確認する（複数人で競合したら競合している部分を確認して自己解決する）
`
$git diff
`

変更履歴を確認する
`
$git log
`

$git merge origin/master

メモ
アクセス権に注意しよう。
VScodeでのバックスペースキーやエンターキーが反応しなくなった時の対処法について



<p>VSCodeでプログラミング入力していると、突然バックスペースキーや方向キー、エンターキーの反応がなくなりました。それまでは問題なくキー操作できていたのですが・・・(　ﾟдﾟ)<br>VSCodeで同様のケースは珍しくないとのこと。<br>
原因はいろいろあるかと思いますが、私の場合は以下の方法で解消できましたのでご紹介します。</p>
<h2>拡張機能「Vim」をアンインストールする</h2>
<p>拡張機能「Vim」は、タイトル通りVSCodeをVim風のキーバインドとして利用できるようにするものです。Vimは高機能のカスタマイズ性により使用されるエンジニアの方も多いですが、それゆえ特殊なコマンドやキーバインドが多い、という特徴があります。</p>

<p>VSCodeには数多くの拡張機能があり、とても便利な機能を簡単に追加し自分の使いやすいようカスタマイズできるのですが、便利だと言ってどんどんインストールしていくと、中には思いもよらぬ動作やエラーの原因になることも・・・。</p>

<p>私の場合はインストールしていた拡張機能「Vim」をアンインストールすると、キーの操作性が元に戻りました。<br>
<img width="641" alt="スクリーンショット 2020-01-02 14.37.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551426/896508ef-001b-4ca4-89ef-121e1f7bf012.png">
</p>

<p>私はVSCodeセットアップ時、Vim風にするつもりがないのにうっかりこの拡張機能をインストールして思わぬキー操作になり困惑しました。(;^ ^)<br><br>

「あれ？」ということがありましたら、一度インストール済みの拡張機能を見直されてみるのもいいかも知れません。</p>
[Ruby on Rails]Slim化のgemは何を用いるのか

備忘録として。
以下の２つのgemを用いるようです。

```
gem 'slim-rails'
gem 'html2slim'

```

```
$ bundle install
```

```
$ bundle exec erb2slim

```

コマンドで実際にデフォルトのERBからSlim化を行います。
STM32CubeIDEでプロジェクトのコピー

#はじめに
テスト用のプロジェクトを作成して、それをコピーして別のプロジェクトを作りたいことは、よくあると思います。STM32CubeIDEでそれをやってみました。

#プロジェクトのコピー
まずはプロジェクトエクスプローラーでコピーしてペーストします。プロジェクトはアクティブにする必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/81380863-6761-1c1f-93b9-582d69a0ed53.png)
そのあとペーストします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/a92657a5-fc3b-025b-08dd-59206884550e.png)
プロジェクトの名前をつけます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/0d93b4b7-ebf3-9e58-fe26-3532253595bb.png)

#*.iocファイルの修正
*.iocファイルを開こうとするとこんなエラーが出ます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/81e33d15-a13d-df22-71e3-b352cb523dbd.png)
これはプロジェクトエクスプローラーで*.iocファイルを新しいプロジェクト名と合わせることで回避できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/9d330501-ef44-b203-12ae-c9c951ff4439.png)
Saveしてコード生成します。

#実行バイナリの選択
F11でプログラム実行時に、実際に新しく生成したバイナリを選びます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263486/f2758855-630a-a2ba-db67-3c87af0ee2d2.png)

#おわりに
これで、STM32CubeIDE上でプロジェクトのコピーが可能です。