OmniAICreator/Qiita-1.07M huggingface dataset:
2022/4/25主にITとかセキュリティの記事

｢カフェのWiFiには絶対につながない｣、MZ世代のホワイトハッカーが語る日常(4/23)
https://s.wowkorea.jp/news/read/344996/

Apple Payを悪用する詐欺多発！多要素認証トークンを盗むアンダーグラウンドボット(4/23)
https://www.appps.jp/364749/

【2022年最新版】Android の画面ロックを解除する方法のまとめ【PassFab Android unlocker 2.1.1】(4/23)
https://ascii.jp/elem/000/004/090/4090006/?rss

メモリ4GBで月額3980円から 富士通「サブスクPC」はなぜ炎上したのか(4/23)
https://news.yahoo.co.jp/byline/yamaguchikenta/20220423-00292698

iPhoneストレージ「その他」が多い際の対処法|データを削除/減らして容量を確保する手順(4/23)
https://gunosy.com/articles/egLZi

Windowsタスクバー、時計の『秒』表示はパフォーマンスへの影響が大きい(4/23)
https://www.zaikei.co.jp/article/20220423/669743.html

EU、巨大IT企業へのコンテンツ規制法に合意　デマなど排除が義務(4/23)
https://news.yahoo.co.jp/articles/f562e38259e6c4c5bed7f4957574cb7c9b00f069

バイナンス、アクシーインフィニティから流出した資金の一部を回収(4/23)
https://coinpost.jp/?p=343686

「ＦＸで稼ぎませんか」という詐欺、その巧妙な手口とは　２０２０年から被害急増、背景にアプリとＳＮＳ(4/23)
https://news.yahoo.co.jp/articles/66f75fb466d26a907a094c5e7cfd8837bb68e992

Google、欧州でCookie同意バナーの全拒否ボタン提供開始へ(4/22)
https://www.itmedia.co.jp/news/spv/2204/22/news128.html

Microsoft、JavaScriptに型注釈を追加する「Types as Comments」を提案(4/22)
https://atmarkit.itmedia.co.jp/ait/spv/2204/22/news049.html
Laravel+Eloquentで特定の条件を満たす時だけ追加するクエリの条件をwhenを使って綺麗に書いてみる

LaravelのEloquentを使ってクエリを書いていると、時々特定の条件下の時のみ追加されるクエリを書きたくなることがありますね！（ない人はごめん)

例えば、特定のパラメータが渡ってきたときだけに特定のカラムに対するwhereの条件を追加したい... のようなときにif文を使って無理矢理繋げたりすると見通しが悪くなってあまりいい感じには見えないのでそれを解決する方法を紹介したいと思います。

## whenを使ってみる
```php
use Illuminate\Database\Eloquent\Builder;

// $categoryIdがnullじゃないときだけcategory_idで絞り込みたい時
$posts = Post::query()
    ->where('is_public', '=', true)
    ->when(
        $categoryId !== null,
        fn(Builder $query) => $query->where('category_id', '=', $categoryId)
    )
    ->get();
```

whenを使うことで圧倒的にシンプルで見やすくなりましたね！ これでif文と訳のわからない変数の書き換えの地獄から開放されるようになります。

また、コツとしては渡してあげる無名関数にはちゃんと引数にBuilderの型を付けることで、IDEの補完もエラー検出も効くようになるので忘れずに付けておきましょう！

## さいごに
このwhenくんは`Illuminate\Support\Traits\Conditionable`というtraitから生えていて、多くのLaravelのクラスはこれを実装しているのでEloquentのみならず使える箇所が多くあります。

是非活用してみてください！
VRChatでPhysBonesを使って銃のスライドをスライドする

<h1>やりたいこと</h1>
表題の通りです。<br>
参考動画、前半のやり方です。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">Physbonesで銃のスライド動かす奴、簡易モデルでの試作だからちゃんとしたモデルで動くかはわからないけどうまくいった！<br>2つの方法は一長一短だけど、どっちも実用に耐えうるんじゃないかな <a href="https://t.co/o4HDkU3Smx">pic.twitter.com/o4HDkU3Smx</a></p>&mdash; justice (@yukariAide) <a href="https://twitter.com/yukariAide/status/1518231504291528709?ref_src=twsrc%5Etfw">April 24, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script> 
<h1>①用意するもの</h1>
・銃の3Dモデル(スライド部分にボーンが入っているもの)

今回は<a href="https://booth.pm/ja/items/3717409">こちら</a>のモデルをお借りしました。

・親子関係のオブジェクト
画像では分かりやすいように立方体と球で表示していますが、自分がわかればなんでもいいです。
同じように立方体と球を目印とつかう場合はコライダーを抜くのを忘れずに。
![スクリーンショット 2022-04-25 003607.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641005/905c5f40-3487-8ddb-6aa6-99b921154c2f.png)



## ②位置合わせ
親子オブジェクトを銃オブジェクトに入れます。
この時の親子オブジェクトの向きは非常に重要です。しっかりとスライドに沿った向きで、また、親オブジェクトが前、子オブジェクトが後ろに来るように配置してください。
この親子オブジェクトを配置した場所が、握って引く判定部分になるのでスライドに重なるか、ちょっと上ぐらいがおすすめ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641005/1b553baa-2b6c-5890-1b0e-e3412662c960.png)

## ③PhysBoneの設定
親子オブジェクトの親にPhysBoneを追加してください。
設定は画像の通りに。
![スクリーンショット 2022-04-25 022221_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641005/fedbbeeb-41fd-31f5-2a96-02d1c6bab6b3.jpeg)
Forces……Pullを1に設定することで初期位置に戻る力を強く、Springを0にして余計な動きをしないように、Immobileは1にして動かしても余計な力が働かないように。
Limits……ボーンの可動域の設定。Angleに設定して0度にすることで動かないように。
Collision……手で掴む判定の大きさ。お好みで。
Max Stretch……ボーンの伸びる距離＝銃のスライドの稼働距離

## ④Constraintの設定
銃のスライダーのボーンにPosition Constraintを追加。
設定は画像の通りに。
もし、この設定をした後に、親子オブジェクトを動かしたりしたくなった場合は、必ずIs Activeのチェックを外してから移動させること。移動させた後にActivateを押しなおすのを忘れずに。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2641005/911c8b60-2491-a07e-cdd6-31becd011472.png)

以上です。あとはこの設定をした銃をアバターの手に持たせて、もう片方の手でスライダーを握ればスライドアクションができるはずです。

## Q&A的な
Q,スライドの可動域を調整したい
A,PhysBoneのMax Stretchの値を弄ってください。

Q,スライドの方向以外に引っ張ってもスライドされる
A,多分仕様です、あきらめてください。

Q,銃を持った方の手を握りこむと、スライドが引けなくなる
A,どうもPhysBone一つにつき握れる手はひとつらしいです。銃を持った方の手は握りこまないようにするか、判定を小さくしたり少し移動させたりしてみてください。

Q,VRCでうまく動かないけどどこが駄目なんだろう
A,ExMenuのアバターセッティングからPhysBoneを可視化できるデバックモードがあります。そっちで見るとボーンを掴めてるか、引っ張った時にどんな挙動をしてるかが確認できます。

## おわり
一方向に移動する系のギミックは軒並み同じ方法で実装できると思います。電気の紐とか、棚の引き出しとか。
そのうちもっといい方法が出てくるといいね。
sbclのインタプリタでスタックを溢れさせてみた

# sbclのインタプリタでスタックを溢れさせてみた

