OmniAICreator/Qiita-1.07M huggingface dataset:
SMSに届いたフィッシングのURLを無暗に共有してはいけない理由

# ある日SMSにメッセージが届いた
内容はよくあるこんな感じのフィッシング詐欺でした。
```
ななみ よりお誘いが届いております。

名前：ななみ
年齢：24歳

初めて登録しました…

◇XXXX(アプリ名)でお話する
⇒http://sonzaishinai.domaindayo/d1rn4m3H3re/?id=MDEyLTM0NTYtMTIzNA%3D%3D%0A

...
```
まぁ無視すればいいだけの話なのですが、ツイッターなどで「こういう詐欺が来たんだが」みたいに共有したくなりますよね。(個人差があります)
ですが、このメッセージには罠が仕掛けられていました。

# URLのパラメータに注目する
このURLにはパラメータとして「id」が指定されています。
ある程度の知識がある人なら、これがBase64でエンコードされた文字列を更にURLエンコードしたものなのは何となくわかりますよね。
という事で、デコードします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/25c827b4-8eef-2985-be69-492ea5a7d508.png)
はい。
見事に受け取り側の電話番号がパラメータとして指定されていました。

# どのくらいやらかしてる人がいるのか調べる。
別にしなくてもいいのですが、Googleで調べようと思います
フィッシング詐欺のドメイン名だけを調べても複数あるので、全ての場合において一致している「%3D%3D%0A」をキーワードにします。
(%3Dは=のURLエンコードでbase64のpadding　%0Aは改行コード(LF)です)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984781/bb3fbd94-7d71-e5a8-d9df-4cee0aef7598.png)
だいたいGoogle検索で3ページほど見つかりました。
Twitterなどやドメイン名で検索したらもっと見つかると思います。

# 結論
電話番号が洩れるので、SMSに届いたフィッシングのURLを無暗に共有してはいけない。
薄いブレッドボード ArduEz ONE レビュー

