OmniAICreator/Qiita-1.07M huggingface dataset:
「asdf」と「Poetry」でPythonの依存物管理した理由

標準のpipはシステム全体に依存関係をインストールし、プロジェクト間の依存関係の衝突やバージョンの問題を引き起こすこともあります。これが理由でPythonを嫌厭している人もいるのではないかと思います。
言語も同様に、プロジェクトごとにバージョンを変更することもあるでしょう。そうすると環境構築の重要性はさらに高まります。

この記事では、なぜPythonの依存物管理に「asdf」と「Poetry」を採用したのかを解説します。

## Poetryの使い心地

自分はPythonだけでなく、TypeScriptやRustなどの複数のプログラミング言語を扱います。そのため言語に固有のバージョン管理ツール（~env系）を使用すると、環境設定が複雑になりがちです。この問題を解決するために、`asdf`を選びました。

https://github.com/asdf-vm/asdf

Pythonのバージョンだけではなく、poetryのバージョンを管理することもできます。
```bash
# Pythonのバージョン管理
asdf plugin-add python
asdf install python <version>
asdf local python <version>

# Poetryのバージョン管理
asdf plugin-add poetry https://github.com/asdf-community/asdf-poetry.git
asdf install poetry <version>
asdf local poetry <version>
```


`asdf`は多言語対応のバージョン管理ツールで、Python、TypeScript、Rustなど多くの言語のバージョン管理を一つのインターフェースで扱えます。これにより、開発環境全体の一貫性を保ちながら、複数の言語のバージョン管理を簡潔に行うことができます。

## 依存関係管理の効率化

Pythonプロジェクトの依存物管理には、従来pipやrequirements.txtが一般的でしたが、私はnpmやCargoのような依存物管理スタイルを好んでいます。このため、Pythonでも同様のアプローチを採用するために `Poetry` を選択しました。
`Poetry` は、依存関係の宣言、解決、更新を簡潔に扱うツールです。プロジェクトの依存関係を`pyproject.toml`ファイルで一元管理し、npmやCargoに近い使い勝手を提供します。これにより、従来の方法よりもモダンで効率的な依存物管理が可能になります。


### プロジェクトの初期化

  ```bash
  npm init
  # package.json が生成される
  ```

  ```bash
  poetry init
  # pyproject.toml生成される
  ```

### 依存物の追加

  ```bash
  npm install [package]
  ```
  
  ```bash
  poetry add [package]
  ```
どちらも依存物の追加ですね。
poetryもnpmと同様に、`--dev`オプションを付けることで開発用の依存物と分けて管理することもできます。

### スクリプトの実行


  ```bash
  npm run <script>
  ```

  ```bash
  poetry run python <file-path>
  ```
  Poetryは、仮想環境内でスクリプトを実行する際にこのコマンドを使用します。これはnpmとは異なりますね。

## まとめ

Pythonの開発環境を設定する際、`asdf`と`Poetry`の組み合わせは、複数の言語を扱う開発者にとっての一貫性と効率性のニーズに応えます。`asdf`は言語やツール間のシームレスな統合を、`Poetry`は依存関係管理のモダンなアプローチを提供します。これらのツールは、複雑なプロジェクトでもスムーズな開発を実現するための重要な要素です。

## 余談
依存物管理でいえば、Nixも興味あるのですが複雑そうですが,、いつか使ってみたい。
mise(旧:rtx)もasdfのRust実装で気になってますが、特に不便はないし業務でも使ってないので後回し
Linxコマンド覚え書き / alternatives

# alternatives
## javaのバージョン切り替え
- デフォルトのjavaのバージョンを確認します.
```bash
# java -version
openjdk version "1.8.0_392"
OpenJDK Runtime Environment (build 1.8.0_392-b08)
OpenJDK 64-Bit Server VM (build 25.392-b08, mixed mode)
```
- デフォルトのjavaのバージョンを変更します.
<Font color="blue">"+"が表示されているのがデフォルトバージョンです.</font>
```bash
# alternatives --config java

3 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
   1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/bin/java)
*+ 2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.b08-2.el7_9.x86_64/jre/bin/java)
   3           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.21.0.9-1.el7_9.x86_64/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:3
```

- デフォルトのjavaのバージョンを確認します.
```bash
# java -version
openjdk version "11.0.21" 2023-10-17 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.21.0.9-1.el7_9) (build 11.0.21+9-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.21.0.9-1.el7_9) (build 11.0.21+9-LTS, mixed mode, sharing)
```

- デフォルトのjavaが変更されていることを確認します.
```bash
# alternatives --config java

3 プログラムがあり 'java' を提供します。

  選択       コマンド
-----------------------------------------------
   1           java-1.7.0-openjdk.x86_64 (/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64/jre/bin/java)
*  2           java-1.8.0-openjdk.x86_64 (/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.392.b08-2.el7_9.x86_64/jre/bin/java)
 + 3           java-11-openjdk.x86_64 (/usr/lib/jvm/java-11-openjdk-11.0.21.0.9-1.el7_9.x86_64/bin/java)

Enter を押して現在の選択 [+] を保持するか、選択番号を入力します:
```
【Django x Postgre】エラー「ProgrammingError: invalid connection option "init_command"」とは？

# エラー概要
Djangoで`PostgreSQL`をローカル環境にDB構築中、以下のエラーが出てきました。
`"init_command"`とは？？

```
invalid connection option "init_command"
```

こちらのエラーの原因と解決方法を紹介します。

## 原因
原因は、`settings.py`に不要な一文があったためでした。
元々MySQLのDatabase設定を行なっていた`settings.py`の`DATABASES`をコピーして、`'ENGINE'`を`'django.db.backends.postgresql_psycopg2'`に書き換えていたのですが、その際に一緒に`init_command`も消しておく必要がありました。

```settings.py
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
    'default': {
        # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': DATABASE,
        'USER': USER,
        'PASSWORD': PASSWORD,
        'HOST': HOST,
        'PORT': '5432'
        # このオプションはコメントアウトする
        # 'OPTIONS': {
        #     'init_command':
        #         'SET character_set_connection=utf8,collation_connection=utf8_unicode_ci'
        # }
    },
}
```

この`init_command`というオプションはMySQLのPythonドライバである`mysqlclient`や`PyMySQL`では使用されますが、PostgreSQLのPythonドライバである`psycopg`ではサポートされていないのです。

