OmniAICreator/Qiita-1.07M huggingface dataset:
アジャイルサムライを読んだ。--アジャイルなプロジェクト運用--

# この記事の概要

「アジャイルサムライ」の第四部を読み、自分なりの解釈をまとめたものです。
アジャイルに詳しい方は、認識の誤りやご意見をいただけたらと嬉しいです。

# 第四部: アジャイルなプロジェクト運用

# アジャイル運用
アジャイルの運用ではイテレーションという決められた期間でアウトプットを出す。
優先順位やプロジェクトの方向性の変更があっても、その期間が終了した時点で、軌道修正していく。

ただし、イテレーションの途中では変更しない。

## ステップ１：分析と設計：作業の段取りをする
アジャイルな分析は

- 必要な分だけを
- 必要な時に

行う。

最初はインデックスカードと会話程度の最小な設計から始まり、一枚のドキュメント、複数枚のドキュメントへと分析・設計の具体性を上げていく。

### ジャストインタイム分析
実際に取り掛かる直前になってから分析すること
- 最新かつ最も充実した情報で分析できる
- 顧客も学ぶ機会が増やせているので、プロジェクトが進むにつれて分析が上手くなる
- 手戻りが大量に発生することを避けられる

分析や設計はフォローチャートを作ったり、ペルソナを作成することでソフトウェアの役割を簡単に説明できるようにする。
デザインの段階に入れば、ペーパプロトタイプで様々な選択肢を用意する。
受入テストを書いてストーリーの満足条件を定義する。

## ステップ２：開発：作業する
- 自動化されたテストを書く
- 設計を継続的に発展させて、改善を続ける
- コードを継続的にインテグレーションする
- 顧客がシステムについて語る言葉に合わせてコードを書く

## ステップ３：テスト：作業の結果を確認する
リリース前には正式な受入テストを行う。

# イテレーションでやるべきこと
1. 作業に備える：ストーリ計画ミーティング
2. フィードバックを得る：ショーケース
3. 計画を立てる：イテレーション計画ミーティング
4. 改善できる余地を探す：振り返り

## イテレーションゼロ
- ストーリに取り掛かる前の準備期間。
  - ビルドの自動化や環境構築などの開発のための段取りを済ませる時間。
- イテレーションが始まる前に必要。

## ストーリ計画ミーティング
- 顧客と一緒に受け入れてテスト条件をレビュー
- 開発チームが見積もりの数値を確認
- 必要な調査に漏れがないかどうかを確認
  - 分析を終えていないストーリに着手することを防ぐ

## ショーケース
チームが成し遂げた成果をお披露目して、顧客からフィードバックを得る。

## イテレーション計画ミーティング
- 開発チームと顧客が一緒になって、イテレーションの作業を計画する
- プロジェクトの健康状態も確認する。
  - 何か必要なものがないか
  - 厄介な問題がないか

できる限り可視化してステークホルダーに状況を共有する。

## 振り返り
- 10-15分だけ短く、集中して行う。
- 定期的に集まって、上手く行ったことやうまくやるためにどうすればいいかを話し合う。
  - うまくやれたこと
    - お互いの行いを褒め合う
  - もっとうまくやれること
    - なんでも良いので課題を共有しあって、集中力を取りもぢして、頑張って取り組もうという新たな気持ちをえる。

## デイリースタンドアップ
- 昨日やったこと
- 今日やること
- 開発速度を下げてしまう何か

を短い時間で共有しあう

# カンバン
カンバンは仕事の流れをスムーズにすることが目的
運用業務などの割り込みが多い場合はカンバンが良い。

- イテレーションのプレッシャーから解放される。
- 成果に対する期待マネジメントの必要がなくなる。
  - １回のイテレーションに治らない仕事にも取り組める
  - 数週間かかるタスクはそのまま扱い続ければいい
- 期待をマネジメントしやすい
  - ストーリポイントはいらない。
  - 見積もりの説明もいらない。
  - 一度にこなせる時ごとの量が限られているだけ。
アジャイルサムライを読んだ。--アジャイルな方向づけ--

# この記事の概要

「アジャイルサムライ」の第二部を読み、自分なりの解釈をまとめたものです。
アジャイルに詳しい方は、認識の誤りやご意見をいただけたらと嬉しいです。

# 第二部: アジャイルな方向づけ

アジャイル開発を行うチームのマインドセットに関しての章

# プロジェクトが目指す本質を追求する

実際の開発とは直結しないが、数日から２週間ほどの時間をかけてしっかりとインセプションデッキを作成することが推奨されている。

## 今作ろうとしているものの背景にある「なぜ」を知る（インセプションデッキを作る）
- 的確な判断が下せる。
- 期待通りにいかなかった場合のトレードオフをうまく保てる。
  - 期待値をうまくコントロールできる
- 自分たちで本質を考えられるようになるので、より優れた斬新な解決策が生み出せる。
  - あるべき姿から生まれるアイディアも存在する

### インセプションデッキとは
プロジェクトの全体像を把握して、間違った方向にいったときの軌道修正や価値あるアウトプットを出すための価値観のすり合わせを行うためのもの。

## 自分のいるプロジェクトが端的に言い表す（自分たちは誰のための何なのか）
- プロジェクトにおける重要なことが明快になる。
- チームの意識が顧客に向き、責任感が増す。
- ゴールに一直線に進めるようになる。

そのために
- エレベータピッチ
- パッケージデザイン
- やらないことリスト

を作ると良い。

### エレベータピッチとは
短い時間でアイディア本質を捉えるための手段
1. ${潜在的なニーズを満たしたり、抱えている課題を解決したり}したい
2. ${対象顧客}向けの
3. ${プロダクト名}というプロダクトは、
4. ${プロダクトのカテゴリー}である。
5. これは${重要な利点、対価に見合う説得力のある理由}ができ、
6. ${大体手段の最右翼}とは違って、
7. ${差別化の決定的な特徴}が備わっている。

`${}`の中身を埋めるとエレベータピッチが出来上がる

### パッケージデザインとは
チームが開発を続ける上で意識したいことは
- 誰かがこれを買うとしたら、その理由は何なのか
- 顧客に訴求する要素は何か
- そのプロダクトならではの値打ちは何か

それを理解するために
1. プロダクトの効能をブレインストリーミングする
   - 内容ではなくて、内容の効能を理解する
2. キャッチコピーを決める
3. パッケージをデザインする

### やらないことリストとは
プロジェクトのスコープへの期待値をマネジメントするために、必要となる切り捨てるためのリスト

項目は
- やる 
- やらない
- あとで決める

## ご近所さんを理解する
- 価値あるプロダクトを期間内に提供するために調整が必要だったり、確認が必要になる関係各所を理解する必要がある。
- 関係各所の影響で大幅なスケジュール調整が必要になることを避ける。

## 解決案を描く

期待に対する認識の齟齬が生まれにくいし、リスクが伝えやすい。

## 指摘し合える関係にする
- プロジェクトの課題を早い段階で明らかにできる。
- 気持ちがスッキリして、チームの結束が高まる。
- チームにとって取り組む値打ちがあるか見極めやすくなる。

## 小さく作る
大きく作ることになって、期間が伸びると、要件の変更に対して弱くなり、問題がどんどん積もってしまう。

## 守るために何かを諦める

- アジャイルでは予算・期日・品質は守る。その代わりにスコープ（ゴール）を柔軟にする。
  - ゴールを柔軟にするというのは、やることを減らすということ
- 短い期間で継続的に品質が担保されたものをリリースしていくために、優先順位を明確にして切り捨てられるもの切り捨てる。
- 切り捨てても、価値があるものをアウトプットすること。
- 価値があると最終判断するのは顧客であり、ステークホルダー。
  - 誰なのかを明確にして、その人にはどのくらいのコスト・時間がどれくらい必要なのか、懸念はなんなのかを早い段階でざっくりと理解してもらう。
30分で作るDAO   老技術者が夜更けにDAOを作った話                      1. DAOを作る

## はじめに
いよいよ定年なのでDAOでも作り余生を楽しもうと思った矢先，中央集権な会社様から続々web3案件舞い込みDAOれないという何とも皮肉なweb3ライフ．よくわからなくなってきたのでAragonでささっとDAOを作ってみたのでした．

## リンク
2.DAOに社員を入れる https://qiita.com/oldEng/items/acd1718058d38d678518
3.DAOから送金する   https://qiita.com/oldEng/items/93f2682ec2a9cc6c9afe

# 1.DAOを作る
## 1-0 準備
まず，Metamaskをブラウザに仕込もう．
これがないと話にならないのでMetamaskとググってあなたのEdgeかChromeの拡張機能に登録しよう．
Metamask上に3つアカウントを作っておくと以下の話を実体験できる．
DAOの体験が目的なのでEthereumのメインネットではお金がもったいないからRinkebyというテストネットを使う．
テストネットといえども0.2ETHないとAragonは相手にしてくれないのでFaucetから無料でETHをもらおう．
Rinkeby Faucetから最低0.2ETHゲットしてほしい．
例えば
https://rinkebyfaucet.com/
から．

