OmniAICreator/Qiita-1.07M huggingface dataset:
ActionView::Template::Error (wrong number of arguments (given 3, expected 2; required keyword: object)):というエラーが起きたときの対処方法

今回は自分が開発していく中で解決するのに時間が掛かった問題に直面したのでメモを残しますー

今回時間が掛かった問題はタイトルにも書かれているが「ActionView::Template::Error (wrong number of arguments (given 3, expected 2; required keyword: object)):」という問題について！


Rubyのバージョンが3.0.1だということが前提で書いていくよー
この後、バージョンを変更するけどね。


【そもそもこのエラーはどういう意味なのか】
これは調べれば出てくると思うけどこれは「本来引数を２つ欲しいのに対して３つ送られてきている」ことが原因でこのようなエラーが起こるみたい。
私のときのエラーはこんな感じです！

ActionView::Template::Error (wrong number of arguments (given 3, expected 2; required keyword: object)):
    42: 
    43:           <div class="field">
    44:             <%= f.label :profile_image, "プロフィール画像", class: "label" %>
    45:             <%= f.attachment_field :profile_image, class: "input" %>
    46:           </div>
    47: 
    48:           <%= f.submit "更新", class: "button is-success" %>

勝手な推測だけど４５行目のattachment_field :profile_image, class: "input" の２つの他に３つ目の引数が送られてきたのかなと思っていました。

【解決方法】
ということはコントローラのどこかを変えればいいんじゃないの？と思うかもしれませんが実際は違いました。
これは個人的にも驚きました…これのせいで時間が多く掛かった

解決としてはRubyのバージョンを下げます。
Rubyのバージョンが3.0.1の場合は2.6.7にしてください！（私はこれで解決しました）
~~（コマンドは近々まとめて別記事か更新いたします）~~

Rubyのバージョンを下げる方法です！更新しました！
https://qiita.com/Minonnn/items/165ab1d983ed14e0e3e4


【原因】
詳しい原因は分かりませんがおそらくはrefileっていうライブラリが原因で処理が進んでいなかったのではないかなと思っています。（そのような記事を見かけました）

でも実際にバージョンを下げただけで解決したので何かしらの処理が3.0.1に対応していなかったのが原因だという可能性が高いですねー

【最後に】
久々の投稿でした。週１ぐらいはせめて投稿したいですが開発する方に集中してしまいますね。
頑張りますー

記事自体すごい見にくいので書き方を覚えたい


以上！！
SES企業 ExcelVBA研修 アウトプット

##入社したSES企業でのExcelVBA研修
下記の書籍に目を通しながらVBAの操作や入力を行います。作成したモジュールのストックが増えてきたら講師エンジニアの方に作成したモジュールの解説をしていきます。ここでのポイントは、作成したモジュールがちゃんと実行されるか、コードの説明が相手の理解できる内容になっているか、だと考えました。

##ExcelVBAでメモした内容
**データ型の宣言** 　ExcelVBAでは、まず変数のデータ型を宣言します。
**Byte型** 　　0〜２５５までの整数
**Integer型**　-32767〜32767までの整数
**Long型**　　-2147483648〜2147483647までの整数
**Single型** 　1.401298×10-45〜3.402823×10＋58
　　　　-3.402823×10+38〜-1.401298×10-45までの整数
**Double型**　4.94065645841247×10-324〜1.79769313486231×10-324
　　　　-1.79769313486231×10-324〜-4.94065645841247×10-324までの実数
**String型**　漢字、ひらがな、カタカナ、数字、英字、記号、などの文字列
**Date型**　日付と時刻を扱うデータ　#5/31/2010#　
**Boolean型**　TrueとFalseの２つの値だけを扱うデータ
**Value**　　　文字列
**PublicConst**　他モジュールで変数が使用可能です。
**変数()**　　　要素の数が不明という意味です。
**UBound**　要素の中で最大値を引っ張ってきます。
**ReDim**　　要素数の決定
**ActiveCell**　有効なセル
**Step1**　繰り返し処理を行う変数に1を加算していきます。
**Visible**　falseで非表示、trueで再表示　
**パス**　　プロパティで表示されたパス＋¥ディレクトリ名¥　
**Dir関数**　まだ返していないファイルを順に返します。
**<>ok**　ok以外だと処理が続きます。
**Until**　〜まで
**With**　変数を省略します。
**Bold**　太字
**Thin**　細い線
**Formula**　セルに入っているデータを取得します。
**シングルクォーテーション**　コメントアウト
**Application.WorksheetFunction**　関数を使用する時に使います。



##参考書籍
はじめての最新 Excel VBA[決定版]
https://www.amazon.co.jp/dp/B086YNHJNL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1
Languages for Bootstrap 3 を使って言語名・国旗をタグで書く

故あって言語で切り替わるページを書いたのですが、その際、言語名＋国旗をタグで表現できるCSSライブラリ <a href="http://usrz.github.io/bootstrap-languages/">Languages for Bootstrap 3</a> を見つけたので紹介します。とても便利です。

##インストール

Languages for Bootstrap 3 のインストールは bower を使います。

```sh
bower install bootstrap-language
```
必要なファイルは **languages.min.css** および **languages.png** です。これらのファイルをページからアクセスできるディレクトリへコピーします。同一ディレクトリである必要があります。

##ライブラリの読み込み

使いたいページで .css ファイルを読み込みます。

```html
<link href="css/languages.min.css" rel="stylesheet" />
```



##言語タグ

タグで言語を指定します。言語は ``lang`` で指定します。

```html
<span class="lang-sm lang-lbl" lang="ja"></span>
```

表記方法は `lang-lbl`, `lang-lbl-en`, `lang-lbl-full` クラスで指定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141780/521b02aa-dab4-0395-9813-87b07df9c992.png" width="150" alt="現地語、英語、現地語＋英語での表記"/>

`lang-lbl` は現地語で、`lang-lbl-en` は英語で、`lang-lbl-full` は英語＋現地語での表記を指定できます。

```html
<span class="lang-sm lang-lbl" lang="ja"></span>
<span class="lang-sm lang-lbl-en" lang="ja"></span>
<span class="lang-sm lang-lbl-full" lang="ja"></span>
```
サイズは ``lang-xs``, ``lang-sm``, ``lang-lg`` で指定します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141780/ae209bad-b86d-2ab8-cba8-b1b85723fa31.png" width="130" alt="アイコンのサイズ変更">

```html
<span class="lang-xs lang-lbl" lang="ja"></span>
<span class="lang-sm lang-lbl-en" lang="ja"></span>
<span class="lang-lg lang-lbl-full" lang="ja"></span>
```

このタグのおかげで言語切り替えメニューがきっちりかけました。感謝がてら記事を書いてみました。
GoでABC205 Dを２つのやり方で解く

## 概要

