OmniAICreator/Qiita-1.07M huggingface dataset:
Gitコマンド / VSCode上でのブランチ操作

## はじめに
Python学習中のIT初学者が、GitコマンドとVSCode上でのブランチ操作について簡単にまとめてみました。
私自身、ブランチ操作をする際に手間取ったり、Masterブランチ上でブランチを切らなかったせいで余計なファイルを引き継いでしまった経験があるので、同じような失敗をする人が減るように、また、これからGitを使ったバージョン管理を始めたいという方の参考になれば幸いです。

## ブランチとは？
ブランチ(branch)とは、プロジェクト本体から切り離した状態で（プロジェクト本体に影響を与えず）開発を行える機能のこと。
branchは英語で"枝"や"分岐"といった意味があり、例えばPythonのバージョンを枝分かれさせて開発したり、複数人で開発する際にそれぞれが別の機能を担当し、最終的に同じブランチに結合して開発をしたりします。

## 1. PowerShell上でのGitコマンドによるブランチ操作
**・管理しているブランチ一覧表示**
```
git branch
```
何もブランチを作成していなければ、masterブランチだけが表示されます。
ブランチ名の前に'*'が付いているブランチが今自分が作業をしているブランチです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/9bbb4ba0-d372-a17e-e299-2ac875ff8fdb.png)

**・ブランチの作成（＝ブランチを切る）**
```
git branch ブランチ名
```
test1という名前のブランチを作成
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/255087e0-1fe5-97bb-72ff-e8147f1ac0a4.png" width=30%>

:::note warn
ブランチを切ると、作業していたブランチの情報をそのまま引き継いだブランチが作成されます。
この場合、test1ブランチはmasterブランチのコピーであるといえます。
:::

**・ブランチの切り替え**
```
git switch ブランチ名
```
作業ブランチをmasterからtest1に切り替える
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/27eb9dfb-7b50-951e-1235-fc32306b84de.png" width=30%>

ちなみに、**ブランチの作成と切り替えを同時に行うコマンド**もあります。
```
git switch -c ブランチ名
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/0ce51f49-f06e-68b1-87ba-e9167c5d6ddd.png" width=30%>

:::note warn
この場合、test1ブランチで作業をしている状態でtest2ブランチを切ったので、test2ブランチはtest1ブランチの内容を引き継いでいます。
:::

**・ブランチ名の変更**
変更したいブランチに切り替える（今回は`test1ブランチ`を`new_test`というブランチ名に変更します。）
```
git branch -m 新しいブランチ名
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/c37ab515-8ff6-1acd-af72-fc39ea0d14af.png" width=30%>

**ブランチを指定しての名前変更**も可能です（今回は`masterブランチ`に切り替えた状態で、`new_testブランチ`を`test2`というブランチ名に変更します。）
```
git branch -m 今のブランチ名 新しいブランチ名
```
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/9a24a8d8-0d12-dc60-8557-72438e962d83.png" width=30%>


**・ブランチの削除**
Gitでは作業中のブランチを削除することはできないため、削除したいブランチとは別のブランチに切り替える必要があります。
```
git branch -d ブランチ名
```
`-dオプション`は、削除したいブランチがリモートブランチにプッシュおよびマージ済みの場合のみ、削除を実行します。
`-Dオプション`で強制的にブランチを削除することもできます。
※リモートブランチに発行していないブランチは-dオプションでも削除可能


## 2.VSCode上でのブランチ操作
**・ブランチの作成と切り替え**
画面左下を見ると、現在作業中のブランチ名がmasterであることが分かります。
ブランチ名をクリックすると、ブランチを作成するためのテキストボックスが表示されるため、ブランチ名を入力してEnterを押してください。（今回はtest1というブランチを作成します。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/0445785f-74c0-8fb1-b448-8e1bf188fc1d.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/789f4b81-214e-5bf5-6d94-ecd8fc004d2d.png)

すると、新しいブランチが作成され、新しく作ったブランチ(test1)に作業ブランチが自動的に切り替わります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/8d0b42d3-9ebb-7eab-1e6f-3792468c3271.png)

ブランチをGit上にあげたい場合は、左の３つ〇が並んでいるソース管理マークをクリックして、`・・・`マークの`ブランチ`から`ブランチを発行`を選択すれば完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2710074/6c567d98-9741-b25b-65f6-73cecd8895d7.png)

ブランチ名の変更やブランチの削除は、画像を見ていただくとお分かりいただける通り、`ブランチを発行`と同じ階層の選択肢を選んで簡単に変更や削除ができます。

## おわりに

IT初学者向けの本当に初歩的な内容にはなりましたが、これからGitを使ったバージョン管理を始めたいといった方々の参考になれば幸いです。
最後まで読んでいただきありがとうございました。
【おもしろ設計】クライントのバージョンを自動更新

# なにこれ？
十数年稼働している業務システムで見かけた謎設計。  
やりたいことはわかるが、なぜそうしてしまったのかはわからない。  
ベストプラクティスは未だにわからない…
# 課題
* クライアント-サーバ システムで、クライアントの自動更新がしたい！
* でもクライアント管理ツールとか使うのは嫌！(金銭・申請・技術力不足等……)
* 使えるのはファイルサーバとDBサーバだけ！
* エンドユーザはリテラシーが期待できないので難しいことはさせられない！
# 解決策
## ファイルサーバに最新クライアントを置いとくから取りに来いスタイル
1. クライアントを以下に分割する
    * 自分の端末にあるクライアントより新しいバージョンがファイルサーバにあれば、コピーして一時ディレクトリに確保するプログラム
    * 一時ディレクトリのプログラムをクライアント実行ディレクトリに上書きするスクリプト
    * クライアント本体
1. クライアントの起動は常にコピープログラムから行う
1. 最新バージョンのリリースは、ファイルサーバにクライントプログラム.exeを置いておくだけ
  
しかもこれほぼ内製。  
CI/CDなんて概念もない、おおらかな時代の産物です。  
なお、ユーザがクライアントを立ち上げっぱなしにしていることがままあり、リリースのたびに再起動のお願いとデータ修正までがセットでした。
c#でlibyara その3

# 概要
c#でlibyaraやってみた。
yarasharp.dllを使ってみた。

# サンプルコード

```
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using YaraSharp;

namespace YaraSharp
{
	public class test {
		private static string BaseDirectory = Environment.CurrentDirectory;
		private static string TestDataDirectory = Path.Combine(BaseDirectory, "TestData");
		static void Main(string[] args) {
			string inputFileBase = "CheckWarningStillScans";
			string yaraRuleFile = Path.Combine(TestDataDirectory, $"{inputFileBase}.yar");
			string yaraInputFile = Path.Combine(TestDataDirectory, $"{inputFileBase}.txt");
			YSInstance yaraInstance = new YSInstance();
			using (YSContext context = new YSContext())
			{
				using (YSCompiler compiler = new YSCompiler(null))
				{
					compiler.AddFile(yaraRuleFile);
					YSReport compilerErrors = compiler.GetErrors();
					YSReport compilerWarnings = compiler.GetWarnings();
					YSScanner scanner = new YSScanner(compiler.GetRules(), null);
					if (scanner.ScanFile(yaraInputFile).Any(r => r.Rule.Identifier == "WarningRule"))
					{
						Console.WriteLine("ok");
					}
				}
			}
		}
	}
}
```

# コンパイル手順

```
>csc test0.cs /r:yarasharp.dll /r:alphafs.dll


```

# 実行結果

```
>test0
ok

```


以上。
[AWS] CloudFront に適用されてるセキュリティポリシーをリストアップしたい

AWSダッシュボードで表示されたり検索できればいいんだけど、できないので
（表示可能な列にセキュリティポリシーを表示されればよかったんですが...
![スクリーンショット 2022-07-12 18.24.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25964/7cff76b8-26e3-c900-d466-cea06893ea2a.png)

ってことで、aws-cli で出力して、jq で整形しましょうかね


```bash
$ aws cloudfront list-distributions --max-items 100 \
| jq -r '.DistributionList.Items[]|[.Id,.ViewerCertificate.SSLSupportMethod,.ViewerCertificate.CloudFrontDefaultCertificate,.ViewerCertificate.MinimumProtocolVersion]|@csv'

"EXXXXXXXXXXXX1","sni-only",false,"TLSv1.1_2016"
"EXXXXXXXXXXXX2","sni-only",false,"TLSv1.2_2018"
"EXXXXXXXXXXXX3","sni-only",false,"TLSv1.1_2021"
 :
```

`TLSv1.2_2021` に変更する対象をリストアップできますね、やったー
UbuntuにDockerをインストールする方法

# UbuntuにDockerをインストールする方法

```bash
# 旧バージョンをアンインストール
sudo apt remove docker docker-engine docker.io containerd runc

# Dockerのインストールに必要なものをインストール
sudo apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common -y

# GPGキーを追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

# リポジトリを追加
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

# Dockerをインストール
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

# サービス起動
sudo systemctl start docker

# 自動起動設定
sudo systemctl enable docker

# 状態を確認
sudo systemctl status docker

# 一般ユーザに権限を付与
sudo chmod 666 /var/run/docker.sock
sudo gpasswd -a {一般ユーザのグループ名} docker
sudo chgrp docker /var/run/docker.sock
sudo service docker restart

# docker compose をインストール
sudo curl -L https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
```
c#でlibyara その2