## 1-1 Create your DAOをクリック
こちらのAragonのサイトを開き「Create your DAO」をクリック．
https://aragon.org/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/748c42ee-9bc1-7734-c2a9-2d52e0afc385.png)

## 1-2 Metamask接続
するとMetamaskが立ち上がるので，アカウントを1つAragonに接続する．

<img width = 300 src = "https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/e50d1563-6ce2-c42e-a6bf-054bffee1838.png">

## 1-3 Create an organizationを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/0097de9f-0526-07ea-9e54-a3b261760d10.png)

## 1-4 Companyというテンプレートを選ぶ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/964768dd-b82d-bac8-9da0-4fe7b93fec8f.png)

## 1-5 Use this templateをクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/cd6eff6a-760e-0fb9-cc85-213708b7d649.png)

## 1-6 Organization’s Nameを入れてNext

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/74064f41-6943-ebdc-2cc7-43482806b17a.png)

## 1-7 設定そのままでNext

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/5f30a152-d05f-0759-cf2b-0c6f7bc35871.png)

Minimum Approvalは、ある提案が承認されるまでに、トークン供給量のうち何パーセントが "Yes "と投票する必要があるかを示す値。例えば、"Minimum Approval "が20%に設定されている場合、議案が可決されるには、発行済みトークン数の20%以上が "Yes "に投票する必要がある。

Supportは、提案が承認されるために "Yes "の投票が必要とされるトークンの相対的な割合である。例えば、"Support "を50%に設定した場合、議案の可決には、投票に使用されたトークンの50%以上が "Yes "に投票する必要がある。

## 1-8 TOKEN NAME、TOKEN SYMBOL,TOKEN HOLDERS、BALANCESを設定しNext

![スクリーンショット 2022-09-28 222921.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/9f8b7013-cf31-feca-e1a6-2488e40f03b9.png)

## 1-9 Launch your organization

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/7206d316-002e-49fc-738b-7590df438c60.png)

## 1-10 DAOの出来上がり

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/202911/7d06d61b-bf00-8ac4-4fa3-fdf1149d53a2.png)



この続編「2.DAOに社員を入れる」はこちらです．
https://qiita.com/oldEng/items/acd1718058d38d678518
ParticleのTrailがたまに描写されない件

状況：以下の記事を元にVRCの射撃場ワールドを作っていたら何発かに一発かParticleのTrailが描写されなかった。

環境：Unity 2019.4.31f

解決方法：

Particle SystemのInspector
↓
Particle System
↓
Auto Rondam Seedsのチェックを外す
![スクリーンショット 2022-09-29 010114.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2035563/bbb6a44a-7529-06af-23e0-907faec78907.png)




https://toumoro2.hatenablog.com/entry/2018/08/11/133623
IJCAI2022の量子化論文

# 概要

この記事では、[IJCAI2022](https://ijcai-22.org/)の量子化論文を紹介します。[^1]

[^1]: 画像や数式は論文から引用しています。


# RAPQ: Rescuing Accuracy for Power-of-Two Low-bit Post-training Quantization

https://arxiv.org/abs/2204.12322

概要：RAPQ. Power-of-Two Quantization (スケールを2ベキに固定してスケーリング計算を高速化する)の精度改善。
新規性：APoTより精度改善した。
キモ：量子化誤差のテイラー展開のHessian部分を最小化する。BNのみによって各レイヤのロスを何ノルムにするか($p$)を決める。
評価：ResNetやMobileNetでAPoTと比較した。


#  MultiQuant: Training Once for Multi-bit Quantization of Neural Networks 

https://www.ijcai.org/proceedings/2022/504

概要：MultiQuant. 複数ビットの量子化に対応するQAT。
新規性：SuperNetを学習し、そのsubnetで低精度NWを得る方式。
キモ：モンテカルロ法で2~8ビットまでで精度をランダムに決めてsubnetを決める。
評価：MobileNetV2やResNetで実験した。


# おまけその1

RAPQの先行研究のAPoTです。

## Additive Powers-of-Two Quantization: An Efficient Non-uniform Discretization for Neural Networks

https://arxiv.org/abs/1909.13144

(ICLR2020)
概要：APoT. 量子化値を2ベキの和に制限する量子化。
新規性：一般的に重みの分布は正規分布なので一様量子化より非一様量子化の方が精度が良いが、非一様量子化は遅い課題がある。
この課題を解決するために、量子化値を2ベキの和に制限する量子化を提案した。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/ae9153b9-8a50-210a-01b3-5489c4b1972f.png)
キモ：
(1) Reparametrized Clipping Functionで、クリップの閾値$\alpha$を学習させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/4d072d51-a53a-18fe-d63d-defaa0e0fa75.png)
(2) Weight Normalization. 学習中重みの値が良く変わるので安定化させる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/058053a4-6308-93d8-7527-614598eae059.png)
評価：ResNetで実験した。


# おまけその2

[ToST](https://qiita.com/kyad/items/11ce2d9354b09a2b6533#training-your-sparse-neural-network-better-with-any-mask)に関連するGradInitに関する論文です。

## GradInit: Learning to Initialize Neural Networks for Stable and Efficient Training

https://arxiv.org/abs/2102.08098

(NeurIPS2021)
概要：GradInit. 様々なネットワークに適用できる初期値推定方法。
研究機関：Google
新規性：MetaInitより計算量が小さい。
キモ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/aba2f8ca-c679-d3dc-63f4-27a62bfc8a29.png)
これが最小になるように重みのスケーリングパラメータ$m$を決める。
各レイヤのノルムをオプティマイザの1ステップに合わせたいため。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/c2cae2af-04ae-45ee-fcbe-843f10bd45b6.png)
評価：VGG, ResNet, Transformer等でHeの初期値と比較した。

## MetaInit: Initializing learning by learning to initialize

https://papers.nips.cc/paper/2019/hash/876e8108f87eb61877c6263228b67256-Abstract.html

(NeurIPS2019)
概要：MetaInit. 良い初期値をメタ学習で見つける。
研究機関：Google
新規性：初期値設定方法で、あらゆるアーキテクチャに適用できる。
キモ：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2448931/7f3cfc14-1d3d-95d2-1970-331a1a7e7e39.png)
Gradient Quotient (パラメータが動いたときに動く勾配の量) が0に近い、つまり目的関数が線形に近い初期値を見つける。
signSGDで最適化する。
評価：WideResNet等で実験した。
Fire TV Stick (第3世代)を買ったのでS-cubismテレビの音量を使えるようにする(いろいろしたいので)


x ほぼ、マイナーなノウハウ (ほとんど人には、不要な情報)

x かなしい思いをする人を1人でも減らすため

x 答えは、S-cubismでコード2


目的
音量が使えないのでこ一時間以上葛藤した。
ここでノウハウをしめす




1. 電源を付けてなにか初めの画面

2. =>(右)に移動して設定画面

3. 機器のコントロール

4. 機器の管理

5. テレビ

6. IR

7. IRプロフール

8. IRプロフールの変更

9. コード2

10. おわり


![o_con812.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/2bf43374-2519-b03a-71b5-7f8c9a14a933.jpeg)


![o_con813.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/05fcecf5-a264-54d0-f27b-1d1f8afa546d.jpeg)


![o_con814.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/acda8800-bf87-1d2a-38c0-6d2ba2b2ed3b.jpeg)



![o_con815.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/1188ef99-85b1-5a54-bb52-0c21928dc296.jpeg)



![o_con816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/05c0de9d-bfc1-1a4d-70c6-41ea4bebf52c.jpeg)


![o_con817.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/b1343be7-6788-fd4c-788d-6eee44d690b6.jpeg)


![o_con818.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/c78767a1-7ce7-a7a0-d5fb-401896a7e124.jpeg)
M1MacでLaravel＆Docker環境構築を簡単にやる方法 2022 

