OmniAICreator/Qiita-1.07M huggingface dataset:
BASHでスペースを含むPATHを代入した変数をダブルクォートで挟まずに[TAB]で補完する

# BASHでスペースを含むPATHを代入した変数をダブルクォートで挟まずに[TAB]で補完する

## Abstract

```bash
export long_name_variable='/mnt/g/My Drive' #スペースを含むPATH
```

としてあるとき，

```bash
shopt -s direxpand
```

としておくと，

```bash
cd $long_name_variable/ #スラッシュを追加し，[TAB]を押す
# このとき
# cd $long_n 
# ↑この時点で他に候補がなければ[TAB]を押すと変数名が補完され，
# cd $long_name_variable 
# となる
```

のように，スラッシュを追加し[TAB]キーを押すと，環境変数がスペースを考慮されたうえで展開されて

```bash
cd /mnt/g/My\ Drive
```

となり，`cd "$long_name_variable"`と打たなくていい．
(ダブルクォート内では変数名の[TAB]による補完ができない)

## Background

```bash
export long_name_variable='/mnt/g/My Drive'
cd $long_n#[TAB PRESS]
```

のようにTABキーを押せば，ほかに候補がない場合，

```bash
cd $long_name_variable
```

となってくれる．しかしこのまま`[ENTER]`を押せば，

```bash
cd /mnt/g/My Drive
```

と展開されてしまい，`cd`の引数に`/mnt/g/My`と`Drive`の二つが指定されることになってしまう．
これを回避する方法の一つとして，

```bash
cd "$long_name_variable"
```

のようにダブルクォートで挟むのが定石だが，
（環境に依るかもしれないが）ダブルクォートの途中で[TAB]で変数名を補完しようとしてもできない
（別の環境ではできてた気がするので，設定方法知っている方いたらコメントで教えていただけると助かります）

```bash
cd "$long_n #ここで[TAB]を押しても無反応
```

このため何かしらのワークアラウンドを探していた

## Solution: `shopt -s direxpand`
本操作は以下の記事を基にした

https://unix.stackexchange.com/questions/157026/why-cant-i-use-tab-expansion-auto-complete-of-shell-variables-with-cd

https://unix.stackexchange.com/questions/618806/pressing-tab-to-do-filename-expansion-kills-the-quotes-i-need-around-my-variable


```bash
shopt -s direxpand
```

としておくと，

```bash
cd $long_name_variable/ #スラッシュを追加し，[TAB]を押す
```

[TAB]キーを押すと，環境変数が展開されて

```bash
cd /mnt/g/My\ Drive
```

となり，`cd "$long_name_variable"`と打たなくていい．

これは他にもダブルクォートと補完に関する問題にも関係し，
例えば

```
cd "$variable"/somewhere #ここで[TAB]
```

とすると，ダブルクォートが消えてしまう問題があったが，`direxpand`を`on`にしておくことで，
変数がスペースが考慮されて展開（`\`がスペースの前に追加される）のでこの問題も解消する．
Amazon DocumentDBに接続する

# Amazon DocumentDBとは

Amazon DocumentDBはMongoDB互換のAWSのフルマネージドサービスになります。  
Amazon DocumentDBを使用することで構築の簡素化、自動スケーリングや自動パッチ適用など運用の簡素化を図ることができます。  
Amazon DocumentDBは2022年10月現在、MongoDB 3.6および4.0のドライバーおよびツールと互換性があります。

# Amazon DocumentDBに接続してみる

Amazon DocumentDBに接続するには、MongoDBが提供している`mongo`コマンドで接続が可能です。そのため、まずは`mongo`コマンドをインストールします。

## mongoのインストール

Amazon DocumentDB 4.0に接続することを想定します。  
また、クライアント環境はAmazon Linux2のEC2インスタンスを想定します。
`mongo`コマンドのインストール手順については[MongoDBのサイト](https://www.mongodb.com/docs/v4.0/tutorial/install-mongodb-on-amazon/)を参考に記載をしています。

- yumの設定を修正するために`/etc/yum.repos.d/mongodb-org-4.0.repo`ファイルを作成し、以下の内容を記載します。
  ```
  [mongodb-org-4.0]
  name=MongoDB Repository
  baseurl=https://repo.mongodb.org/yum/amazon/2/mongodb-org/4.0/x86_64/
  gpgcheck=1
  enabled=1
  gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
  ```

- 以下のコマンドを実行すると `mongo`コマンドがインストールされます。

  ```
  sudo yum install -y mongodb-org
  ```

## DocumentDBに接続する

`yum`コマンドでインストールを行うと`/var/lib/mongo`にコマンドが作成されます。  
`mongo`コマンドでのDocumentDBへの接続方法はAWSマネージメントコンソールのDocumentDBクラスタの画面のところに表示されてもいます。

![connect_document_db.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/c39da952-ee9f-bbb8-01f4-3a5115e2bb14.png)

以下にはTLSを使用した接続方法を記載しています。

- (初回のみ)認証に必要なAmazon DocumentDB認証機関(CA)証明書をダウンロードします。
  ```
  wget https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
  ```

- `mongo`コマンドでDocumentDBクラスタに接続します。(`/var/lib/mongo`にパスが通っていない場合は事前に設定をしてください)
  ```
  mongo --ssl --host [クラスタ名]:[ポート番号] --sslCAFile rds-combined-ca-bundle.pem --username [ユーザ名] --password [パスワード名]
  ```

:::note info
上記コマンドはクラスタ名等が補完されたコマンドラインをAWSマネージメントコンソールのDocumentDBクラスタの画面からコピーすることが可能です
:::

## DocumentDBにコマンドを実行してみる

DocumentDBに接続ができたら以下のようなコマンドを実行することができます。

### コレクション一覧を表示する(show collections)

```
rs0:PRIMARY> show collections
table1
table2
table3
```
:::note info
コレクションはRDBでのテーブルに相当します
:::

### コレクションを作成する(db.createCollection([コレクション名])

```
rs0:PRIMARY> db.createCollection('table1');
{ "ok" : 1, "operationTime" : Timestamp(1666829216, 1) }
rs0:PRIMARY>
```

### データを追加する(db.[コレクション名].insert([JSON]))

```
rs0:PRIMARY> db.table1.insert({id: 1, name: 'Alen', age:10})
WriteResult({ "nInserted" : 1 })
```

### 全件表示する(db.[コレクション名].find())

```
rs0:PRIMARY> db.table1.find()
{ "_id" : ObjectId("6359cbf4cd7425fde3ab1dff"), "id" : 1, "name" : "Alen", "age" : 10 }
{ "_id" : ObjectId("6359cc02cd7425fde3ab1e00"), "id" : 2, "name" : "Bob", "age" : 21 }
```
WEB開発をやり始めてみる(Rails:Cloud9環境設定)

# 目的
Railsの環境を整えるのをCloud9上でやってみます。
# やったこと(環境整備)
```ruby:
$ rails -v
Rails 7.0.4

$ mkdir rails_projects
$ cd rails_projects/

### railsを新しく作成
$ rails _7.0.4_ new hello

### gemファイル内読み込み
$ bundle install
```
# やったこと(簡単なものの表示)
```ruby:
### Usersはコントローラーの名前
### indexはメソッドの名前
$ rails g controller Users index 
```

```ruby:app/controllers/users_controller.rb
### 上記で作成したUsersコントローラーが作成されています(ApplicationControllerを参照しています)
### indexメソッドが作成されています
class UsersController < ApplicationController
  def index
  end
end

```
```ruby:/app/views/users/index.html.erb
### HTMLにRubyプログラムを書くことができるのがerb
<h1>HELLO WORLD</h1>
```
```ruby:/config/routes.rb
### どこにアクセスしたらどこを表示するかの設定を行います。
### URL/users/indexの設定になっている
Rails.application.routes.draw do
  get 'users/index'
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end

### rootの設定になっている
Rails.application.routes.draw do
  root 'users#index'
  # Define your application routes per the DSL in https://guides.rubyonrails.org/routing.html

  # Defines the root path route ("/")
  # root "articles#index"
end

