OmniAICreator/Qiita-1.07M huggingface dataset:
(HBase, MongoDB等)分散データベースにおけるレンジスキャンの考慮点とCouchbaseにおけるその実現

# はじめに

分散データベースにおいて（キーを用いた）レンジスキャンを効果的に行うためには、論理的に関連性のあるキーを設計するのみではなく、あらかじめそのレンジに含まれるデータが、同じ、あるいは近い場所（ノード、リージョン、パーティション）に存在する様に、（物理）設計を行う必要があります。

例えば、MongoDBでは、シャーディングの方法として、ハッシュとレンジを要件に応じ、選択することになります（この選択が物理配置に影響します）。

HBaseでは、データはRowKeyで（物理的に）ソートされます。


# Couchbaseにおける検索

Couchbaseは、N1QLというSQLをJSONのために拡張したクエリ言語で、検索を行うことができます。
その際、重要なことは、Couchbaseの中心的なアーキテクチャーはKVS(キーバリューストア)であり、そのレベルでは、バリューとしてJSONデータを格納しているのに過ぎないため、検索を行うための前提として、インデックスの定義・構築が行われている必要があります。

そもそも、スキーマレスなデータストアに対して、どうやって検索が可能なのか？全件サーチするのでなければ、という視点からは、これはむしろ納得できるものとして受け止められるかと思います。

ただし、ここで留意が必要なのは、KVSのキーを使った検索（つまりキーを特定したアクセスではなく、ある範囲のキーを指定してデータを一度に取得するという要件）であっても、事前にインデックスの作成が欠かせない、というところです。
このことをよりよく理解するために、以下の二つの背景を押させておくことが重要です。

- Couchbaseにおいては、クエリおよびインデックスサービスは、（KVSである）データサービスとは、アーキテクチャー上完全に独立している（利用する要件がない場合は、クラスターとして無効にすることで、そのために潜在的にリソースが消費されることはない）。
- データサービスのキーのシャーディング方法は、ハッシュが用いられており、ユーザによって、アクセスパターンに応じて、変更する余地を残していない。（Couchbaseは、メモリファーストアーキテクチャーと、クラスターマップを用いたクライアントからのノードへの直接のアクセスによって、固まった場所にあるデータをチャンクで取り出すことによって実現される効率に勝る、高いパフォーマンスを実現している）

# Couchbaseにおけるレンジスキャン実現方法

## インデックスの作成

```sql
CREATE INDEX range_index on MyFirstBucket(META().id) using GSI;
```
ここで、`META().id`が、KVSのキー（ドキュメントID）に対応します。

`MyFirstBucket`は、インデックスを作りたいバケット（いわゆるデータベースに相当）です。

`BucketName(FieldName)`の形になっており、JSONの属性を指定する場合は、バケット名の後のカッコ内に直接指定しますが、ドキュメントID指定のために`META().id`という特殊なキーワードを用いています。

## 利用例

下記の様な、キーにレンジを指定した検索が可能になります。

```sql
SELECT * from MyFirstBucket where Meta().id BETWEEN 'ABC:001' AND 'ABC:999';
```

また、下記の様な、キーの一部を指定した曖昧検索も可能になります。

```sql
SELECT * from MyFirstBucket where Meta().id LIKE 'ABC:%';
```

# 最後に

タイトルに包含されるテーマの広さに比して、言葉足らずの感は否めませんが、後半の具体的な方法についての紹介のみでも、それなりの意義を持つと期待して、本記事は以上とします。

# 参考情報

https://forums.couchbase.com/t/index-and-range-scan-for-primary-id/5185
[python]EOL while scanning string literalの解決

#目的
pythonの初学者のエラー対応をまとめておく


#エラー
`EOL while scanning string literal`

#解決
エラーは、文字列の値をスキャンしていたら行末まできました。という意味です。
つまり、行末（EOL：End Of Line)までにクォートがなかった＝クォーとの閉じ忘れが原因
Postmanをインストールする


