OmniAICreator/Qiita-1.07M huggingface dataset:
anacondaでも楽にyolov5を使いたい！

こんにちは。皆さんはyolov5をローカルで使用したことはありますか？
yolov5の環境構築をする際に便利なのがrequirements.txtです。pipで使用すると必要なライブラリをまとめてインストールしてくれます。
しかし、conda系でパッケージ管理をしている場合、pipを使用するのは危険が伴います。

https://onoz000.hatenablog.com/entry/2018/02/11/142347

condaでrequirements.txtの代わりを担うのがyamlファイルですが、yolov5にはありません。
この記事では、yolov5環境構築用のyamlファイルを作成したのでコピーして使ってみてください。
なお、この記事は2/11に動作確認を行った環境をyamlファイルとして載せています。

```ruby:qiita.rb
name: yolov5
channels:
    - conda-forge
dependencies:
    - python=3.10.0
    - numpy=1.24.2
    - ipython=8.10.0
    - matplotlib=3.6.3
    - opencv=4.7.0
    - pyyaml=6.0
    - requests=2.23.0
    - scipy=1.10.0
    - pytorch=1.13.1
    - torchvision=0.14.1
    - tqdm=4.64.1
    - tensorboard=2.11.2
    - pandas=1.5.3
    - seaborn=0.12.2
    - psutil=5.9.4
    - gitpython=3.1.30
```

yamlを作成して上記のコードを書き込みます。
その後同じ階層で以下のコマンドを実行すればyolov5を動かせる環境が出来上がるでしょう。
```ruby:qiita.rb
conda env create -f [yamlファイル名]
```

最後まで読んでいただきありがとうございました。ぜひ使ってみてください！
SecRuleEngineが原因でApacheを起動できないときの解決方法

# はじめに
備忘録
WordpressをインストールしているときにApacheの設定でつまずいたので書き残します。
どなたかのお役に立てれば幸いです。

# エラーの原因
Apacheを再起動しようとするとエラーを吐きました。
```bash
$ sudo systemctl restart apache2.service
Job for apache2.service failed because the control process exited with error code.
See "systemctl status apache2.service" and "journalctl -xeu apache2.service" for details.
```
`systemctl status apache2.service`でApacheの状態を確認してみます。
```bash
$ systemctl status apache2.service
× apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sat 2023-02-11 15:11:05 UTC; 1min 16s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 924372 ExecStart=/usr/sbin/apachectl start (code=exited, status=1/FAILURE)
        CPU: 22ms
systemd[1]: Starting The Apache HTTP Server...
apachectl[924375]: AH00526: Syntax error on line 7 of /etc/apache2/sites-enabled/wordpress.conf:
apachectl[924375]: Invalid command 'SecRuleEngine', perhaps misspelled or defined by a module not included in the server configuration
apachectl[924372]: Action 'start' failed.
apachectl[924372]: The Apache error log may have more information.
systemd[1]: apache2.service: Control process exited, code=exited, status=1/FAILURE
systemd[1]: apache2.service: Failed with result 'exit-code'.
systemd[1]: Failed to start The Apache HTTP Server.
```
大事なのは、以下の一文でした。
```bash
Invalid command 'SecRuleEngine', perhaps misspelled or defined by a module not included in the server configuration
```
今回は`SecRuleEngine`を使うためのモジュールがインストールされていないのが原因でした。
# 解決方法
`mod_security`モジュールをインストールします。
```bash
sudo apt install libapache2-mod-security2
```
次に、`mod_security`モジュールを有効化します。
```bash
$ sudo a2enmod security2
Considering dependency unique_id for security2:
Module unique_id already enabled
Module security2 already enabled
```
Apacheを再起動して状態を確認してみます。
```bash
$ sudo systemctl restart apache2
$ systemctl status apache2.service
● apache2.service - The Apache HTTP Server
     Loaded: loaded (/lib/systemd/system/apache2.service; enabled; vendor preset: enabled)
     Active: active (running) since Sat 2023-02-11 15:30:30 UTC; 4s ago
       Docs: https://httpd.apache.org/docs/2.4/
    Process: 925150 ExecStart=/usr/sbin/apachectl start (code=exited, status=0/SUCCESS)
   Main PID: 925154 (apache2)
      Tasks: 6 (limit: 28701)
     Memory: 35.4M
        CPU: 180ms
     CGroup: /system.slice/apache2.service
             ├─925154 /usr/sbin/apache2 -k start
             ├─925155 /usr/sbin/apache2 -k start
             ├─925156 /usr/sbin/apache2 -k start
             ├─925157 /usr/sbin/apache2 -k start
             ├─925158 /usr/sbin/apache2 -k start
             └─925159 /usr/sbin/apache2 -k start
systemd[1]: Starting The Apache HTTP Server...
apachectl[925153]: AH00558: apache2: Could not reliably determine the server\'s fully qualified domain name, using 127.0.1.1. Set the 'ServerName'>
systemd[1]: Started The Apache HTTP Server.
```
無事再起動できました。


# ブログもあります
https://kyit.net/how-to-start-apache-with-secruleengine/
Node.jsでd3.jsを使うミニマムな手順

d3.jsは、グラフのようなデータ可視化を行うためよく利用されているライブラリである。
通常Webフロントエンドに組み込まれて使われるが、画像生成をバックエンドでも使えるようにしてみたい。

ここでは、Node.jsでd3.jsを使うミニマムな手順をまとめる。
d3.jsの現行バージョンはESMのみ対応になっているため、ESMに対応した手順にする。
まずJavaScriptの場合の手順をまとめ、それに続いてTypeScriptを使う場合の手順も記載する。

## 環境
- Node.js 18.13.0
- Ubuntu 20.04 LTS (WSL2)
- Visual Studio Code 1.73.0

## JavaScriptの場合の手順

```sh
touch package.json
```

package.jsonに以下を記入

```sh
{
  "dependencies": {
    "d3": "^7.8.2",
    "jsdom": "^21.0.0"
  },
  "type": "module"
}
```

```sh
npm install
touch sample.js
```

sample.jsに以下を記入

```js
import * as d3 from 'd3'
import { JSDOM } from 'jsdom'
const document = new JSDOM().window.document
const svg = d3.select(document.body).append('svg')
svg.attr('width', 400)
svg.attr('height', 400)
svg.append('circle')
 .attr('cx', 200)
 .attr('cy', 200)
 .attr('r', 40)
 .attr('fill', "blue")

console.log(document.body.innerHTML)
```

```sh
node sample.js > out.svg
```

out.svgとして、背景は透明な、以下のような青丸の画像が出力される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198108/20d749b5-ac52-1adb-0b83-349c98910e99.png)


## TypeScriptの場合の手順

上記手順で作った環境とは別に、一からプロジェクトを作成していきます。

```sh
npm init
npm i d3 jsdom @types/d3 @types/jsdom typescript @types/node@18 # 使ってるnodejsのバージョンに合わす
npx tsc --init
```

package.jsonに以下を追記

```json
"type": "module"
```

tsconfig.jsonを以下に書き換え(`"module" : "ES2015"`がポイント)

```json
{
  "compilerOptions": {
    "sourceMap": true,
    "outDir": "./dist",
    "target": "es2016", 
    "module": "ES2015",
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,   
    "skipLibCheck": true
  },
  "include": [
    "src/**/*"
  ],
}
```

```sh
mkdir src
touch src/index.ts
```

src/index.tsに以下を書く

```ts
import * as d3 from 'd3'
import { JSDOM } from 'jsdom'

function run(): string {
    const document = new JSDOM().window.document
    const svg = d3.select(document.body).append('svg')
    svg.attr('width', 400)
    svg.attr('height', 400)
    svg.append('circle')
    .attr('cx', 200)
    .attr('cy', 200)
    .attr('r', 40)
    .attr('fill', "blue")
    return document.body.innerHTML
}
  
console.log(run());
```

```sh
npx tsc
# 動作確認
node dist/index.js > out.svg
```

以上。
arduino microに書込み時、おかしなエラーを吐いた話

# 見出し
atmega32U4製のarduinoにスケッチを書き込むときに、珍しいエラーで躓いたのでとりあえずメモ。
皆さんこのエラーにそこそこ躓いているみたいですが、対策が色々とあるので自分の場合を記しておきます。
## 問題
### なんだこの鰓？？？
Arduino Microは**COM9で接続**。いざ書き込もうとしたとき下の画像のようなエラーが．．．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/5927f2b2-1c94-43a4-f2ba-cea6a94de246.png)
よくよく見ていくと、接続しているのはCOM9なのに書き込むときのポートが「Found upload port: **COM5**」
「間違っているぞavrdudeくん、書き込むのはCOM9だよ」
と思って何回も書き込むがエラー。

