OmniAICreator/Qiita-1.07M huggingface dataset:
【SwiftUI】ScrollViewが1番下までスクロールした事を検知する

# はじめに
現在SwiftUIではScrollViewやListを1番下までスクロールした事を検知することができません。
実現しようと調べて見ましたがあまりスマートなやり方は見つかりませんでした。
(唯一見つけたのは`GeometryReader`で挟んでスクロールした幅を取得するというもの)

色々試した中で1番スマートにかけたものを紹介します。
(検知はできてるけど使い物にならない)

# やり方

```swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        ScrollView(.vertical, showsIndicators: true) {
            ForEach(0..<100) { index in
                Text("テキスト: \(index)")
            }
        }
    }
}
```

```swift
extension UIScrollView: UIScrollViewDelegate {
    public func scrollViewDidScroll(_ scrollView: UIScrollView) {
        let top = scrollView.contentOffset.y
        let bottom = top + scrollView.frame.size.height
        if top > 0 && scrollView.contentSize.height <= bottom {
            print("1番下です")
        }
    }
}
```

# 問題点
スクロールできるView全てに反映されるます。
ですので全く使い物になりません笑

# おわり
これがちゃんと使えるようになる方法あったら教えてください。
viteをv2からv3に上げたら、ローカル実行時にfirebaseに繋げなくなったメモ

## 概要
viteをv3にしたとき、ログイン機能が動かなくなった。
ネットワークにつながらず、タイムアウトしていた模様。
`Firebase: Error (auth/network-request-failed).`

## 原因

v2とv3でdev serverの動きが異なっていた。(参考: [vite - migration](https://vitejs.dev/guide/migration.html#dev-server-changes))

## 対応
v2と同様の挙動にするオプションを加える。（参考:[vite - server options](https://vitejs.dev/config/server-options.html#server-host))

```diff:vite.config.ts
export default defineConfig({
  build: {
    outDir: 'build',
    sourcemap: process.env.NODE_ENV !== 'production',
  },
  plugins: [reactRefresh(), terser({ compress: { drop_console: true } })],
  resolve: {
    alias: [{ find: '@', replacement: '/src' }],
  },
+  server: {
+    host: true,
+    port: 3000,
+  },
})

```
Circle CIを使ってみる



GitHub上に、今回は**hello_circleci_20220729**という名前のリモートリポジトリを**private**で作成しました。

Cirlce CIの[Signup](https://circleci.com/ja/signup/)のページにて、自分のGitHubアカウントで、登録する。(全てのリポジトリと連携するか、公開しているリポジトリのみと連携するか選択をすること。)
※自分の場合は、全てのリポジトリと連携を選択しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/f00f83bd-70e5-996d-5f93-606a2dc9d3df.png)

Circle CIのセットアップ画面で、**Select Organization**は自分のGitHubアカウント、**Select Repository**は先ほど作った**hello_circleci_20220729**を選び、**Select your config.yml file**は今回は、Fastを選択して、**Set up Project**ボタンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/9e098f55-cdc3-d21e-897c-d0b0c89eab4c.png)

言語選択の画面が出現するので、今回は、**Hello World**を選択する。
(単に、Dockerコンテナを作り、その上で、Hello Worldと表示するだけ)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/642cee28-97f4-d18e-51cf-f2d0fd5ba458.png)

**Commit And Run**ボタンを押すと、そのままテストが実行されます。今回は、問題なく、Success。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/53d7e9e9-d973-e1a8-d528-65e11c9e0936.png)

Successをクリックすると、say-helloが表示され、それをさらにクリックすると、各プロセスの具体的な処理を見ることができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/91a7e04f-74af-7097-dcfa-c935728bdb78.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/f85a767d-debf-8cf4-7e4c-f14d8b1c3043.png)

GitHub上には、circleci-project-setupブランチが自動で作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2739418/821b8ddf-0cc7-8d4f-777f-d02551a04ab8.png)
中身は、.circleciディレクトリと、その中に、config.ymlが入っています。
[翻訳]チュートリアル: GoとGinによるRESTfulなAPI開発(原文: Tutorial: Developing a RESTFul API with Go and Gin)

## この記事について

この記事はTutorial: Developing a RESTful API with Go and Ginを翻訳したものになります(2022/07/29最終更新)。ソースコード以外は意訳が含まれている可能性があるので、気になる箇所は[原文](https://go.dev/doc/tutorial/web-service-gin)をご参照ください。

## 記事の移動

本記事は以下のブログに移転しました。

https://yukiotechblog.com/go-lang-tutorial/
Gitコマンド git logで各コミットで修正があったファイルも出力する

# 概要

- `$ git log`コマンドにて各コミットで修正されたファイルも一緒に出力する方法をまとめる。

# 方法

- git logコマンドに`--stat`オプションを付与する。
- なので下記のコマンドを実行する。

    ```shell
    git log --stat
    ```

- `--name-status`オプションをつけると表示方法が変わる。

    ```shell
    git log --name-status
    ```
Railsチュートリアルでのherokuへのデプロイのエラー対処まとめ(第6版)【備忘録】

# 背景
第6版の第1章で、githubへのpushまではすんなり進んだのですが、herokuにデプロイする際にエラーが多発したため、主に備忘録用のエラー対処まとめです。

# 前提条件
railsやgemのバージョンなどは基本的に「22年7月26日時点の第6版」で指定されている通りです。

# エラー解決に必要だった処理や対処のまとめ
本題です。
エラー対処は大きく「1.デプロイ自体が失敗するエラー」を解決した後、「2.アプリケーションエラーの原因となるエラー」を解決するという流れでした。

## 1.デプロイ自体が失敗するエラー
### 1.Failed to install gems via Bundler
bundlerのバージョンがローカルとherokuで異なっていると発生するエラーのようです。
このエラーが出た際、エラーメッセージを辿っていくと
```
remote: -----> Installing bundler  2.3.10
```
といったメッセージが出ていますが、これがherokuのbundlerのバージョンです。
Gemfile.lockファイルの一番下に記載されているローカルのbundlerのバージョンとエラーメッセージのバージョンが異なっている場合、
```
$ gem uninstall bundler
```
でローカルのbundlerを一度アンインストールし、
```
$ gem install bundler --version '2.3.10' #herokuと同じバージョンを指定
```
でバージョンを指定してbundlerを再インストール。
最後に、Gemfile.lockファイルを更新するために
```
$ rm gemfile.lock #Gemfile.lockファイルを削除
$ bundle lock --add-platform x86_64-linux #再生成
```
でファイルを削除、再生成します。
この後
```
$ bandle install --without ‘production’
```
すればエラーが解決できるはずです。
### 2.Precompiling assets failed
このエラーの原因はエラーメッセージに
```
psych::badalias: unknown alias: default
```
とあるように、psychというgemの解釈の方法がバージョン3系と4系で変わっていることでした。なので
```:gemfile
gem 'psych', '~> 3.1'
```
とファイルの先頭に追加してやってbundle installすれば解決するはずです。
（※ちなみにrails 6.1.4以降ではこの問題は解決されているようです。）
（この二つを解決すると、とりあえずデプロイには成功するようになりました。）

## 2.アプリケーションエラーの原因となるエラー

### 1.Ruby Sass has reached end-of-life and should no longer be used.
sassというGemの寿命が来たことが原因のようです。
sass-railsのバージョンを6以降にすることで解決できます。
```:Gemfile
gem "sass-rails", "~> 6"
```
とsass-railsのバージョンを変更してやり、その後bundle installします。

### 2. H10appcrashed
デプロイには成功しているが、ビルドに失敗したと表示が出たため、
```
$ heroku logs --tail
```
でログを開いてみるとエラー表示。
さらに
```
$ heroku run concole
```
でコンソールを開こうとすると「H10appcrashed」のエラーメッセージ。
Ruby3.1で標準ライブラリからいくつかのライブラリが除外されたことが原因のため、rubyのバージョンを下げるか
```:Gemfile
gem 'net-imap'
gem 'net-pop'
gem 'net-smtp'
```
を手動で追加してbundle installしてやると解決しました。

## まとめ
上記を一気に解決する場合、
```:Gemfile
# バージョンを3系に下げる
gem 'psych', '~> 3.1'

#ruby3.1と整合させるため
gem 'net-imap'
gem 'net-pop'
gem 'net-smtp'
```
をGemfileの先頭に追加して

```:Gemfile
gem "sass-rails", "~> 6"
```
と書き換え
```
$ gem uninstall bundler
$ gem install bundler --version '2.3.10' #herokuと同じバージョンを指定
$ rm gemfile.lock #Gemfile.lockファイルを削除
$ bundle lock --add-platform x86_64-linux #再生成
$ bandle install --without ‘production’
```
としてやります。

## おまけ
### heroku createで出たurlを踏んでも上手くページが表示されない
単純に間違えてgit push用のurlに飛んでいただけでした。
heroku createの際に生成されるもう一つのリンクが正しいurlです。

## 参考
https://logicoffee.hatenablog.com/entry/2018/09/04/160555
https://qiita.com/Bjp8kHYYPFq8MrI/items/90a9db03160f8d6f7e5c
https://qiita.com/kandalog/items/8fd20f79ecf73034795a
https://yumishin.com/heroku-push-error/#i
https://qiita.com/CoGee/items/2f509402dec47c820d32
https://s4na.hatenablog.com/entry/2021/02/22/004019
https://mophie-blog.com/2020/08/16/app-erro-in-heroku-h10-app-crashed/#toc2
https://qiita.com/li2003038/items/2d93b693fa5885c45276
Vim 9.0 patchダイジェスト (2022/06)

[Vim](http://www.vim.org/)のリリースされた[patch](https://github.com/vim/vim/commits/master)の説明です。
([8.2.5049](https://github.com/vim/vim/commit/00e977cb83625f979d13639249a7788d5a1cb71e) ～ [8.2.5172](https://github.com/vim/vim/commit/c19f1a3488c1bb6fe5707dc6338b13cb9f598670), [**9.0**](https://github.com/vim/vim/commit/eb49041875118be5fe60f07750c7c86cb26dccef), [9.0.0001](https://github.com/vim/vim/commit/75417d960bd17a5b701cfb625b8864dacaf0cc39) ～ [9.0.0014](https://github.com/vim/vim/commit/9610f94510220c783328e1857af87a6ae7bc20b4))
**新機能、大幅な仕様変更には、:four_leaf_clover:が付いています。**

* [9.0.0010](https://github.com/vim/vim/commit/b0375d466e5ca57dca71995c342870b3226d8115): Vim 9.0以降で`has('patch-9.0.0')`が 1 を返さない件を修正しました。
* [9.0.0007](https://github.com/vim/vim/commit/84f546363068e4ddfe14a8a2a2322bb8d3a25417): :four_leaf_clover:termcapエントリーオプション `'t_ds'`, `'t_Ds'`, `'t_Us'`を追加しました。それぞれ、点線の下線(dotted underline)、破線の下線(dashed underline)、二重の下線(double underline)のモードを設定できます。あわせて、ハイライトモード "underdouble", "underdotted", "underdashed" も追加しました。
* [Vim 9.0 リリース](https://github.com/vim/vim/commit/eb49041875118be5fe60f07750c7c86cb26dccef): :four_leaf_clover::four_leaf_clover::four_leaf_clover::four_leaf_clover::four_leaf_clover::four_leaf_clover:
* [runtimeファイル更新](https://github.com/vim/vim/commit/8c1b8cb2e0b52d0853f85c2096a2f22dbc57a788): [Todo](https://github.com/vim/vim/commit/8c1b8cb2e0b52d0853f85c2096a2f22dbc57a788#diff-fb7eed53e3f2993f9d82c748206eaca82fd1d054a417c6de477bb54373d85643)更新。helpファイル更新。カラースキーム更新。他。

---
#### 凡例

|表記|意味|
|:------|:------|
|:four_leaf_clover:|新機能、大幅な仕様変更|
|:alien:|Vim開発者向けの追加、変更|
|`'hoge'`|オプション (`:h options`参照)|
|`:hoge`|Exコマンド (`:h :index`参照)|
|`hoge()`|組み込み関数 (`:h functions`参照)|
|`v:hoge`|Vim定義済変数 (`:h v:`参照)|
|`+hoge`|feature (`:h +feature-list`参照)|

---
#### 方針
[こちら](http://qiita.com/h_east/items/23cd0d10932505072e6b#%E6%96%B9%E9%87%9D)を参照。
タブナビングってなんや？

### はじめに ###

先日フロント部分実装時のこと、URLクリックと同時に別タブでページを表示させたかったので```target=_brank```
を使用することにした。

```target=_brank```について調べていると「危険」やら「ヤバい」などのなにやら不穏なワードとセットで出てくるではないか。


ん〜なるほど<b>【タブナビング】</b>なる攻撃方法があるのね。

### タブナビングとは ###
簡単に説明すると、非アクティブなタブ（現在見ていないタブ）のページを勝手にSNSなどの偽ログインページに飛ばし、入力させた個人情報を引き抜くフィッシング詐欺の一種である。

<br><br>

タブナビングお主もなかなかの悪よの。。。

### タブナビング対策 ###

ではどうすればタブナビングを防げるのか。

答えは簡単```rel属性```に```noopener```と```noreferrer```を使用するだけ。

以下例を御覧ください。

【例】
```haml
<a href="https://example.com" target="_blank" rel="noopener noreferrer">ここ押して</a>
```

### なぜ```noopener```と```noreferrer```を使用するのか？ ###

そもそもタブナビングは```target="_blank"```で開いたページが元ページの情報を```window.opnerオブジェクト```として持っていることにより、```window.opener.location```で元ページを操作できてしまう事に起因している。

逆にいうと```noopener```で```window.opnener```の情報を空にしてしまえば操作は出来ないということになる。

また```noreferrer```を使用することでもリンク先に参照元のリンク情報を渡さないようにすることが出来るため、こちらで対応することもできる。

ちなみにどちらか一つでもタブナビング対応が出来そうだがなぜ両方使用しているかというと、カバー出来るブラウザの種類を拡げるためである。
※ブラウザによっては```target=_brank```使用のaタグに対して【既定値として```noopener```が適用】されていたりする

### おわりに ###

そういや以前にフィッシングサイトを見る機会があったが、マジで精巧に作られていてよく見ないとわからない感じだった。

急いでる時など尚更釣り上げられる可能性があるので気をつけたいと思ふ。
★備忘録　Laravel PJにてTop（index）以外のページが404になる事象の解決策

表題の通りLaravelPJにおいて
トップページ以外４０４になる事象に遭遇。

色々確認すべき所はあったものの、結局今回の事象では
ModRewriteが有効になっていなかった事が原因でした。

なので以下のコマンドで解決。

```言語:コマンド
sudo a2enmod rewrite
```
Payment APIで支払い用のQRコードを発行するメモ PayPay for Developers

## はじめに

この記事は、PayPay の Payment API を利用して、決済用の QR コードを発行するまでの手順メモです。

## ドキュメント

https://developer.paypay.ne.jp/products/docs/webpayment

## インストール

```bash
npm i request
```

## コード

下記のコードを`qr.js`として保存する。

```js
var request = require("request");
var options = {
  method: POST,
  url: /v2/codes,
  headers: {
    'Authorization': 'hmac OPA-Auth: <KEY>',
    'X-ASSUME-MERCHANT': <MERCHANT ID>,
    'Content-Type': 'application/json',
  },
  body: { "amount": 1000, "codeType": "ORDER_QR", "merchantPaymentId": "<MERCHANT PAYMENT ID>", "orderDescription": "テスト決済" },
  json: true
};
request(options, function (error, response, body) {
  if (error) throw new Error(error);
  console.log(body);
});
```

## 実行する

```bash
node qr.js
```

### レスポンス

```json
{
  "resultInfo": {
    "code": "SUCCESS",
    "message": "Success",
    "codeId": "08100001"
  },
  "data": {
    "codeId": "04-ttsARm7PuT2ElFoO",
    "url": "https://stg-www.sandbox.paypay.ne.jp/app/cashier?code=https%3A%2F%2Fqr-stg.sandbox.paypay.ne.jp%2Fxxxxxxxxxx",
    "expiryDate": 1659100082,
    "merchantPaymentId": "DEVELOPER-PANEL-DEMO-xxxxxxxxxxxx",
    "amount": {
      "amount": 1000,
      "currency": "JPY"
    },
    "orderDescription": "",
    "codeType": "ORDER_QR",
    "isAuthorization": false,
    "deeplink": "paypay://payment?link_key=https%3A%2F%2Fqr-stg.sandbox.paypay.ne.jp%2Fxxxxxxxxxxxx"
  }
}
```

`data.url`を開く。

[![Image from Gyazo](https://i.gyazo.com/8cf01e00a06df7917e1a3929f397c3dd.png)](https://gyazo.com/8cf01e00a06df7917e1a3929f397c3dd)

QR コードを発行できました。
tinygltf入門

# tinygltf入門

## 環境構築(tinygltfのReadmeに記載あり。)
1. tinygltfをクローンしてくる。
2. 使いたいプロジェクトで、以下の４つの.hが使えるようにする（includeパスを通す、同階層に置くなど）
 - stb_image.h
 - stb_image_write.h
 - json.hpp
 - tiny_gltf.h

## 使うとき
基本的には、tiny_gltf.hをインクルードするだけ。
```
#include "tiny_gltf.h"
```
ただ、以下の#defineは必要そうなので、どこかで書いておく。
```cpp
#define TINYGLTF_IMPLEMENTATION
#define STB_IMAGE_IMPLEMENTATION
#define STB_IMAGE_WRITE_IMPLEMENTATION
```
ボタンのborderについてメモ

# ホバーすると、ベタ塗り→borderに変わるボタンについて


↓こういうボタンを実装する場合、ホバーの<font color="Red">前の状態のボタンに、透明なborderを指定しておく。</font>


<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="gOeXoBN" data-user="mamenon" 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/mamenon/pen/gOeXoBN">
  Untitled</a> by mamenon (<a href="https://codepen.io/mamenon">@mamenon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>



## ホバー時のみborderを指定してもいいのでは？と思うが、
そうすると、上下左右に2px+2px=4px分のボーダーが追加されてしまうので、
結果として大きいボタンになってしまう。

<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="OJvOweo" data-user="mamenon" 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/mamenon/pen/OJvOweo">
  sample1</a> by mamenon (<a href="https://codepen.io/mamenon">@mamenon</a>)
  on <a href="https://codepen.io">CodePen</a>.</span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


これを阻止するために、ホバー前の状態からborderを指定しておく。

## ちなみに（ボーダーの色について）

borderの色は、背景色と同じ色（この場合blue）でもいいけど、
後々もしblueが変更になった場合、いちいち書き直さないといけないから、transparentにしている。

## :focusについて
:focusを指定すると、フォーカスしたと同時に、ホバーした時と同じ見た目になるため、タブキーを押下してページを遷移させるユーザーにとって、わかりやすくなる。
基本的には　:hoverと同時に指定しておく。


## 参考
「CSS設計完全ガイド ~詳細解説+実践的モジュール集」
https://gihyo.jp/book/2020/978-4-297-11173-1
GitHubで覚えておくべきこと!

個人用のメモ。

## 用語の意味
**リポジトリ**：ファイルやフォルダの更新履歴を管理しているフォルダのこと。
　　　　　　リポジトリが更新履歴を持っているから更新前のファイルに戻したりできる。

**リモートリポジトリ**：`https://github.com/`に作成したリポジトリのこと。
　　　　　　　　　　(皆で共有したり、外部に公開したりするため。）

**ローカルリポジトリ**：自分のPCに作成したリポジトリのこと。(実体は`.git`フォルダ)

**プッシュ**：ファイルの更新内容をリモートリポジトリに保管(登録)すること。
　　　　　コミットをしないとプッシュできない。

**プル**：リモートリポジトリから最新の状態をローカルリポジトリに反映すること

**コミット**：ファイルの更新内容をローカルリポジトリに保管(登録)すること。

**インデックス**：ローカルリポジトリにコミットする前の一時保管場所。(実体は`.git/index`フォルダ)
　　　　　　　インデックスに保管(登録)しないとコミットはできない。
　　　　　　　インデックスの存在理由は、不要なファイルをコミットしない様にすること。
　　　　　　　コミットが必要なファイルのみをインデックスに保管(登録)すれば、
　　　　　　　そのファイルのみコミットされる。

**ブランチ**：1つのファイルに対して複数人で更新を行うための機能。
　　　　　ブランチを1つ増やすと更新履歴が2つに分岐する。




## 作成したファイルをGitHubにアップロードする。（初回）
　手順①　cmdを起動して作成したいフォルダに移動。

　手順②　`git init`コマンドを実行。
　　　　　フォルダに「.git」ファイルができる。

　手順③　`git remote add origin (アップロードURL)`コマンドを実行。
　　　　　プッシュ先のリモートリポジトリを指定している。

　手順④　`git add (アップロードファイル)`コマンドを実行。
　　　　　インデックスに保管(登録)される。
　　　　　※`git add .`コマンドを実行すれば更新した全ファイルを対象にする。

　手順⑤　`git commit -m (任意のコメント)`コマンドを実行。
　　　　　ローカルリポジトリに保管(登録)される。

　手順⑥　`git push -u origin master`コマンドを実行
　　　　　リモートリポジトリにプッシュされる。


## 作成したファイルをGitHubにアップロードする。（2回目以降）
　手順①　`git add (アップロードファイル)`コマンドを実行。
　　　　　インデックスに保管(登録)される。
　　　　　※`git add .`コマンドを実行すれば更新した全ファイルを対象にする。

　手順②　`git commit -m (任意のコメント)`コマンドを実行。
　　　　　ローカルリポジトリに保管(登録)される。

　手順③　`git push -u origin master`コマンドを実行。
　　　　　リモートリポジトリにプッシュされる。

## 設定しているリモートリポジトリを確認する
```terminal
git remote -v
```


## プッシュ先のリモートリポジトリURLを削除
※リモートリポジトリ自体を削除するわけではなく、`git push`コマンドを実行した時にどのリモートリポジトリにプッシュする、という設定を削除する。

　手順①　`git remote rm (リポジトリ名)`コマンドを実行。

　手順②　`git remote -v`コマンドを実行してリモートリポジトリURL一覧を確認。


## コミットを取り消す
　手順①　`git reset --soft HEAD^`コマンドを実行。


##  .gitignore自体を対象外にする。
※最初の状態だと.gitignoreファイル自体はignoreされない。

　手順①　`.git\info\exclude`ファイルを開いて最後に`.gitignore`を追記する。
```diff_ruby:.git\info\exclude
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
+.gitignore
```

## .gitignoreの短縮表現
```terminal:.gitignore(通常)
sample1.txt
sample2.txt
sample3.txt
sample4.txt
```
```terminal:.gitignore(短縮)
sample[1-4].txt
```


## originとmasterについて
以下ページが大変参考になりました。
[Git - originとmasterとは何か(初心者向け)](https://qiita.com/seri1234/items/e651b3e108a695a92809)
露出過多と露出不足を機械学習モデルで一度に解決　

# 明るすぎるところと暗すぎるところの混在する画像をきれいにしたい
既存の露出補正用の機械学習モデルは、露出過多と露出不足のどちらか一方しか補正できないものが多かったです。

# LCDPNetで一発解決

![1d5bddbe-9256-46d4-b74b-d70106423da9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/7a98ecd0-819d-48d5-ad01-8662b611d1cd.png) ![a1135-050716_214208__I2E4324.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/3bf6d66d-32af-5c1f-5412-d344121b40c7.png)


LCDPNetは画像内の明るすぎる部分と暗すぎる部分を特定して、それぞれ補正してくれます。
これにより、明るい部分が過剰になることなく暗い部分が補正されます。

https://github.com/hywang99/LCDPNet


# 使い方

リポジトリをクローン。

src/config/ds/test.yaml
で入力画像ディレクトリを以下のように指定します。

```test.yaml
# @package ds
class: img_dataset
name: ours-cslab.test
input:
  - images/*
GT:
  - images/*
```

提供されているweightを指定します。

```shell
git clone https://github.com/hywang99/LCDPNet.git
cd LCDPNet/
pip install hydra-core --upgrade
pip install pytorch_lightning
pip install ipdb
pip install kornia
pip install wandb
pip install thop
python src/test.py checkpoint_path="trained_on_ours.ckpt"
```

saveフォルダの名前など聞かれた場合は、入力してエンターします。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f4bc3397-47fd-c594-2ce6-c5f4859dbbb2.jpeg width=400> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/07b229cc-1ab1-926b-ab58-4607c8ebddd3.jpeg width=400>

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
[GoogleCloud] App Engineのアクセス制限について

# はじめに
GoogleCloudに対してのIP開放したところ、思った箇所以外に変更が必要な箇所があり、App Engineに対するIPアドレス制限について記載する。

# 今回の問題が発生した構成
![AppEngine_構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/abbcb300-6114-d9ac-1f06-2190453d378f.png)


## 構成補足
- サーバレスの構成でLB配下にCloudStorage、App Engine、CloudFunctionsをぶら下げている。
- App Engine、CloudFunctionsに対するCloudArmorの設定は可能だが、CloudStorageに対するCloudArmorの適用はできない(※)。
- LB配下にぶら下げたCloudStorageにコンテンツを配置した場合、アクセス制限をかけたかったので、リバプロとして動作させるApp Engineを作成し、間にかませる構成にし、App Engineに紐付けたCloudArmorでアクセス制限した。

※なお、2022/6にCloudStorageへのCloudArmorでのアクセス制限が可能になった！個人的にこのことがあったので熱いアプデ
https://cloud.google.com/blog/ja/products/identity-security/cloud-armor-adds-more-edge-security-policies-proxy-load-balancers

# 発生した事象
## 事象内容
App Engineに紐付いているCloudArmorにてIPアドレスを許可しても、アクセス可能にならなかった

## 一次対応を受けて調査
- LBのログの出力内容確認(500エラーであることしか記録されず、、、)
- CloudArmorのルール制限に抵触していないか確認するも抵触していない(※1)
- CloudArmorがちゃんと適用されていないのでは？と思い、新たにCloudArmorを作成し、同じルールで適用するもNG

※1 https://cloud.google.com/armor/quotas?hl=ja#limits

## ここでの中間の感想
- 他に思い当たる制限箇所もこの時ありませんでしたので、問い合わせることに

## サポートからの回答
- App Engineのファイアウォールによりアクセス制限されており、そこで対象IPアドレスを許可してください。

## 回答を受けての調査
- App Engineの画面を開いたところ、App Engineの設定にFW設定があり、そこでIPアドレス制限がされていました

## 原因
- App Engineのサービス自体でFW機能があり、そこでIP制限しており、CloudArmorでも制限しており、2箇所でIPアドレス制限をしていた。

## 対応
### Ingress設定
すべてのトラフィックを許可する設定になっていたが、LB経由ないし内部トラフィックのみに制限した(App Engine側で制御するなら変えなくてもよかったと思います)。
![スクリーンショット 2022-07-29 19.33.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1720034/9adc3a2f-78f3-bc64-6b3b-3b300ab6628a.png)

### ファイアウォールルール設定
App Engineのファイアウォールでの制限はせずに基本的にすべて許可とした。

## App Engineが関連するIP制限まとめ
- CloudArmor
    - 今やLBにぶら下がる、CloudStorage、CDNに対しても制限可能であり、App Engine、Cloud Run、Cloud Functionsなど(サーバーレス ネットワーク エンドポイント グループ)に対してWAF機能を提供することができる
- App EngineのINGRESS設定
    - ここはIP制限とは少し違うがパブリックで受けるのかLB経由のみ受けるのか、内部通信のみ受けるのか、を選択することが可能
- App Engineのファイアウォール
    - App Engineに対するアクセス制限をIPアドレスですることが可能

## 感想
AWSのEC2でいうと、ただOS上のfirewalldで制限してて、インスタンスのSGでIP許可しても駄目だったみたいな感じと思うと情けないです。。
近々App EngineをやめてCloudStorageに対してCloudArmorをかけるかたちに変えたいと思います。
水耕栽培キットの LED スペクトル分布のメモ

## 背景

水耕栽培の LED ライトをリビング照明にも使えないだろうか...
(リビングに水耕栽培の植物をインテリアとして置いて鑑賞しつついいかんじに調和したいできないだろうか)

とりあえず amazon でよく売れているっぽい水耕栽培キット調達してみて,
点けてみたけど人にはやさしくない...(蛍光灯っぽくて気分がわるくなる)

LED スペクトル分布を測定しました(2 モードあったので 2 パターン)

計測には, セコニック　スペクトルマスター C-7000 を使いました.

![Screenshot from 2022-07-29 20-38-38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/35507e53-a98f-ee3d-0611-cdc2b576ccf0.png)

![Screenshot from 2022-07-29 20-42-31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/36275/632513f2-3a47-26e8-3fab-ab98bfb791d9.png)




やはり青が強くだめな感じでした...
植物には適しているかもですが...

https://www.living-farm.com/article/15231388.html


## TODO

* リビング用照明と水耕栽培の両方に適したスペクトル分布を探す旅に出たい.

 
## References
 
異なる波長分布特性を持つ各種 LED 光源下で栽培したリーフレタス品種群の生育応答反応に関する研究
https://www.jstage.jst.go.jp/article/hrj/17/4/17_439/_pdf/-char/ja
HDDのデータを完全に消去する

10年以上前のWindows7PCを先日処分しました。データの消去に苦労したので、データの完全消去の方法を記録します
### 試みたこと

①PCの初期化
Windows10であれば、｢設定｣｢更新とセキュリティ｣｢回復｣から初期化できます。Windows7(dynabook)では上記の方法は利用できず、各メーカーによって、初期化のやり方も違うので調べる必要がありました。
私の場合、Shiftキーを押しながらシャットダウンし(高速起動だと反応しないため)、キーボードの［0］(数字のゼロ)キーを押しながら(長押し、複数回押しの両方を試しました)、パソコンの電源を入れる方法も試しましたが反応しませんでした。また、リカバリディスクを紛失しており、有効な方法がなかったので、初期化はあきらめました。個人フォルダのデータは移動済みであり、念のため個人情報が気になるアプリはアンインストールしました。
②データの消去方法として物理的破壊
今までHDを処分する時には、物理でディスクを破壊していました。HDを分解して円盤を割る方法です(破片が飛び散り危険なため、おすすめできません)。今回は時間がなく、PCからHDを取り出すことができなかったので断念しました。
③Cドライブの初期化
ubuntuのDVDを作成していたので、DVDドライブからubuntuを起動しました。Diskを検索して起動し、Cドライブを初期化(NTFSは問題ありそうなのでFATに)しました。DVDドライブから起動する際、BIOSのブートの順番を上位に設定しても、うまく起動できなかったので、F12を押して起動メニューから起動する方法でうまくいきました。
④データの完全消去
調べているうちに、コマンドラインから、データを完全消去する方法があることを知りました。ubuntuの場合、端末を検索して起動し、コマンドラインを使います。
```
% sudo fdisk -l
```
ディスクのデバイス名を確認
```
% sudo shred -v -n 3 -z /ディスクのデバイス名
```
-vは進捗状況表示
-nは書込み回数、デフォルト3
-zは0の書込み
### まとめ
無駄な工程を繰り返し、本当に消去できたのか不安を感じつつ、翌日ヨドバシカメラに持ち込みました。データ消去の確認をされた時、「消去しました」と答えたけど、確信が持てません。ならば、確認すればいいと思われるでしょう。ですが、精魂尽き果てており、徹夜する覚悟は持てなかったため寝ました。PC廃棄が第一目的なので、データ完全消去の確認方法は後日調べます。おそらくHDはリサイクルされることでしょう(個人的にすごく嫌です)。PC初心者の方に貰われ、健全に使用されることを願います。
良いAPIの返却レスポンス

## 背景
SoftwareDesignの8月号読んでいてAPIの設計についてまとめたいと思った。備忘録。

## 概要
きれいなAPIとはなにか、という設計方法。

## 対象
APIとは何か？を知っているけれど「きれいな設計」「きれいなAPI」とは何かを考えたい人

## 引用、参考元
「SoftwareDesign - Web API の作り方 -」

## 本編
### エンベローブを利用しない
エンベローブとはレスポンスJSONの中に含まれるメタ情報（成功失敗のステータスやエラーコードなど）を指す。
HTTP通信ではエンベローブに相当する情報を**ステータスやヘッダ**に書き込める。
情報が被ってしまうため、エンベローブは**ボディ**には入れない。 

#### 悪い例
```json
{
    "header": {
        "status": "success",
        "errorCode": 0,
    },
    "response": {
        name: "Kona"
    }
}
```
これは、ヘッダ情報に入っているエンベローブがbodyに入っているため不適。

#### 良い例
```json
{
    "response": {
        name: "Kona"
    }
} 
```

### システムの構造をユーザに反映するのは望ましくない
#### 悪い例
```json
{
    "response": {
        "id": 12345,
        "name": "Kona",
        "profile": {
            "birthday": "1993/02/02",
            "gender": "male"
        }
    }
} 
```
#### 良い例
```json
{
    "response": {
        "id": 12345,
        "name": "Kona",
        "birthday": "1993/02/02",
        "gender": "male"
    }
} 
```

### 日付フォーマットを統一する
APIとして広く利用されるためには、利用者にとって一般的なフォーマットや記号を使うことで、利用時のミスを防ぐことが大切。
日付であれば、様々な表記方法があるが、Web上で一般的に利用される **W3C-DTF** 形式を用います。
日付のほかには、言語コードであれば**ISO-639**(en, ja)、国コードであれば**ISO-3166**(US, JP)を用いるのが一般的な表記方法。

| 種類 |  | サンプル |
|:-:|:--|:--|
|非推奨|RFC 822(RFC 2822, RFC 5322)|Thu, 29 Mar 2018 08:00:00 GMT|
|非推奨|RFC 850|Thursday, 29-Mar-2018 08:00:00 GMT|
|非推奨|UNIX タイムスタンプ|1721781500|
|推奨|RFC 3339(W3C-DTF)|2018-03-29T17:00:00+09:00|

### エラー詳細をレスポンスボディに入れる
基本的にエラーかどうかはステータスコードで判別する。ただ、詳細まではステータスコードだけではどうしても表現できない。エラーの詳細として、エラーコードやエラーメッセージをレスポンスボディに埋め込む。

#### 悪い例
```json
HTTP/1.1 400 Bad Request
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/json
Content-Length: 0
```
エラーの場合、レスポンスボディがない

#### 良い例
```json
HTTP/1.1 400 Bad Request
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/json
Content-Length: 77

{
    "code": 4444,
    "message": "不正な値が入力されました"
}
```

### エラー時にHTMLが返却されないようにする

#### 悪い例
```json
HTTP/1.1 404 Not Found
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/html
Content-Length: 17707

<!DOCTYPE html>
<html lang="ja">
...
```
エラーの場合、Content-Typeが**application/html**になっている

#### 良い例
```json
HTTP/1.1 404 Not Found
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/json
Content-Length: 74

{
    "code": 404,
    "message": "リソースが存在しません。"
}
```

### サービス閉塞時は503 と **Retry-After**を返却する
メンテナンス中など

#### 悪い例
```json
HTTP/1.1 404 Not Found
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/html
Content-Length: 17707

<!DOCTYPE html>
<html lang="ja">
...
```
エラーの場合、Content-Typeが**application/html**になっている

#### 良い例
```json
HTTP/1.1 503 Service Temporary Unavaliable
Server: api.example.com
Date: Sat, 28 Mar 2020 01:57:25 GMT
Content-Type: application/json
Content-Length: 87
Retry-After: Mon, 6, Apr 2020 01:00:00 ...

{
    "code": 503,
    "message": "サービスを利用できません。"
}
```
STM32F767とOLED、OLED096UNO-Aで12345678を表示(16x24)(改良)(SSD1306)




x Mbed2のリビジョン143です。
x SSD1308_128x64_I2Cのライブラリが必要です。

目的
OLEDのテスト


![o_con599.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/f2f3d233-1742-64d9-8b9c-47d8350fc9e7.jpeg)



![o_con600.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/389dbe3c-238d-ea2d-8371-6f5f90687ed4.jpeg)



```c++



//oled_test2_16x24_767_1

#include "mbed.h"
#include "SSD1308.h"

//i2c initialization
I2C i2c(I2C_SDA, I2C_SCL); //767

// Instantiate OLED
SSD1308 oled = SSD1308(&i2c, SSD1308_SA0);

// Host PC Communication channels
Serial pc(USBTX, USBRX); // tx, rx

//メイン関数
int main()
{

    int ii; //ループカウンター
    int nn; //文字カウンター

    //charge pump  add=>ca45040
    i2c.write(SSD1308_SA0, "\200\215\200\024", 4); //0x80,0x8d,0x80,0x14
    //set access
    oled.setDisplayFlip(false, false);

    //シリアルの初期化
    pc.baud(9600);

    //char n1_8[] = "12345678";
    char n1_8[] = "87654321";

    ii=0;
    for(nn=0; nn<8; nn++) {
        //                y   x
        oled.writeBigChar(0, ii*16,n1_8[nn]);
        ii = ii + 1;
    } //for
    pc.printf("Printed something\r\n");
    //printf("Printed something\r\n");
    while(1) {}

}//main



```
TeraTermでのファイル転送方法

## linuxコマンドとTeraTermの機能を利用した転送方法のメモ
対象環境は下記
- プライベートサーバ
- パブリックサーバ
- ローカル環境(PC)

---
#### パブリックサーバ から プライベートサーバ へ転送
パブリックサーバで実行
```
scp P ポート番号　/送信するファイルのパス　送信先ユーザー名@IPアドレス:/受信先ファイルパス
```
#### プライベートサーバ から パブリックサーバ へ転送
パブリックサーバで実行（※プライベートサーバにあるファイルをパブリックへ転送するが、実行するのはパブリックサーバ）
```
scp P ポート番号　送信先ユーザー名@IPアドレス:/送信するファイルのパス　/受信先パス
```
----
#### パブリックサーバ から ローカル環境(PC) へ転送
パブリックサーバのテラタームで実施

「ファイル」→「SSH SCP...」→

<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1193125/812a5ad9-51de-264e-72fe-ba49b3d876ed.png">

利用するのは下のフィールド
Form:パブリックサーバの送信するファイルのパス
To:ローカル環境の受信先パス
<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1193125/e8a6de70-3db3-c3ac-d9e2-9a68c4657955.png">

#### パブリックサーバ から ローカル環境(PC) へ転送
パブリックサーバのテラタームで実施

「ファイル」→「SSH SCP...」→利用するのは下のフィールド

Form:ローカル環境の送信するファイルのパス
To:パブリックサーバの受信先パス

<img width="40%" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1193125/d335603b-a8e7-0475-89b3-d3d7ffb100e0.png">
「アジャイルサムライ」の感想

 ### 読んだ本
 - アジャイルサムライ−達人開発者への道  
 - 著者：Jonathan Rasmusson
 - 初版発行：2011年7月16日 
 - Amazonの紹介ページは[こちら](https://www.amazon.co.jp/%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4%E2%88%92%E9%81%94%E4%BA%BA%E9%96%8B%E7%99%BA%E8%80%85%E3%81%B8%E3%81%AE%E9%81%93%E2%88%92-Jonathan-Rasmusson/dp/4274068560/ref=sr_1_1?adgrpid=60123465984&gclid=EAIaIQobChMIiO6P4Pad-QIVTqqWCh3rHA_aEAAYASAAEgJt5PD_BwE&hvadid=611407601657&hvdev=c&hvlocphy=1009333&hvnetw=g&hvqmt=e&hvrand=4109013039647611748&hvtargid=kwd-334256426361&hydadcr=27298_14587105&jp-ad-ap=0&keywords=%E3%82%A2%E3%82%B8%E3%83%A3%E3%82%A4%E3%83%AB%E3%82%B5%E3%83%A0%E3%83%A9%E3%82%A4&qid=1659091849&sr=8-1)  

 ### この本を選んだ理由
 - アジャイルを勉強中なので  
 - アジャイル検定Lv.1に合格した人の記事でこの本を読んでいたため

 ### 学んだこと、気づいたこと
 - アジャイルの本はどれも、アジャイル開発の体験を追いながら説明していく形になっている、みたいな文章があって、なるほどと思った。
 - 「アジャイル」は"決まった型で開発すること"ではなくて、"より良い成果を出すための活動"のことだと分かった。  
   (イテレーションがなくても、継続的インテグレーションができなくても、アジャイルは成立する)  
 ### 雑感
 - 「アジャイル」は、英単語の意味は「機敏な」「すばしっこい」という意味だけど、この本を読むと、「柔軟な」という意図に感じる。アジャイル開発 = 柔軟な開発。従来の"型"ではなく、最善を求めるために変えていくことをヨシとする感じ。
 - 「システム開発」という言葉は同じでも作業内容は各現場で違うので、開発の"型"を決めるのではなく、"考え方"や"目指すところ"を揃えようとしているのだと理解した。その"目指すところ"を実現するための「やり方(プラクティス)」もたくさんあって、現場に応じてカスタマイズしながら取り入れていく = 考え続けて改善し続ける ことがアジャイルなのかな。
Databricksにおけるバイナリーファイルの取り扱い

[Binary file \| Databricks on AWS](https://docs.databricks.com/data/data-sources/binary-file.html) [2021/1/19時点]の翻訳です。

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

Databricksランタイムは、バイナリーファイルを読み込み、それぞれのファイルを生のコンテンツとファイルのメタデータを含む単一のレコードに変換する[バイナリーファイル](https://spark.apache.org/docs/latest/sql-data-sources-binaryFile.html)データソースをサポートしています。バイナリーファイルデータソースは、以下のカラムと場合によってはパーティションカラムを含むデータソースを生成します。

- `path (StringType)`: ファイルのパスです。
- `modificationTime (TimestampType)`: ファイルの更新時刻です。いくつかのHadoop FileSystem実装では、このパラメーターは利用できず、デフォルト値になる場合があります。
- `length (LongType)`: ファイルのバイト長です。
- `content (BinaryType)`: ファイルのコンテンツです。

バイナリーファイルを読み込むためには、データソースの`format`として`binaryFile`を指定します。

# 画像

画像データをロードする際にはバイナリーデータソースを使用することをお勧めします。

Databrikcsランタイム8.4以降では、Databricksの`display`は、バイナリーデータソースでロードされた画像データの表示をサポートしています。

ロードされたファイルに[画像の拡張子](https://github.com/AdoptOpenJDK/openjdk-jdk11/blob/19fb8f93c59dfd791f62d41f332db9e306bc1422/src/java.base/windows/classes/sun/net/www/content-types.properties#L182-L251)がある場合には、自動で画像のプレビューが有効化されます。

```py:Python
df = spark.read.format("binaryFile").load("<path-to-image-dir>")
display(df)    # image thumbnails are rendered in the "content" column
```
![](https://docs.databricks.com/_images/binary-file-image-preview1.png)

あるいは、バイナリーカラムをアノテーションするために、`"image/*"`の文字列による`mimeType`オプションを知いることで、画像プレビューの機能を強制することができます。バイナリーのコンテンツのフォーマット情報に基づいて画像がデコードされます。サポートされている画像は`bmp`、`gif`、`jpeg`、`png`です。サポートされていないファイルは破損した画像のアイコンとして表示されます。

```py:Python
df = spark.read.format("binaryFile").option("mimeType", "image/*").load("<path-to-dir>")
display(df)    # unsupported files are displayed as a broken image icon
```
![](https://docs.databricks.com/_images/binary-file-image-preview2.png)

画像データを取り扱う推奨のワークフローに関しては、[画像アプリケーションのリファレンスソリューション](https://qiita.com/taka_yayoi/items/41be81691df3f7c8e6bf)をご覧ください。

# オプション

パーティション発見の挙動を保ちつつも、指定されたglobパターンにマッチするパスからファイルをロードするために`pathGlobFilter`オプションを使用することができます。以下のコードでは、パーティション発見を行いながらも入力ディレクトリから全てのJPGファイルを読み込みます。

```py:Python
df = spark.read.format("binaryFile").option("pathGlobFilter", "*.jpg").load("<path-to-dir>")
```

パーティション発見を無視して、入力ディレクトリ配下のファイルを再帰的に検索したい場合には、`recursiveFileLookup`オプションを使用します。このオプションはディレクトリが`date=2019-07-01`のようなパーティションの命名規則に*従っていなくても*、ネストされたディレクトリを検索します。以下のコードでは、入力ディレクトリから再帰的にJPGファイルを読み込み、パーティション発見を無視します。

```py:Python
df = spark.read.format("binaryFile") \
  .option("pathGlobFilter", "*.jpg") \
  .option("recursiveFileLookup", "true") \
  .load("<path-to-dir>")
```

同様のAPIをScala、Java、Rで使用できます。

:::note
**注意**
データを読み込む際の性能を改善するためには、バイナリーファイルからロードしたデータを保存する際に圧縮をオフにすることをお勧めします。

```py:Python
spark.conf.set("spark.sql.parquet.compression.codec", "uncompressed")
df.write.format("delta").save("<path-to-table>")
```
:::

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)
find と xargs でファイルを検索

# 概要
find と xargs でファイルを検索する方法です。

# 実行
以下を実行すると、カレントディレクトリのファイルのみを対象として、ls コマンドを実行してくれます。
```
$ find . -type f -print0 | xargs -0 ls
```
結果
```
$ find . -type f -print0 | xargs -0 ls
./.firebase/hosting.YnVpbGQ.cache
./.firebaserc
./node_modules/@jest/core/LICENSE
./node_modules/@jest/core/README.md
./node_modules/@jest/core/build/FailedTestsCache.d.ts
./node_modules/@jest/core/build/FailedTestsCache.js
./node_modules/@jest/core/build/ReporterDispatcher.d.ts
./node_modules/@jest/core/build/ReporterDispatcher.js
./node_modules/@jest/core/build/SearchSource.d.ts
...
```

## 解説
```
find . -type f -print0
```
上記のコマンドの意味は以下の通りです。
|command|意味|
|-|-|
|`.`|カレントディレクトリを指定|
|`-type f`|ファイルのみを指定|
|`-print0`|区切り文字をスペースから\0(null 文字)に変更される|

```
xargs -0 ls
```
上記のコマンドの意味は以下の通りです。
|command|意味|
|-|-|
|`xargs`|読み込んだ文字列（find でとってきたやつ）を引数で指定されたコマンド（ls）の引数にして、引数で指定されたコマンド（ls）を実行する|
|`-0`|\0 を区切り文字(デミリタ)として扱う|

# おまけ
改行コード一括変換
```
find . -type f -print0 | xargs -0 nkf --overwrite -w -Lu
```
|command|意味|
|-|-|
|nkf|文字エンコードしたり、改行コード変換したり（Network Kanji Filter）|
|-w|UTF-8 変換|
|-Lu|改行を LF にする|
Docker OracleDB起動時にORA-00845が発生

# やりたいこと
Dockerコンテナ上にOracle Database(以降OracleDB)を構築し、とりあえずで使える状態としたい。  
作成したOracleDBは、docker-composeを使用して起動したい。  


# 何があったのか
docker-composeを使い、OracleDBコンテナを起動した。  
後処理であるstartup pfile=(省略)/initorcl.oraでORA-00845が発生し、DBがうまく起動しない。

## 原因
initorcl.ora記載のMEMORY_TARGETに対し、/dev/shmの容量が足りていない。

# 解決策(今回やったこと)
docket-compose.ymlに**shm_size: ‘(必要なメモリ)‘** を定義することで解決。  
```yaml:docker-compose.yml
version: ‘3.5’
services:
  hoge:
    shm_size: ‘256m’
(略)
```
※256mは適当な値

# あとがき
私の場合、一時的な環境構築を目的にしているので、本番運用は考慮してません。

# 参考
https://github.com/oracle/docker-images/issues/458
上記docker-compose使わないdocker runパターンも書いていました。

# 追記
セットアップはこちらを参考にさせていただきました。  
https://qiita.com/gorilla0513/items/f22e8cce4e08da031abe
コンテナ技術に乗り遅れた者の備忘録


# 目的

開発者としては必須知識となりつつあるコンテナ技術についての学習メモとなります。
今回はAWSのECSについて学んでいきます。

## コンテナの活用目的

インフラストラクチャの効率的な構築運用を実現し、
プロダクト開発シーンを取り巻く多様な開発環境の変化に対応する。

## 活用するメリット
* インフラ管理における無駄な作業を削減
    → アプリケーション開発にリソースを集中できる
* インフラ環境のカスタマイズが容易である
    → ユーザーの要件に応じて多様な開発環境を実現できる
* 高速なスケーリングが可能となり、パフォーマンスの調整が可能
    → サービス需要に応え、機会損失を防ぐ
* フルマネージドでパッケージの脆弱性スキャンが可能となる
    → ユーザーの安心や情報資産を守り、被害を未然に防ぐ

※ AWS ECSではDockerをサポートしているため、Dockerコンテナの実行、及び管理が可能

# なぜESCを使うのか？

* 通常コンテナを動かす際はVM上で"docker run"コマンドを実行する
    → VMを複数管理している場合は都度コマンドを実行する必要がある為、大変手間であるとともに、障害やバージョンアップの対応が煩雑。

* ECSはクラスターという単位でインスタンスの集まりを管理する事が可能。
この際にクラスター管理を行う事から **（コンテナ）オーケストレーター** と呼ぶ。
コンテナを大規模に実行する事が可能な **フルマネージド** なコントロールプレーン

:::note info
**コンテナオーケストレーター**
どのコンテナをどう動かすか命令を出すサービス
:::

* また **AWS Fargate** という実行環境を利用するにより、コンテナをサーバーレスで動作させる事ができ、EC2上での動作に比べてより多くの管理業務をフルマネージドで実行する事が可能となる。

|Layer Name                | ECS on EC2 | ECS on Fargate |
|:------------------------ |:-----------|:---------------|
|アプリケーションコンテナ  | User       | User           |
|ホストのスケーリング      | User       | AWS            |
|コンテナエージェント設定  | User       | AWS            |
|ホストOS / ライブラリ設定 | User       | AWS            |

# ハンズオン

**～編集中～**
ターミナルからvscodeを開く方法

# 結論
1. vscodeを開き、`CMD` + `SHIFT` + `P`でコマンドパレットを開き、`Shell Command: Install 'code' command in PATH`を選択する
![スクリーンショット 2022-07-29 19.24.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/326068/892cd69f-44d6-0da0-4e20-bf970bc193ba.png)

2. インストールが完了したらvscodeを開きたいところへ移動し、`code .`で開く


# 一言
ずっとGUIで開いていたけど、その時間が無駄だったと思えるぐらい簡単に開けるのでみんな設定して欲しい。
霧を消す機械学習モデルDehazeFormer

# 霧で見えにくい画像がくっきり

https://github.com/IDKiro/DehazeFormer

霧を消すモデルです。

# 使い方

リポジトリをクローンして、提供されているweightのパスを指定して実行します。

```python
git clone https://github.com/IDKiro/DehazeFormer.git
cd DehazeFormer/
pip install -r requirements.txt
python predict.py --data_dir path_to_images --save_dir path_to_saved_models --folder ./
```

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/8269ad3c-6466-38f5-1e14-65021c3793e0.jpeg width=400> <img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/235259/f5bfb3c5-4897-efb1-eee7-64429f8dbb8f.jpeg width=400>

🐣
****
フリーランスエンジニアです。
お仕事のご相談こちらまで
rockyshikoku@gmail.com

Core MLやARKitを使ったアプリを作っています。
機械学習／AR関連の情報を発信しています。

[Twitter](https://twitter.com/JackdeS11)
[Medium](https://medium.com/@rockyshikoku)
[GitHub](https://github.com/john-rocky)
Atomsk

分子構造や結晶構造を可視化するために、入力ファイルや出力ファイル、あるいはXMLファイルに記述される原子位置をあるフォーマットで書き出します。使いたいソフトが特定のフォーマットに対応していなくて困ることがあります。VESTAでexportすることで対応できることが多いですが、コマンドラインで変換したいときもあります。そんなとき[atomsk](https://atomsk.univ-lille.fr)が便利です。構造の可視化やフォーマットの変換だけに限らない多機能なソフトです。

今後、文書を追加していこうと思いますが、プレースホルダー的に記事を作成しておきます。
弊社SlackのゲストアカウントさんにどうしてもCollaのキャンディを贈りたかった話

弊社は基本的にフルリモート勤務となっており、[普段のコミュニケーションツールとしてSlackが採用](https://note.com/saiyou_mgre/n/n77a99d258bc8)されているのですが、[Collaというツールを使って](https://note.com/saiyou_mgre/n/ne9e7c5cfb94d)感謝の気持ちをキャンディに替えて贈り合うという文化が根付いています。

ところで先日、一番詳しい担当がちょうど席を外しているタイミングで、弊社のサービスのごく一部でエラーが発生してしまいました。
あわてて現状確認等をしていたのですが、あまり詳しくない部分のため思ったように調査・対策が取れていなかったのですが、開発を一緒に進めてくれているパートナーさんが素晴らしい助言をくださったことで早期解決することができました。

こんなときこそキャンディを贈る場面なのですが、残念ながら弊社Slackにおけるキャンディは社員間でしか贈れません。

そこで一旦はSlackでやりとりしていたスレッド内で絵文字のキャンディをむやみに並べてみたのですが、何となくコレはつまらないなーと思いました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/1b1e5633-ae48-b1cb-0432-72b3c76ecb07.png)


そこで思いついたのがキャンディ絵文字を使ったQRコードです。
まずは普通にQRコードを生成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/69aefd17-03d0-52a3-28d4-fe681ce533a9.png)

そこからデータに合わせて一旦0と1だけでテキスト化します[^me-copy]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/f4fd787f-15e7-3380-ef24-0863382562bd.png)

次にこのデータが正しいかテストするためにテキストのままQRっぽくして読み込めるかテストしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/539cb80e-eb8f-1e1e-93cb-0aee46b649f2.png)

無事に読めることが確認できたら次はSlack上で使える絵文字でQRコード化してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/7e97f267-68c4-c643-a39b-9caa644515ae.png)

これは・・・濃淡差がなさすぎてダメそうな気がします。
私の手元にある端末では読み込めませんでした。

しかし[QRコードは非常に柔軟な規格](https://www.denso-si.jp/dictionary/dic_qr/GeneralDescriptionoftheQRCode.pdf)で、

- セル形状が正方形でなく円形でもよい[^chrome]
- 照明光の角度により白（反射率が高い）と黒（反射率が低い）が反転しても安定した読取りができる
- ガラスなどの透明な物にマーキングされたシンボルを裏面から読取ることもできる

などの特徴を持っています。

そこで、キャンディ絵文字を白と見立てて、背景色を黒にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/6076470f-41cc-49aa-f089-beedb851112e.png)

このままだとコード周辺のクワイエットゾーンが全くないので（規格では4セル以上なのですが、読み取り精度に期待して）周辺にも1セル分の黒を置いたところ手元で無事に読み込めましたので改めてSlackのスレッドに投下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/7d878dde-cf13-09c2-0fc1-39ec37be1251.png)

めでたく大量のキャンディ（220+1個[^plus1]）を贈ることができましたとさ。

[^me-copy]:最初からテキストデータで出力するプログラムを書くよりも目コピーした方が速そうだったので・・・

[^chrome]:身近な所ではGoogle ChromeのQRコード生成が円形セルです
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/39622/72b35cd9-8aed-b7dc-e27e-fc8c20004e6f.png)


[^plus1]:キャンディセルは220個なのですが、QRコードを読み取ると・・・？ｗ
【小ネタ】PowerAppsとPowerAutomateを連携する手順

PowerAppsのアプリとPowerAutomateのフローを連携する簡単な手順を紹介します。
この記事では以下のようなアプリ画面で「フロー実行ボタン」を押下したら、
入力した文字＋フローで用意した文字を下のラベルに表示するだけの簡単なアプリを作ります。
![001.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/bf097285-8006-42c1-5416-c4b46168dc9a.jpeg)

## フローの作成
まずは連携するフローを作ります。
以下の通り、トリガーは``PowerApps``、アクションは``PowerApp または Flow に応答する``
のみの一番簡単なフローを作ります。

``PowerApp または Flow に応答する``にはアプリに返す値を設定します。
今回はアプリから渡された値に``(テストフロー7)``を加えてアプリに返します。
![006.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/dddc26f3-fbfc-7ae4-7c76-d1f1fa26c519.jpeg)

## アプリの作成
続いてアプリを作ります。
まずラベルのTextプロパティに``temp.result``と入力します。
このresultはフローで設定したresultです。
![010.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/b4390d25-31b3-6926-68be-eff2c9637516.jpeg)
ボタンのOnSelectプロパティに以下の通り入力します。
```
フロー実行ボタン→
UpdateContext({temp:テストフロー7.Run(TextInput1.Text)})

リセット→
UpdateContext({temp:Blank()})
```
![013.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/522e1047-210a-2deb-6e3c-8fdebd7109d4.jpeg)
![014.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/6c997818-4c96-af09-702a-2df95d01cd9e.jpeg)
## アプリとフローを連携
上記の通り設定するとエラーになっていると思います。
これはフローをアプリで使用できるようにすることでエラーが解消します。

アクションタブのPowerAutomateからフローの追加でフローを使用できるようにします。
![011.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/6e38bbaa-1d70-dc49-783f-3e2392765249.jpeg)
![012.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/1911961d-1004-4be3-0b51-e06826079803.jpeg)

## 動作確認
フローを使えるようにしたことでエラーが消えてアプリも完成となります。
動作確認として適当に入力して「フロー実行ボタン」を押下し、
``入力した値+(テストフロー7)``となっていたので完成となります。
![015.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2480832/7d8c5ed2-4751-b2e0-e485-6091c0ed1e78.jpeg)

## まとめ
今回は一番簡単な連携手順について紹介しましたが、アプリやフローに応用を加え、
更に、SharePointのリストとの連携でデータを登録することができるようになれば、
アプリ作成の幅が大きく広がるので、ぜひお試しください。

↓以前書いた記事の中でSharePointとPowerAppsの連携手順について紹介したので、
そちらもご覧ください。

https://qiita.com/ssc-ksakamaki/items/b70476e7102ba162f04d
UserDefaultsについて



#### 最近UserDefaultsについて理解が出来たのでメモも兼ねて記事にしようと思います。


UserDefaultsにデータを保存するには

```diff_swift
UserDefaults.standard.set(保存される値, forKey: "キー")
```
保存したデータ(例えばString)を取得するには

```diff_swift
UserDefaults.standard.string(forKey: "キー")
```

例えば「age」というキーで、「25」という値を保存し、取得するには
```diff_swift
UserDefaults.standard.set(25, forKey: "age")
let userAge = UserDefaults.standard.integer(forKey: "age")
print(userAge)
//25
```

というふうになる。
基本情報（仮想記憶管理パート2)

https://qiita.com/jupippii/items/c51814124327ceae5d29

前回の続きです。

## ページング方式
仮想記憶の実装方式には、仮想アドレス空間を**固定長の領域に区切って管理するページング方式**と**可変長の領域に区切って管理するセグメント方式**の２つがあります。

ページング方式では、プログラムを**ページ**という単位に分割して管理します。

```
仮想記憶

ページ0
ページ1
ページ2
ページ3
ページ4
ページ5
ページ6
```

プログラムというのは色んな機能があるので、いつも全てを必要とするわけではありません。
現在のOSでは、デマンドページングという「実行に必要なページだけを実記憶に読込ませる」方法が主流です。

仮記憶装置と実記憶装置との対応づけは、**ページテーブル**という表によって管理されます。この表によって、仮想ページ番号が実記憶上のどのページと結びついてるかが確認できます。目的のページが実記憶上にないと判明したら、補助記憶から実記憶へとページが読込まれます。
![スクリーンショット 2022-07-29 18.18.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/f6d05e11-7131-eb84-9e53-1abbd020f294.png)

補助記憶から実記憶へのページ読込みを**ページイン**と言います。
ページインしようとしたら、既に実記憶がいっぱいだった。。。という場合、いずれかのページを補助記憶に追い出して空きを作る必要があります。
実記憶から補助記憶へとページを追い出すことを**ページアウト**といいます。

実記憶の容量が少ないと、上記のようにページの置換えを必要とする頻度が高くなり、システムの処理効率が極端に低下することがあります。この現象を**スラッシング**と呼びます。

## ページ置き換えアルゴリズム
ページインしようとした時に実記憶に空きがない場合、いずれかのページをページアウトさせて空きを作る必要が出てきます。何をページアウトさせるのかのアルゴリズムが下記のものです。

|   |説明  |
|---|---|
|FIFO(First In First Out)  | 最初に(First In)ページインしたページを追い出し対象 |
|LIFO(Last In First Out)  |最後に(Last In)ページインしたページを、追い出し対象  |
|LRU(Least Recently Used)　 | 最も長い間参照されていないページを、追い出し対象
|LFU(Least Frequently Used) |最も参照回数の少ないページを、追い出し対象|

## ページングとスワッピング
広義のスワッピングは補助記憶装置と主記憶装置とでメモリ内容を出し入れすること全般を指しているようなのですが、基本情報の試験では狭義のスワッピングを採用しているようです。

### スワッピング
プロセス単位で領域の出し入れを行います。
### ページング
ページ単位で領域の出し入れを行います。

## まとめ
仮想記憶大事よー。
pxchfonでフォルダー内のフォントを読み込む方法

# 環境
Overleaf での動作確認をしています。

# やりかた
NG: 「\setminchofont{FOLDER/xxx.otf}」という操作は失敗する。(dvipdfmx がフォルダ込みでの指定に対応していないため)
GOOD: 「.latexmkrc」の末尾の環境を変える。

# .latexmkrc
```
$latex = 'uplatex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;
$ENV{OPENTYPEFONTS} = 'FOLDER/:';
$ENV{TTFONTS} = 'FOLDER/:';
```

# 実行例
myfont をいうフォルダに otf/ttf ファイルを入れる、今回は BIZUDMincho-Regular.ttf を myfont 内へ。
##### .latexmkrc
```
$latex = 'uplatex';
$dvipdf = 'dvipdfmx %O -o %D %S';
$pdf_mode = 3;
$ENV{OPENTYPEFONTS} = 'myfont/:';
$ENV{TTFONTS} = 'myfont/:';
```

##### main.tex
```
\RequirePackage{plautopatch}
\documentclass[uplatex,dvipdfmx,12pt]{jsarticle}

\usepackage[]{otf}
\usepackage[noalphabet,unicode]{pxchfon}
\setminchofont{BIZUDMincho-Regular.ttf}

\begin{document}
日本語テスト。
\end{document}
```

# まとめ
これでフォルダ内をスッキリさせることができた。

# 参考
pxchfon の開発者様 (twitter: https://twitter.com/zr_tex8r, Qiita: https://qiita.com/zr_tex8r)
徹底攻略！ pxchfonを使いこなそう (https://qiita.com/zr_tex8r/items/a13c195d42b7fca69378)
AI馬体診断でアイビスサマーダッシュを当てる！

# 自己紹介
デジタル初心者の川田と申します！趣味は競馬です。
デジタルについていろいろ学ぶ機会がありましたので、趣味の競馬にも活かせたらと思い、色々とやってみました！

## 競馬について
競馬とは馬を走らせて、着順を競うスポーツです。観客側はその着順を当てることによって配当金がもらえる公営ギャンブルです。
近年の競馬予想にはAIを使った予想が多々あり、自分も勉強した知識で色々とやってみたくなり簡単な物ですが作ってみました。
今回予想したのは７月３１日１５時４５分から行われるGⅢアイビスサマーダッシュです。
アイビスサマーダッシュとは新潟競馬場で行われる芝１０００メートルのレースであり、競馬で唯一コーナーが無いコースになります。
一般的な競馬はトラックを１周または２周するレースがほとんどで、それによってスタミナやコーナリング、展開が問われるのに対し、直線だけのこのレースは単純なスピード勝負であり、今回の予想に向いていると思いこのレースをチョイスしました。


# 使用ツールと使い方
・Teachable Machine

これを使って今回アイビスサマーダッシュに出る18頭の出走馬と、芝１０００メートルのレコード記録（2002年53秒7）を持っており、自身もこのレースを２勝している芝１０００メートルマイスターのカルストンライトオとを比べ、一番カルストンライトオに近い馬に本命を打ちたいと思います。

**カルストンライトオ**
![ダウンロード (14).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724112/043c6638-ee3b-fd89-a429-78307228541a.jpeg)

## いざ実装！
今回は初めてということで
・1頭につき3枚
・他の馬が写っていない写真を選ぶ
という条件で読み込ませました。
![カルストンライトオgif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2724112/80c90993-46e5-288d-b77c-17ba88171d8f.gif)

## 結果
１位　２５％　４番　スティクス 　予想オッズ１１番人気
２位　１４％　１３番　ヴェントヴォーチェ　　予想オッズ３番人気
３位　１０％　１５番　クリスティ　　予想オッズ１３番人気
という結果になりました。
この記事を書いているのは金曜日で、馬券はまだ発売していないのでオッズは出ませんが３連単（１着２着３着を当てる馬券）１００万円超えは確かでしょう！
是非参考にしてみてください。

# 今後の課題
読み込む画像サンプルが少ないのか、実は別のカルストンライトオの写真をアップロードしたところ全然別の結果が出ましたので、全く参考になりません！動いてるところを撮影してモデル数を増やすほうがいいかもしれません。当日のパドックを読み込ませても試してみたいと思います。

## あとがき
Teachable Machineの使い方を学び、それが面白くて早速行動に移してみましたがやはり楽しかったです。
他にも困りごとや趣味に色々使えそうですね。
今、やってみたいことは人の顔を読み込ませてその人が今どのような気持ちなのか判断してみたり、何が欲しいのか判断してみたり、人間には難しい事をAIを使って実装してみたいです。
防犯カメラにその機能があれば、スーパーのお客さんの欲しいものと、店の商品が一致しているのかが分かったり、店の満足度を図るのに使えないかなとも思っています。
では、皆さま良い週末を！
【Intellij IDEA(Ultimate)】Run/Debug Configurationsの環境変数(Environment variables)設定について

# 前書き
`Intellij IDEA`では、`Run/Debug Configuration`毎に環境変数を設定することができます。
また、`Edit configuration templates`から設定を行うことで、プロジェクト内で追加される新しい`Run/Debug Configuration`全てに環境変数を適用することもできます。

これによって、一々システムの環境変数を書き換えて壊してしまうような危険性を減らしつつ、管理を容易にすることができます。

以下、設定方法についてまとめます。
話の本筋には関わりませんが、サンプルプロジェクトには[Spring Initializr](https://start.spring.io/)で作成した`gradle`プロジェクトを利用しています。

# 基本的な編集方法
まず、`Edit Configurations...`を開きます。
![スクリーンショット 2022-07-29 16.42.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/1213fd98-5e15-c88c-53c7-7c1c2de668ee.png)

左側の一覧から編集対象にしたい内容を選ぶと、中程に`Environment variables`という項目が有ります。
![スクリーンショット 2022-07-29 16.49.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/13cb6ecf-7ee1-16ad-0b4d-ae368855cd6a.png)

値を編集すると以下のようになります。
キーと値は`=`で、設定は`;`で区切ります。
サンプルでは`FOO_KEY=foo;BAR_ID=bar`という値を設定しています。
![スクリーンショット 2022-07-29 16.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/ea5fcf24-a25e-f333-fe7d-84209d1ecb06.png)

また、入力欄右側のアイコンからも編集が可能です。

## Environment variablesが表示されていない場合の対処
設定によっては`Environment variables`が表示されていない場合も有ります。
例えば、`Spring Boot`の`Run/Debug Configuration`は、初期状態では`Environment variables`が表示されないようでした。

この場合、まず`Modify options`（画像では`-cp edit-env-demo.main`の上）を開きます。
![スクリーンショット 2022-07-29 16.55.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/01923ad9-f084-1d17-ae05-b2d9cff7e9e0.png)

この中から、`Environment variables`を表示するようチェックを付けることで、編集ができるようになります。
![スクリーンショット 2022-07-29 17.00.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/e0711e17-2014-92a0-c267-c69905d8ba57.png)

# テンプレートを編集して設定する
基本的な編集方法として紹介した内容では、個別の`Run/Debug Configuration`にしか設定が行われません。
つまり、プロジェクト内で一意な内容であっても、`Run/Debug Configuration`を増やすたびに環境設定変数が必要になってしまうということです。

テンプレートを編集して環境変数を設定することで、この手間を回避することができます。

やり方としては、まず`Run/Debug Configurations`ウィンドウ左下の`Edit configuration templates...`を開きます。
![スクリーンショット 2022-07-29 17.29.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/e1604dd0-5400-331a-87f7-d95385a8045d.png)

開いた画面の左から編集したいテンプレートを選び、先ほど同様に`Environment variables`を設定し、`OK`を押すことで反映できます。
ここで、自分の環境では、`Apply`でセットしようとすると何故かエラーになることがあったのでご注意ください。
画像では、`FOO_KEY=foo;BAR_ID=bar;BAZ_VALUE=bazbaz`という値を設定しています
![スクリーンショット 2022-07-29 17.41.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/280230/2d3e83ed-b6ac-785b-601c-b704e2e3b114.png)

ここから設定した環境変数は、例えばGradle ツールウィンドウ（`gradle`プロジェクトで右側のサイドバーに出てくるもの）等から追加した`Run/Debug Configuration`にも適用されます。