OmniAICreator/Qiita-1.07M huggingface dataset:
IBM Cloud: Classic InfrastructureでPortable/Static/Unroutedのsubnet属性を変更してみた

# 1. はじめに
IBM Cloud Classic InfrastructureのSubnetには、インターネット通信が可能なPublicと、IBM Cloud内部で10.x.x.xのIPアドレスが割り振られるPrivateという種別があります。これに加えて、

- Portable
- Static
- Unrouted（VLANとの紐付けがなくなり、FCR/BCRから通信できない）: 2022年11月以降、60日以上に渡ってunrouted状態であったsubnetは自動的にキャンセルされる可能性があります。[How long can unrouted subnets remain unused on my account?](https://cloud.ibm.com/docs/subnets?topic=subnets-faq#faq-unrouted-subnets-automatic-reclaim&locale=en)

という属性が存在しています。今までは、注文時にこれらの属性を決めて後から変更できませんでしたが、最近その属性が後から変更可能になりました。あまりUnroutedが使われることはないかもしれませんが、例えば開発段階やメンテナンス時に一時的に通信を遮断したい場合などに利用することも考えられます。
- https://cloud.ibm.com/docs/subnets?topic=subnets-re-routing-secondary-subnets&interface=ui&locale=en
- https://cloud.ibm.com/docs/subnets?topic=subnets-faq&locale=en

今回の記事では、例としてVLAN1149に紐付けて購入したPortable sunbet(`10.192.120.0/28`)の属性を順に変更してみたいと思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/506a053d-1449-c7b9-d749-eaeb9330425a.png)



# 変更例1: Portable subnet-> Portable subnet (VLAN IDの変更)

- VLAN1149からVLAN1176に変更<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/908c1b62-3934-7655-2002-27779785cce9.png)
- 変更確認<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/15ea8bd5-0d7c-4638-c5b2-22ceab4aa960.png)
- VLAN1176に変更された<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/a65bec48-e375-2fb9-51ca-f2bfa422a3b5.png)



# 変更例2: Portble subnet -> Static subnet

- Static subnet内に存在するアドレス宛のパケットは、指定されたTargetのアドレスに転送される。ここでは、例1の作業後に再度`Change route`を選択し、以下のように`Static`を選択して`10.192.18.115`に転送するものとする。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/7a5482dc-869e-87bf-2f54-e13cec69fd84.png)
- 変更確認<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/d8746937-4b64-539f-35f4-84a2e259ab5b.png)
- 期待通り変更された<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/f03d80b3-c13f-3087-8b4f-84c1ec1f9c14.png)


# 変更例3: Static subnet -> Unrouted

- Unroutedを選択すると、IBM Cloud内の内部ルーター（FCR/BCR)からルーティングされなくなる。ここでは、例1の作業後に再度`Change route`を選択し、以下のように`Unrouted`を選択するものとする。<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/4ac09ea1-9871-70bf-42e0-988393bc84ce.png)
- 変更確認<br> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/6d4cbd13-1120-60f3-6870-d29f91143f4b.png)
- 期待通りに変更された<br>![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/2f8507b5-9599-4241-2e78-8f0ff5d56524.png)

# 変更例4: Unrouted -> Portable Subnet（元に戻す）

- 同様の手順で、最初の構成(VLAN1149に紐づいているPortable Subnet)に戻す。以下のように無事戻すことができた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/62127/460091a8-71ba-593f-9946-74f8ac26075e.png)
sessionStorageにオブジェクトを保存する

# はじめに
今回は、sessionStorageについて学んだことをまとめておきたいと思います。

sessionStorageの基本的な使い方について説明した後、タイトルのサンプルコードを紹介します。

https://developer.mozilla.org/ja/docs/Web/API/Window/sessionStorage

# 1. sessionStorageとは
ページを閲覧しているユーザーのブラウザに,
**key-value**の形式でデータを保存する仕組みであるWeb Storage APIの１つです。

データの**保存、取得、更新、削除**といった操作がJavaScriptの短いコードで実現できるため、
直感的に使うことができます。

もう一つのWeb Storage APIであるlocalStorageとの違いとしては、データの保存期間などが挙げられます。

# 2. 基本構文
### データの保存
データの保存には**setItemメソッド**を使って**key、value**を指定します。
```javascript
//sessionStorage.setItem('key','value');
 
sessionStorage.setItem('name','太郎');
```

### データの取得
データの取得には**getItemメソッド**を使って**key**を指定します。
```javascript
//sessionStorage.getItem('key');
 
sessionStorage.getItem('name');
```

### データの削除
データの削除には**removeItemメソッド**を使って**key**を指定します。
```javascript
//sessionStorage.removeItem('key');
 
sessionStorage.removeItem('name');
```

### データの初期化（全て削除）
データの初期化にはclearメソッドを使います。
```javascript
sessionStorage.clear();
```

# 3. 本題
## sessionStorageにオブジェクトを保存する
sessionStorageに保存することが出来る型は、**文字列型**です。
そのため、オブジェクトをJSON形式（**文字列型**）に変換してから保存する必要があります。

手順としては、
- JSON.stringifyメソッドを使ってオブジェクトをJSON文字列に変換
- setItemメソッドを使ってデータを保存

となります。
また、保存したデータは
- getItemメソッドを使ってデータを取得
- JSON.parseメソッドを使ってJSON文字列をオブジェクトに変換

の手順を踏むことで、オブジェクトとしてデータを利用することができます。

### サンプルコード
```javascript
const obj = {
  name: '太郎',
  hobby: 'ゲーム'
};

//オブジェクトをJSON文字列に変換
const jsonObj = JSON.stringify(obj);
sessionStorage.setItem('user', jsonObj);

const user = sessionStorage.getItem('user');

//JSON文字列をオブジェクトに変換
const userObj = JSON.parse(user);
```

上記のようなコードでsessionStorageにオブジェクトを保存し、利用することができました。

以上で実装完了です。

# 4. 参考記事

https://zenn.dev/kazuhe/articles/web-storage-api
【Kotlin超入門】KotlinとJavaの違い



# はじめに
こんにちは！新人エンジニアのふかこうです！
今回初投稿ということで、私が現在勉強中のKotlinについて記事を書いていこうと思います。
Kotlinに興味がある方、ぜひ一緒に勉強していきましょう！

# この記事の対象者
・Androidアプリ開発に興味がある方
・Kotlinを学びたい方
・初級エンジニア
・IT企業に就職する学生

# 筆者のレベル
・新人エンジニア
・これからKotlinでアプリ開発をしていく

# Kotlinとは
Kotlin（コトリン）は2011年ごろに発表されたプログラミング言語です。
**JVM**上で動作する静的型付けのオブジェクト指向で、静的なnull安全が保証されているのが特徴としてよくあげられます。
簡単に言うと「Javaをもっと簡潔にしたオブジェクト指向言語」です。
Androidアプリの開発が可能であり、Google社がAndroidの開発言語として公式認定したプログラミング言語でもあります。
ですが、Kotlinはアプリ開発専用ではないというところに注意しましょう。Webサービスの作成も可能なんです！

# 主な開発ツール

・**Android Studio**
Googleが2014年から提供しているAndroidアプリ開発専用のIDEです。
IDEとは、プログラミングするときに必要な機能を1つにパッケージングしたソフトウェアのことです。