[ABC205 D問題](https://atcoder.jp/contests/abc205/tasks/abc205_d)をGoで二つのやり方で解きます。一つは公式解法で、もう一つは「答えで二分探索」による解法です。ちなみに、サイトに掲載されている解法には、クエリをソートして二分探索なしで解くやり方がありますが、TLE(Time Limit Exceeded) エラーが解消できなかったため、断念しました。

```math
\def\middlemid{\;\middle|\;}
\def\set#1{\left\{{#1}\right\}}
\def\setin#1#2{\left\{{#1} \middlemid {#2}\right\}}
\def\sub#1#2{{#1}_{#2}}
```

## 公式の想定解法

### ざっくりした方針

$\sub{A}{i}$ごとにその$\sub{A}{i}$より小さく、かつ$A$に含まれない正の整数の個数を$\sub{C}{i}$に記録します。例えば、$A=\set{1,5,6,7}$とすると、$\sub{C}{2}$は、$\sub{A}{2}=6$より小さく、かつ$1,5$を含まないため、$3$となります。
少し飛躍がありますが、答えの$A$に含まれない正の整数を小さい方から数えて$K$番目の数は, その$K$に近い$\sub{C}{i}$を探して、うまく補正すると求めることができます。

### コード

```go
package main

import (
	"bufio"
	"fmt"
	"os"
)

var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)

func abs(x int) int {
  if x > 0 {
    return x
  } else {
    return x * -1
  }
}

func isOK(a *[]int, index, key int) bool {
	return (*a)[index] >= key
}

func binarySearch(a *[]int, key int) int {
	ng := -1
	ok := len(*a)

	for abs(ok-ng) > 1 {
		mid := (ok + ng) / 2

		if isOK(a, mid, key) {
			ok = mid
		} else {
			ng = mid
		}
	}
	return ok
}

func main() {
	defer writer.Flush()

	var n, q int
	fmt.Fscan(reader, &n, &q)

	var a = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}

	var c = make([]int, n)
	for i := 0; i < n; i++ {
		if i == 0 {
			c[i] = a[i] - 1
			continue
		}
		c[i] = c[i-1] + a[i] - a[i-1] - 1
	}

	var k = make([]int, q)
	for i := 0; i < q; i++ {
		fmt.Fscan(reader, &k[i])
	}

	for i := 0; i < q; i++ {
		ans := 0
		if c[n-1] < k[i] {
			ans = k[i] - c[n-1] + a[n-1]
		} else {
			idx := binarySearch(&c, k[i])
			ans = a[idx] - 1 - (c[idx] - k[i])
		}
		fmt.Fprintf(writer, "%d\n", ans)
	}
}
```

## 「答えで二分探索」による解法

### ざっくりした方針

ある正の整数 $m$ から $A$に含まれる$m$以下の整数の個数を引いた数は、$m$以下の$A$に含まれない正の整数の個数になります。これが「答え」なので、あとは二分探索で「答え」が$k$以上を満たす最小の$m$を求めることができます。

### コード

```go
package main
 
import (
	"bufio"
	"fmt"
	"math"
	"os"
)
 
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
 
const inf = math.MaxInt64
 
func abs(x int) int {
	if x < 0 {
		return x * -1
	} else {
		return x
	}
}
 
func isOK(a *[]int, index, key int) bool {
	return (*a)[index] > key
}
 
func binarySearch(a *[]int, key int) int {
	ng := -1
	ok := len(*a)
 
	for abs(ok-ng) > 1 {
		mid := (ok + ng) / 2
 
		if isOK(a, mid, key) {
			ok = mid
		} else {
			ng = mid
		}
	}
	return ok
}
 
func main() {
	defer writer.Flush()
 
	var n, q int
	fmt.Fscan(reader, &n, &q)
 
	var a = make([]int, n)
	for i := 0; i < n; i++ {
		fmt.Fscan(reader, &a[i])
	}
 
	for i := 0; i < q; i++ {
		var k int
		fmt.Fscan(reader, &k)
		ng := 0
		ok := inf
 
		for abs(ok-ng) > 1 {
			mid := (ok + ng) / 2
			idx := binarySearch(&a, mid)
 
			if mid-idx >= k {
				ok = mid
			} else {
				ng = mid
			}
		}
 
		fmt.Fprintf(writer, "%d\n", ok)
	}
 
}
```
初学者がGo言語　map typesを勉強したよ

#mapとは何ぞや
Pythonでいう『辞書』と同じ、キーと値があるアレね。コードで書くと

```Python
dict = {"佐藤": 1, "加藤": 2, "武藤": 3}
```
それぞれ
"佐藤" "加藤" "武藤" = key
"1"  "2"  "3" = value
キーや値を取得したり追加、削除できるけど割愛します


#Goでやってみる

環境：Go公式にあるPlaygroundを使用。環境構築要らず動作確認に便利です。（https://play.golang.org/）

```Go
package main

import (
	"fmt"
)

func main() {
	m := map[string]int{"すいか":100, "りんご":200}
	fmt.Println(m)              
	fmt.Println(m["すいか"])        //すいか　の"value"を取得
	
	m["ぶどう"] = 300               //新しくkey,valueを追加
	fmt.Println(m)
	
	v, bool := m["りんご"]          //変数(bool)でtrue, falseを返す
	fmt.Println(v, bool)          //true判定 
	v1, bool1 := m["梨"]
	fmt.Println(v1, bool1)        //keyが存在しないので false
}


```

初歩の初歩だがここまで！
関連で make new スライス 配列等あるので勉強してから投稿します。
HTML Template

# HTML Template

## HTMLから別ファイルのテンプレートを読み込む最もシンプルな方法

- 標準機能のみ
- ライブラリ不要

### HTML `index.html`

```html
<!DOCTYPE html>
<html>
<head>
<title>Welcome</title>
<style>
body {
  width: 35em;
  margin: 0 auto;
  font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
<script defer="" src="loader.js"></script>
</head>
<body>
<h1>An error occurred.</h1>
<div>Sorry, the page you are looking for is currently unavailable.<br/>
Please try again later.</div>
<div id="template-header"></div>
<div><em>You be peaceful.</em></div>
</body>
</html>
```

### HTML template `template.html`

```html
<template id="inline-header">
  <div><h2>Internal server failed to eat spice curry.</h2><div>
</template>
```

### JavaScript `loader.js`

```javascript
class Loader {
  action() {
    const templates = document.querySelectorAll('div[id^=template-]');
    templates.forEach(template => {
      const inline = template.id.replace(/template/, 'inline');
      const fragment = document.querySelector(`#${inline}`);
      template.append(fragment.content);
    });
  }
  trigger() {
    fetch('template.html')
    .then(res => res.text())
    .then(content => {
      document.body.innerHTML += content;
      this.action();
    });
  }
}
window.addEventListener('DOMContentLoaded', () => new Loader().trigger());
```

このコードは、特定のアクションをトリガーとして実行される Loader クラスを定義しています。主な目的は、template.html からテンプレートを取得し、そのテンプレートをページの特定の場所に挿入することです。

### 説明

1. Loader クラスは、テンプレートのロードとアクションの実行を担当します。

1. action() メソッドは、テンプレートをロードし、特定の要素に挿入する処理を行います。

1. querySelectorAll('div[id^=template-]') は、id 属性が "template-" で始まるすべての div 要素を取得します。つまり、id 属性が "template-" で始まる全ての div 要素がテンプレートの要素となります。

1. templates.forEach(template => { ... }) は、取得したテンプレートの要素ごとに処理を行います。

1. template.id.replace(/template/, 'inline') は、テンプレートの id 属性の "template" を "inline" に置き換えます。これにより、テンプレートの id から対応するインラインテンプレートの id を生成します。

1. document.querySelector(#${inline}) は、生成されたインラインテンプレートの id を使用して、対応する要素を取得します。

1. template.append(fragment.content) は、取得したインラインテンプレートの内容をテンプレート要素に追加します。

1. trigger() メソッドは、テンプレートのロードとアクションの実行をトリガーします。

1. fetch('template.html') は、"template.html" を取得するための Fetch API を使用します。

1. .then(res => res.text()) は、レスポンスをテキスト形式で解析します。

1. .then(content => { ... }) は、解析されたテキストコンテンツを取得し、次の処理を行います。

1. document.body.innerHTML += content は、取得したテキストコンテンツを現在のページの HTML の末尾に追加します。

1. this.action() は、テキストコンテンツの追加後に action() メソッドを呼び出し、テンプレートのロードと挿入を実行します。

1. window.addEventListener('DOMContentLoaded', () => new Loader().trigger()) は、ページのコンテンツがすべて読み込まれた後に trigger() メソッドを呼び出します。これにより、テンプレートのロードと挿入が開始されます。

テンプレートがシンプルになることに焦点を当てました。
fishのaliasを設定

#設定ファイル作成、移動

```
touch ./.config/fish/config.fish
vim ./.config/fish/config.fish
```

#設定
自分の設定はこんな感じです。
もっといい感じの設定があったら教えていただきたいです。

```
#Git
alias g='git'
alias gb='git branch'
alias gc='git commit'
alias gc='git checkout'
alias ga='git add'
alias gp='git push'

#Fish

alias hs='history search'
alias ths='thistory search'


