OmniAICreator/Qiita-1.07M huggingface dataset:
EMLからMSG変換 - 複数のEMLファイルをBのMSGにエクスポートする

<p><b>概要：</b>この記事では、誰でも使用できるEMLからMSG変換ファイルの簡単な方法について学習します。</p>
<p>Microsoft Outlookは、電子メールクライアントの世界で非常に広く使用されているため、大多数のビジネスプロフェッショナルにとってデフォルトの選択肢です。 Microsoft Outlookは主にPSTファイル形式に関係していますが、MSGファイルへの電子メールの保存もサポートしています。ファイル形式に関しては、MSGとEMLはどちらも、添付ファイル、送信者と受信者の情報、およびその他の情報を含むファイルごとに1つの電子メールメッセージを保存するという点で非常に似ています。</p>
<p>ただし、ある形式から別の形式への変換は必ずしも簡単ではありません。そして、それが、EMLからMSGへの単一の変換シナリオに集中できるようにこの記事を書いた理由です。
他の場合にEMLからMSG変換形式を実行する方法については、この件に関するブログ投稿を参照してください。</p>
<h2>2つの簡単な方法を使用して、EMLからMSG変換を実行できます。</h2>
<p>EMLをMSGファイル形式に保存するには、2つの方法のいずれかを使用します。これらの手順は簡単で、実装も簡単です。</p>
<h2>Microsoft OutlookからEMLファイルをエクスポートします（方法1）。</h2>
<p>EMLファイルの場所に移動した後、ドロップダウンメニューから[プログラムから開く]を選択します。</p>
<p>Outlookを選択し、リボンバーに移動します>> [移動]オプションをクリックし、[その他のフォルダー]を選択します>>移動先のフォルダーを選択します>> [OK]を押した場合は、</p>
<p>次に、メールアドレスを選択します>>ドロップダウンメニューから[ファイル]を選択します>> [名前を付けて保存]を選択します。</p>
<p>その結果、電子メールを.msg形式で保存できます。</p>
<p>このアプローチにより、問題や不具合が発生することなく、EMLファイルをMSGファイルに変換できます。ただし、一度に1つずつ実行しない限り、多数のEMLファイルをMSGファイル形式に変換することはできません。このアプローチは、転送するEMLファイルが約20個ある場合に使用できます。しばらく時間がかかりますが、必要に応じて、EMLファイルをMSGファイルに無料で変換できます。</p>
<h2><b>方法2：</b><a href="https://www.mailsware.com/jp/msg-converter.html">MSGコンバータソフトウェア</a>を使用してEMLをMSG形式に安全にエクスポートする</h2>
<p>これは、EMLからMSG変換を実行するための最も素晴らしいソフトウェアです。このソフトウェアを使用すると、面倒なことなく、無制限のEMLファイルをMSG形式に簡単に変換できます。このユーティリティは、EMLメッセージから添付ファイルを含むMSGメッセージへの変換を効果的にサポートします。さらに、このソフトウェアのユーザーインターフェイスは本当に簡単です。このプログラムは使い方が簡単で、問題はありません。</p>
<h3>EMLからMSG変換の驚くべき機能</h3>
<p>同時に多くのEMLファイルを変換することが可能です。</p>
<p>日付フィルターを構成し、EMLファイルを日付別に整理します。</p>
<p>Outlookプログラムを使用せずにEMLファイルを変換することが可能です。</p>
<p>間違いなく、エクスポートが完了した後もフォルダ構造は保持されたままです。</p>
<p>このアプリケーションは、すべての一般的なWindowsオペレーティングシステム（10/8/7）でダウンロードできます。</p>
<p>必要なEMLファイルのみを選択してMSGファイルに変換します。</p>
<p>このアプローチは、多数の.emlファイルがあり、「EMLをMSGファイルにまとめて変換する方法」の解決策が見つからない場合に使用する必要があります。これにより、EMLファイルに含まれるデータの完全な保護と安全性が保証されます。</p>
<h3>最後の言葉</h3>
<p>ご覧のとおり、どちらのアプローチもシンプルで信頼性の高い方法で実行できます。ただし、より正確な解決策として、2番目の方法を使用する必要があります。これは、最初の方法には時間がかかり、EMLをMSGファイルに一括で変換できないなどの特定の欠点があるためです。方法は、要件または使用しているEMLファイルの数に基づいて選択できます。それを除けば、どちらの戦略もそれ自体で効果的です。</p>
Bootstrap5のformのフォーカスを消す（無効）にする

# 無効にする方法

Bootstrap5のformのフォーカス（選択したときに青くまわりが光るやつ）を無効にする方法にだいぶてこずったので書いときます。

```CSS
.form-control:focus {
  color: #212529;
  background-color: #fff;
  border-color: #86b7fe;
  outline: none;
  box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); 
}
```

これを

```CSS
.form-control:focus {
  color: #212529;
  background-color: #fff;
  border-color: #86b7fe;
  outline: none;
  /* box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); */
}
```

:::note warn
この変更をするとほとんどのフォームのフォーカスが無効になるのでご注意ください。
:::
webpack4+babel7 に移行後、karma+inject-loaderが正しく動作しない

# 環境

* NPM＠7.0.14
* Node.js＠15.3.0
* webpack＠4.46.0
* babel＠7.0.0
* karma＠6.3.9
* inject-loader＠4.0.1

# 事象

表題の通り。

`karma start`で実行されるテストコード内で`require('inject-loader!@/api/auth')`等、動的インポートを行おうとすると、「パス間違ってねぇか？」って言われちゃう。なぜか`inject-loader/dist!@/api/auth`として認識される。`dist`はどっから来た？
※ `'@'` は`'./src'` ディレクトリの alias として、webpack.config で指定してる。


```bash:console.log
$ npm run unit

> cross-env BABEL_ENV=test karma start test/unit/karma.conf --single-run

～・～・～ 中略 ～・～・～

WARNING in ./src/api/auth.js (./node_modules/inject-loader/dist!./src/api/auth.js)
Module Warning (from ./node_modules/inject-loader/dist/index.js):
(Emitted value instead of an instance of Error) The module you are trying to inject into doesn't have any dependencies. Are you sure you want to do this?
 @ ./test/unit/specs/api/auth.spec.js 5:0-48 9:18-26
 @ ./test/unit/specs sync \.spec$
 @ ./test/unit/index.js

ERROR in ./src/api/auth.js (./node_modules/inject-loader/dist!./src/api/auth.js) 237:4
Module parse failed: 'import' and 'export' may only appear at the top level (237:4)
File was processed with these loaders:
 * ./node_modules/inject-loader/dist/index.js
 * ./node_modules/babel-loader/lib/index.js
 * ./node_modules/eslint-loader/index.js
You may need an additional loader to handle the result of these loaders.
|     }();
|
>     import _Promise from "@babel/runtime-corejs2/core-js/promise";
|     import client from './client';
|     export default {
 @ ./test/unit/specs/api/auth.spec.js 5:0-48 9:18-26
 @ ./test/unit/specs sync \.spec$
 @ ./test/unit/index.js

～・～・～ 中略 ～・～・～
```

テストコード

```javascript:auth.spec.js
/* eslint-disable import/no-webpack-loader-syntax */
import axios from 'axios'

const mockAuth = adapter => {
  const injector = require('inject-loader!@/api/auth')
  const clienMock = injector({ 
    './client': axios.create({ adapter })
  })
  return clienMock.default
}
// ～・～・～ 中略 ～・～・～
```

```javascript:webpack.config.js
module.exports = {
// ～・～・～ 中略 ～・～・～
  resolve: {
    // options for resolving module requests
    // (does not apply to resolving of loaders)
    modules: ["node_modules"],
    extensions: ['.js', '.vue', '.json'],
    alias: {
      'vue$': 'vue/dist/vue.esm.js',
      '@': resolve('src')
    }
  },
// ～・～・～ 中略 ～・～・～
```

# 結論

