OmniAICreator/Qiita-1.07M huggingface dataset:
Financial-grade API Security Profile 1.0 - Part 2: Advanced 5.1.1. ID Token as Detached Signature メモ


* Financial-grade API Security Profile 1.0 - Part 2: Advanced 5.1.1. ID Token as Detached Signature についての個人用メモ。

## ID Token as Detached Signature

* レスポンスパラメータが改竄されていないことを確認するための機能

* **処理の流れ**
  * 認可サーバーは、`code` や `state`(ID トークンとは別に渡されるレスポンスパラメータ)のハッシュ値を ID トークンの中に埋め込む。
  * レスポンスを受け取ったクライアントは、「レスポンスパラメータのハッシュ値」と、「ID トークンに埋め込まれているハッシュ値」が一致することを確認する。
     * `s_hash`:`state`パラメータのハッシュ値
     * `c_hash`:`code`パラメータのハッシュ値

![id_token_ds.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/8aacac21-c1a8-210e-ea18-3502084ff4fe.png)

    

* クライアントアプリは`response_type`リクエストパラメータに `id_token` を含める必要がある。

  * `response_type=code+id_token`

* IDトークン例

  ```txt
  eyJraWQiOiJzZXJ2ZXItMjAyMC0wOC0yOCIsImFsZyI6IlBTMjU2In0.eyJzdWIiOiIxMDAxIiwiYXVkIjoiNTI0ODA3NTQwNTMiLCJjX2hhc2giOiJRUjJ6dWNmWVpraUxyYktCS0RWcGdRIiwic19oYXNoIjoiOXM2Q0JiT3hpS0U2NWQ5LVFyMFFJUSIsImF1dGhfdGltZSI6MTU5NDE0MDA5MCwiaXNzIjoiaHR0cHM6XC9cL2ZhcGktYXMuZXhhbXBsZS5jb21cLyIsImV4cCI6MTU5NDE0MDM5MCwiaWF0IjoxNTk0MTQwMDkwLCJub25jZSI6Ijd4RENIdml1UE1TWEpJaWdrSE9jRGkifQ.Z-LpQRuYoiTqEBfVfctn-e6bLwSMqi8wA3TuARGW6GyD05gPF6TVlUwHgJnSUlhETrzhEUAKKiyGDxGspuBU0OAnB4qepgrEBizk980NjCEVXNkogv0ANv9VX_01Lcl0d_6_c-AUjwDSuKY8rDfvggKSJFzRilbQuB8b1drAIAZpc6kMObY3PcQZ_vKTMsQ8l
  HCuXXRuAo__0xRE6l_iiRCos_940GrJr0Sih9uTQpnCWBoEab1dC0l-vUp4lP0TQRKNpDoPoMOj10KJA8T8pKhjZ8TKM-wo9A4qH2LBgUIYJyjd8bWfKTZxCNmLRzRr-_JBG7fF_fpOUhGT_DhzMw
  ```

* IDトークン/デコード結果例

  ```json
  {
    "sub": "1001",
    "aud": "52480754053",
    "c_hash": "QR2zucfYZkiLrbKBKDVpgQ",
    "s_hash": "9s6CBbOxiKE65d9-Qr0QIQ",
    "auth_time": 1594140090,
    "iss": "https://fapi-as.example.com/",
    "exp": 1594140390,
    "iat": 1594140090,
    "nonce": "7xDCHviuPMSXJIigkHOcDi"
  }
  ```

  

## 参考情報

* [Financial-grade API Security Profile 1.0 - Part 2: Advanced 5.1.1. ID Token as Detached Signature](https://openid.net/specs/openid-financial-api-part-2-1_0-final.html#id-token-as-detached-signature)
nRF5x 開発時に Port番号を変更する方法

***はじめに***
Nordic nRF5x シリーズにて Port番号を変更する方法についてのメモ書き

ここで用いた開発環境は、nRF5 SDK であり下記からダウンロード出来る。
[https://www.nordicsemi.com/Products/Development-software/nRF5-SDK/Download](https://www.nordicsemi.com/Products/Development-software/nRF5-SDK/Download)

参考：[https://qiita.com/ytetsuo/items/213e8d047273841cf3d9](https://qiita.com/ytetsuo/items/213e8d047273841cf3d9)

---
***変更するファイルの置き場所***

C:\nRF5_SDK_xx.x.x_xxxxxxx\components\boards に置かれている該当する header File を編集する。

header File の名前は、以下を参照のこと
[https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_gsg_ses%2FUG%2Fgsg%2Fchips_and_sds.html](https://infocenter.nordicsemi.com/index.jsp?topic=%2Fug_gsg_ses%2FUG%2Fgsg%2Fchips_and_sds.html)

~~~pcaxxxxx.h
--省略--
#define SPIS_MISO_PIN   28  // SPI MISO signal.
#define SPIS_CSN_PIN    12  // SPI CSN signal.
#define SPIS_MOSI_PIN   25  // SPI MOSI signal.
#define SPIS_SCK_PIN    29  // SPI SCK signal.
--省略--
~~~

---
☆2022年 2月12日(土) 午前10時20分 初版(Ver1.00) 作成
【Rails,Ruby】ページタイトルヘルパーを三項演算子でシンプルに

# 三項演算子

三項演算子(ternary operator)とは、if文を簡略化する書き方の一つ。
その意味合いは、ternary（三つの要素からなる）という言葉とoperator（演算子）という言葉を組み合わせたもの。
具体的には、下記のように「?」と「:」という演算子を使って、if, else, end という三つの要素を一行で書けるというもの。

* if文による書き方

```ruby
if name=="Taro"
  "Yes, I am Taro"
else
  "No, I am #{name}"
end
```


* 三項演算子による書き方

```ruby
name=="Taro" ? "Yes, I am Taro" : "No, I am #{name}"
```
# ページタイトルヘルパーへの応用

この書き方を利用して、ページタイトルヘルパーもシンプルに書ける。
（page_titleは ```provide(:title, 'タイトル名')```でページごとに与える。）

* 変更前

```ruby:application_helper.rb
module ApplicationHelper
  BASE_TITLE = "HOGE".freeze
  def full_title(page_title)
    if page_title.blank?
      BASE_TITLE
    else
      "#{page_title}  -  #{BASE_TITLE}"
    end
  end
end
```


* 変更後

```ruby:application_helper.rb
module ApplicationHelper
  BASE_TITLE = "HOGE".freeze
  def full_title(page_title)
    page_title.blank? ? BASE_TITLE : "#{page_title}  -  #{BASE_TITLE}"
  end
end
```
Teams版 Power Viratual Agents のフローをコピーする方法

#はじめに

Teams版Power Virtual Agetns で作成した Power Automate フローは [名前をつけて保存] すると、別名で複製が作成できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/35726cff-b29b-a68f-9561-71e5cb6c3d6a.png)

これはフローのバックアップやブランチに利用できる便利な機能です。
しかし、複製されたフローは、ぱっと見どこに作成されたのかわかりません。
また、そのままでは Power Virtual Agetns のチャットボットから呼び出すこともできません。

* 複製の手順
* 複製をチャットボットから呼び出す手順

を、Microsoftサポートよりご教示いただいたので記載します。（自分メモを兼ねて）

#フローの複製方法

Teams版Power Virtual Agnets チャットボットで[フローの詳細を表示]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/a39bf889-f889-f573-dd3c-821cd3e3069f.png)

フローの概要画面で、[名前をつけて保存]を選び、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/36b634b2-7d73-9a6b-3977-7ffcc6a7196d.png)

任意の名前を入力し、[保存]します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/4979b5fd-9066-420b-601d-3fdc703781f8.png)


#複製したフローはどこに？

複製したフローは、チャットボットを作成したTeamsチームの環境に作成されています。

[Power Automate ポータル](https://japan.flow.microsoft.com/])にログインし、[環境]を複製元フローの存在するチームに環境を変更します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/31bab046-b347-9f7e-425d-80277657ea84.png)

[マイ フロー]にコピーしたフローが作成されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/2103ff64-6ce8-5144-5c5d-e7f29ba0bbac.png)


#複製したフローをチャットボットで呼び出すには・・・

上記と同じく、[Power Automate ポータル](https://japan.flow.microsoft.com/])にログインし、[環境]を複製元フローの存在するチームに環境を変更します。
[ソリューション]を選び、[Common Data Services Default Solution]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/3fa2358e-fd89-1eab-0c2a-7a7cdba6d7ce.png)

[既存を追加]－[自動化]－[クラウド フロー]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/75d7210c-c914-5af4-3a9c-2d8333c68b41.png)

表示されたペインで[Dataverseの外部]をクリックし、複製したフローを選択し[追加]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/cba97f59-84b8-ad0c-1b27-4c8c07749ef4.png)


