OmniAICreator/Qiita-1.07M huggingface dataset:
一般的なアジャイル開発の学習メモ

# Ⅰ. アジャイル開発概要
１．アジャイルとは
1990年代後半から出現してきたいくつかの軽量（ライトウェイト）なソフトウェア開発プロセスの総称

２．目的
アーキテクチャや開発環境を早期的に明らかにするため

３．特徴
①. 繰り返し型の開発
・繰り返す単位となる開発期間は１週間から1ヶ月程度、イテレーション単位で逐次推進する
・要件をスートリー単位で、テスト、設計、コーディングを並行して行う
・動作するソフトウェアを作ったら、すぐ顧客に確認してもらうことで、素早いフィードバックを貰う

②. スコープの最適化
開発範囲を最適化によって、高品質、低コスト、短納期で開発できることを実現すること

③. 頻繁なリリース
自動化ツールを用いて、短期間でシステムをリリースすること

④．多用工
開発者が一人ですべての工程を担当すること

⑤. 柔軟なプロセス
状況に応じて、やり方を変化させることが可能

# Ⅱ. アジャイル的なプロジェクト管理
１．アジャイルチームのメンバーの構成
①．開発チーム
②．プロダクトオーナー
③．チームリーダー

２．チームの特徴
①．自己組織化
②．機能横断的

３．チームの人数
5～9人が適切

４．意思疎通
①．プロジェクトのビジョンの共有
プロジェクトの背景、コールをアジャイルチームと利害関係者全員で共有する

②. プロジェクトの方針の共有
マイルストーン、制約と優先順位、採用技術や技術的な解決策、リスクなど、チーム全員に共有しながら、早期対応する

５. イテレーション的な開発プロセス
①．イテレーションの期間は１週間～４週間
②．イテレーションは毎週同じ固定期間として、途中から変えない
③．イテレーションの中では、計画されたタスクの内容やメンバーの変更は行わない

６. 作成物
①．ストーリー
顧客の目線で実現したいこととその価値をシンプルに記述したもの
②．タスク
イテレーションで実施する項目
③．実行可能な成果物
イテレーション計画会議で決めたストーリーを実現する成果物

７．イベント・会議体
①. イテレーション計画会議
次のイテレーションで「どのような価値のある成果物をリリースするのか」、「それを達成するにはどうするのか」についてアジャイルチーム全員で話し合い、合意して作成計画

②. スタンドアップミーティン
イテレーションの期間、進捗や予定、問題の共有を行う日次の会議

③. イテレーションレビュー会議
イテレーションのレビュー会議は、イテレーションの最後に、開発した製品のレビューを行う場

④. 振り返り
アジャイルチームが自己組織化されたチームとなるためのきっかけとなる活動

⑤. イテレーションの振り返り
イテレーションが終わって次のイテレーション計画が始まるまでの間に、行う振り返り

８．計画の方法
①．ストーリーの洗い出しと優先順位付け
②．プロジェクト全体計画を作る
③. イテレーション計画を作る

９. 見積の方法
①．各ストーリーの数値化
・ストーリー同士の重みづけの比較
・ストーリーの優先順位づけ
・プロジェクト全体計画時の実施可能範囲の算出（ストーリー自体の追加・削除を含む）
・付与したストーリーポイントには、ストーリーを実現するために必要なすべての作業がふくまれていること

②．ストーリーポイントの付与
・チーム全体で行う
・ストーリーを実現するのに必要な作業すべてを含めてポイントを付与する
・ストーリーポイントが大きすぎ時は、ストーリーの分割を行う
・詳細の見積りはプロジェクト全体計画時に行わず、イテレーション計画でタスク分解した際に行う

１０．品質の把握
①. ストーリーの完了条件を明確にする
②. 常に状況把握を行って分析し、軌道修正する
③．様々なプラクティスを活用する
・常時結合
・リファクタリング
・ペアプログラミング

１１．必要なドキュメント
①. 設計判断の根拠を示したドキュメント
②. アーキテクチャ設計のドキュメント
③．保守・運用に必要なドキュメント

# Ⅲ. アジャイル的なチーム運営
１．目標
自律したアジャイルチームの育成
ポイント：
①. 自助努力と協力
②. 全員がチームのまとめ役
③．チーム活動の透明性
④．タイムボックスで動かす
⑤．チームとしての価値観の共有
等々

２．求めらること
①. 顧客を意識する
②. 必要な作業を全員が等しく実行する

３．必要な要件
①．人間性の尊重
②．コミュニケーション
③．自律と協調
④．チームの規約
⑤．チームの振り返り

# Ⅳ. アジャイル開発の主な手法
１. ペアプログラミング
２. リファクタリング
３. 常時結合
４. テスト駆動開発

※説明は割愛する

# Ⅴ．参考文献
アジャイル検定公式テキスト｜アジャイルソフトウエア開発技術者検定試験コンソーシアム
式の値(対称式)「21年 静岡文芸大 デザイン 1(1)」をwolframalphaとsympy でやってみたい。

オリジナル
a ^(1/ 3)+ a^( −1/ 3) = √ 6 

https://kamelink.com/blog/2022/05/30/2-1-21-sizuokabunngeidai-dezain-1-1


対称式を使っていません。
# wolframalpaでできませんでした。
https://www.wolframalpha.com/input?i=a+%5E%281%2F+3%29%2B+a%5E%28+%E2%88%921%2F+3%29+%3D+%E2%88%9A+6+&lang=ja

# sympyで方程式を解いてもらいました。

https://live.sympy.org/

```python
from sympy import *
ans=solve(x**(Rational(1,3))+x**(Rational(-1,3))-sqrt(Rational(6,1)),x)[0]
print(simplify(ans**Rational(2,3)+ans**Rational(-2,3)))
print(simplify(ans               +ans**        (-1)  ))
```

答え
(i ) 4
(ii) 3*sqrt(6)
これからの"自律した"エンジニアに求められる行動原則

部内のLT会で発表した内容を整理します。
基本的には以下参考ページの紹介という意味合いが強いです。


## 参考
- 「The 12 Principles of Project Management」; https://rebelsguidetopm.com/the-12-principles-of-project-management/
- 「界隈がざわつくほど超進化したPMBOK第7版の解説【プロジェクトマネジメント】」; https://note.com/miz_kushida/n/n103a7da460c5
- 「アジャイル屋のためのPMBOKガイド7版解説.pdf」; https://agilitymatters.jp/article/pmbok_commentary


# 初めに
ITとビジネスが密接に影響しあう今日，  
エンジニアには土台となる技術に加えビジネスパートナーとしての能力が期待されています。  
そんな中で，数値では測りづらい汎用的なソフトスキルの価値が以前よりも高まっているように感じます。

PMBOK[^1]に記載されているプロジェクトマネジメントの12原則が，  
そのまま"自律した"エンジニアに求められる行動原則と当てはまる気がしたので今回紹介します。  
[^1]: プロジェクトマネジメントの指針や手法をまとめた参考書

これらは一人で全てをカバーできなくても組織としてカバーできていればという指針でもあります。


# プロジェクトマネジメントの12原則
## Stewardship  
勤勉で敬意を払い思いやりのあるスチュワードであること  
※スチュワードは掘り下げると「組織内外の責任に対して誠実な対応と意思決定を行うこと」を意味します。
##### 取り組みの一例
- HRT[^2]を意識した言動と行動を実践する
[^2]: 健全な対話の土台となる心理的要素。謙虚(Humility), 尊敬(Respect), 信頼(Trust)
- 組織のミッションとプライオリティを理解する

## Team  
協力的なプロジェクトチームの環境を作る
##### 取り組みの一例
- 組織の心理的安全性を担保する
- 相互レビューやペアプロの制度を取り入れる

## Stakeholders  
ステークホルダーと効果的に連携する
##### 取り組みの一例
- 定例や振り返りなどにステークホルダーを巻き込む

## Value  
価値を重視する
##### 取り組みの一例
- 自分が開発しているものの目的を理解する
- 求められる利益を達成できるアウトプットか精査した上で行動する

## Systems thinking  
システムの相互作用について認識・評価・対応する  
組織がどう機能しているか理解し，構成要素が最適に動作するよう働きかける

## Leadership  
リーダーシップを発揮する

## Tailoring  
状況に応じて調整する  
※調整するためにはルールや原則の背景や目的を知ることが必要です
##### 取り組みの一例
- 例えば，純粋なアジャイル開発ができない環境下で一部のエッセンスだけ抽出して導入する

