OmniAICreator/Qiita-1.07M huggingface dataset:
Kotlinで文字列の先頭や末尾からn文字を抽出する

メモ程度の内容です。

文字列の一部を抽出するとき、Kotlinでは`slice()`や`substring()`を使うかと思います。
特に文字列の先頭や末尾からn文字を抽出することはよくあると思いますが、そのときに`take()`と`takeLast()`というメソッドを使うと便利でした。

- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/take.html
- https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/take-last.html

使い方は以下のように至ってシンプルです。

```kotlin
val alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

println(alphabet.take(7))
// => ABCDEFG

println(alphabet.takeLast(5))
// => VWXYZ

// 文字列の長さを超える値(この例では27以上)を引数に指定したときは、元の文字列が返却される
println(alphabet.take(30))
println(alphabet.takeLast(30))
// => ABCDEFGHIJKLMNOPQRSTUVWXYZ

// マイナスの値を引数に指定したときは、実行時にIllegalArgumentExceptionがthrowされる
println(alphabet.take(-1))
println(alphabet.takeLast(-1))
// => IllegalArgumentException: Requested character count -1 is less than zero.
```
MVCパターン

#MVCパターンについて
最近、MVCパターンを勉強したので記事にまとめます。実は理解していない部分もあるのでぜひツッコミをお願いします。

##MVCパターンとは?
コードの構成の一つです。
コードは動かすだけなら正しいコードであれば動きます。しかし、読みやすさや修正の簡単さをあらかじめ考慮してコードを構成するほうがいいです。この構成方法の１つがMVCパターンです。
##どんなものなの？
MVCパターンはコードをModel, Controller, Viewの3つに分けます。この3つはそれぞれ役割分担させます。
###Viewの役割
ブラウザに表示される部分です。ASP.NETならCSHTML, JavaならJSPがこれに当たります。
###Modelの役割
データの管理を担います。また、データは最終的にはDBと受け渡しを行うのですが、Controllerで扱う形とDBの形の仲介を行います。ASP.NETのViewModelはDBのカラム一覧ではなく、ControllerやViewで扱いたい形式になってます。
JavaではBeanなどがこれに相当します。
###Controllerの役割
ViewやModelへの命令を担います。
どのViewに渡すのかやどのモデル、ひいてはテーブルを検索しているかを記述します。
## なにがメリットなの?
まず、なによりも読みやすいです。コードを分離させているので、どこに何が書いてあるかのわかりやすいし、辿り着きやすいです。さらに修正が簡単になります。役割分担をさせているので修正部分が少なくなったり、明確にしやすくなります。
###肥大化の防止のために
MVCパターンで設計を行うときにControllerが肥大化しないようにModelの検討を行ってください。ControllerだけでViewに渡したいデータ形式とDBに渡したい形式の両方の変換や加工を記述するのはやめてください。例えば、Modelを作り直してViewModel、Modelを切り分けるなどしてください。
久々に大量のコンポジション修正した

#大量のコンポ内のテキストの行揃え変更しなきゃって時はこれ使って！

```jsx
lng = app.project.selection.length;

for ( var i = 0; i <lng ; i++ ){
    //$.writeln(app.project.selection[i].name);
    myLayer = app.project.selection[i].layer(1)
    var mySourceText = myLayer.property("ADBE Text Properties").property("ADBE Text Document");
    var myTextDoc = mySourceText.value;
    var center= ParagraphJustification.CENTER_JUSTIFY; 
    myTextDoc.justification = center;
    mySourceText.setValue(myTextDoc);
}


```

使い方はプロジェクトパネルでコンプ対処のコンポジションを選択するだけ。
とりあえずテキストレイヤーの参照はインデックス１番の場合なので、各々変えてもらえればGood!!

さすがに600個超えのコンポジションを手作業でやるのはね～。
スクリプト覚えておいて良かった。


#つでに大量にコンポジションを複製するやつ

```jsx
var dupNum = 617;
app.beginUndoGroup("dup");
    for ( var i = 1 ; i < dupNum-1 ; i++){
        app.project.selection[0].duplicate();
    }
app.endUndoGroup();
```
npm versionでアルファ版やRC版を作成する

Node.jsのプロジェクトでは`npm version`コマンドでバージョンをインクリメントできます。package.json, package-lock.jsonの書き換えと、Gitタグの追加が自動化されます。よく使われる`major`, `minor`, `patch`の他に、`pre*`というプレリリース用のオプションが実装されています。

以下の動作確認はnpm v6.14.5で行いました。

## 次期バージョンのアルファ版作成
```sh
# 1.2.3 => 2.0.0-alpha.0
npm version premajor --preid alpha
```

`premajor`を指定すると、次期メジャーバージョンのプレリリース版となります。このとき`--preid`オプションを指定すると任意の接頭辞（この場合は`alpha`）が付加されます。接頭辞を指定しなかった場合は`2.0.0-0`となりました。

## アルファ版の中でのインクリメント
```sh
# 2.0.0-alpha.0 => 2.0.0-alpha.1
npm version prerelease
```

プレリリース部分の番号を上げるには、`prerelease`を指定します。この場合は`--preid alpha`を指定してもインクリメントされます。ただ`--preid`なしの方が`beta.0 => beta.1`や`rc.0 => rc.1`のときでも同様に動作するので、ミスが起こりにくそうです。


## アルファ版からRC版に格上げする
```sh
# 2.0.0-alpha.1 => 2.0.0-rc.0
npm version prerelease --preid rc
```

2.0.0のプレリリースであることには変わらないので`prerelease`を指定し、`--preid`オプションでアルファからRCに変更します。自動的に`rc.0`がセットされました。[Semver](https://semver.org/)ではプレリリース版の接頭辞はアルファベット順に解釈されます。（`2.0.0-alpha.1` < `2.0.0-rc.0` < `2.0.0`）

## 正式版のリリース
```sh
# 2.0.0-rc.0 => 2.0.0
npm version major
```
上記のコマンドで動きましたが、引数は`minor`でも`patch`でも同じ結果でした。そもそもバージョン番号は上がってないのでどれもしっくり来ません。明示的に`npm version 2.0.0`を実行してもいい気がします。
Ubuntu18.04でターミナルが開かなくなった

完全Ubuntu初心者です。
下手したらプログラミングとかもあんまわかってない方。
エラーにぶち当たって数時間ウンウン考えたんですがなんか解決したんで残しておきます。
あってんのかこれ...


##実行環境

```
$ cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.4 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.4 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
```

##起こったこと
pythonのコードをVS Codeで動かそうとしたら、pylintがインストールできないとのこと。
pipが入っていないと言うので、入れました。ついでにpip3も。
そしたらpythonに関してpermittion deniedとかエラー吐いたんで（覚えてない）おかしいな〜と。
apt updateもupgradeもできない。


...気づいたら、

・ターミナルが開かない
・右上に赤い丸のマーク（標識の停止マーク）が出て、「A problem occured when checking for the update.」と出ました。
ReferenceとかInfomationとか、カーソルを載せると出てくるのですが、いずれを押しても何も起こらず...

めちゃくちゃ困ったので色々ネットで調べましたが...全く解決しない。

##解決方法（ざっくり）

とりあえず、ターミナルが動かんのでVS Codeのターミナルを起動して対処。

調べていろいろ試したんですが、全体的にエラーしか吐かないのでここには書きません...
全部Ubuntu16.04の記事だったからな...

で、とりあえず18.04の記事見つけたのでそれどおりに実行してみる。

```
$sudo apt-get --reinstall install python3-minimal
```

ソースはこれ。
[command-line — Ubuntu 18ターミナルが開かない](https://www.it-swarm-ja.tech/ja/command-line/ubuntu-18%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%8C%E9%96%8B%E3%81%8B%E3%81%AA%E3%81%84/998292801/)


エラー返ってきました。

```
bash: /usr/lib/command-not-found: /usr/bin/python3: bad interpreter: Permission denied
```

このエラーが結構どれ試しても返ってきたので、このエラー対処をすることに。
まだ試してないコード見つけたのでぶち込む。

```
$sudo chmod 777 /usr/lib/command-not-found
$sudo chmod 777 /usr/bin/python3
```
ソースは以下。
[python-3.x - Ubuntuログインループと悪い通訳が毎回私はsudoを呼び出します](https://stackoverrun.com/ja/q/11285054)

で、以下も実行してみる。

```
$sudo dpkg --configure -a
Setting up python3-minimal (3.6.7-1~18.04) ...
```
たしか、python3-minimalをreinstallしようとしたらエラー吐いたので、調べたら上記のコードに行き着いた気がする。
（↑どのサイト見たかは忘れてしまった）

そしたら、エラー吐かなくなった！出力が変わった！
これはまさか...

```
$sudo apt update
Hit1: ...(略)
Fetched 88.7 kB in 2s (48.7 kB/s)
Reading package lists... Done
Building dependency tree       
Reading state information... Done
All packages are up to date.
```

できました！
無事、ターミナルも開くようになった...めちゃくちゃめでたい...

正直このやり方が正しいのかもよくわかっていないのでもしアレなら優しく教えてくださると嬉しいです。
なにぶん、検索→入力しかできませんので...
No route matches [GET] になる原因がフロント要素のjsにある謎

###備忘録メモ。都度更新

#POSTメソッドをとって欲しいのに、No route matches [GET] になる原因がフロント要素のjsにあるってのが謎だったのでまとめる。


##バックエンドからフロントまで結合しているから

railsはバックエンドからフロントエンドまで(一部インフラも)すべてが設計的に結合しているというのが特徴があるみたい。こういうフレームワークを**フルスタックフレームワーク**と呼ばれている。

で、フルスタックフレームワークであるrails全部一個のフレームワークで担っているから、railsの一部であるjs(rails-ujs)は同じくrailsのサーバサイドのコードが吐くHTMLと設計的に結合しています(具体的にはHTMLのdata-method属性をrails-ujsが読み込んでいる)。


##簡単に言うと???

railsの内部でフロントエンドとバックエンドが勝手に結合してしまっているので何も知らなくてもいろいろなことをよしなにやってくれる一方で、仕組みを知らないとトラブルシューティングが難しく、railsの推奨する方法の外に行くと大幅に困難になるという問題がある。


う〜ん。とりあえず記録として残して内容を更新していくようにする
Vuejs にてhtmlタグのlangプロパティの値を切り替える方法

# 本文の言語に合わせて、htmlのlangプロパティの値も変更しなきゃ！と思った時
Vuejsで複数の言語に対応したサイトを開発しているところで、本文の言語が切り替わる際に、合わせてhtmlタグのlangも変更しなきゃとふと思った方もいると思う。だが、htmlタグはapp/public/index.htmlにあって、どうすればと思うだろう。その方々に方法を共有します。

＊ちなみにlangプロパティの値を変更しなくても特に影響や問題は無いらしい。
しかし、htmlのlangと本文の言語が違う（例：lang='ja'だが、本文内容：Qiita is very goodのように英語）ことにより、ブラウザで「このページを翻訳しますか？」と聞かれる時があるので、langを変更しておくのは良いとのこと。

## 環境の整理
- 開発環境：Vuejs
- 多言語対応のためのプラグイン：Vue i18n
- 今回例で見せる多言語は３つ：<br>
　日本語：lang = 'jp',<br>
　英語　：lang = 'en',<br>
　韓国語：lang = 'ko',

##方法
1. App.vueを開いて、watch オプションを使用しよう。
2. 'i18n.locale'をモニタリングし、切り替わった言語を取得する。
3. handler内で直接コードを書いても構わないが、今回はsetHTMLlangというメソッドを作る。
4. setHTMLlang内にて、言語（=value変数）を判定し、<br>document.get...で取得したhtmlのlangプロパティの値に、jp, en, koをそれぞれ付与する。

**完成コード**

```App.vue

export default {
  name: 'App',
  watch: {
    '$i18n.locale': {
      handler (value) {
        this.setHTMLlang(value)
      }
    }
  },
  methods: {
    setHTMLlang (value) {
      if (value === 'jp') {
        document.getElementsByTagName('html')[0].lang = 'jp'
      } else if (value === 'en') {
        document.getElementsByTagName('html')[0].lang = 'en'
      } else if (value === 'kr') {
        document.getElementsByTagName('html')[0].lang = 'ko'
      }
    }
  }
}
```

＊今回はVuejs環境下での実例だったが、
watchオプションのような機能（モニタリング）が備わっていて、javascriptが使用できる環境下では少しコードを変更し応用できると思う。
Vuetifyでよく使うJavascriptチップス

##v-selectのitemsは配列のみ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/1ad65754-76f7-b432-fa1a-e24605c9f4c6.png)

しかも、text/valueというkeyの指定付き。
でもAPIから取ってきたデータはオブジェクトの場合。

取ってきたデータ

```js
api_data = {
 "id1":"hoge",
 "id2":"huga",
 "id3":"hogehoge",
}
```
を

```js
select_items = [
 {
  text: "hoge",
  value: "id1"
 },
 {
  text: "huga",
  value: "id2"
 },
 {
  text: "hogehoge",
  value: "id3"
 }
```
にする状況の場合。


```js
select_items = Object.keys(api_data).map( key => {
 return {
  text: api_data[key],
  value: key
 }
});
```

for in　を使うと

```js
let select_itemse = [];
for(var key in api_data){
 select_itemse.push({
  text: api_data[key],
  value: key
 })
}
```

個人的にはmapを使った方がわかりやすいけど、for inは他の言語を触っている人にはわかりやすいと思う。

##キーが異なる場合

下記の様なデータの場合

```js
api_data = [
 {
  "id":"id1",
  "title":"hoge"
 },
 {
  "id":"id2",
  "title":"huga"
 },
 {
  "id":"id3",
  "title":"hogehoge"
 }
}
```

item-text,item-valueプロパティを使います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/65643/785d0147-d33c-a07d-4b3c-081575665af4.png)

```html
<v-select 
 items="api_data"
 item-text="title"
 item-value="id"
/>
```
UE4でC++クラスを親に持つBPクラスを他のプロジェクトに移行する

# 背景
UE4でC++クラスを親に持つBPを他のプロジェクトに移行すると、
　親クラスを見失ってBPをコンパイルできなくなる（そもそも開けなくなる）ため、
　　親のC++クラスも一緒に移行しましょう。というお話。

# 参照URL
フォーラムにドンピシャの答えがありました。助かった…
https://forums.unrealengine.com/development-discussion/blueprint-visual-scripting/24493-migrate-code-based-blueprint

# 手順
 -1. C++ファイルをコピペ
元プロジェクトの必要なC++ファイル(.h, .cpp)をエクスプローラ上で移行先プロジェクトにコピーします。

 -2. VSプロジェクトを更新
NewProject.uprojectを右クリック → Generate Visual Studio project files
　でVisual Studioに新しいファイルたちを認識させます。

 -3. ヘッダーファイルを修正
ヘッダーファイル内のOLDPROJECT_APIをすべてNEWPROJECT_APIに置換します。

 -4. コンパイル
ここまでの作業でVisualStudio上でビルドが通るか確認して一安心しましょう。

 -5. Config/DefaultEngine.iniの編集
DefaultEngine.iniにリダイレクタを追記します。

```
[CoreRedirects]
+ClassRedirects=(MatchSubstring=True,OldName="/Script/OldProject",NewName="/Script/NewProject")
+EnumRedirects=(MatchSubstring=True,OldName="/Script/OldProject",NewName="/Script/NewProject")
+FunctionRedirects=(MatchSubstring=True,OldName="/Script/OldProject",NewName="/Script/NewProject")
+StructRedirects=(MatchSubstring=True,OldName="/Script/OldProject",NewName="/Script/NewProject")
+PackageRedirects=(OldName="/Script/OldProject",NewName="/Script/NewProject")
```
　　これでスクリプト内のプロジェクト名をNewProjectに読み替えてくれるようになります。
　　　MatchSubstring=Trueがミソで、個別のファイルを指定しなくても機能します。

 -6. 晴れてBPの移行
OldProjectをUEエディタで開いて
　BPを右クリック→アセットアクション→移行　でNewProjectのContentフォルダにBPをコピー

 -7. NewProjectを開いて参照関係が崩れていないか確認
　やったー( ;∀;)　3日くらい悩んだ…
Python FastAPIの入門


# はじめに
Tornadoの紹介記事を書いていて、APIServerとしても良いよ的な私感を述べたのですが
APIServerならこの、FastAPIもとても良いので記事にしてみました

## 対象
フルスタックエンジニア、フロントエンジニア、これから勉強しようと思っている人、Pythonが好きな人
python3.6以上がインストールされていること

## ゴール
インストール〜簡易的なJSONを出力できるまで
Swaggerでの表示

# FastAPIとは
後発なWebFrameworkだけあってモダンな機能、パフォーマンスの高さを意識したものとなっている

以下[公式](https://fastapi.tiangolo.com/)
- 高速：NodeJSやGolangと同等のパフォーマンス
- 開発効率UP
- 簡単：使いやすく学習しやすいように設計されている
 （ドキュメントを読む時間が短縮・・・英語ですけどね
- 自動インタラクティブドキュメント(Swagger UI)


# インストール
FastAPIのインストールはpipのみ

```
$ pip install fastapi uvicorn
```
pipってとても優秀なやつだと、毎回思います(コピペ)
今回はASGI Serverになるuvicornもinstall

# Hello World
これもまぁ公式なのですが

```python:main.py
from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}
```

## 起動＆閲覧
ターミナルで

```
$ uvicorn main:app --reload --host 0.0.0.0
```

reloadオプションはソース変更時自動的にreloadしてくれるもの
hostオプションに0.0.0.0を指定してるのはDockerやVMで起動し、PortForwardするおまじない

詳しくは[ここ](https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46)など

![fastAPI_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/ebd52f35-b239-b119-00a2-af17993890f6.png)


# simple JSON

さらに、ちょっとコードを加えることで簡易的なAPIっぽくしてみます
localhost:8000/docs にアクセスするだけでSwaggerがみれてしまうんですね

## ソース

```python:main.py
from fastapi import FastAPI
from typing import Optional

app = FastAPI()

@app.get("/")
def read_root():
    return {"Hello": "World"}

@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

@app.get("/booklist")
def read_books():
    books = [
        {'name': 'book1', 'price': 1500},
        {'name': 'book2', 'price': 1800},
        {'name': 'book3', 'price': 2300},
    ]
    return books
```


![fastAPI_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/d644452c-9f0e-ccf6-0973-4342b8e0ef99.png)
![faseAPI_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/8d53859c-b47c-5f9c-64ff-b4215d4621ef.png)
OSS-DB Silver合格したので勉強方法や反省点まとめてみた

##はじめに

2020年5月にOSS-DB Silverを受験しました。結果は不合格でした。
その2ヶ月後の7月に再受験して合格できました。

その時の勉強方法や反省点などをまとめてみました。

##OSS-DB Silverとは

オープンソースデータベースに関する知識を有し
データベースの運用管理・開発ができることを証明する資格です。
さらに上の資格としてOSS-DB Goldがあります。

参考：[OSS-DB Silverについて](https://oss-db.jp/outline/silver)

##筆者の前提知識

SELECT文やDELETE文などのDMLを多少知っている程度の初学者です。

##教材・勉強期間

勉強期間：1回目、2回目の受験合わせて約3ヶ月

OSS-DB認定教材

- [OSS教科書 OSS-DB Silver Ver2.0対応](https://www.amazon.co.jp/gp/product/4798162558/)

ネットの問題集

- [OSS-DB対策問題集](http://oss-db-taisaku.net/)
- [ITトレメ OSS-DB技術者認定試験 Silver 過去問題一覧](https://jibun.atmarkit.co.jp/scenter/ittrain/125_cal.html)

##受験1回目の勉強

- まず、最初に認定教材の参考書を読み進めました。
- 一通り読んだ後は参考書についていた模擬問題とネットの問題集を解きました。
- わからないところは参考書やネットで調べました。

問題を解いて調べて、解いて調べての繰り返し作業です。

##受験1回目

約1ヶ月の勉強期間を経て5月に1回目の受験を行いました。

最初は、順調に解けたのですが途中から、
わからない問題が増え、当てずっぽうで答えることが多くなり
結果、合格点まで取ることができず、不合格となりました。

##反省点

不合格となった要因としては「出題範囲をきちんと確認しなかった」ことが大きかったです。

これは私の勝手な思い込みだったのですが参考書を読んでいれば出題範囲は網羅できると思っていました。
しかし、出題範囲にあった

- PostgreSQLのリリースサイクル
- vacuumdb

などの細かな部分は参考書に説明がなかったりするため
勉強が不足しているところはないか出題範囲をきちんと確認することが重要でした。

##再受験に向けて取り組んだこと・受験2回目の勉強

最初に、出題範囲を確認して参考書に説明がなかったものを探しました。

- [OSS-DB Silver ver2.0受験対策](https://oss-db.jp/outline/silver)

そこからは、

- 出題範囲の中で勉強していなかった箇所の勉強
- 試験を受けて理解が不足していた箇所の勉強

この2つを重点的に行い、また、これに加えて出題範囲を見て重要度の高い項目の勉強もしました。

##受験2回目

自分の思い込みにも気付き、不足していた部分の勉強もして2回目の受験です。

開発/SQLでわからないところもありましましたが、一般知識・運用管理が
多少はできていたのでなんとか合格することができました。

##まとめ

試験対策としては教材を何度も読んだり問題集を繰り返しするのが常套手段だと思います。

それに加えて学んだことをアウトプットしていくことで、より理解が捗るのではないかと思います。

アウトプットした方が良いと書きましたが私自身、今回の試験ではアウトプットが全然できていなかったです。
アウトプットすることで知識の整理もできるので今後、記事を書くなどして実践していきたいです。
display(ImageMagick) で画像拡大縮小や輝度調整するメモ

Linux(Ubuntu 18.04) で手っ取り早く画像出すために ImageMagick `display` を使っている(nautilus(?) では表示できない画像フォーマットを表示したいとか. e.g. 32bit FP TIFF 画像)

画面出したあとに画像拡大縮小表示したい.

`display` だと検索性が低いですが, 

https://codeyarns.com/2017/02/20/imagemagick-display/

```
/: Rotate by 90 degrees
<: Zoom out
>: Zoom in
```

で zoom できました!

## 輝度など調整したい

画像暗めとか(16bit 画像な RAW 画像([0, 1023])とか), 白飛びめとかするとき,

`Shift + N` でヒストグラム計算して正規化してくれます.
(しかし, ダイナミックレンジ大きい画像だとうまくいかない)

`Shift + L` で輝度を調整できます(ただ一度に設定できるのは `200%` まで).
ロボットが安定して働いてくれない②

# 完成した直後は安定しない…

RPAでいろんな作業の自動化に取り組んでいるのですが、ロボットを完成させた直後って本当に安定して動かないものなんですね。ここまで安定して運用するのにパワーがかかるとは全然思いもせず。なんだか自動化を前提に巻き取った作業がただただ自分が担当することになって作業負荷が上がっているだけのような。もう少し、事前に起こりうるエラーを把握できていればそれを前提にロボットを作成するのですが、今のところ起きたエラーを順番につぶしていくやり方。経験を積んでコツをつかんでいくしかないのでしょうか。

# ロボット作りのコツ
ここ1か月くらいのロボット作成において考えたコツを整理しました。整理って色々考えながら行うので、いい方法が見つかるかもしれないという期待も込めて。

## エラーは発生するもの
エラーが発生しないように作成していましたが、無理です。エラーを出さないようにすることはあきらめました。ロボットは完成直後は一定のエラーは発生するものだ、エラーが起きた時のリカバリが面倒にならないようにする、という思考に切り替えました。

## ログを出す
ログを出していないと、エラーが発生したことはわかるのですがどの手順で発生したのかを把握するのにものすごい時間がかかることが多いです。ロボット内の手順をいくつかのステップに分けて、エラーが発生したのはこのステップを通過してからの手順だな、とわかるようにしました

## エラーがおきたときのロボットの状態を把握する
エラーが発生した手順がわかっても、なぜその手順でエラーとなったのかがわからないことが多いです。そこでエラーが起きた時にロボットが動いていたPCの画面の状態はどうなっていたのかを画面キャプチャを取って確認できるようにしました。画面キャプチャを取るようにしたことで、何が原因でエラーになったのかを把握できるようになりました。

## ロボットの手順数は極力少なくする
たとえばメールの添付ファイルを保存、ファイルの内容をシステムへ登録する、という作業を自動化した場合、以下の2つのロボットに分けます。

- メールの添付ファイルを保存するロボット
- ファイルの内容をシステムへ登録するロボット

1つのロボットの場合、ファイルの内容をシステムへ登録する作業がエラーになったときのリカバリは添付ファイルを保存する作業からやらないといけないです。しかし、2つに分けてしまっているとファイルの内容をシステムへ登録する作業だけを再実行するだけでリカバリは完了です。

# まとめ
エラーが出ることを前提にロボットを作るのは、いろいろやらないといけないことや考えないといけないことがあり多少面倒ですが、あとからエラーの対応にかかる時間を考えたらやっておいたほうがいいなと考えます。エラーを前提にやることはほかにもありそうなので、新しくやり方を発見したらアップします。

# あるある？
モニタで人間がロボットが実行しているのを見ていない場合エラーになるんだけど、エラーになったからモニタで人間がロボットが実行しているのを見ている場合エラーにならないことがよくあります。
CISM試験に合格するために実施したこと

ISACAのCISM(Certified Information Security Manager)試験に合格(2020/07/07)した際に利用した教材と勉強法です。CISMの詳細については[こちら](https://www.isaca.org/credentialing/cism)を参照。

# 背景
これまで取得したセキュリティの資格は、CEHとCSSLP。CEHの勉強法は[こちら](https://qiita.com/lorenpasserine/items/df4556bdab424a3cd71f)、CSSLPの勉強法は[こちら](https://qiita.com/lorenpasserine/items/f499a6a63dae9c54395b)。英語力は TOEIC 800後半くらい。

# 役に立った学習教材
試験勉強にあたって利用した学習教材です。

### [CISM Review Questions, Answers & Explanations Database](https://www.isaca.org/education/online-tools-and-training/xmxcm1512m)
ISACA公式のオンラインの問題集データーベースですが、これが素晴らしかったです。海外の試験対策サイトでもこれ一択と言っていいほど強く推奨されています。12ヶ月のサブスクリプションで1000問あります。オンラインベースのため、勉強場所を選びません。
具体的にはWebベースの問題集の中で得意なドメイン、不得意なドメイン、試験を受験できる状態にあるかなどを視覚的に表示してくれます。受講者にとって最適な問題、前回間違えた問題、よく間違えた問題、弱いドメインなどを選択して強化することもできます。
また、正しい選択肢だけではなく間違えた選択肢に対してもなぜ誤りかについて詳細な解説があり、この問題集だけでも理解が深まります。

ただし上記のWebベースの問題集は英語しかありませんので、どうしても日本語でという方は書籍版の方を利用することになります。また、12ヶ月のサブスクリプションですので、失効した場合は参照することはできません。試験の準備にそこまで時間を要することはないと思いますが。

当然ですが、本番の試験では同じ問題は出ないと思ったほうがよく、答えを覚えても意味はありません。問題や解説を読んで深く理解するように心がけると本番で対応できると思います。
★★★★★(星5がMax)


### CISM レビューマニュアル 第15版
公式の教科書です。勉強は英語でするつもりでしたが、試験は日本語で受験予定でしたので教科書だけは日本語版を購入しました。上記の問題集の出来が良すぎて、正直いって教科書は見劣りします。細かい文字でびっしり書かれており読みやすいものではなく翻訳もたまによくわからないところがありますが、それでも日本語での学習教材は貴重です。試験前日にざっと見直しましたが、一通り勉強した後だと、それなりにまとまっているかと思いました。[ISACA](https://www.isaca.org/)にて購入できます。
★★★★☆


## その他の学習資料
公式問題集が素晴らしすぎますが、その他に私が試した学習資料です。

### [UdemyのThor PedersenのCISM Video Boot Camp](https://www.udemy.com/course/cism-domain1-2/)
UdemyでThor Pedersenという人が提供しているVideo Boot Campのコース。Domain1からDomain4の4コースとPractice Testをやりました。公式以外のリソースからインプットをしておきたかったのと、初見の問題集でどれくらい取れるかを確認したかったからです。講座も良いと思いますが、講座に付属する資料も詳細です。CISMの教材としては技術的な要素が多い印象ですが、悪くはないと思います。
★★★★☆

# その他
試験や学習によって得られるものなど。

### 試験を申し込むまで
前述[CISM Review Questions, Answers & Explanations Database](https://www.isaca.org/education/online-tools-and-training/xmxcm1512m)には、進捗や正解率によって変動するREADYSCOREというスコアがあり、これが80%以下だと受験してもパスできないだろうという目安になります。答えを覚えないようにして1日50問-100問を解き続け、90%からなかなか落ちなくなったところで受験の申込みをしました。

### 試験について
試験は4時間で150問です。知識よりも理解の深さやセキュリティに対する全般的な態度が問われるテストだと思いました。NIST SP 800などをもっと読んでおいたら良かったと思ったりしました。
注意点ですが、日本語で受験した場合、英語の原文は表示されません。訳された日本語の意味がこなれておらず、可能なら英語を参照したい問題も何問かありました。英語の得意な人は英語で受けても良いかもしれません。私は日本語の方が速く読めますし、問題を正確に理解できると思いましたので、その点は割り切って日本語で受験しました。
1時間半で一通り解き、1時間半で見直し、これ以上やってもスコアは変わらないと思ったところで終了しました。画面で合否結果が速報で出ますが、紙ベースでの結果は出ません。正確な結果は詳細なスコアとともに10日ほど経ってからEmailで通知されます。

### CISMの学習で得られるもの
これまで自分に不足していた、ビジネスがあってのセキュリティ、組織としてのガバナンス、といった考え方が身についたと思います。CISOが何を考え、何を実施し、何に責任があるのかという点についての理解が深まりました。逆に言うと、それらが理解できていないと試験をパスすることは難しいと思いました。
エンジニア出身ですと問題をテクニカルに解決しようという考え方になりがちだと思うのですが、テクニカルな解決法も単なる手段の一つであり、組織もしくはガバナンスで管理していくという考え方がよく理解できました。
Kubernetes中級(2)：Pod-ReadinessProbe, LivenessProbe概要

<img width="851" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/2d568e60-9156-4e77-f5f8-4d89fb97a815.png">
Podを作成すると、その中にContainerが作成されてPodとContainerの状態がRunningになって、ContainerのAppも正常に稼働される。
そしてPodとServiceが接続されてServiceのIPアドレスからユーザーがリアルタイムでアクセスが可能になる。
<img width="855" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/b944cce4-a4e2-786c-2c1a-b9acfb21a3a3.png">
上の図のように1つのServiceに2つのPodが繋がっていて50％ずつTrafficを分散していると仮定したとき、もしNode2サーバーが落ちた場合は全てのユーザーはNode1に接続されることになる。
そして落ちたPodはAutoHealing機能によって他のNodeであるNode3に再生成される。
再生成される間にContainerはRunning状態になってServiceと接続されたが、Appがまだ起動中の場合がある。
Serviceと接続しているのでTrafficがPod2の方に流れて行くとAppはまだ起動中なのでTrafficエラーになってしまう。
<img width="857" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/601e1d08-8d00-b5b1-cb96-d3462744778b.png">
Podを作成するときに「ReadinessProbe」を指定すると上記の問題を避けることができる。
「ReadinessProbe」はAppが起動されるまでにはServiceと繋がらないようにしてくれるのでPod2の状態はRunningであるが、TrafficはPod1に行くようになる。
AppがRunning状態になったらServiceと接続されてTrafficは50:50になる。
<img width="879" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519254/599a8e2c-79b7-44c3-9c80-949c672d3c3f.png">
Pod2のAppは落ちたがPod2はRunning状態、例えばWeb ServiceのTomcatは正常に稼動しているが、その上で動くAppがメモリオーバーフローなどの問題で500サーバーエラーを返すことがある。
Tomcat自体のプロセスが落ちたのではなく、Tomcat上で稼働しているサービスの問題なので、Tomcatのプロセスを見ているPodはRunning状態になるのでTrafficは入ってくる問題が発生してしまう。
この時、Appの障害を検知してくれる機能が「LivenessProbe」だ。
Podを作成するときに「LivenessProbe」を指定すると、そのAppに問題が発生した場合はPodを再実行させて、一瞬のTrafficエラーは発生するが、エラー状態が続くのを防いでくれる。
安定したServiceを提供するために「ReadinessProbe」を使ってAppが稼動している間のTrafficの失敗をなくして、「LivenessProbe」を使ってAppの問題を検知して障害状態が長くなることをPodを作成するときに設定することで防げる。
【Mac】Macでスクリーンショットを取得する


<< [【Mac】MacOSの基本操作を覚える](https://qiita.com/hiroyuki-eguchi-0731/items/99a0d771fda18adac9f0)

# Macでスクリーンショットはどうやって取得するのか？

いきなり初歩的なことがわからなかったのでまとめます。。。

WindowsではキーボードにPrintScreenボタンがあって、それを押したらクリップボードに取得できてペイントで保存すれば取得できますが、それに相当しそうなボタンがどうも見当たらない。

調べてみると２つの方法があるようです。

- 「shift」「command」「3」の 3 つのキーを同時押し
- 「shift」「command」「5」の 3 つのキーを同時押し

何が違うんだろう？

## 「shift」「command」「3」の 3 つのキーを同時押し

画面右下に取得したサムネイルが表示された。

サムネイルをクリックするとペイントらしきアプリで表示できる、と。
しばらく放置していると勝手にデスクトップにファイルとして保存されるんですね。

ザクッと全体をとりたいときはこれでよさそうですが、ウィンドウだけ取得したいとき（WindowsでいうところのAlt+PrintScreen）には不便ですね。

## 「shift」「command」「5」の 3 つのキーを同時押し

そういうときに活用するのがこっちですよ、と。

画面全体を取得する、選択したウィンドウを取得する、選択部分を取得するといったことができるんですね。
矩形を選択してマウスをぽちっとクリックすると取得できました。

オプションを見ていると、保存先設定やタイマー、ポインタの表示などもできるようです。

結構柔軟に対応できますね。

---

2020-07-27 初稿
@quantity

個人的なメモ
https://www.it-swarm-ja.tech/ja/java/spring-boot%E3%81%AF2%E3%81%A4%E3%81%AE%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%BC%E3%82%B9%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%A6%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B/1053464638/
【Mac】MacOSの基本操作を覚える

長年仕事でWindowsOSは使っていますが、ひょんとしたことからMacOSを使ってみたくなったので中古品を購入しました。
せっかくなので、自身の体験談が少しでも皆様のお役に立つのであれば、ということでまとめてみます。

# 目標

今回の記事は「MacOSを全く触ったことない人が気軽に触れるようになること」を目標に書いていきます。
具体的にはMacOSでも仕事できる感じがしてきた、、、くらいを目指しますかね。

# スペック

メモリ8GB以上、ストレージは256GB以上で、なるべく最新機種で手ごろな値段・・・と決めて探すと店頭に「MacoBook Air 13インチ MMGG2J/A Early 2015」なるものがあったので購入しました。

| 項目 | スペック |
|:-----------------|:------------------|
| プロセッサ | Core i5 1.6GHz | 
| メモリ | 8GB |
| ストレージ | SSD 256GB | 
| ディスプレイ | 13.3インチ(1440 x 900) |
| OS | macOS Catalina 10.15.1 |

メモリとストレージに関しては仕事でも利用しているWindowsOSと同じにしたい、くらいの感覚です。
正直、OSは何がよいのかわかっていないので気にせず。

# コンテンツ

少しずつ増やしていきます。

- [【Mac】Macでスクリーンショットを取得する](https://qiita.com/hiroyuki-eguchi-0731/items/eec44c1ce6d16253b1e9) (2020-07-27追加)
- [【Mac】Macの時計のズレを修正する](https://qiita.com/hiroyuki-eguchi-0731/items/01c28cbd6c1091ce4bec) (2020-07-27追加)
- [【Mac】MacのWiFiを設定する](https://qiita.com/hiroyuki-eguchi-0731/items/05aac23e143a450f43aa) (2020-07-27追加)
- [【Mac】MacのOSアップデートを実施する](https://qiita.com/hiroyuki-eguchi-0731/items/983d3cb47c4ed1d4429f) (2020-08-01追加)
- [【Mac】Macのデスクトップにフォルダを作成したい](https://qiita.com/hiroyuki-eguchi-0731/items/0c3be7c6738ecbbe2d96) (2020-08-29追加)
- [【Mac】Macの日本語入力ができなくなった](https://qiita.com/hiroyuki-eguchi-0731/items/865749d53f481b1c040e) (2020-12-31追加)
- [【Mac】Macでコピー＆ペーストを行う](https://qiita.com/hiroyuki-eguchi-0731/items/b9bb02884acb507a2f19) (2020-12-31追加)
- [【Mac】MacのデスクトップにあるDockを隠す](https://qiita.com/hiroyuki-eguchi-0731/items/0ff679b253faef6353c0) (2021-01-02追加)
- [【Mac】Macのアプリケーションを削除する](https://qiita.com/hiroyuki-eguchi-0731/items/e29be00cb9464af9701f) (2021-05-02追加)
- [【Mac】Macのマウスホイールが逆に動く](https://qiita.com/hiroyuki-eguchi-0731/items/a0d78a737abac6a1dbd7) (2023-03-19追加)
- [【Mac】Macのひらがなと英語の入力切替方法](https://qiita.com/hiroyuki-eguchi-0731/items/bb80a6ba04c43ed2e987) (2023-08-07追加)

---

2020-07-27 初稿
2020-07-27 「【Mac】Macでスクリーンショットを取得する」を追加しました
2020-07-27 「【Mac】Macの時計のズレを修正する」を追加しました
2020-07-27 「【Mac】MacのWiFiを設定する」を追加しました
2020-08-01 「【Mac】MacのOSアップデートを実施する」を追加しました
2020-08-29 「【Mac】Macのデスクトップにフォルダを作成したい」を追加しました
2020-12-31 「【Mac】Macの日本語入力ができなくなった」を追加しました
2020-12-31 「【Mac】Macでコピー＆ペーストを行う」を追加しました
2021-01-02 「【Mac】MacのデスクトップにあるDockを隠す」を追加しました
2021-05-02 「【Mac】Macのアプリケーションを削除する」を追加しました
2023-03-19 「【Mac】Macのマウスホイールが逆に動く」を追加しました
2023-08-07 「【Mac】Macのひらがなと英語の入力切替方法」を追加しました
[Github初心者]ターミナルで新しいブランチを作成してマスターブランチとマージする方法

掲示板を作成中、掲示板の基本機能のみ作ってherokuでデプロイした。
ユーザーログインという新規機能安全にデプロイする為に、新機能開発の前にあらかじめgitでmasterではないブランチを作って、テストを行ってからmasterブランチにmergeを行いたい。

##ブランチ作成&そのブランチに切り替え

###$ git checkout -b <任意のブランチ名>
```
Switched to a new branch 'create-users-table-model'
```

##存在するブランチの確認コマンド
###$ git branch
```
* create-users-table-model
  master
```

###ブランチを切り替える
###$ git checkout master
```
Switched to branch 'master'
```

### git checkout create-users-table-model
```
Switched to branch 'create-users-table-model'
```

##新しいDBテーブルの作成

###$ rails g migration create_users
```
〜省略〜
warning: The called method `initialize' is defined here
      invoke  active_record
      create    db/migrate/20200727081835_create_users.rb

```

完成。

ここから開発を行っていく。

###DBに必要カラムを追記して作成

```db/migrate/'date'_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.string :username
      t.string :email
      t.timestamps #created_atなどが自動で追加される
      #passwordカラムはあとから追加する
    end
  end
end
```

###userモデル作成

modelsフォルダの下にuser.rbを追加

```models/user.rb
class User < ApplicationRecord

end
```

###保存。$rails cでuserが作成できるか確認。
AWS RDSについてのメモ

 - 特徴
  - AWSのフルマネージドなRDBサービス。
  - 従来のDBの構築よりすごく楽に運用構築できる。
  - オンプレミスのDBサーバ構築の場合、物理サーバの設置、OSインストール、アップデート、スケーリング、アプリ最適化などが必要になってくるが、RDSはアプリ最適化以外は自動でやってくれる。
  - ちなみにEC2でDBサーバを立てることもできるが、この場合はアップデート、スケーリング、アプリ最適化などは自分でやらなければならない。
  - 高い可用性をもち、マルチAZ（アベイラビリティゾーン）のマスタースレイブ構成でDBを簡単に構築できる。
  - 高パフォーマンスの実現が簡単(例えば複数のRDSインスタンスを立ち上げ、レプリケーションされた読み取り専用のリードDBを起動することができる。）

## 利用可能なDBエンジン
 - MySQL
 - PostgreSQL
 - Microsoft SQL server
 - AmazonAurora
 - MariaDB

## 設定できる項目
フルマネージドなサービスのため、SSHで接続で設定するのではなく、設定グループのパラメータ値で設定する。
 - DBパラメータグループ: DB設定値を制御
 - DBオプショングループ: RDSの機能追加を制御
 - DBサブネットグループ: RDSを起動させるサブネットを制御

## 運用負荷の軽減
 - 自動的なバックアップ
  - 1日１回自動的にバックアップを自動で取ってくれる （**スナップショット**）
  - そのスナップショットを元にDBインスタンス再作成できる（**リストア**）
 - 自動的なソフトウェアメンテナンス
  -  メンテナンスウィンドウで指定した曜日・時間帯にアップデートを自動的にしてくれる。
 - 監視
  - 各種メトリクスを60秒間隔で取得、確認可能 

## セキュリティグループの作成
RDSのセキュリティグループは「EC2」の「セキュリティグループ」の項目ででアクセスに関する制御を設定する

## サブネットグループ
RDSのサブネットグループで作成できる。
DBを構築するサブネットを指定する。

## DBパラメータグループ
RDSのパラメータグループで作成できる。
DBの各種値をここで設定する。

## DBオプショングループ
RDSのオプショングループで作成できる。
例えばプラグインを使いたいときなど


**注意**
・基本的に外部インターネットからのアクセスを防ぐためのプライベートサブネット内に構築する。
・自動バックアップ以外にも手動でその時のスナップショットを取得できるが、手動スナップショットはRDSインスタンスを消しても存在し続け、料金がかかり続ける。
**・RDSインスタンスを削除するときは同時に手動スナップショットも削除する**
1.44 インチ TFT液晶 128 x 128 ST7735 動作確認メモ


1.44インチ液晶を、単価250円程度で購入。以下、動作確認メモ。

１．　製品

FEIYANG
1.44 インチ
TFT液晶
128 x 128
ST7735
https://ja.aliexpress.com/item/32947890530.html?spm=a2g0s.9042311.0.0.36a24c4dJtM5id

1.44" Colorful SPI TFT LCD Display ST7735 128X128 

２．　公式サイト等を探すも、マニュアル等がなさそう。

類似品から、以下を参考にした。

（１）　説明サイト
https://www.instructables.com/id/Using-TFT-144-With-Arduino-Nano/

（２）　ライブラリのURL　（＊）Arduinoを使用
https://github.com/adafruit/Adafruit-ST7735-Library
Adafruit-ST7735-Library-master.zip

（３）　動いたファイル
/Adafruit-ST7735-Library-master/examples/graphicstest/graphicstest.ino 

（４）　動いた様子
https://twitter.com/santarou/status/1287653167304335360?s=20


（５）　接続のメモ
LED → 3.3 V
SCK → D13
SDA → D11
A0 → D8
RST → D9
CS → D10
GND → GND
VCC → 5.0 V

（６）　外観

<img width="554" alt="スクリーンショット 2020-07-27 17.25.21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/854c4a14-6cb1-fe28-bf78-58280697901c.png">

<img width="307" alt="スクリーンショット 2020-07-27 17.25.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/107418/6e48da5d-35cf-87e0-4035-f2524a29c17b.png">


（７）　ソース変更箇所

```graphicstest.ino
  // OR use this initializer (uncomment) if using a 1.44" TFT:
  tft.initR(INITR_144GREENTAB); // Init ST7735R chip, green tab
```
【Java】初心者のServlet理解-②

#目次
- はじめに
- パラメーター(html)
- サーブレット側
- メソッド
    - setCharacterEncoding
    - getParameter
- おわりに

##はじめに
今回はServletを用いて、他<b>htmlファイルからの値受け取り</b>についてまとめます。
前回の[「初心者のServlet理解①」](https://qiita.com/yuji323/items/523dd94041b6cdbba85b)のコードを引き継いでますので、コードをパッと見て「無理。」と思った方は一度戻って確認してみてください～

なお、本記事は
　　・「いまからJavaをやるよ～」
　　・「Javaやってるけどもっかい復習したいよ～」
人向けの雑な内容です。
筆者も鋭意学習中の身なので、内容の正確性は保証しませんが。。。
皆さんの学習の一助(自分の学習のメモ帳)になればと思います。

##パラメーター(html)
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>例題3</title>
</head>
<body>
    <div align="center">
    
        <!-- 宛先URL「sample」で、sample<form>タグ内の入力フォームの値を送信 -->
        <!-- methodに「get」ではなく「post」を指定して送信した場合、-->
        <!-- GET送信ではなく、POST送信が行われる-->
        <form action="sample" method="post" >
            
            <!-- テキストボックスに記述した文字列がパラメーター名「requestParam」の値に設定される-->
            <input type="text" name="requestParam" value="" >
            <input type="submit" name="button" value="送信" >
        </form>
    </div>
</body>
</html>
```
こんな感じのhtmlファイルのとき、
パラメーターとは、formタグ内のinputタグにある<b>nameとvalueの組み合わせ</b>のこと。
パラメーター名「requestParam」でパラメーター値「"(テキストボックスに入力した値)"」が取得できる。

##サーブレット側
↑のhtmlファイル内のパラメータ[requestParam]の値を受け取るためのコードが↓。


```java
package parameterPackage;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ParameterServlet extends HttpServlet {

    // GET送信を処理するにはdoGetメソッドが、
    // POST送信を処理するにはdoPostメソッドのオーバーライドが必要
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws IOException, ServletException {

        // HTTPリクエスト内の文字列を、文字コード「UTF-8」で読み込む（エンコード）
        request.setCharacterEncoding("UTF-8");
        // HTTPリクエストから「requestParam」のパラメータ値を取得
        String value = request.getParameter("requestParam");
        
        response.setContentType("text/html; charset=UTF-8");
        
        PrintWriter out = response.getWriter();
        
        // valueの値を出力
        out.println("<body>" + value + "</body>");

    }
}
```

##メソッド
####●setCharacterEncoding()
```java
request.setCharacterEncoding("UTF-8");
```
HTTPリクエスト内のパラメータ値を、引数に指定した文字コードでエンコードする(読み込む)メソッド。
パラメータの値を日本語として指定する場合、正しく読み取ることができないらしい。(ServletはデフォルトでパラメータをASCIIコードとしか解釈しないため)ので、このメソッドで値を変換する必要がある。


####●getParameter()
```java
String value = request.getParameter("requestParam");
```
GET/POSTで送信(リクエスト)されたパラメータ値を読み取るためのメソッド。
サーブレットのdoGet()/doPost()メソッドの第1引数「HttpServletRequest」が、Httpリクエストに対応しているため、オブジェクトrequestを作成して読み込んでいる。

##おわりに
これ系の知識って、調べ始めると「わからない単語をわからない単語で説明される」現象が普通に起きててかなり困る。
「正確な知識も大事だけど、最初はイメージをつかむことが大事かな～」
とか初心者なりに考えているとことでした。

では。
【Python】lambda式ってどう使うんだろ？？【殴り書き】【初投稿】

#公開理由
・qiitaに挙げるっていう意識高い系の皆様を見て「自分も簡単なことで良いからアウトプットする習慣を作りたい！」って思った為
・『Pythonチュートリアル』の本を読んでいて、いまいち使い方がイメージ出来なかったので

#lambda式とは
・無名関数って呼ばれるやつらしい。
　いつもはdef 関数名():みたいな感じでいろいろとコード組んでいかないといけないんですけど、それを省略して関数を定義出来るみたいです。
　関数を組むための手間を省略出来ていい感じって事らしい。。。（レベルが高い方はそういう恩恵を感じているようですね。。。私はまだ感じれないですね汗）

####●文法

```
lambda 引数: 返り値
```


####●サンプルコード※変数にlambdaを入れるのはPEP8違反なのであれですがわかりやすいので。

```python:test.py
a = 100
b = 50


abSum = lambda a, b: a + b
abSub = lambda a, b: a - b
abMul = lambda a, b: a * b
abDiv = lambda a, b: a / b


print(abSum(a,b))
print(abSub(a,b))
print(abMul(a,b))
print(abDiv(a,b))
```

####●出力結果

```
150 
50 
5000 
2.0
```

#感想
・確かにlambdaを使って書いた方がdefを使って書くより、コードの見た目すっきりしそう。
・処理が単純なものにはlambdaで良いかもしれないが、少しでも複雑になるならやはりdefを使った方が
　最終的に良さそう。。。使用場面限られるのでは？
　（こう思っているのは自分がまだPython初心者だからだろうな(;^_^A）
・lambdaで良い感じの処理を書くことになったら追記してみます。

#2020/7/28追記

PEP8に違反するようなコードで確認してはいかんでしょってことで、
map関数とfilter関数を使ったうえで学び直しました。

【Python】lambda式ってどう使うんだろ？？【殴り書き】【続き-1】
https://qiita.com/sho_cullni/items/e11580c0b9eb47df0879
gist+cacher+pycharmでソースコード管理(snippet)

# 使用するツール

## cacher

- デスクトップアプリケーションを公式からダウンロードしてくる。
- チーム内でソースコードを共有する
- gistへ同期させcacher内のソースコードをアップロードする（cacherがサービス停止したときを考えバックアップ）
- ラベルをつけることで検索を楽にできる
- 複数のファイルを一つのまとまりとして保存できる
    - 一つの機能で複数のファイルにまたがって処理を書かないと行けない場合に便利

## github gist

- pycharmからソースコードをアップロードする
- cacherへ同期させる
- 説明をつけることでpycharmで探すとき楽になる


## pycharm（他のjetbrain製品もOK）

- gistのプラグインはまだbeta版で「get gist機能」の動作がおかしいため使わない（2020年7月現在）
- magistのプラグインを使用します


# ソースコードの探し方

上記の方法だとgistとcacherとpycharmどれからもソースコードは探せますが以下で使い分けできます。

- pycharm
    - コードを書いている最中にすぐにsnippetのコードがほしいとき
- cacher
    - pycharmで見つからなくて検索して見つけたい場合

# ソースコードの登録の仕方

- pycharm
    - 登録したいコードを選択し、右クリックでcreate gistで登録できる

- cacher
    - デスクトップアプリから登録できて、ラベルもつけれる
    - 登録後、gistアイコンをクリックで同期可能
FlutterやDartで独自ライブラリを使うためのpubspec.yamlの書き方


pub.devに登録されているライブラリを使うのはpubspec.yamlにパッケージ名とバージョンを指定すれば自動的に解決してくれる。しかし、Closedな自社ライブラリってどうやって使えばいいのか分からなかったので調べてみた。

# ソースの種類

pubspecでは次の4つをソースとして扱える。

- SDK
- Hosted packages
- Git packages
- Path packages

## SDK

SDKはFlutterくらいしかないので使うのはHosted packagesかGit packages、Path packagesのいずれか。

## Hosted packages

pub.devで使うやつ。

## Git packages

Gitを使えるなら何でもいい。試していけたのはGithubとBitbucket、AWS CodeCommitの3つ。
ref要素は特定のタグを指定する場合に用いる。下記の例ではバージョン指定にしているが、文字列でも大丈夫。

```yaml:pubspec.yaml
...省略
dependencies:
    パッケージ名:
        git:
            url: https://...
            ref: ^1.0.0
...省略
```

## Path packages

ローカルドライブやネットワークドライブ等、直接ファイルにアクセスできる場合の指定方法。path要素にファイルパスを書けばいい。Windowsの場合は「バックスラッシュ」でなく「スラッシュ」で指定したほうがよいと思う。

```yaml:pubspec.yaml
...省略
dependencies:
    パッケージ名:
        path: /path/to/パッケージ名.dart
...省略
```

# まとめ

バージョン管理するから基本的にはGit packagesを利用することになると思うけども、ガチガチのSI案件なら外部にデータを置いたりしないこともあるだろうからパス指定で利用できるのはいいなと思った。
まあ、ガチガチのSI案件でDartなんかを使うことなんてないとおもうけども。

# 参考

やっぱり公式が一番詳しく書いてある。
https://dart.dev/tools/pub/dependencies
PyAutoGUIでリモートワークサボり隊

## 本日の困りごと
リモートワーク中、ベッドでゴロゴロしてると会社のパソコンが一定時間でスクリーンセーバーかかってSkypeとかも退席中になるやん？なんか定期的にマウス動かすとかでなんとかできひんのかな(原文ママ)

## 経緯
元クライアントとLINE(仕事しろ)。
折角のリモートで仕事サボっててもバレないのに、厄介なのが「離席中」表示とスクリーンセーバーだという。
私の困りごとは「まさかLINEで元クライアントからそんな相談受けると思わなかった」コトです。ほんと、LINEのトーク画面貼り付けようか迷いました。

ぱ「なんか売ってるじゃないですか」
客「会社PCにそんなの入れられないでしょうが」
ぱ「えー。じゃあ…そのPCってRPA検証用とかでPython入ってませんでした？」
客「おー！よく知ってるね！」

…というわけでPythonで解決させた話です(仕事しろ)。

## 環境
OS:Windows10
Python3.X

## 今回の解決方法
以下のようなサンプルコードをお渡ししました。
ここでは`sample.py`というファイルとしておきましょう。

```python
import pyautogui as pg
import time
try:
    while True:
        time.sleep(180)
        pg.moveTo(100, 100, 0.5)
        pg.moveTo(100, 200, 0.5)
        pg.moveTo(200, 200, 0.5)
        pg.moveTo(200, 100, 0.5)
except KeyboardInterrupt:
    print('仕事しよ')
```

あとはコマンドプロンプトを起動してPythonを実行するだけ。

```powershell
python sample.py
```

さて。簡単にコードの解説をしておきます。
メインの処理はこの5行。

```python
    time.sleep(180)
    pg.moveTo(100, 100, 0.5)
    pg.moveTo(100, 200, 0.5)
    pg.moveTo(200, 200, 0.5)
    pg.moveTo(200, 100, 0.5)
```

「180秒おきにマウスをぐるっと一周まわす」ということをさせています。
`time.sleep`は「○秒処理を停止させる」関数です。
利用している端末のスリープまでの時間に合わせてカッコ内の秒数を調整しましょう。
(スリープまでの時間より少し短めに設定しています)
`pg.moveTo`はマウスを指定した座標へ動かす処理。サンプルでは0.5秒かけて動かしています。

このメイン処理を

```python
    while True:
```

と書くことで、永久ループさせています。
一度実行した後は、**ずっとこの処理を走らせておくという悪の所業**です。
…とはいえ、Skypeに応答しないといけない時だったり、「やっぱり仕事しようかなー」と思うこともあるはずですし、何より業務終了後はパソコンをシャットダウンしないといけないことでしょう。
なので、この永久ループを以下のコードで囲っています。

```python
try:
## (中略) ##
except KeyboardInterrupt:
```

`try/except`の**例外処理**を利用し、**[Ctrl]+[c]**のキーボード入力をキャッチして永久ループを抜けるようにしています。
~~仕事に戻りたい~~処理を終了させたい時は**[Ctrl]+[c]**を押す…というわけです。

## 参考文献
[退屈なことはPythonにやらせよう ―ノンプログラマーにもできる自動化処理プログラミング](https://amzn.to/3jIJYsA)

`moveTo`周りはこのオライリー本のサンプルコードを利用しています。18章辺りをご覧ください。
Slurmで簡単なステップ実行（逐次実行）


## 要点

Slurmで1つ目のジョブ`job.sh`の実行終了を待ってから2つ目のジョブ`job2.sh`が流れるようにするには、「ジョブ名」を揃えた上で

```
sbatch job.sh
sbatch -d singleton job2.sh
```

とオプションを付けて投入すればよい。ただし、同じユーザー名であること。

## 説明

科学技術計算、いわゆる、シミュ―ションを行う時、スパコンや計算機クラスターを複数人で共用することがあると思います。そんなとき、計算(ジョブ)の順番待ちを管理してくれるサービスはジョブ管理ソフトと呼ばれます。私はフリーながらスパコンなどでも採用実績のある[Slurm]
(https://www.schedmd.com/)を利用しています。

今回は、Slurmを使って計算を投入する際に、**前の計算が終わるのを待ってから次の計算(続きの計算)を実行したい**という場合の簡単な投入方法について紹介します。とても長い計算を、何日にもわたって計算したいが、共用コンピュータなので一回のジョブに時間制限がある場合などに便利です。(一般にステップ実行とか逐次実行とか呼ばれますが、方言のようなもので人によって指すものが違うのでご注意ください。)


Slurmでジョブを投入するには、一般に`sbatch`コマンドを利用します。計算したいジョブの情報(実行バイナリのパスやMPI並列数など)をシェルスクリプト(ここではjob.sh)に記入しておいて、次のように投入します。

```
sbatch job.sh
```

今度は、この計算が終了するのを待ってから実行して欲しい`job2.sh`を投入する場合、普通に`sbatch job2.sh`とすると、コンピュータに空きができれば計算が実行されてしまいます。`job.sh`の計算が終わるまで待つには、次の2つのことをします。

(1) シェルスクリプト内で指定する「ジョブ名」を継続したいジョブで統一する。今回の例では、シェルスクリプト内では`job.sh`と`job2.sh`次のように`#SBATCH -J`の部分にジョブ名を書きますが、ここを揃えます。

```bash
#!/bin/bash
###job.sh および job2.shの中身###
#SBATCH -A project1
#SBATCH -J TestB        #ここのジョブ名を継続したいジョブで統一する
#SBATCH -n 400
#SBATCH -c 2
#SBATCH -o log
#SBATCH -e err
export OMP_NUM_THREADS=2
srun ./apppath
```

(2) 投入時に、継続ジョブの方には`-d singleton`オプションを付ける。

```
sbatch job.sh
sbatch -d singleton job2.sh
```

ただし、1つ目の投入時にはオプションは付けません。


結果として、上記の様にジョブを投入した場合の`squeue`コマンドの出力を示します。`NAME`の欄がジョブ名です。先行した`job.sh`は`TestB (JOBID 108)`です。ステップジョブとして投入した`job2.sh`は`TestB (JOBID 109)`ですが、`(Dependecy)`と表示されています。先行したジョブが終了してから実行されます。
一方で、さらにその後で`TestA (JOBID 110)`を投入しても、ジョブ名が異なるので待つことはありません。

```
 JOBID ACCOUNT        NAME     USER ST START_TIME          NODE NODELIST(REASON
 110   project1   TestA      user1   R 2020-07-27T14:23:19   40 node[289-328]
 108   project1   TestB      user1   R 2020-07-26T23:09:03   10 node[32-71]
 109   project1   TestB      user1   R N/A                   10 (Dependency)
```

## 最後に

Slurmは便利ですので、スパコン以外でも使えます。研究室レベルで計算機クラスターを共有する場合などにも使ってみましょう。
インストール方法はググればでます。

ただ、私の環境ですと、Intel MPIのversion 2019 Update 7以前を使った場合、`scancel`コマンドでジョブをキャンセルした際に、実際にはプロセスがkillされずに生き残るというバグが起こります。version 2019 Update 8で治っているようなので(確認済み)、問題のある場合はupdateしてみてください。
卒研２

#7/27報告

tensorflow入れてみた。
![スクリーンショット (217).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/89d0527c-249b-873b-c9fb-d8541653b7f3.png)
gpt-2を引っぱってきて実行してみる。
![スクリーンショット (218).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/825107cb-71aa-25ca-d440-193554e6fa58.png)
ここまでは来れた。Pパソコンの方でも実行できそう。gpt-2で問題があるという疑惑があったが、個人の問題で動きそう。
![スクリーンショット (219).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/37b58da8-7820-56e2-47b2-86dc789a710c.png)
#8/10報告
いろいろと試してみた。
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/e4fe0ea5-aa03-4249-e6f5-d4b8b5a0ed2f.png)
![スクリーンショット (30).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/12104fa9-fadd-2682-9b6a-8da4ee7d26b7.png)
実行前まではこぎつけた。
![スクリーンショット (221).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/288b4e1e-cf6c-33c4-3ebc-6eaf620178eb.png)
![スクリーンショット (223).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/6a5c88f3-01d0-101d-fe28-00d7f1b5e950.png)
hyper-Vがない。
![スクリーンショット (224).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/613075/60e3c5be-fece-5e8b-805f-dffe843736ce.png)
Dockerhubのアカウントを作る。ログインして実行してみたが動かない。
部分テンプレートを使うって何？

共同作業ワークをしていると、
分からない単語が沢山出てきます。

今日も、
「部分テンプレート」というワードに悩まされました。

部分テンプレートは複数のページ内で共通して記述されるものであれば特に何でも構わない、
自由度のあるテンプレートであると分かりました。
それ故に共通している部分を記述し、
コードの行を減らすことができる。

このワード一つを理解するだけで、
半日近く悩みました。
今取り組んでいる課題は「renderコマンド」で
部分テンプレートを使い、
構成を直しています。

初心者どころか初心者の初の地にも立っていない。
そんな自己嫌悪にまた苛まれてしまいました。
S3バケットポリシーであるユーザーを特定のバケットにしかアクセスできないように設定する

## バケットポリシー全然わからん
S3のバケットにアクセスする際の権限設定をIAM、S3のバケットポリシーで設定するのはわかるのだが、どのように設定すれば良いのか全然わかっていませんでした。

## 許可または拒否の決定の仕方
あるユーザーがあるバケットにアクセスしようとした際に許可されるか拒否されるかは以下のように決まっています。
1. 拒否設定があるか（ある場合必ず拒否）
2. 1がない場合許可設定があるか（ある場合許可）
3. 記述がないか（デフォルト拒否）

初期状態のバケットを作り、ユーザーを作成しただけの状態では当然そのユーザーはどのバケットにもアクセスできません。これは3のデフォルト拒否が働いているからです。
アクセスするために許可設定を行って、IAMユーザーに`AmazonS3FullAccess`のような権限を与えるとこれでS3のどのバケットにもアクセスできます。
ただ、このあと拒否設定をバケットポリシーなどで設定するとS3にアクセスできなくなります。拒否設定があると他で許可を取っていても必ず拒否となります。

実際はもっと細かい話がありますが、最初はこの程度わかっていればOKだと思います
参考：[ポリシーの評価論理](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/reference_policies_evaluation-logic.html)

## 許可設定で勘違いしていたこと
S3にアクセスする際に勘違いしていたのは`IAMユーザーにS3へのアクセス権限を与えることが必須`ということでした。
実際にはIAMユーザー自体にポリシーを与えなくてもバケットポリシーで権限を付与することが可能です。むしろIAMに必ずアクセス権限を与えると設定に困ることが必ず出てくると思います。
単純に特定のバケットのみアクセスさせたい場合はIAMユーザーにポリシーを与えず、バケットポリシーに許可設定を与えればOKです。

## S3バケットポリシーであるユーザーを特定のバケットにしかアクセスできないように設定する
ようやくタイトルの回答になるのですが、以下のようなバケットポリシーを設定します。バケット名・ユーザー名は適宜変更が必要です。
Actionに`S3:*`としているのでS3へのフル権限が与えられます。必要に応じて変更が必要です。ワイルドカードが使えるので`S3:Put*`などで特定の権限を一括設定も可能です。
このバケットポリシーだけ設定して、この`example-user`には他のポリシーを設定しなければこのバケットのみアクセスできるユーザーとなります。

```json
{
    "Version": "2012-10-17",
    "Id": "123",
    "Statement": [
        {
            "Sid": "",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::123456789:user/example-user"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::examplebucket/*",
                "arn:aws:s3:::examplebucket"
            ]
        }
    ]
}
```

json形式での記入なのでユーザーや権限を増やしたい場合は配列に値を増やしていけばOKです。
また今回はAllowの記述ですがDenyで拒否設定もできます。上述しましたが、Denyが一番優先となるので絶対にアクセスさせたくない部分に関しては記述をしないのではなく、Deny設定をしておくことが安心です。
Spotify APIを使ったヒット予測1.過去データの日付ランキング作成

![spotify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661171/fcc2b392-eab3-6680-feb3-37d748c430cd.png)

spotifyのAPIを使ってヒット予測を作ってみました。
今回はまず取り掛かりの第一回目として、
1.過去のランキングデータを取得
2.取得したランキングデータをまとめてグラフ化
をやっていきます。

##1.過去のランキングデータを取得
https://spotifycharts.com/regional
から日本の日別トップ200ランキングを取得しました。
過去数日ないとランキングの推移が出せないので、ここでは2020年7月1日〜7月13日のデータを取得しています。

取得したファイル一覧がこちら
![A7A8FC26-C4A3-4CB9-A06B-BAB03EC652BA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661171/399e6e9c-2494-bf52-dbc1-d0626607a755.png)

このcsvを元にランキングのグラフを作っていきます。
##2.取得したランキングデータをまとめてグラフ化
jupyter Notebookを使って作業していきます。
細かい詳細は省きますが、以下手順で行いました。

###・csvを一つにまとめる（ヘッダーあり）
csvを一つのフォルダに入れてfor文で「pd.read_csv」で読み込みをファイル文ループ。
2回目以降のヘッダーは読み込まずにそのまま縦方向に追加していく。
読み込みが終わったらdataFrameで扱いやすいようにリストを作ります。

ひとまず確認。
X軸に日付、Y軸に再生回数を積んだグラフですが、なんとなくは思っているような出力ができそうです。
![3307DBE6-3693-4B9F-8275-1CD553B6F2A9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661171/956e02fd-50c6-2811-abf4-7b6c1932d6a1.png)

###・ランキング推移を知りたい楽曲を入力
csvからのリストは膨大な楽曲数になるため、そのままランキンググラフ化するとカオスになります（笑）
そこで、必要な（知りたい）楽曲だけを抜き出し、ランキング推移を表示する方法を取りました。

なぜか目に入ったNiziUにしてしまった（笑）
![4C102ABD-EDA0-42F2-816E-E93C73069BEA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661171/21ab0203-a27e-41da-3958-b6af61467b38.png)

###・グラフ化
ここまでくればもう一息。あとはグラフ化するだけです。
多少細かい調整が必要ですが、このようなグラフで表示させることができました。
![7D06E69B-C17E-452A-8927-5528B7551479.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661171/36ef6c9f-1621-f1a5-1445-4b99d47431b8.png)

NiziUは7月1日〜13日の期間、上位にはいますが、7月9日から少し順位を下げているのがわかりますね。

次回はより高度にランキングデータを取り、ランキング予測をしたいと思います。
ではまた！
SageMaker上のnotebookでログが出力されなくなった際の対処法

# 問題
途中でネットワークが切れたりなどして、SageMaker上の
notebookが止まってしまった。
[\*]セルの実行状況が[\*]でログがみれていたのに、
[ ]になってしまい、ログが出力されない。

# 解決方法
## 1.SageMakerコンソール画面のトレーニングジョブを選択
<img width="1424" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17906/4b34eee2-668a-c37c-6168-0b3a487f226a.png">

## 2.対象のjobを選択
<img width="1112" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17906/287c4a2b-f7db-6c9a-051e-83ecf258eaa7.png">

## 3.ログの表示を選択
<img width="1114" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17906/46d258bf-65d7-5440-80d7-60fb02c87e64.png">

## 4.ログを選択
<img width="1160" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17906/d75b55d1-8a79-1ca6-69f5-0e4c38de9d65.png">

## 5.ログが表示される
<img width="1161" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/17906/8cc0cdf8-57cb-435b-cef9-f75a9693fb24.png">

# まとめ
notebookが停止してしまい、実行状況が見れない場合は、
コンソールから確認する。
ミドルウェア(unicorn + nginx)周辺のメモ 

## 記事を書く目的
Railsでつくったアプリをデプロイしたときの構成として、ミドルウェアにNginxとUnicornを使用しました。
なぜこれらを本番環境で使用するのか調べていて、まとめたいなと思ったのでメモ。

## ミドルウェア
osとアプリケーションの間に入って働くプログラムのこと。

- Webサーバー(Nginx)
- アプリケーションサーバー(Unicorn)

のこと。

こちらの記事のとおりに構成を実施。
[(デプロイ編②)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで  - Qiita](https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1)


## Webサーバー, アプリケーションサーバーの役割
- Webサーバー(Nginx)
静的コンテンツを返す役割を持つもの。
誰がみても同じ内容のもの。
誰かの記事を見るなど、誰がみてもその人の記事の内容は同じなのでそれを表示させるのには、Webサーバーだけで十分。

- アプリケーションサーバー(Unicorn)
動的コンテンツを返す役割を持つもの。
各ユーザーにより、処理が異なるもの。
ログインだったり、記事を投稿する場合だったりデータベースとのやり取りが必要なもの。

## RailsにはPumaがある
Rails5からはWebサーバーの役割をもつPumaが標準装備されているとのこと。
ということはPuma + Nginx でもいいのではないか？と思っていたらPumaとUnicornを比較した記事がありました。
↓↓
[Pumaの本当の力を引き出す - Qiita](https://qiita.com/ykyk1218/items/0ca7f1fa449b41fe1fea)

結果的にデフォルトのPumaは貧弱なため、Unicornを使った方が処理がスムーズなるけど、ポートフォリオくらいならPumaでも問題はないのかなと。

## つまり
デフォルトのPumaは貧弱なので、Unicornを使う。
Unicornを使う場合、ドキュメントではNginxと組み合わせることを推奨しているため、Unicornを選んだ場合、webサーバも自然とNginxになる。
RDSProxyを使ってもDB接続は速くならないという話

## 結論

特別、速くはならない。
速さを求めるのであれば自分でプールするしかないっぽい。
※とはいえ、接続数管理してくれるのは魅力。。

以下、AWSサポートとのやり取り。

## AWSサポートへの質問

本文の最後に記載している "実行しているLambda" を実行しています。

(1) RDSProxyのエンドポイントを指定した場合、DB接続にかかる時間は下記になります。
connect:0.754[sec] ※Lambdaのコールドスタート
connect:0.420[sec] ※以降、同じコンテナで再実行
connect:0.322[sec]
connect:0.551[sec]


(2) RDSのエンドポイント＆コネクションプール無しで設定した場合、DB接続にかかる時間は下記になります。
connect:0.640[sec] ※Lambdaのコールドスタート
connect:0.442[sec] ※以降、同じコンテナで再実行
connect:0.419[sec]
connect:0.410[sec]


(3) RDSのエンドポイント＆コネクションプール有りで設定した場合、DB接続にかかる時間は下記になります。
※ pool_size=1 のコメントアウトを外す
connect:0.729[sec] ※Lambdaのコールドスタート
connect:0.002[sec] ※プールが効いているので接続にほぼ時間がかからない
connect:0.003[sec]
connect:0.002[sec]


(1)のRDSProxyをエンドポイントに指定した場合の結果に関して、RDS⇔RDSProxy間でコネクションプールが張られるので、
(3)結果と等しくなることを期待していました。

こちらの結果に関して、そういうものなのか、実装or設定方法に何かしら誤りがあるのか判断したいための問い合わせとなります。
ご確認いただけますでしょうか。

※
RDSのmax_connectionsを超えるようにLambda同時実行した場合、(1)の場合、正常に終了しますが、(2)の場合、too many connectionsが出るので
RDSProxyへのアクセス自体は正常に行えていると思います。


※
実行しているLambda（DB接続はmysql-connector-pythonを使用）

```python
from mysql import connector
import os
import time

def lambda_handler(event, context):

    # 接続にかかった時間
    start = time.time()
    con = connector.connect(
        host=os.environ['DB_HOST'],
        user=os.environ['DB_USER'],
        password=os.environ['DB_PASSWORD'],
        database=os.environ['DB_DATABASE'],
        # pool_name="mypool",
        # pool_size=1,
    )

    elapsed_time = time.time() - start
    print ("connect:{0}".format(elapsed_time) + "[sec]")
    
    ～SQL( "select sleep(3), 2" )を実行して結果を取得する処理～
    
    # 切断
    con.close()
```

## AWSサポートの回答

> (1)のRDSProxyをエンドポイントに指定した場合の結果に関して、RDS⇔RDSProxy間でコネクションプールが張られるので、(3)結果と等しくなることを期待していました。
> こちらの結果に関して、そういうものなのか、実装or設定方法に何かしら誤りがあるのか判断したいための問い合わせとなります。ご確認いただけますでしょうか。

いいえ、恐れ入りますが、クライアント側でConnection Poolingを使用した場合と等しくはなりえません。
クライアント側で各Driverにて実施できるConnection Poolingと、RDS ProxyなどDatabase ProxyのConnection Poolingでは立ち位置が異なり、例えば、前者ではクライアント/DBサーバー間のコネクションを再利用できますが、後者では再利用されうるコネクションはあくまでProxy/DBサーバー間ですのでクライアント/Proxyの接続は必要であり、クライアントから見た接続時の所要時間としてはややオーバーヘッドになります。
また、ProxyのConnection Poolingのコネクションは常に必ず再利用されるというものではなく、必要に応じて、ピン留めが発生したり、ProxyやDB側で接続が切断されることもございます。

基本的には、例えば、「コネクションが再利用できる場合、DBでの新規コネクション作成の負荷軽減につなげることができる」、「接続の多重化としてDBへの実際のConnection数をおさえることができる」、「IAM認証をDB側で実施するのではなくProxy側で実施できる」などの特徴の観点で、ご想定されている運用方法などを踏まえ、ご検討・ご検証いただけますと幸いでございます。

  [+] Amazon RDS Proxy による接続の管理 - RDS Proxy の概念
  https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/rds-proxy.html#rds-proxy-overview
Rustでバイナリープロジェクトのインテグレーションテスト

### 問題

Rustでmain.rsベースのプロジェクトのインテグレーションを書こうと思っても、インテグレーションテストからテスト対象のコードを参照できない。


### 解決方法
1. `main.rs`を`lib.rs`にリネームする
1. `main.rs`ファイルを`lib.rs`と同じディレクトリに作る
1. `lib.rs`から`main.rs`に`main()`を移す
1. `lib.rs`にエントリーポイントとなる関数を作る
2. `main.rs`から`lib.rs`のエントリーポイントを呼ぶ（`main.rs`から`lib.rs`の関数やモジュールはクレート名で参照できる）

例えば、

```rust
// Cargo.toml
[package]
name = "dolce"
```

```rust
// src/and.rs
pub fn gabbana() {}
```

```rust
// src/lib.rs
mod and;
pub use and;  // インテグレーションテストから使えるように再エクスポート（未確認）

pub fn entry_point() {}
```
だったら、

```rust
// src/main.rs
fn main() {
  dolce::and::gabbana();
  dolce::entry_point();
}

```

のようにしておく。すると、`tests`ディレクトリ下のインテグレーションテストからも、`dolce::and::gabbana()`の様にテスト対象のコードを参照できる。


### 余談
rust by exampleのインテグレーションテストの説明
https://doc.rust-lang.org/rust-by-example/testing/integration_testing.html

では、バイナリープロジェクトをインテグレーションテストするケースについては全く触れられていないので、
https://github.com/rust-lang/cargo/issues/7885

など、ハマる人が多い様子。