### 皆がよくやっている対策（自分もエラーの時はとりあえずこれ）
arduino Microのリセットボタンを押すと数秒間だけブートローダーモードに入るので、その間に軽いスケッチを書き込みます。
アップロードを実行し、リセットボタン！ 速攻COM5に変更！ 書込み！（ブートローダーモードではCOMポートが変わるので注意）
大抵はこの書き込み方法で治るのですか．．．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/4a493918-3141-21d6-e8ba-578eef91f5d6.png)
ブートローダーモード中は認識してくれず、通常モードに戻るとCOM9で書き込もうとするが、同じエラー
## 原因
30分間色々な質問サイトで探していると、下記のサイトで気になる回答を発見。
https://teratail.com/questions/erg7qyf5cv51op
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/9fce64c1-7959-ed1b-2102-21156bdf8f52.png)
COMポートの接続権をほかのソフトが先に使用している？？？
COMポートを占有するソフトの特徴として、COMポートを走査して常に接続を待っているソフトと考えました。
気になるソフトが一つありました。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/747d8133-5a95-d720-ac0e-63f91a498524.png)
"NZXT CAM"というソフトは、NZXT製のPCパーツ（水冷ファン、ケースファン）を制御するソフトなんですが、接続方法がCOMポートなんですよ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455831/3988f399-7b3b-d50a-e1fc-323b58a303f2.png)

試しに"NZXT CAM"を終了して書き込んでみると、すんなり書き込んでくれました。
# すんなり書き込んでくれました。

なんとPCパーツ制御系のソフトがCOMポートを占有していたとは．．．
あまり不用意にソフトを常駐させないようにしておきます．．．(;´д｀)トホホ
【Linux】テキストを環境変数の値に置き換える方法


## テキストを環境変数の値に置き換える方法
`envsubst`コマンドを使用することでテキストを環境変数の値に置き換えられます。
以下のように使用します。

```sample.template
${GREETING}
```
```zsh:ターミナル
$ export GREETING=Hello && envsubst < ./sample.template > ./sample.txt

または

$ GREETING=Hello envsubst < ./sample.template > ./sample.txt

```

```sample.txt
Hello
```
プラットフォームごとに異なるアイコンを使用する際の注意点

## 概要

MauiIconのIncludeにはそれぞれ別のリソースを設定すること
複数のMauiIconタグに同様のリソースパスを設定するとエラーが発生する

## ダメな例

test.csproj
``` 
	<!-- App icon for Windows -->
    <MauiIcon Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'" Include="Resources\AppIcon\appicon.png" ForegroundFile="Resources\AppIcon\appiconfg.svg" TintColor="#40FF00FF" />

    <!-- App icon  -->
    <MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" TintColor="Yellow" />
```
エラー一覧(抜粋)
```
エラー	MAUI0000	System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル '<プロジェクトのパス>\obj\Debug\net7.0-windows10.0.19041.0\win10-x64\resizetizer\r\appicon.ico' にアクセスできません。
```

## 対策後

test.csproj
``` 
	<!-- App icon for Windows -->
    <MauiIcon Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'" Include="Resources\AppIcon\appiconforwindows.png" ForegroundFile="Resources\AppIcon\appiconfg.svg" TintColor="#40FF00FF" />

    <!-- App icon  -->
    <MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" TintColor="Yellow" />
```
※Includeに同じファイルパスを指定しなければ、問題ない

## 所感

とりあえず、変更前と同じように動くようになってよかった。
ただ、なぜ拡張子が異なっているのに同一ファイルのように扱われているのか等、不明なことは多い。
非エンジニア34歳から始めるAtCoder～入茶まで

# はじめに
非エンジニアですが、3日坊主で終わると思っていたことにハマってしまったので記事にしました。
こんな人でもできるんだな、と同じ世代に感じていただき仲間を増やすのも目的としてあります。

# 非エンジニア34歳のプロフィール
工業高校・機械課卒、勉強が苦手だったので、日本の伝統的大企業（製造業）に就職。18歳から保全業務16年。機械に潜って油塗れになったり、真夏の夜勤明け40℃近い地下ピットで熱中症になったりしてました。バリバリのゲーム好きインドアオタクなのに、仕事は肉体系でキツかったです。

2年ほど前から、デジタル化遅れうんたら、DXうんたらということで、デジタル業務担当になりました。デジタルに関しては上層部もほとんど知識（というか興味）が無く、ほぼ丸投げ状態でしたが、逆に良かったのかもしれません。仕方なくデジタル化に関して自分で色々情報収集するうちに、AtCoderにも出会った感じです。

知識に関しては、デジタル業務と言っても管理業務（Office等）や設備からデータを取るIoTなどが主で、プログラミングに関してはプの字もわからないという状況でした。設備にはPLCという業務用のCPUみたいなものがあるので、まあ知識０じゃなく１ぐらい……？　もちろんアルゴリズム、高校数学に関しても、ほぼ知識は０です。微分？　順列？　って何ですか？
タイピングに関してだけは、学生の頃、北斗の拳タイピングゲームにハマっていたので自信がありました。

# Atcorderとは？

競技プログラミングのサービスです。

https://atcoder.jp/home

* * *

プログラミングで競技するってなんぞや？　と最初は思いました。
動画など見ると理解しやすかったです。

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

当時Factrio（自動化ゲーム）にハマっていたので、面白そうだなと思いました。
しかも無料でワンチャン仕事にも活かせそうなんて最高じゃないか？

# はじめにやったこと

興味は持ちましたが、何一つわかりません。
とにかくググりました。

https://qiita.com/snaruse0608/items/9ef0f2f5b190f142cb80

* * *

どうやら言語はPython3が初心者にはオススメだそうです。
この最初の環境設定や参加方法、コードテスト・入出力が一番ハードルが高かった気がします。

https://qiita.com/jamjamjam/items/e066b8c7bc85487c0785

入出力を覚えるとプログラミングが実際にできて、楽しくなってきました。

# その後やったこと

基本的にはわからないことがあったらググるを繰り返しました。
偉大な先人はたくさんおりましたので、何かしら引っ掛かります。
特にお世話になったリンクを張ります。

https://qiita.com/drken/items/fd4e5e3630d0f5859067

やっぱりC++の解説が多いんですが、基本的なところは下記記事のようにPythonでも解説されているので、茶色レベルぐらいまでなら困ることは無いと思います。（茶色というのはレートのランク分けだと思ってください。赤が一番レベル高いんです。カッコいいですね）

https://delta114514.hatenablog.jp/entry/2018/03/15/014555

* * *

「アルゴ式」さんは本当に基本のキから教えてくれます。プログラムや数学知識０からすると本当にありがたいです。
ただ、難しい問題もあるので全部やってから進める、ではなく随時進めるのが良いと思います。

https://algo-method.com/

* * *

「AtCoder Problems」は過去問、難易度や解いた数など参照できます。

https://kenkoooo.com/atcoder/#/table/

過去問をひたすら解くだけでもどんどんレベルが上がると思います。
あと解いた数や難易度を見るとモチベーションも上がります。（大事）

https://kenkoooo.com/atcoder/#/training/Boot%20camp%20for%20Beginners

平日は１～２時間ほどしか時間が取れないこともありますが、毎日何かしら問題を解くことを意識しました。

* * *

数学に関しては、必要とはわかっていますが頭に入ってこないので仕方ありません。
記号や順列やそういったものは意味がわからないと問題が解けないので、ググったりメモったりどうにかしています。
高校数学は通勤中にYouTubeの講座を聞き流したりしていますが、効果があるかは不明です。
まだ、大丈夫な気はしています。そのうち詰まるんでしょうね……。

# 結果

この前茶色になりました。一区切りだったので記事を書く動機にもなりました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1725939/3a4ae684-5cd4-0f36-297c-2198e2688e7a.png)


また、結果的には社会人になって長らく味わっていなかった「成長」を大きく実感できました。
正直仕事に活かせているかというと実感はないんですが、なんか論理的思考力とかそんなふんわりとした感じで活かされてるんじゃないかと思います。
[Go][備忘録] sliceをmake()する方法による挙動の違い

# はじめに

Go初心者です。
学習していて、今後つまずきそうと思ったのでメモしておきます。

# make()方法による挙動の違い

`make()`を使用してsliceを作成する場合、第2引数に`length`、第3引数に`capacity`を渡すようにしないと、`int`の初期値である`0`で埋められたsliceが作成されてしまう。

`make()`にsizeだけ渡す場合

```go
package main

import "fmt"

func main() {
	var s []int
	s = make([]int, 5)

	for i := 0; i < 5; i++ {
		s = append(s, i)
		fmt.Println(s)
	}
	fmt.Println(s)
    // -> [0 0 0 0 0 0 1 2 3 4]
}
```

`make()`にsizeとcapcityどちらも渡す場合