## Quality  
プロセスと成果物に品質を組み込む
##### 取り組みの一例
- 品質基準・レビュー基準の策定
- 品質データが取得できるよう環境を整備する

## Complexity  
複雑さに対応する  
※まず複雑さを認識し，その中でどのように働き，どのように回避するかを確立する必要があります
##### 取り組みの一例
- カオスエンジニアリングを実践してみる

## Risk  
リスクへの対応を最適化する  
※リスクは予期せぬ出来事であり，ネガティブなものだけなくポジティブなものも一応あり得ます。
##### 取り組みの一例
- リスクが発生した際に問題が起こらないような環境を整備しておく(上の話にも近いですね…)

## Adaptability and resilience  
適応力とレジリエンス(回復性)を高める。  
※プロダクトだけでなく組織の風土にも当てはまります
##### 取り組みの一例
- プロダクトであれば，マイクロサービス化を検討する
- 組織であれば，オンボーディング・オフボーディングの充実化などを図る

## Change  
想定される未来の状態を達成するために変化できる
##### 取り組みの一例
- 保守性を意識した設計と実装を実践する
- マイルストーンを設けて，タイミングごとに方針転換できるようスケジューリングする

# 終わりに
それぞれの原則に対して自分がどのように行動しているかを考え，より良い姿になるためにはどうすれば良いかを実践していきたいです。
Oculus Quest 2 のパススルー

## PassThorough　がしたかったんだ...

# 目的
3Dモデルの背景にパススルーを使いたい！

## やり方

1. OVRCameraRigの設定
1. OVR Passthrough Layerの設定
1. CenterEyeAnchorの設定

## OVRCameraRigの設定

### General Tab

* Passthrough Capability Ebale = true;
* enableMixedReality = true;
* Enable Passthrough = true;

### Experimental Tab

* Experimental Features Enable = true;

![スクリーンショット 2022-05-30 194031.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/e5ae6779-5810-281e-b6bc-bb6aec9cb570.jpeg)


![スクリーンショット 2022-05-30 194114.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/f673307c-af86-7ac6-22d4-1d50b29784b3.jpeg)

## OVR Passthrough Layerの設定

* Placement = UnderLay;
* Composition Depth = 1;

![スクリーンショット 2022-05-30 194409.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/1a37cbe7-b711-faa4-9f0b-40d8e2eed5e5.jpeg)

## CenterEyeAnchorの設定

* Clear Flags = Solid Color
* Background = (0, 0, 0, 0)

![スクリーンショット 2022-05-30 194243.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1353403/cde81b78-3139-37a3-cdb9-c7c2b703bb08.jpeg)
Python3: QRCode の生成と読み取り

## 参考ページ

[qrcode 8.0](https://pypi.org/project/qrcode/)

## Ubuntu 24.04 で必要なライブラリーのインストール

```bash
sudo apt install python3-qrcode
sudo apt install python3-pyzbar
```

## 生成

```py:generate_qrcode.py
#! /usr/bin/python
#
#	generate_qrcode.py
#
import sys
import qrcode

text_in = sys.argv[1]
file_png = sys.argv[2]
img = qrcode.make(text_in)

print(type(img))
print(img.size)

img.save(file_png)
```

実行例

```text
$ ./generate_qrcode.py https://ekzemplaro.org out01.png
<class 'qrcode.image.pil.PilImage'>
(330, 330)
```

## 読み取り

```py:read_qrcode.py
#! /usr/bin/python
#
#	read_qrcode.py
#
import sys
from pyzbar.pyzbar import decode
from PIL import Image, ImageGrab


def qrdecode(img):
    for x in decode(img):
        print(x[0].decode("utf-8"))


if len(sys.argv) == 1:
    qrdecode(ImageGrab.grabclipboard())
else:
    for arg in sys.argv[1:]:
        qrdecode(Image.open(arg))
```

実行例

```text
$ ./read_qrcode.py out01.png
https://ekzemplaro.org
```

## 生成された　QRCode
![out01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/c852707a-37cb-b9e8-8594-9995addc4aac.png)


## スクリプトで QRCode を生成

```bash
qr https://ekzemplaro.org > out01.png
```

使ったバージョン

```text
$ qr --version
7.4.2
```
cscの作法 その176

# 概要
cscの作法、調べてみた。
datagridviewでmdbをupdateしてみた。

# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/5b25ae24-2d1e-76b8-196a-b14b595acb97.png)


# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;

class form1: Form {
	private Button button1;
	private DataGridView gd0;
	private DataTable dt;
	private OleDbConnection con;
	form1() {
		Text = "DataGridView";
		ClientSize = new Size(700, 400);
		this.button1 = new Button();
		this.button1.Location = new System.Drawing.Point(540, 60);
		this.button1.TabIndex = 0;
		this.button1.Text = "test";
		this.button1.Click += new System.EventHandler(this.button1_Click);
		this.Controls.Add(this.button1);
		this.gd0 = new DataGridView();
		this.gd0.Location = new System.Drawing.Point(30, 30);
		this.gd0.Size = new Size(500, 370);
		this.Controls.Add(this.gd0);
		con = new OleDbConnection();
		con.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;";
		con.Open();
		OleDbDataAdapter oda = new OleDbDataAdapter("SELECT * FROM sisyutu;", con);
		dt = new DataTable();
		oda.Fill(dt);
		gd0.DataSource = dt;
		//con.Close();
	}
	private void button1_Click(object sender, System.EventArgs e) {
		foreach (DataRow row in dt.Rows)
		{
			if (row.RowState == DataRowState.Modified)
			{
				Console.WriteLine(String.Format("sID:{0},RowState={1}", row["sID"], row.RowState));
				string d = String.Format("{0}", row["年月日"]);
				string sSQL = "UPDATE sisyutu SET 年月日=#" + d.Substring(0, 10) + "#, 項目='" + row["項目"] + "', 金額=" + row["金額"] + ", 備考='" + row["備考"] + "' WHERE sID=" + row["sID"];
				OleDbCommand cmd = new OleDbCommand(sSQL, con);
				Console.WriteLine(sSQL);
				cmd.ExecuteNonQuery();
			}
		}
		Console.WriteLine("ok");
	}
	[STAThread]
	public static void Main() {
		Application.Run(new form1());
	}
}


```

以上。
Specification of Key Manager, No.907, AUTOSAR R21-11(271) CP

Specification of Key Manager, No.907, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_SWS_KeyManager.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11, 200文書読んだ。2022年5月に全部到達。

https://qiita.com/kaizen_nagoya/items/4043e8414f850ce266a4

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|KeyM| Key Manager
|PKI |Public Key Infrastructure
|CSR |Certificate Signing Request
|CSM |Crypto Service Manager
|CRL| Certificate Revocation List
|CA| Certificate Authority
|OID |Object Identifier. A byte array that identifies a certificate element or group or list of certificate elements.
## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

[1] AUTOSAR Layered Software Architecture
AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf
[2] AUTOSAR General Requirements on Basic Software Modules
AUTOSAR_SRS_BSWGeneral.pdf
[3] AUTOSAR General Specification for Basic Software Modules
AUTOSAR_SWS_BSWGeneral.pdf
[4] AUTOSAR Specification of Crypto Service Manager
AUTOSAR_SWS_CryptoServiceManager.pdf
[5] AUTOSAR Requirements on Crypto Stack
AUTOSAR_SRS_CryptoStack.pdf
[6] AUTOSAR Requirements on Intrusion Detection System
AUTOSAR_RS_IntrusionDetectionSystem.pdf
[7] IEC 7498-1 The Basic Model, IEC Norm, 1994
[8] IETF 5280 Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
[9] SHE – Secure Hardware Extension, Functional Specification, V1.1
cscの作法 その175

# 概要
cscの作法、調べてみた。
DataTableをテストしてみた。

# 参考にしたページ

https://qiita.com/yiaowang/items/d7558ee35b355255add9

# サンプルコード

```
using System;
using System.Windows.Forms;
using System.Drawing;
using System.Data.OleDb;
using System.Data;

public class grid {
static void Main(string[] args) {
	DataTable data = new DataTable();
	data.Columns.Add("ID");
	for (int i = 0; i < 3; i++)
	{
		data.Rows.Add(i);
	}
	data.AcceptChanges();
	Console.WriteLine("0--------------------");
	foreach (DataRow row in data.Rows)
	{
		Console.WriteLine(String.Format("ID:{0},RowState={1}", row["ID"], row.RowState));
	}
	DataRow add = data.NewRow();
	add["ID"] = 3;
	data.Rows.Add(add);
	DataRow mod = data.Rows[0];
	mod["ID"] = 9;
	DataRow del = data.Rows[1];
	del.Delete();
	DataRow rmv = data.Rows[2];
	data.Rows.Remove(rmv);
	Console.WriteLine("1--------------------");
	foreach (DataRow row in data.Rows)
	{
		if (row.RowState == DataRowState.Deleted)
		{
			Console.WriteLine(String.Format("ID:{0},RowState={1}", row["ID", DataRowVersion.Original], row.RowState));
		}
		else
		{
			Console.WriteLine(String.Format("ID:{0},RowState={1}", row["ID"], row.RowState));
		}
	}
	//data.AcceptChanges();
	data.RejectChanges();
	Console.WriteLine("2--------------------");
	foreach (DataRow row in data.Rows)
	{
		Console.WriteLine(String.Format("ID:{0},RowState={1}", row["ID"], row.RowState));
	}
	Console.WriteLine("ok");
}
}
```

# 結果

```
>grid
0--------------------
ID:0,RowState=Unchanged
ID:1,RowState=Unchanged
ID:2,RowState=Unchanged
1--------------------
ID:9,RowState=Modified
ID:1,RowState=Deleted
ID:3,RowState=Added
2--------------------
ID:0,RowState=Unchanged
ID:1,RowState=Unchanged
ok

>
```

以上。
S3からオブジェクトをダウンロードしようとするとKMSの権限エラー

## 概要
- 特定のIAMでS3のオブジェクトをダウンロードしようとすると以下のエラーが出る
    - **The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.**
- IAMユーザを使用できるIPアドレスを絞るためにIAMユーザのポリシーでConditionで「**aws:SourceIp**」を使っていることが原因
- Conditionに追加で**Null**の条件演算子の「**"kms:ViaService": "true"**」を指定することで解消

## 背景
以下を行った際、「The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.」というCMKに関連するエラーが発生しました。

**エラー発生時の手順**
1. CloudTrailのログを暗号化し、S3へ保存
2. S3に保存されたログをダウンロード

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109911/924f99ce-d0a3-307e-776f-fa286eb33a82.png)

権限周りの設定を入れている箇所が複数あり、原因の特定に時間を要しました。

## 原因
こいつのせいでした
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109911/4644023c-f126-314c-ee46-ab06211b4e4b.png)


## 解説
IAMへの接続元IPを制限したい場合、IAMポリシーへ以下のような「aws:SourceIp」を用いたCondition句を設定します。
```
"Effect": "Deny",
"Action": "*",
"Resource": "*",
"Condition": {
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "111.222.333.444/32",
                        "555.666.777.888/32"
                    ]
                }
            }
