OmniAICreator/Qiita-1.07M huggingface dataset:
zshのPATHをイジったので、まとめる

MacBookを買い替えました。
PATHをキレイに美しくしたいと思い、PATHをイジりました。
私は初心者なので、マシンのことを奥深くは理解できておりませんが、
私の経験と推測を元に記述します。

自分のshellを確認するコマンド
-
```
echo $SHELL
```


自分のPATHを確認するコマンド
-
```
echo $PATH
```


".zprofile"と".zshrc"はどこにあるか？
-
```
/Users/<ユーザー名>
```


".zshrc"を編集するには
-

#### Part1
```terminal
open ~/.zshrc
```
で".zshrc"をテキストエディタで開きます。

#### Part2
なるべく".zshrc"の一番最後に、追加したいPATHを以下のように書きます。
```.zshrc
export PATH=<追加したい絶対PATH>:$PATH
```

#### Part3
".zshrc"の編集が終わったら、command+Sで保存します。

#### Part4
```terminal
source ~/.zshrc
```
で書き込んだPATHを反映させます。

#### Part5
terminalを再起動させます。

#### Part6
```
echo $PATH
```
でPATHを確認します。

#### Part7
なかなか1度で上手く行くことはまれなので、根気よくやりましょう。


".zshrc"編集の注意点
-
###### 注意点1
編集する前に".zshrc"の内容をメモ帳などにコピペしましょう。

###### 注意点2
消したいPATHをいきなり消さず、まずは
```.zshrc
# export PATH=<消去したい絶対PATH>:$PATH
```
のようにコメントアウトして、徐々に試しましょう。

###### 注意点3
".zprofile"はイジらない方が良いと、私は結論を出しました。
一度、".zprofile"を白紙にしたら、PATHがすごいことになりました。

使ったterminalコマンド
-

| コマンド | 意味 |
|---|---|
|pwd|現在地を表示|
|ls|隠しフォルダとファイル以外を表示|
|ls -a|隠しフォルダとファイルも表示|
|cd <行きたいディレクトリ>|<行きたいディレクトリ>に移動|
|cd ..|一つ上のディレクトリに移動|
|cd //|一番上の階層に移動|

最後に
-

PATHの編集はなかなか難しいです。
健闘を祈る。





蛇足(推測)
-
例えば、
```.zprofile
export PATH=/usr/local/bin:PATH
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH
```
```.zshrc
export PATH=<絶対PATH1>:$PATH
export PATH=<絶対PATH2>:$PATH
export PATH=<絶対PATH3>:$PATH
```
と書いた場合、
```
echo $PATH
```
を実行すると、
```
<絶対PATH3>:<絶対PATH2>:<絶対PATH1>:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:PATH
```
のように表示されます。

つまり、
".zprofile"の1行目の
```
export PATH=/usr/local/bin:PATH
```
が
```
echo $PATH
```
の最後尾に記述されます。
".zprofile"の2行目の
```
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH
```
の
```
$PATH
```
部分が1行目の
```
/usr/local/bin:PATH
```
相当すると思われます。
だから、もし、ここまででだけで
```
echo $PATH
```
を実行できたら
```
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:PATH
```
となるでしょう。
1行目のPATHに2行目のPATHを被せたようにみえますね。
次に、
```
echo $PATH
```
に表示されるのは".zshrc"の内容です。
まず、
```
export PATH=<絶対PATH1>:$PATH
```
です。
だから、もし、ここまででだけで
```
echo $PATH
```
を実行できたら
```
<絶対PATH1>:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:PATH
```
次に、
```
export PATH=<絶対PATH2>:$PATH
```
です。
だから、もし、ここまででだけで
```
echo $PATH
```
を実行できたら、
```
<絶対PATH2>:<絶対PATH1>:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:PATH
```
となるでしょう。
最後に
```
export PATH=<絶対PATH3>:$PATH
```
です。
```
echo $PATH
```
の結果は、最初にお伝えした通り
```
<絶対PATH3>:<絶対PATH2>:<絶対PATH1>:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:PATH
```
となります。

結論、
PCは最初に".zprofile"を上から下へ読み込み、
次に、
".zshrc"を上から下へ読み込んでいるのではないかという推測できます。

蛇足2(推測)
-
先ほどのzprofileにもう一度いただこう。
```.zprofile
export PATH=/usr/local/bin:PATH
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH
```
もし、これを以下のように一行目をコメントアウトする。
```.zprofile
# export PATH=/usr/local/bin:PATH
export PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH
```
これを反映したのち、
```
echo $PATH
```
を実行すると、まったく見覚えがない長いPATHが登場する。
この長いPATHはどこのファイルに記述されているかというと
```
/etc/paths
/etc/paths.d/10-cyrptex
```
に記述されているようだ。

このことより、
zprolfileの一行目の最後に記述されている"PATH"は、先ほど紹介した"paths","10-cyrptex"にあたるのではないかと推測ができる。
また、
zprofileの二行目の最後に記述されている"$PATH"は、それ以前記述されたPATHを表していると思われる。
dotnet8にしたときに Method not found: 'Void Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping.…とかでる

## dotnet8にアップグレードしたときにServer側で起こった

```
Method not found: 'Void Microsoft.EntityFrameworkCore.Storage.RelationalTypeMapping.
```

とか出てきた。
どうやらEFまわりみたい。ググってみたが、PGとかmysqlとかの情報ばかりだった。
（例えば：https://github.com/npgsql/efcore.pg/issues/2811 ）

## 自分の環境ではこうして解決した
なぜかsql serverのパッケージが入っていなかった。

``` xml:server.csproj
    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.2" />
```

を追加すれば解決した。

バージョンアップまわりはこういうのが起こるとつらい…
AWS TokyoリージョンのDatabricksでサーバレスSQLウェアハウスを使おうとして設定ミスしていた話

Databricks データインテリジェントプラットフォームについて、AWS TokyoリージョンでもサーバレスSQLウェアハウス機能が利用できるようになりました！

詳しくは以下をご覧ください。

https://qiita.com/taka_yayoi/items/01b6bd58a06c85b29c56

Azure Databricksだと昨年後半から既に東京リージョンで利用可能になっていたのですが、数カ月遅れでAWSの東京リージョンでも利用可能になりました。
Databricks(AWS)ユーザとして、待ちに待っていた機能です。

Databricksでは、従来のウェアハウス機能だとウェアハウス(いわゆる計算用インスタンス)起動に数分かかるため、競合のサービスと比べると使い勝手の面で厳しいと感じていたのですが、これでオンデマンドでのデータウェアハウス利用を加速させることができます。
コストの最適化も進んで有難い限り。

<br>

というわけで早速設定だ！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/fb82ca1f-3ba0-1d96-7b54-2da1bdf88863.png)

ちゃんとタイプにサーバレスが出てる！

しかも、サーバレスの場合、自動停止期間を最小5分に設定できます。
それ以外のタイプだと最小停止時間が10分だったので、利用が無い時の終了が短時間で行え、なおさらお財布に優しい設定ができます。

よし、起動！実際に数秒でスピンアップするか見てみよう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/360cbf7c-fe31-592a-38bd-1eeb2d55427e.png)

<br>

**。。。おん？**

<br>

というわけで起動失敗しました。

理由はエラーメッセージに記載されているように、インスタンスプロファイルとして設定しているAWS IAM Roleに必要なtrust relationship(信頼関係)が設定されていないためです。
以下のドキュメントに設定手順等記載されています。

https://docs.databricks.com/en/compute/sql-warehouse/data-access-configuration.html#aws-instance-profile-setup

一部を切り出して言えば、以下のようなステートメントをIAM roleの信頼関係に追加する必要があります。
（\<YOUR-WORKSPACE-ID\>部分は自分のワークスペースIDに変更してください）

```json
{
"Effect": "Allow",
"Principal": {
  "AWS": [
    "arn:aws:iam::790110701330:role/serverless-customer-resource-role"
  ]
},
"Action": "sts:AssumeRole",
"Condition": {
  "StringEquals": {
      "sts:ExternalId": [
        "databricks-serverless-<YOUR-WORKSPACE-ID1>",
        "databricks-serverless-<YOUR-WORKSPACE-ID2>"
      ]
    }
  }
}
```


ちなみに、管理者しか設定を見れませんが、SQLウェアハウスのインスタンスプロファイル設定欄において、適切な権限が無い旨のエラーメッセージが出るようになっていました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/c3ae6372-6dce-1c49-2118-dbadd5747196.png)

というわけで、これからAWS DatabricksでサーバレスSQLウェアハウス機能を利用される方は、インスタンスプロファイルに設定しているAWS IAM Roleの設定を今一度見直しましょう。
（Docを見るに、2022年6月24日以降にAWSクイックスタート機能を使って作成したインスタンスプロファイルについては、既に設定されているようかもしれないようです）

<br>

ちなみに、インスタンスプロファイルを未設定(None)に変更すると起動自体はできるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168727/a9644c1d-748a-96d4-11bc-e0080f581fa1.png)

