OmniAICreator/Qiita-1.07M huggingface dataset:
2022年5月辺りから #thunderbird で #GoogleMail を使えなくなった場合の対処

本内容を利用した場合の一切の責任を私は負いません。

検索したら対処が出てくるけど、それだけではダメだったので。

まず元の原因はこれらしい。

[安全性の低いアプリと Google アカウント]
https://support.google.com/accounts/answer/6010255?hl=ja&visit_id=637951200682931737-1077216179&p=less-secure-apps&rd=1

簡単に言うと、2022/05/30でIDとパスワードだけでの認証は終了された。
で、検索すると下記の対処がある。

[Google メールアカウントの OAuth 2.0 認証への自動変換]
https://support.mozilla.org/ja/kb/automatic-conversion-google-mail-accounts-oauth20

簡単に言うと、
・対応するバージョンにする
・Cookieを一時的に有効にする
・Javascriptを一時的に有効にする

で、この対処をやったけど、それでも自分はダメだった。
ダメアカウントとだいじょぶなアカウントがあって比べてみたら、POPの設定に違いがある。
Googleに載っている設定はこれ。

[POP を使用して他のメール クライアントで Gmail のメールを読む]
https://support.google.com/mail/answer/7104828

thunderbirdの場合、下記の2つの設定がある。
・接続の保護
・認証方式

Googleに従って、「SSL」で「通常のパスワード認証」にしたけどダメ。
で、だいじょぶな方を元に、認証方式をOAuth2に変更した。
そしたらだいじょぶになった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397476/afd9b722-2c83-220d-b204-cc6717d6f383.png)


Googleに載ってる内容じゃわからないじゃん。
つか、どうしてだいじょぶな方は何もせずにだいじょぶだったんだろう(笑)
Flip Tables を使ってみる


例えば、ログに、List<Item> を

```kotlin
println(list)
```

このように表示されているのが、

```
I/System.out: [Item(exchange=quoine, pair=bchjpy, price=127989.3), Item(exchange=bitflyer, pair=btcfxjpy, price=1073351.0), Item(exchange=kraken, pair=btcjpy, price=1046576.0), Item(exchange=bitflyer, pair=btcjpy, price=1038000.0), Item(exchange=quoine, pair=btcjpy, price=1035870.94), Item(exchange=kraken, pair=ethjpy, price=91402.0), Item(exchange=quoine, pair=ethjpy, price=90595.82), Item(exchange=kraken, pair=xrpjpy, price=109.815), Item(exchange=kraken, pair=zecjpy, price=41855.0)]
```

こう書くだけで、

```kotlin
println(FlipTableConverters.fromIterable(list, Item::class.java))
```

こんなテキストで表で整形されて表示されます。

```
I/System.out: ╔══════════╤══════════╤════════════╗
I/System.out: ║ Exchange │ Pair     │ Price      ║
I/System.out: ╠══════════╪══════════╪════════════╣
I/System.out: ║ quoine   │ bchjpy   │ 127989.3   ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ bitflyer │ btcfxjpy │ 1073351.0  ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ kraken   │ btcjpy   │ 1046576.0  ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ bitflyer │ btcjpy   │ 1038000.0  ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ quoine   │ btcjpy   │ 1035870.94 ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ kraken   │ ethjpy   │ 91402.0    ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ quoine   │ ethjpy   │ 90595.82   ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ kraken   │ xrpjpy   │ 109.815    ║
I/System.out: ╟──────────┼──────────┼────────────╢
I/System.out: ║ kraken   │ zecjpy   │ 41855.0    ║
I/System.out: ╚══════════╧══════════╧════════════╝
```

ぜひ、お試しあれ。

[👉 Flip Tables で List を見やすくログに表示する](https://android.benigumo.com/20180226/flip-tables/)
pythonで基板発注に使うファイルの改名を一発でやるやつを作ってみた

# 目的
基板外注ファイルはprotel拡張子(トップレイヤであれば.GTLとか)であることが求められる場合がある．しかしながら，kicadでガーバーファイルを生成すると，拡張子が小文字で出力されてしまい，外注メーカーのガーバービューワーが使えなかったりすることがある．また，メーカーによってはファイル名は統一されていることが求められる場合がある．そこで，ファイル名の統一と拡張子を大文字にすることの二つを同時に一発で行えるプログラムを作る．

# 環境
- kicad 5.1.9
- python 3.10.4

# プログラム
.gm1は.GKO，.drlは.TXTに変換されるようにしている．これは外注先に合わせる必要がある可能性がある．実行時にファイル名をコマンドライン引数で指定している．

``` pcb_rename.py
import glob
import sys
import os

args = sys.argv
prog_name = args[0]
pcb_file_name = args[1]
file_in_dir = glob.glob("./*")
file_in_dir.remove(prog_name)
for file in file_in_dir:
    file_renamed = file[2:]
    period_pos = file_renamed.find(".")
    file_renamed = file_renamed[period_pos:]
    file_renamed = file_renamed.upper()
    if file_renamed == ".DRL":
        file_renamed = ".TXT"
    elif file_renamed == ".GM1":
        file_renamed = ".GKO"
    file_renamed = ".\\" + pcb_file_name + file_renamed
    print("renamed " + file + " to " + file_renamed)
    os.rename(file, file_renamed)
```
# ガーバーファイルの生成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232528/55825c48-9b5f-f8d4-0034-0fba1ac1bb88.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232528/1b0199d5-787b-3901-98f5-8c1289f6ae03.png)

# 実行結果
これを
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232528/7092b2ec-1d31-9f7f-b4c6-237afae03d31.png)
こうして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232528/4da80541-c343-4a02-be0f-ed4f439c4eb8.png)
こうじゃ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/232528/c5241037-1500-84fb-f828-d7da676af412.png)

# 備考
何気pythonで世界に挨拶以外のことをしたのは初めてです．
C++が好きです．
Postmanでテストを書く