再帰関数を末尾再帰にすると、コンパイル時に最適化されてJUMP命令になるからスタックを消費しなくていいよね。と言いたいのですが。。。

  [末尾再帰，継続，アクタ，コルーチン : セマンティックウェブ・ダイアリー](http://blog.livedoor.jp/s-koide/archives/1888679.html)

SBCLだと、あれれ？？となります。。。

## 末尾再帰関数をコンパイルしていないのにスタックが溢れない？？

こちらは末尾再帰関数です。

```common-lisp
(defun test-tail (n)
  (when (eq (mod n 1000) 0)
	(print n))
  (test-tail (1+ n)))
```
ロードして、関数を呼び出します。

```bash
$ sbcl --load test-tail.lisp
This is SBCL 2.0.1.debian, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (test-tail 0)
```

  関数は末尾再帰になっていますが、コンパイルしていないのでスタックが溢れてエラーで止まることを期待する。。。のですが、再帰が止まることがありません。

## REPLの中でコンパイルしていたのか！
なぜかといえば、以下のように関数がコンパイルさているからです。

```bash
* (compiled-function-p #'test-tail)
T
```

REPLでの関数定義なのにコンパイルされるのですね。もう少し調べてみると。。。

[#:g1: SBCLのインタプリタが強化されたらしい](https://g000001.cddddr.org/3655641492)

> SBCLはCCLと並んでコンパイラ指向の処理系として知られています。
> (中略)
> そんなSBCLですが、1.3.0から従来のSB-EVALに代って、SB-FASTEVALというのが入ったみたいです。

なるほど。。。そういうことなのですね。。。

## SBCLのREPLをインタプリタ動作にして試してみる

では前出の記事を参考に、インタプリタ動作するSBCLのREPLで、コンパイルされていない末尾再帰関数でスタックが溢れるか検証してみます。

```bash
$ sbcl --load test-tail.lisp
This is SBCL 2.2.3.201-6e19f8c7a, an implementation of ANSI Common Lisp.
More information about SBCL is available at <http://www.sbcl.org/>.

SBCL is free software, provided as is, with absolutely no warranty.
It is mostly in the public domain; some portions are provided under
BSD-style licenses.  See the CREDITS and COPYING files in the
distribution for more information.
* (compiled-function-p #'test-tail)
NIL

* (test-tail 0)
0
1000
2000
3000
4000
5000
INFO: Control stack guard page unprotected
Control stack guard page temporarily disabled: proceed with caution
6000
debugger invoked on a SB-KERNEL::CONTROL-STACK-EXHAUSTED in thread
#<THREAD "main thread" RUNNING {1001630003}>:
  Control stack exhausted (no more space for function call frames).
This is probably due to heavily nested or infinitely recursive function
calls, or a tail call that SBCL cannot or has not optimized away.

PROCEED WITH CAUTION.

Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
  0: [ABORT] Exit debugger, returning to top level.

(SB-KERNEL::CONTROL-STACK-EXHAUSTED-ERROR)
```

以上のように、めでたく？？6000から7000の間でスタックが枯渇しました。

ついでに(compile 'test-tail)したところ、再帰が止まることなく処理が継続することも確認できました。

## 最後に
わざわざインタプリタ動作せて検証するのも大変なので記事にしてみました。何かのお役に立てば幸いです。ありがとうございました。
[Zabbix]トリガーのタグ機能を利用して、同一トリガーから生成された複数の障害イベントを個別にクローズ管理する

# ●はじめに
Zabbix3.2から実装されたトリガーのタグ機能を学習したので、設定例を記載しました。
従来であれば、同一トリガーから生成された複数の障害イベントは、トリガーの条件式が偽になればすべて同時に障害→正常となるので、実際のOS内の状況を正確に反映することはできませんでした。
トリガーのタグ機能を使えば、同一トリガーから生成された複数の障害イベントに対し、個別にタグを割り当てて状況を把握し、より正確に復旧を検知することができるようになります。
本記事では、/var/log/messagesに出力されるサービスを死活監視する場合を想定して記載しました。

# ●環境
|項目 |詳細 |
|:-:|:-:|
|ホストOS   |macOS Monterey 12.2.1   |
|仮想化ソフト   |VMware Fusion 12.2.0   |
|ゲストOS   |Alma Linux 8.5   |
|Zabbix ver   | 5.0.21  |

# ●トリガーのタグ機能とは
トリガーのタグ機能とは、同一のトリガーによって発生した複数の障害イベントに対し、個別にタグを割り当てる機能です。
複数の障害イベントが同一のトリガーから生成され、かつそのうちの1つが「障害→復旧」した場合、その同一トリガーから生成された他の障害イベントもすべて復旧していました。

/var/log/messagesのような、様々なアプリケーションやシステムのログが混在するログファイルの場合、過去に発生していた他のアプリケーションのエラーも（実際にはまだ障害であっても）障害から正常に戻してしまいます。

トリガーのタグ機能を使えば、**同一トリガーから生成された障害イベントであっても、個別に障害からの復旧を確認できます。**


# ●設定例
前述したように、ログに出力されるサービスの死活監視を想定してタグ機能を設定してみます。
ログに出力されるサービス名を個別に取得し、動的にタグに割り当ててそれぞれの障害/正常を管理します。
systemdで管理しているサービスの起動／停止を判定させ、Stoppedの文字列で障害、Startedの文字列で正常に戻します。

**1.設定箇所**
[左ペイン] - [設定] - [ホスト or テンプレート] - [トリガー] - [任意のトリガー] - [タグ]

**2.書式**
①名前：任意のタグ名（※後述する「クローズに利用するタグ名」に使用）
②値：　{{マクロ}.関数("pattern",output)}
![スクリーンショット 2022-04-25 1.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/8f1b378e-641b-1ca1-8248-99f393c7055b.png)
```bash
# 入力例
{{ITEM.VALUE}.regsub("^.+ systemd.+:(Started|Stopped)(.+)\.$",\2)}
```

**3.関数**
regsub：大文字小文字を区別
iregsub：大文字小文字を区別しない

**4.引数**
parttern：抜き出したい文字列を指定（今回は正規表現で指定）
output：partternで取得した文字列の中から、抽出したい文字列を指定
※pattern内の抽出したい文字列部分を()で囲い、outputで \1 や \2 のように後方参照で指定

**5.トリガー設定**
名前：任意
深刻度：任意
障害の条件式：**{Host1:log[/var/log/messages].str(Stopped)}=1**
正常イベントの生成：復旧条件式
復旧条件式：**{Host1:log[/var/log/messages].str(Started)}=1**
障害イベントの生成モード：複数
正常時のイベントクローズ：タグの値が一致したすべての障害
クローズに利用するタグ名：[タグ]のタブで設定されたタグ名を指定
![スクリーンショット 2022-04-25 1.20.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/4f718e1d-51f8-55bc-f7d4-327820aa715f.png)

# ●どういった動作になるのか
**1.障害時の動作**
```bash
{{ITEM.VALUE}.regsub("^.+ systemd.+:(Started|Stopped)(.+)\.$",\2)}
```
通常 /var/log/messages には、「systemd[xxxx]: Started/Stopped サービス名」の形式でログが出力されています。
上記トリガーのタグでは(.+)の部分（＝サービス名）を抽出し、Serviceタグの値に割り当てます。
これにより同一のトリガーから生成された複数の障害イベントでも、タグを割り当てて個別に管理することが可能になりました。
※以下はNTPとApacheが停止した場合の例。Serviceタグにそれぞれ別々の値が代入されて、「タグ名：タグの値」の形式になっているのが分かります。
![スクリーンショット 2022-04-04 9.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/aed0f911-0284-de54-2267-fc29582696e4.png)

**2.復旧時の動作**
トリガーのタグ機能を使用しない場合、この状態で「Started NTP client/server」という文字列が出力されると、NTPだけでなくApacheも復旧したとみなされてしまいます。
今回のようにトリガーのタグ機能を使用した場合、複数の障害イベントのうち、NTPのタグがついた障害イベントのみ復旧させることができます。
この場合、トリガーは復旧条件式で指定した「Started」を拾い、正常時のイベントクローズ「タグの値が一致したすべての障害」に従い、該当するNTPのタグが付与された障害イベントをクローズする動きをとります。
![スクリーンショット 2022-04-04 9.47.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1359780/c0474df0-46f5-ee82-1015-d5eaaaf2f2a9.png)

# ●まとめ
本記事では、Zabbix3.2から実装されたトリガーのタグ機能を紹介しました。
トリガーのタグ機能は、同一トリガーから生成された複数の障害イベントに対し、動的にタグを割り当てる機能です。
個別に状況を把握し、より正確に復旧を検知するために、ぜひ導入したい機能だと思います。
※もし間違い等ございましたら、ご指摘いただけますと幸いです。

# ●参考
・Zabbix統合監視実践入門
TryHackMeで勉強したことをまとめる part1

https://tryhackme.com/

英語で勉強したものを日本語でまとめているので、ところどころ日本語がおかしいところもあるかもしれませんがお許しください。
間違っている部分があれば教えていただけるとありがたいです。

# Learning Cyber Security
### Task1
webリクエストを何度も送り、総当たりでパスワードを解読する攻撃方法をBruteForceという。

# What is Networking?
### Task3
デバイスにはIPアドレス（internet protocol）という変更可能なアドレスと、MACアドレス（media access control）という変更不可能なアドレスがある。

IPアドレスにはパブリックアドレスとプライベートアドレスがある。
インターネットプロトコルにはIPv4があるが、インターネットに接続されるデバイスが増え、アドレスが足りなくなることから、それを解決するためにIPv6が作られた。
ピリオドで区切られた部分をオクテットと呼び、それぞれ0から255が入る。

MACアドレスは製造段階でネットワークインターフェースに割り当てられた番号のこと。同じネットワークに同じMACアドレスが存在することはほとんどない。最初の6文字は製造会社を表し、後の6文字は固有番号を表す。
スプーフィングというテクニックを用いることでMACアドレスを偽造することができる。

### Task4
pingとはICMPパケットを使用して接続の状態を調べるネットワークツールである。パケットの往復にかかる時間を計測する。ICPMエコーパケットとエコー応答を使って行われる。

# Intro to LAN
### Task1
トポロジーとはPCやLANケーブルをどのように接続するかの構成のこと。

・Star Topology
もっともよく使われるトポロジー。
コストはかかるが信頼性と拡張性が高い。
デバイスやケーブルが多いことからメンテナンスが必要になる。

・Bus Topology
バックボーンケーブルと呼ばれる一本のケーブルに接続する。
データはすべて同じケーブルを通ることからボトルネックになりがち。どこで問題が起こったのかも見つけづらい。
だが、セットアップが簡単でコスト効率がいい。

・Ring Topology
配線が少なく専用ハードウェアに依存することもない。
効率的ではないが、トラブルシューティングは簡単。
ボトルネックになりにくいが、どこかが壊れると全体がダウンする。

### Task2
サブネットとはネットワークをより小さなネットワークに分割したもの。
サブネットマスクによって、IPアドレスのどこまでがネットワーク部でどこからがコンピュータ部かを表す。
2進数で書いたときに「１」の部分がネットワーク部。

最後の桁が0のアドレスはネットワークアドレス、0以外はホストアドレスである。
ルーターに設定されるデフォルトゲートウェイも存在する。ネットワークを出入りするデータは必ずこのデフォルトゲートウェイを通る。最後の桁が1か254のことが多い。

### Task3
ARPプロトコル（Address Resolution）はMACアドレスとIPアドレスを結び付ける技術のこと。

ARPリクエストがブロードキャスト送信されると、デバイスはリクエストされたIPアドレスと自分のアドレスが一致するかを確認する。一致する場合は自分のMACアドレスを含むARP応答を返す。リクエストしたデバイスはこれをキャッシュに保存する。

### Task4
DHCP（Dynamic Host Configuration Protocol）はデバイスにアドレスを振り分けるプロトコルのことである。
IPアドレスを持っていないデバイスがネットワークに接続されたとき、まずDHCPサーバーが存在するかを確認する（DHCP discover）。DHCPサーバーが存在する場合は、使用できるIPアドレスを返す（DHCP offer）。その後デバイスがIPアドレスの確認を行い（DHCP request）、DHCPサーバーがそれを認める（DHCP ACK）。

# Introductory Researching
### Task3
脆弱性を調べたいときはExploitDB、NVD、CVE Mitreなどを用いる。

NVDには脆弱性がまとめられている。

ExploitDBには実際にダウンロードしてそのまま使えるコードが含まれている。Kaliにはsearchsploitというツールがインストールされており、それを用いることでオフラインでもDBを検索できる。CTFなどではまずここで調べることが多い。


# The Hacker Methodology
### Task1
CTFやぺネストレーションテストのプロセスは以下のステップである。
1. 偵察
2. 列挙、スキャン
3. アクセス権の獲得
4. 特権昇格
5. 痕跡の隠蔽
6. 報告

### Task2
偵察に役立つツール
・Google (specifically Google Dorking)
・Wikipedia
・PeopleFinder.com
・who.is
・sublist3r
・hunter.io
・builtwith.com
・wappalyzer
【rails】chartkick導入ガイド

# はじめに
個人開発の過程でkickchartを利用する機会があったのですが、日本語の記事でわかりやすいものがあまり見つからなかったので公式ドキュメントを日本語化&個人的に役に立った内容を記載しておきます！kickchartを利用する際の参考にしてください！！

# 導入

まずはkickchartの導入からです。rails のバージョンによって導入方法が違うので注意してください！
どのバージョンであってもまずはgemファイルに以下の記述を書き加えてください！！



```ruby:gemfile.rb
gem "chartkick"
```


## rails7の場合

configのimport.rbに以下の記述を追加してください。

```ruby:config/importmap.rb
pin "chartkick", to: "chartkick.js"
pin "Chart.bundle", to: "Chart.bundle.js"
```

また、app/javascript/application.jsに以下の記述を追加してください。
```ruby:app/javascript/application.js
import "chartkick"
import "Chart.bundle"
```

これでrails7における導入は完了です！！

## rails6の場合

ターミナルorコマンドプロンプトにて以下のコマンドを実行してください！

```
yarn add chartkick chart.js
```

app/javascript/packs/application.jsに以下の記述を追加してください！
```ruby:app/javascript/packs/application.js
import "chartkick/chart.js"
```
これでrails6における導入は完了です！

## rails5の場合
app/assets/javascripts/application.jsに以下の記述を追加してください！
```ruby:app/assets/javascripts/application.js
//= require chartkick
//= require Chart.bundle
```

これでrails5における導入は完了です！

# 導入できるグラフの例
公式ドキュメントで紹介されているグラフを紹介します！！

## line chart(曲線図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/ecbeb842-adac-bef9-6659-3b196e94c673.png)

```
<%= line_chart User.group_by_day(:created_at).count %>
```
上記のグラフはcreated_atを横軸、その日の投稿数を縦軸で表示しています。

## pie chart (円グラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/c1128b77-631e-3fe8-c9cb-9f8e78273feb.png)

```
<%= pie_chart Yogurt.group(:flavor).count %>
```

Yogurtテーブルからflavorカラムのカウントを表にしています。

## Column chart(棒グラフ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/664834a7-7302-a9c0-c32b-f52275b779a3.png)


```
<%= column_chart Order.group_by_day_of_week(:created_at, format: "%a").count %>
```

上記は一週間の曜日ごとの投稿数を表示するグラフです。


## Bar chart (棒グラフ)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/97bfb0b7-e0d9-50ad-c4b5-bb5ad9db751b.png)

```
<%= bar_chart Shirt.group(:size).sum(:price) %>
```

上記はShirtモデルのsizeごとに集計しその売り上げ合計を表示した棒グラフです。


## Area chart (面積図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/8aa942a2-e7ec-fb3a-ad1c-feeb98e577f6.png)

```
<%= area_chart Visit.group_by_minute(:created_at).maximum(:load_time) %>
```

## Scatter chart (散布図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/181b2726-de7a-4825-5eef-5ecea10d3894.png)

```
<%= scatter_chart City.pluck(:size, :population), xtitle: "Size", ytitle: "Population" %>
```

## Multiple series
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2230776/c9f44ef3-7dab-3693-b0e7-dfa6c33626a9.png)

```
<%= line_chart @goals.map { |goal|
    {name: goal.name, data: goal.feats.group_by_week(:created_at).count}
} %>
```

もしくは

```
<%= line_chart Feat.group(:goal_id).group_by_week(:created_at).count %>
```


# 最後に
次は様々なグラフオプションについての記事を書く予定なので是非楽しみにしていてください。
Raspberry Pi OSから「pi」ユーザが削除されてた

# 結論
2022年4月リリース版から、デフォルトのユーザ名「pi」とパスワード「raspberry」が削除されるようになったようです。

https://japan.zdnet.com/article/35186110/

> Raspberry Pi OSの最新リリースでは、デフォルトのユーザー名「pi」が削除され、新たに書き込まれたRaspberry Pi OSイメージを初めてブートする際、新しいウィザードでユーザー名を作成する必要があるとLong氏は説明した。

https://www.raspberrypi.com/news/raspberry-pi-bullseye-update-april-2022/

# モニタ無しセットアップをするには
今までのバージョンであれば、
* OSをSDカードに書き込み
* bootディレクトリに`wpa_supplicant.conf`と`ssh`ファイルを配置
* 電源接続
* TeraTermなどから`raspberrypi.local`に接続
* ユーザ名「pi」パスワード「raspberry」でログインし、初期設定

という流れでしたが、最新リリースではRaspberry Pi Imagerにて設定しないとユーザがいない状態となり、SSHでのログインができません。
※HDMIを接続し、モニタでセットアップすることは可能です。
　モニタに接続すると、以下のような画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153639/b39d4697-5679-b94e-e4f3-13da8ebc1156.png)

モニタ無しセットアップをする場合は、
 1. Raspberry Pi Imagerを起動
 1. OS、ストレージを選択
 1. 右下に表示される「歯車アイコン」を選択
 ![Raspberry Pi Imager v1.7.2 2022_04_18 0_03_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153639/f0bf0613-6487-c644-aeec-207f14e9161d.png)
 1. 「ユーザ名とパスワードを設定する」の項目にチェックをし、ユーザ名とパスワードを設定
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153639/b044b5df-d7fa-8a97-4ac7-379e61500d47.png)
 以降は今までと同じ。