ただ、ストレージへのアクセスが制限されるケースが多いと思いますので、ちゃんとIAM roleの設定を見直しましょう。

※　サーバレスSQLウェアハウス、体感5秒程度でスピンアップしました。いいですねー。
※　今後、DB SQLの学び直しをしてみようと思います。
数式での正規表現について

## 数式でパラメタ付きURLの判断を行うときに、クエスチョンマーク（?）を判断するには
エスケープ文字は2回書く必要がある。「\\\\?」

``` REGEX
REGEX(fieldName, '^[http://www.somedomain.com/sitename]\\?[someparam=xxx]')
```
【マイグレーションファイル】削除の方法【rails】

マイグレーションの削除で６時間ほどかかってしまったため今後の備忘録として。

DBeaver にテーブルが登録されないため
一度手動で消してしまったのが運の尽き。

ＶSコードのマイグレーションは難なく消去できたがDBeaver 内は外部キーがあったせいで削除できず。:skull:


しかし解決策として
・マイグレーションファイルの順序を変更
・NO FILEの解消
が解決策として有効だと学んだ

マイグレーションファイルの順序として
**メイン、親となるものが先にくることが判明**

例えば
```ruby
class CreateOrders < ActiveRecord::Migration[7.0]
  def change
    create_table :orders do |t|
      t.references :item_id,  null: false, foreign_key: true
      t.references :user_id,  null: false, foreign_key: true
      t.timestamps
    end
  end
end

```
```ruby

class CreateAddresses < ActiveRecord::Migration[7.0]
  def change
    create_table :addresses do |t|
      t.string :zip_code,                                    null: false
      t.integer :region_of_shipping_origin_id,            null: false
      t.string :city,                                        null: false
      t.string :street_address,                              null: false
      t.string :apartment_name,                              null: false
      t.string :tel,                                         null: false
      t.references :order,                                   null: false, foreign_key: true
      t.timestamps
    end
  end
end
```

orderのreferenceとなっているため
orderが先に来るらしい


ーー次にNO FILEの解消方法ーー

```ruby
 Status   Migration ID    Migration Name
--------------------------------------------------
   up     20240119065421  Devise create users
   up     20240206035300  Create active storage tablesactive storage
   up     20240206055210  Create items
   up     20240227022924  ********** NO FILE **********
   up     20240227023037  Create addresses
  down    20240229011710  Create orders
```

まず削除したmigrantionIＤの名前で再度ファイルをマイグレーション内に作る
ファイル内に
```ruby
class CreateOrders < ActiveRecord::Migration
  def change
  end
end

```
としていたがロールバックできず。
原因は
```ruby
class CreateOrders < ActiveRecord::Migration[7.0]
  def change
  end
end
```

の**7.0**がなかったことが原因でした

その後

```ruby
 rails db:rollback
```
の後、ＶSコード内migration内の該当するファイルを今度こそ手動で削除して完了！！

自己満かつ備忘録なので分かりにくいかと思いますがそこはご愛敬で:relaxed:
lambda関数の基本概念と利用シーン



## はじめに
こちらはlambda関数に関しての備忘録。

## 🦁<INS>**結論**</INS>🦁
lambda関数は、小規模な匿名関数を一行で定義するための構文。

lambda 引数 : 処理 （引数）
```py
lambda x: x + 1
```


:::note info
押さえておくべき点
* 短い処理に使うことでコードの可読性が向上。
* ちょっとした処理を加えたい時に使われる関数。
* 引数は複数指定可能。
:::  
***

:::note warn
利用シーン
* 他の関数の引数として直接記述する場合に有用
* sorted()やlist.sort()のkey引数にlambda関数を使うことがある。
* フィルタリングで使われるfilter()関数の引数として、特定の条件に基づいてリストから要素を選択するために使用されます。
* データ変換などで使われるmap()関数の引数として使用し、リストの全ての要素に対して変換を適用します。
* GUIやWebアプリケーション開発において、簡単なイベントハンドラーを定義するのに利用される。
:::  
***

:::note alert
注意点
*  例外処理はできない。
* 条件分岐などはできない。
:::  

***

## <INS>**Lambda関数をよく使う場面一覧**</INS>

## <INS>**リストの要素を変換する**</INS>
map()関数とlambdaを使って、リストの各数値を2倍に。
```py
numbers = [1, 2, 3, 4, 5]
doubled_numbers = list(map(lambda x: x * 2, numbers))
```
***  

## <INS>**条件に合う要素だけを選ぶ**</INS>
filter()関数とlambdaを使って、リストから偶数だけを選び出せる。
```py
numbers = [1, 2, 3, 4, 5, 6]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
```
***  

## <INS>**一時的な小規模計算**</INS>
2つの数を引数として受け取り、その和を計算する一時的なlambda関数。
```py
result = (lambda x, y: x + y)(5, 3)
```
***  

## <INS>**複数のリストを同時に処理**</INS>
namesとagesをzip関数で結合して、それをsorted関数で年齢に基づいてソートする。

```py
# 複数のリストを組み合わせて処理する正しい例
names = ['John', 'Diana', 'Alex']
ages = [30, 35, 25]

people = zip(names, ages)  # namesとagesを組み合わせる
sorted_people = sorted(people, key=lambda x: x[1])  # 年齢でソートする
```
zipによって(‘John’, 30)このタプルが出来上がる。
lambda x: x[1]の引数x[1]はタプルの２番目（0が１番目）を選択してる。
つまり年齢でソート（sorted（））するイメージ。
***  

## <INS>**辞書でのソート**</INS>
各人物の年齢('age')に基づいてソート。
key()→ソートの基準とする部分を選択
```py
# 年齢で人々をソートする
people = [{'name': 'John', 'age': 45}, {'name': 'Diana', 'age': 35}, {'name': 'Alex', 'age': 25}]
sorted_people = sorted(people, key=lambda x: x['age'])

```
***  

## まとめ✍️
Lambdaは上級者のテクニックみたいなものみたいなイメージだったが、そうではなく、意味ある使い方をしてないと意味ないなと感じた。
どんな時に使うべきなのかをより深めて、可読性の観点からも選択をできるようにしていく。
[Mac]シェルスクリプトで、特定の文字列があるかをフォルダの配下の全ファイルに対して再帰的に検索したい[Terminal]

### 解決法

`grep -r "targetstring" .` <- 最後の`.`を忘れずに。

### 例

`grep -r "hogehoge" .`

これで、どのファイルにターゲットの文字列が含まれるかが全て表示される。

### 参考

