OmniAICreator/Qiita-1.07M huggingface dataset:
eslint-plugin-simple-import-sort で import の自動ソートを行う

https://zenn.dev/frontier/articles/20220511-eslint-plugin-simple-import-sort のクロスポストです。

---

[Frontier](https://frontierjs.herokuapp.com) では Next.js を採用しており、ESLint では`eslint-config-next`と`eslint-config-prettier`を利用したシンプルな設定にしていたのですが、`import`の記述を整理するために [eslint-plugin-simple-import-sort](https://github.com/lydell/eslint-plugin-simple-import-sort) を採用することにしました。

## `.eslintrc.json` の記述例

以下は現在プロジェクトで実際に使っている`.eslintrc.json`の内容です。

```json
{
  "extends": ["next/core-web-vitals", "prettier"],
  "plugins": ["simple-import-sort", "import"],
  "rules": {
    "simple-import-sort/imports": "error",
    "simple-import-sort/exports": "error",
    "import/first": "error",
    "import/newline-after-import": "error",
    "import/no-duplicates": "error"
  }
}
```

記述内容は eslint-plugin-simple-import-sort の [README](https://github.com/lydell/eslint-plugin-simple-import-sort#example-configuration) を参考にしています。このシンプルな設定だけで、`import`の順番を自動で整理してくれるのは嬉しいですね。

パッケージの思想としても、シンプルな設定を心がけていることが [README](https://github.com/lydell/eslint-plugin-simple-import-sort#not-for-everyone) から確認できます。複雑な設定が不要で、最低限いい感じの挙動を担保したい場合にうってつけだと思うので、気になる方はぜひ試してみてください ✨
neosでlogix その74

# 概要
neosでlogixやってみる。
Desktop modeで、Standard Controllerノードを使ってみた。


# 写真

![2022-05-10 20.42.31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/350e575d-a73f-67e4-f267-e94d3bb12230.jpeg)

# 結果

|出力|アクション|
|:--|:--|
|        Primary	|		左クリック
 |       Secondary	|	rキー
  |      Grab		|	右クリック
   |     Menu		|	tキー



以上。
neosでlogix その73

# 概要
neosでlogixやってみる。
Desktop modeで、飛んでみた。

# 写真

![2022-05-10 20.44.10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/b428e93a-6b74-4189-9e8c-1d675bd5cf7e.jpeg)

# 手順

- tで、コンテキストメニューを表示。
- 移動方法フライをクリック。
- spaceで、上昇。
- cで、下降。

以上。
About python class constant and scope

```python
class Hoge:
    PRIORITY = 1
    def hoge(self,p=PRIORITY, priority=4): # not self.PRIORITY
        print(self.PRIORITY,p,priority)

print(Hoge.PRIORITY) # could not use PRIORITY
r = Hoge()
r.priority = 7
r.hoge()
r.hoge(3)
r.hoge(3,5)
r.hoge(2)
print(Hoge.PRIORITY,r.priority) # could not use PRIORITY
```

```
1
1 1 4
1 3 4
1 3 5
1 2 4
1 7
```
numpyのobject型による参照の共有（アンチパターン）

numpyでデフォルトの値をlist型に設定していると、設定用の変数が書き換わってしまうケースがあるようです。

設定用の変数: default_dict (before {'a':[]} -> after {'a':[hoge]} )
# step1 データ作成

```python
>>> import numpy as np
>>> import pandas as pd

>>> dtype = [('a','O')]
>>> default_dict = {'a':[]}

>>> arr = np.array(tuple(default_dict.values()),dtype=dtype)
>>> pd.DataFrame(arr)
    a
0  []
```
# step2-1 データの変更
```python
>>> arr['a'][0].append('hoge')
>>> pd.DataFrame(arr)
        a
0  [hoge]
```

1行目に対して処理を実行したつもりでも、2行目も変更されてしまう

# step2-2
```python
>>> # 元々のdefault_dict:  default_dict = {'a':[]}
>>> print(default_dict)
{'a': ['hoge']}
```

step2-1の処理によって、default_dictの値も変更されている

# 解決策1: copy.deepcopy
```python
arr = np.array(copy.deepcopy([tuple(default_dict.values())]),dtype=dtype)
```

# ソースコードの全て
```python
import numpy as np
import pandas as pd
from IPython.display import display

dtype = [('a','O')]
default_dict = {'a':[]}

arr = np.array([tuple(default_dict.values())],dtype=dtype)
display(pd.DataFrame(arr))

arr['a'][0].append('hoge')
display(pd.DataFrame(arr))

print(default_dict)
```
.editorconfigの記述方法

## はじめに
EditorConfigを利用することで複数のテキストエディタやIDEでインデントや改行コードなどの設定を共有することができます。
設定は`.editorconfig`に記述します。
この`.editorconfig`の記述方法について記載します。

https://editorconfig.org/#overview

なおVSCodeの場合には、以下の拡張機能をインストールすることで使用可能です。

https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig

![スクリーンショット 2022-05-11 午前4.04.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/9b2b5d10-9673-4631-d994-185b112ec505.png)

## `.editorconfig`の記述方法
以下のように記述します。
```.editorconfig
root = true

[*]
end_of_line = lf
trim_trailing_whitespace = true
insert_final_newline = true
indent_style = space
indent_size = 2

[*.md]
trim_trailing_whitespace = false
```

設定できる主な項目は以下のとおりです。

| 設定名 | 説明 |
-----|----
[...] | 対象ファイルを指定。
root| trueにすることで`.editorconfig`以下のディレクトリに設定を適用する。
end_of_line | 改行コードを指定する。`lf`,`cr`,`crlf`から選択。
indent_style | ハードタブかソフトタブかを指定。`tab` , `space`から選択。
indent_size | インデントのサイズを指定。`2` , `4`から選択。
charset | 文字コードを指定。`latin1` , `utf-8` , `utf-8-bom` , `utf-16be` , `utf-16le`から選択。
tab_width | タブの幅を指定する。省略するとindent_sizeが適用される。
trim_trailing_whitespace | 行末の空白を削除。
insert_final_newline | ファイルの末尾が改行ではない場合に補完。

https://editorconfig.org/#example-file
Amazon Linux2にPython 3.10をインストールした時のメモ


opensslは1.1.1にあげないとインストール後にpipで何かインストールしようとしたときに
SSLのエラーが出た。色々調べた結果、openssl-develを消して、openssl11とopenssl11-develを
入れるとよいというのを見つけて試したらうまくいった。

```sh
sudo yum remove -y openssl-devel
sudo yum install -y openssl11 openssl11-devel

wget -c https://www.python.org/ftp/python/3.10.4/Python-3.10.4.tar.xz
tar -Jxvf Python-3.10.4.tar.xz
cd Python-3.10.4
./configure --enable-optimizations
make
sudo make install
cd
python3.10 -m venv py310
source ~/py310/bin/activate
```
go: json.Unmarshal(data, slice)

```go
package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	cases := []struct {
		in []byte
	}{
		{
			in: []byte(`[]`),
		},
		{
			in: []byte(`null`),
		},
		{
			in: []byte(``),
		},
		{
			in: []byte(nil),
		},
	}
	for _, tt := range cases {
		out := []string{}
		err := json.Unmarshal(tt.in, &out)
		if err != nil {
			fmt.Printf("FAIL: %#v, err: %v\n", []byte(tt.in), err)
		} else {
			fmt.Printf("PASS: %s, out: %#v\n", []byte(tt.in), out)
		}
	}
}
```

```go
PASS: [], out: []string{}
PASS: null, out: []string(nil)
FAIL: []byte{}, err: unexpected end of JSON input
FAIL: []byte(nil), err: unexpected end of JSON input
```
価格コムのキープ機能を比較表URLに変換

* 2022/05/11のメモです。
* ほぼ日記調です。本編は`使い方`の項目からです。


https://kakaku.com/

# 価格comのキープ機能は便利だが・・・
* 消えやすく、保存出来ず、送れない。
* ローカルストレージに保存されてる。
    * 別のPCや人に送れない。
    * サーバーに保存されてない。
    * 消える可能性大。
        * PC引っ越しでほぼ消える。
        * プライバシー系の掃除してたらほぼ消える。
* 送りたいし、消えたら悲しいので、なんとかしたい。

# 他の使えそうな機能
* お気に入り
    * 簡単に登録できる
    * 比較できない
    * ピックアップリストに登録できる
* ピックアップリスト
    * 下書きに簡単に追加できる
    * 下書きは一枚限定
    * 投稿するには、すべての製品にコメント必要？
        * ここで諦めた
* 比較表
    * 検索結果などからチェックして使える。
    * URLなので簡単に送れるし、誰でも見れる。
    * 文字も入れれる。
    * URLの変数もそのままなので、数個ならコピペで編集出来る。
    * https://kakaku.com/prdcompare/prdcompare.aspx?pd_cmpkey=K0001376771_K0001269921_K0001304408 こういうやつ。
    * **これしかない。**


# 比較表に変換するスクリプトを作った
* 総合時間ではコピペのほうが圧倒的に早い。

# 使い方
* 下のコードをコピーして、キープ一覧画面で、開発者ツールのコンソールに貼り付けて実行。
    * ただそういう攻撃もあるらしいので、軽くソースを読んでからのほうがいいらしい。
    
# コード
```js
var main = function() {
  //chromeなら$$、他は[...document.querySelectorAll()]
  let arr1 = $$("tr.lv0top.prdName a").map(v=>v.href)
  //イラン部分消し matchなら(?<=item.).+?(?=\/)
  arr1 = arr1.map(v=>v.replace('https://kakaku.com/item/', "").replace(/\/.*/, ""))
  //重複消し、[...(new Set())]も同じ。
  arr1 = Array.from(new Set(arr1))
  //urlを作る
  let url = 'https://kakaku.com/prdcompare/prdcompare.aspx?pd_cmpkey='
  url += arr1.join('_')
  window.open(url, '_blank')
  return url
}
main()
```

# 自分用の雑記
* 比較ページで実行したら、比較のURLに追記みたいなのも出来そう。
* 表示部から解析したけど、ローカルストレージからのほうが早いな・・・
* 久しぶりにJS触るからほとんど忘れてる。
    * for文の書き方も忘れたことある。
    * 子供の頃もすぐ忘れた。夏休み明けに、掛け算の筆算のやりかた忘れてた（懐
    * 中期の記憶領域の性能に問題がある。
* 価格コム、価格com、価格.com
    * どれで書くべきか迷う
* なんか数増えてる。カラーバリエーションのhrefも拾ってきてしまってる。
    * urlフィルタリングが汎用性から好きだけど、これは無理。
    * 要素でフィルタリングに変更
    * xpathでtext()=製品名でやってみた。毎回xpath忘れすぎ。
    * 普通に開発者ツールからセレクタコピーから削ったら良いかとcssセレクタに戻す。
    * Qiitaの差分を試してみる。コピーボタンは全部コピーされた。
* xpathの解説
    * `/`最初のスラッシュだけはdocumentになる。`//a`documentの 子孫のa
    *  `$x('//tr//*[text()="製品名"]/ancestor::tr//a')`
    *  ↑docの 子孫のtrの 子孫のなんでも(テキストが製品名)の 先祖のtrの 子孫の a
    *  最初の//tr は無くても良いが、テーブルなんで一応。
    *  覚書
        *  子供a⇔`/child::a`⇔ `/a`
        *  //self::a/self::a/self::a/ セルフならこんなことも出来る。
        *  親* ⇔`/parent::*` ⇔ `/..`
*  cssセレクタ覚書
    *  孫 ⇔ html>body>div ⇔ html div
*  xpathとcssセレクタのクロスのチートシート欲しい。
*  記憶復活にチートシートはすごい重要と再認識
    *  別言語で同じ意味の相互表は、学習コストめっちゃ下がりそう


```diff_javascript
+ let arr1 = $$("tr.lv0top.prdName a").map(v=>v.href)
- let arr1 = $$('a[href^="https://kakaku.com/item/"]').map(v=>v.href)
- let arr1 = $x('//tr//*[text()="製品名"]/ancestor::tr//a').map(v=>v.href)
```

# 参考リンク

https://qiita.com/rllllho/items/cb1187cec0fb17fc650a

https://takuya-1st.hatenablog.jp/entry/2015/07/30/004448

http://blog.bangboo.com/sub/xpath.html
ubuntuでのマウスホイール速度調整

ubuntuにおいての
マウスホイール速度の調整
自分用メモ


![Screenshot from 2022-05-11 02-52-36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2014630/cb58ff5a-15af-eb99-a5f7-6a00e0632ec5.png)
【Val()とは何なのか？】 A：HTML要素内のvalue値を取得するため

<h1>val()とは何か</h1>

<p>【説明】</p>
<div>
<ul>
<li>HTML要素の中で使用されているvalue値を取得するために使う
<li>（inputやtextareaで入力された値はそのHTML要素のvalue値に入る。）
<li>基本的には「対象要素.val()」として使う
<li>console.log($("#key").val())で、取得できているかどうかをコンソール内で確認することができる。これで動作しているかどうかを確認できる

```javascript:a
<input type="text" id="key">
const key = $("#key").val();
```
<li>上記のように、input内で入力された値を、定数keyとして中に入れて使うことが普通
</ul>
</div>
<p>その後の使い方はそれぞれあるが、例えば</p>
<div>
<ul>

`localStorage.setItem(key, memo);`

<li>これでローカルストレージの中にinputでHTML要素のvalue値に入力されたkey等の値を保存。

`const html = ’<tr><td>+key+</td><td>+memo+</td></tr>’`

<li>でtable要素になりうるように定数htmlに内包する。（ここではタグは表示されないのでコピペしない！）

```javascript: b
$("#list").append(html); // 下に追加する　上に追加するのはprepend
$("#key").val("");// 入力箇所を空に
$("#memo").val("");
```
<li>上記のものは個人的な備忘録なので、コピペして使用するものではありません。
</ul>
</div>
WSL2にCentOSをインストールする方法

## はじめに
こちらでは、WSL2にCentOSを導入する方法について解説していきます。
なお、[こちらの動画](https://www.youtube.com/watch?v=tUjyeVnQcmI)を参考にさせていただいています。動画の方が分かりやすいという方は、そちらをご覧ください。

### 環境
- Windows11
- WSL2 (デフォルトディストリビューション : Ubuntu 20.04.3 LTS)
- Docker Desktop
- cmd (コマンドプロンプト)

### 注意
こちらでは、Dockerを使用した導入方法を紹介しています。
Dockerを使用しない方法をお求めの方は、別の記事を参考にされることをオススメします。
それではさっそくやっていきましょう。

## 導入方法
まずは、コマンドプロンプトを起動していきます。
起動したら、以下の手順で進めていきます。

### CentOSのDocker imageをpullする
今回は最新バージョンを使用します。
```bash
$ docker image pull centos:latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
```

### CentOSのコンテナを作成する
デフォルトシェルをbashとして、CentOSのコンテナを作成します。
```bash
$ docker create -i centos bash
88e7e1b4a61f309cb198630f9c370c47f7afa731ecc4ddf675f6ac648fb933af
```

### tarファイルにexportする
``docker export``は、コンテナをtarファイルにexportするコマンドです。コンテナは、コンテナID(はじめの4文字でいい)で指定します。
```bash
$ docker export 88e7 > centos.tar
```

### tarファイルをWSL2にimportする
``wsl --import``の後には「ディストリビューション名」「import先のディレクトリ名」「import対象のファイル名」を指定します。
```bash
$ wsl --import Centos8 ./CentosImage/ centos.tar
```
これで、``./CentosImage/`` 配下にext4.vhdxがインストールされます。

# CentOSを起動する
ここからは、CentOSを起動してOS情報を確認していきます。
```bash
$ wsl -d Centos8
```

### インストールしたCentOSの情報を確認する
```bash
[root@username]# cat /etc/centos-release
CentOS Linux release 8.4.2105
# CentOSからログアウトします。
[root@username]# exit
logout
```

### CentOSをデフォルトディストリビューションに設定する
Ubuntuのままでいい方はこの操作は飛ばしてください。
```bash
$ wslconfig /s Centos8
```

### WSL2にインストールされているディストリビューションを一覧表示する
```bash
$ wslconfig /l
Linux 用 Windows サブシステム ディストリビューション:
Centos8 (既定)
docker-desktop-data
docker-desktop
Ubuntu
```
CentOSが追加されており、デフォルトディストリビューションに設定されていますね。

### 再起動する
最後に、WSL2ターミナルを再起動すればCentOSが追加されているはずです。
以上で解説は終了です。お疲れ様でした～。
ハッカーニュースみたいなサイト作った

Hacker News（以下、HN）は、コンピュータサイエンスとアントレプレナーシップに焦点を当てたソーシャルニュースサイトです。HNの「ハッカー」という言葉は本来の意味で使われており、技術いじりを楽しむ人々で構成されるハッカー文化を指しています。

### 作ったサイト
http://kuroto.news/

### HN
https://news.ycombinator.com/

### なぜ作ったのか
HNのようなサイトが日本語で存在すれば面白いのに、と思ったから。(似たようなことを考えた人が過去にいてちょっぴり作ったらしいですが、失踪しています。)

日本の技術動向がどんなものなのかパッと見れるサイトがほしいな、と思いました。でもTwitterだと情報過多でキュレーションがうまくいかないので、既存の仕組みでうまくいっているものが作りたかったわけです。

### まだ実験段階
ついさっき思いつきで作ったばかりですが、現時点ではベータ版的なもんです。バグがあるかもしれんので、そのときはサイトのContactからメールを送ってくれるとありがたいです。

本家のHNは2007年に作られましたが、<a href="https://trends.google.com/trends/explore?date=all&geo=CA&q=hackernews">軌道に乗るまでに3年</a>ぐらいかかってます。なので玄人ニュースも最初はバグフィックスだけやって、放置プレイします。

### 使い方
- 価値のある記事をシェアすること。
- 価値のある記事にupvoteすること。
- 価値のある記事でコメントして意見してみること。

### 機能概要
- ある条件を満たす投稿はTopページに表示され、ある基準でソートされる。
- newは最新順。
- pastは過去ログ。
- commentsは最新コメント (階層1のコメントのみ)
- submitで興味のあるコンピュータサイエンス系の記事を送る。
- loginへ行ってアカウント作成とログインができる。
[Ruby]moduleのメソッド定義についての学習記録

## まえがき
Web系エンジニア転職を目指して学習しております。
今回は「プロを目指す人のためのRuby入門」という書籍で学習している私の振り返り記録になります。
学習した内容全てではなく、一部分を取り上げて記録しております。
書籍の内容を記載しすぎるのは問題であると認識し、配慮しておりますが問題がある部分がありましたらご指摘頂けると幸いです。

## include?メソッド
呼び出したクラスオブジェクトに引数で渡したモジュールがincludeされているかをtrue or falseのBooleanで返す。include?メソット自体はStringクラスとArrayクラスにも同名のメソッドが定義されていますがあくまで今回のinclude?メソッドはClassクラスで定義しているinclude?メソッドと認識しています。この認識が正しいかは分からなかったので知っている方がいたらコメントで教えて頂きたいです。
```ruby
module Profile
end

class User
  include Profile
end

User.include?(Profile)
# true
User.include?(Introduce)
# false
```

## Enumerableモジュール
>配列やハッシュ、範囲(Range)など、何かしらの繰り返し処理ができるクラスにincludeされているモジュールです。
=> 「プロを目指す人のためのRuby入門」から抜粋

includeしているクラスでeachメソッドが定義されていればEnumerableモジュールで定義してあるメソッドを使用することが出来ます。
調べてみると私が知っているメソッドではcount, filter, find, select, sortなどがありました。
つまり、これらのメソッドが使用出来ていたのはクラス側でEnumerableモジュールをincludeしているからと理解することが出来ました。

## Comparableモジュール
>比較演算を可能にする(つまり値の大小を判定できるようにする)モジュール。
=> 「プロを目指す人のためのRuby入門」から抜粋

includeしているクラスで<=>（宇宙演算子）が定義されていればComparableモジュールで定義してあるメソッドを使用することが出来ます。

このモジュールをincludeしていることで\<, \>, =などのメソッドを使用することが出来ている。

## 最後に
モジュールについては他の方のポートフォリオやネットの記事で見かけることはありましたが、モジュール自体がどういった役割を持っているのか知らなかったのでこのモジュールの部分の学習がとても参考になります。
まだモジュールの内容が残っているので引き続き学習していきたいと思います。
Windows10でdocker toolbox を利用したRailsアプリ開発中

<h2>経緯</h2>
現在、独学でRails7でポートフォリオを作成している初学者です。Windowsでdocker toolboxを利用してアプリを開発しています。しかし、今回環境構築にあたりエラーが発生したものの、なんとかRails7(sprockets-rails, importmap-rails, cssbundling-rails)を利用したVue.js, tailwindcss が動作する環境を構築できたので、備忘録的に書き残します。

<h3>フロントエンド周辺について</h3>
rails7 ではrails tutorial でも採用されていたWebpackerの開発が終了したことや、トランスパイルが不要な選択肢が現れるなど、アセットパイプライン関連の変更点が多いように思った。私は経緯で述べたGemを利用したが、他の組合せはWindows周辺の知識不足により消去法で諦めた。組合せや全体像の理解ではこの記事が最も分かりやすかったです。<p><a href="https://zenn.dev/takeyuweb/articles/996adfac0d58fb">Rails 7.0 で標準になった importmap-rails とは何なのか？ (zenn.dev)</p>
<p>※一点気になったのが、<a="https://hazm.jp/archives/140">参考記事2</a>に書かれていた、./bin/importmap/pinコマンドでモジュールを指定した際に、自動で設定された取得先URLでは動作せず、手動で動作するURLを設定する必要があったことです。これには自分も少しハマりました..。</p>

<h3>Windows関連の不具合について</h3>※不要な方は読み飛ばして下さい
<ol>
<li> CRLFによる不具合 :  rails g controller でroutes.rbにroutingが追記されない。これは、改行コードがWindowsとLinux 環境で異なることによる改行コードの変換エラーでした。明確な解決方法は未だ分かっておりませんが、rails g コマンドの実行前にVSCodeの改行コード設定を変えて突貫工事としています。
<li>virtualbox のDNSエラー : yarn 関連のコマンドでExit code 127のエラーが発生し、JSパッケージをインストールできない状況に陥りました。これにより, jsbundling-railsの利用を諦めました。
<a href="https://qiita.com/Seo-4d696b75/items/3ff9b2e433838fd3fb01?msclkid=f063283cce9b11ec82665fed6fa55b94">エラー関連記事</a>
</ol>


<h3>参考にした記事一覧</h3>
- これらの記事には大変お世話になりました。railsのgithubでアセットパイプライン関連のGemを読み込む前、全体像の理解に役立ちました。

<ol>
<li><a href="https://qiita.com/kazutosato/items/1ae1cf0ec380a75d4dc4?msclkid=411d5985cecb11ec8c43106976221259">JavaScript BundlingとCSS Bundlingのしくみ - Qiita</a>
<li><a="https://hazm.jp/archives/140">Rails7 rails/importmap-railsの概要 | (hazm.jp)</a>

</ol>

何か内容の誤りやwindowsエラーに関するアドバイスございましたら、ご指摘いただけますと幸いです。
[React] DOMにアクセスする際に使う、useRefの理解を少し深める。

ReactではDOMにアクセスする際にuseRefを使います。
あまり、積極的に使わない方が良さそうですが、使う機会があってあまり理解できていなかったので調べてみました。

useRefでDOMの横幅を知りたいときに、TypeScriptでは以下のように書いていました。

```tsx
const SampleComponent = () => {
  const ref = useRef<HTMLDivElement>(null)

  useEffect(() => {
    console.log(ref.current?.offsetWidth);
  }, []);

  return (
	<div ref={ref}>
      ~~
    </div>
  );
}
```

恥ずかしながら、useRef<HTMLDivElement>(null)とかref.current?.offsetWidthってなんだっけと...

とりあえず、改めてrefの理解から。

[useRef]([https://ja.reactjs.org/docs/hooks-reference.html#useref](https://ja.reactjs.org/docs/hooks-reference.html#useref))

> `useRef`は、`.current`プロパティが渡された引数 (`initialValue`) に初期化されているミュータブルな ref オブジェクトを返します。返されるオブジェクトはコンポーネントの存在期間全体にわたって存在し続けます。

まず、ref.currentでrefの現在の値が取得できるとのこと。

それはそうなんだけど、useRef`<HTMLDivElement>`とHTMLDivElementの型を設定していて、なぜnullを引数に取るのかとか、ref.currentがnullになることがあるのか少し疑問に思っていました。


[このIssue](https://github.com/facebook/react/issues/16665)をみると、divに設定されるまではrenderされるまでnullが入るとのこと。レンダリングされるまでは何もないのでなんとなく納得。

次にoffsetWidthってなんだっけと。HTMLElementのプロパティらしい。
HTMLDivElementはHTMLElementを継承しているのでoffsetWidthを使えるみたいです。

[https://developer.mozilla.org/ja/docs/Web/API/HTMLElement](https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetWidth)

なので、offsetWidth以外でもHTMLElementのプロパティやイベントを使えるはずです。

widthがなくて、offsetWidthなんだという点も疑問に思っていました。
ドキュメントや記事みてみると、なんとなく理由の想像ができました。

https://developer.mozilla.org/ja/docs/Web/API/HTMLElement/offsetWidth
https://stackoverflow.com/questions/8133146/difference-between-style-width-and-offsetwidth-in-html

おそらくマージンや擬似要素の幅を含まないという理由か、もしくはstyleのwidthと混同させないためという理由な気がします。
React Mui-Materialの数値入力フィールドを使いやすく

Mui-Materialの `Textfield` ですが type="number" を指定すれば、数値入力用の入力欄が作れます。ただ、これだけだとちょっと使いづらいです

- 入力時の先頭へゼロが残ってしまうことがある
- マウス操作で誤って入力値をユーザーが変更してしまうことがある
- ブラウザによって挙動が違う

これを解消するべく、以下のようなコンポーネントを作りました。
使えそうなシーンがあれば使ってみてね

```NumericField.tsx
import TextField from "@mui/material/TextField/TextField";
import { CSSProperties } from "react";

type P = {
  state: string;
  setState: React.Dispatch<React.SetStateAction<string>>,
  label?: string;
  style?: CSSProperties;
  required?: boolean;
  fullWidth?: boolean;
};

export function NumericField(props: P) {

  const onChangeHandle = (e: React.ChangeEvent<HTMLTextAreaElement | HTMLInputElement>) => {
    const result = Math.abs(Number(e.target.value)).toString();

    if (result === "NaN") {
      props.setState("");
    } else {
      props.setState(result);
    }
  };

  return <TextField
    fullWidth={props.fullWidth}
    required={props.required}
    value={props.state}
    onChange={onChangeHandle}
    label={props.label}
    style={props.style}
    inputProps={{
      inputMode: "numeric",
      pattern: "[0-9]*"
    }}
  />;
}
```
【Pega】Circumstanceを用いて、条件をもとに異なる画面項目を表示する

## １　はじめに
本記事では、一つのSectionにおいて、条件をもとに異なる画面項目を表示させる方法（Circumstance）を紹介する

**Circumstance**：特定のルールまたは状況に応じたルールを作成することで、アプリケーションのロジックを変更することなく、動的にビジネス要件を対応できる。

## ２　Circumstance Templateを作成
Circumstance Templateを作成する（条件の定義）
・Technical ⇒ Create ⇒ Circumstance Template
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/014a75a3-79c2-e8d9-1e0a-4215c6e55695.png)
参照する条件（Property）を定義する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/b15df09a-ac66-2e93-4cbd-6778d40b766f.png)


## ３　Circumstance Definitionを作成
Circumstance Definitionを作成する（条件の指定）
・Technical ⇒ Create ⇒ Circumstance Definition
Template Nameの値は２で作成したテンプレート名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/9e5aad0a-b5c3-2484-cd0c-2a905c23209c.png)
条件を満たす値を設定する
・CircumstanceFlag が 1 の場合、条件を満たす
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/6775f5f7-6438-c6f8-875e-3d8d7ffc269b.png)


## ４　SectionのCircumstanceを作成
条件をもとに異なる画面項目を表示させるため、SectionのCircumstanceを作成する
・Save as ⇒ Specialize by circumstance
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/9073e56c-f3f4-9345-84ed-28f02d09dadb.png)
Templateの値は２で作成したテンプレート名
Definitionの値は３で作成したデフィニション名
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/0a443522-5cde-8b27-1c2f-02d27ebb36e9.png)
CircumstanceしたSectionの表示内容を修正する
・Age ⇒ Class
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/2d76d4a4-05d1-8ed9-57be-45afd6ffd7b5.png)


## ５　実装結果確認
CircumstanceFlagが1以外の場合、通常のSectionが表示されている
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/9467de0c-08b5-e305-9f78-506c9515875b.png">
CircumstanceFlagが1の場合、CircumstanceしたSectionが表示されている
<img width=70% alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258181/caa14f25-3a34-1d9c-b931-498b9e419500.png">

##
#### ・Pega環境
　Pega 8.6.1


#### ・参考資料
　[Creating a rule specialized by circumstance](https://docs.pega.com/application-development/85/creating-rule-specialized-circumstance)
cargo-generateのインストール

atcoderでRustを使おうと思い、
[AtCoderコンテストにRustで参加するためのガイドブック](
https://doc.rust-jp.rs/atcoder-rust-resources/introduction.html)を読んでいた。
で、以下の手順でインストールしたが、ちょいハマったのでメモを残す。対象はMacOS。

https://doc.rust-jp.rs/atcoder-rust-resources/installation/cargo-generate.html


結局以下の4コマンドが必要だった。

```
$ brew install pkg-config
$ brew install openssl
$ rustup update
$ cargo install cargo-generate 

```
dockの大きさをdefaults writeで限界突破させる

# やり方

デスクトップの写真を設定しようとして間違えてdockのところ触っちゃうと，なぜか勝手に限界値に設定されちゃうので

```zsh
defaults write com.apple.dock largesize -int 256 | killall Dock
```
する必要がある

デカい方がいいね！



## `defaults`について


### `read [ファイル名]`
読み込み
辞書型のうち1つだけを操作する場合のコマンド，という解釈が近そう

#### 特定のアプリ
アプリ名に対応するファイル名を入れれば選択できる
入れない場合は全ての設定を吐き出す

#### 辞書型
`.plist`の`<dict></dict>`タグが`{}`で置換されるらしい
オプション名に後付けしていけば抜き出せるかも？

#### 配列型
`.plist`の`<array></array>`タグが`()`で置換されるらしい，JSONっぽいがJSONではない
ちなみに配列の番号を指定して読み込むのは不可能っぽい


### export
`.plist`ファイルを吐き出す


### `write [アプリ名] [オプション名] [値]` 
書き換え
辞書型のうち1つだけを操作する場合のコマンド，という解釈が近そう

#### `add`する場合
一般人の需要こそないだろうが，`array-add`と`dictionary-add`があるらしい

#### 型指定
`.plist`ではタグで型を指定する，`-string`か`-float`か`-int`か`-bool`
[備忘録] YOLO形式のアノテーションデータのフォーマット

- データ
~~~
cls x y width height
cls x y width height
...
cls x y width height
~~~
- ```cls```：```object-class```
    - integer num, ```0``` to ```classes-1```
- ```x```：```x = absolute_x / image_width``` 
    - float values, 0.0 to 1.0
    - center of rectangle (not top-left corner)
- ```y```： ```y = absolute_y / image_height```
    - float values, 0.0 to 1.0
    - center of rectangle (not top-left corner)
- ```width```：```width = absolute_width / image_width```
    - float values, 0.0 to 1.0
- ```height```：```height = absolute_height / image_height```
    - float values, 0.0 to 1.0


![yolo_data_format.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525418/0a42fe4f-2187-5fd4-3ea2-8d69e7a2d502.jpeg)



# 参考文献
- [GitHub,  AlexeyAB/Yolo_mark, issues #60](https://github.com/AlexeyAB/Yolo_mark/issues/60)
- [MARE's Computer Vision Study., yolo data coordinate format, draw rectangle by cv2](https://study.marearts.com/2021/07/yolo-data-coordinate-format-draw.html?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed:+MaresComputerVisionStudy+(MARE%27s+Computer+Vision+Study.))
STM32 CUBEIDEでGoogleTestを使用する.

# はじめに

Windows上でCubeIDEを使用、単体テストを行うためとGoogleTestを導入しようとしたらつまづくところがあったので導入方法をまとめた。

Windows10環境下にインストールしたCubeIDEでC言語コードを、GoogleTestてテストすることとデバッグできることを目標にします。

実施環境
 - Windows 10.
 - CubeIDE Version1.9.0 (Eclips Version: 2.3.800.v20211124-1800).
 
インストールアプリ.
- Cygwin64.
- GoogleTest.

# 1. Cygwin64のインストール.

https://cygwin.com/install.html

から**setup-x86_64.exe**をダウンロードして実行。

![Path.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/25e74ddb-210d-6464-4b51-adf7fd2c5246.jpeg)

Select Packageで**Deval** を**Install** する。

**注意**
2022/05 現在　GDBバージョンを最新のバージョンgdb **10.2.0** を入れるとデバッグができない.
単体テストでデバッカ利用したいときはgdbのバージョン **9.2-1**を選択.。

https://www.eclipse.org/forums/index.php/t/1105969/

環境パスに **"C:\cygwin64"**　を追加。
Cygwin64のインストールの完了。

# 2. GoogleTestのインストール.

## 2.1 ダウンロード.

https://github.com/google/googletest

今回は1.11.0をインストールするので **Release 1.11.0** をクリックして**Source code**をダウンロード。
![gtest.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/01fec4d4-3705-1c60-da45-6cdc609d00d1.jpeg)

解凍後、最上位フォルダを　"googletest-1.11.0"として　C:\cygwin64\home\ユーザ名　以下にコピー。
![フォルダー構成1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/a6368822-ee3f-81b1-d4bc-c774187db1fc.jpeg)

## 2.2 ライブラリの作成.
cygwin 起動.
googletestのフォルダに移動して。
![Directory.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/42c24035-75f9-1a2f-4682-8049c1351440.jpeg)
以下コマンドでライブラリ作成。

```
g++ -I./include -I. -c ./src/gtest-all.cc
```
```
ar -rv libgtest.a gtest-all.o
```
googletest以下にライブラリ **libgtest.a** ができる。

googletestのインストールの完了。

## 2.3 テストランナーのインストール.
IDEの[ヘルプ]から[新規ソフトウェアのインストールを選択]。
以下をインストールする。
![UnitTest.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/0a32c00e-baaa-6b3e-9878-4d14c09a3f9d.jpeg)

## 2.4 テストプロジェクトの作成と設定.

テストプロジェクトの作成とテストは以下サイトを参考にしてください。

https://blog.bokuweb.me/entry/2014/12/27/214213

# 3. テストの実行とデバッグ.
テストランナーをインストールしたので、[実行]-[実行構成]のC/C++ テストでテストランナーに"Google Test Runnner"を選択。

![RunnnerEXE.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/15545643-e62d-39bc-c0d6-c573f539a1c5.jpeg)

テストランナーでテスト実行可能なことを確認。
[実行]-[デバッグ構成]を選択してデバッガーの設定を確認。

![DebugConfig.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/489806/65d6bf1b-6427-c5fa-4207-26d05136f459.jpeg)

テストコード対象にブレークポイントを設定してデバッグ実行すれば、デバッグ可能なこと確認できます。
Linux初心者なら小豆本がオススメ


https://www.shoeisha.co.jp/book/detail/9784798160498

**小豆（あずき）本**として有名な本書は、Linuxに関する資格試験のための参考書です。

自分はその資格試験の勉強の為にこの本を初めて手にしたのですが、まじで**Linux初心者にオススメ**です。

今回はその理由と小豆本でLinuxを勉強することのメリットについて紹介します。

# 勉強しやすいようにまとまってる

Linux初めての人にも分かりやすいように、とても綺麗にまとまって書かれてる。

コマンド、オプション、解説、ファイル内容の書式とかすごい見やすい。

本当の教科書みたいに大事な用語は太い赤文字になってたり、各セクションには「ここが重要」ってのがあって特に重要な部分を最後にまとめてくれてる。

重要な設定ファイルのパスや、Linux特有の記号、コマンドなどは全部索引からでページを特定できます。


![104.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/78732be8-92cb-3671-c590-9b7edd4b7fae.jpeg)

![106.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/71bbac52-cc55-6777-ce87-8b2ce3f33e81.jpeg)

![108.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/a56be0fd-ddf2-0dbb-5f7d-c794550624a1.jpeg)

（画像：https://www.shoeisha.co.jp/book/detail/9784798160498# ）

画像の通り、余白もしっかりあってLinux初心者でも嫌がらずに独学できますよこれ。

# 資格の勉強までできちゃう

先に言ったように、この小豆本はLPICという資格のための参考書です。

つまり本書読んでれば資格の勉強も合わせてできます。


すごい一石二鳥。

また各章の最後には演習問題が付いてます。これで理解度の確認ができます。


べつに、資格取るために本書を買うんじゃなくて、Linuxの勉強にオススメの本として小豆本を紹介してます。

そこにたまたま演習問題もおまけで付いてきたよということです。

演習問題おかわりしたい人はここに本書に対応した問題が用意されてます。

# Linuxの実行環境まで用意してくれてる – まじ神かよ小豆本

やっぱLinuxの勉強は実際に手を使って動かすのが一番効果的で学習効率が高い。

その為に翔泳社が仮想マシン用のダウンロードファイルを用意してくれてます。

翔泳社の会員にならずにダウンロードできるから安心👇

https://www.shoeisha.co.jp/book/download/9784798160498

本書の中で仮想環境についての設定方法が書かれてるので、それを見れば環境の構築は大丈夫です。

# Linuxのリファレンスとしてとっておける

この小豆本を手元に置いておけばLinuxのポケットリファレンスとして大いに活躍します。

自分ももっと早くこの本に出会いたかったです。

ぜひ書店に足を運んで立ち読みしてみてください！
AWS 認定データ分析 - 専門知識（DAS）：合格への近道

# AWS 認定データ分析 - 専門知識（DAS）に向けて、下記の通り対策すれば合格できます！
AWS DASは、モダンな開発技術とも言える **「データレイク・データウェアハウス・データ分析基盤」** が対象となります。
このような現場を経験している方は少ないと思うため、非常に価値ある資格かと思います。
市場価値を上げるためにも、是非とも取得して欲しい資格の一つです！

「１」「２」「３」の順番で取り組んでください。実際にこの順序で学ぶことで、現場にも生かすことができます！

[1. AWSのサービスを実際に手を動かして学ぶ](#1-awsのサービスを実際に手を動かして学ぶ)
[2. 問題集を解く](#2-問題集を解く)
[3. 書籍を読む](#3-書籍を読む)

# 1. AWSのサービスを実際に手を動かして学ぶ
初めの勉強は、本試験に出題されるAWSサービスをマネジメントコンソールから学んでください。
いきなり、問題集や書籍から始めると挫折する可能性が高いです。
よく出題されるAWSサービス(実際の業務でもよく利用される)は下記7つであり、
これらを理解することで、**「データレイク・データウェアハウス・データ分析基盤」** は理解できたといっても過言ではないです。

* Glue
* EMR
* Redshift
* Athena
* Kinesis
* S3
* QuickSight

**<font color="Red">そこでAWSが公式で出している下記ハンズオンが非常におすすめです！</font>**
3~6時間ほど要しますが、完了した頃には、かなりの知識/知見を蓄えられます！
https://github.com/aws-samples/amazon-s3-datalake-handson/tree/master/JP

![スクリーンショット 2022-05-10 22.39.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263017/841b5a78-5536-6552-6711-34481ebdacff.png)


# 2. 問題集を解く
こちらの問題集のみで十分に合格できます。
問題数も100~200問程度なため、そこまで時間を要さないのがとてもコスパが良いです。
最低でも9割は完璧にすることで、本試験対策は全くもって問題なしです！

**☆ CloudTech**

https://kws-cloud-tech.com/

# 3. 書籍を読む
AWS DASの対策として、よく紹介されている書籍ですが、「１」を行わずにいきなり取り掛かると、そこそこ難易度が高いため、挫折します。
ある程度手を動かしてから、この書籍に取り掛かることで、理解が深まります！

**☆ AWSではじめるデータレイク: クラウドによる統合型データリポジトリ構築入門** 

https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AF-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E5%90%88%E5%9E%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80-%E4%B8%8A%E5%8E%9F-%E8%AA%A0/dp/491031301X/ref=asc_df_491031301X/?tag=jpgo-22&linkCode=df0&hvadid=342518373760&hvpos=&hvnetw=g&hvrand=15067221686730336911&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=20637&hvtargid=pla-923695857075&psc=1&th=1&psc=1

# 最後に
**「データレイク・データウェアハウス・データ分析基盤」** は、今IT分野の中で、最も熱く、市場価値が高いと言っても過言ではないです！
データサイエンスの経験がなくても、 **データエンジニア(「データレイク・データウェアハウス・データ分析基盤」の担当者)** として幅広く活躍できる分野であるため、この資格を経て目指して欲しいです！
[python] break,continue


# break文

whileループなどから抜け出す
breakとコードに記述すれば使える


# continue文

whileループなどで使う
ループ中でcontinueに到達するとループの先頭に戻り、ループ条件式を再度評価する
ループ動作で末尾に到達したときと同じ動作
pandasのカラムをOne-Hotエンコーディングする関数の作成



https://www.codexa.net/get_dummies/


ダミー変数とは、カテゴリカル（質的）データを0又は1で表現した変数のことです
機械学習の分野ではダミー変数を用いた前処理をOne-Hotエンコーディングと呼びます



Pandasを使うと、データの統計量を表示したり、グラフ化するなど、
データ分析（データサイエンス）や機械学習で必要となる作業を簡単に行うことができるようになります

https://techacademy.jp/magazine/17697


pandasのカラムをOne-Hotエンコーディングする関数の作成しました！

名前は　one_hot_pd　としました！


```
    def one_hot_pd(Read_data,columns_name):
        all_data_p1=Read_data
        all_data_after_get_dummies_gender=pd.get_dummies(all_data_p1[columns_name])
        all_data_after_get_dummies_gender.reset_index()
        all_data_non_gender=all_data_p1.drop([columns_name], axis=1)
        all_data_o = pd.concat([all_data_after_get_dummies_gender, all_data_non_gender], axis=1)
        all_data_out_p=all_data_o.fillna(1)
        df_only=all_data_out_p
        return df_only
```
AWSのサービスを単純明快に説明してみる（コンテナ編）

巷ではAWSさんのサービス説明文が難解だと話題です。
これは私も思ってました（笑）

https://www.itmedia.co.jp/news/articles/2205/10/news123.html

https://twitter.com/kazoo04/status/1523497558399627265

そこで、わかりやすく説明してみようと思います！

## Amazon Elastic Container Registry

**Docker Hub**のAWS版

## Amazon Elastic Container Service (ECS)

AWS版のコンテナ動作環境の**コントロールプレーン**
コンテナ動作環境はEC2/Fargate/ECS Anywhereから選択

## Amazon ECS Anywhere

**ECSのコンテナ実行環境**の一つ。**オンプレに構築**しAWS上のECSコントロールプレーンで管理

## Amazon Elastic Kubernetes Service (EKS)

AWS版の**Kubernetes**をクラウド上で提供
コンテナ動作環境はEC2/Fargateから選択

## Amazon EKS Anywhere

**EKSをオンプレ環境（VMware vSphere）上で構築**

## Amazon EKS Distro

AWS版の**Kubernetesディストリビューション** (Linuxに対するUbuntu/Redhat的な考え方） 
VMware vSphereにかぎらず、ラズパイでもどこでも構築可能
**OSS**

## AWS App2Container

**既存のアプリケーション環境をいい感じにコンテナ化**するツール

## AWS App Runner

Google App Engine的にGitにプッシュしたら**コンテナにしてデプロイまで面倒を見てくれるサービス**

## AWS Copilot

**OSSのコマンドラインツール**
簡単にECSクラスターを作ったり、簡単にデプロイしたりするためのツール
ECS CLIというものもあったが、最近はCopilot推しの模様

## AWS Fargate

**サーバーレスでコンテナを実行する環境**

## AWS での Red Hat OpenShift サービス

**AWS版のOpenShift**（名前から想像）
「防御的プログラミング」を学ぶ

## はじめに

PHPerKaigi 2022の和田卓人（@t_wada）さんのスライドを実際にコード[^1]を書きながら勉強してみた。
この記事はその学びのまとめ。
[^1]:https://github.com/blue32a-sandbox/growing-reliable-code-phperkaigi-2022

<script async class="speakerdeck-embed" data-id="2c693f58ab55477d929b60d8d5a8f248" data-ratio="1.77777777777778" src="//speakerdeck.com/assets/embed.js"></script>

:::note warn
「防御的プログラミング」とは、問題発生を事前に防ごうというコーディングスタイル。
悪いコードに絆創膏をあてることではない。
:::

## 結果、防御的になる

「防御的なコードを書く」という意識があるのと同時に、
対象を正しく表現した結果として間違いや想定外が入り込む余地が少なくなる、というのもあるように感じた。
『セキュア・バイ・デザイン』におけるセキュアなソフトウェア設計と同じようなイメージ。
「動作するきれいなコード」はさまざまな利点を生む。

## 小さなクラスを作る

ドメインの知識や責務を小さなクラスにまとめる。
その型を使うことで想定される状況が限定される。
そして、そのオブジェクトは常に整合性のとれたものだけが存在できるようにする。

## 正しい方向に流れやすくする

> 良いインタフェースとは次の２つの条件を満たすインタフェース
> ・正しく使用するほうが操作ミスをするより簡単
> ・誤った使い方をすることが困難

人間の注意力には限界があるし、楽な方に流されやすい。
流れてほしい方向に楽に行けるような仕組みを作ることが大切。

## SimpleとEasy、正当性と堅牢性はレイヤーを分ける

「単純にしたいが使い易くもしたい」というジレンマはよくある。
これらは混ぜずに別のレイヤーで提供する、と学べたのは良かった。

## まとめ

> 設計とは責務の最適配置を求め続けること。誰が何を知っていて何を知るべきでないか、何をやるべきで何をやるべきでないかを常に考え続けること

対象のドメインを分析し、コードを改善する、というサイクルを常に回し続ける必要がある。
これをやるには開発プロセスもそのような形にする必要があるだろうし、テストの自動化も必要になるだろう。
安全なソフトウェアやアジリティはそこから生まれてくる。
python pandas EDAソースコード



pandas データをEDA解析をする　機会が増えたため

outputにEDA_dataフォルダ作成後
EDAデータを保存する関数を作成しました

indexNamesの部分がpandasの入る部分

"グループ化したいカラム名を入れてください"
の部分に　pandasのカラム名を入れていただけると幸いです

```
#EDA解析
def EDA_Analysis(indexNames):
    #outputにEDA_dataフォルダ作成 makedirs で深い階層まで作成できる
    data_dir_out="./output/EDA_data"
    if not os.path.exists(data_dir_out):
        os.makedirs(data_dir_out)
        print("make_new")
    #EDA解析
    data=indexNames
    # カラム名でグループ化
    class_group = data.groupby("グループ化したいカラム名を入れてください")
    #　カラムが全表示できるようにオプションを指定（notebook）
    pd.options.display.max_columns = None
    #　全クラスの統計量表示
    class_group.describe()
    data.hist(figsize=(20,10))
    #グラフが重ならないようにする
    plt.tight_layout()
    class_group = data.groupby("グループ化したいカラム名を入れてください")
    class_group["target"].hist(alpha=0.7)
    #data_dirフォルダに図の保存
    plt.savefig(data_dir_out+"/class_group.png")
    plt.show()

    # 全てを表示させる
    plt.figure(figsize=(20,10))
    for n, name in enumerate(data.columns.drop("カラム名を入れてください")):
        plt.subplot(4,4,n+1)
        class_group[name].hist(alpha=0.7)
        plt.title(name,fontsize=13,x=0, y=0)
        plt.legend([3,3.5,4,4.5,5])
        #data_dirフォルダに図の保存
    plt.savefig(data_dir_out+"/D_time_hist"+"all"+".png")
    #図をリセット
    plt.figure()

    class_group = data.groupby("グループ化したいカラム名を入れてください")
    class_group["target"].hist(alpha=0.7)
    plt.legend([3,3.5,4,4.5,5])
    #data_dirフォルダに図の保存
    plt.savefig(data_dir_out+"/D_time_hist.png")
    plt.show()
    #図をリセット
    plt.figure()

    df_corr = df_corr = data.corr()
    print(df_corr)
    # ヒートマップを出力
    sns.heatmap(df_corr)
    data2=data.dropna()
    #data_dirフォルダに図の保存
    plt.savefig(data_dir_out+"/heatmap.png")
    plt.show()
EDA_Analysis(merge_data)
```

CEML 部長のソースコードを参考に作成しました！！

https://qiita.com/CEML/items/d673713e25242e6b4cdb
木構造とは

# 木構造とは
**木構造**とは、階層をもったデータ構造です。
1つのノードが複数の子要素をもち、1つの子要素が複数の孫要素を持つような形で階層が深くなるにつれ、枝分かれしていきます。
図を逆にした時に木の様子に似ているためこのように呼ばれているみたいです。

1つ1つの要素はノード(Node)と呼ばれ、ノード同士は親子関係を持ちます。
親がないノードは根(root)と呼ばれ、子がないノードは葉(reef)と呼ばれています。

イラストは2つの子を持っていますが、3個以上の子を持つような**多分木**などもありますが、代表的なものは子の数が2個に制限されている**二分木**です。

ちなみに、木構造はある子要素への道は1つしかありません。
しかし、ノードへの道が2通り以上ある場合は、木構造ではなく**グラフ構造**と呼ばれます。

![木構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/8806d918-2036-e367-bc5a-3c128b50d936.png)

## 木構造の例
木構造は、大量の情報と関連性を扱う場合に有効です。
具体的な例を挙げるとディレクトリの構成も木構造になっています。
rootがあり、子にhomeやetcやuserがあります。さらにhomeの子にも複数のディレクトリがあります。
ファイルは葉にあたり、ディレクトリはNodeになります。
![ディレクトリ構造.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/5af1f8a7-61c7-f512-ea44-28082cdf878c.png)

DNS(Domain Name System)なども木構造です。
DNSはたくさんのコンピュータの名前を含む名前空間を階層的にドメインに分割して管理しています。

`wrsdu1715.co.jp`という名前の場合、jp配下にcoという子要素がありcoの子要素にwrsdu1715があるといったイメージです。

## 木構造の探索方法
木構造で表されたデータを処理するには、ノードを順番にたどる必要があります。
探索する方法は、**幅優先探索**と**深さ優先探索**があります。

### 幅優先探索
根から開始して、同じ階層にあるNodeを探索していく方法です。
同じ階層にあるノードをrootに近い方から探索するため、最短経路や最小手数などを求める時などに有効です。
![幅優先探索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/24188fb9-444b-75c3-e7e8-79211ce0d218.png)


### 深さ優先探索
幅優先は階層ごとでしたが、深さ優先は縦方向にNodeを探索していく方法です。
rootから深さを優先して探索して、遷移を繰り返すことですべての状態を列挙できます。
例えばスタートからゴールまでたどり着けるかなどの問題を解くことができます。
![深さ優先探索.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/381381/d2ee21f1-c6fe-513e-d670-77283ce8a69a.png)

# まとめ
木構造にはさまざまな種類がありますがよく使われるのは二分木だと思います。
あまり意識してないですが日常で使うところでよく使われているので木構造の特徴は理解できてよかったです。
アルゴリズムでも使われていたり二分探索木などもよく使われるでしょう。
簡単でしたがざっと木構造とは説明させていただきました。
プロキシサーバーでコネクションが拒否される

Virtual BoxでFirefoxを使おうとしたが、プロキシサーバーの問題が発生して接続が拒否されてしまう。

「The proxy server is refusing connections」が出た時の解決方法について。
![proxy-prob.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/907d5b4e-9c48-5a83-6fa4-f00991ee8a1a.png)

# Firefoxのネットワーク設定

右上の「preferences」（私のVM上のFirefoxが英語なので、基本英語でいきます）をクリックしてください。

すると設定画面の「General」にいる状態です。

そしたら、イッチバン下までグーンとスクロールしてください。

「Network Settings」です。そのままSettings…ボタンをクリック。

すると「Connection Settings」のダイアログが現れます。
![no-proxy.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659122/3a56d00d-b37a-fcaf-9a00-c9d6e6e7f4cc.png)

プロキシサーバーで接続拒否されている方は、この部分がNo proxyになっていないはずです。

ここでNo proxyにチェックすれば解決するはずです。
リファラースパム とは

## 勉強前イメージ

リファラのスパム・・・・

## 調査

### そもそもリファラとは？

リファラは参照元のページを指し、あるページにアクセス際に経由したページの事になります。

### リファラースパム とは

サイトの管理者がweb解析ツールを使ってユーザの集客経路(リファラ)を調べていると予想して
架空のwebサイトから訪問したと見せかけて関係のないページに誘導することを指します。
また、その関係のないページにウイルス等を仕込むこともある。
悪意を持って参照元の情報を残すことを `リファラースパム` と言います。

リファラースパムは他のサイトに誘導されるだけでなく、
アクセス解析がリファラースパムによって正しい状態ではないので精度が落ちてしまいます。
また上記にも記載しましたが別のサイトを開いたサイトの管理者がウイルスに感染するおそれもあります。
そのウイルスによって個人情報などが流出してしまうことも可能性としてあります。
一番大きいのがリファラースパムを放置しているとSEOの評価が下がる可能性もあります。

リファラースパムはweb解析ツールからフィルタ機能
web解析ツールに元々登録されているボットのヒットを除外する機能で防ぐことが出来ます。

## 勉強後イメージ

GAとか使うことまで考えてスパム行為するなんてのもあるのか・・・・

## 参考

- [リファラースパムとは何か？その実害と対処法を紹介](https://ssaits.jp/promapedia/method/refferal-spam.html)
- [リファラースパムとは？アナリティクス設定・SEOへの影響や対策](https://lpeg.info/seo/referer_spam.html)
STM32G031でハードウェアシリアル500Kbpsで遊ぶ


x 自己責任の意味が分かる人むけ　最悪再ライト出来なくなります。


目的
とりま、やつてみる

完全にはまりパターンで
オプションビットのブートレガシィは、OFF
内部ブートビットは、オン　起動後1秒ブートが有効らしいが試してない
ハードリセットは、オンでリセット専用
3秒ルールは、適用

絶対条件　リセット改造または、接続済みの書き込み器が必要


https://denshikousakusenka.jimdofree.com/%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/stm32/st-link-v2-clone%E3%81%ABreset/


[作戦大成功]


![o_con424.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/ae2b4ed1-a6e2-fe96-f1ec-1f21a5ee6cea.jpeg)


![o_con426.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1fd63295-30ab-6172-c82f-acc8d35fbbd2.jpeg)



![o_con425.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/edea2bae-981f-02e2-64f9-8ef1119e42fc.jpeg)



![o_con422.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/3ef596ba-65c8-9f47-a0bf-f2dabc03da02.jpeg)


![o_con423.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/28b709bf-7ddf-19b4-f9b1-f1c844c0bd44.jpeg)




こんなもん


```c++


//ser_500kbps_031_1

// tx PA14(PB6) 8PIN
// rx PC14(PB7) 1PIN

#include <Arduino.h>

void setup() {

    delay(3000); //not Delete

    Serial.begin( 500000 ); // シリアル通信の速度を500000bpsにする。

} //setup

void loop() {

    Serial.println("Hello World !");

    delay(1000);

} //loop



```
WindowsでPythonをインストールするときに困った話

# windowsでPythonをインストールしたあと、バージョンが表示されない...

Windows11を使用しました。

原因はusers/ ユーザー名 /の次にインストールされていなかったからでした。

解決策
　設定→アプリ→アプリと機能→その他の設定→アプリ実行エイリアス→アプリインストーラー
アプリインストーラーを2つともOFFにします。

![スクリーンショット 2022-05-10 224411.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1462552/f5a1c22a-a472-22a6-5a57-625d191a9ed3.png)


その後再起動しコマンドプロンプトで以下のコマンドを実行
```
python -V
```
するとバージョンが表示され解決しました。
【EC2】LambdaでEC2インスタンスを自動起動・停止

## EC2インスタンスを自動停止させたい
社内利用用のEC2インスタンスなど夜間や日中だけは停止させておきたいEC2インスタンスがあり、Lambdaスクリプトで実現させました

## EC2インスタンのタグ付け
EC2インスタンスにタグを付けて、そのタグを付けたインスタンスを自動で停止させるようにします。
タグはなんでもいいのですが
keyにAutoStop
valueにtrue
といれておきます

## Lambdaスクリプト
前提としてLambda関数にはEC2のstart・stopとdescribeの権限をIAMロールに付与する必要があります。

```python
import boto3
region = 'ap-northeast-1'
ec2 = boto3.client('ec2', region_name=region)

def lambda_handler(event, context):
    
    custom_filter = [{
        'Name':'AutoStop', 
        'Values': ['true']}]
        
    response = ec2.describe_instances(Filters=custom_filter)
    instance_ids = []
    for instance_dic in response['Reservations']:
        instance_ids.append(instance_dic['Instances'][0]['InstanceId'])
    
    ec2.stop_instances(InstanceIds=instance_ids)
    # ec2.start_instances(InstanceIds=instance_ids) #開始するとき
```

コードは解説する程ではないのですが、describe_instancesにfilterで設定したタグのインスタンス一覧を取ってきて、instance_idの一覧を作ります。
あとはそれをstop（またはstart）させているだけです。

## 自動停止
最後にこのLambdaをAmazon EventBridgeで呼び出してあげるだけです。
タグ付けで対象インスタンスを設定すると、ON・OFFや設定の確認がかなり楽になります。
Virtualboxについて

職場でVagrantとVirtualというソフトウェアを使うとのこと。
正直何のために使うの？何ができるの？と思っていたので調べて少しでも理解を深めようと。
まずはVirtualboxについて

# Virtualbox(ヴァーチャルボックス)
既存のOS上で、別のOSを実行するのに使う仮想環境（仮想マシン）を構築するためのソフトウェア。
VirtualBoxを利用することで、たとえば手元のWindows OS上で、MacOSを動作させることもできます。

**仮想環境（仮想マシン）**
サーバーなどの物理的な環境上で、仮想的に構築されたOSの実行環境

## VirtualBoxを使うメリット
### 1つのパソコン上で複数のOSを利用できる
複数のOSが利用できるから2台以上のPCを用意する必要がない！
＝別のOSを準備するためのコストや、PCを設置するためのスペースを節約することが可能に！

### 複数のOSを1台のOS上で同時に動作させられる
ホストとなるOS（例：Windows OS）を起動したまま、ホストOS上で別のゲストとなるOS（例：Cent OS）を起動できます。これによって、ホストOS・ゲストOSの両方を同時に使える

### 複数OS間で簡単にデータ共有できる
複数のOS間でデータを共有する場合、2台のPCを別々に操作してデータのアップロード・ダウンロードを行うことが必要です。
2人以上で各々別のPCを使っていれば、ファイル共有に手間はかからないかもしれませんが、1人で行うときは、ファイル共有のため別々のPCを動作させたりする作業が必要です。その分、複数OS間でファイルを共有するのに手間がかかります。

VirtualBoxを使えば、1台のPC上で複数OSを動作させたまま、ドラッグ＆ドロップや共有フォルダの機能を使い、簡単にファイル共有可能です。2台のPCを別々に操作させる必要がなくなります。

### 手軽にテスト用・学習用の環境を用意できる
OSの勉強や、アプリケーション開発用の環境が欲しいと考えたとき、VirtualBoxがあれば、既存OS上で手軽にテスト用・学習用のOS環境を用意できる！


# まとめ
調べてみてvirtualboxの機能が何となくだけどイメージはできた。
いろんな記事を見ていると、様々な機能があるみたいなので、実務で触って覚えていきたい。
使っていると恩恵とか色々感じるんやろうな〜


補足等ありましたらコメントいただけると幸いです。
Windows で JupyterLab IndexError: pop from an empty deque のメモ

https://github.com/jupyterlab/jupyterlab/issues/11934

JupyterLab Desktop をインストールしていたりして設定ファイルやキャッシュファイルがコンフリクトするのが原因っぽい.

ファイルを削除したり起点とするディレクトリを変えるとたぶん治るでしょう!
Talend Open StudioでHyper Fileに出力する　その2

## 目標

Hyper FileのJDBC Driverを書いてTOSに出力できるようにすることを目標にします。

## 参考にするもの

この方の記事を参考にします。

https://qiita.com/koduki/items/5ae2aa58afa0bef14014

## 開発環境の準備

Visual Studio Codeを使います。
ソースをcodeで開いてみたら、varを使っていたのでJDK8ではだめでした。
JDK11をインストールします。

```shell
sudo apt install openjdk-11-jdk
```

## ソースコードをcodeで開いて実行

codeで開くと13だ11だと叱られるので、maven.compiler.sourceとmaven.compiler.targetを11に変更します。
そうしたら、Main.javaは実行できました。

JDBCの開発はできそうです。
Glideでスプレッドシートからアプリ作成してみた


# はじめに
ノーコードでアプリが作れるというGlideを使ってみました。
[Glide](https://www.glideapps.com)
結論として、スプレッドシートのデータをアプリ風に表示できるということなので便利そうなツールですね。

今回はスプレッドシートのデータを取り込んで表示するまでをやってみました。
![スクリーンショット 2022-05-10 21.45.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/7c70b105-d3ba-b7e1-17a3-55ab261e97c2.png)

Glideにログインして
![スクリーンショット 2022-05-10 21.46.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/8bedbbd9-67fa-b949-7376-5f2c46114853.png)

Glide Appを選択します
![スクリーンショット 2022-05-10 21.47.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/a75c0974-24f3-2e1b-1b3e-4564efd04ff1.png)

Project作成の際にGoogle Sheetsを選択します。
![スクリーンショット 2022-05-10 21.47.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1910510/1d28d55c-dcf0-b31f-0f84-d604ba38b86f.png)

その後、自分のGoogle Drive上のスプレッドシートを連携することで下記のようなアプリが出来ました。
[飲食店検索アプリ](https://nosy-note-7112.glideapp.io/)

ここまで3分ほどで出来たので手軽だなと実感しました。
いろいろテンプレートなども試せそうなので、仙台の飲食店情報を充実させていきたいと思います。
型推論 var を使う・使わないの判断基準

memo.

## 結論
右辺を見て、型が容易にわかる場合は var を使う。
​
## 理由
右辺を見ても型がわからない、または型を勘違いするような場合は、一目で理解しづらいコードになってしまうから。
​
## 具体的には
右辺を見れば一目で何の型かわかるような例


### インスタンス化している

```java
var list = new ArrayList<String>();
```


### リテラルである

```java
var n = 123;
```

### 戻り値の型を容易に推測できるメソッドを呼び出している

```java
var date = LocalDateTime.now();
```

​
## 参考資料

https://qiita.com/dhirabayashi/items/a4a13d19b41779325bb0
VSCodeでライブラリやモジュールがcould not be resolved（黄色波線）になったら

# 始めに
少し前までは[Anaconda](https://www.anaconda.com/)で仮想環境を作ったり，[Jupyter Notebook](https://jupyter.org/)でコーディングしたりという感じだったのですが，その後，友人に[VSCode](https://code.visualstudio.com/)を勧められました．使い始めは一瞬だけ戸惑いましたが，すぐに慣れることができ，さらにとても便利で，すんなり乗り換えることができました（友人には感謝）．

暫く使っていると，タイトルのような状況に出くわすことがあります．何度か調べたり読んだりして，仕組みと解決法はぼんやり理解したのですが，同じメッセージが出る度に調べるのも．．．と感じたので備忘録として残します．

以下は，[こちらの記事](https://startlab.jp/learning-python/vscode-settings/)を参考に，同記事に則した内容です．

# 状況は？
開発中，
```
import [library_name]
```
などとして，ライブラリやパッケージ，あるいはモジュールなどをimportしますよね．すると，[library_name]に黄色の波線が引かれます（下図，見にくいですがhello.pyが当該ファイルです）．

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323532393631322f32373962346337332d666664362d363861312d306661312d6431343663323062316236302e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/eeb57330-6cbe-c643-6538-3aecfc73eb7d.png)

何言うてんのかなーって感じでカーソルを合わせて見てみると，could not be resolvedとのこと（下図）．

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323532393631322f32633630303730322d353563342d613838622d396237362d6264356539643638386663302e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/6b948d4f-584d-1581-7dbd-ca547cccaac0.png)

しかしながら，このコード自体はエラーなく実行できます．したがって，Pythonがflaskにアクセスするのは問題なくできているけど，VSCodeがflaskを見つけるのに失敗している状態です．VSCodeからflaskへのアクセスができれば（そのように設定を追加すれば），これは回避でき，AutoCompleteなどもシームレスに利用可能になります．

# 対処法は？
上記の通り，VSCodeの設定を少し書き換えてあげましょう．インストールしたflaskの場所を確認します（下図）．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/07603955-49c3-2e70-605b-d68857d0936a.png" height=30%>

したがって，flaskは，
```
D:\DEGUCHI\00_src_python\99_notes\00_web\01_flask\.venv_flask\lib\site-packages\
```
の中にあるんですね．このパスを，VSCodeに追加します．設定からExtra Pathsを探し，Add Item欄に上記のディレクトリパスを追加しましょう（下図）．

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/b81d670f-8a1d-8a5a-6b67-6b0e90361617.png" height=30%>

そして元のファイル（hello.py）に帰ってくると．．．!

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f323532393631322f65303639323939662d646163362d376261342d303961382d3838373731343561386330382e706e.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2529612/126990e6-8af7-8d61-d50d-63d68ef5e478.png)

波線もメッセージも消えていますね！flaskにカーソルを合わせてみるとmoduleであることを認識してくれています．

# 終わりに
要約すると，Pythonからは見つけているから実行してもエラーにはならないけど，VSCode側からは見つけきれていないよってことでした．

そのまま開発しても実行自体に問題は無いのですが，AutoComplete機能とかも使えないし，コード内にバグが発生したときに混乱の元になりそうですよね．何より僕は性格上とても気になりますので回避したいです．Anacondaを使っていた時には遭遇しなかったので，VSCodeで初めましてのメッセージでした．

# 参考文献
[1] [参考にさせていただいた記事](https://startlab.jp/learning-python/vscode-settings/)
brew updateでfatal errorが発生したら

## 状況
先程`brew update`しようとしたら以下のエラーが発生しました

```zsh
❯ brew update
fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/Homebrew/brew/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/Homebrew/homebrew-core/': Could not resolve host: github.com
fatal: unable to access 'https://github.com/Homebrew/brew/': Could not resolve host: github.com
Error: Fetching /opt/homebrew/Library/Taps/homebrew/homebrew-core failed!
Fetching /opt/homebrew failed!
```

## 環境

- Homebrew 3.4.10
- macOS Monterey v12.3.1

## 解決

以下の２つのコマンドのうち、１つを実行すれば解決します

```zsh
brew cleanup
brew upgrade
```
:::note warn
理由は後述しますが`brew upgrade`がオススメです！
:::

## 説明
自分は最初「キャッシュが原因かな？」と考えたので`brew cleanup`を実行したのですが、そのとき以下の表示がされました
```zsh
Warning: Skipping git: most recent version 2.36.1 not installed
Removing: /Users/takayamatoranosuke/Library/Caches/Homebrew/git--2.36.0... (15.5MB)
==> This operation has freed approximately 15.5MB of disk space.
```

この表示から「git のバージョンが上がったからアクセスできなかったんだ！」と分かりました

その後`brew update`を実行し、以下の表示を確認できました

```zsh
❯ brew update
Updated 1 tap (homebrew/core).
==> New Formulae

~~省略

You have 1 outdated formula installed.
You can upgrade it with brew upgrade
or list it with brew outdated.
```

先程のcleanupから「gitがアップデートされてない！」ということが判明したので、次に`brew upgrade`を実行しました

```zsh
❯ brew upgrade
==> Upgrading 1 outdated package:
git 2.36.0 -> 2.36.1
省略~~
```

無事gitのバージョンアップが完了しました！

このことから`brew cleanup`より`brew upgrade`の方をオススメする理由は、結局gitのアップデートをかけるためにはupgradeしなといけないからです

今後もgitのバージョンアップは継続されていくと思うので、ここに対応を記録しておきます
[swift]UserDefaultsで構造体を保存する

## 「UserDefaults」とは？
ユーザーのデフォルトデータベースへのインターフェイスです。
アプリの起動時にキーと値のペアを永続的に保存します。

一言でいうと「簡単に使えるキーバリュー型のDB」です。

## 自作した構造体はそのまま保存できない

おそらく下記のような構造体を自作して保存したい場面が多いかと思います。

```ruby:DataModel.swift
import Foundation

struct DataModel: Codable {
    let name: String?
    let age:Int?
    let birthday: String?
}
```

## 使用方法

### 保存
Data型に変換してから保存します。

```ruby:ViewController.swift
let dataModel = DataModel(name: name, age: age, birthday: birthday)
                
                let jsonEncoder = JSONEncoder()
                jsonEncoder.keyEncodingStrategy = .convertToSnakeCase
                guard let data = try? jsonEncoder.encode(dataModel) else {
                    return
                }
                UserDefaults.standard.set(data, forKey: "key")
```

### 呼び出し

取得する場合は、UserDefaultsから Data型として取得し、自作した構造体に変換し直せば良いです。

```ruby:ViewController.swift
let jsonDecoder = JSONDecoder()
        jsonDecoder.keyDecodingStrategy = .convertFromSnakeCase
        guard let data = UserDefaults.standard.data(forKey: "key"),
              let dataModel = try? jsonDecoder.decode(DataModel.self, from: data) else {
                  return
              }
```
[swift]UIButton関連あれこれ

すぐ忘れるので備忘録
(随時更新）


```ruby:UI関連
        #//角丸設定
       UIButtonの変数名.layer.cornerRadius = 10

        #// 影の濃さ
       UIButtonの変数名.layer.shadowOpacity = 0.7
        #// 影のぼかしの大きさ
       UIButtonの変数名.layer.shadowRadius = 3
        #// 影の色
       UIButtonの変数名.layer.shadowColor = UIColor.black.cgColor
        #// 影の方向（width=右方向、height=下方向）
       UIButtonの変数名.layer.shadowOffset = CGSize(width: 5, height: 5)
```



```ruby:ボタンタップ

#//追加
UIButtonの変数名.addTarget(self, action: #selector(メソッド名), for: .touchUpInside)

#//呼び出し
@objc func メソッド名(){ }



```