OmniAICreator/Qiita-1.07M huggingface dataset:
よく使うPHPの関数10選

## はじめに
備忘録としてよく使うPHPの関数を書き留めておきました。


### 1.echo()
指定された文字列を出力します。
```php
echo "Hello, World!";
```

### 2.var_dump()
変数の型と値を出力します。デバッグ時に役立ちます。
```php
$myVar = array(1, 2, 3);
var_dump($myVar);
```

### 3.isset()
変数がセットされており、NULLでないかをチェックします。
```php
$var = '';
if (isset($var)) {
    echo '$var is set';
}
```

### 4.empty()
変数が「空」かどうかをチェックします。
```php
$var = '0';
if (empty($var)) {
    echo '$var is either 0, empty, or not set at all';
}
```

### 5.strlen()
文字列の長さを返します。
```php
$str = "Hello";
echo strlen($str); // 5
```


### 6.array_merge()
配列を結合します。
```php
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
$result = array_merge($array1, $array2);
print_r($result);
```

### 7.date()
ローカルの日付/時刻をフォーマットします。
```php
echo date("Y-m-d H:i:s");
```

### 8.strpos()
文字列内の部分文字列が最初に現れる場所を見つけます。
```php
$myString = "Hello, World!";
$findMe    = "World";
$pos = strpos($myString, $findMe);
if ($pos !== false) {
    echo "The string '$findMe' was found in the string '$myString'";
} else {
    echo "The string '$findMe' was not found in the string '$myString'";
}
```

### 9.str_replace()
文字列内の全ての出現を置き換えます。
```php
echo str_replace("world", "Dolly", "Hello world!"); // Hello Dolly!
```

### 10.file_get_contents()
ファイルから文字列を読み込みます。
```php
$contents = file_get_contents("example.txt");
echo $contents;
```

## おまけ
### 1.<?phpに締めタグはつけない
:ok_hand:
```php
<?php
echo "Hello, World!";

```
:no_good_tone4:
```php
<?php
echo "Hello, World!";
?>
```

記事を読んでくださった方は、是非弊社開発課のXもフォローしてね！
毎日エンジニアに向けた情報発信を行っています。


https://twitter.com/tech_cin
ノーズカーブと負荷側の特性

# はじめに
送配電における受電端電圧と受電端電力の関係をグラフで表したものをノーズカーブという。ノーズカーブは負荷の安定性を議論することなどに使用される。今回は単純な受電回路をもとにノーズカーブを描写することができるかどうかをプログラミングを用いて試みる。その際に、負荷側のインピーダンスと位相角を変化させることでノーズカーブがどのように変化させるのかを等高線プロットを用いることで考察した。

# 設定条件
以下のような回路（系統）をモデルとした。ただし、数値はすべて単位法とした。

![ノーズカーブ_等高線.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/edfd0373-6d40-9721-6dee-a1c00c058645.jpeg)


これにより、回路に流れる電流は以下のように表せる。

```math
\dot{I}=\frac{\dot{E}}{(r+jx)+\dot{Z}}
```

ゆえに、受電端電圧は以下のように表すことができる。
```math
\dot{V_r}=\dot{Z}\dot{I}
```

一方で、受電端複素電力は以下のように表すことができる。


```math
S_r=P_r+jQ=\dot{V_r}\bar{I}
```

ただし、負荷側の複素インピーダンスは以下のように表すものとする。

```math
\dot{Z}=Z(cos\theta+jsin\theta)
```

これにより、受電端電圧と受電端有効電力を関連付けることができる。これをもとにして以下のようなプログラムを書くことができる。

## 負荷側の位相角とノーズカーブの関係
位相角を高さとして等高線グラフを書くと以下のようになる。

```python:nose_curve.py
import matplotlib.pyplot as plt
import math 
import numpy as np
import japanize_matplotlib

#定数項
E=2.0



n=1000

z=np.linspace(0, 100, n)
theta=np.linspace(-0.5*math.pi, 0.5*math.pi, n)

Z,Theta=np.meshgrid(z,theta)

r=1
x=1

I=np.zeros((n,n))
V=np.zeros((n,n))
S=np.zeros((n,n))
P=np.zeros((n,n))
for i in range(n):
  for k in range(n):
    I[i][k]=E/((r+Z[i][k]*np.cos(Theta[i][k]))+1j*(x+np.sin(Theta[i][k])))
    V[i][k]=(Z[i][k]*(np.cos(Theta[i][k])+1j*np.sin(Theta[i][k]))*I[i][k])
    S[i][k]=V[i][k]*I[i][k].conjugate()
    P[i][k]=S[i][k].real




plt.contourf(P,abs(V),Theta/math.pi*180)
plt.xlabel("P")
plt.ylabel("V")
plt.colorbar(label="負荷側のインピーダンス角")
plt.show()
```

これを実行すると以下のような画像が出力される。

![nose_theta_jap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/73250a27-6a88-db8d-0c35-e870c0445364.png)

このグラフによると、負荷側のインピーダンスと電源側のインピーダンスが共役になったとき、送電可能な電力が最大となるインピーダンスマッチングが生じていることが読み取れる。

## インピーダンスとノーズカーブの関係
インピーダンスを高さとしてノーズカーブがどのように分布するのかを調べるために、以下のようなプログラムを書いた。

```python:nose_curve.py

import matplotlib.pyplot as plt
import math 
import numpy as np
import japanize_matplotlib

#定数項
E=2.0



n=2000

z=np.linspace(0, 10, n)
theta=np.linspace(-0.5*math.pi, 0.5*math.pi, n)

Z,Theta=np.meshgrid(z,theta)

r=1
x=1

I=np.zeros((n,n))
V=np.zeros((n,n))
S=np.zeros((n,n))
P=np.zeros((n,n))
for i in range(n):
  for k in range(n):
    I[i][k]=E/((r+Z[i][k]*np.cos(Theta[i][k]))+1j*(x+np.sin(Theta[i][k])))
    V[i][k]=(Z[i][k]*(np.cos(Theta[i][k])+1j*np.sin(Theta[i][k]))*I[i][k])
    S[i][k]=V[i][k]*I[i][k].conjugate()
    P[i][k]=S[i][k].real




#plt.contourf(P,abs(V),Theta/math.pi*180)
plt.contourf(P,abs(V),Z)
plt.xlabel("P")
plt.ylabel("V")
plt.colorbar(label="負荷側のインピーダンス")
plt.savefig("nose_curve_Z.png")
plt.show()


```

これによると以下のような画像が出力される。

![nose_curve_Z.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1686019/bcb623a3-5178-4e15-dcd4-d4fdc2d918dd.png)

このことから、負荷側のインピーダンスが増加した場合、電源側が定電圧運転を行っていた場合、端子間の電圧は増加するということが分かる。また、電力が最大となる場合は、負荷側のインピーダンスと電源側のインピーダンスが共役となるインピーダンスマッチングが生じるときである。一方で、安定化するのは下部側なので、負荷のインピーダンスが小さいときに安定化するようである。


# まとめ
今回はPythonを用いて簡単な系モデルでノーズカーブが描写できるかどうかを等高線プロットを用いて確認した。結果として負荷側のインピーダンスの位相角を変化させるにつれてP-Vの関係が変化するので、送電可能な有効電力が変化するということが理解できた。また、インピーダンスを変化させた場合、電源側と負荷側のインピーダンスが共役となるとき送電可能電力が最大になることも示唆することができた。

# 参考文献
https://amzn.asia/d/hg8okev
【備忘録】windows環境にてGit LabのリポジトリをSSHでクローンする

## この記事の目的
タイトルの通り、
"**windows環境**にて、**GitLabのリポジトリ**を、**SSH**でクローンする手順"
の備忘録になります。

#### 実行した環境について
| 種類 | 実行環境 |
|:-:|:-:|
| OS | Windows |
| シェル | Git Bash |
| git --version | git version 2.14.2.windows.1 |
| Git | GitLab |

※コマンドプロンプトやPowerShellだと `ssh-keygen` 実行時に公開鍵・秘密鍵がうまく作れなく、クローン時にパスワードを求められたのでGit Bashでの作業が無難です。（~~これを備忘録にしたいがために記事を書いた~~）

