OmniAICreator/Qiita-1.07M huggingface dataset:
python CentOS7に最新版をいれる

何度か、いろいろやってやっとはいった。

ここを参照：https://www.python.jp/install/centos/index.html

いろいろやってダメだったのでgccのバージョンアップからやる。
~~~
# yum install  devtoolset-11-gcc devtoolset-11-gcc-c++ devtoolset-11-binutils
$ scl enable devtoolset-11 bash
$ gcc --version
gcc (GCC) 11.2.1 20220127 (Red Hat 11.2.1-9)
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

~~~

~~~~
# yum groupinstall "development tools"
...
Warning: Group development does not have any packages to install.
Maybe run: yum groups mark install (see man yum)
No packages in any requested group available to install or update
~~~~
こちらエラーになるのでオプション追加
~~~
 yum groupinstall "Development Tools" --setopt=group_package_types=mandatory,default,optional
~~~~
こちらを参照：https://rainbow-engine.com/yum-groupinstall-nopackage-error/
~~~
# yum install bzip2-devel gdbm-devel libffi-devel  libuuid-devel ncurses-devel openssl-devel readline-devel   sqlite-devel xz-devel zlib-devel tk-devel
....
Nothing to do
~~~


デフォルトのopensslだとバージョンが低いようでopenssl11をいれる

~~~
# yum install openssl11 openssl11-devel
$export CFLAGS=$(pkg-config --cflags openssl11)
$export LDFLAGS=$(pkg-config --libs openssl11)
$ ./configure --enable-optimizations
$ make
$ make test 
# make install
~~~

最初、gccがデフォルトのままでやっていて、make testでエラーでこけてた。
opensslもバージョンが古いのでそのままやるとコンパイルの途中でこける。
VB.NETプロジェクトをMSBuildでビルドしようとしたらエラーでできなかった件

VS2022でVB.NETのアプリケーションを作り、Jenkinsのビルドジョブに乗せようと思ってMSBuildでビルドしようと思ったがエラーでできなくて困り果てていた。

# 結論
PCに複数のMSBuildがバージョン違いでインストールされており、作ったプロジェクトに対応するバージョンででのビルドが必要だった。

# ここに至るまでの顛末

MSBuildはパスが通っていない状態だと、下記のような.NET Frameworkのディレクトリにあるため、コマンドラインで実行ファイルを指定していた。
> C:\Windows\Microsoft.NET\Framework\v4.0.30319

まずはビルド確認のためslnファイルだけ指定して実行！

> warning MSB4078: プロジェクト ファイル "hogehoge.vbproj" は MSBuild ではサポートされていないため、ビルドできません。

・・・。
ダメではないか。また、エラーを調査。すると、インストーラプロジェクトではMSBuildは使えないので、devenv.comを使えとのこと。

https://suer.hatenablog.com/entry/20111221/setup_project_ci

devenv.comってどこにあるんだろ？という疑問にはこの記事が参考になった。

https://qiita.com/zetamatta/items/08470414f71901762fd4

私の場合(VS2022)は、下記にあったのを見つけた。

> C:\Program Files\Microsoft Visual Studio\2022\Community\Common7\IDE\devenv.exe

改めて、devenv.comでビルド。今度は成功！

できたとはいえ、やっぱりMSが推奨するのはMSBuildなので、こちらでビルドできるようにしたい。

そもそもインストール無しで動かしても良さそうなゴミアプリなので、このエラーを何とかしよう。

> warning MSB4078: プロジェクト ファイル "hogehoge.vbproj" は MSBuild ではサポートされていないため、ビルドできません。

そこで、再びエラーの詳細を検索すると、MSBuildにもバージョンがあって、古いとNGみたいな文献を発見。
実際、PCには複数のVersionのMSBuildが存在することが分かった。そこで、最新のMSBuildを使ってビルドを試す。

> "C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" "hogehoge.sln"

すると・・・。

> ビルドに成功しました。
>    0 個の警告
>    0 エラー

できた！！単純にバージョンの違いだったか。

# おまけ

複数のバージョンの依存関係に悩まされるときは、こういう回避方法もあるようだ。

https://qiita.com/rot-z/items/6af080223689828225f0
CDKでCross Region Referenceを実装してみた

AWS CDKを利用して、Cross Region Referenceを実装する方法について紹介します。なお、本記事では以前紹介したWAFとCloudFrontの構成を使ってCross Region Referenceを実装しています。前回は、Cross Region Referenceを実装するために、cdk-remote-stackというライブラリを使い、少し込み入ったコードを書いていました。今回は、Stackの引数にCross region用の値を渡すことで、実装する形をとっています。