```

#保存

```
. ./.config/fish/config.fish
```

#次回からも使用できるようにする

```
funcsave fish_config
```
Oracle実験室 / Oracle Database 19c (19.3) Database Configuration Assistant (DBCA) 

私が勉強中のOracle DatabaseについてVirtualBox環境でのセットアップ・各種操作等を行った際のメモです。

# 前書き
- 記事一覧 [Oracle実験室 / Oracle Restart環境構築 (19.3)](https://qiita.com/Que-sera-sera/items/df2a5f53953ea500f333)
- 前の記事 [Oracle実験室 / Oracle Database 19c (19.3) インストール](https://qiita.com/Que-sera-sera/items/02a77134bb95c5d8e202)

# DBCA起動
- oracleユーザーでGUIログインします。
- DBCAコマンドを実行します。

```bash
$ su - oracle
$ dbca
```

## データベース操作の選択
- インストール直後のためデータベースは存在しません。
そのため、ここでは「データベースの作成」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294043/4c34f2a2-cce0-883f-ea8d-7f0f15c77a7b.png)

## データベース作成モードの選択
- 「標準構成」を選択します。
- グローバル・データベース名を指定します。<br>
<font color="blue">今回は"ORCLCDB"を指定しました。</font>
- 「記憶域タイプ」を指定します。<br>
<font color="blue">Grid Infrastructureが正常にセットアップされている場合は「記憶域タイプ」に「自動ストレージ管理(ASM)」が自動で初期設定されると思います。
今回はデフォルトで選択されるASMをそのまま指定しました。</font>
- データベース・ファイルの位置を指定します。<br>
<font color="blue">今回はデフォルト値を使用します。</font>
- データベース文字セットを指定します。<br>
<font color="blue">今回は"AL32UTF8"を指定しました。<br>文字セットは後から変更できないので慎重に選択する必要があります。</font>
- 管理者パスワードを指定します。<br>
<font color="blue">昔ながらの"manager”は指定できないので任意のパスワードを指定する必要があります。</font>
- 「コンテナ・データベースとして作成」を選択します。<br>
<font color="blue">今回はプラガブルデータベースも同時作成するので「プラガブル・データベース名」を指定します。</font>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294043/240ba4f3-98ba-8c6d-d3c2-12e3e19e1bb7.png)

## サマリー
- 問題がなければデータベース作成の準備画面が表示されます。
- [終了]をクリックします。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294043/4169fcd6-de61-575c-c17c-e0f9af4f4584.png)

## 進行状況ページ
- しばらくお待ちください・・・。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294043/a4b440a7-a9e7-613a-740a-57955cb670a9.png)

## 終了
- データベースが作成が完了したら[閉じる]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/294043/d6a3aa6f-7bd5-2e87-0990-2abb31171993.png)
3dsmax Script ファイル操作系

https://help.autodesk.com/view/3DSMAX/2017/ENU/?guid=__py_ref_class_max_plus_1_1_file_manager_html


##■フォルダの選択

~~~
strLoadPath = getSavePath caption:"フォルダの選択" initialDir:(getDir #maxroot)

if strLoadPath == undefined then
(
　print "Cancel"
)else(
　print ("OUTPUT FOLDER > " + strLoadPath)
)
~~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/66ad50b9-9739-700a-8c36-dfb6659307c6.png)



##■現在のシーンのファイル名を取得する方法]
https://help.autodesk.com/view/3DSMAX/2015/JPN/?guid=__files_GUID_965448B0_2B83_4E09_BE0A_8B159401182B_htm

~~~
sceneName = maxFilePath + maxFileName
~~~


##■ファイルの未保存の確認

~~~
if maxfilename =="" do
(
	messagebox "ファイルを保存してください" title:"作業確認"
	return 0
)
~~~



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166558/5da18193-ad36-8d1e-40f3-2834e2c7a4df.png)



https://help.autodesk.com/view/3DSMAX/2017/JPN/?guid=__files_GUID_624D3D05_B15D_4A97_9F15_DA35CDB0DDD2_htm
React応用


### <font color="red">※ほとんど目次のみです（クリックしてもGoogleに飛ぶだけです）。<br>以下、投稿済み記事です。</font>

- React応用 - TypeScriptをかじる1 - 超基本


# 目次

- [React応用 - PartX - 環境構築(入門の各記事で設定した環境を纏めて行う)](https://www.google.com/)
- [React応用 - PartX - Firebaseとの連携(データRead)](https://www.google.com/)
- [React応用 - PartX - Firebaseとの連携(データ登録・更新・削除)](https://www.google.com/)
- [React応用 - PartX - 一覧とページネーション](https://www.google.com/)
- [React応用 - PartX - カスタムフックを作る](https://www.google.com/)
- [React応用 - PartX - React > Netlify > Lambda > Python > MySQLどこまでいけるんだろう](https://qiita.com/yokowake12345/items/46a4626164f514cb6039)

# Typescriptをかじる
- [React応用 - TypeScriptをかじる1 - 超基本](https://qiita.com/yokowake12345/items/557e7410c7215fe60bb0)
 
# Tips
- [React応用 - Tips - VSCode便利機能](https://www.google.com/)
- [React応用 - Tips - React Nativeの環境構築](https://www.google.com/)
- [React応用 - Tips - Atomic Designって何？](https://www.google.com/)
- [React応用 - Tips - StoryBookに触れてみよう](https://www.google.com/)


<!--
https://qiita.com/naruto/items/fdb61bc743395f8d8faf
https://qiita.com/e99h2121/items/1a4b59dad06aa4411ad7
https://qiita.com/mikan3rd/items/b9ac6125b1f14175677e
-->
SQL serverでのテーブル定義をクエリで調べる

# SSMSでテーブル定義を調べるのが面倒！！

SSMSことSQL server Management Studioはとても便利です。
マウスだけで基本的に操作が完結できるので、
SQL初心者にとっても非常に敷居の低いSQLクライアントとなっています。

テーブル定義も「デザイン」から、閲覧&編集できるのもとても重宝します。
ただし時々この設定をエクスポートしたい欲求に駆られます。
日常的にクエリで調べる癖がついていないので、
メモ代わりにクエリでテーブル定義を抽出する方法を残します。

# テーブル名を指定して、クエリを実行するだけ

変数@TABLENAMEにテーブル名を書き換えて、
クエリを実行してください。
そのテーブルの列名やデータ型や桁数などを表示します。

```SQL
DECLARE @TABLENAME NVARCHAR(50)
SET @TABLENAME = 'テーブル名' --テーブル名を指定してください。

SELECT c.column_id AS ID
	,t.name AS テーブル名
	,t.type AS タイプ
	,c.name AS 列名
	,n.name AS データ型
	,c.max_length AS 桁数
	,c.scale AS 小数点桁数
	,c.is_nullable AS 'NULL可否'
	,t.create_date AS 作成日
	,t.modify_date AS 更新日
	FROM sys.objects t
inner join sys.columns c on t.object_id = c.object_id
inner join sys.types n on c.system_type_id = n.system_type_id
where t.type = 'U' AND t.name = @TABLENAME
order by t.name, c.column_id;