```diff_go
package main

import "fmt"

func main() {
	var s []int
-	s = make([]int, 5)
+   s = make([]int, 0, 5)

	for i := 0; i < 5; i++ {
		s = append(s, i)
		fmt.Println(s)
	}
	fmt.Println(s)
    // -> [0 1 2 3 4]
}
```

まあ、`make()`関数の説明にハッキリ明言されてるし大丈夫か...?

>Slice: The size specifies the length. The capacity of the slice is
equal to its length. A second integer argument may be provided to
specify a different capacity; it must be no smaller than the
length.
✏️初学者がプログラミングを学ぶにあたって心がけていること

# 意識したこと
### 目標の設定
大きく月ごとに分けるのと、それを細かく週→日ごとに目標の設定。目標は都度見直して、進捗をみつつ修正していく。修正前の目標も残せるよう、スプレッドシートにてバージョン管理。
また、目標は定量目標（学習進度、企業研究、ポートフォリオ作成）と、定性目標（定量目標を達成した時の自分を想像して）を立てる。

### 目標に対しての振り返り
毎日の目標振り返りに加え、週→月ごとの目標からの進捗も振り返る。


### 目標に近い人をそばに置く
私はコーチングでこれを実現しました。コーチングによって得られるメリットは大きく３つ、「モチベーション維持」「客観的なインプットを得られる」「知識のフィードバックがもらえる」
目標を立てて日々行動を続けられているのも、ひとえにコーチングのおかげであると感じます。

### インプットした内容の理解度が何%か
理解できているところとできていないところを明確に言語化。
１００％理解できなくていい。むしろ何度も復讐することを前提に、学習を進める。
復習するときに参考にでき、結果的に学習効率の向上が図れる。
Stable Diffusion web UIの使い方について（エラー）

MacでStabel diffusionのweb UIを使いたいのですが、
http://127.0.0.1:7860/で
web UIが起動したものの、
（./webui.shで実行）
generateしようとすると以下のエラーとなります。

RuntimeError: "log" "_vml_cpu" not implemented for 'Half'

このエラーをfixするにはどうしたら良いでしょうか？

https://www.perplexity.ai/?s=u&uuid=2d2990bd-c0d1-4d08-b008-915f49616804
↑この方法は試し済み
ブラウザゲームを作ってみよう(その13:サンプルゲーム作成その6)

# はじめに
[その12](https://qiita.com/noji505/items/9afdd2de99dcb1a14718)ではランキングの追加を行いました。
今回はサウンド処理を作成してみたいと思います。

# サウンドについて
HTML5のaudioを使ってサウンドを再生します。
サウンドを扱うプログラムは以下を作成します。

<b>読み込み</b>
サウンドファイル名を配列にしてaudioオブジェクトを生成します。
以下の処理をアプリ起動時に実行することでファイルを読み込み、再生することが可能になります。

```javascript:サウンドファイル読み込み
// 変数
var audioObject;
var isAudioPlay;

var audioFileNames = [ "bgm.mp3", "se.mp3" ];
audioLoad( audioFileNames );

function audioLoad( fileNames )
{
	var objBody = document.getElementsByTagName( "body" ).item(0);
	var i;

	audioObject = new Array( fileNames.length );

	for( i=0; i<fileNames.length; i++ ){
		audioObject[i] = document.createElement( 'audio' );
		audioObject[i].src = fileNames[i];
		objBody.appendChild( audioObject[i] );
	}
	isAudioPlay = true;
}
```

<b>再生</b>
* BGMの場合は再生終了後も自動でループ再生
* SEの場合は1度だけ再生
という違いがあるため、その指定を出来るようにしています。

```javascript:サウンド再生
playAudio( 0, true );
playAudio( 1, false );

function playAudio( num, isRepeat )
{
	if( !isAudioPlay )	return;

	if( isRepeat ){
		audioObject[num].setAttribute( 'loop', 'true' );
		audioObject[num].setAttribute( 'repeat', 'true' );
	}
	audioObject[num].play();
}
```

<b>停止</b>
停止はサウンドファイルの番号を指定するだけで可能です。
pauseだけだと停止するだけなので、合わせて再生位置もリセットしておきます。

```javascript:サウンド停止
stopAudio( 0 );

function stopAudio( num )
{
	audioObject[num].pause();
	audioObject[num].currentTime = 0;
}
```

# サンプル

いくつかのサウンドを再生出来るサンプルを作成しました
カーソルキーで選択し、スペースキーを押すと再生できます

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="VwXBvXV" data-user="noji505" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/noji505/pen/VwXBvXV">
  Qiita24_sample01</a> by nojima (<a href="https://codepen.io/noji505">@noji505</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

再生されるか試してみて下さい。

# 最後に
今回はサウンド再生を行いました。
BGMやSEが鳴るとゲームが華やかになりますね。
次回は今までのサンプルにサウンド再生を組み込んでみたいと思います。
ただただシンプルに FizzBuzz する



- [剰余演算子を使わずにFizzBuzzを解く](https://qiita.com/nkfrom_asu/items/783c6be996abe6cc2a67)

- [% 演算子を使わずとも算数の知識だけでFizzBuzzができる例](https://qiita.com/esehara@github/items/a4fbdc64896663add2ab)

- [if文を使わずにFizzBuzzしてみた](https://qiita.com/Mitz-TADA/items/e6dbcad8a4c56a735cd8)


Python は，もう忘れたので　Julia で（別のやり方で）やってみる。

```Julia
function fizzbuzz(n)
    fizzbuzz = string.(1:n)
    [fizzbuzz[i] = "Fizz" for i in 3:3:n]
    [fizzbuzz[i] = "Buzz" for i in 5:5:n]
    [fizzbuzz[i] = "FizzBuzz" for i in 15:15:n]
    return fizzbuzz
end

fizzbuzz(30)
```

```
30-element Vector{String}:
 "1"
 "2"
 "Fizz"
 "4"
 "Buzz"
 "Fizz"
 "7"
 "8"
 "Fizz"
 "Buzz"
 "11"
 "Fizz"
 "13"
 ⋮
 "19"
 "Buzz"
 "Fizz"
 "22"
 "23"
 "Fizz"
 "Buzz"
 "26"
 "Fizz"
 "28"
 "29"
 "FizzBuzz"
```

あんまり，うれしくもないなあ...
（備忘録）Well-Known ポート番号まとめ

情報処理試験の午前問題で主に出題される、Well-Knownポート番号をまとめました。

|  プロトコル  |  ポート番号  |
| ---- | ---- |
| FTP<br>: File Transfer Protocol | 20/TCP(データ転送用)<br>21/TCP(制御用) |
| Telnet | 23/TCP、23/UDP |
| SMTP<br>: Simple Mail Transfer Protocol | 25/TCP(通常メール転送)<br>587/TCP(サブミッションポート) |
| DNS<br>: Domain Name System | 53/TCP、53/UDP |
| HTTP<br>: Hyper Text Transfer Protocol | 80/TCP |
| POP3<br>: Post Office Protocol 3 | 110/TCP |
| NTP<br>: Network Time Protocol | 123/UDP |
| SNMP<br>: Simple Network Management Protocol | 161/UDP(マネージャ→エージェント)<br>162/UDP(エージェント→マネージャ) |
| HTTPS<br>: Hyper Text Transfer Protocol Secure | 443/TCP |
VisualStudioCode でJava開発（設定） 

Visual Studio CodeでJava用のエクステンションがアップデートされたとのことだったので
試してみました。（Mac環境)
https://atmarkit.itmedia.co.jp/ait/articles/2302/06/news036.html

---
どのJDKを使うか悩みましたが、以下を使いました。
### JDKインストール
https://adoptium.net/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/b75c44f1-8588-35ed-fdca-1e641ddf3da6.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/5ae23f66-524c-ebf9-dac2-dcf924f014b3.png)

---

### VSCにExtensionをインストール

こちらの手順を参考に実施
https://code.visualstudio.com/docs/languages/java


JavaCodingPack-0.4.1.zip

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/51425d1c-5417-daad-cf05-30a13afe3287.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/4fbf7100-15f4-f14d-f34f-01d1d5b1ff91.png)

インストール済みのJDKとVSCを認識。Extensionのみインストール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/a45731cf-ad7a-c570-2c8b-baa286bf6f07.png)

---
### Javaのコード、実行

javaファイル作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/ed45fae1-5584-bee7-bc4e-8d3164363ffc.png)

javaファイルを作成時点でClass宣言されている！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/359d08cb-c61e-dfe4-c932-0a39fca33051.png)

maといった時点で補完がきき、選択することでmainメソッド作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/0810d9b3-fcbf-6ff7-cf1a-0dc730d00fc0.png)

Runをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25604/00649f06-6f54-afb0-d09d-b485e22f1baa.png)

