OmniAICreator/Qiita-1.07M huggingface dataset:
採用経験から振り返るエンジニアがスカウトされるための5つのポイント

## 結論

スカウトはポイントを抑えればミスマッチを少なくできる

---

### ターゲット

- 転職を考えているエンジニア
- いろんなサイトに登録したけど上手く行っていないエンジニア

---

### 筆者経験

- エンジニア4年目
- 技術面談やエンジニア採用も担当
- 元SIerの営業

---

### エンジニアスカウト用の記事

https://naruhero.site/

---

### この記事のポイント

```
採用視点で気づいた
媒体選びやアピールが足りなくてエンジニアとマッチングができていない点
改善ポイントをこちら記事でまとめてみました🙇‍♂️
```
(ご指摘・コメントお待ちしております)

---

### 想定の会社

**スタートアップ**

理由： 個人的にベンチャー/ゼロイチが好きだから

---

### エンジニアの仕事の探し方

- 求人媒体で検索
- サイト上でスカウトされる
- リファラル採用
- エンジニアの勉強会
- TwitterDM

---

#### 個人的におすすめ順位

1. **リファラル採用**
2. エンジニアの勉強会
3. スカウトサイトに登録
4. TwitterDM
5. 求人媒体で検索

---

##### おすすめ理由

- 知り合いに社内事情を聞ける
- ミスマッチが起きにくい
- 採用側もリファラルを望んでる

---

#### 今回のフォーカス

---

