OmniAICreator/Qiita-1.07M huggingface dataset:
自分の知らなかったPythonのより良い書き方集

備忘録(？)としてまとめます。
あとからどんどん書き足して行こうと思います。

## 変数宣言/代入時の型明示
### 書き方
```<変数名>: <組み込み型> = <値>```

### 例
```py
text: str = 'テキスト'
numbers: list = [1, "二", 3.1]
```

### こういうところで使うべし
- メソッドの引数・返り値
- クラスのフィールドメンバー
- 生成したインスタンスを格納する変数

[参考ソース](https://lab.astamuse.co.jp/entry/2019/09/18/115033)
HindgeJoint2Dを連結したObjectの実装

[Lost Crypt 2D サンプルプロジェクト](https://assetstore.unity.com/packages/essentials/tutorial-projects/lost-crypt-2d-sample-project-158673?locale=ja-JP "UnityAssetstore")からの引用

# Model
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297288/0a9bf979-d89b-e658-b8a5-07e5129d8ceb.png)

# Parameter 1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297288/74ece88d-21ce-df8e-f6a0-9fb60fe1fb97.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297288/6a8f7daa-2630-9739-8880-c1921743be19.png)

# Parameter 2,3,4...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297288/5745a958-d95d-bd6a-7a6b-ff630fcc41d0.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297288/cee99513-0537-76c1-ba32-2627a868ffa7.png)
フロントとバックエンドを完全分離しているシステムでのファイルダウンロード方式の検討

## 前提
言語：Python3
フレームワーク：Django, Django REST API

## 概要
クライアントをWebブラウザを想定しているとあるWebシステムが、
クライアント側の画面制御等の処理を行うシステム、
業務ロジックやバッチやデータの返却などを行うシステムで完全にサーバーが分離している設計になっているとします。
(例)

![スクリーンショット 2023-02-18 20.59.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215249/a48bb9d7-efa0-8fae-27cf-601f0b83dc32.png)


ファイルダウンロード機能を実装する場合に、ファイルダウンロードをどう実現するか？
ということについて検討した結果を記載させていただきます。

## 問題
通常の、フロントとバックエンドが一体となっているシステムと比較して難しい点は、
・フロント側でファイル実体を管理していない
・バックエンドAPI側は、ファイルをそのままフロント側のサーバーに送信できない(エラーになるため)

上記の2点だと考えております。

## 採用しなかった案
①バックエンドAPIに、ファイルダウンロード用の個別の画面を持って、
ファイルダウンロードの際には、フロント側のサーバーからバックエンド側のサーバーに遷移して、
ファイルダウンロード機能を実現する。
(不採用理由)>バックエンドは画面を持たない、文字列のIN/OUTのみの用途として扱いたかった


②別途ファイルサーバーを立てて、フロントサーバーはファイルサーバーからファイル実体を取得して、
ファイルダウンロード機能を実現する。
(不採用理由)>自宅にファイルサーバーとなるリソースが無かった

上記の2点の方法は、私が個人的に採用しなかった方法で、
これらの方法で十分だとは考えております。

## 採用した案
・バックエンドは文字列のIN/OUTのみにしたい
・システムに関連するサーバーを増やしたくない
上記の要望を実現するために私が選んだ方法は、ファイルのバイナリデータを文字列としてREST_APIで送信して、フロント側のサーバーでファイルを再構築する方式です。

(イメージ)
![スクリーンショット 2023-02-18 21.11.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1215249/0f750904-58cc-6871-fa66-819ecdbfebfa.png)

上記の方式であれば、サーバーを増やすこと、バックエンドAPIに専用の画面を作成すること、などの作業をする必要がないため、一番簡単な方法だと考えております。

以上です。
Ruby FizzBuzz問題

# FizzBuzz問題
この問題は非常に有名なプログラミングの問題だそうです。
1〜100までの数字をターミナルに出力します。
ただし、「3の倍数」のときは数字の代わりに文字列でFizzと、「5の倍数」のときはBuzz、両方の倍数である「15の倍数」のときはFizzBuzzと出力するようにします。

## 条件
- 値が15の倍数である
- 値が3の倍数である
- 値が5の倍数である
- 上の3つの条件のどれにもあてはまらない
- 「〇〇の倍数」を導き出す時は剰余演算子を用いる
- 条件を指定して繰り返し処理をする場合は、whileというメソッドを使う

模範解答
```ruby
def fizz_buzz
  num = 1
  while (num <= 100) do
    if (num % 3 == 0) && (num % 5 == 0)
      puts "FizzBuzz"
    elsif (num % 3) == 0
      puts "Fizz"
    elsif (num % 5) == 0
      puts "Buzz"
    else
      puts num
    end
    num = num + 1
  end
end
fizz_buzz
```
ターミナル出力
```ruby
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz
31
32
Fizz
34
Buzz
Fizz
37
38
Fizz
Buzz
41
Fizz
43
44
FizzBuzz
46
47
Fizz
49
Buzz
Fizz
52
53
Fizz
Buzz
56
Fizz
58
59
FizzBuzz
61
62
Fizz
64
Buzz
Fizz
67
68
Fizz
Buzz
71
Fizz
73
74
FizzBuzz
76
77
Fizz
79
Buzz
Fizz
82
83
Fizz
Buzz
86
Fizz
88
89
FizzBuzz
91
92
Fizz
94
Buzz
Fizz
97
98
Fizz
Buzz
```

## 解説
1〜100までの数字をターミナルに出力するためのコードを記述します。
```ruby
def fizz_buzz
    num = 1
    while (num <= 100) do
      puts num
      num = num + 1
    end
  end
  fizz_buzz
```
次に、条件分岐内で15の倍数、3の倍数、5の倍数のときに、それぞれどのワードを出力させるのか、書く順番に注意をしてコードを記述します。

```ruby
if (num % 3 == 0) && (num % 5 == 0)
```
この部分は、15の倍数のときの条件を表していますが、
```ruby
if (num % 15 == 0)
```
上記のように書いても良いですね。
【Docker】docker-composeコマンド

# はじめに

Railsなどを中心に勉強中のエンジニア初心者が他の記事を参考にしたり、実際に実装してみたりして、アウトプットの一環としてまとめたものです。
間違っていることもあると思われるので、その際は指摘いただけると幸いです。

# `docker-compose`コマンドについて

複数のコンテナをまとめて起動するきや、オプションが重なり`docker run`コマンドが長くなるときなどに`docker-compose`コマンドを使用する。

`docker-compose.yml`や`docker-compose`コマンドを使用することで、複数のコマンドを簡単に起動する事ができる

# `docker-compose build`  （`docker build <build contexts>`に対応）

サービス（webやdb）のビルドを実行する。

`build contexts`は`docker-compose.yml`に記載されているため、`docker-compose build`のみでOK

```bash
$ docker-compose build
```

# `docker-compose up`（`docker run <image>`に対応）

コンテナを起動する。`docker run`実行時のオプションなどは`docker-compose.yml`に記載されているため、`docker-compose up`のみでOK。

`docker-compose up`は`build`も同時に実行されるため、`imgae`が作られていない場合は`dockerfile`を基にして`build`する。

2回目以降は`image`が既に存在しているため、`build`は実行されず`run`のみ実行される。

> `dockerfile`を更新した場合は古い`image`で`build`されてしまうため注意が必要。その場合は`--build`オプションをつけて実行する。
> 

バックグラウンドで実行したい場合は`-d`オプションを付けて起動する。

```bash
$ docker-compose up
```

# `docker-compose ps`（`docker ps`に対応）

`docker-compose.yml`に記載されているコンテナの状態を確認する事ができる。

```bash
# docker-compose psの実行

$ docker-compose ps
	>
	         Name                       Command              State           Ports         
	---------------------------------------------------------------------------------------
	product-register-db-1    docker-entrypoint.sh postgres   Up      5432/tcp              
	product-register-web-1   irb                             Up      0.0.0.0:3000->3000/tcp

# docker psの実行

$ docker ps
	>
	CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                    NAMES
	4f12786c4d29   product-register_web   "irb"                    40 seconds ago   Up 39 seconds   0.0.0.0:3000->3000/tcp   product-register-web-1
	f0f4da422f87   postgres               "docker-entrypoint.s…"   40 seconds ago   Up 39 seconds   5432/tcp                 product-register-db-1
```

# `docker-compose exec <service> <command>` （`docker exec <container> <command>`に対応）

`docker-compose`実行時に、指定したサービス名のコンテナにコマンドを実行する事ができる。

```bash
# docker-compose execを実行
$ docker-compose exec web bash
	>
	root@4f12786c4d29:/product-register#

$ exit
	> コンテナを抜ける
	
# docker execの実行（再度コンテナに入る場合）
$ docker exce -it product-register-web-1 bash
	>
	root@4f12786c4d29:/product-register#
```

# `docker-compose up --build`

`--build`オプションをつけると、再度`build`してから`run`する。

`dockerfile`に変更を加えた場合は`image`を作り直す必要があるため、`--build`オプションを付けて実行するとよい

```bash
$ docker-compose up --build
```

# `docker-compose down`

コンテナを`stop`して削除する。一度リセットしてやり直したい場合などに実行する。

```bash
# docker-compose downを実行

$ docker-compose down

	>
	Stopping product-register-web-1 ... done
	Stopping product-register-db-1  ... done
	Removing product-register-web-1 ... done
	Removing product-register-db-1  ... done
	Removing network product-register_default
```

# 最後に

いかがでしたでしょうか。
今回はdocker-composeコマンドについてまとめてみました。
ここ違うよ！でしたり、こうした方がいいよ！などがあればコメントいただけると幸いです。

他にも下記のような記事を投稿しております。
興味がありましたら、ぜひご覧ください。

https://qiita.com/sekkey_777/items/729dada2998d3914e138

https://qiita.com/sekkey_777/items/6e045416f7479bd328a4

https://qiita.com/sekkey_777/items/8a8b3ee2af3c46df50f0
paiza 練習問題 スタック・キューメニュー 2 つのキュー C++編

備忘録
https://paiza.jp/works/mondai/stack_queue/stack_queue__practice_step1/edit?language_uid=c-plus-plus&t=a9b6ded5188080055103377217e6eb8e
より問題文引用
ログイン必須
詳しい説明はリンク先参照
Q 個のクエリが与えられます。 2 つのキューを用意したあと、 Q 個のクエリを順に処理してください。各クエリは、以下の 5 つのいずれかです。

・ PUSH 1 X: 1 つ目のキューに数値 X を追加
・ PUSH 2 X: 2 つ目のキューに数値 X を追加
・ POP 1: 1 つ目のキューの先頭の要素を削除し、その値を出力
・ POP 2: 2 つ目のキューの先頭の要素を削除し、その値を出力
・ SIZE: 1 つ目のキュー、 2 つ目のキューに含まれる要素数をそれぞれ出力
```cpp:double_q.cpp
#include <iostream>
#include<vector>
using namespace std;
int main(void){
 std::vector<int> a[2];
 int q;std::cin >> q;
 for (int i = 0; i < q; i++) {
     
     int o;cin>>o;
     if(o==1)//push
     {
         
         int k,x;cin>>k>>x;
         k--;
         a[k].push_back(x);
     }
     else if(o==2)//pop
     {
         int k;cin>>k;k--;
         cout<<a[k][0]<<endl;
         reverse(a[k].begin(),a[k].end());
         a[k].pop_back();//順番を逆にした配列の末尾を消し元に戻すと先頭が削除されたことになる
         reverse(a[k].begin(),a[k].end());
         
     }else//サイズ表示
     {
         cout<<a[0].size()<<" "<<a[1].size()<<endl;
         
     }
     
     /* code */
 }
}
```

模範解答
ログインしなければ見れないみたいです
https://paiza.jp/works/mondai/reviews/show/9d60e9910b711c51ecc57f6148aef54a
queue ライブラリというものがあったらしい
Xcodeのダウンロード方法についてまとめ

# Xcodeのダウンロード方法
Xcodeのダウンロード方法は主に下記の3種類があります。
- [App Store](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)
- [Appleの開発者向けサイト](https://developer.apple.com/download/all/)
- [Xcodes](https://github.com/RobotsAndPencils/xcodes)

# 結論
本記事執筆時の2023/2/18時点では、[**Xcodes**](https://github.com/RobotsAndPencils/xcodes) を利用するのが最もおすすめです。
ご自身で判断する際の基準として下記に各方法のメリット・デメリットの一例を記載します。

# App Store
https://apps.apple.com/jp/app/xcode/id497799835?mt=12
- メリット
    - 標準的なダウンロード方法のため、ネット上の対応記事をそのまま適用しやすい。
- デメリット
    - ダウンロードに時間がかかる上、失敗するケースが多い。
    - 最新版のXcodeしかダウンロードできないため、合わせてMacOSのアップデートが必要になる場合がある。

Xcodeは各バージョンごとに対応するMacOSのバージョンでないと利用できません。
したがって、特にOSの新バージョンがリリースされたばかりのタイミングで最新のXcodeに合わせてOSもアップデートすると [**思わぬ不具合に遭遇する**](https://itips.krsw.biz/macos-ventura-issue-list-summary/) ことも多いです。
そのため、最新OSリリース後は ~~人柱待ち~~ 様子見の期間を設ける方も多いと思います。
そういった状況では最新版しかインストールできないこの方法では対応が厳しくなります。

# Appleの開発者向けページ
https://developer.apple.com/download/all/

- メリット
    - XcodeやXcode以外のツール(Command Line Tools等)、それらの特定バージョンのみをダウンロードすることができる。
    - 公式が提供する手段のため基本的にはセキュリティやサービス閉鎖等を心配する必要がない。
    - 複数のバージョンのXcodeをダウンロードできる。
    - App Store経由より早く確実にダウンロードできる。
- デメリット
    - 複数バージョンを入れた場合の手動管理が面倒。

バージョンを指定してダウンロードできるため、自身のOSバージョンが対応しているものを選択すればOSのアップデートが不要になります。
また、公式が提供するダウンロード手段のため、別バージョンをダウンロードする方法としては最も確実な方法です。

# Xcodes
https://github.com/RobotsAndPencils/xcodes

- メリット
    - Xcodeの特定のバージョンのみダウンロードすることができる。
    - App Store経由より早く確実にダウンロードできる。
    - 複数のバージョンのXcodeをダウンロードでき、ダウンロード・アプリの起動をGUIで管理できる。
- デメリット
    - OSSとして開発されているため将来的にメンテされなくなる可能性がある。
    - サードパーティが提供するツールのため、企業のセキュリティ体制によっては利用申請が必要になる。

Xcodeのダウンロードとバージョンごとの管理を便利に行えるツールです。
懸念点としてはOSSのためメンテされなくなる可能性がある(公式だからメンテされ続けるというわけではないですが...)というのと、所属企業の体制によってはサードパーティ提供のツールのため利用に申請が必要になるということがあります。
ただ、記事執筆時の2023/2/18時点ではかなり頻繁にメンテしてくださっているのと、iOSエンジニアには比較的広く利用されているツールということもあって現状心配ない認識です。
[**メンテナーに感謝しつつ**](https://japan.zdnet.com/article/35172275/) 利用し、不具合を見つけたらissueを立てて報告しましょう。

![Xcodes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/406531/2d677816-84bb-bf0d-d560-b0b008ced95d.png)

# 終わりに
以上、Xcodeのダウンロード方法についてまとめました。
自分はこの方法を利用しているよ！！とか、こういったデメリットもあるよね〜という話があればぜひコメント欄までお願いいたします。

# 参考まとめ
- [Xcode - App Store](https://apps.apple.com/jp/app/xcode/id497799835?mt=12)
- [More Downloads - Apple Developer](https://developer.apple.com/download/all)
- [RobotsAndPencils/xcodes - GitHub](https://github.com/RobotsAndPencils/xcodes)
- [オープンソースのメンテナー、多くは十分な対価を得られず--ストレスも - ZDNET](https://japan.zdnet.com/article/35172275/)
- [macOS Ventura（ベンチュラ）のバグ・不具合まとめ - ITips](https://itips.krsw.biz/macos-ventura-issue-list-summary/)

---

# 2023/2/24 追記
Xcodes や fastlane 等サードパーティ製のツール経由で2ファクタ認証を使用しようとすると、Apple IDが誤BANされる不具合が出ているようです。
こちらの対応が終わるまでは開発者向けページからのDLで対応しましょう。

https://github.com/fastlane/fastlane/issues/21071

# 2023/3/31 追記
2023/3/3時点で解決されていました。
解説は下記記事でして頂いているので省略。
サードパーティ製のツールや特定の接続方法を用いている場合には、こういったリスクもあるということは考慮しておきましょう。
参考: [fastlaneでApple IDがロックされた事件はなぜ起きたのか - zenn](https://zenn.dev/noppe/articles/bebaee0b845940)
【React】OpenStreetMapのベクトルタイルを表示する

## はじめに
[deck.gl×React×TypeScript 環境構築](https://qiita.com/asahina820/items/6ead76abf4fc7f187dfc)の続きです。
react-map-gl を使ってOpenStreetMapのベクトルタイルを表示してみます。

## react-map-glとは
react-map-glは、Mapbox GL JS対応ライブラリのためのReactコンポーネント群です。
Mapbox GL JSのオープンソースフォーク版のMapLibre GL JSにも対応しています。

https://visgl.github.io/react-map-gl/docs


## 手順
### インストール
react-map-gl と、maplibre-gl をインストールします。

```powershell
npm install --save react-map-gl maplibre-gl
```

### 地図表示
[Using with a mapbox-gl Fork](https://visgl.github.io/react-map-gl/docs/get-started/get-started#using-with-a-mapbox-gl-fork) を参考に実装します。

```jsx:App.tsx
import Map from 'react-map-gl';
import maplibregl from 'maplibre-gl';
import 'maplibre-gl/dist/maplibre-gl.css';
import './style.css';

const App = () => {
    return (
        <div className="App">
            <Map
                initialViewState={{
                    longitude: 139.68786,
                    latitude: 35.68355,
                    zoom: 16,
                }}
                mapLib={maplibregl}
                style={{ width: '100vw', height: '100vh' }}
                mapStyle="https://tile.openstreetmap.jp/styles/osm-bright-ja/style.json"
            />
        </div>
    );
};

export default App;
```

initialViewStateで地図の初期表示を設定します。
styleで地図の大きさを設定できます。~~単位が指定できないのが残念...~~ 'で囲むことで指定できました。
mapStyleでOpenStreetMapのベクトルタイルのスタイルを指定しています。

```style.css
html,
body {
    margin: 0px;
    padding: 0px;
}
.App {
    width: 100%;
    height: 100%;
}
```

### 動作確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2667439/65f24b48-5401-d641-ca3a-fc28e9110ea1.png)

OpenStreetMapのベクトルタイルを表示できました！
自由に地図を移動したり、ズームイン・ズームアウトも可能です。

## 参考文献
https://visgl.github.io/react-map-gl/docs/get-started/get-started

https://github.com/visgl/react-map-gl/tree/7.0-release/examples/get-started

https://gunmagisgeek.com/slide/learn-deckgl/deck.gl/#/

https://qiita.com/Nekoya3/items/bf45743a1453238c363d
GCP 認定資格向けのメモ

Associate　Cloud　Engineerにて、プロジェクト、サービスアカウント、請求に関する知識点

１、継承されたポリシーは上書きできない。

２、基本的な役割は「オーナー」、「編集者」、「閲覧者」であること。
   可能であれば、基本役割ではなく、事前定義された役割を使うのはベスト　プラクティスである
　　ユーザに権限を付与する場合、最小権限原則はベストプラクティスである。

３、サービスアカウントについて、
　　・アプリケーションまたはVMを動作させる場合、個々のユーザに権限付与ではなく、サービスアカウント
　　経由で実行するのは便利です
　　・サービスアカウントはＩＤとして扱われる場面とリソースとして扱われる場面があります。
　　・サービスアカウントで使用される認証メカニズムは「暗号鍵」である
DataSpiderSDKによるHyperledger Fabric接続アダプタの実装

[前回は、Hyperledger Fabricのテストネットを構築](https://qiita.com/dataspider-fan/items/df1406c9f527073ba750)しました。
今回は、DataSpiderSDKによるHyperledger Fabric接続アダプタの実装例の紹介です。

## 実装環境
前回と同様の環境を使用します。
[DataSpiderSDKの環境構築はこちら](https://qiita.com/dataspider-fan/items/64440c41ab458e01497c)を参照。

## テストネットの概要
Hyperledger Fabric接続アダプタの実装にあたり、どのような構成でHyperledger Fabricネットワークに接続を行うか、また、スマートコントラクの実行時にどのような情報が必要か踏まえ、設定項目を設けます。
まずは、テストネットの構成について概要を紹介します。

前回投稿した内容で実行したコマンドによりDocker環境と共に、以下のイメージに近い環境が構築されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/b560c141-c0cc-ff0a-4293-e7df0f403b16.png)
※ 上記内容はhttps://hyperledger-fabric.readthedocs.io/ja/latest/network/network.html から抜粋

前回コマンドを実行し各サービスを起動しましたが、紐づけは以下となります。
* A1　: DataSpiderに該当します。今後DataSpiderを用いて台帳にアセスします。
* L1　：台帳
* P1、P2　：ペアノード
* S5　：スマートコントラクト。ここはbasicというチェーンコード名でデプロイを行いました。
* C1　：mychannelとしてサービスを起動しました。
* O4　：ordererとしてサービスを起動しました。
* CA1　：認証関連を制御します。前回のコマンドにより、ユーザの公開鍵および秘密鍵が生成されています。

## 接続アダプタに必要な項目
上記内容を踏まえ、Hyperledger Fabricネットワークに接続するために必要となる情報をHyperledger Fabric接続アダプタの設定項目に設けます。
なお、チェーンコード実行に必要となるその他の情報は、Hyperledger Fabricチェーンコードアダプタ（ ※ 別途作成 ）に含めます。

## Hyperledger Fabric接続アダプタの設定項目
以下に、Hyperledger Fabric接続アダプタの実装例を示します。
### コードの構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/8d516af8-51c5-c2d3-7038-11b20f54fc70.png)

### 設定一覧画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/ca0b0130-1ec5-cec4-631a-5bd0516c5b3d.png)

### Hyperledger Fabric接続アダプタの設定画面
テストネットで構築した内容からの入力例と設定項目を以下に記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2849535/07e5a453-d9fa-d30e-b4c0-8be1dc60e45d.png)

## 次回は
チェーンコードの参照系および更新系の実装をするにあたり、[jarライブラリの紹介](https://qiita.com/dataspider-fan/items/97cc486ee780d6d7c0da)をしたいと思います。
JupyterNotebookでSparkSQLの実行結果をDataFrame形式で出力

# DataFrame形式で出力されない？

JupyterNotebookからSparkSQLを実行する際に、panadasで出力した結果のようなDataFrame形式で出力されない場合がある。
以下のコードをJupyterNotebook上から実行しておくことで、DataFrame形式で出力できる。

```
from pyspark.sql import SparkSession
spark = SparkSession.builder.getOrCreate()
spark.conf.set('spark.sql.repl.eagerEval.enabled', True) # jupyter上で、dataframe形式を出力する
spark.conf.set('spark.sql.repl.eagerEval.truncate', 1000) # 文字数の設定をする
```
【Pandas】これだけ覚えたいPython Pandas DataFrame操作

# はじめに
DataFrameがむずすぎるので取り合えず最低限これだけあればそこそこ操作はできるようになるんじゃないかな？レベルのものをまとめます。(あまりにも自分用ですが、、、)

:::note info
結論
* インポート
`df = pd.read_csv(filepath, index_col=0)`

* 要素の取得/操作
`df.loc["indexname i":"indexname j", "colname k":"colname l"]`
`df.iloc[i:j, k:l]`

* 要素の条件抽出
`df_condition = df.loc[:, "a"] > 1`
`df = df[df_condition]`

* index,column名の取得/操作
`df.index` `df.columns`

* index追加
`df = pd.concat([df, df_add])`

* column追加
`df["newcol"] = listlike`

* index,columnの削除
`df = df.drop(index=["index_name"], columns=["col_name"])`

* NumPy変換
`df.to_numpy(dtype="float")`

* エクスポート
`df.to_csv(filepath)`
`df.to_clipboard()`
:::

とりあえずPandasをimportします。
```python
import pandas as pd
```

# データを取り込む
なにはともあれまずはDataFrameを用意します。
普段は```df = pd.read_csv(filepath,index_col = 0)```でデータを読むことが多いです。

2次元のリストを用意し```pd.DataFrame()```でDataFrame化。```list```は```np.ndarray```でもOK
index名（行）をu,v,w、column名（列）をa,b,cとしています。
```python
list = [[1,2,3],
        [4,5,6],
        [7,8,9]]
df = pd.DataFrame(list,
                  index=["u","v","w"],
                  columns=["a","b","c"])
print(df)
#    a  b  c
# u  1  2  3
# v  4  5  6
# w  7  8  9
```



# 要素の扱い
```df.loc[]```または```df.iloc[]```を使用する。
index名, column名で指定するか、index番号, column番号で指定するかの違い。

||i行 j列|i～j行・k～l列|すべて|
|:--|:-:|:-:|:-:|
|書き方|```[i, j]```|```[i:j, k:l]```|```[:, :]```|

```python
print(df.loc["u", "a":"b"])
# a    1
# b    2
# Name: u, dtype: int64

print(df.iloc[:, 0:2])
#    a  b
# u  1  2
# v  4  5
# w  7  8
```
```loc[]```は```i:j```と書くとi以上jまでの要素が取り出されるが、```iloc[]```の場合はi以上j"未満"の要素が取り出される。


# 要素の条件抽出
```python
df_condition = df.loc[:, "a"] > 1
df = df[df_condition]
print(df)
#    a  b  c
# v  4  5  6
# w  7  8  9
```

# index名,column名の扱い
```df.index```や```df.columns```を使用、listライクなのものを代入すれば名前の変更が可能。
```python
print(df.index)
# Index(['u', 'v', 'w'], dtype='object')

print(df.columns)
# Index(['a', 'b', 'c'], dtype='object')

df.columns = ["x", "y", "z"]
print(df)
#    x  y  z
# u  1  2  3
# v  4  5  6
# w  7  8  9
```


# indexやcolumnを新たに追加する
index側の追加はDataFrame同士を```pd.concat([df1, df2, ...])```でつなげる。
```python
# 追加するDataFrameを定義
add_list = [[100, 200, 300]]
df_add = pd.DataFrame(add_list,
                      index=["t"],
                      columns=["a", "b", "c"])
print(df_add)
#      a    b    c
# t  100  200  300

df = pd.concat([df, df_add])
print(df)
#      a    b    c
# u    1    2    3
# v    4    5    6
# w    7    8    9
# t  100  200  300
```

column側の追加は存在しないcolumn名を指定しlistライクなものを代入すればOK
存在していた場合は上書きされます。
```python
df["t"] = [100, 200, 300]
print(df)
#    a  b  c    t
# u  1  2  3  100
# v  4  5  6  200
# w  7  8  9  300
```
# 特定のindex,columnを削除
```df = df.drop(index=[], columns=[])```をつかう。strのリストを突っ込む。
```python
print(df.drop(index=["u"], columns=["a", "b"]))
#    c
# v  6
# w  9
```

# NumPy.ndarrayへの変換
```df.to_numpy()```を使用する。NumPy.ndarrayは後から型を変えられないので```dtype```を指定しておくほうがいいと思う。
```python
arr = df.to_numpy(dtype="float")
print(arr)
# [[1. 2. 3.]
#  [4. 5. 6.]
#  [7. 8. 9.]]
```
# データの出力
```df.to_csv()```とか```df.to_clipboard()```をよく使う。

# 最後に
とりあえずこれができればちゃんとしたデータの操作や整形できると思います。
ちゃんとしてないデータの場合はGoogle先生に教わりながらやりましょう。
初めまして、技術力が欲しいSIer27歳です。

初めまして！！

某企業でSIerしてます。27歳院卒の男です。笑笑

技術力付けたいけどSIerって技術力つかんやんってことにやっと気づいた社会人3年目。
幸い知識は増えたし、これからもどんどんいろんなこと入ってくるやろうから
提案したけど没になったやつとか、おもしろそーってなったやつを自ら検証＆勉強してみて
ここにまとめていこうかと思います。笑笑

自分の勉強が誰かの役に立てばいいなと、
ゆったり頑張ります。
続かなくてもたたかないでね。
CSVファイルをインポートしてSQLite3のデータベースを無から作るシェルスクリプト

## SQLite3でのCSVインポート方法概要
SQLite3でのDB作成コマンド
```
$ sqlite3 database_name.db
SQLite version 3.39.5 2022-10-14 20:58:05
Enter ".help" for usage hints.
sqlite>
```
以下を流すと開いた際の引数のファイル名でDBが作成される
```
sqlite> .database
```
CSVインポートは以下
```
sqlite> .mode csv
sqlite> .import path/to/file.csv table_name
```

## スクリプト
複数のCSVファイルからテーブルを一気に作りたかったので以下を作成した。

```create_sqlite3_with_csv.sh
#!/bin/sh

if [ -p /dev/stdin ]; then
  FILES=`cat -`
else
  FILES=`echo $@`
fi
# echo ${FILES}

DB_NAME="file.db"
#`sqlite3 ${DB_NAME} ".database"`

FILE_COUNT=`echo $FILES | tr ' ' '\n' | wc -l`
for i in `seq $FILE_COUNT`
do
  FILE_PATH=`echo $FILES | cut -d ' ' -f $i`
  FILE=${FILE_PATH##*/}
  NAME=${FILE%.*}
  #echo $FILE_PATH
  #echo $NAME
  `sqlite3 ${DB_NAME} ".mode csv" ".import ${FILE_PATH} ${NAME}"`
done
```

シンボリックリンクを作る
```
$ ln -s create_sqlite3_with_csv.sh /usr/local/bin/create_sqlite3_with_csv
```

### 使い方
```
$ create_sqlite3_with_csv path/to/*.csv
```
で、path/to フォルダにあるCSVファイルを元に、
コマンドを流した直下に file.db というファイル名のSQLite3のDBが作成する。
Salesforce認定アソシエイト試験の公式練習問題解説してみた-05

こんにちは

Salesforce認定アソシエイト試験の公式練習問題があるのはご存じでしょうか。
Trailheadにフラッシュカードとして何度も解ける練習問題がございます。

今回は
認定資格試験の準備: Salesforce 認定アソシエイト＞
ナビゲーションについて知識を深める

の問題1問目を解説します

今回の内容は動画でも解説しています

https://www.youtube.com/watch?v=mBP-p7VvObM


<iframe width="560" height="315" src="https://www.youtube.com/embed/mBP-p7VvObM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>



https://trailhead.salesforce.com/ja/content/learn/modules/cert-prep-salesforce-certified-associate/explore-navigation

本日の問題はこちらです

![レポート01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/57829de3-f568-b3c0-dce1-99195c449a2f.png)

正解はＣです
お気に入りに追加すれば右上の「お気に入り」からレポートへたどることが可能です
![お気に入り.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/7a1d5ce8-95ce-0084-c078-1ec511a45cb7.png)


## 他の認定アソシエイトの勉強方法について

他の勉強方法についてはこちらをご確認ください

https://qiita.com/Takaa/items/d35c9955fe8eb889d76b
【ROS】sdfで配置を変更する方法

# 目的
Gazebo内でカメラを使いたいと思い、sdfファイルからSensorPluginを使ってカメラを使用。
ロボットの任意の位置に配置し、ステレオ形式にしようかと思ったが一癖あったので、わかったことを書きます。

# 配置の仕方
```<link>```タグの中の```<pose>```タグでx,y,z,roll,pich,yawを指定することで任意の位置に配置することができます。
以下にプログラムをのせておきます。
```
<link name="left_head_camera_frame">
  <pose>0.032 0.1 0.3 0 0 0</pose>
  <inertia>
    <ixx>0.001</ixx>
    <ixy>0.000</ixy>
    <ixz>0.000</ixz>
    <iyy>0.001</iyy>
    <iyz>0.000</iyz>
    <izz>0.001</izz>
  </inertia>
  <sensor type="camera" name="left_head_camera">
    .
    .
    .
  </sensor>
</link>
```
```<sensor>```タグの中は[こちら【1】](https://classic.gazebosim.org/tutorials?tut=ros_gzplugins)を参照ください。

# わかったこと
自分は物の配置は```<joint>```タグで可能だと思っていた。
しかし、<b>```<joint>```タグはあくまでもTF構造を定義するのみであり、シミュレーター内の物理的な物の配置、姿勢を定義できない。</b>
## ```<joint>```タグの役割
TF構造を定義するを定義するために```<joint>```タグを用いる。具体的には以下のタグを用いて定義する。
- ```<parent>```
親リンク(親座標系)の名前を記入
- ```<child>```
子リンク(子座標系)の名前を記入
- ```<pose>```
親リンクにおける子リンク原点の位置
- ```<axis>```
```<xyz>```タグでroll pich yawを指定

以下にプログラムをのせておきます。
```
<joint name="left_head_camera_joint" type="fixed">
    <parent>base_link</parent>
    <child>left_head_camera_frame</child>
    <pose>0.032 0.1 0.3 0 0 0</pose>
    <axis>
      <xyz>0 0 1</xyz>
    </axis>
</joint>
```


# 参照URL
【1】https://classic.gazebosim.org/tutorials?tut=ros_gzplugins
WSL2でDocker Desktopがフリーズした時の対処メモ

# はじめに
色々あってDocker Desktopを削除して，再インストールした．
が，再インストール後に起動中の画面でエラーやフリーズが発生した．

# 環境
- Windows11
- WSL2
    - Ubuntu22.04 (既定)
- Docker Desktop 4.16.3.0

# 結論
- Docker Desktop 4.16.3.0で発生
- ダウングレード (4.15.0.0) で解消
- ただし，ダウングレード前に`AppData\Local\Docker`を削除しないとフリーズする

# 試行錯誤１回目
1. Docker Desktop (バージョン不明，メモしてなかった...)をアンインストール
1. Docker Desktop 4.16.3.0をインストール
1. Docker Desktopの起動時にエラー

# 試行錯誤２回目
1. Docker Desktop (4.16.0.3)をアンインストール
1. Docker Desktop (4.15.0.0)をインストール
1. Docker Desktopの起動時にフリーズ

# 試行錯誤N回目
1. Docker Desktop (4.15.0.0)をアンインストール
1. `AppData\Local\Docker`を削除
1. Docker Desktop (4.15.0.0)をインストール
1. Docker Desktopの起動に成功

# 追加で検証
1. Docker Desktop (4.15.0.0)をアンインストール
1. `AppData\Local\Docker`を削除
1. Docker Desktop (4.16.0.3)をインストール
1. Docker Desktopの起動時にエラー

# 最後に
もうちょっと原因を探りたかったが，WSLgとかDocker周りの背景知識が無いのでこれが限界
Markdown リストで “and more” したい

# Markdown リストで “and more” したい

Markdown で箇条書きリストを利用しているとき、“and more” としておきたい場合がある。このとき、“and more” はリスト項目の 1 つではないため、次のような書き方は避けたい。

```markdown
- リンゴ
- オレンジ
- バナナ
- ...and more!
```

- リンゴ
- オレンジ
- バナナ
- ...and more!

本記事では、Markdown リストで “and more” がリストの一部でありながら、リスト項目の 1 つではないような見た目となる書き方を模索したい。

## ■ 目標

Markdown リストを用いて、“and more” がリストの一部でありながら、リスト項目の 1 つではないような見た目にしたい。

したがって、次のようなもの。[^html-andmore]

[^html-andmore]: 実は、HTML を使って次のように表現している。

    ```html
    <ul>
        <li> リンゴ </li>
        <li> オレンジ </li>
        <li> バナナ </li>
        ...and more!
    </ul>
    ```

    “and more” が `<li>` に含まれていないものの、`<ul>` には含まれている。このような書き方は Markdown で再現できない。（※ この書き方が HTML 的に不正な書き方であるかは不明）

<ul>
    <li> リンゴ </li>
    <li> オレンジ </li>
    <li> バナナ </li>
    ...and more!
</ul>

ここでは、“and more” が、リスト項目（“リンゴ”、“オレンジ”、“バナナ”）の一部ではないものの、リストの一部であることを表現できている。このようなものを Markdown で表現したい。

## ■ いろいろ試してみる

3 つのパターンを検討することが出来た。

### ▽ パラグラフとして挿入する

最後のリスト項目内にパラグラフとして “and more” を挿入する。

```markdown
- リンゴ
- オレンジ
- バナナ

    ...and more!
```

- リンゴ
- オレンジ
- バナナ

    ...and more!

この方法では、確かに “and more” がリスト内に含まれていて、リスト項目にはならずに表現されているが、リスト全体がルーズになってしまっている。

### ▽ 改行する

最後のリスト項目内で改行して “and more” を挿入する。改行にはさまざまな方法があるが、今回は明示的に `<br>` タグを使用する。

```markdown
- リンゴ
- オレンジ
- バナナ <br> ...and more!
```

- リンゴ
- オレンジ
- バナナ <br> ...and more!

意外と上手く表現されているのではないだろうか。

Qiita では、ソース内の改行が `<br>` として見なされるので、次のような書き方でも良い。

```markdown
- リンゴ
- オレンジ
- バナナ
    ...and more!
```

- リンゴ
- オレンジ
- バナナ
    ...and more!

これであれば、リスト項目の順序を入れ替えても問題ない。

懸念点として、この Markdown のパース結果が以下のようになっていることが挙げられる。意味論としては、リスト項目内に “and more” が含まれてしまっている。

```html
<ul>
    <li> リンゴ </li>
    <li> オレンジ </li>
    <li> バナナ <br> ...and more! </li>
</ul>
```

そこまで気にする人はいないか……

### ▽ 別のリストとして挿入する

主となるリストに続けて、別のリストの形で “and more” を挿入する。

```markdown
- リンゴ
- オレンジ
- バナナ
+ ...and more!
```

- リンゴ
- オレンジ
- バナナ
+ ...and more!

この方法では、“and more” がリストの外に配置されてしまっているため、次のようにしてリスト内に含めてみる。

```markdown
- リンゴ
- オレンジ
- バナナ
- + ...and more!
```

- リンゴ
- オレンジ
- バナナ
- + ...and more!

これも上手く表現されているのではないだろうか。やはり、意味論としては奇妙なものにはなっているものの、目標に掲げた内容とは合致している。

HTML では、次のようにパースされている。

```html
<ul>
    <li> リンゴ </li>
    <li> オレンジ </li>
    <li> バナナ </li>
    <li>
        <ul>
            <li> ...and more! </li>
        </ul>
    </li>
</ul>
```

# 余談

「そもそも、“and more” がリスト項目内に含まれていても、項目の一部だと思って読む人はいない」って？確かに……。
PulpでのFiberSCIPの使用(Windows)

# 背景
SCIPがv8.0.3からApache2.0となり、無償での商用利用が可能になったみたいですね。
(参考 https://qiita.com/samuelladoco/items/703bf78ea66e8369c455)
色々調べてみると並列化（FiberSCIP 略称FSCIPと呼ばれているようです。）が
可能なようなのでメモ程度に使用方法を記載しておきます。
(基本的なPulpの使用方法などは、他の文献を参照ください）
# 環境
 ・python 3.8.16
 ・pulp 2.7.0
 ・SCIP 8.0.3

# 使用方法
### 1. [SCIP Optimization Suite](https://scipopt.org/index.php#download)から、v8.0.3をダウンロードする。
適度な場所(以下Aとします。）においてください。
### 2. [Github](https://github.com/coin-or/pulp)を参考に、Pulpをインストールする。
```
pip install -U git+https://github.com/coin-or/pulp
```
:::note warn
Condaや通常のPipによるインストールだと、下記(4.)で使用するFSCIP_CMDが用意されていないようです。
:::
### 3. コードの一部修正
starts_withをstartswithに置換
```diff_python:/pulp/apis/scip_api.py
-            if option.starts_with("-"):
+            if option.startswith("-"):            
```
:::note warn
修正しない場合、FSCIP_CMDで使用するoptionsを指定する際、エラーが発生します。
（修正依頼のやり方がいまいち分からず…）
:::
### 4. Solverにpulp.FSCIP_CMDを使用します。
引数のpathにはA/bin/fscip.exeを指定してください。

```python:例
    solver=pulp.FSCIP_CMD(path=r"(A)\SCIPOptSuite 8.0.3\bin\fscip.exe",
                        options=["TimeLimit=300"])
```
:::note warn
FSCIP_CMDの引数として、timeLimitが存在しますが、どうやらうまく作動しないようです。（2023/2/18現在)
よって、optionsにて直接渡しています。（そのために3.にて修正しました）
:::

# まとめ
PulpでのFiberSCIPの使用(Windows)方法をお伝えしました。
Docker：Dockerfileの意味と注意点

# Dockerfileとは

Dockerイメージを作成するための指示書のようなもの。設定ファイル。


# Dockerfileの注意点

デフォルトでDockerfileという名前のファイルがイメージのビルドに使用される。
もちろん別名のDockerfileを使用することはできるが。
Dockerでビルドを行った場合、Dockerfileに定義された内容を上から順に処理。
最終的な状態の環境がDockerイメージとして保存される。

なんでも初物の時には、勝手になされることで困ることがままあるので注意。
ChatGPTにSpresense用のLチカプログラムを書いてもらった(1回目)ChatGPTは自己の間違いも修正してくれました

ChatGPTでSpresense Main Board 上のLEDを使ったLチカプログラムを書いてもらいました。
プログラムは次の4つです。

**1. LED0単体の点滅**
**2. LED0とLED1を交互に点滅**
**3. LED0→LED1→LED2→LED3を順次点灯して、LED3→LED2→LED1→LED0を順次消灯**
**4. LED0～LED3をランダムに点灯**

簡単なプログラムですが 4. に関しては最初間違ったコードを吐き出しました。
間違いを指摘して、ChatGPTが自己修正する過程も確認出来ます。

以下、主にChatGPTのキャプチャー画像を貼り付けます。

**1. LED0単体の点滅**
![Spresense_ChatGPT_001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/c6e14a42-a44e-9d37-6c4f-a11c583d20c0.png)

**2. LED0とLED1を交互に点滅**
![Spresense_ChatGPT_003.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/b001440e-dcfe-b8c1-f79a-6911b43a9dd6.png)

**3. LED0→LED1→LED2→LED3を順次点灯して、LED3→LED2→LED1→LED0を順次消灯**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/1a8a5c07-4ceb-5564-adfc-5dfb86933d3d.png)

**4. LED0～LED3をランダムに点灯**
![Spresense_ChatGPT_004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/fd8ad87b-9ddb-b5c2-460f-a82aad1278e9.png)

**ここでエラー発生**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/6e629d18-e855-67f4-c626-beac8eb5bc52.png)
int ledIndex = random(LED0, LED4);  // LED0からLED3のどれかをランダムに選択
この行がエラーとなっています。
**random()のリファレンス**です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/862dacbd-4264-7cfb-d089-5c0afcf55a92.png)

minからmax-1の間の整数 (long)
となっているので LED0 ～ LED3 までなので正しそうですが、**LED4** に落とし穴が
LED0 ～ LED3 は定義されていますが LED4はそもそも無いので当然定義もありません。

それでChatGPTに教えてあげました。
![Spresense_ChatGPT_004_1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/c7e2420f-327c-79be-c522-9eb446994c7b.png)

でもやっぱり**LED4**を使っています。
それで再度指摘してあげました。
![Spresense_ChatGPT_004_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/99249/bcef3c45-3274-100d-9c6c-3b4ea5604867.png)

**LED4 を LED+1** に書き直してくれました。
これで意図したプログラムとなりました。

当然ですが ChatGPT も間違います。

プログラムの学習としては間違えてくれた方が良いかもしりません、
自分で修正することでより勉強になります。

次回も題材を決めて **ChatGPT** にプログラムを書いてもらいます。
【Swift】macOSでFirebaseを使うときのAppDelegateの書き方

# はじめに
現在、macOSアプリを開発していてFirebaseを導入しようとしたのですが、macOS用のドキュメントがなかったので困りました。
解決した時の方法を記録しておきます。

# やりかた
```swift
import Firebase
import FirebaseCore

class AppDelegate: NSObject, NSApplicationDelegate {
    func applicationDidFinishLaunching(_ notification: Notification) {
        FirebaseApp.configure()
    }
}
```
# おわり
macアプリ開発は情報が少ないのでかなり苦戦します


# 参考記事
https://stackoverflow.com/questions/74415695/how-to-make-firebase-compatible-with-a-macos-app
Docker：whalesayイメージ、かわいい

# whalesayイメージ

チュートリアル用のイメージで、Docker社が作成した、クジラのアスキーアートに好きな言葉を喋らせることができる。かわいい。


# 実行コマンド

```
docker run docker/whalesay cowsay Hello!
```
もちろん、「Hello!」の部分を自由にできる。


```
 ________
< Hello! >
 --------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/
```

ただ、このイメージだけでも約250MB、MySQLだけでも約170MBのデータ量になっており、開発ではイメージの継承を使いこなさないと無駄な容量増加になるので気を付けねばならないだろう。
http: superfluous response.WriteHeader call from~エラー

Golangでの開発中、サーバを立ち上げて機能を確認しようとgo runしたところ
http: superfluous response.WriteHeader call from～　エラーが。
あまり参考にできるサイトが少なく、chatGPTに聞いてみたら
>このエラーは、HTTPレスポンスの WriteHeader メソッドが複数回呼び出されたことを示しています。HTTPレスポンスでは、WriteHeaderメソッドはレスポンスヘッダーを一度だけ設定する必要がありますが、このエラーが発生すると、同じレスポンスヘッダーが複数回設定されることになります。
>
エラー箇所を見ると

```
...
case http.MethodPost:
...
}
http.Redirect(w, r, "/", 302)
}
```
http.Redirect(w, r, "/", 302)がswitchのネストに入っていなかった。。。

ちゃんとネストに含めると動きました。
Laravelインストール時に「Could not delete...」エラーが起きた場合

![prtsc_20230218170836.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2696871/25d40c29-fbe5-29d9-6908-ffad71069275.png)

`
Could not delete /var/www/html/vendor/composer/f1a0364f/laravel-framework-0bd3038/src/Illuminate/Http:
`

こんな感じのエラー文とともに途中でインストールが止まってしまったら，composerのタイムアウトが起因しているかもしれません (　´ﾟдﾟ｀　)

[composer タイムアウト] でネット検索すると，タイムアウトの時間を延ばす設定方法を解説したサイトがたくさんヒットしますので，そちらの解説を元にインストールの再実行をお試しください (　´ﾟдﾟ｀　)
GGJ2023で作った足音反響システム

GGJグローバルゲームジャム
という全世界で同じテーマでゲームを作るイベント

こういうゲームを作りたい人が集まってたった３日間でゲームを作るというイベントはなかなか心地よい。
夜遅くまであーだこーだやって作るのってなんか文化祭前とかみたいなノリ。

で、
個人テーマとしてはサウンドで何か珍しいものを入れたいという欲求もあって、
今回は、迷宮をさまようホラーゲームっぽいものだったので、足音に力を入れてみた。

## 足音って何か？
足音って、なかなか音として難しい。
足音って、ほとんど聞こえない。
足音って、おおげさに演出することも多々ある。
足音って、鳴っていなくても違和感ないことが多い。
足音って、床の素材変化とか取り込まれていたりとかすることもある。

ここで、足音についていろいろ考えてみると、
印象的なシーンとか、足音めっちゃ響かせたりするような演出があったりする。

例えば、向こうからキャラクターが近づいてくるときとか。
それが、異形だったり、心を動かす対象だったり、
例：ゴジラが遠くから近づいてくる
例：エヴァの綾波レイがこちらに近づいてくる

あと、単純にアクションのテンポ感、キャラがどれくらいの歩幅で、どれくらいの重量で、どれくらいの動きで動いているかとか。

足音をこだわりだすと、フォーリーとかも考える。
でも、フォーリーとリアルタイムはなかなか相性が悪い。（最悪あらゆるシーン、モーション分用意するとかになるととても量が増えてしまう）

ゲームはリアルタイムが多い。
そんなに時間かけられないけど、良い感じの足音にしたい。

プログラムでなんとかできないか？
という課題を科してみた。

## 足音反響システムとは？
足音って、響きの変化が大事な気がする。
足の当たった時の素材感とか空間感とかって、実際どの方向にどのような素材の壁が、どれくらいの距離で存在しているのか？
という情報がすべて含まれる。

足音を様々な素材で用意しようとしても、床の素材、床の密度、床の剛体としての大きさ、床の厚み、などさまざまな音の変化に影響しそうなものがあり、
究極は全部リアルタイムでシンセサイズするとかになりそう。
→３日間ではとてもできない課題

簡略して、とりあえず、
- 壁床はすべて石でできている。
- 足元から音が発生し、一時反射をシミュレーションしてみる。

ルームシミュレーションとか、ルームアコースティックとかよばれるものになるのかもだが、これもまともに計算とかしたらそれはそれで大仕事になってしまうので、
超簡易化してみる。

そしてこんな感じになった。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">GGJ一日目の成果物　とりあえず足音　<a href="https://twitter.com/hashtag/GGJ_2023?src=hash&amp;ref_src=twsrc%5Etfw">#GGJ_2023</a> <a href="https://twitter.com/hashtag/ggj?src=hash&amp;ref_src=twsrc%5Etfw">#ggj</a> <a href="https://twitter.com/hashtag/ggjjp?src=hash&amp;ref_src=twsrc%5Etfw">#ggjjp</a> <a href="https://t.co/WiouKu4QEl">pic.twitter.com/WiouKu4QEl</a></p>&mdash; tatmos #ディスクロ 第2章12/9発売 (@tatmos) <a href="https://twitter.com/tatmos/status/1621670005690757120?ref_src=twsrc%5Etfw">February 4, 2023</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

まず一日目：
- 足音はラウンドロビン（２か４こ）で、なんとなく同音連打にならないように。
なんとなく交互に鳴っている感じ

- キャラのリスナーに対して、左右、前後、上下にレイを飛ばして、ぶつかったところに足音の音源を配置し鳴らす
- 壁までの距離に応じて再生遅延させる（距離感をイメージさせる）
- 壁までの距離に応じて減衰もさせる

これ、足音一つ鳴らすのに６音同時に消費しています。
ゲームジャムでしかできない贅沢実装。

   
２日目：

https://twitter.com/tatmos/status/1621767104004493312?s=20

- 残響エフェクトをかけてみた。

反射音にだけ残響をかけてみたところ、壁が近いとより深く残響がかかるようになって、
初期反射だけでなくなんども反射しているみたいな感じの変化に近づいたかもしれない。

狭い場所であれば、めっちゃ響く。
広い場所では、あまり響かない。



３日目：

https://twitter.com/tatmos/status/1621902666178895874?s=20


ゲームと組み合わせてみたところ。

迷路が通路ばかりで距離の変化が感じられる空間ではない感じ。

敵が近づいた時に、音がかなり大きくなる（６倍鳴っているので）
でも、ホラー感的には合っている感じがした。

自分の足音はやたらでかいのが気になる（少しさげても良さそう）
足音をこんなに鳴らす歩き方って、このキャラはどんな足や動きをしているのだろうか・・・
かなり足を打ち付けて歩いているみたいな感じになってしまった

走っている時とか、ジャンプした時とかはこれくらいあってもいいけど、
普通に歩いている時はもっと静かに足を　　なんなら忍び足みたいにして　音が鳴っていないでも良さそう。
とか思いつつもゲームジャムの開発時間は時間切れのため
この感じで完成とした

ゲームになったもの：

https://twitter.com/tatmos/status/1622150626078752768?s=20


かなり怖い音ができている。
敵キャラが２体いるっぽいけど、どちらの音も聞こえてしまっていて、音像は曖昧になった。
同じ音なので区別はつかない。
マイクラとかの感じで、壁があっても遮蔽はしない。だいたい向こうの方にいるというのが感じられる程度。

音楽もないので、
音だけ聞くとかなり怖い音ができたと思う。


もしホラーを作る時があったらこういうのもありかも。
普通のゲームではもっといろいろ音を鳴らすだろうから、ここまでできない（足音１個で６音なので、キャラ数（３）ｘオーバーラップ数（２）ｘ６＝３６音消費！）

ほんとは鎧とかの揺れとか衣擦れみたいな音とか、主人公の呼吸音とか、そういうのも入れていくとより良い音になりそう。
Blenderでおみくじ

## はじめに

Blenderでおみくじを引いてみましょう。

## おみくじを作る

Pythonでおみくじを作ります。下記のコードをコピーして実行してみましょう。

Pythonの実行方法は、次を参考にしてみてください。

https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377

```python
import random
from math import pi

import bpy


def get_font():
    search_list = [
        ("Meiryo Regular", "/Windows/Fonts/Meiryo.ttc"),
        ("Hiragino Sans GB W3", "/System/Library/Fonts/Hiragino Sans GB.ttc"),
    ]
    for f, l in search_list:
        if not (font := bpy.data.fonts.get(f)):
            try:
                font = bpy.data.fonts.load(l)
            except RuntimeError:
                pass
        if font:
            return font


def main():
    # みくじ文字用マテリアル
    mat1 = bpy.data.materials.new(name="text")
    mat1.use_nodes = True
    ndpb = mat1.node_tree.nodes["Principled BSDF"]
    ndpb.inputs[0].default_value = mat1.diffuse_color = 0, 0, 0, 1
    # みくじ棒用マテリアル
    mat2 = bpy.data.materials.new(name="stick")
    mat2.use_nodes = True
    ndpb = mat2.node_tree.nodes["Principled BSDF"]
    ndpb.inputs[0].default_value = mat2.diffuse_color = 0.8, 0.5, 0.2, 1
    text_list = "大吉 中吉 小吉 吉 末吉".split()
    for i, s in enumerate(random.sample(text_list, len(text_list))):
        # みくじ文字
        bpy.ops.object.text_add(location=(-0.85, 0, 1.2), rotation=(pi / 2, 0, 0))
        txt = bpy.context.object
        txt.data.body = s
        txt.data.font = get_font()
        txt.active_material = mat1
        # 100mのみくじ棒を作成
        bpy.ops.mesh.primitive_cylinder_add(
            vertices=6, radius=10, depth=100, location=(i * 0.5 - 1, 0, 0.5)
        )
        # みくじ棒
        stk = bpy.context.object
        stk.active_material = mat2
        txt.parent = stk  # みくじ棒をみくじ文字の親に
        bpy.ops.transform.resize(value=(0.01, 0.01, 0.01))  # みくじ棒を1/100倍に
    # 白板
    bpy.ops.mesh.primitive_plane_add(location=(0, 0.01, 1.5), rotation=(pi / 2, 0, 0))
    bpy.ops.transform.resize(value=(1, 1, 0.5))
    bpy.context.object.select_set(state=False)
    bpy.context.view_layer.objects.active = None


main()
```

実行すると、下記のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/42ba0965-4308-b6da-c6d1-e6bb458e1543.png)

## おみくじを引いてみよう

5本の「**みくじ棒**」から1本を選び、削除してください。文字が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/f39d62c4-b580-98b1-b140-d5ec88e49d11.png)

## 文字が表示されるしくみ

1つの**みくじ棒**は、100mの長さで作られます。そのみくじ棒に対応した文字を子供にして、1/100倍にリサイズします。
このとき、子供の文字も1/100倍になります。そして親のみくじ棒が削除されると、子供は元の大きさに戻るので表示されるようになります。

## さいごに

神社の雰囲気を出したり、アニメーションにしてもいいかもしれません。

以上
24年卒の専門学生が内定をもらった話

## はじめに
先日ある企業からiOSエンジニアとして内定をいただいたので、就活中に感じたことや教訓を共有したいと思い、この記事を書きました。これを見ている誰かの就活に役立てたら幸いです。

## 自己紹介
僕は地方の技術系の専門学校に通っています。
プログラミングは専門に入ってから、学び始めました。（それまではゴリゴリの文系でした）

最初に学んだのは「C言語」です。
最初は大変だったのですが、Cを学んだからこそ、プログラムの内部で何が起こっているのかを詳しく知ることができたので、学んでおいて良かったと思います。

それからもいくつかのプログラミング言語を学んで、Swift、もといiOSアプリ開発に辿り着きました。
そして一年くらい勉強したのちに、先日初アプリである「[MyReadingNote](https://apps.apple.com/jp/app/myreadingnote/id6444395416)」をリリースすることができました。

Swiftは学校の授業では教わらなかったので、完全独学です。

以上、つまらない自己語りでした。

## 学生時代にやって良かったこと
### 普段からの開発
正直これが一番、就活の役に立ったと思います。

開発をするためには、普段からの学習が必須です。
学校では習わないような知識も学ばなければなりません。

目的意識を持ってインプットをするので、学習効率が上がります。
わからないことはネットや知人に聞くしかないので、質問力が身につきます。
調べたコードを使える形で変換するようになるので、応用力が身につきます。
面接官の方と技術の話ができるので、面接でも盛り上がるようになります。

まだまだ個人開発をするメリットはたくさんあります。
何より楽しいです。

個人開発をしたことがない人は、就活までに何でもいいので作ってみることをお勧めします。

### 読書
僕は普段から様々なジャンルの本を読むのですが、これも就活に役立ちました。

具体的には、質問の返答に本で読んだ知識を交えながら話したところ、面接官の方に「面白いね」と好感触を得ることができました。

また読書をすると視野が広がるので、業界選択なり企業選択の時に、より適切な選択ができるようになると思います。

特に就活に役立ったと感じる本を並べておくので、もし興味があれば読んでみてください。

- [スタンフォードのストレスを力に変える教科書 ](https://amzn.asia/d/7PRUZre)
- [選択の科学 コロンビア大学ビジネススクール特別講義](https://amzn.asia/d/avjNVTu)
- [マインドセット「やればできる! 」の研究](https://amzn.asia/d/iK8KISm)
- [科学的な適職](https://amzn.asia/d/58RFNDG)

### 失敗を恐れず挑戦すること
僕は去年の７月ごろに、ある企業のインターンに応募しました。
その時はコード試験で落ちてしまいました。

しかし試験のフィードバックをいただき、そこから猛勉強をして半年後にその企業から内定を得ることができました。
その際、インターン応募からの成長スピード、成長度合いを評価していただきました。
インターンで落ちたことが結果的に、自分を成長させ、内定につながったのです。

何が言いたいかというと、失敗してもいいから挑戦するべきということです。
たとえ失敗しても、それが成長につながればいいんです。

失敗から逃げずに挑戦する癖をつけることは、就活はもちろん、これから先の人生の役にも立ちます。

## 就活でやって良かったこと
### 面接練習
当然ですね。

自分の場合は、想定される質問を全てリストにまとめ、その回答を考えました。
友達にも協力してもらい、結構な時間面接の練習に費やしました。

もちろん質問の返答を全て暗記する必要はありません。
むしろ暗記をしてしまうと、その場の雰囲気にあった返答ができなくなってしまいます。
なので伝えたいポイントを絞って、その場で肉付けして返答する、という練習を繰り返しました。

### 応募する企業を調べ尽くす
これも当然ですね。

自分の場合は、その企業のネットに公開されている情報には全て目を通す、という勢いで調べました。
第一志望だけでもいいので、その企業を調べ尽くしてみてください。


### 早期に行動する
自分の学校では、本格的に就活が始まるのが、今年の２月からでした。
個人的には遅いと思うのですが、どうなのでしょう・・・？

どちらにせよ学校に合わせる必要はありません。
自分の場合は3年生の夏前から、企業を調べ始めました。

学生生活のなるべく早い段階から、就活にアンテナを張れれば、間違いなく就活は有利になります。
みんなが企業を選んでいるときに、ESの内容を考えたり、面接の練習に時間を使えます。

無理に焦る必要はありませんが、早いに越したことはありません。

## 終わりに
振り返ると、就活で大事だったのは、普段の学習習慣だったりします。
普段から個人開発をしたり、読書をしたり、そんな積み重ねが就活に役立ちます。
結局、最強の就活対策は「人生を充実させること」だと思います。

ここまで読んでいただきありがとうございました！
逆関数の定積分「2023年上智大学理工学部第2問(3)」をwolframalphaとsympyでやってみたい。

グラフがでます。wolframalphaとsympyの２通りの解法で!

オリジナル 第2問(3)

https://youtu.be/RAz-SyycmjA

上と同じです。大学入試数学問題集成＞【2】(3)テキスト

https://mathexamtest.web.fc2.com/2023/202313363/2023133630400mj.html#top-0404

# wolframで(普通の図式で書く)
以下、同じ計算が続きます。よって？expandが、必要でした。

https://ja.wolframalpha.com/input?i=%EF%BC%90%E3%81%8B%E3%82%891%2F2%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7sin%5E%28-1%29%28x%29%E3%82%92%E7%A9%8D%E5%88%86

https://ja.wolframalpha.com/input?i=%EF%BC%90%E3%81%8B%E3%82%891%2F2%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7arcsinx%E3%82%92%E7%A9%8D%E5%88%86

https://www.wolframalpha.com/input?i=Integrate%5Bsin%5E%28-1%29x%2C+%7Bx%2C0%2C1%2F2%7D%5D&lang=ja

https://www.wolframalpha.com/input?i=Integrate%5Barcsinx%2C+%7Bx%2C0%2C1%2F2%7D%5D&lang=ja

定積分
integral_0^(1/2) sin^(-1)(x) dx = 1/12 (6 (sqrt(3) - 2) + π)≈0.12782

### simplifyとexpand

https://www.wolframalpha.com/input?i=simplify%28Integrate%5Barcsinx%2C+%7Bx%2C0%2C1%2F2%7D%5D%29&lang=ja

結果
簡約 | integral_0^(1/2) sin^(-1)(x) dx = 簡約 | 1/12 (6 (sqrt(3) - 2) + π)

https://www.wolframalpha.com/input?i=expand%28Integrate%5Barcsinx%2C+%7Bx%2C0%2C1%2F2%7D%5D%29&lang=ja

結果
-1 + sqrt(3)/2 + π/12

# wolframで(図で書く)

https://www.wolframalpha.com/input?i=1%2F2*arcsin%281%2F2%29-Integrate%5Bsinx%2C+%7Bx%2C0%2Carcsin%281%2F2%29%7D%5D&lang=ja

結果
-1 + sqrt(3)/2 + π/12≈0.127825

# 追加

https://www.wolframalpha.com/input?i=sinx+%E3%81%AE%E9%80%86%E9%96%A2%E6%95%B0&lang=ja

https://www.wolframalpha.com/input?i=arcsin%281%2F2%29&lang=ja


# 本命案？　wolframで(InverseFunction — 記号逆関数)

1回でうまくいきませんでした。

https://www.wolframalpha.com/input?i=Integrate%5BInverseFunction%28sinx%29%2C+%7Bx%2C0%2C1%2F2%7D%5D&lang=ja

2回に分けました。

https://www.wolframalpha.com/input?i=InverseFunction%28sinx%29&lang=ja

結果
sin^(-1)(x)

(省略)普通の図式で書く。に続く。


# sympyで
sympyのInverseFunctionを探しています。
```python
from sympy import *
var('x')
y=asin(x)
print("#",integrate(y,(x,0,Rational(1,2))))
plot(y,x,sin(x),(x,0,Rational(1,2)))
plot(y,x,sin(x),(x,0,2*pi))
# -1 + pi/12 + sqrt(3)/2
```

plotコマンドは、縦横比？異なります。逆関数は青色の曲線です。

0≦x≦1/2
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/d905d2d7-bb78-5d98-ccf1-f5eed71787fa.png)

0≦x≦2π
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/1801830e-c14d-c047-eae6-ed8cd636eab8.png)


# 参考
wolframのInverseFunctionのヘルプあります。

https://qiita.com/mrrclb48z/items/e0b60e417f905b49cd2f
Docker：Dockerイメージ、リポジトリ、タグ、レジストリ、ビルド、プル、プッシュの意味

※あくまでもDockerに関する文脈での意味。

# Dockerイメージ
コンテナ実行に必要なファイルがまとめられたファイルシステム。
例えばWebサーバのコンテナを作る場合はapacheなどがすでにインストールされているイメージを使用することができることになる。
PHPやRubyなどのプログラムの実行環境が欲しい場合は、これらのコンテナを取得すれば容易に実行環境を準備することができることになる。

また、このようにDocker Hubで用意されているものを取得するのではなく、自分自身で作成することもできる。ストレージドライバーはAUFS。
イメージ上のデータは読み取り専用になる。

Dockerイメージは読み取り専用のレイヤーに分けられる。そして、このDockerイメージからコンテナを起動すると、これらの全レイヤーが読み取り専用のまま起動し、加えて読み書き可能なコンテナレイヤーも起動する。
なので、コンテナを起動したらコンテナレイヤーは変更やパッケージの追加を加えられるし、変更が加わったものを新たにイメージとして保存もできる。

## 注意点：イメージは継承して使い回し、同じイメージを何度も取得しないこと


# リポジトリ
Dockerイメージを保管するための入れ物。タグ名の異なるイメージを複数保管することもできる。

# タグ
イメージに付与して判別することができるラベル名。自由に命名でき、例えばプログラミング言語のイメージではバージョン名を表す名称になっている。
タグ名を明示しない場合は、latestというタグ名が使われる。

# レジストリ
リポジトリを管理する場所のこと。
リポジトリの作成など、リポジトリの管理機能を提供するサービスをレジストリサービスという。
このサービス例は、Docker HubやQuay.ioなどあり。
レジストリにDockerイメージを保存することで異なる環境間にイメージを移送することができるようになる。

# ビルド
DockerfileからDockerイメージを作成すること。


# プル
リポジトリからイメージをダウンロードすること。


# プッシュ
リポジトリにイメージをアップロードすること。
[Docker][nginx][Let's encrypt]Dockerでhttpsサーバーを立ち上げたい。

# httpsサーバーを立ち上げたい
さくらのVPSにDocker/nginx環境を立ち上げました。
これをhttpsに対応させたく、奮起していますがなかなか立ち上がりません。

とりあえず、certbotを立ち上げてLet's Encryptの証明書をとるところまでは以下を参考にしました。
[nginxのdocker imageでリバースプロキシを構築する](https://blog.sustenage.com/blog/0035-nginx-proxy/)

https側のnginx設定は以下を参考にしました。
[docker nginx + Let's encrypt 自動更新(cron使わないで)](https://silver0480.blog.fc2.com/blog-entry-474.html)

https://自分のドメイン
にアクセスするのですが、
![https_error.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3084136/d199f735-438d-150a-d0a2-38863532b7ab.jpeg)
~~となるので残念ながら今のところhttpsでアクセスできていません。~~
~~地道に解決するしかないですね、、、~~
なんと！TOPページはhttps化されていました。　
サブドメインはされていないのでLet's Encryptの設定ですね。　良かった。
設定見直します。

サブドメインについては以下を参考にしました。
[Docker Compose でリバースプロキシを立てて別の Docker Compose 内のコンテナに接続する](https://maku77.github.io/p/5f2j2hz/)
Docker：Dockerデスクトップを起動し、サンプルイメージを使って操作：「docker run hello-world」とは

# MacのWarpで、Dockerデスクトップを起動し、run する意味とは

# このイメージ「hello-world」がない場合
以下の三つが実行される。

(1) docker pull・・・イメージの取得（Docker Hubからネットを介してダウンロードする）

(2) docker create・・・コンテナの作成

(3) docker start・・・コンテナの起動


# すでにこのイメージ「hello-world」が取得済みの場合
上記の(3) が実行される。

※勝手に判別してくれて親切だな。
Cloud9でPHPをブラウザ実行する方法

自分用の備忘録
cloud9で生PHPを書いたときにブラウザでの実行がうまくできなかったので記録。

前提
PHPをかける状態はできていること。

対象のディレクトリまで下りて行って
下記コマンドを実行
```
php -S localhost:8080

```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606803/1b6aa0e0-5ea2-fc82-2e22-743c6a9e4f4d.png)

上記を実行するとプレビューが表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606803/236f3925-68a6-154a-f5ea-2293b0f6c7de.png)
Chef Vault 早わかり

業務でChef Vaultを扱うことがあるのですが、引っかかることが多いため簡潔なリファレンスをまとめます。
公式のリファレンスは https://docs.chef.io/workstation/chef_vault/ です。

# Chef Vaultとは

Chefサーバ上にデータを暗号化して保存するための仕組み。
例えば各ノード（Chefサーバで管理しているサーバ）に共通のパスワードを配布するのに用いる。

ちなみにChefサーバ上にデータを保存するData Bagsという仕組みがあり、さらに暗号化するのがChef Vaultである。

# データの内容

全体としては二重の連想配列で、vault名とitem名により引き当てる。
各itemはJSONオブジェクトで、自由に構造化することができる。

# 誰が取得できるのか

Itemごとに権限付与できる。取得できるのは、権限のある：

- アカウント（Chefサーバのユーザ）、または
- ノード

# 暗号化の仕組み

公開鍵暗号。

1. Chefサーバは各アカウントやノードの公開鍵を持っている。Chefサーバがデータを受け入れる際、権限のある各アカウントやノードの公開鍵で、それぞれ暗号化して別々に保存する。
2. 権限のあるアカウントやノードは、自分の公開鍵で暗号化されたデータをダウンロードし、手元の秘密鍵で復号化する。

鍵ペアが生成されるタイミングは：

- アカウントであれば作成時、または、事前に手元で生成して作成時に公開鍵を明示する。
- ノードであればブートストラップ時（Chefサーバの管理下に入れるとき）

この仕組みのため、例えばノード内のデータをロストしてブートストラップをやり直した場合、権限付与もやり直す必要がある。

# Itemの作成

Vault名：`passwords`, item名：`root` の例。

```shell
knife vault create passwords root -J passwords/root.json -M client
```

`-M client`　はクライアントとして動作する（つまり、別にChefサーバが存在する）ことを示す。

# アカウントによる取得

主に内容の確認のほか、ChefサーバやChef organizationの移行などに用いる。

```shell
knife vault show passwords root -M client -F json > passwords/root.json
```

# アカウントへの権限付与

通常、取得だけできても意味がないので、管理者権限を付与する。

```shell
knife vault update passwords root -M client -A tomanabe
```

# ノードへの権限付与

通常、台数があるので、クエリを指定してマッチするノードにまとめて付与する。

```shell
knife vault update passwords root -M client -S role:webserver
```

# ノードによる取得（Recipeにおける取得）

```ruby
require 'chef-vault'
item = ChefVault::Item.load('passwords', 'root')
```

ここで `item` はJSONオブジェクトである（例えば、パスワードのStringそのものではない）ことに注意すること。

# Chef Vaultのモック（Itemの取得を含むRecipeのテスト）

```ruby
require 'chef-vault'
allow(ChefVault::Item).to receive(:load).with('passwords', 'root').and_return({'mock_key' => 'mock_value'}) 
```

# 権限剥奪

サブサブコマンド `update` の代わりに `remove` を用いる。

# Itemの削除

```ruby
knife vault delete passwords root -M client
```
Reactアプリにバナー広告を表示させてみた

モバイル向けB2C Webサービスの収益を強固なものにするため、メイン画面にバナー広告を挿入しました。
本記事で解説するのは Google AdSense ではなく、自前の広告マイクロサービスと連携する方式です。
バナー広告は数分単位で動的に切り替わります。

マイクロサービスと連携する部分は割愛し、僕がデモンストレーション用にローカル環境で作成したコードを掲載します。

```react:myapp/src/footer/index.js
import React, {useState, useEffect} from 'react';
import foo from '../assets/img/foo.png';
import bar from '../assets/img/bar.png';
import baz from '../assets/img/baz.png';

export default function Footer() {
	// 広告データをハードコーディング
	const ads = [
		[ 'スポンサー企業様その１', foo, 'https://foo.example.com/' ],
		[ 'スポンサー企業様その２', bar, 'https://bar.example.com/' ],
		[ 'スポンサー企業様その３', bar, 'https://baz.example.com/' ],
	];

	const [count, setCount] = useState(0);

	useEffect(() => {  // マウント時にのみ実行
		const time = setInterval(() => {
			setCount(prevCount => (prevCount + 1) % ads.length);
		}, 3000);
		return () => clearInterval(time);
	// eslint-disable-next-line react-hooks/exhaustive-deps
	}, []);

	return (
		<div className="footer-content">
			<img key={ads[count][2]}
				alt={ads[count][0]}
				src={ads[count][1]}  // バナー広告の画像イメージ
				onClick={() => window.open(ads[count][2], "_blank")}  // 企業URL
			/>
		</div>
	);
}
```

`npm start` したところ、３秒単位でバナー広告が切り替わり、クリックすると企業サイトに飛びました。
`useState`や`useEffect`など React Hooks の使い方は、こちらの記事を参考にしました。

https://qiita.com/kobayang/items/88a104c0be28e16e65e8

さて、ここで終わりとしても良いのですが、見た目を少し凝ってみたくなりました。

```css:myapp/src/assets/scss/home.scss
#footer-myapp {
	height: 60px;
	width: 100%;
	display: block;
	box-sizing: border-box;
	margin-left: auto;
	margin-right: auto;
	padding: 0 50px;

	.footer-content {
		height: 100%;
		width: 100%;
		display: flex;
		align-items: center;
		justify-content: flex-end;
		img {
			cursor: pointer;
			height: 100%;
			animation: rendered 1s ease;
			animation-iteration-count: 1;
			@keyframes rendered {
				0% {
					opacity: 0;
				}
				100% {
					opacity: 1;
				}
			}
		}
	}
}
@media (min-width: 600px) {
	.MuiToolbar-gutters {
		padding-left: 43px;
		padding-right: 43px;
	}
}
```

透明度を指定する`opacity`と、動きに変化を付ける`animation`を組み合わせ、ふんわりゆっくりバナーを切り替えるようにしてみました。如何でしょうか。