OmniAICreator/Qiita-1.07M huggingface dataset:
if,else問題

指定された複数の引数をそれぞれの条件で四則計算するプログラムを実装します。

問題
以下の仕様を満たすメソッドnumを作成しましょう。

- メソッドの実引数として「1以上の正の整数」を3つ用意し、それぞれを仮引数a,b,c としてnumメソッド内で使用する
- 第一引数と第二引数は足し算をし、変数abに代入する
- 第三引数が3以下の場合は変数abを第三引数の値で割り、結果を出力する
- 第三引数が4以上の場合は変数abを第三引数の値で掛け、結果を出力する
※小数点以下の出力は考慮しなくてかまいません。


```ruby:雛形
def num(a, b, c)
  # ここに条件式を実装する
end

# 呼び出し例
num(1,5,3) 
num(1,5,5)
```
```:出力例
出力例
num(1,5,3) → 2
num(1,5,5) → 30
```

```ruby:解答例
def num(a, b, c)
  ab = a + b
  if c <= 3
    puts ab / c
  else
    puts ab * c
  end
end

# 呼び出し例
num(1,5,3)
num(1,5,5)
```

自分の解答も解答例と同じでした。
しかし、解答中にターミナルで実行したときに
```:ターミナル
syntax error, unexpected '<'
  if c =< 3
```
とエラーの指摘がありました。
解答のif c <= 3 この部分をif c =< 3 と記述していました。恥ずかしいミスをしてしまいました。


```:解説
def num(a, b, c)
  ab = a + b       # 第一引数と第二引数を足したものを変数abに代入
  if c <= 3        # 第三引数が３以下の場合
    puts ab / c    # 変数abを第三引数の値で割り、出力する
  else             # 第三引数が引数が4以上の場合、
    puts ab * c    # 変数abをabを第三引数の値で掛けたものを出力する
  end
end
```
配列に格納された数値の合計値を算出するプログラムの実装

配列に格納された3つの数値の合計を算出するプログラムを実装します。

- 配列に格納された3つの数値の合計を出力する
- ただし、同じ数値が2つ以上含まれている場合、その数値は合計する要素に含めない


```rb
def lone_sum(ary)
  # 処理を記述
end

# 呼び出し例
lone_sum([1, 2, 3])
```
```:出力例
lone_sum([1, 2, 3]) → 6
lone_sum([3, 2, 3]) → 2
lone_sum([3, 3, 3]) → 0
```

```ruby:解答例
def lone_sum(ary)
  # 配列から、重複しない要素のみ取り出す
  uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end

  # uniq_nums配列内の合計
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
end

# 呼び出し例
lone_sum([1, 2, 3])
```

回答が長いので、分けて見ていきたいと思います。

```
uniq_nums = []
  ary.each do |num|
    count = 0
    ary.each do |i|
      if num == i
        count += 1
      end
    end
    if count < 2
      uniq_nums << num
    end
  end
```
ここでは、「重複しない値のみ取り出す」という処理を行なっています。
ary.each do |num|　→ aryを変数numにして1, 2, 3を繰り返しています。
ary.each do |i| → aryを変数iにして1, 2, 3を繰り返しています。
それぞれに対してnum = i　...つまり重複したとき、countが増えます。

if count < 2
重複した値が1つのときだけ、uniqu_nums配列に値を追加しています。


```ruby
  sum = 0
  uniq_nums.each do |unique_num|
    sum += unique_num
  end
  puts sum
```
ここでは、「uniq_nums配列内の合計」を求める記述をしています。
sum += unique_num
今回の場合、sum = 1 + 2 + 3 = ６　という式で答えが出力されます。
5才息子「エンジニアならUS配列、当たり前でしょ!?」

## エンジニアはUS配列一択？

エンジニアをしていると、一度は`USキーボード`に憧れるときがあるのではないか。

巷ではよくエンジニアはUS配列の方が向いていると言われている。

`なぜ`そんなにエンジニアに`US配列が推されているのか`見ていきたいと思う。



## JIS配列のメリット・デメリット

![jis-layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/e9912db6-67ae-b4e3-704a-160c68215a48.png)


### メリット
- 日本国内でPCを買う場合は、JIS配列がデフォルトなので、`入手しやすい`
- 日本語入力時のモード切り替えがシンプルでわかりやすい
- 現在がどんなモードであろうと、キーの`かな`と`英数`のどちらかを押すだけで確実に切り替えできる
- returnキーが大きくて押しやすい
- PCやキーボードを売る時に、需要が大きい(`リセールバリューが落ちづらい`)
- 仕事で支給されるのはほぼ`JISキーボード`

### デメリット

- かな文字が書いてるため、`ゴチャゴチャ`していてデザイン性は良くない
- US配列に比べて`記号が押しづらい`

## US配列のメリット・デメリット

![us-layout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/fadfbf6c-90bf-0633-5439-9d2892003054.png)

### メリット

- キートップは、英語のみ記載されているので、`デザイン性がスッキリしておしゃれ`
- `deleteキーやspaceキーが大きく`て押しやすい
- ホームポジションがだいたい真ん中になっている
- 記号が打ちやすい

### デメリット

- US配列は入手しづらい(基本的にオンラインショップ)
- 仕事はほぼJISキーボードのため、持ち込んで設定変更する必要がある

## エンジニアにはUS配列が推されている理由

1. 記号の配置が合理的でムダがない
    
    プログラミングをしていたら「’」,「"」「;」「:」を入力する機会はとても多いはず
    US配列だと、これを右小指の1つ右のキー1つで打てる

2. ホームポジションがだいたい真ん中になっている
    
    JISは少しだけホームポジションが中央からずれている。
    それに比べてUSはしっかりホームポジションが中央になっている。そこも美しい。

3. Enter、BackSpaceが近い

    入力頻度が高いキーがホームポジションからあまり離れないで押すことができるのはめちゃくちゃ効率的である
    割とここが一番大きいメリットじゃないか


## 最後に

以上のことから、
エンジニアはUS配列（英字配列）を使うことはかなりアリではないか

もちろんその人ごとの環境にもよるが、
職場のPCの設定を変えれば、外付けのUS配列キーボードも使えるし
US配列を選択肢に入れることを考えてもいいと思う。

結果、私はHHKBのUS配列キーボードに収まった。

---

（上）HHKBのJIS配列
（下）HHKBのUS配列
![hhkb-jis-us-20031301.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/987057/9aa019c8-2f35-6241-19f0-2f934985434f.jpeg)
Google Cloud Professional Data Engineer 認定資格 を取得しました

# はじめに
業務で関わり始めているため、取得してみました。

# Google Cloud Professional Data Engineer とは
[この辺](https://cloud.google.com/certification/guides/data-engineer?hl=ja)を参照ください。

# 教材
1. Udemy:[【最短攻略】Google Cloud 認定 Professional Data Engineer 模擬問題集](https://www.udemy.com/course/google-cloud-professional-data-engineer-s/)
    - 問題集です。
    - 150問(50x3)です。
    - 有名な問題集のようで、似たような問題がありました。ここを完璧に抑えていれば6-7割は取れると思います。
    - ただ、解説が正解についてしか記載が無く、不正解の理由が無いため、不十分に感じました。誤答(解説文の内容と正答があっていない)の若干ありました。
1. Udemy:[Google Cloud Professional Data Engineer Practice Tests](https://www.udemy.com/course/slg-google-cloud-professional-data-engineer-practice-tests/)
    - 問題集です。英語となります。
    - 100問(50x2)です。
    - 上記問題集だけでは心細いので、こちらも試してみました。上記問題集とは問題は重複しておらずやりがいはあったかと思います。但し、テストのためだけであれば不要かと思います。
1. [Data Engineer 模擬試験](https://docs.google.com/forms/d/e/1FAIpQLSd4j4bcgbYenBRFIL6Kb0cvXp13qCQ-z6JzowgDxRaPITn56g/viewform?hl=ja&utm_source=cloud.google.com&utm_medium=referral)
    - 公式の模擬試験です。25問です。
1. [Google Cloud 認定の準備: クラウドデータエンジニア プロフェッショナル認定証 日本版 プロフェッショナル認定証](https://www.coursera.org/professional-certificates/gcp-data-engineering-jp)
    - 公式のオンライントレーニングです。
    - 6つのコースを纏めており座学＆演習がメインです。
    - 各Googleのサービスを学ぶことができるため、サービスを知らない場合は、上記問題集を試す前にこちらを先に受けておいた方が良いと思います。
    - 動画が大量でボリュームが多く、まともに進めるとかなりの時間を要するため、私は動画を2.5倍速で見ていました。

# 結果/感想
今回も自宅で受けました。Googleのオンライン試験は、早朝しか空いていないことが多いため、早起きして受けました。
問題内容としては、上記問題集を完璧に理解していれば6-7割は確実に取れると思います。AI系はほんの少ししかありませんでした。
時間配分としては30-40分で1周し、20分で見直し、計1時間で終えています。
ABC281回答メモ

0.はじめに
　Cまではすぐに解けたけど、DはACもらえませんでした。
　でも、いつもよりCまでが早かったせいか、レーティングは
　30upしました。


1.A - Count Down
　単純にforを回す問題
　カウントダウンなところと、Nと0を出力するところが
　若干気にするところでした。　

　https://atcoder.jp/contests/abc281/submissions/37141394


2.B - Sandwich Number
　文字列Sが以下のチェックを潜り抜けた場合のみYesを出力
　1)Sの長さが8である
　2)Sの1文字目と8文字目がチェックリスト1(A-Z)の中にある
　3)Sの2文字目がチェックリスト3(123456789)の中にある
　4)Sの3～7文字目がチェックリスト2(0123456789)の中にある
　ちょっと力技でしたが、回答の速さを優先しました。

　https://atcoder.jp/contests/abc281/submissions/37147996

3.C - Circular Playlist
　最近のC問題にしては簡単で拍子抜けしつつ、AC
　【考え方】
　　1)TをリストAの合計で割った余りをchkTにセット
　　2)曲リストの秒数を変数nowAに足していく
　　3)nowAがchkTを超えた曲をAiとする
　　　nowAからchkTをマイナスした値を変数songにセット
　　　ansにAiの秒数から、songを引いたものをセット
　　4)Aiの順番と、ansを出力