### 現在のルーティングの設定が一覧できます。
$ rails routes
```
16進数を10進数に変換する(SPSS Modeler データ加工逆引き3-18)

## 16進数を10進数に変換する（最大5桁を想定）

![スクリーンショット 2022-10-20 11.59.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f2c291fb-ceba-0ef6-2646-c3a8f3f05c02.png)

＊この記事よりも後にでた以下の記事も併せてお読みください

https://qiita.com/kawada2017/items/fc99b9943994341c6ef2

## 1.想定される利用目的

・車載器や特殊設備などのデバイスから記録されたデータの活用

## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/hexadecimal.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2022-10-20 12.00.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/716d3f12-4afc-7ed0-59a5-4b0c7049030b.png)

a.入力するデータは以下の通りです。文字列で入力されています。
![スクリーンショット 2022-10-20 12.02.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8a2ddf40-0c8a-b63e-6dad-d6c7c5ddc02f.png)

b.[フィールド作成]ノードを編集します。最大想定の5桁の場合の先頭桁だけ処理しています。
![スクリーンショット 2022-10-20 12.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/41a7f7c5-d088-5ba7-9132-cdc4e41f19b4.png)

[プレビュー]します。5桁のレコードだけ計算されています。
![スクリーンショット 2022-10-20 12.04.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/662de0dd-4ae9-5ee8-b904-e97414f38dad.png)

c.[置換]ノードを編集します。後ろから4桁目の処理を行って、bに加算する置換え処理です。@&#xFFF0;FIELDはワイルドカードです。
![スクリーンショット 2022-10-20 13.13.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8a9cd2fe-e3cb-b7e9-c8de-b8b4c02925e0.png)

[プレビュー]します。5桁の先頭2桁か、4桁の先頭桁を処理/更新しています。
![スクリーンショット 2022-10-20 13.14.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d88e892f-2f4e-7782-4019-6ebcf7ccfedd.png)

d.Cと同様の計算を後ろから3桁目で実施します。

e.Cと同様の計算を後ろから2桁目で実施します。

f.[置換]ノードを編集します。後ろから1桁目の処理を行って、eを加算する置換え処理です。
![スクリーンショット 2022-10-20 13.14.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/625201fe-df9d-5cdd-ba1a-3b11c62b2c4a.png)

[プレビュー]します。
![スクリーンショット 2022-10-20 13.15.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/735362ce-83f4-6abd-7eb3-2761ae63c3ce.png)

#### 注意点

6桁以上が想定される場合にはストリームを拡張してください。

## 4.参考情報

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
Azure Pipelines self-hosted agent

Azure DevOpsでCI/CDを実行する際には、Azure Pipelinesを使います。そして、Azure Pipelinesで自動テストや自動ビルド等の処理をするためには、その処理をするためのコンピューターが必要になります。"Microsoft-hosted agents"というマイクロソフトが用意しているWindows/Linux/macOSのものがあり、それを利用することが多くの場合一番簡単ではありますが、状況によっては自分で"self-hosted agent"を用意することが必要になります。

# Self-hosted linux agentを設定する手順
Self-hosted linux agentを設定する公式資料の手順は以下になります
https://learn.microsoft.com/azure/devops/pipelines/agents/v2-linux?view=azure-devops

基本的には、上記の手順に沿って作業を行えば、設定することができましたが、2022年10月26日時点の内容では、"Download and configure the agent"という部分に、コマンドラインでダウンロードする手順がなかったため、以下に参考情報として私が使ったコマンドを共有します。

# Download and configure agent from the Linux command-line
公式ドキュメントの手順に従い、以下の画面まで行くと、"Download the agent"という部分で"Copy URL to clipboard"というボタンから、agentをダウンロードするためのURLをコピーすることができます。それを使ってAzure Pipelineの実行基盤として使おうと思っているLinuxマシンで、`wget <コピーしたURL>`をするとダウンロードできます。ダウンロード移行は公式ドキュメントの手順に従えばAzure PipelinesのLinuxのself-hosted agentが設定できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008844/ab28fdab-9e26-508b-a778-d9cea39e00bb.png)

多くの場合、Azure Pipelineで実行予定の内容によって、追加でLinuxマシンにツールをインストールする必要があります。例えば、.NETのアプリをビルドする際には、.NET SDK/Runtimeのインストールが必要になります。

# ところで
ところで、私はLinuxマシン作成とアクセスに以下のコマンドをAzure Cloud ShellのBashから実行しました。
```　
RG=rg-pipelineagent
LOC=japaneast
VM=vm-pipelineagent

az group create --name $RG --location $LOC

az vm create \
  --resource-group $RG \
  --name $VM \
  --image UbuntuLTS \
  --admin-username azureuser \
  --generate-ssh-keys

ssh azureuser@<Public IP Address>
```
Djangoでフォームを送信する

# はじめに
こちらの記事の続きで書いてます。

https://qiita.com/Nats72/items/d3ad8d88e9ee1e3f0fde

# ルーティングの記述
以下のURLパターンを追記。
```python:./app/urls.py
urlpatterns = [
    ...略...
    path("form", views.form, name="form"),
]
```

# ビューの記述
以下を追記。
```python:./app/views.py
def form(request):
  params = {}
  if(request.method == 'POST'):
    fluit = request.POST['fluit']
    params = {
      'fluit': fluit,
    }
  return render(request, 'app/form.html', params)
```
`if(request.method == 'POST'):`は、POSTで受けた場合のみ、if文の内容を実行するという処理になります。
`fluit = request.POST['fluit']`は、POSTのパラメータ(fluit)に入っている文字を、Pythonの変数(fluit)に格納します。
`params = {}`で初期化してますので、POSTで受けていない場合は空データのparamsがHTMLテンプレートに渡されます。

# HTMLの記述
```html:./templates/app/form.html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>FormTest</title>
</head>
<body>
  <h1>FormTest</h1>
  <p>フォーム送信テスト</p>
  <form action="{% url 'form' %}" method="post">
    {% csrf_token %}
    <label for="fluit">好きなフルーツは？: </label>
    <input id="fluit" type="text" name="fluit">
    <input type="submit" value="送信">
  </form>
  {% if fluit %}
  <p>{{ fluit }}</p>
  {% endif %}
</body>
</html>
```
`<form action="{% url 'form' %}" method="post">`
こちらは送信先設定です。`{% url 'form' %}`は、views.pyから与えられた引数で送信先URLに書き換えられます。

`{% csrf_token %}`
正しいフォームから送られた値なのかチェックする仕組み（CSRF対策）で用いられます。

`{% if fluit %}`〜`{% endif %}`
templateの中にif文を記述することができます。
この場合ですと、fluitにデータがなければif文の中身を表示しません。
あれば、fluitに入っている文字を表示します。
Delta Live Tablesのアップグレードを理解し管理する

[Understand and manage Delta Live Tables upgrades \| Databricks on AWS](https://docs.databricks.com/workflows/delta-live-tables/delta-live-tables-manage-upgrades.html#delta-live-tables-upgrade-process) [2022/8/11時点]の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

Delta Live Tablesのクラスターは[Databricks Runtime](https://docs.databricks.com/runtime/dbr.html)をベースとしたランタイムを使用します。Databricksはプラットフォームに対するエンハンスメントとアップグレードをサポートするために、自動でDelta Live Tablesランタイムをアップグレードします。あらゆるソフトウェアのアップグレードと同様に、Delta Live Tablesランタイムのアップグレードは、お使いのパイプラインを実行する際にエラーや問題を引き起こす場合があります。本書では、近くリリースされるDelta Live Tablesランタイムを用いてパイプラインをテストするためのベストプラクティスと、パイプラインの安定性を強化するDelta Live Tablesの機能を説明します。

# Delta Live Tablesランタイムチャンネル

Delta Live Tables設定の`channel`フィールドは、パイプラインを実行するDelta Live Tablesランタイムのバージョンをコントロールします。サポートされている値は以下の通りです。

- `preview`は、間も無く変更されるランタイムバージョンを用いてパイプラインをテストするためのものです。
- `current`は、現行のランタイムバージョンを使用するためのものです。

デフォルトでは、パイプラインは`current`ランタイムバージョンを使用します。プロダクションワークロードでは`current`ランタイムを使用することをお勧めします。次のランタイムバージョンを用いてパイプラインをテストするためにどのように`preview`設定を使用するのかに関しては、[次のランタイムバージョンを用いたパイプラインのテストを自動化する](#次のランタイムバージョンを用いたパイプラインのテストを自動化する)をご覧下さい。

# Delta Live Tablesランタイムのアップグレードプロセス

Delta Live TablesはあなたのDatabricksワークスペースのランタイムを自動でアップグレードし、アップグレード後のあなたのパイプラインの健康状態をモニタリングします。Delta Live Tablesがアップグレードによってパイプラインをスタートできないことを検知した場合、パイプラインのランタイムバージョンは既知の以前のバージョンに戻され、自動で以降のステップが起動されます。

:::note info
**注意**
Delta Live Tablesはプロダクションモードで実行されており、チャンネルが`current`に設定されているパイプラインでのみバージョンの差し戻しを行います。
:::

- パイプラインのDelta Live Tablesランタイムは既知の以前のバージョンに固定されます。
- Delta Live TablesのUIには、アップグレード失敗によってパイプラインには以前のバージョンが固定されたことを示すビジュアルなインジケーターが表示されます。
- Databricksサポートに問題がレポートされます。問題がランタイムのレグレッションである場合、Databricksが問題を解決します。問題がパイプラインで用いられているカスタムライブラリやパッケージである場合、Databricksは問題を解決するためにあなたにコンタクトします。
- 問題が解決されると、Databricksは再度アップグレードを行います。

# ベストプラクティス

## 次のランタイムバージョンを用いたパイプラインのテストを自動化する

次のDelta Live Tablesランタイムバージョンの変更がお使いのパイプラインにインパクトを与えないことを確認するために、Delta Live Tablesのチャンネル機能を使ってください。

1. ステージングのパイプラインを作成し、チャンネルを`preview`に設定します。
1. Delta Live Tables UIで、週次でパイプラインを実行す流スケジュールを作成し、パイプラインの失敗時にメールの通知を受け取る様にアラートを有効化します。
1. 失敗時の通知を受け取り、問題を解決できない場合には、Databricksのサポートチケットをオープンします。

## パイプラインの依存関係

Delta Live Tablesはパイプラインにおける依存関係をサポートしています。例えば、`%pip install`コマンドを用いて任意のPythonパッケージをインストールすることができます。また、Delta Live Tablesはグローバルあるいはクラスタースコープの[init script](https://qiita.com/taka_yayoi/items/88cb46be00a175085f87)をサポートしています。しかし、これらのパイプラインにおける外部依存関係、特にinit scriptはランタイムアップグレード時のリスクを増加させます。これらのリスクを軽減するために、パイプラインにおけるinit scriptの使用は最小限に留めてください。処理でinit scriptが必要な場合には、早い段階で問題を検知するためにパイプラインのテストを自動化してください。[次のランタイムバージョンを用いたパイプラインのテストを自動化する](#次のランタイムバージョンを用いたパイプラインのテストを自動化する)をご覧下さい。init scriptを使う際には、テストの頻度を高めることをお勧めします。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
圏論を使った簡易暗号 ; How Google Works (エリックシュミット社長の著書より) (by Slack翻訳のKiara)

はじめに

![Screen Shot 2022-10-27 at 5.33.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/119e1091-4bd2-5075-26c3-c9ab9613b85e.png)


- Googleの元社長エリックシュミットの著書 : How Google Works では冒頭に"フィンランド”が登場する
- Microsoft Officeに対抗してGoogle Docs/Sheetを開発したときの秘密のコードネーム
- カリフォルニアから見てシアトルが北にあるから、北にある国でフィンランドと名付けた

---
どうやって

- 私の会社は渋谷にあるので、実際のお客さんではないが、Panasonicの話をするならば、大阪にあるので、同様に西にあるのでChinaというニックネームでもよい
- 圏論はCategoryTheoryともいうが、A to Bの対応表なので、MappingTableと私は呼んでいます。
- この際、China = 西の会社がわかったとしても、西にそもそもたくさんの都市がありすぎ、たとえば名古屋や京都にもたくさんの企業がありすぎるので、ChinaからPanasonicはかなりたどりにくいです
- 少なくとも家電のP社というよりよほどマシです

---

可視化：


Mapping Table 1 : 1 vs 4 
(圏論は群論と違いNvsNの正方形マッピングじゃなくてもOK)

![Screen Shot 2022-10-27 at 5.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/bb2fca87-7542-9c21-dfef-848ed4579984.png)

❤️=Shibuya
💙=East=But…many!
🧡=West=But…many!
💛=South=But…many!
💚=North=But…many!

Mapping Table 2 : 1 vs 4 

![Screen Shot 2022-10-27 at 5.37.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/76304/75c1b43a-4ec8-523c-979b-39137c2c4737.png)


❤️=West
💙=Nagoya=Toyota?  But…many!
🧡=Kyoto=Kyocera?  But…many!
💛=Hiroshima=Matsuda?  But…many!
💚=Fukuoka=Ichiran?  But…many!


Conclution :

Mapping Table 1 : ❤️→💙🧡💛💚 Many!
Mapping Table 2 : ❤️→💙🧡💛💚 Many!
逆に辿るのはすごーく難しい！



---
結論

この方法は複数の拡張性がありますよね。
単純だけど便利なので、是非考えてみてください。

ご感想はTwitter@ishiidまで

https://twitter.com/ishiid
コマンド定義を実行中にエラーが発生しました。詳細については、内部例外を参照してください

`EntityCommandExecutionException`

## Error message
コマンド定義を実行中にエラーが発生しました。詳細については、内部例外を参照してください

このエラーは、フレームワークが定義するエンティティが、実際のデータベースと一致しないときに発生する

## 解決方法
`.edmx`ファイルや`designer.cs`などによって定義されたファイルと、データベースの列などに乖離がないかを確認

![systemDataEntityCommandExecutionException.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/482880/65277e4f-273a-a784-e7b1-0c72dd092433.png)

キャッチしたエラーダイアログで、詳細の表示をみると更に内部の例外`InnerException`が確認できる

## Reference
https://learn.microsoft.com/ja-jp/dotnet/api/system.data.entitycommandexecutionexception?view=netframework-4.8
Stripeの決済時間を変更する方法

## ■目的
毎日決済が成功しているかを朝 9:30ごろに確認するため、その時間までにその日の決済が行われるようにしてほしい。
10/18 21:00:00 に決済されるものを -> 10/18 09:03 に決済されるようにしたい。

## ■補足
Stripeは基準の時間がUTC時間に準じて操作となるため、日本時間0:00〜08:59に決済される取引については、月初の決済日の場合、日に応じて決済日が変更される可能性があります。
https://tech.stmn.co.jp/entry/2021/01/28/093349

そのため、0:00〜08:59 に決済されるようにする候補がなくなり、9時過ぎに変更するということになりました。

## ■始めに考えたこと
無料期間を設定し、無料期間の終了のタイミングを決済日の9:03 に設定する方法を検討しました。

## ■問題点
しかし、この場合、カスタマーポータルをお客様が開いた時にプランが無料期間中という表示がなされます。
また、更新した時点で0円のインボイスが発生し履歴に残ります。
これでは、サブスクリプションを契約しているクライアント様に状況を説明する必要があり、不採用となりました。

## ■そこで考えた結果
Cronを使って、対象のサブスクリプションに対して、
```php
'billing_cycle_anchor' => 'now'
```
を利用することを検討しました。
対象のサブスクリプションに対して、「今更新して！」という指示を与えるということです。
指定の時間 (毎日9:03頃)にこのプログラムを走らせるのは、人間業ではないなと考えていたところ、Cron を思い出しました。
たまたま、契約しているサーバーがX Server ということもあり、
特にお客様が何か新しいサービスを契約する必要がなかったのも非常に良かったです。

＊cronとは、簡単にいうと自動で指定の時間に指定のプログラムを実行すること
https://e-words.jp/w/cron.html

## ■やり方思いついたけど、そのほかにも検討材料たくさんあります。

### ・対象のサブスクリプションの判定方法
対象のサブスクリプションの判定について非常にデリケートに行いました。
Stripeのサブスクリプションを探す方法で
```
$useSubscriptionAll = $stripe->subscriptions->all 
```

というものがありますが、
この$useSubscriptionAll の中に、対象ではないサブスクリプションが絶対に入ってはいけないため、allの条件を調べました。

すると、
current_period_end{gte、lte} を利用すればできそうということがわかりました。
gte は その時間以降に決済されるもの
lteは その時間までに決済されるもの
ということとなります。
https://stripe.com/docs/api/subscriptions/list

対象のサブスクリプションを抽出するために。。。
```
$useCurrentDay_Start = strtotime(date("Y/m/d 09:04:00"));
$useCurrentDay_End   = strtotime(date("Y/m/d 23:59:59"));
$useSubscriptionAll  = $stripe->subscriptions->all(
    ['limit' => 100,
    'status' => 'active', 
    'current_period_end' => [
            'gte' => $useCurrentDay_Start, 
            'lte' => $useCurrentDay_End
        ]
    ]
);
```
9:03以前に決済されたものを含むと1日に2回決済されるため 9:04 としています。

この取得した配列の中から、さらに条件分岐を行います。
一番は、10/31 に決済されたものを11/30 に決済しないようにするということです。
これは、10/31 の次の決済日は、11/30 ですが、11/30 に 更新プログラムを実行した場合、次の決済日は、12/30 となります。

そのため、一旦はサブスクリプションの作成日と決済日が一致しないものについては除外するようにしました。

条件分岐後取得したサブスクリプションに対して、
```
$usesubscriptions = \Stripe\Subscription::update($useArrayId, [
	'billing_cycle_anchor' => 'now',
	'proration_behavior'   => 'none',
	’metadata'             => ['payment_time' => 'updated’]
]);
```

更新すると自動的に2回目以降の決済が9:03頃に実行されるようになりました。
＊更新を実行したサブスクリプションに対して、metadata でフラグを立てています。

## ■またまた問題点が発生 (3回目以降の決済について)
本プログラムを実装してから気づいたんですが、
Stripeのサブスクリプションというのは、
決済時間(9:03)に、インボイスの下書き作成 ->
1時間後 (10:03) に請求書が確定 -> 
請求書が確定後に登録済み支払い方法で決済確定
となります。

そのため、上記のままでは、3回目以降の決済が10:03 になるという事態が発生しました。。。

3回目以降の決済が9:03 になるように最初の決済を8:03 に変更するということも検討しましたが、時差の関係で、あまり前向きに進めるべきではない・・・

ということで、今度は、webhookを利用して、3回目以降の9:03 の下書きのインボイスが作成されたタイミングで、強制的に支払いを実行するプログラムを実装することにしました。

```
$stripe->invoices->pay
```
を利用することで、指定のインボイスを即時決済させることが可能です。

これで、3回目以降の支払いについても、
請求書の下書きが作成されたタイミングで、(invoice.created)を受信するwebhookを作成し、
取得したイベントから、3回目以降の決済であるかどうかの条件分岐を行い、対象のインボイスIdを取得し、
```
stripe->invoices->pay (対象のインボイスId)
```
で実装が出来ました。

## ■終わりに
決済時間を変更するにあたり無料期間を設定するとその履歴が残るということは盲点でした。
そのため、今回はcronを利用し、指定の時間に更新プログラムを実行するようにしました。
気づけてよかったです。

Stripeを通じてクライアント様のお役に立ててよかったです。
Stripeは状況に応じて、クライアント様のご都合に合わせて、
かなり自由に設定できるのは間違いなく、まだまだ発見がありそうです。
とても奥が深いStripe。

これからもたくさんプログラムを書いてお役に立っていこう。
長くなりましたがありがとうございました。
Python(など)で量子力学をしてみよう。

"量子コンピュータ"なんてのがバズワードとして世間を賑わすようになってきましたね。博士過程も終り、ポスドクが始まるまで時間があるので、私が組んだ、量子力学のシミュレーション用のスクリプト達を下記リンクで紹介しました。

https://jp.magicode.io/RandomScientist/articles/89d59c529cf8457789423e5699d83bf0

1. クリフォード回路
    1. [量子クリフォード回路 Part 1. パウリ紐演算子とは？](https://jp.magicode.io/RandomScientist/articles/b888a33888ff404297d71ced2f190013)
2. イジングモデルをつかった2次レニーエントロピーの計算
3. パーコレーション相転移のシミュレーション
4. 刈り込みウィグナー近似を使ったスピンのダイナミクスのシミュレーション(有限のヒルベルト空間に対応)。
5. 平均場近似を使った半古典スピンのダイナミクスのシミュレーション。 
6. 平均場近似を使った自己一貫性を保った基底状態ソルバ

を紹介しています。


ソースコードは[私のリポジトリ](https://gitlab.com/TomohiroHashizume)から見る事ができます。
Rails7にpostCSSを導入しよう！

# 前提
- 事前にyarnのインストールが必要
どうやら「Rails new」時に、`postcss`や、`esbuild`が「yarn」を使用してインストールされる模様
※別にnpmでいいや〜の私はこのせいで少し戸惑った💦

## プロジェクトの作成
```bash
rails new . -j esbuild -c postcss
```
- jオプションで`JavaScript`のビルダー指定
- cオプションで使用するCSSフレームワークに`postCSS`を指定

色々インストールされる（適当）

### package.jsonにscriptsが登録
`yarn` + 以下のコマンドで、ビルド処理が可能。
- `yarn build` => JavaScriptのバンドル
- `yarn build:css` => CSSファイルのバンドル処理

但し、Rails7には`bin/dev`コマンドが用意されているため、こちらを使用するのが一般的。
（CSS,JSの変更を検知して、自動でビルド処理してくれる優れもの）

`gem "jsbundling-rails"` と `gem "cssbundling-rails"`を使用しているよ〜

```json
"scripts": {
    "build": "esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets",
    "build:css": "postcss ./app/assets/stylesheets/application.postcss.css -o ./app/assets/builds/application.css"
  } 
```

## ビルド
### CSS
```bash
$ yarn build:css
yarn run v1.22.19
$ postcss ./app/assets/stylesheets/application.postcss.css -o ./app/assets/builds/application.css
✨  Done in 1.09s.
```

### JavaScript
```bash
yarn build
yarn run v1.22.19
$ esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --public-path=assets
```

## PostCSSの設定
プロジェクトのルートディレクトリに、`postcss.config`が作成されています。
```javascript
module.exports = {
  plugins: [
    require('postcss-nesting'),
    require('autoprefixer'),
  ],
}
```
デフォルトでは、以下のプラグインを読み込んでいる
- `postcss-nesting`
=> CSSのネスト記法をサポート

- `autoprefixer`
=> ベンダープレフィックスの補完

このファイルに登録したプラグインが`build:css`時に実行されるよ〜

※　プラグインを追加登録したい場合は、従来通り、`npm / yarn`でインストールし、`postcss.config.js`に登録

## PostCSS便利なプラグインについて
- `autoprefixer`
デフォルトで実装されている
ベンダープレフィックスを自動付与

- `postcss-nested`
デフォルトで導入されている`postcss-nesting` では、ネストされたクラス属性へのスタイル適用が行えないため、`Sass`に慣れた私はこちらを使用している。

- `postcss-import`
`@import`記法をサポートしてくれる。ファイル分割が可能となる。

- `cssnano`
CSSをminify処理してくれる。本番環境では必須。

- `stylelint`
CSSのリンター。
**他のプラグインとは導入方法が異なるので、下で別途解説**

## Stylelint 導入方法
* インストール
```bash
npm install stylelint --save-dev
```
* プロジェクトのルートフォルダに、`.stylelintrc.json`を作成
    - 独自ルールを`"rule"`でオーバーライド
    - 基本的なコーディングルールを`stylelint-config-standard`から継承
※事前に`npm install stylelint-config-standard --save-dev` が必要
```json
{
    "extends": "stylelint-config-standard",
    "rules": {
        "indentation": 2,
    }
}
```

- Stylelintの実行用スクリプトの登録
`package.json`に以下を追記
```json
"scripts": {
    "lint:css": "stylelint ./app/assets/stylesheets/*.{postcss,css,scss,sass}",
    "lint:fix": "stylelint --fix ./app/assets/stylesheets/*.{postcss,css,scss,sass}"
  },
```

以下のコマンドで`stylelint`の実行が可能
- `lint:css` -> コードの検証
- `lint:fix` -> コードの検証+構文の修正

## まとめ
以上で作業完了です〜
未経験者の転職市場

初投稿。記念の投稿であるが、本日転職市場について語ろうと思った。
なぜならば先日、とある学習サイトからとあるリクルート会社からカジュアル面談のオファーを受けたことがきっかけである。

そして本日、初のカジュアル面談ってものを経験した。
数年内での転職は考えていないが、「未経験者」の転職マーケットについて聞き取ることができた。
そこでその「未経験者」の転職について気づきも含めて書いていく。

といっても私もシステム開発に携わって約半年。自分が経験者なのか未経験者なのか。前者でも後者でもある。
その定義についてずって疑問に思っていた。何年したら経験者といえるのか、呼ばれるのか。
その問いについて、本日面談頂いた方からの返答は

「３年」

思っていたより少し長かった。:thinking:
まああくまで転職市場における時間である。
要はシステム開発に携わって「３年」は未経験者同等の扱い、石の上にも三年ってことですね。
加えて、３年間で「自力で実装できるコーディングスキル/経験」は絶対条件であり、
さらに「詳細設計」「テスト」の２分野が同等に求められている。
（要件定義、保守メンテはその次のステップとも聞けました）

そんなもん、３年で経験し習得できる人いるのかよ！って率直な感想です。
３年超の経験者の皆さんはどう感じますか？


ポテンシャル採用、、、このフレーズでも盛り上がりました。
年齢（新卒、それ同等）の要因が大きく、２０代半ばまでなのかなって私自身の思っておりました。
本日面談頂いた方からの回答は
”「ポテンシャル採用」は年齢も大きいが、スキル面の意味もある。例えばＣ言語の経験があるが、自社が採用している技術はJava。そのミスマッチを本人が早々にキャッチアップしてくれる（であろう）能力をポテンシャルと呼ぶ”

なるほどの一言でした。

この業界、常に勉強って改めて実感できた１日でした。
（なぜ経験浅い半年程度の未経験者カテゴリーの私に連絡をしたのか、、、疑問は残るが、あえて聞かず情報収集に努めた面談となりました）:smiley:
Python3.11がどれくらい高速化したのか

# はじめに
Pythonといえば人口の多さとライブラリの豊富さと情報の多さが強みで
初心者でも簡単に実行できるしWebフレームワークから機械学習までなんでもOKな万能言語

ただひとつ問題点を上げるなら実行速度がナメクジ
C言語もこれにはニッコリ

ところが今回の3.11ではこれが従来比平均1.25倍らしい
すげえ

# さっそく試してみた

Pythonで重たい処理といえばforループとListへのappendだと思ってます
なので適当に100万回forループさせて処理速度を計測してみました

```python
import time

s = time.time()
l = []
for i in range(1000000):
    l.append(i)

print(time.time() - s )

```
比較したのはPython3.10
それぞれ10回実行した結果とその平均が下記

||3.10|3.11|
|--:|--:|--:|
|1|0.151611089706420|0.110505104064941|
|2|0.127127647399902|0.110261678695678|
|3|0.165858030319213|0.109783649444580|
|4|0.134609222412109|0.126979351043701|
|5|0.142301082611083|0.126281976699829|
|6|0.141349554061889|0.109888315200805|
|7|0.126144647598266|0.109980344772338|
|8|0.157423019409179|0.121222496032714|
|9|0.125299692153930|0.115431547164916|
|10|0.125424385070800|0.125715732574462|
|**平均**|**0.139714837074279**|**0.116605019569396**|

うん、多分1割くらい高速化したと思います

キャッシュとかよくわからんですが

あと3.11ではエラーのときの強調表示（^^^^）が出るようになったっぽいです
```text
Traceback (most recent call last):
  File "C:\Users\test\test.py", line 2, in <module>
    print(fuga)
          ^^^^
NameError: name 'fuga' is not defined
```

# おまけ
ところでWindowsのPythonってどこからインストールしてますか？
Pythonの公式サイト？？
私はMicrosoftStoreからワンクリックでインスコしてるのですが、これって公式で配布されてるのと違いってあるのだろうか？
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606574/7c79c810-dc10-b173-a937-43687b47bdf2.png)


# 参考
Python3.11における変更点の詳しいことは安定のGIGAZINEがまとめていました
https://gigazine.net/news/20221026-python-3-11-released/
Transit Gateway Multicast とは

## 勉強前イメージ

transitgatewayの一つ？
VPCのタブで見るけどわからんね？
同時に送る？


## 調査

### Transit Gateway Multicast とは

VPCのtransit gatewayの項目としてあるもので以下が実際の画像になります。

![1Transit Gateway マルチキャストドメイン _ VPC Management Conso.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/38d403e1-3359-43bf-60bc-38d8bbde2ad3.png)


そもそもマルチキャストとは複数のノードに対して一つのデータを同時に送信することを指します。
テレビ会議や動画配信などでトラフィックを効率よく伝送するためによく使われています。

Transit Gateway Multicastはマルチキャストアプリケーションを構築して
複数のVPCにデータを分散、配信することが簡単にできるようになります。

### 用語

- マルチキャストドメイン

マルチキャストネットワークをさまざまなドメインに分割して複数のマルチキャストルーターとして稼働できます。

- マルチキャストグループ

マルチキャストトラフィックの送信元・受信側のセットを識別します。

- マルチキャストソース

マルチキャストトラフィックを送信する送信元のENIを指定します

- マルチキャストグループメンバー

マルチキャストトラフィックを送信する複数のENIを指定します

## 勉強後イメージ

配信とかの環境をあまり知らないのもあるけど
複数のVPCに分散して配信できるのね。

## 参考

- [AWS Transit Gatewayがマルチキャストに対応！](https://hacknote.jp/archives/55080/)
[SwiftUI] 超シンプルにボタンアクションで画面遷移を実装する（もどるボタンなし）

確認してませんがコピペでいけると思います。ダメだったらすいません...

    struct ContentView: View {
            
        //画面遷移の時に使用するbool値
        @State private var isPresented: Bool = false
    
        var body: some View {
            Button(action: {
                isPresented = true //trueにしないと画面遷移されない
            }) {
                Text("NextViewへ")
            }
            .fullScreenCover(isPresented: $isPresented) { //フルスクリーンの画面遷移
                NextView()
            }
        }
    }

    struct NextView: View {
            
        var body: some View {
            Text("NextView")
    
        }
    }
    

SwiftUI触ったことないけど、swiftやってたし余裕やろって思って、全画面作った後に画面遷移を実装しようとしたんですが、想像以上にわかりづらかったり実装できなかったりこれっていう情報がありませんでした。

なので、自信の忘備録も兼ねて残しておきます。

どなたかの参考になれば幸いです。
CORS（コルス）を理解する

# 概要
サーバにリクエストを飛ばすと、レスポンスとして403エラーが返ってくるなんて経験ないでしょうか？
403エラーの原因の一つとしてCORSエラーというものがあります。
今回は備忘録も含めそのCORSの意味と解決方法を簡単にまとめてみました。

# そもそもどんな時に発生するエラー？
主にクライアントからCORS許可の設定をしていないAPIを呼び出す際に起こるエラーです。
以下が、CORSエラーの例です。
![スクリーンショット 2022-10-26 22.55.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664989/d3de1885-db29-96ae-05c2-60f044d42bc0.png)

# オリジンとは
CORSを理解する上で、オリジンの意味を知っておくとイメージがつきやすいかと思います。
オリジンとはURLの**スキーム（プロトコル）**、**ホスト（ドメイン）**、**ポート**によって定義されます。

``http://example.com：8080/app1/index.html``　の場合、以下のように分類できる。
・スキーム：`http`
・ホスト：`example.com`
・ポート：`8080`

+ **同一オリジンの例**
スキーム（http）及びホスト（example.com）が同一のものは同一オリジン
（例）
`http://example.com/app1/index.html`
``http://example.com/app2/index.html``


+ **異なるオリジンの例**
スキーム（http）及びホスト（example.com）が異なるもの
（例1）スキームが異なる
``http://example.com/app1``
``https://example.com/app2``
（例2）ホストが異なる
``http://example.com``
``http://www.example.com``
（例3）ポートが異なる
``http://example.com``
``http://example.com:8080``

# CORSとは
CORS(コルス)とは、Cross-Origin Resource Sharing（オリジン間リソース共有）の略で、あるオリジンで動作しているWEBアプリケーションから異なるオリジンで動作しているリソースへのアクセスを許可することを言います。

要するに、異なるオリジンで動いているリソースへの許可設定を行わないと、WEBアプリケーションからのアクセスを許可しないよ！というわけです。

私の場合、以下の構成でアプリケーションを開発していたため、ポートが異なることでCORSエラーに遭遇していました。。
トラウマです・・・。
![スクリーンショット 2022-10-26 23.45.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664989/bfdefe3b-b812-f2f4-0d51-de0ebab4c11d.png)

フロントエンド：`http://localhost:3000`
バックエンド：`http://localhost:8080`
⇨同じローカル環境だけど、ポートが異なるためオリジンが異なる。
⇨CORSの対象になる！

# 原因
では、原因は一体なんでしょうか。
実際のエラーを見てみると・・・
![スクリーンショット 2022-10-26 23.23.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664989/1b1512a8-f731-4a5d-77d1-278e954e44d1.png)
エラー内容としては、`Access-Control-Allow-Origin`のヘッダーがないよ〜と書いてあります。
そこで、レスポンスヘッダーを開発者ツールのネットワークタブで確認してみると・・・
![スクリーンショット 2022-10-26 23.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2664989/bcc16d94-e674-f4ac-2f78-adbe27e69df9.png)
たしかに記載の通りAccess-Control-Allow-Originヘッダーがない・・・！