* [@babel/plugin-transform-modules-commonjs](https://www.npmjs.com/package/@babel/plugin-transform-modules-commonjs) を導入する


```bash:bash
# インストール
＄npm install --save-dev @babel/plugin-transform-modules-commonjs
```

```javascript:.babelrc
// babel にプラグインを認識させる
{
// ～・～・～ 中略 ～・～・～
  "env": {
    "test": {
      "presets": [
        [
          "@babel/preset-env",
          {
            "modules": "commonjs"
          }
        ]
      ],
// ～・～・～ 中略 ～・～・～
    }
  }
}

```

以上

# 備考

* OSS界隈、途中のバージョンを飛ばして新しいバージョンに移行したりすると、途中のバージョンで必要になったプラグインの情報が公式ドキュメントやコミュニティ等で「入れてて当然」な雰囲気があり、何が必要なのか全くわからん。しかし、その情報を纏めるのも大変だしね。考えもんですなぁ。

# 参考
https://github.com/plasticine/inject-loader/issues/27

https://github.com/plasticine/inject-loader/issues/62

https://www.npmjs.com/package/@babel/plugin-transform-modules-commonjs
【RSpec】ActiveRecordを継承してないクラスでテストが通らないとき


ActiveRecordを継承しているクラスで標準実装されている```==```メソッドが動き、newしたインスタンスが本当に一意でなくても同じものと判断されてテストが通る。
今回はActiveRecordを継承してないクラスのモデルで```==```メソッドをオーバーライドし、意図的にテストを通した。


```ruby
class Book
  include ActiveModel::Model
...
  def ==(comparison_object)
    super || (comparison_object.instance_of?(self.class) && attendances == comparison_object.attendances)
  end
  alias :eql? :==
end
```

##参考
https://github.com/rails/rails/blob/c7dfe33f3958295a857d7bfb1070302e5b7429ff/activerecord/lib/active_record/core.rb#L411
【SQL Server】saユーザでSQLServer認証方法でログインしようとしたら18456エラーが発生した。（SQL Server2019Express）

自分用のメモとして残します。


18456エラーについては下記の通り
https://docs.microsoft.com/ja-jp/sql/relational-databases/errors-events/mssqlserver-18456-database-engine-error?view=sql-server-ver15
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/a3b857d0-7695-2762-8362-3826bd3b2c39.png)

どうやら、データベースの設定でログイン認証方法がwindows認証のみのため、SQLServer認証でのログインでエラーになった模様。

#前提
saユーザのログインは初期はログインが無効になっているため、saユーザのプロパティより有効にする。
セキュリティ→ログイン→saをダブルクリックもしくは右クリックプロパティで表示。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/3483f74a-3b91-0303-26cd-7a1407523175.png)

#やり方
データベースのプロパティを開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/710dfa4d-47ef-5490-a913-ea54c7bd83a8.png)

セキュリティ→サーバ認証をSQL Server認証モードとWindows認証モードにチェックしてOKで反映。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/213462/42bf7213-d1be-c79c-05d8-aadb4909f45c.png)

最後にデータベースの再起動をしてログインが可能になっているはず。

以上です。
【Rspec】バリデーションinclusionのテストはallow_valueを使おう

Bookモデルに下記のバリデーションを定義し、
```validate_inclusion_of```でバリデーションのテストをしようとするとテストが落ちる。

```app/models/book.rb
class Book < ApplicationRecord
...
  validates :read, inclusion: { in: [true, false] } 
end
```


```spec/models/book_spec.rb
it {is_expected.to validate_inclusion_of(:read).in_array([true, false])}
```

validate_inclusion_ofのソースにヒントがあった。


https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_model/validate_inclusion_of_matcher.rb

```
We discourage using `validate_inclusion_of` with boolean columns. In
fact, there is never a case where a boolean column will be anything but
true, false, or nil, as ActiveRecord will type-cast an incoming value to
one of these three values. That means there isn't any way we can refute
this logic in a test. Hence, this will produce a warning:
      
     it do
       should validate_inclusion_of(:imported).
       in_array([true, false])
     end
      
The only case where `validate_inclusion_of` *could* be appropriate is
for ensuring that a boolean column accepts nil, but we recommend
using `allow_value` instead, like this:

     it { should allow_value(nil).for(:imported) }
```

代替案の通りにテストを書くとグリーンになる！

```spec/models/book_spec.rb
it {is_expected.to allow_value(true).for(:read)}
it {is_expected.to allow_value(false).for(:read)}
it {is_expected.not_to allow_value(nil).for(:read)}
```

https://note.com/ishibai/n/n2c27ff7288e3
DynamoDB Localのrelease notesはzipファイルの中にしかなかったが改善された

現在はリリース履歴がどきゅめんとにもありｍ

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocalHistory.html



以下過去の参考です
----
DynamoDB Localのバージョンを上げたいといったとき、リリースノートがなくて困った経験があります。

https://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/DynamoDBLocal.DownloadingAndRunning.html

公式サイトからzipファイルをダウンロードすれば、その中にあるREADMEファイルに今までのリリース履歴が載っています。

```markdown:README.txt
2022-1-10 (1.18.0)

 * Updated log4j-core dependency to version 2.17.1.
 * Updated Jackson-core and related libraries from 2.10.x to 2.12.0

2021-12-16 (1.17.2)

 * Updated log4j-core dependency to version 2.16.
```
postgreSQL CSVの"" をNULLで登録

やりたいこと：
・oracleから抽出したデータをpostgreSQLに登録したい
・psql（コマンドラインのコピーコマンド）で登録したい

問題点：oracleから抽出したデータは、NULLが "" で出力される
　※oracleから抽出する際に指定できるのかもしれないができなかった。（SET NULL に何いれればいい？）
対策：force_null（カラム名）を指定すれば "" がNULLで登録された。

コマンド例：
csvファイルをUTF8でエンコードして登録したい。 nullは ''で書かれてて、カラム１とカラム２が ''だったらNULLで登録する
\copy 対象テーブル from ファイル名 with (format csv, null '', force_null(カラム名1,カラム名2) ,encoding 'UTF-8')

以下ページを参考にさせてもらいました。
参照元：https://qiita.com/taka_22/items/a8e36d72abc2e454405f
Docker Desktop有償化対策の答えはRancher Desktopだった

## 皆さん、お金払いましたか？

Docker Desktopが有償化されて数日が経ちましたが、皆様どうお過ごしでしょうか。

焦って有償プランを契約して配布したのもいい思い出です。


## Rancher Desktopの登場

Rancerといえば、コンテナに特化したOSのイメージが強かったわけですが、ついにRancer Desktopのv1.0がリリースされていたようです。

https://rancherdesktop.io/

DockerDesktopを意識しまくりでは？？としか思えませんが、
便利そうなのでこっちに移行してみようかと思います。

### Rancher Desktopの対応OS

- Windows
- Mac(Intel / Apple Silicon)
- Linux

ほぼ全対応といっても過言ではないでしょう。


## Rancer Desktopのインストール（Windows）の場合

Windows Package Managerを導入しているのであれば、導入は非常に簡単です。

```shell
winget install suse.RancherDesktop
```

### wingetがない人へ

[こちらの記事](https://qiita.com/hikaruright/items/b415d569b5bbeaf967bd)を参考にwingetをインストールをしましょう。

## Rancher Desktopのインストール（macOSの場合）

Homebrewにあるので、サクッとインストールできちゃいます。

```shell
brew install --cask rancher
```

DockerDesktopをアンインストールする際にゴミが残っているとうまく起動できない場合があるようです。
うまく実行できないときは参考にしてみてください。

https://qiita.com/sohei56/items/e3a911b6104ca6a704b5

## Rancher Desktopを起動する

インストールしたRancher Desktopを起動します。

### dockerdを指定する

標準ではKubernetesのコンテナランタイムとしてcontainerdが指定されていますが、dockerdを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/ce040dbf-b329-7b66-d1dc-550968aae509.png)


これで設定完了です。

この状態で、Windows Terminal（macの場合はTerminal）を起動してDockerを使ってみましょう。