　https://atcoder.jp/contests/abc281/submissions/37154006

4.D - Max Multiple
　TLEだったDPで解くしかなさそうだなーと思いつつ
　頑張りましたが、時間切れ。
　結局解説を見るとDPで解いていたので
　やっぱりいい加減DPを使いこなせるようにならないとな・・・。

　【考え方１】
　　単純に数列からK個抽出した場合の組み合わせを
　　itertools.permutationsで列挙し、合計をリストに格納
　　→格納したリストを大きい順にDで割り切れるかをチェック
　　　→案の定TLE
　【考え方２】
　　permutationsをcombinationsで試す
　　→LTEが4つ減るだけ
　【考え方３】
　　列挙して合計をリストに格納する時点でDで割り切れるか判定
　　→LTE減らず
　【考え方４】
　　なぜか、抽出リストの和ではなく、積と考えて
　　頓珍漢な解法に進んでいき時間切れ・・・。

　DPを学んで出直します。

以上
【React】頑張って全部の型を書かないで

## はじめに

世の中がTypeScriptファーストになってきたので、React×TypeScriptで開発しているチームも多いと思います。

Reactには型を全部自分で書かなくていいようにUtil Typesを作ってくれてます。

今回はよく使うやつを紹介していきます

## 子コンポーネントのProps

子コンポーネントのPropsを入手したいとき、親に同じpropsを書いたり、子コンポーネントのtypeをexportしたりするコードをちょくちょくみます。

こんな時に使うのが、`ComponentPropsWithoutRef`（refを必要とする場合は`ComponentPropsWithRef`）。

```tsx
import { ComponentPropsWithoutRef } from "react";
import { Name } from "./Name";

type Props = {
  name: ComponentPropsWithoutRef<typeof Name>;
};
```

めちゃくちゃ簡単に子コンポーネントのPropsの型を入手できます。
簡単というのもそうですが、子コンポーネントのPropsが変わった時に親は変えなくて良いというのがいいですね。

## children

コンポーネントがchildrenを受け取りたいことがあるかと思います。
React v17までは、FC（Functional Component）という型にchildrenが暗黙的に含まれるという仕様でしたが、React v18からは削除されたので、明示的にchildrenを受け取るかどうかを書く必要があります。

この時

```tsx
import { ReactNode } from "react";

type Props = {
  children: ReactNode;
};
```

としてしまうパターンをよくみます。
こちらもReactが`PropsWithChildren`という型を用意してくれているので使うのが良いと思います。


```tsx
import { PropsWithChildren } from "react";

type Props = PropsWithChildren<{ name: string }>;

export const Profile: FC<Props> = ({ name, children }) => {

}
```

## まとめ

今回はReact×TypeScriptでよく使う型について紹介しました。
型周りもよく修正が入るので、常にチェックが必要ですね。（地味に書き換えるの大変なんですよね、、汗
Actions でスロット・フィリングを構成する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/c5a5f1ed-8016-ebcf-d74f-a6bae523baae.png)


Dialog には、必要な情報が得られるまで自動で何度も聞き返してくれるスロット・フィリング機能がありますが、Actions に関しては、マニュアルやチュートリアルを見ても、スロットという用語さえ出てきません。スロット・フィリング機能は提供されていないのでしょうか？

**スロット・フィリング機能がない**場合、**不足情報を判定**し、**聞き返す処理**を組み込まなくてはいけなくなります。

# 意味深な記述
オンライン・マニュアルの[ステップをスキップするか、常にステップを要求するか、ステップを要求しない](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step)を読んでいたら、こんな記述を見つけました。

『顧客応答は特定のステップに関連付けられていますが、アシスタントは**アクション実行中**に**任意の時点で必要な情報を認識**できます。 デフォルトでは、**ステップの値がユーザー入力で既に指定されている場合、そのステップはスキップされる**ように設定されます。 』

どうも、これが<font color="DeepSkyBlue">**スロット・フィリング機能に相当**</font>していそうです。

それともう 1 つ、こんな記述もあります。

『**ステップの後に値が指定された場合**は、ステップ自体で指定された値が**新しい値に置き換え**られます。』

Dialog もサポートしていますが、Actions でも、<font color="DeepSkyBlue">**一度埋まったスロットを言い直しで変更**</font>できそうです。

早速、試してみます。

# スロット・フィリング相当機能の確認

Preview のデバッグ機能を使いながら確認してみます。

「マルゲリータのピザを注文」と入力してみます。
**ピザの種類**の聞き返しをスキップし、サイズを聞いています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5be2475d-0820-cfa7-483f-7c74a2fc4c2b.png)
「マルゲリータでMサイズのピザを注文」と入力してみます。
**ピザの種類**と**サイズ**の聞き返しをスキップし、配達時刻を聞いています！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/73892110-02f6-c9be-f09b-cd6f22a8680b.png)
「マルゲリータでMサイズで15時でピザを注文」と入力してみます。
**ピザの種類**、**サイズ**、**配達時刻**の聞き返しをスキップし、一気に注文内容の確認に飛びました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/5dd50e01-f00a-4951-b6e0-07affe476cdb.png)

Actions ではスロット・フィリングの定義を意識させずとも自動的にスロット・フィリング機能が働く事がわかりました。

Actions は Dialog に比べて、少ないステップで対話フローを構成できるように設計されていますが、スロット・フィリング機能をこんな自然な形で実装しています。

さらに、Actions では、**常に確認する(誤認識の回避)** と **確認しない(冗長的な質問をスキップ)** の追加オプションの設定が可能です。詳しくはオンライン・マニュアを参照ください。

#### オンライ・マニュアル: 顧客から情報を収集
* [常に確認する](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step-always-ask)
* [確認しない](https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step-never-ask)

# 一度埋まったスロットを言い直しで変更

「マルゲリータでMサイズで15時でピザを注文」と入力すれば、一気に注文内容の確認に飛びました。
ここで「やっぱりシーフード」と入力してみます。
上の方のステップで確認した内容がちゃんと変更されました。
ステップの構成(条件)や順番に手を加える事なく、言い直しを受け付けてくれるのはとっても便利ですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/390ad1e0-ff88-2eb5-e848-a1a8f51ff2fa.png)


# いかがでしたでしょうか

Actions にもちゃんと**スロット・フィリングに相当する機能**がありました。
従来の Dialog スキルに慣れた人にとっては、気が付きにくかったのかもしれませんが、わかってしまえば、この仕掛けは対話フローの作成を楽にしてくれると感じました。

# 参考

## 公式オンライン・マニュアル: ステップをスキップするか、常にステップを要求するか、ステップを要求しない
https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step

## 公式オンライン・マニュアル: 常に確認する
https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step-always-ask

## 公式オンライン・マニュアル: 確認しない
https://cloud.ibm.com/docs/watson-assistant?topic=watson-assistant-collect-info#collect-info-skip-step-never-ask
アドベントカレンダー完走した感想  -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

本記事は[モブプロ開発を行っているチームでやっている取り組み Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mob_torikumi_example)の25日目の記事です

今回は初めてアドベントカレンダーに参加して1人でカレンダー25日をすべて埋めた理由やモチベーションなどをまとめていきます。これをもってアドベントカレンダーは最後となります

# 前回

https://qiita.com/Sicut_study/items/618060a0fc90b6b138d1

# アドベントカレンダーを完走してみて

25日分の記事を約1カ月ほど11月の中旬から書いたのですが、率直に言うと「大変だった」です

最初の数日は特に大変で、25個も書かないといけないという先の長さになかなか進みませんでした
分量も多かったのでなるべく毎日少しずつ書いていくようにしました

5日目の記事が終わるころには書くモチベーションが少しずつ湧いてきました
そこで朝会社に出社したタイミングで毎日20分ほどで1本書き上げるのを続けていきました

最初書くのはやはり面倒だなと思うことはありますが、毎日書くという習慣ができるとそこまで辛くはありませんでした
周りにも1人アドベントカレンダーに挑戦している人が何人かいましたが、アドベントカレンダーのテーマがぶれてしまうと書くことが思いつかずになかなか進まないという悩みがあってようなので、モブプログラミングのチームでやった取り組みというテーマにしたのはかなり書きやすかったと思います