Android Studioは、Android開発者向けのサイト「[Android Developers](https://developer.android.com/studio?hl=ja)」から無償でダウンロードできます。
Android Studioは開発するためのOSに制限がありません。Windows、MacOS、Linux、Google Chrome OSのどれでも使用できます。

Android Studioには**エミュレータ**が備わっているので、わざわざ実機（スマホ）を使わなくとも実行して確認を行えます。
# KotlinとJavaの違い
先程、Kotlinは「Javaをもっと簡潔にしたオブジェクト指向言語」と言いましたが、
Javaと比べて次のメリットがあります。

・Javaよりもコードが短く簡潔
・Javaで陥りがちな<font color="Red">NullPointerException</font>を防ぐ仕組みがある
・Javaのコードを呼び出せる（逆も可能）

これを聞くと、Javaより開発が簡単に思えるかもしれませんが、実は日本語で読める情報が少ないという点には注意が必要です。

新しい言語ということもあり、頼れる情報がまだ少ないので、私も分からないことや困ったことがあった際にググっても出てこないことがありました。
そういった時は、知恵袋やエンジニアの掲示板サイトなどを使って質問して
現役エンジニアの方から意見をもらうのがいいと思います！

それでは具体的なコーディング時の違いを見ていきましょう！

### 変数宣言
例：
```java:Java
   String str = "hello"; 
```
↓
```java:Kotlin
      var str: String = "hello"
```
Kotlinは**セミコロン**(;)が不要！

### for文
例：
```java:Java
     for (int num : numbers) {
        System.out.println(num);
     }
     for (int i = 0; i< 5; i++) {
        System.out.println(i); 
     } 
```
↓
```java:Kotlin
   for (num in numbers) {
      println(num)
   }
   for (i in 0 until 5) {
      println(i)
   }
```
Kotlinは **in**を使う。

このように多少Javaに似てるものの、だいぶコード自体は短くなります。
Javaのスキルがある方は開発速度を上げられるかもしれませんね。

# 所感
現在Todoアプリを作成をしているんですが、Kotlinで書くコードはJavaに比べて短く
、ヌルポ（NullPointerException）を防いでくれる為、安心してコーディングができています。
現段階では、ネットに参考となる情報が少ないというデメリットがありますので、私のような初心者はJavaも一緒に勉強するのがいいと感じました。
Android StudioはJavaのコードをKotlinに変換してくれる機能があるので、Javaで書いて
変換して確認するのもいい勉強になると思います。

# 最後に
今後は経験で得たKotlinスキルを皆さんに共有していきたいと思っています。
記事を読んでAndroidアプリ開発に興味を持っていただけたら幸いです。
DynamoDBにAutoScalingを適用した時の挙動

# 内容
DynamoDBでちょっとした社内システムを作ったところ、容量の設定が適当すぎてユーザ影響がでていたので、対処を行いました。
備忘録兼、こんなかんじになるよ～という記事になります。知らない方向け。
# はじめに
## DynamoDBの課金について
・RDSと違いプロビジョニング自体にはお金が掛からないが、読み書きの動作に対して課金される
・課金モードは、オンデマンド（従量課金）とプロビジョンド（定額課金）を選べる。
・**プロビジョンドで事前に設定したスループットを超えると、読み書きできない、が発生する**

普段RDBMSしか使ってなかったりすると知らなかったりすると思います。**僕は知りませんでした。** びっくりするから先に言ってくれ。

## どうすればいい？

調べた感じ、下記のような感じでよいようです。
**・とりあえず難しく考えずにプロビジョンドにAutoScalingを設定する** 
　（AutoScalingの設定自体には課金が発生せず正直これといったデメリットがない）
**・それでも強烈なスパイクでスロットルが発生しそれが許されない場合だけオンデマンドにする。** 

具体的な料金比較やキャパシティの計算については、古いですがこちらの記事が参考になります。
オンデマンドは基本高いみたいです。経理に怒られそう。

https://dev.classmethod.jp/articles/reinvent2018-compare-dynamodb-on-demand-price-with-provisioned-price/


# 実際にやってみた
今回元々低いキャパシティを雑に設定していて、ユーザー数が増えた時に読み込みスロットリングが発生してしまいました。
ここにAutoScalingを設定したところの実際の挙動を貼っていきたいと思います。

## 設定はこんな感じ
DynamoDBから編集したいテーブルを選択し、「追加の設定」タブから、読み込み/書き込みキャパシティの編集セクションについて、右上の編集をクリック、設定を変更していきます。
今回読み込みのスロットリングが発生したことから、テーブルのキャパシティ→読み込みキャパシティで、
・AutoScalingをオン
・最小キャパシティユニット、最大キャパシティユニット、ターゲット使用率を入力
・「すべてのグローバルセカンダリインデックスに同じ読み込みキャパシティー設定を使用」にチェック
で、変更を保存。（今回すべてのGSIに設定しましたが、GSI毎での設定もできるみたいです）
![設定箇所.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385830/a1bf70b6-4ebb-e1d3-c3dd-815d474d62ca.jpeg)
最大最小の値は、モニタリングタブで、テーブルやインデックスの「読み取り使用量（平均単位/秒）」のグラフを確認しました。
今回該当するインデックスの実際の読み取り使用量が120程度だったので、ざっくり30~300と設定。
ターゲット使用率は少しわかりにくい項目ですが、実際の容量が設定値のXX%になるように設定されます、ということのようです。
例えば70％で設定すれば、今回は120が70％になるので、120/0.7=170くらいに設定値が動く予想。

## 結果
結果はこのようになりました。
・モニタリングタブ→該当のGSIのグラフ
![キャプチャl.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385830/be2c782c-87e2-1d99-6965-1b2bc68a84fc.jpeg)

左側のグラフで、07:20より前ではGSIの読み取り使用量（青の線）が既存設定の容量（赤の線）を大きく超えていたため、右側のグラフで「読み取り調整されたイベント」が発生していました。この「読み取り調整されたイベント」がスロットリングのことです。
設定を変更した07:20以降は読み取り容量が181に自動で変更され、「読み取り調整されたイベント」がゼロになっています。

・インデックスタブ→読み込みキャパシティー
![AutoScale適用後.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385830/1486c6e3-dda3-d8d9-2d7e-d787d4eef0f0.jpeg)
AutoScalingが適用され、「現在プロビジョニングされているユニット」の値が181になりました。

・その後
![AutoScale適用後_graph5.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2385830/8141a610-9da1-2b7e-bfea-42d292503b25.jpeg)
ユーザー数の上下動に対して、AutoScalingが容量を都度変更してくれていることがわかります。
スロットリングは設定以降発生しませんでした。めでたしめでたし。

## 補足
今回テーブルだけじゃなくGSIに対しても一括でAutoScalingを適用しました。
そもそもインデックスに容量を設定するって意味わからなくないですか？**僕は分かりません。** 
GSIというのは、NoSQLで「このキーで検索したい」というときに設定するものですが…
調べたところ、このGSI、内部的には一個設定するごとに一個の「射影テーブル」が作成され、別のパーティショニングが行われた新しいテーブルが作成されているそうです。
つまり、**GSIごとに別個のテーブルになっているため、元のテーブルに対してスロットリングが発生しているのか、GSIでできた射影テーブルに対してスロットリングが発生しているのか、というのも別** ということらしいです。テーブルが増えているから、RCU/WCUも別なんですね。
今回のケースではGSIのテーブルにだけスロットリングが発生していたので、実は該当GSIのキャパシティだけを設定すれば十分だったようです。確認したところ、確かにGSIのRCUは変動しましたが、テーブル自体のRCUは30のまま変わりませんでした。まぁ、難しいことを考えずに全部AutoScalingにしておけばいいんじゃないかなと思うんですが、どうなんでしょうか。

このへんの仕組み含め、DynamoDBの中身についての解説はこちらの方の記事が詳しかったです。ぜひ参考にしてみてください。

https://qiita.com/d0raem0n/items/c2af7d3d55093134bac3

# おわりに
実際のDBの状況によって適切な設定が変ってくるものなので、判断が難しい場合はサポートケースをオープンして聞いてみるのも良いかもしれません。餅は餅屋ということです。良いDynamoDBライフをお過ごしください。
PHPStormの検索結果

検索結果が100件までしか表示されず、不便なことこの上ない。

検索してみると、レジストリを修正する方法があるよ、レジストリで「ide.usages.page.size」の値を変更するんだよ、とあるが、そんなレジストリのキーは存在しない。（私が使っているバージョンでは）

いつの間にか、通常の設定に項目ができていました。

「複数ファイル内検索/使用箇所の表示」プレビューに表示する検索結果の最大件数

Preferences → 詳細設定 でアクセスできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/960889d7-c6b9-b1b4-edcb-f63822adece2.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/a4b95ad8-95fc-98ad-781d-4bfed73e6fae.png)

それにしても、100件が200件になるだけで「大幅に増加する」って、何なんでしょうね。
100件が1万件、とかなら分かるんだけど。

ちなみに、数字を大きくすると **「番号を入力してください」** という謎のワーニング（？）メッセージが出ます。謎です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/fb494b4f-872c-bd79-548b-e453fb24b2e1.png)
数値としては「2147483647」まではOKです。「2147483648」からワーニング。 `signed 32bit` かーい！

## 参考（レジストリをいじるパターン）
[【PhpStorm】Find in Path とかの検索結果を100件以上表示する](https://qiita.com/naoki_koreeda/items/74894904caf29bb639d4)
ROS2 nav2 初期位置（Rvizの2D Pose Estimate)をコマンドで送信する

## 参考
https://answers.ros.org/question/378514/set-the-initialpose-ros2/


