OmniAICreator/Qiita-1.07M huggingface dataset:
非同期処理って？

# はじめに
JavaScriptを学習中、非同期についての内容が少々ヘビーに感じたので、こちらの記事にアウトプットして理解を深めようとしている次第でございます。

# 非同期処理とは
JavaScriptに限らず、多くのプログラミング言語で同期・非同期の概念はあります。
では同期・非同期とは？
### 同期とは
同期とは**処理が順番に実行されること**を言います。

カレーを作るときに置き換えて考えてみます。
<img src='https://2.bp.blogspot.com/-cN-M7uFuUZ8/WSk5dRFDR5I/AAAAAAABEi0/IEG_sKcxZes_fu0iDk66ovQFUoQhDeVzwCLcB/s400/cooking_nabe_curry.png' width=200px>
```
1. 材料を切る
2. 材料を煮込む
3. ルウを溶かす
```
これらの作業は順番に行うので、前の作業が終わらない限りは次の作業に取り掛かることはありません。	
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524071/778aea9a-12d8-910f-166a-36313f4936cb.png width=60%>
コンピューターの処理に置き換えると、「**ある処理が完了するまで次の処理が実行されない**」ということです。

### 非同期とは
非同期とは**処理が順番に実行されるとは限らないこと**を言います。

カレーだけではなく、お米を炊いてサラダを作ることも考えてみましょう。
<img src='https://2.bp.blogspot.com/-cN-M7uFuUZ8/WSk5dRFDR5I/AAAAAAABEi0/IEG_sKcxZes_fu0iDk66ovQFUoQhDeVzwCLcB/s400/cooking_nabe_curry.png' width=200px><img src='https://3.bp.blogspot.com/-KyYY3CbvBhY/UkJLkhk1T_I/AAAAAAAAYO8/eQTLdVgn66c/s800/cooking_suihanki.png' width=200px><img src='https://3.bp.blogspot.com/-Fa6AIKVnh1c/VVGVbTWRGkI/AAAAAAAAtlY/MlG36yqDSxw/s800/food_vegetable_sald.png' width=200px>

```
・カレー
    1. 材料を切る
    2. 材料を煮込む
    3. ルウを溶かす

・ごはん
    1. お米を洗う
    2. 炊飯器で炊く

・サラダ
    1. 材料を切る
    2. ドレッシングをかける
```
沢山の作業がありますが、カレーの具を煮込む時間やお米を炊いている時間は自分の手が空いています。
効率的に作ることを考えると、カレーを煮込んでいる間や、お米を炊いている間に他の材料を切ったりしますよね。
カレーを完成させてからご飯を炊いていては完成まで時間がかかってしまいます。
<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524071/20e883be-abd1-7a12-3f42-b096a7b3ffe3.png width=100%>
コンピュータの処理に置き換えると、「**ある処理が完了する前に次の処理が実行される**」ということです。

# 非同期はどこで使う？
同期・非同期の違いは説明しました。
では、非同期処理はいつ使うのか？逆に同期処理はいつ使うのか？が気になりますね。

### 非同期処理の使用例　：　Webサーバーとのやり取り
検索結果の画面などで、ある程度下までスクロールすると表示する量が増える機能がありますが、もし表示量を増やす処理が走る度に画面が固まったらどうでしょうか。
インターネット回線の速度は人それぞれですし、遅い人が見ようとしたらすぐに画面が固まってしまうサイトになってしまうのです。

そこで非同期処理を使い、データを読み込んでいる間にもWebサイトが動く仕組みが作られているのです。

### 同期処理の使用例　：　Webページの読み込み処理
Webページを開く際、ページの要素がある程度読み込まれるまでは何もすることができません。
基本的な機能が確実に全て読み込まれなければ、サービスが正常に動作しないからです。

# まとめ
両者は一長一短なので、使いどころが重要です。

**サーバーからの応答をじっと待っていたらもったいない**ですね。他の処理の実行に費やしましょう。
カレーを煮込んでいる間にサラダが作れます。

しかし、**必要な処理が終わる前に次の処理をしてはいけません**。
ジャガイモを洗わずに鍋に放り込むようなものです。
Fusion360のアップデートがうまくいかないときの解決方法

Fusion360をアップデートが毎回失敗するのでメモ

# 環境
* Windows11
* Fusion 360 2.0.17244 x86_64　あたり

# 状況
* Fusion360をアップデートしようとすると、一瞬アップデートの進行状況が表示されてから失敗
* ネットワーク状況も問題なし
* 再起動しても変わらない
* プログラムの追加と削除 → Autodesk Fusion 360 → 変更　からFusion360 サービスユーティリティを起動（Fusion360内の右上？マーク → サポートと診断 → サービスユーティリティからも起動可能）して Fusion360 を修復を呼ぶと落ちる
* 公式フォーラムに状況を投稿してとあるがどこにどう書くといいか自信がない
    * [Fusion 360 Support](https://forums.autodesk.com/t5/fusion-360-support/bd-p/962) だとは思う

* アンインストールもできない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/83ce022a-1911-4dd1-3558-670f84dc0dd4.png)

# 解決方法
* [公式サイト](https://www.autodesk.co.jp/products/fusion-360/overview?term=1-YEAR&tab=subscription)から最新の無償体験版をダウンロードして実行すると無事更新された
    * ダウンロードされるファイル名は Fusion 360 Client Downloader.exe

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3324101/1bd8ba5c-176f-62eb-8b39-e56cdfa43885.png)
【Rails】x-rubyを使ってみた

### x-ruby: 新たなTwitter gemの使い方

Twitterは最近、APIの仕様を一新し、「x-ruby」という新しいgemをリリースしました。このgemは、v1.1とv2のAPIの両方に対応しており、Rubyの開発者にとって非常に便利です。

なので、今回はその基本的な使い方について説明します。

**【セットアップ】**

1. **Gemのインストール**  
新しいgemをインストールするために以下のコマンドを実行します。
```ruby
gem install 'x'
```
または、Gemfileに以下の行を追加した後、`bundle install`を実行します。
```ruby
gem 'x'
```

2. **環境変数の設定**  
TwitterのAPIキーなどの情報を環境変数として設定します。`dotenv` gemを利用することで、このプロセスが簡単になります。

**【ツイートの実装】**

1. **APIクライアントの初期化**  
APIクライアントを以下のように初期化します。
```ruby
x_credentials = {
  api_key:             ENV['X_API_KEY'],
  api_key_secret:      ENV['X_API_KEY_SECRET'],
  access_token:        ENV['X_ACCESS_TOKEN'],
  access_token_secret: ENV['X_ACCESS_TOKEN_SECRET'],
}

x_client = X::Client.new(**x_credentials)
```

2. **ツイートの送信**  
ツイートを送信するには、以下のコードを使用します。
```ruby
tweet = x_client.post("tweets", {text: "Hello, World! (from x-ruby gem)"})
```

**【v1.1 APIの利用】**

「x-ruby」gemは旧バージョンのAPI、v1.1にも対応しています。
```ruby
v1_client = X::Client.new(base_url: "https://api.twitter.com/1.1/", **x_credentials)
v1_client.get("account/settings.json")
```

**【v1.1 media/upload APIの利用】**

