OmniAICreator/Qiita-1.07M huggingface dataset:
【Vue.js】computedとwatch、何が違うの

## よく見る子たち
Vueにはcomputedとwatchという機能がある。よく目にするけど、Vueの上の方に書いてあって、値を監視してるっていうざっくりとした印象しかなくてどんな違いがあるのか全くわかってない。ドキュメント読んでもわからない。

## 一応、違いと使い分け

調べてみたところこんな感じらしい

1\.computedの方が同じ処理を少ない記述で書ける。
2\.computedは、単純な計算やフィルタリングなどの処理を定義したいときに使用する。
3\.returnせずに（プロパティの値を変更せずに）、変更に合わせて処理を行うだけなら、watchを使う。
4\.初回ロードで処理を実行したくない場合はwatchを使う
5\.非同期な処理を行ったり、APIリクエストの発行処理を定義したいときはwatchを使う

ふむ、、、？
watchはdataで定義したプロパティを監視対象にするのに対し、computedは監視対象となるプロパティを定義する、、、ふむ、、、？

## 書いてみた
```HTML
<script src="https://cdn.jsdelivr.net/npm/vue@2.7.11/dist/vue.js"></script>
<div id="app">
  <div>
    <p>{{ counter }}</p>
    <button @click="counter += 1">
    +1ボタン
    </button>
    <p>
    {{ lessThanThreeComputed }}
    </p>
  </div>
</div>
```
```javascript
new Vue({
  el: '#app',
  data: {
    counter: 0,
  },
  computed: {
    lessThanThreeComputed() {
      return this.counter > 3 ? '3より上' : '3以下'
    }
  },
  watch: {
    counter: function() {
      var vm = this;
      setTimeout(function() {
        vm.counter = 0
      }, 3000)
    }
  }
})
```

>1\.computedの方が同じ処理を少ない記述で書ける。

確かに記述量は少なくなりそうな印象
とはいえ、

>watchはdataで定義したプロパティを監視対象にするのに対し、computedは監視対象となるプロパティを定義

この通り、わざわざlessThanThreeComputedプロパティを作らないといけないのは多少めんどくさい気もした


## できたもの
![スクリーンショット 2023-10-04 8.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728620/6739f5cb-8308-2ea8-5708-46e34a28448f.png)

この「＋1ボタン」をぽちぽちしていくと
![スクリーンショット 2023-10-06 7.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728620/88d60c54-46d7-47d9-42f3-a7cd9f11d898.png)
上の数字が４以上になった時点で下に「３より上」と表示される。この動作はcomputedのおかげ

>2\.computedは、単純な計算やフィルタリングなどの処理を定義したいときに使用する。

まさにこの動作を担ってくれてる


そして、この後3秒待つと、、、
![スクリーンショット 2023-10-06 7.51.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2728620/aedbf1ee-e10a-1212-388c-5653b7068eee.png)

元に戻った！！これはwatchが働いているため:eyes:

>3\.returnせずに（プロパティの値を変更せずに）、変更に合わせて処理を行うだけなら、watchを使う。
4\.初回ロードで処理を実行したくない場合はwatchを使う
5\.非同期な処理を行ったり、APIリクエストの発行処理を定義したいときはwatchを使う

この特徴に沿って実装した。特に、非同期処理とかで良く使われるらしいので今回はsetTimeout()と組み合わせてみた。

##終わり
computedとwatch、この2つの動きに明確な違いがある、というよりも役割が分かれている、という感じだった:eyes:こんな細かいことはドキュメント読んでも業務の中でも気づけなかったと思うので実際にかけて満足！
AIチャレンジ2（経済成長率の予測）

※、ご指摘を受けた事項について、修正いたしました。ご指摘、ありがとうございました。
2023年10月7日

 今回は、PythonとKerasを使ってAIを作成してみたいと思う。

　内容は以下の通り。
1. 四半期ベースで日本のGDPが上昇もしくは加工するかを予測するAI

2. データは経産省からダウンロード
https://www.esri.cao.go.jp/jp/sna/menu.html

3. 四半期経済で成長したかしていないかについて、4つの説明変数を用いて二値分類モデルとKerasで学習

4. これらのソース・データを以下のフォルダにまとめております。
https://github.com/horiivalue/horiivalue.git/AIチャレンジ2

※細かいインポートは省略させていただきます。

# データ

```Python
# データをPandasで読み込み
dataset_keizai = pd.read_csv("ritu-jk2322.csv")

# データを5行だけ表示
dataset_keizai.head()

# 列の抜き出し
dataset = dataset_keizai[['国内総生産(支出側)', '家計最終消費支出', '輸出', '民間企業設備','輸入']]

# 列名をリネームする
dataset = dataset.rename(columns={'国内総生産(支出側)': 'keizai', '家計最終消費支出': 'kakei', '輸出': 'export', '民間企業設備': 'minkan', '輸入':'import'})

dataset.head()

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/d208684b-ee92-5595-31ac-5b0491104bdb.png)

# データ加工

```Python
for i in range(117):
    s = dataset.iloc[i, 0]
    if s > 0:
        dataset.iloc[i, 0] = 1
    else:
        dataset.iloc[i, 0] = 0
dataset.head()

Y = np.array(dataset['keizai'])
X = np.array(dataset[['kakei', 'export', 'minkan', 'import']])
print("Y=", Y.shape, ", X=", X.shape)

from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler()
X = sc.fit_transform(X)
X

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.3, random_state=0)
X_train, X_valid, Y_train, Y_valid = train_test_split(X_train, Y_train, test_size=0.3, random_state=0)

```
# 学習と学習効果

```Python
# モデルの初期化
model = keras.Sequential()

# 入力層
model.add(Dense(8, activation='relu', input_shape=(4,)))
# 隠れ層
model.add(Dense(8, activation='relu'))
# 出力層
model.add(Dense(1, activation='sigmoid'))

# モデルの構築
model.compile(optimizer = "rmsprop", loss='binary_crossentropy', metrics=['accuracy'])

%%time
# 学習の実施
log = model.fit(X_train, Y_train, epochs=5000, batch_size=24, verbose=True,
                callbacks=[keras.callbacks.EarlyStopping(monitor='val_loss',
                                                         min_delta=0, patience=100,
                                                         verbose=1)],
         validation_data=(X_valid, Y_valid))

plt.plot(log.history['loss'], label='loss')
plt.plot(log.history['val_loss'], label='val_loss')
plt.legend(frameon=False) # 凡例の表示
plt.xlabel("epochs")
plt.ylabel("crossentropy")
plt.show()

# predictで予測を行う
Y_pred = model.predict(X_test)

# 二値分類は予測結果の確率が0.5以下なら0,
# それより大きければ1となる計算で求める
Y_pred_cls = (Y_pred > 0.5).astype("int32")

Y_pred_ = Y_pred_cls.reshape(-1)
from sklearn.metrics import classification_report

print(classification_report(Y_test, Y_pred_))

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533364/87f5bb6d-75d2-20f4-5678-9200e8c3d437.png)

と、そこそこいい成果が出せたと思います。
MSP430でI2C Slave

PIC12F1822のI2C Slaveが不安定なのとMPLAB Xが重いので、部品棚のマイコンストックを見回してMSP430のI2C SlaveをPlatformIOで作ってみました。