```
docker run hello-world
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/1df6b66d-5d7d-f8ba-0387-092a71ff3f03.png)


はい、ばっちりですね。


### 注意点


~~唯一の欠点としては、Kubernetesを無効にできないことです。
とは言いつつ、``docker ps``したときに使わないコンテナが表示される、という程度です。~~

v1.1.0 のリリースより Kubernetes を無効化できるようになったみたいです。

> Kubernetes can be disabled to run just containerd or dockerd by itself for reduced resource consumption.
ref. [Release Rancher Desktop 1\.1\.0 · rancher\-sandbox/rancher\-desktop](https://github.com/rancher-sandbox/rancher-desktop/releases/tag/v1.1.0)

``Kubernetes Settings``から無効化できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/97156/78269ccb-f31e-ee4b-56c3-b345e139f4cb.png)


~~メモリ使用量がやばい？それは知らないなぁ~~ 

あとは、Windows版はWSL2が前提となっているため、Hyper-V版が使えないという点もあるっちゃーありそうです。


## さいごに

Windows上はdockerコマンドを普通に使えるため、Desktopの機能を使っていない場合には有用な選択肢といえます。
じっさいのところ、devcontainerさえ使えればﾖｼ!な人であればまあまあ問題はなさそうです。


**Docker Desktopをきちんと使いたい場合にはお金を払いましょう。**
【Python】macOS Big Sur でのPython環境構築まとめ

# はじめに

　超初心者の自分がmacOS BigSurでPythonの仮想環境の構築方法を自分用のメモ程度に、NOSHIで書き殴り残しておきます。

　Pythonのバージョンによってはパッチが必要なものもありますのでご注意ください。

　あくまで自分用のメモ程度なので、日本語、コード、認識ポンコツでしたらごめんなさい。

## かいてるもの

・mac BigSur homebrew+pyenvでPython/Djangoの環境構築
・Python ver 3.9.0
・Django ver 4.0.2

## pyenvを用いたpythonインストール
**▼homebrewでpyenvをインストールする。**

```
brew install pyenv
```
>　◯Homebrewの準備とpyenvのインストール
>　https://qiita.com/ramma/items/5c3cb3bb371e6a6286f1
>　◯pyenvの使いかた
>　https://qiita.com/mogom625/items/b1b673f530a05ec6b423

**▼インストールできるpythonのバージョンを確認**

```
pyenv install --list
```
**▼バージョンを指定してインストール**

```
pyenv install <pythonのversion>
```

**▼インストールされている（切り替え可能な）バージョンの確認**

```
pyenv versions 
pyenv global <pythonのversion>
pyenv local <pythonのversion>
```
　globalとすると全体に、localにするとそのカレントディレクトリ
　に指定したバージョンが反映され、切り替えられる。
　
###※バージョンの切り替えができないとき

**▼pyenv init関連の問題の場合**

```
pyenv init
```
をで実行し、~/.bash_profileにeval "$(pyenv init -)"を追記し、source ~/.bash_profileを実行。
　（※ターミナルのシェルがzshの場合、~/.zshrcに追記してsource ~/.zshrc）

**▼上記initがダメで、パスの設定に問題がある場合**
>　パスの指定
　https://blog.kabocy.com/tips/2127/

　指定したパスが間違っている時、pyenv,pythonのパスを確認
　した上で、下記サイト参照。正しいパスに変更。
　zshの場合は~/.zshrcを確認、bashの場合~/.bash_profileを確認。
　（※自分の場合はpyenvがbinじゃなくてshimsにあったためそちらに変更）
>　https://hitori-sekai.com/python/error-pyenv/

## Djangoのインストール

まんまこの記事の **Djangoのインストール** 以下を実行しました。例の画面が表示されれば完了です！
PythonとDjangoのバージョンに関してはこちらで確認してインストールしてください。

> 【初心者】【Python/Django】駆け出しWebエンジニアがDjangoチュートリアルをやってみた～その0～
> https://qiita.com/oboerarenai_user/items/4ff87b2afbad8c16ad40

先人たちの偉大な知恵に感謝。
MASM(x64)でdllを作る

#MASM(x64)でdllを作る

Windows 10 Pro (64bit)
Visual Studio 2022 Community

```dlltest.asm
comment *
ml64 /c /Fl dlltest.asm
link /dll /entry:DllMain dlltest
*
.code

DllMain proc
	mov	eax, 1
	ret
DllMain endp

myadd proc export
	mov	rax, rcx
	add	rax, rdx
	ret
myadd endp

mysub proc export
	mov	rax, rcx
	sub	rax, rdx
	ret
mysub endp

end
```

```dev.bat
@echo off
path %path%;C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx64\x64
path %path%;C:\Windows\Microsoft.NET\Framework64\v4.0.30319
cmd
```

##C#でテスト
x64版のcsc.exeにpathを通す。

```dlltest.cs
// csc dlltest.cs

using System;
using System.Runtime.InteropServices;

class Program {
	[DllImport("dlltest.dll")]
	static extern int myadd(int a, int b);
	[DllImport("dlltest.dll")]
	static extern int mysub(int a, int b);

	static void Main() {
		Console.WriteLine("add = {0}", myadd(1, 2));
		Console.WriteLine("sub = {0}", mysub(1, 2));
	}
}
```

##実行例
![m.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/257554/0d1040ad-dd92-94be-354c-a4cc3eb09297.png)

#CPUIDサンプル

```cpuid.asm
comment *
ml64 /c /Fl cpuid.asm
link /dll /entry:DllMain cpuid
*
.code

DllMain proc
	mov	eax, 1
	ret
DllMain endp

getcpuid proc export
	push	rbx
	mov	r8, rcx
	mov	eax, edx
	cpuid
	mov	[r8   ], eax
	mov	[r8+ 4], ebx
	mov	[r8+ 8], ecx
	mov	[r8+12], edx
	pop	rbx
	ret
getcpuid endp

end
```

```cpuid.cs
// csc cpuid.cs

using System;
using System.Runtime.InteropServices;
using System.Text;

class Program {
	[DllImport("cpuid.dll")]
	static extern void getcpuid(byte[] p, uint eax);

	static void Main() {
		var ascii = new ASCIIEncoding();
		var b = new byte[16];
		for (uint i = 0; i < 3; i++) {
			getcpuid(b, 0x80000002 + i);
			Console.WriteLine("[{0}]", ascii.GetString(b));
		}
	}
}
```

出力例

```
C:\Projects\MASM\cpuid>cpuid
[Intel(R) Celeron]
[(R) N4000 CPU @ ]
[1.10GHz         ]
```

#参考
https://qiita.com/Stosstruppe/items/f0be3a9cededf3e8a62a
Hyper-V逆引きメモ

必要に迫られたHyper-Vの逆引きメモです。

## 仮想マシンに固定IPを設定する方法
Hyper-Vのデフォルト仮想スイッチは固定IPを設定することができません。
そのため「internal-switch」などの適当な仮想スイッチを追加作成する必要があります。
同一オリジンポリシーとCORS

# オリジンとは
「http://aaa.com/myapp/myapp2:3000」
でHTTP通信を行ったとき、以下の要素に分解される。

- スキーム: http
- ドメイン: aaa.com
- パス: myapp/myapp2
- ポート: 3000

**オリジンは「スキーム x ドメイン x ポート」の組み合わせ**であり、
↑の場合は**「http x aaa.com x 3000」がオリジン**となる。

# 同一オリジンポリシーとは
**同一のオリジン同士でしか通信できない**というブラウザのセキュリティ機能。

**オリジンAで読み込まれたリソース（html,js,cookie etc.）**から**オリジンBのリソース**への通信をしようとすると**ブラウザに同一オリジンポリシー違反としてブロック**される。

このポリシーが存在しないと、例えばオリジンAが悪意あるサイトで、
「別サイトへアクセス & ページの表示内容をすべて抜き取ってオリジンAのDBへ保存する」といったJSがあり、これが実行されたときに別サイトの情報をオリジンAのサイトに抜き取られてしまう。

# CORS(コルス)とは
しかしながら、「オリジンA」と「オリジンB」があって1サービスとして成り立つようなとき、
**想定されているオリジン同士での通信であるのに同一オリジンポリシーに阻まれてしまう**という望ましくない事態になってしまう。

これを解決する・・・いわば一部に正当な穴をあけるのが「CORS」という仕組みである。

# CORSの設定方法
**「アクセス先のオリジン側」に「許可するアクセス元のオリジンの情報を設定する」**形となる。

例えば、
「フロントエンドがNuxt.js」「バックエンドがRails」なシステムがある場合、Rails側にCORS設定として、Nuxt.jsのオリジンの情報を加える(gem rack-corsで容易に可能)。
実践Rustプログラミング入門 サンプルコードが動かない①

# はじめに
[実践Rustプログラミング入門](https://www.shuwasystem.co.jp/book/9784798061702.html)のp152にある「__deriveマクロを使った記述方式__」のサンプルが記載通りに動かなかったので動くように修正版を載せておく。
同じように動かない方は参考までに。

## 動くコード

```rust
use clap::Parser;

#[derive(Parser, Debug)]
#[clap(
    name    = "RPN CLI",
    version = "1.0.0",
    author  = "atsutama2",
    about   = "Super awesome sample RPN calculator"
)]

struct Opts {
    #[clap(short, long)]
    verbose: bool,

    #[clap(name = "FILE")]
    formula_file: Option<String>,
}

fn main() {
    let opts = Opts::parse();

    match opts.formula_file {
        Some(file) => println!("File specified: {}", file),
        None => println!("No file sepcifed."),
    }
    println!("Is verboity specified?: {}", opts.verbose);
}
```

```toml:Cargo.toml
[package]
name = "パッケージ名"
version = "0.1.0"
edition = "2021"

# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html

[dependencies]
clap = { version = "3.0.14", features = ["derive"] }

