OmniAICreator/Qiita-1.07M huggingface dataset:
私が考えたBigQueryでのGROUPING SETS的なこと

BigQueryって `cube` や `grouping sets`ができないんですよね。(`rollup` はある。)

`cube` の代替として unnestを利用して全てのディメンションをクロスする方法があるみたい([stack overflow参照](https://stackoverflow.com/questions/50591099/big-query-sql-group-over-all-possible-levels-of-aggregation)ですが、全部の組み合わせをやってしまうとレコード数爆発の危険性があるので好みではないです。。。

ということで、お好きな組み合わせを自分で指定できる grouping sets 的なことをBigQueryでやってみました。

こんなシンプルなevent_logsテーブルがあったとして、各ディメンションのグループごとにuser_idのユニーク数を求めるとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323475/377f8ad0-c455-420c-3027-5efaa5f36191.png)

クエリはこんな感じになります。
```SQL
with 
base as (
  select * from event_logs
  where event_date between '2022-01-01' and '2022-12-31'
),

groupings as (
  select *, ['event_date'] from base
  union all
  select *, ['event_date', 'os_type'] from base
  union all
  select *, ['event_date', 'os_type', 'device_type'] from base
  union all
  select *, ['device_type'] from base
)

select
  if('event_date' in unnest(group_keys), event_date, null) as event_date,
  if('device_type' in unnest(group_keys), device_type, null) as device_type,
  if('os_type' in unnest(group_keys), os_type, null) as os_type,
  array_to_string(group_keys, ",") as group_keys,
  APPROX_COUNT_DISTINCT(user_id) as uu_count
from groupings
group by 1,2,3,4
```

細かくは説明しないですが、groupingsのCTEで集計したいディメンションのグループを指定しています。

仮にevent_dateとdevice_typeの組み合わせで集計したい、という要望が新たに挙がった場合はgroupingsに `union all` を１つ追加してあげればいいです。

そしてそれらのディメンションの組み合わせは最終的なクエリ結果に `group_keys` というカラムに出てくるので、どの行がどんなディメンションの組み合わせで集計された結果なのかが一目瞭然になるという工夫をしています。


そんなに複雑じゃなく、メンテナンスもしやすいと個人的には満足してます。
ERC 4337: account abstraction の整理


Ethereum のアカウントが下記２種類があるのは既に知られていると思います。
- EOA：外部所有アカウント、つまり人間がプライベートキーで制御して使うアカウント
- CA：コントラクトアカウント、スマートコントラクトをデプロイしてできたアカウント。プライベートキーなし

また、現状はプロトコル上、トランザクションは EOA による電子署名したものである前提になっている為、すべてのトランザクションが EOA からトリガーさせて実行していて、CA からはトリガーできません。

せっかく CA でいろいろ自動化できているので、この差をなくして EOA なしでもっとコントラクトウォレットを利用したいことが結構初期段階から考えられています。
また、 EOA の場合プライベートキーでフルコントロールできるため、セキュリティ向上は重要な課題であり、常に問題視されています。
これらを解決するために、EOA ではなく、CA を活用しよりセキュアなウォレットを実現したいのが、Account Abstraction （AA）になります。

他の EIP もありますが、新しいトランザクションタイプの追加や新しい opcode の追加のようなプロトコルレイヤーの修正が必要なので、あんまり進められていませんでした。ERC4337 は、それらの修正の必要ない新しい考案であるため注目されています。

ERC4337 の設計は、メタトランザクションを参考して実現しています。参考記事が詳細があるので、ここはシーケンス図を載せておきます。

## ERC 4337 のシーケンス図
想定しているロールは下記あります
- 処理を実行したいユーザー
- 処理を実行できる AA
- 処理情報を収集・トリガーさせる Bundler
- 処理情報に従って AA に対して処理を実行させる エントリーポイントコントラクト

```mermaid
sequenceDiagram

participant us as User(EOA)
participant mp as UserOperation <br>mempool
participant bu as Bundler
participant ep as Entry point contract
participant aa as Wallet Contract<br>AA

us->>mp: 処理に必要なデータを送信
note over us,mp: UserOperation として作成し mempool に送信する
loop do
  bu->>mp: 処理データを取得
  mp->>bu: 
end
bu->>ep: 処理実行

note over bu, ep: 収集した処理データをまとめて１つの<br>トランザクションとして実行する

alt Bundler が有効アドレスの場合
  alt 処理の sender の AA がない場合
    ep->>aa: sender の AA を作成する
  end
  ep->>aa: 処理1 実行
  ep->>aa: 処理2 実行
  note over ep,aa: 処理を各自の AA に伝えて実行する
end

alt Bundler が無効アドレスの場合
  ep->>ep: exit
end
```

## 参考リンク
- [ERC 4337: account abstraction without Ethereum protocol changes @Vitalik]()
- [AA（Account Abstraction）の先にある、コントラクトウォレット中心の世界](https://zenn.dev/sivira/articles/d041f1ac44ca1e#%E9%96%A2%E9%80%A3%E8%B3%87%E6%96%99%EF%BC%882022.07.13%2C-2022.08.30-%E8%BF%BD%E8%A8%98%EF%BC%89)

## まとめ
プライベートキー１つでフルコントロールできてしまう EOA は、セキュリティ周りの課題と使いにくい課題（覚えにくい）は問題視されています。web3 の入り口としてのウォレットはずっとこれらを解決したいと模索しています。
ERC4337 の AA は、プロトコルレイヤーの修正なしでウォレットを改善できるように見えるので、結構期待しています。
Mackerelの「式による監視」でALBのアラート検知

# はじめに
KWCでSREのマネージャーをやっている @kumakou3  です。
入社1年目からSREの部署を立ち上げ、優秀なメンバーに囲まれて楽しい日々を送っております。

「どうやって新しく部署を立ち上げたの？」とか「SREを部署化するってどんな感じなの？」という話は置いといて、今回は全く関係のない Mackerel の話をします。
理由は最近個人的にいじって楽しかったからです。

# Mackerelとは
[Mackerelの公式サイト](https://ja.mackerel.io/)には、以下のように書かれています。
>Mackerelは、株式会社はてなが提供する日本製のサーバー監視サービスです。
>自社のサービス運用基盤をMackerelで運用し、そのノウハウを詰め込むことで、クラウド監視に必要な機能を提供し続けています。

クラウド監視との親和性が非常に高く、UIも初心者でも見やすい作りとなっています。
個人的にお気に入りの監視ツールの一つです。

# Mackerelの監視ルール
Mackerelの監視ルールには、次のような種類があります。
今回はこの中で「**式による監視**」に着目しています。

| 種類 | 内容 |
|:-|:-|
|ホストメトリック監視|ホストのメトリックの平均値を監視します。|
|ホスト死活監視|ホストが継続的にメトリックを投稿していることを監視します。|
|サービスメトリック監視|サービスに紐付いたメトリックの直近のポイントの平均値を監視します。|
|外形監視|指定したURLに対して1分毎にステータスコードの監視を行います。|
|**式による監視**|**式によって計算されたメトリックの値を5分に1回の間隔で監視します。**|
|ロール内異常検知|ロールの過去の傾向と比べてシステムメトリックの特異な変化を検出します。|
|チェック監視|設定された条件と照合し、OK もしくは NG の判定結果を監視します。 <br>メトリックの送信・グラフによる可視化はおこなわれません。|

# 監視要件
## 1. ステータスコード5xxがxx回カウントされた場合にアラートを上げる
この要件の場合、単純にホストメトリック監視を利用して、
**alb.httpcode_count.target_5xx** 等の数をカウントする方法が利用できます。

## 2. 割合でアラートを上げたい場合
一方で次のような要件の場合、ホストメトリック監視では実現できませんでした。
ホストメトリック監視は、CPU使用率およびメモリ使用率は割合(%)で指定できますが、それ以外は対応できないようです。
- 直近10分間におけるステータスコードの 5％以上 が 5xx の場合は <font color="orange">**Warning**</font>
- 直近10分間におけるステータスコードの 10％以上 が 5xx の場合は <font color="red">**Critical**</font>

そのため、割合(%)で監視ルールを設定する場合は、「式による監視」を利用します。

# 監視設定
上記 2 の監視要件の場合、式として設定する内容は以下のようになります。
```
scale(
  movingAverage(
    divide(
      host(hostId, custom.alb.httpcode_count.target_5xx),
      host(hostId, custom.alb.request.count)
    ), 10m
  ), 100
)
```
このように設定することで、割合(%)で監視ルールを設定することができます。

式の内容を分解すると・・・
- **divide** でステータスコード 5xx の件数をリクエスト総数で割る
- **movingAverage** で 10 分間の移動平均を算出する
- **scale** で 100 を掛けて値を % に変換する

:::note info
Info
hostId には、利用しているオーガニゼーションのホストIDを指定します
:::

# 結果
いい感じで検知されたようです。
![スクリーンショット 2022-12-17 9.42.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982074/ee2d9d14-60fb-6aeb-d74b-79f33ba8f49b.png)
通知先はメールだけではなく、Slack や Chatwork さらにはなんと **Twilio** とも連携できます！

# さいごに
今回は Mackerel を使って AWS の様々なサービスを監視する機会があり、その際に利用した「**式による監視**」を紹介しました。
他のAWSインテグレーションで取得可能なメトリックも、「**式による監視**」を応用すれば複雑な監視要件も設定できそうです。
「**式による監視**」の関数は、わかりやすく[ドキュメント化](https://mackerel.io/ja/docs/entry/advanced/advanced-graph)されているので、色々と試してみることをお勧めします！

[KWC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/kwc) も残すところわずかとなりましたが、最後までお楽しみください！
【MicroStrategy】ACL設定によるレポート実行への影響

## はじめに
本記事では、MicroStrategyにおけるアトリビュート/メトリックのACL（アクセスコントロールリスト）がレポート実行にどのような影響がでるのかを紹介します。

※データは検証用のダミーデータを使用
※MicroStrategyのバージョンは2021.Update4

## 検証
以下のようなレポートを用意しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/25bf219d-0b30-1ad2-4461-ec3083ca2552.png)
今回使用する「テストユーザー」に対して
このレポート項目のACLをそれぞれ以下のように設定した場合、
テストユーザーでレポート実行をするとどのような挙動になるのか確認します。

①実績（メトリック）のACLのみ無効にする
②カテゴリー（アトリビュート）のACLのみ無効にする
※無効＝アクセス制御を無しにする

#### 検証①：メトリックのACLのみ無効にする
まず、実績メトリックに対して「テストユーザー」のアクセス制御を「すべて拒否」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/a5329259-e65e-aeb5-6caa-428ddc760076.png)
※カテゴリーアトリビュートのACLはそのまま有効にしています

次に先ほどのレポートを実行します。
すると、実績メトリックは表示されずカテゴリーアトリビュートのみが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/07c15d51-59ce-0dd3-182a-61b76b89e26e.png)
このようにメトリックのACLが無効の場合、
レポート実行はできてもレポートに対象メトリックが表示されません。
特定のユーザーにのみ見せたい項目がレポート上にある場合、
このACLを活用することで、同一レポートでもユーザーによって見せる項目を変えることが可能となります。

#### 検証②：アトリビュートのACLのみ無効にする
検証①と同様に、まずはカテゴリーアトリビュートに対してのアクセス権限を「すべて拒否」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/462b21e3-7af3-a8a8-6707-294fba8b4dc0.png)
※実績メトリックのACLは元のまま有効にしています