```
「aws:SourceIp」について、[ドキュメント](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip)を見ると、こんな記載があります。
> aws:SourceIp 条件キーをポリシーで使用して、プリンシパルが指定された IP 範囲内からのみリクエストを行うことを許可できます。ただし、AWS サービスがプリンシパルの代わりに呼び出しを行う場合、このポリシーはアクセスを拒否します。
 
分かりづらいですが、今回の場合「**IAMユーザ(プリンシパル) → KMS → S3**」という経路でアクセスがされているため、上記に引っかかってアクセス拒否されてしまうということだと思います。

# 解決策
- Condition句に「**"Null": {"kms:ViaService": "true"}**」を追加します。
```
　　　 "Effect": "Deny",
　　　 "Action": "*",
　　　 "Resource": "*",
            "Condition": {
                "Null": {
                    "kms:ViaService": "true"
                },
                "NotIpAddress": {
                    "aws:SourceIp": [
                        "111.222.333.444/32",
                        "555.666.777.888/32"
                    ]
                }
            }
```
これによって、「KMSを経由している場合、アクセスを許可」という条件が追加されます。
（DenyとNullが組み合わさっていることによって、大変分かりづらいことになってますが、、、）

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2109911/857fe3eb-808b-000d-c336-b8f556b19799.png)

# おわりに
「そんなん分からんわ！」という気持ちです。
AWSの権限周りはいつも沼にハマってます、、、
# 参考
- [AWS グローバル条件コンテキストキー  ~aws:SourceIp~](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceip)
- [aws:SourceIp キーを使用したIAM ポリシーを使う時に覚えておきたいこと](https://dev.classmethod.jp/articles/tips-iam-policy-using-aws-sourceip-ja/)
- [暗号化されたEBSボリュームを作成できずハマった話](https://dev.classmethod.jp/articles/ebs-kms-sourceip/)
動的なクラス名をつけるときに気をつけること

先日[この記事](https://qiita.com/michikun06/items/d9bbea4f62af734ba234)で動的なクラス名をつける方法を解説したが
はまりポイントがあったため、追加で書きます。
# ハマりポイント
前回の記事で解説した下記のコード、、、複数のクラス名指定ができません。
```
class=<%= "section#{question.id}" %>
```

例えばこのように
```
class=<%= "section#{question.id} btn btn-default" %>
```
書くと、```class="section1" btn btn-defaul```とレンダリングされてしまいます。


# 原因
単純なHTMLの書き方の問題です。
上記の書き方だと、レンダリングされたときに```class= section1 btn```となってしまうため、HTMLの性質上、一つしか読み込まれません。
ですので
```
class="<%= "section#{question.id} btn btn-default" %>"
```
このようにしっかり、```class="<%= ~ %>"```と書けば全てのクラス名が読み込まれます。

簡単な話ですが、案外気づきにくいポイントかなと思ったのでまとめてみました。

「viewからHTMLが作成されるときにどう解釈されるのか？どうコードに変更されるのか？」を意識すれば似たようなミスも防げるかと思います。
Atomでgit pushするときにユーザー名とパスワードが求められてもpushできないとき

[【Git】2021年8月13日からGitでリモートにアクセスができなくなった。Support for password authentication was removed on August 13, 2021.](https://ios-docs.dev/20210813support-for-password/)

> Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
remote: Please see https://github.blog/2020-12-15-token-authentication-requirements-for-git-operations/ for more information.
fatal: unable to access '/': The requested URL returned error: 403

こういったエラー文が出てgit pushできなかったのですが、
紐解いていったらなんてことなかったので、
書き留めておきます。

簡単に言うと、
*ユーザーIDとパスワードじゃあログインさせないからトークン使え*
ってことなんですが、トークンに切り替える方法が書かれてませんでした。
てっきりAtomのgit使うときのトークンかと思ったら違ってました。

[【Git】push時に毎回パスワードを求められる - Qiita](https://qiita.com/suzu12/items/9b77f0302dcb98e71234)

```
$ git remote set-url origin git@*******
```
この方法でまずSSH通信に切り替えました。

[GitHub アカウントへの新しい SSH キーの追加 - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/adding-a-new-ssh-key-to-your-github-account)
[SSH 接続をテストする - GitHub Docs](https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/testing-your-ssh-connection)
あと新しいPCだったので上記のリンクの手順でSSHキーを作成、アカウントに追加。
```
$ ssh-keygen -t ed25519 -C "your_email@example.com"
$ cat ~/.ssh/id_ed25519.pub
```

あとはこれをコピペしてGithubのアカウントに追加すれば完了です。
よき開発ライフを。
Flask でプロットしようとして、Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'NSWindow drag regions should only be invalidated on the Main Thread!となったときの回避方法

## 概要

**flask + pandas**

を使っていて、
flask のエンドポイントの中でプロットをしてそれを保存したいだけだったのですが、

```
Terminating app due to uncaught exception 
'NSInternalInconsistencyException', 
reason: 'NSWindow drag regions should only be invalidated on the Main Thread!
```

となって落ちたときの備忘録を書きます。


## TLDR

https://github.com/matplotlib/matplotlib/issues/14304/#issuecomment-545717061

ここを見るだけでした。


flask のメイン関数を書いている python ファイルに、

```python
import matplotlib
matplotlib.use('agg')
```

を追記するだけでした。


## 1分でできる再現方法

```test.py
from flask import Flask, request
import numpy as np
import pandas as pd

app = Flask(__name__)


@app.route('/')
def index():
    tmp = (np.random.rand(100)*100).tolist()
    tmp2 = map(int, tmp)
    df = pd.DataFrame(tmp2, columns=["age"])
    df.plot.hist(bins=5).figure.savefig('static/tmp.png')

    return "hello, world"


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8000)
```

を

```bash
python test.py
```

で立ち上げた後、

```bash
curl localhost:8000
```

をすると、私の環境で（MacOS）

```bash
Terminating app due to uncaught exception 
'NSInternalInconsistencyException', 
reason: 'NSWindow drag regions should only be invalidated on the Main Thread!
```


となりました。



## 解決策

```test.py
from flask import Flask, request
import numpy as np
import pandas as pd
import matplotlib
matplotlib.use('agg')