## 初期位置をコマンドから送信する
コマンド
```
ros2 topic pub -1 /initialpose geometry_msgs/PoseWithCovarianceStamped '{ header: {stamp: {sec: 0, nanosec: 0}, frame_id: "map"}, pose: { pose: {position: {x: 0.1, y: 0.0, z: 0.0}, orientation: {w: 0.1}}, } }'
```
上記コマンドの内、座標(x,y,z)と向き(w)で表されているので、
x:0.1、y:0.0、z:0.0、w:0.1
これを自分のロボットがいる位置と向きに合わせて送る。

自分の位置は一度Rvizで座標、向きを確認するのが早い。
xyz座標：Rvizの左メニュー内のTF-base_footprint-Position-x、y、zの値
w(向き）：Rvizの左メニュー内のTF-base_footprint-Orientation-wの値

参考画像
![Screenshot from 2022-06-29 13-50-51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2378923/d9a6357f-9775-9227-54e2-be8fbfc3e1a6.png)
qiskitのインストール

qiskitというのはIBMが作った量子計算パッケージです。IBM-Quantumと連動して実際の量子コンピューターでコードを実行することもできます。

https://quantum-computing.ibm.com/

# 仮想環境構築

まず、仮想環境を用意します。というのもpipとcondaを両方使う必要があるからです。環境の名前はqiskitとしました。ターミナルから操作します。

```
conda create -n qiskit
conda activate qiskit
```

# インストール

qiskit環境に入ったら以下のパッケージをインストールします。

```
pip install qiskit
pip install qiskit[all]
```

最適化ツールの"qiskit-aqua"というパッケージがありましたが、いつの間にか廃止になってしまったようです。一応、次のコマンドでインストールできましたが、まともに動きませんでした。

```
pip install qiskit-aqua[all]==0.7.1
```

# 参考
- https://github.com/Qiskit/qiskit-aqua/blob/main/README.md#migration-guide
【javascript】【jQuery】文字列を結合代入する += を使う  数値を加算減算する


# コード
```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
let results = [
    {'name' : '田中,',  'japanese' : 83},
    {'name' : '渡部,',  'japanese' : 62},
    {'name' : '品川,',  'japanese' : 23},
    {'name' : '滝谷,',  'japanese' : 93},
    {'name' : '川原田,','japanese' : 55},
    {'name' : '一色',  'japanese' : 27},
];
let name = '';
results.forEach((result) => {
   name += result.name
})
console.log(name);
```

# 結果
```
田中,渡部,品川,滝谷,川原田,一色
```

# コード
```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');
currentValue -= 4;
currentValue += 4;
```
AWS Cloud9でGitのエディターを永続的にnanoからvimに変更する

### 概要
 - Cloud9でTerminalからgitでコンフリクト修正やrebaseする際に起動するエディタをnanoからvimに変更する方法です。
 - Cloud9の場合、`git config`によるnanoエディタの指定が.bashrcに記載されています。
 - そのため、普通にgitコマンドでエディタ設定を変更（git config ~）してもログインの度に元に戻ってしまうため、.bashrc側を修正する必要があります。


### 設定方法
 - .bashrcの20行目あたりの以下部分を修正
```bash:.bashrc
$ vim ~/.bashrc  

～中略～

# modifications needed only in interactive mode
if [ "$PS1" != "" ]; then
    # Set default editor for git
    #git config --global core.editor nano                      ## <--- Comment out
    git config --global core.editor 'vim -c "set fenc=utf-8"'  ## <--- Add

～中略～

```
6.16 (難) 推定量の評価7 標本がiidでない場合の一致性の評価

## 方針

大数法則 (LLN) は標本がiidである場合にのみ使うことができる．本問では，標本平均の中身をうまくiidの確率標本になるよう変形してLLNに持ち込む．

(3)の赤字になっているところはまだ分かっていない．N(0,sigma^2)の加重平均がなぜ0に確率収束するのか分かる人いたら教えてください．

(追記)
赤線部分ですが，以下の通り0に確率収束します．

$Z_i=(\mu_i-\bar{\mu_i})(X_i-\mu_i)$とおけば，

$$
\mathbb{E}[Z_i]=(\mu_i-\bar{\mu_i})\mathbb{E}[(X_i-\mu_i)]=0
$$

なので，LLNにより0に収束．

## 答案

![1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/78a573fb-7175-5787-6109-56144c8a473d.jpeg)
![2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/2b8243c4-daa2-4c54-4c83-1ad490790d66.jpeg)
![3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1702786/a1855fae-5f79-e16c-a090-96a1941c5f2e.jpeg)


## 参考文献

- 『[現代数理統計学の基礎](https://www.kyoritsu-pub.co.jp/bookdetail/9784320111660)』(久保川達也　著)
Garden Imprint

Garden Imprint is one of the leading complete landscape service companies in Massachusetts offering various gardening services such as commercial landscape services, hardscape design, and installation, native garden landscape designs, commercial landscape maintenance, and ![DDD [5].jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727231/a2e54352-7090-f97e-f475-f02a8e1ca5a8.jpeg)
holiday decors, at affordable prices. Click here to learn more https://www.gardenimprint.com/
【javascript】【jquery】パイプライン演算子

## 数値でなければ、任意の数値を表示
# コード
```javascript
process.stdin.resume();
process.stdin.setEncoding('utf8');

let a = 123;
console.log(a|0)
//結果：123

let b = '123';
console.log(b|0)
//結果：123

let c = '0a123';
console.log(c|0)
//結果：0

let d = 'a123';
console.log(d|0)
//結果：0
```
## nullか0なら文字列を表示する

```javascript
let e = 123;
console.log(e||'データなし')
//結果：123

let f = '';
console.log(f||'データなし')
//結果：データなし

let g = 0;
console.log(g||'データなし')
//結果：データなし
Junos(SRX)でDS-Liteを使用してみる

※この記事には[更新版](https://qiita.com/kazubu/items/4a3e8af96d61494267e0)があります。

こんにちは、Kazubuです。

SRX向けJunos 22.2R1において、IPv4 over IPv6トンネル終端機能が実装されました。 ([リリースノート](https://www.juniper.net/documentation/us/en/software/junos/release-notes/22.2/junos-release-notes-22.2r1/topics/new-features/feature-descriptions/flow-based-packet-based-processing-10.html))
これにより、DS-Liteやv6プラス固定IPなどのIP over IPv6トンネルを使用したサービスを利用できるようになりました。
今回はSRXでDS-Liteを使うに当たっての設定例を紹介したいと思います。

## DS-Liteの設定例

DS-Liteの場合、単純にIP over IPv6トンネルをAFTRに向かって張り、デフォルトルートを向けるだけで通信が可能になります。
例えば、SRX側のアドレスが`2001:db8:1000::2`、デフォルトゲートウェイが`2001:db8:1000::1`、AFTRのアドレスが`2001:db8:1::1`のときの設定例は以下になります。（Security ZoneおよびSecurity Policy周りは割愛）
```
set interfaces ge-0/0/0 unit 0 family inet6 address 2001:db8:1000::2/64
set interfaces ip-0/0/0 unit 0 tunnel source 2001:db8:1000::2
set interfaces ip-0/0/0 unit 0 tunnel destination 2001:db8:1::1
set interfaces ip-0/0/0 unit 0 family inet
set routing-options rib inet6.0 static route ::/0 next-hop 2001:db8:1000::1
set routing-options static route 0.0.0.0/0 next-hop ip-0/0/0.0
```

RAでアドレスを受信するなどのいくつかのケースにおいては、ソースアドレスが変動してしまう可能性がありますが、こちらはJunoscriptを使用することで変更に追従することが可能です。
参考として、NTTのフレッツ光上での利用を想定した、AFTRの情報取得とトンネル設定を自動的に実施するスクリプトを以下に用意したので、必要に応じてご利用ください。

* [kazubu/junos-dslite-autoconfig](https://github.com/kazubu/junos-dslite-autoconfig)
Cloud FunctionsによるGCSとBigquery連携：GCS-Trigger

# 背景
CloudStorageに毎日アップロードされたデータを簡単なpython処理後、Bigquery上のtableにoutputすることです。
Airflow（CloudComposer）では簡単にできましたが、データ量がそこまで大きくはないので、CloudFunctionsだけで対応できるかなと思います。

# 目次
１、サンプルデータ
２、事前準備ーGCS&Bigquery&ServiceAccount
３、CloudFunctionsの実装

## １、サンプルデータ
プラバシーの考慮で、サンプルデータを利用します。

データセット：
・東京電力使用実績データ：https://www.tepco.co.jp/forecast/html/download-j.html
・東京天気気温データ：https://www.data.jma.go.jp/gmd/risk/obsdl/#
月別データを使用することを想定します。
データフォーマットはJsonlです（業務と一致にします。）。CSVファイルも同じです。

## ２　準備ーGCSとBigqueryの設定
①outputとして、Bigqueryにdataset及び空白tableを作ります。
②input及びtriggerとして、GCS上bucketを作成します。
③連携用のServiceAccountを作成し、適当な権限を付けます。

## ３、CloudFunctionsの実装
・functionの設定その1：
![gb1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646301/88eda97e-0472-b352-30bf-09bd2e1b3155.png)
・functionの設定その2：
![gb2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2646301/b751b12b-6cec-e43f-c8a7-ee316f7ad99d.png)
環境変数のところにプロジェクトID及びBigqueryのテーブルIDを設定しました。

・codeの部分
Runtimeはpython3.9で、pythonライブラリを利用するために、requirements.txtにパッケージ名とバージョンを記入します。
requirements.txt
```
# Function dependencies, for example:
# package>=version

pandas==1.3.5
google-cloud-bigquery==2.0.0
google-cloud-storage==1.32.0
pyarrow==7.0.0
```
pyarrowがないとエラーになります。
pyarrowとは
> Apache Arrow は大規模なデータをメモリに読み込んで処理するためのプラットフォームで、高速なデータ転送やファイル入出力機能など、効 率的なデータ処理に必要な機能を提供してくれます。PyArrowはAppache ArrowのPythonインターフェースで、NumPyやpandasと連携して、Apache Arrowを利用できるようになっています。

main.py
```
from google.cloud import bigquery
from google.cloud import storage as gcs
from io import BytesIO
import os
import pandas as pd


def input_from_gcs(project_id, bucket_name, filename):
    client = gcs.Client(project_id)
    bucket = client.get_bucket(bucket_name)
    blob = bucket.blob(filename)
    df = pd.read_json(BytesIO(blob.download_as_string()), orient='records', lines=True)
    return df


def deal_data(df):
    '''
    your process code
    '''
    df_output = df
    return df_output


def df_output_to_bigquery(project_id, table_id, df_output):
    client = bigquery.Client(project=project_id)
    job_config = bigquery.LoadJobConfig(autodetect=True, write_disposition='WRITE_APPEND')
    load_job = client.load_table_from_dataframe(df_output, table_id, job_config=job_config)
    load_job.result()
    destination_table = client.get_table(table_id)
    print("Loaded {} rows.".format(destination_table.num_rows))


def main(event, context):
    file = event
    project_id = os.environ.get("project_id")
    table_id = os.environ.get("table_id")
    bucket_name = file["bucket"]
    filename = file["name"]

    df = input_from_gcs(project_id, bucket_name, filename)
    df_output = deal_data(df)
    df_output_to_bigquery(project_id, table_id, df_output)

    print("Task Done")
```
関数input_from_gcsによりデータを読み込む。
関数deal_dataはデータの処理です。
関数df_output_to_bigqueryはBigqueryに出力する。ちなみにbigquery.LoadJobConfigで、スキーマは自動探索（autodetect=True）、データは上書きではなく追加の形（write_disposition='WRITE_APPEND'）と設定されています。その他の設定については公式ドキュメントにご参照ください。
main関数のところは環境変数、またはtriggerによりbucketとfilenameなどの情報を読み込んでいます。


# 最後
CloudFunctionsのメモリーが調整できますが、でかいデータはdataflowおよびdataprocまで任せた方がよいかな。その限界の議論については多分ネット上どこかにあるだろう。
レイアウトとは

# レイアウトとは
何をどこに、どのように配置するかという割り付けのこと
出典 https://saruwakakun.com/design/tips/what-is-layout

# 最も重要なレイアウト
### ```header```
ページ上部のメニュー

### ```body```
ページの主なコンテンツ

### ```footer```
ページ下部のメニュー

出典　progate(HTML/CSS)

# どうやって構成しているのか?
```<div>```要素などでレイアウトを構成する
```html
<div class="header"></div>
```
```css
.header{
  background-color: #f7f2b4;
  height: 90px;
}
```
## 気づき
```height: 90px;```を使うことで要素の高さを変化させることができるんだな。
xdebugがPHP環境に入っているかどうかでvar_dump()の出力形式が変わる

|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|---|

xdebugがPHP環境に入っているかどうかでvar_dump()の出力形式が変わることを知った。

以前、var_dump2($user)でダンプすると、以下の感じだった。シンプルでいい。var_dump2()は「[行数を節約するvar_dump()を書いてみた](https://qiita.com/taconana/items/5cafacc6bb8229e97d3f)」を参照のこと。
```
class samples\User#1 (4) {
  private $mail => string(11) "aaa@xxx.com"
  private $id => string(4) "U001"
  private $name => string(12) "池田さん"
  public $name => string(12) "山本さん"
}
```
XAMPPを入れ替えて、var_dump2($user)を試すと、以下の感じに変わってしまっていた。継承したクラスまで識別しようとしていて、文字数が多くてスッキリしない感じになる。
```
object(samples\User)#1 (4) {
  ["mail":"samples\User":private] => string(11) "aaa@xxx.com"
  ["id":"samples\Identifier":private] => string(4) "U001"
  ["name":"samples\Identifier":private] => string(12) "池田さん"
  ["name"] => string(12) "山本さん"
}
```
調べてみると、xdebugがPHP環境に入っているかどうかでvar_dump()の出力形式が変わるようだ。

php.ini に以下を追加し、Eclipseを再起動して試すとシンプルな出力形式になる。Zend extensionのロード指定はフルパスで書く必要があるそうだ。
```
zend_extension = "C:\pleiades-xxx\xampp\php\ext\php_xdebug.dll"
```
```
class samples\User#1 (4) {
  private $mail => string(11) "aaa@xxx.com"
  private $id => string(4) "U001"
  private $name => string(12) "池田さん"
  public $name => string(12) "山本さん"
}
```
php.ini のzend_extensionをコメントアウトし、Eclipseを再起動して試すとスッキリしない出力形式になる。先頭カラムに`;`を追加してます。
```
; zend_extension = "C:\pleiades-xxx\xampp\php\ext\php_xdebug.dll"
```
```
object(samples\User)#1 (4) {
  ["mail":"samples\User":private] => string(11) "aaa@xxx.com"
  ["id":"samples\Identifier":private] => string(4) "U001"
  ["name":"samples\Identifier":private] => string(12) "池田さん"
  ["name"] => string(12) "山本さん"
}
```
ちなみに、zend_extension の値は ini_set()では変更できないので、直接 php.ini を編集する必要がある。 
|[../](https://qiita.com/taconana/items/3f5424f9abfc755772c2) |
|---|
CSS　セレクター

## CSSの基本セレクターを学んでみよう

まず、

`h1{
  color:red;
}`

`h1`をセレクター、`color:red;`を宣言と呼ぶ。


## idセレクターを使おう

id属性は同じページ内で同じ値を使ってはいけない。
また、id属性はclass属性のように空白を含めてはいけないため、複数の値を指定できない。


## 属性セレクターを使おう

属性セレクターには[]を使う。

`<a href="" target="_blank">twitter</a>`
↑この場合、
CSSに
`[target]{
　font-size:10px;
}`
と指定

※targetとは別ページに飛ばす際に使うセレクター


`<a href="#top">TOP</a>`
↑この場合、
`[href="#top"]`と指定


ー－－urlを指定したいときー－－
完全一致　`[href="value"]`
前方一致　`[href^="https"]`
後方一致  `[href$="value"]`
部分一致　`[href＊="value"]`


## セレクターを組み合わせてみよう

a,b　　　.info,p
カンマ区切りは両方適用される

ab 　　　h1.info
くっつけると h1かつ.info　という意味
同じ要素にある時に使う
例）`<h1 class="info"></h1>`


a>b 　　　main > h1
mainの直下のh1という意味。※直下でしか適用されない

a b　　　main h1
空白は mainかつh1
mainより下だったらどの階層でもよい



a+b　　　ｐ + p
ｐ直下のｐのみ。
border-topで下線を表す際よく使う。


## ::before,::after疑似要素を使おう

`ー－`←これで文字を囲みたいとき

`
h1::before{
content'-';
}
h1::bafter{
content'-';
}
`

これは正直HTMLに書けば簡単だけど、記号だからHTMLを見やすくするためにCSSに書くとかそういう時にしか使わない。


## :hover疑似クラスを使ってみよう

ちなみにボタンは`<button>`でも`<div class="btn">`でもよい。

よく使うボタンのスタイリング
`button{
cursor:pointer;
}
`
`button:hover{
opacity:0.8;
}`


##:nth-child疑似クラスを使おう

同じ階層に要素がならんでいるときに使う。

mainの直下のpの3番目にスタイルをつけたいとき
`main > :nth-child(3)`

3の倍数の部分にスタイルをつけたいとき
`main > :nth-child(3n)`

奇数の部分にスタイルをつけたいとき
`main > :nth-child(odd)`

偶数の部分にスタイルをつけたいとき
`main > :nth-child(even)`

最初のみつけたいとき
`main > :first-child`

最後のみつけたいとき
`main > :last-child`


## nth-of-type疑似クラスを使おう

`
<h>〇見出し</h〇>  
    <p>こんにちは。</p>
    <p>こんにちは。</p>
