OmniAICreator/Qiita-1.07M huggingface dataset:
Liberty 上の Oauth2 Client でテスト

# 目的

Keycloak で SAML認証をした環境がOauth2のクライアントのテスト環境としても使えるので、テストします。DockerイメージのビルドまではSAML認証のテストと同じです。

# Gitレポジトリ

用意したGitレポジトリをクローンします。

```
git clone https://github.com/pdprof/security-auth.git
cd security-auth/saml-docker
```

# Dockerイメージのビルド

LibertyとKeycloakのイメージをビルドします。まず、ブラウザでアクセスするホスト名を環境変数 ACCESS_HOST に指定します。ローカルでテストしている場合はlocalhost、リモートの場合はそのホスト名を指定します。以下は注意事項です。

- 認証で使用するのでアクセス時のホストに一致させる必要があります。
- setup-docker.sh で docker の liberty(ol) と keycloak(kc) が開始します。
- Keycloakのビルドと起動後に100秒の待ち時間があります。環境によってはこの時間を延ばしてください。
- 9080, 9443 のポートを使用している場合はそのプロセスを事前に停止します。

```
netstat -an | grep 9080
netstat -an | grep 9443
（.. ここで 9080, 9443 を使用している場合はプロセスを停止　..）
export ACCESS_HOST=localhost
./setup-docker.sh
```

setup-docker.sh 実行の最後に出力される api-services の secret はあとで使います。

# Oauth2のテスト

以下のサイトにアクセスしてテストを開始します。

http://localhost:9080/security.oauth2_client/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/bd8b60ef-89f6-b721-a425-94a520a75c45.png)

client_secret に値を入力して　"Get /auth endpoint link" をクリックします。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/811595b5-d9f1-a411-4a85-f25ac5c76838.png)

値をもとに作成できたリンクをクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/50924b2b-0685-c935-d386-3394c2d2cf19.png)

Username : api-user
Password : password

で　Sign In します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/ff35021b-196d-8149-9e10-f25aaa65932c.png)

取得できた curl コマンドをコピーしてコマンドプロンプトで実行します。

```
curl -v -k -u api-services:ae089ecb-5931-4e32-a842-fadff67465b2 -X POST -d 'grant_type=authorization_code&redirect_uri=http://localhost:9080//security.oauth2_client/redirect.jsp&code=fafba424-4ee8-40ec-bb6f-7fb33de873e0.01e0d7b3-ceb0-472b-912f-7562cca65b3b.f42ddd1f-1ec4-41a0-b41e-99edc950c132' 'https://localhost:8443/auth/realms/pdprof/protocol/openid-connect/token' | jq
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/064b9824-e6c7-21f8-9fad-9ed6aebbdf9e.png)

access_token が取得できます。

username : api-user
token : <コピーしたもの> 

を入力して　"Get curl command of introspect the token" をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/093b1d6b-02ef-997b-4673-0b31eb9b895d.png)

取得できた curl コマンドで　introspect を実行すると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262366/88f46d92-d523-8816-800c-02fc03f81428.png)

のように active : true が取得できます。取得できた access_token が使用できることが確認できました。false になる場合は token のコピーに失敗しているか、取得してから時間がたってしまっている可能性があるので、最初のステップから急いで実行しましょう。


# 参考

以下のページの構成を参考に setup-docker.sh で自動構成してあります。

[Integrate IBM API Connect with Keycloak as an external OAuth2 provider](https://marukhno.com/integrate-ibm-api-connect-with-keycloak-as/)
スクレイピング時、iframeやjavascriptのせいで要素が取得できなかった

スクレイピングツールはnokogiriを使います
## 問題
- 検証ツールでカーソルを合わせると要素が表示されるのに、その要素を指定して取得しようとすると失敗する

僕の場合、動画をダウンロードするためurlを取得しようとしたらこの問題に陥った
この記事ではmp4ファイルを取得するのがゴールとする
その過程でもう一つの問題

- javascriptで作られた要素が取得できない

こちらに関しては強引に解決したので、あまり参考にならないかもしれない

## 原因
取得したい要素がiframeタグに囲まれている
srcで指定したurlから読み込んでいるため、iframeタグ内の要素は取得できない

## 解決過程
iframeのsrcを取得し、そのurlを取得してその中身を取得します
```
doc = Nokogiri::HTML5(URI.open(url))
iframe = "https:#{doc.at_css("iframe").attr("src")}"
```
一旦iframeの中身を確認
index.htmlに保存
```
file = "./index.html"
open(file, "wb") do |file| 
  file.print open(url).read