**スカウトサイト**
![direct-recruit.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/bf7d0a9e-f564-8854-d3c0-865d378806ca.jpeg)
出典：[vollect](https://vollect.net/proscout/)

---

### 現状

---

#### エンジニアの売り手市場

![it-zinzai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/40561109-1392-d7ee-6306-6690a8e0c13f.png)
出典：経済産業省「[IT人材受給に関する調査（概要）](https://www.meti.go.jp/policy/it_policy/jinzai/gaiyou.pdf)」

---

#### エンジニアスカウトの難しさ

- 届かない
- 見れない
- 返さない

---

##### 届かない

`サイトの多様化`
↓
`エンジニアと各媒体のバラツキ`
↓
`マッチングの減少`

---

##### 見れない

- 多すぎるスカウト
    - 1人に５００通以上のスカウトが飛んでいることも 
    - メールなどが多すぎて目を通さない

---

##### 返さない

**サイトの悪い例**
- 通知が飛んでもログインしないと中身が見えない仕様
- スキルにマッチしていないスカウト文
- テンプレ感のある内容

---

#### 採用担当の経験でわかった点

- スカウトを送る人が**エンジニアでない**ことも多々
- エンジニアであっても大量の候補者を見るのは大変
- ポイントでしか見なくなる

---

##### わかりやすさが重要！

---

### ミスマッチを避ける5つのポイント

---

#### 1. どの分野のエンジニアなのかを明確に

- 何系の技術を好んでいる人なのか (ex Web系、スマホ系、ネットワーク系
- フォーカスしたい内容をはっきりと
    - サービスに関わりたいのか
    - セキュリティに強くなりたいか
    - フロントをやりたいか
    - など

---

#### 2. 希望職種などの希望を埋める

- 可能性として社内SEやITコンサルを選ぶ人も多い
    - `希望職種が広い` → `専門がないイメージに`

---

#### 3. Githubの見せ方で勘違いを無くす

- Github上で活動をしているかは現場にもよる
    - `活動してない ≒　弱いエンジニア` ではない
    - 活動記録がないことでの勘違いは避けたい

---

##### とりあえず毎日コミットを意識

![スクリーンショット 2022-04-24 13.07.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/3701dc29-7819-48fa-75d1-58b37b8033f7.png)

---

#### GithubのREADME

大したことはしていないが勘違いされないほどに装飾
![スクリーンショット 2022-04-24 13.07.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/b1910cad-38d9-5773-6fc2-23b96aa79353.png)

https://qiita.com/ryo-ma/items/c6298020098cb631f46e

---

https://github.com/naru20181117

---

### 4. スカウトサイトを選ぶ

---

#### 無制限にスカウトを送られないサイトを選ぶ

- 企業からスカウトが送り放題の場合
    - 数打つ戦法を取れてしまう
    - テンプレが増える
    - ミスマッチが増える

---

#### エンジニアに特化したサイトを選ぶ

- 他職種と見るポイントが違いすぎる
- 同じ項目を埋めても不必要な情報が多くなる
    - スカウトを送りたい人からするとノイズ
    - 必要な情報が埋もれる可能性がある
    - エンジニア特有の情報を入れられるサイトがベター

---

#### 5. レッテルを作る

- わかりやすさが売り込みで重要
    - 一言で何の人かを言えるように
- やりたくないことから考えた方が作りやすい

---

## 結論

フィットした媒体で正しいアピールができれば
エンジニア特有の難しさを超えて採用のミスマッチを少なくできる！

---

## 自己紹介

個人開発について発信しています！
Twitterもフォローください👏
[@1026NT](https://twitter.com/1026NT)
なる

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/498701/3db40e7d-3213-be1f-8650-c6ad5dff69c9.jpeg" width="300px">
【ExcelVBAマクロ備忘録】セルに記載された数値分繰り返し処理するサンプル

ExcelVBAマクロの備忘録です。
特定のデータ群があり、そのうちのセルに書かれた数値の数だけ、1レコード毎ずつ繰り返し処理して別シートに出力したいというマニアックな要望に対しての備忘録です。VBAに慣れている方からは難しくないですが、汎用的な記事があまり無かったので記載しておきます。

## 利用用途の例
用途として、通販サイトや会員サービスにおいて、注文点数／利用回数分／キャンペーン達成回数などの数値分だけ、ユニークなクーポンコード／キャンペーンコードなどを発行したい時などに利用します。このマクロの後、【CSV流し込み】などを行う想定です。

## Excelシートイメージ
Excelシートがあり、
・「Sheet1」には、注文番号、注文点数、顧客IDが入っているとします。
・「シリアル」シート（結果を書き出すシート）に、
　注文回数分、注文番号一覧を出力します。

![count.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/570700/568ed9b1-8b41-c67f-d442-7dbeebd2f8ec.png)

## VBAコードと使い方
1.純粋に元データのある分だけ繰り返し処理
2.そのループの中で注文点数分だけ繰り返し処理
※シート名や、出力したい列を可変出来るようにしていますので、
コード上部にある変数宣言の部分を変えてご使用くださいませ。

```
Sub 数量分だけ繰り返すマクロ()

Dim row As Integer
row = 2
'メインシートの初期行数と宣言
    
Dim mainsheet As Worksheet
Set mainsheet = Worksheets("Sheet1")
'★元データのあるシートを宣言してセット

Dim resultvalue As Integer
resultvalue = 1
'★元データの何列目を出力するか

Dim resultsheet As Worksheet
Set resultsheet = Worksheets("シリアル")
'★出力先のシートを宣言してセット

Dim tensu As Long
'点数を変数にセット（長整数型）

Dim rcount As Long
'結果シートに記載する行数の確認用

rcount = 2
'結果シートの書き始め行

resultsheet.Columns("A:A").ClearContents
'結果シートをクリア

resultsheet.Cells(1, 1).Value = "シリアル"
'結果シートの1行1列目の項目名

'全体ループ開始：行の値が空になるまで繰り返す
Do Until mainsheet.Cells(row, 1).Value = ""

    tensu = mainsheet.Cells(row, 2).Value
    '注文点数をセット（メインシートにある注文点数）

    '注文点数分同じ処理を繰り返す
    For i = 1 To tensu
        resultsheet.Cells(rcount, 1).Value = mainsheet.Cells(row, resultvalue).Value
        rcount = rcount + 1
    Next
    '結果シートに書き出す小ループ終了

    row = row + 1

Loop
'全体のループ終了

MsgBox "終了しました。"

resultsheet.Select


End Sub

```

## 最後に
同じようなデータ作成を求められた方の
お役に立てたら幸いです！
Blenderで凹んだもののベベルの比較

## 概要

下記のオブジェクトの3通りのベベルの方法の比較です。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/389d9699-9065-e8c8-1001-7f523e1dc397.jpeg" width="260">

## 方法1

下図のようにすべての面を四角面にしてからベベルし、限定的溶解する方法。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/bdac0582-607b-bea9-5939-9ff09854c85f.jpeg" width="260">

<table>
<tr>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/a502c322-9689-bc04-a71d-01df698d2676.jpeg" width="260">
</td>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/da8dbe90-4a9b-6cd1-43dd-e9c3c36f2e44.jpeg" width="260">
</td>
</tr>
</table>

## 方法2

下図のようにL字の面を多角面にしてベベルする方法。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/358d037a-bdf0-92d4-583f-02097fde18b7.jpeg" width="260">

<table>
<tr>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/e4498439-5cf1-1c38-6760-5f8b1f000b10.jpeg" width="260">
</td>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/ee40e402-7efb-5ff0-f9c9-8d15e582e45b.jpeg" width="260">
</td>
</tr>
</table>

## 方法3

下図のようにL字の面を多角面にして、２段階でベベルする方法。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/0d8e13e8-eeae-7d4d-f057-0019c17cb20b.jpeg" width="260">

１段階目は、上記のように選択してベベル。２段階目は、ベベルされなかった部分を選択してベベル。下図の左側は、２段階目直後。

<table>
<tr>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/7394157b-efb0-a771-37a3-267a1287461d.jpeg" width="260">
</td>
<td>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/3e8f7a80-4739-a238-ecbd-bb2468f5c44e.jpeg" width="260">
</td>
</tr>
</table>

## ベベルモディファイアーを使う方法

ベベルモディファイアーのジオメトリの留め継ぎ外側とこれらの方法は、下記のように対応します。

| 方法 | 留め継ぎ外側 |
|:-:|:-:|
| 方法１ | バッチ |
| 方法2 | シャープ |
| 方法3 | 弧 |

※ 厳密には、方法３と弧は、微妙に違います。

以上
[kaggle] dataframeの容量を圧縮して、メモリー不足を回避する

<h3>ソースコード</h3>

```python
def reduce_mem_usage(train_data):
    """ iterate through all the columns of a dataframe and modify the data type
    to reduce memory usage.
    """
    start_mem = train_data.memory_usage().sum() / 1024**2
    print('Memory usage of dataframe is {:.2f} MB'.format(start_mem))
    
    for col in train_data.columns:
        col_type = train_data[col].dtype

        if col_type != object:
            c_min = train_data[col].min()
            c_max = train_data[col].max()
            if str(col_type)[:3] == 'int':
                if c_min > np.iinfo(np.int8).min and c_max < np.iinfo(np.int8).max:
                    train_data[col] = train_data[col].astype(np.int8)
                elif c_min > np.iinfo(np.int16).min and c_max < np.iinfo(np.int16).max:
                    train_data[col] = train_data[col].astype(np.int16)
                elif c_min > np.iinfo(np.int32).min and c_max < np.iinfo(np.int32).max:
                    train_data[col] = train_data[col].astype(np.int32)
                elif c_min > np.iinfo(np.int64).min and c_max < np.iinfo(np.int64).max:
                    train_data[col] = train_data[col].astype(np.int64)  
            else:
                if c_min > np.finfo(np.float16).min and c_max < np.finfo(np.float16).max:
                    train_data[col] = train_data[col].astype(np.float16)
                elif c_min > np.finfo(np.float32).min and c_max < np.finfo(np.float32).max:
                    train_data[col] = train_data[col].astype(np.float32)
                else:
                    train_data[col] = train_data[col].astype(np.float64)
        else:
            train_data[col] = train_data[col].astype('category')

    end_mem = train_data.memory_usage().sum() / 1024**2
    print('Memory usage after optimization is: {:.2f} MB'.format(end_mem))
    print('Decreased by {:.1f}%'.format(100 * (start_mem - end_mem) / start_mem))

    return train_data
```


<h3>呼び出し</h3>

```python
df = reduce_mem_usage(df)
```

<h3>出力</h3>

```
Memory usage of dataframe is 109.14 MB
Memory usage after optimization is: 79.94 MB
Decreased by 26.8%
```

<h3>出典</h3>
<a href="https://www.kaggle.com/questions-and-answers/148011">How To Fix Your Notebook tried to allocate more memory than available. It has been restarted.</a>
[Kotlin]スコープ関数の使い分けをざっくりと

## スコープ関数の使い分けどうする？
今までスコープ関数をなんとなく使っていた人向けに（自戒）、ざっくりとした使い分けのまとめをお届けします。

まず、前提としてはっきりとした使い分けはないと思っています。
だからこそ、「ざっくりと」とタイトルに明記しました。

個人的に使い分けの意義としては、可読性にあると思います。
結局、スコープ関数のそれぞれはオブジェクトの操作方法が違うだけで、そんなに大きく違うわけではない所感です。

それでは、それぞれの用途を可読性という観点とともに見ていきましょう。

## let
特定のオブジェクトの操作をする前にnullチェックを入れたい場合に使いどころがあります。
これによって、短いコードでnullチェックとオブジェクトの操作を表現することが出来ます。
### サンプルコード
```kotlin
val textView: TextView? = null
textView?.let {
     it.text = "non-null"
     it.setTextColor(ContextCompat.getColor(this, R.color.black))
}
```

letで行っていることを具体的に表現すると、この場合だと少し行数が長くなってしまいますね。
```kotlin
val textView: TextView? = null
if(textView != null) {
   textView.text = "non-null"
   textView.setTextColor(ContextCompat.getColor(this, R.color.black)
} else {
   return
}
```

## with
withは、non-nullなオブジェクトの操作をする際に使いどころがあります。
このスコープ内は、textViewオブジェクトの操作しているのだなと読んでいる人に伝えられます。
### サンプルコード
```kotlin
val textView = TextView()
with(textView) {
   text = "hello world"
   size = 12.sp
   color = R.color.hoge
}
```
withを使用しないと、同じオブジェクトを指定するので少し冗長的に見えます。

```kotlin
val textView = TextView()
textView.text = "hello world"
textView.size = 12.sp
textView.color = R. color.hoge
```

## run
runはnullチェックとオブジェクト操作を同時に行います。
余談ですが自分自身、名前のカッコよさから個人開発は、全部runを使ってました。
### サンプルコード

```kotlin
val textView: TextView? = null
textView?.run {
   text = "hello world"
   size = 12.sp
   color = R.color.hoge
}
```

runを使わないで書くと、このようになります。

```kotlin
val textView: TextView? = null
if(textView != null) {
   textView.text = "non-null"
   textView.size = 12.sp
   textView.color = R.color.hoge
} else {
   return
}
```

## apply
レシーバーオブジェクトは返したいけども、操作自体はついでにやるものの戻り値とは切り離したい時に使います。
これにより、ComposeViewを返しつつ、オブジェクトの操作も行っているというのが伝わります。
### サンプルコード
```kotlin
override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?
): View {
    return ComposeView(requireContext()).apply {
        setContent {
            HogeScreen()
        }         
```
return後の処理は走らないので、applyなしで同じことをやろうとしてもKotlinの言語仕様的に難しいかと思います。

## 参考
https://qiita.com/ngsw_taro/items/d29e3080d9fc8a38691e
【よく使うEmmetまとめ】HTMLやCSSを素早く書こう！

# Emmetとは

- HTMLやCSSなどのコーディングを補完してくれる機能
- `VSCode`は標準でEmmet機能を備えている

![https://i.gyazo.com/0f0f2c169d1828b3edcf065a90321e69.gif](https://i.gyazo.com/0f0f2c169d1828b3edcf065a90321e69.gif)

# 使い方

- キーワードを入力してTAB（もしくはEnter）を押すだけ

# チートシート

[Cheat Sheet](https://docs.emmet.io/cheat-sheet/)

# よく使うEmmetまとめ

## Syntax

### `要素.`クラス名を追加

```html
p.text
<p class="text"></p>

要素を指定しなければdiv要素になる
.container
<div class="container"></div>

複数指定できる
.main.mt-20.mb-50
<div class="main mt-20 mb-50"></div>

```

### `要素#`id名を追加

```html
#front-header.header

<div id="front-header" class="header"></div>
```

### `{}`テキストを追加

```html
h1.title{Emmetについて}

<h1 class="title">Emmetについて</h1>
```

### `>`子要素を追加

```html
div>ul>li

<div>
  <ul>
    <li></li>
  </ul>
</div>
```

### `+`兄弟要素を追加

```html
div+p+a

<div></div>
<p></p>
<a href=""></a>
```

### `^`親要素に兄弟要素を追加

```html
div+div>p+a^div

<div></div>
<div>
  <p></p>
  <a href=""></a>
</div>
<div></div>

```

### `*数字`繰り返し

```html
ul>li*3

<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>
```

### `$*数字`クラス名のナンバリング

```html
ul>li.item$*5

<ul>
  <li class="item1"></li>
  <li class="item2"></li>
  <li class="item3"></li>
  <li class="item4"></li>
  <li class="item5"></li>
</ul>
```

## HTML

### `!`HTML5のテンプレート

```html
!

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  
</body>
</html>
```

### `要素名`各種タグ

```html
a
<a href=""></a>

br
<br>

img
<img src="" alt="">

btn
<button></button>

input
<input type="text">

textarea
<textarea name="" id="" cols="30" rows="10"></textarea>

style
<style></style>

script
<script></script>

他のタグもモチロンあります
```

## CSS

### `d:`display

```sass
// d:
display: block;

// d:n
display: none;

// d:f
display: flex;
```

### `m:`margin, `p:`padding

```sass
// m:
margin: ;

// m10
margin: 10px;

// mt20
margin-top: 20px;

// mb30
margin-bottom: 30px;

// ml40
margin-left: 40px;

// mr50
margin-right: 50px;

// paddingも同様 m -> p
```

### `bg`background

```sass
// bg
background: #000;

// bgc
background-color: #fff;

// bgs
background-size: contain;
```

### `f`font

```sass
// f
font: 1em sans-serif;

// fw
font-weight: normal;

// fs
font-style: italic;

// fz12
font-size: 12px;

// ff
font-family: serif;
```

### `bd`border

```sass
// bd
border: 1px solid #000;

// bdn
border: none;

// bt
border-top: 1px solid #000;

// bb
border-bottom: 1px solid #000;

// bdl
border-left: 1px solid #000;

// bdr
border-right: 1px solid #000;
```
【Rails】cocoonで保存したデータを表示する方法

# cocoonとは？
cocoonとはフォームの追加や削除の実装を行う時とても便利なgemです。
個人的には以下の記事が大変参考になったのでこちらをご参照していただければと思います。

https://qiita.com/kmjooh/items/a1613531873a22fa7862

# cocoonで保存したデータをどうやって表示するのか?
ここからはオリジナルアプリの制作時に実装した方法を紹介します。オリジナルアプリは筋トレ日記です。

## ゴールは？
ゴールとしては以下のような表示です
[![Image from Gyazo](https://i.gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012.png)](https://gyazo.com/7a0c1f8fbfaa0a9bbd415f3201442012)
これはオリジナルアプリの一覧表示の一部ですが、種目・重量・回数・セット数はcocoonを用いてフォームを追加・削除したりして複数のデータを保存できるようにしています。

## まず日記の一覧表示はどのように実装されているのか？

結論としては以下のようになります。

```ruby:diary.html.erb
<% @diaries.each do |diary|%>
        <div class="col">
          <%= link_to diary_path(diary), class:"card mt-5 mx-auto text-decoration-none link-dark" do %>
            <% if diary.image.present?%>
              <% if diary.image.content_type.include?('image/')%>
                <%= image_tag diary.image,class:"card-img-top image-fluid" %>
              <% else %>
                <%= video_tag rails_blob_path(diary.image), class: "card-img-top image-fluid",controls: true %>
              <% end%>
            <% end %>
            <div class="text-center fw-bold">
              <%= diary.start_time.strftime("%Y年%m月%d日")%>
              <div class="mt-2">
                <%= diary.user.nickname %>
              </div>
              <div class="mt-2">
                部位: <%= diary.site%>
              </div>
```
これは一部ですが、これで日記の一覧表示ができるようになります。

## cocoonを用いて保存されたデータはどうやって表示するのか？
cocoonを用いて保存されたデータを表示するには上記のコードの下に以下のコードを記述します。

```ruby:index/diary.html.erb
<table class="table table-bordered mt-3">
                <thead>
                  <th>種目</th>
                  <th>重量</th>
                  <th>回数</th>
                  <th>セット数</th>
                </thead>
              <% diary.workouts.each do |workout|%>
                <tbody>
                  <tr>
                    <td><%= workout.menu%></td>
                    <td class="text-end"><%= workout.weight%></td>
                    <td class="text-end"><%= workout.rep %></td>
                    <td class="text-end"><%= workout.set %></td>
                  </tr>
                </tbody>
              <%end%>
              </table>
```
これで表示できるのは何故なのか？
理由はコントローラーにあって、コントローラーは以下のようになっています。
```ruby:controller/diaries.rb
def index
    @diaries = Diary.includes(:user).order('created_at DESC')
end

def new
    @diary = Diary.new
    @workout = @diary.workouts.build ##親モデル.子モデル.buildで子モデルのインスタンス作成
end
```
上記の通り@workoutは子モデルとしてインスタンスを生成しているので、その日記に対して表示されるようにしています。
それにともない、diary.workouts.each do |workout|を使用することでそれぞれの日記でのトレーニングメニュが表示することが可能になります。

補足や修正点がありましたら是非コメントをお願いします。
IBM Cloudの新認定試験IBM Cloud Associate SRE v1を受けてみた

# IBM Cloud Associate SRE v1とは

IBM Cloudの認定技術者の1つで、半年～1年程度の基礎的な経験を積んだ初級レベルの試験です。

IBM Cloud Associate SRE v1に合格すると、IBM Certified Associate SRE - Cloud v1の認定資格を得ることができます。もちろんOpen Badgeももらえます。

<img width="160" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/5baf4d81-668b-a88b-f42c-9c0398ad8405.png">

認定資格および試験の概要はこちらです。

> https://www.ibm.com/training/certification/C0010600

# 学習方法

難易度は高めでした。公式ラーニングパスは下記サイトです。

> https://www.ibm.com/training/path/ibmcloudassociatesitereliabilityengineer(sre)

しかし多くのモジュールは私にはあまり役に立ちませんでした。その中でも3000円で受けられる有料のアセスメントテスト（A1000-105）は、試験のレベル感や出題範囲を知るためにかなり有用でした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/458053be-fe6c-7213-d481-9e00c29e8eea.png)


# 受験方法

PearsonVUE社のサイトで予約して受験してください。

https://www.pearsonvue.co.jp/Clients/IBM.aspx

以前は最寄りのテストセンターでしか受験できなかったのですが、最近はカメラ付きPCがあれば自宅でも受験可能になりました。こういうご時世ですので、可能であれば自宅での受験をお勧めします。ただし部屋の片づけはきちんとしておいてください。私はいつも気分転換を兼ねてテストセンターで受けるようにしています。

# 合格点

66問中43問以上の正解で合格です。正答率は65%です。

# 出題内容

試験規約により具体的な問題文は書けませんので、雰囲気になりますが、次のような言葉は意味と仕組みを理解しておくといいでしょう。

* Availability
* DevOps
* Error Budget
* Golden Signals
* Incident Management
* Kubernetes (Probe、AutoScaler)
* Load Balancer (GLB/ALB/NLB)
* Monitoring (メトリクス、メソッド、ツール、サービス)
* Postmortem
* Problem Management
* RACI
* Resiliency
* SLI/SLO
* Trouble Shooting (IBM Cloudの特定サービスの例など)

# 感想

私は先に中級のProfessional SRE v1には受かっていたのですが、正直こちらの方が難しかったです。なぜかと考えたのですが、初級の方が実務寄り、中級の方が概念寄りなためだろうと思いました。SRE？ああGoogleの言ってるアレね、Error BudgetとかGolden Signalsとかだろ？という人はむしろ中級の方が受かりやすく、それらのフレームワークを理解して実践している人が初級に受かるのだと思います。しかし現場でGoogle的なSREを実践している人はかなり稀だと思うので・・・。

ですので、お金を払ってでもアセスメントテストを受けて、わからないところ（だらけ）をネット検索で調べる、と言うやり方をお勧めします。
GitHub GraphQL API からコミット・PR数を取得する

「最近チームが開発に時間をあてられているのかなぁ」と思い、GitHub からコミットやPullRequest数を取得してみようと思い立った。

この記事では

**「GitHubのGraphQL APIを使って特定のorganization x メンバーの欲しい情報(コミット数やPullRequest数など)を取得する」**

を目的に、実際に試した手順を紹介します。

### 確認環境

- Mac OS
- GraphQL Playground (version 1.8.10)

# GraphQL の実行環境を用意する

実行環境は GraphQL Playground を利用します。

[https://github.com/graphql/graphql-playground](https://github.com/graphql/graphql-playground)

GitHub の GraphQL を呼び出すために必要なエンドポイントや Personal access token の取得方法は、公式ドキュメントから確認します。
[https://docs.github.com/ja/graphql/guides/forming-calls-with-graphql](https://docs.github.com/ja/graphql/guides/forming-calls-with-graphql)

セットアップが完了し、実際に GraphQL を実行する際には次のような画面になります。

<div style="text-align: center;">
<img width="620px" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001166/a9444c0f-b6ce-4e8a-88a5-5e4b4864c2d7.png">
</div>

GitHub Graph QL の認証・認可を通すためには、左下の「HTTP HEADERS」に次の様な形式のJSONを指定します。
`ghp_...` の部分は GitHub の Personal access token が指定されます。
```json
{
  "Authorization": "bearer ghp_..."
}
```


# GraphQL の仕様を確認する
Playground には GraphQLのエンドポイントから API の仕様を取得する機能が備わっている。
中央右隅の「DOCS」からクエリやオブジェクトを検索することができます。
検索フォームに `commit` や `PullRequest` などを打ち込んで必要なオブジェクトやクエリの形式を確認します。

<div style="text-align: center;">
<img width="620px"src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1001166/dc5ddfd5-9f7a-79d3-5f43-d2ab3f13e126.png">
</div>

より詳細な仕様は公式サイトでも提供されています。

[https://docs.github.com/ja/graphql/reference](https://docs.github.com/ja/graphql/reference)

# GraphQL からコミット・PR数などを取得する
実際にコミット数やPR数を取得するためのクエリを紹介しますので、是非自分のGitHubでの活動を取得してみてください。

**特定アカウントのコミット数・PR数・PRレビュー数を取得する**
user.contributionsCollection で取得可能。デフォルトの取得範囲は1年間。
[https://docs.github.com/ja/graphql/reference/objects#user](https://docs.github.com/ja/graphql/reference/objects#user)


```graphql
{
  user(login: "アカウント名") {
    contributionsCollection {
      totalCommitContributions
      totalPullRequestContributions
      totalPullRequestReviewContributions
    }
  }
}
```

**特定アカウントのコミット数を期間を指定して取得する**
`from`, `to` のオプションで指定可能。
```graphql
{
  user(login: "アカウント名") {
    contributionsCollection(from: "2022-03-01T00:00:00" to: "2022-04-01T00:00:00") {
      totalCommitContributions
    }
  }
}
```

**特定アカウントのOrganizationのコミット数を取得する**
`organizationID` のオプションで指定可能。名前ではなくIDな点に注意。

```graphql
{
  user(login: "アカウント名") {
    contributionsCollection(organizationID: "MDEyO...................") {
      totalCommitContributions
    }
  }
}
```

OrganaizationIDの取得は以下のクエリで取得できる（Personal access token に `read:org` 権限が必要）。
```graphql
{
  organization(login: "Org名") {
    id
  }
}
```


--

以上で、GitHub の GraphQL の利用例の紹介は終わりです。少しでも参考になれば。
Vue.jsひたすらメモ

## 構文に関係するところ

- 同じインスタンス内の変数にアクセスする場合はthisが必須
- v-textはテンプレート構文と同様に使える
- v-onceは一回目に描画した値を保持できる
- v-htmlはdataをhtmlのタグとして扱うことができる
- v-bind:で属性値を指定することができる、コロンだけに省略可能、[属性値]を使えば動的に属性値を指定もできる、属性が複数になる場合はオブジェクト形式でかくこともできる
- v-on:click="count()"　のような感じで、引数を取らない場合は（）は省略可能！
- v-onイベントで引数を取るときは、引数eventを$eventとかく
- イベント修飾子は例のようにドットでつないでかける→　例：v-on:mousemove.stop=""
- 例のような特殊なキーボードイベントを設定することができる→　例：v-on:keyup.enter
- v-onディレクティブを使う際は、＠で省略可能　例：＠click="count"
- dataに定義しているものは動的に扱えずにあくまで、初期値を表示している→動的に値を変えるときはcomputedをつかってあげる
- Methodを{{メソッド名}}のように書くと、テンプレートが再描画されたときに毎回実行されるので、computedプロパティを使って参照先の値が変わったときのみ実行されるようにする
- computedとwatchの違いは、computedは画面に{{}}で表示されているときしか反応しない、基本はcomputedを使う
- watchは非同期処理に使われることが多い
- 非同期処理の中にthisは使えない
- {{}}の（）のつける、つけないはcomputedはつけない、Methodはつける、@click=のようなv-onディレクティブの場合はどちらでもOK
- コンポネントのときはdataは関数functionでなければならない
- htmlタグを含んだテンプレートのデータを渡してあげるには、slotタグをつかう
- 使い方は親のコンポネントタグの中に入れたいhtml要素を書き、子コンポネントでslotタグを記載する
- slotを使う場合、スタイルの適用は親子どちらにかいても適用される
- <slot></slot>タグのなにかを書き、もしスロットの中になにも指定がなかった場合はデフォルトして表示される（＝フォールバックコンテンツ）
- slotは複数使える、slotの適用先を指定したいときは、親に<template v-slot:title>を書いて、子に<slot name="title">を指定する（＝名前付きスロット）
CameraAPIを使ってみて詰まったところ

# 初めに
今現在androidのカメラライブラリーはCameraXが最新っぽいので新しく作る場合はそれを使ったほうがよさげ。今回の開発では一番初期のCameraを使う理由としては古いスマホでesp32Camのようなことができるか検証するためです。

# 実装
主な実装は公式のリファレンスを読んでね。
https://developer.android.com/guide/topics/media/camera?hl=ja

# Fail to connect to camera service

camera = Camera.open();
するときに正常にカメラが開けなかったときに発生する例外です。基本的には端末を再起動することで治りますが私の場合アプリを落とすたびに発生していました。
はっきりした原因はわかっていませんがPreviewSizeでサポートされているものを使うことで解消しました。

```.java
Camera.Size size=params.getSupportedPreviewSizes().get(0);
params.setPreviewSize(size.width, size.height);
```
また、しっかりcameraを使い終わったらリリースしてあげましょう。
VPCエンドポイントとAWS PrivateLinkの違い・関係性

## 勉強前イメージ

大体似たようなものだとは思ってる

## 調査

### VPCエンドポイント とは

VPCと他のサービス間の通信を可能にするVPCコンポーネント(仮想デバイス)で
VPC内のインスタンスとVPC外のサービスをプライベート接続で通信できるようになります。

種類には、以下の2種類があります。

- インターフェイスエンドポイント
- ゲートウェイエンドポイント

詳細は [こちら](https://qiita.com/miyuki_samitani/items/9d9f7a0c417cb75a6c85) をごらんください

### AWS PrivateLink とは

AWSへのAPIアクセスをインターネットを経由せずに行えるインターフェースタイプのVPCエンドポイントのことで、
PrivateLinkを使用すると、インターネットゲートウェイやNAT等不要になります。
PrivateLinkの実体はVPC内のNIC(Elastic Network Interface)です。

### VPCエンドポイント と AWS PrivateLink の違い・関係性

端的に言うと
`VPCエンドポイントのインタフェースエンドポイントはAWS PrivateLinkを使用して各サービスを接続` しています。

VPCエンドポイントの種類では一旦、インタフェースエンドポイントに絞られます。

- インターフェイスエンドポイント → AWS PrivateLinkに関係ある
- ゲートウェイエンドポイント → 関係ない

また、インタフェースエンドポイントはAWS PrivateLink(ENI)を使用しているので、イメージで言うと以下かと思います。

- VPCエンドポイント
	- インターフェイスエンドポイント → AWS PrivateLinkを使用して通信
	- ゲートウェイエンドポイント → AWS PrivateLinkに関係なし

## 勉強後イメージ

結構ややこしいな・・・・
けど雰囲気合ってるんちゃうかなって思ってる

## 参考

- [AWS PrivateLink を使用して VPC をサービスに接続する](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/endpoint-services-overview.html)
- [AWS PrivateLinkの使い方と注意点 ～VPCピアリングとの使い分け～](https://devlog.arksystems.co.jp/2018/05/11/4896/)
- [AWS PrivateLinkについて](https://www.acrovision.jp/service/aws/?p=1329)
Django入門する際に参考になったサイト

# はじめに
Django初心者が入門する際に有益だろうなと思うサイトがあったのでこちらの記事に置いておきます。私もDjangoを触りはじめたばかりなので有益な情報があればコメント等で共有して頂ければ嬉しいです。個人的にはこれらのサイトを読んでから市販の書籍を読むと理解が深まると思ってます。


# DjangoBrothers
チュートリアルを通してDjangoの設計思想である**MTV**(Model,Templates,View)を理解することができます。

https://djangobrothers.com/tutorials/


# キカガク吉崎亮介さんによるDjango紹介

DjangoBrothersのチュートリアルを学んだあとに読むと、軽めの内容なので頭を整理しながら読めるかと思います。

https://qiita.com/yoshizaki_91/items/f3c79e38b802c7fc8863

# RIGHT CODE社によるDjango紹介

Djangoの**CRUD**を一通り学習できます。わかりやすい説明が特徴です。ちなみにCRUDとは、データの新規登録(Create)、読み出し(Read)、変更(Update)、削除(Delete)を指します。

https://rightcode.co.jp/blog/become-engineer/django-diary-app-make-built-environment

# GeekLab.NAGANOのDjango入門
こちらも、Djangoの**CRUD**を一通り学習できます。それとデータベースが親子の場合についても説明されているので参考になります。

https://qiita.com/kaki_k/items/511611cadac1d0c69c54


# とほほのDjango入門
シンプルな説明でわかりやすいです。

https://www.tohoho-web.com/django/tutorial.html
Netlifyを使おう！

# はじめに
皆さん！Netlifyというサービスはご存知ですか？
Netlifyは、無料で静的サイトを公開できるサービスです。
GithubやGitLabと連携して、サイトを早く公開できます。
# Netlifyを使うと何ができるのか
こんな経験は無いでしょうか。
### GithubPagesが更新されないし、反映が遅い！！
絶対にあると思います。
そんな悩みを解決してくれるのが、このサービスです。
# Netlifyに登録
まずは、Netlifyにアカウントを登録しましょう。
https://www.netlify.com/
こちらにアクセスし、右上のSignUpをクリックします。
すると、Github、GitLab、bitBucket、Emailの4つのサインアップ方法を示されます。
今回はGithubでします。
Githubを選択すると、「Authorize Netlify Auth」とでてきますので、緑色のボタンをクリックします。
ここから、自分の情報を入力していきます。
Tell us about yourself - 業種や、自分のすることを入力します。
Personalize your team space - 自分のユーザー名（Githubとおなじのほうがいいかも）
# アプリを作る 
/ https://app.netlify.com/teams/*Githubのユーザー名*/overview 
にアクセスしてアプリを作りましょう。
Import from Git→Githubを認証→ウェブサイトのコードが入っているレポジトリを選択
で完成です！

https://*****.netlify.app と書いてあるリンクをクリックしたら自分のサイトができていると思います。
# Githubの方を変える
初期設定では、Githubのレポジトリを変更すると、自動的にデプロイ（更新）されるようになっています。
試しにやってみてください！GithubPagesとは比べものにならないくらい早いです。

##
いかがでしょうか。
分かりづらいかもしれませんが、この記事でNetlifyを知って、GithubPagesのお悩みを解決できるといいです！
MySQL レプリケーション

# 【MySQL レプリケーション】

## MySQLのレプリケーション構成（結果整合性モデル）
- **データ同期**
1. マスターとスレープに同一のデータを用意
1. マスターに対して、更新SQLを実行
1. マスターからスレーブに更新SQLの内容を転送
1. スレーブが転送された更新SQLの内容をリプレイ

## 参考
- MySQL徹底入門 第4版 MySQL 8.0対応
DIを使ってUseCase層にInfra層の知識が漏れるといった課題を解決する

久しぶりに記事投稿します！
最近、実務でNode.js+Typescript×クリーンアーキテクチャで開発していて
その中でDI(依存性の注入)を使っている部分があるのですがメリットがあまりわかっていなかったので本記事で纏めてみようと思います。

## クリーンアーキテクチャについて軽く

DIを語る前に軽くクリーンアーキテクチャについて少し説明します。
クリーンアーキテクチャは関心事の分離をするという目的を達成するための1つの手法として提唱されています。
クリーンアーキテクチャでは、4層の円が描かれており、各円はソフトウェアの領域を表しています。そして、最も重要なルールとして、依存性は内側だけに向かっていなければならないとしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/943494/d2bc1c5d-2318-b8cd-af40-873b040edb99.png)


具体的にいうと、
Domain層(Entities)はUseCase層に依存してはいけない。
UseCase層はInfra層(DBや外部API)に依存してはいけない。

### UseCase層がInfra層に依存してはいけないのはなぜ？
例えば、UseCaseとして、「タスクを登録する」という振る舞いがあったときを考えてみます。
このときに、「データベースに登録する」や「CSV出力する」といったinfra層の知識が漏れてしいまうと「タスクを登録する」という本来の関心事が読み取りにくくなってしまいます。(ORMやCSV出力の記述があるとコードがややこしくなる)
そのためクリーンアーキテクチャでは関心事を分離をするために依存性を内側だけに向かうようにします。


## DIについて

DIを上手く使うことでUseCase層にInfra層の知識が漏れるといった課題を解決することができます。
例えば以下のタスクを登録するUseCaseについて考えてみます。

### Infra層の知識が漏れているUseCase
``` ts
import TaskRepository from '../../../infra/repository/talentRepository'
import TaskDomainModel from '../../../domain/talent/talentDomainModel'

// タスクを登録する
export class CreateTaskUseCase {
    execute(
        name: string,
        accessSource: 'DB' | 'CSV' | 'LOG' // データの保存先を指定：DB保存なのか、CSV出力なのか、LOGを吐くだけなのか
    ) {
        const task = new TaskDomainModel(name)
        const taskRepository = new TaskRepository(accessSource)
        return taskRepository.save(task)
    }
}

```
こちらはタスクを登録するUseCaseになります。
コードの解説をすると、`name`を引数にタスクのDomainModelを生成してRepositoryを使って永続化を行います。
注目したいのが、`accessSource`というデータの保存先を意味するInfra層の知識がUseCase層に漏れてしまっている点です。
先程も書いたようにUseCase層にInfra層の知識が漏れるのはクリーンアーキテクチャの関心事を分離するという観点から好ましくありません。
DIを使えばこの課題を解決できます。


### 改善後のコード

``` ts
import TaskDomainModel from '../../../domain/talent/talentDomainModel'
import ITaskRepository from '../../../domain/talent/talentDomainRepository'

// タスクを登録する
export class CreateTaskUseCase {
    private taskRepository: ITaskRepository
    constructor(taskRepository: ITaskRepository) {
        this.taskRepository = taskRepository // DIすることでユースケース内にinfra層の知識が漏れなくなった
    }
    execute(name: string) {
        const task = new TaskDomainModel(name)
        return this.taskRepository.save(task)
    }
}
```

ITaskRepositoryではインターフェースのみを定義し、実際に保存するという具体的な処理は記載していません。
また、`accessSource`という保存先を表すInfra層の知識が漏れていないことがわかると思います。
constructorでITaskRepositoryを受け取り、ITaskRepositoryという抽象クラスに依存している状態になります。
そして、taskRepositoryのインスタンス化は円の外側のレイヤーで行うことになります。(ControllerやCliなど)

#### ITaskRepository

``` ts
import TalentDomainModel from './talentDomainModel'

export default interface ITaskRepository {
    save(model: TalentDomainModel): Promise<TalentDomainModel>
}
```

DIのテクニックを使うと、ITaskRepositoryの具体的なクラスがDBに保存するようなDBTaskRepositoryであろうが、 CSV出力するためのCSVTaskRepositoryであろうが、
UseCase内では詳細を気にしなくてよくなります。
実際にはデータを永続化するという抽象的なことには依存しているけど、DBやCSVにデータを永続化するという具体的なことには依存していないため関心事が分離されている状態になります。

このようにDIを使えば、依存関係を整理することができます。

局所的に見れば、「なんでこんなややこしいことするの？」ってなりますが、プロダクトを大きくする上で層ごとの役割を明確にすることで保守性、可読性が上がっていくと思っています。
自分はまだまだこの辺の知識が浅いので頑張って理解します。
Swiftで三角関数を再帰関数で求める。

```Swift
func sin(_ x: Double) -> Double {
    if abs(x) < 1e-6 {
        return x
    }
    let a = sin(x/3)
    return 3*a - 4*a*a*a
}

func cos(_ x: Double) -> Double {
    if abs(x) < 1e-6 {
        return 1 - x*x/2
    }
    let a = cos(x/3)
    return 4*a*a*a - 3*a
}

func tan(_ x: Double) -> Double {
    if abs(x) < 1e-6 {
        return x
    }
    let a = tan(x/3)
    return (3*a-a*a*a)/(1-3*a*a)
}

print(sin(1)) // 0.8414709848079318
print(cos(1)) // 0.5402475011786687
print(tan(1)) // 1.5574077246544553
```

理論値:
$\sin(1) = 0.8414709848$
$\cos(1) = 0.54030230586$ 
$\tan(1) = 1.55740772465$

三倍角形の公式を再帰的に用いて三角関数を計算出来る。
案件準備：Vue.jsで何か作ってみる



# 理由・背景
自分のスキルを見直してみてVue.jsは使う可能性があるので学んでみた。
たまたま使う案件があるので参加した。

## 参加前の準備と案件に参加してみて
cdnの仕組みを使ってtoDoを作成した。
まず、Vue CLIに非常に戸惑った。また、C.S.Sにも悩まされた。
そのため　Vue CLI でtoDoを作って見ることにする。
## 仕様

・Vue.js で　Vue CLIを使ってアプリを作成すること
・Todo項目追加、一覧取得、完了済みマークメソッド
・日付登録[次案件]
・データベースと連携する[次案件]

## 前提条件
以下がインストール済みであることを前提とする。
node.js
npm

## 準備
下記の記事を参考にしました。
https://qiita.com/engineer-ruirui/items/c8fcbb9200ddf5d46df1

任意のブラウザでhttp://localhost:8080/にアクセスしてください。

```
npm install -g @vue/cli
Desktop $ vue create todo-app
todo-app $ npm run serve
```


## プログラムコード
App.vue

```Vue
<template>
  <div id="to-do">
    <p>
      NewTask:
      <input type="text" v-model="newTask">
      <button @click="addTodo()">Add</button>
    </p>
    <hr>
    <ul>
      <li v-for="(todo, i) in todos" v-bind:key="i">
        <input type="checkbox" v-model="todo.isCompleted">
        <span :class="{ 'complete': todo.isCompleted }">{{ todo.task }}</span>
        {{ todo.date }}
        <button @click="deleteTodo(todo)">Delete</button>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data: () => {
    return {
        newTask: '',
        todos:[
            { task: 'Rubyの勉強をする', isCompleted: false, date: '2021/01/02' },
            { task: 'Vue.jsのアプリを作る', isCompleted: false, date: '2021/01/02' },
            { task: 'Youtubeをみる', isCompleted: false, date: '2021/01/02'}
        ]
    }
  },
  methods: {
    addTodo: function() {
      if (this.newTask == '') return;
      this.todos.push(
        { task: this.newTask, isCompleted: false, date: '20XX/XX/XX'}
      );
      this.newTask = '';
    },
    deleteTodo: function (todo) {
      var index = this.todos.indexOf(todo)
      this.todos.splice(index, 1)
    }
  }
}
</script>

<style scoped>
 ul {
   margin: 0;
   padding: 0;
   list-style-type: none;
 }

 ul > li {
  margin: 5px;
  text-indent: 0;
 }

 #to-do {
   width: 800px;
   margin: 0 auto;
 }

 ul > li > .complete {
   text-decoration: line-through;
   color: #ddd;
 }
 .title {
    color: #ffbb00;
 }
</style>
```
## 画像
![スクリーンショット 2022-04-16 18.38.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/271383/7e07e76d-1889-0963-3de3-875463171e7c.png)

## 番外
急には出てこないtips
・CSS使いたい時
```
<p style="color: red;">これからのCSS</p>
```
・文字コードはUTF-8で保存する。
2行目から字頭をずらしたい時のHTML、CSSの書き方（インデント）

## はじめに
<p>※コード上のインデントではなく、ブラウザ上で表現されている時のインデントの方法です。</p>

## 例
<p>※ この文章はダミーですこの文章はダミーです<br>
　 この文章はダミーですこの文章はダミーです<br>
　 この文章はダミーですこの文章はダミーです</p>

<p>以上の書き方をしたい場合。</p>

## text-indentとpadding-leftを使ってインデントをする</p>

```html
<p class="txt">※ この文章はダミーですこの文章はダミーです<br>
この文章はダミーですこの文章はダミーです<br>
この文章はダミーですこの文章はダミーです</p>
```

```css
.txt{
    text-indent: -15px; 
    padding-left: 15px;
}
```

<p>以上の書き方をすると2行目から※の分字下げをされた状態で文が書き込まれていきます。</p>

<p>text-indentの値を減らすと一番上の文が左にずれていきます。<br>
左にずれた分だけ、padding-leftで文全体を右にずらしてあげると他の文とも字頭が合うようになります。<br>
（改行タグをとっても2行目からインデントがされます）</p>

<p>開発者ツールのコンソールなどを使い調整してみてください。</p>
<p>初めての投稿でした。<br>
お役に立てれば幸いです。</p>
AppSheetで実燃費計算アプリを作る

# きっかけ

社内で使用するアプリを作りたいが、コードを書くのは面倒臭いなぁ、
と思いながらスプレッドシートのメニューバーを見ていたら、AppSheetの存在に気づいた。
まずは個人で使用するアプリを作りながら、AppSheetを勉強することに。

# AppSheetとは

ノーコード開発プラットフォームで、スプレッドシートなどの
クラウドのデータソースを使用して、ウェブアプリケーションを作成できる。

# 実燃費計算について

普段バイクで通勤しているが、実燃費は自分で計算しなければ把握できず、
スプレッドシートで管理している。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/66c60f1f-4544-ed8f-9b95-f4eb1733ea27.png)

給油するタイミングで、その時点の走行距離と給油量を入力したら燃費が計算される。
※計算式は```( 走行距離 - 前回走行距離 ) / 給油量```としている。
※初回の給油は、給油口が狭く見づらかったため、こぼした。

# 作成する上でのポイント

1. 前回走行距離の取得
1. 燃費の計算

これらを解決できれば何とかなる！

# 前回走行距離の取得

スプレッドシートなら1つ上のセルを参照すれば良いが、DBとして考えるとそうはいかない。
SQLならこのようなイメージ

```sql
select
  main.走行距離 
from
  実燃費tbl main 
where
  main.給油日 = (
    select 
      max(sub.給油日) 
    from
      実燃費tbl sub
  )
```

AppSheetでは、Data -> Columnsに「Add Virtual Column」というものがあり、
式を設定した仮想列を追加できる。
Examplesを見てみると、MAX関数があり、引数はListになっている。
また、```テーブル名[カラム名]```の記述でListを取得できるようなので、
組み合わせて、```MAX(実燃費[走行距離])```とした。
式の妥当性を検証してくれるのは助かる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/4966cec3-424e-de35-8cc7-0111811e3255.png)

# 燃費の計算

```カラム名```で入力中の値を取得できるようなので、
```([走行距離]-[前回走行距離])/[給油量]```とした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/be501875-9752-863d-e664-ea7102ac9d91.png)

# 検証

一通りできたので、実際に入力して検証してみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/bc8b6bac-dad4-8e7a-f833-f4ded03de457.png)

走行距離と給油量を入力すると、燃費が自動的に計算される。
また、この状態でSaveを押すと、しばらくしてスプレッドシートにも反映される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627583/9087cd8e-f80b-da22-f61c-8674266eebcb.png)

※分かりやすくするため、セルを塗りつぶしています。

# さいごに

AppSheetで簡単にアプリを作成できる！
ガソリンはこぼさないように注意！
AlmaLinux8.5+Python39+FastAPIローカル開発環境構築

# やりたいこと

AlmaLinux8.5でFastAPIのローカル開発環境を構築したい。

FastAPI
https://fastapi.tiangolo.com/ja/

AlmaLinux8.5 Download
https://mirrors.almalinux.org/isos/x86_64/8.5.html

# 前提

* AlmaLinux8.5が最小構成以上でインストール済みであること。
* SSH接続できること。
* root権限が使えること。

# 環境

* ホストOSはWindows11で、VirtualBoxを利用。
* ネットワーク構成はブリッジアダプターを設定。ホストOSからプライベートIPアドレスでAlmaLinuxにSSH接続可能かつ、AlmaLinuxからインターネットに接続可能。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/6e71d797-babd-0b6c-477c-55be22e08b8f.png)

# 手順

SSH接続し、root権限で実行する。

## python39インストール
```
dnf -y update
dnf -y install python39 python39-devel
```

## pythonバージョン確認

```
python3 --version
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/578e38e4-a36b-10ef-605d-4b2a894838e3.png)


## pipバージョン確認

```
pip3 -V
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/80622646-038d-d104-ac83-bec4021781b8.png)


## SELinux無効化

```
setenforce 0
```
```
vi /etc/selinux/config
```
```
SELINUX=enforcing
```
を
```
SELINUX=disabled
```
に修正。


## ポート開放

```
firewall-cmd --zone=public --add-port=8000/tcp --permanent
firewall-cmd --reload
```


# FastAPIインストール

```
pip3 install fastapi[all]
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/a442484e-6816-c037-eb8b-53f964535c8b.png)


# API実装

```
su yamato
cd /home/yamato
vi main.py
```

```main.py
import uvicorn
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
async def root():
    return {"message": "Hello FastAPI. I am Yamato."}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: str = None):
    return {"item_id": item_id, "q": q}

if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", port=8000)
```

# API起動

```
python3 main.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/f92aff02-a3e1-ce1c-696c-04fe869bb2ec.png)


# ブラウザからアクセス

AlmaLinuxのIPアドレスが
```
192.168.1.11
```
の場合、ホストOS（Windows11）からブラウザで

```
http://192.168.1.11:8000
```

にアクセスする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/c0c26149-a4f8-0c83-4e65-be6b09a0b8f0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/ce10fa79-43ac-47ab-6328-c1b2eead0ba4.png)


```
http://192.168.1.11:8000/items/123?q=abcde
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/75451/1db0fde2-b74d-4e3e-8f64-27ecf33175a7.png)
Laravel SanctumのSPA認証が本番環境でだけ動かない【備忘録】

前提条件：LaravelをAPIサーバーとして利用

ローカルで問題なく動いたのでデプロイし、いざログインしようすると`500エラー`
ログを辿ると下記のエラーが
> Session store not set on request.

## 結論
`Karnel.php`に`\Illuminate\Session\Middleware\StartSession::class`を追加するだけ
```diff_php
'api' => [
  \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
  'throttle:api',
  \Illuminate\Routing\Middleware\SubstituteBindings::class,
+ \Illuminate\Session\Middleware\StartSession::class, // 追記
],
```

解決！！
HEM-GW26Aからcurlを使って電力瞬時値を取得する

## 電力瞬時値の取得方法

```bash
curl -H 'Referer:http://ホスト名/smartmeter.html' -s 'http://ホスト名/php/get_property_m.php?ba=MACアドレス&eoj=0x028801&epc=0xE7'
```

16進文字列が返却されるので10進数で欲しい場合は```xargs printf "%d\n"```にパイプで渡す。Zabbix等で監視するにはこちらの方が便利かも知れない。

```bash
curl -H 'Referer:http://ホスト名/smartmeter.html' -s 'http://ホスト名/php/get_property_m.php?ba=MACアドレス&eoj=0x028801&epc=0xE7' | xargs printf "%d\n"
```

ホスト名とMACアドレスは自分の設定を入力する。
MACアドレスは「スマートメータ設定」で表示される(画像の赤枠部分)。
![macaddress.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252224/cffc3209-170f-356a-682a-650c688d617c.png)

## 背景

燃料費が高騰して新電力が次々と撤退する中、ついに自分が契約していた新電力も撤退してしまった。これまで電力監視をウェブサイトを経由してスクレイピングで取得していたのだが、新しい契約先の新電力ではデータ欠損が多く使い物にならない。そこで自宅に設置されているスマートメータから直接読み取ることにした。

## スマートメーター(次世代電力計)

もう何年前だったか覚えていないが、ある日東京電力からスマートメーターに交換しますと連絡がきて交換された。その頃は東京電力がリモートでブレーカーを切ることができる程度の認識だった。しかしスマートメーターはもう少し賢かった。Bルートサービスに申し込んでWi-SUNと呼ばれる通信規格で接続すれば電気の使用量を取得できるらしい。これを知って早速申し込んでみたところ、認証IDは郵送で、パスワードは電子メールで届いた。

## Wi-SUNモジュールは高い

Wifi子機は安いのだと1000円くらいからあるが、Wi-SUNはその10倍くらいの値段からスタート。ラズパイとモジュールとフルセットだと15000円くらいになる。安いモジュールも存在するがショップでは売り切れで買えるかどうかも分からない。調べるとスマートメーターの通信規格が将来Wi-SUNからWifiに変更され、現行機種はWifi対応に置き換えられる運命にあるらしい。こんな状況だと量産されないので安くするのも限界があるのだろう。結果的にWi-SUNをモジュール単品で購入するよりも撤退したメーカー製品を購入したほうが安くなっていたのでそちらを購入することにした。

## HEM-GW26Aの購入

選定理由は「telnet/sshが使える」と記載をウェブで発見したからである。結果としては使えなかった。昔は使えたようだが、脆弱性として「開発者用の隠しページにアクセスできる」と報告されており、どうやらそこでenable/disableができたようだ。残念ながら新しいファームウェアではこのページは使えなくなっていた。sshが使えれば/dev/ttyあたりに直接アクセスできると考えていたので大誤算である。電力を取得するとしてもスクレイピングは極力避けたい。

## Google Chromeによる検証

Google chromeの検証でネットワークアクセスを見ると電力の取得方法が分かる。リファラーを設定してそのURLへアクセスすれば簡単に取得できた。`get_property_m.php`にGETパラメータとして`ba`/`eoj`/`epc`の3つのパラメータを渡している。`ba`はスマートメータのMACアドレスというのは分かるが`eoj`と`epc`は良くわからない。これを未知のまま使い続けるのは少し怖い。

## ファームウェアを確認

生産終了とはいえファームウェアがダウンロードできるので中身を確認する。確認方法の詳細は大人の都合により割愛する。これによると`eoj`と`epc`のパラメータの意味は以下の通り。

- eoj: 対象種別(2バイト)+番号(1バイト)
- epc: データ種別

それぞれ0xから始まる16進文字列で与える。

|eojの上位2バイト|対象種別|
|-|-|
|0x0287|エネルギーモニター|
|0x0288|スマートメータ|
|0x0130|エアコン|
|0x0290|照明設定|
|0x026B|給湯設定|
|0x027D|蓄電池|
|0x05FD|HA対応機器設定|
|0x0287|ガス機器|
|0x0601|インターホン|

epcはエネルギーモニターやスマートメータで指定可能なパラメータらしい。

|epc|データ種別|
|-|-|
|0xE0|積算電力量計測値(正方向), kWh|
|0xE2|積算電力量計測履歴1(正方向), kWh|
|0xE3|積算電力量計測値(逆方向), kWh|
|0xE4|積算電力量計測履歴1(逆方向), kWh|
|0xE7|瞬時値, W|
|0xEA|定時積算電力計測値逆方向|
|0xEB|定時積算電力計測値逆方向|

すなわち`eoj=0x028801&epc=0xE7`というのは`スマートメータ(0x0288)の1台目(01)の瞬時値[W](0xE7)`という意味だった。

## EPCについて

調べていくとEPCは[ECHONET Lite規格書](https://echonet.jp/spec_g/?msclkid=8837a11cbd6411ecb4906ffa2c4ddc7e)にある「低圧スマート電力量メータ・HEMSコントローラ間」のECHONETプロパティと同一のものであることが分かった。例えば現在年月日を取得する0x98と現在時刻を取得する0x97を設定してみると
```bash
$ curl http://略&eoj=0x028801&epc=0x98
0x07e60410
$ curl http://略&eoj=0x028801&epc=0x97
0x1220
```
と表示された。16進数をそれぞれ10進数に直すと
|16進数|10進数|
|-|-|
|0x07e6|2022|
|0x04|4|
|0x10|16|
|0x12|18|
|0x20|32|

と確かに2022-04-16 18:32と現在時刻になっている。

## 終わりに

telnet/sshでアクセスができずに絶望したがシンプルに電力監視ができるようになり良かった。EPCの値を設定して取得可能なWeb Service APIと思うとそれなりに活用できそうである。ただ本機とスマートメータ設置位置の距離を離すと読み取りに失敗した。遮蔽物が多かったのが問題なのか、あるいは周囲の電波状況が厳しかったのかは分からない。本機はWifiルーターとしての機能もあるが運用面の不安があるため別のルーターの下でHUBとして使うことにした(WifiのdisableとAPモード)。
自然言語処理_前処理

# 大まかな流れ

①クリーニング処理
②形態素解析
③正規化
④ストップワード除去
⑤単語のベクトル化


# クリーニング処理
・不要な文字を除去。bsで引っ張ったデータに残るコードとか。
　.string　で文章だけ残せる


# 形態素解析・・・文章の細分化
ライブラリー・・・MeCab

・いくつかある
- -Ochasen：単語分割して品詞や活用なども表示-
- -Owakati：半角スペースでの分かち書きを表示
- -Oyomi：読みを表示


# 正規化・・・表記ゆれの解消
ライブラリ・・・NEologdnライブラリ

full_letter = **neologdn.normalize** ("ｸﾙﾏ")
print(full_letter) # クルマ

数字
```py
import re
t = "12月のクリスマスに100万円のダイヤモンドをプレゼントする"
print( **re.sub** ("[0-9]+","0", t)) 
```

# ストップワード除去・・・頻出単語の除去（は、が、を、に、、、など）
①辞書

ライブラリ・・・Slothlib（日本のストップワードを集めたもの）
　　　　　　　　　　　　　　　　　　　NLTK（英語のストップワード）
ダウンロード方法↓↓↓

```py
import os
import urllib.request

def download(path):
    url = 'http://svn.sourceforge.jp/svnroot/slothlib/CSharp/Version1/SlothLib/NLP/Filter/StopWord/word/Japanese.txt'
    if os.path.exists(path):
        print('File already exists.')
    else:
        print('Downloading...')
        urllib.request.urlretrieve(url, path)
        print("Finish!")

download("stopwords")
```

②出現頻度
Counterメソッド
```py
from collections import Counter
```

most_common() ///　頻度の高い単語から順に表示


# 単語のベクトル表現・・・単語の類似度を測る
word2vec

```py
from gensim.models import word2vec
```
フィナンスのための確率解析Ⅱ 連続時間モデル　第４章：確率解析

伊藤積分を定義し、それらの性質について議論を展開。これらは、連続時間での資産取引の結果のポートフォリオ価値をモデル化するのに用いられる。これらの積分を扱うために用いられる解析は、伊藤ーデブリンの公式に基づいており、通常の解析とは異なる。この違いは、ブラウン運動がゼロでない２次変分を持つという事実につながっており、ブラックーショールズーマートンの偏微分方程式におけるボラティリティ項の源泉になっている。オプションの価格ヒュ岡を、その売りポジションをヘッジするポートフォリオを決定することにより行なった。
確率過程を多次元の確率過程の場合に拡張。価格評価のためのモンテカルロ法において有用な役割をする、ブラウン運動の橋について議論する。

何かある確率過程の経路に依存するものはなんでもそれ自身確率的である。

単純な被積分過程$\Delta(t)$に対する伊藤積分を定義し、次に、これら単純な被積分過程に対する積分の極限として定義することで、これを単純でない被積分過程の積分に拡張する。
Macのショートカットアプリでディレクトリ内ファイルを一括リネームして別ディレクトリに移動する

# 結論
さっさとシェルスクリプト書いた方がいい(暴論)

# 環境
- macOS Monterey 12.3.1
- Shortcuts 5.0

# やりたかったこと
- ゲーム制作で、シナリオをGoogle スプレッドシートで管理している
- シートをTSVでダウンロードする
- ダウンロードしたファイルをリネーム(拡張子もtxtに変更)
- 所定のディレクトリに移動

今までこれを全部手動でやっていましたが、そのうち下2つはすぐに自動化できるのではと思いmacOSに標準搭載されたショートカットアプリで実際にやってみました。
なんかめっちゃハマった。

ファイルのリネームについてですが、ダウンロードしたファイル名は
`ファイル名`-`シート名`.tsv
というルールで命名されます。これを、
`シート名`.txt
に変更します。

ちなみになぜtsvからtxtに拡張子を変えなきゃいけないかというと、Unityでは拡張子tsvはよくわからんファイルということでインスペクタで指定できないからです。

# レシピ
![Screen Shot 2022-04-16 at 15.58.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/c5550540-eb0d-774b-4800-4267218ceaca.png)

実際やっていることはシンプルでダウンロード先ディレクトリからtsvファイルを一覧で取得してリネーム、そして所定のディレクトリに移動という流れです。
ここでハマったのがリネームです。

![Screen Shot 2022-04-16 at 15.47.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/7134d6e0-f26b-4251-c23c-b4bdd79f0aa1.png)
ファイルをイテレータで取得する時にさらにファイルのどの属性を取得するかを細かく指定できます。名前はファイル名(拡張子除く)なので、これでサクッととれます。
![get_filenames.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44992/e8a16406-b321-d595-fa04-81d5ec9e094e.png)

次にこれを好きな名前に変換します。正規表現が使えるので、好みに合わせて変更します。
最後に指定したディレクトリに移動します。
あぁめっちゃ簡単じゃん。

そして実行すると、

`stage_2_4_epi.tsv`

**なんで拡張子そのままなの。**

正直理由わからんのですが、推測としては拡張子を除いた名前というメタデータが残った状態で処理されていそう + 余計な拡張子だと思われるものは勝手に排除してリネームされるという処理が裏でされているんじゃないかという推理です。

で、どうすればいいかというと名前ではなく**ファイルパス**からファイル名を取得します。こちらはフルパスになるのですが、それをファイル名.拡張子に正規表現で変更してあげた後同じようにリネーム&移動で解決しました。


こんな変な沼にはまると全然解決手段が検索しても引っかからないのでさっさとシェルスクリプトなりPythonスクリプト書いた方がスプレッドシートのAPIから直接DLしてリネームまで全部できそうな気がします。
【Swift】文字列の部分置換を行う


![macOS: 12.3.1（21E258）](https://img.shields.io/badge/macOS-12.3.1(21E258)-brightgreen) ![Swift: 5.6](https://img.shields.io/badge/Swift-5.6-brightgreen) ![Xcode: 13.3.1 (13E500a)](https://img.shields.io/badge/Xcode-13.3.1(13E500a)-brightgreen)

## はじめに
APIからのレスポンスとして受け取った文字列を部分的に置換したい...ということがありました。
今回はその時に使用した、`replacingOccurrences(of:with:)`メソッドを紹介します。

## replacingOccurrences(of:with:)メソッド
公式ドキュメントより、下記のように宣言されていることが確認できます。
> func replacingOccurrences(of target: String, with replacement: String) -> String

#### パラメータ
- `target`: 置換前の文字列
- `replacement`: 置換後の文字列

実行すると新しい文字列が得られます。

## 使用例
`replacingOccurrences(of:with:)`メソッドは`Foundation`で提供されています。
使用する際は、`Foundation`をインポートしておきましょう。

下記では、"-"(ハイフン)を" "(半角スペース)に置換する操作を行っています。
#### サンプルコード
```swift: swift 5.6
import Foundation

let original = "Tap-Lele" //変換前の文字列
print("変換前:", original)

let replaced = original.replacingOccurrences(of: "-", with: " ") // "-"を" "に置換
print("変換後:", replaced)
```
#### 実行結果
```
変換前: Tap-Lele
変換後: Tap Lele
```

## さいごに
今回は文字列の部分置換ができる`replacingOccurrences(of:with:)`メソッドを紹介しました。
今後も備忘録として学んだことを記事にしていこうと思いますので、よろしくお願いします。



## 参考記事
https://www.choge-blog.com/programming/swiftstringreplacespecialcharacters/

https://developer.apple.com/documentation/foundation/nsstring/1412937-replacingoccurrences

https://qiita.com/zizi4n5/items/c5f0013236fd055c3e02#はじめに
プロパティ名を引用符（クォーテーション）で囲むことについての話

**（小鳥のさえずり 8分42秒）**

**ナレーション:** むかしむかし、あるところにおじいさんとおばあさんがいました。  

**（川のせせらぎ 2分23秒）**

**おじいさん（少し小声で）:** JavaScriptのコードを読んでいると、次のようなオブジェクトが定義されていました。プロパティ名の `background-color` はなぜ引用符で囲っているの？

```js
const obj = {
  color: 'red',
  'background-color': 'blue',
}
```
**おばあさん:** 答えはMDNに書かれています。[オブジェクトリテラル](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals) の項目を見てみると、

> オブジェクトのプロパティには空の文字列を含むあらゆる文字列が使えます。もしプロパティ名が JavaScript で有効な識別子か数値でなければ、引用符で囲む必要があります。[^1]

と書かれていますね。

**おじいさん:** 本当ですね。識別子というのはなんですか？

**おばあさん:** [それ](https://developer.mozilla.org/ja/docs/Glossary/Identifier)についてもMDNを見てみましょう。

> JavaScript においては、識別子は大文字小文字の区別があり、Unicode の文字、 $、 _、 数字 (0-9) を含めることができますが、数字で始めることはできません。[^2]

と書かれていますね。

**おじいさん（囁くような声で）:** 本当ですね。

**村人A:** ...ということは、識別子であればプロパティ名として用いる際にそのまま使用できるけれども、`-` は識別子ではないので、プロパティ名として用いる際は文字列として用いることになるのか。だから `background-color` は引用符で囲む必要があるんですね？

**おじいさん、おばあさん（声を揃えて）:** そうですね。

**ナレーション:** めでたし、めでたし。

**（村の雑踏の音 1分46秒）**

**（おしまい）**


[^1]: [オブジェクトリテラル | 文法とデータ型 - JavaScript | MDN](https://developer.mozilla.org/ja/docs/Web/JavaScript/Guide/Grammar_and_types#object_literals)
[^2]: [Identifier (識別子) - MDN Web Docs 用語集: ウェブ関連用語の定義 | MDN](https://developer.mozilla.org/ja/docs/Glossary/Identifier)
Windows11で、画像ビューアを既定のものから、他のアプリに変更できない

# 問題現象

こちらに現象がレポートされていますが、挙げられた手法では解決できなかった。。

>Microsoft コミュニティ
> 既定のアプリが変更できない
>https://answers.microsoft.com/ja-jp/windows/forum/all/%E6%97%A2%E5%AE%9A%E3%81%AE%E3%82%A2%E3%83%97/c942b7a0-22bf-439f-a493-284d45c68f2a
>

![d95a6b03-3384-4ab6-8e33-3cf4b2877b98.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/32be2cbc-de60-53b0-d134-f43c5fc452e3.png)

# 解決法

これは「フォト」アプリの問題です。
フォトアプリを右クリックして「設定」に移行します。

![Clipboard01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/666068/e92659b6-f367-dc43-1b62-661f81710210.png)

ここの「修復」ボタンと「リセット」アプリを、両方押せば治ります。


# おしまい
Unityで後ろのMeshが映り込む場合の対処法: DepthWrite



[Phoenix bird](https://sketchfab.com/3d-models/phoenix-bird-844ba0cf144a413ea92c779f18912042) というFBXをUnityで扱う際に，後ろのMeshが映り込む現象があったのでその対処法です．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/8605d433-0220-9911-5645-f7ecdf8f55be.png)


## 適用前

**Depth Write OFF & Alpha Clipping OFF**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/3b51ad1e-697a-5601-a434-15c523ad0444.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/ea3910fe-5f1f-eab9-e661-a79ec6250668.png)

### なぜ後ろのMeshが映り込むのか？

羽のような薄いパーツのある3Dモデルの場合，Meshを節約するために，Planeオブジェクトのように厚みのない2D的なMeshにテクスチャを張るという手法がよくつかわれます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/b8704952-f365-0d44-7eb2-c972c799f729.png)![mesh.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/2f5e1204-7030-10ff-83e3-cab882d5f57c.png)

こういった場合に，描画の仕組み上，前面のMeshと後ろの **厚みのない2D的なMesh** が前に出てくる場合があります．

![mesh2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/fae0ee4e-bc4f-f573-9fed-12b2defa3379.png)


## 適用後

この対処法として，Depth Write（カメラからの深度を使う）をオンにすると，この問題が解消されます．

**Depth Write ON & Alpha Clipping ON**


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/35d033ba-b44a-98d2-0763-12c2c294ae4f.png)



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/13575c1c-ef81-b090-a7bf-378313f3fb91.png)



- [Twitterアカウント](https://twitter.com/supertask_jp)
- [YouTubeアカウント](https://www.youtube.com/c/TasukuTAKAHASHI)