<h2〇>見出し</h〇>
    <p>こんにちは。</p>
    <p>こんにちは。</p>
`

このように様々な要素があるときに使う。
例えば3番目のh２にスタイルをつけたかった場合、

`main > h2:nth-of-type(3)`

nth-childと違い、どの要素（この場合h2）に対する順番か
を指定する必要がある。

odd, even, :first-child, :last-child も使える。


## :empty , :not疑似クラスを使おう

例えばli要素で空の部分に背景をつけたいとき、

`li:empty{
backgrouund:red;
}`

と指定できる。

※:emptyは半角や改行は空とみなされない。
　コメントは空とみなされる。


:not()は空ではないという意味で指定できる。

li:not(:empty){
backgrouund:red;
}


## 詳細度を計算してみよう

左から
【id】, 【class,属性、疑似クラス】、【要素、疑似要素】
の順番で左から数字の大きいものが優先される。

そのため、一番下に書いたコードよりも優先度の高いものが先に書かれていたらそちらが優先される。


## 優先されるスタイルを確認しよう

例えばidを２つ書くことで詳細度のスコアが高くなる。


【詳細度よりも優先されるもの】

・style属性に直接書く。
・さらに！importantのほうが優先度が高い。
viteのbuild時のファイル名ハッシュを辞める

以下の設定を追加する。

関連のある設定
rollupOptions.output.entryFileNames
rollupOptions.output.chunkFileNames
rollupOptions.output.assetFileNames


rollupの設定が露出しているので不明点があればrollup側のドキュメントを読むと良い。
ref: https://rollupjs.org/guide/en/#outputentryfilenames


```javascript
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  build: {
    outDir: './path/to/', // ビルド成果物の生成先
    rollupOptions: {
      output: { // entry chunk assets それぞれの書き出し名の指定
        entryFileNames: `assets/[name].js`,
        chunkFileNames: `assets/[name].js`,
        assetFileNames: `assets/[name].[ext]`,
      },
    },
  },
})
```

## なぜこれをやりたかったのか
jQuery -> React + TSの環境を段階的に移行するシステムの構築する目的がありました。

entry, chunk, assetsのファイル名を固定化して
jQuery側から直接Reactのコンポーネントをレンダリングできれば
段階的にUIのみをreact化、UIが揃ったらロジック面をテスト込で置き換えることができるため
Next.js や Remixなどの選択肢ではなく、react-domを使ったjQueryとの平行運用として今回のやり方を採用しようと思っています。（まだ実運用に載せていないのでハードルはこれから解消するかもしれません

## 関連issue
 
[Options for assets building without adding hash #378 ](https://github.com/vitejs/vite/issues/378#issuecomment-789366197)
C#からPythonでWebApiのデータを取得する


### C#からPythonでWebApiのdataを取得する

ProcessのOutputDataReceivedとDataReceivedEventHandlerを使ってデータを受信します

```c#
using System;
using System.Diagnostics;