つまり、レスポンスヘッダーにAccess-Control-Allow-Originを設定してあげればよいということになります！

# 解決方法
原因がわかったので、レスポンスヘッダーに対して`Access-Control-Allow-Origin`を設定するように呼び出し先のAPIに適宜記述すればOK。
私の場合、ReactとSpringBootでの開発のため今回はSpringBootでの設定方法を紹介します。

SpringBootでの設定方法は以下になります。
```LoginController.java:
@CrossOrigin(origins = "http://localhost:3000")
@RestController
@RequestMapping("/api/login")
public class LoginController {

	@Autowired
	private LoginService loginService;

	/**
	 * Initialize.
	 * 
	 * @return
	 */
	@GetMapping
	public ResponseEntity<LoginResponseDto> init() {

		try {
			return ResponseEntity.ok(loginService.init());
		} catch (Exception e) {
			return new ResponseEntity<>(HttpStatus.CONFLICT);
		}

	}
}
```
上記ソースはAPIのコントローラ部分の記載になります。
`@crossOrigin`に対し`http://localhost:3000`を設定することで、APIとしては`http://localhost:3000`からのアクセスを許可しますよという意味のレスポンスヘッダー（Access-Control-Allow-Origin）を返すことになります。

これで、`http://localhost:3000`から`http://localhost:8080`のリソースへのアクセスを許可する設定ができ、CORSエラーも解決できました！

CORSの設定は他にも、設定ファイル等で行うこともできますが、CrossOrignアノテーションでCORS設定をする方法が一番シンプルだと思います。

# まとめ
今回はCORSについてその意味と解決方法をみてきました。
私自身、ローカルで開発していた際にポートが異なっていたためCORSエラーに遭遇し、トラウマになっていました。
同じように困っている人のお役に立てれれば幸いです。
【Rails】本番環境での背景画像表示で失敗しないために(background-image: image-url)


# はじめに
備忘録で書いてるので間違いがあってもご容赦下さい。
むしろ指摘していただけると助かります。

# 環境
Rails 6.1.x　


# やりかた
対象となる背景画像を hogehoge.jpgとした場合
`/app/assets/images/hogehoge.jpg` のpathで配置する。

`app/assets/stylesheets/application.scss` に対してimage-urlを使う。

```app/assets/stylesheets/application.scss
background-image: image-url('hogehoge.jpg');
```

こうすることで、
developmentでは `app/assets/images` 配下の対象ファイルを、
productionでは `public/assets`配下の「アセットパイプラインによってプリコンパイルされた対象ファイル」を取りに行く。


# 注意点
`image-url` は 
app/**assets**/stylesheets/application.scss では動くが、
app/**javascript**/stylesheets/application.scss では期待している動作はしてくれないようだった。
（cssファイルでも不可）

また、背景画像を `public/images` 配下に配置してもdevelopmentでは表示されるはずだが、
ここに置いてある画像ファイルはproductionでアセットプリコンパイルされないので表示されないはずです。
ターミナル内のコピー＆ペースト

 ### xsel --clipboard --input

`ubuntu2204LTS`

調べものしている時に偶然見つけた、端末でコピー＆ペーストが出来るコマンド。
macはpbcopyコマンドがあるが、linuxだとxsel --clipboard --inputと長いので
bashの設定ファイルにエイリアスを設定した。

```
#cat ~/.bashrc
alias pbcopy='xsel --clipboard --input'
alias pbpaste='xsel --clipboard --input'
```
```
~$ cat test.txt2 
taro hanako
~$ cat test.txt2 | pbcopy
~$ pbpaste
taro hanako
```

端末内ではマウスを使わないとコピー＆ペーストが出来なかったので、重宝するかもです。
Vue3の単一ファイルコンポーネント上のTypeScript書き方まとめ

# はじめに
実務でVue3 × Compositon API × TypeScriptを扱ってきて、よく使う型付けの方法をまとめました。Vue3でプロジェクトを作成してTypeScriptを初めて扱う方の役に立てる記事を残そうと思います。
TypeScriptの記事はたくさんありますが、情報が古かったり小難しい説明がされていて結局どうやって書けばいいか分からないことも多いと思います。
**いいからVue3 × Compositon API × TypeScriptの書き方教えてくれ！** と思って記事を行ったり来たりしている方におすすめです。

# この記事の対象者
- TypeScript初心者
- Vue3 × Compositon API × TypeScriptでプロジェクトを作成している人
- Vue3の単一ファイルコンポーネント(.vue)上でTypeScriptを扱う方

# 以下単一ファイルコンポーネント上のTypeScript書き方まとめ
```TypeScriptExample.vue
<script setup lang="ts">
import { ref } from 'vue';

// テキスト
const stringSample = ref<string>();
stringSample.value = 'string';

// 数字
const numberSample = ref<number>(1);
numberSample.value = 2;

// 配列(型単体)
const arrayExample = ref<number[]>([1, 2, 3]);
arrayExample.value.push(4);

// 配列(型複数)
const mixArrayExample = ref<(number | string)[]>([1, 'string']);

// 配列(ジェネリクス)
const genericsArrayExample = ref<Array<string | number>>([2, 'apple']);

// 連想配列 キー名が決まっている場合
const fixedKeyDictionaryExample = ref<{
    name: string,
    count: number,
    unnecessary?: string
}>({
    'name': 'a',
    'count': 1,
});

// 連想配列 キー名が決まっていない場合
const randomKeyDictionaryExample = ref<{
    [key: string]: string | number
}>({
    'a': 1,
    'b': 'cc',
});

// DOM要素
const domExample = ref<HTMLElement | null>();
domExample.value = document.querySelector<HTMLElement>('.typescript-sample');

// interface
interface myInterface {
    name: string | null;
    count: number;
    isSet?: boolean;
    info: {
        status: string;
    } | null;
};
const interfaceExample = ref<myInterface[]>(
    [
        { name: 'test1', count: 1, info: { status: 'ok' } },
        { name: 'test2', count: 2, isSet: true, info: null }
    ]
);

// nullable対応
interface nullableInterface {
    title: string;
};
let nullableExample!: nullableInterface;
// let nullableExample: nullableInterface | undefined と同義 

// 戻り値が無い関数
const notReturnFunction = (x: string, y?:number): void => {
    console.log(x, y);
};

// 戻り値がある関数
interface returnFunctionInterface {
    title: string;
};
const returnFunction = (value: returnFunctionInterface): string => {
    return value.title;
};
</script>
```

以上になります。そのうち説明を追記していきます。