# 設定可能項目
Raspberry Pi Imagerにて以下項目の設定ができるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2153639/3dc3f849-ae4c-cd39-32be-b5dc5e61abf8.png)

* ホスト名
* SSH有効化（パスワード認証 or 公開鍵認証）
* ユーザ名とパスワード
* ロケール

# あとがき
今までは以下のサイトにて`wpa_supplicant.conf`と`ssh`ファイルを生成させていただいておりました。
https://mascii.github.io/wpa-supplicant-conf-tool/
【Docker】マウントの種類について

## はじめに
本記事はプログラミング初学者が学習を進めていて疑問に思った点について調べた結果を備忘録も兼ねてまとめたものです。  
そのため、記事の内容に誤りが含まれている可能性があります。ご容赦ください。  
間違いを見つけた方は、お手数ですが、ご指摘いただけますと幸いです。  

## マウントの種類について
マウントには以下の４つがあります。
- バインドマウント
- ボリューム
- tmpfsマウント
- 名前付きパイプ

中でもよく使用するのはバインドマウントとボリュームだと思います。

### バインドマウント
バインドマウントは、ホスト側のディレクトリやファイルがコンテナにマウントされます。
マウント時にホスト側の情報がそのまま反映され、マウント後にコンテナ内で変更があればホスト側に反映されます。

`docker-compose.yml`では以下のように記述することで設定できます。

```docker-compose.yml
version: '3.9'
services:
  app:
    build: .
# 以下バインドマウントのための記述
    volumes:
      - .:/myapp
```

上記のように記述することでホスト側の`docker-compose.yml`の配置されているディレクトリ以下のディレクトリやファイルがコンテナにマウントされます。

### ボリューム
ボリュームはDockerによって管理されてます。
ボリュームはバーチャルマシン上の/var/lib/docker/volumes/ボリューム名/_dataに保存されます。
よって、基本的にはホストマシンから参照することはできません。
ホスト側に同名のフォルダやファイルが存在していてもコンテナ側には変更が反映されません。

Dockerによって管理されているため、`docker volume ls`で一覧を表示できます。
また、`docker volume rm ボリューム名`で削除もできます。

ボリュームには匿名ボリュームと名前付きボリュームの２つがあります。
違いは任意のボリューム名を設定するかしないかです。
`docker-compose.yml`ではそれぞれ以下のように記述することで設定できます。
- 匿名ボリューム
```docker-compose.yml
version: '3.9'
services:
  app:
    build: .
# 以下匿名ボリュームのための記述
    volumes:
      - /myapp/node_modules
```

- 名前付きボリューム
```docker-compose.yml
version: '3.9'
services:
  app:
    build: .
# 以下名前付きボリュームのための記述
    volumes:
      - node_modules:/myapp/node_modules
volumes:
  mode_modules:
```

### ２つを同時に使った際の優先順位
バインドマウントとボリュームを同時に設定した際にはボリュームが優先されます。
例えば`docker-compose.yml`を以下のように記述します。