## 待望のオンボードブレッドボードか? ##
オンボードブレッドボード大好きマンとしては常々、
![Ａｒｄｕｉｎｏ用プロトタイピングボード](https://akizukidenshi.com/img/goods/C/M-07033.jpg)
こんなのしかないのを嘆いていたのですが、
秋月電子にて、Arduino Uno用のブレッドボード[ArduEz ONE](https://akizukidenshi.com/catalog/g/gM-17101/)を発見。
![Ardu](https://akizukidenshi.com/img/goods/C/M-17101.jpg)
「ついに来た！ほしかったんはコレや！」
と早速購入して使用してみました。

## 感想 ##
率直な感想としては、「なんか違う・・・残念・・・。」でした。
##### 残念ポイント 1 #####
一見ブレッドボード部分が広くなっているように見えましたが、冷静に観察してみると同じでした。
##### 残念ポイント 2 #####
上に飛び出したArduino端子部分が邪魔でブレッドボードにパーツを配置しにくいです。
自分は[連結ピンヘッダ](https://akizukidenshi.com/catalog/g/gC-02961/)と[ロープロファイルピンヘッダ](https://akizukidenshi.com/catalog/g/gC-00171/)で凸部分をピンヘッダに加工してみました。多少扱いやすくなりましたが、それでも気になる方はこの列をつぶして下に刺さるピンだけにしてしまうのもアリかと思います。

![連結ピンヘッダ](https://akizukidenshi.com/img/goods/L/C-02961.jpg)![ロープロファイルピンヘッダ](https://akizukidenshi.com/img/goods/L/C-00171.jpg)
![IMG_1756.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/1cefd195-1354-2010-5909-923086566ecc.jpeg)


##### 残念ポイント 3 #####
飛び出したArduino端子部分の外側にソケット部が追加されており、Arduino Uno より幅が広くなっています。
純正Unoより若干幅が広い[MAKER UNO](https://www.cytron.io/p-maker-uno-simplifying-arduino-for-education?search=MAKER-UNO&description=1)にちょうどのサイズなので、そちらに使うには良いかもしれません。

## 本当に欲しかったもの ##
・ブレッドボード部分を広くしてほしい
・幅はUNOと同じにしてほしい
・上に飛び出た端子なし（接続ピンが下部に出ているだけ）でよい
・追加の電源端子があるとうれしい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/079fba51-e970-fabf-ea85-5a3043d325c5.png)
[ArduEZ 榮國工業股份有限公司](http://www.ronmeeind.com/)さん、お願いします！
【GMC-4】体操カウント

学研の4ビットマイコン GMC-4 で、
「1、2、3、4、5、6、7、8、**2**、2、3、4、5、6、7、8、**3**、2、3、4、5、6、7、8、…」
のようなカウントをしてみた。

# プログラム

以下のプログラムは、[MikeAssembler](https://mikecat.github.io/mike_assembler/) でアセンブルできる。

```
target gmc4

	TIA 1
	AO
outer_loop:
	CH
	TIA 1
inner_loop:
	CY
	TIA 2
	CAL SHTS
	CAL TIMR
	CY
	AIA 1 + 0x10 - 9
	JUMP inner_loop_end
	AIA -(0x10 - 9)
	AO
	JUMP inner_loop
inner_loop_end:
	CH
	AIA 1
	AO
	JUMP outer_loop
```

以下は、このプログラムの機械語表現である。

```
  | 0 1 2 3  4 5 6 7  8 9 A B  C D E F
--+-----------------------------------
0 | 8 1 1 2  8 1 3 8  2 E 9 E  C 3 9 8
1 | F 1 9 9  9 1 F 0  6 2 9 1  1 F 0 3
```

# 解説

`outer_loop:` の直後の `CH` 命令で、各8個のかたまりの最初の数字をBレジスタに退避する。
`inner_loop:` の最初は、かたまりごとに増えていくカウントが `AO` 命令により表示された状態で回る。
カウントとして短い音を鳴らして時間を置いた後、以下の処理を行う。

1. かたまり内のカウントに1を加え、同時に`0x10 - 9` を加えてカウントが9(以上)になったかをチェックする。
2. カウントが9(以上)の場合、`inner_loop` を抜ける。
3. チェック用に加えた `0x10 - 9` を引き、相殺する。
4. 新しいカウントを `AO` 命令により表示する。

`inner_loop` から抜けた後 (`inner_loop_end:`) は、退避していたかたまりの最初の数字を `CH` 命令でAレジスタに戻し、さらに1を加えて `AO` 命令により表示する。

# 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/gqz14RAF2hk" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
minecraft serverに入力したコマンドを取りたいver.2

# 前提
minecraft serverにおけるコマンドをdiscord bot経由で入力することを想定しています．

そして，
- WSL, Ubuntu 22.04.1
- Python 3.10.6
- papermc

という環境で行っています．また，minecraft serverは`subprocess`による起動で実行しているため，この知識も多少必要です．`stdout`と`stdin`がわかっていれば大丈夫ではないでしょうか．


次に，私の環境のディレクトリ構成は以下のような感じです．
```
.
├── mcserver
│   └── logs
│       └── latest.log
└── qiita_mcmanager
    ├── MCServer.py
    └── test-getlog.py
```

もちろん，ファイルやディレクトリはほかにもありますが，今回利用するものはこの辺だけです．
`MCServer.py`はminecraft serverの起動や停止などを行うクラスで，`test-getlog.py`はminecraft server起動用のテストとして作成しているファイルです．

<details><summary>test-getlog.py</summary>

`test-getlog.py`は以下のようなプログラムです．
```python: test-getlog.py
from MCServer import MCServer
import time

server = MCServer()
server.start()

time.sleep(1)

print(server.get_command_log("list"))

time.sleep(1)

server.stop()
```

特に特筆するところはないです．強いて言うなら，serverを起動させた直後にコマンド入力させるのはちょっと不安だったのでsleepさせてるところでしょうか．まあ重要じゃないです．

</details>


# コマンド結果を取得

現在のログにおける最後の行を確認しておきます．続いて，コマンドを入力した直後にログファイルを読み込みます．そして，確認済みのところまで一行ずつ戻ることでコマンドの結果が取得できます．

コードは以下の通りです．

```python: python
def get_command_log(self, cmd: str) -> list[str]:
    if (self.process is None):
        print("server is not active")
        return

    if (self.process.poll()):
        print("server is already stopped")
        return

    log_file_path = "../mcserver/logs/latest.log"
    last_log = ""
    with open(log_file_path, "r") as log_file:
        logs = log_file.readlines()
        last_log = logs[-1]

    self.process.stdin.write(f"{cmd}\n".encode("utf-8"))
    self.process.stdin.flush()

    time.sleep(0.5)

    command_logs = []
    with open(log_file_path, "r") as log_file:
        logs = log_file.readlines()
        while (logs[-1] != last_log):
            command_logs.append(logs.pop(-1))

    return command_logs[::-1]
```

複雑なことはしていないと思います．簡単に流れを説明すると，
1. ログファイルを開いてファイルの中身を行ごとに分けて読み込む
    - `open()`と`readlines()`
1. `last_log`に最後の行を保存
1. コマンドの入力
1. ログに書き込まれるまで少し待機
1. 改めてログファイルを開き，`last_log`の行が現れるまで`command_logs`にログを入れる
1. 末尾から入れているのでreverseして返す

という感じです．[前回記事](https://qiita.com/halglobe0108/items/5ce095f81ff92d9a7338)のようになんかごちゃごちゃ工夫しなくてできますね．徹夜はなるべくやめましょう．

`time.sleep()`で待機させていますが，これをするとdiscord botがその秒数分止まります．minecraft serverは別スレッドで動いていますし，簡単に確認してみたところ特に変な挙動はしていませんでした．ワールドが重くなるとどうなるかわからないため，`asycio.sleep()`に変更した方が良いかもしれません．ただ，私は`async/await`に翻弄されたので諦めました．


以上がminecraft serverに入力したコマンドを取る方法でした．
お疲れ様でした．
IchigoJam で PDCA を回す

[IchigoJam](https://ichigojam.net/) で「PDCA」を回しました。
v1.4で追加された三角関数を使います。

20行目で動作を設定します。

|変数|意味|
|:-:|---|
|A|現在の角度|
|R|回転の半径|
|X|回転の中心x座標|
|Y|回転の中心y座標|
|W|1ステップ回転した後の待ち時間 (`WAIT` 用)|
|D|1ステップで回転する角度|

# 単体

IchigoJam の出力画面で「PDCA」を回します。

## プログラム

```
10 ' PDCA ｦ ﾏﾜｽ
20 A=0:R=10:X=16:Y=12:W=3:D=5
30 CLS
40 U=R*SIN(A)/256
50 V=R*COS(A)/256
60 LOCATE X+U,Y-V:?"P";
70 LOCATE X-V,Y-U:?"D";
80 LOCATE X-U,Y+V:?"C";
90 LOCATE X+V,Y+U:?"A";
100 WAIT W:A=(A+D)%360
110 GOTO 30
```

## 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/f2gnBuO9SMQ" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# PanCake 連携

[PanCake](http://pancake.shizentai.jp/) の画面で「PDCA」を回します。
[仮想PanCake](https://fukuno.jig.jp/app/IchigoJam/pancake.html) でも動きました。

## プログラム

```
10 ' PCDA ｦ ﾏﾜｽ (PanCake)
20 A=0:R=16:X=40:Y=22:W=10:D=5
30 ?"PC SPRITE START 06"
40 ?"PC SPRITE CREATE 00 8F"
50 ?"PC SPRITE CREATE 01 83"
60 ?"PC SPRITE CREATE 02 82"
70 ?"PC SPRITE CREATE 03 80"
80 U=R*SIN(A)/256
90 V=R*COS(A)/256
100 ?"PC SPRITE MOVE 00 ";HEX$(X+U-4,2);" ";HEX$(Y-V-4,2)
110 ?"PC SPRITE MOVE 01 ";HEX$(X-V-4,2);" ";HEX$(Y-U-4,2)
120 ?"PC SPRITE MOVE 02 ";HEX$(X-U-4,2);" ";HEX$(Y+V-4,2)
130 ?"PC SPRITE MOVE 03 ";HEX$(X+V-4,2);" ";HEX$(Y+U-4,2)
140 WAIT W:A=(A+D)%360
150 GOTO 80
```

## 実行結果

<iframe width="560" height="315" src="https://www.youtube.com/embed/vLs_-1Ya4IE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# おわりに

※IchigoJamはjig.jpの登録商標です。
デザイン用gem（bulma-rails）

# bulma-railsについて
デザイン用のgemです。
Github↓
https://github.com/joshuajansen/bulma-rails

# バージョン
Ruby：2.7.7
Rails：7.0.4



# 導入方法
Gemfileに`gem "bulma-rails"`を書き込み、ターミナルで`bundle install`を行う。

インポートするために、app/assets/stylesheets/application.cssに書き込む。
```ruby:app/assets/stylesheets/application.css
@import "bulma";
```
この際、拡張子を`css`から`scss`に変更する。

これで導入完了です。
アプリにログイン機能を追加

# 参考記事
参考記事というか、deviseについてはここに全部書いてあります。
https://github.com/heartcombo/devise#starting-with-rails

# バージョン
Ruby：2.7.7
Rails：7.0.4



# gemをインストール
これをやらないと使えないです。
``` ruby:Gemfile
gem 'devise'
```
保存後、ターミナルに下記のコードを入力
```
　bundle install
```

# セットアップ
インストールが完了すると、色々出てくるので指示通りに進めていきます。
※保存を忘れずに
![スクリーンショット 2022-12-13 1.43.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/4c86643b-dc2b-f30d-109a-c87db58aa05a.png)

[1] `config/environments/development.rb`に以下のコードを書く。
```ruby:config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```
endタグより前に書きましょう。

[2]`config/routes.rb`に以下のコードを入力
```ruby:config/routes.rb
root to: "home#index"
```

[3]`app/views/layouts/application.html.erb`に以下のコードを入力
```ruby:app/views/layouts/application.html.erb
<p class="notice"><%= notice %></p> 
<p class="alert"><%= alert %></p>
```
フラッシュメッセージ（ログインしました。ログアウトしました。）を表示してくれるようにするコード。


[4]ターミナルで以下のコードを書く。
```
rails g devise:views
```
ログイン画面などをカスタマイズできる。

# ユーザーモデルを作成
ターミナルで以下のコードを書く。
```
rails generate devise user
```
アプリ名//db/migrateにユーザーズテーブルを作成するためのコードが作られる。
※デフォルトでは、emailとpasswordしかない。

# おまけ
ユーザー名とプロフィールとプロフィール画像のカラムを追加する。
```ruby:/Users/etaku/cripit/db/migrate/数字_devise_create_users.rb
t.string :username
t.text :profil
t.string :profile_image_id
```
クリエイトユーザーの数字は人によって変わります。

## データベースに反映させる
上記のコードを書き、保存をしたらターミナルで以下のコードを書く。
```
rails db:migrate
```
このような表示がされたら大丈夫です。
![スクリーンショット 2022-12-13 2.23.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/a572b92f-7b62-7814-f26d-dce817f9cc42.png)

## 反映されてるか確認
先ほどのコードが反映されているか確認する場合は、"アプリ名/db/schema.rb"で確認できます。
![スクリーンショット 2022-12-13 2.59.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2018163/e6def8b3-e661-069f-3d39-75d5d68825d5.png)

先ほど作ったテーブル(username, profile, profile_image)がしっかり反映されています。


# 終わり
導入はこれで完了なので、あとはレイアウトだったりを変えていけばいいと思います。
【Swift】位置情報を取得する

# はじめに
位置情報を使用したアプリを作る基本的な手順を解説する。

# 環境
| No |    項目     |   内容    |
|---:|-------------|------------|
| 1  |      OS       |   MacOS Monterey ver 12.5.1     |
| 2  |      Xcode     |   14.1 |
| 3 |     Swift     |   5.7.1|

# 実装
# 1.　info.plistに追加する
project名 => TARGETS => info
Key: Privacy - Location When In Use Usage Description
Value: （iPhoneに出すメッセージ）
![スクリーンショット 2022-12-13 1.57.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/55da8fa3-f360-49b4-c0c1-4400fd26f511.png)

# 2. ストーリーボードにbuttonを配置し、ViewControllerに連携させる。
ボタンを押すと、位置情報をその都度取得するような設計にしていく。
ちなにみに画像のマークは、"button"を配置し、Imageを"locaiton.circle"にすると、表示できる。
![スクリーンショット 2022-12-13 2.01.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2684787/6ac595f3-529a-0928-76e1-2c6986fd39f7.png)

# 3. CoreLocationをインポートし、CLLocationManagerクラスを使用して位置情報を取得する。
```swift:ViewController.swift
import UIKit
import CoreLocation // 位置情報を取得するために必要なモジュールをインポートする。

class ViewController: UIViewController, CLLocationManagerDelegate {
// 位置情報を取得するために必要なプロトコルを付与する。
    let locationManager = CLLocationManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        locationManager.delegate = self // CLLocationManagerDelegateプロトコルを使用するためにdelegateをViewControllerクラスに設定する。
        locationManager.requestWhenInUseAuthorization() // 位置情報の許可設定を通知する。
        locationManager.requestLocation() // 1度だけ位置情報取得のリクエストを投げる。
    }
    
    @IBAction func LocationSearch(_ sender: UIButton) {
        locationManager.requestLocation()
    }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        if let location = locations.last {
            print("location: \(location)") // CLLocationManagerクラスで取得した位置情報
            print("緯度: \(location.coordinate.latitude)")
            print("経度: \(location.coordinate.longitude)")
        }
    }

    func locationManager(_ manager: CLLocationManager, didFailWithError error: Error) {
        print("error: \(error)")
    }
}

```

アプリを起動し、位置情報取得を許可、真ん中のボタンを押すと、、、
```:コンソール
error: Error Domain=kCLErrorDomain Code=1 "(null)"
location: <+35.~,+139.~> +/- 35.00m (speed -1.00 mps / course -1.00) @ 2022/12/13 2:54:48 Japan Standard Time
緯度: 35.~
経度: 139.~

```
位置情報を取得できる。
errorは最初の起動時に、位置情報の許可をする前に位置を取得しようとしているため。一度許可すると、エラーは起きない。

# おわりに
位置情報の簡単な実装方法をまとめた。
ここから色々幅を利かせてアプリを作っていこう！
Ledger CLIで家計簿をつけたい！実践3 外貨取引

前編↓

https://qiita.com/kikeg/items/7d6857469df0af065097

今回は外貨取引についてです。

# Ledgerにはcommodityという概念が存在する

まずLedger CLIにはcommodityという概念が存在します。コモディティというのは代替可能性があるもの、つまりは値段がついていて、数えた量で交換できるものです。一般には通貨や株式を除いた先物などを呼びますが、ここでは通貨や株式も含む広い言葉になっています。Ledger CLIではそれぞれのコモディティを数のprefix/suffixとして扱います。

```ledger
2022/12/12 Commodity
    Foo         1 JPY ; JPYがコモディティ
    Foo           $ 1 ; $がコモディティ
    Foo         1 USD ; USDがコモディティ
    Foo         1 りんご ; りんごがコモディティ
```

このようにコモディティはただの固有文字列で「何を」どれだけ持ってるか区別できるようにするための記号です。これを外貨に使うようにできています。

# 早速外貨を売買してみる

## ドル買い円売り

ではokane銀行に外貨預金があって、海外店舗でカード決済できる口座だとしましょう。海外通販や旅行に便利ですね。ここでドルを買います。

```ledger:bank/okane/2022.ledger
2022/12/12 * USD購入
    ; 仲値136.35、レート136.5
    Assets:Banks:Okane              -10,000 JPY
    Assets:Banks:Okane                73.26 USD @ 136.35 JPY
```

このように記述します。@以外は以前まで書いていた記録に似ています。ただ、@がポイントでこれを見ると1 USDがいくらだったのか分かるわけです。ここで、銀行が提示しているレートは手数料込みなので、手数料を戻した実レートで記述します。そうすると、当然手数料分どこかに消えているのでエラーが出ます。

```shell-session
 % ledger -f root.ledger bal ^Assets ^Liabilities ^Equity --current -X CHF
> 2022/12/12 * USD購入
>     Assets:Banks:Okane                       -10,000 JPY
>     Assets:Banks:Okane                         73.26 USD @ 136.35 JPY
Unbalanced remainder is:
             -11 JPY
```

なので言われれるがままに11円手数料として書き足します。


```ledger:bank/okane/2022.ledger
2022/12/12 * USD購入
    ; 仲値136.35、レート136.5
    Assets:Banks:Okane              -10,000 JPY
    Assets:Banks:Okane                73.26 USD @ 136.35 JPY
    Expenses:Commissions                 11 JPY
    ; Payee: Okane Bank
```

```shell-session
 % ledger -f root.ledger bal ^Assets ^Liabilities ^Equity --current
         364,902 JPY
           73.26 USD  Assets
          89,855 JPY
           73.26 USD    Banks
          89,855 JPY
           73.26 USD    Banks:Okane
          -5,000 JPY    Cash
         280,047 JPY    Wire:Salary
        -113,878 JPY  Equity:Opening Balances
            -470 JPY  Liabilities:Card:Yellow
--------------------
         250,554 JPY
           73.26 USD
```

手数料をトラックするかどうかは個人の自由です。私は神経質なのでトラックしてますが、大したことない量なら忘れてもいい気もします。

## 外貨建て決済

外貨での買い物は簡単に書けます。

```ledger:bank/okane/2022.ledger
2022/12/13 * AmazonCom
    Assets:Banks:Okane                           -20 USD
    Expenses:Grocery

```

## ドル売り円買い

さて、円が必要になったし円安だしドルを売る場合を考えます。逆の時同様に手数料も記録します。

```ledger:bank/okane/2022.ledger
2022/12/15 * Needs JPY
    ; 仲値 150.15, レート 150.00
    Assets:Banks:Okane                        -53.26 USD @ 150.15 JPY
    Assets:Banks:Okane                          7989 JPY
    Expenses:Commissions                           8 JPY
    ; Payee: Okane Bank

```

さて、無事記録できました…さて、なにかおかしいような?はい、外貨取引時には本来為替差益、差損が出ているはずです。この記録にはそれが織り込まれていません。なので本来は購入時価格をこの記録に織り込んでやる必要があります。ただ、個人的には面倒なのでしていません（どうせ源泉徴収されるので真面目に記録する意味がない）。

次回は株式でちゃんと売却の損益を記録する方法を見ます。
【超簡単】Excel・スプレッドシート 出欠アンケートから欠席者だけを抽出する方法

# はじめに
出欠アンケートの回答を集めて欠席者を把握したいが、欠席者が多すぎて把握しきれない！
そんな時、欠席者が一覧で見れたら便利ですよね？？

今回はそういった悩みを抱える方に向けて、一瞬で欠席者を確認できるシートの作り方を伝授します！
(こちらの記事をマスターすれば、別のシートからある条件に一致するデータを簡単に抽出することができるようになります！）

# 完成形イメージ


以下の写真のように、欠席者の名前だけが抽出されているシートを作成できたら完成です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/bf6a3a6e-542e-ce1f-5320-80711059e2e5.png)


※ こちらの名簿は以下のサイトからお借りしました。

http://mw211.com/tekito/tekito01.htm

また実際の完成形スプレッドシートも以下に載せておくのでぜひご確認ください！

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

※ 上記シート内に出てくる、提出状況を確認するシートを作成したい場合は以下の記事をご覧ください。

https://qiita.com/kubochiro/items/478fbcf527f67fa3d91b

# 実装方法
① 以下のスプレッドシートをコピーしてください

https://docs.google.com/spreadsheets/d/1mwXMG8534N31__e-K-ygA28RKHl2Ly3-1li6d75bsx0/edit#gid=1103384671

ファイル→コピーを作成 で作成できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9214ef90-c443-a90d-18c8-c8dd7b0e0af9.png)

コピーを作成できたら、画面一番下に
・アンケート回答
・【解答】欠席者洗い出し
の二つのシートがあることを確認してください！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/75ea03af-faa1-34c0-ed29-e117a461d74e.png)


② 新たなシートを作成してください
左下のプラスボタンを押すと新たなシートが作成されます！何かしらのシートが作成されたことが確認できればOKです！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/22bd97d5-86ba-8c54-0877-7ced6b6f8717.png)

③ 作成したシートに項目を記入
セルA1に欠席者洗い出しと書きましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/45de1123-c402-538b-7ac7-442d61e21131.png)


④ まずはアンケート回答シートのデータを作成したシートに抽出
セルA2に以下の関数を埋め込みます！
```
=QUERY('アンケート回答'!A:C)
```
下のようになっていればOKです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/125f96c0-5661-da6e-e131-a8f20ba754b5.png)

これだと出欠に関係なく全部取得されてしまいますね、、、！


⑤ 欠席者だけを抽出！
セルA2を以下の関数に書き換えましょう！
```
=QUERY('アンケート回答'!A:C,"where C='欠席'")
```


以下のようになっていれば成功です！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/9dff5a31-acad-0fb8-3774-da51d8fde4fd.png)

where文で条件を指定し、抽出したいデータを持ってくることができます

```
where 指定したカラム='抽出したいデータ'
```
これでほぼ完成！


⑥ 欠席者の名前だけを抽出しよう！
欠席者を洗い出したいだけなので、A列のタイムスタンプやC列は必要ないですね
セルA2を以下に書き換えましょう！
```
=QUERY('アンケート回答'!A:C,"select B where C='欠席'")
```
select文で抽出したい列だけを指定することができます！

以下のようになっていたら成功です！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081227/356e4220-5a5c-0f7d-480c-10c2bf0a8bfe.png)



# 最後に
いかがでしたでしょうか？
不明点や誤植などありましたら遠慮なくコメントいただけると幸いです！
ここまで読んでいただきありがとうございました！
エンジニアリングマネージャーの役割 1on1について

# エンジニアリングマネージャーの役割 1on1について

## 1on1について
一般的に1on1は、週に一回、少なくとも一ヶ月に１回はやるべきだと言われています。
それ以上、期間が空いてしまうとエンゲージメントが低くなり、信頼関係が薄れていき、離職率や知らない間に不満やストレスがたまっていくということになるということです。

### でも1on1って何すればいいの？
結構、これって難しくて、世代が違っていたり、価値観が結構違っていたり、もともと話すのが苦手だったりとかいろいろあるかと思います。
自分も対話するのは難しくて、相手と話しながら、会話を整理して、方向性を維持しつつ、対話を誘導していくのは技術と頭の回転がいることだと思っています。

### 1on1の質問および対話ポイント
７つのポイントがあると言われます。

以下にまとめてみると

#### 部下との信頼関係を深めるために行う４つの質問
##### ①プライベート
信頼関係の構築
* 好きなものは？嫌いなものは？ 
* いつかほしいと思っているもの何？
* 週末はどんなことしていてますか？
* なにかこだわりをもっているものはありますか？
#### ②メンタル
エンゲージメント向上を目的とします
* 体調や睡眠は大丈夫？
* 人間関係で困っていることとか？
* ストレスがたまっていること？
#### ③モチベーション
モチベーションが上がる要因、モチベーションが下がる要因を整理します。
* 仕事で不安に思っていること
* 最近、仕事でがっかりしたことある？
* どんなところに自信がないの？
 
これらのモチベーションが下がる原因について、お互い解決に向けて話し合うこと。
 
#### ④ミーティングの感想
 ・今回の1on1ミーティングの意味。面談の成果や今後の行動で何をすべきか？

#### 部下の現状や信頼関係レベル、目的に合わせて行う３つの質問項目

##### ⑤業務課題、組織課題
* 実際に改善してみてうまくいったこと、うまくいかなかったこと
* 仕事で行き詰まっていることは？
* もっと効率的に働くためになにができるか？
* チームで改善できるといおもっていることは？
* 上司または同僚、部下になにか要望は？
* 人間関係でなにかトラブルはありますか？

##### ⑥目標
 組織やチームの方向性を確認しながら部下がもつ個人目標を深堀り
* 今、どんな目標を持っているの？
* 目標を達成するためにどんなことに取り組んでいる？
* 目標を達成するのに障害がありますか？
* 仕事していく中で何を手に入れたい？ 
* 将来的にはどんな業務に関わってみたい？

##### ⑦能力
  業務やキャリアについての質問
* どんな仕事やりがいを感じてる？
* 一番得意だと思っている業務は何？
* 成長する上で課題だと思っていることは何？
* 将来的にどんな仕事にチャレンジしたい？
* スペシャリストとマネージャーどっちに興味がある？


その他、1on1の書籍として、

[ヤフーの1on1―――部下を成長させるコミュニケーションの技法](
https://www.amazon.co.jp/%E3%83%A4%E3%83%95%E3%83%BC%E3%81%AE1on1%E2%80%95%E2%80%95%E2%80%95%E9%83%A8%E4%B8%8B%E3%82%92%E6%88%90%E9%95%B7%E3%81%95%E3%81%9B%E3%82%8B%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E6%8A%80%E6%B3%95-%E6%9C%AC%E9%96%93-%E6%B5%A9%E8%BC%94/dp/4478069786)

なども参考になります。

こちらもポイントだけですが、

### 1on1の２つの目的
#### ①経験学習
経験を学びとして次の仕事に活かす
具体的経験ー＞内省ー＞教訓を引き出すー＞新しい状況を引き出す

#### ② 才能と情熱を解き放ち成長する
* 様々な仕事を経験して、振り返りながら自分の職業観について考える。
* どんな仕事をしたいのか？なぜ？どうなりたいのか？

##### 信頼関係を築くには
###### アクティブリスニング
* 相手の会話にうなづいたり、同調したりする。あくまで話を聞くということで、愚痴や悪口などについての同意などはしないほうがいいでしょう。
###### レコグニション
* 目の前の相手の存在を認め
* ありのままを受け止め
* それを相手に伝えること

##### コーチング
部下が自分を答えを見つけるように促す
 
##### ティーチング
上司が答えをもっていて、部下が知っておくべき知識レベルを直接教えることが早いこともあります。

##### フィードバック
耳の痛いことを含めて、アウトプットの意味合いを部下に伝え、成長を促進


以上になります。
考慮すべき共変量

# はじめに
因果推論を行う上で共変量を考慮するべきか否かに関するメモ書きです。

アウトカム、処置、共変量3つの組み合わせの中で、一番シンプルな例を挙げてまとめてみました。

# 本題
以下、
- $Y$: アウトカム
- $T$: 処置
- $X$: 共変量

とします。

$T$から$Y$への処置効果を考えたい場合、以下の4通りの関係が考えられます。
![交絡の調整.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550377/fd9e3838-8c26-29df-22dd-505e6e5e4b91.png)

![交絡の調整 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550377/2551f257-7533-2ddd-aa03-06bafec60a1e.png)


(a)は、そもそも$X$の影響を受けていないので、考慮するべき共変量は存在しません。（ランダム割り付けがなされている状態）

(b)は、1番厄介で「交絡」が生じている場合です。この場合は共変量を無視して推測しようとすると、処置効果の推定にバイアスが生じてしまいます。したがって、共変量を調整する必要があります。（調整方法については、いつか別途まとめる予定です）

(c)は、効果の修飾(modification)があると言い、$X$をmodifierと呼びます。この場合、共変量を考慮しなくても処置効果をバイアスなく推定することはできますが、共変量を考慮した方が推測の効率が上がります。そのため、可能であれば共変量を取り込むことが推奨されます。

(d)は、$X$を無視して$Y$の分布のみによって推測を行なっても結果は変わらないため、特に共変量を考慮する必要はありません。

まとめると、「共変量を考慮するか否か」という問いに対する結論は以下の通りになります。
![交絡の調整.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550377/9882b660-b63a-81e8-cacb-87fc16e147ad.png)

![交絡の調整 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/550377/24c49e43-6410-831d-ff54-0fb62e060e96.png)


# おわりに
最後まで読んでいただきありがとうございました。

zennにて「Python×データ分析」をメインテーマに記事を執筆しているので、ご一読いただけますと幸いです。

https://zenn.dev/s1ok69oo 

また、過去にLTや勉強会で発表した資料が下記リンクにてまとめてありますので、こちらもぜひご一読くださいませ。

https://speakerdeck.com/s1ok69oo

# 参考文献
- 岩崎(2015)「統計的因果推論」朝倉書店
- 星野(2009)「調査観察データの統計科学」岩波書店
LivedataとMutableLiveDataについて

# MutableLiveDataとLiveDataの使い方
・個人開発でMVVMへアーキテクチャを変更した際にLivedataとMutableLiveDataを使用したのでLivedataとMutableLiveDataについて書きたいと思います。

・基本的にMutableLiveDataはviewModel内で使用し、viewModel以外で使用する（オブザーブ）する際にはLiveDataを使用する。不本意にUIレイヤーで変更されることを防ぐことを目的としている。
```
//viewModel内
val sampleLiveData= MutableLiveData("Sample data")
```
・上記だとsamepleLiveDataがviewModel以外の場所で不要に呼ばれた際に値が変更されてしまう可能性がある。

```
//viewModel内
private val _sampleLiveData = MutableLiveData("Sample data")
val sampleLiveData: LiveData<String> get() = _sampleLiveData
```
・この場合だとデータを変更するためには_samepleLivedataを呼び出す必要があるがプライベート変数になっているのでviewModel以外では呼び出すことができない。viewModel以外でこのデータをUIレイヤー呼び出すには参照用のsampleLiveDataを使用する必要がある。しかしsampleLiveDataはLiveDataなのでmutableであるため値を変更することができない。それゆえ意図しないデータの変更を防ぐことができる。

＊慣用的にパブリックAPIとして機能するLivedataプロパティは任意の命名をし、外部に公開しないMutableLiveDataプロパティにはプレフィックスとしてアンダースコア(_)をつける。


# mutableLiveDataデータ変更時 setValue, postValue, mutableLiveData.value の違い
・setValueは メインスレッドでしか使用できない。
・それ以外のスレッドではpostValueを使う。
・基本的にはfirebaseやroom側でi/oスレッドの処理は行なってくれるので、ほとんどの場合は メインスレッドだけを使えばいいのでmutableLiveData.valueが望ましい。

# LivedataとstateFlowの違い

・StateFlowは初期状態でコンストラクタを渡す必要があるが、Livedataでは渡す必要がない。
・Livedata.observeではビューがstopped状態になるとコンシューマが自動的に登録解除されるが、stateFlowでは自動収集されない。
[オタマトーン]純正パーツでパチモンを作る

秋葉原にある明和電機のお店で、オタマトーンの胴体部分が300円で売られており、
センサー部分でこの値段は破格な気がしたので購入してみました。

抵抗値を調べてみたところ、非接触時はほぼ無限大、加圧接触時は20k-200kΩ程度でした。
そこで、Arduinoにつないで音を出してみることにしました。
手近にあった100kΩの抵抗を用いて分圧し、Toneで音を鳴らしてみます・
![IMG_1750.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/da5284aa-c282-c52f-58ba-3d5ce0bacb63.jpeg)
実験に使用したArduino Uno互換機の[MAKER UNO](https://akizukidenshi.com/catalog/g/gM-16285/)はD8ピンがブザーにつながっており、
Tone(8,f)を呼ぶだけで音が出るのでお手軽です。
![ArduinoUno互換機](https://akizukidenshi.com/img/goods/C/M-16285.jpg)
```
#include <Arduino.h>
// オタマトーン　20k-200kΩ程度なので100kΩで分圧
//A0=210-670くらい。触っていないときは1023
#define BUZZER_PIN (8)
void setup() {
  //Serial.begin(9600);
  pinMode(BUZZER_PIN,OUTPUT); // buzzer pin
}

void loop() {
  int val = analogRead(A0);
  //Serial.println(val);
  if(val<1000){
    float fv = (float)(max(min(val-200,500),0))*2.f; // 0-1000
    int iv = 220 + (int)((1000.f-fv)*0.6f);
    tone(BUZZER_PIN,iv);
  }else{
    noTone(BUZZER_PIN);
  }
  delay(10);
}
```

音程を合わせるのはオタマトーン同様難しいですが
オタマトーン純正の胴体だけあって抑えやすく、とてもいい感じです。

https://youtu.be/l-m3uetH0AA

おまけ
オタマトーンのかわりに曲げセンサーを付けてみました

https://youtube.com/shorts/rbpKH1LY0Qc?feature=share
WMをLightDM+ Web Greeterから起動しよう

# 願望

こんなWindowsXPログイン画面や
![](https://github.com/mshernandez5/WelcomeXP/blob/77e78ac8a2ca93dbf60cbbf05c24cca9a51d3887/screenshot/login.png?raw=true)

[WelcomeXP](https://github.com/mshernandez5/WelcomeXP)


こんなかっちょいい画面で
![](https://camo.githubusercontent.com/22468304adc58b48a69fcd4be49dd40fbbaac73c17bdf774e9dc6c3ab892e5b0/68747470733a2f2f6c6974617276616e2e6769746875622e696f2f6c69676874646d2d7765626b69742d7468656d652d6c6974617276616e2f73706c6173685f766965772e706e67)
[lightdm-webkit-theme-litarvan](https://github.com/Litarvan/lightdm-webkit-theme-litarvan)


**ログインしたくない？？？？？？**

**したい!!!!!!!!!!!!!**


# いざ設定
## インストール
### LightDM
ディストーションごとのパッケージマネージャを使ってインストールするだけ
```bash
$ sudo apt install lightdm  # Ubuntu

$ yay -S lightdm # arch Linux
```

### web-greeter

LightDMはまだ更新が続いているが、web greeterの方はアーカイブになってしまいましたが、
別作者がフォークして開発を継続してくれています。
https://jezerm.github.io/web-greeter-page/

正直、サポートしているテーマの数で比べるとアーカイブ化した方が多いですが、本記事ではjezerm氏が作成してる方のweb-greeterを使用します。

12/13日現在で使用可能なのが、Python製Web-greeterとElectronで書かれたnody-greeterの二種類だけだが、
性能が変わるだけで、使用可能なテーマ・設定項目はさほど変わらない。環境に合わせて使用する事

インストールはREADMEに書いてある通りに実行すれば終わる。完了すると、以下のフォルダが現れるはず。
```bash
$ ls /usr/share/web-greeter/themes
```

このフォルダの中に使用したいテーマをディレクトリごと突っ込む。この際、突っ込んたディレクトリの名前が後ほど設定するテーマ名になるので覚えておくこと。



## 設定
### Lightdm
LightDMをインストールしても、DMを切り替えないとLightDMが起動してくれない。
なので、systemdを使用して切り替える。
```bash
sudo systemctl enable lightdm.service
# おそらく、ここで
# Failed to enable unit: File /etc/systemd/system/display-manager.service already exists and is a symlink to /usr/lib/systemd/system/{DM}.service.
# 的なのがでると思う。そうしたら、{DM}.serviceを一旦disableしてからlightdmを有効化する。

$ sudo systemctl disable {DM}.service
$ sudo systemctl enable lightdm.service
```

LightDMの起動設定は完了したので、次は設定ファイルを編集していく。

LightDMの設定ファイルは``/etc/lightdm/lightdm.conf``にある。
重要なのは``greeter-session``の項目。
```config
#xdmcp-manager=
#xdmcp-port=177
#xdmcp-key=
greeter-session=web-greeter # この項目をnody-greeter もしくは web-greeterに変更する
#greeter-hide-users=false
#greeter-allow-guest=true

```

### Web greeter
あとは、web-greeter側の設定です。

web-greeterの設定ファイルは同ディレクトリの``/etc/lightdm/web-greeter.yml``にある。
このファイルの``theme``を先程themeディレクトリに突っ込んだテーマのディレクトリ名を入れる
```yml
greeter:
    debug_mode: False
    detect_theme_errors: True
    screensaver_timeout: 300
    secure_mode: True
    theme: dracula # 使用したいテーマ名
    icon_theme:
    time_language: ja
```
これでX-WindowのWMを使用している人は終わりです。お疲れ様でした。


## Wayland用

waylandセッションの人はLightDMの設定を少し設定を変更する必要があります。
arch Linuxだとなったのですが、LightDMの``session-wrapper``がXesssionとなっています。
```bash
$ cat /etc/lightdm/lightdm.conf | grep session-wrapper
session-wrapper = Wrapper script to run session with
session-wrapper=/etc/lightdm/Xsession
```
当然、Xsessionなわけがないのでwayland用の設定に変更します。
Xsession自体はX用WMの設定をしてくれるシェルスクリプトなのですが、waylandにはそんなもの必要ない(タイル型はそうでした)ので適当に書きます。

```bash:Wsession
#!/bin/sh
#
# LightDM wrapper to run around Wayland sessions.

echo "Running Wayland session wrapper"

sleep 1 # おまじない https://github.com/canonical/lightdm/issues/63
exec $@
```


このファイルを適当な場所に保存して保存したファイルのパスをlightdmの``session-wrapper``の項目に書きましょう。

そうすればwaylandでも動くはずです。




**皆様、よきLinuxライフを**
【初心者向け】Javaについて

## はじめに　
こんにちは。watnowに所属しているりょーま。です。13日目を担当します。
今回はJavaを学んでいる最中なので、『Javaのプログラムの書き方について』を書きたいと思います。


## Javaについて
Javaとは、プログラムを作るために利用するプログラミング言語の一つです。
Javaを使えば、様々なコンピュータで動作する多様なプログラミングを開発することができます。

## 起動
早速、Javaのプログラムを書いてみましょう。
今回はこのサイト、[dokoJava](https://dokojava.jp)を使います。
さて、dokojavaでは、次の4つの手順で行います。
1\. プログラムの入力
画面にJavaのプログラムを入力します。
2\. コンパイル
dokojavaが入力したプログラムを検査して、実行の準備をします。
3\. 実行
プログラムを実行して、結果が画面に表示されます。
4\. デバック
うまく実行しなかったら、デバックのお時間です。

## 1\.プログラムの入力
まず、プログラムを入力してみましょう。
```java:HelloWorld.java
public class HelloWorld {
	public static void main(String[] args) { 
		System.out.println("hello, world!");
	}
}
```
![スクリーンショット 2022-12-13 1.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014107/ed16dde2-5bbe-9d7f-8c10-28988a865f4c.png)
初めの2行は、(クラス名のHelloWorld以外)自分が見てきたものでは絶対あったので、最初にこれをコピペして書いて良いと思います。
System~は画面上に出力するときに使うものです。
ちなみに、ソースファイルとクラス名は一致していないとコンパイルされません。

## 2\. コンパイル
![画面収録 2022-12-13 1.37.54.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014107/6a8862a1-6569-5f7a-6802-d85cfbd71d76.gif)
コンパイルは成功すると、こんな感じになります。
ちなみに、PCの場合はコンパイルをすると、『クラス名.class』が作成されます。

## 3\. 実行
![画面収録 2022-12-13 1.53.14.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014107/689ef62e-b158-19a8-7203-08ba57851015.gif)
実行すると、コードで書いたように、『hello world!』と表示されます。
これで成功です。

## 4\.デバック
ここで、例えば、コードの3行目のSystemをSystenと間違えるとします。
![スクリーンショット 2022-12-13 2.00.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014107/f5b13ab0-3e71-33e9-1f70-37feb8b54e6c.png)

これを、このままコンパイルすると、
![画面収録 2022-12-13 2.05.29.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3014107/7b0d24f4-2e8d-61e9-cabc-bd44e1cdc876.gif)
こうなります。これは、存在しない3行目にパッケージSystenが存在しないということを教えてくれています。これを、1.プログラムの入力 のように書き直すと、また実行することができます。

## 終わりに
Javaの書き方について触れてきましたが、いかがだったでしょうか。
ここまで見ていただいた方には感謝しかございません。
本当にかじった程度のことしか書けていませんが、色々なことをこれからも学びたいと思います。
mac に最新の pyopenjtalk をインストールできない。

# 動機
macであれば`pyopenjtalk==0.1.3`をインストールすることで大体は使用することができるようになる。
しかし、最新バージョンをインストールできないのはなんか悔しい、あと、勉強のためになんとかインストールできないかやってみた。

# 方法
半年前くらいに解決したのであまり詳細は覚えていないが以下の手順を実行した。
[参考になったページ](https://stackoverflow.com/questions/58628377/catalina-c-using-cmath-headers-yield-error-no-member-named-signbit-in-th#:~:text=作品の削除MacOSX10.15.sdk)
上記ページの
Deleting MacOSX10.15.sdk works.部分から行った。
ページ内検索でDeleting MacOSX10.15.sdk works.を探して欲しい。

以下の場所に移動

```sh
$ pwd
/Library/Developer/CommandLineTools/SDKs
```

MacOSX10.15.sdk このディレクトリをpyopnjtalkをビルドする時に参照しているからダメみたい、、、
なので、一時的にMacOSX10.15.sdkを退避させるディレクトリを作る 「test」
そこに `$ sudo mv  MacOSX10.15.sdk test` で移動

```
$ sudo mkdir test
$ sudo mv MacOSX10.15.sdk test

$ ls -la
total 0
drwxr-xr-x  7 root  wheel  224  2 25 11:44 .
drwxr-xr-x  5 root  wheel  160  7 19  2021 ..
lrwxr-xr-x  1 root  wheel   14  7 19  2021 MacOSX.sdk -> MacOSX11.3.sdk
drwxr-xr-x  7 root  wheel  224 11 30  2020 MacOSX11.1.sdk
drwxr-xr-x  8 root  wheel  256  2 25 11:38 MacOSX11.3.sdk
lrwxr-xr-x  1 root  wheel   14  7 19  2021 MacOSX11.sdk -> MacOSX11.3.sdk
drwxr-xr-x  3 root  wheel   96  2 25 11:44 test

$ ls test
MacOSX10.15.sdk
```

以下のコマンドでDCMAKE_OSX_SYSROOTを設定
`MacOSX11.3.sdk`じゃなくても自分のディレクトリに存在している最新のものであればいいと思う。

```
$ DCMAKE_OSX_SYSROOT="/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk"
$ echo $DCMAKE_OSX_SYSROOT
/Library/Developer/CommandLineTools/SDKs/MacOSX11.3.sdk
```


MacOSX10.15.sdk がビルドする時に参照できなくなったので
```
$ pip install pyopenjtalk
```
これでいけるはず！！

# 考察
少し前なのであんまり詳しくは覚えていないです、申し訳ありません。。。
多分ですが、MacではC/C++(gcc)を使用するライブラリをインストールするときはXcodeの関係のComandLineToolが関係しており、今回はそこを参照しているものを変更することで問題が解決できました。

Mac OSをアップデートしたので、
もしかしたらOSのバージョンをアップデートしたりすると参照先が変わらずにインストールできない現象になるのかも。

## 勉強になったこと
C/C++関係のライブラリのインストールでつまづいたりすると結構厄介な解決方法になる。
XcodeやC/C++(cmake, gccなど)周りの情報を調べると解決法にたどり着くかも。
諦めない心が大切！
結構たくさんの解決法を調べて試したが、なかなかできなかった。

# 参考文献
[Catalina C++: Using <cmath> headers yield error: no member named 'signbit' in the global namespace](https://stackoverflow.com/questions/58628377/catalina-c-using-cmath-headers-yield-error-no-member-named-signbit-in-th#:~:text=作品の削除MacOSX10.15.sdk)
モノから電話がくる？   Twilioハッカソン2022

今回は、Twilioハッカソン2022において、自分がチームリーダーを務めたTeam CoTの制作物、「モノの気持ち」について紹介いたします!!

# Twilioハッカソンとは
Twilioを使いながら、日常のコミュニケーションを少しリッチに、そして便利にしていくことを目的としたオフラインで実施される2日間のハッカソンです。

今回のハッカソンでは、身の回りにあるちょっとした課題を、コミュニケーションAPI「Twilio」を使って解決することによって、「コミュニケーションのDX化」を実現してみませんかをテーマにチームに分かれ、アプリケーションなどを開発していきました。

今回のハッカソンは2日目の方のオフラインが中止となり、オンラインでの発表となってしまいましたが、多くの人がTwilioを使い様々なものを制作するイベントとなっていました。

https://hackathon.we-are-ma.jp/twilio2022/


# モノの気持ち

## 概要
今回のハッカソンでは、当日5人のチームを結成し、「**communication of things**」の略となるCoTから、Team CoTを結成し、「**モノの気持ち**」を作成いたしました。

![46247fc4-85b8-476b-9187-2817ceb51d49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/2dad6613-4d8a-6b79-a560-4d17b0b4023b.png)

「**communication of things**」ともある通り、人と人とのコミュニケーションではなく、人と物とのコミュニケーションに着目したシステムとなっており、モノが人のようにLineで明日の予定を伝えてきたり、電話で自分自身を忘れたことを知らせたりするシステムとなっています。


![7a7ecf00-482a-4ebe-99f7-f8dab84e7db3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/2ac1c8ca-75ca-8053-b4db-dcda955db72f.jpeg)
今回のデモの時に使ったドアと磁気センサの検知用obniz
※ドアはチームメンバーの方が作成してくれました。本当にありがとうございます:pray:

## コンセプト

本システムは、「身近には気づかないだけで、すぐ傍には大事な物（ヒト）がいる）をコンセプトに作成されており、忘れ物を防ぐための仕掛けが随所に仕込まれています。

例えば、ものごとに実はさまざまなキャラ付けがされていたり、忘れ物をした際に話す内容も違っていりなど様々な工夫がなされています。

## システムについて
システム概要図はこちらです。
![4b55ba2e-ad96-4fd1-8e63-9a2a5790dea3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/db5e4ca8-6069-4c10-e181-6108e556808e.png)

1.Kintoneに入力された予定から、必要な持ち物を検出する

2.予定の前日になると、モノたちは忘れられないようにLineでアピールする

3.当日、それでも忘れられてしまった場合は、即座に物から持ち主に、電話を掛ける

の３つとなっており、この３つにより、忘れ物を防ぐ仕組みを作っています。

## アピールポイント

アピールポイントとしては、モノからメッセージが届く/電話がかかってくることで**人間味**を強調することで、モノへの**愛着**を沸かせます。これによって、自然にモノへと意識を向けるようになり、忘れ物自体を**予防**できるものとなっています。

そのため、従来のリマインダーよりも"**継続的**"なものとなります。

![Twilio_ハッカソン_1212_ページ_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/46ada415-2f97-654a-b6d6-cd1a5c638fc7.jpeg)
![Twilio_ハッカソン_1212_ページ_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/9f9b7724-cca8-a2c9-1740-b3b608bfb345.jpeg)
![Twilio_ハッカソン_1212_ページ_12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/af40ff77-faf8-baf6-8d7e-57024c6d84be.jpeg)

ということですね。

# 今回のハッカソンで気をつけたこと
今回のハッカソンでは、当日参加した方々でチームを組んで作業をおこなったため、できる限り、常時確認を行うこと、作っていくときにコンセプトとずれてないかを常に考えることを意識して行いました。

今までのハッカソンでは、コンセプトのチェックの部分があまりできていなかったため、今回はやるように意識しました。


# 今回のハッカソンの結果

![スクリーンショット 2022-12-13 014308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2698432/86442e8e-6630-e648-ce8b-ecfe08c2a7d4.png)

今回のハッカソンでは、見事、**obniz賞**をいただくことができました。
チームメンバーの皆さん、テクニカルサポーターの皆さん、運営の皆さん本当に今回のイベントありがとうございました。自分の中でも大きな一歩となるイベントとなったように感じます。また、Twilioハッカソンがあればぜひ参加したいと思います!!


# 関連リンク

https://www.youtube.com/watch?v=dD7R5MLTyeQ#t=31m40s

https://protopedia.net/prototype/3638
EC2の設定変更の検知にAWS Configが使えるのか調べた

書いたから…セーフ…間に合ってないけど…

# 今回の記事の経緯など
EC2の設定変更を検知して、意図しない変更がされる場合には設定を既定値に戻すような対応が必要になり、AWS Configについて調べました。
結論から言うと、AWS Configは使わずにEventBridgeを利用してEC2の設定変更を検知することになりました。

# AWS Configとは
AWS Configはリソースの設定変更がされたときに設定値が評価され、設定によっては修復(設定値を規定値に設定すること)もできるサービスです。

例えば、アカウント内のEC2インスタンスが指定のインスタンスタイプになっているかどうかが一覧で表示できるようになります。
指定のインスタンスタイプかどうかは「準拠」「非準拠」で確認ができます。
非準拠のリソースを指定して、修復することもできます。
![AWS_Config1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61235/11833e40-09b2-e5cd-95bb-52589d0e53d4.png)

# 検知できるルールについて
検知できるルールはAWSで作成されたルールの他に、Lambdaで自分が検知したいルールを自由に作ることもできます。
(上記のスクリーンショットはAWSの管理ルールで作成したものです。)

# 今回AWS Configを使わなかった理由
準拠・非準拠の一覧が見れて、リソースを指定して修復ができるのはいいなと思いましたが、以下の理由から今回はAWS Configを利用するのを諦めました。
- 検知したときのパラメータにユーザ名が含まれていない
- 今回対応したかったインスタンスの設定変更でトリガーができない

もともと管理者ユーザが設定変更したときは検知や修復はしないという要件で、パラメータにユーザ名が入っていないのは厳しいという事になりました。
また、検知後すぐに修復がしたかったんですが、今回検知したかったインスタンスの設定変更でトリガーができないのもAWS Configを選ばなかった要因になりました。

今回の対応では、CloudTrailとEventBridgeでインスタンスの設定変更を検知して、Lambdaで修正するという案で進めることになりました。

# まとめ
AWS Configは今回実際に利用はしませんでしたが、準拠・非準拠の状況が一覧となって確認できるのはとても良いなと思っています。
別の機会があれば利用するのを検討してみたいと思います。
初心者向けPower BI体験会開催のために検討したこと

 この記事は[Microsoft Power BI Advent Calendar 2022](https://qiita.com/advent-calendar/2022/powerbi)のカレンダー2の13日目です。

# 概要
社内で初心者向けのPower BI体験会をしました。 体験会の準備にあたり検討したことを共有します。

# 背景・前提
私はメーカーの社内システム開発チームに所属しており、持ち回りで勉強会をしています。私の当番にて、Power BIをテーマとしました。
参加メンバーは約20名、うち4～5名だけPower BIレポート作成の経験があります。
大半のメンバーは、Power BIを利用者として参照したことがある、という程度です。
時間は45分間、開催までの準備期間は約1週間でした。

# 検討したこと
## 目的
目的として、いくつか候補を検討しました。
- そもそものレポートの目的やアクションをいかに具体化するか、を議論する
- もしくはPower BIの最近のリリース動向を紹介する

ただ、メンバーの前提が様々な中で、もやっとした話で終始してしまうことが想像できました。
そこで今回は、「Power BIレポート作成のハードルを下げること」を目的とした体験会としました。
- Power BIで可視化を一つ作る
- 作成時に知っておくべき知識のうち、ごく一部だけでも理解する

## 内容・構成
日付テーブル、スタースキーマ、DAX、・・・と、伝えたいことはたくさんありますが、
時間内で紹介できる範囲で、下記4点に絞りました。
       
1. なにはともあれ可視化してみる
    - ドリルダウン/アップ、可視化間の連携、複数選択、フィルタの紹介
1. Power BIでレポートを公開するまでのステップの説明
    <img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/e02d4ce7-1bc8-7cf1-dac1-3405918e27fe.png">
1. モデリングとは
1. メジャーとは

次に検討したのは、モデリングとメジャーについて、短い時間でどう説明しようか、でした。
- お題に沿って手を動かしてみる
- 「なんかうまくいかへん」
- そこで代案「あ、そういうものがあるのね」

というストーリーとしました。それぞれ下記のとおりです。

### モデリング
1. いま仮に、作業者別の入庫数・出庫数を一つのグラフで表示したい、とします。
1. 入庫・出庫のデータをポチポチッと項目選択すればうまいこと可視化してくれるはず？
    <img width="50%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/336028b0-2ec7-f6eb-e485-1554b4c2e056.png">
1. しかし、用意された環境で可視化してみたらどうも期待と違う
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/37f856be-2c30-ad44-00cd-b42108680916.png)
1. この原因は、2つのテーブル間に「作業者」のリレーションがないからです。
    リレーションにより、正しく直感的な可視化・分析ができます。
    これがモデリングの一つの要素です。

### メジャー
1. いま仮に、作業品質に問題があるとします。
    作業者別に手戻りの回数（出庫数修正回数）を可視化してみます。
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/75dc5d5a-638d-28f6-095e-89f7c21d21f4.png)
1. 一見すると作業者Bさんの修正数は多そうに見えます。
    しかし、Bさんの作業品質が他のユーザより悪いのか、Bさんの作業量が多いのか、が判断つきません。

1. そこで予め作っておいたメジャー「出庫数修正率（＝修正数／出荷数）」で可視化してみます。
   これにより、他の作業者よりもBさんの作業品質が低そう、といえます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/66807241-ae31-34bf-7223-3f95002f1f91.png)
1. 現在の表示条件をふまえて、算出式の結果を表示できる要素をメジャーといいます。

## 環境準備
各自の環境準備についても検討しました。できるだけ手間をへらすため。基本はPower BIサービスとしました。
一方でサービスだけだとデータモデル（リレーション）の編集や、メジャー作成はできません。
そこで、2種類の環境を用意しました。
- Power BIサービス上に各メンバー用にレポートを複製しました。
    これらのレポートはすべて同じデータソースを参照します。
- Power BIデスクトップインストール済みのメンバー向けに、pbixファイルを用意しました。
    こちらも同じPower BIサービスのデータソースをライブ接続で参照します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/164170/9fbedb49-bbdf-60b2-d068-4d46e27322fb.png)


# 体験会を終えての振り返り
- 質疑応答も含め、ちょうど時間内に納めることができました。
- 数名の方からは良いフィードバックを頂きました。
- メジャーの説明は改善の余地あり、です。

# 最後に
Qiita初投稿でした。
Power BI Weekly Newsの毎週の配信ありがとうございます。アドベントカレンダーの紹介をきっかけに、勢いで日付を押さえました。投稿するネタを作るために、これからも精進したいと思います。
WSL2のUbuntu22.04上でneovimをソースコードからビルドする

# Pre-Required

```
sudo apt-get install ninja-build gettext libtool libtool-bin autoconf automake cmake g++ pkg-config unzip curl doxygen
```

# Build

```
git clone https://github.com/neovim/neovim
cd neovim
make CMAKE_BUILD_TYPE=RelWithDebInfo
sudo make install
```

# 参考

- https://github.com/neovim/neovim/wiki/Building-Neovim
- https://github.com/neovim/neovim/wiki/Installing-Neovim
株価を取得する

```bat:nasdaq.bat
@echo off

:: ref: https://qiita.com/zono_0/items/dc9e824cc6c4d9c62bce

set LINE[1]=     dBBBBb dBBBBBb  .dBBBBP   dBBBBb dBBBBBb     dBBBBP
set LINE[2]=        dBP      BB  BP           dB'      BB    dB'.BP 
set LINE[3]=   dBP dBP   dBP BB  `BBBBb  dBP dB'   dBP BB   dB'.BP  
set LINE[4]=  dBP dBP   dBP  BB     dBP dBP dB'   dBP  BB  dB'.BB   
set LINE[5]= dBP dBP   dBBBBBBBdBBBBP' dBBBBB'   dBBBBBBB dBBBB'B   

set BL=10900
set BS=16400

setlocal enabledelayedexpansion
  cls
  echo.
  for /l %%i in (1, 1, 5) do (echo !LINE[%%i]!)
  echo.
  echo Gathering information, please wait ...
  echo.
  echo DATE       OPEN  CLOSE VOLUME     STATE
  echo ---------- ----- ----- ---------- --------------------
  
  for /f "usebackq tokens=*" %%a in (`powershell -NoProfile -ExecutionPolicy Unrestricted -Command "& { $UNIXTIME = ((Get-Date('%DATE% 00:00:00')) - (Get-Date('1970/01/01 00:00:00 GMT'))).TotalSeconds; return $UNIXTIME; }"`) do (
    set TO=%%a
  )
  set /a FROM=%TO% - (60 * 60 * 24 * 365)
  
  set Y=%DATE:~0,4%
  call :is_leap_year %Y% || set /a FROM -= 60 * 60 * 24
  
  for /f "skip=1 tokens=1-12 delims=,." %%a in ('curl -s "https://query1.finance.yahoo.com/v7/finance/download/%%5ENDX?period1=%FROM%&period2=%TO%"') do (
    if %%b leq %BL% (echo %%a %%b %%h %%l △ Hit the big long)
    if %%b geq %BS% (echo %%a %%b %%h %%l ▼ Hit the big short)
  )
  
  echo.
  echo Press any key to continue ...
  pause > NUL
endlocal
goto :EOF

:is_leap_year
  setlocal
    set n=0
    
    set /a n=%1%%400
    if %n% equ 0 exit /b 1
    
    set /a n=%1%%100
    if %n% equ 0 exit /b 0
    
    set /a n=%1%%4
    if %n% equ 0 exit /b 1
    
    exit /b 0
  endlocal
goto :EOF
```

実行結果は以下のとおりです。
![nasdaq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29814/c8f58028-4ebf-8132-af9e-6d29e3fc74ad.png)
Ubuntu 22.04 + Nginx 1.22.1 + MariaDB 10.6.11 + PHP 8.1 - MariaDB設定

## 前提
WordPress をインストールする前に WordPress 用の DB を構築するよ。
## 環境
Ubuntu 22.04
Nginx 1.22.1
MariaDB 10.6.11

MariaDB のインストールはこっちを見てね。

https://qiita.com/akikito/items/08c7857d24a6fafa2058

## 設定
### 設定前の確認
```
$ sudo mysql -u root -p

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.016 sec)

MariaDB [(none)]> select user,host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
+-------------+-----------+
3 rows in set (0.001 sec)
```
### データベースの作成
```
MariaDB [(none)]> create database wordpress;
```
### ユーザの作成
```
MariaDB [(none)]> create user 'wpuser'@'localhost' identified by 'p@ssw0rd';
```
### アクセス権の付与（特権ユーザ）
```
MariaDB [(none)]> grant all on wordpress.* to 'wpuser'@'localhost' with grant option;
```
### 確認
```
MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| wordpress          |
+--------------------+
5 rows in set (0.002 sec)

MariaDB [(none)]> select user,host from mysql.user;
+-------------+-----------+
| User        | Host      |
+-------------+-----------+
| mariadb.sys | localhost |
| mysql       | localhost |
| root        | localhost |
| wpuser      | localhost |
+-------------+-----------+
4 rows in set (0.002 sec)
```
### 設定保存
```
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit
```
Pythonで忘れがちなSyntax

## Set型でできること

### 集合同士の演算
返りも集合型
- 集合の和をとる `union()`, `|` [^1]
- 集合の積を取る `intersection()`, `&`
- 集合の差を取る `difference()`, `-`[^2]
- 集合対称差（片側だけに固有）を取る 'symmetric_difference()`, `^`

返りがBool
- 互いに素、共通要素がないか　`isdisjoint()`
- 含まれるか　`issubset()`,`>=`


### その他の型変換における注意
Listに変更されるときはランダムな順番のリストになる。なぜならば、Set型ではハッシュテーブルとして実装されており、ハッシュテーブルの順番に挿入しList型に変換するからである。

参考：　　https://docs.python.org/ja/3/tutorial/datastructures.html
参考２：　https://docs.python.org/ja/3/library/stdtypes.html#set
参考３：　https://note.nkmk.me/python-set/

[^1]: `+=`で再代入も可能
[^2]: `-=`で再代入も可能

## rangeの引数
rangeは１から３の引数を取ることができる関数である。
range(初期値,最終値,差分）
となる。高校で習った等差数列をイメージすると良いだろう。
この引数の取り方の順番は要素のIndexという違いがあるが配列に対するスライスにも似ている。

## リスト内包表記ができる型
- List
- Dict
- Set
である。

List
```python
# 書き方　１
squares = []
for i in range(10):
     squares.append(x**2)
# 書き方２
squares = list(map(lambda x:x**2,range(10)))
del x
# 書き方３
squares = [x**2 for x in range(10)]
```

Dict
```
dict = {k: False for k in range(10)}
```

Set
```
set = {k for k in range(10)}
```
Reactでよく使われるpropsについて知ろう

## はじめに
これは、[株式会社 RetailAI X Advent Calendar 2022](https://qiita.com/advent-calendar/2022/retail-ai-x) の 13日目の記事です。
昨日の記事は、 @satoshihiraishiさんの『[WordPressのGCEからCloudRunへ移行の検討
](https://qiita.com/satoshihiraishi/items/6a62f3e7831e59b9bd06)』でした。

本日は、『[Reactでよく使われるprops](https://qiita.com/esoul/items/f699b7e40766bba92e76)』について書いています。

## propsとは?
Reactでは、<b>props</b>は<b>properties</b>の略で、オブジェクトのプロパティのことです。Reactで作成される要素はすべて*JavaScript*のオブジェクトです。オブジェクトのプロパティと値を作成することでコンポーネントへデータを渡すことができます。

簡単に言うと、親コンポーネントから子コンポーネントへ値を渡すための仕組みのことは<b>「props」</b>です。

## propsはいつ使う？
独特な動作のため、最初はReactの<b>props</b>の使い方を理解することは少し戸惑うかもしれません。なぜなら、Reactの<b>props</b>は読み込み(*read-only*)だけで、一度そのコンポーネントにデータが渡されると、変更することができません。

つまり、親コンポーネントが子コンポーネントを呼び出すとき、<b>props</b>を使うことで子コンポーネントに値を渡すことができますが、子コンポーネントから親コンポーネントに値を変更して、渡すことができません。
<figure>

![スクリーンショット 2022-12-13 0.02.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2312213/1432c31d-9835-74a2-87a9-f1f4d1cc0426.png)
<figcaption align = "center"><b>図.1 - 親コンポーネントから子コンポーネントに値を渡す</b></figcaption>
</figure>

## propsの使い方
- <b>子コンポーネント</b> : 親から値をもらいたいところにpropsを定義する

- <b>親コンポーネント</b> : 子コンポーネント呼び出し時に、子に渡したい値を設定する
![スクリーンショット 2022-12-13 0.09.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2312213/28689de3-ed14-cd73-08b9-3cd50c56ca0d.png)

## サンプルコード：
##### 1. App.js (親コンポーネント)
```
import "./App.css";
import Introduction from "./components/Introduction";
import Message from "./components/Message";

function App() {
  const name = "桃太郎";
  const age = 26;
  const birthplace = "福岡";
  const message = "よろしくお願いします。";
  return (
    <div className="App">
    //子コンポーネントのIntroduction。
      <Introduction
        name={name}
        age={age}
        birthplace={birthplace}
      />
      //子コンポーネントのMessage。
      <Message
        message={message}
      />

    </div>
  );
}

export default App;
```

##### 2. Introduction.js (子ンポーネント)
```
import React from "react";

const Introduction = (props) => (
  <>
  //propsから親コンポーネントにある値を取る。
    <h1>{props.name}</h1>
    <h2>{props.age}</h2>
    <h2>{props.birthplace}</h2>
  </>
);

export default Introduction;
```

##### 3. Message.js (子ンポーネント)
```
import React from "react";

const Message = (props) => (
  <>
  //propsから親コンポーネントにある値を取る。
    <h1>{props.message}</h1>
  </>
);

export default Message;
```

#### 実行結果：
<figure>

![スクリーンショット 2022-12-13 0.15.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2312213/6add7579-3b70-a5d9-fbd6-60b7f1775f05.png)
<figcaption align = "center"><b>図.2 - Localhostでの実行結果</b></figcaption>
</figure>

## 終わりに
本記事ではpropsの基本的な使い方について紹介しました。
propsはimmutableのため、一度セットされるとその値は変わりません。そして、親コンポーネントによって値がセットされます。propsを使いなれると、コードが短くて、簡単に書ける事ができます。
次回は@Mikeyさんの『[NFTはなぜ難しいのだろう？](https://qiita.com/Mikey/items/53391021ad7482a61a8f)』の記事です。お楽しみください🎵
WSL2でGitのGUIクライアントを使う

## モチベーション
- WindowsでWeb開発をしたい
- チームではMacで開発している人が大多数なのでWindows使いに人権などない(環境構築でcatとか普通に使う)
- 各種コマンドやgitの操作などはWSL2を使って開発することにした
- Gitクライアント(GitKraken)がWSL2内を参照/watchしてくれない！ ← イマココ

日本語の記事があんまりない and 情報が古かったので、ここに残します。

## 以前のやり方
X Server (X410) とか VcXsrv を使ってLinux側に窓口用のサーバーを構築し、それと通信させる形でWindows上から使うのがスタンダードだったみたいですが、MicrosoftからWSLgが発表され、自分でそんなことしなくてもよくなりました。

公式ドキュメントを参考に進めていきます。
→ [Linux 用 Windows サブシステムで Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)

## 前提
- WSL2有効化済み
- Ubuntu導入済み
- 使いたいGUIクライントがLinux版を提供している

## 手順

- システムをアップデート
```powershell
wsl --update
```

- 再起動
```powershell
wsl --shutdown
```

- WSL2に入る
```powershell
wsl
```

- Gitクライアントをインストール、起動 ※例はGitKraken
```powershell
wget https://release.gitkraken.com/linux/gitkraken-amd64.deb
sudo dpkg -i ./gitkraken-amd64.deb
sudo apt-get install -f
gitkraken
```

:::note warn
- エラーが出る場合は以下を実行してから再度クライアントをインストール
```powershell
sudo apt-get update
sudo apt --fix-broken install
```
※2023/5/30追記
:::
おわり

## 起動確認
- Windows側で`Windowsメニュー` → `すべてのアプリ` → `Ubuntu` の下に、`Gitクライアント`がいるので起動する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224096/4765fee9-b0f2-7a16-cb18-a7184643e4bd.png)

- 起動したクライアントはWSL2内で動いているヤツです

## ついでにChromeを入れる

Githubとかの連携にクライアントから認証画面を開いたりしますが、Windows側のブラウザを立ち上げてくれるわけではないので、WSL2側にブラウザを入れます。

- Microsoft公式ドキュメントから抜粋
> Linux 向け Google Chrome をインストールするには、次のようにします。
>
> 1. ディレクトリを temp フォルダーに変更します。`cd /tmp`
> 2. wget を使用してそれをダウンロードします。`sudo wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb`
> 3. 現在の安定したバージョンを取得します。`sudo dpkg -i google-chrome-stable_current_amd64.deb`
> 4. パッケージを修正します。`sudo apt install --fix-broken -y`
> 5. パッケージを構成します。`sudo dpkg -i google-chrome-stable_current_amd64.deb`

- このままだと日本語がバグっているので、日本語環境を構築する
    - 素晴らしい記事にお世話になりましたmm
    → https://astherier.com/blog/2021/07/windows11-wsl2-wslg-japanese/

- Windows側で`Windowsメニュー` → `すべてのアプリ` → `Ubuntu` の下に、`Google Chrome (Ubuntu)`がいるので起動する

- クライアントから認証画面を開いたりすると、このブラウザで立ち上がります

## おわりに
FireFoxだと日本語入力ができないだとか、まだ色々と不具合はあるみたいですが、WSLによってWindows使いに人権が少しずつ生まれています。
これからに期待します。
この記事が誰かの助けになれば幸いです。

## 参考にさせていただいた記事
ありがとうございました！
- [Linux 用 Windows サブシステムで Linux GUI アプリを実行する](https://learn.microsoft.com/ja-jp/windows/wsl/tutorials/gui-apps)
- [WSL2でGitKrakenを使うまで](https://qiita.com/papi_tokei/items/40120549bb81e7f44c07)
- [Win11のWSL2 (WSLg)を日本語化 & Mozcで日本語入力](https://astherier.com/blog/2021/07/windows11-wsl2-wslg-japanese/)
- [Installing GitKraken in WSL 2](https://chuckdries.medium.com/installing-gitkraken-in-wsl-2-15bf6459f823)