実行できました。使いやすい。

---

次は以下を試そうと思います。
https://code.visualstudio.com/docs/java/java-spring-boot
SQLで特定の単語を含む行を表示する

スペース区切の文章のカラムに対して、特定の単語を含むレコードを表示するＳＱＬ

以下のサイトで実験できます。
http://sqlfiddle.com/#!18/4a8d3b/7

スキーマ：
CREATE TABLE ForgeRock
    ([productName] varchar(23), [description] varchar(57))
;

INSERT INTO ForgeRock
    ([productName], [description])
VALUES
    ('OpenIDM', 'Platform for building enterprise provisioning solutions'),
    ('OpenDJ', 'Robust LDAP server for Java'),
    ('OpenAM', 'Full-featured access management'),
    ('OpenAM', 'Full-featured access management'),
    ('OpenDJ', 'Robust LDAP server for Java'),
    ('OpenDJ', 'Robust LDAP server for Java')
;


SQL：
SELECT *
  FROM ForgeRock
where    (SELECT COUNT(*) FROM STRING_SPLIT([description], ' ') WHERE value = 'for') > 0



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374317/6c71192c-fb0d-84e8-e866-2861819596e5.png)
laravel 初期設定 タイムゾーンと言語ファイル

# laravel初期設定
Laravelを使用したプロジェクトを作成した際に初期設定として行う事柄を記載しています。

Laravel プロジェクトを作成してデフォルトは英語になっているため、
タイムゾーンと言語をまず設定していきます。

# タイムゾーンとローカル

`config/app.php`を開き、設定を変更します。

1.以下の部分でタイムゾーンを変更します。

```php:config/app.php
'timezone' => 'Asia/Tokyo', // デフォルトは'UTC'
```

2.同じようにローカルの変更をします。

```php:config/app.php
'locale' => 'ja', // デフォルトは'en'
```

【必要であれば】ダミーデータの日本語対応

```php:config/app.php
'faker_locale' => 'ja_JP'; // 日本語対応
```


# 言語ファイル設定
作成したプロジェクトのディレクトリにてタームナルを開き下記のコマンドを実行することで、
Laravel公式が記載している日本語フォルダのインストールを実行することができます。
```
php -r "copy('https://readouble.com/laravel/8.x/ja/install-ja-lang-files.php', 'install-ja-lang.php');"
php -f install-ja-lang.php
php -r "unlink('install-ja-lang.php');"
```
こちらのコマンドを実行すると言語ファイルが作成されますが、Laravel9 では lang/ja に日本語ファイルを置く必要があります。
上記の方法では resources/lang/ja に日本語ファイルが作成されるので移動させ忘れないようにご注意ください。

# 補足
言語ファイル設定にて日本語にした後、バリデーション等でカラム名をエラー文などに使用する際にカラム名がそのまま英語表記で出てしまうかと思います。
そういった場合は、言語ファイル設定で追加された`lang/ja/validation.php`の下記の部分に追加していくとエラー文などでも変換されて表示できます。

```php
   /*
    |--------------------------------------------------------------------------
    | カスタムバリデーション属性名
    |--------------------------------------------------------------------------
    |
    | 以下の言語行は、例えば"email"の代わりに「メールアドレス」のように、
    | 読み手にフレンドリーな表現でプレースホルダーを置き換えるために指定する
    | 言語行です。これはメッセージをよりきれいに表示するために役に立ちます。
    |
    */

    // 追加したい項目を追加していく
    'attributes' => [
        'title'   => '件名',
        'content' => '本文',
    ],
```
【SwiftUI】Textに一部だけ背景色を付ける

# はじめに
`Text`内でスタイルを変えないといけない場面に遭遇して、こんな方法があるんだと思ったことがあったので記録しておきます。

# やりたいデザイン
テキストが折り返されても最初の行から始めたい(伝われ)
これは`HStack`では実現できません。
![simulator_screenshot_5AE81043-1425-4BDC-8827-9336376CC50F.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/fcc5cbe9-6a31-9a08-9c61-e9223d69ff19.png)

# 実装方法
```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        VStack(alignment: .leading, spacing: 10) {
            Text(makeAttributedStringText(text: "重要 明日は面談あり明日は面談あり明日は面談あり明日は面談あり明日は面談あり明日は面談あり"))
            Text(makeAttributedStringText(text: "確認 配布資料を持つ配布資料を持つ配布資料を持つ配布資料を持つ配布資料を持つ配布資料を持つ"))
            Text(makeAttributedStringText(text: "重要 目覚ましをかける目覚ましをかける目覚ましをかける目覚ましをかける目覚ましをかける"))
            Text(makeAttributedStringText(text: "注意 明日は6時半起き明日は6時半起き明日は6時半起き明日は6時半起き明日は6時半起き明日は6時半起き"))
        }

    }

    func makeAttributedStringText(text: String) -> AttributedString {
        var attributed = AttributedString(text)

        if let range = attributed.range(of: "確認") {
            attributed[range].foregroundColor = .white
            attributed[range].backgroundColor = .green
            attributed[range].font = .headline
        } else if let range = attributed.range(of: "重要") {
            attributed[range].foregroundColor = .white
            attributed[range].backgroundColor = .red
            attributed[range].font = .headline
        } else if let range = attributed.range(of: "注意") {
            attributed[range].foregroundColor = .white
            attributed[range].backgroundColor = .yellow
            attributed[range].font = .headline
        }

        return attributed
    }
}
```

# おわり
やりたいことができてよかったです

# 参考記事
https://ios-docs.dev/attributedstring/
Apacheを介してWebSocketを試した備忘録

# はじめに
「シェルスクリプトマガジンVol81」のWebSocketの記事を読んで試してみたので備忘録。
サーバ、クライアントのソースは同誌をベースにさせていただいたので割愛。

# 環境
RedHat EnterpriseLinux 8.7
Python 3.8 

# プログラムおよび環境設定
## サーバ側
:::note info
サンプルソースでは使用している`asyncio.run()`はPython3.7以降の機能であるため、Python3.8を使用することにした。
:::
```
# su 
# pip3.8 install websockets
# exit
$ cd ~/webchat_server
$ ./server.py
```

## クライアント側
まずは、サーバプログラムの動作確認のため、ポート開放してブラウザでの確認を行った。

:::note info
ポート未開放の場合
```
# su 
# firewall-cmd --add-port=ポート番号/tcp
# exit
```
:::

http://192.168.1.106/webchat/

プログラムは以下の通り
/www/html/webchat
1. index.html
1. client.js


## Apacheを介してSSLで通信するように修正
1\. Apacheの設定を変更して再起動。
wstunnelを有効にして/chatへのアクセスをWebSocketサーバに向ける。
```diff:http.conf
-#LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
+LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
```
```diff:extra/httpd-ssl.conf
+ProxyPass /chat ws://localhost:ポート番号/
+ProxyPassReverse /chat ws://localhost:ポート番号/
```
```
# systemctl restart httpd
```

2\. client.jsのURLを変更
```diff:client.js
-let socket=new WebSocket("ws://192.168.1.106:8765/");
+let socket=new WebSocket("wss://192.168.1.106/chat/");
```

3\. 単体で動作させたときと同様にWebからアクセスする
https://192.168.1.106/chat/


# 参考
「シェルスクリプトマガジンVol81」

https://www.iseeit.jp/if-sub-180309.html

https://blog.narumium.net/2019/08/11/%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%AB%E3%83%9B%E3%82%B9%E3%83%88%E3%81%AEwebscoket%E3%81%ABssl%E3%82%B5%E3%82%A4%E3%83%88%E3%81%8B%E3%82%89%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B/

https://www.cresc.co.jp/tech/java/Google_Dart2/servers/websocket/websocket.html
sqlで、指定カラムで重複があれば値と重複数を表示する

データが、
OpenAM
OpenAM
OpenIDM
OpenDJ
OpenDJ
OpenDJ
のようにあるとき、
OpenAM が2個、
OpenDJ が3個、という情報を得たいときのSQLです。
SQL SERVER用のSQLです。


以下のサイトで実験できます。
http://sqlfiddle.com/

スキーマ
CREATE TABLE ForgeRock
    ([productName] varchar(23), [description] varchar(57))
;

INSERT INTO ForgeRock
    ([productName], [description])
VALUES
    ('OpenIDM', 'Platform for building enterprise provisioning solutions'),
    ('OpenDJ', 'Robust LDAP server for Java'),
    ('OpenAM', 'Full-featured access management'),
    ('OpenAM', 'Full-featured access management'),
    ('OpenDJ', 'Robust LDAP server for Java'),
    ('OpenDJ', 'Robust LDAP server for Java')
;