Process process = new Process();
process.StartInfo.FileName = "/usr/bin/python3.6";
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.EnableRaisingEvents = true;
//パスを指定する
process.StartInfo.Arguments = "/test.py 7203";

process.Exited += (s, evt) => {
	process?.Dispose();
};

process.OutputDataReceived += new DataReceivedEventHandler((_sender, _e) =>
	{

		if (!String.IsNullOrEmpty(_e.Data))
		{
 		   Console.WriteLine(_e.Data);
		}
	}
);

process.Start();
process.BeginOutputReadLine();
```

```test.py
import json
import sys
import investpy

# pip install investpy

args = sys.argv

#トヨタ自動車 7203
code = args[0]
stock_data = investpy.get_stock_historical_data(as_json=True,stock=code, country='japan', from_date='01/02/2021', to_date='28/03/2021')

print(stock_data)
```

https://stackoverflow.com/questions/61001388/how-do-i-update-a-progress-bar-as-soon-as-process-gives-standardoutput

[Visual Studio CodeでLinux C# Guiアプリを開発する](https://qiita.com/iota_11/items/5d805775ac2a42358427)へ続く
C# シリアライズ方法 JSONSerializer

```C#
using System.Text.Json;

// 適当なデータ(クラスオブジェクトのリスト)
public class C{
  public int id {get;set;}  // プロパティでないと認識しなかった
  public int val {get;set;}
}
var lis = new List<C>(){
  new C(1,11),
  new C(2,22)
};

// シリアライズ
var json = JsonSerializer.Serialize(lis);
// 第二引数にオプションもある 改行付与など
//  ,new JsonSerializerOptions{WriteIndented = true}

// 例えばファイルに書き込み
File.WriteAllText("test.json", json);
// 読込
var jsonText = File.ReadAllText("test.json");

// デシリアライズ <受けとる型>
var lis2 = JsonSerializer.Deserialize<List<C>>(jsonText); 
foreach(var v in lis2){
    Console.WriteLine($"{v.id},{v.val}");
}
```

以上
salesforce ダイナミックフォーム

# 1.ダイナミックフォームの使用方法
1.1. カスタムオブジェクトからレコード詳細ページにて、[設定] - [編集ページ]をクリック
1.2. [レコードの詳細]セクションをクリック。
1.3. [レコードの詳細]プロパティから[アップグレードに関するお知らせ]をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/02f9f180-d511-a83b-ccd3-df6e2cfb980a.png)
1.4. 動的フォームに関するポップアップが出たら[次へ]を押して進む
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/5a97924b-de39-f542-8710-87af7c165ab4.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/eacce453-eb42-dd01-6f2b-2b36eb732a86.png)
※項目：カスタムオブジェクト項目
　詳細タブ：項目の詳細を表示
　項目セクション.表示ラベル：任意に変更可能
　項目セクション.列：1個の列、2個の列
# 2.ダイナミックフォームの項目ごとの表示制御
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/4b5164e3-5be2-8082-8e93-acafde4599f3.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1835427/31a9feb6-ffd3-98a6-c76d-1c7e95df1558.png)

# 3.ダイナミックフォームの考慮事項
・条件で項目ごと出し分け出来る
・ページレイアウトとして割り当てらてないレイアウトでも選択できる
・動的フォームとして設定すると、レイアウトとは別の動的レイアウトとなる
・作成/編集画面のレイアウトも動的フォームのレイアウトと同様となる
・レコードタイプと動的フォームを合わせて使いたい場合は、レイアウトの割り当てではなくレコードページ側で割り当てを行うことが必要
・同じ項目の複数のインスタンスを Lightning ページに追加できますが、ページのその項目のすべてのインスタンスで同じデータが表示されます。

# 4.ダイナミックフォームの制限事項
・動的フォームは、カスタムオブジェクトのレコードページでのみサポートされます。
・空白スペースはサポートされません。
・[項目セクション] コンポーネントの列あたり最大 100 個まで項目を追加できます。
・ページを動的フォームに移行する場合、項目とその項目を含むセクションのみが含まれます。ページレイアウトの他の要素 (カスタムリンク、空白スペースなど) は含まれません。

# 5.参考
https://trailhead.salesforce.com/ja/content/learn/modules/administrator-certification-maintenance-spring-21/maintain-your-administrator-certification-for-spring21
aタグのクリック領域を要素全体に広げる

```html:TailWindCSS
<div class="relative"> <!-- 対象の親要素 -->
    <a class="absolute top-0 left-0 w-full h-full cursor-pointer"></a>
    <div>...</div>
</div>
```
```html:plane CSS
<div style="position:relative;"> <!-- 対象の親要素 -->
    <a style="position:absolute;top:0;left:0;width:100%;height:100%;cursor:pointer;"></a>
    <div>...</div>
</div>
```
配列から指定したデータを直接変数に代入する

TypeScriptで**分割代入**が日常的に使われてるのでPHPでもできるのか調べてたらありました。
PHPで見かけたことがないのでマイナーっぽいです。

## まずは標準的なやり方。
```php
$array = [1, 2, 3];
$a = $array[0];
$b = $array[1];
$c = $array[2];
```
## リスト構文を使うやり方。
```php
[$a, $b, $c] = [1, 2, 3];