```

## 参考
https://crates.io/crates/clap
BigQueryで実行中のジョブをまとめてキャンセルしたい

# 概要

不幸な事故によって無駄なBigQueryのジョブが大量に流れてしまった際に、一斉にジョブをキャンセルしたい時の手順を備忘のために掲載する。

# やり方

bqコマンドで以下を実行する。

`bq ls --jobs=true --max_results=100 | grep "RUNNING" | cut -d ' ' -f 3 |while read job; do bq cancel ${job}; done`

※環境・権限によって意図しない動作となる場合があるため、利用時は注意

なお、bqコマンドの実行には、自前の環境にSDKをインストールする方法の他に、ブラウザのコンソール上から利用できるcloud shellを使う方法も存在する。

参考： [Cloud Shell の使用  |  Google Cloud](https://cloud.google.com/shell/docs/using-cloud-shell?hl=ja)



## 詳細

`bq ls --jobs=true --max_results=100`

status問わずジョブを一覧表示
max_resultsで表示件数を指定するので、ここは任意
statusによる絞り込みができるオプションは存在しない？ようなので、後段で処理

`bq ls --jobs=true --max_results=100 | grep "RUNNING"`

RUNNING行を取り出す(=status=RUNNINGに絞り込む)

`bq ls --jobs=true --max_results=100 | grep "RUNNING" | cut -d ' ' -f 3`

JobID列に絞り込む

`bq ls --jobs=true --max_results=100 | grep "RUNNING" | cut -d ' ' -f 3 |while read job; do bq cancel ${job}; done`

複数のJobIDを一度に処理できないようなので、1つのIDごとに処理
このままだと各ジョブでキャンセル完了まで応答待ち状態を挟む挙動となるが、`--nosync`を入れると応答待たずにコマンドが完了するのでお好みで
AWS Backup バックアップ形式・費用について (RDSバックアップ時)

#AWS Backupとは
AWS Backupは、一元化されたバックアップ機能を提供するサービスです。
バックアップ対象は様々で、馴染みのあるものだとEC2、EBS、RDS、DynamoDB等のバックアップをサポートしています。その他にも、様々なデータバックアップが可能です。
https://aws.amazon.com/jp/backup/?whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc

#利用方法
利用方法については既にたくさんの記事があるので、本記事には記載していません。公式ドキュメントやブログをご参考下さい。
参考：
・https://docs.aws.amazon.com/ja_jp/aws-backup/latest/devguide/whatisbackup.html
・https://dev.classmethod.jp/articles/aws-backup-perfect-understand/

#課金
AWS Backupの利用に初期費用はかかりません。その月に利用したバックアップストレージ量(月平均)とバックアップから復元したバックアップデータ量、また、別リージョンへのバックアップ転送をしている場合は、バックアップの転送量に応じた課金が発生します。

#バックアップ形式
RDSのバックアップを取得すると、初回のみフルバックアップで2回目以降は差分のみの増分バックアップとなります。

#不明な点
###**①初回のフルバックアップが削除されてしまっても復元できるか**
保持期間により初回のフルバックアップが削除された場合は、再びフルバックアップが作成されるのではないかと考え、AWSサポートに確認しました。その場合は、データ量に応じてコスト最適な保持期間を確認する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521638/56d12de2-f237-cf80-0d3a-1153fc5db2d6.png)

###**②バックアップストレージの使用量を確認することができるか**
課金の項目でも記載しましたが、バックアップストレージ料金は、月平均で計算されます。月平均試算のために、数回バックアップを実施し、どのくらいのバックアップストレージを使っているか確認したかったのですが、確認方法について記載のあるドキュメントを見つけることはできませんでした。

#確認結果
###**①初回のフルバックアップが削除されてしまっても復元できるか**
AWSサポートに確認したところ、**「保持期間が過ぎて削除されるデータは、後続のバックアップから参照されていないデータのみとなり、変更/更新/削除がされなかったバックアップデータ (後続のバックアップから参照されるデータ) については削除されない」**とのことでした。
つまり、フルバックアップは初回のみで、その後は全て増分バックアップとなります。
そして、バックアップデータから復元できるかどうかはバックアップ頻度によります。

**例1. バックアップ取得頻度1日、保持期間5日の場合**
日次でバックアップを取得している場合は、6日目以降に初回のフルバックアップが削除されていても復元が可能です。そのため、バックアップを他リージョンにコピーしている場合は、節約のためにコピー先リージョンではコピー元リージョンの保存期間よりも短くすることも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521638/7d90ce6c-fa95-5a39-baf3-0d46f7d9610e.png)

**例2. バックアップ取得頻度7日、保持期間5日の場合**
このような設定をする人はいないと思いますが、週次でバックアップを取得していて、保持期間を5日にした場合を考えます。この場合、2回目のバックアップを取得する際に初回のバックアップは削除されているためフルバックアップとなります。また、当たり前ですが6日目にバックアップが削除されてから、次のバックアップが作成される8日目まではバックアップは存在しておらず、復旧できない期間となるので注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/521638/85cda4c4-c706-1371-8fd3-497c7078bc28.png)

###**②バックアップストレージの使用量を確認することができるか**
確認する方法はないそうです！ただ、別リージョンへの転送量を確認することはできます。バックアップの転送を数回してみて、どのくらいの容量を転送しているか確認すれば、保存期間と合わせて月平均のバックアップストレージ量は試算できそうです。

#最後に
AWS Backupを使うにあたって不明だったを確認してみました。Lambdaを使ってバックアップ、他リージョンへの転送をしていた方も多いのではないでしょうか。便利なサービスなので、積極的に使っていこうと思います！

最後までご覧いただきありがとうございました。
NuxtとHerokuでLINEbotを作ってみた

##### 今回は、タイトルにある通りNuxtとHerokuでLINEbotを作ってみました。
関西大学に通うキンジョウです！

####キッカケ
自分はフロントエンドの人間なので、せっかくならNuxtでLINEbot作れたらいいなって思ったからです！

###初めに
```js
yarn create nuxt-app 好きなプロジェクト名
```
ここはお好きなように設定して進めてください。

次に、ディレクトを増やします。ルートディレクトに**api**というディレクトリを作成する。
その中に、**index.js**を作成して、追加します。

```
 api
 └── index.js
```
```nuxt.congi.js
serverMiddleware: ['~~/api/']//これを追加してください
```
これからはこのjsファイルで作業してしていきます。

#### モジュールの追加
```
yarn add https　express body-parser//この３つを追加します
```

```index.js
'user strict';
const https = require('https')
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const TOKEN ='ここにLINEbotのアクセストークンを入れておきます';
app.use(
  bodyParser.urlencoded({
    extended: true,
  })
)
app.use(bodyParser.json());
app.post('/webhook', function (req, res) {
  if (req.body.events[0]) {
    const dataString = JSON.stringify({
      replyToken: req.body.events[0].replyToken,
      //ここにmessagesを変化させると、応答も変化する
      //https://developers.line.biz/ja/docs/messaging-api/overview/
      //こちらを参照してください
      messages: [
        {
          "type": "text",
          "text": "Herokuからこんにちは"
        },
        {
          "type": "text",
          "text": "Nuxtからこんにちは"
        }
      ]
    })
    const headers = {
      'Content-Type': 'application/json',
      Authorization: 'Bearer ' + TOKEN,
    }
    const webhookOptions = {
      hostname: 'api.line.me',
      path: '/v2/bot/message/reply',
      method: 'POST',
      headers: headers,
      body: dataString,
    }
    const request = https.request(webhookOptions, (res) => {
      res.on('data', (d) => {
        process.stdout.write(d)
      })
    })
    request.write(dataString)
    request.end()
  }
})


module.exports = {
  path: '/',
  handler: app,
}

```
:::note warn
警告
本番環境で使う場合は、しっかりと署名検証を行うことを行なってください
:::

これでNuxt側はこれで設定終わりました！

###Herokuの設定

https://dashboard.heroku.com/
こちらにアクセスします

- Newをクリックします
- Create New appをクリックします
- 好きなapp名などを入力してください
- そして、下にあるCreate　appを押す
 ![スクリーンショット 2022-02-02 17.07.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/5422498e-5a75-33ed-deb7-33eb171df8b4.png)
- Deployをクリック
- Deployment methodで**Github**を選んで、HerokuとGithubを連携してください
 ![スクリーンショット 2022-02-02 17.09.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/daa613f9-c7b3-410d-a73c-e9a54ebf0f4b.png)
- こうなれば成功です

##最後に
Nuxtで書いていたコードをHerokuにあげるだけです。先ほど、GitHubと連携したと思うので、GitHubにあげると自動で、Herokuにデプロイされます。


![IMG_9446.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763535/ff1eda9c-8448-8fd6-c5e4-8dc9eeeb40c4.jpeg)

Nuxtなので,ローカルで開発するときはいつもどおりに開発できている感じがして、とても開発体験が良かったです。
sqlplusでCSV出力

windowsの場合

SQLサーバはローカルを想定
UTF8のデータを抽出

バッチの中身（UTF8だよと認識させる）
　chcp 65001
　SET NLS_LANG=Japanese_Japan.AL32UTF8
　sqlplus -s oracleID/oraclePASS @ファイル.sql

カラムの中に改行があると、CSV出力される時に改行が入ってしまう
aaaabbbb  (aとbの間に改行）
↓
aaaa
bbbb
とCSVに出てしまうので以下を改行が入りそうなところに入れる

select
replace(replace(replace(カラム名, chr(13) || chr(10), ''), chr(10), ''), chr(13), '')

改行コードを別の文字に変換しているので改行されなくなる。
スクレイピング基礎備忘録

#Pythonを使ったスクレイピング技術(実務No2)
お小遣い稼ぎでデータ収集やGASによりシートないの自動化アプリを開発しています。
今回は実務の際に基本的操作をコピペできるよう経験から学んだことを備忘録として書き留める

目次
--
- スクレイピングする前の注意点
- 基本操作
  - ブラウザの起動(よくあるエラー)
  - htmlタグの取得(aタグの取得⇨再度検索)
  - 広告対処
  - ファイルを開いてファイルに格納
  - with open ~ 書き込みと読み込みの方法
  - タイムスリープの設定
  
 スクレイピングする前の注意点
 --
1.著作権について調べる
Webコンテンツは全て配信者の著作物になるので、勝手に使用することは基本的にNG。以下の用途での使用ならOKと考えて良い
- 個人や家族間で使用する。
- Web検索サービスを提供する。
- 情報解析をする。

2.robot.txtを調べる
検索するurlに/robot.txtで検索すると以下のような指示が書かれている
```
User-Agent:*
Disallow: /admin/
Disallow: /logs
Disallow: /search/
```
この場合、url/admin/、/logs、/search/にはクローラーが立ち入ることを禁止している。

基本操作
--
###ブラウザの起動
スクレイピングでよく使われるseleniumを使用したいと思います。
初期設定として
 - クロームドライバーのバージョンを合わせておく
 - import chromedriver_binary を忘れずに


```
from selenium import webdriver
import chromedriver_binary
import time
import csv
import requests
from bs4 import BeautifulSoup