# Windows
1. [Download Postman | Try Postman for Free](https://www.postman.com/downloads/)からbitを選択してEXEをダウンロードする![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/fd4ce9cd-d5e8-9e61-7af2-4c5dcbd54f63.png)
    - 今回は`Postman-win64-7.36.1-Setup.exe`をダウンロード
1. ダウンロードしたEXEをクリックすると`C:\Users\{ユーザ名}\AppData\Local\Postman\Postman.exe`にインストールされる![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/0f53d642-8a5c-622e-4e77-6ef25d23fe30.png)
1. ダウンロードしたEXEはもう捨ててOK

## 起動する
1. Windowsメニューに追加されているのでそこから起動する![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/dfe14408-60d5-544b-9665-b76df7dd26d9.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159761/263dbc77-c74e-ccfc-94cd-09d3b5e0dd27.png)

# Mac
[Homebrew CaskでWeb APIのテストに便利なPostmanをインストールする](https://qiita.com/ponsuke0531/items/14442eef25cefda7f9c8)

# インストールしたら使おう
- [初めてPostmanを使ってみた記録 - ponsuke_tarou’s blog](https://ponsuke-tarou.hatenablog.com/entry/2021/01/24/171658)
- [APIの開発がむちゃくちゃ捗る「Postman」の使い方 - WPJ](https://www.webprofessional.jp/master-api-workflow-postman/)
サムネ付きで削除可能なファイルフォームの状態確認シート

いつも混乱するのでまとめておこうと思います。

# 前提

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64098/e98e939e-3d4f-93b8-8187-88fde399fa27.png)

```html
<input type=file name=logo_image /> <!-- （１） -->
<figure id=thumb_logo_image><img/></figure> <!-- （２） -->
<input type=hidden name=remove_logo_image value=on /> <!-- （３） -->
<button id=btn_remove_logo_img /> <!-- （４）-->
```

- こんな要素があるとします
- 保存済みのファイルがある場合は（２）にサムネが表示されるものとします
- ファイルを選択した直後もJSで（２）にサムネをセットするものとします
    - ※サーバーにはまだ送っていない状態
- `remove_属性名` に値をセットして送れば保存済みのファイルが削除ができる実装だとします
    - 削除フィールドに値があったまま新しいファイルを送信してもきちんと新しいファイルに交換される実装になっているものとします
- （４）の削除用のボタンが押されると、（２）サムネ、（３）削除用フィールド、（４）削除用ボタンがHTMLから消えると想定します

# 状態の洗い出し

- 保存済みのファイルがあるかないか
- 新しいファイルが選択されているかいないか
- ファイル選択ダイアログを出したあとに「キャンセル」ボタンで戻ったかどうか
- 削除用のボタンが押されたか押されていないか
- 削除用のボタンが押された後にまたファイル選択をしたかどうか
- 保存済みのファイルがある状態で新しいファイルを選択したが、新しいファイルはキャンセルした場合

# 状態変数の洗い出し

- `Object savedValue`
    - 保存済みのファイル
- `String savedValueUrl`
    - 保存済みファイルのサムネ用URL
- `Object inputValue`
    - 新たに選択されたファイル
    - ※（１）ファイルフィールド のvalue値
    - ※ファイルフィールドの仕様により、JSからは再設定不可でリセット（nullの代入）のみ可能
- `String inputValueUrl`
    - 新たに選択されたファイルのサムネ用URL
- `Bool thumbVisible`
    - （２）サムネ を表示するかどうか
- `String thumbSrc`
    - （２）サムネタグにセットする値
    - `savedValueUrl` or `inputValueUrl`
- `Bool readyToRemove`
    - （３）保存済みファイルを削除するかどうか
- `Bool removeBtnVisible`
    - （４）削除用ボタンを表示するかどうか

# 状態確認シート

- この行数分リロードと操作を繰り返せば動作確認完了な想定
- ※ `null` と `false` のセルは省略。見にくくなったので
- (1).. `inputValue`
- (2).. `thumbSrc` 兼 `thumbVisible`
- (3).. `readyToRemove`
- (4).. `removeBtnVisible` 

## 保存済みのファイルがない場合

| 操作＼ | (1)　| (2) | (3) | (4) |
| --- | --- | --- | --- | --- |
| 初期状態 |||||
| ファイルが選択された | Object | `inputValueUrl` || true |
| ファイル選択後に<br>削除用ボタンが押された |||||
| ファイル選択後に<br>再度ファイル選択が開かれたが<br>キャンセルが押された |||||


## 保存済みのファイルがある場合

| 操作＼ | (1) | (2) | (3) |(4) |
| --- | --- | --- | --- | --- | --- |
| 初期状態 || `savedValueUrl` || true |
| 削除用ボタンが押された ||| true | |
| ファイルが選択された | Object | `inputValueUrl` || true |
| ファイル選択が開かれたが<br>キャンセルが押された | |`savedValueUrl` || true |
| 削除用ボタンが押されてから<br>ファイルが選択された | Object | `inputValueUrl` | | true |
| ファイル選択されてから<br>削除用ボタンが押された | | `savedValueUrl` | | true |
| ファイル選択されてから<br>削除ボタンが押されて<br>再度削除ボタンが押された || | true | |
| ファイル選択されてから<br>削除ボタンが押されて<br>再度ファイル選択が開かれたが<br>キャンセルが押された | | `savedValueUrl` || true |

# おわり

あーややこしい
Swiftのカスタムセルの基本の基

##Swiftのカスタムセルの基本の基
Swiftのカスタムセルをなんとなく利用していましたので、自己理解のために基本の基本をここで改めてまとめておこうと思います。

##そもそもカスタムセルとは

UITableViewの一つ一つを表示するセル部分を表示するのが「UITableViewCellクラス」になります。

XCodeの方ではシンプルなUITableViewCellのデザイン・構成が元から準備されています。

しかし、元から準備されている構成では表現したい内容が異なる場合など、オリジナルの構成を作りたい場面が多くあります。
その様な際に作成できるのがカスタムセルで、UITableViewCellクラスを用いて自身の好きな様に見た目・内容をカスタムして利用することができます。

##カスタムセルの時はxib化がおすすめ
UITableViewCellのカスタムをStoryboardのUITableView上に直接配置し利用することが可能です。

しかし、別画面で流用などができず、同様のセルを利用したいときは都度UITableViewCellのカスタムを作成しなけれないけなくなります。
DRY原則に従うためにも、流用できる形でセルを作成できた方が効率的です。

その、「流用できる形で作成できるカスタムセル」を作る方法が「xib化すること」です。

※DRY原則:Don't Repeat Yourselfの略。コード・情報を「繰り返しを避ける・重複を避ける」ことを意味します。

###xib化とは
作成するUITableViewCell単体のxibファイルを作成し、それを利用することです。
※詳細の作成方法は割愛

##xib化したUITableViewCellのメソッド

###func awakeFromNib()
StoryboardまたはnibファイルなどでCellがロードされた直後に呼ばれるメソッド

###func setSelected()
セルがタップされ、選択状態/通常状態が切り替わるときに呼ばれる処理メソッド

##カスタムセルの高さを可変式にする際のポイント
初期設定ではセルの高さは固定されています。
Tableviewのメソッドで高さを指定しても、全てのセルが同一の固定値で指定されてしまいます。
そこで、以下の方法を使えばセルの内容に合わせてセルの高さを可変式に変更することができます!

・UITableView内のレイアウトで縦軸の全てにAutoLayoutを設定する
（CellのTopからBottomまで間にあるtextviewやbottonなど全て漏れなく上下AutoLayoutを設定してください。固定にしたいパーツは高さを固定値に、可変式にしたいパーツは高さを設定しないでください）

・TableViewに想定値を設定する
（必須ではない。事前に想定の高さがわかるこおでcellの処理が早くなるらしい）

```swift
override func viewDidLoad() {
      super.viewDidLoad()
      tableView.estimatedRowHeight = 50
      tableView.rowHeight = UITableViewAutomaticDimension
}
```

・tableviewでheightの指定をしない
以下のメソッドで高さを指定できますが、固定値になってしまうのでこのメソッドを利用しない様にしましょう

```swift
//これを設定しない!!
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 10
    }
```

##まとめ
・xib化してカスタムセルを作成しましょう
・xib化した時は、最初から2つメソッドがあるので、必要に応じて利用しましょう。
・高さを可変式にしたい時は、可変式用の設定をしましょう。
【Vue.js】基礎知識②

#はじめに

引き続き、Vue.jsの基礎知識についてアウトプットをしていきます。
今回は、昨日学んだ構文のオプション構成について記述していきます。

#基本的なオプションの構成

全ての Vue アプリケーション は、Vue 関数で新しい Vue インスタンスを作成することによって起動。

```javascript:practice.js
var app = new Vue({
  // mountする要素
  el: '#app',

  // アプリケーションで使用するデータ
  data: {
    message: 'Vue.js'
  },

  // 算出プロパティ
  computed: {
    computedMessage: function() {
      return this.message + '!'
    }
  }

  // ライフサイクルフック
  created: function() {
    // 行いたい処理
  },

  // アプリケーションで使用するメソッド
  methods: {
    myMethod: function() {
      // 行いたい処理
    }
  }
})
```


```javascript:practice.js
var app = new Vue({
  // mountする要素
  el: '#app',
```

「el」はアプリケーションを紐付ける要素のセレクタ。

```javascript:practice.js
var app = new Vue({

  // アプリケーションで使用するデータ
  data: {
    message: 'Vue.js'
  },
```

「data」はアプリケーションで使用するデータであり、オブジェクトや配列も登録可能。

```javascript:practice.js
var app = new Vue({

  // 算出プロパティ
  computed: {
    computedMessage: function() {
　　　　//何か処理をした結果をデータとして返す
      return this.message + '!'
    }
  }
```

「computed」は「data」と似たように扱うことのできる、関数によって算出されるデータ。


```javascript:practice.js
var app = new Vue({

  // ライフサイクルフック
  created: function() {
    // 行いたい処理
  },
```

ライフサイクルフックとは、予め登録した処理を、Vueインスタンスの特定のタイミングで自動的に呼び出すもの。
createdなど様々なライフサイクルフックがあり、使用できるメソッドが決められている。以下はライフサイクルフックの一覧。


| メソッド | タイミング |
|:--|:--|
| beforeCreate  | インスタンスが生成され、リアクティブデータの初期化がされる前  |
| created  | インスタンスが生成され、リアクティブデータの初期化がされた後  |
| beforeMount  | インスタンスがマウントされる前  |
| mounted  | インスタンスがマウントされた後  |
| beforeUpdate  | データが変更され、DOMに適用される前  |
| updated  | データが変更され、DOMに適用された後  |
| beforeDestroy  | Vueインスタンスが破棄される前  |
| destroyed  | Vueインスタンスが破棄された後  |
| errorCaptured  | 任意の子孫コンポーネントからエラーが捕捉されたとき  |

※リアクティブとは：何かしらの変更（取得した時や、代入された時など）が瞬時に反映されること。（という個人的なイメージです。。。）
※createdとmountedの違い：DOMが構築されているかされていないか。（mountedの場合は、DOMが作成された直後に呼ばれるため、「el」や「getElementById()」などがメソッド内で使用できる。）



```javascript:practice.js
var app = new Vue({

  // アプリケーションで使用するメソッド
  methods: {
    myMethod: function() {
      // 行いたい処理
    }
  }
})
```

「methods」はアプリケーションで使用するメソッド。イベントハンドラなどの実装を行う部分。
権限あるのにGoogle Analyticsでビューが表示されない原因

公式のヘルプに書いてあった
https://support.google.com/analytics/thread/80009993?hl=ja

原因
Google：「アナリティクス4プロパティ(GA4)では、ビューという機能はありません。」
よく調べずポチポチ作成するのは良くない。

解決
Google：「ビューを作成したり、Search Consoleと連携するためには、従来のユニバーサルアナリティクスのプロパティを使用する必要があります。」

#### ユニバーサルアナリティクスを作成している場合
プロパティの設定＞詳細オプション＞ユニバーサルアナリティクスプロパティの作成のスイッチを右にスライドして有効にする

#### ユニバーサルアナリティクスを作成していない場合
プロパティを作成＞ユニバーサルアナリティクスプロパティの作成をのスイッチを右にスライドして有効にする
Databricks Workspace に招待される → サインインまでの流れ

Databricks Workspace に招待されてからサインインするまでの流れです。MFA が有効化されている場合や SSO が設定されている場合はもう少し複雑になりますのでご注意を。

noreply@databricks.com からのメールにある URL をクリック
![2021-01-19_16h37_09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/8d170cb2-9844-176a-7356-8777356711d9.png)

ユーザー名/パスワードを入力、Sign Up をクリック
![2021-01-19_16h42_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/c774a269-de96-250d-a6c5-bb35652102bf.png)

完了！
![2021-01-19_16h53_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/363781/2bf41068-8865-4999-80fe-52cd8688f8ac.png)

ワークスペースへの　IP 制限が実装されている場合は Sign-up の段階ではじかれます。
Notebook 作成のためにはクラスタの設定が必要ですが、クラスタへのアクセス権限が設定されていないとこれまた弾かれます。そんな場合は Admin 権限持ってる人に聞いてみましょう
Swift UITextFieldをコードで実装

#UITextFieldをコードで実装してみる
`swift`というかアプリ開発の入門書をみると`storyboard`にviewをぺたぺたドラッグ＆ドロップするやり方ばっかですよね。
それでもいいんですがワンステップ上に上がりたい方のためにコード実装の仕方を記事にします。
まずは変数を定義しましょう。

```swift
let textField = UITextField()
```
この状態でビルドしても何も表示されません。
まあ、変数を宣言しただけなんで当たり前ですよね。
次に、`ViewController`の`view`に入れましょう。

```swift
view.addSubview(textField)
```
これで追加できました。ビルドしてみましょう。
![Simulator Screen Shot - iPod touch (7th generation) - 2021-01-19 at 16.23.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567404/53e4e1e8-b130-66d8-1778-89db12ca6fba.png)
あれ？何も表示されませんね。
実はこれあるにはあるんですが幅も高さも０の状態なんです。
幅や高さを指定してあげましょう。

```swift
// .init(x軸方向の位置, y軸方向の位置, 幅, 高さ)
textField.frame = .init(x: 0, y: 0, width: 200, height: 40)
// 画面の真ん中に表示
textField.center = view.center
```
これで実行すると〜一見何もないように思えますが真ん中をタップすると編集できます。
`placeholder`も指定してあげましょう。

```swift
textField.placeholder = "ここに入力"
```
これでちゃんと表示されていることが確認できますね。
でも、枠も何もないのはわかりずらいですよね。てことで、枠を追加しましょう。

```swift
textField.layer.borderWidth = 1
textField.layer.borderColor = UIColor.black.cgColor
```
![Simulator Screen Shot - iPod touch (7th generation) - 2021-01-19 at 16.33.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567404/d0e80c01-9500-44cf-424f-029a90b6f949.png)
できましたね！
あとはもう少し見栄えをよくしましょう。

```swift
// 角を丸くする
textField.layer.cornerRadius = 5
// border線と文字が近すぎるから少し離す
textField.leftView = UIView(frame: .init(x: 0, y: 0, width: 5, height: 0))
textField.leftViewMode = .always
```
これでビルド！
![Simulator Screen Shot - iPod touch (7th generation) - 2021-01-19 at 16.37.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/567404/fbfeac41-f71b-9412-f666-7a11fec1e8ad.png)
いい感じに角も丸くなってボーダー線と文字の間にも隙間ができていますね。

#textFieldのあれこれ
```swift
//勝手に英語のスペルを正しいのにする機能をoff
textField.autocorrectionType = .no
//勝手に英語の先頭の文字を大文字にするのをoff
textField.autocapitalizationType = .none
// fontサイズを変更
textField.font = .systemFont(ofSize: 18)
// textFieldを編集モードにする
textField.becomeFirstResponder()
// textFieldの編集モードを解除する
textField.resignFirstResponder()
```

やりたいことに応じてつかってみてください。
今回はここまでにします。
読んでくださりありがとうございます。
Amazon Linux 2 minimalイメージにstrongSwan5.9.1をインストール

2021/1/23 内容を追記しタイトル変更しました。
旧タイトル：「Amazon Linux 2にstrongSwan5.9.1をインストールする」

# はじめに
Amazon Linux 2では、minimalイメージが提供されているのをご存知でしょうか。通常のLinuxインスタンスの場合、スナップショットのサイズが8GBであるため、EBSも最低8GB用意する必要があるのですが、Amazon Linux 2のminimalイメージを利用するとスナップショットのサイズが2GBであるため、EBSも2GBから利用することができます。

今回はAmazon Linux 2のminimalイメージを利用して、strongSwan5.9.1をインストールしていきます。

#環境
- Amazon Linux 2 minimal x64 (ami-0115f8fe26e0858d9)
- ソース：strongswan-5.9.1.tar.gz
 - 公式サイト：https://www.strongswan.org/download.html

# minimalイメージの利用方法
AWSのEC2コンソールを開き、左側メニューのAMIを開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/07bd6448-5b4b-3858-f37d-1148bbcc3a18.png)
左上の自己所有と書かれている部分をクリックしパブリックイメージに切り替えます。「amzn2-ami-minimal」と検索し、出てきたイメージのAMIを選択して起動します。この時、所有者がamazonと書かれていることを確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/776880/024a8a51-a5ad-eb55-b7d9-d684f1aa5487.png)

起動ボタンを押した後は、通常のインスタンスの構築手順と同様です。今回はEBS 2GBにしています。

# strongSwanインストール手順
minimalイメージを利用する際の注意点として、通常であれば入っているようなパッケージ(wgetなど)もインストールされていないため、追加でインストールする必要があります。また、strongSwanのインストール時にgccとgmp-develが必要というエラーが出たため、それらも追加でインストールしています。

また、ルートユーザーでインストールしないとうまくいかなかったため、最初に`sudo su -`してます。

```
sudo su - #rootユーザーに切り替え
yum update -y
yum install wget gcc gmp-devel -y
wget https://download.strongswan.org/strongswan-5.9.1.tar.gz
md5sum strongswan-5.9.1.tar.gz #ハッシュ値が一致するか確認
tar xzvf strongswan-5.9.1.tar.gz
cd strongswan-5.9.1
./configure
make
make install
```

### systemctlの設定

```plaintext:/etc/systemd/system/strongswan.service
[Unit]
Description=strongSwan

[Service]
Type=forking
ExecStart=/usr/local/sbin/ipsec start
ExecStop=/usr/local/sbin/ipsec stop

[Install]
WantedBy=multi-user.target
```

### 起動時にswanctlの設定を読み込む

```plaintext:/usr/local/etc/strongswan.conf
charon {
 （省略）
 start-scripts {
   swanctl = /usr/local/sbin/swanctl -q
 }
 （省略）
}
```

swanctlの設定ファイルは以下のフォルダ内に置きます。
`/usr/local/etc/swanctl/conf.d/xxx.conf`


### インターフェース間のパケット転送を許可
```
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
```

#参考にしたサイト
[strongSwan Installation Documentation][1]

[1]:https://wiki.strongswan.org/projects/strongswan/wiki/InstallationDocumentation
MySQL workbenchでレコードを削除したらjavax.persistence.EntityNotFoundExceptionが発生

###環境
Spring Boot 2.4.0
java 1.8
thymeleaf 3.0.11
Spring Security 2.4.0
MySQL 8.0.22

###現象
MySQLWorkbenchで「いらんなぁ」って思ったレコードを消去しました。
`Delete row`でぽんと消しちゃったんですね。

そしたらシステムにログインできなくなりました。

別にしようとしてたログインとは関係ないレコードなんですけどね。

また元に戻せば大丈夫ですが、AutoIncrementがあるので、
1. AutoIncrementを外す
2. idを指定するinsertする
3. AutoIncrementをつける

ってめんどくさいことをしないと戻せない。

前にもやったんですけど、解決策がわからず前に進まなかったので、とりあえずめんどくさいけど上のやり方をしました。

でもまたあとから見て不要だと思ったので削除しようってやったら、「またかよ・・・」

これからもあるかもしれないので、ちょっと調べました。


###解決策
https://stackoverflow.com/questions/46612968/hibernate-unable-to-find-entity-with-id
これを参考にしました。

```java
@NotFound(action = NotFoundAction.IGNORE)
```
どうやらこれを追加すれば良いみたい。

###どこに？！

```java
@ManyToOne（の下）
```

###例


```java
@Entity
Supplier {
  // フィールド省略
}

@Entity
Wedding {
  // フィールド省略
  @ManyToOne // ←これが消したレコードを探しにいってるみたい・・・
  private Supplier supplier;
}
```

変更後

```java
@Entity
Wedding {
  // フィールド省略
  @ManyToOne
  @NotFound(action = NotFoundAction.IGNORE) // ←これのおかげで無視してくれるみたい
  private Supplier supplier;
}

```

###原因
まだわかりません。
どうして消したはずのレコードのIDを探しにいってるの？
てかなんで覚えてるの？
どこに保存されているの？

ということがわかりません。

でもどっかに保存されているのでしょう。
Hibernateってやつですかね？？

そのあたりSpringBootのことをしっかり理解していないですが、使いながら理解していきたい！！

とりあえず同じ様なエラーで前に進まない方の参考になればと思います。
クラウド初学者がAZ-900に受かるための勉強とその注意点　2021/01/09

2021年1月9日にAZ900をぱすしました。これから受験される方へのご参考になれば幸いです。
ちなみに、今回ご紹介する書籍や問題集と私は無関係です。ご安心ください。

#はじめに
私はクラウドの知識ゼロで勉強をスタートしました。
IaaS PaaS SaaSなにそれ？ミドルウェアってなに？みたいな状態です。

AWS GCPはもちろん
AzureもAZ-900を知るまで知りませんでした。

本当の意味での初学者でした。

#勉強時間
勉強時間の目安はだいたい30時間程度でしょうか。
スタート地点が皆さん異なるため目安です。ノルマではありません。
勘のいい方なら10時間で合格可能だと思います。勉強時間は私の場合50時間程度でした…

#参考書の紹介と注意
AZ900に関してはマイクロソフト認定の参考書があります。
そこで皆さんに1つ注意してほしいことがあります。

AZ900の日本語版の参考書
https://www.amazon.co.jp/s?k=AZ-900&__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&ref=nb_sb_noss_2


このページの青い本です。
こちらを購入していただき勉強をすればテスト全体の7割はカバーできると思います。

そう7割なのです。
AZ-900の合格ラインが7割に設定されているため
この本をマスターした場合テストの合否は出題される問題に大きく依存します。運ゲーです。

私は特に調べもせず上記の対策本のみで勉強しておりました。
結果1度目は不合格になってしまいました。(628/1000)
☝単純に実力不足説もあります。

所感としては、
知らない語句が全体の2~3割ほど出題されたイメージ。
単純に語句の意味を問う問題は少なめ。理解力を問われる

#やってほしい勉強　公式のセミナ
そこで皆さんにやってほしいことはマイクロソフト公式のAzureの基礎です。
https://docs.microsoft.com/ja-jp/learn/paths/az-900-describe-cloud-concepts/
当たり前といえば当たり前ですが、公式のラーニングパスを履修しましょう。
ただ、かなり分量がありますので、さきに上記の対策本を読み概要を頭に入れてから
受講をおすすめします。1から10まで全て読むわけではなく最初に理解度確認のテストを行い
知らない単語が出現したらその章を勉強しましょう。残りの部分は復習と知らない語句を見つけると
なお理解が深まります。

さらにマイクロソフト公式が無料セミナを開催しております。これに参加しない手はないですね。
テキストも頂ける？そうです。
平日開催のためお休みをうまく調整しましょう。学生の方はまたとないチャンスです。
ちなみに私は受講しておりませんがセミナとは別の方法でコードを頂きました。

さらにバウチャーコード(試験1回タダ券)がもらえちゃいます。
これ目的でも参加する価値があるかと思います。
https://www.microsoft.com/ja-jp/events/top/training-days.aspx?activetab=a1:primaryr4
👆セミナのURL

#圧倒的な問題集不足
上記の勉強を一通り終えたあなたは、おそらくAZ-900に合格する実力をもっています。
しかし無料ギフトは1回まで落ちれば15000円の出費が…
そんな心配性な方にはUdemyに2回分の模擬問題がありますので購入してみましょう。
https://www.udemy.com/course/az-900-microsoft-azure-fundamentals/
これは買いました。個人の方が作成されているのでなかなか高価(3600円)ですが
かなり実際の試験に近い雰囲気です。ただこれを丸暗記しても無駄です。
Azureの基礎、参考書、セミナなどを受けた上で受講しましょう。

最後にこれはどうしても心配だという方向けです。購入しなくても合格はできます。
やらないかたは、Web問題集でAzure試験に合格しよう様の問題で試験問題に慣れておきましょう。
https://learn-azure.cafe/az-900

#まとめ
1.参考書は買ったほうが良い。
2.参考書をさらっと読み終えた位の知識でセミナを受験するのがよい。
3.参考書のみだと不足するので公式のラーニングパスを履修する。
4.Udemyの問題集は心配な方向け。やらなくても良い。
  やらない方はwebで無料で公開されている問題をやりましょう。

みなさんが1発で合格することを願っています。
読んでくださりありがとうございました。
Gnuplotで微分

#gnuplotで微分をするには

```
d(y) = ($0 == 0) ? (y1 = y, 1/0) : (y2 = y1, y1 = y, y1-y2)
dx = 1.0/100.0
plot 'data.txt' u 1:2 title 'data' w lp , \
     '' u ($1-dx):(d($2)) w lp  title '1nd def.', \
     '' u ($1-dx):(d($2)) smooth csplines w l title '1nd dif. smooth'
```
以上
JSの基本構文と基礎の勉強（アウトプット用）（１）

# はじめに
<!-- 発端や概要を記載 -->
JavaScriptで利用される基本関数的な関数などを自分なりにまとめてみた。


# 目次
<!-- タイトルとアンカー名を編集 -->
1. [JavaScriptとは](#Chapter1)
2. [いろんな関数](#Chapter2)
3. [参考文献](#reference)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
#JavaScript

<h3>JavaScriptでできること</h3>
・HTMLとCSSだけでできないことをすること。
・静止した画面をその場で書き換えたりすることができる。
・タグに囲まれたテキスト（コンテンツ）を書き換えることができる
・要素</>を追加・削除・変更することができる。
・CSSの値を変更することができる。
・ダイアログで別画面を表示することができる。

<h3>ECMAScript(ES6) 2015</h3>
2015年にJavaScriptの仕様が大きくなり改定され、エクマスクリプト2015と呼ばれるようになりました。
varは、非推奨でconstとletを利用するように言われました。
letは、再宣言ができない

```javascript:sample.js
 let test = 1;
 let test = 2;//×
 test = 2;//〇
```

constは、再宣言ができない

```javascript:sample.js
 const test = 1;
 const test = 2;//×
 const = 2;//×
```

詳細は、こちら[ES2015(ES6) 入門](https://qiita.com/soarflat/items/b251caf9cb59b72beb9b)
上記に詳細な内容が書かれています。

<h3>JavaScriptの動作の仕組み</h3>
イベント発生（処理発生）→加工→アウトプット（出力）の順で処理が流れてアウトプットされます。

<a id="#Chapter2"></a>
#いろんな関数やその他
console.log();
・・・値の確認ができる。
※undefinedは未定義。
jsでの実行は、「〇〇は△△を××しなさい」で
〇〇→オブジェクト,△△→パラメータ,××→メソッド
console→オブジェクト
log()→メソッド

console.dir();
・・・配列や連想配列や関数の中身をより詳細に確認できる。

console.error();
・・・エラー表記する

スクリプトタブ

```html:sample.html
<script>
'use strict';
let test = 1;
</script>
```

windowアラート
ダイアログボックスを表示させる。
windowオブジェクトで用意されているalertメソッドのことです。

```js:sample.js
window.alert("test");
```

documentとgetElementByIdとtextContent
documentのIdを取得するメソッドにテキストを挿入する。

```js:sample.js
'use strict';
document.getElementById('choice').textContent = new Date();

```

<a id="#reference1"></a>
#参考文献
- [Lsoarflat様](https://qiita.com/soarflat/)
WSL2にROS導入メモ：syntax error near unexpected token `('でcatkin_makeなどが通らない際の解決法

## 問題
WSL2上でROS環境の構築をしようとしたものの、source /opt/ros/melodic/setup.bashやsource ~/catkin_ws/devel/setup.bash、catkin_makeをすると以下のようなエラーが出てしまった。
`-bash: /tmp/setup.sh.Mj4Jcya6cq: line 4: syntax error near unexpected token '('`

## 原因

これは、環境変数PATHに()を含む文字列が含まれてしまっていることが原因である。
筆者の場合はWindowsの`c/Program Files (x86)`がこれに該当した。

## 解決法
そこで、WSL2のPATHからWindowsのPATHを抜くことを考える。
WSL2のPATHにWindowsのPATHを含むかどうかは`/etc/wsl.conf`で指定することができる。(デフォルトでは存在しないが自分で作成すればWSL2が起動時に勝手に参照してくれる)

WSL2のターミナルで

```shell

cd /etc/wsl.conf
sudo vim /etc/wsl.conf
```
などとして/etc/wsl.confを開き、以下のように編集する。

```
[interop]
appendWindowsPath = false
```


その後、WSL2を再起動する。
ターミナルを閉じた後にWindows Powershellで以下のようにコマンドを打つとWSL2を終了させることができる。

```shell

wsl -t <ディストリビューション名>
```
現在実行中のディストリビューション名は以下のコマンドで確認できる

```shell

wsl -l -v
```
終了後、再度起動するとエラーが出てこなくなった。


## 参考
1. [Windows10 WSL2にLinux居城を爆誕させる](https://qiita.com/v2okimochi/items/f53edcf79a4b71f519b1)
1. [[WSL2] Slow completion due to Windows PATH being appended to Linux PATH](https://github.com/microsoft/WSL/issues/4234#issuecomment-505609403)
1. [(PCではなく)WSL2のみを終了、再起動する方法](https://astherier.com/blog/2020/08/how-to-terminate-wsl2/)
HHKB Professional HYBRID（日本語配列）の設定方法

#前提
- 2021/01/19現在の設定
- MacBookProはUSキーボードで、HHKBは日本語配列を購入
- OSはmacOS Catalina 10.15.7
- HHKB Professional HYBRID Type-s

# Mac用のドライバをインストール
Mac用の[ドライバ](http://www.pfu.fujitsu.com/hhkeyboard/macdownload.html)をインストールする。
これによってMacにHHKBが接続されると認識させる。

#HHKBの背面スイッチ設定
SW1 ON
SW2 OFF
SW3 OFF
SW4 OFF
SW5 OFF
SW6 OFF
ここまでで下準備完了

#キー配列変更
[Karabiner-Elements](https://karabiner-elements.pqrs.org/)をMacに入れる
このソフトでいろいろキー配置の設定が変えられる
以下のように設定した
####私の設定
- スペースの右をかなキー
- スペースの左を英数キー
- HHKBマークのキーをcontrolキー
- Tab下のControlを⌘コマンドキー（菱形マークのキーは小さくて押しにくいのでこの設定おすすめ）
- 菱形マークのキーを⌘コマンドキー（設定変更なし）
- 左のAlt(Opt)キーをそのままoptionキーとして使う（設定変更なし）
- Kanaキーは今のところ何も割り当てない（設定変更なし）

Macの日本語配列キーボード的には菱形マークとAltの位置が逆だが、Altと書かれたキーに⌘コマンドキーを割り当てるのがなんとなく嫌なのでこの設定にしてある
どうしてもMacの日本語配列キーボードに近づけたいなら、設定を逆配置にし、キーキャップを外して場所交換しても良いかも

###Karabiner-Elementsの設定
- Simple modificationsタブのTarget deviceに設定したいデバイスを設定（今回の場合はHHKB）
- international4はスペース右の()←こんな感じのマークのこと
- international5はスペース左の(/)←こんな感じのマークのこと
- grave_accent_and_tidle(`)はHHKBマークのこと
    - 設定前にHHKBマークを押下すると｀が出力されたため
- left_controlはTab下のControlキーのこと
![スクリーンショット 2021-01-19 16.07.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605244/b2824e19-2ca7-1616-4afc-b41473e8cfbd.png)
![pd-kb820ws.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605244/bfa0a8a2-044a-824e-5a1f-0549ed9d851f.jpeg)


#終わりに
今後新規にMacを設定することがあった場合の個人メモとして残す
MacのバックスラッシュはOption + ¥
キー配置の設定は個人の好きなようにカスタマイズすれば良いと思います
CapsLock使わないから設定してないです！
VSCodeでリモートのプログラムファイルを編集する

# はじめに
AI用のPCを会社に導入し，その中にJupyterHubをインストールすることで，会社でのAI開発はリモートで開発できるようになっています．（[JupyterHubを使ってAI用サーバーを構築する](https://qiita.com/jjjkkkjjj/items/b62a7424065c5537348e)）
しかし，現状のJupyterhubでは，Intellisenseが効かず，コード補完ができないので，開発効率があまり良くないという問題がありました．そこで，VSCodeのRemote SSHを使って，VSCode上で会社のAI用PCにアクセスしようという話です．

# SSH設定

## 鍵作成
まず，接続元（ローカル）でSSHの鍵を設定します．
※`{hoge}`は任意

```bash
cd ~/.ssh
ssh-keygen -t rsa -f id_{hoge}_rsa
# パスフレーズ設定は任意
```

## `config`ファイルの編集

次に，`config`ファイルを編集します．
※`{username}`は自分のユーザーネーム，`xxx.xxx.xxx.xxx`はIPアドレス，`{host}`は任意．

```config:~/.ssh/config
vi ~/.ssh/config
  
Host {host}
  HostName xxx.xxx.xxx.xxx
  User {username}
  Port 22
  IdentityFile ~/.ssh/id_{hoge}_rsa
```

## 公開鍵の登録
できた`id_{hoge}_rsa.pub`を接続先にコピーします．

```bash
scp ~/.ssh/id_{hoge}_rsa.pub {host}:~
```
  
そして，接続先にSSHして，公開鍵を登録します．

```bash
ssh {host}
cat id_{hoge}_rsa.pub >> .ssh/authorized_keys
rm id_{hoge}_rsa.pub
chmod 600 .ssh/authorized_keys
```

## 確認
もう一度接続して，パスワードを聞かれなければOKです．

```bash
ssh {host}
```

# VSCode設定

## VSCodeのインストール
[公式サイト](https://code.visualstudio.com/)からダウンロードして，インストールします．

## Remote Developmentインストール
Remote Developmentインストールします．（本当はRemote SSHでいいけど，せっかくなので全部インストールします）

![remote ssh](https://user-images.githubusercontent.com/16914891/104996836-ed0d3b80-5a6b-11eb-9d8e-e49cde240159.JPG)

## Platformの設定
歯車マーク→Settings→Extensions→Remote-SSH→Remote PlatformでPlatformを設定します．
`Item`：上記で設定した`{host}`，`Value`：接続先のOSを設定

※これをしないと恐らく接続できないと思います．

![remote ssh2](https://user-images.githubusercontent.com/16914891/104996849-f26a8600-5a6b-11eb-992d-343b92a2ca59.png)


## VSCode上で接続
左下の＞＜→Remote-SSH: Connect to Host...→`{host}`で接続します．
新しくVSCodeのWindowが立ち上がり，エラーが出なければOKです．

![remote ssh3](https://user-images.githubusercontent.com/16914891/104996845-f1395900-5a6b-11eb-9b41-423b899b3138.png)

## 例
Open Folderすると．．．
以下のように，接続先のディレクトリを接続元のVSCodeで開けます！！

![remote ssh4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/76047e29-a08c-2b58-7218-44612060c10c.png)

# 不具合関係
接続できても，Extensionが読み込めない不具合が起きる可能性があります．その場合は接続先の`.vscode-server`を削除すると改善します．

```bash
ssh {host}
rm -rf .vscode-server
```

# おまけ
## autocomplete
コード補間がうまくいかなかったので，メモ．
特に，環境がAnacondaの場合は，`python.languageServer`が`Jedi`や`PyLance`だとダメみたい．

```json:{global}/settings.json
{
    "editor.suggestSelection": "first",
    "vsintellicode.modify.editor.suggestSelection": "automaticallyOverrodeDefaultValue",
    "python.languageServer": "Microsoft",
    "terminal.integrated.inheritEnv": false
}
```

## pythonでの画像表示
ローカル環境であれば，OpenCVで読み込んだ画像は，Windowを表示させれば確認できますが，リモート環境だとそもそもWindowを表示することができません．
そこで，Extensionsの`Python Image Preview`を使うと確認できます．
＃まだ，評価等が少ないですが使ってみると便利でした．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/02edb046-0787-aa57-ffd7-6a9edba45553.png)

`Python Image Preview`のインストールが完了したら，デバッグ中に`Ctrl+P`でコマンドパレットを開き，`Python Image Preview`を選択し，表示したい画像の横に現れるヒントマークをクリックすると，Preview画像が開かれます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253935/2128390f-0de1-4864-0c2f-b5e9b88d0073.png)


# おわりに
これで，開発効率は一段と上がりました．
manimの作法 その19

#概要

manimの作法、調べてみた。
LinearTransformationScene使ってみた。

#サンプルコード


```
from manimlib.imports import *

class test(LinearTransformationScene):
	CONFIG = {
		"matrix": [[2, -5.0 / 3], [-5.0 / 3, 2]],
		"v": [1, 2],
		"w": [2, 1],
		"v_label": "v",
		"w_label": "w",
		"v_color": YELLOW,
		"w_color": MAROON_B,
		"rhs1": "> 0",
		"rhs2": "< 0",
		"foreground_plane_kwargs": {
			"x_radius": 2 * FRAME_WIDTH,
			"y_radius": 2 * FRAME_HEIGHT,
		},
		"equation_scale_factor": 1.5,
	}
	def construct(self):
		v_mob = self.add_vector(self.v, self.v_color, animate=False)
		w_mob = self.add_vector(self.w, self.w_color, animate=False)
		kwargs = {
			"transformation_name": "T",
			"at_tip": True,
			"animate": False,
		}
		v_label = self.add_transformable_label(v_mob, self.v_label, **kwargs)
		w_label = self.add_transformable_label(w_mob, self.w_label, **kwargs)
		start_equation = self.get_equation(v_label, w_label, self.rhs1)
		start_equation.to_corner(UR)
		self.play(Write(start_equation[0::2]), ReplacementTransform(v_label.copy(), start_equation[1]), ReplacementTransform(w_label.copy(), start_equation[3]), )
		self.wait()
		self.add_foreground_mobject(start_equation)
		self.apply_matrix(self.matrix)
		self.wait()
		end_equation = self.get_equation(v_label, w_label, self.rhs2)
		end_equation.next_to(start_equation, DOWN, aligned_edge=RIGHT)
		self.play(FadeIn(end_equation[0]), ReplacementTransform(start_equation[2::2].copy(), end_equation[2::2], ), ReplacementTransform(v_label.copy(), end_equation[1]), ReplacementTransform(w_label.copy(), end_equation[3]), )
		self.wait(2)
	def get_equation(self, v_label, w_label, rhs):
		equation = VGroup(v_label.copy(), TexMobject("\\cdot"), w_label.copy(), TexMobject(rhs), )
		equation.arrange(RIGHT, buff=SMALL_BUFF)
		equation.add_to_back(BackgroundRectangle(equation))
		equation.scale(self.equation_scale_factor)
		return equation




```

#生成した動画

https://www.youtube.com/watch?v=YXsK0QDOSGg

以上。
Springboot+gradle+db2

## db2での設定メモ

ソースは[こちら](https://github.com/ajilab/kushimitama)

```application.properties
# ===============================
# = DATA SOURCE
# ===============================
# Set here configurations for the database connection
spring.datasource.url=jdbc:db2://[hostname]:[port]/[dbname]
spring.datasource.username=[connect user name]
spring.datasource.password=[connect user pw]
spring.datasource.driver-class-name=com.ibm.db2.jcc.DB2Driver
# Keep the connection alive if idle for a long time (needed in production)
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT RAND() AS RANDOM_NUMBER FROM DUAL
```

```build.gradle
dependencies {
        ~
	implementation 'com.ibm.db2.jcc:db2jcc:db2jcc4'
        ~
}
【Python】文系だけど頑張ってbit全探索を理解する

#はじめに

※自分用メモ

https://qiita.com/gogotealove/items/11f9e83218926211083a
こちらの記事でものすごく丁寧にbit全探索を解説されている。
しかし、生まれながらにして文系の自分の頭では読んだだけじゃ全く理解が追い付かなかったので、自分でコードを書いてひとつずつ理解しながらじっくり取り組んでみた。

# コード
```python:みかんりんごぶどう.py
# 参考:https://qiita.com/gogotealove/items/11f9e83218926211083a

# -例題- 
# みかん（100円）りんご（200円）ぶどう（300円）が
# それぞれ1つずつ果物屋さんにありました。
# 財布の中には300円ありますが、
# 考え得るすべての買い物パターンを列挙しなさい。

# -考え方-
# 全ての買い物パターンで合計金額を計算し、
# その中から300円以下で済んだものを列挙する

# 2~3 = 8パターンの中から300円以下のものを列挙する

money = 300
item = (("みかん",100),("りんご",200),("ぶどう",300))

n = len(item)

# 各アイテムを買うor買わないを
# 「2進数のそれぞれの桁が0であるのか1であるのか(左からみかん、りんご、ぶどう)」
# で表現すると、以下のような表になる。

# -10進数表記-　-2進数表記-　-買い物リスト-
# 0        　   000        　何も買わない
# 1        　   001       　 ぶどう
# 2        　   010      　　りんご
# 3        　   011     　   りんご+ぶどう
# 4        　   100     　   みかん
# 5        　   101     　   みかん+ぶどう
# 6        　   110     　　 みかん+りんご
# 7        　   111    　　  みかん+りんご+ぶどう

# 全パターンループ
for i in range(2 ** n):
    bag = []
    total = 0

    # アイテムの個数分ループ
    for j in range(n):
        # 順に右にシフトさせ、最下位bitのチェックを行う
        # 下から0桁目が1であればぶどう入り
        # 下から1桁目が1であればりんご入り
        # 下から2桁目が1であればみかん入り

        #2進数の一番右からチェックを開始していく

        # ex)i = 6、j = 0の場合(ぶどうチェック)
        # 6の2進数「110」を0ビット右シフトすると「110」
        # 最下位の値を1で論理和をとるとfalseになるので「ぶどう無し」

        # ex)i = 6、j = 1の場合(りんごチェック)
        # 6の2進数「110」を1ビット右シフトすると「011」
        # 最下位の値を1で論理和をとるとtrueになるので「りんご入り」

        # ex)i = 6、j = 2の場合(みかんチェック)
        # 6の2進数「110」を2ビット右シフトすると「001」
        # 最下位の値を1で論理和をとるとtrueになるので「みかん入り」
        if((i >> j) & 1):
            # フラグが立っていたら、bagに果物をつめる
            # [j](itemの要素番号) [0](果物名)
            bag.append(item[j][0])
            # 買い物累計額にも加算
            # [1](果物金額)
            total += item[j][1]

    # totalが300以下の時、合計金額と配列bagに格納されている果物名を出力
    if(total <= money):
        print(total,bag)

def test():
    # 2進数表記した場合の下から数えてｎ桁目(一番下の桁を0とする)が
    # 1であるかどうかをチェックするコードは「(i >> n) & 1」である。
    # これは、「iをn回右にシフトして1(2進数001)と論理積をとる(最下位の桁が1であるかどうかチェックする」
    # ということになる。
    
    i = 5

    # 5を2進数で表記すると101
    bin(i) 
    # 5を2回右にシフトすると001
    bin(i >> 2)
    # 5を2回右にシフトしたものと
    # 1の論理積は1(=True)
    print((i >> 2) & 1)
```
manimの作法 その18

#概要

manimの作法、調べてみた。
SampleSpaceScene使ってみた。


#サンプルコード

```
from manimlib.imports import *

class test(SampleSpaceScene):
	def construct(self):
		sample_space = self.get_sample_space()
		self.add_prior_division()
		self.add(sample_space)
		self.add_conditional_divisions()
		prior_label = sample_space.horizontal_parts.labels[0]
		final_labels = self.final_labels
		hard_to_see = TextMobject("Hard to see")
		hard_to_see.scale(0.7)
		hard_to_see.next_to(prior_label, UP)
		hard_to_see.to_edge(UP)
		hard_to_see.set_color(YELLOW)
		arrow = Arrow(hard_to_see, prior_label)
		self.wait()
		anims = self.get_division_change_animations(sample_space, sample_space.horizontal_parts, 0.001, new_label_kwargs = {"labels" : final_labels})
		self.play(*anims, run_time = 2)
		self.wait()
		self.play(Write(hard_to_see, run_time = 2), ShowCreation(arrow))
		self.wait(2)
	def add_prior_division(self):
		sample_space = self.sample_space
		sample_space.divide_horizontally(0.1)
		initial_labels, final_labels = [VGroup(TexMobject("P(\\text{Disease})", s1), TexMobject("P(\\text{Not disease})", s2),).scale(0.7) for s1, s2 in (("", ""), ("= 0.001", "= 0.999"))]
		sample_space.get_side_braces_and_labels(initial_labels)
		sample_space.add_braces_and_labels()
		self.final_labels = final_labels
	def add_conditional_divisions(self):
		sample_space = self.sample_space
		top_part, bottom_part = sample_space.horizontal_parts
		top_brace = Brace(top_part, UP)
		top_label = TexMobject("P(", "+", "|", "\\text{Disease}", ")", "=", "1")
		top_label.scale(0.7)
		top_label.next_to(top_brace, UP)
		top_label.set_color_by_tex("+", GREEN)
		self.play(GrowFromCenter(top_brace))
		self.play(FadeIn(top_label))
		self.wait()
		bottom_part.divide_vertically(0.95, colors = [BLUE_E, YELLOW_E])
		bottom_label = TexMobject("P(", "+", "|", "\\text{Not disease}", ")", "=", "1")
		bottom_label.scale(0.7)
		bottom_label.set_color_by_tex("+", GREEN)
		braces, labels = bottom_part.get_bottom_braces_and_labels([bottom_label])
		bottom_brace = braces[0]
		self.play(FadeIn(bottom_part.vertical_parts),GrowFromCenter(bottom_brace), )
		self.play(FadeIn(bottom_label))
		self.wait()





```

#生成した動画

https://www.youtube.com/watch?v=MeoD6IpM2AM

以上。
Cognos Analytics パッケージを上書きしたらリンクが切れて使用不可になってしまう対応

#Cognos Analytics パッケージを上書きしたらリンクが切れて使用不可になってしまう対応
Cognos Analyticsで、レポートやQuery Studioの参照元となるパッケージを上書きリリースした時に、パッケージへのリンクが「使用不可」になってしまう事への対応です。

#詳細
例としてCognos Analytics 11.1.7の環境で、以下のような3つのフォルダがある状態でご説明します。
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d55c94ff-297a-f805-bc12-6a4762887660.png)

packagesフォルダには、レポートやQuery Studioなどのコンテンツが使用するパッケージが存在します。
![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/5743400d-923b-7391-9347-18541dbf1f88.png)

Reportフォルダには、レポートやQuery Studioコンテンツがあり、プロパティからPackagesフォルダのパッケージがリンクされている事がわかります。
![015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/e09b5c18-98d3-4cf5-0179-1d52ca2e259b.png)

Releaseフォルダには同名のパッケージが存在し、ここから本当のPackageフォルダにパッケージをリリースすると想定します。
![004.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a5b7ca9b-ae2e-1dce-a3ed-4d69c2ca82e9.png)

Releaseフォルダのパッケージを、Packageフォルダに上書きでコピーします。
![005.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/1ec05404-28e8-279e-0e85-6a61d2e0fd51.png)

するとこの様に、コンテンツのプロパティで見るパッケージへのリンクが「使用不可」となってしまいます。
![007.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/ab87bde5-cdfb-465b-af4f-ff125c60e164.png)

レポートは実行はできるようですが、Query Studio等は実行すると、以下のようなエラーとなります。
![008.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/4023c3e1-e3a9-1278-ad69-9114f574cb50.png)

この様なパッケージの上書き時に「使用不可」になるのを避けるためには、「管理」->「構成」->「システム」->「詳細設定」で、以下の設定を行う必要があります。
キー：ContentApps.updateTargetObjectWhenOverwrite
値：true
![012.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/efd504a7-6a34-d993-536f-edcb68a26e09.png)

Cognos Analyticsを再起動すると設定は反映されます。
※ちなみに、この詳細設定の設定内容を確認するには、キーを入れてみて、値の枠にカーソルを置くと値が表示されるので、そのように確認を行うようです。

この設定で、パッケージ上書き時にもリンクが維持される動作になりました。
![015.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d4eceb1b-7b97-366d-9478-002f069df681.png)

Query Studioの場合は、以下の様なメッセージが表示されますが「OK」を選択すると、
![013.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/bffebd3d-c437-fbb8-ebe8-81f8655c717e.png)

ちゃんと表示されます。
![014.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/d8be9aa3-3510-975b-8b79-5477a101c76f.png)

以上です。
デフォルトでリンク維持の動きの方が良いような気がしますが、困った時に思い出して下さい。

#参考資料
**Retaining target object ID when copying objects**
https://www.ibm.com/support/pages/retaining-target-object-id-when-copying-objects
Unity小ネタ


# Prefabの切断
[選択してRightButton]-[Unpack Prefab Completely]
[プレハブインスタンスの展開](
https://docs.unity3d.com/ja/2018.4/Manual/UnpackingPrefabInstances.html)

# StandardAsset
[Standard Assetsのダウンロードとインポート](https://obenkyolab.com/?p=1806#Step2_Standard_Assets)

# Untiyにもどってきたのときのビルド

```
UnityのスクリプトをVisualStudioなどで編集したときの話。
デフォルトの設定ではスクリプトを編集してUnityにもどってくると自動でコンパイルが走ります。編集したかったスクリプトが一つの場合はこれで問題ありません。しかし、編集したいスクリプトが複数ある場合に下記のような編集の仕方だとUnityに戻るたびにコンパイルが走ってしまいます。
```

[スクリプト編集してUnityに戻ってきたときのプチフリーズ（コンパイル時間）がもったいない](https://farcepeace.wixsite.com/game/single-post/2019/02/21/%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E7%B7%A8%E9%9B%86%E3%81%97%E3%81%A6unity%E3%81%AB%E6%88%BB%E3%81%A3%E3%81%A6%E3%81%8D%E3%81%9F%E3%81%A8%E3%81%8D%E3%81%AE%E3%83%97%E3%83%81%E3%83%95%E3%83%AA%E3%83%BC%E3%82%BA%EF%BC%88%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%AB%E6%99%82%E9%96%93%EF%BC%89%E3%81%8C%E3%82%82%E3%81%A3%E3%81%9F%E3%81%84%E3%81%AA%E3%81%84)

# TextMesh Pro
Unity公式になった。
[TextMesh Pro](https://kan-kikuchi.hatenablog.com/entry/TextMeshPro#TextMesh-Pro%E3%81%A8%E3%81%AF)

# ScrollView
[UIです。ScrollView](https://qiita.com/k7a/items/7db3a41e39923fd8a3b3)

# [UnityAndroidのタッチ操作](https://github.com/okamura0510/GodTouch)

# 使えそうなローポリ背景
https://assetstore.unity.com/packages/3d/props/exterior/low-poly-brick-houses-131899
https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-cliff-pack-67289
https://assetstore.unity.com/packages/3d/environments/landscapes/low-poly-simple-nature-pack-162153
https://assetstore.unity.com/packages/3d/characters/humanoids/free-voxel-girl-95532

# 端末名称を取得する
[Unityで端末の情報(OS, 機種名, メモリサイズなど)を取得する！](https://hiyotama.hatenablog.com/entry/2016/12/16/153620)
端末情報の取得には、Unity標準のSystemInfoクラスを使います〜

# Unityのバーチャルパッド
[Unityのバーチャルパッドの追加]
(https://note.com/npaka/n/neafdd3059b0c)
[unity export](https://1drv.ms/u/s!ApO4wsxFJBbVxAX3LJazcfLH-Ixx?e=d8hAgI)

# 実行した端末がQuestか否か。

#if OCULUS #endif　でよかった...

```
	public static bool isQuest(){
		string str = SystemInfo.deviceModel;
		if( str.Contains("Oculus" ))
			return true;
        
		return false;
	}
```

# [skyboxのテスクチャ変更](https://miyagame.net/skybox/)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/555658/308caf53-f4ff-0d8b-4840-3bd48e2cad67.png)
【Python】OpenCVで使うパスに日本語を入れてはならない

#はじめに
タイトルの通り。
OpenCVがどうしてもパスを読み込んでくれずにハマってしまったので、どうしたものかと調べてみるとどうやら、パスに日本語を入れると正常に動作しないということがわかった。

# 想定ファイル構成
C:
↓
ユーザー
↓
test01.jpg TestOpenCV.py

#だめな例
```python:TestOpenCV.py
import cv2
filename = "C:/ユーザー/test01.jpg" # ファイルパスの「ユーザー」がアウトで読み込んでくれない
img = cv2.imread(filename,0) # img = Noneになる
```

#解決方法
日本語をパスに含めないか、相対パスを使う。

# よい例
```python:TestOpenCV.py
import cv2
filename = "C:/User/test01.jpg" # 「ユーザー」を「User」にする
filename = "./test01.jpg" # 名前を変えられない場合はTestOpenCV.pyから見た相対パスにする
img = cv2.imread(filename,0) # きちんと画像を読み込んでくれる
```
文字コードの変更方法　[Windows10]

プログラミング学習するしているときなど、WEB上からソースコードをコピったりするときがあると思いますが、文字化けしたことがあったので、原因を調べました。

自分の場合は、コードをコピってきて差分をWIN MARGEを使って差分を見ているのですが、コピって作成したファイルの文字コードが期待したコードになっていない時がありました。

![1キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/43bed82e-103f-4af2-2055-cbf86e5b4fa3.png)

---
###上記Win Margeの画面ではshift_jisになっているので、**UTF-8**に変更します。
---

![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/71143f6d-aa7a-a470-a4c9-8cc7c048963b.png)
---

【手順】
1.メモ帳を新規で開き、ファイル > 開くを Click
2.画面下部にある文字コード(E) 🔽　UTF-8を選択 > ファイルを選択 > 開く(O)をClick
3.名前を付けて保存、開き直してメモ帳下部にある文字コードを確認、UTF-8に変わりました。

![2キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/866385/e8c27f72-6b66-f94c-bf3d-bde55e924e6f.png)

余談ですが、UTF-8 (BOM 付き)というのがあります。
BOM付きとは　**BOM : Byte Order Mark**　の略でPCにファイルの文字コードがUFT-8であることを認識させる仕組みなようです。

JSやPHPなどWEB制作で扱う言語の場合は、**BOMなしが推奨のようです** 理由は動作や表示に不具合が出ることがあるようです。

---

###追記

改行コードに関して、プラットフォームごとに改行コードが異なるため
空行をコピると文字化けになる。
兎にも角にもPythonの開発環境をローカルに最速で作る（初学者用）

# 背景
いままで `Node.js` でスクレイピングしていたが、昨今盛り上がりを見せる？ `Python` でスクレイピングできるようになっておきたい。
ついでにいうと、機械学習だとかAIだとか、要するに流行りに乗っかりたい…と考えている。
なので、とりあえず動くローカル環境を作って、兎にも角にも `Python` を触りたい。
とか、考えている初学者が、兎にも角にも `Python` を動く環境を作れるようにするためのTips。

# 本記事の想定読者
- ビジネスだが、Pythonを触れるようになりたい方
- とにかくPythonを始めたい、触りたい、実験したい方
- Pythonを使って、動的Webサイトをスクレイピングしたい方

# 前提条件
- MacOS 10.15 Catalina
- Homebrewインストール済み

# 方針
- macOSにはデフォルトで `/usr/bin/python バージョン2.x系` がインストールされているが、本記事では `バージョン3.x` を使えるようにする
- `Python` のバージョン管理は考えない。したがって、 `pyenv` は入れない

# 手順
1. homebrewでpython3のインストール
2. インストールしたpython3のバージョン確認
3. pip3のバージョン確認


## 1. homebrewでpython3をインストール
```
brew install python3
```
※自動的に `pip3` もインストールされる

## 2. インストールしたpython3のバージョン確認
```
python3 --version
```

## 3. pip3のバージョン確認
```
python3 -m pip --version
```
※pipを使いたい時は、 `python3 -m pip` としないと、バージョン2系のpipを呼び出してしまうことになるので注意が必要。

---

以上で、Python3の実行環境を手に入れることができる。
[PostgreSQL] Railsアプリを削除するなら、先にデータベースを削除する！

##はじめに
学習中にサンプルアプリを作っては消すを繰り返していると、
ふと「フォルダ削除するだけでいいの？」と疑問に感じました。

調べてみると、、
**フォルダ**を削除する前に、**DB（データベース）**を削除しなければいけないらしいです！
以下、2通りの方法をメモしておきます。

- **DB削除 → アプリフォルダ削除**
- **アプリフォルダを削除してしまった後のDB削除方法**

##環境
- macOS Catalina
- Ruby 2.7.2
- Rails 6.0.3
- PostgreSQL 13.1



#① DB削除 → アプリフォルダ削除
該当アプリのフォルダ内で

```
$ rails db:drop
```
親ディレクトリに移動して

```
$ rm -rf アプリ名
```

必ず上記①の手順で削除するのが良さそうです。
ここからは、もしもアプリフォルダを先に削除してしまった場合の方法です。

#② アプリフォルダを削除してしまった後のDB削除方法
```
$ psql -l     (DB名を一覧表示
```

```
#実行結果（sampleアプリを削除したい場合）

                             List of databases
             Name      | Owner | Encoding | Collate | Ctype | Access privileges 
-----------------------+-------+----------+---------+-------+-------------------
 sample_development    | user  | UTF8     | C       | C     | 
 sample_test           | user  | UTF8     | C       | C     | 
 postgres              | user  | UTF8     | C       | C     | 
 template0             | user  | UTF8     | C       | C     | =c/user           +
                       |       |          |         |       | user=CTc/user
 template1             | user  | UTF8     | C       | C     | =c/user           +
                       |       |          |         |       | user=CTc/user
(5 rows)
```


```
$ psql postgres      (PostgreSQLにログイン

---
(postgres=#) \du     (ユーザーと権限を確認
(postgres=#) \q      (PostgreSQLからログイン
---

$ dropdb -U ユーザー名 消したいDB名
```

####※削除してはいけないDB（デフォルト）
`postgres`
`template0`
`template1`

私はこのデフォルトであろう`postgres`を削除してしまいました。。（大反省）
学習用のアプリばかりだったので、PostgreSQLをアンインストールしました。
再インストール後に確認すると、上記3つのDBは初めからありました！！


上記デフォルトを削除してしまった後の手順を、自戒の意を込めて記しておきます。
##アンインストール方法
```
$ ls /usr/local/Cellar/postgresql     (インストール済みPostgreSQLバージョン確認
$ brew info postgresql     (現時点の最新バージョン確認

$ brew uninstall --force postgresql     (全てのバージョンをアンインストール

$ ls -l /usr/local/var/postgres     (設定ファイル、ログ、データ等を表示
$ rm -rf /usr/local/var/postgres     (設定ファイル、ログ、データ等も削除
```

その後のインストールは、初めてインストールした時と同様に。

##さいごに
学習中はサンプルアプリが増えていく一方でしたが、
私はこの方法で解決できました。
間違っているところがあればご指摘いただけるとありがたいです。

##参考記事
[Ruby on Rails 削除関連まとめ](https://qiita.com/ruemura3/items/63eb805aa2b4e250df81)
[PostgreSQLで強制的にデータベースを削除する](https://qiita.com/sayama0402/items/b3d96c25ecb60733beb9)
[[MacOS] PostgreSQL の全バージョンをアンインストールする方法 ~ Homebrew 編](https://codenote.net/mac/homebrew/3894.html)
[PostgreSQLドキュメント「dropdb」](https://www.postgresql.jp/document/12/html/app-dropdb.html)
LVMの移行作業 (vgexport, vgimport)

# 概要
LVMをA端末からB端末へ移行する方法について説明する。
大雑把にはA端末でVGをエクスポートして、それをB端末で読み込んでマウントするといった流れである。

# Export
まずA端末上で、移行するVGの確認

``` bash
$ sudo vgdisplay

  --- Volume group ---
  VG Name               ubuntu-vg
  System ID
  Format                lvm2
  Metadata Areas        1
  Metadata Sequence No  3
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                2
  Open LV               0
  Max PV                0
  Cur PV                1
  Act PV                1
  VG Size               <447.13 GiB
  PE Size               4.00 MiB
  Total PE              114465
  Alloc PE / Size       114464 / 447.12 GiB
  Free  PE / Size       1 / 4.00 MiB
```

移行に入る前にVGを不活性化する。

```
$ sudo vgchange -a n [VG Name]
```

VG情報のエクスポート

```
$ sudo vgexport [VG Name]
```

エクスポートできたか確認

```
$ sudo pvscan

  PV /dev/sdb1 is in exported VG
```


# Import
ここでA端末のVGの物理ディスクをB端末へ差し替える。
次にB端末上で移行してきたLVMが認識されているかを確認する。

```
$ sudo pvscan
  PV /dev/sdb1 is in exported VG
```

VGをインポートする。

```
$ sudo vgimport [VG Name]
```

# Mount
B端末上でLVを探す。

```
$ sudo lvscan
  INACTIVE            '/dev/ubuntu-vg/root' [446.17 GiB] inherit
```

活性化させる。

```
$ sudo lvchange --available y ubuntu-vg
```

活性化されたかの確認。

```
$ sudo lvscan
  ACTIVE            '/dev/ubuntu-vg/root' [446.17 GiB] inherit
```

最後にマウントする。

```
$ sudo mount /dev/ubuntu-vg/root /mnt/oldDisk
```
【備忘録】UnityでARFoundation使ってARアプリ（iOS）作る際に、なぜかスマホのカメラが起動せずスマホの画面が黒いままの現象について

Unity: 2019.4.13f1
Mac : BigSur 11.1

表題について、忘れずにメモ
前提として、ヒエラルキーに
ARSessionOrigin
ARSession
は、追加していること
また、デフォルトでついてくるカメラのオブジェクトは消していること

下記やったことまとめ
・ARSessionOringin配下のAR CameraのTagをMainCameraに変更
・File > Build Settings >Player Settings > Playerを変更
　・Other SettingsのMultiThreadRenderingにチェックをつける
　・Other SettingsのArchitectureをARM６４にする
　・XR Plug-in Managementをクリックし、Plug-in ProvidersにあるARKitにチェックをつける

で、動いた
M1 MAC(Apple Silicon) でmysqlイメージを動かす

docker-compose.yml
に以下の様にplatformを設定する

```
services:
  db:
    platform: linux/x86_64
    image: mysql:5.7
    ...
```

なんでこれで動くのか不思議だったが、
https://www.publickey1.jp/blog/20/apple_m1docker_desktopcpux86docker.html
によると、
「Docker Desktop for Mac」はマルチCPUアーキテクチャ対応しており、上記の指定だと、
linux/x86_64用のイメージをエミュレーションして動作させることになるっぽい。
エミュレーションするため遅くはなるかもしれない
「ゼロからサイトを作る」「レスポンシブに対応させる」

# デイトラWeb制作コース初級編DAY7の学び
# 【この記事に書いてあること】
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">プログラミング学習7,8日目⏩<br><br>Web制作コース　初級編DAY7💻<br><br>学習時間:2時間⏳<br><br>学習内容:ゼロからサイトを作る③（レスポンシブ対応）✏<br><br>学び📚<br>・画像の上に文字を載せるには「background-image」を使う<br>・ レスポンシブ対応コードは、「<a href="https://twitter.com/Media?ref_src=twsrc%5Etfw">@media</a> only screen and (max-width:767px)」<a href="https://twitter.com/hashtag/%E3%83%87%E3%82%A4%E3%83%88%E3%83%A9?src=hash&amp;ref_src=twsrc%5Etfw">#デイトラ</a> <a href="https://t.co/ZUaovilfBc">pic.twitter.com/ZUaovilfBc</a></p>&mdash; ふりっく💻トリプルゼロの（これから）Webマーケター (@FuRiC_twi) <a href="https://twitter.com/FuRiC_twi/status/1351407489909022721?ref_src=twsrc%5Etfw">January 19, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#　【学習時間】

2時間

#　【学び】

1 画像の上に文字を載せるには、```background-image```を使いその上に``<p>```で文字を書く

```style.css
background-image: url(../img/main-vsual-nontitle.png);
```

```index.html
　　　 <p class="top-title">
        1日1題30日で<br>
        プロのWebエンジニアになろう！
      </p>
      <p class="top-subtitle">
        毎日設定された課題をこなすだけ！<br>
        未経験から30日でプログラミングスキルをつけよう
      </p>
```
↓
![スクリーンショット 2021-01-18 5.53.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1028584/737e04a6-463a-d855-3b84-eb0961186468.png)

2 レスポンシブ対応　コード

```style.css
@media only screen and (max-width:767px) {

この中にレスポンシブ用のCSSを記述していく！

}
```

3 なぜ、```max-width:767px```なのか
　→　一番出回っているタブレットのipadのサイズが768px
    一般的なPCのサイズは1200pxで768~1200pxはPCと同じ表示を出して
　　767px以下（スマホ）からはレスポンシブに対応させるから
会計freeeの事業所の参照権限がないため、freee請求書設定・マスター管理は使用できません。

freee for Salesforce 

新しいSand boxで久しぶりに遭遇

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/328136/abb897b4-5ba6-c818-b4c6-97376c872142.png)


強制的にボタンを押すと以下のメッセージ。

freeeの機能を利用するには、私の設定 > 外部システムの認証設定を開き、指定ログイン情報 freeeへログインを選択してfreeeへのアクセスを許可する必要があります。アクセスする権限がありません。