# 概要
c#でlibyaraやってみた。
yarasharpをコンパイル

# 参考にしたページ。

https://github.com/stellarbear/YaraSharp

# コンパイルの手順

- vcxprojファイルを修正

WindowsTargetPlatformVersion = 10.0.19041.0
PlatformToolset = v142

- msvc v142 vs 2019 c++ x64/x86 Spectre軽減ライブラリ（最新）をインストール

- dependenciesの中身をpackagesにコピー

- x64コマンドプロンプトでmsbuild

# 結果

YaraSharp.dllが出来た。


以上。
Owasp セキュリティ診断ツールインストール手順

## OWASP ZAP
簡単に言うとWEBアプリケーションのセキュリティ診断テストを行ってくるれるソフト

## 各種インストール
### Owasp
以下から環境にあったものをダウンロードしインストール
https://www.zaproxy.org/download/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/a759b3a0-d36a-0fa7-00ae-5f1de832aa50.png)


### JAVA
必要なJavaのバージョンも記載されているのでランタイムもあらかじめインストールする
Oracleアカウントナイトダウンロードできないので、ない場合はアカウント作成
https://www.oracle.com/java/technologies/downloads/archive/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/cfb71d68-36cc-0a77-93ae-e3b4b0661e35.png)


https://www.oracle.com/java/technologies/downloads/archive/
Java SE 11 クリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/e3255f26-0874-c884-50ce-b0940a8f25c8.png)

windows x64 用のインストーラーを探す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/ae118bbd-0548-9879-f65d-af6aa20d7fa3.png)


## Owaspインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/220d416c-d22c-f722-2966-2651281ffb37.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/e136d2c3-4abf-390a-2ab0-f39e87180ba4.png)

標準でインストール
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/33f6b6df-e4e4-ee13-82a7-484176457c5b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/ee4e6f3c-f70b-16ad-bfb2-1eb5d3afd888.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/b41cf9b5-2ed9-682d-e294-ac1c18cf2f55.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/709188/220760ed-cf25-a756-dd98-a32dccb85b51.png)
c#でlibyara

# 概要
c#でlibyaraやってみた。
開発環境作り、迷走編

# 環境
windows 10 64bit

# build tools vs2022入れる

Framework 4.5.1以下は、3.5を除いて既にライフサイクルが切れておりますので、サポートされません。


# build tools vs2022 消す


# vs2015 community 入れる

ツールセットのバージョンは、
Visual Studio 2015 の場合は v140、
2017 の場合は v141、
2019 の場合は v142、
2022 の場合は v143 です。 
WindowsTargetPlatformVersionが8.1です。

# vs2015  community 消す


# vs2019 build tools 入れる

WindowsTargetPlatformVersion = 10.0.19041.0
PlatformToolset = v142
.net framework = v4 v4.5 v4.6.1 v4.8

これです。入ってます。



以上。
GLTFからGLBに変換すーる（Python 3.9）

# はじめに
GLTFからGLBに変換していくー

# 開発環境
- Windows 10
- Python 3.9

# 導入

~~~
pip install gltflib
~~~

~~~gltf2glb.py
from gltflib import GLTF # pip install gltflib

filename = "alexander/scene.gltf"
gltf = GLTF.load(filename)
gltf.export('alexander.glb')
~~~
TRUNCATE とは

## 勉強前イメージ

DBのなにかかと思ってる

## 調査

### TRUNCATE とは