以下のstackoverflowでも同じエラーの方がいました。
[Django installation picking up wrong path names for migrate after project was copied](https://stackoverflow.com/questions/38932939/django-installation-picking-up-wrong-path-names-for-migrate-after-project-was-co)


## `init_commandは`とは？
`init_command`は、Djangoのデータベース接続の初期化時に実行されるSQLコマンドを指定するための設定。

上記のコメントアウトされた`init_command`の場合、接続が確立されたときにUTF-8の文字セットとUTF-8の照合順序を設定するSQLコマンドが指定されています。

また、`psycopg2`で実施した場合のエラーは以下でしたが、

```
django.db.utils.ProgrammingError: invalid dsn: invalid connection option "init_command"
```

`psycopg`に設定して実施した場合は、以下のエラーメッセージでした。

```
psycopg.ProgrammingError: invalid connection option "init_command"
```


## 補足1:

Mysqlでデータベースの文字セット（`character set`）や照合順序（`collation`）を調べる場合は以下のSQL。

```sql
SHOW VARIABLES LIKE 'character_set_database';
SHOW VARIABLES LIKE 'collation_database';
```

Postgresの場合は以下で可能です。

```sql
SELECT datname, pg_encoding_to_char(encoding) AS character_set, datcollate
FROM pg_database
WHERE datname = 'myproject_db';
```

## 補足2:

大前提、`psycopg2`（もしくは`psycopg`）のインストールは必要です。
```
pip install psycopg2
```

インストールしていない場合、以下のエラーが出てきます。

```
raise ImproperlyConfigured("Error loading psycopg2 or psycopg module")
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 or psycopg module
```

`psycopg`とは、PythonからPostgreSQLデータベースにアクセスするためのドライバのことです。
SoftwareDesign 2023/12月号 輪読会メモ

# AWS活用ジャーニー
### 第15回Amazon CloudWatch
普段の仕事ではAzureを使っているので、今回のAWSの監視の内容は面白かったです。
Amazon CloudWatchとAzure Monitorに違いの中で、特にAmazon CloudWatchが良いなと思う点は２点あったので、紹介させてください。
（決してAzureが嫌いとかではないということは予め記載しておきます。。。）
##### メトリクスとログの統合
この中でも取り上げられているメトリクスとログですが、Amazon CloudWatchは同じダッシュボードで利用可能で、簡単に統合されます。
Azure monitorでは別々の場所で提供され、Azure Monitor Logsを使用してログをクエリします。

##### アラートと通知
ここが一番Azure Monitorの悩ましい点です。
Amazon CloudWatchはメトリクスのしきい値を定義してアラートを作成し、SNSやLambdaなどで通知を行います。
Azure monitorはアラートを設定して、通知はAzure Action Groupsを使用して管理します。
現在、Google Chatを主な連絡や管理のツールとしているのですが、Azure Action Groupsではメールでの通知しかできず、Google Chatに通知を飛ばすにはGASを経由して行う必要があります。
簡略化できる日を祈って待つばかりです。
##### 最後に
Azureもまだまだ絶賛勉強中ですが、最近はAWSを扱った仕事の依頼も徐々に頼まれているので、AWSも勉強しなければなと思っています。
SoftwareDesignの輪読会は色々な発見があるので、2024年も楽しく参加させていただきます。
2023年ありがとうございました。
2024年よろしくお願いいたします。
Linuxコマンド覚え書き / sed

# sed
## 連続置換
```bash
$ cat dbconn.pl | grep CONNECT_ORA
$CONNECT_ORA="scott/tiger"; 
# CONNECT_ORAの「先頭の$を削除」「文字列中の"を削除」「行末の;を削除」を一度に実行する.,
$ cat dbconn.pl | grep CONNECT_ORA | sed -e 's/^\$//g' -e 's/;$//g' -e 's/"//g'
CONNECT_ORA=scott/tiger
```
## psコマンドでbashプロセスのpidを抽出する
```bash
$ ps -ef|grep bash|grep -v grep|sed -e "s/\s\+/ /"|cut -f 2 --delim=" "
```
## echoコマンドとの組み合わせ
### 標準出力結果に"#"を先頭に追加する
```bash
$ echo aaa | sed -e "s/.*/# &/"
# aaa
$ echo aaa > aaa.txt
$ cat aaa.txt | sed -e "s/.*/# &/"
# aaa
```
## 行削除
<font color="blue">パターンにマッチする行を削除して上書きする(-iオプション).</font>
<font color="blue">以下の場合は先頭が"#"で始まる行を削除する.</font>
```bash
$ sed -i -e '/^#/d' a.txt
```
GitHubのSSH設定

ローカル環境でGitHubとやりとりする場合、GitHubに公開鍵を登録する必要がある。
以下手順。

```
# GitHubに公開鍵を登録しないとへアクセスできない
.ssh % ssh -T git@github.com
git@github.com: Permission denied (publickey).

# ディレクトリを移動
.ssh % cd ~/.ssh

# 公開鍵、秘密鍵がないことを確認

.ssh % ls -la
total 16
drwx------   4 kinu  staff  128  1 13 21:24 .
drwxr-x---+ 22 kinu  staff  704  1 13 21:19 ..
-rw-------   1 kinu  staff  828  1 13 21:09 known_hosts
-rw-r--r--   1 kinu  staff   92  1 13 11:46 known_hosts.old

# 公開鍵、秘密鍵を生成
.ssh % ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/kinu/.ssh/id_rsa): 
# パスフレーズは設定しないので全てエンター
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/kinu/.ssh/id_rsa
Your public key has been saved in /Users/kinu/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxx kinu@KiunMacBookPro-Pro.local
The key's randomart image is:
+---[RSA 3072]----+
|  .     . o.. .+O|
| =   . . = o .+.B|
|+ + = o   @    B+|
|.. o B = B =  .o+|
|    . = S E . ..o|
|     . . o   o  .|
|            .    |
|                 |
|                 |
+----[SHA256]-----+

# 公開鍵の中身をコピー(pbcopyコマンドはMac用)
.ssh % pbcopy < ~/.ssh/id_rsa.pub 

## GitHubへアクセスできることを確認
.ssh % ssh -T git@github.com
Hi kinucode! You've successfully authenticated, but GitHub does not provide shell access.

```
MindでデータベースSQLServer2022 クエリーしてみる（ステップ1.3）SJIS渡し

# はじめに
この記事のお題はMindでデータベースSQLServer2022にクエリーしてみる（ステップ1.3）」です。ステップ1.3とはまだ最初のステップのあたりを意味します。

[CでデータベースSQLServer2022 クエリーしてみる（ステップ1.3）dll化SJIS対応](https://qiita.com/mylifewithviolin/items/8e39900a0559f12eb367)という記事で単純なODBC接続、SELECT実行・結果表示、切断の実装をDLLにした状態から接続文字列とSELECT文をSJISで受け取り内部的に正常動作するようにしましたので、それらをMindから実行してみます。

## この記事内容の作業環境
Windows11 Pro 22H2
CPU Intel(R) Core(TM) i3-5005U 2.00 GHz
Microsoft Visual Studio Community 2022 Version 17.4.4
Microsoft Visual C++ 2022
Mind Version 8.07 for Windows
SQL Server 16.0.1000.6 Express Edition
SQL Server Management Studio	19.2.56.2

# お題のデータべース
データベース名 日本語プログラミング言語
テーブル構成は[C（ステップ0.0）](https://qiita.com/mylifewithviolin/items/415ec4bf87219935a3c0)をご参照ください。

# お題のソースコード
## C
C側のプロジェクト配置構成は[C（ステップ0.5）](https://qiita.com/mylifewithviolin/items/2615070f9b4cca51e531)を
ソースコードは[C（ステップ1.3）dll化SJIS対応](https://qiita.com/mylifewithviolin/items/8e39900a0559f12eb367)をご参照ください。

## Mind
Mindのソース全体像は[Mind（ステップ1.0）](https://qiita.com/mylifewithviolin/items/7901da4001cada906663)と[Mind（ステップ1.1）](https://qiita.com/mylifewithviolin/items/037f32b8ed78b1b2de7c)をご参照ください。

Mindのソースはメインは接続文字列を定義し、「DB接続」がスタックよりそれを受け取れるようにしました。Mind文字列のNULL終端は前回と同じリテラル埋め込みです。

```mind:mssqlodbc.src
DB接続とは
	openDbで　アドレス指定でＡＰＩ呼出１する。
SQL実行とは
	execで　アドレス指定でＡＰＩ呼出１する。
DB切断とは
	$$NULLと closeDbで　アドレス指定でＡＰＩ呼出１する。

メインとは
	datasourceは　文字列定数　「Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=日本語プログラミング言語;UID=sa;PWD=****;&00&」
	SELECTは　　　文字列定数　「SELECT * FROM 言語名 WHERE 言語ID=1&00&」

	API初期処理しておき

	datasourceで　DB接続し
	SELECTで　SQL実行し

	DB切断し
	API破棄処理すること。
```

# 実行結果
では実行します。
 ```
C:\pmind\sample>mssqlodbc.exe
ODBCライブラリをロードする
ロード成功
関数アドレス群を取得
取得成功
DSText --> Driver={ODBC Driver 17 for SQL Server};Server=(local)\SQLEXPRESS;Database=日本語プログラミング言語;UID=sa;PWD=mind;
SQLAllocEnv --> 0
SQLAllocConnect --> 0
SQLConnect --> 1
SQLAllocStmt --> 0
SUCCESS OPEN
SQLText(char) --> SELECT * FROM 言語名 WHERE 言語ID=1
SQLText --> SELECT * FROM 言語名 WHERE 言語ID=1
SQLExecDirect --> 0
| 言語ID      | 言語名               | 公開年      | よみがな              |
|           1 |             Ｍｉｎｄ |        1985 |             まいんど  |

SQLDisconnect --> 0
SQLFreeConnect --> 0
SQLFreeEnv --> 0
SUCCESS CLOSE
ODBCライブラリを破棄する

C:\pmind\sample>
```
無事にMind文字列の接続情報とSELECT文で正常動作しました！:tada:

# おわりに
Mind側で文字列のユニコード化する方向性は環境が整うまでおあずけとし、次回は戻り値の受け取りに進行します。
便利なルーティングコマンド

今までルーティング結果を確認するときは「rails routes」コマンドを使っていました。ポートフォリオ作成時にルーティングが複雑になり、このコマンドの表示がとても見にくくなったため、もっと見やすく表示してくれるコマンドがないかを探したところ、ありました！今回はそれらをご紹介いたします！

※初心者目線で書いていますので、もし間違っているところがありましたらご指摘いただけると嬉しいです🙇🏼

### 対象のバージョン
Rails 6以降
※Rails 5以前はこれからご紹介するコマンドは使えません。

### rails routesコマンドとは？
routes.rbに設定したルーティングの結果を表示するためのコマンドです。
以下のように表示されます（作成したポートフォリオのルーティングを使って説明をしていきます）。

[![Image from Gyazo](https://i.gyazo.com/6c96ef4ab702330373aafa66aaf18021.png)](https://gyazo.com/6c96ef4ab702330373aafa66aaf18021)

ルーティングの数が少ない場合、rails routesの出力も見やすいと思いますが、ルーティングが増えるとかなり見づらくなります。ターミナルの画面を大きくしても小さくしても見づらく、これがストレスに感じる方も多いのではないでしょうか（私もその一人です。仲間がいると信じています）。

では、ここからルーティングに関する便利なコマンドをご紹介していきます💁🏼

### 便利なコマンド①：すべてのルーティングを見たい時
```
rails routes --expanded

⚠️expandedにつけるハイフンは2つです！！
```
以下のように表示されます。
[![Image from Gyazo](https://i.gyazo.com/cf826ce7fa1252f8959ec5f221cd9b16.png)](https://gyazo.com/cf826ce7fa1252f8959ec5f221cd9b16)

いかがでしょうか！アクションごとに線で区切られているので、どのアクションがどのパスなのか、迷子になりませんよね！これを初めて見た時はとても感動をしました。

### 便利なコマンド②：特定のコントローラのルーティングだけを見たい時
```
rails routes --expanded --grep コントローラ名　
```
例えば、usersコントローラのルーティング結果をみたい場合はrails routes --expanded --grep users  と出力すると、usersコントローラのみのルーティング結果が表示されます。

[![Image from Gyazo](https://i.gyazo.com/424d84ca05bede539084ced1be8582ac.png)](https://gyazo.com/424d84ca05bede539084ced1be8582ac)


### 便利なコマンド③：特定の文字列を含むルーティングを確認したい場合
```
rails routes --expanded --grep 文字列
```
例えば、「search」がつくルーティング結果を確認したい場合はrails routes --expanded --grep searchと出力します。そうすると、searchがつくルーティング結果が表示されます。

[![Image from Gyazo](https://i.gyazo.com/529de63a051c7daabfb711e1f241faa6.png)](https://gyazo.com/529de63a051c7daabfb711e1f241faa6)

### コマンドを使わないでルーティングを確認する方法
「http://localhost:3000/rails/info/routes」
をブラウザに打つときれいなルーティング画面が表示されます。

[![Image from Gyazo](https://i.gyazo.com/25c60abfbbefec9c9107ca96c1ff5857.png)](https://gyazo.com/25c60abfbbefec9c9107ca96c1ff5857)

⚠️サーバーを立ち上げないと見られませんので、ご注意を！

### まとめ
いかがでしたでしょうか？少しでも皆様のストレスが軽減できたら嬉しいです。
他にもっと便利なコマンドがあれば、ぜひお教えください！
初めて記事を書いたので、読みにくい部分があったかもしれませんが、最後までお読みいただき、ありがとうございました🙇🏼

### 参考文献
https://www.rubyinrails.com/2019/11/05/rails-routes-expanded-option/
https://railsguides.jp/routing.html
Databricks Certified Data Engineer Associate勉強法

## はじめに
データブリックスの森です。ジュニアの目線で、これからデータブリックス データエンジニア アソシエイトの取得を目指す方向けに、勉強法、受験に際してのTipsなどを紹介したいと思います！


![6ksfhi0b_1705144958191.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3625273/94c04a08-2330-2c80-8d0b-ea337bb9e2de.png)


## 試験の概要
試験の内容や、受験方法について理解しておきましょう。以下、一通り読むことをオススメします。

・[公式ガイド](https://www.databricks.com/learn/certification/data-engineer-associate)
・Databricks Certified Data Engineer Associate試験対策

https://qiita.com/taka_yayoi/items/76dee9ec942274cb23ca

## 学習方法
#### 1.Databricksの概要を理解する
まずはDatabricksが提供する機能ついて理解しておきましょう。以下記事を読むことをオススメします。
Databricks初めての方向けにまとめられており、Databricksの使い方をざっくり理解できると思います。

https://qiita.com/taka_yayoi/items/91dde16b275c279ad2a2

#### 2.[模擬試験](https://files.training.databricks.com/assessments/practice-exams/PracticeExam-DataEngineerAssociate.pdf)を解く
上記を一通り読めば、Databricksの概要が何となく理解できたと思うので、腕試しに解いてみましょう。
おそらく解けない問題にいくつも遭遇すると思いますが、ここでは出題形式に慣れることを主眼に解くと良いと思います。
出題形式は本番とかなり近いです。本番は英語なので、翻訳に頼らずにまずは英語で解いてみましょう。

#### 3.Databricksの理解を深める
**①模擬試験の復習**と**②他のマテリアルでの補強**をしましょう。
**①模擬試験の復習**では、弱点分野を把握すると良いと思います。Databricks社員による模擬試験の解説記事もありますので、ぜひご活用ください。

https://qiita.com/kohei-arai/items/5b54a89cbaec801f1972


**②他のマテリアルでの補強**ですが、分野全体的な補強であれば、ハンズオンでDatabricksを実際に動かすことをオススメします。
特に試験問題の中には、SQLやPythonコード、各機能のUIに関する問題がありますので、ハンズオンによって対策がしやすくなるかと思います。

Databricksには無料のトライアルもあります。実際の動かし方など、詳細は以下記事をご参照ください。

https://qiita.com/taka_yayoi/items/8dc72d083edb879a5e5d

　
他の補強案として、[セルフペースのトレーニング](https://www.databricks.com/learn/training/home)や、[インストラクターによるトレーニング](https://www.databricks.com/learn/training/catalog/data-engineering)を受講するのもオススメです。また、UdemyのPractice Examが参考になると評判でした。

https://www.udemy.com/course/databricks-certified-data-engineer-associate-practice-tests/
 
その他、各分野の補強には以下のマテリアルが役に立つと思います。
・[Delta Lake とは何か](https://ktksq.hatenablog.com/entry/deltalake)
　Delta Lakeの特徴について、非常に分かりやすくまとめられています。
 
・[Learning Spark](https://pages.databricks.com/rs/094-YMS-629/images/LearningSpark2.0.pdf)
　Sparkについて解説した約400ページの解説書。私はクエリの挙動確認に使ったりしていました（例、explodeとcollectの違い、filter()やarrayなど）


## 受験時のTips
#### 受験方法
試験は以下のサイトから申し込みできます。オンラインでの試験です。詳細は[公式ガイド](https://www.databricks.com/learn/certification/data-engineer-associate)をご確認ください。
http://webassessor.com/databricks


#### 試験
90分で45問解く必要があります。私は英語に苦手意識がありましたが、時間に追われるタイプの試験ではなく、あまりハンデになることはありませんでした。
また、他のクラウドベンダー資格試験と同様に、あとでレビューしたい問題にフラグを立てることも出来ますので、自信が無い問題はフラグを立てて、一旦先に進むと良いかと思います。

:::note warn
画面右上（or右下）にSubmit Examというボタンがありますが、押下した時点で終了してしまいます。全て回答してから押下するようにしましょう。
（仮に誤って押下しても、本当に終了するか確認メッセージが表示されるので、試験に戻ることは可能です）
:::

試験終了後は、すぐに各分野の得点率と合格判定の結果が出ます。

　


（以下、特殊ケース）
また、私は試験途中でNetwork errorの画面が表示され、試験問題が途中で表示されなくなるトラブルがありました。
試験画面上にSupportボタンがあり、そこからAgentとチャットすることで無事再開できました。


## おわりに
この記事では、データブリックス データエンジニア アソシエイトの勉強法、受験に際してのTipsを紹介しましたが、いかがでしたでしょうか。
皆さんが今後試験を受ける際に少しでもお役に立てましたら幸いです。また、何かコメントなどあればお気軽にご連絡ください。
最後に記事を読んで少しでもためになったと思われた方は、「いいね」や記事の保存、SNSでシェアいただけると嬉しいです！
お客さまの不安と従業員のストレスを改善するためのLINE　Botを作成！

# なぜ、LINE Botを作ろうと思ったか！？

　こんにちは、飲食店に勤務する、もうすぐ50歳のものです。ちなみに娘が二人います！（双子です。）
 ### お客さまの不安なこと。
 勤務する店舗はチェーン店舗でありますが売り上げ規模は小さな店舗です。その為、生産性などを考えると1時間当たり一人か二人で運営している店舗です。
 　また、通常時期では「食べ放題」なども行っているため他の店舗と比べると通常時期でもお客さまの問い合わせが多い状態の中、年末12月に入るとさらに、電話の問い合わせが**通常時の5・6倍**に膨れ上がります。多い時は1時間に20件程度電話がかかって対応する。店頭にお客さまが多いピークタイムでは電話に出ることが出来ない事もあります。
  お客さまの電話の内容の90％は、年末に発売される**福袋**の問い合わせです。お客さまとしては**欲しいもの**が購入できるか、予約できるか不安だと思います。買えるという安心が欲しいですよね！
  そこで、**お客さまがLINEで確認できるLINE　Botを作成**してみました。

 # 使用ツール
 ### 作成ツールは、Makeを使用　　https://www.make.com/en
　　   **・LINE（Wacth Events)**
    　　**・Google Sheets(Search Rows)**
       　　**・LINE（Send a Reply Message)　2個**
         

![スクリーンショット (22).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656986/931fbb9f-63f7-8d76-f763-562428f1fe39.png)

上記の図のように接続しました。

# Google sheetsの集計画面

![スクリーンショット (20)_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656986/c5659e08-d045-366e-0966-677b3dda1e86.jpeg)
予約が入った時に数値も入力することで、**リアルタイム**に残り予約可能数を返信することができます。

#<details><summary>**実際のLINE動画**　リンクにアクセスしてみて下さ！</summary>
https://twitter.com/nakamori315/status/1747955740835459186
</details>

## LINE画面詳細
 ![Screenshot_20240112-225106 (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656986/53fd5e1c-1639-b1d4-89e7-c641fdacbd4b.png)

**まずは、福袋など何か入力。**
  **次に種類を入力することで・・・。**

  
![Screenshot_20240118-205008_LI.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656986/947993b4-4370-d6c7-d015-44ea254caad4.jpeg)

**お客さまが求める種類を入力すると、予約可能数が返信されます！！**
  **その他の情報として、ネットオーダー・公式HPへのURLも案内されるように設定できました。**


# 特に、苦労したところ
　今回、「初めてMakeを使用してLINE Botを作成しましたが、最初の練習は、HTTPモジュールを使用しての「お天気情報」を教えてくれるのもに挑戦しました。さまざまな、公式LINEを見ている中で質問の返信などは、使っている中では当たり前のことになっており、実際、作成となると本当に意味が分からなかったです。特にモジュールの設定での複数の文章を相手に伝えるか、分かりやすく伝えるために色々な手段があることを知りました。

![スクリーンショット (23).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3656986/aacfa385-61b4-c8aa-d2a5-17b25b82cfb8.png)

**ホームページやおすすめなどのリンク先を付けることもでき情報を伝えやすくなるし、見栄えもよくなりました。**

# まとめ
### なぜ、LINEでの制作をおこなったか
 WEBアプリでも確認は出来ると思いますが、データ入力などリアルタイムに入力していくようにするためにGoogle Sheetsを使用し予約が入り次第、数字を入力を行えるため。また、自店舗のお客さまはLINEギフトの使用率も高く世間一般的に使用されているLINEで世代の幅の広いお客さまに周知しやすいと考えました。
 　このLINE Botを使用することでお客さまの不安と従業員のストレスの軽減に繋げたいです。
Minecraft Bedrock editionのデータをjava版サーバーに変換する方法

内容としてはタイトルの通りです。
## tl;dr
要するに変換してサーバーに貼り付けるってことです。

## データをJava版に変換
je2be( https://apps.microsoft.com/detail/9PC9MFX9QCXS?hl=ja-jp&gl=JP )を利用して変換しました。
統合版からjava版に＞*.mcworldを選ぶ＞フォルダに出力　で変換できます。

## paperMCサーバーを構築
https://qiita.com/halglobe0108/items/a990d099c9dd20879ecf

とかが参考になると思います。
~~あとシード値とかが変換後のデータと合致していないと生成がバグるのでserver.propertiesには注意。~~ (2024年10月12日追記：server.propertiesの値は無視されるらしいです。)
変換後のデータのlevel.datをNBTExplorer( https://www.minecraftforum.net/forums/mapping-and-modding-java-edition/minecraft-tools/1262665-nbtexplorer-nbt-editor-for-windows-and-mac )で見ると確認できます。

## データ移行
/worldフォルダの内容を全消ししてそこにさっき変換したJava版のデータを貼り付けます。

:::note warn

サーバー側に存在したオーバーワールドのデータがすべて削除されます。

:::

これで普通に起動できます。

thanks for reading!
ビッグデータ | オススメのWebスクレイピング&データ分析ツール 5選

ビッグデータとデータ分析はここ数年で非常に人気のある用語であり、データ収集、データ分析、データ可視化は企業からますます注目されることは間違いありません。 私はScrapeStormというWebスクレイピングツールを使ってWebページのデータを収集することが多いのですが、収集したデータを迅速にデータ分析することはずっと努力して勉強してきた課題です。
 
いくつかの優れたデータ分析ツールの出現により、データ収集と分析に対する私たちの見方は完全に変わるでしょう。

## **Webスクレイピングツール‐ScrapeStorm**
ScrapeStormとは、強い機能を持つ、プログラミングが必要なく、使いやすい人工知能Webスクレイピングツールです。違う基盤のユーザーに二つのスクレイピングモードを提供し、1-Clickで99％のWebスクレイピングを満たします。ScrapeStormにより、大量のWebデータを素早く正確的に取得できます。手動でデータ抽出が直面するさまざまな問題を完全に解決し、情報取得のコストを削減し、作業効率を向上させます。

![](https://assets.st-note.com/img/1705131305394-wEHodG8MRO.png?width=2000&height=2000&fit=bounds&quality=85)
データ分析ツールは、データを分析するプログラムおよびソフトウェアです。これらのツールは、マーケティングおよび販売戦略の開発を支援するために世界中の企業で広く使用されており、企業は利用可能な最高のデータ分析ツールの分析に基づいて意思決定を行っています。

## SAS: ビジネスインテリジェンスとデータマイニングのための分析プログラム
SASの主な機能は、約120種類のツールとアプリケーションにアクセスし、SASメモリ処理エンジンの助けを得てビッグデータを分析し、SAS可視化データ分析（SAS ViDA）を用いて企業全体のデータを探索し、可視化することを含みます。
**メリット：**
SAS は、統計分析、財務分析、予測、調査など、さまざまな分析に使用できます。 ニーズに合わせてカスタマイズされたグラフ、表、またはチャートを作成することもできます。 さらに、この人気のあるソフトウェア パッケージを使用すると、さまざまな方法でデータを細分化できます。つまり、必要なすべての答えが迅速かつ簡単に得られます。
**デメリット：**
これは使用するのが複雑なプログラムであり、費用がかかる可能性があります。 ただし、それを使えば使うほど価値があります。 SAS で強力なダッシュボードと分析を作成するには時間がかかります。 自分が何をしているのかをしっかりと理解する必要があります。そうしないと、ほとんど役に立たずに多額の費用を費やすことになります。
![](https://assets.st-note.com/img/1705131332393-imQKxBOYFi.png?width=2000&height=2000&fit=bounds&quality=85)
## Sisense: 最も人気のあるデータ分析ツールの 1 つ
Sisenseは最も人気のあるデータ分析ツールの1つであり、それがなければデータ分析ツールのリストは不完全です。ビジネスインテリジェントプラットフォームであり、データを分析することで組織の意思決定を支援できます。技術的な知識やデータ分析の経験にかかわらず、組織内の誰でも簡単に使用できるセルフサービス分析を提供します。視覚化機能も優れており、複雑なデータセットの迅速な理解に役立ちます。
**メリット：**
高速分析用のビッグデータ処理エンジンを備えています。さらに、視覚効果を深く理解して、必要なすべてを見つけることができます。関係から例外値まで、事前に構築されたスコアカードとダッシュボードについても深く理解することができます。
**デメリット：**
カスタマイズが難しい、これにより、一部の人にとってはビジネスに変更を加えることが困難になります。
![](https://assets.st-note.com/img/1705131341736-Rt4y6t0JDb.png?width=2000&height=2000&fit=bounds&quality=85)
## Excel: オープンソースの無料スプレッドシート アプリケーション
Excelでのデータ分析は、メトリックや属性を含む大量のデータを取得することから始まります。Excelの最も重要な特徴は、使いやすく、速度が速く、低コストです。データ分析と視覚化を支援するいくつかの自動化機能を提供します。また、並べ替えやフィルター、ピボットテーブルなどのツールも搭載されており、データをより効率的に操作できるようになります。
**メリット：**
Excelは非常に柔軟で、ユーザーがさまざまな方法でデータを分析することができます。計算、グラフ、その他のデータの表示に最適です。
**デメリット：**
欠点は、使用経験がないと編集するのが難しいことです。ローとカラムの数に制限があり、ワークブックのデータが失われる可能性があります。
![](https://assets.st-note.com/img/1705131349798-WAU8ujQ8zT.jpg?width=2000&height=2000&fit=bounds&quality=85)
画像ソース：http://haku1569.seesaa.net/article/396315457.html
## Tableau: トップクラスのデータ分析ツールの1つ
Tableauの重要な特性は、分析エンジンを提供することです。このエンジンにより、データセット上にレポート、ダッシュボード、ダッシュボードを構築できます。次に、データのグラフィックス表現に関する情報を提供します。
この製品について知りたい人のために無料トライアルを提供するだけでなく、Webアプリケーションをインタラクティブに分析できるオープンなAPIもあります。
**メリット：**
Tableauは手の届くアナリストのようなもので、複数のレポートを作成でき、プロジェクト内の他の人とやり取りしやすいです。
**デメリット：**
ユーザーはソフトウェアを使用するために多くの知識を持っている必要があり、ソフトウェアの理解が十分でない場合は、学習に多くの時間が必要になる可能性があります。
![](https://assets.st-note.com/img/1705131366658-TliyXMf3ce.png?width=2000&height=2000&fit=bounds&quality=85)

**結論：**
将来的には、データのライフサイクル全体を管理するビッグデータ ツールがさらにパーソナライズされるようになるでしょう。 なぜなら、企業は人工知能を利用してユーザーとそのオンライン行動に関する情報を収集することが増えているからです。
 
顧客データから最大限の価値を引き出す方法を理解することに専念するチーム全体がいます。 このレースでは、ビッグデータとデータ分析ツールが何よりも強力で決定的です。
PowerAutomate Desktop 作成時にPOWER-FXを選択するとリスト作成のアクションが出ない

https://qiita.com/EasyCording/items/158c9a09a3f4db1efacc

続き

# 最近の取り組み
　昨年から少し生活に余力が生じてきたので、ＦＸ投資に５万ほど回すことが出来た。
 年末から取り組んでいるのは、AutoChartistを使ったトレードであるが、これが結構めざましい成果を上げている。

 https://www.oanda.jp/lab-education/blog_column/autochartist/

# サインの入手
　スマホのアプリでアラートを出せたり、特定のメアドにサインを送るなどが出来るので、こうなればMT4の自動化に取り組まなければならない。
　昨年から、PowerAutomateの勉強を開始していたので、PowerAutomate Desktopで、ヤフーメールをチェックして、メールのサインを取り出すことにした。
　メッセージボディのテキスト内容を取得して、CHATGPTのAPIを通じて、サインと戦略を考えさせたかったが、リクエストエラーが出たので、仕方なしにテキストファイルに格納することにした。
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212914/675a46e7-5474-7e43-be85-f5e7604c54c5.png)

# はまったこと
　PowerAutomateで一番ハマったところは、リスト関連のアクションが出なかったことだ。これに約3日を費やしてしまった。結局はPowerAutomate作成時にPOWER-FXを選択してしまったことが原因だった。
 　それ以降は、結構すんなりとクリアすることが出来た。正直言うと、マニュアル関係の不備や、マイクロソフトの勝手な仕様変更とか、いろいろクソな部分だったので、余計にPower Platformに対する不信感が増大した。

https://learn.microsoft.com/ja-jp/troubleshoot/power-platform/power-automate/desktop-flows/actions-not-available
TDDについて簡単にまとめてみる

仕事でTDDを使って開発することになったので改めて書籍「Clean Craftsmanship 規律、基準、倫理 （Robert C. Martin 著, 角 征典 訳 ： 以下 参考書籍）」を読み直し自分用にまとめてみる。

## TDDとは
TDD（テスト駆動開発）。テストを書くことによって開発を進めていく開発手法。
> TDDの本質は、以下のことを行うための規律をもたらすこと。
>
>1. 信頼できるテストスイートを作成し、リファクタリングの作業や、デプロイ可能かどうかの判断ができるようにする。つまり、テストスイートをパスしていれば、システムをデプロイできる。
>2. 適切に分離された本番コードを作成し、テストやリファクタリングを可能にする。
>3. 極端に短いサイクルのフィードバックループを作成し、プログラムを書くリズムと生産性を安定させる。
>4. テストコードと本番コードを相互に分離させ、変更があっても両者に複製することなくメンテナンスできるようにする。

プロダクトコードができた時は、テストが揃っている時であり、仕様が整理されている時であり、そしてデプロイできる時でもある。テスト自体が分解された仕様であり、そのテストを通るコードが書かれているからだ。

## 4つの法則
> ##### 第一の法則
> テストを書くまでは本番コードを書いてはならない。本番コードがないためにテストは失敗する。
> ##### 第二の法則
> 失敗するテストやコンパイルできないテストを必要以上に書いてはならない。失敗を解決するには本番コードを書く。
> ##### 第三の法則
> 失敗しているテストを解決する本番コードを必要以上に書いてはならない。テストがパスしたら、追加のテストを書く。
> ##### 第四の法則
> リファクタリング

いわゆるレッド→グリーン→リファクタリング。まず失敗するテストを書き（テスト結果はレッド）、そのテストを通すためのプロダクトコードを書き（テスト結果をグリーンに）、そしてテストが通ることを維持しながらプロドクトコードのリファクタリングを行う。

## 実践してみて
TDDで開発をしようとすると、自ずとテストしやすいコードを意識するようになる。テストしやすいコードを意識すると、実装しようとする機能をできるだけ細かく分解し、シンプルな処理や振る舞いに落とし込むにことになる。慣れないうちはここで苦戦する（何なら今している）。
大抵の場合、要求される仕様の粒度の方が大きいからだ（例えば、”ボタンを押すと集計結果一覧が表示される”のような）。ここですぐ粒度が大きいままの仕様のテストを書こうとすると途端に思考が停止する。あるいはなんとかテストを書いても、途中の処理が多すぎたりしてなかなかグリーンまで辿り着かない、ということが起こる。
仕様に対して機能を実装するとき、実際は小さな処理や部品を組み合わせていくことになる。テストも小さな処理や部品のほうが当然書きやすい。しかし、粒度の大きい仕様をみて、細かなそれぞれの部品の仕様に分解して整理できるようになるには工夫が必要だ。
自分の場合は、まずコメントで処理の流れに沿って概要を箇条書きにしながら、処理を分解・整理していく（まだコードは書かない）。一通り書き出せてから、細かい処理についてのテストを書く（しかも呼び出すだけの簡単なテスト）。そしてコードを書く。あとはレッド、グリーン、リファクタリングを繰り返し、一つのコメントについての処理が終わったら次のコメントに取り掛かる。これを繰り返す。

もう一つの問題として、何をどこまでテストするかと言う問題もある。これはプロジェクトの方針やチームの方針にも左右されるのでよく確認する必要がある。
PowerAutomateDesktopでPower Fxの機能を検証

 今回は、２回にわたってPowerAutomateDesktopでPower Fxの機能が使える際にメリットとデメリットを検証してみた。

 　第１回は、その方法の検証以前にPowerFxの機能の使い方と機能ONとOFFの前後で操作に変化がないかをみてみた。

# 機能ONの方法

　１，PowerPlatFormにアクセスしてそこから、PowerAutomateDesktopにアクセスする。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/8903378e-323d-07a2-6d4a-3fcee771efb8.png)

　２，PowerAutomateDesktopにて新しいフローをクリックして
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/53630b93-dc9b-4bcb-d367-15951d27b21b.png)

　３，Power Fxが有効をONにして作成ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/bc808099-de53-9062-e836-1390d3df381c.png)

そうしたら、使用可能。

# 操作画面の違い

　大まかに変更点はなさそうですが、データテーブルを操作する画面が消えていた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/50ea8d90-82ea-978a-d63c-075fb95ba971.png)
 
 本リリースの際に、データテーブル型変数が操作できない状態のままだとしたらどうなのだろうかという気がする。
Web開発セキュリティ共通基礎

# XSS　クロスサイトスクリプテイング
### 定義
攻撃者が送り込んだ悪意のコードをそのページを閲覧した不特定多数のユーザーに、スクリプト(簡易的なプログラム)として実行させる可能性があることを指します。

:::note warn
簡単に言えば：攻撃者が悪意のあるスクリプトをWebページに注入し、他のユーザーのブラウザ上でそのスクリプトが実行されるセキュリティの脆弱性です。
:::

### 攻撃が引き起こす悪い状況
- パスワードや個人情報の盗難
攻撃者は偽のログインフォームを作り、そこに入力された情報を盗み取ることができます。
---
- Cookieの窃取 
攻撃者はユーザーのブラウザからCookieを盗むことができ、これによりユーザーのセッションを乗っ取ることが可能になります。セッション乗っ取りにより、攻撃者はユーザーになりすまして、SNSアカウントの操作やネットバンクでの不正な取引を行うことができます。
---
- ウェブサイトの改変
攻撃者はウェブページに不正なスクリプトを注入し、ページの内容を変更することができます。これにより、他の訪問者に対して偽の情報を表示したり、追加のマルウェアを配布したりすることが可能になります。
---
- ブラウザのセキュリティ機能の回避
XSS攻撃により、攻撃者はブラウザのセキュリティ機能を回避し、他の攻撃手法を用いることが容易になります。
---
### クロスサイトスクリプティング攻撃に対する対策

#### ユーザーの対策
1. ブラウザーなどのアプリケーションを常に最新にアップデートすること
2. Webサイトやメールに含まれているリンクを安易にクリックしないことです
3. ブラウザーのセキュリティ設定を変更することで、信頼できるWebサイト以外ではJavaScriptなどのスクリプト機能を無効にする
4. ウイルス対策ソフトウェアを導入し、不正なWebサイトへのアクセスや不正スクリプトの実行を阻止すること



#### Webアプリケーション管理者の対策
##### エスケープ処理の実施：
- ユーザーの入力に含まれる特殊文字（例：「<」、「&」）を無害化するためにHTMLエンティティ（例：「<」、「&」）に変換。
- スクリプトが動作することを防ぐために、入力されたデータをそのまま出力しない。
##### 入力値の制限：

- ユーザーが入力できる文字の種類を限定（例：パスワードの場合「半角英数字6文字以上」）。
- 形式が決まっているデータ（例：郵便番号、電話番号）の入力欄で数字のみの入力を許可。
- 不適切な入力があった場合に再入力を求める。
##### WAF（Web Application Firewall）の導入：

Webアプリケーションへの攻撃を検知し、防御するためのシステム。
ユーザーの入力値をチェックし、不審なアクセスやXSS攻撃をブロック。
##### 定期的なセキュリティチェックとアップデート：

定期的にアプリケーションのセキュリティ状況をレビューし、新たな脆弱性に対処。
セキュリティのベストプラクティスに沿った開発と維持を続ける。

# SQLインジェクション
### 定義
SQLの組み立て方法に問題がある場合、攻撃によってデータベースの不正利用をまねく可能性があります。
このような問題を「SQLインジェクションの脆弱性(ぜいじゃく)と呼び、問題を悪用した攻撃を、「SQLインジェクション攻撃」と呼びます。

:::note info
Webアプリケーションの脆弱性を意図的に利用し、断片(だんペン)的なSQL文をアプリケーションに不正に注入（インジェクション）し実行させる攻撃手法です。
:::
@RequestBodyと@ModelAttributeの違い

> 個人的に気になって探してみたので正確ではないかもしれません。
> ユーザーが送った値を受け取る時、@MdelAttributeまたは@RequestBodyなどを使ったが、特にこの二つが似ているようで混乱したので整理してみようと思う。

# @RequestBody
- RESTful APIを使用したり、JSON/XML形式でデータをやり取りする際に主に使用する。
- 最近、フロントエンドの場合はSPA(Single Page Application)が多いが、SPAはCSR(Client Side Rendering)で、つまり動的に作られるところがクライアントなので、サーバからデータを受け取る時はJSONとREESTful APIを多く使うので、それで最近@RequestBodyをたくさん使うというようだと思った。

# @ModelAttribute

- HTMLフォームを通じてデータを送信する際に主に使用する。
- Field単位で精巧なバインディングが適用される。 すなわち、特定フィールドがバインディングされなくても残りのフィールドは正常バインディングされ、Validatorを使った検証も適用できる。
- TymeleafのようなMPAでフォームを介してデータを送信する場合、エラーが発生すると、どの項目を書き間違えたのか普通画面に表示していたので、バインディングされないフィールドがあっても検証できる@ModelAttributeの方が良いと思った。
Microsoft Edge での http からhttps への自動リダイレクト機能の制御

# これは何？
Chromium のセキュリティ対策の一環として、[HttpsDefault]( https://blog.chromium.org/2023/08/towards-https-by-default.html) という機能があります。
https として存在する URL に 誤って http でアクセスしてしまった際に、
ブラウザが自動的に https にリダイレクトするという機能です。
Microsoft Edge にも ver 120 でこの機能が取り込まれました。

リダイレクトは想定された動作になりますが、
http / https のプロトコル部のみ異なるサイト※ が共存する場合、
http サイトへのアクセスがリダイレクトされることになります。
(なお、URL bar に手入力して遷移することは可能)

本記事は、このリダイレクトの挙動を望まない場合に必要となる、
"HttpsDefault 機能をクライアントへの設定でオフにする方法" です。

※ "http://example.com" と "https://example.com" 等

# 対策
[AutomaticHttpsDefault](https://learn.microsoft.com/ja-jp/DeployEdge/microsoft-edge-policies#automatichttpsdefault) ポリシーを 0 に設定することで 
https への自動リダイレクトが行われなくなります。

# 補足
Google Chrome において同機能を制御すると思しき [HttpsUpgradesEnabled](https://chromeenterprise.google/policies/#HttpsUpgradesEnabled) ポリシーは、
Microsoft Edge ではサポートされるものではありません。
([Microsoft Edge - ポリシー](https://learn.microsoft.com/ja-jp/deployedge/microsoft-edge-policies) に記載のないものはすべてサポート対象外※です)

内部的な処理も Google Chrome とは異なる可能性がありますし、
もし動作するとしてもそれは As Is に過ぎないものであることにご留意ください。

※ Microsoft docs に記載のない起動引数も同様。

## 補足その2
原則 "直接アドレスバーに URL 入力時" は http → httpsのリダイレクトは走りませんが、
お気に入りに登録してある URL は例外的に自動補完とみなされて https にリダイレクトされます。
extensionでつまづいた

extensionで躓いたので備忘録として置いておきます。(chatGPTによる具体例つき)


Swiftにおける`extension`の使用方法とスコープについて詳しく学ぶために、以下のような具体的な例を用いて段階的に説明します。

### 1. `extension`の基本的な使用法

Swiftでは、`extension`を使用して既存の型（クラス、構造体、列挙型など）に新しい機能を追加できます。例えば、以下のように`String`型に新しいメソッドを追加することができます：

```swift
extension String {
    func addExclamation() -> String {
        return self + "!"
    }
}

let greeting = "Hello"
print(greeting.addExclamation()) // "Hello!"
```

この例では、全ての`String`インスタンスが新しい`addExclamation`メソッドを使用できるようになります。

### 2. `extension`のスコープ

`extension`はファイルレベルで定義されます。これは、`extension`が特定のクラスや構造体の内部ではなく、ファイルのトップレベル（他のクラスや構造体の外部）に置かれるべきであるということです。例えば：

```swift
class MyClass {
    var value: Int = 0
}

extension MyClass {
    func increment() {
        value += 1
    }
}
```

この例では、`MyClass`に`increment`メソッドを追加していますが、`extension MyClass`は`MyClass`の外部に定義されています。

### 3. スコープの制限

もし`extension`をクラスや構造体の内部に誤って配置してしまった場合、そのメソッドは外部からアクセスできなくなります。例えば：

```swift
class MyClass {
    var value: Int = 0

    extension MyClass { // これは誤りです！
        func increment() {
            value += 1
        }
    }
}
```

このコードはエラーを引き起こします。なぜなら、`extension`はクラスの内部ではなく、ファイルのトップレベルに置く必要があるからです。

### 学ぶべきポイント

- `extension`は型の定義を拡張する強力なツールですが、適切な場所（ファイルのトップレベル）に配置する必要があります。
- 間違った場所に`extension`を配置すると、スコープの問題が発生し、期待通りに機能しない場合があります。
- 正しいスコープで`extension`を使用することで、既存の型に新しい機能を追加し、コードの再利用性と整理性を高めることができます。
読みやすい条件分岐とは

# はじめに
```読みにくい条件.py
if a > b:
    a = b
```
このコードは過去に私が書いた条件分岐を簡略化したものである。これを見たとき、私は少し読みにくいと感じた。では、読みやすい条件分岐とは何か。私は「文脈を読み取りやすい」「条件が明記されている」の2点と考えた。この記事ではこの2点についてまとめる

## 前提
この記事では左辺右辺ともに処理によって変化する値が格納された変数の場合を考える。
片方が定数または予測した値を格納した変数の場合は、リーダブルコードにもあるように、左辺に変化する値・右辺に予測できる値の順番にするのが望ましい

## 1.文脈を読み取りやすい
「文脈を読み取りやすい」とは、条件式と以降の処理で主語が変わらないことである。
先のコードを改めて確認する
```読みにくい条件.py
if a > b:
    a = b
```
このコードを日本語で表現すると「 a が b より大きい場合、b を a に代入する」となる。条件式の主語は a なのに、次の処理では b が主語になっている。

条件式と次の処理で主語を b で一致するように変えてみる
```主語を一致させた場合.py
if b < a:
    a = b
```
「 b が a より小さい場合、b を a に代入する」
主語を合わせた方が、文として読みやすく躓きにくくなる。

## 2.条件が明記されている
条件が長い場合複雑な場合、また条件を判定するための処理が長い場合、条件式を「変数に格納する」または「真偽値を戻すメソッドを作る」ことをして命名すべきである。
例として2~100の間で素数ならば表示するというコードを挙げる。
<details><summary>Pythonの組み込み関数</summary>

* `range(a,b,c)`
    * a 以上 b 未満の数字の並びを間隔 c ごとに返す。cの初期値は1．2~100ならば`range(2,101)`とする
    * aがb以上の場合、空の並びを返す(for文が処理されない)。cを負の数にした場合、a以下bより大きい数字の並びを間隔 c ごとに返す
* `print()`：標準出力を行う組み込み関数
</details>

```素数判定.py
for i in range(2, 101):
    root_i = int(i ** (1 / 2))
    ans = True
    # 合成数Nは2以上√N以下の約数をもつため、割り切れたら素数ではない
    for j in range(2, root_i + 1):
        #iが2と3の場合は2以上2未満の整数が存在しないためfor文が処理されない
        if i % j == 0:
            ans = False
    if ans:
        print(i)
    
```
このコードは「全ての合成数Nは2以上√N以下の約数をもつ」ことを利用して素数判定を行っている
条件自体は「素数か否か」のため複雑ではない。しかし、条件を求めるまでが長く、コードの殆どが真偽値を求める過程になっている。これが長くなると、真偽値を求める過程とそのコードで本当に行いたい処理なのかがわからなくなる。
そのため、真偽値を求める過程を外に出し、名前を付ける
```素数判定処理をis_prime()として切り出す.py
#メインの処理
def main() -> None:
    for i in range(2, 101):
        if is_prime(i):
            print(i)


#引数xが素数かどうか戻す関数
def is_prime(x: int) -> bool:
    root_x = int(x ** (1 / 2))
    ans = True
    for i in range(2, root_x + 1):
        if x % i == 0:
            ans = False
    return ans

```
素数は英語でprime numberと言うため、`is_prime`と命名
切り出した方が条件や条件判定の過程・メインで行いたい処理がわかりやすくなった


## まとめ
読みやすい条件分岐にするには、「条件と以降のコードで主語を合わせること」「条件に名前を付けること」が必要だと考えた。この他にもド・モルガンの法則で複雑な条件を整理したり、早期リターンで処理をわかりやすくするなどの手法がある。これらを意識し、他の方が読んでも読みやすいコードを書いていきたい
【SwiftUI】Chartをスクロール可能に変更する

# はじめに
チャートをスクロール可能にする機能の紹介します。

# サンプルアプリ
![Simulator Screen Recording - iPhone 15 - 2024-01-13 at 19.07.56.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/dee5a330-63c9-71eb-d8d5-4c4a959926d9.gif)

# 実装
```swift
import SwiftUI
import Charts

struct Temperature {
    let day: Int
    let max: Double
    let min: Double
}

struct ContentView: View {
    @State private var temperatures: [Temperature] = [
        .init(day: 1, max: 23, min: 13),
        .init(day: 2, max: 25, min: 10),
        .init(day: 3, max: 23, min: 11),
        .init(day: 4, max: 21, min: 11),
        .init(day: 5, max: 18, min: 12),
        .init(day: 6, max: 19, min: 13),
        .init(day: 7, max: 18, min: 15),
        .init(day: 8, max: 22, min: 9),
        .init(day: 9, max: 23, min: 10),
        .init(day: 10, max: 24, min: 13),
    ]
    
    var body: some View {
        Chart {
            ForEach(temperatures, id: \.day) { temperature in
                LineMark(
                    x: .value("day", temperature.day),
                    y: .value("max", temperature.max)
                )
            }
        }
        .chartScrollableAxes(.horizontal)
        .chartXVisibleDomain(length: 5)
        .frame(width: 300, height: 300)
    }
}
```

# 解説
グラフをスクロールするためのモディファイアです。
単純にスクロールさせたいだけであればこれだけで大丈夫です。
```swift
.chartScrollableAxes(.horizontal)
```

しかし、初期グラフで〇〇の値まで表示させたいといったことが多いと思います。
そんな時に使うのが、`chartXVisibleDomain`です。
今回は`length`を5に設定しているので初期グラフでスクロールせずに5まで表示されています。
```swift
.chartXVisibleDomain(length: 5)
```

![スクリーンショット 2024-01-13 19.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/69afdcac-8cd1-d405-80c8-1644c9f491a3.png)

目盛りが振られていませんが、5まで表示されています。

# おわり
Chart関係の記事を書いてるのでみてみてください

https://qiita.com/SNQ-2001/items/ca269c1da3454b972d2c
MakeとLINEmessagingAPIを使って駐車場を確認してみた

小売業で事業部スタッフをしており、品質管理の衛生巡回をするために店舗を駆け回っています。プロトアウト初挑戦（一週間で、まずやってみた）
# 店舗の駐車場情報を表示するLINEBotを作成
スタッフとして約５０店舗の巡回をしなくてはなりません。都市部は、駅前立地が多くて店舗駐車場がないことがあります。コインパーキングを探していると、運転が上手ではない私はドキドキしながら危険です。都市部だけでもパッとわかれば助かります。そこでLINEに店舗名を打つと駐車場台数を返してくれる簡単なBotを作成しました。

# 完成品（動画は試作段階）

A：店舗名、東京：住所、３８台：駐車台数を表しています。
<blockquote class="twitter-tweet" data-media-max-width="560"><p lang="zxx" dir="ltr"><a href="https://t.co/wZGAhKXivt">pic.twitter.com/wZGAhKXivt</a></p>&mdash; ミヤタツ (@miyatatu0204) <a href="https://twitter.com/miyatatu0204/status/1746078336877760804?ref_src=twsrc%5Etfw">January 13, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


入力した文字が戻ってきたときは、夕方に自転車で習い事にいった娘が家に帰ってきた時くらいホッとしました。迷子になることが多かった。




# 使用ツール
・Make
・LINE Develpoers
・SSSAPI
・Googleスプレッドシート

# Makeのシナリオ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/713a634e-557d-4491-fcdd-5af8d3102823.png)
全体像はこのようになりました。
HTTPモジュールにSSSAPIのURLを貼り付けてJSONモジュールで取り出します。

### 失敗例①
HTTPに、Query StringのNameに入力する文字がわからず、フリーズ。
filterと店舗名、店舗名とexactの間の＿の記号は、よく見ると＿　＿と２つあり、罠発見。
手打ちするのは、注意が必要でした。コピーで添付が確実な方法。

### モジュール設定（HTTP）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/93a5a834-0b00-9481-0176-8cf3666e1e93.png)

### SSSAPIのインストール
この暗号を読み解くのは初心者には難しいところ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/99f8b921-0e2a-2c24-7333-8cfcbd7fdb7a.png)

### Googleスプレッドシート
Googleスプレッドシートに抽出したいデータを入力しておく
下の図は最初のAPI化した中身（スプレッドシートの情報は変更してます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/14de6440-2349-96f3-620a-865a48ffb09d.png)
### 失敗例②
データの抽出ができず全ての打ち込んだ情報が長文で出てきた。
いろいろな店舗の情報をスプレッドシートに入力して店舗名で
抽出しようとしたが、できない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/3e1b22e2-3807-0590-4ecb-d605287a576c.png)
A店のみの情報に変更し再度API化する

### モジュール設定（JSON）


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/37913f07-cb0a-ca36-0da0-6feef9ce6c55.png)

### 失敗例③
JSON　stringが出てこず苦戦する。
JSONのモジュール化も選択ミスでうまく機能せず
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/6ceafa9b-518b-e978-7be6-eacb083749e1.png)
JSONでもParse　JSONでないと反応しない　（Create JSON使って間違えた）
英語と専門用語の情報を私の頭で理解できない。
携帯でGoogleレンズを多用しました。

### モジュール設定（LINE）
LINEのSend a　Reply　Messageのtextの指定するのにも時間がかかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3654366/483b83bf-8a00-fc54-ce95-19b29c752aeb.png)

# 振り返り

### 【結果】  
①店舗名②住所③駐車台数の表示をさせることができた。が、全然使えない。
　情報が少なくわかりにくい。
### 【課題】
①複数店舗の検索ができない　　②住所の番地と駐車台数が重なる
③コインパーキング地図の画像が添付できてない
④料金表の画像が添付できてない

### 【登録したかった情報】
①店舗名②住所③駐車台数④コインパーキング⑤パーキングの料金表
### 次は、より便利なものを作りたい
結晶構造を知財用に作図する方法

# 目的
知財の図に結晶構造を使用する場合、グレースケールかつシンプルな図にする必要があります。VESTAだと適さない場合があるので簡単に変換する方法を備忘録として記しておきます。

## VESTAでの処理
まずVESTAで結晶構造を表示し、Objects > Properties > Atoms でウィンドウを表示します。
MaterialのSpecularで黒色を選択し、Shininessを1にします。
Bondsタブでも同様の操作を行います。

適用すると、光沢が無くなった以下のような構造が得られます。

<img width="250" alt="vesta" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334977/6c95d4fb-086a-404e-5e70-550ad5a76ec0.png">

この状態で画面キャプチャ等で保存します。

## エッジ抽出
この画像ファイルを用いてエッジ抽出をすればグレースケールかつシンプルな図に変換できます。何を使っても良いですが、opencvを使うと以下のように変換できます。

```python
import cv2
import matplotlib.pyplot as plt
import numpy as np


image = cv2.imread("vesta.png")

edges = cv2.Canny(image, 50, 200)
kernel = np.ones((3, 3), np.uint8)
edges = cv2.dilate(edges, kernel, iterations=1)

result = np.zeros_like(image)
result[edges > 0] = 0
result[edges == 0] = 255

fig = plt.figure(figsize=(10, 10))
plt.imshow(result, cmap="gray")
```
`Canny`のパラメータは適宜変更してください。変換後は以下のような図になります。

<img width="250" alt="edge" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/334977/3ec8f2ae-f723-0581-f195-f3f95a234798.png">

これに適当にラベルを振れば知財でも使いやすい結晶構造の図が取得できます。
AtCoder Heuristic Contest 028 参加記

# バグで4時間溶かしました

# 追記
-  バグが治ってもそんなに点数はなかった

# 原因
- 問題の理解度が浅い
    - 入力文字数を減らすのが最優先としていたがコストに目を向けるべきだった
    - 文字列のならびかえは焼き鈍しやビームサーチを使う事で解決するべきだった

# まとめ
- 短期ヒューリスティックは最初の方針を間違えると終わる
NotionAPIを使用して、Next.js(TS)でブログを作成してみた。


NotionAPIを使用してブログアプリを開発してみました。

実際のブログは、[NaoBlog](https://naomina.com)から確認ができます。

ソースコードは、[GitHub](https://github.com/naomina121/naomina)から。

## 仕様

- Notionで作成した記事をNext.js(TS)に反映
- お問い合わせをNotionAPIを使用してNotionでメッセージの管理
- タグ、カテゴリー機能
- 検索機能
- 日本語対応のパンくず表示
- 記事のシェアボタン
- 目次機能
- OGP対応
- ブログカード(外部リンクの情報を引っ張ってくる)
- 記事が更新されたらページを自動でリロードする機能追加

### Notionブロック対応

```
'heading_2',
'heading_3',
'image',
'paragraph',
'code',
'bulleted_list_item',
'numbered_list_item',
'quote',
'table',
'table_row',
'video',
'embed',
'callout',
'divider',
```

ブログの方にて、詳しい仕様の方を載せています。

[NotionをCMSにしてNext.jsとTSでブログを作成した。](https://naomina.com/study/programming/notion-blog)

## なぜ、作ったのか。

[2023年に誰よりも早くに本気のBlogを作ったよ](https://zenn.dev/nbr41to/articles/474df7540c475c)のブログに影響を受けて、早々に自分もブログを作りたくなったからです。

未経験である私は、エンジニアになるための勉強として、必須のTypeScriptを学ぶ必要があり、Reactに興味を抱いていた私は、Udemyの講座から[【NotionをCMSに】NotionAPI + Next.js + TypeScript でブログ開発〜デプロイまで](https://www.udemy.com/course/notion-next-blog/)を購入し勉強しました。

こちらの講座はとてもわかりやすかったのですが、ライブラリを入れないといけないというところが気になって、自作関数にて対応できないかと試行錯誤しました。

かゆいところまで手が届けるような機能が欲しかったのです。

そこで、勉強したことが自信につながり、新しいことに挑戦する勇気が出ました。

## 今後について

勉強したことなどをアウトプットしたり、挑戦したことを書いていければと思っています。

ぜひとも、ブログを見ていただけますと幸いです。
GraphQL error: Variable 'hoge' has coerced Null value for NonNull type 'hoge!'

# 環境
* NodeJS
* ローカル環境
* AWSAppSyncClient利用

# 事象
AWSAppSyncClient.mutate実行時に掲題のエラーが出る。

# 原因
GraphQLのmutation queryの引数名が一致していなかった。

# 対応
* input, conditionの文言は変えないで統一
  * graphql側のinput, conditionという引数名は統一
  * NodeJS(呼び出し側）のinput, conditionも統一

# 対応後のイメージ
```graphql

type Mutation {
  updateHoge(input: UpdateHogeInput!, 
  condition: ModelHogeConditionInput): Hoge 
  @aws_api_key @aws_iam @aws_cognito_user_pools
}
```

```javascript
const updateHoge =/* GraphQL */ `mutation Hoge(
    $condition: ModelHogeConditionInput
    $input: UpdateHogeInput!
){
    updateHoge(condition: $condition,
        input: $input){
        id
    }
}
`
```

```javascript
async function disableHoge(updateHogeInput: UpdateHogeInput, updateTargetFieldValue:any) {
    return await client.mutate<Hoge>({
        mutation: gql(updateHoge),
        variables: {
            condition: {
                hogehoge: {eq: updateHogeInput.hogehoge} as ModelStringInput
            },
            input: {
                ...updateHogeInput,
                updateTargetField: updateTargetFieldValue
            }
        }
    })
}
```
Azure Stack HCIのシングルノードを作る

 # はじめに
今回は、Azure Stack HCIのシングルノードを作成したよ！という結果の報告のみです。

手順などは改めて説明しようと思いますが需要あるん？　なので、今回は自粛..
どうやったの？って質問あれば回答していきます。
 
 ## 参考したサイト

https://www.dell.com/support/manuals/ja-jp/ax-640/ashci_h19404_single-node_deployment

https://www.hpe.com/psnow/doc/a50004375enw

↑今回の検証ではほぼ参考としてない・・

https://learn.microsoft.com/en-us/azure-stack/hci/concepts/single-server-clusters

https://learn.microsoft.com/en-us/answers/questions/1432109/azure-stack-hci-unable-to-create-volume-on-single

↑同じ現象でもあったので、参考とした（自分はHDDだけだったので、ちょっと違うがNestにするということで問題を解決できた　thx)

## 構成/環境

利用したサーバーは　"ProLiant MicroServer Gen10 Plus"
 >DISK: HDD(1TB) x4
 >USB: 32GB(OS領域:Azure Stack HCI OS)
 >NIC: NIC(1GB) x4 [I350 Gigabit Network Connection]
 >OS: Azure Stack HCI OS [AzureStackHCI_20349.1607_en-us]

**
最初は上記に強引にSSD 2本 , HDD 2本に差し替えてました。
(SSD搭載できないでしょ？　って思うでしょ？　まぁ、できなくはない・・w)

ただ、ASHを作成する中でCapacityドライブが4本必要という警告があがり、
HDD4本に戻しました。
といえ、結果的に実はSSD 2本、 HDD 2本でも構成できちゃいましたし、
HDD４本で構成した時とほぼ一緒だったのいうのが結果論です。

ブート領域は4本から利用する訳にもいかないので、USBにAzure Stack HCIを導入としてます。
起動しちゃえば別に動きます
**


#### 出来上がった状態

ボリュームはNestで作成しました。
(SSD 4本だったら多分普通にできたと思うけど、HDDだけで作ったので苦肉？ですかね)

```
New-StorageTier -StoragePoolFriendlyName S2D* -FriendlyName NestedMirrorOnHDD -ResiliencySettingName Mirror -MediaType HDD -NumberOfDataCopies 2
```
```
New-Volume -StoragePoolFriendlyName *s2d* -FriendlyName Volume01 -StorageTierFriendlyNames NestedMirrorOnHDD -StorageTierSizes 200GB
```


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670364/ee597f4e-f8d9-a260-11b7-84824baf957a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670364/86f8f329-c5f1-1ba9-a24a-e88e62bbd798.png)
*HDDは使ってないHDDを集めたもので、同じではない（でも、動く）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670364/311bfad2-7d78-5e1b-2238-f23f671481eb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3670364/c63bacfc-7ad7-35a9-577a-b69e8bd02a84.png)

FAT32(212MB): (Reserved領域)
C: USBフラッシュメモリ 32GB
D:別でもう一つ内部のUSBポートに指しているUSBフラッシュ[未フォーマット] (ESXiブート用で使おうと思ってさしてるだけ [まだ内部のHDD(/SSD)にインストールせずUSBブートでOS切り替えて遊んでる状態)
volume01:Nestで作ったボリューム200GB
ClusterPerformanceHistory: 略


# 結論
Azure Stack HCIはSingle nodeができるので、検証程度だったら物理は多分なんでもいける気がする!?

普段やっている検証はNest環境(VMware上などにAzure Stack HCI OSを展開して)の2ノード、3ノードなどを作って検証することが多いです。ただ、物理だとどうなんだろ？っていう興味本位での今回検証でした。もちろんゲストの導入もしてみました。


*Media TypeをHDDからSSDにごまかすとかそういうのはもう、以前から試していた内容ですが、もちろんこのやり方ではダメです。　一応、物理環境でも試してみたけどダメでした・・(^^; 

※注意:今回の検証は個人で楽しむためであるので、無論,本番はダメですよ(やらんか・・)


## 次回に向けて
SSD 4本だと？？というのはまだ試してないので、SSD揃えられた検証はしてみますが、手順云々というより、"ボリューム作成時"　という特定の検証/確認程度のレベルなので面白くないかも。。

後、ちゃんとした現行のサーバー(??)をほんと久々に手にしてみたので、改めてサーバーで検証してみた？というのを取り上げていきたい気持ち。
仮想上ばかりでずっと検証してきたので、物理サーバーはワクワク・・

さぁ！物理サーバーという基本から立ち向かうのだ！！


--最後に今、気になること--
Network Engineer Simulator
　　ん～～～～～～～～～～　気になるwww

https://store.steampowered.com/app/2640920/Network_Engineer_Simulator/
IBMCloud環境へSSL VPN接続する方法がうまくできないとき

前回IBM Cloud上のサーバー(Virtual Server for Classic)を構築後、SSL-VPN接続をする手順を記載しました。
[IBMCloud環境へSSL VPN接続する方法](https://qiita.com/AlmondTofu/items/77c24094373865eb3676#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%9F%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6ssl-vpn%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E)

このSSL-VPNですが、うまくいかないことが結構よくあります。
この記事では、対処策を記載いたします。

## 前提
・サーバー(Virtual Server for Classic)は用意済み
・SSL VPNしたいユーザーは用意済み
・SSL VPNしたいユーザーのPCはwindows11環境(windows10でも同様です)
・既にMotion Pro のインストール済み

## よくある事例①　接続に失敗する
Motion Proを起動して接続しても、接続中のステータスから接続に失敗してしまうことがあります。（特に東京のエンドポイントに対して接続する場合、失敗するケースが多い）
これは「エンドポイント側の障害」や「エンドポイントが混みあっている関係で接続できない」といった事象の可能性があります。
特に東京リージョンは混雑しているため、日中帯はつながらないことが多いです。

この際は、接続先のエンドポイントを変更してみてください。

以下リンクにVPNエンドポイント一覧がありますので、この中から比較的近い拠点(アジア / 太平洋など)を選んで再トライしてみてください。
https://cloud.ibm.com/docs/iaas-vpn?topic=iaas-vpn-available-vpn-endpoints

個人的には「シドニー」がおすすめです

## よくある事例①　エンドポイントが廃止された
稀なケースですが、IBM側でエンドポイントの廃止をすることもあります。
この場合も接続先一覧から利用可能なエンドポイントを選択して接続しましょう。
廃止の場合はきちんとIBMからアナウンスがありますので、アナウンスは見逃さないようにしましょう。

## よくある事例③　権限不足
ユーザー名・パスワードが正しいにもかかわらず以下のエラーが出る場合は、該当ユーザーへのVPN権限が付与されていない可能性があります。
```
Your attempt to sign in failed. Please make sure that your username and password are correct, and try again.
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969669/bf3c5cdd-0e6e-0057-44bd-55e63a82ead2.png)

この場合はアカウント管理者に連絡し、権限を確認してもらいましょう
[参考記事　IBMCloud環境へSSL VPN接続する方法　①ログインしたいユーザーに対して、SSL VPNの権限を付与](https://qiita.com/AlmondTofu/items/77c24094373865eb3676#%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%81%97%E3%81%9F%E3%81%84%E3%83%A6%E3%83%BC%E3%82%B6%E3%83%BC%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6ssl-vpn%E3%81%AE%E6%A8%A9%E9%99%90%E3%82%92%E4%BB%98%E4%B8%8E)

## よくある事例④　クライアントアプリのバージョンが古い
以下のエラーが突然でて、一切つながらなくなるというケースがあります。
以前自分の端末にて個の事象が発生したときはクライアントアプリが古くなって接続エラーとなっていました。
```
MotionProクライアントがSSLコネクション経由でデータの受信に失敗しました。ネットワーク状態を確認してください。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2969669/067c2ec2-45f3-cd75-4a63-0de51ed261f7.png)

この場合は、Motion Proのバージョンを更新します。
一度クライアントアプリをwindowsの「アプリと機能」からアンインストールし、最新版をインストールします。
※プロファイルはアンインストール前にエクスポートしておき、最新のインストール語にインポートすることをオススメします

↓クライアントアプリインストール先
https://support.arraynetworks.net/prx/001/http/supportportal.arraynetworks.net/downloads/downloads.html

## その他
正直①の接続に失敗するケースがひどすぎるので、IBM Cloudには頑張ってほしいところ、、、
chef-client と inspec のログ収集方法メモ

`chef-client` と `inspec` のログ収集方法のメモ。

## Chef Infra Client


### Linux

```
chef-client --log_level trace 2>&1 | tee -a $(hostname)-chef-client-trace-$(date -u +"%Y-%m-%dT%H:%M:%SZ").log
```
 
Versions 13.x以前の場合：

```
chef-client --log_level debug 2>&1 | tee -a $(hostname)-chef-client-debug-$(date -u +"%Y-%m-%dT%H:%M:%SZ").log
```



### Windows

```
chef-client --log-level trace --logfile .\chef-client-trace.log
```

Versions 13.x以前の場合：

```
chef-client --log-level debug --logfile .\chef-client-debug.log
```



 
## Chef InSpec

```
inspec --log-level=debug --diagnose 2>&1 | tee -a $(hostname)-inspec-debug-$(date -u +"%Y-%m-%dT%H:%M:%SZ").log
```

## 技術サポート問い合わせ

ChefやInSpecの技術サポート・コンサルに関するお問い合わせは、こちらから。

www.chef-sec.com
AWS LightsailでのLaravelスケジュール設定（Cron）

## 初めに
AWS Lightsailでサーバーを立ち上げ、Laravelを乗っけました。
その際にcronを使用してLaravelスケジュール機能を使用できるように設定しました。
結論、PHPのdeirectoryがポイントでした。

## 環境
| 開発環境   |バージョン    |
|-----------|------------|
| __Laravel__ | 10.1.5 |
| __Apache__ | 2.4.57 |

## 手順
__１、cronにコマンドを設定する。__
__２、動作確認する。__

## 1, cronにコマンドを設定する
コマンドをcronに設定します。
※LaravelはすでにLightsailのサーバーに搭載している前提で進めております。

cronを編集する
```terminal:
$cd crontab -e
```

cronにコマンドを設置する。
```terminal:cron
* * * * * cd /home/bitnami/htdocs/project-name && /opt/bitnami/php/bin/php artisan schedule:run >> /tmp/cron_output.
log 2>&1
```

設置できているか確認する。
```terminal:
$cd crontab -l
```

cronサービスを再起動する。
```terminal:
$sudo service cron restart
or
$sudo systemctl restart cron
```	

## 2, 動作確認する
ファイルに出力されているかを確認する。
```terminal:
$cat /tmp/cron_output.log
or
$tail -f /tmp/cron_output.log
```
何かしら出力されていれば動作確認 OK。
あとはログを確認して異常があれば対応する。

## 最後に
こちらも参考になりますのでご覧ください。

https://qiita.com/fuku_rin/items/546494332e666482a9eb

https://qiita.com/fuku_rin/items/ac0b01c91baa43b71256

最後まで閲覧いただきありがとうございました。
ご意見、ご指摘ありましたら、コメントお願いいたします。