[Search for string recursively in all files and folders](https://www.garron.me/en/bits/find-string-recursively-in-all-files-linux-mac-grep.html)
ZED SDKを使いこなす point_cloud

ZED SDK の使い方が覚えきれていないのでメモを残す。
ZED SDK はStereoLabs がZED2やZED Xなどのステレオカメラ用に提供しているSDKである。

## point cloud に関する公式のドキュメント
https://www.stereolabs.com/docs/depth-sensing/using-depth#getting-point-cloud-data


## 前提
ZED SDK 4.0

## コードの断片

### color 付きの点群を取得したいとき
```.py:
point_cloud = sl.Mat() # まずは、データ構造の初期化
# 次の行で値が取得される。
zed.retrieve_measure(point_cloud, sl.MEASURE.XYZRGBA)
# xyz_rgba はnumpy のdtype=np.float32 のデータ形式になる。
xyz_rgba = point_cloud.get_data()
```
奥行きがZである。
カメラから遠くなるほど、マイナスの値が大きくなることに注意。
(ただし、IMUを使って座標変換をしたあとの奥行きである。)

xyz_rgba[:, :, 0]　はx座標
xyz_rgba[:, :, 1]　はy座標
xyz_rgba[:, :, 2]　はz座標
xyz_rgba[:, :, 3]　は(r, g, b, a) の各uint8 をfloat32のデータ形式として解釈した値が格納されている。


#### 注意：
- np.isfinite()を満たさないデータが格納されることがある。
- `runtime_parameters.enable_fill_mode = False` としたときは、必ずといってよい。



```.py:
# １画素づつアクセスすると、こうなる。
# 遅くなるので、こうする理由はない。
# (success の値は実行の成否の結果が入る。執筆時点での公式ドキュメントとは違っている。)
for i in range(h):
    for j in range(w):
        success, point3D = point_cloud.get_value(j, i)
```

## Point cloud のデータメンバー、メソッドの表示を得るには
pythonのinspectモジュールを利用すると良い。
この方法で上記のget_data()メソッドに気づいた。
(ただし、使うのを推奨しないメソッドをも表示している可能性はある。)


```.py:
for k, v in inspect.getmembers(point_cloud):
    print("point_cloud", k, v)
```

メソッドの説明は, pythonのhelpを利用する。

```.py:
get_data(memory_type=<MEM.CPU: 1>, deep_copy=False) -> 'np.array' method of pyzed.sl.Mat instance
    Mat.get_data(self, memory_type=MEM.CPU, deep_copy=False) -> np.array

get_value(x: 'int', y: 'int', memory_type=<MEM.CPU: 1>) -> 'ERROR_CODE' method of pyzed.sl.Mat instance
    Mat.get_value(self, int x: int, int y: int, memory_type=MEM.CPU) -> ERROR_CODE
```

## ply ファイルを出力する。
point_cloud のインスタンスにはwrite()メソッドがある。
point_cloud.write("sample.ply")


## float32のRGBAをnp.uint8のnumpy array に変換するには
[float32のrgbaデータをuint8に変換する](https://qiita.com/nonbiri15/items/2e0b82fe8f0513e16d26)
を参照してください。

## point_cloudのメソッド

```.py:
point_cloud.get_height()
point_cloud.get_width()
```
過去問の類題をChatGPT-3.5先生に聞きました。「北海道大学2024年前期文系第１問 」

[前へ](https://qiita.com/mrrclb48z/items/9367d6606660284464fd)

# 過去問の類題をChatGPT-3.5先生に聞きました。
・最終行に追加です。
・聞き方を工夫しても無理かもしれません。
・他のAIで、データベースをもっているAIは、ありますか？
・私は、google検索と同じ事をしていますか？
```
(1)自然数m,nについて、2^m・3^nの正の約数の個数を求めよ.
(2)6912の正の約数のうち、12で割り切れないものの総和を求めよ.
過去問の中から、(1)の類題の出題されたの年度と大学名を教えてください。
過去問の中から、(2)の類題の出題されたの年度と大学名を教えてください。
```
```
ChatGPT
申し訳ありませんが、特定の大学の試験問題やその出題年度に関する情報は私のデータベースには含まれていません。ただし、与えられた問題は数学の一般的な問題であり、多くの大学の入学試験や数学の競技会などで見られる可能性があります。
```
Script Debuggerの使い方

# 目次
1. はじめに
2. ブレークポイントの設定とデバッガの操作方法
3. おわりに

# 1. はじめに
みなさんこんにちは、三井情報株式会社です。

今回は、Script Debuggerの使い方についてご紹介します。
Script Debuggerとはサーバサイドのスクリプトのデバッグを行うための機能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/b5a4514f-e520-aeb7-0a5c-ca86476fadcd.png)

※Script Debuggerについての詳細情報は以下のリファレンスサイトをご参照ください。
https://docs.servicenow.com/ja-JP/bundle/vancouver-api-reference/page/script/debugging/concept/script-debugger.html

# 2. ブレークポイントの設定とデバッガの操作方法
① デバッグしたいサーバサイドスクリプトを開き、ブレークポイントを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/0c091ea4-93dd-d11f-a249-bb3c2f76f8fc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/8608b5fd-8c5e-7f1b-cae5-d83422ce16fb.png)

② Script Debuggerを起動します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/b16cd29b-aa4c-2368-1655-1665d8ea5a22.png)

③ スクリプトが実行される操作を行います。
　この例ではUIアクションなのでインシデント画面でボタン押下します。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/538d4bb9-c9be-d376-24a9-2ec82f000512.png)