もちろん開発は[FreeBSDのBastilleBSD](https://qiita.com/yamori813/items/e157190517f700badcce)でおこないます。

githubを探したら以下のコードがありました。

https://github.com/wendlers/msp430-i2cslave

このレポジトリのslave/srcをpioでビルドしてみます。

mspdebugはpioの物はライブラリがなくて動かないのでbastille pkgでFreeBSDのpkgをインストールしておきます。

```
% pio init --board lpmsp430g2553
ソースをコピー
% pio run
% mspdebug rom-bsl -d /dev/cuaU0 "prog .pio/build/lpmsp430g2553/firmware.elf"
```

以前timsp430を試した時は32Bitで試して上手くいかなかったようなのですが、64Bitではちゃんとパッケージがあってビルドできました。

ときどきmspdebugがターゲットを認識しない事があり、その時は接続しなおすと上手くいくことがあります。

USBのシリアルインターフェースがjail内でユーザ権限でアクセスできるようにしてあります。どっかに設定方法書いたような記憶があります。

I2Cのピンは以下のように接続します。

|ピン|機能|
|:--|:--|
|1|VCC|
|20|GND|
|14(P1.6)|SCL|
|15(P1.7)|SDA|

蟹さんのmruby on YABMでLチカできました。

```ruby
# 初期化省略
MSPADDR = 0x48

loop do
    yabm.i2cwrite(MSPADDR, 0, 0)
    yabm.msleep 2_000
    yabm.i2cwrite(MSPADDR, 0, 1)
    yabm.msleep 2_000
end
```

FreeBSDでもいけました。

```ruby
MSPADDR = 0x48

t = BsdIic.new(0)

loop do
    t.write(MSPADDR, 0, 0)
    sleep 2
    t.write(MSPADDR, 0, 1)
    sleep 2
end
```

PIC12はまともなオープンソースが無いのも辛いです。

蟹さんでreadすると落ちます。oz_
Apache Kafka®とOSSコラボレーションのすべて

<font color="Grey">*[All in for Apache Kafka® and OSS collaboration](https://aiven.io/blog/all-in-for-apache-kafka-and-oss-collaboration)の翻訳です。*</font>

2022年11月14日

# Apache Kafka®とOSSのコラボレーションのすべて

AivenはApache Kafka®コミュニティに専任のフルタイムチームで貢献しています。私たちの活動の詳細をご覧ください！

オープンソースのイベントストリーミングソフトウェアである[Apache Kafka®](https://aiven.io/blog/what-is-apache-kafka)は、データの収集、処理、保存、分析を必要とする人にとって強力なツールです。データがすべてを支配する世界では、Apache Kafkaは不可欠です。高性能、低レイテンシー、フォールトトレランス、高スループットで知られ、毎秒数千のメッセージを処理できる。実際、フォーチュン100社の80%以上がApache Kafkaを信頼し、使用しています。


Apache Kafkaはその多機能性に加え、オープンソースであり、その背後には熱心で精通したコミュニティがあります。Aivenはオープンソースを重視し、管理の手間を省くことで、Apache Kafkaの価値をいち早く見出し、クラウドでマネージドApache Kafkaを提供した最初の企業です。


プラットフォームと[Apache Kafkaの機能](https://aiven.io/kafka)を構築し続ける中で、私たちは貢献することの重要性も認識しています。オープンソースソフトウェアのダウンロードは無料ですが、それを維持するための作業は、魔法のようにただ起こるわけではありません。成功を確実にするために、リソースは間違いなく使われます。


## オープンソースプログラムオフィスは貢献し返す


Aivenでは、オープンソースの価値観を実践しています。そのため、オープンソースの持続可能性に取り組むことを目的とした[オープンソースプログラムオフィス](https://aiven.io/open-source)を設置しています。


オープンソースへの貢献は多方面からのアプローチです：


* オープンソースコミュニティの育成と活性化。例えば、Aivenが最近買収した[Klaw](https://aiven.io/blog/introducing-klaw-for-apache-kafka-governance)(旧Kafkawize)。
* オープンソース・プロジェクトに従事する開発者の雇用
* オープンソース・プロジェクトへの貢献に対して、たとえその仕事がAivenでの役割と直接合致していなくても、従業員に報酬を支払う。


具体的には、AivenにはオープンソースのApache Kafkaにフルタイムで取り組む専門チームがあります：**Matthew de Detrich**、**Chris Egerton**、**Greg Harris**は、私たちの疲れ知らずのチャンピオンです。このユニークなアプローチは、貢献者が製品とOSSの間で両立を余儀なくされる他の多くの企業とは一線を画しています。Aivenはまた、オープンソースコミュニティを多様化することの重要性を、コミュニティの繁栄と中立性を維持するための重要なポイントであると考えています。


## 新しいApache Kafkaコミッター


Apache Kafkaのプロジェクト管理委員会は、Chris Egertonをコミッターとして招聘し、Chrisがこれを受諾したことをお知らせします。Chrisは2017年からApache Kafkaに貢献している。彼は主に[Apache Kafka Connect](https://aiven.io/kafka-connect)を中心に80以上のコミットを行った。


Chrisの最も顕著な貢献には、[KIP-507: Securing Internal Connect REST Endpoints](https://cwiki.apache.org/confluence/display/KAFKA/KIP-507%3A+Securing+Internal+Connect+REST+Endpoints) や [KIP-618: Exactly-Once Support for Source Connectors](https://cwiki.apache.org/confluence/display/KAFKA/KIP-618%3A+Exactly-Once+Support+for+Source+Connectors) などがある。


Exactly-Once KIPは、Kafka Connectのメッセージ配信が「最低1回」ではなく「正確に1回」行われるようにするための重要な変更です。At least onceプロトコルは、繰り返されるメッセージを考慮する必要があるため、メッセージの処理が複雑になります。Exactly onceは、各メッセージが一度だけ配信されることをフレームワークが保証するため、より簡単なロジックでデータを処理できる。


Aivenでは、オープンソースへのコミットメントに誇りを持っており、コミュニティに焦点を当てた方法でOSSにアプローチすることに大きな価値を見出しています。


#### Aiven <3 オープンソース

AivenのOSPOはPGhoard、PGlookout、Karapace、Klaw...と連携しています。詳しくはオープンソースのページをご覧ください！

[チェックする](https://aiven.io/open-source)

Aivenと私たちのサービスに関する最新ニュースや、オープンソースに関するちょっとした情報を得るには、[私たちの月刊ニュースレターを購読](https://aiven.io/newsletter)！Aivenに関する日々のニュースは、[LinkedIn](https://www.linkedin.com/company/aiven/)と[Twitter](https://twitter.com/aiven_io)のフィードでご覧いただけます。


サービスのアップデート情報を知りたい方は、[変更履歴](https://aiven.io/changelog)をご覧ください。


マネージド・データ・プラットフォームをお探しですか？<https://console.aiven.io/signup>から無料トライアルにお申し込みください！
aタグの挙動は上書きできる

# TL;DR
a タグはクリック時にデフォルトで別のリンクへ移動するという挙動をするが、JS側でその挙動を書き換えることができる。

# きっかけ
あるWebシステムのスクレイピングをしていた時に、aタグなのに遷移されないサイトを発見した。
内部実装が気になり調べてみた。

# jQueryでの実装
実装部を確認したところ、jQueryで実装されていた。
以下が該当部分である。
```js
// ドキュメントの読み込み終了時
$( document ).ready( function (){
	// リンククリック時
	$('.play_vod').live("click",function(event){
		// 行いたい挙動をここに記述
		return false;
	});
});
```

# 素のJSでの実装
jQueryを用いずに実装する場合、以下のようにできるらしい。
`preventDefault` でDefaultな挙動を防止。
```js
// 要素の取得 & リスナーの設定の
document.getElementById('myLink').addEventListener('click', function(event){
// デフォルトの挙動（リンク先に遷移すること）をキャンセル
    event.preventDefault();  
    alert('Link was clicked!');
});
```

# 所感
aタグに設定したリンクで状態の再現性を保てる実装なら適切な場合もあるが、
基本的にはHTMLドキュメント的にはaタグでボタンのようなカスタムな挙動を実装するのはベストプラクティスではないのではと思った。
ご意見・ご指摘等お待ちしてます。
Chandra衛星のデータを解析したいのでwindows 10 pcにciao等をインストールする

# はじめに
Windows 10 pc でciaoを使ってChandra 衛星のデータを解析したい！ということでインストール方法をまとめました。
前提としてWSL2 + Ubuntu + VSCodeの環境であることが条件です。
この環境も以下の記事様が解説してくださっています。

https://qiita.com/zaburo/items/27b5b819fae2bde97a3b



# やりたいこと
-VcXsrvのインストール
-heasoftのインストール
-ciaoのインストール
-実際にciaoを使ってみる
-Fluximage を作成する
-Maege してみよう(近日公開)


# VcXsrvのインストール
以下のリンクからダウンロードします。

https://sourceforge.net/projects/vcxsrv/

そしてインストールします。インストール先はどこでもいいです。

次に画面左下のWindowsのマーク(これなんて言うんやっけ？)を押してVcXsrvのファイルを探し、XLaunchを起動します。すると色々な画面が出てくるのでMultiple Windowsを選択してください。次のページに移動し、Client startupのページに行きますが何も触らずに次のページに移動します。Extra settingsに行きますのでDisable access controlにチェックを入れてください。次のページに行って完了を押してください。



# heasoftのインストール
このサイト様がとても分かりやすく解説しています。

https://hackmd.io/@ystl/Skamh2XDB



# ciaoのインストール

下のURLに移動して、step 1のDownload ciao-install with the base CALDB をクリックし、ciao-installをダウンロードします。

https://cxc.cfa.harvard.edu/ciao/download/ciao_install.html

![ciao_install_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566908/93772511-6a5c-0624-ebb0-329cb748b704.png)

次にこのコマンドをインストールしたいpathで実行します。

``
% bash /(ciao-installがあるpath)/ciao-install
``

実行すると、softというディレクトリがないけど作る？みたいなメッセージが流れます。Creat(c)と書いているのでcと打ってエンター押しましょう。次に

```
Download directory for tar files (インストールしたいpath):
CIAO installation directory (インストールしたいpath):
```

と流れるのでインストールしたいpathが書かれていることを確認し、エンター押しましょう。更に

```
Run smoke tests? (y|n) (y):
Delete tar files after install? (y|n) (y):
Save these settings? (y|n) (y):
```

となるのでXLaunch(VcXsrv)を起動してから全てyと打ってエンター押しましょう。するとダウンロードとインストールが何回も繰り返し行われます。Creating binary compiled python modulesの後にRunning smoke testsが始まります。40個のテストが終わるとsoftディレクトリの1つ下にciaoがあります。

``
% ciao
``

と入力すると

```
CIAO configuration is complete...
・
・
・
CALDB       : (バージョン名、私の場合は4.10.7)
```

と表示されていることを確認してください。CALDBがインストールされていない場合はバージョン名が書いていません。

また

``
% ds9
``

と入力し、XLaunchが起動することを確認してください。

![ciao_xlaunch.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3566908/18f70310-d2cf-8db3-4208-2f084f33c4e0.png)



# 実際にciaoを使ってみる
## Fluximage を作成する

次のサイトに行って、

https://cda.harvard.edu/chaser/

Target Nameに調べたい天体名を入力し、エンター押しましょう。すると色々出てくるので、調べたいデータのObs IDをメモしておきます。そして次のコマンドを実行します。その時メモしていたObs IDを入力することを忘れずに。

```
download_chandra_obsid (Obs ID)
```

かなり時間がかかります。皿でも洗いながら待ちます。終わると次のコマンドを実行してください。

```
cd (Obs ID)
chandra_repro indir=. outdir=repro
fluximage . fluxed/
ds9 fluxed/broad_flux.img -region fluxed/(Obs ID).fov
```

これもかなり時間がかかります。洗濯物を回して干してしまいましょう。
1つ注意があってds9のコマンドを実行する時は予めVcXsrv(XLaunch)を起動しておきましょう。

ds9のコマンドを実行すれば見事Fluximageの作成に成功です！


## Margeしてみよう
近日公開




# 参考文献

https://rin-ka.net/windows-x-server/

https://hackmd.io/@ystl/Skamh2XDB

https://cxc.cfa.harvard.edu/ciao/threads/ciao_install_tool/
EC2 で CloudBeaver 環境を簡単に用意する

こんにちは。インサイトテクノロジーの松尾です！

みなさまデータベース接続のクライアントに DBeaver を使ってますか？私は結構使ってます。DBeaver は様々なデータベースに接続可能な無償のデータベースクライアントで、非常に便利ですよね。アプリケーションとして利用することができ、Windows PC などにインストールして使用します。

https://dbeaver.io/

非常に便利なのですが、難点としてはPCにインストールする必要があるということです。

今回は、ブラウザから利用できる DBeaver である、CloudBeaver について、簡単に環境を用意する手順を紹介します。

ブラウザから利用するため当然アプリケーションサーバーを起動する必要があります。AWS Marketplace でも提供されておりますが、わずかながら費用が発生するのと、AWS Marketplace を利用できない場合もあると思いますので、本投稿では Amazon Linux 起動時に Docker で CloudBeaver を立ち上げる手順を紹介します。

https://aws.amazon.com/marketplace/pp/prodview-44ibqklm4oiwy

## CloudBeaver = ブラウザ版の DBeaver

CloudBeaver は以下の画面のようにまさにブラウザから利用できる DBeaver です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/d9af64c1-6ac6-0fae-2d62-b83b36627928.png)

https://github.com/dbeaver/cloudbeaver

前述のとおり AWS Marketplace でも提供されていますが、無償の Community Edition を Amazon Linux 起動時に簡単に構成できますので、何かの参考になれば幸いです。

## EC2 起動時にユーザーデータで指定して一発で起動

CloudBeaver そのものは Docker で動かすことができます。

https://github.com/dbeaver/cloudbeaver/wiki/Run-Docker-Container#running

そのため、EC2 起動時に Docker サービスをインストール起動して、CloudBeaver のコンテナを起動してあげればよさそうですね！大きいデータベースにつないだ時に動作するかは不明ですが、小さいものであれば、以下のようなスペックでも Oracle に接続してデータベースの中身を確認することができました。
* OS(イメージ) : Amazon Linux 2023
* インスタンスサイズ : t2.micro
* ストレージ : 8GB (イメージのデフォルトのまま) 

```bash
#!/bin/bash
dnf -y install docker
systemctl enable --now docker
mkdir /opt/cloudbeaver
docker run -d --name=cloudbeaver -p 18080:8978 -v /opt/cloudbeaver:/opt/cloudbeaver/workspace --restart always dbeaver/cloudbeaver:latest
```

↓ EC2起動時のユーザーデータに貼り付けたイメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480312/ce3bb036-ff7d-f6fa-d98d-457127bb1c62.png)

簡単でしたね、これで起動した環境にポート 18080 で接続すれば、最初の初期設定画面が開きます。

## 参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html?icmpid=docs_ec2_console#user-data-shell-scripts

ぜひご活用いただければ幸いです。
webGLでビルドしたものをローカル環境で動作させる方法

# はじめに
webGLとは、Unityで作ったプロジェクトをwebブラウザ上で動作させるための仕様のことです

webGLでビルドすると、ビルド完了時は自動的にwebブラウザにUnityで作ったものが表示されます
とても便利ですが、次回webブラウザ上で動かそうと思っても表示できなくなります
![webGL_error.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784580/046ed193-b6e2-ce77-c7bc-d1d5745d8404.png)

今回はこの解決方法を説明します

# 開発環境
* Windows10
* Unity - 2021.3.6f1

# ビルド前の設定
1. Unityでビルドしたいプロジェクトを開きます
1. Edit > Project Settings... > Player を開きます
1. webGlのタグを開きます
1. Enable ExceptionsをNonenに、Compression FormatをDisabledに変更します
![Player Settings.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784580/b49d7c46-3a02-4809-fb27-f06c396ebf9e.jpeg)
1. File > Build Settings... > webGL を開き、SwitchPlatformをクリックします
1. Build And Runをクリックします
1. 1. ビルドしたものを保存するフォルダを新規作成して選択すると、ビルドが開始されます

# ローカル環境で起動する方法
1. ビルドしたファイルが保存されているフォルダで右クリックし、ターミナルかコマンドプロンプトを起動します
![open_terminal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2784580/4bf63cd5-27c4-c0b5-ea02-893b1a638b6f.png)
1. ターミナル｜コマンドプロンプト
    ```
    PS C:\Users\xxxx\xxxx\build> python3 -m http.server 8000
    ```
    と入力し、エンターを押します
1. http://localhost:8000/ にアクセスするとUnityで作ったプロジェクトを実行できます

# まとめ
Unityで作成したものをwebGLでビルドした時に、ローカル環境で動作させる方法について紹介しました

ローカル環境で動作させるために、Player Settingsでビルドじに生成するファイルを圧縮しないように設定しているので、サーバにあげるときはよくない方法だと思います
ローカル環境でプレイしたいときだけにすることをお勧めします

## 参考資料
* [Unity WebGL2.0でビルドしたシーンをWeb Server for Chromeで立ち上げたらエラー](https://zenn.dev/iwaken71/scraps/c7053e7c595094)
* [UnityのWebGLビルドのローカル確認方法とエラー対応](https://qiita.com/mikito/items/9a49f4b7cc13e2e82692)
CFDEM-PFMでVOF法+DEMのシミュレーション

前回の記事で,CFDEM-PFMの紹介とインストール方法を説明しました。
今回は、VOF法+DEMのチュートリアルを実行し、ポスト処理まで行ってみます。

https://qiita.com/maumu1119/items/89c83569b0a7b195fd7f

### チュートリアル
チュートリアルは、CFDEMcoupling-PFMフォルダ内に保存されていると思います。前回の記事の方法でインストールしていれば、チュートリアルの格納先は、/opt/CFDEM-5/CFDEMcoupling-PFM/tutorialsになります。
ディレクトリ内は以下フォルダー体系になっています。
オリジナルのCFDEMと比較し、かなり増えていいます。
DEM粒子の化学反応、混相流との連成、DEM粒子の伝熱など様々な機能が実装されており、その分チュートリアルの増えています。今回はVOF法+DEMの解析を行うため、cfdemSolverMultiphase　フォルダー内のチュートリアルを実行します。
~~~CFDEMcoupling-PFM/tutorial.
cfdemPostproc
cfdemSolverIB
cfdemSolverIBContinuousForcing
cfdemSolverMultiphase　#今回実施するもの
cfdemSolverMultiphaseScalar
cfdemPiso
cfdemPisoMS
cfdemSolverPisoScalar
cfdemSolverRhoPimple
cfdemSolverRhoPimpleChem
displacemntField
rcfdemSolverBase
rcfdemSolverCoupledHeatTransfer
rcfdemSolverRhoSteadyPimple
rcdemSolverRhoSteadyPimpleChem
rStatAnslysis
rtfmSolverSpeacies
testTwoFluidRecurrenceTurbulence
~~~
cfdemSolverMultiphaseの中には4つチュートリアルが保存されていますが、particleWaterEntryを実行してみます。
まず、チュートリアルを適当なフォルダにコピーします。

~~~
cp -r /opt/CFDEM-5/CFDEMcoupling-PFM/tutorials/particlesWaterEntry 移動先パス
~~~
設定ファイルの詳しい解説は別記事でしようと思いますので、今回は実行だけにしてみます。
移動先にのディレクトリーでAllrun.shを実行します。すると、DEMとCFDの計算が実行され、結果が出力されます。
CFDよDEMのフォルダそれぞれに.vtkファイルが出力されていると思いますので、Paraviewを立ち上げてvtkファイルを読み込みます。CFDフォルダ内のvtkに流体解析の結果、DEMフォルダ内のvtkにDEMの解析結果が出力されていますので、2つをそれぞれロードしてください。

![WS000013.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/9e5385db-3aed-31e6-3131-f33df5f87170.jpeg)

あとは、粒子と流体解析の結果の可視化設定を行います。今回は3つをパイプラインに追加しました。
- Glyph  DEM粒子可視化
- clip   液相部分の表示
- contour 自由表面の強調

可視化後動画を表示させると以下のようになります。

![無題の動画 ‐ Clipchampで作成 (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3514546/783f50ed-ff08-b826-0f20-3d86f03fc0c4.gif)

液面に向かって粒子が落下する様子を解析しています。VOF法とDEMが相互に影響した挙動となていることがわかります。
通常のCFDEMでは実行できなかった解析がCFDEM-PFMでは実行できました。
今後はその他のソルバーも調査していきたいです。
英文履歷、英文自我介紹、cv、英文面試：如何提升求職競爭力


隨著全球化的趨勢和國際化的發展，越來越多的人們開始關注自己的英文能力，尤其是在求職市場上。在現今競爭激烈的求職市場中，擁有一張優質的英文履歷和能夠流利自信地進行英文自我介紹，將成為職場成功的一大關鍵。因此，本文將探討英文履歷、英文自我介紹、CV和英文面試的重要性，並提供一些建議，幫助您提升求職競爭力。

英文履歷：完整展現自己

[英文履歷](https://www.apexcharity.org/news/3/91)是求職過程中最重要的文件之一。它不僅是企業了解求職者的第一手信息來源，也是求職者展示自己專業能力和工作經歷的重要途徑。因此，一份精心製作的英文履歷可以讓求職者在眾多的求職者中脫穎而出。

首先，一份優質的英文履歷需要包含必要的個人信息，包括基本的個人資料、聯絡方式和求職意向。接下來，應該重點突出教育背景、工作經驗和專業技能，並使用適當的動詞來描述能力和成就。同時，也可以在履歷中加入一些具體的成就和經歷，例如參與過的專案和獲得的獎項，以突出個人的優勢。最後，確保履歷的格式整齊、結構清晰，避免拼寫和語法錯誤。

除了上述的基本要素外，還可以根據求職的具體行業和職位來調整履歷的內容和格式。例如，在應聘外貿行業的職位時，可以突出自己的跨文化溝通能力和英文書寫能力；而申請市場行銷職位時，可以強調自己的市場分析能力和創意能力。適當調整履歷的內容，可以更好地展示自己與該職位的匹配度，提高被錄用的機會。

此外，隨著時代的發展，線上申請已經成為常態。因此，建議求職者可以建立一個個人網站或者在專業平台，如LinkedIn上建立個人檔案，將其鏈接到自己的履歷中。這樣做不僅可以進一步展示自己的專業能力和工作經歷，也可以讓僱主更直觀地瞭解求職者。

英文自我介紹：簡潔自信

[英文自我介紹](https://www.apexcharity.org/news/3/92)是在求職面試中最常見的一個環節，也是求職者最重要的競爭優勢之一。它可以讓求職者有機會向僱主展示自己的個人特質、態度和與職位匹配度。因此，在面試前應該提前準備一份精簡的英文自我介紹，以便在面試時能夠自信地展示自己。

首先，英文自我介紹應該簡潔明了，讓僱主能夠快速地瞭解求職者的核心信息。因此，建議在介紹中突出自己的專業背景、工作經驗、個人特質和求職動機。同時，也要注意使用適當的動詞和詞匯，展示自己的專業能力和態度。此外，自我介紹的長度最好控制在1-2分鐘內，避免出現冗長和重復的描述。

其次，求職者應該根據具體職位和公司，調整自我介紹的內容。如果是應聘市場部門的職位，可以重點突出自己的市場研究能力和創意能力；如果是應聘財務部門的職位，可以強調自己的會計知識和財務分析能力。根據求職的具體情況，調整自我介紹的內容，可以更好地吸引僱主的注意力。

最後，建議求職者在每次面試前都要準備一份新的自我介紹，以適應不同的面試場合和公司。同時，也可以通過練習和錄製自己的自我介紹，來提升流利度和自信度。

CV：突出關鍵信息

[CV](https://www.apexcharity.org/news/3/88)（Curriculum Vitae）是歐美國家常用的求職文件，與英文履歷類似。它與英文履歷相比，更加注重展示求職者的工作經歷和成就，同時也更具有正式性。因此，如果有機會應聘歐美企業，建議求職者在履歷的基礎上，製作一份優質的CV來與企業進行求職。

與英文履歷相同，一份成功的CV也應該包含必要的個人信息、工作經驗和教育背景。同時，也應該突出自己的專業技能和成就，並在職業目標的部分，表達自己與該職位的匹配度。同時，個人形象也是一個求職者需要考慮的因素。例如，可以在CV中加入一些照片和圖表，讓求職者的CV看起來更加生動有趣。

除了上述的基本要素，還可以在CV中加入一些與求職者專業背景和職位相關的成果和經歷。例如參與過的具有挑戰性的專案、主持過的專業講座等，以此突出自己的工作經驗和專業能力。此外，CV也應該適當地使用列點方式，讓信息更加清晰明了。

建議求職者在製作CV時，可以參考一些模板和範例，以確保格式和內容的統一和一致性。此外，也可以請教英文能力較強的朋友或專業人士，來幫助檢查和修改CV，讓其更具有說服力和專業性。

英文面試：克服語言障礙

對於許多求職者來說，[英文面試](https://www.apexcharity.org/news/3/93)可能是最令人緊張和困擾的一個環節。然而，正確的態度和準備可以幫助求職者克服語言障礙，使面試更加順利。

首先，求職者應該積極準備面試，熟悉自我介紹和英文履歷中所使用的語言。在面試前，可以通過閱讀英文報紙、聽英文廣播和練習口語，來提高自己的英語水平。同時，在面試過程中，也可以專注地聆聽和回答面試官的問題，並注意使用正確的語法和詞匯。

其次，不要擔心使用錯誤的英文表達能力。當面試官問到不理解的問題時，可以適當地用自己熟悉的詞匯和短語來回答，而不是做出不自然的回答。同時，也可以通過修飾句子和重復關鍵信息，來強調自己的主要觀點。
java Apach AOI でExcelのシートを部分一致で取得する




```java
import org.apache.poi.ss.usermodel.*;

public class PartialSheetDataExtractor {

    public static void main(String[] args) {
        // Excelファイルのパスを指定してワークブックを開く
        try (Workbook workbook = WorkbookFactory.create(new FileInputStream("example.xlsx"))) {
            // 部分一致のシート名を探し、シートを取得
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                Sheet sheet = workbook.getSheetAt(i);
                String sheetName = sheet.getSheetName();

                // 部分一致を検証
                if (sheetName.contains("部分一致の文字列")) {
                    // シート上のデータを取得し、処理を委任
                    processSheetData(sheet);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /** シートからセルの値を取得する  */
    private static void processSheetData(Sheet sheet) {
        for (Row row : sheet) {
            for (Cell cell : row) {
                processCellData(sheet, cell);
            }
        }
    }

    /** セルの値を取得する  */
    private static void processCellData(Sheet sheet, Cell cell) {
        if (cell.getCellType() == CellType.STRING) {
            String cellValue = cell.getStringCellValue();
            System.out.println("シート名: " + sheet.getSheetName() + ", セルの内容: " + cellValue);
        }
    }
}


```
nginx でユーザーディレクトリから PHP スクリプト

Raspberry Pi 3 で apache の代わりに nginx を動かしている。

ネットからいくつかの情報 (Github gist, Stack Exchange) を集めたが、どうもうまくいかない。ユーザーディレクトリの location ブロックには正しく入り、php ファイルの存在も確認できるが、実行すると 404 ばかり。

追記:
スクリプトの存在をチェックする行をコンフィグに追加したら、なぜか上手く行った。

```
if(-f $document_root/$2) {
    #ここには何も入れなくていい
}
```
Raspberry Pi で Wake On LAN

正直言って必要ないけど、デスクトップパソコンで Wake On LAN が使える様にした。そうしてくれたのは Raspberry Pi。要は、PC を WOL で起こすには、まずラズパイにシェルでログインして、そこから PC に WOL する。

もし他の PC から直接 WOL したい場合は、そのマシンに WOL コマンドがなければならない。それも、Windows だと面倒な PowerShell スクリプトを組まないとできないらしい。一方、一旦ラズパイにログインすれば、必ずそこにある etherwake コマンドが使える。

ネットの説明ではこれを WOL サーバーと呼んでるが、本当にサーバーなの?
サポーターズエンジニア1on1面談イベントに参加！！

# 究極の自己分析イベント

結論から言うと、めちゃくちゃいいイベント。
しっかり自分をアピールする必要があるので自分を見つめ直すいいきっかけになる。参加企業に元々興味ある企業がいなくてもとりあえず参加するのはアリかなと思う。実際これ以降就活と開発へのやる気がめっちゃ上がった。


## サポーターズとは？
新卒エンジニア向けの就活サイト。サポーターズ初めて聞いたよって理系就活生さんはまじで登録したほうがいい。ハッカソンに気軽に参加できたり得るものはめちゃくちゃ多い。とにかく手厚く就活生をサポートしてくれる。お金もらえるし。

## 1on1面談イベント
企業と学生をマッチングするイベント！
面談がいい感じに進んだら本選考の特別ルートに乗れるかも！？

### 全体の流れ
・志望動機とプロフィール欄を埋めて参加希望の提出
・合格通知メール
・参加企業が学生のプロフィールを確認
・学生はアンケートに面談したい企業をいくつか選択
・惹かれ合った学生と企業で面談開始
・わんちゃんオファー来る

こんな感じ。
一応最大８社と面談できるけどそれはかなり少ない人だと思われる。
実際、今回の場合は18社が参加し38人の学生が参加したので、、、

(18*8)/38 = 3.79...

平均4回面談するかどうかって感じ。つまり、五回面談できた俺は悪くないんじゃない！？（めちゃポジティブ）
ちなみに選考受かった時点で情報系就活生の上位15%くらいに位置するらしい。私は二回落選しているのでこの話聞いた時すごく自信に繋がった。


## どうやって1日を過ごした？？

午前は企業プレゼン。午後から面談開始。面談は25分で、最初の5分間は事前に作成した自己紹介資料のプレゼンを行う。
聞かれる内容は

・研究内容
・制作物を作った理由
・インターンで得た経験
・どんなエンジニアになりたいか

などなど資料に書いたことを細かく聞かれる。具体的な技術面の話は全く深掘りされないのであまり自信のない言語でも技術スタックとして取り上げてもいいかも。大切なのは、**開発やインターンの動機とそれにより何を得たか**。あとは逆質問メインの企業もあるので企業ごとにいくつか質問を準備していったほうがいいかも。そしてappendixは大量に用意したのに一度も使わなかったので作る必要はない。悔しい。

## 参加して学んだこと
個人的には自己分析をしっかりし、将来の軸を明確に決めることができたのがとても大きい。私は発表用資料の作成にかなり時間がかかった。将来像が全く定まってなかったからである。これを機に時間をかけてまっすぐ自分自身と向き合い、何が得意で何をして生きていきたいか。そのために何を得る必要があってどのような行動をして生活をしていくのか。面倒臭くて避けてきたことを実行することができてよかった。

あとは、どの企業も若いエンジニアを求めているということ。DX化が流行っている中、多くの企業が急いで技術者を手に入れようとしているように感じた。新卒はあくまでポテンシャル採用だとは思うがそれでも意欲ある人が当然好かれる。その具体的な行動としてスキルを持つ者はかなり価値が高いだろう。それも含めて自信に繋がったイベントだった。これに満足せず研究やインターンで技術と思考能力を鍛えていきたい。
【Rails】ActiveModel::Errorオブジェクトについて

# ActiveModel::Errorsについて

`ActiveModel::Errors`は、Ruby on Railsの`ActiveModel`モジュール内のクラスで、モデルオブジェクト上のエラーメッセージを保持および管理するためのもの。主にActiveRecordモデルのバリデーションエラーを取り扱う際に使用されるが、ActiveRecordに依存しないモデルでも使用することができる。

## 主な特徴と使用方法

### 1. エラーの追加

`add`メソッドを使用して、特定の属性にエラーメッセージを追加できる。

```ruby
errors.add(:name, "can't be blank")
```

### 2. エラーの存在チェック
* any?メソッドでモデルにエラーが存在するかを確認できます。
* include?(attribute)で特定の属性にエラーが存在するかを確認できます。

### 3. エラーメッセージの取得

* full_messagesで全てのエラーメッセージの配列を取得できる。
* []メソッドで指定した属性のエラーメッセージの配列を取得できる。

```ruby
errors[:name]  # => ["can't be blank"]
```

### 4. エラーのクリア

`clear`メソッドで全てのエラーメッセージを削除できる。

### 5. 詳細なエラー情報
`details`メソッドを使用してエラーの詳細情報（エラータイプや追加のオプション）を取得できる。

### 使用例

```ruby
class User < ApplicationRecord
  validates :name, presence: true
end

user = User.new(name: "")
user.valid?  # => false
user.errors.full_messages  # => ["Name can't be blank"]
```
如何撰寫完美的英文履歷、自我介紹以及應對英文面試

英文履歷到英文面試：如何提升你的求職競爭力

在現今競爭激烈的求職市場中，除了擁有優秀的專業知識和技能外，良好的英文能力也是求職中不可或缺的一個重要因素。許多企業和跨國公司都要求求職者具備流利的英文能力，因此撰寫一份專業的英文履歷、進行出色的英文自我介紹以及應對英文面試成為了求職的關鍵。

在本文中，將會介紹英文履歷、英文自我介紹、[CV](https://www.apexcharity.org/news/3/88)以及英文面試的重要性和技巧，幫助你提升求職競爭力，出色地應對求職過程。

英文履歷

[英文履歷](https://www.apexcharity.org/news/3/91)是求職過程中最重要的文件之一。它不僅介紹求職者的個人背景、教育及工作經歷，還展示了求職者的專業能力和價值觀。因此，一份精簡且內容豐富的英文履歷能夠吸引雇主的目光，讓你在眾多求職者中脫穎而出。

首先，英文履歷的格式應該整齊、清晰，並且選用適當的字體和字體大小。同時，使用關鍵字和動詞來描述你的專業能力和經歷，這有助於提升你的履歷的可讀性。同時，避免使用太多的專業術語，使履歷更容易被理解。

其次，履歷的內容應該簡潔明了，不宜超過兩頁。包括基本信息（如姓名、聯繫方式、地址）、求職目的、教育背景、工作經驗、專業技能和獎項等。在描述工作經驗時，應該突出自己的成就，如曾經獲得的獎項、貢獻過的專案等。

最后，一定要仔細檢查履歷中的拼寫和語法錯誤。一份完美無瑕的英文履歷能夠展示你的專業態度和細心程度，給雇主留下良好的印象。

英文自我介紹

[英文自我介紹](https://www.apexcharity.org/news/3/92)是求職面試中必須要掌握的一門技巧。當你進入面試室，自我介紹是第一印象，也是展示自己的機會。因此，一份出色的英文自我介紹能夠讓你在面試中脫穎而出。

首先，自我介紹應該包含三部分：姓名及基本背景、教育和工作經歷、專業能力和價值觀。同時，要避免死板的朗讀，應試著將自我介紹融入對話中，增加自然流暢的感覺。同時，適當地使用表情和肢體語言也能夠增添自信和興趣。

其次，表達你的特點和優勢。一個成功的自我介紹應該能夠讓雇主了解你的獨特性和專長。例如，你可以提到你的興趣和嗜好，反映出你的多元性和積極性。

最后，緊緊抓住面試官提出的問題。面試官的問題是衡量你的能力和態度的重要標準，因此要注意仔細聆聽問題，並給出具體的回答。

CV（Curriculum Vitae）

CV也是求職過程中不可或缺的一個文件，它是英文履歷的更詳細和專業版本。通常，CV包含完整的工作經歷、學術成就及任職機會等細節。因此，撰寫一份優秀的CV能夠展示你的專業能力和態度，幫助你在求職過程中取得成功。

首先，CV的格式應該更加專業和正式，同時內容應該更加詳細。除了包含履歷中提到的內容外，還可以添加更多具體的數據和細節，如在專案中的角色和貢獻度等。

其次，CV要求更多的細心和注意力。因為CV涵蓋的內容更廣泛，因此仔細檢查拼寫和語法錯誤是至關重要的。同時，避免使用太多的專業術語，確保雇主能夠理解你的CV。

最後，CV應該與求職職位相關。每個職位都有不同的要求和課題，因此在撰寫CV時，應該重點突出與該職位相關的學歷和經驗，同時適度添加其他能夠展示你的專長和能力的內容。

英文面試

[英文面試](https://www.apexcharity.org/news/3/93)是求職過程中最重要的環節之一，也是最能夠展示你的英文能力和專業知識的機會。因此，在面試前做好準備對於求職成功至關重要。

首先，熟悉公司和職位的相關信息。在面試前，了解公司的文化和需求對於整個求職過程都非常重要。同時，對於該職位的需求和職責也要有一定的了解，這樣能夠更好地回答面試官提出的問題。

其次，練習常見的面試問題。許多面試官都會問一些常見的問題，如“你為什麼選擇這份工作”或“你的強項和弱項是什麼”，因此提前練習一些答案能夠幫助你更自信地回答面試問題。

最後，保持自信和禮貌。面試中的舉止和態度也是考量因素之一。因此，在面試中保持自信、積極，同時保持禮貌和尊重。同時，適當地使用表情和肢體語言也能夠展示你的自信和興趣。

總結

在現今競爭激烈的求職市場中，良好的英文能力能夠成為你脫穎而出的關鍵。撰寫一份專業的英文履歷、進行出色的英文自我介紹以及應對英文面試都是提升求職競爭力的重要因素。通過遵循本文提到的技巧和建議，相信能夠幫助你在求職過程中取得成功。同時，也希望每一位求職者都能夠建立自信，充分展示自己的價值和專業能力。
【Swift】アンラップの種類について


## 経緯

swiftアンラップ処理についてようやく理解でき始めたので、
頭の整理と、備忘録を兼ねて記事に記していこうと思います。

## オプショナル型とは
オプショナル型とは、一言で言うと中身がnil(空)の状態を受け入れられる型のことです。
他のプログラミング言語では、空の値(swiftではnil)を参照しようとすると、アプリが落ちてしまいます。
しかしswiftでは、オプショナル型という存在のおかげでnilを許容することができます。
それによりnilが代入できるため、変数の値がnilであっても参照することができます。

## オプショナル型のアンラップ
nilを許容するオプショナル型ですが、通常の非オプショナル型と同じように変数を扱うことはできません。
例えば、下記のコードを実行するとエラーが発生してしまいます。

```diff_swift
var optionalValue: Int? = 1
opitionalValu + 2 //エラーが起きる
```

上記のコードでは、オプショナル形であるInt?に通常のInt型の値を代入しようとしているため、エラーが発生します。
この問題を解決するためには、オプショナル型に包まれた変数を取り出してあげる必要があります。
その方法をアンラップ(unwrap)といいます。
swiftではオプショナル型の中身の変数を包まれていると表現し、
包装を解いてあげるという意味でアンラップという言葉が用いられます。
そのアンラップの方法を4つ紹介していきます。

## 強制アンラップ
はじめに1番簡単なアンラップを紹介します。<br>
下記のコードのように、変数に「！」をつける強制アンラップです。<br>

```diff_swift
let optionalInt: Int? = 1
let intValue: Int = optionalInt!
```

しかしこの方法は、万が一変数の中身がnilだった場合アプリが落ちてしまいます。
そのため、確実に中身がnilじゃないと判断できない場合には、違うアンラップ方法を使うことが推奨されます。

## 「if let～」を用いたアンラップ
if letは、変数の値がnilじゃない時だけ、その値を用いて処理を実行するといったアンラップ方法です。

```diff_swift
let optionalInt: Int? = 1

if let unwrappedInt = optionalInt {
    // unwrappedIntを使用して処理を実行
} else {
    // optionalIntがnilの場合の処理
}
```

optionalIntがnilじゃない場合、変数unwrappedに代入されます。
このunwrappedを使用して、処理を実行することができます。
optionalIntがnilだった場合はelse文に書かれている処理が実行されます。
このように、変数の値が存在しない場合の処理もelseの中で記述できるため、
アプリが落ちることを避けつつ、安全にアンラップを行うことができます。

## 「guard let～」を用いたアンラップ
guard letは、変数の値がnilの場合にreturnが返され、処理が終了するといったアンラップ方法です。

```diff_swift
func processValue(optionalValue: Int?) {
    guard let unwrappedValue = optionalValue else {
        // nil時の処理を書くことも可能
        return // optionalValueがnilの場合、処理終了
    }
    
    // unwrappedValueを使用して処理を実行
}
```
if letよりもguard letの方がシンプルな記述になっていることが分かります。
一見、if letだと普通の分岐処理なのか、アンラップ処理なのか見分けにくいですが、
guard letは一瞬でアンラップ処理だと見分けられます。
さらに、nilを確認した定数や変数は、アンラップ処理後も使うことができるというメリットもあります。

## nil結合演算子を用いたアンラップ
nil結合演算子「??」を使って、変数の値がnilである場合にデフォルト値を代入するアンラップ方法があります。

```diff_swift
let optionalInt: Int? = nil
let intValue = optionalInt ?? 0 // optionalIntがnilの場合、0が代入される
```

このアンラップ方法は、optionalがnilの場合に代替えの値を用意してあげることで、
安全にアンラップできるといった仕組みになっています。
if letで、変数がnilの場合に代替えの値を用意するには、
else文の中に値を代入する必要があるため冗長なコードになってしまいます。
nil結合演算子を使うことで、この処理を簡潔に記述することができます。

## まとめ
今回は4つのアンラップ処理について紹介しました。
自分の中での使い分け方をまとめると、<br>

<b>・nilの時に他の処理やエラーハンドリングをしたい場合は「if let」
・nilの時は処理を終了させ、nilチェックのみを行いたい場合は「guard let」
・nilの時に代替えの値を用意するのみの処理を行いたい場合は「nil結合演算子」
・変数がnilじゃないと断言できない場合は、強制アンラップは使わない

という認識です。
アンラップについて学習した当初は、どれも一緒のように見えてましたが、
自分がやりたい処理に応じた最適なアンラップ方法が用意されているため、上手に使い分けることが大切です。
最後まで読んでいただきありがとうございました。
【VScode】Cannot find drive. A drive with the name '.C' does not exist. というエラーについて

## 概要
VScodeでの`Cannot find drive. A drive with the name '.C' does not exist.`というエラーの解決をしたので、まとめておきます。誰かのためになれば嬉しいです。

## 経緯
いつしかVScode上のPowerShellに`Cannot find drive. A drive with the name '.C' does not exist.`というエラーが出るようになってました。でも普通に`Ctrl+F5`で実行できるので、特に気にしていませんでした。

しかしこれではVScode上のPowerShellでコマンドを使おうとすると当該エラーが発生して全く使えません。

## 考察・結果
なぜかPythonを使っている時だけ当該エラーが発生している、ということに気づいたため検索。以下のサイトがヒットしました。

https://stackoverflow.com/questions/77187399/vs-code-drive-c-does-not-exist

どうやら、Pythonの拡張機能が悪さをしているらしい。Pythonの拡張機能のページに飛んで pre-release versionを選択したあと、VScodeを再起動しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3571388/871f90c6-b941-e093-3a15-e6aa65a4ffc5.png)

私の場合は、これで直りました。

## おわりに
これでも直らない場合は、再起動をかけてみてください。
GoでWebアプリケーション#2

### やったこと

HTMLテンプレートファイルを読み込ませてブラウザ上で表示

### ソース

```
package main

import (
	"html/template"
	"log"
	"net/http"
	"path/filepath"
	"sync"
)

type templateHandler struct {
	once     sync.Once
	filename string
	templ   *template.Template
}

// HTTPリクエストの処理
func (t *templateHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	t.once.Do(func() {
		t.templ =
			template.Must(template.ParseFiles(filepath.Join("templates",
				t.filename)))
	})
	t.templ.Execute(w, nil)
}

func main() {
	http.Handle("/", &templateHandler{
		filename: "chat.html"})
	//Webサーバーの開始
	if err := http.ListenAndServe(":8081", nil); err != nil {
		log.Fatal("ListenerAndServe:", err)
	}
}
```

### 実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3533750/7c7fb561-d73b-c4be-7a4b-12fdba9c26ae.png)

### 参考

オライリー　「Go言語によるアプリケーション開発」
[Oracle Cloud] oci cli for windows の MSIインストーラーでインストールしてみた (2023/10/05)

# はじめに

OCIコマンドライン・インタフェース(CLI)で Microsoft Software Installer (MSI)インストーラがサポートされました。
MSIインストーラを使用してOCI CLIインストールしてみました。


# MSIインストーラでOCI CLIのインストール

1. Windows用のOCI CLI MSIインストーラを[GitHub](https://github.com/oracle/oci-cli/releases)からダウンロードします。
1. ダウンロードしたインストーラの実行可能ファイルを実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/cd977d18-1807-d9c8-bbdc-f50fc41d2bc3.png)


1. CLIをインストールするシステム上のローカル・ディレクトリを選択し、「Next」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/e3836960-365d-ab1d-462d-6a16798008dc.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/c6254b72-e9e3-a4e5-bd67-c121022b86eb.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/9ac7b6ea-5f6a-7902-59dc-b64fb541591d.png)
1. インストーラが終了したら、「Finish」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/108635/65c3dd24-6aef-4567-c86b-2c658cb5fbda.png)

# 補足

- MSIインストーラを使用してOCI CLIを導入する場合、必要な互換性のあるPythonバージョンが自動的にインストールされるため、事前のPythonのインストールの必要がありません。
- 非MSI方式で既存のOCI CLIがすでにインストールされている場合は、OCI CLIの両方のバージョンがインストールされたままです、
    - MSIインストーラを使用してインストールされたOCI CLIが優先されます。
- MSIインストーラを使用してすでにOCI CLIがインストールされている場合は、以前のバージョンがアンインストールされ、現在のバージョンがインストールされます。
    - OCI CLIの新しいバージョンが使用可能になったときにアップグレードが容易になります。

# 参考情報

- [oci cli](https://github.com/oracle/oci-cli/releases)
- [ドキュメント](https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm#InstallingCLI__windows:~:text=To%20install%20the%20CLI%20on%20Windows%20using%20the%20MSI%20installer)
- [Introducing MSI installer support for the OCI CLI](https://blogs.oracle.com/cloud-infrastructure/post/introducing-msi-installer-support-oci-cli)
[Swift]骨格検出アプリ作成 備忘録

# はじめに

この記事はOpenPoseのようなものをiOS上に実装したいと思って試行錯誤する備忘録です。

https://github.com/CMU-Perceptual-Computing-Lab/openpose

# 事前調査

色々と調べたところOpenPoseをSwiftに実装することは不可能ではないが、とても大変ということがわかりました。

そこで、iOSではVisionというライブラリを用いることで骨格検出や顔認識、文字認識などが使えるということがわかりました。

https://developer.apple.com/documentation/vision/

# 使うもの
VNHumanBodyPoseObservation

VNDetectHumanBodyPoseRequest

この辺りを使うと上手くいきそうなので使用していきたいと思います。

# 今後の流れ
1.Swiftで動画を読み込ませるようにする
2.読み込んだ動画に対して骨格検出を行う
3.骨格検出を行なった動画を保存する

上記一連の流れを組み込んで行きたいと思います。
Oracle演算子の優先順位

・Oracleで使う演算子には優先順位があり、複数の演算子を同時に使った場合は
優先順位の高い方が優先される。

1.算術演算子
2.連結演算子
3.比較条件
4.IS [NOT] NULL,LIKE,[NOT]IN
5.[NOT] BETWEEN
6.等しくない　<>
7.NOT論理演算子
8.AND論理演算子
9.OR論理演算子
4Gの技術者は目先10年は5Gが役立たないことを知っている。

4Gから5Gへの進化における、アーキテクチャの大きな変化として、C-PlaneとU-Planeの分離したこと(CUPS)が上げられる。

ユーザー視点では4が5になった程度の認識かもしれないが、3gppプロトコルを取り扱う技術者としては、難易度の飛躍というのが現実の見え方となっている。

では、この投稿がQiitaであるからには、CUPSがもたらす利点を読み手の君は考えることができるだろうか。

ここから先は、TS23.502を実際に紐解いたことのある技術者でなければ理解できないことだろう。

CUPSの利点を知らずして、5Gの技術営業をしようとする無謀な営業さんも、そこらへんにはいることだろう。

では、CUPSを知らずに、マスコミの取り上げる5G情報を取り入れたらどうなるだろうか。

3gppにも5Gの基本コンセプトとして書かれている以下のような技術を目にすることだろう。

eMMB（高速性）
URLLC（低遅延）
mMTC（多数接続）

このあたりを実現するための仕様は2023年ともなれば、標準化はかなり進んでいることだろう。

しかし、5Gはこれらと引き換えのデメリットが存在する。

それはsub-6帯とミリ波に限定された周波数の特性における、カバレッジの狭さが問題となる。
sub6は、30メートルぐらいしか電波が飛ばなかったり、ミリ波は障害物に弱かったりする。

片や4Gの電波は数キロメートルの伝送特性を持っているので、5Gの基地局と比べると、設置密度は30分の1程度でよい計算となる。

つまり5Gのsub6帯で4G程度のエリアを作るには、基地局数を30倍にしなければならないということだ。

よって5Gを普及させるには、基地局の建設コストが膨大にかかり、更には運用コストも比例して上がっていくデメリットが著しいといえよう。

このような事情のため、NAS主体の時代は5Gのエリアが少ない状況が続いた。

そして 5G SA の時代はどうか。5Gとスマートフォンには表示されたとしても、実は4Gで使っていた周波数の転用だったりする。

通信先のコアネットワークがEPCから5GCに変われど、周波数は4Gそのものであるから、5Gとはなにか？

文字を4から5に変えただけのような状態になっているのが現在の「パブリック5G」だ。

東京駅など、一部のエリアでは実際にeMMBを実感できる1Gbpsクラスのエリアも存在するので、全部が文字変更とは言わない。

しかし、ユーザー立場でも果たしてeMMBしたいのか？という疑問は残る。

結論。一般ユーザは4Gで満足するので5Gはいらないのである。
GitHubのリポジトリ作成方法

# 概要
　ソースや記事を管理するために，GitHubのリポジトリ作成方法を記載する。

# 方法
　リポジトリの作成方法を以下に記載する。なお，GitHubのアカウントは持っている作成済みとする。
1\. アカウント右上隅の[+]ドロップダウンメニューをクリックして，メニューから「New repository」をクリックする。
2\. 「Create a new repository」画面で，「Repository name*」にリポジトリ名を入力する。
3\. 必要に応じて「Description」にリポジトリの説明を入力する。
4\. リポジトリの可視性「Public」または「Private」をチェックする。
5\. リポジトリを初期化するために，「Initialize this repository with:」の「Add a README file」にチェックをつける。
6\. 「create repository」をクリックする。

# 参考サイト
[リポジトリを作成する](https://docs.github.com/ja/get-started/quickstart/create-a-repo "リポジトリを作成する")　(2023/10/05時点閲覧可能)
Docker + PlatformIO でビルドする

macOS Catalina 10.15.7（古くて失礼）
docker desktop 4.15.0
Compose v2.13.0

dockerは数日前から使い始めたばかりです。インストール済みとして記載します。

PlatformIOが使えそうなイメージも公開されていますが，勉強のため自分で作成してみました。

# ディレクトリ構成

適当な作業ディレクトリにファイル `Dockerfile` と `docker-compose.yml` を作成します。
platformioのプロジェクトを `blink/` とし，その下に作成します。

```bash
$ ls
Dockerfile          blink/              docker-compose.yml
$ ls blink
README.md       lib/            src/
include/        platformio.ini  test/
```

# 必要なファイルを用意する

## `Dockerfile`

なんとなく安定していると考えている ubuntu 20.04 をベースに，公式のインストールスクリプトで PlatformIO をインストールするようにしました。
PATHに追加する手順を最後に書きました。

```Dockerfile
FROM ubuntu:20.04
RUN apt update && apt -y upgrade && apt -y install curl python3-venv

RUN curl -fsSL -o get-platformio.py https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py
RUN python3 get-platformio.py

# コンテナ内に作業ディレクトリを作成
RUN mkdir /pio
RUN mkdir /pio/project
# コンテナログイン時のディレクトリ指定
WORKDIR /pio/project
# ホストのファイルをコンテナの作業ディレクトリに移行
ADD . /pio/project

ENV PATH $PATH:/root/.platformio/penv/bin
```

## `docker-compose.yml`

末尾URL参考にほぼコピペです。

```docker-compose.yml
version: '3' # composeファイルのバーション指定
services:
  app: # service名
    build: . # ビルドに使用するDockerfileがあるディレクトリ指定
    tty: true # コンテナの起動永続化
    volumes:
      - .:/pio/project # マウントディレクトリ指定
```

## `platformio.ini`

pioを実行して作成しても良いのでしょうが，ここではすでに動いているものからコピーしました。Raspberry Pi Pico用です。

```platformio.ini
[env:pico]
platform = raspberrypi
board = pico
framework = arduino
```

## `src/main.cpp`

いつもの普通のLチカですね。

```main.cpp
#include <Arduino.h>

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop()
{
  digitalWrite(LED_BUILTIN, HIGH);
  delay(1000);
  digitalWrite(LED_BUILTIN, LOW);
  delay(1000);
}
```

# dockerビルド 〜 書き込み

```bash
docker compose build # ビルド
docker compose up -d # 起動
docker compose exec app pio run -d blink # ビルド
cp blink/.pio/build/pico/firmware.uf2 /Volumes/RPI-RP2/ # 書き込み
```

dockerからの直接の書き込み等はまだ調べていませんので，とりあえず普通にコピーして書き込んでいます。書き込み前に Pico のブートローダーを起動しておきます。（[BOOT]押しながら接続）


# 覚書

```bash
docker compose build # ビルド
docker compose up -d # コンテナ起動
docker compose exec app pio run -d blink
# docker compose exec サービス名 コマンド
docker-compose exec app /bin/bash # コンテナのシェル起動
docker compose down # コンテナ停止
```

# 参考URL

https://qiita.com/uji_/items/8c9eda89526abe0ba900

https://qiita.com/_taketeru/items/1d547e95539d858b29a1
【Unity】任意のPrefabからコンポーネントを全て外す

# 概要
私のプロジェクトでは、基本的に Editor からの AddComponent は禁止しています。基本的には、[RequireComponent(typeof(HogeModule))] を使って、AddComponent するようにしています。すると、古いPrefabからComponentを一掃したいというニーズが生まれました。ということで実装。

# コード
```c#
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

namespace HiArda
{
	public class RemoveAllComponents : EditorWindow
	{
#if UNITY_EDITOR
		[MenuItem("Assets/Remove All Components")]
		public static void DoRemoveAllComponents()
		{
			GameObject[] selectedObjects = Selection.gameObjects;
			foreach (GameObject selectedObject in selectedObjects)
			{
				PrefabAssetType prefabType = PrefabUtility.GetPrefabAssetType(selectedObject);
				if (prefabType == PrefabAssetType.Regular || prefabType == PrefabAssetType.Variant)
				{
					string path = AssetDatabase.GetAssetPath(selectedObject);
					GameObject originalPrefab = PrefabUtility.LoadPrefabContents(path);

					Component[] components = originalPrefab.GetComponents<Component>();
					foreach (Component component in components)
					{
						if (component is Transform) continue;
						if (component is Animator) continue;
						DestroyImmediate(component, true);
					}
					PrefabUtility.SaveAsPrefabAsset(originalPrefab, path);
					PrefabUtility.UnloadPrefabContents(originalPrefab);
					Debug.Log("[RemoveAllComponent] Success. paht=" + path);
				}
				else
				{
					Debug.Log("[RemoveAllComponent] Please select a Prefab to remove components from.");
				}
			}
		}
#endif
	}
}

```

# 使い方
任意のPrefabをProjectWindowから右クリックして、Remove All Components を押下します。

# 注意点
ここでは、Animatorのコンポーネントは外さないようにしています。
JetBrains Toolbox Appでインストール場所を変更する

JetBrains Toolbox Appでは、

> 設定 > ツール > ツールのインストール場所

にて、ツールのインストール場所を変更できるはずなのですが、本稿執筆時点（JetBrains Toolbox 2.0.4.17212, macOS 13.4.1）においては、編集できません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1790252/58505435-8443-6a79-06b0-24706d6c8faf.png)

そこで、以下のIssueコメントにあるように、 `~/Library/Application\ Support/JetBrains/Toolbox/.settings.json` の `install_location` に任意のパスを設定することで、インストール場所を変更できます。

https://youtrack.jetbrains.com/issue/TBX-9575/Enable-changing-install-location

以下は、 `/Applications` に設定する場合の例です。

```json
{
  "install_location": "/Applications"
}
```
CakePHP4のリダイレクトで処理を抜ける！

コントローラー内でこの書き方だとredirect後の処理も走ってしまい33が出力された。
```TestController.php
$this->redirect('/Error');
echo 33;
exit;
```


returnでしっかり処理を終わらせる。
```Test2Controller.php
return $this->redirect('/Error');
echo 33;
exit;
```
プロセス中心設計とデータ中心設計

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/3a940dcf-ca06-a90e-2ea5-ef129cf5ccac.png)
　プロセス中心設計は、システムにどのような機能が必要なのかを洗い出して、システム設計を進める考え方です。DFDを作成して設計を進めます。

　データ中心設計は、システム二度余のようなデータが存在しているのかを洗い出して、システム設計を進める考え方です。システムで扱えデータは、新しい機能が追加になったとしても、大きく変化することはないので、データを中心にして設計した方が良いと言う考えが基礎にあります。ER図を作成し、データベースの利用を前提にして設計を進めます。
AWS CloudWatch Logs のJSONログをイベントフィルタでAND検索/OR検索する構文

# AND検索

こんな風に `&&` で繋げばOK

```
{ $.key1 = "xxx" && $.key2 = "yyy" }
```

# OR検索

`||` でつなげばOK

```
{ $.key1 = "xxx" || $.key2 = "yyy" }
```


# チャットメンバー募集


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

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


# Twitter

https://twitter.com/YumaInaura
【Xcode】ReleaseとDebugでアプリアイコンを分ける

# はじめに
昨日、「ReleaseとDebugでBundleIDを分ける」という記事を書きました。
今日は、「ReleaseとDebugでアプリアイコンを分ける」です。

https://qiita.com/SNQ-2001/items/32d49401b9e14f889c09

# やりかた
① アイコンを2種類用意します
![スクリーンショット 2023-10-05 21.35.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1c9a6dc7-358e-ad36-2dfa-569e2591535e.png)

② 本番用のアイコンを`AppIcon`にセットします
![スクリーンショット 2023-10-05 21.35.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/8c75cf43-ab84-9da2-a514-39023d16a1db.png)

③ 左下の「+」を押します
④ 「iOS」を選択します
⑤ 「iOS App Icon」を選択します
![スクリーンショット 2023-10-05 21.36.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7437170a-8c53-359e-ed84-5363462165e4.png)

⑥ 任意の名前をつけます(今回は`AppIcon-Dev`にしました)
![スクリーンショット 2023-10-05 21.39.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/33d4bda4-f904-9ae3-2ee9-6599dee2f3c4.png)

⑦ 開発用のアイコンを`AppIcon-Dev`にセットします
![スクリーンショット 2023-10-05 21.40.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/7f7a9589-db39-9f9a-f526-f0ae26faf374.png)

⑧ プロジェクトを選択します
⑨ ターゲットを選択します
⑩ 「Build Settings」を選択します
![スクリーンショット 2023-10-05 21.41.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/33a76e54-8079-23d4-a70a-6d0e25a061c3.png)

⑪ `Primary App Icon Set Name`を検索します
![スクリーンショット 2023-10-05 21.43.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/0b34ba7a-9e05-34a8-341c-acfc0e18acd1.png)

⑫ 矢印をタップして下向きに変更します
![スクリーンショット 2023-10-05 21.44.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/d78e95ca-f224-92b7-5abc-4fc586f66543.png)

⑬ Debugに`AppIcon-Dev`を設定します
![スクリーンショット 2023-10-05 21.46.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/e59dd80f-bb1a-dda9-d7ff-cf9f7b04c84e.png)

# おわり
アプリアイコンを環境で分けることができました
Power Pagesサイト作成の制限をユーザーにかける

Power AppsやPower Pagesのライセンスを持っているユーザーはサイト作成ができますが、
いろんな環境で外部へ公開するサイトが自由に作られてしまうと困りますよね。

この記事では、環境ごとに制限をする方法についてご紹介します。
テナントでまとめて制御したい場合は以下をご参照ください。

https://learn.microsoft.com/ja-jp/power-apps/maker/portals/control-portal-creation

# セキュリティロール

結論、使うのはセキュリティロールです。

セキュリティロールの基礎や設定は以下の記事でご紹介しております。

https://qiita.com/skuramoto/items/fe305aac24273c7cccbf

既定では**システム管理者**ロールがないとWebサイトの作成はできないようになっています。
システム管理者は環境管理者ロールで一番強い権限です。
むやみやたらに割り当てなければ、ユーザーにサイト作成を許すことはありません。


# ユーザー側の挙動
システム管理者ロールが割り当たっていない場合、作成できません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f17135ef-dfbf-fa25-3531-22f17640d2d0.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/2825ca15-851e-7765-cf51-54a013ab537c.png)


システム管理者ロールが割り当たっている場合、作成ボタンから作成することができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e290651d-cacd-7901-79b3-43eb3b7d46e6.png)

::: note
チナミになる話
既定環境ではサイト作成はできません。 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/72822d2b-82b2-37e7-45f7-6162047afd13.png)
:::


# 補足：サイト作成の権限設定は、基本システム管理者ロールでしか制御できない

Webサイト情報を管理するためのテーブルがあり、そこに対する権限が設定できれば、カスタムロールで個別に制御する方法としてあるのではないかと調査しました。

Webサイト（adx_website）テーブル：以下のような形でサイトが作られるとサイト情報のレコードが作成される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ac17cfc1-0f95-7b11-ab9e-ac37ab82be4e.png)

こちらに対するアクセス制御はシステム管理者ロールで設定されており、システム管理者ロール自体はもともと編集ができない為、コピーしてそちらで編集しようとしました。
しかし、コピーしたロールでは設定項目が消えてしまいます。


【もとのシステム管理者ロール】
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b2a43ddf-e13e-197c-56fe-30dab1f786c7.png)

【コピーしたロール】
Webサイト（adx_website）が消えてます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/e2f2cdd1-d8be-c8a2-251b-908e39b4c4d3.png)


ここの設定は個別にできないようになっているんですね。
Docker基礎学習②

Docker基礎学習の備忘録。

参考：Udemy「駆け出しエンジニアのためのDocker入門」

◆コマンド
- docker start/stop/restart コンテナ指定（コンテナ名かＩＤで指定）
コンテナ一つを操作。いずれも削除はしないので残る。

- docker exec
起動中のコンテナに入らずコマンドを実行。
-itオプションを使うとコンテナに入ることができる。
※コンテナに入るとは？
→コンテナ内のコマンドライン（bashやzsh）にアクセスすること。コマンドライン経由でコンテナを操作できる。


- docker rm
停止中のコンテナを削除
-fオプションで起動中コンテナも強制削除
※コンテナのデータも消えるので注意！一旦停止してから削除するのが基本。

- docker images
ローカルにあるimageを全て表示。
意外とDockerイメージは容量が大きいので定期的に確認すること！
コンテナと同じようにimageも一意のIDを持っている。

- docker rmi
rmiはremove imageの略。
Dockerイメージを削除。
しかし、起動中コンテナのイメージは削除できない。
※Dockerイメージは依存関係があるのでベースイメージが削除できないため。
Pythonの優先度付きキューの説明と改変

記事を書くことは初めてなのでうまく書けていないです
私が得意としているのは競技プログラミングなので細かい仕様はわかっていない可能性があります

書き途中だけど下書きにしないで投稿します

# 優先度付きキュー(Priority Quque)とは <-知ってる人は読まなくていいよ
ある箱に物を入れたり取り出したりが得意なデータ構造です。
取り出す際はある一定のルールに基づいて取り出します。
例えば箱の中の最小の値を取り出し続けるなど…

こんな感じ

箱（常に最小の値を取り出せる）＝[]
3を入れる　箱：[3]
2を入れる　箱：[3, 2]
4を入れる　箱：[3, 2, 4]
取り出す　->2
取り出す　->3
取り出す　->4

# Pythonにある優先度付きキューの種類
Pythonには3つ使える優先度付きキューがある。
[heapq](https://docs.python.org/ja/3/library/heapq.html)モジュール
[queue]()パッケージのPriorityQueueモジュール
[asynic]()パッケージのPriorityQueueモジュール
```test.py
import heapq
from queue import PriorityQueue
from asyncio import PriorityQueue
```

今回改変するのは[heapq](https://docs.python.org/ja/3/library/heapq.html)の方
```test.py
from heapq import heapify, heappop, heappush
class heapq:
    def __init__(self,lst=[],smaller=True) -> None:
        self.q=list()
        self.d=1 if smaller else -1
        for v in lst:
            heappush(self.q,v*self.d)
    def push(self,value):
        heappush(self.q,value*self.d)
    def pop(self):
        return heappop(self.q)*self.d
    def __len__(self):
        return len(self.q)
    def __str__(self):
        return f"heapq {list(map(lambda x:x*self.d,self.q))}"
```
【Next.js】husky + lint-stagedを使ってコミット前にlint・typeチェック・フォーマットを行う

## はじめに
この記事では、Git フックを自動的に管理するためのツールであるhuskyの導入方法してみました。
huskyを使うことで、コミットやプッシュの前後に自動でコマンドを実行させることができるようになります。

## 実施内容
フロントエンドにてコードの品質を保つため、コミット前にリントチェック・型チェック・Prettierによるフォーマットを実行し、コードに💩が紛れ込まないようにする目的でhuskyの導入をしました。

## 準備
前提として、`Node.js` `npm` `Prettier` `TypeScript` `Next.js` `ESlint` などがインストールされている環境が必要です。
また、Git リポジトリも既に初期化されていることが前提となります。

※今回は`npm`で行ってますが、`yarn`や`pnpm`でも可能です。

## 実装手順
- `husky`のインストール

```
npm install --save-dev husky
```

- `lint-staged`のインストール
```
npm install --save-dev lint-staged
```

- `Husky`初期化
    - Huskyに必要なファイルが生成されます

```
npx husky install                                 
```


- `Husky`の設定ファイルの生成
    - pre-commitフックの設定ファイルを生成

```
npx husky add .husky/pre-commit "npx lint-staged"
```

- `Husky`の設定ファイルの内容を確認
    - pre-commitフックがトリガーされた際にlint-stagedコマンドが実行される
    - `front`のようなディレクトリでサーバ側と分けている場合は`cd front && npx lint-staged`のようにして、ディレクトリを移動して実行するようにしてください。

```:pre-commit
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged
```

- `.lintstagedrc.js`(コミット時に動かす設定)を作成
  -  

```js
const path = require('path');

const buildEslintCommand = (filenames) =>
  `next lint --fix --file ${filenames
    .map((f) => path.relative(process.cwd(), f))
    .join(' --file ')}`;

module.exports = {
  '*.{ts,tsx}': [
    () => 'tsc --incremental false --noEmit', // 型チェック
    buildEslintCommand, // next lint
    "prettier --write --ignore-path .gitignore './**/*.{js,jsx,ts,tsx,json,css}'", // Prettierフォーマット
  ],
};

```

- わざと型エラーを出したファイルをなど用意して、コミットしてみる

## 結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1040483/02d54de8-f132-44b6-a2d7-4cc2823f57d3.png)


## 注意点
- Next.jsを使う場合は、`.lintstagedrc.js`を読み込むようにすること
    - https://nextjs.org/docs/pages/building-your-application/configuring/eslint#lint-staged
- VScodeなどのGit拡張機能のコミットやGUIでコミットを使うとエラーでるのでコマンドで行うこと。
- ステージング環境のファイルしか対象としないので、その他は事前に問題ないことを確認しておくこと。
- `list-staged`コマンドはDockerを使っている場合、Dockerの中に入ってからしか実行できないかと思っていたのですが、マウントしているため、Mac側からでもファイル読めるみたいでした！
    - 最初frontディレクトリに移動せずに下記のように書いていてうまく実行できずかなり手こずりました・・・

```js:front/.lintstagedrc.js
#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npx lint-staged // frontディレクトリに移動していないため、.lintstagedrc.jsがなくエラーになる
```

## 終わりに
これは、TypeScriptを使っているならぜひ導入してほしいです！
追々この型チェックやLintがかなり効いてくると思います。

## 参考

https://nextjs.org/docs/pages/building-your-application/configuring/eslint#lint-staged

https://www.npmjs.com/package/lint-staged

https://qiita.com/kawataku-89love/items/af486ce6e3ec4c63b451
BootStrapについて(2023/10/05)

2023年10月5日

・フロントエンドライブラリ/Bootstrapについて
・ヘッダーの設定　・フォームの設置　　



---キーワード
HTML/CSSやjQueryにとどまらず、SassやBEMは当然として、ピュアなJavaScriptやVue.jsなどのフレームワークを利用した開発、Pug、そしてGulpやnpmスクリプトによる効率化が現在のフロントエンドエンジニアの基礎スキルです。

・フロントエンドに必要なスキル

* 		コーディングスキル
* 		JavaScript
* 		Typescript
* 		Vue.js
* 		React.js
* 		UI/UX設計の知識
* 		バックエンドの知識
* 		CMS構築

BootStrapとは、Web制作のベースとなるフレームワーク。