url='ここに調べたいurlを入れる'
browser = webdriver.Chrome()
browser.implicitly_wait(1)
browser.get(url)
```
###browser.find_element()を使い倒す
よく使うfind_elementを以下にまとめる
- クラス取得,タグ取得(aタグ,div,ul,li)
- 
```
browser.findelement_by_class_name('')
find_element_by_id('contentsleft')
find_elements_by_tag_name('li')
find_element_by_link_text('click here')⇨<a href='url'>click here</a>
```
- hrefの取得(urlの取得),textの取得
- 
```
url=find_element_by_tag_name('a').get_attribute('href')
title=find_element_by_tag_name('a').get_attribute('title')
text=find_element_by_tag_name('a').get_attribute('textContent')
```
###ページによってはないタグがある場合
複数のページをスクレイピングする際にこのページにはxタグがあるけど、他のページにはないことが稀にあります。
このように、あるかどうかわからないタグについてはtry ecept関数を使って対処します

```
#広告があるか調べる
try:
    representative=browser.find_element_by_class_name('node__representative').find_element_by_tag_name('dl').find_element_by_class_name('mincho').text
    nav = browser.find_element_by_class_name('contentsWrap__rightcolumn').find_element_by_class_name('node__box')
    company_url = nav.find_element_by_class_name('cf').find_element_by_tag_name('a').get_attribute('href')

except:
    representative = '　'
    company_url='NO'
```
###ファイルを開いてファイルに格納
基本的にデータ分析を行う場合は以下の３つのモジュールを使い倒すことが多いです。
今回は、基本的な『書き込みと読み込み』だけなのでcsvモジュールのみを紹介します
-numpy 
-pandas 
-csv

####書き込み
```
with open("company_data1.csv", "w") as f:
    writer = csv.writer(f)
    writer.writerow(["会社名", "url", "代表者"])
```
####読み込み
```
with open("company_data1.csv", "r") as f:
    reader = csv.reader(f)
    for read in reader:
        print(reader)
```
###タイムスリープの設定
最後にタイムスリープの紹介です。これは、相手のサーバーに負荷をかけないだけでなく、自分のpcをダウンさせないためにも必要な操作です。

```
  def get_wait_secs():
  """画面の待機秒数の取得"""
  max_wait = 7.0   #最大待機秒
  min_wait = 3.0   #最小待機秒
  mean_wait = 5.0  #平均待機秒
  sigma_wait = 1.0 #標準偏差（ブレ幅）
```
###cssセレクター
複数のクラスを取得

```
ele = driver.find_element_by_css_selector(".hoge.huga.piyo")
```

###空白文字の処理
法方1：replace()
法方2:strip()
std:shared_ptrの代入

##shared_ptrにresetや代入して動かしてみた（ctor/dtor）  

SharedPtrTestという何の変哲もないクラスを作って実験

### その１

```c++
{
    std::shared_ptr<SharedPtrTest> sharedPtr = nullptr;

	auto temp_SharedPtr1(new SharedPtrTest(L"1"));
    sharedPtr.reset(temp_SharedPtr1);

	auto temp_SharedPtr2(new SharedPtrTest(L"2"));
	sharedPtr.reset(temp_SharedPtr2);

	auto temp_SharedPtr3(new SharedPtrTest(L"3"));
	sharedPtr.reset(temp_SharedPtr3);

	auto temp_SharedPtr4(new SharedPtrTest(L"4"));
	sharedPtr.reset(temp_SharedPtr4);
}
```

### その２
```c++
{
    std::shared_ptr<SharedPtrTest> sharedPtr = nullptr;

	SharedPtrTest* temp_SharedPtr1 = new SharedPtrTest(L"1");
	sharedPtr.reset(temp_SharedPtr1);

	SharedPtrTest* temp_SharedPtr2 = new SharedPtrTest(L"2");
	sharedPtr.reset(temp_SharedPtr2);

	SharedPtrTest* temp_SharedPtr3 = new SharedPtrTest(L"3");
	sharedPtr.reset(temp_SharedPtr3);

	SharedPtrTest* temp_SharedPtr4 = new SharedPtrTest(L"4");
	sharedPtr.reset(temp_SharedPtr4);
}
```

### その３
```c++
{
    std::shared_ptr<SharedPtrTest> sharedPtr = nullptr;

    std::shared_ptr<SharedPtrTest> temp_SharedPtr1(new SharedPtrTest(L"1"));
	sharedPtr = temp_SharedPtr1;

	std::shared_ptr<SharedPtrTest> temp_SharedPtr2(new SharedPtrTest(L"2"));
	sharedPtr = temp_SharedPtr2;

	std::shared_ptr<SharedPtrTest> temp_SharedPtr3(new SharedPtrTest(L"3"));
	sharedPtr = temp_SharedPtr3;

	std::shared_ptr<SharedPtrTest> temp_SharedPtr4(new SharedPtrTest(L"4"));
	sharedPtr = temp_SharedPtr4;
}
```

###その１の実行結果
```
id[1] : Ctor 
id[2] : Ctor 
id[1] : Dtor 
id[3] : Ctor 
id[2] : Dtor 
id[4] : Ctor 
id[3] : Dtor 
id[4] : Dtor 
```
###その２の実行結果
```
id[1] : Ctor 
id[2] : Ctor 
id[1] : Dtor 
id[3] : Ctor 
id[2] : Dtor 
id[4] : Ctor 
id[3] : Dtor 
id[4] : Dtor 
```
###その３の実行結果
```
id[1] : Ctor 
id[2] : Ctor 
id[3] : Ctor 
id[4] : Ctor 
id[3] : Dtor 
id[2] : Dtor 
id[1] : Dtor 
id[4] : Dtor 
```
Chrome開発者ツールを利用して、アルファベットから始まるラベルを全て出力する（Server/DataCenter）

Confluenceへログイン後、Confluenceの画面（どこでも良い）を開いた状態で、Chrome開発者ツール(Developer Tool)を開き、コンソール上で以下のコードを実行します。

```:javascript
let baseUrl = 'https://<ConfluenceのURL>';
let delim = ",";
let maxResults = 10000;
let chars = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
let result = []

for (let i = 0; i < chars.length; i++) {
	let labels = (
		await (
			await fetch(
				baseUrl 
				+ '/labels/autocompletelabel.action?query=' +  chars[i]
				+ '&maxResults=' + String(maxResults)
		)
	).json()).contentNameMatches;
	
	for (let j = 0; j < labels.length; j++) {
		for (let k = 0; k < labels[j].length; k++) {
			result.push(labels[j][k].name)
		}
	}
}

console.table(result)
```
dockerfileに記述せずdocker buildプロキシ設定まとめ

```
 ubuntu20.04 
# dockerd に環境変数でプロキシ設定
$sudo systemctl edit docker
[Service]
Environment="HTTP_PROXY=http://user:pw@xxx:8080"
Environment="HTTPS_PROXY=http://user:pw@xxx:8080"
Environment="NO_PROXY=xxx"

# vi /etc/systemd/system/docker.service(/etc/systemd/system/docker.service.d/override.confもしかしたらこちらの可能性あり)
[Service]
Environment="HTTP_PROXY=http://user:pw@xxx:8080"
Environment="HTTPS_PROXY=http://user:pw@xxx:8080"
Environment="NO_PROXY=xxx"
Environment="DOCKER_NETWORK_OPTIONS=--dns xxx"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS
dnsはnslookupで取得したものを入れる

# ~/.docker/config.json作成(大抵ユーザディレクトリ内に.dockerディレクトリ存在)
{
  "proxies": {
    "default": {
      "httpProxy": "http://user:pw@xxx:8080",
      "httpsProxy": "http://user:pw@xxx:8080",
      "noProxy": "xxx"
    }
  }
}

# デフォルトの設定
$vi /etc/default/docker
export http_proxy="http://user:pw@xxx:8080"
export https_proxy="http://user:pw@xxx:8080"
export no_proxy="xxx"
export NO_PROXY="${no_proxy}"
export HTTP_PROXY="${http_proxy}"
export HTTPS_PROXY="${https_proxy}"