//$a 1
//$b 2
//$c 3
```
## 順不同でよくなるため、連想配列の方が安全に割り当て可能。
```php
["a" => $a,"b" => $b,"c" => $c] = ["a" => 1,"b" => 2,"c" => 3];

//$a 1
//$b 2
//$c 3
```
## compact関数を組み合わせてキーを振った連想配列を組み立ててから使うと便利。
```php:配列の組み立て
$a = 1;
$b = 2;
$c = 3;

$array = compact("a", "b", "c");
```
```php:値の展開
["a" => $a,"b" => $b,"c" => $c] = $array;

//$a 1
//$b 2
//$c 3
```
# 結論
わりと好みな気がしなくもない・・・。

https://www.php.net/manual/ja/function.list.php

https://qiita.com/tadsan/items/0beaf61747397c1e3db8
畳み込みニューラルネットワークについて(2022.6.29)

# 概要
[「G検定をまとめる」](https://qiita.com/tan0ry0shiny/items/8c6bf6d7c03ae268679a)の記事の項目の一つです。簡単にまとめて後付けしていくスタイルです。以下、[「畳み込み層」](https://qiita.com/tan0ry0shiny/items/34767ab4e09369f72c50)を始め、「プーリング層」「全結合層」、、、と追記する予定です。
今回は、畳み込みニューラルネットワークでどのような事をしているのかをざっくり説明出来ればと思います。
# CNNでしたい事
今回は画像分類とします。
# CNNの全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/b7572d57-4582-7f75-41da-452aa332b1fe.png)
参考1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2496939/b5769a5e-13df-e53f-f2ff-b1daf04a278e.png)
参考1

# CNNで行われている処理
上の全体像の2つ目の図を例に説明します。
1. 「畳み込み」層
まずは元の画像データを「畳み込み」層に入力します。「畳み込み」層で処理されたデータは特徴量マップとして出力されます。
1. 「全結合」層①
特徴量マップはそのままでは分類に使えないので1つ目の「全結合」層で1行n列のデータにして活性化します。
1. 「全結合」層②
「全結合」層①で活性化されたデータを元に、Softmax関数で分類します。例えば10種類に分類する時はそれぞれの確率で出力されます。一番、確率の大きい物をモデルが決定した判断とします。
# 参考
1. [他力本願で生き抜く（本気）(2022.6),畳み込みニューラルネット（CNN）による画像識別（MNIST), HatenaBlog](https://shirakonotempura.hatenablog.com/entry/2018/12/21/035953)
1.
CentOS Stream 8で DockerとDocker-composeのインストール

# はじめに
DockerとDocker-composeをインストールしたので手順を残します。

__※wgetコマンドを使用します。__

## dockerをインストールするためのリポジトリ[^1]を追加する。
```
$ dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
```
コマンドを入力したら下記の画像のようになります。
![スクリーンショット 2022-06-28 134104.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/f0185634-8dbe-53ca-9cae-e3975dbe9c24.png)

## dockerインストール

```
$ dnf -y install --nobest docker-ce docker-ce-cli
```

![スクリーンショット 2022-06-28 134314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/ed293983-6f88-ad52-e148-fe95b1673694.png)

下記のコマンドで自動起動有効化します
```
$ systemctl enable docker
```
docker起動
```
$ systemctl start docker
```

## docker-composeのインストール事前準備

docker-composeをインストールするためにwgetコマンドを使用するため
wgetコマンドを下記のコマンドでインストールしていきます。

```
$ dnf install wget
```
__下の画像のようにインストールが始まります。__

![スクリーンショット 2022-06-28 134408.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724196/1368a06b-0dca-aced-4a39-e58ad7404244.png)

`yes`を選択しましょう。

#### wgetがインストールされているかの確認コマンド

```
$ which wget
```

## docker-composeをインストールする。

事前準備でインストールをしたwgetコマンド[^2]を使いdocker-composeをインストールしていきます。
```
$ wget https://github.com/docker/compose/releases/download/1.25.5/docker-compose-Linux-x86_64
```

下記のコマンドで`docker-compose-Linux-x86_64` を/usr/local/bin/に配置します。
```
$ mv docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
```
実行権限を下記のコマンドで追加します。
```
$ chmod +x /usr/local/bin/docker-compose
```

バージョンの確認を下記のコマンドで行います。
```
$ docker-compose --version
```
### 脚注
[^1]: リポジトリ（英：repository）
ファイルなり、プログラムなり、設定情報なり、何らかの「保管場所」
[^2]: wgetコマンド
指定したURLのファイルをダウンロードします。
SecurityHub検出結果CSV出力用コマンド


* 初回検出日が30日以内、かつ重要度がCRITICALまたはHIGHでACTIVEなのSecurityHub検出結果を検索し、CSV出力するワンライナー
```shell
DATE=$(date --date="-30 days" +%Y-%m-%d);aws securityhub get-findings --filters '{"SeverityLabel":[{"Value": "CRITICAL","Comparison":"EQUALS"},{"Value":"HIGH","Comparison":"EQUALS"}],"RecordState": [{"Value": "ACTIVE","Comparison":"EQUALS"}]}' --query "Findings[?FirstObservedAt>=\`$DATE\`]" | jq -r '.[] | [.ProductName, .Region, .GeneratorId, .AwsAccountId, .Compliance.Status, .Severity.Label, .Resources[0].Region, .Resources[0].Id, .UpdatedAt, .Title, .Description] | @csv' > securityhub-findings.csv
```
zypper updateした際にアップデートされないパッケージがある(ベンダ変更を伴うアップデート)

# 概要

## 想定される状況
```terminal
$ sudo zypper update
リポジトリのデータを読み込んでいます...
インストール済みのパッケージを読み込んでいます...

以下 16 個のパッケージ更新はインストールしません:
~~~(パッケージがいっぱい)
```

openSUSE Leapの環境にて```zypper update``` をした際にアップデートされないパッケージがある場合があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/456cae27-60e4-b3ed-940e-5a111bf82419.png)

## なぜ？
理由はいくつか考えられますが
1. 現在インストールされているパッケージを提供しているベンダとは**別のベンダ**に新しいバージョンのパッケージがある
2. 当該パッケージをアップデートすることで他のパッケージとの依存関係が壊れる

だいたいはこの2つのどっちかだと思います。
今回は前者のケースを想定し、ベンダを変更した上で一括で```zypper update```をする方法を紹介します。

# 解決方法
```zypper update --allow-vendor-change``` のようにして、```--allow-vendor-change```オプションを付けることで一括でベンダを変更し、パッケージをアップデートすることができます。 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269735/6e399aa5-c1ac-9a8f-38b0-cce34d2baf2c.png)
【Flutter】超初心者向け基本のテンプレート

Flutterのどこに何が書いてあるかがわかりやすいので備忘録として残します。
このテンプレートは使いまわせるんじゃないかと！
# 【Flutter】超初心者向け基本のテンプレート

```dart:main.dart
import 'package:flutter/material.dart';

void main() => runApp(MyApp()); // 引数のWidgetが全画面表示される