v1.1のmedia/upload APIを使用する場合には注意が必要です。APIの仕様上、メディアのアップロードにはmulti-part形式が必要です。この問題を解決するための方法は、[こちらのGitHub Issue](https://github.com/sferik/x-ruby/issues/4)で確認できます。
Terraform Cloud で管理されている Google Cloud の Resource を terraform import

# やること
- terraform login する
- terraform init する
- terraform import する
- Terraform Cloud の WorkSpace の State に import された情報が入っていればOK


# ハマりポイント

> │ Error: Attempted to load application default credentials since neither `credentials` nor `access_token` was set in the provider block.  No credentials loaded. To use your gcloud credentials, run 'gcloud auth application-default login'

なんか gcloud の認証が通ってないみたいなことを言われたので、 書かれている通り `gcloud auth application-default login` してあげる。

これだけ

# 参考
- https://www.shigemk2.com/entry/2022/05/19/211745
ログイン時の"Cannot handle token prior to [timestamp]エラー

## 起こったこと
ユーザーをJWT検証で認証するWebアプリで、ローカル環境でログインしようとしたら以下のエラーが発生しました。
![スクリーンショット 2023-09-25 112742.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310527/aac78e79-8f9c-ae44-d153-c0c6a6ced7c7.png)
## 試したこと
エラー内容を調べたところJWTを発行するサーバー(Cognito)と検証側サーバー(ローカルサーバ)側で時刻が一致しない場合に起きるような文言を見つけたため、下記のQiita記事の内容を参考にJWT.php内の$leeway変数をデフォルト値の0から60に変更するなどしてみたのですが、エラーに変化はありませんでした。

https://qiita.com/shiva_it/items/9afc4dc33b3a6b58942a

## 改善したこと
jwt.php内の$leeway変数を修正していたのですが、Qiita記事をよく見ると`use Firebase\JWT\JWT`となっていました。そのため、`Firebase\JWT\JWT`が使用されているクラス内のtry文に`JWT::$leeway = 5;`を入れてあげたことで例外にならずログイン処理が上手くいくようになりました。

## 終わりに
このエラーの改善に1日かけてしまいましたが、時刻誤差の許容が必要ということが分かって良かったです。
CODESYSで列挙(enum)を使う

# はじめに

CODESYSを勉強中です。間違いなどございましたら優しく教えていただけると嬉しいです。

# CODESYSとは

CODESYSは、PLCプログラミング言語の国際標準規格であるIEC 61131-3に準拠したソフトウェアPLCです。

基本的な操作などは以下のページを参考にしました。

https://qiita.com/soup01/items/65c5702bd825fc34506b

# 列挙（enum）とは

曜日や色など、「リスト」や「カテゴリ」をプログラムで扱いやすくするためのものです。

例えば、月曜日の次は火曜日など　ルールが決まっている場合に便利です。

列挙型は他の多くのプログラム言語でも利用できますが、概念はほぼ同じです。プログラム内で一連の関連する値をグループ化し、それらに名前を付けて管理できる便利な方法です。

# 使い方

列挙型の変数を作成して、プログラムで使う方法について説明します。
※CODESYSのインストールや新規プロジェクトの作成方法は省略します。（参考ページを参照してください。）

## 列挙型の構造体作成
CODESYS [Application]上で右クリック→[オブジェクトの追加]→[DUT]を選択
![enum.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/81af1eff-2361-523c-2de9-71b2d698cf9c.png)

## DUT(Data Unit Type)の追加
列挙を選択して、追加を押します。（名前は何でもいいです。）
![DUT.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/da08412f-832c-8d59-e710-71e25df29f4f.png)

## 構造体の定義

今回は色を扱う列挙型を作成します。

赤が0 , 緑が1 , 青が2 です。
つまり、赤に+1すると緑になります。

~~~
TYPE Color :
(
	eRed := 0, eGreen := 1, eBlue := 2
);
END_TYPE
~~~

![enum定義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/0a488628-6a79-2d6d-4a3e-56d3836005ca.png)

## プログラムの作成

次はプログラム上で呼び出す方法について説明します。
①POU作成　→②変数の定義　→③プログラム上での呼び出し　の順番に進めます。

CODESYS [Application]上で右クリック→[オブジェクトの追加]→[POU]を選択
![POU追加.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/82dc61c2-1220-26ff-50c8-1f0b0168ee90.png)

今回は構造化テキスト（ST）で進めます。

![POU追加2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/82008809-1dae-3a70-507e-632fe495f539.png)


## 変数の定義、プログラムからの呼び出し

変数名 : eColor
データ型 : Color
~~~
VAR
	eColor: Color;
END_VAR
~~~

プログラムでの使い方は以下のように数値での指定も可能です。

![POU追加3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3343142/ade02f43-6dde-1a51-be35-3d7c5145af5a.png)

初期値を入れておきたい場合はこのようにします。
~~~
VAR
	eColor: Color := Color.eGreen;
END_VAR
~~~

シミュレーションで色々試して確認してみてください。
お疲れ様でした！

# 参考ページ

Codesys Online Help
SA0058：列挙変数の操作

https://content.helpme-codesys.com/ja/CODESYS%20Static%20Analysis/_san_rule_sa0058.html

https://qiita.com/soup01/items/65c5702bd825fc34506b
TypeScript readonlyとas constの使い方



## はじめに

TypeScriptにおいて、`Readonly<T>`と`as const`は、オブジェクトや配列をイミュータブルにするための非常に便利な機能です。この記事では、これらの特性をどのように利用するかを解説します。

## セクション1: Readonly<T>の基本

`Readonly<T>`型は、型`T`のすべてのプロパティを読み取り専用にします。これにより、オブジェクトのプロパティ値の変更を防ぐことができます。

```typescript
interface Example {
  prop: string;
}

const example: Readonly<Example> = { prop: "Hello" };

// 以下のコードはコンパイルエラーになります
example.prop = "Hi"; // Error! Cannot assign to 'prop' because it is a read-only property.
```

## セクション2: 関数パラメータとしてのReadonly<T>

関数のパラメータとして`Readonly<T>`を使用することで、関数内でオブジェクトのプロパティが変更されないことを保証できます。

```typescript
function doSomething(obj: Readonly<Example>) {
  // 以下のコードはコンパイルエラーになります
  obj.prop = "Hi"; // Error! Cannot assign to 'prop' because it is a read-only property.
}
```

## セクション3: as const の使用

`as const`は、オブジェクトや配列をリテラル型として扱うことができるTypeScriptの構文です。これにより、変数が持つ値が唯一のリテラルとなり、それ以上狭い型になります。

```typescript
const example = { prop: "Hello" } as const;

// 以下のコードはコンパイルエラーになります
example.prop = "Hi"; // Error! Cannot assign to 'prop' because it is a read-only property.
```

## まとめ

`Readonly<T>`と`as const`はTypeScriptでイミュータブルなコードを書く際に重要なツールです。これらを適切に使用することで、コードの安全性と堅牢性を向上させることができます。
「コード品質」について調べはじめたら「アジリティ」の話に行き着いた時のメモ

# はじめに
コード品質ってなんだろうって調べてみた。

# 調べたこと
## 富士フイルムソフトウェア株式会社
**メトリクスでソースコードの美しさは判断出来るのか？**

https://www.jaspic.org/event/2015/SPIJapan/session1C/1C-3_ID002.pdf

- 巨大関数（100ステップ以上）が0件を目標
- クローン関数（30行以上）が0件を目標

疑問・感想

- ここで言うクローン関数ってなんぞ？
    - Javaのcloneメソッドのこと？（自身を複製するメソッド）
        - だとしてメトリクスを取得するほどたくさん作るようなメソッドだっけ？
    - 何かコピーして作ってる系の関数？
        - クローンかどうかの判別って難しくない？
    - 括弧書きにある通り30行以上の関数？
        - だとするなら、これが0の時点で、巨大関数は0になるのでは？
 - クローン関数の定義がちょっと把握できなかったものの、巨大関数とかの基準は圧倒的にありな気がしてる。

## ソフトウェアシンポジウム2017
**ソースコードメトリクスと品質リスクとの関係分析とそれに基づくリスクヘッジ手法に向けて**

https://www.juse.jp/sqip/library/shousai/download/index.cgi/C1-2.pdf?id=360

- 品質リスクメトリクス
    - 修正延べ日数：問題が登録され修正完了となるまでの日数の合計
    - 修正回数：問題の修正回数
    - 平均修正日数：問題が登録され修正完了となるまでの修正日数の平均
- ソースコードメトリクス
    - インパクトスケール：ソフトウェアの一部を変更した際、その影響が他のどれだけの箇所に影響するかを示す量である「影響波及量」を表すメトリクス。

疑問・感想

- インパクトスケールは取得する仕組み作る必要ありそうだけど、面白そう。
- 実際、波及影響の大きいコードの修正は結構たいへんだし、リスク観点で見るのはありな気がする。

## 個人ブログ（mtx2sさん）
**コード品質はやはりビジネスに影響を与える**

https://mtx2s.hatenablog.com/entry/2023/04/26/230917

- ビジネス上の競争優位　←　市場投入までの時間　←　アジリティ（agility）　←　保守性　←　コード品質
    - だから　ビジネス上の競争優位　←　コード品質
    - 無視できない他の要素　市場投入までの時間　←　デプロイ容易性（deployability）
- コード品質
    - コード分析ツールのCodeSceneで得られた結果を品質として、欠陥・開発時間と相関がある。
- 欠陥・開発時間が増えることによる影響
    - 市場投入を遅くすることはもちろん、予測可能性を低下させるため、PJ瓦解にもつながる。
- コード品質の見える化
    - 大事

感想
- 全く異論無い。というか、そう思ったので調べ始めたところがある。
- CodeSceneとか使えるなら使いたいなぁ。

## スライド（t-wadaさん）
**アジリティを支える品質特性**

https://speakerdeck.com/twada/agility-and-quality-characteristics-developers-summit-2021-summer

（いろいろ省略してるのでスライドを見るべき）

アジリティ

- アジリティと関係が深いのは解析性、修正性、試験性（いずれも品質特性の「保守性」にくくられているもの）
    - 修正性＝変更容易性
- 修正性（変更容易性：Modifiability）
    - 複雑さの分解
        - 高い認知不可
        - 変更の増幅：やりたい変更に対して、あっちもこっちも直さないといけないこと？
        - 未知の未知：知らない事自体を知らない
    - 複雑さをもたらすもの
        - 依存関係：変更の発散と高い認知不可
            - 結合度と凝集性
        - 不透明さ：未知の未知と高い認知不可
            - 名前付けの失敗など
- 試験性（Testablity）
    - 試験性の分解
        - 実行円滑性：自動実行が容易かつ高速
        - 観測容易性：テスト結果の取得、期待値比較を自動化しやすい
        - 制御容易性：事前状態を制御し、テスト対象を自動操作しやすい
        - 分解可能性：テスト対象を切り出し、テスト環境への部分置換が容易

アジリティの本質

- あらゆるレベルの決定を可逆にする＝戻る技術＝安全に進む技術→DevOps
    - テストの大半を統合環境を必要とせずに実施できる（テスト容易性）
    - 独立した形でデプロイまたはリリースできる（デプロイ容易性）
- 品質特性
    - 保守性：モジュール性
    - 移植性：適応性・設置性・置換性
- 安全なリアーキテクティング
    - ストラングラーパターン
- 安全なデプロイ
    - Blue/Green Deployment
    - Canary Release
    - Feature Toggle

## メトリクス取得ツール
ググって最初に出てきたもの。これがベストなのかはわからんけど、いっぱい取れそう。

https://www.techmatrix.co.jp/product/understand/function/metrics.html

# 個人的なまとめ

- 基本的には、品質特性における「保守性」「移植性」を踏まえた上でアーキテクチャを設計する。
- それを前提とした上で、コード品質として観測可能な形でメトリクスを取得していくのは面白そう。
- 保守性・移植性を前提にした時のメトリクスはもう少し調べても良さそう。


以上。
追逐夢想，開啟海外工作與實習的門戶

隨著全球化的發展，海外工作與實習已成為許多年輕人追逐夢想的新方式。特別是美國，作為世界上最強大的經濟大國之一，吸引著許多人前往尋找更好的發展機會。在這篇文章中，我們將探討美國的工作文化、海外工作和實習的優勢，以及如何撰寫一份具有說服力的statement of purpose（申請目的書）。

美國的工作文化

[美國工作](https://www.apexcharity.org/news/3/85)文化獨特而多元，具有高度的競爭性。優秀的教育體系和科技發展使得美國擁有許多世界知名的企業，如谷歌、蘋果、IBM等。這樣的企業文化強調創新、效率和專業，對員工的要求也很高。因此，工作能力的提升和專業知識的學習是在美國工作的必經之路。

此外，美國的工作文化也十分注重多元性和包容性。不同的文化背景和價值觀可以促進公司的創新和發展。在美國工作，每個人都能夠得到公平的機會，發表自己獨特的觀點，讓自己的聲音被聽見。

海外工作的優勢

與在國內工作相比，[海外工作](https://www.apexcharity.org/news/3/86)有著許多優勢。首先，海外工作能夠為工作者帶來新的挑戰和成長機會。擁有不同的工作經驗可以拓寬思路，增強解決問題能力和對待挑戰的勇氣。在不斷學習和克服困難的過程中，工作者可以得到寶貴的經驗和技能，為未來的發展打下堅實的基礎。

其次，海外工作也能夠擴大人際網絡。在異國他鄉工作，可以認識來自不同國家和文化背景的人，拓展人脈，建立國際性的人際關係。這樣的人脈關係不僅有助於未來的職業發展，也能夠讓工作者更加開放和包容，擁有更廣泛的視野。

最後，海外工作也是一次體驗不同文化的機會。不同的國家有著獨特的風土人情、歷史文化和生活方式，而通過工作，可以深入體驗這些文化。這樣的經歷不僅能夠豐富自己的生活，也能夠幫助我們更加了解這個世界。

海外實習的重要性

與海外工作相比，海外實習也是一個很好的選擇。對於大學生來說，海外實習是獲得寶貴工作經驗和提升個人能力的機會。通過實習，學生可以獲得實踐機會，將在學校學到的理論知識投入到實際工作中。同時，實習也讓學生更加了解自己的興趣和專長，有助於未來職業發展的規劃。

除此之外，[海外實習](https://www.apexcharity.org/news/3/87)也能夠加強語言能力。在海外的工作環境中，學生需要與來自不同國家的同事溝通，促進自己的語言學習。這樣的經歷對於學生未來的職業發展具有重要意義，因為語言能力在國際化的環境中十分重要。

如何撰寫一份優秀的statement of purpose

一份優秀的[statement of purpose](https://www.apexcharity.org/news/3/90)（SOP）在申請海外工作或實習時至關重要。因為它能夠展示你的個人特質、專業背景和申請的動機，是吸引機會雇主或招生委員的關鍵。以下是撰寫一份優秀SOP的幾個要點：

首先，確保你的SOP內容清晰明確。避免使用空洞的官倒詞或模糊的陳述。你需要用具體的事例和成就來證明自己的觀點。例如，你可以談談一個在大學期間參加的國際志願者項目，並說明如何從中學到的跨文化交流技巧。

其次，注意自我介紹的角度。一份優秀的SOP不僅僅是一個自傳，它更應該是一份“銷售自己”的文書。通過對自己的專業背景和實踐經驗的具體描述，讓機會雇主或招生委員看到你的價值和潛力。

同時，也要注意SOP的長度和格式。大部分機會雇主或招生委員希望收到簡潔明了的SOP，過長或過多的格式也可能會引起他們的厭煩。因此，盡量用精簡的句子表達自己的觀點，並選擇整齊的格式進行排版。

最後，記得對每一份申請的SOP進行修改。一份模擬的SOP可能適用於多個申請，但在提交申請時，請確保對每一份SOP進行修改，使其適配該特定的申請。

結論

追逐夢想的路上，海外工作和實習是一個重要的選擇。它們能夠為個人提供挑戰、成長和擴大人際網絡的機會。但同時，也需要有一份具有說服力的SOP來展示自己的價值和潛力。希望這篇文章能夠幫助你更好地了解美國的工作文化、海外工作與實習的優勢，也能夠撰寫一份優秀的SOP，開啟追逐夢想的大門。
laravel リソースクラスを使ってJSONを返すときにdataというキーの中に入ってしまうことの解消方法

## 概要

- リソースクラスを使ってレスポンスで返すJSONを定義していざレスポンスを返したところ、リソースクラスのtoArrayメソッドで指定したキーが`data`というキーに入ってレスポンスが返されてしまう。`data`のキーを排除して1階層レスポンスのJSON情報を浅くしたい。

## dataというキーはなぜ付与される？

- `data`キーはAPIに一貫性を持たせるため、laravelが自動で付与している。
- 具体的には下記で付与されている。
    - `vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php`

        ```vendor/laravel/framework/src/Illuminate/Http/Resources/Json/JsonResource.php
        /**
         * The "data" wrapper that should be applied.
         *
         * @var string|null
         */
        public static $wrap = 'data';
        ```

## 対応方法1 すべてのレスポンスで`data`のキーを削除したい場合

- `app/Providers/AppServiceProvider.php`のbootメソッド内部に記載を行う。

    ```app/Providers/AppServiceProvider.php
    use Illuminate\Http\Resources\Json\JsonResource;
    
    public function boot()
    {
        JsonResource::withoutWrapping();
    }
    ```

## 対応方法2 個々のレスポンスで`data`のキーを削除したい場合

- 個々のリソースクラスに下記の内容を追記する。

    ```php
    /**
     * The "data" wrapper that should be applied.
     *
     * @var string|null
     */
    public static $wrap = null;
    ```
Linuxmint21.2で気づいたら今まで使えてたPulse Audioイコライザが使えなくなっていたので直してみた

## ほったん

今まで、Pulse Audioイコライザで低音をカットして、近所に響かないように気をつけていましたが、

Linuxmint21.2にアップグレードして、なんだか使えなくなりましたが、そんなに優先度が高くないので放置してました。

ですが、やっぱり聴くBGMによっては低音が響いて気になるので、イコライザを起動させようと思います。


## さきに結論

私の環境の場合、コレを入れたら解決
```
sudo apt install python-is-python3
```


## 試行錯誤してみた

qpaeqを手動で起動したら、

```
$ qpaeq
There was an error importing needed libraries
Make sure you have qt5 and dbus-python installed
The error that occurred was:
        No module named 'PyQt5'
```

とか言われます。

なんで、PyQt5入れようとしたら、すでに満足とか言われます。

```
$ pip3 install PyQt5
Defaulting to user installation because normal site-packages is not writeable
Requirement already satisfied: PyQt5 in /usr/lib/python3/dist-packages (5.15.6)
Requirement already satisfied: PyQt5-sip<13,>=12.8 in /usr/lib/python3/dist-packages (from PyQt5) (12.9.1)

```

しょうがないので、システムのpython由来の問題かと思い。
pyenvでpythonのglobalをsystemに戻し、
systemのpythonのバージョンを確認します。
※すでにpyenvを使って、```3.10.7```と```3.11.4```を入れてあります。

```
$ python -V
pyenv: python: command not found

The `python' command exists in these Python versions:
  3.10.7
  3.11.4

Note: See 'pyenv help global' for tips on allowing both
      python2 and python3 to be found.

```

すると、systemのpythonなんてコマンドみつかんないよ、と言われます。

いつからpythonなくなったの？
って思って、まずOSのバージョンを調べます。

ここを見ると、Linuxmint21.2は、
Ubuntu jammyです。

https://linuxmint.com/download_all.php

そして、jammyはリリース22.04のようです。


いろいろ調べたら、どうやら、Ubuntu22.04は、```/usr/bin/python```が廃止されたようです。

それで、
```/usr/bin/python```を```python3```へシンボリックリンクを貼るパッケージがあるようなので、入れてみました。

```
sudo apt install python-is-python3
```

入ったので、Pulse Audioイコライザを起動してみます。
```
qpaeq
```

あ、動いた。
よかった。
これでボリューム上げられる...
CのヘッダーファイルからRuby-FFIのコードを自動生成するc2ffi4rbをリバイバルした

## はじめに

Rubyは、PythonやJavaScriptのような人気言語と比較すると利用人口が少ないため、やりたいことを実現するためには、C言語やRust言語など、他言語で書かれたライブラリのバインディングを適宜自作する必要があります。

Ruby言語では、バインディング作成のための仕組みが数多く用意されています。

* ネイティブC拡張
* fiddle
* ruby-ffi
* GObject Introspection
* Magnus（Rust用）

swig というのもありますが、私は使用経験がありません。

この中で「個人用のバインディングの作成時間の最小化」という観点から評価すると ruby-ffi が最もよいと思います。ruby-ffiは、Cの型とRubyのクラスを自動で相互変換してくれ、構造体に対するサポートも豊富です。

しかし、ruby-ffiを選択する場合でも、バインディング作成の敷居は低くはありません。私も読者もフルタイムでRubyのライブラリを作れるわけではありません。最初の数時間でプロトタイプが完成する、ぐらいの工数でないと、なかなか隙間時間でバインディングを作成していくのは難しいと思います。

現実的には

1. [Cのソースコードからコメントを消す](https://qiita.com/kojix2/items/930e8b70043579d9edd3)
2. 正規表現を用いたコードの置換
3. diff を利用したC関数とRubyのメソッドの比較確認

などの泥臭い方法により、バインディング作成の時短を図ることになると思います。

## c2ffi

そんなときに少し便利なのがc2ffiというツールです。このツールは **Cのヘッダーファイルをパースして jsonファイルを生成します** 。バインディング作成者にとっては、テキストエディタの置換機能とならび、神ツールといってもよいでしょう。（このツールはバインディングの自動生成だけではなく、diffを利用したCヘッダーとRubyメソッドの比較確認にも使えます。）

https://github.com/rpav/c2ffi

しかし、神ツールにも欠点はあります。このツールはllvmをライブラリと使用していて、インストールが一筋縄ではいきません。個人的には、コンパイルできない理由を追究する
スキルがない
時間がもったいないので、docker環境を用意してビルドしたりしています。macの場合は、issueにビルドできないという報告がありますので、それに基づいてソースコードを少し修正する必要があります。

## c2ffi4rb

c2ffiは当初はRubyのバインディングの生成も念頭に作られたらしく、c2ffi-ruby というツールがありました。

https://github.com/rpav/c2ffi-ruby

しかし、これは10年前のツールで一度作られたきりメンテナンスされていません。gemにもなっておらず、コマンドラインツールとしてのインストールも面倒でした。そこで、これをGem化して c2ffi4rb という名前をつけて、簡単にインストールできるようにしました。

https://github.com/kojix2/c2ffi4rb

## 使い方

c2ffiを使って、ヘッダーファイルからjsonファイルを生成します。

```sh
c2ffi -M macros.h -o example.json example.h
c2ffi -o macros.json macros.h
```

c2ffi4rb を用いて、バインディングの原型を作ります。

```
c2ffi4rb example.json macro.json > simple.rb
```

このツールは完璧とは言えませんが、基本的な機能は備えています。
少しずつ改善・修正していくつもりです。

この記事は以上です。
Google ColaboratoryからTiDB Serverlessを使う

データ分析の際にJupyter Notebookを利用することも多いですよね。ここでは、Google ColaboratoryからTiDB Serverlessを利用する方法について書いていきます。

## 接続
Colaboratoryにノートブックを作成して、実際に接続していきます。

### ライブラリのインストール
Jupyter NotebookでSQLディレクティブを利用出来るようにするライブラリには[ipython-sql](https://github.com/catherinedevlin/ipython-sql)がありますが、ここではそのforkである [jupysql](https://github.com/ploomber/jupysql)を利用します。開発が活発なのと、いくつかの機能拡張をしているので選びました。ただ、どちらでもTiDB Serverlessとの接続に利用可能です。（接続文字列を使った初期化方法に違いがあります）

まずは、必要なライブラリをインストールし、sqlディレクティブを利用できるようにします。ここではmysql接続ライブラリに[PyMySQL](https://github.com/PyMySQL/PyMySQL)を使います。先に述べた接続文字列を使った初期化のために、[SQLAlchemy](https://www.sqlalchemy.org/)を利用します。

```python
!pip install PyMySQL jupysql sqlalchemy --quiet
%load_ext sql
```
### TiDB Serverlessへの接続

TiDB Serverlessの接続画面から、接続に必要な情報を取得します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/3be797e0-db66-af3e-5b32-d9b9315086c5.png)

この情報を使い、接続文字列を作成します。パスワードを直接notebookに埋め込まないように、getpass() を利用しているため、実行時にテキストボックスにパスワードを入力します。
また、jupysql は独自のプロット関数を持っているのですが、一部MySQLに対応していません。後ほどプロットに利用するために、結果セットを汎用のDataFrameに変換します。

```python
from getpass import getpass
from sqlalchemy import create_engine
password = getpass()
user = "<ユーザー名>"
port = "4000"
host = "gateway01.ap-northeast-1.prod.aws.tidbcloud.com"
database = "<DB名>"
connection_string = f"mysql+pymysql://{user}:{password}@{host}:{port}/{database}?ssl_verify_cert=true"
# jupysqlは %sql $connecton_string の形式の初期化を許可していない
engine = create_engine(connection_string)
%sql engine
# for MySQL, jupysql plotting function has some limitation. use DataFrame 
%config SqlMagic.autopandas = True
```
これで接続はOKです。

## クエリの実行
さて、実際にクエリを実行していきましょう。

### SQLセル
%%SQL を利用することで、セルにSQLを記述し結果を取得できます。

```sql
%%sql
SELECT 
  `start_station`,
  `member_type`,
  COUNT(*) AS `count`
FROM
  `trips`
GROUP BY
  `start_station`,
  `member_type`
ORDER BY
  `count` DESC;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/db1ed5d8-2fa6-da7b-b5c0-127717ab913f.png)

### SQL文とプロットの利用
%SQL で結果を変数に格納することができて、後続の処理で利用することができます。
これを利用してグラフの描画などを行えます。

```python
bike_count = %sql SELECT trips.bike_number, COUNT(*) AS rental_count FROM trips GROUP BY trips.bike_number ORDER BY rental_count DESC LIMIT 5
bike_count.plot.bar(x="bike_number")
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/de8d7ae1-e4e3-3b48-2c39-d48256eb38ef.png)

TiDB Serverlessは無料帯でも5GB程度のデータを扱えるので、色々ためしてみてください！
TiDB Serverlessの請求設定

# Cloud破産を避けるために

TiDB ServerlessはFree Tierがありますが、それを超える利用も従量課金で可能になっています。
従量課金・・・怖いですよね。ですが、TiDB ServerlessにはQuota設定があり、利用上限を設定できるのです！
ここではTiDB Serverlessの請求設定とQuota設定について説明します。

## 請求設定

TiDB Serverlessでの請求方法には、
1. クレジットカードでの請求
1. AWSの請求と合算 (Consolidated Billing) 
の二つの方法が利用できます。今回はクレジットカードを設定していくことにします。

TiDB Cloudコンソールの左下から、ビルのアイコンをクリックして、`Billing`画面に移ります。ここの、`Add a New Card`からクレジットカードが登録できます。

![スクリーンショット 2023-09-27 9.45.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/02bdb24d-d7ae-45bc-379f-af5103690de6.png)

### Quota設定

Quotaの設定は、クラスタ作成時とクラスタ作成後のダッシュボードOverview画面からできます。どちらも同じ設定項目で、月額でQuotaを設定することができます。
Quotaを超えた場合、**10RU/s**にスロットリングされます。そのため完全にクラスタが停止するわけではありません。制限はかなり厳しいですが、クエリを実行することができます（これは、無料で利用していて無料帯を超えて利用する場合も同じです）

![スクリーンショット 2023-09-27 10.38.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/774bdebe-80d1-2cd7-d1ee-40f121c9fa8a.png)

### 請求画面

費用の詳細や請求書は、Billing画面の`Bills`から確認できます。無料帯の利用は表示されないため、無料帯の範囲の利用は請求額も0、利用実績も記載されません。

請求に関しては上記で終わりですが、合わせてセキュリティ周りの設定も見直しておきましょう。

## セキュリティ設定

サーバレスの課金を開始する際には（別に課金をしなくとも）、セキュリティに関する設定を見直しておきます。

### 二要素認証の設定

アカウントのセキュリティ設定を高めましょう。請求設定を行うとServerlessだけではなく、Dedicatedのクラスタを起動することもできるようになります。不正に利用されないよう、オーナーアカウントには二要素認証の設定を行っておきます。

二要素認証の設定はコンソールログイン後の左下、人型のアイコンから `Account Setting` を選んで設定できます。二要素認証をONにした後、**次回ログイン時**にGoogle Authenticatorなどから二要素認証の設定ができます。ONにした画面では設定できないので注意してください。

![スクリーンショット 2023-09-27 8.08.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12495/259c8fc0-e11b-3fcc-2ec6-f80a1f5ec843.png)


### コンソール監査ログ

TiDB Cloudコンソールの利用履歴を記録するため、TiDB Cloud コンソールの左下、ビルのアイコンから `Console Audit Logging` を選択します。標準ではOFFになっているので、記録をONにします。

これで、コンソールで行う各種オペレーションの記録が保存されるようになります。コンソールログは90日間保存されます。
乗り換え検索機能実装のためのAPI調査

## 制約事項
- 乗り換え検索ができる(必須)
- 時刻表が反映されている(必須)
- 遅延情報が反映されている(必須)
- 無料で利用できる(必須)
- 首都圏の乗り換え情報を検索できる(必須)
- 路線バスも検索できる(任意)
- 駅名や路線名で乗り降りしたい駅を検索できる(任意・別APIでも可)
- 個人開発利用可

## API調査結果

| サービス名 | 時刻表反映 | 遅延情報反映 | 無料利用可 |
|-----------|:------------:|:------------:|:------------:|
| [公共交通オープンデータセンター](#公共交通オープンデータセンター)|〇|〇|〇|
| [NAVITIME API](#navitimeの地図api-navitime-api)|〇|〇|×|
| [Google Maps API](#google-maps-api)|〇|〇|×|
| [ジョルダン乗換案内オープンapi](#ジョルダン乗換案内オープンapi)|△|×|〇|
| [駅すぱあとweb service](#駅すぱあとweb-service) |〇|△(たぶん×)|△(無料も一部あり)|


### 公共交通オープンデータセンター
https://www.odpt.org/

- 制約事項を全部満たしている
- 2023/9/27時点では東京神奈川中心にエリア対応中で関西はほとんどデータがない。
ドコモの[バイクシェアの情報](https://ckan.odpt.org/dataset/c_bikeshare_gbfs-d-bikeshare)もとれるみたい

>公共交通オープンデータセンターでは、公共交通オープンデータ協議会に参画する交通事業者のデータを、一般の開発者やICTベンダー等にワンストップで提供します。
> - 鉄道・バス・航空・旅客船事業者のデータを、リアルタイムデータ等も含め、広くサポートします。
> - 事前処理（クレンジング）を行ったデータを、REST APIを通じて、共通のJSON形式で提供します。
> - バスや旅客船のデータを中心に、GTFS形式でのデータ提供も行います。
>
>公共交通オープンデータセンターは、2020東京オリンピック・パラリンピックにおける、東京でのスムーズな移動に貢献するために、2019年度より運用を開始しました。東京都交通局の鉄道およびバスのデータ提供をはじめ、今後さらに幅広くデータを提供していく計画です。
https://www.odpt.org/overview/


### NAVITIMEの地図API 「NAVITIME API」

https://api-sdk.navitime.co.jp/api/pr/?gclid=CjwKCAjwgsqoBhBNEiwAwe5w0zOV7VYdm4Xa0Vkct2IRdyYLffOxZETBWbNcqffRfj5B-f2ucXfpMhoCbg8QAvD_BwE


- API使用量に応じて課金されていく。
- 無料が必須なので対象外だが、大手企業も多数導入している

>『NAVITIME』『カーナビタイム』等で提供する"トータルナビ"や、自動車・電車・バス・自転車など 様々な移動手段のルート検索、地図表示などの機能を、API形式でお客様向けに提供しています。
業務システムやWebサイト、アプリなどに「NAVITIME」の技術を簡単に組み込んでご活用いただけます。
>API形式のため、お客様側で画面を設計し、独自のデザイン・ユーザーインターフェースにて、システム・サービス構築が可能です。

### Google Maps API

https://developers.google.com/maps/documentation/javascript/directions?hl=ja

- [料金](https://developers.google.com/maps/documentation/directions/usage-and-billing?hl=ja)がかかるので対象外。そもそも無料で使わせていただこうという魂胆が卑しいのか
- 世界中に対応。

>（各種の移動手段を使用する）ルートは、DirectionsService オブジェクトを使用して計算できます。このオブジェクトは Google Maps API のルートサービスと通信を行い、ルートサービスはルート リクエストを受信して効率的な経路を返します。最適化で最も重視されるのは移動時間ですが、距離や進路変更の回数なども考慮される場合があります。これらのルート結果は、ユーザー自身で処理することも、DirectionsRenderer オブジェクトを使用してレンダリングすることもできます。

### ジョルダン乗換案内オープンAPI

https://norikae.jorudan.co.jp/openapi/

- APIのみでは時刻方が反映された乗り換えが検索できない模様

> （※2）時刻表を考慮した経路ではございません。時刻表を考慮した経路検索は、弊社「乗換案内」へのリンクで実現いたします。リンクは出発地、目的地、日付時刻を指定でき、PC、スマートフォン共通のURLとなります。

- APIを利用したサービスの公開URLの登録が必須(開発中サービスについては公開予定url)
- [仕様書](https://biz.jorudan.co.jp/file/norikae_openAPI.pdf)

遅延情報がおそらく反映されないものとなるので、対象外とする。

### 駅すぱあとWeb Service

https://api-info.ekispert.com/

- 会計アプリ等の交通費経費精算などの用途に使用されることが多そう
- 今回の要件とは異なる
- そもそも法人向けだった

>駅すぱあとWebサービスは「駅すぱあと」が持つ経路探索機能や
公共交通機関データを実装できる法人向けAPIです。
充実したAPIとサポート環境で開発運用コストを削減します。

## まとめ
調査の結果、公共交通オープンデータセンターを利用予定。
上記のサービスを利用した面白いWebアプリがあったので貼っておきます。

https://minitokyo3d.com/

https://github.com/nagix/mini-tokyo-3d
Laravelで作成したサイトが404エラーになった時の対処法

## 起こったこと
現場での環境構築を行った後、`npm run dev`コマンドを打った上でローカル環境のURLを叩いたところ、以下の画面が表示された。
![スクリーンショット 2023-09-21 094615.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310527/31c4a726-5e5e-c062-23ca-cc73f7696e2c.png)

## 原因
Laravelのエラー画面だったので、dockerコンテナ自体は立ち上がっていることが分かった。
最終的な原因としては、GitHubリポジトリより開発資材をクローンした後にSourcetreeのブランチをmainのままにしていたことだった。それに気が付かなかった理由は、mainブランチの名前をdevelopに変更してしまったからだ。リモートブランチをチェックアウトしないといけないのを失念しており、ただ名前を変えただけになってしまっていたことで原因の発覚が遅れてしまった。
![スクリーンショット 2023-09-27 095649.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3310527/d18b37a5-b3f3-b7ef-8b81-0973f4acb0ec.png)

## 最後に
研修中はブランチを切るくらいしか自分でやっていなかったので、Sourcetreeの使い方が分かっているようで分かっていなかった。
今後はリモートブランチをチェックアウトしてローカルに持ってくるのを忘れないようにする。
【Salesforce】Visual Studio Codeの「SFDX: 組織を認証(Authorize an Org)」でエラー

# 問題

Visual Studio Codeの「SFDX: 組織を認証(Authorize an Org)」でエラー出力。

エラー内容は文字化けしていて不明。

またターミナルで「sfdx update」をしたところ下記のような表示がされました。

```java:エラー内容

\sfdx\client\bin\..\7.209.6-8ba3197\bin\sfdx.cmd"' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。

```

# 解決策

Salesforce CLIの入れ直し。

Salesforce CLI またはプラグインのアンインストール
https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_uninstall.htm
※「プログラムの追加と削除」にてCLIを削除＆「Program Files」フォルダの「sfdx」フォルダにある「Uninstall.exe」を実行する

↓

Salesforce CLI のインストール
https://developer.salesforce.com/docs/atlas.ja-jp.244.0.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm
※ダウンロードサイトで404エラーが出たり出なかったり・・・

↓

PC再起動

↓

「SFDX: 組織を認証(Authorize an Org)」が可能。
「sfdx update」も起動しました。

```java:バージョンはこんな感じになりました

@salesforce/cli/2.9.8 win32-x64 node-v18.15.0

```

# 参考リンク

[SFDC：Salesforce CLIのバージョンでハマった話](https://tyoshikawa1106.hatenablog.com/entry/2023/08/01/085411)
※sfdxからsfコマンドに切り替わるっぽいですね・・・

# 余談

「Program Files」フォルダの「sfdx」フォルダにある「Uninstall.exe」を実行する

こちらをしてなかったので予期せぬ挙動になりめちゃくちゃハマりました・・・

勘弁してほしい
せんせー、スモールモジュラーリアクターってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、スモールモジュラーリアクターってなに？

# スモールモジュラーリアクターとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## スモールモジュラーリアクターって何？

みんな、電気って知ってるよね？家でテレビをつけたり、電気をつけるのに必要なエネルギーを作るための特別な機械があるんだ。その一つが「スモールモジュラーリアクター」という小さな原子力発電所なんだ。

## どういうこと？

大きな原子力発電所は巨大で、たくさんのお金や場所が必要だけど、スモールモジュラーリアクターは名前の通り、小さくて組み立てやすいんだ。それでもしっかりと電気を作ることができるんだよ。

## どうしてそれがすごいの？

小さいのにしっかりと電気が作れるのは、すごいことだよね。それに、小さいから、色んな場所に置いて電気を作ることができるんだ。必要な時に、必要なだけ組み立てることができるのも特徴だよ。

## だから、スモールモジュラーリアクターってなに？

スモールモジュラーリアクターは、小さな箱の中に電気を作る力が詰まっている、魔法のような機械なんだ。

# まとめ

この「スモールモジュラーリアクター」という特別な機械は、私たちが毎日使う電気を、小さな箱の中から作り出してくれるんだ。これで、もっとたくさんの人たちが、安全に電気を使うことができるようになるかもしれないね。
せんせー、ディープシー・マイニングってなに？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/2c47de5a-d81a-78f9-53c1-4d31d8398c36.png)

キーンコーンカーンコーン...
授業が始まります

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/be1492ca-910f-2708-d0fa-8fcfcf14af73.png)

せんせー、ディープシー・マイニングってなに？

# ディープシー・マイニングとは

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3194265/da229491-9c49-fb7a-a542-417180e256a7.png)

## ディープシー・マイニングって何？

みんな、海の中ってどんなイメージがあるかな？青い水や魚たちが泳いでいるところを想像するかもしれないね。でも、実は海のすごく深いところには、たくさんの宝物が隠れているんだ。この宝物を取りに行くことを「ディープシー・マイニング」と言うんだ。

## どういうこと？

海の底には、金や銀、レアメタルという特別な素材があるんだ。これらの素材は、私たちのスマートフォンやコンピュータなどに使われているんだよ。ディープシー・マイニングは、これらの宝物を取りに深い海へ潜ることなんだ。

## どうしてそれがすごいの？

陸地での鉱山は少なくなってきているから、新しい場所で素材を探しているんだ。でも、海の底はとても深くて、暗くて冷たいから、特別な機械や技術が必要なんだ。

## だから、ディープシー・マイニングってなに？

ディープシー・マイニングは、海の深いところにある宝物を取りに行く冒険なんだ。その宝物は、私たちの日常生活にとっても大切なものなんだよ。

# まとめ

ディープシー・マイニングは、海の深いところに隠れている宝物を探しに行く特別な冒険なんだ。それを取ることで、私たちの生活がもっと便利になるかもしれないね。でも、海の生き物や環境に気をつけながら、うまくやっていくことが大切だよ。
CLIが急に使えなくなった件

Salesforce Cliが急に使えなくなった、コマンドを実行するとなんと下記のようにエラーが表示される。

```
'"C:\Users\XXXXX\AppData\Local\sfdx\client\bin\..\7.209.6-8ba3197\bin\sfdx.cmd"' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
```

いろいろ検索して、Githubには、再インストールすれば治るよと書いてありますが
再インストールしても治らず、システム環境変数を確認すると
「C:\instrall\sfdx\bin」があり「C:\Program Files\sf\bin」より前に設定されている。
「C:\instrall\sfdx\bin」を削除しVSCode再起動して試したら、
Cliコマンドは問題なく実行できるようになりました。
Dockerイメージ削除方法

Dockerイメージを削除する方法はいくつかあります。以下にいくつかの方法を示します：

1. イメージIDを使用して削除する方法：
   ```
   docker image rm イメージID
   ```

   例えば、イメージIDが`abcdef123456`の場合、次のコマンドでそのイメージを削除できます：
   ```
   docker image rm abcdef123456
   ```

2. イメージのタグを使用して削除する方法：
   ```
   docker image rm イメージ名:タグ
   ```

   例えば、`nginx`という名前のイメージの`latest`タグを持つ場合、次のように削除できます：
   ```
   docker image rm nginx:latest
   ```

3. 未使用のイメージを一括で削除する方法：
   ```
   docker image prune
   ```

   このコマンドは、使用されていない（コンテナに関連付けられていない）イメージを削除します。確認プロンプトが表示されますので、削除する前に確認が必要です。

これらの方法を使用して、Dockerイメージを削除できます。不要なイメージを削除してディスクスペースを節約できますが、注意して実行してください。必要なイメージを誤って削除しないようにしましょう。
m1 macでAzure functions(C#)のdocker環境構築

Azure functionsを触る機会があったのでDocker環境構築した際のつまづいたポイントを残しておきます。

# コンテナイメージ

公式が用意しているfunction用のイメージを使用。

```docker
# 今回は.NETのv6、func-cliのv4が必要だったのでそのバージョンを取得
FROM mcr.microsoft.com/azure-functions/dotnet-isolated:4-dotnet-isolated6.0-core-tools
```

こちらはamdでしか動かないのでplatformに`linux/amd64`を指定。

https://hub.docker.com/_/microsoft-azure-functions-dotnet-isolated

※上記のコンテナを知るまで、自前でSDKやfunc-cliをインストールするイメージを作成していた。

# 起動

上記のコンテナ上で

```bash
func start
```

で動くはずですが、もし動かない場合は言語をオプションで指定。

```bash
func start --csharp
```

# 備考

Azure functions自体はこれで動いたのですが、
自分のケースでは、残念なことにWindowsでしか動かないライブラリを使用する処理があったようで、Docker上では動きませんでした。
仕方がないのでWindows上で直接func-cliをインストールして実行し、このイメージはお蔵入りとなってしまいました。
ただ、それ以外のAPIは普通に動いたので、何かの際には使えるかと思います。
マルチクラウド環境でのHULFTSquareの利用について　ATBeXとの連携で実現してみた

# はじめに
こんにちは！すぎもんです:grinning:


現代ではAWS、Azure、GoogleCloudとメガクラウド環境が多くのお客様に利用されています。
またお客様によっては複数のクラウドサービス、いわゆるマルチクラウドを利用されているケースがあります。
今回はHULFT SquareがネットワークプラットフォームサービスであるATBeXとの連携によりマルチクラウド環境にてセキュアな接続を確立した上でデータ連携が実現できることを検証してみました。

# サービス概要
## ATBeXとは　
ATBeX（AT TOKYO Business eXchange、アットベックス）は、「つながる、広がる」を実現するネットワーク接続を提供します。メガクラウドをはじめ、さまざまなITサービス、データセンター間接続を、お客さまの要件に合わせてオンデマンドで利用することを可能にするネットワークプラットフォームサービスです。
[ATBeXとは](https://atbex.attokyo.co.jp/overview/)
## HULFT Squareとは
HULFT Squareとは、DX実現に必要な「データ活用するためのデータ準備」や「業務システムをつなぐデータ連携」を支援する日本発iPaaS（クラウド型データ連携プラットフォーム）です。オンプレミス・クラウド・SaaSなどの環境に分散し管理されているさまざまなデータを、業務システム間、業種、国・地域をまたぎデータを連携させることができます。

# HULFT SquareとATBeXの連携の価値
<font color="blue">**ユーザーは複数の環境に分散するデータを連携し業務に活用するためには環境間でセキュアな接続を確立する必要があります。 
本連携により、ユーザーは、セキュアな閉域接続でのデータ連携ネットワークが柔軟かつオンデマンドで構築可能となります。**</font>

## HULFT SquareとATBeXの連携メリット

**ATBeXと連携しなかった場合**
①Azure環境とGCP環境を既にご利用のお客様は個別に回線を用意してAWSとのセキュアな専用線接続を構築する必要があります。
②オンプレミス環境からAWSへのセキュアな閉域接続を個別に用意する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534518/b231bac0-e72e-8550-52c8-446bb965d93b.png)

:::note warn
**HULFT SquareはAWS基盤上にて構築されています。**
HULFT Square外のお客様AWS環境へのプライベートな接続にはAWS PrivateLink [^1]を利用する必要があります。
[^1]: AWS PrivateLinkとは
インターネットを経由せず、VPCやサービス間のやりとりをAmazonネットーワーク内で完結させる仕組みのこと。利用するには、どのエンドポイントサービスに紐づけるかを指定するVPCエンドポイントと、接続したいサービスの指定元となるVPCエンドポイントサービスの作成が必要です。
:::

**ATBeXと連携した場合**
①Azure環境とGCP環境を既にご利用のお客様はATBeX経由で１つの物理接続で複数の論理接続にてAWSとの専用線接続を確立できます。
②オンプレミス環境からもATBeXを利用してAWSへの閉域接続を確立できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534518/04096dbb-81a0-0ad7-5af7-a08db4db8cce.png)



# 検証について
## 概要
セキュアな接続を確立した環境間でデータ連携が実施できることの確認を目的に以下の検証を実施致しました。

**①マルチクラウド環境でのデータ連携検証**
**②オンプレミス環境にあるHULFTとのデータ連携検証**

## 環境準備
今回の検証では下記イメージ図の環境を準備しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534518/d6873f31-671e-8c6a-a0f0-643147d635ef.png)

:::note warn
**1.AWS PrivateLinkにはAWSのお客様環境のVPCが必要です。**
:::

今回はテスト用VPCを作成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3534518/5b103541-cac8-1fad-c025-e481635d6ae9.png)

:::note warn
**2.マルチクラウド環境でのデータ連携検証のために、ATBeXの専用線接続経由で接続するAWSとAzureの環境を使用します。**

**ATBeXの接続申し込みとAWS、Azureの接続設定が完了していることが必要です。**
ATBeXのサービス詳細については下記リンクを参照して下さい。
[AWS Direct Connectとは](https://atbex.attokyo.co.jp/about/cloud-connection/aws/)　
[Azure ExpressRouteとは](https://atbex.attokyo.co.jp/about/cloud-connection/azure/)
:::

## 実施手順
:::note info
検証実施手順は以下をご参照下さい。
**①マルチクラウド環境でのデータ連携検証**
[HULFT SquareとAzureをATBeX経由で連携してみた]
(https://qiita.com/sugimon/items/e98bc4f057b4ca5f0e5c)
**②オンプレミス環境にあるHULFTとのデータ連携検証**
[HULFT Squareとオンプレミス環境をATBeX経由で連携してみた]
(https://qiita.com/sugimon/items/593dec9e548883dc1c63)
:::
# おわりに
いかがだったでしょうか。
ATBeXとHULFT Squareの連携によってマルチクラウド環境、オンプレミス環境とのセキュアな接続を確立し、データ連携を実現できることが確認できました。
本記事がネットワークプラットフォームサービスとiPaaSの連携の実現の一助になりましたら幸いです。

ここまで読んでいただきありがとうございました。それでは、また！
【Go言語】Go言語基本型


Go言語でのメモです。

Goには整数型、浮動小数点型、論理型、文字列型など基本的なデータ型があります。


## 整数型

| 型             | サイズ(bit) | 符号 | 最小値      | 最大値         |
| -------------- | --------------------: | ---- | ---------------------:| -----------------------: |
| int8           | 8                     | あり  | -128                  | 127                      |
| int16          | 16                    | あり  | -32768                | 32767                    |
| int32          | 32                    | あり  | -2147483648           | 2147483647               |
| int64          | 64                    | あり  | -9223372036854775808  | 9223372036854775807      |
| uint8(byte)    | 8                     | なし  | 0                     | 255                      |
| uint16         | 16                    | なし  | 0                     | 65535                    |
| uint32         | 32                    | なし  | 0                     | 4294967295               |
| uint64         | 64                    | なし  | 0                     | 18446744073709551615     |

```golang:main.go
	var i8 int8 = -128
	var i64 int64 = 65535
```

## 実装依存の整数型
| 型      | 32bit実装 | 64bit | 符号 |
| ------- | ---------------- | ---------------- | ---- |
| int     | 32bit            | 64bit            | あり  |
| uint    | 32bit            | 64bit            | なし  |
| uintptr | ?                | ?               | なし  |            

```golang:main.go
	var i int = -128
	var ui uint = 300
    fmt.Println(i)
    fmt.Printf("%T\n", i)        // 型を調べる(%T)
    fmt.Println(ui)
    fmt.Printf("%T\n", ui)        // 型を調べる(%T)

```

```text:結果
-128
int
300
uint
```

## 浮動小数点型

| 型      | サイズ (ビット) |
|---------|--------------|
| float32 | 32           |
| float64 | 64           |

```golang:main.go
	var f32 float32 = -128.0
	var f64 float32 =  3141.519
    fmt.Println(f32)
    fmt.Printf("%T\n", f32)
    fmt.Println(f64)
    fmt.Printf("%T\n", f32)

```
```text:結果
-128
float32
3141.519
float32
```

## 論理値型
```golang:main.go
	var t bool = true
	var f bool = false
    fmt.Println(t, f)
```
```text:結果
true false
```

## 文字列型
```golang:main.go
	var s string = "Hello World"
    fmt.Println(s)
    fmt.Printf("%T\n", s)
```
```text:結果
Hello World
string
```
Cognos Analytics 12.0 新機能 アシスタント

# 概要
自然言語の入力でグラフの作成が行える「アシスタント」の機能の紹介です。
自然言語入力は、元々「閲覧ビュー」の機能の一部として存在しましたが、Cognos Analytics 12では独立した機能として提供されています。
ちなみに、2023年9月時点では言語は英語のみのサポートです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/25c71d24-ac5e-5858-9bc0-2d6e0cae7e61.png)

# 参考情報
**アシスタント**
https://www.ibm.com/docs/ja/cognos-analytics/12.0.0?topic=2023-assistant

# 操作手順
Top画面に思いっきり質問入力枠が表示されているのでここから入力でも良いですが、赤枠のアイコンからいつでも呼び出せます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7c018ca8-fe17-e699-1a5e-69be97749a42.png)

まず使用するデータを選択します。「Select source」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/562894ec-3ee6-b799-dd91-42ac9e2224f6.png)

今回はCognosサンプルの「Great Outdoors データ・モジュール」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/54b48866-b518-6e2e-b1eb-a4f2c66d400a.png)

データが読み込まれ、いくつかのデータ・アイテムの説明が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/bd65a231-d5f1-f3b4-a149-fd93c38e47ba.png)

「Ask a question」枠に「show revenue」と入力してみると、Revenueのデータ・アイテムとしての説明が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8cb3e13e-c3b7-1147-bd38-2db6982cb67b.png)

「show revenue by retailer」と入力すると、Retailer毎のRevenueが自動的に最適なグラフを選択して表示されます。
「Top Insights」には、アシスタントが特に注目すべきと判断したポイントが自然言語で説明されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/8835d4de-3e05-4274-12db-7202fc7a9e93.png)

表示されているRetailerが多すぎるので「what is the top 3 revenue by retailer」と入れてみると、上位3Retailerに絞って表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/3a28714e-376e-5b4f-d27b-2f7e4edcbccc.png)

2012年の結果だけを絞ってみたいので、「what is the top 3 revenue by retailer in 2012」としてみます。
「2012」が「年」だという事を言ってないですが、データと文脈から「年」と判断しデータが絞り込まれます。
2012年の場合、先ほどとTop3のRetailerも変わっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ac95dbe4-bed5-a06e-8632-ec473b994537.png)

赤枠のアイコンを選択すると、グラフの種類が変わります。
「share」では、この結果をメールやTeams、Slackで共有する事ができます。
「Add to new dashboard」を選択すると、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/b8a4d629-004a-899c-ed57-e001de3fb207.png)

この様にダッシュボードに対してグラフが添付されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/31dc6fa5-5932-2386-a65c-49d959d10dc6.png)

「アシスタント」アイコンを選択すると、ダッシュボードを見ながらアシスタントの使用が可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/93336d1b-f67e-091d-8514-63bf97445822.png)

全画面アイコンで表示の切り替えができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ffa95a6b-1267-de91-ccea-008ef649ca2b.png)

「More」からそれ以外の機能の呼び出しも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/111461cb-8caf-fa0b-f494-dceafebac024.png)

「クリア」アイコンで、チャットのリセットが可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/7733995a-ca54-766f-0eb7-26fc3183b192.png)

ちなみにFramework Managerで作成したパッケージをデータとして使用する場合は、パッケージの拡張(enrich)が必要となります。
**パッケージの拡張**
https://www.ibm.com/docs/ja/cognos-analytics/12.0.0?topic=packages-enriching
リストに条件をつけて表示しちゃおうwith flutter

こんにちわ！
今回はリストの中のものに条件をつけて、if文で表示する方法について紹介します！
最後まで読んでいただけたら嬉しいです！

## 1,まずリストを作ります

```php

List<String> fruitList = ["りんご", "ブドウ", "梨", "いちご", "さくらんぼ", "スイカ", "メロン"];


```

## 2,リストに条件をつけてif文で表示します
ListView.builderを使ってfruitListの中のものを表示します。
また、今回は"りんご"と"いちご"以外の果物を表示という条件をつけてif文を使って表示します。


```php

ListView.builder(
        itemCount: fruitList.length,
        itemBuilder: (context, index) {
          final fruit = fruitList[index];//指定のリスト fruitList 内の特定の要素を変数 fruit に代入
          // "りんご" と "いちご" 以外の要素のみを表示
          if (fruit != "りんご" && fruit != "いちご") {
            return ListTile(
              title: Text(fruit),
            );
          } else {
            return Container(); // "りんご" と "いちご" は表示しないための空のコンテナ
          }
        },
      ),
```

![スクリーンショット 2023-09-27 10.07.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524127/366465e5-e02d-da14-42ea-9d67dc59c161.png)


## 終わりに
今回の記事は以上になります！
今回も見ていただいてありがとうございました！
また、次の記事で！
【HTML】Tableタグ：CSS編：borderをスタイリングしてみよう！

🌻Table【CSS編】罫線を設定してみよう！

・tableにborder
　→テーブルの外枠に罫線

・th, tdにborder
 　→各セルの外枠に罫線

・table, th, tdにborder
　→二重罫線

・二重線を一重線に
　→tableに「border-collapse: collapse;」

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="mdaLmde" data-user="tomok7" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span>See the Pen <a href="https://codepen.io/tomok7/pen/mdaLmde">
  Table：デフォルトを確認しよう</a> by tomok7 (<a href="https://codepen.io/tomok7">@tomok7</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/8dbd1387-4809-deca-a72f-7dd01eaf15d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/f07d4b69-dbe0-b521-8f78-b6c72306dcdf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/9b25f5c7-00dc-0df2-bcf2-f0f8f95429e3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2525847/633947ed-1679-0bd0-b706-70ebec6bf755.png)
[SCSS]親の親セレクタを &(アンパサンド) を使って引っ張りたい時の方法

# 親の親セレクタを &(アンパサンド) を使って引っ張りたい時の方法

```css
// 最終的な出力
.parent .parent-child {
  color: #fff;
}
.parent:hover .parent-child {
  color: #000;
}
```

これまで無理だと思ってたのでこうしてた

```scss
.parent {
  &-child {
    color: #fff;
  }
  &:hover {
    .parent-child {
      color: #000;
    }
  }
}
```

以下のように 変数で定義すると成功した

```scss
.parent {
  &-child {
    color: #fff;
  }

  //$key = .parent
  $selector: #{&};

  &:hover {
    // parent:hover .parent-child になる
    & #{$selector}-child {
      color: #000;
    }
  }
}
```
web上で操作できるmarkdownエディタっぽいものを作ってみた

![68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f313133383430312f31653739636136312d316135312d376666332d353363332d316565643162336237353564.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1138401/2ce2aea6-9339-6d6f-1c60-d89253e62de8.png)


完成品: [markdown-editor](https://bellsanct.github.io/markdown-editor/)
リポジトリ: [https://github.com/bellsanct/markdown-editor](https://github.com/bellsanct/markdown-editor)

# 背景  

- 初級者向けにmarkdownを布教するにあたり、対象の環境に影響を与えずティーチングしたい
- web上でもエディタ・プレビュー同時に開けるツールはいくらでもあるけど自作してみたい
- こだわりすぎるとキリがないので超短期間で作る
-> 3日という具体的なタイムリミットを決めた
- 最近はコードを書く機会がめっきり減ったのでリハビリがてら制作

# 導入方法
以下のどちらかでOK
- [markdown-editor](https://bellsanct.github.io/markdown-editor/)へアクセスする
- リポジトリから`git clone`してローカル実行

# 使用技術
- React
- React Bootstrap(簡易的な装飾)
- Github Pages(デプロイ先)

# ざっくりとした仕組み
- 画面全体を縦2つに割ってエディタ部とプレビュー部を用意
- useStateで入力監視からプレビューの再描画まで行う
- 読込・保存時の挙動を実装

# 使い方
- 手元のmarkdownを読み込みたい場合は「読込」ボタンから読み込む
- 画面左側のエディタ部にmarkdownテキストを記入
- リアルタイムで右側のプレビュー部にプレビューが表示されます
- 保存したいタイミングで「保存」ボタンを押す
-> 新規作成の場合、markdown-yyyymmdd.mdでファイル名が固定されます


# これからやりたいこと
- 作成中の文面をlocalStorage等へ一時保存する機能の作成を行う
-> ブラウザ更新すると文面が飛ぶのは避けたい...
- .mdだけでなく.markdownにも対応させる
- 全体的にマテリアルデザインへ変更を行う
- ファイル名を自由に変更することを可能にする
-> googleドキュメントライクだと理想
- プレビュー部を自由に展開・収納できるようにする
-> レスポンシブ対応の一環

# まとめ
- 環境を汚さずとりあえずmarkdownに触れたい人におすすめ
- 久々にReactで簡易的なアプリを制作したけど楽しかった
-> ChatGPTにコードを部分的に書かせてかなりの時短ができた
- 入門者用のトレーニング機能とか作っても良いかもしれない
C言語で行列計算


## アルゴリズム
行列Aと行列Bの積は、以下の手順で行われる。
1. 行列Aの行番号iを固定して列番号jを動かす。
1. 行列Bの列番号countを固定して行番号jを動かす

## プログラムを書くポイント
for文を二重ループにして計算することを考えると、
```c
for(int i=0;i<N;i++){
    for(int j=0;j<N;j++){
        // ここの中身はiが固定されたまま、jが変化していく
    }
}
```
このとき、計算するたびに動かしたい行列Aの列番号と行列Bの行番号はjにすることが考えられる。
また、行列Aの行番号はfor文の二重ループの順番通りにアクセスできれば良い。
```c
for(int i=0;i<N;i++){
    for(int j=0;j<N;j++){
        printf("%d", matA[i][j]);
    }
}

// 出力は、2×2の行列の場合
// matA[0][0]
// matA[0][1]
// matA[1][0]
// matA[1][1]
// の順に表示される

```
一方、行列Bの列番号については要素iとは別で固定してループさせる必要がある。
具体的には変数iを固定したまま、変数jのfor文を行列Bの列数分実行したい。
そこで、変数iを回すfor文の中に、変数jを回すfor文を内包するループを設ける。



## プログラム
```c
#include <stdio.h>
// # define N

int main(void){
    // 計算する行列はここで定義
    int N = 2; // 2×2の正方行列とする
    int matA[2][2] = {{1, 2}, {1, 2}};
    int matB[2][2] = {{3, 4}, {4, 1};

    int element = 0; // 計算結果の各要素

    // 以下のコメントアウトではi=0, j=0の時の計算を見てみる。
    
    for(int i=0;i<N;i++){
        int count = 0;
        while(count<N){
            element =0;
            for (int j=0;j<N;j++){
                /*
                計算結果として出力したいのは、
                i=0, j=0, count=0のとき
                    element += matA[0, 0]*matB[0, 0] = 1*3
                i=0, j=1, count=0のとき
                    element += matA[0, 1]*matB[1, 0] = 2*4
                */
                
                element += matA[i][j]*matB[j][count];
            }

            // 変数jのfor文を抜けたら出力
            // 計算結果 element = 計算結果の行列[0][0] = 1*3+2*4 = 11
            // ちなみに変数elementは計算結果の行列[i][count]に相当。
            printf("%d\n", element); 
            count += 1;
        }
    }
}
```

## 解説

変数の値を書き下してみる。
```
i j count
0 0 0
0 1 0
0 0 1
0 1 1
1 0 0
1 1 0
1 0 1
1 1 1
```
この順番でfor文を回すと、変数iとjが行列Aの要素にアクセスする順番、
変数countと変数jが行列Bの要素にアクセスする順番になっていることが分かる。

## 改良
上のプログラムだとちょっとわかりにくいので、変数名をいじってもう少し分かりやすくする。

変数名は以下のように設定し直す。
- 変数countは名前がおかしいので、i, jの次のアルファベットであるkにする。
---
nrowA = the number of rows of matrix A
- 行列Aの行数：nrowA 
- 行列Bの列数：ncolB (=nrowA)
- 行列Aの列数：ncolA
- 行列Bの行数：nrowB

---
- 計算結果の行列：matR


```c
#include <stdio.h>
int main(void){

    // 2×2の正方行列とする
    int nrowA =2;
    int ncolA= 2 ;
    int nrowB = 2;
    
    int matA[2][2] = {{1, 2}, {1, 2}};
    int matB[2][2] = {{3, 4}, {4, 1}};
    int matR[2][2];
    
    for(int i=0;i<nrowA;i++){
        for(int k=0;k<nrowB;k++){
            matR[i][k] = 0;
            for(int j=0;j<ncolA;j++){
                matR[i][k] += matA[i][j]*matB[j][k];
            }
            printf("%d\n", matR[i][k]);
        }
    }

}
```


### 感想
深夜テンションでプログラムを作ったので、なんか気持ち悪いプログラムになったかも。数学的にいい感じのインデックス名の付け方とかなかったかな...
Docker Desktopが立ち上がらない時の対処法

始業時にDocker Desktopを立ち上げようと思ったら、
`docker failed to initialize`
`Docker Desktop is shutting down.`
という表示が出て焦る。昨日まではこんな表示なかったのに…。

翻訳すると"dockerの初期化に失敗しました。Docker Desktopを閉じます。"
とりあえずタスクマネージャーを立ち上げてみると、
まだ立ち上がっていないはずのDocker Desktopの表示があったのでタスク終了。
再度Docker Desktopを立ち上げると見事成功しました。
ドメイン名のライフサイクルマネージメント

# はじめに

最近ドメイン名のライフサイクルマネージメント(DLCM)ができていない事例がみられますが、この手の問題をなくすことは難しいです。ドメイン名は、特許や商標と同等、ものによってはそれもよりも価値の高い知的財産権であることは関係者ではれば周知の事実ですが、非常に簡単に登録できるあまり、それが一般にはまだ浸透していないと言うことでしょう。
レジストラ（登録代行事業者）も登録時は簡単に登録できることを煽ってますしね。

## オークションの話

上記認識は今回オークションが行われたGMOも例外ではなく、ドメイン名の更新をドロップキャッチされた際のリスクなどを使って盛んに（鬱陶しいほど）訴えてきます。同時に、ドロップキャッチするサービス（今回のオークションとかも含むバックオーダ）は、逆に、元サイトの価値を言ってるので、両手になんとか状態。。

登録済みドメイン名のオークションはともかく、ドロップキャッチした（再登録可能になり、再登録した）ドメイン名のオークションは透明性とか、どうなんだろうなとは思います。
本当に他の入札者がいるのかとか。価格の釣り上げ行為がされていないのかとか。

ただ、GMOが悪いというよりは、こう言うレジストラの方が世界的にはむしろメジャーです。

JPドメイン名に関しては、いっそ、登録回復期間後に再登録受付期間作って、レジストリであるJPRSがオークションすればとは思います。その方がレジストリに収益が入る分いくらか日本のインターネット全体の利益になりますしね。

## DCLMの運用

DLCMを作って運用している組織でも、漏れは発生します。
知的財産権という面のドメイン名の管理だけではなく、他のマネージメントシステムでもドメイン名の管理状況を確認するなどの重複チェックが有効だと思います。
要はDLCMで管理されてないドメイン名も世の中に出る前、出た後、最悪サービス終了までに捕捉できるような体制が必要ということです。

例えば、自社サービスのWEBサイトのセキュリティの管理（証明書や脆弱性管理）なども行なっているはずなので、その際にドメイン名の管理がされているか確認できればいいです。
また、ドメイン名の管理状況の確認と同時に、メールの送信ドメイン認証やDNSSECなどのドメイン名セキュリティの管理などを絡めることで、より管理状況が放置されていることに気付きやすくなると思います。

## 根本的な問題

根本的には現在のドメイン名（インターネット上の番号資源等）は利用しなくなったら返却し再利用することが前提になっているため、登録者がミスると発生してしまい、この問題をなくすことは難しいです。

一度ちゃんと利用したドメイン名を適切に手放すことは非常に難しい状況で、何十年も利用しないでただ維持し続ける塩漬けドメイン名になります。

似たような資源にIPアドレスやAS番号とかもありますが、ドメイン名はいわゆる**汚れ具合**がひどく他者に渡すことが困難なため、再利用には適していないと考えます。

解決案として考えたのが、ドメイン名を一度登録したら永年登録者としての権利を持てるようにすることです。（譲渡は可能）

ただ、ドメイン名も設備や運用にお金がかかるため、登録時の一回払いにするとエコシステムが破綻するため、ドメイン名を利用する場合は別途利用料を払うという２段階のシステムにする方が良いのではと思います。
ちなみに、業界内では100年利用期間付与の案も度々話題に出るのですが、長期利用を一括で払うパターンはTLDを運用しているレジストリ側（登録代行事業者のレジストラが登録してもらう先）の財政が安定的しなくなるため、難しいようです。

gTLDに実装するのは難しいかもしれませんが、JPドメイン名であれば、実装することも可能かもしれません。

例えば汎用JPに利用料N年分の相当の費用まとめて払うと永年登録者になれるオプションを作る。
永年登録可能なインフラや金融サービス用のJPドメイン名を新設するというのもなどが考えられれます。
（ラベルの追加は近年も都道府県型JPとかだしてるので技術的に可能のはず）

正直、私の中では再利用の仕組みはすでに破綻していると考えています。
また、ドメイン名登録者の努力だけでは完全に解決できない部分も多々あり、それに便乗して利益をえる方々がいる歪な状況です。
努力ではなく仕組みとして解決できるような方向性になるといいなと思います。
シェルスクリプトでディレクトリを移動できない理由と対策

- 何をしていた？
    - シェルスクリプトでディレクトリを移動しようとしていた。
- 何がやりたかった？
  - Python の仮想環境の作成と起動を一つのスクリプトでやりたかった。
    - ```python -m venv hoge``` で環境を作り、cd で移動してアクティベートしたかった。
- 何故できなかった？
  - シェルスクリプトは通常、子プロセスとして起動され、その実行が終了するとプロセスが終了し、親プロセスには影響を与えないから。
- 何をすればいい？
    - ```source fuga.sh``` か ```. fuga.sh``` のようにスクリプトを呼び出せばいい。
```sample.sh
#!/usr/bin/sh
# レンタルサーバーの Python 環境を再現する仮想環境
# Python Version: 3.6.8

# 仮想環境が既に存在する場合は終了
if [ -d ./.env36 ]; then
  echo "仮想環境は既に存在します。スクリプトを終了します。"
  exit 1
fi

# 仮想環境の作成
python3.6 -m venv .env36
cd ./.env36/
source ./bin/activate
python -m pip install --upgrade pip

# ライブラリは pip で入れられるものに限る
python -m pip install sphinx

echo ""
echo "仮想環境を起動するには source でこのスクリプトを起動するか、"
echo "次のコマンドを入力してください"
echo "cd ./.env36/"
echo "source ./bin/activate"
```