end 
```
web上のブラウザでカーソルを合わせるとvideoタグが現れる。
そこにmp4のurlがあるのだが、index.htmlにはvideoタグがない
どうやらjavascriptで生成されている様子
だがscriptタグの中にそれっぽいurlを発見
```
<body>
 .
 .
 <script>
  .
  .
  const args = {"id":".....","src":"..mp4","text":"...
```
javascriptのハッシュの中に定義されている様子
javascriptの定数をrubyに渡す方法など知らないので、scriptタグの中身を取得し、正規表現で削っていく
```
iframe_doc = Nokogiri::HTML5(URI.open(iframe))
script = iframe_doc.at("body script").text
rough = script.match(/\"src\"\:.*\.mp4\"\,\"title\"/).to_s
```
mp４ファイルが複数記述されてたので、その前後も含めて切り取る
こっから正規表現によって強引に削ってurl取得

完
Excelにmermaid.jsのSVG画像を挿入するとテキストが表示されない件



# 経緯

mermaid.jsで生成したSVGをExcel/PowerPoint/Wordに画像として挿入すると

* テキストだけ表示されないもの
* 色がおかしくなるもの

などの症状に遭遇したので、mermaid.js公式ページの

* flowchart
* sequenceDiagram
* classDiagram
* stateDiagram-v2
* erDiagram
* journey
* gantt
* pie
* requirementDiagram
* gitGraph
* C4Context

のサンプルからSVGを作成して、Officeアプリへの貼り付けと解析を実施。

(※v9.1.7時点)

# 調査結果

SVGの中身はテキストなのでエディタでいろいろ編集して画像挿入を試してみた結果、Officeアプリは

* &lt;foreignObject&gt;～&lt;/foreignObject&gt;の間にあるテキストをパースできてない
（Inkscapeもパースできてないけど）
※mermaid.jsのflowchart/classDiagram/stateDiagram-v2あたりが該当

* 色指定がhsl()だと同じくパースできない
※mermaid.jsのsequenceDiagramのループの点線/pieなど

ことが判明。

# 思案

Microsoftに修正依頼するべきか、mermaid.js開発者に

```
<switch>
<foreignObject>
テキスト
</foreignObject>
<text >
テキスト
</text>
</switch>
```
のように
* &lt;switch&gt;＆&lt;text&gt;タグの追加
* 色指定をRGB()に統一

をお願いするべきか。

# 余談

ちなみに、mermaid.js v9.1.3のC4Contextは生成されたSVG内の
```
<image xlink:href～
```
の"xlink:"を削除してやれば表示できるようになります。
v9.1.7では直ってますね。
ISUCON12 初参加エントリ

# 概要
ISUCON12予選に初参加しました！
ISUCONという大会自体は2年ほど前から知っていたのですが、参加チームの上限が決まっていることもあり、今年も見送りかなーと考えていたのですが、[ISUCON本](https://gihyo.jp/book/2022/978-4-297-12846-3)を読んでこれなら少なくとも一つくらいはチューニングできそう！と思い参加しました。

「ブログを書くまでがISUCONです！」とのことなので、当日のタイムラインと、予選までに勉強した内容についてまとめます。
チーム名「焼肉食いたい」でソロ出場し、最終スコアは5015でした。Goで実装しています。

# タイムライン
9:00 起床 
9:40 ISUCONのOPを見る。テンション上がる。
10:00 競技開始
10:00~11:30 EC2構築してSSH接続＆GitHubにデプロイ。システム構成を眺める。
11:30~12:30 とりあえずAPサーバとDBサーバを分離。MySQLの設定値変更。
12:30~13:30 MySQLのスロークエリ確認し、MySQLにインデックスを作成（この時点で約5000点を記録）
13:30~14:00 MySQLのADMIN PREPAREを無効化しようとしたが、エラーになってできず。一旦放置
14:00~14:30 SQLiteのスロークエリの見方がわからない。とりあえずインデックスを貼った。
14:30~16:30 
　　Nginxのログから参加者の詳細情報取得へのアクセスが重いことがわかったので
　　以下の処理を1つのSQLで行うように修正。retrievePlayerは据え置き。
　　1. competitionから大会一覧を取得 
　　2. player_scoreからプレイヤーの大会毎の最新スコア情報取得（SQL）
16:30~17:30 Nginxのログからrankingへのアクセスが重いことがわかったので、
　　以下の処理を全て1つのSQLで行うように修正。retrieveCompetitionは据え置き。
　　1. player_scoreから大会毎のスコア情報取得（SQL）
　　2. プレイヤーの重複排除（各プレイヤーの最新スコアを取得）
　　3. スコア順にソート
17:30~18:00 各種ログ出力停止

# 振り返り
APサーバとDBサーバの分離、MySQLのチューニングまでは順調だったと思います。
SQLiteに対してどうすればいいのか全くわからず、Nginxのログからとりあえず重たいURLのソースコードを眺めて、それっぽいところを修正しましたが、14:00以降ほとんどスコアは伸びませんでした。ボトルネックの計測がうまくできていなかったことが原因かと思います。
また、業務でSQL・Goを書く機会が少ないこともあり、SQLの改修にかなり時間を費やしてしまいました。来年は筋トレをしてから臨みたいと思います。

# 勉強した内容
### ISUCON本
ISUCON初心者はこの本を読んでおけば間違いないと思います。
ISUCON本の付録Aで手を動かしておけば、「ISUCONに参加したけど何もできなかった」状態にはならないと思います。

### 過去問
過去問は、[ISUCON10の予選](https://isucon.net/archives/54946542.html)だけ解きました。
ISUCON本の付録Aには、複数台構成の場合の手順は記載されていないので、
複数台のサーバーを利用する問題も一つは解いておくと良いと思います。

# 最後に
運営の皆さん、素晴らしいコンテンツをありがとうございました。
初参加でしたが、かなり楽しめました。来年も参加します！
CloudFormationでEC2をつくる

# はじめに
特定のSubnetにEC2を起動するためのCloudFormationを利用して作成します。

# テンプレートの作成
CloudFormationでリソースを作成するためのテンプレートを作成します。

```yaml:MyEC2.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Create EC2 Instance
Resources:
  MyEC2Instance:
    Type: AWS::EC2::Instance
    Properties: 
      ImageId: ami-aaaaaaaaaaaaaaaa
      InstanceType: t3a.micro
      SubnetId: subnet-aaaaaaaaaaaaaaaa
      IamInstanceProfile: role-managed-ec2
      SecurityGroupIds:
        - sg-aaaaaaaaaaaaaaaa
      Tags:
        - Key: "Name"
          Value: "My EC2"
        - Key: "Costs"
          Value: "AAA"
```
## 利用するパラメータなど

基本的にはこちらのリファレンスを参照します。

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html

#### ImageID
起動の元となるAMIを指定する。自前のAMIはもちろんコミュニティAMIも利用可能。
#### InstanceType
インスタンスタイプを指定する。
#### SubnetId
設置対象のサブネットを指定する。指定しない場合はデフォルトVPCのデフォルトサブネットが設定される。
#### IamInstanceProfile
EC2に付与するIAMロール。SystemManagerやCloudWatch関連が必要なら。
#### SecurityGroupIds
EC2にアタッチするセキュリティグループ。複数設定が可能です。

# スタックの作成
CloudFormationのコンソールからyamlファイルを読み込んでスタックを作成します。

# おわりに
とりあえず狙ったEC2を構築することはできるようになりました。もう少々研究が必要です

# 参考文献

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html
pythonコマンドが効かない

さあこれからpythonの勉強していくぞ！って時にいきなり出鼻をくじかれたことのメモ

## 前提条件
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446396/07c2cc73-2983-c112-50e9-a9b571219b3f.png)


## 発生した問題
まずpythonのバージョンを確認しようと思って
```
python -V
```
を実行するが
```
zsh: command not found: python
```
となる。え？タイプミスか？と思ったが絶対それはない。
pythonがインストールされてないんだぁと思ってインストールするが、それでも同じ結果。

少しぐぐった結果以下コマンドで確認すると...

```
python3 -V
```
```
Python 3.9.13
```
やっとバージョンが出た。。

## 原因
どうやらM1 macのアップデートでpython2が削除されていたようでした。
それによってpythonコマンドが効かず、python3コマンドだと効いた。

## パスを通す
python3って毎回打つのが面倒なので、pythonって打って反応するようにパスを変えたい。
pythonコマンドはpython2が削除されたため、「command not found: python」になっていた。

以下でpython３のパスを確認する。
```
which python3
```
ここにpython3があるとのこと。これがパス。
```
/usr/local/bin/python3
```
zshで管理してるので、そこにパスを追記する。
ちなみにシェルの確認は以下でできる。
```
echo $SHELL 
```
zshrcファイルにパスを記述するのだが、Finderさっと見たらそんなんなさそうだったので、コマンドで確認してみる。
```
ls -a
```
やはり存在しないので以下で作成。
```
touch .zshrc
```
このファイルの中にさっきのパスを記す。
```
export PATH=/usr/local/bin/python3
```
これでバージョン確認をすると...
```
python -V
Python 3.9.13
```
と出てくれました...!!!
## 学び
・パスについての理解ができた。
・コマンドでなんやかんや作業するのは理解できると楽しい。
・macのアップデートがこんなところに影響するってのもあるんだなぁと知った。
Octave で Q-Q プロットと P-P プロット

# Octave で Q-Q プロットと P-P プロット

テストデータとして，100 個の標準正規乱数を発生する。


```matlab
pkg load statistics
x = normrnd(0, 1, 100, 1);
```

## 1.　Q-Q プロット

    usage:
    [q, s] = qqplot(x)
    [q, s] = qqplot(x, y)
    [q, s] = qqplot(x, dist)
    [q, s] = qqplot(x, y, params)
    qqplot(…)


```matlab
clf;
qqplot(x);
```


![output_3_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/36830a66-2dc3-b8f9-67ca-d84f38af431d.png)

    


## 2.　P-P プロット

    usage:
    [p, y] = ppplot (x, dist, params)


```matlab
clf;
ppplot(x);
```


    
![output_5_0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2611739/822c90c1-3bdc-792c-b365-7ae6214303fb.png)
STM32F767とOLED、OLED096UNO-Aで12345678を表示(16x24)

x mbed2のリビジョン143です。
x SSD1306_128x64_I2Cライブラリインストール済
x 注意　説明を大幅に省略


![o_con595.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/7ae03ab4-761d-17a4-762b-9609bbc4efbc.jpeg)



![o_con593.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/477f0eeb-0310-676d-b4eb-1dd5d7f38028.jpeg)


![o_con594.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/777ac0e4-0887-3576-3601-34f84192de83.jpeg)


![o_con596.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/4ca06533-e01a-925f-9710-613a46b8466c.jpeg)



忙しい人よう(ライブラリーが変にマージされている注意)
リンク先が正しいのを確認しました。8/5

https://os.mbed.com/users/caa45040/code/oled_helloworld_16x24_767_1/



Dai YokotaさんのSSD1306_128x64_I2Cライブラリを使用した。


https://os.mbed.com/users/jk1lot/code/SSD1306_128x64_I2C/


1308のライブラリ


https://os.mbed.com/users/wim/code/SSD1308_128x64_I2C/



oled_helloworld_16x24_767_1


```c++


#include "mbed.h"
#include "SSD1306.h"

#define ADDR     (0x3c<<1) //  address
//#define ADDR     (0x3d<<1) //  address

//i2c initialization
I2C i2c(I2C_SDA, I2C_SCL); //767

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx

// Instantiate OLED
SSD1306 oled(i2c, ADDR);

int ii; //ループカウンター
int nn; //文字カウンター

//メイン関数
int main() {       

    //シリアルの初期化
    pc.baud(9600);    
    
    char n1_8[] = "12345678";
    
    ii=0;
    for(nn=0;nn<8;nn++){
        //                y   x
        oled.writeBigChar(0, ii*16,n1_8[nn]);
        ii = ii + 1;
    } //for
    pc.printf("Printed something\r\n");    
    while(1){}

}//main




```
文字を入力しているのにvalidationが反応してしまう時

# 概要
```ruby:記事を書くきっかけ(model)
validates :content, presence: true, length: { in: 1..140 }
```
というvalidationを書いた後、
なぜか文字を入力しているのにvalidationが反応したため
解決に至るまでの経緯を記そうと思います！

# 経緯
プログラミングスクールのツイートアプリケーション作成課題に取り組んでいる際、
以下のバリテーションを実装しました。

・投稿内容に対して1 ~ 140字以内の文字数であること

ところが、上記のバリテーションを実装し開発環境のViewで確認したところ
実装したvalidationを満たす内容でもvalidationが反応して
エラーメッセージが出てしまうという部分で詰まったため本記事を書くに至ります。

# 原因
controllerのcreateアクションの記述が足りなかったことです。
※viewのformでsubmitしたパラメータをコントローラーで受け取っていなかった

# 解決に至る経緯
上述したvalidationが反応してしまうケースは2つあると考えました。

 1.ブラウザ側がサーバー側にリクエストを正常に送れなかったケースです。
 2.はブラウザ側はリクエストを正常に送ったがサーバー側で受け取れなかったか誤った処理をしてブラウザ側に送っている

まずはparametersにcontentがしっかり入っているかを確認するため、
パラメータのところにcontentが正常に入っているかターミナルで確認しました。

![スクリーンショット 2022-07-26 21.54.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2737523/6713a6d2-0e4f-7a2d-e966-92fa96e3873d.png)

上記の画像の通り、parametersのところにcontentが正常に入っているため
今回のケースは2つ目のケースだと考えcontrollerファイルを確認しました。

```ruby:post_app/app/controllers/posts_controller.rb
#省略
def create
  @post = Post.new
  if @post.save
    redirect_to posts_path, notice: "ポストを作成しました！"
  else
    render :new
  end
end
#省略
```
上記のコードが確認した際のコードです。
```ruby
@post = Post.new
```
Post.newの部分が問題を引き起こしているところで、
newメソッドはインスタンスを生成しているだけなので
この状態でviewのフォームを埋めてsubmitしても中身がないので
サーバー側は中身がないと判断します。

なのでPost.newのところに引数を定義して投稿できるようにしていきます。

```ruby:修正後のコード
#
def create
  @post = Post.new(post_params)
  if @post.save
    redirect_to posts_path, notice: "ポストを作成しました！"
  else
    render :new
  end
end

def post_params
  params.require(:post).permit(:content)
end
```

```ruby:ここを修正した
@post = Post.new(post_params)
```
Post.new(post_params)と定義することで
newメソッドにpost_paramsという引数を渡して
それをサーバー側に送ります。

# 補足
```ruby:storng parameter
def post_params
  params.require(:post).permit(:content)
end
```

上記のpost_paramsというメソッドですが
いきなり出てきて何だこれと思われたと思います。
このメソッドはstorng parameterというもので
指定されたパラメータだけ取得するというものです。

上記のコードを例にして言いますと
postテーブルのcontentカラムのパラメータだけを
取得するという意味になります。
strong parameterを使うことで
想定していないパラメータの取得を防ぐことができ
よりセキュリティ性のある
アプリケーションを作ることができます。

# 最後に
無駄に長くなり、読みにくい文章になりましたが
最後まで読んでいただきありがとうございました！
もし皆さんの役に立ったのなら光栄です！
「達人に学ぶSQL徹底指南書」の演習問題 4-2をブラウザで実行してみた

## この記事の概要
- この記事は「達人に学ぶSQL徹底指南書/ミック著」の演習問題をブラウザのSQL実行環境([db-fiddle.com](https://www.db-fiddle.com/))で動かしてみたというものになります。
- 解説は書籍の方を参照してください。
- カラム名がアルファベット表記になっていることに注意してください

## [db-fiddle.com](https://www.db-fiddle.com/)の使い方
- テーブルの作成: Scheme SQLの欄にCREATE TABLEを書いてテーブルを作成
- データの挿入: Query SQLの欄にINSERT文を書いてデモデータを挿入する
- データの検索: Query SQLの欄にSELCT文を書く

## 問題文
「データの歯抜けを探す」(p64)では、歯抜けがある場合にのみ結果が返るクエリを紹介しました。
それではこれを、歯抜けがある場合には「toothlessness」、
ない場合は「not tothlessness」と、必ず結果を一行返すように修正してください。

- p64 SeqTbl

| seq | name |
| --- | ---- |
| 1   | dick |
| 2   | ann  |
| 3   | lail |
| 5   | car  |
| 6   | mary |
| 8   | ben  |

## データセットの準備
- Schema SQL
```sql
CREATE TABLE SeqTbl (
  seq int NOT NUll,
  name varchar(255) NOT NULL
);
```

- Query SQL
```sql
# 歯抜けあり
INSERT INTO SeqTbl  VALUES 
('1', 'dick'),
('2', 'ann'),
('3', 'lail'),
('5', 'car'),
('6', 'mary'),
('8', 'ben');

# ここも含めると歯抜けなし
INSERT INTO SeqTbl VALUES
('4', 'beck'),
('7', 'john');

```

## 解答

詳しい解説は書籍を参照してください。


```sql
SELECT
  (CASE 
    WHEN COUNT(*) <> MAX(seq) THEN 'toolessness'
    ELSE 'not toothlessness'
  END) AS gap
FROM SeqTbl;
```
Androidミラーリングツール: ScrcpyHub v1.7.0 をリリースしました

# ScrcpyHub v1.7.0 をリリースしました

![](https://images.unsplash.com/photo-1634334339429-660e1b088026?crop=entropy&cs=tinysrgb&fit=max&fm=jpg&ixid=MnwxNDIyNzR8MHwxfHNlYXJjaHwyNXx8bWlycm9yfGVufDB8fHx8MTY0NzY1MzIyMQ&ixlib=rb-1.2.1&q=80&w=1080)

# はじめに

ScrcpyHubはAndroidの画面をミラーリングするためのGUIアプリケーションです。ScrcpyHubは以下のGitHubリポジトリで絶賛開発中ですのでよければコントリュート＆スター登録お願いします。

https://github.com/kaleidot725/ScrcpyHub

ScrcpyHubはscrcpyというコマンドツールを利用して作成しております。scrcpyのコントリビュートがScrcpyHubの発展にも繋がりますのでぜひチェックしてみてください。

https://github.com/Genymobile/scrcpy

# ScrcpyHub でできること

ScrcpyHubでは以下の機能をサポートしています。以下の通りScrcpyHubでは複数のAndroid端末の画面ミラーリング、スクリーン録画、スクリーン撮影が簡単にできます。

- Windows10 / 11、macOS、Linuxに対応
- ライトテーマ・ダークテーマの切り替え
- 接続しているAndroidデバイスの自動検知
- Androidデバイスのミラーリングの開始と停止
- Androidデバイスのスクリーンショットの取得
- Androidデバイスのスクリーンの録画
- ミラーリング＆録画する動画の最大 FPSと最大ビットレートの設定
- **NEW v1.7.0: アプリケーションアイコンの更新**
- **NEW v1.7.0: ウィンドウを常に最上面するオプションの対応**

# **v1.7.0: アプリケーションアイコンの更新**

v1.7.0でアプリケーションアイコンを更新しました。今までは仮のアイコンを当てはめていたが新たなアイコンを作成して適用しました。

![icon.png](https://res.craft.do/user/full/3a21bd0e-fe7a-39aa-73ad-b52ef24b655b/doc/754472FE-C32E-41F4-966B-311C19D90609/37FA1943-7B73-4C4F-9374-0870A3B9427C_2/j9LWeyNgX3gyksXdMDTlsUiltKcHytz5SBMlPsO3ZKkz/icon.png)

# **v1.7.0: ウィンドウを常に最上面するオプションの対応**

v1.7.0でアプリケーションのウィンドウを常に最上面に表示できるようにしました。今まではどこにウィンドウがあるか見失いがちだったのですが、これで多少は見失うことも減るかなと思っています。

![AnimatedImage.gif](https://res.craft.do/user/full/3a21bd0e-fe7a-39aa-73ad-b52ef24b655b/doc/4D2FFD89-A3DB-49D0-8E74-0C4B891D00BE/26F786D2-79AD-4A2B-ABD3-AC2A2E6624A5_2/ruSUwB1KaLq7fycDQtsSxPwVKrbjXxZ2zdpg5VeM1WAz/AnimatedImage.gif)

# インストール方法

ScrcpyHubを利用するにはadbとscrcpyコマンドのインストールが必要になります。ですのでOSごとの以下の手順に従ってインストールしてください。

## 💻 Windows 10 / 11

1. [Github](https://github.com/Genymobile/scrcpy#windows)からscrcpyを任意の場所にダウンロードしてインストールする
2. [Github](https://github.com/kaleidot725/scrcpy-hub/releases/tag/v1.7.0)からScrcpyHubをダウンロードして起動する
3. ScrcpyHubのPreferencesを開く
4. adbとscrcpyのパスを通して、Saveを押す

## 💻 Linux(Ubuntu)

1. [Github](https://github.com/Genymobile/scrcpy#windows)からscrcpyを任意のダウンロードしてインストールする
2. [Github](https://github.com/kaleidot725/scrcpy-hub/releases/tag/v1.7.0)からScrcpyHubをダウンロードして、以下のコマンドでインストールします。

```other
sudo dpkg -i scrcpyhub_1.5.0_amd64.deb
```

3. ScrcpyHubを開いてPreferencesを開きます

```other
/opt/scrcpyhub/bin/ScrcpyHub
```

4. adbとscrcpyのパスを通してSaveを押す

## 💻 Mac OS

1. android-platform-toolsとscrcpyをbrewコマンドでインストールする
2. [GitHub](https://github.com/kaleidot725/scrcpy-hub/releases/tag/v1.7.0)からScrcpyHubをダウンロードして起動する
3. ScrcpyHubのPreferencesを開く
4. adbとscrcpyのパスを通して、Saveを押す

```other
brew install android-platform-tools
brew install scrcpy
```

# 🔥Contact

ScrcpyHubは[こちら](https://github.com/kaleidot725/ScrcpyHub)で絶賛開発中です、もし何か改善案や不具合などあればご連絡ください。
【#40 エンジニア転職学習】Go GinTutorial

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

7月いっぱいまでGoのフレームワークであるGinについて、
学習をしていきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
GinのTutorialとして簡単なRESTfulAPI作成の学習をしました。

* APIエンドポイント（URI）の設計
* json含めたStructの作成
* **全アイテムに対するGET作成　←Topics!!**

# 全アイテムに対するGET作成
必要な要素は2点で、
1. Responseを準備するHandler部分のコード
1. RequestパスをHandlerにマッピングコード

それぞれの機能部分を以下の関数で作成
1. `*gin.Context.IndentedJSON`でhttpステータスコードとstructをJSONに変換　→　Response本文に追加
1. ginの`GET`を使用して、RequestパスとHandler関数を関連付ける

あとは`main()`内でGinの`Router.Run`をしてサーバを立ち上げるという流れでした。

`Context`内のメソッドでJSONのシリアル化やミドルウェア間で変数を渡したり等をするため、GINの中でも非常に重要な部分だそうです。

##### 使用している教材はこちら↓


https://go.dev/doc/tutorial/web-service-gin


# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
VBEに行番号を表示させる

### 初めに
アドインを使用して行番号を表示させたいと思います。
なんか若干ずれてる・・・？　けど気にしない。。。

### 今回試した環境
Windows11
Excel 365

:::note warn
公式のアドインでありません。
予期せぬ動作をする可能性があります。
:::
実行後の画像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/41becede-785e-c1f3-df79-0fcb9c91cfea.png)


### 1.アドインのファイルをインストールする

[AddLineNumbers VB6/VBA Office 32 ビット用](http://mtj-k.no.coocan.jp/software/office_vb6/addlinenumbers_vb6.html)
[AddLineNumbers VB6/VBA Office 64 ビット用](http://mtj-k.no.coocan.jp/software/office_vb6/addlinenumbers_vba_x64.html)

インストールしたら、任意の場所で解凍します。

:::note alert
アドインをレジストリに書き込み後は移動できなくなります。
解凍する際は適切な場所を選定するようにしてください。
:::

今回私は画像の場所に展開しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/89dd6d48-5473-bb14-9103-ac72be709cb1.png)
解凍後、フォルダを見に行き、下記の.dllのファイルのパスをコピーしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/5ca125f3-72ff-b676-4751-1df434237fab.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/0f40adb1-81b2-c51d-2081-d3c3f5fad82f.png)

### 2.管理者権限でコマンドプロンプトを開く

:::note info
64ビットのWindowsで32ビットのOfficeを使用している人は下記の手順を実行する前に
cd %SystemRoot%\SysWOW64
を実行してください。
:::

```
C:\Windows\system32>　cd%SystemRoot%\SysWOW64
```

まず、Windowsの虫眼鏡のアイコンをクリックし、cmdなどと検索し、管理者権限として実行をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/fd710bc4-9609-9a98-454d-50a02c22fc01.png)

1.コマンドプロンプトで、regsvr32 "パス\VB6IDEAddLineNumbersAddin.dll"となるように入力する。私の場合は下記のようになりました。
```
C:\Windows\system32> regsvr32 "C:\Users\matsu\VB6IDEAddLineNumbersAddin.dll"
```

2.Enterを押し下記のようなダイアログが出れば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/3c79bb78-788f-3201-7cc2-68b31cfa764d.png)

### 3.VBEを開き、アドインを有効化する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/d1d24670-f042-ae18-d8f0-0e4021085780.png)

アドイン→アドインマネージャーと進み、AddLineNumbersのロードのところにチェックを入れる。無地に読み込まれれば下記のように＾行数が表示されます。
もし気に入らなかったらロードのチェックを外してもらうか、アンインストールでOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/41becede-785e-c1f3-df79-0fcb9c91cfea.png)

### 4.アンインストールする方法


64ビットのWindowsで32ビットのOfficeを使用している人は下記のコマンドを実行しておいてください。
```
C:\Windows\system32> cd %SystemRoot%\SysWOW64
```
それ以外の方はインストール手順と同じように管理者権限でコマンドプロンプトを開き、下記を実行
※パスの部分は各々で置き換えてください。
```
C:\Windows\system32> regsvr32 /u "C:\Users\matsu\VB6IDEAddLineNumbersAddin.dll"
```
完了すれば、インストールと同じように書きのダイアログが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1744893/93a356e8-7987-6ef1-6939-64eeac2c7093.png)
ダウンロードされていたファイルを削除して終了。

### 5.まとめ
画面の半分までしか行番号が表示されないようですが、インストールしてよかったと思います。特に躓くポイントもなかったので不慣れな方でも挑戦してみるといいかもしれません。
SQL Serverでテーブルごとの件数を一覧で取得する


```SQL
SELECT OBJ.name AS TableName, IND.rows
FROM sys.objects AS OBJ
JOIN sys.sysindexes AS IND
ON OBJ.object_id = IND.id AND IND.indid < 2
WHERE OBJ.type = 'U'
ORDER BY OBJ.name;
```
Teams会議のブレイクアウトルーム操作を主催者以外ができるようにする

初歩的な話で恐縮ですが、最近問題に遭遇して戸惑ったことのトラブルシューティングです。

# Problem

Teams会議でブレイクアウトルームを作成し参加者を割り当て（ルームの）会議を開始したり終了したりする権限を与えたい。
当該会議はPowerAutomateのワークフローにより登録されたもので、ワークフローを実行するユーザー（ワークフローの「接続」のユーザー）が主催者となっており、これを変えることはできない。
自動作成されるこの会議についてどうにかしてとある参加者にルームの管理をできるようにしたい。

※「主催者以外がルームを作成し参加者を割り当て、ルームの会議を開始・終了することができるよう権限を付与する」。このようなことはできて当たり前のように考えていましたがTeamsにこの機能が追加されたのは2021年秋以降のようです。

# Solution

自動作成された会議に対して主催者ユーザーによる設定変更オペが必要。
「発表者を割り当てて会議質を管理する」（Assign presenters to manage rooms）機能を利用する。
このオペにはデスクトップ版のTeamsが必要（Web版ではオペのためのUIが表示されない）。

①主催者ユーザーでTeams会議の編集画面を開き、「ブレイクアウトルーム」をクリック：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/b419949a-ee19-8a3d-50f1-4df180b81958.png)

②表示された画面の右上の⚙（ギア）をクリック：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/2d59999a-fe69-f7ac-c325-17170aa571f7.png)

③「ブレイクアウトルームの設定」ポップアップで「発表会を割り当てて会議室を管理する」をオン、すぐ下の欄で、ルームを管理する参加者を指定する：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/39548523-f6df-749e-e705-8b7bb792a7dd.png)

これだけです。

Teams会議を開始すると「割り当て」された参加者の会議画面上部に「ルーム」というメニューが表示され、そこからルームの追加、ルームへの参加者の割り当て、ルームの会議の開始と終了など、一連のブレイクアウトルーム操作ができるようになります：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/624e5f7b-5429-8b84-aaf9-3ab9db815596.png)

参加者をブレイクアウトルームに割り当てる：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/834c4d1f-f245-85e5-a27c-3a010c226587.png)

会議（サブ会議）を開始する：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/29b3a97f-a7e3-ba0f-81f6-93f8ad88c28d.png)
Ansible Playbook を途中で止めたい 〜 fail モジュールの活用

# Playbook を故意に止めたい

Ansible Playbook を作成していると、スクリプトの途中で強制的に止めたいときが、ままあります。
そんなときは、 fail という故意にスクリプトを失敗させることができるモジュールがありますので、これを使うとよいでしょう。

パラメーターは　```msg``` のみ。
この ```msg``` で失敗時に出力するメッセージを設定できます。
指定しない場合のデフォルトメッセージは
``` Failed as requested from task ```
「タスクからの要求に応じて失敗しました」といったところでしょうか。

使い方としては、
``` roles/foobar-server/tasks/main.yml
- name: planned failure
  fail:
    msg: デバッグ中：故意に失敗させています。
```
上記のように書いておくと、以下のように Fatal に失敗してくれます。
```
TASK [foobar-server : planned failure] *********************************************
fatal: [foobar-server]: FAILED! => {"changed": false, "msg": "デバッグ中：故意に失敗させています。"}
```
なお --check オプションを付けたときでも素直に失敗してくれます。

# 指定した条件のときに失敗させる

when ステートメントと組み合わせれば、所定の条件のときに後続の処理をすべて辞めることができます。
以下は必要なファイルがなかったときにスクリプトを止めるサンプルです。

``` tasks/main.yml
- name: foobar file exists
  stat: path=/etc/foobar.txt
  register: foobar_file

- name: planned failure
  fail:
    msg: FooBarファイルが存在しないため処理を中断します
  when: not foobar_file.stat.exists
```

みなさんも fail モジュールを使って Ansible Playbook をガンガン止めてみてください。


https://docs.ansible.com/ansible/2.9/modules/fail_module.html
【Flutter】go_router使って画面遷移アニメーション【Animation】

# やりたいこと

Flutterを使ったアプリの画面遷移時にアニメーションをさせたい。
Navigatorのラッパーはgo_routerを使う。

# 解決策

`builder`ではなく、`pageBuilder`を使って`GoRoute`を作る。

 まずは`builder`を使った普通の画面遷移がこれ。
至って普通。

```dart
GoRoute(
  path: '/a',
  builder: (context, state) => const AScreen(),
),
```

これを、`builder`ではなく`pageBuilder`に変えていく。
`builder`のブロックの返り値の型は`Widget`なのに対して、`pageBuilder`は`CustomTransitionPage`なので、まずは同一ファイルに下記のようなCustomTransitionPageを返すような関数を作る。
ちなみにこれはスライドイン×フェードインするようなアニメーション。

```dart
CustomTransitionPage<void> _buildPageWithAnimation(Widget page) {
  return CustomTransitionPage<void>(
    child: page,
    transitionsBuilder: (context, animation, secondaryAnimation, child) {
      return FadeTransition(
        opacity: animation,
        child: SlideTransition(
          position: animation.drive(
            Tween<Offset>(
              begin: const Offset(1, 0),
              end: Offset.zero,
            ).chain(
              CurveTween(curve: Curves.easeIn),
            ),
          ),
          child: child,
        ),
      );
    },
  );
}
```

あとは`_buildPageWithAnimation()`に遷移したい画面のインスタンスを渡して`pageBuilder`で返してあげれば完成。

```dart
GoRoute(
    path: '/a',
    pageBuilder: (context, state) => _buildPageWithAnimation(
        const AScreen(),
    ),
),
```

こうするだけで、あとは普通に`go`なり`push`なりすれば画面遷移時にアニメーションしてくれる。
ちなみに、デバッグビルドだと若干カクつくので、確認する際はリリースビルドでやった方がいい。



# まとめ

- go_routerを使って画面遷移時にアニメーションさせたい場合は、`builder`を`pageBuilder`に変えて実装しよう。

# 参考

- https://gorouter.dev/transitions
データの入力規則　リスト　元の値でROW()が使える

ROW()が使えるので
行に合わせて値を参照して、値をとってこれる

これで例えば１行目を入力規則でプルダウンにしたら
```
=OFFSET('シート1'!$A:$A,MATCH(INDIRECT("$B"&ROW()),'シート1'!$B:$B,0)-1,0,1,4)
↓実質
=OFFSET('シート1'!$A:$A,MATCH($B$1,'シート1'!$B:$B,0)-1,0,1,4)
と、同じことができる
```

用途
Excelのセルの右下のプラスマークで補完した場合でも動作してくれるので行が増えたときなどに非常に作業を短縮できる。


関連
- [Excelについて：名前とINDIRECT関数で可変リストを作る | さびなーる](https://makotsu80.com/2019/04/27/excel_indirect_name/)





[データの入力規則 リスト （プルダウン,ドロップダウン）　範囲を指定したい。 - Qiita](https://qiita.com/nukokoi/items/a99696648b42191ff29e)
↑これ作ってる時に試してみたらうまく動いたので記事へ
スプレッドシートを開く際にtry-catchできるようにする

# 導入

ある日、Google Apps Scriptでスプレッドシートにアクセスできるかどうかを判定する処理を作りたかったが、これがまた地味に沼って1時間ほど溶かしたので備忘録です。
ちなみに単にアクセス権限があるかどうかを判定する関数は多分ないです。あったら教えてほしい。
なのでここでは、スプレッドシートを開く部分をtry-catchで処理する方法を述べます。

なお今回はGoogle Apps Scriptはwebappの環境です。
appsscript.jsonを見ての通り、この記事のコードを動かすにはスプレッドシートとドライブのoauthScopesを必要とします。

```appsscript.json
{
  "timeZone": "Asia/Tokyo",
  "dependencies": {},
  "webapp": {
    "access": "ANYONE",
    "executeAs": "USER_ACCESSING"
  },
  "exceptionLogging": "STACKDRIVER",
  "runtimeVersion": "V8",
  "oauthScopes": [
    "https://www.googleapis.com/auth/spreadsheets",
    "https://www.googleapis.com/auth/drive"
  ]
}
```

# try-catchを貫通した…だと？

アクセス権限がないスプレッドシートを開こうとするとエラーが出ます。なのでtry-catchすればアクセス権限がない場合は異なる処理をする、みたいなことができると思っていました。(当然ですよね)
しかし面白いことに、次のコードのようにtry-catchすると**catchブロックは実行されずに異常終了します**。~~は？~~

```js
// このidで定められるスプレッドシートへのアクセス権限がないとする
const id = "........"
try {
  const sp = SpreadsheetApp.openById(id)
} catch (error){
  // ここが実行されるはずだが、実行されない。
  Logger.log('アクセスできないよ')
}
```

でこの現象、どうやら2016年の時点で類似のバグが報告されています。こちらはスプレッドシートで保護されたセルに書き込もうとした時に、try-catchできないというものですが、状況としてはほとんど同じです。

https://issuetracker.google.com/issues/36763134

# try-catchしてくれるコード

じゃあどうしろってんだって話ですが、少なくともスプレッドシートのopenについては、次のコードに変更することでtry-catchできることがわかりました。

```js
// アクセス権限がないスプレッドシートのID
const id = "........"
try {
  const sp = SpreadsheetApp.open(DriveApp.getFileById(id))
} catch (error){
  // ここが実行される
  Logger.log('アクセスできないよ')
}
```

参考↓

https://stackoverflow.com/questions/71405123/google-apps-script-what-is-the-correct-way-to-check-if-i-have-access-to-a-googl

どうやら`DriveApp.getFileById`などの`DriveApp`からファイルを取得するようにすると、`DriveApp`のメソッドから例外が送出され、正しく処理されるようです。~~は？なんで？~~
AWS Wavelength とは

## 勉強前イメージ

新しいAWSのサービス？
こんなんあったっけ？

## 調査

### AWS Wavelength とは

ウェーブレングスと読み、AWSで5Gうぃ利用するためのサービスになります。
高い帯域幅と超低レイテンシーの5Gネットワーク と AWSのストレージサービスが組み合わっています。
日本はKDDIと提携して一般に公開されています。

AWS WavelengthでAWSのすべてのサービスが利用できるわけではなくて、
5Gに対応していないといけないのでEC2やRDSなど一部機能になります。

`Wavelength Zone` というのがあり
5Gの提供している電気通信事業者のデータセンター内にAWSインフラのデプロイのことで
通信事業者のネットワーク内でトラフィックを流すことができます。

### AWS Wavelength のメリット

- 遅延が少ない

AWS Wavelength を導入することで5G対応の遅延の少ないネットワークのサービスが提供できます。
5Gが利用され高速化が必要となってきており、導入することでネットワーク面でのボトルネックが抑えられます。

- コスト削減

オンプレで高速化を行うとなると、HWや様々な仕組みが必要でコストも高くなりました。
AWS Wavelengthの導入で、月々の利用料で高速なネットワークを構築できます。

- スケーラビリティ

AWSサービスのため、スケールが簡単にできます。

## 勉強後イメージ

端的に言うと5G対応のネットワーク環境ってことかな？
オンプレで5G対応とかあるんだろうか・・・
5G対応ってなに・・・？高速回線ってとらえてる

## 参考

- [AWS Wavelength のよくある質問](https://aws.amazon.com/jp/wavelength/faqs/)
- [5G時代を活かすAWS Wavelengthとは](https://www.zead.co.jp/column/aws_wavelength/)
【SwiftUI】NavigationBarにタイトル画像を設定する

# 方法1
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<100) { index in
                    Text("テキスト: \(index)")
                }
            }
            .listStyle(.grouped)
+           .toolbar {
+               ToolbarItem(placement: .navigation) {
+                   Image("instagram")
+                       .resizable()
+                       .aspectRatio(contentMode: .fit)
+                       .padding(.vertical, 5)
+               }
+           }
        }
    }
}
```

# 方法2
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<100) { index in
                    Text("テキスト: \(index)")
                }
            }
            .listStyle(.grouped)