# はじめに
<!-- 発端や概要を記載 -->
Dockerでの環境構築を覚えるために学習したことをまとめてみました。
今回は、Laravel Sailを使って環境構築を行いました。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [事前準備](#Chapter1)
1. [Laravelアプリケーションの作成](#Chapter2)
1. [アプリケーションディレクトリに移動してLaravel Sailを起動](#Chapter3)
1. [phpMyAdmin追加（おまけ）](#Chapter4)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 事前準備
[Docker Desktop](https://www.docker.com/products/docker-desktop/)をインストールします。


<a id="#Chapter2"></a>
# Laravelアプリケーションの作成
「example-app」という名前のディレクトリに新しいLaravelアプリケーションを作成するには、ターミナルで以下のコマンドを実行します。"example-app"は好きなようにアプリ名に変更してください。
```
curl -s "https://laravel.build/example-app" | bash
```
# アプリケーションディレクトリに移動してLaravel Sailを起動
以下のコマンドを実行します。
```
cd example-app
```
```
./vendor/bin/sail up
```
アプリケーションのDockerコンテナを開始したら、Webブラウザでアプリケーションのhttp://localhost にアクセスできます。

<a id="#Chapter4"></a>
# phpMyAdmin追加（おまけ）
DB操作がしやすくなるようにしていますが、やらなくても大丈夫です。
services:配下に追記します。
```PHP:docker-compose.yml
phpmyadmin:
        image: phpmyadmin/phpmyadmin
        links:
            - mysql:mysql
        ports:
            - 4040:80
        environment:
            #PMA_USER: "${DB_USERNAME}"
            #PMA_PASSWORD: "${DB_PASSWORD}"
            PMA_HOST: mysql
        networks:
            - sail
```
http://localhost:4040 でアクセスできます。ポート番号は任意のものに書き換えても構いません。

<a id="#reference"></a>
# 参考文献
- [Laravelインストール 9.x](https://readouble.com/laravel/9.x/ja/installation.html)
Rubyで文字のUnicode（10進数表記）を取得する

## TL;DR
`String.ord` or `String.unpack("U*")`を使う
```ruby
'あ'.ord          # 12354
'あ'.unpack("U*") # [12354]
```
https://docs.ruby-lang.org/ja/latest/method/String/i/ord.html

https://docs.ruby-lang.org/ja/latest/method/String/i/unpack.html

## ordとunpackの違い
返り値の型が違うので実装上は注意が必要です。
`ord`は最初の文字のUnicodeをIntで返しますが、`unpack`は1文字ずつのUnicodeをArrayで返します。
```ruby
# 対象が1文字
'あ'.ord                  # 12345
'あ'.unpack("U*")         # [12354]

# 対象が複数文字
'あいうえお'.ord           # 12354
'あいうえお'.unpack("U*")  # [12354, 12356, 12358, 12360, 12362]

# ordを使うとちょっと複雑になる
'あいうえお'.chars.map{|c|c.ord} # [12354, 12356, 12358, 12360, 12362]
```
厳密な違いは公式リファレンスをご参照ください。

## その他
公式リファレンスを読んでも何進数なのか、Unicode返してるのか等が明記されていなかったのでまとめてみました。
`golang`の`rune`と同じ事ができるので書き換えの際などにご参照いただけると。
突然出てきたgolangのお話はこちらの記事がわかりやすかったので気になる方はご参照ください。
[Goのruneを理解するためのUnicode知識](https://qiita.com/seihmd/items/4a878e7fa340d7963fee)
terminating, 1 bad configuration optionsエラーが発生してssh接続ができなくなった。

## 1.エラー
vagrant upをしたのち、vagrant sshでssh接続を実行するもエラーが発生して接続できない。
````
/Users/********/.ssh/config: terminating, 1 bad configuration options
````

## 2.エラーの解析
どうやら.ssh配下にあるconfigファイルに以上があるみたいです。そこで、configファイルを開いてみました。
````.ssh/config
# Read more about SSH config files: https://linux.die.net/man/5/ssh_config

Host test
    HostName 127.0.0.1
    User vagrant
    Port 2222
    UserKnownHostsFile /dev/null
    StrictHostKeyChecking no
    PasswordAuthentication no
    IdentityFile /Users/kawakamiyouhei/vagrant/.vagrant/machines/default/virtualbox/private_key
    IdentitiesOnly yes
    LogLevel 
````
あっ！！一番最後の行**LogLevel**の横に**FATAL**の記述がない!!ネットの記事でconfigファイルを見比べて気が付きました。偶然でした。

## 3.configファイルの修正
ということで、最後の行に**FATAL**を記述しましょう！
````
Host default
  HostName 127.0.0.1
  User vagrant
  Port 2222
  UserKnownHostsFile /dev/null
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/kawakamiyouhei/vagrant/.vagrant/machines/default/virtualbox/private_key
  IdentitiesOnly yes
  LogLevel FATAL
````
vimで記入しました。

## 4.確認
記入できたら、**vagrant reload**を実行してもう一度**vagrant ssh**で接続。
````
$ vagrant reload
$ vagrant ssh
````
すると・・・
````
[vagrant@localhost ~]$ 
````
接続できました!!

## 5.最後に
今回のエラーはconfigファイルに記載漏れがあってのエラーでしたが、ファイルを修正した記憶もないし、そもそもconfigファイルなんて普段使わないから開けることもありませんね〜。なので、原因不明ｗｗ
しかし、**terminating, 1 bad configuration options**というエラーが出たら、configファイルに異常があるので、正しいconfigファイルをネットで探して自分のと見比べてみるといいですね。
エラーが出たときは、かなり時間がかかるかな〜と思いましたが、今回はすんなり解決出来たよかったです。

## 6.参考記事
https://maku77.github.io/vagrant/ssh.html
ActiveDirectoryにドメイン参加出来ない原因やDNS名前解決出来ない場合の別のアプローチ

WIndowsServerを購入し自宅サーバにActiveDirectoryをウキウキで導入し、いざドメイン参加だ！というところで思いっきり詰まってしまった。
その悲しさたるや想像を絶する悲しみであった。
解決方法がいろんなサイトに載っていないこと原因であったから後進のために記載する。

::: note warn
名前解決が出来ない事象の人は一番下まで行ってください。
:::

# 環境
ADサーバ：WindowsServer2019
PC:WIndows10

# どんな事象か
ドメイン参加時にどうもドメインコントローラーにアクセスが出来ない。
エラーを読んでみるとSRVレコードが登録されていないと出ているがDNSを何度見ても登録されている。
それどころかNSLOOKUPでドメインコントローラーのドメインを名前解決することすら出来ない。

# 解決に向けたアプローチ
1.まずはDNSが正常にDNSが向いていることを確認する。（ここが落とし穴であった）

2.次にDNSを確認する。（ActiveDirectoryが勝手に登録したのだから当然正常である）

3.ActiveDirectoryのドメイン名を変えてみる。（とてもしんどかったし他のサイトでも二度とやりたくない等地獄のような作業であった）

# 最終的な原因
PCのDNSを確かに振り替えたが再度確認するとサーバのNSLOOKUPと、PCのNSLOOKUPの決定的な差があることに気が付いた。

**IPv6のアドレスが違うのである**

そう、投稿者はIPv4に気を取られて、IPv6のDNSをサーバに振り替えていなかったのである。

とても泣いたがまぁ出来ただけ良しとしよう。

やっぱつれぇわ

::: note
**結論：IPv6がとても憎い**
:::
Fire TV Stick (第3世代)を買ったのでTokyofm (東京FM)を聞く(Alexa radiko)(いろいろしたいので)



x ここは、日本の東京近郊です。


目的
こ一時間かかったのでノウハウをまとめる
いろいろする前にらじぉを聞く

![o_con810.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/daf3fbed-c98e-c448-a413-593f1e97b840.jpeg)


参考


https://faq.radiko.jp/faq/show/338?site_domain=default


1. PCのGoogle Chrome から　amazonにログイン

2. 検索で「すべて」を「Alexaスキル」に変更

3. 「radiko」と入力する

4. 結果からradikoを選択する

5. このスキルを管理からスキルを有効にする

6. デバイスの国および郵便番号でアクセス権を管理を開く

7. 有効にして保存

8. 終わり


Fire TV Stickでの作業

1. ボタンをおしながら「こんにちわ」

2. 「えふえむとうきょう」とボタンをおしながら叫ぶ

3. おわり


![o_con805.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/6e87ced8-ab7f-6ac7-b20d-cb2696490ab4.jpeg)


![o_con806.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/552f784b-3400-4986-20c7-8cb921a9720b.jpeg)

![o_con807.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/e4e0843a-c3fd-2814-766f-32b26bc7aac0.jpeg)


![o_con811.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/a9a6de9b-41c4-f252-f26b-ad97aa6594b9.jpeg)


![o_con809.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/179e6e4b-1ffa-e7b2-85ee-d63d4fc07859.jpeg)


![o_con810.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/25edcba6-2716-d9fc-8e81-6a5cc47ffd99.jpeg)
SHAP GPUtree explainer をインストールしてみた

SHAPの計算に14日かかります、と言われて、それならGPU版を試そうと思ったのですが、資料が少なくビルドに手間取ったのでメモ代わりです。以下では、NVIDIA CUDAがインストール済みで、GPU環境が使用できるものとして記載しています。

SHAP GPUTreeの説明はこちら。ちなみにNVIDA CUDAオンリーです。これを読めば、多分わかる人は判るのでしょうね。
https://shap.readthedocs.io/en/latest/example_notebooks/api_examples/explainers/GPUTree.html

## 実行環境など（2022/09/28時点での情報）
使用した構成及び環境は以下の通りです。
Windows10
Anaconda Navigator 2.3.0
他の情報は以下の通り。ついでに、nvccが通ることを確認しています。
```python
import sys
import torch
print("Python ==",sys.version)
print("PyTorch ==", torch.__version__)
print("CUDA available", torch.cuda.is_available())
print("CUDA ==", torch.version.cuda)
!nvcc --version
```

Python == 3.9.12 (main, Apr  4 2022, 05:22:27) [MSC v.1916 64 bit (AMD64)]
PyTorch == 1.11.0
CUDA available True
CUDA == 11.3
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2021 NVIDIA Corporation
Built on Mon_May__3_19:41:42_Pacific_Daylight_Time_2021
Cuda compilation tools, release 11.3, V11.3.109
Build cuda_11.3.r11.3/compiler.29920130_0

上記SHAPリンクの説明にもありますが、pipやcondaでSHAPをインストールするのではなく、git clone してコンパイルする必要があります。環境に依存すると思いますが、上の環境でしか試しておりませんので、注意してください。

## 事前準備
envは別に作成するか、shapがインストールされている場合は外した環境を作成しておいたほうが無難です。
注：コンパイルに失敗すると、なぜかAnaconda3が立ち上がらなくなるので、試す場合は、復旧ができるようにバックアップした状態、あるいは別環境を作成してお試しください。

## コンパイラのインストール
コンパイラは、vs_BuildTools.exeを使用しましたが、現時点で最新版の2022ではなく、2017か2019版が必要です。コンパイルのログにこっそりエラーで出ていました。以前のバージョンの入手はこちらから。私は2019を使用しました。
https://visualstudio.microsoft.com/ja/vs/older-downloads/
起動すると、おなじみのVisual Studio Installerが現れるので、Visual Studio Toolsの変更ボタンから、表示されるMSVCまたはC++ Build Toolsを選択して、インストールしてください。

## コンパイラへのpath設定
インストール後、cl.exeの場所を調べて、システムの詳細設定から、システムの環境変数のpathを通しておきます。例えば、x64のcl.exeの場合は以下のpathにありました。
C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\VC\Tools\MSVC\14.28.29910\bin\Hostx64\x64
path確認は、DOS窓を新規に立ててclが起動すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508012/021a1434-9b02-db33-e799-e2fbe1d7b85d.png)

## SHAPのクローン
https://github.com/slundberg/shap
をクローンします。どれでもOKですが、私の場合にはgit入れてなかったので、colabでGoogleドライブにクローンして、そこからローカルにコピーしました。
```python
%cd /content/drive/MyDrive
!git clone https://github.com/slundberg/shap.git
```

## コンパイル
Anacondaから、目的の環境のPowershell promptを起動します。cloneされたフォルダへ移動して、
```dos
PS C:\Users\shap>python setup.py install --user
```
を実行します。コンパイルログで、fatalやerrorの無いことを確認してください。
書き込みの競合エラーが発生した場合は、以下のフォルダを削除して、再度コンパイルを試してみてください。前のバージョンのshapが残っているとエラーになるようで、事前に外すように書かれていましたが、それでも何故か残る場合があるようです。
```dos
C:\Users\user\AppData\Roaming\Python\Python39\site-packages\shap-0.41.0-py3.9-win-amd64.egg
```
## 動作確認
まず、コンパイルしたPowershellからpythonを起動して、
```python
>>>import sys
>>>import shap
```
として、特にエラーが無ければ、コンパイルは正常に完了していると思います。問題がある場合は、この時点で、何らかのエラーメッセージが出てきます。
次に、実際のサンプルプログラムでお試しください。ただ、1分程度で実行できるデータ量では、差が出ないようです。恐らくテンソルのメモリコピーあたりで時間をとられているのだと思いますが、場合によってGPU版の方が遅かったりします。
私の場合、3倍強速くなったという感じですね。下図で、上がGPU版、下が通常版です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1508012/3a9d49bc-9aca-4c54-a08c-0daa80705671.png)

## その他
TQDMの表示が出ませんでした。これは、どれくらい進歩しているのか、ハングアップしてるのか、全く分からないので結構不便です。
GPUメモリの使用量は0.1GBで、本当にGPU版かと思うぐらいですが、早くはなっているので、間違いは無いのでしょう。しかし、それでも本来の目的に必要な計算は4日以上かかりそうで、ちょっと微妙ですね。
以上
authenticate_user!メソッド

# authenticate_user!メソッドとは
ログイン状態によって表示するページを切り替えるdeviseのメソッドで
 ユーザーがログインしていなければ、そのユーザーをログイン画面に遷移させる事が出来ます
以下のようにcontroller内にbefore_actionを記述する事で、アクションを実行する前にログインしていなければログイン画面に遷移させられます。

```:ruby
before_action :authenticate_user!
```

##### indexアクションではログインをしていなくても閲覧できるようにしたい場合は以下のように記述する

```:ruby indexはログインせずに閲覧できる
before_action :authenticate_user!, except: :index
```

##### このように複数のアクションにも適用する事も出来ます

```:ruby indexとshowをログインせずに閲覧できる
before_action :authenticate_user!, except: [:index, :show]
```
【NestJS】基本アーキテクチャまとめ(Module,Controller,Service)

大きく分けて3つある

<h3>Module</h3>
@Moduleデコレータのプロパティ<br/>
・providers: @Injectableデコレータが付いたクラスを記述<br/>
・controllers @Controllerデコレータが付いたクラスを記述<br/>
・imports: モジュール内部で必要な外部モジュールを記述<br/>
・exports: 外部のモジュールにエクスポートしたいもの<br/>
<br/>
以下はサンプル
・ユーザー機能を作成したとする

```app.module.ts
import { Module } from "@nestjs/common";
import { AppController } from "./app.controller";
import { AppService } from "./app.service";
import { UsersModule } from "./users/users.module";

@Module({
  imports: [UsersModule], // 作成したUsersModuleをimportsで読み込んで適用する
  controllers: [AppController],
  providers: [AppService],
  exports: []
})
```
```users.module.ts
import { Module } from "@nestjs/common";
import { UsersController } from "./users/users.controller";
import { UsersService } from "./users/users.service";

@Module({
  imports: [],
  controllers: [UsersController],
  providers: [UsersService],
  exports: [UsersService], // 外部で利用したい場合exportsに書く、ここではapp.module.tsで使いたい
})
```

<h2>Controller</h2>
クライアントからのリクエストを受けて、レスポンスを返す役割

@Controllerデコレーターをつける
```users.controller.ts
import { Controller, Post } from '@nestjs/common';

@Controller('users')
export class UsersController {
  @Post() // HTTPメソッドデコレーターをつける
  create() {
    // ユーザー作成のロジック
  }
}

```

<h2>Service</h2>
・ロジックを定義する(ビジネスロジックと説明されることが多いが要はロジックの認識)<br/>
・Controllerにロジックを書いてもプログラムは動く<br/>
→なぜ分けている？<br/><br/>
Controllerの役割とロジックの役割を分担することで保守性拡張性を上げる

:::note info
DI(Dependency Injection)とは
・Controllerの役割とServiceの役割を分けて、依存性を下げること
→依存関係のあるオブジェクトを外部から注入する(ServiceをControllerに注入)

メリット
・本番用、テスト用のインスタンスの切り替え
・ログの出力先の切り替え
:::

@Injectable()デコレーターをつける ※@Serviceではない
```users.service.ts
import { Injectable } from '@nestjs/common';

@Injectable()
export class UsersService {
  find(userName: string) {
  // ビジネスロジック
  }
}
```

<h3>ControllerからServiceを利用する方法</h3>

1 ModuleのprovidersにServiceを登録する

```users.module.ts
import { Module } from '@nestjs/common';
import { UsersController } from './users/users.controller';
import { UsersService } from './users/users.service';

@Module({
  controllers: [UsersController],
  providers: [UsersService],
})
export class UsersModule {}
```

2 ControllerのconstructorでServiceを引数に取る
```users.controller.ts
import { Get, Param } from '@nestjs/common';
import { UsersService } from './users/users.service';

export class UsersController {
  constructor(private readonly userService: UsersService) {}
  @Get('username')
  find(@Param('username') userName: string) {
    this.userService.find(userName);
  }
}
```
ぼくの考える(エンジニア的)必須ショートカットキー

ショートカット紹介ページなんかで `Ctrl + A` と大文字で書かれると「ん？Shiftもいるのか？」と戸惑ってしまいます。

中途採用の未経験エンジニアくんが右クリックしてテキストをコピペしてたのが気になって(自分が)よく使うショートカットキーをまとめてみました。

# めちゃ使う

|ショートカットキー|結果|
|-|-|
|Ctrl + a|全選択|
|Ctrl + c|テキストやファイルをコピー|
|Ctrl + v|テキストやファイルを貼り付け|
|Ctrl + x|テキストやファイルを切り取り|
|Ctrl + z|動作をもどす|
|Ctrl + f|テキストを検索|
|Alt + Tab|タスクの切り替え|
|Ctrl + PageDown|次のブラウザタブ、エクセルシートへ移動|
|Ctrl + PageUp|前のブラウザタブ、エクセルシートの移動|
|Ctrl + s|上書き保存|
|Ctrl + 任意のファイルを選択|選択する度に複数選択or選択解除|
|Shift + 任意の2ファイルを選択|ファイルAからファイルBまでを範囲選択|
|Shift + →(←)|テキストを選択|
|Ctrl + →(←)|テキストを単語単位で移動|
|Ctrl + Shift + →(←)|テキストを単語単位で選択|
|Ctrl + マウス移動|ドライブ内でファイルをコピー|
|Ctrl + マウス移動|ドライブ間でファイルを移動|
|Win + l|Windowsをロック|
|アプリケーションキー|コンテキストメニューを表示|
|F7|テキストを一発で全角カタカナ変換|
|F8|ﾃｷｽﾄを一発で半角カタカナ変換|
|F10|tekisutoを一発で半角英字変換|
|F2|ファイルの名前変更|
|F5|ブラウザでリロード|
|Ctrl + F5|ブラウザで強制リロード|
|Ctrl + k|ブラウザで検索バーへ移動|


# めちゃ使うor前述のショートカットを覚えれば勝手に覚えるor覚えておけばベター

|ショートカットキー|結果|
|-|-|
|Alt + Shift + Tab|タスクの切り替え 逆順|
|Ctrl + y|動作をやり直す|
|Win + v|過去のコピー履歴からテキストやファイルを貼り付け|
|Win + d|デスクトップを表示|
|Ctrl + p|印刷|
|Win + ↑|ウィンドウを最大化|
|Win + ↓|最大化ウィンドウから戻す、ウィンドウを最小化|
|Delete|ファイルを削除|
|Shift + Delete|ファイルを完全削除|
|Ctrl + l|ブラウザでURLバーへ移動|
|F9|ｔｅｋｉｓｕｔｏを一発で全角英字変換|
SpringBootでh2コンソールに接続ができない

# SpringBootでh2 databaseをインメモリで使用時、h2-consoleからdb接続ができなかった

<b>エラー内容</b>: Database "mem:testdb" not found, either pre-create it or allow remote database creation (not recommended in secure environments) [90149-214] 90149/90149

<b>環境</b>
IDE: STS3.9.7RELEASE
JAVA: 8
他は下記設定ファイルに


## 事象発生時の設定ファイル
##### application.properties
<details><summary>ファイル内容(クリックで展開)</summary>

```
// コンソール使用有効
spring.h2.console.enabled=true
// コンソールパス
spring.h2.console.path=/h2-console
// トレース有無
spring.h2.console.settings.trace=true
// リモートからの接続の是非
spring.h2.console.settings.web-allow-others=false
// 作成するdb名
spring.datasource.url=jdbc:h2:mem:testdb
// dbドライバーのクラス名
spring.datasource.driver-class-name=org.h2.Driver
// ユーザー・パスワード
spring.datasource.username=sa
spring.datasource.password=
```
</details>

##### build.gradle
<details><summary>ファイル内容(クリックで展開)</summary>

```
plugins {
	id 'org.springframework.boot' version '2.7.4'
	id 'io.spring.dependency-management' version '1.0.14.RELEASE'
	id 'java'
	id 'war'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
	implementation 'org.springframework.boot:spring-boot-starter-web'
	runtimeOnly 'com.h2database:h2'
	providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}
```
</details>

「implementation 'org.springframework.boot:spring-boot-starter-web'」と
「runtimeOnly 'com.h2database:h2'」はh2コンソールの起動時に必要になるライブラリになります。

##### setting.gradle
<details><summary>ファイル内容(クリックで展開)</summary>

```
rootProject.name = 'JavaRestApi'
```
</details>

## 解決策1. build.gradleに以下を追加し、IDEのコンソールログでJDBC URLを確認する
<details><summary>追加する内容(クリックで展開)</summary>

```
implementation 'org.springframework.boot:spring-boot-starter-jdbc'
```
</details>

これで、IDE(総合開発環境)のログに
<b>「INFO 17824 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:○○○○-○○'」</b>
などと表示されるので、'jdbc:h2:mem:○○'をJDBC URLにコピーして接続できる。

:::note info 
上記「application.properties」の「作成するdb名」を指定しているのに、全然違うものになる原因は、Spring Bootのバージョンによっては、デフォルトでスキーマ名がランダムに生成される設定になっているため
:::

## 解決策2. スキーマがランダムに生成される設定をオフにする
##### application.properties に以下を追記
```
spring.datasource.generate-unique-name=false
```
これでスキーマがランダムに生成されず、"testdb"での生成ができる。
コンソールに表示されるJDBC URLも次のようになった
<b>「INFO 17824 --- [           main] o.s.b.a.h2.H2ConsoleAutoConfiguration    : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb'」</b>

- [参考記事](https://stackoverflow.com/questions/61865206/springboot-2-3-0-while-connecting-to-h2-database)
【Linux】Ctrl + L と reset コマンド が好き(小ネタ)

# ごちゃごちゃした画面は好きじゃない

lsコマンドを使用して、ファイル名がいっぱい出力される。catコマンドで文字数の多いファイルを開いて、萎える。

上記のような状況が重なった時に、私はごちゃごちゃした画面でストレスが溜まって作業に集中出来なくなります。

今までは、`clearコマンド`を使用して画面を綺麗にしていました。
最近知ったんですが、`Ctrl + l` が`clearコマンド`同様に画面を綺麗にしてくれるようです。

画面を綺麗にしてくれるのですが、↑にスクロールすると`clearコマンド`実行前の画面が残っています。
それすらも嫌な事があるのですが、そんな時は`resetコマンド`を叩いています。↑にスクロールがそもそも出来ないと思います。端末の初期化が入って、画面が初期状態になっているようです。

後はバイナリファイル開いた時なんかは、プロンプトが文字化けしちゃう事があるのですが、そういう時にも`resetコマンド`叩いてます。

画面がごちゃごちゃして目障りだと感じるLinux初心者さんは、`Ctrl + l`をお勧めいたします。
AVPlayerViewControllerは継承しちゃダメ🙅 直で使うべし

# issue

AVPlayerViewController を継承して作ったVCから動画プレイヤーで動画を再生させていたんですが

**iOS16になってから、 動画プレイヤーのコントローラー（再生とか10秒先送りのボタン）が表示されたまま消えなくなるバグが発生した
今まではタップすると表示/非表示が切り替わったが、それもなくなった**

こんな感じ
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48695/0ba94b38-925e-1bb1-a9ad-82191dd6b2bd.png width="200">


コードはこんな感じ

```objc
@implementation MyAVPlayerViewController


- (id)initWithVideoUrl:(NSString *)url {
    
    if (self) {
        AVPlayer *avp = [[[AVPlayer alloc] initWithURL:[NSURL URLWithString:url]] autorelease];
        self.player = avp;
        self.showsPlaybackControls = FALSE;
        self.allowsPictureInPicturePlayback = YES;
    }
    
    return self;
}

- (void)viewDidLoad {
    [super viewDidLoad];
以下略
```

# 直した

AVPlayerViewController の注意書きを読むと、 どうやらAVPlayerViewControllerは生のママ使えとのこと
試しにこんな感じで呼び出すようにしてみた

```objc
AVPlayer *avp = [[AVPlayer alloc] initWithURL:[NSURL URLWithString:urlPath]];
AVPlayerViewController *avpVC = [[[AVPlayerViewController alloc] init] autorelease];
avpVC.player = avp;
[self presentViewController:avpVC animated:YES completion:^{
    LOG(@"modal ok");
}];
```

すると、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/48695/cc045d32-f6a4-6b0c-b98a-e66b6d4eee81.png)

無事コントローラーが表示され、さらにタップで表示/非表示きりかえもされるようになった

AVPlayerViewControllerは生のママ使いましょう
matplotlibのlegendで1つのプロットに対して複数プロットを割り当てる方法

表題通りです．

まずは以下のようなコードを用います．

```python
import matplotlib.pyplot as plt
import matplotlib.collections as mcol
from matplotlib.legend_handler import HandlerLineCollection
from matplotlib.lines import Line2D

import numpy as np


class HandlerMultipleLines(HandlerLineCollection):
    def _my_create_legline(self, idx, xdata, ydata, orig_handle, legend, trans):
        legline = Line2D(xdata, ydata)
        self.update_prop(legline, orig_handle, legend)
        try:
            color = orig_handle.get_colors()[idx]
        except IndexError:
            color = orig_handle.get_colors()[0]
        try:
            dashes = orig_handle.get_dashes()[idx]
        except IndexError:
            dashes = orig_handle.get_dashes()[0]
        try:
            lw = orig_handle.get_linewidths()[idx]
        except IndexError:
            lw = orig_handle.get_linewidths()[0]
        if dashes[1] is not None:
            legline.set_dashes(dashes[1])

        legline.set_color(color)
        legline.set_transform(trans)
        legline.set_linewidth(lw)
        return legline

    def create_artists(self, legend, orig_handle, xdescent, ydescent, width, height, fontsize, trans):
        n_lines = len(orig_handle.get_segments())
        xdata, _ = self.get_xdata(legend, xdescent, ydescent, width, height, fontsize)
        ydata = np.full_like(xdata, height / (n_lines + 1))
        kwargs = dict(xdata=xdata, orig_handle=orig_handle, legend=legend, trans=trans)
        leglines = [
            self._my_create_legline(idx=i, ydata=ydata * (n_lines - i) - ydescent, **kwargs)
            for i in range(n_lines)
        ]
        return leglines
```

実際に使用する方法は以下のとおりです．

```python
x = np.linspace(0, 5, 100)

fig, ax = plt.subplots()
colors = [plt.get_cmap("rainbow")(i/2) for i in range(3)]
styles = ["solid", "dashed", "dotted"]
lines = []
for i, color, style in zip(range(3), colors, styles):
    ax.plot(x, np.sin(x) - .1 * i, c=color, ls=style)

# define invisible lines for legend entries
line = [[(0, 0)]]
lc1 = mcol.LineCollection(3 * line, linestyles=styles, colors=colors)
lc2 = mcol.LineCollection(line, linestyles=["solid"], colors=["red"])

# define a handler map to create legend entries
handler_map = {
    type(lc1): HandlerMultipleLines(),
    type(lc2): HandlerMultipleLines(),
}

# Set legend
ax.legend([lc1, lc2], ["multi-line", "single line"], handler_map=handler_map, handleheight=3)

plt.show()

```

**出力結果**

![download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/355593/5d13e1f1-fc79-0ddf-bcd8-aded3babcc08.png)

余談ですが，`marker`は現状対応していないようです．
Windows7からNASに繋がらないとき

環境：Windows7

SynologyのNAS
DS220jを導入したとき、
Windows10やXPからは繋がるのに、
Windows7のマシンからだけ繋がらない事象に苦しんだ。

エクスプローラー上で
ネットワークにNASの名前とアイコンは表示されており
認識はできているようだが、
ユーザ名とパスワードを入力すると
```
ログオン失敗: ユーザー名を認識できないか、またはパスワードが間違っています。
```
ユーザ名や権限と共有の設定、パスワードは間違っていないはずなのに弾かれる。

コマンドプロンプトでも
```
net use \\nas_name /user:xxx password
```
```
システム エラー 1326 が発生しました。
```
同じエラー。

↓↓↓
解決法
↓↓↓

ローカルグループポリシーエディター（gpedit.msc）

＞ コンピュータの構成
＞＞ Windowsの設定
＞＞＞ セキュリティの設定
＞＞＞＞ ローカルポリシー
＞＞＞＞＞ セキュリティオプション
```
ネットワークのセキュリティ：LAN Manager 認証レベル
```
を
```
NTLMv2 応答のみ送信する
```
に変更すると、ログインが成功して繋がった。
他の選択肢でも繋がるかもしれない。

当環境当機種でなくとも
ここのセキュリティ設定を、機種に合った別の選択肢にすれば
認識するようになるのではないかと思う。
[Python][Tips] 処理時間の計測

https://camp.trainocate.co.jp/magazine/python-time/

上記によると、Python処理の実行時間を測定する方法は以下の３つ。
> (1) time.time() : 最も簡単な実行時間を測定する方法
> (2) time.perf_counter() : 正確に実行時間を測定する方法
> (3) time.process_time() : CPU実行時間のみを測定する方法(sleep時間を除く) 

(2)が実用的に使えるので、実際の業務で利用しています。
```python
import time

start = time.perf_counter() #計測開始
##################################
#####                        #####
#####    計測したい処理を実行    #####
#####                        #####
#################################
end = time.perf_counter() #計測終了
print('{:.2f}'.format((end-start)/60)) # 87.97(秒→分に直し、小数点以下の桁数を指定して出力)
```
Sublime text4でEmmetで！とctrl+eで展開したときに、言語をjaにした件

先日Sublime text4を知り、色々と試しています。
日本語化して、使っています。

そして、Emmetを知りました。

！の後に、ctrl+eで展開するとHTMLの雛形が出たので、すごいと思いました。

ただ、言語のところがenなので、jaに毎回直すのも大変です。

ネットで調べたら修正方法が、下記の記事のような内容でたくさん見つかりました。

https://qiita.com/lemon2003/items/f0eed6167b2904898140

でも、この方法では、jaに修正できないのです。
![yahoo.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/20977/67e9d3cc-34ac-ab04-5008-0e59b61a5f78.jpeg)

settings-userという項目が、無いのです。


そのため下記のように、質問してみました。

https://github.com/emmetio/sublime-text-plugin/issues/178

そうしたら、直ぐに回答を頂きました。
このように、修正するそうです。

Emmet.sublime.settings.の中に、下記のようにセットする形に変わったようです。

```
{
    "config": {
        "markup": {
            "variables": {
                "lang": "ja"
            }
        }
    }
}
```
私の場合は、このようになっています。
```

{
	"telemetry": false,
	"uid": "*****",

    "config": {
        "markup": {
            "variables": {
                "lang": "ja"
            }
        }
    }
}

```
このように、出力できました。
```html
<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
</head>
<body>
	
</body>
</html>
```

こちらが、新しいカスタマイズの方法です。

https://github.com/emmetio/sublime-text-plugin#adding-custom-emmet-snippets
「GCP Professional Cloud Architect」 取得に向けた学習まとめ

# はじめに
先日、GCP Professional Cloud Architectの認定試験を受験し、無事合格しました。自分が利用した学習コンテンツとその概要について、記載をしています。

# 受験目的
GCPを用いた分析基盤構築案件に携わることになり、GCPの各種サービスについて、業務上でのキャッチアップと並行して、体系的な知識の習得を行いたいと思い、受験することに決めました。

# 前提
- クラウドサービスに関しては、AWS側にて「AWS 認定ソリューションアーキテクト – アソシエイト」の資格は取得、加えて業務での利用もあり、基本は習得済。
- データ関連サービスに関しては、AWS側にて「AWS 認定データアナリティクス 専門知識」の資格は取得、加えて関連書籍も数冊読んでおり、一般的な知識は習得済。
- GCPに関しては、受験の半年ほど前に利用開始。本資格取得前に「Professional Data Engineer」を取得。

# 利用した学習コンテンツ
- [エンタープライズのためのGoogle Cloud クラウドを活用したシステムの構築と運用](https://www.amazon.co.jp/dp/4798174181)
    - Google Cloudのアーキテクトの方々が書いた本です。
    - 最近出版されたこともあり、内容が現状と乖離しているようなことがないので、安心して読むことができます。
    - 実務でのアーキテクチャを考えるうえでも役立った内容も多く、実務に即した内容になっているように感じました。
- [模擬試験](https://docs.google.com/forms/d/e/1FAIpQLScpVCxsKSrqMBmqJ4fiYrJfCSlMhJVIFaW_v3MD4xEd6NW0Bw/viewform?hl=ja)
    - GCPの認定試験は無料の模試があります。
    - 前回のData Engineer受験時同様、学習前、学習後に2回受講しました。
- coursera
    - [Google Cloud 認定資格の取得準備：クラウドアーキテクト プロフェッショナル認定証](https://www.coursera.org/professional-certificates/gcp-cloud-architect)
        - Google公式のコースです。
        - まさにこの資格の取得に向けた講義なので、本資格試験を受験する際は受講必須かと思います。
        - 最後に模試もあります。
    - [Google Cloud Fundamentals: Core Infrastructure 日本語版](https://ja.coursera.org/learn/gcp-fundamentals-jp)
        - こちらもGoogle公式のコースです。

# 受験を終えての感想
架空の企業に紐づくソリューション提案のケース問題もあるなど、かなり実務を意識した問題が多く、勉強になりました。
また、GCS(GCPのストレージサービス)のライフサイクル設定や、ゼロトラスト的なセキュリティ設定など、自分が関わったGCPの分析基盤構築案件の際に検討したような内容も出てきたので、復習になる部分も多く、受験して良かったなと思っています。
まだ触っていないサービスに関する知識は忘れないうちにプライベートで触る or 業務で触る機会を生み出していきたいなと思います。
画像の切り抜き処理

### はじめに
画像認識をする機械学習のモデルを自分で作ってみようと思い、
その下準備として画像の一部を切り抜いて、学習する画像を作成するスクリプトを書きました。

画像が保存されているフォルダを指定するとその配下にあるファイルを一括で加工するようにしています。

実施する内容は以下
・画像をグレースケールにして色の特徴を消す。
・画像から学習したい領域を切り抜いて保存する。

### やったこと
「C:\\XXXXXX\\XXXXXX\\」の下に加工したい画像を置いて、スクリプトを実行すると、
「C:\\YYYYYY\\YYYYYY\\」の下に加工後のファイルを出力します。
パスは実行する環境に合わせて記載してください。

私の場合、Y軸は200～1597　X軸は1024～1568　の長方形で切り取りたかったので、
img_1[200:1597, 1024:1568]　としています。

``` python
import cv2
import glob

input_dir = "C:\\XXXXXX\\XXXXXX\\*"
output_dir = "C:\\YYYYYY\\YYYYYY\\"

#ファイル名を取得
for path in glob.iglob(input_dir, recursive=True):
        
    try:
        img = cv2.imread(path)
        
        #グレースケール処理
        img_1 = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
        
        #画像の切り取り
        img_2 = img_1[200:1597, 1024:1568]
                
        #加工後のファイルを保存
        output_path = output_dir + "mask_" + path.split("\\")[-1]       
        cv2.imwrite(output_path, img_2)
        
        print(output_path + " Finish!")
        
    except Exception as e:
        print("error! " + str(e))
```

※加工前
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/5b09fac9-d4b2-2aa2-b3e1-e29e092dc6c4.png" width=50%>

※加工後
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359985/7ce15502-434a-7317-edb0-28d6780b8def.png" width=20%>
【AWS】Route53でドメインを購入する方法（コンソールの画像付きで解説）

## 背景
- 個人の[技術ブログ](https://takuma-tech.com)の解説にあたりAWSの[Route53](https://aws.amazon.com/jp/route53/)でドメインを購入しました。
- [Route53](https://aws.amazon.com/jp/route53/)のドメインの購入方法についてまとめておきます。

## Amazon Route 53とは？
- AWSのドメインネームシステム（DNS）のサービスです。
- AWSはドメインの販売も行っており、AWSでドメインを購入できるサービスが[Route53](https://aws.amazon.com/jp/route53/)です。
- DNSサービスなので、DNSレコードの設定などにも使用するサービスです。

## [Route53](https://aws.amazon.com/jp/route53/)でドメインを購入するメリット
- ドメインは、[お名前.com](https://www.onamae.com/?btn_id=onamaetop_header_logo_19th_newdesign)などAWS以外の業者からも購入することができます。
- 体感ですが、基本的にRoute53でドメインを購入するよりもお名前.comで購入した方が、ドメインの価格が安いことが多い気がします。
- ただ、個人的にはドメインを購入するならRoute53をお勧めします。
- 理由は単純なのですが、登録から、DNS伝播など通常ならシステム的に時間がかかる作業が一瞬で終わるからです。
- Route53のドメイン料金が多少割高でも、作業スピードが圧倒的に早いので、十分に元は取れると考えています。

## Route53でドメインを購入する方法

### AWSのコンソールからRoute53のダッシュボードに移動
![01_Route53_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/6a3661ae-b4c0-120b-9e87-ea32258558ef.png)

### ドメイン名の選択画面に移動
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/75e424f2-639c-47c4-8571-d77a7971afad.png)

### 末尾に使用するドメインをリストから選択
- 表記の通り、ドメインによって料金が異なります。
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/b3f7f251-e4b9-2eeb-c2a7-cdbc23ccc681.png)

### 使用したいドメインが使用可能かどうか調べる
- ここでは、個人ブログで使用しようと思った「takuma-tech.com」というドメインが使えるかどうか調べています。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/f4978a4f-8ea4-7ebd-fdc9-e4ca57177ca3.png)

### ドメインの登録年数を指定する
![05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/d76de487-1984-0146-6bc7-4c5779bd4585.png)

### ドメイン登録に必要な情報を入力する
- 個人で登録される際は、プライバシー保護は有効化した方が良いでしょう。
- ドメインには管理者情報を紐付ける必要があり、それは[このようなサイト](https://tech-unlimited.com/whois.html)で公開されてしまうからです。
- プライバシー保護を有効化しておけば、whoisで検索されてもまずはドメインの管理業者（この場合はAWS）の情報しか公開されないため、全世界に自分の個人情報を晒さなくて済みます。
![06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/d90ea053-c9a2-7c0c-bf6f-f9267536526f.png)

### ドメインの注文
![07_ドメイン購入最終確認_加工必要.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/761c9a4b-6982-5223-f98a-241d099d157b.png)

### 注文完了画面
- しばらくすると、登録に使用したメールアドレスにAWSからメールが届きます。（メール送付まで数日とか書いてますが5分ぐらいで来ると思います。）
- メールにリンクがあるので、クリックすれば、注文完了となります。
　![08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/f6b56c24-b191-d697-efd9-ada94ffc40a7.png)

### 登録の進行状況の確認
- Route53の左側の「保留中のリクエスト」からドメインの登録状況が確認できます。
- ドメインの登録完了までしばらく待ちましょう。
![09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2651220/8a357917-f3f8-46bf-ca39-b2fc4fe36490.png)

### 終わりに
- 登録が完了するとRoute53のダッシュボード画面に使用できるドメインとして登録されます。
- 「ホストゾーンの作成」から必要なDNSレコードなどを登録してドメインを使用開始しましょう。

## 参考資料

https://aws.amazon.com/jp/route53/

https://www.onamae.com/?btn_id=onamaetop_header_logo_19th_newdesign

https://www.onamae.com/clever/about/regist.html?banner_id=1104_comnetwork_1&waad=kmaqQHPQ&network=google_x&placement=&keyword=&device=&gclid=CjwKCAjw4c-ZBhAEEiwAZ105RfT77H3CxZHRHjeX8eKXgqFyLZhnPNUe8zYKMSNnB6cY2rmD7huj3hoCOH4QAvD_BwE

https://www.onamae.com/option/dnsrecord/

https://nlog.jp/domain-ranking-japan/

## 個人ブログ

https://takuma-tech.com/2022/09/28/247/
【JetpackCompose】ViewModel は使う必要がない

<blockquote class="twitter-tweet" data-conversation="none"><p lang="en" dir="ltr">AAC ViewModel is a kludge for Android, I see no reason to proliferate bad patterns. If you have a properly designed data layer, you&#39;ll realize you have no use for an AAC ViewModel.<a href="https://t.co/HWvs4nSpoL">https://t.co/HWvs4nSpoL</a></p>&mdash; Jim Sproch (@JimSproch) <a href="https://twitter.com/JimSproch/status/1561024830786322433?ref_src=twsrc%5Etfw">August 20, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


> AAC ViewModel は Android 用の雑なもので、悪いパターンを増殖させる理由はないと思います。データレイヤーが適切に設計されていれば、AAC ViewModel を使う必要がないことに気づくはずです。

> でも、一番いいのは、アプリが本当のデータレイヤー（キャッシュやネットワークレイヤーなど）を持つことでしょう。 VMはデータレイヤーを参照することができますが、VM自身はすべてのインタラクションを処理すべきではありません。

[👉 ViewModel を捨てて マルチプラットフォーム に備える](https://android.benigumo.com/20220928/without-viewmodel/)
[👉 Android ViewModel が不要である理由](https://android.benigumo.com/20220929/you-dont-need-android-viewmodel/)
Sweetvizの日本語文字化けを直す



[sweetviz](https://github.com/fbdesignpro/sweetviz)は2行でEDAをしてくれるpythonのライブラリです。
とっても便利ですが、フォントの問題で日本語が豆腐になってしまうことがあります[^1]。

[^1]: string型の列は棒グラフにならないので、カテゴリ型を用いてる場合に起きる問題です。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/17c600f4-f4e3-37ee-4e0b-49fcd1bd8e75.png" width=80%>

ちょっと前のバージョンから以下の一行で直せるようになってます。
```python
sv.config_parser.read_string("[General]\nuse_cjk_font=1")
```

と、これだけの記事なのですが、せっかくなので何をやっているか解説していきます。


# 何をやってるのか

SweetvizのGithubにおいて、
- sweetvizはconfigファイルで色々設定を変えることが可能
- 日本語（、中国語、韓国語）は以下のようにiniファイルに書くと豆腐直せる
```
[General]
use_cjk_font = 1 
```

と紹介されています[^2]。configファイルに関してsweetvizは何をやっているかと言うと、

[^2]: https://github.com/fbdesignpro/sweetviz#new-chinese-japanse-korean-cjk-character-support 。なお、cjkはChinese、Japanese、Koreanの頭文字をとったもの。

- `import sweetviz` 時にconfig.pyが実行される
- config.pyの中では、pythonの標準ライブラリである[configperser](https://docs.python.org/ja/3/library/configparser.html)を使用して、デフォルトのiniファイルを読み込む

という感じです。なので、豆腐を直す追加の設定（上の2行）を書いたiniファイルを読み込めばいいわけです[^3]。

[^3]: ここに書いたもの以外はデフォルトの設定が引き継がれます。

```python
import sweetviz
sweetviz.config_parser.read('path/to/my_config.ini')
```

いちいちiniファイルを作成するのは面倒なので、サクッとEDAだけ行いたい場合は文字列をそのまま読み込む `read_string` が便利です[^4]。ただし改行は必須なので、改行コードを表す `\n` を使って書いたものが冒頭の一行です。

[^4]: https://docs.python.org/ja/3/library/configparser.html#configparser.ConfigParser.read_string


# やってみる
お手元の環境、あるいはGoogle colabなどで、以下を実行すれば試せるはずです。

```python
import pandas as pd
import sweetviz as sv

df = pd.DataFrame({'列１': [1,2,3], 'れつ２': ['栃木', '宮城', 'GUNMA']}, dtype='category')
df.info()

sv.config_parser.read_string("[General]\nuse_cjk_font=1")
sv.analyze(df).show_notebook()
```

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/665792/9d714e70-486b-f8d6-2f6e-eb689804c075.png" width=80%>
[bat][Tips] 忘れがちな現在日時の取得方法

忘れがちなので、備忘録としてここに残しておく。

```bat
rem 今日の日付（年・月・日）を取得
set year=%date:~0,4%
set month=%date:~5,2%
set day=%date:~8,2%
rem 現在時刻(時・分・秒)を取得
set hour=%time:~0,2%
set minute=%time:~3,2%
set second=%time:~6,2%
rem 現在日時を取得
set now=%year%%month%%day%%hour%%minute%%second%
```
Python Pandas基礎② -Excel・CSVの読み込み-

### 初めに
pythonのpandasについて初学者なりにまとめたいと思います。
学習に使っているのはこちらのキノコードです。

https://kino-code.com/category/introductory-course-pandas/

### CSVファイル

#### 読み込み
使用するCSVファイル
[出典：政府統計の総合窓口(e-Stat)](https://www.e-stat.go.jp/stat-search/files?page=1&layout=datalist&toukei=00200521&tstat=000001011777&cycle=0&tclass1=000001094741&tclass2val=0)
「男女別人口－全国，都道府県（大正９年～平成27年）」（総務省）を加工して作成

csvファイルをデータフレームとして読み込むには、read_csv関数を使用します。
read_csv関数の引数に、読み込みたいcsvファイルのパスを指定します。
続いて、引数encodingに文字コードを渡すことで、ファイルを読み込む際の文字コードを指定することができます。
CSVファイルと同じ階層にPythonファイルを配置することでパスを省略できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/2f97f5eb-d47b-f794-ec7b-3dd181a5fb16.png)

#### head/tail
haed()メソッドで行頭から何行表示させるか指定できます。省略するとデフォルトの５行になります。
tail()メソッドは逆に行末から何行表示させるか指定できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/bd98a88d-e380-dc12-0c96-ba76710dbe1a.png)

#### indexを指定して読み込む
read_csv()にindex_col="インデックスに指定したいカラム"で任意の列をインデックスに指定することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/4f8067bb-0655-5309-27b5-34fb9d8cb541.png)

### Excelファイル
#### 読み込み
先ほどのCSVをExcelにコピペしたものを準備して行います。
Excelファイルをデータフレームとして読み込むには、read_excel関数を使用します。
read_excel関数の引数に、読み込みたいExcelファイルのパスを指定します。
Excelファイルと同じ階層にPythonファイルを配置することでパスを省略できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/110fe037-f89b-c90e-88b2-56e9405c3400.png)

#### 読み込み開始行を指定
このように２行空行があった場合に３行目から読み込むように指定してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/dc580fce-40ed-9026-0d0a-0593a35437fb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/af0b178a-0f28-56a3-74cf-ae8898c1dd65.png)

read_excel()に引数skiprowsに数値を渡すことで、指定した数値の分だけ行をスキップして読み込むことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/4d09e58e-d24e-900d-b7a4-088505828414.png)

#### headerを指定

このようにヘッダーがないデータを読み込んでみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/8a91abeb-96ea-5187-09de-06615f9b631a.png)

Unnamedとなってしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/672fd948-e7e2-f3aa-8567-898bdd4b7d41.png)

引数headerにカラムに指定したい行番号をリストで渡すことで、任意の行をカラムに指定することができます。
この際にNoneを渡すと、カラムが自動的に連番で附番されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/409bcce3-f245-d646-37a8-7d4c83567ada.png)

#### カラム名の変更
rename()メソッドを使用するとカラム名やインデックスを変更することができます。辞書型で変更前と変更後のカラム名またはインデックス名を渡します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/f83a1bc9-2f43-70e8-8c6e-939e4c756bc0.png)

### 終わりに
read_csvとread_excelはしっかりおぼえたい。
kaggleをはじめてやってみた

## 挑戦の経緯
未経験からデータ分析の仕事に転職して1年経ったところで、E資格の勉強をはじめましたが、講義動画はどうしても眠くなりがちでいまいち頭に入ってこない状況でした。
そんなときに、[Kaggleで磨く 機械学習の実践力--実務xコンペが鍛えたプロの手順](https://www.amazon.co.jp/dp/4865943269/)を読み、やってみようというのがきっかけでした。
機械学習に興味はありつつも実務ではなかなか機会がなく、資格取得を含めて勉強しようとしていたのですが手を動かして勉強したほうが楽しそうだと思いkaggleにチャレンジすることにしました。
挑戦したのはこちらのコンペ
[American Express - Default Prediction](https://www.kaggle.com/competitions/amex-default-prediction)
アメックスの会員が将来デフォルトするかを予測するというものでした。
テーブルデータコンペかつ、参加者も多いことから取り組みやすそうだなと思いこのコンペを選びました。

## 苦労と学び（=楽しみ）
#### 1.いきなりメモリーエラー...
まずはベースラインを作ってみようという本の内容に従い、コンペにエントリーしてさっそくデータセットを読み込もうとしたところ、メモリーエラーで読み込めないという事象に陥りました。

#### 2.先人のノートブックを参考
XGBoostの公開ノートブックを見つけたのでこれをベースに修正していくことにしました。
上位の方のコードは読みやすく、意図と処理が理解しやすく勉強になります。
こちらのコードではデータセットが大きすぎて読み込めない点は、他の方が作成したparquet形式の公開データセットを利用するようになっていました。

#### 3.ハイパラのチューニング→スコアアップ！
見様見真似で
`'max_depth'`
`'learning_rate'`
`'subsample'`
`'colsample_bytree'`
などのハイパーパラメータを動かしては学習→バリデーションを繰り返してはスコアの変化を確認しました。
いろいろ動かしてみて頭打ちとなったところで特徴量の生成に移ることにしました。

#### 4.特徴量の作成→スコアアップ！
仮説を立てて特徴量を作成しては学習→バリデーションを繰り返しました。
ほとんどのケースではスコアは上がらなかったのですが、自分で考えて作った特徴量をモデルに組み込んでスコアが上がるのはうれしく、楽しいものでした。
仮説を検証するために目的の処理をPythonでどのように実装するのかというのを調べて書いていくのは勉強になりました。

#### 5.またしてもメモリーエラー...
コンペ終了日前夜まで特徴量生成をあれこれ試した挙げ句、これでスコアが上がらなければ終わりにしようというところで、バリデーションのスコアが自己ベストを更新しました。よしこれをサブミットして終わろうとした矢先に、テストデータの読み込みでメモリーエラーに陥りました。
あれこれ変数を削除して `gc.collect()` を実行しても解消されず、、、
最終的には学習したモデルを書き出した上で、ノートブックを再起動、モデルを読み込み、テストデータを読み込みでなんとか乗り越えることができました。
メモリーエラーで始まり、メモリーエラーで終わるというkaggle初挑戦となりました。

結果は4875チーム中、2320位という結果に終わりましたが、とても楽しかったです。
やって見る前はそんなにハマるものだろうかと思っていましたが、やってみるものですね、ハマりました。
kaggleに限らず、NishikaやSIGNATE、ProbSpaceなど国内でもいろいろなデータ分析コンペのプラットフォームがあるようなので、また違うコンペに挑戦してみようと思います。
Win + R の履歴に入れておくと便利なもの

# 背景

兼業情シから離れることになったので、また戻った時用に備忘録

# 履歴から直接使うもの

|コマンド|概要|補足|
|-|-|-|
|\\\wsl$|wsl を Explorer で開く|-|
|winver|Windows バージョン表示|
|mstsc|リモートデスクトップ接続|
|services.msc|サービス一覧|
|regedit|レジストリ|
|cmd|コマンドプロンプト|
|control panel|コントロールパネル|
|excel /safe|セーフモードのExcel|
|powercfg /batteryreport|バッテリー詳細情報の作成。Default出力は %userprofile%|"powercfg /batteryreport %userprofile%\Downloads" のようにすれば、ダウンロードフォルダーへの出力|
|msinfo32|システム情報|
|appwiz.cpl|プログラムと機能|
|gpresult /H %userprofile%\Downloads\gpo.html|GPO の出力|
|gpedit.msc|ローカルグループポリシー|
|secpol.msc|ローカルセキュリティポリシー|
|taskschd.msc|タスクスケジューラ|
|shell:common startup|すべてのユーザーのスタートアップフォルダ|
|shell:startup|自身のスタートアップフォルダ|
|resmon|リソースモニター|
|eventvwr|イベントビューアー|

# コマンドプロンプトで使うもの

|コマンド|概要|
|-|-|
|systeminfo|システム情報|
|tracert|IP|
|net group {name} /domain|Domain のグループ{一覧}|
|net localgroup {name}|Local のグループ{一覧}|
|net user {user} /domain|Domain のユーザー情報|

https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc771865(v=ws.11)

# あとがき

履歴に残ってないものは全然思い出せない :laughing: