OmniAICreator/Qiita-1.07M huggingface dataset:
Mac デスクトップ版Notionがローディングから復帰しない

# 概要

- Mac用デスクトップ版Notionを起動したらローディングから復帰しなくなってしまったので解決方法をまとめる。

# 問題までの経緯

- Macを起動後、Notionのアイコンをクリックしてデスクトップ版Notionの起動を試みた。

# 問題

- 下記スクショの様にローディング画面から一向に先に進まず、コンテンツが表示されない。

    ![Notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/c26e1905-2729-4c5b-4c76-a81562de32f3.png)

# 解決までの経緯

1. Notionアプリケーションを再起動してみたが、変化無し。
1. Macの再起動をしてみたが、変化無し。
1. Notionアプリケーションを一度削除し、再インストール下が、変化無し。
1. 下記リンクの「Desktop apps」の「Mac app」を参考にローカルデータを削除してみる。
    1. [https://www.notion.so/Reset-Notion-1b70196f1f6145d7a8695afc425d8699#20fae813390341ee846d0f3f323f3f1a](https://www.notion.so/Reset-Notion-1b70196f1f6145d7a8695afc425d8699#20fae813390341ee846d0f3f323f3f1a)

        ![リセットの概念.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/008f36d9-7a02-1328-1861-bb0f9a5cc814.png)

    1. ぐるぐる状態のNotionを開く。
    1. カーソルでNotionのウインドウをアクティブにする。
    1. 上部のバーの「Notion」をクリックする。
    
        ![Item-0_と_Item-0_と_Item-0_と_Item-0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/8715e78e-e3d8-b7c3-0ef6-0b5a1762a4f1.png)

    1. 「アプリのリセットと更新」をクリックする。

        ![スクリーンショット_2023-02-01_11_05_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/e8a5175d-3eb4-dff4-f664-c4e020306603.png)

    1. 「すべてのローカルデータのリセットと消去」をクリックする。

        ![スクリーンショット_2023-02-01_11_07_32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/5b019b63-0286-58ee-3d17-0f0106503fb0.png)

1. ログイン画面が出た。

    ![Notion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/846928d0-df27-d411-c46b-754a5348d819.png)

1. 認証情報を入力してログインしたところ復活させることができた。

    ![タスクリスト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/31efb0bc-c15f-499d-71c6-d34c1ab3dcca.png)

1. 問題解決！！！良かった！
【Laravel】キャッシュクリア

# 【Laravel】キャッシュクリア

<table>

  <thead>
    <tr>
      <th>名前</th> <th>説明</th>
    </tr>
  </thead>
  <tr>
    <td> 設定 </td> <td>php artisan config:clear</td>
  </tr>
  <tr>
    <td> ルーティング </td> <td>php artisan route:clear
</td>
  </tr>
  <tr>
    <td> ビュー </td> <td>php artisan view:clear</td>
  </tr>

  <tr>
    <td> アプリケーションキャッシュ </td> <td>php artisan cache:clear</td>
  </tr>

  <tr>
    <td> サービスプロバイダキャッシュ </td> <td>php artisan clear-compiled</td>
  </tr>

</table>

# 上記を一撃で全部クリックを行うコマンド
```php
php artisan optimize:clear
```
FileMakerからLINEmessagingAPIをたたいてみた

LINEmessagingAPIを今更ながらたたいてみた
その備忘録でっす。

ほぼ日本語だったからすごく読みやすかった。
感想としてはおもってたより簡単？だった。
※前にAirTableのAPIをやっていたからそれと比較してという意味です。

とりあえず[LINEのAPIリファレンス](https://developers.line.biz/ja/reference/messaging-api/)

今回はTESTアカウントを作成して、検証しました。
とりあえず簡単にできそうだった取得から
[プロフィール情報を取得する](https://developers.line.biz/ja/reference/messaging-api/#get-profile)
```URL
GET https://api.line.me/v2/bot/profile/{userId}
```
```cURL
curl -v -X GET https://api.line.me/v2/bot/profile/{userId} \
-H 'Authorization: Bearer {channel access token}'
```
ふむふむ。
FileMakerに置き換えた場合は、
```
変数を設定
[$URL；
https://api.line.me/v2/bot/profile/{userId}]
変数を設定
[$cURL；
"-X GET
-H \"Authorization: Bearer {channel access token}\""]
```
エスケープとかに気を付けて変数に落とし込み。
記述間違ってたらすいません。
こんなこと言うのはあれなのですが、変数にuseridとtokenを入れていてそれをURLやcURLの変数に入れているので、直打ちしてないです。そのほうがスッキリしてるような感じがして...(笑)
URLから挿入スクリプトステップで完了。

つぎぃ
Webhookを使わなくて良かったものからいきまっす。
[ブロードキャストメッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-broadcast-message)
```URL
POST https://api.line.me/v2/bot/message/broadcast
```
```cURL
curl -v -X POST https://api.line.me/v2/bot/message/broadcast \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer {channel access token}' \
-H 'X-Line-Retry-Key: {UUID}' \
-d '{
    "messages":[
        {
            "type":"text",
            "text":"Hello, world1"
        },
        {
            "type":"text",
            "text":"Hello, world2"
        }
    ]
}'
```
LINE公式アカウントと友だちになっているすべてのユーザーに、任意のタイミングでメッセージを送信します


ということはこやつは全体発信のメッセージになるのではないかと思ったわけでございます。

リクエストヘッダーには
```
X-Line-Retry-Key
```
は任意となってたので、一回パスします。

今回は、-d（--data）のmessagesの部分が面倒なわけです。
messagesの箇所だけ変数に当てはめました。

```
変数を設定 [$URL；
https://api.line.me/v2/bot/message/broadcast]

変数を設定 [$data；
"{
    \"messages\":[
        {" & 
            Quote ( "type" ) & ":" & Quote ( "text" ) & "," & 
            Quote ( "text" ) & ":" & Quote ( "takeuchitakuya" ) & 
        "}," & 
        "{" & 
            Quote ( "type" ) & ":" & Quote ( "text" ) & "," & 
            Quote ( "text" ) & ":" & Quote ( "全体メッセージ" ) & 
        "}" & 
    "]" & 
"}"]

変数を設定 [$cURL；
"-X POST 
-H \"Content-Type: application/json\"
-H \"Authorization: Bearer " & $channelaccesstoken & "\"
-d \"@$data" & "\""]
```

@$dataの記述は下記参照。
[サポートされている cURL オプション](https://fmhelp.filemaker.com/help/17/fmp/ja/index.html#page/FMP_Help/curl-options.html)

つぎぃ
[応答メッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-reply-message)
や
[プッシュメッセージを送る](https://developers.line.biz/ja/reference/messaging-api/#send-push-message)

これをするにはどうしてもWebhookが必要になってきます。
今回は検証の為、サードパーティーを利用しましたが、
クラリス社を応援するためにも、基本はクラリスコネクトを利用した方がいいのかもしれません。
まぁ私使ったことないので知らんけど...
クラリスコネクト使ったことある人へお願いがあります。
使用感とかなんか感想を教えてください。

まぁまぁなんやかんやで設定がすめば
こんな感じになります。
![LINEmessagingAPI](https://v5.airtableusercontent.com/v1/15/15/1677297600000/xLH-5sk_gQjOcgA8-eQM-g/pCKLEIlUXM6vWw_ep1iZh0TxFbZWKGGjkRmTx-uObf0PyE1h6mR-Nz_p7ObtIrc_V4rnf4oZxp22eYzRR2MA7w/jX-fF8QOu-dzyQXYBdsGglQDXaTd_EUq2AaFFeHf-DQ)


やってみた感想は、まぁまぁ面白かったし、楽しかった。
けどやり終えた感想としてLINEてこんなもんなんかーって感じでした。
けどやっぱり面白かったからLINEmessagingAPIありがとう。
MatterとBLE Meshの死

# なんとなく目についたので読んでみた
そもそもMatterなんてものは10分くらい前まで知らなかったんですよ。たまたまFacebookのNordicグループに流れてきたのでなんとなくクリックしたわけです。ええ、別に流れてきた記事を全部読んでいるわけではないですから、これは本当に偶然です。
ちなみに読んだのはこの記事です。

https://www.musen-connect.co.jp/blog/course/trial-production/ideas-for-using-matter-and-the-fastest-trial-method/

# 家電の共通規格のことらしい
Matterってなんやねん！って感じですが、どうやら家電プロトコルの共通規格のことらしいです。今までもいっぱい出ては死に、出ては死にを繰り返していたわけでして別になんら驚くこともないわけですが、なんだかこれに関しては割と本気度を感じます。いや、ただの霊感です。
# BLE Meshはどうなった？
登場して5年くらい経過しているような気がしますが、BLE Meshを使った製品は一向に出てきません。実際、技術がある程度確立しても民生品として実際に使われるのなんてかなり先になるのだろうとは思います。もしかしたら局所的にポツポツとあるのかも知れませんが、爆発的な普及をするのはかなり後の話になるのが普通です。
それどころかBLEでの高速通信にしたって、うちの製品以外にやっているの見たことないですよ。まあBLEのウリである低消費電力に反する使い方なのでなくても別に不思議ではないですが・・・。
## BLE Meshによるスマートホーム
なんでBLE Meshの話をしているのかというと、BLE Meshはスマートホーム用プロトコルということで出てきたわけですよ。実際、割ときちんと考えられていて数年もしたら対応製品が出てくるんじゃないかと思っていました。
でも実際には未だに(少なくとも日本においては)販売されているようには見えません。

::: note
知らないだけであったらごめんなさい・・・
:::

## なんでかって
現時点でスマートホームのプロトコルシェアNo.1っておそらくZigbeeだと思われます。調べていないのでもしかしたら違うかも知れませんが、少なくともBLE Meshでないことは間違いないです。そして両者にはプロトコル互換がないので、仮にBLE Meshを導入しようと思ったら既存のZigbeeラインも含めて全交換になってしまいます。
ここらへんはさすがに先行者利益だと思いますが、ある程度普及してしまうと後からすごいのが出てきたとしても置き換えるのに相当なコストが発生してしまうので、ほとんどのケースにおいて置き換えられることはありません。規格が廃止にならない限りはずっと使われ続けるのが普通です。
つまり、今からBLE Meshが割って入るにはもう手遅れなのだろうと推測できます。
# そこで
既存のZigbeeも取り込みつつ共通規格にしようという動きになるわけですよね。
いや、でもさっきの記事にZigbee出てきたっけか？ZigbeeというかThreadですかね。いや、Zigbee触ったことないから全然知らないんですけどね！
# 結論
BLE Meshはオワコンっぽいです(笑)

::: note
こんなこと言っちゃっていいんかな・・・。まあただの雑談なので！！！
:::
現状最大規模を誇る言語モデルdeberta-v2をCommonsenseQA用にファインチューニングして公開してみた

こんにちにゃんです。
水色桜（みずいろさくら）です。
今回は現状日本語モデルで最大規模を誇る言語モデルdeberta-v2-base-japaneseをファインチューニングして、CommonsenseQA(常識を問う選択式の質問)タスクを解いてみようと思います。
作成したモデルは[こちらのサイト（Hugging Face）](https://huggingface.co/Mizuiro-sakura/deberta-v2-japanese-base-finetuned-commonsenseqa)で配布しています。
初心者でも簡単に使えるようにしているのでぜひ使ってみてください。

https://huggingface.co/Mizuiro-sakura/deberta-v2-base-japanese-finetuned-QA

# 環境

pandas 1.4.4
numpy 1.23.4
torch 1.12.1
transformer 4.24.0
Python 3.9.13

# deberta-v2-base-japaneseとは？

日本語Wikipedeia（3.2GB）および、cc100(85GB)、oscar(54GB)を用いて訓練されたモデルです。京都大学黒橋研究室が公表されました。

# データセット

今回、デーアセットはyahoo japanさんが公開しているJGLUEのうち、[JCommonsenseQA](https://github.com/yahoojapan/JGLUE)を用いました。
このデータセットは下記の例のように、質問文と5つの選択肢、回答が含まれているデータセットです。
このデータセットを用いることで、常識を問う選択式の質問に応答できるようになります。

```
{"q_id": 8939, "question": "電子機器で使用される最も主要な電子回路基板の事をなんと言う？", "choice0": "掲示板", "choice1": "パソコン", "choice2": "マザーボード", "choice3": "ハードディスク", "choice4": "まな板", "label": 2}
{"q_id": 8940, "question": "田んぼが広がる風景を何という？", "choice0": "畑", "choice1": "海", "choice2": "田園", "choice3": "地方", "choice4": "牧場", "label": 2}
{"q_id": 8941, "question": "しゃがんだりする様を何という？", "choice0": "腰を下す", "choice1": "座る", "choice2": "仮眠を取る", "choice3": "寝る", "choice4": "起きる", "label": 0}
```
# 作成したモデルの精度
79.80339588918764
(参考BERT : 72.0, XLM RoBERTa base : 68.7, LUKE : 80.1)

# 学習
下記の記事と同様の方法でファインチューニングを行いました。
詳しくは下記記事をご覧ください。

https://qiita.com/Mizuiro__sakura/items/3ca33795fd4e177660e6

# デモ（サンプルコード）
サンプルコードを以下に示します。
コピペして使ってみてください。

```python:exe.py
from transformers import AutoTokenizer, AutoModelForMultipleChoice
import torch
import numpy as np

# modelのロード
tokenizer = AutoTokenizer.from_pretrained('Mizuiro-sakura/deberta-v2-japanese-base-finetuned-commonsenseqa')
model = AutoModelForMultipleChoice.from_pretrained('Mizuiro-sakura/deberta-v2-japanese-base-finetuned-commonsenseqa')

# 質問と選択肢の代入
question = '電子機器で使用される最も主要な電子回路基板の事をなんと言う？'
choice1 = '掲示板'
choice2 = 'パソコン'
choice3 = 'マザーボード'
choice4 = 'ハードディスク'
choice5 = 'まな板'

# トークン化（エンコーディング・形態素解析）する
token = tokenizer([question,question,question,question,question],[choice1,choice2,choice3,choice4,choice5],return_tensors='pt',padding=True)
leng=len(token['input_ids'][0])

# modelに入力するための下準備
X1 = np.empty(shape=(1, 5, leng))
X2 = np.empty(shape=(1, 5, leng))
X1[0, :, :] = token['input_ids']
X2[0, :, :] = token['attention_mask']

# modelにトークンを入力する
results = model(torch.tensor(X1).to(torch.int64),torch.tensor(X2).to(torch.int64))

# 最も高い値のインデックスを取得する
max_result=torch.argmax(results.logits)
print(max_result)
```


# 終わりに
今回はdeberta-v2-base-japaneseをファインチューニングしてCommonsenseQAタスクを解く方法について書いてきました。
ぜひ皆さんも使ってみてください。
では、ばいにゃん～。

# 謝辞
モデルを公開してくださった、京都大学黒橋研究室には感謝いたします。
RT1310のif

ドライバーを作ってみたのですが、落ちます。

```
# dhcpcd fv1
dhcpcd-9.4.1 starting
dhcpcd-9.4.1 starting
spawned manager process on PID 97
fv1: executing: /libexec/dhcpcd-run-hooks PREINIT
fv1: waiting for carrier
fv1: waiting for carrier
fv1: carrier unknown, assuming up
fv1: carrier unknown, assuming up
fv1: executing: /libexec/dhcpcd-run-hooks CARRIER
DUID 00:01:00:01:2b:62:f4:64:d4:94:a1:97:03:94
DUID 00:01:00:01:2b:62:f4:64:d4:94:a1:97:03:94
fv1: IAID a1:97:03:94
fv1: IAID a1:97:03:94
fv1: delaying IPv4 for 0.4 seconds
fv1: reading lease: /var/db/dhcpcd/fv1.lease
fv1: soliciting a DHCP lease
fv1: soliciting a DHCP lease
fv1: sending DISCOVER (xid 0xca661586), next in 3.9 seconds
fv1: offered 10.0.2.157 from 10.0.2.1
fv1: offered 10.0.2.157 from 10.0.2.1
fv1: sending REQUEST (xid 0xca661586), next in 3.0 seconds
fv1: acknowledged 10.0.2.157 from 10.0.2.1
fv1: adding IP address 10.0.2.157/24 broadcast 10.0.2.255

[   7.0500524] uvm_fault(0xc05f06a0, 0, 1) -> e
[   7.0706743] Fatal kernel mode data abort: 'Translation Fault (P)'
[   7.0889626] trapframe: 0xc3d1fde0
[   7.0889626] FSR=00000017, FAR=0000000c, spsr=60000013
[   7.1101287] r0 =c3d1fe3c, r1 =0000000c, r2 =00000002, r3 =00000040
[   7.1326088] r4 =00000000, r5 =c3d1fea4, r6 =00000000, r7 =00000000
[   7.1511641] r8 =00ff00ff, r9 =c215c700, r10=00000000, r11=c3d1fe64
[   7.1697209] r12=00000028, ssp=c3d1fe30, slr=c017e8a0, pc =c01b960c

Stopped in pid 0.3 (system) at  netbsd:__aeabi_memcpy+0x9c:     ldrb    r3, [r1]
, #0x001
db> trace
0xc3d1fe64: netbsd:bpf_filter_ext+0x10
0xc3d1ff24: netbsd:bpf_deliver+0x2c8
0xc3d1ff44: netbsd:_bpf_mtap+0x94
0xc3d1ff6c: netbsd:if_percpuq_softint+0x9c
0xc3d1ffac: netbsd:softint_thread+0x94
db> 
```

たまにうまくいったりしますが、じきに落ちます。謎です。

このSOCのMACは設定用のパケットを送信してMACアドレスをMACに設定します。

RXのディスクリプタに貼った、mbufが腐る事があるようです。とりあえずmtod()して0だったら捨てるワークアラウンドを入れたら、どうにか落ちないようになりました。なんで腐るのかを調べる必要がありそうです。
正規化


## 第１正規形
繰り返し項目を別レコードとして独立させ、各レコードの長さを整える
## 第２正規形
第１正規形から部分関数従属している列を切り出したもの。依存している列を別テーブルにする。
### やり方
1. 候補キーを検出する
2. 部分関数従属性を検出する
3. 射影によって部分関数従属性を取り除く

## 第３正規形
主キー以外の列に関数従属している列を切り出す

## まとめ
簡単に言うと、行、列の繰り返しを無くす。
Node.js便利パッケージ集

# 私の推しパッケージ集

### chalk

コンソール装飾

https://npm.im/chalk

### chalk-animation

chalkのアニメーション

https://npm.im/chalk-animation


### express

言わずもがなのWebサーバー

https://npm.im/express

### express-session

Expressのアドオンのような感じ。

https://npm.im/express-session

### body-parser

リクエスト解析用

https://npm.im/body-parser

### ytdl-core

YouTubeダウンロード

https://npm.im/ytdl-core

### youtube-search

YouTube検索

https://npm.im/youtube-search

### puppeteer

Chromium操作

https://npm.im/puppeteer

### prism-media

Discord.js Voice依存関係

https://npm.im/prism-media

### node-fetch

フェッチモジュール

https://npm.im/node-fetch

requireで使いたいなら2.6.6を使用

### whois

Whoisモジュール

https://npm.im/whois

### socket.io

クライアント・サーバー間の通信を簡単に実装する

https://npm.im/socket.io

### ms

ms操作

https://npm.im/ms

### electron

GUI実装

https://npm.im/electron

### PM2

プロセス監視・実行

https://npm.im/pm2

バカ便利。


### 追記
そのうち…（）
【Python】時刻を10分毎に時間を丸める処理を自分で書くかChatGPTに任せるか

# 時間を10分単位で丸める処理を書きたい！
例えば
```
05時34分 → 05時30分
10時13分 → 10時10分
```

とする関数が欲しくなりました。そもそも10分でまるめるという日本語合ってますかね？
適当に調べて書いた自分のコードがこちら

```python:自分で書いた.py
import datetime
from datetime import timedelta
def ten_minutes_rounder(t):
    return (t.replace(second=0, microsecond=0, minute=0, hour=t.hour) + timedelta(minutes=round(t.minute, -1)))

dt = datetime.datetime.now()
rounded_time = ten_minutes_rounder(dt)
print(rounded_time)
```

~~これで結果は正しそうです~~
2023/02/18追記
これだと若干挙動が間違ってました。
コメントで指摘をいただきました。pythonのroundは四捨五入ではなく偶数丸めのようです。たとえば25分のときは30分を返してほしいのですが、20分を返してしまいます。なので結局素直にChatGPT様にコードを書いてもらうほうが良さそうです。

# もしかしてChatGPT君ならもっと良いコードが書ける？
この程度ならChatGPTにまかせてよかったのでは？と思ったのでChatGPTに聞いてみたところ…
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/87cef53a-743b-f1ee-53bf-4343d4d2b925.png)

この様に帰ってきました。

```python:chat_gpt.py
import datetime

def round_time_to_nearest_10min(dt):
    minute = dt.minute
    delta = (minute + 5) // 10 * 10 - minute
    return dt + datetime.timedelta(minutes=delta)

dt = datetime.datetime.now()
rounded_time = round_time_to_nearest_10min(dt)
print(rounded_time)
```

これでも問題ないのですが、返り値が`2023-02-01 09:10:08.965311`と秒数まで丸めていないので（特に丸める必要はなかったのですが…）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290902/b00fb883-b64d-2fae-64aa-381c50e6a0c3.png)

```python:chat_gpt_2.py
def round_time_to_nearest_10min(dt):
    minute = dt.minute
    delta = (minute + 5) // 10 * 10 - minute
    rounded_dt = dt + datetime.timedelta(minutes=delta)
    return rounded_dt.replace(second=0, microsecond=0)

dt = datetime.datetime.now()
rounded_time = round_time_to_nearest_10min(dt)
print(rounded_time)
```

と指示通りにコードを直してくれました。
書いてくれたコードしては自分のほうがコード量は少ないですが
- ライブラリを少なく済ませている
- メソッド名が自分のより明確
と敗北を喫しました。
このレベルのコードならChatGPTにまず書かせたほうが早そうです。
顧客分析の手順 - 分析フォーマットの適用例： 行動トレンド分析 新規獲得顧客の定着トレンド 

:::note
この本書は2017年4月1日にTeradata Japanのブログに掲載された内容を、再掲載したものです。
掲載内容の正確性・完全性・信頼性・最新性を保証するものではございません。
また、修正が必要な箇所や、ご要望についてはコメントをよろしくお願いします。
:::


著者 山本 泰史 （やまもと やすし）

# 顧客分析の手順

## 第11回： 新規獲得顧客の定着トレンド

前回に示した分析フォーマット（5つ）と分析テーマ（3つ）に基づき、今回より 15 の分析例をご紹介していきます。今回は「行動トレンド分析」という分析フォーマットを利用した、「新規顧客の獲得」のための分析です。

### 分析の前提
「新規顧客の獲得」という分析テーマは、大きく以下の 2つを目的としています。現実的に、未だ顧客となっていない人々のデータは保持されておらず、見込み客としての関係が存在しない限りにおいては、分析のしようがありません。しかしながら新規に獲得した顧客を定着させるという目的、そして新規に増加している顧客像を捉え、マスマーケティングやメディア選定を実施するうえでの参考にするという目的において寄与することが可能です。

１. 新規に獲得した顧客のフォローアップを行い、定着を図る

２. 獲得顧客のプロファイルから、獲得可能性のある顧客プロファイルを理解する

今回は、この 1. の目的に沿って分析を実施します。想定する企業としてはクレジットカード会社、新規にカード会員として入会した顧客が対象です。図19A に分析フォーマット（グリッド）を示します。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/87fdc7ae-880d-860c-faa1-d9dfc47c101f.png">



### 定着状況の理解
分析の対象顧客として、2008年12月に新規入会したセグメントを対象としています。指標値として顧客数を用い、属性として月間の利用回数を、0回、1-3回、4-6回、7-9回、10回以上という 5つの属性に分割して利用しています。そして対象セグメントを 4ヶ月間、月毎にトレンドで集計しています。各月の合計を示していますが、何らかの理由で早々と退会された顧客もいるため、合計顧客数としては微減で推移しています。

これをグラフで示したのが図19B です。データ内容は同じですが、横軸に時間トレンドをおいてそれぞれの構成比の推移を把握できるようにしています。この企業としては、カード会員として入会いただいたからには、お買物やキャッシング等でカードをお使いいただきたいと考えています。

<img width="700" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2768546/ecf1eebe-f0aa-d080-8c91-8854d7eab064.png">


このため、このようなグラフが表示された際に期待するのは、利用回数ができるだけ多くなっているような構成です。しかしながら、一定数の顧客における利用が 0回ということで、入会はしたもののお使いいただけていないことが分かります。もしかしたら入会月から 1ヶ月間程度は利用の機会が無かったり、実質的にカードが届かなかったりといった理由もあるかもしれませんので、0回という結果（13,611名: 図19A 参照）もやむをえないかもしれませんが、以降もご利用いただけていない場合、他社のカードとの競合の中で埋没して利用されていない等の可能性が想定できます。もちろん利用頻度が低く、1度使って次の月は利用 0 といった顧客もいらっしゃるかもしれませんが、月あたり 4,000名強が利用回数 0 のまま推移していることが分かりました。

月1回以上ご利用いただいている顧客に関しては、定着化傾向にあることが伺えます。特に月7回以上の利用は増加傾向にあることがグラフから伺え、これらの顧客に関しては定着化が完了し、生活の中の支払い手段の一つとして位置づけられていることが想定できます。1ヶ月は 30日ですので、4-5日に 1回程度の頻度でご利用いただけていると想定できます。おそらくメインカードとして自社のカードが位置づけられています。

### アプローチの方向性
ここまでの理解から、申し込みから 1ヶ月、もしくはカード到着想定日から数週間経っても利用回数が 0回の顧客に関しては、まずは「利用」を定着させることが求められます。最初の利用に対してポイント付与等のインセンティブを提供する等、まずは一回使っていただくことに主眼を置いたキャンペーンが必要です。また、利用にあたっての不明点があるかもしれないため、利用方法や利用にあたっての心配事／疑問に対する回答をまとめたご案内を行なうことも考えられます。

また、具体的な利用先の提案として、他の新規顧客の利用先（オンラインショッピングなのか、レストランなのか等）と顧客プロファイルを分析して、「使ってみようかな」と思わせる利用先を案内することもキャンペーンアイデアとして考えられます。新規に獲得したばかりの顧客群であるため、分析の対象と出来るデータはお申し込み時のデータ（主にデモグラフィック属性）に限られるかもしれませんが、それでも数パターン（性別、年齢層別等）に分けた利用先提案が可能です。



このように新規に獲得した顧客の行動トレンドを捉えることによって、顧客の定着／未定着状況を捉え、フォローアップをすべき顧客群とその内容についての検討が可能となります。



#### Teradata Vantageへのお問合せ
[Teradata Vantage へのお問合せ](https://www.teradata.jp/About-Us/Contact)
世界で一番簡単なGit

**Excel** を用いて、Git を超絶わかりやすく説明します。
![excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/5f41aa59-ece8-6a5d-eef0-5bfce93c0a24.png)

## Git を利用する前の状況

大規模システムを構築することは、一人では困難です。  
そのため、一般的にはシステム開発は複数人で行っています。

![team_dev.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/72bff759-5491-91d4-abd8-5dc67397559b.png)

Excel に例えると、  
一つのファイルをダウンロードし、複数人で編集する。  
…というものです。

![modify_excel.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/0e012dd0-7041-24b6-c2de-d07a1b35e852.png)

## Git を利用しないデメリット

この方法であると、ある不具合が生じます。

それは、  <span style="font-size: 200%; color: red;">「同時に編集してしまったために、先に編集した人の変更内容が消えてしまう。」</span>  というものです。

例）  
1. Aさんが sample シートの A1 に"〇"と入力し、15:00にサーバー上に格納する
2. Bさんが sample シートの A1 に"×"と入力し、16:00にサーバー上に格納する

![modify_excel_ab.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/b65d0f70-6717-f256-cf83-84c76f81016f.png)

Git を利用しない場合、  
サーバー上には、sample シートの A1 に"×"と入力されている Excel ファイルが格納されています。


すると、Aさんは
![a_question.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/e0a8c438-5aa7-61e0-676f-a9c016611bd3.png)
・・・となるわけです。

このように1つくらいの修正であればすぐに戻せますが、  
やっとの思いで書いた文章が上書きされてしまったら、直すことにも時間がかかります。

![a_worry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/edf0b22f-f6cc-38a1-c4e6-02d345ceff97.png)

## Gitでできること

主に3つあります。

![merit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/6dfbaee5-1a17-30b7-2077-ad99e07e21d2.png)
### ①ファイルの変更履歴を管理できる

Gitを使うことによって、ファイルをいつ・誰が・どのように修正したか管理できます。

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/9eaac81b-2d60-e0f6-0dad-770df376c906.png)

これにより、どのように変更したかあとから確認できます。

![can_check.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/f833f8ec-7e2e-e5b9-3ca1-15b3c324357e.png)

### ②過去のファイルに戻すことできる

Gitを使うことによって、ファイルを過去の状態に戻せます。

![aaa.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/9eaac81b-2d60-e0f6-0dad-770df376c906.png)
![can_modify.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/60413433-2b0c-2e67-853b-3926ea91190f.png)

### ③複数人で修正したファイルを統合できる

Gitを使うことによって、複数人で修正したファイルを統合できます。

![collaborate.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547575/0605d100-5809-6daa-a791-28c4df824215.png)

これにより、1つのプログラムやファイルにおいて複数人が同時に進めなくてはならない別々の作業を、トラブルなく進めることができます。


## 参考資料

- [Gitの特徴とメリットを紹介！基礎用語と仕組みを解説（コ==ドカキタイ）](https://one-div.com/tool/git-features-and-benefits)
Could not find database with ID:DATABASE_ID. Make sure the relevant pages and databases are shared with your integration.

notionのdatabaseidが正しくセットされていてもデータベースでエラーになる。

ここからintegrationを設定する
![Journal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5472/082e34c3-e5c6-32a3-cf18-a17e92a45e8e.png)





## エラー内容

```
@notionhq/client warn: request fail {
  code: 'object_not_found',
  message: 'Could not find database with ID: DATABASE_ID. Make sure the relevant pages and databases are shared with your integration.'
}
/yourprojectpath/node_modules/@notionhq/client/build/src/errors.js:162
        return new APIResponseError({
               ^

APIResponseError: Could not find database with ID: DATABASE_ID. Make sure the relevant pages and databases are shared with your integration.
    at buildRequestError (/yourprojectpath/node_modules/@notionhq/client/build/src/errors.js:162:16)
    at Client.request (/yourprojectpath/node_modules/@notionhq/client/build/src/Client.js:347:54)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at async main (/yourprojectpath/create.js:76:3) {
  code: 'object_not_found',
  status: 404,
  body: '{"object":"error","status":404,"code":"object_not_found","message":"Could not find database with ID: DATABASE_ID. Make sure the relevant pages and databases are shared with your integration."}'
}
```
VisualStudio学習メモ

### VisualStudioとは

Microsoft社が作った総合開発環境（IDE）

IDEとは
    コードエディタ
    コンパイラ
    リンカ
    デバッガ
    テストツール
    バージョン管理ソフト
    開発に必要なソフトウェアが1つに合体している。

VisualStudioで使える言語

Visual Basic
Visual C#
Visual C++
Visual F#
Python
JavaScript
TypeScript


CUIとGUI
CharacterUserInterFace
GraphicalUserInterFace

iOS/Android/Windows　のアプリ開発ができる。

スマホアプリの開発


3Dゲームの開発

Windowsクラシックアプリの開発

UWPアプリの開発

Officeアプリケーションの拡張ツールの開発


アプリケーションの種類

コンソールアプリ
    コマンドプロントで動作する、CUIベースのアプリ
    グラフィカルな表現を必要としない、バッチ処理や上級者向けのツール

Windowsフォームアプリ
    WindowsFormsというGUIフレームワークを使用する。GUIベース

WPFアプリ
WindowsPresentation Foundation　は、
WindowsFormの次に開発されたGUIフレームワーク
高度なグラフィック、DirectXによる３D表現に対応している。

UWPアプリ
    UPWアプリとは、ユニバーサルWindowsプラットフォームで動作するアプリのこと

ASP.NETアプリ
ファイルの先頭数バイトを削除したファイルを作成する

S3に書き出したファイルが再生できないので先頭数バイトを落としたファイルを作成した話
ちなみに再生できないファイルはバイナリファイルでみたとき、先頭に不要なデータが 47byte あるような状態だった。


最初`dd`かなとおもってオプションを確認してできた。

```sh
dd if=source.webm of=dest.webm bs=1 skip=47
```

が、どうやらtailでもできるようだ。
ddはオプションが特殊なので、tailのほうが覚えやすい。

```sh
tail -c +48 source.webm > dest.webm
```

-c オプションが文字数というかバイト数指定しているのは知っていたが、+Kで指定することで先頭Kバイト目以降を表示することができる。知らなかった。

同様に -n オプションでも +K で先頭K行目以降を表示すると指定できる。


ちなみにPowerShell (5.1)では、以下のようにできた。

```powershell
Get-Content -Path .\source.webm -Encoding Byte -Raw `
| Select-Object -Skip 47 `
| Set-Content -Path output.webm -Encoding Byte -NoNewline 
```

## 参考
- https://ja.manpages.org/tail
CUIでのUSBメモリからデータを引っ張る方法

## (1)USBメモリをポートに差す。

## (2)パーティションを下記コマンドで確認。
```
$ fdisk -l
fdisk: cannot open /dev/sda: Permission denied
```
*一番最後に出てくるのがUSBメモリのパーティション

## (3)マウントする。
```
$ sudo mount /dev/sda1 /mnt
            (マウント元)(マウント先)
```

## (4)マウントされたディレクトリを確認するとUSBメモリの中身が確認可能。
```
$ ls /mnt
```

## (5)終了後はアマウントしてUSBメモリを抜く。
```
$ sudo umount /mnt
```
githubにプロジェクトをアップロードする時にでたエラー　error: src refspec master does not match any


remote add origin https://github.com/ユーザー名/ディポジトリ名.git
git push -u origin master
を入力すると

error: src refspec master does not match any
error: failed to push some refs to 'https://github.com/ユーザー名/ディポジトリ名.git'

参考にしたサイトが古く
git push -u origin master
ではなく
git push -u origin main
でエラーは突破

以前から利用していたディポジトリはmasterのままで良いらしい

しかしmaindeプッシュしようとするとgithubのユーザーネーム、パスワードの入力を求められるので入力すると今度は

remote: Support for password authentication was removed on August 13, 2021.
remote: Please see https://docs.github.com/・・・
fatal: Authentication failed for 'https://github.com/・・・

とでてきた。
調べてみると現在はパスワードでのアクセスはできず、トークンを使用しなければいけないらしい。

github右上の自分のアイコンをクリックしsettingsを選択
Developer settingsを選択
Personal access tokensの中のtoken (classic)を選択
右上のGenerate new tokenを選びGenerate new token(classic)を選択

Noteにtoken名を入力
Expirationは有効期限なので好きなものを選択。今回は30daysにした。
Scopesの中のrepo、admin:repo_hook、delete_repoにチェックを入れGenerate tokenをクリック

作成されたtokenをコピーする
このtokenはもう表示できないのでどこかに保存する

ターミナルでもう一度
git push -u origin main
を実行するとユーザー名を求められるので入力
パスワードど入力で先ほどコピーしたtokenを入力

無事にプロジェクトフォルダがpushされた！！
回帰直線をPythonで引きたいならどうする？

# はじめに
問題
+ 回帰直線をPythonで引きたいならどうする？
    + notebookを使用している

# 方針・解法
matplotlibとseabornを使おう！

# 解答例
~~~python
import seaborn as sns
%matplotlib inline 

width = 12
height = 10
plt.figure(figsize=(width, height)) # 縦と横の大きさを決める

# 実際に線を引く
sns.regplot(x="hogehoge", y="hogehoge", data=あなたが分析したいデータ)
plt.ylim(0,) # Xの下限を０に設定する
~~~

# 参考文献
[Estimating regression fits -seaborn-](https://seaborn.pydata.org/tutorial/regression.html)
[【初心者向け】seaborn入門 | Pythonを使ってデータを綺麗に可視化してみよう！](https://aiacademy.jp/media/?p=1834)
クロス集計表を作成する1＊2_度数(SPSS Modeler データ加工逆引き11-8)

# クロス集計表を作成する（1＊2_度数の集計表）

![スクリーンショット 2023-01-23 10.24.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/d2bdc429-81e5-e26c-a11e-ccf13be13971.png)

## 1.想定される利用目的

・データ理解のためのレコード度数分布確認
・固定帳票の作成


## 2.サンプルストリームのダウンロード

https://github.com/yoichiro0903n/blue/blob/main/cross_tabulation1_2f.str?raw=true

## 3.サンプルストリームの説明

![スクリーンショット 2023-01-23 10.29.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6e6b1a14-02c6-3d38-3f09-7462a640a2bc.png)

a.入力するデータは以下の通りです。
![スクリーンショット 2023-01-10 15.25.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/6a3ee1b3-3395-601f-47bd-e9d72d72bb77.png)

b.　[フィールド作成]ノードを編集します。　[血液型]と[年代]を　[ >< ]で文字列結合します。　
![スクリーンショット 2023-01-23 10.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/ebfc37da-4ec7-3b1d-8de1-64b5c5f193c2.png)

[プレビュー]します。
![スクリーンショット 2023-01-23 10.33.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0a6199b6-9c99-30ae-3132-e1b62d2e1514.png)

c.[データ型]ノードで　[値の読み込み]ボタンを押して後続dのために合成変数の値を認識します。

d.[再構成]ノードを以下のように編集します。[合成変数]を[再構成フィールド]に移して[値フィールド]はブランクのまま[数値フラグを作成]を選択します。
![スクリーンショット 2023-01-23 10.34.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e70da876-296c-a766-7c8c-d52e1c991351.png)

[プレビュー]します。
![スクリーンショット 2023-01-23 10.35.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/e8d5829e-21a8-5b12-4d0a-6f9425d7ec9b.png)

e.[レコード集計]ノードを以下のように編集します。
![スクリーンショット 2023-01-23 10.34.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/85f45a4a-f9e3-b925-bbb3-b5ad2a7fd95f.png)

f.[ソート]ノードで[年代]を[昇順]ソートします。

g.[フィルター]ノードで集計の過程で各フィールドに自動付与された[_Sum]を取り除きます。

h.[フィールド順序]ノードで適宜表示する列の順番を変更します。

[デーブル]ノードを実行します。
![スクリーンショット 2023-01-23 10.36.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286322/0952cfa2-fbe1-0f0c-a523-196ebb08433a.png)

#### 注意事項

[再構成]ノードで列に展開するメンバーが表示されないときは前方でデータ型の[値の読み込み]を実行します。
Excelで表頭を入れ子にすると表が見やすくなります。

## 4.参考情報

####  SPSS Statistics Custom Tablesと連携して多重クロス集計を作成する

https://www.ibm.com/blogs/solutions/jp-ja/spss-stats-tips-06/

####  カテゴリ値を列に展開してIDで集約　縦持ちを横持ちへ

https://qiita.com/416nishimaki/items/2519553c7cce0fc0b0e0

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

https://qiita.com/416nishimaki/private/503037195081d3323eee

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

https://qiita.com/416nishimaki/private/4bf813e6cba84b2a1008
ReactGA.initializeに環境変数を与えようとした時に少し詰まったこと

<h1>はじめに</h1>

本題の前にcreate react appとviteでは環境変数の指定の仕方が違うということを紹介したい。

viteでは.envにある環境変数の名前を**VITE_SOME_KEY**のようにVITE_を頭につける必要がある。

呼び出すには**import.meta.env.VITE_SOME_KEY**を使う。

<h1>ReactGA.initializeに環境変数を代入</h1>

はじめにの内容を踏まえて、
``ReactGA.initialize(import.meta.env.VITE_SOME_KEY)``
と書いたがエラーが起きた。

結論としては、値がStringとして認識されていないことが原因だった。

``ReactGA.initialize(String(import.meta.env.VITE_SOME_KEY))``

と書くことで、問題なく環境変数を読み取ることが出来た。
【レビューで指摘されがちシリーズ】old より previous のほうが一つ前の情報だと分かりやすい

とあるイベントハンドラ内で、前回の値から変化していたら何がしかを行うコードを書いていました。

```C#
if (oldValue != hoge.Value)
{
    // 何がしかの処理
    // ...

    // 前回値を更新
    oldValue = hoge.Value
}
```

レビューでこのような指摘をもらいました。
> 細かいですが、oldよりpreviousが良いです。 oldだとどれくらい古いかわからないですが、previousだと一個前ってわかるので

なるほど～。こうですね。

```C#
if (previousValue != hoge.Value)
{
    // 何がしかの処理
    // ...

    // 前回値を更新
    previousValue = hoge.Value
}
```

知らない単語であれば調べる機会はあるのですが、「古い = old」一択！と思っていたので指摘されて初めて previous という単語を知りました。

参考

https://eigoedu.com/previous-former-ex-before/
【Terraform】AWSの既存リソースをimportする際にデフォルトのリージョンとは別のリージョンを指定する

# 環境
- terraform 1.3.7
- provider aws 4.51.0

# 概要
AWS CloudFrontでは、北部バージニア（us-east-1）のACM証明書しか使えない。
そのため、デフォルトのリージョンを東京(ap-northeast-1)等、北部バージニア以外で設定している場合は、Terraformでの既存リソースimport時にも、ACM用に個別のリージョン指定が必要となる。

今回はデフォルトのリージョンが東京のケースを想定。

## 初期設定
```terraform:provider.tf
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region

  assume_role {
    role_arn = var.role_arn
  }
}
```

```terraform:variables.tf
variable "access_key" {
  description = "AWS Access Key"
}
variable "secret_key" {
  description = "AWS Secret Key"
}
variable "role_arn" {
  description = "AWS Role Arn"
}
variable "region" {
  default = "ap-northeast-1"
}
```

```terraform:production.tfvars
access_key      = "XXXXX"
secret_key      = "XXXXX"
role_arn        = "XXXXX"
```

```terraform:acm.tf
resource "aws_acm_certificate" "static" {
  domain_name       = "static.my-app.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = false
  }
}
```

この状態で、importを実行

```console
terraform import aws_acm_certificate.static arn:aws:acm:us-east-1:XXXXXXXXXXXX:certificate/XXXXXXX
```

すると、
```Cannot import non-existent remote object```
のエラーが発生する。

## 個別にリージョンを指定
そこで、設定を追記し、デフォルトとは別のリージョンを個別で指定する。

```diff_terraform:provider.tf
provider "aws" {
  access_key = var.access_key
  secret_key = var.secret_key
  region     = var.region

  assume_role {
    role_arn = var.role_arn
  }
}

+ provider "aws" {
+   alias  = "acm_provider"
+   region = "us-east-1"
}
```

```diff_terraform:acm.tf
resource "aws_acm_certificate" "static" {
+ provider          = aws.acm_provider
  domain_name       = "static.my-app.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = false
  }
}
```

これにより、acm.tfのaws_acm_certificate.staticだけは、us-east-1のリージョンを対象としてくれる。import時にもここで指定したリージョンでリソース情報を取りに行くようなので、これでimportすることが可能。

尚、こちらの記事を参考に、

https://github.com/hashicorp/terraform-provider-aws/issues/9180#issuecomment-518358642

公式ドキュメントに記載のある```-provider=provider```オプションを使ってimportを試みたが、そちらはうまくいかなかった。

> **-provider=provider** - Deprecated Override the provider configuration to use when importing the object. By default, Terraform uses the provider specified in the configuration for the target resource, and that is the best behavior in most cases.

https://developer.hashicorp.com/terraform/cli/commands/import#provider-provider


# 最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです！
自動化ツール Autoit の環境構築

## 本体のダウンロード

Current Version(v3.3.16.1, 2022/9/19現在)をダウンロードする。

[AutoIt Downloads](https://www.autoitscript.com/site/autoit/downloads/)

## 任意のダウンロード

### 操作記録を使う場合

上記のCurrent Version(v3.3.16.1)には操作記録モードが付属していないので、アーカイブから```v3.3.14.0.zip```をダウンロードする。

[Index of /autoit3/files/archive/autoit](https://www.autoitscript.com/autoit3/files/archive/autoit/)

Zipの中からinstall\Extras\Au3Recordフォルダを```C:\Program Files (x86)\AutoIt3\Extras```へコピーすることで、```Au3Record.exe```を起動できる。

### VSCodeでデバッグする場合

[VSCodeの拡張機能](https://marketplace.visualstudio.com/items?itemName=Damien.autoit)をインストールして```Autoit: Run Script (F5)```を実行した場合、
```C:\Program Files (x86)\AutoIt3\SciTE\AutoIt3Wrapper\AutoIt3Wrapper.au3```が無いエラーが発生する。

その場合、```SciTE4AutoIt3.exe```をインストールするとAutoIt3Wrapper.au3も付属している。

[AutoIt Script Editor Downloads](https://www.autoitscript.com/site/autoit-script-editor/downloads/)
WordPressでトップページとそれ以外でh1タグを切り替える方法

WordPressでトップページとそれ以外のページでh1タグを出し分けたい場合、if文で書いたりしていませんか？

## あるあるな記述

```php
<?php if(is_front_page()): ?>
  <h1 class="logo">
    <a href="<?php esc_url(home_url()); ?>">ロゴ</a>
  </h1>
<?php else: ?>
  <div class="logo">
    <a href="<?php esc_url(home_url()); ?>">ロゴ</a>
  </div>
<?php endif; ?>
```

## 良い例（三項演算子で簡単に書く）

```php
<?php $title_tag = (is_home() || is_front_page()) ? 'h1' : 'div'; ?>
<<?php echo $title_tag; ?> class="logo">
  <a href="<?php echo esc_url(home_url()); ?>">ロゴ</a>
</<?php echo $title_tag; ?>>
```

これで簡単に出し分け完了です。
Docker超入門 誕生した年やルーツについて

dockerは、dotcloud(旧社名)が開発元になります。

2013年9月にはDockerに社名変更されています。

スタートアップであったdotcloudについては、2008年にカメル・フォナディ、ソロモン・ハイクス、セバスチャン・パールによりパリで法人化され会社としての存在を現しました。

決して2013年に爆誕した訳ではありません。
2008年からルーツとなる法人が存在していました。
C#でDataverseにグローバル オプション セットを作成してみた

# はじめに
PowerAppsのモデル駆動の設定が面倒なのでC#からDataverseを操作してみたくなった。
今回はdataverseにグローバル オプション セットを作成するC#のコードを動かしてみる。

# 前提
参照ライブラリやCreateCrmService関数の中身は以前の以下の記事を参考に

C#でDataverseに接続してテーブル一覧を表示してみた
https://qiita.com/akihiroe_/items/2db8e2634d7962ef0df7

# コード
CreateOptionSetRequestのリクエストを作成して実行すれば良いだけのようです。

```C#
var organizationService = CreateCrmService(user, password, url);

var optionSetName = "test_optionset1";
var optionSetDisplayName = "オプションセット１";
var optionSet = new string[] { "選択A", "選択B"};

var oSet = new OptionSetMetadata
{
    Name = optionSetName,
    DisplayName = new Label(optionSetDisplayName, 1041),
    IsGlobal = true,
    OptionSetType = OptionSetType.Picklist,
};
oSet.Options.AddRange(optionSet.Select(x=> new OptionMetadata(new Label(x, 1041), null)));

var request = new CreateOptionSetRequest { OptionSet = oSet };
var response = organizationService.Execute(request);
Console.WriteLine(response.Results["OptionSetId"]);
```
*Labelクラスの引数1041は日本語の言語コード
*OptionMetadataの第２引数に数字を指定するとオプションセットのvalueを指定することができる
# おわりに
グローバルオプションセットもテーブルや属性と同じような感じで専用のリクエストクラスを作成して実行のパターンでした。都道府県の選択肢をグローバルオプションセットで作る場合など大量の選択肢がある場合にコードで作成すると便利な気がしています。

# 参照情報
https://learn.microsoft.com/ja-jp/dotnet/api/microsoft.xrm.sdk.messages.createoptionsetrequest?view=dataverse-sdk-latest
expect と spawn のサブルーチン化

# expect のメモ
expect は、LANスイッチやサーバなどに自動接続してアレコレするのに便利なスクリプト。

## expect の基本形
以下、ssh で接続して接続先で適当なコマンドを発行する例。
spawn して expect, send の繰り返しのため、サブルーチン化したい。

```tcl:sample1.ex
#!/usr/bin/expect
set timeout 5
spawn env LANG=C ssh user@192.168.0.10
expect "assword:" { send "userpass\r" } 
expect "\\\$"
send "echo hello\r"      ; # 任意のコマンド実行例1
expect "\\\$"
send "pwd\r"             ; # 任意のコマンド実行例2
interact
```

## expectとsend をサブルーチン化（-> OK）
spawn 後の expect と send は基本的に対で実行するため、proc で
サブルーチン化すると連続したコマンド発行を(見た目)簡素化できる。

```tcl:sample2.ex
#!/usr/bin/expect
set timeout 5

proc SENDS { data } {  ; # <---- サブルーチン化
  expect "\\\$"
  send "$data\r"
}

spawn env LANG=C ssh user@192.168.0.10
expect "assword:" { send "userpass\r" } 

SENDS "echo hello"   
SENDS "pwd"          
interact
```

```:結果
$ ./sample2.ex
spawn env LANG=C ssh user@192.168.0.10
user@192.168.0.10's password: 
Last login: Sun Jan 29 01:53:32 2023 from mypc
$ echo hello
hello
$ pwd
/home/user
```

## spawn をサブルーチン化（-> NG）
上記の例に続けて、spawn もサブルーチン化すると期待通りの動作をしない。
expect -d で見ると、spawn_proc の spawn で生成されたプロセスID である spawn_id が 
spawn_proc 外で参照できない局所的な値のためらしい。

```tcl:sample3.ex
#!/usr/bin/expect
set timeout 5

proc SENDS { data } {
  expect "\\\$"
  send "$data\r"
}

proc spawn_proc { } {  ; # <---- サブルーチン化
  spawn env LANG=C ssh user@192.168.0.10
  expect "assword:" { send "userpass\r" } 
  SENDS "echo hello"   
  SENDS "pwd"          
  interact
}
spawn_proc             ; # <---- spawn 呼び出し
```

```:結果
$ ./sample3.ex
spawn env LANG=C ssh user@192.168.0.10
user@192.168.0.10's password: echo hello  <---sendが正しく動作していない
Last login: Sun Jan 29 01:59:16 2023 from mypc
```

## spawn_id を send に渡す（-> OK）
spawn_id を別のサブルーチンに引数で渡し、受けた側は `expect -i` と `send -i` で使う。

```tcl:sample4.ex
#!/usr/bin/expect
set timeout 5

proc SENDS { sid data } { ; # <---- 引数で受け取る
  expect -i $sid "\\\$"   ; # <---- -i オプション
  send -i $sid "$data\r"  ; # <---- -i オプション
}

proc spawn_proc { } {
  spawn env LANG=C ssh user@192.168.0.10
  expect "assword:" { send "userpass\r" } 
  SENDS $spawn_id "echo hello"   ; # <---- 引数で渡す
  SENDS $spawn_id "pwd"          ; # <---- 引数で渡す
  interact
}
spawn_proc          
```
これは期待動作する。

## spawn_id を global 宣言する（-> OK）
spawn をサブルーチン化する proc で `global spawn_id` する。

```tcl:sample5.ex
#!/usr/bin/expect
set timeout 5

proc SENDS { data } {
  expect "\\\$"
  send "$data\r"
}

proc spawn_proc { } {
  global spawn_id      ; # <---- 追加
  spawn env LANG=C ssh user@192.168.0.10
  expect "assword:" { send "userpass\r" } 
  SENDS "echo hello"  
  SENDS "pwd"
  interact
}
spawn_proc
```

同じく動作する。SENDS 側は `global spanw_id` しなくていい。
swagger editorでサーバー側のコードをaspnetcoreで出力した時の話

## なぜSwaggerなのか

元々typescript+expressで地道に作成していたWebAPIのソースコードが肥大化してきて管理がしづらくなってきたのでSwaggerのyamlで管理しようと考えたのが始まりです。

APIドキュメントも作成できるのでパッと見でどんなAPIがあるのかわかりやすくなる利点もあります。
~~Request,Response用のクラスを作るのが面倒だったわけでは決してありません。。。~~

## コードを出力してみる

■Swagger Editor
https://editor.swagger.io/

左側のyamlファイルを入力してから[Generate Server] → [aspnetcore]を選択すると
ソースコード一式がダウンロードされます。

![Pasted image 20230201070425.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/e4897cc1-a006-7aa3-123e-db3d52641f7b.png)


[aspnetcore-server-generated.zip]というファイルを解凍すると[IO.Swagger.sln]があるのでそちらをクリックしてvisual studioを起動します。

■Visual Studio 2022 Communityは無料で使えます
https://visualstudio.microsoft.com/ja/vs/community/

## .Netのバージョンが古い
プロジェクトファイルのプロパティを見てみると、.Net Core 3.1となっています。

![Pasted image 20230201071516.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/b1188805-9561-f05b-99e5-a30a24c6d7eb.png)
![Pasted image 20230201071630.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/0232b075-6df5-e8c7-1ae0-482b47acc2e8.png)


このターゲットフレームワークを.Net 7.0に変更します。

![Pasted image 20230201071826.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/66c6e52b-12da-92ed-3787-0ff97b8509a2.png)

## Swashbuckleのバージョンも古い
というわけなのでSwashbuckleもバージョンを上げてしまいましょう。
NuGet → 更新プログラムからまとめて更新します。

途中で出てくるダイアログは全部OKで！
![Pasted image 20230201071958.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/f289b3fe-b09c-406a-656a-39e4bdee7403.png)
![Pasted image 20230201072314.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/468b5b60-244d-2d3b-f0d0-7c017bb8b0c2.png)


swagger.yamlの記述に問題なければこれで問題なく起動できるはずです。

## まぁ問題なく起動できなかったんですけど。
私の環境ではなぜか上記のメッセージが表示されてIIS Expressが起動できません。
![Pasted image 20230201072521.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/3a953e73-e5e6-f5f8-4c45-39f5f4975894.png)


ただ、同じ手順で会社のPCで試した時は問題なく起動したので
自PCの問題かもしれません。

起動してSwagger UIが表示された皆さんはおめでとうございます。

どうも50352ポートが使用されているとメッセージが出てくるんですけど
調べても使ってないし、task killしても引き続きエラーになります。

## 回避策(解決はしてない)

雑な方法ですが、launchSettings.jsonを書き換えます。
![Pasted image 20230201072947.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/1893d5c1-4a84-df16-3c38-d5230b8c6c22.png)
![Pasted image 20230201073258.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/babb7804-bcd5-d10b-a8ce-3054b781b1b7.png)

8080とかに書き換えましたが他のアプリケーションと被らないポートを設定してください。

このあと一応リビルドかけてVisual Studioをいったん閉じて開き直します。

## おまけ
Startuo.csで下記の様なエラーになる場合は**TermsOfService**の行をコメントアウトすればエラーにならなくなります。swagger.yamlでキチンと定義してあれば問題ないはず。
![Pasted image 20230201073855.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/44c91efb-7db2-e131-bf38-643538700fb8.png)

APIドキュメントが表示されていればOKです！
お疲れ様でした！
![Pasted image 20230201073812.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2532264/e9400740-d0ed-67c1-f717-5a8c0084c99a.png)
neosでlogix その105

# 概要
neosでlogixやってみる。
ツール、作ってみた。
ノードが同じ方向を向くようにしてみた。

# 整頓前

![2023-01-31 22.39.56.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3ac43ce4-67c4-bb4a-be86-18e754b225f8.jpeg)

# 実行結果

![2023-01-31 22.36.54.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/3a757ec3-751a-84f6-6047-5eb504497927.jpeg)

# 俺コード

zend3

```
{_, _, _, _, a, _, _, _, _, _} = StandardController GetActiveUser <Right>
Slot.Active = a
{_, b, _, _, _, _} = Raycaster 0,1,0 0,1,0 1000 false
c = b
	|> GetSlot
	|> GetObjectRoot
d = c
	|> FireWhileTrue
e = c
	|> FindChildByName "Logix" 2 true
f = ChildrenCount e
{_, g, _, _} = For f d do
	h = g
		|> GetChild
	j = AxisAngle 0,0,0 0
	{i, _, _} = GlobalTransform h
	i
	|> X 1 0 1
	|> SetGlobalTransform g h j 1,1,1
end
```

以上。
connect（stripe）でマーケットプレイスで自社商品を出品したい場合

# connectのアカウントタイプ
1.Standard
2.Express
3.Custom

### Standard
>Stripe の「Standard」アカウントは、通常の Stripe アカウントです。アカウント保有者 (お客様のプラットフォームのユーザー) は Stripe との関わりを持ち、ダッシュボードへのログインや自身での請求の処理を行うことができます。

### Express
>「Express」アカウントの場合、Stripe がアカウント登録と本人確認のプロセスに対応します。プラットフォームは支払いタイプを指定し、プログラムを使用して連結アカウントの入金設定を設定できます。プラットフォームは、不審請求の申請と返金に対する責任を負います。これは Custom アカウントに類似しています。

### Custom
>「Custom」 の Stripe アカウントはアカウント所有者にはほぼ見えません。お客様 (プラットフォーム) が、ユーザとのすべての対話に関する責任を負っています。Stripe が必要とするあらゆる情報の収集もこれに含まれます。お客様はアカウントの設定すべてを変更することができます。プログラムを利用して銀行またはデビットカードの口座に入金することも可能です。

[引用：stripe](https://stripe.com/docs/connect/accounts)

### マーケットプレイスの場合
マーケットプレイスの場合は、ExpressまたはCustomを使用するのが良いのではないかと思います。Standardを使用すると、ユーザーがダッシュボードへのログインが可能になり、商品やサブスクリプションなどを操作できるようになってしまいます。思ってもない操作があると、バグの原因になってしまいます。
僕は、個人開発で使用できるリソースが少ないため、Expressを使用しています。

# アカウントタイプごとの手数料の違い 
### Standardの場合
アカウントを所有することで発生する費用はありません。

### Express・Customの場合
入金等があったアカウントごとに月額200円、
入金ごとに250円、入金額の0.25%の費用が発生します。

例えば、入金があったアカウント数が10個存在すれば2,000円、
入金回数が20回ならば5,000円、入金額が1,000,0000円ならば2,500円
合計して9,500円の費用が発生します。

[引用：stripe](https://stripe.com/jp/connect/pricing)

# 自社商品を出品した場合
自社商品を出店する場合、自社アカウントだけStandardにし、自社アカウント以外をExpress・Customで運営するば、費用を安くすることができる。しかし、アカウントタイプが異なると、バグが起こりそうな匂いがする。だからといって、費用が発生するのも少し悔しい。

そこで考えたのが、自社アカウントだけプラットフォームの手数料を100%にするということ。手数料を100%にすることで、全てプラットフォームアカウトへ売上が移動し、出金時に手数料の発生を抑制することができる。（手数料を100%内にstripe側の手数料3.6%も含まれる）

``` controller.rb
# Checkoutで定額制の商品を販売する場合
Stripe::Checkout::Session.create({
    # 省略
    subscription_data: {
        application_fee_percent: 100, ### プラットフォームへ渡す手数料の割合のこと
    },
},{
    stripe_account: "attr_×××××××××" ### 連結アカウトのID
})
【bash】Windows Linuxのテキストファイル変換 Arch linux


日本語テキストファイル。WindowsとLinuxの相互テキストファイル変換の事。

# 環境

Arch linuxです。

# 方法

(1)　文字コード変換   はnkfがやります。　
(2)　改行コード変換   は、/usr/bin/dos2unixと/usr/bin/unix2dosがやります。DOSはCR+LFが改行コードで、UNIXはLFです。

# ツールのインストール

```
yay -S nkf-git dos2unix
```

# コマンド化

.bashrcに関数を作って、面倒なタイプを減らしましょう。
.bashrcに書き加えるコードを載せておきます。.bashrcを書き換えた後は、`source ~/.bashrc`で更新しましょう。

```
function dos2unix() {
    mv $1 $1.save
    nkf --ic=CP932 --oc=UTF8 $1.save | /usr/bin/dos2unix >$1
}

function unix2dos() {
    mv $1 $1.save
    nkf --ic=UTF8 --oc=CP932 $1.save | /usr/bin/unix2dos >$1
}
```

これで、Windowsのテキストファイルから、Linuxのテキストファイルに変換する時は、`dos2unix file`、逆は`unix2dos file`でいけます。 元のファイルはfile.saveという名前で残ります。dos2unixとunix2dosは名前を再定義していますが、この方がやりやすいと思ったので。

# 注意

・^Zが見つかった時はこういうメッセージが出ますが、ちゃんと変換されています。

```
dos2unix: バイナリ文字 0x1A が 20 行目で見つかりました
dos2unix: バイナリファイル stdin をスキップしています
```
Linaria のセットアップ for Next.js 13

# Motivation

Next.js 13 では新機能として `App Directory` が追加された。

https://beta.nextjs.org/docs/routing/fundamentals#the-app-directory

この機能を有効化した状態での Linaria(CSS in JS ライブラリ)[^1] の導入手順についてまとめる。
また、Stylelint のバージョン 14 の導入方法についても併せて記載する。

[^1]: Next.js 11 での Linaria 導入については[この記事](https://qiita.com/yaskitie/items/b1aec0d4f9c1fd598634)にまとめている

# Prerequisite

- Next.js 13 がインストール済みであること(13.1.4)
- node -v: v18.13.0
- npm -v: 8.19.3

# Setup

## Linaria

必要なパッケージをインストールする:

```sh
npm install next-with-linaria @linaria/babel-preset @linaria/core @linaria/react
```

`next.config.js` に以下のような形で記載する(必要箇所だけ抜粋):

```next.config.js
/** @type {import('next').NextConfig} */
const withLinaria = require('next-with-linaria');

const nextConfig = {
  // App Directory を有効化
  experimental: {
    appDir: true,
  },
  // お好みの設定を
  ..
};
module.exports = withLinaria(nextConfig);
```

以上となる。
以前までのバージョンよりもだいぶ簡潔な手順になっている。

:::note info
ちなみに、前回まで `next-linaria` というパッケージを利用していたが、該当リポジトリの[この issue ](https://github.com/Mistereo/next-linaria/issues/17)を見つけ、App Directory に対応したパッケージの存在を知ることになった。
:::

## Stylelint

必要なパッケージをインストールする:

```sh
npm install -D stylelint stylelint-prettier stylelint-config-prettier @stylelint/postcss-css-in-js postcss stylelint-order @linaria/stylelint-config-standard-linaria
```

`.stylelintrc` を以下のように記述する(一例):

```diff_json
{
  "extends": ["@linaria/stylelint-config-standard-linaria", "stylelint-prettier/recommended"],
  "overrides": [
    {
      "files": ["src/**/*.{jsx,tsx}"],
-      "customSyntax": "@stylelint/postcss-css-in-js"
    }
  ],
  "plugins": ["stylelint-order"],
  "rules": {
    "order/properties-alphabetical-order": true,
    "no-empty-source": null,
    "no-descending-specificity": null,
    "rule-empty-line-before": "never",
    "block-no-empty": null,
    "function-no-unknown": null
  }
}
```

#### 2023/2/5 更新

:::note warn
`"customSyntax": "@stylelint/postcss-css-in-js"`　があると、インラインスタイルを設定していると下記のようなエラーが出たため、削除した。
```
TypeError: Cannot read properties of undefined (reading 'includes') at ...
```
:::


### VSCode でファイルを保存(Cmd + S)した時にフォーマットする

extension をインストールする:

https://marketplace.visualstudio.com/items?itemName=stylelint.vscode-stylelint

`settings.json` を編集する(必要箇所だけ抜粋):

```settings.json
{
  ..
  "editor.codeActionsOnSave": {
    ..
    "source.fixAll.stylelint": true
  },
  "stylelint.validate": ["css", "scss", "typescriptreact"]
  ..
}
```

以上で、Linaria による CSS 記述部分に対して要件を満たしていないと警告がかかり、`Cmd + S` によりフォーマットすることができるようになった。
コマンドでフォーマットする場合は、スクリプトを追加する:

```package.json
{
  "scripts": {
    ..
    "stylelint": "stylelint --fix \"**/*.{js,jsx,ts,tsx}\"" // ダブルクォートをエスケープするの忘れないでね★
  }
}
```

:::note warn
コマンドによるフォーマットは、settings.json で `"editor.codeActionsOnSave.source.fixAll.stylelint": true` では走らないため注意
:::
データベースで扱うテーブルの話

未経験からエンジニアになりたい人は、プログラミングから始める人が多いと思いますが、
エンジニアの仕事は、プログラミングだけではありません。そして、プログラミングだけでは、エンジニアになれません。同時にプログラミングが苦手でも、システム構成や開発の流れを理解するとエンジニアに近づきます！
今回はデータベースで扱うテーブルについて更に詳しく調べてみましょう！

![インスタスライド_202301171.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/04670a64-be52-6c3d-6a6e-9f5d68019385.gif)


# テーブルとは

DB データベースを扱う時には、テーブルを作成します。

そのテーブルとはどんなものでしょうか？
特に現在の主流は、関係モデルです。
（リレーショナルDB）

他に階層モデル、ネットワークモデルがある。

# モデル・テーブル構成の例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/46dca002-cc2c-f152-9bbe-64134d8b7a6d.png)

# テーブルについて
１．テーブルとは、行と列からなる2次元のデータ構造で「関係」を記述します。

２．レコードとは、行をさす。RDBでは、データ1件を１レコードと呼ぶ。

３．カラムとは、列をさす。RDBでは、データ属性をあらわすものをカラムと呼ぶ。

４．マスタとは、様々な処理に継続的に利用されるものであり、メンテナンスが行われる様なテーブルを指す。

# ER図
テーブル設計時には、テーブルの構造をER図で表します。

Entity Relationship Diagram

# ER図のイメージ

エンティティのリレーションを表すER図
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/00c81457-d54c-e108-1a41-ff60efd68574.png)

主キーは、マスターのユニークキーデータと特定するユニークな番号等を指す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/2641314f-421f-d81a-4d59-ae6978bad2e0.png)

外部キーは、外部とリレーションがある事を示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23130/01e87d95-81fc-aad6-c19b-a58f52942c27.png)


# まとめ
ー　リレーションナルDBが主流

ー　RDBは、エクセルの表形式に似てる

ー　ER図でモデル・テーブルを設計する

ー　主キーや外部キーでエンティティのリレーションを表現する


# 最後に
未経験の皆さん、若手エンジニアの皆さん、勉強方法について悩みがあればなんでも気軽に質問して下さい！
これからも記事を書いていきますので、モチベーションアップのためフォロー、イイねお願いします。