OmniAICreator/Qiita-1.07M huggingface dataset:
設計手法・開発手法について、読んだ本・読んでいる本のおぼえがき

# まえがき
6年ほど努めた某SIerを退職し、転職活動を始めました。
その裏で空いた時間もできるので、それを利用して設計手法・開発手法の勉強をしたいと考え、自分の中でいくつか気になった本を買って読み始めました。
読んだ本・読んでいる本について、思ったことを書いていきます。
(2022/12/26 追記・修正：途中だった本を読み終わったので、その内容について記載)

# ①リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック

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

タイトルの通り、「良いコード」を書くためのテクニックがたくさん書かれている本。
変数名・関数名をわかりやすく名付けるという、基礎中の基礎ながらおろそかにしがちな部分から、式・関数の分割といった後回しにしがちな部分まであり、「無関係の下位問題を抽出する」という目からウロコなテクニックもある。
あとがきを入れても231ページなので、個人的にコンパクトで読みやすいという感じ。

# ②良いコード/悪いコードで学ぶ設計入門 ―保守しやすい 成長し続けるコードの書き方

https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830/

いわゆる「ミノ駆動本」。
クラスベースで、運用保守がしやすい設計手法について書かれている(書籍内では「オブジェクト指向」と呼んでいるけれど、この呼び方が個人的に好きじゃない)。
自分はいわゆるクラスベースでの開発を全くしてこなかったので、書いてあることにたくさん驚いていたのだけれど、[こういう記事もあったので、](https://zenn.dev/339/articles/e3c174fdcc083e)他の本で更に知識をつけて、批判的にこの本を読んで理解できるようになったほうが良いみたい。
なので、内容には触れない。

# ③リファクタリング(第2版): 既存のコードを安全に改善する

https://www.amazon.co.jp/%E3%83%AA%E3%83%95%E3%82%A1%E3%82%AF%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0-%E7%AC%AC2%E7%89%88-%E6%97%A2%E5%AD%98%E3%81%AE%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E5%AE%89%E5%85%A8%E3%81%AB%E6%94%B9%E5%96%84%E3%81%99%E3%82%8B-OBJECT-TECHNOLOGY/dp/4274224546/

ミノ駆動本でおすすめされていたので購入。

※まだ読んでいる最中(第7章まで)。

読んで字の如し、リファクタリングについてのテクニックが書かれている。
またいわゆる「コードスメル」についての解説もあり、リファクタリングを進めて終わらせるまでの道のりについてある程度指し示しているように思えた。
最初の部分は、かなり基礎的なテクニック(カプセル化など)のみが書かれていたが、後半部分になると関数の移動やデータの再編成、クラスの継承や委譲の使用方法、サブクラスの扱い方まで書かれているため、いわゆるクラスベースでの開発におけるリファクタリング技法がいっぱい詰まった宝箱という感想。

# ④テスト駆動開発

https://www.amazon.co.jp/%E3%83%86%E3%82%B9%E3%83%88%E9%A7%86%E5%8B%95%E9%96%8B%E7%99%BA-Kent-Beck/dp/4274217884/

これまたミノ駆動本でおすすめされていたので購入。

これまた読んで字の如し、テスト駆動開発(TDD)について書かれている。
実際にシステムを作っていきながら開発手法について触れているので、かなり理解しやすい。

試しに、これを読みながらちょっとしたプログラムを作ってみたのだが、手癖でテストを省略しがちということに気づいた。
実践していくのにはかなり慣れが必要なのかもしれない。
ただ、じゃんじゃんテストを実行しながら増えていく「OK」の文字を見るのはかなり楽しかった。

第I部・第II部が実践編という感じで、第III部はTDDにおいて覚える必要のあるパターンが列挙されているという感じ。
巻末に第I部・第II部の「写経」を推薦していたので、それをやるためにもう一度この本を開いてみても良さそう。


# おわりに
まだまだ読むべき本はたくさんあるように思うので、もし「この本を読んだほうがいいんじゃないか」というのがあればコメントしていただければ助かります。
SpringBoot(Kotlin)でバリデーションがimportできずにエラーになる

# はじめに

書籍通りにやっていたのにうまくいかない箇所があったのでまとめます
多くの人がつまづきそうですが、わかりやすい記事が見つからなかったのでもしかしたらSpringBootのテンプレート作成の設定が足りていなかったのかもしれないです

# 問題

以下の書籍のコードでエラーが発生しました

https://www.amazon.co.jp/Kotlin-Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E6%96%B0%E3%81%97%E3%81%84%E3%82%B5%E3%83%BC%E3%83%90%E3%82%B5%E3%82%A4%E3%83%89%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%95%B7%E6%BE%A4-%E5%A4%AA%E9%83%8E/dp/4865940669/ref=sr_1_12?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=18CTLYX9QH0UZ&keywords=kotlin&qid=1670939345&sprefix=kotlin%2Caps%2C728&sr=8-12

```kotlin:TaskCreateForm.kt
package com.example.todolist

import org.hibernate.validator.constraints.NotBlank
import javax.validation.constraints.Size

class TaskCreateForm {

    @NotBlank
    @Size(max = 20)
    var content: String? = null
}
```

すると以下のエラーが発生しました

```
kotlin  | Starting a Gradle Daemon, 23 busy and 3 stopped Daemons could not be reused, use --status for details
kotlin  | > Task :processResources UP-TO-DATE
kotlin  | 
kotlin  | > Task :compileKotlin FAILED
kotlin  | e: /app/src/main/kotlin/com/example/todolist/TaskCreateForm.kt: (3, 12): Unresolved reference: hibernate
kotlin  | e: /app/src/main/kotlin/com/example/todolist/TaskCreateForm.kt: (4, 14): Unresolved reference: validation
kotlin  | e: /app/src/main/kotlin/com/example/todolist/TaskCreateForm.kt: (8, 6): Unresolved reference: NotBlank
kotlin  | e: /app/src/main/kotlin/com/example/todolist/TaskCreateForm.kt: (9, 6): Unresolved reference: Size
```

しっかりライブラリがインポートできていないようです

# 解決方法

`build.gradle.kts`に以下を追加したら動きました

```kotlin:build.gradle.kts
dependencies {
	implementation("javax.validation:validation-api:2.0.1.Final")
	implementation("org.springframework.boot:spring-boot-starter-validation")
```

何かを依存に追加すればいいか見つけるのに苦労しました
`validation-api`はバージョンをいれないとエラーになってしまうのでそこに時間を使いました

# おわりに

インポート周りは調べてもすぐに見つけたい記事がみつからず、調べ方もよくわかっていないので難しいです
はやくインポートに慣れたいです
GPT-3（≒ChatGPT） を Python で簡単に叩く

最近、世間では、[ChatGPT](https://chat.openai.com/auth/login) が話題になっています。

自分も色々と触ってみましたが、

* ユーザー数が多いのもあってアクセスできない時がある
* 簡単にcsvなどに保存できない
* アプリに組み込めない

などがあったので、簡単にアクセスできるようにコードを書いてみました。

:::note warn
※今回アクセスするのは「ChatGPT」そのものではなく、OpenAIが作成しているほぼ同じ機能を持つモデルです。
:::

:::note alert
OpenAI API の free trial のクレジットを利用します。
実行に関しては全て自己責任でお願いします。
:::

# 準備
## API KEY の取得
まず初めに、https://beta.openai.com/account/api-keys にアクセスして、アカウントを作成し、「Create new secret key」というボタンからAPIを取得してください。

ここは詳しく書いてある記事がたくさんあるので省略します。

## ライブラリのインストール
```pip install openai```

openai の api に簡単にアクセスできるようにするためのライブラリです。

# コード
以下のようなコードで簡単に使えます。
csvへの保存や配列の使い方などはお好きにどうぞ！


```python
import os
import openai
import csv

# API_KEY は直書きしてしまうことが多いですが、環境変数に設定することを推奨。
openai.api_key = os.getenv("OPENAI_API_KEY")

# 対話モデルを設定（多分これがGPT-3）
engine = "text-davinci-003"

def interact_gpt3_once(prompt):
    response = openai.Completion.create(
        engine=engine,
        prompt=prompt,
        temperature=0.5, # 0〜1。大きいほどクリエイティブで小さいほど明確な応答をする。
        max_tokens=1024, # 生成されるトークン（文字列をトークンに変換して処理しているらしく、英語ならword数の3/4程度の値になるそう）の最大数

        # ここの引数は様々あります。
        # https://beta.openai.com/docs/api-reference/completions/create を確認してください。
    )

    # 結果を取得
    result_text = response.choices[0]["text"]
    print(result_text)

    # csvに保存（任意）
    with open("data/chat-gpt.csv", "a", encoding="utf-8", newline="") as f:
        writer = csv.writer(f)
        writer.writerow([prompt, result_text])

if __name__ == "__main__":
    # 今回は一つの prompt を 10 回繰り返しているが、ここはお好きにどうぞ！
    prompts = [ """エンジニアの心構えを教えて。""" for _ in range(10)]
    
    for prompt in prompts:
        interact_gpt3_once(prompt)
        print("\n〜〜〜〜〜〜〜〜\n")
```


# 参考

*  [API Reference - OpenAI API](https://beta.openai.com/docs/api-reference/completions/create)
*  [tokenについて](https://beta.openai.com/tokenizer)
2022 Airflow on ec2 

## Overview
2022年になっても、まだ、airflowをec2上にinstallしていて、さらに、はまるので,いろいろメモ
設定としては

- dockerなし、 ec2にそのままairflowを建てる
- dbはrdsをつかわなくてlocalにinstall. rdsは高い
    - mysql community server. ver. 5.7. mariadbはエラーがでてたので、安全策で
    - postgresqlも9はサポート対象外
- celery 
## memo 

- https://airflow.apache.org/docs/apache-airflow/stable/start.html 
    - 基本、ver.2になっていろいろ変わっているのでこれを読んでそのまま設定
    - dbの設定もこまかく書いている。
    - mysqlの airflow db initのエラーの対処方法も書いている
    - timestampのdefault valueのエラーとかの対処方法もあり
    - https://airflow.apache.org/docs/apache-airflow/stable/howto/set-up-database.html
- mysqlを使うには、 mysqldb, mysqlconnectorを入れる
- mysql 5.7のinstallでまたハマる。
    - 公開鍵が切れている問題でそのまま入らないとか
    - 5.7を入れるために8.0のdisableにする
    - 全体をdocker composeするのはいろいろ面倒だけど、 dbだけ(mysql, postgresql, redis)はdocker containerを単体で使うのはあり。
    - https://hub.docker.com/_/mysql
[備忘録]React Nativeで動的にスタイルを当てるヘルパーを作った

# きっかけ
React然り、React Nativeを使っているときに動的にスタイルを当てたいことが多々ある。
Emotion や Styled Components では、クラスを生成するためにpropsを引数とした関数を渡すことができる。
それと同じことがしたいと思いヘルパー関数を作成した。

ただ、この記事を書いているときに、React NativeでもEmotionが使えることがわかったので、
そっちを使うといいと思う:sweat_smile:

https://emotion.sh/docs/@emotion/native

# とりあえずコードだけ

（メモ書きなので型の指定が緩いです。時間があるときに直します。）

### ヘルパー関数
```ts: helper.ts
/* eslint-disable @typescript-eslint/no-explicit-any */
import { useMemo } from "react"
import { StyleProp, StyleSheet } from "react-native"

type CreateStylePropFunc = (...args: Array<any>) => StyleProp<any>

// TODO: 使う際にインテリセンスが有効になるように型をもっと細かくする
export const createUseStyles = (createStyles: CreateStylePropFunc) => {
    return (...args: Array<any>) => {
        return useMemo(() => StyleSheet.create(createStyles(...args)), [...args])
    }
}
```

### 使い方

```tsx: sample.tsx
import React, { useCallback, useMemo } from "react"
import { Image, StyleSheet } from "react-native"
import { createUseStyles } from "./helper.ts"

type ThumbnailProps = {
    src?: string
    size?: number
}

export const Thumbnail: React.FC<ThumbnailProps> = ({src, size=56}) => {
    const styles = useStyles(size)

    return (
        <Image source={{uri: src}} style={styles.thumbnail} />
    )
}

const useStyles = createUseStyles((size: number) => ({
    thumbnail: {
        width: size,
        height: size,
        borderRadius: 14,
        marginRight: 10,
    },
}))
```
【AviUtl】MorphDotsを使う

# 【AviUtl】MorphDotsを使う
アドカレ14日目です。

カレンダー→[AviUtl Advent Calendar 2022](https://adventar.org/calendars/8135)
前日の記事→[AviUtlでグラフを作成しよう！](https://scrapbox.io/kurobneko-70792117/AviUtlでグラフを作成しよう！)

## 概要
昨年の一月に[こんな](https://youtu.be/pYlu4JP0nwI)動画を作りました。
あれから暫く経って、分かったことがあったりしたので纏めていきます。

## indexごとにloadする
MorphDotsは、個別オブジェクトに使います。
Progressの値を変化させることで、次のindexのオブジェクトをドットで描画していきます。

aviutlで個別オブジェクトと言えば、この三つが考えられます。
・テキスト
・画像ループ
・オブジェクト分割

つまり、テキスト or 同じ図形 or 同じファイルデータ でしかこのスクリプトを使うことができない…というのが少し前までの僕の考えでした。

実際は違います。スクリプト制御でobj.loadすることで、様々なオブジェクト同士をモーフィングしていけます。

例えば、MorphDotsの前にスクリプト制御で
```lua
for i=0,obj.num do
if(i==obj.index)then
obj.load("figure","円",0xffffff,(obj.index+1)*50)
end
end
```
…とすると、大きさの違う円でモーフィングすることができます。

loadした直後に
```lua
obj.ox=50*obj.index
```
…とすると、Orginalposにチェックでモーフィングする度にオブジェクトの位置を変化させることができます。

さて、loadできるということは、実質なんでも読み込めるということになります。indexごとに違う画像を読み込んでみた例が[こちら](https://twitter.com/metaphysicalba1/status/1538356703183663105)です。

## MorphDots[Noise]は単体で個別オブジェクトに使える
このことは93さんの説明書に普通に書いてました。

個別オブジェクトに対して、MorphDots[Noise]を付けてEffect(self)にチェックを付けるとノイズが反映されます。やっていることはTA-Trackとそんなに変わらないと思うので、どっちを使うかは好みの問題になりそうです。

## windとかいう機能
MorphDots[Noise]にある、windという項目。
意外と面白いです。

僕はこの[動画](https://youtu.be/opEy3aGCTSI)で初めて使用してみたのですが、適当に値を入れるだけでふわふわと粒子が動いてくれます。

個人的神機能。

## 円ではなく六角形を使う
これはGCv2とかでも同じなんですが、Shapeを六角形にするといいというお話です。

デフォルトでは円になっているので、そのまま使いがちですが、これだと描画処理がものすごく重くなってしまいます。そこで、六角形を使用することで描画処理を少しでも軽くします。

MorphDotsは重いスクリプトですが、工夫することでエンコードを時短できます。

(六角形を使うという知識も93さんからの輸入です)

## 最後に
MorphDotsについて少し書きました。
93さんのスクリプトには、他にも面白いものがあるので、ぜひ試してみてください。

[twitter](https://twitter.com/metaphysicalba1)
「Rubyのしくみ」を読んだ

[WEBCAMP ENGINEER COMMUNITY のカレンダー](https://qiita.com/advent-calendar/2022/webccamp-engineer-community)の14日目はQiitaの @kyntk が担当します。

「Rubyのしくみ」を読んだので、その感想をまとめました。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143317/cdd11d89-4298-0794-359f-1f8429ff1a8d.png" width="400px">

https://www.amazon.co.jp/Ruby%E3%81%AE%E3%81%97%E3%81%8F%E3%81%BF-Ruby-Under-Microscope-Shaughnessy/dp/4274050653/

日本語版序文として、まつもとゆきひろさんの以下のようなコメントがあります。

> Rubyを便利につかっていても、その中がどうなっていて、どのように実行されているのか、あるいはRubyのような言語をどうすれば再現できるのか正確な知識を持っている人はほとんどいないでしょう。本書はそのような謎につつまれている「Rubyの中身」を明らかにしてくれる一冊です。

この本は、Rubyがソースコードをどのように解析をしてどのように実行するのかという、Rubyの内部について書かれている本です。主にはMRI(CRuby)をベースに進められますが、C言語の知識がなくても理解ができるように、丁寧に図で説明されています。

私がこの本を読もうと思った理由は、

- JITが導入されたけど、今までと何が違うのか、今後どうなっていくのかを知りたいと思ったから
- Rubyをもっと使いこなすために、Rubyについて知りたいと思ったから

です。
特に1つ目について、去年のアドベントカレンダーで以下の記事を書きながらもJITについてあまり理解できていませんでした。現在と今後のRubyについて理解するために、今までのRubyについて知っておく必要があると思い、読もうと思っていました。

https://qiita.com/kyntk/items/beeb8f5376dd236e54b6

この本自体は日本語版の初版が2014年で、MRIのJITなどについての記述はなく、現在のRubyという意味でいうと少し古い内容になっている部分もありますが、今も変わらず活きている内容ばかりでした。

## 内容

章ごとに内容を軽くまとめてみます。

**-第1章 字句解析と構文解析**
Rubyがどのようにプログラムを解析するか
**-第2章 コンパイル**
解析したASTノードをYARVで実行する命令列にコンパイルする部分の説明。スタックや、変数等に関する情報を保存するローカルテーブルについて。
**-第3章 Rubyはどのようにコードを実行するか**
YARV命令実行時、内部スタック、コールスタックとの関係も1歩ずつ図示されている。異なるスコープの変数へのアクセス方法。
**- 第4章 制御構造とメソッドディスパッチ**
breakなどで別スコープへのジャンプする方法や、`send`でのメソッドディスパッチなどについての説明もある
**\-第5章 オブジェクトとクラス**
オブジェクトやクラスの構造体を見たり、インスタンスメソッドやインスタンス変数などの情報をどのように保存しているかが分かる
**-第6章 メソッド探索と定数探索**
継承やモジュールのincludeやprependをしたときにどのようにメソッドを探索するか、探索された結果をどうキャッシュするか。メソッド探索とは異なる、定数の探索方法。
**-第7章 ハッシュテーブル：Ruby内部の働き者**
様々な内部データの保存にも使われているハッシュテーブルについて。要素数が増えても素早く取得できる仕組みなど
**- 第8章 Lispから借りてきたアイデア**
ブロック、Procオブジェクトについて。Procオブジェクトが、スコープ外からローカル変数にアクセスできるように、メモリにどのように関数や環境を保存しておくか等についても説明されている。
**- 第9章 メタプログラミング**
メソッド定義における様々な方法。クロージャの概念を使ったメタプログラミング。
**- 第10章 JRuby：JVM上のRuby**
JRubyのコンパイル方法や、実行の最適化について
**- 第11章 Rubinius：Rubyで実装されたRuby**
MRIとの比較をしながらRubiniusの特徴について
**- 第12章 MRI・JRuby・RubiniusにおけるGC**
GCのアルゴリズムの比較

## 感想

- きちんとコンピュータサイエンスについて学んだことがなかったので、第1章から新鮮だった
    - そのような人でも読める内容となっています(内容が易しいというわけではないですが)
- 「モジュールをincludeすると、モジュールで定義されているメソッドが使えるようになる」ような部分のメソッド探索についての理解が深まった
    - Rubyが内部でモジュールやクラスの継承関係をどのように扱っていて、メソッド探索の際にその継承関係をどう遡っていくのかを知れた
- モジュールをインクルードした後にモジュールを変更する時の挙動がなるほど、と思った
    - どのモジュールがメソッドテーブルを共有するのか、しないのか
    - メソッドをオーバーライドするときなどに応用が効きそう
- クラスメソッドの定義方法もスコープの観点から理解できた
    - レキシカルスコープのselfを知ること
- 点としては知っていたことが、つながったような感覚を何度か感じた
    - Rubyオブジェクトの構造体や、メソッド探索、定数探索など
    - 裏側を知ることで、知識が関連性を持った感覚
    - ただ使うだけでなくて、どうしてそうなっているのかを知れた
- 処理系ごとに解決しようとしている課題が異なり、お互いに刺激しあっていて面白い
- JITを理解するヒントになったかも?
    - YARVやスタックなどがどうなっているかを知った上で、JITではどこが変わるのかを改めて知りたい
    - 改めてRubyのJITについての発表などを見返したい
- Rubyのコードを読むきっかけになった。少し読んでみると、執筆時点とコードが変わっているので、その変化についても知りたくなった
- Rubyについての理解が深まったので､他の言語を学ぶときにも、「Rubyではこうなっていたけど、この言語はどうなんだろう」のように考えるきっかけになりそう

## まとめ

初心者向けではないですが、「普段Rubyを書くことはできているけど、どうしてそういう挙動をするのかを詳しく知りたい」という人におすすめです。
Ruby以外の背景知識が少なくても、詳しく図解されているので粘り強く読んでいけば理解できるはずです。

個人的には、また何度か読み返したいなと思いました。

---

[WEBCAMP ENGINEER COMMUNITY のカレンダー](https://qiita.com/advent-calendar/2022/webccamp-engineer-community)を購読設定して、明日の記事もご覧いただけると嬉しいです。
kintoneで違うアプリのサブテーブル値を関連レコードとしてコピりたい

## はじめに

kintoneで朝に予定アプリで予定を立て、仕事が終わったらそのように対してどうなったか書くなど、
何かしらアプリをまたいだデータ連携がしたくなるときが多々あると思います。
通常のレコードなら簡単なのですが、それがサブテーブル内の値を持ってきたいという場合、
かなり話がややこしくなります。

## どんなあぷり？

このように、サブテーブル(テーブル名は、plantableです)に一日の予定を立てます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631482/f9501b34-7f03-2173-6caf-12cbe67b07da.png)

そうすると報告アプリでは、その立てた予定のサブテーブルの値をサブテーブル(テーブル名は、tasktableです)にコピーしたくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/631482/c25e647b-fda3-05b8-a3d2-f810fbbb3e72.png)

## どうやるの？

以下のコードを追加で登録します。
ルックアップでレコードナンバーを取ってきますが、それはダミーです。
持ってきたい本体はplantableです。
そのplantableをtasktableにツッコめば任務完了です。

```javascript:plancopy.js
(function() {
  'use strict';
  const events = [
    'app.record.create.change.Number',
    'app.record.edit.change.Number',
  ];
  kintone.events.on(events, function(event) {
    const targetAppId = kintone.app.getLookupTargetAppId('Lookup');
    const targetRecordId = event.record['Number'].value;

    // ルックアップクリアをしたらテーブルを空にする
    if (!targetRecordId) {
      event.record['tasktable'].value = [];
      return event;
    }

    const body = {
      app: targetAppId,
      id: targetRecordId,
    };

    kintone.api(kintone.api.url('/k/v1/record', true), 'GET', body, function(resp) {
      event.record['tasktable'].value = resp.record['plantable'].value;
      kintone.app.record.set(event);
    }, function(err) {
      window.alert('REST APIでエラーが発生しました');
    });
  });
})();
```

## おわりに

意外とサブテーブルの値を持ってきたい！というシチュエーションが多いので私はこのコードを多様しています。
もし役に立ったな、と思って頂けたらイイネをお願いします。
Ender 5 S1事始め③（#FDMtest）

概ね運用可能になりつつあるため、そろそろ#FDMtestを実行してセッティングを詰めていく。
## #FDMtestとは
3Dプリンタの総合的な性能をポイントで評価するテスト。
何でもKickstarterとAutodeskが作った、Kickstarterで出す3Dプリンタは必ず通す必要のあるテストらしい。
[こちら](https://note.com/newspeak/n/nb60b44f1b74c)の方が説明＆計算シートを作成して頂いているのでありがたく使用させて頂く。

## 実施結果
印刷条件の代表的なものは下記で行っている。
品質には目をつぶって速度に振った設定になっているはず。

| 設定 | 値 |
|:-:|:-:|
| レイヤー高さ | 0.2mm |
| インフィル密度 | 20% |
| 印刷速度 | 250mm/s |
| 印刷加速度 | 2000mm/s^2 |
| 印刷ジャーク | 10mm/s |

* 総合結果
![DSC_0042.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/fa55fd0d-166b-b8ae-4010-00c66002110d.jpeg)
総合的な結果は**Score:23**となった。
以下各部を確認する。

* Dimentional Accuracy
Score:5
![DSC_0047.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/a84a0445-ead3-805a-5538-0073fa9b16cd.jpeg)
X/Y軸の寸法精度を測る試験。
ミツトヨのノギスで測った所、精度は出ている。
しかし円の外周がカクカクしている。
STLデータはダウンロードしたものだし、スライサーで見るとそんなことはないんだが・・・。

* Fine Flow Control
Score:3
![DSC_0048.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/8d6b8bc5-6349-886c-e96e-19106633fa2e.jpeg)
糸引き、というかリトラクション（フィラメントの引き戻し）に関する試験。
30mm以上（というかモデルの最後まで）ちゃんと印刷されているため2.5点以上獲得したがご覧の通り糸引きが多い。
写真にスマホの限界を感じる・・・。
形状はちゃんと出ているようなのでScore:3とした。

* Fine Negative Features
Score:4
![DSC_0043.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/9ce955b3-a993-5cb2-8ed6-135687007ecc.jpeg)
ホールの形状が正しいことを確認する試験。
とりあえず4つは抜けた。
写真でも分かる通り径は正しそうだが内周がカクカクしており、1つ抜けなかったのはその影響と思われる。

* Overhangs
Score:3
![DSC_0045.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/899cf143-d254-85bf-4bd3-388eae502894.jpeg)
オーバーハング性能を測定する試験。
中々のオーバーハング性能だと思う。
最後の15度は流石に荒れ気味。

* Bridging
Score:3
![DSC_0044.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/b27ce0b1-5951-df06-e60f-f0e5ceb07004.jpeg)
ブリッジの垂れ下がりを測定する試験。
一応全てでブリッジが落ちて潰れている訳では無かった。しかし4,5は繊維状のものが下まで到達しており
カッター等での除去が必要そうなため3とした。

* XY Resonance
Score:2.5
![DSC_0050.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/65d84515-8ed1-d03d-d6e2-dab09a8e71cc.jpeg)
波打ち、ゴースティング、リンギングを見る試験。
こいつは悪いだろうなーと思ってたが、いい意味で期待を裏切られた。
ほぼリンギングが見えない。正直謎。

* Z-axis alignment
Score:2.5
![DSC_0051.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1391167/199f1c23-e5b2-d06d-a6f8-580d5e9c7e9e.jpeg)
Z軸のアライメントを見る試験。
周期的なズレは見当たらない。

## 考察と今後の方針
ちょっと辛めに点を付けたこと、Crealityの推奨速度は120mm/sのようなので割と雑な印刷になっていることから
スコアは23とAnker Make M5の25.5よりは劣る。
しかし、Prusa i3 MK3S+の22.5よりは上であり、十分実用に耐える精度と言えるだろう。

今後はまず、円のカクカク問題の対応を検討してみたい。
アレははっきりと目で見えるレベルで、見栄えに影響してしまうので・・・。
クリアしたとしても#FDMTest的に得られるのは1点だと思うけども。
AWS認定クラウドプラクティショナー合格に向けて Day23

# 前回の内容
[AWS認定クラウドプラクティショナー合格に向けて Day22](https://qiita.com/Ayako_0224/private/1f7ab1d5dcfec315490b)

# Cost Optimization(コスト最適化)
設計原則
- 不要なリソース削減
- 透明性のある費用
- マネージド型サービスの利用によるコスト削減
- 固定費を変動コストへ
- スケールのコストメリット
- データセンターへの投資不要化

需要と供給の一致= Auto Scaling
コスト効率の良いリソース=EC2の購入方式、Trusted Advisor
支出の認識=CloudWatch、見積もりツール
継続した最適化＝AWS最新情報、Trusted Advisor

## 無料利用枠
- 無料トライアル
- 12カ月無料
- 常に無料

## 課金方式
料金はよく改定されるので頻繁に確認することが大事
見積もりするためにPricing Calculatorが用意されている

- 従量課金
- 予約による低価格
- 使えば使うほど安い

## EC2の購入オプション
目的に合わせてオプションを適切なものを選択する

- オンデマンドインスタンス
- スポットインスタンス
- リザーブドインスタンス
- ハードウェア専有インスタンス
- Dedicated Host
- ベアメタル

## アクセス
### AWS一括請求(organizationの機能)
複数のAWSアカウントの請求と支払いを統合して、追跡・管理する
リザーブドインスタンスを共有したりS3などの利用量に応じた課金がお得になる
### AWS Purchase Ordar Management
AWSに対する発注書(PO)を作成・管理するサービス
### AWSクレジット
対象サービスに関連するコストを賄うため、請求に適用される販促用クレジットでクーポンのようなもの
Qiita Teamを覗いてみる

# はじめに

本記事は[All About Group（株式会社オールアバウト） Advent Calendar 2022](https://qiita.com/advent-calendar/2022/allabout)の14日目の投稿です。

こんにちは。新卒エンジニアの @yyoshii です。
弊社では社内の情報共有ツールとして Qiita Team を活用しています。
Qiita Team 内に3,000本以上の記事が蓄積されているため、その記事の情報を使って簡単な分析を行ってみたいと思います。

# 記事の取得
Qiita API を用いて社内記事を全て取得しています。Qiita API で取得した以下のような項目を元に、分析を進めていきます。
- タイトル
- URL
- タグ
- 投稿・更新日時
- コメント数
- リアクション数

他多数の項目が取得可能です。詳細は[こちら](https://qiita.com/api/v2/docs)

# Word2Vec
## 1. タグの学習
取得したタグ群が同じ記事に使われているか、加えて、対象のタグが別のタグと一緒に使われているかどうかの関連性を確かめ、それを元に Word2Vec で学習を行います。
タグの使われ方とその関連性を学習することで、タグの意味を解釈できるようになります。

Word2Vecの使い方は以下記事を参考にさせていただきました。

https://zenn.dev/tenajima/articles/f81_advent_calendar


## 2. 類義語を発見
それでは、いくつか単語（タグ）を与えてみて類義語にはどのようなものがあるか確認していきます。
試しに 「PHP」 で見てみると、各種 PHP のライブラリが多く並んでいるのが分かります。
ある程度予測通りではありますが、ライブラリのインストール手順などが近しい位置に存在しているのは安心感があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984342/f858c79e-d20b-3af4-bf61-a119dbdff3d2.png)
「MySQL」 でも同様に MySQL における機能が並んでおり、記事のタグが適切に利用されていることが確認できました。
![スクリーンショット 2022-12-13 21.24.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984342/9be7ca2f-61e3-b383-0429-9554dad34c01.png)
Word2Vecの有名な事柄として 「王様」-「男性」+「女性」=「お姫様」 のような単語による計算ができます。
そこで、「PHP」 と 「MySQL」 を足し合わせてみると、MySQL のストレージエンジンである「InnoDB」で使える「全文検索」が新たに上位に上がってきており、上手くそれぞれのタグの特徴が組み合わされている気がします。
実際に記事を確認してみると、開発する上での全文検索の簡単な使い方が紹介されていたりしました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984342/17c9f8fb-02a1-2a0b-8068-cb3d676019eb.png)

## 3. 中心性の確認
どのタグが中心に位置しているか、つまり他のタグとの関連がたくさんあるものを見てみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984342/afe69ab3-8245-f0ce-2175-95c2322f7227.png)
archives（情報の共有・保存用）や運用手順は、多くの記事で内容自体を表す他のタグと併用して利用されますし、オールアバウトの主要技術である PHP や Laravel に中心性があることが、この結果からもよく理解できます。
また、All About が長く運営されてきたことで古の技術として言及されている記事があることが分かります。

# 2022年度人気記事
最後に、リアクション数の多い順に人気記事としてランキング化してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2984342/fec762b9-73a0-fc68-9f73-4390334f3c65.png)
業務上困ったことやその解決方法、勉強したことの共有、コードレビューについてなど様々な内容でランクインしています。
トップ3は勉強したことに加え、新人が○○やってみたという内容であることによりリアクションもしやすく人気があったようです。

他の会社ではどのような記事が人気なのか気になるところです。

# おわりに
今回、社内の記事を分析したことにより、以下のような理由で Qiita Team の運用方法を見直す必要があるということに気付けました。
- タグに archives と archive があったり、PHP はバージョンごとにタグがあったりなど、命名が個人に委ねられている
- 想定よりもタグ付けをしていない記事が存在しており、記事検索のしづらさに繋がっている

また、今回は簡単なものしか行いませんでしたが、データクレンジングをより適切に行うと学習の精度を高められると感じました。

# 参考
https://www.letsopt.com/entry/2019/10/22/214535
GitHubというのが重要らしいと知ったばかりの人のための必要最小限のGitの知識

GitHubでは世界中の人や企業がソースコードを公開していて他の人がそれに修正を加えたりバグ報告などができるようになっていて、そこで使われてるツールがGitです。が、Git自体は直接GitHubと関係あるわけではなく単体で使えます。しかしGitHubと結び付けられて説明される事が多く（私も最初GitはGitHubのために作られたものだと思ってました）初心者にはわかりづらくなってると思うので、この記事では必要最小限だけの説明のみ行います。

# Gitとは
バージョン管理システムです。

# バージョン管理システムとは
バージョン管理システムとはプログラムなどの変更履歴を記録しておくものです。バグ修正、機能追加、あるいは単なるスペルミスの修正を行ったときなどに変更内容を記録（ **コミット** ）して、どのようにコードが変更されていったかを見ることができます。これによりバグが発生したとき変更履歴を見てどの変更が原因か考える、あるいはもっと直接的に以前の版に戻していってどの時点でバグが発生したか調べるといったことができます。

## ブランチ
Gitでは **ブランチ** （枝という意味）というものを作って開発するのが一般的です。例えば新機能を付けたいと思ったとき`new-feature`というブランチを作り、そこにコードの変更履歴を記録しておき、新機能が完成したら本流に合流（ **マージ** ）させます。
なぜそんな事をするかというと、新機能の開発中に元のコードでバグが見つかったときなどにすぐに本流に戻しバグを修正しまた新機能の開発を進めるという事ができます。また、Githubで行われるソーシャルコーディングや企業などで複数人で開発を進める場合、みんなが同じ本流に変更を加えていくと他の人がした変更を知らないせいでバグが生まれるなどの問題があるため、まず個人でブランチを作り、開発チームのリーダーなどがそれを見て大丈夫そうなら本流に **マージ** するといったことができます。

# Gitの使い方
## Gitのインストール
色々設定項目があるので以下のページに丸投げします。
[WindowsにGitをインストールする手順\(2022年12月更新\)](https://www.curict.com/item/60/60bfe0e.html)

## Gitの初期操作
これも丸投げします。
[Gitの基礎　初期化からコミット \- Qiita](https://qiita.com/wataling/items/b730a1f5efdb5c52639a)

## GUIツール
Git自体はコマンドによる操作しかできませんが、それだと変更履歴を見たりブランチの枝分かれなどがわかりにくいのでGUIツールを使うことをオススメします。私が使っているのはSourceTreeというもので以下の様に変更履歴、ブランチなどが可視化されてます。また、ブランチの作成などの基本操作が簡単にできます（複雑な処理は右上にある「ターミナル」ボタンを押して行います）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49529/b2320746-8ef9-a6e9-3d48-667b6fbc32c1.png)

また、一つのファイルの中の変更の一部分だけを **コミット** するなども簡単にできるようになってます。

インストール方法などはまた丸投げします。
[【初心者向け】Sourcetreeの使い方をわかりやすく解説！ \| mteam](https://mteam.jp/column/10210/)

# 最後に
GitはもちろんGitHubと深い関係があるためGitHubにソースコードをアップロードしたり、他の人の **リポジトリ** （プログラムのソースコードなどの集合）に **Pull Request** （自分が行った変更を反映してもらえるように申請）する方法、あるいはGit自体の様々な機能を学ぶ必要がありますが、それについてはいくらでも解説サイトがあるのでこの記事に書かれていることを知っていれば検索すればすぐ習得できると思います。
というか細かい話を始めるとコミットはどれぐらいの頻度で行うべきかとかコミット内容の書式をどうすべきかとかブランチ名の付け方とかいくらでも出てきて一つの記事には収まらないのでGitは詳細については適宜検索して使ってください。
【IDEA】【GoLand】エラーハンドリングのライブテンプレートを作成する

この記事は、[and factory.inc Advent Calendar 2022](https://qiita.com/advent-calendar/2022/andfactory)の **14日目** の記事です。
昨日は@doiheiの[【Swift】Encodableで可変パラメータを追加してみる](https://qiita.com/doihei/items/9abe1fd19555cfb4d352) でした。

# はじめに

Go言語は例外が存在しないため、エラーハンドリングを毎回する必要があります。メソッドを呼び出すたびにエラー判定をする必要があります。極端な例だと下記の状況も有り得ます。

```go
func process() (int, error) {
    aaa, err := funcAAA()
    if err != nil {
        return 0, err
    }

    bbb, err := funcBBB()
    if err != nil {
        return 0, err
    }

    ...

    zzz, err := funcZZZ()
    if err != nil {
        return 0, err
    }

    ...
}
```

メソッドを呼び出してエラーハンドリング、メソッドを呼び出してエラーハンドリング...
とにかくエラーハンドリングの文を書く機会が多いです。これを毎回手で書くのは辛いので楽をしたいという話です。

# 解決方法

今回はコードスニペットで自動入力するように設定して解決したいと思います。私はIntelliJ IDEAのGo機能を利用して開発しているので、IDEAのライブテンプレート(他エディタで言うコードスニペット)を作成して解決します。ライブテンプレートの詳細については[公式ドキュメント](https://pleiades.io/help/go/using-live-templates.html)を参照してください。動作確認はしていませんが、おそらくGoLandでも動作するかと思います。

差し当たり以下のライブテンプレートを作成しました。

```go
if $err$ != nil {
    return $errret$
}
```

これでも変数部分である`$err$`と`$errret$`の部分を手入力だけでエラーハンドリングのコードが書けるのでマシですが、できればすべて自動で入力してほしい…

IDEAのライブテンプレート機能は、変数に関数を適用することができます。行数を返したり、コード補完を呼び出したり、引数で与えた文字列をキャメルケースに変換したり…色々な変数が用意されています。詳細は[公式ドキュメント](https://pleiades.io/help/go/template-variables.html)を参照してください。
今回は`defaultReturnValues`、`errorVariable`を使用します。各変数について以下のように式を設定します。

| 名前 | 式 |
| --- | --- |
| err | errorVariable() |
| errret | defaultReturnValues(errorVariable) |

一応設定画面も載せておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56982/553be4a2-8f22-2a7d-671b-e6c7f41633f9.png)

これでライブテンプレートを呼び出せば、一発でエラーハンドリングのコードを書いてくれます。
例えば、以下のような状況の場合

```go
func Sample() (int, error) {
    a, err := AAA()
    [ここでライブテンプレートを呼び出す]
}
```

こうなります

```go
func Sample() (int, error) {
    a, err := AAA()
    if err != nil {
        return 0, err
    }
}
```

これでエラーハンドリングのコードを書く必要がなくなりました

# 終わりに

とにかくエラーハンドリングの文を書きたくなかったのでライブテンプレート呼び出しだけで実現できて助かりました。今回使用した他にも関数が用意されているので覗いてみようと思います。

明日の[Advent Calendar](https://qiita.com/advent-calendar/2022/andfactory)の記事もお楽しみに！
coc.nvim と nvm lazy load

この記事は、takumma のやれるところまでやってみる１人 Advent Calendar 2022 13日目
 の記事です。

https://qiita.com/advent-calendar/2022/takumma

---

zsh の高速化をするために nvm を lazy load する（zsh 起動時に nvm を load せず、node や npm などのコマンドを利用する時に nvm を load する）という人は割といると思う。

zsh での nvm の lazy load は、zsh-nvm を使う場合が多いのではないだろうか。

https://github.com/lukechilds/zsh-nvm

しかし vim の LSP として coc.nvim を使っている場合、coc.nvim は内部で node を使っているため vim 起動時に以下のようなエラーが出たりする。

```
[coc.nvim] node is not executable.
```

これを解決するためには、以下のような設定を `.zshrc` に記述する。

```diff_shell
export NVM_LAZY_LOAD=true
+ export NVM_LAZY_LOAD_EXTRA_COMMANDS=('vi' 'vim' 'nvim' 'code')
```

`('vi', 'vim')` というようにカンマで区切らず、空白のみで区切ることに注意してほしい。
これによって、vim コマンドを入力した際に nvm が load され、それによって coc.nvim が正常に動作するようになる。

参考にした issue：

https://github.com/lukechilds/zsh-nvm/issues/66
オススメの技術書紹介します


「[Applibot Advent Calendar 2022](https://qiita.com/advent-calendar/2022/applibot)」 14日目の記事になります。
前日は @joe_h さんの
「[TextMeshProでSpriteを表示する](https://qiita.com/joe_h/items/1407e45fc204813192a4)」という記事でした!

# はじめに

エンジニアにとって新しい技術を習得する際、技術書はとても良い選択肢です。
業務に直結するスキルを吸収するのはもちろんのこと、エンジニアとしての幅を広げたり、広い視点を持つための個人開発を始めるきっかけにもなります。

アプリボットでは広く業務に関係する技術書の購入をリクエストすることができ、技術力の向上をサポートしています。
本記事では、弊社メンバーよりおすすめ技術本をご紹介します！


## ドメイン駆動設計 モデリング/実装ガイド
- *どのような内容の本ですか？*
DDDの入門として勧めたい本です。かなり薄い本なので、概要を把握するのに最適です。

- *なぜリクエストしましたか？*
チームのDDD入門本として使いたいため

- *こういう人におすすめ！*
DDDに興味があるが、他の入門本は分量があって気がひける方に

(Hさん)

## ソフトウェアアーキテクチャの基礎 ―エンジニアリングに基づく体系的アプローチ

- *どのような内容の本ですか？*
アーキテクチャにおけるトレードオフについて、現代的な視点で整理し包括的に解説しています。
さらに技術的な側面だけでなく、アーキテクトとしての姿勢についても考えさせられます。

- *なぜリクエストしましたか？*
出版前から界隈で話題になっており、本の目次を見て即リクエストしました。

- *こういう人におすすめ！*
ソフトウェアアーキテクチャについて興味がある人は、是非手にとってみて欲しいです。
アーキテクトとして更に広い視点が持てるようになること請け合いです！

(Yさん)

## Kubernetes完全ガイド 第2版

- *どのような内容の本ですか？*
コンテナの基礎から Kubernetes 全体の解説、さらに CI/CD まで幅広く扱っている書籍です。CIU の青山さんが執筆されています。

- *なぜリクエストしましたか？*
分科会で調査している Agones や OpenMatch が Kubernetes のさまざまな拡張機能を活用して動いているので
深ぼるには Kubernetes の全体像を知っていた方が良いかなと思ったからです。

- *こういう人におすすめ！*
業務で使いそうになったときに予習したり、
使っている際に辞書代わりとして手元に置いておくのにおすすめです。

(Iさん)

## 達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践
- *どのような内容の本ですか？*
ISUCON参加する上での基礎知識となる、Webアプリケーションにおける高速化の重要性と計測について網羅的に学べる本

- *なぜリクエストしましたか？*
ISUCONが近かったのでおさらいも兼ねて

- *こういう人におすすめ！*
Webアプリケーション開発のバックエンドに携わる人
インフラ面含めたパフォーマンスチューニングに興味がある方

(Nさん)

## Linuxブートキャンプ サーバ操作/OSのしくみ/UNIXネットワーク──10年先も使える基礎を身につける!
- *どのような内容の本ですか？*
頻出 UNIX コマンドや、ディストリビューションごとの違い、ネットワークのことがざっくりわかる本

- *なぜリクエストしましたか？*
ISUCON に出てみて、Linux の最低限使う知識をざっと学びたくなったから

- *こういう人におすすめ！*
200ページほどしかなくサクッと読めるので、本を読むのが苦手な人。

(Sさん)

## 問いかけの作法 チームの魅力と才能を引き出す技術

- *どのような内容の本ですか？*
固定化した質問からは定型化した答えしか引き出せない危険性など（例えば、上意下達型組織における固定化した質問）を例に出し、質問をする際に、見立て・組み立て・問いかけのサイクルがあること、それによる質問の改善を提案する本

- *なぜリクエストしましたか？*
サーバー分科会において、解決できていない課題を掘り下げるためのアクションの一つとして

- *こういう人におすすめ！*
人に問いかけをする立場の人全般（営業、業務改善のためのヒアリング、組織）

(Nさん)

## デジタルトランスフォーメーション・ジャーニー 組織のデジタル化から、分断を乗り越えて組織変革にたどりつくまで

- *どのような内容の本ですか？*
組織の越境や変質を行うためにどのようなステップを踏むべきか。変革を起こすための静かなアプローチを考えるための本

- *なぜリクエストしましたか？*
サーバー分科会において、解決できていない課題を掘り下げるためのアクションの一つとして

- *こういう人におすすめ！*
組織の越境や協調に興味のある人

(Nさん)


## ゲームAI技術入門 ──広大な人工知能の世界を体系的に学ぶ
- *どのような内容の本ですか？*
体系的にゲームAIを学ぶことができます、また開発・デバッグでのAIの応用についても知ることができる本です。

- *なぜリクエストしましたか？*
今まで業務でゲームAIに関わることがなかったが、必要になったため体系的に学びたいと思いリクエストしました。

- *こういう人におすすめ！*
ゲームAIについて体系的に学びたい人
ゲームAIを実装したいが何からやればいいかわからない人

(Iさん)

## おわりに
弊社エンジニアによる技術書の紹介でした。
密度の高い情報に触れること、そしてそれをチームメンバーに共有することは自分やメンバーの成長のためにとても有用なことだと思います。
気になった本があればぜひ読んでみてください！

明日は@kozu_pidさんです！
canvas要素で遊んでみる

canvasを使った際の備忘録です。

画像に任意の文字列を重ねて表示するサンプルです。

```HTML
<html>
<head>
    <title>サンプルコード</title>
</head>
<body>
    <input type="text" id="text1" value=""><br><br>
    <input type="text" id="text2" value=""><br><br>
    <canvas id="cv" width="1000" height="1000" style="background-color:#f0f0f0"></canvas>

    <script>
        var ctx = document.getElementById('cv').getContext('2d');
        var img = new Image();
        img.src = "画像ファイル名";

        //ロード時
        window.onload = function () {
            text1.addEventListener('input', txtChanged);
            text2.addEventListener('input', txtChanged);

            //画像
            ctx.drawImage(img, 0, 0, 1000, 1000);

            //テキスト
            ctx.fillStyle = "White"
            ctx.textAlign = "center";
            ctx.textBaseline = "middle";

            ctx.font = "bold 100px 'フォント名'";
            ctx.fillText("＊＊　＊＊", 250, 333, 500);
            ctx.fillText("＊＊　＊＊", 750, 666, 500);
        }

        //テキスト変更時
        function txtChanged() {
            //画像
            ctx.drawImage(img, 0, 0, 1000, 1000);

            //テキスト
            ctx.fillText(text1.value, 250, 333, 500);
            ctx.fillText(text2.value, 750, 666, 500);
        }
    </script>
</body>
</html>
```
サーバのデータをSQLに出力したのち自分のPCに転送する

# やりたいこと
サーバ内のDBデータをSQLでファイルに出力し、
自分のPCに転送したい状況。

# sshでの接続
下記で公開鍵ファイルを指定して接続できる。
```
ssh -i 鍵名
ssh -i ~/.ssh/鍵
```

# scpでのファイル送信
ssh の記載に加えて具体的なディレクトリを指定し、送信先を記載することで送ることができる。
自分のPCから下記コマンドを実行する。
```
scp -i 鍵 ホスト名：folder名/ファイル名　送信先ホスト名
scp -i ~/.ssh/鍵 hoge@hoge:~/folder/file C:
```

# mySQLでcsvファイルに書き出し
SQLに「"」ダブルクォーテーションが含まれているとうまくいかないため、気をつける。
```
mysql -u ユーザ名　DB名　-p -e "SQL" > file.csv

各オプションは以下。
-u:ユーザ
-p:パスワード指定
-e:SQLを渡す
```

# 読み込み
そのままエクセルで開くと、カンマで区切り＋文字化け　しており開けない。
グーグルスプレッドシートを開きインポート→タブ区切りを選択することで開くことができる。

# 未解決な疑問
・EXCELで開けるようにするには、文字コードを設定する？
Mac作業効率化Tips(エイリアス編)

## はじめに
エイリアスを利用して作業効率化する記事です。
普段Macのzshを利用しているので、`.zshrc`にエイリアスを仕込み作業効率化した話です。
エイリアスには、grepやyarn,git等、複数記載するとごちゃごちゃするので、ファイル分割も併せて実施しております。

## やりたい事
やりたい事としては、下記図の通りです。
grepやyarn,gitなど目的に応じてファイル分割し、ターミナル起動時にエイリアスをロードする仕組みを作りました。
![エイリアス読み込みWF.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/38d86dda-0b66-69c8-da1c-b593bcfe0cb0.png)

## 成果物

```sh:ディレクトリ構成
~/.zsh/alias$ tree               
.
├── base_alias.zsh
├── grep_alias.zsh
└── yarn_alias.zsh

0 directories, 3 files
```
→.zsh/aliasディレクトリにaliasのファイルを作成していきます。

## 作業内容
①`.zshrc`に下記コマンドを記載する。
```zsh:~/.zshrc
# エイリアス読み込み
ZSHHOME="${HOME}/.zsh/alias"

if [ -d $ZSHHOME -a -r $ZSHHOME -a \
     -x $ZSHHOME ]; then
    for i in $ZSHHOME/*; do
        [[ ${i##*/} = *.zsh ]] &&
            [ \( -f $i -o -h $i \) -a -r $i ] && . $i
    done
fi
```

②~/.zsh/aliasのディレクトリ作成する。

③aliasディレクトリにシェルファイルを作る。
下記はサンプルですが、参考にしてください。
```zsh:~/.zsh/aliasbase_alias.zsh
~/.zsh/alias$ cat base_alias.zsh 
#!/bin/zsh

# エイリアス設定
alias viz='vi ~/.zshrc'
alias path='echo $PATH'
alias sz='source ~/.zshrc'
```

④ターミナル再起動　or `source ~/.zshrc`実行
これで完成です！！！

## 成果確認
仕込んだエイリアスが利用できるか確認します！！
```
~/.zsh/alias$ path 
/Users/kouji/go/bin:/Users/kouji/go/bin:~~~~~~~~~~~~~~~割愛~~~~~~~~~~~~
```
→このようにコマンドが動いていれば、OKです！！！

## 個人的に設定中のエイリアス
私が個人的に設定しているエイリアス集を記載しておきます。頻繁に使うけど忘れやすいコマンドや短くする事ができるので、重宝しています！！

```shell:base_alias.zsh
~/.zsh/alias$ cat base_alias.zsh 
#!/bin/zsh

# ディレクトリ変数登録
ALI=~/.zsh/alias/
DEV=~/develop
HITOTSU=~/develop/HITOTSU
GOTENROKU=~/develop/gotenroku

# エイリアス設定
alias viz='vi ~/.zshrc'
alias path='echo $PATH'
alias sz='source ~/.zshrc'
```

```shell:grep_alias.zsh
~/.zsh/alias$ cat grep_alias.zsh 
#!/bin/zsh

# alias確認
alias agy='alias | grep grep'

# grep 
gre () {
    grep -E $1 -rl $2
}
```

```shell:yarn_alias.zsh
~/.zsh/alias$ cat yarn_alias.zsh 
#!/bin/zsh

# alias確認
alias agy='alias | grep yarn'

# ローカル
alias yi='yarn install'
alias ya='yarn add'
alias yad='yarn add --dev'
alias yrm='yarn remove'
alias yup='yarn upgrade'
alias yls='yarn list'


# グローバル
alias yga='yarn global add'
alias ygrm='yarn global remove'
alias ygup='yarn global upgrade'
alias ygls='yarn global list'

# TypeScriptの初期プロジェクト作成 
yct () {
    yarn create react-app $1 --template typescript
}
```

## まとめ
エイリアスを効果的に活用する事で、作業効率が上がるのでよければ試してみてください！！
Laravelのtry catchでエラーを取得する 

## 初めに
Laravelのtry catch 構文を多用するので、コピペ用に記事書きました。

__try catch構文とは__
構文内で発生したエラーであれば、すべて取得してくれる優れもの。

## 環境
| 開発環境    |バージョン |
|-----------|------------|
| __Laravel__ | 8.83.19 |
| __PHP__     | 7.3.10  |

## 文法
```PHP:TryCatchController.php
 
    use Illuminate\Support\Facades\Log;
    use Exception;
    
    try {

       // ... 省略
    
    // try内で発生したエラーをcatchで取ってくれる
    } catch (Exception $e) {

        // try内で発生したエラー内容を表示してくれる
        Log::debug($e->getMessage());
    }
```

インサート、アップデート、アップサートのエラーすくい方は、こちらの記事に記載しています。
　⇒　https://qiita.com/fuku_rin/items/942e3597da090131946d


ご指摘ありましたら、メッセージいただけるとありがたいです。
よろしくお願いします。
ELPI の組込述語 (std.set編)

ELPI の組込述語 (std.set編)
=====================

@suharahiromichi

2022/12/13
ELPI (文献[2]) の組込述語の2回めとして、ELPIのソースコード [1]

``src/builtin_set.elpi``

に定義されている、集合を扱うライブラリの説明をします。全順序集合を平衡二分木を使って実装しています。

この記事の元になるソースコードは以下にあります。

https://github.com/suharahiromichi/prolog/blob/master/elpi/elpi_std_set_note.elpi


# std.set の使い方
述語名の前に``std.set.``をつけて使います。


## pred make i:(E -> E -> cmp -> prop), o:std.set E.
全順序の関係を定義して、空集合を返しまします。ここでは、基本として、整数どうしの大小関係を指定しています。

``E -> E -> comp -> prop`` 型の3引数の述語で定義しますが、第3引数は、出力であることに注意してください。第1と第2引数の関係を調べて、``eq``、``lt``、``gt``のどれか（cmp型）を（決定的に）返すようにします。cmp型は、

```
kind cmp type.
type eq cmp.
type lt cmp.
type gt cmp.
```
で定義されています。いわゆる列挙型と思って間違いありません。


```prolog:

pred cmp1 i:int, i:int, o:cmp. /* o に注意！ */
cmp1 X X eq.
cmp1 X Y lt :- X < Y.
cmp1 X Y gt :- X > Y.

pred test1.
test1 :-
      std.set.make cmp1 _.


```

## pred mem i:E, i:std.set E.
集合に要素が含まれているかテストします。「∈」ですね。
まだ空集合なので、``not (1 ∈ ∅)`` です。
第1引数は値が決まっていないとだめなので、``std.set.mem S X``で、Sの任意の要素Xを取り出すことは*できません*。


```prolog:

pred test2.
test2 :-
      std.set.make cmp1 S,
      not (std.set.mem 1 S).


```

## pred add i:E, i:std.set E, o:std.set E.
要素を追加します。同じ(eqである)要素を何回追加しても、変りません。


```prolog:

pred test3.
test3 :-
      std.set.make cmp1 S,
      std.set.add 1 S S1,
      std.set.add 2 S1 S2,
      std.set.mem 2 S2,
      std.set.add 2 S2 S2,
      std.set.add 2 S2 S2,
      std.set.add 2 S2 S2.


```

## pred remove i:E, i:std.set E, o:std.set E.
要素を削除します。含まれない要素の削除はfailします。


```prolog:

pred test4.
test4 :-
      std.set.make cmp1 S,
      std.set.add 1 S S1,
      std.set.mem 1 S1,
      std.set.remove 1 S1 S2,
      not (std.set.mem 1 S2),
      not (std.set.remove 1 S2 _).


```

## pred cardinal i:std.set E, o:int.
集合の大きさを返します。


```prolog:

pred test5.
test5 :-
      std.set.make cmp1 S,
      std.set.add 1 S S1,
      std.set.add 2 S1 S2,
      std.set.cardinal S2 N,
      print "size is " N.


```

## pred elements i:std.set E, o:list E.
集合の要素をリストで返します。


```prolog:

pred test6.
test6 :-
      std.set.make cmp1 S,
      std.set.add 1 S S1,
      std.set.add 2 S1 S2,
      std.set.elements S2 L,
      print "elements are " L.


```
集合の任意の要素を（非決定的にバックトラックによって）取り出したい場合は、``std.set.elements`` とリストの``std.mem`` を組み合わせて使います。引数の順番に注意してください。


```prolog:

pred test6_1.
test6_1 :-
      std.set.make cmp1 S,
      std.set.add 1 S S1,
      std.set.add 2 S1 S2,
      std.set.elements S2 L,
      std.mem L X,
      print X,
      fail.


```

# 補足説明
もしご興味があれば、実装も見てみてください。Prologだからといって特別なアルゴリズムを使っているわけではありません。効率的なプログラムのためには効率的なアルゴリズムを選ばないといけないという点で、Prologは決して特別な言語ではありません。
また、集合演算としては、要素の追加と削除しかないので、物足りないかもしれません。そう思ったかたは、ぜひ、このライブラリの拡張にも挑戦してみてください。


# 参考文献
[1] ELPIソースコード
https://github.com/LPCIC/elpi/tree/master/

[2] λProlog (Lambda Prolog) の紹介
https://qiita.com/suharahiromichi/items/a046859da0c0883e7304

[3] ELPI の組込述語 (stdlib編)
https://qiita.com/suharahiromichi/items/1d200a9320e04ca21953




```
【Python】勉強メモ-その4　スクレピング結果のCSV出力


### 1.はじめに
今まで、リストとリストをCSVファイルに書き込む学習をしてきました。
そこで、少し実践的に、スクレイピングした結果（yahooのトップページ）をCSVファイルに書き込む
サンプルを掲載します。

### 2．writerow()によるCSV出力
注意点として
writerow()は、リストを入れなければならないので、
writerow(elem.text, elem.get("href"))としては、ダメ！！
writerow([elem.text, elem.get("href")])と、`[]`を使ってリストにしましょう！！
```sample_01.py
import csv
import requests
from bs4 import BeautifulSoup

url = "https://www.yahoo.co.jp/"
res = requests.get(url)

soup = BeautifulSoup(res.content, "html.parser")
print(soup.text)

topics = soup.find(id = "Topics")
print(topics.text)

with open("info.csv", "w", newline="", encoding="utf_8") as f:
    writer = csv.writer(f)
    for elem in topics.find_all("a"):
        writer.writerow([elem.text, elem.get("href")])
```

```info.csv
救済法案、参院特別委で可決NEW,https://news.yahoo.co.jp/pickup/6447244
プーチン氏 核先制使用の検討示唆,https://news.yahoo.co.jp/pickup/6447243
教員らの性犯罪歴確認 法制化検討,https://news.yahoo.co.jp/pickup/6447240
シャンプー新勢力が台頭 焦る大手,https://news.yahoo.co.jp/pickup/6447239
奨学金650万円 返済終わりは50代NEW,https://news.yahoo.co.jp/pickup/6447249
JリーグPK戦「上」ほぼ100%成功NEW,https://news.yahoo.co.jp/pickup/6447246
箱根駅伝 21チームの登録選手発表,https://news.yahoo.co.jp/pickup/6447241
東出昌大「壮絶」DV夫役で新境地NEW,https://news.yahoo.co.jp/pickup/6447245
稲わらウサギ12/10(土) 13:00愛媛新聞ONLINE,https://news.yahoo.co.jp/articles/f0d5d36b2631d1ed6f9168a1dfcf57423d9e16f5/images/000
もっと見る,https://news.yahoo.co.jp/topics/top-picks
トピックス一覧,https://news.yahoo.co.jp/topics
```

### 3．writerows()によるCSV出力
writerows()は、リストを、一行一行ファイルに書き込みのではなく、一気に書き込みます。
writerows()も、引数には、リスト`[]`を渡す必要があります。
出力結果は、info.csvと同じになります。

```sample_02.py
import csv
import requests
from bs4 import BeautifulSoup

url = "https://www.yahoo.co.jp/"
res = requests.get(url)

soup = BeautifulSoup(res.content, "html.parser")

topics = soup.find(id = "Topics")

# writerowsの引数に渡すためのリストを作成しておく
lines = []

with open("info.csv", "w", newline="", encoding="utf_8") as w:
    writer = csv.writer(w)
    for elem in topics.find_all("a"):
        # lineという変数に以下の様にリストを代入すると、lineもリストとなる
        # [救済法案、参院特別委で可決NEW,https://news.yahoo.co.jp/pickup/6447244]で格納されている
        line = [elem.text, elem.get("href")]
        # 用意したlines[]に、[elem.text, elem.get("href")]を追加
        lines.append(line)
    # writerowsを使って、一気にCSVに出力
    writer.writerows(lines)

```

### 4．参考

`line = [elem.text, elem.get("href")]`が、いまいち分からない方は、以下のコードで
**elam.text→a_list**、**elem.get("href")→b_list**に置き換えて考えてみてください。

```sample_03.py
a_list = [1, 2, 3]
b_list = [4, 5, 6]

c = [a_list, b_list]

print(c)

# 結果
[[1, 2, 3], [4, 5, 6]]

```

### 5. 最後に
- ツッコミ歓迎致します。皆様のツッコミが、私のスキルアップにつながります！！
- お題なんかも出していただけると助かります。
- 実務では、もっと、こういう使い方もあるよ！！みたいなアドバイスもいただけると嬉しいです。
社員同士を趣味でマッチング！？社内のコミュニケーション活性化ツールを新卒1年目のチームで開発しました



## はじめに
こんにちは。推薦基盤ブロックの新卒1年目の関口です。
この記事は [ZOZO Advent Calendar 2022](https://qiita.com/advent-calendar/2022/zozo) カレンダーVol.7の14日目の記事です。
先月から社内で利用開始されましたコミュニケーションの活性化を目的とした**社員マッチングツール**について簡単にご紹介します。

## 背景
リモートワークが普及し、社員同士が顔を合わせる機会がなくなってませんか、、、。
働いていくなかで社内の仲間との連携を強くしていくにはコミュニケーションの促進が必要です！でもオンライン上で気軽に社内の人と話せる機会って意外とそんなに多くありませんよね。
そんなこともあり、**社内で他部署や普段関わらない社員との関わりを求める声**が多いです。

そこで社内でコミュニケーション活性化させるため**社員マッチングツール**の開発を新卒1年目のチームで行いました。

## 詳細内容

開発したサービスは、

**共通の興味・関心を持つ社員同士をMLモデルを使ってマッチングします！
マッチング相手と共通の話題で気軽に話せる1on1ミーティングの機会を創出し、業務では関わらない社員同士とも共通の趣味を通してコミュニケーション取っていこう！**

といった会社全体をつなげるサービスになっています。
使用者は事前にSlackアプリ上で趣味や関心のあるタグを登録し、そのタグをもとにマッチングされて1on1ミーティングが組まれます。
![ナナメイメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/d4e148c6-61ad-e008-b1bc-093df2b2e507.png)

以下、私が担当していた一連の処理フローについて簡単にご紹介します。

下記がバッチ処理フローの概要図になります。
![CLUBZOZO2.drawio (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2997599/daf67c7e-0319-47da-7679-eb6b3d5bc053.png)

本ツールのバッチ処理の実装にはAWSのリソースを利用しています。
使用している主なリソースは以下です。
- S3
- Lambda
- RDS
- ECS
- Fargate
- StepFunctions

処理の流れは以下のようになっています。
1. 連続で同じ相手とマッチングしないように前回の1on1の組み合わせを抽出
2. マッチング有効化されているユーザーの登録情報を取得
3. 1）,2）のデータをMLモデルに入力し、登録されているタグをもとにユーザー間のマッチ度を推論
4. マッチング結果を出力

マッチング結果をもとに社員同士の1on1ミーティングを設定します。

バッチ処理実行にはStepFunctionsを用いて定期実行を行い、週１頻度でマッチングした1on1ミーティングが組まれるようになっています。
これで、普段関わりのない社員同士でも共通の趣味を通して気軽に1on1ミーティングが組まれるようになりました。

実際に僕も役職や部署の垣根を超えて1on1ミーティングを行い、共通の趣味仲間を見つけることができました！ｳﾚｼｲ！！

## 今後
このような社内の交流を目的としたツールの開発をさせてくれるところに弊社の社風を感じました。
1ヶ月間運用し、このサービスを通して関わりのない他部署の社員とご飯の約束をされた方や、ゲームやスポーツなどの共通の趣味で繋がることができたという声をたくさん頂きました！
働き方が多様になり、社員も増えていく中でこのツールを通して社内の連携を強固なものにできれば嬉しいです。
まだまだ実装したい機能や、改善点があるので引き続き改良していきたいと思います。

今回は簡単なサービスの説明になってしまったので実装方法や技術的な部分については次回投稿したいと思います。
将来の不具合調査で楽をするために今できる最低限の実装


言うまでもないですが、完璧なコードはありません。完璧と思ったコードに不具合があることは良くあります。そして、問題があったら調査に駆り出されるのは、実装した「あなた」か将来の保守担当者です。
将来の不具合調査を楽にするために、今できる最低限の実装をここでは紹介したいと思います。

## 最初の実装 
ではまず、このgetCustomerというメソッドを例にしてみます。
このメソッドはcustomerIdとtenantIdを引数にしてCustomerオブジェクトを返すメソッドです。
Customerは特定のtenantに属しており、引数で渡されたtenantIdに必ず所属している必要があります。
所属が違う場合には、不正はアクセスとみなして、nullを返却します。

多分プログラミング経験が浅い方以下のように書くでしょう。

``` typescript
  getCustomer(customerId: string, tenantId: string): Customer | null {
    let customer = this.customerRepository.get(customerId);
    if (customer.tenantId !== tenantId) {
      return null;
    }
    return customer;
  }
```

## レビューしてみよう
さて、このメソッドをレビュワーの視点で見てみましょう。
この場合には以下のようなケースが想定されます。あなたは以下の回答を用意できていますか？
- customerIdがnull/undefinedのケース
- tenantIdがnull/undefinedのケース
- customerIdのCustomerがデータベースに存在していないケース
- データベースが停止しているなどでコネクションが張れてないケース
- customerがtenantIdに所属していないケース

これらの問題が本番環境で発生するたびに、あなたは調査しないといけないわけです。
もちろん、発生可能性は低いと思います。なのでこのコードでも良しとするケースが大半でしょう。
ですが、引数がブラウザなどのクライアントから渡ってくる場合には、引数が不正になる可能性は多いにあります。意外とDBを直接編集されて、Customerテーブルに変なデータが入ってくる場合もあります。
そのたびに、あなたはログを収集して、手がかりを探して、右往左往するのです。


ではどうするか？
**最低限「問題が発生したときに追跡しやすくしておきましょう」です**


## 最低限の実装をしておこう

追跡するためにはログが必要です。アプリケーションログの目的はいろいろあるのですが、一番大きい目的は「不具合調査」です。
ログを見ただけでどこがいけないのか、どこまでOKでどこからNGなのかを切り分けるのに非常に役に立ちます。

さて今回のケースでは、これくらいは実装をしておいて欲しいところです。

```typescript
  getCustomerB(customerId: string, tenantId: string): Customer | null {
    if (!customerId || !tenantId) {// 引数チェック
      throw new Error(
        `Illegal customerId or tenantId, customerId=${customerId}, tenantId=${tenantId}`
      );
    }
    let customer = null;
    try {
      customer = this.customerRepository.get(customerId);
    } catch (e) {// DB コネクションチェック
      this.logger.error(`Failed to get customer customerId=${customerId}, tenantId=${tenantId}`);
      throw e;
    }
    if (!customer) {// Customer存在チェック
      this.logger.warn(`Customer does not exist customerId=${customerId}, tenantId=${tenantId}`);
      return null;
    }
    if (customer.tenantId !== tenantId) {// Tenant 所属チェック
      this.logger.warn(
        `Customer does not belongs to the tenant customerId=${customerId}, tenantId=${tenantId}, customer.tenantId=${customer.tenantId}`
      );
      return null;
    }
    return customer;
  }
```
まず引数のチェックは行っておきます。確実に不正な値が渡ってこないことが明らかな場合や、呼び出し元でチェックが行っているとわかっている場合には、冗長になるので不要な場合も多いです。
ここまでやっておけば、不具合調査でログを収集しても、すぐに問題箇所がわかるわけです。調査コストが下がりますね。

ここで上記ケースの場合には、nullを返すの？と思ったアナタは一歩前進していますね。
null safetyな実装というのもあるので、調べてみて下さい。世の中のエラーの大半はヌルポです。

そして大事なこと。
**ログには必ずパラメーターを出力するようにしておきましょう。**
これが後で自分を助けることに繋がります。

最後に、契約プログラミング、防御的プログラミングという概念もあるので、参考にしてください。
言語ごとの特徴もあるので、実装方法は異なりますが、概念は大きく変わらないと思います。

以上
アジャイルでよく聞く謎ワードたちとその定義

# はじめに

- アジャイル関連で耳馴染みのないワードが多いのでそのざっくり整理をしようと思った
- もっとあると思ったけどあんまり多くなかった
- アジャイルというよりスクラム？

# 謎ワード一覧

- 自己組織化
- 心理的安全性
- フィーチャーチーム（職能横断的なチーム）
- CI/CD

# 自己組織化

もう少し詳しいことは過去まとめてるからこっちみてくれ。

https://qiita.com/nh321/items/ab37b6e177178279b067

もっと公式的な情報が見たいならこっち。（LeSS）

https://less.works/less/management/self-managing-teams?preferred_lang=jp

ざっくり言えば「ゴールに向かって必要なことを有機的に行える組織」（自己解釈的表現）
ポイントは以下だと思ってる。（いずれも自己解釈）

- 目標を理解しており、現在の手段が妥当であるかを評価でき、問題があれば手段を変えることができる。
    - ゴールの状態を正しく把握している
    - ゴールまでの進捗を自分で把握できている
    - 現在の手段で進捗が芳しくない場合は、手段を変える能力と権限を持っている。
- 特定メンバーの不在などを理由に機能しなくなるということは無く、チーム内の相互作用によって目標達成に向けた行動を行うことができる。
    - 特定のリーダーに引っ張られるような旧来の組織体制とは異なる。
    - 全員がリーダーシップをはっきするようなイメージの組織体制。
    - 特定メンバーの不在などがあれば、チーム内で会話して必要があればその穴を埋めるような動きができる。

# 心理的安全性

個人的にまとめた記事はすでに上げてるから割愛。
公式な記事が見たいならGoogle re:workを見よう。

https://rework.withgoogle.com/jp/guides/understanding-team-effectiveness/

ざっくり言えば「失敗を表明することへの不安の少なさ」。（自己解釈）
ポイントは以下だと思ってる。

- 自分の失敗を表明することができる。
- 自分の失敗を表明する必要性を理解しており、自身が被る被害が許容範囲内であると確信している状態。
- 部下→上司に対する心理的安全性がよく話題になるが、上司→部下も同様。

# フィーチャーチーム（職能横断的なチーム）

公式な記事はこちら。

https://less.works/less/structure/feature-teams?preferred_lang=jp

フィーチャーチーム以外のもクロスファンクショナルなチームとか呼ばれたり、職能横断的とか機能横断的とか言われたりする。

ざっくり言えば「システム開発（要件定義〜リリース）を単一のチームで実行できる状態」。

- デザイナーやアプリケーションエンジニア・インフラエンジニアなどを単一チームとして取り扱うことがよく例に上げられる。
- 要員リソースを効率的に使うための体制ではなく、あくまでプロダクトを早くリリースするためのチーム体制。
    - 局面によっては不慣れなタスクを扱う場面もあり、作業効率という面では不都合が多い。
    - インフラチーム/アプリチームなどに分けると、情報連携などのボトルネックなどが生まれ、プロダクトリリースに時間がかかるとされるため、こういったチーム体制が提案されている。
    - 要はリリース速度の短期間化を目指すためのアプローチの一つ。

# CI/CD

正直に言えばこれを見てくれという気分。

https://qiita.com/nh321/items/71d9d57736cd9104a43d

公式な話とかならここら辺かしら。

https://continuousdelivery.com/

ざっくり言えば「システム開発を小分けにして、常にメインブランチにマージし続けることで、ビックバンマージを避け、手戻りを減らせ。」という話。（だいぶ飛躍してるけど）

ポイントは以下。

- システムは「小さく」変更すること
- 開発者へのフィードバックを「高頻度」にすること
- 間違ってはいけないものは「自動化」すること

# まとめ

すげぇざっくり解説にしたけど、たまにはこういう記事が欲しい時もあるので、軽くまとめてみた。

# 次回予告

https://qiita.com/advent-calendar/2022/jutakuagile

本記事は、2022アドベントカレンダー「受託アジャイル」の記事です！他にも興味あれば見てってください。
次回は、スクラムの進捗管理の考え方です。
Docker Desktop Windows をWSL2で使うときは、.wslconfigでメモリ設定が必須

# 起きたトラブル
Windowsにて、Docker DesktopをWSL2で使っておりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/872424c8-6ae8-a3df-38ac-5c9025ac305e.png)

そんな中、とあるDockerfileで
やや重めのRパッケージをインストールしようとしておりました。
すると待てど暮らせど、Dockerのビルドが終わりません。
そのうち、Rパッケージのインストールが「Killed」というメッセージとともに失敗し、
ビルドも失敗に終わってしまいました。

# トラブルの原因
調べてみると、どうやら原因はDockerのリソース不足のようです。
そこでDocker Desktopのリソース設定を見てみると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/c0952c98-d163-5eb3-4ec2-2ab09b934a60.png)
と、「WSL2の場合は`.wslconfig.file`でやれ」と書いてあります。

なんじゃそりゃ、と思ってドキュメントを確認すると、
要は`C:\Users\<UserName>\.wslconfig`を編集しろ、ということらしい。
https://learn.microsoft.com/en-us/windows/wsl/wsl-config#configure-global-options-with-wslconfig
このファイル。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/59beeac1-359e-9df1-3136-5621c129a229.png)

開いてみると、こんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100646/a13fce45-dc5b-3460-0c98-7de28c6c312f.png)
確かに、１GBだとちょっと大きめのイメージをビルドしようとすると、しんどいことがあるのかもしれない。
それにビルドの速度も遅そう。

これを試しに４GBに編集してみたところ、
- docker buildが爆速に
- 途中で止まることもなくなった

と良いことづくめとなりました。
なお、`.wslconfig`を編集した後は、PC再起動したほうがよさそうです。

# 終わり
終わりです。お疲れさまでした。
【小技】chromeのから好きなサイトを直接検索する

# 発端
・弊社では社内の人間のみが閲覧できる社内wikiが存在しています。
・様々なノウハウやと歴史が詰まっているのですが、社内wiki内での検索を行うのに、
①社内wikiを開く
②検索窓を選択
③検索ワードを入れて検索
の手順が必要でした。

ブックマークでの運用も限界があるため、弊社の社員の中には日常的に検索を行う方も多いと思います。
大した負担にはならない操作なのですが、いちいちキーボードから手を離したり、検索窓をクリックするのめんどいな～と思ったので、chromeのアドレスバーから検索できるようにしました。
# 設定方法
①chromeの設定>検索エンジン>検索エンジンとサイト内検索を管理するを選択します。
![2022-12-13_20h45_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462758/822ccd02-f3de-9ba3-61c1-2f5408523c4b.png)
②サイト内検索の追加ボタンを選択します。
(少し下にあります。)
![2022-12-13_20h49_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462758/db1c567d-e136-6e80-1db3-0cb7d55dd3ec.png)
③情報を入力します。
・検索エンジンの欄は、アドレスバーで表示される名前を入力します。
・ショートカットは、アドレスバーで入力するショートカットキーを入力します。
・URLには、各サイトの検索時のURLを入力します。
※その際に、実際の検索語句が指定される部分を「%s」にします。
例) Qiita の検索URL
https://<span>qiita.com</span>/search?q=%s
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462758/d21f789f-e4ac-10dd-06c7-1bc836e65100.png)
④追加ボタンを押して完了です。
# 使い方
・アドレスバーを選択した状態で、ショートカットを入力後、tabを押すと、下記の画像のように、サイト内検索が指定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462758/7cc162e1-666d-b5f6-0dc2-fce9f0e27669.png)
・上記の状態でenterを押すと、先ほど登録したサイト内検索が行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/462758/a6a439d0-c086-dbbf-9aa5-60923b0c1d0c.png)
# まとめ
・chromeのサイト内検索の設定をするした上で、ctrl + l のショートカットと併用すると、マウスを触れずにサイト内検索が行えるようになります。
・キーボードから1秒も手を放したくない人は是非！