```
元C#使いがPythonエディターを選定してみる

Pythonで開発しよう！と思い立ってはみたもののエディタの選択肢が多く、どれを使うか迷いました。

C#ならVisual Studio一択なんだけどなあなどと愚痴をこぼしながら、Pythonのエディタを調べてみましたところ、

PyCharm,Atomなど多数のエディタが存在しており、調べた限り機能としてはどれもあまり変わらない印象を受けましたのでとりあえず有名どころをいくつか触ってみました。

# 試したエディタ-
### Atom
https://atom.io/

GitHub社が開発したオープンソースのエディターで、評判も良いのでしばらく使ってみました。

使ってみた感想

パッケージを追加することで自分好みに改良できて、機能やインターフェースも申し分なく、しばらく開発用に使用していましたが、どうにも貧弱な4Gのメモリでは少し動作が重いと感じました。設定次第ではもう少し軽くなるのかもしれません。

### PyCharm
https://www.jetbrains.com/pycharm/

Jetbrain社のPython専用のIDEです。
自動整形機能やPEP8の規約違反の指摘など、Pythonで開発する上で必要な機能が一通り内包されているPython専用のIDEです。
ただし、無料版のCommunity EditionではWeb開発やDBのアクセスなどは制限されているため、Web開発する上ではProfessional版を購入する必要がありそうです。

使ってみた感想

自動整形機能やPEP8のコード規約違反など、必要な機能が一通り標準搭載されているため、ほとんど手を施さなくても開発に取りかかれました。特にパッケージ管理に関しては、GUIからパッケージを選択・インストールできたり、インストール済みのパッケージがリスト化されていて便利だと思いました。

### Visual Studio Code
Visual Studio Code - Code Editing. Redefined

https://code.visualstudio.com/

Microsoftが開発したエディターで、Atomと同じように必要に応じて拡張機能を導入して自分好みにいじれます。

使ってみた感想

最初はある程度自分で調べて拡張機能の追加や設定の変更が必要なので挫折しかけたものの、慣れてくると自動で仮想環境実行したり自動リファクタリングをさせるなど快適に開発できるようになりました。
また、2019年10月の更新でデフォルトでJupyter Notebookの編集や実行が可能となるなど、ますますVSCodeの魅力は高まっていると感じます。

# 結論
AtomやVSCodeなどの汎用的なエディターの使い方を身につけることで、Pythonにかかわらず様々な開発に利用できるため、このどちらかで選ぶのが良いと思いましたので、Visual Studio Codeを使うことにしました。PyCharmも魅力的ですが、何分Web開発にはProfessional版である必要があることと、他の言語のエディターとしては利用できないということなので候補から外しました。
はじめてC++で画面を作ろう! (8) アイコン編

#26.アプリに「アイコン」を設定しよう!!
mainwindow.uiの__windowIcon__プロパティにアイコン画像(.ico)を設定しても、起動時には、設定されているが、肝心のアプリ(.exe)には、反映されない。

Windows10の場合は、__リソースファイル(.rc)__を作って、これをCMakeにいれてコンパイルすると、アイコン画像(.ico)がアプリ(.exe)に組み込まれる。

#27.アイコン画像(.ico)を作ろう!!
Windows10の標準の「__ペイントブラシ__」では、.icoファイルが作れない。
そこで、フリーの画像編集ソフトで有名な「__GIMP__」で、.icoファイルを作る。

えっ、__GIMP__を持っていない?
__MSYS2__を使えば、簡単にインストールができる!!

```
pacman -S mingw-w64-x86_64-gimp
```

これで、"mingw64\bin"フォルダー傘下に"__gimp.exe__"がインストールされているハズだ。

[1] GIMPで、__[ファイル | 新しい画像]__をクリック
[2] キャンパスサイズ(画像サイズ)を幅(W):__24__、高さ(H):__24__、__px__で、[OK]ボタンをクリック

[3] アイコンの絵を書いたら、__[ファイル | 名前を付けてエクスポート]__をクリック

[4] 名前(N):"__icon.ico__"を定義して、__[エクスポート]__ボタンをクリック
[5] 「画像をWindowsアイコンでエクスポート」画面で、「8bpp, __1bitアルファ__、256色パレット」ぐらいを設定して、__[エクスポート]__ボタンをクリック

この__.icoファイル__ を 今、作成中のQtプロジェクトのフォルダーにコピーしておきましょう!

画像を__透過したい__場合は、__RGBA__ アルファチャンネル形式にして、透過する色を設定するば、出来る。上記の__「1bit アルファ」__とは、この__透過__設定の事

また、__GIMP__では、__マルチサイズ__のアイコンにも対応できる。
(極小アイコン: 16x16 あまり使われない) 
タイトルバー用: __24x24__
小アイコン: __32x32__
(中小アイコン: 48x48 あまり使われない)
中アイコン: __64x64__
(中大アイコン: 128x128 あまり使われない)
特大アイコン: __256x256__
Windows10は、24x24しかないと、__エクスプローラー__が自動で拡大/縮小して、アイコン画像を作ります。

特大アイコン表示で、ぼけた画像にしたくない時は、マルチサイズで、画像を作って、おきましょう!!

#28.アイコンの組み込み
ここからは、QtCreatorに戻って操作する

[1] プロジェクトの__「Source Files」__フォルダーをクリック、
そのままマウスの__右ボタン__をクリック、
ポップアップ メニューより__「AddNew...」__ をクリック
[2] 「新しいファイル - QtCreator」画面の__「ファイルとクラス」__より__「一般」__をクリック、
__「空ファイル」__をクリック
__[選択]__ボタンをクリック
[3] 「空ファイル - QtCreator」画面より、「File name:」で、"__icon,rc__"を入力して、リソースファイル(.rc)を作成する、
__[次へ]__ボタンをクリック
「プロジェクト管理」で__[完了]__ボタンをクリック
[4] 画面は、CMakeLists.txtに移って、入力を催促される。
※ここは、自動でやってくれない。

CMakeList.txtの__set(PROJECT_SOURCE ...)__に今、作った"__icon.rc__"を__追加__して、__[ファイル | Save All]__をクリック

```CMakeLists.txt
set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
        icon.rc
)
```

[5] プロジェクトの「Source Files」フォルダーの傘下に今、作った"icon.rc"を__ダブルクリック__
空ファイルの"icon.rc"が表示されるので、ここに入力

```icon.rc
IDI_ICON1   ICON    "icon.ico"
```
__[ファイル | Save All]__をクリック

もし、iconsフォルダーの傘下に画像がある場合は、"icons/icon.ico"とパスを設定もできる。

これで、ビルドすれば、アプリ(.exe)のアイコンが、今、作ったicon.icoの画像がアプリに組み込まれるハズだ!!

#29.動作確認!!
画面の左下にある、右三角マークの「実行」ボタンをクリックして、「MainWindow」が出てくる!

デバッグ用のフォルダーには、アイコンが組み込まれたアプリ(.exe)があるハズだ!!

QtCreator以外から、アプリを起動すると、__黒い画面(コンソール)__が表示された後に__アプリ画面__がでてくる。

#30.黒い画面(コンソール)を非表示にする
この黒い画面は、CMakeLists.txtで、調整できる。
__add_executable()__に"__WIN32__"と入れるだけだ。

```CMakeLists.txt
add_executable(hello
            WIN32
            ${PROJECT_SOURCES}
        )
```

クロスプラットフォームで、ビルドする人は、CMakeのif文で、"WIN32"を分けておきましょう!!
Windows10 64bitでも、「WIN32」と区別されます。

```CMakeLists.txt
    if(ANDROID)
        add_library(hello SHARED
            ${PROJECT_SOURCES}
        )
    elseif(WIN32)
        add_executable(hello
            WIN32
            ${PROJECT_SOURCES}
        )
    else()
        add_executable(hello
            ${PROJECT_SOURCES}
        )
    endif()
```

#31.再び、動作確認!!
デバッグ用のフォルダーには、アイコンが組み込まれたアプリ(.exe)があるハズだ!!

これをダブルクリックすると、黒い画面(コンソール)が出ない状態で、アプリが起動するハズだ!!
Dockerを用いたプロジェクト管理ツール OpenProject 環境構築方法 メモ

* プロジェクト管理ツール**[OpenProject](https://www.openproject.org/)**をDockerを利用して構築する方法についてメモする。
* DBには、個人的に使い慣れたMySQLを使用する。



## 構築準備

### フォルダ構成

```
root_project - docker-compose.yml
			|_ db 	-- openproject
					|_ my.cnf
```

### 設定ファイル

#### docker-compose.yml

* OpenProject用コンテナとDBコンテナ(MySQL5.7)を立ち上げる。

```yml
version: "3"

services:
  openproject:
    container_name: openproject
    image: openproject/community:7.4.3
    depends_on:
      - mysql
    environment:
      - DATABASE_URL=mysql2://mysqluser:mysqlpass@openprojectdb:3307/openprojectdb
      - SECRET_KEY_BASE=openproject_secret_key
    volumes:
      - ./db/openproject/static:/var/db/openproject
    ports:
      - 8090:80
    restart: always
  mysql:
    image: mysql:5.7
    container_name: openprojectdb
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: openprojectdb
      MYSQL_USER: mysqluser
      MYSQL_PASSWORD: mysqlpass
    volumes:
      - ./db/openproject/mysql:/var/lib/mysql
      - ./db/my.cnf:/etc/mysql/conf.d/my.cnf
    restart: always
    ports:
      - 3307:3307
    command: --port 3307
```

#### my.cnf

* DBの文字コード設定

```cnf
[mysqld]   
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci

[client]
default-character-set=utf8mb4
```



## 動作確認

* コンテナ起動

  ```shell
  docker-compose　up -d
  ```

* アクセス

  * http://localhost:8090にアクセスする。
        * Top画面が表示される。
  * adminアカウントでログインする。
        * ID/パスワード=admin/admin
  * adminアカウントのパスワードを変更する。

* その他

  * 適宜、言語設定などを変更する。

## 参考情報

* [「近代化Redmine」ことOpenProjectでスクラム開発のプロジェクト管理](https://qiita.com/terukizm/items/c94f06a40be55f65d4f9)
* [Docker OpenProject DB to MySQL](https://stackoverflow.com/questions/51878543/docker-openproject-db-to-mysql)
* [Configuring outbound emails](https://docs.openproject.org/installation-and-operations/configuration/outbound-emails/)
symfony4で「An exception occurred in driver: could not find driver」というエラーが出て、はまってしまった話

タイトル通り、Windowsのローカル環境で、php（8.0.3）およびcomposerをインストールして、
symfony4のプロジェクトを立ち上げたのですが、DBにマイグレーションしようとしたタイミングで「An exception occurred in driver: could not find driver」のエラーが出て、長時間はまってしまったので、対応方法を記述しておく。

結論：php.iniの設定が足りないらしい

まずphpの場所を調べる

```bash
$ which php
/c/php/php
```

「Cドライブ」の「php」ディレクトリ配下に「php.ini」のファイルが存在した。

以下の設定のコメントアウト？（;）を外す。

```ini
; extension=pdo_mysql
↓
extension=pdo_mysql
```

エラーがでないようになった！

### おまけ

.envファイルには以下のように記述する

```
DATABASE_URL="mysql://root@127.0.0.1:3306/symfony_hello?serverVersion=mariadb-10.4.18
```
「mariadb-」をつけていないと、「The metadata storage is not up to date, please run the sync-metadata-storage command to fix this issue」と言われることがある
インタープリタを作る その26

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
剰余modを実現する。

#サンプルコード

```
avr.ldi(16, 0x00)
avr.ldi(17, 0x05)
avr.ldi(18, 0x00)
avr.inc(18)
avr.mov(16, 18)
avr.cpi(16, 0x04)
avr.brcs(4)
avr.out(1, 16)
avr.cpi(18, 0x22)
avr.brne(-7)
avr.jmp(14)
avr.sub(16, 17)
avr.jmp(5)


```

#結果

```
1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 0 1 2 3 4 

```

#成果物

https://embed.plnkr.co/plunk/UXENnVENMvwpPtTl

以上。
IBM Cloud SatelliteでSELinuxが無効なホストでOpenShiftの導入が失敗したときの対処

# 事象

IBM Cloud Satelliteでノードを追加後、OpenShiftを導入しようとした際、下記のようにデプロイが失敗した。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/cae480e1-f1a3-3586-13b8-1f7b8f87f4fc.png)

この時点ではまだノードにsshできたのでログを確認したところ、``SELinux is disabled on this host.``というエラーが発生していた。

```/tmp/bootstrap/bootsrap_base.log
<localhost> EXEC /bin/sh -c '\''/usr/bin/python /root/.ansible/tmp/ansible-tmp-1623953101.7972465-26264-207481886806803/AnsiballZ_seboolean.py && sleep 0'\''
<localhost> EXEC /bin/sh -c '\''rm -f -r /root/.ansible/tmp/ansible-tmp-1623953101.7972465-26264-207481886806803/ > /dev/null 2>&1 && sleep 0'\''
fatal: [localhost]: FAILED! => {
    "changed": false,
    "invocation": {
        "module_args": {
            "ignore_selinux_state": false,
            "name": "container_use_cephfs",
            "persistent": true,
            "state": true
        }
    },
    "msg": "SELinux is disabled on this host."
}
PLAY RECAP *********************************************************************
localhost                  : ok=13   changed=9    unreachable=0    failed=1    skipped=4    rescued=0    ignored=0
+ ansible_status=2
+ [[ 2 != 0 ]]
+ return 2
+ report_deploy_status '\''Error on running image setup'\''
```

# 原因

現時点（2021/6）でのIBM Cloud Satelliteでは、OpenShiftをデプロイするノードはSELinuxが有効になっている必要がある。これはIBM Cloudのガイドには書かれていない。ちなみにControl planeとして使用するノードではこの問題は発生しない。

詳細を追うと、まず、デプロイ中に使われるAnsibleで、SELinuxを有効にしている箇所がある。

```roles/selinux/tasks/main.yml
# cat roles/selinux/tasks/main.yaml
- name: Set selinux value
  shell: sed -i 's/^SELINUX=.*/SELINUX=enforcing/g' /etc/selinux/config
```

もともとSELinuxが有効でなかった場合、configを書き換えてもリブートをしなければ反映されない。しかしこのスクリプトではリブートをしていないため、SELinuxはまだ有効になっていない。

そして次のタスクが実行される。

```roles/configure-selinux-ceph-permissions/tasks/main.yaml
- name: set selinux bool for ceph
  seboolean:
    name: container_use_cephfs
    state: yes
    persistent: yes
```

ここではsebooleanモジュールを使用している。sebooleanはデフォルトではSELinuxが有効化されていないと``SELinux is disabled on this host.``で失敗する。

# 対処

config上はSELinuxは有効になっているので、ノードをリブートする。

次にSatelliteのデプロイ処理を再開する。単純リランはできないので各種フラグファイルを削除してから``ibm-host-agent``サービスを実行する。

```
# rm /etc/satelliteflags/hostbootstrapinitatedflag
# rm /var/log/firstboot.flag
# systemctl start ibm-host-agent
```
[Lombok]Lombokを使ってコーディング量を減らそう

# Lombokでエンティティ作成を効率化
Javaでエンティティを作成するときにGetter、Setterを大量に書くことがあります。このような場合はLombokのアノテーションを指定すればGetter、Setterを書かなくても良くなるのでコーディング量の削減と作業の効率化ができます。

# Lombokとは？
｢Lombok｣はアノテーションによるコード自動生成を行うライブラリ・ツールです。
コンストラクタやGetterなどの書き方が決まっていて何度も書かなければいけないコードをアノテーションの指定だけで自動生成してくれます。
例えばユーザー情報を保持するエンティティの場合は、privateで必要なメンバ変数を作成するだけでOKです。

```java
@lombok.Setter
@lombok.Getter
@lombok.EqualsAndHashCode
@lombok.ToString
public class User {
	private String account;
	private String kanjiName;
	private String kanaName;
	private java.sql.Timestamp createDate;
}
```
上記のアノテーションの効果は、@lombok.DataだけでもOKです。

```java
@lombok.Data
public class User {
	private String account;
	private String kanjiName;
	private String kanaName;
	private java.sql.Timestamp createDate;
}
```

EqualsやToStringの自動実装はとても助かります。
実際にどのようなメソッドが追加されたのかは、Eclipseのアウトラインで確認することができます。
<strong>実際のコードはprivateのメンバ変数だけに対して、アウトラインは getAccount()やsetAccount(String)が追加されています。</strong>
![Lombok.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/166360/fd35ff28-035e-f647-efd4-bf96b377eb32.png)

本当に自動作成してくれているか実際にGetter、Setterを使うコーディングをして確認します。以下はJUnitを使って toString と equals が正しく実装されているか確認したコードです。

```java
@Test
void testLombok() {
	User user1 = new User();
	user1.setAccount("account");
	user1.setKanaName("kana");
	System.out.println(user1);

	User user2 = new User();
	user2.setAccount("account");
	user2.setKanaName("kana");
	System.out.println(user2);
	System.out.println(user1.equals(user2));
}
```

equalsやtoStringもちゃんと動作してくれるのでとても便利です。コーディング量が減ってとても便利ですがカプセル化の概念を軽視したクラスになっているので使いどころに注意が必要そうです。
インタープリタを作る その25

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
乱数rndを実現する。

#サンプルコード


```
avr.ldi(16, 0xea)
avr.ldi(17, 0x05)
avr.ldi(18, 0x00)
avr.inc(18)
avr.mul(16, 17)
avr.mov(16, 0)
avr.inc(16)
avr.out(1, 16)
avr.mul(16, 17)
avr.mov(16, 0)
avr.cpi(18, 0xf9)
avr.brne(-9)


```

#結果


```
147 92 253 182 199 112 241 138 123 4 101 222 175 24 89 178 99 172 205 6 151 192 193 218 75 84 53 46 127 104 41 2 51 252 157 86 103 16 145 42 27 164 5 126 79 184 249 82 3 76 109 166 55 96 97 122 235 244 213 206 31 8 201 162 211 156 61 246 7 176 49 202 187 68 165 30 239 88 153 242 163 236 13 70 215 0 1 26 139 148 117 110 191 168 105 66 115 60 221 150 167 80 209 106 91 228 69 190 143 248 57 146 67 140 173 230 119 160 161 186 43 52 21 14 95 72 9 226 19 220 125 54 71 240 113 10 251 132 229 94 47 152 217 50 227 44 77 134 23 64 65 90 203 212 181 174 255 232 169 130 179 124 29 214 231 144 17 170 155 36 133 254 207 56 121 210 131 204 237 38 183 224 225 250 107 116 85 78 159 136 73 34 83 28 189 118 135 48 177 74 59 196 37 158 111 216 25 114 35 108 141 198 87 128 129 154 11 20 245 238 63 40 233 194 243 188 93 22 39 208 81 234 219 100 

```

#成果物

https://embed.plnkr.co/plunk/rbYRMfVSziu46emt

以上。
mail の基本操作

# これはなに

`mail` コマンドの操作に関するメモ。

# 基本操作

- h : リスト表示。`h^` は最初、`h$` は最後のページ。
- z : 次ページ へ移動。 `z-` は前ページ。
- メッセージ番号 : メッセージ表示。 `$` は　最後のメッセージを表示。
- d : メッセージに削除マーク付与。 `d 1-10` で1から10を対象。
React入門 - Part4.2 - 親子間コンポーネントへの値の受け渡し - useContext編


# 目次

# useContextとは

props同様、コンポーネント間でのデータの受け渡しに使用します。
ですが、バケツリレーでは渡しません。

# 親コンポーネントでの設定

createContext

```typescript
export const UserCount = React.createContext()
```

レンダー項目でXXX.Providerで挟みます。

```typescript
      <UserCount.Provider value={100}>
        <子コンポーネント />
      </UserCount.Provider>