+           .toolbar {
+               Image("instagram")
+                   .resizable()
+                   .aspectRatio(contentMode: .fit)
+                   .padding(.vertical, 5)
+           }
        }
    }
}
```

# 方法3
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            List {
                ForEach(0..<100) { index in
                    Text("テキスト: \(index)")
                }
            }
            .listStyle(.grouped)
+           .navigationBarItems(leading: HStack {
+               Image("instagram")
+                   .resizable()
+                   .aspectRatio(contentMode: .fit)
+                   .padding(.vertical, 5)
+           })
        }
    }
}
```

# おわり
これら全て同じ見た目になります。
SwiftUIは同じ見た目で複数の書き方ができるので実装時にはかなり迷います。
![simulator_screenshot_9B3BF164-96B3-4ACF-BF71-3DB4CD7BE86E.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/05234d26-e048-123b-bded-358f03559b35.png)
基本情報（再配置可能プログラムとプログラムの4つの性質）

再配置可能（リロケータブル）なプログラムなら、主記憶上のどこに配置しても問題がなく実行することができます。

再配置可能なプログラムはベースアドレス指定方式などの方式を利用しているので、メモリ上のどこに配置しても問題なく実行することができます。

ベースアドレス方式の復習です。
オペランド部の値にベースレジスタの値を加算することで実行アドレスを求める方式です。