app = Flask(__name__)

@app.route('/')
def index():
    tmp = (np.random.rand(100)*100).tolist()
    tmp2 = map(int, tmp)
    df = pd.DataFrame(tmp2, columns=["age"])
    df.plot.hist(bins=5).figure.savefig('static/tmp.png')

    return "hello, world"


if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8000)
```


として、

```python
import matplotlib
matplotlib.use('agg')
```

を追記してください。



## まとめ

Mac環境でこのエラーとなった時は試してみてください。

今回はこの辺で。

@kenmaro
様々なSQL構文まとめ【DISTINCT,UNION,四則演算】

### 特定のユニークな値の抽出
例えばこのようなデータがあったとします。
```
商品名	数量
テレビ	10
テレビ	10
洗濯機	7
```
このデータはテレビの行が二つあることが分かります。
データを抽出する中で、重複を無くして表示させたい場面があったとします。その場合、
`DISTINCT句`を使うことによってuniqueな値(重複がない)を抽出できます。
それでは下記のデータでコードを書いていきます。
![1559566590613777.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/dcca0f03-250b-f588-be3b-b3555b023074.png)

``` SELECT DISTINCT `部署` FROM `従業員リスト` ```

```
('部署',)
[('営業一課',), ('営業二課',), ('開発一課',), ('開発二課',)]
```
無事にユニークな値を抽出できました。

### 複数の検索結果を結合させる

このようなデータがあったとします。
![1559568899101299.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/757ac04e-41a1-007e-ab2d-fb32aa9b3461.png)
![1559568922939635.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/8d5a7e51-b780-d24b-197b-d9c9961ae378.png)

それぞれのデータにはある大学への志望者リストがあります。
ＡとＢの大学の志願者を一緒に抽出させたい場合は、`UNION句`を用います。

では、実際にコードを書いていきます。
```
SELECT `名前` FROM `A大学志望者` UNION SELECT `名前` FROM `B大学志望者`
```
```
('名前',)
[('鈴木太郎',), ('愛出美二郎',), ('八木沢晃',), ('山田太郎',), ('千駄木千代',)]
```
`UNION`の左右にそれぞれコードが記載されています。
それぞれの検索結果が、一つにまとまって表示されます。この場合、データに重複があった場合、`DISTINCT`のように重複が削除されます。
重複をなくしたい場合は、`UNION ALL`とすることで、重複をなくすことができます。

### 四則演算

今度はこのようなデータを活用していきます。
![1550764633217337.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526914/abb2ebee-fe12-0cac-3b91-c389bd4ea93f.png)

SQLでは、四則演算を行うことも簡単にできます。
例えばこのようなコードを書いていきます
```SQL
SELECT `名前`, `国語` - (`国語` + `数学` + `英語` )/3 AS `差分` FROM `成績`
```
これは、なにを表示しているかというと
「～さんの３教科の平均と国語の成績がどれくらい差があるか」を見ています。
ASを用いて、出力される名前を自由にすることが出来ます。

このように、カラムを選択させることで四則演算をさせることが出来ます。
出力結果は下記の通りとなります。

```
('名前', '差分')
[('太郎', Decimal('14.6667')), ('二郎', Decimal('10.0000')), ('三郎', Decimal('-29.3333'))]
```
Windowsで「管理者として実行する」してないプロセス内からシンボリックリンクを作成させる

Windowsでは `mklink` でシンボリックリンクを作成するのに権限を求められる。
長年謎だった、権限のない外部コマンド内からシンボリックリンクを作成する方法が分かったので共有。
（権限を得るために一回閉じて「管理者として実行する」で立ち上げ直さなければいけないと思っていたがそうする必要がなくなった。）

```bat
powershell -command start-process cmd.exe '/c mklink "<TO>" "<FROM>"' -verb runas
```
上記の`<TO>` がリンク作成先、`<FROM>` がリンク元ファイル（適度読み替えてください）。
*nix 系の `ln` や `mv` と引数の位置が逆だから気を付けて。

引数を最後に持ってきたい場合は `-argumentlist` を使う
```bat
powershell -command start-process cmd.exe -verb runas -argumentlist '/c mklink "<TO>" "<FROM>"'
```

- 「このアプリがデバイスに変更を加えることを許可しますか」というユーザアカウント制御が現れるので対話用。
- 細かい理屈は分からないが powershell が UAC の権限を昇格しているらしい（`-verb runas` のところが`start-process` の権限を昇格）。
- `runas /user:administrator mklink` とやる手法は Windows Vista 以降はadministratorが無効化されているしやるのに設定を変更しなければいけないらしくてお手軽（実用的）とは言い難い。

---
参考：
- Powershell の Start-Process （エイリアスstart）の公式説明：[Start\-Process \(Microsoft\.PowerShell\.Management\) \- PowerShell \| Microsoft Docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process?view=powershell-7.2)
- [Windows10でプログラムを管理者として実行するコマンド](https://n-archives.net/articles/windows/run-as-admninistrator-command/)
- [コマンドプロンプトを『管理者権限』で実行する 8つの方法 \| SQLの窓](https://winofsql.jp/lightbox/command-admin-20211104-964.html)
- [バッチでシンボリックリンクを自動生成する](https://took.jp/post-461/)
- [コマンドプロンプトから管理者権限のコマンドプロンプトに切り替える \- Qiita](https://qiita.com/octopath9/items/4b7fe797ae1155c69dd9)
npm install実行時、エラーが発生した場合の対処法

# はじめに
　2022年5月下旬に開発環境の構築をするにあたり、npm installをした際にエラーが発生したので、対処方法を以下に記載します。

# エラー内容
　以下の赤枠が、npm installをした際に発生したエラーです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/a2a4f0a9-c0d8-d916-6e37-074ad993049b.png)

調査を行ったところ、SAP for Meに以下の内容が記載されていました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/6b847ddd-8c52-dca6-de60-3c8b2d5fc70c.png)

→https&#58;//npm.sap.com のSAP NPMレジストリの内容が、
https&#58;//registry.npmjs.org のNPMレジストリに移行されたことにより、発生したエラーのようです。

# 対処方法
以下のコマンドを実行してください。
### コマンド
```
$ npm install @sap/ui5-builder-webide-extension
```

エラーが発生していなければ、再度以下のコマンドを実行してください。
```
$ npm install
```

### 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/3e221cba-b9af-6608-a1e1-e728629f715f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1855659/30333473-0ab2-dc25-a6fa-101b313eee7e.png)

無事、npm installができました。

# まとめ
上記の@sap/ui5-builder-webide-extensionに関するエラーだけでなく、
@sap/html5-app-deployer、@sap/node-jwtに関するエラーも発生しました。

その場合も同様に対処したらエラーが解消されると思います。
（私の場合は解消しました。）

似たようなエラーが発生した場合、こちらを参考にしていただければ幸いです。

# 参考資料
[SAP for Me (https://me.sap.com/notes/0003046586)](https://me.sap.com/notes/0003046586 "SAP for Me")
flask で画像ファイルをstatic から読み込むときにキャッシュを使わない方法

## 概要

@kenmaro 
です。

備忘録となります。

### やりたいこと

- flask 側でそのimgをユーザのPOSTなどに応じて毎回作り替えている
- flaskはできたimgをstatic フォルダに格納する
- html 側でstatic に保存された画像に対して、img タグを使って画像をレンダリングしている

という状況で、ブラウザ上で確認すると、
static/
以下の画像は毎回更新されているにもかかわらず、
ブラウザ上では画像が更新されなかったので、あれ？となりました。

キャッシュを使わないような設定にすることで、毎回画像をstatic フォルダからレンダリングしてもらうことで解決しようとした、
というだけの記事です。



## TLDR

```
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0
```

をつければいけました。


## 3分でできる再現の仕方

flask を使ういつものフォルダ構成をします。

```
test.py
static
templates/first.html
         /second.html
```


```test.py
from flask import Flask, render_template, request
import numpy as np
import pandas as pd
import os
import matplotlib
import time
matplotlib.use('agg')

app = Flask(__name__)
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0

from flask import url_for