```

# 子(孫)コンポーネントでの設定

import

```typescript
import React,{useContext} from 'react'
import { UserCount } from '../App'
```

値の取り出し

```typescript
const count = useContext(UserCount)
```

これで、親から子、子から孫への値を伝搬しなくても、親から孫へデータを受け渡すことが出来ます。

# 子(孫)コンポーネントでcontextの更新まで行ってみよう

まず、いつものようにプロジェクトを作成します。

```
$ npx create-react-app プロジェクト名 --template typescript
```

プロジェクトに移動して、以下コマンドで初期画面が開くことを確認しておきます。

```
cd プロジェクト名
yarn start
```

# App.tsx

App.tsxを書き換えます。
子コンポにXXX.Providerで挟み、contextを伝搬できるようにします。

```typescript
import React, { useState } from "react";
import Child from "./Child";

type ContextType = {
  complain: string;
  setComplain: React.Dispatch<React.SetStateAction<string>>;
};

export const Complain = React.createContext<ContextType>({
  complain: "",
  setComplain: () => {},
});

function App() {
  const [complain, setComplain] = useState("");

  const value = {
    complain,
    setComplain,
  };

  return (
    <div className="App">
      <Complain.Provider value={value}>
        <Child />
      </Complain.Provider>
    </div>
  );
}

export default App;
```

# Child.tsx

子コンポーネントで、親コンポーネントからcompalainというstateとsetComplainというstate設定関数を受け取ります。

```typescript
import React, { useContext, useState } from "react";
import { Complain } from "./App";

const ComponentC = () => {
  const complain = useContext(Complain)?.complain;
  const setComplain = useContext(Complain)?.setComplain;

  const [text, setText] = useState("");

  const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {
    setText(e.target.value);
  };

  return (
    <div>
      <p>Child Complain</p>
      <p>{complain}</p>
      <input
        type="text"
        onChange={handleInputChange}
        placeholder="文句を入力してください。"
      />
      <button onClick={() => setComplain(text)}>文句を追加します</button>
    </div>
  );
};

export default ComponentC;
```

# 実食

動作確認してみてください。
子コンポで親コンポのstateを更新し、子コンポで表示できたと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559029/62bb7d05-dc65-5f21-1481-ef60ceda3fa2.png)
React入門 - Tips11 - PrettierとEsLintを設定する

# 目次
[React入門](https://qiita.com/yokowake12345/items/0919ad144cbc4684e64e)

# PrettierとEsLintとは

`Prettier`はコードフォーマッタ
`ESLint`は構文チェックツール

# 設定方法

[ここを参考にしました。](https://zuma-lab.com/posts/eslint-prettier-settings)

纏めます。

１．[React入門 - Part2](https://qiita.com/yokowake12345/items/132fbd4129afd9b37500)でReact+TypeScript環境を作ります。

２．ESLint/Prettier package を install、設定 する

```typescript
yarn add -D eslint @typescript-eslint/parser @typescript-eslint/eslint-plugin
yarn add -D prettier eslint-config-prettier
```

３．.eslintrc.jsonを作成

package.jsonと同ディレクトリに.eslintrc.jsonを作成します。

```typescript
{
  "extends": [
    "eslint:recommended",
    "plugin:@typescript-eslint/recommended",
    "plugin:@typescript-eslint/recommended-requiring-type-checking",
    "prettier",
    "prettier/@typescript-eslint"
  ],
  "plugins": ["@typescript-eslint"],
  "parser": "@typescript-eslint/parser",
  "parserOptions": {
    "sourceType": "module",
    "project": "./tsconfig.json"
  },
  "env": { "browser": true, "node": true, "es6": true },
  "rules": {
    // 個別に設定するESLintルールを記述
  }
}
```

※いちお、UTF-8で保存

４．.prettierrc.jsonを作成する

package.jsonと同ディレクトリに.prettierrc.jsonを作成します。

```typescript
{
  "printWidth": 120,
  "trailingComma": "es5",
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "jsxSingleQuote": true,
  "endOfLine": "lf"
}
```

※いちお、UTF-8で保存

５．VSCodeにESLintとPrettier - Code formatterをインストール

VSCodeを開いて、左側に表示されている拡張機能アイコンをクリックし
それぞれ、`ESLint`、`Prettier`と入力しインストールしてください。

# 確認

試しに以下を入力してみてください。

```typescript
  let test = 'aaa';
  if (test) { return null } else { return <div></div> }
```

保存すると

```typescript
  let test = 'aaa';
  if (test) {
    return null;
  } else {
    return <div></div>;
  }
```

となりますね。

ちなみに、以下の場合は、

```typescript
  if (test) return null;
  else return <div></div>;
```

こんな風に変換されますね。

```typescript
  if (test) return null;
  else return <div></div>;
```

細かい設定は後ほど。。。（調べます。）
React入門 - Tips10 - useMediaQueryでレスポンシブ対応


# 目次

# useMediaQuery

pcとスマートフォンでの表示切替が必要な時に使用します。

# 実装方法(useMediaQueryのhook)


```typescript:use-media-query.tsx
import { useEffect, useState } from 'react'

export const useMedia = () => {
  const queryStrings = {
    pc: 'screen and (min-width: 768px)',
    sp: 'screen and (max-width: 767px)',
    short: 'screen and (max-height: 480px)',
  };
  const [test, setTest] = useState(null);

  useEffect(() => {
    let timeout;
    const onResize = () => {
      if (timeout) return
      if (typeof window === "undefined") {
        setTest(null);
      } else {
        setTest( Object.fromEntries(
          Object.entries(queryStrings).map(([k, v]: [string, string]) => [
            k,
            window.matchMedia(v),
          ])
        ));
      }
      timeout = setTimeout(() => timeout = null, 500)
    }

    window.addEventListener('resize', onResize)
    return () => window.removeEventListener('resize', onResize)
  })  

  return test;
};
```

# 実装方法(コンポーネント側)

```typescript:media-query-test.tsx
import React, {useMemo} from 'react'
import {useMedia} from './use-media-query';

export const Comp:React.FC = (props) => {
  const media = useMedia();
  const isSP =  media ? media.sp.matches : false;

  return <span>現在は{isSP ? "SP" : "PC"}で表示しています。</span>
}

export default Comp
```

# まとめ


動かしてみてください。
ブラウザの幅を変えると表示が変わると思います。
割と簡単に実装出来ました。

ちょっと調べたら、[こんな感じの](https://qiita.com/YusukeTagawa/items/9f1e1f21b6feb801af1d)`react-response`なるものでもっと簡単に
実装可能みたいです。試してないけど。
インタープリタを作る その24

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
練習問題やってみた。

#練習問題

九九表を作れ。

#サンプルコード

```
avr.ldi(16, 0x01)
avr.ldi(17, 0x00)
avr.ldi(18, 0x0a)
avr.inc(17)
avr.mul(16, 17)
avr.out(1, 0)
avr.cpi(17, 0x08)
avr.brcc(-5)
avr.out(0, 18)
avr.inc(16)
avr.cpi(16, 0x09)
avr.brcc(-11)



```

#結果

```
1 2 3 4 5 6 7 8 9 
2 4 6 8 10 12 14 16 18 
3 6 9 12 15 18 21 24 27 
4 8 12 16 20 24 28 32 36 
5 10 15 20 25 30 35 40 45 
6 12 18 24 30 36 42 48 54 
7 14 21 28 35 42 49 56 63 
8 16 24 32 40 48 56 64 72 
9 18 27 36 45 54 63 72 81 

```

#成果物

https://embed.plnkr.co/plunk/BoFXxSfAoG39d2ml


以上。
STM32F303K8とWS2812B(3個)でランダムに光らせる。 (Mbed)


x Mbed NUCLEO-F303K8 Mbed2 リビジョン172
x ws2812bがなぜ3個なのかと言うと2,3個で電流が超えるらしい

目的
GPIOのテスト

NUCLEO-F303K8

説明
WS2812Bの接続ピンは、A6(PA7)です。


参考

https://akizukidenshi.com/catalog/g/gM-10172/


https://akizukidenshi.com/catalog/g/gM-08414/


https://akizukidenshi.com/catalog/g/gP-05155/


![i2c_s5851a_1114_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/768dcc38-f6cf-ebac-acda-2f0e0ab7e912.jpeg)





```c++