[Twitter](https://twitter.com/manzoku_bukuro)もやってます。
Ubuntuを22.04にアップグレードしたら音が出なくなった場合の対応方法

## 現象

Ubuntuを22.04にアップグレードしたら音声出力デバイスが`Dummy Output`と表示され、音が出なくなりました。

## 対応方法

再起動をして変わらず、色々と調べてみたところ、以下のコマンドを実行し直すことができました。


```bash
sudo touch /usr/share/pipewire/media-session.d/with-pulseaudio
systemctl --user restart pipewire-session-manager
```

他に困っている人がいるかもなので、短いですが記事にしておきます。

## 参考サイト

https://askubuntu.com/questions/1403665/no-sound-output-devices-listed-after-upgrade-from-21-10-to-22-04
【初心者向け】SQL結合：実際の業務での使用イメージ

今日は内部・外部結合について。
書き方より、これらの結合が実際の仕事で
どう使われるかに重点おいて紹介していくよ！

個人的には内部・外部結合の書き方は以下のサイトがわかりやすいと感じました。
https://medium-company.com/%e5%86%85%e9%83%a8%e7%b5%90%e5%90%88-%e5%a4%96%e9%83%a8%e7%b5%90%e5%90%88-%e9%81%95%e3%81%84/
https://amg-solution.jp/blog/26287

ではこの内部・外部結合って実際の業務ではどう使われるのだろう。


上のサイトで使ったテーブルを例に紹介していこう。

下記はある駄菓子屋さんの売り上げに関する情報。

■childrenテーブル（買いに来る子供の情報）
|id    | name           | age  |
|-----:|----------------|-----:|
|    1 | たろうくん  　  |   10 |
|    2 | はなちゃん  　  |    6 |
|    3 | いっちゃん  　  |   12 |

■sweatsテーブル（おかし情報）
| id   |   sweat_name   | price | product_company |
|-----:|----------------|-----:|:--------|
| 1    | えまい棒       |   10 | A会社   |
| 2    | かっちゃんいか |   15 | B会社   |
| 3    | キャビツ太郎   |   40 | A会社   |
| 4    | 茎わこめ       |   60 | A会社   |
| 5    | ケッピーラムネ |  100 | B会社   |

■salesテーブル（売上情報）
※ 「sweat_num」カラムは駄菓子の売上個数 
| id   | purchase_date | child_id | sweat_id | sweat_num   |
|-----:|:----------:|-----:|---------:|:-------|
| 1    | 2020/8/1   | 2    |  1       |      1 |
| 2    | 2020/8/1   | 1    |  3       |      2 |
| 3    | 2020/8/2   | 3    |  1       |      3 |
| 4    | 2020/8/2   | 1    |  1       |      1 |
| 5    | 2020/8/3   | 3    |  2       |      3 |
| 6    | 2020/8/3   | 1    |  4       |      2 |
| 7    | 2020/8/4   | 2    |  1       |      1 |


ここで、駄菓子屋さんが
各製品の売り上げ情報を調べてほしいとお願いがありました。

さて、この時のクエリは。。。

``` 
SELECT sweats.sweat_name
      , sweats.product_company
      , sum(sweats.price * sales.sweat_num) as sale
FROM sweats
LEFT OUTER JOIN sales
    ON sweats.id = sales.sweat_id
GROUP BY sweats.sweat_name
	   , sweats.product_company
ORDER BY sweats.product_company
```

結果は。。
| id               | product_company | sale   |
|-----------------|:---------------:|-------:|
| えまい棒         | A会社           | 60     |
| キャビツ太郎     | A会社           | 160    |
| 茎わこめ         | A会社           | NULL   |
| かっちゃんいか   | B会社           | 45     |
| ケッピーラムネ   | B会社           | NULL   |

つまり、上のクエリで「LEFT OUTER JOIN」（外部結合）を使うのは
売上を上げているか上げていないか関係なく
各商品の売り上げを出すときに使うというわけだ。

この際、「INNER JOIN」を使用すると、
売り上げが上がっていない「茎わこめ」「ケッピーラムネ 」
は結果に出ない。

また仮に
・「茎わこめ」「ケッピーラムネ 」は8/5から発売
・このクエリを実行したのが「2020/8/20」
・8/1～8/10までの売り上げを集計
したとしよう。

その場合、上のようなクエリの結果で
「茎わこめ」「ケッピーラムネ」の売り上げがNULLになっているから
すくなくても8/5以降の売り上げデータがはいっていない、
ということに気づくこともできる。
（実際の業務では、必要なデータがそろっていないことも多い。
こういうときはお客さん（今回の場合は駄菓子屋さん）から
データをいただく必要がある。）

では、また違うトピックでお会いしよう！
先頭から文字列検索

## 目的
pythonで先頭の文字列のみを検索したく調査した。
ab, →abを対象とする。
下記2つの方法を組み合わせて解決できた。


## 先頭・末尾から抽出
先頭から始まる文字列、または、末尾で終わる文字列のみを抽出したい場合はメタ文字^（先頭にマッチ）, $（末尾にマッチ）を使う。

## 複数のパターンで抽出
複数のパターンのいずれかにマッチする部分を抽出したい場合は|を使う。正規表現パターンA、パターンBをA|Bのように記述する。

## 解決例
~~~
import re

s1 = 'abcccccabccab'
s2 = '→abccdfs→abf'
print(re.findall('^ab|^→ab', s1))
print(re.findall('^ab|^→ab', s2))
~~~
<出力>
['ab']
['→ab']
Next.jsエンジニアになるための学習旅路

# はじめに
近いうちにnext.jsを使って開発することになりそうなので、準備したことをメモしていく。
（このために学生時代に一瞬使っていたアカウントを掘り出してきた…）

もし同じように今から始める人がこの記事を見てくれているのであればぜひ一緒に頑張りましょう！
先輩エンジニアの皆様は「これをやるんや！」というコメントをお願いします。


# やること(予定）
大きく四段階で学習を進める。
※あくまで予定なので気分で変更するかも...

**第1段階**
・簡単な動くものを作ってみる
 　・基礎から始めてもつまらないのでとりあえず簡単なやつを作ってみる

**第2段階**
・HTTP、CSSをざっとおさらいする
・TypeScriptやる

**第3段階**
・Reactを学ぶ（初めてだから時間かかりそう....）

**第4段階**
・**Next.jsをやる！！**

# やったこと
## 第1段階
簡単な動くもの...
いくつか調べていたところ、なんともピッタリな記事があったのでとりあえず実践。
[NEXT.jsとReact Hooksを使ってTodoアプリを10分で作る](https://qiita.com/hiraike32/items/71b14755f56208a8a133)（投稿者さまに感謝！！）


よーしさくっと動いたぞ！
便利そう！便利そう...？便利なんか.........？

とりあえずわからないことが多すぎる。
知り合いのフロントエンドエンジニアにも人気があるしきっと便利に違いない。
ということで、とりあえず第二段階に進みます。

## 第1.5段階
「第2段階に進んだけど、PC2台使ってるから両方で環境構築しなきゃ...」
「環境構築するのめんどくさいな...」
「あれ、なんか簡単に環境そろえるやつあったような...」
「ど、どっかー！！！！！！」

ということで2段階に入る前にDockerに寄り道。
簡単に記事にまとめたのでこちらもぜひ。
・[遅くともやりたい！Docker初心者が頑張って基礎をまとめる](https://qiita.com/whiteeel/items/2c264c7fa7f45d091ff1)

## 第2段階
やったら書きます（今頑張ってます！たぶん）

TypeScriptだけでなく、JavaScriptも一緒にできそうなサイトを見つけたからTypeScriptはこのサイトでやろう
・[サバイバルTypeScript](https://typescriptbook.jp/)

## 第3段階
やったら書きます

## 第4段階
やったら書きます
Android Studio DolphinでActivity#registerForActivityResultを認識してくれない問題の解決方法

# 概要

Android Studio Dolphin | 2021.3.1 Patch 1でも（Chipmunkの時から）以下のようになる問題のワークアランドです。これはAndroid Studioのバグです。

![スクリーンショット 2022-10-26 22.52.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/10494/0977e9d2-0e4a-9ca8-5d10-25726010acdd.png)

# 解決方法

`(this as ComponentActivity)`とキャストすれば良いです。

```Kotlin
    private val launcher =
        (this as ComponentActivity).registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted: Boolean ->

        }
```

Android Studioが直ったら面倒なので、以下のExtensionを用意して対応してます。

```Kotlin
fun <I, O> Activity.registerForActivityResult(
    contract: ActivityResultContract<I, O>,
    callback: ActivityResultCallback<O>
) = (this as ComponentActivity).registerForActivityResult(contract, callback)
```
Pythonで動画からフレームレートを抽出する

## 目的
私が研究している人工知能では、動画からフレームレートを抽出して大量の画像データを取得しています。そのフレームレートの抽出方法をPythonを用いてここに残しておきます。

## ソースコード
```Python
import cv2
import os

save_dir="./hogehoge" #抽出した画像を保存するディレクトリを記載
cap=cv2.VideoCapture("./hugehuge.MP4") #読み込む動画のディレクトリ
if not cap.isOpened():
  sys.exit()
n= 0
while True:
    is_image,frame_img = cap.read()
    if is_image:
        # 画像を保存
        outfile=save_dir+"/"+str(n)+".jpg"
        cv2.imwrite(outfile, frame_img)
    else:
        # フレーム画像が読込なかったら終了
        break
    n += 1

cap.release()
print("ok")

```
## 解説
**読み込み先と保存先の指定**
```
save_dir="./hogehoge" #抽出した画像を保存するディレクトリを記載
cap=cv2.VideoCapture("./hugehuge.MP4") #読み込む動画のディレクトリ
```
./hogehogeと書かれているところにはフレームレートを抽出した画像を保存するディレクトリを指定します。
./hugehuge.MP4と書かれているところは、フレームレートを読み込むMP4動画のディレクトリを指定します。

***
```
if not cap.isOpened():
  sys.exit()
```
エラーチェックみたいなものです。詳しくはしらないですが、動画をうまく読み込めない場合、
プログラムを終わらせるみたいな感じだと思います。(あいまいですみません)
***
```
is_image,frame_img = cap.read()
```
cap.read()は、フレーム画像が読み込めたかをbooleanで返す変数と、フレーム画像の配列ndarrayのタプルが返されます。
is_image,frame_imgにはそれぞれの戻り値を格納しています。
それ以降はis_imageがtrueかfalseかで条件分岐です。
画像ファイルは、各ピクセルの色の値を行列値で表すので、ndarrayで返されるというわけです。
***
```
outfile=save_dir+"/"+str(n)+".jpg"
cv2.imwrite(outfile, frame_img)
```
保存先としてoutfileを宣言し、抽出した画像に名前を付けます。
今回はn=0から始まる値を連番として名前付けします。
なので抽出した画像のファイル名は0.jpg~n.jpgとなります。
imwriteでは、保存したいファイル名で抽出した画像の行列を保存しています。
***
```
cap.release()
print("ok")
```
最後に読み込んだ動画をリリースして、フレームレートの抽出が終わったらokと出力させて確認です。


お疲れ様でした！
LPG operation, ボッシュ自動車handbook 11版(67) p.886

Gasoline-engine operation with alternative fuels, LPG operation , ボッシュ自動車handbook 11版(67)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>
# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022
https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】
https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800
Gasoline-engine operation with alternative fuels, 886
# LPG operation
p.874
## Applications 
## Design 
## LPG systems 
## Components 
# Reference
[1] http://www.erdgas.info/erdgas-mobil/　
Zukunft Gas e. V.

[2] http://www.gibgas.de
gibgas 

[3]  T.Allgeier, J.Forster, 2nd international CTI Forum, Stuttgart, March 2007, Einspritzsystems Motormanagementsystem und Komponenten fur Erdgas fahrzeuge

[4] http://www.bmub.bund.de/themen/tuftlaerm-verkehr/luftreinhaltung/eev-staridard/

リンク切れ
https://www.bmuv.de


# 自己参考資料(self reference)
ボッシュ自動車ハンドブック 
https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9

ボッシュ自動車handbook(英語)10版　目次
https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook
https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

物理記事　上位100
https://qiita.com/kaizen_nagoya/items/66e90fe31fbe3facc6ff

数学関連記事１００
https://qiita.com/kaizen_nagoya/items/d8dadb49a6397e854c6d

言語・文学記事　１００
https://qiita.com/kaizen_nagoya/items/42d58d5ef7fb53c407d6

医工連携関連記事一覧
https://qiita.com/kaizen_nagoya/items/6ab51c12ba51bc260a82

通信記事１００
https://qiita.com/kaizen_nagoya/items/1d67de5e1cd207b05ef7

自動車　記事　１００
https://qiita.com/kaizen_nagoya/items/f7f0b9ab36569ad409c5

プログラマが知っていると良い「公序良俗」
https://qiita.com/kaizen_nagoya/items/9fe7c0dfac2fbd77a945

一覧の一覧( The directory of directories of mine.) Qiita(100)
https://qiita.com/kaizen_nagoya/items/7eb0e006543886138f39

小川清最終講義、小川清最終講義（再）計画, Ethernet(100) 英語(100) 安全(100)
https://qiita.com/kaizen_nagoya/items/e2df642e3951e35e6a53

＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong.
# 文書履歴(document history)
ver. 0.01 初稿 　20221026
### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
#### Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
Javaで何か作ってみる(2022/10/26 Day6)

## 今日やった事
- Udemyの動画教材を少し見た。（**J1-05_変数の扱い,定数,型** まで見た。）
## 参考にしたもの
- [【超絶丁寧解説】Javaプログラミングをゼロから学ぶ！絶対挫折させない「基礎入門」講座【講師評価4.3】](https://www.udemy.com/course/uz-java-kiso/)
    &rarr; Javaの勉強に使用しているUdemyの動画教材。
## 所感
- 例のお注射の副反応はお昼過ぎまであり、夜でやっと落ち着いた。
- 動画教材は、再生速度が1倍よりも、1.5倍もしくは2倍の方が聞きやすかった。
- byte型は他の言語ではあまり使わないと思うから、使い道とかを調べておきたい。
## 明日の予定
- 引き続き、動画教材を進めていく。
- 明日は2セクション進めたい。
Motor sport , ボッシュ自動車handbook 11版(66) p.882

Management for spark-ignition engines, Catalytic exhaust-gas treatment, ボッシュ自動車handbook 11版(65)

人生で影響を受けた本100冊。
https://qiita.com/kaizen_nagoya/items/16af53acbb147a94172e

に掲載した本のうち、「新人プログラマ応援」企画で「私の推薦書３３冊」として３３冊紹介した。

新人プログラマ応援　私の推薦書３３冊
http://qiita.com/kaizen_nagoya/items/98c62f051dbdb4f8aca2
残りの６７冊から、順に過去の読書感想を引用し、新たな読書感想文を追記する。

 <この項は書きかけです。順次追記します。>


# ボッシュ自動車ハンドブック version 11, 2022

Automotive Handbook  May 2, 2022

https://www.amazon.co.jp/dp/1119911907/

ボッシュ自動車handbook(英語)11版(0)＜エンジニア夏休み企画>【読書感想文】

https://qiita.com/kaizen_nagoya/items/dfa35aa6f669e5df983e
# Contents
Motor vehicle, 28
Basic principles, 32
Mathematics and methods, 204
Materials, 258
Machine parts, 354
Joining and bonding techniques, 426
Vehicle physics, 462
Operating fluids, 538
Refrigerants for air-conditioning systems, 591
Drivetrain(駆動系), 594
Internal-combustion engines(内燃機関),642
Management for spark-ignition engines,800

# Motor sport(自動車競技)
p.882
## Requirements 
## Components 
## ECUs 
## Pure motor-sport developments 
# Reference
参考なし。　

# 自己参考資料(self reference)

ボッシュ自動車ハンドブック 

https://qiita.com/kaizen_nagoya/items/8e330ce57880f04d71d9
ボッシュ自動車handbook(英語)10版　目次

https://qiita.com/kaizen_nagoya/items/57c799ff544c96efdea9

自動車工学とBosch Vehicle Handbook

https://qiita.com/kaizen_nagoya/items/d13ff6b0e4d7c8907c0d

 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞

# 文書履歴(document history)
ver. 0.01 初稿 　20221026

### 最後までおよみいただきありがとうございました。
いいね　💚、フォローをお願いします。
####  Thank you very much for reading to the last sentence.
Please press the like icon 💚　and follow me for your happy life.
C# soap API を叩くサンプル

# テスト用のAPI情報URL：
http://www.webxml.com.cn/WebServices/WeatherWebService.asmx?op=getWeatherbyCityName

# Soap　API情報：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/e735dd41-0fa2-d0b7-614d-7752323e2896.png)

>POST /WebServices/WeatherWebService.asmx HTTP/1.1
Host: www.webxml.com.cn
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://WebXml.com.cn/getWeatherbyCityName"
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/90a342c4-2b2b-a3a5-b4fa-1e43d55bc567.png)
>HTTP/1.1 200 OK
>Content-Type: text/xml; charset=utf-8
>Content-Length: length
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/368087/d64a1d7d-ef4d-8773-a09d-889bebb15d4e.png)

# サンプルプログラム
               
                //API URL
                var url = "http://www.webxml.com.cn/WebServices/WeatherWebService.asmx";

                var httpRequest = (HttpWebRequest)WebRequest.Create(url);
                httpRequest.Method = "POST";
                httpRequest.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");

                httpRequest.ContentType = "text/xml; charset=utf-8;";
                httpRequest.Headers["SOAPAction"] = "http://WebXml.com.cn/getWeatherbyCityName";

                var data = "<?xml version=\"1.0\" encoding=\"utf-8\"?><soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"><soap:Body><getWeatherbyCityName xmlns=\"http://WebXml.com.cn/\"><theCityName>北京</theCityName></getWeatherbyCityName></soap:Body></soap:Envelope>";

                using (var streamWriter = new StreamWriter(httpRequest.GetRequestStream()))
                {
                    streamWriter.Write(data);
                }

                
                var httpResponse = (HttpWebResponse)httpRequest.GetResponse();

                using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
                {
                    var result = streamReader.ReadToEnd();

                    logger.Info(result);
                }

                Console.WriteLine(httpResponse.StatusCode);

# 参考サイト
https://reqbin.com/req/yemanjjt/make-soap-request　　
→API URLとheaderを設定で、プログラムを生成してくれる!!!
https://blog.csdn.net/sinat_29009169/article/details/103917166
https://zhuanlan.zhihu.com/p/383326629
https://www.cnblogs.com/xnancy/p/14973613.html