// 最初に表示するWidgetのクラス
class MyApp extends StatelessWidget {  // StatelessWidgetを継承
  @override
  Widget build(BuildContext context) {  //buildメソッドでUIを作成
    return MaterialApp(  // マテリアルデザインのアプリ
      title: "My Simple App",  // アプリのタイトル
      home: Scaffold(  // マテリアルデザインの土台
        appBar: AppBar(  // ヘッダーに表示するアプリケーションバー
          title: Text("好きなタイトル"),  // タイトルを表示
        ),
        body: Center(  // 中央に配置
          child: Text("文字入力してください"),  // 文字列を配置
        ),  //　Center
      ),  //　Scaffold
    );  //　MaterialApp
  }  //　Widget build(BuildContext context)
}  //　class MyApp
```

このコードだとヘッダーに「好きなタイトル」というタイトルが現れ、真ん中に「文字を入力してください」と表示されます。

### あとは中を作っていくだけですね。

機会があればまた更新します。
#01 ファイルをまとめてリネーム（R、RStadio）

### ファイルをまとめてリネーム
多数のファイルをまとめてリネームしたいときに利用できるコードです。

### ①ファイルリストの作成
~~~ rename.R
# wdの設定（リネームしたいファイルがあるフォルダのパス）
setwd("hogehoge")
getwd()

# ファイル名の取得をして、ファイルリストを作成
write.csv(list.files(), 'list.csv')
~~~

### ②変更後のファイル名
①で作成したファイルリストに変更後のファイル名を追加する。

### ③リネームの実施
データフレームで変更前のファイル名と変更後のファイル名を入れて、
for文で回していく。
~~~ rename.R
# データフレームの読み込み
df <- read.csv("list.csv")

for (i in 1:nrow(df)) {
  file.rename(df[i,2],df[i,3])
}
~~~
【HTML,CSS】テーブルの角を丸くしたい！

「**border-radiusが効かなくてテーブルの角を丸く出来ない...!**」と、お困りなそこのあなたに
今回は角の丸いテーブルを作成する方法を解説していきます。

## 再現したいデザイン
![スクリーンショット 2022-06-25 23.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/564ac1d6-f2ee-9c0d-55cc-7267f33584e2.png)

table要素のうち`tbody`要素のみがborderで囲われたデザインですね。



# 実装方法
実装のポイントは以下の２つです。
- tableタグに `border-collapse: separate;` を設定する
- 疑似要素をうまく使ってtdタグに `border-radius` を指定する

## tableタグに `border-collapse: separate;` を設定する
`border-collapse`は、テーブルの中のborderを共有させるか分離させるかを指定できます。
詳しくは、[CSSのカスケーディングスタイルシート](https://developer.mozilla.org/ja/docs/Web/CSS/border-collapse)をご覧ください。
**テーブルの角を丸くしたいときはテーブルの内のborderを分離(separate)させます。**

## 疑似要素をうまく使ってtdタグに `border-radius` を指定する
trタグにborderを設定するのではなく、**tdタグにborderの設定**をしていきましょう。

詳しく手順を説明していきます。
1. すべての`td`タグに`border-top`を設定する。(画像：赤線)
2. `td`の`first-child`に`border-left`を設定する。(画像：青線)
3. `td`の`last-child`に`border-right`を設定する。(画像：緑線)
4. `tr`の`last-child`内にある、すべてのtdに`border-bottom`を設定する。(画像：黄線)
5. `tr`の`first-child`内にある、`td`の`first-child`に`border-radius`を左上のみ指定する。(画像：緑丸の角)
6. `tr`の`first-child`内にある、`td`の`last-child`に`border-radius`を右上のみ指定する。(画像：黄丸の角)
7. `tr`の`last-child`内にある、`td`の`first-child`に`border-radius`を左下のみ指定する。(画像：赤丸の角)
8. `tr`の`last-child`内にある、`td`の`first-child`に`border-radius`を右下のみ指定する。(画像：青丸の角)
![スクリーンショット 2022-06-25 23.51.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1578726/6322b7dc-472c-0330-f3c7-349d55f7f9aa.png)


実際に実装したコードがこちらです↓
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="GRQayOa" data-user="kidorina" 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/kidorina/pen/GRQayOa">
  Untitled</a> by kidorina (<a href="https://codepen.io/kidorina">@kidorina</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>

# 終わりに
角の丸いテーブルの作成は一見簡単そうに見えますが、少し苦労がいるようです。
より簡単な実装方法をご存知の方がいらっしゃいましたらコメントでご教授いただけると幸いです。
【Laravel】データベースのデータがブラウザに表示されない

コントローラーで、データベースのデータを取得したいのに上手く取得できないため、そもそもの部分の理解のために備忘録を書きます。

# 前提

- Todoアプリを作っております。
- TodoController.phpのindexアクションが実行された時に、DBのtodosテーブルから全データを引っ張ってこれるようにしたい。

# 現状

### コントローラ
```php:todo-api/app/Http/Controllers/TodoController.php
<?php

namespace App\Http\Controllers;

use App\Models\Todo;
use Illuminate\Http\Request;

class TodoController extends Controller
{
    public function index()
    {
        $todoIndex = Todo::all();
        return $todoIndex;
        var_dump($todoIndex);
    }
}
```

### モデル

```php:todo-api/app/Models/Todo.php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Todo extends Model
{
    use HasFactory;
}
```

### マイグレーションファイル

```php:todo-api/database/migrations/●●●●●●●●●●●●_create_todos_table.php
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('todos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->text('memo')->nullable();
            $table->smallInteger('status')->default(0);
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('todos');
    }
};

```

### DBのテーブルの状態

![スクリーンショット 2022-06-29 10.31.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/7fd13daa-b7f7-d1f2-404a-1dfb5fef4167.png)


### ルーティング

```php:todo-api/
Route::controller(TodoController::class)->group(function () {
    Route::get('todo/index', [TodoController::class, 'index']);
});
```

### ブラウザの画面

localhost:8000/todo/index にアクセスしてみると・・・

![スクリーンショット 2022-06-29 10.25.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/4999ad26-cd2b-2028-ae0b-95187b48514a.png)

なぜだろう。。。
あれ？これってもしかして、データベースにそもそもデータ追加していないから、空っぽだから[]が表示されている・・・？
Migrationでテーブルとカラムは作ったけど中身は作っていないし・・・

# SQLでDB操作

```
中身チェック
SELECT * FROM todos
```


```
データ挿入
insert into todos values (1, '洗濯', 0);
```

```
中身チェック
SELECT * FROM todos
```

![スクリーンショット 2022-06-29 10.52.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/9093c40c-5c92-8f31-2248-ce9a3de5ab7f.png)

データを追加できました！
ブラウザで再度確認してみると・・・

![スクリーンショット 2022-06-29 10.53.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/985164/8e2d8f49-ebbb-da19-6d96-9418f59c990e.png)


しっかり返ってきました！
やはり、DBにデータがないだけでした(^^;)
SFDXを使用してチャットボタンタイプのオムニチャネルを展開する方法


[SFDXを使用してチャットボタンタイプのオムニチャネルを展開する方法](https://salesforce.stackexchange.com/questions/377269/how-to-deploy-chat-button-type-omni-channel-using-sfdx)

これにも関連するのかは全く理解できず....

[Sandboxからリリースした場合のSalesforceID](https://trailhead.salesforce.com/ja/trailblazer-community/feed/0D54S00000IPIodSAH)
Railsで最新V8のSwiperへのバージョンアップに対応する

こんにちは、りです。
先日Swiper.jsは`4.5.0`から`8.2.4`(時点最新)へアップデートされました、（怖いバージョン差😂）、今回はその対応STEPSとバージョンの解説をまとめました。
## 概要
**1.アップグレード対応STEPS:**
 - STEP1: Swiperのアップデート
 - STEP2: クラス名を変える
 - STEP3: CSSとJSを読み込ませるように修正する

**2.注意点:**
- V6.5.1未満場合脆弱性がある
- V5.4.5以降はIE11では対応していなかった
  
**3.参考資料**

### 1.アップグレード対応STEPS
Swiperのリリース情報確認: `2022-06-13`に[v8.2.4](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md#824-2022-06-13)をリリース、[v4.5.0](https://github.com/nolimits4web/swiper/blob/master/CHANGELOG.md#450---released-on-february-22nd-2019)は`2019-02-22`😂.
今回のバージョン差は大きくなってしまいましたから、新旧バージョンの違いを比較するよりも、直接新しいものを使ったほうが早そうと思います。
#### 1.1 Swiperのアップデート
従来の導入方法に従って、今回もYarnというパッケージマネージャーを使いました
> [公式サイトで紹介されている導入方法](https://swiperjs.com/get-started#install-from-npm)

- yarnで最インストールする
```
$ yarn remove swiper #古いパッケージをアンインストールする
$ yarn add swiper #バッケージをインストールする
$ yarn install　#開発環境下にインストール
```
`yarn.lock`と`package.json`を更新されます。
※ `package.json`をテキストエディターで開き、したいバージョンに編集して、`yarn install`を実行しても良い。

### 1.2 クラス名を変える
下記のように、HTMLのクラス`swiper-container`を`swiper`に変更する
```html

  <div class="swiper-container">
    <div class="swiper-wrapper">
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
    </div>
  </div>
   ⬇︎
  <div class="swiper">  ##ここだけ
    <div class="swiper-wrapper">
        <div class="swiper-slide">Slide 1</div>
        <div class="swiper-slide">Slide 2</div>
        <div class="swiper-slide">Slide 3</div>
    </div>
  </div>