次に先ほどのレポートを実行します。
すると以下エラーが表示されレポート実行ができません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/51144a3d-c3c2-eb9f-6258-3437733bf1ea.png)
メトリックの場合とは異なり、アトリビュートに対してのアクセス権限がないとレポートの実行自体が不可となります。
アトリビュートに対してACLを設定する場合は注意が必要です。
※ただし下記補足の通り、アトリビュートのACLが無効でもレポート実行できる場合があります

#### 補足
検証②でアトリビュートのACLが無効だとレポート実行がエラーになりましたが、
エラーになるのは対象アトリビュートがレポートの初期表示項目（レポートビュー）に配置されている場合です。
対象アトリビュートをレポートの初期表示項目に含めず、
レポートオブジェクトに配置しているだけであればレポート実行は可能です。
その場合、以下のように対象アトリビュートは表示されません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/911d9bf3-03d5-2a45-4aa8-7cca0d2d9db5.png)

※同レポートを権限のある別ユーザーで実行すればレポートオブジェクトに対象アトリビュートが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737357/3b95f10e-3fff-20c5-bbd7-0a009148a2c4.png)

## おわりに
今回はACLが無効のメトリック/アトリビュートを含むレポートの実行可否の違いについて紹介しました。
メトリック→ACLがなくてもレポート実行可（項目が表示されないだけ）
アトリビュート→ACLがないとレポート実行自体が不可（※補足のケースを除く）
レポート作成時など、本記事の内容が参考になれば幸いです。

最後までご覧いただきありがとうございました。
DELETE APIにBodyが必要な時の実装方法

# 初めに
今回、自分が地味に詰まったDELETE APIを叩く時にBodyが必要な時の実装方法を紹介していこうと思います
### 本文
早速ですが、実装方法は下記の通りになります
```kotlin
@HTTP(method = "DELETE", path = "api_path", hasBody = true)
```
DELETEオプションはリクエストの本文が存在しないため、URLのみで識別できる必要があります
そのため普段の@DELETEのみでは実装ができなくなってしまっているのです

### 最後に
調べれば意外と出てきますが、日本語での記事がなく初心者エンジニア等が気付かない可能性があるので今回書かせていただきました
何かのお役に立てれば幸いです
備忘録1: JPL Solar System Dynamics のAPIの使い方