過去に紹介したCloudFront＋WAFの記事です。
[AWS CDK（ver.2）PythonでCloudFrontにWAFv2を紐づける](https://qiita.com/rm0063vpedc15/items/a719eaa99b7bcdf03d0c)

全コードはGithubを参照してください。
[Githubはここ](https://github.com/ShinyaT1994/test-cross-region.git)

## CrossRegionの実装
基本的なコードの内容は過去に紹介した記事の内容と変わらないため、ここではCross Region Referenceの実装に必要な部分のみご紹介します。

```python:app.py
wafv2_stack = Wafv2Stack(
    app, 'Wafv2Stack', env=cdk.Environment(region='us-east-1'),
    cross_region_references=True,     # Cross Region Referenceの設定をTrueにする
)

# ap-northeast-1のStackでCloudFrontを作成する
cloudfront_stack = CloudFrontStack(
    app, 'CloudFrontStack', wafv2_stack.webacl,
    env=cdk.Environment(region='ap-northeast-1'),
    cross_region_references=True,     # Cross Region Referenceの設定をTrueにする
)
```

Stackを呼出している部分のコードになりますが、コメント文を書いているcross_regio_references=Trueを参照する二つのStackに引数として渡すだけでCross region referenceが実装できます。簡単ですね・・・



## まとめ
今回はStackの引数を使って簡単にCross region referenceを実装する方法について紹介しました。
どなたかの参考となれば沢井です。
Security HubとGuardDutyを使った発見的統制

30歳になり新しいことを始めようと思い、今まで避け気味だったアウトプットに取り組み始めました。
拙い文かと思いますが、どうぞよろしくお願いします。

# はじめに
※AWSのマルチアカウントと、関連サービスの詳細な説明は省略します

Supershipで取り組んでいるAWSのセキュリティ施策について紹介します。
AWS Control Towerと AWS Organizationsを導入し、マルチアカウントな統制管理を行っています。

# ガードレール
AWSのセキュリティ・ガバナンスの統制について、ガードレールという考え方があります。
ガードレールは大きく2つの考え方で構成されています。
- あらかじめセキュリティ上問題のある操作を定義し、その操作を禁止すること（予防的統制）
- リスクがある構成、脅威などを検知・通知すること（発見的統制）

弊社ではガードレール型のセキュリティ対策を採用しています。
今回は発見的統制について記載します。

# AWS Security Hub
AWSの定めるベストプラクティスに違反していないかなど、セキュリティ上問題がある設定などを検知することができます。
セキュリティアラートの集約を行うことも可能です。

# Amazon GuardDuty
AWSアカウント上をモニタリングし、セキュリティイベントや脅威を検出します。

# 統制
AWSの[ベストプラクティス](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html#bp_mgmt-acct_)では、Organizations管理アカウントから、セキュリティを管理する専用アカウント（委任アカウント）を作成することがベストプラクティスとなっています。
ベストプラクティスに従い、委任アカウントから各アカウントのSeucurity Hub、 GuardDutyの情報を集約・管理しています。

## どこから対応するのか
Seucrity HubやGuardDutyも、内容に応じて重要度が割り当てられています。
- [SecurituHub - Severity](https://docs.aws.amazon.com/securityhub/1.0/APIReference/API_Severity.html)
- [GuardDuty - Severity ](https://docs.aws.amazon.com/ja_jp/guardduty/latest/ug/guardduty_findings.html#guardduty_findings-severity)

重要度が高いほどセキュリティリスクが高いものです。
そのため、まずは重要度が**最も高いもの（Critical）から対応する**ことをオススメします。

## どのように対応するのか
※統制を行うセキュリティ担当者が主担当として取り組む場合を仮定しています

Security HubやGuardDutyはAWSのベストプラクティスに準じてチェックを行いますが、システム特性上避けることができない検出がある場合があります。
それぞれの検出結果に対して、そのアカウントで構築されているサービス・システムの内容・特性を理解していないと判断することは不可能です。
そのような判断にはサービス・システムの理解が必須です。

統制を行うセキュリティ担当者のみでは対応できません。セキュリティ担当者がすべてのシステムを詳細まで把握することは困難です。

したがって、統制を行う管理者はアカウント利用者と密なコミュニケーションが必要です。
検出結果のトリアージなどを**アカウント利用側のエンジニアと一緒に取り組む形が理想**であると考えています。

### システム特性上避けることができない例
- 特定のEC2インスタンスを外部に公開する必要がある
    - [[EC2.9] Amazon EC2 インスタンスは、パブリック IPv4 アドレスを未設定にする必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/ec2-controls.html#ec2-9)
- 特定のS3バケットを外部に公開している
    - [[S3.2] S3 バケットではパブリック読み取りアクセスを禁止する必要があります](https://docs.aws.amazon.com/ja_jp/securityhub/latest/userguide/s3-controls.html#s3-2)


# 通知
発見的統制は、セキュリティアラートに気づく必要があります。
つまり、なんらかの形で通知する必要があります。

通知をしなければ、セキュリティ担当者が毎日AWSコンソールを開いて異常が発生しているか確認することになります。

運用の負荷を軽減するには、通知の仕組み化が必要です。
通知の仕組みについては、次回の記事にて記載予定です。

# おわりに
セキュリティ対応というのは成果が目に見えにくく、取り組むモチベーションが上がりにくいです。
しかし、実際にインシデントが発生してからでは手遅れになります。
セキュリティ担当者もアカウント利用者も双方がジブンゴトとしてセキュリティに取り組むことが大事だと、記事にして改めて感じました。

# 参考
- [AWS Security Hub](https://aws.amazon.com/jp/security-hub/)
- [Amazon GuardDuty](https://aws.amazon.com/jp/guardduty/)

# 宣伝
Supershipでは情報システム担当/セキュリティエンジニアを絶賛募集しております。
興味がある方は[Supership株式会社 採用サイト](https://supership.jp/recruit/)よりご確認ください。
Go言語におけるオブジェクト指向プログラミングについて

## はじめに
Go言語におけるオブジェクト指向プログラミングの基本的な概念について記載します。
Go言語は、クラスや継承といった伝統的なオブジェクト指向プログラミングの概念を持っていません。
その代わり、Goでは構造体（Structs）とインターフェース（Interfaces）という独自の概念を用います。

## 構造体とは？

Go言語の基本的なデータ型の一つが構造体です。これは関連するデータを一つにまとめるための型で、その中には異なる型のフィールドを持つことができます。以下に例を示します。

```go
type Person struct {
    Name string
    Age  int
}
```
ここでは、`Person`という名前の新しい型を定義しています。この型は`Name`（文字列型）と`Age`（整数型）の2つのフィールドを持つ構造体です。

そして、この`Person`型の値を作成するには以下のようにします。

```go
p := Person{Name: "Alice", Age: 30}
```

## メソッドとは？

Go言語では、特定の型に紐づけられた関数をメソッドと呼びます。これにより、その型の値（オブジェクト）がそのメソッドを"持つ"と言うことができます。以下に例を示します。

```go
func (p Person) SayHello() {
    fmt.Printf("Hello, my name is %s and I'm %d years old.\n", p.Name, p.Age)
}
```

上記の例では、`Person`型の値に対して`SayHello`メソッドを定義しています。このメソッドを呼び出すには以下のようにします。

```go
p := Person{Name: "Alice", Age: 30}
p.SayHello()
```

このコードは"Hello, my name is Alice and I'm 30 years old."と出力します。

## インターフェースとは？

Go言語のインターフェースは、メソッドのシグネチャの集合を定義します。ある型がインターフェースのすべてのメソッドを持っている場合、その型はそのインターフェースを"実装"していると言えます。

```go
type Greeter interface {
    SayHello()
}
```

上記の例では、`SayHello`メソッドを持つすべての型は`Greeter`インターフェースを実装していると言えます。したがって、`Person`型は`Greeter`インターフェースを実装しています。

これにより、`Greeter`インターフェースを要求する関数やメソッドを作成し、任意の`Greeter`を引数として受け取ることができます。

```go
func Greet(g Greeter) {
    g.SayHello()
}
```

この関数`Greet`は任意の`Greeter`を引数として受け取り、その`SayHello`メソッドを呼び出します。
これにより、`Person`型だけでなく、`SayHello`メソッドを持つ他のすべての型を引数として受け取ることができます。
[React]モーダル作り方(feat.条件文)

# モーダル

今回はボタンを**クリック**すると**モーダル**がでる機能を作ります。
<br/><br/><br/>


>デザイン

モーダルは前回作ったものを使います。
[modal](https://qiita.com/huraipan/items/a078c3a24959f9e9fd67)
```react
function App() {
  return (
    <div className="App">
      <button> click! </button>
    </div>
  );
}

function Modal(){
  return (
    <div className="modal">
      <h4>名前</h4>
      <p>年齢</p>
      <p>性別</p>
    </div>
  )
}
```
<br/><br/><br/>



> state

まず**モーダル**の状態を**state**にセーブします。
```react
let [modal, setModal] = useState(false);
```
<br/><br/><br/>

> 条件文

**jsx**中には**if文**を使えません。
今回は**三項演算子**を使います。

**state**が**ture**とモーダルが出て、**false**なら出ません。
こんな感じですね。

```react
function App (){
  let [modal, setModal] = useState(false);
  return (
    <div className="app">
      ...
      {
        modal == true ? <Modal></Modal> : null
      }
    </div>
  )
}
```


<br/><br/><br/>
>ボタンをクリックするとモーダルが出る

まずボタンに**onClick**をいれます。

```react
<button onClick={}> click! </button>
```
<br/>

**ボタン**を**クリック**するとモーダルが出るためには、
**onClick**の中に**state**を**ture**に変更する**関数**を入れます。
```react
<button onClick={()=>{ setModal(true) }}> click! </button>
```
<br/>

**しかし**これではまた**クリック**すると消えません。
```react
<button onClick={()=>{ setModal(!modal) }}> click! </button>
```
これで完成です。
[React]component使い方

# component

**component**は**react**でいろんなところで使えます。

今回はモーダルをcomponentで作りましょう。
<br/><br/><br/>

> モーダル
```html
<button>click!</button>
<div className="modal">
  <h4>名前</h4>
  <p>年齢</p>
  <p>性別</p>
</div>
```

```css
.modal{
  margin-top : 20px;
  padding : 20px;
  background : #eee;
  text-align : left;
}
```
こんな感じですね。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3509555/a3707572-4997-b1c6-f80f-7ccbf07f90bf.png)
<br/><br/><br/>

> component

App functionの中にあったhtmlを外部にfunctionを作って入れてください。
**component名**は英語の**大文字**で始まった方がいいです。
```react
function App (){
  return (
    <div>
        <button>click!</button>
    </div>
  )
}

function Modal(){
  return (
    <div className="modal">
      <h4>名前</h4>
      <p>年齢</p>
      <p>性別</p>
    </div>
  )
}
```

これだけではhtmlが消えちゃいます。
funtionの名前をタグとして入れます。
```react
function App (){
  return (
    <div>
        <button>click!</button>
        <Modal></Modal>
    </div>
  )
}
```

これで完成です。
**モーダルの機能**はここでかくにんしてください。
[modal機能]()
バッチとパッチは違います～初歩的なことも気軽に聞ける環境は幸せ～

タイトルを見て意味が分かった方はどれくらい、いらっしゃるのでしょうか…
前者は濁点の「**バ**ッチ」で後者は半濁点（丸）の「**パ**ッチ」です。
カタカナで表記した場合、判別が非常に難しく文脈で判定しないと確信が持てませんね（笑）。

さて、実を言うと私はバッチとパッチは同じもので、単なる表記ゆれだと思っていました。
私の案件では毎日、社内のチームで朝会をやっています。そこでバッチとパッチの話題が出ました。そのとき私は「？」となって「バッチとパッチは違うんですか？」と質問して初めて違いを知りました。
わりと初歩的な知識だとは思うんですが、ちゃんと聞いて良かったです（笑）。**そして初歩的なことについても気軽に聞ける環境があるというのは幸せなことだな思いました。（大事なことなので太字です）**

## バッチとパッチ

雑に ChatGPT に聞きました。IT用語辞典に書いてある内容（[バッチ処理とは](https://e-words.jp/w/%E3%83%90%E3%83%83%E3%83%81%E5%87%A6%E7%90%86.html), [パッチとは](https://e-words.jp/w/%E3%83%91%E3%83%83%E3%83%81.html)）と大きくはずれていませんでした。

![バッチとパッチの違い - Google Chrome 2023-07-13 11.22.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2960076/9fbc2b78-5082-baba-ae76-e9ca05b89726.png)

最後の一文にある内容が違いを理解しやすかったです。

> バッチは一連のタスクを一括で処理する方法を指し、パッチは既存のソフトウェアの欠陥や問題を修正するための修正プログラムを指します。
クラス図を書くようにしたらソースコードの理解がぐーんと上がった話

## はじめに

みなさんはソースコードを理解するのは得意でしょうか？

プロジェクトに途中参加したり、既存システムの改修したりする場合、既存の（他人が書いた）ソースコードを読んで理解するのは必然かと思います。

私は**ソースコードを理解するのにとても時間が掛かってしまう**タイプでした・・・

## なぜ時間が掛かってしまうのか？

ソースコードを理解するのに時間が掛かってしまう理由ですが「**全体像が把握できない**」ことが大きな原因でした。（これは今となって分かったことです。）

そもそも全体像が把握できないため、

- ソースコード（クラス数）の規模が**掴めない**:innocent:
- 機能追加や修正を行う際、どのクラスに手を入れればいいか**分からない**:innocent:
- 実装者の設計方針・意図が**分からない**:innocent:

といった状態に陥っていました。

当然、ソースコードの規模が大きくなればなるほど、全体像を把握するのが難しくなります。
「どのクラスから見てけばいいの？」「このクラスとこのクラスの関連は？」みたいな感じですね。

## クラス図を書くようになった

私の参加しているプロジェクトでは、UML（クラス図やシーケンス図）を描くことが多いのですが、これが今となっては非常に有難かったと思います。
そんなこともあり、私は**既存のソースコードからクラス図を描いてみる**ことにしました。

:::note warn
なお、一般的には「クラス図を書いて → 実装」という流れが多いかと思います。
:::

結果、リバースしてクラス図書くということにより、ソースコードの「**全体像が把握できる**」ようになりました:bulb:

全体像が把握できると、

- ソースコード（クラス数）の規模が**掴める**:smile:
- 機能追加や修正を行う際、どのクラスに手を入れればいいか**分かりやすい**:smile:
- 実装者の設計方針・意図が**なんとなく分かる**:smile:

ようになり、先ほどの問題が解消されました。
それだけでなく、

- 忘れたときに**再度見返すことができる**:muscle:
- 作成したクラス図を**他のメンバーにも展開できる**:muscle:

といったメリットも出てきました！
それ以来私は、既存のソースコードを把握する際は必ずクラス図を書くようにしています。

## クラス図を描く際のポイント
個人的には以下の点を意識しています。
- クラス図の描き方（集約/コンポジット/依存、プロパティ/メソッドなど）にはこだわり過ぎない:writing_hand:
  - こだわりすぎてクラス図を描くモチベーションを下げないようにする
- クラス図（静的構造）なんだけども、重要なシーケンスは意識して描く:writing_hand:
- ポイントや注意点は積極的にコメント（ノート）として記載する:writing_hand:

## クラス図を描くとこんな感じになります

上司「このプロジェクトの不具合対応を行ってもらうから、ソースコード一通り把握しておいて！」

- https://github.com/i-tanaka730/muscle_training_counter/tree/main/src/lib

といった依頼があったとします。
（まぁこれくらいの規模だったらめっちゃ小さいですがｗ いい例がなくすみません:bow:）
これをリバースしてクラス図にしたとすると、こんな感じになります。

![クラス設計.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/247638/54107c06-c250-2a77-35ac-62e32ef6d2e9.png)

クラス図によって全体像が把握しやすくなり、不具合対応や機能追加対応が行いやすくなるのではないでしょうか？

## おわりに

クラス図を書くようにしたらソースコードの理解がぐーんと上がった話について記載させて頂きました。

ちなみに、社員にソースコードの理解について聞いてみた所、

- リファクタリングする
- コードを書いた人（作者）の気持ちや思想を理解する
- 頭の中で理解する

といった方法があがりました。（私も元々は「頭の中で理解する」タイプでした。）

今回の内容が少しでも役に立てれば嬉しいです:innocent:
また、皆様が実践されている「**ソースコードを理解するための手法**」がありましたらコメントなど頂けると嬉しいです:innocent:
CloudFront＋Apacheでのオリジンアクセスコントロール

CloudFront+S3の場合、オリジンアクセスコントロールを行おうと思うとAWSコンソール上で作業が完結するのですが、ApacheサーバをEC2上に建ててCloudFrontを使っている場合、Apache側でアクセス制御を実施する必要があります。

このケースについてのまとまった情報があまり見つからなかったので備忘録として残しておきます。

# 仕様
以下のようなアクセス制御を実現します。
* CloudFrontからのオリジンアクセス時にカスタムヘッダーを設定
* Apacheではカスタムヘッダーを確認し、存在しない場合は403エラーを返す
* 403エラーの場合は.htaccessでCloudFrontのキャッシュページ(トップページ)を返す

# 設定方法
## CloudFrontのディストリビューションにカスタムヘッダーを設定
ディストリビューション作成時に以下の設定項目があるのでここに適当な名前でカスタムヘッダーを設定します。
すでに作成済みの場合は、
対象ディストリビューションを選択→「オリジン」のタブをクリック→対象のオリジンを選択→「編集」で修正可能です。

![スクリーンショット 2023-07-13 12.39.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926542/5accd339-2a3f-cd1f-ab80-affd989c5e7a.png)

今回はorigin-access-tokenという名前で値はランダムな文字列を設定しました。

## Apacheの設定ファイルでカスタムヘッダーをチェック
Apacheサーバの設定ファイル(*.conf)に以下の記述を行います。
```apache.conf
<Directory [アクセス制御をしたいディレクトリ]>
  order deny,allow
  deny from all
  SetEnvIf origin-access-token "CloudFrontに設定した文字列" origin-access
  allow from env=origin-access
</Directory>
```
設定後Apacheを再起動してください。
ここまでの作業でブラウザからはオリジンにアクセスできなくなっているはずです。

## curlで確認
### カスタムヘッダーなしでのチェック
```
$ curl -I [オリジンURL]
```
status 403が返ってくるはずです

### カスタムヘッダーありでのチェック
```
# curl -H "origin-access-token:[設定文字列]" -I [オリジンURL]
```
status 200が返ってくるはずです

## .htaccessで403エラー時に返すページを指定する
この設定はなくても構いませんが、ユーザに403の無機質なエラーページを見せたくない場合は.htaccessに設定してください。

```.htaccess
ErrorDocument 403 [リダイレクト先ページ]
```

# 補足
カスタムヘッダーをChrome上で設定できるプラグインもあるので、管理者はこれを使えばブラウザからオリジンにアクセスできるようにもできます。

https://chrome.google.com/webstore/detail/modheader/idgpnmonknjnojddfkpgkljpfnnfcklj?hl=ja

# まとめ
うまくオリジンアクセス制御ができるようになりました。
セキュリティ的にあまり強固な方法とはいえない気がしますが、無尽蔵なオリジンアクセスをブロックするためにはやっておいた方がいい対策かなと思います。
スマートホームとして、実現してほしいことを考えてみた。

## スマートホームでやってほしいこと

とりあえず、「アレクサ、・・・」でいろいろ出来るようになって、明らかに便利になったと感じてる。
だけど、一部、出来そうだけど出来ないことがたくさんあるので書いてみた。
外出に関しては、全員とか、一人目とかの条件があると色々助かることに気が付いた。

メーカーの人が見てくれるといいけど・・・。

■条件：外出時
・スマホを忘れて無いか？
・財布を忘れてないか？
・鍵を忘れてないか？
をチェックし、忘れ物を教えてくれる。忘れ物タグとかもあるし、出来ないかなあ。
・その他の備忘録的なチェックは音声で促すだけでも良い。

■条件：外出時かつ、鍵を忘れていない場合で、ドアを閉めた場合
（暗証番号でロック解除できる場合は、無条件ロックでもよい。
　でも、そうでなければ、鍵を忘れてたら自動ロックは、してほしくない。
　また、家に人が居て、開けっ放しで換気してるケースはロック不要なので、閉めた場合のみ）
・ロックする。

■条件：家から「全員」外出した場合
（「全員」というのが肝）
・テレビや電灯などあらかじめ登録した家電の電源を切る。
・再生中の音楽があれば、それも停止。
（エアコンなどはつけっぱなしも出来る方が良い。）
・ガスのつけっぱなしがあれば、注意して切る。
・セキュリティー関連を警報モードにする。
・お掃除ロボットを起動するのも良いかも。
・（これは高くなりそうだけど、）窓もロックする。
（シャッターを閉めると、留守丸出しなので、自動で閉まらない方が良い。）

■条件：一人目が帰宅した場合
・セキュリティー関連の警報モードを解除する。
・（気温次第で、エアコンを起動しても良い。）

■条件：暗くなってから、一人目が帰宅した場合
・廊下、リビングなどあらかじめ登録した部屋の電気をつける。

■条件：雨が降ってきたら
・洗濯物を取り込む、または洗濯物が濡れないようにする。
・スピーカー、ライト等で、家にいる人に注意喚起する。
（ただし、降ったりやんだりで、しつこくならないよう注意が必要。）
YAMLファイルの確認ではyqを使うと便利でした

CIやDockerなどの設定でYAMLを書く機会が増えましたが、構文を覚えられずエラーになることが多かったです。
[WikipediaのYAMLの項目](https://en.wikipedia.org/wiki/YAML)に詳細な内容が載っていて便利なのですが、どうしてもズレてしまったりすると構文エラーになってしまっていました。

今まで確認の際にはCIに投げたりして実際に動かしてエラー箇所を特定していましたが、yqというツールを使うとローカルで確認できるようになって便利でした。


# インストール

```bash
brew install yq
```

# 使い方

`yq`の後に参照したい変数名、ファイル名を列挙します。

```bash
yq -o=json '.' .github/workflows/actions.yml
```

変数名は例えば、`.name`といったようにルートからの階層構造で表されます。

```yaml:actions.yml
name: actions
run-name: ${{ github.actor }} is learning GitHub Actions
on: [push]
jobs:
  check-bats-version:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: '14'

      - run: curl https://api.openai.com/v1/chat/completions
      - run: >
          curl https://api.openai.com/v1/chat/completions
          -H "Content-Type: application/json"
          -H "Authorization: Bearer ${OPEN_AI_KEY}"
          -d '{"model": "gpt-3.5-turbo","messages": [{"role": "system", "content": "語尾ににゃーと付けて応答してください"}, {"role": "user", "content": "どうやってAPIで呼び出しを行ったらいいですか？"}]}'
      - run: npm install -g bats
      - run: bats -v
```

```bash
$ yq -o=json '.name' .github/workflows/learn-github-actions.yml

"actions"
```

## 利用例
下記のような長いコマンドの部分を文字列連結させてみました。

```yaml
jobs:
  check-bats-version:
    steps:
          - run: >
          curl https://api.openai.com/v1/chat/completions
          -H "Content-Type: application/json"
          -H "Authorization: Bearer ${OPEN_AI_KEY}"
          -d '{"model": "gpt-3.5-turbo","messages": [{"role": "system", "content": "語尾ににゃーと付けて応答してください"}, {"role": "user", "content": "どうやってAPIで呼び出しを行ったらいいですか？"}]}'
```

この部分をyqを使うと、下記のようにひと繋ぎの文字列になっていることがわかります。

```bash
$ $ yq -o=json '.jobs.check-bats-version.steps' .github/workflows/learn-github-actions.yml

中略
  {
    "run": "curl https://api.openai.com/v1/chat/completions -H \"Content-Type: application/json\" -H \"Authorization: Bearer ${OPEN_AI_KEY}\" -d '{\"model\": \"gpt-3.5-turbo\",\"messages\": [{\"role\": \"system\", \"content\": \"語尾ににゃーと付けてください\"}, {\"role\": \"user\", \"content\": \"どうやってAPIで呼び出しを行ったらいいですか？\"}]}'\n"
  },
```



## 参考

文字列の連結ではこちらの記事が大変参考になりました。
https://zenn.dev/gekal/articles/yaml-multi-lines-string

文字列の連結がスムーズに行えるようになると、CI上で回したいコマンドを複数行に記載することができ便利でした。
git でユーザ名/パスワードを聞かれる時の対処法

自分用のメモ

# 症状
`git push` などのコマンド実行時にユーザ名やパスワードを聞かれる。
```
# git push
Username for 'https://github.com': xxxxxx
```

# 原因
git に接続する際の接続方式が HTTPS になっているため。
git への接続方式は HTTP と SSH があるため、以下のコマンドで確認を行う。
```
/* 
 * https となっていればそのまま https:// ...
 * ssh の場合は git@github.com ... となる 
 * /
# git config remote.origin.url
https://github.com/xxxxxx/yyy.git
```

# 対処法
通信方式を ssh に変更する。
```
# git remote set-url origin git@github.com:xxxxxx/yyy.git
# git config remote.origin.url
git@github.com:xxxxxx/yyy.git
```

なお、git で ssh を使用する場合は公開鍵認証の設定が別途必要（ググれば出てきます。
すでに設定済みで なぜか HTTPS に変わっていた場合は上記の変更のみでそのまま `git push` できるはず。
わかりやすい図を描くための心得

### ~目次~
- [はじめに](#はじめに)
- [使用ツール](#使用ツール)
    - [ソフトウェア](#ソフトウェア)
        - [drawio](#drawio)
        - [PowerPoint](#PowerPoint)
    - [素材のサイト](#素材のサイト)
        - [いらすとや](#いらすとや)
        - [ICONFINDER](#ICONFINDER)
- [心掛けていること](#心掛けていること)
    - [絶対にカラフルにしない](#絶対にカラフルにしない)
        - [色相の種類は少なく](#色相の種類は少なく)
        - [区別は明度差でつける](#区別は明度差でつける)
        - [彩度は中低の色を使う](#彩度は中低の色を使う)
    - [フォントサイズは大きく](#フォントサイズは大きく)
    - [矢印は曲げない](#矢印は曲げない)
    - [これらを踏まえて](#これらを踏まえて)
- [さいごに](#さいごに)

## はじめに
研究室に配属されてから，プレゼンやレポートのための図を自身で作成する機会が多くなった．そんな中で**図を作成する時に，使っているツール・心がけていること**をこの記事にまとめた．

# 使用ツール
図を描く過程で使用するツール．
## ソフトウェア
### drawio
メインで使用しているソフトウェアで下のURLからアクセスでき，ブラウザ上で使用できる．名前通り，図を描くためのWebサービス．
ブラウザとGoogleドライブを使用したWebサービスのため別でソフトウェアを立ち上げる必要がなく，最初の読込み時以外は基本スムーズな操作ができる．図形の形状操作など直感的に操作しやすい．

https://app.diagrams.net/

### PowerPoint
Microsoftが提供する多くの人が一度は耳にしたことがあるであろう，プレゼンテーション作成用のソフトウェア．機能が複数ありアニメーション作成も行える．本来有料だが，学校や会社での配布またはPC購入時の特典でついてくることがあるので，多くの人に使われている．
以前はこちらを使っていたがdrawioに比べ，多機能過ぎて操作しづらい・動作が重いと感じたため，図の作成では使わなくなった．

https://www.microsoft.com/ja-jp/microsoft-365/powerpoint

## 素材のサイト
### いらすとや
著作権フリーかつ可愛らしい独特のタッチのイラストが多く載っているサイト．パッと浮かぶようなモノのイラストはほぼ揃っているが，色彩豊かなため使いすぎるとカラフルになり過ぎてしまうため注意が必要である．感情を表現したい時に使うことが多い．

https://www.irasutoya.com/

### ICONFINDER
シンプルなイラストが複数載っているサイト．図形の組み合わせで作れそうな図はほとんどある．
イラストを著作権条件ごとに検索でき，著作権フリーの素材を探しやすい．海外のサイトのため英語で検索する必要がある．

https://www.iconfinder.com/

# 心掛けていること
図を見る人が極力理解しやすくなるように，心掛けているポイント．

## 絶対にカラフルにしない
まずこの図を見てもらいたい．これは研究室配属してすぐの時期に自身が作成した図だ．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854778/00bc0ed8-8f88-1a41-8656-a8cd33d90dbe.png)
非常に見づらいと感じられると思う．実は色には以下のように三属性のが存在し，ある条件を満たすと上の図のようにカラフルに見えてしまう．
![](https://www.well-corp.jp/solution/wp-content/uploads/2021/10/saido.jpg)
### 色相の種類は少なく
上の見づらい図を確認すると，有彩色を緑赤黄青の4色使用している．これでは見る側はどれに焦点を当てて見れば良いかわからない．強調したい場所以外は基本無彩色にし，**有彩色を使っても0~2色**にしよう．ごちゃごちゃ感を減らすこと出来る．

### 区別は明度差でつける
強調したいわけではないが，別のモノやテリトリを表したい時は白黒の中間色である**灰色を使うとクドくならない**．上の図でいう "内部ネットワーク" と "DMZ(非武装地帯)" など隣り合っており，別のテリトリであることを伝えたいときはこの方法を使う．
ただし今回のように大きな範囲の場合はできるだけ明度の明るい色を使用する必要がある．**暗い色を広範囲に使うと，全体的に重い印象**の図になってしまう．

### 彩度は中低の色を使う
彩度の高すぎる色を使用すると，いわゆる目がチカチカする状態になる．**有彩色は極力パステルカラー**と呼ばれる淡い色を使用しよう．

## フォントサイズは大きく
プレゼン用の図ならまだしも，レポートに載せる場合は作成時よりも小さく載ることが多い．そのため，**一度大きすぎる程のフォントサイズに**して，後から小さくしていく方が良い文字になりやすい．

## 矢印は曲げない
図を作っていると，必要ない場所にカクっと曲がった矢印を使ってしまうことがあると思う．**極力直線の矢印**で構成すると見やすい図になる．

## これらを踏まえて
三属性の条件を適用させて修正してみるとこのようになる．修正前の図と比べるとかなりスッキリした印象になると思う．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854778/da09a339-b82a-ade9-940e-2a8f0c4a33f7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2854778/00bc0ed8-8f88-1a41-8656-a8cd33d90dbe.png)

# さいごに
今回は個人的にわかりやすい図作成で心掛けていることをまとめたが，デザインを本格的に学んだ人間からすると，まだまだ鼻で笑われるレベルかもしれない．しかし本当に大事なのは見る側に図の意味を伝えたいという気持ちだと思う．ここまで書いておいてなんだが，**とりあえず頑張って描こう**．
ARヘッドセットの爆発的な普及と将来の開発の可能性


ARヘッドセットの登場は、将来のスマートフォンの代替品として評価されています。その理由は、人間の技術へのアプローチの進歩と、従来のスマートフォンの使用に比べて利便性があるからです。では、ARヘッドセットはどのように爆発的な普及を遂げ、将来の開発の可能性はどのように見えるでしょうか。以下の記事で詳しく見ていきましょう。

1. 現在までのARヘッドセットの普及

AR（拡張現実）ヘッドセットは、現代の技術世界で最も革新的な技術の1つとなっています。魅力的な機能を備えたARヘッドセットは、ユニークな体験を提供し、現実と仮想の優れた組み合わせを実現します。世界中で、この爆発的な普及は大きなブーストを生み出し、ユーザーやさまざまな業界から特別な関心を集めています。

仮想現実の分野は、私たちが周囲の世界と対話する方法を変えました。電話やコンピューターの画面に注目するのではなく、私たちは現実の空間内で形成される追加情報、グラフィックス、仮想オブジェクトを見ることができます。ARヘッドセットとVRヘッドセットは、視覚的な体験と直接的なインタラクションを提供し、創造力と応用の可能性を広げる新しい世界を開きます。

![AR-Meta_2-Inline.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/53cf5faf-943e-993b-7584-dc7f6aa6f632.jpeg)
ARヘッドセット-現代の技術世界で最も革新的な技術
Cre：wired

2. ARヘッドセットの将来の開発の可能性

ARヘッドセットの将来の開発の可能性は非常に多岐にわたり、さまざまな領域で多くの機会と重大な変化をもたらすことが期待されています。以下に、将来の仮想現実分野での重要な開発の可能性をいくつか紹介します。

2.1. ユーザー体験の変革
ARヘッドセットは、拡張現実の体験を提供し、ユーザーが追加の情報や仮想的なオブジェクトを通じて現実世界と対話することができます。直接的かつ直感的な情報を提供することにより、私たちは作業、娯楽、学習、コミュニケーションの方法を変えることができます。

2.2. 産業への応用
ARは、特にデザイン、製造、メンテナンスの分野で非常に大きな潜在能力を持っています。情報のリアルタイム表示と直接的なガイダンスを提供することにより、ARヘッドセットは労働者やエンジニアの生産性を向上させ、エラーを減らし、安全性を高めることができます。

2.3. 電子商取引
ARヘッドセットは、オンラインショッピングの方法を変える可能性があります。顧客は仮想的なオンライン環境で服、ジュエリー、家具などを試着することができます。これにより、顧客は購入前に製品を視覚的に体験し、オンラインショッピングの体験が向上します。

2.4. 教育とトレーニング
ARヘッドセットは、学習やトレーニングの方法を変える可能性があります。仮想的な学習環境を作り出し、学生が視覚的で現実的な体験をすることができます。AR VRアプリケーションは、実践的なタスクや職業訓練においても直接的なガイダンスやサポートを提供することができます。

2.5. ゲームとエンターテイメント
ARヘッドセットは、新しい、魅力的なゲーム体験を提供することができます。プレーヤーは仮想の世界に入り込み、現実の世界をサポートするような体験をすることができます。また、映画の鑑賞、ライブスポーツイベントの視聴、拡張現実を活用したマルチプレイヤーゲームへの参加など、エンターテイメント分野でも可能性を秘めています。

2.6. 医療
ARヘッドセットは、医療分野で情報と直接的なガイダンスを提供することができます。手術、教育、トレーニング、診断など、医師や看護師をサポートすることができます。また、治療中の患者にもエンターテイメントやリラクゼーションの体験を提供することができます。

2.7. モバイルデバイスと接続性
Apple Vision ProやMeta Guest 3などの成功例に続き、ARヘッドセットは次世代のモバイル革命で重要な役割を果たすことが期待されています。ARヘッドセットは、スマートフォン、タブレット、その他のスマートデバイスの機能を統合し、強力なモバイル体験と継続的な接続を提供することができます。

![dsc00134-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/92345/3c41261c-bda5-89d7-576a-8a70a5b9ec8e.jpeg)
ARヘッドセットの爆発的な普及
Cre：zdnet


まとめると、ARヘッドセットは仮想現実の相互作用と体験に革命をもたらしました。ARヘッドセットの爆発的な普及は世界に訪れ、さまざまな領域で相互作用、創造性、応用の新しい可能性を開きました。持続的な発展の可能性を考えると、AR技術の未来はまだ課題もありますが、大きな進歩を期待できます。AR / VRヘッドセットの利点と欠点については、以下の記事もご参考ください。

参考情報：https://miichisoft.com/apple-vision-pro-the-good-and-the-bad-of-the-revolutionary-vr-and-ar-headset/

Website: https://miichisoft.com/
repo init で変数でurlを渡すようにしたらエラーになる

# この記事について

repo init がエラーになる要因の1つと、その回避方法を紹介します。

## やりたかったこと

repo init に渡すurl, branch, xmlファイルを変数にして、汎用的にしたかったため、REPO_URL, REPO_BRANCH, REPO_XML を環境変数で設定して、repo initコマンドに渡すスクリプトを作成した。

```bash
repo_url=$REPO_URL
repo_branch=$REPO_BRANCH
repo_xml=$REPO_XML

cd $HOME

echo "RUN repo init from ${repo_url}"
repo init --depth=1 -u ${repo_url} -b "${repo_branch}" -m "${repo_xml}" --repo-branch=repo-1

```

たが実行すると、以下のようなエラーが発生して、repo initが失敗した。

```
Get ${repo_url}/clone.bundle
fatal: cloning the git-repo repository failed, will remove '.repo/repo' 
```

## 原因と対策

実は`$REPO_URL` という変数はrepoコマンドの予約変数となっていて、`https://gerrit.googlesource.com/git-repo` というurlが入っている。repoコマンドではこのサイトからrepoのテンプレート等をcloneする必要があるが、$REPO_URLを書き換えてしまったため、エラー終了していた。

REPO_URLを別名に変更することで回避できる。

```bash
repo_url=$REPO_MANIFEST_URL
repo_branch=$REPO_BRANCH
repo_xml=$REPO_XML

cd $HOME

echo "RUN repo init from ${repo_url}"
repo init --depth=1 -u ${repo_url} -b "${repo_branch}" -m "${repo_xml}" --repo-branch=repo-1

```
Serverspec と InSpec の違い


https://www.chef.io/products/chef-inspec

”Chef InSpec”とは、インフラの構成/設定のテストを自動化するためのフレームワークです。
Serverspecの上位互換にあたり、AnsibleやChefにより構築されたインフラの正常性確認やセキュリティ監査を行うためのツールです。

Serverspecの[開発者 宮下 剛輔氏](https://eh-career.com/engineerhub/entry/2018/01/31/110000)は、インフラテストツールの必要性について次のようにコメントしています。

”構築は自動化したが、テストは手動、だから Serverspecが必要だった”

--

日本IBMなど多くの企業でAnsibleやChefなどのIaaSツールとChef InSpecを連携させ、自動化をで完成させている。

https://www.imagazine.co.jp/feature-ansible-2-automation/

Chefを販売するProgress社も、Chef InSpecとAnsibleの連携させる動画を出している。

https://youtu.be/jtLWpwWm0YM

---

# __InSpecの優位性__：Serverspecとの比較

###### - 開発者 (Reliability)
コミュニティ依存のServerspecは、開発やメンテナンスが停滞しているのに対して、
Chef InSpec は、Chef を買収した[Progress社](https://www.progress.com)による開発が活発に行なわれている。

> Progress Softwareは、世界中に100以上の拠点を持ち、10,000人以上の従業員を擁している。主要な顧客には、Fortune 500企業をはじめ、政府機関、金融機関、医療機関など、さまざまな業界の企業が含まれる。


###### - 豊富なテスト項目 (Usability)
Serverspecのリソース数(テスト可能項目)が、[50(Github)](https://github.com/mizzy/serverspec/tree/master/lib/serverspec/type) と限られているのに対して、
Chef InSpec は[1000+(docs.chef.io)](https://docs.chef.io/inspec/resources/)のリソースが用意されている。ここ数年Serverspecのリソースにほぼ変化が見られない中、Chef InSpecの開発とメンテナンスは[Progress社](https://www.progress.com)により活発に行われている。


###### - マルチプラットフォーム対応 (Scalability)
Serverspecが主にLinuxマシンをターゲットにしているのに対して、
Chef InSpecは一般的なOSやアプリケーションのほぼすべてに対応している。
AIXなどを含むLinux系のすべてのDistroに加えて、Windowsに対しても強力に動作する。
OSやアプリケーションに加えて、AWS、GCP、Azureのクラウドアカウントのテスト(CSPM)も高い粒度で行うことができる。

###### - 可視化と視認性 (Visibility)
Serverspecが出力するテスト結果は視認性に課題があるのに対して、Chef InSpecは視認性に優れている。
[Chef InSpec出力例]![capture 2023-07-13 22.35.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352042/545f103e-8870-4feb-2b29-df63763c2102.png)
さらに[Chef Automate UI](https://www.chef.io/products/chef-automate)でインフラ全体の状態をリアルタイムに可視化することができる。テストの失敗を検知しSlack,ServiceNowなどへ通知することが可能になる。
![capture 2023-07-13 22.40.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/352042/ae267657-d586-5b08-226a-b929d9993bf3.png)

###### - セキュリティとコンプライアンス (DevSecOps)
CISベンチマークやSTIGに準拠したテストコードが用意されており、InSpecテストを実行することで対象のノードがそれらのセキュリティ基準をどの程度満たしているかをテストすることができる。AnsibleやChefなどのインフラ構築の構成・設定テストを行うと同時にセキュリティとコンプライアンスのテストも実施し、インフラ構築の完全自動化を【完成】させることができる。


###### - Chefとの統合 
Compliance Phaseと呼ばれてるChefの新機能により、インフラ構成管理(IaC)としてChefを使用している場合、Chefの実行の最後にInSpecテストをシームレスに実行することができる。

https://docs.chef.io/chef_compliance_phase/

---

”Chef InSpec”ダウンロードリンク：https://www.chef.io/downloads/tools/inspec

Chef InSpecは、Chefと同様に2019年に無償の商用利用が出来なっています。　

https://www.creationline.com/tech-blog/30958

__ライセンスや技術サポートについて詳しくは、連絡先： support@chef-sec.com にお問い合わせください。__ 


www.chef-sec.com
学習データをトレーニング/バリデーション/テストデータの３つに分割する方法

機械学習の学習データをトレーニング/バリデーション/テストデータの３つに分割する方法のメモ。sklearn.model_selection.train_test_splitでは２つにしか分割しないので、自分で分割するしかないけど、よく忘れるので

10個の要素をトレーニング/バリデーション/テストそれぞれ80% 10% 10%に分割

```python
import numpy as np
import pandas as pd
import random
from sklearn.model_selection import train_test_split
from sklearn.utils import shuffle
X=np.arange(10)
```

・スライス操作
```python
X=shuffle(X, random_state=1)
train=np.delete(X,np.s_[::5],0) #5個おきのデータを削除 80%残す
test_valid=X[::5]  #5個おきのデータを取得 20%
test=test_valid[::2] #20%のうち偶数要素を取得 10%
valid=test_valid[1::2] #20%のうち奇数要素を取得 10%
```

・train_test_splitを使う
```python
train, test_valid = train_test_split(X, test_size=0.2, random_state=1) #80% 20%に分割
test, valid = train_test_split(test_valid, test_size=0.5, random_state=1) # 20%を半分に分割
```

・1行で書くなら
```python
train, test, valid= np.split(shuffle(X, random_state=1), [int(.8*len(X)), int(.9*len(X))])
```
```[int(.8*len(X)), int(.9*len(X))]```は分割位置.
全体の80%, 90%の位置で分割され、結果として8:1:1で分割される
GitHubのコメントをChatGPTでポジティブにするChrome拡張を作ってみた

## 背景
Slackで開発チームのメンバーからおすすめ記事をいただいた。
![スクリーンショット 2023-07-13 9.44.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246392/e83fe14d-ea24-e14d-52a5-192ab138afd1.png)

そして自分がコメントして
> Gitでコメント書いてPOSTしたら、はんなり変換後にコメント差し替えてPOSTしてくれるChrome拡張機能とか作ると面白いかもですね :thinking: 

実際にChrome拡張機能を作りました。


## 作ったもの
「Friendly GitHub comments」というChrome拡張機能です。
GitHubのPull Requestに入力したコメントをChatGPTで各種方言に変換します。

ChromeウェブストアからChromeブラウザにインストールできます。

https://chrome.google.com/webstore/detail/friendly-github-comments/npgbhjmjmiipbajdnmmdjemimhcpoade

## 使ってみる
最初にオプションからChatGPTのAPIキーを保存する必要があります。
（保存先はLocal Storageなのでブラウザ内にだけ保存されます）
![スクリーンショット 2023-07-13 9.53.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246392/ee488913-aa15-69f4-74c1-96e854527e04.png)


GitHubのPull Requestにコメントを入力して、Chrome拡張機能のアイコンから「コメントを変換する」以下にある変換後の方言を選択。
![スクリーンショット 2023-07-13 10.01.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246392/a278c9ab-6638-f01d-b924-101440b89649.png)

ChatGPTがコメントを選択した方言に変換してくれます（口が悪い時もあります :sweat_smile: ）
![スクリーンショット 2023-07-13 10.01.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246392/b3838ee8-fc79-9d6e-3211-69064fe16f38.png)

拡張機能から「コメントを変換前に戻す」を選択すれば、元のコメントにもすぐ戻せます。
![スクリーンショット 2023-07-13 10.02.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246392/4d1825de-6d67-8f7b-159f-6a1fd6180011.png)

## じわじわ広がってほしい
Pull Requestのコメントをポジティブに言い換えて、開発チーム内の心理的安全性を高めましょう！


## 作るきっかけになった記事
ありがとうございます :bow:
https://qiita.com/Yametaro/items/1ad077ef8e98c436dfeb
災害は、エンジニアに関係ないと思う？　BCP策定も大事、防災訓練も大事、でも自分の身は自分で守りましょう。

:::note info
本記事は、ChatGPT（無料版）で
行なっております。GPT4での確認
はできておりません。あしからず。
:::

　どうも、カーブミラーです。

　昨日は、
　　Qiitaでうまく書き込みが
　　　できませんでした。

　今回は、
　　いつもよりも真面目に
　　　書かせてください。

　いや、
　　いつも真面目に書いてますよ、
　　　本当に。

　まぁ、それはそれで置いといて。

　内容が内容だけに、
　　記述方法を変更します。
***
# BCP
　みなさんの会社は、BCPを策定されているでしょうか？
　BCPとは、事業継続計画といって、災害等が発生した場合の事業をどうやって継続していくのか、を定めたものです。

　なぜ、今回、これを取り上げているかと言いますと、現在、世界各地で発生している異常気象（大雨や干魃や竜巻や砂嵐など）や今後の直下型地震の予測を考えると、策定しておいた方が、自分たちだけでなく、取引先をも、早期回復が叶うのではないかと思うのです。

　でも、起業して二年三年程度だと、策定していない会社もあるかと思います。

　それに、防災訓練もしているかどうか、ではないでしょうか。

　そのあたり、一度、会社に確認した方がいいと思います。

　なお、
　　BCP策定については、
　　　ChatGPTさんに
　　　　目次から作ってもらえば、
　　　　　早いでしょう。

```Text:BCP策定の目次Prompt
BCPを策定したいです。
どのような内容を含めたらいいでしょうか？
まずは、目次からお願いします。
```
***
# 個人レベルの意識向上
　そうした防災訓練やBCP策定も大事ですが、**個人レベルの意識も高めておいてくださいね**。

　地震を想定してみますか。
　おそらく、みなさんのスマホやケータイが一斉に鳴りはじめます。
　すぐにデスクの下に潜れるようにしましょう。
　そのためには、普段からデスク下は、片付けておくことです。入れなかったら、ケガすると思いましょう。
　軽症で済むかもしれませんが、ひっくり返って、変なところに頭を打つ可能性もあります。そうなれば、重症です。救急車要請が必要になります。
　でも、**そんなときに救急車、呼んで来ると思いますか？　来ません！　あちこちで同じように、被害に遭っているのですから**。
　テレビ局の映像を見ていると、隠れずに右往左往している人がいます。状況を記録しようとしているのかもしれませんが、**大変危険です。やらないように**。
　パソコンやプリンタが空中を飛ぶシーンもありました。もう**身のまわりは、危険物だらけ**です。

　だからこそ、デスク下に潜るのです。
　できれば、そこに**ヘルメットがあれば、なおいい！**
　地震が来たら、まず**自分の安全**です。**全員がそれを守れば、いらないケガもしなくて済みます**。

　あっ、買い物してて、大地震が発生したら、棚から離れて、買い物カゴを頭にかぶって、身体を守るようにしましょう。
***
# 災害発生後
　地震が止んだとしましょう。

　おそらく、オフィスはシッチャカメッチャカでしょう。
　でも、その確認の前に、**全員の安否を確認する方が大切**です。安否が確認できれば、ほかのことにも意識を向けられます。

　いくつもの部署がある会社の場合、**ふたり一組での様子見に行かせます**。場合によっては、助けを必要とされているかもしれません。
　ふたり一組というのは、イザというときに、ひとりが男手を集めてくることができます。また、どちらかがケガをすることもありえます。ひとりでは、それを知らせることも難しい。わかりますよね。

　さて、手の空いている人間は何をするか。ライフラインの確認です。
　水や食料は、イザというときのために、用意しておくのは、常識です。
　電力の確認。
　情報回線の確認。まず、内線。次に外線。スマホがネットにつながるか。外へ外へと確認していきます。
　これは、社内ならば助けが必要かがわかる。また、社外ならば、こちらの無事と、相手先の安否確認ができます。場合によっては、相手先に人を派遣しての救助や手伝いが可能です。
　もちろん、家族の安否も確認すべきかもしれませんね。
　ただ、当然ながら、ほかの人たちも同様に連絡を取ろうとします。回線がつながらない可能性もあります。今は電話よりもSNSなんかの方が多いんでしょうけど。そこは手を考えておくべきですね。

　そうして、社内の人員の安否が確認できたなら、ようやく**BCPの出番**でしょうか。

　ちなみに、個人レベルで防災用品を会社やバッグに用意しておくと、安心です。
　たいしたものでなくても、普段からのもしもの備えがあるのは、頼もしいものです。
　特に女性は、月のものもありますしね。
　男性は……任せますw

　スニーカーのような歩きやすいクツをロッカーに置いてあれば、避難する必要ができても、ムダに疲労せずに済みます。
***
# 帰宅難民になるな
　それから、無理に帰宅しようとしないように。
　帰宅難民になります。
　歩いて、普段は一時間でも、人混みで、全然進まず、結局、帰宅できたのは翌日だった、なんてこともありましたからね。
　子どもが心配なのはわかります。ペットが心配なのはわかります。
　でも、連絡して、人に頼むとかして、お互いの安全を確保しましょう。
***
# 避難所について
　それと避難所ですが、基本的に小中学校の体育館でしょう。
　一応の備えはあります。そこは確認しておきましょう。
　何を持っていけば、いいのかはそれで決めるといいです。

　あと、体育館ですが、多くの他人が集まります。老若男女が。そうすると、基本的に規律がありません。子ども連れだと、公園か何かと思って、騒ぎます。声が響くこともそれに拍車を掛けます。
　子どもだけではなく、大人もいろんな人がいます。特に若い人は、他人のことを思いやるなんて、頭にありません。夜でも体育館の床をドタバタと歩きます。

　そうなると、夜は眠れません。そう覚悟しておきましょう。アイマスクや耳栓してても多少よくなるかな、くらい。

　これ、実体験ですw

　それならば、会社で寝泊まりする方が安心です。
　もちろん、それ用の備品は必要ですけどね。

　それで、翌日に交通機関が動くのを待って、帰宅しましょう。

　余裕を持っての行動が大切です。
***
# 最後に

　　**まず、自分の命。**

　　**次に、人の命。**

　　**事業は、そのあと。**

　です。
GPU上で動作可能なコンパイラ Co-dfns

# はじめに
APLとはソースコードがこういう見た目の言語です。（ライフゲーム、Dyalog版)
```APL
life←{
    ↑1 ⍵∨.∧3 4=+/,¯1 0 1∘.⊖¯1 0 1∘.⌽⊂⍵  ⍝ Expression for next generation.
}
```
詳しくは、

- Wikipedia日本語版

https://ja.wikipedia.org/wiki/APL

- Wikipedia英語版

https://en.wikipedia.org/wiki/APL_(programming_language)

# GPU上で動くコンパイラ
コンパイラをCPUではなくGPU上で動して何らかのメリットが生まれるためには、少なくとも以下の2つの条件を満たす必要があります。
・基本的に全て並列処理（GPUの高速性は処理の並列化によってもたらされます）
・基本的に条件分岐はしない（GPUはCPUよりも条件分岐がかなり苦手です）

APLはその仕様からこの条件を満たす事が可能なため、GPU (現在はCUDAとOpenCLに対応）上で動作可能な異常に高速なコンパイラCo-dfnsが、Dyalog社のAaron Hsuによって開発されています。

# Co-dfns
Co-dfnsコンパイラはAaron Hsuがインディアナ大学の大学院在学時代に開発が始まりました。

https://www.youtube.com/watch?v=-brW204CXks

まだ開発中ですが、実際に試す事ができます。
実際にコードをコンパイルして試すためにはDyalogとArrayFireが必要ですがRelease版はWindows、Linux、 macOSに対応しています。

https://github.com/Co-dfns/Co-dfns

# 応用例
- U-Net CNN in APL
APLによって実装されたフレームワーク、ライブラリ不要の機械学習です。
論文を読むにはPDFをクリックしてください。（論文の最後の方にソースコードもついています）

https://dl.acm.org/doi/10.1145/3589246.3595371

# おわりに
古くて新しいAPLという言語の魅力を知ってもらえれば嬉しいです。
syslog

syslog。
ユーザが発行したloggerコマンドや、systemdで発行したコマンドのログ。
```
Jul 13 11:36:20 localhost dbus[782]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Jul 13 11:36:20 localhost systemd: Started Network Manager Script Dispatcher Service.
Jul 13 11:36:20 localhost nm-dispatcher: req:1 'dhcp4-change' [ens33]: new request (4 scripts)
Jul 13 11:36:20 localhost nm-dispatcher: req:1 'dhcp4-change' [ens33]: start running ordered scripts...
Jul 13 11:37:46 localhost dbus[782]: [system] Activating via systemd: service name='net.reactivated.Fprint' unit='fprintd.service'
Jul 13 11:37:46 localhost systemd: Starting Fingerprint Authentication Daemon...
Jul 13 11:37:46 localhost dbus[782]: [system] Successfully activated service 'net.reactivated.Fprint'
Jul 13 11:37:46 localhost systemd: Started Fingerprint Authentication Daemon.
Jul 13 11:38:03 localhost systemd: Removed slice User Slice of root.
```
centos7場合、以下のようにsyslogをかく
1.ユーザがloggerコマンドを発行
2.systemd-journaldが受領し、ジャーナルファイルに書き込む
3.rsyslogがジャーナルを読込、/var/log/messagesに書き込む

loggerコマンド発行
```
[linuxstudy@localhost etc]$ logger hhh
```
/var/log/messages
```/var/log/messages
Jul 13 12:37:15 localhost linuxstudy: hhh
```
/etc/rsyslog.conf
```
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)           //ローカルソケット
$ModLoad imjournal # provides access to the systemd journal    //ジャーナル
                             :
$OmitLocalLogging on        //ローカルソケットを無視
```
/etc/rsyslog.conf
ログ出力先のコントロール。facility.priority毎
```
#### RULES ####

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
```
参考にした資料：https://straypenguin.winfield-net.com/journald.html
【Dart/Flutter】FlutterエンジニアがPackageの選定の際に参考にすること(その１)

![スクリーンショット 2023-07-11 13.30.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672609/2fa822b2-f7bb-226c-9bbd-d8d53aa20de9.png)


こんにちわ。いせりゅーです。
元気にもりもりと開発できてとても幸せです😀

今回は、原点に立ち戻ってみて大切なことについて書いてこうと思います。

FlutterではPackageを使用することで開発コストが抑えられたり、開発効率がとてもよくなったりします。そのためFlutterエンジニアはPackageを使いこなせるといいエンジニアになれると僕は思っています。

今回は、そのPackageの選定の手助けになるような記事を書いていきます。


:::note alert
<b>注意事項</b>
この記事はあくまでも主観に基づいて書かれているため、これが正解というわけではありません。一つの意見だと思っていただけると幸いです。
:::

# パッケージの種類とその説明

### Dart Package
- Dartのみで実装された一般的なパッケージ。AndroidやiOSなどのプラットフォームに依存せずに様々な機能を提供します。

### Plugin Package
- Dartのみではなく、AndroidやiOS向けのネイティブのAPIにアクセスする機能も含めたパッケージ。利用するネイティブの機能によって利用可能なプラットフォームが異なります。


# 個人的にみておくといい選定ポイント

### 1個目

　<b>Flutterの公式が紹介している。</b>

- `go_router`や`flutter_rating_bar`などが紹介されています。
- これは最強な気がしています。
- Flutterの公式チャンネルで紹介されているため、ほぼ信頼性が高いと思っております。

<b>こちらが「Flutter Widget of the Week」となっております。</b>

https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG


### 2個目

<b>定期的なメンテナンスがしっかりしている。</b>

- しっかりとしているPackageや有名なPackageは、定期的なメンテナンスをしているものが多いです。そのため、いいPackageを選ぶことにおいては、こちらも確認しておくといいと思います。
- 個人的には、頻繁にメンテナンスされているものは信頼性が高いと判断しています。理由としては、新規機能やissuesに記載されたものの更新のために、メンテナンスをされていることが多く、良いものにしていっているからです。


### 3個目

　<b>ドキュメントがしっかりと記載されている</b>

- こちらについては、書いてあるものと書いていないものがあると思いますが、しっかりとしているPackageの多くはきちんとドキュメントを用意してくれています。

- その例として <b>Riverpod</b>がわかりやすい例です。

- こちらのサイトがきちんとしたドキュメントが用意されており、Riverpodを使用する人にとってはとてもありがたいですね。こう言ったドキュメントがあるものは信頼性が高いと言ってもいいと思います。（でたらめなドキュメントがあるかもしれないので一つの選考基準にしてもらえると！）

https://riverpod.dev/


# 最後に
これ以外にもいくつかあるため、その２、その３などシリーズ化にしていこうと思います！お楽しみに！

ぜひみてね😀


# 参考文献


https://qiita.com/MasaruHirose/items/e67d108f330f4531decb#:~:text=%E3%81%A8%E6%80%9D%E3%81%84%E3%81%BE%E3%81%99%E3%80%82-,Dart%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%A8%E3%81%AF,%E3%82%92%20%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%20%E3%81%A8%E5%91%BC%E3%81%B3%E3%81%BE%E3%81%99%E3%80%82

https://pub.dev/



https://www.youtube.com/playlist?list=PLjxrf2q8roU23XGwz3Km7sQZFTdB996iG
Tableau Serverで抽出の更新をやる

# 概要
pythonでAPI使おうとして躓いたので。
ちなみにTableau Server Client (TSC)を使った時の話です。

Tableau Online版はこのへんが参考になるかと。
考え方は同じですが。
https://www.meganii.com/blog/2021/03/27/how-to-use-tableau-rest-api-with-personal-access-tokens/
https://cuebic.hatenablog.com/entry/2023/02/24/104623
https://www.ai-shift.co.jp/techblog/1577


# ログイン
https://tableau.github.io/server-client-python/docs/
こちらに書いてあるようなログインが出来ればあとは煮るなり焼くなり。
ログインが出来なかったので、来世の自分向けにまとめます。

↓これが全て

```python
import tableauserverclient as TSC

TOKEN_NAME = 'トークンのなまえ'
TOKEN_VALUE ='トークンの値'
SERVER_URL ='URLの固有部分'

tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
server = TSC.Server(SERVER_URL)
server.version = "3.17" 

with server.auth.sign_in(tableau_auth):
    all_datasources, pagination_item = server.datasources.get()
    print("\nThere are {} datasources on site: ".format(pagination_item.total_available))
    print([datasource.name for datasource in all_datasources])
```

ログインするときはトークン必須。
（セキュリティ的にもIDとパスワードはよくない）
トークンはマイアカウントの設定>個人トークンの発行から。
ちなみにトークンは15日間使用しないと使用不可になるらしい。
ので、定期的に使っていれば実質有効期限なし。たぶん。


で、URL。
サンプルには'http://SERVER_URL'と書いてあり、ぶっちゃけこのまんまの通り入力すればよかったのだが、深読みしすぎた。
「https://hogehoge.tableeeeeeeau.com/#/home」 みたいなURLだとすると、「hogehoge.tableau.com」と入力すればよいのである。
気づけなかったのがつらい。


あとはサーバのバージョン。
なんとなく不安だったので上書きした。
これの一番下の表に書いてるけども、サーバのバージョン毎にAPIも更新されているような。
https://tableau.github.io/server-client-python/docs/versions.html
古いものに対してはおそらく互換性あると思うし、デフォルトのバージョンでコケることもあるのか不明なので、おまじない。
なんにもしなかったら2.4って出た気がする。


やってることメモもついでに。
```python
# requestでいうjsonを作ってくれてる
tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
# APIたたくURL作ってくれてる
server = TSC.Server(SERVER_URL)
# request送ってくれる
server.auth.sign_in(tableau_auth)
```

requestに置換すればべんりーってなるやつ。
試しにrequestで叩いてからこのライブラリ使ったら、ようやく何やってんのか理解できた。
いきなし発達文明に手を出すものではないな。


# 抽出の更新
https://tableau.github.io/server-client-python/docs/filter-sort
こちらを参考に。

更新するにはワークブックIDというのを取得しなくてはならないらしい。
フィルタリングで取れるのでさくっと取って更新する。

```python
import tableauserverclient as TSC

TOKEN_NAME = 'トークンのなまえ'
TOKEN_VALUE ='トークンの値'
SERVER_URL ='URLの固有部分'

tableau_auth = TSC.PersonalAccessTokenAuth(TOKEN_NAME, TOKEN_VALUE)
server = TSC.Server(SERVER_URL)
server.version = "3.17" 

with server.auth.sign_in(tableau_auth):
        req_option = TSC.RequestOptions()

        # テストワークブックという名を含むワークブック
        req_option.filter.add(TSC.Filter(TSC.RequestOptions.Field.Name,
                                        TSC.RequestOptions.Operator.Equals,
                                        'テストワークブック'))
        matching_workbooks, pagination_item = server.workbooks.get(req_option)

        # これがワークブックID
        # print(matching_workbooks[0].owner_id)

        status = server.workbooks.refresh(workbook_id=matching_workbooks[0])

```

検索すると、フィルタなしのgetを使った例が出てくる。
オプションなしだと100件までしか取得してくれないし、わざわざ調べてから決め打ちするのも手間っぽそうなのでフィルタを採用。
抽出を終えたらサーバで確認。
多分秒で終わる気がする。
Railsで入力フォーム等にバリデーションを設定する

# そもそもバリデーションとは
入力フォームなどでユーザーが故意または過失のもと誤った情報を入力した際に、入力内容をそのまま登録するのではなく、エラーをかえすこと。
これにより、誤情報を未然に防ぐほか、攻撃者からのXSSなども防ぐことが可能になる。

# 実装例
RailsのModelに記述します。

- 空データを登録できないようにする
```ruby:member.rb
class Member < ApplicationRecord
    validates :name, presence: true
end
```

- 文字数を制限する。
```ruby:member.rb
class Member < ApplicationRecord
    #長さの上限を50文字に設定
    validates :name, length: { maximum: 50 }
    #長さの下限を2文字に設定
    validates :name, length: { minimum: 2 }
    #長さの範囲を2-50文字
    validates :name, length: { in: 2..50 }
    validates :name, length: { minimum: 2, maximum: 50 }
    #長さを5文字に指定
    validates :name, length: { is: 5 }
end
```

- 数値のみ許可
```ruby:member.rb
class Member < ApplicationRecord
    validates :age, numericality: { only_integer: true }
end
```

- 同一データを登録できないようにする
```ruby:member.rb
class Member < ApplicationRecord
    validates :name, uniqueness: true
end
```

- 特定の値が含まれている場合のみ許可
```ruby:member.rb
class Member < ApplicationRecord
    #1～3のいずれかの数字のみ許可。
    validates :flg, inclusion: { in: 1..3 }
end
```

-メールアドレスの形式のみ許可
```ruby:member.rb
class Member < ApplicationRecord
    VALID_EMAIL = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
    validates :email, format: { with: VALID_EMAIL }
end
```

# 参考資料
https://railsguides.jp/active_record_validations.html
https://rails-study.net/validation/
https://www.sejuku.net/blog/25973
[tang nano 9k] picorvを動かしてみた

# 環境
1. windows11
1. wsl2
    - make用
# 使用ツール
1. Tang nano 9k
1. Gowin ide
1. picoRV32のクロスコンパイラ
    - xpack-riscv-none-embed-gcc-8.2.0-3.1-linux-x64.tgz
    - ここからとれます(xpack-riscv-none-embed-gcc-8.2.0-3.1-linux-x64.tgz)
1. teraterm
1. picorv等のソースコード: https://github.com/sipeed/TangNano-9K-example/tree/main
  
# 1. 事前準備
1. [リポジトリ](https://github.com/sipeed/TangNano-9K-example/tree/main)を適当な場所にcloneする。
2. ```TangNano-9K-example\picotiny\project\picotiny.gprj```をgowin ideで開く
2. ```Project->Configuration->Place&Route->Dual-Purpose Pin```の```Use MSPI as regular IO```にチェック
2. 左側下部にあるバーからProcessタブに移動して```Place & Route```を右クリック、表示される```Clean & Return All```をクリックして実行
6. teratermを起動
6. シリアルを選択して設定から115200を選択し通信開始
2. 適当なCOMポートを指定して以下のコマンドを```TangNano-9K-example\picotiny```で実行
```
python .\sw\pico-programmer.py .\example-fw-flash.v COM??
```
8. tang nano 9kのリセットボタンS1を押して離す
```
Read program with 11760 bytes
  - Waiting for reset -
    ...
```
この表示が出たら成功です。
```
Total sectors 3
Total pages 46
Flashing 1 / 3
Flashing 2 / 3
Flashing 3 / 3

Flashing completed
```
8. teratermに```Command>```やメニューが表示される

以上が公式チュートリアルの内容でした。これをもとにメニューの中身を書き換えます。

# 2. 独自のコマンドの追加
先ほどのexample-fw-flash.vに相当するものを自作します。fwディレクトリ内のcファイルを編集してクロスコンパイルします。
1. (例)全部のledを一度に点灯させるコマンドを作成します。以下のようにcaseを1つだけfw/fw-flash/firmware.cに追加しました。
```c
case '7':
                GPIO0->OUT ^= 0x0000003f;
                break;
```
1. xpack-riscv-none-embed-gcc-8.2.0-3.1-linux-x64.tgzを解凍
```tar -xvzf /mnt/c/User---/xpack-riscv-none-embed-gcc-8.2.0-3.1-linux-x64.tgz```
1. Makefile内のコンパイラの位置を修正 (ここではopt下に解凍したため以下のようになります)
```RISCV_PATH ?= /opt/xPacks/riscv-none-embed-gcc/8.2.0-3.1```
1. ```make```を実行
1. 先ほどのpythonコマンドのvファイルをfw-flash.vのパスに置き換えて実行します。そこからの操作は先ほどと変わりません。
1. teratermに表示されるメニューが先ほどから変化していたら成功です。

# 各所の画像
- (python ./sw/----で書き込んだ後に)teratermでシリアルを選択。
![スクリーンショット 2023-07-13 110122.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531876/b9b84a7d-5086-0088-2ed5-56319d8e9bc6.png)

- 設定からシリアルポートを選択
![スクリーンショット 2023-07-13 110343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531876/e796f57b-37e2-a5a4-ece9-fbf1249850e6.png)

- 115200を選択
![スクリーンショット 2023-07-13 110350.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531876/71048034-d050-0ab5-16ed-b9302e8583d8.png)

- [7]を追加してみました。
![aaaaaaaaaaaaaaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2531876/7f60dd4c-925a-9918-ddee-aa903e7b89a0.png)

すべてのledの点灯を操作できています。

https://www.youtube.com/shorts/g-JHXyl8tqQ


## 注意
- pcから取り外すと全部リセットされるので取り外した後もう一度実行したいときはgowinでplace&routeからpython ./sw/--, s1ボタンを押して離して, teratermを開く, をもう一度しないといけません。

# 参考資料
- https://spend-carefree.hatenablog.com/entry/2023/02/19/152208
  
- https://wiki.sipeed.com/hardware/en/tang/Tang-Nano-9K/examples/picorv.html
経路計画を学ぶ

ロボットの自律移動を目指して，経路計画について学ぶ．

# 経路計画とは
スタートからゴールまで向かう際に，どの経路をたどれば最もコスト（時間，距離，消費エネルギー etc...）が小さくなるかを考え，経路を選択していくこと．

特に，スタートとゴールをつなぐ直線経路上に障害物などがある際，「それらをどう迂回していけばいいか」などをロボットが考えることを**経路計画** という．

# 地図生成
経路を生成する際に，どんな環境で経路を作るかも考えなくてはいけない．その環境を表す地図の作成方法について，[ここ](https://qiita.com/Karin-Sugi/items/cb40638d9033ac5ec326)にまとめた．

# 経路計画手法について
* [迷路探索（幅/深さ優先探索）](https://qiita.com/Karin-Sugi/items/972151aa76260dceddc5)：グラフ理論における探索アルゴリズムの最もシンプルな形．コストなどの設定はなく，通れる/通れない＆移動距離だけを判断基準として，スタートからゴールまでの最短距離経路を見つける．

https://daeudaeu.com/c-breadth-depth/#i-20
* [A*アルゴリズム](https://qiita.com/Karin-Sugi/items/4e364a7263ee84575758)
    グラフ理論における探索アルゴリズムの中で，計算コストが低いながらも最適な経路を見つけられるアルゴリズム．
    **ゴールのありそうな方向に向かって探索を進めていく**ことで，探索範囲を絞り，コスパよくゴールを探してくれる．

https://stone-program.com/python/algorithm/a-star-introduction/

* RRT
djangoのUpdateViewを継承したクラスで、モデルデータを関数内で取得する

# 結論
`self.object`で取得できます。また、UpdateViewに限らず、DetailViewなどのモデルデータを取得するものであれば使えそうです。

# サンプルコード
```views.py
class RecordUpdateView(UpdateView):
    """
    ビュー：更新画面
    """
    model = Record
    # ...
    
    # テンプレートに辞書データを渡す
    def get_context_data(self, *, object_list=None, **kwargs):
        """
        表示データの設定
        """
        # recordのプライマリーキーを取得する
        # モデルデータはself.objectで取得可能
        record = self.object
        kwargs['pk'] = record.pk
        return super().get_context_data(object_list=object_list, **kwargs)

    # ...
```

# 自身が起こした勘違い
この記事を投稿する前、`self.model`で取得できると勘違いしていました。下記のようなコードです。
```views.py
class RecordUpdateView(UpdateView):
    """
    ビュー：更新画面
    """
    model = Record
    # ...
    
    # テンプレートに辞書データを渡す
    def get_context_data(self, *, object_list=None, **kwargs):
        """
        表示データの設定
        """
        # recordのプライマリーキーを取得する
        # モデルデータはself.modelで取得できると勘違い
        # <class 'django.db.models.base.ModelBase'>の型の変数になってしまい、取得したいモデルデータではない
        record = self.model
        # 意図しない値やエラーが発生する。
        kwargs['pk'] = record.pk
        return super().get_context_data(object_list=object_list, **kwargs)

    # ...
```

`self.model`だと想定と違う変数になり、結果として意図しない値やエラーが発生します。注意です。

以上です。
renderメソッドについて

# はじめに

#### <font color="red">※以下の内容には誤りが含まれる可能性があります</font>


# renderメソッドとは


renderメソッドはレンダリングする元となるファイルを指定することができるメソッドです。


renderメソッドが実行されると現在のhtmlコードが、


renderメソッドで指定したビューファイルのhtmlに上書きさ
れて表示されるイメージ。


# レンダリングとは



レンダリングとはビューファイルから最終的にhtmlにコンパイラされたものをブラウザで読み込んで表示させることを言います。


流れとしては、ビューファイル→ブラウザです。



# まとめ

- renderメソッドはレンダリングする元となるファイルを指定することができるメソッド

- レンダリングとはビューファイルから最終的にhtmlにコンパイラされたものをブラウザで読み込んで表示させること