OmniAICreator/Qiita-1.07M huggingface dataset:
TypeScriptを使ったValueObjectの実装例

ドメイン駆動開発などで使われるValueObjectの実装例です。

## ValueObject概要
値をObjectとして扱う方法で、意図しない値の変更を防いだり、様々な表現ができたりします。
また、値に関する知識をクラスに集約することでテストや保守がしやすくなるため、
値の表現方法がイロイロある場合に使うと便利です。


## 実装例
C#ではそこそこ有名ですが、TypeScriptだと情報があまりない感じですが、
私が調べた限りでは、TypeScriptでは演算子のオーバーロードができないようなので、
この例ではValueObject同士での演算子は利用できません。

```typescript
abstract class ValueObject<T> {
	readonly Value: T

	constructor(value: T) {
		this.Value = value
	}
　　　　　　　　//　ValueObject同士で比較するメソッド
	equals(vo: T): boolean {
		if (vo === null) {
			return false
		}
		return this.EqualsCore(vo)
	}
　　　　　　　　//　値によって同じかどうか判断する基準が異なるため abstract で定義
	protected abstract EqualsCore(other: T): boolean
}

export default ValueObject
```

下記の例では温度を例に取り上げています。
温度は摂氏と華氏の２種類の単位があるため、ValueObjectに向いている種類の値です。

```typescript
type TemperatureUnit = °C | °F
class Temperature extends ValueObject<Temperature>{
    readonly Unit: TemperatureUnit
    constructor(value: int, unit: TemperatureUnit){
        super(name)
        this.Unit = unit
    }

	get ValueWithUnit(): string {
	    return this.Value.toString() + this.Unit
	}

    equalsCore(vo: Person)=>{
       return this.Value === vo.Value && this.Unit === vo.Unit
    }
}
```
Basic認証の導入方法

閲覧制限を設けるために、「Basic認証」を導入します。
これによって、デプロイした後のアプリケーションでも、ユーザー名とパスワードを知っている人しか見ることができなくなります。

## 1.Basic認証を導入
全てのコントローラーを呼び出す際に起動してほしい。
つまり、「app/controller/application_controller.rb」に記載する。

![スクリーンショット 2021-07-05 17.01.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730450/893333be-1255-f88d-391f-0a9cae83c303.png)


## 2.動作の確認
rails s
ローカルで動作を確認。ポップアップが出てきて、設定したユーザー名とパスワードを入れることで認証を通過することができたら成功。

## 3.環境変数を定義
![スクリーンショット 2021-07-05 17.10.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730450/e5a2a521-e5e7-c0ab-6c0c-0f74c6357d06.png)
 
## 4.Railsで読み込めるように設定
![スクリーンショット 2021-07-05 17.11.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730450/38620570-42f7-1c46-ca88-eddfd81d0361.png)

## 5.動作の確認
rails s
ローカルで動作を確認。ポップアップが出てきて、設定したユーザー名とパスワードを入れることで認証を通過することができたら成功。

## 6.本番環境で環境変数を設定
今回はherokuを使っているので、heroku上に環境変数を設定します。
![スクリーンショット 2021-07-05 17.15.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1730450/b4ddcce7-9b97-cefb-1975-16edcb3ab890.png)

「% heroku config」を入力して、設定したユーザー名とパスワードが出力されたら成功です。
コードを変更したので、herokuへ忘れずデプロイしましょう。githubで管理している場合は、デプロイの前にコミットも忘れず。
```% git add .
% git commit -m "Basic認証を導入"
% git push heroku master
```

## 開発環境
macOS Catalina 10.15.4
Ruby 2.6.5
Rails 6.0.3.3
Visual Studio Code 1.49.2
RoBERTaをベースとしたモデルで事前学習するときの注意点

RoBERTaをベースとしたモデルで事前学習を行ってオリジナルな言語モデルを作った後、その言語モデルを個別タスクにファインチューニングしようとしたら、学習時に以下のようなエラーが出ました。


```
RuntimeError: CUDA error: CUBLAS_STATUS_NOT_INITIALIZED when calling `cublasCreate(handle)`
```


いろんな原因が考えられるかも知れませが、私の手元で起こった原因は以下のissueにあげられているようなRoBERTaの`max_position_embeddings`のサイズが原因でした。

- [RoBERTa and 514](https://github.com/pytorch/fairseq/issues/1187)
- [max_len_single_sentence should be max_len - 2 for RoBERTa](https://github.com/huggingface/transformers/issues/1304)
- [Why the RoBERTa's max_position_embeddings size is 512+2=514?](https://github.com/huggingface/transformers/issues/1363)


上記のエラーが発生する原因は以下の流れを踏んだ時です。

1. 事前学習時に`max_position_embeddings=512`で学習([デフォルト](https://huggingface.co/transformers/model_doc/bert.html#bertconfig)をそのまま使用)
2. fine tuning時に文章の長さ（トークン数）が512のデータを順伝播させる


RoBERTaではトークンに位置情報の特徴量（`position_embeddings` ）を足し合わせる時、`padding_idx + 1`を位置情報の開始時点としているため、511番目、512番目に位置するトークンの`position_embeddigs`は513番目と514番目の要素を参照する必要があるが、事前学習時に`position_embeddings`のサイズを512にしているため、参照先がなくてエラーが出たと思われます。
(RoBERTaの`padding_idx`は`1です。)

この辺の該当するソースコードは以下ですかね。

- https://github.com/huggingface/transformers/blob/d4c2cb402d6674211726fd5f4803d1090664e438/src/transformers/modeling_roberta.py#L79-L81


対処方法としては、ファインチューニングのときに`max_length=510`を設定するとか、事前学習時のBertConfigの設定で、`max_position_embeddings=514`を設定すればエラーを回避できると思われます。

例えばRoBERTaをベースとしたモデル`CamemBERT`を使う時は以下のような感じですかね。

```python
from transformers import CamembertConfig, CamembertForMaskedLM

config = CamembertConfig(
    vocab_size=len(tokenizer),
    num_hidden_layers=12,
    intermediate_size=768,
    num_attention_heads=12,
    max_position_embeddings=514, # 512+2
    type_vocab_size=1
    )
model = CamembertForMaskedLM(config)
```


なんかしっくりこないですが
私の理解がおいつていないだけかもですが、issueによれば、RoBERTaの`position_embeddings`は0番目はランダムに生成され使用はされず、1番目は0ベクトルになっているようです。

```python
from transformers import RobertaModel
model = RobertaModel.from_pretrained('roberta-base')
print(model.embeddings.position_embeddings.weight[:2])
# tensor([[-0.0115,  0.0204,  0.0197,  ...,  0.0050, -0.0274, -0.0439],
#        [ 0.0000,  0.0000,  0.0000,  ...,  0.0000,  0.0000,  0.0000],
#        [ 0.0346, -0.0169, -0.0895,  ..., -0.0542,  0.0291,  0.0173]],　← ここから先頭のトークンの位置情報になっているらしい
#       grad_fn=<SliceBackward>)
```


同じようなエラーが出て悩んでいる方にこの記事が届いて少しでもご参考になれば幸いです。

おわり
【SwipeRevealLayout】RecyclerViewの行スワイプでのメニュー表示を簡単に実装する。[Android]

#参考
https://github.com/chthai64/SwipeRevealLayout
https://www.youtube.com/watch?v=hnuMyuCWwwU&t=1236s

#完成形

![kanseikei.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/975063/b56fa8c4-068e-b7aa-b293-37c7fb26b8aa.gif)

今回のコード

https://github.com/RiutaDaiki/recycler_swipe

#Gradle

```
dependencies {
    compile 'com.chauthai.swipereveallayout:swipe-reveal-layout:1.4.1'
}
```

ちなみに'compile'は非推奨とされていて、代わりに'api'や'implementation'が推奨されています。

#行ごとのレイアウト

```kotlin:item_swipe_recycler.xml

<com.chauthai.swipereveallayout.SwipeRevealLayout
    android:layout_width="match_parent"
    android:layout_height="60dp"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    app:mode="same_level"
    app:dragEdge="right">

//サブ
<LinearLayout...>

//メイン
<androidx.constraintlayout.widget.ConstraintLayout...>

</com.chauthai.swipereveallayout.SwipeRevealLayout>
```

SwipeRevealLayoutの中にlayoutを２つ配置しています。
サブ：　スワイプした際に出てくる部分です。
メイン：　メインのコンテンツとして表示する部分です。　
必ずサブ⇨メインの順番で記述してください。
また、app:dragEdge=""の値を変えることで上下左右どこからスワイプしてサブレイアウトを表示させるかを指定できます。

#終わり
基本的には普通にRecyclerViewを使う感じで、Gradleとレイアウトファイルを少しいじるだけで実装できてしまいます。ItemTouchHelperとやらを使って実装する方法と比べて圧倒的に簡単ですよね。このOSS控えめに言って神だと思うんですが、英語かつJavaの記事ばかりだったので参考になれば幸いです。
【Scrum Fest Osaka 2021】結成から１年を迎えたチームのエクストリームな歩みと新たな風

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/c03efcaf-f14d-e52c-8771-47bf89de0d83.png)
私たちはチームで、2021/06/26に実施された「[Scrum Fest Osaka 2021](https://www.scrumosaka.org/)」で、
「[結成から１年を迎えたチームのエクストリームな歩みと新たな風](https://confengine.com/conferences/scrum-fest-osaka-2021/proposal/15364)」の講演をしてきました。

この記事ではセッションの概要と、発表の中でお伝え出来なかった私たちの特色について記載します。

# セッションの概要
変化に対して **マイナスイメージ** を持っている人が多いんじゃないでしょうか？

少なくとも、私たちはそうでした。

そんな私たちが、変化に対してどう立ち向かったのか。
どのように、変化を楽しむようになったのか。

私たちに起こった、マインドの変化を是非ご覧ください。
「[結成から１年を迎えたチームのエクストリームな歩みと新たな風](https://confengine.com/conferences/scrum-fest-osaka-2021/proposal/15364)」

発表資料は[こちら](https://speakerdeck.com/kimagre_human/scrum-fest-osaka-2021-jie-cheng-kara1nian-woying-etatimufalse-ekusutorimunabu-mitoxin-tanafeng)！


# 私たちのチーム
私たちのチームには、考え方や普段の業務で生まれた特徴が5つあります。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/2870ab72-8be0-3195-4366-0dfb47b33f7c.png)

**フルリモート**
私たちのチームは、常にオンライン上で作業しており、Zoomを利用してチームで活動しています。
Zoomのビデオ通話を行うことで、お互いの顔が見える状況で作業することが可能で、相手が困っている際に、すぐに検知することが可能になります。

**モブワーク**
私たちのチームは、モブワークで作業を行っています。
モブワークとは、ナビゲータがドライバーに画面操作を指示して、複数人で1つの画面を操作する開発手法です。
私たちはこのモブワークをZoomの画面共有を利用して行っており、画面を奪うような形でモブワークを実施しています。
その結果、画面切り替えのラグが抑えられ、スムーズに役割を交代することができるようになりました。

**シフト制**
チームメンバーには複数の案件を兼任している方もいるため、チームで活動できる時間をシフトを作成して管理しています。
シフトを組むことで、他の業務を入らないようにすることが可能になり、チームで活動できる時間が増えました。
また、シフトを作成することで誰がどのペアで作業しているのかなど、その日時の作業メンバーが可視化されました。

**Leaning Session**
私たちのチームでは毎朝30分間、チームに必要な知識や技術を勉強する勉強会を行っています。
勉強会を行うことで業務に役立つだけでなく、メンバー同士のコミュニケーションをとることも可能です。

**30分フラクタルスプリント**
ほとんどのチームが1~2週間かけて行うSprintを、私たちのチームでは30分で行っています。
30分で作業を行うために、私たちは様々な改善をしてきました。

・モブワークの役割の奪い合い
　もともと時間で区切って役割を交代していましたが、交代する際にラグが発生するようになったため、
　役割を奪い合う形にしたところ、交代がスムーズになりラグがなくなりました。

・午前午後のプランニング
　始めは1日の計画を朝行っていましたが、メンバーが午前午後で変わったり、
　割り込みタスクが入って計画がずれてしまうことがありましたが、
　午前午後に分けて計画を行うことで、作業の見積もりが正確になりました。


## 30分Sprintという変化を起こしてみて、チームに起こった変化
私たちは30分Sprintにしたことで、様々な変化を得ることができました。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/0222ad0d-14de-a8c1-1df1-8ef8dada0b0a.png)
**高速な価値提供**
計画の際にタスク30分単位で細分化してリリースするため、高速で価値を提供できるようになりました。
また、急な変更にもすぐに対応できるようになり、生産性が向上しました。

**カイゼンスピードの加速**
30分に一回「ふりかえり」を行うため、自分を見つめなおす回数が増え、カイゼンをたくさんできるようになりました。
また、相互フィードバックも行うため、自分では気づかなかった面も知ることがでるようになりました。

**割り込みタスクへの耐性UP**
30分ごとに計画を立てるため、割り込みタスクが入ってきた際に計画に組み込むことが容易になりました。
その結果、割り込みタスクに対して耐性が付き、解決までのスピードが上がりました。

**作業への全集中の呼吸**
集中力が切れるタイミングで、Sprintが切り替わるため、常に集中して作業ができるようになりました。
常に集中して作業できるため、作業の生産性が向上しました。


# セッションで得た反応
私たちのセッションを聞いた方々から、たくさんの反応をいただけました。

・失敗から学ぶことがあったら、それはもう失敗じゃない。
・変化に対してマイナスイメージを持っていながらも、変化をしたことがすごいと思う。
・成功も失敗もない、体験なんだよ。体験から気づきがうまれるんだよ。
・変にカッコつけずにわからないことはわからない！確かにこれいうのはすごく大事。
・チームを超えて変化を起こす。

私たちの発表で、多くの方に勇気のバトンを渡すことができました。
今後その方から別の方へ、勇気のバトンがわたって行けばいいと思います。



# 私たちのチームを見学しませんか？
私たちは普段の作業風景を、社内外に公開しています。
常に変化を続ける私たちのチームを見学してみませんか？
![Work.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/855853/4dc9180e-231e-04f6-51e1-4610c4216834.png)
『[aslead Agile Tour](https://aslead.nri.co.jp/solution/aslead_Agile_Tour.html)』←から申し込みが可能です！
昔は使ってたけど今はあまり使ってないDBの機能

昔は使ってたけど今はあまり使ってないDBの機能

### ストアド・プロシージャ

テストしづらい。gitで管理しづらい。ある程度複雑なことをするなら、プログラミング言語でやった方が楽。スクリプト言語からDBにアクセスできなかった頃は、PL/SQLで書く気持ちもわかるが、今はストアド・プロシージャ（ファンクション）は、単にデバッグしにくいなんちゃってプログラミング言語になっちゃった。

### view

ビューもあまり使わない。あるのと内のの差がすくない。これもストアド・プロシージャと同様にある程度の複雑なコードは、Dbの中で管理するのがしんどいという話。

### 複合主キー

昔は律儀に複合フィールドで主キーを張っていた。ただActiveRecordが出てきた時に「主キーが1カラムだと超便利」という思想が意外と浸透した。Oracleなどは、物理的なROW_IDのようなダイレクトにしていできるものがあるが、エンジン依存で論理設計まで影響があるのは良くない。主キーは1カラムがよい。

### クエリキャッシュ

これは異論は認める。DB側でクエリ結果を保持してくれるというやつ。MySQLの最新版ではもう要らないよねって言われてる。でもこれは便利。

### 速度向上のためのPREPAREステートメント

ここがボトルネックになることなどほぼない。

### コネクションプーリング

これもエンジン依存。PHP+MySQLのが普及したころに、「コネクションプールする意味ある？」って一時期話題になった。MySQLはコネクション確立にかかるコストがめちゃ低い。

### Pro*C

Oracleに接続するためのやつ。Cだから速いというメリットはあるが、プリコンパイラだから開発面倒だし、Oracleにしかつながらない。

### RADツールとしてのモデリングツール

設計図からDBのER図まで作ってコードまで作ってくれるやつ。
number型に数値の範囲制限をつける方法【TypeScript】

合併型の型エイリアスを使うことで、範囲制限付きのnumber型の変数を定義することができます。

```typescript
let index: 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14

/*範囲外の数字を設定しようとするとエラーになります。*/
//Type '30' is not assignable to type '0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9　　| 10 | 11 | 12 | 13 | 14'.
index = ３０
```
イベントドリブンプログラミング-Hasura

イベントドリブンプログラミングは、プログラムのメインルーチンがプログラムのフローを決定する従来のモデルとは対照的に、プログラムのフローがイベントによって駆動されるプログラミングパラダイムです。

イベントドリブンプログラミングモデルでは、プログラムのメインルーチンは主に、発生するイベントをリッスンし、イベントを処理するイベントハンドラーをトリガーするイベントループとして機能します。

イベントは次のように定義されます。
1.マウスのクリックやキーの押下、さらには音声コマンドなど、ユーザーが実行できるすべてのこと。
2.センサー出力、
3.およびメインオペレーティングプログラムまたは他のプログラムからのメッセージ。

したがって、そのようなイベントがトリガーされると、メインルーチンはタスクを適切なイベントハンドラーに委任し、その関数はイベントによって開始されたプロシージャ（ストアドルーチンまたは外部プログラム）を処理します。

これは、通常GUIを備えているため、ある意味でユーザー主導型の最新のアプリにとって便利なプロセスです。この非同期モデルにより、複雑なビジネスロジックをイベントハンドラーに直接格納できるようになり、その結果、メインルーチンを比較的単純にすることができます。
詳細は- http://hasura.io/event-driven-programming
AppEngineFlexibleでLaravelHorizonを使う

GAE FlexibleでLaravelHorizonを使いたかった
RedisはMemorystore for Redisを使う

日本語の情報が全然出てこなかったので備忘録として
前提としてMemorystore for RedisとGAEはサーバレスVPCアクセスで接続可能になっている


```composer.json
{
    "name": "laravel/laravel",
    "type": "project",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "php": "^7.3",
        "ext-gd": "*",
    /******中略*********/
    "scripts": {
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump"
        ],
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate"
        ],
        "post-install-cmd": [
            "composer dump-autoload",
            "php artisan config:clear",
            "php artisan cache:clear",
            "php artisan view:clear",
            "php artisan cache:clear",
            "php artisan horizon:publish" ←追記
        ]
    },
    "extra": {
        "laravel": {
            "dont-discover": []
        }
    },
    "config": {
        "optimize-autoloader": true,
        "preferred-install": "dist",
        "sort-packages": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}
```



proc_openとproc_closeをwhitelist_functionsに追記

```app.yaml
runtime: php
env: flex
service: api

runtime_config:
  document_root: public
  whitelist_functions: proc_open, proc_close ←コレが無いとキューワーカーが動かない

resources:
  cpu: 2
  memory_gb: 8

handlers:
  - url: /vendor
    static_dir: public/vendor

env_variables:
/*****後略*****/
```

```additional-supervisord.conf
[program:horizon]
command = php %(ENV_APP_DIR)s/artisan horizon
stdout_logfile = /dev/stdout
stdout_logfile_maxbytes=0
stderr_logfile = /dev/stderr
stderr_logfile_maxbytes=0
user = www-data
autostart = true
autorestart = true
priority = 5
stopwaitsecs = 20
```

自分がどうしたいかによると思うけど、HorizonServiceProviderのgate()を修正して非ログイン状態で表示出来るように、アクセス制限は別途Middlewareを作ってIP制限

```HorizonServiceProvider.php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Gate;
use Laravel\Horizon\Horizon;
use Laravel\Horizon\HorizonApplicationServiceProvider;

class HorizonServiceProvider extends HorizonApplicationServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        parent::boot();

        // Horizon::routeSmsNotificationsTo('15556667777');
        // Horizon::routeMailNotificationsTo('example@example.com');
        // Horizon::routeSlackNotificationsTo('slack-webhook-url', '#channel');

        // Horizon::night();
    }

    /**
     * Register the Horizon gate.
     *
     * This gate determines who can access Horizon in non-local environments.
     *
     * @return void
     */
    protected function gate()
    {
        Gate::define('viewHorizon', function ($user=null) {　←$userにnullを入れてtrueを返してなんでもOKに
            return true;
        });
    }
}
```
モバイルバッテリーのオートパワーオフ

#IoTとモバイルバッテリーの関係について
IoTはさまざまな場所で使われており、小型化が進められている。現在私の研究室ではESP32を使ったBLEの精度改善について研究している。そこでESP32を動かしながら実験をしなければならない場合がある。固定した状態で実験する場合はケーブルにつないだままでも行うことができるが、動いて実験をしなければならない場合にケーブルでは動ける範囲が限定されてしまい、正確な実験ができない場合がある。そこでモバイルバッテリーに繋いで、自由に動かすことができれば実験の幅も広がる。

##モバイルバッテリーのオートパワーオフについて
一部のモバイルバッテリーにはオートパワーオフという機能が付いている。この機能はある一定以下のアンペアでモバイルバッテリーが使われていると自動的に電力の供給をやめるという機能である。この機能は説明書には書かれていない内容で、なぜ説明がさえていないのか、まず基本的にモバイルバッテリーはスマホを充電するのに使われる。スマホは微小電流ではなく、2.1アンペアくらいの電流が流れており、これぐらいのアンペアならオートパワーオフ機能は作用せず、通常の動作をする。しかし、微小電流で動作するIoT機器のような機器を充電するように想定されていない。よって、一部のモバイルバッテリーは、微小電流の場合充電が終了したとして電力供給を停止してしまう。これがオートパワーオフである。

###オートパワーオフを回避する方法
このオートパワーオフを回避するにはある一定の電流をながす必要がある。そこで抵抗を増やすことによって微小電流ではなく、一定の電流を流すことができ、オートパワーオフを回避することができる。

###実装
今回私が使っていたバッテリーはEcore社のモデルナンバーP206の4000mAhを使って実験を行った。
![image0.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690610/87b89a8e-1013-1eed-b9e0-70f7f399d226.jpeg)

今回常時動作させるために5Vで80mA以上の電流を流したいため、抵抗を62.5Ωぐらいつける必要があった。そこでキリがいい60Ωで抵抗をつける。
↓はんだ付けした抵抗（27Ω+33Ω=60Ω）![imag3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690610/ab6b3c1f-078e-185c-ca71-0bc2033ffb8c.jpeg)
そして、抵抗と使用するIoT機器を同時に接続するための端子が必要になる。
↓同時にUSBを使うためのTwin Charger
![image4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690610/2c5013de-9e1e-b17f-b59f-327a94fca468.jpeg)
これで必要な機器はそろったので、全てを接続した。
![image2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690610/8996703b-c226-6119-0406-be4b3777a841.jpeg)

###結果
抵抗をつけることによって途中で供給が切れてしまうオートパワーオフ機能を動作させずに、使用することができた。
orange3のインストールと動作確認

Orangeは、スロベニアのリュブリャナ大学を中心に1996年から開発されているオープンソースのデータ視覚化、機械学習、データマイニング用ツールキットです。この記事では、pipコマンドで仮想環境を作成してorange3をインストールし、動かすまでの作業例について記述します。

https://orangedatamining.com/

* 動作確認環境
 * windows 10, Microsoft C++ Build Tools 2019  
https://visualstudio.microsoft.com/visual-cpp-build-tools/ 
 * python 3.9.5, orange-canvas-core 0.1.21, orange-widget-base 4.13.1  
(※ 動作確認時、orangedatamining.com からダウンロード可能な Standalone installer のバージョンは Orange3-3.29.3)

1. 作業用フォルダを作成し、そのフォルダに移動  
```mkdir orange3_test```  
```cd orange3_test```
2. python の仮想環境を作成してアクティベート  
```python -m venv venv```  
```venv\Scripts\activate```  
3. pip コマンドで orange3 パッケージをインストール  
```pip install orange3```  
4. orange3を起動  
```python -m Orange-canvas```  もしくは ```orange-canvas```  

(参考) 起動時に表示される examples の classification のスクリーンショット  
iris データを読み込み決定木よる品種分類を実施
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224987/3cbde170-5ef1-8554-8d2d-cf398ee21605.png)
iris データを散布図の表示例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/224987/9fbe6ce0-87d6-b2a8-404f-f2ec40b23b5a.png)
Linuxのルートディレクトリ構造

- `cd /`で移動するディレクトリ

###全体
/
├── /bin：標準コマンド実行ファイル(cd,cp,grep,mkdirなど)
├── /boot：システムの起動に必要なファイル
├── /dev：ハードウェア機器(device)
├── /etc：設定ファイル
├── /home：ユーザーのホームディレクトリ
├── /lib：OSに必要なライブラリファイル
├── /mnt：ファイルシステムの一時的なマウントポイント用
├── /media：CD-ROMなどのリムーバブル媒体(media)のマウントポイント用
├── /opt：サイズの大きい追加アプリがインストールされる
├── /proc：カーネルやプロセスに関する情報をテキストで表示する仮想ファイルシステム(CPU/メモリ容量とか)
├── /root：root用ホームディレクトリ(管理者用ディレクトリ)
├── /sbin：ルートユーザー用コマンド実行
├── /sys：OSの現在の状況に関する情報(デバイスやドライバーの設定ファイルなど)
├── /usr：全ユーザーが共通して利用するプログラムのデータ
└── /var：システムログなどの動的データ
Next.jsで複数のFirebaseプロジェクトを使用できるようにした話

# Next.jsで複数のFirebaseプロジェクトを使用できるようにした話
Next.jsで多言語対応したSNSを制作する際に、Firebaseプロジェクトをusとjpのリージョンで切り替えて使用できるようにしたかった。
ですが、ネットを探しても開発用と製品用の切替方法しか見つからず、まる二日間を費やし色々と試したので、記事にしてみます。
## プロジェクトの切り替えについて
プロジェクト切り替えの方法で候補に上がっていたのは2通りあります。

1. `firebase.initializeApp`にわたす`firebaseConfig`を切り替える
1. firebaseの初期化をすべてのプロジェクトで行い、呼び出すときに切り替える。

(1)は初期化のタイミングや、サーバー側の初期化に問題があり、解決策は見つかりませんでした。(サーバー側でfirebaseを使わない場合、この方法でも使える可能性あり)
ということで、(2)の方法の説明となります。
## firebaseの初期化

```firebase.js
if (!firebase.apps.length) {
	firebase.initializeApp(firebaseConfig_us, "en");
	firebase.initializeApp(firebaseConfig_jp, "ja");
}
```

先程も記述したように複数プロジェクトを初期化しています。
第2引数で名前を指定せずに2個めのプロジェクトを初期化するとエラーになります。(1個目は指定しなくてもOK。その場合、名前が勝手に`"DEFAULT"`になります。)
## export
通常は定数でexportするかと思いますが、切り替えを行いたい場合は、関数にする必要があります。

```firebase.js
//firestoreをauthなどに置き換えられます。
//*functionsは例外
export const db = (ln) => firebase.firestore(firebase.app(ln))
```

`firebase.app`の引数に初期化時に設定したプロジェクトの名前を入れ、更にそれを`firebase.auth`などの引数にすると、初期化した名前別にプロジェクトを扱えます。
上記のコードでは引数`ln`が無かったり、間違いだったりすると、うまく動かないかと思いますので、使いやすいように書き換えてください。
### functionsについて
まだ試していないのですが、おそらく下記の様に使えるかと思います。

```firebase.js
export const functions = (ln) => firebase.app(ln).functions()

```
#### ＊追記
上記の書き方で使えました。cloud functionsでリージョンを設定している場合は`.functions()`の引数でリージョン指定しないと使えなかったのでご注意を。
## 呼び出し

```pagas/index.js
//SSGの例
export async function getStaticProps(context) {
	const data = await db(context.locale)
		.collection("post")
		.get()
        .then(...)
	return {
		props: {data},
		revalidate: 60,
	};
}
```

## まとめ
最終的には結構スッキリと書けましたが、ここにたどり着くまでかなり大変でした。
サーバーサイドを考えなければ、URLから情報取得してdbなどを定数化できたり、Reduxで引数レス化できたりすると思います。
未経験からCCNA取得までの道のり　ver３

⭐︎ルーティングプロトコル
役割
・リモートネットワークの検出
・宛先ネットワークの最適ルートの検索
・ルート情報を最新の状態で維持する
・トポロジの変更に応じて、ルーティングテーブルを変更


主な方式

🚩ディスタンスベクター型（RIP・IGRP）
ルーティングテーブルを交換して、最適ルートの検索

🚩リンクステート型（OSPF）
インターフェイスの情報を交換して最適ルートの検索

最適ルートを検索するときの判断基準　『メトリック』

✽RIP　「メトリックはホップ数！」
宛先ネットワークへ到達するまでに経由するルータ数（ホップ数）を使って最適ルートを検索！
リンクの帯域幅を考慮しないため、必ずしも最速とは限らない！
トポロジの変更がなくて30秒毎に全てのエントリをアップデート送信するため、帯域幅を消費する。
設定も動作もシンプルなため、ルータやCPUの消費は抑えられるが、30秒毎のアップデート送信があるためルータ数が増えると、コンバージェンスにかかる時間が長くなることがある。

✽OSPF 「メトリックはコスト」
各ルータはLSAと呼ばれるインターフェイス情報の交換を行う。LSAはパズルのピースのような役割を持ち、繋ぎ合わせるることでトポロジマップが完成する。各ルータがトポロジを知っている状態で、SPFというアルゴリズムを使って、最適ルートの決定を行う。
コスト値とは、ルータから宛先ネットワークに到達するまでのリンク（回線）の帯域幅を基に自動的に算出する。
帯域幅をもとに最適ルートの決定行うため、コンバージェンスも速い。

✽EIGRP 「メトリックは帯域幅と遅延」
シスコ社が開発した独自のルーティングプロトコル。シスコ製品にのみの使用。
方式は、ディスタンスベクターとリンクステートののハイブリッド。
DUALというアルゴリズムを使い、大規模ネットワークでも非常に高速なコンバージョンを実現するのが特徴。
Quiitaでの説明用にディレクトリをツリー型で表示したい

treeコマンドで階層構造が表示される。

`tree`だけだと全行表示されて大変なことになるので、

```
tree |  head -n 100
```
みたいにすると

```
├── Applications
│   ├── aaaaaa
│   │   └── bbbbb
│   └── cccccc
├── Desktop
│   ├── Develop
│   │   ├── aaaaaaa
│   │   │   ├── aaaaaa
│   │   │   │   ├── aaaaaa
│   │   ├── iiiii
│   │   │   ├── aaaaaa
│   │   │   │   ├── config
│   │   │   └── twitter.py
```

コピぺで流用できる。
未経験者が１年間、１日１コミットを毎日やってみて得たこと

## 始めた理由
１日１コミットとは文字通り、毎日欠かさず何かしらのコミットをすることです。
入社当時、私はプログラミングに関してなんの経験もなかった未経験者だったので、今後開発の仕事を上手くやれる自信がありませんでした。そんな不安の中、偶然「毎日コミット」についてある記事を読むことになり、自分も毎日コミットに挑戦したいと思いました。
*[当時読んだ記事](https://proshunsuke.hatenablog.com/entry/2016/01/31/225945)*
ただ、毎日コミットを始まる目に一点問題がありました。開発に関して完全に初心者だったので、毎日コミットができるほど実力が無かったことと、当時AWSやJava Bronzeの資格勉強もやっていたので、コミットできる内容が無かったことです。

こういう自分の状況を振り返りながら、資格の勉強も結局プログラミングの勉強なのに、これをコミットとして痕跡を残すことはできないか？ネット講座の受講やネット検索なども全部プログラミングの勉強なのに、これをコミットする方法ないのか？と悩みました。
その結果、私は取り敢えず**「なんでもコミットする」**という自分なりの毎日コミットを始めました。

## ルールとコミット内容

基本的に、全てのリポジトリはGithubに作り、コミットをプッシュし管理しました。また、自分が立てたルールは次になります。

    1. 毎日一つ以上のコミットを作り、プッシュする。
    2. ただの改行、誤字修正、TIL(Today I Learned)など、１番のルールを守るためならコミット内容はなんでもいい。
    3. ただし、絶対業務外の内容にする。
    
２番のルールに疑問を持つ方がいらっしゃるかも知れません。ですが、この２番こそが私の毎日コミットでコアになるルールです。今回の毎日コミットで、私が立てた目標は「スキル向上」ではなく、「根気を育つ」だったからです。根気を持って諦めず毎日やっていけば、実力はついて来る物だと信じました。
そして弱１年が経った今、私はこの考えが間違いなかったと思います。先ずはどんな内容でコミットしたかについて詳細を説明したいと思います。

### 「なんでもいい」のコミット内容　

    - 資格勉強など、理論上で勉強した内容をTILでまとめ
    - 参考になったサイトや記事のリンク集まとめ
    - ただの改行、誤字修正
    - udemyなどでの講座内容をコミットでまとめ
    - 今後作りたいサイドプロジェクトのアイディアメモ

こんな風に、開発と少しでも関連があるものならなんでもコミットを行いました。

## 得たこと
![스크린샷 2021-07-05 14.57.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/674486/973c1604-fbb5-b230-505d-f0af161d3e59.png)

*リポジトリを削除したらコミットもいくつか消えてしまいました...泣*

１年間毎日コミットで得たものは次になります。

- **資格**
    - AWS-SAA取得
- **技術スタック**
    - JavaScript
        - 正規表現を理解し使用できる。
        - ES6の文法を理解し使用できる。
        - Node.js, Express, MongoDBなどを利用し会員加入と情報修正、CRUDなどが可能なバックエンドの構築することができる。
        - React.jsのHooksを理解・利用しウェブアプリケーションを制作できる。
       
    - Python
        - djangoを利用しCRUDが可能なウェブアプリケーションを制作できる。
        - Selenium, bs4を利用しウェブスクラップを制作できる。
        - LINE SDKを利用し趣味用チャットbotを制作、現在運用中
    - 使ってみたサービス、言語、フレームワーク
        - Netlify, Vercel
        - Twitter API, LINE API, Spotify API
        - pug
        - mvp.css, Tailwind css
        - Go, Java, C#
        - Vue.js
    - その他
        -  Gitを理解しコミットメッセージの大事さを理解、ブランチ管理ができる。
        -  mdファイルの文法を理解し作成できる。
        -  Github上で１人開発フローを運用できる。

などなど...

## 今後の目標

ある程度言語と仲良くなったし、フレームワークやウェブアプリケーションの構造も理解できたので、今後１年間は意味のないコミットを減らしコミット自体のクォリティを高めて行きたいと思います。

## 感想

私はずっと完璧にやりこなすことを大事に思っていました。なので少しづつ完成して行くこと、未完成のままに終わることに否定的でした。ですが、未経験者として開発の仕事をやることになり、「完璧」のところか何かを始めることすらとても難しいことでした。
毎日コミットの始めた初期にはこういう下手なコミットで本当に何かの結果になるのか、について不安がありましたが今が確信を持って言えるようになりました。「取り敢えずなんでもやってみる方が絶対正解」とのことをですね。
API Connect製品提供のREST APIを使用して環境設定を自動化する

#はじめに
以前、[こちらの記事](https://qiita.com/ryota_n/items/aff5627d2ef4cfbb5d51)で環境のセットアップをToolkitで自動化することができることを紹介しました。
こられのコマンドは、裏で製品提供のREST APIが呼ばれています。この仕様は、[Open API Explorer Documentation ](https://apic-api.apiconnect.ibmcloud.com/v10/)のサイトにまとまっています。


具体的なAPI呼び出しの詳細は、以下のような方法で確認することも可能です。

* Toolkitコマンドのデバッグオプションで確認（--debug）
* API Manager等のブラウザー操作をトレースで確認

この記事では、製品提供のREST APIを使用して環境設定を自動化する方法を紹介します。


#前提と準備

今回の稼働確認は、API Connect v10.0.1.2の環境で行っています。
まず、REST APIを呼び出すためのCredential情報を取得する必要があります。Cloud ManagerやAPI ManagerからToolkitをダウンロードする際に、資格情報ファイルをダウンロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/a263b8ff-c5cb-ffba-a85c-d0a85ec026c0.png)

このファイルのデータは以下のような構造となり、今回使用するのは"toolkit"内の情報となります。


```json:credentials.json
{
  "cloud_id": "****",
  "toolkit": {
    "endpoint": "https://xxx.com/api",
    "client_id": "****",
    "client_secret": "****"
  },
  "consumer_toolkit": {
    "endpoint": "https://xxx.com/consumer-api",
    "client_id": "****",
    "client_secret": "****"
  }
}
```

#環境設定の流れ

GUI操作と同様に以下の流れで環境設定をREST APIで実施できます。
リクエストで必要なHTTPパラメーターは「はじめに」に記載の仕様で確認できます。

## プロバイダー組織の登録

* 1.1 CMCログイン
    * ログインで発行されるアクセストークンを取得して後続の処理で使用します
* 1.2 プロバイダー組織所有者の登録
    * プロバイダー組織所有者に割り当てられるowner_urlを取得して次の処理で使用します
* 1.3 プロバイダー組織の登録

## カタログとコンシューマー組織の登録

* 2.1 APIMへログイン
    * ログインで発行されるアクセストークンを後続の処理で使用します
* 2.2 カタログを作成
* 2.3 （オプション）カタログのGatewayService登録（CMCにてカタログのデフォルトGatewayServiceを指定してあれば不要です）
* 3.1 コンシューマー組織所有者の登録
    * プロバイダー組織所有者に割り当てられるowner_urlを取得して次の処理で使用します
* 3.2 コンシューマー組織の登録
* 3.3 アプリケーションの登録

## APIの公開とテスト

* 2.1 APIMへログイン
    * ログインで発行されるアクセストークンを後続の処理で使用します
* 4.1 ドラフトAPIの作成
* 4.2 ドラフト製品の作成
    * ドラフト製品に割り当てられるprouct_urlを取得して次の処理で使用します
* 4.3 ドラフト製品の公開
    * 公開製品に割り当てられるproduct_urlを取得して次の処理で使用します
* 4.4 サブスクリプションの登録
* 4.5 公開したAPIのテスト呼び出し

## （オプション）環境の削除

以下の流れで上記の設定情報を削除できます。

* 1.1 CMCログイン
    * ログインで発行されるアクセストークンを取得して後続の処理で使用します
* 5.1 プロバイダー組織の削除
* 5.2 プロバイダー組織所有者の削除


#環境設定自動化例

上記の流れを自動化したサンプルJMeterシナリオを[こちら](https://github.com/RyotaNarita/jmeter-sample/blob/main/Script_Test-Environment-Setup-Scenario.jmx)で公開していますので、参考にしていただければと思います。
以下のような環境情報を設定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/7cb57285-ae7f-2e49-6ddf-b845fddaea4f.png)


以上
rails g scaffoldが返ってこない

#はじめに
railsチュートリアルの２章でrails generate scaffoldを実行したところコマンドが返ってきませんでした。最初は私の通信環境のせいだと思っていましたが通信環境を変えても変化がなく、調べたら原因が分かったのでその解決方法をメモがてら書いていこうと思います。

#具体的な内容

```
ubuntu:~/environment/toy_app (master) $ rails generate scaffold User name:string email:string
```

上記のコマンドを実行したところこの状態のまま5分以上変化がありませんでした。


#原因

結論からいうと今回の問題はgemfile内にあるspringというパッケージが原因です。
このspringの役割は（以下引用）

・Rails4からデフォルトで入ったアプリケーションプリローダー
・一部のタスクを前もって実行しておき、その後に必要なタスク時間を短縮する
・アプリケーションをバックグラウンドで実行し続けてくれる
・アプリーケーションコードを編集したら内部のリロードを自動的に実行する

となっています。

今回の場合、rails generate scaffoldとspringというパッケージが競合するためコマンドがうまく実行されていなかったようです。

なのでこの問題は下記のコマンドを実行してspringの機能を止めてからrails generate scaffoldを実行することで解決します。


```
spring stop
```

springを停止させた状態で下記コマンドを実行します。(userモデル等はrailsチュートリアル２章のもの)

```
$ rails generate scaffold User name:string email:string
```

今度はちゃんと実行されました。

```
ubuntu:~/environment/toy_app (master) $ rails generate scaffold User name:string email:string
Running via Spring preloader in process 19734
      invoke  active_record
      create    db/migrate/20210705045655_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      create      test/system/users_test.rb
      invoke    helper
      create      app/helpers/us_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss
```


#まとめ

rails generate scaffoldとspringが競合した原因自体はわかりませんでしたが今回の件でエラーが起きた時には臨機応変に対応することが大切だと改めて感じました。

#引用

>https://dara-blog.com/about-rails-error05
【Docker】EC2の中のコンテナ化したアプリにアクセスできない時の原因　no.30

![パンプキン カフェ (9).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/7cd55e72-e33c-c851-1af7-dde02dd2421c.png)


こんにちは。まゆみです。

Dockerについての記事をシリーズで書いています。

『EC2でContainerをrunできたのに、ContainerのIPアドレスにアクセスしてもアプリにアクセスできない』

今回の記事では、そんな時にまず考えられそうな原因について書いていこうと思います。

<font color="Red">リモートにContainerをrun するところまでは、順調にいっていたという方向け</font>に記事を書きました。

ではさっそくはじめていきますね。

#インバウンドトラフィックは全部拒否されるのがデフォルト値

![EC2 (4).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4a17e2e5-4e60-60ff-1fc1-927f082058bf.png)
最後の段階でアクセスできなくなった方は、EC2インスタンスのセキュリティの設定にアクセスできない原因があるかも知れません。

なぜなら<font color="Red">EC2インスタンスの中に入っていくトラフィック</font>はディフォルトでは『全部拒否』になるからです。

すなわち、もしhttpからのトラフィックを受け入れたいのなら、インバウンドルールを変更しなければいけません。

(インスタンスから『外に向かうトラフィック』に関しては、この限りではありません。)

##インバウンドルールを編集する


![2021-07-05_14-29-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/4290bfd5-353f-bca8-ff97-22d5f7ad2d90.png)


![2021-07-05_14-32-10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/1eff65e1-a4cf-d5fb-ae73-dc3edb69b5cf.png)

『ルールを追加』をクリックします

![2021-07-05_14-38-54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/f99bc5b2-c45f-f68f-fdee-d336e12b5612.png)

タイプのなかの『HTTP』を指定して、ソースは『任意の場所』を選択します

![2021-07-05_14-42-49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1011305/5ed127ec-49d6-5f43-7e56-af41fca1a3e5.png)

設定を更新したら『ルールを保存』をクリックしてください。

#まとめ
アクセスできない理由は他にあるかも知れませんが、EC2インスタンスのセキュリティーグループを一度チェックしてみてください。


この記事が、あなたのお役に立てれば幸いです。
Java: Map#computeIfAbsentの使いどころ

Java 8で追加された[Map#computeIfAbsent](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-)の使用例について紹介します。

# こんなコードはありませんか？

たとえば、Mapに要素を追加するaddStudentメソッドがあります。

```java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SchoolEntity {

	private final Map<String, List<String>> studentMap = new HashMap<>();

	/**
	 * 学級に生徒を追加します
	 * @param classRoom 学級名
	 * @param studentName 生徒名
	 */
	public void addStudent(String classRoom, String studentName) {
		List<String> studentList;
		if (studentMap.containsKey(classRoom)) {
			studentList = studentMap.get(classRoom);
		} else {
			studentList = new ArrayList<>();
		}
		studentList.add(studentName);
		studentMap.put(classRoom, studentList);
	}
}
```

上記のaddStudentメソッドのコードは、下記の流れで実装されています。

1. Mapに指定のKey(classRoom)が存在するかを確認する
    1. 存在する場合は値要素(List)を取得する
    1. 存在しない場合は新規にArrayListインスタンスを作成し、取得する
1. 取得したList要素に対して、引数で渡されたオブジェクト(studentName)を追加する
1. 2番のListをMapにputする

やっていることは単純なのですが、ちょっと長いコードですね。

# Map#computeIfAbsentを使うと

上記のaddStudentメソッドの実装を、たった1行で書くことができます。

```java
public void addStudent(String classRoom, String studentName) {
	studentMap.computeIfAbsent(classRoom, (key) -> new ArrayList<>()).add(studentName);
}
```

とても便利ですね。

# SonarQubeでの検知

静的解析ツールであるSonarQubeでは、上記のようにMap#computeIfAbsentが利用できる可能性のあるコードを自動的に検知することができます。

https://rules.sonarsource.com/java/RSPEC-3824

# 参考URL

- [JavaDoc: Map (Java Platform SE 8) - computeIfAbsent](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Map.html#computeIfAbsent-K-java.util.function.Function-)
AWSが分からないからとりあえず用語だけ理解してみる

#AWS
- EC2
    - WindowsやLinuxなどをクラウド上で仮想サーバーとして稼働できる
    - 用途や予算に応じて、さまざまなOSやスペックの仮想サーバーを選択できる
- EBS
    - EC2にもストレージ機能はあるが、仮想サーバーが止まると内容が初期化されてしまう
    - データを永続的に保存したい場合は、EC2とEBSを組み合わせるのが一般的
    - EBSはEC2のドライブとして扱われる
    - 容量上限あり
- S3
    - 容量制限なし
    - 主にバックアップなどの用途で使用
    - EBSと比較して価格が安価
    - ★EBSのメリットってなんだ？?
- Aurora
    - MySQLやPostgresSQLと互換性のあるクラウド型SQLデータベース
    - DBの初期構築、設定、バックアップなどが自動化されている
    - 類似サービスにAmazonRDS(RelationalDatabaseService)
- DynamoDB
    - AuroraやRDS:リレーショナルデータベース
    - DynamoDB:NoSQL
- Lambda
    - サーバレスアーキテクチャの先駆けサービス
    - Java,Pythonなどのプログラムを記述し、Lambdaにアップロード
    - ユーザーアクセスなどのイベントをきっかけにプログラムが実行される
- Route53
    - DNSサービス
        - ドメイン登録/DNSルーティング/ヘルスチェックの3つの主要な機能を任意で組み合わせて使用


## マインドマスター
用語表を作成してみた。これ便利なのでおすすめ。
[AWS](https://www.mindmeister.com/1951922861/aws1)
Markdown記法

##Header見出し
- 大→小
    - # H1
    - ## H2

##コード書く
```ruby:title
Please write code
```
>\`\`\`ruby:title
Please write code
\`\`\`

##引用
>引用:「>」
>>さらに引用:「>>」

##インライン
[表示側](リンク先URL:http://〜)
`[表示側](リンク先URL:http://〜)`って書く

##強調
\*\***あいうえお**\*\*
前後を\*\*で囲むと太字になる

##チェックリスト
```
- [ ] タスク1
- [x] タスク2
```
- [ ] タスク1
- [x] タスク2




##Tips
- 特殊文字(\*\```\>とか)はバックスラッシュでエスケープ
    - Macでバックスラッシュは`option + ¥`
DBeaverでテーブルを作成する方法

##初めに
[本シリーズの目次はこちら](https://qiita.com/miyamura-figeo/items/57246bc5d32bd91af5ed)

##前提条件
● DBeaverをインストールしていること
 　　　[インストール方法](https://qiita.com/12345/items/48f6856e32fd618ea307)

●DDLコマンドを作成していること
　　　[DDL作成](https://qiita.com/miu31/items/f4689c9bdf142b0895f4)
##DDLを流してテーブルを作る

1.「SQL」のプルダウンボタンから、「新しいSQLエディタ」を選択してクリックする

　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/70f5b7ee-a834-d4d9-89ea-c0843684fae4.png)


2.「script」を押して、作成したDDLコマンドを入力する
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/56bb0144-b12d-49a1-401d-85528fb0b0ec.png)

3.コマンドが入力できたら、「SQL文を実行する」ボタンをクリックする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/2a4758a9-959a-fe02-a23f-7aad5fe8da54.png)


4.「スキーマ」＞「public」＞「テーブル」の中に「USER_master」というテーブルが作成されていればOK
　　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/73590dd8-b615-c9c7-78b7-bfc1461471dd.png)

##レコードを登録する

「データ」タブを押すとDDLで流したテーブルの項目が入力されている状態。
ここにレコードを追加してデータを入力していく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/5807ab78-4c8f-7ff5-a573-aba319e226a1.png)


+ボタンを押したら↓のようにレコードが追加される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/bedd34cb-69f6-a8a3-4677-c42414d0dec1.png)

##補足
####DBeaverを保存しようとしてエラーが出た場合
　レコードにデータを入れて保存しようとしたら↓のようなエラーがでたら、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/de41b8dd-e63f-a44e-8cf8-af139855f544.png)


　この場合、ID列は【NOT NULL】＝【絶対にデータを入れないとダメ】と設定しているため、データが空の状態では違反だよ！と怒られてしまいました。

　下のようにID列に【１】とデータを入力すればエラーにならず保存ができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1185012/eba4f088-ca5f-fba9-2d02-4bb535533680.png)
apache

```bash
# apacheの起動
systemctl start httpd

# apacheの状態確認
apache -V

# apacheの再起動
systemctl restart httpd.service

# apacheの自動起動の設定を有効にする
systemctl enable httpd

# バーチャルホストの設定
vi /etc/httpd/conf.d/vhost.conf
```

- Apacheのエラー[httpd: Could not reliably determine the server’s fully qualified domain name]を対策する方法
https://onoredekaiketsu.com/apache-error-fully-qualified-domain-name/
練馬区の新型コロナウイルスのワクチン予約を効率化

# 注意

当記事で紹介する方法は、違法な手段や不正アクセスを推奨するものではありません。

# ログイン

必ずご自身の接種権番号とパスワードでログインしてください。

![ 2021-07-05 at 13.40.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729777/db8d29e4-a448-7e49-007c-441c2db52433.png)

# 検索

エリア・希望日をフォームで選択して検索ボタンをクリックする方式です。
会場に空きがあれば、フォームで選んだ接種希望日以外も検索結果に表示されるようです。
ここでは最短の日付（記事投稿時点の明日）を選択しました。

![Image 2021-07-05 at 10.40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1729777/6f25fd4d-13ea-7df5-270e-26089d6b0c23.jpeg)

空きがなければ画像のようなダイアログが表示されます。
`閉じる`ボタンをクリックすると、再度検索することができますが、前回入力した値はリセットされるので、再度手動で入力する必要があります。
本記事で紹介する方法では、この入力・検索のみを自動化します。

```js
//Idは自治体によって異なるかも　ソースを読んで確認してください
let area = document.getElementById("ifad_bd1547f7c7b88a5cbb572afc966f9783");
let year = document.getElementById("ifad_7b418a657c0401e799e3fee4c787fe99dy");
let month = document.getElementById("ifad_7b418a657c0401e799e3fee4c787fe99dm");
let day = document.getElementById("ifad_7b418a657c0401e799e3fee4c787fe99dd");

area.value = "希望するエリアを入力：Nerima,Syakujii等";
year.value = "2021";
month.value = "7";
day.value = "6"; //とりあえず明日の日付

//検索ボタンを呼ぶ関数
__doPostBack('SkBasicButton','btn_search_area');
```

これをブラウザのコンソールにコピペして実行するだけです。
空きがなければダイアログの`閉じる`ボタンを押さなくても、再度同じスクリプトを実行すれば再検索できます。
お盆前後はキャンセルが出やすいので、検索結果が表示されるまで何度も同じやり方で検索しました。

# 予約

あとは画面に従ってマウス操作で予約するだけです。
サクサク進めないとすぐ埋まってしまうので頑張りましょう。

# 備考

練馬区以外でも、予約システムにアイ・カラダ健診予約サイトが採用されている自治体でしたら同様の方法が使えると思います。
2次元コードの作成と解読

CTFで2次元コードが出題されることがあり、自分の勉強のために2次元コードを調べてみました。調べてわかったのですが、とにかく2次元コードは種類が多いので、本投稿では有名なコードにしぼり記載します。合わせて、各種コードの作成方法と解読方法も載せておきます。なお、これらのコマンド／プログラムの動作確認はUbuntu20.04で行っています。

#コードの種類

`https://qiita.com`を各種2次元コードでコード化してみました。

|コード名|コード|規格|
|:-|:-:|:-|
|qrcode|![qrcode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/5cf87178-9a36-2adf-dac3-f1b1f170d163.png)|ISO/IEC18004:2015|
|azteccode|![azteccode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/b306bffd-009a-f41e-2614-cf0a1345624c.png)|ISO/IEC24778:2008|
|datamatrix|![datamatrix.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/dfaa6e11-83c2-bb82-7044-8accdc363633.png)|ISO/IEC16022:2006|
|maxicode|![maxicode.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/9064bc64-bd52-0805-3618-557b4b4cbdf1.png)|ISO/IEC16023:2000|
|pdf417|![pdf417.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/593076/9b71bfa2-1a6e-c048-94da-596c09f8c2e2.png)|ISO/IEC15438:2015|

#コードの作成

treepoemというライブラリを使います。

* インストール

```bash:インストール
pip install treepoem
```

* 作成

```bash:bashの例
treepoem -o qrcode.png -t qrcode "https://qiita.com"
```

```python:pythonの例
import treepoem
code = treepoem.generate_barcode(barcode_type='qrcode',data='https://qiita.com')
code.save('qrcode.png')
```

※treepoemにはもっと多くのコードが入っていますので、興味があれば調べてみるといいかもしれません。

#コードの解読

ZXing（ゼブラクロッシング）はGoogle社製のオープンソースのライブラリで、1次元・2次元コードの解読ができます。今回はこれを使います。

* インストール

ZXingはJAVA上で動作するためJAVAのインストールが必要です。

```bash:インストール
apt install default-jre
pip install zxing
```

* 解読

解読のプログラムを記載します。コードの種類判別は自動です。

```bash:bashの例
zxing code.png
```

```python:pythonの例
import zxing
reader = zxing.BarCodeReader()
code = reader.decode('code.png')
print(code.raw)
```
「新着メッセージをダウンロードするのに充分なディスク領域がありません」と言われた場合 (Thunderbird)

### 環境
Thunderbird 78.11.0

### 経緯
Webサーバーのリプレイス後にメール送受信テストをしていると、メールアカウント設定後の送信画面で下記のエラー文言が表示される現象があったので、対応。
> 「新着メッセージをダウンロードするのに充分なディスク領域がありません」

たぶん一度、移行先サーバーに切り替えて送受信テストをしたことがあったので、今回のメールアカウントの設定が2回目になったことが原因となるきっかけと思っています（ほかのドメインでは出たことがなかったので）。

### 解決
下記の参考にしたサイトでは、
①一覧から確認したいフォルダを右クリック →「プロパティ」をクリック →そのフォルダのローカル内の保存先パスを実際に開く
②「送信済みトレイ」の名前を「 Sent 」に変更
とあったのですが、なぜか変わらず。

その後、
①「アカウント設定」→「送信（SMTPサーバー）の設定」で目的のドメインの送信サーバーを一度削除
②先ほどのメールフォルダ保存先フォルダ内で新規テキストを作成し、「Sent」とリネーム
とすることでエラーなく、送受信するようになりました。

#### 上記でもエラーとなった場合
手順が不足していたのか、上記でもエラーとなった場合があったので追記です。
内容は、メールアカウントのデータ保存先フォルダ名ごと作り変えるやり方になります。

その場合は、
1. Thunderbirdを開き、三本線アイコンから「アカウント設定」をクリック
2.　確認したいメールアカウントの「サーバー設定」をクリックし、「メッセージの保存先」を確認
3.  実際にエクスプローラー(Macの場合はFinder) で確認したパスにアクセス
4. `Mail\保存先アカウント名` にて現在設定されている保存先アカウント名を手打ちで変更
5. 再度Thunderibirdを開き、「メッセージの保存先」を作成したものに変更、Thunderbirdを再起動する
以上の流れで動くようになりました。




### 参考
https://agohack.com/thunderbird-not-enough-disk-space-error/
Ruby on Railsで作成したポートフォリオ - 青空図書館

# 概要
[青空文庫](https://www.aozora.gr.jp/) を元にして、**機能追加**および**UI改善**したポートフォリオを作成。

![TOP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/aac7ad2c-b911-86a6-3fee-cafbf0ed1e1c.png)

## 公開URL
### ポートフォリオ
[閉鎖 2021/12/15]
http://52.14.255.136/

### GitHub
https://github.com/taku-kw/AozoraLib

## 目的
青空文庫は、数多くの著作権切れの本を無料で公開している。
私は、このサイトで著名な作家(ex: 夏目漱石, 江戸川乱歩)の本を読んでいる。
その事により、面白さおよび教養を得られた。

しかし、利用していて、使いづらさを感じる事がある。
また、こんな機能があったら良いのに、と思う事もある。
上記の問題を解決したいと思い、本ポートフォリオを作成した。

## 使用技術
- Ruby on Rails
- HTML/CSS
- JavaScript
- jquery
- MySQL
- nginx

# 実装機能

## 1. 検索
検索する方法として、以下を実装した。

1. タブメニューから50音を選択することで、本を検索する。
2. タブメニューから50音を選択することで、作者を検索する。
3. タブメニューから本の分野を選択することで、本を検索する。
4. テキスト入力により、本を検索する。
5. テキスト入力により、作者を検索する。

### タブメニュー (1.2.3.) について
青空文庫は、50音で本および作者を検索する事ができる。
但し、複数回のページ遷移を行う必要があり、煩わしい。

そこで、タブメニューから50音を選択する事により、
1ページで検索が完了するようにした。

![タブメニュー.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/362922d8-778d-fc49-da30-a29ade402eff.gif)

### テキスト入力 (4.5.) について
青空文庫は、テキスト入力による検索機能が無い。
そのため、特定の本または作者を検索したくても、50音から選んで検索するしかない。

この問題を解消するため、本機能を実装した。

![テキスト入力.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/df7d3a3d-0f6e-67f7-01c3-fe9899cffecf.gif)

### データベース

青空文庫で公開されている、本情報のcsvデータを利用し、データベース化した。
https://www.aozora.gr.jp/index_pages/list_person_all_extended_utf8.zip

## 2. おすすめ人物
データベースからランダムに1人を選択し、
WebAPIを使用して、その人物の写真と概要を取得し、ページに表示している。

青空文庫には、自分の知らない作家または本が数多く存在する。
その中には、自分が面白いと感じるものがあるはずだ。
そういった本または作者と出会うために、本機能を実装した。

![おすすめ人物.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/b5061fec-c865-6e28-522b-e3cb2cb517a5.gif)

### WebAPIによるエラーの考慮
WebAPIを使用している以上、写真および概要が得られない人物がいる。
その場合、再度データベースから1人を選択してWebAPIを実行する。
但し、連続して情報が得られず、ページ遷移が出来ずユーザを待たせてしまう事を考慮して、リトライは5回まで、としている。
(リトライオーバーした場合は、何も表示しない。)

また、WebAPIから情報を得られなかった人物は、以降データベースから選択されないようにしている。

## 3. マイ本棚
アカウント機能を実装しており、各アカウントは本棚を持っている。
ユーザは、本棚へ本を追加をしたり、本棚から本を削除する事が可能。

本機能により、お気に入りの本や読みかけの本を、ユーザはストックする事ができる。

![マイ本棚.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/38345933-fd01-a50c-cef9-afa7d2144da5.png)

### ゲストログイン

ゲストログインした場合、予めマイ本棚には複数の本が格納されている。

これは、ゲストがマイ本棚がどういった機能なのか体験するために、そうしている。

## 4. [追記]新規公開作品 (2021/07/11)

新たに公開された日付順に、５つの作品を表示。

![新規公開作品.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/2995e86a-4f2c-bded-961a-d3b85274a194.png)

# [追記]レスポンシブデザイン (2021/07/09)

スマホ対応のデザインを実装。
![portfolio_smartphone.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/421601/da952aae-1209-cb36-a4ec-9f0f8ab85f06.png)

# [追記]バッチ処理 (2021/07/10)

## 新規公開された本をデータベースへ追加

毎日定刻に、以下ページにて公開された本を、データベースへ追加。
[青空文庫 - 新規公開作品](https://www.aozora.gr.jp/index_pages/whatsnew1.html)

Open-URIを使用してスクレイピングを行う事で実現している。

# 最後に

自分が思った事、感じた事を実現できて、達成感が得られました。
また、自分にとって意義を感じるモノを作っている感覚があって、モチベーションを維持し続けられました。
【UiPath】実行中に音楽を再生する

# はじめに

この投稿は、RPAツール「UiPath」での フロー実装例 の記事です。

RPAツールUiPathのコミュニティ「UiPath Friends」が企画する「**UiPathブログ発信チャレンジ2021サマー**」の 5日目の投稿になります。

企画の内容は [**こちら**](https://note.com/shumpei_w/n/n651cbdbec4e8) 。カレンダーのURLは [**こちら**](http://u0u1.net/sUwZ) です。

https://twitter.com/ShumpeiWatanabe/status/1405168150736359427?s=20


# 実行中に音楽を流したい

きっかけは、以下のツィートでした。

https://twitter.com/miya_gis/status/1407867780116869121?s=20

<br>


ロボットの実行中に音を出すのは「現在実行中です！」ということが分かって便利ですし、また音がしなくなったら「終わった！」と分かる意味でも便利です。

たとえるなら「トラックのバック音」みたいな感じかもしれません。

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

ちなみに、上記の動画で「個人的に巷でよく聞くトラックのアラーム音」は、デンソー製だったと分かりました。


# WindowsMediaプレーヤーを実行する

UiPathStudio で以下のようなフローを実装します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/3445da61-b618-339c-1d4b-4dd97002359a.png)

連続再生したい場合は、WindowsMediaプレーヤーの設定で「連続再生をオンにします」を押しておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/9f612911-4992-883e-d9f3-7476879da1d9.png)

ただし、この方法では「メディアプレーヤーを明示的に終了」させないと、メディアプレーヤーのウィンドウが残ってしまうので注意が必要です。

フローの終了時に音楽も自動的に停止させたい場合は、以下のようにInvokeCodeで実行すれば出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/154139/bdabda2f-7ab2-f6fd-909b-906f58b25c90.png)

``` VB
Dim wmp As New System.Windows.Media.MediaPlayer()
wmp.Open(New Uri("C:\Users\miyagi\Desktop\work\ichi.mp3"))
wmp.Play
```

しかし、この方法では上記の「連続再生」の設定が無視され、再生終了で音楽が止まってしまうのが残念です。

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

https://twitter.com/miya_gis/status/1411900673705218048?s=20

参考）音はこちらのフリー音源を使用させていただきました。

http://shw.in/sozai/japan.php

# 終わりに

いかがでしたでしょうか？ロボット実行中の無音が華やかになるかも知れません。

この記事が参考（？）になったら、LGTM をお願いします。
最後までご覧いただき、ありがとうございました。
【技術力UP！】Dev実験室の取り組み

:::message alert
2021年7月5日にnoteに投稿した記事の転載です（一部修正しております）
:::

こんにちは！ツクリンク株式会社でエンジニアをしている syun です。

異業種からツクリンクへ転職し、気が付けば1年半が経過していました。
何も分からない状態から始まりましたが、今では新機能の設計開発を担当したりとチャレンジングな仕事も任せてもらっています。

業務や自己学習を通して技術力を高めてきましたが、社内のある取り組みも自身の成長に大きくつながっています。今回はその取り組みについて紹介します。

2020年12月から新しく開発チームで始めた『Dev実験室』です。

# Dev実験室とは

ひと言で言えば定期的な勉強会です。
開発チームで雑談混じりに技術について語り合います。

### 目的
技術検討や検証の場（サービス以外の技術でも良い）を設けることで技術力UPやサービス改善につなげる
コミュニケーション活性化によるチーム力の強化

### 参加者
開発メンバー（現3名）＋ テーマによってはデザイナー

### 時間帯
毎週木曜 2時間程度

### 進め方
エンジニア主体で好きな技術を好きなように学ぶことができます。
各自テーマを持ち寄りその人がファシリテーターになって勉強会を進めます。輪番制で回しています。

ディスカッションの場としてZennを使うこともあります。

# 事例紹介
エンジニア主体で好きな技術を好きなように学ぶことができるので、これまで複数のテーマに取り組んできました。新しいFWやライブラリのチュートリアルをやったり、検証したい技術をサービスに取り入れてパフォーマンス測定したりしてきました。

![note_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/423337/569097b1-ff23-0e87-ef3f-731e93572548.png)


以下は過去にDev実験室で取り組んだテーマの一部になります。

### 技術系
Blitz.js、TypeScript、GraphQL、Hotwire、ViewComponent、Bubble（ノーコード）、Datadog

### その他
DB構造、設計デザインパターン、コインロッカーシステムの設計、Ruby コードリーディング、PostgreSQL指標調査、便利ツール検証、テストケース管理ツール調査

# 開発チームに現れた変化
Dev実験室は2020年12月から開始したため半年超えの取り組みになります。
約半年間で開発チームにこんな変化が現れました。

・新技術が導入された
・業務以外の技術に対しても情報感度が高くなった
・コミュニケーションが活性化した

# 自身に現れた変化
チームで勉強会を実施することで先輩から多くを学ばせていただきました。

### 分からない技術への抵抗が少なくなった
分からない技術に対してどのように情報収集して習得していくかを先輩から学ぶことができました。先輩を見てとにかく一次情報から収集していく癖が身についたと思います。

### 技術的知見が広がった
[Hotwire](https://github.com/hotwired/hotwire-rails)や[ViewComponent](https://github.com/github/view_component)をテーマとして扱うことがありました。Rails開発をしていて聞いたことがある程度でしたが、実際にローカル環境で動かすことで様々な気付きがありました。自分の中でも選択肢が増えたように思います。

# 最後に
Dev実験室の取り組みを通してチーム力が強化し、技術欲が満たされ、サービスが改善する結果となりました。今では開発メンバーにとってツクリンクの魅力的な点として挙がるほどの取り組みになっています。
C言語でゼロから作る機械学習♯00【はじめに】

みなさん、はじめまして！
ココアが大好きなもの創り屋
鷺ノ宮集です。
と言いましてもエンジニアとしてはまだまだ駆け出しなのでこれから色々なことを学び、そのアウトプットをこちらでしていきたいな～と考えております。

そして初めての記事はタイトルの通り

<strong>C言語でゼロから作る機械学習です！</straong>

大学の研究で機械学習を取り扱うことになりまして、その際に学ぶ事は多いと思い
このシリーズでアウトプット/発信し、もし機械学習を同じく学ぼうとしている方のお役にたてたら嬉しいです✨
ライブラリの多いPythonでも挑戦しているのですが、今回はC言語でのことをピックアップして記述していきたいと思いますので、よろしくお願いします！

はじめの記事はこのシリーズを始めるきっかけを書きました。
次回はパーセプトロンと線形分離などについて書こうと思います！
pyenv virtualenv コマンドメモ

Python 環境



```
## 例えばpython 3.6 の環境をインストール
$ pyenv install 3.6.0
## インストール済のpyenv version 一覧
$ pyenv versions
## 作成済のPyenv virtualenv 一覧を取得
$ pyenv virtualenvs
## Activate / Deactivate 
$ pyenv activate {name}
$ pyenv deactivate {name}
DBeaverからドライバインストールに失敗した場合の対応手順

# 環境
- macOS Catalina(10.15.7)
- DBeaver Community Edition 21.1.1

# 発生したエラー
`Error resolving driver libraries`
ネットワークのファイアウォール設定などにより、DBeaverがドライバのインストールに失敗しているっぽい

<img width="600" alt="スクリーンショット 2021-07-05 10.25.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/d35c3d1b-c2aa-bc00-fce4-b6a54433d2dc.png">


## ドライバの設定を開く
`編集 接続`を選択
<img width="200" alt="編集設定.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/114214ee-ed01-e54f-8062-d71c2e532bbe.png">

`ドライバの設定を編集を押下`
<img width="500" alt="dbeaver-config.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/f45f906f-ff7d-beb8-a931-1402ecd82515.png">

## デフォルトの設定を削除する
`ライブラリ`タブを選択
青字のライブラリを全て選択し、右側の`削除ボタン`を押下
<img width="500" alt="スクリーンショット 2021-07-05 10.20.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/915b3c6c-ae4b-8e30-27ef-f89c7bc12956.png">

## ドライバのダウンロード
Mavenリポジトリからドライバをダウンロードする（バージョンは必要なものに適宜読み替えてください）
### oracle
- https://maven.xwiki.org/externals/com/oracle/jdbc/ojdbc8/12.2.0.1/ojdbc8-12.2.0.1.jar

### postgres
- https://repo1.maven.org/maven2/org/postgresql/postgresql/42.2.22/postgresql-42.2.22.jar
- https://repo1.maven.org/maven2/net/postgis/postgis-jdbc/2.5.0/postgis-jdbc-2.5.0.jar
- https://repo1.maven.org/maven2/net/postgis/postgis-jdbc-jtsparser/2.5.0/postgis-jdbc-jtsparser-2.5.0.jar

### MySQL
- https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.28/mysql-connector-java-8.0.28.jar

## ドライバファイルの配置
ダウンロードしたファイルを`ファイルを追加`から追加する
<img width="500" alt="スクリーンショット 2021-07-05 12.50.08 (1).png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/386230/01d2f43f-cb04-9fcc-c874-d3e61df89324.png">

# 終わりに
以上でドライバの設定は完了です。

#### 参考URL
- https://bleepcoder.com/ja/dbeaver/339548540/new-dbeaver-installation-error-connection-to-postgresql
【C++】可変長引数の覚え書き

#はじめに
ゲーム制作とかで、可変長引数使いたいと思い、詰まったので覚え書き。

#基本
基礎的な部分は以下の記事を参考にしました。
[Qiita:C言語　可変長引数関数について 【初心者向け】](https://qiita.com/keitean/items/fd2be6710efe681cc516)

#やりたいこと
今回、よくあるローグライクゲームを作っていて、
敵からのダメージなどで体力が増減した際、ログを流したいと思いました。

その際、文字列ログを扱うクラスとして、
Messageクラスを作りました。

#Message Class

ヘッダファイルはこんな感じ。

```c++:Message.h
#pragma once

// Create : 2021/07/05
// Update : 2021/07/05
// Author : Nyarll Creative / UNLUCKY

#ifndef MESSAGE_DEFINED
#define MESSAGE_DEFINED

#include <string>

// Message class
class Message
{
private:
	// <Message>
	std::string m_value;

public:
	Message();
	Message(std::string fmt_str, ...);
	~Message() = default;

	// <文字列設定>
	void SetString(std::string fmt_str, ...);
	
	// <文字列の取得>
	std::string& GetValue();
};

#endif // Message class
```

GetValueはm_valueを返しているだけなので省略。

今回は、SetStringについて。

##SetString

```c++:Message.cpp
void Message::SetString(std::string fmt_str, ...)
{
	int final_n, n = ((int)fmt_str.size()) * 2; /* fmt_strの２倍のサイズを予約 */
	std::unique_ptr<char[]> formatted;
	va_list ap;
	while (1)
	{
		formatted.reset(new char[n]); /* char配列をunique_ptrにラップ */
		//strcpy(&formatted[0], fmt_str.c_str());
		strcpy_s(&formatted[0], n, fmt_str.c_str());
		va_start(ap, fmt_str);
		final_n = vsnprintf(&formatted[0], n, fmt_str.c_str(), ap);
		va_end(ap);
		if (final_n < 0 || final_n >= n)
			n += abs(final_n - n + 1);
		else
			break;
	}
	m_value = std::string(formatted.get());
}
```

最初はstrcpyで作り動かしていましたが、もしも就職や転職で成果物として出す場合、
バッファオーバーフローの危険性の孕んでいるstrcpyを利用していると何か言われるかもしれません。

そのため、strcpy_sの利用をおすすめします。

#終わりに
これは覚え書きです、ご参考までに。