# apt のプロキシ設定
$ nano /etc/apt/apt.conf
Acquire::http::Proxy "http://user:pw@xxx:8080";
Acquire::https::Proxy "http://user:pw@xxx:8080";

# Dockerデーモンにプロキシ設定
$ mkdir -p /etc/systemd/system/docker.service.d
$ vi /etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://user:pw@xxx:8080"
Environment="HTTPS_PROXY=http://user:pw@xxx:8080"
Environment="NO_PROXY=xxx"
Environment="DOCKER_NETWORK_OPTIONS=--dns xxx"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS

# 状態確認
$systemctl status docker.service

# 再起動
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

# ビルド
docker build --build-arg http_proxy=http://user:pw@xxx:8080 --build-arg https_proxy=http://user:pw@xxx:8080 .
```

蛇足：
ECRにプッシュ方法：
・AWSでコードパイプラインを使用して、dockerfileからビルド～プッシュをして、ECRリポジトリにプッシュする方法
・プッシュコマンドを利用してECRリポジトリにプッシュする方法
1番目の方法でプッシュする環境なのに、で2番目の方法でECRにプッシュして、プロキシエラーが出て、認識抜けでdockerプロキシ設定してしまった。環境ができていたので、そのままgit コミットでcodecommitが動きECRプッシュしてくれていた。。
How to Migrate AES ECB En/Decryption from PyCrypto to Cryptography

# See ya PyCrypto
My docker image cannot install PyCrypto anymore. It got an error **"RuntimeError: autoconf error"** and the issue said, **"Don't use PyCrypto anymore."**
https://github.com/pycrypto/pycrypto/issues/302


# How to migrate `Crypto.Cipher.AES` to Cryptography

As you know, the cryptography document is sucks as well. All I found was just `cryptography.hazmat.primitives.ciphers.algorithms.AES` exists. No method nor example at all. 

> class `cryptography.hazmat.primitives.ciphers.algorithms.AES(key)`
> https://cryptography.io/en/latest/hazmat/primitives/symmetric-encryption/

# AES Encryption

I used `AES.encrypt()` and `AES.decrypt()` without any options. Later I noticed that I used AES's ECB mode. I was succeeded to migrate to cryptography without re-encrypting. Yay!


## PyCrypto version

```py
from Crypto.Cipher import AES

ENCRYPT_KEY = "9e3c8d04a37e057bb56d123456789012"

def aes_encrypt(data):
    cipher = AES.new(ENCRYPT_KEY)
    data = data + (" " * (16 - (len(data) % 16)))
    return binascii.hexlify(cipher.encrypt(data))

def aes_decrypt(data):
    cipher = AES.new(ENCRYPT_KEY)
    return cipher.decrypt(binascii.unhexlify(data)).rstrip()
```



## Cryptography Version

```py
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

ENCRYPT_KEY = "9e3c8d04a37e057bb56d123456789012"

def cipher():
	return Cipher(
    	algorithms.AES(str.encode(ENCRYPT_KEY)),
        modes.ECB(),
        default_backend()
    )

def aes_encrypt(text: str) -> str:
    encryptor = cipher().encryptor()
    text = text + (" " * (16 - (len(text) % 16)))
    password_bin = encryptor.update(str.encode(text)) + encryptor.finalize()
    return binascii.hexlify(password_bin)


def aes_decrypt(text: str) -> str:
    decryptor = cipher().decryptor()
    message = decryptor.update(binascii.unhexlify(text)) + decryptor.finalize()
    return message.rstrip()

```

I wish this helps someone in the world. 


# ref
I didn't know privacyIDEA but the source code helped me a lot. Thanks!
https://github.com/privacyidea/privacyidea/blob/7199be70bbe1ebee908518a8b529ac3637a86ca1/privacyidea/lib/crypto.py#L133
https://github.com/privacyidea/privacyidea/blob/7199be70bbe1ebee908518a8b529ac3637a86ca1/privacyidea/lib/importotp.py#L86
https://www.programcreek.com/python/example/94440/cryptography.hazmat.primitives.ciphers.Cipher
Griffin-Limアルゴリズムの適切な反復回数はどのくらいだろう？

# はじめに
[前の記事](https://qiita.com/ma-szk/items/fe5c3d010b281dcd3537)でGriffin-Limアルゴリズムを紹介しました。
その中でGriffin-Limアルゴリズムは十分な反復回数を行うことで品質の良い結果が得られますと述べました。
しかし、実装ではtorchaudio.transforms.GriffinLimのデフォルトの反復回数である32回とその十倍の320回を試しましたがデフォルトの反復回数と十倍の反復回数で品質が良くなったのかイマイチわかりませんでした。
そこで本当に品質が良くなっているのかMOSの自動算出プログラムであるViSQOLをつかってスコア形式で見ていきたいと思います。

ViSQOLについての記事はこちら

https://qiita.com/ma-szk/items/2d2156892245b13f6c4f

# 品質確認方法
以下の反復回数で試行します。

8回
16回
32回
100回
320回
500回
1000回
3200回

位相をランダムで初期化しているため反復回数ごとに3回動かしてみます。
入力データはM-AILABSの適当なデータです。
入力データのサンプリングレートは16hzでViSQOLのモードはスピーチモードを使用しました。

# 結果

|反復回数|一回目のMOS|二回目のMOS|3回目のMOS|MOSの平均  |
|:-----:|:-------------:|:---------------:|:-------------:|:--------------:|
|8      | 3.26646       | 3.27334         | 3.24124       | 3.26034666667  |
|16     | 3.34565       | 3.24788         | 3.38707       | 3.32686666667  |
|32     | 3.38952       | 3.39979         | 3.42066       | 3.40332333333  |
|100    | 3.44303       | 3.45231         | 3.49419       | 3.46317666667  |
|320    | 3.37232       | 3.54869         | 3.51795       | 3.47965333333  |
|500    | 3.47666       | 3.53706         | 3.52448       | 3.51273333333  |
|1000   | 3.50292       | 3.46924         | 3.55915       | 3.51043666667  |
|3200   | 3.42859       | 3.52846         | 3.56928       | 3.50877666667  |


### 波形を見てみよう
元の波形
![base.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/408635d3-1df3-4978-47ab-42fcd21c0831.png)
反復回数が8回の波形
![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/d1cc5df0-0417-e8a3-c25f-a3d1f37b0950.png)
反復回数が32回の波形
![32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/bd606a34-9ac8-807e-1425-4623506e812d.png)
反復回数が3200回の波形
![3200.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2423332/6767a9d6-7cd1-7dc8-c6ce-b2829a583abb.png)

波形だとやっぱり違いがよくわからない・・・

# 感想
繰り返しの数を増やしているだけあって3200回のときは時間が体感で10秒以上かかりました。
さて、Griffin-Limアルゴリズムの反復回数による精度比較ですが、MOSスコアの平均を見てみると500回以降はMOSが下がっています。
MOSの平均ではなく単体で見ると反復回数が8回から500回にかけては確かにスコアが伸びていると感じましたが、それ以上はスコアの伸びを感じませんでした。
「回数をすごく増やせばいい音質のものが手に入るのだから反復回数を増やせば増やすほどいいんじゃないか？」と考えていました。
しかし、反復回数にかかる時間を考慮すると、増やした時間に見合う精度のものが出力されるかというと違うことが分かりました。今回の結果からは、反復回数が500回くらいが時間と精度で見ると一番いい反復回数なのではないでしょうか？

# おわりに
Griffin-Limアルゴリズムについて反復回数によるMOSの違いが体感できました。
初心者であるため間違いが多少あるかもしれません。もし、間違えているところがありましたらこっそり教えてください。
この記事が誰かのお役に立てれば幸いです。
典型的なアルゴリズムの計算量と安定ソートをわかりやすく表にしてみた

##1.ソートの表まとめ
|ソート名| 最良の時間計算量| 平均時間計算量 | 最悪時間計算量 |安定性|
|:-----------:|:-----------|:-----------|:-----------|:-----------|
| バブルソート| O(n^2)|O(n^2)|O(n^2)|安定
| 選択ソート| O(n^2)|O(n^2)|O(n^2)|不安定
| 挿入ソート|O(n^2) |O(n^2)|O(n^2)|安定
| マージソート|O(nlogn) |O(nlogn)|O(nlogn)|安定
| クイックソート|O(nlogn) |O(nlogn)|O(n^2)|不安定
| シェルソート| O(nlogn)|O(nlogn)|O(n^2)|不安定
| ヒープソート|O(nlogn) |O(nlogn)|O(nlogn)|不安定
| 計数ソート|O(n) |O(n+k)|O(n+k)|安定
| 基数ソート| O(n)|O(d(n+k))|O(d(n+k))|安定
| パケットソート |O(n) |O(n+n^2/k+k)|O(n^2)|安定
##2.参考記事
[計算量オーダーについて](https://qiita.com/asksaito/items/59e0d48408f1eab081b5)
【Vue.js】テキストボックスの入力制限


Vue.jsでテキストボックスに不正な文字が入力できないようにしたかったので、その方法を実装してみた。

# watchプロパティとは
**watch**プロパティは、データの変更を監視して、変更があった際に登録されている処理を実行する。書き方は以下のようになる。

```javascript
watch: {
    <監視するプロパティ名>: function(<変更後の値>,<変更前の値>){
        // 処理内容
    }
}
```


# テキストボックスの入力制御
今回は、テキストボックスに不正な文字が入力された場合はその文字を削除することで、入力できないようにした。以下のサンプルは半角英字が入力できないようにしたものです。**watch**プロパティで、データを監視し、入力されるたびに正規表現を使ってチェックして不正なら削除を行っている。

```html
<body>
	<div id="app">
		<input type="text" class="name" v-model="name" />
	</div>
    <script src="sample.js"></script>
