OmniAICreator/Qiita-1.07M huggingface dataset:
【データ抽出/BigQuery】実行したクエリ結果をCSVにエクスポートした方法まとめ

BigQueryで実行したクエリ結果をCSVにエクスポートした方法を、
エクスポートするCSVの容量が小さい順に下記にまとめた。

# BigQueryからローカル環境に直接エクスポート
画像の`CSV（ローカルファイル）`を選択することで、**最大10MB**までローカル環境に直接CSVをエクスポートすることができる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/883573/0c883a2e-d3d2-2a71-750e-e0c6e481dba5.png)

# BigQueryからGoogle Driveにエクスポート
前述の画像の`CSV（Google ドライブ）`を選択すれば、**1GB**までGoogledriveにCSVをエクスポートできる。
もっと大きい容量のCSVをエクスポートする場合は、troccoなどでBigQuery→Google Cloud Storageにエクスポートすることができた。
（下記のBigQueryからS3にエクスポートとほぼ同じ手順。**容量制限なし**）

# BigQueryからS3にエクスポート
ETLツールのtroccoを使用して、
BigQueryでのクエリ実行結果をS3にCSV形式でエクスポートをした。(**容量制限なし**）

* troccoの`転送設定`を`Google BigQuery->Amazon S3`に設定
* troccoの`転送設定`の編集画面に、`SQL`という欄があるので、CSVにエクスポートしたいデータを呼び出すクエリを入力する。
※細かい設定は割愛


# EXPORT DATA関数を使用して、BigQueryからGCSにエクスポート
troccoなどのETLツールを使用しなくても、EXPORT DATAステートメントを使用することで、
Google Cloud StorageにCSVをエクスポートすることもできる。

#### クエリの例
```SQL
export data options (
    uri = 'gs://バケット名/フォルダ名/ファイル名接頭辞_$content_id$_*.csv' -- バケットのuriを指定
    , format = 'CSV' -- エクスポートするデータの形式をCSVに指定
    , overwrite = true -- trueの場合、宛先の場所が上書きされる
    , header = true -- trueの場合、各データファイルの最初の行に列ヘッダーが生成される
    , field_delimiter = ',' -- フィールドを区切りに使用する区切り文字
) as

/* 抽出したいデータのクエリを記述する */
select
    *
from
    `テーブル名`
where
    1=1
    and content_id = '$content_id$' -- troccoのカスタム変数機能を使用すれば、content_id毎に別々のCSVファイルに結果をエクスポートできる。
```
※`$content_id$`には、色々なcontent_idがtroccoのループ実行機能で格納されている。
参考：[BigQuery の EXPORT DATA 関数でクエリ結果を様々なタイプで GCS に出力](https://www.niandc.co.jp/sol/tech/date20220603_2177.php)
参考：[EXPORT DATAステートメント(公式ドキュメント)](https://cloud.google.com/bigquery/docs/reference/standard-sql/other-statements?hl=ja#export_data_statement)
any Equatable 同士を比較する

`Equatable`に適合したインスタンス同士を比較したい場合が時々あります。以下のコードでいうと`GenericItem`同士を比較できると、いろいろ便利な場面がありますが、残念ながら `==` オペレータで単純に比較する事はできません。


```swift
protocol GenericItem: Hashable {
	associatedtype Element
	var value: Element { get }
}

struct StringItem: GenericItem {
	var value: String
}

struct IntItem: GenericItem {
	var value: Int
}

let item1: any GenericItem = StringItem(value: "hello")
let item2: any GenericItem = StringItem(value: "hello")
let item3: any GenericItem = StringItem(value: "world")
let item4: any GenericItem = IntItem(value: 24)

// Binary operator '==' cannot be applied to two 'any GenericItem' operands
item1 == item2 // error 
item1 == item2 // error
item2 == item3 // error
item3 == item4 // error
```

この例で言うなら、`GenericItem`に`isEqual(to:)`の類いのメソッドを用意して比較するなんて方法もあるようです。

```swift
protocol GenericItem: Equatable {
	func isEqual(to other: any GenericItem) -> Bool
}
extension GenericItem {
	func isEqual(to other: any GenericItem) -> Bool {
		if let other = other as? Self {
			return self == other
		}
		return false
	}
}
func compare(_ item1: any GenericItem, _ item2: any GenericItem) -> Bool {
	// error: Binary operator '==' cannot be applied to two 'any GenericItem' operands
	// return item1 == item2

	// OK
	return item1.isEqual(to: item2)
}
```

が、今回もっと簡単な方法を見つけたので、紹介したいと思います。

```swift
func == (lhs: any Equatable, rhs: any Equatable) -> Bool {
	return ([lhs] as NSArray) == ([rhs] as NSArray)
}
```

上記の呪文を唱えれば、以下のように、`any Equatable` 同士が比較できるようになります。

```swift
let item1: any Equatable = StringItem(value: "hello")
let item2: any Equatable = StringItem(value: "hello")
let item3: any Equatable = StringItem(value: "world")
let item4: any Equatable = IntItem(value: 24)

item1 == item2 // true
item1 == item2 // true
item2 == item3 // false
item3 == item4 // false
```

この例では、`StringItem`も`IntItem`も`NSObject`のサブクラスでも`NSObjectProtocol`に適合しているわけでもありませんが、`NSArray`同士を比較するときはメンバーの`any Equatable`同士をなぜかいい感じで比較してくれるようです。

内部の仕組みがわかれば、`NSArray`とかでラップしなくても、良い方法で比較できるかもしれません。

さて、一部の人には、`any Equatable`同士を比較したいのに、なぜ冒頭のコードは`Hashable`になっているのかと気になった人もいるかもしれません、不思議なことに`Hashable`を`Equatable`にすると、挙動が変わります。

`any Equatable`同士を比較したいのに、対象のインスタンスは `Hashable`に適合していないと挙動が変わってしまうという不思議さです。

```swift
protocol GenericItem: Hashable { // <-- Hashable
	associatedtype Element
	var value: Element { get }
}
//...snip...
([item1] as NSArray) == ([item2] as NSArray) // true
([item2] as NSArray) == ([item3] as NSArray) // false
```

```swift
protocol GenericItem: Equatable { // <-- Equatable
	associatedtype Element
	var value: Element { get }
}
//...snip...
([item1] as NSArray) == ([item2] as NSArray) // false <-- !?
([item2] as NSArray) == ([item3] as NSArray) // false
```

ひょっとして、まだ見知らぬ罠が潜んでいる可能性はありますが、一つの方法として紹介したいと思います。

```log
$ swift --version
swift-driver version: 1.62.15 Apple Swift version 5.7.1 (swiftlang-5.7.1.135.3 clang-1400.0.29.51)
Target: arm64-apple-macosx13.0
```
Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「Azure Blueprints」

Microsoft Learnを用いたMicrosoft Azure Fundamentals(AZ-900)の試験内容をまとめる投稿です。
この投稿ではMicrosoft Learnで学ぶ内容をできるだけ簡潔にまとめております。
Azureの勉強を一から始める方の参考になれば幸いです。

## 今回の学習内容
**◆「Azure Blueprints」**
◇対応するMicrosoft Learn ラーニングパス
[Azure の基礎: Azureの管理とガバナンスについて説明する](https://learn.microsoft.com/ja-jp/training/paths/describe-azure-management-governance/)
◇対応するモジュール
[Azure Blueprints の目的について説明する](https://learn.microsoft.com/ja-jp/training/modules/describe-features-tools-azure-for-governance-compliance/2-describe-purpose-of-azure-blueprints)

※前回の投稿は下記から確認できます。
[Azure Fundamentals(AZ-900)：Azure の基礎: Azureの管理とガバナンスについて説明する「タグの目的」](https://qiita.com/fsd-jume/items/7ebec820771e5f6162db)

## Azure Blueprints
**サブスクリプションや環境のデプロイを標準化**
設定やポリシー、要件に基づく定義を作成することで、
・新しいサブスクリプション作成時に割り当て、同一の要件に準拠したサブスクリプションを簡単に作成可能
・組織のセキュリティとコンプライアンス要件を満たした新しい環境を迅速に構築可能

### 成果物(アーティファクト)
**Blueprintsの定義における構成要素**
・Blueprintsの定義作成時/スコープへの割り当て時にパラメータを1つ以上含めることも可能
⇒定義を維持しながら、一部を状況に合わせて変更可能
例) Blueprintsでリソースグループを作成する際に、重複や競合を避けるために名前と場所(パラメータ)を指定する
・サポートしているリソース
　-ロールの割り当て
　-ポリシーの割り当て
　-Azure Resource Manager(ARM)テンプレート
　-リソースグループ

### デプロイの監査における利点
・Blueprintsはバージョン管理できるため、割り当てたバージョンの追跡が可能
・Blueprintsの定義とBlueprintsで作成されたリソースの間の関係は維持される
⇒デプロイを追跡して監査することが可能

## 次の学習内容
**◆Azure Policy**

https://qiita.com/fsd-jume/items/789a3d341866eb58a90c

## 学習内容をまとめたページの一覧

https://qiita.com/fsd-jume/items/e4ec76959adb547ac5e8
Google UXデザイン：クローズアップ・ストーリーボード

# はじめに

わたしが[Google UX Design Certificateで得られた素晴らしい体験][google]を、特に重要だと思われるポイントを小さく分割して、わかりやすく簡潔に紹介していきます。

興味があれば、ぜひ Google UX Design Certificateを受講してみてください。

[google]: https://qiita.com/mapami/items/7a0d0a3d4661c50f8bec

https://www.coursera.org/professional-certificates/google-ux-design

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c3d622bb-c1ed-447b-c15e-c1bccff32a4a.png" width="800">

<details><summary>これまでの振り返り</summary>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/85c69232-7e47-8c49-d4c0-3e42b69b9526.jpeg" width="500">

</details>

# ２種類のストーリーボード

[前回紹介したストーリーボード][storyboard]には、２種類あります。

[storyboard]: https://qiita.com/masami-atwvn/items/8126858ad64f3ce14b92

<dl>
  <dt>ビックピクチャ・ストーリーボード</dt>
  <dd>ユーザーが何を必要としているか、その背景、そして、なぜその製品がユーザーにとって有用であるかに焦点を当てます。</dd>
  <dd>全体像のストーリーボードは、デザイナーがステークホルダーに自分たちのアイデアを支持してもらおうとするデザインプロセスの初期によく使用されます。</dd>
  <dt>クローズアップ・ストーリーボード</dt>
  <dd>製品やその仕組みに焦点を当てます。</dd>
  <dd>デザインプロセスの中盤から終盤に使用するのが最適です。</dd>
</dl>

今回は、クローズアップ・ストーリーボードについて、ご紹介します。

# クローズアップ・ストーリーボードの作成ステップ

クローズアップ絵コンテを作るには、ステップ1～4は、ビックピクチャの絵コンテのプロセスと同じです。

1. 問題提起から始める
1. ゴール・ステートメントを作成する
1. ストーリーボードをセットアップする
1. ストーリーボードのシナリオを追加する
1. 1コマに1つのアイデアを描く

ビックピクチャとクローズアップの絵コンテは、ステップ5で各パネルを描くところが異なります。

- ビックピクチャの絵コンテ　***<font color="MediumVioletRed">『ユーザーに焦点を当てる』</font>***

- クローズアップの絵コンテ　***<font color="MediumVioletRed">『製品に焦点を当てる』</font>***
    - 各パネルでどの製品の詳細に注目したいのか、その理由を考える。
    - 製品内のユーザーの流れや、製品内の各アクションがどのように次の画面につながるかを示す。

# サンプル
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/5fe0896a-d421-bc48-110f-ccd3ed88220e.png" width="750">

1. ユーザーが携帯電話を開き、アプリをスワイプして、ミュージシャンのアプリのアイコンをタップして開きます。
1. アプリをデザインするとき、クローズアップストーリーボードの1つのパネルでは、ユーザーが最初にアプリを開いたときに、どのように旅を始めるかに焦点を当てることがよくあります。このミュージシャンを探すアプリの例では、新規ユーザーがプロフィールを作成する場合と、既存ユーザーがログインする場合を想像してみましょう。
1.  ユーザーがアプリにログインすると、バンドマンの検索を開始できます。ユーザーは、ミュージシャンのプロフィールをスクロールし、経験レベル、演奏年数、場所、演奏楽器などのフィルターを設定することができます。
1.  ユーザーはミュージシャンの「プロフィールを見る」ボタンをタップし、経験、資格、所在地を確認します。
1.  そして、連絡を取りたいと思う候補者が見つかったら、「送信」ボタンをタップして、そのミュージシャンにメッセージを送ります。ユーザーは、自分でメッセージを書くこともできますし、空き時間や会話のスケジュールを尋ねる自動メッセージを送ることもできます。また、ユーザーが自分の楽曲をミュージシャンに提供するオプションも用意されています。
1.  ユーザーはメッセージが送信されたことの確認と、次に期待されるステップの説明を受け取ります。確認メッセージの下には、"Your message to this musician has been sent. "のような文章が表示されるかもしれません。また、ユーザーの受信トレイに戻るボタンと、元の検索ページに戻るボタンも表示されます。
エニグマ暗号とポーランド人による解読

# 隠れたポーランドのヒーロー
ホフスタッターの「ゲーデル・エッシャー・バッハ」によりチューリングのエニグマ解読のことを知りました。ポーランドにおいても解読の試みがあったことは知ってはいたのですが、その詳細は知りませんでした。多くはチューリングの業績に負うのだろうと思い込んでいました。ところが、どうもポーランド人数学者による業績の方が大きいようです。ナチスドイツのポーランド軍事侵攻の際、ポーランドで開発された解読マシンは秘密保持のために破壊されたそうです。そのこともあってその業績はあまり知られていないようです。この人はレイエフスキさん（Marian Adam Rejewski）という人です。

# 暗号文からローター配線を推測
参照先の動画が詳しくレイエフスキさんの群論を応用したエニグマ解読について解説しています。時間の制約からあまり詳しい解説がなされていないのですが、これを手掛かりに私もその業績を追いかけてみることにしました。
https://www.youtube.com/watch?v=GG1zIELCb6k&t=1370s

ポーランドではドイツの軍事進攻にそなえてエニグマの解析を進めていました。商用エニグマは入手できたものの、軍事用エニグマは入手できません。膨大な暗号文から群論を応用してローター配線を推測したのだそうです。初期のドイツ軍は暗号文を送る手順として、予め決められていた日鍵をもとにローターの設定を2度打ちしてから本文を送信していました、3枚のローター設定をxyzxyzやabcabcのように2度打ちしたものを暗号化していました。このため1文字目と4文字目、2文字目と5文字目、3文字目と6文字目は同じ文字を暗号化したものでありそれらには一定の規則性があることを見出しました。

# サイクル

エニグマは1文字ごとにローターが回転する仕組みになっています。あえて回転させないでa-zの文字をエニグマに与えて1文字目と4文字目を計算させます。そしてこれらを組にしてみます。手計算で確認したのち、Lispでその組を生成するものを書きました。

```
Easy-ISLisp Ver2.65
> (load "tests/enigma.lsp")
T
> (combination 0 0 0)
((#\b #\r) (#\a #\f) (#\x #\g) (#\u #\t) (#\i #\p) (#\j #\b) (#\w #\c) (#\s #\l) (#\e #\j) (#\f #\i) (#\o #\q) (#\m #\h) (#\l #\s) (#\t #\v) (#\k #\w) (#\v #\e) (#\y #\k) (#\z #\a) (#\h #\m) (#\n #\d) (#\d #\z) (#\p #\n) (#\g #\o) (#\c #\y) (#\q #\x) (#\r #\u))
> 
```

ｂからｒ、ｒからuとサイクルになっているものを手繰ります。Lispでサイクルを抽出しました。

```
> (cycle (combination 0 0 0))
((#\m #\h) (#\s #\l) (#\w #\c #\y #\k) (#\x #\g #\o #\q) (#\a #\f #\i #\p #\n #\d #\z) (#\b #\r #\u #\t #\v #\e #\j))
> 
```

レイエフスキーの定理によれはこのサイクルの数は必ず偶数になるのだそうです。そして、この結果を使うとローター配線のか調べなければならない可能性を数十程度までに減少させることができるのだそうです。このあたりになると群論の知識が必要になります。書棚から本を引っ張り出してきて勉強を開始したところです。


# 何歳になっても勉強は楽しい
戦争に使われた道具ということはさておき、こういった現実の問題に数学が応用されている場面を見ると勉強の意欲がそそられます。私は気が付いたら還暦を超えていました。しかし、まだまだ頭は冴えています。いろいろと勉強したいものです。

# ソースコード
ここにおいてあります。test/enigma.lspです。OSSです。
https://github.com/sasagawa888/eisl
[Power BI] Power Queryの『型』を探る (4) null

# 3. logical （論理型）
　logical は、 true と false のブール値を格納します。

```text:logical
Logical.FromText("true")  // true
Logical.FromText("false") // false
Logical.From(0)  // false
Logical.From(1)  // true
Logical.From(-1) // true
```

# 4. null　何も示さないもの
　null型は、nullを保持する型です。

　nullにはざっくりと以下の意味があります。

1. 有効でない
1. 存在しない
1. 保存されていない
1. 利用できない

[1] ANSI/X3/SPARC Study Group on Data Base Management Systems, Interim Report, ANSI, February 1975, pp. IV-28～IV-29.

https://dl.acm.org/action/showFmPdf?doi=10.1145%2F984332


　nullは値がないこと、あるいは未知の値であることを表します。この哲学あるいは論理学の問題は、言語設計者がnullを許容した場合の動作を様々な可能な動作の中から選択、あるいは再定義しなければなりません。nullを含む項目の演算には、その結果がどのようになるか、予め知っておく必要があります。

```text:nullの比較
null = null  // true
null <> null // false
0 = null     // false
null <> 0    // true
```

　以下のように、nullを含む演算は、多くの場合 **null** になってしまうことに注意してください。

```text:nullの論理演算
null and null  // null
null and true  // null
null and false // false
null or null   // null
null or true   // true
null or false  // null
```

```
1 > null     // null
1 >= null    // null
null < null  // null
null <= null // null
10 + null    // null
null - 16.3  // null
null * 25    // null
8 / null     // null
"abc" & null & "def" // null
```

　nullはいわば虚無のように振る舞います。虚無に触れると値は粉砕され無意味になってしまいます。例えば、 **nullを含む項目を文字列として結合する場合、戻り値はnullになってしまいますので、特に注意が必要です。** 事前に、nullが発生する項目を空白に置き換える作業が必要です。

　nullを許容する型は、**nullable** を指定します。

```text:nullを許容する型
type null
type any
type nullable <T> 
```

```text:nullを許容しない型
type <T>
type anynonnull
Type.NonNullable(<T>)
```

　関数の引数や戻り値の型にnullを許容するかどうかを明示することができます。
　テーブルの項目の型は常にnull許容となり、許容しない指定はできません。

# 関連記事
1. [[Power BI] Power Queryの『型』を探る (1) number](https://qiita.com/spumoni/items/9459635b69db773eca30)
1. [[Power BI] Power Queryの『型』を探る (2) text, temporal falimy](https://qiita.com/spumoni/items/ce38958d9858ea132a8f)
1. [[Power BI] Power Queryの『型』を探る (3) number 蛇足](https://qiita.com/spumoni/items/c46b3ddfb8173b6e9aa2)
1. [[Power BI] Power Queryの『型』を探る (4) null](https://qiita.com/spumoni/items/d8279858ceb627af8101)
1. [[Power BI] Power Queryの『型』を探る (5) カスタム型](https://qiita.com/spumoni/items/ec6893c9e4527b674b76)
1. [Power BIデータモデルの型システム (1) 数値型、日付／時刻型](https://qiita.com/spumoni/items/c73e465b691b15694ba0)
1. [Power BIデータモデルの型システム (2) テキスト型、論理型](https://qiita.com/spumoni/items/476494dc7818edc5e190)
【Python】pydub使ったら音声データの解析がめっちゃ簡単だった

音声データをPythonで取り込んで表示したり解析したりしたいと思ったことはありませんか？
この記事では音声データの入出力をPythonで行えるpydubのインストールと基本的な使用方法（音声データの読み込み）について説明します。

pydubで音声データファイルの入力ができれば，Numpyが提供する関数等を使用してPython上で音声データの解析・加工ができるようになります。

```
動作検証済み環境
macOS Catalina(10.15.7), python3.7.10, Jupyter Notebook, OpenCV 3.4.2
```

本記事の続きはZennに移動しました :bow:

https://zenn.dev/labcode/articles/7eaca4f7e9dbcf
PHP-制御構造

# PHP-制御構造

* 制御構造に関する公式ドキュメント

https://www.php.net/manual/ja/language.control-structures.php

・要件（前提条件、使用環境）
　・PHPが導入済み
　・VSコードを導入済み
　・dockerを導入済み
　・Xdebugが導入済み
　・Composerが導入済み


1. 前提知識
・＄変数名=　値;
・＄変数名=　式;　値をもつもの
・文は末尾に「;」がついたもの、もしくは中括弧で囲まれたもの
・構文は文法・書式のこと。
・Syntax error とは、構文エラーという意味
・言語構造は、言語を構成する要素のこと（ [PHPのキーワード]("https://www.php.net/manual/ja/reserved.keywords.php"])　）
・制御構造は、プログラムの流れを制御するもの。言語構造の一種
2. 条件分岐
2-1. if
　　比較演算子で真偽値で判定、論理型変数で直接判定、暗黙的変換し判定、複数条件で判定
2-2.switch
　　同じ変数を複数の値で条件分岐したいときに使う
　　※注意　緩やかな型変換される
2-3.match
　　同じ変数を複数の値で条件分岐し、値を代入したいときに使う
　　※厳密な比較で処理される

3.繰り返し処理
* foreach
配列の全要素に対して繰り返しで使う
※開発でよく使うことがある
```php:sample.php
$nummer[1,2,3,4]
foreach () {
    echo $number *2 . PHP_EOL;
} // 2 4 6 8
```
* for
決められた回数分の繰り返し処理
```php:sample.php
for ($i = 1; $1 <= 10; $++) {
    echo $i;
} //1 2 3 ...10
```
* while
ある条件を満たす間だけ繰り返す
```php:sample.php
$i = 0;
while($i < 100){
    i +1;
}
```
* breakとcontinue
breakはループを抜けたいときに使う
continueはループをスキップしたいときに使う
```php:sample.php

```
* HTMLと混ぜて使うとき
if,switch,foreach,for,whileには波括弧を使わない記法が存在する
```php:sample.php
<?php if ($num === 10) { ?>
  <p>$numは10</p>
<?php } ?>
```
⬇
```php:sample.php
<?php if ($num === 10) : ?>
  <p>$numは10</p>
<?php endif; ?>
```
3.　コードの順番
* コードの順序に依存性がある時は、依存性が明確にする
* コードの順序に依存性がない時は、関連するコードをまとめる
-　コードを上から下に読みやすくする
```php:sample.php

```

4． 条件分岐
* 正常なケースを先に書き、エラーケースをあとに書く
```php:sample.php

```
* else句が必要かどうかよく確認する
※海外の論文によると、50％の割合でelse句が必要になる場合ある
```php:sample.php
$myasqli = mysqli_connect();
if() {
  
}

```
* 複雑なif-elseifの場合
　- 複雑な条件式は関するにする
```php:sample.php

```
　　- 一般的なケースを最初に書く
```php:sample.php
if(isLetter($inputName)){
}
```
* switch　文でcaseがたくさん登場するときは、caseの順番に気をつける
　- 順番
　　+ 正常なケースを先頭にする
　　+ よく登場するものから記載する。
　　+ アルファベット順や数値順に書く
　- その他
　　+ 全てのケースを網羅する
　　+ defalut句はその他扱いの時に指定する
　　+ 各ケースの処理は関数は使ったりして短くして書く
```php:sample.php

```
5． 繰り返し処理

* foreach
配列の全要素に繰り返し処理をする
* for
決まった回数だけ繰り返し処理をする
* while
繰り返し処理を何回したいかわからない時使用する

* 繰り返し処理のポイント
複雑になりやすいため、単純にする
　- 開始
　　+ 初期化コードはループの直前に置く
　　+ 無限ループにはwhile(ture)を使う
　- 本文
　　+ ループのネストは3段階まで
　　+ ループの前処理・後処理は先頭か末尾にまとめる
　　　例）ループの回数を数えたい時
　　+ ループ1回に1つの機能（処理）
　　+ ループは20～50行以内にする
　- 終了
　　+ 全てのケースでループが終了することを確認する
　　+ ループの開始時と終了時をシュミレーションする※（脳内・紙に書く）
* 繰り返し処理のコツ
ループは内から外へ書くと混乱しにくい
　- 日本語で本文の処理を書く
　- コードに置き換える
　- ループで囲む
　- 変数の初期化等を追記する
```php:sample.php
<?php

```
6.　制御構造によくある問題

* 複雑な式
　- ブール変数やブール関数を使ってシンプルにする
```php:sample.php
<?php

```
* 否定的な論理式
  - 否定的な理解は時間がかかるため、肯定的な論理式にする（迷ったらド・モルガンの法則を使う）
```php:sample.php
<?php

```
* 括弧のない複雑な論理式
　-　複雑な論理式は括弧を使うと意味が明確になる

* 数値を含む式
　- 数値を含む式は数直線上に並べる

* 深いネスト
　- 深いネストはコードが読みにくいので、２～３段階までにする

### 複雑さの測定

* 初期値は１
* if,for,while,&&,|| が登場するたびに1を足す
* case の選択肢ごとに１を足す
⬇
* 1~5 個：処理は適切
* 6～10個：　単純にできないか検討
* 11個～　：処理の一部を関数に分割














###### 参考資料

[PHPUnitドキュメント](”https://phpunit.readthedocs.io/ja/latest/index.html”)
kintone　おすすめプラグイン３選

# はじめに

某企業で、kintoneを中心に業務改善に取り組んでいます。
標準機能でやりたいことができなかったときに、プラグインを導入してきましたが、
最初は、プラグインの数ありすぎて何を選べばよいのかわからない状態でした。
同じような状況の方に、自身の経験からおすすめできるプラグインを紹介したいと思います。

# 目次
1. TIS無料プラグイン（基本無料）
2. Gusukカスタマイン（有料／アプリ数に応じて価格変動）
3. krewsheet（有料／ユーザー数に応じて価格変動）

# TIS無料プラグイン
[TIS社](https://www.tis2010.jp/ "kinttone|TIS")様の無料のプラグインです。
かなりの量があり、やりたいことのほとんどはこの中で解決できるのではないでしょうか。
プラグイン同士の競合もあることを考えると、できるだけプラグインは機能が被らないように
同じ会社のものに限定することも必要です。

このプラグイン群で実現できないことは、kintoneの運用方法をkintone標準機能やプラグインの動作に
併せることで、解決できないか検討してみて下さい。

基本無料ですがランダムで広告が出ます。
年額7,500円で広告を消すことが可能ですし、
年額50,000円でサポートまで受けることが可能です。

[TISホームページ](https://www.tis2010.jp/ "kinttone|TIS")

# Gusukカスタマイン
kintoneのカスタマイズはjavascriptで行いますが、こちらのプラグインは
カスタマイズをノーコードで行えるものになります。

これさえあれば、他のプラグインは無理して入れる必要がありません。何でもできます。

但し、他のノーコードツールも同じだと思いますが、プログラム言語は書けなくとも
処理フローを体系立てて考えるスキルは、あったほうが作った後のエラーやトラブルは少ないかなと思います。

[gusukuカスタマイン ホームページ](https://customine.gusuku.io/ "gusukuカスタマイン")

# krewsheet
こちらは、上記2つとは経路が違ってkintoneの一覧をExcelのように扱えるようにするプラグインです。
一覧での入力・編集作業が多い場合に検討してみてはいかがでしょうか。

Xrossモードという機能で、ピボットでのクロス集計にも対応しており
Excelのピボットテーブルのような集計や、シフト表の表示も可能です。

[krewsheet 製品紹介ページ](https://krew.grapecity.com/ "krewsheet")
【試行錯誤】「〇〇で歌ってみた」動画の自動生成 リンクまとめ

# 概要
「【試行錯誤】「〇〇で歌ってみた」動画の自動生成」シリーズの記事一覧です。
随時更新していきます。

# リンクまとめ
作成済み
[その１：MusicXMLの歌詞を書き換えて歌声合成](https://qiita.com/shimajiroxyz/items/98d9305c0a4256f6eac5)
[その２：MusicXMLから歌詞の発話タイミングを取得](https://qiita.com/shimajiroxyz/items/6d51f376df7f231e5140)
[その３：動画生成に必要な替え歌情報の整理](https://qiita.com/shimajiroxyz/items/a96d5742a3049bc14b67)
[その４：静止画の生成](https://qiita.com/shimajiroxyz/items/690faf3aeae096c65b17)
[その５：静止画をつなげて動画化](https://qiita.com/shimajiroxyz/items/69495d1c223177a96c83)

今後の予定（タイトル等、変更可能性あり）
その６：替え歌歌詞の自動生成
その７：MIDIからMusicXMLを自動生成
その８：処理のワンパス


# メモ（参考にした／できそうな記事）
[midiと歌詞からmusicxmlを生成してNEUTRINOに渡したい(1)](https://pokosho.com/b/archives/3768)
【AWS】Aurora MySQL アドバンスト監査ログ出力【Cloud Watch Logs】

# Aurora MySQL アドバンスト監査ログ出力

Auroraで特定のDBユーザの操作を監査ログで出力する。
[公式Document](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Auditing.html)を元に設定していく。

## 準備

まずはRDSクラスタ、パラメータグループ、ユーザを作成する。
VPCに接続用インスタンスを作成するのがめんどくさかったので、パブリックアクセスを有効化した。

- クラスタ & インスタンス設定

| 項目                 | 値                                   |
| :------------------- | :----------------------------------- |
| クラスタ名           | test-db                              |
| エンジンバージョン   | 8.0.mysql_aurora.3.02.1              |
| マスターユーザ       | test                                 |
| インスタンスクラス   | db.t4g.medium                        |
| 可用性               | Auroraレプリカを作成しない           |
| パブリックアクセス   | あり                                 |
| セキュリティグループ | 開発PCからの3306を許可したものを設定 |
| ログのエクスポート   | 監査ログにチェック                   |

- クラスタパラメータグループ設定

`audit`という名前のユーザが行った操作を監査ログに出力するように設定する。
設定項目は以下の通り。

| 項目                     | 値    |
| :----------------------- | :---- |
| server_audit_logging     | 1     |
| server_audit_logs_upload | 1     |
| server_audit_incl_users  | audit |
| server_audit_events      | QUERY |

ちなみに、`server_audit_events`にCONNECTを追加すると、
DBへの接続・切断イベントも記録されるようになるが、
こちらはユーザの指定ができず、全ユーザのものがログ出力される。

- ユーザ作成

```SQL
$ mysql -u test -h <クラスタエンドポイント> -p

mysql> CREATE USER audit@'%' IDENTIFIED BY 'audit';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE ON test.* TO audit@'%';
```

## 確認

### variable 確認

`show variables`で設定内容を確認。

```SQL
mysql> SHOW VARIABLES LIKE 'server_audit%';
+------------------------------+-----------------+
| Variable_name                | Value           |
+------------------------------+-----------------+
| server_audit_cw_upload       | OFF             |
| server_audit_events          | QUERY,QUERY_DML |
| server_audit_excl_users      |                 |
| server_audit_incl_users      | audit           |
| server_audit_logging         | ON              |
| server_audit_mode            | 0               |
| server_audit_query_log_limit | 65536           |
+------------------------------+-----------------+
7 rows in set (0.01 sec)
```

なぜか`server_audit_cw_upload`がOFFになっているが、、、
とりあえずパラメータグループの内容は反映されているっぽい(cwlogのやつ以外)。

### クエリ実行してみる

```SQL
$ mysql -u audit -h <クラスタエンドポイント> -paudit

mysql> CREATE TABLE test.audit_test (id int, text varchar(10));
mysql> INSERT INTO test.audit_test VALUES (1, 'test');
mysql> SELECT * FROM test.audit_test;
+------+------+
| id   | text |
+------+------+
|    1 | test |
+------+------+
2 rows in set (0.01 sec)
```

### CloudWatch Logs を確認

特にしていなければロググループに`/aws/rds/cluster/<クラスタ名>/audit`というグループができている。
中を見てみると、`<インスタンス名>.audit.log.x`みたいなログストリームができている。

ログを確認すると、下記のようにQUERYが記録されていることが確認できる。

```
1667508480539207,<インスタンス名>,audit,<接続元IP>,15659,QUERY,test,'create table audit_test',4028
1667508596853240,<インスタンス名>,audit,<接続元IP>,16684,QUERY,test,'insert audit_test values(1, \'test\')',0
1667511851715505,<インスタンス名>,audit,<接続元IP>,15617,QUERY,,'SELECT * from test.audit_test',0
```

# 以上！

server_audit_cw_upload の設定が OFF になったままなのが引っかかったが、
問題なく特定ユーザの特定クエリを監査ログとしてCloudWatchLogsにログ転送できた。

後片付けは忘れずに。。。
pythonで一行で極値のx座標を求める方法

# はじめに
<!-- 発端や概要を記載 -->
科学計算をしたいときに関数の極値をあたえるようなxを求めたいときがでてくると思いますが、ちょうどよい一行を見つけたので紹介させていただきます。

# とりあえず準備から
```python
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0,10,10001)
y = np.exp(-x/10) * np.sin(x)
plt.plot(x,y)
```
とりあえずこんな感じで関数を用意します。
```math
y = e^{\frac{-x}{10}} \sin(x)
```
今回は試しにこの関数を微分してみましょう。
```python
dydx = np.gradient(y,x)
```
# 結論
ここで微分を簡単に取得できるわけですが、これから極値のx座標を求めるとなると大変です。
そこで以下のコードを通します。
```python
x[1:][dydx[1:] * dydx[:-1] < 0]
```
このコードは、ある一点の前後の微分値の積の符号がマイナスになったときのx座標を返すというものです。こう言う風にしてみると、いろんな関数の極値のx座標が一発で求まります。是非皆さんもやってみてくださいね。

それでは。
Windows11 ARM on ParallelsでWSL2を使えない

# 概要
Parallesを使ってM1 MacにインストールしたWindows11にWSL2をインストールできない。

# 環境
https://qiita.com/DR623G/items/5b098d97b3cfa3d878dc

の手順でインストールしたWindows11環境


# 手順
WSLをインストールする。
```shell-session
> wsl --install
要求された操作には管理者特権が必要です。
インストール中: 仮想マシン プラットフォーム
仮想マシン プラットフォーム はインストールされました。
インストール中: Linux 用 Windows サブシステム
Linux 用 Windows サブシステム はインストールされました。
インストール中: Ubuntu
Ubuntu はインストールされました。
要求された操作は正常に終了しました。変更を有効にするには、システムを再起動する必要があります。
```
Windowsを再起動する。

```shell-session
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/enablevirtualization
Press any key to continue...
```
0x80370102エラーが発生しているので、Nested Virtualizationを有効にする必要があるが、使用しているParallelsではEnable Nested Virtualizationの項目が表示されない。
> To enable nested virtualization feature, set the hypervisor type to Parallels in the virtual machine's configuration:
> 1. Open virtual machine configuration > Hardware > CPU & Memory > Advanced... > set Hypervisor type to Parallels.
> 2. Select the **Enable Nested Virtualization** option and click "OK" to enable the feature.

# 参考情報
## Windows Subsystem for Linux
https://learn.microsoft.com/ja-jp/windows/wsl/install

https://learn.microsoft.com/en-us/windows/wsl/troubleshooting#error-0x80370102-the-virtual-machine-could-not-be-started-because-a-required-feature-is-not-installed

## Nested Virtualization in Parallels Desktop
https://kb.parallels.com/en/123975?language=jp

https://kb.parallels.com/en/125195?language=jp

:::note info
Note: nested virtualization is currently <font 
color="red">not</font> supported in Parallels Desktop for Mac computers with <font color="red">Apple M1 chips</font>.
:::
Pythonでクリックしたスクリーン上の座標を求める方法のメモ(pynput)


# Pythonで、クリックした画面上の座標を求める方法

※ Pythonに関しては最低限の知識がある方向けです。

##  まずは、インストール

`pynput`は外部パッケージなので、pip等を用いインストールします。

```console
pip install pynput
```

## 座標を求めるコード

インストールしたら、次のコードを動かせるようになります。

```python:cursol.py
from pynput.mouse import Listener

def on_click(x, y, button, pressed):
    if pressed:
        print('{:5.1f}, {:5.1f}'.format(x, y))

with Listener(on_click = on_click) as listener:
    listener.join()
```

### コードの解説

クリックで押された時に離れた時に、定義された`on_click`が呼ばれます。

1. 第1引数`x`は、普通の右方向のx軸。左端が`0.0`。  
2. 第2引数`y`は、下方向のy軸。上端が`0.0`。  
3. 第3引数`button`は、`<enum 'Button'>`。  
4. 第4引数`pressed`は、押されたときに`True`で、離れたときに`False`。  
どちらか片方がわかれば良かったので、押されたときだけ表示するように条件分岐しています。

クリックされた位置`x`, `y`は`float`(浮動小数点数)です。
そのまま`print`で表示すると、小数点未満がたくさん表示され鬱陶しいです。
そこで、コード上では`format`を用いて、
小数点未満は四捨五入で1桁にし、また(小数点含めて)5文字分の幅で右寄せで表示するようにしました。

```sh
# そのまま左寄せ表示する
80.1, 10.8  
150.2, 400.3

# 5文字分で右寄せで表示する
 80.1,  10.8
150.2, 400.3
```


それから、カンマ(+スペース)で区切るようにしてあります。

### 【注意】プログラムを止める方法

実行させたあとプログラムを止める方法は、
自分のMacの場合、`control + z`か`control + c`でした。
後者ですと、Pythonがエラーメッセージを10行ほど吐き出すので、ちょっと鬱陶しいです。


# 参考

[Handling the mouse — pynput 1.7.6 documentation](https://pynput.readthedocs.io/en/latest/mouse.html)
スマホのセーフエリア処理

いつも調べて忘れるので書き残しておく。


# viewportとenv()

大抵フッターエリアのボタンが押しにくいので、`viewport-fit=cover`を足し、`env(safe-area-inset-bottom)`をpaddingなどで足してあげればOK

```hoge.html
<meta name='viewport' content='initial-scale=1, viewport-fit=cover'>
```

```fuga.css
padding-top: env(safe-area-inset-top);
padding-right: env(safe-area-inset-right);
padding-bottom: env(safe-area-inset-bottom);
padding-left: env(safe-area-inset-left);
```

# Javascriptでセーフエリアの値を取得する
CSSのカスタムプロパティを指定すると、JSからも取得しやすい

```foo.css
:root {
    --safeareainsetbottom: env(safe-area-inset-bottom);
}
```

```bar.js
getComputedStyle(document.documentElement).getPropertyValue('--safeareainsetbottom')
```

参考
https://benfrain.com/how-to-get-the-value-of-phone-notches-environment-variables-env-in-javascript-from-css/
マウスのボタンの推し

　あくまで自説であるが、それにしては自信満々だが、人間の手はマウスのボタンを押すようにはできていない。手の関節という構造物は「回転」を行うように作られており、上から「押す」動作は苦手である。回転運動を複数組み合わせて「押す」動きを実現しているにすぎない。
　これがピアノの鍵盤であれば体重を使って「押す」を実現することもいくらか容易であろう。しかしながらマウスというのは「位置をずらす」という大前提があり、体重をかける訳にはいかないのである。

　なので、マウスボタンは「指先を手元に引き寄せる」回転運動で押せるようにしとかないと「押しにくい」。確かにマウスボタンは傾斜を持っているが、部品であるスイッチの位置が妙に手前にあることから推測して、やはり「上から押す」ことを前提としているようだ。
　実際の話、手元に引き寄せる動きを想定したマウスは稀である。昔のケンジントンのマウス、大昔のミツミのマウス程度である。（電気部品で鳴らしたミツミだけあってスイッチの使い方はうまい、品質も言うことなし。）

　人間工学に無知と言ってもいいマウス設計家のお陰で、そういったマウスが全く見られなくなった。なので、その中でも比較的ボタンを押すときに人の指に優しいものを探す必要ができてしまった。以前はあったのだ。ある程度ベテランなら使ったことがあるだろう。マイクロソフトのナス型マウスである。
　手元にないので画像のリンクを貼るしかないが、これ、類を見ないほど「ボタンの端っこが底面から離れている」。
http://mineko.fc2web.com/box/mice-room/items/res/microsoft-intellimouse-1_1a/front.jpg
なので、指先をマウスの外に投げ出せば、引っ張る動作でボタンが押せるのである。スイッチの質もよく、それだけでしっかりとクリックにカウントされる。マイクロソフトに部品を供給しているという噂のアルプスの（超大昔の）マウスも同じような感触であった。アルプスのマウスは重心が先端に極端に寄っており「めちゃくちゃ使いやすかった！」２本の指先で不自由なくカーソルを移動できたのである。

　かくして、そーゆーマウスを探しているのだが、今のところLogicoolしか、底面とボタンが離れていて／スイッチがしっかり押せる、ものがない。
![mouse.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1056814/57e63d54-c642-20d3-d667-55eee5718e33.jpeg)

　ポインティングデバイスに多額の投資をし、楽なオペレーションを実現していた私は、かくして会社指定のマウスで毎日のようにクリックが空振りしている。
　もともとパソコンの反応が鈍いものだから「押したと認識してくれてないのか／単にレスポンスが悪いのか」、体感的に10秒、余分な時間が必要となる。
Python Pandas

参考URL

https://www.youtube.com/watch?v=XfoYeWCzjac

## インストール
```
pip install pandas
```
## データ構造
|用語|説明|
|----|----|
|横の列|columns|
|縦の行|index|

|種類|説明|
|----|----|
|DataFrame|エクセルの表形式のように行と列で成り立つ
|Sereies|DataFrameから1列取り出した型<br>リストにindexがくっついたイメージ

## 使用例
```py
import pandas as pd

#read_csv: 変数へデータの代入
df = pd.read_csv('data.csv',encoding='shift-jis')

#実行結果:pandas.core.frame.DataFrame
type(df)

#最大表示行数
##デフォルトでは10行で表示
pd.set_option('display.max_rows')

##Noneを指定すると全て表示される
pd.set_option('display.max_rows',None)

#最大表示列数
pd.set_option('display.max_columns',None)

#オプションのリセット
pd.reset_option('display.max_rows')

#データフレームの最初の5行,指定行(10行)
print(df.head())
print(df.head(10))

#データフレームの最後の5行,指定行(10行)
print(df.tail())
print(df.tail(10))

#データフレームから指定行(10行)ランダムにデータを取る
print(df.sample(10))

#データフレームの情報
print(df.info())

#データフレームの統計情報,小数点以下四捨五入(round(0))
print(df.describe())
print(df.describe().round(0))

##データフレームの列名取得
print(df.columns)

#データフレームの列の絞り込み
## 'IP'列のみに絞り込む例
print(df['IP'])

#データフレームの行を条件で絞り込む
## ==
## IP列が'192.168.1.234'の例 ------------------------[1]
print(df[df['IP'] == '192.168.1.234'])

## not → 「~」
## IP列が'192.168.1.234'以外の例
print(df[~(df['IP'] == '192.168.1.234')])

#データフレームの行を複数条件で絞り込む
condition_1=df['IP'] == '192.168.0.123'
condition_2=df['IP'] == '192.168.0.456'
## and → 「&」
print(df[condition_1 & condition_2])
## or → 「|」
print(df[condition_1 | condition_2])

#queryを使用する方法
print(df.query("IP == '192.168.0.123' and Name =='TEST'"))
print(df.query("IP == '192.168.0.123' or Name =='TEST'"))


#データフレームから絞り込んだ値を取得
## IP列の0行目の値を取得
print(df['IP'].to_list()[0])

## 上記[1]を1行で
print(df[df['IP'] == '192.168.1.234']['IP'].to_list()[0])

# dfの行数分回す  shape[0]:行数
for i in range(df.shape[0]):
  # iloc :行 の"colname"を .to_dict辞書型で取得
  hoge=df.iloc[i].to_dict()["colname"]

## csv へ書き出し
df.to_csv('writeToCSV_test.csv', encoding = 'shift-jis')
df.to_csv('writeToCSV_test.csv', encoding = 'utf-8')
```
## Excelからデータを読み込む
```
pip3 install xlrd==1.2.0
```
:::note warn
注意
https://learn.microsoft.com/ja-jp/azure/databricks/kb/libraries/xlsx-file-not-supported-xlrd
:::
>xlrd 2.0.0 以上で読み取れるのは .xls ファイルのみです。
>潜在的なセキュリティの脆弱性により、.xlsx ファイルのサポートは xlrd から削除されました。

```py
df= pd.read_excel('data.xlsx')
print(df)
```
WSL2  vscode で clangd で C++ 補完するメモ(C/C++ for Visual Studio Code を disable が必要)

## 背景

WSL2 で vscode で C++ 補完したくて compile_commands.json 用意したけど認識せぬ... :cry:

VSCode で Windows アプリを Linux 側から cross-compile しているなどで, "C/C++ for Visual Studio Code"(Intellisene 機能だけ?) ではうまく扱えない C/C++ プロジェクトがあることがわかりました.

clangd で補完したいよぉ... 🥺

vscode-clangd 使います.

## 注意

"C/C++ for Visual Studio Code" と vscode-clangd は共存できません(as of 2022/11/04). 
("C/C++ for Visual Studio Code" も中身は clangd 使っているかなとおもったけどちがうっぽ?)

"C/C++ for Visual Studio Code" はとりあえずなんとなく入れている人が多いと思いますのでまずは disable or uninstall しておきます.


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/afc33bcc-34cf-534a-b25e-cd8592368fef.png)

これです.

Intellisense と clangd での補完を切り替えたい場合は... プロジェクトごとに設定切り替えできたりするじゃろか :thinking:)

## セットアップ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/f73f7a26-29ea-210e-f4c9-2b3bdcf837d0.png)

clangd(vscode-clangd)を入れます.

あとは cmake などで `compile_commands.json` を作っておき, プロジェクトの直下か,
`.vscode/c_cpp_settings.json` に `compile_commands.json` のパスを通します!

https://qiita.com/iwatake2222/items/064953735bf244546b24

ありがとうございます. 

## 動作確認

WSL(Linux)で, clang-cl でクロスコンパイルするような構成です. compile_commands.json は

```
{"directory": "/home/syoyo/work/tinyusdz/build-clang-cl-wsl",
 "command": "/home/syoyo/local/clang+llvm-14.0.0-x86_64-linux-gnu-ubuntu-18.04/bin/clang-cl  /nologo -TP -DTINYUSDZ_USE_USDOBJ -DTINYUSDZ_USE_USDVOX -DTINYUSDZ_WITH_AUDIO -DTINYUSDZ_WITH_COLORIO -DTINYUSDZ_WITH_EXR -I/home/syoyo/work/tinyusdz/src  -D_CRT_SECURE_NO_WARNINGS --target=x86_64-windows-msvc -fms-compa  tibility-version=19.11 -imsvc \"/mnt/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/atlmfc/include\" -imsvc \"/mnt/c/  Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30133/include\" -imsvc \"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10  .0.19041.0/ucrt\" -imsvc \"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/shared\" -imsvc \"/mnt/c/Program Files (x86)/Windows Kits/10/Inclu  de/10.0.19041.0/um\" -imsvc \"/mnt/c/Program Files (x86)/Windows Kits/10/Include/10.0.19041.0/winrt\" /Zi /Ob0 /Od /RTC1 -MDd -std:c++14 -Weverything -Werror   -Wno-padded -Wno-c++98-compat -Wno-c++98-compat-pedantic -Wno-documentation -Wno-unused-member-function /FoCMakeFiles/tinyusdz_static.dir/src/asset-resoluti  on.cc.obj /FdTARGET_COMPILE_PDB -c -- /home/syoyo/work/tinyusdz/src/asset-resolution.cc",
"file": "/home/syoyo/work/tinyusdz/src/asset-resolution.cc"
}, 
```

こんな感じのです.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/b2e5b4f6-5ccb-2a32-5e35-462ce1a05325.png)

こんな感じで `_MSC_VER` 認識したり, `Windows.h` へジャンプできました!(WSL の Linux 側から)

## TODO

* [ ] `task.json` から compile_commands.json でのビルドをする方法を調べる(もしくは cmake configure の構成を手動指定して, `compile_commands.json` を VSCode の CMake extension から生成するようにする方法をしらべる)
Rubyの繰り返し処理の速さをベンチマークで調べてみた

# はじめに 
Rubyの繰り返し処理の速さが気になったのでベンチマークで調べてみました。
whileを使うと速いと聞いたので、他の繰り返し処理も使い、実際に検証してみました。
Rubyのモジュールとして提供されているBenchmarkを使用してプログラム実行時のCPU処理にかかった時間を知ることができます。

# 繰り返す内容

1から3,000,000までの範囲の数値を加算していきます。
つまり↓のようになります
1 + 2 + 3 + 4 ・・・・・ 2999998 + 2999999 + 3000000 = 4,500,001,500,000
# コード
```ruby:Ruby
require 'benchmark'

Benchmark.benchmark(Benchmark::CAPTION, 10, Benchmark::FORMAT) do |x|
  x.report("each:         ") { 
    counter = 0
      [*1..3000000].each do |i|
        counter += i
  end
    }
  x.report("times:        ") { 
    counter = 0
      3000000.times do |i|
        counter += i + 1
  end 
    }

  x.report("each range:   ") { 
    counter = 0
      (1..3000000).each do |i|
        counter += i
  end
  }

  x.report("times simple: ") { 
    counter = 0
      (3000001).times do |i|
        counter += i
  end 
  }
  
 x.report("upto:         ") { 
    counter = 0
      1.upto(3000000) do |i|
        counter += i
  end
  }

  x.report("while:        ") { 
    counter,i = 0,1
      while i != 3000001 do
        counter += i
        i += 1
  end
  }
end
```
# 実行結果
```ruby
                 user     system      total        real
each:           0.244779   0.016559   0.261338 (  0.261447)
times:          0.166149   0.000000   0.166149 (  0.166150)
each range:     0.154344   0.000083   0.154427 (  0.154438)
times simple:   0.153153   0.000066   0.153219 (  0.153221)
upto:           0.154999   0.000000   0.154999 (  0.155002)
while:          0.079974   0.000000   0.079974 (  0.079976)
```
# 上記からわかること
whileが一番速く、timesとuptoとeachがほぼ同じということがわかりました。
あとは[*1..3000000]と(1..3000000)やi + 1のように書き方により速度が変わることもわかりました。
特に[*1..3000000]にするとだいぶ速度が落ちるので、(1..3000000)を使うのを意識したいです。
# ちなみに
ガウスの計算(足し算)を使うと計算が**1回**ですむので**2〜3千倍速く**なりました。
ガウスの計算(足し算)の公式：**(初めの数＋最後の数)×個数÷2**
初めの数：1 
最後の数：3,000,000 
個数：3,000,000 
つまり( 1 + 3000000) * ( 3000000 / 2 ) = 4,500,001,500,000
                    3000001 * 1500000 = 4,500,001,500,000
```ruby:Ruby
require 'benchmark'

Benchmark.benchmark(Benchmark::CAPTION, 10, Benchmark::FORMAT) do |x|
   x.report("ガウス計算:") { 
     puts "計算結果は#{ ( 1 + 3000000 ) * ( 3000000 / 2 ) }" 
   }
end
```
# 実行結果
```ruby
                 user     system      total        real
ガウス計算:       計算結果は4500001500000
ガウス計算:       0.000026   0.000000   0.000026 (  0.000026)
```
ガウスは偉大！
バックエンド開発未経験がテスト駆動開発に取り組むまで

# テスト駆動開発とは何か？

- テスト駆動開発とは、実装前にあらかじめテストコードを作成し、そのテストコードに適合するように実装コードを作成していく開発手法です。

https://www.qbook.jp/column/20181009_713.html

## なぜテストコードから先に作成していくのか？

- テストコードから作成することによって、実装コード内のバグ発見を早期に行えるため、手戻りやデバックの時間をできます。
- また、開発するサービスの要件と仕様の理解も早く、実装コードを素早く作成することも可能です。

https://it-trend.jp/development_tools/article/32-0036 

## 実際にテスト駆動開発を取り組んでみて

- テスト駆動開発を実施することで以下のメリットが生まれた

```
1. 事前にテストコードを作成することで、スムーズに実装コードの作成が可能になった。
2. 実装コードで不具合・バグが発生した場合はの手戻りが楽になった。
```

- テスト駆動開発を実施することで以下のデメリットが生まれた

```
1. テストコードの実装・保守に時間がかかる
2. テスト駆動開発を初心者が実施するには慣れるまでに時間がかかる。
　 ※実際に、私もテスト駆動開発でテストコードから作成するのに、少々慣れるまでに時間を費やしました。
```

# 最後に

- テスト駆動開発は開発手法ですが、一度取り組めばスムーズに開発が進むことになるでしょう。
  ※慣れるまでには時間を費やしますが、バックエンドでの開発では実装コード作成時は容易に開発できます。
Visual Studio C++ Build Tools のライセンスが更新されて商用利用でも VS ライセンスなしに OSS  のコンパイルに使えるようになりました

## 背景

もともとは C++ Built Tools(MSVC の CLI tool 群や MSVC header, library など)は, Visual Studio のライセンスがないと使えませんでした.

https://qiita.com/syoyo/items/bd4f81e7803afb5a3d19#c-build-tools-%E3%81%A8%E3%81%AF

いつの間にかライセンス term が更新され OSS ライブラリのビルド(たとえば MFC とかに依存していたりでどうしても MSVC が必要なケースとか)には利用 OK と緩和されてました.

https://devblogs.microsoft.com/cppblog/updates-to-visual-studio-build-tools-license-for-c-and-cpp-open-source-projects/

https://visualstudio.microsoft.com/license-terms/vs2022-ga-diagnosticbuildtools/

自社の proprietary C++ project が, MSVC 必須ではないが, Third party OSS ライブラリがどうしても MSVC でないとビルドできない場合, C++ Build Tools(MSVC)でビルドし, proprietary 部分は llvm-mingw(clang) でビルドするなどすれば, Visual Studio ライセンスなしでいけます!

また, プロジェクト全体が OSS の場合であれば, VS ライセンスなしでも clang-cl と組み合わせてるなどして VSCode で合法的に利用することができます!

## 考察

* MSVC での OSS C/C++ CI ビルドサービスの提供とかにも使ってよさげ?
* WINE でのクロスコンパイル環境での SDK の再配布も楽になるじゃろか :thinking:
[Python]スクリプトで自分自身を呼び出す

# はじめに
例えば，sample.py の中で sample.py を呼び出します．
同じファイルを複数起動させたい時などに使えます．

# コード
```
file = open(__file__, encoding='UTF-8') # 自分自身のファイルをUTF-8で読み込む
exec(file.read()) # ファイルを実行する
```
実行中のスクリプトのパスを__file__で取得できます．
exec()関数はPythonのコードオブジェクトを実行する組み込み関数です．
# 記述例
ここでは，実際に Tkinter (GUIを扱うライブラリ) を用いて「ボタンを押すと複製する」というようなスクリプトを作ってみます．
```
import tkinter as tk

# 新規ウィンドウを開く
def new_window():
    file = open(__file__, encoding='UTF-8')
    exec(file.read())

# ウィンドウの設定
disp = tk.Tk()
disp.title('sample')
disp.geometry('400x300')

#ボタンの設定
fonts = (', 50')
button = tk.Button(disp, text='複製', height=20, width=20, command=new_window, font=fonts, bg='#ffc0cb')
button.pack(fill = 'both', padx=50, pady=100)

disp.mainloop()
```
上記のコードで，ボタンを押すだけで無限にウィンドウを増殖させるスクリプトができます(下図)．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2954334/07b312b4-bf9c-9576-0d0c-a1a101d7134c.png)
それぞれのウィンドウは独立しているので，元のウィンドウを消しても複製させたウィンドウは残り，正常に動きます．
[C#]デバッグ時とかに欲しくなるbyte配列の16進ダンプ


## 本体

```C#
static void DumpHex(byte[] data, int width = 16, int offset = 0)
 => Console.WriteLine(string.Join("\n",
        data
        .Select((a, i) => (i, a))
        .GroupBy(a => (a.i + offset) / width, a => a.a)
        .Select((a, i) => string.Join(" ",
            $"{a.Key * width:X8}",
            $"{"".PadLeft(i == 0 ? offset % width * 3 : 0)}{string.Join(' ', a.Select(a => $"{a:X2}"))}".PadRight(width * 3),
            $"{"".PadLeft(i == 0 ? offset % width * 1 : 0)}{string.Join("", a.Select(a => ' ' <= a && a <= '~' ? (char)a : '.'))}"))));
```

## 使い方

### シンプルな16進ダンプ

```C#
var a = new byte[40];
new Random(1234).NextBytes(a);

DumpHex(a);
```

```:結果
00000000 E5 6C 53 0C C0 BD 3B C9 C4 7E 74 78 9B 11 19 82  .lS...;..~tx....
00000010 2C 1A CE 5B 53 8B 66 65 DB D2 09 DF 80 F2 20 E8  ,..[S.fe...... .
00000020 7E 43 88 8F 97 CB 23 50                          ~C....#P
```

### オフセットや幅を与えた場合

```C#
var a = new byte[40];
new Random(1234).NextBytes(a);

DumpHex(a, width: 32, offset: 60);
```

```:結果
00000020                                                                                     E5 6C 53 0C                              .lS.
00000040 C0 BD 3B C9 C4 7E 74 78 9B 11 19 82 2C 1A CE 5B 53 8B 66 65 DB D2 09 DF 80 F2 20 E8 7E 43 88 8F  ..;..~tx....,..[S.fe...... .~C..
00000060 97 CB 23 50                                                                                      ..#P
```
エラー：@firebase/firestore: Firestore (9.10.0): Connection GRPC stream error. Code: 3 Message: 3 INVALID_ARGUMENT: Invalid resource field value in the request. 


## 問題
```
@firebase/firestore: Firestore (9.10.0): Connection GRPC stream error. Code: 3 Message: 3 INVALID_ARGUMENT: Invalid resource field value in the request. 
```
というエラーが出ました。
`firebase-functions`に関数をデプロイして、それを使ったが、動かない。
ローカルでは動いた。

### 環境
`firebase-functions`のサーバ上

## 解決法
`firebase/firestore`を使わず`firebase-admin/firestore`を使ったら治った。
(サーバ上で`firebase-admin/firestore`の方を使い、clientで`firebase/firestore`を使う)


## 以上です。
Linuxのパイプ、xargsを使おう

## 概要

パイプラインを用いたコマンドとxargsの使い方がよくわからなかったので自分なりにまとめた。

## パイプライン

* パイプ```command1 | command2```はcommand1の出力をcommand2の**入力として**渡す操作。

### 簡単な例

```
echo "hello world!" | tee a.txt
```

これを実行すると、a.txtというファイルに```hello world!```と書き込まれる。

* ```echo```は引数をそのまま出力する
* ```tee```は入力を引数で指定したファイルに書き込む


```echo```で出力する値"hello, world"がファイル出力のコマンド```tee```の入力として渡された。

なお上記の操作は以下のコマンドでもほぼ同じ。

```
echo "hello world!" >> a.txt
```

## xargs


* ```command1 | xargs command2```でcommand1の出力をcommand2の**引数として**渡すことができる。

### 簡単な例

```
echo b.txt | xargs touch
```
これを実行すると、```b.txt```というファイル名のファイルが生成される。
* ```echo```は引数をそのまま出力する
* ```touch```は引数で指定された名前のファイルを生成する



## 便利な使用例

パイプライン```|```と```xargs```を使うことで色々便利なことができる。

### 便利操作1. ディレクトリ内のファイルに対してファイル内検索を行う
#### 準備
現在のディレクトリには(先述した操作で)以下のファイルができている。
```
ls
```
```
>> a.txt b.txt
```
また、```a.txt```内には"hello, world!"という文字列が入っている。

```
grep hello a.txt
```
```
>> hello, world!
```
ついでに```b.txt```には何も文字列は含まれていない。
```
grep hello b.txt
```
```
>> 
```
#### ```ls```の結果に対して```grep``` 
この操作をまとめて、「現在のディレクトリに存在するファイルの中を検索」する操作をしてみる。

```
ls | xargs grep "hello"
```
以下の出力となる。
```
a.txt:hello, world!
```

* lsで受け取ったファイル名を1個ずつ```grep```の引数に渡す
* ```grep```に```a.txt```を受け取った際に一致する文字列を出力する

また、findを用いれば条件に当てはまるファイルのみに対して```grep```を適用することができる。
```
find . -name "*.txt" | xargs grep "hello"
```

* ```find [Path] -name [name]```で指定したディレクトリ内でファイルを名前検索できる。今回は```a.txt``` ```b.txt```の二種が該当する。

#### オマケ

xargsを抜いたらどうなるでしょうか？

```
ls | grep a
```
出力は以下のようになる。
```
a.txt 
```
+ ```grep [Pattern] [File]```という構文においてFileの部分を省略すると、Fileは入力から受け取る。
+ そこに対して```ls```の出力である```a.txt b.txt```を渡したため**その文字列から検索されて**指定したパターン```a```に一致する```a.txt```がgrepによって抽出された。


### 便利操作2. 連番を振ったファイルを作る

```
seq 1 5 | xargs -i touch {}.txt
```
これを実行すると、```1.txt``` ```2.txt``` ```3.txt``` ```4.txt``` ```5.txt```と番号が振られたファイルが生成される。
* ```seq i j```でiからjまでの数を順番に出力する。iを省略したら1からスタートするのでこの場合は```seq 5```でも同じ。
* ```xargs -i```とすると、得られた出力値が```{}```内で受け取ることができる。

### ほか
12種類のxargs使用例が掲載されている記事
https://www.tecmint.com/xargs-command-examples/
MFA 保護で AWS CLI 利用を簡単にする関数

# はじめに

以下のようにMFA保護を強制されたIAMユーザーの場合、MFA認証されていない場合すべてのAWSアクションへのアクセスが拒否されます。
IAMユーザーの認証情報を利用する場合もMFAトークンの入力が必要になり、AWS CLIを利用したい場合は一時認証情報を払い出す必要があります。

https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_examples_iam_mfa-selfmanage.html

FYIにあるように`get-session-token`で払い出した一時認証情報を環境変数へエクスポートを行うのですが、コピペする手間を極力無くすために関数にすることで簡略化できます

## FYI

https://aws.amazon.com/jp/premiumsupport/knowledge-center/authenticate-mfa-cli/

## Require

- AWS CLI
- jq

## コード

.bashrcや.zshrcに追記してご利用ください

```sh
function _aws_get_session_token() {
    local PROFILE_NAME=$1
    local MFA_TOKEN_CODE=$2
    local DURATION_SECONDS=3600

    # プロファイル, mfa
    if [ $# -ne 2 ]; then
        echo "引数が足りません"
        return 1
    fi

    local TARGET_AWS_ACCOUNT_ID=$(aws sts get-caller-identity \
        --query 'Account' \
        --output text \
        --profile $PROFILE_NAME \
        )

    local SERIAL_NUMBER=$(aws sts get-caller-identity \
        --query 'Arn' \
        --output text \
        --profile $PROFILE_NAME \
        | sed -e s/:user/:mfa/g
        )

    local SESSION_TOKEN=$(aws sts get-session-token \
        --duration-seconds ${DURATION_SECONDS} \
        --serial-number $SERIAL_NUMBER \
        --token-code $MFA_TOKEN_CODE \
        --profile $PROFILE_NAME \
        )

    echo "${TARGET_AWS_ACCOUNT_ID} MFA Authentication Success. (${SERIAL_NUMBER})"

    _unset_aws_session_token

    export AWS_ACCESS_KEY_ID=$(echo $SESSION_TOKEN | jq -r .Credentials.AccessKeyId)
    export AWS_SECRET_ACCESS_KEY=$(echo $SESSION_TOKEN | jq -r .Credentials.SecretAccessKey)
    export AWS_SESSION_TOKEN=$(echo $SESSION_TOKEN | jq -r .Credentials.SessionToken)
}

function _unset_aws_session_token() {
    unset AWS_ACCESS_KEY_ID
    unset AWS_SECRET_ACCESS_KEY
    unset AWS_SESSION_TOKEN
}

# エイリアスコマンド
alias mfa_session_token="_aws_get_session_token my_profile_name"
```

## 利用方法

MFAトークンを引数としエイリアスコマンドを実行します。

```bash
mfa_session_token NNNNNN
```

一時認証が成功すれば以下が出力されます。

```bash
123456789012 MFA Authentication Success. (arn:aws:iam::123456789012:mfa/daisuke-araki)
```
自宅のPCでGPUを使用して深層学習するための環境構築

## 自宅のPCでGPUを使用して深層学習するための環境構築

数年前に元々ゲーム用に買った、デスクトップPC(windows)を深層学習ができるように環境構築した時の備忘録。
目的としては、Tensorflow 2.6使用時にGPUを認識させて学習をすること。
参考サイト:https://www.kkaneko.jp/cc/tools/index.html#S4

【自宅の環境】
●GPU:GeForce GTX 1060
●CUDA:11.4
→「nvcc -V」で確認可能
●cuDNN:8.2.4
→「cudnn_version.h」のソースコードから確認可能

【関連するツールの説明】
●CUDA:CUDA(Compute Unified Device Architecture)とはNVIDIAが開発・提供している、GPU向けの汎用並列コンピューティングプラットフォーム(並列コンピューティングアーキテクチャ)
●cuDNN:ディープニューラルネットワークでの使用を目的とした、GPUアクセラレーション型のプリミティブのライブラリ。

【手順概要】
0.事前確認:TensorFlowのバージョンと対応する各ツールキットのバージョンを確認する(例:Tensorflow:2.6→ CUDA:11.4 or 11.3,cuDNN:8.2系列)
1.マイクロソフトC++ビルドツール（Build Tools for Visual Studio 2019）のインストール
2.NVIDIAグラフィックスドライバのインストール
3.NVIDIA CUDA ツールキットのインストール
4.NVIDIA cuDNN のインストール
5.Nvidia CUDA コンパイラ (NVCC)の動作確認
(6.pythonの環境構築)
7.Tensorflow等の深層学習関連のライブラリをインストール

上記の方法で、TensorflowやPytorchを使用する際にGPUを使用して学習をさせることができた。
しかし、かなり前のGPUのためあまり学習速度の改善はなかった。

今だと、Google ColaboratoryやGCPで環境を構築するのがお手軽で早いかもしれない。
useStateの使用例

# はじめに
2022月10月にデータアナリストからwebエンジニアにジョブチェンジした者です。
案件でreactに触れる機会があったのでその際に学んだことをアウトプットしていければと思います。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [useStateとは](#Chapter1)
1. [useStateの使用例](#Chapter2)
1. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# useStateとは
状態を扱うための※フックで、これを使用することでコンポーネントが内部状態を持ってその状態変化に応じて表示を変更することができます。
使用する際には下記の書き方をします。
```
const [状態, 更新関数] = useState(初期状態)
```
※フック: 関数コンポーネント中で状態やライフサイクルを扱うための機能

<a id="#Chapter2"></a>
# useStateの使用例
## サンプルコード
```react
import { useState } from "react";

export const Counter = () => {
  const [count, setCount] = useState(1);

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count - 1)}>-</button>
      <button onClick={() => setCount(count + 1}>+</button>
    </div>
  );
};

export default Counter;
```
## 表示
![スクリーンショット 2022-11-04 1.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1549822/089aaa88-0430-f47d-2f3d-232ee50e250d.png)

## 説明
初期表示するカウントは1としています。
カウント表示の下に+ボタンと-ボタンが設置されており、クリックされた時にそれぞれにStateを更新する関数が実行されるように設定しています。

```react
<button onClick={() => setCount(count - 1)}>-</button>
```

```react
<button onClick={() => setCount(count - 1)}>-</button>
```

処理としては、現在のcountに対して1を足すか引くかです。
このsetCount関数が呼ばれてcountが更新されると、再描画が発生して画面も変化します。
+ボタンを押すと、現在の表示から1が足された値に、ーボタンを押すと現在の表示から1が引かれた値が表示されます。

このようにuseStateを使えば簡単にボタン等を押したときに表示が変わる処理を実行するができます！



<a id="#reference"></a>
# 参考文献
- [TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発](https://www.amazon.co.jp/TypeScript%E3%81%A8React-Next-js%E3%81%A7%E3%81%A4%E3%81%8F%E3%82%8B%E5%AE%9F%E8%B7%B5Web%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E9%96%8B%E7%99%BA-%E6%89%8B%E5%B3%B6-%E6%8B%93%E4%B9%9F/dp/4297129167)
dockerで環境変数を設定する方法3パターン

### Dockerfileに書く

```Dockerfile
FROM golang:1.19.2-alpine3.16

ENV GOPATH /go
ENV GO111MODULE on
ENV ROOT=/go/src/app

RUN mkdir ${ROOT}
WORKDIR ${ROOT}
(以下略
```
ここに書くとDockerfileのコマンドでサーバーを立ち上げる時の初期設定で参照できるし、コンテナがたった後の環境変数を参照することもできる。
主にコンテナ立ち上げ時に設定したい変数にいい。
他のコンテナからは参照できない点に注意

### docker-compose.ymlに書く

```yml
version: "3"
services:
    db:
        build: ./mysql
        environment:
            MYSQL_ROOT_PASSWORD: root
            MYSQL_DATABASE: db
            MYSQL_USER: user
            MYSQL_PASSWORD: pw
        command: mysqld --character-set-server=utf8 --collation-server=utf8_general_ci
        ports:
            - 3306:3306
        volumes:
            - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnfl
```

Dockerfilleに書く場合と基本的に同じ。
ただ、設定しておくとimage側の初期設定をしてくれたりするケースがある(主にDB)。
[docker hub mysql imageの例](https://hub.docker.com/_/mysql)
[docker docs 環境変数をコンテナ内に通す](https://docs.docker.jp/compose/environment-variables.html#pass-environment-variables-to-containers)
こちらも他のコンテナからは参照できない

### .envに書く
```.env
MYSQL_ROOT_PASSWORD=root
MYSQL_DATABASE=db
MYSQL_USER=user
MYSQL_PASSWORD=pw
```
`.env`に書くと、docker-composeで立ち上がる**コンテナ全てで共通して使える**。
DBに関する設定のうち、アプリケーションサーバーとDBで共有したい設定とかに便利。
KEY=value形式で書く。.envは`docker-compose.yml`と同じ階層に置くのが無難。

[docker docs .envについて](https://docs.docker.jp/compose/environment-variables.html#env)

### 環境変数競合時の優先順位

> 複数のファイルで同じ環境変数がある場合、Compose は使用する値を選ぶため、以下の優先度で使います。
　1. Compose ファイル
　2. シェル環境変数
　3. 環境変数ファイル
　4. Dockerfile
　5. 変数が定義されていない
 引用: [docker docs docker compose run の環境変数を設定](https://docs.docker.jp/compose/environment-variables.html#docker-compose-run)

シェル環境変数は、`docker compose run -e DEBUG=1`みたいにコマンドオプションで渡せる環境変数のこと。
優先度を覚えてうまくやりくりするよりも、変数名が被らないようにする方がおすすめ。
[Flask] [備忘録]RuntimeError: Working outside of application context.でツボった


こちらの記事を見ながらFlaskとSQLalchemyを用いてログイン機能を作成していたところ以下のようなエラーが出て2時間くらいツボったのでその解決方法を備忘録的にメモしておきます！もっといい解決方法知っている方がいましたらコメントで教えていただけますと幸いです！
https://qiita.com/yuuki-h/items/47135ea7a07d0c994275

```
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
the current application. To solve this, set up an application context
with app.app_context(). See the documentation for more information.
```

ターミナルで以下のコマンドを順に実行してみましょう！
```:ターミナル
% python
>>> from app import app
>>> from app import db
>>> with app.app_context():
...    db.create_all()
>>> exit()
```
これで解決しました！
```
>>> with app.app_context():
...    db.create_all()

```
の2行目はtabキーでインデントを揃えるようにしてください！