@app.route('/', methods=["GET", "POST"])
def index():
    if request.method == "GET":
        return render_template("first.html")
    else:
        num = int(request.form["num"])
        tmp = (np.random.rand(num)*100).tolist()
        tmp2 = map(int, tmp)
        df = pd.DataFrame(tmp2, columns=["age"])
        df.plot.hist(bins=5).figure.savefig('static/tmp.png')

        print(os.getcwd())
        print(df.head)
        return render_template("second.html")



if __name__ == '__main__':
    app.debug = True
    app.run(host='0.0.0.0', port=8000)
```


```templates/first.html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    this is the main page
    
    <form action="/" method="post">
        <div>
            <label for="name">number</label>
            <input type="number" id="num" name="num">
        </div>
        <input type="submit" value="send">
    </form>
    </body>
</html>
```

```templates/second.html
<!DOCTYPE html>
<html>
    <head>
        <link rel="stylesheet" href="{{ url_for('static', filename='style.css') }}" type="text/css">
      </head>
    <body>
    this is the main page
    <img src="static/tmp.png" alt="">

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


## まとめ
とりあえずキャッシュ使いたくない時はいいかもしれません。


今回はこの辺で。



@kenmaro
Explanation of Interrupt Handling within AUTOSAR, No.307, AUTOSAR R21-11(267) CP

Explanation of Interrupt Handling within AUTOSAR, No.307, 2021-11

https://www.autosar.org/fileadmin/standards/classic/21-11/AUTOSAR_EXP_InterruptHandlingExplanation.pdf

AUTOSAR R21-11記事一覧はこちら。

AUTOSAR 21-11,160文書読んだ。2022年5月中に全部読み。

https://qiita.com/kaizen_nagoya/items/9935c9e58bf82e1e63d2

AUTOSAR 21-11, 62文書読んだ。2022年5月中に半分到達予定。

https://qiita.com/kaizen_nagoya/items/648b32867635993410c8

AUTOSAR R21-11(0) 仕様ダウンロード一覧。単語帳。参考文献資料作成

https://qiita.com/kaizen_nagoya/items/9b3a1b9b8d1e8d7e288e

# 用語(terms)
|Term|Description|
|:--|:--|
|ISR |Interrupt Service Routine. Also used as a macro to declare in C a cat2
interrupt service routine.
|RETI |Return from Interrupt
|GCE| Generic Configuration Editor
|Cat2 |Category 2. Cat2 ISRs are supported by the OS and can make OS calls.
|Cat1| Category 1. Cat1 interrupts are not supported by the OS and are only allowed to make a very small selection of OS calls to enable and disable all interrupts.
|Interrupt Handler|In the case of a Cat2 interrupts, the ISR is synonymous with Interrupt Handler. In the case of Cat1 interrupt the Interrupt handler is the function called by the hardware interrupt vector. In both cases the Interrupt handler is the user code that is normally a part of the BSW module. So we consider the Interrupt Handler to be a user level piece of code. However, in the case of Cat2 interrupts are initially handled in the OS’s interrupt handler before the user’s interrupt handler is called.
|Interrupt Logic| This is the MCU logic that controls all interrupts for all devices. This is normally controlled by the OS.
|Device |A hardware I/O device that, for the purposes of this document, can also cause interrupts.
|Device Interrupt Enable Bit|This is the bit/bits within one hardware device, that is controlled by the device driver, to enable/disable the interrupt source for that device only.
|Interrupt Frame|An interrupt frame is the code which is generated by the compiler, or the assembler code, for prefix and postfix of interrupt routines. This code is microcontroller specific 
|Definition Ref| A reference from one part of the XML to another. In particular, the XML for a BSW module may refer to another BSW module’s XML for certain information. This prevents the same information appearing in multiple places in the XML.
|Code Generator| A BSW module is delivered in two parts: code and a Code Generator. The Code Generator consumes complete and correctly formed XML for the BSW module and generates code and data that configures the module.

## 英日
日本語は仮訳

T.B.D.

# 参考(reference)

no ref.


Glossary も　参考に入れましょう。
https://www.autosar.org/fileadmin/standards/foundation/22-11/AUTOSAR_TR_Glossary.pdf
Power Automateの「ファイルの作成（SharePoint）」アクティビティでファイルを上書きする

# はじめに

Power Automateで 「ファイルの作成（SharePoint）」アクティビティを使ったところ、
同名ファイルがあると上書きに失敗しました。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/d8bdebd8-c03a-8eca-68e7-b820ee266b13.png)
> [SharePoint \- Connectors \| Microsoft Docs](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#ファイルのコピー)

SharePointのほかのアクティビティ（ファイルのコピーなど）は
同名のファイルが存在するときのオプションが用意されているのに、
「ファイルの作成」では用意されていないようでした。

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/25f9b842-ce88-17ab-489d-3bf3723d23ce.png)
> [SharePoint \- Connectors \| Microsoft Docs](https://docs.microsoft.com/ja-jp/connectors/sharepointonline/#%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90)

# 解決策

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1022607/e176333d-f994-9c4a-ef42-105f5118136a.png)

「ファイルの作成」の３点ボタンの「設定」で `チャンクの許可` をオフにしておきます。

こちらのサイトにこの解決策が紹介されていました。

> [How to overwrite files using the create file action in Power Automate – SharePoint Stuff](https://sharepointstuff.com/2022/04/20/overwrite-files-using-create-file-action/)

# チャンクとは

`チャンクの許可` をオフにすればOKと分かりましたが、オフにすることによる影響がないか調べてみます

> コネクタは、30 MB のメッセージを大きいサイズのメッセージとみなす場合がありますが、Logic Apps では、これは大きいサイズのメッセージではありません。 このコネクタの制限を守るために、Logic Apps は、30 MB を超えるメッセージ を小さいチャンクに分割します。
> [チャンクを使用してワークフロー内の大きいサイズのメッセージを処理する \- Azure Logic Apps \| Microsoft Docs](https://docs.microsoft.com/ja-jp/azure/logic-apps/logic-apps-handle-large-messages)

Logic Appsのドキュメントになりますが、大きいメッセージの要求を分割した小さな要求にすることをチャンクと呼ぶそうです。
また、「大きいメッセージ」とは具体的に30MG程度のことを指すようです。

今回は30MBを超えるファイルをアップロードするわけではなかったので、このまま `チャンクの許可` をオフでPower Automateの処理を行いたいと思います。
Google Drive をwebサーバとして活用する方法

こんにちは！E-kan株式会社の岡田です。

作ったwebページを手っ取り早く公開して表示確認する手立てはないかと探していたら、丁度良い方法を見つけたのでメモ。

Google Driveがwebサーバとして使えるとは思いませんでした。
機能するのはhtml、css、JavaScriptなどのいわゆる静的ファイルのみでphpなどの動的仕組みは動きませんが、手軽に利用出来るのは非常な利点。

## Google Drive側の手順

まずはGoogle Drive内に、公開したいファイルを入れます。
※今回はわかりやすくフォルダ名を「mypage」にしてます。

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/00322a68-c012-ee01-d5f9-c7221842efb9.png">

入れたフォルダを右クリックして「リンクを取得」を選択。

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/cf2af1ce-961e-103e-0ab2-a5fa13935045.png">

リンクメニュー下部を「リンクを知っている全員」に設定。
これでGoogle Drive側でやることは終了。

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/c3ad6fe4-e33b-553e-eca0-4b2ebd2c2103.png">

## サイトURLの取得

続いて、サイトURLを取得します。
まずは下記URLにアクセス。

https://www.drv.tw/

こんなページが表示されるので、「Host on Google Drive」をクリック。

<img width="60%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/50a4e2f3-61fb-0499-d333-589b51f3ebc9.png">

アカウントのリクエストが表示される場合は、右下の「許可」をクリック。

<img width="60%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/2565f0c2-a013-89cb-8ab0-79904cd35ca8.png">

すると、こんなページにたどり着きます。
この「Your web Pages」に記載されているものが、先程Google Driveに格納したサイトのURLになります。

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/f311285e-e439-a65c-c774-9cafb1958315.png">

URL部分を試しにクリックすると…

<img width="70%" alt="" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/7700f7bb-5147-ba99-a5fb-570f2c2f6574.png">

サイトディレクトリに入れたindex.htmlの中身が表示されました。

ページを修正したい場合はGoogle Drive内のファイルを更新すればOK。
ftpツールも使わずに手軽にwebページが公開出来ます。

マイドライブ内にディレクトリを追加してリンク制限を「リンクを知っている全員」に設定すれば、複数サイトを公開することも可能です。

いやー、めっちゃ便利。
【Blue Prism】グローバルマウスクリックを行う際、「ダブルクリック」を行う方法

## はじめに
Blue Prismでダブルクリックを行う方法を紹介します。

## 前提

### バージョン
Blue Prism v6.8.1

## 操作ステージの設定
Blue Prismでクリックを行う場合、グローバルマウスクリックを使用します。
この時に操作ステージの設定を少し変更するとダブルクリックができるようになります。
ブラウザモードとWin32モードで該当するアクションが存在するので、順番に説明します。

### ブラウザモード
「ダブルクリック」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637459/2d68f188-6a46-ba62-28ff-9413d904d7eb.png)
余談ですが、ブラウザモードでクリックするアクションを作成する場合、先にフォーカスを入れ、1秒程度の一時停止を入れると動作が安定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637459/7c7df7d0-30d3-3b51-bbce-a60243f0b14a.png)