#include "mbed.h"
#include <stdlib.h>

//Serial pc(USBTX, USBRX); // tx, rx
//Serial pc(SERIAL_TX, SERIAL_RX); //767 303
//RawSerial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); // tx, rx 103

DigitalOut myled(PA_7);
                  //     65432109876543210
int on1  = GPIOA->ODR | 0b0000000010000000;
int off1 = GPIOA->ODR & 0b1111111101111111;

int l[90]; //max30 led

void bit_on1();
void bit_off1();

//             12345678   12345678   12345678   12345678
int b8[8] = {0b10000000,0b01000000,0b00100000,0b00010000,
             0b00001000,0b00000100,0b00000010,0b00000001, };

int ws_led(int num1)
{
    int on_off;

    //__disable_irq(); // disable interrupt

    for(int ii=0;ii<num1;ii++){
        //pc.printf("  -%d\t%d\r\n",ii,l[ii]); //303
        
        //8ビット分送る
        for(int jj=0;jj<8;jj++){
            //pc.printf("  -%d\r\n",jj); //103
            
            on_off = l[ii] & b8[jj];
        
            if( on_off == 0 ){
                //ビットが0
                //pc.printf("0"); //103
                bit_off1();
            } else {
                //ビットが1 
                //pc.printf("1"); //103
                bit_on1();
            }//endif
        
        }//for 8bit
        
    }//for max30byt

    //__enable_irq(); // enable interrupt

    return(0);
}//ws_led

//メイン
int main() {
    
    //pc.printf("\r\n103\r\n"); //103
    GPIOA->ODR = off1;
    wait_ms(1);

    //クロックカウンターの初期化
    CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
    DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

    int ii; //ループカウンター

    while(1){

        //l[3*0+0] = 31;
        //l[3*0+1] = 32;
        //l[3*0+2] = 33;
        //
        //l[3*1+0] = 30;
        //l[3*1+1] = 10;
        //l[3*1+2] = 32;
        //
        //l[3*2+0] = 10;
        //l[3*2+1] = 10;
        //l[3*2+2] = 32;

        for(ii=0;ii<9;ii++){
            l[ii] = rand()%52;
        }//for

        //ws2812bへデータを送る
        ws_led(9);

        //1秒待つ
        wait_ms(100);

    } //while

} //main

// 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 0.3 
void bit_off1(){
   //0.3us 800khz
        
        DWT->CYCCNT = 0;

        GPIOA->ODR = on1;
        
        while (DWT->CYCCNT < 17L){ 
        } ;
        
        GPIOA->ODR = off1;

        while (DWT->CYCCNT < 70L){ 
        } ;
                
}//bit_off1


// 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
void bit_on1(){
   //1us 800khz
        
        DWT->CYCCNT = 0;

        GPIOA->ODR = on1;
        
        while (DWT->CYCCNT < 47L){ 
        } ;
        
        GPIOA->ODR = off1;

        while (DWT->CYCCNT < 70L){ 
        } ;
                
}//bit_on1




```
Open Watcom v2-FreeBSD

DOSのプログラムを開発できるOpen Watcom v2はFreeBSDでビルドできるものの、FreeBSDのコマンドはビルドされません。ブートストラップのコマンドは用意され、それを使えばある程度の事はできますが、あまりお勧めできる使い方ではないと思います。

FreeBSDのネイティブにポートする方法もありますが、ソフトウエアの規模が大きくたとえポートできたとしても、メンテしていくのが難しいと思います。このためLinux用に用意されているバイナリをFreeBSDのLinuxエミュレーションで使ってみることにしました。

[githubのページ](https://github.com/open-watcom/open-watcom-v2)のリリースタグにあるopen-watcom-2_0-c-linux-x64というファイルをダウンロードして実行ビットを立てて実行してみるとエラーになります。

FreeBSDのLinuxエミュレーションではサポートされてないioctlを使ってしまっているようです。一応[バグジラあげました](https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=256702)。

バイナリの圧縮ファイルもリリースタグにあったのでそれを使います。

```
% fetch https://github.com/open-watcom/open-watcom-v2/releases/download/2021-06-01-Build/ow-snapshot.tar.gz
% mkdir watcom
% cd watcom
% tar -zxf ../ow-snapshot.tar.gz
```

これで、watcom/binl64にパスを通すとwclなどが使えます。

wlinkでcomやexeを作れるのですが以下のエラーがでます。

```
Error! E2000: Error: could not open message resource file.
```

メッセージはwlink自体の入っていて、コードを見てみたところprocfsを使って自分のパスを拾っていて、bastille editで設定にmount.procfsを入れたところ解消しました。
インタープリタを作る その23

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
定数比較cpiを実装する。

#投入するソース

9 > 8 なら1

```
avr.ldi(16, 0x09)
avr.ldi(17, 0x00)
avr.ldi(18, 0x01)
avr.cpi(16, 0x08)
avr.brcs(2)
avr.out(1, 17)
avr.jmp(9)
avr.out(1, 18)


```


#サンプルコード

```
	cpi: function(_Rd, K) {
		var Rd = kan2(this.dataspace[_Rd]);
		var SREG = [false, false, false, false, false, false, false, false];
	  var c;
		var z;
		if (Rd > K)
		{
			c = true;
		}
		else
		{
			c = false;
		}
		if ((Rd - K) == 0)
		{
			z = true;
		}
		else
		{
			z = false;
		}
		SREG[0] = c;
		SREG[1] = z;
		this.PC++;
		this.dataspace[this.sreg] = SREG;
	},


```

#成果物

https://embed.plnkr.co/plunk/MyYyqi3AI7lmZwhi

以上。
インタープリタを作る その22

#概要

インタープリタを作ってみた。
avrインタープリター書いてみた。
乗算mulを実装する。

#投入するソース

9*2

```
avr.ldi(16, 0x09)
avr.ldi(17, 0x02)
avr.mul(16, 17)
avr.out(1, 0)

```

#サンプルコード

```
	mul: function(_Rd, _Rr) {
		var Rd = kan2(this.dataspace[_Rd]);
		var Rr = kan2(this.dataspace[_Rr]);
		var v = (Rd * Rr) & 0xffff;
		this.dataspace[0] = hen(v & 0xff);
		this.dataspace[1] = hen((v >> 7) & 0xff);
		var SREG = this.dataspace[this.sreg];
		this.PC++;
		this.dataspace[this.sreg] = SREG;
	},