SQL：
WITH CTE AS (
   SELECT productName, ROW_NUMBER() OVER (PARTITION BY productName ORDER BY productName) AS RowNum
   FROM ForgeRock
)
SELECT productName, COUNT(*) as DuplicateCount
FROM CTE
GROUP BY productName
HAVING COUNT(*) > 1;



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374317/4d8ad5b7-538c-ae72-f601-bfa0c694e178.png)
【個人開発】AIでVTuberを作るのに必要な知識は、機械学習の知識ではない【AITuber】

## はじめに

先日、Virtual YouTuberを作りました。普通のVTuberとは異なり、コメントを広い、対話をしてくれるのはAIです。

https://twitter.com/sald_ra/status/1624057777361416195

AIVTuberというジャンルへの注目度は日に日に高まっていますが、一見機械学習の知識がたくさん必要で、実装が難しいように思う方も多くいるかと思います。
しかし実際は機械学習の知識は(合ったほうが勿論良いですが)そこまで必要ないです。

この記事ではAIVTuber作成のハードルを下げることを目標にしています。よって想定読者は「専門科目として機械学習を勉強していないがAIVTuberを作ってみたい人」を対象にしています。

## 方針の策定
「AIVTuber」に必要な要件をまず考えます。高度なことをやっているように思えますが、以下に分解するとイメージがつきやすくなります

- YouTubeコメントの取得
- 取得した質問にAIで回答
- 回答した文字列を合成音声に変換
- 音声を任意のデバイスに出力
- 配信ソフトにコメントと回答を出力
上述のもので不安に感じるのはAIの回答部分、音声合成ソフト部分、配信ソフト部分の３つかと思います。

YouTubeはAPIが存在しますし、音声出力も各言語に対応したライブラリが配布されているためです。

下記にツールの選定結果を記述していますが、先にハードルが高いAI回答の部分だけ答えを出します。それは「OpenAIが公開してるAPIを利用しろ」です。

## OpenAIのAPIについて
OpenAIはその名の通り、AIについてのサービスを豊富に展開している団体です。この記事ではそれくらいの理解で問題ないです。

大事なのは文章生成ができるAIのAPIが公開されているということです。

ざっくり言うと、このAPIに質問文を投げれば回答が帰ってきます。つまりあなたが「最短で対話AIVTuberを実装したい！」と思っているときにやるべきは機械学習の勉強でも、機械学習の論文を読むことでもなく、OpenAIの文章生成AIの使い方が書いてある入門サイトを読むこと、そしてAPIのリファレンスを読むことです。OpenAIの文章生成AIの利用方法はnoteが存在するので、こちらを参考にすると良いです。

https://note.com/npaka/n/nf8a38f49607e

## 音声合成ソフトとの疎通
音声合成ソフトはVOICEVOXというソフトが存在します。このソフトはテキストを食わせると任意の声が返ってくるローカルAPIが起動します。この記事は音声合成ソフトとマイクを用いてPythonで音声変換を行う記事ですが、そこでも同じ技術を用いています。

https://qiita.com/sald_ra/items/d62e35a0f66586e681d4

少し詰まった部分として、wav形式の音声がbytes型で送信されるので、変換部分だけ工夫する必要があります。

https://twitter.com/sald_ra/status/1618211925606944769

## 配信ソフトとの疎通
回答を音声に載せるだけでも良いのですが、配信映えを考え配信に回答文を載せたいかと思います。今一番大手のOBSは公式でwebsocket(v5)に対応しているので、obsのreferenceを読みながら実装してください。少しわかりにくい部分かと思うので、時間ができ次第また記事を書く予定です。

## まとめ
これらを総合すると、AIVTuberとは「各種API群をうまく繋げ、音声と回答文を配信ソフトに載せるシステム」であることがわかります。

もちろんローカルでAPIの部分を自分で演算することもできますし、逆にAPIとの疎通をするシステムも全てクラウドに置くことも可能です。

AIVTuberを制作するにあたって必要なのは特筆すべき技術力ではなく、試しに作ってみる好奇心だと自分は考えています。この記事をきっかけに作ってみる方が増えることを願っています。

## 宣伝
もし質問などあれば、以下Twitterアカウントまでよろしくお願いします。

https://twitter.com/sald_ra
macOS で C++ からラズパイ用のバイナリ作る話 (zig)

# これは何？

macOS 上で ラズパイバイナリを作るに当たり。
zig で作ったら失敗したよ、という話と、簡単だったよ、という話。

# まずは失敗した話

```shell
$ zig version
0.10.1
$ zig c++ -std=c++20 -Wall --target=arm-linux-gnueabi main.cpp
warning(compilation): libc++ does not work on multi-threaded ARM yet.
For more details: https://github.com/ziglang/zig/issues/6573
error: unable to create compilation: TargetRequiresSingleThreaded
```

などとなり、失敗する。

`arm-linux-gnueabihf` でも　`arm-linux-musleabihf` でも`thumb-linux-musleabi` でも同様。

残念。

# そして成功した話

ふと。
ARM64 Linux だったら行けるのかも。
と思って試してみた。

```shell
$ zig version
0.10.1
$ zig c++ -std=c++20 -O2 -Wall --target=aarch64-linux-musl main.cpp
$ zig c++ -std=c++20 -O2 -Wall --target=aarch64-linux-gnu main.cpp
```

どちらも成功。
ラズパイ上で実行したら、ちゃんと動いた。今のところなんの問題もない。

`std::thread` などを使ってもちゃんと動く。

## いいこと

### tool chain の整備が簡単。

`brew install zig` だけで手に入る。簡単。

### ビルドが簡単

例えばソースコードが `foo.cpp` `bar.cpp` `baz.cpp` の３つなら、

```shell
$ zig c++ 略 foo.cpp bar.cpp baz.cpp
```

と、書けばよい。

「略」の部分は `-std=c++20 -O2 -Wall --target=aarch64-linux-musl -I hoge/include` など。

これで makefile 経由でのビルド同様、オブジェクトファイルよりソースコードが新しければオブジェクトを作り直すし、そうじゃなければ最新のものを使う、とういことになる。

`--target=` の指定を変えれば Windows 版も macOS on AMD64 版も ARM64 Linux 版も作れる。
なぜか 32bit ARM Linux 版は作れないけれど。

# 感想

ラズパイ 3B+ や ラズパイ4 を使う場合、これを理由に 64bit OS を選ぼうと思う。

なにか事情がある場合は仕方ないけど、64bit Linux をファーストチョイスにする。
Rancher Desctopインストール後にCannot connect to the Docker daemon

# Rancher Desctopインストール後にDocker Buildでエラー
Dockerサービスが起動していない・・・？
```
docker ps
# Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
```

# 解決法その１
インストール時に`Always run without administrative access`のチェックを入れない。