### Win32モード
「グローバルダブルマウスクリック」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/637459/667bb25b-0c23-4079-af6c-9f7e67df700c.png)
入力のXとYには座標を入力し、マウスボタンはクリックを行うボタンを指定します。
Xは横方向で、0が左端となり、値を大きくする毎に右に移動します。
Yは縦方向で、0が上端となり、値を大きくする毎に下に移動します。
マウスボタンは左クリックをしたい場合"left"、右クリックしたい場合は"right"を入力します。
また、マウスボタンのパラメータが空白の場合は左クリックを行います。

### その他のモードについて
上記以外のモード（UIA、AA、領域モードなど）ではダブルクリックのアクションは存在しないようでした。（2022年6月現在）
ダブルクリックを行う場合はWin32モードかブラウザモードを使用するようにして下さい。

## まとめ
今回はダブルクリックの仕方について説明しました。
モード毎に名称が異なっており、今回紹介したは以下の2つです。
* ブラウザモード→ダブルクリックを選択
* Win32モード→グローバルダブルマウスクリックを選択し、クリックするボタンと座標を入力
turn server install & 動作確認メモ

turn server ( coturn ) の install & 動作確認メモ（備忘録）

## install

on Ubuntu 18.04

```
$ sudo apt-get update
$ sudo apt-get install coturn
```

`Coturn-4.5.0.7` will be installed by steps written above. Uncomment `/etc/default/coturn`

```/etc/default/coturn
TURNSERVER_ENABLED=1
```

then,

```
$ sudo systemctl restart coturn
```

## config

```/etc/turnserver.conf
listening-port=LISTENING_PORT
tls-listening-port=TLS_LISTENING_PORT
external-ip=PUBLIC_IP_ADDR/INTERNAL_IP_ADDR

fingerprint
lt-cred-mech

server-name=example.com
realm=example.com

# user password

user=guest:somepassword

total-quota=100
stale-nonce=600

# Path to SSL certification and private

cert=/etc/letsencrypt/live/example.com/cert.pem
pkey=/etc/letsencrypt/live/example.com/privkey.pem

# Specify the allowed OpenSSL cipher list for TLS/DTLS connections
cipher-list="ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384"
```

## test

* turnutils_uclient

```
# udp test
$ turnutils_uclient SERVER_NAME -p PORT_NUMBER -u guest -w somepassword -y
# tcp test
$ turnutils_uclient -t SERVER_NAME -p PORT_NUMBER -u guest -w somepassword -y
```