追加したフローは[有効にする]にせずにチャットボットから呼び出すと、チャットボットの応答がエラーとなりますので注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/70c5c4e5-3446-ad7a-76aa-419d7d130e92.png)

これで、チャットボットから複製したフローを呼び出すことが可能となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/480768/5027ada9-058e-92cb-a956-8a18641dc021.png)

#まとめ

Teams版PVAで作成した フローを[名前をつけて保存]すると、所属するTeamsチームの環境に作成されます。
作成時は、どのソリューションにも属しません。
複製したフローは、「Common Data Services Default Solution」ソリューションに追加し、有効にするとチャットボットから呼び出しが可能となります。

Power Automateには残念なたらバージョン履歴を管理する機能がありません。
よって、自身で断片をコピーし履歴にする必要があります。
本記事の方法でフローのコピーを有効活用いただけたら幸いです。
vistaでillustrator その7

#概要

vistaでillustratorやってみる。
アートボード作って、jpg読んで、png出力してみた。

#写真

![ill6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/d5ba2b6e-c669-ff97-fec9-74daa681d6a0.png)


#サンプルコード

```

var docRef = documents.add(DocumentColorSpace.RGB, 800, 800);
var jpgFilePath = "/Users/ore/eki.jpg"
var rasterFile = File(jpgFilePath);
var myPlacedItem = docRef.placedItems.add();
myPlacedItem.file = rasterFile;
myPlacedItem.position = Array(0, docRef.height);
myPlacedItem.embed();
var pngOpt = new ExportOptionsPNG24();
pngOpt.artBoardClipping = true;
var filePath = new File("/Users/ore/ill6.png");
activeDocument.exportFile(filePath, ExportType.PNG24, pngOpt);
alert("ok");




```

以上。
VRChatでグローバルなミラーを作る

#1. この記事は

VRchatで表示をON,OFFできるミラー(鏡)をコーディングする方法です。ミラーをON/OFFさせたときにワールドの参加者全員にON/OFFを反映(同期)できるようにします。かつ後からワールドに入室したユーザーに対してもミラーの状態を同期できるようにします。


![309.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/742ff306-28d9-1b0f-2b7c-fefe57c60f3d.jpeg)


#2.どのようにするのか？

# 2-1 オブジェクトの準備

Asset -> VRChatExample -> Prefabs からVRCMirror を描写画面にドロップします。

![310.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/fa4a30d2-d532-6126-9345-1f03c0b672c8.jpeg)

VRChatExampleのInspectorのTransformの数値を設定して大きさを調整します。
![311.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/cb05aa5e-5355-2788-433b-cc32e6616c83.jpeg)

ミラーのON/OFFの切り替えスイッチの働きを担うCubeを配置します。
![313.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/579e78eb-2c9a-a543-6dc1-7d1a255f4b9a.jpeg)
![312.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/da9f9044-0f8f-30fd-7429-38df94824f31.jpeg)

# 2-2 UDON# コーディングの準備

Cubeのオブジェクト名は「mirror sw」とします。hierachy windowで「mirror sw」を選択し、Inspector windowのAddComponentをクリックします.
![314.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/6f738e84-bd92-da0a-c53d-4797e5f99b5c.jpeg)

Udon Behaviourを選択します。選択後、Udon Behaviorの欄が表示されるので、「Udon C# Program Asset」を選択のうえ、「New Program」をクリックし、C#のコードが編集できるファイル(.csファイル)を生成します。
![315.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/32c48384-22dc-c286-ec4b-f576e11765a3.jpeg)


# 2-3 UDON# コーディングの実施

2-2節で作成した.csファイルをオープンにし、下記のコードを入力します。

```C#:mirror.cs
using UdonSharp;
using UnityEngine;
using VRC.SDKBase;
using VRC.Udon;

public class mirrorsw4 : UdonSharpBehaviour
{

    [SerializeField] private GameObject Mirror; //ミラーオブジェクト本体
    [UdonSynced(UdonSyncMode.None)] private bool mirrorEnable;  //mirrorEnableは同期変数である。


    //後から入室したユーザーにも初めから鏡の状態を反映する。
    void Start()
    {   
        RequestSerialization();  //mirrorEnableの値を後からワールドに入出したユーザーに対して同期を実施するコマンド
    }


    //OnDeserialization 変数の同期が行われると呼び出されるメソッド。このメソッドでワールドのユーザー全員に対してミラーの状態を同期する。
    public override void OnDeserialization()
    {
        Mirror.SetActive(mirrorEnable);  //mirrorEnable=trueの時は、ミラーを表示させる。mirrorEnable=falseの時は、ミラーを消す。
    }


    //スイッチを押した人を「オーナ」にする関数
    public override void Interact()
    {
        //スイッチを押した人を「オーナ」にする命令
        if (!Networking.IsOwner(Networking.LocalPlayer, this.gameObject)) Networking.SetOwner(Networking.LocalPlayer, this.gameObject);

        //すべてのプレイヤに「public void mirrorOn()」を実行させる（同期させる）命令
        SendCustomNetworkEvent(VRC.Udon.Common.Interfaces.NetworkEventTarget.All, "mirrorOn");
    }

    //ボタンを押すとミラーをON/OFFする機能を担ってる。
    public void mirrorOn()
    {
        mirrorEnable = !mirrorEnable; //ミラーがONのときはOFFに、OFFのときはONに切り替える。
        Mirror.SetActive(mirrorEnable);  //mirrorEnable=trueの時は、ミラーを表示させる。mirrorEnable=falseの時は、ミラーを消す。

    }
}

```


「mirror sw」を選択し、Inspector windowにオブジェクト名「Mirror」が表示されるので、hierachy windowの「VRCMirror」をInspector windowのMirrorにアタッチメントを行います。

![316.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/202ee11d-0648-d69c-fa59-75a7eb268550.jpeg)


作業はここまでです。お疲れさまでした。これで、グローバルかつ後からワールドに入室したユーザーに対してもミラーのON/OFFの状態の同期ができると思います。
Railsで日本語ヘッダのCSVを読み込む


# Railsで日本語ヘッダを持つCSVファイルを読み込む
想定: ユーザにCSVをアップロードしてもらい処理を行う。その際のヘッダー名に日本語を使いたい場合の書き方
結論: i18_nを使ってマッピングします。

## サンプルCSV
```
名前,かな
テスト,てすと
太郎,たろう
```

## いまいちな書き方
```
CSV.foreach("user.csv", headers: true) { |row| puts row['名前'] }
テスト
太郎
```
いまいちな理由

- headerを日本語以外に変更する場合にコード修正が必要になる
- インスタンスを作成する場合のコードが冗長になる

```
User.new({name: row['名前'], kana: row['かな']})
```
2カラムぐらいなら問題ないですが、増えてくると可読性が下がります。

## おすすめの書き方
`config/locales/models/user.ja.yml` を作成してマッピングを行います。

### マッピング用ymlファイル
```
ja:
  activerecord:
    attributes:
     user:
      headers:
        name: 名前
        kana: かな
```

これを使って、マッピングします。

```
headers = I18n.t('activemodel.attributes.user.headers')
CSV.foreach("user.csv", headers: true) { |row| puts headers.to_h {|k, v| [k, row[v]]} }
{:name=>"テスト", :kana=>"てすと"}
{:name=>"太郎", :kana=>"たろう"}
```
こうなります。
この状態であれば、英語を追加したい場合はen.ymlを追加すれば済みます。
またインスタンスを作成する際にもサクッとできます。

```
User.new({headers.to_h {|k, v| [k, row[v]]}})
```
PythonでFXチャートを表示してみる API編

PythonでFXチャートを表示するのをGoogle Colabでやってみます。
https://colab.research.google.com

【相場分析】移動平均線の傾きをPythonで算出する
https://qiita.com/kazama1209/items/5b558b599923283df9fa

Twelve Data 株、為替、仮想通貨といった金融商品の情報を取得できるサービス。
https://twelvedata.com

```
!pip install twelvedata websocket mplfinance
```

```
import datetime
import pandas as pd
import mplfinance as mpf
from twelvedata import TDClient

TWELVE_DATA_API_KEY = '****************************' # Twelve Data のAPIキー

# ヒストリカルデータを取得
def get_historical_data(symbol, interval, outputsize, start_date, end_date, timezone):
    td = TDClient(apikey = TWELVE_DATA_API_KEY)

    res = td.time_series(
              symbol = symbol,
              interval = interval,
              outputsize = outputsize,
              start_date = start_date,
              end_date = end_date,
              timezone = timezone
          ).as_json()

    df = pd.DataFrame(res).iloc[::-1].set_index('datetime').astype(float)
    df = df[df.index >= start_date]
    df.index = pd.to_datetime(df.index)

    return df
```