```

#成果物

https://embed.plnkr.co/plunk/xWiaOKMLqjRGTZmP

以上。
正規表現(まずはこれだけ)

# はじめに

# 目次
1. [文字コード](#文字コード)
1. [基本](#基本)

# 文字コード

|文字コード  |内容  |対応する表現 |
|---|---|---|
|\r\n |改行(Windows) ||
|\n |改行(UNIX系, MacOS(v10~)) ||
|\d |数字 |[0-9] |
|\s |空白文字(半角空白,タブ,改行,改ページ)|[ \t\r\n\f] |
|\S |空白文字以外 |[^ \t\r\n\f] |
|\w |アルファベット,数字,アンダーバー |[a-zA-Z0-9_] |
|\W |アルファベット,数字,アンダーバー以外 |[^a-zA-Z0-9_]
|^ |先頭 | |
|$ |末尾| |
|\< |単語先頭 ||
|\> |単語末尾 ||
|\A |ファイル先頭 ||
|\z |ファイル末尾 ||

# 基本
|正規表現  |内容  |
|---|---|
|.  |1文字  |
|+ |1回以上繰り返し最長一致 |
|+? | 1回以上繰り返し最短一致 |
|* |0回以上繰り返し |
|*? |0回以上繰り返し最短一致 |
|[abc] |a,b,cいずれか1文字 |
|[^abc]  |a,b,c以外  |
|aaa|bbb  |aaaまたはbbb  |
|\[  |メタ文字を検索するときは\をつける  |
|int |整数|
|float|単精度浮動小数点数|
Cloudflare Pagesにカスタムドメインを設定する

# はじめに
こんにちは。フランスの方は桃は皮をむかないで食べるそうです。私もです :raised_hand: 

さて、今回は**Cloudflare Pages**に独自ドメインを設定しました:+1:
これから設定する方の参考になれば幸いです:pray:

# 前提
1. ドメインはお名前ドットコムで取得済み.
1. Cloudflare登録済み.
1. Cloudflare Pages デプロイ済み.

# Cloudflare Pagesに独自ドメインを設定する
## 1. **カスタム ドメイン**タブの**カスタム ドメイン**を押下

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/44ae9b41-5506-fcac-b57b-0c9b934f4e60.png)

## 2. カスタムドメイン追加
お名前ドットコムで取得済みのドメインを入力します。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/10373274-7609-c141-8817-c11d3739a1ed.png)

## 3. Cloudflare DNS を開始する
Cloudflare DNS未使用時はこの画面が表示されるので案内に従っていきます。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/dd51b26c-042e-80b0-6987-3efade31624d.png)

## 4. Cloudflare DNS設定
再度お名前ドットコムで取得済みのドメインを入力します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/1f40894d-2929-0e4f-90f5-733857019823.png)

## 5. プラン選択
無料プランで大丈夫です:ok_hand:

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/31f8d7df-01ca-92bb-7848-cbc2abc43724.png)

## 6. DNSレコード確認 or 追加等
DNSレコード確認をして必要に応じて追加して下さい。
自分は何も追加してないです:v:

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/5fa402bb-3f45-3e45-3364-d78dd3d093ea.png)

## 7. ネームサーバ変更

以下に4に記載のネームサーバをお名前ドットコムに設定します。
![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/e51e61d3-76f4-3bba-5ce4-6a17ca41172c.png)

お名前ドットコムの以下1と2に上記の値を追加して保存します。
![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/e1deaa88-fede-a0da-7d12-775812225fcc.png)

## 8. ネームサーバのチェック

以下ボタン押下します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/86984/5fa402bb-3f45-3e45-3364-d78dd3d093ea.png)

## 9. しばらく待ちます
自分はすぐに完了しましたが、時間かかる場合もあるそうです。
完了すると、カスタムドメインでサイトにアクセス出来るようになります！

# おわりに
あまり迷うことなく設定ができました。
これでCDNの恩恵も受けられるのはうれしいですね:smile:

それでは！
[HTML include] HTMLファイル内から別HTMLを参照してinclude する。

#検証済
Ubuntu-20.04 LTS + apacheで動作確認済み。

#1. jQuery の読み込み
各```<head>```タグ内に以下を記述

```html
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
```

#2. javascript関数の作成
以下のコードを書いたjavascriptファイルを作ります。
```idname```にはid属性の名前を書きます。
```path```には読み込みたいhtmlファイルを書きます。
ファイル名は ```html-to-id.js``` にしました。

```javascript
const addHtmlToId = function (idname, path) {
    $(function () {
        $.ajaxSetup({
            cache: false
        });
        $(idname).load(path);
    });
}
```

#3. idの名前を決める
複数のhtmlファイルで参照する場合は、それぞれ参照するファイルのパスが微妙に違ったりするので各htmlで設定できるようにします。そこで上記で作ったファイル内にidの名前を変数として定義します。今回は以下の名前で記述していきます

```javascript
let headerAreaName = "#header-data";
let footerAreaName = "#footer-data";
```

#4.読み込む準備
各```head```タグ内に以下のコードを記述してファイル内でhtmlを読み込めるようにします。
第２引数に読み込むhtmlファイルのパスを入力していきます。

```html
<script type="text/javascript" src="html-to-id.js"></script>
<script>
    addHtmlToId(headerAreaName, "header.html");
    addHtmlToId(footerAreaName, "footer.html");
</script>
```

#5. 使う
準備が整ったので、使用したい場所に```<div>```タグと```id```属性を使って入れ込みます。

```html
<div id="header-data"></div>
```
```html
<div id="footer-data"></div>
```

 各```div```タグ内に読み込みたいhtmlファイルの内容が書き込まれるので、ほかのプロパティを適用したい場合は```<div>```で囲ってあげるか、```class``` 属性で指定してあげるとできます。

#6. 複数使いたい場合 [未検証]
単一ファイル内で一つの読み込んだファイルを複数使いたい場合は、idの名前を複数作り、読み込む準備のところで、その名前を使って同じファイルを指定してあげるとおそらくできます。

```javascript
let headerAreaName1 = "#header1-data";
let headerAreaName2 = "#header2-data";
let footerAreaName = "#footer-data";
```
```html
<script type="text/javascript" src="html-to-id.js"></script>
<script>
    addHtmlToId(headerAreaName1, "header.html");
    addHtmlToId(headerAreaName2, "header.html");
    addHtmlToId(footerAreaName, "footer.html");
</script>
```

#7. 内部参照エラーは検証済み
breaketsのライブプレビューでは正しく表示されますが、ローカルファイルをウェブブラウザで開くと内部参照エラーなります。
ですが、サーバーに移すと正しく動作します。

#参考サイト

https://www.fenet.jp/dotnet/column/language/117/

https://style.potepan.com/articles/20138.html
NCMB.NCMBUser.CurrentUserの配列をint型で取得する方法

これでint型の配列としてデータを取得できる

```c#:IntTest.cs
   //Character配列取得(なんかしらんけどindex0に全要素が半角空白で区切られて入ってる
   int[] arr = (NCMBUser.CurrentUser["Character"] as ArrayList)[0]
       .ToString()//string型に変換して
       .Split(' ')//半角空白で区切ってstring[]にして
       .Select(int.Parse)//int型に変換して
       .ToArray();//配列にする

```

stringだったらこれで取得できる
intに変換しないだけなので簡単

```c#:StringTest.cs
string[] arr = (NCMBUser.CurrentUser["Character"] as ArrayList)[0]
    .ToString()//string型に変換して
    .Split(' ')//半角空白で区切ってstring[]にして
    .ToArray();//配列にする

```

そのまま配列としては受け取れないので、ArrayListにキャストしてからToArrayするのが正解っぽい
【Swift】動画撮影時にシステムサウンドを鳴らす方法

#動画撮影時にシステムサウンドを鳴らす方法
デフォルトのカメラアプリの様に録画開始、終了時にポンッという効果音を鳴らしたい時に参考にしていただければ幸いです。
#コード
```swift
import AudioToolbox
```
```swift
 @objc func tappedRecordButton(sender: UIButton) {
  //録画開始サウンド
  var soundIdRing:SystemSoundID = 1117
  //録画終了時は var soundIdRing:SystemSoundID = 1118
  if let soundUrl = CFBundleCopyResourceURL(CFBundleGetMainBundle(), nil, nil, nil){
   AudioServicesCreateSystemSoundID(soundUrl, &soundIdRing)
   AudioServicesPlaySystemSound(soundIdRing)
  }
 }
```
##参考記事
https://dev.classmethod.jp/articles/ios-systemsound/
マイクラの土ブロック

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

```c#:NewBehaviourScript.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour{

	public Material material;
	List<int> triangles     = new List<int>();
	List<Vector3> vertices  = new List<Vector3>();
	List<Vector2> uv        = new List<Vector2>();
	
	void Start(){
		Append(new Voxel(0,0,0,0));
		Init(new GameObject());
	}
	void Append(params Voxel[] voxels){
		foreach(Voxel v in voxels){
			foreach(int t in v.triangles) triangles.Add(vertices.Count+t);
			vertices.AddRange(v.vertices);
			uv.AddRange(v.uv);
		}
	}
	void Init(GameObject g){
		var f = g.AddComponent<MeshFilter>();
		var r = g.AddComponent<MeshRenderer>();
		var m = new Mesh(){
			vertices    = vertices.ToArray(),
			uv          = uv.ToArray(),
			triangles   = triangles.ToArray(),
		};
		f.mesh      = m;
		r.material  = material;
		m.RecalculateNormals();
	}
}

public class Voxel{

	static List<int> data   = new List<int>();
	static int[] order      = {6,7,2,3, 2,3,0,1, 0,1,4,5, 6,2,4,0, 7,6,5,4, 3,7,1,5};
	static int slice        = 8;
	static Voxel(){
		for(int i=0;i<order.Length;i+=4){
			data.AddRange(new []{i,i+1,i+2,i+3,i+2,i+1});
		}
	}
	
	public List<int> triangles      = data;
	public List<Vector3> vertices   = new List<Vector3>();
	public List<Vector2> uv         = new List<Vector2>();
	public Voxel(int x,int y,int z,int type){
		var cube = new Vector3[8];
		var face = new []{0,1,2,1,1,1};
		for(int i=0;i<8;i++){
			cube[i] = new Vector3((i&1)+x,(i>>1&1)+y,(i>>2&1)+z);
		}
		for(int i=0;i<order.Length;i++){
			vertices.Add(cube[order[i]]);
			uv.Add(new Vector2(type+(i&1),slice-(i>>1&1)-face[i>>2])/slice);
		}
	}
}
```