※Gitのインストールは [Gitのインストール方法(Windows版)](https://qiita.com/T-H9703EnAc/items/4fbe6593d42f9a844b1c) が参考になると思います



## 手順
カンタンです。以下の手順でクローンが出来ます。

1. ローカルで秘密鍵 / 公開鍵を作って（コマンドたたくだけ）
2. GitLabで秘密鍵を登録して
3. ローカルで `git clone` を叩く

では、やってみましょう。

### 秘密鍵 / 公開鍵を作る
Git Bashを起動して、以下コマンドを叩きます。
コマンドプロンプト等だと鍵の作成が不安定なのでGit Bashがオススメです。

```bash: Git Bash
ssh-keygen -t rsa
```

これだけで鍵の作成完了です。
`~/.ssh` に作成されていると思いますので確認してみてください。

```bash: Git Bash
ls ~/.ssh

▽実行結果
id_rsa  id_rsa.pub
```

### 公開鍵をコピー
以下コマンドを叩いて、クリップボードに公開鍵をコピーします。
のちほど、GitLabにペーストします。

```bash: Git Bash
clip < ~/.ssh/id_rsa.pub
```

### GitLabでSSH鍵を追加する
右上アイコンから「Edit profile」を選択 → 左のサイドバーから「SSH 鍵」を選択します。
すると、以下画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581713/7677d9be-35de-31f7-70e4-26eb8016595e.png)

キーには `clip < ~/.ssh/id_rsa.pub` でコピーした文字列をペーストします。
タイトルは任意のもので大丈夫です。
最後に「キーを追加」ボタンを押下します。

下に、追加したSSH鍵が表示されていればOK。

### クローンする
SSHの設定はすべて完了しました。
後は、任意のディレクトリでクローンコマンドを叩くだけです。

GitLabで、URLを取得して、以下コマンドを実行します。

```bash: Git Bash
git clone git@github.com:YOUR-USERNAME/YOUR-REPOSITORY
```




## 締め
今回は「SSHの設定はGitBashでやるとスムーズにいくよ！」な話でした。
とはいえコマンドプロンプト前提の手順とかもたくさん転がっているので、GitBash以外でもいけるはずなんですけどね。
Kubernetesでnslookupしてみる

# TL;DR

dnsutilsをインストールして、nslookupを実行するだけです。
https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

# dnsutilsのインストール

```shell
$ kubectl apply -f https://k8s.io/examples/admin/dns/dnsutils.yaml
pod/dnsutils created


$ kubectl get pods dnsutils
NAME       READY   STATUS    RESTARTS   AGE
dnsutils   1/1     Running   0          20s
```

# nslookupでDNSに問い合わせる

```
$ kubectl exec -i -t dnsutils -- nslookup prometheus-server.istio-system.svc.cluster.local
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   prometheus-server.istio-system.svc.cluster.local
Address: 10.97.230.212

$ kubectl exec -i -t dnsutils -- nslookup flagger-loadtester.test                         
Server:         10.96.0.10
Address:        10.96.0.10#53

** server can't find flagger-loadtester.test: NXDOMAIN

command terminated with exit code 1
```
mysqlのyumリポジトリを追加する

# mysql公式のyumリポジトリをシステムのリポジトリリストに追加登録する
```
yum localinstall mysql80-community-release-el7-11.noarch.rpm
```
# エラー文
読み込んだプラグイン: fastestmirror, langpacks
ファイルが開けません: mysql80-community-release-el7-11.noarch.rpmを飛ばします
何もしません。

# 解決
```
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
```
# 出典
https://stackoverflow.com/questions/70993613/unable-to-install-mysql-on-centos7#:~:text=sudo%20wget%20https%3A//dev.mysql.com/get/mysql80%2Dcommunity%2Drelease%2Del7%2D3.noarch.rpm

# 気づき
* 決められた位置にファイルがダウンロードされないと開くことができないらしい。

    centos上のブラウザを使用してguiでダウンロードすると"ユーザー名/ダウンロード"に配置される。
    しかしwgetを使うと自分のいた位置（カレントディレクトリ）に配置される。

# 疑問
```
sudo wget https://dev.mysql.com/get/mysql80-community-release-el7-11.noarch.rpm
```
urlの中にgetがなぜ入るのか？わからなかった。

# 出典
https://www.shoeisha.co.jp/book/detail/9784798161488
【10分で完結】アリババクラウド 全画面キャプチャ付きアカウント新規作成方法

# はじめに
中国No.1のアリババクラウドを触ってみたいけどアカウント用意するのが面倒。。:weary:という方のために、アカウント作成方法を全画面キャプチャ付きで分かりやすく説明します！

(体感?)10分くらいで出来ると思いますので、普段AWSやGCPを触ることが多い方もぜひ勉強がてら一緒に作成しましょう:grin:

# 手順
全部で10ステップです:sun_with_face:

1. [アリババクラウドのホームページ](https://www.alibabacloud.com/ja)へアクセス。
2. アカウント作成ページへアクセス
![スクリーンショット 2024-02-16 16.47.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/57708822-1616-8b38-f8e9-8af7423524ed.png)
3. アカウント種別を選択。(今回は個人アカウントを選択します。) 
![スクリーンショット 2024-02-16 16.48.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/2e064931-6b55-c25d-c4b4-be64a6fa3be7.png)
4. メールアドレス&パスワードを入力。
![スクリーンショット 2024-02-16 16.49.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/53c38040-c77c-f963-a3c4-d504fa6376e8.png)
5. 地域選択&電話番号を入力。
![スクリーンショット 2024-02-16 16.51.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/343a554a-fb77-2e5d-9365-ae1503aadf32.png)
6. アカウントタイプを選択。(今回は個人アカウントを選択します。)
![スクリーンショット 2024-02-16 16.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/4ce34b41-e1d5-f6b7-9d00-f26f4b4a216b.png)
7. 基本情報を入力。
![スクリーンショット 2024-02-16 16.52.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/8e633918-99f2-1c15-d2e7-115ca2f4ecf9.png)
8. 支払い方法を選択。(今回はクレジットカードを選択します。)
![スクリーンショット 2024-02-16 16.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/178a7f7c-b357-b296-5c64-f1a889d8ab98.png)
9. クレジットカード情報を入力。
![スクリーンショット 2024-02-16 16.55.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/62f21e18-7050-e139-8662-d13f9a18bf81.png)
10. アカウント作成完了です:clap::clap::clap:
お疲れ様でした:sushi::coffee::honey_pot:
DevCleanerを使用してみる

Xcodeを使用しているとメチャクチャストレージが重くなります。

Intel製のMacBookを使用していた時はストレージが256GBしかなかったので、こまめなターミナルコマンドで削除をしていました。
コマンドでの削除でも良いのですけど、DevCleanerも便利でした！

<br>

インストールはこちらからできます。

https://apps.apple.com/jp/app/devcleaner-for-xcode/id1388020431?mt=12


<br>


# 使い方
インストールします。

説明内容になります。
>Clean your Xcode cache files
Xcode generates large amount of cached data that could be beneficial to development speed but also tends to consume large amount of data on your hard drive. This tool allows to clean those caches allowing you to decide what you need and what not.
There's absolutely no warranty and you're using this tool for your responsibility!


>Xcodeのキャッシュファイルをクリーンアップする
Xcodeは開発速度に役立つ大量のキャッシュデータを生成しますが、同時にハードドライブの大量のデータを消費する傾向があります。このツールはそれらのキャッシュをクリーンアップし、必要なものと不要なものを選択できるようにします。
このツールには一切の保証はなく、あなたの責任で使用してください。

`※説明にあるように自己責任で行って下さい。`


<br>


画面
![DevCleanerP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/384fb68c-779c-069d-81d0-ae771fe5ef85.png)
1番上の赤枠が『**`クリーンアップ可能な領域`**』がどれくらいできるかのストレージ表示をしてくれます。

2番目の赤枠が説明内容です。

3番目の赤枠にXcodeで使用したシュミレーターのキャッシュが表示されています。
選択方法は『*`Device Support`*』→『*`iOS`*』と選択して下さい。
この時は『69.01GB』ものストレージを使用していました。


<br>


![DevCleaner2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/1b9b0bd5-b0e6-f962-d842-c3024678cede.png)
消したいものにチェックを入れて『Clean...』をクリックして下さい。


<br>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/33e9e297-5468-c45a-13f1-90d66fc4898c.png" width="40%">


>Clean Xcode cache files
Are you sure to proceed? This can't be undone.

>Xcodeのキャッシュファイルをクリーンアップします
続行してもよろしいですか？この操作は元に戻せません。

問題なければ『*`Clean`*』をクリックして下さい。
削除されます。


<br>


![Zero KB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/ed02a249-35e0-60f5-d0e6-25efc07393d0.png)

その後確認してみると『Zero KB』と表示されて何もなくなります。
削除したことで既存のファイルに影響が出たなどの不具合も一切ありませんでした。


<br>


# 結果


![BeforeuseP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/61e7ca41-dff8-68b7-962a-1781ea887ca7.png)
DevCleaner使用前。
『*使用済み: 304.1GB*』もありました。

<br>

![AfteruseP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/ad510324-fc6d-d5ef-0ae5-0bc60a33f72d.png)
DevCleaner使用後。
『*使用済み: 234.22GB*』まで減らすことが出来ました！

『*`69.88GB`*』ストレージが消えた！

この時にMacBookですぐさま確認しましたが、なぜか再起動などしてもストレージの減りは確認出来ませんでした。
きちんと表示されるようになったのは、電源落として次の日見てみたらストレージの表示に反映されていたので使ってもすぐには表示に反映されないケースがあるかと思います。

CUIも使いやすいですが、GUIもわかりやすくて便利です。

<br>


# 備考
ターミナルコマンドでXcodeのストレージを削除する場合はこちらを参考にして下さい。

https://sunny10side.com/xcode-delete-cache/



<br>


# 参考

https://apps.apple.com/jp/app/devcleaner-for-xcode/id1388020431?mt=12

<br>

https://sunny10side.com/xcode-delete-cache/
【解決】Gitでpushをしたら、(pre-receive hook declined)というエラーが出た

## 初めに
・(pre-receive hook declined)の私のプロジェクトでの解決方法を記載します。
どなたかの役に立てば幸いです。

## 原因
・リポジトリに100MiB以上のファイル(.assetファイル)をpushしようとしていたみたいです。

## 事象
リポジトリ名は`$REPO_NAME`と変換しています。

```
git push main
Locking support detected on remote "origin". Consider enabling it with:
  $ git config lfs.https://gitlab.com/$REPO_NAME/info/lfs.locksverify true
Uploading LFS objects: 100% (140/140), 16 MB | 0 B/s, done                      
Enumerating objects: 20292, done.
Counting objects: 100% (20292/20292), done.
Delta compression using up to 4 threads
Compressing objects: 100% (9156/9156), done.
Writing objects: 100% (20290/20290), 123.54 MiB | 1.12 MiB/s, done.
Total 20290 (delta 11539), reused 19724 (delta 11087), pack-reused 0
remote: Resolving deltas: 100% (11539/11539), done.
remote: GitLab: You are attempting to check in one or more blobs which exceed the 100.0MiB limit:
remote: 
remote: - 4cbfca94b72f4df84b51eed01cb734c10a2b9804 (131 MiB)
remote: To resolve this error, you must either reduce the size of the above blobs, or utilize LFS.
remote: You may use "git ls-tree -r HEAD | grep $BLOB_ID" to see the file path.
remote: Please refer to https://gitlab.com/help/user/free_push_limit and
remote: https://gitlab.com/help/administration/settings/account_and_limit_settings
remote: for further information.
To gitlab.com:$REPO_NAME
 ! [remote rejected]   main -> main (pre-receive hook declined)
error: failed to push some refs to 'gitlab.com:$REPO_NAME'
```

下に
`
 ! [remote rejected]   main -> main (pre-receive hook declined)
error: failed to push some refs to 'gitlab.com:REPO_NAME'
`
が出ているのがわかります。

## 解決方法
結論としては当該ファイルを100MiB以下にすることにより解決しました。

1. (pre-receive hook declined)で調べる(結構色んな情報があり、試しましたが解決に至らず)

2. 素直にログを上へ遡り`GitLab: You are attempting to check in one or more blobs which exceed the 100.0MiB limit:`を発見

3. `4cbfca94b72f4df84b51eed01cb734c10a2b9804 (131 MiB)`が100MiB以上であることを確認

4. `git ls-tree -r HEAD | grep $BLOB_ID` $BLOB_IDを3の4cbから始まるハッシュ値で置き換えファイルを特定

5. Unityの.assetファイル(Atlas)だったため、画像を小さくすることにより解決

以上です。
Cygwin を複数インストールする(CYG_HOMEの設定について)

[『Cygwinの環境を複数作ったり、パッケージのインストールを自動化したりする(たった一つのスクリプトファイルだけで…魔法のように…Linuxライク環境が構築できる！)』](https://qiita.com/javacommons/items/1a182f187fd2a8df29c2) の補足記事です。

`D:\cyg` にインストールスクリプト「project1.bat」を置いた場合に、スクリプト内の「CYG_HOME」の設定を変えるとどのようになるかを詳しくご説明します。

<b>CYG_HOME を指定することで複数の Cygwin プロジェクトから同じホームディレクトリを共有できます。</b>

<b>一度設定した CYG_HOME を変更して、再度スクリプトを実行することでホームディレクトリを変更することができます。</b>


# 「.」に指定した場合

```text
set CYG_HOME=.
```

ピリオドに指定するとカレントディレクトリという意味でスクリプトのあるディレクトリがホームになります。
ただし、Linux と同様に`D:\cyg`の配下にユーザー名(ユーザーID)のフォルダがさらに作られてそこが実際のホームディレクトリになります。マルチユーザーで使う場合には便利ですね。

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/cyg/javac

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\cyg\javac
```

# 「.$」に指定した場合

ユーザー名のフォルダができてほしくない場合には、「CYG_HOME」の設定の最後に半角の「$」をつけます。

```
set CYG_HOME=.$
```

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/cyg

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\cyg
```

# 「deep/deeper」に指定した場合

この場合は、スクリプトのあるディレクトリに「deep/deeper」というフォルダが作られます。
最後に「$」がついてないので、ユーザー名のフォルダが最後につきます。

```
set CYG_HOME=deep/deeper
```

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/cyg/deep/deeper/javac

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\cyg\deep\deeper\javac
```

# 「deep/deeper$」に指定した場合

この場合は、スクリプトのあるディレクトリに「deep/deeper」というフォルダが作られます。
最後に「$」がついているので、ユーザー名のフォルダはつきません。

```
set CYG_HOME=deep/deeper$
```

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/cyg/deep/deeper

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\cyg\deep\deeper
```

# フルパス指定「D:\home」に指定した場合

最後に「$」がついてないので、ユーザー名のフォルダが最後につきます。

```
set CYG_HOME=D:\home
```

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/home/javac

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\home\javac
```

# フルパス指定「D:\home$」に指定した場合

最後に「$」がついているので、ユーザー名のフォルダはつきません。

```
set CYG_HOME=D:\home$
```

```
javac@project1(Cygwin64) ~
$ pwd
/cygdrive/d/home

javac@project1(Cygwin64) ~
$ cygpath -w `pwd`
D:\home
```

以上です。
Web開発環境でレトロゲームエンジンPyxel使ってみた

# はじめに

レトロゲームエンジンの[Pyxel](https://github.com/kitao/pyxel/blob/main/docs/README.ja.md)がWebで実行できるようになりました

つまり、ローカルにPyxelをインストールしなくても、GitHubの機能と組み合わせればブラウザで開発を完結できます

今回は、Github Devを使ってコーディング、GitHub Pages、GitHub Actionsを使ってリリース(デバッグ)して開発をしてみました

https://github.com/sirococoa/dragonCurve

## 良かった点

- ブラウザとGitHubアカウントさえあれば、開発環境を用意する必要がありません
- 開発中のゲームをすぐに試してもらえます

## 悪かった点

- Pyxel付属のリソースエディタが使えません
- selfや()を忘れるなどの細かいミスが増えます
  - GitHub Codespaceを使えば解決できるはずです
- mainブランチに直接commitして開発する必要があり、複数人で開発できません

# 準備

## 1. GitHubリポジトリの作成

GitHubを無料プランで利用している場合は、リポジトリの公開設定はpublicにする必要があります

## 2. ひな形ファイルの作成

次の二つのファイルをリポジトリに作成します

- index.html

```html
<script src="https://cdn.jsdelivr.net/gh/kitao/pyxel/wasm/pyxel.js"></script>
<pyxel-run root="." name="main.py"></pyxel-run>
```

- main.py

```python
import pyxel

class App:
    def __init__(self):
        pyxel.init(160, 120)
        self.x = 0
        pyxel.run(self.update, self.draw)

    def update(self):
        self.x = (self.x + 1) % pyxel.width

    def draw(self):
        pyxel.cls(0)
        pyxel.rect(self.x, 0, 8, 8, 9)

App()
```

プログラムはPyxel公式ドキュメントに記載されているものを参考にしています

## 3. GitHub Actions＆GitHub Pagesの設定

リポジトリのSettingsのPagesに移動します

Sourceとして`Github Actions`を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257212/539d1d68-1f92-032e-2920-639ac426e809.png)

次に`Static HTML`の`Configure`を選択します

デフォルトの設定のまま、`Commit changes`を選択します

以上でGithubの設定は完了です

## 4. GitHub Actionsが実行されることを確認する

ActionsのWorkflow一覧から、一番新しいものを選択します

`deploy`CIのURLにアクセスするとデモアプリが動いていることが確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257212/6c5a7d25-6583-e1f4-964c-24aab620f91b.png)

# 開発の進め方

## コーディング

リポジトリのCodeが表示された状態で`.`キーを押すか、URLの`github.com`を`githun.dev`に変更することで`GitHub Dev`を起動できます

main.pyに作りたいゲームのプログラムを書いていきます

## 動作確認(デバッグ)

ゲームの動作確認を行うときはエディタの左側のタブのソース管理から、コミットメッセージを書き、コミットとプッシを選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257212/039709ee-85cb-fb0d-558e-335ec9f2183c.png)

PushされるとCIが実行され、公開されているゲームが更新されます

ゲームが公開されているURLにアクセスしてゲームの動作を確認します

キャッシュが残っているとゲームが更新されないため、キャッシュをクリアする必要があります

## エラーの確認

文法エラーはゲームの起動時に表示されます

実行時エラーは開発者ツールのConsoleから確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257212/557ec63e-fb0c-67be-7b32-a76c9a8275ce.png)

print関数等によって出力した文字もConsoleに表示されます

# まとめ

今回はGithubの機能を活用して、ブラウザだけでゲーム開発を試みてみました

いくつかの制約はありますが、簡単なものであれば十分開発できそうです
【アリババクラウド】アカウントID確認方法

# はじめに
アリババクラウドでアカウントIDを確認する方法です。
3ステップにて簡単に確認できます。

# 確認方法
1. アリババクラウドのウェブサイトにアクセスし、右上のボタンをクリック。
![スクリーンショット 2024-02-16 16.29.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/bd12dd07-a560-8b7d-43dc-023a939ef74b.png)

2. アカウント管理をクリック。
![スクリーンショット 2024-02-16 16.29.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/b3542d31-8676-575b-7f37-628c58fd82fe.png)

3. セキュリティ設定ページにてアカウントIDを確認できます。
![スクリーンショット 2024-02-16 16.29.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100858/2575c9d9-4f6a-537d-7d76-ca206b41a412.png)
【Django】django filter()の使い方

## djangoってなんぞや？
Django（ジャンゴ）は、Pythonで書かれたオープンソースのWebアプリケーションフレームワーク。
ウェブ開発を効率化し、生産性を高めるために設計されているらしい。
データベースの操作、URLルーティング、テンプレートエンジン、フォーム処理、認証、セキュリティなど、多くの一般的なWeb開発のタスクを簡素化し、シンプルで比較的少ないコードで実装できる。

## djangoのQuerySetについて
データベースからデータを取得、操作、フィルタリングするための強力なインターフェース。

:::note info
QuerySetは、djangoのモデルに対して行われるデータベースクエリのセットを表す。SQLを書かなくても便利な標準関数でDB操作が可能なものみたいな？
:::

## djangoのfilter()って？
djangoのQuerySetの1つ。
指定された条件に基づいて、データをフィルタリングする。

### はいということで書き方。

```python:sample.py
Model.objects.filter(name="John")
```

 クソ簡単。
 これで名前が「John」をDBから取りたい放題。

### 複数条件ある場合は？

#### AND条件

```python:sample.py
person = Model.objects.filter(name="John", age=40)
```

```python:最初にヒットしたレコードをfilter()を使用して取得する例
person = Model.objects.filter(name='John', age=40).first()
print(person.name, person.age)
```

```text:出力結果
john 40
```

```python:条件にヒットする全てのデータを取得する例
person = Model.objects.filter(name='John', age=40).all()
```

シンプル〜！
カンマ区切りでカラム名指定してあげるだけでANDになるらしい。

#### OR条件

```python:sample.py
from django.db.models import Q

persons = Model.objects.filter(Q(name='John') | Q(age=40)).all()

for person in persons:
    print(person.name)
```

importするQがあるがそれを使用するみたいだ。
クソ簡単だな。

## まとめ
死ぬほど楽にDBを扱える。
overleaf環境をローカルのVSCodeへの移行したい

# 初めに
論文をlatexのクラウドサービスoverleafを使っていたが、論文を書き進めていくうちにコンパイル時間が長くなってしまい、無料枠のコンパイル制限にひっかかった。もちろん学生ならば月0.9ドルでプランをアップグレードすることができるが、できるだけ課金したくなかったので別の手段を探していた。そこで、自分のPCでlatex環境作ればいいやと思ったので、その方法をまとめていく。  
そしてvscodeであれば、github Copilotも使えるので、vscodeでlatexを使うことにした。

# 前提
 - OS: Windows10
 - エディタ: VSCode

# latexの環境構築
## texlive とvscodeのインストール
基本的にはこれを参考https://zenn.dev/hash_yuki/articles/31855fbdb5fdf7 にした。
latexのインストーラの実行~ vscodeの設定までを行う。


## overleafからダウロードしてコンパイル
overleafで今まで作成したプロジェクトをダウンロードし(下記画像のダウンロードマークから可能)、実際にコンパイルした。なお今回はbibtex含んでいるので、”ptex2pdf (uplatex) -> bibtex -> ptex2pdf (uplatex) *2”の順番でコンパイルしてあげる([参考](https://zenn.dev/hash_yuki/articles/31855fbdb5fdf7))。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557688/9be38ffc-937a-4059-c221-afc0b5ee1757.png)


しかし、様々なエラーにぶちたることに、、  
これらを解決するのに数時間費やしたので、その解決方法を記していく。

## エラーと解決方法

### 日本語エラー
フォルダ名に、日本語が入っているとうまくいかない可能性があるので注意。全て英語に直した方がいいかも。

### ドキュメントクラス関連エラー
overleafで書いたやつをダウンロードし、それをvscodeで開き、コンパイルしてみる。参考として、自分のoverleafのmain.texの最初の数行だけ記載しておく。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557688/72a8a649-7199-5f5f-0f6c-b2b139eac83f.png)



しかし、下記のようにエラーが出てしまう。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557688/a22a4f52-b03d-25a1-ea92-b4823ff31f73.png) これは、最初のドキュメントクラスが悪いらしい(https://okumuralab.org/tex/mod/forum/discuss.php?d=840) 最初のドキュメントクラスの定義？を以下のように変更してあげれば大丈夫。
```diff
- \documentclass[a4j,12pt]{jreport}
+ \documentclass[a4j,12pt]{ujreport}
```

### bibtex関連エラー
私は、latexで論文を引用する際、bibtex.bibから引用しているが、以下のようなエラーが出た。
エラー文を見ると、 `repeated entry`とか言っている。どうやらbibtex.bibファイルで同じものを複数回定義していることが原因らしい。そのダブりを削除したらエラー解決 !!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557688/75ba64f0-5b6e-01ea-daca-5c3b48a29380.png)

## 正常動作確認
上記のエラーを解決し、再度コンパイルすることで、数十秒後vscodeの左下の部分が、2つチェックマークついて、main.pdfも生成できていることを確認！
無事overleaf環境をローカルpcに移すことができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3557688/5b78deb7-bbae-0577-dd31-7a963aa8190a.png)


一応コンパイルに成功したが、20秒程度かかっている気がする。[このサイト](https://qiita.com/YokoPhys-h/items/227ab79551802fbf641c)を見る限り、短縮方法はコンパイル方法を工夫することでできるあるらしい。 ~~でも自分はもう論文書く機会少なそうだし、このままでいいや~~
wslでelixir その137

# 概要
wsl(wsl2じゃない)で、elixirやってみた。
動きがある、vegalite、やってみた。



# 写真

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/c001b6d3-9bce-bdc7-031d-c006dba1331f.png)

# セットアップ

```
Mix.install([
	{:vega_lite, "~> 0.1.5"},
	{:kino_vega_lite, "~> 0.1.7"},
	{:kino, "~> 0.10.0"}
])
```

# サンプルコード

```
import :math
alias VegaLite, as: Vl

f = fn x -> 
	:math.sin(x * 2) * :math.cos(x) 
end
f.(12)

values = for x <- 1..10000, do: (x / 100)
				|> (fn x -> 
          %{x: x, y: f.(x)} 
        end).()

        
Vl.new(width: 720, height: 100)
|> Vl.data_from_values(values)
|> Vl.mark(:line)
|> Vl.encode_field(:x, "x", type: :quantitative, title: "x")
|> Vl.encode_field(:y, "y", type: :quantitative, title: "sin(2x)*cos(x)")

interval = 100

kino = Vl.new(width: 400, height: 400)
	|> Vl.mark(:line)
	|> Vl.encode_field(:x, "x", type: :quantitative)
	|> Vl.encode_field(:y, "y", type: :quantitative)
	|> Kino.VegaLite.new()
	|> Kino.render()

fun = fn _, {kino, x} ->
	Kino.VegaLite.push(kino, %{x: x, y: f.(x)}, window: 100)
	{:cont, {kino, x + 0.1}}
end

Kino.listen(interval, {kino, 0}, fun)

```


以上。
Unveiling Excellence: Your Ultimate Guide to Laminate Suppliers

Laminate suppliers are super important in interior design and construction. They make stuff that lasts long and looks good, making spaces pretty. Whether it's for homes, offices, or factories, picking the right laminate supplier is key for your project's success. Let's talk about what to look for when choosing a laminate supplier and what makes them excellent.

1.	Quality Matters: Good laminate suppliers really care about quality. They make sure their laminates not only look nice but also last long without breaking. Look for suppliers who are serious about checking their products at every step of making them. This means they use good materials, smart ways to make things, and check everything carefully to make sure each piece is top-notch.
2.	Lots of Choices and New Ideas: The best laminate suppliers give you tons of options. They have lots of colors, patterns, and finishes to pick from. And they're always coming up with new stuff to keep up with what people want. Whether you like traditional wood styles or modern shiny finishes, a supplier with lots of choices can probably help you find what you want.
3.	Being Eco-Friendly: These days, it's important to think about the planet. When you pick a laminate supplier, ask about how they make their stuff. The good one’s care about the environment. They might use recycled materials, make less waste, and follow rules to keep things green. Picking a supplier who cares about the Earth can make your project eco-friendlier.
4.	Help When You Need It: Installing laminates isn't always easy. A good supplier will help you out. They'll give you clear instructions and maybe even teach your builders how to do it right. And if you get stuck, they'll be there to answer your questions and fix any problems fast.
5.	Being Reliable: You want your laminates to be the same every time you get them. Good laminate suppliers make sure of that. They have strict rules to keep things consistent, so you always get what you expect. They also deliver when they say they will, so you can count on them to show up on time with your order.
6.	Good Prices, Great Quality: While you want good quality, you also want a good deal. The best suppliers give you both. They figure out smart ways to make things cheaper without making them worse. They might also give discounts if you buy a lot or have special deals to fit your budget.
7.	What People Say Matters: Before you pick a supplier, see what other people think of them. Look for ones that people trust and say good things about. Reviews and recommendations can tell you a lot about how good a supplier is.

Picking the right laminate supplier is a big deal for your project. Look for ones that care about quality, offer lots of choices, are eco-friendly, help you out when you need it, are reliable, offer good prices, and have a good reputation. With these tips, you can find an excellent laminate supplier and make your spaces look awesome!
一つ前のコミットから始まり、タグが見つかるまで遡っていくシェルスクリプト

一つ前のコミットから始まり、タグが見つかるまで遡っていくシェルスクリプトを以下に示します。このスクリプトは、タグが見つかるか、リポジトリの最初のコミットに達するまでループします。タグが見つかった場合にはそのタグ名を表示し、見つからなかった場合にはメッセージを表示して終了します。

```bash
#!/bin/bash

# 現在のコミットから開始
commit=HEAD^

# タグが見つかるか、リポジトリの最初のコミットに達するまでループ
while true; do
  # コミットについているタグを取得
  tag=$(git tag --points-at $commit)

  if [[ -n $tag ]]; then
    echo "Found tag: $tag on commit $commit"
    break
  else
    # 親コミットが存在するか確認
    parent=$(git rev-parse --verify $commit^ 2>/dev/null)
    if [[ $? -eq 0 ]]; then
      # 親コミットに移動
      commit=$commit^
    else
      echo "No tags found in the commit history."
      break
    fi
  fi
done
```

このスクリプトの動作は以下の通りです：

1. 初期コミットとして `HEAD^`（現在のコミットの一つ前）を設定します。
2. 現在のコミットにタグがついているか確認します。タグが見つかれば表示し、ループを抜けます。
3. タグが見つからなければ、親コミットが存在するか確認します。存在する場合はその親コミットに移動して再度タグの確認を行います。
4. 親コミットが存在しない（最初のコミットに達した）場合は、「コミット履歴にタグが見つからない」というメッセージを表示してループを抜けます。

このスクリプトを使用する際には、実行前に実行権限を与える必要があります。これは、ターミナルで以下のコマンドを使用して行います：

```bash
chmod +x script_name.sh
```

ここで `script_name.sh` はスクリプトのファイル名です。その後、スクリプトを以下のコマンドで実行します：

```bash
./script_name.sh
```

これで、タグが見つかるまで過去のコミットを遡って検索し、見つかったタグを表示するか、タグが一つも見つからなければその旨を報告します。
2023年度の学習結果

- 結果
Microsoft Certified Azure Solutions Architect Expert pass  
Registered Scrum Master pass  
情報処理技術者　プロジェクトマネージャ試験　fail  
CompTIA Cysa+ pass  
Microsoft Azure Administrator(更新) pass  

- 振り返り

CompTIAのCysa+は公式本＋Udemyで受験しようとしたが不安になったのでExim free prepの無料部分まで回答＞全然ダメと気づいて急遽有料部分まで完答×２で合格点ギリギリ 766  
海外ベンダー系資格試験あるあるの言い回しと、引っかけ問題あたりが丸暗記推奨（考えると逆に落とす）なので、要注意ポイントかと  
  
PMはようやく午後２まで採点まで進んだが、小論文落ち論理展開が変だったのがダメだったんだろうな、しかし現実がそうだったんだって、しょうがないので辻褄優先で準備してまた来年、午前１からになるのが辛い  

Azureが毎年更新、AWSも３年更新も備えないとね。○冠とかは全然興味無し、現場でそんな幅広くやること絶対無いし
GCPは・・・いいや。要更新資格がこれ以上増えるのは流石にダルイ

- 来年からはペースダウン

資格だけ増えてもね。どちらかというと実践的な取り組みを進めようかと。むしろなんで資格こんな取ってるんだって話もある位。仕事があるなら仕事優先。
Laminas開発環境構築中の「Connect Error: could not find driver」のエラー

### はじめに
Laminasで開発環境を構築しており、タイトルにもある「Connect Error: could not find driver」のエラーにはまったので共有しておきます。

#### エラーの原因
PDOが使用できない設定になっている。

### 解決方法
laminasをインストールしたとき、デフォルトのDockerfileにはoptionがコメントアウトされている。なので、オプションから「## MySQL PDO support」を探し出してコメントアウトを外す。
```diff:laminas/Dockerfile
FROM php:8.2-apache

LABEL maintainer="getlaminas.org" \
    org.label-schema.docker.dockerfile="/Dockerfile" \
    org.label-schema.name="Laminas MVC Skeleton" \
    org.label-schema.url="https://docs.getlaminas.org/mvc/" \
    org.label-schema.vcs-url="https://github.com/laminas/laminas-mvc-skeleton"

## Update package information
RUN apt-get update

## Configure Apache
RUN a2enmod rewrite \
    && sed -i 's!/var/www/html!/var/www/public!g' /etc/apache2/sites-available/000-default.conf \
    && mv /var/www/html /var/www/public

## Install Composer
RUN curl -sS https://getcomposer.org/installer \
  | php -- --install-dir=/usr/local/bin --filename=composer

###
## PHP Extensisons
###

## Install zip libraries and extension
RUN apt-get install --yes git zlib1g-dev libzip-dev \
    && docker-php-ext-install zip

## Install intl library and extension
RUN apt-get install --yes libicu-dev \
    && docker-php-ext-configure intl \
    && docker-php-ext-install intl

###
## Optional PHP extensions 
###

## mbstring for i18n string support
# RUN docker-php-ext-install mbstring

###
## Some laminas/laminas-db supported PDO extensions
###

## MySQL PDO support
+ RUN docker-php-ext-install pdo_mysql

## PostgreSQL PDO support
# RUN apt-get install --yes libpq-dev \
#     && docker-php-ext-install pdo_pgsql

###
## laminas/laminas-cache supported extensions
###

## APCU
# RUN pecl install apcu \
#     && docker-php-ext-enable apcu

## Memcached
# RUN apt-get install --yes libmemcached-dev \
#     && pecl install memcached \
#     && docker-php-ext-enable memcached

## MongoDB
# RUN pecl install mongodb \
#     && docker-php-ext-enable mongodb

## Redis support.  igbinary and libzstd-dev are only needed based on 
## redis pecl options
# RUN pecl install igbinary \
#     && docker-php-ext-enable igbinary \
#     && apt-get install --yes libzstd-dev \
#     && pecl install redis \
#     && docker-php-ext-enable redis


WORKDIR /var/www

```

最後にapacheを再起動すれば解消した。
docker-entrypoint-initdb.dが実行されない


DockerのMySQLコンテナに初期データを投入したいが、うまくデータが入らない。

## 開発環境
・OS : Windows10
・MySQL5.6

```:ディレクトリ
├docker-compose.yml
├docker
 └mysql
  ├my.cnf
  ├Dockerfile
  └initdb.d
   └sample.sql

```
```:docker-comopse.yaml
mysql:
    platform: linux/x86_64 
    build:
      context: ./docker/mysql
      dockerfile: Dockerfile
    volumes:
      - db-data:/var/lib/mysql
      - ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
      - ./docker/mysql/initdb.d:/docker-entrypoint-initdb.d
    environment:
            - MYSQL_ROOT_PASSWORD=estest
            - MYSQL_DATABASE=test
            - MYSQL_USER=testuser
            - MYSQL_PASSWORD=test
```

## 問題点
コンテナを削除してもボリュームは残ってしまうため。
→ボリュームを削除する

## 解決方法
①コンテナを停止
```
docker-compose down --volume
```
②ボリューム確認
```
docker volume ls
```
参考：ボリュームを一括削除するときのコマンド
```
docker volume rm $(docker volume ls -qf dangling=true)
```
③コンテナ実行
```
docker-compose up -d --build
```

これでsample.sqlが実行され、MySQLの初期データが入っていた。

## 最後に
私はそもそものデータベースの中身が不適切な文法でエラーをはいていたせいで、この問題の解消に時間がかかてしまった。初歩的なミスに十分注意すれば特に問題なくすぐに解消できると思う。
Dockerでbuildしなおしたらphpmyadminに接続できなくなった

## はじめに
Dockerを利用してからまだ2か月も経っていません。初歩的な部分でつまずくことが多いですが、同じミスはしたくないのでここに解決方法を残しておきます。

### 問題点
dockerでビルドし直したところ、phpmyadminに接続したときにエラーが出てきてしまった。

「MySQL サーバに接続しようとしましたが拒否されました。config.inc.php のホスト、ユーザ名、パスワードが MySQL サーバの管理者から与えられた情報と一致するか確認してください。」とのことだったので、MYSQL_USER、MYSQL_PASSWORD、PMA_USER、PMA_PASSWORDを確認したが、特に問題は見つからず、。

### 原因
データボリュームにvolumeのゴミがまだあったことが原因でした。volumeを削除するコマンドを打たないと消えないっぽいです。以前ビルドした情報がvolumeに残っていたため、いくらビルドし直してもうまくいきませんでした。

### 解決方法
volumeを全て削除するコマンドを実行し、volumeを削除します。
その後、ビルドし直したら成功しました。
```:volume削除
 docker volume rm $(docker volume ls -qf dangling=true)
```
php.iniの設定が反映されない(windows)

## はじめに
PDO driversにMySQLを入れたくてphp.iniをいじっていたのですが、php.iniの設定が反映されなくて困っていました。その時の対処法を残しておきます。

## 環境
・OS : Windows10
・PHP8.2.9
・Apache2.4

## 問題点
・Apacheを再起動していない

これが問題点でした。しかし、PHPのダウンロードしかしていなかったため、ApacheをダウンロードしてPHPと連携させて再起動していきます。

## Apacheのダウンロード
①以下のリンクにアクセス
https://httpd.apache.org/

②最新バージョンである「Apache httpd 2.4.57 Released」のブロックにある「Download」を選択

③「Apache HTTP Server 2.4.57 (httpd): 2.4.57 is the latest available version 2023-04-06
」にある「Files for Microsoft Windows」を選択（今回はWindowsのため）
※2023年9月時点でのバージョンです

④「Apache Lounge」を選択

⑤「Apache 2.4.57 Win64」にあるzipファイルをダウンロードして任意の場所に展開する。
※私は今回「C:\Users\admin\Apache24」に展開

Apacheのダウンロードは以上です。

## PHPとの連携
Apacheをダウンロードしたフォルダーから以下のファイルを開く。
今回は「C:\Users\admin\Apache24」にダウンロードしたという設定
```
場所：C:\Users\admin\Apache24\conf\httpd.conf
```

このファイルに以下を追加
```
LoadModule php_module "PHPをダウンロードしたフォルダ/php/php8apache2_4.dll"
AddType application/x-httpd-php .php
PHPIniDir "php.iniが置いてあるフォルダ(PHPをダウンロードしたフォルダ)"
```
PHPのフォルダの中にある
・ php7apache2_4.dll
・ php.ini
を利用します。
※php.iniがない場合はphp.ini-productionまたはphp.ini-developmentをコピーして、php.iniという名前に変更して保存。

# Apacheをサービスとして登録して起動する
①スタートボタンをを右クリックし、「コマンドプロンプト(管理者)(A)」を選択。管理者権限でコマンドプロンプトを起動できます。設定によっては、コマンドプロンプトではなく、Windows PowerShellが表示されます。

②Apacheをインストールしたディレクトリ（今回は「C:\Users\admin\Apache24」）まで移動し、以下を実行。
```
httpd -k install
```
スタートボタンを右クリック、「コンピュータの管理」を選択。「サービスとアプリケーション>サービス」に「Apache2.4」があればOKです。
![service.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3553427/2f896e77-c1f2-0235-ee9e-f3a44990a476.png)

③サービスとして登録したApacheを以下のコマンドを実行して起動
```
httpd -k start
```

ブラウザで、http://localhost/ にアクセスし、「It works!」の文字が表示されれば起動しています。

④停止するときは以下のコマンドを実行してください
```
httpd -k stop
```

再起動するときは以下のコマンドです。php.iniを編集したときは、以下のコマンドを実行してください。
```
httpd -k restart
```
【Flutter】" ! "を使わずにThe property can't be unconditionally accessed because the receiver can be 'null'.を解決して安全性を高める

## はじめに
`The property can't be unconditionally accessed because the receiver can be 'null'`
というエラーが出ると、私はいつも`!`をつけていましたが、これでは少し安全性が不安なので、nullチェックを入れた方がいいと知りました。

## エラーの出るコード
```dart
void setUserId(int index, String? value) {
    if (value == null) return;
    final userIds =
        List<String>.from(state.appConfig.userIds);
```

## `!`で対処した場合
```dart
void setUserId(int index, String? value) {
    if (value == null) return;
    final userIds =
        List<String>.from(state.appConfig!.userIds);// !でnullでないことを強制させる
```

## nullチェックを用いる場合
```dart
void setUserId(int index, String? value) {
    if (value == null) return;
    final appConfig = state.appConfig; // 変数として確保する
    if (appConfig == null) return; // nullならリターンさせる

    final userIds = List<String>.from(appConfig.userIds);// エラーは起きない
  }
  ```
AlphaのグラデーションがかかったImageを表示する

Jetpack Composeで徐々に透明になる画像を表示するには `BlendMode.DstIn` で任意のグラデーションを与えると実現できます。

```kotlin
    Image(
        modifier = Modifier
            // alphaをかけるためのworkaround
            .graphicsLayer(compositingStrategy = CompositingStrategy.Offscreen)
            .drawWithContent {
                drawContent()
                drawRect(
                    brush = Brush.verticalGradient(
                        listOf(
                            Color.Transparent,
                            Color.Black,
                        )
                    ),
                    blendMode = BlendMode.DstIn
                )
            },
        painter = painterResource(id = R.drawable.hoge),
        contentDescription = null
    )
```

`CompositingStrategy.Offscreen` を指定しないとAlphaのグラデーションがかからないようなのでご注意ください。

## 参考

https://stackoverflow.com/questions/66762472/how-to-add-fading-edge-effect-to-android-jetpack-compose-column-or-row

https://developer.android.com/reference/kotlin/androidx/compose/ui/graphics/BlendMode#DstIn()
The file "○○○○○○" could not be moved to the trash.と表示される

![TrashP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/6e02fadd-6357-ead3-99e4-301f0096a1e2.png)


>Do you want to move en.proj to the Trash?
This operation cannot be undone.


en.projを削除したいので『**Move to Trash**』します。


<br>

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/4f676795-4386-fe42-e562-4c6081dc317a.png)
>The file "en.lproj" could not be moved to the trash.

するとファイル "en.lproj" をゴミ箱に移動できませんでした。
表示されてしまいます。
自分のMacの設定でデスクトップにXcodeのファイルを作ると自動的にiCloudでもバックアップされるようにしてるのでこれが原因だと思って、iCloudでバックアップされないファイルに移動すると削除できるようになります。

しかし削除はできますが、削除した後にXcodeはなぜか落ちてしまいます。
一応その後でも問題なくXcodeは動作はするのですがよくわかりません。


<br>

![chatGPT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/5d20159d-5256-082e-2a95-3173d47e920a.png)
ChatGPTにも聞いてみました。

<br>



<br>



![DeviceP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1344207/938e6e23-4228-7185-f55d-38c97227ae8c.png)

>Failed to install the app on the device.

そして、実機を使用してビルドして見ると『デバイスへのアプリのインストールに失敗しました』と表示されてしまいます。
またXcodeのファイルを移動させてiCloudのバックアップされるようにデスクトップに移動するとビルドできます。

iCloudなどのcloudシステムが干渉してしまうみたいです。
dockerでMySQLが立ち上がらなかったのを解決した話

普段通り `$ docker-compose up -b`を実行してコンテナを起動しようとしたところ、立ち上がってすぐにstatusがExitedになってしまい、コンテナが立ち上がらなかった。

コンテナのログを見てみると

```:ログ
[Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
[Note] [Entrypoint]: Switching to dedicated user 'mysql'
[Note] [Entrypoint]: Entrypoint script for MySQL Server 5.7.44-1.el7 started.
[Note] [Entrypoint]: Initializing database files
[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
[ERROR] --initialize specified but the data directory has files in it. Aborting.
[ERROR] Aborting
```

と出力されている。

どうやらこの
`[ERROR] --initialize specified but the data directory has files in it. Aborting.`がエラーメッセージのよう。。


## dbが重複して立ち上がっている？

こちらの記事を参照したところ、重複して使われているものがあると立ち上がらないとのこと。
[dockerでMySQLが立ち上がらない時の対処法　--initialize specified but the data directory has files in it. Aborting](https://qiita.com/jun_kato/items/3ae2db42ef7f1d0cca99)

こちらに記載のコマンドを試してみたが、ダメだった。
```
docker system prune --volumes
```

## volumeを削除する

ボリュームを手動で削除することにした。
ボリュームを削除すると今までの DBに保存されている情報は削除されてしまうので注意。
必要であればバックアップが必要。

私の場合はローカル環境で特に影響がなかったので問題なし

データボリュームを確認:
```
$ docker volume ls
```

データボリュームを削除:
```
docker volume rm <volume_name>
```

コンテナを再起動:
```
docker-compose up -b build
```


これで無事にdbのコンテナを立ち上げることができました！
Libertyサーバー構成ファイル(server.xml)のオーバーライド

## はじめに
IBM WebSphere LibertyまたはOpen Liberty(以下Libertyと表記)では、server.xmlというサーバー構成ファイルを記述することで、利用するJava EE(Jakarta EE)のフィーチャーを選択的に指定したり、データソースや共有ライブラリー、セキュリティー設定などを定義します。これらの記述項目の中には開発環境/テスト環境では本番環境と異なる値を指定する必要があるものもあります。例えばデータソース定義に指定するデータベース・サーバーのホスト名は、開発環境/テスト環境ではそれぞれの環境用のデータベースを使うので異なるホスト名を指定するでしょう。
このような場合に、本番用のserver.xmlファイルを修正することなく設定値をオーバーライドすることができるので、その方法を紹介します。

## Libertyサーバー構成情報の定義階層
server.xmlを含むLibertyサーバーの構成情報は以下の3箇所から、この順番で読み込まれます。
1. ${server.config.dir}/configDropins/defaults/
2. ${server.config.dir}/server.xml
3. ${server.config.dir}/configDropins/overrides/

2番目のserver.xmlは必須で、1番目のdefaultsディレクトリーと3番目のoverridesディレクトリーはオプションです。defaultsディレクトリーとoverridesディレクトリーには複数のXMLファイルを配置できます（各ディレクトリー内のファイルはファイル名を小文字に変換してソートしたうえで順に読み込まれます）。defaultsディレクトリーには、複数のLibertyサーバーに共通のデフォルト定義情報を記述したXMLファイルを配置します。overrideディレクトリーがオーバーライド用定義ファイルの配置場所で、当該フォルダーに追加/上書き用の定義情報を記述したXMLファイルを配置することで、1番目+2番目(server.xml)の定義情報をオーバーライドできます。
以下は、${server.config.dir}が`wlp/usr/servers/defaultServer`の場合のイメージです。
```
wlp
|               
+---usr
    |       
    +---servers
        |
        +---defaultServer
            |   server.xml
            |
            +---configDropins
                |
                +---defaults
                |     ここにデフォルトを記述したファイルを配置
                +---overrides
                      ここにオーバーライドする定義情報を記述したファイルを配置
```



## server.xmlのオーバーライドの方法
server.xmlをオーバーライドする部分を記述したXMLファイルを作成し、`${server.config.dir}/configDropins/overrides/`に配置します。以下はDataSourceをオーバーライドする例です。ファイル名はoverride.xmlとしましたが何でも構いません。
```override.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<server description="new server">
	<dataSource id="SampleDataSource" jndiName="jdbc/db2/SAMPLE">
	    <jdbcDriver libraryRef="DB2JCCLib"/>
	    <properties.db2.jcc databaseName="SAMPLE" serverName="localhost" portNumber="25000" 
	     currentSchema="DB2ADMIN" user="db2admin"  password="password" />
	</dataSource>
</server>
```


## 参照情報
1. [Open Liberty: Server configuration overview#server-xml](https://openliberty.io/docs/latest/reference/config/server-configuration-overview.html#server-xml)
Cypress commands のリトライによってCanvas要素のテストを安定化

## はじめに

この記事では、一連のCypressコマンドのリトライを行なってCanvas要素のテストの安定性を向上させる方法を紹介します。

## Canvas要素のCypressテストにおける課題

Canvas要素は、グラフィックやアニメーションなどを動的に描画するために使用されます。これらの要素はDOM内の個別要素として表現されないため、通常のセレクタでの検証が困難です。また、Canvasの内容はJavaScriptによって動的に生成されるため、その非同期性からもその状態をテストで把握するのは一筋縄ではいきません。

## リトライの実装

私が直面した問題は、Canvas内の特定のクリック可能な領域がレンダリングされる前にCypressのdblclickコマンドが実行され、クリックが無効のまま結果的にその後、予期した要素が見つからないというものでした。

```
Cypress.Commands.add("openCanvasNode", (position) => {
  // Canvas内の特定のポジションを指定してダブルクリック
  cy.get("[data-cy=canvas]").dblclick(position.x, position.y);

  // Note: クリック後、例えば画面遷移してパンクズリストが現れることを想定
  // しかし、クリック領域がまだ描画されていなかったら
  // ダブルクリックが無効になり意図した画面に遷移しない状況
  cy.get("[data-cy=breadcrumb]"); // 遷移されなかった場合はここでタイムアウトエラーになる
});

```

色々アプローチを考えた結果(後述します)、選んだ解決策として次のようなリトライロジックを組み込むことにしました。

```
Cypress.Commands.add("openCanvasNode", (position, retries = 3) => {
  const MAX_RETRIES = retries;
  let currentRetry = 0;

  const checkBreadcrumbExists = () => cy.get('body').find("[data-cy=breadcrumb]").length > 0;

  const tryOpeningNode = () => {
    cy.get("[data-cy=canvas]").dblclick(position.x, position.y);

    if (checkBreadcrumbExists()) {
      cy.get("[data-cy=breadcrumb]");
      cy.log("Node opened successfully");
    } else if (currentRetry < MAX_RETRIES) {
      currentRetry++;
      cy.log(`Node not opened. Retrying attempt ${currentRetry}/${MAX_RETRIES}`);
      cy.wait(1000); // Wait for 1 second before retrying
      tryOpeningNode(); // Recursively try to open the node
    } else {
      cy.log("Maximum retries reached. Node did not open.");
      // throw error
    }
  });


  tryOpeningNode();
});
```

コマンド利用するテストのシンプルな例
```
describe('Canvas Node Test', () => {
  it('should open a node on the canvas', () => {
    cy.visit('/your-canvas-page');
    const clickPosition = { x: 100, y: 200 }; // Example click position
    cy.openCanvasNode(clickPosition);
  });
});
```

Cypressは個々のコマンドを自動的にリトライしますが、一連のコマンドを丸ごとリトライする機能はサポートしていません。したがって上記のようなリトライ実装を行うことで、初期の信頼性の低いアクション(canvasのdblclick)が後続のアクションに影響を与えるケースを打破しました。

## 他の試みたアプローチ
- ダイナミックにdata-cy attributeを設定。理論上は可能なはずですが、特定の位置が完全に描画されるタイミングを特定して data-cy を要素にセットするのには困難がありましたので諦めました
- Cypressの`fail`イベントを使用してリトライ: この方法でも機能しますが、すべての予期しないエラーも食ってしまうのであくまでデバッグ用として用意されているイベントであるため利用することは公式にて推奨されていません　[Cypress-Events参照](https://docs.cypress.io/api/cypress-api/catalog-of-events#Cypress-Events)
- dblclick 前に cy.wait(X)を使用: この方法も機能しますが、一般的に推奨されていません
- Canvas内の特定のポジションが意図したバックグラウンドカラーに変更しているかチェック: 第二候補でしたがより複雑になりそうだったので却下


## まとめ

この記事では CypressでCanvas要素のテストを行う際、その動的な性質を考慮に入れ、リトライロジックを組み込むことでテストを安定化させる方法を紹介しました
サーバー監視アプリを作ろう

## PHP版サーバー監視アプリ

#### はじめに
データセンターのサーバー監視ツールとは「どのようなもの」、
「どのようなことを」をするのか学習させるためにPHPで監視アプリを作ってみました。
最初はWindowsのXAMPPを使用し、データはMysqlで保存、その後Linuxへ移植しています。

#### 必要な機能は
* 監視対象ホストの状態を一目でわかるビジュアルな画面にできる
* イベント発生のログを出力およびメールで通知できる
* 監視対象ホスト群のレイアウトの画面構成がカスタマイズできる
* 監視対象ホストの追加、変更ができる
* Ping死活監視のほか、SNMP監視ができる
* 統計資料としてのグラフが作成できる

#### カスタマイズ例
![visualmonitor.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3714448/e4911d15-1917-3acb-1919-ebd45a312d1a.png)

#### 画面フレームは
* ヘッダフルーム
上辺部に画像、時計、URLボタン、ログアウトボタンを配置
* メニューフレーム
左辺部にメニューボタンを配置
* アプリフレーム
中央部にメニューを実行するアプリ領域を配置 
* コアフレーム
下辺部に継続自動起動されるアプリを配置 

#### 実現するための考慮事項は
* 自動実行させるアプリは、HTMLのRefresh機能でタイマー起動する
* メニュー方式は、Javascriptで必要な都度アプリを追加できる

#### コーディング例
* HTML フレーム分割
```htmml
<frameset rows="140,*,30">
  <frame src="HeaderPage.php" name="header" title="ヘッダフレーム">
  <frameset cols="170,*">
    <frame src="MenuPagephp.html" name="menu" title="メニューフレーム">
    <frame src="MonitorManager.php" name="apl" scrolling="yes" title="アプリフレーム">
  </frameset>
  <frameset cols="190,190,190,190,190,0">
    <frame name="core" src="MonitorCoreAuto.php">
    <frame name="snmp" src="SnmpAutoScan.php">
    <frame name="mrtg"  src="MrtgAutoRunPrePage.html">
    <frame name="disc" src="Discover.php">
    <frame name="msg"  src="Messages.php">
    </frameset>
</frameset>
```

* HTML Refresh機能
```php
<?php
...
print '<head>';
print '<meta http-equiv='refresh' content=120>";
print '</head>';
print '<body>';
print "<h4>xxx Refresh 120sec</h4>";

```
* Javascriptでメニューボタンと呼び出し
```java
<script language="JavaScript">
  function chgmon()  {
    parent.apl.location.href = "MonitorManager.php";
  }
  function chglog() { 
    parent.apl.location.href = "EventLogPage.php";
  }
  ...
// 
</head>
<body>
<div>
  <hr>
  <div class="sidebar" id="left">
  <h2>▼　表示メニュー</h2>
  <ul>
    <li><a href="javascript:chgmon()">監視モニター</a></li>
    <li><a href="javascript:chglog()">イベントログ</a></li>
    ...
  </ul>
</div>    
```
#### おわりに
PHPで作成した理由は、どのOSへも移植が出来ること、ノートPCへ入れて研修先へ持ち運び出来ることでした。
ブラウザアプリをPHPとHTMLで作成したため、わかりやすい半面、ロジックが複雑になっており、キレイなプログラムにはなっていませんが、興味ある方は<a href="https://github.com/ossiansunny/visualmonitor">ここから</a>どうぞ。
純粋なC言語でディープラーニングがしたい！！1

# URLs
ソースコード（2/16日時点で一応動く程度）
[Github](https://github.com/NinTow)   /   [リポジトリ](https://github.com/NinTow/Neuronizm)
# まえがき
どうもpythonの遅さにうんざりしてきたApfelです。
今回はC言語のAI開発ライブラリを作り始めたので、
現在実装済み(2/16)の機能の数式レベルの解説をしようと思います。
C言語のコード解説とかは次回の予定です。
この記事では、数学メイン？です。
微積&行列演算ができること前提です。ご了承ください。
AIを作ったことがある人向けと思ってます。
微積&行列演算についてはそのうち解説書こうと思います。
# 本題
## 実装済みの機能一覧
#### 全結合層
一般的にはDenseとかLinear(torch)とかで表されるやつですね。
これは行列演算一括でできるので順伝播は一番楽でした。
#### 損失関数
##### MAELoss
平均絶対値誤差と呼ばれる物です。
予測した数値から正解の数値を引き、絶対値を求めると間違えた量がわかりますよねってやつです。
一応数式
$X$ = 予測値
$Y$ = 正解
$L$ = 誤差、損失とも呼ぶ。
$L = |X - Y|$
という形です。
#### 最適化関数
##### SGDという名の純粋な勾配効果法
SGDとは確率的勾配降下法の略なのですが、この関数は現在ただの勾配効果法です...
まあ、勾配効果法とはなんぞやって話をしましょうか。
数学のお時間です。
$W_{t-1}$ = 現在のパラメーター
$W_{t-0}$ = 次の瞬間のパラメーター
$x$ = 入力
$L$ = 損失
$lr$ = 学習率
として定義します。
勾配効果法は
$W_{t-0} = W_{t-1}  -lr\frac{\partial L}{\partial Wt_{-1}}$
という形であり、$W$を変化させて近似させる数式です。
問題は二つあります。まず一つ目、コイツは偏微分なので、$lim_{n → +0}$を使うのですが、0に正の方向から極限まで近づけた数値です。何が言いたいかというと、「どこまで細かくするか」という問題です。本当は変数型の最小まで行くのが正解でしょうが、なんか気に食わなかったので$lr$を$lim_{n → +0}$として扱いました。
基本$10^{-4}$とかを使いますので、十分に小さいかなと思いましたが、書いてる時に「これヤバくね」って思ったので修正しときます。
二つ目は重要で、「多層化すると計算量が莫大になる」という問題です。
もし一層目のパラメータを変化させたら、それ以降の層の全ての演算を行い、損失を微分しなければなりません。これでは非常に非効率的です。
この問題は連鎖率、多変数関数の合成関数の微分の方法を使えば解決できます。
この解決法こそがバックプロパゲーション・逆誤差伝播法なのです。
##### バックプロパゲーション・逆誤差伝播法
これは、勾配効果法の偏微分を、連鎖率に従った微分と置き換えることでできます。
連鎖率はとても説明しなくてはならない事が多いので、ここでは解説しません。
そのうち解説します。多分...
# あとがき
C言語って早いので好きです。
AI開発はpythonがメジャーですけど、pythonって...ほら、遅いじゃ無いですか。
その遅さにうんざりしている方はC言語に移行してみるのも面白いかもしれません。
でもC言語は戻り値、一つの値しか返せないのがストレス。


<details><summary>この中身はマウント取ってるだけなので開かないことを推奨</summary>
ここまで理解してる人高校生以下の年齢ではそうそう居なそう。
そもAI作れる人って大体大学生だよね。
高校生AIエンジニアはネット見ても数人しか私は知らない。絶滅危惧種です。
ちな私は小学生の時Kerasで強化学習使って歩行AI作ってましt((((
</details>