2022年のアドベントカレンダーは1人で完走すると以下のプレゼントが全員に配られます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/c6b42476-4b26-62f0-c47d-485bc939dd00.png)

キータンのぬいぐるみとTシャツ、そしてステッカーすべて欲しいものだったのでがんばりました
果たしていつ届くのか楽しみに待っていたいと思います

# おわりに

今回はアドベントカレンダーをやってみての感想をまとめておくだけなので、かなり短い記事になりました
ここまで25の記事を読んでいただいた方ありがとうございました

購読者も30人近くいてとてもうれしかったです。次回やるかはプレゼント次第かなというところですが、機会があればさらにアジャイル周りの取り組みの話ができればと思っています
【ログ】AtCoder Beginner Contest 136 B - Uneven Numbers

# 問題文
>整数 N が与えられます。N 以下の正の整数のうち、(先頭に 0 をつけずに十進法で表記したときの) 桁数が奇数であるようなものの個数を求めてください。
# 入力と出力
>N

>N 以下の正の整数のうち、桁数が奇数であるようなものの個数を出力せよ。
# ACコード
```
#include <bits/stdc++.h>
using namespace std;

int main() {
    int N;
    cin >> N;
    int counter = 0;
// 全探索でiの桁数が奇数か調査
    for(int i = 1; i < N + 1; i++) {
        if (1 <= i and i <= 9) {
            counter++;
        }
        else if (100 <= i and i <= 999) {
            counter++;
        }
        else if (10000 <= i and i <= 99999) {
            counter++;
        }
    }

    cout << counter << endl;
}
```

# つまずいたところ
```
int N;
    cin >> N;


    int counter = 0;
    for(int i = 0; i < N; i++) {
        string fact = i;
        if(fact.size() % 2 != 0) {
            counter++;
        }
    }

    cout << counter << endl;
``` 
この問題は桁数が奇数のものの個数を数えるということだったので、最初はカウンタ変数iをstringとして受け取り```string.size() % 2 != 0 ```がtrueの場合、counterを増やすように設計しようとした。が、C++では単純に代入ではint型をstring型に変更できなかったので、ループにしたときintカウンタ変数を使うことができなかった。

C++は敷居が高いとか聞いてたけど、こういうことなのかとPHP、Pythonをメインで使っているヤマダは思った。

最終的に、ACコードのように、Nまでカウンタ変数をしらべ、それが制約上限の100000のうち、奇数の桁であるかを計測する方針で実装した。

（20221211 追記）
### C＋＋にも型キャストなるものがあることがわかった。
記述方法は
```(型)値 ```
https://atcoder.jp/contests/apg4b/tasks/APG4b_y
>ただし、int型からstring型への変換のように、数値型以外への変換は基本的にはできないということに注意してください。

👆ただ、やはりこのやり方では無理そう。
### to_string関数を使えばint→stringへの型変換ができる
```  int number = 100;
  string s = to_string(number);
```

# ACコード（別パターン）
```
#include <bits/stdc++.h>
using namespace std;
 
int main() {
	int N;
    cin >> N;
	
    int counter = 0;
    for(int i = 1; i < N+1; i++) {
// to_string関数使用。
        string fact = to_string(i);
        if(fact.size() % 2 != 0) {
            counter++;
        }
    }
 
    cout << counter << endl;
  }
```
【Next.is】Middlewareを使いましょう

## はじめに

Next.jsの人気がすごいですね。
実サービスで使っている人も多いかと思います。

そんなみなさんにNext.jsのMiddlewareを使いましょう。

という話をします。

- ABテスト
- 静的ページだけど、ちょっとだけパーソナライズ
- アクセスコントロール
- etc...

色々なものに活用できる技術です。
是非みていってください

## Next.jsのmiddlewareとは？

Next.jsの`v12.2.0`からstableになった機能です。

リクエストが完了する前に実行されます。
つまり、SSRであればgetServerSidePropsが動くより前に完了するし、SG（SSG）であったとしてもページのキャッシュがユーザーに変えるより先に実行されます。

## Middlewareの魅力

### 1. エッジサーバーで動作すること

これは**Vercelにデプロイしたら**という前提が入ってしまいますが、Middlewareはエッジサーバーで起動します。

ユーザーにより近い距離で、かつオリジンサーバーのリソースを食い潰すことなく動きます。
日本からしかアクセスのないサービスであればパフォーマンス面でめちゃくちゃ大きい恩恵があるというわけではないと思いますが、アクセスが集中した場合なども考えるとオリジンサーバーに負荷なく動くというのはとても魅力的かなと思います。

### 2. 静的コンテンツをパーソナライズできること

1にも絡んでくることですが、Middlewareはエッジサーバーで動作します。
CDNにキャッシュされたコンテンツより先に動作します。

つまり、静的コンテンツをパーソナライズすることが可能になったりします。

やりすぎ注意かと思いますが、静的コンテンツをちょっとだけパーソナライズしたいとか、振り分けしたい場合にはとても強力になるかと思います。

### 3. 全ページに対して一気にサーバーサイドの処理がかけれること

個人的にはこれが一番気に入ってます。
Next.jsを使っていると、サーバーサイドの処理を書くのがきついなぁと毎回思ってました。

アクセスコントロールなどはマイページ配下全体にかけたかったりするのに対し、各ページのgetServerSidePropsに書く必要があり、処理が漏れたり、下手なコードを書いてしまうと怖い、、

という気持ちがありました。

Middlewareは特定ページに対し、一気にサーバーサイド処理をかけれるため気に入ってます。

## どうやって使うの？

`pages/`配下に`middleware.ts`を置くことで動作します。

引数にNextRequest、返り値にはNextResponseを必要とします。

```ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  return NextResponse.next()
}
```

## Cookieの制御

他のサーバーサイドの処理と同様、`request`に含まれているので、以下のようにすればアクセスできますし、`response`へセットすれば次のリクエストからcookieを保持したリクエストで来てくれます。

```ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

const AB_TEST_KEY = 'ab'

export function middleware(request: NextRequest) {
  const ab = request.cookies.get(AB_TEST_KEY)?.value

  const response = NextResponse.next()

  if (!ab) {
    response.cookies.set(AB_TEST_KEY, createAB())
  }

  return response
}
```

## リダイレクト

`NextResponse.next()`ではなく、`NextReponse.redirect()`を使います

```ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'

export function middleware(request: NextRequest) {
  return NextReponse.redirect(new URL('/about-2', request.url))
}
```

## 特定のページだけMiddlewareを適応

configという名前のオブジェクトをexportすれば良いです

```ts
export const config = {
  matcher: ['/about/:path*', '/dashboard/:path*'],
}
```

正規表現が使えるので、特定のページ以外に適応したいときはこんな感じ

```ts
export const config = {
  matcher: [
    '/((?!api|_next/static|favicon.ico).*)',
  ],
}
```

## まとめ

いかがでしたでしょうか？
新しい機能なのでまだあまり文献もなく、ベストプラクティスがわからなかったりしますが、こんなことやってみたよというのをまた投稿してみたいなと思います。

あと、調べつつわからなかったことの共有しておきます。

上に出てきた、`NextResponse.next()`について。
`next()`という響きから、middlewareをチェインすることができるっぽい雰囲気がとてもしますが、その文献が見つからなかった。

https://github.com/vercel/next.js/blob/689626c6a4d509fe04aaf82c9971a5928669bcf4/packages/next/server/web/spec-extension/response.ts#L64
をみると、`x-middleware-next`というCookieを格納しているので、これにより何かチェインできたりするかもしれない（誰か知ってたら教えてください :bow:
ロボティクスで考える知能処理分類

　ネットワークをやられている方ならＯＳＩ参照モデルというのをご存じと思います。最下層に物理層があり、最上層にアプリケーション層があり、全部で７つの階層の処理構造になっているモデルです。最下層の物理層はハードウェアそのものであって、それに近い下層ほどそのハードウェアの仕様に対応した具現的な処理を行います。最上層のアプリケーション層はメールやブラウザなどといったＰＣアプリケーションソフトウェアそのものであり、それに近い上層ほどソフトウェアからの要求に対応した抽象的な処理を行います。

　同じようにＡＩなどにおける知的処理についても、処理抽象度に沿った階層的な構造として解釈できないか？と考えてみました。その検討をまとめてみた結果が下図の通りです。

![スライド1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2354740/c77d2f3f-357f-2249-e2c1-04468f9589f8.png)

　例えば物をどのように持つか、自転車の乗り方、タイピングの仕方など、私ら大人の人間がそれまでの長い年月をかけて「体で覚えたもの」というのは確実にあると思います。これは一般的に「非陳述記憶」と言われているものですが、脳科学的には人間の小脳に記憶されると言われています。

　この記憶部分、制御部分をパッケージングして新たなロボットコントローラとして実現できないか？と考えています。できればニューラルネットワークを使ったニューロコンピュータとしての構成で。

　もし興味があれば下記のグーグルドライブから特許第６７９２１３２号公報をご参照ください（けっきょく宣伝になってすみません＾＾；）。

