OmniAICreator/Qiita-1.07M huggingface dataset:
【超初心者向け】Vimの基本操作について

# 概要
Vim完全初心者の私が、0からvimを触ってみて、
実際の使い心地や簡単なコマンド、初心者目線で意見を書こうと思います！
Vimをまだインストールしていない人は[こちら](https://www.vim.org/)からインストールしてください！

## Vimとは
Vimは、CLIから操作する「エディタ」で、いくつかのモードを切り替えて使用していくのが特徴です。
このモードを操作するのが初心者には若干のとっつきにくさを生み出していますが、慣れると作業効率が上がるので、是非覚えてみてください！

## なぜVimを使うのか
上記にも書きましたが、一番の理由は**作業効率向上**です！
VimはCLIのため、すべての操作をキーボードだけで行うことができます。
現時点ではイメージできないかもしれませんが、慣れればマウス操作よりも早く作業を進めることができます！


## Vimのモードについて
では、実際にVimの使い方を見ていきましょう！

Vimには下記のような４種類のモードがあります。
行いたい操作によって、モードを変える必要があるのですが、
この時点ではとりあえず４種類モードがあるんだ～くらいの認識でOKです！
勝手に覚えます。

|**モード**|**モード内容**|**モードの切り替え**|
|---|---|---|
|**NORMAL**|カーソル移動、コピペなど|`esc`|
|**INSERT**|文字入力|`i`|
|**VISUAL**|テキスト選択|`v`|
|**COMMAND**|ファイルの保存やVimの終了|`:`|

## Vimの基本操作
続いてVimの最も基本的なカーソル移動について学んでいきましょう！

Vimでは、カーソル操作を(h,j,k,l)の４つのコマンドで行うことが一般的です。
ややイメージはしにくいですが、慣れるまでカーソルを移動させまくりましょう。

|コマンド|動作|
|---|---|
|`h`|左に移動|
|`l`|右に移動|
|`k`|上に移動|
|`j`|下に移動|


## より便利なカーソル移動
カーソルの移動は上下左右１つずつではなく、行や単語単位で行うことが可能です。
一つ一つ動かしながら確認していきましょう。

|コマンド|動作|
|---|---|
|`w`|次の単語の先頭に移動|
|`e`|単語の末尾へ移動|
|`b`|前の単語の先頭に移動|
|`0`|行の先頭に移動|
|`$`|行の末尾に移動|

## もっと便利なカーソル移動
さらに、ページ単位や行番号を指定しての移動も可能です。
以下のコマンドを覚えるとよりVimの操作が自由自在に行えるようになります。

|コマンド|動作|
|---|---|
|`gg`|ページ最上部に移動|
|`G`|ページ最下部に移動|
|`行G`|指定した行に移動|
|`H`|表示されている行の１番上に移動|
|`M`|表示されている行の真ん中に移動|
|`L`|表示されている行の１番下に移動|

※`ctrl+G`で自分が何行目にいるか表示されます。

## 文字入力
続いて文字を実際に入力してみましょう！
文字の操作で覚えてほしいのは以下の操作です。

|コマンド|動作|
|---|---|
|`i`|入力開始|
|`a`|次の文字から入力開始|
|`o`|改行して入力開始|
|`r`|1文字だけ置き換え|
|`A`|行の最後から入力開始|
|`I`|行の最初から入力開始|
|`O`|上に行を挿入して入力開始|
|`R`|複数文字置き換え|

## 削除
続いて、文字を削除する方法も見ていきましょう。
文字も行単位や単語単位で行うことができます。
|コマンド|動作|
|---|---|
|`ce`|単語の末尾まで変更|
|`cc`|行全体を変更|
|`dd`|行全体を削除|
|`d$`|カーソルがある行のカーソルより後ろを削除|
|`dw`|次の単語まで削除|
|`x`|カーソルの位置の文字削除|


## 検索
行数が増えてくるとたくさんのコードの中から特定の単語を見つけたい状況が出てきます。
そのような場合には、以下のコマンドを使用して検索をかけてみましょう！

|コマンド|動作|
|---|---|
|`/+検索したい文字`|後方検索|
|`?検索したい文字`|前方検索|
|`n`|検索語に順方向に次の検索結果に移動|
|`N`|検索語に逆方向に次の検索結果に移動|

## 保存、終了
最後にファイルを保存して終了してください。
ここまでできたらVImの基本操作は完了です！

|コマンド|動作|
|---|---|
|`:w`|上書き保存|
|`:q`|終了|
|`:wq`|保存して終了|


## おわりに
いかがでしたでしょうか？
Vimの操作はここに記載したもの以外にもたくさんありますが、最低限ここに記載されているものが使えれば操作はできると思います！
いきなりすべて覚えようとするとVim嫌いになりかねないので、まずはこの記事のコマンドを覚えてみてください！
Flutterで "showDialog" しているのに、ダイアログが表示されない

## 発生した問題
以下のように、 "showDialog" と記載していて、ここの部分のコードも通過しているのに、ダイアログが表示されませんでした。

```dart
showDialog(
          context: context,
          builder: (context) {
            return AlertDialogOrg( //AlertDialogOrgは自作クラス
              message: errorMessage!,
            );
          });
```

## 原因
色々な原因があり得るかと思いますが、私の場合は、"await" していなかったため、ダイアログが表示される前に、次の画面に遷移してしまっていたためでした。

## 解決方法
”showDialog”で、”await”する！
（関数がasyncになっていない場合は、関数にasyncもつける。）
"await" をつけることで、ダイアログでボタンをクリックするまで、処理が停止し、この先の処理が先に実行されてしまうことを防ぎます。これで、無事に、画面遷移する前にダイアログが表示されました。

```dart
await showDialog(　 ///☆ここにawaitを追加
          context: context,
          builder: (context) {
            return AlertDialogOrg( //AlertDialogOrgは自作クラス
              message: errorMessage!,
            );
          });
```
ターミナル(zsh)でvueコマンドを使えるようにする

# vue -V を打った時のエラー

vue cliのバージョンを確認しようと思ったらvueコマンドが使えないって怒られた。
ターミナルでvueコマンドを使えるようにしたかったのでその時の備忘録。

```tarminal
vue -V
zsh: command not found: vue
```

エラーの原因はpathが通っていないこと。

## パスを通す
.zshrcファイルに以下を追記。
```zsh:.zshrc
export PATH=$PATH:/Users/ユーザー名/.npm-global/bin
```
保存してターミナル再起動。普通はこれで治るらしい。でもエラー解消されない。
```zsh:.zshrc
export PATH="/Users/ユーザー名/.npm-global/lib/node_modules/vue-cli/bin:$PATH"
```
これもエラー解消されない。

## 結局パス通らんかった。インストールしなおしたらvueコマンド使えるようになった。。

古いvue-cliを削除
```
npm uninstall -g vue-cli
```
新しいvue-cliをインストール
```
npm install -g @vue/cli
```

使えた。。
そもそもグローバルにインストールしてなかったかのかもしれない。。
```
vue -V      
@vue/cli 5.0.8
```


## 参考
[Vue CLIをインストールしたのに「command not found: vue」と表示されてしまう場合の対処法](https://webrandum.net/zsh-command-not-found-vue/)
[vue.jsで「command not found」エラー](https://teratail.com/questions/305626)
Python SimpleServerで同ネットワーク内ファイル共有

# 概要
会社や自宅などの同ネットワーク内で簡単に大きなファイルを共有するひとつの方法を解説
Linux(Mac)の環境でのコマンドで記載しています。

# 手順

HTTPサーバーを起動するためのディレクトリを作成し
その中にウェブブラウザから見えるようにしたいディレクトリを作成。
```shell:
mkdir HTTP
cd HTTP
mkdir dir
```

ターミナルからPythonのSimpleServerを利用して、ポート8000にHTTPサーバーを起動。
```shell:
python -m http.server 8000
```
```shell:Python2.7
python -m SimpleHTTPServer 8000
```

試しで、使っているパソコンのウェブブラウザで開いてみましょう。
```shell:
open http://localhost:8000
```
![Screen Shot 2023-07-18 at 22.10.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1409234/f3b110c8-93d1-8d81-b531-22759e1e314b.png)

次に、自分のPCのプライベートIPアドレスを調べます。
```
ifconfig | grep inet
```
これでわかったアドレスが、192.168.1.10だったとします。

同ネットワークの別のデバイスから接続する際は、上で調べたIPアドレスを使用して下記のアドレスでブラウザを開きます。
```
open http://192.168.1.10:8000
```

以上です。
C#でWindowsFormアプリケーションを強制終了する

# 1. はじめに
* WindowsForm内で致命的なエラーが発生した場合にアプリケーションを強制終了させたい

# 2. 開発環境
* C#
* .Net 6
* Visual Studio 2022
* Windows 11

# 3. ソースコード
# 3.1. WindowsFormアプリケーションを強制終了する
* メソッドの実行途中で強制終了する
```C#:
private void Form1_Load(object sender, EventArgs e)
{
   // 開始処理
   Debug.WriteLine("Start");

   // アプリケーション強制終了
   Environment.Exit(0x8020);

   // 終了処理 → 呼び出されない
   Debug.WriteLine("End");
}
```

# 3.2. WindowsFormアプリケーションを終了する
* メソッドを実行した後に終了する
```C#:
private void Form1_Load(object sender, EventArgs e)
{
   // 開始処理
   Debug.WriteLine("Start");

   // アプリケーション終了
   System.Windows.Forms.Application.Exit();

   // 終了処理 → 呼び出されて終了
   Debug.WriteLine("End");
}
```

# 4. 参考文献

https://www.ipentec.com/document/csharp-force-terminate-application
DockerやDocker Composeなどについて

[株式会社TECH LUCK](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)という会社で代表兼エンジニアをしている齊藤です。

DXプロジェクト、開発プロジェクト、Rails開発などでお困りごとがありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご相談をいただけますと幸いです。
以下のような問題に対応することが可能です。
- プロジェクトでRailsエンジニアが足りなくて困っている
- Railsのバージョンアップをしたいがノウハウ・リソースが足りなくて困っている
- オフショア開発をしているが、要件の齟齬やコード品質が悪いので改善したい

また、Railsエンジニアも募集しておりますので、興味がありましたら[弊社HP](https://techluck.co.jp/?utm_source=qiita&utm_medium=article&utm_campaign=myarticle)からご連絡いただけますと幸いです。

# 前提

雰囲気でDockerやDocker Composeを使っていたので、少し詳細を調べてみました。
折を見て追記していきます。

# CMDとRUNとENTRYPOINTの違いについて
以下の記事が詳しかった。

https://www.guri2o1667.work/entry/2021/06/08/%E3%80%90Docker%E3%80%91Dockerfile%E3%81%A7%E8%A8%98%E8%BF%B0%E3%81%99%E3%82%8BRUN%E3%81%A8CMD%E3%81%A8ENTRYPOINT%E3%81%AE%E9%81%95%E3%81%84%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6#RUN%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A8CMDENTRYPOINT%E3%81%AE%E9%81%95%E3%81%84

# CMDとENTRYPOINTの使い分けについて
以下の記事が詳しかった。

https://www.grandream.jp/blog/docker-cmd-entrypoint/

実際にコマンドを実行して試している記事もあった。

https://qiita.com/hihihiroro/items/d7ceaadc9340a4dbeb8f

# DockerのEXPOSEについて
以下の記事が詳しかった。

https://engineer-ninaritai.com/docker-port-expose/

> ただ、EXPOSEだけでは、ポートは公開されません。つまり、使用者からコンテナにはアクセスできません。後に説明する”docker run -p”コマンドを使用し、公開用のポートとEXPOSEで指定したポートを紐づけることで、公開されるようになります。
そのため、EXPOSEはイメージの作者とコンテナ実行者の両者に対して、ドキュメントのような役割をします。


# Docker Composeでの各コンテナの通信について

各コンテナはdocker-compose.ymlで書いたportで通信しているのではなく、Docker Composeの機能でdocker-compose.ymlの中に書いたservice名で勝手に名前解決してくれる。

Railsの場合だと、`database.yml`にdocker-compose.ymlで指定したサービス名をhostに設定するだけで通信できるのはこれが理由となる。

https://it-afi.com/docker/docker-compose-%E3%81%A7%E3%80%81links-%E4%BD%BF%E3%81%86%E5%BF%85%E8%A6%81%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%82%93%E3%82%84/

# CPUのアーキテクチャについて

DockerはホストマシンのCPUアーキテクチャを参照して、Docker Hubからイメージを引っ張ってくる。
M1 Macの場合にECS用にビルドが必要になる場合などは注意する。

https://zenn.dev/suzuki_hoge/books/2021-07-m1-mac-4ede8ceb81e13aef10cf/viewer/7-docker
SpringBootアプリケーションにおけるHikariCPコネクション枯渇の対策

## 発生した問題

SpringBootアプリケーションからSQLServerに接続する際に、以下のようなHikariPoolのタイムアウトエラーが発生：

```Java:スタックトレース
java.sql.SQLTransientConnectionException: HikariPool-1 - Connection is not available, request timed out after 30000ms.
```

## 原因分析

1. デフォルト設定の制限
- SpringBootのデフォルトの接続プールライブラリHikariCPのデフォルト設定値
   - コネクションプール最大サイズ: 10
   - コネクションタイムアウト: 30秒

2. 問題が顕在化した経緯
   - システム運用開始後、データ量の増加に伴いクエリの実行時間が長くなった
   - 並行リクエスト数の増加により、利用可能なコネクションが枯渇
   - コネクション取得待ち時間が30秒を超え、タイムアウトが発生

## 対策

### コネクションプール設定の最適化

`application.properties`に以下の設定を追加：

```Java:application.propaties
# コネクションプールの最大サイズ設定
spring.datasource.hikari.maximum-pool-size=100

# 最小アイドルコネクション数
spring.datasource.hikari.minimum-idle=50

# HikariPoolの状態監視設定
logging.level.com.zaxxer.hikari.pool.HikariPool=DEBUG
```

### 設定値の選定における考慮点
設定値はあくまで参考値です。
コネクションプールサイズの適切な値は、以下の要素を考慮して決定する必要があります：

- 想定される同時リクエスト数
- データベースサーバーのリソース制限
- 各トランザクションの実行時間
- アプリケーションサーバーのリソース

## 改善結果

- コネクション枯渇によるシステム停止が解消
- HikariPoolのDEBUGログにより、コネクション使用状況の可視化が可能に

## 用語

### HikariCP
- JDBCコネクションプールの実装の一つ
- 特徴：
  - 高速で軽量な実装
  - 豊富な設定オプション
  - SpringBoot 2.0以降のデフォルトコネクションプール
  - ベンチマークで実証された高いパフォーマンス

### コネクションプーリング
- データベース接続をプールとして事前に確保し再利用する仕組み
- メリット：
  - データベース接続のオーバーヘッド削減
  - リソースの効率的な利用
  - アプリケーションのパフォーマンス向上

# 参考
- Springリファレンス

https://docs.spring.io/spring-boot/reference/data/sql.html#data.sql.datasource.connection-pool

- HikariCP GitHub

https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby
【SwiftUI】画像にカラーフィルター

# はじめに
SwiftUIの`colorMultiply`という機能でカラーフィルター的なことができたので記事にしておきます

# サンプルアプリ
![Simulator Screen Recording - iPhone 14 Pro - 2023-07-18 at 22.02.28.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e312c132-8636-9ff1-68b1-efd4c410e041.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State private var color: Color = .red
    
    var body: some View {
        VStack(spacing: 50) {
            Image("sample")
                .resizable()
                .aspectRatio(contentMode: .fit)
                .colorMultiply(color)
                .frame(maxWidth: .infinity)
            
            ColorPicker("カラーフィルター", selection: $color)
        }
        .padding(.horizontal, 20)
    }
}
```

# おわり
いい感じにできました！
RubyでAtCoder ABC232(A, B, C)を解いてみた

# はじめに
Webエンジニアを目指して、RubyやRailsをいじってます。
今回は、RubyでAtCoder ABC232のA, B, Cを解きました。備忘録として解き方をまとめていきたいと思います。

# A - QQ solver
https://atcoder.jp/contests/abc232/tasks/abc232_a
```ruby:a-232.rb
puts gets.split("x").map(&:to_i).inject(:*)
```

# B - Caesar Cipher
https://atcoder.jp/contests/abc232/tasks/abc232_b
```ruby:b-232.rb
s = gets.chomp.chars
t = gets.chomp.chars

u = s.zip(t)
k = (t[0].ord - s[0].ord) % 26
puts u.all?{ (_1.ord + k) % 26 == _2.ord % 26 } ? "Yes" : "No"
```
## 解説
`ord`メソッドと`all?`メソッドを使って、K個後ろの文字にしたときにsがtと一致するかどうかを判定することができます。なお、`k`は先頭を固定してその差分としました。

# C - Graph Isomorphism
https://atcoder.jp/contests/abc232/tasks/abc232_c
```ruby:c-232.rb
n, m = gets.split.map(&:to_i)

if m == 0
  puts "Yes"
  exit
end

t = Array.new(n){ Array.new(n, false) }
m.times do
  a, b = gets.split.map{ _1.to_i - 1 }
  t[a][b] = true
  t[b][a] = true
end

a = Array.new(n){ Array.new(n, false) }
m.times do
  c, d = gets.split.map{ _1.to_i - 1 }
  a[c][d] = true
  a[d][c] = true
end

[*0..n - 1].permutation do |i|
  array = Array.new(n){ Array.new(n, false) }
  n.times do |j|
    n.times do |k|
      array[j][k] = a[i[j]][i[k]]
      if t == array
        puts "Yes"
        exit
      end
    end
  end
end
puts "No"
```
## 解説
最初に、高橋くん・青木くんそれぞれについて繋がっているボールを`true`として配列に情報をもたせます。後は、問題文にある条件を`permutation`メソッドを使って全探索することで解くことができます。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
ビルド構成によって変数を設定する方法(プリプロセッサディレクティブを使うよ)

# 概要
仕事でVisualStudioを使ってWindowsフォームアプリを作成しているのですが、ビルド構成をDebugかReleaseかで変数の値を変えて欲しいと言われました。
しかし、パッと解決法が思い付かずどうしたらいいか困ってしまったわけです…
調べた結果、プリプロセッサディレクティブを使った方法が簡単そうじゃん！と思い実装したところめちゃ簡単だったので皆さんに共有させていただきます。

# プリプロセッサてそもそも何者？:thinking:
基本的なことですが、コンピュータがプログラムを実行する前に、一連の手順を踏む必要があります。「コンパイル」という過程です。
「プリプロセッサ」はこのコンパイルが行われる前に動作します。だから「プリ（前の）」と名前についています。プリプロセッサが行う作業は主に「コードの準備」なのです。

# よく使われるプリプロセッサディレクティブたち
以下はよく使われるプリプロセッサディレクティブです。
これらを見た上で次の実装例を見てみましょう。

**#if** ： 条件付きコンパイルブロックの開始を示します。
**#else** ： **#if** または **#elif** ブロックの代替ブロックを示します。
**#elif** ： **#if** ブロックの追加の条件を示します。
**#endif** ： 条件付きコンパイルブロックの終了を示します。
**#define** ： シンボルを定義します。
**#undef** ： シンボルの定義を取り消します。

# 実装例
以下は簡単な実装例ですが、Debugを選択しているとmodeに「Debug Mode」が代入され、Releaseだと「Release mode」が代入されます。
また、実際に実装すると現在選択しているデバッグ構成によってどちらかが無効になります。
つまり、Debugを選択していた場合、#elseブロックは無効となりコードが灰色になります。

```C#
string mode;
#if DEBUG
    mode = "Debug mode";
#else
    mode = "Release mode";
#endif

SomeMethod(mode);

```

# おわりに
以上がプリプロセッサディレクティブを使ったビルド構成によって変数を設定する方法です。
他の方法もありますが設定などが複雑になってくるので、必要でない限りこの方法でやった方が簡単に実装できると思います！
しかし、この方法を使う際は自分でも調べてからやってくださいね！信頼性の高い１次情報が大事です。
私の投稿は参考程度に。
ハードディスク装置

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/51b7fcd1-062c-4f4d-d169-6601916d7d84.png)
１：ハードディスク装置（磁気ディスク装置）
　磁気を利用してデータを記録する装置です。ハードディスク装置は、低価格で大容量（１台あたり数テラバイト）を実現できることが利点ですが、データのアクセスに時間がかかることが欠点です。メモリのアクセス時間と比較すると約100万倍も長いのです。ハードディスク装置の仕組みと、アクセス時間の計算をしっかり理解する必要があります。
Round関数が四捨五入か銀行丸めか

# 経緯

今日も何の気なしに変数の型に合うようコード整理をしていました。
代入される側の変数の型がIntegerだったので、Math.Round()を使って四捨五入をしたつもりでコミットすると、無口な先輩がすっ飛んできました。
「銀行丸めって知ってる？」

# 銀行丸め(bankers' rounding)

 **四捨五入** ではほしい桁より下の桁の値が5なら切り上げますが、**銀行丸め** では切り捨てと切り上げのうち結果が偶数となる方へ丸めます。例えば2.5を銀行丸めすると2になります。
銀行丸め自体はJISやISOの規格の1つだそうです。

なぜ銀行丸めをするかというと記事[「銀行家の丸め」とは何か](http://kanrikaikei-sys.com/2015/01/1764/) より

> 何度も何度も丸めをした場合に数値の総合計のズレが少なくなるように

と、各値よりも合計値でのズレに重きを置いてるみたいですね。

# Round関数

私が使った Math.Round(Double) はまさに銀行丸めで、四捨五入ではありませんでした。
やりたいこととしては Round(Double, MidpointRounding) を使用して2つ目の引数でMidpointRounding.AwayFromZero を指定すべきでした。

# まとめ

「Round関数は名前の通り、四捨五入でしょ」と思い込んだのが悪かったです。
ちゃんと公式ドキュメントを確認します。

# 参考

- [Microsoft Math.Roundメソッド](https://learn.microsoft.com/ja-jp/dotnet/api/system.math.round?view=net-7.0)
- [「銀行家の丸め」とは何か](http://kanrikaikei-sys.com/2015/01/1764/)
モダンアクティビティを使ってみた(Excel編Part12～CSVにすることもできると？～)

## はじめに
①本記事は、2023年7月開催の「UiPathブログ 発信チャレンジサマー」の18日目のブログです。
ブログの詳細、参加方法については以下のブログを参照ください。

https://note.com/shumpei_w/n/nd082bdf28853

②このブログ情報は、2023/7時点の情報です。
③UiPathはCommunity Edition、Versionは2023.6.1を使用しています。

## Excelからの変換

実は前回作成の記事で、ExcelからPDFに変換することができるか試してみました。

https://qiita.com/saosao885/items/894e4f630689f39b08ef

今回は、Excel→CSVへの変換ができるみたいなので試してみましょう。

## CSVにエクスポートアクティビティ
「CSVにエクスポートアクティビティは、ExcelからCSVファイルを作成することができるアクティビティです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/c09a0fa7-a4e3-efe4-ac8d-2e12dbd95dd4.png)
プロパティは以下のような感じです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/5f06b5d4-9195-08b4-a0c0-6d6b620aba1a.png)
【入力】
データテーブル：Datatable型の変数ではなく、CSVにする対象のシート名を設定
※ここの変数の型、ちょっと変わっていますね...(今回は触れません)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/952bc8e7-c97d-6d79-14ff-f499b333649a.png)
【ファイル】
ファイルパス：CSVのファイルパスを記載します。
指定のパスをフルパスで書いてあげる(またはパスの入った変数/引数を設定)と、指定のパスへ入ってくれるようになります。

## やってみよう
以下の「出身地_2.xlsx」というファイルがあるので、このファイルのSheet1のデータをCSVファイルに作成してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f576674f-7eaa-44b7-f015-d067fb3d80c2.png)

①対象のシート名を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f8616355-be08-eef2-30ca-0d18f2f73268.png)
②ファイル名を設定
今回は「dekiru.csv」に設定します。
(この場合、作成されたCSVファイルはxamlファイルと同じフォルダへ保存されます。)

できると以下のようなイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/dac5f454-25e1-8e37-efd0-2632489d2e0f.png)

実行してみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/73b3878e-baf8-0242-a634-a04ab1328971.png)
できてる！中身は...メモ帳とExcelを開いて確認してみましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/502614/f95c0ade-25b2-b208-f8db-f684ec9ac43f.png)
できてますね！

## まとめ
これまではDatatable型→CSV型にするアクティビティを使用することがありましたが、ExcelからCSVへの保存もできるようになって利便性が向上したかも？しれませんね。
皆様も使う機会がありましたら是非使ってみましょう。

最後までお読みいただきありがとうございました。
コーディングテストで便利だと思った機能 (Python)

# はじめに:point_up:
僕はエンジニアを目指している大学生です。
コーディングテストで使って便利だなと思ったPythonの機能を紹介しようと思います。

## 便利な機能たち
### リストをN個に分割
```python
def split_list(l, n):
    for i in range(0, len(l), n):
        yield l[i:i + n]
 
l = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
result = list(split_list(l, 3))
print(result) # [[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]

```
関数に `yield` を含めることで、ジェネレータになり反復可能になります。
また、ジェネレータを用いることで、都度必要な分だけ値を生成するので、メモリを効率的に使用できます。


### 累積和を生成
```python
import itertools

l = [1, 2, 3, 4, 5, 6]

print(itertools.accumulate(l))
# <itertools.accumulate object at 0x10d648140>

print(list(itertools.accumulate(l)))
# [1, 3, 6, 10, 15, 21]
```
標準ライブラリである `itertools` の `accumulate()` を使うことで累積和を生成できます。
`itertools.accmulate()` の引数にはイテラブル(反復可能)なオブジェクトを指定します。
戻り値はイテレータなので、 `for` を回したり、 `list()` や `tuple()` を使って綺麗に表現できます。


### 文字列を逆順に出力
```python
str = "abcdefg"
print(str[::-1]) # "gfedcba"
```
1つ目の引数(start)と2つ目の引数(end)に何も指定せず、3つ目の引数(step)に `-1` を指定することで、末尾から1個ずつ遡って先頭まで要素を取得できます。



### 参照渡し回避
```python
import copy

hoge = {1:{2:2, 3:3}}
print(id(hoge)) # 140418104920496

fuga = copy.deepcopy(hoge)
print(id(fuga)) # 140418107009728

fuga[1].update({4:4})

print(hoge == fuga) # False

print(hoge) # {1: {2: 2, 3: 3}}

print(fuga) # {1: {2: 2, 3: 3, 4: 4}}
```
`copy`モジュールの `deepcopy()` を使うことで、元のオブジェクトの完全な複製を作成することができるので、`copy()` と違い参照渡しを回避することが可能です。


### 重複をなくす
```python
A = [1, 2, 3, 3, 4]
print(set(A)) # {1, 2, 3, 4}
```
`set()` を使うことで、指定したオブジェクトはハッシュテーブルになります。
ハッシュテーブルは重複要素を持てないため、重複をなくすことが可能です。
しかし、順序は保持されないです。


## おわりに:lifter_tone4:
今回はここまで紹介しました。
まだ紹介してない機能もあるので、次回紹介しようと思います。
エンジニア目指して頑張ります。:lifter_tone1:
【備忘録】TypeScriptで型定義から一部を抽出する（Omit, Pick）

# ◆ 背景

Typescriptを利用していると、似たような型を定義することが多々ありました。
特に、`一部を除いて後は全く同じ`という下記のような型が欲しいとき、

<br>

```typescript
type sampleType1 = {
  id: number;
  userId: number;
  title: string;
  flag: boolean;
  desc: string;
}

// ↓sampleType1のid以外が欲しい！

type sampleType2 = {
  id?: number;
  userId: number;
  title: string;
  flag: boolean;
  desc: string;
}

type sampleType3 = {
  userId: number;
  title: string;
  flag: boolean;
  desc: string;
}
```
<br>

今まではオプションパラメータ（?）を利用して省略したり、渋々新しく型を定義していました。
しかし、`Omit`か`Pick`を利用すれば、余計なオプションや型定義が不要になります。

<br>

<br>

# ◆ Pick（必要な型を抽出）

Pickはある型から必要な型だけを抽出することができます。

<br>

```typescript
Pick<抽出対象の型定義, "型名" | "型名" | "型名"　...>
```
**例）**

```typescript
type sampleType1 = {
  id: number;
  userId: number;
  title: string;
  flag: boolean;
  desc: string;
}

Pick<sampleType1, "userId" | "title" | "flag" | "desc">
```

<br>

<br>

# ◆ Omit（不要な型を省く）

Omitはある型から不要な型を省くことができます。

<br>

```typescript
Omit<抽出対象の型定義, "不要な型名"　...>
```

**例）**

```typescript
type sampleType1 = {
  id: number;
  userId: number;
  title: string;
  flag: boolean;
  desc: string;
}

Omit<sampleType1, "id">
```
Javaのエンコーディングに関する設定について動作を確認してみた

# 概要
Javaのエンコーディングに関する設定について動作を確認してみました。以下のページを参考にしました。

Javaのエンコーディングに関する設定

https://www.javadrive.jp/start/encoding/

デフォルトエンコーディングを確認する

https://www.javadrive.jp/start/encoding/index1.html

ソースファイルのエンコーディングを指定してコンパイルする

https://www.javadrive.jp/start/encoding/index2.html

実行環境のエンコーディングに合わせてプログラムを実行する

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

# エンコーディングを確認
以下のファイルを作成しました。
```JSample1_1.java
class JSample1_1{
  public static void main(String[] args){
    System.out.println(System.getProperty("file.encoding"));
  }
}
```
以下のコマンドを実行しました。
```
$ javac JSample1_1.java 
$ java JSample1_1 
UTF-8
```

# まとめ
何かの役に立てばと。
Delphiで作ったストアアプリ試用版をローカルで確認する

# 試用版をローカルで確認するには
こう言う手順になります。
* ストアに登録できるようにする
* パートナーセンター > ホーム > アプリとゲーム > アプリ名 の製品情報 > 製品IDにある、「パッケージ/ID/発行元」の内容（CN=）で自己認証証明書を作成する。
* プロジェクトオプション > 配置 > プロビジョニングで、配置：アドホックにし、作成した証明書を指定する。
* AppxManifest.template.xmlを編集する。ストア配布時のReleaseフォルダにできているAppxManifest.xmlの内容を一部コピーする。コピーというか本当の値に変更する。
    * Identityタグ
        * Nameに「パッケージ/ID/名前」
        * Publisherに「パッケージ/ID/発行元」
    * Propertiesタグ
        * DisplayNameタグにアプリの名前
        * PublisherDisplayNameタグに「パッケージ/プロパティ/発行元表示名」
 * Debugモードでビルド
 * msixファイルをダブルクリックすると、ストアに接続して、IsTrial等の値が得られる。

なんとか覚えていた。

参考
[https://en.delphipraxis.net/topic/3042-advice-on-debugging-windows-store-app-while-minimising-submissions/](https://en.delphipraxis.net/topic/3042-advice-on-debugging-windows-store-app-while-minimising-submissions/)
開発生産性 Conference 登壇報告 (2023/07/13)

:::note
テックブログにも誘導してみる...🙄
https://link-and-motivation.hatenablog.com/
:::

# はじめに

こんにちは。

7/13 (木) に Findy 様主催で開催されました「開発生産性 Conference」に登壇して来ました。ちょこっとその感想を書きます。

https://dev-productivity-con.findy-code.io/

時間はランチタイムで、お弁当は食べそこねました笑

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/89c3a85b-ade4-c365-0511-071a59894d25.png" width=400>

# スライド & アーカイブ

アーカイブ動画。

https://www.youtube.com/watch?v=Eh6e2fpOZEQ

スライドは [リンクアンドモチベーションの Speaker Deck](https://speakerdeck.com/lmi) に上げてあります。

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


表題にある通り「Why」に着目したセッションをしました。

> How の話や Four Keys 計測の話などは、今回意図的に外しました。

弊社ではおよそ３年 (私がジョインしたのは２年前) から SRE グループを発足しており、現在では Four Keys メトリクスにおける High 水準 (デプロイ頻度 `120 回/月`, リードタイム `1 日`) に達しております。

そこに至るまでの取り組みから学んだ事項を元にしております。

# 感想

久しぶりのオフラインイベントで、日本橋の KABUTO ONE というホールが会場でした。

https://kabutoone.tokyo/

↓の写真を見ると「広っ！？」って感じですが、実際はこれを３つのホール (ホールA、ホールB、ルーム1) に仕切ってまして、私は ホールA での登壇です。

<img alt="画像転載元: KABUTO ONE 様 (https://kabutoone.tokyo/)" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/7f91dc90-6033-95f5-0a8c-a86fcc3d2bfc.jpeg">

登壇前の控室では、(同時刻のセッションだった) Fastly 株式会社の大室さんとご一緒させて頂き、お互い色々とお話をさせて頂きました。ありがとうございました！

> 全然関係ないですが「なんで、M1 Mac なのに HDMI アダプタ使ってるの？」と聞かれまして、今更 M1 Mac には HDMI ポートが内蔵されている事を知る...笑

当日はちょっと接続にトラブり、外部ディスプレイ表示ではなくミラーリングに。
元々トークスクリプト等は無いので良いのですが、時間は運営の方に手書きで教えてもらい、運営の方にはお手数をお掛けしました🙏

![blankboard_man.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/1bd559c0-8a6c-ae97-0272-9053c76d0a3e.png)

> ↑リアルにこういう感じの手書きでして頂きました。

あと個人的にこれ↓は必須ですね。講演台に張り付かなくてすみます。

<img width="400" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/a290e473-bf54-94ea-0e8a-4773458b8c57.jpeg">

# 聴講したセッション

カンファレンスの前半〜中盤はずっとブースに立っていたので、残念ながら聴講できず。現地でブースまで足を運んで頂いた方は本当にありがとうございました！

https://twitter.com/mai_lm_/status/1679297605740957696

当日は各ブースがスタンプラリーになっており、巨大ガチャが引けます。景品の一位はなんと HHKB なのですが、残念ながらハズレました...😭

<img width="400" alt="ファインディ株式会社様 開発生産性カンファレンス" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/60131/3c1cfd2e-b27c-e9bd-15fe-51bc1e6b8565.jpeg">

最後３セッションは次の通り聴講しました。

| 時間 | ホール | 講演者 | セッションタイトル |
|:-----|:------|:--------|:--------------------|
| 16:15〜 | B | Chatwork株式会社 田中さん | フィーチャーチーム化への取り組みと、それを支える組織マネジメント体制 |
| 17:10〜 | A | デジタル庁 藤本さん | 行政府の開発生産性向上のアプローチと、目指す未来 |
| 18:05〜 | B | 日本CTO協会 広木さん | 大規模言語モデル時代の開発生産性 |

Chatwork株式会社 田中さんのセッションは、Team Topologies 本が有名になる以前からの取り組みでフロー効率を高める為のチーミング・組織〜という話題でした。全てがフィーチャーチーム化できる訳ではなく、デザイナーを代表に専門性が高い人材は横断する必要がある、は弊社もそうで難しいよね〜と強く共感しました🤔

デジタル庁 藤本さんのお話も面白く、特に「行政の開発ってどんなだろ？」という興味で聴講しましたが、めっちゃ大変そうだなぁ...と言う感想です笑
でもデジタル庁で働く事の意義「日本の生産性を上げる」事が伝わって面白そうだな！と思ったので、とても素敵なセッションでした。

広木さんは終了４分前でやっとセッションタイトルを回収されてて笑いましたが、やはり大変説明がお上手で内容だけでなく講演自体も私にとっての学びになりました！

# さいごに

この様な素晴らしいカンファレンスを開催して頂いたファインディ株式会社の皆様、本当にありがとうございます！
Qiita CLI から記事を書いてみた

# はじめ

https://qiita.com/release-notes#qiita-cli%E3%82%92%E3%83%99%E3%83%BC%E3%82%BF%E7%89%88%E3%81%A8%E3%81%97%E3%81%A6%E5%85%AC%E9%96%8B%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F

先日のリリースノートにて発表されたこちらの Qiita CLI 興味があったのでこちらを使って記事を投稿してみようと思います。

# 準備

基本的に以下のREADMEを参考に準備を進めます(ドキュメントが日本語なのでわかりやすいです！)

https://github.com/increments/qiita-cli

## 1. Node.js(18.0.0以上)が必要とのことでリポジトリを作ってそこにnodenvでバージョン指定する

```
$ mkdir qiita-project
$ nodenv install 19.2.0
$ nodenv local 19.2.0
```

## 2. Qiita CLIをインストールとセットアップ

npm からQiita CLIパッケージをインストールし、セットアップコマンドを実行して初期準備を行う

```
$ npm install @qiita/qiita-cli --save-dev
$ npx qiita init
```

## 3. Qiitaからアクセストークンを作成、CLI上で認証設定

GUI上でアクセストークンを作成(`read_qiita` `write_qiita` にチェック)してそれを一時メモ

![スクリーンショット 2023-07-04 20.29.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/226348/ae13c61a-6785-7386-7401-4983bf097fd4.png)


CLI上でメモしたアクセストークンを使用して認証

```
$ npx qiita login
Enter your token: [アクセストークン]
Hi Satoooon!
```

私は git 管理したかったのでこちらで first commitを行いました

# 記事の作成

## 1. ベースファイルの生成

記事は public/ に格納しなければいけないようなのでディレクトリの作成と作成用のコマンドがあるのでそちらを使ってマークダウンファイルの生成を行います

```
$ mkdir public
$ npx qiita new article1
```

## 2. 記事の設定、本文の執筆

上記生成コマンドを実施すると public配下にマークダウンファイルが作成されています。そちらを開き諸々設定を行います(設定の諸々についてはREADMEを参照してみてください)

とりあえず私は以下の感じで設定をしてみます(マークダウン記法を知っている方でしたら問題なく使用できそうです)

```article1.md
---
title: こちらQiita CLIで記事を書いたものです
tags:
  - Qiita
private: false
updated_at: ''
id: null
organization_url_name: ruby-dev
---
# new article body
```

# 3. プレビューモード

執筆途中のものはプレビューモードで閲覧可能とのことで一回実行してみました
するとQiitaとの同期が行われ公開済みの記事がマークダウン形式でpullされてきました(ファイル名はidになっていました)

```
 $ npx qiita preview     
Preview: http://localhost:8888
```

こちらでネット環境がなくても手元の環境でプレビュー表示ができます！


# 4. 公開

記事が執筆できたので公開コマンドにより公開をします

```
$ npx qiita publish article1
```

※ 後にこの記事のURLをCLI内で執筆した記事に添付したく更新も行いましたが、公開も上記と同じコマンドでできます :thumbsup: 


こちらQiita CLIから試しに投稿した記事になります

https://qiita.com/Satoooon/items/199998b9ad2f9dc2a7f2

# 所感

- ネット環境がなくても執筆が進められることができることとプレビュー画面を手元の環境で立ち上げて確認できるのは良かったです
- 今回は手元のコンソールから投稿だけ行いましたが、Github のワークフローなどを活用して連携することもできるようなので便利に使えるCLIですね
- 現状、CLIは公開・更新のみで削除等のコマンドはありませんが、CLIで削除は誤って削除してしまうと怖いと思うので一旦無くても良いかなと思います(削除機能があればそれはそれで便利だと思いますが)
- 逆にネット環境がなくても記事が書けることができますが、画像の添付はあらかじめURLの指定が必要なためネット環境がなければ手元の画像をすぐに添付できないのは少し勿体無いなと感じました
  - 今後の改修で公開時に手元に格納している画像をアップロードと特定のフォーマットで指定していた箇所に添付を行えるような機能があると便利そうだなと思います
- まだベータ版とのことで今後こちらの機能に期待したいです！
Dockerfile & Docker Compose

# Dockerの基本
build : Dockerfile + build context からイメージを作成する
ship : 作成したDocker Imageをレジストリ（Docker hub）を用いて他のhostへ配布する
run : Container ImageからContainerを実行する


## DOCKERFILEとは
コンテナの作成手順書

## build contextとは
コンテナに格納するプログラムなどのファイル群

## Dockerの「コンテキスト」とは
> docker buildコマンドを実行したときの、カレントなワーキングディレクトリのことを ビルドコンテキスト（build context）と呼びます。 デフォルトで Dockerfile は、カレントなワーキングディレクトリにあるものとみなされます。 ただしファイルフラグ（-f）を使って別のディレクトリとすることもできます。 Dockerfileが実際にどこにあったとしても、カレントディレクトリ配下にあるファイルやディレクトリの内容がすべて、ビルドコンテキストとして Docker デーモンに送られることになります。

https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/dockerfile_best-practices/

## Docker Composeとは
複数のコンテナで稼働するDockerアプリケーションを定義、実行するためのツール。例えばDjangoでWebサービスをDocker composeを用いて展開したい場合は以下のような設定を構築する
```Dockerfile:Dockerfile
FROM python:3.7
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
COPY . /code/

```

```yml:docker-compose.yml
version: '3.7'

volumes:
  pgdata:
    driver_opts:
      type: none
      device: $PWD/dbdata
      o: bind
services:
  nginx:
    image: nginx
    container_name: container.nginx
    ports:
      - "8000:8000"
    volumes:
      - ./nginx/conf:/etc/nginx/conf.d
      - ./nginx/uwsgi_params:/etc/nginx/uwsgi_params
      - ./src/static:/static
      - ./nginx/log:/var/log/nginx
    depends_on:
      - web
  web:
    build: .
    container_name: container.uwsgi
    command: uwsgi --ini /code/mainproject/django.ini
    volumes:
      - ./src:/code
    expose:
      - "8001"
    depends_on:
      - db
  db:
    image: postgres
    restart: always
    container_name: container.postgres
    ports:
      - "5432:5432"
    environment:
      POSTGRES_DB: "postgresdb"
      POSTGRES_USER: "admin"
      POSTGRES_PASSWORD: "test"
      POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --locale=C"
    volumes:
      - pgdata:/var/lib/postgresql/data
    hostname: postgres

```
https://qiita.com/Ryooota/items/782fbbb0f9cf0a75df36
Homebrewのインストールの際に’Need sudo access on macOS!’と表示される

先日MacBook AirにMySQLの環境を構築するためにHomebrewをインストールしようとしたところうまくいかなかったため、その備忘録として解決策を書き記します。

#### 作業環境
M1チップを搭載したMacBook Air(2020)
macOS Venture 13.4.1

#### 事象
MySQLの環境構築の準備としてHomebrewをインストールしようとしたところ、’Need sudo access on macOS!’と表示されて作業が完了できない

#### 原因
結論から書くと、**作業時にログインしていたローカルアカウントに管理者権限がないこと**が原因でした。

このMacBookではプログラミングの他にも動画を見たり軽くゲームをやったりするのですが、作業に集中するためにプログラミングとそれ以外の作業でログインするアカウントを分けています。プログラミングの方のアカウントはローカルアカウントで、このアカウントに管理者権限が付与されていませんでした。そのためシステムの変更をすることができず、’Need sudo access on macOS!’のエラーが表示されたと思われます。

#### 解決策
管理者アカウントの方でログインし直し、プログラミング用のローカルアカウントにも管理者権限を付与しました。改めてもう一度Homebrewのインストール作業をやり直したところうまくいきました。
[QuickSight] SPICE容量を食いつぶしているデータセットを探す

## 背景

* SPICEの容量を食いつぶしているデータセットを特定したい!!
* QuickSightのUIでは各データセットのSPICE利用容量を把握するのが困難!!

## 対応

* aws cliをつかってデータを取得しました
* aws account idを書き換えてください
* jsonを扱うためjqコマンドが必要です

```quick_sight_dataset_list.sh
#!/bin/bash

# QuickSightでSPICEを利用しているデータセットを一覧化します
# Id, 名称, 容量, 作成日, 更新日の情報を出力します

# QuickSightでSPICEを利用するデータセット一覧を取得
function get_quicksight_datasets() {
  aws quicksight list-data-sets --aws-account-id 0123456789 \
    --query 'DataSetSummaries[?ImportMode==`SPICE`].DataSetId'
}

# メインの処理
function main() {
  # QuickSightのデータセット一覧を取得
  datasets=$(get_quicksight_datasets)

  # 文字列を配列に変換
  IFS=$'\n' read -d '' -r -a array <<< "$datasets"

  for item in "${array[@]}"; do
    # データセットidを抽出
    result="${item//\"/}"
    result="${result// /}"
    result="${result//,/}"
    # データセット情報を取得
    dataset=$(aws quicksight describe-data-set --aws-account-id 0123456789 \
      --data-set-id "$result")

    dataset_name=$(echo "$dataset" | jq -r .DataSet.Name)
    dataset_size=$(echo "$dataset" | jq -r .DataSet.ConsumedSpiceCapacityInBytes)
    dataset_id=$(echo "$dataset" | jq -r .DataSet.DataSetId)
    dataset_created=$(echo "$dataset" | jq .DataSet.CreatedTime)
    dataset_updated=$(echo "$dataset" | jq .DataSet.LastUpdatedTime)
    # CSV形式で出力
    echo "$dataset_id,$dataset_name,$dataset_size,$dataset_created,$dataset_updated"
  done
}

# メイン関数の呼び出し
main
```

## 実行

```
$ bash quick_sight_dataset_list.sh
```

こーんな感じの一覧がでてくれば成功です
```
00000000-1111-2222-3333-444444444444,データセット名1,120000,"2022-12-05T14:39:59.943000+09:00","2022-12-05T14:40:15.929000+09:00"
00000000-1111-2222-3333-555555555555,データセット名3,508000,"2023-07-05T14:39:59.943000+09:00","2023-07-05T14:40:15.929000+09:00"
```

## まとめ

* 結果をスプレッドシートに貼って容量で降順ソートしたら、容量を食いつぶしているデータセットを無事に発見することができました
* bashスクリプトビギナーなんです...変なところあったらすみません

## 文献

大変助かりました。ありがとうございます!!

https://dev.classmethod.jp/articles/quicksight-calc-spice-usage/
Azure Logic Apps を使って、RSSの新着情報をLINE公式アカウントでまとめて配信する方法

# 背景
能登町ホームページでは、新着情報をRSSで提供しており、以前に、このRSSを利用して、メッセージ配信をするLINEアカウントを作成しました。これにより、ホームページを見なくても、LINEで最新の情報を受け取ることが出来ていました。その際の記事はこちらです。

https://note.com/yukima77/n/nccb02522f776?magazine_key=m5aa7ab7e1f14


しかし、LINE公式アカウントの仕様が変更になりました。以前は、月に1000メッセージまで無料で配信できましたが、現在は200メッセージまでになりました。これでは、ユーザー数も増えてきており、RSSの新着情報が多いときにはメッセージが足りなくなりました。というか、過去の傾向を見ているとほとんどんの月で足りません。

https://www.linebiz.com/jp/news/20230125/


そこで、今回は、メッセージ配信の方法を変更することにしました。RSSの新着情報があるたびに配信するのではなく、1週間に1回の配信としました。また、1回のメッセージに複数の新着情報をまとめて表示するようにしました。これで、しばらくは運用できるはずです。

# 従来の方法
RSSの新着情報があるかどうかを1時間ごとに確認し、新着情報をあるたびに、その新着情報を1メッセージとしてLINEに配信していました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/62390f6e-a1b2-4e04-45d0-8992050760e0.png)

# 変更内容
* フィードを見に行くトリガーを繰り返しに変更して、週１に変更
* 一覧をすべて取得し、過去７日以内のフィードのみを取得
* １メッセージで送信

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/e59af934-9cd8-facb-e623-c8d88377a568.png)

# 結果
このようにして、Azure Logic AppsでLINE公式アカウントのメッセージ配信を変更しました。
以下は、実際に送信されたメッセージの例です。以前までは、１つの新着情報につき、１メッセージだったのですが、まとめて１メッセージで送信されるようになりました。

![MicrosoftTeams-image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21408/b3f199df-d747-021f-68c4-cecb4873d9c9.png)

# まとめ
今回は、Azure Logic Apps を使って、RSSの新着情報をLINE公式アカウントでまとめて配信する方法について紹介しました。Azure Logic Appsは、様々なアプリケーションやサービスを連携させることができる便利なツールです。ぜひ、皆さんも試してみてください。
質問(しようと)したら不思議と自己解決する話

## はじめに

みなさん、質問してますか？

私はしてます。
質問は、働くどころか生きて行く上で必須のスキルだとさえ思っています。

もちろん、質問したことによって、相手が有益な情報を提示してくださり、問題解決につながることもあります。また、そのように期待してるからこそ、誰しも質問するのでしょう。
ただ一方で、質問しようとするプロセス自体にも価値があるということに最近気付かされたので、そのことについて語っていきます。

## そもそも

質問とは「相手から適切な情報を得るためのコミュニケーション」です。
しかし、それだけではありません。実際には、それを行う前段として、私たちが問題について深く考え、思考を整理するための過程があります。

## その効果

質問するまでの過程こそが自己解決の第一歩となります。

というのも私も普段仕事をする中で、わからないことが多数あるので人によく質問をするのですが、結局自分の問題なので、その背景などは自分が一番知ってるわけです。
だからこそ、有識者(質問する相手)に対してしっかりと背景を伝えないとスムーズな問題解決にはつながらないのです。

そのため、「わからん」となった場合には相手が必要になるであろう情報(問題の概要、自分なりの仮説、試したこと、etc)をまとめて整理し、質問をする必要があります。
……お気づきですよね？今回の肝はここです。

質問を準備する過程で、自分自身の思考がクリアになり、問題点が明確になるのです。

とはいえこれだけでは、不十分な説明だと思うので以下に続きます。

### 準備＝言語化

より詳細に考えてみましょう。
私たちがなにか他者に対して「質問したい」と思った際に、その事柄に関してきちんと説明できることはそう多くないでしょう。

そうです、そもそも自分たちは「わからないこと」がわかっていないのです。
だからこそ人に聞きたくなるわけですね。

ですが、じゃあそのまま「なにもわからない気持ち」だけを有識者にぶつけたところで、有識者も「知らんがな」となります。
なぜなら「わからないこと」の正体を明らかにするための情報が不足しているからです。

そのことぐらいはさすがに質問する側である私たちも経験によって理解しています。
なので基本的に質問する際には、相手が必要そうな情報を提示しようと準備（＝言語化）します。

この準備が問題を明確にしてくれるのです。

### 主観から客観へ

ではその準備段階で何をするでしょう。
質問する相手の顔を思い浮かべ、あの人はどんな情報を必要とするかなと想像しますよね？
その瞬間、あなたの思考は「主観」から「客観」へと移り変わる訳です。

未分だった問題が言語化を通じて、明確になり、さらに細分化されます。
はじめてそこで、自分が「わからないこと」がわかります。

### アプローチ 

もうここまで来てしまえば、あと一息です。
検索なのかもしれませんし、さらなる思索なのかもしれません、いえやっぱり質問なのかもしれません。
方法は様々ですが、問題に対して適切なアプローチをとることが出来るのです。
またどのアプローチが適切かも、ここまで準備を行ったあなたならばわかるはずです。

## まとめ

質問することは、単に他人に答えを求めるだけでなく、自己解決への道を開く強力なツールです。
問題を質問に落とし込むことで、思考が整理され、解決への道筋が見えてきます。
みなさん、たくさん質問(しようと)しましょう！

## 参考文献(というか個人的にみんな読んだ方がいいと思ってる記事)

https://qiita.com/seki_uk/items/4001423b3cd3db0dada7
こちらQiita CLIで記事を書いたものです

# Qiita CLIで記事を執筆・投稿行いました
- 初めて Qiita CLIを使ってこちらの記事執筆しました。
- 作成にあたった手順や流れ等は別で執筆しているのでそちら参考していただけると幸いです

以下の記事で実際にCLIのインストールから投稿まで行った内容を記載しております

https://qiita.com/Satoooon/items/57d5fcac8d99a0654f8c
ふりかえりの「象、死んだ魚、嘔吐」の呼び方を変えたい

# 書いたきっかけ
こちらの記事を読んで触発されて書きました。

https://qiita.com/piyonakajima/items/ad3c44d1dc377e41d394


ふりかえりの内容もいいけれど、叫ぶのって良いですねｗ
腹に溜まっているものを出している感と出しても良い雰囲気が作られる印象がしました。


# 前から思っていたが、名前が普及をさまたげているのでは・・・

> 象、死んだ魚、嘔吐

呼び方が仰々しいというか、、汚いと言うか、気持ち悪いと言うか、英語のニュアンスと違う感じがするんですよね
手法としては凄く良いと感じていて、定期的に試したいチーム状態のタイミングはあるのですが、なんだかテンションが乗らない


訳はこうですね
```
①「象」は口に出さないけれど全員が知っている真実。
②「死んだ魚」は、早くごめんなさいをしたほうがいい悩みのタネ。ほっておくと事態が悪化する。
③「嘔吐」は、人々が断罪されずに胸の内を話すこと。つまり「ぶっちゃけ」。
```

ちょっともやもや感じるところを書いてみました

### 象
英語でのことわざの「An elephant in the room」（部屋の中の象）という前提知識があってこそ伝わる表現なのかなと思います。
意味は「その場にいる人が皆認識しているけれど、あえて触れることを避けている、タブーな話題や重大な問題のこと」ということなので、振り返りの訳のそのままに近いです。


### 死んだ魚
なんというか、死ななくてもいいのでは。
死んだって言う表現のニュアンスが日本語だと強すぎて、魚と釣り合いが取れていない印象です。
死ななくても、まな板の魚とか、朝どれ海鮮とか、日本古来の直接表現するのではなく、豊かな表現力を発揮できるのかなと思います。
Qiitaの元記事からリンクされているブログでも寿司とかっていうアイデアも書いていましたね！
「鯛の美味しいタイミング」とかでも良いかもと思ったりしました。
腐りかけが美味しいといわれるという日本のコンテキストありきの表現で、グロさがない。


### 嘔吐
普通に汚くないですか？ 意見を出すというより、体調心配になりませんか？
日本語にはぶっちゃけっていう超いい感じの言葉があるので、直訳ではないけれど、そっちのほうがいいなぁと直感で感じました。
自分個人の体験だと、乗り物酔いで気持ち悪くなりやすいタイプで、あまり気持ちがいい言葉ではないです。嫌な気持ちの感覚も蘇ってきます。あれって吐き出すと気持ちいいんじゃなくて、ずっと辛いんですよね。
英語でこの言葉を使うときに別に気持ち悪い気持ちになってもらった方がいい意図はない気がします。むしろスッキリと吐き出して晴れ晴れして欲しいのだと思います。





### 感じたこと


それぞれの意味は説明すればOKではあるのですが、もうちょっと日本人に寄せても良いのかも？
と思ったりしました。


そこで、日本語のコンテキストを前提としたローカルな呼び方を考えてみました！

# 新しい案

それぞれのニュアンスに合わせて考えてみました。１つずつ解説します。


### 1. 釈迦に説法 (叫び声　：しゃかー！）
- 知ってるけど、あえて言う
- 普段はタブーのようになっているもの
- 当たり前過ぎていわないこと
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/7deb8071-82d9-9894-158f-e7e48fbd273c.png" width=50%>


### 2.三猿 (叫び声　：さるー！）
- 見猿、聞か猿、言わ猿
- ほっておこうとする事象
- 本当は将来のリスクになるのに、知らんぷりしていること、
- 見ていないこと、聞かないようにしていること、言わないこと
- 雪だるま。ほっておくほど大きくなる問題
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/b94038a2-7181-05fd-029d-712d346562fc.png" width=70%>


### 3.腹を割る(叫び声　：はらー！）
- ぶっちゃけ
- 懺悔室
- 告白
- 感じたままに話すこと
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17213/9da57702-d75b-b95c-500b-68befab764a9.png" width=50%>


# 呼び名は・・・

ということで、それぞれの内容を示すものは

- 釈迦
- 三猿
- 腹を割る

という３つを考えてました。

さて、このふりかえりの呼び方も考えてみたいです。
呼び案としてはオリジナルと同じく、釈迦・猿・腹 とストレートに呼ぶのもありですが、もう少し名は体を表した名前にしても良いかもと考えました。ふりかえりの観点としては「当たり前の共有」と解釈しました。それと同時に大事なのが「自分の考えていることを発言できない雰囲気の打破」です。

元のふりかえりについての詳しい説明は冒頭で紹介した [こちらの記事](https://qiita.com/piyonakajima/items/ad3c44d1dc377e41d394)にもあるので省略します。


ジャストアイデアで考えた結果のふりかえりの名称は！

### ふりかえり 「あたりまえ」 ！！


みんなが見ている当たり前
未来に見えている当たり前
自分が抱えている当たり前

みんな知っていると思っていた当たり前を共有するということ。それをあたりまえに共有するというストレートで分かりやすいふりかえりではと思い、「あたりまえ」というふりかえり名を考えました。


「あたりまえ体操」という某ネタにしようと思いましたが、著作権的にどうなるか分からないので諦めました。
日本のコンテキストを最大限に活かした名称だとは思ったんですけどね。


# みなさんからのご意見もお待ちしています

日本のコンテキスト前提でローカルに伝わるニュアンスを考えてみましたが、もしかしたら度の国でもいい感じに伝わるグローバル版を考えたほうが良いのかもしれませんね。寿司とか。


感想やみなさんの考えた呼び方アイデアあればコメント欄に頂けると嬉しいです！
Livebook でパッケージを検索、追加する

## はじめに

Livebook　は Elixir や Erlang のコードをブラウザ上で実行し、結果を視覚化できるツールです

データ解析や業務の自動化など、様々な用途で利用できます

https://livebook.dev/

Python における Jupyter をイメージすれば良いです

https://jupyter.org/

## セットアップセル

Jupyter の場合、インストール済のパッケージはノートブックで明示せずに使えます

そのため、 `pip install` のコマンドは必ずしもノートブックに記載されていません

Livebook の場合、ノートブック毎に別のプロジェクトになるため、必ず依存パッケージをインストールする必要があります

ノートブックのタイトルの下に、 "Notebook dependencies and setup" と書かれているセルがあります

セル内をクリックすることで、入力可能になります

![setup.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/58167529-c6d1-6deb-b113-00ce06cac977.gif)

ここがセットアップセルです

セットアップセルに以下のように依存パッケージを書き、左上の "Setup" をクリックすることで、パッケージがインストールされます

```elixir
Mix.install([
  {:explorer, "~> 0.6"},
  {:kino, "~> 0.10"}
])
```

![スクリーンショット 2023-07-18 19.56.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/668ac160-bbd5-dfdf-d77f-e2900e0792a6.png)

ここが Livebook の非常に良い点の一つです

Jupyter だと依存パッケージが必ずしも明示されないため、ノートブック単体で見たときの再現性が低くなります

Livebook は必ず依存パッケージが明示されるため、再現性は非常に高いです

## モジュールの検索、追加

このモジュール指定は非常に良いものですが、毎回リファレンスや GitHub で正確なパッケージ名、最新バージョンを確認するのは面倒です

というわけで、 Livebook 上ですぐに検索、追加できる機能があります

セットアップセルの右上、右端から3番目のアイコン（下画像赤枠）をクリックすると、パッケージ検索モーダルが表示されます

![スクリーンショット 2023-07-18 19.50.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/4d774c14-7861-4321-2d53-27b8f1844ab0.png)

パッケージ検索モーダルから "+ Add" ボタンをクリックすることで、簡単に各パッケージの最新バージョンをセットアップセルに追加することができます

![setup_search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/6cfde9c9-2e4d-5a7f-4921-800e57a4d55d.gif)

## 補完、ドキュメント表示

更に、インストールされたパッケージの補完やドキュメント表示も当たり前のようにやってくれます

![doc.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1485835/686258ff-d793-9d63-d271-490d39ea1a44.gif)

## まとめ

Livebook の便利機能はまだまだ大量にあります

しかもどんどんバージョンアップされています

今後にさらに期待ですね
netstat

yahooのipを調べる
```
[linuxstudy@localhost ~]$ ping www.yahoo.co.jp
PING edge12.g.yimg.jp (182.22.25.252) 56(84) bytes of data.
64 bytes from 182.22.25.252 (182.22.25.252): icmp_seq=1 ttl=128 time=27.5 ms
```
ブラウザでyahooにアクセス。
netstat発行。36216 portからyahooにアクセスしていることが分かる。
このポート番号はアクセスするたびに変わる
```
tcp        0      0 localhost.localdo:36216 182.22.24.252:https     ESTABLISHED
```
Next.js+Storybook+yarn Plug'n'Playでエラーになる場合の対処法

# 現象

以下の構成でstorybookがエラーで動かない

- Next.js
- Storybook
- yarn v3
- Plug'n'Play

# 対処法

`.yarnrc.yml`に以下を追記します。
```yaml:.yarnrc.yml
packageExtensions:
  "@storybook/nextjs@*":
    dependencies:
      "@babel/core": "*"
      webpack: "*"
```

以下のコマンドを実行します。

```bash
corepack yarn add -D styled-jsx postcss-import postcss-loader css-loader postcss-url
```

# 考察

yarn v3のPlug'n'Playではnode_modulesが廃止になり、依存パッケージは`.yarn/cache`に格納されるようになりました。パッケージをimportしたとき、yarnが`Module._load`をオーバーライドすることで依存関係の解決を行っているようです。[^1]
`.yarnrc.yml`に`nodeLinker: node-modules`を記述しPlug'n'Playを無効化した場合、storybookは問題なく機能します。
これらのことから、yarnによりオーバーライドされた`Module._load`は、パッケージの`peerDependencies`をimportできないようになっていると考えられます。[^2]

```
❯ corepack yarn sb
@storybook/cli v7.0.27

WARN   Failed to load preset: "@storybook\\nextjs\\preset"
ERR! Error: @storybook/nextjs tried to access webpack (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound.
ERR!
ERR! Required package: webpack
ERR! Required by: @storybook/nextjs@virtual:...
:
```

この場合は`@storybook/nextjs`が自身のpeerDependenciesである`webpack`にアクセスできないので、`@storybook/nextjs`のdependenciesに`webpack`を指定すれば動作します。
Plug'n'Playではパッケージがzipファイルに格納されていて、package.jsonを直接編集できません。`yarn patch`を使えば可能ですが、今回は`.yarnrc.yml`の`packageExtensions`を使用し、パッケージの依存関係を拡張することで解決しました。
今回のように、`Error: [パッケージ名] tried to access [依存パッケージ名] (a peer dependency) but it isn't provided by ...`のようなエラーが発生する場合、packageExtensionsを用いた解決法が有効である場合が多いです。

# 参考

https://stackoverflow.com/questions/70044428/validationerror-invalid-options-object-css-loader-has-been-initialized-using-a

[^1]: [Plug'n'Play Whitepaper](https://github.com/yarnpkg/rfcs/blob/master/accepted/0000-plug-an-play.md)より
[^2]: 出典が見つからなかったため、「別の問題があり、今回の対処法が偶然機能した」などの可能性があります。
next-sitemap でトップページの設定(priority等)を変更する方法

## 環境
next.js 13.4.10
nex-sitemap ^4.1.8

## コード
```next-sitemap.config.js
module.exports = {
  siteUrl: 'https://example.com',
  changefreq: 'weekly', //任意で変更
  priority: 0.5, //任意で変更
  transform: async (config, path) => {
    const priority = path === '/' ? 1.0 : config.priority;
    const changefreq = path === '/' ? 'daily' : config.changefreq;
    return {
      loc: path,
      changefreq,
      priority,
      lastmod: config.autoLastmod ? new Date().toISOString() : undefined,
      alternateRefs: config.alternateRefs ?? [],
    };
  },
};
```

## 参考
https://github.com/iamvishnusankar/next-sitemap
ABC310 - B - Strictly Superior 自己解法

# 問題

https://atcoder.jp/contests/abc310/tasks/abc310_b

# 考察
$N$この商品のうち、ある商品に対して上位互換に値する商品の組み合わせは存在しますかという問題です。上位互換と言える条件は問題文に示されています。$N$も$M$もあまり大きな値を取らないです。そのため、$N$この商品のうち2個の組み合わせを選ぶ選び方を全探索しても十分間に合います。全ての選び方を試し、条件にあるものが無いかを探しましょう。
条件が複雑なため、満たしているかの判定が難しいです。1つ1つ確実に実装していきたいです。
下記の内容のものを実装できれば条件を満たすかの判定ができます。

:::note info
1. $P_j > P_i$ならば、条件を満たさないことが確定。次の組み合わせを調べる(continue)
    - それ以外なら2へ進む
1. 「$i$番目の製品がもつ機能」のうち、「$j$番目の製品が持ってない機能」が1つでも存在すれば条件を満たさないことが確定。次の組み合わせを調べる(continue)
    - それ以外なら3へ進む
1. $P_i > P_j$を満たすならば、上位互換なる組み合わせが存在することが確定。"Yes"を出力して終了
    - それ以外なら4へ進む
1. 「$j$番目の製品がもつ機能」のうち、「$i$番目の製品が持ってない機能」が1つでも存在すれば上位互換なる組み合わせが存在することが確定。"Yes"を出力して終了
    - それ以外なら次の組み合わせを調べる
:::

# 提出コード(コンテスト後)

https://atcoder.jp/contests/abc310/submissions/43723295

ご不明点などがあれば教えていただけると幸いです。
Azureのリソースが削除できなくなったの時の対応方法。

# はじめに
はじめましてKonbuGXと申します。
仕事でAzureを触っているのですが
ある日リソースが削除できなくなりました。
その時の対応を備忘録として残したいと思います。

## 1.Azure Portalから削除
Azure Portalからリソースの「概要」を開きます。
上部に「削除」とありますので、それを押して削除を試みました。
わたくしはエラーでできませんでした。

## 2.PowerShellからコマンドで削除
PowerShellからコマンドを打ち込んでリソースの
削除を試みます。
こちらもエラーで削除できませんでした。

## 3.リソースエクスプローラーで編集してから削除
リソースのプロピジョニングが「失敗」となっているので
リソースエクスプローラーで対象のリソース(jsonファイル)のプロピジョニングを編集して
Portalなどから削除します。
こちらはプロビジョニングの編集が失敗となるので削除できませんでした。

## 4.完全モードデプロイでの削除
jsonファイルを編集して上書きし、PowerShellからコマンドで
リソースを無理やり削除します。
こちらもエラーで完全モードデプロイでの削除ができませんでした。

## 5.サポートに依頼
何をどうやっても削除できないのでマイクロソフトのサポートに依頼しました。
Azure Portal内からサポートリクエストで依頼しましょう。

## 削除できなかった原因
結局、データセンター内のデータがおかしかったようで
修正していただき無事削除できました。
根本的な原因はわからずじまいですが
おそらくこれが原因やろという行動がありますので下記に記載いたします。
・ポータルからリソースを削除し、後日デプロイ履歴から再デプロイを行う。
　再デプロイするとリソースのプロビジョニングが失敗となったので
　これが原因そうです。うまく削除が行えてなかったのかと思います。

## 感想
はじめてAzureを触ったのですが、インフラがはじめてですので
知らないことだらけですごく大変です。
ただ、人並みにインフラの知識・技術は習得したいと思っていたので
四苦八苦しながら学んでいこうと思いました。
パッケージインストール後のスクリプト実行

第二世代管理パッケージインストール後に、特定のApexロジックを実行し、初期設定を行うことができます。
実装するにはInstallHandlerをインプリメントしたクラスを作成し、onInstallメソッドにロジックを記述することです。

```Java
global class PostInstallClass implements InstallHandler {
    global void onInstall(InstallContext context) {
        if(context.previousVersion() == null) {
            // 以前のバージョンが null である場合、つまりパッケージが初めてインストールされている場合
            PublicSetting__c publicSetting = new PublicSetting__c();
            publicSetting.TriggerEnabled__c = true;
            insert(publicSetting);
        }
    }
}
```

テストが必要なので、テストクラスを書きます。
```Java
@isTest
private class PostInstallClassTest {
    @isTest
    static void testInstallScript() {
        PostInstallClass postinstall = new PostInstallClass();
        Test.testInstall(postinstall, null);
        Test.testInstall(postinstall, new Version(1,0), true);
        
        System.Test.startTest();
        List<PublicSetting__c> publicSettingList = [Select id, TriggerEnabled__c from PublicSetting__c];
        System.Test.stopTest();

        System.assertEquals(publicSettingList.size(), 1, 'PublicSettingが作成されていません。');
        System.assertEquals(publicSettingList[0].TriggerEnabled__c, true, 'PublicSettingがtrueに設定されていません。');
    }
}
```Java

最後に、パッケージバージョン作成時に--post-install-scriptに上記のクラスを指定します。
※：第二世代管理パッケージのみ有効みたい、ロック解除済みパッケージに指定したら、エラーで怒ってました。
正規分布の条件付き期待値と分散

# 確率密度関数
一般式：
```math
f(\mathbf{X}) = \frac{1}{\sqrt{(2\pi)^k |\Sigma|}} \exp\left(-\frac{1}{2} (\mathbf{X} - \boldsymbol{\mu})^T \Sigma^{-1} (\mathbf{X} - \boldsymbol{\mu})\right)  
```
２変量の場合：
```math
f(x, y) = \frac{1}{2\pi\sigma_X\sigma_Y\sqrt{1-\rho^2}} \exp\left(-\frac{1}{2}\frac{1}{1-\rho^2} \left[\left(\frac{x-\mu_X}{\sigma_X}\right)^2 - 2\rho\frac{x-\mu_X}{\sigma_X}\frac{y-\mu_Y}{\sigma_Y} + \left(\frac{y-\mu_Y}{\sigma_Y}\right)^2\right]\right)
```
１変量の場合：
```math
f(x) = \frac{1}{\sqrt{2\pi\sigma^2}} \exp\left(-\frac{(x-\mu)^2}{2\sigma^2}\right)
```
#### 条件付き期待値と分散(1変数だけの条件のとき)
以下のk変数の多変量正規分布があるとする
```math
\mathbf{X} = \begin{pmatrix}
X_1 \\
X_2 \\
\vdots \\
X_k
\end{pmatrix} \sim N\left(
\begin{pmatrix}
\mu_1 \\
\mu_2 \\
\vdots \\
\mu_k
\end{pmatrix}
,
\begin{pmatrix}
\sigma_1^2 & \rho_{12}\sigma_1\sigma_2 & \cdots &　\rho_{1k}\sigma_1\sigma_k \\
\rho_{21}\sigma_2\sigma_1 & \sigma_2^2 & \cdots & \rho_{2k}\sigma_2\sigma_k \\
\vdots & \vdots & \ddots & \vdots \\
\rho_{k1}\sigma_k\sigma_1 & \rho_{k2}\sigma_k\sigma_2 & \cdots & \sigma_k^2
\end{pmatrix}
\right)
```
$X_1$=$x_1$の条件のもとで、$X_2, X_3, \ldots, X_k$の条件つき期待値と分散はそれぞれ、
```math
\begin{align*}
E(X_i|X_1=x_1) &= \mu_i + \sum_{j=2}^{k} \rho_{ij} \sigma_i \frac{\left(x_1 - \mu_1\right)}{\sigma_1} \quad \text{for } i = 2, 3, \ldots, k\\
V(X_i|X_1=x_1) &= \sigma_i^2(1 - \rho_{i1}^2) \quad \text{for } i = 2, 3, \ldots, k
\end{align*}
```
特に2変量正規分布において、$X=x$が与えられている時の$Y$の条件付き期待値と分散は、
```math
\begin{align*}
E(Y|X = x) &= \mu_Y + \frac{\sigma_{XY}}{\sigma_X^{2}}\left(x - \mu_X\right)　\\
&= \mu_Y + \rho\sigma_Y\frac{x - \mu_X}{\sigma_X}\\
V\left(Y|X=x\right) &= \sigma_Y^2(1 - \rho^2) \\
&=\sigma_Y^2-\frac{\sigma_{XY}^2}{\sigma_X^2}
\end{align*}
```
と表される。

#### 条件付き期待値と分散(多変数の条件がついている時)
説明のため、
```math
\mathbf{X} = \begin{pmatrix}
X_1 \\
X_2 \\
\vdots \\
X_k
\end{pmatrix} \sim N\left(
\begin{pmatrix}
\mu_1 \\
\mu_2 \\
\vdots \\
\mu_k
\end{pmatrix}
,
\begin{pmatrix}
\sigma_1^2 & \rho_{12}\sigma_1\sigma_2 & \cdots &　\rho_{1k}\sigma_1\sigma_k \\
\rho_{21}\sigma_2\sigma_1 & \sigma_2^2 & \cdots & \rho_{2k}\sigma_2\sigma_k \\
\vdots & \vdots & \ddots & \vdots \\
\rho_{k1}\sigma_k\sigma_1 & \rho_{k2}\sigma_k\sigma_2 & \cdots & \sigma_k^2
\end{pmatrix}
\right)
```
を
```math
\mathbf{X} = \begin{pmatrix}
\mathbf{X_1} \\
\mathbf{X_2} 
\end{pmatrix} \sim N\left(
\begin{pmatrix}
\boldsymbol{\mu_1} \\
\boldsymbol{\mu_2} 
\end{pmatrix}
,
\begin{pmatrix}
\Sigma_{11} & \Sigma_{12}  \\
\Sigma_{21} & \Sigma_{22} 
\end{pmatrix}
\right)
```
と書き換える。$\mathbf{X_2}$が与えられた時の$\mathbf{X_1}$の分布の条件付き期待値と分散共分散行列は、
```math
\begin{align*}
E(\mathbf{X_1}|\mathbf{X_2}=\boldsymbol{x_2}) &= \boldsymbol{\mu_1}+\Sigma_{12} \Sigma_{22}^{-1}\left(\mathbf{X_2}-\boldsymbol{\mu_2}\right) \\
\Sigma_{11|2} &= \Sigma_{11}-\Sigma_{12}\Sigma_{22}^{-1}\Sigma_{22}
\end{align*}
```
と表される。2変量正規分布の条件付き期待値と分散にそれぞれ対応づけて覚える。
SQLite3::BusyException: database is locked を解決した方法

# 背景
railsチュートリアルをやってる途中で `rails s` でサーバーを起動し、seedファイルの最初のユーザーでログインしようとしたら以下のエラーが発生しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3515182/e48be9fd-8722-9dfc-dd92-39b69d6e4a87.png)

# 原因
`rails s` でサーバーを起動する前に `rails c --sandbox` でコンソールを開き、
```
> user = User.first
```
と、最初のユーザーに対する操作を行っていたためでした。
sandboxオプションをつけると、操作したレコードにロックがかかってしまうみたいです。
今回はsandboxオプションをつけて開いた、コンソールを閉じずに、サーバーを起動させたため、
最初のユーザーのレコードにロックがかかり、ログイン時にレコードの操作ができなかったのだと思われます。

# 解決方法
`exit`または`quit`でrailsコンソールを閉じて、サーバーを再起動する。

# 参考記事
https://zenn.dev/shuhei_takada/articles/18ba8524049a04



初心者あるあるかもしれませんが、調べても出てこなかったので投稿してみました。