④ Script Debugger上でデバッグが可能になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574077/369044ee-3613-2665-73b8-a8ca151c945c.png)
コンソールペインの詳細は[こちら](https://docs.servicenow.com/ja-JP/bundle/tokyo-application-development/page/script/debugging/task/evaluate-expressions.html)

# 3. おわりに
いかがでしたでしょうか。
Script Debuggerの使い方についてご紹介しました。
便利な機能なのでぜひ使ってみてください。

最後までお読みいただき、ありがとうございました。
Leafletで好きな色のピンを表示させたい！

# はじめに
こんにちは、私はIT学習を始めて一年未満の新人エンジニアです！
本日は、Leaflet.jsを使っている際に困った事とそれの解決策を紹介したいと思います。
Leaflet.jsには多くの機能があるのですが、今回はピンの表示方法について紹介します。

# Leafletとは
まず初めに「Leafletってなに？」という方に向けてご紹介させて貰います。
こちらはJavascriptで書かれたオープンソースの地図描写ライブラリです。
地図をWebページに統合するために使われており、無料でAPIを提供しています。
更に地図上にピン、ポップアップなどを描写する機能も提供しております。
[Leaflet.jsのホームページはこちら](https://leafletjs.com/)

# 地図を準備
leafletを使用する前に地図を表示させる必要があります。
今回はOpenStreetMapを使用して地図を表示しました。

### OpenStreetMapとは
オープンソースの地図データベースです。
このデータベースは、世界中の道路、建物、施設情報等の地理的な情報を保有しています。
データはボランティアによって収集・編集され、誰でも無料で利用できます。
様々なアプリケーションやプロジェクトでも利用されています。
[OpenStreetmapのページはこちら](https://www.openstreetmap.org/#map=5/35.588/134.380)

最初に、OpenStreetMapとLeafletの利用に必要なCSSファイル、Javascriptファイルをダウンロード又はCDNから取得します。（今回は説明を省略）
次にLeafletを使用して地図を初期化して、OpenStreetMapレイヤーを追加します。
```ruby:マップの表示
var map = L.map('map', {
    center: [35.7, 139.7],
    zoom: 17,
});

L.tileLayer('https://~~.~~.openstreetmap.org/{z}/{x}/{y}.png', {
    attribution: '© OpenStreetMap contributors'
}).addTo(map);
```

こちらによって以下のように指定の座標の地図が表示されます。
![スクリーンショット 2024-02-29 12.22.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537128/6b7501e2-440a-b874-f52c-a5de4ef62c75.png)

# ピンの表示
それでは本日のメインのお話をします。
皆さん地図上に好きなピンを好きな場所にたてたい時ってありますよね？
### 私はありました！
しかしながら、やり方がわからず困っていました。
ここでは同じ境遇の人の助けになればと思います。
私は以下の写真の様にピンを立てることができました。
![スクリーンショット 2024-02-29 12.52.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3537128/3f41e3eb-2f80-42cc-a25c-5b3b8a98bffd.png)

```ruby:ピン表示
const myCustomColor = '#ff0000';

const markerHtmlStyles = `
  background-color: ${myCustomColor};
  width: 3rem;
  height: 3rem;
  display: block;
  left: -1.5rem;
  top: -1.5rem;
  position: relative;
  border-radius: 3rem 3rem 0;
  transform: rotate(45deg);
  border: 1px solid #FFFFFF;`

const icon = L.divIcon({
    className: "my-custom-pin",
    iconAnchor: [0, 24],
    labelAnchor: [-6, 0],
    popupAnchor: [0, -36],
    html: `<span style="${markerHtmlStyles}"></span>`
});

// 特定の座標を指定
var pinCoordinates = [緯度, 経度];

// ピンを地図上に配置
L.marker(pinCoordinates, { icon: icon }).addTo(map);

```
const myCustomColor内の色コードを変更することで好きな色に変更できます。

# まとめ
以上で、Leafletを使って好みの色のピンを表示することができました。
ピンを表示する方法は多くあるのですが、希望の色のピンを表示する方法はあまりありません。
こちらの記事が同じ悩みを持つ方の助けになれば嬉しいです。
AWS CLF（クラウドプラクティショナー）合格体験記

## なぜ取得したか
いずれ取得しようと思っていたところ、新入社員が研修で取得していたため、**ヤベェ**と思い取得に向かった。
なお、当方の業務によるAWS経験は無し。

## CLF（クラウドプラクティショナー）試験に対する所感
AWSのサービスに関する問題が網羅的に出題される。
範囲がとにかく広いが浅いため、とにかく浅く広く手を付けて学習する必要がある。
基本情報を取得していて、インフラエンジニアとして3年以上勤務している下地があってのことだとは思うが、AWSのサービス名と一般的な呼称を紐づけて覚えれば難しくはないと感じた。
ただし、クラウドだからこその単語やサービスはしっかりと覚える必要がある。
試験終了時に、即合否が分かる仕様はとても良いと感じた。

## 勉強方法
Udemyの講座動画を見る
Ping-tでSAA（ソリューションアーキテクトアソシエイト）の問題を解く
AWS認定資格 無料WEB問題集＆徹底解説 で問題を解く

## 勉強時間
合計で大体20時間ほど。
実質的な勉強はUdemyの動画を見たくらい。
問題はそれぞれの問題集を半分くらいずつ解いたに留まる。
合格はラインスレスレであったので、もう少し勉強しておいたほうが良かったかな、と感じた。

## 今後
次はSAAを取得予定。
CLFより実践的な内容が出題される傾向にあるようなので、もう少ししっかり対策してから望む予定
地味に合格点が上がっているのもつらい。
CFEでGPIOをチェック

猛牛さんのターゲットのLEDは74HC595で制御されてます。

基板の上の74HC595を確認するとSOCから4本の信号線がつながれているのが分かります。

![写真（2024-02-29 14.03）.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104066/50cacef9-904d-a0b4-d512-87dd4998ea1a.jpeg)

CFEを操作してどのビットか探してみます。

```
CFE> d 18000060 20
18000060: 0000FD8C 0000058C 000007FD 00000000  ................
18000070: 00000000 00000000 0002FDFC 00000000  ................
```

```
#define GPIO_INPUT                      0x060           // RO
#define GPIO_OUT                        0x064
#define GPIO_OUTEN                      0x068
```

赤いLEDが点灯しているので、CFEが初期化しているようです。ということはGPIO_OUTEN(000007FD)の立っているビットのどれかになります。

74HC595は10,11,12,14で制御できるので、これらのピンにジャンパーをはり電圧を計れるようにします。

```
CFE> e -w 18000064
Type '.' to exit, '-' to back up, '=' to dump memory.
18000064: [0000058C]: 0
18000068: [000007FD]: .
*** command status = 0
```

これで全ピンの電圧が0Vになります。

後はGPIO_OUTENのビットを1ビットづつ地道に確認します。

|GPIO|74HC595|
|:--|:--|
|4|14 - SER|
|6|12 - RCLK|
|7|11 - SRCLK|
|8|10 - SRCLR|

でした。
スリックの矢印が左右でずれる

## 前提
スリックの元々の矢印を隠して疑似要素にtransformで左右反転させるとき

## 解決策
片方だけにtrasnforomをかけるのではなく、両方にかける
例）transform:scale(1, -1)とtransform:scale(1, 1)をそれぞれ両端の矢印に書く
[備忘録] Markdown でノートをとる

# 目的
Latexでノートを書こうとするとレンダリング時間は長いし呪文みたいなコードにうんざりしてしまいます。
marp を少し変形させれば簡単にノート風にでき、pdf 作成も数式入力もかなり楽になります。

# thank you to
Marp という素晴らしいツールを作ってくださっている [**marp team**](https://github.com/marp-team/marp.git) さん、及び、[その改良版としてbeamerチックなデザイン marp-theme-nordic-beamerを開発してくださっている **n-ari さん**](https://github.com/n-ari/marp-theme-nordic-beamer.git) に感謝します。

# 方法

といっても、やりかたは非常に簡単で、[marp 開発者のyhattさんが疑問に答えているように、](https://github.com/orgs/marp-team/discussions/356#discussioncomment-3859518) 好きなノートのサイズを以下のように設定し、

```markdown:css
/* @size b5 2150px 3035px */
/* @size a4 794px 1123px */
```

markdown にて

```markdown:yaml
---
marp: true
size: a4
theme: hoge
---
```

のように設定してあげれば、簡単にノートの形にすることができます。

# 例

css と格闘すればするほど自分の好みのデザインが書けると思われます。

```markdown:markdown

# ミクロ 1

<span style= "font-size:90%;">

## MC と AVC の関係

$$
\frac{∂AVC(Q)}{∂Q} = \frac{1}{Q}(MC(Q)-AVC(Q))
$$

より、MC が AVC より大きい時は AVC は増加し、AVC の最小点を MC が通ることになる。しかし、$ATC=AVC+AFC$かつ$AFC$は単調減少なので、ATC の最小点は AVC の最小点よりも右側に位置する。

</span>

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1651436/5b20a318-93b0-8ae1-bb2a-ac507e7443df.png)


なお、"# "を省略すれば、本来のスライドタイトル部分が消えるので、本当にノートっぽくなります。
難易度をChatGPT-3.5先生に聞きました。「北海道大学2024年前期文系第１問 」

[前へ](https://qiita.com/mrrclb48z/items/9367d6606660284464fd)

# 難易度をChatGPT-3.5先生に聞きました。
・1行、最終行に追加です。
```
(1)自然数m,nについて、2^m・3^nの正の約数の個数を求めよ.
(2)6912の正の約数のうち、12で割り切れないものの総和を求めよ.
上の問題文の難易度を別々に教えて下さい。
```
返信(1回目の実行)
```
ChatGPT
(1) の問題文の難易度: 中
(2) の問題文の難易度: 中〜やや高
```

返信(2回目の実行)
```
ChatGPT
(1) この問題は中程度の難易度です。約数の個数を求めることは基本的な数学の概念であり、指数法則を使って計算できますが、少し複雑な計算が必要です。...

(2) この問題はやや高度で、少し工夫が必要です。まず、6912の正の約数を求め、その中で12で割り切れないものを見つけ、それらの総和を求める必要があります。この問題では、約数の性質や除算の考え方を理解する必要があります。...
```
```
User
難易度の基準を教えて下さい。
ChatGPT
申し訳ありませんが、難易度の具体的な基準は一般的に定義されているわけではありません。ただし、...
以下省略。(変わるかも)
```
VisualStudio2022でReleaseビルドするときにpdbファイルを出力しないようにする

## はじめに

VisualStudio2022にしてからReleaseビルド時にpdbファイルを出力しないようにする設定をしようと思ったらどこにあるのかわからず、検索かけても見当たらなかったので探した結果を備忘録も兼ねて残します。

## 設計箇所

### UIから

わかりにくいですが、プロパティ画面の[ビルド]-[全般]-[デバッグシンボル]の箇所の先頭の歯車を押して、「Configurationずつ値を変化させる」に設定しておかないとDebugとReleaseの個別指定ができないです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/5b2103fd-1f73-8dd1-f51a-7c199228db7b.png)

その後、Releaseでは、「生成済みのシンボルはありません」と指定すればReleaseビルドするときpdbファイルが出力されないようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/1ed54de6-71ee-9203-a102-bdc7307724d7.png)

### ファイルに直接

以下のようにRelease側だけ設定しておけば大丈夫みたいです。

```
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
    <DebugType>none</DebugType>
  </PropertyGroup>
```

念のためDebug側も指定したければ以下も入れておけば良いと思います。

```
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>full</DebugType>
  </PropertyGroup>
```

[指定できる値の参考](https://learn.microsoft.com/ja-jp/dotnet/csharp/language-reference/compiler-options/code-generation#debugtype)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1062357/89fdb2c6-ab6e-4711-0293-548f48e52060.png)

none書いてないですが、[MsBuildのDebugType](https://learn.microsoft.com/ja-jp/visualstudio/msbuild/common-msbuild-project-properties?view=vs-2022)の指定できるのは以下とあるので、noneで生成しないというのも指定できます。
>生成するデバッグ情報のレベルを定義します。 有効な値は "full"、"pdbonly"、"portable"、"embedded、"および "none" です。
pageStackメソッドで、引数を設定する

# したいこと
pageStackメソッドを用いて、画面遷移をしたい。
その場合、遷移先のパラメーターの指定が
vue-routerと使い勝手が違ったので自分用にメモ。

【イメージ】

![スクリーンショット 2024-02-29 12.41.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224077/56a5185d-f2c8-2837-7d85-f5643587e10a.png)

↓ 「鴇色」を押下し、下記画面に遷移

![スクリーンショット 2024-02-29 12.41.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224077/5d25de4b-b6bc-6783-e539-4cb3f1927184.png)

# 前提
* Vue 3.0
* OnsenUI

# 結論

以下のように記述
```js
this.pageStack.push({
    extends: コンポーネント名,
    data() {
      return {
      //渡したい値（※ここで言うと、押下したli要素の「鴇色」の情報）
        キー: 値
      };
    }
  })
```

これだけだと忘れてしまいそうなので（自分が）
以下に問題の全体像も記述しておきます。

# 問題の全体像

### 一覧ページのテンプレート（親コンポーネント）

■したこと
* 一覧ページのテンプレート化（類似画面が発生するため）
* $emitで一覧ページ（子コンポーネント）に値を渡す

```listTemplete.vue
<template>
    <ul class="c-colorLists">
          <li v-for="(item, index) in colorLists" :key="index" @click="getItem(item)">
    </ul>
</template>
<script>
export default {
  data () {
    return {
      value: String,
    }
  },
  methods: {
   getItem (item) {
      this.value = item; //押下したリスト要素の値を取得
      this.$emit('onClick', this.value)
    }
  }
}
</script>
```

### 一覧ページ（子コンポーネント）

■したこと
* $emitで指定したonClickメソッドを用いて、pushメソッドを指定
* 渡したい値はJSONを文字列に変換
* this.pageStack.pushメソッドを使用　←★結論の内容

```listPage.vue
<template>
    <color-lists :color-lists="thirdExam" @onClick="push"></color-lists>
</template>
<script>
export default {
  methods: {
      push (value) {
      let item = JSON.stringify(value); //押下したリストの値を文字列に変換
      this.pageStack.push({
        extends: thirdColorDetail,
        data() {
          return {
            colorItem: item //渡したい値
          };
        }
      })
    }
  }
}
</script>
```


### 詳細ページ

■したこと
* dataプロパティで、listPage.vueから渡される「item」を受け取る（※””を指定しているが、moutedで上書きされる箇所）
* mountedメソッドで、受け取った「colorItem」をJSONに変換

```detailPage.vue
<template>
        <div class="descBlock">
          <h2>{{item.title}}</h2>
          <p>
            {{item.subTitle}}
          </p>
          <p class="desc">
            {{item.description}}
          </p>
        </div>
</template>
<script>
  data(){
    return {
      item: "",
    }
  },
  mounted(){
      this.item = JSON.parse(this.colorItem); //押下したリストの値を、JSONに変換
  }
  </script>
```
jsモジュールが使えるタイプのローカルWebアプリ

アプリのフロントを WebView で作る際、ローカルのHTMLを読み込ませると、import が使えなかったりいろんな制限で困る。VirtualHostNameToFolderMapping にて http://file/ から参照できるように WebView2 を設定して回避するサンプル。

ただ、ローカル制限ありの普通のパターンに比べて、起動が少し遅くなる気はする。

```cs
using Microsoft.Web.WebView2.Core;
using Microsoft.Web.WebView2.WinForms;
using System.Diagnostics;
using System.Security.Cryptography;
using System.Text;

namespace Browser {

	public partial class Browser:Form {
		public WebView2 view = new ();
		public Browser() {
			InitializeComponent();
			ShowIcon	= false;
			Resize		+= (s,e)=>view.Size=ClientSize;
			Load		+= (s,e)=>{
				view.Size=ClientSize;
				view.EnsureCoreWebView2Async(null);
				view.CoreWebView2InitializationCompleted+=(s,e) => Ready();
				Controls.Add(view);
			};
		}
		async Task Ready(){
			var core = view.CoreWebView2;
			var s = Directory.GetCurrentDirectory();
   			
			//ローカル制限を回避、import使用可
			core.SetVirtualHostNameToFolderMapping("file",s,CoreWebView2HostResourceAccessKind.Allow);

   			core.AddHostObjectToScript("Bridge",new HostObject(this));
			await core.AddScriptToExecuteOnDocumentCreatedAsync(@"(()=>{
				//お好みでブラウザ側の初期化コマンド
				console.log('CoreWebView2InitializationCompleted')
				window.browser = chrome.webview.hostObjects.sync.Bridge
			})();");
			view.Source=new Uri("http://file/index.html");
		}
	}
 
	public class HostObject {
		private Browser browser;
		public HostObject(Browser form)		{browser=form;}
		public void openDevToolsWindow()	{browser.view.CoreWebView2.OpenDevToolsWindow();}
		public string title					{get{ return browser.Text; } set{ browser.Text=value; }}
		public string currentDirectory		{get{ return Directory.GetCurrentDirectory(); }}

		//・・・・
		public string hash(string type,string input) {
			HashAlgorithm a;
			switch(type.ToUpper().TrimEnd('?')) {
				case "MD5"	: a=MD5.Create();		break;
				default		: a=SHA256.Create();	break;
			}
			byte[] data = a.ComputeHash(Encoding.UTF8.GetBytes(input));
			a.Clear();
			if(type.EndsWith('?')) {
				return Convert.ToBase64String(data).TrimEnd('=').Replace('+','-').Replace('/','_');
			} else {
				var builder = new StringBuilder();
				for(int i = 0; i<data.Length; i++) builder.Append(data[i].ToString("x2"));
				return builder.ToString();
			}
		}
	}

}
```
 
```html:index.html
<!DOCTYPE html>
<html lang="ja"><head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
<script type="module">

import {View} from './Vanilla.js'

document.addEventListener("DOMContentLoaded",e=>{
	console.log(location)
	browser.openDevToolsWindow()
	browser.title = browser.currentDirectory
	var s = browser.hash('sha256?',browser.currentDirectory)
    console.log(s)
    //・・・・
})

class Dummy extends View{
	constructor(){
 		super()
		//・・・・
	}
}

</script>
</head></html>
```
【Python】特定の文字列と文字列の間を抽出する方法

◆問題
特定の文字列と文字列の間を抽出する方法が分からなかった。

◆対処法
スライスを使用すればできた。

```python:slice.py
txt = '僕は、「情弱」だ。'
result = txt[txt.find('「') + 1:txt.find('」')]
# 今回一気にやっていますが、分けてやってもよい。

print(result)

# 実行結果
情弱
```
【直前対策】AWS認定DBS-C01試験を受けるすべての人に捧げる備忘録【読むだけ復習】

## はじめに（この記事について）
AWSをガッツリ触ったことがない私が
2024/2/21にAWS認定DBSデータベース - 専門知識試験（以下DBS）に合格しました！
（スコアレポート`846/1000`）

開発経験などがまだないため、
ザ・ペーパー試験というような勉強の仕方をしていたのですが
勉強をすすめていく中で、これはDBS受験で即活かせる！と感じた
小手先の知識や傾向を共有したいと思います。

忘れがちだけど得点に直結する知識を確認をしたい方や、迷った時ちょっとでも点数あがる知識をくれ〜〜というような方に読んでいただければと思っています。

ちなみに当方は文系出身IT未経験でSIerに入社し、現在１年目の新卒🐣です。
（去年の９月から机上にて、AWSの勉強を始め、CLP,SAA,SOA,DVAを取得している状態で挑んだ初めての専門知識試験でした）
１２冠目指してがんばっておりますので応援よろしくお願いいたします。

## この単語がきたらコレを選べ！瞬殺系の基礎知識
**※問われている内容によって違うこともありますが、
     ほぼほぼこれが正解！ということが多いものを集めました※**
*なぜこの単語が来たときはこれが正解なのか調べてみると理解が深まると思います*

①RDSからAuroraに移行したい　②ダウンタイム最小限
　→　RDSからAuroraレプリカを作成している選択肢が◯

①RDSでリードレプリカ作れない理由は？
　→　自動バックアップが無効になっている（有効になってない）という選択肢が◯

①データ伝送中の暗号化をしたい
　→　SSL・TSLのある選択肢が◯

①実行前に戻したい（新しくするのではなく今のDBで復元したい）
　→　Auroraのバックトラック機能をつかっている選択肢が◯

①Aurora　②迅速に（読み書き可能な）テスト用のデータベースの作成が必要
　→　Auroraのクローン機能

①Aurora　②障害のテスト
　→　Auroraの障害挿入クエリ

①世界中（マルチリージョン）　②低いレイテンシー　③読み書きをする（読み＆書きなのが重要）
　→　DynamoDBグローバルテーブル
　※　なぜAuroraのグローバルテーブルじゃないのか分かる人は知識が完璧！

①DynamoDB　②不要になった項目を期限を設け削除
　→　TTLのある選択肢が◯

①CloudFormationスタック　②削除から守りたい
　→　DeletionProtection…True
　→　DeletionPolicy…Retain
　→　DeleteAutomatedBuckups…False
　※　設定の意味をそれぞれ理解しておくこと

①台帳　②変更できない（イミュータブル）　③検証可能
　→　QLDB

②グラフ（グラフと明示せずに視覚的にわかる分析系？のような説明で問われていることがしばしばある）
　→　Neptune

①（認証情報を）ローテーション
　→　Secrets Managerのある選択肢が◯

①オンプレからAWSにDBを移行
　→　SCTでスキーマ変換、DMSを使用して移行、CDCで差分を補う選択肢が◯

## 覚えておくと、あと数点…！！に繋がるかもな知識
- RDSとCloudwatchはシームレスに結合されている
- RDSマルチAZでメンテナンスが発生したときの手順
①スタンバイでメンテナンス実行
②スタンバイをプライマリに昇格させる
③旧プライマリでメンテナンス実行、それが新しいスタンバイになる
- Auroraの接続数・ローカルストレージの量はインスタンスサイズによる
- AuroraのAdvancedAuditing（高度な監査）の項目：
　CONNECT…接続の成功失敗切断などの記録
　QUERY＿DCL…クエリのデータ制御の記録（権限変更など）
　QUERY＿DDL…クエリのデータ定義の記録（スキーマ変更など）
　QUERY＿DML…クエリのデータ操作の記録
- Auroraレプリカのフェイルオーバーの先順番
　①Tier0（or0に近い）のもの
　②優先度が同じであればクラスが大きいもの
　③クラスも同じだったら任意のもの
- DynamoDBについて
　LSI（ローカルセカンダリインデックス）…強力な整合性◯　　結果整合性◯
　GSI（グローバルセカンダリインデックス）…強力な整合性☓　　結果整合性◯
　DAX（DynamoDBAccelerator）…強力な整合性☓　　結果整合性◯
　※LSIとGSIの構成の違い、作成できるタイミングも理解しておくと吉

## どんな内容なのかパッと思いつけばGOOD！ついつい忘れがちな用語
- RDSイベントとは何かと、その例
- RDSプロキシとは何かと、それがどのDBなどで使えるか
- クラスターキャッシュ管理とは何かと、それがどのDBで使用できるか
　…設定するとフェイルオーバーが発生してもアプリパフォーマンスを維持できる
- カスタムエンドポイントとは何か
　…余裕があればAuroraのエンドポイントの違いも捉えておこう
 （クラスターエンドポイント、リードエンドポイント、インスタンスエンドポイント）
- Redshift Spectrumとは何か
　…キーワードはS3
- スタックセットとは何か
　…キーワードは複数のリージョン、アカウント
- 変更セットとは何か
　…これを使うと何がわかってどんな良いことがあるのでしょうか
- 自動スナップショットと手動スナップショットの違い
　…手動のほうが機能が永続的なので選択肢で◯であることが多い印象です
  　（スナップショットの共有方法を問われている問題で出がち）

## さいごに
最後まで読んでくださり、ありがとうございます🙇‍♀️
拙いところが多かったと思いますが、読んでくださった方の役に立てばとても嬉しいです。

DBSは４月に廃止されるので、モチベが上がらないところがあるかとは思いますが、逆にこれ以上難化することはない試験だとポジティブにとらえてがんばりましょう🔥
問題を解いていると、他の問題の選択肢がヒントになるタイミングもあったのでどの設問にどんな問題があったかなどをホワイトボード（渡されるメモ用のやつ）に書いておくのもオススメです！

重ねてになりますが、最後まで読んでくださりありがとうございました！
WACs(Web Application ComponentS)について

## はじめに

WACsとは**Web Application ComponentS** の略。
（WACと区別するために無理やりsをつけた？）

IBM社が提供しており、Javaアプリケーション開発で必要となる基盤機能のコンポーネントと、生産性向上のための開発支援ツールを提供するスーパーニッチなアプリケーション開発フレームワークでバージョンは23.2まで出ている。(2024/02/29現在)
WACsを利用する新規案件はほぼ無いと思うが、更改案件などでもしかしたら触れる機会があるかも…
おそらく日本中の全エンジニア、プログラマーの中で知っている人は1%もいないと思われる。

IBM系の製品あるあるなのだが、いざ調べようと思い「WACs」や「Web Application ComponentS」で検索しても関係のない記事ばかり出てきてしまう。
どうにかみつけても日本語の記事は2,3個くらいしかみつけられなかった。
ちなみにX(旧Twitter)で「WACs IBM」と検索するとWACsに携わったであろう歴戦の猛者の先輩エンジニア達からボロクソ言われてるので面白い。どれも10年以上前のポストなので歴史を感じる。

そんなWACsを業務で触れることがあったので、自分も全てを把握している訳ではないが、備忘録・業務で使用する為に調べたけど全く情報がない中、検索でこの記事が引っ掛かった人の為にわかったことだけでも残しておこうと思う。

## 何ができるのか

WAS(WebSphere Application Server)及びJDKの導入が前提。
WASもIBM社製品でシステム構築・運用をサポートするアプリケーションサーバ。
イメージとしては、WASとJDKの上にWACsが乗り、その上にWACsの共通、カスタマイズ部品などが乗っているような構成になる。


WACsにはいくつか製品としての特長がある。

・お客様の業務をシステム化する上で十分なシステム基盤機能を提供
・標準技術をベースとしたコンポーネント機構と開発環境(Java EE/Eclipse)
・フレームワークの拡張方式を標準化(コンポーネントの再利用が可能)
・各種提携ロジックを自動生成する開発支援ツールとガイド類の提供
・研修サービス、オンラインサポートなどのサポート体制


WACsにはいくつかのFutureがある。

#### ・Web Feature
MVCフレームワーク (Base Framework / JSF)
Webアプリケーションに必要な基盤機能 (セッション制御 / 画面遷移制御 / Ajax連携など)
Form生成ツール /JSP生成ツール / CPA設定ツール
#### ・Common Feature
Webサービス・リクエスト制御用フレームワーク
リクエスト制御(流量制限など)および外部リソース・アクセス用基盤(JMSアクセスなど)機能
Spring Framework連携用コンポーネント*
コンポーネントの組み込み可能な実行基盤
Javaビーン変換クラス生成ツール
DAO生成ツール
#### ・Batch Feature
バッチ/非同期処理用フレームワーク
種々のジョブ呼び出し用コンポーネント (Shell / REST API etc.)
ジョブ管理用Webアプリケーション
#### ・Print Feature
帳票Webサービス
帳票データ登録
オンライン印刷
帳票データDBメンテナンス
#### ・SOA Application Template Feature
Web FeatureをベースとしたSOAの考え方を採用したシステム構造を実現するための再利用可能な設計、開発ガイド
画面仕様書からスケルトン・ソースコードを自動生成

<br>

実際に開発で使う際には[RAD](https://www.ibm.com/products/rad-for-websphere-software)と呼ばれるEclipseベースの開発ツールを使うことになると思うが、ヘルプからWACsのガイドを参照しながら開発が可能になる。

また分かったことがあれば追記していこうと思います。
Rspecでモックを使用してテストを書いてみた

## mocksを使用した経緯
テストしたいクラスが、S3バケットへの署名付きURLの発行やCSVの生成などのために複数のクラスとの依存関係にあり、単独でテストをする必要があったため使用しました。


## 参考にした記事
https://qiita.com/k-o-u/items/e6f671a1fc0bf720932d

https://zenn.dev/sa2knight/articles/2388ecadc82b98


## mocksの基本について
ほぼほぼ上記の記事と同じ内容ではありますが、
```hoge_spec.rb
let(:class_a) { instance_double(ClassA) }
```
これでClassAのテストダブル（影武者)のclass_aが作成できます。
しかし、このままではこのclass_aはメソッドなどは何も持っていないので情報を付与する必要があります。

<br>

```hoge_spec.rb
allow(ClassA).to receive(:new).and_return(class_a)
allow(class_a).to receive(:upload)
```

これによって、まず
実際のコードでClassAをnewする際に、先ほど定義したテストダブルの方のclass_aが返されるようになります。
そしてテストダブルの方のclass_aにuploadメソッドを受け取れるように設定しています。(class_aがuploadメソッドを受け取ると何もしないようにモックしています)

<br>
またこのように書くことで何かしらの動作を持たせることもできました

```hoge_spec.rb
allow(class_b).to receive(:call) do
# 何かしらclass_bに持たせたい処理をここに書ける
end
```

これによって、テスト内でも何かしらの処理を持たせることで、テストダブルに別のテストダブルを呼ばせるなどの動作も取れるようになります。今回はしていませんが。

<br>

これらの設定により、実際のコードで
「ClassAのインスタンスをnewしてuploadメソッドを行い処理を行う」
という実際の処理の工程を
「ClassAの実装の詳細を隔離したまま、class_aという代替品にuploadメソッドが届くかどうかの確認をする」
というやり方でテストを行えるようになります。


## 実際のテストの全体像

コードの全体像は以下のようになりました
```hoge_spec.rb
require 'rails_helper'

RSpec.describe ClassHoge do
  describe '#call' do
    subject { 実際の処理.new.call(引数1, 引数2など) }
    
    let(:class_a) { instance_double(ClassA) }
    let(:class_b) { instance_double(ClassB) }

    before do
      allow(ClassA).to receive(:new).and_return(class_a)
      allow(class_a).to receive(:upload)
      allow(ClassB).to receive(:new).and_return(class_b)
      allow(class_b).to receive(:call) do
      # 何かしらclass_bに持たせたい処理をここに書ける
      end
    end

    it 'ClassAにhugaして、ほにゃららし、ClassBにhogeしてどうなる' do
      subject
      expect(class_b).to have_received(:call)
      expect(class_a).to have_received(:upload)
    end
  end
end
```
Nuxt3 + Exceljs – ブラウザでエクセルファイルを選択した時にWorkbookとして受け取る (アップロードに使いたい)

# 前提

ブラウザでファイル選択した時に、エクセルファイルの内容をフロント(Nuxt3)で解析して、その内容を元に何らかのアップロード処理的なことをしたい

(エクセルファイル本体を送信するわけではなく、JSONでリクエストするなどしたい)


# Exceljs のインストール

```
npm install exceljs
```

# ファイル例

以下の例では全てのシートの名前と、A1のセルの値を console 出力している

ブラウザでエクセルファイルをファイル選択した時に、
exceljs でワークブックを読み取って、その内容を console 出力してみる



```js
<script lang="ts" setup>
import * as Excel from 'exceljs'

async function fileSelected(event: Event) {
  const target = event.target as HTMLInputElement
  const files = target.files

  if (files && files[0]) {
    const arrayBuffer = await files[0].arrayBuffer()
    const workbook = new Excel.Workbook()
    await workbook.xlsx.load(arrayBuffer)

    workbook.worksheets.forEach((worksheet) => {
      console.log(worksheet.name)
      console.log(worksheet.getCell('A1').value)
    })
  }
}

const fileInput = ref()
</script>

<template>
  <input ref="fileInput" type="file" @change="fileSelected" />
</template>

```

## 解説

- ファイルを選択すると `File` が得られる
- File からバッファが得られる ( `File.arrayBuffer()`  )
- バッファを `workbook.xlsx.load` でワークブックとして読み込むことが出来る

# アップロード処理

`workbook` を使って fetch とかでてきとうにバックエンド(サーバー)にアップロードする

# チャットメンバー募集


何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ


# プロフィール・経歴

https://github.com/YumaInaura/YumaInaura
『華清宮』のライチは「茘枝」なのか「荔枝」なのか

![華清宮.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/7bed9c0b-aa31-c13e-a30c-1d83377201a4.jpeg)

1月13日の大学入学共通テスト【国語】第4問に、杜牧の『華清宮』が出題された。

> 長安回望繡成堆
> 山頂千門次第開
> 一騎紅塵妃子笑
> 無人知是茘枝来

常用漢字で書かれているのは、まあ、共通テストだから仕方ないのだが、でもライチが「茘枝」と書かれているのが、どうにも私(安岡孝一)には気になった。ここは「荔枝」の方が適切だと思うのだ。元ネタが

> (【詩】と【資料】Ⅰ～Ⅲは蔡正孫『詩林広記』による)

らしいので、とりあえずHarvard大学の[『精選古今名賢叢話詩林廣記』](https://iiif.lib.harvard.edu/manifests/view/drs:47893298$72i)(弘治10年刊)も見てみたが、もちろん「長安回望綉成堆山頂千門次第開一𮪍紅塵妃子笑無人知道荔枝來」となっている。うーん、そもそも「知是」と「知道」の異同もあるし、『詩林広記』や『樊川文集』のどれかの版に「茘枝」があるのかなあ。
My notes about Kafka 

Thanks to cheat sheets of ByteBytGo.They are helpful!

Apache Kafka：https://kafka.apache.org/

As Apache Kafka defines,
Apache Kafka is an open-source distributed event streaming platform used by thousands of companies for high-performance data pipelines, streaming analytics, data integration, and mission-critical applications.

There are something more about the keywords "event streaming platform" and "high-performance data pipelines"

-distributed event streaming platform

https://developer.confluent.io/patterns/event-stream/event-streaming-platform/

Event streaming is the digital equivalent of the human body's central nervous system. It is the technological foundation for the 'always-on' world where businesses are increasingly software-defined and automated, and where the user of software is more software.

-high-performance data pipelines

https://medium.com/agoda-engineering/how-to-design-maintain-a-high-performing-data-pipeline-63b1603b8e4a

First of ALL. Think about why Kafka could be so fast.

![Why is Kafka fast__1_Alex Xu_来自小红书网页版.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617964/1937efe1-ca7c-3649-e9cd-103205092c02.jpeg)

And When we need it.
![a93e158d8227deb863aa035915d759f.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617964/811b9cec-5a22-efb3-a919-84f970a8bc18.jpeg)

And of course, try to use it!

https://kafka.apache.org/quickstart
gitにてremoteのタグを削除する方法

## ローカルタグの確認

```
> git tag
```

## ローカルタグの削除
-dを付けて削除する
rel-1.0.0のタグを削除
```
> git tag -d rel-1.0.0
```
再び、ローカルタグの確認をして削除されていることを確認。
リモートにタグをpushしている場合、リモートのタグが消えない。

## リモートのタグを確認
```
> git ls-remote --tags
```

## リモートのタグを削除
--delete
```
> git push origin --delete rel-1.0.0
```
または、コロン:をつかって削除
```
> git push origin :rel-1.0.0
```

リモートのタグを確認して削除されていることを確認。
Stripe Checkoutでタイムセールのような時間制限のある決済フローを実装する方法

Stripe Checkoutを使用することで、簡単にオンラインでの決済・サブスクリプション申し込みページのURLを作成できます。

![スクリーンショット 2024-02-16 14.33.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2366300/091d9cd8-f9d3-80ab-0de1-cd994f6d5578.png)

作成したCheckout Sessionは決済が完了するか、発行から24時間を経過すると利用できなくなります。もし、このCheckout Sessionを任意のタイミングで無効化したい場合は、有効期限を指定してやる必要があります。今回は、Stripe Checkoutを使ってタイムセールのような時間制限のある決済フローを実装する方法を説明します。

https://stripe.com/jp/payments/checkout

### Step 1: `expires_at`を利用した有効期限付きのCheckout Sessionの作成

StripeのCheckout Sessionを作成する際、APIパラメータの`expires_at`を利用することで、有効期限を設定することができます。有効期限は**30分以上未来の時間**を指定することができます。例えば「現在から30分後に無効化されるCheckout Sessionを作りたい」場合、day.jsを利用して次のように実装することができます。

```js
import dayjs from 'dayjs'

...

const sessionExpiresAt = dayjs().add(30, 'minutes').unix()

await stripe.checkout.sessions.create({
  line_items: [{
    price: 'price_xxxxx',
    quantity: 1
  }],
  success_url: 'https://stripe.com',
  cancel_url: 'https://stripe.com',
  expires_at: sessionExpiresAt,
  mode: 'payment'
})
```

https://docs.stripe.com/api/checkout/sessions

### Step 2: セール終了時間になったら、新しいCheckout Sessionを作成しないようにする

`expires_at`を利用した期限設定は、**30分以上未来の時間**である必要があります。そのため、「午後8時に終了する」場合、「**新規の注文フロー（Checkout Sessionの作成）を午後8時に終了する**」のか「**支払い完了までのフローを午後8時までに完了させる必要があるようにする**」かを決める必要があります。

もし**支払い完了までのフローを午後8時までに完了させる必要があるようにする**場合は、午後7時30分の時点でCheckout Sessionの作成を終了する必要があり、**新規の注文フロー（Checkout Sessionの作成）を午後8時に終了する**場合は、Checkout Sessionの`expires_at`の時間を午後8時30分に指定する必要があります。

次の例では、「2022/12/01の午後8時に新規の注文フロー（Checkout Sessionの作成）を終了し、作成済みのCheckout Sessionは午後8時30分で期限切れになる」Checkout Sessionを作成します。

```js
import dayjs from 'dayjs'

...

const saleEndTime = dayjs('2022-12-01 20:00:00')
const current = dayjs();

if (current.isAfter(saleEndTime)) {
  throw new Error('タイムセールは終了しました');
}

const sessionExpiresAt = saleEndTime.add(30, 'minutes').unix()

const session = await stripe.checkout.sessions.create({
  line_items: [{
    price: 'price_xxxxx',
    quantity: 1
  }],
  success_url: 'https://stripe.com',
  cancel_url: 'https://stripe.com',
  expires_at: sessionExpiresAt,
  mode: 'payment'
})
```

このような実装により、顧客がセールの終了時間を過ぎてから注文しようとすると、"タイムセールは終了しました"というエラーメッセージが表示され、その後新規にセッションを作成できなくなります。また、既存のセッションもセール終了30分後に無効となります。

## まとめ

このように、Stripe Checkoutを使用してタイムセールや他の時間制限のある決済フローを実装することができます。`expires_at`パラメータを利用してCheckout Sessionの有効期限を設定し、決済セッションを特定の時間後に自動的に無効化することと、セール終了時間を過ぎたら新規セッションの作成を停止する設定の方法を取り入れることで、任意の時間で注文受付を停止することが可能です。

https://qiita.com/hideokamoto/items/963b8cfa990d7065f9af

このような方法は、時間に基づくセール戦略をサポートし、特定の時間帯に商品を販売するといったビジネスのニーズを満たすことができます。これにより、時間制限のあるセールを効果的に実施でき、短期間の販売力を高めることができます。

## 次のステップ

次のステップとして在庫管理システムとの連携に挑戦してみましょう。在庫管理システムとStripe Checkoutの間に連携を持たせることで、在庫状況を反映したセールを展開したり、在庫切れを即座に反映させたりすることが可能です。

これにより、適切な在庫管理と販売戦略の実施によって、顧客体験を向上させ、売上をさらに増加させることが期待できます。

## 関連記事・リソース

https://stripe.com/docs/payments/checkout/managing-limited-inventory

https://stripe.com/docs/payments/checkout/how-checkout-works

https://docs.stripe.com/payments/checkout/fulfill-orders
Gin Web Frameworkでのnpmライブラリを使った静的ファイルの取り扱いに関するメモ

[Golang フレームワークでStaticファイルをemmbeddingして](https://gin-gonic.com/docs/examples/serving-static-files/)をnpmライブラリを使いたい。例えば[http-status-code](https://www.npmjs.com/package/http-status-codes)など。

ハマったのでメモします。

## 解決策

具体的には、サーバーサイドで

```go:main.go
r.StaticFS("/node_modules", http.Dir("static/node_modules"))
```

クライアントサイドで

```typescript:main.ts
import { StatusCodes } from "../node_modules/http-status-codes/build/es/status-codes.js"
```

ライブラリはあらかじめ`npm`使ってインストールしておく必要がある。

```sh
$ npm install -D http-status-codes
```

ポイントは`node_module/{ライブラリ名}/build/es/{モジュール名}.js`を指定すること。

## 補足: ディレクトリ構成
```
/
├── main.go
├── static
   ├── dist
   │   ├── common.d.ts
   │   ├── common.js
   │   ├── common.js.map
   │   ├── ...ビルドしたjs達
   ├── node_modules
   │   ├── @popperjs
   │   ├── @types
   │   ├── bootstrap
   │   └── http-status-codes
   ├── src
   │   ├── common.ts    <--- この辺でimportする
   │   ├── datalist.ts
   │   ├── ソースとなるts達
   ├── style.css

```

## やってだめだったこと

- `import { StatusCodes } from "../node_module/http-status-codes/build/cjs/status-codes.js"` : common js (cjs) は import-exportをサポートしていません。
- `import { StatusCodes } from "../node_module/http-status-codes"` : `npx tsc`のビルドは通るけど、どのjsからStatusCodesをインポートすればいいか探せない？ため404エラーになる。(nodeモジュールから勝手に探してくれないの...?)
- `import { STATUS_CODE } from "https://deno.land/std@0.217.0/http/status.ts";` : denoを使ってフォーマット・テストしているのでつい…。ブラウザ上のJSには使えません。
Chakra UIのスタイルが適用されない

# はじめに
どうもこんにちは！僕は現在1ヵ月本気の技術力向上を目指している現役高校生1年生(@shunii )です！

今回はChakra UIを使おうとしたら上手くスタイルが適用されなかったのでまとめます。

# 問題
Chakra UIのスタイルが適用されない。
具体的には、Buttonコンポーネントを例に挙げると、buttonとして表示されていてクリックすることは可能なのにデフォルトのモダンなcssが適用されていないという状況に陥りました。(なんてこった！！)

# 解決策
<font color="red">**Chakra UIのグローバルなスタイルの設定をしていたファイルを変更した。**</font>
僕の場合、theme.tsというところに以下のようなファイルを用意してグローバルなスタイルを管理していました。

変更前
```ts:theme.ts
export const theme = {
  styles: {
    global: {
      body: {
        bg: "white",
      },
    },
  },
};
```

変更後
```ts:theme.ts
import { extendTheme } from "@chakra-ui/react";

export const theme = extendTheme({
  styles: {
    global: {
      body: {
        bg: "white",
      },
    },
  },
});
```

# 原因
コードを見ていただければわかる通り、グローバルなスタイルの書き方がおかしかったので、ChakraProviderのプロップスとしてthemeを渡した際に問題が起こったようです。

# 終わりに
書き方はちゃんと確認しよう笑

# About Me
- X(Twitter)

https://twitter.com/shunii_hack
日本語プログラミング言語MindをAndroidに移植した時の記録(ステップ3/9)

# はじめに

　この記事はだいぶ前（2012年）にココログの「[キリーの日本語プログラミング](http://uemon3511.cocolog-nifty.com/nihongoprogram/)」に掲載したコラムですが、再編集してこちらにも投稿します。今となっては古い話ではありますが、OSによってプログラム言語（AndroidではJava）が決め打ちされている環境で規定と異なるもの（Mind）を走らせたことの記録としてお読みください。

# レイアウト系

　レイアウトやビューなど表示のごく基本のところをまとめておく。

　Javaのオブジェクト指向のコードをMindのコードにどうやって対応させるかが問題だった。

　まずレイアウト系のオブジェクトの扱いだが、たとえばJavaでは、

```java:
    layout1 = new LinearLayout( this );
```

などと書いて「layout1」という名前のリニアレイアウトのインスタンスを作るが、このオブジェクト（Java内部ではポインタ？）をMindへ渡されても何も使い道が無い。さらには、Javaレベルの「layout1」なる名前もまたMind側からは見えない／見たくないものである。そもそもMindでプログラムを書くのだから名前はすべてMind側で（たとえば適当な日本語名で）決めるべきものである。

　結果として以下のようにした。
　まずMindでは次のように書く。

```mind:
レイアウトは　変数と　等価。

○○とは
　　　　＿レイアウトは   レイアウト
    　　～略～
    　　リニアレイアウトを生成し　＿レイアウトに　入れ
```

（注：変数名の頭にアンダースコアを付けるのはMindのルールではなく単に筆者の好みである。局所変数と大域変数とで区別がつきやすいようにしている）

　まず、Mindで「リニアレイアウトを生成」という処理単語を使い、リニアレイアウトのインスタンスを作る。正確には「インスタンスを作ることをJavaに要求するる」である。
　インスタンスを作るとは言ってもMind側では「なんちゃって」であり、単に1から始まる整数(通し番号)を生成するだけである。
　処理単語「リニアレイアウトを生成」は例えば「1番でインスタンスを作ってね」をJavaに要求する。

　これに対応するJava側記述を次のようにする（要所のみ抽出）。

```java:
// Layoutをアサインする //

public int j_assignLayout( int seqno )
{
    linearLayouts[seqno] = new LinearLayout( this );

     ～略～
}
```
 
　Javaではリニアレイアウトのインスタンスを生成し、Mindから渡された通し番号(上記で"seqno"）を添え字とした配列に格納する。先に書いたようにJava側で個別インスタンスに名前を付けても使い道が無いが配列要素は無名なのでちょうど良い。
　上記により、最初に生成されたリニアレイアウトは「１番目のリニアレイアウト」として以降操作可能となる。

## ビューについて

　ビューについても同様で以下のようにした。
　Mindでは次のように書く。

```mind:
ビューは　変数と　等価。

○○とは
　　　　＿案内文は    ビュー
    　　～略～

   　　 テキストビューを生成し　＿案内文に　入れ
```

　Mind側ではレイアウトの時と同様、「テキストビューを生成」によって通し番号を生成しその番号で管理する。
 
 　注１：実際には、テキストビューのほかにボタンやチェックボックスなど他のビュータイプも一括して操作できるように、タイプ＋通し番号で管理している
 　
　  注２：先に書いたレイアウトも実は同様で、複数のレイアウトをタイプ＋番号で識別している

 Java側は次のような記述に対応する。
                          
```java:  
// Viewをアサインする //

public int j_assignView( int seqno )
{
    textViews[seqno] = new TextView( this );

     ～略～
}
```


レイアウトとテキストビューをそれぞれ１つ扱うMindのプログラムは次のようになる。

```mind:
    メインとは
                    ＿レイアウトは  レイアウト
                    ＿案内文は      ビュー
      （レイアウト）
            リニアレイアウトを生成し  ＿レイアウトに  入れ
            垂直を                   ＿レイアウトに  子の追加方向を設定し
            ＿レイアウトを  レイアウトをアクティビティに追加し
      （ビュー）
            テキストビューを生成し  ＿案内文に  入れ
            １８を                 ＿案内文に  文字のサイズを設定し
            「こんにちは」を        ＿案内文に  文字を設定し
            ＿案内文を  ＿レイアウトに  ビューを追加し
            。
```

# つづく

　最近、Mindユーザーの@mylifewithviolinさんがMindコンパイラの内部に興味を持たれているようなので参考情報として投稿してみました。本記事はしばらくつづきます。次は(ステップ4/9)。
Next.js 14.1.0 Production BuildでBUILD_ID or sever.jsなしエラーの解消

Next.js でDockerを使用して本番環境用にイメージを作成すると、BUILD_IDがない、もしくはsever.jsがないといわれる場合の対処法です。

### エラー
```shell
[Error: ENOENT: no such file or directory, open '/app/.next/BUILD_ID'] {
  errno: -2,
  code: 'ENOENT',
  syscall: 'open',
  path: '/app/.next/BUILD_ID'
}
```

Dockerの起動時に、Dockerfileに以下のどちらかで書いてる場合に上記のエラーとなります。
```shell
CMD ["yarn", "start"]

or

CMD ["node", "server.js"]
```

### 対処
これは、.nextディレクトリが起動時に存在しないため起こります。
先にbuildすると、.nextディレクトリが作成されて、BUILD_IDとserver.jsが作成されます。

なので、先にbuildしてから、startします。
```shell
CMD sh -c "yarn build && yarn start"

CMD sh -c "yarn build && node .next/standalone/server.js"
```

### next.config.jsの設定
以下の追記が必要です
- output: 'standalone' ← standaloneモードにする場合
- BUILD_IDをユニークにしたい場合

```javascript
module.exports =   {
  output: 'standalone',
  reactStrictMode: true,
  generateBuildId: async () => {
    // ここは色々方法はある
    return process.env.VERSION || Date.now() + Math.round(Math.random() * 2441139);
  },
}



```



### 補足
- エラーの表示メッセージがおかしいと話題になってます
このバージョンで試したらエラーにはなりますが、メッセージは分かりやすいです。
https://github.com/vercel/next.js/pull/62404
- Dockerfileはここを参照
https://github.com/vercel/next.js/blob/canary/examples/with-docker/Dockerfile
- Deploy 本家のドキュメント
https://nextjs.org/docs/pages/building-your-application/deploying