</body>
```

```javascript
const Sample = {
	data() {
		return {
			name: "",
		};
	},
	watch: {
		name: function () {
			const pattern = /[a-zA-Z]/g;    // 半角英字のみ不可
			this.name = this.name.replace(pattern, "");
		},
	},
};

Vue.createApp(Sample).mount("#app");
```
このサンプルの```pattern```に指定する正規表現を変更することで、制限する文字を変更できる。ちなみに正規表現の最後の```g```は、通常は最初に一致した文字列だけ置換が行われるが、```g```オプションを付けることで一致する全ての文字列が置換されるようになる。
【忘備】Terraform基本構文 ～変数とデータ型～

## 変数

HCL2で利用可能な変数は2種類

* locals : ローカル変数。プライベートな変数で外部から変更はできない。
* variables : 外部から変更可能な変数。コマンドライン実行時にオプションやファイル指定で上書きできる。

### locals の定義と参照

「localsブロックで」定義して「${local.【Name】}」で参照

```
locals {
  project = "testylog"
  env     = "dev"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  ...
  tags = {
    Name = "${local.project}-${local.env}-vpc"
  }

  output<OUTPUT_NAME> {
    ...
  }
}
```

### variablesの定義と参照

「variableブロック」で変数を１つ定義し、「${var.【NAME】}」で参照

```
variable "project" {
  type    = string
  default = "tastylog"
}

resource <RESOURCE_TYPE> <RESOURCE_NAME> {
  ...
  tags = {
    Name = "${var.project}-dev-vpc"
  }

  output<OUTPUT_NAME> {
    ...
  }
}

```

## データ型

#### HCLで扱えるデータ型、

* プリミティブ
  * string : Unicode文字列
  * number : 数値。整数と少数の両方を表現
  * bool : true/falseの２つ
* 構造体
  * object : キーバリュー型データ
  * tuple : 各列の方が決まっている配列
* コレクション
  * list : 特定の方で構成される配列
  * map : キーが文字列の配列
  * set : 値の重複がない配列

### プリミティブ

基本となるデータ型

```
variable "message" {
  type    = string
  default = "Hello World"
}

variable "max_count" {
  type    = number
  default = 10
}

variable "is_enable" {
  type    = bool
  default = true
}
```

### Object

キーバリュー形式で定義されるデータ型。キーごとに方の定義が可能。

```
variable "obj_sample" {
  type = object({
    name = string
    age  = number
  })
  default = {
    name = "tabaka"
    age  = 28
  }
}
```

```
username = var.obj_sample.name
```

### tuple

配列のN番目にどういった型を使うかが決められたデータ型。下の例だと0要素目が文字列、1要素目が数値。

```
variable "tuple_sample" {
  type = tuple([
    string, number
  ])
  default = ["tanaka", 28]
}
```

```
username = var.tuple_sample[0]
```

### list

すべて同じ型で定義される配列

```
variable "list_sample" {
  type   = list(string)
  default = ["tanaka", "sato"]
}
```

```
username = var.list_sample[0]
```

### map

キーが文字列、バリューが指定された方となる配列。

```
variable "map_sample" {
  type = map(string)
  default = {
    "High" = "m5.2xlarge"
    "Mid"  = "m5.large"
    "Low"  = "t2.micro"
  }
}
```

```
instance = var.map_sample.High
```

### set 

バリューの重複が排除される配列

```
variable "set_sample" {
  type = set(string)
  default = [
    "tanaka",
    "sato",
    "tanaka",
    "sato"
  ]
}
```

```
[for itm in var.set_samle : itm]

→ toset([
    "sato",
    "tanaka"
  ])
```
EC2インスタンスにSSH接続しようとしたらエラー ssh2 user auth failure publickey status=1004

EC2インスタンスにSSH接続しようとしたら、エラーになった。

`ssh2 user auth failure publickey status=1004`

![ssh2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596144/08606f58-22c9-dbfe-7a5c-547dedfb8bed.jpeg)

(ちなみにRLoginを使っている)

### 解決方法

ログインユーザー名を『ec2-user』とする。

![ssh1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/596144/8d1d5982-9d35-788c-8d4f-3c5dafbcebba.jpeg)
powershellで抽出してみた

powershellで抽出してみた。
```
Win32_1394Controller
Win32_IDEController
Win32_PCMCIAController
Win32_PrinterController
Win32_SCSIController
Win32_USBController
Win32_VideoController