```
# 銘柄
symbol = 'USD/JPY'

# 時間軸
#interval = '15min'
interval = '1h'

# 取得件数
#outputsize = 1000
outputsize = 20

# 取得開始日
start_date = '2022-01-03'

# 取得終了日
#end_date = datetime.datetime.now().strftime('%Y-%m-%d')
end_date = '2022-01-04'

# タイムゾーン
timezone = 'Asia/Tokyo'

# ヒストリカルデータを取得
df = get_historical_data(symbol, interval, outputsize, start_date, end_date, timezone)

df
```

![スクリーンショット 2022-02-12 10.49.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124454/e4f8bec3-700b-31da-52ea-1269d9725110.png)

```
# 2022/1/3 5:00 - 23:00
mpf.plot(df[0:19], figratio=(12,4), type='candle', style="yahoo")
```

![スクリーンショット 2022-02-12 10.49.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124454/086a158d-6504-7327-de34-4c7bcb93157c.png)
Azure Policy でリソースグループ内のリソースに自動で同じタグを付与する

## 背景と目的

Azure で作成するリソースをテナント、サブスクリプション、リソースグループをグルーピングする単位として組織やチーム、プロジェクトや本番開発環境ごとに割り当てて使用されているケースがほとんどでは無いかと思います。タグは、テナント、サブスクリプション、リソースグループをまたがって何かしらをグルーピングしたい時に使用するものですが、マイクロソフトのタグ関連のドキュメンのサンプルにも CostCenter というキーワードが出てくるように、このリソースはどこどこ組織やどこどこチームのコストとして集計したい場合が多いように感じます。もちろん、高度に自動化した組織やチームであれば、タグで自動化処理のグルーピング単位を管理して使っていたりと別の用途も考えられます。

今回はリソースグループ単位でチームを分けているケースにおいて、基本的にはリソースグループに付けられている CostCenter タグと同一の値をリソースグループ内のリソースに付与するものの、ある特定のリソースだけ別のチームにコストを負担してもらうため CostCenter タグに違う値を設定する、というのを試してみます。

## 前提条件

コマンドの実施環境は、Azure Cloud Shell + Azure CLI です。

```bash:bash
$ az version
{
  "azure-cli": "2.33.0",
  "azure-cli-core": "2.33.0",
  "azure-cli-telemetry": "1.0.6",
  "extensions": {
    "ai-examples": "0.2.5",
    "ssh": "1.0.0"
  }
}
```

## 検証用のリソースグループを作成

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrtagtest

# リソースグループをタグ付きで作成します
az group create \
  --name ${prefix}-rg \
  --location $region \
  --tags CostCenter=MyTeam
```

## リソースグループのタグを自動でリソースに付与する Azure Policy を作成

```bash:bash
# CostCenter タグを自動追加する設定を作成します
az policy assignment create \
  --name ${prefix}-rg-tag-costcenter \
  --scope $(az group show \
    --name ${prefix}-rg \
    --query id \
    --output tsv) \
  --policy $(az policy definition list \
    --query "[?displayName=='Append a tag and its value from the resource group'].name" \
    --output tsv) \
  --params '{"tagName": {"value": "CostCenter"}}'
```

## リソースを作成してタグが自動追加されているか確認

```bash:bash
# 仮想ネットワークをタグなしで作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet

# リソースグループ内のタグを確認します
az resource list \
  --resource-group ${prefix}-rg \
  --query "[].{Name:name, CostCenter:tags.CostCenter}" \
  --output table 

Name             CostCenter
---------------  ------------
mnrtagtest-vnet  MyTeam
```

## リソースを作成してタグに任意の値が設定されているか確認

```bash:bash
# 仮想ネットワークをタグ付きで作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet-otherteam \
  --tags CostCenter=OtherTeam

# リソースグループ内のタグを確認します
az resource list \
  --resource-group ${prefix}-rg \
  --query "[].{Name:name, CostCenter:tags.CostCenter}" \
  --output table 

Name                       CostCenter
-------------------------  ------------
mnrtagtest-vnet            MyTeam
mnrtagtest-vnet-otherteam  OtherTeam
```

## 参考

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg
```

下記は、参考サイトです。

<https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/management/tag-resources?tabs=json#azure-cli>

<https://docs.microsoft.com/ja-jp/azure/governance/policy/tutorials/govern-tags>
【Mac】 ターミナルのBashプロンプトの変更



現状の私のターミナルの表示

```:ターミナル
For more details, please visit https://support.apple.com/kb/HT208050.
jinske727:~ imafukukoushi$ 
```

これから、作業した内容をアウトプットをしていく前準備として、
＄の前の本名が出力されてしまう仕様を変更します。

ターミナルの$前の出力フォーマットは、
Macでは、環境変数 PS1 で指定されている。
現在の PS1 の内容を出力すると、

```:ターミナル
jinske727:~ imafukukoushi$ echo $PS1
\h:\W \u\$
jinske727:~ imafukukoushi$ 
```

|値　 |意味|  
|---|---|
|\h |ホスト名（最初の.まで） |
|\W  |現在のディレクトリ名   |
|\u  |ユーザー名  |

現状の環境変数PS1設定は下記

```
PS1＝ホスト名:現在のディレクトリ名 ユーザー名$
```

今回はとりあえず、これに変更する

```
PS1=ホスト名@現在のディレクトリ名
```

##設定方法
**開発環境の環境変数内**に設定する
※開発環境の環境変数とは「.zshrc」というディレクトリのこと

viコマンドで.zshrcファイルを編集する

```:ターミナル
vi .zshrc
```
viのインサートモードで表示したいプロンプトを設定する
今回、私の場合、
PS1＝ホスト名:現在のディレクトリ名 ユーザー名$で設定したいので、
下記を追加

```:.zshrc
export PS1="\h@\W$"
```
追記したら、escキーを押し、:wqで内容を保存しviエディタから抜ける。
最後に、sourceコマンドにてターミナル上で設定を反映させる。

```:ターミナル
source ~/.zshrc
```


求めているプロンプトの出力を確認できたら設定完了。

```:ターミナル
jinske727@~$
```

以上
Python:NFC


#1.準備