https://drive.google.com/drive/folders/1ssSvSvTbGnMy_DinqSmxWdfBvh_QUpqi?fbclid=IwAR0-PIUyRqkJh-T58Gbp_bkNIpEwg5eVHXsOsFpy0bQGRDrZAh-kwdenz28

　以上
2022年に「空中配線LEDマトリクス」を作る

# はじめに
Makerぽいことをしようと、色々考えたところ、動くものより、光り物や鳴り物に興味があるので、光り物を作ってみようと思いました。
色々調べてみると、@kimio_kosakaさんの[「空中配線LEDマトリクスの作り方」](https://make.kosakalab.com/make/obaka-project/led_matrix/)というサイトを見つけました。
# 空中配線LEDマトリクス
この記事を読んでいると、「LED配列治具」を使うことできれいにLEDを配列できることがわかります。
キットを頒布されていたようですが、2013年から2014年のことのようで、2022年時点では、入手可能か不明です。
そこで、「LED配列治具」を自作することとしました。
# LED配列治具の作製
治具には、10個の穴が二列に並んでいます。
ホームページに図が掲載されているので、拡大して印刷し、穴の大きさと穴の間の距離、基板の端からの距離を測りました。
計った距離に従って、穴の位置を厚紙に書き込みます。
私は、お酒の入っていた箱を使いました。
穴は、事務用の二穴パンチで開けました。

2つの治具の内の1枚の写真を掲載します。
![WIN_20221218_08_03_56_Pro (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/43dcb92c-cfd8-bd53-55f8-5537ed60665f.jpeg)
穴が少し大きいので、穴を粘着テープで覆ったのち、テープに切れ目を入れて折り曲げています。
LEDが差し込んだ時のぐらつきが少なくなります。


# LEDを配線する
ホームページの作り方に従って、LEDの足を折り曲げます。
私は適当に折り曲げたので、はんだ付け時に苦労しましたし、見た目が汚くなりました。
折り曲げ位置を一定にするために、割りばしなどの細い角材で折り曲げ治具を作製するのがよいかと思います。
また、端に来るLEDの足は、ブレッドボードにさせるよう残しておくのがお勧めです。
完成した空中配線LEDマトリックスは次のようになりました。
![WIN_20221211_08_45_25_Pro (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/f778887c-d46e-9695-7eb4-0c79a6b9b171.jpeg)
LEDの足を適当に曲げたので、少しばらついています。
また、二つ穴パンチの穴は5 mmのLEDより少し大きいので、LEDの向きにも揺らぎがあります。

# おわりに
無かったら自分で作れという「Maker」精神の初歩の初歩を実現した「空中配線LEDマトリクス」でした。
また、リバースエンジニアリングともいうのかもしれません。
LEDのストックがまだ200個ありますので、治具を改良してより配列のきれいなLEDディスプレイを作製してみようと思います。
エラー処理についてすごく簡単にまとめてみた#1

## はじめに
エラー処理について３にパターン分けて記事を投稿する。

①Optional<wrapped>型 >>>>> 成功時は値を返し、失敗時はnilを返す
②Result<success, failure>型 >>>>> 成功時は値を返し、失敗時はエラーの値（詳細）を返す
③do-catch文によるエラー処理

今回は①について記載する。


## 詳細
- 成功時は値を返し、失敗時はnilを返す

```swift:Swift
//①Optional<wrapped>型 >>>>> 成功時は値を返し、失敗時はnilを返す
struct User {
    let id: Int
    let name: String
    let email: String
}

//対応するユーザーが存在しない場合はnilを返すようにする処理
//戻り値は構造体のUserオプショナル
func findUser(byID id: Int) -> User? {
    //配列usersにUserを格納
    let users = [
        //User.initのinitは省略できる
        User(id: 1,
             name: "山田太郎",
             email: "yamada@google.com"),

        User(id: 2,
             name: "鈴木小太郎",
             email: "suzuki@gmail.com")
    ]

    //in usersのusersはUser型
    for user in users {
        //後ろのidはfindUserの引数
        if user.id == id {
            return user
        }
    }

    //対応するユーザーが存在しない場合はnilを返すようにする処理
    return nil
}

//idを定義
let id = 1
//findUser関数をを使用する、findUserに該当するidでなかったらエラー処理する
//定数idを代入して該当するかしないかチェック（エラーチェック）
if let user = findUser(byID: id) {　
    print("Name: \(user.name)")　// idの値は1のため、こちらが出力される
} else {
    print("Error: User not fond")
}
```

- init? 失敗可能イニシャライザでエラー処理
    - 該当しなかったらインスタンス化させない

```swift:Swift
//おまけ
struct User {
    let id: Int
    let name: String
    let email: String

    init?(id: Int, name: String, email: String) {
        //文字@によって２分割する判定
        let components = email.components(separatedBy: "@")
        guard components.count == 2 else {
            return nil
        }

        self.id = id
        self.name = name
        self.email = email
    }
}

if let user = User(id: 0, name: "佐藤太郎", email: "satou.gmail.com") {
    print("Username:\(user.name)")
} else {
    print("Error: Invalid data")　// 引数emailが@によって分割されていないため、こちらのError: Invalid data　が出力される

}
```


## おわりに
修正箇所等あればご指摘ください

## 参考記事
[Apple公式placeholderTextについて](https://developer.apple.com/documentation/uikit/uicolor/3173134-placeholdertext)

[[増補改訂第3版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plusシリーズ)　](https://www.amazon.co.jp/%E5%A2%97%E8%A3%9C%E6%94%B9%E8%A8%82%E7%AC%AC3%E7%89%88-Swift%E5%AE%9F%E8%B7%B5%E5%85%A5%E9%96%80-%E7%9B%B4%E6%84%9F%E7%9A%84%E3%81%AA%E6%96%87%E6%B3%95%E3%81%A8%E5%AE%89%E5%85%A8%E6%80%A7%E3%82%92%E5%85%BC%E3%81%AD%E5%82%99%E3%81%88%E3%81%9F%E8%A8%80%E8%AA%9E-PRESS-plus%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/4297112132)
↑引用元
石川 洋資 (著), 西山 勇世 (著)
発行者：片岡 巌
出版社：技術評論社
印刷/製本：日経印刷株式会社

## 開発環境
- Xcode-13.4.1
- Swift version 5.7
【Android】Module Graph Assert プラグインでマルチモジュールを健全に保つ

# はじめに
モジュール分割することで、各機能の依存関係をクリーンに保つことができます。

ただ、**モジュール分割されたものを正しく使わなければ、簡単に依存関係をゴチャついたものにできたりもします。**
例えば `:module1` と `:module2` があり、本来の設計思想として両者が依存しないようにしたいのに、下記の1行を追加することで簡単に `:module1` から `:module2` への依存関係を作り出すことが出来てしまいます。

```gradle:module1/build.gradle
implementation project(":module2")
```

それを防ぐためには、設計思想を開発者全体に行き渡らせ、意識することが大切になってきますが、そもそも間違った依存関係を作り出せないようにできたらそれに越したことはありません。

# Module Graph Assert

モジュールの依存関係にルールを作ることができるプラグインです。

https://github.com/jraska/modules-graph-assert

ざっくり説明すると

- ホワイトリスト方式・ブラックリスト方式で、モジュール毎の依存関係を定義可能（ `allowed` `restricted` ）
    - 許可してない依存関係を作った場合にエラーになる
- 正規表現で書ける

という感じです。

今回は触れませんが、依存関係の階層の高さ（深さ？）へのルールも指定できるようです。（ `maxHeight` ）

# 使ってみる
`:app` モジュールと `:module1` `:module2` のモジュールがあり、
- `:app` → `:module1` と `:module2` の依存は **OK**
- `:module1` → `:module2` 、 `:module2` → `:module1` の依存は **NG**

としたい場合を想定します。

## プラグインを追加する

`build.gradle` `app/build.gradle` にそれぞれ追加します。

```gradle:build.gradle
plugins {
    id "com.jraska.module.graph.assertion" version "2.3.0"
}
```

```gradle:app/build.gradle
plugins {
    ...
    id 'com.jraska.module.graph.assertion'
}
```

## 定義を記述する
`app/build.gradle`

```gradle:app/build.gradle
moduleGraphAssert {
    restricted = [':module.* -X> :module.*'] // ①
    assertOnAnyBuild = true // ②
}
```
### ① `restricted`
ブラックリスト方式で `restricted` に禁止したい依存関係を定義しています。
正規表現も記述可能なので `:module1` `:module2` 相互の依存が禁止されるようになっています。

### ② `assertOnAnyBuild`
ルールのチェックタイミングの指定です。
モジュール数が多くないプロジェクトで試したところ、チェック自体は軽量な処理のようだったので `true` で指定しています。

**※ 下記のようにホワイトリスト方式でも書くことも可能です。**
```gradle
moduleGraphAssert {
    allowed = [':app -> :module.*']
    assertOnAnyBuild = true
}
```

## 試しにルール違反してみる

ルールで禁止している `:module1` → `:module2` への依存を定義してみます。

```gradle:module1/build.gradle
implementation project(":module2")
```

この状態で「Sync」してみると…

```terminal
Dependency '':module1' -> ':module2' violates: ':module.* -X> :module.*'

* Try:
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.

* Exception is:
org.gradle.api.GradleException: Dependency '':module1' -> ':module2' violates: ':module.* -X> :module.*'
	at com.jraska.module.graph.assertion.RestrictedDependenciesAssert.assert(RestrictedDependenciesAssert.kt:23)
	at com.jraska.module.graph.assertion.ModuleGraphAssertionsPlugin.runAssertionsDirectly(ModuleGraphAssertionsPlugin.kt:78)
	at com.jraska.module.graph.assertion.ModuleGraphAssertionsPlugin.apply$lambda-1$lambda-0
```

ビルドエラーになりました。 :police_car: 

# まとめ
モジュールの依存関係にルールを作ることができるプラグイン [modules-graph-assert](https://github.com/jraska/modules-graph-assert) を紹介しました。
この記事では紹介していない機能もありますので、ぜひご参照ください。

ルールを定義し、マルチモジュールプロジェクトを健全に保ったまま素敵なアプリを作っていきたいですね。

# 参考
- https://proandroiddev.com/module-rules-protect-your-build-time-and-architecture-d1194c7cc6bc
- https://www.droidcon.com/2021/11/10/nail-your-gradle-build-time/
CTO協会のコントリビューターを通して学ぶエンジニア組織マネジメント

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

この記事は「Qiita x 日本CTO協会共催！あなたの自己変革について語ろう！ Advent Calendar 2022」の11日目です。

# はじめに
こんにちは。日本CTO協会（以下CTO協会）のコミュニティワーキンググループでコントリビューターをしている、[株式会社ログビー](https://logbii.co.jp/)CEO兼CTOの松田（[@AtsuMatsuda](https://twitter.com/AtsuMatsuda)）です。

CTO協会には昨年末から個人会員として参加し、現在は外向けイベントの企画・運営や、内部向けイベントの企画など、コミュニティを活性化するお手伝いをしています。

今回は、CTO協会が掲げるバリューのひとつ、 **「Think Big, Start Small / 大きく考え、小さく一歩目を踏み出す」** をテーマに、CTO協会への参加とコントリビューターを始めて、その活動や内部向けイベントへの参加を通して学んだことをアウトプットします。


# コントリビューターをして学んだこと

## CTO協会の組織マネジメント
まずCTO協会に入ってみて、有志の会員が自主的に活動をして組織が動いているというのを知りました。

有志といっても、ただ好き勝手動いているわけではなく、[理事の小賀さんの記事](https://note.com/makoga/n/nd14885d164d6)にあるように、MVV（ミッション、ビジョン、バリュー）を定め、それに紐づくOKRやKPIがあり、そこで定めた目標や指標に基づいて、日々組織を良くするために各ワーキンググループ（以下WG）が活動をしています。

私も会社組織を運営する身として、そこまで厳密に構造化してマネジメントができていたわけではないので、協会の活動自体が組織マネジメントの参考になっています。


## 他社CTOのプロジェクトの進め方
CTO協会内部にはいろいろなWGがあるので、WGに参加したり、各WGのSlackのチャネルをみるだけでも、他社のCTOがどうやってプロジェクトを動かしているかを垣間見ることができます。

### エンジニア育成WGの立ち上げ
今年の春に「エンジニア育成WG」立ち上げのためのキックオフが行われたのですが、まず「エンジニア不足」という課題があり、それに対して「エンジニアが成長するための支援」をしていきましょう、という呼びかけのもと、多くのCTOが参画して、WGが形成されていってます。

まず課題を掲げ、そこに同じ課題感をもった人を集めるというやり方は、スタートアップのやり方そのものだと思いますが、なかなか自分ではうまくできていない部分なので、非常に勉強になっています。

### コミュニティワーキンググループの細分化
コミュニティワーキンググループの役割が多岐にわたるため、今年の後半に細分化した４つのチームを作り、チーム内でやることを特化して進める形になりました。私はコミュニティの拡大を目的としたコミュニテイ拡大チームと、コミュニティ内部の活性化を目的としたコミュニティ支援チームに参加しています。

コミュニティ拡大チームの発足最初の打ち合わせで、プロジェクトマネジャーがしたことは、外向けイベント運用とSNS運用の責任者をそれぞれ決めてしまうことでした。会社のCTOをしているような人であれば、すぐに責任者ができるという前提があるとは思いますが、責任者をまず決めてしまう、というのはあまりできていなかったところなので、今後の組織運営で、しかる場面で取り入れられればと思います。

## イベント企画と開催
コミュニティワーキンググループの取り組みの中で、これまで一回だけ内部向けイベントの企画、当日の運営とファシリテーションを行いました。

テーマは、「エンジニア育成WG」の盛り上がりもあったので、「エンジニア教育について」と題して、「エンジニア育成WG」のリーダーや、その方に一緒に話したいCTOを聞いたりして、３名の方にパネルディスカッションをしていただきました。

内部向けイベントの良い点は、内部ということもあり、各社のディープな課題や取り組みを聞ける点です。このときは、「サンドイッチメソッド」などのディープな話が聞けました。

こういった企画・運営を通して、イベント企画や運営の経験を積むことができますし、ファシリテーションをすると、自分が聞きたいことをその場で経験豊富な方に聞けるというメリットもあります。


# 内部向けイベント参加で学んだこと

イベントに参加した中で特に良いと思ったトピックを、箇条書きでシェアします。

#### チームビルディング
- 自然に正しい方向に向かうようにテックビジョンを定める
- 1つのチームの人数を少なくして責任感を醸成する（1チーム5〜7人まで）
- 人の相性を重視（優秀な人同士がよいとは限らない）
    - タイプを見極める
- 組織が大きくなる前にマネジャーを育てて体制を作る
    - リーダー研修、マネジメント研修でテクニカルなところは身につく
    - マネジャの教育は大変で時間かかる

#### キャリア設計
- プレイヤーをやりたいのか、マネジャーをやりたいのか、それらのキャリアの先を見せる
    - マネジャー以外のキャリアパスも用意する
    - マネジャーの仕事が魅力的に見せる工夫をする
- プロダクト開発の成果はボラティリティがあるので、マネジャーの給与が高いというロジックは成り立たない
- リーダーはビジョン、ミッションのエバンジェリストたる人がよい
    - 人が増えてくると、方向性がバラバラになるため
    - 多少テックスキルやジェネラルスキルがなくても重視
- テックリード
    - 技術がある人
- ジェネラルリード
    - 絶対価値（こうじゃなきゃだめ）で話すではなく、相対価値で語れる人

#### 採用
- キーパーソンはリストアップして数年越しで採用
    - 定期的に声をかけ続ける
- とりあえずお金を使った解決は短期的
    - 給与を安易にあげる
    - 業務委託比率を増やす

#### 事業視点の醸成
- スプリントの振り返りに事業視点を取り込む
    - KPIをみて施策を検討
    - 競合の動き方のチェック

# 最後に
今後もCTO協会でコントリビューターとして寄与しながら、自社の組織マネジメントにも活かして良いサイクルを回して行ければと思います。

コミュニティ拡大チームでは、今回ご紹介したようなナレッジをCTO協会の内部に留めるだけでなく、外部に発信していく活動に取り組んでいきますので、ご期待ください！


最後まで読んできただき、ありがとうございました。
DockerでLibreOffice Basicマクロを実行する（2022年版）

これは [LibreOffice Advent Calendar 2022](https://adventar.org/calendars/8295) 11日目の記事です。

---

2年前の Advent Calendar でこういうのを書きました。

<!-- DockerでLibreOffice Basicマクロを実行する - Qiita -->
https://qiita.com/sonota88/items/1deb7dc3cb37d0484a5e

ひさしぶりにこれをやってみたら動かなくなっていました。詳しく調べられていませんが バージョン 6.x と 7.x の間のどこかで挙動が変わったみたいです。




# おさらい

まずは何をやっていたかを簡単におさらい。詳しくは上記の記事を参照してください。

(1) LibreOffice 本体のユーザ管理のマクロの領域に動かしたい LibreOffice Basic のソースを格納する

(2) 格納したプログラムを以下で実行する

```bash
libreoffice \
  --headless --norestore --nologo --nofirststartwizard --nolockcheck \
  "vnd.sun.star.script:Standard.${mod_name}.Main?language=Basic&location=application"
```



# 対策

エラーメッセージが出るわけでもないので途方に暮れてしまったのですが、あれこれ試した結果、次のように引数でファイルを渡すと動くことが分かりました。

```bash
libreoffice \
  --headless --norestore --nologo --nofirststartwizard --nolockcheck \
  blank.ods \
  "vnd.sun.star.script:Standard.${mod_name}.Main?language=Basic&location=application"
```

ためしに空のファイルを渡してみたところ、空のファイルでも動きました。ただ、ここは LibreOffice で開けるファイルを渡しておいた方が無難でしょうね。あらかじめファイルを用意しないといけないのは面倒ですが。

また、ユーザの操作を待ち受けるモードに入ってしまうのか、勝手に終了してくれないので `StarDesktop.terminate()` で明示的に終了させる必要がありました。場合によっては外部からプロセスを kill する方式でもよいかもしれません。


# これで動きました

## Dockerfile

- ベースイメージを変更: 18.04 → 22.04
  - これは上記の動作しない問題とは無関係だと思いますが、あわせてバージョンを上げておきました
- libreoffice-calc のバージョンを明示的に指定

```dockerfile
FROM ubuntu:22.04
RUN apt-get update \
  && apt-get -y install --no-install-recommends \
    libreoffice-calc=1:7.3.7-0ubuntu0.22.04.1 \
  && apt-get clean \
  && rm -rf /var/lib/apt/lists/*

  # ~/.config/libreoffice 以下を生成
RUN libreoffice --headless --terminate_after_init

WORKDIR /root/work
```




## sample.sh

- libreoffice コマンドの引数にファイルを追加
- `StarDesktop.terminate()` を追加

```bash
escape_xml() {
  cat \
    | sed -e 's/&/\&amp;/g' \
    | sed -e 's/"/\&quot;/g' \
    | sed -e "s/'/\&apos;/g" \
    | sed -e 's/</\&lt;/g' \
    | sed -e 's/>/\&gt;/g'
}

print_basic_src() {
  cat << BAS
Sub Main
  Dim fid As Integer
  fid = Freefile
  Open "/tmp/output" For Binary Access Write As fid
  Put(fid, 1, CStr(Time()) & Chr(10))
  Close fid
  StarDesktop.terminate()
End Sub
BAS
}

user_bas_dir="${HOME}/.config/libreoffice/4/user/basic"
mod_name=Module1
mod_file="${user_bas_dir}/Standard/${mod_name}.xba"

cat << XML > ${mod_file}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
  <script:module
    xmlns:script="http://openoffice.org/2000/script"
    script:name="${mod_name}"
    script:language="StarBasic"
  >
    $(print_basic_src | escape_xml)
  </script:module>
XML

libreoffice \
  --headless --norestore --nologo --nofirststartwizard --nolockcheck \
  blank.ods \
  "vnd.sun.star.script:Standard.${mod_name}.Main?language=Basic&location=application"

cat /tmp/output
```

## イメージのビルドと実行

```bash
  # イメージをビルド
docker build -t libreoffice-basic:2022 .

  # 実行
docker run --rm -v "$(pwd):/root/work" libreoffice-basic:2022 bash sample.sh
```

次のように時刻が表示されればOKです。

```terminal
$ docker run --rm -v "$(pwd):/root/work" libreoffice-basic:2022 bash sample.sh
Warning: failed to launch javaldx - java may not function correctly
10:59:40 PM
```
抽象クラスについて3分で理解する

## 概要
abstractやprotectedなどが出てきて?となったので物凄いシンプルなコードで理解できるようにまとめてみました。

## 抽象クラス (abstract class)とは？
> abstractは抽象クラスを作成する時に宣言します。
抽象クラスとは直接インスタンス化(new)することができず、必ずスーパークラスとして利用することを保証するものです。
抽象クラス内のメソッドにもabstract宣言を行うことができます。

引用元: [サバイバルTypeScript](https://typescriptbook.jp/reference/object-oriented/class/abstract-class)
上記解説通りなのですが、今回はこれについて深掘りしたいと思います。


## サンプルコード
```typescript:sample1.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}
// Cannot create an instance of an abstract class
const user = new Parent({name: bob, age: 30})
```
「抽象クラスのインスタンスを作成できません」と言われてしまったので新しい継承クラスを作りたいと思います。


```typescript:sample2.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}

// Non-abstract class 'Children' does not implement inherited abstract member 'age' from class 'Parent'.
class Children extends Parent {
  public name = 'bob';
}

const user = new Children()
console.log(user)
```

上記のエラーを見ると「非抽象クラス 'Children' は、クラス 'Parent' から継承された抽象メンバー 'age' を実装していません。」と言われてますね。言葉通りなのでageを追加してみます。

```typescript:sample3.ts
abstract class Parent{
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  public name = 'bob';
  public age = 30;
}

const user = new Children()
// 30
console.log(user.age)
```

表示されました。これで解決なのですが、Childrenクラスのpublicをprotectedしたらどうなるのでしょうか・・・？

```typescript:sample4.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;
}

const user = new Children()
// Property 'age' is protected and only accessible within class 'Children' and its subclasses.
console.log(user.age)
```

「プロパティ 'age' は保護されており、クラス 'Children' とそのサブクラス内でのみアクセスできます。」とのことらしいです。
(サブクラスとは継承先のクラスのこと)
つまりChildrenやParentのカッコ外ではアクセスできないということですね。色々解決方法はあると思いますが、一番簡単なのは下記の方法ですね

```typescript:sample5.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;

  public getAge(): number{
    return this.age
  }
}

const user = new Children()
// 30
console.log(user.getAge())
```

Parentクラスに関数を追加するという手段もできます
```typescript:sample6.ts
abstract class Parent {
  protected abstract name: string;
  protected abstract age: number;

  public getAge(): number{
    return this.age
  }
}


class Children extends Parent {
  protected name = 'bob';
  protected age = 30;
}

const user = new Children()
// 30
console.log(user.getAge())
```


抽象クラスって言われると少し難しいように感じますが、短いコードで色々試してみるとちょっとはわかった気がします！
初心者のチップ部品のはんだ付け

# はじめに
電子工作を続けていると、スルーホール部品ではなく、表面実装はんだ付けを行う機会が増えてきます。
初心者は、入手した基板と回路図だけではどの大きさのチップ部品を使用するかの判断に戸惑います。
そこで、表面実装はんだ付けトレーニングキットです。
# 表面実装はんだ付けトレーニングキット
Amazonなどで、「表面実装」、「SMD」、「はんだ付け」などのキーワードで検索するといくつか見つかります。
私は、次のキットを使用しました。
![61HfqX3T6XL._AC_SX679_.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/b513824f-20da-b8ff-279c-cb4fa72bfd86.jpeg)
[Generic-SMDコンポーネント溶接練習ボードはんだ付けスキルトレーニングキット](https://www.amazon.co.jp/Generic-SMDコンポーネント溶接練習ボードはんだ付けスキルトレーニングキットトランジスタ/dp/B083753TCV/ref=sr_1_3?__mk_ja_JP=カタカナ&crid=365KQELBNDUFC&keywords=Generic+SMD&qid=1670710398&sprefix=generic+smd%2Caps%2C200&sr=8-3)

Generic（ジェネリック）との記載からわかるように、特許が切れているのか、複数の同様なキットが公開されています。
このキットの良いことは、複数のチュートリアルが公開されてる点です。
# 参考にしたページ
Instractableに、「[SMD Soldering Practice Kit, or How I Learned to Stop Worrying and Love the Cheap Chinese Kit](https://www.instructables.com/SMD-Soldering-Practice-Kit-or-How-I-Learned-to-Sto/)」と題した、回路図、パーツリスト、組み立てて順、はんだ付けの注意点を掲載したサイトがあります。

また、Youtubeには、「[SMD Soldering Practice Kit | OOOHH!](https://www.youtube.com/watch?v=BO0hOvlTohs&t=1603s)」と題した、実際にはんだ付けを行っている動画が公開されています。
# 使用した道具
私は太陽電器産業gootのはんだごてを使用していたので、こて先を「R-48BC」に付け替えました。
ハンダには、0.6 mmの太さのものを用いました。
薄黄色の液体状のフラックスを用いました。
部品運搬のためにピンセットを用いました。
基板上で部品を動かすために、割りばしの先に縫い針を取り付けた道具を用いました。

# 完成しました。
これらのサイトの情報を事前に確認してからチップ部品をはんだ付けすると、スムーズに作業を進めることができます。
![WIN_20221211_07_38_02_Pro (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/4342f86b-480a-afe2-4632-edf167232653.jpeg)
わたしのキットのLEDはすべて赤色で、見本のように様々な色で光ることはありませんでした。
また、写真をよく見てもらったらわかるように、「0402」サイズのチップのはんだ付けの練習は行いませんでした。
写真には、写っていませんが、LEDの向きを間違えて、光らない箇所があります。

裏面は部品の種類と大きさの早見表になっているので、電子工作後も役に立ちます。
![WIN_20221211_07_54_23_Pro (2).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693019/0a730cc8-2ba5-afed-b58b-8def7cb350f2.jpeg)

# おわりに
今回の練習は、MC68000CPUで動作するシングルボードコンピュータを作成するためです。
練習より難易度は高いですが、落ち着いて作業すれば、問題なさそうです。
作製したシングルボードコンピュータの詳細は、また別の機会に紹介します。
![WIN_20221211_07_54_23_Pro (2).jpg](https://i.ebayimg.com/images/g/QBYAAOSw4tRfHU4O/s-l500.jpg)
上記は、これから作製する基板です。
英単語四択クイズアプリの写経

# はじめに
この記事は、[Power Apps Advent Calendar 2022](https://qiita.com/advent-calendar/2022/powerapps)  12月11日担当分の記事です。

初投稿、初アドベントカレンダーです。
よろしくお願いいたします。

# 今回のお話
今回のお話は、[Akiraさん](@akira_365)と[くろさん](@eigogakuto)、[ようさん](@Yo_8One)が主宰されていた 『Power Platform 学習アプリ作成会』 に参加させていただきて、ほぼ写経しながら作成した子ども向けの英単語学習アプリのご紹介です。
イベントで学んだ内容と気づいたことなどをまとめます。

# アプリの概要
基本的には、イベントで作成されていた「英単語四択クイズアプリ」を一緒に作成しています。

## イベント情報
くろさんのイベント記録：[市民開発者.com](https://bitzemi.space/citdev/learning_apps_group_11/)
あきらさんのYouTube：[マグロの生態 Akira ちゃんねる](https://www.youtube.com/@user-ow6ix7um4v)

## 小学生用に変更した点
我が家の子どもたちが使えるように、変更した点は以下の通りです。
1. 出題は画像
2. 4択の解答選択肢は英単語と読み方
3. 全問正解の時「よくできました！」

### お詫び
写経が間に合っているのは、『Power Platform 学習アプリ作成会』の #5 あたりまでです。

# 変更点の詳細
1. 出題は画像
データソースのSharePointリストに1列挿入し、画像列としました。体の部位、動物、乗り物、文房具など、子どもたちにとって身近なものの画像と英単語の組み合わせを登録しました。
画像と英単語の問題作成には、こちらの [ちびむすドリル英語](https://happylilac.net/card.html) を活用させていただきました。

![スクリーンショット_20221211_073212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206908/4195fd9b-9089-605a-8da3-6cc76360ac17.png)


2. 4択の解答選択肢は英単語と読み方
なるべく英語そのままの表現を残したかったので、スペルは英語表記、読み方をカタカナで示しました。

3. 全問正解の時「よくできました！」
イベントの最終回で、くろさんも実装してらっしゃいましたが、子どもたちのフィードバックに応えて、全問正解の時は「💮」画像が出るようにしました。やっぱり嬉しいそうです😊

![スクリーンショット_20221211_074155.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1206908/4cd40820-c28b-52eb-8873-90b05e7eba7d.png)


# 今後取り組みたいこと
- 写経の続き
イベントの半分くらいまでしかできていないので、最後まで写経をしたいです。

- 読み方音声
読み方をカタカナで表記していますが、できれば、音声で学んで欲しいと思うので、仕掛けを考えたいです。

# 気づきなど
### 感想

- [Akiraさん](@akira_365)と[ようさん](@Yo_8One)の説明がとてもわかりやすく、変数、関数、委任などわかっていたつもりで曖昧だった箇所が、腑に落ちました。
- IF関数がExcelとはすこし違うことを知らなかったです。違いが理解できました。
- ポップアップ画面やギャラリーの大きさの設定方法が、デザインの作り方が新鮮でした。

### アイディアを参考に作ったアプリ
- あまりのある割り算アプリ
こちらはかーでぃさん主催のハジメの一歩会で紹介した、小学3年生向けの計算アプリです。資料はこちら ➡ [あまりのある割り算アプリで総復習](https://www.docswell.com/slide/5LM24Z/edit)

- 計算カードアプリ
こちらは、小1向けの計算アプリです。こちらはどこかでで紹介します。

# 最後に
本当に素敵なイベントをありがとうございました。
次のシリーズを楽しみにしております。
それまでに、写経を終わらせます。。。
Scratchで簡単なゲームを作る Part 3

## はじめに

この記事はQiita株式会社の行っている小学校向けの出張授業の内容を記事化したものになります

- プレスリリースの記事
    - [日本最大級のエンジニアコミュニティ「Qiita」が小学生向けプログラミング教育を支援](https://corp.qiita.com/releases/2022/09/school-visit-20220927/)

こちらはシリーズ記事になります
前回の記事はこちら

https://qiita.com/kiitan/items/c0bf592f69fedba87932

### ゲームを改造しよう

ここでは授業内でEX課題として例示している改造の内容を解説していきます


#### つかまえた時に音をならしたい
ヒント 音のコードブロックがある

![スクリーンショット 2022-12-11 7.07.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/65a880da-9906-b6da-1eea-bd6db67d2898.png)

画面上部の音のタブを開きましょう
画面左下の音尾選ぶから好きな音を選びましょう

![スクリーンショット 2022-12-11 7.07.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/d9281889-c546-e5ed-48ec-6c5609570bfb.png)

好きな音をクリックすることで音のコードブロックで利用することができます

![スクリーンショット 2022-12-11 7.14.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/71f9f2af-d379-155e-5f17-37518346b88c.png)

最後に Bat のスプライトのどこかえ行くのコードブロックの下に〇〇の音を鳴らすを追加しましょう


#### キャラクターをジャンプさせるには？
ヒント: 上矢印キーをおした時0度に向かって10回くり返し動かすと...?

スペースキーが押された時にジャンプする

上にだんだん上がった後に下にだんだんさがるとジャンプしたような動きを再現することができます
だんだんという動きを作るのに今回使うのが制御のコードブロックの〇〇回繰り返すのコードブロックを利用します

ではまずはスペースキーが押された時のコードブロックを置き動きのコードブロックの0度に向けるを組み合わせす
そして10歩動かすを10回繰り返すように制御のコードブロックの〇〇回繰り返すのコードブロックと10歩動かすを組み合わせます

![スクリーンショット 2022-12-11 7.29.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/c58f807d-aa96-59e2-2288-4a15ecee742c.png)


コードができたら実際にスペースを押して動きを見てみましょう
キャラクターが上に向いて動きますが向きが変わってしまいました
これもPart1で使った回転方向を左右のみにするのコードブロックを使うことで上を向かないようにします

![スクリーンショット 2022-12-11 7.31.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/7ea4fad8-b226-cb80-813f-490131885a70.png)

上にあがる動作の作成は完了したので同じように下に下がる動作を追加しましょう
上がる動作と反対にすればいいので向きを180度に向けて同じように10回10歩動かすコードを追加します

![スクリーンショット 2022-12-11 7.36.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316631/6c77f090-042b-be4f-c9ba-0e5bf4aa9587.png)

これでジャンプの動きが完成です
オブジェクト指向に関して勉強するのに役立った講座

私がオブジェクト指向を勉強するにあたって役立った講座三部作を書く。
これらの講座を作ったのはピーコック アンダーソンである。

* [オブジェクト指向の原則１：単一責務の原則とオープンクローズドの原則](https://www.udemy.com/course/objectfive1/)
* [オブジェクト指向の原則２：リスコフの置換原則と継承以外の解決方法](https://www.udemy.com/course/objectfive2/)
* [オブジェクト指向の原則３：依存関係逆転の原則とインタフェース分離の原則](https://www.udemy.com/course/objectfive3/)

これらを学ぶと、オブジェクト指向において陥りがちなミスに対して、適切に対応することが可能である。

よくありがちなミスが、Aという具象クラスを継承して拡張し、Bというクラスを作るというもの。これのどこがまずいかというと、BはAとしても振る舞える必要がある(リスコフの置換原則)が、それが壊れるからである。

こういう問題が起きないパターンとしては、Aがインタフェースであるか、抽象クラスであり、かつAの具象メソッドをオーバーライドしていない場合である。この場合、Bに期待されるのは、Aの抽象メソッドがこう振る舞うべきであるという規定通りに動くことである。

```python
from abc import ABC, abstractmethod

class A(ABC):
    """抽象クラス"""
    @abstractmethod
    def f(self, i: int) -> int:
        """整数に何らかの加工を行って返します."""
        pass

class B(A):
    """具象クラス"""
    def f(self, i: int) -> int:
        """整数に2倍して返します."""
        return i * 2

c: A = B()
print(c.f(3))
```

例えば、これはこの原則に従えば正しいことは明らかだろう。ところが、例えばAが具象クラスであり、fがiを3倍して返す関数だったとしたらどうだろうか？容易に想像がつくが、3倍して返す関数であるという挙動を想定してプログラムを組んでしまい、容易に破綻するのである。

ほかにも、抽象に対してプログラミングすべき、という規則もある。全部具象クラスで組むのであれば、継承という概念は無意味であるのだから当然である。

例として、DbStorageというクラスはIStorageというインタフェースを実装しており、データベースに接続して値を取得して返す仕組みであるとする。この場合、DbStorageは具体的にデータベースに接続して値を取得するわけだが、DbStorageに依存して組んでしまうと、データベースに接続しないとテストもできないし、データベースの中身に応じて動きが変わってしまうなどの問題が発生する。このため、MockStorageという、別のIStorageを実装したクラスを用意して、IStorageの想定通りに振る舞うようにすると、テストがやりやすくなるため、非常に便利になるのだ。

もしかしたら少し上級者向けかもしれないが、受けてみるのは一つの手段だろう。
GitHub へのプッシュのときの認証のための personal access token を生成する手順のメモ

# はじめに

GitHub に プッシュ（`git push`）する際にパスワードの代わりに使用する **personal access token** を生成する手順について、ステップごとのスクショで確認します。

https://github.com/

**personal access token** には以下の２種類があります。（記事を書いている 2022/12/11 現在）

- fine-grained personal access token
- personal access token (classic)

（これまでの personal access token (classic) から、 fine-grained personal access token へ切り替わっていくのだと思われます。）

今回は、 **personal access token (classic)** を生成するステップを確認します。



## 目次

1. [メールアドレスを確認する（メール認証）](#1-メールアドレスを確認するメール認証)
1. [Settings をクリックする](#2-settings-をクリックする)
1. [Developer settings をクリックする](#3-developer-settings-をクリックする)
1. [Personal access tokens → Tokens(classic) をクリックする](#4-personal-access-tokens--tokensclassic-をクリックする)
1. [Generate new token(classic) をクリックする](#5-generate-new-tokenclassic-をクリックする)
1. [Note にトークンの名前を入力する](#6-note-にトークンの名前を入力する)
1. [Expiration（トークンの有効期限）を選択する](#7-expirationトークンの有効期限を選択する)
1. [Scopes（付与するスコープ）を選択する](#8-scopes付与するスコープを選択する)
1. [Generate token（トークンの生成）をクリックする](#9-generate-tokenトークンの生成をクリックする)
1. [トークンを使用する](#10-トークンを使用する)


# ステップ

ステップは公式ドキュメントに書いてあるので、公式ドキュメントのとおりに進めて、ステップごとにスクショを貼り付けてまとめます。

https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

## 1. メールアドレスを確認する（メール認証）

※ 完了していれば作業なし

https://docs.github.com/ja/get-started/signing-up-for-github/verifying-your-email-address

## 2. Settings をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/1958e162-6d04-2d96-ee32-61f130996937.png)

## 3. Developer settings をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/df906337-f805-f755-9ae0-ce3cae7940ef.png)

## 4. Personal access tokens → Tokens(classic) をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/2e16ff8a-0c4c-e7db-d1bd-9ec5895ced02.png)

## 5. Generate new token(classic) をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/289b3bdb-347e-9d27-d8a9-3bed357b6b7d.png)

## 6. Note にトークンの名前を入力する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/25fc865b-7af0-6880-8699-71a44f629b6c.png)

## 7. Expiration（トークンの有効期限）を選択する

## 8. Scopes（付与するスコープ）を選択する

## 9. Generate token（トークンの生成）をクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/0abec7cf-9482-4093-cafd-03f9c5fd3a9f.png)

Generate token をクリックすると、トークンが生成されます。

## 10. トークンを使用する

生成されたトークンは、 GitHub へのプッシュのときのパスワードとして使用します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/527226/a2716bb3-511b-0d59-60e7-56df17f137a3.png)

# おわりに

GitHub に プッシュ（`git push`）する際にパスワードの代わりに使用する **personal access token** を生成する手順を確認しました。

ありがとうございました。
Web キャプチャ について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。[垂直タブ について知らなかったこと - Qiita](https://qiita.com/e99h2121/items/2a212baf12ba83511557) に引き続いて Edge にあるもう一つを書いておく。

Webキャプチャ。

https://4thsight.xyz/24329#Web%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3

> Webページ全体を画像ファイルとして保存したい場合、拡張機能やブラウザの開発者ツールを利用する方法が一般的ですが、Edgeブラウザなら「Webキャプチャ」機能を利用することで、メニューからWebページ全体のスクリーンショット（画面キャプチャ、スクショ）をカンタンに撮影することができます。

> 撮影方法は簡単で、スクリーンショットを撮りたいWebページを表示している状態で、ページ内を右クリックして、メニューから「Webキャプチャ」を選択します。（ショートカットキーなら「Ctrl＋Shift＋S」を押します。）

ただのスクリーンショットでは... ？ と思いきやちょっと便利なのが

こちらは普通のスクリーンショット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/806668d4-7a68-aa1c-ebfb-517041ef3310.png)

... に対してこちらが Web キャプチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/e35577cf-1de7-54e4-70a3-74875035c95c.png)

引用: [SQL Server - Connectors | Microsoft Learn](https://learn.microsoft.com/ja-jp/connectors/sql/)
そう、ページをスクロールしてキャプチャできるのである。

実用したことはまだ無い。でも便利だと思う笑。以上今年私が知らなかったことでした :snowflake:
アウトプット駆動開発でがんばる個人開発

# 個人開発は進まない

　基本的に、個人開発は対するモチベーションはあまり湧かない。やらなくても誰も困らないためだ。
「まぁ、だれも何も言わないしいいか」
「今日はちょっと気分が乗らないからいいか」
「体調がすぐれないからいいか」
　そうやってだらけてしまう恐れがある。これはよくない。


# アウトプット駆動開発のすすめ

　そのため私はアウトプット駆動開発を取り入れた。強制的に発表の場を設けてしまって、そのためになんとか帳尻を合わせよう！という手法だ。例えば、まだ開発途中だけど何かのコンテストに応募してしまうとか。コンテストは大袈裟でも、勉強会のLTに「個人開発でつくったもの」という表題で登壇を予約してしまうのもいい。予約してしまったら、あとはつくるしかない。

　こうやって締め切りを設けると意外となんとかなるのだ。

# 質が落ちる？　そうだね

　時間に追われてやってるようじゃ、開発の質が落ちるのでは？

　そうだね、そのとおり。でもこれは個人開発。とりあえずデプロイして、とりあえず効果を確認していかないとなにも始まらない。あと、人間って締め切り間際までなにもやりたがらない性質だから、結局は何も変わらない気もする。

　というわけで、アウトプットしながら開発を進めたい。


https://github.com/kyokucho1989/lytnote
新規メンバーのオンボーディングで気をつけていること

## 初めに

新しいメンバーが参画すると、どうしても馴染むまで時間がかかります。
ドメイン理解や、プロダクト説明や、各種環境などなど通常実施することは、実施した上で
気をつけて実施していることを紹介します。

- チームになれる
- 既存メンバーの開発方法を知る
- 新規メンバーの開発方法を知る

## チームになれる

自己紹介や、顔合わせは必ず実施しますが、オンラインでの参画も増えてきているので
それ以上の関係性を築くことができないことも多いです。

そのため、雑談をする場を設けるようにしています。

## 既存メンバーの開発方法を知る

既存メンバーは、それぞれ工夫をして効率良い開発をしているものです。
このノウハウを早い段階で共有することで、立ち上がりをスムーズになります。

## 新規メンバーの開発方法を知る

なぜここで躓くのってところで、時間がかかっていることも多いです。
また、初めての環境だからこそ気づく点や、今までの知見からチームにない新たな手法を用いている場合もあります。
既存、新規でナレッジシェアをすることでより高め合っていくことが可能になります。
業務で使っているsplunkについて

# 1,はじめに
　お疲れ様です。
　初めての投稿になります。現場に配属になってから約四ヵ月になります。
　私の現在行っている業務はキャパシティプランニング業務を行っております。
　キャパシティプランニング業務でsplunkというツールを使っているので紹介したいと思います。
![splunk1](https://www.splunk.com/content/dam/splunk2/images/social/D2E-social.jpg)

# 2,splunkについて
　splunkとは総合的なログ分析プラットフォームソフトウェアです。
　簡単に説明すると、必要なログデータを抽出してグラフにし可視化するものです。

![splunk2](https://jpn.nec.com/soft/splunk/images/splunk.jpg)

# 3,splunkの機能
　Splunk の機能は大きく分けて、下記の3つの主要コンポーネントに分割されます。

　1.**サーチヘッド ( Search Head )**・・サーチとレポート機能
　　①サーチ依頼（ユーザーが）
　　②サーチ内容をIndexerに指示
　　③Indexerからサーチ結果を受信
　　④複数Indexerからのサーチ結果をマージして表示

　2.**インデクサー ( Indexer )**・・インデックスとサーチサービス
　　①Indexerは受け取った情報をキューイング
　　②キューイングされた内容に対して、イベントに分割しメタ情報を抽出
　　③イベントをインデックスに書き出し

　3.**フォワーダー ( Forwarder )**・・データ収集および転送機能
　　①Forwarderが元データに対する変更を検知して読み込みキューイング
　　②キューイングされた内容をキューイングする

# 4,splunkを可視化するには
　Splunkはsplunk独自の言語**SPL**を使用してSPL文を作成し、
　splunk機能で色々なグラフを選択・時間帯の指定をして初めてグラフができるようになります。

　先ほど出たSPLに関して3つほど紹介します。
　・**timechart**
　　時系列に統計をとるコマンド。
　　span= オプションで時間間隔を指定可能。単位は s（秒） m（分） h（時間） d（日）。
　　timechart span=5m（データによって時間刻みが違う場合があります）

　・**eval**
　　計算するためのコマンド。
　　| eval (計算式)

　・**predict**
　　splunkが過去データから未来予測してくれるコマンド。
　　下記の画像のようになります
![splunk3](https://docs.splunk.com/images/thumb/b/b9/7.1.0_SearchRef_predict1-compressor.png/800px-7.1.0_SearchRef_predict1-compressor.png)


# 5,おわりに
　紹介としては以上になります。
　まだまだsplunkについては、機能についてやSPLコマンドは知らないことが多いので
　これからまた知識をつけられたらいいなと思います。

　最後までご覧いただき、ありがとうございました。