OmniAICreator/Qiita-1.07M huggingface dataset:
継承

## はじめに
前回のオーバーライドに引き続き、続編という形で継承について簡単にまとめる。
- 前回の記事
 https://qiita.com/RammaruIshii/items/03b068a7f90b8b31df54

## 継承詳細
- 継承とは、親クラスの属性を引き継いで、新たなクラス（子クラス）を作ることである。
    - 継承「される」クラスを親クラス or スーパークラスと言い、継承「する」クラスを子クラス or サブクラスという。
- 親クラスで定義したプロパティやメソッドは子クラスで自動的に呼び出せる（インスタンス化時も同様）
- 定義の仕方 class 子クラス名: 親クラス名{}
```swift:Swift
//親クラス定義
class People {
    var name: String
    var age: Int

    init(name: String, age: Int = 10) {
        self.name = name
        self.age = age
    }

    func printStatus() {
        print("名前:\(name),年齢:\(age)")
    }

    //引数の型にこのクラスのPeopleを指定
    func greetPeople(other: People) {
        //ここでprintする引数otherは型として親クラスPeopleを継承しているため、Peopleに定義されているプロパティを参照できる
        print("\(name)は\(other.name)に挨拶をした。")
    }
}

//子クラス定義(Peopleクラスが親クラス)1
class Kotarou: People {
    //ここのオーバーライドで定義するinitは親クラスPeopleで定義したinitのこと。また、overridesしたinit(name: String, age: Int = 10)各々の引数の型は変更できない。
    override init(name: String, age: Int = 10) {
        //superを付けることで親クラスのinit（name: String, age: Int = 10）を呼び出した。
        //また、継承しているため、ageを指定しなくとも、ageはインスタンス化時に出力される。
        super.init(name: name)
    }
}

//子クラス定義(Peopleクラスが親クラス)2
class Tarou: People {
    //ここのオーバーライドで定義するinitは親クラスPeopleで定義したinitのこと
    //init(name: String, age: Int)の引数ageのデフォルト値を削除した。また、overridesしたinit(name: String, age: Int = 10)各々の引数の型は変更できない。
    override init(name: String, age: Int) {
        //superを付けることで親クラスのinit（name: String, age: Int = 10）を呼び出した。
        super.init(name: name, age: age)
    }
}


//親クラスのインスタンス化
//もちろん親クラスは通常通りinitでプロパティの値を初期化できる
let people = People(name: "勇気", age: 15)

//子クラスのインスタンス化１
let kotarou = Kotarou(name: "小太郎")

//子クラスのインスタンス化２
let tarou = Tarou(name: "太郎", age: 10)

//各々メソッドにアクセス
people.printStatus() //名前:勇気,年齢:15
//greetPeople()の引数otherの型はPeople型であるため、People型の値を入れる必要あり
people.greetPeople(other: tarou) //勇気は太郎に挨拶をした。

kotarou.printStatus() //名前:小太郎,年齢:10
tarou.printStatus() //名前:太郎,年齢:10

}
```

## おわりに
補足事項・ご指摘ある方はぜひコメントにてご指摘ください。

