OmniAICreator/Qiita-1.07M huggingface dataset:
[interactions.py] Discord Botの作り方 #04 - Embed

# はじめに
この記事ではinteractions.pyというモジュールを使用してDiscord Botを作りたい人向けです。

#04ではEmbedについて解説していきたいと思います。

# Embedを作る
では実際に作っていきましょう。
```python
embed=interactions.Embed(title="Title", description="Description", color=0xfdc700)
embed.add_field(name="テスト1", value="Test1", inline=True)
embed.add_field(name="テスト2", value="Test2", inline=True)
embed.add_field(name="テスト3", value="Test3", inline=True)
await ctx.send(embeds=embed)
```
こちらがEmbedのプログラムですが、このプログラムをいちいち書いたりするのはめんどくさいですよね？
そんな人には「[Discord Embed Generator](https://cog-creators.github.io/discord-embed-sandbox/)」です。
こちらのwebサイトでは簡単にEmbedが作れます。では実際に作っていきましょう。

## Webサイトを使って作る
Webサイトを開くとこの様な画面が出てきます。
![96553CE5-B686-44D7-B222-8C05A8ABC132.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/55a1bdf0-6735-66a7-65f7-0bc216bbed80.jpeg)
使い方はとっても簡単で、自分の追加したい項目をそのまま書き込むだけです。
![5575EC0D-3172-4F38-AB78-2DF83F36484C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/7ee56a97-bd3a-816f-d935-b412c3c85694.jpeg)
試しにこんな感じにしてみました。下の方に行くとプログラムがあるのでそれをコピペして貼り付けましょう。
```python
embed=discord.Embed(title="テスト", description="説明をここに入力する", color=0xfdc700)
await ctx.send(embed=embed)
```
自分はこの様な感じになりましたが、このままではまだ動きません。
動く様にするには `embed=discord...` の部分を `embed=interactions...` に変え、 `embed=embed` を `embeds=embed` に変えれば動きます。
```python
embed=interactions.Embed(title="テスト", description="説明をここに入力する", color=0xfdc700)
await ctx.send(embeds=embed)
```
これでやっと動きます。f5を押して実行してみましょう。
![6B521574-F9F6-45B3-9EA5-D9071FFA64C9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/8a63f9d2-3b69-779a-5ab2-ebf8782a9b0c.jpeg)
このようにEmbedが送信されたら完成です。お疲れ様でした。

# 最後に
今回はembedについて解説しました。
次回はSlashCommandの応用などについて解説していきたいと思います。

もし分からないところがあれば Azusa#5812 に気軽にDMしてください。

# Discordサーバー

この度、bot開発者が話し合えるようなDiscordサーバーを開設しました！
ぜひ見に来てください！

https://discord.gg/nxBsFDgbFJ
簡単な計算を行うRubyプログラムの作成

二桁以上の整数を入力すると、十の位と一の位の数字の足し算、十の位と一の位の数字の掛け算をそれぞれ行い、最後に2つの結果を足し合わせて出力するプログラムをRubyで作成してください。2桁の数字以外が入力として与えられた場合を考慮する必要はありません。

```:sample.rb
> 二桁の整数を入力してください
> 15

# 1 + 5と 1 * 5をそれぞれ計算

> 足し算結果と掛け算結果の合計値は11です
```


```:雛形
def addition(a, b)
  # 10の位と1の位の数字に対して、足し算を行う

end

def multiplication(a,b)
  # 10の位と1の位の数字に対して、掛け算を行う

end

def slice_num(num)
  # 10の位の計算

  # 1の位の計算

end

puts "二桁の整数を入力してください"
input = gets.to_i

X, Y = slice_num(input)
#  additionメソッドにX,Yを引数として渡し、処理結果を変数add_resultに代入する。

#  multiplicationメソッドにX,Yを引数として渡し、処理結果を変数multiple_resultに代入する。

puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"
```
上記雛形を使って、解答して行きます。




```:解答
def addition(a, b)
  a + b
end

def multiplication(a,b)
  a * b
end

def slice_num(num)
  # 10の位
  tens_place = (num / 10) % 10
  # 1の位
  ones_place = num % 10
  return tens_place, ones_place
end

puts "二桁の整数を入力してください"
input = gets.to_i

X, Y = slice_num(input)
add_result = addition(X, Y)
multiple_result = multiplication(X, Y)

puts "足し算結果と掛け算結果の合計値は#{add_result + multiple_result}です"
```


### 部分的に見ていきます

```
def addition(a, b)
  a + b　　　       # 10の位(a)と１の位(b)の数字を足す計算式
end

def multiplication(a,b)
  a * b     　　   # 10の位(a)と１の位(b)の数字を掛ける計算式
end
```


```
def slice_num(num)
  # 10の位
  tens_place = (num / 10) % 10
  # 1の位
  ones_place = num % 10
  return tens_place, ones_place
end
```

tens_place = (num / 10) % 10
2桁の数字が35だったとします。
この計算式に当てはめて計算をすると、
(35 / 10) % 10 = 3 となります。

integerは整数のため、答絵に小数点は含みません。
35 / 10　= 3
3 % 10 = 3

ones_place = num % 10
35 % 10 = 5

```
X, Y = slice_num(input)
add_result = addition(X, Y)
#  additionメソッドにX,Yを引数として渡し、処理結果を変数add_resultに代入

multiple_result = multiplication(X, Y)
#  multiplicationメソッドにX,Yを引数として渡し、処理結果を変数multiple_resultに代入
```
Pythonでイテレータメソッドチェーン

実用的ではないと思います。ただやってみたかっただけです。

JavascriptやRustではおなじみのメソッドチェーン。例えばRustだとイテレータメソッドをひたすらつなげることができます。

```rust
    let v: Vec<i32> = (0..10)
                        .map(|x| x + 2)
                        .filter(|x| x % 2 == 1)
                        .map(|x| x * 2)
                        .collect();
    println!("result is {:?}", v);
    // 出力は以下のようになる
    // result is [6, 10, 14, 18, 22]
```

これをPythonで普通に書くとこんな感じ。

```python
    v = list(
        map(lambda x: x * 2,
            filter(lambda x: x % 2 == 1,
                map(lambda x: x + 2, range(10))
            )
        )
    )
    print(f'result is {v}')
    # 出力はRust版と同じ
    # result is [6, 10, 14, 18, 22]
```

これはこれで全然いいんですけど、読みやすさのために改行＋インデントでフォーマットしていくと、やたらとインデントが深くなってしまうのがちょっと嫌。あと先に適用する関数を後ろに（より内側に）書くのがメソッドチェーンの場合と逆センスなのも少しだけモヤっとする。

ということで、こんな感じのクラスを定義。

```python
from collections.abc import Iterable
from typing import Callable, List


class DotChain(Iterable):
    def __init__(self, it: Iterable):
        self._it = it

    def __iter__(self):
        return self._it.__iter__()

    def map(self, op: Callable):
        return DotChain(map(op, self._it))

    def filter(self, op: Callable):
        return DotChain(filter(op, self._it))

    def collect(self) -> List:
        return list(self)

```

すると、メソッドチェーンっぽく書けるようになる。

```python
    v = DotChain(range(10)) \
          .map(lambda x: x + 2) \
          .filter(lambda x: x % 2 == 1) \
          .map(lambda x: x * 2) \
          .collect()
    print(f'result is {v}')
    # 出力はRust版、Python版と同じ
    # result is [6, 10, 14, 18, 22]
```

改行をエスケープしないといけないのだけれど、書き方的にはかなりJavascriptやRustに近づいた。

はい、それだけです。
JSPの条件分岐(if)

JSPでのif文。基礎中の基礎なのですが、実務で一瞬つまずいたので備忘録。
##  if
```jsp
<c:if test="${weight > 10}">
    重い
</c:if>
```
null判定にはempty
```jsp
<c:if test="${empty weight}">
    何も入っていません
</c:if>
```
文字列の比較には等価演算子==を使用
```jsp
<c:if test="${cat == 'ココア'}">
    ココア君
</c:if>
```

## choose
JSPにはelseはありません。複数条件の場合はchoose when otherwiseを使用します。
otherwiseは「それ以外」なのでelseに似ています。

```jsp
<c:choose>
    <c:when test="${cat == 'ココア'}">
        ココア君
    <c:when>
    <c:when test="${cat == 'トラ'}">
        トラ君
    <c:when>
    <c:otherwise>
        他の猫
    </c:otherwise>
</c:choose>
```

## var属性
条件の結果（true/false）を格納する変数。条件に一致すれば指定した変数にtrueが、一致しなければfalseが入る。下記ではflgにtrueかfalseが入る。

```jsp
<c:if test="${cat == 'ココア'} var="flg">
    <c:if test="${flg}">
        ココア君です
    </c:if>

    <c:if test="${!flg}">
        ココア君ではありません
    </c:if>
</c:if>
```

## 終わり
「elseが無いなんてjsp不便じゃん」と思いましたが、ちゃんと変わりになるものがありました。
ちょっと勉強すれば問題ないですね。
AWS Lambdaでnode_modulesを使う時のメモ

AWS LambdaでNode.jsを使っていた時にnode_modulesにあるライブラリを使おうとした時にちょっと詰まったので、備忘録として残そうと思います。

あとは、アドベントカレンダーに沿ってアウトプットの大切さを書きます。

# node_modulesの導入

## 前提条件
- npm コマンドが使える環境があること
    - ローカルマシンでも問題ありません

## 簡単な流れ
1. ディレクトリの用意
1. 必要なライブラリをインストール
1. ディレクトリのzip化
1. レイヤー登録
1. Lambda関数でレイヤー追加
1. Lambda関数のコードでライブラリを読み込む


## ディレクトリの用意
初っ端から一番大事です。作成する場所はどこでも良い（ローカルマシンでも可）ですが、ディレクトリの名前が重要です。
「nodejs」という名前のディレクトリを生成します。

```
$ mkdir nodejs
```

これについては[ドキュメント](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html#configuration-layers-path)にあります。


## 必要なライブラリをインストール
生成したディレクトリの中で、コマンドを叩いてライブラリをインストールします。

```
$ cd nodejs
$ npm i <ライブラリ名>
```

ここで、一旦nodejsディレクトリからの構成を見直してみます。
以下のようになっていれば大丈夫です。

```
nodejs/node_modules/<ライブラリ名>
```

## ディレクトリのzip化
nodejsディレクトリをzip化します。
生成するzipファイルの名前は何でもいいです。
windowsならコマンドなくてもzip生成できますが、できない環境の場合はコマンドでzip化します。


```
$ zip -r lib.zip ./nodejs
```

## レイヤー登録
生成したzipをAWS Lambdaのレイヤーに登録します。

左側のメニューから「レイヤー」を選択
![スクリーンショット1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/18ad17bf-d26a-e7eb-1ab7-210ee3ff93ab.png)

「レイヤーの作成」を選択
![スクリーンショット2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/9b2c8ceb-a22e-ee80-4eb6-fde30f6cf415.png)

必要な情報を入力します。好きな名前をつけて問題ありません。
「アップロード」のボタンで生成したzipファイルをアップロードします。
ライブラリが多くて、zipが10MBを超える場合はS3を使用すると良いみたいです。
![スクリーンショット3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/bc28aeb3-9ddc-a31a-56d3-bf22f9025757.png)

## Lambda関数でレイヤー追加
Node.jsランタイムのLambda 関数を編集する画面の一番下に、レイヤーを設定する箇所があります。
「レイヤーの追加」を選択します。

![スクリーンショット4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/ee85a333-6cc1-6780-6f65-87bb5097789b.png)


レイヤーソースは「カスタムレイヤー」を選択します。
ドロップダウンから、登録したレイヤーを選んで「追加」を押せば完了です。
![スクリーンショット5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/185028/aefb8524-7786-07c3-c678-1c4f1879b68b.png)


## Lambda関数のコードでライブラリを読み込む
レイヤーの追加までできれば、コードから読み込むことができます。
これで終了です！お疲れ様でした！

```js
const HOGE = require('<ライブラリ名>');
```


# アウトプットする理由
ここからはアウトプットの良さについて語っていきます。

個人的に一番大きいのは、自分の中で情報を整理し、保存することが出来るところだと思います。

今回私は、AWS Lambdaを使用する上で詰まって解決したところを記事としてまとめました。
対応している最中は、手探りで試行錯誤を繰り返しています。
つまり、様々な情報がごちゃまぜの状態です。

解決方法が見つかったとしても、このままアウトプットしなかった場合はどうなるか。
おそらくそのまま忘れて、次回似たような事が起こった時にまた同じことを調べると思います。

当時自分が書いたコードも、数カ月後に見れば「誰だこのクソコードを書いたのは？」と感じるように人間はすぐに忘れる生き物です。


では今回のように、Qiitaに記事として投稿したとします。
記事として多くの人に見てもらうので、記事の書き方を考えるでしょう。
（この「多くの人」というのは未来の自分自身も含まれます）

どうすれば今回の問題をわかりやすく伝えられるか、誤解を生まない文章はなにか、なにをしたら解決できたのか。
これらを考えることで今回得た情報を整理します。ごちゃ混ぜ状態だった情報が整理される訳です。

情報を分かりやすく整理し、保存することで後から振り返ったり、より理解のある人から意見をもらえたりします。

意見の交流は自分の成長に大きく繋がります。
アウトプットで自分や、他の人の成長に繋がれば嬉しいですね。
jupyterlab仮想環境構築

jupyterlabで仮想環境構築する際、カーネルへの追加方法をいつも探し回るので備忘録

参考：

https://sakizo-blog.com/13/


下記を入力で仮想環境を構築
```入力
conda create -n 名前 python=3.8 jupyterlab
```

仮想環境へ移動
```仮想環境へ移動
activate 名前
```

カーネルに追加
```
ipython kernel install --user --name=名前 --display-name=名前
```


パッケージのアップデートorバージョンを変えたい場合
```
conda update python
```
バージョン指定
```
conda install python=3.8.5
```

jupyterlab起動時のエラー
```
ModuleNotFoundError: No module named 'traitlets.utils.descriptions
```

補足
上記パッケージをインストールしようとしても、condaではそれインストールできないよと怒られる。原因はよくわからんが、下記のように再インストールで解決できる模様。
``` 
conda install -c conda-forge jupyter_client=7.1.0 jupyter_server=1.13.1  --force-reinstall
```
Elixir インストール 手順


この記事は [Elixir Advent Calendar 2022 その2](https://qiita.com/advent-calendar/2022/elixir) 11日目の記事です

# はじめに


Elixirに興味を持ち、とりあえずインストールして実行してみたいという方が、
気軽に入門できるまでを目指します。

# 実行環境

* Elixir 1.14.0
* Erlang/OTP 25
* Debian GNU/Linux 11 (bullseye)

# インストール手順

### 1. asdfのインストール

[asdf公式サイト](https://asdf-vm.com/)

asdfはバージョン管理コマンドラインツールです。
Pythonでのpyenv、Rubyのrenvに相当します。

```bash
$ git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2
```

PATHを通す

```bash
$ vi ~/.bashrc
```

```~/.bashrc
. $HOME/.asdf/asdf.sh                # 追記
. $HOME/.asdf/completions/asdf.bash  # 追記
```

```bash
$ source ~/.bashrc
```

### 2. ElixirとErlangのインストール

asdf経由でElixirとErlangをインストールしていきます。

```bash
$ asdf plugin-add elixir https://github.com/asdf-vm/asdf-elixir.git
$ asdf plugin-add erlang https://github.com/asdf-vm/asdf-erlang.git
```

Elixirのインストール

```bash
$ asdf install elixir 1.14.0
```

グローバルに設定
```bash
$ asdf global elixir 1.14.0
```

Erlangのインストール

```bash
$ asdf install erlang 25.0
```

※ パッケージをインストール必要する場合があります
```bash
$ sudo apt install libssl-dev automake autoconf libncurses5-dev
```

グローバルに設定
```bash
$ asdf global erlang 25.0
```

下記のような表示ができていれば、インストールが完了です。
```bash
$ asdf current
elixir          1.14.0          /home/pi/.tool-versions
erlang          25.0            /home/pi/.tool-versions
```

# iex

iexは対話形式でプログラムを実行できるようになるコマンドです。
Rubyのibrに相当します。

iexの起動

```bash
$ iex
Erlang/OTP 25 [erts-13.0] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit]

Interactive Elixir (1.14.0) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)>
```

Hello world

```
iex()> "Hello world"
"Hello world"
```

# インストールの後は

* 学習サイト
[Elixir School](https://elixirschool.com/ja/lessons/basics/basics/)
* 書籍
[プログラミング Elixir(第2版)](https://www.amazon.co.jp/exec/obidos/ASIN/4274226379/onelinebiz-22)
* Webフレームワーク
[Phoenix](https://www.phoenixframework.org/)
* データベース
[Ecto](https://hexdocs.pm/ecto/Ecto.html)
MappyHourのご案内

# MappyHourの始まり
2020年に始まったコロナ禍。
ずっと引き籠もる訳にはいかず、少しずつ動き出した2021年。
良くも悪くも「Withコロナ」な世界で生きている2022年。

世界中で様々なことがあり、世界は大きく変わっていきました。

今回ご紹介する「Mappy Hour」はコロナ禍を機に始めました。
当時の紹介記事は以下のブログにありました。懐かしい。

https://k-sakanoshita.medium.com/bd1a8220e33a

# MappyHourとは

Mappy Hourとは、オンライン(Slack)上で [OpenStreetMap](https://osm.org) の
マッピング成果を報告したり、コミュニケーションすることで、
楽しくマッピングを続ける「オンライン活動の場」のことです。

毎週土曜日21時から [OpenStreetMap Japan Slack](https://bit.ly/OSM_Japan) で開催中です。
初心者から熟練者、質問したい方も、ご自由にご参加ください。

成果発表では、編集した地図をSlackに掲載して下さる方も多く、
見ていて楽しくなります。日本各地の地図が見れるのは楽しい。

# 140回目を迎えて

毎週欠かせずオンライン開催し、ついに140回目となりました。
別に切りが良い数字でも無いけど、よくも続いたなと思います。

さて、「マッパーたちのオンライン活動の場」になれたのかな。
反省点というか、改善点については、多々ある気がしています。

とはいえ、マッパーの方たちの情報共有やコミュニケーションは
少しは進んだような気がします。

12/3に開催した「State of the Map Japan 2022 in Kakogawa」も、
マッパーたちがコミュニケーションを続けた成果だと思います。

# まとめ

そんな訳で [OpenStreetMap Japan Slack](https://bit.ly/OSM_Japan) で毎週土曜日の21時から
MappyHourを開催中です。みなさんのご参加をお待ちしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216230/fc39f815-f925-c0bf-45a6-84d96d0f309c.png)
QCDのQuality（品質）を上げると最終的なCost（コスト）は下がる

# QCDのQuality（品質）を上げると最終的なCost（コスト）は下がる
![qcd.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/1c4b7e49-6c41-642f-5fff-3a4bb73faf42.png)

QCDはよくトレードオフの関係で説明されますが、長い目で見ると、Quality（品質）を上げることで、最終的なCost（コスト）が下がることがわかります。今回は、その理由をご説明します。

# QCD (Quality, Cost, Delivery) についての簡単な説明
QCDは、プロジェクトの成功を評価するためによく使用される指標です。
|QCD|説明|
|:----|:----|
|Quality（品質）|プロジェクトの出来栄えや完成度を表します。|
|Cost（コスト）|プロジェクトを完成させるために必要な費用を表します。|
|Delivery（デリバリー）|プロジェクトを完成させるために必要な時間を表します。|

# Quality の影響力について
Quality は、プロジェクトの成功や失敗に大きく影響します。Quality の高いプロジェクトは、顧客やステークホルダーから高い評価を得ることができます。

また、Quality が低い場合は、プロジェクトが期限内に完了しない可能性が高くなります。
これは品質が落ちれば改修、再テストに時間が取られてそれだけプロジェクトの遅延に繋がり品質が落ちればコストが増大します。
![quality.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363845/f31c761b-8782-d55b-b420-fd5d38d50113.png)


# Quality の向上と Cost の相関関係
Quality の向上は、本当は Cost の低減につながります。また、Quality の高いプロジェクトほど遅延しないため、追加の費用がかかる可能性が減ります。

# Quality の向上のメリット
Quality の向上には、次のようなメリットがあります。
* 顧客やステークホルダーからの高い評価を得ることができる
* 期限内にプロジェクトを完成できる可能性が高まる
* 追加の費用を抑えることができる

# Quality の向上のためのアプローチ
Quality（品質） の向上を目指すためには、次のようなアプローチが考えられます。
* プロジェクトのゴールを明確にする
* 定期的なフィードバックを受けるようにする
* ステークホルダーとの協議を行う
* プロジェクトを進める上での問題を早期に検出し、解決する
* プロジェクトを進める上での必要なリソースを確保する

# 結論
結論として、IT業界のプロジェクトでは、Quality（品質）を上げることで、最終的なCost（コスト）が下がる可能性があります。品質を高めることで追加の費用などを抑え、売上や利益が増加することが期待されます。また、不具合やトラブルが少なくなるため、運用保守のコストが抑えられるため、最終的なCost（コスト）も抑えることができます。
したがって、Quality（品質）を重視することは、プロジェクトの成功につながる可能性があると言えます。

# チラシの裏
Delivery（デリバリー）を重視し過ぎるためQuality（品質）を落とし、Cost（コスト）を増大させるプロジェクトが多々あります。
増大したCostは顧客が払うか、自分（自社）などが払うかなどの問題がありますが本来スムーズに行っていたら払わないで良いCostなんです。そのCostは本来『儲け』になるはずで誰かが割を食うというのはおかしいと思います。
Deliveryももちろん重要ですが、払うCost、これから払わなければいけないCostを考えるとQualityを上げるべきだと思います。

Costを顧客に払わせるからQuality悪く炎上した方が儲かるという頭おかしい会社もいますがそういう会社には消えてもらいたいです。
Kageki (TD4互換機) で UART 通信

[TD4の命令を実行できる自作CPU「Kageki」](https://elchika.com/article/9ac9fd67-86c5-4b1b-a355-4f662e8af794/) でUART通信をしてみた。
今回は、「受信したバイトのビットNOTを送信する」という処理を行う。

# プログラム

```
位置 機械語   アセンブリ言語
--------------------------------
0    10111000 FIRST: OUT 1000
1    01100000        IN  B
2    01011000        ADD B, 1000
3    11100101        JNC START
4    11110000 DELAY: JMP FIRST
5    10110000 START: OUT 0000
6    00111000        MOV A, 1000
7    00000000        ADD A, 0000
8    01100000 LOOP:  IN  B
9    01011000        ADD B, 1000
A    00000000        ADD A, 0000
B    10010000        OUT B
C    00000001        ADD A, 0001
D    11101000        JNC LOOP
E    00000000        ADD A, 0000
F    11110100        JMP DELAY
```

0番地～4番地で、受信スタートビット検出のポーリングを行う。
5番地で、スタートビットを送信する。
6番地で、送信するビット数を設定する。
8番地で、ビットを受信する。
9番地で、受信したビットを反転する。
B番地で、ビットを送信する。
C番地～D番地で、ビットのカウントを進める。
F番地で、時間を稼ぎつつポーリングに戻る。

ポーリングの間隔は5クロック、
ポーリングでスタートビットを検出してから最初のビットを受信するまでの時間は6クロック、
1ビットあたりの時間は6クロックとなっている。


# 実行方法

1. Kagekiをセットアップする (ROMの書き込み、接続など)
2. Kagekiのクロック速度とUARTの通信速度を適切に設定する
   * UARTの通信速度をクロック速度の1/6に設定する
   * 例えば、クロック50kHz、UART 8333bps
3. UARTでデータを送信すると、ビットNOTをとったデータが送り返されてくる

# 実行結果

Kagekiのクロックを50kHzに設定し、
USB-シリアル変換器 TTL-232R ([秋月電子通商](https://akizukidenshi.com/catalog/) M-05841) および [Tera Term](https://ttssh2.osdn.jp/) を用いて8333bps設定で通信を行った。
また、[USBロジックアナライザ](https://www.switch-science.com/products/7642)を用いて通信の状況を確認した。

![接続した様子](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/27bbe96b-3192-050b-fe97-93245bb911ab.jpeg)

適当なメッセージを[CyberChefでビット反転](https://gchq.github.io/CyberChef/#recipe=NOT%28%29To_Hexdump%2816,false,false,false%29&input=aGVsbG/kuJbnlYw)してファイルに保存し、Tera Term の「ファイル送信」機能で送信した。
すると、Tera Term でビット反転前のメッセージを受信できた。
(ビット反転したメッセージをKagekiがビット反転したため、もとに戻った)

![Tera Term でメッセージの受信に成功](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/a54dcac4-2010-3fad-3e20-7ebf3037a2dc.png)

ロジックアナライザで確認すると、タイミングによってストップビットが仕様より短くなってしまっている。
ただし、今回の構成では受信への支障はなかったようである。

![ロジックアナライザでの確認結果 1](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/4475c69a-717b-404c-ea8a-a8aeec58265e.png)
![ロジックアナライザでの確認結果 2](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99656/55f3b1e7-eafe-26a7-53ce-422b15639b6c.png)

D0がパソコンからKagekiに送信した信号 (TX)、D1がKagekiからパソコンに送信した信号 (RX) である。
聴講メモ: 能動的にKotlin情報を摂取して脱初心者！Kotlin1次ソースの歩き方

講演の構成
1. 一次ソースを活用する魅力
2. 公式サイト・Github歩き方
3. 実践


# 1. 一次ソースを活用する魅力

一次ソースを活用する魅力 ＝ 早い、安い、確実


確実... 一次ソースは誤りはあれど、ちゃんと修正される。

英語を読めることはプログラミング言語を問わないメタスキル

## 「英語ってこわい」という難点

コツ
・「無理をしない、少し頑張れたら良し」 という心持ち
・隅から隅までではなく、必要な記述を抜粋して読むなど、手を抜く

## 時間かかるし、頑張る必要あるの？

技術ブログやSTOのサンプルに頼るのをやめると、理解が高まる
＝プログラミングの生産性があがるかもしれない

「木こりのジレンマ」
刃を一旦研いでから木を切る


# 2. 公式サイト・Github歩き方

## Kotlin公式ページkotlinlang.org 
特に

kotlinlang.org/docs/home.html
kotlinlang.org/docs/releases.html
play.kotlinlang.org

## Github
JetBrains/kotlin
Kotlin/kotlinx.coroutines
Kotlin serialization

## その他
issue tracker
Kotlin twitter
Kotlin community


# 3. 実践

シーン「２進数１０進数を文字列に変換する関数を知りたい！」

手順  
1. まずKotlin公式サイトの検索窓で調べる
2. 検索結果一覧の上位を見る
3. それっぽいページを開いてみる
4. ページに来たら、見るポイントを絞る
    - 関数名に注目
    - 該当しそうな関数に注目する（引数の型と戻り値の型）
    - 翻訳機能も使ってみる
5. 目的の関数らしいものが見つかったらプレイグラウンドで動作確認してみる


- **公式ドキュメントのサンプルコードには今まさに欲しい知識以外の新しい知識を得るチャンスもある**
  - ドキュメントを読んで湧いた新たな疑問「radixの範囲はどこまでなんだろう」からissue trackerで調べてみるなどしてみる

## 効率化のコツ：検索を活用する

Googleで検索ではなく
公式サイトの中で検索。

## 質疑応答

Q. ドキュメントを読んでいて必要以上の疑問が出てきたら？
A. 仕事の場合は時間の制限を設けて調べる。時間
プライベートでは際限なく心置きなく調べる。


Q. よくみる情報源はissue tracker？
A. issuetrackerは困ったら使う。
リリースノートもよく見る。「言語を作っているのはスーパーマンではなく人なんだ」「自分にも分かるところがある」という気づきが得られる


# 所感気づき


- 取り入れたいテクニック
  - 一次情報の活用法で特に取り入れたいと思ったことは**Googleでなく公式サイトを検索の出発点にすること**
  例）文字列→int変換の関数を知りたいとき
  言語公式サイトの検索窓で「string to int」で調べる
    - そもそも、公式サイトから検索を始めるなんて考え自体持ってなかった。
  - 英語のページにたどり着いたらすぐ読み始めるではなく、読むポイントを必要なところに絞る
      - 関数。戻り値の型、引数の型が何かくらいは、持っている知識だけで分かるはず。
      - ページ冒頭の段落
        - 文章量は少なめで、概要が説明されているはず。
- ↓ここ辺り、英語を勉強する動機・意義として覚えておきたい
  - > 英語を読めることはプログラミング言語を問わないメタスキル
  - > 「木こりのジレンマ」
- リマインド
  - > ・「無理をしない、少し頑張れたら良し」 という心持ち



# 講演情報

Kotlin Fest 2022  
2022/12/10


https://www.kotlinfest.dev/

https://fortee.jp/kotlin-fest-2022/proposal/fc6a61ef-0eea-46eb-9d5d-3c80714ae7cd

登壇者
Kuuさん

https://twitter.com/Fumiya_Kume


資料

https://onedrive.live.com/view.aspx?resid=8F9046875869934E!18517&ithint=file%2cpptx&authkey=!APVdVDrItOzGqvA


以上
複数gitアカウントをサクッと管理する手順メモ

## 概要
複数gitアカウントをプロジェクト別に分けて使いたい時、gitの設定方法を毎回忘れているので、備忘録として残しておきます

## ① gitアカウント用の鍵を生成する

`ssh-keygen -t rsa`

どんなファイル名で保存されるか・ssh接続時に必要なパスフレーズを求められる。
```
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/(username)/.ssh/id_rsa):id_sub_rsa 
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
```

2つアカウントを管理する場合はこの手順を2回行う。
その際ファイル名は別々のものにする。

今回は`id_rsa`と`sub_rsa`という名前で生成。
生成した鍵は`~/.ssh`に保存される。
`ls ~/.ssh`

```
config		id_rsa.pub	sub_rsa.pub
id_rsa		known_hosts	sub_rsa
```

## ② githubのアカウントに公開鍵を登録する
複数gitアカウントを運用する場合、それぞれのアカウントの設定 > SSH and GPG keysから公開鍵（.pub）を登録する

![スクリーンショット 2022-11-30 10.45.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/689205/c9552591-a91d-a40f-fb08-cf23a0d93b52.png)


## ③ ~/.ssh/configを編集
```.ssh/config
#メイン
Host github-main 
  HostName github.com
  IdentityFile ~/.ssh/id_rsa
  Port 22

#サブ
Host github-sub 
  HostName github.com
  IdentityFile ~/.ssh/sub_rsa
  User git
  Port 22
```

## ④ SSH接続する
`ssh -T github-main`

`ssh -T github-sub`

```
Hi xxxx! You've successfully authenticated, but GitHub does not provide shell access.
```

## メインアカウントをデフォルトで利用するように設定
`git config --global user.name ${メインアカウントのユーザー名}`

`git config --global user.email ${メインアカウントのメールアドレス}`


`vim ~/.gitconfig`

```
[user]
    name = ${メインアカウントのユーザー名}
    email = ${メインアカウントのメールアドレス}
```


## ⑤ 任意のプロジェクトにサブアカウントを紐づける
gitのグローバル設定ではメインアカウントが登録されているため、新規でプロジェクトを作成し,git管理を行うと、メインアカウントが利用される。

サブアカウントを利用する場合は別途設定が必要

テストプロジェクトを作成
`mkdir git-test`
`cd git-test`
`git init`

`git config --local user.name ${サブアカウントのユーザー名}`
`git config --local user.email ${サブのメールアドレス}`

`vim .git/config`

```
[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
        ignorecase = true
        precomposeunicode = true
[user]
        email = ${サブのメールアドレス}
        name = ${サブアカウントのユーザー名}
```

リモートリポジトリに紐づける場合

`git remote add origin git@github-sub:${サブアカウントのユーザー名}/${リモートリポジトリ名}.git`

`git@github-sub`とホスト名を`~/.ssh/config`で設定したサブのホスト名を指定してあげるのがポイント。
（github上でリポジトリを新規作成した時の設定コマンドをそのままコピペするとこける）


## 参考

https://qiita.com/0084ken/items/f4a8b0fbff135a987fea

https://tanacio.com/how-to-use-multiple-github-accounts/
過去一週間でいいねの合計カウントが多い順に投稿を表示する方法

---
【Ruby on rails】過去一週間でいいねの合計カウントが多い順に投稿を表示する方法
---

# 初めに
プログラミングスクールに通い始めて2ヶ月目です。
読書本シェアアプリを作っています^^
自身の忘備録として記事を更新していきます！

# アソシエーション
```ruby:user.rb
has_many :books, dependent: :destroy
has_many :favorites, dependent: :destroy
```

```ruby:book.rb
belongs_to :user
has_many :favorites, dependent: :destroy
has_many :favorited_users, through: :favorites, source: :user
```

```ruby:favorite.rb
belongs_to :user
belongs_to :book
```
userモデル,bookモデル,favoriteモデルのアソシエーションが完成しました。
has_many :favorited_users, through: :favorites, source: :user
はfavoritesモデルを介してuserモデルのデータを持ってくるという記述になります。
この解釈が正しいかわかりませんがそんな感じです。笑

# コントローラー
```ruby:book_controller.rb
def index
    to = Time.current.at_end_of_day
    from = (to - 6.day).at_beginning_of_day
    @books = Book.includes(:favorited_users).
      sort_by {|x|
        x.favorited_users.includes(:favorites).where(created_at: from...to).size
      }.reverse
    @book = Book.new
  end
```
今回はeach文でビューページに投稿された内容を一覧表示しています。
いいね数が多い順で表示させるためにコントローラー内で条件を定義してあげます。
上から順番に見ていきましょう。

```
to = Time.current.at_end_of_day
```
Time.current はconfig/application.rbに設定してあるタイムゾーンを元に現在日時を取得しています。
at_end_of_day は1日の終わりを23:59に設定しています。

```
from = (to - 6.day).at_beginning_of_day
```
()内はなんとなく分かりますね。
at_beginning_of_day　は1日の始まりの時刻を0:00に設定しています。

上記２行を要約すると
一週間分のデータとってきたよーって感じです。笑

```
@books = Book.includes(:favorited_users).
```
今までは@books = Book.all で投稿されたデータを全て取得していましたが、どうやら誰が投稿したかという情報をユーザーテーブルに毎回取りに行っているそうです。
そこで includesの登場です。先程book.rbで記述した
has_many :favorited_users, through: :favorites, source: :user
のおかげでユーザーの情報がfavorited_usersに格納されていて、includesの引数に入れてあげることで、事前にユーザーのデータを読み込ませてあげることができます。これで無駄にSQL文が発行されなくなります。

```
sort_by {|x|
  x.favorited_users.includes(:favorites).where(created_at: from...to).size
 }.reverse
```

sort_byメソッドを使っていいね数を少ない順に取り出しています。
ブロック変数 |x| を定義してあげないと、2よりも10,11の方が小さいと判定されてしまうのでこのように対処するそうです。
ただ、このままだと少ない順に表示されてしまうので最後にreverseをつけてあげましょう。
これで昇順、降順を入れ替えることができます。

sort_byではなくsortを使って記述することもできます。

```
sort {|a,b|
  a.favorited_users.includes(:favorites).where(created_at: from...to).size <=>
  b.favorited_users.includes(:favorites).where(created_at: from...to).size
 }.reverse
```
UFO演算子を使ってaとbを比較して返す記述方法です。
個人的にはsort_byの方が分かりやすくて記述も少ないので好きです。
それぞれのメリットデメリットはどうなのか把握できてないので気になる方は調べてみてください。

参考までにlink貼っておきます。

https://docs.ruby-lang.org/ja/latest/method/Array/i/sort.html

以上になります。

# 最後に
同じような場面で悩んでる方の助けになれば幸いです。
今後もゆるく投稿していこうと思います！
最後まで読んでいただきありがとうございました^^
VSCodeの拡張機能紹介

はじめに
=========
私が現在利用しているもので便利に感じている拡張機能を紹介します!
基本的にはどれもインストールするだけで機能してくれるものなのでお手軽ですし入れていない方はぜひ参考にしてください:vulcan:

今回紹介する拡張機能一覧
-------
- vscode-icons
- Prettier
- indent-rainbow
- Code Spell Checker
- Zenkaku
- tabnine


拡張機能をインストールする方法
---
拡張機能の紹介の前に、まずは拡張機能のインストール方法をご説明します。
（個人的には調べたページで完結しない資料が嫌いです。。。:innocent:）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/9c04c032-7c3d-ae96-2bed-34c58388f07d.png)

画面横にあるタブから、下記アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/efd7a116-8e64-069f-91a2-61e47dd88dde.png)

その後検索バーから検索したい拡張機能を検索し、インストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/022d568e-61d4-b323-ee05-0ea3ffcd7f0c.png)
これだけです:runner_tone2:

vscode-icons
---
VSCODE内のファイルをアイコン表示してくれる拡張機能
初期の状態だとファイルのアイコン表示がされない為視覚的に判別しにくい...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/b44ee550-7a44-dd44-525d-b60841554260.png)
このように各ファイルの頭にアイコン表示をしてくれるため、感覚的にファイルの見分けをしやすくなりますね:relieved:


Prettier
--
行がずれてしまっているコードを自動的に綺麗にしてくれる拡張機能
この拡張機能を使うことで、ファイル保存をした瞬間にコードが自動的に整えられるので、ズボラさんにはピッタリ
ただ、こちらはインストール後の設定が必要でかつ、少し手順が多いのが少しネックかな、、、
その説明は長くなってしまうので別途検索してください:sob:
冒頭で話した嫌いな資料に早速なりました。:innocent:

indent-rainbow
--
インデントスペースを可視化してくれる拡張機能
Prettierと近しい利用法になってしまうが、インデントの区別がつきやすくなり、整形を行いやすくなります。
自動で整理するより自分できれいにしたい僕はかなり助かります。
また、下記のように構文に問題があった場合も色で表してくれるためエラーを発見しやすくなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/cccf7bde-8d11-559a-74c4-3af6564e076c.png)
メインの機能はこっちな気がしますが、個人的には前者的な使い方が多いですね。:rolling_eyes:

Code Spell Checker
--
個人的に一番のおすすめ
読んで字のごとく、スペルチェックを行い、誤りがあれば指摘してくれるというもの。
構文に問題はないのになぜかエラーで動かないなんて経験は誰しもあるのではないでしょうか？
（さんざんいろんな人に相談した挙句スペルミスやんけって経験あるあるですよね？）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/6961195d-525e-bb60-0b26-d6b9d3e3d1a5.png)
こちらを入れておけば、スペルがおかしいと思われる箇所について指摘を行ってくれます。
みんなハッピーになれる最高な拡張では？:relaxed:

zenkaku
--
こちらは混ざるとエラーの原因になる全角スペースを見つけてくれる拡張機能
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/c9b26a37-1c84-9178-66e3-dd00e6c0011c.png)
とても見つけやすくなりますよね。
これもかなりおすすめですね。
構文とかではなくこういう基礎的な原因のエラーは見つけにくくて結構時間がとられがちなのでできるだけ回避したいところ。
そもそも技術力が高ければ混ざることは無いんでしょうが。。。:sob:
いやいや、弘法にも筆の誤りといいますから、油断せずに行こう:eyeglasses:


tabnine
--
入力している文字から予測で薄文字を出してくれます。
スペルミスや構文のミスを防ぎやすくなるので個人的には助かります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2252312/3532909f-e679-6bc5-67cc-a1fbfc390fa4.png)
役に立つシーンがあったかといわれるとちょっとわからないですけど。。。
縁の下の力持ち的な感じで実感できていないだけかもしれません:joy:
慣れてくると邪魔に思うこともあるかもですけど、初心者のうちは入れておいて損はないかなと！！

おわりに
--
いかがでしたでしょうか？
どれも基礎的なものではありますが、コーディングを行う上でとても役に立つ拡張機能かと思います。
なるべく読みやすい文章を書くように頑張りましたが、どうしても説明調になってしまいますね:innocent:
ご参考になれば幸いです:bow_tone2:
paiza.ioでelixir その135

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
ブロックを積め。

# サンプルコード

```


IO.puts """
<!doctype html>
<html>
  <head>
    <script src="https://rawgithub.com/nosir/obelisk.js/master/build/obelisk.js" type="text/javascript"></script>
  </head>
  <body>
    <textarea id="src">
"""
IO.puts """
    p(1, 1, 1)
    p(1, 1, 2)
    p(1, 1, 3)
"""
IO.puts """
</textarea>
    <canvas id="canvas" width="300" height="300"></canvas>
    <script>
var canvas = document.getElementById('canvas');
var point = new obelisk.Point(200, 200);
var pixelView = new obelisk.PixelView(canvas, point);
var src = document.getElementById('src');
eval(src.value);
function p(x, y, z) {
  var p3d = new obelisk.Point3D(30 * x, 30 * y, (32 + 1) * z);
    var cubeDms = new obelisk.CubeDimension(30, 30, 32);
    var cubeColor = new obelisk.CubeColor().getByHorizontalColor(obelisk.ColorPattern.getRandomComfortableColor());
    var cube = new obelisk.Cube(cubeDms, cubeColor, false);
    this.pixelView.renderObject(cube, p3d);
}
    </script>    
  </body>
</html>
"""





```

# 成果物

https://paiza.io/projects/obNIhDOLi1RN2CoF-naJaw?language=elixir


以上。
FTPサーバが「UTF-8に対応しているか」確認する方法

```bash:FTPサーバが「UTF-8に対応しているか」確認する方法
# レスポンスが「200」なら「UTF-8に対応している」
ftp> quote opts utf8 on
```


# 経緯 : 「UTF-8に対応しているか」確認したい
とっても古いFTPサーバは、UTF-8に対応していないことがあります。

> IIS 7.0 未満の FTP サービスは常に CP932 固定でしたが、
> IIS 7.0 以降の FTP サービスは、CP932/UTF8 の両対応となっています。
> [Microsoft FTP Service&#12398;UTF-8&#23550;&#24540;&#12395;&#12388;&#12356;&#12390;](https://social.technet.microsoft.com/Forums/windowsserver/en-US/20af1fcf-47bb-41f6-bca0-1c3e7f35aa06/microsoft-ftp-service12398utf8235502454012395123881235612390?forum=iis7ja)

プログラムで「UTF-8に対応していないFTPサーバ」へ接続する時は、エンコードに「CP932」を指定する必要があります。

が、どうやって「UTF-8に対応しているか」が確認できるのか？

「UTF-8に対応しているか確認する方法」を調べました。

## 「OPTS UTF8 ON」のレスポンスで確認できる
Windows10 と Windows Server 2016 からFTP接続時に自動で「OPTS UTF8 ON」が送られるようになったらしく、検索するといろんな情報が出てきました。
それらを読むと「OPTS UTF8 ON」を実行して、そのレスポンスで「UTF-8に対応しているか」がわかるようです。

制約上、今回はAWSのEC2 Instance Connectからしか接続できないのでFTPツールを使用することはできず・・・コマンドのみで確認するのですが、FTP接続後に「opts utf8 on」と打ってみたら・・・「?Invalid command」になりました。
接続先のFTPサーバへコマンドを送ることになるので「quote opts utf8 on」と打たなければならないことを知りました。

> quote
> 指定した引数をリモートマシンに送信します。「literal」コマンドと同等です。
> [quote - FTPコマンド - IT専科](https://www.itsenka.com/contents/development/ftp/quote.html)

OPTSコマンドのレスポンスは「200」「451」「501」の3種類なので、レスポンス「200」だったら「UTF-8に対応している」と判断できるようです。
OPTSコマンド自体が対応されていない場合のレスポンスは「500」か「502」だそうです。

> Response Syntax:
> 　　opts-response    = opts-good / opts-bad
> 　　opts-good        = "200" SP response-message CRLF
> 　　opts-bad         = "451" SP response-message CRLF / "501" SP response-message CRLF
> [RFC 2389:  Feature negotiation mechanism for the File Transfer Protocol](https://www.rfc-editor.org/rfc/rfc2389#section-4)

### 試してみる

```bash
# UTF-8対応FTPサーバAの場合
ftp> quote opts utf8 on
200 UTF8 set to on

# UTF-8非対応FTPサーバBの場合
ftp> quote opts utf8 on
451 Unable to accept OPTS UTF8

# UTF-8対応FTPサーバCの場合
ftp> quote opts utf8 on
200 Always in UTF8 mode.

# UTF-8対応FTPサーバDの場合
ftp> quote opts utf8 on
200 OK, UTF-8 enabled
```
paiza.ioでelixir その134

# 概要
paiza.ioでelixirやってみた。
練習問題やってみた。

# 練習問題
ドレミを鳴らせ。

# サンプルコード

```

IO.puts """
<!doctype html>
<html>
  <head>
  </head>
  <body>
    <textarea id="src">
"""
IO.puts "ドドソソララソソファファミミレレドドソソファファミミレレソソファファミミレレドドソソララソソファファミミレレド"
IO.puts """
</textarea>
    <button onclick="run()">play</button>
    <script>
var doremi = function() {
	this.audioContext = new AudioContext();
}
doremi.prototype.oto = function(key) {
	var osciillatorNode = this.audioContext.createOscillator();
	var envelopeGen = this.audioContext.createGain();
	var freq = 440.0 * Math.pow(2.0, (key - 69.0) / 12.0);
	osciillatorNode.frequency.value = freq;
	osciillatorNode.connect(envelopeGen);
    envelopeGen.connect(this.audioContext.destination);
	var t1 = this.audioContext.currentTime;
	envelopeGen.gain.cancelScheduledValues(t1);
	envelopeGen.gain.setValueAtTime(1, t1);
	osciillatorNode.start();
	var release = 0.2;
	var keyUpTime = this.audioContext.currentTime;
	envelopeGen.gain.setValueAtTime(envelopeGen.gain.value, keyUpTime);
	envelopeGen.gain.linearRampToValueAtTime(0, keyUpTime + release);
	osciillatorNode.stop(keyUpTime + release);
}
doremi.prototype.sleep = function(milliseconds) {
	var start = new Date().getTime();
	for (var i = 0; i < 1e7; i++)
	{
		if ((new Date().getTime() - start) > 90 * milliseconds)
		{
			break;
		}
	}
}
doremi.prototype.play = function(mml) {
	for (var i = 0; i < mml.length; i++)
	{
		mml = mml.replace('ァ', '');
	}
	for (var i = 0; i < mml.length; i++)
	{
		var a = mml[i];
		switch (a)
		{
		case 'シ':
			this.oto('71');
		break;
		case 'ド':
			this.oto('72');
		break;
		case 'レ':
			this.oto('74');
		break;
		case 'ミ':
			this.oto('76');
    	break;
		case 'フ':
			this.oto('77');
		break;
		case 'ソ':
			this.oto('79');
		break;
		case 'ラ':
			this.oto('81');
		break;
		default:
		break;
    	}
		this.sleep(4);
    }
}
var src = document.getElementById('src');
var doremi0 = new doremi;
function run() {
    doremi0.play(src.value);
}
    </script>
  </body>
</html>
"""



```


# 成果物

https://paiza.io/projects/rNte0bm07somZMGbDq0a6A


以上。
JTCにおけるCoEを活用したDX推進の具体策

メリークリスマス！
こんにちは。
マライヤのあの曲を聞くと「うかれるんじゃねぇよ！」と思う男です。

初めにお断りしておきます。
それっぽいタイトルを仰々しく付けましたが、そんな大した記事では無いです。
今朝、寝覚めの布団のなかで「（ぴこーん）ひらめいた！」と思いついた内容です。

真面目な内容を期待された方、ごめんなさい。
そっ閉じしていただくか、ブラウザの戻るボタンを押していただきたく、お願い申し上げます。

## 各社様のDX
「DXブーム」のご多分にもれず、某ヘイシャー（JTC）も全社で取り組んでいます。
一定規模以上の企業様では、どこも取り組みを進めている思っていたんですが、意外とそうでもないようで。
「最近DX専門の組織を立ち上げた」という所もあり、各社様の取り組みに格差が生まれつつあるようです。

DXというバズワードに踊らされて「乗るしかない このビッグウェーブに」って、みんなノリノリだと勘違いしていました。
「DX」を具体的にイメージできる人が少なかったり、「ITなんて本業じゃないから、委託すればいい」という人が多いのかもしれません。

## DXにおける専任組織の必要性
そんなわけで、「DXを推進する体制について」です。
DXは「デジタル変革」です。
「変革」は「破壊と建設」であるため、既存の組織での推進は難しいと考えます。
- 情報システム部門：自ら構築した現在の状態を変革をするのは困難（できるなら既にやっている）
- 管理部門：変革を実践できるデジタルリテラシーを持っている人材は少ない
- システム子会社：親会社を変革することは立場や役割的に困難

全てが上手くいっているわけではありませんが、ウチでも会社直轄の専任組織を設けて活動しています。

## 専任組織に人を集める方法
人を集める方法は、過去実績から選抜、社内公募といった方法があると思います（ウチも社内公募をやっています）。
DXという未知の課題に対し、選ぶ側にも知見がなく、面接や過去実績のドキュメントという少ない情報で判断された場合、「前向きさ」や「意識の高さ」といった面だけが重視され、テクノロジーに関する知識ない人材が集まるリスクもあります。
その結果、異動させてから教育をしたり（しかも、何を教育して良いかわからず、ＩＴと関係のない教育をしてみたり）、イマイチ成果を出せずに解散といった愉快なことになりかねません。

## 社内技術コミュニティを使えるかも
私、自社内で市民開発の技術コミュニティを主催しています。

２年前から始めて、かなりの人数規模になっており、社内ではそこそこ人気者（笑）です。
コロナ禍以降に始めた活動なので、ほとんどの参加メンバーと対面であったことはありませんし、所属部署も技術レベルもバラバラです。
主な活動は、社内ビジネスチャットでの情報共有、自作アプリの紹介、教材提供、勉強会、好事例の発表会など。
技術面や社内ルールの質問、DXといった大きなテーマの議論など、様々なネタをチャットで投稿すると、他の参加者がボランティアで回答して、相互支援で成り立っています。

この仕組み、DX推進に必要な素養を持つ人材（高い技術を持っている、献身的に貢献してくれる、本気でスキルを上げたいと思っている）を自然と可視化することができていて、社内人材を集める際に有用な判断材料になると思います。

## 「（ぴこーん）ひらめいた！」の件
（ここから、完全に妄想です。）
DX の CoE を編成するのって、こうすりゃいいんじゃね？と思いました。
1. 必要なスキルをテーマにした社内技術コミュニティを構築する
1. しばらくコミュニティを運営（１年間ぐらい）して、有望なメンバーにあたりをつけておく
1. あたりをつけたメンバーを中心とした組織をつくる

これであれば、組織の立ち上げ直後からスキルのあるメンバーで活動ができます。
また、コミュニティでの交流期間があるため、帰属意識を持つことや価値観の共有が比較的容易になると予想します。
（人を異動させるのは簡単じゃないので、事前に上位役職者を味方するといった根回しは必要ですが）

## とはいえ・・・
どんなに優秀な人が集まっても、制度上、待遇は他の従業員と同じ。
先進IT企業と比較されると、やっぱ見劣りしちゃいます。
昭和から続く文化、年功序列と終身雇用に最適化された人事制度や労働組合、レガシーなIT環境と比べ、外資IT企業やスタートアップのなんとキラキラしていることよ・・・。

若くて優秀な人材が自分の価値に気づいて転職活動を始めたら、止める手立てがないです。
もし、社内で取り組む DX が「IT介護」的なものだったりしたら、なおさら。
とはいえ、「別会社にして、会社制度をイチから構築する」というのはハードル高すぎだし。

## さいごに
さーせん。
寝起きに「（ぴこーん）ひらめいた！」というアイディアは、やっぱこの程度です。
もうちょっと煮詰める必要があります。
とはいえ「DXは専任組織で行う」「コミュニティで優秀な人材を発見できる」という事自体は正解で、これを組み合わせる方法がポイントだと思っています。

あと、「社内技術コミュニティを構築して盛り上げる」っていうのも、そこそこスキルが必要なので、今後どこかで整理して言語化したいと思っています。
データポータビリティと情報銀行

CyberAgent Ameba事業本部 広告プロダクトグループの星と申します。
主に広告計測やPrivacy保護関連を担当しております。

こちらは、CyberAgentメディア管轄の広告プロダクト横軸組織、通称PTAの[CyberAgent PTA Advent Calendar 2022](https://adventar.org/calendars/7539)の10日目の投稿になります。

最近機会があり調べた、データポータビリティと情報銀行について備忘がてら記載させていただければと。

# データポータビリティ
[oekunさんに教わったChatGPT](https://ameblo.jp/oekun/entry-12777387617.html)で調べてみると、
![スクリーンショット 2022-12-04 2.46.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1326/cc404ab3-248b-9524-239d-612aea3d8ddf.png)



サービスの乗り換えをスムーズに行えることを指しているようです。（ウェイ！）
携帯電話のナンバーポータビリティのような乗り換えを類似するWebサービス間で出来るようなイメージかと思います。

また、[GDPR](https://ja.wikipedia.org/wiki/EU%E4%B8%80%E8%88%AC%E3%83%87%E3%83%BC%E3%82%BF%E4%BF%9D%E8%AD%B7%E8%A6%8F%E5%89%87)では**Right to data portability**として、データポータビリティの権利が規定されているようです。
https://www.ppc.go.jp/files/pdf/dataportability_guideline.pdf
このあたりを見てみると、以下のような規定があるようです。
- 個人データを受領する権利
- あるデータ管理者から別のデータ管理者へ個人データを移行する権利
- 管理者の地位
- どの個人データが含まれなければならないか？
- 含まれないもの
- etc...

**含まれるデータ**
>データ主体により主体的にかつ認識しつつ提供されたデータ
>サービス又は機器を利用することによりデータ主体により提供された観察データ

サービス利用時に登録したメールアドレスや氏名、住所や
サービスを使ったときに出力されたログデータなどが含まれるようです。

**含まれないデータ**
>対照的に、推定データや派生データは、「データ主体により提供された」データをもとにデ ータ管理者が作成したものである。

ユーザのサービス利用の結果を元に分析されたデータなどは含まれないようです。
この辺は企業側のノウハウになるため含まれないという感じなのかなと考えます。

日本では、2022年04月の個人情報保護法改正で、
「本人が請求した方法」による保有個人データの開示を行うことが原則とされました。
これにより、個人で利用サービスからデジタルデータとして受け取りやすくなったのではないかと思います。

# 情報銀行
とはいえ、個人でデータを管理して有効に活用するというのは限界がありそうです。

サービスごとにデータの持ち方も違うので「本人が請求した方法」とはいえ、様々なデータをユーザが使いやすい状態で受け取れるか？というのもちょっと現実的ではない気がします。

そこで、[情報銀行](https://www.kokusen.go.jp/wko/pdf/wko-202001_05.pdf)を介した、データポータビリティが期待されているようです。
ユーザが情報銀行のサービスを利用することによって、以下の様にデータが流れていくイメージです。
1. 移行元サービス
    ↓（ユーザデータ）
1. 情報銀行：安全に管理・データフォーマット差分を吸収
    ↓（ユーザデータ）
1. 移行先サービス

情報銀行がデータを安全に管理しつつ、移行元・移行先のデータフォーマットの差分を吸収し、データポータビリティを実現するという感じのようです。

また、この移行元・移行先のサービスには情報銀行と接続してもらう必要があるので、
移行先のサービスがデータを受け取りやすい状態にするというのが、情報銀行同士での競合優位性になるのかなとも思います。

https://www.soumu.go.jp/main_content/000791752.pdf
こちらの資料をみてみると、情報銀行の認定制度もあるようで、
実際に認定を受けて情報銀行として運用が開始されているサービスもあるようです。

また、資料にあるように特に医療分野などで要配慮個人情報を安全に配慮した上で情報銀行を介してコントロールできるようになれば、非常に有意義であると思えます。

## 所感
情報銀行という事業がどのように成立していくのか？という点ではまだまだ課題がありそうですが、
自分のプライバシーデータが安全に管理された上で、簡単にサービスを移行できるデータポータビリティが一般的になっていけば、非常に便益があると感じました。

また、データポータビリティが普及することによって、サービス自体の利便性が高ければ、ユーザを一気に集めることも可能になるとも考えられ、こういった点でも面白い仕組みと感じます。

そして、今後1stPartyDataの活用がより重要になっていくということを考えても、
こういった形などで、ユーザが自分のデータを管理できている状態で、ユーザがサービス・広告配信事業者と同意の上で、データを広告配信に活用出来ている。
という状態を作っていければ、ユーザ・サービス・広告配信事業者全員がより良い関係になれるとも考えます。

# 最後に
最後まで読んでいただきありがとうございました。
一緒に働いていただける方、絶賛募集中ですので興味のある方は[こちら](https://hrmos.co/pages/cyberagent-group/jobs/0000651)から是非！
[interactions.py] Discord Botの作り方 #03 - Modal

# はじめに
この記事ではinteractions.pyというモジュールを使用してDiscord Botを作りたい人向けです。

#03ではModalについて解説していきたいと思います。

# Modalの実装
では実際に作っていきましょう。
以下のプログラムを書き写して前回のbuttonがある位置に貼り付けてください。
```python
modal = interactions.Modal(
  title="フォーム",
  custom_id="modal_form",
  components=[
      interactions.TextInput(
          style=interactions.TextStyleType.SHORT,
          label="質問",
          custom_id="text_form",
          min_length=1,
          max_length=3,
      )
  ],
)

await ctx.popup(modal)
```
では1個1個みていきましょう。
まず上の方にある `title = ...` のところでフォームのタイトルが設定できます。
`components=[ ...` のとこにある `label = ...` のところでフォームの質問が設定できます。
`min_length` と `max_length` は最小文字と最大文字です。現在は1文字以上3文字以下になっています。

## 実際にBotを実行してみる
![F75A72F7-A783-449C-966E-8C97C0B06FD9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/8e6f3f9b-df4d-efc9-2836-7f22357684db.jpeg)
`/test` と打った時にこのような物が出れば成功です。
ただ、このままだと何が書かれたか見れないので、今から書き込まれた結果が出力される様にしていきましょう。

## Modalに書き込まれた物を出力する
```python
@bot.modal("modal_form")
async def modal_response(ctx, response: str):
  #ここに処理を追加
```
`modal_form` のところに先ほどのフォームで指定した　`components` 外の `custom_id` を書き込みます。
どのような処理をするかは3行目の `async def...` の下に書きましょう。

上手く出来るとこの様になります。お疲れ様でした。
今回は試しに書かれた内容をチャットに隠しメッセージで送信する様にしました。
![FCB52303-D71F-468D-98B5-D6156651CA61.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3039218/31ff647a-fe6c-102e-6d53-e90563f58e61.jpeg)

# 最後に
今回はmodalについて解説しました。
次回はembedについて解説していきたいと思います。

もし分からないところがあれば Azusa#5812 に気軽にDMしてください。

# Discordサーバー

この度、bot開発者が話し合えるようなDiscordサーバーを開設しました！
ぜひ見に来てください！

https://discord.gg/nxBsFDgbFJ
OSM日本の地物量推移(2007-2022)-1 advertising

今回は地物のカテゴリ別というか大き目のメインキーごとにいくつか見てみたいと思います。まずは手頃なボリュームの[advertising](https://wiki.openstreetmap.org/wiki/JA:Key:advertising)（屋外広告）キーから。
なお、ベースデータの取得には前回より[ohsome dashboard](https://ohsome.org/apps/dashboard/)を利用させて頂いています。
## 推移
![](https://i.imgur.com/LUtIW0b.png)
![](https://i.imgur.com/HcCg4C6.png)
（[元データ](https://docs.google.com/spreadsheets/d/1aZMJpxT4WG7Umz0e1fRTpV0roSb9Lfhd_O2BcvRRnXY/edit#gid=0)）
## 分布
![](https://i.imgur.com/4Gwd2d5.png)
[Overpass turbo](https://overpass-turbo.eu/) より (c)[OpenStreetMap](https://www.openstreetmap.org/copyright) contributors
## 雑感あれこれ
OSMWikiの履歴などから、advertisingタグが承認されたのは2015年頃のようです。日本では2016年頃からマッピングされ始めていますが、数としてはマニアックな領域です（笑）。マイクロマッピングのひとつといえるでしょうか。当初はbillboard（道路沿いなどにある大きめの看板）がメインで、2021年からはboard（街中などにある小さめの看板や掲示板など）がいちばん多くマッピングされるようになっています。
屋外広告は邪魔物扱いされることも多いとはいえ、郊外など人工的な地物の少ない場所では貴重なランドマークになることもあります。
現在はレンダリング対象としているのは[OSM2World](https://wiki.openstreetmap.org/wiki/JA:OSM2World)くらいのようですが、件数が増えると対象とするレンダラーも増えると思います。以下、近所をマッピングし尽くした感のある方は心当たりがあれば試してみてはいかがですか。
### 1位：board（小さめの主に歩行者向け看板）
![](https://wiki.openstreetmap.org/w/images/thumb/f/fc/IMG_6076.JPG/180px-IMG_6076.JPG)
日本ではこのところ数が伸びているようです。[観光案内板](https://wiki.openstreetmap.org/wiki/JA:Tag:information=board)と似ていますが、住民向けのお知らせや注意喚起の掲示板/看板は観光用途ではないことが多く、行政による広告と考えれば町内会の掲示板や避難場所の案内板などはこちらのほうが適しているように思いますがいかがでしょうか。
### 2位：billboard（大きめの主に車両向け看板）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/AdvertisingBillboardGrounded_006.jpg/135px-AdvertisingBillboardGrounded_006.jpg)
運転中のマッピングは止めましょう。
### 3位：sign（広告サイン）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/c/ce/Enseigne_Auchan.JPG/320px-Enseigne_Auchan.JPG)
社名とか商品名とか書かれているヤツ。
### 4位：totem（トーテム広告）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b4/AdvertisingTotem_003.jpg/135px-AdvertisingTotem_003.jpg)
ガソリンスタンドにあるヤツ。
### 5位：column（円柱広告塔）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/3/3c/Column_Morris%2C_Paradise_Circus_-_geograph.org.uk_-_556615.jpg/180px-Column_Morris%2C_Paradise_Circus_-_geograph.org.uk_-_556615.jpg)
オサレな街角にたまにある気が。
### 6位：screen（広告スクリーン）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/5/54/Subway_Station_Digital_Advertising_Screens_%2813250855595%29.jpg/318px-Subway_Station_Digital_Advertising_Screens_%2813250855595%29.jpg)
デジタルなものは増えてきました。
### 7位：poster_box（ポスター掲示ボックス、ロリポップ）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/AdvertisingTransitShelter_002.jpg/135px-AdvertisingTransitShelter_002.jpg)
こんなバス停、時々見かけます。
### 8位：flag（のぼり旗）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/c/c3/Fahnen_im_Wind-Marketing-Jabel_Deutschland.jpg/320px-Fahnen_im_Wind-Marketing-Jabel_Deutschland.jpg)
ライフサイクルが短そうでちょっと意欲が。。
### 9位：sculpture（彫刻、オブジェクト）
![](https://upload.wikimedia.org/wikipedia/commons/thumb/c/cd/Aircraft_Sculpture-Advertisment-Restaurant_Jimma_Ethiopia.jpg/320px-Aircraft_Sculpture-Advertisment-Restaurant_Jimma_Ethiopia.jpg)
店舗の壁面や屋上にキングコングや自動車が乗っかっていることがあります。大阪ならカニとかでしょうか。件数こそ最下位ですが見かけたらマッピングしたい気にさせられます。

Happy Mapping!

画像の出典：[wiki.openstreetmap.org/wiki/JA:Key:advertising](https://wiki.openstreetmap.org/wiki/JA:Key:advertising)
PHP Unix タイムスタンプを取得する

:::note info
この記事は[miriwoお一人様 Advent Calendar 2022](https://qiita.com/advent-calendar/2022/miriwo)の10日目の記事です
:::

# 概要

- PHPにて現在時刻のUnixタイムスタンプを取得する方法をまとめる。

# 方法

- 組み込み関数の`microtime()`を使う。
- 下記の様に記載すると完全な実行時のUnixタイムスタンプを返す。

    ```php
    microtime();
    ```

- 当該関数に特に引数を渡さないと下記の様にmsecとsecの値が返される。secは1970年1月1日の0時00分00秒からの経過秒数、msecは更に細かいマイクロ秒部分を表しているらしい。
- デフォルトだと`msec sec`と返されてしまい、マイクロ秒も含むUnixタイムスタンプ値を取得したいときは戻り値の２つを連結する手間などがある。
- そんな時は引数にtrueを与えよう。`sec.msec`のように値を連結し、少数点の値でタイムスタンプを取得する事ができる。

    ```php
    microtime(true);
    ```

- ちなみに「msecの値いらないsecだけほしい」というニーズには`time()`を使うと良さそうである。secの値がintで返される。

# 参考文献

https://www.php.net/manual/ja/function.microtime.php

https://www.php.net/manual/ja/function.time.php
Google UXデザイン：ビジュアルデザイン要素（画像）

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/21e0608b-618e-054f-b3ed-3950bac1cc47.jpeg" width="700">

</details>

# モックアップに画像を入れるべき理由①

***<font color="MediumVioletRed">『画像は言葉を使わずにメッセージを伝えるのに役立つ』</font>***

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/41a73928-730f-358c-c11f-85e47db8df48.png" width="600">

ホテルの部屋を予約しようとするとき、部屋の写真はその部屋を予約するかどうかを決めるのに重要です。眺望、バスルームの広さ、ベッドの配置など、さまざまなことを検討することでしょう。画像は、このような情報を、言葉では伝えられない形で示すことができます。

# モックアップに画像を入れるべき理由②

***<font color="MediumVioletRed">『画像はユーザーの感情的な反応を生み出す』</font>***

ユーザーがアプリやWebサイトにアクセスしたとき、アプリやWebサイト全体に強い画像があれば、コンテンツをサポートする形で製品との結びつきを生み出すことができます。このような感情的な反応を生み出すには、画像がUI（ユーザーインターフェース）に合っていることが重要です。UIとは、デジタル製品のインターフェースの見た目や機能に関するものです。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/82838c60-9e04-6272-b0db-b35078fa6890.png" width="600">

これは、2008年から2013年にかけて使われたTwitterの画像です。これは、鳥に持ち上げられるクジラを描いたもので、サービス停止の合図に使われました。この画像は、製品の信頼性という問題に、ユーモアと個性を加え、ユーザーの共感を得ました。この「失敗したクジラ」は、機能やサービスに関する情報が少ないUIページに、画像によって視覚的な興味とバランスを与えることができることを示す好例です。

# モックアップに画像を入れるべき理由③

***<font color="MediumVioletRed">『画像は製品を競合から引き離す』</font>***

画像はデザインを引き立て、ユーザーに製品とのつながりを持たせ、より強いブランドの存在感を確立するのに役立ちます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/3897c1bc-311a-7e1a-647b-a97f3a2324e1.jpeg" width="300">

# 画像を無料でダウンロードできるサイト

https://unsplash.com/

https://blush.design/
OCamlの基本的な文法

## 整数の四則演算

```ocaml
(* 足し算 *)
# 2 + 3 ;;
- : int = 5
```

`(* hoge *)` はコメント。
`#` はプロンプト。自動で入る。
`;;` はインタプリタで実行する場合文末に必要。
`-` 以降は返り値。

## 実数の四則演算

```ocaml
# 1.414 /. 3.14 ;;
- : float = 0.450318471337579573
```

実数の演算子は `演算子 + ピリオド` と書く点に注意。
小数点以下がゼロの場合は `2.0` でもいいし `2.` でもいい。

## 変数定義
`let 変数名 = 式` と書く。

```ocaml
# let pi = 3.14 ;;
val pi : float = 3.14
```

`val pi : float = 3.14` は、
`変数 pi の型は float で、値は 3.14 です。` を意味する。

## 関数定義
`let 関数名 引数 = 式` と書く。

```ocaml
(* f(x) = 2x + 3 *)
# let f x = 2 * x + 3 ;;
val f : int -> int = <fun>

(* 実行 *)
# f 3 ;;
- : int = 9
```

`val f : int -> int = <fun>` は、
`関数 f の型は int -> int で、値は関数です。` を意味する。
`int -> int 型` は、
`int をひとつ受け取り、int を返す` を意味する。

引数は複数取れる。

```ocaml
(* g(x,y) = x^2 + y^2 - 4 *)
# let g x y = x ** 2 + y ** 2 - 4 ;;
val g : int -> int -> int = <fun>

(* 実行 *)
# g 2 3 ;;
- : int = 9
```

`val g : int -> int -> int = <fun>` は、
`関数 g の型は int -> int -> int で、値は関数です。` を意味する。
`int -> int -> int 型` は、
`int をふたつ受け取り、int を返す` を意味する。

## 条件分岐

`if 条件 then 式 else 式` と書く。

```ocaml
# if 1 < 2 then 3 else 4 ;;
- : int = 3
```

ふたつの式は同じ型の値を返さなければならない。

```ocaml
# if 1 < 2 then 3 else "hello" ;;
Error: This expression has type string but an expression was expected of type int
```

---

参考
[プログラミングの基礎](https://www.amazon.co.jp//dp/4781911609?&linkCode=ll1&tag=y063-22&linkId=69ebc0ebe8959ee3ff51c81933a68b79&language=ja_JP&ref_=as_li_ss_tl)
これからもずっと -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

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

今回は新しい取り組みを紹介するものではなく、チームの今後について考えていることについて紹介していきます。
ここまで見ていただいた方はありがとうございます。
果たしてチームの今後はどうなるのでしょうか

# 前回

https://qiita.com/Sicut_study/items/a520ce5d0521d6589196

# Chapter#23 これからもずっと

じん「皆さんには先にお伝えしますが、実は私転職して新たな挑戦をすることが決まりました」
ベープ「じんさんついに転職するんですね」
アール「じんさんは別のところいったほうがより力発揮できると思います」
ミュート「おめでとうございます」

じん「みなさんとは半年ほど一緒に働かせていただき、新技術の導入や多くのアジャイルを行ってきて成長できたのでとてもよかったです」
アール「この半年間新しいことばかりやって楽しかったです」
ベープ「今思い出すとほんと成長できたと思います」
ミュート「半年と思えない充実感だったね」
じん「もうこのチームであれば、自分たちで新しいことにチャレンジしていけますし、皆さんでモチベーションを高めあって成長することもできるはずです。私はもういなくても何とかなるとは思っています」
ミュート「モブでやってたから技術的な負債もほぼないので問題なさそうですね」
じん「引き継ぐ側からすると引継ぎなしはとても楽でよいです」
ベープ「フロントエンドは私が引っ張っていきますので任せてください」
じん「よろしくお願いします。アールさんは次は新人を指導するポジションにつかせるよう上長に行っています。次はチームを引っ張っていってください」
アール「じんさんみたいにできるかはわかりませんが、頑張ります」
じん「ミュートさんは入社歴がダントツ長くて、新しいことやるの快く思ってなかったかもですが、付き合っていただきありがとうございました。引継ぎ技術のリードと新人の教育、組織の成長をお願いします」
ミュート「新しいこと今までやってなかったからとても楽しかったよ」

じん「これからもずっとこの半年間の取り組みを続けて、チームだけでなく、組織も自己組織化できるように頑張って下さい。応援しています」

# これからの話

ここまでの話はほとんど実話をベースに作られています
転職してしまうのも本当であり、これからは私抜きのチームになります
多くの取り組みをしていきましたが、いくつかできていない取り組みがありました

- フロントエンドコンテストを社内で開く
- モブプログラミングコンテストを社内で開く
- テックデイを開く
- 社内ハッカソンを開く
- チームのメンバーを定期的に入れ替える制度を作る
- エンジニアの評価制度をフェアなものに改定する

これらは時間がかかるため私がいる間には実行できませんでした
なのでチームのメンバーに託すことにしました

これから先チームや会社がどうなるかは読んでいただいたみなさんの想像にお任せします
色々新しいことに付き合っていただいたメンバーには感謝しかありません。ありがとうございます
そして、アドベントカレンダーに付き合っていただいた読者の皆さんにも感謝します

# 次回

https://qiita.com/Sicut_study/items/d6a29a2b9a694475db07

# おわりに

今回は将来やろうとしていることを紹介するだけなので短くなりましたが、これにて続いていたシリーズは終了となります。途中適当になってしまう部分もありましたが、半年間の内容や実際の会話の内容が記録できたのでよかったです

次回はアドベントカレンダーをやっての感想を載せたいと思います