OmniAICreator/Qiita-1.07M huggingface dataset:
SPSS Modeler ノードリファレンス 3-2 置換

# 3-2 置換ノード[フィールド設定タブ]
<img width="200" alt="107_89置換.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/8d9ad78d-e825-6e3d-7145-c66346ebf529.png">

## 1.ノードの目的
フィールドの値を置き換えます。

## 2.解説動画（60秒）

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

## 3.クイックスタート

以下のようにノードを繋いでストリームを作成します。
＊入力データは[5.参考情報]からダウンロードできます。
![スクリーンショット 2022-01-24 14.03.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c711bf5e-2018-488c-dfce-8930a31b1194.png)

データをプレビューします。商品番号が実数(小数点あり)ですので、整数（小数点なし）に置換えます。
![スクリーンショット 2022-01-24 14.04.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/205cff4e-fd15-191c-53cf-7c8ef5d7058e.png)

[置換]ノードを編集して対象フィールドを[商品番号]にします。[置換:]を赤枠の通り[常時]に変更して無条件に値を置換えます。整数化の関数はto_integer(フィールド)です。
![スクリーンショット 2022-01-24 14.04.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/9fe4879f-d605-0303-df42-b4706103eaea.png)

商品番号が整数になりました。
![スクリーンショット 2022-01-24 14.06.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/f1d49ce6-cfc0-faf8-954a-b0a55dd92542.png)