## 参考記事
[継承](https://tea-leaves.jp/swift/content/%E7%B6%99%E6%89%BF)
[Swiftでクラスを継承する方法](https://swift.tecc0.com/?p=275)



## 開発環境
- Xcode-13.4.1
- iOS13以降
Redmine5-stable系をCentOS8Clone系OSにインストールするAnsibleプレイブック作ってみた

## 概要

初めてのgithubでの公開です。
[Redmine5 stableをCentOS8 Clone系OSに自動インストールためのAnsibleプレイブック](https://github.com/yoheier/redmine-centos-ansible) 

タイトルの通り。
<font color="red">**※RockyLinux8とAlmaLinux8.3で動作確認が取れたので更新**</font>
[Redine.JP のインストールページ](https://redmine.jp/install/) にCentOS8にAnsibleでRedmine4系をインストール出きるプレイブックがあったので、便利だなーと思って使っていたのだけれど、

- Redmine5系が出ている
- そもそもCentOS8のサポート終わってる

等があったので、CentOS8-streamで動くか？ Redmine5系にできないか？　とおもっていじってみました。

結果、CentOS8-streamでも問題なく動くことはわかったのですが、Redmine5系にするにはどーするかなーということで、SVNで取得していたリポジトリのURLをgitからのRedhat5-stable取得に変更して動くか試してみたところ、ちょいちょい動いたので、ファーエンドテクノロジーさんのgithubのフォークをさせてもらって自分のgithubで公開してみました。

以下OSでの動作を確認しています
- CentOS8-stream
- Rocky Linux 8.6 (サポート終了予定日:2029年5月31日)
- AlmaLinux-8.3

ただし全ての動作確認なんかは当然できていませんので、
- 起動する
- ログインできる
- チケットが作れる
- プロジェクトが作れる
- ユーザを作って割り当てができる

くらいしか確認してません。

## 現状の変更点

- CentOS8-stream(11/11現在）でも動くことを確認（アップデートされるだろうから今後は知らない）
- Rocky Linux 8.6 での動作を確認
- AlmaLinux-8.3での動作を確認（8.6と8.7は無理だった）
- Redmine5 stableをインストールするように変更
- インストールしていたRubyが2.6.5だったので3.2.1に変更

そんな感じです。

## AlmaLinuxについて
AlmaLinuxもとりかかってみましたが、8.6 8.7とも、ミラーサーバのリポジトリがごちゃごちゃで、AppStreamのメタ情報が間違っていたりします。
また、"Development tools"グループインストールに失敗するのでどうしたものやら、です。

8.3でなんとか動かしていますが、リポジトリが公式にしか残ってなかったりとか面倒なので、RockyでいいならRockyのほうがおすすめですかね？

## 今後
gemのbundlerはアップデートした方がいいという記事を見たのですが、Rails使う時だけなのですかね？
あ、でもRedmineでもRailsつかってるな？

まあ動いているので2.3.7のままで。

**追記**
DBを選択できるようにしてみました。
[Ansibleプレイブックの実行ロールを条件分岐できないかな？　と思って調べてみた](https://qiita.com/yoheier/items/2e06c7db8ca223e4558c)

## 課題
ライセンス的な問題とかはよくわかっていないので、まずいことしてたらご指摘いただければ。

## 参考
[Redmine.jp インストールページ](https://redmine.jp/install/)

[ファーエンドテクノロジーさん、RedmineをCentOSに自動インストールためのAnsibleプレイブック](https://github.com/farend/redmine-centos-ansible) (github)
Google UXデザイン：ペーパーからデジタルワイヤーフレームへ

# はじめに

わたしが[Google UX Design Crtificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/1ed400d1-bbdf-302d-70be-3175620c3912.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/23aeb5b5-78f1-56fe-c0de-d306cd462f80.jpeg" width="500">

</details>

# デジタルワイヤーフレームに移行する前に

紙の上でワイヤーフレームを描くのは迅速かつ安価ですが、デジタルワイヤーフレームに移行すると、少し厄介なことが起こります。

そのため、デジタルワイヤーフレームに移行する準備ができたかどうかを判断するために、いくつかの質問を自分に投げかけるとよいでしょう。

#### 紙のワイヤーフレームは完成しているか？
完成とは、ワイヤーフレームで使用したい構造のアイデアがあることを意味します。

#### ワイヤーフレームに対するフィードバックを受け取ったか？
願わくば、この時点までに、ワイヤーフレームに対する同僚や上司からのフィードバックを受け取っていて欲しいものです。

#### 基本的な視覚的手がかりを考慮する準備ができているか？
色や画像はもっと後にならないと出てきませんが、デザインプロセスのこの時点では、ワイヤーフレームに含めるテキストの種類を変えることができます。

これらの3つの質問に「はい」と答えられるなら、紙のワイヤーフレームからデジタルワイヤーフレームに移行する準備はできていると思われます。

# デジタルワイヤーフレームに移行する際の留意点

#### 1 
まず、重要なテキストには、プレースホルダーのテキストばかりでなく、<font color="Teal">実際のコンテンツ</font>を使用します。

- 例えば、犬の散歩アプリの場合、犬の散歩仲間のリストの上に「お近くの犬の散歩仲間募集中」と書いて、それを明示します。
- また、ボトムバーでは、アイコンの下に実際のテキストラベルを記載して、それぞれのアイコンが何をするものなのかを明確にします。
- しかし、本文の大きな塊には、Lorem ipsumのようなプレースホルダーテキストを使用します。

#### 2
ワイヤーフレームに<font color="Teal">色や画像などの表現力を加えることを、今のところ控えるべき</font>だということです。ワイヤーフレームは、あくまでも機能性に重点を置くべきです。プロトタイプの制作に入るまで、表現力豊かなビジュアルを追加するのは待ってください。

# なぜ、デジタルワイヤーフレームに移行する？

デジタルワイヤーフレームでは、より細部にまで注意を払うことができます。

紙のワイヤーフレームのゴールは、あなたのアイデアをすべて紙に書き出すことでした。そして、それは乱雑であっても構わないのです。しかし、デジタルワイヤーフレームでは、構造を正しく理解することが重要です。つまり、デザインをよりすっきりさせるということです。

また、デジタルワイヤーフレームは、紙のワイヤーフレームよりも共有しやすくなっています。デジタルデザインへのリンクを共有することは、コピーして関係者に郵送するよりもずっと簡単です。
Visual Studio 2022 を17.5にアップデートすると、プロジェクトが読み込めなくなった


## ソリューションを開くとプロジェクトがロードに失敗しました
.net6のプロジェクトがロードできません

## プロジェクトの再ロードをするとエラーダイアログが出ました

SDK リゾルバー エラー: "SDK "Microsoft.NET.Sdk.Web" を解決しようとしているときに、SDK リゾルバー "Microsoft.DotNet.MSBuildSdkResolver" に失敗しました。例外: "Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadManifestCompositionException: マニフェスト 'microsoft.net.workload.mono.toolchain' [C:\Program Files\dotnet\sdk-manifests\7.0.100\microsoft.net.workload.mono.toolchain\WorkloadManifest.json] 内のワークロード定義 'wasm-tools' が、マニフェスト 'microsoft.net.workload.mono.toolchain.net7' [C:\Program Files\dotnet\sdk-manifests\7.0.100\microsoft.net.workload.mono.toolchain.net7\WorkloadManifest.json] と競合しています
   場所 Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver.ComposeWorkloadManifests()
   場所 Microsoft.NET.Sdk.WorkloadManifestReader.WorkloadResolver.Create(IWorkloadManifestProvider manifestProvider, String dotnetRootPath, String sdkVersion, String userProfileDir)
   場所 Microsoft.NET.Sdk.WorkloadMSBuildSdkResolver.CachingWorkloadResolver.Resolve(String sdkReferenceName, String dotnetRootPath, String sdkVersion, String userProfileDir)
   場所 Microsoft.DotNet.MSBuildSdkResolver.DotNetMSBuildSdkResolver.Resolve(SdkReference sdkReference, SdkResolverContext context, SdkResultFactory factory)
   場所 Microsoft.Build.BackEnd.SdkResolution.SdkResolverService.TryResolveSdkUsingSpecifiedResolvers(IList`1 resolvers, Int32 submissionId, SdkReference sdk, LoggingContext loggingContext, ElementLocation sdkReferenceLocation, String solutionPath, String projectPath, Boolean interactive, Boolean isRunningInVisualStudio, SdkResult& sdkResult)""  C:\BacklogGit\ZoomArchiveApi\ZoomArchiveApi\ZoomArchiveApi.csproj

何が.net7かといえば、プレビュー版のようです

## プログラムの追加と削除から、プレビュー版の.net7のライブラリ及びSDKを削除しました。

結果、問題なくロードできるようになりました
最新の.nwt7 SDKをインストロールすると、.net7のビルドもできるようになりました。
SyntaxError: Non-ASCII character '\xe6' in file

```python
SyntaxError: Non-ASCII character '\xe6' in file sample_001.py on line 2, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details
```

文字エンコードの定義をせずに、日本語を使った場合に出るエラー

日本語を扱うには、一番最初に文字エンコードの定義が必要

```py
# coding:utf-8
print("こんにちは")
```
nodeのバージョンアップをnodebrewで

nodeの今の主な用途としては
nodescriptなので、現在の１６でなにか困っていたわけではないですが、
最近はウェブ制作が多いので、
ちょっと黒い画面をさわろうと、
nodeをバージョンアップしてみることにしました。

インストールしたのはだいぶ前なのですが、
いろいろ忘れてしまっていたので、
メモとして残します。

## globalにインストール
まずはサクッと調べて出てくるのは、次のような感じ
`npm install -g n`
でも、うまく反映されなかったので、
pathのことを思い出して、確認。
`which node`

.nodebrew/という文字を見つけ、
nodebrewで管理していたのを思い出す。

## nodebrew
### nodebrewで使えるバージョンを確認す
`nodebrew ls-remote`
ずらっと並びました。
```
.1   v16.6.2   v16.7.0   v16.8.0   v16.9.0   v16.9.1   v16.10.0
v16.11.0  v16.11.1  v16.12.0  v16.13.0  v16.13.1  v16.13.2  v16.14.0  v16.14.1
v16.14.2  v16.15.0  v16.15.1  v16.16.0  v16.17.0  v16.17.1  v16.18.0  v16.18.1


v17.0.0   v17.0.1   v17.1.0   v17.2.0   v17.3.0   v17.3.1   v17.4.0   v17.5.0
v17.6.0   v17.7.0   v17.7.1   v17.7.2   v17.8.0   v17.9.0   v17.9.1   

v18.0.0   v18.1.0   v18.2.0   v18.3.0   v18.4.0   v18.5.0   v18.6.0   v18.7.0
v18.8.0   v18.9.0   v18.9.1   v18.10.0  v18.11.0  v18.12.0  v18.12.1  

v19.0.0   v19.0.1   

io@v1.0.0 io@v1.0.1 io@v1.0.2 io@v1.0.3 io@v1.0.4 io@v1.1.0 io@v1.2.0 io@v1.3.0
io@v1.4.1 io@v1.4.2 io@v1.4.3 io@v1.5.0 io@v1.5.1 io@v1.6.0 io@v1.6.1 io@v1.6.2
io@v1.6.3 io@v1.6.4 io@v1.7.1 io@v1.8.1 io@v1.8.2 io@v1.8.3 io@v1.8.4 

io@v2.0.0 io@v2.0.1 io@v2.0.2 io@v2.1.0 io@v2.2.0 io@v2.2.1 io@v2.3.0 io@v2.3.1
io@v2.3.2 io@v2.3.3 io@v2.3.4 io@v2.4.0 io@v2.5.0 

io@v3.0.0 io@v3.1.0 io@v3.2.0 io@v3.3.0 io@v3.3.1 
```

もう１８まで出ている😅
18の一番新しいのにすることにします。

### ローカルにインストール
今確認したのは、remoteにあるものなので、
それをローカルに一度インストールします。
`nodebrew install-binary v8.11.1`
最新版をインストールするならコレでもOK
`nodebrew install-binary stable`

ローカルにインストールされたか確認します。
`nodebrew ls`
```
v10.19.0
v12.18.0
v14.13.1
v14.15.3
v14.15.4
v14.16.0
v16.14.0
v18.12.1
```

### 使うバージョンを指定
`nodebrew use v18.12.1`
ターミナルを再起動して確認
`node -v`
無事完了

## バージョン管理できるものが便利
homebrewとかnodebrewとか
rubyだとrubenvとか。
バージョン切り替えできるもので
インストールしておくのがやはり便利です。

こちらの記事にお世話になりました。
https://qiita.com/kuriya/items/36ae29366df0b7c95dec
ありがとうございました！
【Laravel】Eloquentで1つのカラムの情報を取得

# はじめに
Eloquentで1つのカラムの情報を取得する方法について調べた際にいくつかの方法が出てきたので、取得した結果をまとめてみました。

# selectを使って取得
**取得方法**
```php
$name_data = CategoryModel::select('name')->get();
```

**結果**
```json
[{"name":"氏名"},{"name":"電話番号"},{"name":"性別"},{"name":"郵便番号"},{"name":"市区町村以下"},{"name":"都道府県"},{"name":"テスト"},{"name":"生年月日"}]  
```


# getを使って取得
**取得方法**
```php
$name_data = CategoryModel::where('chain_id', $request['chain_id'])
            ->get(['name'])
```

**結果**
```json
[{"name":"氏名"},{"name":"電話番号"},{"name":"性別"},{"name":"郵便番号"},{"name":"市区町村以下"},{"name":"都道府県"},{"name":"テスト"},{"name":"生年月日"}]  
```
selectを使って取得した場合と同じですね。
書く量が減るのでこちらの方がいいかもしれないですね！
# pluckを使って取得
**取得方法**
```php
$name_data = CategoryModel::where('chain_id', $request['chain_id'])
            ->pluck('name');
```

**結果**
```json
["氏名","電話番号","性別","郵便番号","市区町村以下","都道府県","テスト","生年月日"]
```

# 終わりに
以上、Eloquentで1つのカラムの情報を取得する方法とその出力結果について調べた結果でした。
【React・next.js逆引き】やりたいこと・知りたいこと記事まとめ

# この記事の目的・背景
[こちら](https://qiita.com/mido_jin/items/7d9a6adbb43cdb16b90b)のPython用の記事と同様に**React・Next.js関係**のまとめ的なものとして、筆者が１度調べた物をどんどん追加していきます。
重複が無いようには記載しますが、細かな部分で紹介する内容が異なっているが大元の情報（〇〇の仕方、など）が同様になっている可能性はあります。

# React
- ファイルのドラッグ＆ドロップ
    - react-dropzoneでファイルをページにドラッグ＆ドロップする
        - https://qiita.com/FumioNonaka/items/4ae1ccbfe609e1a10c4d
        - https://qiita.com/tak001/items/73d04d57bdcc57e81dd3#%E3%81%9D%E3%82%8C%E3%81%9E%E3%82%8C%E3%81%AE%E7%89%B9%E5%BE%B4%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6
- useStateでオブジェクトや配列の一部を更新する
    - https://amateur-engineer.com/react-usestate-object-update/
- タグを付ける
    - react-tag-input
        - https://mebee.info/2020/03/20/post-7225/#outline__4


# MUI(Material UI)
- MUI リファレンス
    - https://mui.com/material-ui/getting-started/overview/
- MUI アイコン
    - https://mui.com/material-ui/material-icons/
- AppBarを上部に固定する
    - https://zenn.dev/katagiriso/articles/4ced3f80611c49
- Material UI v5について
    - https://coders-shelf.com/materialui-v5/
- MUIで一覧画面を作成する（MUI v4）
    - https://qiita.com/m-oishi/items/6264fd2765736d874f9d#%E3%83%9A%E3%83%BC%E3%82%B8%E3%81%AE%E9%AA%A8%E7%B5%84%E3%81%BF%E3%82%92%E7%94%A8%E6%84%8F%E3%81%99%E3%82%8B


# Next.js
ローコード初心者で沼にハマったセキュリティエンジニアのメモ（元SE）

# 前置き
久しぶりの更新です。
最近はTryHackMeやHackTheBooxでひたすら修行していたので、全然更新してませんでした。
普段はセキュリティ診断（脆弱性診断やペネトレなど）やってますが、Office365を弊社でも使っている縁で、業務改善用にPowerAutomateくんを使おうとしたら、沼にハマってしまった次第です。

正規表現すら無いので、白目剥きながらOfficeScripts組んでました。
報告会とか被ってなくて良かった･･･

# ローコードくんへの所感と偏見
自由度がめっちゃ低くて、やりたい事が全然できない印象でした。
前述したように、正規表現するスクリプトもOfficeScript側で組みましたし、他の言語なら適当にクラス作るなりコレクション作ればすぐ出来そうな処理に四苦八苦しながらローコードと格闘してました。

# 参考文献
調べる中で特に有用な情報をいくつか挙げておきます。
とても参考になりました、ありがとうございます。

https://qiita.com/Satoshi_Yoshino/items/fa2062f0d26b3e679e4c

https://qiita.com/baku2san/items/05a3c10893069da453a8

https://qiita.com/mizukyf/items/d0bbbf834a28538ef58c

https://qiita.com/chihiro/items/eb8c7b2ceee5274a4a8f

https://maku77.github.io/js/array/loop.html

https://kokoroe.konomi.app/docs/office-scripts/regular-expression/
Qiita Night for STUDENTのイベントレポート

### これは何？
**QiitaNightforSTUDENT**で登壇者の方がアウトプットは理解を深めるのにも有効だし、就活において、企業に対して成長角度を示す大きな武器になるとおっしゃっていたので早速書いてみる。

### 登壇された企業
- [サイバーエージェント](https://www.cyberagent.co.jp/careers/special/students/tech/)
- [freee](https://jobs.freee.co.jp/newgrads/)
- [ユーザベース](https://www.uzabase.com/jp/careers/new-hope/)
- [ゆめみ](https://www.yumemi.co.jp/new_graduate)
- [エイチーム](https://ateam-group.snar.jp/index.aspx?id=Q_jSKECWGDs)

#### サイバーエージェント: エンジニア就活における武器作りについて
就活には武器が必要だけど、その武器としてアウトプットをすることってすごい有効だよねって話。

新卒に求められるのは、現段階での技術力よりも成長角度。
その成長角度や自分自身の興味・関心を示す上でQiitaみたいな場所でアウトプットするのはすごい有効的。
闇雲にアウトプットをするだけじゃなくて自分がしたいことの統一感みたいなものを持てると尚良い。

個人的に今回のQiita Nightで1番ためになった話だったのかなと思います。
これからアウトプットの習慣をつけていきたいので、とりあえずの目標はQiitaで100contribution<font color="red">s</font>!!

#### freee: エンジニアのキャリアパス
そもそもキャリアパスって何？
=> どんなエンジニアになりたいかとか、何がしたいかとか、そのためにどんな経験をするかとか..

一口にエンジニアと言っても、マネジメントよりだったりスペシャリストよりだったり、技術的なところで言えばフロントエンドなのかバックエンドなのかインフラなのかっていうようにかなり選択肢はたくさんある。
キャリアっていうのは梯子なのではなくジャングルジムみたいなもの。
愚直に上に登るだけでなく、横にいったり時には降りたり幅と深さのあるもの。その上で最終的に自分がどうなりたいかが大事。

自分なりのキャリアパスを想像してみて、志望する企業でそのキャリアパスを達成することができるのかという観点も大切だなと感じました。
面接をしていても「２年後３年後はどうなっていたいですか」みたいな質問を受けたりするので、将来的な設計をちゃんとしないとダメだなと感じた次第であります。

#### ユーザベース: マイクロサービスについて
マイクロサービスって何か知ってますか？ボクは知りませんでした。
端的にいうと全ての機能を１つのサービスに統合するのではなく、機能ごとにサービスを構成する。各々が独立している形態。
それぞれのサービスでは異なる言語やフレームワークを使うことができる。

https://www.lucidchart.com/blog/ja/monolith-vs-microservices

全然知らなかったけど、調べてみたら流行ってるっぽい。
こういう自分で勉強してるだけだと知識として入ってこないようなことを知れるのがトークイベントの醍醐味なのかなと思った次第であります。

#### ゆめみ: ゆめみの成長環境
Qiitaの有名人である無職やめ太郎さんがいらっしゃる企業ってことは知っていましたが、よく知りませんでした。
全員CEO制度とか給与自己決定制度とか有給取り放題制度とかめちゃくちゃユニークだし楽しそう!!

https://notion.yumemi.co.jp/

#### エイチーム: Hasura
ひたすらにHasuraでした。
話を聞くまではHasuraの名前も聞いたことがなかったので、触ってみたいと思います。

https://hasura.io/

### さいごに
ただ愚直に技術を研いでいくのではなく、こういうイベントとかに出てみて他の人の考えを吸収するめちゃくちゃいいよ!!
js alert comfirm，alert prompt，typeof，isNaN，!，条件(三項)演算子，getElementById 使い方

js alert comfirm の使い
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/b91d3b68-fc65-b7e3-2883-4352ac1aee4f.png)

js alert prompt の使い
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/26a72409-0fa4-9ecc-c351-5fd3d7918e31.png)
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/1d331c86-e188-fd31-fcbd-c534e135bb8b.png)
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/1d2bd385-c1f5-5708-4b65-d64cf6779651.png)

js document write の使い
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/3b4145f1-49e6-daa0-7dce-817a68d57741.png)
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/dd211f90-ef53-33c0-f2b1-7ebf87d7914e.png)


js typeof と isNaN の使い
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/7de979d1-ddea-2daf-c389-513885b8ffd5.png)　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/b074113d-0211-2c12-f5bb-0eec80a4eeff.png)
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/e4027de2-6f4e-c51b-ab42-c702c70cfc83.png)　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/063f54fb-649a-ff78-89cb-fb73399238ef.png)
　　　　　　　　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/4658f728-2d0d-dad0-20ce-494a5d67fb9e.png)　![imege.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/7117eae4-72be-a35b-bfe5-7f4947c27a02.png)

js　!　感嘆符 の使い
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/ae4ab236-0f23-f6bd-f6ce-8eb1c5fe1859.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/8cdb7a97-09bd-1795-0ba8-3e0243a13409.png)

js　条件(三項)演算子 の使い
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/6b2d48f3-1dfa-6133-d424-540de40498bb.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/d30f6268-0666-0743-d96b-cd00ef32afba.png)　![图片.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/0ff0ae88-e011-10cb-b465-099497227d6e.png)

js document getElementById の使い
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/2ad87bf3-3e2d-0954-d5f9-14cc90409912.png)
　　　　　　　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/9c0109e0-781d-af55-cdb7-117f80026198.png)　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2735439/a3348be9-dc07-cd3c-93ee-dc64513a7b89.png)
仮想マシンへの接続

●仮想マシンへの接続
■リモートデスクトップ接続（RDP)
Windows仮想マシンへの接続で使用する基本的な方法。既定ポート番号は3389。

■SSH接続
Linux仮想マシンへの接続に使用する基本的な方法。既定ポート番号は22。

■Bastion接続
PaaSサービスのBastionを用いて仮想マシンに接続する方法。仮想マシンのRDPやSSHのポート番号を外部に公開することなく、仮想マシンにたいする安全なリモートっ接続が提供される。
ポート番号は４４３。

組織のオンプレミスネットワークでは、リモートデスクトップ接続で使用されるポート番号3389が経路上のファイアウォールなどでブロックされている場合がある。
Bastion接続は、そのゆなネットワーク環境でのリモート接続手段で活用できる。
Bastion接続ではポート番号443が使用され、ブラウザーから仮想マシンに接続して操作が可能。

※Bastion専用のサブネットでは、サブネット名を「AzureBastionSubnet」、アドレス範囲のプレフィックスの値を/26以下にする必要がある。
Google Calender の返答を未返答に戻す Google App Script

# 目的

Google Calendar で1回出席にすると、シリーズで出席になってしまうことがあります。

そのときに Maybe で返答するとカレンダー上では縞々表示となり、自身にとって出席・欠席が一目で判断しづらいことがあります。

いっそのこと、未返答の状態に戻して、出席・欠席がわかりそうな段階で改めて返答をしたい。

ただ、Google Calendar の画面操作から未返答の状態に戻せないので、Google App Script でおこなう。

# Google App Script

- 先に `getCalendarIdByDate` を実行し、目的の予定 ID を取得
- その後、`clearCalendarStatus` で ID を指定して実行

```javascript:
var calendar = CalendarApp.getDefaultCalendar();

function getCalendarIdByDate() {
  // 年月日を設定 （月指定は 0 が 1 月なので、10 は 11 月です）
  var day = new Date( 2022, 10, 16);
  console.log(day);
  // 年月日で予定を取得
  var events = calendar.getEventsForDay(day); 
  for(let i = 0 ; i < events.length ; i++ ){
    // 予定の名前と ID を表示
    console.log(events[i].getTitle(),events[i].getId());
  }
}

function clearCalendarStatus() {
  // 予定 ID を指定
  const targetId = 'xxx@google.com'
  var event = calendar.getEventById(targetId)
  console.log(event.getTitle(),event.getId());
  // 予定を未返答の状態に戻す
  event.setMyStatus(CalendarApp.GuestStatus.INVITED)
  console.log('Done!');
}
```

# 参考

- [Class CalendarEvent  |  Apps Script  |  Google Developers](https://developers.google.com/apps-script/reference/calendar/calendar-event#setmystatusstatus)
- [指定した日時のDateインスタンスを作る | GRAYCODE JavaScript](https://gray-code.com/javascript/make-a-date-instance-with-specified-time/)
- [GASによるGoogleカレンダー操作方法まとめ(予定取得/作成/削除/追加/色など) | AutoWorker〜Google Apps Script(GAS)とSikuliで始める業務改善入門](https://auto-worker.com/blog/?p=4430)
- [Google Script Calendar Status Filter - Stack Overflow](https://stackoverflow.com/questions/48517271/google-script-calendar-status-filter)
はじめてのチーム開発でのGit (clone~pushまでの備忘録)

エンジニアとして1ヶ月が経ち本格的にGitを使い始めるので、自分への備忘録として残しておく。
リモートリポジトリのclone〜リモートリポジトリへのpushまでをまとめてみました。
（覚えてる範囲で...思い出したらまた書き足す。）

## リモートリポジトリのクローン

まずは、VSCodeのこの"リポジトリのクローン"をクリック！
![スクリーンショット 2021-11-01 23.23.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/f50010fb-2532-ef02-38df-df532c2c87bc.png)
入力項目に、欲しいリモートリポジトリ(Git-HubやGitLab)のURLをコピペ！
![スクリーンショット 2021-11-01 23.26.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/77954121-67e7-56f2-43fb-850ed8c60edf.png)
その後は、ユーザー名や、パスワードが聞かれるので入力する。※もしかしたらパスワードはアクセストークンを作成しなければならないかも？？
クローンが完了した後、心配性な私は一応

```Bash
git remote -v　
origin  https://github.com/ユーザー名/リポジトリ名.git (fetch)
origin  https://github.com/ユーザー名/リポジトリ名.git (push)
```

で確認！originでこの様に表示されていれば一先ずOK。

## ブランチの作成・切替
### ブランチの作成
```Bash
git checkout -b 作成したいブランチ名
```
これで新しいブランチが作成されるとともに、作成したブランチに切り替わります。
以下のコマンドで確認ができるかと思います！
```Bash
git branch
```
作成したブランチに「＊」が付いていればOKです！

### ブランチの切替
続いてブランチの切替です。ブランチの切替は以下のコマンドを入力します。
```Bash
git checkout 切替えたいブランチ名
```
これでOK！

## リモートブランチをローカルにcheckoutする
```Bash
git checkout -b ローカルで扱うブランチ名 origin/リモートにあるブランチ名
```
ここで1点、リモートのブランチにpushしたい場合、ローカルブランチの名前はリモートのブランチ名と合わせた方が良いかもしれない。

## リモートリポジトリにブランチを作成する
```Bash
git push -u origin ブランチ名
```

## コミットをする
コミットについては、
```Bash
git add .
git commit -m "コメント"
```
などありますが、私はVSCodeで行っているのでここら辺の記憶がなくなりました...
なのでVSCodeでの説明とさせていただきます。
VSCodeでのcommitについては、以下の様にコミットしたいファイルを確認し、「＋」ボタンをクリックする。
ちなみに全てのファイルを一括でコミットしたい場合は、変更のところにカーソルを持っていけば「＋」ボタンが出るので、それをクリックする。
![スクリーンショット 2022-11-12 13.33.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/5705df23-21d5-27af-76d0-be4f37504004.png)
「＋」ボタンをクリックするとファイルがステージング環境に上がる。
![スクリーンショット 2022-11-12 13.34.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2239673/b4367e63-130c-baca-263d-d146a7f2d694.png)
あとは、コミットボタンの上の入力欄にコミットメッセージを入力し、「コミット」ボタンをクリックする。
コミットできたか確認したい場合は、以下のコマンドをターミナルで実行してみてください。
```Bash
git log
```
ちゃんとコミットできている場合は、先ほどのコミットメッセージとコミットした日時などが出てくるはずです。
残るは、リモートリポジトリにpushするのみです。


## リモートリポジトリにpushする
```Bash
git push
```
これでOKです笑
リモートにブランチが作成されていなければ、[リモートリポジトリにブランチを作成する](#リモートリポジトリにブランチを作成する)を行ってください。

## 最後に
あとは、プルリクエスト(マージリクエスト)をしてコードレビューをしてもらいましょう！
また、余談ですが、プルリクエストが取り込まれたり、最新のリモートリポジトリをローカルに取り込みたい時は
```Bash
git pull
もしくは、
git pull origin リモートリポジトリ名
```
を、実行してください！
以上、ざっとですがリモートリポジトリのクローン〜pushまでをまとめてみました。
【python】list初期化の罠 

## 始めに
リスト型または辞書型のリストを作るとき、事前に要素数を決めて初期化する場合があります。  
例えば、``辞書型の要素6個のリスト``を作りたいときに、主に以下のやり方がありますが、場合によっては罠にはまります。
### 書き方１
```ruby:書き方１
list1 = []
for i in range(6):
    list1.append({"age":1})
print(list1)
```

### 書き方２
```ruby:書き方２
list2 = [{"age":1}]*20
print(list2)
```

上記書き方の出力は同じになります。
```ruby:実行結果
[{'age': 1}, {'age': 1}, {'age': 1}, {'age': 1}, {'age': 1}, {'age': 1}]
```
ただし、書き方２はバグの引き金になってしまう可能性があります。
下記を実行してみてください。
```ruby:listの1要素を変更
list2[0]["age"] = 9
print(list2)
```
結果は想定と違って、以下となります。1要素目だけでなく、全要素が更新されてしまったようです。
```ruby:実行結果
[{'age': 9}, {'age': 9}, {'age': 9}, {'age': 9}, {'age': 9}, {'age': 9}]
```
一方、
```ruby:listの1要素を変更
list1[0]["age"] = 9
print(list1)
```
結果は想定どおり、1要素目だけ更新されています。
```ruby:実行結果
[{'age': 9}, {'age': 1}, {'age': 1}, {'age': 1}, {'age': 1}, {'age': 1}]
```

## 原因
実は、書き方２で初期化したリストの要素は、すべて同一オブジェクトです。
検証：
```ruby:要素比較
print(list2[0] == list2[1])
print(list2[0] is list2[1])
```
実行結果
```ruby:実行結果
True
True
```
一方、list1の各要素はそれぞれ違うオブジェクトとなります。
```ruby:要素比較
print(list1[0] == list1[1])
print(list1[0] is list1[1])
```
実行結果
```ruby:実行結果
True
False
```

## 補足
初期化２を使ってバグを作ってしまったので、検証してみました。
ちなみに、当たり前ですが、id(list2[x])はすべて同じ値です。
is 演算子 is 何？

## はじめに
なんとなく使っていたのですが、理解を深めるために改めて調べてみました。
記載しきれていないこともあるのですが、自分がよく使いそうなところをまとめました。

## is演算子とは
左辺の変数が、右辺の型、もしくはパターンと互換性があるかチェックするもの。
`C# 1.0`からずっとあるがちょっとずつ拡張されているようです。
```.cs
// 型のチェック
int num = 10;
Console.WriteLine(num is int); // True
Console.WriteLine(num is long); // False
```

## パターンマッチングでのis
`C# 6`以前は型のチェックのみができたようですが、
`C# 7`になり様々な`パターン`と呼ばれるものとのチェックもできるようになりました。
パターンはいくつかあるのですが、中でも`型パターン`と呼ばれるものをよく使うかと思います。

### 型パターン
`C# 6`以前から使える型のチェックに加え、同時に変数の宣言もできるようになったものです。

型パターンを条件式で使用した場合には、変数のスコープが少し特殊になります。
括弧内のみで利用できるのが一般的かと思いますが、型パターンを利用すると、
変数を宣言した条件式を囲っているスコープ内で利用することができます。
```.cs
object obj = 10;
if(obj is int num)
{
    Console.WriteLine($"{num}です。"); // 10です。
}
else
{
    // 使えるが、代入しないとエラー
    num = 1;
    Console.WriteLine($"ここでも使えます：{num}です。");
}
// 上記ifかelseで一度以上代入されるのでここでは代入せずに使える
Console.WriteLine($"ここでも使えます：{num}です。");
```
これは、早期リターンで利用したいという要望が多かったために実装されたようです。
便利ですね！
```.cs
object obj = "moji";
if(!(obj is int n)){
    return;
}
// 以降なにか処理
Console.WriteLine(n);
```


## nullチェック
`null許容型`の場合は、nullかどうかもチェックされ、
違う型だった場合と同様に、`nullだった場合もFalse`と判断されます。
```.cs
// null許容型でnullになっている場合
int? num = null;
Console.WriteLine(num2 is int); // False
Console.WriteLine(num2 is long); // False

// null許容型でnullではない場合
int? num2 = 10;
Console.WriteLine(num2 is int); // True
Console.WriteLine(num2 is long); // False
```
逆に、nullかどうかのみチェックしたい場合は、以下のようにします。
`C# 9`以降では、`not`という否定パターンが追加され、null以外かのチェックもシンプルにできます。
```.cs
int? num = null;
Console.WriteLine(num3 is null); // True

// C# 9以降で実行可能
int? num2 = null;
Console.WriteLine(num2 is not null); // False
```


## C# 11以降では
ちなみに11月8日に、`.NET 7`が正式リリースされたようですが、
リストパターンなるものを使ってリスト内の各要素と一致しているかチェックできるようです。
```.cs
int[] list = { 1, 2, 3, 4, 5 };
        
Console.WriteLine(list is [1, 2, ..]);      // True
Console.WriteLine(list is [1, 2, .., 5]);   // True
Console.WriteLine(list is [1, 2, _, _, 5]); // True
Console.WriteLine(list is [2, ..]);         // False
Console.WriteLine(list is [1, 2, 3]);       // False
```


## 参考サイト
https://ufcpp.net/study/csharp/datatype/typeswitch/

https://ufcpp.net/study/csharp/start/st_scope/?p=3#declaration-expressions

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/is

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/type-testing-and-cast#is-operator

https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/operators/patterns#relational-patterns
おすすめvimrc

以下vimrc
```
set nocompatible

set incsearch
set hlsearch
set background=dark
set number
set hidden
set showcmd
set path=.,**


" findコマンドやeditコマンドでclassファイルが候補にでないようにする
" set wildignore=*.class

"コマンドの自動補完の設定
set wildmenu
set wildmode=longest,list

"タブを可視化する
set list
set listchars=tab:>-

"gg=Gでインデントを調整するための設定
set expandtab
set tabstop=2
set shiftwidth=2

"lightlineのための設定
set laststatus=2

filetype plugin indent on  

nnoremap <silent> <C-l> :<C-u>nohlsearch<CR><C-l>

nnoremap <silent> [b :bprevious<CR>
nnoremap <silent> ]b :bnext<CR>
nnoremap <silent> [B :bfirst<CR>
nnoremap <silent> ]B :blast<CR>

nnoremap <silent> [c :cprevious<CR>
nnoremap <silent> ]c :cnext<CR>
nnoremap <silent> [C :cfirst<CR>
nnoremap <silent> ]C :clast<CR>

" autocmd BufWritePost * call system("ctags -R")
```
vimrcの取り込み方法
https://omoon.hatenablog.com/entry/20071203/1196614395
SOLID原則とは？オブジェクト指向の威力がいまいちピンとこない人へ

本投稿は、以下の「新人エンジニアにすすめたい、あなたの勉強法をシェアしよう！ by Udemy Advent Calendar 2022」の2日目でもあります。というか、そのための記事です笑

https://qiita.com/advent-calendar/2022/udemy


去年2021年は3日目に投稿してました!

https://qiita.com/advent-calendar/2021/udemy


今回は勉強法のシェア、特に新人エンジニアということで、もし自分が1,2年目くらいにこのUdemy講座をみていたら色々なモヤモヤがすぅーと解決したのかな？と思い、紹介させていただきます。


# オブジェクト指向がいまいちピンとこない日々・・

クラスって？継承って？という、いわゆる構文や文法的なことは新人研修や独学でも書籍や実装しながら理解していけるのですが、「オブジェクト指向の威力？」というのがなかなかピンときませんでした。

「デザインパターン、あー、知ってる知ってる。クラス図とか見ても何となくわかるわかる」
でも設計や実装に落とし込もうとするとどうしても繋がらないことが多々あると思います。少なくとも自分はそうでした・・

この記事でお薦めする講座はつい最近見たのですが、是非1年目、2年目くらいの時に見てほしいなと思いました。
ただオブジェクト指向っぽく実装すれば良いのではなく、その必要性やコツみたいなのがとてもわかりやすいです。

講師が「ピーコック アンダーソン」とあったので、最初英語なのかな？と思ったら全然そんなことありません。２倍速でもわかりやすいし、あらためて勉強になりました。Udemyは基本２倍速で聞いて、わからない時は速度落とす感じが時間的にもお薦めです。

# そもそもSOLID原則とは？

SOLID原則という言葉自体を1年目とかで耳にするかどうか？は、研修や現場、身近な先輩次第な気もしますが。
そういう自分もSOLID原則を耳にしたのはだいぶ経ってからでした・・。早くに知っておけば。。

とはいえ、なかなか書籍とかサンプルを読んでもわかったようでわからないような。。


- S (Single Responsibility)　単一責任の原則
- O (Open-Closed)　オープン・クローズドの原則
- L (Liskov Substitution)　リスコフの置換原則
- I (Interface Segregation)　インターフェイス分離の原則
- D (Dependency Inversion)　依存性逆転の原則

どうですか？5つの原則を説明できそうですか？ソースを見た時に原則違反というか違和感に気づけそうですか？

では行ってみましょう！

# お薦め講座３選

この３講座でSOLID原則を学ぶことができます。講座の詳細は各ページに委ねますので、ここでは講座名とお薦め理由のみを。

各講座はC#を使った実装例ですが、C#に詳しくなくても何をしているか？はわかると思います。原則に沿わない実装をした時にどういうデメリットがあるのか？それを原則に沿う実装にしたらどうなるか？など、順を追ってとても細かく解説してくれているので、デメリットとメリットが分かりやすいです！

講座内でも必ずしも全てを原則通りにするべきとは言ってません。ただ、少なくとも前提知識として持ち、違和感に気がつくことができることが望ましいと思います。レビューの質もあがりますし、結果品質も上がると思います。

1年目の自分に見せてあげたかった・・笑

今回の内容に限りませんが、もしその時に理解できなくても、またしばらくしてから繰り返し見ることで確実に理解が深まっていくと思います。きっと勉強やこの業界はそういう世界なんだと思います。いつまでも繰り返しと継続ですね。

あと、講師の話し方の好みは主観にもよりますが、個人的にはとてもわかりやすかったです。

## オブジェクト指向の原則１：単一責務の原則とオープンクローズドの原則

https://www.udemy.com/course/objectfive1/

## オブジェクト指向の原則２：リスコフの置換原則と継承以外の解決方法

https://www.udemy.com/course/objectfive2/


## オブジェクト指向の原則３：依存関係逆転の原則とインタフェース分離の原則

https://www.udemy.com/course/objectfive3/

# ということで

Udemyを使ったことある人はわかると思いますが、頻繁にセールをやってますのでセール中に購入しましょう！
エンジニアの勉強に限らず自分への投資ですので、セール期間中に本数冊分と思ってポチってみるのも良いのではないでしょうか？もうすぐ冬休みも近いですし、他にも色々な講座があるので興味あるものを楽しく学ぶのが何よりお薦めですね。ピーコック アンダーソンさんの講座に「デザインパターン」の講座もあったので、クリスマスプレゼントに届くことを楽しみに待ってます。

エンジニアってアスリートに近いなって思います。練習（勉強）を怠ったら、本番（業務）での瞬発力や判断力が鈍りますし。日々の積み重ねあってこそだと思います。勉強を継続していくためにも、あまりハードルを上げすぎず、楽しみながらできる工夫も必要かなって思います。

時には書籍でカッツリ集中したり、Udemyで少し聞き流す感じで勉強してみたり、勉強会などに参加してお互いに刺激やモチベーションを分けあったり。

いずれにしても自分なりのルーティンを早めに確立することが大事だなって思います。
毎朝決まった時間に勉強するとか、寝る前に30分でもコードに触れるとか。スタイルは人それぞれあると思いますが、ルーティン化をお薦めします。

# さいごに

新人プログラマを応援するというと上から目線な感じがしますので、頑張ってくださいとは言いませんが、自分もみなさんと一緒に勉強に励んでいきたいと思います！だって、楽しいから。そして未だにわからないことだらけなので笑
【MySQL】CSVファイルをDBにインポートする

# 目的
MySQLにCSVファイルをインポートするときに少々躓いたので、解決方法を備忘録として投稿します。

## 流れ

- データベース、テーブル、ユーザーを作成
- 権限の確認と付与
- CSVファイルのインポート
- 躓いた箇所
- 解決策

## 作成
### データベースを作成

```sql 
create database coffeetypes;
```
### テーブルを作成
```sql 
create table testtable (
    store_name varchar(50) primary key,
    address varchar(50) not null,
    postal_code varchar(50)
);
```
### ユーザーを作成
```sql 
create user test@localhost identified by 'test0000';
```

## 権限
### 権限を付与
```sql 
show grants for test@localhost;
```
この時点では作成直後のためなにも権限は付与していない
```sql 
+------------------------------------------+
| Grants for test@localhost                |
+------------------------------------------+
| GRANT USAGE ON *.* TO `test`@`localhost` |
+------------------------------------------+
```

下記のコードですべての権限を与える
```sql
grant all on *.* to test@localhost;
```

## CSVファイルのインポート
### ユーザーを切り替える

先ほど作成したユーザーに切り替えて、CSVファイルのインポートを行う

```sql
load data local
    infile 'C:/Users/Users/Documents/Programming/Java/DB/javalesson/locationDoutor.csv'
    into table coffeetypes.testtable
    fields
    terminated by ','
;
```

入力をするとこのようなエラーが発生する

```sql
ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.
```

DeepLに聞いてみた
```
エラー 2068 (HY000)。LOAD DATA LOCAL INFILE ファイルリクエストは、アクセス制限のため拒否されました。
```


ぼく「権限与えたのにアクセス制限あるのか」


## 解決策
### エラーの原因を探る

MySQLのログイン時にオプションでローカルの入力ファイルを許可する必要があり、オプションの書き方は以下2通りある
```
--enable-local-infile
--local_infile=1 またはon
```

今回は上記の`--enable-local-infile`を検証する

### 一度ログアウトし、再度インポートを試みる

```terminal
mysql -u test -p --enable-local-infile
```

先程と同様に入力

```sql
load data local
    infile 'C:/Users/Users/Documents/Programming/Java/DB/javalesson/locationDoutor.csv'
    into table coffeetypes.testtable
    fields
    terminated by ','
;
```

結果
```sql
Query OK, 300 rows affected (0.04 sec)
Records: 300  Deleted: 0  Skipped: 0  Warnings: 0
```

できた！

# 結論

- csvファイルをインポートするときはログイン時に`--enable-local-infile`を忘れない

# 参考資料

- [MySQL ユーザを作成して権限を設定・削除する](https://qiita.com/miriwo/items/899c06fdc91beb2f6d62)
- [【MySQL】csvファイルをDBにインポートする方法](https://qiita.com/oden141/items/239a7ce3cfe3197a3ba7)
- [MySQL – CSVファイルのインポートでエラー](http://taustation.com/mysql-csv-file-import-error/)
Hasuraの後ろのHerokuのPostgresqlの無料枠が切れるのでNeonに切り替えたメモ

## 概要
2022/11/28をもって、HerokuのPostgresの無料枠がなくなる。
HasuraのバックエンドとしてHerokuを使っていたので、代替となるものを探して引っ越しする。

[ワンコイン/月で作るゲームブックプラットフォームの使用技術メモ](https://qiita.com/hibohiboo/items/123633cd0ba829ff4d89)
## 候補選択
[サヨナラHeroku 〜アプリケーションの知識だけで本番稼働を実現できる無料のプラットフォームを追い求めて〜][*1]を観ながら、Hasuraで使えそうなものがないか探した。

候補|検討|印象
--|--|--
[Rener.com][*2]|[無料プラン](https://render.com/docs/free#free-web-services)ではPostgresqlが90日しか使えない|x
[Fly.io][*3]|[Heroku から移行](https://fly.io/docs/postgres/getting-started/migrate-from-heroku/)の手順があるが、自分でDBの管理が必要|△
[Railway][*4]|[Hasuraとの連携記事あり][*5]。[月5ドル](https://docs.railway.app/reference/accounts#billing)まで無料とあるが、Unverifyのgithubアカウントだと2ドルの体験枠しかもらえなかった。|△
[CockroachDB serverless][*6]|[Hasuraとの連携記事][*7]あり。無料枠は[5Gのストレージと250M/月のリクエスト][*8]|o
[Neon][*9]|HasuraからFreeで選択可能。10GB制限。[テクニカルプレビュー中の無料枠](https://neon.tech/docs/reference/technical-preview-free-tier/)。※無料枠はプレビュー後も存在予定。[herokuからの移行ガイドあり](https://neon.tech/docs/how-to-guides/import-from-heroku/)|o

## Neonで作ってみる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/cb1cf048-ce9e-92ac-df62-860929b9d5d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/7e823b89-b0ed-0b08-a923-9ca64cf42110.png)

メールアドレスで認証を問われるので、承認。
少し待つと、準備が完了する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9413236f-6f53-bbbb-9b95-c01cb5055ad7.png)
## 準備完了後、Herokuの接続を削除
HerokuのデータベースはRemoveする。
このとき、エンドポイントを作っていたりすると削除に失敗する。
先にエンドポイントを削除してからにすること。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/cd6a695d-a727-ae84-6cf5-4d4c998f4275.png)


## Railwayの体験枠についてメモ

Github連携したら2ドル制限となったログ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/e398bd2a-e27d-999c-381f-56da0d3ae949.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/9cf97f91-735e-9850-3e15-44ec9cd58f51.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/3e39dd08-c288-6ff3-a2e0-2a9f64b6dced.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/47b6739d-3364-e741-c9e3-46828b4181e8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99876/3adce992-8c8c-c35d-9272-2f6e296e0960.png)

## 参考
[サヨナラHeroku 〜アプリケーションの知識だけで本番稼働を実現できる無料のプラットフォームを追い求めて〜][*1]
[Node-RED実行環境としてHerokuの代替え先について検討してみた](https://qiita.com/kitazaki/items/970a10cbd1059c89aca5)


[*1]:https://zenn.dev/imah/articles/a41e889dbf54da
[*2]:https://render.com/docs/deploy-hasura-graphql
[*3]:https://fly.io/docs/
[*4]:https://docs.railway.app/databases/postgresql
[*5]:https://railway.app/new/templates/hasura
[*6]:https://www.cockroachlabs.com/
[*7]:https://hasura.io/docs/latest/databases/postgres/cockroachdb/getting-started/cloud/
[*8]:https://www.cockroachlabs.com/pricing/
[*9]:https://neon.tech/docs/cloud/about/
【初学者向け】useStateでobjectの中にあるobjectの値の更新

## はじめに
Reactを触っていく中で、objectの中にあるobjectへの値の更新の仕方で詰まったので、
備忘録として残すとともに、何かの参考になれば幸いです。

## サンプルコード
例として、以下のコードを使用する。
- 登録ボタンがクリックされたらonClickが実行される。
- person.nameをTaroに変更する。
- person.detail.hobbyをプログラミング、TVゲームという値に変更する。
- 変更された値を画面に表示する。
```React
interface Person = {
  name: string;
  age: number;
  detail: {
    birthday: string;
    hobby: string[];
  };
}
const basePerson: Person = {
  name: '',
  age: 0,
  detail: {
    birthday: '',
    hobby: [],
  },
};

export const Sample: FC = memo(() => {
  const [person, setPerson] = useState<Person>(basePerson);

  const onClick = () => {
    const newHoby = ['プログラミング', 'TVゲーム'];
    setPerson((prevState) => ({ ...prevState, name: 'Taro' }));
    setPerson((prevState) => ({
      ...prevState,
      detail: { birthday: person.detail.birthday, hobby: newHoby },
    }));
  };

  return (
    <Container maxW="100%">
      <Button colorScheme="teal" onClick={onClick}>
        登録
      </Button>
      <p>{person.name}</p>
      <p>{person.detail.hobby}</p>
    </Container>
  );
});
```
## 解説
通常のobjectの要素を更新する際は、
```React
 setPerson((prevState) => ({ ...prevState, name: 'Taro' }));
```
の様に、現在のstateを関数で渡し、要素を更新する。

しかし、detail要素の様に、objectの中にあるobjectの要素を更新する場合は、
```React
setPerson((prevState) => ({
      ...prevState,
      detail: { birthday: person.detail.birthday, hobby: newHoby },
    }));
```
の様に、現在のstateを展開した後、 
`detail: { birthday: person.detail.birthday, hobby: newHoby },`
と、objectの要素を書き出さなければならない。(もっといい書き方があるかもしれないが...)

また、以下のように、stateを関数で渡さない場合、2回目のsetが行われた時点で、1回目にsetした「Taro」の値が消されてしまうので注意。
```React
 setPerson({ ...person, name: 'Taro' }); // 1回目のset
 setPerson({ // 2回目のset
    ...person,
    detail: { birthday: person.detail.birthday, hobby: newHoby },
  });
```
UnityのiOSビルドで、Xcodeでprovisioning profile設定しているのにしていないエラーが出るときの対応方法

おまじないのような対応方法です・・・。

# エラー
UnityでiOSビルドして、Xcodeで開いて、いざ実機で実行しようとしたら出たエラー。

```text
Showing All Messages
"Unity-iPhone" requires a provisioning profile. Select a provisioning profile in the Signing & Capabilities editor.
```

![Unity-iPhone_—_Unity-iPhone_xcodeproj_と_SampleScene_-_arkitstream-sample_-_iOS_-_Unity_2021_3_0f1__Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/58f49d41-9974-83bf-d086-a8983128a9a9.png)

Xcodeで見直してみても設定している。
どうすればと思っていたら・・・。

# 対応方法
Unityでおまじないのように設定入れるとなぜかうまくいく
これでもうまくいかなったら、Signing Team ID も設定してみてください。
それでうまくいくときもありました・・・。

![SampleScene_-_arkitstream-sample_-_iOS_-_Unity_2021_3_0f1__Metal_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506075/9ae48238-21be-fcd9-9e25-42b75a145a80.png)
OpenCV で 16bit/pixel グレイスケール画像を 8bit/pixel にする

OpenCVでの16bit画像、しかも値に偏りのある場合の、8bitノーマライズの仕方メモ
C++, Python でそれぞれについて
ここでは、1CH（グレースケール）の話


各画素の値分布がこんな感じのとき、普通にやると真っ暗な画像になってしまう。
また定数でやらないとノイズで動画がチラつく。

![2022-11-11_22h46_36.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/488658/4de13897-6704-3655-ea3f-c2019f0ab348.jpeg)

その16bit画像が「0x0000が真っ黒/0xFFFFが真っ白」というわけではなく、こんなときにやるノーマライズ

* 実際は12bitまでしか使っていない
* 最低値が0じゃない
* N以下/M以上はノイズ

## その画像のシェイプを確かめる

### C++ シェイプ確認

```cpp
// 型: cv::Mat
cout << frame.rows << ", " << frame.cols << ", " << frame.channels() << endl;
// → HEIGHT, WIDTH, 1
cout << frame.type() << endl;
// → 2 (つまりCV_16U)
```

### Python シェイプ確認

```python
# 型: numpy.ndarray
print(frame.shape)
# → (HEIGHT, WIDTH, 1)
print(frame.dtype)
# → uint16
```

## 普通のノーマライズ

今回はこの仕様で困ったわけだが、何も考えずに[cv2.imshow()](https://docs.opencv.org/4.x/d7/dfc/group__highgui.html#ga453d42fe4cb60e5723281a89973ee563)すると、単純に256で割られたノーマライズで表示される。

> If the image is 16-bit unsigned, the pixels are divided by 256. That is, the value range [0,255*256] is mapped to [0,255].

これは、次のやり方と同じ。
従ってこれらは`cv2.imshow()`するためにはやる必要のないことたち。

### C++ 普通のノーマライズ

```cpp
src.convertTo(dist, CV_8UC1, 1. / 256.);
```

### Python 普通のノーマライズ

```python
dist = (src/256).astype('uint8')
```

## min/maxを指定したノーマライズ

ちなみに下記でmin/maxを入れ替えると白黒反転する。

### C++ min/max指定ノーマライズ

```cpp
const int MIN = 200;
const int MAX = 1200;

cv::Mat dist;
double alpha = 256. / ((double)MAX - MIN);
double beta = alpha * -1. * MIN;
frame.convertTo(dist, CV_8UC1, alpha, beta);

cv::imshow("normalised frame", dist);
cv::waitKey(1);
```

### Python min/maxノーマライズ

```python
MIN = 200;
MAX = 1200;

alpha = 256.0 / (MAX - MIN)
beta = alpha * MIN * -1
dist = cv2.convertScaleAbs(frame, alpha=alpha, beta=beta)

cv2.imshow("normalised frame", dist)
cv2.waitKey(1)
```

## min/max 動的に決めるノーマライズ

その画像中のmin/maxを取得するのが自然っぽいが、ノイズの影響を受けまくる。
冒頭のような、ノイズが存在する画像の動画だと、チラつきが気になってしまう。

やるなら、動画中でmin/maxあまり振れすぎないようするか、平均/標準偏差(`cv::meanStdDev`)を取得してmin/max決定するのがよさげ。

ちなみに「画像中のmin/max」で正規化する、そのやり方

```cpp
    double min, max;
    cv::minMaxLoc(frames[1], &min, &max);
    alpha = 256. / (max - min);
    beta = alpha * -1. * min;
    frames[1].convertTo(dist4, CV_8UC1, alpha, beta);
```

は

```cpp
    cv::normalize(frames[1], dist1, 0., 255., cv::NORM_MINMAX, CV_8UC1);
```

が同じことをしているのでこれでいい。
macを買い替えたり、brewが壊れたりしてbrew自体を最初から入れないしたいときに再度入れておきたいライブラリ等

## brew 

個人のPC汚したくないからコンテナ内でinstallすればいいじゃないかという話は置いといて、phpやcomposerやyarnやnodeなどのライブラリの導入管理をするためのツール。nodeを管理するための`n`も`brew`で導入できる。
macユーザー必須のパッケージ管理ツール。

https://brew.sh/index_ja


```bash
% /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```

バージョン等確認。

```
% brew info
54 kegs, 19,016 files, 695MB
% brew -v
Homebrew 3.6.10
Homebrew/homebrew-core (git revision b3600170839; last commit 2022-11-11)
Homebrew/homebrew-cask (git revision a7fa89f029; last commit 2022-11-11)
```

## php

install可能バージョン検索。

```
% brew search php
==> Formulae
brew-php-switcher   php-cs-fixer        php@7.3             phpbrew             phpmyadmin          pcp
php                 php-cs-fixer@2      php@7.4 ✔           phplint             phpstan             pup
php-code-sniffer    php@7.2             php@8.0             phpmd               phpunit

==> Casks
eclipse-php                    phpstorm                       phpwebstudy                    pop
```

```
% brew install php@7.4
```

バージョン等確認。

```
% php -v
PHP 7.4.33 (cli) (built: Nov  6 2022 15:12:45) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.33, Copyright (c), by Zend Technologies
```

`usr/local/bin/php`は、brewによってinstallされた`/usr/local/Cellar`配下にある対象のphpライブラリのエイリアスであり、これが実体。
```
% type php
php is /usr/local/bin/php
% ll /usr/local/bin/php
lrwxr-xr-x  1 masayagoto  admin  32 11 11 16:54 /usr/local/bin/php -> ../Cellar/php@7.4/7.4.33/bin/php
```

## composer 

install後、非推奨表示がでるのでupdate

```
% brew install composer
% composer self-update
```

バージョン確認。

```
% composer -V
Composer version 2.4.4 2022-10-27 14:39:29
```

## n

nodeのバージョン管理ツール。

```
brew install n
```

n自体のバージョン確認。

```
% n -V
v9.0.1
```

## node

ホストOS（コンテナ外）には入れたくない人が多数かもしれないが、creative-timやgithubなどから取得したテンプレートを確認したいときローカルに`yarn install`や`yarn serve`が必要だったりするのでローカルに入れておくと便利。
テンプレートを確認するためだけにnodeコンテナを立てたりするのは現実的ではないと思っている。

https://www.creative-tim.com/product/vuetify-material-dashboard-pro

![スクリーンショット 2022-11-11 22.46.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/125469/b0efa32d-74d6-f97e-9169-9da056ed8681.png)

```
% sudo n lts
```

バージョン確認。
フロント周りのビルド系はnodeのバージョンが最新すぎるとビルドエラーが起きたりすることがよくある。
プロダクトにあったnodeのバージョンを`n`で切り替えよう。

```
% node -v
v16.18.1
```

## おまけ

20221111現在、私がbrewでinstallしているパッケージ等。

```
% brew list
==> Formulae
aom			ca-certificates	giflib		libavif		libtool			oniguruma	rtmpdump
apr			composer		gmp			libidn2		libunistring	openexr		sqlite
apr-util	curl			highway		libnghttp2	libuv			openldap	tidy-html5
argon2		fontconfig		icu4c		libpng		libvmaf			openssl@1.1	unixodbc
aspell		freetds			imath		libpq		libzip			pcre2		webp
autoconf	freetype		jpeg-turbo	libsodium	lz4				php			xz
brotli		gd				jpeg-xl		libssh2		m4				php@7.4		yarn
c-ares		gettext			krb5		libtiff		n				readline	zstd
```
【Git】git-diffにフィルターをかける方法

## はじめに

`git diff`の実行結果にフィルターをかけ削除したファイルリストなどを取得する方法について記載します。  

## 方法

以下のように実行することで`git diff`にフィルターをかけられます。  

```zsh
git diff --diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]
```

`--diff-filter`に設定できるフィルタリング文字の意味は以下のとおりです。  

| 文字  | 意味                                                               |
| :---: | :----------------------------------------------------------------- |
|   A   | 追加                                                               |
|   C   | コピー                                                             |
|   D   | 削除                                                               |
|   M   | 変更                                                               |
|   R   | 名称変更                                                           |
|   T   | タイプ（通常ファイル、シンボリックリンク、サブモジュールなど）変更 |
|   U   | マージ解除                                                         |
|   X   | 不明                                                               |
|   B   | ペアリング解除                                                     |

以下のように実行すると削除されたファイルのみのリストを取得できます。  

```zsh
git diff --name-only --diff-filter=D
```

逆に削除されたファイル以外を除外したい場合には`D`を小文字にします。  

```zsh
git diff --name-only --diff-filter=d
```
【Docker】コンテナ内の環境変数を外部ファイルに書く

# 結論
`env_file`でファイルを指定する。
環境によって変わるものだけ外部にまとめようかと思ったけど、`environment`とは併用できなかったので`env_file`か`environment`どちらかのみっぽい。

```yml:docker-compose.yml
services:
  web:
    env_file:
      - ./env/web.env
```

中身

```web.env
FLASK_APP=flaskr
FLASK_DEBUG=1
API_KEY=abcd1234
```

# 確認
コンテナ内でコマンドを実行して`web.env`に書いた変数が出ればOK。
`export`は環境変数を出力するLinuxのコマンド。

```cmd:cmd
docker exec -it CONTAINER bash
export
```
Workbooks(.Open)場合分け

Workbookあたりの書き方備忘録。
```vba
Workbooks("ブック名.xlsm")'OK
Workbooks("ブック名、フルパス.xlsm")'NG

Workbooks.Open("ブック名.xlsm")'NG
Workbooks.Open("ブック名、フルパス.xlsm")'OK
```
ちょっと手こずったので。
PythonでGtkBuilderScopeを使う

[以前、「`GtkBuilderScope`はどのように使えばいいんだ！？」](https://qiita.com/katsuko0303/items/7eba4a0b0b070f38774b#gtkbuilder%E3%81%AE%E3%82%B7%E3%82%B0%E3%83%8A%E3%83%AB%E5%87%A6%E7%90%86)と言っていて、結論は「別に使わなくていいや」という事になりましたが、別の話で資料を漁っていたらサンプルが見つかったので、せっかくなのでメモっておきます。

https://gitlab.gnome.org/tallero/listview-example

https://gitlab.gnome.org/tallero/listview-example/-/blob/master/src/list_item_box/list_item_box_factory_scope.pyx

要は話は簡単、`GtkBuilderScope`を継承した自作クラスを作ればいいわけです。
まぁそのぐらいは検討つけていたけど、`create_closure`の戻り値は`GClosure`なんだけど、Pythonの場合どうすればいいの？という点が悩みどころだったのだけど、callableオブジェクトを返せばいいらしい。
(上記の例では`functools.partial`を使っているけど、なんの意味があるのだろう？使わなくても問題なさそうなんだけど…)

```python
# coding: utf-8

import sys
import gi
gi.require_version('Gtk', '4.0')
from gi.repository import Gtk, GObject

class MyBuilderScope(GObject.GObject, Gtk.BuilderScope):
	__gtype_name__ = 'MyBuilderScope'

	def do_create_closure(self, *args):
		print('do_create_closure(): args = %s.' % repr(args))
		return self.func

	def func(self, *args):
		print('func: args = %s.' % repr(args))

ui = '''
<interface>
	<object class="GtkWindow" id="window">
		<child>
			<object class="GtkButton" id="button">
				<property name="label">Push</property>
				<signal name="clicked" handler="on_clicked" />
			</object>
		</child>
	</object>
</interface>
'''

def on_activate(app):
	builder = Gtk.Builder()
	builder.set_scope(MyBuilderScope())
	builder.add_from_string(ui)

	window = builder.get_object('window')
	window.set_application(app)
	window.show()

if __name__ == '__main__':
	app = Gtk.Application()
	app.connect('activate', on_activate)
	sys.exit(app.run(sys.argv))
```
Javascript XrmServiceToolkit.Rest.Retrieve

	    //＜パターン1＞ 個別項目取得
		var lookupFieldValue = Xrm.Page.getAttribute("new_lookupName").getValue(); //画面からLookup項目値取得
		XrmServiceToolkit.Rest.Retrieve(
		    lookupFieldValue[0].id, "dsh_entityNameSet",
		    "new_field1","new_field2","new_field3",
		    null, function (result) { entityName = result }, XrmServiceToolkit.Common.ShowError, false);
		    
			var field1 = entityName.new_field1 != null ? entityName.new_field1.Value : null;
			var field2 = entityName.new_field2 != null ? entityName.new_field2 : null;
			var field3 = entityName.new_field3 != null ? entityName.new_field3 : null;
	    
	    
	    //＜パターン２＞ 全量データ取得
		if (entityGuid != "") {
			//オブジェクト取得
			XrmServiceToolkit.Rest.Retrieve(entityGuid, "dsh_entityNameSet", null, null, function (result) { entityName = result; }, XrmServiceToolkit.Common.ShowError, false);

			//定期成約
			if (!IsNull(entityName.new_optionSetfield1)) {
			    var optionValue = entityName.new_optionSetfield1;
			    var varible1 = optionValue.Value;
			}
			if (!IsNull(entityName.new_TypeFiled1)) {
			    var varible2 = entityName.new_TypeFiled1.Value;
			}
		}