$adsi = [ADSI]"WinNT://$env:COMPUTERNAME"
$adsi.Children | where {$_.SchemaClassName -eq 'user'} | Foreach-Object {
    $groups = $_.Groups() | Foreach-Object {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    $_ | Select-Object @{n='UserName';e={$_.Name}},@{n='Groups';e={$groups -join ';'}} | tee -a -FilePath ./ps.txt
} 
```
ニーチェの名言を藤原竜也化してみよう

##はじめに
みなさん、今日この頃いかがお過ごしですか。
自分は**値上げと、値上げと、値上げと、値上げ**で気が参っています。

コロナもそうですし、何かと暗い話題が多いですよね。
そんな時こそ笑える内容を見たいと思い、Qiitaで勉強ついでに面白そうなものを探していました。

そうしたら・・・

https://qiita.com/Euglenach/items/8b17ac2338f90d7b13c2

クスッと笑えたので、これを使って簡単なアプリを作ることにしました。

##画面
入力する言葉は何がいいかなーて考えていたら、ふとニーチェの言葉が浮かんだので試すことに。
送信ボタンを押すと、勝手に藤原竜也化してくれます。戻るボタンで他の言葉もまた入れられます。

![入力画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/937e413f-c3ea-b011-df49-6d4ebf6e2a8a.jpeg)
![出力画面.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1259951/758b693a-5397-510d-ece2-1be287f978c4.jpeg)

[コードはこちら](https://github.com/dem-kk/Flask/tree/main/tatuya)

##まとめ
名言がちょっとうさん臭くなった気する。
アプリなので、今度は自分の環境以外でも使えるようにpythonanywhereの習得と共にこれをアップしたいなあ(いきなりherokuはしんどいので)
Cognos Analytics の同梱 Libertyのバージョン確認方法

#Cognos Analytics 同梱の Libertyのバージョン確認方法
Cognos Analyticsは同梱のLibertyで動作します。

同梱と言ってもLibertyとCognosを別々に導入する訳では無く、Cognos Analyticsをインストールすると勝手にLibertyが入ります。
例えばWindowsの場合、C:\Program Files\IBM\cognos\analytics\wlp フォルダが(WebSphere Liberty Profile)のフォルダですね。

たまにLibertyのバージョンを教えて欲しいと確認されます。

こちらのサポートサイトを見ると
【IBM Cognos Analytics on Premises 11.1.x: Supported Software Environments】
https://www.ibm.com/support/pages/ibm-cognos-analytics-premises-111x-supported-software-environments
お馴染みのこの表示ですが、さすがに「8.5.5.5」では古すぎるだろうと思い、
![002.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/a615e131-dab3-40e5-4cda-300527815f06.png)

真面目にLibertyのこのバージョンのどれに当たるのかを調べたところ、
https://www.ibm.com/docs/ja/was-liberty/base?topic=liberty-what-is-new-in-this-release

Cognos Analytics の場合、以下のファイルの以下の行を確認するとわかるようです。
\<Cognos Install>\wlp\lib\versions\WebSphereApplicationServer.properties
![001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147246/34ff081b-b8cf-5469-a676-9687b1bb68e1.png)

ご参考まで！
API を使用した Pardot データ移行


API を使用して移行できる Pardot データはどれですか? 具体的には、次の項目をある Pardot ビジネス ユニットから別のビジネス ユニットに移行できるかどうかを知りたいです。  

|機能              |                        |APIで移行可能|
|:-----------------|:-----------------------|:-----------|
|Engagement Studios|エンゲージメント スタジオ||
|Email templates|メール テンプレート|動的コンテンツ、差し込み項目などの他の Pardot アイテムを参照する場合は、それらが存在する場合でも異なる可能性があるため、注意が必要です|
|Forms|フォーム||
|Form Handlers|フォームハンドラー|ピックリストなどのより複雑なフィールドは API では実行できないフィールド マッピングに関する注意事項があります|
|Dynamic Content|動的コンテンツ||
|Prospects|見込み客|可能|
|Automation Rules|自動化ルール||
|Page Actions|ページ アクション||
|Segmentation Lists|セグメンテーション リスト||
|Custom Redirects|カスタム リダイレクト|可能|
|Landing Pages|ランディングページ|Pardot 内の画像やその他のファイルの参照に関する注意事項|
|Layout Templates|レイアウト テンプレート|Pardot 内の画像やその他のファイルの参照に関する注意事項|
|Pardot Campaigns|Pardot キャンペーン|API では作成できないため、ビジネス ユニットのキャンペーンを作成し、キャンペーンを適切に同期させるには、SF 自動化が必要です。|
|Static Lists|静的リスト|可能|

消されている
[Questions re. Pardot Data Migration Using API](https://trailhead.salesforce.com/en/trailblazer-community/feed/0D54S00000Jdn2C)
f.select の引数

# まとめ

```test.html.erb
<%= f.select :sort, {'点数が高い順': 'score_desc', '点数が低い順': 'score_asc'}, {selected: @search_params[:sort], include_blank: '選択して下さい'}, {class: 'class_name'} %>
```

## 第1引数
`:sort`


## 第2引数
`{'点数が高い順': 'score_desc', '点数が低い順': 'score_asc'}`

## 第3引数
`{selected: @search_params[:sort], include_blank: '選択して下さい'}`

## 第4引数
`{class: 'class_name'}`
MacのCyberDuckでトンネル接続

# MacのCyberDuckでトンネル接続

色々な方法がありますが、私がやっている簡単な方法をご紹介します。

## 手順

1. ~/.ssh/configに接続先を登録 
1. sshで対象ホストへ接続
1. CyberDuckで対象ホストへ接続

### 1. ~/.ssh/configに接続先を登録

```~/.ssh/config

# 踏み台
Host bastin
  HostName aaa.aa.aa.aaa # 踏み台のホスト名（IPアドレス)
  User bastin_user
  Port 22
  IdentityFile ~/.ssh/bastin.pem
  IdentitiesOnly yes

# 対象ホスト
Host target
  HostName bbb.bb.bb.bbb # 対象ホスト名（IPアドレス)
  User target_user
  Port 22
  IdentityFile ~/.ssh/target.pem
  ProxyCommand ssh -W %h:%p bastin
  LocalForward 2222 localhost:22
```

### 2. sshで対象ホストへ接続

```
% ssh target
[target_user@target ~]$ 
```

### 3. CyberDuckで対象ホストへ接続

- ホスト名：target
- ポート：2222
- ユーザ名：target_user
- SSH Private Key：~/.ssh/target.pem

![スクリーンショット 2022-02-02 12.58.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44351/29bf30ef-f3a3-de1d-7aaa-c2a40390c50f.png)
言語を比べると見えてくるもの

---
この記事は[リンク情報システム](https://www.lis.co.jp/)の「TechConnect！2022年2月」のリレー記事です。
engineer.hanzomon のグループメンバによってリレーされます。
（リンク情報システムのFacebookは[こちら](https://ja-jp.facebook.com/lis.co.jp/)から）

TechConnect！2022年2月のインデックスは[こちら](https://qiita.com/hs-lis/items/69eee14fd7bec92a854f)

---

#はじめに
初めて記事を書くので、何を書くかで悩みましたが、
IT業界に入って一番最初に気になったことにしました。

色々なプログラミング言語があるけれど、実際どの言語が何に適しているのか、
言語ごとの実際の内容の差はどうなのか……
今回は、どこでも聞いたことのある言語4つ程に絞って軽く書いていきます。

---

#言語毎の特徴と、利用されている分野

**■Java**
よく名前を聞く言語１位と言っても良いのではと言う言語

・特徴
　どんな環境でも使える、応用力が高い。
　需要が高く、教材が多いため勉強しやすい。
　Javaを学んでおくと、別の言語を勉強するときに便利。
・主に利用されている分野
　システム、WEB、アプリ開発と、様々な開発

**■Python**
最近よく聞くようになった言語、AI開発ならPythonとも聞きます
・特徴
　シンプルな記述で、コードが読みやすい・書きやすい。
　ライブラリが豊富。
・主に利用されている分野
　AI、WEB開発、データ分析

**■PHP**
WEBアプリ作るならと、聞く言語
・特徴
　需要が高く、教材が多いため勉強しやすい。
　フレームワークが豊富で、開発がしやすい。
・主に利用されている分野
　WEBアプリ開発

**■JavaScript**
聞いた時にJavaと似ていて混乱した言語、実際にはまったく別のもの
・特徴　
　非同期通信でWEBサイトを更新しなくても表示内容を更新できる動的なWEBサイトが作れる。
　環境構築の必要がない。
・主に利用されている分野
　WEB、アプリ開発


#コードから見る違い
特徴と利用される分野については分かったけど、
実際のコードではどのくらい違うか……
変数宣言の違いと、よく使われる条件分岐、知っていると便利な文字列関係の処理について書いていきます。

***■変数宣言***
[Java]
変数を宣言しないで変数に値を代入すると、エラーとなるため、変数の宣言は必須

```Java:
//変数の宣言
データ型 変数名;
//同じデータ型の変数を複数宣言
データ型 変数名1,変数名2,...;
```

[PHP]
宣言は必要なく、変数に値を入れられる

```PHP:
//変数の宣言なしで、変数名に値を代入
$変数名 = 値;
```

[Python]
PHPと同じく宣言は必要なく、変数に値を入れられる

```Python:
#変数の宣言なしで、変数名に値を代入
変数名 = 値
```

[JavaScript]
変数宣言をしないでも、参照前に値を変数に格納すればエラーとならない

```JavaScript:
//変数の宣言
var 変数名;
```

***■条件分岐式***
書き方に違いはあれど、ほとんど同じです。
Pythonがシンプルで書きやすい印象。

[Java/PHP/JavaScript]

```java:
if (条件式A) {
  条件式Aが真の場合に実行される処理
} else if (条件式B) {
  条件式Aが偽で条件式Bが真の場合に実行される処理
} else {
  すべての条件式が偽の場合に実行する処理
}
```
[Python]

```Python:
if  条件式A:
     条件式Aが真の場合に実行される処理
elif 条件式B:
     条件式Aが偽で条件式Bが真の場合に実行される処理
else:
     すべての条件式が偽の場合に実行する処理
```



**■文字列関係**
基本的には似通った感じだけれども、
PHPはバイト数か文字数かで細かく考えられる。

[Java]

```Java:
// 文字列の文字数を取得する
対象文字列.length()
// 文字列を置換
対象文字列.replace(置換対象文字列,置換する文字列)
// 文字列を正規表現で置換
対象文字列.replaceAll(正規表現,置換する文字列)
// 文字列を抽出
対象文字列.substring(切り出す開始位置)
// 開始、終了位置を指定して文字列を抽出
対象文字列.substring(切り出す開始位置,終了位置)

```
[PHP]

```php:
// 文字列のバイト数を取得する
strlen(対象文字列)
// 文字列の文字数を取得する
mb_strlen(対象文字列)
// 文字列を置換
str_replace(置換対象文字列,置換する文字列,対象文字列)
// 文字列を正規表現で置換
preg_replace(正規表現,置換する文字列,対象文字列)
// 文字列を抽出
substr(対象文字列,切り出す開始位置)
mb_substr(対象文字列,切り出す開始位置)
// 開始、終了位置を指定して文字列を抽出
substr(対象文字列,切り出す開始位置,終了位置)
mb_substr(対象文字列,切り出す開始位置,切り出す文字数)
```
[Python]

```Python:
# 文字列の文字数を取得する
len(対象文字列)
# 文字列を置換
対象文字列.relpace(置換対象文字列,置換する文字列)
# 文字列を正規表現で置換
re.sub(正規表現,置換する文字列,対象文字列)
# 文字列を抽出
対象文字列[切り出す開始位置:]
# 開始、終了位置を指定して文字列を抽出
対象文字列[切り出す開始位置:終了位置]

```

[JavaScript]

```JavaScript:
// 文字列の文字数を取得する
対象文字列.length()
// 文字列を置換
対象文字列.relpace(置換対象文字列,置換する文字列)
// 文字列を正規表現で置換
対象文字列.replace(正規表現,置換する文字列)
// 文字列を抽出
対象文字列.substr(切り出す開始位置)
// 開始、終了位置を指定して文字列を抽出
対象文字列.substr(切り出す開始位置,終了位置)
```

#最後に

こうして改めて書き出してみると、共通点が見えてきて中々面白かったです。

基本的には１つの言語を勉強して、他の言語を勉強すると思うので、似たような言語だったら勉強する時間も少なくてすみそうですし、別言語での実装とかも比較的簡単になるのかなと……

今回まとめた内容は少しですし、まだまだ沢山の言語があるので、気になる言語があったら知ってる言語とどう違うのかといった観点で見てみるのも良いかもしれませんね