```
 命令部 | オペランド部 900

　　ベースレジスタ 100

ベースレジスタ + オペランド部 = 100 + 900 = 1000
```
今回だとアドレスは1000です。
メモリ上のどの位置にロードされても、命令を変えることなく実行できるというメリットがあります。

プログラムの4つの性質をあらためて見てみます。

## 再配置可能（リロケータブル）
主記憶上の、どこに配置しても実行することができる性質を、再配置可能（リロケータブル）と言います。

## 再使用可能（リユーザブル）
主記憶上にロードされて処理を終えたプログラムを、再ロードすることなく繰り返し実行できる性質を再使用可能（リユーザブル）と言います。

## 再入可能（リエントラント）
再ロードすることなく繰り返し実行できる再使用可能プログラムにおいて、複数のタスクから呼び出しても、互いに干渉することなく同時実行できるという性質を再入可能（リエントラント）と言います。

こちらはイメージしにくいので図で書きます。
```
　　　　　　　　　　　　　　　　　　　リエントラント（再入可能）
プログラムA → プログラムB ← プログラムC

---------
プログラムB |
手続き部分 |
データ部分 |
---------
```
上記のようにデータ部分をタスクごとに持つことで、互いに干渉せず
並行して動作することができます。

## 再帰的（リカーシブ）
実行中に自分自身を呼び出すことができるという性質を再帰的（リカーシブ）と言います。
基本情報とは関係ないですが、再帰に関することを下記にまとめてみます。