## 4.Tips
#### 複数フィールドを同時に置換える
＊複数フィールドを同時に整数化をする場合にはto_integer(@&#xFFF0;FIELD)とワイルドカードを使います。
![スクリーンショット 2022-01-24 14.30.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/a521646b-3250-3907-6f9a-04c294260189.png)


#### 特定の値を欠損値（NULL）に変換する
商品番号が３の場合はNULLに置換えます。利用する関数はundefです。
![スクリーンショット 2022-01-24 14.42.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e4f5d4e7-2bd7-989b-344c-7d87b96bdfa6.png)

置換わりました。
![スクリーンショット 2022-01-24 14.43.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/c216e860-49a9-afdc-f97d-4f9a28c290fb.png)

もう一度NULLを３に置換えて元に戻す場合は以下の通りです。
![スクリーンショット 2022-01-24 14.47.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/4afe37bd-28de-62cf-c8b7-5416d54df225.png)

#### 文字列の加工処理
https://qiita.com/Makimaki2020/items/35ab02a7375325e678c1

#### 日付や時間の加工処理

https://qiita.com/Makimaki2020/items/72e3b774039327fa4ac4

## 5.参考情報

#### 置換ノードを解説した推しノードブログ

https://www.ibm.com/blogs/solutions/jp-ja/spssmodeler-push-node-15/

#### 置換ノードを解説したデータ加工Tips

https://www.ibm.com/blogs/solutions/jp-ja/modeler-tips-02/

#### 利用データ

右クリックでリンク先を保存してください。

https://github.com/yoichiro0903n/blue/blob/main/product.xlsx?raw=true

#### ノードのヘルプ

https://www.ibm.com/docs/ja/spss-modeler/18.3.0?topic=nodes-filler-node

#### SPSS Modeler 逆引きストリーム集（データ加工）

https://qiita.com/416nishimaki/items/4bf813e6cba84b2a1008

#### SPSS Modeler ノードリファレンス目次

https://qiita.com/416nishimaki/private/503037195081d3323eee
MAMP ProのMySqlデータ保存先 (MacOS)

MAMP ProのMySqlデータ保存先 (MacOS)について
macの買い替えなどのシステム移行や、データベースが壊れてしまっｔ場合、
直接ファイルをバックアップから復帰したいときがあります。そんな時、どこにあるか探すのが大変だったりします。

環境　MacOS12 MAMP Pro6.xのケース
=

FINDERで探してもヒットしませんが、ここを見てください。
ファイルをTimeMachineでバックアップしている場合などでも役に立ちます。

/Library/Application Support/appsolute/MAMP PRO/db/mysql57/

きっと目的のデータベースは、ファイルとして登録されていると思います。
【フリップ】画像をアニメーションで切り替えたい！オシャレに！【くるっと】

[画像をアニメーションで切り替えたい！オシャレに！](https://qiita.com/drooooopp/items/5d7ef537461ae3f23c3b) の詳細記事となります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/d8ee62d0-bc25-c726-71e7-68e5141e32c5.gif" width="300">

今回は【フリップ】でクルッと回転するアニメーションです。
実際の挙動は以下のようになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/b4afb44f-05f4-ea65-174f-4e1d8a3e6526.gif" width="300">

早速実装です！

## 1. HTMLの追加

```{html}
<div class="animate js-animate" data-is-animated="false">
  <div class="animate_item" data-animate-number="1">
    <img src="image_1-1.jpg">
  </div>
  <div class="animate_item" data-animate-number="2">
    <img src="image_1-2.jpg">
  </div>
</div>
```

まずHTMLで、 `切り替え前の画像` `切り替え後の画像` を用意します。
それぞれ、上なのか下なのかがわかるようにdata属性を割り当てその外側にも状態管理用のdata属性を記載します。

**image_1-1**
![image_1-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/51fb059b-673f-6cec-e9c4-116b7152dae1.jpeg)

**image_1-2**
![image_1-2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/cbe4a0f6-f8e8-8b36-dedd-193d57b6d1ed.jpeg)


## 2. CSSの追加

```{css}
.animate {
  position: relative;
}

.animate_item {
  position: absolute;
  transition: all .8s;
}

[data-is-animated="true"] [data-animate-number="1"],
[data-is-animated="false"] [data-animate-number="2"] {
  transform: rotateY(90deg) scale(0.9);
  transition-delay: 0s;
}

[data-is-animated="true"] [data-animate-number="2"],
[data-is-animated="false"] [data-animate-number="1"] {
  transform: rotateY(0deg) scale(1);
  transition-delay: .8s;
}
```

CSSではそれぞれの `切り替え前の画像` `切り替え後の画像` に対して、表示するときのアニメーションなどの記載をします。


## 完成！

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/116793/7dbb627c-6419-12cd-5c35-89cdd6a2034f.gif" width="200">

画像を可愛い猫にしてみました。
こんなにオシャレに！（猫がかわいい）画像切り替えが！（女の子ですよ...）簡単に！（見返り美人ですよねぇ）できちゃいました！（ふわふわでかわよ...）

あとは必要に応じてCSSでのレイアウトや、JavaScriptでのタイミングを調整すれば色々な見せ方ができると思います。

## 最後に

### その他のアニメーション切り替え記事はこちら
[【ブラシ】画像をアニメーションで切り替えたい！オシャレに！【塗りつぶし】](https://qiita.com/drooooopp/items/58ae4baeb863e52e64ce)
[【斜め】画像をアニメーションで切り替えたい！オシャレに！【グリッド】](https://qiita.com/drooooopp/items/daae7613269d41d612b7)
[【スライド】画像をアニメーションで切り替えたい！オシャレに！【縦 横 斜め】](https://qiita.com/drooooopp/items/94eb6f8e1e5009ab75d9)
折線グラフ（d3.js ＋CSVデータ、ウィンドウ内領域一杯サイズにプロット＋ウィンドウリサイズ対応）

こんにちは。
d3.js を利用し、折線グラフ[^1] [^2] をウィンドウ内領域一杯サイズにプロット描画しました。加えて、ウィンドウ・リサイズ、CSVファイルのドロップによるデータ読み込みに対応させました。

[^1]: line chart + scatter plot です。
[^2]: 横軸変数は日付です。

![FX4N1EahnBxgBTpdzB1c1643528994-1643529202.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54617/64e74b92-610e-42f0-c0ca-e363b8e63de9.gif)

CSVデータ例は：

```console
$ head -n4 sample.csv 
date,value
2013-04-28,135.98
2013-04-29,147.49
2013-04-30,146.93
```

#####ソース
ソースおよび動作例は下記です：

* "[d3.js responding to window's resizing](https://bl.ocks.org/kkdd/52603c5b4fc9c5ffb905da6ecdd734c5)" (bl.ocks)
   * **[同](https://bl.ocks.org/kkdd/raw/52603c5b4fc9c5ffb905da6ecdd734c5)** (ウィンドウ・フルスクリーン・サイズで動くことを確認する)


ウィンドウ・リサイズへの対応は下記の部分です：

```javascript
window.addEventListener("resize", debounce(render));
```

ファイルのドロップによる読み込みは下記の部分です：

```javascript
d3.select('svg').on('drop', async function(event, _) {
  let data = Array.from(event.dataTransfer.files).map(f => f.text());
  data = await Promise.all(data);
```
Pythonエンジニア基礎認定試験を受けてみた感想

# はじめに
850/1000 で無事合格しました。
特に難しい試験ではないですが、学習フローや所感についてまとめたいと思います。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [受験前のスペック](#Chapter1)
1. [勉強時間、方法](#Chapter2)
1. [試験本番](#Chapter3)
1. [まとめ](#Chapter4)

<!-- 各チャプター -->
<a id="#Chapter1"></a>
# 受験前のスペック

* エンジニア2年目（1年と1か月）
* 本業はAWSの運用、保守　Lambdaの作成、修正等を行った経験はある
* プライベートや学生時代にプログラミングを行った経験有

その他Pythonの入門教材や、Django,FastAPIなどのフレームワークを使ったWebアプリ開発（チュートリアルレベル）を行った経験はありましたが、感覚的に使ってました。

<a id="#Chapter2"></a>
# 勉強時間、方法

### 勉強時間：約10～20時間 

プログラミングの基本的な知識（for文、関数、クラスとか）はある程度持っていたので、そこまで時間はかかりませんでした。
コードを全く書いたことがないような完全な初心者であれば、+50時間以上を見積もったが良いと思います。

### 勉強方法
模試→復習（Pythonチュートリアル、写経）→模試→復習...
特に勘で正解した問題と間違えた問題を理解するまで繰り返します。実際に対話モードやスクリプトを実行することで、理解が深まると思います。※結構大切

- 模試：Prime Study
- 復習：Pythonチュートリアル

https://docs.python.org/ja/3/tutorial/

https://study.prime-strategy.co.jp/

<a id="#Chapter3"></a>
# 試験本番

### "Odyssey ID"、"パスワード"をメモして行きましょう！
私は試験の注意事項等を読み飛ばす癖があるので、当日OdysseyIDが必要で焦りました💦
試験前にログインする必要があるので、必ずメモしておきましょう。

### 出題された問題の難易度

**Prime Study さんの模試より簡単です**
※それなら満点取れよって話ですが…

模試と比較し、即答できる問題が多かった印象です。PrimeStudyさんの模試を復習し、9割以上理解できていればほぼ間違いなく受かるでしょう。

記憶にある問題では以下のようなのが出ました。
※for文以下を書き換える（実際は選択問題）

```
fruits = ['apple', 'orange', 'lemon']

for i, v in enumerate(fruits):
    print(i, v)

# 出力結果
# 0 apple
# 1 orange
# 2 lemon
```
　

<a id="#Chapter4"></a>
# まとめ
複雑な問題は殆ど出ないので、Pythonチュートリアルをある程度読める実力があれば、簡単に合格圏内のレベルに到達すると思います。
Pythonを体系的に勉強する機会でした。
juliaで構造体を作るときのインスタンスを制限する方法

# 構造体のフィールドに制限を加えることで、作られるインスタンスを制限する方法について

juliaで構造体を作る時は一番シンプルな場合

```Julia
struct Hoge
       x
       y
       z
       w
end
```

```Julia
h = Hoge(1, 2, 3, 4)
# Hoge(1, 2, 3, 4)
```
各要素にアクセスするときは、

```Julia
h.x
```
のようにすると、構造体のフィールドで定義されたxという値をとってくることができる。

**ここで、フィールドの中で定義されたx,y,z,wがxという１つの変数に依存している状況を考えたい**。この場合、juliaでどう書けば良いかというと、

```Julia
struct HogeHoge
       x
       y
       z
       w
       function HogeHoge(x)
           new(x, x + 1, x + 2, x + 3)
       end
end
```

```Julia
g = HogeHoge(1)
# HogeHoge(1, 2, 3, 4)
```
このnewは内部コンストラクタを定義するときに出てきます。
（詳しくは、https://mnru.github.io/julia-doc-ja-v1.0/manual/constructors.html）

~~あるいは、以下のように書いても同じになります。~~
正確には同じにはなりません（下記の頂いたコメントを参照）。

```Julia
struct HogeHoge2
       x
       y
       z
       w
end

function HogeHoge2(x)
    HogeHoge2(x, x+1, x+2, x+3)
end
```

以上です。
私にとって有効だった学び方5選

# はじめに
私にとって有効だった学び方を5つ紹介します。

1. 手を動かす
1. 比較する
1. 読書・セミナー受講
1. 論文・記事を書く
1. コメントをする

学ぶ対象は、技法・手法・方法・アプローチ・メソッド・道具・ツールなどと呼ばれるようなものです。

# 学び方の説明

## 1. 手を動かす
小池利和さんからは、何かを学ぶときに、「手を動かしなさい」と教えていただきました。
書籍「ソフトウェアメトリクス統計分析入門」に以下の言葉があります。

https://bookmeter.com/books/9875293

> 学び方としては、実践→理論→考察→実践→・・・というスパイラルで徐々に深めていくのが得策です．


私にとっては、理論を体系立てて知るより前に、とりあえずやってみるということが、物事を学ぶ上でとても有効でした。
人は、自分の経験を結び付けながら、理論の理解を進めるのだと思っています。経験がなければ、結び付けるものがありません。

先日、fromdusktildawnさんの以下のツイートに多くの反響があったようです。

https://mobile.twitter.com/fromdusktildawn/status/1483422070809952259
> ①好きになる→②感覚を掴む→③本で体系的に学ぶ→④実践 の優先順位でやると、質の高いスキルを素早く学べる。

私の経験則でも、③から入らず②から入るほうが学びやすいと思います。
「手を動かす」ということは、感覚を掴むための手段なのかもしれません。


写経も「手を動かす」ことの一つの事例だと思います。

https://qiita.com/kazuo_reve/items/86943d2570c7b90de404

## 2. 比較する
清水吉男さんからは、何かを学ぶときに、「比較をしなさい」と教えていただきました。

二つのものの違いから、それぞれの特徴が理解できてきます。

## 3. 読書・セミナー受講
読書やセミナー受講は、皆さんやっていると思います。
私の経験則では以下の3つが読書・セミナー受講をするときの注意点かと思います。

* 興味のあるものを選ぶ  
興味がなければ、全然頭に入ってきません。とりあえず興味のあるものだけ学べばよいと思います。
* できれば自分のお金を払う  
お金を払うともったいないから払った分だけ取り返してやろうという気になって学べます。先輩から薦められて、ただで貸してもらった書籍は、ほとんど読んだことがありません。（もうしわけございません）
* 得た知識はプロジェクトで実験的に使ってみる  
知識は使うことで理解が深まります。「”実験的に”○○やらせてください」という言い方ですと、導入（説得）のハードルは結構低くなります。

ちなみに、メンローという企業は、「恐怖と戦い、実験する」というキーワードで、多くの実験をしているらしくかなり興味深いです。
https://logmi.jp/tech/articles/320855
https://logmi.jp/tech/articles/320858
https://logmi.jp/tech/articles/320864
https://speakerdeck.com/kawaguti/richard-sheridan-build-a-workplace-people-love-just-add-joy

## 4. 論文・記事を書く
アウトプットすることは、自分の知識・知見の整理をすることになりかなりお勧めです。
特に、論文・記事を書くときに、根拠となる情報を集めるために、参考文献を調査することになります。この行為が、新たな知識を得るために本当に有効です。
自分と同じ課題を解消いている事例は、是非調べてみるとよいと思います。

私は、論文・記事執筆時に限らず、同じような問題を解決した人が世の中にいるはずと考え、調べる癖がつきました。

## 5. コメントする
レビューや査読等でコメントをするには、理由を述べる必要がでてきます。
理由を述べるために、根拠を調べる・整理するという行為が自然と発生します。
根拠を調べる・整理することで、新たな知識・知見が得られることが多いです。

# 事例
紹介した学び方は、Qiitaに記事を書くというゴールを設定して、進るとよいかもしれません。
事例となる記事や関連する記事を示します。

## 1. 手を動かす
https://qiita.com/kazuo_reve/items/eb6cb30f96836ded95c7

## 2. 比較する
https://qiita.com/kazuo_reve/items/152cd432beeb0e753d37

## 3. 読書・セミナー受講
https://qiita.com/kazuo_reve/items/8664746290f092264d35

## 4. 論文・記事を書く
https://qiita.com/kazuo_reve/items/6b7205ffb4ce6ad230ba

## 5. コメントをする
Qiitaの記事としては事例なし

# おまけ：教育を設計するときの仮説

教育を設計するときには、以下の感覚を順に共有していくと良い気がします。実際の教育の場で確認してみたいと思います。

1. 共感  
「こんな困りごとありますよね。こんなことできるといいですよね。」を共感する。
1. 実感  
手を動かして、「こんなことできるんだ。こんなやり方あるんだ。」を実感する。
1. 納得感  
理論を知り、「なるほど、そういうことか。」を納得する。

以下の書籍も参考になるかもしれません。

https://bookmeter.com/books/52514

https://bookmeter.com/books/571278
【Rails】サイドバーメニューをアクティブにする

##完成イメージ図
サイドバーにカーソルを合わせると、バーが広がるよう``boostrap``を用いて実装する。
このデザインは[ここ](https://adminlte.io/themes/v3/starter.html)を参考に作成した者なので、細かいのはここで参照。
[![Image from Gyazo](https://i.gyazo.com/0e09dcf7f8defba8b151930c9faf4ba5.gif)](https://gyazo.com/0e09dcf7f8defba8b151930c9faf4ba5)

##実装
アプリケーションヘルパーにて、現在のコントローラーが例えば``admin/boards path``と一致しているときは、``active``を返すよう定義する。
定義すると``class: "nav-link active"``となるので、アクティブになる。

```application_helper.rb
def active_if(path)
  path == controller_path ? 'active' : ''
　　　　　       #条件式　？　条件が正しいときの値　：　条件が間違っているときの値
end
```

```sidebar.html.rb
#省略
<li>
 <%= link_to admin_boards_path, class: "nav-link #{active_if('admin/boards')}" do %>
   <i class="nav-icon far fa-file"></i>
     <p>
       <%= "掲示板"%>
     </p>
 <% end %>
</li>

<li>  
 <%= link_to admin_users_path, class: "nav-link #{active_if('admin/users')}" do %>
   <i class="nav-icon far fa-user"></i>
     <p>
        <%="ユーザー"%>
     </p>
 <% end %>
</li>
```

##参考記事
[サイドメニューのアクティブ・非アクティブ化](https://study-diary.hatenadiary.jp/entry/2020/09/05/190836)
ModuleNotFoundError: No module named '_lzma'

### 環境
- MacBook Pro (M1)
- python3.9.5 (pyenv環境)

### 問題
```
from _lzma import *
ModuleNotFoundError: No module named '_lzma'
```
なるエラーに苦しみました。

### 解決法
```
pyenv uninstall 3.9.5
brew install xz
prefix=$(brew --prefix)
export LDFLAGS="-L$prefix/opt/xz/lib $LDFLAGS"
export CPPFLAGS="-I$prefix/opt/xz/include $CPPFLAGS"
export PKG_CONFIG_PATH="$prefix/opt/xz/lib/pkgconfig:$PKG_CONFIG_PATH"
PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.9.5
```
で解決しました。ネットでよく見かけた解決策は、

- pythonをアンインストールする。
- brewでxzをインストールする。
- pythonをインストールし直す。

でしたが、 これでは僕はうまくいきませんでした。インストールし直す時のパスが重要だったみたいです。

### 参考リンク先

- https://github.com/pandas-dev/pandas/issues/27532
- https://qiita.com/siruku6/items/515f3e69b90dd78ba67d
【Access_VBA】参照設定_Excel Object LibraryをVerに合わせて自動設定する

自分用に記載したメモ

Accessにて、ファイルダイアログを使用しファイルをインポートする際
ExcelやPowerPointのライブラリを使用することが多いと思います。

上記の様な仕組みを導入したツールを作成し、現場に共有した際
ユーザーに参照設定をしてもらうのは論外。
かと言って、何百台のPCひとつひとつに手動で設定するのは手間なので、
以下の様な、仕組みを入れておくと楽。

`1.Excelのライブラリ設定を外す`
※すでに設定されているライブラリを追加するとエラーになるので。

    For Each Ref In Refrences

    If Ref.Name = "Excel" Then
        Application.References.Remove Ref
    End If

    Next Ref

`2.ExcelのVerに合わせて、ライブラリを設定`

    Dim Ref As Reference
    Const strExcel As String = "{00020813-0000-0000-C000-000000000046}"

    Select Case CLng(Application.Version)
        Case 16: Set Ref = References.AddFromGuid(strExcel, 1, 9)   'Office2016
        Case 15: Set Ref = References.AddFromGuid(strExcel, 1, 8)   'Office2013
        Case 14: Set Ref = References.AddFromGuid(strExcel, 1, 7)   'Office2010
        Case 12: Set Ref = References.AddFromGuid(strExcel, 1, 6)   'Office2007
    End Select

    Set Ref = Nothing

以上のコードを、作成したツールに則したイベントに挿入。

※以下、例。
　フォームが開いた時 → 参照設定追加
　フォームを閉じた時 → 参照設定外す
サクラエディタ 小技 (コマンド) 集

#はじめに
テキストエディタ でおなじみの サクラエディタ を使った小技 (コマンド) 集です
個人的によく使うコマンドを載せておきます

####本投稿は、下記の環境を想定しています
```
- windows 10
- windows 11
- サクラエディタ Ver. 2.2.0.1
```


#もくじ
- 並べ替え
- マージ
- 矩形選択


#並べ替え
選択範囲のデータを 昇順 に並び替えてくれる機能
【用途】
ログデータなど、ある程度のルールで並んでいる情報に対して整列させたい時に使ってます
エクセルのフィルタ機能で並び替えも可能ですが、こっちの方が立上りも早いです
####コマンド
```
Alt + A
```
並べ替えしたい行を範囲選択してから、コマンドを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/1b04de88-2834-ad18-82c7-45ec71ab516c.png)
↓　↓　↓　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/7318b4e5-39b4-6068-13d6-2f22a1c869cd.png)
####※注意事項
適応したい行が改行されてないと効かないので、データのある最終行も改行が必要です
先ほどのデータの場合、下記のようになってしまいます…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/f662f4a6-9310-ef23-03c0-97c34ba99902.png)


#マージ
選択範囲のデータで全く同じ行を マージ (ひとまとめ) してくれる機能
【用途】
同じ内容のデータがあるかチェックするシーンは度々あると思います
そんなときはこの機能を使って、ある or なし の判定に使ってます
####コマンド
```
Alt + M
```
マージしたい行を範囲選択してから、コマンドを実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/06e93adc-6cfc-a078-619f-8cf73eea57ad.png)
↓　↓　↓　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/fe8f43c2-8024-de3b-ed0b-914be1de09d8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/3a34f9d5-ff21-bc8a-50f9-ff03f4322312.png)


####※注意事項
データが必ず<font color="Red">上下</font>にないとマージされません
先ほどの 並べ替え と非常に相性がいいので、揃ってない場合は、並べ替えてから実行してください

また、適応したい行が改行されてないと効かないので、データのある最終行も改行が必要です
先ほどのデータの場合、下記のようになってしまいます…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/24de20eb-be86-91f4-33b2-397c244fcb0d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/69b111dc-75bc-e167-427b-bb183ce25a8a.png)



#矩形選択
範囲選択を 行 ではなく 四角形の範囲 で選択でき、データ入力や削除が出来ます
文章に起こすと分かりずらいので、下記の画像で把握していただければと思います…
【用途】
先頭行を消したい時なんかに使います
正規表現で消すことも可能ですが、置換ダイアログ出して入力してってメンドクサイので…
また、同じ内容を一括で入力したい時に使います
こちらはモデルクラスを手作りする時によく使います

####コマンド
```
Alt + マウスで選択 or カーソル移動
```
通常の範囲選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/e6078a8b-2a33-4531-23ba-599937620bc6.png)
矩形選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/d2613e92-a9fb-480d-573d-910b060b6382.png)

範囲選択して…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/ec324d46-ca64-079f-66c8-a54b0c907f87.png)
↓　↓　↓　↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/3138d82c-403a-64e6-a038-acab5e5bfb09.png)
先頭の空白を一発削除！

同じ内容を先頭に記述したい場合も
範囲選択して…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/ec324d46-ca64-079f-66c8-a54b0c907f87.png)
↓　↓　↓　↓
"self." + delete を実行
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/323113/52bd2dd6-c909-7264-61be-ad53f17097f2.png)
まとめて記述できる！

####※注意事項
データが綺麗に揃ってるなど前提条件がありますので、万能ってわけではありません…
あくまで使える時にって感じで、正規表現に勝るものなしです

#おわりに
開発や調査で使うと速度向上に繋がる便利なコマンドとなりますので、是非活用してください
他にも発見したら追記していきます
インスタンス変数の隠蔽

##インスタンス変数の隠蔽

- インスタンス変数はアクセサメソッドで包み、直接参照しないようにする方がよい。

```ruby
# bad
class Gear
  def initialize(chainring, cog)
    @chainring = chainring
    @cog = cog
  end

  def ratio
    @chainring / @cog.to_f  # ← bad！
  end
end

# good
class Gear
  attr_reader :chainring, :cog

  def initialize(chainring, cog)
    @chainring = chainring
    @cog = cog
  end

  def ratio
    chainring / cog.to_f
  end
end
```

アクセサメソッド```attr_reader```を使うと、Rubyが下記のようなラッパーメソッドを定義してくれる。

```ruby
def cog
  @cog
end
```

###隠蔽するメリット
インスタンス変数```@chainring```が何十箇所で使われていた場合、それらすべてを変更しなくてはならない。
しかし、```attr_reader```で定義していた場合、変更箇所は１つで済む。


##参考

オブジェクト指向設計実践ガイド

https://yossy-io.netlify.app/hiding_variables/
[py2rb] 辞書クラスの拡張

# はじめに
移植やってます。
( from python 3.7 to ruby 2.7 )
# 辞書クラスの拡張 (Python)
```python
    def __setitem__(self, key, value):
        if isinstance(value, float):
            value = int(round(value))
        elif not isinstance(value, int):
            raise PyteomicsError('Only integers allowed as values in '
                                 'Composition, got {}.'.format(type(value).__name__))
        if value:  # reject 0's
            super(BasicComposition, self).__setitem__(key, value)
        elif key in self:
            del self[key]
```
辞書クラスを継承したコンポクラスを設定します。
ここでは、値を`float`もしくは`int`で受け取るのですが、`round`し整数で保管します。
また、値が`0`の場合、そのキーを削除しています。

`Python`の場合、特殊メソッド(`__getitem__`, `__setitem__`, `__delitem__`等)を使用してコンテナー型(list/tuple/dict)を拡張することができます。

https://www.shoeisha.co.jp/book/detail/9784798163642

独習Python 515p
# 失敗 (Ruby)
```ruby
  def __setitem__(key, value)
    if value.instance_of?(Float)
      value = value.round
    elsif value.instance_of?(Integer).!
      raise PyteomicsError.new("Only integers allowed as values in Composition, got #{value.class}.")
    end
    if value != 0 # reject 0's
      self[key] = value       # 失敗
    elsif self.include?(key)
      self.delete(key)
    end
  end

  def []=(...)
    __setitem__(...)
  end
```
これですと、`[]=`が無限ループとなってしまいます。
# 成功 (Ruby)
```ruby
  def __setitem__(key, value)
    if value.instance_of?(Float)
      value = value.round
    elsif value.instance_of?(Integer).!
      raise PyteomicsError.new("Only integers allowed as values in Composition, got #{value.class}.")
    end
    if value != 0 # reject 0's
      self.merge!({key => value})  # 成功
    elsif self.include?(key)
      self.delete(key)
    end
  end

  def []=(...)
    __setitem__(...)
  end

```
`[]=`を使用せずに、値を変更できればいいわけです。
もっといい書き方があるかもしれませんが。
# メモ
+ Python の 辞書クラスの拡張 を学習した
+ 百里を行く者は九十里を半ばとす
Raspberrypiとpcをスマホのインターネット共有で同一ネットワークに接続させた時にpcからRaspberrypiのipアドレスを知る方法

個人的備忘録です
windowsのコマンドプロンプトで下記のコマンドを入力します

`for /L %i in (1,1,254) do ping -w 500 -n 1 172.20.10.%i > nul && arp -a 172.20.10.%i`

B8:...... ってアドレスがラズパイmacアドレスでそこの`172.20.10.xxx`にTera term等でアクセス
[SQLite]外部キー制約を有効にする方法

SQLiteで、テーブル作成時に外部キー制約を付けても制約を無視してデータが追加されていた。この解決策をメモしておく。

# 外部キー制約とは
**外部キー制約**（FOREIGN KEY制約）は、参照制約ともいい、テーブル間でのデータの整合性を保つための制約。
対象の列に格納することができる値を他のテーブルの特定列のみに限定できる制約。テーブル作成時に以下のように指定できる。

# 問題

テーブル作成時に外部キー制約を付けても制約を無視してデータが追加された。

# 解決策
SQLiteでは、互換性の観点から**外部キー制約はデフォルトで無効**になっているらしい。
そのため、データベースに接続する度に外部キー制約を有効にする必要がある。
次のコマンドで確認してみると外部キー制約が無効になっていた。

```
sqlite> PRAGMA foreign_keys;
0
```

コマンドラインからデータベースを操作する場合に外部キー制約を有効にするには以下で有効化する。

```
# 有効化
sqlite> PRAGMA foreign_keys= true;
#確認
sqlite> PRAGMA foreign_keys;       
1
```
ここで、```true```の部分は```ON```や```1```でも有効化することができる。
Pythonから操作する場合は、データベース接続後に外部キー制約を有効化する必要がある。

```python:Python
with sqlite3.connect(database_name) as connection:
    cursor = connection.cursor()
    # 外部キーを有効化
    cursor.execute("PRAGMA foreign_keys = true")

    <処理内容>
```
以上のように外部キー制約を有効化することで、制約に違反した際にはエラーが表示されるようになり、データが追加されなくなった。

```python:エラー表示
sqlite3.IntegrityError: FOREIGN KEY constraint failed
```
【RSpec】ActiveSupport::Durationで返るメソッドテスト

##ActiveSupport::Duration
ActiveSupportの拡張機能の1つ。

https://railsguides.jp/active_support_core_extensions.html

##Durationで返ってくるメソッドのテスト

RSpecでDurationで返ってくるメソッドのテストをするとき期待値をどう書こうか少し迷った。
```ActiveSupport::Duration``` は```to_i```で秒数に変換できるので、変換前のDurationと変換後の秒数を比較してテストした。

```ruby
describe '#calculate_writing_time' do
  it '著者の執筆時間を返すこと' do
    expect(Author.calculate_writing_time.to_i).to eq 10000
  end
end
```


##参考

https://techracho.bpsinc.jp/hachi8833/2017_02_07/34824

https://qiita.com/labocho/items/39f7ddc3a37eed06aa39
[Swift] [Xcode] Outlet Collectionを使ってみた

#Outlet Collection とは
画面上に似たような部品があった時に変数をまとめることができるもの

例えば以下のようなLabelを

```swift
class ViewController: UIViewController {
    @IBOutlet weak var numberLabel1: UILabel!
    @IBOutlet weak var numberLabel2: UILabel!
    @IBOutlet weak var numberLabel3: UILabel!
    @IBOutlet weak var numberLabel4: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
}
```

こんな感じに書ける

```swift
class ViewController: UIViewController {
    @IBOutlet var numberLabel: [UILabel]!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
    }
}
```

###完成品
![完成イメージ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1908752/3b86aea2-91b3-5210-f751-6f3ead45294d.png)

##実装

Ctrlキーを押しながら一つ目のLabelをソースコードまで持ってきてConnectionをOutLet Collectionに設定してConnectを押す
![スクリーンショット 2022-01-24 16.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1908752/033a75f0-8a8f-2f3e-b2ff-f56f917c70e0.png)

StoryBoardの左側にある黄色ボタン?を押すと右側にOutlet Collectionsという画面が出てくる。
![スクリーンショット 2022-01-24 16.05.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1908752/512f45cf-176b-229e-9afd-8b3687b8d750.png)

右側のボタンをStoryboard上の画面のLabelにドラッグするとLabelが追加される
![スクリーンショット 2022-01-24 16.06.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1908752/607bee82-a2d6-1459-af61-9006b4fabfcc.png)

ソースコード内に下記を追記して終了

```swift
class ViewController: UIViewController {
    
    @IBOutlet var numberLabel: [UILabel]!
    override func viewDidLoad() {
        super.viewDidLoad()
        for i in 0..<4 {
            numberLabel[i].text = "\(i)"
        }
    }
}
```
Webの勉強はじめてみた その25 〜Heroku編〜

N予備校「プログラミング入門Webアプリ」を受講しています。
今回は第3章17節です。

<h2>Herokuとは</h2>
:::note
Heroku(ヘロク)とは、Web サービスを動かすことのできるプラットフォームを提供しているサービスのこと
:::

Heroku CLI をインストールすると、`heroku`コマンドが使える。

<h2>サーバーの作成</h2>
<h3>下準備</h3>
Heroku へのログイン
`heroku login`
Dockerを利用するために Heroku Container Registory へログインする
`heroku container:login` 

Dockerfileに以下を追記。
今回は以前作ったhubotを登録してみる。

```Dockerfile
COPY . /home/praise-bot
CMD ["sh", "run.sh"]
```

`docker-compose`をしてマウントされていた処理を、herokuでは`Dockerfile`自体に記述。

`run.sh`に起動時の処理を書く。

```shell
yarn install
env HUBOT_SLACK_TOKEN=xoxb-xxxxxxxxx HUBOT_SLACK_RTM_CLIENT_OPTS='{"dataStore":"false","useRtmConnect":"true"}' bin/hubot --adpater slack
```

`heroku config:add` で環境変数の設定しても動いた。
どっちのがいいのかな。

<h3>サーバー作成</h3>
`heroku create`

:::note
ランダムな名前のサーバー名で Heroku にサーバーを用意し、そのサーバーの Git のリポジトリを heroku という名前のリモートリポジトリとして登録する
:::

`heroku destroy --app サーバー名 --confirm サーバー名` で Heroku サーバーを削除できる

<h3>デプロイ</h3>
:::note
アプリケーションをサーバー上に配置し、動くようにすること
:::

`push`して`release`する。

`heroku container:push web`
`heroku container:release web`

ブラウザで開く場合
`heroku open`

<h2>まとめ</h2>
一定時間でスリープしてしまうので、それがちょっと不満。

https://masarufuruya.hatenadiary.jp/entry/2017/10/20/234918

この辺をやるとうまくいきそうだけど。
AWS Private Subnetに配置したALB+gRPCサーバーに接続する際の簡単TLS/SSL設定方法



ALBの後ろにgRPCサーバーを置く場合、`ALB <=> gRPC server`間はInsecureな通信が可能ですが `Client <=> ALB`間はHTTP2のため、TLSが必須になります。そのため、証明書を発行しALBに設定する必要があります。
外部に公開しないサーバーであったとしてもALBでのSSL証明書の設定が必須なので、今回は簡単な設定方法の紹介です。

### 今回紹介の方法

* "grpc.ssl_target_name_override"オプションによる設定

### 他の方法

* AWS CertificateManager - [プライベート認証機関](https://aws.amazon.com/jp/certificate-manager/private-certificate-authority/
)の利用
* オレオレ証明書の利用

## "grpc.ssl_target_name_override"オプションによる設定

前提: `すでに、何らかの有効なSSL証明書を取得している`
取得がない場合は、他の方法を取ったほうが楽かもしれません。

#### 前準備

ALBに、有効なSSL証明書の登録をしておいてください。証明書さえ設定しておけば、DNSの設定は不要です。もちろんワイルドカード証明書も利用可能です。
![スクリーンショット 2022-01-24 16.12.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12647/d704417c-1f5a-cb3e-a5de-12708013ac28.png)

#### Client Code

```typescript
import * as grpc from "grpc"

const host = "my.inside.address:50051" // 本来の接続アドレス
const sslCn = "my.domain.org" // ALBに設定したSSL証明書のCN
const cred = grpc.credentials.createSsl()

console.log("Connect to host:", host)
const client = new MyGrpcClient(host, cred, {
  "grpc.ssl_target_name_override": sslCn
})
```

設定はいたって簡単で、credentialにはcreateSsl()で作成、オプションとして `grpc.ssl_target_name_override` にSSLのCNを渡すだけになります。
実装はTypeScriptになっていますが、オプションはほぼすべての言語で使用可能だと思うので、各言語のリファレンスを参照してください。

なお、Server自体では追加設定は不要です。ALBとClientのみ設定すれば良いです。

## 他の方法

今回は方法は割愛します。それぞれを利用した際のデメリットを載せておきます。

### プライベート認証機関

こちらを利用することで簡単に内部ネットワーク向け証明書を発行可能だが、最低 400$/月かかるため、経済的に優しくない。
### おれおれ証明書

作るのが手間+有効期限があるので、切れたときの更新がだるい
EVE-NGでWindows Client Sideを使わずにnative-consoleを変更する

EVE-NG単体でnative-consoleを指定すると、
使用したいリモートログオンクライアント(putty,teraterm etc...)が使えなかった。

Windows Client Sideをインストールすれば、
自動で設定を行ってくれるので便利。

Windows Client Sideをインストールせずに、
好きなクライアントに変更していく

環境
---------------------------------------
OS: Windows10
EVE-NG: 2.0.3-112

手順 
---------------------------------------
・レジストリエディタの値を変更
[HKEY_CLASSES_ROOT\telnet\shell\open\command\@]
C:\Program Files (x86)\teraterm\ttermpro.exe %1 /T=1
 
%1で「1つ目のコマンドライン引数」
/T=1で「Telnetプロトコルを使用」

参考
---------------------------------------
https://garafu.blogspot.com/2014/02/url.html?m=1

https://ttssh2.osdn.jp/manual/4/ja/commandline/teraterm.html
Qt Creator C++ mouse event

# mouse move event

qt creatorプロジェクトでmouseイベントを使ってみました

プロジェクトを作成し,生成されたwidgetを以下のように変更します.

```cpp:mainwindow.cpp

#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QMouseEvent> // add
#include <QtCore/QDebug> // add

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// add
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{

        qDebug() << "test";

}

```

```cpp:mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void mouseMoveEvent(QMouseEvent *event); // add

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

```

結果:表示されたwidgetでクリックボタンを押しながらマウスを移動すると"test"とコンソールに表示されました

# mouse click event
## 1

以下のようにするとクリックボタンを押したタイミングで"press"とコンソールに表示されます

```cpp:mainwindow.cpp
#include "mainwindow.h"
#include "./ui_mainwindow.h"
#include <QMouseEvent> // add
#include <QtCore/QDebug> // add

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

// add
void MainWindow::mousePressEvent(QMouseEvent *event)
{
        qDebug() << "press";
}
```

```cpp:mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    void mousePressEvent(QMouseEvent *event); // add

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
```

## 2.clickした時のカーソル位置取得

mousePressEvent関数を以下の様に変更するとクリック時のカーソル位置を取得できます.

```
void MainWindow::mousePressEvent(QMouseEvent *event)
{
        // get mouse pos:
        // 参考: https://www.qtcentre.org/threads/3073-How-to-get-mouse-s-position
        QPoint p = this->mapFromGlobal(QCursor::pos());
        qDebug() << "press:" << p;

}
```

![Screenshot from 2022-01-24 15-58-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/9bdc6552-4c81-56a9-4a91-d98f0b72a27c.png)

## 3.uiに配置したlabel座標系でのマウスポジション取得

ui上にlabelを配置し以下のようにマウスコールバック関数を変更するとui上配置したlabel座標系でのマウス位置を取得できます

```
void MainWindow::mousePressEvent(QMouseEvent *event)
{
        // get mouse pos:
        // 参考: https://www.qtcentre.org/threads/3073-How-to-get-mouse-s-position
        QPoint p = ui->label->mapFromGlobal(QCursor::pos());
        qDebug() << "press:" << p;

}
```
pyenv-win環境でpipでインストールしたコマンドラインツールが使えない！時

pyenv-winでpath通してpip使えてるのに、pipでインストールしたパッケージ(jupyter等)が使えないときは、`shims`フォルダ除いてみてほしい。

```:このパスは通ってる（これじゃ足りない)
%USERPROFILE%\.pyenv\pyenv-win\bin
%USERPROFILE%\.pyenv\pyenv-win\shims
```

ちなみにpipはここに入ってるからコマンドつかえる。pipでインストールされたパッケージは、ここじゃなくて、

```:ここにインストールされる（このパスを追加すればいい）
%USERPROFILE%\.pyenv\pyenv-win\versions\3.x.x\Scripts
# versionは適当なバージョンを指定する
```
PL-400 Power Platform Developer Associate 受験＆合格体験記

#はじめに
[Microsoft Ignite Cloud Skills Challenge – November 2021](https://www.microsoft.com/ja-jp/events/azurebase/blog/microsoft-ignite-cloud-skills-challenge-november-2021/)で取得した無料割引を使い、PL-400を受験しました。これからこの試験を受ける方に少しでも参考にしていただければと思い書いてみました。

#自己紹介
とある会社の間接部門に非IT職として従事中。過去にSEとして開発経験はあるものの、主にJavaを使ったバックエンドのロジック開発やC#でのWindows Formsアプリの開発、あとはExcel VBAを触る位でJavaScript等のWeb系知識・経験は殆ど無し。また、クラウドやPower Platformについても実務経験は全く無し。2021年春からAzureやPower Platformの勉強を開始。

保有しているMicrosoftの資格はPL-900, AZ-900, MB-901, AI-900, DP-900, DA-100, PL-100。

#評価されるスキル(2022/1/24時点)のGoole翻訳結果
* 技術設計を作成する（10〜15％）
* Microsoft Dataverseの構成（15〜20％）
* Power Appsの作成と構成（15〜20％）
* ビジネスプロセスの自動化を構成する（5〜10％）
* ユーザーエクスペリエンスを拡張する（10〜15％）
* プラットフォームを拡張する（15〜20％）
* 統合を開発する（5-10％）

最新の情報は以下からリンクされている「試験スキルのアウトラインをダウンロード」から参照ください。

https://docs.microsoft.com/ja-jp/learn/certifications/exams/pl-400

#勉強法
mstepのPL-200/400対策の動画・資料と、PL-200向け書籍を参考に学習しました。

* [mstepオンライン](https://partner.microsoft.com/ja-jp/training/mstep-mcp)
* 書籍：Microsoft Power Platform Functional Consultant: PL-200 Exam Guide: Learn how to customize and configure Microsoft Power Platform and prepare for the PL-200 exam (English Edition)

mstepのオンライン動画は「on24」という会社のサービスで提供されているのですが、最近になって再生速度の指定出来るようになり、使い勝手がかなり向上していました。

#結果
合格点ギリギリでなんとか合格出来ました。
#感想
* Power PlatformはDynamics 365で培われた技術を基盤として構築されていることから、Dynamics 365製品についても全体概要を知っておくと理解しやすくなる。
* 試験が英語でしか提供されていないので、ある程度の英語のリーディング力が必要。自分もあまり早くは読めないので、今回は時間ギリギリ。
* Ignite Cloud Skill Challengeで無料チケットをもらう際、Microsoft Learnの実習を飛ばして流し読みで済ませてしまった部分が多かったが、やはりきちんと手を動かして確認すべきであったと反省。実際に手を動かさないとなかなか知識・技能が定着しない。

以上
Power Shellでスクリプトファイルを実行できるようにする

#はじめに
PowerShellでvueのバージョンを確認しようと思ったら、「このシステムではスクリプトの実行が無効になっているため、ファイルを読み込むことができません。」とでてきて、バージョンを確認することができなかった。

その解決方法をメモしておきます。

#動作環境
- windows 10 64bit
- node v16.13.2
- vpm v8.1.2
- @vue/cli 4.5.15

#原因
セキュリティー上の対策で用意にスクリプトファイルの実行をできないようにしいるため。ここでスクリプトを実行できるようにします。

##解決方法
```:PowerShell
Get-ExecutionPolicy
```
Restrictedと表示されるはずです。これはすべてのスクリプトの実行を禁止している状態です。

次にPowerShellのコンソールを管理者権限で起動してください。
（管理者権限で起動しないとできません）

```:PowerShell
Set-ExecutionPolicy RemoteSigned
```

下記のように表示されますので

実行ポリシーの変更
実行ポリシーは、信頼されていないスクリプトからの保護に役立ちます。実行ポリシーを変更すると、about_Execution_Policies
のヘルプ トピック (http://go.microsoft.com/fwlink/?LinkID=135170)
で説明されているセキュリティ上の危険にさらされる可能性があります。実行ポリシーを変更しますか?
[Y] はい(Y) [N] いいえ(N) [S] 中断(S) [?] ヘルプ (既定値は “Y”):

ここでYを押してEnterキーを押します。

これでスクリプトファイルへの実行ができるようになりました。

#まとめ
エラーが起きたらエラーに意味を調べて、解決方法を調べなければ解決方法が分かってもなんでエラーになってるのかどのようなエラーが起きているのかわからないのでしっかりと調べる必要があると思いました。
OpenCV C++ クロスを描画

クロスの描画

```c++:write_cross.cpp
#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, const char * argv[])
{
    //Mat img = imread( "image.jpg" );
    //単色画像の生成(参考:http://opencv.jp/cookbook/opencv_mat.html の 「cv::vecを使う」
    cv::Mat_<cv::Vec3b> img(300, 300, cv::Vec3b(0,200,0)); // 追加

    imshow("1", img );

    //参考: https://docs.opencv.org/3.4/d6/d6e/group__imgproc__draw.html
    //cv::drawMarker (Mat &img, Point position, const Scalar &color, int markerType=MARKER_CROSS, int markerSize=20, int thickness=1, int line_type=8)
    cv::drawMarker(img, cv::Point(100,100), cv::Vec3b(0,0,200), cv::MARKER_CROSS);
    imshow("2", img );
    imwrite("img.png",img);

    waitKey(0);

    return 0;
}
```

![img.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/589906/343f5d7e-9a63-fafa-c833-9e4d097c7748.png)
Julia: 診療・検査医療機関の PDF を JSON に変換

こちらで行ったのと同じことを Julia で行いました。
[Python3: 診療・検査医療機関の PDF を JSON に変換](https://qiita.com/ekzemplaro/items/ad330fe9ad4e46a827e8)

次で公表されている PDF を JSON に変換します。
[診療・検査医療機関の公表について](https://www.pref.tochigi.lg.jp/e04/sinnryoukensa2.html)

小山地区のデータを取得します。

```bash
wget https://www.pref.tochigi.lg.jp/e04/documents/20220112225313.pdf
```

変換

```bash
pdftotext -layout 20220112225313.pdf
#
./medical_to_json.jl 20220112225313.txt oyama_medical.json > tmp01
#
```

```jl:medical_to_json.jl
#! /usr/bin/julia
#
#	medical_to_json.jl
#
#						Jan/24/2022
# --------------------------------------------------------------------
using JSON
# --------------------------------------------------------------------
function true_false_convert(ss_in)
	rvalue = false
#	if ss_in == '○'
	if ss_in == "○"
		rvalue = true
	end
#
	rvalue	
end
# --------------------------------------------------------------------
function convert_to_dict(ss)
	unit_aa = Dict()
	unit_aa["name"] = ss[1]
	if 1 < size(ss)[1]
		unit_aa["postal"] = ss[2]
		unit_aa["address"] = ss[3]
		unit_aa["phone"] = ss[4]
		unit_aa["consult"] = true_false_convert(ss[5])
		unit_aa["inspect"] = true_false_convert(ss[6])
		unit_aa["only"] = true_false_convert(ss[7])
	end
#
	if 7 < size(ss)[1]
		unit_aa["others"] = true_false_convert(ss[8])
	end
#
	if 8 < size(ss)[1]
		unit_aa["comment"] = ss[9]
	end
#
	unit_aa
end
# --------------------------------------------------------------------
function omit_check_proc(line)
	rvalue = true
	array_omit = ["診療・検査医療機関","実施内容","電話番号","医療機関名",
            "（代表）","のみ可","検査","ページ",":"]

	for word in array_omit
		if (occursin(word,line))
			rvalue = false
		end
	end
#
	rvalue
end
# --------------------------------------------------------------------
function line_proc(line,list_aa)
	index = firstindex(line)
	chx = line[index]
	if chx != '【' && chx != '0'
		if omit_check_proc(line)
			ss = split(line)
			println(ss[1])
			unit_aa = convert_to_dict(ss)
			push!(list_aa,unit_aa)
		end
	end
end
# --------------------------------------------------------------------
println(stderr,"*** 開始 ***")
file_in = ARGS[1]
file_json = ARGS[2]
println(stderr,file_in)
println(stderr,file_json)
#
ff = open(file_in, "r")
string = read(ff, String)
close(ff)
lines = split(string,"\n")
#
llx = length(lines)
println(stderr,llx)
#
list_aa = []
for it=1:llx
	line = lines[it]
	if 10 < length(line)
		line_proc(line,list_aa)
	end
end
#
json_str = JSON.json(list_aa)
fp_out = open(file_json,"w")
write(fp_out,json_str)
close(fp_out)
#
println(stderr,"*** 終了 ***")
# --------------------------------------------------------------------
```
SQLAlchemy を雑に使う


まともに OR マッパとして使うのではなく、ちょっとした Notebook やテストコードの中で SQLAlchemy の Engine オブジェクトをさっと使う方法を毎回忘れるのでメモ。だいたいここ https://docs.sqlalchemy.org/en/14/core/connections.html を読めば良い。


```python
from sqlalchemy import create_engine
from sqlalchemy import text
```

DB 接続と connection 作成。engine.execute() のように直接 engine にクエリを発行する方法は 1.4 廃止される(参考: https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.Engine.execute) らしいので、ちゃんと connection を作る。




```python
engine = create_engine("mysql+mysqlconnector://root@localhost/mydb")
connection = engine.connect()
```

テスト用のテーブルを作成


```python
connection.execute("CREATE TABLE family (name varchar(256), age int)")
```




    <sqlalchemy.engine.cursor.LegacyCursorResult at 0x10b7bed60>



テスト用のデータを作成。


```python
connection.execute("""
INSERT INTO family VALUES
    ('Sazae', 24),
    ('Masuo', 28),
    ('Tarao', 3)
""")
```




    <sqlalchemy.engine.cursor.LegacyCursorResult at 0x10b200f40>



SELECT を発行 text コンストラクタ (https://docs.sqlalchemy.org/en/14/core/sqlelement.html#sqlalchemy.sql.expression.text) を使えば、DB エンジン互換の方法でパラメータを指定出来る。text を使わないと DB ごとにパラメータ指定が違ってしまう。


```python
result = connection.execute(text("SELECT * FROM family WHERE age > :threashold"), threashold = 20)
```

イテレータが返るので SELECT 結果を取り出す。


```python
results = list(result)
results
```




    [('Sazae', 24), ('Masuo', 28)]



結果は Row オブジェクト (https://docs.sqlalchemy.org/en/14/core/connections.html#sqlalchemy.engine.Row) というのに格納されている。


```python
results[0]._fields
```




    ('name', 'age')




```python
results[0].age
```




    24



テスト用データを削除。connection も閉じる。with 文を使えば自動的に connection を閉じる事が出来る。


```python
connection.execute("DROP TABLE family")
connection.close()
```
AWS Light Sailについて



#目次
[1.AWS LightSailについて](#aws-lightsailについて)
[2.IAM権限を作成する](#iam権限を作成する)
[3.LightSailインスタンスを立ち上げる](#lightsailインスタンスを立ち上げる)
[4.固定IPアドレス作成](#固定ipアドレス作成)
[5.snapshotsでのバックアップ](#snapshotsでのバックアップ)

# AWS LightSailについて

比較的簡単にwordpress(wp)の　環境を作成することができ、全世界に公開できるサービスです。
AWSのよく知られているEC2インスタンスを立ち上げるよりも簡単で、楽に運用が可能になっています。
さらに、EC2は従来課金制ですが、LightSailは定額課金の違いがあります。安いプランで月¥500ぐらいで使用できます。

LightSailの特徴

https://aws.amazon.com/jp/lightsail/features/


#IAM権限を作成する
まず、AWSアカウントを作成したらやることとして、AWS Identity and Access Management (IAM)を作成します。これは、権限を制限したユーザーを作成することができ、仮にアカウント情報が漏洩した場合被害を最小限に抑えることにつながります。

IAMユーザーを作成し、ポリシーをアタッチします。(権限を付与すること)
ポリシーはjsonで、以下のような形になります。

```json
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lightsail:*"
            ],
            "Resource": "*"
        }
    ]
}
```
このポリシーを作成しIAMユーザーに付与すれば、LightSailの全てのリソースにアクセスできるようになります。
ユーザーにアタッチの他に、グループにアタッチすることも可能です。
これ以降は、Rootアカウントではなく、IAMユーザーでログインし作業するようにしましょう。

https://lightsail.aws.amazon.com/ls/docs/ja_jp/articles/amazon-lightsail-managing-access-for-an-iam-user

# LightSailインスタンスを立ち上げる
LightSailのインスタンスを立ち上げましょう。
やることはそれぞれ、インスタンスを置く地域、OSの選択、使用するサービス、使用プラン、LightSailの名前を決めます。

例)
Instance location →tokyo region1 (他にOregonやParisに作成できます。)
Pick your instance image →Linux
Select a blueprint →wordpress
Choose your instance plan →$3.5USD (最安値のプランです。)
Identify your instance →wordpress_1

こちらを決めcreate instanceをクリックすればインスタンス作成は完了です。

https://aws.amazon.com/jp/getting-started/hands-on/launch-a-virtual-machine/?sc_icampaign=acq_jp_getting-started-handson-202010-build-web-app-s3-lambda-api-gateway-dynamodb&sc_language=jp&sc_icontent=awssm-6337&sc_iplace=ribbon&trk=ha_ribbon_acq_jp_getting-started-handson-202010-launch-a-virtual-machine

#固定IPアドレス作成
作成すると、123.48.56のようなURL(IPアドレス)が作成され、wpをweb上で見ることが可能になります。
しかし、このURLは一度インスタンスを再起動するとURLが変わってしまいます。
そうならないために、URLを固定します。
LightSailのHomeから、Networkingを選択、staticIPを選択します。
staticIPに固有の名前をつけて作成を行うとすぐに固定されます。
作成することにより、アタッチもできているため、IPアドレスが固定されました。
![スクリーンショット 2022-01-12 17.42.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028928/658b31a6-5ac0-417e-c710-c3a2e6b8cc2f.png)


https://lightsail.aws.amazon.com/ls/webapp/create/static-ip?region=ap-northeast-1

#snapshotsでのバックアップ
snapshotsとはインスタンスのバックアップ機能で、wpとサーバーの両方をバックアップしてくれるものです。
lightsailのHomeからインスタンスを選択後、Snapshotsを選択。
create snapshotsをクリックすれば、手動でバックアップを作成することができます。
Automatic snapshotsのボタンをオンにすれば、自動で作成することができます。
Automatic snapshotsは最大7枚ためておくことが可能で、自動作成にしておくと1日おきに作成されます。
つまり、1週間分のバックアップの作成が可能になります。
最大7枚なので、古いものから自動削除されていきますので、ご安心を。(今日が月曜なら、先週の月曜は自動削除されるようになっています。)
![スクリーンショット 2022-01-12 17.41.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2028928/d4bdccb7-a013-8629-4092-95a840925254.png)
Rustでmutable borrow occurs hereのエラーが出るが理由が分からない

以下のようなプログラムがRustでコンパイルできず、ちょっと悩んだのでメモ。
皆さんは、以下のプログラムをぱっと見てエラーの理由が分かるでしょうか？


```rs:b.rs
struct Banana {
    vals: Vec<usize>,
}
impl Banana {
    fn cut(&mut self) {
        println!("cut");
        // 本来はここで self.vals の値を変更する
    }
}
fn test(a: &mut Banana) {
    for v in a.vals.iter() { // --- (*1)
        println!("{}", v);
        a.cut(); // --- (*2) ここでエラーが出る！！ 
    }
}
fn main() {
    let mut a = Banana{vals:vec![1,2,3]};
    test(&mut a);
}
```

コマンドライン上で `$rustc b.rs` を実行するとエラーが出て動きません。

```
error[E0502]: cannot borrow `*a` as mutable because it is also borrowed as immutable
  --> b.rs:14:9
   |
12 |     for v in a.vals.iter() {
   |              -------------
   |              |
   |              immutable borrow occurs here
   |              immutable borrow later used here
13 |         println!("{}", v);
14 |         a.cut();
   |         ^^^^^^^ mutable borrow occurs here

error: aborting due to previous error
```

## なぜ動かないのか？

エラーを日本語でよくよく確認すると「`*a`が不変としても借用されるため、不変として借用することはできません」とのこと。

(*1)で`a.vals.iter()`を実行することで、aがイミュータブル(不変)な借用として使われるのに、(*2)でcutを呼び出すことで、aを`&mut a`(可変な参照)として扱おうとしているためエラーが出るのです。

つまり、**同じスコープ内で、変数をミュータブルとイミュータブルの両方として利用するのが問題**なのです。

## 簡単な修正例1

そこで、動作がちょっと変わってしまいますが、関数cutを呼び出すタイミングを以下のようにforループ外に移動すれば動きます。

```rs:fix_b.rs
fn test(a: &mut Banana) {
    for v in a.vals.iter() {
        println!("{}", v);
        // a.cut(); ループ外に出す
    }
    a.cut();
}
```

## 簡単な修正例2

あるいは、もしも可能であるなら関数cutの引数を&mutから&に変更します。これにより、イミュータブルな借用になります。

```rs:fix_b.rs
impl Banana {
    fn cut(&self) {
        println!("cut");
    }
}
```

> また、コメント欄で @namn1125 さんがより完全な修正例を出してくださっています。ありがとうございます！


ボローチェッカーは優秀なのですが、時によく考えないと修正方法が分からないことも多いです。
for文との組み合わせにも注意しましょう。

## 参考

以下で、エラーメッセージと解決のヒントというPDFを無料で配布しています。良かったら見てください！

https://github.com/kujirahand/book-rust
dataclass-json：`infer_missing=True`を指定すれば、デフォルト値が設定されていないOptionalフィールドの値を推測できる

# 実行環境
* Python 3.9.7
* dataclasses-json 0.5.6


# はじめに
jsonやdictからPythonのデータクラスを生成するために、[dataclasses-json](https://github.com/lidatong/dataclasses-json) を使っています。


以下のように、`Animal`クラスの`detail`フィールドにデフォルト値が設定されている場合、`detail`キーが存在しないdictから`Animal`クラスのインスタンスを生成できます。


```python
@dataclass_json
@dataclass
class Animal:
    name: str
    detail: Optional[str] = None

Animal.from_dict({"name": "dog"})
# Animal(name='dog', detail=None)
```

# 問題提起
今、`Animal`クラスがあります。

```python
@dataclass_json
@dataclass
class Animal:
    name: str
    detail: Optional[str] = None
```

`Animal`クラスに`type`という必須フィールドを、後から追加する必要があることが分かりました。
`Animal("human", "foo")`のように位置引数を指定して`Animal`クラスのインスタンスを生成する場合もあるので、`Animal`クラスのフィールドの順番は変えたくありません。したがって、`Animal`クラスの最後尾に`type`フィールドを追加してみます。

なんと、最後尾に`type`フィールドを追加すると、`TypeError`が発生しました。デフォルト値を受け取る引数より後ろの引数は、必ずデフォルト値を設定する必要があるためです。

https://qiita.com/scapegoat_11_/items/fafea1a0c7daaf43849e

```python
@dataclass_json
@dataclass
class Animal:
    name: str
    detail: Optional[str] = None
    type: str

# TypeError: non-default argument 'type' follows default argument
```

`TypeError`を回避するため、`detail`フィールドのデフォルト値を除去しました。これで、`Animal`クラスは無事定義できました。

```python
@dataclass_json
@dataclass
class Animal:
    name: str
    detail: Optional[str]
    type: str
```

しかし、デフォルト値が設定されていないため、以下のように`detail`キーが存在しないdictから`Animal`クラスのインスタンスを生成できません。これでは不便です。

```python
Animal.from_dict({"name":"human", "type": "Mammal"})

# KeyError: 'detail'
```


# 解決策
`from_dict`メソッドに`infer_missing=True`を指定すれば、`detail`キーが存在しないdictから`Animal`クラスのインスタンスを生成できます。

https://github.com/lidatong/dataclasses-json#handle-missing-or-optional-field-values-when-decoding

```python
Animal.from_dict({"name":"human", "type": "Mammal"},infer_missing=True)
# Animal(name='human', detail=None, type='Mammal')
```

ただし`infer_missing=True`を指定すると、`Optional`でない型のフィールドが指定されていないときでも、`Animal`クラスのインスタンスを生成できてしまいます。

```python
Animal.from_dict({"name":"human"}, infer_missing=True)
# RuntimeWarning: Missing value of non-optional type type detected when decoding Animal and was defaulted to None by infer_missing=True. Set infer_missing=False (the default) to prevent this behavior.
# Animal(name='human', detail=None, type=None)
```

そういった理由のためか、公式サイトでは`infer_missing=True`を指定することより、デフォルト値を設定することを推奨しています。

>Personally I recommend you leverage dataclass defaults rather than using infer_missing, but if for some reason you need to decouple the behavior of JSON decoding from the field's default value, this will allow you to do so.
runserverではPOSTできるのに、本番環境でCSRF validation エラーになる（解決）

# はじめに
技術習熟度が低い状態で奇跡的に運用開始できたWebアプリを、この度全面改訂したいと考え、Djangoを1から勉強することにしました。
[Snow TreeさんのDjango講座](https://snowtree-injune.com/#toc12)がとてもわかりやすかったので、このページに沿って進めることにしました。

今回の現象は、講座内容を終えた後の作業になります。必ず起きるのか、それとも、作り方や利用ライブラリのVer.に影響される固有の問題なのか、私には理解できないままですが、誰かの役に立つかもと考え、作業内容を記すことにしました。

## 環境
- ConoHa VPS
- Ubuntu20
- nginx, gunicorn (参考サイト通りhttp接続とした。socketでは無い)
- Django4.0.1, python
- VScodeでSSH接続して開発

## 現象
nginx、gunicorn、SSL認証の設定作業が済み、独自ドメイン(https://...)でDjangoのHello World アプリにアクセスできるようなったが、admin画面でloginしようとしたらCSRF validation エラー。
試しに nginx と gunicorn を止めて、DEBUG＝True に戻して runserver を実行したところ正常にadmin画面でloginできた。
admin画面特有の問題かもと考えアプリ制作を進めたが、formでユーザーからのデータ送信を求めるところで、同じ現象が起きたので、本腰を入れて解決策を探ることに。。

## 解決策
ネットの海を彷徨った末に、[公式のフォーラム](https://forum.djangoproject.com/t/csrf-validation-failure-due-to-https/3023)にたどり着きました。。この投稿に従い、以下の2点を実施しました。

- nginxの設定を記す sites-available/my_app に以下の2行を追記。(my_appはご自分の環境に合わせて読み替えてください)

```python 
proxy_set_header X-Forwarded-Port $server_port;
proxy_set_header X-Forwarded-Host $host;
```

- setting.pyに以下の3行を追記

```python
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
USE_X_FORWARDED_HOST = True
USE_X_FORWARDED_PORT = True
```

これでPOSTできるようになりました。バンザイ！
（[公式リファレンス](https://docs.djangoproject.com/en/4.0/topics/security/)を読み解けば正確な情報が得られるかも。今の私には無理。）
Web3.0: デジタルデータの価値と所有権

#NFTに関する個人的まとめ
##前提知識
NFTで知っていたのはTwitterの最初の呟きなどが高値で売買された程度です。
##学んだこと
Web2.0までの世界において、インターネットに存在するデジタルファイルはコピーと配布が簡単に出来た為、ファイルの真偽や所有者の判別が困難だったが、NFTは改ざんが困難で分散化されたブロックチェーン上にユニークな hash 、token name、symbol などの文字列を格納することで、デジタルデータの唯一性と真偽性を証明することが可能になった。
##個人的に可能性があると感じたNFTのユースケース
####１.有名ではあるがゲーム内におけるアイテムなどの売買。
よく例としてあげられるマインクラフト。このゲーム内で凄い建造物などを作っている人がいますよね。Web2.0の頃だとYoutubeなどで見て「わぁ、凄い」で終わっていたものが、NFTによってデジタルデータの唯一性と真偽性を証明することが可能になった為、売買できるようになったこと。
####2.ファントークン
Web2.0ではクラウドファンディング、Youtube等各配信サイトでの投げ銭などがあります。
クリエイターを支援したときにトークンが取得できるようになると、一番影響が出てくるのは、トークンでその人がいつから支援していたかなどを証明できるようになった為、<font color="Red">ファン内における新参、古参争い</font> に終止符を打てるかと思います。
ファン内で自分が古参であると証明して優越感に浸りたい人もいるかと思いますのでかなり需要があるのではないかと思います。
##NFT以外
####暗号資産(仮想通貨)とビットコイン
　ブロックチェーンはその特性である分散性や非改ざん性などから、様々な業界で活用が検討されているが、その知名度を向上させたのは、暗号資産(Crypt Currency)ビットコインである。

　ビットコインとは、ブロックチェーン技術を利用した「電子的にお金(価値)を送るシステム」で、「個人間の支払いを、第三者に依拠せず暗号的な証明によって可能にする技術」としてサトシ・ナカモトが2008年にアイデアを示した。

ビットコイン以外にも、B2Bの取引に特化した暗号資産(リップル)や、ステーブルコインと呼ばれる取引価格が安定することを意図して設計された暗号資産なども誕生している(暗号資産の変動幅を抑えるために法定通貨と1:1で取引出来ることを保証する)。

これまでは、通貨の発行主体は国家に限られ、世界の基軸通貨の発行権を有するものが世界経済を制していたが、暗号資産やステーブルコインの誕生によって、企業が法定通貨を上回るデジタル通貨を発行できる可能性が生まれてしまったのだ。

ビットコインがブロックチェーン技術を活用した暗号資産であるのに対して、イーサリアムは Vitalik Buterin 氏らによって開発された、分散型アプリケーションを設計・実行することが可能な共通プラットフォームである。そのプラットフォーム内で通貨として利用されるのがイーサ(ETH)だ。

　ビットコインはブロックチェーンに取引を記録する分散型台帳だが、イーサリアムではプログラムされた契約の内容もブロック内に書き込まれる。この契約をスマートコントラクトと呼び、定められた契約とルールを自動で実行するプログラムが定められる (Aの条件を満たした時は、Bをする、Cを支払う。約束を守らなかった時は、Dが実行されるなど)。
##Polkadot
リレーチェーンとパラチェーンがある。基盤にあるリレーチェーンによってセキュリティが確保されている。パラチェーンごとに独自の規則などが存在する。（スマートコンストラクト、NFTなど）
この別々の規則を持ったパラチェーンを繋ぎ合わせているのがリレーチェーンである（相互運用性）。
##最後に
NFTはWeb3.0のほんの一部にすぎないので他のことについても学んで随時更新していきます。