RDS(リレーショナルデータベース)でのSQL文の一つでテーブルのすべての行を削除するものになります。
[DDL(データ定義言語)](https://qiita.com/miyuki_samitani/items/1b38ea0e87ea05a0db80) の一つになります。

削除するという面では、deleteと同じような意味ですが違いは以下になります。

- `delete` : テーブルの中の行を削除する(指定しなければテーブル内をすべて削除)
- `truncate` : テーブルの中の行を削除する

ものによりますがdeleteはcommitしていればロールバックすることが可能ですがtruncateはロールバックが出来ません。
しかしdeleteよりもtruncateのほうが高速に実行されます。
また、AUTO_INCREMENTの設定がある際は初期化されます。

SQL文としては `TRUNCATE TABLE [table名]` を実行することでテーブルの中の行を削除することが出来ます。

## 勉強後イメージ

本当にテーブルの中のデータすべて消し去るとかじゃないとこわいなぁって思っちゃう。
ただ、大量に消すのであればtruncateですね。

## 参考

- [TRUNCATEとDELETEの違い_](http://tech.aainc.co.jp/archives/4772)
- [DELETE文 TRUNCATE文 DROP文の違い(SQL構文)](https://www.earthlink.co.jp/engineerblog/technology-engineerblog/2680/)
Mathematicaで式が定義できないときの解決策：SetDelayed:のタグTimesはProtectedです．

# 状況・課題
式の定義をしようとしたのに、以下のようなエラーコードが出てしまう。
```mathematica
f[x_] := x
SetDelayed:....のタグTimesはProtectedです．
```
いや、定義してくださいよ...。

# 解決策
以下のコードで解決することができました！
```mathematica
Clear[x, f]
```

# 解説
### 原因
公式ドキュメントの
>lhs:=rhs は，指定された割当てが実行可能な場合にはNullをその他の場合には$Failedを与える．

という文から、うまく変数への割り当てができていないことが原因と考えられます。

### Clear
`Clear`は変数に与えられている値や式の定義をクリア（消去）する関数です。

引数に与えた変数をクリアしてくれます。今回の場合は`f`と`t`を指定しています。
これにより、うまく割り当てをできる状態になると考えられます。

# 参考
https://reference.wolfram.com/language/ref/SetDelayed.html.ja?source=footer

#### 読んでいただき、ありがとうございました。
#### お役に立てたら嬉しいです。
Octave で二項検定

## Octave で二項検定

2 群それぞれで，成功回数と試行回数を与え，成功比率に差があるかどうかを検定する。

**片側検定にはバグがある。**

    usage:
    [h, pval, ci] = binotest (pos,N,p0)
    [h, pval, ci] = binotest (pos,N,p0,Name,Value)
    
    pos は成功回数
    N は試行回数
    p0 は母比率
    Name, Value はオプション設定
    "alpha", 0.05 の組み合わせはデフォルトで，有意水準 0.05 で検定を行う。 95% 信頼区間を算出する。
    "tail", "both" はデフォルトで両側検定
    "tail", "left" は帰無仮説が「母比率 < p0」
    "tail", "right" は帰無仮説が「母比率 > p0」
    h は帰無仮説が棄却されるとき 1，棄却できないとき 0
    ci は信頼区間



```matlab
pkg load statistics   % statistics が必要
format long           % 表示精度を高くする（任意）
```


```matlab
[h, pval, ci] = binotest(12, 30, 0.5)
```

    h = 0
    pval = 0.361594608053564
    ci =
    
       0.226557648828593   0.593965069948182
    



```matlab
[h, pval, ci] = binotest(12, 30, 0.5, "alpha", 0.01)
```

    h = 0
    pval = 0.361594608053564
    ci =
    
       0.185028140396259   0.646980826112337
    


**片側検定の結果にはバグがある。**

("tail", "right") は 「母比率 > p0」の検定である。信頼区間は正しいが $p$ 値は ("tail", "left") を指定した場合の pval = 0.899755788967013 でなければならない。


```matlab
[h, pval, ci] = binotest(12, 30, 0.5, "tail", "right")
```

    h = 0
    pval = 0.180797304026780
    ci =
    
       0.249525905146632   1.000000000000000
    


("tail", "left") は 「母比率 < p0」の検定である。信頼区間は正しいが $p$ 値は ("tail", "right") を指定した場合の pval = 0.180797304026780 でなければならない。


```matlab
[h, pval, ci] = binotest(12, 30, 0.5, "tail", "left")
```

    h = 0
    pval = 0.899755788967013
    ci =
    
                       0   0.566054738786545
go で unix timestamp を zone指定のTime型に変換するメモ

# 実装

```go
	jst, _ := time.LoadLocation("Asia/Tokyo")
	dt := time.Unix(1657616356, 0).In(jst)
```
# 参考

https://pkg.go.dev/time#Unix

https://pkg.go.dev/time#Time.In

https://qiita.com/yyoshiki41/items/3acfe3c03b5a3a1e7592
Airflow資料抄訳(6)：デフォルト引数

恥ずかしながら最近になって知ったワークフローエンジン [Apache Airflow](https://airflow.apache.org/)。日本語の紹介記事もちらほら出てきていますが、[公式ドキュメント](https://airflow.apache.org/docs/)をちょっとずつ抄訳しながら読んでいこうと思います。

6回目の今回は[デフォルト引数](https://airflow.apache.org/docs/apache-airflow/stable/concepts/dags.html#default-arguments)（Default Arguments）。
バージョン2.3.3時点のものです。

---

# デフォルト引数

DAGに含まれる多くのオペレーターで同じ引数（例えば`retries`のような）を必要とすることはしばしばあります。各オペレーターに都度都度同じ値を設定する代わりに、DAG生成時のパラメータで`default_args`を指定することで、当該のDAGに紐付けられたすべてのオペレーターに自動で引数を設定させることができます：

```py
import pendulum

with DAG(
    dag_id='my_dag',
    start_date=pendulum.datetime(2016, 1, 1, tz="UTC"),
    schedule_interval='@daily',
    catchup=False,
    default_args={'retries': 2},
) as dag:
    op = BashOperator(task_id='dummy', bash_command='Hello World!')
    print(op.retries)  # 2
```
---

DAGの中で運用するタスク（オペレーター）が増えるほど、地味にうれしい機能です。
Compiler Explorerで、Rustのコードを実行する方法

Compiler Explorer
[https://godbolt.org/](https://godbolt.org/)
でRustのコードを実行するには以下の手順でできます。

1. 言語の選択 - 右上から Rust を選ぶ
1. main関数は、
   ```pub fn main()```にする。
1. Add new... より Execution only
1. 新しく増えたタブをドラッグ＆ドロップしてソースの右に並べる
1. 実行プログラムにリンクを作るには、サイト右上 - Share
1. プログラムコードの
    LightをDarkにするには、左上 More - Setting - Dark
    アセンブリ言語との対応を示す色分けがいらないときもそこから。

こんな感じで実行できます。
（最初の２つを除けば、他のプログラミング言語でも同じです）

実行結果
[https://godbolt.org/z/Eaf7h5xsT](https://godbolt.org/z/Eaf7h5xsT)
UnityのオブジェクトをGLBにエクスポートすーる

# はじめに
UnityのオブジェクトをGLBにエクスポートしていきます

# 開発環境
- Windows 10
- Unity 2019.4.22f1
- UniGLTF 1.27

# 導入

1．UniGLTF-1.27.unitypackageをインポートします

https://github.com/ousttrue/UniGLTF/releases

2．3Dモデルをダウンロードします

la-loire-et-le-loiret-louvre-museum（LOIRE.obj）

https://3dnchu.com/archives/paris-25-free-3d-scans-from-louvre-museum/

3．マテリアルを抽出します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/7ab7eaf4-33a7-4940-3cdb-c3b62c39bf5e.png)

4．マテリアルのShaderをUnlit/Textureにして、テクスチャをアタッチします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/b810e1d2-1197-5d9f-b1bf-0b828d5b03ee.png)

5．defaultのスケールを適宜変更します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/cdb53c99-fcf7-6f71-0e5e-0847b01908ca.png)

6．GLBとしてエクスポートします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63863/168ab858-14b1-c5e8-d25c-eb1a9577fb83.png)

7．[ナレコムVR](https://narekomu-vr.com/)にアップロードして表示します

https://twitter.com/sotongshi/status/1546772834277822464

お疲れ様でした
Rubyインストールでimplicitly declaring library function 'memcmp' with type

## 事象
- `rbenv`を使って、ruby
```sh
$rbenv install 3.1.2
Downloading openssl-1.1.1q.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/d7939ce614029cdff0b6c20f0e2e5703158a489a72b2507b8bd51bf8c8fd10ca
Installing openssl-1.1.1q...

BUILD FAILED (macOS 12.4 using ruby-build 20220710)

Inspect or clean up the working tree at /var/folders/tr/lpqk0__92s3bds2hlb500cf40000gn/T/ruby-build.20220712172414.90364.qfB2fT
Results logged to /var/folders/tr/lpqk0__92s3bds2hlb500cf40000gn/T/ruby-build.20220712172414.90364.log

Last 10 log lines:
clang  -Iinclude -arch x86_64 -O3 -Wall -D_REENTRANT -DZLIB -DZLIB_SHARED -DNDEBUG -I/Users/shinjikawaguchi/.rbenv/versions/3.1.2/include  -MMD -MF test/verify_extra_test.d.tmp -MT test/verify_extra_test.o -c -o test/verify_extra_test.o test/verify_extra_test.c
clang  -Iinclude -arch x86_64 -O3 -Wall -D_REENTRANT -DZLIB -DZLIB_SHARED -DNDEBUG -I/Users/shinjikawaguchi/.rbenv/versions/3.1.2/include  -MMD -MF test/versions.d.tmp -MT test/versions.o -c -o test/versions.o test/versions.c
test/v3ext.c:201:24: error: implicitly declaring library function 'memcmp' with type 'int (const void *, const void *, unsigned long)' [-Werror,-Wimplicit-function-declaration]
        if (!TEST_true(memcmp(ip1->data, ip2->data, ip1->length) <= 0))
                       ^
test/v3ext.c:201:24: note: include the header <string.h> or explicitly provide a declaration for 'memcmp'
1 error generated.
make[1]: *** [test/v3ext.o] Error 1
make[1]: *** Waiting for unfinished jobs....
make: *** [all] Error 2
```

## 原因と対応
- opensslのインストールに失敗していましたので、以下を環境変数を設定したらインストールできました。
```sh
OPENSSL_CFLAGS=-Wno-error=implicit-function-declaration rbenv install 3.1.2
```

## 参考
- https://github.com/openssl/openssl/issues/18720#issuecomment-1180702773
Octave で等分散の検定（バートレット検定）

# Octave で等分散の検定（バートレット検定）

独立 2 標本データが等分散であるかどうかを検定する。

    usage:
    [pval, chisq, df] = bartlett_test (x1, …)
    
    x1, x2, ... はデータベクトル
    戻り値を指定しない場合は p 値のみを表示する



```matlab
pkg load statistics   % statistics が必要
format long           % 表示精度を高くする（任意）
```


```matlab
x = [49.6; 52.5; 48.3; 50.6; 56.7; 32.8; 51.6; 46.1; 54.6; 52.0; 39.3; 49.5; 45.1; 37.1; 63.9;
     48.3; 37.4; 33.4; 37.8; 51.2; 63.0; 74.3; 54.4; 60.1; 55.6; 49.3; 57.4; 40.4; 57.8; 60.9];
y = [48.7; 36.8; 51.9; 65.5; 62.6; 57.3; 43.3; 57.7; 61.4; 69.8; 48.0; 37.1; 29.8; 53.6; 49.3;
     50.2; 46.1; 50.6; 51.4; 61.0; 50.8; 51.7; 52.4; 57.3; 55.4];
var(x), var(y)
```

    ans = 93.60091954022991
    ans = 82.55943333333333



```matlab
bartlett_test(x, y);
```

      pval: 0.750574



```matlab
[pval, chisq, df] = bartlett_test(x, y);
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", chisq, df, pval)
```

    chisq = 0.10105,  df = 1,  p value = 0.75057
gitで秘密鍵を使い分ける

gitで cloneやpushをする際に何故か違う鍵が使われて詰まったので

### configで設定するやり方
```.ssh/config
Host <呼ぶときの名前>
  HostName github.com
  User git
  Port 22
  IdentityFile ~/.ssh/<使う鍵(秘密鍵の方)>
  TCPKeepAlive yes
  IdentitiesOnly yes #これがないと他の鍵(デフォルトのid_rsaなど)も読み込まれてしまう
```
を作成し
```
git clone git@<configで設定した「呼ぶときの名前」>:<githubのユーザー名>/<githubのレポジトリ名>.git
```
を叩く
参考ソース：
https://zenn.dev/hironorioka28/articles/35a287ffbcf533

### 設定ファイルなしのコマンドのみで実行する場合
```
GIT_SSH_COMMAND="ssh -i ~/.ssh/<鍵名> -o IdentitiesOnly=yes" git clone git@github.com:<ユーザー名>/<レポジトリ名>.git
```
-o でオプションを指定出来る
ここでconfigと同様にデフォルトの鍵(id_rsa)が呼ばれないように指定する
参考ソース：
https://stackoverflow.com/questions/4565700/how-to-specify-the-private-ssh-key-to-use-when-executing-shell-command-on-git#answer-29754018
Octave で母平均の検定

# Octave で母平均の検定

1 標本データで，母平均が指定した値であるかどうかを検定する。

対応のある 2 標本データの場合は，対のデータの差をとったベクトルを与えてやればよい。

`t_test()` は母分散が未知の場合の検定である。母分散が既知の場合に `z_test()` があるが，母分散が既知などということはめったに無いことなので存在意義が全く無い（使用してはいけない）。

    usage:
     [pval, t, df] = t_test (x, m, alt)
    
    x はデータベクトル
    m は特定の値
    alt はデフォルトで両側検定 "!="
        片側検定は，帰無仮説が「母平均 > m」なら ">", その逆なら "<" で指定
    戻り値を指定しない場合は p 値のみを表示する



```matlab
pkg load statistics   % statistics が必要
format long           % 表示精度を高くする（任意）
```


```matlab
x = [49.6; 52.5; 48.3; 50.6; 56.7; 32.8; 51.6; 46.1; 54.6; 52.0; 39.3; 49.5; 45.1; 37.1; 63.9;
     48.3; 37.4; 33.4; 37.8; 51.2; 63.0; 74.3; 54.4; 60.1; 55.6; 61.2];
y = [48.7; 36.8; 51.9; 65.5; 62.6; 57.3; 43.3; 57.7; 61.4; 69.8; 48.0; 37.1; 29.8; 53.6; 49.3;
     50.2; 46.1; 50.6; 51.4; 61.0; 50.8; 51.7; 52.4; 57.3; 55.4; 62.6];
z = x - y;
mean(z)
```

    ans = -2.149999999999999


対応のある 2 標本の平均値の差が有意かどうかは，それぞれの測定値の差のベクトル(`z` の母平均が 0 であるかどうか（つまり，$m=0$）を検定すればよい。


```matlab
t_test(z, 0);
```

      pval: 0.384954



```matlab
[pval, t, df] = t_test(z, 0);
printf("t = %.5g,  df = %d,  p value = %.5g\n", t, df, pval)
```

    t = -0.88431,  df = 25,  p value = 0.38495



```matlab
[pval, t, df] = t_test(z, 0, "<");
printf("t = %.5g,  df = %d,  p value = %.5g\n", t, df, pval)
```

    t = -0.88431,  df = 25,  p value = 0.19248



```matlab
[pval, t, df] = t_test(z, 0, ">");
printf("t = %.5g,  df = %d,  p value = %.5g\n", t, df, pval)
```

    t = -0.88431,  df = 25,  p value = 0.80752


`z` の母分散は未知であるが，標本分散を使ってみよう。


```matlab
z_test(z, 0, var(z))
```

    Z-test of mean(x) == 0 against mean(x) != 0,
    with known var(x) == 153.688:
      pval = 0.376529
    ans = 0.376528522678127


`t_test()` は $t$ 分布を使用するが，`z_test()` は標準正規分布による近似である。サンプルサイズが小さい場合には近似は十分ではない。

近似計算などする必要がないし，母分散は未知なのだから，`t_test()` を使えばよいのである。
関数の導関数(2)sympyで,定義にしたがって導関数を求めたい。実行例ver0.1

sympyプログラム
①xとhの順番を正しくする方法を教えて下さい。
②f'(x)=limitの1行目がおかしいですね？いい方法がありますか？

https://qiita.com/mrrclb48z/items/43578ad7d124cb1591ad


# 実行例.1

https://kamelink.com/blog/2022/07/09/11-2-21-tukubagijyutudai-sangyougijyutu-2-4/

```
関数 f(x) = x**2の導関数を定義にしたがって求めなさい．その際，導出の過程をかくこと．
```
print出力
```
# f (x)= x**2
# f'(x)= 2*x
# f'(x)= limit( (-x**2 + (h + x)**2)/h ,h,0)
#      = limit( (h**2 + 2*h*x)/h ,h,0)
#      = limit( h + 2*x ,h,0)
#      = 2*x
```

# 実行例.2

https://kamelink.com/blog/2022/07/07/11-2-21-kusirokouritudai-keizai-1-2/




```
導関数の定義にしたがって，次の関数の導関数を求めよ．
f(x)= -3*x**3 + 2*x**2 + 1
```
print出力
```
# f (x)= -3*x**3 + 2*x**2 + 1
# f'(x)= -9*x**2 + 4*x
# f'(x)= limit( (3*x**3 - 2*x**2 - 3*(h + x)**3 + 2*(h + x)**2)/h ,h,0)
#      = limit( (-3*h**3 - 9*h**2*x + 2*h**2 - 9*h*x**2 + 4*h*x)/h ,h,0)
#      = limit( -3*h**2 - 9*h*x + 2*h - 9*x**2 + 4*x ,h,0)
#      = -9*x**2 + 4*x
```




# 参考
関数の導関数(1)sympyで,定義にしたがって導関数を求めたい。ソースver0.1

# sympyで

```python
from sympy import *
var('x h')
def DiffPrint(fx):
    print("# f (x)=", fx)
    print("# f'(x)=", diff(fx))
    return
def DiffPrintLimit(fx):
    z = []
    z = z + [(fx.subs({x: x + h}) - fx) / h]
    z = z + [(fx.subs({x: x + h}) - fx).expand() / h]
    z = z + [((fx.subs({x: x + h}) - fx).expand() / h).simplify()]
    for i in range(len(z)):
        if i == 0:
            print("# f'(x)= limit(", z[i], ",h,0)")
        else:
            print("#      = limit(", z[i], ",h,0)")
    print("#      =", limit(((fx.subs({x: x + h}) - fx).expand() / h).simplify(), h, 0))
    return
fx=x**2
DiffPrint     (fx)
DiffPrintLimit(fx)
fx=-3*x**3+2*x**2 + 1
DiffPrint     (fx)
DiffPrintLimit(fx)
```

別にループする必要がありませんでした。(20220713)
```python
from sympy import *
var('x h')
def DiffPrint(fx):
    print("# f (x)=", fx)
    print("# f'(x)=", diff(fx))
    return
def DiffPrintLimit(fx):
    print("# f'(x)= limit(", (fx.subs({x: x + h}) - fx)          / h,            ",h,0)")
    print("#      = limit(", (fx.subs({x: x + h}) - fx).expand() / h,            ",h,0)")
    print("#      = limit(",((fx.subs({x: x + h}) - fx).expand() / h).simplify(),",h,0)")
    print("#      =", limit(((fx.subs({x: x + h}) - fx).expand() / h).simplify(),  h,0) )
    return
fx=x**2
DiffPrint     (fx)
DiffPrintLimit(fx)
fx=-3*x**3+2*x**2 + 1
DiffPrint     (fx)
DiffPrintLimit(fx)
```


実行結果は、次ページです。

# 参考

# 予定
Octave で 2 群の比率の差の検定

## Octave で 2 群の比率の差の検定

2 群それぞれで，成功回数と試行回数を与え，成功比率に差があるかどうかを検定する。

    usage:
    [pval, z] = prop_test_2 (x1, n1, x2, n2, alt)
    
    x1, n1 は第 1 群の成功回数と試行回数
    x2, n2 は第 2 群の成功回数と試行回数
    alt は両側検定（デフォルト）のとき "!="
        「第 1 群の成功母比率が第 2 群の成功母比率より低いという片側検定のときは "<"
        「第 1 群の成功母比率が第 2 群の成功母比率より高いという片側検定のときは ">"
    戻り値を指定しない場合は p 値のみを表示する
    戻り値を指定した場合は，後で変数を使用すること（表示するなど）ができる



```matlab
pkg load statistics   % statistics が必要
format long           % 表示精度を高くする（任意）
```

戻り値を変数に代入しない場合には $p$ 値のみが表示される。

このプログラムでは，連続性の補正をしない検定結果が示される。連続性の補正をするオプションはない。


```matlab
prop_test_2(3, 12, 5, 10);
```

      pval: 0.224839


戻り値を変数に代入すれば結果を自由に表示できる。


```matlab
[pval, z] = prop_test_2(3, 12, 5, 10);
printf("z = %.5g,  p value = %.5g\n", z, pval)
```

    z = -1.2138,  p value = 0.22484


両側検定は，成功回数，失敗回数の行列を `chisquare_test_independence()` に与えることで，同じ結果になる（$|\text{z}| \equiv \sqrt{\text{chisq}}$，$p$ 値は同じ）。


```matlab
[pval, chisq, df] = chisquare_test_independence([3 9; 5 5]);
printf("chisq = %.5g,  df = %d,  p value = %.5g\n", chisq, df, pval)
printf("z = %.5g\n", sqrt(chisq))
```

    chisq = 1.4732,  df = 1,  p value = 0.22484
    z = 1.2138



```matlab
[pval, z] = prop_test_2(3, 12, 5, 10, "<");
printf("z = %.5g,  p value = %.5g\n", z, pval)
```

    z = -1.2138,  p value = 0.11242



```matlab
[pval, z] = prop_test_2(3, 12, 5, 10, ">");
printf("z = %.5g,  p value = %.5g\n", z, pval)
```

    z = -1.2138,  p value = 0.88758
TortoiseGitでコミットやログ見たり（リポジトリーにアクセスする処理）すると『fatal:unsafe repository…』の例外

# 現象

コミットやログ見たりができない。
下記ダイアログが出る。

>Failed to get UnRev file list
fatal: detected dubious ownership in repository at '※'
To add an exception for this directory, call:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f7a6eb04-2e5f-f98c-04a0-1103ce442c79.png)

# なんでこんなことに？

原因はGitのアップデートによるセキュリティ強化。
リポジトリーのパスをセーフリストに追加すれば解決。

# やり方

PowerShellで下記コマンドを実行。

```powershell:リポジトリーのパスをセーフリストに追加するコマンド
git config --global --add safe.directory '※※※'
```

```'※※※'``` の部分は環境によって変わるので適宜読み替えて下さい。

どんなコマンドを実行したらよいかはTortoiseGitのダイアログの『git config --global』部分に表示されている。
それをそのまま流せばいい。

## 注意点

コマンドプロンプトでは **ダメ** 。
（PowerShellで実行する必要がある）

TortoiseGitのエラーダイアログに表示されたリポジトリーのパスを正確に入力すること。

* **大文字小文字** は区別される。
* 『 **\\** 』と『 **/** 』 は区別される。
* リポジトリーのパスの末尾にスラッシュが **付くか** **付かないか** にも注意。

# バージョン

Windows 10 Pro 21H2 OSビルド 19044.1889
git version 2.37.2.windows.2
TortoiseGit 2.13.0.1
Python3エンジニア認定基礎試験に1週間で合格した方法

## 試験を受けた感想
・Pythonの基礎を体系的に学べた
・ギリギリ合格した
・試験は時間の余裕があり、ゆっくり見直しをしても15分ほど時間が余った

## 前提
・文系
・大学時代にRubyを少し触っていた
・Pythonは始めて1ヶ月ほど

## 受験背景
・とにかく短期間で合格したい（実際の勉強時間は15時間ほど）
・お金もかけたくない(実際に試験代以外はお金がかからなかった)

## 試験内容
・試験時間は1時間
・CBT方式
・7割合格、40問のうち、28問正解が合格ライン
https://cbt.odyssey-com.co.jp/pythonic-exam.html

## 攻略法
・出題範囲がはっきりと明記されているため、戦略が立てやすい
・色々な方の合格体験記を読んだ
・出題率が高いところは学習必須
・出題率が低いところも範囲が狭いため、確実に取りたい
| 出題範囲 | 出題率 | 出題数 
|:-|:-:|:-:|
|  1章　食欲をそそってみようか |  2.5% |  1 |  
|  2章　Pythonインタープリタの使い方 |  2.5% | 1  |   
|  3章　気楽な入門編 | 15.0%  | 6  |   |
|  4章　制御構造ツール | 22.5%  | 9  |   |
| 5章　データ構造  | 17.5%  |  7 |   |
|  6章　モジュール |  5.0% |  2 |   |
| 7章　入出力  |  2.5% |  1 |  |
|  8章　エラーと例外 |  10.0% | 4  |   |
| 9章　クラス  | 5.0%  |  2 |   |
|  10章　標準ライブラリめぐり | 10.0%  | 4  |   |
| 11章　標準ライブラリめぐり─PartII  |  2.5% | 1  |   |
|  12章　仮想環境とパッケージ | 2.5%  |  1 |   |
|  13章　次はなに? | 0.0%  | 0  |   |
|  14章　対話環境での入力行編集とヒストリ置換 | 2.5%  | 1  |   |

## 勉強法
とにかく模試を解いて、復習すべし！復習時にコードを打ち込んでみると理解しやすい。
模試をそれぞれ1回ずつ解いて、理解度を9割ほどにした。(10時間)
仕上げに公式テキストを読んで、模試で出会わなかった問題を確認。(5時間)

### PRIME STUDY
・とにかくおすすめの模試
・難易度は試験本番に近い
・3回分ある
・試験本番の出題範囲をほぼ網羅している
https://study.prime-strategy.co.jp/

・このサイトで3回目の模試を解説をしており、とても分かりやすい(このサイトのおかげで合格した)
https://kinocode.net/posts/47

### DIVE INTO EXAM
・本番と比べて易しめ
・解説がない
・腕試し程度に解いておいたほうが良い
https://diver.diveintocode.jp/dive_into_exam

### 公式テキスト
・テキストをベースに本番の試験が作られているので、必ず目を通しておくこと
・公式テキストは無料で公開されているので、購入の必要なし
https://docs.python.org/ja/3/tutorial/

・わかりにくく、初心者向きではない（英文を翻訳機に入れただけのような読みにくい日本語）
・模試で出題されなかった範囲をこのテキストで確認する程度でよい
Eclipseのコンソールフォント変更

# この記事で分かること
- Eclipseのコンソールのフォントサイズ変更

# 手順
1. ウィンドウ(W)をクリック
2. 設定(P)
3. 一般> 外観 > 色とフォント > デバッグ
4. コンソール・フォント(デフォルト値のオーバーライド:テキスト,フォント)
5. 適用して閉じる

## 感想
- コンソールだから 一般> 外観 > 色とフォント > コンソールかと思ったら、
違ったのでメモ
- エディタのほうは検索でもよく出てくるがコンソールは見つからなかった
Xcode新規プロジェクト作成フロー(githubとローカルリポジトリを紐付ける)

新規プロジェクト作成後の忘備録

【前提】
githubアカウントを所有している。
【Ver】
Xcode 13.4.1
macOS Monterey 12.4

### やることの流れ図
```mermaid
sequenceDiagram
    autonumber
    actor わたし
    participant remote as リモートリポジトリ
    participant local as ローカルリポジトリ
    participant xcode as Xcode
    わたし->> remote: 新規リポジトリ作成
    Note left of remote: New repository
    remote->> remote: .gitignoreに.DS_Storeを追記コミット
    remote->>local: ローカル環境へクローン
    Note left of local: git clone
    xcode->>xcode: 新規PJ作成
　　   Note left of xcode: ディレクトリの整頓
    xcode->>local: Gitコミット
 　　　　　　Note left of xcode: git add .
    local->>remote: リモートリポジトリへpush
    Note left of local: git push origin main
    xcode->>xcode: SwiftLint導入
    xcode->>xcode: .githubテンプレート導入
    Note left of xcode: ディレクトリへテンプレコピペ
    xcode->>local: Gitコミット
 　　　　　　Note left of xcode: git add .
    local->>remote: リモートリポジトリへpush
    Note left of local: git push origin main
    remote->>わたし: finish
```


### 1.GitHubで新規リポジトリを作成する
自分のアカウントNew repository

### 2. .gitignoreに.DS_Storeを追記してコミット
### 3.ローカル環境にgit cloneする
```swift:git clone
// git clone <github Code▼のClone URL>をコピペ
% git clone git@github.com:〇〇/〇〇.git
```

### 4.XcodePJを作成
適当なフォルダを用意してPJを作成しますが以下の理由で作成ディレクトリ場所に注意が必要。
git cloneで生成したPJフォルダと同じディレクトリに同じ名称でXcodePJを作成すると
先にclone生成したフォルダが置換されてしまう。
##### 対策として
- 適当なフォルダを用意してPJを作成
- 新規PJフォルダ内のプロジェクトファイル(.xcodeproj)とフォルダ(PJ名)を.gitと同じディレクトリに移動
- PJ作成時にできた余分なフォルダはゴミ箱へ 
### 5.PJをローカルリポジトリへコミット
### 6.PJをリモートリポジトリへプッシュ
### 7.SwiftLint実装
### 8. .githubを実装
コミット＆プッシュ



### おまけ
##### 自分のアカウントから組織のアカウントへ移動したい時
自分のリポジトリページ＞setting＞Transfer ownership
移転先組織と移転元自分のアカウントを入力
※移転後はローカルとの紐付けが必要
今回はgit cloneしてローカルは物理削除した。（簡単）
消さずに紐付け変更もできるらしい。

##### public、private切り替え
Change repository visibilityから切り替えられる
【Xcode】NSLogを非表示にする

# はじめに
動作には問題のない警告文が大量に出てきて鬱陶しかったのでログを非表示にしました
あんまり良くないとは思うのでやらない方がいいと思います。

需要はないと思いますけど一応やり方を紹介しておきます。

# NSLogとは
`print`との違いは日時を表示してくれる点です。
![スクリーンショット 2022-07-12 15.36.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/948736cc-31c6-50fa-758c-acd2c1b408f4.png)

# やり方
画像の赤枠内をクリックします。
![スクリーンショット 2022-07-12 15.40.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1e5be67c-efb9-51de-d0e0-4390b7470bd0.png)
クリックするとポップアップが表示されるので「Edit Scheme...」を選択します。
![スクリーンショット 2022-07-12 15.41.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5cfd57da-0595-9bd7-6cf0-db2f027f6ee3.png)
① 「Run」を選択します。
② 「Arguments」を選択します。
![スクリーンショット 2022-07-12 15.43.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8b8d2f5e-9fb8-2675-80a9-2dc9df1c97ec.png)
① 「+」を押します。
② 「Name」に`OS_ACTIVITY_MODE`,「Value」に`disable`を入力します。
③ 「Close」を選択します。
|Name|Value|
|-|-|
|OS_ACTIVITY_MODE|disable|

![スクリーンショット 2022-07-12 15.49.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/cf581ab8-7efc-c77d-6944-d6cb7c1bbc1d.png)

NSLogのみ表示されなくなりました。
![スクリーンショット 2022-07-12 15.53.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/625b72ff-f5b2-61a8-bbfb-c2c767113e63.png)

# おわり
NSLogに関してはこのような情報もありました。
[[Swift] NSLogを安易に使ってしまうとセキュリティ的にマズい](https://qiita.com/y-some/items/448621066ccaa70cb0e7)

ログを覗かれる可能性があるのは怖いですね
【Shopify Liquid】ページネーションを自作する paginate

ShopifyのLiquidでページネーションは、以下のようなコードで簡単に実装できます。

```liquid
{%- paginate blog.articles by 5 -%}
// ページネーション対象要素...
{%- endpaginate -%}

{%- if paginate.pages > 1 -%}
  {%- render 'pagination', paginate: paginate -%}
{%- endif -%}
```

`{%- paginate xxx -%}`~`{%- endpaginate -%}`で囲まれた要素がページネーションの対象となります。
指定した要素数を超えたら`{%- render 'pagination', paginate: paginate -%}`によりページネーションが表示されます。この方法ではテーマ固有のデザインが当てられます。

数字や矢印などの各要素に独自のCSSを適用したい場合はページネーションを自作する必要があります。

## ページネーション自作
paginate オブジェクトを使ってページネーションを自作していきます。
`hoge`というブログのページネーションを想定しています。

### 最初のページ　`◀◀`
最初のページへのリンクはオブジェクトを使わず以下のように設定します。
記述の通り`hoge`の１ページ目を指定しています。
```
href="/blogs/hoge?page=1"
```

### 前のページ　`◀`
現在のページから一つ前のページへのリンクは`paginate.previous.url`で取得できます。

```
href="{{ paginate.previous.url }}"
```

### 次のページ　`▶`
現在のページから次のページへのリンクは`paginate.next.url`で取得できます。
```
href="{{ paginate.next.url }}"
```

### 最後のページ　`▶▶`
`paginate.pages`は`pagination`タグによって生成されたページ数を取得できます。これを使うと最後のページへのリンクを作成できます。
```
href="/blogs/hoge?page={{ paginate.pages }}"
```
例えばページ数が5だとしたら、`href="/blogs/hoge?page=5"`というリンクになります。

### ページ番号の表示 `1 2 3...`
生成されたページ数分のページ番号を表示させるため、`paginate.pages`を使って`for`を記述します。

```liquid
{%- for page_number in (1..paginate.pages) -%}
```

上記ループの中でページ番号とそのページへのリンクを記述します。
また、カレントページを判断するため`if`で条件分岐します。
`paginate.current_page`を使うと現在のページ番号を取得できますので、これを使用します。

```liquid
{%- if page_number == paginate.current_page -%}
  <span class="pagination-current">{{ page_number }}</span>
{%- else -%}
  <a class="pagination-link" href="/blogs/hoge?page={{ page_number }}">{{ page_number }}</a>
{%- endif -%}
```

### 完成　`◀◀ ◀　1 2 3 4 5 ▶ ▶▶`

```liquid
<nav class="pagination">
  <ul class="pagination-list">
　　// 最初のページへのリンク
    <li class="pagination-item"><a class="pagination-link pagination-link--first" href="/blogs/hoge?page=1"></a></li>
　　// 前のページヘのリンク
    <li class="pagination-item"><a class="pagination-link pagination-link--prev" href="{{ paginate.previous.url }}"></a></li>

    {%- for page_number in (1..paginate.pages) -%}
    <li class="pagination-item">
      {%- if page_number == paginate.current_page -%}
　　　　 // カレントページ
        <span class="pagination-current">{{ page_number }}</span>
      {%- else -%}
        // 各ページ番号へのリンク
        <a class="pagination-link" href="/blogs/hoge?page={{ page_number }}">{{ page_number }}</a>
      {%- endif -%}
    </li>

    {%- endfor -%}
　　// 次のページへのリンク
    <li class="pagination-item"><a class="pagination-link pagination-link--next" href="{{ paginate.next.url }}"></a></li>
　　// 最後のページへのリンク
    <li class="pagination-item"><a class="pagination-link pagination-link--last" href="/blogs/hoge?page={{ paginate.pages }}"></a></li>
  </ul>
</nav>
```
python csvのデータをグラフにする -csv,tkinter-

<H1>データをグラフにする</H1>

```python
import tkinter
import csv

root = tkinter.Tk()
root.title("データをグラフにする")
ca = tkinter.Canvas(width=800, height=480, bg="white")
ca.pack()

f = open("売り上げデータ.csv",encoding="utf-8")
cr = csv.reader(f)
dat = list(cr)
f.close()

bar_x = 40
bar_b = 460
for ye in range(1,6):
    for mo in range(1,13):
        h = int(dat[mo][ye])/2
        ca.create_rectangle(bar_x, bar_b, bar_x+6, bar_b-h, fill="black")
        bar_x = bar_x + 12
root.mainloop()


```
![スクリーンショット 2022-07-13 8.44.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/cd2b6a7d-0819-d86d-7ef1-4f724fb2070a.png)

![スクリーンショット 2022-07-13 8.42.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1614609/997e082d-b3ec-67cf-9fa3-b6e46d5e8924.png)
自作Lispにtcl/tk GUIを組み込んだ話

# 特別休暇
ずっと働き詰めでした。たまには自分にお休みを与えてもいいと思いました。夏季臨時休暇を利用してtcl/tkを、自作Lisp Easy－ISLisp（以下、EISL)にライブラリとして組み込みました。

# C言語方式
Common-Lispのtcl/tkライブラリを調べてみますと、wishをプロセス間通信で呼び出す方式と、C言語で直接呼び出す方式があるようです。M.Hiroiさんのtcl/tkのページにはC言語で呼び出す方法が説明されていました。(M.Hiroiさんのページ）http://www.nct9.ne.jp/m_hiroi/tcl_tk_doc/tcltk305.html  EISLのCラッパーの機能を利用、C言語を介して呼び出す方式としました。例えばcanvasを呼び出す関数は次のようになっています。

```lisp
(defun tk::canvas (obj :rest l)
  (let ((opt (tk::option l)))
    (c-lang 
      "strcpy(buff,''canvas .'');
       strcat(buff,str_to_lower(Fgetname(OBJ)));
       strcat(buff,Fgetname(OPT));
       strcat(buff,''\n'');
       Tcl_Eval(interp,buff);")))   

```

ライブラリは予めコンパイルしておく必要があります。

```
(compile-file "library/tcltk.lsp")

```

# 再帰図形
おおよそ必要な関数が揃いましたので、再帰図形を描かせてテストすることとしました。シェルピンスキーのギャスケットです。

コードは次のようになります。

```lisp

(import "tcltk")

(defun recur ()
    (tk::init)
    (tk::canvas 'c0 '-width 600 '-height 600)
    (gasket #(300 0) #(0 600) #(600 600) 10)
    (tk::pack 'c0)
    (tk::mainloop))

(defun midpoint (a b)
   (let ((a0 (elt a 0))
         (a1 (elt a 1))
         (b0 (elt b 0))
         (b1 (elt b 1)))
      (vector (+ (min a0 b0) (abs (quotient (- a0 b0) 2)))
              (+ (min a1 b1) (abs (quotient (- a1 b1) 2))))))
      

(defun draw-triang (a b c)
   (let ((a0 (elt a 0))
         (a1 (elt a 1))
         (b0 (elt b 0))
         (b1 (elt b 1))
         (c0 (elt c 0))
         (c1 (elt c 1)))
      (tk::create 'c0 (line a0 a1 b0 b1 c0 c1 a0 a1) '-fill 'green)))

(defun gasket (a b c n)
    (cond ((= n 0) t)
          (t
            (draw-triang a b c)
            (draw-triang (midpoint a b) (midpoint b c) (midpoint c a))
            (gasket a (midpoint a b) (midpoint a c) (- n 1))
            (gasket (midpoint a b) b (midpoint b c) (- n 1))
            (gasket (midpoint a c) (midpoint b c) c (- n 1)) )))

```

これを読み込んで(recur)関数を実行するとあのシェルピンスキーの再帰図形が現れます。

![Screenshot at 2022-07-12 12-35-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/8e8290e4-760a-faa7-0a01-2b6a52c9d446.png)



# 再帰図形の思い出
初めてこの手の再帰図形を見たのはウインストンのLISP本でした。c-curveを描くものでした。昭和58年ころのことでした。あれから40年ほど経過し世の中も変わりました。当時は記号処理のできる言語というとLispくらいしかありませんでした。今やPythonやら、Rubyやらテンコ盛りです。それにしてもLispで書かれたgasketのコードを眺めてると再帰にもっとも馴染んでる言語は今でもlispではないかと思います。

![bandicam 2022-07-12 16-00-33-595.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33927/f68e2280-4669-f220-0390-3dce70f9ae24.jpeg)


# ドキュメントなど
EISLはOSSです。Githubにて公開しています。ライブラリの使い方についてはdocumentフォルダーの中のTCLTK.mdにあります。追々、記述を充実させていく予定です。

https://github.com/sasagawa888/eisl
javascriptの特徴的なオブジェクト（Window）について

javascriptについて学んでいく中、特徴的なオブジェクト（Window）について調べたことをまとめておく。

# Windowオブジェクト
Windowオブジェクトが最上位に存在し、後ろにプロパティ名を付けることで様々なオブジェクトを参照できる。

プロパティ一覧
・window	Window オブジェクトへの参照
・document	Document オブジェクトへの参照
・event	Event オブジェクトへの参照
・console	Console オブジェクトへの参照
・navigator	Navigator オブジェクトへの参照

# 補足
・documentはWindowオブジェクトのプロパティであるため、「window.document」と記述することもできるが、「window.」の部分を省略しても記述できる。

・documentオブジェクトはDOMツリー[^1]にアクセスすることができる。

・[.window | JavaScript 日本語リファレンス](https://js.studio-kingdom.com/javascript/window/)
[^1]: XML文書は、論理的には木構造となっている。最初に出現するルート要素は根（ルート）であると考えられ、すべての要素や属性は、そこから延びる枝葉として考えられる。DOM[^2]においては、読み込んだXML文書を実際に木（ツリー）の形をしたデータに変換する。このデータを、DOMツリーと呼ぶ。
[^2]:DOMとは、HTMLドキュメントやXMLドキュメントをプログラムから利用するためのAPI。
fprintf関数とかを使わずに文字列を書き込んでいきたい

思いついたのでやりました


# 環境

Ubuntu20.04

NASM version 2.14.02

# 方法

アセンブラを書き
Systemcallを呼んで
標準出力やファイルに書き込みます

フォーマットを文字列にするのはめんどくｓ…難しいのでvsprintfを使います
（Systemcall使わないし、いいよね）

# ソースコード

```C:printk.h
#include <stdio.h>
#include <stdarg.h>
/**
 * 
 * ファイル構造体とvsprintfを使うためにstdioとstdargを使う
 */

int fprintk(FILE* fp, const char* format, ...);
```

```C:writek.h
int Writek(int fd, void* ptr, long size);
```

```C:printk.h
#include "printk.h"
#include "Writek.h"

/**
 * vsprintf用のバッファ
 */
char s[1024];

/**
 * 自作fprintf関数本体
 * vsprintfでフォーマットと可変長配列を文字列にし
 * Writek関数でファイルや標準出力などに書き込んでいく
 */
int fprintk(FILE* fp, const char* format, ...){
    int result;
    va_list va;
    int size;

    va_start(va, format);
    size = vsprintf(s, format, va);
    va_end(va);
    if(size < 0){
        result = size;
    }else{
        result = Writek(fp->_fileno, s, size);
    }
    return result;
}
```

```asm:Writek.asm
bits 64

section .text

global Writek

;Writek関数本体
;mov rax,1でWriteのシステムコールをしていして
;SystemCallで実行
;C言語ってこういうところ便利で、レジスタはABIが勝手に必要なところに割り振ってくれる

Writek:
    mov rax, 1
    syscall
    ret
```

# 実行してみる
```C:Hello.c
#include "printk.h"

int main(int argc, char const *argv[])
{
    fprintk(stdout, "Hello World My System\n");
    for(int i = 0; i < 10; i++){
        fprintk(stdout,"%d\n",i);
    }
    return 0; 
}

```
とりあえず適当なファイルを書いて
## コンパイル
```
$gcc -c printk.c
$nasm -f elf64 Writek.asm
$gcc -c Hello.c
$gcc -o Hello Hello.o printk.o Writek.o
```
（自分の環境だとelf64で実行できたけど　環境次第では別のを指定しなきゃいけないかも）

## そして実行
```
$./Hello
```

## 実行結果
```

$./Hello
Hello World My System
0
1
2
3
4
5
6
7
8
9
```
# まとめ
とりあえず作ってみて、アセンブラとC言語ってうまく出来てるんだなって思った（もっとアセンブラ書くことを覚悟してた）
あとはFILE構造体からファイルを指定するint値を取得するためにFILE構造体の中身を見てみたけど
Javaとかみたいにクラスがないからかすっごく複雑と実感した
（LinkedListみたいなのが入ってたし）
先人たちってすげー
"AttributeError: 'Figure' object has no attribute 'items'"が出たので、その対処。（自分用メモ）

Pythonでmatplotlibのversionを3.5.3に上げたら、「AttributeError: 'Figure' object has no attribute 'items'」なるエラーが発生した。
なぜか、肝心の描画ができない模様。

**matplotlib==3.2.2にダウングレードし、再起動したらうまくいった。**
「HTTP/1.1」についてのメモ

#### 「HTTP/1.1」とは
- 「HTTP/1.0」が発表された翌年の1997年に[RFC2068](https://www.ietf.org/rfc/rfc2068.txt)として策定され、その後、[RFC2616](https://www.ietf.org/rfc/rfc2616.txt)で改定された。
    - 以降の拡張・改定
        - [Upgrading to TLS Within HTTP/1.1 (RFC2817)](https://www.ietf.org/rfc/rfc2817.txt)
        - [Defining Well-Known Uniform Resource Identifiers (URIs) (RFC5785)](https://www.ietf.org/rfc/rfc5785.txt)
        - [Use of the Content-Disposition Header Field in the Hypertext Transfer Protocol (HTTP) (RFC6266)](https://www.ietf.org/rfc/rfc6266.txt)
        - [Unicast-Based Rapid Acquisition of Multicast RTP Sessions (RFC6285)](https://www.ietf.org/rfc/rfc6285.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing (RFC7230)](https://www.ietf.org/rfc/rfc7230.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content (RFC7231)](https://www.ietf.org/rfc/rfc7231.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests (RFC7232)](https://www.ietf.org/rfc/rfc7232.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Range Requests (RFC7233)](https://www.ietf.org/rfc/rfc7233.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Caching (RFC7234)](https://www.ietf.org/rfc/rfc7234.txt)
        - [Hypertext Transfer Protocol (HTTP/1.1): Authentication (RFC7235)](https://www.ietf.org/rfc/rfc7235.txt)
- 高速化
    - Keep-Alive
        - 「HTTP/1.0」で仕様としては定義されていなかったが実装が進んでいた `Keep-Alive` が「HTTP/1.1」では標準機能として定義された。これにより「HTTP/1.0」のリクエスト時に `Connection: Keep-Alive` のように指定していたヘッダーは不要となり、 `Keep-Alive` が有効化された通信がデフォルト状態となった。
    - パイプライン
        - 最初のリクエストが完了する前に次のリクエストを送信することで高速化を図ったものだが、HOLブロッキング(Head-of-Line-Blocking)と呼ばれる問題（リクエストが来た順にレスポンスを返す必要があるため、遅いレスポンスがあると次のレスポンスは待ち状態となる）があった。
        - 広く使われることはなかったが、改善を経て「HTTP/2」の実装へと繋がっていく。
- 暗号化
    - 通信経路を暗号化するTLSが規格化された。
- メソッドの拡張
    - 「HTTP/1.0」ではオプション扱いだったPUT、DELETEメソッドが必須メソッドとして追加された。
    - OPTIONS、TRACE、CONNECTメソッドの追加。
- バーチャルホストのサポート
- チャンク方式のサポート
- データURIスキーム
    - 「The "data" URL scheme」として[RFC2397](https://www.ietf.org/rfc/rfc2397.txt)で定義されている。
    - コンテンツ内に画像を埋め込むことでリクエスト回数を減らしダウンロード時間を短縮することができるが、base64エンコードされた画像を埋め込むことでファイルサイズが増加し、コンテンツ自体のダウンロード時間が長くなる可能性がある。

---

#### 参考URL
- [HTTP の Keep-Alive について](https://qiita.com/toshihirock/items/8d9d1cce4c04284be4c4)
- [HTTP/2のTCPレベルのHoLブロッキングとQUIC](https://dorapon2000.hatenablog.com/entry/2021/04/11/180740)
- [HTTP 1.1](https://www.f5.com/ja_jp/services/resources/glossary/http-1-1)
- [HTTP/1.1 – 標準化されたプロトコル](https://developer.mozilla.org/ja/docs/Web/HTTP/Basics_of_HTTP/Evolution_of_HTTP#http1.1_%E2%80%93_the_standardized_protocol)
- [再入門！HTTP/2.0が主流になる前にHTTP/1.1の基本を知ろう](https://www.casleyconsulting.co.jp/blog/engineer/142/)
- [HTTP/1.1 (RFC 7230 〜 7235) の改訂作業がはじまる](https://asnokaze.hatenablog.com/entry/2018/03/06/013122)
Zoom Meeting SDKでアバターにいろいろしゃべらせる

# はじめに
ZoomがSDKを提供しはじめたということで盛り上がりを見せている昨今ですが、Qiitaでも盛り上げイベントが開催されています。SDKでいろいろ遊ばせてもらえる上に、アイテムもゲットできるかも、ということで参加するしかないですね。

ということで、これを機にいろいろ実験してみたのですが、面白そうなことがたくさんできそうだったので、いくつか連投する予定です。ご興味を持たれましたら、後続の投稿もご覧ください。

第１回の記事はこちら⇒[Zoom Meeting SDKでタイムキーパーちゃんを作る](https://qiita.com/wok/items/205c086f19a7ff73718d)
第２回の記事はこちら⇒[Zoom Meeting SDKでアバターにいろいろしゃべらせる](https://qiita.com/wok/items/0450c8620f11a371bd8b)　**←本記事**
第３回の記事はこちら⇒[Zoom Meeting SDKをつかって会議にアバターで参加する](https://qiita.com/wok/items/1bccd567e844ac4e8979)
第４回の記事はこちら⇒[Zoom Meeting SDKでなんちゃってボイスチェンジャー](https://qiita.com/wok/items/08c9505d5c3c95d8956d)
番外編の記事はこちら⇒[Zoom Meetingにアバターで参加するぞ。番外編](https://qiita.com/wok/items/4f51e1a72d735b75f73f)
第５回の記事はこちら⇒[Zoom Meeting SDKとVosk browserでZoom会議のリアルタイム文字起こし](https://qiita.com/wok/items/e83c49c530354a7b8b42)


今回は、タイムキーパーちゃん改め時報ちゃんにいろいろとしゃべらせてみようと思います。出来上がりはこんな感じです。

<iframe width="560" height="315" src="https://www.youtube.com/embed/21quWaEBlOA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

英語だとこんな感じ。

<iframe width="560" height="315" src="https://www.youtube.com/embed/w3_h815WEKc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>


とりあえず、Dockerイメージにしているので、ダウンロードして使ってみてください。
なお、音声は[VoiceVox](https://voicevox.hiroshiba.jp/)と[OpenTTS](https://github.com/synesthesiam/opentts)を使わせていただいています。この二つも起動してください。VoiceVoxは、無料とは思えない高品質でかわいい声ですね。びっくりします。OpenTTSもおそらく、英語は良い発音なのだと思いますが、よくわかりません（笑い）。

```
$ docker run -p 8888:8888 dannadori/zoom-meeting-plus:v02
$ docker run --rm -it -p '127.0.0.1:50021:50021' voicevox/voicevox_engine:cpu-ubuntu20.04-latest
$ docker run -it -p 5500:5500 synesthesiam/opentts:en
```

http://localhost:8888/ にアクセスすれば使えるようになります。
なお、httpで起動しているのでローカルで使用する必要があります。

操作は次の通りです。
![image](https://user-images.githubusercontent.com/48346627/178417972-291f6d40-2a00-4081-b537-cf61f8a4166a.png)


# 構成
前回のブログでご紹介したタイムキーパーの構成とほぼ同じです。タイムキーパーの時は音声が、終了時間通知の音声で固定されていました。今回は、ユーザが入力するテキストを音声データに変換してストリームに流します。テキストから音声データへの変換は、日本語はVoiceVoxを使用させていただいています。これだけの品質で無料というは驚異的ですね。その他の言語はOpenTTSを使用させていただいています。

![image](https://user-images.githubusercontent.com/48346627/178418481-351d2aba-f8d6-4bc2-a588-a276917062ec.png)



# デモ
記事の冒頭で示した通りです。

# リポジトリ
ここで紹介したデモは次のリポジトリで公開しています。
https://github.com/w-okada/zoom-meeting-plus

どんどんアップデートしていくので最新版は安定しない可能性があります。
次のタグでcloneして使ってください。
```
$ git clone https://github.com/w-okada/zoom-meeting-plus -b v02
```

# 宣伝
弊社 FLECT は、Salesforce を中心に AWS, GCP, Azure を用いたマルチクラウドシステムの提案、開発を行っております。 また、ビデオ会議システムについては、Zoom SDK, Amazon Chime SDK, Twillio など各種ビデオ会議用 SDK を用いたシステムの開発しており、サービス化の実績も多数あります。 ご興味をお持ちいただけたら是非ご相談ください。
jetpack composeで便利なライブラリ

# 初めに
今回は`jetpack compose`を実装するときに使えるライブラリを紹介していこうと思います。
二種類紹介するので、何かのお役に立てたら光栄です


### coil
まず一つ目は、`coil`です
https://coil-kt.github.io/coil/compose/
元々、`coil`は画像を表示するための機能として`jetpack compose`と関係なく使われてきた人気のライブラリです。
`jetpack compose`では、画像に設定できる物が
- Painter
- ImageVector
- ImageBitmap
の三種類となっており、API等で受け取った画像を表示するためには少し手を加えないといけません。
そんなときに使えるのが`coil`の`AsyncImage`です。
これを使用することで`url`を渡せるだけでなく、`placeholder`等も設定できるので非常に便利です。

### constraintLayout
2つ目は`ConstraintLayout`です
https://developer.android.com/jetpack/androidx/releases/constraintlayout
こちらも、[coil](https://qiita.com/ryuji_sato/items/ee0c483ab0c4485f6947#coil)同様`jetpack compose`と関係なく使用されていた人気のライブラリです。
基本的に、`jetpack compose`は`ConstraintLayout`を使わずに画面を作成できることが利点の一つでもあるのですが、置換最中のViewであったり、慣れるまでは導入しておくのも一つの手段だとは思います。
従来通り便利ではありますが、理想を言うと使わないで実装するのが一番だと思います。

---

### 最後に
注意点として、どちらも元々使用されていたライブラリということもあり導入方法を間違えていたり、凡ミスが発生しやすいと思いますのでしっかりと確認をしながら導入していくことを強くおすすめします。
やった〜！　AppIcon、用意するの楽になった！

# 全サイズ用意するの面倒だった
今まで、Xcodeのアプリ・アイコンは、十数種類のサイズを用意しないといけませんでした。

# ワンサイズだけでいい
Xcode14から、１０２４pxのサイズだけ用意すれば、自動で調整してくれるようになりました。
楽！

![スクリーンショット 2022-07-12 14.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/01116797-d540-5998-f0dc-3fab4afaa893.png)
🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
ROS2とIsaacSIMの連携でハマらないように2

## 目次

- [1. 前回のおさらいと補足](#1-前回のおさらいと補足)
- [2. 各チュートリアルの注意点](#2-各チュートリアルの注意点)
- [3. おまけ-ROS2Navigationさわり](#3-おまけ-ros2navigationさわり)
- [4. 最後に](#4-最後に)


# 1. 前回のおさらいと補足
* ROS2をIsaac SIMで連携させるにはROS2 BRIDGEを使う
    * Isaac のシーン（今回は小屋）とROS2のTurtlebot3_Burgerのスケールが違う！
    * Turtlebotはフロアにしっかり接地させていて正常に走行可能
    * 空中に配置すると壁面に張り付く場合があります・・・

* Action Graphのパラメータに注意
    * 概ねチュートリアルの記載通りですが、一部自分の環境に合わせて書き換えが必要
    * 個別に書き換える箇所は主にValueやPathまわり
    

* チュートリアルを中断して再読み込み時は注意
    * 念の為、WindowのExtensionがROS2 BRIDGEになっているか確認します。
    * その後、保存したUSDファイルを読み込みます。    

# 2. 各チュートリアルの注意点
## 2 ROS2 Cameras
* こちらは1でTurtlebot3が走る事ができていれば特段トラブルはありませんでした。
    * ROS,ROS2で使用したRvizを呼び出しだします。
    * Rvizで呼び出す為に"ros2 topic list"で確実にrgbがいる事を確認します。
![Screenshot from 2022-07-06 16-05-32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/0c93f5cf-49ff-d0a1-fbf4-25f925eeac98.png)

* カメラの位置決めも上手く配置できるかと思います。

:::note info
注意点
2.2.2. Build the Graph for a RGB publishe
のパラメータでカメラ名はご自身でつけた名前になる場合があると思います。
Get Prim Path、Constant Stringの値はご自分の命名している名前に変更します。
:::

## 3 Constant String

:::note warn
要注意
Turtlebot3_Burgerと小屋のスケールが違うので、デフォルト値で設定するとレーダーが飛ばない（様に見える）です。
:::

* レーダー照射パラメータを長めにとっていきます。
    * ここは正直自分でも要修正ポイントでROS2だけの場合と比べて微妙でした。

![レーダー7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/c3d49c46-b446-2610-759f-183220079edb.png)

* このデータでは50mの照射距離を取っています。

## 4. ROS2 Transform Trees and Odometry
* こちらでは特段機能に影響がなく、設定したもののトラブルはありませんでした。

## 5. ROS2 Navigation

:::note info
注意
いままで活躍してくれたTurtlebot3_Burgerですが、シレっとお役御免になっています
:::
 
# 3. おまけ-ROS2Navigationさわり
:::note info
注意
これまで使用してきたTurtlebot3_Burger進めると最終ステップのナビゲーションができません

:::

* ROSやROS2を十分に使われている方ならご存知かと思いますが、これまで進めてきたワークスペースではROS2 Navigationに関する設定がされていません。
    * 新たにワークスペースを作る等適切な対応が必要になります。

![naviset.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/7cee6f17-650f-cf2d-edba-0e0530dc40b0.jpeg)

* 5.3.2. Occupancy Mapでマップ作成準備をする様子

![simplehouse.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2155177/9f2b4644-65f3-0399-3420-4ace5cf7cdd2.png)


* すんなりと室内のマップ完成。
* simple roomの様子になります。

# 4. 最後に
* ROS2などで優れた記事がありますので、そちらを元にROS2 BRIDGEでナビゲーションをできるようにしていこうと思います。