## 再帰関数
自分自身を呼び出す関数ですね。
再帰の条件をしっかりしないと無限に繰り返してしまいます。

```
function hoge($args) {
    
    if($args > 0) {
        echo $args - hoge($args - 1)."\n";
        return;
    }
}

hoge(10);

1
2
3
4
5
6
7
8
9
10
```
関数の中にさらに関数を入れて実行しています。
詳しくまとめようかと思いましたが、他の方の参考記事の方がわかりやすいのでそちらを参考にした方が良さそうです。
https://qiita.com/drken/items/23a4f604fa3f505dd5ad

## まとめ
アルゴリズムなども関係してくる場所なので、もっと深く理解する箇所かと思いますが、とりあえず一旦wait
ターミナルを改造する

# こんな感じにする

![スクリーンショット 2022-07-26 20.28.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/60ec0599-2602-79d2-b982-ac619f40f901.png)

![スクリーンショット 2022-07-26 20.26.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/06b8d317-6e70-49f3-a510-73aa7270b255.png)



# 前提条件
- ターミナルがzshであること
- zinitを初めて使用する

# 1. zinitのインストール

```
sh -c "$(curl -fsSL https://git.io/zinit-install)"
```
```
source ~/.zshrc
```
```
zinit self-update
```

# 2. フォントのインストール