JPL Solar System Dynamics(SSD)が供給しているAPIの使い方を記しておきます。今回は3体問題の軌道の初期解([JPL Three-Body Periodic Orbit Catalog](https://ssd-api.jpl.nasa.gov/doc/periodic_orbits.html))のデータベース(i.e., $[x_0,y_0,z_0,v_{x0}, v_{y0}, v_{z0}, C, \tau, \lambda]$, $C$: Javobi constant, $\tau$: period, $\lambda$: stability)をJSONファイルに持っていくことがゴールです。

- System (e.g., Sun-Earth)
- Orbit Family (e.g., Halo, North)
- Liberation Point
- Jacobi Constant (range)
- Period (range)
- Stability index (range) 

を入力すれば対応する軌道のデータベースを返してくれる[便利なGUI](https://ssd.jpl.nasa.gov/tools/periodic_orbits.html#:~:text=The%20JPL%20Three%2DBody%20Periodic,%2Dbody%20problem%20(CR3BP).)もあるのですが、毎回手動でデータを回収するのは少し面倒なので... 

<h4> Pythonでの呼び出し方 </h4>

例として、Earth-Moon, L1 Halo 軌道(North)のデータを取っていきます。
```python
import requests 
import json

r = requests.get("https://ssd-api.jpl.nasa.gov/periodic_orbits.api?sys=earth-moon&family=halo&libr=1&branch=N")
r = r.json()

# write the json file 
with open('filename.json', 'w') as f:
    json.dump(r, f)
```

<h4> (参考) Juliaでの呼び出し方 </h4>

```julia
using HTTP
using JSON

r = HTTP.get("https://ssd-api.jpl.nasa.gov/periodic_orbits.api?sys=earth-moon&family=halo&libr=1&branch=N")
s = String(r.body)

# save the json file
open("filename.json", "w") do f
        write(f, json_string)
     end
```

これで得た初期値を、試しに手元にあるPythonのCR3BP (synodic frame) propagatorで積分してみます。

```python
# load json file
f = open('data.json',)
data = json.load(f)

tof = 3.1   # TU, 今回は適当に値を決めました。

df = pd.DataFrame(data["data"])
# find the closest initial solution. df.iloc[:,7] is a column for period. 
row = df.loc[(df.iloc[:,7]-tof).abs().argsort()[0]]  

s0 = row[0:6]
mu = float(data["system"]["mass_ratio"])

pos, _ = propagate_cr3bp(s0, mu, tof)  # 手元にあるCR3BPのintegrator

# Plot the orbits
fig = plt.figure()
ax = plt.axes(projection='3d')
ax.plot(pos[:,0], pos[:,1], pos[:,2])

# find the fixed points
l1, _, _, _, _ = find_lagrangian_pts(mu)  # ラグランジュ点を見つけてくれる関数
ax.scatter(l1[0], l1[1], l1[2], marker='D', s=25.0, facecolors="none", color='black', label='L1')
ax.scatter(1-mu, 0.0, 0.0, marker='*', s=25.0, color='orange', label='L1')

plt.show()

```

<h4> 結果 </h4>

(Differential Correction無しでも)良い感じにHalo軌道が出てきました。

<img width="400" alt="mojikyo45_640-2.gif" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/535371/e5769cb8-2914-728a-5d0b-ce04dffd9a3c.png">


因みに、初期値が
```
[1.879665e-01, 0.000000e+00, 9.752153e-01, -2.824989e-12, 8.038017e-01, 2.179037e-12]
```
なので、データベースの値はapoapsisの値(画像左上端)であることが分かります。
Jest React TypeScript　ボタンの色をテストコードで評価する

# 概要

https://qiita.com/RYA234/items/5c2604d54c7c1c3551cf

の続きです。
 ボタンの色を検証するテストコードを実装します。


# 開発環境
IDE:GitHub CodeSpaces
OS:windows10
言語：TypeScript

├── @testing-library/jest-dom@5.16.5
├── @testing-library/react@13.4.0
├── @testing-library/user-event@13.5.0
├── @types/jest@29.2.3
├── @types/node@16.18.4
├── @types/react-dom@18.0.9
├── @types/react@18.0.25
├── jest@29.3.1
├── react-dom@18.2.0
├── react-scripts@5.0.1
├── react@18.2.0
├── UNMET DEPENDENCY test@jest
├── ts-jest@29.0.3
├── typescript@4.9.3
└── web-vitals@2.1.4
# 手順
 ## プロダクトコード
押せないボタンです。
``` App.tsx
import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div >
    <button style={{backgroundColor: 'red'}}>Change to blue</button>
    </div>
  );
}

export default App;

```
 ## テストコード

``` App.test.tsx
import React from 'react';
import { render, screen } from '@testing-library/react';
import App from './App';

test('button has correct initial color', () => {
   const { container } = render(<App />);

    // find an element with a role of button and text of 'Change to blue'
   const colorButton = screen.getByRole('button',{ name:'Change to blue' });

   //　ボタンの初期色が赤色であることを確認
    expect(colorButton).toHaveStyle({backgroundColor: 'red'})
});

test('button turns blue when clicked', () => {});

```

 ## 画面の状態   
左側がCodeSpacesの画面、右側がReactのアプリです。
テストコードをred→yellow→redとすると、Pass,Fail,Passとなるので機能しています。
下gifアニメはその時の様子です。

![RedToYelloToRed.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710623/ff10761f-03df-dcb3-61bb-cfeab67ae9b3.gif)



## githubの差分

https://github.com/RYA234/my_learning_React_with_jest_and_ReactTestingLibrary/commit/53903f7a464b857f58f6e03e621ca17b3a20f2a5

https://github.com/RYA234/my_learning_React_with_jest_and_ReactTestingLibrary/commit/b53ce54d25d6e8d56e7b7437132750a2b3eb4144

# 参考
udemy
Section2.13

https://www.udemy.com/course/react-testing-library/
VyOS - NAT設定

## 前提
仮想ルータを用意したので VLAN 間ルーティングはできるようになったけど、外にはでれないので、外に出れるようにする。
## 環境
vRouter : VyOS 1.4.0
構成図：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263451/43f0bcee-25c4-8117-8b2c-a767f5cacad4.png)
## 設定 - Source NAT
192.168.10.0/24 の端末がインターネットに接続できるようにする。
```
vyos# set nat source rule 1 outbound-interface eth0
vyos# set nat source rule 1 source address 192.168.10.0/24
vyos# set nat source rule 1 translation address masquerade
```
## 動作確認
DNS サーバから 8.8.8.8 へ疎通できるようにいなっていればOK

※Web サーバをインターネットに公開するような時は合わせて Destination NAT の設定をする必要があるけれど、今回の検証用の Web サーバはインターネットに公開はしない、クローズド環境なので設定しないです。

## 番外編: traceroute のインストール
ネットワーク屋さんだと1日に1回は使うであろう、traceroute!!
Ubuntu にはデフォルトで入っていないので入れるのおススメ。
```
$ sudo apt install traceroute
```
あなたのgitクライアント、これできますか？ lazygit の神機能5選（動画付き）

## 初めに

いろんなGitクライアントを使い回したが、やっと[lazygit](https://github.com/jesseduffield/lazygit)に定着しました。
いくつ便利な機能を紹介します。

## ① コミットの前後を決める

`Ctrl+j`・`Ctrl+k`でコミットの前後を決められます。
（tmuxキーバンドと競合するため`Ctrl+b`・`Ctrl+g`にしました）
![reorder.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/3abe7767-58d5-5235-e3a7-597220ac977b.gif)

## ② ステージした内容を既存のコミットに追加

「あ、これコミット忘れた、、」ってありますか？
対象コミットに`shift+a`でコミットの修正できます！
（ノーモア、「fix lint」・「fix test」というつまらないコミット）
![quick-ammend.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/3132faf0-bbf6-ba92-2d87-9e0a7009ef75.gif)

## ③ コミットした内容の一部をindexに取り出す

「しまった、間違えてコミットしちゃった、、」ってありますか？
パッチモードを使って、間違えてコミットした内容をindexに取り出すことできます！
![pull-index.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/5e855efb-f322-780b-5fc9-eea612f885ac.gif)

## ④ コミットした内容の一部を別のコミットに移動

「indexに一旦取り出して、またコミットし直すのは面倒、、」って思ったんですよね？
別のコミットにも移動できます！
![pull-other.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/71846fe8-c4df-e7d9-93f1-5f2109c5d7d2.gif)

## ⑤ 複数コミットをcherry-pick

素gitコメントで複数コミットをcherry-pickする際にコミットSHAを指定することが面倒じゃないですか？
`shift+c`で複数コミットを選択し、`v`で選択したコミットをcherry-pickできます！
![cp-multiple.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/d9b3678f-74f5-6acb-d839-6e6afd49a197.gif)

## ボーナス：コマンドを検索

lazygitのキーバインドが分からない時`x`でコマンドメニューが見れますが、
情報量が多過ぎるので`/`で検索すれば簡単に見つかります！
![search.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285534/cf3c2592-0399-3143-e3b3-23fe8be79d2b.gif)

## 最後に

少しでもlazygitの魅力を感じましたが？
是非試して見てください！

https://github.com/jesseduffield/lazygit
SvelteKitのルーティングについて

この記事は[SvelteKit Advent Calendar 2022](https://qiita.com/advent-calendar/2022/sveltekit)の6日目の記事です。
@kubotakです。

今回はSvelteKitのルーティングについて紹介したいと思います。
といっても基本的な紹介はドキュメントを見ていただくのが一番わかり易いと思います。

https://kit.svelte.jp/docs/routing

そこで、この記事ではSvelteKitのルーティングの面白いところを紹介していきたいと思います。

# 命名規則
SvelteKitはファイルシステムベースのルーティングを採用しています。ReactのNext.jsやVue.jsのNuxtと同様です。
しかしそれらのフレームワークとは少し変わった規則になっています。

例えば`/about`ページを作るとき、大抵は以下のようなファイルベースを想像しますよね？

(誤)
- `src/routes/about.(ts|js)`
- `src/routes/about/index.ts`

しかしSvelteKitでは`+page.svelte`というファイルで作成する必要があります。
(正)
- `src/routes/about/+page.svelte`

一見するとよくわからないルールですが他のコンポーネントを理解するとよくできた命名だと思います。
（とはいえプラスが付くのは未だに違和感がある）

## サーバー側で実行される処理
続いてサーバー側で実行される処理を定義するファイルは次のようになります。

`src/about/+page.server.(ts|js)`

ページコンポーネント同様に`+page`から始まり、`.server.ts`とサーバー側で処理されることが明確な命名になっています。
これはSSR時にはサーバー側でページコンポーネントと処理されHTMLを構成するが、CSRになると`__data.json`、今回の構成だと`/about/__data.json`というエンドポイントとして実行されます。
このエンドポイントはCSRで画面遷移する際にページ遷移前に呼ばれ、この結果を次のページコンポーネントのpropsとして扱われます。

## レイアウト
ヘッダーやフッター、メニューなどのページとは別に固定された要素がある場合はレイアウトが活用できます。
レイアウト及びレイアウトのサーバー処理は次のように定義できます。

- `src/+layout.svelte`
- `src/+layout.server.(ts|js)`

このレイアウトは、routesディレクトリ直下に定義しているため、それ以降のディレクトリのすべてのページに作用します。
そのため、下位の階層のみに定義したい場合は次のように該当ディレクトリでレイアウトを定義することもできます。

- `src/about/+layout.svelte`
- `src/about/+layout.server.(ts|js)`

## より高度の分離
例えば`/`と`/about`で別のレイアウトを利用したい場合があると思います。
ここで問題になるのは`/`はディレクトリ直下のため、そこで定義しているレイアウトが`/about`にも作用してしまうという点です。

少しコードを例にします。

```html:src/routes/about/+page.svelte
<p>About Page</p>
```

```html:src/routes/about/+layout.svelte
<h2>子レイアウト</h2>
<slot />
```

```html:src/routes/+layout.svelte
<h1>親レイアウト</h1>
<slot />
```

それではページを見てみましょう。
![スクリーンショット 2022-12-07 9.38.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/b8e511fc-5e57-3617-b389-b38d76ff1042.png)

このように上位の階層にあるレイアウトが影響します。
この仕組をうまく活用すると、Nuxtのミドルウェアのように上位階層でユーザー情報取得処理を集約するなど使い所もあります。
しかし、今回のケースでは別のレイアウトを使いたい場合、この仕様が問題になってしまいます。
そこでSvelteKitではAdvanced layoutsの(group)という仕組みが用意されています。

https://kit.svelte.jp/docs/advanced-routing#advanced-layouts

先程のコードを次のようにディレクトリを分離します。

```
src/
└── routes
    ├── (about)
    │   └── about
    │       ├── +layout.svelte
    │       └── +page.svelte
    └── (root)
        ├── +layout.svelte
        └── +page.svelte
```

`(root)`と`(about)`という`({name})`命名のディレクトリを作成しました。ブラウザでの結果は次のようになります。
![スクリーンショット 2022-12-07 9.54.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89213/d8922e97-fade-4ce9-addc-6b6617dbd0c7.png)

(group)の仕組みを使うことでディレクトリ上で上下関係にあったレイアウトを分離することで影響を避けることができるようになります。
また、この`()`のディレクトリはルーティング上は影響しないものなのでパスが変わることはありません。
うまく使うことでレイアウトをきれいに分離させることができると思います。

# さいごに
SvelteKitのルーティングの個人的に面白いと思ったところを紹介しました。
初見では戸惑うこともありそうなルールですが、実際に触ってみるといい感じに責務が分離されているし、ある程度拡張も可能なので実運用に耐えうる仕組みだと思いました。
まだSvelteKit触ったこと無いという方はぜひ一度体験してみてください！
【Python初学者必見】Pythonで作るじゃんけん

最近社内で勉強会を開催しているのですが、Pythonを学習するという方針に決定したので、
第一回の制作物としてじゃんけんゲームを作成しました。

# 完成品

```main.py
import random
import sys

hand = ['g', 'c', 'p']

input_hand = input('自分の手を入力して下さい => ')
cpu_hand = random.randint(0,2)

if(input_hand not in hand):
    sys.exit()
else:
    print('相手は' + hand[cpu_hand] + 'を出しました')

my_hand = hand.index(input_hand)
result = (my_hand - cpu_hand + 3) % 3

if(result == 0):
    print('結果はあいこです')
elif(result == 1):
    print('あなたの負けです')
else:
    print('あなたの勝ちです')
```
## main.pyを実行してみると...
```:ターミナル
sakamotoharuakiranoMacBook-Pro:janken sakamotoharuki$ python main.py
自分の手を入力して下さい => g
相手はcを出しました
あなたの勝ちです
```

問題なくじゃんけんをする事が出来ました！

### g,c,p以外の手を入力すると処理は終了する様になっています

```:ターミナル
sakamotoharuakiranoMacBook-Pro:janken sakamotoharuki$ python main.py
自分の手を入力して下さい => abc
sakamotoharuakiranoMacBook-Pro:janken sakamotoharuki$ 
```

## 今回使用したモジュール
・ランダムな浮動小数点数（乱数）を生成するrandam()
・g,c,p以外の異常な入力値の場合はゲームを強制終了する為のsys.exit()


今後じゃんけんゲームに機能追加する機会があれば別途記事にしていきたいと思います。
ノーコード開発ツールとしても進化したプリザンター

本記事は [Pleasanter(プリザンター) Advent Calendar](https://qiita.com/advent-calendar/2022/pleasanter) 2022の7日目の記事です。
この記事を書いているのは、中の人です。

# はじめに
2022年も、ユーザの皆様と共に成長するプロダクトとして、プリザンターは大きな成長・進化を遂げました。
もともと「Webデータベース」を謳っていたプリザンターですが、2020年から「ローコード開発プラットフォーム」へと変更しています。これは2019年末にサーバスクリプト機能が実装されたことを受けてのことでした。ローコード開発プラットフォームとして、2020年、2021年はサーバスクリプトのエンハンスが集中的に行われ、標準機能では対応できない要件を僅かなコードで実現できる高い拡張性を手に入れました。
一方、今年2022年は、ノーコードで実現できることが格段に広がる新機能が数多く追加されています。「コードを書けば実現できた」ことが「コードを書かなくても実現できる」ようになったと言うとわかりやすいでしょうか。

今回の記事では「ノーコード・ローコード開発ツール」としてパワーアップしたプリザンターに今年追加された新機能のうち代表的なものをご紹介いたします。

## 「プロセス」と「状況による制御」
今年は何と言ってもプリザンター1.3のリリースが一番大きなニュースになるかと思います。
1.3といえばターゲットフレームワークが.NET6に変更されたというのも大きいのですが、それより何より、大変要望の多かった稟議申請などのワークフロー管理を実現する待望の「プロセス」機能の実装でしょう。
今年の3月1日にリリースされた1.3の目玉の新機能として実装された「プロセス」機能は、その後も度重なる機能拡張が繰り返され、スクリプトを使わずともノーコードで柔軟なワークフローの管理を実現できるようになりました。

テーブルの管理：プロセス
https://pleasanter.org/manual/process

さらに、6月にリリースされた1.3.12において実装された「状況による制御」機能は、名前の通りではありますが、今まではスクリプトを書かなければ実現できなかった、状況項目の値によって特定の項目を非表示にしたり読み取り専用にしたりという項目の制御がノーコードで実現できるようになりました。

テーブルの管理：状況による制御
https://pleasanter.org/manual/status-control

今年追加された中でも特にインパクトのあったこの2つの機能「状況による制御」と「プロセス」を組み合わせることによって、更に細やかで柔軟なワークフローの管理が可能となり、ノーコードの業務アプリ開発ツールとして、プリザンターはかなり広い範囲の要件に対応できるツールになったのではないかと思います。
以下のFAQでは、この2つの機能を使ったワークフローの設定例を紹介しています。こちらのワークフローは、デモ環境で実際に操作できますのでよろしければ是非お試し下さい。

FAQ：稟議申請などのワークフロー（承認プロセス）をプロセス機能で実現する
https://pleasanter.org/manual/faq-process-workflow

60日間試せるデモ環境(デモ環境を見る欄にメールアドレスをご登録ください)
https://demo.pleasanter.org/

「プロセス」機能は、ワークフロー管理を行うための機能かのように書いていますが、実は「任意の処理を実行できるボタンを作成する」という機能でもありますので、アイディア次第では幅広く様々な用途でお使い頂ける機能となっています。是非、便利な使い方を考えてみて下さい。可能性は無限大です。

参考：いいねボタン in プリザンター - Qiita
https://qiita.com/implune/items/891e497b064953857d9c

# おわりに

今年追加された2大新機能ともいえる「プロセス」と「状況による制御」をご紹介しましたが、いかがでしたでしょうか。繰り返しになりますが、この2つの機能は非常にパワフルで可能性を秘めた機能だと思いますので、是非ご活用頂ければ嬉しいです。こんな使い方してるよ、という皆様のお話も是非お聞きしたいところです。

それでは、今回の記事はここまで。最後までお読み頂きありがとうございます。それではまた次の記事でお会いしましょう。
Angular 9.1.3 から 10.2.4 へアップデート

# はじめに

Angular のバージョンを 9.1.3 から 10.2.4 へアップデートした際の手順を備忘録として残します。
※ 各プロジェクト毎のソースコードや拡張機能によって手順が異なる場合があります。

## 環境

- docker container
  - node: 14.0.0
    - Docker イメージ: FROM node:14.0.0-stretch
  - Angular: 9.1.3

# アップデートを実行

公式のアップデートガイドを頼りにアップデートを行います。

- [Angular Update Guide - From v.9.1 To v.10.2](https://update.angular.io/?l=3&v=9.1-10.2)

## node.js のバージョンを更新

アップデート要件の調査時点では node v14.0.0 のままで問題なさそうでしたが、
`@angular-devkit/architect` のアップデート要件が node ^14.15.0 となっていたため、
node のバージョンについてもアップデートを行いました。

```Dockerfile
FROM node:14.15.0-stretch
```

- [@angular-devkit/architect](https://snyk.io/advisor/npm-package/@angular-devkit/architect)

## Angular のバージョンを更新

`ng update` コマンドを使用し、Angular のバージョンを更新します。

```ng update
ng update @angular/core@10 @angular/cli@10 --allow-dirty --force
```
（このとき @angular/cdk も更新される）

## 拡張機能のバージョンを更新

拡張機能としてインストールしているパッケージのバージョンを更新します。
Angular のバージョンによって指定するバージョンが変動するため確認が必要そうです。

```ng update
ng update @angular/material@10 --allow-dirty --force
```

#### 動作確認

バージョンアップ後、各動作に影響が出ていないか確認を行い完了です。

9.1.3 から 10.2.4 への変更ではソースに大きな変更はなく、
スムーズにアップデートを行うことが可能でした。
[oVirt] OVAをインポートできないときにチェックすること

# これはなに？

[oVirt](https://www.ovirt.org/) ([RHEV](https://www.redhat.com/en/technologies/virtualization/enterprise-virtualization?extIdCarryOver=true&sc_cid=701f2000001OH6kAAG)) に OVA ファイルをインポートできないときに、チェックすることです。

# 1. OVAのバージョン

OVA 2.0はたぶんまだ対応してないです。1.0にします。

# 2. engine.log を見る

マネージャーホストの `/var/log/ovirt-engine` にあります。

`grep -i fail engine.log` などとして、失敗ログを探してください。
うまくすれば、ここで失敗理由が見つかります。

# 3. virt-v2vのログを見る

VMホスト上で、**virt-v2v** コマンドが実行され、VMの変換が行われます。

ログは、VMホストの `/var/log/vdsm/import` にあります。
【WordPress】パンくずリストを表示する

# 前回の記事

前回の記事では、ナビゲーションカレンダーの設定方法を確認しました。

https://qiita.com/raptony110/private/9119161141b79f188ee4

今回は、パンクズリストを表示してみようと思います。

僕のAdvent Calendarを読み終わった人が、
「へぇ簡単なんだなぁ〜　自分もWordPress使ってサイト作ってみようかな〜」って思うあなたがそこにいたのなら、、、、
読むだけで、頭の中WordPress化しちゃったんだよッ！！！！

https://qiita.com/advent-calendar/2022/wordpress-output

# パンくずリストとは
パンくずリストは、Webサイトの階層構造を見える化するひつの表現方法で、今開いている記事がどの階層にあるのかが、一目でわかるようになります。
パンくずリストの上層階層がリンクにしておけば、訪問者が上の階層ページに戻ることも容易になります。
またパンくずリストの追加は、SEO対策として有効とされているので、特にこだわりがなければ、表示しておくと良いでしょう。

# プラグイン「Breadcrumb NavXT」をインストールする
パンくずリストを作成する方法としてもっともお手軽なのは、プラグインを利用することです。
WordPress管理画面のプラグイン>新規追加を選択します。
プラグインの追加メニューで、「breadcrumb」と検索すると、「Breadcrumb NavXT」といくプラグインが出てきますので、これをインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/bfc470d2-45d0-a8ed-9ef8-c07026139f12.png)

覚えていますでしょうか、プラグインはインストールしただけでは、使えません。有効化ボタンを忘れずに押してくださいね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/e0089e19-3f1e-38b8-a898-309499369d65.png)

Webサイトで記事を確認してみましょう。パンくずリストが表示され、この記事がどの階層にあるのかがわかりやすくなりましたね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1499675/6593dab3-9842-8624-6222-cd09fb9361a6.png)

# おわりに
今回の記事で、パンくずリストをWebサイトに追加しました。これで、訪問者が記事間を移動しやすくなったと思います。

次回は、地図を配置してみましょう。お楽しみに！
unityでphotonを使ったマルチプレイの実装

ひとまずphotonを実装してみよう
====================================
photonアセットの種類が多い
------------------------------------

>Pun+
Pun2
Pun2 +
ひとまず無料のPun2と有料のPun2+を入れてみましたが最初に始めるにはあまり差がなさそうです。

※どうやらリリース時に無料だと別途料金がかかるようです
※CHATはPunに入ってますがVOICEは別なので途中で音声チャットを入れようとVOICEを入れるといろいろエラーになるようです。




早速マルチプレイに挑戦
------------------------------------

>ひとまずキャラを配置しようと調べました。


１．スクリプトを書く
using Photon.Pun
using Photon.Realtime;   を追加して
MonoBehaviourwを MonoBehaviourPunCallbacksに変更する

void startに下記を追加して設定を反映させます。
PhotonNetwork.ConnectUsingSettings();


public override void OnConnectedToMaster() {
ルームに参加する（ルームが存在しなければ作成後参加する）
PhotonNetwork.JoinOrCreateRoom("ルーム名", new RoomOptions(), TypedLobby.Default);
}


public override void OnJoinedRoom() {
自身のキャラを生成する
var position = new Vector3(0f, 0f, 0f);
PhotonNetwork.Instantiate("キャラ名", position, Quaternion.identity);
}



２．配置する

・フォルダをつくって名前を"Resources"にする
・キャラをそのフォルダに入れる
・キャラにPhotonViewコンポーネントをつける
・ヒストリーに新しいオブジェクトを作って、さっき作ったスクリプトをつける

以上で配置ができました！



動作反映とアニメージョン反映する
------------------------------------

>キャラをアニメーション付きで動くようにする。

１．キャラがアニメーション付きで動かすスクリプトを作ってつける。
２．動作連動するためにPhotonTransformViewコンポーネントをキャラにつける
３．動作スクリプトに下記を追加する
using Photon.Pun;を追加　
MonoBehaviourwを MonoBehaviourPunCallbacksに変更する
各キャラごとに動かす命令文をif (photonView.IsMine) {}で囲む

４．アニメーション動作のためPhotonAnimatorViewコンポーネントをキャラにつける
※アニメーションの名前を反映するように変えておく


>以上でキャラの動作はできました！！！


追記です。
ラーメンは豚骨でバリカタかかためんが好きです。コテコテの長浜系が大好きです
文系新卒IT未経験がSAAに2回目で合格した話

# はじめに

私はゴリゴリ文系卒の新卒インフラエンジニアです。
そもそもIT知識も全くなければ、AWSとは...？？？という感じで、
4月から10月まで研修を受けて、「サーバー」「クラウド」などがやっと分かってきたかも...？という前提です（笑）
インフラに配属されたのは8月頃で、そこから勉強を始めて10月末に合格しました。


# SAAとは
AWS Certified Solutions Architect - Associate (SAA)とは
>AWS（アマゾンウェブサービス）における分散システムの可用性、コスト効率、高耐障害性やスケーラビリティの設計に関する資格です。
つまり、クラウド上にシステムを構築する知識があることを証明する資格です。
試験対象者は1年以上の実務経験を持つソリューションアーキテクトになります。

私の認識では、インフラエンジニアの登竜門といった感じでしょうか...
今回私が受けたのは<font color="Red">SAA-03</font>です。

ちなみに受験料は1回15000円です。
テストセンターや、自宅で受験することができます。

# 1回目の試験
恥ずかしながら1回目では不合格でした。
同期は皆1回で受かってるのに...私はなんておバカなんだ、と落ち込みました（笑）
ちなみに点数は703点です。
合格点が720点なので、かなりビミョーですね（笑）

## 1回目の勉強

* Udemyの[【SAA-C03版】これだけでOK！ AWS 認定ソリューションアーキテクト – アソシエイト試験突破講座](https://www.udemy.com/course/aws-associate/)を使ってハンズオン（EC2の章まで）
* Udemyの[【C03版】AWS 認定ソリューションアーキテクト アソシエイト模擬試験問題集（6回分390問）](https://www.udemy.com/course/aws-knan/)問題集を解きまくった（全部4週した）
* AWS[公式問題](https://aws.amazon.com/jp/training/digital/)を解く
* 新しいサービスを一通り調べる

ここまでしましたが不合格でした。
当日は割と解けたかも！と思い、帰り道はルンルンで服を購入しましたし、
友達と飲んで帰りました。
帰り道の電車で不合格の文字を見たときは、一気に悲しくなりました（笑）
ただ、この勉強があったからこそ、全く知識のなかった私がAWSの基礎知識を頭に叩き込むことができたので、本当に初心者の方はまずサービスの概要を勉強することをオススメします。


# 何が足りなかったのか

SAAの結果を見たところ、<font color="Red">「セキュアなアーキテクチャの設計」</font>と<font color="Red">「コストを最適化したアーキテクチャの設計」</font>があまり理解できていないとのこと。
確かに、Udemyでも問題を解いていた感じ、いつも2択で迷っていました。
それに、4週以上してくるとほぼ暗記だったのであまり良くなかったのかもしれません。
セキュリティ面に関してはすごく苦手意識があったのでもっとここを学ばないとなあと思いました。

# 2回目に向けて

2回目の予約は落ちてからすぐにしました。
恐らく今が1番知識的にもモチベーション的にもピークだろうと思ったので...
落ちると次の予約が取れるのが最短で2週間なので、19日後に予約しました。

1回目の反省を生かして、教材の見直しから始めました。
1回受けた感じだと正直あまりUdemyの問題は見なかったのでUdemyを使うのはやめました。
1回目落ちたという方のブログを読み漁り、[Tech Stock](https://techstock.jp/)にたどり着きました。
この教材はクイズ形式で問題を解けるものでした。

この問題集だけで恐らく1000問以上は解けると思います。
セキュリティ関連問題やコスト最適化系の問題も、何度も似たような問題を反復して解くことができるので理解が深まりましたし、暗記ではなくて自分の頭で解けるようになりました。

## 勉強方法
この時期は仕事もすごく忙しくなっていたので、勉強時間の確保も工夫しました。
まず、朝はいつもより早起きして30分だけ勉強しました。
仕事後は1時間半と決めて、できるだけダラダラせずに1日最低でも2時間の勉強時間確保をするようにしました。
最初の2週間で1000問以上の問題全てを一周し、残りの5日間で間違えた問題と、模擬試験のセクションを解きまくりました。
（これでかなり力がついたと思います。）

## 合格
2回目のテストもかなり緊張しましたが、問題集で見たことのある問題がかなり多かったです。
なので手ごたえはあったと思います。
テスト結果は試験のあと直ぐに見れると聞いていたのですが、私の時は1回目も2回目もその場では確認できなかったので結果が来るまでずっと不安でした...
ちなみに合格点は777点でした。
ラッキーセブン...2回目で受かったなら800点代にいきたかったですね（なみだ）

# 最後に
今回の記事は、SAA取得を目指す方の助けになればと思い、恥を忍んで書きました（笑）
本当は実務に触れていって、AWSについての理解を深めるのが1番良いんだろうなと思うのでSAP取得に向けてAWSに積極的に触れていきたいと思っています！
【WordPress】画像までのパスを簡略化する

wp-content/themes/example-theme/imagesディレクトリに配置したtest.pngという画像を表示したい場合、以下のように記述することで画像までのパスを出力することができます。

```php
<img href="<?php echo get_template_directory_uri() . '/images/test.png'; ?>">
```

function.phpに以下を追記することで簡略化できます。

```php
/**
 * 画像までのパスの簡略化
 */
function get_theme_img($img_name)
{
	$content = esc_url(get_template_directory_uri()) . '/images/' . $img_name;
	return $content;
}
```

```php
<img href="<?php echo get_theme_img('test.png') ?>">
```
運用タイトル初期段階でのQA費用適正化を進めた話

◆この記事を読むのにかかる時間：約5分程度
◆この記事の主な対象者：QA費用の適正化に取り組みたい方・取り組んでいる方

# 1.はじめに
みなさま今年も一年お疲れさまでした。
あっという間にアドベントカレンダーの時期になりましたね。

普段私はゲームのQA担当として品質管理に従事しており、
開発チームとの調整業務や障害・費用の削減などの推進をおこなっています。

今年は新規リリース～運用初期のタイトルへ携わる機会があり、
そのなかで、QA費用の適正化に向けた取り組みをおこないました。

今回携わったチームでは以下のような課題感が見受けられていました。
①検証スケジュールに対して、仕様の確定や施策の実装が間に合わない状況が多発
②上記の影響など、イレギュラー多発によるQA工数の見積と実態の大幅な乖離

特に運用フェイズの初期段階では開発チーム側も安定していないことが多く、
このタイミングでのQA費用の適正化について、同じような課題感を抱えてる方も多くいらっしゃると思います。
今回は私が課題感の解消に向けておこなった適正化の取り組みについて、お話していきます。

# 2.適正化の打ち手としておこなったこと
費用の適正化にあたり、
今回私がおこなったことは大きく分けて3つとなります。

#### a.必要工数についての認識を統一する（状況の可視化）
工数見積と実態が大きく乖離している状況が多くあったため、
原因を確認しながら、現在かかっている各検証の工数についての可視化を行っていきました。

画像は認識合わせの表のイメージです。
![2022qiita_001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/540789/f0867393-3994-8346-4a95-273fc104007a.png)
テスト設計者、管理者、現場の検証担当など各人の認識で記載をしてもらいます。

#### b.検証工数の基準値の再設定
aで洗い出した現状を鑑みて各検証工数の基準値について、テスト設計者や進捗管理者、現場のテスト担当者などを交えて再設定します。

当初の工数見積と実態を比較して、
今回は開発起因・テスト起因などの両要因により、施策毎の工数が想定より大幅に膨らんでいる状況が多く見受けられたため、
実態としてかかっている数値感からイレギュラー要素(※1)を除いた数値と、
当初の見積もりとを対比し、目標数値の設定をおこなっていきました。

もし大幅な乖離がない場合は、その数値感を施策毎の基準値として設定していきます。

:::note warn
※1 本記事におけるイレギュラー要素の定義
定常的な施策検証の見積もり時に見込みとして加えづらい、ボトルネックとなりうる事象のことを指します
例：
・影響範囲の大きい進行不能などの不具合による大幅な遅延
・仕様確定の遅れよる大幅な遅延
・テスト実行に起因する大幅な遅延
など
:::

#### c.適正化に向けた施策の検討・実施
状況の整理と基準値を再設定したら、工数の適正化に向けた施策を検討・実施します。
主に今回は3点の打ち手を検討してアクションを起こしています。

<b>①最新の基準値での正確な見積の算出</b>
まずは再設定した工数感をもとに日々の見積を出し直します。
予算との対比もおこないつつ、どのくらいの費用感になるのかをしっかりと算出して把握します。
※この時点で予算と乖離がある場合は別途テスト範囲・粒度の調整や検証の効率化などで費用感を調整しますが、効率化の施策については今回は割愛します。

<b>②日々の進捗を鑑みた細かな稼働人数の調整</b>
各施策の工数消化状況や進捗をデイリーで観測し、目標値と対比しつつ、
稼働する人員数の過不足を検証担当者や進捗を管理するメンバーと調整していきます。
0.5人日などの1人日未満となる工数感で終わる作業が発生した場合に、
別の対応に充てた人員で作業が賄えるかどうかなど、現場と密にコミュニケーションを取りつつ余剰な稼働が発生しないよう随時確認していきます。

<b>③開発チームとの密なコミュニケーションによる問題点の解消</b>
検証を妨げるような事象などは開発チームへ密に連携し、解消をしてもらいました。
具体例を1点挙げると<b>「データの準備が検証予定日に間に合っていない」</b>といった問題が今回多く発生していましたが、
開発チーム側の会議などにQA担当者も毎日参加して、施策毎の検証予定日の共有や実装進捗に伴った検証スケジュールの調整などをおこない、
余剰な工数が発生しないよう、両者間で無駄なく準備をおこない問題を解消しました。

# 3.取り組んでみて
実際に費用の適正化に取り組んでみた結果
取り組み前と同規模の施策数の月で対比して、約44%の抑制に成功しました。
施策の増減などの影響を除いても、QA費用は想定の予算感で安定して推移するようになりました。


# 4.まとめ
今回の話のまとめです
①状況の可視化をして、実態と見積の乖離が発生しないよう認識相違を埋める
②基準となる数値感の共有は大事、工数などの認識は各担当でしっかり揃える
③現場・開発と積極的に連携し、余剰な工数が出ないよう調整・協力をしてもらう

本来やって然るべきといった内容ではありますが、もしできていないなと感じたら、
正してあげるだけでかなり効果が見込めるので、QA費用の効率化や削減をおこなう前に、このような基礎的な部分も見直してみることをお勧めします。


# 5.おわりに
いかがだったでしょうか。

運用初期の慌ただしい状況だと手の回りづらい、
「当たり前のことを当たり前にやる」といった部分の重要性を今回の取り組みで再認識しました。
次に同じようなケースへ携わる場合は、より早い段階で費用コントロールしやすい体制や仕組みを作ることを意識して進めていきたいと思いました。
ご覧いただいた皆さまにも何か役に立つ部分があれば幸いです。

それでは皆さま、よい年末をお過ごしください。
画像からリア充判定をしてみる

# 初めに
みなさんは一度はリア充を爆発させたいと思ったことがあると思います。
とはいえリア充判定はなかなか難しいものです。著者は人といる写真を見るだけでリア充判定してしまうのです。
そこで今回は画像からリア充かどうかを判定してもらい起爆の意思決定に役立てたいと思います。
**※本当に起爆はしないでくださいね**

# 実行環境&使用ライブラリ
- GoogleColaboratry
クラウド上で動かせることができるもの。
- MediaPipe
Googleが提供している画像処理ライブラリ。今回は`face_detection`を使って顔認識を行う。他にも骨格検出である`pose`や手を検出する`hand`がある。

https://google.github.io/mediapipe/

- FER
FERはFace Emotion Recognizerの略のこと。顔から6つの感情をパラメータとして出力する。感情には「恐怖」、「中立」、「幸せ」、「悲しい」、「怒り」、「嫌悪」がある。

https://pypi.org/project/fer/


# 概要
リア充判定には画像を使って行います。画像から写っている人の顔を`MediaPipe`で認識し、認識された顔をFERを用いていくつかの感情のパラメータを出力します。出力された感情のうち`happy`のパラメータをもとにリア充度合いを判定します。

# リア充の定義
今回リア充判定を行う上でこちらでリア充の画像を定義をしていきます。
- 同性、異性に限らず二人以上一緒にいること
- 写っている人が全員が楽しそうであること

今回は以上の二つの条件を満たす画像をリア充画像と定義します。また顔から感情を分析する都合上マスクを着用されると正しく分析されないので定義には含まれませんがマスクが未着用という前提である必要があります。

# 判定の流れ
画像から判定する流れは以下の通りです。
- 画像を入力
- MediaPipeで画像から顔認証
- 顔認証した部分を抽出
- 抽出した画像をFERで感情分析
- 感情分析で得られたパラメータのうち`happy`のみを抽出
- 抽出した`happy`の平均値を求め閾値を基準に判定
- 起爆の意思決定を求める

# コード
必要ライブラリをインストール
```Python:
!pip install mediapipe
!pip install FER
```

必要モジュールのインポートとモデルのインスタンスの生成
```Python:
import cv2
from fer import FER
import mediapipe as mp
emo_detector = FER(mtcnn=True)
mp_face_detection = mp.solutions.face_detection
mp_drawing = mp.solutions.drawing_utils
```

判定のコード
```Python:

# 画像の選択
file = input('画像のパスを入力してください')

# 感情リストの定義
emotions = []
# モデルの設定
with mp_face_detection.FaceDetection(
    model_selection=1, min_detection_confidence=0.5) as face_detection:

  # 画像の読み込み
  image = cv2.imread(file)
  
  # 画像の大きさを取得
  img_size = image.shape[:3]
  original_y = img_size[0]
  original_x = img_size[1]

  # 画像をGBRからRGBに変更
  results = face_detection.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))

  # 認識した顔に対して処理を行う
  for idx, detection in enumerate(results.detections):
    # 認識した顔の場所を表示
    x = int(detection.location_data.relative_bounding_box.xmin*original_x)
    y = int(detection.location_data.relative_bounding_box.ymin*original_y)
    h = int(detection.location_data.relative_bounding_box.height*original_y*1.5)
    w = int(detection.location_data.relative_bounding_box.width*original_x*1.5)

    #　認識した顔を抽出
    face_image = image[y:y+h,x:x+w,:3]

    # 検出した顔の感情を予測
    captured_emotion = emo_detector.detect_emotions(face_image)

    # happyのパラメータのみ抽出
    happy = captured_emotion[0]['emotions']['happy']
    
    # 感情リストに追加
    emotions.append(happy)

# リア充判定
if len(emotions)>1 and sum(emotions)/len(emotions)>=0.85:
  print('この写真はリア充の写真です。')
  explosion = input('爆破しますか？y/N')
else:
  print('この写真はリア充の写真ではありません。')

```

ライブラリをメインに使っているので案外短いコードでしたね。

`detection.location_data.relative_bounding_box`で取得できる値は画像の大きさに対して正規化されているので画像の大きさを掛けることで元の位置に戻す処理をしています。

今回は検出した顔が２つ以上かつ検出された顔の幸せ度合いの平均が0.85以上ならリア充判定としています。幸せ度合いを平均している理由は個人ではなく全体の雰囲気が煌めいているかどうかを表したいためです。

# 最後に
いかがだったでしょうか。色々試してみると、写っている全員の顔を検出できないことがたまにあるのでめちゃくちゃ幸せそうなカップルの画像なのにリア充ではないと判断されることがありました。とはいえ感情分析はかなり納得の精度ではあるのでまだ改善の余地はあるものの起爆の意思決定の一つにはなるのではないでしょうか。
まぁ、起爆する人がいなくなるくらい世界中が幸せで溢れるのが一番です。
技術メモで会社の資産に -モブプロ開発を行っているチームでやっている取り組み-

# はじめに

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

今回は「技術メモ」の取り組みについて紹介します。
技術メモをとることで徐々に会社やチームの資産を作り上げたり、無駄な時間を使わないために必要な取り組みだと思っています。
日々丁寧にやっていくのは大変ではありますが、将来的には役に立つ良い取り組みだと思っています

# 前回

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

# Chapter#21 それ調べるの何回目？

アール「TypeScriptでMap書く時ってどうやって書くのか毎回忘れるんですよね」
ベープ「私は大体覚えましたよ、JSXの時と関数で書くときは若干違うのでそこにも慣れました」
じん「また今回も調べてる感じですかね。慣れればそのうち覚えますよ」
ミュート「覚えるほどたくさん使わないんだよなぁ」
じん「今回のMapくらいなら検索すれば一瞬でやり方がヒットするので時間はかかりますが、例えばRailsのDeviseなど普段よく使うけど最初しか使わなくて毎度調べて時間かけているライブラリなどあれば、技術メモとして残しておくとよいですよ」
アール「技術メモってなんですか？？」
じん「技術メモというのは、どこのサイトをみたらできるようになったか、どうすればできるようになったかなどの知見をまとめておくものです。同じことを時間がたってからやるときにまた調べなおしでは時間がかかるのでやっています」
ミュート「そんなことやってたんだね」
じん「この取り組みはチームや組織でやるとさらに効果を出すと思うので、私たちのチームでも技術メモやっていきましょうか」

# 技術メモとは

技術メモとは、ある技術を導入・使用する際に時間がかかった場合に、参考になるサイトややり方などを知見としてまとめておいたメモとなります
このメモを用意することで、時間がたった後に同じ技術を使う際に読み返すことで大きな時間ロスを防ぐことができます

この技術メモを組織やチームで管理することで新しいことだけど、組織としては実績がある技術などもメモを見て効率的に導入することが可能です。
新人教育などでも、このメモをつくらせることで簡単なアウトプットの練習になると思います。

この取り組みを始めるきっかけになったのはたまたまみたこのツイートでした

https://twitter.com/jnchito/status/1286553471089405953?s=20&t=-B2h_iRKejv7_8s2zTyiMQ

そこから「個人メモ」を「技術メモ」ととらえて新しいことをする際には自分用のメモを作っています
技術メモで個人で利用してるのは「Notion」です

しかし、組織で利用するとなると私の会社では「Notion」が利用できず、全員が同じところにナレッジをまとめる方法がありませんでした
そこで利用していたのが「HackMD」でした

https://hackmd.io/

これを利用することで全員が同じマークダウンを編集できます
しかし、検索するとなると使いづらく、ひたすら技術メモが箇条書きに書かれるだけで利用されないという問題が発生
(こんな感じでただ書いてあるだけでみることはほとんどない)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/5c1286ba-4a0f-b7cd-7ef2-e93355402443.png)

そこでベープさんに協力してもらい「技術メモアプリ」をReactで作成していただきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/6b895152-e337-fe26-f316-66e1b4213053.png)

このアプリを利用すればしっかりとタグがつけられるのであとから検索できるようになり、より利用しやすくなりました


「技術メモ」を運用するのに、しっかりと参考になったサイトのリンクは抑えておく、業務の最後の10分くらいを技術メモをまとめる時間として使う
この2点を徹底することでさらに技術メモがしっかりとかけるようになりました

新技術を試す際には、ぜひやってほしい取り組みです
また技術メモアプリはフロントエンドのちょうど良い難易度かと思いますので、初心者の方に1か月程度で実装してもらうのも勉強になるかと思います

# 次回

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

# おわりに

今回は短くはなりますが、技術メモについての取り組みでした
次回は技術メモにつづいて、成長メモの取り組みにつてい紹介します。
どちらもメモにはなりますが、私自身は良い取り組みだと思っていますので一人でもやってみようかなと思う人がいればうれしいです
JavaScriptのおもしろサービス



[MYJLab Advent Calendar 2022](https://qiita.com/advent-calendar/2022/myjlab)、8日目の記事です。

前回は@toshiki19さんの[コムドットのヤマト風のTwitterつぶやきを自動生成してみようと思った](https://qiita.com/toshiki19/items/860034f8c0c45919feb4)でした。



8日目の今日はジェネラティブアートのお手軽体験サービスを紹介します。

ではいきましょう


# 背景
最近JavaScriptをさわる機会が増え、何か面白そうなサービスとかライブラリないかなと調べていたところでした。そこで出会ったのがジェネラティブアートです。簡単にできそうなのないかな。


# ジェネラティブアートとは
プログラムによって描かれた芸術作品のことを指します。懐かしの\sinや\cosなどを使って書いたり、乱数使って書いたりして作っていきます。コードの組み合わせによって思いがけない作品ができるかもしれないという面白さがあります。
なんとジェネラティブアートは国際会議も開催されているみたいですね
->> http://www.generativeart.com/


# お手軽に体験できるサービス
ジェネラティブアートをブラウザで体験できるサービスを2つ紹介します
* Dwitter
* tixy.land


# Dwitter
[Dwitter](https://www.dwitter.net/)は、ブラウザでデジタルアートを作ることができるサービスです。
140文字以内でコードを書くという制限の中で作り出します。サービス内で自分の作品も投稿できたり、GIFに書き出すこともできます。

### 作品を見てみる
以下のURLから入ります
https://www.dwitter.net/d/26520

![スクリーンショット 2022-12-01 14.26.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/21c7543e-08d4-1cfd-dfb3-0d3c47311b9c.png)


140文字以内でこんな素敵な作品を作ることができます。
文字数制限があるため難しい部分もありますが、制限があるなかでいかに面白い作品を作れるかを考えるのは面白そうですね。

### 使い方
1. 以下のリンクから入る
    https://www.dwitter.net/
1. 右上の「New dweet」と書かれたオレンジ色のボタンを押す。ボタンを押すとコードを記述する蘭とキャンバスが出てきます
1. コードを書く

1~３まで終えると自動実行されてキャンバスに実行結果が流れます
 
コードを記述する欄にはサンプルコードが書かれているのでそれを元に作って行くのも良いですね。そしてショートハンドもあります。
```
u(t) is called 60 times per second.
t: Elapsed time in seconds.
S: Shorthand for Math.sin.
C: Shorthand for Math.cos.
T: Shorthand for Math.tan.
R: Function that generates rgba-strings, usage ex.: R(255, 255, 255, 0.5)
c: A 1920x1080 canvas.
x: A 2D context for that canvas.
```

私もサンプルコードに乱数を足して四角形をチカチカさせて遊びました。そのときのコードはこちらです。
```
function u(t) {
c.width=1960 // clear the canvas
for(i=0;i<5;i++)
x.fillRect(40+i*200+C(t)*30,Math.random()*10**2,Math.random()*10,200)// draw 50x200 rects

} // 140/140
```



# tixy.land
[tixy.land](https://tixy.land/)はアニメーションをプログラムできるサービスです。これもブラウザで利用可能です。 16×16のドットの中でアニメーションを作ります。コードを書き終えた後にエンターキーを押すとURLが生成されます。共有もしやすいですね。
![スクリーンショット 2022-12-01 14.46.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/935019/d2ce446a-2c34-6a39-617c-b91b67cb7a9a.png)

### 使い方
URLを踏むとアニメーションとコードが出てきます。コード部分を編集すると自動実行されます。お手軽ですね。

### 使ってみる
分子をyからxに変えてみる
```
Math.sin(x/8+t)
```
動きが縦方向から横方向に変わりました
以下から見ることができます

https://tixy.land/?code=Math.sin%28x%2F8%2Bt%29


もう1つ。流れを早くしてみよう。
```
Math.sin(x/8+t*2)
```



https://tixy.land/?code=Math.sin%28x%2F8%2Bt*2%29




# まとめ
以上ジェネラティブアートのお手軽サービスの紹介でした。ブラウザで体験ができるのはとてもお手軽でありがたいですね。他の人が制作した作品も見ることができるので、見るだけでも楽しいですし勉強になります。
とてもざっくりとした内容で短い記事でしたが見ていただいでありがとうございました。

明日の記事もお楽しみに
pip install等のpipコマンドが使えない時の対処法

## そもそもpipとは
pipとは"Pip Installs Packages","Pip Installs Python"の頭文字をとったもので、Pythonのコンピュータのプログラムをインストールやアンインストール、ライブラリなどの管理を自動化するシステム

## 原因1 : そもそもPythonがインストールされていない
PipはPythonのシステムで、Pythonがインストールされていないとそもそも使えません。Pythonがインストールされているか確認する方法
コマンドプロンプトを開いて
```
python --version
```
と入力し、エンターを押してみてください。
PythonがインストールされていればPythonのバージョンが表示されます。

## 原因2 : 環境変数が設定されていない
環境変数が設定されていない場合、pipモジュールの場所がわからず起動することができません。
私もこれが原因でpipコマンドを使用することができませんでした。
### 対処法
__1. py -mコマンドを使って起動する。__
これは指定されたインストールされているモジュールを実行するもので、実行したいモジュールが環境変数に登録されていなくてもPythonが探して実行してくれます。
ターミナルに
```
py -m pip install インストールしたいパッケージ名
```
と入力してみましょう。

__2. 環境変数を設定してpipコマンドを使用できるようにする。__
1の方法でもpipコマンドを使用することはできますが、根本的な解決ではありません。
環境変数を設定してpipコマンドを使用できるようにしましょう。

#### 環境変数を設定してpipコマンドを使えるようにする方法
__1.　Pythonのありかを確認する__
コマンドプロンプトで
```
where Pyhton
```
と入力し、Pythonの場所を確認します。
出てきた結果がPythonの場所です。
後ほど使用するため、コピーしておきましょう。

__3.　コマンドプロンプトを開きます。__
__4.　開いたら右上にある検索ボックスに「システムの詳細設定」と打ち込みます。__
![qiita_pip1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961732/d01259da-f6cb-506b-2a20-0688b1294108.png)
__5.　するとシステムという項目が出てきますので、その下にあるシステムの詳細設定の表示をクリックします。__
![qiita_pip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961732/e9b9fd0d-c699-9674-5864-ac7925223767.png)
__6.　環境変数をクリックします。__
![qiita_pip3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961732/b75d95d6-6484-d7aa-4afe-15f068cfc0ba.png)
__7.　二つ枠があるうちの下のシステム環境変数の変数が[Path]の行を選択し、編集を押します。__
![qiita_pip4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961732/d7c58274-31f8-8146-6d16-a176fba3b157.png)
__8.　環境変数に追加する__
新規　をクリックし、1でコピーした文字列をペーストし、<font color=red>python.exeをScriptsに書き換えて</font>エンターを押したら完了です。
![qiita_pip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2961732/92f6c929-a5b4-97bf-e4f9-2667b08ec6ee.png)

__9.　設定できているかの確認__
最後に環境変数が設定できているかを確認するためにコマンドプロンプトを開き、
```
pip --version
```
と入力しましょう。
バージョンが表示されれば成功です。
【図解】Hydration（ハイドレーション）をなんとなく理解したい

この記事は、[Ateam LifeDesign Advent Calendar 2022](https://qiita.com/advent-calendar/2022/ateam-life-design) シリーズ1の7日目の記事です。

## ハイドレーションとは？
> ハイドレーションまたはリハイドレーションは、クライアント側JavaScriptが、静的ホスティングまたはサーバー側レンダリングのいずれかによって配信される静的HTML Webページを、イベントハンドラーをHTML要素にアタッチすることによって動的Webページに変換する手法です。
([Wikipedia](https://en.wikipedia.org/wiki/Hydration_(web_development))より)

つまり、サーバーサイドレンダリング(SSR)などで事前にサーバー側で作られたHTMLを、JavaScriptで動的にしていくプロセスのこと。

## ハイドレーションの流れ
### 1. サーバー側でHTMLを生成
- SSRや静的サイトジェネレート(SG)など

### 2. サーバー側で生成した静的なHTMLをブラウザで受け取り、表示する
- 操作はできないが、HTMLを利用できるためユーザーはコンテンツを閲覧できる

### 3. サーバー側とクライアント側のHTMLの一致をチェック
- これが一致しない場合、ハイドレーションは失敗する
    - 再度レンダリングが行われる
        - ページごと再レンダリングされるため、パフォーマンスに悪影響がある
        - `Prop 'XXX' did not match. Server: aaa Client: bbb`といったエラーの原因
- 一致する場合、レンダリングはされず4に移行する

### 4. イベントハンドラーがHTMLに登録される
- このプロセスをハイドレーションと呼ぶ
- ハイドレーション後は、インタラクティブになり操作が可能になる

![hydration.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/545547/6768360f-2f50-4dcf-f83e-c359408e6f12.png)


## ハイドレーションを利用すると何がいいの？
- **パフォーマンス**
    - 初期表示までの時間が短縮される
        - クライアントサイドレンダリング(CSR)の場合
            - JavaScriptをダウンロードしてDOMを構築するまで、サイトのコンテンツは表示されず、操作もできない時間が生まれる
        - SSR(+ Hydration)の場合
            - JavaScriptが読み込まれる前にHTMLを利用できるため、初めにコンテンツが表示されるまでのスピードが早くなる
            - インタラクティブではないが、ユーザーはコンテンツを閲覧でき、空白の時間が少なくなる
- **SEO**
    - HTMLとして生成されているため、検索エンジンなどがサイトをクロールしやすい



## 終わりに
Hydrationの挙動についてざっくりまとめてみました。もし何らかの参考になれば幸いです。
間違いがあればご指摘いただけると助かります…！
paiza.ioでelixir その126

# 概要
paiza.ioでelixirやってみた。
ニューラルネットワークで、xor推定したけど、浮動小数点使わないで、int8でやる。

# サンプルコード

```
defmodule Nn do
	def mul(a, b) do
	    Enum.map(a, fn i -> 
    	    i * b
        end)
	end
	def add(a, b) do
	    for x <- 0..7 do
		    Enum.at(a, x) + Enum.at(b, x)
	    end
	end
	def sum(a, b) do
	    for x <- 0..7 do
		    Enum.at(a, x) * Enum.at(b, x)
	    end
	    |> Enum.sum
	end
	def tanh(v) do
		Enum.map(v, fn i -> 
		    a = :math.exp(i/10)
            b = :math.exp(-1 * i/10)
            floor((a - b) / (a + b) * 10)
		end)
	end
	def sigmoid(a) do
		Enum.map(a, fn i -> 
		    floor((1 / (1 + :math.exp(-1 * i/10))) * 10)
		end)
	end
end


w10 = [-35, 3, -15, 22, 23, 27, -19, -12]
w11 = [21, 2, 20, -14, -15, 19, 32, 19]
b1 = [-7, 3, 4, 3, 3, -4, 4, 2]
w2 = [14, 7, -24, -18, -25, 39, -19, -14]
b2 = 9
for i <- 0..1, 
    j <- 0..1 do
    h = Nn.mul(w10, i)
    #|> IO.inspect
    l = Nn.mul(w11, j)
    #|> IO.inspect
    h = Nn.add(h, l)
    #|> IO.inspect
    h = Nn.add(h, b1)
    #|> IO.inspect
    h = Nn.tanh(h)
    #|> IO.inspect
    y = Nn.sum(h, w2)
    #|> IO.inspect
    y = y + b2
    #|> IO.inspect
    y = Nn.sigmoid([y])
    #|> IO.inspect
    y = Enum.at(y, 0)
    IO.puts "#{i} #{j} #{y}"
end




```

# 実行結果

```
0 0 0
0 1 10
1 0 10
1 1 0
```

# 成果物

https://paiza.io/projects/DLVDSWKvtU23OWzNHw4cgg?language=elixir


以上。
paiza.ioでelixir その125

# 概要
paiza.ioでelixirやってみた。
ニューラルネットワークで、xor推定したけど、浮動小数点使わないで、int8でやる。
構想編

# 方針
- 量子化を用いて、変数を浮動小数点から、-127から127のint8に変更する。
- 活性化関数、tanhとsigmoidをint8に変更する。

量子化は、以下の式でやる。
weight * x + bias
具体的には、以下を選択した。
10 * x + 0

tanh

```
a = :math.exp(i/10)
b = :math.exp(-1 * i/10)
floor((a - b) / (a + b) * 10)
```

sigmoid

```
floor((1 / (1 + :math.exp(-1 * i/10))) * 10)
```

# サンプルコード

```
w10 = [-3.4681022, 0.379121, -1.4711456, 2.2247136, 2.3135107, 2.7624693, -1.83576, -1.1545312]
w11 = [2.1978209, 0.2895245, 2.0881913, -1.3450832, -1.4154571, 1.9255028, 3.2867477, 1.956522]
b1 = [-0.6591252, 0.3864409, 0.4982838, 0.3707547, 0.3982254, -0.3612466, 0.4284867, 0.2701645]
w2 = [1.4324994, 0.7911373, -2.3011343, -1.7614117, -2.4442003, 3.9701838, -1.837263, -1.3641325]
b2 = 0.9285715

Enum.map(w10, fn x ->
    floor(10 * x)
end)
|> IO.inspect
Enum.map(w11, fn x ->
    floor(10 * x)
end)
|> IO.inspect
Enum.map(b1, fn x ->
    floor(10 * x)
end)
|> IO.inspect
Enum.map(w2, fn x ->
    floor(10 * x)
end)
|> IO.inspect
floor(10 * b2)
|> IO.inspect





```

# 実行結果

```
[-35, 3, -15, 22, 23, 27, -19, -12]
[21, 2, 20, -14, -15, 19, 32, 19]
[-7, 3, 4, 3, 3, -4, 4, 2]
[14, 7, -24, -18, -25, 39, -19, -14]
9
```

# 成果物

https://paiza.io/projects/dX-04Ez_K6w6YSAVvszcng?language=elixir

以上。
FreeBSDはどれくらいBSDなのか

# はじめに
12月2日のワークショップで東工大の佐藤先生の「macOSはどれくらいBSDなのか」という話を聴き、FreeBSDはどれくらいBSDなのかと考えた次第です。

# 考察するための考え方
何を基準にBSDであるのか考えるために以下の基準で考察するのが適切かと考えます。

1 CSRGのコードがどれくらい残っているか。
2 4.4BSDの機能がどれくらい残っているか。

一つ目はすぐに答えが返ってきそうです。
二つ目は佐藤先生の説明ではプロセスとスレッドの話は出てきてましたが、そもそもプロセスレベルの話、プロセスグループとかプロセス間通信（ソケット）なついてどこまで昨日が残り使われてるかなど見てみようかと思います。


# おわりに
来年のアドベントカレンダーの宿題とさせていただきたく思います。
min() max() clamp()を使ってみる

[ひとりCSS Advent Calendar 2022](https://qiita.com/advent-calendar/2022/css-becolomochi) 7日目です。

min(), max(), clamp()を使ってみます。

## CSS関数について

CSSの値のひとつ。通常の値より複雑でデータの処理などを行いたいときに使う。
今回使いたいmin(), max(), clamp()のようにかっこがついている。

### 基本の形

```css
セレクター {
  プロパティー: CSS関数名(引数)
}
```

## min()

- 引数が2個。比較して小さい方を返す
- `width: min(50vw, 200px);` なら基本は50vwだが200pxより大きくなることはない、みたいな考え方
- clampやcalcの中に入れて使うことがよくあるらしい

## max()

- 引数が2個。比較して大きい方を返す
- `width: max(50vw, 200px);` なら基本は50vwだが200pxより小さくなることはない、みたいな考え方
- 要は最小値を設定できるためアクセシビリティ考慮する際に便利に使える
- clampやcalcの中に入れて使うことがよくあるらしい

## clamp()

- 引数は3個
- `clamp(MIN, VAL, MAX);`が基本の形
- `max(MIN, min(VAL, MAX))` と同義
- `width: clamp(200px, 50vw, 400px);` なら、基本は50vwだけど、最小幅は200px、最大幅は400px

## 感想

- ウインドウ幅基準でサイズを指定したいが、最小値と最大値を設定したいときに便利に使えそう
- メディアクエリでもいいがどの幅でも印象を変えたくないときはわりとあるのでこういうときに使うといいのかも

## 参考

- https://developer.mozilla.org/ja/docs/Web/CSS/CSS_Functions
- https://developer.mozilla.org/ja/docs/Web/CSS/min
- https://developer.mozilla.org/ja/docs/Web/CSS/max
- https://developer.mozilla.org/ja/docs/Web/CSS/clamp
Snipping Tool について知らなかったこと

2020 年からアドベントカレンダー期に毎日何かを投稿するという奇祭に参加する習わしがあり今年もゆるゆる参加してみようと思い書くもの。そろそろ本当に有益な情報を書く。

[Snipping Tool を使ってスクリーン ショットをキャプチャする - Microsoft サポート](https://support.microsoft.com/ja-jp/windows/snipping-tool-%E3%82%92%E4%BD%B…7%E3%83%81%E3%83%A3%E3%81%99%E3%82%8B-00246869-1843-655f-f220-97299b865f6b)

> Windows ロゴ キー を押しながら、Shift + Sキーを押します。

`Win + Shift + S`
までは知っていると思う。なんならよく使うとおもう。

が、これ枠線がつけられる。デフォルトだと赤。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/40013465-9539-8a00-46fd-f3609a764759.png)

[設定] から [各スクリーンショットに境界を追加] を ON にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/3e2e9322-c83d-a5af-eda8-87ec02b721b2.png)

かつ色が変えられる...！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/96b84eff-e12c-daed-e7cc-0d2e86d22b09.png)

Azure の色にしてみる (#0078d4)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/93824/d3517029-625c-c2b3-8ba6-7165a2cc4d50.png)

たったこれだけで画像ちょっと映えますよね。。？！と言いたいが全部画像差し替えるの大変だよね。でも知っておくとちょっと良いよ。今年私が知らなかったことでした :snowman: