OmniAICreator/Qiita-1.07M huggingface dataset:
Java ScriptデータベースPouchDBとCouchbaseの現在の関係

# はじめに

本記事では、オープンソースのJavaScriptデータベースであり、ブラウザ上で実行可能なPouchDBと、NoSQLドキュメント指向データベースであるCouchbase Serverとの関係について、整理します。

## PouchDBとは

[PoucDB](https://pouchdb.com/)と言う名前を初めて聞かれる人もいるかと思います。 以下は公式サイトからの引用です。

>PouchDBは、Apache CouchDBに触発されたオープンソースのJavaScriptデータベースであり、ブラウザー内で適切に実行されるように設計されています。

>PouchDBは、Web開発者がオンラインと同様にオフラインでも機能するアプリケーションを構築できるようにするために作成されました。
これにより、アプリケーションはオフライン中にデータをローカルに保存し、アプリケーションがオンラインに戻ったときにCouchDBおよび互換性のあるサーバーと同期して、ユーザーが次にログインする場所に関係なく、ユーザーのデータの同期を維持できます。

下記の記事に書いたように、Couchbase ServerとCouchDBには、浅からぬ繋がりがあります。

[Couchbase Serverとは何か？〜歴史を交えた概観](https://qiita.com/yoshiyuki_kono/items/e705a943f2409c8ce06a)


# PouchDBとCouchbaseの関係の歴史

CouchbaseのSync Gateway 1.xでは、CouchDBとの互換性を維持する形で、PouchDBとのレプリケーションがサポートされていました。

Sync Gateway 1.0の時代に発表されたブログに以下のようなものがあります。

- [Using PouchDB and Couchbase NoSQL in Your Node.js Web Application](https://blog.couchbase.com/using-pouchdb-and-couchbase-nosql-in-your-nodejs-web-application/)
- [First steps with PouchDB & Sync Gateway](https://blog.couchbase.com/first-steps-with-pouchdb-sync-gateway-todomvc-todolite/)

Sync Gateway 1系は、2020年４月にEnd Of Lifeを迎えました。

# PouchDBとCouchbaseの現在の関係

Sync Gateway 2.xでは、REST APIからwebsocketへの移行など、プロトコルの大幅な仕様の変更が行われています。1.x時代のプロトコルは、既存のクライアント(Couchbase Lite)が利用されているシステムからの段階的移行に際する互換性維持の目的でのみ残されています。

PouchDBは、Sync Gateway 2.xのサポート対象とされていません。

また、PouchDBのGithubの以下のissueの回答にあるように、PouchDBでもサポート（テスト）されていないとされています。

>We dont test or aim for Couchbase support, if Couchbase has CouchDB compatibility then we would but they broke it in various ways previously

[PouchDB compatibility with Couchbase Sync Gateway #8015](https://github.com/pouchdb/pouchdb/issues/8015)

# ブラウザで稼働するデータベースと同期する別の方法

Couchbase Serverをリモートデータベースとして用い、ブラウザ上のローカルデータベースと組み合わせて利用するには、以下の方法が考えられます。

1. HTML5の仕様に含まれるオフラインストレージ（IndexedDB）を使用する
2. サーバーからの同期のために、Sync Gatewayのlongpoll APIを使用して変更をリッスンするプログラムを記述する。
3. クライアントから変更を同期するために、ドキュメントの書き込みを行うプログラムを記述する。

この場合、過去に、Sync GatewayとPouchDB間で実現されていた、アウトオブボックスでの同期とは異なり、同期処理については、外部で実装する必要があります。

# 最後に

PouchDBをブラウザ上のローカルDBとして用いることにプライオリティがある場合、そして/あるいは、リモートのデータベースとの「アウトオブボックス」の同期が必要な場合、PouchDBとCouchDBの組み合わせを利用することができます。

以下の関連情報に、CouchbaseとCouchDBとの選択に際して、利用することのできる情報を掲載しておきます。

# 関連情報

[CouchDBとCouchbaseの違い](https://www.it-swarm.jp.net/ja/nosql/couchdb%E3%81%A8couchbase%E3%81%AE%E9%81%95%E3%81%84/971216380/)

[COUCHBASE AND COUCHDB DIFFERENCES](https://www.couchbase.com/comparing-couchbase-vs-couchdb)
font awesomeのcssについて


```ruby:html
<a href="">
     <span class="btn twitter fa fa-twitter"></span>
     twitterで登録
</a>
```

こんな感じで書くとtwitterアイコンと「twitterで登録という文字が並列になる」
そのためtwitterアイコンのクラスでcssでmarginなどをつけれるようになり、微妙な感覚を開けられる
Amazon Resource Name とは？

## 勉強前イメージ

全体を管理するサービスで、
それぞれ名前をつけれたりするのかな？グループ化とかして

## 調査

### Amazon Resource Name とは

Amazon Resource Name とは略して、ARNと呼ばれる。
AWSサービスのリソースを一意に識別するための命名規則です。

### 命名形式

基本的なフォーマットは以下になります。

- arn:partition:service:region:account-id:resource
- arn:partition:service:region:account-id:resourcetype/resource
- arn:partition:service:region:account-id:resourcetype:resource

リソース名はサービスによって異なるので、
詳細は [AWSのリファレンス](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces) をご確認ください

### AWSコンソール上で確認

例えば、ELBのARNだと以下から確認することが出来ます。

![1EC2 Management Console - Google Chrome 2021-03-08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/129517/0fff979f-0aa6-82f1-adc7-9ed0dc1d84a3.png)

例えば、aws cliでリソース名を確認する際はこちらを使用したりします。

## 勉強後イメージ

全然聞いたことない..何やろって思ってたらARNのことか！！！
確かに雰囲気で知ってたけど、これが省略されてたことも知らなかった・・・
フォーマットとかも気にしたことなくて、勉強してよかった。

## 参考

- [Amazon リソースネーム (ARN)](https://docs.aws.amazon.com/ja_jp/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces)
- AWS Identity and Access Management（2）ARN（Amazon Resource Name）](https://tech.blog.surbiton.jp/tag/amazon-resource-name/)
毎日の検温チェックを切り抜けるためには（webスクレイピング) bypython

#目次
1.きっかけ
2.検温チェックの環境
3.苦労したこと、つまずいたこと
4.最後に
#1.きっかけ
あまり声を大にして言えない話なのは十分承知しています。このご時世検温でコロナが発覚することもあります。しかし朝は忙しく、電車に乗ってから検温チェックの存在に気づいたり、人に言われて適当な数字を打つくことが続きました。それで苦肉の策として今回自動で検温チェックをやってしまおうというのがこの記事の趣旨です。ここで気分を害された方はブラウザバックをお勧めします。
#2.検温チェックの環境
私のところでは現在Microsoft社のTeamsというソフトを使い、連絡を取っており、そこにアサインメントという形でアンケート形式の検温チェックがくる形になっています。このTeamsというソフトはなかなかの曲者で、PCでは鬼のようにメモリを食らい、私のくそスぺなスマホでは、しばしば固まったりします。それもやるきがなくなってしまった要因の一つです。
#3.苦労したこと、つまづいたこと
ここでは特に詳しくこ
こをどうしたということは書きません。初心者の私が普通に調べながらwebスクレイピングをやっていくうえでここでつまずいたというところを備忘録もかねて書いていければなと思っています。

一つ目に私が苦労したなと思うところはiframeの存在です。
いまだにどのような動きをしているのかはよくわからないのですが、別のウィンドウ判定になっている？らしく、find_elementなどで要素を見つけようとしてもiframeのタグで囲まれていると、そこの中の子要素を選択することができないというなんとも初見殺しなトラップです。
この対処法としては

```python
iframe=driver.find_elements_by_class_name("classname")[0]
driver.switch_to.frame(iframe)
```

のようにしてwebdriverをそのiframe内に変更してあげることだそうです。
ちなみに元に戻したいときは

```python
driver.switch_to.default_content()
```
のようにします。

二つ目はxpathの存在です。
一つのタグの中にclassもidもなくほかの属性で検索したいときに使えるxpathですが、そもそもこのxpathを理解するのに少し時間を使いました。
xpathはもともとルートを指定する使い方もあり、検索するとそっちばかりが目に移り、肝心な要素を探す使い方を探すのに苦労しました。またルートを省くとき、

```python
driver.find_elements_by_xpath("//input[contains(@class ,'a')]")
```
のように//をつけなくてはならず、そこにも気づくのにたくさんのエラーとお付き合いしました。
#4.最後に
初心者なりにつまづいた、時間を使ったと思うところをピックアップしてみました。これからwebスクレイピングやる日糸の少しでも力になれたら幸いです。
Windowsで文字化けしない zip ファイルを golang で作る

## はじめに
MacやLinuxでZIPファイルを作るとWindowsで文字化けする場合があります。
Shift-JISに対応したソフトを使用すれば良いのですが今回は golang でささっと圧縮プログラムを作ってみます。

## やってみよう

#### 必用なもの
* golang

#### 仕様
* CLIコマンド
* 入力文字コードはUTF8固定（Mac、Linux共にUTF8がデフォルト文字コード）
* パラメータで圧縮対処フォルダを指定する
* Windowsで文字化けしないようにファイル／フォルダ名をCP932に変換して保存する

#### 実装

まずはUTF8文字列 -> Shift-JIS文字列の変換関数を用意します。

```go:main.go
func Utf82Sjis(str string) (string, error) {
	iostr := strings.NewReader(str)
	rio := transform.NewReader(iostr, japanese.ShiftJIS.NewEncoder())
	ret, err := ioutil.ReadAll(rio)
	if err != nil {
		return "", err
	}
	return string(ret), err
}
```

次にZIPファイルのヘッダを作成する関数を用意します。
ヘッダ作成時にファイルのタイムスタンプも修正します。

```go:main.go
func FileInfoHeader(fi os.FileInfo) (*zip.FileHeader, error) {
	size := fi.Size()
	fh := &zip.FileHeader{
		Name:               fi.Name(),
		UncompressedSize64: uint64(size),
	}

	local := time.Now().Local()
	_, offset := local.Zone()
	fh.SetModTime(fi.ModTime().Add(time.Duration(offset) * time.Second))
	fh.SetMode(fi.Mode())
	var uintmax = uint32((1 << 32) - 1)
	if fh.UncompressedSize64 > uint64(uintmax) {
		fh.UncompressedSize = uintmax
	} else {
		fh.UncompressedSize = uint32(fh.UncompressedSize64)
	}
	return fh, nil
}
```

最後に指定フォルダ配下をZIPする関数を用意します。

```go:main.go
func Zip(source, output string) error {
	var f *os.File
	if "-" == output {
		f = os.Stdout
	} else {
		var err error
		f, err = os.Create(output)
		if err != nil {
			return err
		}
	}
	defer f.Close()

	archive := zip.NewWriter(f)
	defer archive.Close()

	info, err := os.Stat(source)
	if err != nil {
		return err
	}

	var baseDir string
	if info.IsDir() {
		baseDir = filepath.Base(source)
	}

	filepath.Walk(source, func(path string, info os.FileInfo, err error) error {
		if err != nil {
			return err
		}

		header, err := FileInfoHeader(info)
		if err != nil {
			return err
		}

		if baseDir != "" {
			//header.Name = filepath.Join(baseDir, strings.TrimPrefix(path, source))
			name, err := Utf82Sjis(filepath.Join(baseDir, strings.TrimPrefix(path, source)))
			if err != nil {
				return err
			}
			header.Name = name
		}

		if info.IsDir() {
			header.Name += "/"
		} else {
			//header.Method = zip.Deflate
			header.Method = zip.Store
		}

		writer, err := archive.CreateHeader(header)
		if err != nil {
			return err
		}

		if info.IsDir() {
			return nil
		}

		file, err := os.Open(path)
		if err != nil {
			return err
		}
		_, err = io.Copy(writer, file)
		file.Close()
		return err
	})

	return err
}
```

あとは作ったZip関数を実行する main() を作れば完了。

```go:main.go
func main() {
	if 3 > len(os.Args) {
		fmt.Printf("usage:\n\t%s [zip file] [archive directory]\n", os.Args[0])
		os.Exit(1)
	}

	output := os.Args[1]
	source := os.Args[2]

	if err := Zip(source, output); err != nil {
		panic(err)
	}
}
```

今回のコード一式は以下にあります。
やっぱツール作るなら golang がお気に入りです。
https://github.com/noridas80/zi18np
作ったtodoアプリを本番環境に移したときの自分用参考記事

だいぶ前回の記事から開いてしまいましたが、DJANGOでTODOLISTが完成したということを書いておきたいと思います。

GITHUBでもコード公開してみました。

https://github.com/takahashi123456/DjangoFirstProjectTODO

とりあえず、仮想環境ですが動いたのでよしとします

前回が前すぎてどこまでやったか覚えていませんが、とりあえずできることとして、TODO作成削除、観覧、時間設定などです。

３週間前にはできていたのですが、本番環境に移してたら色々トラブルが起き、手間取ってたらこんなに時が経っていました。

本番環境ではvultrのレンタルサーバーを借り、ubuntuで行いました。

いざできたと思ってみてみると本番環境(debug=false)では、staticファイルが配信されないだあーだこーだでcssや画像が使えないというトラブルに遭いました。

どうやら静的ファイルは本番環境では、自動的には配信されず、もう一つ何か（nginx,apacheなど？)間に挟んでやることで動作させることができるようです。
詳しくは下記の記事がわかりやすかったので置いておきます。

<a href="https://qiita.com/tamitarai/items/89835f6f63775155bc7c">DjangoをNGINXとgunicornを使って動かすときの流れ整理（自分用メモ）</a>

nginxやgunicornをいざ使い、設定してみて起動すると全然できていなかったり、nginxは動いているけど、なぜかstaticFILEが配信されていなかったりなどありました。（ディレクトリの記述ミスやIPアドレスのしてミス、スペルミスなどの初歩的なミスがほとんどでした。）
gunicornやnginxの設定は理解するまで大変で（今も理解しているかは・・・。）いろんな記事を見ていました。

https://www.sejuku.net/blog/28751
https://www.mathpython.com/ja/django-nginx-conf/
https://qiita.com/melos/items/91dc3b45a589ea5a369b
など、の解説サイトが良いかもしれません。
前回紹介した、受けていたUdemyの講義でもざっとは解説してくれています。
ですが、もっと理解するにはサーバサイド（？）の勉強とか必要なんだろうなと感じました。

サイトも作りましたが、ドメインが作れていないので出来次第公開したいと思います。

現在無職の私ですが、就活もしています。ですがあまり選考にたどり着けていません。まだまだ無職で時間は取れそうなので4月からはサーバーサイドの勉強もしていこうと思います。
がんばるぞ〜。
Snakemake 普通に動いていたのに、ジョブスケジューラになげたらエラーになるとき

# 概要

以下のことができるが、ジョブスケジューラにジョブが投入できない時
- 実行しようとしているコマンドは単独で実行できる
- ジョブスケジューラにジョブを投げることができ、正常に実行される
- snakemakeでも、ローカル実行は正常に実行される

以下のメッセージが行っていることが自分の今の状況と合わない気がした時。

> (one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)

# 結論

ジョブスケジューラで使われるデフォルトのシェルが `/bin/sh` とか `/bin/bash` でない可能性があるので、それを強制的に変更する

```
snakemake -j 999 --cluster "qsub -S /bin/sh"
```

## エラーログの例


```
$ snakemake -j 999 --cluster "qsub"
Building DAG of jobs...
Using shell: /usr/bin/bash
Provided cluster nodes: 999
Job counts:
        count   jobs
        1       create_finish
        1

[Sat Jan  9 15:48:47 2021]
rule create_finish:
    output: /home/manabu/test/finish
    jobid: 0

/home/manabu/test/touch_finish.sh
Submitted job 0 with external jobid 'Your job 275 ("snakejob.create_finish.0.sh") has been submitted'.
[Sat Jan  9 15:48:57 2021]
Error in rule create_finish:
    jobid: 0
    output: /home/manabu/test/finish
    shell:
        /home/manabu/test/touch_finish.sh
        (one of the commands exited with non-zero exit code; note that snakemake uses bash strict mode!)
    cluster_jobid: Your job 275 ("snakejob.create_finish.0.sh") has been submitted

Error executing rule create_finish on cluster (jobid: 0, external: Your job 275 ("snakejob.create_finish.0.sh") has been submitted, jobscript: /home/manabu/test/.snakemake/tmp.ptnx9ol2/snakejob.create_finish.0.sh). For error details see the cluster log and the log files of the involved rule(s).
Shutting down, this might take some time.
Exiting because a job execution failed. Look above for error message
Complete log: /home/manabu/test/.snakemake/log/2021-03-09T154847.033852.snakemake.log
```

## 公式FAQ

[Frequently Asked Questions — Snakemake 6\.0\.3 documentation](https://snakemake.readthedocs.io/en/stable/project_info/faq.html#my-shell-command-fails-with-with-errors-about-an-unbound-variable-what-s-wrong)

## 他の解決策

POSIX準拠に書いたら問題ないのかもしれない。
（調査中）共有フォルダのユーザ設定から特定のユーザが消える

WindowsServer2019で、共有フォルダのユーザ設定から特定のユーザが消える野を確認。
2021/03/09、ただいま調査中・・

■症状
サーバにFTP専用ユーザを作成、PUTするフォルダに設定。
→設定がいつのまにか消える
→フォルダに複数のユーザが設定されている中、そのユーザだけ消える
→消えるユーザだけがサーバ内に作成したローカルユーザなんだけどそのせい？

これまでこのやり方でずっとやってきたのだが・・何かある・・


■似たような事例
「共有フォルダに、詳細な共有→アクセス許可に"Everyone"（変更/読み取り）を設定しているが、設定が消えてしまい外部からアクセスできなくなる」
https://social.technet.microsoft.com/Forums/windows/ja-JP/2399f382-f4b6-4709-9651-38dc12feb09c/20849263771250112457125231248012395122893544332048123942084926?forum=w7itprogeneralja

■回答
共有フォルダーのアクセス許可設定はレジストリで行っていて、
「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Shares\Security」キー内に定義されています。
誰が(何のプログラムが)この設定を変更したのか、監査を取ってみるといいかもしれません。

■監査の設定やり方
「誰がレジストリを変更したか？ ： 監査ポリシー」
https://troushoo.blog.fc2.com/blog-entry-132.html
Enum x Dictionaryのインテリセンスが効かない？【Python】

# おやまあ

なんということでしょう？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/82109786-833b-e7dc-f81d-38e10921c648.png)

インテリセンスが効かないではありませんか。
これは一大事です。サボれません。

# なに書いてるの？

`characters`という列挙型を用意しています。
値はモンキーのジョージ、ネズミのミッキー、キャットのトムです。

この列挙型を使って、倉庫にストックされているキャラクターどもの台帳を作ろうとしています。
その台帳が、`GarageStockDictionary`です。早く帰って寝たいので急いで台帳を仕上げましょう。

いま、猫が４匹というところまで書いたのですが、次のモンキーを書くときに、
インテリセンスが効かないことが分かりました。ぬに？それはいかん！


# もう少し

様子見で、続きを書いてみたら認識してくれるかもしれませんよね。
きっとそうですよね？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/17ee1a18-6d22-3e81-abe4-4515a0a6ceda.png)

あれあれ？上手くいきませんね。これは、残業か？

# それでは

とにかく最後まで書いてみましょうか。やってみてから考えましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/342fc8de-d274-d3c2-b6f2-95f6e1dcd8f7.png)

シンタックスハイライトは効くようですね。カラフル嬉しい。
しかし、インテリセンスが欲しいところです。書くのダルイし。

# なんだって？

ちょっと、改行してみますか。見やすいし。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/134703/53304cce-60d7-81ad-9248-9939c28ce138.png)

あれ？改行したらインテリセンスが効くではないですか。
と思ったら、`monkey`とか`mouse`、`cat`が出てこない！

1. 先に、11行目を12行目にコピペして、
`value`のほうまである状態にする。
2. `.cat`を消す
3. `.`を入力

だと出ますね。インテリセンス。ああ面倒。

# まとめ

暫定対策としては、「先に前後を書けばインテリセンスが効くっぽい。」ですね。
これが重要な仕様なのか、バグなのか。要調査です。

# 環境

Python 3.9.1 | packaged by conda-forge | (default, Jan 10 2021, 02:50:22) [MSC v.1916 64 bit (AMD64)] on win32

```json-doc:.vscode\extensions.json
{
	"recommendations": [
		"ms-python.vscode-pylance",
		"ms-python.python",
		"visualstudioexptteam.vscodeintellicode",
		"oderwat.indent-rainbow",
		"kameshkotwani.google-search",
		"coenraads.bracket-pair-colorizer-2"
	]
}
```

```json-doc:.vscode\settings.json
{
    "python.testing.pytestEnabled": true,
    "python.formatting.provider": "black",
    "python.envFile": "${workspaceFolder}/.env",
    // "python.languageServer": "Pylance"
}
```

**Excelsior!**
Rで地図を描く【その3: 白地図を修飾する】

# 0. はじめに

シリーズその３では、白地図を修飾することをテーマに次の2つのトピックについてご紹介します。

1. 白地図にスケールバーを入れる方法
2. 白地図に緯度経度の軸を入れる方法

# 1. スケールバーと緯度経度を入れる

### 1.1 mapsパッケージ

`map.axes()`というコードを実行することで、緯度経度の軸とラベルを白地図に加えることができます。`map.scale()`というコードを実行することで、スケールバーを地図に書き込むことができます。スケールバーが海岸線と重なって見にくくなるのを避けるため、`x = 135`というオプションを追加しました。これは、東経135度の位置にスケールバーを描くことを指定します。

```
library(maps)
map("world", xlim = c(125, 145), ylim = c(30, 45))
map.axes()
map.scale(x = 135, ratio = F)
```
![スクリーンショット 2021-03-09 15.33.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449575/b8856cf0-3de5-22b7-cf17-ede0c53e6943.png)


### 1.2 rasterパッケージ

`axes = T`というオプションを加えることで、緯度経度の軸とラベルを白地図に加えることができます。`raster`パッケージでは、`scalebar`という関数を利用することでスケールバーを地図に書き込むことができます。以下のコードを実行すると、以下に添付した白地図が得られます。

```
library(raster)
jpnDat <- getData('GADM', country = 'JPN', level = 0)
korDat <- getData('GADM', country = 'KOR', level = 0)
prkDat <- getData('GADM', country = 'PRK', level = 0)
rusDat <- getData('GADM', country = 'RUS', level = 0)
chnDat <- getData('GADM', country = 'CHN', level = 0)

plot(jpnDat, xlim = c(125, 145), ylim = c(30, 45), axes = T)
plot(korDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(rusDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(chnDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(prkDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
scalebar(200, type = "bar", below = "km")
```

![スクリーンショット 2021-03-09 15.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449575/2e544371-e8cf-461a-d4c4-928f08c9cca1.png)
[Django]objectsはどこで定義されてるのか

#はじめに
Djangoではデータベースへアクセスする際データモデルを独自に定義する必要があります｡
そしてviews.pyなどで以下のように書き､データを扱います｡

```app/views.py
from django.contrib.auth.models import User

def index(request):
  user=User.objects.all()
```
このobjects変数はDjangoでデータモデルとデータベースを連結されるためのORMであるManagerクラスであると前回の記事に書きました

今回はこのobjects変数がどこで定義されているのかソースコードを辿って確認してみます｡
##行ったこと

上記のUserクラスが定義されているdjango.contrib.auth.modelsを開きます｡

```django/contrib/auth/models.py
from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager
  class Abstract(AbstractBaseUser,PermissionMixin):
    ...
  class User(AbstractUser):
    ...
```
辿ります｡

```django.contrib.auth.base_user.py
from django.db import models
...
class AbstractBaseUser(models.Model):
   ...
```
ここにもありません｡さらに遡ります｡

```django/db/models/base.py
...
class Model(metaclass=ModelBase):
  ...
```
どうやらこのModelBaseにありそうです｡

```django/db/models/base.py
...
class ModelBase(type):
  ...
  if not opts.managers:
      if any(f.name == 'objects' for f in opts.fields):
          raise ValueError(
              "Model %s must specify a custom Manager, because it has a "
              "field named 'objects'." % cls.__name__
          )
      manager = Manager()
      manager.auto_created = True
      cls.add_to_class('objects', manager)

  def add_to_class(cls, name, value):
        if _has_contribute_to_class(value):
            value.contribute_to_class(cls, name)
        else:
            setattr(cls, name, value)
 ```
ありました｡
pythonのビルトイン関数であるsetattr()でデータモデル生成時にobjects変数にManagerクラスを代入していますね｡

ということは､自分で独自のカスタムマネージャーを作成しobjectsに代入しても良さそうです｡
参考サイトにカスタムマネージャーを作成している方のリンクを貼っておきます｡

##参考サイト
[Django]カスタムマネージャーを使う(https://blog.narito.ninja/detail/105)
【Excel】【VBA】エビデンス作成を効率化！連続スクショ貼り付けの手間をマクロで削減

# はじめに
Webアプリのテストなどで、スクショを何枚も撮ってエクセルに貼り付けないといけないことがあります。
その時、一枚撮って貼り付けたあと、次に貼り付けるセルを毎回選択するのがすごい面倒。
![Picture1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/b954a1f1-424d-69ab-fd47-880c400fc3a6.png)


- **マウスの操作を極める。**
論外。というか、なるべくマウスを握りたくない。

- **画像の大きさを調整し、[Esc]→[Page Down]で次に貼り付けるセルに移動できるようにする。**
フリーのスクショツール（例えばWinShot）を使って、毎回同じ範囲を撮ることができます。
その範囲の大きさを指定してあげれば、[Page Down]押下時のスクロール量に合わせることができます。
でも、撮りたい画像がいつも同じ範囲とは限りません。

標準機能で程よい解決方法が見つからなかったので、マクロを登録しショートカットキーに割り当てることにしました。

# マクロ
要件は**「貼り付けと同時に、次に貼り付ける場所にフォーカスを当てる」動き**です。
![Picture2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1087193/653526f9-ff11-24d5-44e1-918cdd235cd9.png)
画像の左下から３行下にフォーカスを当て、そのセルが一番上に来るようにスクロールした後、画面の縦の長さの半分だけスクロールを戻しています。
スクロール位置を調整することで、**今貼り付けた画像とその下の部分を同時に見れるように**しています。
画像が正しく撮れているかの確認と、次に貼り付ける部分が正しいかの確認ができます。

具体的なコードは以下。

```vb
Sub AttatchImage()

    '画像をクリップボードにコピーしている状態で実行。
    '画像貼り付け後、画像の3行下のセルにフォーカスが当たる。

    'クリップボードの画像を貼り付け
    ActiveSheet.Paste
    '「画像の右下のセル」の行の3行下、「画像の左上のセル」の列に移動
    Cells(Selection.BottomRightCell.Row + 3, Selection.TopLeftCell.Column).Select
    '画面の高さの半分をスクロール
    ActiveWindow.ScrollRow = ActiveCell.Row - ActiveWindow.VisibleRange.Rows.Count / 2
    
End Sub
```

マクロを登録したら、任意のショートカットに紐づけて終わりです。
私は[Ctrl]+[Shift]+[V]にしました。
（GmailやEvernoteでは「形式をはずして貼り付け」を意味するので、混乱しないように違うキーがいいかもしれません。）

エビデンスファイルとは別に、**マクロを仕込んだファイルを一つ用意しておく**のがいいと思います。
違うブックのマクロを実行することができるので、エビデンスファイルにマクロを仕込む必要はありません。
マクロを使いたいときに、エビデンスファイルだけでなくマクロを仕込んだファイルも開いておくようにします。

#操作方法
画像をクリップボードにコピーした状態で、貼り付けたいセルを選択します。
その状態で、ショートカットキーを押下。
すると、画像下端の3行下のセルにフォーカスが当たり、かつそのセルが画面中央にスクロールされます。
これですぐに次の画像が貼り付けられます。


#注意点
**マクロで行われた操作は「戻る」ことができない**ので注意です。
手順が固まった作業で使うことをお勧めします。
【Hasura】GitLab CIでmetadataをapplyする

## 概要
`CI` で `Hasura` の `metadata` を実施するための最小構成

## .gitlab-ci.yml

`endpoint` と `secret` を書き換えることで利用できます

```yaml
stages:
  - metadata

metadata:
  stage: metadata
  image:
    name: hasura/graphql-engine:v1.3.0.cli-migrations-v2
    # イメージのエントリポイントをオーバーライドする
    # https://gitlab-docs.creationline.com/ee/ci/docker/using_docker_images.html#overriding-the-entrypoint-of-an-image
    entrypoint: ["/bin/sh", "-c"]
  variables:
    # TODO: `endpoint` を書き換えてください
    HASURA_GRAPHQL_ENDPOINT: "https://my-endpoint.com"
    # TODO: `secret` を書き換えてください
    # NOTE: 実際に設定する際は、`CI > Variables` より設定してください
    HASURA_GRAPHQL_ADMIN_SECRET: "myadminsecretkey"
  script:
    - hasura-cli metadata apply
  only:
    refs:
      - main
    changes:
      - metadata/*
```

## 関連記事
- [【Hasura】GitLab CIでmigrateをapplyする](https://qiita.com/Naoto9282/items/d8b06970157ed7c5306c)

## 参考文献
- [Hasura CLI Configuration Reference](https://hasura.io/docs/latest/graphql/core/hasura-cli/config-reference.html#environment-variables)
- [イメージのエントリポイントをオーバーライドする](https://gitlab-docs.creationline.com/ee/ci/docker/using_docker_images.html#overriding-the-entrypoint-of-an-image)
【Hasura】GitLab CIでmigrateをapplyする

## 概要
`CI` で `Hasura` の `migrate` を実施するための最小構成

## .gitlab-ci.yml

`endpoint` と `secret` を書き換えることで利用できます

```yaml
stages:
  - migrate

migrate:
  stage: migrate
  image:
    name: hasura/graphql-engine:v1.3.0.cli-migrations-v2
    # イメージのエントリポイントをオーバーライドする
    # https://gitlab-docs.creationline.com/ee/ci/docker/using_docker_images.html#overriding-the-entrypoint-of-an-image
    entrypoint: ["/bin/sh", "-c"]
  variables:
    # TODO: `endpoint` を書き換えてください
    HASURA_GRAPHQL_ENDPOINT: "https://my-endpoint.com"
    # TODO: `secret` を書き換えてください
    # NOTE: 実際に設定する際は、`CI > Variables` より設定してください
    HASURA_GRAPHQL_ADMIN_SECRET: "myadminsecretkey"
  script:
    - hasura-cli migrate apply
  only:
    refs:
      - main
    changes:
      - migrations/**/*
```

## 関連記事
- [【Hasura】GitLab CIでmetadataをapplyする](https://qiita.com/Naoto9282/items/b06d65a11858bf1ad862)

## 参考文献
- [Hasura CLI Configuration Reference](https://hasura.io/docs/latest/graphql/core/hasura-cli/config-reference.html#environment-variables)
- [イメージのエントリポイントをオーバーライドする](https://gitlab-docs.creationline.com/ee/ci/docker/using_docker_images.html#overriding-the-entrypoint-of-an-image)
Jetsonのpyenv仮想環境でタブ補完が効かなくなったら

JetsonでPython仮想環境を構築したときにタブ補完が効かなくなった時の対処の覚書です。

タブ補完が効かないのは`readline`モジュールが読み込めなくなっているためです。

とりあえずの対処は、システムPythonの`readline`モジュールをpyenv環境にリンクしてあげます。

pyenv環境は`$HOME/.pyenv`、Pythonバージョンは`3.6.11`の例です。

```bash
ln -s /usr/lib/python3.6/lib-dynload/readline.cpython-36m-aarch64-linux-gnu.so $HOME/.pyenv/versions/3.6.11/lib/python3.6/lib-dynload/readline.cpython-36m-aarch64-linux-gnu.so
```

根本解決には
pyenv仮想環境の再インストールが必要です。

必要なパッケージをインストール
実は他にも取り込めていないモジュールがあったようなのでまとめて更新。

```bash
sudo apt install -y libbz2-dev libreadline-dev libsqlite3-dev
```

```bash
pyenv uninstall 3.6.11
pyenv install 3.6.11
```
Ubuntu 21.04 に Apache2をdockerではインストール出来ない

## Ubuntu 20.10 の場合 (正常)

```Dockerfile:Dockerfile
FROM ubuntu:20.10
RUN apt update
RUN apt install -y apache2
```

![ok.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/b32c79a1-0947-c07f-27d8-207360a1faea.png)

## Ubuntu 21.04 の場合 (エラー)

```Dockerfile:Dockerfile
FROM ubuntu:21.04
RUN apt update
RUN apt install -y apache2
```

![error.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/25728/30c75203-b810-21b8-2df4-f219a0b5a1ab.png)

Ubuntu 21.04は正式リリース前のため待ち。
kotlin シェア実装　ShareCompat

## やりたいこと
アプリ内でSNSシェアをする方法

## 実装
```#MainActivity.kt
val snsShare = ShareCompat.IntentBuilder.from(this)
    snsShare.setText("https://google.co.jp")
    snsShare.setSubject("ここにテキストを入れる")
    snsShare.setType("text/plain")
    snsShare.startChooser()
```
R  ⇄ python 対応シート(表計算系)


pythonをやっていて、Rで言うあの関数が使いたい！(逆も然り)となった時のためのメモです。
私はpythonがわからないのでpythonメインで、Rの中身は適当です。
例のためDataFrameはdfと表記しています。（Rはtidyとごっちゃになってるかもしれないです、大体大丈夫ですが、、）
あと、```import pandas as pd```をはじめに入れているという前提でコマンドを書いています。
Kaggle Coursesのpandasをやりながら途中でまとめたものです。他にもあれば(私が上のような状態になった時に)随時更新していきます。
※tidyverseでできるtableとpandasのDataFrameは若干違うのであくまでも似たような関数を並べているという事だけご了承ください。


### unique() ⇄ df[~df.duplicated()]
重複をなくす
```df['column'].unique()```
であれば要素についてuniqueなものを出してくれる
```df['column'].nunique()```という個数だけ返してくれるものもあるみたい


### table() ⇄ df['column'].value_counts()
Rの標準関数とpandasの関数

```cross_tab.py
import numpy as np;
import pandas as pd;
x = np.array([1, 1, 1, 1, 2, 2]);
y = np.array(["a", "a", "b", "a", "a", "b"]);
pd.crosstab(x, y, rownames = ['x'], colnames = ['y']);
```

でもできるらしい。

### rename() ⇄ df.rename(columns={'before': 'after'})
pythonの方は列のインデックスでも指定できるとのこと。(index={0: '0_after', 1: '1_after'})
ちなみにDataFrameの軸の名前をつける場合にはdf.rename_axis()を使うらしい。

### rbind(first_df, second_df) ⇄ pd.concat([first_df, second_df])
tidyverseだと```bind_rows()```もありますね
pythonの方はリストにしないといけない、、(なぜ)
`ignore_index=True`とするとindexを振りなおしてくれます。

### left_join(left_df, right_df, by='common_name') ⇄ left.join(right, lsuffix='_1',rsuffix='_2')

pythonの方はkeyとなる列名を予めindexとして指定する必要がある？
`left = left_df.set_index(['column_1', 'column_2'])
right = right_df.set_index(['column_1', 'column_2'])`
あとpythonの方はjoinで使うkey以外で共通の列名に対してsuffixを指定できるみたいです。(Rは勝手に.x/.y がつくイメージでしたがRでも指定できるのかな→できるんですね！)

`df.merge(left, right, on='common_column')`もあるみたいです。うまく使い分けたら良さそうです。

### filter(df, 条件) ⇄ df.query('条件', inplace=False)
条件は''で囲む必要がある。dfのcolumnであればそのまま使えるが、スペースのあるものは`` ` ` `` で囲んだり、dfにない変数であれば頭に`@`をつける必要がある。
~~`inplace=True`にすると新たにindexをふってくれる~~　←挙動がよくわかりません、、

### arrange(df,column)　⇄　df.sort_values('column', ascending=True)
デフォルトはどちらも昇順。降順にする場合は、Rなら`desc(column)`、pythonなら`ascending=False`とする

### select(df, -column) ⇄ df.drop(columns='column', axis=1)
selectだと列の選択も除去も同じ関数でできるが、pandasだとそうもいかなさそう。。
残す列を指定する場合には
`df=df[['column1','column2']]`
でよい。
AWSアカウント単位の料金(コスト)をAPIで取得する

# やりたいこと

AWSアカウントの金銭面での利用状況を確認するため、プログラムで利用できる形で料金を取得したい。


# 金額の取得方法

[AWS CostExplorer](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/ce-api.html) を利用する。 正直なところ「AWS 料金 API」などと打つと全く別のものが引っかかって調べにくいだけだったので、ちゃんと取得できる方法さえ分かれば、後は使い方を調べるだけ。

# 実装例

Python (3.7以降) + boto3 を使った実装例。 この例では該当月の合計料金を取得している。
具体的には、CostExplorer の `get_cost_and_usage` を使って実際の支払い料金を取得する。
ここでは BlendedCost を料金として利用しているが、Management Console で表示される項目と一致していることを確認したので、多分この項目をチェックすれば大丈夫。

最低限必要なことだけを書いているので、どのようなレスポンスが返ってくるかの詳細は[ドキュメントを参照](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ce.html#CostExplorer.Client.get_cost_and_usage)のこと。

```python:awscost.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

from datetime import datetime
from dataclasses import dataclass
import calendar

import boto3


@dataclass
class AWSCostItem:
    year: int
    month: int
    month_usd: str


def cost_estimate(year: int, month: int) -> AWSCostItem:
    ce = boto3.client('ce')

    currdt = datetime(year, month, 1)
    (nextyear, nextmonth) = calendar.nextmonth(year, month)
    nextdt = datetime(nextyear, nextmonth, 1)
    start = currdt.strftime('%Y-%m-01')
    end = nextdt.strftime('%Y-%m-01')

    res = ce.get_cost_and_usage(
        TimePeriod={
            'Start': start,
            'End': end
        },
        Granularity='MONTHLY',
        Metrics=['BlendedCost']
    )
    costs = {
        t['TimePeriod']['Start']: t
        for t in res.get('ResultsByTime', [])
    }
    return AWSCostItem(
        year, month,
        costs[start]['Total']['BlendedCost']['Amount'])


if __name__ == '__main__':
    print(cost_estimate(2021, 3))
    print(cost_estimate(2020, 12))
```

```bash:実行例
$ pipenv run python awscost.py 
AWSCostItem(year=2021, month=3, month_usd='2.4293835664')
AWSCostItem(year=2020, month=12, month_usd='7.1592273264')
```

# 補足

AWSの料金は翌月に実際に〆るまで確定ではないので、ここで取得した値は正確ではなく予測値であることがある。 そのため、この用途で利用するのはある程度の誤差を含んでいても大丈夫な業務（料金予測やAWS料金の監視など) に使うのが良いだろう。
Power Systems Virtual Server インスタンス状態確認スクリプト


Power Systems Virtual Server サービスで、インスタンスの状態を確認してSlackへ通知する簡易スクリプトを作ってみました。
ご参考まで。

----

#### 環境
・IBM Cloud Power Systems Virtual Server
　　スクリプト変数に APIKEY と CRN(Cloud Resouce Name) 、URL(SlackのWebhook)を使用。
　　* APIKEYは"IBM Cloud コンソール => 管理 => アクセス(IAM) => IBM Cloud API キー"から作成して使用します。
　　* CRN は "ibmcloud pi service-list" コマンドを実行して出力される"ID"で確認が可能です。
　　* 使用しているリソースグループ名がスクリプト内で指定が必要です。
　　* 通知先の SlackWebhook は以下を参照して作成しておきます。
　　　　ご参考：[Slack での Incoming Webhook の利用](https://slack.com/intl/ja-jp/help/articles/115005265063-Slack-%E3%81%A7%E3%81%AE-Incoming-Webhook-%E3%81%AE%E5%88%A9%E7%94%A8) 

・スクリプトの実行場所 : Local Mac (or インターネット接続可能な Linux 環境)
　　* ibmcloud コマンド導入済み
　　* ibmcloud power-iaas plugin が導入済み
　　　　ご参考：[IBM Power Systems Virtual Server CLI Reference](https://cloud.ibm.com/docs/power-iaas-cli-plugin?topic=power-iaas-cli-plugin-power-iaas-cli-reference&locale=en)




----

スクリプトは以下です。
ご使用の環境に合わせて、 "< >" 内を環境に合わせてご変更ください。

```powervs_check_instance.sh
#!/bin/bash

## ibmcloud cli download
#curl -fsSL https://clis.cloud.ibm.com/install/linux | sh > /dev/null   <= Linux環境でibmcloud コマンドのダウンロードに使用

## login

export APIKEY="<使用するapikeyを入力>"
ibmcloud login --apikey $APIKEY -r jp-tok -g <resouce group名を入力> -f > /dev/null

export CRN="<ご使用のCRN(Cloud Resource Name)>"
ibmcloud pi service-target $CRN > /dev/null

## get instance information

rm instances.txt result.txt > /dev/null 2>&1
touch instances.txt result.txt > /dev/null

echo `date` > result.txt

ibmcloud pi ins | awk '{print $2}' | grep -v instances | grep -v Name > instances.txt

## check instance status

while read INSTANCE
do
 ibmcloud pi in "$INSTANCE" > "$INSTANCE"
 echo "#-------------------------------------------------------------------------------------------------------------#" >> result.txt
 grep ^Name "$INSTANCE" >> result.txt
 grep ^Status "$INSTANCE" >> result.txt
 echo "#-------------------------------------------------------------------------------------------------------------#" >> result.txt
 rm "$INSTANCE"
done <instances.txt

MESSAGE=`cat result.txt`

## post to slack

URL="<Slack Webhook URLを入力>"

curl -X POST --data-urlencode "payload={\"username\": \"PowerVS status check\",  \"text\": \"IBM Cloud PowerVS_Status Check: \\n ${MESSAGE}\", \"icon_emoji\": \":cloud:\"}" $URL

rm instances.txt
rm result.txt

exit 0
```

---


##### 実行結果

```
$ sh powervs_check_instance.sh
$
```

Slack には次のように出力されます。

![powervs_status_check.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/f3a02cc6-917a-955b-3da6-7d649f2bcde1.jpeg)

----


##### 参考

Power Systems Virtual Server のご参考資料：[Power Systems Virtual Server Hint&Tips](https://ibm.ent.box.com/s/aturii5iagqqk6ufwm862vrpcgt8svgv)



以上です。
PowerShellでESXiのカスタムISOファイルを作成する

Intel製以外のNICを使用していると、VMwareからDLしたisoを焼いたブータブルディスクからインストールを試行してもエラーとなる可能性が高い。(特にRealtek)
その場合はインストール対象に合わせたドライバを混ぜたカスタムisoを作成する必要がある。
言うまでもないが、Intel製のNICを手に入れて認識させVMware公式から直接DLしたisoファイル焼いて使う方が遥かに簡単である。
特にPCにオンボードされているNICの規格が古すぎて対応するドライバすら後述のサイトで見つからないという場合等。

PowerShellにvmwareCLIを導入している前提
(やり方は記事がいくらでもあるので省略する)

前提として、カスタムISOファイルを作るときに公式からDLするイメージファイル(iso)は不要。
今回はvSphere6.7を対象とする

用意するもの
■生成ファイル格納兼作業用フォルダ(名前は仮にtemptestとする)
■vibファイル
https://vibsdepot.v-front.de/wiki/index.php/List_of_currently_available_ESXi_packages
のNICから自分のPCのデバイスと使用したいvSphereのバージョンに対応しているvibファイルを探す(それぞれの名前クリックでDLページへ)
vibファイルの場所はここだけではないので対応するものがなければ他を探してみる
※vSphere7.0をインストールする為のRealtekドライバは現状(2021年3月現在)存在しないようだが
RTL8153のチップセットを持つUSB　NICを用意して挿しておけば読み込ませることは可能らしい
要はNICに対応するドライバが存在していることがインストールの条件であるようだ
この場合は追加のドライバインストールもプラグ&プレイで済ませてくれるので不要
公式からダウンロードしたisoファイルそのまま使えると思われる

■ps1ファイル
展開用のツールみたいなもの
最新版が
https://github.com/VFrontDe/ESXi-Customizer-PS/blob/master/ESXi-Customizer-PS.ps1
に上がってるのでコピーしてテキストに張り付けて拡張子を.ps1に

vibファイルとps1ファイルを作業用フォルダに格納する
(ここではとりあえずC:\直下に置く)

ここからはPowerShellの操作。
1. PowerShellを管理者権限で実行してコマンドライン開く
2. set-executionpolicy -executionpolicy bypass でポリシーオフ
(全ての操作終わったらセキュリティの問題で危ないのでbypassを任意の値に変えて同じコマンドで戻すことを忘れずに)
3. Import-module vmware.powercliを入力　これでvSphereCLIが使える
4. C:\temptest\ESXi-Customizer-PS-v2.8.0.ps1 -ozip -v67 -pkdir C:\temptest\ を入力する
(-ozip使わないもっと短いコマンドもあるが生成時エラーが起こることがある為)
環境にもよるがzipファイルが生成されて再入力できるまで長いので気長に待つ。
5．C:\temptest\ESXi-Customizer-PS-v2.8.0.ps1 -izip C:\temptest\生成zipファイル名.zip -v67
を入力する。こっちはすぐ終わる。
6.フォルダ内にisoファイルが生成されてるのでUSBに焼いてBootファイル完成。

以上
データ分析コンペ初心者が簡単に説明変数を増やす方法

こんな感じで新しい説明変数を作れます
意外と精度上がります

```py
new_column = "hour_age"
meta_df[new_column] = meta_df["hour"].astype(str).str.cat(meta_df["age"].astype(str), sep = '_')
```
Rで地図を描く【その2: 東アジアの白地図】

# 0. はじめに

シリーズ「Rで地図を描く」その1では、日本列島全体の白地図を描く方法をご紹介しました。
「その2」では、東アジアの白地図を描く方法をご紹介します。

### 0.1. 復習

`R`で地図を描くには、次の2つのパッケージが有用でした。

---
1. `maps`パッケージを用いる
<font color="Blue">
低い解像度で大雑把な日本地図を描くことができます。
</font>

2. `raster`パッケージを用いる
<font color="Blue">GADMというデータセットと併用することで、高解像度の日本地図を描くことができます。
GADMは容量が極めて思いデータセットなので注意してください
</font>
---

 東アジアの白地図を描く際にも、基本的にこれらを用います。

# 1. 作図

ここでは、東経125度から145度まで、北緯30度から45度までの範囲で描きましょう。`xlim`は経度の範囲を、`ylim`は緯度の範囲を指定します。

### 1.1 mapsパッケージで描く
`R`で下記のコードを実行してください。すると、解像度の低い白地図を安直に作ることができます。

```
library(maps)
map("world", xlim = c(125, 145), ylim = c(30, 45))
```
![スクリーンショット 2021-03-09 14.44.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449575/a089137f-3ab2-151e-230a-0d28f2f036e4.png)

### 1.2 rasterパッケージで描く
`R`で下記のコードを実行してください。すると、解像度の高い白地図を作ることができます。（添付した画像は少々潰れてしまっています）
`maps`の場合より作図に時間がかかります。

```
library(raster)
jpnDat <- getData('GADM', country = 'JPN', level = 0)
korDat <- getData('GADM', country = 'KOR', level = 0)
prkDat <- getData('GADM', country = 'PRK', level = 0)
rusDat <- getData('GADM', country = 'RUS', level = 0)
chnDat <- getData('GADM', country = 'CHN', level = 0)
plot(jpnDat, xlim = c(125, 145), ylim = c(30, 45))
plot(korDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(prkDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(rusDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
plot(chnDat, xlim = c(125, 145), ylim = c(30, 45), add = T)
```

![スクリーンショット 2021-03-09 14.55.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449575/6c120c3b-5825-8555-b0f4-7e76328c94c2.png)
[Django]objectsとは

#はじめに
 DjangoのUserクラスにはobjectsという変数があります｡
今回はそのobjectsとは何なのかを解説します｡

##使い方
Djangoではデータベースの情報とプログラム上で定義したデータモデルをSQLクエリーを使わなくてもCRUDするための仕組みがあります｡
このような仕組みをORM(Object-RelationMapping)といいます｡
DjangoではこのORMをManagerクラスが行います｡
例えば､Djangoにはユーザ登録の際に使えるデータモデルとしてUserクラスがデフォルトで定義されています｡
そのUserクラスがデータベースから情報を取得する際､
仲介役(ORM)のManagerクラスがdjango.contrib.auth.models.py内で定義されています｡

```django/contrib/auth/models.py
class UserManager(BaseUserManager):
 ...
```

以下はUserクラスをviews.pyで取得する例です｡

```app/views.py
from django.contrib.auth.models import User

def index(request):
user = User.objects.all()
```
objects=Usermanager() です｡
上記に基づくと､このコードがUserクラスに格納するための情報をUserManagerクラスを介してデータベースから取得していると読み解くことができます｡

##参考サイト
 - [Django]モデルの基礎(https://python.keicode.com/django/models-basics.php)
 - [Django]ORMとは(https://dev-yakuza.posstree.com/django/orm/)
 - [Django]カスタムユーザモデル(https://hodalog.com/how-to-create-user-sign-up-view/)
ローカル環境に wp-cliをインストールする

ブロックの翻訳ファイルを作る時などローカルで wp-cli を動かす必要があるため。

```
$ cd
$ curl https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli-nightly.phar -o wp
$ chmod 755 wp
$ mv wp /usr/local/bin/
```
Modelerパフォーマンス・チューニングのためのSQLプッシュバックとModeler Serverの実行時間の切り分け

SPSS Modelerの処理のパフォーマンス・チューニングをしたいことがあります。

SPSS Modelerのパフォーマンス・チューニングで重要になるのはSQLプッシュバックという機能です。Modelerのアイコンで作った処理からModelerが自動的にSQL文を生成して実行する処理です。DBは大量データを高速に処理することに長けていますので、なるべくSQLプッシュバックを効くようにすることがチューニングになります。

ただ、SQLプッシュバックが効いても遅い処理もあります。そういう時にはDB側とModeler Server側のどちらが遅いかを切り分けて考える必要があります。その切り分け方についてお話しします。

#1. そもそもSQLプッシュバックが可能かの確認

まず設定をします。
ストリームのオプションで最適化の設定からSQL生成の最適化をチェックします。ついでにすべての最適化を有効にするのがお勧めです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/ebb5d9c4-0909-28f3-586d-5a1d188f6c96.png)

ログとステータスの設定で
・　ストリーム実行中に SQL を メッセージ・ログに表示する
・　ストリームの準備中に、SQL 生成の詳細をメッセージ ログに表示する
にチェックを入れます。
特に後者が重要です。実際に実行しなくてもModelerがDBに投げようとするSQLが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2c2af864-4946-0abb-37c3-9b11a6cb2326.png)

実行したいターミナルノードを選択した状態でメニューのアイコンからプレビュー実行のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/c826b387-42dd-0168-080a-a06e20025cf1.png)

すると以下のように全部ノードもしくは一部のノードが紫色に変わります。
以下の場合はHWV53816.COND2N_EのDBインポートノードと条件抽出ノードがSQLに変換できたことがわかります。テーブルノードはModeler側への表示を行う処理なのでModeler側で処理が行われます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/879d06fb-5da9-f0f7-2031-8d8310826c75.png)

そして生成されたSQL文がストリームのメッセージに記録されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/d6e52486-2539-e90f-11ef-33b807d86bb1.png)

#2. SQLプッシュバックとModeler Serverの実行時間の切り分け
上でみたようにテーブルノードより前がすべてSQLプッシュバックできている場合は、すべてプッシュバックできているのでDB側での処理で時間がかかっていることがわかります。

しかしながら以下のように途中でSQLプッシュバックが途切れた場合、「条件抽出ノード」までのDBでのSQL処理と「フィールド作成ノード」以降のModeler Serverでの処理のどちらが遅いのかがわかりません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/bf7cfe8a-624c-f55e-bd6d-03ebd071c66a.png)

こういう場合はやはり実行して計測をする必要があります。

##2-1.経過時間とCPU時間の差を比較する
実行すると経過時間とCPUの時間が出力されます。
このCPUの時間はModeler ServerのCPUを使っていたことを示します。ですので、経過時間よりCPUの時間が短い場合はSQLの実行時間が長いことを示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/b5398bfe-5711-eb77-269b-9a77c8ec533a.png)

上の例はそもそもすぐに終わっている処理で起動のオーバーヘッドなどの影響が大きくあまり意味がないのですが、例えば
経過時間=500 秒、CPU=2 秒
というような結果の場合、Modeler Server実行時間よりもSQLの実行時間が長いと考えられます。

一方で、例えば
経過時間=500 秒、CPU=450秒
というような結果の場合、SQLの実行時間よりもModeler Serverの実行時間が長いことが想定されます。
ちなみにModeler Serverは並列実行することもあるので、CPU時間の方が経過時間より長くなることもあります。

##2-2.キャッシュをとってから実行する
さらに並列処理の効果も含めて比較しようとすると一度SQLプッシュバックが効くところまでをDBキャッシュをとってから実行するという方法があります。

以下のようにDBキャッシュをつくってから実行します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/2f3085c7-d067-612e-3584-36123f76bd52.png)

こうするとSQL実行にかかった時間を省いて、Modeler Serverでの処理にかかった時間を取得できます（一時表から全件SELECTする時間は入ってしまいますが）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/223763/cd4a4f59-1c99-c4a5-368e-85fb3624e9e7.png)

#3. 環境
Modeler18.2.2
Db2 on Cloud
ボタンタグ~使い分け~

今回はボタンタグについて振り返って行きます！！
まず、ボタンタグには３つほどあり、ややこしくなっています。
一つずつみていきましょう😊
では、お使いのテキストエディタに入力していきましょう。

```index.html
<button>移動</button>
<input type="button" value="移動">
```
![スクリーンショット 2021-03-09 14.35.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1033397/2f13f1aa-17c1-afdb-2dde-1ce3fc534b33.png)
しかしこのままではリンクが飛ばないので、いろいろ、つけ加えて行きます😊



#①buttonタグ
buttonタグで囲むことによって、簡単に作ることができます👌


こちらのタグを使うメリットとして、buttanタグの中にHTMLをを追加できます！

```index.html
<button><strong>移動</strong></button>
```
とすることで、中の文字を強調することができます👍
しかし、このままでは何も反応しません。そこで

ページリンク飛びたいなってときには、こう記述します！！

```index.html
<button onclick="location.href='about.html'"><strong>移動</strong></button>

```
こうすることで、ページへリンクすることができました！

#②inputタグ
type▶ボタンの種別。以下の値を指定可能です。
種類は３つあります！
type="submit" …… フォーム入力内容を送信するサブミットボタン（初期値）
type="reset" …… フォーム入力内容をリセットするリセットボタン
type="button" …… 何もしない汎用的な押しボタン

value▶ボタンの種類を表します。

```imdex.html
<input type="button" onclick="location.href='about.html'" value="移動">
```
こうすることで、ページへ飛ぶことができました。

#③aタグ
aタグでボタンを作ることもできますが、こちらは、CSSでボタンを１からデザインする必要があります！
また、aタグでの場合はフォームの送信の際は使えません！

```index.html
<a href="about.html">移動</a>
```
ノートPCデータのバックアップをとる

#前提
下記1ファイルと2フォルダのバックアップをとる
- ノートPCのドキュメントフォルダの1ファイル
- MAMP環境下で作成したアプリ(C:\MAMP\htdocs)
- Python,Node.jsで作成したツール(C:\work)

#手順
##バックアップ先のフォルダにネットワークドライブを割り当てる(Z:)
下記を参考にネットワークドライブを割り当てる
[Windows 10 ネットワーク ドライブを追加する方法](https://kb.seeck.jp/archives/8575)
##バッチファイル作成
```bat
del z:\*.* /q
del z:\MAMP\htdocs /q /s
del z:\work /q /s

copy C:\Users\XxxxxxYyyyyyy\Documents\zzzzz.txt z:\ /y /z
xcopy C:\MAMP\htdocs z:\MAMP\htdocs /d /e /c /y /r
xcopy C:\work z:\work /d /e /c /y /r
```

##タスクスケジューラでバッチファイルを実行する
下記を参考に設定
[【Windows 10対応】タスクスケジューラで定期的な作業を自動化する](https://www.atmarkit.co.jp/ait/articles/1305/31/news049.html)

#参考
[入門講義【第13章】 夜中に自動でバックアップを取る](https://jj-blues.com/cms/kogi13/)
React Native Modalで選択した値を表示させる

#はじめに
React NativeのModal機能を使った際に、ポップアップした画面で何かしらを選択し、選択した値をもとの画面で表示させる方法を紹介します。

#Modal準備
Modalでいくつかのアイコンを表示させ選択したかったので、今回はMaterialIconsを使用しました。
下のMaterialIconsのiconNameに選択したfastfoodが入れば成功です。

```react
  const [modalVisible, setModalVisible] = useState(false);

      <Modal
        animationType="slide"
        transparent={true}
        visible={modalVisible}
      >
        <TouchableOpacity
            onPress={() =>{}}
        >
        <MaterialIcons name="fastfood" size={24} color="black" />
      </Modal>

      <TouchableOpacity
        onPress={() => setModalVisible(!modalVisible)}
       >
       <MaterialIcons name={iconName} size={24} color="white" />
       </TouchableOpacity>
```

#解決策

```react
  const [modalVisible, setModalVisible] = useState(false);
  const [iconName, setIconName] = useState('');

  function selectFoodIcon() {
        setModalVisible(!modalVisible);
        setIconName('fastfood');
    };

      <Modal
        animationType="slide"
        transparent={true}
        visible={modalVisible}
      >
        <TouchableOpacity
            onPress={() =>{
            selectFoodIcon() //←ここに関数を入れる
            }}
        >
        <MaterialIcons name="fastfood" size={24} color="black" />
      </Modal>

      <TouchableOpacity
        onPress={() => setModalVisible(!modalVisible)}
       >
       <MaterialIcons name={iconName} size={24} color="white" />
       </TouchableOpacity>

```
これでModalで選択した値を取得することができたと思います。
NuGetの復元が動かない場合の対応

# 現象
* Nugetのライブラリが参照できなくて、ビルドエラーになる
* VisualStudioから、Nugetの復元を実行しても、復元できない

# 対応
* VisualStudioで、パッケージマネージャーコンソールから、下記コマンドを実行し、
  ソリューション内の全てのパッケージを再インストールする。

```
Update-Package -reinstall 
```
ケースフィード ⇒ ケースフィードを使用したケースの解決

１．サポートエージェントは、ケースフィードでどのような方法で顧客に応答できますか?
２．ケースフィードを使用すると、サポートエージェントは何を簡単にできるようになりますか?
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634241/56cca89a-9279-e25c-bd7c-2b1c2c58e1c6.png)
OnsenUIでバインドが反映されない時の解決方法

#はじめに
AngularJSとOnsenUI2系を使用してダイアログを作成した。
ダイアログの中にinputタグを挿入し、値を変更し保存するという処理。
1度目の表示（データバインド）は上手くいくが、保存後に2度目のダイアログ表示をすると、1度目の値がそのまま残ってしまう。
##現象
```html
<template id="dialog.html">
  <ons-dialog id="my-dialog">
    <div style="text-align: center; padding: 10px;">
      <ons-input ng-model="number"></ons-input>

      <ons-button ng-click="saveNumber(number)">Save</ons-button>
    </div>
  </ons-dialog>
</template>
```
```javascript
$scope.showDialog = function (index) {
  // APIから数値を取得する処理
  $scope.number = response[index].number
}

$scope.saveNumber = function () {
  // APIに数値（$scope.number）を送信する処理
  $scope.number = '' // ダイアログを閉じるときに空に戻す
}
```

\$scope.showDialogでAPIから取得した値(10)を、\$scope.numberに代入し、ダイアログのinputタグに表示させる。（←問題なし）

inputで値(30)を入力しSaveボタンを押す。$scope.numberの値をAPIに渡し、保存する。（←問題なし）

再度ダイアログを開く。このとき引数のindexが変わっているため、APIから取得した値は(50)だった場合でも、ダイアログのinputタグには値(30)が残ったままになる。（←問題あり。データバインディングが反映されていない）

#試したこと
##$scope.$apply
```javascript
$scope.showDialog = function (index) {
  // APIから数値を取得する処理
  $scope.$apply(function(){
    $scope.number = response[index].number
  })
}
```
>Error: $rootScope:inprog Action Already In Progress

https://docs.angularjs.org/error/$rootScope/inprog
エラーが表示されて使えない。エラー内容を読めば、APIから値を取得している場合は\$scope.\$applyは使えないらしい。$timeoutが推奨されていた。

##$timeout
```javascript
$scope.showDialog = function (index) {
  // APIから数値を取得する処理
  $timeout(function() {
    $scope.number = response[index].number
  }, 0)
}
```
エラーは消えたがデータバインディングはされず効果なし。

##ons.createDialog
OnsenUIでひとつのDOMを生成したときにデータの更新が反映されないことがあるらしい？
dialog.show()で表示するのではなく、ons.createDialogでDOMを作成することにする。

```javascript
ons.createDialog('dialog.html')

$scope.showDialog = function (index) {
  // APIから数値を取得する処理
  $scope.number = response[index].number
}
```
これでは効果なし。


```javascript
$scope.showDialog = function (index) {
  ons.createDialog('dialog.html')
  // APIから数値を取得する処理
  $scope.number = response[index].number
}
```
showDialogの中に入れるとデータバインディングが反映された！！
しかし、これではダイアログを開くたびにDOMが増え続けることになる。
dialog.destroy()もOnsenUI2系では使用できない。


#最終的なコード
数値をオブジェクトで管理し、ダイアログを閉じるたびにオブジェクトを空にする。

```html
<template id="dialog.html">
  <ons-dialog id="my-dialog">
    <div style="text-align: center; padding: 10px;">
      <ons-input ng-model="dialogData.number"></ons-input>

      <ons-button ng-click="saveNumber(dialogData.number)">Save</ons-button>
    </div>
  </ons-dialog>
</template>
```

```javascript
$scope.dialogData = {} // ←変更：オブジェクトを定義

ons.createDialog('dialog.html')

$scope.showDialog = function (index) {
  // APIから数値を取得する処理
  $scope.dialogData.number = response[index].number // ←変更：オブジェクト
}

$scope.saveNumber = function () {
  // APIに数値（$scope.dialogData.number）を送信する処理
  $scope.dialogData = {} // ←変更：ダイアログを閉じるときにオブジェクトを空に戻す
}
```

これでDOMの生成は1回のみで、何度保存をしてもデータを反映させることが出来た。
【Flutter】DateTime 前月の日数を取得する

## DateTimeを使用して、前月の日数を取得する
月の日数を取得する必要があり、意外と需要あるかなと思いましたので備忘録程度に残しておきます。

## 実装方法
DateTimeの日付に0を入力すると前月のDateTimeになります。
2021年3月0日=2021年2月28日と解釈してくれます。

```dart:
DateTime now = DateTime.now();
int get lastMonthDayNum => DateTime(now.year, now.month, 0).day;
```

実行結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/bf8e0976-0246-6ff2-d45b-0c8b81bf084f.png)


## その他(実行例)
同じような感じで、
2021年3月-1日=2021年2月27日
になるようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/91980b45-e95a-574f-9a64-34ae661ebd09.png)

2021年1月0日=2020年12月31日
になります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/261934/fcb3df2f-320d-9f26-17ec-0a4b1701b87b.png)
NodeV14でrequireが使えない場合の対処

#現象
Node.jsでの実行（※ブラウザ実行ではない）にもかかわらず、
ファイル読み込み関数requireが使えずに下記エラーが出る。

require is not defined node

#調査結果
NodeV14以降のmoduleではrequire使えないらしい。
下記のようにインポートすればOK。

```ソース
import { createRequire } from 'module';
const require = createRequire(import.meta.url);
```

#参考
https://stackoverflow.com/questions/31931614/require-is-not-defined-node-js

```
As Abel said, ES Modules in Node >= 14 no longer have require by default.

If you want to add it, put this code at the top of your file:

import { createRequire } from 'module';
const require = createRequire(import.meta.url);
```
【GIT】作業用コマンド集

自分用のGITコマンドメモになります。

##### クローン
```
git clone 【リポジトリURL】
```
##### ブランチ作成・切り替え
```
git checkout -b 【ブランチ名】
git checkout 【ブランチ名】
```
##### ブランチ確認・リネーム・削除
```
git branch -a
git branch -vv
git branch -m 【リネーム対象ブランチ名 または 省略(現在ブランチ)】 【変更ブランチ名】
git branch -D 【ブランチ名】
git push 【リモート名】 :【ブランチ名】
```
##### 変更ファイル一覧
```
git status
```
##### 変更退避・新規ファイル含め退避・一覧・適用・適用&削除・削除・一括削除
```
git stash save "【コメント】"
git stash save -u "【コメント】"
git stash list
git stash apply 【スタッシュID または 番号指定 または 指定なし（0）】 
git stash pop 【スタッシュID または 番号指定 または 指定なし（0）】 
git stash drop 【スタッシュID または 番号指定 または 指定なし（0）】 
git stash clear
```
##### ステージング追加・一括追加・取り下げ・一括取り下げ
```
git add 【特定ファイル指定】
git add .
git restore --staged 【特定ファイル指定】
git restore --staged .
```
##### コミット・直近コミットコメント変更
```
git commit -m "【コミットメッセージ】"
git commit --amend
```
##### ログ一覧・一行表示・変更ログのみ表示
```
git log
git log --oneline
git log 【ファイル名】
git log 【ローカルブランチ名 または リモートブランチ名】
```
##### リモート先確認・追加・変更・削除
```
git remote -v
git remote add 【リモート名】 【リポジトリURL】
git remote set-url 【リモート名】 【リポジトリURL】
git remote remove 【リモート名】
```
##### プッシュ
```
git push 【リモート名】 【ローカルブランチ名】
git push 【リモート名】 【ローカルブランチ名】:【リモートブランチ名】
```
##### プル
```
git pull 【リモート名】 【リモートブランチ名】
```
##### フェッチ
```
git fetch
git fetch 【リモート名】
git fetch 【リモート名】 【ブランチ名】
```
##### （現在のブランチに）マージ
```
git merge 【ブランチ名】
```
##### ローカル変更破棄
```
git checkout 【ファイル名】
git checkout .
git reset --hard HEAD
※ステージング済みなども破棄したい場合
```
##### リベース（コミットまとめ）
```
git log --oneline
git rebase -i HEAD~【まとめるコミットID数】
※エディタが開いたら一番上を"e"(edit)にしてそれ以外は"f"(fixup)に変更して":wq"で保存
git commit --amend
※コメントを編集して":wq"
git rebase --continue
```
##### リベース破棄（失敗したとき）
```
git rebase --abort
```
##### チェリーピック
```
git cherry-pick 【コミットID】
```
##### 直近コミット取消・コミット取消&ステージング解除・コミット削除
```
git reset --soft HEAD^
git reset --mixed HEAD^
git reset --hard HEAD^
```
##### 差分確認
```
git diff
git diff 【対象ファイル指定】
git diff 【コミットID】
git diff 【コミットID1】 【コミットID2】
git diff --name-only 【コミットID1】 【コミットID2】
git diff 【コミットID1】 【コミットID2】 【対象ファイル指定】
```
##### GIT設定確認・追加（上書き）・解除
```
git config --list
git config --global 【設定項目】 【設定値】
git config --global --unset 【設定項目】
```