##1-1.Windows
[ここ](https://qiita.com/mizutoki79/items/da903fe5a86fe4087429)を参考に準備

##1-1.Mac
```bash
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
```
fetchがうまくいかない場合は一度、アンイストールしてからもう一度インストール

lsusbをインストール(ターミナル）

```bash
brew tap jlhonora/lsusb
```

```bash
brew install lsusb
```


##1-2.ライブラリのインストール(ターミナル）

```bash
pip install nfcpy
```

##1-3.NFCリーダー
NFCリーダーはsonyの[RC-S380/S](https://www.amazon.co.jp/%E3%82%BD%E3%83%8B%E3%83%BC-NFC%E9%80%9A%E4%BF%A1%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC-PaSoRi-RC-S380-S/dp/B00VR1WARC)でうまくいきました。
RC-S300だとうまくいかなかった。（原因はちゃんとしらべていない）

##1-4.接続
NFCリーダーをパソコンに接続しましょう。

##1-5.確認
PyCharm等で下記のプログラムを実行してみましょう。

```py
import nfc

clf = nfc.ContactlessFrontend('usb')
print(clf)
```


#2.プログラム

下記のプログラムをコピペして実行してみてください。
NFCタグや学生証などをカードリーダーにかざすと
【 Touched 】
離すと
【 Released 】
と表示されるはずです。このプログラムで読み取りはできません。

```py
import nfc

class CardReader(object):
    def on_connect(self, tag):
        #タッチ時の処理
        print("【 Touched 】")
        return True

    def read(self):
        clf = nfc.ContactlessFrontend('usb')
        try:
            clf.connect(rdwr={'on-connect': self.on_connect})
        finally:
            clf.close()


cr = CardReader()
while True:
    #最初に表示
    print("Please Touch")
    #タッチ待ち
    cr.read()
    #リリース時の処理
    print("【 Released 】")
```

#FeliCaカードの内容を読み取る
FeliCaカードの内容を読み取るプログラム

```py
import binascii
import nfc

def connected(tag):
  print (tag)
   
  if isinstance(tag, nfc.tag.tt3.Type3Tag):
    try:
      print('  ' + '\n  '.join(tag.dump()))

    except Exception as e:
      print ("error: %s" % e)
  else:
    print ("error: tag isn't Type3Tag")
   

clf = nfc.ContactlessFrontend('usb')
clf.connect(rdwr={'on-connect': connected})
```

#NFCタグの内容を読み取る
[NFCタグ](https://www.sanwa.co.jp/product/syohin?code=MM-NFCT)のレコードの内容を読み取るプログラム

```py
import binascii
import nfc

def connected(tag):
    print(tag)
    records = tag.ndef.records
    for record in records:
        print(record.text)


clf = nfc.ContactlessFrontend('usb')
clf.connect(rdwr={'on-connect': connected})
```
お名前ドットコムのMicrosoft365プランで独自ドメインのメールを送受信する。（その３：Microsoft365のセットアップ）

# はじめに
前回はMicrosoft 365で独自ドメインを使えるようにしたため、今回はMicrosoft 365の各種セットアップを行っていきます。

- 【前】[お名前ドットコムのMicrosoft365プランで独自ドメインのメールを送受信する。（その２：独自ドメイン追加）](https://qiita.com/sakai00kou/items/70859fec34a799f0b09d)
- 【次】[お名前ドットコムのMicrosoft365プランで独自ドメインのメールを送受信する。（その４：DKIM、DMARC設定）](https://qiita.com/sakai00kou/items/252dd97f81706cd1d176)

# ユーザ情報の修正
デフォルトで登録されているユーザは、「**admin@xxxxxxxx.onmicrosoft.com**」といったMicrosoftドメインの管理者ユーザとなるため、前回登録したドメインと任意のユーザ名に修正します。

「**Microsoft 365 管理センター**」より、「**ユーザー**」→「**アクティブなユーザー**」で、デフォルトで登録されているユーザの「**ユーザー名の編集**」を選択します。

![activeuser.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d8d0dae4-e2c7-b9f3-2e99-487327bab627.jpeg)

ユーザ名修正ウィンドウが開くため、任意のユーザ名と追加した独自ドメインを選択して、「**設定の保存**」を行います。

![user_config.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/ed6eed2f-677b-3e11-f230-2f1dbe6c361a.jpeg)

変更を行うと、自動的にサインアウトされるため、先ほど設定したユーザ情報を入力し、再度サインインします。

# ユーザへのライセンスの割り当て
先ほど修正したユーザにはまだライセンスが登録されていないため、「**Microsoft 365 Business Standard**」ライセンスを割り当てます。

先ほどと同様「**Microsoft 365 管理センター**」より、「**ユーザー**」→「**アクティブなユーザー**」から、ライセンスを割り当てたいユーザ名の「**ライセンスとアプリ**」タブを選択。

「**ライセンス**」は「**Microsoft 365 Business Standard**」、ライセンス下に表示される「**アプリ**」はデフォルトのまま、全て選択として「**設定の保存**」を行いました。

![license.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b2019458-8b6e-2f20-6431-80121cc28949.jpeg)

設定変更後、「**アクティブなユーザー**」の「**ライセンス**」列が「**Microsoft 365 Business Standard**」に変更されれば完了です。

# Officeアプリケーションのインストール
「**Microsoft Office ホーム**」の「**Officeのインストール**」→「**その他のインストールオプション**」を選択。

![office_install1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/273c7d86-c82c-2a2e-0e6b-71d61cc33826.jpeg)

「**マイアカウント**」画面に遷移するため、「**Officeのインストール**」を選択して、インストーラをダウンロード＆インストールを行います。

![office_install2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/a6e42704-f516-bbbb-2b74-34a74abb4988.jpeg)

# メール送受信の確認
ここまでの設定を行えば、独自ドメインでメールの送受信ができるようになっているはずなので、先ほど「**ユーザー名の管理**」で変更した独自ドメインのメールアドレスに対して、任意のメーラーから送信しておきます。

先ほどインストールした「**Outlook**」で以下のように受信できていればOKです。

![mail.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/223bf894-2799-c485-842f-4e2ab1bca0f2.jpeg)

同じく、「**Outlook**」から別のメールアドレスに対して送信して、受信できていれば完了です。

# おわりに
今回で基本的なMicrosoft 365のセットアップが完了したため、これで独自ドメインでメール送受信もできるようになりました。

ちなみに「**Microsoft 365 Business Standard**」ではメールサーバ容量は1ユーザごとに50GB割り当てとなるため、容量としては十分だと思います。

次回は、独自ドメインのメールセキュリティを向上させてみようと思います。
iPhoneでPython + OpenCVを試してみる

#はじめに
iPhoneでPython + OpenCVができるというのを読んで、やってみることにしました。環境構築は@yamamido0268さんの記事

https://qiita.com/yamamido0268/items/e1172d25072da1687c49

を参考にしました。

使用するのは手持ちのiPhone SE2です。今となってはもう古い機種ですが、2つの高性能CPUコアと4つの高効率CPUコア、GPUは4コア、Neural Engineは8コアを備えた、立派なコンピュータです。(Appleの公式情報ではありません)。OSは由緒正しいバークレーUNIXの末裔です。ひと昔前は、こんなスペックのワークステーションは大学か大企業の研究室にしかなかったんですよねえ。

#準備
PytoをApp Storeからダウンロードします。これを書いている時点(2022/2/12)では¥1200でした。

起動して新しいディレクトリを作り、そこを作業ディレクトリとします。
CreateメニューからBlankで空のファイルを作り、前回の記事でMacで使ったコードをメモ帳経由でコピペします。

前回の記事

https://qiita.com/tnar-f/items/b5d5ae1a2acc31d63ce8



作業ディレクトリに実験用ビットマップをコピーしておきます。このディレクトリがコード実行時のカレントディレクトリになります。これまでの実験で使ってきた1920 x 1200約230万画素のグレースケールのBMPファイルです。
画面右上の実行ボタンで実行開始します。

#実行


![スクリーンショット 2022-02-12 8.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517091/33fa6bdb-02df-d88f-7951-008e9d35ce2c.png)

#1.2ミリ秒!
速っ！
（　 Д ）　ﾟ　ﾟ

これってWindowsでCore-i5@2.6GHzを使ってやったときの3倍近く速く、M1 Mac(2020)の時の半分の速度です。

以下、結果画像の一部を拡大したものです。しっかりBlurしてますよね。
![スクリーンショット 2022-02-12 8.38.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2517091/32014f64-89c2-2a64-a687-5f8505458a85.png)

いやもう、驚愕のひとことです。

OpenCVを開発しているみなさんありがとう。
Pytoの開発者さんありがとう。
Appleさんありがとう。
Jobsさんありがとう。
AWS S3 で公開されているページをローカルで表示する

ページを公開する方法はこちら
[AWS S3 でページを公開する](https://qiita.com/ekzemplaro/items/dc2a8403c2096c232cff)

バケット名を調べる方法

```bash
aws s3 ls
```

公開されているページをダウンロードする方法

```bash
aws s3 cp s3://test-s3 build --recursive
```

サーバーの起動にはいくつか方法があります。

serve を使う方法

```text
$ serve build

   ┌─────────────────────────────────────────────────┐
   │                                                 │
   │   Serving!                                      │
   │                                                 │
   │   - Local:            http://localhost:3000     │
   │   - On Your Network:  http://192.168.1.6:3000   │
   │                                                 │
   │   Copied local address to clipboard!            │
   │                                                 │
   └─────────────────────────────────────────────────┘
```

http-server を使う方法

```text
$ http-server build
Starting up http-server, serving build
Available on:
  http://127.0.0.1:8080
  http://192.168.1.6:8080
  http://10.64.227.1:8080
Hit CTRL-C to stop the server
```
vue3.0+setup構文+vue-router4.0+typescriptでAuth0を動かす(non-plugin)

Auth0の公式サイトのサンプルは少し古いのとで色々探す。
vue3.0とtypescriptなのは日本語も含めいくつかサンプルも見つかる。

しかし、Vueプラグインを使うのがほとんどでVScode使うときの、インテリセンス？が出ないのでプラグインは避けたい。

いくつかのサンプルを組み合わせて動かしました。

https://github.com/alexeyzimarev/auth0-vue3-ts
こちらはコピペだけで動きました！
ただ、プラグイン使ってるので少し嫌。
こちらをプラグイン無しに改造するのは少し手間がかかりそうです。

https://github.com/Hawxy/auth0-vue-samples/tree/vue-3
そこでこちらのサンプル。
vue-router4.0だと少し怒られます。

手順としては
・authフォルダの２ファイルを作成＆コピペ
・App内で初期化
・router内でナビゲーションガード設定

```useAuthService.ts
// ログイン後にどのページに遷移するか設定できるようにします。
// 標準だとリダイレクトに与えたアドレスを無視してしまいます。

const DEFAULT_REDIRECT_CALLBACK = async (appState: any) =>
  router.replace(appState.targetUrl);
```

```useRouterGuard.ts
import { NavigationGuardNext, RouteLocationNormalized, NavigationGuardWithThis } from 'vue-router';
// RouteGuardに型を与えるため修正

export const useRouteGuard: NavigationGuardWithThis<undefined> | NavigationGuardWithThis<undefined>[] = (to: RouteLocationNormalized, from: RouteLocationNormalized) => {

    const verify = async () => {
        // If the user is authenticated, continue with the route
        if (isAuthenticated.value) {
            return true;
        }
        // Otherwise, log in
        await loginWithRedirect({ appState: { targetUrl: to.fullPath } })
        return false;
    }
// 非同期に変更
```

```App.vue
<script setup lang="ts">
import { onMounted } from 'vue'
import { useAuth } from './auth/useAuthService'
const { initializeAuth } = useAuth();

// Authorizationの初期化
onMounted(() => {
  initializeAuth({
            domain: 'XXXXXXXX.jp.auth0.com',
            client_id: 'XXXX000000XXXXXXAAAAAAAAAA',
            redirect_uri: window.location.href,
        audience: "", //process.env.VUE_APP_AUTH0_AUDIENCE as string,
        scope: "" //'openid profile email'
      });
})
</script>
// setup構文内に移す。
```

これで2022/02/12時点のvue最新環境で動くのではないでしょうか。

始めは1ページの中で試行錯誤しようとしましたが、Loginした後に、callbackを呼ぶタイミングの制御が出来ずこのような形になりました。
自作の習慣化アプリを使って自作アプリの改善を習慣化していく男の物語

# はじめに
先日、ポートフォリオとして作った習慣化アプリの開発ストーリー書いたのですが、思ったほど反響が得られず、少しだけ凹みました。
（その中でもLGTM,ストックしてくれた方、ありがとうございました）

https://qiita.com/rickeysan95/items/edc79d913c6cf8298393

自分としては頑張ったつもりでも、UI/UXも商用のものと比較すると明らかに質が下がりますし、未経験の方でもやる人はもっと作り込んでくるのかなとも思います。この結果は至極当然の結果だと今は思います。
モチベーションが下がってしまいました。しかし、そんな自分にこの言葉を送りたいです。

**「モチベーションが下がった時でも、物事を継続できるようにお前は習慣化アプリを作ったんじゃないのか！？」**

全くもってその通りです。

**「この習慣化アプリがあれば、俺に習慣化できないことはない！！」**

そこで自作アプリをぽちぽちして、目標を立てました。

![EAFA40FC-4F81-4228-9B42-304F09890EB5.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/32c9b3fa-4773-fe86-7a0a-3b03d5306518.jpeg)

まず自分でアプリを使ってみて思ったのは、使えば使うほどバグが出てくることです。それほど機能は多くないはずですが、リンクが切れていたり、デザインの崩れが散見されます。まだまだ完成度は高くないということを実感しました。

さて、目標は「毎日このアプリを使って、このアプリの問題点・改善点を最低でも一つ考える」です。その目標を継続するためのIf-Thenプランニングは、「問題点・改善点が思いつかなかったら、Daigoの本の目次を見てアイデアを盗む」というものです。

元々、If-Thenプランニングの存在もメンタリストのDaigoさんの出している書籍で知りました。他にも心理学の知見から習慣化のテクニックについて著述されていらっしゃるので、著書からテクニックをアプリに真似させてもらおうと企んでいます。

どのようにしたら、この習慣化アプリを使ってもらえるか、作業仮説を立てながらやっていきたいと思います。

この記事では毎日、その過程を更新していきたいと思いますので、よろしくお願いします。また、アプリを使ってみて、感想などがあればぜひこの記事にコメントしていただけると嬉しいです（まだアプリにお問い合わせフォームを設置していないので）


# 1日目
友達にアプリを初めて使ってもらった。やっぱりあまり使いたいとはもらえませんでした。以下のような感想をいただきました。
1.アプリ名の習慣クックの意味がわからない
2.ウェルカムページの文章が長い（大事なところは太字にしたら？）
3.メールアドレスの登録が面倒くさい
4.If-Thenプランニングの例文の意味が分かりづらい
5.習慣の達成率が分かりにくい
6.会員登録後に何をしたらいいか分からない
2について、自分では文章を分かりやすく書いたつもりでも、あまり伝わっていない印象でした。伝わる文章を書くように心がけます。
また、6についてはその通りだと思いました。改めて会員登録してみると、メニュー画面しか表示されておらず、何をしたら良いか分かりません。
![0BCF906F-135A-46A3-9D93-C1F926054102.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/66996e96-abb2-4cbf-f046-16acad5a4909.jpeg)
自分としてはユーザーにはまず１つ、習慣を設定してもらいたいので、会員登録したユーザーは習慣の新規登録画面に遷移させる形に修正したいと思います。

# 2日目
今日も自作アプリにログインする。しかし自分で言うのもなんだが、画面に華がない。パッとしない印象だ。

![79A6CD04-1E8A-4C16-936C-AE9A1DE8E09D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1851421/4d067dc9-746b-afe5-c21b-cab45209260d.jpeg)

習慣の投稿もほぼないので、他の人の習慣化を見ることもできない。投稿サイトあるあるだと思うが、ユーザーがいないと投稿が集まらなくて、使ってくれる人がいない。使う人がいないから、投稿が集まらない。
とりあえず戦略として、まずはユーザー個人だけで完結する機能を追加していこうと思う。まずはユーザーを増やそう。

さて改善ネタを考えていきます。しかしさっそくネタ切れだったので、If-Thenプランニングの通り、Daigoさんの著書「超習慣術」を眺めていると、次のような習慣化テクニックがありました。
>目標を立てる際はより強い動詞を使った方が習慣化できる確率が高まり、身につくまでのスピードも速くなる。ということが研究でわかりました。具体的な例を挙げると、「体重を5キロ落としたい」という目標の立て方は弱いので、「何がなんでも体重を5キロ落とす決意をした」、「体重を５キロ落とし5年前に履いていたジーンズがすんなり履けるようになるのを確信している」などという考え方をするようにします。

これを自作アプリに取り入れるならば、習慣の新規登録画面で強い動詞を検索できる機能？になるでしょうか。辞書のAPIはあるので、それをうまく活用していきたいです。

類義語検索ツールに日本語WordNetがあるので、試しに「確信」というワードを打ち込んだところ、良さげな類義語がヒットしました。これでユーザーが登録するとき、予測変換みたいな形で単語を表示させる機能？とかになるかな。このアイデアは少し温めておくことにします。

# 3日目
今更ですが、1週間ほどさぼってしまいました。一応、達成できなかった日は、「例外日」として記録してもらって、その日の夜にでもなぜ達成できなかったかを記録してもらうアプリ設計でした。しかし、わざわざ例外日に達成できなかったことをわざわざ記録するのはやりたくないですね。
ここに関して、アプリを使ってもらえるような機能が必要だと感じています。
今考えているのは、デイリーログインの機能です。コーヒーショップの実験で、スタンプカードの実験の話を何かの本で読んだ記憶があります。(1)スタンプが何も押されていない(2)あらかじめスタンプ2個が押されているスタンプカードをそれぞれ客に渡したパターンでは、(2)のパターンの方が再来店率が高かったそうです。
この習慣化アプリでも、まずアプリを使うことを習慣化してほしいので、似たようなデイリーログインを実装しようと思います。
npmでパッケージをインストールしたらnode-gypエラーが出た

npmでパッケージをインストールしたら、node-gpyのエラーが発生しました。
コンパイル時に使われるPythoのバージョンが問題の場合があります。
pyenvをインストールし、Python2.7系を指定すると解決できます。

```
$ npm install
gyp ERR! ・・・
・・・
・・・
node-pre-gyp ERR! build error 
・・・
```
100日でSQLの達人になる@LeetCode! Day11 <group by, 課金した話>

## 511. Game Play Analysis I （問題レベル: Easy）要課金
今日の問題はこれ。
ユーザー毎に最初にログインした日付をリストアップするという問題。

ポイントは```group by```を使うだった。
今日はとてもシンプルな問題だった。

実は、[LeetCode](https://leetcode.com/)上のSQL問題の無課金でできる範囲はほぼ目を通してしまった。
上級の問題も少し見たのですが、まだ歯が立たなそうなことと、中級でも変数を使う問題などもう少し慣れてから取り組みたいと思いました。

そうすると、課金するしかない！と判断しました（そもそも無料でできる問題は40問程度。100問はムリだった！最初から気が付けよ自分。）。

月額プランと年額プランがあったのですが、４か月くらいで年額159ドルになってしまうので思い切って年額プランを選択しました。途中でPromotionコードを入れる欄が出てきましたが、ネットで見つけたどのコードも使えなかったので諦めて契約しました。

これで後に引けなくなりました。
[LeetCode](https://leetcode.com/)の課題を[GitHub](https://github.co.jp)で管理する方法もあるらしい。そちらも少し調べてみようと思います。

* [LeetCode](https://leetcode.com/)の問題は、MS SQL Serverで解いています。
2022/2/12主にITとかセキュリティの記事

CrowdStrike、AQUATIC PANDAによる侵入の試みでLog4Shellエクスプロイトツールの悪用を検知(2/10)
https://s.netsecurity.ne.jp/article/2022/02/10/47108.html

9カ月で37億件の違法ダウンロード‐アカマイが世界の著作権侵害状況を公表(2/9)
https://news.mynavi.jp/techplus/article/20220209-2269140/

公文書の電子媒体化「急速なデジタル化に対応」と官房長官(2/9)
https://www.sankei.com/article/20220209-BFSPMU5MCVORPKANBQPN2LWFWQ/

米19歳、E・マスクのジェット機追跡に成功　業界は保安面を懸念(2/10)
https://forbesjapan.com/articles/detail/45736/1/1/1

多数のIntel製品に脆弱性 ～CPUやマザーボード、Wi-Fiデバイスなど身近な製品にも(2/10)
https://forest.watch.impress.co.jp/docs/news/1387378.html

カニエ・ウェストがNFTにノーを突きつけた理由【オピニオン】(2/10)
https://m.finance.yahoo.co.jp/news/detail/20220210-00158764-coindesk-bus_all

平等な扱いやサードパーティー支払処理の許可など「アプリストアの原則11カ条」をMicrosoftが発表(2/10)
https://gigazine.net/news/20220210-microsoft-open-app-store-principles/

1月デスクトップOSシェア、Windowsが増加(2/9)
https://news.mynavi.jp/techplus/article/20220209-2268594/

米FTC、2021年発生のSNS詐欺の被害総額、約7億7000万ドルと発表。前年の約3倍(2/9)
https://it.srad.jp/story/22/02/08/1612254/

第703回　NASをNextcloud化する：Ubuntu Weekly Recipe(2/9)
https://gihyo.jp/admin/serial/01/ubuntu-recipe/0703

Zoomで「マイクが自動的にオンになって勝手に録音が始まる」という事例が公式フォーラムに多数投稿される(2/10)
https://gigazine.net/news/20220210-zoom-app-listening-microphone-mac/

多い？ それとも少ない？ 2段階認証の標準化で、アカウント乗っ取り被害が約5割減とGoogleが発表(2/10)
https://internet.watch.impress.co.jp/docs/yajiuma/1387354.html

メッセージングアプリのLINEが仮想通貨決済をテストへ(2/10)
https://nextmoney.jp/?p=48127

COBOLの利用、従来予測の約3倍との調査結果(2/10)
https://japan.zdnet.com/article/35183364/

NICTER観測レポート2021の公開(2/10)
https://japan.cnet.com/release/30645519/?ref=rss

暗号通貨によるウクライナへの送金が、危機からの防衛と“ハクティヴィスト”の活動を支えている(2/10)
https://wired.jp/article/ukraine-russia-cryptocurrency-donations-hacktivism/

金融×デジタルで実現する“滑らかな”ユーザー体験──組込型金融がエンドユーザーの生活を変える(2/10)
https://bizzine.jp/article/detail/7049

2Q国内サーバー市場、富士通が22.6％で首位(2/10)
https://active.nikkeibp.co.jp/atcl/act/19/00006/012400195/

SIMスワッピング攻撃急増でFBIが警告(2/10)
https://nextmoney.jp/?p=48109

米セールスフォース、NFTクラウドサービス検討か＝CNBC(2/10)
https://coinpost.jp/?p=319290

「Microsoft Teams」のパフォーマンスが改善、2020年比で電力消費を最大半減(2/10)
https://forest.watch.impress.co.jp/docs/news/1387455.html

テレワークでよく使うITツールランキング、40種類のうち最も順位を上げたものは(2/10)
https://active.nikkeibp.co.jp/atcl/act/19/00347/012100008/?i_cid=nbpnxta_sied_pickup

システムの保守運用体制が瓦解　他人事ではない、みずほの惨事(2/11)
https://xtech.nikkei.com/atcl/nxt/mag/nc/18/020600007/020200106/
docker-composeを使わないで同じことをする

## はじめに
「docker-composeを使うと便利〜」ってよく言われますが、どのぐらい便利になるかわからなかったので調べました。
細かく調べたわけではないので間違っている箇所があればお手数おかけしますが教えていただけると嬉しいです。

今回は[Quickstart: Compose and WordPress](https://docs.docker.com/samples/wordpress/)を例に進めていきます

## ネットワークの作成、コンテナの作成、コンテナをネットワークへ参加させる

### docker-composeの場合
※ymlファイルを書いてから

```bash
$ docker-compose up
```

### docker単体の場合

```bash
# ネットワークの作成
$ docker network create my_wordpress_default

# dbのコンテナを作成
$ docker run --restart=always \
-v my_wordpress_db_data:/var/lib/mysql \
--name my_wordpress_db_1 \
-e MYSQL_ROOT_PASSWORD="somewordpress" \
-e MYSQL_DATABASE="wordpress" \
-e MYSQL_USER="wordpress" \
-e MYSQL_PASSWORD="wordpress" \
mysql:5.7

# wordpress用のコンテナを作成
$ docker run --restart=always \
-v my_wordpress_wordpress_data:/var/www/html \
--name my_wordpress_wordpress_1 \
-e WORDPRESS_DB_HOST="my_wordpress_db_1" \
-e WORDPRESS_DB_USER="wordpress" \
-e WORDPRESS_DB_PASSWORD="wordpress" \
-e WORDPRESS_DB_NAME="wordpress" \
-p "8000:80" \
wordpress:latest

# ネットワークにdbのコンテナを追加
$ docker network connect my_wordpress_default my_wordpress_db_1
# ネットワークにwordpress用のコンテナを追加
$ docker network connect my_wordpress_default my_wordpress_wordpress_1
```

## シャットダウン
docker-composeではシャットダウンするとコンテナが停止されます。

### docker-composeの場合
```bash
$ docker-compose down
```

### docker単体の場合
```bash
$ docker stop my_wordpress_wordpress_1
$ docker stop my_wordpress_db_1
```

## クリーンアップ
docker-composeではクリーンアップをするとネットワーク、コンテナが削除されます。
### docker-composeの場合
```bash
docker-compose down --volumes
```

### docker単体の場合
```bash
# コンテナを削除
$ docker rm my_wordpress_wordpress_1
$ docker rm my_wordpress_db_1
# ネットワークを削除
$ docker network rm my_wordpress_default
# ボリュームを削除
$ docker volume rm my_wordpress_db_data
$ docker volume rm my_wordpress_wordpress_data
```

## おわりに
ああ、便利ですね。
シェルスクリプトでコマンドを纏めてあげてもいいですが、それだと起動と削除別々のスクリプトになってファイルが多くなってしまうっていうのがわかりましたね。（1個にも纏められますがあんまり複雑にしたくないので）
dockerは停止、削除のコマンドは`rm -f`で一括で出来たりもするんですが、docker-composeに合わせて分けて記載しました。
GNS3 VMインストール

下記の記事でGNS3-Serverに触れました。

https://qiita.com/nw-engineer/items/31d960f2f9489c75114c

GNS3-ServerはVyOSやFortigateなどのネットワーク系のアプライアンスは登録する事ができますが、PaloaltoやA10といったKVMベースのイメージをデプロイする事が出来ません。

そこで、今回はGNS3でもKVMベースのイメージをデプロイできるようGNS3 VMをインストールします。

## 1. GNS3VMのダウンロード

下記サイトからGNS3VM（VMware ESXi）をダウンロードします。

https://www.gns3.com/software/download-vm

vCenterからダインロードしたovaファイルをデプロイします。デプロイは下記記事を参考にしてみてください。

https://qiita.com/nw-engineer/items/639d95e26dba6fffb02a#4-fortigatevm%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4

デプロイ完了後にコンソールを開くと起動後のIPが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/ce3bc50a-6035-7ef9-3fd0-bf5387b8d3a2.png)


## 2. GNS3 VMの登録

GNS3 VMを利用できるようにクライアント側の画面で登録をしていきます。PreferencesからServerをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/813798b3-77bb-3c83-5c4b-a8100b36cfb0.png)

画面右の「Remote servers」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/c9e79bce-14dd-31bf-c595-676382d8aa75.png)

「Add」ボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/b507130d-4bd4-16ef-012e-f9baa8ccfe49.png)


HOSTには手順#1で確認したIPアドレスを入力し、Nameはわかりやすい名前をつけてPortを80に変更して「OK」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/ff8aac2f-ead3-0967-156f-3c58fc73dcb8.png)

「Apply」をクリックしましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/7dcde670-d3f1-62dd-3708-91dedab89841.png)

次に画面左の「GNS3 VM」をクリックします。「Enable the GNS3 VM」のチェックを入れてVirtualization engineのプルダウンから「Remote」を選択し、VM name のプルダウンから先ほど付けたリモートサーバの名前を選択し「Apply」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2335933/660ce099-82a0-5f34-3ba1-089c53ecffdb.png)

これで、KVMイメージを取り扱えるようになりました。

## 3. その他
次回はa10 ThunderをGNS3上で稼働させてみたいと思います。
CTF用にDockerでUbuntu環境作ってみた

# 結論(2023年6月21日追記)
CTFはDockerじゃないほうがいいです！
普通にLinux動かせる環境を用意するのが良いでしょう！

# 作ることになった経緯
### CTFを知る
最近CTFというものの存在を知って、[CpawCTF](https://ctf.cpaw.site/)というものに挑戦中です！
CTFとは、情報セキュリティの知識を使って解くパズルゲームのようなものです！
詳しくは[こちら](https://cybersecurity-jp.com/column/33780)を読んでください！  
 
### やってみる
CpawCTFにこんな問題がありました。
> このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。
どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。
添付ファイル :  hogehoge

curlコマンドでダウンロードして、添付ファイルを調べてみました！
```:zsh
% curl -OL ダウンロードリンク
% chmod 755 hogehoge
% file hogehoge
hogehoge: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
```
なんだ、ただのバイナリファイルか！
実行してみよう！(CTFやっていく上で、この考えは危ない気がするが...。)
```:zhs
% ./hogehoge
zsh: exec format error: ./hogehoge
```
なんか実行できないみたいです！！！
いろいろ調べてみたところ、UNIX系のOSで実行できるバイナリファイルに、ELFは含まれていないみたいです...。  

**と゛お゛し゛て゛た゛よ゛お゛お゛お゛！**

ということで、最近使えるようになったDockerでCTF用の環境作ることにしました！

# インストールするコマンド
とはいっても、CTF超初心者なので、どんなツールをインストールすればよいのかわかりません！
とりあえず、```CTF 必要 コマンド```でググってでてきたコマンドを使えるようにしておけばいいか！！！  

そんな感じで、厳選されたコマンドたちを紹介します！
## curl
問題で渡されたファイルを、こいつでダウンロードする。
わざわざクリックしてダウンロードなんかしないよ、だってそのほうがかっこいいもんね！！！！
## file 
拡張子が無いファイルが問題で出てくることがあるので、こいつでどんなファイルなのか調べる
## unzip
これでzipファイルが解答できる
```curl```でダウンロードしたファイルがzipだったとき、こいつで解答する
## gcc
C言語ソースコードが出題されることがあるので、こいつでコンパイルする
```-g -O0```オプションをつけることで、デバッグ情報を付与 & 最適化しないので、デバッグしやすくなるらしい！
## gdb
デバッガ！
ブレークポイントを設定して、命令ごとに変数の変化を観察できたりするらしい！
便利！！！！
## strings
ファイルにこいつを使うことで、文字列だけを見つけて表示してくれるみたい！
ファイル実行後は、きみにまかせるよ！
```binutils```を入れると付いてくる
## python
やっぱりpythonしか勝たん
いろいろとパッケージ入れるの面倒なので、[Anaconda](https://www.anaconda.com/)でインストールする！

# DockerFileを作成
```:Dockerfile
FROM ubuntu:latest

RUN apt-get update && apt-get install -y \
    sudo \
    vim \
    curl \
    file \
    unzip \
    gcc \
    gdb \
    binutils \
    # 日本語化も忘れず
    locales

RUN locale-gen ja_JP.UTF-8
ENV LANG=ja_JP.UTF-8

WORKDIR /opt
RUN curl -OL https://repo.anaconda.com/archive/Anaconda3-2019.10-Linux-x86_64.sh && \
    sh Anaconda3-2019.10-Linux-x86_64.sh -b -p /opt/anaconda3 && \
    rm -rf Anaconda3-2019.10-Linux-x86_64.sh
ENV PATH /opt/anaconda3/bin:$PATH
RUN pip install --upgrade pip

COPY mount_folder /mount_folder
WORKDIR /
```
さらに必要なものがあれば、随時更新していきます！
日本語の文字化けが酷かったので、そっちも対応しておきました！
また、```Dockerfile```と同じディレクトリ内に```mount_folder```というディレクトリを作成し、コンテナ内にマウントするようにしてます！
コンテナ外で作成したファイルをコンテナ内に持っていきたい場合は、この```mount_folder```にファイルを置いて、リビルドすればOKです！

とりあえずこれで、CTFのための最低限の準備ができましたﾊﾟﾁﾊﾟﾁ(拍手)

# 参考記事
- https://cybersecurity-jp.com/column/33780
- https://www.kdryblog.com/ctf-command-tool/

# 最後に
DockerFileは[GitHub](https://github.com/masanari9256/DockerFile-CTF-Ubuntu)に公開しているので公開しているので、ぜひ使ってください！
また、他にCTFに必要なツール等あれば、コメントや[GitHub](https://github.com/masanari9256/DockerFile-CTF-Ubuntu)のissueで教えて下さい！

エンジニアのお友達が欲しくて、[Twitter](https://twitter.com/log_masa)もやってます！
技術系の発信はしていませんが、もしよければ仲良くしてください！
【PythonでExcel操作】すべてのExcelファイル・シートに対して処理を実行

今まで手作業で編集していたエクセルファイルを自動で読み書きできると、いろいろな業務効率化が期待できると思います。ここでは以下のを紹介します。

 - フォルダ内のすべてのExcelファイルに対して処理を実行したい場合
 - ExcelファイルBook内のすべてのシートに対して処理を実行したい場合


![file_icon_text_xls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598548/526dfaeb-50fe-bedf-095d-bfe249b8ea36.png)![file_icon_text_xls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598548/526dfaeb-50fe-bedf-095d-bfe249b8ea36.png)![file_icon_text_xls.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598548/526dfaeb-50fe-bedf-095d-bfe249b8ea36.png)


# フォルダ内のすべてのExcelファイルに対して処理を実行

os.walkでフォルダ内を検索し拡張子.xls* が含まれるか確認

```python
import os
for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".xls" in ext:
            print(file)
```

# ExcelファイルBook内のすべてのシートに対して処理を実行
wb.sheetnamesでシート名リストが取得できます。

```python
import openpyxl
File = "test.xlsx"

#Fileを開く
wb = openpyxl.load_workbook(File)

#Book内のすべてのsheet名リストを取得
sheetnames = wb.sheetnames
print(sheetnames)

#sheet名リストから1つずつsheet名を取りだす
for sheetname in sheetnames:
    sheet = wb[sheetname]
    #ここにsheetを操作するコードを書く
    #sheet.cell(row=1, column=1).value = sheetname

#Fileを保存
wb.save(File)
```


# 結合:フォルダ内のすべてのExcelファイルのすべてのシートに対して処理を実行

マクロ有効ブック xlsmの場合は、keep_vba=True　オプションを付ける必要あり

```python
import os
import openpyxl

for root, dirs, files in os.walk("./"):
    for file in files:
        ext = os.path.splitext(file)[1]
        ext = ext.lower()
        if ".xls" in ext:
            if ".xlsx" in ext:
                wb = openpyxl.load_workbook(file)
            if ".xlsm" in ext:
                wb = openpyxl.load_workbook(file, keep_vba=True)
            sheetnames = wb.sheetnames
            print(sheetnames)
            for sheetname in sheetnames:
                sheet = wb[sheetname]
                # ここにsheetを操作するコードを書く
                # sheet.cell(row=1, column=1).value = sheetname
            wb.save(file)

```
なろう小説APIを試しに使ってみた

## 1.はじめに  

Pythonを初めて使うに当たって基本的なライブラリを試した時のメモになります。  
目的として「作品内の会話率」と「人気度」の関係について調べてみるという体で進めていこうと思います。 

<br/>

※個人的になろう小説の作品を最後まで完走しているのは流し読みできるぐらい読みやすいものを選んでいる傾向があり、会話がある程度多いほうが読みすいかなという個人の問題で気になったので勉強がてらやってみようと思いました。(初学者なのでソースコードの不備はご了承ください。)

<br/>

* 試したこと
  * 「なろう小説API」を叩いてデータを取得
  * 取得データを整形
  * 取得データをグラフに図示
* 開発環境  
  * Windows10 Home
  * Python 3.9.1
  * Visual Studio Code

<br/><br/>
***

## 2.「なろう小説API」を叩いて情報を取得

<br/>

* 目標
  * 「作品名」「初投稿日」「ジャンル」「総合評価ポイント」「会話率」を取得

<br/>

```python
import requests
import pandas as pd
from matplotlib import pyplot as plot
import datetime

url = "http://api.syosetu.com/novelapi/api/"
params = {'of': 't-gp-gf-g-ka', 'order': 'monthlypoint','out':'json','lim':100,'st':0}
res = requests.get(url,params=params)
resData = res.json()
```

<br/>

リクエスト送信時のクエリパラメータは以下参照  
[なろうデベロッパー](https://dev.syosetu.com/man/api/)

<br/>

|title|genre|general_firstup|monthly_point|kaiwaritu|
|:------|:--------:|-------:|:--------:|:--------:|
|小国の侯爵令嬢は敵国にて覚醒する|101|2021-11-16 06:00:00|119112|54|
|現代陰陽師は転生リードで無双する|202|2021-12-22 06:00:00|78194|25|
|ポジティブ令嬢フローラの契約結婚　～愛することはないと言われましたが食事が美味しいので幸せです～|101|2021-12-17 12:25:26|62294|41|
|嫌われ皇子のやりなおし～あえて嫌われている闇魔法を極めたら、いつの間にか最強になっていた～|201|2021-12-24 19:07:51|90444|39|
|追放、５日後。　～悪名は利用してこそ価値がある～|101|2022-01-15 13:40:35|50676|47|
|・・・|・・・|・・・|・・・|・・・|

ここまでは、特に問題なくできました。  
(ほぼ参考サイトのコピペなので出来ないわけがないのですが...)

<br/>

## 3.取得データを整形

<br/>

* 目標
  * 取得データから以下の情報を計算してみる
    * 初投稿日からの経過日数
    * 1日当たりのポイトン獲得数を計算　⇒　総合評価ポイント/経過日数

<br/>

総獲得ポイントの場合、初投稿日から日数が経っているほど多くなっているため公平を期すために1日当たりの平均ポイント獲得数を使用しようと思います。

本当は、日ごとの獲得ポイントから日数獲得ポイントが予測できることろまで行けば面白い結果を得られる気がしますが、今回は平均でご了承ください。(今後の課題とします！)

<br/>

```python

data.extend(resData[1:])
df = pd.DataFrame(data)

# 現在時刻を取得
nowtime = datetime.datetime.now()

df['general_firstup'] = pd.to_datetime(df['general_firstup'])
df['days'] = df['general_firstup'].apply(lambda x:float((nowtime - x).days))
df['pt_day'] = df['global_point'] / df['days']
```

<br/>

|title|kaiwaritu|days|pt_day|
|:------|:--------:|-------:|:--------:|
|小国の侯爵令嬢は敵国にて覚醒する|54|87.0|1369.103448|
|現代陰陽師は転生リードで無双する|25|51.0|1533.215686|
|ポジティブ令嬢フローラの契約結婚　～愛することはないと言われましたが食事が美味しいので幸せです～|41|56.0|1112.392857|
|嫌われ皇子のやりなおし～あえて嫌われている闇魔法を極めたら、いつの間にか最強になっていた～|39|49.0|1845.795918|
|追放、５日後。　～悪名は利用してこそ価値がある～|47|27.0|1876.888889|
|・・・|・・・|・・・|・・・|

<br/>

## 4.取得データをグラフに図示

<br/>

* 目標
  * 取得したデータをもとに散布図を作図
  * 「会話率」と「1日当たりのポイント獲得数」の相関係数を算出

<br/>

```python
plot.scatter(df['kaiwaritu'], df['pt_day'], s = 10)
plot.xlabel("kaiwaritu")
plot.ylabel("pt/day")
plot.show()
print(np.corrcoef(x_kaiwaritu, y_ptday))
```

<br/>

■出力結果
![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2526756/7a0f0c71-a3ad-466d-affa-6b2aa2c95789.png)

```
[[ 1.         -0.03054747] 
 [-0.03054747  1.        ]]
```

<br/>

散布図からも見てわかるように相関係数もほぼ0に近似しているため、両者の相関はほぼないということとなりました。
ぱっと見だけで判断すると、会話率20~60%の範囲内1日当たりの獲得ポイント数が多い作品があるので、人気になっている理由などを引き続き検証できればと思います。(分析手法に関しても勉強不足と痛感・・・出直してきます)

<br/>

## 参考
https://qiita.com/dely13/items/5e949a384161c961d8ce
Unity UWP: No Universal Windows Platform module loaded

![Unity UWP: No Universal Windows Platform module loaded](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/3d3c4d65-4a19-0616-993f-769ec7b3f999.png)


`Unity UWP: No Universal Windows Platform module loaded` といわれて色々調べてインストールしまくったのですが，結構大変だったので，メモします．


## Visual Studio 2019でのツールのインストール作業

Visual Studio 2019でUniversal Windows Platform Developmentをクリックし，

![VisualStudio2019_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/83758428-0044-ee19-9678-dc4da022f4cd.png)

「Unityによるゲーム開発」，「C++によるゲーム開発」もついでにクリックしてインストールしておきます．必要かわからないですが，Build設定でC++のなんかのツールが足りないといわれ，「C++によるゲーム開発」もダウンロードして，エラーを解決しました．

![VisualStudio2019_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/8786616d-334c-3deb-d0ab-907866d1b85b.png)


## Unity Hubでのモジュール追加

Universal Windows Platform Build Supportをクリックし，実行する．

![VisualStudio2019_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/8c5e13e8-090f-6496-0f20-6f9a792df917.png)


## Windows (IL2CPP) Target Supportをインストール


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1771055/41dee0fb-f213-780c-ace8-c38d494f7e01.png)

`Windows (IL2CPP) Target Support` というリンクをクリックし，パッケージをダウンロード&インストールします．[参考: Where to download the Universal Windows Platform?](https://forum.unity.com/threads/where-to-download-the-universal-windows-platform.504423/)

後はWindows SDKも念のためインストールしておいた方がいいです（なくてもタイトルのエラーは消えますが）．

https://developer.microsoft.com/en-us/windows/downloads/sdk-archive/


## 参考

 - [UnityでHoloLens2を使う
](https://qiita.com/t21m092/items/8da9e6ad10e0c5f80d2d)
 - [Where to download the Universal Windows Platform?
](https://forum.unity.com/threads/where-to-download-the-universal-windows-platform.504423/)
Railsのルーティング好きなURLにしたいとき

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/660da907-4a7d-8265-4195-c7a0d21b883f.png)




## Railsのルーティングってなんかな〜
Railsを学びはじめたときにルーティングでresoucesを使うと複数形になったり
便利なんだけど決められてる感があって、ほんとはこういうURLにしたいのにな、
なんだかRailsって思い通りのURLにすることできないのかな〜って思ってました。

そんな初学者のかたに<b>朗報</b>です。

### 好きなURLにするには

<b>`scopeメソッド`</b>を使うことで、<b>`resources`</b>によって生成されるデフォルトのパス名を変更できます。

```ruby
scope do
  resources :this_sites , path: 'kono_site'
end
```

[![Image from Gyazo](https://i.gyazo.com/79120f86164340cc5531a0fc4ca2bc49.png)](https://gyazo.com/79120f86164340cc5531a0fc4ca2bc49)

こんな感じで好きなURLに変えることができます。
Prefixなどは変わりません。コントローラー名とは違ってこのURLにしたい場合はscopeを使いましょう。

### newアクションをatarashikuに変えてみる

ほかにこんな風にすると。。。。

```ruby
scope(path_names: { new: 'atarasiku', edit: 'hennsyu' }) do
  resources :this_sites, path: 'kono_site'
end
```

[![Image from Gyazo](https://i.gyazo.com/c58ab087cdeabebde6ab9fab94966bfe.png)](https://gyazo.com/c58ab087cdeabebde6ab9fab94966bfe)

<b>`newアクション`が`atrasiku`に、`editアクション`が`hennsyu`に変わっています！</b>

こんな感じで窮屈だな〜って思っていたRailsのルーティングが意外と自由なことに気づけると思います。

ただあまりやりすぎると訳がわからなくなるのでご注意を。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1111652/7da8007a-42b7-6eae-8712-3d009015b0ca.png)


それではよいRailsライフを〜。


> 参考サイト

+ [Railsガイド](https://railsguides.jp/routing.html#%E3%83%91%E3%82%B9%E3%82%92%E5%A4%89%E6%9B%B4%E3%81%99%E3%82%8B)