OmniAICreator/Qiita-1.07M huggingface dataset:
【vscode】上にバーが表示されるようになった

# 前書き

vscodeをアップデートしたら、上にバーが表示されるようになった。

![command-center](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/636785/2079a8d2-eb9c-d768-1884-a5d3b604d2d8.png)

# command centerとは

上のバーは、`command center`と呼ばれるものらしい。

実はvscodeには2022年7月あたり(？)から実験的に実装されていたものらしく、
先日の1.82のアップデートの際にデフォルトで有効になった。

内容はまだ把握していないが、`command + p`で表示されるファイル表示や、
いくつかのコマンドが実行できるようになったりしているらしい。

また、戻るボタンや、進むボタンも追加されている。
ただ、`command + z`や`command + shift + z`で出来る戻るや進むとは違い、
ひとつ前に作業していた`場所`に戻るような感じの動作をしている(気がする)。

# 有効化と無効化

邪魔かなと思った場合に非表示にすることができるらしいので、メモ。

command center内で右クリックし、`コマンドセンター`のチェックを外すと非表示になる。
また、非表示にした後やはり戻したいと思った場合は、
設定から`Window: Command Center`のチェックを入れることで再度表示される。

# キーボードショートカット

`toggle.window.commandCenter`の項目に設定することで、有効化と無効化を行うことができる。

・・・いや、command centerへアクセスするショートカットを設定したい。

キーボードショートカット欄で探してみたものの、これ以外でcommand centerに関するものは見つからなかったので、なさそう。

# 終わりに

いつも適当に非表示にすると後で、戻したいけど機能の名前が分からない！ということが多いので、メモ含めて書いた。

ただ、macでフルスクリーンにした際、タブを切り替えるために上にカーソルを持っていくと、
OSのメニューバーが表示されてしまうという事故を防ぐ程度の幅があるので、地味に便利かも？と思っている。

(フルスクリーン以外の時は普通のメニューバーが存在するので、ほぼ幅サイズが変わらないことは全て書き終わった後に気がついた。)

# 参考