## 補足
ここまではいくつかのサイトに載っていましたが、どうやって再インストールするのかがわからなくて困ったので補足です。
[アンインストール方法](https://docs.rancherdesktop.io/faq/)が公式に載っていました。（一部抜粋）
> 1. Perform Troubleshooting > Factory Reset from the current installation. Please make sure the Keep cached Kubernetes images box is not checked in the Factory Reset pop up dialog.
> 2. Uninstall the current version by following uninstallation instructions for your OS.

おそらく1.の`Factory Reset`をやった後に再起動で再インストールになると思います。
というのも私はアプリのアンインストールから再インストールをしたので・・・
もし`Factory Reset`だけで再インストールできないようならアプリのアンインストールも試してみてください。

# 解決法その２
上記だけだと状況変わらずだったので再調査の結果、`Preference > Container Engine > General`を`docked(moby)`にしないといけないようでした。
これにてサービスが起動して正常に利用できるようになりました。
AWS CDK トラブルシューティング

# ①　

## 問題①

以前動作していたコードがエラーになるのは通常、AWS Construct ライブラリモジュールのバージョンが一致しない場合の症状です。

AWS Construct ライブラリを構成するすべてのモジュールは、一致しているセットとして提供されます。すべての AWS Construct ライブラリモジュールが同じバージョンであり、最新であることを確認すると、ほとんどのエラーフラグが解消されます。


## 解決策①
インストールされているすべての AWS Construct ライブラリモジュールのバージョンを確認するには、ターミナルウィンドウで `npm outdated` コマンドを実行します。(古くなったバージョンのみを表示)

```
npm outdated

Package                  Current   Wanted   Latest  Location                              Depended by
@aws-cdk/aws-apigateway  1.191.0  1.192.0  1.192.0  node_modules/@aws-cdk/aws-apigateway  MyWidgetService
@aws-cdk/aws-lambda      1.191.0  1.192.0  1.192.0  node_modules/@aws-cdk/aws-lambda      MyWidgetService
@aws-cdk/aws-s3          1.191.0  1.192.0  1.192.0  node_modules/@aws-cdk/aws-s3          MyWidgetService
```

`npm update` コマンドを実行して、すべてのパッケージを最新バージョンに更新します。

```
npm update
```

# ②

## 問題②

cdk synth を実行すると、
`--app is required either in command-line, in cdk.json or in ~/.cdk.json`
と表示される。

```
cdk synth
****************************************************
*** Newer version of CDK is available [2.64.0]   ***
*** Upgrade recommended (npm install -g aws-cdk) ***
****************************************************

--app is required either in command-line, in cdk.json or in ~/.cdk.json
```

## 解決策②

CDK プロジェクトのメインディレクトリでないところで、cdk synth を実行しているため、メインディレクトリに移動してから実行する。

```
cd sample-app

sample-app % cdk synth
```

# ③

## 問題③

cdk destroy コマンドを実行しても、デプロイされたリソースが削除されない。

## 解決策③

ユーザーデータを含むことができるリソースの場合、CDK は `removalPolicy` プロパティを、デフォルトで `RETAIN` に設定されます。
`removalPolicy` プロパティを `DESTROY` に変更すると、このプロパティを上書きし、cdk destroy コマンドを実行すると、削除されます。
削除プロセス中にリソースが削除されない場合、リソースを手動で削除する必要があります。

```python
from aws_cdk import (
    Stack,
    aws_s3 as s3
)
from constructs import Construct

class MyWidgetServiceStack(Stack):

    def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)

        bucket = s3.Bucket(self,"cdk-s3-multi-sample",
            removal_policy = core.RemovalPolicy.DESTROY)
```
ubuntuを日本語環境に変更したい

# 実行環境
* OS MacOS Ventura13.2
* Docker Desktop
* Docker image ubuntus:latest

# 実践
コンテナを起動してlocaleコマンドを叩いてみる

```ruby:
root# locale
LANG=ja_JP.utf8
LANGUAGE=
LC_CTYPE="POSIX"
LC_NUMERIC="POSIX"
LC_TIME="POSIX"
LC_COLLATE="POSIX"
LC_MONETARY="POSIX"
LC_MESSAGES="POSIX"
LC_PAPER="POSIX"
LC_NAME="POSIX"
LC_ADDRESS="POSIX"
LC_TELEPHONE="POSIX"
LC_MEASUREMENT="POSIX"
LC_IDENTIFICATION="POSIX"
LC_ALL=
```
※画像で表記されてるPOSIXっていうのは、UNIXライクなOS間で互換性を保つために標準規格されたものみたい。

それで、日本語化するにはこいつらを「ja_JP.UTF-8」に設定しないといけない。
上の奴らを変えるだけなら超簡単なんだけど、docker-hubからpullしてきたubuntuイメージには「ja_JP.UTF-8」はロケールの中に含まれていない？で合ってると思う。

```ruby:
root# locale -a | less
```


![dkfj青家￥￥.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127491/919c4322-a055-ec94-d608-b653925868d0.jpeg)

※初期状態の使用可能なロケール一覧

ここから、日本語化環境を設定する。
まず、日本語化に必要なパッケージをインストールする。

```ruby:
root# apt-get update
root# apt-get install -y language-pack-ja-base language-pack-ja locales
root# locale-gen ja_JP.UTF-8
root# echo "export LANG=ja_JP.UTF-8" >> ~/.bashrc
root# source ~/.bashrc
````

３行目のlocale-genコマンドはシステムでローケル利用するために、生成する為に使用するコマンド。
「/etc/locale.gen」ファイルのものを生成する。
引数を指定してやるとそのロケールのみが生成される。
特定のロケールの前に#をつけると該当箇所のみロケールが生成されない。

叩いて実践してみるとすぐ頭に入りました。笑


４行目は.bashrcファイルにLANG=ja_JP.UTF-8を追記してあげて、
５行目のsourceコマンドで実行してやることでlocaleの環境変数を変更している。

ここで、もう一度最初のlocaleコマンドを叩いてみる

```ruby:
# locale
LANG=ja_JP.utf8
LANGUAGE=
LC_CTYPE="ja_JP.utf8"
LC_NUMERIC="ja_JP.utf8"
LC_TIME="ja_JP.utf8"
LC_COLLATE="ja_JP.utf8"
LC_MONETARY="ja_JP.utf8"
LC_MESSAGES="ja_JP.utf8"
LC_PAPER="ja_JP.utf8"
LC_NAME="ja_JP.utf8"
LC_ADDRESS="ja_JP.utf8"
LC_TELEPHONE="ja_JP.utf8"
LC_MEASUREMENT="ja_JP.utf8"
LC_IDENTIFICATION="ja_JP.utf8"
LC_ALL=
```

狙い通り変更できました。
これで、日本語化の設定は終わりです。

最後に、logfileを作成して超効率的に日本語化環境を構築する方法もあります。
それは今回私がすごく参考にした記事に詳細が記載されていますので、興味があれば参照して下さい。
https://rooter.jp/infra-ops/build_docker_jp_env/

#参考文献
https://rooter.jp/infra-ops/build_docker_jp_env/
https://wiki.archlinux.jp/index.php/%E3%83%AD%E3%82%B1%E3%83%BC%E3%83%AB
https://www.wakuwakubank.com/posts/389-linux-bashrc/
React初心者がやるReact Hooks -useReducer編-


アウトプットのために簡単なカウンターアプリをReact HooksのuseReducerを使用して作成する

:::note info
本記事は[React初心者がやるReact Hooks -useState編-](https://qiita.com/kdevarch/items/77f9e6d7b24f7162314d)のカウンターアプリを`useState`から`useReducer`に書き換えたものです。
:::

# Coutner.tsxの作成
前回の`useState`と違う点はマイナスの表示は出来ないようにしている
```Counter.tsx
import React, { useReducer } from 'react';
import '../index.css';

type State = {
  count: number;
};

type Action = { type: 'INCREMENT' } | { type: 'DECREMENT' } | { type: 'RESET' };

const initialCount = {
  count: 0,
};

const reducer = (state: State, action: Action) => {
  switch (action.type) {
    case 'INCREMENT':
      return { count: state.count + 1 };

    case 'DECREMENT':
      return { count: state.count > 0 ? state.count - 1 : 0 };
    case 'RESET':
      return { count: 0 };
    default:
      return state;
  }
};

const Counter: React.FC = () => {
  const [state, dispatch] = useReducer(reducer, initialCount);
  return (
    <>
      <h1>{state.count}</h1>
      <button className="plus" onClick={() => dispatch({ type: 'INCREMENT' })}>
        +
      </button>
      <br />
      <button className="minus" onClick={() => dispatch({ type: 'DECREMENT' })}>
        -
      </button>
      <br />
      <button className="reset" onClick={() => dispatch({ type: 'RESET' })}>
        RESET
      </button>
    </>
  );
};

export default Counter;
```


# index.cssの作成
少しボタンをおしゃれにする
```index.css
.App {
  margin: 0 auto;
  text-align: center;
}

.plus {
  border: 0;
  text-align: center;
  display: inline-block;
  padding: 14px;
  width: 150px;
  margin: 7px;
  color: #ffffff;
  background-color: #36a2eb;
  border-radius: 8px;
  font-family: 'proxima-nova-soft', sans-serif;
  font-weight: 600;
  text-decoration: none;
  transition: box-shadow 200ms ease-out;
}

.minus {
  border: 0;
  text-align: center;
  display: inline-block;
  padding: 14px;
  width: 150px;
  margin: 7px;
  color: #ffffff;
  background-color: red;
  border-radius: 8px;
  font-family: 'proxima-nova-soft', sans-serif;
  font-weight: 600;
  text-decoration: none;
  transition: box-shadow 200ms ease-out;
}

.reset {
  border: 0;
  text-align: center;
  display: inline-block;
  padding: 14px;
  width: 150px;
  margin: 7px;
  color: #ffffff;
  background-color: gray;
  border-radius: 8px;
  font-family: 'proxima-nova-soft', sans-serif;
  font-weight: 600;
  text-decoration: none;
  transition: box-shadow 200ms ease-out;
}
```

# 完成系
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2860566/38f93583-9b29-0bdd-3edb-b19c4812746e.gif)
Keil Studio , LPC812MAXと超音波距離センサーHC-SR04でシリアル出力



x @sasakisanさんの記事を非営利、研究目的で参考にして移植しました。



目的
HC_SR04からのPWMの受信
Keil Studio用に焼き直し



![o_cop379.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/024d8c4e-f429-a635-909f-783d5b3db875.jpeg)


![o_cop380.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/8e0a2aa7-5a7a-f5d6-815f-89c9501b2c92.jpeg)


![o_cop381.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/35ef56d6-ad72-db93-4703-5d2b4b9b1b8e.jpeg)




```c++



//Keil Studio   ( mbed2 )
//serial_HC_SR04_812_1


#include "mbed.h"


Serial pc(USBTX, USBRX); // tx, rx


#define HIGH 1
DigitalOut TRIG(P0_17);   //green   D8
DigitalIn  ECHO(P0_7);    //red     D7


//タイマーの設定
Timer t;


//PA_5のオン時間をusで測る　今のところ引数は、無効
int pulseIn(int pin1,int pu1,int timeout1)
{

    t.reset();//タイマーの開始

    //タイムアウトの設定
    //timeout1 = 32000000;
    timeout1 = 100000;    //28ms
    //timeout1 = 1000;   //degbu

    //while(PA_5 == 0) {} //オフの間は、無限ループ

loop_s1:
    timeout1--;
    //                                     5432109876543210
    if (     (~(LPC_GPIO_PORT->PIN0))  & 0b0000000010000000     ) {
        if ( timeout1 ) {
            goto loop_s1;
        }
    }


    int sd = t.read_us();//測定開始

    //タイムアウトの設定
    //timeout1 = 32000000;
    timeout1 = 100000;     //28ms
    //timeout1 = 1000;   //degbu

    //while(PA_5 != 0) {} //オンの間は、無限ループ

loop_in1:
    timeout1--;
    //                               5432109876543210
    if (   (LPC_GPIO_PORT->PIN0) & 0b0000000010000000   ) {
        if( timeout1 ) {
            goto loop_in1;
        }
    }


    return(t.read_us()-sd);//測定終了

}//pulseIn

//メインルーチン
int main() {

  unsigned long times; //測定時間
  int distance;        //長さ　単位は、mm

  //タイマーの開始
  t.start();

  // GPIOの初期化
  TRIG = 0;

  //無限ループ
  while (1) {

    // 超音波を発生させる
    TRIG = 1;
    wait_us(10);
    TRIG = 0;

    // 超音波を受け取る
    times = pulseIn( 5, HIGH,2000000);

    // times = (unsigned long)7700/2; //debug
    // times = 1177; // debug 1ms 20.0cm
    // times = 942;//debug 1ms 16.0cm

    //時間を距離に変換する　音は、1秒間に約340メートル進む
    //速さx時間は距離
    //まず往復なので1/2にする
    // times/2
    // 340 x (times / 1000) 単位が秒なのでそろえてあげる
    // distance = (int)(times * 0.017);
    distance = (int)((times * ((unsigned long)(17))) / 100);

    //距離の表示
    pc.printf("%d\n\r", distance);

    wait_us(500 * 1000); // 0.5秒待つ

  } // while

} // main



```
Ruby even?メソッド

# even?メソッド
対象の数値が「偶数」かどうかを判断するメソッド。
対象の要素の値が偶数であれば真を返し、そうでない場合は偽を返します。
これはRubyが元々用意しているメソッドです。

下記URLはeven?メソッドの公式リファレンスです。
https://docs.ruby-lang.org/ja/latest/method/Integer/i/even=3f.html

例1
```ruby
puts 10.even?
```
```ruby
true
# ターミナルの返し
```
例2
```ruby
puts 5.even?
```
```ruby
false
 # ターミナルの返し
```

# even?メソッドを使って偶数血の取得をするプログラムを作成します
配列にある値の中から偶数の数をカウントして出力するメソッドを作ります。

出力例：
```ruby
count_evens([2, 1, 2, 3, 4]) → 3
count_evens([2, 2, 0]) → 3
count_evens([1, 3, 5]) → 0
```

```ruby
def count_evens(nums)
  count = 0
  nums.each do |num|
    if num.even?
      count += 1
    end
  end
  puts count
end
count_evens([2, 1, 2, 3, 4])
```

```ruby
3
# ターミナルでの返し
```

## 解説
- count = 0
今回は、配列の中の偶数がいくつあるのかを数える必要があります。
カウントした数を保持するための変数が必要なので、変数countを用意しました。

変数countをeach文の処理に記述すると、処理が繰り返されるたびにcount = 0が実行されます。
そして、countの数値が0に上書きされるという仕組みです。

- each文内
配列の中にある数字をeach文で１つずつ取り出し、even?メソッドで偶数かどうかの判定をしてもらい、偶数だった場合はcountに1を足していきます。
CloudFormation の 擬似パラメータについて整理しよう

`AWS::AccountId`
`AWS::NoValue`
`AWS::Region`
は個人的によく使う。

# AWS::AccountId

`123456789012` のように、AWSアカウントが返される。

# AWS::NoValue

組み込み関数 `!If` の戻り値として指定すると、対応するリソースのプロパティを削除します。

次の例では、`IsBurstType` が 
`true` の場合は、`CPUCredits: standard` を返し、
`false`の場合は、`CreditSpecification` を削除します。

```yaml
AWSTemplateFormatVersion: "2010-09-09"
Parameters:
  IsBurstType:
    Type: String
    AllowedValues: ['true', 'false']

Conditions:
  IsBurstType: 
    Fn::Equals: ['true', !Ref IsBurstType]

Resources:
  EC2Instance:
    Type: "AWS::EC2::Instance"
    Properties:
      CreditSpecification:
        Fn::If:
          - IsBurstType
          - CPUCredits: standard
          - !Ref "AWS::NoValue"
```

# AWS::Region

`ap-northeast-1` のように、AWSリージョンが返される。

# AWS::NotificationARNs

現在のStackの通知に使われるARNのリストを返す。

```yaml
myASGrpOne:
  Type: AWS::AutoScaling::AutoScalingGroup
  Version: '2009-05-15'
  Properties:
    NotificationConfigurations:
    - TopicARN:
        Fn::Select:
        - '0'
        - Ref: AWS::NotificationARNs　
      NotificationTypes:
      - autoscaling:EC2_INSTANCE_LAUNCH
      - autoscaling:EC2_INSTANCE_LAUNCH_ERROR
 ```

# AWS::Partition

標準の AWS リージョンの場合、`aws` 
他のパーティションのリソースの場合は `aws-partitionname`

# AWS::StackId

`arn:aws:cloudformation:us-west-2:ap-northeast-1:stack/teststack/51af3dc0-da77-11e4-872e-1234567db123` のように、スタックの ID を返す。

# AWS::StackName

スタックの名前が返される。

# AWS::URLSuffix

通常 `amazonaws.com` です。
【未経験3ヶ月目】仕事の型を作る


# はじめに
未経験3ヶ月目では、「鬼滅の刃」の影響を受けたこともあり、仕事の型を作ることに着手しました。テニス等のスポーツでもフォームを作るために、素振りを練習するところから始めることが多いと思います。事前準備として変な型を身に付けないために、[未経験1ヶ月目で業務効率化](https://qiita.com/GitHub-rensyuu/items/d4001b0804d2b96eec78)に取り組み、さまざまなやり方を検討した上で仕事の型を決めました。
なるべく実務で汎用性があるほど、慣れによるスピードアップと大幅な時間削減ができるため、自分にあった仕事の型を作ることが、仕事を早く終わらせるためのポイントだと考えました。

# 実際に作成した仕事の型
私は仕事の型として、
以下3画面で仕事をする操作に慣れるように練習しました（なるべく他の使わない画面を開かないようにを徹底しました）。
①実務の参考となる画面
②実務を行う画面
③フローの書き出し・内容整理を行うノート画面

現場でもこの3画面はよく使うので、慣れているほどスピードアップになるように感じました。特に③に関しては、以下のように報連相と自己解決面で活かせたので、やっておいて良かったと感じました。
・報連相面：仕事を依頼されたときにその場で仕様を書き出し、不明点・補足を依頼主と共に確認し、仕様早くを固められた。
・自己解決面：初見では分からないことのフローをノートに書き出すことで整理し、自己解決できることが増えた。


# 感想
現場に出る前は不安でしたが、現場1ヵ月目は予定の2日前に仕事を終わらせることを継続でき、提出した制作物の評判も良かったため、下地は作れたのだと感じました。今後も月の目標を達成できるようにしていきたいと思います。
配列のテストでクラッシュさせないための工夫

配列を返すメソッド等のテストで、配列の中身をアサートするとき、
以下のようにアクセスすると、クラッシュする場合がある。

```swift
let Items = [
    "hoge",
    "fuga",
]

XCTAssertEqual(Items.count, 3)
XCTAssertEqual(Items[0], "hoge")
XCTAssertEqual(Items[1], "fuga")
XCTAssertEqual(Items[2], "piyo") // Thread 1 : Fatal error : Index out of range
```

テストがクラッシュすると、重要な情報が失われる。
この場合、Xcodeの画面上で表示される情報は、範囲外のインデックス指定でクラッシュしたことのみで、
1つ目のアサーション`XCTAssertEqual(Items.count, 3)`が失敗していることは表示されない。
クラッシュ自体はテストの失敗と見なすことができるが、失敗に関しての情報は多ければ多いほど、
その対処は容易になる。

以下のようにCollectionを拡張することで、安全にアクセスすることができる。
```swift
extension Collection {
    subscript(safe index: Index) -> Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
```
safe subscript を使えば、範囲外のインデックスを指定した時に`nil`を返す。

これを使用して、テストを書くと以下のようになる。
```swift
let Items = [
    "hoge",
    "fuga",
]

XCTAssertEqual(Items.count, 3) //XCTAssertEqual failed: ("1") is not equal to ("3")
XCTAssertEqual(Items[safe: 0], "hoge")
XCTAssertEqual(Items[safe: 1], "fuga")
XCTAssertEqual(Items[safe: 2], "piyo") //XCTAssertEqual failed: (nil) is not equal to ("piyo")
```
このように、クラッシュせずにアサーションの結果が表示される。
10秒おきに乱数(1~100)を生成する、何かを作りたいと思う。

# 作成にあたる経緯　
　先日友人から、ポーカーにおいて使用する乱数ソフトなるものが欲しいと言われたため、作成することにしました。　
　どういう場合において使用するのかと聞くと、自身のハンド(手札)が勝負に出るか降りるかの微妙な場合、乱数を見て判断をするということだ。　
　しかし、乱数ソフトはネットを調べればいくらでも出てくるのだが、友人曰く、ある間隔で生成される類のものはないとのことで、それを作成してほしいと言われました。　

# 詳細　
- 乱数が生成されるまでのカウントが表示される。
- ある一定の時間が経てば乱数生成がストップされる。
- 自身で生成をストップすることができる。

# まとめ　
　今後こちらの内容で作成をしていきます。　
　定期的に進捗を報告していきます。
Office365Users.UserPhotoV2()で画像は取得できているのにエラーが表示される

今回はPowerAppsでユーザーのプロフィール画像を取得するのに使用する `Office365Users.UserPhotoV2()` にまつわるトラブルシューティングのご紹介です。

# Problem

PowerAppsでアプリを構築中、Office365Usersコネクターが提供するAPI `Office365Users.UserPhotoV2()`でエラーが発生することに気がつきました。ユーザー（Microsoft 365のテナントで登録されているユーザー）のプロフィール画像を取得するために使用していたものです。

エラーメッセージ：
> Office365ユーザー.UserPhotoV2 が失敗しました: メソッド 'UserPhotoV2' にパラメーター 'id' の無効な値があります

エラーが起きるのは、Galleryコントロールを使い、ユーザーのメールアドレスを含むレコードからなるコレクションの内容を一覧表示をするScreen（画面）の表示時です。
Galleryコントロールのテンプレートでは、ユーザーのメールアドレスをキー（引数）にして`Office365Users.UserPhotoV2()`を呼び出し、ユーザーのプロフィール画像を取得、その結果を Imageコントロールを使って表示しています：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/145a6ace-327f-b954-6ce8-f772be6feddc.png)

アプリを動作確認していると、「アプリ起動後はじめて当該スクリーンに遷移したタイミング」でエラーが発生します。こんな具合に：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/3c8b0221-5d93-f197-1c72-2f0d0cdf71f9.png)

しかしそれとほぼ同時に、Galleryコントロール内に画像がずらりと表示される・・・これがタイトルにある「画像は取得できているのにエラーが表示される」状態です。

# Solution

解決策はシンプルで、 `Users.UserPhotoV2()`関数の引数についてあらかじめ `IsBlank()`関数によるチェックを行うだけです（ここではレコードの `Email` カラムにユーザーのメールアドレスが格納されているという仮定でコードを示します）。

変更前：
```ts
Users.UserPhotoV2(ThisItem.Email)
```

変更後：
```ts
If(IsBlank(ThisItem.Email), Blank(), Users.UserPhotoV2(ThisItem.Email))
```

なぜこれでエラーが起きなくなるのでしょうか？

私の推測したシナリオはこうです：

1. アプリ起動後はじめて当該Screenを表示する。
1. Screenとその中に配置されたコントロール群の初期表示プロセスが始まる。
1. Galleryコントロールには最初ダミーのレコードからなるコレクションが渡される。ダミーのレコードの各列（プロパティ）の内容は空っぽ。
1. その内容（＝ダミー）に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
1. この時、Imageコントロールの `Image`プロパティの式 `Users.UserPhotoV2(ThisItem.Email)`も実行されるが、これは`Users.UserPhotoV2(Blank())`と同義となり、エラーが発生する。
1. その後すぐに Galleryコントロールの `Items`プロパティに設定された式により正式のコレクション（≠ダミーのコレクション）が渡される。
1. その内容（≠ダミー）に基づきGalleryコントロールとそのテンプレートに含まれる Imageコントロールその他が初期表示される。
1. この時、Imageコントロールの `Image`プロパティの式 `Users.UserPhotoV2(ThisItem.Email)`も実行されるが、`Email`プロパティは空でないのでエラーとならず、プロフィール画像の取得が成功する。

## エラーの経緯を確認する

このような推測に至ったのは、PowerAppsが提供する「監視」（モニター）の機能を使用して、処理過程のログを確認できたからです。

監視機能についてはこちらの記事などが参考になるかなと思います：

https://qiita.com/taku_maru/items/f017855da2beba315957

ログにはこんなふうな出力がされており、正式のコレクションによるGallery表示に先立ち、ダミー（？）のコレクションによるGallery表示が行われている様子が見て取れました：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50571/89bc87a1-7ccd-de81-f42f-017ec433bf8f.png)

ここから上述の推測をして、`IsBlank()`の利用を思い立ったという次第です。
Github Pagesに公開する時の罠 React + webpack + dotenv

`https://<ユーザー名>.github.io/<リポジトリ名>/`
にただ公開するだけではプロジェクトのルートが`https://<ユーザー名>.github.io/`になってしまうため、

```.env:.env
REACT_APP_ENV=<環境>
REACT_APP_PUBLIC_URL=/<リポジトリ名>
```
環境変数を設定して
```js:webpack.config.js
  output: {
    publicPath: `${process.env.REACT_APP_PUBLIC_URL}/`,
    ...
  },
```
```tsx:index.tsx
<BrowserRouter basename={process.env.REACT_APP_ENV === 'production' ? process.env.REACT_APP_PUBLIC_URL : '/'}>
    ルート定義
</BrowserRouter>
```
これで正しくパスが解決される。


publicディレクトリ内の画像を呼ぶ際には
```tsx:example.tsx
src={`${window.location.origin}/images/...`} // こうではなく
src={`${process.env.REACT_APP_PUBLIC_URL}/images/...`} // こう
```

こんなことに数時間詰まってしまった。
スキルを高める読書術

# 技術書を読むときのコツ
『技術書の読書術』を読んだので良いなと思った点を書く。

## よさそうなこと

    * 時間制限
       * 1冊90分と決めて読む。
       * ページは飛ばしてもOK。
       * 前提知識の多さに速度は左右される。
    * 一点突破
        * 好きな分野を1つ決める(できるだけ狭くするといい)
        * その分野の本を20冊読む(1年位で)
        * 随時アウトプットをする。
        * まずは、社内で1番詳しい人になるのを目指す。
        * 書籍を読みつくしたら、ネットの記事や論文を読む。
    * ソースコードを読むとき
      * "関数はこの色で塗る"というマイルールを決めて線を引くようにすると、ぱっと見でソースが理解しやすくなる。
* 発信
    * 読んだ本から得た技術でLT(ライトニングトーク)してみる。
      * PowerPoint等を使って、5分くらいで話す。
    * ブログやSNSに感想を書く。
    * 出す前に、Word等で校正する。
* その他
    * 著者をフォローする。
        * 下記サービスなどで機能あり。
            * Amazon
            * honto
            * 読書メーター
    * IT以外の雑誌をめくり、ITにかかわりそうな話題を探す。
    * 得意な言語ができたら、似ている言語を学び、次に全く違う種類の言語を学んでみる。
    * ビジネス書や新書まで範囲を広げて探してみる。
    * ITエンジニア本大賞の本を読んでみる。

## 試そうと思っていること
* 挫折した本を読み返す（当時読まなくても今なら読める可能性がある）
* 読んだ本はSNS等に感想をあげる。
* Amazonなどで良かった著者をフォローしてみる。
* 好きな分野を1つ考えて、その分野の本を読む計画を立てる。

## 備考

翔泳社さんから出ている本。
（翔泳社さんの参考書には、資格試験の時もいつもお世話になっています。）

試し読みは下記から。
[技術書の読書術](https://viewer-trial.bookwalker.jp/03/13/viewer.html?cid=4eb507b2-d521-453e-ba8f-a0a38059303b&cty=0)