①↓のリンクからダウンロード

https://github.com/romkatv/powerlevel10k#fonts

赤枠の4つをダウンロード(クリックでダウンロードできる)

![スクリーンショット 2022-07-26 20.03.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/e9319dd0-5203-f368-85ff-679a48ce1689.png)

②ダウンロードしたファイルを開いてインストールする(4つとも)

![スクリーンショット 2022-07-26 20.07.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/52c3adfc-a82f-f6dd-a5ca-34c7d88788f1.png)

③ターミナルのフォントを変更する
ターミナル→環境設定→プロファイル
フォントを**MesloLGS NF**に変更する

![スクリーンショット 2022-07-26 20.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1484667/f1c1b105-b8ce-e5fa-6eda-021613f47f90.png)

# 3. Powerlevel10kのインストール

```
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ~/powerlevel10k
```
```
echo 'source ~/powerlevel10k/powerlevel10k.zsh-theme' >>~/.zshrc
```

# 4. ターミナルの設定
ターミナルを再起動することで、設定が開始される。
ターミナルを見ながら、一問一答形式で自分好みのスタイルを決めていく

# 5. VScodeの設定
settings.jsonに以下２行を追記

```js:settings.json
{
...
"terminal.integrated.fontFamily": "MesloLGS NF",
"terminal.integrated.fontSize": 12,
}

```

VScodeを立ち上げ直すと、変更が反映される。

# 参考にさせていただいた記事

https://qiita.com/obake_fe/items/c2edf65de684f026c59c

https://zenn.dev/nagan/articles/8168ba0ca407ad
計算（APIコール数、ファイル・データストレージ試算）

### :santa_tone4: 結論

たぶんこれ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/450298/a10fadc2-541d-3258-e97e-fd43ee1f8d37.png)



### :file_folder: ファイルストレージ試算方法
前提：最強Edition（Unlimited／Performance）

＜組織＞
　・組織として10GB

＜社内＞
　・Salesforceライセンス／Platformライセンス：2GB

＜社外＞
　なし？

例）
社員が10人います。
顧客（CC）が100人いて、100MBのファイルを毎月アップロードします。

10GB＋10人×2GB＋100人×0
=30GB

アップするファイル＝100MB×100×12カ月／年
＝120,000 MB
＝120 GB　ストレージ足りない＼(＾o＾)／
 ※1,000MB = 1GB

https://help.salesforce.com/s/articleView?id=000334051&type=1

https://help.salesforce.com/s/articleView?id=sf.users_license_types_communities.htm&language=ja&r=https%3A%2F%2Fwww.google.com%2F&type=5


### :oil: データストレージ試算方法
前提：最強Edition（Unlimited／Performance）

＜組織＞
　・組織として10GB

＜社内＞
　・Salesforceライセンス／Platformライセンス：120MB

＜社外＞
　・CC：0？（何も書いてないから多分・・・？:boy_tone4:）
　・CCP：2MB（ログインベースは1MB）
　・PC：5MB（ログインベースは1MB）



### :alarm_clock: 24時間あたりのAPIコール数試算方法
前提：最強Edition（Unlimited／Performance）

＜組織＞
　・組織として100,000

＜社内＞
　・Salesforceライセンス／Platformライセンス：5,000

＜社外＞
　・CC：0
　・CCP／PC：200（ログインベースは10）

例）
社内のManager100人、サポート担当500人
顧客（CCP）1万人

APIコール数
＝（100＋500）×5000＋1万×200＋10万
　＝300万＋200万＋10万＝510万／24時間

例えば、顧客に1日朝・昼・晩でニュースを配信する場合、
1万人×3回／1日＝3万回のAPIコール数となります。

画面がカスタムで、開くたびにCalloutするのは、
SF⇒リモートシステムのCallなのでAPIコール数にカウントしません。
逆に、SF←リモートはかかります。
ERPの注文ステータスが変わったら随時SFの注文ステータスも更新したい場合、
ERPの注文ステータスが変わるとそれをトリガに、SFの注文APIをCallし、ステータスを更新となります。（1回APIコール消費）



https://developer.salesforce.com/docs/atlas.ja-jp.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm

#### :tools: その他コメント
・APIの同時接続数（20秒以上）：25本
・APIコールのタイムアウト：10分
・APIコール数は、買える！＼(＾o＾)／:high_brightness:
【PHP初級㉜】for文応用4