* test site

  - [Trickle ICE test](https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/)
  - IceTest.info](https://icetest.info/)

## tips

how to obtain public IP of turn server.

```
$ curl -4 https://icanhazip.com 2>/dev/null
```

## references

* https://ourcodeworld.com/articles/read/1175/how-to-create-and-configure-your-own-stun-turn-server-with-coturn-in-ubuntu-18-04
* https://github.com/instrumentisto/coturn-docker-image/blob/master/rootfs/usr/local/bin/detect-external-ip.sh
LambdaでWorkSpacesの情報を取得する

# 前提
* 今回取得するのはWorkSpacesのコンピュータ名とユーザ名の一覧のみ
* 結果はcsvファイルに保存
* Lambda Python3.9で実行

# 処理
```
    response = client.describe_workspaces()
    ALL_INFO = response['Workspaces']
    file = "/tmp/LIST.csv"

    with open(file, "w", newline='',encoding="utf-8") as f:
        writer = csv.writer(f)
        for INFO in ALL_INFO:
            COMPUTERNAME = INFO["ComputerName"]
            USER_NAME = INFO["UserName"]
            REQUIRED_INFORMATION = []
            REQUIRED_INFORMATION.append(COMPUTERNAME)
            REQUIRED_INFORMATION.append(USER_NAME)
            writer.writerow(REQUIRED_INFORMATION)
    while 'NextToken' in response:
        with open(file, "a", newline='',encoding="utf-8") as f:
            writer = csv.writer(f)
            response = client.describe_workspaces(NextToken=response['NextToken'])
            ALL_INFO = response['Workspaces']
            for INFO in ALL_INFO:
                COMPUTERNAME = INFO["ComputerName"]
                USER_NAME = INFO["UserName"]
                REQUIRED_INFORMATION = []
                REQUIRED_INFORMATION.append(COMPUTERNAME)
                REQUIRED_INFORMATION.append(USER_NAME)
                writer.writerow(REQUIRED_INFORMATION)
```

# 補足
* WorkSpacesの数が25台未満ならNextToken以降の処理は不要
[DescribeWorkspaces - Amazon WorkSpaces Service](https://docs.aws.amazon.com/workspaces/latest/api/API_DescribeWorkspaces.html)
DirectX11でフルスクリーンにする

# 古い形式
DirectXのDXGI_SWAP_CHAIN_DESCメソッドにWindowedという項目があり、
フラグをTRUEからFALSEにするとできます。
しかし、プラットフォームサポートがWindows Vista,Microsoft Windows XP SP2,および Windows Server 2003 SP1になったいます。

# 新しい形式
IDXGISwapChainにフルスクリーンに設定するSetFullscreenState関数です。
* 第一引数
フルスクリーンにするかどうか
TRUE:フルスクリーン
FALSE:ウィンドウ

* 第二引数
出力モニターを指定するために使うIDXGIOutputのポインタ

* 戻り値
HRESULT
アクションが成功すればS_OKが返されます。
_ASSERT_EXPRで成功したかどうか判定が可能です。
```FullScreen.cpp
	HRESULT hr = S_OK;
    hr = swapchain->SetFullscreenState(TRUE, output);
	_ASSERT_EXPR(SUCCEEDED(hr), HRTrace(hr));
```
(_ASSERT_EXPRは失敗すれば警告を表示するマクロです)

# 注意点
実行を終了すると終了処理でエラーになるので、フルスクリーンモードをオフに戻しましょう。
ESPNow（に限らずSTAモード）のChannel指定方法

下のイメージ。何もしないとデフォルトの1チャンネル。
同じチャンネルでしか通信できない模様。

```
#include <esp_wifi.h>// して

void setup() { //の
  WiFi.mode(WIFI_STA); // した後に
  esp_wifi_set_channel(CHANNEL, WIFI_SECOND_CHAN_NONE); // チャンネルを指定してあげる
```

APの設定とかその他あれこれは[こちら](https://www.rocher.kyoto.jp/arbr/?p=1695)に書いておいた。
【Rails】Rspecのカバレッジをプルリクのコメントで表示する

# 初めに

`OSS`などでよく見る`CI`での Rspec カバレッジをプルリクのコメントで表示するやり方を記事にしておきます。

## 環境

- Rails 6.1.4
- Ruby 2.7.4
- codecov 0.6.0
- simplecov 0.21.2

# 本編

今回は`CircleCI` `Codecov` `simplecov`を利用してカバレッジを取得していきます。

## Codecov の設定

1. まずは、[Codecov](https://about.codecov.io/sign-up/)にアクセスし、アカウントを作成してください。
2. リポジトリの設定ページにアクセスし、`Codecov Token`を取得します。

## CircleCI の設定

すでに`CircleCI`での Rspec が稼働している前提です。

1. `CircleCI`の環境変数の設定ページにアクセスする。
2. `CODECOV_TOKEN`の名前で先ほど取得したトークンを設定します。
3. orb を利用するので、`Organization Settings`の`Security`セクションにアクセスします。
4. `Orb Security Settings`のセクションから`Yes`を選択する。

## Gem の追加

カバレッジを計測するための Gem と`Codecov`のための Gem を追加する。

```ruby
group :test do
  gem 'codecov',   require: false
  gem 'simplecov', require: false
end
```

`Rspec`の設定に`simplecov`と`codecov`の設定を追加する。

```ruby:spec/rails_helper.rb
require 'spec_helper'
require 'codecov'
require 'simplecov'
SimpleCov.start 'rails'
SimpleCov.formatter = SimpleCov::Formatter::Codecov

RSpec.configure do |config|
# 以下省略
end
```

## CircleCI の設定を行う

`.circleci/config.yml`に`orbs`を追加する。

```yaml:.circleci/config.yml

version: 2.1

orbs:
  codecov: codecov/codecov@1.0.5

jobs:
  build:
    steps:
      - setup
      - checkout
      - run:
        # Rspecを稼働させる
      - store_test_results: # coverageディレクトリが消えないようにする
          path: ./coverage
      - codecov/upload: # カバレッジの結果のファイルを送信する
          file: ./coverage/codecov-result.json

```

これで`Codecov`にテストのカバレッジが表示されるようになります。
そして、`CI`が稼働してテストが成功するとプルリクにカバレッジ結果がコメントとして表示されるようになります。

# 参考

- [公式ドキュメント - CircirCI](https://circleci.com/docs/ja/2.0/code-coverage/)
- [codecov - CircleCI orbs](https://circleci.com/developer/ja/orbs/orb/codecov/codecov)
- [Quick Start - codecov](https://docs.codecov.com/docs/quick-start)
VSCode で Djangoのテストを実行する

VSCodeのテスト実行ショートカットキー（Ctrl+: A）を使って、Djangoのテスト(py manage.py tests相当）を実行するための設定

この記事では、「テストしたいDjangoプロジェクトがワークフォルダの直下ではない場所にある」場合の設定について述べる。

```本記事で対象とするフォルダ構造.
Workdirectory/ <- VSCodeで開いているフォルダのルート
  git-work-dir/
    src/ <- テストしたいDjangoプロジェクト
      django-app/
        tests.py <- 実行したいテストファイル
```

## 用意するファイル
```Workdirectory/.vscode/settings.json
{
    // "python.testing.pytestArgs": [
    //     "git-work-dir"
    // ],
    "python.testing.unittestEnabled": false,
    "python.testing.cwd": "${workspaceFolder}/git-work-dir/src",
    "python.testing.pytestEnabled": true
}
```
このファイルは、Testingタブからひな形を作れるが、なにやらうまくいかない[※](#余談2)ため、以下の点を修正する。
* python.testing.pytestArgs を削除する。
この設定自体は、テスト対象ファイルを探す場所を pytest に教えてあげるものだが、この設定によって見つかったテストは、ショートカットキー（Ctrl+: A）でテスト実行すると失敗してしまう。
* python.testing.cwd を追加する。
これにより、manage.pyのある場所とテスト対象ファイルを探す場所を pytest に教えてあげる。

```Workdirectory/pytest.ini
[pytest]
DJANGO_SETTINGS_MODULE = config.settings.develop
python_files = tests.py
```
* Djangoの設定ファイルを開発用と本番用で分けているような場合、DJANGO_SETTINGS_MODULEを指定して、テストで使う設定ファイルを教えてあげる。
* python_filesを指定して、探すファイル名を pytest に教えてあげる。python_filesはオプションらしいが、自環境ではこれがないとファイルが見つからなかった。
* このファイルは、VSCodeのルートディレクトリに置く必要がある。


## 余談
VSCodeでPythonのテストを実行する場合、unittestとpytestが選択できる。
しかし、Djangoのテストを実行するには、pytest一択であるらしい。


テスト環境構築
```
py -m pip install pytest
py -m pip install pytest-django
```

参考
[Testing python in Visual Studio Code - VSCode Doc](https://code.visualstudio.com/docs/python/testing)
[Configuring Django Settings - pytest-django Documents](https://pytest-django.readthedocs.io/en/latest/configuring_django.html)

## 余談2
発生するエラー
> Running test with arguments: --rootdir 略\Workdirectory --override-ini junit_family=xunit1 --junit-xml=C:\Users\qwerty\AppData\Local\Temp\tmp-107122i8xbc2iq5Fl.xml
Current working directory: 略\Workdirectory
Workspace directory: 略\Workdirectory
Run completed, parsing output
Error while running tests: Workdirectory
TypeError: Cannot read property 'length' of undefined
> 
> Error while running tests:
TypeError: Cannot read property 'length' of undefined
>
> Finished running tests!
オブジェクト指向

## オブジェクト指向設計
オブジェクト単位にシステムを設計する。オブジェクト同士がお互いにメッセージをやり取りしながら処理していく
### オブジェクト
<b>データ(属性)とそれを操作するメソッド(手続)を一体化したもの
### カプセル化
<b>オブジェクト内にあるデータとメソッドを、オブジェクトの外部から隠蔽すること。
また、オブジェクトの独立性を高めることができる。
オブジェクトに対して出来る手段がメッセージを送ること(メッセージパッシング)。
## クラスとインスタンス
### クラス
<b>データとメソッドを持ったオブジェクトの雛形を定義したもの。設計図のようなもの
### インスタンス
<b>クラスを基にして生成されたオブジェクト。

イメージ：たこ焼きをイメージする。出来上がった、たこ焼きがインスタンスで、その器械がクラス。
## 継承とポリモフィズム
既存のクラスから、新しいクラスを生成することができる。<b>元のクラスを<font color = blue>スーパークラス(基底クラス・親クラス)。新しく生成したクラスをサブクラス(派生クラス・子クラス)</font>という。
### 継承
<b><font color = blue>継承(インヘリタンス)</font>はスーパークラスで定義しているデータやメソッドを、サブクラスに引き継ぐこと。
### ポリモフィズム
<b>スーパークラスのメソッドを一部変えて使いときは、サブクラスに同じ名前で内容を変えて再定義する。これを<font color = blue>オーバーライド</font>という。
同一のメッセージでも、各インスタンスで特有の処理を行うことができる。<font color = blue>ポリモフィズム(多相性・多態性)</font>といわれている。
### 委譲
<b>あるオブジェクトに依頼されたメッセージの処理を、そのオブジェクトの内部から他のオブジェクトに委ねること。
## クラスの階層化
### 汎化(抽象化) - 特化
<b><font color = blue>汎化(抽象化)</font>は、下位クラスの共通部分を抽出して上位クラスを定義すること。逆を<font color = blue>特化</font>という。<br>「下位クラス is a 上位クラス」の関係
### 集約 - 分解
<b><font color = blue>集約</font>は、上位クラスが下位クラスの組合せで構成されていること。逆を<font color = blue>分解</font>という。
「集約 - 分解」には、「下位クラス is a part of 上位クラス」の関係
【自分用】Nodeパッケージの公開、更新コマンド

# 参考

- [初めてのnpm パッケージ公開 - Qiita](https://qiita.com/TsutomuNakamura/items/f943e0490d509f128ae2)
- [npm publishする時の注意点 - Qiita](https://qiita.com/__mick/items/e92e3fc001994ca9dfaf)

# 初回のみ

- ソースコード、 README.md などを更新したコミットを追加
- TODO、ビルド、CIなどの必要な準備を行う
- `npm init -y` でGitの情報を package.json に追加
- `git push`
  - 初回バージョンのソースコードをプッシュするため
  - package.json の更新をプッシュするため
- `git tag v1.0.0` で初回バージョンのタグを追加
- `git push origin tags/v1.0.0` でタグをプッシュ
- `npm publish ./` 

# 更新

- ソースコード、 README.md などを更新したコミットを追加
- TODO、ビルド、CIなどの必要な準備を行う
- `npm version patch` などでバージョンアップ、タグの追加
- `git push`
  - バージョンの更新をプッシュするため
- `git push origin tags/v1.0.1` でタグをプッシュ
- `npm publish ./` でNodeパッケージの更新を [npmjs.com](https://www.npmjs.com/) に公開
【Shopifyアプリ紹介】おすすめのベストセラー訴求Shopifyアプリ3選

# この記事について

Shopifyでストアの商品をランキング表示などでストアのベストセラー商品を訴求することができるアプリを調査したので、まとめて紹介していきます。

正直コーディングを頑張ればランキングバッジくらいは実装できるのですが、そんなの手間だよ感じられる方は参考にしてください。

# Best Sellers ‑ Insights & more

![スクリーンショット 2022-05-30 16.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/01626565-abdf-7e5a-fd11-dc762eb4d353.png)

https://apps.shopify.com/best-sellers?locale=ja

「Best Sellers ‑ Insights & more」は Burst Commerce 社が提供するShopifyアプリで、ベストセラー商品バッジ、ベストセラー商品によるコレクションの並び替え、商品タグ付けにより、ストア全体にベストセラー商品を簡単かつ自動的に表示することができます。

ベストセラーバッジやリストを使って、ショップ全体でベストセラーを宣伝する方法があります。
売上上位（または下位）の商品を訴求することができます。

![スクリーンショット 2022-05-30 16.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/a7ef8850-7ba1-aa23-40ce-b8777572cb18.png)

また、独自のベストセラー管理画面もあるため、高度なマーケティングにも使用できます。

![スクリーンショット 2022-05-30 16.55.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/0756d0f6-9a62-fcc8-3f8d-95794dc9ad78.png)

マーケティング面からストア上の表示までかなりクオリティの高いアプリになっていると思います。
デメリットを挙げると、月額料金が少々高めだということでしょうか。
$29/月~ と安くはないですが、それだけの機能が盛り込まれているアプリでもあります。

![スクリーンショット 2022-05-30 16.57.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/33674418-c210-dd39-ac9f-d302146fffa7.png)

機能が豊富なため、しっかりとストアの人気商品を訴求したいと思っている方におすすめです。

# Beast Best Sellers

![スクリーンショット 2022-05-30 17.00.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/fb9faa2d-1f91-8496-91ff-6303a61c311b.png)

https://apps.shopify.com/best-sellers-tagger?locale=ja

「Beast Best Sellers」は、Bug Shall Not Pass　社が提供するaShopifyアプリです。一定期間の販売数量に基づいてベストセラー・コレクションを設定することを支援します。

Shopify デフォルトでもコレクションをベストセラーで並べることができますが、このアプリを使うことでさらに高度な並び替えを行い、ストアの売り上げ上位商品をランキングで表示することができるようです。公式ぺーじでは以下のように説明されています。

>Shopifyでは、アイテムは注文された回数に基づいてベストセラーとみなされますが、販売数量は考慮されません。例えば、単品で5回注文されたTシャツAは、数量2で3回売れたTシャツBよりも関連性が高く、つまり5個売れたTシャツAは、6個売れたTシャツBよりも高いランクを持つことになります。つまり、5枚売れたTシャツAは6枚売れたTシャツBよりも順位が高くなります。
>
>Shopifyでは、ある一定期間のベストセラーを追跡することができません。私たちのアプリを使えば、過去3ヶ月間など一定期間に売れたアイテムでコレクションを構成したり、過去のシーズンのベストセラーの記録を残すことができ、顧客に見せたいものをより柔軟に提供することができます。

月額料金は$9.99/月~ と比較的良心的です。

![スクリーンショット 2022-05-30 17.08.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/6f59ab70-7941-9d42-0db7-3ad0e1d63db8.png)



# らくらくランキング表示アプリ｜リテリア Ranking

![スクリーンショット 2022-05-30 17.06.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/100b174d-ac37-9751-6813-a4ffa46a959a.png)

https://apps.shopify.com/ranking?locale=ja

「らくらくランキング表示アプリ｜リテリア Ranking」は、株式会社リテリアが提供するShopifyアプリです。Shopify上で作成したコレクションにランキングバッジをつけて表示することができます。
日本人としては日本製のランキングアプリであるというのがメリットになりますね。

ノーコードでデザインの拡張性が高い点がメリットのようです。OS2.0のテーマに完全対応してるため、テーマとの干渉やアプリ同士の干渉が起こらない点もありがたいです。
![スクリーンショット 2022-05-30 17.09.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939784/6cc4b451-3b67-da17-4725-cfb81b3f92eb.png)

また月額も$5.99/月~ というリーズナブルさも魅力です。
気軽にランキングを表示したいという方におすすめです。

# 終わりに

意外とランキング表示するためのアプリは調べてみて多くはないなという印象でした。
自分や顧客のストアで実現したい要件をしっかりと固めた上でベストなアプリを選択できればいいなと思いました。

最後までお読みいただきありがとうございました。
HTML,スクリプト言語、DOMとは

# CSS
CSS(Cascading Style sheets)はHTMLやXMLの体裁を表現するため記述のこと。```スタイルシート```と呼ばれている。

CSS登場前はHTMLに特定の箇所の体裁を表現していた。
しかし
見出しの部分はこの表現にするということはできなかった。

# Webサイト内の共用
CSSは必ずしもHTMLとファイルを別にしなくてもいい。HTMLに直接書くことができる。
しかし
別ファイルと共有することで統一感のあるWebサイトを作成することができる。

# クライアントごとに表示を変える
文書と体裁を分離しておくとCSSを変更するだけで体裁を変更することができる。
パソコン、スマホなどのクライアントの種類ごとにCSSを準備しておけば利用する```CSSを切り替えるだけでクライアントにあわせた体裁を表現する```ことができる。

# ブラウザの中でもこういう機能を持つものがある
自身のCSSファイルを設定することで読み込んだWebページにそのCSSを適用することができる。
それにより自分好みの体裁を表現できる。

# スクリプト言語
動的処理には```スクリプト言語```が使われています。
```サーバーサイド・スクリプト```はCGIを呼び出すためにHTMLと別々してある。
```クライアントサイド・スクリプト```はHTMLに直接書いてもいいし、別にしてもいい。

# ECMAScript
```Javascript```はMoxilla FoundationとMicrosoftがそれぞれ実装を進めていたため、ECMAインターナショナルがJavascriptを標準化```ECMAScript```を定めました。
前はクライアントサイド・スクリプトに使われていたがサーバーサイド・スクリプトで利用さている。

# Perl、Python、PHP、Ruby
サーバーサイド・スクリプトの開発には```Perl,Python,PHP,Ruby```という言語が使われている。
この言語でないと実現できないという機能の違いはないが開発者の経験やノウハウに基づいて使う言語を決めている。

# DOM(ドム, Document Object Model）
HTMLやXML文書を扱うための手法のこと。
これを使うことでプログラムからHTMLやXMLの各要素を容易に参照、制御することができる。
今のほとんどはWebページ上に仕込まれたスクリプト(クライアント・スクリプト)やWebブラウザに実装された機能などをWebページ上の内容を読み取ったり、編集することができる。

手法は
対象となる文書の各要素を抽出し、それらを```階層構造```として扱います。
最上位の賞を頂点（根）とする。
DOMにおける木構造を```DOMツリー```とも呼ばれる。
木構造の枝葉の部分は、```ノード```と呼ばれる。
枝を辿ってデータにアクセスするため木が大きいとその分```処理に時間がかかってしまう```。

# 思ったこと
DOMも直接見てみないとわからないな。
いつか触りたい。

出典 Web技術の基本(SBCreative)
Multi programming vs Multi tasking   -Overview

# はじめに
<!-- 発端や概要を記載 -->
**マルチプログラミング**と**マルチタスキング**の違いについて


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [マルチプログラミング](#Chapter1)
1. [マルチタスキング](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# Chapter1

**マルチプログラミング(Multi-programming)**：
* 割り込み作業なし(non-preemptive)
  * 複数のプログラムがRAM(メモリ)に常駐待機をし、その中から一つづつプログラムが選ばれ実行される仕組み。そのプログラムの実行が終了した後、次のプログラムがディスパッチされる。
  * 現在実行中のプログラムが入出力リソースを要求した場合は、そのプログラム実行中に、別のプログラムがCPUにディスパッチ/実行される。

* アイドル状態(idle state)が発生
　→現在のタスクが終了するまで、他のタスクは待たなければいけない。

* 最大のCPU使用率
　→コンピューターが発明された当初、ユーザーは一度に一つのバッチ(ジョブ)のみ送信できた。

<a id="#Chapter2"></a>
# Chapter2

**マルチタスキング(Multi-tasking)**：
* タイムシェアリング(time sharing)
  * 現在のタスクを、指定の時間で、無理やり取り除くことが可能。
  →例：各タスクがCPUに滞在できる時間を2秒だとする。
⇨2秒毎に各タスクをローテーションする。
⇨2秒で処理の終了するタスクが、処理に1時間要するタスクの終了を待たずに済む。

<a id="#reference"></a>
# 参考文献
- [Modern Operating Systems by Andrew S. Tanenbaum, Herbert Bos](https://www.amazon.co.jp/-/en/Andrew-Tanenbaum/dp/013359162X)