```docker-compose.yml
version: '3.9'
services:
  app:
    build: .
    volumes:
      - .:/myapp
      - node_modules:/myapp/node_modules
volumes:
  mode_modules:
```

名前付きボリュームの方が優先されるため、`node_modules`はバインドマウントではなく、ボリュームで管理されます。
睡眠不足解消のためにsystemd-timerで寝ましょうのメロディーを鳴らす

**(※)この記事は普段からLinuxデスクトップを使っている人を対象に書いています。Windowsの人はタスクスケジューラかなにかを使うといいと思います**

# 寝ましょう。パソコンを消しましょう。
夜更かしはよくありません。みなさん、早く寝ましょう。

[厚労省資料](https://www.e-healthnet.mhlw.go.jp/information/heart/k-01-001.html)より引用します。

> 現代生活はシフトワークや長時間通勤・受験勉強・インターネットやゲームをしての夜型生活など、睡眠不足や睡眠障害の危険で一杯です。睡眠不足による産業事故、慢性不眠によるうつ病や生活習慣病の悪化など、睡眠問題を放置すると日中の心身の調子にも支障をもたらします。

また、[健康づくりのための睡眠指針 2014 ～ 睡眠12箇条 ～ に基づいた保健指導ハンドブック, 尾崎章子 （東北大学），巽あさみ (浜松医科大学）](http://www.zaitaku.med.tohoku.ac.jp/about/images/suimin-handbook.pdf)にも、睡眠の意義や不眠の悪影響がわかりやすくまとめられています。

短時間睡眠が知覚・思考・記憶機能のような認知機能に悪影響を与えることは[瀬尾 明彦, 砂川 久弥, 土井 幸輝, 鈴木 哲, 睡眠時間が翌日終日の認知・運動機能に与える影響, ITヘルスケア誌, 2008, 3 巻, 2 号, p. 96-105](https://www.jstage.jst.go.jp/article/ithc/3/2/3_2_96/_pdf/-char/ja)でも示されています。

# 時報を鳴らす
とはいえ、なんか知らんけど、パソコン着けてたら、いつの間にか日付変わってるじゃないですか。そこで思いついたのが、アラームを鳴らすことでした。

# 最近はsystemdでタイマーが使える
Linuxでタイマーといえばcronが有名です。私もcronでタイマーを設定するものだと思っていたのですが、私の使っているArch Linuxではcronはデフォルトではインストールされておらず、代わりにタイマーにはsystemdを使うようです。

最近のLinuxであれば、systemdはインストールされているでしょう。なので、本記事ではsystemdでタイマーを設定します。

## え、systemd使うって、じゃあrootでタイマー設定するの?
いいえ、一般のユーザ権限でも
`systemctl --user ...`
のように設定できます。

# 設定を行う
では、やっていきましょう。

## 鳴らす音楽を置く
なんでもいいのですが、クラシックを無償で公開してくださっている方の音源をダウンロードしてくるのがいいかなと思います。長すぎないものがいいです。

どこのディレクトリに置いても基本的には問題ないですが、私は
`~/.local/share/sounds`
に置きました。

## 音楽を鳴らすserviceを作る
`~/.config/systemd/user`
に、拡張子が`.service`のファイルを以下のように作ります。ここでは例として、ファイル名を `sleep-timer.service` とします。

```sleep-timer.service
[Unit]
Description=daily sleep reminder
RefuseManualStart=no
RefuseManualStop=no

[Service]
Type=oneshot
ExecStart=/usr/bin/mpv --no-terminal -vo=null 鳴らしたい音楽ファイルへのパス
```

音楽プレイヤーは、なんでもいいんですが、私はmpvを使っています。

### 動作確認をする
`systemctl --user daemon-reload`
をしてから
`systemctl --user start sleep-timer.service`
をすると音が鳴るはずです。止めたかったらCtrl-Cをして
`systemctl --user stop sleep-timer.service`
としたら止まるはずです。

## タイマーのファイルを作る
`~/.config/systemd/user`
に、拡張子が`.timer`のファイルを以下のように作ります。ここでは例として、ファイル名を `sleep-timer.timer` とします。

```:sleep-timer.timer
[Unit]
Description=daily sleep reminder
RefuseManualStart=no
RefuseManualStop=no

[Timer]
Persistent=false
OnCalendar=*-*-* 0:00:00

[Install]
WantedBy=timers.target
```

毎日 0:00:00 にタイマーを作動させる、という意味です。
(まったくちょうどには鳴りません。そこは当てにしないでください)

## タイマーを有効にする
`systemctl --user daemon-reload`
`systemctl --user enable sleep-timer.timer`
`systemctl --user start sleep-timer.timer`
でタイマーが有効になります。

`systemctl --user list-timers`
によって、登録されているタイマーの一覧が表示されます。

# 結果
0時に鳴っても寝なかったので、1時と2時にも鳴らすように設定しました。
ちょうど今、1時のメロディーが鳴っているので寝ます。おやすみなさい。

# 参考資料
https://wiki.archlinux.jp/index.php/Systemd/%E3%82%BF%E3%82%A4%E3%83%9E%E3%83%BC
https://wiki.archlinux.jp/index.php/Cron
https://wiki.gentoo.org/wiki/Systemd#Timer_services
【AtCoder】 ARC139【参加記録】

# [A - Trailing Zeros](https://atcoder.jp/contests/arc139/tasks/arc139_a)

解けなかった。

一応、問題文に素直に従って以下のようなコードを書くことはできた。しかし、これではLTEになってしまう。

解説を読んでみて問題の中身を考察することの重要性を感じている。

```python
from sys import stdin

def ctz(x):
    if x % 2 == 1:
        return 0
    else:
        c = 0
        while x % 2 == 0:
            x = x >> 1
            c += 1
        return c

N = int(stdin.readline())
Ts = [int(i) for i in stdin.readline().split()]

i = 0
ans = 0

for t in Ts:
    i += 1
    while ctz(i) != t:
        print(f"{i=}\t{ctz(i)=}\t{t=}")
        i += 1
    ans = i

print(ans)
```


今回は以上。

ARCへのRated参戦はまだ早かったということが確認できた。今後は当分、ABCにのみ参加することにする。
【Ruby】あるメソッド内で別のメソッドを呼び出す時に意識すること

こんにちは。
早く駆け出したい @iloveomelette です。

突然ですが、みなさんはあるメソッド内から別のメソッドを呼び出したい時のインスタンスメソッドとクラスメソッドの使い分けはできますでしょうか。
恥ずかしい話ではありますが、私はあやふやでよく`NoMethodError`を出していました。

今回、勉強したことをここにアウトプットしていきますので、
私と同じく使い分けが曖昧な方はサラッとでも良いので、参考にしてくださると幸いです。

尚、ご指摘箇所がございましたら
ご教授いただけますと幸いです。

## 問題

いきなりですが、問題です。
以下の`Actress`クラスにある`yoshioka`メソッドはブロック内にある`arimura`メソッドを呼び出すことはできるでしょうか。

```ruby
class Actress
  def self.yoshioka
    arimura
  end

  def arimura
    puts 'Hello World!!'
  end
end

Actress.yoshioka
```

正解は...

```zsh
undefined local variable or method `arimura' for Actress:Class (NameError)
```

こうですね。エラーとなるのが正解です。
では、一見するとそのままいけそうなのに、このようにエラーが起きてしまうのでしょうか。

### そもそもメソッドの呼び出し方って？

そもそもメソッドを呼び出すときに必要なものはなんでしょうか。
そうですね。「**オブジェクト**」です。

```:メソッドの呼び出し方
オブジェクト.メソッド(引数1..)
```

オブジェクトは「レシーバ」とも呼ばれます。
これが通常メソッドを呼び出すときの方法です。

### インスタンスメソッドとクラスメソッド

今回登場してくるのが「**インスタンスメソッド**」と「**クラスメソッド**」です。
この両者の違いはなんでしょうか。
その名の通りなんですが、
- **インスタンスメソッド**：そのクラスのインスタンスに対して呼び出すことができるメソッド
- **クラスメソッド**：そのクラスに深く関係するもののインスタンスのデータ自体をどうこうするわけではない時に定義して呼び出すメソッド

```ruby:両者の違い
# これはインスタンスメソッドの場合
class Anime
  def takagi
    puts 'Hello'
  end
end

anime = Anime.new
anime.takagi
#=> Hello

# これはクラスメソッドの場合
class Anime
  def self.kitagawa
    puts 'Good night'
  end
end

Anime.kitagawa
#=> Good night
```

クラスの中で、シンプルにメソッドを定義すると「インスタンスメソッド」となります。
「クラスメソッド」を定義したい場合、方法の一つとしてメソッドの前に`self`をつけます。

### メソッド内で他のメソッドを呼び出したい

クラスの外で呼び出す時はわかったけど、クラス内のメソッドの中で他のメソッドを使いたい時はどうすれば...？

ここが厄介なところで、`self`は場所によって「インスタンス自身」にもなりうるし、「クラス自身」にもなりうる、ポケモンでいうところの「メタモン」みたいな子なんですね。

```ruby
# これはインスタンスメソッドの場合
class Anime
  def takagi
    # ここの'self'は「インスタンス自身」
  end

  def self.kitagawa
    # ここの'self'は「クラス自身」
  end
end
```

ということは先ほどの問題を再度見てみると

```ruby:再掲
class Actress
  def self.yoshioka
    arimura  # この中は「クラス自身」、'arimura'は「インスタンス自身」
  end

  def arimura
    puts 'Hello World!!'
  end
end

Actress.yoshioka
```

こうですね。`self`が表すオブジェクトの状態が異なっているので`NoMethodError`になってしまうんですね。
なので、`yoshioka`メソッドの中で`arimura`メソッドを呼び出すには以下のようにしないといけないですね。

```ruby:修正
class Actress
  def self.yoshioka
    arimura
  end

  def self.arimura
    puts 'Hello World!!'
  end
end

Actress.yoshioka
#=> Hello World!!

# または

class Actress
  class << self
    def yoshioka
      arimura
    end

    def arimura
      puts 'Hello World!!'
    end
  end
end

Actress.yoshioka
#=> Hello World!!
```

`class << self ~ end`は複数のクラスメソッドを定義する際はメソッド前の`self`を省略できるので便利ですね。

お疲れ様でした！
こうした少しの違いでエラーが起きてしまうので、しっかり概念を理解することが大切であると改めて感じました。
これからも精進していきます。

最後までお読みいただきありがとうございます。

## 参考
- [メソッドの呼び出しエラーで学ぶRubyのインスタンスメソッド・クラスメソッド](https://ysk-pro.hatenablog.com/entry/method-error)
- [プロを目指す人のためのRuby入門［改訂2版］ 言語仕様からテスト駆動開発・デバッグ技法まで](https://gihyo.jp/book/2021/978-4-297-12437-3)
findコマンドでの大量のエラーメッセージを非表示にする（ルートから検索する時に便利）

# 概要
ペネトレ攻撃対象に侵入後のファイル探索にて、ルートディレクトリからfind検索した際に大量のパーミッションのエラーメッセージが表示されてしまう。
簡単なファイル構成のマシンならともかく、必要な情報が埋もれてしまうので、エラーメッセージを非表示としたい。

# 方法
答えは単純に、エラーメッセージを`/dev/null`に飛ばす。
例えば、入手したいファイル名`flag.txt`が判明しており、探索をルートからを実施する場合は、以下のよう`find`を実行すれば良い。

```
$ find / -name flag.txt 2>/dev/null
```

# 参考

https://neos21.net/blog/2018/01/31-02.html#:~:text=find%20%2F%20-name%20HOGE%20といった形,null%20に飛ばせば良い%E3%80%82
PostmanからバイナリデータをPOSTする

最近APIのテストをする時によくPostmanを使っています。
FastAPIにバイナリデータをPOSTしようとして詰まったのでメモっておきます。

## TL;DR
Postmanからバイナリを送信するときはbinaryではなくform-dataを使いましょう。

## 困ったこと
`http://localhost:8000/pool/`でPOSTを受信するプログラムを作っていました。
```ruby:main.py
...
@app.post("/pool/")
async def receiveBinary(file: UploadFile = File(...), authorization: str = Header(None)):
    BearerCheck(authorization)
    return {"filename": file.filename}
```
PostmanでPOSTのチェックをしたところ
422 Unprocessable Entity `"failed required" "value_error.missing"`と怒られてしまいました。
![image1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222271/133f29a0-a575-369a-40df-26ea339463d9.jpeg)

## 解決
色々と調べて[ここ](https://stackoverflow.com/questions/62798421/how-to-send-file-to-fastapi-endpoint-using-postman)を見ていたらform-dataで送信してるではありませんか。
なんとなく`binary`という項目があったので使っていましたが、考えてみれば実装時はform-dataで送りますもんね。

from-dataで改めて送信したところしっかりレスポンス200を受け取れれました。
なんとなくFastAPIが悪いと思って遠回りしてしまいました。
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/222271/f52a0a7a-d8b8-2cb1-b0f9-d9140e71686b.jpeg)


たぶんPostmanでbinaryを選択して送信した際にbodyヘッダを付けて送信していたからFastAPI側で受け取れなかったのではないか…と解釈しています。


https://stackoverflow.com/questions/71488533/fastapi-postman-error-422-processable-entity
https://stackoverflow.com/questions/62798421/how-to-send-file-to-fastapi-endpoint-using-postman
https://www.reddit.com/r/FastAPI/comments/pxupra/msg_field_required_type_value_errormissing_error/
プロデルでWordの図形を制御する

[前回](https://qiita.com/shukvaal/items/27b8afab2f89b15d6f5a)の続きです。キャンバスに描画した熱型表を印刷するところまで来ましたが、プロデルの印刷する手順では96dpi相当のイメージとして印刷されるようです。そこで、描画したものを一旦画像ファイルに保存し、Microsoft Wordに貼り付けて印刷することにしました。

## ワード図形のサンプル
情報が少ないので、ワード図形の[マニュアル](https://docs.utopiat.net/rdr/manual/office/wordshape.htm)にあるサンプルをもとにします。
```:ワード図形サンプル
ワードを起動する
ワードへ文章を作成してDとする
Dに「イラスト.jpg」を画像として追加してPとする
Pの大きさは、{300,300}
```
これを実行すると画像ファイルをワード文書に貼り付けられるのですが、注意すべき点として
- 3行目の画像ファイルはフルパスで指定する。Shapes.AddPicture メソッドの仕様らしく、実行しているプロデルファイルと同一フォルダにあってもエラーとなります。
- 4行目の大きさの指定を省略すると、貼り付けが実行されません。というか、大きさの初期値が{0,0}なのかもしれません。

## サンプルに手を加える
熱型表は横向きで1枚ずつ印刷しますので、印刷の向きを横、余白を適宜設定した.docxファイルを作っておき、それに貼り付けていくことにします。作業フォルダは、D:\tempとし、D:\temp\outputフォルダには、output0001.png, output0002.png...という作成済みの画像があるものとします。連続してこれら画像を貼り付けるため、サンプルに手を加えます。
~~~ :用紙横向きで画像の貼り付け
ワードを起動する
ワードで「D:\temp\output.docx」を開いてDとする
10回値にカウントしながら繰り返す
Dに「D:\temp\output\output[値を4桁に整えたもの].png」を画像として追加して対象とする
対象の大きさは、{300,300}
繰り返し終わり
ワードを「[デスクトップ]テスト.docx」に保存する
~~~

既存の.docxファイルを開く際もフルパス指定にするようです。これを実行すると、最後のoutput0010.pngだけ貼り付けられた結果となります。画像は「文字列の折り返し」が「前面」で貼り付けられるので選択状態となっています。ここに次の画像を貼り付けるとそれと入れ代わってしまうので、画像貼り付けの「上書き」を繰り返すことになります。

## 元実体を使う
貼り付けの度にワード選択範囲をうまく設定して、図形のアンカー位置を変えていけば「上書き」を回避できそうですが、そもそも「文字列の折り返し」を「行内」に設定できれば済む話です。プロデルの設定項目や手順にはないので、Shapeオブジェクトのメソッドを使うことにします(https://koukimra.com/archives/2020)。
ワード図形の元実体が貼り付けた画像のShapeオブジェクトとなり、VBAやPowershellのようにアクセスできますが、記法が異なります。Sを画像のShapeオブジェクトとして、ConvertToInlineShapeメソッドで行内に設定するには、
~~~ :VBA, Powershell
S.ConvertToInlineShape
~~~
~~~ :プロデル
Sは、出力画像の元実体
S:ConvertToInlineShape()
~~~
となります。以下はこれを追加したものです。

~~~ :元実体からメソッドにアクセス
ワードを起動する
ワードで「D:\temp\output.docx」を開いてDとする
10回値にカウントしながら繰り返す
Dに「D:\temp\output\output[値を4桁に整えたもの].png」を画像として追加して対象とする
対象の大きさは、{300,300}
対象の元実体:ConvertToInlineShape()
繰り返し終わり
ワードを「[デスクトップ]テスト.docx」に保存する
~~~
画像の大きさを適宜調整することで1頁に熱型表1枚でレイアウトできます。
Laravel 8.x アクセサ / ミューテタ / キャスト

初学者ですので、間違っていたら厳しめに教えてください

# はじめに
Laravelの機能「アクセサ」「ミューテタ」「キャスト」についてです。
これらの機能の共通点は、Eloquentモデルインスタンスのプロパティ設定に関わるというところです。

# アクセサ / Accessors
アクセサは定義したプロパティに**アクセスする際に**、定義した形で返してくれる機能です。
Eloquentモデルに新たなプロパティを作成するイメージです。
実際に作成するわけではありませんが、作成したかのように振舞ってくれます。

## 定義方法
モデルクラスの中で宣言します。
まず、モデルクラスの中に get〇〇Attribute メソッドを追加し、returnでどういった値を返すか記述します。
「〇〇」の部分は、定義したいプロパティ名を **キャメルケース** で書きます。

※Laravel9.x から定義方法が若干変わってるっぽい。これはLaravel 8.xです。
```php
class User extends Model
{
    public function getNameWithAgeAttribute() // name_with_ageプロパティを定義したい。
    {
        return $this->name."(".$this->age.")";
    }
}
```
例えば上記のように宣言すると、
```php
$user = User::Find(1);
$user->name_with_age // YamadaTarou(20)　みたいな感じで出力される
```
このようにして、**スネークケース**で本来のプロパティのように呼び出すと使えます。

## 既存のプロパティを変換
既にあるNameプロパティを別の形で出力したい場合、
```php
class User extends Model
{
    public function getNameAttribute($value) // 引数に$value
    {
        return ucFirst($value);
    }
}
```
と記述すると、そのプロパティを呼び出す際に変換されて出力されるようになります。
DBには、**変換された値は保存されません**。これはミューテタと違う部分です。

# ミューテタ / Mutators
ミューテタは定義したプロパティを **設定する（記録する）** 際に、定義した形に変換してくれる機能です。
アクセサはアクセスする際でしたが、ミューテタの場合は記録する際に変換してくれます。

## 定義方法
アクセサと大差ありませんが、set〇〇Attributeメソッドをモデルクラスに記述することで定義できます。
※Laravel9.x から定義方法が若干変わってるっぽい。これはLaravel 8.xです。
```php
class User extends Model
{
    public function setNameAttribute($value)
    {
        $this->attributes['name'] = strtoupper($value);
    }
}
```
これは変換した値を、Eloquentモデルインスタンス内のattributes配列を、上書きしているイメージです。
これを定義した状態で、Nameプロパティをセットすると、大文字に変換されて**DBに記録されます**。

こういったことも可能です。
```php
class User extends Model
{
    public function setAllValuesAttribute(Array $value)
    {
        $this->attributes['name'] = $value[0];
        $this->attributes['age'] = $value[1];
    }
}
```
これは配列を$user->all_valuesにセットすれば、一度に値を記録することが可能になります。


# キャスト / Attribute Casting
キャストは型変換程度であれば、アクセサやミューテタを使ってメソッドを定義しなくても、変換できる機能です。

## 定義方法
モデルクラスでcastsプロパティを定義することでできます。
プロパティ名と、キャストする型を宣言します。
```php
class User extends Model
{
    protected $casts = [
        'is_active' => 'boolean',
    ];
}
```
どの型が指定できるかは、[ドキュメント](https://readouble.com/laravel/8.x/ja/eloquent-mutators.html#attribute-casting)を参照してください。

# 参考
・[日本語ドキュメント](https://readouble.com/laravel/8.x/ja/eloquent-mutators.html)
・[Laravel 実践開発 - 掌田津耶乃・著](https://www.amazon.co.jp/PHP%E3%83%95%E3%83%AC%E3%83%BC%E3%83%A0%E3%83%AF%E3%83%BC%E3%82%AF-Laravel%E5%AE%9F%E8%B7%B5%E9%96%8B%E7%99%BA-%E6%8E%8C%E7%94%B0-%E6%B4%A5%E8%80%B6%E4%B9%83/dp/4798059072)
2022/2/28『惑星間ファイルシステムをElixirで作っちゃった人のお話』かいつまみメモ

この記事は[@piacerex](https://qiita.com/piacerex)さんの[[翻訳] ①Web3＋DID＋エッジコンピューティング Brooklyn Zelenka and The Exciting World of Edge Computing](https://qiita.com/piacerex/items/aa02310e9e5edcc26896)の2022/2/28に配信された解説動画、
[[11:25～] 惑星間ファイルシステムをElixirで作っちゃった人のお話](https://www.youtube.com/watch?v=kDqiufCUYl8&t=1486s)で出てきたキーワードをまとめた復習メモです。

![スクリーンショット 2022-04-25 14.17.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109744/46a78fa1-ca8b-bd07-78ac-a51df5a7f168.png)
[@piacerex](https://qiita.com/piacerex)さんはNeosVRから配信しています:santa:

## キーワード

### Podcastに出演している方々や企業

* Elixir Wizards Podcast
  - https://smartlogic.io/podcast/elixir-wizards/
  - ボルチモアを拠点とする独自Web／モバイルを開発する企業であるSmartLogicが配信するpodcast。
* Alex Housand(AH)
  - Elixir wizardsのホスト。
* Dan Ivovich(DI)
  - Elixir wizardsの共同ホスト。
* Brooklyn Zelenka（ブルックリンゼレンカさん）
  - Fission社の共同設立者でCTO。
  - DIFや惑星間ファイルシステムの活動にコミットしている。
  - パンデミック中はテパチェ（訳注：微発泡の爽やかな味わいの発酵した飲み物）を作ったり、サワードウトレイン（訳注：サワードウというパン種を使ったパン作りの流行に乗ること）に乗ったりしたそう。
* Fission（フィジョン）
  - https://fission.codes/
  - Web技術、エッジアプリケーション、ホットデータ（訳注：即座にロードされ、利用可能なデータ。反対のコールドデータはロードに時間がかかり、即座には使えない）に焦点を当てた応用研究企業。
  - 投資家やVCからベンチャーとして資金提供を受け、研究をしている会社。

### 専門用語

* エッジコンピューティング
  - 地方にあるサーバなどのリソースも有効活用できるようになる可能性がある。
* 惑星間ファイルシステム
  - イーロン・マスクやジェフ・ベゾスといった方々が宇宙に飛ばしていったり、宇宙とやり取りをしようとしている（すでにできている）が、衛星間の通信（惑星と惑星、例えば地球と月）での通信が必要になってくる。
  - データのアップロードやダウンロードといった通信をひつとのファイルデータの通信に見立てたものを惑星間ファイルシステムという。（かなりざっくりした説明）
* DID
  - Decentralized Identifierの略。
  - Centralizedは中央集権や一箇所に集中して管理する意味合いがあるが、Decentralizedは一社にとらわれない、一箇所にとらわれないという意味合いがある。
  - Centralized、Decentralizedについての説明は[こちら](https://qiita.com/piacerex/items/74c102453cf390058c22)を参照。
  - 例えばGmailはGoogleに認証が集約されているが、DIDはバラバラの箇所で同じように認証ができる仕組み。
  - DIDはWeb3.0の中心的な仕組み。
* DIDファウンデーション（略称：DIF）
  - https://identity.foundation/
  - DIDの規格を決めるところ。どういうプロトコルであったり、どういう仕様にしようか決める団体。
  - DIDでどういう認証をしたり、ディスカバリー（IDを探したり）する仕組みにするか、等の仕様を決めている。
  - 仕様を決める主なメンバーはMictosoftやAccentureなどユーザーにアカウントサービスを提供する企業や、Auth0やNuID、Validated IDといったIDのメカニズムやエンジンを提供する企業も名乗りを上げている。
* ホットデータ
  - コールドデータ（コールドストレージとも呼ばれることも）の反対だと分かりやすい。コールドデータはロードに時間がかかってすぐに使えない。
  - GCPだとGCS、AWSはS3などはホットデータ。ごくごく普通のファイルストレージで使えるファイルシステムはホットデータと捉えると大丈夫。
  - いつでもアクセスできるようにしている状態にしておくと電力的に不利だったり、そもそも常時アクセスする必要がないデータ、読み取りに時間がかかっても良いデータはコールドデータとして扱うほうがよい場合も。

### 翻訳記事中に出てきた独特の言い回し

* 「データは固定されず動き回っている」とは？
  - ホットストレージ（たとえばAWS S3など）はファイルを置いた後は置きっぱなしになるが、Decentralizedだった場合よく使う人達の多い付近にファイルが移動、よく使う人達は高速アクセスできるようになり、そうでもない人達は低速になったり。とたえばジャパンリージョンでよく使う人達がいればよりジャパンリージョンに近い場所にファイルが移動する。
  - 今までは私達がリージョンを指定してファイルを設置しるが、アクセス傾向から自動的にファイルが移動することを意味する。よく使うリージョンだけファイルが置かれ、使われないリージョンからはファイルキャッシュが消え、遠くのものを使うようになる、という意味合いも含まれる。
 
## 感想

Web2.0の世界で生きている私にはピンとこないことがまだまだ多く、身近ではない用語に振り回されています。
これから理解が進んでいくことで自分の思考が変わっていくのが楽しみでもあります。
案件に入るたびに自分のExcelに設定するマクロ

## １.はじめに
Windowsを使う案件に参加するとほぼほぼExcelにお世話になることが多いだけでなく、大体同じような設定しかしないので備忘目的で記載。
※Macを使用する案件ではExcelでマクロがうまく動かないことが多いので今回は対象外。

## ２．個人用マクロで設定するもの
「個人用マクロ」とはざっくりいうと、Excelが起動するたびに起動するマクロ。
ここには汎用的に使えるマクロを置いておくと便利。
作成方法は[こちら参照](https://vbabeginner.net/how-to-create-a-personal-macro-book/)
### ２-１赤文字マクロ
選択したセルの文字の色を赤文字にするマクロ。
既に赤文字だった場合も黒文字に戻す。
Excelで**太字**を使う感覚で使用できる。
```VB
Sub setRed()
    If Selection.Font.Color = RGB(255, 0, 0) Then
        Selection.Font.Color = RGB(0, 0, 0)
    Else
        Selection.Font.Color = RGB(255, 0, 0)
    End If
End Sub
```

### ２-２四角
現在選択中のセルにExcelのオブジェクトの四角を選択したセルに表示させるだけのマクロ
Excelでキャプチャ貼ったりする際に分かりやすくするのに使用。
```VB
Sub setSquare()
    Dim iRow As Integer
    Dim iColumn As Integer
    
    ActiveSheet.Shapes.AddShape(msoShapeRectangle, ActiveCell.Left, ActiveCell.Top, 310, 109).Select 
    '↑の引数は、四角、セルの右方向の位置、下方向の位置、横幅、高さの順番
    Selection.ShapeRange.Fill.Visible = msoFalse
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)'線の色、このままだと赤になる
        .Transparency = 0
        .Visible = msoTrue
        .Weight = 3
    End With
End Sub
```

上を実行するとこんな感じで長方形が出力される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/89346e89-68d8-cb66-100c-07da9d1d26d8.png)

### ２-３吹き出し
現在選択中のセルにExcelのオブジェクトの四角を選択したセルに表示させるだけのマクロ
Excelでキャプチャ貼ったりする際、コメントを横に添えたりするのに使用。
```VB
Sub setBalloon()
    ActiveSheet.Shapes.AddShape(msoShapeRectangularCallout, ActiveCell.Left, ActiveCell.Top, 300, 80). _
    '↑の引数は、吹き出し、セルの右方向の位置、下方向の位置、横幅、高さの順番
        Select
    With Selection.ShapeRange.TextFrame.Characters
        .Text = ""　'吹き出しの中に入れるテキスト、設定はお好みで。
        .Font.Size = 12
        .Font.Color = RGB(0, 0, 0)'吹き出しの中に入れるテキストの色、
    End With
    
    Selection.ShapeRange.Adjustments.Item(1) = -0.68323
    Selection.ShapeRange.Adjustments.Item(2) = 0.32813
    With Selection.ShapeRange.Fill
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 255, 255) '吹き出しの中の背景
        .Transparency = 0
        .Solid
    End With
    With Selection.ShapeRange.Line
        .Visible = msoTrue
        .ForeColor.RGB = RGB(255, 0, 0)'吹き出しの線の色
        .Transparency = 0
        .Weight = 3
    End With
End Sub
```
上を実行するとこんな感じで長方形が出力される。
選択した状態でスペースキーを押すと、そのまま入力することもできる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/22740984-d534-e802-cfb9-9ff67588fdf6.png)

### ３．ショートカットの設定
この手のマクロはショートカットを設定して初めて機能することが多いので、独自にショートカットを作成する。
「開発->マクロ->オプション」で設定できるので独自で設定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2640942/be43c9a4-422b-cec9-3cd3-b0e5d8b2138a.png)

### ４．おわりに
以上が案件に入るたびに設定しているマクロでした。
常にどのExcel開いても使えるとなると、凝ったものというより小回りが利くようなものしか置けないと思う。
他にも効率的なマクロはあるとは思うので、何かあれば随時更新予定。
Androidアプリを開発する #1

# はじめに
今回から本格的に中身の機能を作っていきます
下準備編はこちらから

https://qiita.com/sekkenn1102/items/eb0bc3646036b0ad9d36

## 作成するアプリに関して
* #0の時にもほんの少し触れましたが、今回から「汎用性の高そうなスケジュール・タスク管理アプリ」を目指していきます
目指すにあたって最低限必要のは以下の3機能だと思っています
    * スケジュール／タスクを登録する画面
    * 登録したスケジュール／タスクを表示させる画面
    * そもそも登録データを保存するためのDB

* 想定としてはかなりざっくりしていますがこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/9a953895-3368-c7b4-2de8-bca2c7bf4aae.png)


* まずはスケジュール／タスクを登録する画面から手を付けていきます


# スケジュール／タスクを登録する画面を作成する
* 登録画面に必要な項目としては以下を想定しています
    * タスク／スケジュール本文
    * 日時
    * 優先度
    * 備考
    * 登録ボタン
    * 画面遷移（一覧へ）ボタン

* 日時はスケジュールのみだろとか、優先度はタスクだけだろなどの細かい仕様は後でつめていきます
では画面を作っていきます

* app/res/layout フォルダの中に「activity_main.xml」というファイルがデフォルトで入っています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/10815a38-1029-9580-c048-36d91abbfeb3.png)


* #0でなにも触っていないアプリを起動させたときに表示された画面がこれです
このままGUIベースだけで画面を作っていくこともできますが、右上の「code split design」の３種類のボタンで表示を変更できます
codeを選択するとこんな感じ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/9747a93b-5c96-8b91-8d36-1b73760db34a.png)


* まずはデザインの作成なので、このままGUIベースで画面を作っていきます
出来上がったデザインがこちら

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/faa6c139-e7c7-0a4e-8bbf-a37234a03376.png)

* 基本的にはスクショ左側のpaletteから必要なものをドラッグ＆ドロップでもってきて、幅とか高さを調整しただけです
ただし、備考欄を作成した際に少し詰まったので以下の記事を参考にして、直接XMLを触っている部分もあります

* 備考欄の幅を広げる

https://sooch.hatenablog.com/entry/2016/01/12/032212

* 文字を左上に寄せる

https://tech.mokelab.com/android/view/textview/gravity.html

また、htmlなどでplaceholderに当たるものはAndroid studioではhintとなっていたので探すのに少し手間取りました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/2ca7b14c-5bdf-7175-b122-2bbc25452ccc.png)


# おわりに
* 実際にスマホで表示させたものがこちら

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1700794/a6cae77a-0d55-3882-449a-93229a18f84a.jpeg" width="393">

* 若干端まで表示させすぎている感と、下のボタンが真ん中じゃない感じがありますが、細かなレイアウトは今後修正していくこととします

* また、#0を見ていただいた方はわかるかもしれませんが、画面の雰囲気も前回からがらっと変わっているとおもいます
前回からテスト端末を変更したのが原因だと思われますが、端末ごとにいろいろそこまで変わっては問題なのでそのあたりの調査も必要になってくると思います…

とはいえ今後はこの画面を正として進めていければと思います
※参考までに#0で使用していたテスト端末は「Google Pixcel 5a」、#1以降では「Huawei p30 Lite」を使用していきます

それではまた次回


# その他参考文献
* UIの作成方法


https://developer.android.com/training/basics/firstapp/building-ui?hl=ja

* textareaの作り方

https://techacademy.jp/magazine/3452
ApacheとTomcatの連携

## はじめに
ApacheとTomcatの連携について、検証しました。

動作環境
・Apache 2.4
・Tomcat 9.0

## 連携の目的
　　静的コンテンツはApacheで処理し、動的コンテンツはTomcatで処理すると性能が良い
　リクエストを httpd で処理し、Java で動的な処理が必要なページだけTomcat に実行させる。この時、Apache httpd はプロキシの役割となる。
　ApacheとTomcatを同一サーバにするか、別サーバにするかはシステム要件による。
　連携時はAJP (Apache JServ Protocol)を利用する。
　AJP プロトコルは Tomcat と通信するためのプロトコル。

・イメージ
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1308027/390a9742-3840-de84-9939-8c631bad1ba3.png)

## 設定方法

設定概要
１．	Apacheの設定。Tomcatにリレーする設定を行う
２．	Tomcatの設定。Apacheから受け取る設定を行う

### Apacheの設定

Httpd.confの修正をします。

１．以下２つのモジュールを有効にする

```
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
```

2.プロキシを追記します。
　設定する値
　ポート番号：ここでは8009ポート利用とする
　ディレクトリ：Tomcatのディレクトリを指定します。
　パスワード：ここではYOUR_PASSWORDとします。

　※設定例
```
<Location /sample/>
    ProxyPass ajp://localhost:8009/sample/ secret=YOUR_PASSWORD
</Location>
```

### Tomcatの設定
server.xmlの修正をします。

1.	8080を停止する。利用しないなら、セキュリティ上停止したほうがよい
設定例

```
<!--
<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />
-->
```

2. 8009ポートを有効にする。

　・adress：接続元サーバ。同一サーバなら「127.0.0.1」など
　・port：待ち受けポート番号。Apacheと合わせる
　・redirectPort：処理するポート番号
　・secret：パスワード。Apacheと合わせる。

　※パスワードを使用しない場合は「secret」を削除し「secretRequired="false"」にすると無効になります。

　設定例
```
<Connector protocol="AJP/1.3"
	       address="127.0.0.1"
           port="8009"
           redirectPort="8443"
           secret="YOUR_PASSWORD"/>
```            
※以下はパスワードを使用しない場合。
 secretRequiredをfalseにすると無効になります。
<Connector protocol="AJP/1.3"
           address="127.0.0.1"　
           port="8009"
           redirectPort="8443"
           secretRequired="false" />　

###その他
　利用できるコネクタタグは多数あります。必要に応じ設定します。
　https://gakumon.tech/tomcat/server_xml/http.html

###参考サイト
https://qiita.com/polarbear08/items/f016a0675e6c9637e7b8
https://ashitaka.hateblo.jp/entry/2020/08/16/103012
【１２日目】React使用しメモアプリを作成１ [monaca]

## はじめに
今回はReactを使用してメモアプリを作成します。ただReactの知識も乏しいところからスタートするので少しずつの更新になります。今回は少しでも使い方に慣れていくように基本的な操作を練習していきます。

## プログラム
今回組んだプログラムは以下の通りです。順を追って説明していきます。
```javascript
import React from 'react';
import ReactDOM from 'react-dom';
import { Card } from 'react-onsenui';
import { Toolbar, Page, Button } from 'react-onsenui';
import { useState } from 'react/cjs/react.production.min';

import SecondPage from './SecondPage'

let middle;

const handleChange = (e) => {
  console.log(e.target.value);
  middle = e.target.value;
}

const MemoItem = (props) => {
  console.log(props.text);
  return (
    <Card>
      <div>メモの内容:{props.text}</div>
      <div>{props.long}</div>
    </Card>
  );
}

export default class MainPage extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      items: [{memo: "hello"},
              {memo: "good bye"},
              {memo: "thank you"}]
    };
  }

  saveMemo() {
    console.log('10');
    alert(middle);
  
  }

  pushPage() {
    this.props.navigator.pushPage({ component: SecondPage });
  }

  renderToolbar() {
    return (
      <Toolbar>
        <div className="center">Navigator</div>
      </Toolbar>
    );
  }

  render() {
    console.log('aaa');
    return (
      <Page renderToolbar={this.renderToolbar}>
        <input onChange={handleChange} type="text"/>
        <Button onClick={this.saveMemo.bind()}></Button>
        
        <p style={{ textAlign: 'center' }}>
          <Button onClick={this.pushPage.bind(this)}>次ページ</Button>
        </p>
        {
          this.state.items.map(item =>
            <MemoItem text={item.memo} long={this.state.items.length} />)
        }
      </Page>
    );
  }
}
```
ちなみに今回はmonacaのNavigationテンプレートをもとに作成しました。

### mapで配列表示
配列を一括で表示する際にはmapを使用します。
```javascript
this.state = {
      items: [{memo: "hello"},
              {memo: "good bye"},
              {memo: "thank you"}]
    };
```
```javascript
 {
   this.state.items.map(item =>
     <MemoItem text={item.memo} long={this.state.items.length} />)
 }
```
items配列のすべてを表示したいのでmapを使用し、表示として一回ずつMemoItemを呼び出します。
```javascript
const MemoItem = (props) => {
  console.log(props.text);
  return (
    <Card>
      <div>メモの内容:{props.text}</div>
      <div>{props.long}</div>
    </Card>
  );
}
```
MemoItemでは引数全体を表す`props`からメモ内容などを受け取り表示させます。Cardを使うとよりそれっぽくなります。
![めも２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584729/d0b8f195-9296-5b08-ec02-0c4f1d79d9eb.png)

### 入力
文字の入力には共通してinputを使いますが、入力フォームに何か変化があったときに呼び出されるhandleChangeを使用し、呼び出されるたびに変数middleに文字を入れ込みます。middleは後で配列に追加するために使用します。
```html
<input onChange={handleChange} type="text"/>
```
```javascript
let middle;

const handleChange = (e) => {
  console.log(e.target.value);
  middle = e.target.value;
}
```
配列を追加するためにsaveMemo関数を作ります、今回はmiddleの確認のみ。
```javascript
saveMemo() {
  alert(middle);
}
```
![めも２あらーと.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2584729/171e69c1-c777-da5d-2868-6ab675275bfb.png)

---

次回からはmiddleからitems配列に追加をする処理やメモ内容をsupabaseに保存されるようにします。
開発合宿をやってみた

## 概要
せっかくGWなので、チーム開発をやってるメンバーで開発合宿とやらをやってみたので、
備忘録や反省・良かったことをまとめてみます。

## 今回の開発チーム
私が勉強でお世話になっているネイティブアプリ＋Webアプリの開発チーム（本業とは関係ありません）
今回の参加メンバーは自分を含めて4人です。
私は神奈川にいますが、他メンバーは関西で普段はリモートでやりとりしながら開発を進めてます。

## スケジュール
5/4(水)・5/5(木)
1日目は開発（作業）と内容の発表会、
2日目は懇親の時間として、浜松を観光することにしました。

## 開催地
静岡県浜松市
選定理由は浜名湖が綺麗そう＋うなぎが美味しそう、くらいのもんです。

## やってみた結論として
まず、やってみて良かったと思います。
何が良かった・何をした等はこれから記載していきます。

## 合宿でやったこと
### 1日目
今回は各メンバーが色々やってみたいことがあった＋メンバーの中で実装というより
サービス管理や機能要件を考えるメンバーがいたため、全員での開発は行いませんでした。
なので、各メンバーは以下の内容を自分で調べたり検証したりして発表を行うようにして進めました。

##### 私:テスト駆動開発を勉強
本を読みながら、手を動かしてやってみながら勉強しました。
テストはNuxt環境でJestを使ってました。

##### メンバー１ React Nativeを勉強
flutterアプリのリプレイスとWeb環境をReactにしてコードをできるだけ統一できないか検証してもらいました。

##### メンバー2 アプリ周りの座学と実装で勉強
普段サーバサイドのエンジニアとして業務されているので、アプリの知識を吸収するために
アプリ開発を勉強してもらいました。

##### メンバー3 次回展開するサービスの環境を検討
まだ未定ではありますが、次回作るサービスにどの言語・どの環境・どのサービスを使用すれば
保守性・セキュリティ性などの観点で良いかを検討してもらうべく、いろんなもの
調査・検討をしていただきました。

![](https://storage.googleapis.com/zenn-user-upload/1779767bae6b-20220507.jpg)
↑貸会議室で作業・勉強中・・

また、夜は宿の方でサービスについてやプライベートな話をも含めていろんなことを
話すことができました。

### 2日目
朝日を拝みました。
めちゃ早起きで眠かったですが、乙なもんでした。
![](https://storage.googleapis.com/zenn-user-upload/8b3d17c3332b-20220507.jpg)

朝から船を出していただき釣りをしましたが、何も釣れなかったです・・。
また、メンバーで経験者が多かったので、浜松湖でウェイクボードをやってみたりしました！
私はできなさすぎて筋肉痛になりすぎて死にそうでした。

また餃子を食べに行ったり、ドライブしたりなど本当に観光に全て振って時間を過ごしました。

## で、何が良かったのか
#### 積読（？）してたお勉強ができた
ひとつは普段業務に追われているとできない、積んでしまっているお勉強ができたことはまず良かったです。
#### いつもと違う環境でのリフレッシュ
加えて空気が綺麗な環境で作業できたので、いつものとは違う環境なのでより楽しめて集中して
作業ができたような気がします。
#### プロダクト強化
また普段は目の前の実装に目が行きがちですが、勉強や調査をすることで、今進めているチーム開発への取り込みも現実的になり、プロダクト強化も見えてきたのはかなり大きかったです。
#### コミュニケーション強化
これが一番大きかった気がします。
普段リモートでやりとりをして、そんな問題もなく進めている気がしてたんですが、やっぱり合宿として
寝食を共にしていると、チームメンバーのいろんなことが見えたり、公私問わずいろんな会話ができて
チームの結束力が高まった気がします。
（夜盛り上がって面白そうなアプリも作れそうだったりします）

以上がざっくり良かったなと思う点ですね。

## 反省点
#### ソロプレイだったこと
これは良い悪いのどちらの面もありますが、せっかくだったら全員参加でできることをメインでやれたら
良かったなぁと少し思います。
勉強中とかは各メンバーが質問や相談をしていて、完全に全員が分離してたわけではないですが、一緒のコンテンツでも良かったかなぁと思います。

#### 移動時間の見積もりが甘かったこと
GWを舐めてました。。クリティカルな遅延はなかったですが、渋滞に巻き込まれて時間を取られた＋大量を取られた感はありました。

他にも細々改善できそうなことはありますが、一旦このくらいです。

## 総括
結論でも書きましたが、合宿したことはかなり良かったと思ってます。
反省や改善点はありましたが、可能であれば年１とかでいいので定期開催したいなと思ってます。
ただ少しパワープレイなところもあるので、会社の後輩とかやるのは難しいかもしれないですね。
GitHub ActionsでPullRequestをトリガーに、SQLFluffでSQLを整形してみる

# この記事はなに？

PullRequestのオープン時にSQLを整形することで、可読性を上げレビューをしやすくしたり、SQLの書き方に対する負荷を軽減できると思い、GitHub ActionsでPullRequestのオープンをトリガーに、SQLのリントツールである[SQLFluff](https://www.sqlfluff.com/)を使って整形する処理を実装してみました。

※本記事では、GitHub Actionsの概念や仕組みの説明は省略させていただきます。

# 今回実装したファイル

``` yml:sqlfluff.yml
# 画面に表示されるワークフローの名前
name: SQLFluff

# .sql ファイルの変更を含む Pull Request の Opened もしくは Reopened をトリガーとする
on:
  pull_request: 
    types: [opened, reopened] 
    paths:
      - '**.sql'

# .sql ファイルを整形(変更)する権限を付与
permissions: write-all

jobs:
  format-sql:
    # ubuntu の最新版の環境で実行する
    runs-on: ubuntu-latest 
    steps:
      # 指定したバージョンの python をインストール
      - uses: 'actions/setup-python@v2' 
        with:
            python-version: '3.8'
      # SQLFluff をインストール
      - name: install SQLFluff
        run: 'pip install sqlfluff==0.13.1'
      # Github のホストランナーでは TTY が使えないため faketty をインストール
      - name: setup faketty
        uses: Yuri6037/Action-FakeTTY@v1.1
      # Pull Request のソースブランチにチェックアウト
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
          ref: ${{ github.head_ref }}
      # 変更が発生した .sql を対象にループ処理で SQLFluff を実行
      - name: format
        run: |
          for file in $(git diff origin/${GITHUB_BASE_REF}..origin/${GITHUB_HEAD_REF} --name-only --diff-filter=d -- '*.sql') 
          do
            faketty sqlfluff fix $file --rules L001,L002,L003,L004,L005,L006,L010,L011,L012,L017,L018,L019,L022,L023 --dialect bigquery -f
          done
      # 変更内容をコミット
      - name: commit
        uses: stefanzweifel/git-auto-commit-action@v3.0.0
        with:
          commit_message: run sqlfluff
```
【git】SSHのアクセス条件を指定 (push できなくなったときの対処)

# はじめに

git のアカウントの切り替えに失敗して、うまくgithub にpush できないときのメモです。

- .ssh/config
- git remote SSHの鍵を指定して定義する

ことで無事にpush できました。

# 内容

### 症状

休日も自宅で、自分の古いPCで仕事をしています。
作業が終わって、いざGithub にあげようとすると、

```
$ git push origin2 dev/multiprocessing2
ERROR: Repository not found.
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.
```

と言われてしまい、途方にくれていました。土曜日夜の１１時。はぁ。

と、この記事を見つけました。

https://stackoverflow.com/questions/7927750/specify-an-ssh-key-for-git-push-for-a-given-domain

言われる通りに行うと解決しました。

### 内容

```~/.ssh/config
Host host_def_ssh_config
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes
```

と鍵が定義されてあるとします。

```
$ git remote add origin2 git@host_def_ssh_config:officename/repository.git
```

こうしておいて

```
$ git push origin2 dev/multiprocessing2
```

で無事にpush できました。

# おわりに

前回も、アカウント切り替えで苦労したことを記事にしましたが、今回でもう解決してくれるとうれしいです。

https://qiita.com/XPT60/items/c5a81fdde862315f9912

WEBに集うエンジニアがオープンであることに、また感謝する一日でした。
(2022/05/14)