[問題]　　(参照：http://www.cc.kyoto-su.ac.jp/~mmina/bp1/hundredKnocksPrimary.html)
1から20まで順に表示するが、5の倍数の場合は数字の代わりにbarと表示するプログラムを作成せよ。

# コード
```php
for($a = 1; $a <= 20; $a++){
    if($a%5 == 0){
        echo 'bar',PHP_EOL;
    }else{
        echo $a,PHP_EOL;
    }
}
```

# 結果
```
1
2
3
4
bar
6
7
8
9
bar
11
12
13
14
bar
16
17
18
19
bar
```
データの入力規則 リスト （プルダウン,ドロップダウン）　範囲を指定したい。


```
=OFFSET( $P:$P,MATCH(N8,$N:$N,0),0,1,4)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43608/16825881-42a5-a781-b211-5cee8e14403d.png)


※絶対位置＝ドルマーク付けないと一生エラー吐く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/43608/4b85d9ca-d8c2-e0a9-b438-21d770aa7452.png)

上みたいな形の表の時に役に立つ

４択クイズとかの一覧とかの表で役に立つかも。
UITableViewCellの.disclosureIndicatorのアクセサリタイプの色適用

### 概要
- UITableViewCellで.disclosureIndicatorのアクセサリタイプを表示する際に色適用をする
-  通常のcell.tintColor設定では色適用されない※iOS13以前はできたかも

### .disclosureIndicatorの色適用
このやり方がiOS標準で表示されるものと一番近い
``` swift
let chevronColor = UIColor.red
// システムイメージの表示設定を行う,iOS13以後サポート
let chevronConfig = UIImage.SymbolConfiguration(pointSize: 14, weight: .regular)
guard let chevronImg = UIImage(systemName: "chevron.right", withConfiguration: chevronConfig)?.withTintColor(chevronColor, renderingMode: .alwaysTemplate) else { return }
let chevron = UIImageView(image: chevronImg)
chevron.tintColor = chevronColor

let customDisclosureIndicator = UIView(frame: CGRect(x: 0, y: 0, width: 15, height: frame.height))
customDisclosureIndicator.addSubview(chevron)

// AutoLayoutでレイアウト構築しない
chevron.translatesAutoresizingMaskIntoConstraints = false
// 「>」ビューの右端と親ビューの右端に揃える            
chevron.trailingAnchor.constraint(equalTo: customDisclosureIndicator.trailingAnchor,constant: 0).isActive = true
// 「>」ビューの縦方向中心は親ビューの縦方向の中心と同様
chevron.centerYAnchor.constraint(equalTo: customDisclosureIndicator.centerYAnchor).isActive = true
self.accessoryView = customDisclosureIndicator
```
### 表示確認
| 色適用後 |  標準表示 |
|:-:|:-:|
|![2022-07-26 19.57のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747216/1ed58361-f099-4c23-52d4-27ae3bdc57df.jpeg)|![スクリーンショット 2022-07-26 20.11.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747216/48271cc9-db1b-11b5-81c7-3f0449fd8835.png)|

#### その他
- accessoryType = .checkmark の場合は、cell.tintColorで色適用可能
- システム画像は[SF Symbols](https://developer.apple.com/sf-symbols/)をダウンロードすればシステム画像が見れる
![スクリーンショット 2022-07-26 19.48.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2747216/6e7b6c0a-fc12-5e59-f35d-891b17d129a6.png)


#### 参考
https://stackoverflow.com/questions/58023245/uitableviewcells-accessoryview-has-a-gray-background-color-on-ios-13
中学3年生のみなさんへ。〈3/3〉数と式「2022年度 大学入学共通テスト 本試験｜数学Ⅰ第1問 [1]」三つの実数に関する対称式でした。(私的に?再検討) 

オリジナル

https://qiita.com/mrrclb48z/items/7c16cb5141a495bc5307#%E5%88%A5%E8%A7%A3

https://qiita.com/mrrclb48z/items/cfd8d1f4823aed098797


# 報告書より

令和４年度大学入学共通テスト問題評価・分析委員会報告書（本試験）より
高等学校教科担当教員からの評価	。関係教育団体からの評価。自己評価
① 出題意図
第１問
〔１〕**三つの実数に関する対称式**について，一定の手順に従って数学的に処理したり，数学的な見方・考え方を働かせて的確に処理したりする力を評価する。　＜

リンク切れ
~~https://www.dnc.ac.jp/albums/abm.php?f=abm00041341.pdf&n=15-3+%E6%95%B0%E5%AD%A6%E2%85%A0%EF%BC%8C%E6%95%B0%E5%AD%A6%E2%85%A0%E3%83%BB%E6%95%B0%E5%AD%A6%EF%BC%A1.pdf~~

# 考察　20220726
私的に?再検討。

<1/3>で、「数字の13は、におい?ますね。」と言っている場合では,ありませんでした。
**本質は「対称式」でした。**（下の参考の報告書より)


https://qiita.com/mrrclb48z/items/f13b657078bdee1c20f2


# sympyで
```python
勉強中　SymmetricReductionといいますか？いつも中途半端で申し訳ありません。
Reduction(deepl翻訳より:削減)
```

# 参考
【１】［１］（一部）以下の「大学入試数学問題集成」にリンクがあります。

https://mathexamtest.web.fc2.com/2022/202210000/2022100000100mj.html#top-0101

一定の手順に従って数学的に処理........(20220728調査)
おおぞらラボさんの解答　　　　　　　　これを変形して、
数学入試問題さんの解答（PDF） 　　 　　を展開すると
なかけんの数学ノートさんの解答　　　　よくある式の値を求める問題です。
望星塾さんの解答(PDF1頁15行目) 　　　　(1)の計算から
東進　　　　　　　　　　　　　　　　　**基本対称式**
河合塾　　　　　　　　　　　　　　　　展開、式の値、**対称式**
代ゼミ　　　　　　　　　　　　　　　　類似した出題
Vue.js:ストアについて

Vueのストアを勉強するため、その処理を使ったアプリをそれなりになるまで作ってみようと思います。

VueCliでプロジェクトを作成し、storeフォルダのindex.jsと、viewフォルダの中のAboutView.viewに手を加え練習しました。

```php:store/index.js
import { createStore } from 'vuex'

export default createStore({
  state: {
    catName:'ねこ'
  },
  getters: {
  },
  mutations: {
    get(state){
      return state
    }
  },
  actions: {
  },
  modules: {
  }
})
```

```php:view/AboutView.vue
<template>
  <div class="form">
    <div class="body">
      <div>
        <p class="cname">ねこのなまえ</p>
        <p class="catName">{{catName}}</p>
      </div>
    </div>
  </div>
</template>
<script>

export default {
  name: 'catName',
  computed: {
    catName:{
        get(){
          return this.$store.state.catName
        }
    }
  }
}
</script>
```

とりあえず画面にストアの値を表示することはできました。
動画の再生位置をランダムに変更しながら再生していくPGM

<h3>動画の再生位置をランダムに変更しながら再生していくPGM</h3>

動画の再生位置をランダムに変更しながら再生していくPGMをPythonで作成しました。
<hr>
githubURL:　https://github.com/NanjoMiyako/RandomContentPlay


<hr>
スクリーンショット<br>
https://github.com/NanjoMiyako/RandomContentPlay/blob/main/screenshot/screenshot2.png




<hr>
参考にしたサイト<br>

<a href="https://pg-chain.com/python-time-perf_counter">【Python】timeで経過時間を測定する(perf_counter) | 鎖プログラム</a>
<br>
<a href="https://absarcs.info/how-to/getting-length-video-using-python3-opencv/">Python 3 + OpenCV を用いて動画の長さを取得する｜Abstract Archives</a>
Next.jsで改行を保存する方法

Next.jsで改行を保存するときに少し悩んだのでその方法を紹介します。

こちらの記事を参考にしました。
https://qiita.com/ossan-engineer/items/bdb45368ab453af38342


最初にFirestoreにデータを保存します。
保存するときに、contextの改行を「/n」に置き換えて保存するため、
```
context: context.replace(/\r?\n/g, "\n"),
```

とすると、Firestoreで改行部分に/nが入って保存できます。

```JavaScript

  const addDate = async () => {
    if (image == null) {
      alert("サムネイルを選んでください");
    } else {
      const result = await postImage(image);
      const newdate = new Date().toLocaleString("ja-JP");
      setResult(result);
      // console.log(downloadURL);
      addDoc(databaseRef, {
        title: title,
        context: context.replace(/\r?\n/g, "\n"),
        downloadURL: result,
        email: user.email,
        displayname: user.displayName,
        categori: categori,
        createtime: newdate,
        netabare: netabare,
        photoURL: user.photoURL,
        userid: user.uid,
      })
        .then(() => {
          alert("記事投稿ができました。");
          setTitle("");
          setContext("");
          setCategori("");
          setNetabare("");
          setPhotoURL("");
          setUserid("");
          router.push("/home");
        })
        .catch((err) => {
          console.error(err);
        });
    }
  };

  return (
 #省略
            <TextField
              label="内容*(最大500文字）"
              className="m-auto w-full"
              id="filled-multiline-static"
              multiline
              rows={14}
              value={context}
              onChange={(event) => {
                if (event.target.value.length <= 500) {
                  setContext(event.target.value);
                }
              }}
            />
            <br></br>
            <br></br>
            <div className="text-center">
              <Button
                variant="outlined"
                onClick={addDate}
                className="text-center m-auto my-10"
              >
                投稿する
              </Button>
```

これで保存部分は完成です。

次に改行部分を表示します。
表示する際には、このstyleを当てることで表示できます。

```JavaScript
const styles = { whiteSpace: 'pre-line' }; 

<div className="w-80 m-auto" style={styles}>
{netabare == "ネタバレ無" && <p>{context}</p>}
 </div>
```
nagios -vコマンドを検証してみた

### はじめに
nagios -vを使ったことがなかったため、検証してみました。

#### nagios -vとは何か
ヘルプ記事を参照したところ、
「-v, --verify-config          Verify all configuration data (-v -v for more info)」と記載されているため、
すべてのコンフィグファイルを検証する様です。
```
$ nagios -h

Nagios Core 4.4.6
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2020-04-28
License: GPL

Website: https://www.nagios.org
Usage: nagios [options] <main_config_file>

Options:

  -v, --verify-config          Verify all configuration data (-v -v for more info)
  -s, --test-scheduling        Shows projected/recommended check scheduling and other
                               diagnostic info based on the current configuration files.
  -T, --enable-timing-point    Enable timed commentary on initialization
  -x, --dont-verify-paths      Deprecated (Don't check for circular object paths)
  -p, --precache-objects       Precache object configuration
  -u, --use-precached-objects  Use precached object config file
  -d, --daemon                 Starts Nagios in daemon mode, instead of as a foreground process
  -W, --worker /path/to/socket Act as a worker for an already running daemon

Visit the Nagios website at https://www.nagios.org/ for bug fixes, new
releases, online documentation, FAQs, information on subscribing to
the mailing lists, and commercial support options for Nagios.
```

### 検証しました
nagiosのwebインターフェースの画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/328e7b81-652e-9c4a-46fc-78af284c0819.png)

nagios -vを実行しました。
```
# nagios -v /etc/nagios/nagios.cfg
```
以下のエビデンスでも確認出来るように、ホストが2つ、サービスが9つチェックされているため、
nagiosのWEBインタフェースに表示されているホストとserviceがすべてチェックされている様です。
上記のコマンドを実行したら、/etc/nagios/配下のコンフィグファイルがすべてチェックされることが分かりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2599002/679ec6dc-478e-0062-8b94-cb902121794a.png)

### まとめ

nagios -vコマンドは、nagiosのコンフィグファイルの文法等のチェックで使用されるものだと思います。
httpdであれば、「httpd -t」に相当するものだと思います。

nagiosのコンフィグファイル変更後のフローは以下になります。
(1)コンフィグファイル変更する。
(2)nagios -v /etc/nagios/nagios.cfgをコマンドを実行して、コンフィグファイルをすべてチェックする。
(3)(2)で問題なければ、nagiosのサービスを再起動することで、変更後のコンフィグファイルを反映させる。
PlayFab + Unity #01 PlayFab の説明

PlayFab は、マネージド ゲーム サービス、リアルタイム分析、および LiveOps を備えたライブ ゲーム向けの完全なバックエンド プラットフォームです。

そもそも、バックエンドプラットフォームとは、Backend as a Service、BaaS、バースのことです。
一般的にはゲームに限らず、スマートフォンやタブレットなどのモバイルシステムのバックエンド機能をアプリケーションサーバーが代行するクラウドサービスを指します。
その中でもモバイルに特化したものを、MBaaS（エムバース）と言ったりしますが、モバイル端末がリッチになって高速化しているのでMBaaSとBaaSの違いはさほど大きくないようです。

PlayFab の機能ですが、他のBaaS同様、ユーザーの登録・管理・認証、データ・コンテンツの管理、プッシュ通知、課金・決済、SNS連携、などを機能として用意しています。それに加えて、Gameならではのサービスとして、ゲーム内のプレイヤーのランキング、マッチメイキング、専用ゲームサーバーのホスティング機能など、Gameならではの機能が多く用意されています。

なお、基本料金は無料ですが、サポートチケットを有効にするには有料版にUpgradeする必要があります。

PlayFabの公式ドキュメントはこちらです。


### PlayFab とは?
https://docs.microsoft.com/ja-jp/gaming/playfab/what-is-playfab
円安だしコストを考えて、Webサイトはさくらとか国内レンタルサーバを使ってみる

最近インフレで値上げニュースを多く見るけど、ITのソフトウェア業界は他産業と比較するとコスト上昇はマシな方だと思う。それでももちろん無関係という訳ではなく、特に円安の影響は色々と出てきているように思います。

例えばITインフラ。中でも、海外クラウドインフラでドル建て料金のサービス(AWSとか)は、ドル高円安が直接コスト上昇になってしまうんですよね。

ドル円が20%円安に進むと、インフラコストも20%上がるという感じ。。インフラ自体は値上げしている訳ではないんだけど、円安で実質的にコストアップになってしまう。

実際、2021年9月頃のドル円は110円前後、2022年7月になると135円を超えてきて、1年も経たないうちに20%以上も円の価値はドルに対して減ってしまい、ドル建てのITインフラを使っていて急に20%以上もコストが上昇すれば、やっぱ気になってコストを抑えたい・コスト削減したいという考えになる訳です。

コスト削減策ですが、まず現状使用中の海外クラウドインフラの使用法を工夫してコスト削減に努めるというのはあると思います。
・[円安で対応急務、クラウドコストの削減策](https://xtech.nikkei.com/atcl/nxt/info/18/00037/052600018/)

AWSを使っているなら、EC2がコストの大半を占めている事もあると思うので、やっぱりEC2がコスト節約のターゲットになる。

オンデマンドのEC2をリザーブドインスタンス、Savings Plans、スポットインスタンスに切り替える事が可能ならば切り替える。これだけでかなりコストを抑える事ができると思う。ケースバイケースだけど上手くいけば50%以上料金を安く済ませる事ができるのではと思う。

リザーブドインスタンスのEC2について
・[円安だしコスト節約のため、EC2のリザーブドインスタンスを購入する](https://it-jog.com/khow/aws/buy-ec2ri)

また、他のコスト削減策として、思い切ってインフラ自体を乗り換える、新規では別インフラを使用するという選択もあると思う。

もちろん、海外クラウドのAWSは非常に素晴らしくて、手軽で使い勝手が良いし、様々な機能があり便利なので、AWSを絶対使いたい案件は多くあると思う。

ただ、ちょっとしたWebサイトやWebサービスを作るだけなら、国内の安いレンタルサーバで十分だったりします。

クラウドインフラとレンタルサーバではもちろん全然違うが（物理と仮想、rootの有無など）、例えば、WordPressを運営したり、普通のWEBサイトで使うインフラなら、レンタルサーバで余裕で済むパターンも多いと思う。そしてそれで全然割安で済むのなら、なおさら良いです。レンタルサーバだと最初から月額料金が決まっているから、今月の支払いはいくらになるんだろうという不安や心配も一切ないですし。

WordPressを簡単に使える国内レンタルサーバには、さくらのレンタルサーバ、ロリポップ、スターサーバーなどがあります。
・[さくらのレンタルサーバで独自ドメインでWordPressを始める](https://it-jog.com/sakura/sakurarentalserver-wordpress)
・[さくらのレンタルサーバでSSHログインする、mysqlコマンドでDB操作も](https://it-jog.com/sakura/sakurars-ssh-mysql)

ちなみにさくらのレンタルサーバは、最近(でもないけど2022年2月16日)、SSD化などハードを刷新した新サーバの提供を開始して高速化したようです。
・[さくらのレンタルサーバ | さらに速く、快適に。さくらのレンタルサーバ](https://rs.sakura.ad.jp/speedup/)

あと、さくらはレンタルサーバだけでなく、VPSやクラウドなどのインフラサービスも提供しています。

というわけで、個人的にはAWSは便利で好きなので今後も使っていきたいと思うけど、今まではAWSに依存しすぎていた感もあるので、これからはコストの事も考えて、何をやるかによってITインフラは少し使い分けたいと思う。

まー急激に進んだ円安が今後も継続するかどうかなんて解らないのですが。もしかしたらまた戻るかもしれないし。
それに国内のインフラ事業者も普通に値上げする可能性だってある訳だし。

とにかく今後円安になっても円高になっても、ちょっとは上手く立ち回って得をしたいと思うのです。
VContainerの第一歩

### サンプルコード
```C#:SampleLifetimeScope.cs
using VContainer;
using VContainer.Unity;
using UnityEngine;

public class SampleLifetimeScope : LifetimeScope
{
    [SerializeField] ViewS view;
    protected override void Configure(IContainerBuilder builder)
    {
        builder.RegisterComponent<IView>(view);
        if (Const.isdebug)
        {
            builder.Register<StubModelS>(Lifetime.Singleton).As<IModel>();
        }
        else
        {
            builder.Register<ModelS>(Lifetime.Singleton).As<IModel>();
        }
        builder.RegisterEntryPoint<PresenterS>(Lifetime.Singleton);
    }
}

```
今まではPresenterがエントリーポイントの役割をしていたが、その役割をこのSampleLifetimeScope.csに持たせる。
ここでインスタンスを呼び出したり、引数を持たせてエントリーポイントとする。
ファイル名にLifetimeScopeと入れることで専用の雛形を作ってくれる。
### builder.Register\<ModelS>(Lifetime.Singleton)
```
builder.Register<ModelS>(Lifetime.Singleton).As<IModel>();
```
Monobehaviorを継承していないクラスを登録する際に使用する。
<>内には型を指定する。As<>にはInterfaceを指定することでその型として認識させることができる。
### builder.RegisterComponent\<IView>(view)
```
builder.RegisterComponent<IView>(view);
```
Monobehaviorを継承しているクラスを登録する際に使用する。

### builder.RegisterEntryPoint\<PresenterS>(Lifetime.Singleton)
```
builder.RegisterEntryPoint<PresenterS>(Lifetime.Singleton);
```
エントリーポイントを登録する際に使用する。
実行時にはその他のResisterで登録されているものを勝手に認識してエントリーポイントとして登録したものに代入していってくれるため便利