```

### 1.3 8系のCSSとJSを読み込ませるように修正する
- css
```scss:【V4】app/assets/stylesheets/該当ページ.scss
@import '/swiper/dist/css/swiper.min';
```
```scss:【V8】app/assets/stylesheets/該当ページ.scss
@import 'swiper/swiper-bundle.min';
```
- js
```js:【V4】index.js
import Swiper from 'swiper'
```
```js:【V8】index.js
import Swiper, { Navigation, Pagination } from 'swiper'
```

### 2. 注意点
① V6.5.1未満場合は脆弱性があるので、早めにアップグレードして良さそう！
>[swiper における脆弱性](https://jvndb.jvn.jp/ja/contents/2021/JVNDB-2021-005554.html)

② V5.4.5以降はIE11では対応していなかったけど、2022 年 6 月 16 日（日本時間）にIEのサポートが終了しましたから、最高じゃん

## 3. 参考資料
- [Swiper公式使い方](https://swiperjs.com/get-started)
- [Swiper.js 7 への Upgrade で発生したスライダーの崩れを修正](https://zenn.dev/sezemi_admin/articles/7968e20c3fd333)
Vivaldiをダークモードで使う(Ubuntu 22.04)

# きっかけ
Ubuntu機の環境を破壊しては再構築する作業を繰り返しているのですが、毎度毎度調べるのも面倒になってきたので備忘録。
以下にバージョンは書いていますが、多分外でも使えるはず。

# 環境
```sh:cat /etc/os-release | grep VERSION
VERSION_ID="22.04"
VERSION="22.04 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
```
Vivaldi: `5.3.2679.61 (Stable channel) stable (64-bit) `

# どこをいじる
1. `/opt/vivaldi/vivaldi`を適当なエディタで開きます。
1. 最終行を以下のようにします。
```
exec -a "$0" "$HERE/vivaldi-bin" "--enable-features=WebUIDarkMode" "--force-dark-mode" "$@"
```

# 参考にした記事
[Chrome をダークモードで使う (on Linux, Ubuntu Desktop)](https://scrapbox.io/yude/Chrome_%E3%82%92%E3%83%80%E3%83%BC%E3%82%AF%E3%83%A2%E3%83%BC%E3%83%89%E3%81%A7%E4%BD%BF%E3%81%86_(on_Linux,_Ubuntu_Desktop))
【JavaScript】9割自力でまるばつゲーム作った

QiitaでのQ&Aに２回ほど助けられましたが、それ以外すべて自力で作りました。
今後コードの簡略化と勝敗の判定の追加に励みます。
アドバイスやご意見等お待ちしております。
```html
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>まるばつゲーム</title>
    <style>
        #gameTable {
            width: 100px;
            height: 100px;
        }
        td {
            text-align: center;
        }
    </style>
</head>
<body>
    <h1>まるばつゲーム</h1>
    <p id="inputWhich">　</p>
    <br>
    <div id="field">

    </div>
<script>
    let tx = "〇";
        
    document.getElementById("inputWhich").innerText = tx + " の番";
    const inputMark=(e)=>{
        if(e.target.innerText==""){
            e.target.innerText = tx;
            if(tx=="〇"){
                tx = "✕";
            }else if(tx=="✕"){
                tx = "〇";
            }
        }else{
            alert("そのマスは既に埋まっています。");
        }
        document.getElementById("inputWhich").innerText = tx + " の番";
    }
    let i, j;
    let tbl = document.createElement("table");
    tbl.border="1";
    tbl.className="gameTable";
    for(i=0;i<=2;i++){
        let tr = document.createElement("tr");
        for(j=0;j<=2;j++){
            let td = document.createElement("td");
            td.id="cell"+i+j;
            td.onclick=inputMark;
            td.height="50px";
            td.width="50px";
            tr.appendChild(td);
        }
        tbl.appendChild(tr);
    }
    document.getElementById("field").appendChild(tbl);
</script>
</body>
</html>
```
夏らしい画像で合成練習してみた

## はじめに
連日暑くて困っています。暑くてやる気が出ない。
暑さへの対処は暑さでどうにかしようと考え、何か夏らしき画像を重ね合わせて、スーパー夏っぽい画像が作れないか試してみました。

## コード
夏らしいもので思いついたのがすいかだったので、今回はすいかに対象を絞りました。
スクレイピングで画像を取得して、足し合わせています。
```python
#googleからキーワード：「すいか」で画像をスクレイピング
!pip install icrawler
from icrawler.builtin import GoogleImageCrawler

crawler = GoogleImageCrawler(
    feeder_threads=1,
    parser_threads=1,
    downloader_threads=4,
    storage={"root_dir": 'suika'})
crawler.crawl(keyword="すいか",
              max_num=500,
              file_idx_offset=0)

#画像のリサイズとRGB化(pngで拡張子統一)
import os
from PIL import Image

FromImgName = "/content/suika/"
ToImgName = "suika-re"
files = os.listdir(FromImgName)
for file in files:
    img = Image.open(os.path.join(FromImgName, file))
    img_resize = img.resize((300, 300)).convert('RGB')

    img_resize.save(os.path.join(ToImgName, file[:-3]+"png"))

#画像を合成する
import cv2
import glob
import numpy as np 

flist = glob.glob("suika-re/*.png")     
sums = cv2.imread(flist.pop()).astype(np.uint32)

#平均化
for fname in flist:
    sums += cv2.imread(fname)
cv2.imwrite("mean.png", (sums/(len(flist)+1)))
```
完成したのが下の画像。実の赤い部分が何となく見えるぐらいですね。
夏！というよりは、アート的な想像力を豊かにする画像ができました。
![mean.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/94b48c05-05ab-0298-243f-b7575ae3d939.png)

## まとめ
スクレイピングができるようになった。
すいかの画像を足し合わせたら、アート作品になった。

**実はそこまですいか好きではない。**

## 参照
https://tetoblog.org/2021/05/python-resize-bulk/
https://icrawler.readthedocs.io/en/latest/
https://campkougaku.com/2020/04/20/blend/
[paiza][ruby] マップの判定・縦横 (paizaランク B 相当)を整理する

### はじめに
paizaでアルゴリズムを学習し始めて日が浅いです
ランクBになると途端にコードが長くなり混乱中です
Aランクアップメニュー ＞ <b>マップの判定・縦横 (paizaランク B 相当)</b>の回答に対して理解を深めたいと考え記事にしています
⚠シェア可能な問題集の問題です
⚠リファクタリングとかはせず愚直に与えられた回答を使用しています

また、問題をご存知な方前提になっていますので入力例・出力例は載せていません

https://paiza.jp/works/mondai/a_rank_level_up_problems/a_rank_snake_map_boss

### 回答

```ruby
h, w = gets.split.map(&:to_i)
board = h.times.map { gets.split('') }

board.each.with_index do |row, y|
  row.each_index do |x|
    flag_row = false
    flag_clm = false

    if x == 0 || row[x - 1] == '#'
      flag_row = true if x == w - 1 || row[x + 1] == '#'
    end

    if y == 0 || board[y - 1][x] == '#'
      flag_clm = true if y == h - 1 || board[y + 1][x] == '#'
    end

    puts y.to_s + ' ' + x.to_s if flag_row && flag_clm
  end
end
```

### コメントアウト入れる

```ruby
h, w = gets.split.map(&:to_i)
# board配列に入力例を全て入れていく
board = h.times.map { gets.split('') }

# rowに一つずつ要素（3つ分）が入る、y（縦）には0から要素分順番に数字（0,1,2）が入る
board.each.with_index do |row, y|
  # rowに入ってる要素分（見た目は3つだが実際は4つ分あるっぽい？）のindex x（横）を取得(0,1,2,3)　
  # →　0の場合はrowの1つ目の要素
  row.each_index do |x|
    flag_row = false
    flag_clm = false
    # 最初のifで左のマス・次のifで右のマスをチェック
    # x == 0はxが1つ目の要素なら〜
    # row[x - 1]は今いるポジションの一つ前の要素を参照
    if x == 0 || row[x - 1] == '#'
      # x == w - 1は右端なのかチェック（indexが0から始まるのでwを-1する）
      # row[x + 1]は今いるポジションの次の要素を参照
      flag_row = true if x == w - 1 || row[x + 1] == '#'
    end
    # yはxの縦バージョン、　縦軸を見てるのでboard（行でわけた2次元配列）を参照
    # y == 0は一番上かどうか、　board[y - 1][x]は今いるポジションxの一つ上の要素を参照
    if y == 0 || board[y - 1][x] == '#'
      # y == h - 1は一番下かどうか、　board[y + 1][x]今いるポジションxの一つ下の要素を参照
      flag_clm = true if y == h - 1 || board[y + 1][x] == '#'
    end
    # 上2つがtrueだったらその値を出力
    puts y.to_s + ' ' + x.to_s if flag_row && flag_clm
  end
end
```

### 最後に
いきなり難しいと感じましたが、やってることはシンプルでした
閲覧頂きありがとうございました！