[Postman](https://www.postman.com/)でテストを書く機会があったのでメモです

## 参考

[公式ドキュメント](https://learning.postman.com/docs/postman/scripts/test-examples/)

## APIのレスポンス参照

``` javascript
let response = pm.response //.json()を末尾につけるとparseされる;
```

## テストブロック

``` javascript
pm.test("テストの説明", function () {
    // テストする内容
});

```

## ステータスコードのテスト

``` javascript
pm.test("StatusCode == 200", function () {
    pm.response.to.have.status(200);
});
```

##　レスポンス（JSON)のパラメータテスト

``` javascript
pm.test("Parameter test", function () {
    pm.response.to.have.jsonBody("key1")
    pm.response.to.have.jsonBody("key2")
    pm.response.to.not.have.jsonBody("key3") // 持っていないこと
});
```


## 値の比較

```javascript
pm.test("eql Check", function () {
    pm.response.to.eql('A'); // == A
    pm.response.to.not.eql('B'); // != B
});
```

## 環境変数への格納

```javascript
pm.environment.set("updatedAt")
```

## 環境変数の参照

```javascript
pm.environment.get("updatedAt")
```

以上
レムニスケート「公立千歳科学技術大学2019年第４問[Ⅲ型]」をwolframalphaとsympyでやってみた。

オリジナル

https://mathmathmass.exblog.jp/32087547/

点 (±a, 0) は、レムニスケートの焦点（英：focus, -ci）と呼ばれる。(wikipediaより）


# (この項目は古いです。)この問題の解答前のポイントは、2つでした。

①曲線Cが、x軸上の3点?を通る。たぶん。
曲線Cが、(-√2,0)(0,0)(√2,0)を通るのを確認してからでした。
sympyのプログラムで作図する時に気づきました。
距離の積(原点)　　　 　　:1*1=1
距離の積(x座標の最大値）:(1+√2)(√2-1)=1

②曲線Cは、y軸上だと原点しか通らない。
以上。

worframで上記の座標を確認。

https://www.wolframalpha.com/input?i=abs%28x-%28-1%29%29*abs%28x-1%29%3D1&lang=ja

# wolframalphaで（曲線C作図用のみ)

https://www.wolframalpha.com/input?i=%28x**2%2By**2%29**2+%3D+2*%28x**2-y**2%29&lang=ja

# sympyで

```python
from sympy import *
var('x y r t')
A=Point(-1,0)
B=Point( 1,0)
P=Point( x,y)
myEq=Eq(A.distance(P)*B.distance(P),1)
C=myEq.lhs**2-myEq.rhs**2
myEq=Eq((x**2+y**2)**2,(-(C-(x**2+y**2)**2)).simplify())
print("#(1)",str(myEq.lhs).replace(' ', '')+" = "+(str(primitive(myEq.rhs)[0])+"*("+str(primitive(myEq.rhs)[1])+")").replace(' ', ''))
myEq=myEq.subs({x:r*cos(t),y:r*sin(t)}).simplify()
myEq=Eq(div(myEq.lhs,gcd(myEq.lhs,myEq.rhs))[0],
        div(myEq.rhs,gcd(myEq.lhs,myEq.rhs))[0])
print("#(2)",str(myEq.lhs)+" = "+str(myEq.rhs))
print("#(3)",
      Intersection(
      Union(Interval.Ropen(0, pi/2), Interval.open(0, pi/2)) ,
      solve_univariate_inequality(myEq.rhs > 0, t, relational=False)
                  )
      )

# 以下の作図も、怪しいです。------------------------
ans=solve(C,y)
ax1=plot( ans[3],(x,0, sqrt(2)),show=False)
ax2=plot(-ans[3],(x,0, sqrt(2)),show=False)
ax3=plot(-ans[3],(x,-sqrt(2),0),show=False)
ax4=plot( ans[3],(x,-sqrt(2),0),show=False)
ax1.extend(ax2)
ax1.extend(ax3)
ax1.extend(ax4)
ax1.show()
#(1) (x**2+y**2)**2 = 2*(x**2-y**2)
#(2) r**2 = 2*cos(2*t)
#(3) Interval.Ropen(0, pi/4)
```

### ｙの最大値:ans[3]より

https://www.wolframalpha.com/input?i=%E6%9C%80%E5%A4%A7%E5%80%A4%E3%80%80sqrt%28-x**2+%2B+sqrt%284*x**2+%2B+1%29+-+1%29&lang=ja

最大値1/2

### sympyのplotモジュールで作図。縦横比難あり。
plotモジュールに最大値を準備する必要はありません。計算して作図してくれます
xの範囲も特に必要ありませんでした。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/ca69aaea-3c24-b8cc-b434-af51b59adde0.png)


# 参考

https://qiita.com/mrrclb48z/items/a5a8b810ff7c9315d5a9

sympyのUnion,Interval等
Dockerデスクトップのチュートリアル後に、localhost/tutorialへ勝手にリダイレクトされる

Dockerデスクトップをインストールした後、下記のチュートリアルを行ったところ、`http://localhost`へアクセスすると、`http://localhost/tutorial`へ転送されて抜け出せなくなった

https://docs.docker.com/get-started/
```
1. Dockerデスクトップ立ち上げ
2. ターミナルで docker run -d -p 80:80 docker/getting-started
3. http://localhostへアクセル
```

## 解決方法
ブラウザ（chrome）のキャッシュが悪さをしているので、削除すると解決する
chrome://settings/
参考にした記事：https://stackoverflow.com/questions/63596057/localhost-redirecting-to-localhost-tutorial

![sfasdfa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513214/d343372d-d2e5-3c80-886b-911f1f67e99f.png)
[terraform] 差分検知したリソースの整形済みterraform stateを取得する

terraformで管理しているリソースを、AWSマネコンで変更したあと、その差分をコードに反映するにあたって、コピペ可能な整形されたコードを取得する方法
(コピペ可能な整形されたコード = 対象リソースの、terraform state showの出力、を得ること)

以下手順でOK

- 一度terraform state rmする

```
terraform state rm aws_iam_policy.test
```

- terraform importする

```
terraform import aws_iam_policy.test arn:aws:iam::123456789012:policy/test-policy
```

- terraform state showする

```
terraform state show aws_iam_policy.test
```

- 出力結果をterraformの対象リソースに上書き(もしくは既存の記述をコメントして追加し)、id, arnなどを削除(orコメントアウト)して利用する
Salesforceで小数点第二位以下を切り捨てる方法

Salesforceには数式項目があり、floor関数という数式があります

floor関数についての詳細はこちらヘルプをご参照ください



### floor 関数
[もっとも近い整数に切り捨てられた数値を返します。]

https://help.salesforce.com/s/articleView?id=sf.bi_integrate_data_prep_recipe_formula_field_numericFunctions_floor.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5


floor関数を使用した例を示します。

※数値で小数点第二位以下を切り捨てる


floor(testA__c * 10) / 10


testA__cは数値項目のAPI参照名です


上記数式を使用すれば、
例えば数値項目が「4.66666」
の場合
「4.6」と表示可能です。
世界の地図、衛星画像をQGIS 背景図として、HERE Raster Tile API を接続する手順

# はじめに

[HERE Raster Tile API](https://developer.here.com/documentation/raster-tile-api/dev_guide/index.html) は、日本を含む世界中のマップ タイル イメージをリクエストできる REST API です。
QGIS上で背景図として利用する手順をまとめてみました。
HEREのAPIキーをお持ちであれば、事前準備と確認をスキップし、コピペとクリック操作のみ3分で設定できちゃうと思います。

# 事前準備と確認　
- APIキーの入手
HEREのAPIキーをお持ちでない場合は、下記リンクの手順を参照ください。

https://qiita.com/kekomat/items/d2e29bac84a27c1ec521

- API接続確認
https://maps.hereapi.com/v3/base/mc/11/1819/806/png8?apiKey={API_KEY}
の`{API_KEY}`をお持ちのAPI Keyに置換いただき、Webブラウザでアクセスいただくと、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/4f8e5d5b-282d-fc23-0be2-77f32266914d.png)

東京城東エリアのタイルが表示できれば、ご自身のデスクトップ環境からインターネット経由でHEREのAPIにリクエストし、画像タイルが正常に取得できたことを確認できます。

このリンクは、特定のタイル（zoom/column/row=11/1819/806)を指定していますので、QGISのXYZ Tilesに追加する際は、下記のように座標を{z}/{x}/{y}で置き換える必要があります。
https://maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8?apiKey={API_KEY}
注）上記リンクは、{z}、{x}、{y}は,QGISが値を代入する必要があるため、このリンクをそのままWebブラウザで見ると、`"check parameter schema in '/openapi'`的なエラーが表示されます。

# QGIS上での設定
今回、QGIS versionは、3.22.7-Białowieżaを利用しています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/99aa1062-c676-30b4-ab91-463f8f1af3ce.png" width=50%> 

QGISを立ち上げていただき、ブラウザパネルの中の`XYZ Tiles` を右クリックし`New Connection(新しい接続）`を選択します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/f6d49d9b-286d-466e-fad3-a73811002da5.png" width=50%>

`Name(名前)`は、任意の名前を入力いただき、URLに
https://maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8?apiKey={API_KEY}
を入力し、`OK`をクリックします。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/b7a0987f-7bc2-3802-ed20-a340efeb73da.png" width=50%>

ブラウザーパネルに、タイルが追加されており、ダブルクリックするとレイヤーが追加され、世界地図が表示され、自由にズームやスクロールが可能となります。

# 参考情報
URLに `style=satellite.day` を追加すると、衛星画像を表示できます。
https://maps.hereapi.com/v3/base/mc/{z}/{x}/{y}/png8?style=satellite.day&apiKey={API_KEY}
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725955/c75ee57b-3b3e-889c-095a-bec06ae36349.png" width=50%>

その他、APIの引数については、
- HERE Raster Tile API v3 API リファレンス
https://developer.here.com/documentation/raster-tile-api/api-reference.html

また、Map Tile API v2をご利用いただいていた方は、下記のマイグレーションガイドも参考にいただければ幸いです。
- Migrate from HERE Map Tile API v2 to HERE Raster Tile API v3
https://jp.developer.here.com/documentation/raster-tile-api/migration_guide/index.html
レビュー指摘メモ



## △△△画面の時にだけ表示する方法(コントローラーを画面名毎に用意して表示させる)

```:HTML
  <% if controller?name == "△△△" %>
    <p class="text-center">
        表示したい内容
    </p>
  <% end %>
```

## 更新時、画面の入力をクリアする

```:コントローラー

    if @sample.save

      #　PARAMSの中身を空に
      params[:hoge] = nil

    　　　＃　変数を空にする
      @sample = Sample.new
    end

```

## 印刷ボタンを押下時にはDB登録をしない。それ以外は登録する

```:コントローラー
    if @params[:commit] == " 印刷 "
        put_log(rec, '')
    else
        # 登録処理
    end



```

## 0か確認する場合、blankを使う

```:

# 悪い例
return if sample.coun == 0

# 良い例
return if sample.blank?
```
M2 Mac DockerでのSelenium環境構築のはまりポイント

M2 Mac (M1でも共通)にて、DockerでSelenium環境構築の際にはまった内容

# 内容

Docker環境にて、以下のimageにてseleminum環境を構築した際に下記のエラーとなった

image:
```
selenium/standalone-chrome
```

エラー内容：
```bash
      Selenium::WebDriver::Error::SessionNotCreatedError:
        Could not start a new session. Error while creating session with the driver service. Stopping driver service: Could not start a new session. Response code 500. Message: unknown error: Chrome failed to start: crashed.
          (chrome not reachable)
          (The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
```

# 原因

どうやら M2 Macでは動作しないらしい
コンテナは立ち上がるのに。。。

# 対策

以下のimageを使用したらいいらしい

```
seleniarm/standalone-chromium
```

# さいごに
備忘録的に内容を残しています
詳細な原因については、時間あれば調べて追記します
【PHP】日付から曜日を返す方法

使う機会があったのでメモ。

```
/**
 * 日付を元に曜日（英語）を返す
 *
 * @param string $date 日付 ex.'2022-01-02'
 * @return string 曜日 ex.'sun'
 */
function getDayOfWeek($date) {
    $dayOfWeek = [0 => 'sun', 1 => 'mon', 2 => 'tue', 3 => 'wed', 4 => 'thu', 5 => 'fri', 6 => 'sat'];
    return $dayOfWeek[date('w', strtotime($date))];
}
```

※英語の曜日の場合、もっと簡潔に書く方法をコメントにて教えていただきました。
　ありがとうございます。
TypeScript 学習記録3

## はじめに
TypeScriptの学習で学んだことについて後日自分で振り返るためにまとめていきます。

[TypeScript 学習記録2](https://qiita.com/bear05/items/3f3e688a63b76864c97b)
の続きです。


## インターフェース

### インターフェースの使い方
クラスがどんなフィールドやメソッドを持っているか定義する。
同じ名前で宣言すると、プロパティが追加される。
extendsを用いることで継承したインターフェースを作れる。
implementsでインターフェースを実装したクラスを作れる。

インターフェースは型エイリアスも拡張できる。

```
interface Sample {
  name: string
}

interface Sample {
  number: number
}

interface SampleEx extends Sample{
    array:string[]
}

class SampleImp implements SampleEx {
    name: string
    num:number
    array:string[]

    constructor(name: string, num:number,array:string[]){
        this.name = name
        this.num = num
        this.array = array
        
    }
}


type SampleType = {
    name: string
    num: number
  }
  
  interface SampleExSt extends SampleType {
    array: string[]
  }
  
  const SampleExSt1: SampleExSt = {
    name: 'Taro',
    num: 1,
    array: ['abc','def']
  }
```

### typeとの違い
・インターフェースは同名で宣言して型を追加できるが、typeはできない。
・インターフェースは継承によって新しいインターフェースを作り、typeは交差型でtype同士を合体させて新しいtypeを作る。
・インターフェースはオブジェクト、関数の型のみ宣言可能、typeはオブジェクト、関数、プリミティブ、配列、タプルも宣言可能。
TypeScript 学習記録2

## はじめに
TypeScriptの学習で学んだことについて後日自分で振り返るためにまとめていきます。

[TypeScript 学習記録](https://qiita.com/bear05/items/0b778e2cfdc5f6a51d3c)
の続きです。

## オブジェクト

### オブジェクトリテラル記法
オブジェクトリテラル記法を用いてオブジェクトを定義する。

### プロパティ
?(オプショナル)がついたものは、値があってもなくても良い。
readonlyがついたプロパティは最初だけ値を定義することができ、後から書き換えられない。



```
//オブジェクトリテラル記法
 let human: {
    name: string
    age: number
    readOnly bloodype :string
    gender? :string
  } = {
    name: 'tarou',
    age: 20,
    bloodype: 'A'
  }

//以下はただのオブジェクトで、プロパティが認識されない
    //   const human:object =  {
    //     name: "tarou"
    //     age: 20
    //   } 
    // human.name //エラー

```

### インデックスシグネチャ
オブジェクトがあるプロパティを何度も使用する時に使う。
keyはstringまたはnumber

```
  const sample1: {
    [position: string]: string
  } = {
    'leader': 'Taro',
    'deputyLeader': 'Hanako'
  }

  sample1.member = 'Sho'
```

### 型エイリアス　型定義の再利用
型に名前をつけて宣言、再利用することができる

```
  type Membership = {
    name: string
    number: number
    gender: string
  }

  const member: Membership = {
    name : 'Taro',
    number:1,
    gender:'man'
  }
```


### 合併型(union)と交差型(intersection)
合併型はオブジェクトAまたはBのどちらかになれる
交差型はオブジェクトAとBの要素をすべて必ずもつ

```
  type union = A | B
  type intersection = A & B
```

## 配列とタプル

###　配列
合併型もできるけど、あまり使わない
TypeScriptは型推論もしてくれる

```
    const member: string[] = ['Taro', 'Hanako']
    const sample: (string | number)[] = ['あいうえお', 123]
```

### タプル
配列よりも厳格な型定義
レストパラメータも使える
```
const member: [number, string] = [1, 'Taro']
```

### イミュータブル(読み取り不可)の配列
配列はconstで宣言されても書き換え可能(ミュータブル)
イミュータブルにするために、readonlyをつける

```
const sample: readonly string[] = ['abc', 'あいう', 'efg']
//sample.push("かきく")　エラーになる
//sample.[0] = 'hij'　エラーになる
```

## ジェネリック型
型の種類は違うが同じデータ構造のものを共通化する。
オブジェクト指向の多態性に該当する。

```
type SampleGeneric<T> = {
    (array: T[], value: T): T
  }

const SampleFunc: SampleGeneric<string> = (array, value) => {
return 'sample';
}

  // 完全な呼び出しシグネチャ（
  type SampleGeneric2 = {
    <T>(array: T[], value: T): T
    <U>(array: U[], value: U): U
  }
  // 呼び出しシグネチャの省略記法
  type SampleGeneric3<T> = (array: T[], value: T) => T
  type SampleGeneric4 = <T>(array: T[], value: T) => T

```

## オブジェクト指向

・継承（インヘリタンス）
・カプセル化
・多態性（ポリモーフィズム）

クラスをまとめて、隠して、クラスを元にインスタンスをたくさん作ってく。
クラスがたこ焼き機で、インスタンスがたこ焼き。

○オブジェクト指向で用いる用語
・プロパティ
・メソッド
・コンストラクタ
・インスタンス

private…そのクラスのみでアクセス可能、インスタンスでも使える
protected…そのクラスとサブクラスのみ
public…デフォルト、どこからでもアクセス可能

抽象クラス…abstractがついたクラス、インスタンス化できず継承して用いるクラス

```
//クラス定義
class Sample {
    private name:string
    private num:number

    constructor(name: string, num: number) {
        this.name = name
        this.num = num
    }

} 

//インスタンス化
new Sample('Taro',1)    

abstract class SampleAbs {} //抽象クラス
class SampleAbs1 extends SampleAbs{}    //抽象クラスの継承

```




### 参考記事
・[トラハック 日本一わかりやすいTypeScript入門シリーズ](https://www.youtube.com/watch?v=kd8VH10jXwc&list=PLX8Rsrpnn3IW0REXnTWQp79mxCvHkIrad)
Next.jsのTypeScript化の方法

ポートフォリオをjsで書いていたが、tsに書くために書き替えた部分を紹介します。
ですが、私自身もTypeScriptの知識が不十分な部分があるので、初心者向けの内容です。

### ファイルをjsからtsxに変える
文字通りです。最初に書き換えましょう。
するとエラーが沢山出るので、作り込んだ段階で変えるとメンタルが少しやられます。

### Eventに属性をつける
onchageなどでよく使われるeventはそのままだとエラーが出るので、 React.ChangeEvent<HTMLInputElement>　を足しましょう。

```JavaScript
          <TextField
            id="outlined-basic"
            label="Password"
            type="password"
            variant="outlined"
            className="m-auto w-80"
            onChange={(event: React.ChangeEvent<HTMLInputElement>) =>
              setPassword(event.target.value)
            }
          />

```
こうすることでエラーが無くなります。

### const に＜props＞をつける

自分はpropsで渡される要素をtypeを使って型定義をしています。
その後は、:<Props>　を付ければOKです。

VFCはTypeScript上だと受けれる恩恵が少ないそうなので、無くても大丈夫です。
参考記事　https://kray.jp/blog/dont-have-to-use-react-fc-and-react-vfc/

```JavaScript
type Props = {
  downloadURL: string;
  id: number;
  title: string;
  categori: string;
  netabare: string;
  context: string;
  email: string;
  photoURL: string;
  displayname: string;
  createtime: string;
  likecount: number;
};

// eslint-disable-next-line react/display-name
export const Cardpost: React.VFC<Props> = React.memo(

省略

```

### usestateの型付けを行う

これはuseStateと("")に型を入れると型をつけることができます。
```JavaScript
  const [title, setTitle] = useState<string>("");
  const [context, setContext] = useState<string>("");
```



以上のことをすれば一通りの型付けが完了します。
MacOS（M1）でAndroidStudioの仮想デバイスを起動する【解決】

## きっかけ
普段はMacにAndroid実機をUSB接続してデバッグ実行をしていたため、気にしていなかった。

ある日、外出先で実機を持ってきておらず「エミュレーターがあるしね〜」と公式から配布されているハードウェアプロファイルを読み込んで仮想デバイスを作成したところエラーで動かず。
![スクリーンショット 2022-08-03 15.18.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/54033c3a-4367-44df-011c-a536fcbd2957.png)
単純な話だけど割と焦ったし、探していた時に見つけた情報も最新ではなく苦戦したので残しておく。

#### 環境
- 端末:MacBook Air
- OS: Big Sur 11.4（Apple M1）
- Arctic Fox 2020.3.1 Patch 2

## 対処法（解決に至らなかったもの）
調べているなかでいくつかの対応方法が見つかった。
解決できなかったが方法案としてメモしておく。

1. メモリ不足
他に起動して負荷をかけているアプリもなく、８GBのMacbookAirならそれはないだろうということで今回の原因ではなさそうという結論

1. Intel x86 Emulator Accelerator (HAXM installer) が必要
が、これもインストールに失敗する。
![スクリーンショット 2022-08-03 15.21.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/798cb87b-1544-e48e-80e7-cca4a8e2f3e1.png)
必要なのか？と思って調べるとエミュレーターのパフォーマンス向上に活躍するらしい？
起動に必須ではなさそうなので一旦置き


## 解決
ようやく辿り着いた対処法。

https://tech.naturalmindo.com/notwork_androidemulator/

#### 環境（再度）
- 機種:MacBook Air
- OS: Big Sur 11.4<strong>（Apple M1）　←これ重要だった</strong>
- Arctic Fox 2020.3.1 Patch 2 ←これは原因なのか分からない

#### まずはAndroidStudioをアップデート（→2021.2.1 Patch 1）

これは正直、今思うと必要だったのか？とも思う。
解決した情報記事にあるAndroidの公式ページのApple Silicon対応エミュレータは使用しなかったのだがその理由として、リリースノートを確認している中で、
>31.2.7（2022年2月1日） [バグの修正] M1 マシンでエミュレータがハングアップするエラー

https://developer.android.com/studio/releases/emulator#31-2-7


とあったので、最新版（2021.2.1 Patch 1）なら動くのか？と思ったからだ。
というわけで、まずは2021.2.1 Patch 1にAndroidStudioを更新した。

#### M1はABIがarm64のものを使え

結果としては初歩的なことだった。お前M1だったな！本当に大失念。
CPUに詳しいひとなら初歩的なのかもしれないが、正直なところ分からない。
64bitと32bitは違う、x86_64ってややこしいなとか思う自分レベルはやらかすミスだろう。
そう思いたい。

ハードウェアプロファイルからデバイスを選択後、システムイメージでABIがarm64のものを選択。
![スクリーンショット 2022-08-03 17.49.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/2fda6642-a3de-2c7e-27ba-965283e47049.png)
できた仮想デバイスを実行すると…
![スクリーンショット 2022-08-03 17.52.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/d14b966e-1859-adad-13d5-21885db1f4eb.png)
やったー起動した！！！
x86・x86_64を選んで作った仮想デバイスだったから動かなかったようだ。
Windows環境ではこれで動いていたので落とし穴だった。
違いが分からない初心者で恥ずかしい。

![スクリーンショット 2022-08-03 17.51.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/233298/3d126c1d-05a1-62d2-f09b-9a9f107f6cc9.png)

これで実機がなくてもデバッグ実行できる。

## Android Emulatorは不要になったのか？

不要になるのか（なったのか）、正確なことは不明。
古いバージョンの時点でABIが違うことに気付けなかったため、2020.3.1 Patch 2環境でのABIがarm64のデバイスエミュレート確認が出来ていない。

ただ、今回の対応で自M1Macに別途エミュレータをインストールせずともAndroid Studioからエミュレートできた、という報告はできる。

M1マシンでエミュレータがハングアップするエラーは修正されているとすれば使用バージョンが古いM1ユーザーは最新化を検討してもいいのかもしれないな、と。



## 最後に
スクショでお気付きかもしれませんが、GoogleGlassの仮想環境を構築していました。
GoogleGlassのユーザーコミュニティに参加したのでこれから気付いたことは情報として残していけたらと思います。
コミュニティではオフラインイベントで実機に触る機会があったりします。
興味があればぜひ参加してみてください。

https://glasshopper.connpass.com/
【AzureML】サンプルデータの自動車価格予測(詳細)をやってみた

前回に続き、今回はAzureMLデザイナーにサンプルとしてある[regression-automobile-price-prediction-compare-algorithms](https://github.com/Azure/MachineLearningDesigner/blob/master/articles/samples/regression-automobile-price-prediction-compare-algorithms.md)
を使ってモデルの作成等を行ってみたいと思います。

ワークスペースやクラスターの作成、実行方法等は[最初の記事](https://qiita.com/K-Nomu3/items/6b9c89b958380ea67b64)を参考にしてください。


# サンプルを開く
それでは早速サンプルのほうを動かしてみたいと思います。
サンプルの利用は簡単で、デザイナー上部から任意のものを選ぶことで展開できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/070bc1c2-dad9-a1e3-4a3d-7780a738f421.png)

クリックするとデザイナーが開き、すでにブロックが並んだものが表示されると思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/d9ca73eb-6629-bcff-3051-f85ec64cd9eb.png)


# サンプルの内容
どのような処理を行ってるか確認してみましょう。

まずデータの取得です。
次に`normalized-losses`というカラムを除去してますね。
その後すべてのカラムに対して欠損の除去を行っているようです。
前処理したデータを7:3で分割しています。ここまでは前回と同じようですね。

ここからが少し異なるようです。アルゴリズムが二種類配置されいてますね。
`Boosted Decision Tree Regression`と`Decision Forest Regression`があり、それぞれ別々に学習を行っているようです。学習データは同じみたいですね。
それぞれの学習結果をもとにテストを行い、２つのデータを合わせて評価を行っているようです。
二つのモデルの比較をしているのでしょうか？
実際に動かして確認してみたいと思います。

# サンプルの実行
実行には10分ほどかかりましたね…もう少し高いスペックのクラスターにすると変わるかもしれません。
実行後にEvaluteModelを右クリックしてデータの表示をしてみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/34b4a8e9-80c5-8763-b678-bc2d188b6f9a.png)

こんな感じですね。どうやら右と左に入れたデータを並べて見せてくれるようですね。
評価指標の大小を比較しやすいかもしれません。
ただ今回は大きな差はないようです。全体的に左のデータが良い結果のように見えますね。
数値を見やすく確認するにはEvalueModelブロックをダブルクリックすると詳細を確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/f7544c94-ef82-f35c-7c2e-39dc8b4b604d.png)
現在は左のデータだけを表示した画面になっていますが、項目にチェックを入れるとそれぞれ確認することができます。
比較したいものだけ並べて見比べたりできるかもしれません。

# サンプルをいじってみる
ふと思ったのですが、この評価を比べるのは２つまでしかできないのでしょうか。
もう一つアルゴリズムを追加して確認してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/395106/8cd5d54d-f677-bcef-ba33-b8230a091e8a.png)
線をつなげようとしたところ怒られてしまいました。残念、、、
JoinDataというブロックもあったのですがうまくつながらなかったんですよね、、、
多分結合方法がダメだったんだと思います。

# まとめ
今回はサンプルデータの自動車価格予測(詳細)をやってみました。
前回と異なり、二つのモデルを見比べることができましたね。
これにより良いモデルの探索を行うことができると思います。
複数のデータの比較についてですが、Pythonコードを実行できるブロックがあるようなので、次回はこちらを使ってデータの操作や比較等もやってみたいと思います。
PostgreSQL + Homebrew のエラー?

エラー解決の記録です。

### エラー内容
PostgreSQLをインストールして初めてデータベースに接続するときに、
```
% brew services start postgresql
  ==> Successfully started `postgresql`(label:homebrew.mxcl.postgresql)
% brew services list           
  Name       Status       User File
  postgresql error  19968 <usename> ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
% psql postgresql
  psql: error: connection to server on socket "/tmp/.s.PGSQL.5432" failed: No such file or directory
  Is the server running locally and accepting connections on that socket?
```
という状況になりました。

postgresqlが**Successfully started**とは書いてあるけれども、実際の**Statusはerror**で、psqlコマンドで接続しようとすると**コネクションエラー**になっています。

Homebrewのコマンドを使わずに、
```
% postgres -D /usr/local/var/postgres/
```
でPostgreSQLを起動すると、別アプリのターミナルからpsqlコマンドで接続することはできたので、Homebrewのコマンドで起きる問題だと考えました。

### 解決方法

- /usr/local/var/log/postgres.log　への [username] のアクセス権限を「読み出しのみ」から「読み/書き」に変更する　

アクセス権限を変えた直後に`brew services list`を実行すると
```
% brew services list
  Name       Status  User File
  postgresql started <username> ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```
このようにStatusがstartedに変わり、psqlコマンドでの接続もできるようになりました。

### 考えられる原因
実は、この記事の問題として取り上げているエラーが出る前に、下記のような別の種類のエラーが出ていました。
```
% brew services start postgresql
  Error: Permission denied @ rb_sysopen - /Users/<username>/Library/LaunchAgents/homebrew.mxcl.postgresql.plist
```
これを下記の操作で解決したので、
```
% sudo chown <username> /Users/<username>/Library/LaunchAgents/
```
私はこの後も`sudo`を付けずに（[username]として）`brew services start postgresql`を実行していくことになります。

その後に、この記事冒頭の状態に移っています。


また、`brew services start postgresql`で使う↓このファイルは、

> ~/Library/LaunchAgents/homebrew.mxcl.postgresql.plist


↓このファイルへアクセスしているようです。
> /usr/local/var/log/postgres.log　



合わせて考えると、原因は**ログファイルへの書き込み権限を持っていないユーザーでPostgreSQLを起動しようとしたこと**ではないでしょうか。

ログファイルへの[username]のアクセス権限を「読み出しのみ」に戻すとエラーを再現できるので、この推測は正しいのではないかと思っています。

### 教訓
**あるファイルのオーナー権限やアクセス権限を変えて何かを解決したときは、そこからつながるファイルへのアクセス権限も変えなければならない（ときもある）。**


エラー解決のために参考にしたWebサイトは下記です。

[Homebrewでインストールしたpostgresqlが起動しないのを調べた](https://blog.n-z.jp/blog/2020-01-08-homebrew-postgresql.html)
[Permission denied error when trying to run postgresql on Homebrew](https://peaku.co/questions/24281-error-de-permiso-denegado-al-intentar-ejecutar-postgresql-en-homebrew)
未経験から就活してみた①

<h1>目次</h1>
<ul>
<li>概要</li>
<li>自己紹介</li>
<li>始めに取り組んだこと</li>
</ul>

<h1>概要</h1>
こんにちは初投稿です。<br>
今回エンジニアを目指すにあたって、<br>
<ul>
<li>どこで苦労しているか</li>
<li>これからどうしていくか</li>
</ul>
を中心に書いていきたいと思います。<br>
自分宛ての初心備忘録ではありますが、これからエンジニアを目指す方々の参考になればと思います。

<h1>自己紹介</h1>
2022年8月現在、29歳です。<br>
高校時代にプログラミングを齧っていました。<br>
現在は高校で物理を3年、中学校で理科を4年教えて教員7年目です。<br>
最近、教員としての資質向上を目的に、高等学校情報科の免許を取得しました。<br>
これをキッカケに『やっぱりプログラミング面白いな』と思い、転職活動を始めています。<br>

<h1>始めに取り組んだこと</h1>
<ul>
<li>SNSや転職サイトで情報収集</li>
　敵を知り己を知れば百戦危うからず。Qiitaさんはもちろん、TwitterやLinkedinなどを見て、情報収集を始めました。そこで抱いた結論は、<b>『未経験の中途採用厳しいな…』</b>と。<br>
　というのは、情報商材への誘導やプログラミングスクールの勧誘、派遣企業の紹介と誘惑が入り混じりして処理しきれないことが第一。ここでお金や時間を使わされる方も多いだろうな、と。<br>
　この記事を書いている現在、30手前なので時間が無いことは感じています。ただ学生時代に抱いた情熱を正しく消化するには、スクール行っている余裕ないんだよなあ…と思いながらこの記事を書いている次第です。<br>
<ul>
<li>どんな道具が流行っているのか</li>
GO,Pyrhon,AWS
<li>どんな資格が流行っているのか</li>
AWS、応用情報技術者試験
</ul>
という結果でした。後述しますが、これ<b>あんまり参考になりませんでした。</b>
<br>
<br>
<li>Progateで独学</li>
　まずは独学。色々な言語を触り、昔の間隔を取り戻しました。『うわー！HTML懐かしい！自作の小説をブログ作って載せたなあ”』『確かプログラミングって、改行にセミコロン使うんだよなあ』ぐらいの気持ちで色々挑戦しました。楽しかったです。
<br>
<br>
<li>転職サイトのスキルチェックやプログラミングコンテストの過去問に挑戦</li>
　Twitterを通じて独学の集まりに参加しました。そこでAtcorderに誘われ、プログラミングコンテストの過去問に挑戦しました。これが楽しいのなんの。二分探索の問題を見て『これがアルゴリズムか！なるほど！！！』なんて脳汁を求めながらキーボード叩いていました。楽しい。
<br>
<br>
<li>プログラミングスクール</li>
　Linkedinを通じて個人的なプログラミングスクールに参加しました。理由は自分の技術レベルを確かめたかったからです。いくつか課題が出され、2,3回講義を受けたところで十分な評価を頂きました。ここで縁を切るのももったいなかったので、ポートフォリオを作る際のメンターになっていただいています。
<br>
<br>
<li>とりあえず書類を出してみる</li>
　プログラミングの学習と並行して、とりあえず名の知れた企業に書類を出してみました。結果はお察しの通り。一度伸びた鼻をバッキバキに折られた感覚です。モチベーションが上がり下がりして大変でした。
<br>
<br>
<li>カジュアル面談に挑戦</li>
　転職エージェントさんの勧めで、Meetyを使ったカジュアル面談に挑戦してみました。これが面白いのなんの、天啓の連続でした。どんな人材を求めているのか聞くと、
<ul>
<li>自走</li>
<li>自学</li>
<li>自習</li>
</ul>
　表現はバラバラですが、とにかく<b>『自分で考えて動ける人材が欲しい』</b>という結論で一致していました。他には
<ul>
<li>資格に対する見方は人、会社、ポジションによって千差万別。</li>
<li>ポートフォリオは確実に見られる。Qiitaなど、アウトプット系は積極的にアピールするべき。</li>
<li>何をやりたいか絞らないと、途中でブレるし採用側も困る。</li>
<li>SNSで調べたことは狭い知見なので、あてにしてはいけない</li>
といった情報が得られています。まずは何か作ってみようかなあ。
</ul>

（ここまで所要期間10か月）<br>
今回は以上となります。最後までお読みくださりありがとうございました。就活頑張ります。
プリザンターのADユーザ同期で対象のユーザを絞り込む

# はじめに
プリザンターはADのユーザで認証するだけでなく、ADのユーザ情報を取り込むことができます。ADのユーザでログインするとプリザンターのユーザが自動的に作成されますが、ユーザ数が多い環境では全員にログインしてもらうのが困難です。その場合、ADの同期機能を使ってプリザンターにユーザを取り込みます。プリザンターにユーザを取り込むと事前にアクセス権を付与したり、ユーザ項目を使用して担当者を割り当てたりすることができます。

https://pleasanter.org/manual/active-directory-sync

## ユーザの同期
ユーザを同期する際、ADのユーザ数が膨大な場合、対象とするユーザを絞り込みたいケースがあります。プリザンターでは、2つの方法で同期するユーザを絞り込むことができます。いずれも下記のAuthentication.jsonで設定します。

https://pleasanter.org/manual/authentication-json

### OUで限定する
絞り込みたいユーザがOUで分かれている場合、LdapSearchRootに検索の起点となるOUを指定します。OUが分かれていない場合この方式は使えません。

```
"LdapSearchRoot": "LDAP://implem.local/ou=abc,dc=implem,dc=local"
```

### ユーザの属性値でフィルタする
絞り込みたいユーザの属性に法則がある場合は、LdapSyncPatternsにDirectorySearcherのフィルタ文字列を指定します。フィルタ文字列はLdapSyncPatterns内にJSON配列として複数記述することができます。下記の例はデフォルトの設定ですが、ObjectCategory属性がUserでObjectClass属性がPersonのオブジェクトを検索します。

```
"LdapSyncPatterns": [
    "(&(ObjectCategory=User)(ObjectClass=Person))"
]
```

### フィルタ文字列のテスト
DirectorySearcherのフィルタ文字列は下記のPowerShellでテストできます。下記の例ではCNが山田で始まるオブジェクトを検索しています。CN属性はワイルドカードを使用することで、前方一致検索が行えますが、distinguishedNameなど前方一致が行えない項目もあります。

```powershell
# 資格情報取得（資格情報を入力するダイアログが開きます）
$Credential = Get-Credential

# 検索用オブジェクトDirectorySearcher作成
$Searcher = New-Object -TypeName System.DirectoryServices.DirectorySearcher

# フィルタ文字列のセット（この部分を変更してトライ&エラーを行う）
$Searcher.Filter = "(&(ObjectCategory=User)(ObjectClass=Person)(CN=山田*))"

# 検索対象のドメインを指定
$DomainDN = "LDAP://implem.local/DC=implem,DC=local"

# 「DirectoryEntry」オブジェクトを作成し、ドメイン、資格情報を追加
$Domain = New-Object `
    -TypeName System.DirectoryServices.DirectoryEntry `
    -ArgumentList $DomainDN,
        $($Credential.UserName),
        $($Credential.GetNetworkCredential().password)

# 検索情報を追加
$Searcher.SearchRoot = $Domain

# フィルタ文字列にヒットしたオブジェクトを列挙
foreach($list in $Searcher.FindAll()){
    $list.properties["distinguishedName"]
}


```

### 属性の名前の確認
ドメインコントローラーに管理ツールとしてインストールされるADSIエディターを使用すると、ADの属性の名前や格納されている値を確認することができます。PowerShellのスクリプトと合わせてフィルタ文字列のテストに役立てることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78230/2b9a2577-ca51-7583-0df9-6336d4953876.png)
【Android】RecyclerView内のEditTextに入力した文字をスクロール時も保持

# 概要
RecyclerView内にExitTextを配置した際、テキスト入力後スクロールを繰り返すと入力したテキストが保持されない事象が発生。

# 対策
テキストリストを定義し、その中で保持。`EditText`の`Listener`は複数回定義されないように、`onBindViewHolder`内ではなく、`ViewHolder`内で定義しておく。

# コード
リストアイテム。`EditText`を配置。
```list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<EditText
	xmlns:android="http://schemas.android.com/apk/res/android"
	android:id="@+id/edit_text"
	android:layout_width="match_parent"
	android:layout_height="wrap_content"/>
```

メインレイアウト。`RecyclerView`を配置。
```activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.recyclerview.widget.RecyclerView
	xmlns:android="http://schemas.android.com/apk/res/android"
	xmlns:app="http://schemas.android.com/apk/res-auto"
	xmlns:tools="http://schemas.android.com/tools"
	android:id="@+id/list"
	android:layout_width="match_parent"
	android:layout_height="match_parent"
	app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
	tools:listitem="@layout/list_item"/>
```

アダプター。
・引数の`itemList`は`EditText`に表示するテキスト。`EditText`の文字が変更されたら、`itemList`の変更を行い、文字を保持しておく。
・`doOnTextChanged`を`ViewHolder`クラス内の`init`で定義することで、重複した定義を行わないようにする。
```ItemAdapter.kt
class ItemAdapter(var itemList: MutableList<String>) : RecyclerView.Adapter<ItemAdapter.ViewHolder>() {

	class ViewHolder(val binding: ListItemBinding) : RecyclerView.ViewHolder(binding.root) {
		var onTextChanged: ((String) -> Unit) = {}

		init {
			binding.editText.doOnTextChanged { text, _, _, _ ->
				onTextChanged(text.toString())
			}
		}
	}

	override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(ListItemBinding.inflate(LayoutInflater.from(parent.context), parent, false))

	override fun onBindViewHolder(holder: ViewHolder, position: Int) {
		holder.onTextChanged = {}
		holder.binding.editText.setText(itemList[position])
		holder.onTextChanged = {
			itemList[position] = it
		}
	}

	override fun getItemCount() = itemList.size
}
```

最後にメインレイアウトの処理。
```MainActivity.kt
binding.list.adapter = ItemAdapter((0..50).map { it.toString() }.toMutableList())
```

##### 参考サイト

https://stackoverflow.com/questions/68014665/recyclerview-edittext-data-loss-on-scroll
Salesforceでオブジェクトと項目の一覧を出す[Apex Script]

![Screen Shot 2022-08-03 at 17.28.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/acbe6b47-be84-7e3c-47a2-57ad13b7e86a.png)

![Screen Shot 2022-08-03 at 17.30.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/268801/5b261ad3-6311-82fa-1842-a8509929c771.png)

`開発者コンソール` → `Open Excecute Anonymouse Window`

```apex
Map<String, Schema.SObjectType> gd = Schema.getGlobalDescribe(); 
Set<String> standardObjects = new Set<String>();
Set<String> customObjects = new Set<String>();


System.debug('----START----');

System.debug('ObjectName, ObjectLabel, FieldName, FieldLabel');

for(Schema.SObjectType d : gd.values())
{
    Schema.DescribeSObjectResult ds = d.getDescribe();
    if(!ds.isCreateable())
      continue;
    
    
Map<String,Schema.SObjectField> mfields = ds.fields.getMap();
    for (String key : mfields.keySet()) {
        
        System.debug(
            ds.getName()
            + ', '
            + ds.getLabel()
            + ', '
            + mfields.get(key).getDescribe().getLabel() 
            + ', ' 
            + mfields.get(key).getDescribe().getName() );
    }
}

System.debug('----END----');
```
20年前の照明制御卓を延命治療！

## 製作会社も無くなってしまった公民館の照明卓！
フェーダも製造中止、友人が修理を受けたのですが、他界してしまい緊急バトンタッチ。
彼の意志を継いでハード修理だけの委託引継の現場になりました。
![nara.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/c29d9304-d1e1-f1b3-b44e-8670581ec5ae.png)
板金設計は終わっていましたが、基板を新規にこの卓のために設計製作、1日で交換できるように準備しました。
![DSC_1401.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/494ac94e-f5b5-4cbf-c05c-aaf52afe0b03.jpeg)

交換前の写真です
![DSC_1397.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/378482/f183eb96-d128-93c6-f7bd-ba7b6f951fc0.jpeg)
ファイルとは文書のこと

# ファイル管理とは
主記憶装置に記憶させるて電源を切ると中身が空っぽになる。
そんな時に補助記憶装置に覚えさせる。
しかし補助記憶装置の中は散らかっていてどっからどこまでが一つのデータなのか整理されていない。
コンピュータは```ファイル```という形でデータを管理する。
ファイルとはデータやプログラムを一塊にして名前をつけたもの。
```ディレクトリ```を使うことで整理整頓もできる。

## 気づき
補助記憶装置は整理をしてやらないとごちゃごちゃしてるんだな。
そのためのファイルとディレクトリなのか。
今回はファイルとディレクトリの違いが明確になるような気がする。

# ファイルとは文書のこと
```ファイル```はデータを一つの方m理として記録するtめに使う入れ物、単位をいう。
「```何番地から何番地までのデータを**という名前のファイルにする```。読み込むときはその単位で区切るようによろしく」

```独自のフォーマットのファイル形式```と言って、そのファイルを作成した```アプリケーションソフト以外では読み込めません```。
アプケーションソフト自体も、```普段はどこかにしまわれていないと使う時に呼び出せない```。
実は```アプリケーションソフトもプログラムというファイル形式```で補助記憶装置にしまわれている。

# データの種類と代表的なファイル形式
共通フォーマットとして広く利用されているファイル形式には
圧縮、不可逆、可逆という言葉がある。
```圧縮```とはデータサイズを小さく縮めること
```不可逆```とはその時にいくつか情報が欠けて戻せなくなること
```可逆```は不可逆と逆　、欠けずに戻る

## テキスト形式
文字コードと、改行やタブなど一部の制御文字のみで作られるファイル。
文字を扱うアプリケーションソフトであれば、全て読み書きできる。

## CSV形式
テキスト形式。
文字や数字をカンマ(,)で区切り、行と行をあらためて区切る。
表形式のデータを保存することに特化している。

## PDF
画像が埋め込まれた書類をコンピュータの機種やOSの種類によらず、元のお通りに左舷して表現することができる。電子文書のファイル形式。
文書配布時における標準的なフォーマットとなる。

## 画像用のファイル形式
### BMP（ビットマップ）
* 圧縮せずにそのまま保存するファイル形式。
* 画質は一切劣化しない。
* ファイルサイズは大きくなる。

### JPEG（ジェーペグ)
* 写真を保存するのに向いてる画像圧縮形式
* 圧縮率は高い
* フルカラーを扱える。
* ディジタルカメラで写真んを記録する用途
* 不可逆性
* 圧縮レベルに応じて画質が劣化する

### GIF(ジフ）
* イラストやアイコンなどの保存に適した画像圧縮形式。
* 可逆性
* 扱える色は２５６色まで

### PNG（ピング)
* フルカラーを扱える。
* 可逆性
* 圧縮しても画質の劣化がない。
* 単純な圧縮率ではJPEGの方が勝る

## 音声用のファイル形式
### MP3(エムピースリー）
* 音声を圧縮して保存するファイル形式。
* 人に聞こえない範囲の信号を削り落とす
* 不可逆性
* インターネットの上の音楽配信や携帯音楽プレーヤーなどで用いられる。

### MIDI（ミディ）
* 音声そのものではない。
* ディジタル楽器の演奏データを保存することができるファイル形式。
* このファイル形式を使うことでディジタル楽器を演奏させることができる。

## 動画用のファイル形式
### MPEG(エムペグ）
* 動画を圧縮して保存するファイル形式
* 不可逆性
* ビデオCDに使われるMPEG-1
* DVDに使われるMPEG−２
* インターネット配信や携帯d年わで使われるMPEG-4

## 気づき
いろいろなファイルの形式があるな。
それぞれの特性を知って扱っていくんだな。
範囲でファイルが区切られているのか。
どうやって圧縮しているのだろうか？

# マルチメディアデータの圧縮と伸張
画像や音声、動画などのマルチメディアデータは、そのまま保存すると膨大なデータ量になる。
そのためにデータサイズを小さくして保存するのが普通になる。
データを単純してくいく。
いかに```省略できる繰り返しを見つけるか```。
いかに```品質を保ったままデータを切り落とせるか```が大切

## 画像の場合
どのように表示されているかを頭に入れて省略できるところは省略する。
そうすることでデータ量が小さくなる。

## 動画の場合
時間軸に沿って各コマの変化があったとこだけをデータとして持つようになる。
人間には聞こえない高い周波数の音をバッサリ切り落とす。

## 圧縮されたものを開く
ファイルを開くときは、逆方向の伸張という展開作業を行なってデータを復元する。
伸張後も```厳密な意味の元と同じデータにはならない```。
このような圧縮方法を```不可逆圧縮```という。

## 気づき
元のデータの方が綺麗なんだな。
現物の方が優っているのか。

# 問題を解いた時の気づき
* BMPは静止画を取り扱うが圧縮しない。
## 回線とは?
 電信や電話などの信号が通る線。特に、電話をつなぐために張りめぐらされた線。
出典 https://kotobank.jp/word/%E5%9B%9E%E7%B7%9A-2212
### 気づき
電気通信はインターネット配信、携帯電話のことだったかな。
これでMPEG-4であることに気が付かなくてはならなかった。

出典 キタミ式イラストIT塾　基本情報技術者　令和03年
プログラム初心者が今何を学べばいいかさっぱりわからない時に役立つサイト

独学から早２年。

何事も最初は全体像を理解したいもので、私は理解するまで約１年かかりました。

これをもっと早く知っていれば...というサイトを紹介します。

https://roadmap.sh

このサイトからまたFrontendやBackend,Pythonなどといった学習に必要なロードマップが記載してあります。

このサイトのおかげで今、何が足りていないのかの認識や、必要な知識が身につきました。

ただ、初学者が見てしまうとあまりの膨大な知識の量に絶句してしまうかもしれません。

一度で全てを理解することは困難です。地道に理解を深めていきましょう＾＾
【Python】pyautoguiの画像検索範囲は必ずint型にすべし

**＜初めに＞**
pyautoguiを活用して、RPA化を粛々と行っていたが
急にpyautoguiの画像検索が出来なくなりエラー回避に１時間半費やしたので
今回はそのエラー履歴を残しておく

**＜エラーが発生した原因＞**
初めにエラー発生原因は、
pyautogui画像検索で画像検索範囲を絞る(ragion=target_range)を
使用しているのだが、target_rangeに入っている
画像検索範囲(left, top, weidh, height)の数値が「float型」だった為、
今回のエラーが発生した

**＜エラー文＞**
↓エラー文はこれ↓
```
例外が発生しました: TypeError
slice indices must be integers or None or have an __index__ method
```
このエラーを調べるとスライスがどうとか初歩的なものばかりで
pyautoguiに繋がるエラー回避方法は検索でヒットせず原因が分からなかった…

**＜今後＞**
今回は、画像検索範囲をcsvファイルで管理していたため
起こったエラーなので（読みだすときにfloat型になった）
今後は、csvファイルから読みだす際は必ずint型にしてから
画像検索範囲を設定しようと心に決めた。。。。（１時間半も無駄にしたのでね…）
**↓error文↓**
```
target_range = (0.0, 0.0, 1000.0, 700.0)

p = pyautogui.locateOnScreen('./test.png', grayscale=True, confidence=0.6, region=target_range)
x, y = pyautogui.center(p)
print(x, y)
```
**↓error回避文↓**
```
target_range = (0, 0, 1000, 700)

p = pyautogui.locateOnScreen('./test.png', grayscale=True, confidence=0.6, region=target_range)
x, y = pyautogui.center(p)
print(x, y)
```
Next.js v11.xプロジェクトにJestを導入する

# 概要

Next.jsの`v11.1.2`のプロジェクトにJestを導入しようとし、[公式ドキュメント](https://nextjs.org/docs/testing#setting-up-jest-with-babel)を見ながらパッケージインストールしようとしたら、パッケージの依存関係でハマったりしたので備忘録として残しておきます。  
基本的には

- [Next.jsの公式ドキュメント](https://nextjs.org/docs/testing#setting-up-jest-with-babel)
- [Next.jsのexamples/with-jestプロジェクト](https://github.com/vercel/next.js/blob/v11.1.2/examples/with-jest/package.json)
- [Jestの公式ドキュメント](https://jestjs.io/docs/27.x/getting-started)

を参照しているだけです。

# 導入

必要なパッケージのインストール以外の基本的な設定（`jest.config.js`のような設定ファイル内容）等は[Next.jsの公式ドキュメント](https://nextjs.org/docs/testing#setting-up-jest-with-babel)を参照してください。

## 必要パッケージのインストール

[Next.jsのexamples/with-jestプロジェクトのpackage.json](https://github.com/vercel/next.js/blob/v11.1.2/examples/with-jest/package.json)を参照し、バージョンを合わせて必要なパッケージをインストールしていきます。  
上記のリンクは`v11.1.2`のものですが、自身のプロジェクトのNext.jsのバージョンにあったものを参照してください。  
ESLintを使用している場合は`eslint-plugin-testing-library`といったプラグインのバージョンも合わせてインストールするのがよいでしょう。

## with TypeScript

TypeScriptを使用する場合は[Jestの公式ドキュメント](https://jestjs.io/docs/27.x/getting-started#using-typescript)を参照して下さい。

# Tips

## テスト実行時に`ReferenceError: global is not defined`というエラーが出る

[jest-environment-jsdom](https://www.npmjs.com/package/jest-environment-jsdom)パッケージをインストールすると解消されました。

> [Jest: ReferenceError: global is not defined](https://stackoverflow.com/questions/68278601/jest-referenceerror-global-is-not-defined)

# 参考文献

- [Setting up Jest (with Babel) -Next.js Docs-](https://nextjs.org/docs/testing#setting-up-jest-with-babel)
- [Getting Started -Jest Docs-](https://jestjs.io/docs/27.x/getting-started)
- [Jest: ReferenceError: global is not defined](https://stackoverflow.com/questions/68278601/jest-referenceerror-global-is-not-defined)
WSL2上にDockerをインストールする

## 概要
https://qiita.com/mj69/items/e1ba78d84e620789067c

上記でインストールしたWSL2上にDockerをインストールする

## 環境
Windows10
バージョン21H1(OSビルド19043,1826)

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 20.04 LTS"
VERSION_ID="20.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=focal
UBUNTU_CODENAME=focal
```

### 手順
1. 既存のパッケージのリストを更新
    ```
    $ sudo apt update
    ```

2. 必要条件パッケージをインストール
    ```
    $ sudo apt install apt-transport-https ca-certificates curl software-properties-common
    ```

3. 公式DockerリポジトリのGPGキーをシステムに追加
    ```
    $ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    ```

4. DockerリポジトリをAPTソースに追加
    ```
    $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
    ```

5. 追加されたリポジトリからDockerパッケージでパッケージデータベースを更新
    ```
    $ sudo apt update
    ```

6. Dockerをインストール
    ```
    $ sudo apt install docker-ce
    ```

7. Dockerを再起動
    ```
    $ sudo service docker stop
    $ sudo service docker start
    ```

8. 一般ユーザがDockerコマンドを実行できるようにGroupへ追加
    ```
    $ sudo usermod -a -G docker `whoami`
    ```

9. Groupへの追加を適用させるために再ログイン
    ```
    $ exit
    ```

10. インストール完了の確認
    ```
    $ docker version
    Client: Docker Engine - Community
     Version:           20.10.17
     API version:       1.41
     Go version:        go1.17.11
     Git commit:        100c701
     Built:             Mon Jun  6 23:02:57 2022
     OS/Arch:           linux/amd64
     Context:           default
     Experimental:      true

    Server: Docker Engine - Community
     Engine:
      Version:          20.10.17
      API version:      1.41 (minimum version 1.12)
      Go version:       go1.17.11
      Git commit:       a89b842
      Built:            Mon Jun  6 23:01:03 2022
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.6.6
      GitCommit:        10c12954828e7c7c9b6e0ea9b0c02b01407d3ae1
     runc:
      Version:          1.1.2
      GitCommit:        v1.1.2-0-ga916309
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    ```
vCenter Server 6.5 Update 3へのアップデート方法


本記事は[古いIBM CloudのVCS環境(vSphere 6.5ベース)を順次最新化してます](https://qiita.com/testnin2/items/1f8d157f9cf6bc4c5641)における作業の一環である。本作業では、`vCenter Server 6.5 Update 2g`から[VMware vCenter Server 6.5 Update 3t](https://docs.vmware.com/en/VMware-vSphere/6.5/rn/vsphere-vcenter-server-65u3t-release-notes.html) へのアップデートを実施する。


# 1. ISOイメージの入手
IBM CloudのsupportにCaseを起票して`VMware-vCenter-Server-Appliance-6.5.0.40000-19757181-patch-FP.iso`を入手する。
# 2. vCenterのスナップショットを取得する
（手順省略）
# 3. 更新用ISOイメージをvCenterのVMからマウントしておく
（手順省略）
# 4. `https://<vCenterのFQDN>:5480` にアクセスしてログインし、以下からマウントしたisoイメージを認識させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/fa3604cf-2bbf-b1c7-8fa5-b86365cde772.png)
# 5. Updateの実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8eb7f222-170b-64dd-490d-84927ea9020a.png)
# 6. Accept
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d087b159-9861-5c36-1f39-649db6651e50.png)
# 7. Install
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/8b9c19b5-5807-ad21-14a1-b1afe4f94618.png)
（インストール途中画面）![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/b122afaa-946c-4c2c-103e-cd81de48e6e3.png)
# 8. インストールが終わったらvCenterを再起動する。
# 9. vSphere Web Clientにアクセスしてログインする。
ちなみに、このままvCenterにアクセスすると以下のように文字化けが発生した。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/5b976937-b116-0a3d-6119-3b4f4adb2584.png)<br>ブラウザのキャッシュをクリアして再度アクセスすると問題なくアクセスできた。<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/583ad4b3-d665-97b5-ac6a-2b5ba2b98327.png)<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7587a3ba-78ea-9a68-d246-f35881c88fed.png)


```txt:CLIでのバージョン確認
Command> system.version.get
Version:
   Product: VMware vCenter Server Appliance
   Installtime: 2019-07-08T18:44:10 UTC
   Summary: Patch for VMware vCenter Server Appliance 6.5.0
   Releasedate: May 05, 2022
   Version: 6.5.0.40000
   Build: 19757181
   Type: vCenter Server with an embedded Platform Services Controller
```
集合について

・setの共通要素を取り出すには？
->&を使う。

・setに共通要素があるかどうかの判定は？
->集合1.isdisjoint(集合2)
で
Trueの場合：共通要素なし
Falseの場合：共通要素あり

複数人のカレンダーや時間を調整する際に役立ちそう。
【Xcode】プロジェクトからCocoaPodsを削除する方法

# はじめに
今回はこちらのプロジェクトからCocoaPodsを完全に削除します。
![スクリーンショット 2022-08-03 16.08.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8126bb0c-e47b-53a6-2c88-6da2da1dbfbf.png)

私はCocoaPodsからSPMに移行する際に使用しました。

# 方法
## ディレクトの移動
```:ターミナル
cd プロジェクトのパス
```
![スクリーンショット 2022-08-03 16.13.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/4c262b73-b1cd-85a4-0d66-9af2a7cfaef0.png)

## Podsフォルダの削除
```:ターミナル
pod deintegrate
```
![スクリーンショット 2022-08-03 16.13.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/9536d867-a052-f68b-a800-f2b487b1f70c.png)
「Pods」が消えました。
![スクリーンショット 2022-08-03 16.14.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/c09381cb-f2ba-99dd-2343-fc31929b1242.png)

## その他ファイルの削除
```:ターミナル
rm Podfile
rm Podfile.lock
rm -rf プロジェクト名.xcworkspace
```
初期の状態に戻りました。
![スクリーンショット 2022-08-03 16.16.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7a4e2c11-8d64-9d97-f605-c63280784593.png)

めでたし

# おわり
以下の記事がとても参考になりました。
ありがとうございます。

https://e-joint.jp/476/

https://qiita.com/Lulu34/items/cd1f9c3d7faa960dda50
git stashで特定ファイルのみを名前を付けてstashする

「git stash 特定ファイル」などと検索すると古い情報が多く引っかかるので自分用まとめ。

# 「特定ファイルのみ」を「名前を付けて」stash
``` bash
git stash push hoge.py -m "message"
```

- `git stash save` は非推奨になっています。
- メッセージは `-m` オプションで入れられます。

# 名前が不要なら
`git stash push` は `git stash` に簡略化できるので下記でもOKです。
この場合 `-m` でメッセージは入れられません。
```bash
git stash -- hoge.py
```
`git stash hoge.py` と書くと `hoge.py` がサブコマンドなのかどうか区別できないので、曖昧さを回避するために `--` を使うということらしい。
個人的には、素直に `git stash push` と書いたほうが分かりやすい。
jsの連想配列の順番が勝手に変わる

# 連想配列の順番が変わる
開発している時に連想配列の順番が勝手に変わることに気が付き、どういった場合に変わってしまうのかをまとめていきます。
結論として、jsではオブジェクトの並び順は保証されていないので、並び順を保持したい場合は配列で管理する必要があります。

以下の結果はchromeで流した結果です。
## 要素の追加
```js
let aa = {2: 2, 6: 6}
aa[3] = 3
aa["a"] = "a"
console.log("要素の追加", aa)
// => 要素の追加 {2: 2, 3: 3, 6: 6, a: 'a'}
```

## valuesまたはkeysを取得
```js
let bb = {3: 3, 5: 5, 1: 1}
console.log("bb", bb)
console.log('bbのvaluesを取得', Object.values(bb))
console.log('bbのkeysを取得', Object.keys(bb))
// => bb {1: 1, 3: 3, 5: 5}
// => bbのvaluesを取得 [1, 3, 5]
// => bbのkeysを取得 ['1', '3', '5']
```

## 連想配列の結合
``` js
aa = {2: 2, 6: 6}
bb = {3: 3, 5: 5, 1: 1}
console.log('結合', Object.assign(aa, bb))
// => 結合 {1: 1, 2: 2, 3: 3, 5: 5, 6: 6}
```

## 要素の削除
```js
bb = {3: 3, 5: 5, 1: 1}
delete bb[5]
console.log("要素の削除", bb)
// => 要素の削除 {1: 1, 3: 3}
```
オブジェクト指向はクラスを使ってます！ってことだと思う(多分)

Python, C++, javaなどなどオブジェクト指向プログラミング(OOP)ってのは入門書読んででよく出てくると思うんですがそれが基本的に
「ものを使ってなんとやら」
っていうのが書いてあって意味わからなくて寝るがオチだと思うんですね。
ただ何となくにはなりますがオブジェクト指向が何か分かった(気がする)ので書いてきます。

概要

とりまWikipedia大先生によると、オブジェクト指向プログラミングとは

「「オブジェクト」という概念に基づいたプログラミングパラダイムの一つである。」
-shorturl.at/cdOS3

多分ですがこれを一発で理解できるのは天才児だけだと思うので僕なりの理解をサクッと説明すると、

オブジェクト指向 = クラス使う

です。
クラスが何かは
https://qiita.com/leigadget/items/0e41b28f353b73d6cf53
でポケモン使って詳しく書いてるので端折りますが、ざっくりいうと量産するためのベースです。

でこれを多分オブジェクトと読んでて、これを使ってる言語はオブジェクト指向言語で、オブジェクト指向言語を使ってるするプログラミングがオブジェクト指向プログラミングです。
多分

間違ってたら指摘ください🙇‍♂️