[Visual Studio Code August 2023](https://code.visualstudio.com/updates/v1_82#_command-center-now-on-by-default)
MAUI Tips - ナビゲーションバーの消し方

2023.09.10 記載に誤りがあったので（盛大に勘違いしてました）修正済み。

# 概要

これまでXamarin.Formsで作っていたアプリを、一念発起して.NET MAUIで作り直す中で
調べたことの備忘録。


# 環境

Visual Studio for MAC
.NET MAUI
.NET 7

# 問題となった現象
追加したContentPageのXAML側に、NavigationBarを消す処理を入れたけど、
消えない・・・。

``` xml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PIYOTCloud.LoginPage"
             Title="LoginPage"
             Shell.NavBarIsVisible="false"
             >
```

# 調べたこと
上記のコードは、[Microsoft Learnのページ](https://learn.microsoft.com/ja-jp/dotnet/maui/fundamentals/shell/pages?wt.mc_id=AZ-MVP-4028478#disable-the-navigation-bar)を見て追加しました。

これ、完全に私が悪いんですが、Shellを使う場合とNavigationPageを使う場合で、
ナビゲーションバーの指定の仕方が違うんですね。
→そりゃそうだ。

Shellを使っている場合は上記のコードでいいんですけど、
NavigationPageを使用している場合は、以下のように　
「 **NavigationPage.HasNavigationBar="false"** 」と指定する必要があります。

``` xml
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="PIYOTCloud.LoginPage"
             Title="LoginPage"
             NavigationPage.HasNavigationBar="false"
             >
```

→ShellからNavigationPageに変えた段階で気づけよって話なんですけどね・・・。
PL/SQL④:行全体のデータを扱う

### 処理の流れ

%ROWTYPE属性で行全体のデータを扱う

### ソースコード(実行結果含む)

```
 DECLARE
  d_row_data dept%ROWTYPE;
 BEGIN
  SELECT deptno,dname,loc INTO d_row_data FROM dept WHERE deptno = 10;
  DBMS_OUTPUT.PUT_LINE(d_row_data.dname);
 END;
 /
ACCOUNTING
```

### メモ

・データの代入は必ずすべてのフィールドに行われるようにする
AIで胸部x線の画像診断〜その１〜

## 動機
放射線科医不在の外勤先で、健診などで胸部x線の画像の読影をする機会が多い。AIによる読影がどの程度のものなのか興味がある。

## 使い方
"Load image"ボタンで読影して欲しい画像を読み込み。Aに読み込み画像を表示。疾患名とその疾患である確率をBに表示。Bの疾患名をクリックするとCにその疾患に割り当てられた根拠がヒートマップとしてCに表示(下図のCはBの"Mass"をクリックした結果)。

![スクリーンショット 2023-08-13 131957.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612743/b9504c53-9198-0213-dfa8-9de8ce39d2db.png)

## 使用モデル
arXivに公開されている論文に記載のモデルを使用[^1]。torchxrayvisionとしてパッケージ化されており、再配布可能なライセンスで公開されている。実装については次記事以降で述べる。
具体的な成績については下記とのこと。縦軸がデータセットで横軸がモデル名。今回は一番右の列の"All"のモデルを使用している。食道ヘルニアや胸水の診断については優秀そうだが、結節影や骨折の診断は苦手そう。
![auc-all.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/612743/c68d1510-4c5b-cc53-92ec-a00cbf70246e.jpeg)




## 感想
紛らわしい症例については結局50%程度の確率になってしまい、得られる情報は少ない。結局健診で悩ましいような画像は再検査に回してCTを撮ってもらうしかないか。残念。。。
例で示してるようなMassなんて誰が見ても明らかやねんから、90%以上の確率で診断してくれよ。ただ見落としの防止については一定の効果があるかも？
モデルをもっと有効なものに入れ替えるなり改善すれば、もうちょっと優秀になるかな。


今回の成果物についてはソースコードとpyinstallerでexe化したものをgithubにて公開しています。(https://github.com/Gacky1031/torchx_gui/tree/master) 
この成果物は教育用のものであり、実際の医療診断には使用しないでください。
具体的な実装については次記事以降で記載します。


[^1]: Cohen, J. P. et al. TorchXRayVision: A library of chest X-ray datasets and models. Preprint at http://arxiv.org/abs/2111.00595 (2021).
git switchについて知ろう

今回は、`git switch` と `git checkout` コマンドの違いと、`git switch` を使ってコミットの移動をしてみたサンプルをお見せします。

## 1. git switch と git checkout の違い

`git switch` と `git checkout` はいずれも、ブランチやコミットの切り替えに使用されるコマンドです。しかし、Git 2.23.0以降で導入された`git switch`コマンドは、ブランチの切り替えとコミットのチェックアウトを専門としたコマンドです。
ブランチを切り替えることはどちらのコマンドでも同じです。

1. **git checkout**
   - ブランチやコミットの切り替えと作業ディレクトリのファイルの復元を行うことができる。
   - 新しいブランチの作成と切り替えを一度に行うことができる（`-b` オプションを使用）。

2. **git switch**
   - 主にブランチ、コミットの切り替えに特化している。
   - 新しいブランチの作成と切り替えを行うことができる（`-c` オプションを使用）。

## 2. git switch でコミットを切り替えてみる
※checkoutでも同様のことができますが、今回はswitchで試しています。

`git switch` コマンドを使用して特定のコミットに移動すると、「detached HEAD」状態に入ります。

### 2.1 Detached HEAD 状態とは？

Detached HEAD状態は、ブランチポインタを使用せずに特定のコミットを直接指し示す状態を指します。この状態で新しいコミットを作成すると、そのコミットは任意のブランチに関連付けられず、後から見つけるのが困難になります。

### 2.2 サンプル
`git log --oneline`を使用してコミット履歴を確認して詳しく見ていきます。
1. **コミット履歴の確認**： 初めに `git log --oneline` を使ってコミット履歴を確認します。
コミットIDは適当です。
   
   ```
   h23iu2hi4 <- HEAD
   5hiu3h5i3
   2j3oi2j3o2
   ```

2. **過去のコミットへの切り替え**： 次に、`git switch 2j3oi2j3o2` コマンドを使って最も古いコミットに切り替えます。

3. **新しいコミットの作成**： この状態で新しい作業を行い、新しいコミットを作成します。

4. **元のブランチへの戻り**： 最後に、`git switch -` コマンドを使って元のブランチに戻ります。

この状態で `git log --oneline` を実行すると、新しいコミットは表示されず、コミット履歴は元の状態に戻ります。

### 2.3 新しいコミットはどうするのか

新しいコミットを保持するためには、detached HEAD状態で新しいブランチを作成すると良いです。この方法では、新しいコミットは新しいブランチに関連付けられます。

```git
# 過去のコミットに移動
git switch 2j3oi2j3o2 

# 新しいブランチを作成
git switch -c new_branch 

# 新しい作業を行ってコミット
# ...

# mainブランチ（または他のブランチ）に戻る
git switch main 

# この状態で git log を行うと、新しいブランチとそのコミットはまだ表示されません。
# 新しいブランチに切り替えると、そこでの作業履歴を確認できます。
git switch new_branch
git log --oneline

```

`new_branch`を作成した時点でのベースは`2j3oi2j3o2`コミットだったので、そのブランチのコミット履歴にはそのコミットと、それから派生した新しいコミット（新しく作成したコミット）だけが表示されます。

つまり、`git log --oneline`を実行すると、以下のような履歴が表示されます。

```
<新しいコミットID> (新しいコミットメッセージ)
2j3oi2j3o2 (2j3oi2j3o2のコミットメッセージ)
```

`h23iu2hi4`と`5hiu3h5i3`コミットは、この`new_branch`ブランチの履歴には含まれません。これらのコミットは、元のブランチ（例：`main`）の履歴に残っています。この`new_branch`は`2j3oi2j3o2`コミットから分岐した新しい歴史を作成しているので、それ以降のコミットは含まれません。

`new_branch`を元のブランチにマージすることも可能ですが、その場合はマージコンフリクトが発生する可能性があります。

### まとめ
今回はswitchを使った作業のサンプルをお見せしました。
AWS CLI/CFnでRoute53にCloudfrontのエイリアスレコードを作る場合は固定値が必要

こんにちは。Kaneyasuです。

本記事は過去にZennで書いた記事のリライトです。
CloudFrontで作ったディストリビューションは、Route53にエイリアスレコードを作ることで、独自ドメインでアクセス可能になります。
Route53にエイリアスレコードを作る作業は、AWS CLIやAWS CloudFormationでコード化できますが、一点わかりにくいポイントがあるので、共有します。

# AWS CLIの場合

AWS CLIでRoute53にDNSレコードを作るには、`aws route53 change-resource-record-sets`を使用します。

https://docs.aws.amazon.com/cli/latest/reference/route53/change-resource-record-sets.html

`aws route53 change-resource-record-sets`コマンドはパラメーターとして、ホストゾーンIDとDNSレコードの内容を記載してJSONファイルを渡す仕様です。

```bash
aws route53 change-resource-record-sets --hosted-zone-id {Route53のホストゾーンID} --change-batch file://sample.json
```

ホストゾーンIDは、`aws route53 list-hosted-zones`コマンドで調べることができます。

https://docs.aws.amazon.com/cli/latest/reference/route53/list-hosted-zones.html

DNSレコードの内容を記載するJSONファイルのサンプルはこちらです。
記載方法は、上述の`aws route53 change-resource-record-sets`のリファレンスのページに例があります。

```json:sample.json
{
     "Comment": "Creating Alias resource record sets in Route 53",
     "Changes": [{
                "Action": "CREATE",
                "ResourceRecordSet": {
                            "Name": "cdn.example.com",
                            "Type": "A",
                            "AliasTarget":{
                                    "HostedZoneId": "Z2FDTNDATAQYW2",　
                                    "DNSName": "xxxxxxxxxxxxx.cloudfront.net",
                                    "EvaluateTargetHealth": false
                              }}
                          }]
}
```

このJSONファイルには、CloudFrontのディストリビューションに対し、エイリアスレコードを新規作成することを書いています。
冒頭で書いた「わかりにくいポイント」とはここのことです。

```json
"HostedZoneId": "Z2FDTNDATAQYW2",　
```

CloudFrontのディストリビューションに対し、エイリアスレコードを作る場合は、ホストゾーンIDに固定値`Z2FDTNDATAQYW2`を書くのが仕様です。
IDを指定する欄で、固定値を書くと言うのは珍しいですが、本当にこういう仕様です。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-route53-aliastarget.html#cfn-route53-aliastarget-hostedzoneid

> CloudFront distribution
> Specify Z2FDTNDATAQYW2. This is always the hosted zone ID when you create an alias record that routes traffic to a CloudFront distribution.

# AWS CloudFormationの場合

こちらはAWSのリファレンスページに正解が載っています。

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/quickref-route53.html#w4ab1c23c21c84c11

やはりホストゾーンIDに固定値`Z2FDTNDATAQYW2`が書かれています。

# ChatGPTに問い合わせた場合

2023年9月現在、ChatGPTにCloudFrontで作ったディストリビューションは、Route53にエイリアスレコードを作りたいと問い合わせれば、ホストゾーンIDに固定値を書くのも含めたサンプルが返ってきます。

![ChatGPTへの質問](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/0bee1316-97ae-7d93-ce27-eedcab5c265e.png)

![ChatGPTの回答](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1959433/2fed5fe3-bf40-531f-9a91-4d8eab39d780.png)

```json
"HostedZoneId": "Z2FDTNDATAQYW2", # CloudFrontのHostedZoneID
```

ただし、ChatGPTの回答は「CloudFrontのHostedZoneID」という若干わかりづらい表現をしています。
大丈夫なのですが、初見だと誤解する可能性があると感じます。
この部分の裏取りの一助となればいいなあと、本記事を書きました。
参考になれば幸いです。
Rust install

Rust(1.72.0)インストール後下記のエラーメッセージが表示された。
>error: linker `link.exe` not found
  |
  = note: program not found
note: the msvc targets depend on the msvc linker but `link.exe` was not found
note: please ensure that Visual Studio 2017 or later, or Build Tools for Visual Studio were installed with the Visual C++ option.
note: VS Code is a different product, and is not sufficient.

### Window 11
scoopでRust開発環境を設定する
```powershell
scoop install rust
scoop install rustup
rustup toolchain install stable-x86_64-pc-windows-gnu
rustup default stable-x86_64-pc-windows-gnu
```
hello world
```
cargo new hello
cargo new hello --vcs none // no git
cd hello
cargo run
```

## Dependency manage tool
1. install cargo-edit
`cargo install cargo-edit`
2. Add pakages
`cargo add num`

## Generate doc
```shell
cargo doc
cargo doc --open
```

### Windows10 or Windows 11
Even you did as the same as the steps above, it still maybe report error.
I encountered such "linker.exe" on Windows10 
Using Tauri on window11, it showed
>  package.metadata does not exist

Follow these steps, though I didn't want to install Visual Studio Build Tools because it't too big, I haven't found any other better method.
* Install Visual Studio Build Tools with "Desktop development with C++" checked. Then
```
rustup target remove x86_64-pc-windows-gnu
rustup target add x86_64-pc-windows-msvc
rustup default stable-msvc
```

### Windows で最も簡単なやり方
* [Visual Studio 2022をインストール](https://rust-lang.github.io/rustup/installation/windows-msvc.html#installing-only-the-required-components-optional)
* [rustup-init.exeを利用する](https://rustup.rs/)


### Windows Subsystem for Linux: Ubuntu
As the official guide: `curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh`
Then it maybe report this error.
>cargo run
   Compiling hello v0.1.0 (/home/ldk/hello)
error: linker `cc` not found
  |
  = note: No such file or directory (os error 2)
error: could not compile `hello` (bin "hello") due to previous error

Install this package and try again
```
sudo apt-get update
sudo apt install build-essential
```

`cargo install cargo-edit`
It maybe report such error:

>error: failed to run custom build command for `openssl-sys v0.9.93`
Caused by:
  process didn't exit successfully: `/tmp/cargo-installaGSe6L/release/build/openssl-sys-c43e78ad5c62ea2e/build-script-main` (exit status: 101)

Run this command and try again
`sudo apt install pkg-config libssl-dev`

When you use `xlsxwriter`, you may encounter such error:
>thread 'main' panicked at 'Unable to find libclang: "couldn't find any valid shared libraries matching

Run this command and try again
`sudo apt-get install libclang-dev`

Show Rust documents
`rustup doc --std`
Update Rust
```shell
rustup -V
rustup update
```
Thymeleaf+VUE+springboot+mybatis+MySQLー概要図

# 概要図
![3-5-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480807/e6d34a49-2ed0-f203-47a4-ec1ba0a35743.png)
### Thymeleaf View
　画面表示用。今回のシステムはThymeleafを利用して画面表示を実装する。Data bindingは静的なVUEを利用する。画面様式はBootstrapを利用する。
### Springboot
　SpringbootはJava言語の環境化で使用できるWebアプリケーションの開発をサポートするフレームワークです。
　今回のシステムバックグラウンドフレームワークはSpringbootです。
### MyBatis
　カスタム SQL、ストアドプロシージャ、高度なマッピング処理に対応した優れた永続化フレームワークです。 MyBatisを使うことで、直接 JDBC を扱うコードを書いたり、クエリ引数やクエリ結果を手動で設定する必要がほとんどなくなります。
　今回のデータ永続化の実現はMyBatisを利用する。
### MySQL
　RDSMはMySQLを利用する。

# ソフトウェア
###　JDK
　JDK:17

### RDSM
　RDSM:MySQL
[おすすめ]新米flutterエンジニアがリータブルコードを読んだ感想






## 読んだ書籍


「**リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)**」


https://www.amazon.co.jp/%E3%83%AA%E3%83%BC%E3%83%80%E3%83%96%E3%83%AB%E3%82%B3%E3%83%BC%E3%83%89-%E2%80%95%E3%82%88%E3%82%8A%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8F%E3%81%9F%E3%82%81%E3%81%AE%E3%82%B7%E3%83%B3%E3%83%97%E3%83%AB%E3%81%A7%E5%AE%9F%E8%B7%B5%E7%9A%84%E3%81%AA%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-Theory-practice-Boswell/dp/4873115655


## この書籍の対象読者

自分は、エンジニア歴2年弱のアプリエンジニアです。

この本を読む前までは、正直なんとなくコードを書いていて、コードレビューも指摘をされることも少なくは無かったです。
ですが、ふとしたきっかけでこの本を知り、何度も読み返すうちにコードを書く上でも
**心構え**というか、自分の中に芯みたいなのが徐々にできていった気がします。

**ですので自分と同じように経験年数が浅いエンジニアや、年数に関係なく、なんとなくコードを書いている時間のある方や、レビュー指摘を頻繁に受けてしまう方などは一読する価値はあるかもしれません。**

>また上記のような自覚のない方でもこの書籍はかなり有名なので、この本をバイブルのように扱っているエンジニアも多く、他のエンジニアの方の思考を理解するためにも参考になるかもしれません。



## 個人的に参考になったこと。

### 命名法について

関数名や変数名の命名っ地味にめんどくさいですよね、人や、プロジェクトによって志向が変わったりもしますし、、

以下にこの書籍で参考になった部分を記載していきます。

##### 1,より明確な単語を選択する

getより、Downloadやfetchの方が具体的だよねって話です。
またよくあるのが、名前にsizeなどを使いがちですが、具体的にどんな単位のサイズなのか例えば、***:_msのように具体的な単位を使った方がわかりやすことが多々ある。

```dart
//悪い例
void getData() {
//////
}

//良い例
void fetchData() {
//こっちの方が具体的
}
```

##### 2,長い名前が悪いというわけではない

冷静に考えてみれば**今のエディタには単語の補完機能がついているので名前が長いこと自体は意外とそんなに問題じゃない。**

この指摘を受けて確かに。。とハッとしてしまいました。
名前を変に短くするのにこだわるより、わかりやすいことに執着すべきというのが勉強になりました。

逆にいうと、限定的なスコープでしか使われない部分的な変数などは、短い簡易的な名前でも構わないということ。

要は使い分けが大事ということですね。
ここら辺がとても勉強になりました。

### コメントについて

##### 1.読み手の立場となって考える。

コードを書いているときはもちろん自分で書いているので、
なぜそのコードを書いたのか鮮明に理解することができるが、
他人がそうとは限らないし、**半年後の自分も例外ではない。**

ですので、読み手が質問してきそうなことを想定してコメントを残しておくことが大事。

##### 2.自覚しているコードの欠陥や改善点がある場合はコメントを残しておく。

プロジェクトの都合や、工数などの問題で改善できる点がありながら追加で実装する余裕がない場合などがあると思います。

そんなときは**todo:で未来の自分のためにコメントをしておく。**


##### 3.定数に関してコメントを残す。

もちろんなぜその定数を採用しているか自明な場合は必要ないと思う。

しかし、なぜその値を採用しているのかわからない場合は、コメントを残しておくといい。

```dart
const tableNumber = 8; ///tableNumber > 2であれば問題ない。

const image_quality = 0.72; ///この値であればファイルサイズや品質の面で妥協できる。
```

上記の場合など一見必要ないコメントに見えるが、他人からするとなぜこの定数が8や0.72であるべきなのか一瞬考える必要が出てくる。

このコメントがあると確かに親切になる！


### 関数の書き方について。


##### 1.巨大な関数はできるだけ分割する。


何か複雑なロジックを実装する際にある一つの関数に依存し、何かと関数が肥大しがちでした。~~（新米エンジニあるある？）~~

一つの関数は一つのタスクを消費するためにあるべきという原則は言われてみれば当たり前ですが、改めて言われると、ぎっくとしてしまうこともあります。
気をつけねば。

ただし、上記の原則を常に厳守していると無闇に関数の数が増え続けてしまいます。。


##### 2.空行を使って大きなブロックを段落に分ける。

そこで関数の中にも段落を使って大きなブロックごとで分けることで、
責務をブロックごとに分け、可読性を高めるのが有効です。
当たり前ですが、大事なことですね。

```dart:良い例
void hogeHogeMethod() {

//責務A
print('A');

//責務B
print('B');

//責務C
print('C');

//責務D
print('D');
}
```



```dart:悪い例
void hogeHogeMethod() {

print('A');
print('B');
print('C');
print('D');

}

```



##### 3.グローバル変数はなるべく書かない、スコープを縮める。

グローバル変数を多用すると、意図せぬ変更が行われたり、多くのバグの温床になります。

普段からグローバル変数を多用しないように気をつけてはいますが、使用する変数はその変数を使用するスコープ内で宣言するようにし、なるべく他のクラスや関数から呼び出せないような書き方を心がける。

```dart:良い例
void hogeHoge() {

final hogeNumber = 1;
print(hogeNumber);

}
```


```dart:悪い例
final hogeNumber = 1;

void hogeHoge() {

print(hogeNumber);

}
```


### まとめ

正直この書籍に書かれていることは基礎的なことが多く、
エンジニアなら一度は聞いたことがあるような内容だと思います。
ただ、本当に大事なことは書籍に書かれていることを当たり前に実行できるかどうかだと思います。
そういう意味では、この書籍を繰り返し読んで習慣にしていくことに意味があるんだと思います。
つまりこの本おすすめってことですね。~~（回しものではない）~~
世の中には二種類のエンジニアがいる。電話が鳴った時に取るやつと取らないやつだ。

※普段から感じているモヤモヤ感を垂れ流すだけの記事です。

オフィスの電話が鳴った時にどうしてますか？
私は電話を取る側のエンジニアなのですが、世の中には取らない側の方たちもいらっしゃいます。

## 新人エンジニア時代
電話が鳴った瞬間に取ってました。
新人がとるものだと思っていましたし、
「***自分ができる仕事なんて電話を取るくらいしかない***」と感じていたがゆえの行動です。

この時はモヤモヤは感じていません。

## エンジニア2年目
1人の後輩ができました。
その後輩は電話が鳴ってもあまりとろうとしません。
その後輩が取らないので、相変わらず私が電話を取っていました。
このあたりから、少しモヤモヤが募ってきました。
「***電話って新人が取るものじゃないの…？***」と思っていたからです。

## リーダー／中堅エンジニアになってから
多くの後輩ができました。
後輩の種類を2つに分けるとすれば、「電話を取ってくれる後輩」と「電話を取らないやつ」です。
モヤモヤ感は相変わらずです。

## 新人のうちは積極的に電話を取ろうぜ
私の主張としては、「***新人は積極的に電話をとりましょう。***」につきます。
ここでいう「***新人***」というのは何も「新卒」だけではありません。
中途採用であっても、その職場の勝手には慣れていないという意味では「***新人***」です。

「***電話を取る側***」の人間から見た「***電話を取らない新人***」の評価は著しく低いです。
仕事ができるならまだしも、たいして仕事もできない新人が「***誰でもできる仕事***」である電話を取らないというのは、「***業務に対する積極性が足りない***」とみなされてしまいます。（少なくとも私はそうみなします）

新人のうちは積極的に電話に出ましょう。
MAUI Tips - イメージファイルの追加時の罠？

# 概要
これまでXamarin.Formsで作っていたアプリを、一念発起して.NET MAUIで作り直す中で
調べたことの備忘録。

# 環境
Visual Studio for MAC
.NET MAUI
.NET 7

# 問題となった現象
Microsoft Learnの[.NET MAUI アプリ プロジェクトにイメージを追加する](https://learn.microsoft.com/ja-jp/dotnet/maui/user-interface/images/images?wt.mc_id=AZ-MVP-4028478)を参考に、
イメージファイル（SVGファイル）を追加して見たんですが、
BaseSize指定してもイメージのサイズが変わらない・・・。

csprojファイルでの指定はこんな感じ

``` xml
<ItemGroup>
    ・・・
    <!-- Images -->
	<MauiImage Include="Resources\Images\*" />
	<MauiImage Update="Resources\Images\dotnet_bot.svg" BaseSize="168,208" />

    <!-- これが追加したコード -->
	<MauiImage Include="Resources\Images\icon_settings.svg" BaseSize="24,24" />
    ・・・
</ItemGroup>
```

# 検証したこと
動作原理の詳細は把握できていないのですが、
上記のコードの

``` xml
    <MauiImage Include="Resources\Images\*" />
```

で、Imagesフォルダ配下のファイルがプロジェクトに取り込まれているので、
その後に同じフォルダ内のファイルを「 **Include** 」しても、そこでの設定は反映されない模様。

``` xml
	<MauiImage Include="Resources\Images\icon_settings.svg" BaseSize="24,24" />
```
・・・そもそも再度「Include」って必要がないですよね・・・。
取り込み済みのファイルの設定は「 **Update** 」を指定するようです。
``` xml
	<MauiImage Update="Resources\Images\icon_settings.svg" BaseSize="24,24" />
```

# 気になったこと
プロジェクトを新規作成すると、プロジェクトファイルに以下の設定がデフォルトで行われてるんですよね。
``` xml
    <MauiImage Include="Resources\Images\*" />
```
これはこれで親切な設定といえば親切なんですけど、
Microsoft Learnのページにも注記しておいて欲しいですよね。

テンプレートで新規作成した場合は、上記の設定が入ってるから、
サイズ変更指定したかったらUpdate使ってね・・・とか（汗）。
python 年-月-日を分ける

[・はじめに](#はじめに)
[・データセット](#データセット)
[・object型からdateitme64ns型へ変換](#object型からdateitme64ns型へ変換)
[・年、月、日に分割](#年、月、日に分割)
[・まとめ](#まとめ)



# はじめに
データフレームによくある年-月-日の日付。見やすくて良いのだが、実際にデータ分析をするとなると年、月、日が１個のオブジェクトになっている為扱いにくくなってしまいます。

そこで年、月、日で分割し、それぞれ新しいカラムとしてデータフレームに格納する手法を記載したいと思います。

# データセット
カレーの印象が強いインドのデリー市の気象データを使います。
kaggleから取ってきました。
```ruby
df = pd.read_csv('/kaggle/input/daily-climate-time-series-data/DailyDelhiClimateTest.csv')
df.head()
```
###
![2023-09-10 11.37のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190793/953ca00a-07e4-9a8c-254c-5ee3143daa75.jpeg)
###

# object型からdateitme64ns型へ変換
```ruby
print(df.dtypes)

date             object
meantemp        float64
humidity        float64
wind_speed      float64
meanpressure    float64
dtype: object
```
データフレームにある日付は、object型なのでdatetime型に変換してから、各々分割していきます。
```ruby
df['date'] = pd.to_datetime(df['date'])
print(df.dtypes)

date            datetime64[ns]
meantemp               float64
humidity               float64
wind_speed             float64
meanpressure           float64
dtype: object
```
これで、datime型に変換されました。

# 年、月、日に分割
```ruby
import datetime as dt

#年を抽出
df['year'] = df['date'].dt.year
#月を抽出
df['month'] = df['date'].dt.month
#日を抽出
df['day'] = df['date'].dt.day

#週の初めから数えて何日目か
df['day_of_week'] = df['date'].dt.dayofweek
#年の初めから数えて何日目か
df['day_of_year'] = df['date'].dt.dayofyear

df = df.drop(['humidity','wind_speed','meanpressure'],axis=1)
df.head()
```
年月日に加えて、週始め、年始めから数えて何日目かも入れてみました。
時系列分析では、平日休日で周期性を掴める可能性もあるのでdayofweekとdayofyearも合わせて覚えておくと便利だと思います。
###
![2023-09-10 11.53のイメージ.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3190793/5bca74c4-c410-afba-8858-2f2d755e1a3d.jpeg)
###

# まとめ
インドのデリー市気象データを使って、日付データの年月日の分割手法を記載しました。
今回は気象データなので休日や平日は関係ないですが、売り上げ予測などで海外のデータを扱う機会があれば、hoildaysモジュールを使って日付の分割、平日休日の分割をすることができるので、時系列分析の幅が広がると思います。holidaysモジュールを使えば各国の休日を取得することが可能です。

データ分析初学者なりに日付の分割手法を記載いたしました。
ありがとうございました。
参考文献 : [デリー市気象データ](https://www.kaggle.com/datasets/sumanthvrao/daily-climate-time-series-data)
Blue Prismを使ってみた

 少し使いづらそうなので、初期の「Blue Prism」でRPAを構築してみた。

# プロセスの作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/11a87ff0-71b4-b692-8599-f5185fdf3645.png)

この「作成」を押下する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/d78fba57-0eb9-285a-a21d-7a4fb5988063.png)

プロセス名を入力して「次」を押下

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/f88a03f9-a395-5904-c858-18c4ad8559d9.png)

「プロセスの説明」に入力して「終了」を押下

そうすると、以下のようにプロセスができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/d1766be8-0380-12e8-cd07-65e3ba614580.png)

# 更新その他

出来たプロセスをダブルクリックすると以下の画面が出てくる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/03f5aaa9-2a7d-c5d4-2509-578348487841.png)

この画面でいろいろと構築できるみたいです。

使用感としては独特で、他のRPAに比べて慣れるまで時間がかかりそうなものという風に感じました。訓練プログラムが欲しいですかね・・・・。
ABC319をPythonで（A~E）

[AtCoder Beginner Contest 319](https://atcoder.jp/contests/abc319 "ABC319")の解答と簡易的な解説を書きました。

# A問題
問題文に書いてあるのをコピペする。
```python:A問題
s = {"tourist":3858,
"ksun48":3679,
"Benq":3658,
"Um_nik":3648,
"apiad":3638,
"Stonefeang":3630,
"ecnerwala":3613,
"mnbvmar":3555,
"newbiedmy":3516,
"semiexp":3481}
print(s[input()])
```
# B問題
各iについて全探索する。
```python:B問題
n = int(input())
ans = ["-"] * (n + 1)
for i in range(n + 1):
    for j in range(1, 10):
        if n % j == 0 and i % (n // j) == 0:
            ans[i] = str(j)
            break

print("".join(ans))
```
# C問題
本番は根性で全探索した。
```python:C問題
from itertools import permutations

c = [list(map(int, input().split())) for _ in range(3)]

total, ans = 0, 0
for p in permutations(range(9)):
    total += 1
    check = [[False] * 3 for _ in range(3)]
    flag = True
    for p_i in p:
        x, y = p_i // 3, p_i % 3
        check[x][y] = True
        a, cnt_a = set(), 0
        b, cnt_b = set(), 0
        for i in range(3):
            if check[x][i]:
                a.add(c[x][i])
                cnt_a += 1
            if check[i][y]:
                b.add(c[i][y])
                cnt_b += 1
        if (len(a) == 1 and cnt_a == 2) or (len(b) == 1 and cnt_b == 2):
            flag = False
        if x == y:
            a = {c[i][i] for i in range(3) if check[i][i]}
            if len(a) == 1 and sum(check[i][i] for i in range(3)) == 2:
                flag = False
        if x + y == 2:
            a = {c[i][2 - i] for i in range(3) if check[i][2 - i]}
            if len(a) == 1 and sum(check[i][2 - i] for i in range(3)) == 2:
                flag = False
    if flag:
        ans += 1

print(ans / total)
```
# D問題
2分探索

ミスが起きないように、事前に空白分+1しておき解答時に-1する。
```python:D問題
n, m = map(int, input().split())
L = list(map(lambda x:int(x) + 1, input().split()))

def calc(x):
    res = 1
    now = L[0]
    if now > x:return float("inf")
    for l_i in L[1:]:
        if x < l_i:
            return float("inf")
        if now + l_i <= x:
            now += l_i
        else:
            res += 1
            now = l_i

    return res


ok, ng = 10 ** 16, 0
while abs(ok - ng) > 1:
    mid = (ok + ng) // 2
    if calc(mid) <= m:
        ok = mid
    else:
        ng = mid

print(ok - 1)
```
# E問題
移動時間は、開始時間mod pで周期的に変わる
このpは、バスの出発時間p_iの最小公倍数


```python:E問題
from math import lcm

n, x, y = map(int, input().split())
buss = [list(map(int, input().split())) for _ in range(n - 1)]
p = 1
for p_i, _ in buss:p = lcm(p, p_i)

def solve(i):
    now = i + x
    for p_i, t_i in buss:
        now = (now + p_i - 1) // p_i * p_i + t_i
    return now + y - i

data = [solve(i) for i in range(p)]

for _ in range(int(input())):
    q = int(input())
    print(data[q % p] + q)
```
ciパイプラインの見直しによって、テスト環境へのデプロイの時間を10分近く短縮するのに成功した経験談

こんにちは！株式会社OPTiMに所属しております川田剣士です。最近の業務でciパイプラインを見直したことによって、テスト環境へのデプロイにかかる時間を10分近く短縮することに成功しまして、こちらの経験を皆さんにも共有したく技術執筆をしようと思いました。記事に対する質問・コメント大歓迎です！

# 目次
- [タスクを取り組むに至った背景](#タスクを取り組むに至った背景)
- [採用した解決方法](#採用した解決方法)
- [終わりに](#終わりに)

## タスクを取り組むに至った背景
元々、ciパイプラインは以下のような戦略を取っていました。

- MergeRequest作成時
  - checkstyleのvalidationを自動実行(code-validate job)
  - 全テストを自動実行(test job)
  - coverageの測定を自動実行(coverage job)

- MergeRequestをdevelopブランチにmergeする時
  - test stage
    - checkstyleのvalidationを自動実行(code-validate job)
    - 全テストを自動実行(test job)
    - coverageの測定を自動実行(coverage job)
  - build stage
    - docker imageの作成を自動実行。このjobで作成されるdocker imageのtagをtest用のhelmfileに指定することでテスト環境へのデプロイを行う。(docker-build job)
  - test stageのjobが全て完了してから,build stageのjobが実行される。

上記の戦略だとテスト環境へデプロイするためにはtest stageのjobが全て終わり、その後実行されるdocker-build jobが完了するを待つ必要があります。そのため、以下のような課題が存在していました。
- 普段のテスト環境へのデプロイ作業に時間がかかる。
- テスト環境でエラーが発生した時のエラー解決の仮説検証のサイクルが遅い。

この問題を解決することでチーム全体のテスト環境へのデプロイ作業の効率化を目指しました。

## 採用した解決方法
私が採用した解決方法を以下に記載します。
- MergeRequest作成時のciパイプラインは変更しない。
- MergeRequestをdevelopブランチにmergeする時のciパイプラインに関して、test stageとbuild stageを1つのstage(build_and_test stage)に統一させた。
- build_and_test stage内の全てのjobを並列実行させた。(ciパイプラインで利用しているサーバーは高性能であるため、並列実行は問題なく可能)

上記の戦略を取ることで、test stageのjobが全て完了するのを待つことなく、docker-build jobが完了した時点でテスト環境へのデプロイができるようになりました。しかし、この戦略を取ることのデメリットはcode-validate jobやtest jobが落ちた状態でテスト環境にデプロイされる可能性があるということです。ただし、MergeRequest作成時にcode-validate jobやtest jobが成功し、かつMergeRequestをdevelopブランチにmergeする時にcode-validate jobやtest jobが失敗する頻度自体はかなり低いです。また、仮にcode-validate jobやtest jobが失敗した状態でテスト環境にデプロイしたとしても、デプロイ対象はテスト環境であるため、後からjobが落ちた原因を治し再度デプロイすれば問題ないと判断しました。このような戦略は本番環境へのデプロイなどではできませんが、テスト環境のように失敗しても許される環境だからこそ取れる戦略です。

上記の案を開発チーム全体に共有し、合意が取れたため採用することとなりました。
test stageのjobは全て完了するのに10分ほどかかっており、テスト環境へのデプロイ作業は1週間で平均数十回はあるため、今回のパイプライン戦略でデプロイ作業の効率化に大きく貢献できたかなと思います。

## 終わりに
最後まで読んでいただき、ありがとうございます！
MAUI Tips - VerticalStackLayoutのパラメータ

# 概要
これまでXamarin.Formsで作っていたアプリを、一念発起して.NET MAUIで作り直す中で
調べたことの備忘録。

# 環境
Visual Studio for MAC
.NET MAUI
.NET 7

# 問題となった現象
新しく追加されたLayout「VerticalStackLayout」について。
StackLayoutのOrientationがVertical設定になっているだけだと思っていたけど、
VerticalOptionのFillAndExpandが効かない・・・。

Start / Center / Endは効いているんだけど・・・。
Expandが効かない。

# （一旦の）対策
StackLayoutにして、OrientationをVerticalに設定して使う（汗）。

# 気になったこと
Content Pageを新規作成したら、VerticalStackLayoutが初期コードが作られているので、
地味にハマりそう・・・。
if __name__ = "__main__"の役割

こんにちは、Mottyです。
久々のpython記事、第二弾です。

### if __name__ == '__main__' :とは

if __name__ == "__main__":という構文をよく見かけます。
これの意味は何なのでしょうか、というのを分解して見ていきます。

### __name_とは？

上記を見てもらえれば明らかですが、__name__はクォーテーションで囲まれていないので変数、"__main__"は
囲まれているので単なる文字列ということになります。
では__name__には何が格納されているのでしょうか。やはり"__main__"が入るのでしょうか。
デバッグして見ていってみます。


```main.py
    print(__name__)
```

出力結果:
```
__main__
```

どうやら、__main__が入っているようです。これはmain.pyをtest.pyやsample.pyに変えても同様の結果が得られます。では、絶対にtrue条件になると思われるif __name__ 
== "__main__"を記述する意味はあるのでしょうか。

一方でモジュールを分割したときのことを考えてみましょう。単に__name__を出力する関数を分割して作成し、main.pyにインポートして使ったときの結果を見てみましょう。

```module.py
def outputname():
    return __name__
```

```main.py
import module

if __name__ == "__main__":
    print(__name__)
    print(module.outputname()) # module.py内の__name__
```


出力結果:
```
__main__
module
```

上記のような出力結果が得られました。つまりコンソールから直接実行された場合はそのモジュールの__name__に__main__が、それ以外はモジュール名（ファイル名）が付与されるそうです。

### 結論
if __name__ == "__main__":を翻訳すると、「ファイルから直接実行された場合はif文以下のプログラムを実行し、それ以外の場合（他のモジュールから呼び出された場合）は実行しない、ということになります。
つまり、こういうことです。

```py
if __name__ == "__main__":
    print("this file was directly executed.")
else:
    print("this file was executed from outside")
```
コードレビューの観点整理

Javaのコードレビューという想定で、気をつけなければなあという観点を列挙していきます。  
粒度がバラバラだったりします。また、機能、非機能要件と区別していますがプロジェクトによっては、非機能要件であっても機能側の考慮に含まれていたりしますので考えやすく、覚えやすくするための便宜上のものになります。

# 大前提の観点
プロジェクトでルールがあればそれを守りましょうという観点。
- コーディング規約に則っているか
- Lintツールやフォーマッターが掛かっているか  

# 機能の観点
要件や設計の内容を過不足なく実装できているかを確認する観点。
- 権限やオブジェクトの状態、画面遷移などのパターンをすべて考慮できているか
- データ項目の過不足やデータの処理に漏れはないか
- エラーハンドリングが適切に実装できているか

# 非機能要件の観点
特性をどのように定義、分類分けするかの議論はありますが、「可読性」、「信頼性」、「拡張性」に分けて列挙します。

## 可読性  
- 適切な命名か
- コメントはつけられているか
- 説明変数や要約変数が良さそうな場合に使えているか
- try-catch文内で過剰にコードを含んでいないか
- 不要な一時変数がないか
- 早期リターンになっているか

## 信頼性
- トランザクションが正しく実装できているか
- セキュリティ問題のあるコードになっていないか
- 不要なライブラリ、異なるライブラリを読み込んでいないか
- 間違った依存関係になっていないか
- 過剰にオブジェクト生成していないか
- ループの中で全く同じことを繰り返していないか（特に外部アクセスを伴う処理）
- 大きなものをメモリに持とうとしていないか
- 変数のスコープが過剰に大きくなっていないか

## 拡張性
- 同じことをしている処理は同じ実装内容になっているか≒一貫性があるか（メソッド切り出しや継承で共通化されていること、最低限ベタ書きでもよいので同じ内容になっていること）
- 共通な処理はメソッドや継承で共通化できているか
- マスタがあるものはマスタから取得できているか
- ファイルパスや外部アクセスの接続先など環境依存するものを中心に設定ファイルに切り出せているか
- 定数化するものは定数化しているか
- 適切にクラス分けされているか
- クラスの役割は適切か
- 適切にメソッド分けされているか
- メソッドの役割は適切か
- ループやif文のネストが深くなりすぎていないか（目安は3階層）
- 変数の値がやむを得ない場合を除いて書き換えられていないか
Ruby lengthについて

# はじめに


#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>



## lengthとは何か



Rubyで文字列の長さ(文字数)・配列の要素数を調べるために使うメソッドです。


## lengthメソッドの使い方


### 文字列の長さを調べる場合



```
str = '123456789'
str.length
#=> 9
```


### 配列の長さを調べる場合


```
data = [1,2,3,4,5,6,7,8,9]
data.length
#=> 9
```

# まとめ



lengthとは長さのことです。Rubyでlengthは文字列の長さ、配列の長さを調べるためのメソッドです。
Databricksノートブックから直接Webターミナルを呼び出せるようになりました

地味に嬉しい機能。

ノートブックを開いた際に、右下にボタンが表示されるようになっています。
![Screenshot 2023-09-10 at 10.34.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/6fd5f72b-558f-9f9d-4873-3dc81e7d8b30.png)

こちらをクリックすると、画面下部に[Webターミナル](https://docs.databricks.com/ja/clusters/web-terminal.html)がオープンします。
![Screenshot 2023-09-10 at 10.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/9f429858-805a-37c7-9065-c7f1b2baadd1.png)

その他、別タブでWebターミナルを開くボタンや、Webターミナルをリロードするボタンが表示されます。
![Screenshot 2023-09-10 at 10.35.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/16b1b8f3-f264-57c1-31cb-f1c75c2777ca.png)
![Screenshot 2023-09-10 at 10.35.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/be4280bc-c055-4b7f-7f20-2171dcc1e440.png)

ドライバーノードのファイルを確認したり、`wget`でクイックにファイルをインターネットから取得したいケースがあったりするので、そう言った際の効率改善が見込めます。
![Screenshot 2023-09-10 at 10.36.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1168882/7f431295-7aff-0ac1-ffd0-e17162100f88.png)


### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)
【高先さんの電子工作】第5回：RP2040に内蔵されている温度センサーの値を取得する

https://youtu.be/t-1lCPEln_g

Raspberry Pi Pico Wに搭載されているRP2040チップには温度センサーが内蔵されているので、その値をMicroPythonを使って取得しています。

```python:main.py
import machine
import utime

sensor_temp = machine.ADC(4)
conversion_factor = 3.3 / (65535)

while True:
    # read_u16()では0〜65535の範囲で値が返ってくる
    # 65535のとき3.3Vになるように正規化している
    reading = sensor_temp.read_u16() * conversion_factor
    
    # The temperature sensor measures the Vbe voltage of a biased bipolar diode, connected to the fifth ADC channel
    # Typically, Vbe = 0.706V at 27 degrees C, with a slope of -1.721mV (0.001721) per degree. 
    # 電圧が基準値からどれくらいずれているかを計算して温度を測定している
    temperature = 27 - (reading - 0.706)/0.001721
    print(temperature)
    utime.sleep(2)

```
section, article, asideタグの使い分け

🌻セクショニング系タグ使い分け

💡section：
　　章や区切りなど。汎用的に使える

💡article：ひとつの記事。
　　記事一覧では記事タイトル毎で囲う。
　　(冒頭の本文テキストなどがあればそれも)

💡aside：補足情報。
　　サイドバーや広告など関連する情報を囲う

（画像は使用例です）

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/0dd8856a-cd7a-1e8e-20fe-54863cad26a5.png)

![Untitled2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/9235b1e9-cf1b-8f6d-917e-3293cd9c2380.png)
【入門者向け】Python in Excelが発表！そろそろプログラミング勉強すべき？

2023年8月にPython in excel が発表されました。X（旧Twitter）を見ていると「いよいよプログラミングを勉強するべき？」というポスト（ツイート）をいくつか拝見しました。流行りに乗ることはとっても良いことですが、本当に必要なのかどうかは考える必要があると思います。なので今回は簡単ではありますが、Python in Excel、VBA、マクロ、Pythonあたりをまとめたいと思います。

## 追記

動画バージョンを作成しました。パワーポイントにまとめていますので、聞き流したい方はこちらをご活用ください。

<iframe width="" height="400" src="https://www.youtube.com/embed/tyB0ateo_tk?si=YTRrLe9SGIej5I02" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

## Python in Excel
一言で言うと**アナリスト向け**と言った感じです。現状はMatplotlibやseabornを使った**グラフ作成**（棒グラフ、折れ線グラフ、ヒートマップなど）や、scikit-learnやstatsmodelsを活用した、**機械学習**の適用が可能です。コードはExcelの数式バーに書くことができ、環境構築も必要がないため、使い勝手はいいと思います。

:::note warn
Matplotlib、seaborn、scikit-learn、statsmodelsはライブラリといい、クラスや関数などがまとめられたものです。ライブラリを使うことで、自分で実装しなくても様々なプログラムを使うことができます。 
:::

![図解　ブログ用 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2638073/164d0eb2-78d2-0711-4847-a5d1522c6379.png)

2023年9月時点ではパブリックプレビュー版がリリースされており、使用するには「Microsoft 365 Insider」への加入が必要になります。「Microsoft 365 Insider」への加入には、Microsoft 365 サブスクリプションが必要です（Office 2019、Office 2021などの買い切りは不可）。

始めてみたい方はこちらをご確認ください。「Microsoft 365 Insider」への加入方法およびPython in excelの始め方を解説しています。
【動画Ver】

https://youtu.be/wAbvFJFKVyE?si=pZzm6-Nteo_RoaEL

【テキストVer】

https://arika-blog.com/pythoninexcel/

実際に機械学習を実装してみました

【動画Ver】

https://youtu.be/10w7vi91jlM?si=Hi-05shXdYU76-mv

【テキストVer】

https://qiita.com/python_academia/items/086340b5344493911dbe

## VBAとPython in Excelの違い
VBAとは、ExcelやWordなどのMicrosoft Officeアプリケーションの機能を拡張することができるプログラミング言語のことです。

VBAでできることと言えば、

- 転記作業の自動化
- データ集計やグラフの作成の自動化
- 請求書などの書類作成自動化
- メール送信の自動化
- フォルダを作成し、ブックを保存

などがあります。

つまりVBAはExcel操作全般の自動化ができるため、今回発表されたPython in Excelとは用途が違うことが分かります。

ちなみに**マクロ**という言葉もありますが、**マクロはコンピュータの処理を自動化する機能**を言います。そして、そのマクロを実行するための言語がVBAです。

## Pythonでできること（VBAとPythonの違い）
Pythonでできることは、

- Excel処理の自動化
- 物体検出
- RPA
- OCRを使ったPDF処理
- フォルダ操作
- メール送信
- スクレイピング

などがあります。

https://qiita.com/python_academia/items/96df81c3fe4094581908

VBAとの違いはできることの幅広さだと思います。効率化したいものがExcelなどのofficeに限られる場合はPythonにこだわる必要はないです。逆に**OCRで抽出したデータをExcelに出力したい**、**Excelデータを整形して、それをWEBページに自動で入力(RPA)したい**など、officeの範囲を超える場合はPythonを学ぶ必要があります（RPAはマクロだと手が届かないときにも使えたりします）。

ただしPythonは無料で使うことができますが、セキュリティー上、自由にインストールできる会社は多くないと思います。

## おわりに
Python in Excelの発表はかなりの話題となりました。確かにExcelで容易に機械学習を実装できるのは多くの企業にとってプラスになります。しかし、まだまだOffice業務の効率化だけで事足りる企業も多いと感じるので、自分の今の環境にあった方を選べばいいと思います（その方が直ぐに実践を積めて成長に繋がります）。

YouTubeにてPythonチュートリアル（公式ドキュメント）を使って基礎を解説しています。
体系的に学びたい方は是非ご活用ください。

https://www.youtube.com/channel/UCl_e49nQhOMoYkQOo_4ew2Q

## 出典

https://techcommunity.microsoft.com/t5/excel-blog/announcing-python-in-excel-combining-the-power-of-python-and-the/ba-p/3893439
ABC319　自分の解法

ABC319の自分の解法です。残念ながらAtCoderのコンテストには時間の都合上、参加できないのですが、後で解いたものを少しでも残せたらと思います。

# A問題
https://atcoder.jp/contests/abc319/tasks/abc319_a

まずはA問題から。
特に解法を書くまでもないと思う。条件分岐をするだけ。

```cpp
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < n; i++)
#define ll long long

int main() {
  string s;
  cin >> s;
  if (s == "tourist") cout <<"3858"<< endl;
  if (s == "ksun48") cout <<"3679"<< endl;
  if (s == "Benq") cout <<"3658"<< endl;
  if (s == "Um_nik") cout <<"3648"<< endl;
  if (s == "apiad") cout <<"3638"<< endl;
  if (s == "Stonefeang") cout <<"3630"<< endl;
  if (s == "ecnerwala") cout <<"3613"<< endl;
  if (s == "mnbvmar") cout <<"3555"<< endl;
  if (s == "newbiedmy") cout <<"3516"<< endl;
  if (s == "semiexp") cout <<"3481"<< endl;
  return 0;
}
```

ここの条件分岐のところにいつか僕の名前が載ることを願う。というか載って見せる！まずは緑コーダーから脱出しないとなぁ。

# B問題

https://atcoder.jp/contests/abc319/tasks/abc319_b

問題を理解するのに時間がかかってしまった。読解力がないことがバレてしまう・・・
まあそれはともかく、全然難しい問題ではない。各$i=0,1,2,…,N$について、各$j=1,2,3…,9$を試せばいい。$N$が$j$で割り切れて、$i$が$n/j$で割り切れるなら、出力すればいい。そして、各$j=1,2,3…,9$の中で、それらを満たすものがなければ、$-$を出力すればいい。
```cpp
#include <bits/stdc++.h>
#include <atcoder/all>
using namespace std;
using namespace atcoder;
#define rep(i, n) for (int i = 0; i < n; i++)
#define ll long long

int main() {
  int n;
  cin >> n;
  rep(i, n + 1) {
    for (int j = 1; j <= 9; j++) {
      if(n % j == 0 && i % (n / j) == 0){
        cout << j;
        break;
      }
      if (j == 9) cout << '-';
    }
  }
  cout << endl;
  return 0;
}
```

すみません。とりあえずこんな感じです。まだまだ更新予定なので、これからもよろしくお願いいたします。
Javaで「スーパークラスのコンストラクタ」の動作を確認してみた

# 概要

Javaで「スーパークラスのコンストラクタ」の動作を確認してみました。以下のページを参考にしました。

https://www.javadrive.jp/start/extends/index4.html

# 実装

以下のファイルを作成しました。
```CTest14.java
class CTest14{
  public static void main(String args[]){
    C sample = new C();
  }
}

class A{
  A(){
    System.out.println("クラスAのコンストラクタ");
  }
}

class B extends A{
  B(){
    System.out.println("クラスBのコンストラクタ");
  }
}

class C extends B{
  C(){
    System.out.println("クラスCのコンストラクタ");
  }
}
```

以下のコマンドを実行しました。
```
$ javac CTest14.java 
$ java CTest14 
クラスAのコンストラクタ
クラスBのコンストラクタ
クラスCのコンストラクタ
```

# まとめ
何かの役に立てばと。
【Docker】基本構造とよく使うコマンド集

# はじめに
こんにちは、エンジニア2年目の嶋田です。
まずは、この記事を開いていただきありがとうございます！

今回は、Dockerでよく使う覚えておきたいコマンドを一覧にまとめたいと思います。
是非、最後までお付き合いください！

# 目次
- [Dockerとは](#dockerとは)
- [Dockerの利点](#dockerの利点)
- [Dockerの基本概念](#dockerの基本概念)
  - [コンテナとは何か？](#コンテナとは何か？)
  - [イメージとは何か？](#イメージとは何か？)
  - [レジストリとは何か？](#レジストリとは何か？)
- [Dockerコマンドの基本](#dockerコマンドの基本)
- [最後に](#最後に)

# Dockerとは
Dockerは「仮想環境」という、コンピュータ内に仮想的なコンピュータを作成し、開発やサーバー設定等をする仕組みです。基本的にDockerはLinuxというサーバー用OSで動きます。パソコンで使用中のOS=WindowsやMacの上にLinuxというOSを仮想的に動かすということです。

# Dockerの利点
Dockerの利点は以下の通りです。
- ポータビリティ: コンテナは環境に依存しないため、どんな環境でも同じように動作します。
- 軽量性: コンテナは仮想マシンよりもリソース効率が高く、素早い起動が可能です。
- スケーラビリティ: アプリケーションのコンポーネントを簡単に複製してスケールアップできます。
- 開発効率: 開発者はローカル環境でアプリケーションをテストし、本番環境でも同じコンテナを使用できます。

仮想環境を構築することでハードウェアやネットワーク、メモリー等、様々なリソースやコストを削減できます！

# Dockerの基本概念
Microsoft社が公開しているドキュメントを参考に理解してみるとわかりやすいかもしれません！

https://learn.microsoft.com/ja-jp/dotnet/architecture/microservices/container-docker-introduction/docker-containers-images-registries

<img width="100%" alt="Docker概念" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524119/9aed8606-7391-7dea-838a-958b3155f313.png">

## コンテナとは何か？
コンテナとは、Dockerエンジンの上で動いている仮想環境のことです。
CentOSやUbuntuなどのOSから、MySQLや〇〇などのミドルウェア、RailsやWordPressなどのアプリケーションまで、様々な環境を作ることができます。

## イメージとは何か？
イメージは、コンテナの基盤となるテンプレートです。Dockerイメージは、アプリケーションやその実行に必要な環境、ライブラリ、設定などをひとまとめにしたものです。イメージは変更不可能で、コンテナを起動するたびに同じ環境を再現するのに使用されます。イメージは、Docker Hubなどのリモートリポジトリから取得したり、独自に作成したりすることができます。

## レジストリとは何か？
レジストリは、Dockerイメージを保存・管理するためのリモートサーバーまたはサービスです。一般的なDockerレジストリにはDocker Hubがあり、数多くの公開イメージが提供されています。また、組織内で独自のDockerレジストリを構築することもできます。イメージをプッシュして共有したり、他のユーザーが作成したイメージをプルして使用したりする際に、レジストリが役立ちます。

# Dockerコマンドの基本
以下は、Dockerの基本コマンドです。

```bash
# コンテナの起動
docker run [ オプション ] イメージ名 [ コマンド ]

# コンテナの停止
docker stop [ コンテナ名またはID ]

# コンテナの再起動
docker restart [ コンテナ名またはID ]

# 実行中のコンテナの表示
docker ps

# 全てのコンテナ（停止も含む）の表示
docker ps -a

# 利用可能なイメージの表示
docker images

# イメージの取得
docker pull [ イメージ名 ]

# イメージのプッシュ
docker push [ イメージ名 ]

# イメージのビルド
docker build [ オプション ] [ パスまたはURL ]

# コンテナ内でコマンドを実行
docker exec [ オプション ] [ コンテナ名またはID ] コマンド

# コンテナのログの表示
docker logs [ オプション ] [ コンテナ名またはID ]

# コンテナの削除
docker rm [ オプション ] [ コンテナ名またはID ]

# イメージの削除
docker rmi [ オプション ] [ イメージ名 ]
```

## オプション名一覧
コマンド一覧に挙げた内容で、[ オプション ]が存在していると思います。
よく使うオプションを以下にまとめました！

| オプション名 | 説明 |
|---|---|
| -d, --detach | バックグラウンドでコンテナを実行します。 |
| -p, --publish | ホストとコンテナの間でポートをマッピングします。 |
| -v, --volume | ホストとコンテナ間でディレクトリを共有します。 |
| -e, --env | 環境変数を設定します。 |
| -i, --interactive | 対話モードでコンテナを起動します。 |
| -t, --tty | 疑似TTYを割り当て、対話的なセッションを提供します。 |
| -h, --hostname | コンテナのホスト名を設定します。 |
| --name | コンテナに名前を指定します。 |
| -rm | コンテナを実行後に自動的に削除します。 |
| -it | -i と -t オプションを組み合わせて対話的な実行を有効にします。 |
| --link | 別のコンテナとリンクを作成します。 |
| --network | コンテナが接続するネットワークを指定します。 |

# 最後に
ここまでお付き合いいただきありがとうございます。参考になっていたら嬉しいです！
私自身まだまだ勉強中なので、間違っている箇所があればコメントで教えていただけるとありがたいです。
今後とも頑張っていきますので宜しくお願いします！
ライブマイグレーションをテストする

# VMインスタンスでpingコマンドを実行する
ライブマイグレーション中にVMインスタンスで実行中の処理が停止するか試してみるため、VMインスタンスでpingコマンドを実行します。
```
% ping 8.8.8.8
```

# Colud Shellからメンテナンスイベントのシミュレートコマンドを実行する
```
% gcloud compute instances simulate-maintenance-event [インスタンス名] --zone=[Zone名]
Simulating maintenance on instance(s) [https://compute.googleapis.com/compute/v1/projects/xxxxxxxxx/zones/xxxxxx/instances/xxxxxx]...done.  
```

# コマンド実行後のログを確認する
VMインスタンスのページの「オペレーション」-「ログを表示」をクリックしてください。
![スクリーンショット 2023-09-10 7.23.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/97187ad0-3fd4-0d62-5b47-4e758841bd8a.png)

クエリに以下を入力してください。
```
(resource.type="gce_instance")
(operation.producer="compute.instances.migrateOnHostMaintenance")
```

コマンドの実行結果がログに出力されています。
![スクリーンショット 2023-09-10 7.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14202/2110a720-3b45-dcbf-c3b0-9e620ff85f32.png)

以上です。
Portainerインストール(RPI4)

# 概要
今日はRPIにPortrainerをインストール方法についてメモしてみます。

# 事前準備
以下の内容を事前に準備します。

■RPI4にOSをインストール
■RPI4にDockerコマンドをインストール
次の参照サイトでインストール手順を１～４を実施でOKです。

https://qiita.com/homelan/items/0bb265cf92310d29cb82

インストール手順のコマンドは以下の通りです。

~~~bash
sudo apt update;sudo apt upgrade;
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker pi
docker -v
sudo systemctl enable docker
~~~

# Portainerインストール
次のコマンドを実行します。

■インストールコマンド
~~~bash
sudo docker pull portainer/portainer-ce:latest
~~~

■コマンド結果

~~~bash
pi@raspberrypi:~ $ sudo docker pull portainer/portainer-ce:latest
latest: Pulling from portainer/portainer-ce
7bd7f95ed7eb: Pull complete
9d019f0c1f3a: Pull complete
ee3e8cafa582: Pull complete
de69e2e43ef8: Pull complete
e394f58291f5: Pull complete
d15b8f36de3d: Pull complete
266bb3a3c7bc: Pull complete
50fafecf5825: Pull complete
096ae6653c07: Pull complete
cc0ddab5a6a8: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:54ec8c7776cf9759f3e4c665a9596c4e0069d6359f4cc012377c6e5f104d8a94
Status: Downloaded newer image for portainer/portainer-ce:latest
docker.io/portainer/portainer-ce:latest
pi@raspberrypi:~ $
~~~

# Portainer起動
次のコマンドでPortainerを起動します。

■起動コマンド

~~~bash
sudo docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
~~~

■コマンド結果

~~~bash
pi@raspberrypi:~ $ sudo docker run -d -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer-ce:latest
9796dd2b98d9fd96b430e962d6ce12739e7079fedfdfe31177934aab2900dde4
pi@raspberrypi:~ $
~~~

# Portainerへ接続
接続する前にRPIのIPアドレスを確認します。
次のコマンドからIPを確認ができます。

■IP確認コマンド

~~~bash
networkctl status
~~~

■コマンド結果

~~~bash
pi@raspberrypi:~ $ networkctl status
WARNING: systemd-networkd is not running, output will be incomplete.

●   State: n/a
  Address: 192.168.1.14 on wlan0　//WIFIで接続しているIPです。
           172.17.0.1 on docker0
           169.254.238.69 on vethc7ca2e3
           fe80::ffff:717a:6147:769d on wlan0
           fe80::42:ffff:fe86:e67b on docker0
           fe80::ffff:125:ad95:c0e1 on vethc7ca2e3
           fe80::ffff:85ff:fe5f:4cfc on vethc7ca2e3
  Gateway: 192.168.1.1 (EFM Networks) on wlan0
~~~

■Portainerへ接続
次のURLをブラウザからアクセスします。

■接続URL
~~~bash
http://192.168.1.14:9000/
※IPアドレスはRPIのアドレスを入力してください。
~~~

■接続結果
以下の画面でパスワードを設定します。
Create userボタンを押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/2c56fb4f-280d-f02a-6ffe-78ce89c23a73.png)

■接続完了
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/fd234314-5989-e679-582d-01c8a04ddc8b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/162336/91b68395-7837-d49f-2fd0-b151c6562aa0.png)

# 終わりに
いつもネットでインストール手順を調べてみましたが、
これからは自分のqiitaを参照します。W
お疲れ様でした。&(^^)&
Rust: 構造体 in 構造体 を JSON/YAML パース時に扱う

# はじめに

意外と構造体 in 構造体を JSON/YAML パースとセットで扱っている記事がぱっと出てこなかったのでメモ。

# パッケージの導入

例によって、 **serde** を使う。
また、JSON -> **serde_json**、 YAML -> **serde_yaml** を使う。

```powershell
cargo add serde --features="derive"
cargo add serde_json
cargo add serde_yaml
```

# 構造体の定義

構造体 in 構造体を作って、JSON/YAML 等からデシリアライズ・シリアライズを行う場合、**すべての構造体に対して親の構造体に同じ derive 属性を付ける**。
これがないと、エラーを起こす。
逆に、**子側で属性が増えるのは問題ない**。

```rust:main.rs
#[derive(Serialize, Deserialize, Debug)]
struct Person {
    firstname: String,
    sirname: String,
}

#[derive(Serialize, Deserialize, Debug)]
struct Book {
    people: Vec<Person>,
}
```

### エラー例

例えば、Book 側（ここでは親側）のみ derive を付けて、Person 側には付けない状態でコンパイルしようとすると、以下のようなエラーが出力される。

```log
error[E0277]: the trait bound `Person: Serialize` is not satisfied

error[E0277]: the trait bound `Person: Deserialize<'_>` is not satisfied

error[E0277]: `Person` doesn't implement `Debug`
```

# 実行部分の実装

```rust:main.rs
use serde::{Deserialize, Serialize};

use std::fs::File;
use std::io::BufReader;

// ここに上記構造体定義

fn main() {
    let file_name = "data/sample.json";

    let file = File::open(file_name).unwrap();
    let reader = BufReader::new(file);

    // JSON の場合
    let data: Book = serde_json::from_reader(reader).unwrap();

    // YAML の場合
    let data: Book = serde_yaml::from_reader(reader).unwrap();

    println!("{:?}", data);

    for person in data.people.iter() {
        println!("{} {}", person.firstname, person.sirname);
    }
}
```

# まとめ

JSON/YAML 等で構造体を複合的に扱う場合、すべてに属性つけるのを忘れずに～～
お手軽に電子ドラッグ

## コード

以下をブラウザのコンソールに貼り付けて実行してください。

```js
function getAllElements(currentWindow = window) {
    let elements = [];
    try {
        elements = [...currentWindow.document.querySelectorAll("*")];
        const iframes = currentWindow.document.querySelectorAll("iframe");
        for (const iframe of iframes) {
            elements = elements.concat(getAllElements(iframe.contentWindow));
        }
    }
    catch (e) {
        // DOMException: Blocked a frame with origin XXX from accessing a cross-origin frame.
        console.error(e);
    }
    return elements;
}

const elements = getAllElements();
elements.forEach((element) => {
    const hue = Math.floor(Math.random() * 360);
    element.style.backgroundColor = `hsl(${hue} 100% 50%)`;
    element.style.color = `hsl(${hue + 180} 100% 50%)`;
});

const body = document.querySelector("body");
let hue = 0;
body.style.filter = `invert(100%) hue-rotate(${hue}deg)`;
```

## 実行結果

![スクリーンショット 2023-09-10 074545.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649673/d1e152d2-74fe-e186-70ed-982a9511ebd6.png)

## チラ裏

元のコードではbodyのhueの値が1ミリ秒毎に1ずつ変化し気持ち悪さを堪能できたが、
仮にこれを公開してそれを見た人が病気になって訴えられるのも嫌なのでコードからは消した。
laravel 勉強日記

# laravel勉強日記2日目


新規アプリを作成するには作業ディレクトリにて、
```
curl -s "https://laravel.build/example-app?php=81" | bash
//example-appの部分はファイル名
```
開くためには以下のコマンド
```
cd example app
./vendor/bin/sail up -d
```
まず日本語で開発するためにファイルを置きます
```
/Users/x21024xx/Desktop/laravel_f/first-app/docker/8.2
```
ここに、my.cnfを置く
そして
```
/Users/x21024xx/Desktop/laravel_f/first-app/docker-compose.yml
```
のディレクトリにて
```
 volumes:
            - 'sail-mysql:/var/lib/mysql'
            - './docker/8.2/my.cnf:/etc/my.cnf' //←を1行追加する
```

## dbの作成を行う方法
```
sail artisan make:migration create_tweets_table
```
上のファイルは以下のディレクトリに作成される
```
database/migrations/yyyy_mm_dd_◯◯◯◯_create_tweets_table.php
```
中身はこんな感じ
```:.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            $table->id();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('tweets');
    }
};
```
## マイグレーションクラスでは何をしてる？
関数のupメソッドでは新規に追加するテーブルや拡張するカラムなどのスキーマ(設計図)を指定する
downメソッドでは反対に戻す処理を行っている。

## Up関数の記入例
```
public function up()
    {
        Schema::create('tweets', function (Blueprint $table) {
            $table->id();
            $table->string('content');
            $table->timestamps();
        });
    }
```
# 記入後の動き
Artisanコマンドからマイグレーションを実行する
```
./vendor/bin/sail artisan migrate
```
その後Mysqlにログインして作成を確認する、
```
./vendor/bin/sail mysql
mysql-> show tables from example_app; //ダメなら下
mysql-> show tables;
+------------------------+
| Tables_in_first_app    |
+------------------------+
| failed_jobs            |
| migrations             |
| password_reset_tokens  |
| personal_access_tokens |
| tweets                 |
| users                  |
+------------------------+
6 rows in set (0.01 sec)

mysql>　show columns from tweets
    -> 
    -> ;
+------------+-----------------+------+-----+---------+----------------+
| Field      | Type            | Null | Key | Default | Extra          |
+------------+-----------------+------+-----+---------+----------------+
| id         | bigint unsigned | NO   | PRI | NULL    | auto_increment |
| content    | varchar(255)    | NO   |     | NULL    |                |
| created_at | timestamp       | YES  |     | NULL    |                |
| updated_at | timestamp       | YES  |     | NULL    |                |
+------------+-----------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
```

テーブル一覧に関数で指定した名前のテーブルがあれば成功。