OmniAICreator/Qiita-1.07M huggingface dataset:
pyenvでpythonのバージョンが反映されない時

## 経緯
* **pyenv**を入れたら**google sdk**が動かなくなった。エラーの内容をみるとPythonのバージョンがどうもおかしいのでバージョンを確認したらsystemのデフォルトのバージョンが参照されていた。

```
% pyenv install --list
% pyenv local 3.7.9
% python -V 
Python 2.7.16
```

## 修正方法
* **~/.zshrc**または**~/.bashrc**へ書きを追記して**source ~/.zshrc**または**source ~/.bashrc**を実行

### 追記内容
* **pyenv**をインストールすると勝手に追記されていると思いますが、私の環境下では`eval "$(pyenv init --path)"`が追記されませんでした。

```~/.zshrc
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)" # これを追記
eval "$(pyenv init -)"
```

* 反映してバージョンを確認

```
% source ~/.zshrc
% python --version           
Python 3.7.9
```
【AWS認定試験 データアナリティクス–専門知識】試験勉強時に頭に入れておきたいビックデータ分析に関する知識一言解説。+試験の感想

# はじめに
こんにちは。
先日 AWS認定 データアナリティクス-専門知識 を受験し合格したので、試験勉強を始めるにあたって頭に入れておきたいビッグデータ分析についての基本的な知識について一言でまとめたものを残しておきたいと思います。
ついでに試験対策で使用した参考書についてや、試験を受けた感想も記しておきます。

# AWS 認定 データアナリティクス – 専門知識 とは
https://aws.amazon.com/jp/certification/certified-data-analytics-specialty/

詳しくは上記リンク先に記載の通りです。以下のような能力が試される試験のようですね。

>・AWS データ分析サービスを定義し、それらが相互に統合する方法を理解する
>・収集、保管、処理、視覚化のデータライフサイクルに AWS データ分析サービスがどのように適しているかを説明する

# ビックデータ分析の知識一言解説
**データレイク**
データ分析用に加工される前の生データを一元的に保存しているもの。

**データウェアハウス**
データ分析の目的に合わせて、データが加工された後に保存されているもの。

**スタースキーマ**
データウェアハウスを構築する際の表現方法の一つ。分析する目的ごとに分類分けされているデータを、中央の「ファクト（事実）」表と分類の軸として使う「ディメンション（次元）」として配置すること。

**データマート**
部署ごとに分析に利用されるデータはデータウェアハウスの中の一部のみの場合があるため、部署別に分析用テーブルを作成すること。

**ETL**
データソースからデータを引き出し（Extract）、データウェアハウスで必要な形に整形し（Transform）、データウェアハウスにロード（Load）すること。

**データカタログ**
データレイクにたまったデータ自体についての情報をまとめたもの。

**行指向**
テーブルの行ごとにデータをまとめて保持しているもの。CSVやTSV、ApacheAvroが含まれる。

**列指向**
テーブルの列（=カラム）ごとにまとめて保持しているもの。ParquetやORCが含まれる。

## 利用した参考書等
###AWSではじめるデータレイク
https://www.amazon.co.jp/AWS%E3%81%A7%E3%81%AF%E3%81%98%E3%82%81%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AC%E3%82%A4%E3%82%AF-%E3%82%AF%E3%83%A9%E3%82%A6%E3%83%89%E3%81%AB%E3%82%88%E3%82%8B%E7%B5%B1%E5%90%88%E5%9E%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%83%9D%E3%82%B8%E3%83%88%E3%83%AA%E6%A7%8B%E7%AF%89%E5%85%A5%E9%96%80-%E4%B8%8A%E5%8E%9F-%E8%AA%A0/dp/491031301X

上記の一言解説の参考にもしました。
データレイクの概念から、ビッグデータ分析に利用されるAWSサービスについての詳細・ハンズオンまで載っていて、勉強を始めるにはとてもよい一冊だと思いました。

###koiwaclub
https://aws.koiwaclub.com/

言わずと知れたkoiwaclub。
投稿日現在147（7問 × 21題 ）問あるので、ある程度は試験対策できると思います。
問題文を見たら解答を即答できるくらいはやりこみましたが、後述しますがkoiwaclubだけだと万全な対策はできないと思った方がいいです。

##やっておいた方がよかった対策
###blackbelt
https://aws.amazon.com/jp/aws-jp-introduction/aws-jp-webinar-service-cut/

こちらも言わずもがなですが、やはり試験前に主要サービスについてある程度読んでおけばよかったと思いました。

# 試験の感想
koiwaclubでの試験対策を万全にした状態で試験に臨んだところ、自信を持って答えられた問題は20/65でした。
正直初見で問題文を解いていったときにわからな過ぎて絶望してました。
自信がない問題はすべてフラグをつけて、4回くらい見直ししたと思います。
私がいつも試験勉強するときにやってしまいがちな、問題だけをたくさん解いて答えを頭に入れる勉強の仕方をしてしまったので、ちゃんとblackbeltとか見た方がよかったなと思いながら試験を受けてました。
ただ裏を返せばkoiwaclubをやっていれば20問は必ず取れるということなのでやっていて損はないかなという感じです。

かなり絶望していましたが、普段の業務でAWSを扱っていることからサービスの全体像が頭に入っていたのか、はたまた勘が冴えていたのか、ギリギリ合格点を上回っていたのでよかったです。

# おわりに
普段ビッグデータ分析の業務に従事していないと、上記であげた用語についてもなんだったっけ？となってしまうことが多々あると思うので、しっかり頭に入れておきたいですね。
他の方の受験記などを読むと真面目に勉強している方がほとんどなのでそこまで参考にはならないかもしれませんが、私の体験談として記録しておきます。
DAS受験をしようとしているどなたかの一助になれば幸いです。
ボンバーマンの思考ルーチン（AI）

初めてのQiita投稿の練習に、去年自作したボンバーマンの思考ルーチンを備忘録として上げます。

![ezgif.com-gif-maker (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/dea48aa1-7d81-19ef-2f92-f37afedc7867.gif)

キャラ画像左下に表示されている数字「1」はプレイヤーの操作、それ以外はCPUの思考ルーチンです。爆炎の表現が微妙なのは許してください。

#思考ルーチン
以下のアルゴリズムで実装しました。

- **移動（オートコンプリート）**
    - 基本は直進  
    - 壁にぶつかる or 移動予定先が爆弾エリアなら方向転換を行う 
    - 一定の確率で何もないところでも方向転換を行う 
    - 現在マスが爆弾のエリアに入ったら「**退避**」に切り替える 
- **退避** 
    - 付近の安全なマスとそのルートを検索し、その中の最短ルートを選択・実行する 
    - 現在マスが安全なら「**移動**」に切り替える
- **爆弾設置** 
    - 現在「**退避**」状態ならこの処理には入らない 
    - 以下の２つの条件を満たしている時、爆弾を設置する 
        - 現在マスが壊せるブロックと隣接している 
        - 爆弾設置後に安全に退避できるルートが確保できる（再起関数で検索）
    - 一定の確率で何もないところでも爆弾設置を試みる
    - 爆弾設置後は「**退避**」に切り替える 

#このアルゴリズムの問題点
- 「敵を攻撃する」という概念がないので場合によっては永遠にゲームが終わらない
- 同じところを行ったり来たりしちゃう動作が不自然
![ezgif.com-gif-maker (2).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1384531/2e8a5f86-9a4b-633b-e2a4-1c108bc75a11.gif)

▲プレイヤー死亡後、３人のCPUが元気に駆け回る図

#最後に
コードを載せようと思いましたが長くなりすぎるので断念しました😢
grpcurlを使う

grpcurlで以前作ったプロジェクトのgrpcエンドポイントを叩きます。


https://qiita.com/gp333/items/24733ff4b95d9a4bb977

grpcurlは

> grpcurl is a command-line tool that lets you interact with gRPC servers. It's basically curl for gRPC servers.

https://github.com/fullstorydev/grpcurl

というもので、以前のプロジェクトでいう`client/main.go`の代わりにterminalからcurlすることを可能にしてくれる便利ツールです。

以下のコマンドでinstall

```
brew install grpcurl
```

# サービス一覧を表示

```
grpcurl -plaintext 127.0.0.1:19003 list
//Failed to list services: server does not support the reflection API
```

リフレクションが何かは以下で確認

> gRPC リフレクションは、対象の gRPC サーバがどのようなサービス、メソッドを公開しているかを知るための機能です。
> gRPC を使う上でリフレクションを有効にすると、gRPCurl や Evans といったツールを使う際に Protocol Buffers などの IDL を直接的に読み込まずにメソッドを呼び出すことができてとても便利ですが...（略）

https://syfm.hatenablog.com/entry/2020/06/23/235952

gRPCリフレクションを有効にする必要があるので、`server/main.go`を以下のように書き換えます。

```server/main.go
package main

import (
	"log"
	"net"

	"example.com/cat/service"

	pb "example.com/cat/proto"

	"google.golang.org/grpc"
	"google.golang.org/grpc/reflection"
)
func main() {
    listenPort, err := net.Listen("tcp", ":19003")
    if err != nil {
        log.Fatalln(err)
    }
    server := grpc.NewServer()
    catService := &service.MyCatService{}

    // ****今回追加****
    reflection.Register(server)
    // 実行したい実処理をseverに登録する
    pb.RegisterCatServer(server, catService)
    server.Serve(listenPort)
}
```

再度grpcurlを実行します。

```
> grpcurl -plaintext 127.0.0.1:19003 list
cat.Cat
grpc.reflection.v1alpha.ServerReflection
```

正常なレスポンスが返ってくるようになりました。

# メソッドの一覧

```
> grpcurl -plaintext 127.0.0.1:19003 list cat.Cat                     
cat.Cat.GetMyCat
```

メソッド一覧もかえってきました。

# サービスの呼び出し

```
> grpcurl -plaintext 127.0.0.1:19003 cat.Cat/GetMyCat 
ERROR:
  Code: Unknown
  Message: Not Found YourCat
```

リクエストパラメータがないので足してあげます。

```
> grpcurl -plaintext -d '{"target_cat": "tama"}' 127.0.0.1:19003 cat.Cat/GetMyCat
{
  "name": "tama",
  "kind": "mainecoon"
}
```

正常にgrpc serverにリクエスト送信できていることが確認できました。


# 参考

- https://qiita.com/yukina-ge/items/a84693f01f3f0edba482
Dockerfileやdocker-compose.ymlで悩まないruby on railsのDocker環境構築


Dockerfileやdocker-compose.ymlをよく知らないへっぽこエンジニアなので、
DockerHubのbitnamiのイメージを使って環境構築してみる。

```
$ mkdir ~/myapp && cd ~/myapp
$ curl -LO https://raw.githubusercontent.com/bitnami/bitnami-docker-rails/master/docker-compose.yml
$ docker-compose up
```
```
myapp_1    | => Booting Puma
myapp_1    | => Rails 6.1.4.1 application starting in development 
myapp_1    | => Run `bin/rails server --help` for more startup options
myapp_1    | Puma starting in single mode...
myapp_1    | * Puma version: 5.4.0 (ruby 2.6.8-p205) ("Super Flight")
myapp_1    | *  Min threads: 5
myapp_1    | *  Max threads: 5
myapp_1    | *  Environment: development
myapp_1    | *          PID: 1
myapp_1    | * Listening on http://0.0.0.0:3000
myapp_1    | Use Ctrl-C to stop
```
などとコンソールに表示されたら、
http://localhost:3000/
めでたくrailsが走ってるのが確認できる。

余裕ができたら、Docker-compose.ymlなどをみてみようかな。

ネタ元は

https://hub.docker.com/r/bitnami/rails/
VSCode上のJupyter Notebookはブレークポイントを使ったデバッグができるようになっていた

# はじめに
最近のVSCodeのアップデートで，Jupyter NotebookのUIが変更されました．その変更でブレークポイントが設定できるようになっていて（下図参照），もしかしてNotebookでもブレークポイントを使ったデバッグができるのでは？と思い，調べてみると[こちらのYouTube動画](https://www.youtube.com/watch?v=d2Yz4tivhPg)に行き着き，なんとかデバッグできたので共有したいと思います．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/797454fe-f8b9-22d5-1e8c-e51e389dc87b.png)

今までは，ブレークポイントを使ったデバッグを行うには，一度[こちらの記事](https://qiita.com/hanzawak/items/cb292f9c8e1fbe19fb64)のように`.py`に変換しないといけなかったですが，その必要もなくなったようです（下図）．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/ecf60baa-24e3-29d8-226e-e4f3f2dc481d.png)


# 設定方法
## 最新のVSCodeにアップデートする
基本は自動アップデートしてくれるので，不必要かと思いますが，VSCodeが最新でない場合，上図のようにNotebookにブレークポイントを設定できません．
なので，まずはVSCodeを最新のバージョンにアップデートしてください．（2021/08/23時 1.59.1）

## settings.jsonにデバッグ設定追記
歯車マーク→Settingsから

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/3d80bd34-df08-d518-086d-a7090cf2e699.png)

右上のファイルに矢印が付いているマークをクリックして，`settings.json`を開きます．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/75626355-ebc9-1ad2-ba3b-e992fb55c234.png)

以下を追記します．

```json:settings.json
{
    "jupyter.experimental.debugging": true
}
```

## ver6以上のipykernelをインストール

[こちらのYouTube動画](https://www.youtube.com/watch?v=d2Yz4tivhPg)曰く，ver6以上のipykernelが必要なので，**Jupyter Notebookを使いたい環境上で**ipykernelをインストール（アップデートします．）


```
(.venv)$ pip install --upgrade ipykernel
```

## デバッグモードで実行
上記まで済ませ，先程のステップでipykernelをインストールした環境のkernelを選ぶと，下図のようにDebugアイコンが出現します（しない場合は，3点ドットをクリックしてみてください．それでもない場合はVSCodeを再起動してみてください）．


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/17f97a78-3233-6912-9c60-d73759c3bfe2.png)


そのDebugアイコンをクリックし，後はセルを実行すると，以下のようにブレークポイントでしっかり止まってくれます！！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/ecf60baa-24e3-29d8-226e-e4f3f2dc481d.png)

## おまけ
Remote環境でもできました．
[settings.jsonにデバッグ設定追記](#settings.jsonにデバッグ設定追記)で開いたSettings画面でUserでなく，Remote環境の`settings.json`を編集すればOKです．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/66b025bc-0f72-56cc-62af-c67cbf528963.png)


# 参考
- [Issue](https://github.com/microsoft/vscode/issues/129136)
- [YouTube動画](https://www.youtube.com/watch?v=d2Yz4tivhPg)
- [VS CodeでJupyter Notebookを扱う方法（インストール + 使用方法 + 便利機能）](https://qiita.com/hanzawak/items/cb292f9c8e1fbe19fb64)
PowerAutomateDesktopを用いてexcel更新まとめの自動化までのメモ

前回のが一段落したから今度はとある社内Webページに
ある単語が出てきたらソレをトリガーにして
excel更新作業を自動化したいのでメモ失礼いたします。

#トリガー
ほげほげについて－７月末暫定版
という文字列があったら動作するようにしたいっ

#ヤルコト
とあるフォルダの上記トリガーの-1のファイルを自動更新したい……
RailsアプリにReactを導入[webpacker]

Webpackerを使ってRailsアプリにReactを導入します

##Rails new を実行時に導入

```ターミナル
% rails new app --webpack=react
```

##既存のアプリに導入

```ターミナル
%rails webpacker:install:react
```

必要なパッケージやapp/javascript/packs/hello_react.jsxが生成されます！
ストロングパラメーターとは何者なのか

初めまして、Sayu_2021と申します。
本日より不定期ですが投稿をしていきたいと思います。
最初なので、冒頭で自己紹介をさせてください。

<h2>経歴</h2>
|項目|詳細|
|:---:|:---:|
|年齢|もうすぐ30歳|
|学歴|　私立大学 法学部卒業| 
|経歴|塾講師　→　情報システム部　→　プログラミングスクール　→　SESに転職|
|学習した言語|HTML, CSS, Ruby, Ruby on Rails, javascript|
|学習したクラウドサービス|AWS, heroku|

<h2>目標</h2>
過去の仕事において、自信を持って仕事をするということが出来なかったので、目に見える成果を出すためにも何らかの資格を取得したいと思います。
Qiitaの目標は、自身の経験・学習した内容を元に、同じ年代の未経験からプログラミングを始める人の助けになる記事を１つでも多く投稿をすることです。

さてここからは本題になります。

<h2>ストロングパラメーターとは何者なのか</h2>
自身のストロングパラメーターに対しての認識があやふやだなと感じたので、改めてアウトプットをすることで整理をしたいと思います。

<h4>ストロングパラメーターとは？</h4>
端的に言うとpermitメソッドを使用して変更の許可を得たデータのことです。
permitメソッドがホワイトリストのような役割をしていて、それを通過したデータをストロングパラメーターと呼んでいると私は捉えています。

railsガイドでは以下の説明がなされています。

【Railsガイド（一部引用）】
https://railsguides.jp/action_controller_overview.html#strong-parameters
>strong parametersを用いることで、Action Controllerのパラメータが許可されるまでActive Modelの「マスアサインメント」に利用されることを禁止できます。つまり、多くの属性を一度に更新したい場合は、どの属性のマスアップデートを許可するかを開発者が明示的に指定しなければなりません。大雑把にすべての属性の更新を一括で許可してしまうと、外部に公開する必要のない属性まで誤って公開してしまう可能性が生じるため、そのような事態を防ぐための機能です。

>4.5.1 許可済みスカラー値
>以下の例で説明します。

>params.permit(:id)
:idキーがparamsにあり、それに対応する許可済みスカラー値に:idキーがあれば、ホワイトリストチェックをパスします。この条件を満たさない場合は、:idキーはフィルタで除外されます。これにより、外部からハッシュなどのオブジェクトを不正に注入できなくなります。

ただ、初心者には理解が厳しかったので、少しずつ読み解いてみます。

まず前提として、Ruby on Railsでは「マスアサインメント」という機能が用意されています。
この機能はDBに変更を加える際に複数のカラムを一括で指定をすることが出来ます。
一回の指示で複数のカラムを書き換えることができるのはとても便利なように思えます。

ですが、この便利な機能を利用して、不正に混入したデータまで一括指定してしまい、変更を加えられてしまうという脆弱性が発見されてしまったのです。
自分の作成したアプリが全く知らない人から大切なデータが書き換えられたり、場合によっては管理者権限で勝手にログインをされてしまったりするかもしれないと考えると、とても怖いことですよね。

実際にどんなふうに書き換えられてしまうのか、わかりやすく試してくださった方の記事がありますのでリンクを掲載させて戴きます。

【pikawaka　ストロングパラメーターとは】
https://pikawaka.com/rails/permit#%E3%82%B9%E3%83%88%E3%83%AD%E3%83%B3%E3%82%B0%E3%83%91%E3%83%A9%E3%83%A1%E3%83%BC%E3%82%BF%E3%83%BC%E3%81%A8%E3%81%AF

この脆弱性を回避するために生み出されたものが、「ストロングパラメーター」と言うものなのです。
ストロングパラメーターはRuby on Railsのバージョン4から追加された機能になります。

通常、フォームなどからデータが送られる際にはparamsと言うハッシュの中に格納されて送られてきます。
このparamsと言うハッシュの中身に対して、「permitメソッド」で特定のデータにだけ変更の許可を与えます。
変更の許可を与えられたデータのことをストロングパラメーターと呼んでいます。

<h4>permitメソッドの使い方</h4>
permitメソッドで許可をしないとDBにデータを保存・変更ができません。

binding.pryで挙動を止めてparamsの中身を見てみると、一番最後にpermitted: falseの文字が見えます。

![paramsのスクショ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925733/318be23b-7190-f952-b4a6-650265bb4ee2.png)

この部分がtrueにならないと保存ができないような仕様となっています。
なので、permitメソッドを使ってこれをtrueに変更しなければなりません。

設定方法は簡単でデータが送られてくるcontrollerに許可設定をしてあげるためのメソッドを記載してあげます。
例えばItemsコントローラーのcreateアクションに送られてくるデータを保存したい時には以下の通りになります。

```ruby
class ItemsController < ApplicationController

  def create
    @item.create(items_params)
  end

  private

  def items_params
    params.permit(:保存したいカラム名)
  end

end
```
privateの下に設定をしたitem_paramsと言う処理が完了したときに、permitted: trueとなり、初めてDBに保存ができるようになります。

ここから更にrequireやmergeと言うメソッドも登場するのですが、本日はストロングパラメーターとは何かと言う点にだけ焦点を当てたかったので、ここまでにしたいと思います。
記事を読んでくださってありがとうございました。

・ここの解釈違うよ！
・初心者ならこの本を読むと理解が深まるよ！
といったことがございましたらコメントでいただけると励みになります。
（専門用語が苦手なため、コメントを頂いて読み解くまでにお時間が掛かると思いますが、温かい目で見ていただけるとありがたいです…）

新参者ですが、何卒よろしくお願い致します。
PowerShellのFormアプリケーション起動用ショートカットを作るVBSを作ってみたよ。

#はじめに

PowerShellスクリプトでFormアプリケーションを作れるのはすごく素敵なんだけど、いかんせん起動がめんどくさくて標準だとPowerShellのプロンプトが表示されちゃうのがカッコ悪いよねということで、PowerShellスクリプトを起動するショートカットを自動的に作成するVBSを作ってみました。

#つかいかた

下記コードをメモ帳かなんかに貼り付けて、～.vbsという名前で保存し、出来上がったファイルにps1ファイルをD&Dするとスクリプトと同じ場所にps1ファイルと同名のショートカットが作成されます。ちなみにアイコンファイル(ico)も一緒にD&Dするとアイコンも設定できるおまけつき。

#参考サイト

http://www.roy.hi-ho.ne.jp/mutaguchi/wsh/object/shortcut.htm

#コード

```vb

sPath = "" 'ps1ファイルのパス
sIcon = "" 'アイコンファイルのパス

' 起動処理（Usage表示)
With WScript
    ' Usage文字列を作成
    sUsage = "Usage: " & .ScriptName & " <ps1 File> [IconFile]"
    ' ファイルが何も指定されてない場合
    If .Arguments.Count = 0 Then
        .Echo "ps1ファイルをD&Dしてください。" & vbCrLf & vbCrLf & sUsage
        .Quit
    End If
    ' 順不同にicoとps1が渡されていても正しい変数に格納する
    For i = 0 To .Arguments.Count - 1
        Select Case Right(.Arguments(i),3)
            Case "ps1"
                sPath = .Arguments(i)
            Case "ico"
                sIcon = .Arguments(i)
        End Select
    Next
    ' 引数リストにps1ファイルがない場合
    If sPath = "" Then
        .Echo "ps1ファイルではありません。" & vbCrLf & vbCrLf & sUsage
        .Quit
    End If
End With

' ファイルシステムオブジェクトとShellオブジェクトを生成
Set oFs = CreateObject("Scripting.FileSystemObject")
Set oSh = CreateObject("WScript.Shell")

' ショートカットのパスを作成
sLinkPath = oFs.GetparentFolderName(WScript.ScriptFullName) & "\" & oFs.getBasename(sPath) & ".lnk"

' 同名のショートカットがすでにある場合はいったん削除
If oFs.FileExists(sLinkPath) Then oFs.DeleteFile(sLinkPath)

' ショートカット作成処理
Set oSc = oSh.CreateShortcut(sLinkPath)
With oSC
    ' ショートカットのリンク先
    .TargetPath = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe"
    ' リンク先のオプション文字列
    .Arguments = "-ExecutionPolicy Bypass -WindowStyle Hidden """ & sPath & """"
    ' 起動時のウィンドウスタイル(1:通常サイズ、3:最大化、7:最小化)
    .WindowStyle = 7
    ' 作業フォルダ
    .WorkingDirectory = oFs.GetParentFolderName(sPath)
    ' アイコンファイル指定
    '（DLLの場合はファイル名末尾に”,番号"を追記することでアイコンの指定ができる）
    If sIcon <> "" Then .IconLocation = sIcon
    ' 編集内容を保存
    .Save
End With

' 後始末（いらないと思うけど一応）
Set oSc = Nothing
Set oSh = Nothing
Set oFs = Nothing

```
SELECT文での検索効率を高める方法

SELECT文に書いたWHERE句は何も工夫をしないと、それが使われない(指定したものがnullの)時も、必然的に指定することになる。結果、容量が重くなったり、検索速度が遅くなってしまう。

たとえば、こんなSELECT文があったとする。

[search_customer.sql]
SELECT　
    first_name, 
    last_name, 
    first_name_kana, 
    last_name_kana 
FROM 
    customer 
WHERE 
    first_name LIKE '%' || ? || '%',　
    last_name LIKE '%' || ? || '%',　
    first_name_kana LIKE '%' || ? || '%',　
    last_name_kana LIKE '%' || ? || '%';

[list.js (一部省略)]
…
function searchCustomerList(params) {
	var customerDb = new TenantDatabase().executeByTemplate(
			'unit_test/search_customer', {
　　　　　　　　first_name :DBparameter.string(params.firstName),
　　　　　　　　　last_name : DBparameter.string(params.lastName),
　　　　　　first_name_kana : DBparameter.string(params.lastName),
　　　　　　last_name_kana : DBparameter.string(params.firstName)　　　
       　　}
        );
…

これは、WHERE句で指定したものに合致するデータベースに登録するためのコードであるが、このままでは指定したものがnullの時もわざわざ検索しなければいけなくなる。
それは以下のように書くことで修正することができる。

[search_customer.sql]
SELECT　first_name FROM customer
/*BEGIN*/
WHERE
	first_name LIKE '%' || /*first_name:string*/ || '%'
	/*END*/
	/*IF last_name != null*/
	AND last_name LIKE '%' || /*last_name:string*/ || '%'
	/*END*/
	/*IF first_name_kana != null*/
	AND first_name_kana LIKE '%' || /*first_name_kana:string*/ || '%'
	/*END*/
	/*IF last_name_kana != null*/
	AND last_name_kana LIKE '%' || /*last_name_kana:string*/ || '%'
	/*END*/
/*END*/
;

[list.js (一部省略)]
…
function createParameterDB(params) {
	var firstName = params.firstName == '' ? null : params.firstName;
	var lastName = params.lastName == '' ? null : params.lastName;
	var firstNameKana = params.firstNameKana == '' ? null: params.firstNameKana;
	var lastNameKana = params.lastNameKana == '' ? null : params.lastNameKana;
	var dbParams = {
		firstName : firstName,
		lastName : lastName,
		firstNameKana : firstNameKana,
		lastNameKana : lastNameKana,
	};
　　　　 return DBparams;
}

function searchCustomerList(params) {
	var param = createParameterDB(params);
	var customerDb = new TenantDatabase().executeByTemplate(
			'unit_test/search_customer', {
			first_name : param.firstName,
			last_name : param.lastName,
			first_name_kana : param.firstNameKana,
			last_name_kana : param.lastNameKana,
                        }
        );
…

空文字の時はnullであると指定して、2WaySQLの範囲の有効化を適用することで、SQLの検索効率を高めることができる。

参照
(https://future-architect.github.io/uroborosql-doc/background/#_2waysql%E3%81%A8%E3%81%AF)
【ご安心ください】DST Root CA X3の有効切れた後ISRG X1に切り替わりの動作について

## 参考

以下ページを読んで、そんなことってあるの？？と思って試してみました。

https://songmu.jp/riji/entry/2021-04-30-letsencrypt-final.html

## 実際に試してみた

* 日付を本日8月23日でサーバーにアクセス

![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/c60c7606-ae09-4c8a-c419-06b940985209.png)


* 日付を有効期限の切れる10月1日に変更してサーバーにアクセス

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/94acfbe3-0635-8d44-8b6c-21d445507b7d.png)

なんと自動で `DST Root CA X3`がなくなる。これには驚きました。

これで古いOS (Windows XP IE6やAndroid7.1以前)からでもこれまで通りhttps接続ができます。

(xp sp3でも動作確認しました。)
osを作る その5

#概要

osを作る。
kernelをfreertosで検討してみた。

#システムコール

|システムコール|機能|freertos|
|:--|:--|:--|
YIELD			|プロセス管理||
GETPID			|プロセス管理|xTaskCreate|
IRQEN			|割り込み管理|taskENTER_CRITICAL|
IRQDIS			|割り込み管理|taskEXIT_CRITICAL|
CREATETASK		|プロセス管理|xTaskCreate|
ALLOCATESTACK	|プロセス管理|xTaskCreate|
SETUPTASK		|プロセス管理|xTaskCreate|
STARTTASK		|プロセス管理|vTaskStartScheduler|
STOPTASK		|プロセス管理|vTaskSuspend|
DELETETASK		|プロセス管理|vTaskDelete|
EXITTASK		|プロセス管理||
MALLOC			|メモリ管理|pvPortMalloc|
FREE			|メモリ管理|pvPortFree|
SEND			|プロセス間通信|xEventGroup|
SENDREC			|プロセス間通信|xEventGroup|
RECEIVE			|プロセス間通信|xEventGroup|
WAITEVENT		|プロセス間通信|xEventGroup|


以上。
PHPのmap()関数内でローカル変数を使う方法

Laravelを使っていた際に外で定義した変数をmap()関数内でグローバル定義したにもかかわらず値がnullだったので調べたところ下記の記事を見つけました。


https://stackoverflow.com/questions/48150838/how-to-access-to-variable-in-outside-the-map-function-in-laravel-php

#間違え例

```php:MainController.php
public function myloc(Request $request){
            $my_lat=$request->my_lat;
            $my_long=$request->my_lon;        

        $boxes->map(function($item,$key){
            global $my_lat,$my_long;

        $item['distance'] .= $item->distance1($my_lat,$my_long);
            return $item;

            });

 return view('index', ['boxes' => $boxes]);
    }
```

#修正後


```php:MainController.php
public function myloc(Request $request){

            $my_lat=$request->my_lat;
            $my_long=$request->my_lon;        

        $boxes->map(function($item,$key) use ($my_lat,$my_long){

        $item['distance'] .= $item->distance1($my_lat,$my_long);
            return $item;

            });
 return view('index', ['boxes' => $boxes]);
    }
```

#結論
use()を使うことでmap()関数内でローカル変数を使えます。

グローバル変数だと思って関数内でグローバル定義しましたが関数の中に関数を書いているためuse()で引数を渡す必要があるみたいです。
Minecraft統合版公式サーバーでプラグインを使う方法【LiteXLoader】

# はじめに
Minecraft用のサーバーソフトウェアには公式のBDS(Bedrock Dedicated Server)以外にもPMMPやCloudBurst MCのServerやNukkitがあります。
それぞれのメリット・デメリットとしては、

**公式サーバー**

- メリット
    - Mobやレッドストーン回路がほぼ完璧に動く
    - ~~公式なのでよくあるバグ技とかが使える~~
- デメリット
    - プラグインが入らない←今回の問題
    - Linuxはx64バイナリしか提供されてないのでARM系のラズパイとかでは動かない(強引に動かせるけど重い)

**非公式サーバー**

- メリット
    - プラグインが入れ放題
    - ランタイムがJavaの場合やソースコードが公開されている場合が多いのでARM系CPUでも動かせる場合が多い
- デメリット
    - Mobがスポーンしない(プラグインで解決するけど)


別に非公式サーバーを使っても良いんですが、友達とマルチプレイでサバイバルする場合などちゃんとMobがスポーンしてくれる公式サーバーを自分は使っているんですが、例えばDiscordにゲーム内チャットを転送したり誰がゲームに参加したかなどを通知したい場合、公式サーバー単体では絶対無理なのでこの記事の方法でプラグインを導入できる環境を構築していきます

## なぜBDSXを使わないのか
今回入れる`LiteXLoader`の他に似たものとして`BDSX`というものがあります
BDSXもnode.jsとTypeScriptでプラグインを書くことができます
ですが、いざ自分でプラグインを書こうと思ったとき解説ページが見た感じGithubのWikiしか無く、そのWikiの解説も良く分からなくて(多分TS前提で書かれているのかな？)、ある程度ドキュメントがまとも(中国語だけど)なLiteXLoaderを選びました


# 注意
公式が推奨しているものではないのでデータのバックアップなどをしておいてください

# ダウンロード

[Minecraftサーバー本体](https://www.minecraft.net/ja-jp/download/server/bedrock) (Linuxサーバーで使う場合でもWindows版をダウンロードしてください)
[LiteLoaderBDS](https://github.com/LiteLDev/LiteLoaderBDS) (BDSサーバーのAPIを提供するもの)
[LiteXLoader](https://github.com/LiteLDev/LiteXLoader) (LiteLoaderBDSからJavaScriptのAPIを提供するもの)

全て解凍して
MinecarftサーバーフォルダにLiteLoaderBDSのdllとかPluginsフォルダをコピーして、LiteXLoaderのdllやフォルダをそのPluginsフォルダにコピーしてください

# 設定
[Linux使ってる方は先にこちらをお読みください](#linux)
LiteLoaderBDSの`SymDB2.exe`をダブルクリックで開いてください、しばらくしたあと勝手に処理が終わって閉じます。
サーバーのルートディレクトリにシンボルファイルが生成されていると思います
あとは普通に`bedrock_server.exe`を起動すればPluginsフォルダのPluginが読み込まれてサーバーが起動します

試しにサーバーコンソールやゲーム内で`/version`と打ってみて、BDSのバージョンやLiteLoaderBDSのGithubのURLが帰ってきたら正常に動いています！

# おまけ
`plugins\LiteXLoader\LangPack`の日本語翻訳した言語ファイルを[ここ](https://gist.github.com/nerrog/1d62c38a80e76a374d3e5d8a6b1cc0de)置いときます
`config.ini`で言語変えれると思います。


#linux
LiteLoaderBDSはdllインジェクションという技術を使ってAPIを提供しているのでLinuxでは使えません
ですが、Linux上でWindowsアプリを動かす有名なソフト、`Wine`を使えば普通に動きます

Ubuntuだと

`$ sudo dpkg --add-architecture i386` 32bitアーキテクチャを有効にして
`$ wget -nc https://dl.winehq.org/wine-builds/winehq.key`
`$ sudo apt-key add winehq.key` aptのレポジトリキーを追加
`$ sudo add-apt-repository 'deb https://dl.winehq.org/wine-builds/ubuntu/ focal main'` (ここの`focal`はubuntuバージョンによって変わります)
`$ sudo apt update` おまじない
`$ sudo apt install --install-recommends winehq-stable` インストール
`$ wine --version` GOOD!

あとは`wine SymDB2.exe`、`wine bedrock_server.exe`すれば普通に動きます。

追記: Wine64ではdllのインポートエラーが出て使えなかったのでwineを使いましょう

追記の追記: [このissus](https://github.com/LiteLDev/LiteLoaderBDS/issues/26)で

# プラグインの作り方

~~これは時間があるときに詳しい記事を書こうかなと思ってます。~~
[追記]記事書きました

[LiteXLoader用のプラグインを自作する](https://qiita.com/nerrog/items/e68f31289e45a8becba0)

JSの知識が少しあればこの中国語のドキュメントを翻訳しながら読むと大体組めます

[公式APIドキュメント](https://lxl.litetitle.com/#/zh_CN/Development/)
Docker+Rails6のCORSとCSRFの設定

Rails6 に CORS と CSRF の設定を行う。
自分の練習用でしか使っておらず、はっきり言って CORS とか CSRF が邪魔なので、なんでも通すようにする。

# 環境

+ Ruby: 2.6.6
+ Rails: 6.1.4
+ Docker: 20.10.8, build 3967b7d
+ Docker Compose: 1.29.2, build 5becea4c

# CORS の設定

## Gemのインストール

Gemfile に 1 行追加する

```text:Gemfile
gem 'rack-cors'
```

Docker イメージを作り直す

```shell
docker-compose build
```

## Rails 側の設定

config/initializers の下に cors.rb ファイルを作る
config/application.rb に直接書くよりもこっちの方が好き
1～2 行目の frozen_string_literal は rubocop 用のおまじない
development 用なので設定はザルです
詳細は他のサイトで調べてください

```config/initializers/cors.rb
# frozen_string_literal: true

# Be sure to restart your server when you modify this file.

# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.

# Read more: https://github.com/cyu/rack-cors

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins '*'

    resource '*',
             headers: :any,
             methods: %i[get post put delete options head],
             expose: ['Access-Control-Allow-Origin'],
             max_age: 600
  end
end
```

# CSRF の設定

`skip_forgery_protection` を無効にしたいコントローラーに入れる。

application_controller.rb に入れればすべて無効にできる。
自分でしか使わない環境なので出来る荒業。

```app/controllers/application_contoroller.rb
class ApplicationController < ActionController::Base
  skip_forgery_protection
end
```
EKS の LoadBalancerController で http → https のリダイレクト

## やりたいこと
EKS の LoadBalancerController で http を https にリダイレクトさせたい

## よくある方法
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/tasks/ssl_redirect/

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  rules:
    - http:
        paths:
         - path: /*
           backend:
             serviceName: ssl-redirect
             servicePort: use-annotation
         - path: /*
           backend:
             serviceName: default-service
             servicePort: 80
```
いまいちな設定になる。
![スクリーンショット 2021-08-23 12.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69410/9438b96f-36ac-1a2c-307f-22fd4e8a4233.png)


## 簡潔な方法

アノテーション alb.ingress.kubernetes.io/ssl-redirect　を使う
https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.2/guide/ingress/annotations/

```yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/ssl-redirect: "443"
spec:
  rules:
    - http:
        paths:
         - path: /*
           backend:
             serviceName: default-service
             servicePort: 80
```

デフォルトアクションとして扱ってくれる。いいね！

![スクリーンショット 2021-08-23 12.06.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/69410/682370fe-e41a-13a7-ec95-1fe1bdc2a6c8.png)
Acronisで取得したバックアップイメージを仮想環境に対して復元する

## 表題を行うこととなった経緯
- あそこに納めたあのファイルを取得して！
- ここの設定、現地環境を見ないとわかんねぇや

とまぁ現地環境を見たいことはままある。
でも、現地行きたくねぇ（はやくクラウド化してくんねぇかな）

## 準備（というか要るもの）
- PC（仮想環境が動かせるやつ）
- Acronisのブータブルメディア（CD/DVDでもisoでもいい）
- 現地環境のイメージファイル

## 手順

1. イメージファイルを仮想ディスクにコピーする
    他の仮想環境にあたらしい仮想ディスクを作成してその中にイメージファイルをコピーしてもいいし、
    これ( [仮想ディスク(vmdk)の作成](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-42DF491F-37D5-47A0-9B9C-0C5E6E7C1B70.html) )で一発でできるかもしれない（やったことないけど）
    WindowsだったらVHDを簡単に作成できる → [仮想ハード ディスク (VHD) の管理](https://docs.microsoft.com/ja-jp/windows-server/storage/disk-management/manage-virtual-hard-disks#:~:text=VHD%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%20To%20create%20a%20VHD.%20%5B%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%5D%20%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%A7%E3%80%81,want%20the%20VHD%20file%20to%20be%20stored%2C%20)
    ともかく、外付けHDDにイメージ突っ込んでもAcronisが認識してくれない事があるので仮想ディスクに突っ込んでおくと楽

1. 空の仮想環境を作成する
    - 光学ドライブを接続しておく
    - 仮想ディスク（復元先用）を作成し接続しておく
    - イメージファイルを保管した仮想ディスクを接続しておく

1. 仮想環境の光学ドライブにAcronisをマウントする
    指定するAcronisはバックアップを取得した際のものと互換性があるものを選ぶ
    → [異なる製品バージョン間のバックアップアーカイブの互換性](https://kb.acronis.com/ja/content/14827)

1. 仮想環境を起動しAcronisをブートする

1. Acronisの復元手順に沿って復元する
    イメージファイル を 新規作成した仮想ディスク に対して復元する

1. 復元した仮想環境を再起動する。おわり。お疲れ様でした。
  - 再起動前にAcronisのメディアはアンマウントする（でないとAcronisをブートしてしまうからね）

1. では終わらないんだよな
    復元元（現地PC）と復元先（仮想環境）では当然ながらハード構成が違う。
    このままではせっかく復元したのにUPSソフトが誤作動して即シャットダウンされてしまうだろう。
    要するにイメージファイルを復元する場合、復元元と復元先でハードウェアの構成をあわせないといけないのだ。
    そこで仮想環境に対して復元した後にこれ↓をつかってハード絡み(ドライバーソフト)のめんどくさいことを解消する
    - [Acronis Universal Boot を使用して異なるハードウェアに復元](https://kb.acronis.com/ja/content/49160)
    
これでめでたくおしまい
なんちゅうバックアップ管理してんだこの会社・・・

注意：
WindowsOSを復元する場合はWindowsOSのライセンスを消費したはず

## 外部リンク
- [仮想ディスク(vmdk)の作成](https://docs.vmware.com/jp/VMware-vSphere/7.0/com.vmware.vsphere.storage.doc/GUID-42DF491F-37D5-47A0-9B9C-0C5E6E7C1B70.html)
- [仮想ハード ディスク (VHD) の管理](https://docs.microsoft.com/ja-jp/windows-server/storage/disk-management/manage-virtual-hard-disks#:~:text=VHD%20%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B%E3%81%AB%E3%81%AF%20To%20create%20a%20VHD.%20%5B%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%5D%20%E3%83%A1%E3%83%8B%E3%83%A5%E3%83%BC%E3%81%A7%E3%80%81,want%20the%20VHD%20file%20to%20be%20stored%2C%20)
- [異なる製品バージョン間のバックアップアーカイブの互換性](https://kb.acronis.com/ja/content/14827)
- [Acronis Universal Boot を使用して異なるハードウェアに復元](https://kb.acronis.com/ja/content/49160)
Ubuntu20にDockerとMinikubeをインストール


コンテナとストレージの関係を整理するべく、まずはDockerとMinikubeで環境を構築。
本当は丸ごとVMに作っておけばいいのですが、オフライン環境のラボでWifiルーターだけが頼りの環境だとVM上のOSにUSBルーター経由でインターネット接続が出来ず、直接サーバー上に入れたり消したりしているので、忘れないようにメモ。

環境
サーバー：Supermicro 1029P
OS:Ubuntu20
KB:Happy Hacking Pro2(関係ない）

１、準備
２、Dockerインストール＆non-rootで動くようにする
３、Minikubeインストール


#１、準備

まず古いDockerがあったら消さないと、訳が分からなくなります。

```
$sudo apt-get remove docker docker-engine docker.io containerd runc
```
クリーンインストール後の場合、まずはUbuntuのアップデートとパッケージ類をインストール

```
$sudo apt-get update
$sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release　\
    openssh-server
```

#２、Dockerインストール


curlでDocker関連を落とす

```
$curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```

設定ごにょごにょ

```
$echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```

インストール前のupdate

```
$sudo apt-get update
```
インストール開始

```
$sudo apt-get install docker-ce docker-ce-cli containerd.io
```
しばしコーヒーブレイク

動作テスト

```
$sudo docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
と出たらOK！
```

このままだとroot権限が必要なので、non-rootで動くようにする

```
$sudo groupadd docker
$sudo usermod -aG docker $USER
$reboot
```
再起動後sudo無しで実行して問題なければOK

```
$docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
```
#３、Minikubeインストール

以下参照
https://minikube.sigs.k8s.io/docs/start/

curlを使ってごそっと頂いてきてインストール

```
$curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube_latest_amd64.deb
$sudo dpkg -i minikube_latest_amd64.deb

起動
$minikube start
```
次にpodsをダウンロードします。
minikubeコマンドの後にkubectlコマンド。

```
$minikube kubectl -- get po -A
NAMESPACE     NAME                               READY   STATUS    RESTARTS   AGE
kube-system   coredns-74ff55c5b-fhw5g            1/1     Running   0          5m1s
kube-system   etcd-minikube                      1/1     Running   0          5m10s
kube-system   kube-apiserver-minikube            1/1     Running   0          5m10s
kube-system   kube-controller-manager-minikube   1/1     Running   0          5m10s
kube-system   kube-proxy-mpq7s                   1/1     Running   0          5m1s
kube-system   kube-scheduler-minikube            1/1     Running   0          5m10s
kube-system   storage-provisioner                1/1     Running   0          5m15s
```
直接kubectlでやりたいので、snapでclassicオプションを入れてkubectlをインストール。

```
$sudo snap install --classic kubectl
$kubectl get po -A
```
これで、環境は整いました。
ここからPersistentVolumeとかpodとかを作っていきます。
あと、ダッシュボードを出したりすると、周囲にやってる感をアピールできますね！

```
$minikube dashboard
```
![minikubedashiboard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/478729/61bc2641-8426-baea-a769-7c801508d6c8.png)






とりあえずここまで。
pandas-profilingの環境構築に苦労した

pandas-profilingの環境構築ができたとこまでの道を残しておきます。
anaconda環境にて。
もし、すでにpandas-profilingをインストールしていたなら,一度アンインストールを。

```:
conda uninstall pandas-profiling 
```

または

```:
pip uninstall pandas-profiling 
```

# インストール開始

```:
conda install -c conda-forge pandas-profiling=2.6.0 :
```

githubにもあるやつですが、ここでは2.6.0をインストールします。3.0.0ですすめると「concat() got an unexpected keyword argument 'join_axes'」というエラーがでてきて、きりがなかった。

あと、このエラーも多かった。
「ImportError: cannot import name 'ABCIndexClass' from 'pandas.core.dtypes.generic'」
原因はよくわかりませんが、とにかく　上のconda forgeのやつと

```:
pip install https://github.com/pandas-profiling/pandas-profiling/archive/master.zip 
```
を繰り返したことで、自然消滅
順当に進めていくと、次のエラー　imagehashというモジュールがなかったので、condaでインポート

```:
conda install imagehash 
```
よく、わからずまた進めると「KeyError: 'script_values' 」というエラー。わけわからん。
とりあえず、アップグレードしてみる。

```:
pip install -U pandas-profiling 
```
そして解決。無事使えるようになった。

# まとめ
おそらく、3.0.0から直接やると"join axes"っていうエラーがでるので、2.6.0あたりからインストールして、アップグレードするのがよいのかな？という感じです。
ARC061 C - たくさんの数式をPythonで実装

# 目的

AtCoder 版！蟻本 (初級編)で「たくさんの数式」で躓いたので理解したことを備忘録として残す。

https://qiita.com/drken/items/e77685614f3c6bf86f44

## [問題](https://atcoder.jp/contests/arc061/tasks/arc061_a)

1 以上 9 以下の数字のみからなる文字列Sが与えられます。 この文字列の中で、あなたはこれら文字と文字の間のうち、いくつかの場所に + を入れることができます。 一つも入れなくてもかまいません。 ただし、+ が連続してはいけません。

このようにして出来る全ての文字列を数式とみなし、和を計算することができます。

ありうる全ての数式の値を計算し、その合計を出力してください。


```python
s = input()
n = len(s)

def dfs(i, f):
    if i == (n - 1):
        return sum(list(map(int, f.split("+"))))
    return dfs(i + 1, f + s[i + 1]) + dfs(i + 1, f + "+" + s[i + 1])

print(dfs(0, s[0]))
```

## 実装内容

dfs(0, s[0]) を呼び出した時の様子を図示してみます。s = "125"なので、図ではs[0]を文字列の"1"として表してます。同様に、s[1]を文字列の"2"、s[2]を文字列の"5"として表してます。再帰的にdfsを呼び出すことで、総和を得ていることがわかります。



![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139678/68f79488-72f0-b7ca-6b12-e587984b2588.png)

## 参照

https://qiita.com/drken/items/23a4f604fa3f505dd5ad

https://qiita.com/kajirita2002/items/7f255feaf14a96e05146
Seriesのフィルタリング

#概要
条件に一致する要素を取り出したい場合、**bool型のシーケンスを指定すると、Trueとなるものだけを抽出**できる。

###IN
```python
import pandas as pd

fruits = ["apple", "orange", "banana", "straberry", "kiwifruit"]
data = [10, 5, 8, 12, 3]
#Seriesの生成
series = pd.Series(data, index = fruits)
print(series)

#bool型のシーケンスを指定
f = [True, True, False, False, False]

print(series[f])
```
###out
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/69f83c2a-29e8-076c-7c73-33724dbe9c67.png)


Trueのみ抽出できました。


##条件式の利用
上記ではbool型でシーケンスを作成したが、PandasではSeriesやDataFrameを使って条件式（**変数に対して,変数[条件式]**）を作成するとbool型のシーケンスを取得する事ができる。
さらに、**変数[ ][ ]**のように[ ]を複数後ろに付け加えると、複数の条件を指定する事が可能になる。ただし、**変数[ ~ and ~ ]という形はできない**。

```python
#条件式を利用
print(series[series >= 8])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1736279/2a5a5e8b-cd55-1b15-54a7-969725113ae8.png)

条件式によりデータ値が８以上のもののみ抽出できました。
【Swift】関数の引数としてタプルを設定した場合の挙動


# はじめに

関数の引数としてタプルを設定した場合の挙動をまとめました。（Xocde:12.5.1）
コードを見れば何がやりたいかわかると思います🙇‍♂️

## タプル内の変数宣言なし

タプル内の変数宣言なしの場合はタプルのインデックスでアクセス可能です。

```swift
func funcA(ints: (Int, Int)) {
    // indexでのアクセス
    print(ints.0) 
    print(ints.1)
}

funcA(ints: (1, 2))
// 1
// 2
```

## タプル内の変数宣言あり

タプル内の変数宣言ありの場合はタプルのインデックスでも、変数でもどちらでもアクセス可能です。

```swift
func funcB(ints: (a: Int, b: Int)) {
    // a,bでのアクセス ← 安全にアクセスできるのでおすすめ！！
    print(ints.a)
    print(ints.b)
    
    // indexでのアクセス
    print(ints.0)
    print(ints.1)
}

funcB(ints: (a: 1, b: 2))
// 1
// 2
// 1
// 2
```

## タプル内の変数宣言あり かつ 実行時に引数を省略する （エラーになる）

エラーになるので関数を宣言できません。理由は不明です。Apple さん、対応してください。

```swift
func funcC(ints: (_ a: Int, _ b: Int)) {} // なぜか引数としての変数を省略できないのでエラーになる
```

もちろんこれはできます↓

```swift
// もちろんこれはできる
func funcD(_ a: Int, _ b: Int) {
    // a,bでのアクセス
    print(a)
    print(b)
    
    // indexでのアクセス ← これはできない！！
    // print(0) // 0 ← 当たり前であるが 0 がプリントされるので注意
    // print(1) // 1 ← 当たり前であるが 1 がプリントされるので注意
}

funcD(1, 2)
// 1
// 2
```

# さいごに

関数の引数としてタプルを設定する場合も変数を設定できます！
NPSP のオブジェクト

https://trailhead.salesforce.com/ja/content/learn/modules/nonprofit-success-pack-administration-basics/understand-the-npsp-data-model

# NPSP で使用する標準 Salesforce オブジェクト

|オブジェクト名|用途|
|:-----------:|:------------------------------------:|
|取引先:Account|団体とのリレーションがある支援者またはクライアント世帯、企業、財団、他の団体を記録します。NPSP では 2 種別の取引先 (世帯と団体) を作成できます。世帯取引先は、配偶者や家族など、同じ郵送先住所を持つ支援者、クライアント、その他の賛助者の追跡に使用します。団体取引先は、財団、企業、政府機関など他の種別の団体です。|
|取引先責任者:Contact|個人の関係者と賛助者を記録します。すべての取引先責任者は取引先レコードに関連付けられている必要があります。取引先責任者オブジェクトは、支援者、会員、ボランティア、クライアント、スタッフなど、基本的に団体とやりとりする個人の追跡に使用します。|
|商談:Opportunity|支援、助成金、会費などの収益を生み出す活動を追跡します。見込みから確約済み、成立、受領済みまで支援の各ステップを記録できます。商談には個人からの金銭的支援、公共機関からの助成金、政府からの契約、企業からの現物支援、自団体に関連する商品の販売などが含まれます|
|キャンペーン:Campaign|計画、管理、追跡するアウトリーチを記録します。商談をキャンペーンに関連付けてメール、ダイレクトメールメッセージ、その他のコミュニケーションからの投資収益率を表示します。|

# NPSP で追加されるオブジェクト

NPSP では、チームが必要とするデータを記録するためのカスタムオブジェクトが追加されています。このデータモデルは、非営利団体コミュニティの参加とフィードバックを得て非営利団体コミュニティのために作成されたということもあり、業界標準になっています。

|オブジェクト名|用途|
|:-----------:|:------------------------------------:|
|住所:Address|世帯取引先の追加住所を保管します。これは季節によって住所が異なる場合や、世帯の一員が大学進学や兵役で家を離れる場合に便利です。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での取引先責任者と取引先の設定」を参照してください。|
|アフィリエーション:Affiliation|取引先責任者レコードと団体取引先レコード間のリレーションを記録します。たとえば、財団のプログラム責任者、企業支援者の従業員などです。詳細は、「リソース」から「団体とのアフィリエーションの作成」を参照してください。|
|提出書類:Deliverable|助成金申請や報告要件の要素など、商談の要件と期日を追跡します。詳細は、「リソース」から「Create and Manage Grants」(助成金の作成と管理) を参照してください。|
|エンゲージメント計画:Engagement Plan|Salesforce の ToDo の作成と割り当てを自動化して、スタッフの賛助者リレーション拡大のチェックリストを明確にします。エンゲージメント計画を使用して、初めての支援者を歓迎するプロセスや、最初の支援で 1,000 ドル以上を寄付した支援者にスタッフが受領確認できるプロセスを設定できます。エンゲージメント計画テンプレートオブジェクトにはさまざまなエンゲージメント計画が定義されています。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack でのエンゲージメント計画とレベル」を参照してください。|
|一般会計単位 (GAU):General Accounting Unit (GAU)|特定のプログラムに使用する必要がある支援や助成金など、特定の目的や特別な制限のために確保しておく資金を記録します。一般会計単位の割り当てレコードを作成して、商談を部分的に特定の GAU に指定します。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での商談の設定」を参照してください。|
|レベル:Level|条件を使用して取引先責任者やその他のオブジェクトレコードにランク付けし、グループに整理して、条件が変わったら自動的に移して再グループ化します。たとえば、年間の支援総額が異なる支援者に異なるレベルを設定できます。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack でのエンゲージメント計画とレベル」を参照してください。|
|支払:Payment|成立した商談に関する支払 (確約の一部として行われた支援など) を記録します。その場合、確約は商談レコードに記録され、そのコミットメントに関する各支援は支払として記録されます。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での商談の設定」を参照してください。|
|継続支援:Recurring Donation|定期的に反復して行われる支援を追跡します。たとえば、継続的な毎月の支援や特定のスケジュールで段階的に支払われる支援などです。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での商談の設定」を参照してください。|
|リレーション:Relationship|2 つの取引先責任者レコード (配偶者、親と子、友人、同僚など) 間のリレーションを記録します。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での取引先責任者と取引先の設定」を参照してください。|
|ソフトクレジット:Soft Credit|取引先責任者が直接の支援者でなくてもクレジットを受け取る支援を記録します。これは、取引先責任者が他の支援者の支援に影響を与えた場合や、1 人の個人が支援してそのクレジットを世帯の各メンバーに付与する場合などに使用します。詳細は、「リソース」のリンクから Trailhead の「Nonprofit Success Pack での商談の設定」を参照してください。|
【Rails】i18nをパーシャルに適用する

<h1>はじめに</h1>
Ruby on Railsの学習を始めツイッタークローン作成時にi18nを用いた国際化を試みました。
i18nをパーシャルに適用する際の方法の備忘録になります。

i18nの導入やapplication.rbの修正等は実施してある前提です。

<h1>環境</h1>
・rails     5.0.7以上
・rails-18n 5.1以上

<h1>結論</h1>
viewと同じ記載で適用されます。
例えば、ルートに設定してるならこれだけです。

```ja.yml
ja:
  delete: 削除
  retweet: リツイート
  favorite: お気に入り
```

<h1>方法</h1>
今回はルートパスに設定したviewの例のみ記します。
ここで対象になるのは[home.html.erb]です。

```routes.rb
root to:'static-pages#home' #このhome-viewにi18nを適用します。
```

```home.html.erb
<%=render 'microposts/micropost' %>
```

ルートの為、下記の記載で適用されます。

```ja.yml
ja:
  delete: 削除
  retweet: リツイート
  favorite: お気に入り
```

パーシャルのlink_toに<font color="Red">[t('文字列')]</font>の形で書くとi18nが適用されます。
適用させたい箇所によって書き方が違うので調べたほうが吉。

```_micropost.html.erb
<li id="micropost-<%= micropost.id %>">
<%= link_to t('delete'), micropost, method: :delete,data: { confirm: "You sure?" } %> #t('delete')
<%= link_to t('retweet'), retweet_path(id:micropost.id)%>
<%= link_to t('favorite'), favorite_path(id:micropost.id)%>
</li>
```

適用されれば[delete]が[削除]のように日本語で表示されます。
量子コンピュータのエラー訂正・耐性と時空の創発

#概要
量子コンピュータのエラー訂正のポイントは、①エラーの離散化と②スタビライザー符号によるシンドローム測定です。測定しちゃう、ことによってエラーを消しています。

![Screen Shot 2021-08-23 at 10.57.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123482/24238fe5-bcbd-6d8c-d74a-027216211aa1.png)


#内容
slide share でご覧ください。

[![Screen Shot 2021-08-23 at 11.17.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123482/7c8b2f34-ba67-f0b6-530f-e3bbce1f113c.png)](https://www.slideshare.net/KenjiTanaka5/ss-249993262)
[slideshare](https://www.slideshare.net/KenjiTanaka5/ss-249993262)

<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
AARファイルを依存関係に追加する方法(Kotlin)

## はじめに

AAR形式のライブラリをAndroidアプリのプロジェクトに追加する方法を紹介します。

## 「AAR」とは？

「__A__ndroid __AR__chive」の略で、Androidライブラリのことです。

構造上はAndroidアプリモジュールと同じく、ソースコードやリソースファイル、Androidマニフェストなどを含めることができます。
ただコンパイルすると、端末で実行できるAPKファイルではなく、Androidアプリモジュールの依存関係として使えるAARファイルになります。

たとえるならば、WindowsのEXEに対するDLLのようなものです。

JAR形式と比較して、リソースファイルやAndroidマニフェストを含められる点が異なります。

## 環境

- OS：macOS Big Sur 11.5.2
- Android Studio：Arctic Fox | 2020.3.1
- Kotlin：1.5.21
- Gradle：7.0.2
- Gradle plugin：7.0.0

## AARファイルの追加

### AARファイルの格納

AARファイルをAndroidプロジェクトのフォルダ内に格納します。
`app/libs` フォルダに格納するのが一般的です。

```shell-session
$ tree -L 3
.
├── app
│   ├── libs
│   │   ├── foo.aar
│   │   └── bar.aar
```

### 依存関係の追加

appフォルダ配下の「build.gradle」に依存関係を追加します。

```diff_groovy:/app/build.gradle
dependencies {
+   implementation fileTree(dir: 'libs', include: ['*.jar', '*.aar'])
}
```

`*.jar` も含める必要があります。

## AARファイルの呼び出し

`com.theuhooi.sdk.foo` パッケージにある `Bar` というクラスを呼び出す場合の例です。

```kotlin:MainActivity.kt
import com.theuhooi.sdk.foo.Bar

class MainActivity : AppCompatActivity() {
    fun bar() {
        val bar = Bar()
    }
}
```

## おわりに

AAR形式のライブラリをかんたんに追加することができました！

## 参考リンク

- [Android ライブラリの作成  |  Android デベロッパー  |  Android Developers](https://developer.android.com/studio/projects/android-library?hl=ja&authuser=1)
Python/LabelEncoder の基本的な注意点

# はじめに
あるデータの一部に機械学習モデルを適応させたい場面があった。データは質的変数を含んでおり、LabelEncoderを使用して数値データに変換させて使用していた。データの抜き出し方によっては LabelEncoder の結果が変わってしまうという事を紹介したい。
\#ちょっと考えれば当たり前のことであるが、自分がミスをしそうになったので、備忘録も兼ねて記事にしておく。

# 扱うデータセット
例えばRUN, STOP, NORMAL の三つの状態がある、以下のようなデータセットを考える。

```python
import numpy as np

data = np.array(["RUN", "RUN", "RUN", "STOP", "NORMAL", "STOP", "STOP", "STOP"])
```

これを全データでラベルエンコーダを適応すると、

```python
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
encoded_data = le.fit_transform(data)

print(encoded_data)
```

```
[1 1 1 2 0 2 2 2]
```

となる。

# 抜き出したデータに適応した場合

いくつかのパターンを考えてみる。

- 三つの状態が全部含まれている場合

```python
le_1 = LabelEncoder()
encoded_data_1 = le_1.fit_transform(data[2:5])
print(data[2:5], encoded_data_1)
```

```
['RUN' 'STOP' 'NORMAL'] [1 2 0]
```

- RUN, STOP しか含まれていない場合

```python
le_2 = LabelEncoder()
encoded_data_2 = le_2.fit_transform(data[1:4])
print(data[1:4], encoded_data_2)
```

```
['RUN' 'RUN' 'STOP'] [0 0 1]
```

- STOP しか含まれていない場合

```python
le_3 = LabelEncoder()
encoded_data_3 = le_3.fit_transform(data[5:8])
print(data[5:8], encoded_data_3)
```

```
['STOP' 'STOP' 'STOP'] [0 0 0]
```

当たり前といえば当たり前だが、含まれているデータの数でラベルは変わらないが、含まれているデータの種類が変わるとラベルは変わってしまう。なので、データの一部しか使わないなどの選択をしたときに気が付かなければならない。

# どんな場合でも同じラベルを付ける方法
これは、全データでラベルを付与したときにその情報を保存しておき、必要に応じて呼び出してやればよい。例えば以下のようなコードとなる。

```python
import pickle

#全データでラベルを付与する
le = LabelEncoder()
encoded_data = le.fit_transform(data)

#保存する
with open('label.pickle', 'wb') as web:
    pickle.dump(le , web)

#呼び出す
with open('label.pickle', 'rb') as web:
    le = pickle.load(web)

#適応する（三つの例すべてに適応）
encoded_data_1 = le.transform(data[2:5])
print(data[2:5], encoded_data_1)

encoded_data_2 = le.transform(data[1:4])
print(data[1:4], encoded_data_2)

encoded_data_3 = le.transform(data[5:8])
print(data[5:8], encoded_data_3)
```

```
['RUN' 'STOP' 'NORMAL'] [1 2 0]
['RUN' 'RUN' 'STOP'] [1 1 2]
['STOP' 'STOP' 'STOP'] [2 2 2]
```

全部のデータでRUN=1, STOP=2, NORMAL=0のラベルが付いた。

# おわりに
今回は自分がミスをしてしまう前に気が付くことができた。自身のためにもこういった、tips 的な記事はどんどん残していきたいと思う。
【Swift】プロトコルにプロトコルを継承させたときの挙動

# ポイント

- プロトコルを継承したプロトコルは継承元のプロトコルを満たさなくてもよい
    - プロトコルの要件を満たす必要があるのは継承したClass側
- 引数としてプロトコルを設定している場合、直接そのプロトコルを継承していなくてよい
    - 間接的にそのプロトコルを継承している関係であればエラーは起こらない

# 実験したコード

```swift
protocol HogeProtocol {
    var hoge: Int { get }
}

protocol MogeProtocol {
    var moge: Int { get }
}

protocol MogeHogeProtocol: HogeProtocol {
    var moge: Int { get }
    // var hoge: Int { get } ← HogeProtocol プロトコルを継承しているが hoge を宣言しなくてもよい
}

protocol HogeMogeProtocol: MogeProtocol {
    // var moge: Int { get } ← MogeProtocol プロトコルを継承しているが moge を宣言しなくてもよい
    var hoge: Int { get }
}

// パターンA
class MogeClass: MogeProtocol {
    var moge: Int = 0
}

// パターンB
class HogeClass: HogeProtocol {
    var hoge: Int = 2
}

// パターンC
class MogeAndHogeClass: MogeProtocol, HogeProtocol {
    var moge: Int = 0
    var hoge: Int = 3
}

// パターンD（MogeHogeProtocolはHogeProtocolを継承している）
class MogeHogeClass: MogeHogeProtocol {
    var moge: Int = 0
    var hoge: Int = 4
}

// パターンE（HogeMogeProtocolはMogeProtocolを継承している）
class HogeMogeClass: HogeMogeProtocol {
    var moge: Int = 0
    var hoge: Int = 5
}

// パターンF（HogeMogeProtocolはMogeProtocolを継承している）
class HogeMogeAndHogeClass: HogeMogeProtocol, HogeProtocol {
    var moge: Int = 0
    var hoge: Int = 6
}

class TestClass {
    let hogeClass: HogeProtocol
    
    init(hogeClass: HogeProtocol) {
        self.hogeClass = hogeClass
        print(hogeClass.hoge)
    }
}

/// 実験
let a = TestClass(hogeClass: MogeClass()) // MogeProtocol ← HogeProtocol は継承していないのでコンパイルエラー
let b = TestClass(hogeClass: HogeClass()) // HogeProtocol
let c = TestClass(hogeClass: MogeAndHogeClass()) // MogeProtocol + HogeProtocol
let d = TestClass(hogeClass: MogeHogeClass()) // MogeHogeProtocol（HogeProtocolを継承している）
let e = TestClass(hogeClass: HogeMogeClass()) // HogeMogeProtocol（MogeProtocolを継承している） ← HogeProtocol は継承していないのでコンパイルエラー
let f = TestClass(hogeClass: HogeMogeAndHogeClass()) // HogeMogeProtocol（MogeProtocolを継承している） + HogeProtocol
```
[Ruby] Array#include?メソッド

##はじめに
今回はinclude?メソッドについて紹介します。同じincludeでも、Rubyの中ではいくつかのincludeがあるのですが、この記事では配列に対して使うinclude?を説明します。

##Array#include?

配列に対して使用します。配列の中にある要素があるのかどうかを調べるためのメソッドです。その調べたい要素はinclude?に引数として渡します。
あったらtrue、なかったらfalseを返します。

```ruby
array = [1, 2, 3, 4, 5]
array.include?(3)
=> true

array.include?(6)
=> false
````

使用するオブジェクトが配列であれば調べたい要素のデータの型が数値だろうが文字列だろうが問題ありません。

```ruby
array = ["a", "b", "c", "d"]
array.include?("c")
=> true

array.include?("e")
=> false
```
TensorFlow Hub の SavedModel file does not exist

[TensorFlow Hub](https://www.tensorflow.org/hub?hl=ja)を使用したPythonスクリプトを実行した際に発生したエラーの対応備忘です。  

## 発生したエラー
```
OSError: SavedModel file does not exist at: xxxx
```

## 発生タイミング
1. TensorFlow Hubを使用したスクリプトを作成。当日は処理が正常終了しました。
2. 数日後に上記と同じスクリプトを実行した際にエラー発生。

## 一次対応
エラー文言では指定フォルダにモデルが無いと言われています。
そこで、発生したエラー 記載の[XXXX]フォルダを削除後、再実行すると正常終了します。
フォルダ名の例:9c2e20adec1bcc53f52a607443d72850fcb108e3

## 原因
初回実行時にTensorFlow Hubモデルが一時フォルダに退避されます。
次回以降の実行の際に同フォルダを参照しますがモデル自体(.pbと.pbtxt)は存在しないためエラーとなります。

## 根本対応
以下のようにDLしたモデルのパスをhub.load()の引数に設定するようにするとエラーが発生せず、定期的に実行できるようになります。

```
model = hub.load("/Users/user_name/Model/universal-sentence-encoder-multilingual-large_3/")
```

継続的に利用する予定のモデルであればローカルなり、所定の場所に退避して使うのが賢いようです。
PostgreSQL 事始め

# はじめに
PostgreSQLを使うことがあったので、使い方を備忘録としてまとめておくこととする。使ったコマンドをつらつらと書いていく。

# インストール
WSL2上にインストールするのはすごい簡単。`apt`コマンドを使えばよい。

```bash
$ sudo apt -y update 
$ sudo apt -y install postgresql postgresql-contrib
```

# PostgreSQL にログイン
postgres というユーザーが生成されるので、それにログインしてからPostgreSQLに入る。

```bash
$ sudo -i -u postgres
postgres:~$ psql
psql (13.3 (Ubuntu 13.3-1.pgdg20.04+1), server 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
Type "help" for help.

postgres=#
```

# 使ったコマンド
開発の都合上別ツールでDBがリストア済みなので、既存のDBに対しての操作コマンドをまとめていく。

- DB一覧の確認

```
\l
```

```
postgres=# \l
                               List of databases
     Name     |  Owner   | Encoding | Collate |  Ctype  |   Access privileges
--------------+----------+----------+---------+---------+-----------------------
 postgres     | postgres | UTF8     | C.UTF-8 | C.UTF-8 |
 template0    | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
              |          |          |         |         | postgres=CTc/postgres
 template1    | postgres | UTF8     | C.UTF-8 | C.UTF-8 | =c/postgres          +
              |          |          |         |         | postgres=CTc/postgres
(3 rows)
```

- DBへの接続

```
\c {DB名}
```

```
postgres=# \c postgres
psql (13.3 (Ubuntu 13.3-1.pgdg20.04+1), server 12.6 (Ubuntu 12.6-0ubuntu0.20.04.1))
You are now connected to database "postgres" as user "postgres".
```

- schema 一覧

```
\dn
```

```
postgres=# \dn
    List of schemas
    Name     |  Owner
-------------+----------
 public      | postgres
(1 row)
```

以下、出力は記事にできないが使ったコマンド。

- ある schema のテーブルの中身を出力

```
SELECT * FROM {schema名}.{table名};
```

- schema の削除（オブジェクトが含まれていても強制削除する）

```
DROP SCHEMA {schema名} CASCADE;
```

- テーブルに含まれるカラムの一覧を取得

```
\d {schema名}.{table名}
```

- 日付カラム（date）がある場合に最新のデータの取得

```
SELECT {column名}, MAX({date名}) FROM {schema名}.{table名} GROUP BY {column名};
```

- 日付カラム（date）がある場合に最新の全columnのデータの取得

```
SELECT * FROM {schema名}.{table名} AS t1
where {date名}=(
select max({date名}) from {schema名}.{table名}
where {column名}=t1.{column名}
)
```

- 日付カラム（date）がある場合に最新10件の全columnのデータの取得

```
SELECT * FROM (SELECT * FROM {schema名}.{table名} ORDER BY {date名} DESC LIMIT 10) AS a ORDER BY {date名};
```

# おわりに
DBを扱ううえでまだまだ覚えなければいけない事が多いので、勉強した順に記事にしていけたらと思う。