OmniAICreator/Qiita-1.07M huggingface dataset:
データサイエンスのための線形代数 第12回 行列積の幾何学的意義

:::note info
本記事は数学講座[3.5 行列積の幾何学的意義](https://www.matongxue.com/lessons/561)を勉強して投稿したメモです。詳細は元の素晴らしい講座のページをチェックしてください。
:::

# 行列の左乗

$\boldsymbol{A}\boldsymbol{a}=\boldsymbol{b}$：

```math  
\underbrace{\begin{pmatrix}1&-1\\1&1\end{pmatrix}}_{\large\boldsymbol{A}}\underbrace{\begin{pmatrix}1\\1\end{pmatrix}}_{\large\boldsymbol{a}}=\underbrace{\begin{pmatrix}0\\2\end{pmatrix}}_{\large\boldsymbol{b}}
```

$aとb$がベクトル空間$\mathbb{R}^2$での列ベクトルです。自然基底での図は以下の通りです。

```math  
\boldsymbol{e_1}=\begin{pmatrix}1\\0\end{pmatrix},\boldsymbol{e_2}=\begin{pmatrix}0\\1\end{pmatrix}
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/a2ed4c64-4590-f1b2-5151-f31cd51ea6b0.png)

$a$が自然基底の$R^2$のベクトル、$b$が$a$を新しい基底の$R^2$のベクトルです。(自然基底の$R^2$にとって、場所が変っていますので、$b$での値も変わります。でも、$b$の相対位置が変わっていません。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/2db690d8-67e8-58e6-40df-279986674fd2.png)

ベクトル$b$が行列$A$(ベクトル空間)の列ベクトル組 { $c_1,c_2$ } の線形結合です。

:::note info
[1. 自然基底と非自然基底](https://qiita.com/Junlee/items/0036d5a1fcfbc2b71ba1#%E8%87%AA%E7%84%B6%E5%9F%BA%E5%BA%95)
[2. 線形結合](https://qiita.com/Junlee/items/aebd509d2b8f9a897125#%E7%B7%9A%E5%BD%A2%E7%B5%90%E5%90%88)
:::

# 行列の乗法

$\boldsymbol{A}\boldsymbol{B}$：

```math
\boldsymbol{A}=\begin{pmatrix}1&-1\\1&1\end{pmatrix},\quad\boldsymbol{B}=\begin{pmatrix}1&-1\\1&-1\end{pmatrix}
```

$B$の列ベクトルが以下のように二つ：

```math  
\boldsymbol{b_1}=\begin{pmatrix}1\\1\end{pmatrix},\quad\boldsymbol{b_2}=\begin{pmatrix}-1\\-1\end{pmatrix}
```
$\boldsymbol{A}\boldsymbol{B}$が以下のようになります：
```math  
\boldsymbol{A}\boldsymbol{B}=\boldsymbol{A}\begin{pmatrix}\boldsymbol{b}_1&\boldsymbol{b}_2\end{pmatrix}=\begin{pmatrix}\boldsymbol{A}\boldsymbol{b}_1&\boldsymbol{A}\boldsymbol{b}_2\end{pmatrix}=\begin{pmatrix}0&0\\2&-2\end{pmatrix}
```

以下のように、二つに分解できます。
```math 
\underbrace{\begin{pmatrix}1&-1\\1&1\end{pmatrix}}_{\large\boldsymbol{A}}\underbrace{\begin{pmatrix}1\\1\end{pmatrix}}_{\large\boldsymbol{b_1}}=\underbrace{\begin{pmatrix}0\\2\end{pmatrix}}_{\large\boldsymbol{b_1^{'}}}
```
と
```math 
\underbrace{\begin{pmatrix}1&-1\\1&1\end{pmatrix}}_{\large\boldsymbol{A}}\underbrace{\begin{pmatrix}-1\\-1\end{pmatrix}}_{\large\boldsymbol{b_2}}=\underbrace{\begin{pmatrix}0\\-2\end{pmatrix}}_{\large\boldsymbol{b_2^{'}}}
```

$b_1,b_2$がそれぞれ新しい基底の$R^2$ベクトル空間の位置の座標(自然基底のベクトル空間内の)になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327130/933216f9-245e-f89e-ad91-91a6b288b86f.png)


ベクトル$b_1$、$b_2$が行列$A$(ベクトル空間)の列ベクトル組 { $c_1,c_2$ } の線形結合です。
【SwiftUI】リストの無限スクロールを実装する

# はじめに
無限スクロールを実装したので簡略化したサンプルを記事にしておきます。

# 動画
![Simulator Screen Recording - iPhone 14 Pro - 2023-04-19 at 22.00.26.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d9b02604-0fb4-4f6c-fe59-61765e2ee780.gif)

# 実装
```swift
import SwiftUI

struct ContentView: View {
    @State var items = Array(1...100)
    
    private var lastItem: Int? {
        items.last
    }
    
    var body: some View {
        List(items, id: \.self) { item in
            Text(item.description)
                .onAppear {
                    updateItems(item: item)
                }
        }
    }
    
    private func updateItems(item: Int) {
        if let lastItem, lastItem == item {
            // 1番最後の要素が表示されたら`items`に100個追加
            items += Array(lastItem...lastItem + 100)
        }
    }
}
```

# おわり
今回の例では`Int`という実用性の無い無限スクロールでしたが、
投稿IDなどを使うことによってTwitterの無限スクロールのようなこともできるようになります。

投稿の場合は読み込み時間を考えて最後から5番目くらいの要素で更新をかけるとストレスのないスクロールを実現できると思います。
ParrotOS 5.2 でハッキングラボをつくってみる ２ 設定編（パッケージのアップデート、日本語化など）

# 初回起動から日本語環境の設定まで
第一回目からのつづきです
## 初回起動
![parrot1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/870555e5-d234-51cf-7d6c-c18d97628707.png)

「起動」をクリックして起動

インストール時に指定したユーザー、パスワードでログインする。


**起動後の画面**
![VirtualBox_Parrot_19_04_2023_12_26_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/e168ea5b-750a-f236-31f2-f51f9562803d.png)

デスクトップ環境には、Mateが採用されている。
上下にバーが配置され、上はリソースモニタや日付、音量が、下はメニューボタンやワークスペーススイッチャがある。日本語表示もすでにされている。

## 解像度の変更
左下のメニューをクリック語、「設定」>「
ディスプレイ」と進む。
検索欄から"display"と検索して実行しても良い。
任意の解像度に変更可能だ。

## スクリーンロックの無効化
同書では、スクリーンロックの無効化について触れられている。
ParrotSecurityのパッケージアップデートなどにどれくらいの時間がかかるかはわからないが、Kali Linuxのパッケージのアップデートやパスワード解析などは、時間がかかることが多かった。
その際に、いちいちスクリーンがロックされるのは非常に面倒である。（経験済み）
同書でも、「複数のゲストOSを立ち上げておき、日常のPC作業がホストOS側で行う (中略) ゲストOSはしばらく放置することが多く、そのゲストOSを操作するたびにパスワードを入力することは非常に手間」と書かれており、個人的には、ほぼ必須の作業ではないかと思う。

左下のメニューをクリック後、「設定」>「スクリーンセーバーのテーマ」と進む。
「アイドル状態になったらスクリーンセーバーを起動する」と「スクリーンセーバーを起動したら画面をロックする」のチェックを外す。
![secreensave.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/0e2d6794-0216-0306-25ff-2611b58c7950.png)

## パッケージのアップデート
このパッケージのアップデートと後に述べる日本語化は、順序を逆にしてやっても良い。

**パッケージのアップデート**
terminal（端末）を立ち上げる
以下のコマンドを実行。パスワードを聞かれたときは、パスワードを入力
```
$ sudo apt update
$ sudo apt upgrade
```
`sudo apt update`を実行すると、環境によって違うが、更新が必要なパッケージが多いことがわかる。更新には時間がかかる。今回、自分がやると１時間１５分位かかった。

## 日本語環境を設定
日本語キーボードに対応させり、日本語表示にしたりする。

### 日本語キーボードの追加
OSのインストール時に、使用するキーボードの種類を指定するので、これはやらなくても良い。日本語キーボードと英語配列のキーボードを併用したい場合に行う。
次のコマンドを実行。
```
$ sudo apt install task-japanese
```
実行し終わったら、ログインし直す。
左下のメニューから「設定」>「キーボード」へと進み、「レイアウト」タブをクリック。
日本のキーボードを追加する。

### 日本語を入力可能にする
次のコマンドを実行。
今回は、個人的な好みで、文字入力をFcitx-mozcで行うことにした。
```
$ sudo apt install fcitx5-mozc
```
実行し終わったら、再ログインまたは再起動する。ログイン後に、右上に文字入力のウィジェットが表示されている。
「半角/全角キー」などを押すと、日本語が入力可能になっている
![japanese.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535888/da64fee6-2e28-acdf-997e-d9b89a5f3c1a.png)

:::note
日本語入力（並びに日本語環境周り）のパッケージインストールは、`sudo apt install task-japanese task-japanese-desktop`でやっても良いと思います。
:::

### 日本語表示にする
KaliLinuxでは、
```
$ sudo dpkg-reconfigure locales
```
コマンドで、設定する必要があった。
ParrotOSでは、する必要なし。

### タイムゾーンを日本にする
OSインストール時に設定しいるので、変更する必要ない。
KaliLinuxでは、
```
$ sudo dpkg-reconfigure tzdata
```
コマンドを実行。
東京を選択して終了。
`date`コマンドで、日本時間となっていることを確認。

## 必要ないパッケージを削除
アップデート作業や日本語パッケージの導入で、たくさんのパッケージが不要になった。
` sudo apt autoremove && sudo apt autoclean`で、必要ないパッケージやキャッシュを削除する。
nimで競プロするときに、長さ・要素数が0かもしれない整数列の入力を処理する方法

## バージョン

nim: 1.0.6

## 要約
`"".split()`は`@[""]`を返すので、`""`に`parseInt`をしてエラーになってしまう。
`"".splitWhiteSpace()`は`@[]`を返すので長さが0になりうる時は`splitWhiteSpace`を使う。

## 説明

(`toTuple`は自作マクロです。気にしないでください。)

例題: https://atcoder.jp/contests/abc289/tasks/abc289_b

### `split` をつかう

```nim
# 入力の処理部分だけ抜粋
let
  (N, M) = stdin.readLine.split.map(parseInt).toTuple(2)
  A = stdin.readLine.split.map(parseInt)
```
[splitを使った提出](https://atcoder.jp/contests/abc289/submissions/40769410)

結果: RE
サンプルにもある長さが0の時にエラーになってしまう。

### `splitWhiteSpace` をつかう
```nim
# 入力の処理部分だけ抜粋
let
  (N, M) = stdin.readLine.split.map(parseInt).toTuple(2)
  A = stdin.readLine.splitWhitespace.map(parseInt)
```
[splitWhiteSpaceを使った提出](https://atcoder.jp/contests/abc289/submissions/40769249)

結果: AC

## 結論

配列タイプの入力の長さが0になりそうな時は`splitWhiteSpace`を使うといい。

## ちなみに

なぜこんな仕様なのか調べると、`split`の結果を`join`し直した時に元に戻るからという理由がでてきた。確かに。

自分はpythonで育ったので、一つの関数でできたら嬉しいなと思って`splitWhiteSpace`を紹介したが`split`して`filterIt(it != "")`してもいい。

また、本題以外の説明を省いているのでわからなかったら聞いてください。または調べてください。
【個人開発】方向音痴でも迷わないイラストマップつくった

## つくったもの
https://twitter.com/3dantasymap/status/1638314131047714817?t=ihSb03LY-bMW1AxU8YOqYQ&s=19
## 自己紹介
非エンジニアのじょうもんです。普段はIT系企業で企画をしています。あと夜間建築学生も。
学校の合間に趣味で個人開発しています！よかったらTwitterで交流してください。

## この記事の概要
- 動物園に行ったときにイラストマップを持ってあるくけど、現在地がわからない
- WEBで現在地がわかるイラストマップを作ろう！ついでにいろんな情報載せよう
- Leaflet.jsとillustrator、QGISを使用することで作成できたよヤッター
## なぜ作ったか
現在地がわからないひとが多い＆自分もわからなくなることがおおい
イラストマップだと情報がごちゃごちゃして見えにくいことがある
動物が起きているときに見たい
じゃあどうすれば良い？
### 解決案
- 現在地が表示されるWEBマップを作成し、マップ内の動物のマーカーをタップするとポップアップが開いて、たくさんの情報を提供してくれる。
- ユーザー同士が動物が起きていたか教えあう

## どのように作ったか
ベースとなるマップライブラリは、Leaflet.jsを使用しました(これしか使えない)。
まずはマップをイラレで作成したあと、QGISでジオリファレンスとタイル化。
動物のマーカーは、イラストが難しかったので、adobeから拝借して配置。
マーカーだけは、Firestoreから読み込んでいます。
Firebaseにデプロイして完成！

## こだわり
こだわったところは、動物ごとの起きてる起きてない情報の更新です！ユーザーがボタンをタップするとfirebaseのデータが更新されます。これで起きてる動物から見に行くことも可能になりました！

## おまけ(ハリポタ風マップも)
https://twitter.com/3dantasymap/status/1586269278755782659?t=9XbwGxdOu3Qy3U_pYCVWrQ&s=19
RubyでAtCoder ABC278(A, B, C, D)を解いてみた

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

# A - Shift
https://atcoder.jp/contests/abc278/tasks/abc278_a
```ruby:a-278.rb
n, k = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
puts n <= k ? ([0] * n).join(" ") : (a[k,n] + [0] * k).join(" ")
```
## 解説
問題文を言い換えると、「先頭からK個要素を取り除き、後ろに0をK個追加する」となります。なお、N<=Kの場合はN個の0を要素としてもつ配列が答えとなります。

# B - Misjudge the Time
https://atcoder.jp/contests/abc278/tasks/abc278_b
```ruby:b-278.rb
h, m = gets.split.map(&:to_i)
loop do
  a, b = h / 10, h % 10
  c, d = m / 10, m % 10
  if a * 10 + c < 24 && b * 10 + d < 60
    puts "#{h} #{m}"
    exit
  end
  m += 1
  if m == 60
    m = 0
    h += 1
  end
  if h == 24
    h = 0
  end
end
```
## 解説
問題文の通りに実装すればOKです。なお、時間は24になったら0でリセット、分は60になったら0にリセットして時間をインクリメントする必要があります。

# C - FF
https://atcoder.jp/contests/abc278/tasks/abc278_c
```ruby:c-278.rb
n, q = gets.split.map(&:to_i)
hash = {}
q.times do
    t, a, b = gets.split.map(&:to_i)
    case t
    when 1
        hash[[a,b]] = true
    when 2
        hash[[a,b]] = false
    when 3
        puts hash[[a, b]] && hash[[b, a]] ? "Yes" : "No"
    end
end
```
他の方の提出結果を見てみたところ、以下のような方法もあるようでこちらの方が高速です。
```ruby:別解
n, q = gets.split.map(&:to_i)
hash = {}
q.times do
  t, a, b = gets.split.map(&:to_i)
  case t
  when 1
    hash[a] ||= {}
    hash[a][b] = true
  when 2
    hash[a][b] = false if hash[a]
  when 3
    puts hash[a] && hash[a][b] && hash[b] && hash[b][a] ? "Yes" : "No"
  end
end
```
## 解説
連想配列を使って問題文の通りに実装することで十分間に合います。

メモ
・`||=`：偽か未定義なら代入

# D - All Assign Point Add
https://atcoder.jp/contests/abc278/tasks/abc278_d
```ruby:d-278.rb
gets
a = gets.split.map(&:to_i)
q = gets.to_i
hash = {}
a.each.with_index { |factor, i| hash[i + 1] = factor }

q.times do
  t, a, b = gets.split.map(&:to_i)
  case t
  when 1
    hash = Hash.new(a)
  when 2
    hash[a] += b
  when 3
    puts hash[a]
  end
end
```
## 解説
t=1のときの要素をすべてaに変えるという操作は、`Hash.new(a)`を使うことで実装することができます。

# 終わりに
クエリを使う問題は結構好きですね。

https://qiita.com/shoya15/items/50fd17e37d7c64f2b166
正規表現まとめ

## 説明
以下のリンク先で、正規表現の練習ができます。

https://weblabo.oscasierra.net/tools/regex/

検索対象文字列
abcde

正規表現
[^a]：a以外の文字を検索。
[a-z]：a〜zまでを検索。
^a：先頭にaがあれば引っかかる。
a$：末尾にaがあれば引っかかる。
a|b：aまたはbを検索
(apple)：単語として検索したい時

## 参考
https://www.udemy.com/course/linuxlpic
C#を勉強した時にやったことリスト

# はじめに
C#を勉強し始めたときに使ってみて良かった本、ツールをまとめます。

# 書籍

- [作って楽しむプログラミング　Visual C# 2019超入門](www.amazon.co.jp/dp/B081ZK5LZL)
    - C#とWindows Formを使ってじゃんけんゲームを作る本。
    - C#の基本文法とWindows Formの使い方を一通り触れる
    - 比較的薄い本なのでとっつきやすい。ゲームを作るので気楽に取り組める。

- [独習C#](www.amazon.co.jp/dp/4798175560)
    - 分厚すぎてウッとなるが辞書的に使うのに適している
    - 私は完全未経験エンジニアだったので一から通読したが、プログラミング関連の基本用語を抑えることができたのでそれは良かった。
    - コードの例が豊富に載っているし、ただ文法を列挙するだけでなくメリットやその機能がある理由を書いてある。


# サイト

- 未確認飛行C

https://ufcpp.net/study/csharp/

C#について網羅的に述べているブログ。C#の機能を網羅するばかりか、
nullに関するまとめ記事

https://ufcpp.net/study/csharp/rm_nullusage.html

C#のバージョンごとの新機能

https://ufcpp.net/study/csharp/cheatsheet/ap_ver11/

などの記事も豊富にある。いつもお世話になっております。

また、paizaラーニングのスキルチェックは文法を手に覚えさせるためによく使っていた。

https://paiza.jp/challenges
Azure Administrator Associate(AZ-104)合格体験談

先日Azure Administrator Associate(AZ-104)に合格しました！

![scoreReport.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332975/6fc8e2c9-9cc9-ed9f-97ae-d7dcf8ad0c88.png)

約2年前に取得したAzure Fundamentals(AZ-900)以来久しぶりの取得です。
今回はAzure Administrator Associate(AZ-104)の勉強方法や注意点について記載していこうと思います。

# 概要
Administratorという名前の通り、アクセス権などの管理やコスト、監視といったAzure自体の管理者・技術者としての知識や技術を問われる資格です。
難易度はアソシエイト(中級)の位置づけがされています。

[試験時間]
・120分

[問題数]
・60問前後
(私が受けた時の問題数は忘れました。。。)

[合格点]
700点/1,000点

[出題形式]
・選択形式
・はい/いいえの2択の選択形式
・ケーススタディ

[受験料]
・¥21103(+税)

[資格の有効期限]
1年間

※最新の情報含め、詳しくは以下をご確認ください。

https://learn.microsoft.com/ja-jp/certifications/exams/az-104/

# 勉強期間
(だらだらと半年。本腰をいれて)1ヶ月

# 勉強方法
### 0.Microsoft learn

https://learn.microsoft.com/ja-jp/certifications/azure-administrator/

手始めにMicrosoftの公式ページに手を付けましたが、「何を書いてあるかさっぱり分からない」「量が膨大」などの理由から挫折しました。

### 1. 参考書

https://amzn.asia/d/6rAyBjA

公式ページの挫折を経て、上記の参考書を購入し1周しました。(ここでやっと本腰を入れる。)
やっぱり自分でお金を払って参考書を買うと気合が入るのか？内容がとてもよかったのか？挫折することなく1周できました。

### 2. Udemyの問題集(英語)

問題集のレビューを読む限り、実際の試験レベルに対応している問題集が英語のものしかなく、覚悟を決めて英語版を購入しました。

各ブラウザの翻訳に加え、画像の中の英語は、iPhoneやiPadの「テキスト認識表示機能」を利用して解きました。手間ではあるものの思ったより苦になりませんでした。

↓テキスト認識表示機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3332975/8005dfd2-508d-e30f-d01b-70da10171a0e.png)

むしろ補足や解説は英語版のほうが詳しく(購入する問題集によると思いますが)、「今後は最初から英語版購入でも良いかも?」と思ったほどでした。

### 3. 実機に触れる
なかなか全てのサービスを触ってみるのは難しかったですが、気になったサービスは項目名や設定値だけでも確認するようにしました。

# 注意点

### 資格が1年間で失効する
　Azureの資格のうちFundamentalsを除き、有効期限が1年しかありません。
3大クラウドを比較してみてもAzureが最も短命です。

* Azure：1年間(Fundamentalsは無期限)
* GCP：2年間
* AWS：3年間

#### 期限を延長するためには
期限が切れる半年前に再認定の案内がメールで届き、オンラインの試験を受けることで無料で更新することが可能(だそうです。まだやったことがないので再認定をした時に記事にしようと思います。)

https://learn.microsoft.com/ja-jp/certifications/certification-expiration-policy

### 問題文は頭から読まない
受験時のテクニックになりますが、問題文は基本的にリソースの構成説明から始まります。(「sub1という名前のサブスクリプションとsub2という名前のサブスクリプションがあり～」みたいな。)

これがとても分かりにくいです。図がないことに加え、日本語で受験する場合は特に文章が分かりにくく頭に入ってきません。

そのため、素直に構成を理解するよりも先に、**何を答える問題なのか先に確認すること**をオススメします。

時間も限られているので、全ての問題でホワイトボードに構成図を書くことは難しいと思います。私が構成図を書いたのは、ケーススタディ+数問くらいでした。

# 最後に
今回の記事が今後試験を受ける誰かの参考になれば幸いです！
Salesforceでフローを作成しよう～数値項目の値の数だけレコード作成方法(ループを使用)

こんにちは
本橋孝昭です

今回はSalesforceのフローを作成しました

※ループではなく割り当てを使うフローはこちら
https://qiita.com/Takaa/items/c9f287fd95d49fe0138c


内容としては
・親レコードの数値項目を設定すればその数だけ子レコードの作成を行う

です

例として
・商談に売上回数　カスタム項目（数値）作成
・商談の子オブジェクトとしてカスタムオブジェクト「売上」作成
-カスタムオブジェクト「売上」と商談は参照関係
-カスタムオブジェクト「売上」日付には商談の完了予定日+nか月が記載
-カスタムオブジェクト「売上」日付には商談の金額/売上回数が記載

・カスタム項目　売上回数を入力すれば、その数だけ売上レコードが作成


上記フローを作成します

これをすれば例として
「分割回数」を12と入力すれば売上レコードが12レコード作成されます

![売上回数01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f36db019-ac6d-11ce-1ed6-8449da2fdfed.png)
![売上回数02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7024883e-530a-1de1-d78b-e2463348e7a1.png)


![売上回数03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/6cfabe5c-754c-d409-3262-a38f3859b3a4.png)


※割り当てを使用したフローはこちら

https://qiita.com/Takaa/items/c9f287fd95d49fe0138c

フローの概要はこちらです

![フロー01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/517ce03f-95c7-5d92-766a-e5a54f08227e.png)

早速みていきましょう

開始条件

![フロー02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/ebc76bfe-23b2-a814-fad0-800b2abab12a.png)


![フロー03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/54dfe6ec-4590-9df1-f502-40e90398a3bb.png)

![フロー04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/c1f6d4b7-9ff2-3c66-cc8b-9c2a7b8c9db5.png)

![フロー05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/fc49bec2-312d-8c1e-448e-011c60d96d0d.png)

![フロー06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a3646f2a-145f-8f79-dbbd-f0ebf7af9a36.png)


おまけ
売上名（例）
TEXT({!UP}+1)&"売上レコード"&TEXT({!$Record.CloseDate})

![フロー07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/bb96e4dc-e7be-c538-eb02-09b2a01c13fc.png)


売上日

ADDMONTHS ({!$Record.CloseDate}, {!UP})

![売上日.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/e7951939-f658-df1f-a06a-8a8de49d5a8e.png)


金額
FLOOR({!$Record.Amount}/{!$Record.SalesNumber__c})

![金額.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/143b65ab-32df-bdea-b6f1-b10237294547.png)
Flutterとは？初心者向けに解説

Flutterは、Googleが開発したオープンソースのフレームワークで、Android、iOS、Web、デスクトップ向けのネイティブアプリケーションを開発することができます。Flutterは、Dartというプログラミング言語を使用し、ウィジェットと呼ばれる再利用可能なUI要素を使用して構築されています。Flutterには、多数のウィジェットが用意されており、これらを組み合わせることで、美しいネイティブアプリケーションを開発することができます。

# Flutterの特徴
Flutterには、以下のような特徴があります。

- 高速かつ美しいユーザーインターフェースを提供することができる
- 1つのコードベースで複数のプラットフォーム向けのアプリケーションを開発することができる
- Dartというプログラミング言語を使用することで、高速な処理が可能となる
- ホットリロード機能を搭載し、開発サイクルが短縮される

# Flutterの学習リソース
Flutterを学ぶためには、以下のリソースが役立ちます。

- 公式ドキュメント: Flutterの基本的な概念や使い方が解説されています。
- Flutterコミュニティ: Flutterに関する情報共有やコード共有が行われています。
- Flutterのチュートリアル: 初心者向けのチュートリアルが用意されており、手順に従ってアプリを開発することができます。

# まとめ
Flutterは、Googleが開発したオープンソースのフレームワークであり、美しいネイティブアプリケーションを開発することができます。Flutterを学ぶためには、公式ドキュメントやチュートリアル、Flutterコミュニティなどが役立ちます。初めてFlutterに触れる場合でも、豊富なリソースが用意されているため、挑戦することをおすすめします。
「オブジェクト指向で書けるチーム」の作り方

# 材料
- オブジェクト指向※1に詳しく経験のあるリーダー：1人
- オブジェクト指向で書かせたいメンバー※2：少々(1〜4人)
- イチからチームで作れる大きさのプロジェクト※3：1つ

※1 オブジェクト指向でなくDDDでもデザパタでも代用可能
※2 「オブジェクト指向って美味しいの?」レベルのメンバーでも十分可能。設計に興味があるメンバーがいると仕上がりが速くなります。
※3 既存の設計にあまり依存せず、設計の自由度が高い案件だとよりよく仕上がります

# レシピ
### 1.「今回のプロジェクトはオブジェクト指向で書きます。異論は認めん」とリーダーが高らかに宣言する

すべてはここから始まります。ポイントは、**リーダーの絶対王政**であること。

プログラムを手続きでしか書いたことないメンバーは、そもそもオブジェクト指向で書くと何がいいのか体験していません。なので、理論を教えて事前に納得してもらうより実際に見せたほうが圧倒的に早いです。そして、見せるにあたってメンバーに口答えさせずに粛々とOOP(オブジェクト指向プログラミング)を実行する必要があります。

余談：
ちなみにウチでやったときは、メンバー全員が手続きで書く世界しかしらないレベルでした。プロダクトには脳死で作られたサービスクラスが氾濫しており、メンバーはプリミティブな型でやりくりする石器時代の住人です。(私もその一人です)

もう一つのポイントは、**リーダーが事前に設計を考えない**こと。

あえて回り道をしながら設計していくことで、さっきの設計と今書いた設計の比較ができ、なぜこう設計すべきなのかという理解が深まるからです。ただし、リーダーにとっては「設計を考えない」というのはかなり精神的苦痛を伴います。体調が悪くなった場合は速やかに医師に相談してください。

### 2. “モブプログラミングで”開発をスタートする

手っ取り早くチームにOOPを普及させるために、モブプログラミングのメリットである「最速で知識が伝播する」という性質を利用します。モブプログラミングをやったことがなくとも、やり方だけさらっとググって見様見真似でやるだけで十分です。

注意：
コーディング途中の「なんでこうするんですか?」という質問は無視してください。日が暮れます。まずは出来上がったコードを見せることだけ考えてください。


### 3. メンバーが不満を口にし始める

数時間〜1日リーダー主導でモブをやっていると、メンバーが「意味がわかりません」「今何やっているのかわかりません」「やり方変えませんか?」とぶつぶつ文句を言い始めます。メンバー側は「概念をオブジェクトにする」という考え方を知らない石器時代の住人なので、現代テクノロジーに拒絶反応を示し始めます(一番ブツブツ文句言っていたのは私です。)

肉を炊いたらアクが出てくるのと同じレベルで自然な現象なので、リーダーは無視して絶対王政を貫いてください。くじけてはなりません。

### 4. 機能をひとつ作り上げた頃にメンバーがなんとなく良さを理解している

1機能作り上げたあたりで、メンバーがざっくりとオブジェクト指向の良さを体験し始めます。以下のようなミーハーな感想が出てくるでしょう。

- 「めっちゃ読みやすい!!」
- 「ポリモーフィズム(ダックタイピング)かっけえええ!」
- 「テスト書きやすぅぅぅぅ」

かわいいですね。ここから、設計に面白さを見出したメンバーは自発的に設計本を読み漁るようになるでしょう。スパイスとして、開発途中におすすめ本を伝えて勉強を同時並行で進めてもらうのもよいです。

### 5. 慣れたらペア・ソロに切り替えて自分で書かせる

ここからは、メンバーが自分ひとりでも設計できるようにペア・ソロでタスクをアサインし、コードレビューで改善していきます。このあたりでメンバー相互で設計に関するレビューを行うようになります。PRでの設計レビューが難しい場合、ウチではモブレビューという手法を取り入れています。リファクタをモブで行うイメージです。

絶対王政スタートから半年ほどで、かなり洗練されたOOPをチームに根付かせることができていることでしょう。

### 6. プロダクトの全体的な設計に目がいくようになる

これまでは小・中規模のモジュール単位での設計がメインでしたが、ここからさらにMVCなどのフレームワークにおいて各モジュールの適切な粒度なんかをチームで議論し始めます。よく言う「ファットコントローラー」「ファットモデル」問題ですね。ここまで来ると、日々の開発の中でより洗練された設計、より実益のある設計(過剰設計の配慮)に向かってメンバーが自走し始めるため、定期的に勉強会を開催する程度で十分になります。

これで、一旦の完成です。お試しあれ☆

# P.S.

ネタっぽく書いてますが、ウチのチームで効果実証済みの方法ですので「チームメンバーをオブジェクト指向で書けるようにスキルアップさせたい」とお考えの上長・リーダーの方はぜひ参考にしていただければと思います。
【Python】仮想環境(venv)を使えるようになりたい

# はじめに
名前がおどろおどろしくてよくわからないもの、「仮想環境」
怖そうな名前をしているが色々とメリットがあるらしい。

例えば、Pythonをexe化する際に余計なライブラリを梱包せずにすむので軽いexeを作成できる。
他にも、異なるバージョンを使い分けたり、全体の環境に影響を与えずにモジュールを差し替えられたりと便利。らしい。



# アウトプットイメージ
仮想環境を作成すると、作業ディレクトリ内に仮想環境ディレクトリと愉快な仲間たちが作成される。

仮想環境ディレクトリの名前はユーザーが任意に決めることができる。

``` :これが
work(作業ディレクトリ)
└ ***.py(実行するファイル)
```
↓
``` :こう
work(作業ディレクトリ)
├ ***.py(実行するファイル)
└ venv(仮想環境ディレクトリ)
  ├ Scripts
  | ├ activate.bat(仮想環境に入るために使う)
  | ├ deactivate.bat(仮想環境から出るために使う)
  | └ (その他ファイル)
  └ (その他ディレクトリ)

```


# 仮想環境の基本操作
コマンドプロンプトを起動して操作をおこなう


### 準備
カレントディレクトリを適当なところ（作業ディレクトリ）に設定する
```
cd 作業ディレクトリ
```


### 仮想環境の作成
実行後少し時間がかかってから、指定した名前で仮想環境ディレクトリが作成される。
```
python -m venv 仮想環境名
```


### 入る
仮想環境への出入りは仮想環境ディレクトリ内の`activate.bat`と`deactivate.bat`でおこなう。
```
仮想環境名\Scripts\activate.bat
```
無事に仮想環境に入れると、コマンドプロンプトの先頭に`(仮想環境名)`がつく。


### 出る
仮想環境から出て元の環境に戻る。
```
仮想環境名\Scripts\deactivate.bat
```
仮想環境を出ると先頭の`(仮想環境名)`は消える。


### 仮想環境の削除
この仮想環境が必要なくなった場合は、`python -m venv 仮想環境名`で作成された仮想環境ディレクトリを丸ごと消せばOK 


# pipの操作
生まれたての仮想環境には外部ライブラリは含まれていないため、ほとんどの場合`import`文で怒られが発生する。

仮想環境を作成した後はほぼ確実にpipを操作することになるのでpipの操作をメモっておきます。

### pipのアップグレード
自分の環境(WinPython)だとメイン環境のpipを最新にしても仮想環境のpipがなぜか最新にならない。(なんとかならんかね)

必要に応じてpipを最新版にする必要がある。
```
pip install --upgrade pip
```


### ライブラリのインストール
最新版をインストール
```
pip install モジュール名
```


バージョンを指定してインストール
```
pip install モジュール名==x.y.z
```


2.10以上で3以下の最新版をインストール
```
pip install 'モジュール名>=2.10,<3'
```


requirements.txtを使用してインストール
いまインストールされているライブラリをrequirements.txtに出力する方法も後述。
```
pip install -r requirements.txt
```

### 入っているライブラリとバージョンの確認
一覧で表示
```
pip list
```


requirements.txtに出力
```
pip freeze > requirements.txt
```

# エディタを使いたい
`pip`を用いて仮想環境内にエディタをインストールをする必要がある
## Spyder
インストール
```
pip install spyder
```
起動
```
spyder
```

## Jupyter
インストール
```
pip install notebook
```
起動
```
jupyter notebook
```

# さいごに
この作業ディレクトリをgit管理にしてしまうのがいいのかな？
Flutter Admob アプリ起動広告の注意点


アプリ起動広告は起動時にやる広告なので、最初のmain()で実行する形にしないと審査でリジェクトされます。

例えばこんな感じ。

    main　→　Splash　→　トップ画面

上記のパターンでトップ画面の中で広告を表示させるinitやshowを使った場合、審査では申請がおりません。
もちろんSplashの中でもアウトです。

<img width="350" alt="スクリーンショット 2023-04-19 20.48.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/494487/d2a85045-bd1c-9b7a-85ab-50788ccbea94.png">

こんな感じで申請した後すぐにGoogleからメールが来ます。（Android）

広告を表示するために必要なデータの収集ができてないからという場合もあるのですが、それをやっても同じ結果が出る場合は広告を表示するための場所が悪いかもっていうところを疑ってみてもいいかもです。

参考までに。
Google Bard解禁~気になってた質問をぶつけた~

# Google Bard

Googleが展開する大規模言語モデル「LaMDA」をベースに作られた軽量モデル「Bard」で動くGoogle Bardが先日ついに日本でも解禁されました。今回は以前から気になっていた政治的公平性を問う質問と、簡単な関数の実装をさせる質問をしてみたので共有したいと思います。

Google Bardは[Bardの公式サイト](https://bard.google.com/?hl=en)からwaitlistに登録できます。私は登録から半日程度でアクセスできるようになりました。

# 政治的公平性を問う質問

近年SNSや検索などの大規模プラットフォーマーに対し以前よりも政治的公平性（中立と言っても良いかもしれません）を求める声が強く上がるようになってきました。一方で[Twitterがヘイト行為禁止ルールからLGBTQなどの標的例に関する文言を削除](https://www.itmedia.co.jp/news/articles/2304/19/news077.html)したり前経営陣がトランプ前大統領のTwitterアカウントを凍結したりとプラットフォームの政治的公平性は舵取り役によって揺れがちです。

Googleはどうなんだということでバイデンとトランプのどちらが良い大統領かと質問してみました。

![スクリーンショット 2023-04-19 14.25.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/7fb26901-7f2d-15c2-f591-2df46be7160a.png)

きちんと両者の一長一短を述べた上で、最後にはどちらが良いかは人によると念押ししています。公平な回答を返してくるのは大前提として、デリケートな話題は「私の答えることではない」と初めから逃げてしまうChatGPTよりも私は好感を持ちました。

# 関数の実装

せっかくなので普段ChatGPTでやってもらっている簡単なコーディングもやってもらうことにしました。今回のお題はTypeScriptでバブルソートを行う関数の実装です。

![スクリーンショット 2023-04-19 14.26.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/893208/6a61841f-9590-4ef6-d77f-17a65f838845.png)

良いですね。関数の完全さや正確さはもちろんのこと、関数の使い方を示すことで分かりやすい回答になっています。それだけならChatGPTも同じですが回答候補を３つ示して切り替えて比較できたり、Google検索への接続ができるようになったりしていますね。

個人的には回答の出典を示しているのがGoogleの強みが出ていて良いなと感じました。出典のリンクはきちんと踏めましたし、ChatGPTで出典を示させると404なリンクが返ってくることもあるのでリサーチ目的で使うときにはBardの方が優れているかもしれませんね。

Google Bardを試した記事は他の方も書いているのでぜひ：

https://qiita.com/MasaruYamazaki/items/a107d4455500420ffd5b?utm_campaign=popular_items&utm_medium=feed&utm_source=popular_items

# 先行者利益ってやはり凄いなと思う（小並感）

Google Bardは十分以上にChatGPTとタイマン張れるレベルですし、特にレスポンスの速さや出典の信頼性は競争優位です。しかしChatGPT Plusが十分快適で使い慣れてしまった私は乗り換えようとは思えませんでした。もしGoogle Bardが先にリリースされていたら今のChatGPTのポジションはGoogle Bardのものだったかもしれません。先行者利益の凄まじさを思わずにはいられませんでした。
【基礎学習/AWS】AWSのIAMポリシーに色々な種類があったので調べてみる

# 今回の課題
IAMのコンソール画面（下記の画像）の`アクセス管理`>`ポリシー`>`ポリシーを作成`から、
アクセス管理に必要な「ポリシー」を作成することができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/9db9bfdd-d4bd-a556-1846-7831852459e5.png)

IAM周りを色々と操作していると、上記で設定できるポリシー以外にも、
S3の`バケットポリシー`やIAMのロールの`信頼されたポリシー`など、ポリシーにも色々な種類があるということが分かった。
これらの違いについて、もう少し詳しく理解したいと思ったため、勉強のために記事にすることにした。


# ポリシーの分類
こちらの記事が非常に勉強になった。
ポリシーは以下の３種類あるとのことだった。

* ユーザーベースのポリシー
* リソースベースのポリシー
* IAMロールの信頼ポリシー

https://dev.classmethod.jp/articles/aws-iam-policy/


## ユーザーベースのポリシー
IAMユーザー, IAMグループ, IAMロールに関連付けるポリシーのこと。
上記の3つとも、IAMのコンソール画面の`アクセス管理`の項目から設定することができる。

![6dc2bb93a040d4f492142b63b4550932.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/bde7011e-1083-4da2-edff-33c89ca5442e.png)


ちなみに、ユーザーベースのポリシーは、
AWSリソースに対するアクションや操作をリクエストできるユーザーを指定する`Principal`要素の記述が不要なところが特徴。
不要な理由は、ポリシーを関連づけた先のIAMユーザー, IAMグループ, IAMロールが`Principal`要素の対象になるためである。


## リソースベースのポリシー
AWSサービス（リソース）に関連づけるポリシーのこと。
S3の`バケットポリシー`はこちらに該当する。

例えば、下記の画像のバケットポリシーでは、`Principal:"*"`となっている。
全てのユーザーに対して、`Resource`要素で指定したバケットやオブジェクトに`Action`要素で指定した操作の権限を付与しているといったイメージ。

![198aab9f43b98564e54598d638957a43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/ade98855-2455-902f-4047-7d461a146b64.png)


ユーザーベースのポリシーと違って、`Principal`要素の記述が必須になる。

ユーザーベースのポリシーは、ユーザー, グループ, ロールなど「人」に関連づけるため、
「誰が」AWSリソースの操作をリクエストできるかを指定する`Principal`要素の対象が自動的に決まるようになっていた。

しかし、リソースベースのポリシーは「人」ではなく「リソース」に関連づけるので、
`Principal`要素の記載をして、「誰が」の部分を明示的に指定する必要があるためだ。

## IAMロールの信頼ポリシー
上記の2つのポリシーとは少し異なり、IAMロールの権限移譲操作に特化したポリシー。
このポリシーを使用することで、特定のロールが持っている権限を他の`Principal`(ユーザー, グループ, ロール)に移譲することができる。

下記の画像だと、`RDSToS3_export`ロールの権限がRDSからエクスポートするときに付与されるといったイメージ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/e9b2e16f-bd63-34b9-5f4e-304087597546.png)

# まとめ
IAMのコンソール画面以外から設定できるポリシーについて、どんなものがあるのかざっくりと理解することができた。


#### 参考記事
https://qiita.com/c60evaporator/items/0121399880625cc1de51
BQでGCSのCSVデータからテーブルを構築する

# 結論

```sql:sql
CREATE OR REPLACE EXTERNAL TABLE your_table
(
  col1 INT64,
  col2 STRING,
  col3 DATE,
)
OPTIONS (
  format = 'CSV',
  skip_leading_rows = 1,
  uris = ['your_path']
);
```

こんなに簡単にGCSのCSVデータをBQで表現できるのですが、2点ハマったところがあり記載します。

# ハマったところ1

### formatパラメータでエクセル形式のデータを指定できない

最初はGCSにエクセルの形式でデータを入れており、OPTION部分の指定を

```sql:sql
OPTIONS (
  format = 'EXCEL',
  skip_leading_rows = 1,
  uris = ['your_path']
);
```
と指定していました。
流石にエクセルはいけると思い込んでずっと違うところでエラーを探していました...


# ハマったところ2

### CREATE OR REPLACE 'EXTERNAL' TABLE

GCSからデータを読み込み、テーブルを構築する際、CREATE TABLEではなく、CREATE EXTERNAL TABLEで指定する必要があります。

DBを更新しようと
CREATE EXTERNAL TABLEから
CREATE OR REPLACE TABLEに変更してしまい、エラーが返ってきました。

とても初歩的な部分ですが、自分用に執筆させていただきました🙇
asdf + rubocop でエラーが出たとき

ruby を新しいバージョンにして VSCode でコードを書いていたら、ファイル保存時に VSCode のターミナルにエラーが出ました。

```
Lint: executing rubocop -s '/home/mkt1234/Documents/prj/app/controllers/application_controller.rb' -f json...
Format: executing rubocop -s '/home/mkt1234/Documents/prj/app/controllers/application_controller.rb' -a...
No preset version installed for command rubocop
Please install a version by running one of the following:

asdf install ruby 3.2.1


or add one of the following versions in your config file at /home/mkt1234/.tool-versions

ruby 2.5.5
ruby 2.6.5
ruby 2.6.6
ruby 2.7.2
ruby 2.7.4
ruby 2.7.5
ruby 3.0.0
ruby 3.1.1
```

asdf で ruby 3.2.1 をインストールしたのに、もう一度インストールしろと言われる理不尽。

3.1.1 では rubocop を使えるのですが、昔 3.1.1 をインストールしたときに何をしたのか完全に忘れていたため、いろいろ試行錯誤した結果、ruby 3.2.1 の環境でふつうに rubocop をインストールし直せば良いと分かりました。

最初 VSCode の設定を疑っていて、だいぶ時間を使ってしまいました……

修正方法
```shell-session
mkt1234@DESKTOP:Documents/prj ‹main›$ ruby -v
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-linux]
mkt1234@DESKTOP:Documents/prj ‹main›$ gem i rubocop rubocop-rails
Fetching ruby-progressbar-1.13.0.gem
Fetching regexp_parser-2.8.0.gem
Fetching ast-2.4.2.gem
(以下略)
```
The agency: agency is agent-network. シンギュラリティへと向かう段階、あるいは、次世代のIT社会インフラ。

「エージェント」とは、すっかり古びてしまった言葉・用語ですが(死語？)、昨今のChatGPTやNotionやBird等のAIプロダクトの登場によって、(個人的に)「そろそろ見直し・再評価されてもよいのでは？」と思い、この記事を書きました。

初めに「エージェント」とは、なんらかの学習＆推論モデルと意思＆行動決定プロセスが実装されたクラスであり、これはシステム上で比較的自由かつ自律的に振舞うことのできる者達です。
※ビデオゲームでいうところのAI-BotやNPCみたいなものの延長だと考えていただいて差支えありません・・・。

エージェントは一つのユーザー環境(ユーザーの管理・コントロールする「プログラム‐ホスティング環境」あるいは簡単に言ってしまえば「ハードウェア環境」)に複数の個体が存在できて、その環境の中で活動するという定義です。

その主だった活動内容といえば、ユーザーからの刺激・入力に応じて、システム環境全体としてなんらかの反応・出力をするということであり、具体的には、絵を描くエージェントであれば、人物の描写を担当する個体があって、さらに、背景を描写する個体があったりと色々とエージェントの個体の可能性は考えられるわけです。

つまりは、一つのホスティング環境でメモリィを共用・共有しているそれぞれのエージェントの計算結果をそれぞれのタイミングでメモリィに書き込んでいき、最終的なユーザーの目指すところの成果物を作っていくわけですね・・・。

(繰り返しになりますが、)たとえば、人物を描写するエージェントがいれば、背景を描写するエージェントもいて、それぞれを同時に平行実行ないし並列実行していき、最後に人物部分と背景部分を合成・マージすることで、一つの絵画・イラストを完成させるというシステム全体の振舞い・動作イメージです。

ここで、個々のユーザー環境でそれぞれ独自に学習を経たエージェント達は、それぞれの学習結果(＝ユーザーの癖や嗜好と、ユーザーに固有の文章表現やデータ表現など)から、ユーザーにとってはセンシティヴあるいはクレデンシャルな情報をそぎ落とした形に変換・加工した上で、ユーザー環境間でシェアするというものです。
※個々のユーザー環境が、ネット上のクラウドにつながれているという前提・想定です。

その際に、クラウドが個々のユーザー環境(＝エージェント駆動環境)から、それぞれの抱え持つ学習結果ないし学習成果を一旦吸い上げて、それを一元管理して整理・分類してから、各々のユーザー環境に同時・一斉配信するという考え方です。
※この際、その働き・振舞いをするネットワーク全体を「agency」と仮に呼ぶこととします。

最後に、このアイデアは、この記事が書かれた同日にマクニカによって発表された「AI連合学習プラットフォーム」である「STADLE」という技術内容を参考にして書かせていただきました。
ChatGPT vs Google Bard

# ChatGPT vs Google Bard
 
GoogleのBardが日本でも使用できるようになったので、使ってみました。
ChatGPTはFree Planと比べみました。

## Google Bardの使い方

* Bardのページを表示する
* Google Accountでログインした状態で、使用するをクリック
* 少し立つと使用許可のメールが届く
* BardのページでChatが使用できるようになる。

注意
* 日本でも使用できるが、日本語でははまだ使用できない。2023-04-19現在
* 個人アカウントでの登録が必要になる。

## 対決

検証内容として両方に、SQLを生成してみる。

### 問題

```
データベースに日付と金額のテーブルがあります。
指定した期間で期間で週ごとに合計を集計するSQLをを記述してください。
データがない週は0で出力したいです。なるべく短いSQLで記述してください。 
```

日本語が対応していないのでどちらも英語で
```
There is a table of dates and amounts in the database.
Please write SQL to tally the totals by week for a period of time in a specified time period.
I want to output 0 for weeks with no data. Please write the SQL as short as possible. 
```

## 回答

### ChatGPT

```
SELECT DATE_TRUNC('week', calendar.week_start) AS week_start, 
COALESCE(SUM(transaction_amount), 0) AS total_amount
FROM (SELECT generate_series(date_trunc('week', start_date)::date, 
date_trunc('week', end_date)::date, '1 week') AS week_start 
FROM (SELECT '2022-01-01'::date AS start_date, '2022-12-31'::date AS end_date) t) calendar
LEFT JOIN transactions ON DATE_TRUNC('week', transaction_date) = calendar.week_start
GROUP BY week_start
ORDER BY week_start ASC;
```

* よく出来た回答だと思います。
* ```なるべく短いSQLで記述してください。 ```も、きちんと理解してくれています。いろいろと関数を使用しています。
* ```データがない週は0で出力したいです。```も、きちんと対応しており、データがない集計部分を生成するようにSQLを記述しています。
* 本当にこれが動くのか試していません。

### Bard

```
SELECT
  DATEADD(WEEK, DATEDIFF(WEEK, 0, date), 0) AS week_of,
  SUM(amount) AS total
FROM
  (
    SELECT
      date,
      amount
    FROM
      table_name
    WHERE
      date >= '2023-04-01'
      AND date < '2023-04-19'
  ) AS subquery
GROUP BY
  week_of
ORDER BY
  week_of;
```

* ```なるべく短いSQLで記述してください。 ```、```データがない週は0で出力したいです。```もあまり読み取ってくれなかった。
* わかりやすいSQLを生成しています。

## 結果判定

* SQLの生成の差は、現在、明らかな差があります。人間でいうと上級者と初級、中級？
* Bardの良いところは、表示速度が早いところです。すこし、考えてすぐ結果が表示されます。
* Bardが突貫工事で作られたと思うと、よく頑張っているとも思うが、今後を期待したいところ。

今後
* データベースを指定して比較しても良かったと思う。
* 質問も適当な指示なので、もっと詳細にしていしたら、出力も変わるかも。
テンプレートリテラル（文字列内にJavaScriptの式を埋め込む）

テンプレートリテラルとは、文字列内にJavaScriptの式を埋め込めるようにした構文。
これを使うと、通常の文字列に加えて、式を埋め込んで動的に文字列を生成できる。

なお、使わないでも以下のような書き方ができる。以下比較。

`表示：　Hello Fuku　！`
##### テンプレートリテラルを使用しない場合の例：
+演算子を使用して、文字列や関数をつなぐ。
```jsx
const name = "Fuku";
const greeting = "Hello, " + name + "!";

return <div className="text-black">{greeting}</div>;
```

##### テンプレートリテラルを使用した場合の例：
バッククォート(`)で囲まれた文字列内に${}で変数名を指定することで、JavaScriptの式を埋め込むことができる。

```jsx
const name = "Fuku";
const greeting = `Hello, ${name}!`;

return <div className="text-black">{greeting}</div>;
```
Qiitaの簡単な書き方まとめ



[Qiitaの簡単な書き方まとめ](https://qiita.com/kenbu/items/46103d5c595d468f3c82)


[Markdown記法 チートシート](https://qiita.com/Qiita/items/c686397e4a0f4f11683d)
UiPath FriendsのLT(ライトニングトーク)の裏側

# はじめに

はじめまして、がっきーです！
UiPathを始めて半年が経ち、いろんなことに挑戦しています！
その内の一つ、 ***UiPath FriendsのLT(ライトニングトーク)*** です！
2023年4月14日(金)に
「第11回 UiPath Friends 全国 ～知る・出会う・広める～春のLTワールド！～」
　イベント詳細：https://uipath-friends.doorkeeper.jp/events/151742
　　アーカイブ：https://youtube.com/live/e_ALjmpgjyY?feature=share
で2度目となるLT(ライトニングトーク)をしました。

今回、UiPath FriendsでLTをするにあって、
運営さんたちとどのように準備をしてきたのかをまとめます。
この記事を見て、
***「UiPath Friendsで発表やってみよう！！」***
と思えてもらえたら、嬉しいです。

# 発表当日までのスケジュール
- 3/2(木)～3/8(水)：Slackへの参加、プロフィールと発表タイトルの共有
- 3/9(木)～4/3(月)：プレゼン資料の作成、提出日
- 4/7(金)19時半～：リハーサル
- 4/14(金)18時半～：発表当日
＊各期間に対して、詳細を下でまとめました。

# Slackへの参加、プロフィールと発表タイトルの共有
運営さんたちが開催1ヵ月前にUiPath FriendsのSlackに登壇者たちを招待し、
開催までのスケジュールなどを共有しました。
共有後に、***イベントページに載せる名前、写真、プロフィール、Twitter、Qiita、
noteアカウント、LTのタイトル***を共有してほしいと言われました。
嬉しいことに共有後に、***みなさんリアクションしてくれました。***
これはUiPath Friendsのいいところだなと思っています！
私のプロフィールは、こんな感じにしました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/527a5ab6-9cdf-5de7-3959-f79f96638541.png)
他のLTの内容が気になりましたら、[イベント詳細](https://uipath-friends.doorkeeper.jp/events/151742)を見てください！

# プレゼン資料の作成、提出日
4/3(月)が納期なので、それまでに運営さんたちが用意したGoogleDriveに
プレゼンを提出しました。
作成期間中は、***Slackで和気あいあいと話ながら各々作業している様子がありました！***

# リハーサル
リハーサルは開催1週間前の19時半から行いました。
リハーサルでは、当日の流れやルールを説明を受けた後、作成したプレゼンを見せながら、
簡単にどんなことを話すのか共有しました。
その後、***運営さんたちから発表のアドバイスをもらいました！***

# 発表当日
19時に開催ですが、LTの登壇者たちは18時30頃に集合し、プレゼンの確認をしました。
この時、気を付けほしいことは、GoogleDriveに上げたプレゼンをダウンロードすると
アニメーションが消えることがあります。
↓の会話しているイラストには、「移動」と「拡大/縮小」のアニメーションを
付けていましたが、このアニメションが消えていました。
![無題の動画 ‐ Clipchampで作成.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3327229/c9809239-c400-9acb-dcea-d61e365b8ba2.gif)

発表時に消えていることに気づき、一瞬思考が止まりました。
***私は、1時間37分あたりで発表していて、今回ある挑戦をしました。***
会場の雰囲気や発表内容は、[アーカイブ](https://youtube.com/live/e_ALjmpgjyY?feature=share)があります。
***この時の会場は、LTの登壇者が11人もいたので、非常に盛り上がりました！***

# 最後に
この記事を最後まで見てくださって、ありがとうございます！
今回LTの裏側を記事にして、思ったことがありました。

このすばらしい会を開催できた裏側には、
***運営さんたちが円滑に進められるように準備をしてくれたこと。
私たち参加者は、感謝しないといけない！***
と思いました！

UiPath Friendsに参加することで知識や繋がりが増えます。
I hope to meet you all next time!
Happy Automation!!
ansible-playbookとterraformの連携

# 経緯

ブルー・グリーンデプロイの自動化なのに毎回毎回`グローバルip`が変わってしまって、ansibleの`hosts`を手で変更するのがめんどくさくなりました。

EIPを振ればいいとか言われてもお金がないので

# やったこと
- Terraform(EC2モジュール）
    - デプロイ時のグローバルIPを取得
- ec2_ip_rewrite.sh
    - PythonのconfigureParserで読める形に整形
- ec2ini_to_ansible_host.py
    - ansibleのインベントリファイルにあるhostsファイルへ書き込み


※xxxは環境に合わせて変更してください。ec2インスタンス2つを想定して作成してます。


``` main.tf(EC2モジュール)　モジュールが2つの場合は2つに　1つにまとめてる場合は書き方を変えなくてはいけません。

resource "null_resource" "output_instance_grobal_ip" {
  triggers = {
    xxx = aws_instance.xxx.public_ip
  }

  provisioner "local-exec" {
    command = "echo EC21A ${aws_instance.xxxx.public_ip} >> ec2_ip.txt"
}
}
```
``` terraformから出力されるファイル　ec2_ip.txt


EC21A xx.xx.xx.xx
EC21C xx.xx.xx.xx

```

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

file_path="./ec2_ip.txt"

# 変数でEC2のIDを取得する
ec2_ip_a=$(grep 'EC2-1A' ./ec2_ip.txt | awk '{print $2}')
ec2_ip_c=$(grep 'EC2-1C' ./ec2_ip.txt | awk '{print $2}')


# 挿入するテキストを指定する
new_text="[EC21A]\nhostname=${ec2_id_a}\n[EC21C]\nhostname=${ec2_id_c}"

# 挿入するテキストを含めた新しいファイルを作成する
awk -v text="$new_text" '
  {
    if (NR > 2) {
      prints
    }
    if (NR == 1) {
      print text
    }
  }
' "$file_path" > /tmp/file.txt

# 新しいファイルを元のファイルに戻す
cp /tmp/file.txt /tmp/ec2_ip.ini

```

Pythonのconfigparserで読み込む形に整形されます。
``` ec2_ip_rewrite.shで生成される一時ファイルec2_ip.ini
[EC21A]
hostname=xx.xx.xx.xx
[EC21C]
hostname=xx.xx.xx.xx
```

そしてhostsファイルのテンプレートを用意します。
``` hosts_rewrite.template
[EC21A]
@@@EC21A@@@ ansible_user=ec2-user ansible_ssh_private_key_file="xxxx.pem"

[EC21C]
@@@EC21C@@@ ansible_user=ec2-user ansible_ssh_private_key_file="xxxx.pem"
```

上記のec2_ip.iniとhostsテンプレートファイルを下記のPythonプログラムに読み込ませます

```ec2ini_to_ansible_host.py
import configparser
import shutil

class hosts_rewrite():
    def __init__(self):
        source_file = "./hosts_rewrite.template"
        destination_file = "./hosts"
        shutil.copyfile(source_file, destination_file)
        self.input_file = "./hosts"
        config = configparser.ConfigParser()
        config.read('/tmp/ec2_ip.ini')
        self.replace_text1 = '@@@EC21A@@@'
        self.replace_text2 = '@@@EC21C@@@'
        self.new_text1 = config.get('EC21A','hostname')
        self.new_text2 = config.get('EC21C','hostname')

    def ec2grobalip_add_ansible(self):
        with open(self.input_file, 'r') as file:
            content = file.read()
            content = content.replace(self.replace_text1, self.new_text1)

        with open(self.input_file, 'w') as file:
            file.write(content)

        with open(self.input_file, 'r') as file:
            content = file.read()
            content = content.replace(self.replace_text2, self.new_text2)

        with open(self.input_file, 'w') as file:
            file.write(content)

if __name__ == "__main__":
    main = hosts_rewrite()
    main.ec2grobalip_add_ansible()
    print("terraform→ansible-hosts OK")
```

あとは生成されたhostsをansibleのインベントリにいれて`ansible-playbook -i hosts site.yml`とか叩けば幸せになれます。なれました。

ansible.cfgに`ssh_args = -o StrictHostKeyChecking=no%`をいれないとsshのフィンガープリント確認でて完全自動にならなくなるから気をつけて










前回投稿した時に作ったシェルとpythonを応用しています。
https://qiita.com/sannchan/items/189ba0ca47dcd343b9b1
Angular14でビルド時、cssファイルで`Error: Module parse failed: Unexpected token (1:0)`とエラーが発生する

Angular13→14にバージョンアップ後に下記のエラーが発生したので、備忘録として残します。


## エラーメッセージ
```bash

./node_modules/codemirror/addon/hint/show-hint.css:1:0 - Error: Module parse failed: Unexpected token (1:0)
You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders
> .CodeMirror-hints {
|   position: absolute;
|   z-index: 10;


```

## エラー発生箇所
```ts
require("codemirror/addon/hint/show-hint.css");
```

## 原因
- v14.0.0のリリースノートに下記の記載がありました。

> We now issue a build time error since importing a CSS file as an ECMA module is non standard Webpack specific feature, which is not supported by the Angular CLI.
>
>This feature was never truly supported by the Angular CLI, but has as such for visibility.

ECMAモジュールとしてCSSファイルをインポートすることは、Webpackの標準機能ではなく、Angular CLIではサポートされていないため、ビルドタイムエラーを発行するようになりました。

この機能は、Angular CLIで本当にサポートされていたわけではありませんが、可視化のためにそのように表示されています。


## 修正方法
- angular.json 内のstylesに追加します。

```angular.json
{
  "projects": {
    "web-project": {
      ...(省略)
      "architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          ...(省略)
            "styles": [
            "src/styles.scss",
            "node_modules/codemirror/addon/hint/show-hint.css" // ここに追加
          ],
          ...(省略)
        }
      }
    }
  }
}

```


## 参考
- https://github.com/angular/angular-cli/issues/23273
- https://github.com/angular/angular-cli/releases/tag/14.0.0
TailwindCSS（justify〜による中央寄せの違い）

#### `justify-center`:　各アイテムを中央寄せする。
イメージ
|　　　◼️◼️◼️　　　|

#### `justify-between`:　各アイテムを均等に配置し、最初のアイテムは先頭に寄せ、最後のアイテムは末尾に寄せる。
イメージ
|◼️　　　◼️　　　◼️|
#### `justify-around`:　各アイテムを均等に配置し、各アイテムの両側に半分の大きさの間隔を置く。
イメージ
|　◼️　　◼️　　◼️　|
フォームで空白文字を送信しない方法

# フォームで空白文字を送信しない方法
フォームに入力した文字をボタンのonClickで送信するときに、「空白文字が含まれる場合は送信できないようにする」方法。
（React/TypeScript）

```
<Button
  onClick={() => {
    if (todo.trim() !== '') {
      postTodo()
      setTodo('')
    }
  }}>
送信ボタン
</Button>
```
上記の例では、`todo.trim() !== '' `という条件式で、空白文字を含むTODOリストを送信しないようにしています。`trim()`は文字列の「先頭と末尾から空白文字を除去」するメソッド。
条件式の意味は、todoの「先頭と末尾から空白文字を除去」した結果が空文字列でなければ、TODOリストを送信する、ということ。
Javaのクラスパス

## Javaプログラムのコンパイルと実行
`com.sample.app`パッケージの`Main.java`を実行したいとする。
FQCN(Fully Qualified Class Name：完全修飾クラス名)は`com.sample.app.Main`。
### コンパイルする
`$ cd`コマンドで`Main.java`を配置したディレクトリに移動してから、`$ javac`コマンドを実行する。
```shell_session:
$ javac Main.java
```
### 実行する
コンパイルによって生成されたクラスファイル(`Main.class`)を実行するには、`$ java`コマンドを実行する。
```shell_session:
$ java com.sample.app.Main
```
:::note info
`$ javac`コマンドはファイル名を指定する
`$ java`コマンドはクラス名(FQCN)を指定する
:::

### 配布
Javaのプログラムを配布する場合を考える。必要なものは以下の２つ。
+ コンパイルしたクラスファイル(物理的なデータ)
+ `main()`を持つクラス名(どのクラスかという情報)

通常、プログラムは上の例のように`Main.java`だけで構成されることはなく、複数のクラスやライブラリなどを使用するため、それらをコンパイルしたクラスファイルなどが全て配布対象になる。JAR形式のアーカイブにしてもOK。

`main()`はプログラムの起点となる場所なので、**エントリポイント**と呼ばれる。`java`コマンドには`main()`の存在するクラス名(FQCN)が必要。

JARファイルにした場合、`MANIFEST.MF`内にエントリポイントを記述する方法もある。

`$ java FQCN`が実行されると、**JVM**(Java Virtual Machine)は、FQCNで指定されたクラスの`main()`からプログラムを実行するが、`main()`の中で使用される、別ファイルの別クラスについては、**クラスパス**に指定する必要がある。JVMは、クラスパス以外に配置されたクラスファイルを見つけることができない。

## クラスパス

+ **クラスパス**はJVMが高速に目的のクラスファイルを検索するためのヒントとして利用される。具体的には、クラスローダは、**クラスパスに指定されたパスからクラスファイルを探し出す**。

+ クラスパスには、フォルダやJarファイルが指定可能。

+ クラスローダは、クラスパスに含まれるJARファイルの中までは検索しない。そのため、JARファイル内を指定したい場合は、JARファイル自体をクラスパスに指定する必要がある。

+ クラスパスに指定したいクラスがデフォルトパッケージではなく、特定のパッケージに属している場合、クラスローダはクラスパスを基準位置として、**パッケージをフォルダ階層とみなして検索を行う**。具体的には、`C:¥aaa`をクラスパスに指定し、`com.sample.app`パッケージの`bbb.class`を検索させたい場合、`bbb.class`は`C:¥aaa¥com¥sample¥app`フォルダに配置する必要がある。
JavaScriptを勉強した時にやったことリスト

# はじめに
Webアプリ開発のためにJavaScriptを勉強することになった際に、実際に使ってみて良かったサイトをまとめます。

# 良かったサイト一覧

プログラミング言語を一からやるときは、個人的にはpaizaがおすすめです。
環境構築する必要なくweb上で完結できるし、ステップバイステップで動画の解説があるので学習を進めるときに達成感を感じられます。

https://paiza.jp/works/js/primer

他のプログラミング言語を使ったことがある人なら動画を見ずに以下のようなサイトでその言語が得意とすること（JavaScriptならweb）と、基本的な文法をさらっと見るだけで使い始められると思います。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Introduction

何度も書くことで手に馴染む側面があると思うので、問題をたくさん解きたい方はpaizaの練習問題がおすすめです。

https://paiza.jp/works/mondai

スキルチェックという難易度別の問題集もあります。

https://paiza.jp/challenges
【GAS】SlackのユーザグループIDをコピペで取得できるやつ

## 目次
[1. はじめに](#1-はじめに)
[2. 環境](#2-環境)
[3. 前提条件](#3-前提条件)
[4. 使い方](#4-使い方)
[5. 出力結果](#5-出力結果)
[6. 補足](#6-補足)
[7. 参考サイト](#7-参考サイト)

## 1. はじめに
やりたい事はSlack APIで`ユーザグループ`のメンションがしたかった。
なぜか、Slack標準アプリから`ユーザグループID`が取得できないので、Slack APIでサクッと`ユーザグループID`を取得できるよう、GASにコピペでSpreadsheetに`ユーザグループID`を出力する簡単なスクリプトを作成した。

## 2. 環境
- Windows10 Pro：22H2
- Google Apps Script(GAS) 

## 3. 前提条件
- 事前に`Slack APIトークン`を取得しておく
[Slack API 推奨Tokenについて](https://qiita.com/ykhirao/items/3b19ee6a1458cfb4ba21)

## 4. 使い方
- Spreadsheetから`App Script`を起動
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061081/0f394177-4a4d-622f-e24a-528409989e75.png)
- 下記のコードをコピペして`実行`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061081/fdb593d7-507c-9153-9da4-73ebe59a9573.png)
- GASのコード
```javascript
function getSlackUserGroups(){
    let slackTaken = "ここに自分のSlack APIトークンを記述する";
    let url = "https://slack.com/api/usergroups.list";
    let json = {
        'token' : slackTaken
    };
    let options = {
        'method' : 'post',
        'payload' : json
    };
    let result = UrlFetchApp.fetch(url,options).getContentText();
    let object = JSON.parse(result);
    console.log(object);
    
    let mySheet = SpreadsheetApp.getActiveSheet();
    for(i=0; i < object["usergroups"].length; i++){
        mySheet.getRange(i+1, 1).setValue(object["usergroups"][i]["id"]);
        mySheet.getRange(i+1, 2).setValue(object["usergroups"][i]["name"]);
    }
}
```
## 5. 出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1061081/59d17548-d8c1-ecda-a618-19b800cc322e.png)

## 6. 補足
- `ユーザID`と`ユーザーグループID`でメンションの記法が異なるので注意

|ユーザID |ユーザーグループID |
|---|---|
|< @ユーザID > | < !subteam^ユーザーグループID > |


## 7. 参考サイト
- [SlackAPIでユーザーグループIDを取得し確認する方法(GASサンプル付)](https://auto-worker.com/blog/?p=3598)
- [SlackユーザーグループのIDを返すライブラリ](https://qiita.com/naoki_sakano/items/93eca66b1eae51b7536a)
Github Actionsロードマップ

# はじめに
Github Actionsとは、Github上で使える自動化ツールです。
インターネット上のリソースが英語のものが多く、始めようと思ったときにとっつきにくいと感じました。
自分が勉強した時の流れをまとめます。

# STEP0: Github Actionsで何ができるのか知る
MarketPlaceというGithubのサイトで他のユーザーが作ったGithubActionsを使うことができる。
カテゴリや一覧を見て、GithubActionsでできること＆やりたいことを確認すると良い。

https://github.com/marketplace?category=testing&type=actions

# STEP1: 公式のチュートリアルを触る
GithubにはGithubSkillsというチュートリアルのサイトがある。

https://skills.github.com/#automate-workflows-with-github-actions

一つ二つやってみるとGithubActionsの雰囲気をつかめる。

# STEP2: 公式サイトで紹介されているActionsを書いてみる
https://docs.github.com/en/actions

こちらのサイトにさまざまな例と実際の書き方が載っているので、自分のリポジトリで書いてみてアレンジすると良い。

# STEP3: Actions内でghコマンドを使ってみる
ghコマンドとはGithubのサイト上でできるような操作（Issue、PR、ラベルなど）をCLI上で行えるコマンド。
↓ドキュメント

https://cli.github.com/manual/gh

https://docs.github.com/en/actions/using-workflows/using-github-cli-in-workflows

こちらのリンク先のように書くとGithubActionsの中でghコマンドを使えるので、より自分がしたいことを書けるようになる。

# STEP4: GraphQLを使ってみる
GraphQLを使うとリポジトリやIssue、PRなどの情報をクエリ形式で細かく取得できる。

記法が難しく自分のリポジトリ上にActionsを直接書いて試すとコミットが増えて大変なので、以下のサイトを使ってGraphQLの部分を書いてうまくいくことを確認してからリポジトリ上で動かすと良い。

https://docs.github.com/en/graphql/overview/explorer

-> 自分のリポジトリにExplorer上からアクセスできる

graphQLについてはこちらの皆さんのサイトが分かりやすかったです。
ありがとうございます。

https://zenn.dev/hsaki/articles/github-graphql

https://maku.blog/p/ubkahpw/
M2/M1_MacでPlantUMLプレビューしたらThe operation couldn’t be completedって表示されたとき

M2-Macを買いました。
VSCodeでUML図を描こうと、拡張機能『PlantUML』でプレビューしようとしたときに、

```
The operation couldn’t be completed. Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```

というアラートが表示されました。

Javaが入ってないってことで...

# M2-MacにJavaをインストール

Javaはココからダウンロードしてインストールしました

**ORACLE Java SE 18 Archive Downloads**

https://www.oracle.com/java/technologies/javase/jdk18-archive-downloads.html#:~:text=macOS%2064%20DMG%20Installer


---

Javaがインストールできたので、また『PlantUML』でプレビューしようとしたとき...

```
Dot Executable: /opt/local/bin/dot File does not exist
Cannot find Graphviz. You should try 

@startuml
testdot
@enduml

or

java -jar plantuml.jar -testdot
```

![pic041901.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/0aeeb165-e9f2-3db9-9342-46ce4e392afc.png)


今度は、こんな表示が....


# Graphvizをインストール

Homebrewでインストールができます

```terminal:terminal
$ brew install graphviz
````

https://formulae.brew.sh/formula/graphviz


---

再度『PlantUML』でプレビューにトライすると...

![pic041902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283603/da180957-c1e0-c2f6-5560-362035d4629c.png)

ちゃんとプレビューができました。


---


# そもそも『PlantUML』とは

> PlantUML は、以下のようなダイアグラムを素早く作成するためのコンポーネントです。

https://plantuml.com/ja/

VSCodeと組み合わせると嬉しい感じになります

https://marketplace.visualstudio.com/items?itemName=jebbs.plantuml

以上。
アンシブルのハンドラーメモ

# 勉強メモ

## アンシブル

ハンドラーについて
- ハンドラーは基本的にnotifyとセットで使われる
- ハンドラーはタスクに変更があった場合、実行される
下記にhttpdを使ったexampleを記述する。


下記のコードでは自動的に起動はされない。
``` 
- name: httpd install
  yum:
    name: httpd
    state: present
  become: yes

- name: httpd restarted
  service:
    name: httpd
    state: restarted
    enabled: yes
  become: yes
```



ハンドラーを使った書き方

```
- name: httpd install
  yum:
    name: httpd
    state: present
  become: yes
  notify: restart somepackage service

・・・・・・

handlers:
　- name: restart httpd
    systemd:
     　name: httpd
    　 state: restarted

```

## なにがいいか？
1. タスクに変更がなければ実行されない。
2. 記述がきれい？
作業効率化するアプリ3選

# 導入

作業を効率化するのが好きで私の中では以下を大切にしています
- 可能な限りキーボードだけで作業する
- 可能な限りアプリは少なくする

そこで現在の私なりの使い倒しているアプリ達を共有できればと思います
※もしかすると定期的に更新されるかもしれません

動作環境はMacなのでwindowだと対応していないものもあります、、

# 結論

結論から言うと、私が外せないアプリは以下3つです

- Notion：ナレッジ管理

https://www.notion.so/

- Raycast：ショートカット管理

https://www.raycast.com/

- Warp：リッチなターミナル

https://www.warp.dev/

# それぞれのアプリの紹介

## Notion

よくメモアプリを言われますが、個人的にはリッチなデータベースマネジメントアプリかなと思っています

利用ケースは以下の場面が多いです

- ナレッジの蓄積
- API連携での情報の蓄積

ナレッジの蓄積に関しては、そのままでコーディング時のトラブルシューティングやプロジェクト中の気づきはその場でメモするようにしています

API連携での情報の蓄積に関しては、個人でPythonを用いてコマンドを作成することが多く、コマンドでNotionに作業状況を連携して情報を蓄積し、自分がどんな作業に時間を使用したのかや各作業の生産性はどれくらいかを算出できるようにしています

Pythonでコマンドを作成するときは以下のClickを使用しています

https://click.palletsprojects.com/en/8.1.x/#

`task start`と言うコマンドを打てばNotionに作業開始時間が記録され、`task finish`とすれば作業終了時間が記録されるような仕組みです

Notionに毎回入力するのでも良いですが、少しでも効率化したくコマンドを作成することにしました

現在では気づきや課題もコマンドでNotionに登録可能なようにしています

Notionは多機能で慣れるまでが大変という意見も聞きますが、意外とやってみると簡単で楽しくなってくるのかなと思います

(社内でもNotionを布教し続けています)

## Raycast

利用ケースは以下の場面が多いです

- スニペットやクリップボード履歴の使用
- アプリ起動のショートカット割り当て
- ウインドウのリサイズ・移動
- アプリの検索・起動
- カレンダー連携によるミーティング予定の表示
- ZoomやTeamsなどのミーティングURLを開く

今まで使ってた以下のアプリがこれ1つに集約されました、多機能、、

- Clipy：スニペットやクリップボード履歴の使用

https://github.com/Clipy/Clipy

- Shortcut(Mac標準)：アプリ起動のショートカット割り当て

https://apps.apple.com/jp/app/ショートカット/id915249334

- Spectacle：ウインドウのリサイズ・移動

https://www.spectacleapp.com/

- Alfled：アプリの検索・起動

https://www.alfredapp.com/

細かいところはこのRaycastが全部フォローしてくれてます

ちなみのここに紹介しているアプリは全部ショートカットで開けるようにしています

- ctrl + space：Notion
- option + space：Warp

## Warp

ターミナルの進化系みたいなアプリです

なんといっても一番の魅力はAIにコマンドを教えてもらえることです
「MACをアドレスを知るためのコマンドを教えて」みたいな文を入力すると「ifconfig」を返却してくれます(便利)
今までiTermを使用していましたが、このコマンド検索機能に惚れて乗り換えてしまいました

https://iterm2.com/

私自身がneovimで開発していたり、自作のコマンドを作ることが多いので高性能なターミナルはとても助かります

https://neovim.io/

# 最後に

最近は便利なアプリが多く、他にも良いアプリがたくさんあると思っています

もし、今回紹介したアプリでもっと使い方が知りたいものがあればコメントください！

また、他にこんな良いアプリあるよと言う方もコメントください！待ってます！
vscodeでpythonのimportの自動ソートを無効にする

vscodeのsetting.jsonにautopep8の整形は使うがimportの自動ソートをオフにしたい場合は

```json
"python.formatting.autopep8Args": ["--ignore", "E402"]
```

を追加していたら自動ソートされずにすんでいたが、上記を書いていても自動ソートされるようになってしまうようであれば、以下のように修正すればまた自動ソートされないようになる。

```json
"autopep8.args": ["--ignore", "E402"]
```