OmniAICreator/Qiita-1.07M huggingface dataset:
関数型プログラミング~Phantom type（幽霊型）ってなんだろう~

Haskellのコードでしばしば見かける幽霊型について。

# Phantom type(幽霊型)の特徴
- 左辺で定義した型変数が右辺に全く現れない型
- 具体的な値に興味はなく、型の情報さえあれば十分な時などに使われる
    - 型の情報だけでやりたいことを実現するため、型レベルプログラミングの一種と捉えられる


## Pantaom type（幽霊型）の例
例として、次のようなものを考えます。
- 時刻の「分」と「時間」を区別できる型を作りたい
    - ただし、「分」・「時間」を表す値の型は同一の型としたい
    - 時刻に関する計算の処理も同一のものとしたい

### 時刻を保持する型を定義
まず、時刻を保持する型を定義します。

```Haskell
-- 型変数unitは右辺に現れないので幽霊型と呼ぶ
newtype Time unit = Time Int
  deriving (Num, Show)
```

ここで注目すべきは、型変数の'unit'が右辺で使用されていないことです。
このように、データ型定義の左辺のみに現れ、右辺には現れない型変数はphantom parameter(幽霊パラメータ)と呼ばれます。

### 時刻の単位を表す型の定義
さらに、時刻の単位を表す型を次のように定義する。


```Haskell
-- 空定義の型
data Minute
data Hour
```

上記の型は空の定義であり、具体的な値は持ちません。
具体的な値がない型なんて何の役に立つのだろうと思うかもしれませんが、Time 'unit'の'unit'の部分にこの型を当てはめることでタグのように使用することができます。

### 特定の時刻単位を持つ型の定義
上記により、特定の（温度）単位を持つ温度を表す型を定義することができます。

```Haskell
-- 空定義の型Hourがタグのように利用され、Time Minute型と区別することができる
oneDayInHour :: Time Hour
oneDayInHour = Time 24

-- 空定義の型Minuteがタグのように利用され、Time Hour型と区別することができる
oneHourInMinute :: Time Minute
oneHourInMinute = Time 60
```

Hour型とMinute型が'Time unit'の型変数である'unit'に相当しています。

上記の通り、Hour型とMinute型に対する具体的な値がなくても、「型」の情報だけがあれば'Time Hour'と'Time Minute'は異なる型として区別することができます。
異なる型同士の計算、例えば次の計算は型エラーとなるため、安全に使用することができます。

```Haskell
-- Time Hour型とTime Minute型は異なる型のため、エラーとなる
ghci> oneDayInHour - oneHourInMinute

• Couldn't match type ‘Minute’ with ‘Hour’
      Expected type: Time Hour
        Actual type: Time Minute
```

これで（簡単ではありますが）、当初の目標である次のことが達成できました。

- 時刻の「分」と「時間」を区別できる型を作りたい
    - ただし、「分」・「時間」を表す値の型は同一の型としたい
    - 時刻に関する計算の処理も同一のものとしたい

### Time Hour型からTime Minute型への変換
Time Hour型からTime Minute型への変換も次のように容易にできます。

```Haskell
h2m :: Time Hour -> Time Minute
h2m (Time h) = Time (h*60)
```

これにより、次のような計算ができるようになります。

```Haskell
ghci> h2m oneDayInHour - oneHourInMinute
Time 1380
```

## 上記の実装が抱える課題
実は、上記の実装には課題が残っています。
Time unitの型変数である'unit'がとりうる型に対する制限が甘いことです。
この実装では、カインドがType(すなわち、零項の型コンストラクタ「*」)であるBool型なども型変数unitに当てはめることができてしまいます。

```Haskell
useless :: Time Bool
useless = 0
```

このような課題を解消するためには、次のような手法があります。
- GHC拡張のDataKindsを使用して型変数unitに適用できる型を制限する
- Timeをエクスポートせずに、スマートコンストラクタでTimeを生成する手法を使う
    - [で、出たー！幽霊型だー！(Phantom Type)](https://qiita.com/HirotoShioi/items/3444e215070144b8ca0f)を参照。

# おさらい
改めて要点をまとめると、
- 幽霊型とは、
    - 左辺で定義した型変数が右辺に全く現れない型
    - 具体的な値に興味はなく、型の情報さえあれば十分な時などに使われる
        - 型の情報だけでやりたいことを実現するため、型レベルプログラミングの一種と捉えられる
- 幽霊型パラメータに異なる型が当てはめられた場合、それらは互いに異なる型となる
    - 安全に関数を使用するパターンとして活用することができる
        - 意図せぬTime HourとTime Minute同士の計算の防止
        - また、幽霊型パラメータは幽霊型の定義の右辺には現れないため、データ型の右辺や幽霊型を引数にとる関数の実装に影響を与えない
- 幽霊型パラメータに当てはめる型を制限するために、DataKindsやスマートコントラクタの手法を用いることができる


（参考資料）
- [Haskell in Depth](https://www.manning.com/books/haskell-in-depth)
- [で、出たー！幽霊型だー！(Phantom Type)](https://qiita.com/HirotoShioi/items/3444e215070144b8ca0f)
[備忘録] jetson nano でusb cameraを動かす

# [備忘録] jetson nanoでusbカメラを動かす
- jetson nano (4GB)の起動
  - [Getting Started with Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit)
- [jetson-inference](https://github.com/dusty-nv/jetson-inference/blob/master/docs/building-repo-2.md)の手順でプロジェクトをビルド ([Docker](https://github.com/dusty-nv/jetson-inference/blob/master/docs/aux-docker.md)も配布されている)

## OpenCVでエッジ検出して描画してみる
- ソースコード
    - [GitHub, dusty-nv, jetson-inference](https://github.com/dusty-nv/jetson-inference) を参考にしました。
~~~ Python:edge.py
import cv2
import jetson.utils
import argparse
import sys

# parse command line
parser = argparse.ArgumentParser()
parser.add_argument("input_URI", type=str, help="URI of the input stream")
parser.add_argument("output_URI", type=str, default="", nargs='?', help="URI of the output stream")
opt = parser.parse_known_args()[0]

# create video sources & outputs
input = jetson.utils.videoSource(opt.input_URI, argv=sys.argv)
output = jetson.utils.videoOutput(opt.output_URI, argv=sys.argv)

# capture frames until user exits
while output.IsStreaming():
        # can also be format='rgba8', 'rgb32f', 'rgba32f'
        image = input.Capture(format='rgb8')
        image_numpy = jetson.utils.cudaToNumpy(image) # cuda -> numpy
        # image processing
        image_numpy = cv2.cvtColor(image_numpy,cv2.COLOR_RGB2BGR)
        image_numpy  = cv2.Sobel(image_numpy, cv2.CV_32F, 1, 0, ksize=3)
        image_numpy = cv2.cvtColor(image_numpy,cv2.COLOR_BGR2RGB)

        image = jetson.utils.cudaFromNumpy(image_numpy) # numpy -> cuda
        output.Render(image)
        output.SetStatus("Video Viewer | {:d}x{:d} | {:.1f} FPS".format(image.width, image.height, output.GetFrameRate()))
~~~
- 実行
~~~ bash
$ python3 edge.py /dev/video0
~~~

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


## Reference
- [NVIDIA DEVELOPER, Getting Started with Jetson Nano Developer Kit](https://developer.nvidia.com/embedded/learn/get-started-jetson-nano-devkit)
- [GitHub, dusty-nv, jetson-inference](https://github.com/dusty-nv/jetson-inference)
sedの図解 vol.1

## 全体の構造

sedの内部には「パターン・スペース」と「ホールド・スペース」という、2本のバッファがある。
両方とも、初期状態は「空」である。
![00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/dfb7006e-4877-98bb-d416-e48191111fd3.png)

## これから実行するコマンド

"strawberry"の"straw"を"blue"に置換して、"blueberry"にしたいとする。

``` shell
echo "strawberry, strawberry" | sed -e "s/straw/blue/g"
blueberry, blueberry
```

> * echoコマンドについて
> echoコマンドは、<b>文字列の末尾に自動で改行を付与する</b>。
> もし付与したくない場合は、`-n`オプションを指定すると付与されなくなる。

## 処理の流れ

1. 入力ストリームに文字列を入力する（例：キーボード入力など）    
![01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/5cad6d0f-1619-541c-dcae-b4e19dd564c9.png)

1. 入力ストリームからパターン・スペースに文字列を読み込む  
この際、<b>行末の改行は自動で取り除かれる</b>。
![02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/ec2ec919-3f50-b020-a5ae-55fa8132398b.png)

1. コマンドを実行する  
<b>straw</b> を <b>blue</b> に置換する  
![03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/622fc464-2596-e3a0-3723-a5be2dd1d223.png)

1. 実行結果を出力ストリームに出力する（例：画面表示など）  
この際、<b>2.で取り除かれた改行が自動で元に戻される</b>。
![04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2115724/9e506f13-196c-e863-4f9b-fb39e01b948f.png)

    > * __出力ストリームに出力したくない場合は？__  
    > `-n`オプションを指定すると、出力されなくなります。
    > 
    > ``` shell
    > echo "strawberry, strawberry" | sed -n -e "s/straw/blue/g"
    > # (出力されなくなった)
    > ```

1. 次の行（もしあれば）を読み込む

## 参考文献

* [GNU sed manual](<https://www.gnu.org/software/sed/manual/sed.html>)
    + やさしい英語で丁寧に解説されている
* [sed1line.txt](<http://sed.sourceforge.net/sed1line.txt>)
    + 便利なsedのワンライナーがいくつも紹介されている
朝の apt update; apt -y upgrade

前の日からの作業の続きをするときに、

apt update; apt -y upgrade

するかどうかは迷う。
例えば、コンパイル実験の途中で、バージョンが変わるといやかもしれない。
そんなことから、普段はしていない。
今日、数日ぶりにした。

```ubuntu:bash
# apt update; apt -y upgrade
Hit:1 http://deb.debian.org/debian bullseye InRelease
Get:2 http://deb.debian.org/debian bullseye-updates InRelease [44.1 kB]
Get:3 http://security.debian.org/debian-security bullseye-security InRelease [48.4 kB]
Hit:4 https://apt.llvm.org/bullseye llvm-toolchain-bullseye-14 InRelease                               
Fetched 92.4 kB in 9s (10.6 kB/s)                                                                      
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Calculating upgrade... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
```

あ、変わっていなかった。よかった。

よかった？

作業上はバージョン違いによる結果の違いを分類する必要がなくてよかった。
いつも忘れるTypeScript環境構築メモ

思い立ったときにすぐ環境作れないからメモ　　

# とにかくinit

```
> mkdir ts-test
> cd ts-test
> yarn init
> yarn add -D typescript
> .\node_modules\.bin/tsc --init
> git init
```
git bash だとyarn initがなんかエラーになったからコマンドプロンプトで

# フォルダ構成　どうせsrcとdist

みんなこうする
srcをコンパイルしてdistに入れる

tsconfig.jsonに色々かいてる。
デフォルト+αでこんなもんか

```
{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "declaration": true /* Generate .d.ts files from TypeScript and JavaScript files in your project. */,
    "declarationMap": true /* Create sourcemaps for d.ts files. */,
    "sourceMap": true /* Create source map files for emitted JavaScript files. */,
    "outDir": "dist" /* Specify an output folder for all emitted files. */,
    "esModuleInterop": true,
    "forceConsistentCasingInFileNames": true,
    "strict": true,
    "skipLibCheck": true,
  },
  "include": ["src"],
  "exclude": ["node_modules", "dist"]
}

```

# コンパイルスクリプトなど

mainとfilesも気にする。
パッケージとしてnode_modulesに含まれたときのindexとファイルを指定

```ruby:package.json
{
  "name": "ts-test",
  "version": "1.0.0",
  "main": "dist/index.js",
  "license": "MIT",
  "files": [
    "dist"
  ],
  "scripts": {
    "clean": "rm -rf dist",
    "build": "./node_modules/.bin/tsc",
    "watch": "./node_modules/.bin/tsc --watch"
  },
  "devDependencies": {
    "typescript": "^4.7.4"
  }
}
```

# やってみる

```ruby:src/index.ts
export const test:string ="test";
```

```
> yarn build
```

dist下に色々できた
dist/index.js
dist/index.d.ts
dist/index.d.ts.map
dist/index.js.map
Redmineに対してREST APIを実行してみる

# AWS Lambdaを使ってRestAPIを実行してみる

- RedmineにはRestAPIでのアクセスができる（https://www.redmine.org/projects/redmine/wiki/Rest_api にAPIの概要）


## 1. Redmineの管理者で `RESTによるWebサービスを有効にする`をチェックONにする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/8316574e-d9a6-b6c0-b3f3-41ee88a9814f.png)

## 2. Redmineの画面で個人設定画面の右より、APIアクセスキーを発行する
![redmine-api-key.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1482752/55654d6f-0b14-0517-07a5-97ca52acb602.png)

## 3.AWS LambdaのマネジメントコンソールでLambdaのソースを書く

```py

import request

```

エラーになります。lambda Layer使わないと無理だった。
もっと手軽にしたい（手軽さがない！）

検索すると、クラスメソッドさんの記事が見つかる
https://dev.classmethod.jp/articles/unused-requests-library/
「標準のurllib.requestsを使用する」


### 書きかえて、redmineのプロジェクト一覧を取得してみる

```py
import json

import urllib.request

def get_simple(url: str):
    req = urllib.request.Request(url,
                                 method='GET')
    return urllib.request.urlopen(req)

def lambda_handler(event, context):

    headers = {
        'Accept': 'application/json',
    }
    data = '{}'
    try:
        res = get_simple(url='https://xxxx.xxxx.xxx/redmine/projects.json?&limit=5&key=<<API KEY>>')

    except urllib.error.HTTPError as e:
        print("---error")
        print(e.code)
        print(e.reason)
    else:
        print("---ok")
        print(res.status)
        print(res)
        print(res.read().decode('utf-8'))

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }
```


Function Logs （ログを整形して抜粋）
APIでlimit指定しないとコンソールログが見切れてしまう（途切れる）
```json
{
	"projects": [
		{
			"id": 153,
			"name": "NNNNN",
			"identifier": "aaaa",
			"description": "",
			"status": 1,
			"is_public": false,
			"inherit_members": false,
			"custom_fields": [
				{
					"id": 22,
					"name": "Slack Channel",
					"value": ""
				},
				{
					"id": 30,
					"name": "Slack URL",
					"value": null
				}
			],
			"created_on": "2021-12-04T02:17:03Z",
			"updated_on": "2021-12-04T02:17:03Z"
		},
...
	"total_count": 200,
	"offset": 0,
	"limit": 5
}
```

かなり手軽に、REST APIにアクセスできました
【#36 エンジニア転職学習】Go WebApp　API認証・作成

# はじめに
富山県に住んでいるChikaといいます。
毎日投稿を目標に、バックエンドエンジニア転職に向けた学習内容をアウトプットします。

使用しているGoのUdemy教材後半部分である、
Webアプリ作成演習を学習していきます。

バックエンドエンジニアになるまでの学習内容は以前投稿した以下の記事を基にしています。


https://qiita.com/Chika110/items/ef54dddd565a0193ef44

# 本日の学習内容
本日でGoでのAPI認証、作成までを一通り終了しました。

* **API認証・作成　←Topics!!**

# API認証・作成
実際に講座で使用するビットコインAPIのコードを書きながら、APIの作成手順やポイント等を学習しました。
今時点では完全に理解できない部分もありましたが、**基本的な構文をそのまま使用したりする**ところもありました。ですので、ネットワーク関連の重要パッケージについて理解していれば、難なくコーディングできそうです。
#### ポイント
* 各APIのdocumentから、requestやresponseのフォーマットを確認
* Jsonは「Json to Go」で変換可能
* オーバーヘッド対策のために、sliceはポインタなし・structはポインタで値を返す形がよい


##### 使用している教材はこちら↓


https://www.udemy.com/course/go-fintech/


# おわりに
最後までお読みいただきありがとうございました。
アドバイス・応援コメント等いただけますと幸いです。
継承とは何か

# 継承とは？
Microsoftによると
 >「親クラスの動作を再利用 (継承)、拡張、または変更する子クラスを定義することができます。 メンバーの継承元となるクラスを、基底クラスと呼びます。 基底クラスのメンバーを継承するクラスを、派生クラスと呼びます。」

[C# と .NET での継承](https://docs.microsoft.com/ja-jp/dotnet/csharp/fundamentals/tutorials/inheritance)
だそうです。ちょっとこれだけじゃわかりにくかったので色々調べてみました。

例えばAというクラスがあるとするとAが持つ変数や関数をBというクラスで引き継ぐ（継承する）ことができるということ。

継承すると基底クラスの変数や関数を派生クラスでも使うことができる。

意味は分かったけど何のために使うのか？？

## 何のために使う？
プログラムを書いていると別のクラスでも似たような機能を持つ処理がある。そういうときに継承を使えば基底クラス一つで処理を管理することができる。

しかし微妙に違う処理にしたいというときもある。そういう時はオーバーライドが便利だ。

### メリット
処理をまとめられることでコードを簡略化することができる。
（そんなに使ったことがないのでこれくらいしかメリットが思いつかない。。。）

### デメリット
使いすぎると可読性が低下する。使いすぎない方がよさそう。
OpenStackのルートアカウントのパスワードがわからなかったのでリセットした。

ルートアカウントのパスワードがわからなかったので、以下に従ってパスワードリセットした。
https://stackoverflow.com/questions/59180658/reset-openstack-admin-password
デフォルトのルートアカウントは admin らしい
~~~~~
#source /opt/stack/devstack/openrc admin admin
#openstack user set --password-prompt admin
User Password: お好きなパスワード
Repeat User Password:　お好きなパスワード
~~~~~
Actions secretsをSpring Bootのapplication.propertiesまで渡す方法

## はじめに
GitHub Actions上でdockerコンテナを起動し、Spring Bootのアプリケーションを動かす場合があります。
そのとき、Actions secretsに登録しておいたバリューをSpring Bootのapplication.propertiesまで渡す方法について説明します。
## secretを登録
レポジトリのSettingsでシークレットを登録します。
(例)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/62869125-5383-9b32-799f-d053d27dc113.png)
↓登録したシークレットはリストで確認できます。
中身は見えませんので、間違った値を登録してしまったら「Update」で更新しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/75118db6-09ac-0957-e5e0-1ab0a4eb03a5.png)

## ワークフローファイルにsecretを設定
登録したシークレットをワークフロー内で環境変数として設定します。
`secrets`コンテキストを使って、シークレットにアクセスすることができます。
````
 test:

    runs-on: ubuntu-20.04
    env:
      GOOGLE_CLIENT_SECRET: ${{ secrets.GOOGLE_CLIENT_SECRET }}
      GOOGLE_CLIENT_ID: ${{ secrets.GOOGLE_CLIENT_ID }}
      LINE_CLIENT_SECRET: ${{ secrets.LINE_CLIENT_SECRET }}
      LINE_CLIENT_ID: ${{ secrets.LINE_CLIENT_ID }}
    steps:
    - uses: actions/checkout@v2

    - run: docker-compose -f docker-compose-gitaction.yml build
    - run: docker-compose -f docker-compose-gitaction.yml up --abort-on-container-exit
````

## docker-compose.ymlでenvironmentとして設定
ワークフローで設定した環境変数をdocker-compose.ymlのenvironmentに設定します。
````
version: '3.8'
services:
  web_test:
    container_name: 'web_test'
    build:
      context: .
    tty: true
    working_dir: '/gongbu/home'
    ports: 
      - "8080:8080"
    environment:
      - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
      - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
      - LINE_CLIENT_SECRET=${LINE_CLIENT_SECRET}
      - LINE_CLIENT_ID=${LINE_CLIENT_ID}
````

## コンテナ内の環境変数をapplication.propertiesで利用
Spring Bootにて環境変数をapplication.propertiesに設定する方法は`${環境変数名}`です。
で、上記のdocker-compose実行時、設定した環境変数を書き込んだら終わりです。
````
spring.security.oauth2.client.registration.google.client-secret=${GOOGLE_CLIENT_SECRET}
spring.security.oauth2.client.registration.google.client-id=${GOOGLE_CLIENT_ID}
spring.security.oauth2.client.registration.line.client-secret=${LINE_CLIENT_SECRET}
spring.security.oauth2.client.registration.line.client-id=${LINE_CLIENT_ID}
````
## 参考サイト
私のGitHubリポジトリ
[workflow ci_cd.yml](https://github.com/crane93/gongbu/blob/develop/.github/workflows/ci_cd.yml#L9-L13)
[docker-compose-gitaction.yml](https://github.com/crane93/gongbu/blob/develop/docker-compose-gitaction.yml#L22-L25)
[application-test.properties](https://github.com/crane93/gongbu/blob/develop/src/main/resources/application-test.properties#L13-L16)
AWS SSOでCodeCommitを利用する方法

### はじめに
AWS CodeCommitを利用しようと思い、いざAWS CodeCommitを触ってみたら、自分のAWSアカウントはAWS SSOを利用していたので、
git cloneするときのユーザー名とかどうするのかわからなかったので調査しました。


### 環境／利用サービス
- AWS CodeCommit
- AWS SSO
- Git

### 事前準備
#### １. AWSのアカウントを準備
今回はAWSを利用するのでAWSのカウントを準備します。
AWS SSOの設定をしておきます。

### リポジトリ作成
AWSコンソールからリポジトリを作成します。
サイドメニューの「リポジトリ」から「リポジトリを作成」ボタンを押します。
![スクリーンショット 2022-07-22 17.17.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46147/6c1a61f1-a04c-8470-cad9-7a76634a1632.png)

リポジトリ名を入力して「作成」を押します。
![スクリーンショット 2022-07-22 17.17.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/46147/c6fa1d2c-a434-181d-b8e4-272a98f43266.png)

### Git Clone
まず、リポジトリはCodeCommit上にあるので、AWSリソースへのアクセス権限が必要です。 AWS SSOを利用しているのでAWS SSOの画面から「Command line or programmatic access」からアクセス情報を取得して ~/.aws/credentials に記載します。

```
vim ~/.aws/credentials

[xxxxxxxxxxxx_PowerUserAccess]
aws_access_key_id=xxxxxxxxxxxx
aws_secret_access_key=xxxxxxxxxxxx
aws_session_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

```

その後、 git config コマンドでgitの設定を書き換えます。
```
git config --global credential.helper "!aws codecommit credential-helper $@"
git config --global credential.UseHttpPath true
```
無事、colneができたようです。
```
(base) xxxxx@test % git clone https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
Cloning into 'test'...
warning: You appear to have cloned an empty repository.
```

### Git Push

pushも問題なくできました。
```
(base) xxxxx@test test % vim aa.txt
(base) xxxxx@test test % git add aa.txt
(base) xxxxx@test test % git commit -m 'test' aa.txt
[master (root-commit) 1e50894] test
 1 file changed, 1 insertion(+)
 create mode 100644 aa.txt
(base) xxxxx@test test % git push
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 208 bytes | 208.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test
 * [new branch]      master -> master
```
### macの問題点
Macを利用するとしばらくすると　git pullしたときに「fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test/': The requested URL returned error: 403」のエラーが発生します。
これは、CodeCommitが発行する認証情報が15分で無効になり、gitコマンドが使用するキーチェーンアクセスが無効になった認証情報を使ってアクセスを試行するために発生するようです。

```
fatal: unable to access 'https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/test/': The requested URL returned error: 403
```
その場合の対処方法としては、　macのキーチェーンアクセスを表示させ「CodeCommit」で検索、クリックして詳細画面を開き、「アクセス制御」タブから「git-credential-osxkeychain」を削除します。

osxkeychainを無効にする為、gitの設定を変更します。
```
sudo vim /Library/Developer/CommandLineTools/usr/share/git-core/gitconfig
```

```
[credential]
        helper = osxkeychain
        →
        #helper = osxkeychain

```

## まとめ

AWS CodeCommitを利用したことがなかったですが、一回設定するとgitの操作は同じなので問題なくできそうです。
fetch関数の備忘録

学んでいた中で結構面倒に感じたので、復習がてら記述する。

# fetch関数とは

簡単に言うと、「公開されているAPIから、画像やデータを取得する」ための関数。

そこら辺の説明はいろんな人が説明してくれているので省略する。

[Fetch の使用 - Web API | MDN](https://developer.mozilla.org/ja/docs/Web/API/Fetch_API/Using_Fetch)


[【JavaScript】初めて学ぶ！fetch()メソッドと非同期通信 | BREEZE](https://breezegroup.co.jp/202004/javascript-fetch/)


## 基本的な使用例
```Javascript:
fetch('取得したい外部APIのURLを記入する')
.then(response => response.text())
.then(text => {
  console.log(text);
});
```

`fetch()`の返り値は`Promise`を用いているため、`Promise`がわからない場合は先にそちらを学んでほしい。ほとんどのwebサイトで`.then()`についても同時に説明されている。

[【JavaScript】初心者にもわかるPromiseの使い方｜TECH PLAY Magazine ［テックプレイマガジン］](https://techplay.jp/column/581)


###### 以下、自身がよくわからなくて詰まっていた箇所を書いていく。

## 「`○○.status`」とは？

勉強していくうちに、`if(○○（作成者それぞれの関数定義）.status === "success")`というコードを見るようになった。

帰ってきた内部データを参照しているのはわかるのだが、`status`が何を参照しているのかわからない。
```Javascript:
fetch("外部APIのURL")
.then(response => response.json())
.then(data => {
  if(data.status === "success"){
    処理
  }
}
```

というわけで調べたら、`○○.status`にはHTTPステータスコードが入っていることがわかった。

以下URL先に`fetch`関数返り値の他プロパティも記載されているのでよかったらどうそ。

[【JavaScript基礎】Fetch APIの基礎 - KDE BLOG](https://kde.hateblo.jp/entry/2018/10/22/010811)
Cloud Storage for Firebaseにある音声ファイルをReact Playerで再生する

## 概要

[Cloud Storage for Firebase](https://firebase.google.com/docs/storage)に音声ファイル(wav 形式や mp3 形式など)を
[react-player](https://www.npmjs.com/package/react-player)で再生します。
音声ファイルは[Firebase Authentication](https://firebase.google.com/docs/auth)でアクセスを制限しています。

<!--more-->

## リポジトリ

[kubotama/react-player](https://github.com/kubotama/react-player)

## 前提条件

Next.js でサイトを構築しています。

- node.js: 16.15.1
- Next.js: 12.2.0

詳しくは上記リポジトリで確認して下さい。

## 事前の準備

1. [Firebase](https://console.firebase.google.com/) でプロジェクトを作成します。
1. 作成したプロジェクトで Authentication を開始します。
1. 開始した Authentication でメール/パスワードプロバイダを有効にします。
1. Authentication にユーザーを追加します。
1. 上記リポジトリをローカル環境にクローンします。
1. 作成したプロジェクトにウェブアプリを追加して、「SDK の設定と構成」で「構成」を選択すると表示される「アプリのキーと ID が含まれている Firebase 構成オブジェクト:」をコピーして、ローカル環境にクローンしたリポジトリの./lib/firebase.js に貼り付けます。
1. firebaseConfig の変数宣言の先頭に export を追加します。
1. Cloud Storage for Firebase に音声ファイル(main.wav)をアップロードします。
1. Cloud Storage for Firebase のルールで、Authentication に追加したユーザーのみアクセスを許可します。

```json
// Grants a user access to a node matching their user ID
service firebase.storage {
  match /b/{bucket}/o {
    match /{allPaths=**} {
      allow read, write: if request.auth != null && request.auth.uid == "追加したユーザーのユーザーUID";
    }
  }
}
```

## プログラムの説明

アクセス可能なユーザーが制限されているため、音声ファイルにアクセスする前にログインします。
ログインしていなければログイン画面(login.tsx)、ログインしていればメイン画面(index.tsx)を表示します。

Authentication でアクセスを制限をされている Cloud Storage for Firebase にあるファイルにアクセスするためには、ダウンロード URL を取得する必要があります。

1. 上記リポジトリのディレクトリで`yarn dev`を実行すると、ローカル環境で検証用の web サイトが立ち上がりますので、<http://localhost:3000> にアクセスすると、ログインしていませんのでログイン画面が表示されます。

1. 事前の準備で Authentication に追加したユーザーのメールアドレスとパスワードを入力してログインすると、メイン画面(index.tsx)にログインしたユーザーのメールアドレスと、音声ファイルのダウンロード URL が表示されます。表示された react-player の再生ボタンをクリックすると音声ファイルが再生されます。

```tsx:index.tsx
const [downloadUrl, setDownloadUrl] = useState("");
  const filename = "main.wav";

  useEffect(() => {
    const authStateChanged = onAuthStateChanged(auth, async (user) => {
      if (user) {
        const storage = getStorage();
        getDownloadURL(ref(storage, filename)).then((url) => {
          setDownloadUrl(url);
        });
      }
      const email = user?.email || "no name";
      setName(email);
    });
    return () => {
      authStateChanged();
    };
  }, []);

```
splat演算子と [*array] と {**hash}

以下の書き方ってOKだっけ？　そして結果は何？　と思ったので調査。

```ruby
array = [1, 2, 3]
hash = { x: 4, y: 5, z: 6 }

p( [ *array  ] )
p( [ *hash   ] )
p( [ **array ] )
p( [ **hash  ] )
p( { *array  } )
p( { *hash   } )
p( { **array } )
p( { **hash  } )
```

## 前置き：splat演算子
Ruby ではメソッドの仮引数に、可変長引数 `*rest` や、キーワード引数の余り `**kwrest` を指定できる。これらは実引数の値をそれぞれ配列やハッシュの形に固めて受け取る。

> https://docs.ruby-lang.org/ja/3.1/doc/spec=2fdef.html#method
>
> ```ruby
> # すべて持つ(極端な例なのでおすすめしない)
> def f(a, b, c, m = 1, n = 1, *rest, x, y, z, k: 1, **kwrest, &blk)
> ...
>
> f("a", "b", "c", 2, 3, "foo", "bar", "baz", "x", "y", "z", k: 42, u: "unknown") { }
> ```

逆に、実引数側（メソッド呼び出し元）で配列の類やハッシュを**展開**したいこともある。このときは同じ記号を使って `*array` や `**hash` と書ける。 `*` はsplat演算子、 `**` はdouble splat演算子と呼ぶらしい。

> https://docs.ruby-lang.org/ja/3.1/doc/spec=2fcall.html
>
> 引数の直前に `*` がついている場合、その引数の値が展開されて渡されます。展開はメソッド `to_a` を経由して行なわれます。つまり:
>
> ```ruby
> foo(1,*[2,3,4])
> foo(1,*[])
> foo(1,*[2,3,4],5)
> foo(1,*[2,3,4],5,*[6])
> ```
>
> は、それぞれ
>
> ```ruby
> foo(1,2,3,4)
> foo(1)
> foo(1,2,3,4,5)
> foo(1,2,3,4,5,6)
> ```
>
> と同じです。

> https://docs.ruby-lang.org/ja/3.1/doc/news=2f2_7_0.html
>
> キーワード引数として扱いたい場合は、明示的にdouble splat演算子（ `**` ）を足すことで警告を回避できます。このように書けばRuby 3でも同じ意味で動きます。
>
> ```ruby
> def foo(key: 42); end; foo({key: 42})   # warned
> def foo(**kw);    end; foo({key: 42})   # warned
> def foo(key: 42); end; foo(**{key: 42}) # OK
> def foo(**kw);    end; foo(**{key: 42}) # OK
> ```

## 配列とハッシュのリテラルでは
ところで、配列のリテラル（配列式）はメソッド呼び出しと似ていて、実際に `*` を使って配列の類を展開することがある。

```ruby
[1, *4..6, 9]
#=> [1, 4, 5, 6, 9]
```

ハッシュのリテラル（ハッシュ式）の形も、メソッド呼び出しのキーワード引数と似ている。ということは `**` による展開が有効なのだろうか？

試してみると**使えた**。展開できるオブジェクトはハッシュに限らず、暗黙の変換 [`#to_hash`](https://docs.ruby-lang.org/ja/3.1/method/Object/i/to_hash.html) が定義されていればいいらしい。

```ruby
h = { x: 4, y: 5, z: 6 }
{ a: 1, **h, b: 9 }
#=> {:a=>1, :x=>4, :y=>5, :z=>6, :b=>9}

htoa = h.to_a
{ a: 1, **htoa, b: 9 }
# no implicit conversion of Array into Hash (TypeError)

htoa.singleton_class.alias_method(:to_hash, :to_h)
{ a: 1, **htoa, b: 9 }
#=> {:a=>1, :x=>4, :y=>5, :z=>6, :b=>9}
```

---

また、ハッシュの中で `*` を使うことはできない（現在の文法上あり得ない）が、配列の中で `**` を使うことはできる。おそらくハッシュが展開されることで、波括弧を省略した記法と同じ扱いになる。配列式はキーワード引数をとらないはずなので、Ruby2以前からあるほうの規則が適用される。

```ruby
h = { x: 4, y: 5, z: 6 }
[1, 2, **h]
#=> [1, 2, {:x=>4, :y=>5, :z=>6}]

[1, **h, 2]
# syntax error, unexpected ']', expecting => (SyntaxError)
```

> https://docs.ruby-lang.org/ja/3.1/doc/spec=2fliteral.html#hash
>
> メソッドの引数、もしくは配列式の末尾に要素が1つ以上のハッシュを渡す場合は、 `{` , `}` を省略することができます。
>
> ```ruby
> method(1,2,3=>4)      # method(1,2,{3=>4})
> obj[1=>2,3=>4]        # obj[{1=>2,3=>4}]
> [1=>2,3=>4]           # [{1=>2, 3=>4}]
> ```

## 答え合わせ

```ruby
array = [1, 2, 3]
hash = { x: 4, y: 5, z: 6 }

p( [ *array  ] )  #=> [1, 2, 3]
p( [ *hash   ] )  #=> [[:x, 4], [:y, 5], [:z, 6]]  #to_a による変換
p( [ **array ] )  # TypeError （ #to_hash が無い場合）
p( [ **hash  ] )  #=> [{:x=>4, :y=>5, :z=>6}]  波括弧を省略したハッシュの扱い
p( { *array  } )  # SyntaxError
p( { *hash   } )  # SyntaxError
p( { **array } )  # TypeError （ #to_hash が無い場合）
p( { **hash  } )  #=> {:x=>4, :y=>5, :z=>6}
```
Segmented Controlのセパレーターを消す方法


通常Segmented Controlには赤枠で囲んだ仕切り線が付いているので、これを消したい。
だが、Segmented Controlにはそれを隠すようなプロパティはないようだった。
<img width=300 alt="a87997fb2fcdb6c044124f0800d48c99.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662300/43975cc7-5553-ab71-520c-ea8af436b236.png">

ただ調べると[setDividerImage(_:forLeftSegmentState:rightSegmentState:barMetrics:)](URL "https://developer.apple.com/documentation/uikit/uisegmentedcontrol/1618558-setdividerimage")というメソッドがあり、これを使ってセパレーター画像を設定できるらしい。

なので下記のコードでSegmentd Controlの背景と同じ色のセパレーター画像を生成し設定することでを見えないように(背景色と同化)することにした。
```.swift
//色はデフォルトのセパレーターと同じ設定
//widthを1にしheightをSegmented Controllerと同じ高さに設定
func removeSegmentSeprator(height: CGFloat) -> UIImage {
     UIGraphicsBeginImageContext(CGSize(width: 1, height: height))

     let context: CGContext = UIGraphicsGetCurrentContext()!
     let backGroundColor = UIColor(red: 238/255, green: 238/255, blue: 239/255, alpha: 1)
     context.setFillColor(backGroundColor.cgColor)
     context.fill(CGRect(x: 0, y: 0, width: 1, height: height))

     guard let image = UIGraphicsGetImageFromCurrentImageContext() else {return UIImage()}
     UIGraphicsEndImageContext()

     return image
}

let image = removeSegmentSeprator(height: segmentControl.bounds.height)
segmentControl.setDividerImage(image, forLeftSegmentState: .normal,rightSegmentState: .normal, barMetrics: .default)
```

結果的には↓画像のような感じになりうまくいった。👍
<img width=300 alt="8908b4a0bc014bc723469a9efabe8ac2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/662300/1aa74e2b-cd6b-a5d7-a08a-2a60347b90f5.png">
IEのサポート終了後に使えるCSS②

# はじめに

前回IEのサポート終了後に使えるCSSを書きましたが、
まだまだ使える便利なプロパティもありましたので、
今回も使えるCSSをまとめていこうと思います。

## mix-blend-mode

乗算やオーバーレイを指定できるプロパティ

```
乗算
img {
  mix-blend-mode: multiply;
}

スクリーン
img {
  mix-blend-mode: screen;
}

オーバーレイ
img {
  mix-blend-mode: overlay;
}
```

## gap

flexやgridでレイアウトする時に要素のスペースを指定するプロパティ

```
div {
  display: flex;
  gap: 20px;
}
```

## line-clamp

複数行のテキストに省略をつけるプロパティ

```
p {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  overflow: hidden;
}
```

## position: sticky;

フロートを解除するプロパティ

```
div {
  display: flow-root;
}
```

以上全てではありませんが、積極的に取り入れたいCSSのプロパティについてまとめてみました。
これ以外にもまだまだあるので、また別の記事でもまとめたいと思います。
MongoDBをCloud Pak for Dataに接続

今回はCloud Pak for DataにMongoDBを繋げてみたので忘れないうちにメモ

MongoDBはクラウドのサービスを使いました。
MongoDB Atlas
https://www.mongodb.com/atlas/database

アカウントを作成して無料のデータベースを作成。サンプルのコレクションをロードしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/cacd2538-21cc-5430-e83b-9be0683cb1ca.png)
サンプルはこちらでダウンロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/8e93306f-2a2b-ecd0-9343-04ca2268aff4.png)

ここでCloud Pak for Dataとの接続に必要となってくるのが
-データベース名
-接続のためのURL
-ポート
-ユーザー名
-パスワード
です。
データベース名は作成されたデータベースから任意のものを選んでください。
下の例だとsample....　のどれかですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/6ed13af0-3727-e84a-2d53-8c8abdec6e27.png)
URL情報は以下のようにして取得しました。
Browse Colectionをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/5fe7c12e-6741-1765-a102-ba407b788579.png)
Overviewをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/621dce35-a493-6ed9-c074-b49212fd4c4f.png)
PrimaryのURLとポートを取得
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/a82f70bc-4db9-6bf2-93ad-5217d610dab1.png)

ユーザー名とパスワードはデータベースを最初に作ったときに設定します。あるいは以下のように確認することも
左ペインにあるDatabase accessを選択するとユーザー名やパスワードの設定画面が出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/14a2f6ff-ce29-fc13-1c39-69ef2610f1ce.png)

以上でMongoDBの側の設定はできました。
次にCloud Pak for dataの方です。カタログ、プロジェクトを開き接続を作成してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/e53cbb62-06cf-308b-af3f-6f9528155850.png)
MongoDBを選択して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/2ad288ff-5169-5732-69d0-bc29c257c81b.png)

MongoDBの接続情報を入れてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/bb12a6ae-5b07-8ca2-2a8d-eaede5b48e3e.png)

接続が完成、Cloud Pak for DataからmongoDBのcollectionが見れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59741/51035920-3411-b510-e835-0b49dad6fccd.png)
PyPIでPythonライブラリを公開する方法まとめ

PythonのライブラリはPyPIに集約されています。そのため、便利なライブラリを作ったら、PyPIで公開するとみんなが喜んでくれるはずです。

# パッケージの準備

PyPIでパッケージを公開するには、パッケージのファイル構成を工夫する必要があります。最低限以下のようなファイルを作ります。

```
.
├── LICENSE
├── README.md
├── パッケージ名
│   ├── __init__.py
│   └── モジュール.py
└── setup.py
```

## パッケージ名/__init__.py の内容

Pythonでどのメソッドを公開するのか、また、バージョンなど記述します。

```__init__.py
# 記述例
from .モジュール import get, set, hoge as keys
__version__ = "0.1.0"
```

## setup.py の内容

以下がsetup.pyの内容。普通のPythonファイルのため、バージョン情報などは、一カ所にまとめておくと便利。

```setup.py
from setuptools import setup

# バージョン情報を参照するため
from パッケージ名 import __version__

setup(name="ライブラリ名",
      author="作者名",
      author_email="メールアドレス",
      maintainer="作者名",
      maintainer_email="メールアドレス",
      description="簡単な解説",
      long_description="長い解説",
      long_description_content_type="text/markdown",
      license="MIT" # ラインセスを指定
      url="URL",
      version=__version__, # バージョン情報
      python_requires=">=3.6.0", # Pythonバージョン
      install_requires=[], # 依存パッケージ ["ライブラリ>=バージョン"]のように書く
      extras_require={},
      packages=find_packages(exclude=["tests", "*.tests", "*.tests.*", "tests.*"]),
      classifiers=["Programming Language :: Python :: 3"] # 分類情報
)
```

# パッケージをビルドする

ビルドに必要なモジュールをインストールしておきましょう。

```
python3 -m pip install twine wheel
```

そしてビルドしましょう。

```
python3 setup.py sdist
python3 setup.py bdist_wheel
```

# PyPIに登録して設定ファイルを保存

[PyPIにサインアップ](https://pypi.org/)して、アカウント設定ページから「API token」を作成しましょう。

そして、`~/.pypirc` というファイルに表示された以下のようなデータを保存します。(ちなみに、以下のキーは無効な適当なキーです。)

```
[pypi]
  username = __token__
  password = pypi-AgEIcHlwaS5vcmcCJ3lYW5VhMD6ATRhMzZhYmVhZjJlZQACJXsicGVybWlzc2lvbccMOiAidXNlciIsICxxxxxxxxxxxuIjogMX0AAAYgwKuqpKoqQjCobp41bcp93hul9Zc0HT7-ilztjnbVaaM
```

# 公開しよう

PyPIにいきなり本公開する前に、テストサイトに公開して、どんな風に公開されるのか確認できます。なお、テストサイトと本サイトは独立していますので、[テストサイト](https://test.pypi.org/)でも、ユーザー登録が必要です。同じように、API tokenを作成して、~/.pypircに追加しましょう。

以下のコマンドを実行すると、テストサイトに公開されます。

```
twine upload --repository testpypi dist/*
```

公開して問題なさそうなら、本番に公開しましょう。

```
twine upload --repository pypi dist/*
```

# バージョンアップ

上記の手順でビルドすると、<dist>と<build>と<パッケージ名.egg-info>というディレクトリが自動で作成されます。そこで、最初にクリアしておくと分かりやすいです。

```
rm -f -r dist
rm -f -r build
rm -f -r パッケージ名.egg-info
```

そして、バージョンを変更してから、改めて、上記のパッケージビルドを実行しましょう。

# サンプルパッケージ

一度、自分でパッケージを公開してみたいと思ったので、`pykvs_lite`というライブラリを作ってみました。
最小構造で作っていますので、参考にしてみてください。

- [PyPI/pykvs_lite](https://pypi.org/project/pykvs-lite)
- [GitHub/pykvs_lite](https://github.com/kujirahand/pykvs_lite)


# 参考

- https://qiita.com/c60evaporator/items/e1ecccab07a607487dcf
  - ↑とても参考になりました。この記事の3倍詳しいです。ありがとうございました！！
PyenvとVSCodeでpython3.6のコードをデバッグできないことの対処法

# 症状
PyenvでPython3.6.8にした上で、VSCodeでデバッグしようとしたが、一瞬デバッグのツールバーが出ただけで動かなかった

# 対処法
一番楽なのはPyenvで使うPythonのバージョンを3.7.0以上に上げることです
~~試してないですが、[pdb](https://docs.python.org/ja/3.6/library/pdb.html#module-pdb)を使う方法も多分いけるはず(注意:バージョンに合ったドキュメントを読んでください)~~
追記:[pdb](https://docs.python.org/ja/3.6/library/pdb.html#module-pdb)を試したらいけました(バージョンに合ったドキュメントを読んで下さい)

さらに追記:
[コメントにて](https://qiita.com/sin471/items/10f41785da8b0193c6fa#comment-c3208d2ae94020bc5b1d)VSCodeのプラグインのバージョンを落として解決する方法を教えていただきました

>以前同じ問題に直面しました。
原因はこれでした。
https://github.com/microsoft/vscode-python/issues/19441
つまり、vscodeのpythonプラグインがpython3.6の対応を終了しちゃったからです。
プラグインのバージョンをv2022.8.*まで落とせば解決します。

さらに追記ここまで

他にも方法はありそうですが、具体的な方法は判明していないので書けません(理由は後述)

# 原因考察
完全には判明していないので考察です
だらだらと書き連ねるだけなので、上の対処法で済む人は読まなくていいと思います

まず、Pyenvに問題がありそうだと思ったので、3.6.8を再インストールしたり(治らなかった)、色々なバージョンを入れてデバッグしたりしました
すると、
|  バージョン |  デバッガ動作  |
| ----       |  ---- |
|  3.5.4   |  x |
|  3.6.7     |  x |
|  3.6.8     |  x |
|  3.7.0     |  o |

となったので、3.6.8と3.7.0の間に原因がありそうだと思いました
ということで、[3.7.0の新機能](https://docs.python.org/ja/3.7/whatsnew/3.7.html#what-s-new-in-python-3-7)を見てたら、[PEP 553: 組み込みの breakpoint()](https://docs.python.org/ja/3.7/whatsnew/3.7.html#pep-553-built-in-breakpoint)とあったので、多分これが原因だと思います

そこからさらに、色々調べて[Python debugging in VS Code](https://code.visualstudio.com/docs/python/debugging)
を見るとVSCodeは[debugpy](https://github.com/microsoft/debugpy)というものを使ってそうだとわかりました

分かったのはここまでです
debugpyをあれこれすればなんとかなるかもしれませんが、よくわからないので対処法に書くのはやめました

# 最後に
そもそも[3.6は2021-12-23でサポート終了(EOL)になっていて](https://devguide.python.org/versions/#unsupported-versions)、不具合があったところで文句なんて言えないので諦めて3.7以上を使うのが得策ですね(余談ですが、AtcoderでPyPy使ってるとPythonのバージョンが3.6.9なのでそれに合わせなければいけないのが辛い)
windowsの機能の有効化または無効化

「windowsの機能の有効化または無効化」の場所、について。

Qiitaで探したけどすぐ出てきませんでしたので自分の備忘録。

Hyper-vをきちんと設定する時や設定されているか確認する時。

エンジニアさんならコマンドでできるところでしょうか？

以下の場所でした。

WINマーク右クリック＞アプリと機能＞プログラムと機能＞windowsの機能の有効化または無効化

または

WIN+R＞control(コントロールパネル)＞プログラムと機能＞windowsの機能の有効化または無効化

ですね。
GolangのPackageとModuleについて

GolangのPackageとModuleを使ってGoファイルを分けて関数定義する方法がわからなかったので、調べて実行してみた2022年7月時点の情報を記載します。

## Goファイルを作成
次の2つのファイルを作成します。
```Go:test1.go
package main

import "fmt"

func main() {
	fmt.Println("test1")
	test2()
}
```
```Go:test2.go
package main

import "fmt"

func test2() {
	fmt.Println("test2")
}
```
## module作成と実行
```
MacBook-Pro tmp20220722 % go mod init main
go: creating new go.mod: module main
go: to add module requirements and sums:
        go mod tidy
MacBook-Pro tmp20220722 % ls
go.mod          test1.go        test2.go
MacBook-Pro tmp20220722 % go run .
test1
test2
```
## 参考
[【Go】パッケージ/モジュールやgo modコマンドについてまとめ](https://blog.framinal.life/entry/2021/04/11/013819)
GASからシンプルにDiscordにポストするライブラリを作ってみた


GASのライブラリ作成ってどうやるんだろうと勉強がてら作ってみました。

## インストール

ライブラリIDはこちらです。

> `1s04ndQZRPQeivPoo_62F7wXa-GIdkSOij3W-2KcYeKYl_yiAsgS1CwJv`

GASのライブラリ追加からIDを指定してライブラリのインストールができます。

> ![スクリーンショット 2022-07-22 19.57.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/31761b57-a9af-e4ee-e4bb-639ea7a3ca29.png "スクリーンショット 2022-07-22 19.57.51.png")

## 使い方

```js
function myFunction() {
  const discord = new DiscordWebhook.init(`WEBHOOKのURLを指定`);
  discord.post(`hogehoge`);
}
```

こんな感じで実行できます。

> ![スクリーンショット 2022-07-22 20.00.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/ebd00d73-14c3-0229-b950-a0b42497c81d.png "スクリーンショット 2022-07-22 20.00.27.png")


## 色々と記事参考にさせていただきました。

> 参考: https://qiita.com/shikumiya_hata/items/0aed6d0c67ee365d9161
> 参考: https://belltree.life/google-apps-script-library-publish/
「達人に学ぶSQL徹底指南書」の演習問題 1-2をブラウザで実行してみた

## この記事の概要
- この記事は「達人に学ぶSQL徹底指南書/ミック著」の演習問題をブラウザのSQL実行環境([db-fiddle.com](https://www.db-fiddle.com/f/pj3s2Yt4fA2tYAWSxX1kRE/2))で動かしてみたというものになります。
- 解説は書籍の方を参照してください。
- カラム名がアルファベット表記になっていることに注意してください

## [db-fiddle.com](https://www.db-fiddle.com/f/pj3s2Yt4fA2tYAWSxX1kRE/2)の使い方
- テーブルの作成: Scheme SQLの欄にCREATE TABLEを書いてテーブルを作成
- データの挿入: Query SQLの欄にINSERT文を書いてデモデータを挿入する
- データの検索: Query SQLの欄にSELCT文を書く

## 問題文
本文中のPopTbl2をサンプルに使って、行もちから列もちの水平展開の練習をもう少ししておきましょう。
今度は、次のように表頭に合計や再掲の列を持つようなクロス表を作ってください。

- 求めたい表

```
sex   zenkoku tokushima kagawa ehime kouti sikoku(saikei)
---   ------- --------- ------ ----- -----  --------------
men   855     60        100    100   100    360
women 845     40        100    50    100    290
```

- PopTbl2

| pref_name | sex | population |
|-----------|-----|------------|
| tokushima | 1   | 60         |
| tokushima | 2   | 40         |
| kagawa    | 1   | 100        |
| kagawa    | 2   | 100        |
| ehime     | 1   | 100        |
| ehime     | 2   | 50         |
| kouti     | 1   | 100        |
| kouti     | 2   | 100        |
| hukuoka   | 1   | 100        |
| hukuoka   | 2   | 200        |
| saga      | 1   | 20         |
| saga      | 2   | 80         |
| nagasaki  | 1   | 125        |
| nagasaki  | 2   | 125        |
| tokyo     | 1   | 250        |
| tokyo     | 2   | 150        |


ここでzenkokuというのは、tokyoなども含めたテーブルに存在するデータ全ての合計人口です
(足りない都道府県がたくさんありますが、気にしないでください)。
一方、右端の「sikoku(saikei)」は四国4県(tokushima, kagawa, ehime, kouti)の合計値です。

## データセットの準備
- Schema SQL
```sql
CREATE TABLE PopTbl2 (
  pref_name varchar(255) NOT NULL,
  sex int NOT NUll,
  population int NOT NULL
);
```

- Query SQL
```sql
INSERT INTO PopTbl2 VALUES 
('tokushima', '1', '60'),
('tokushima', '2', '40'),
('kagawa', '1', '100'),
('kagawa', '2', '100'),
('ehime', '1', '100'),
('ehime', '2', '50'),
('kouti', '1', '100'),
('kouti', '2', '100'),
('hukuoka', '1', '100'),
('hukuoka', '2', '200'),
('saga', '1', '20'),
('saga', '2', '80'),
('nagasaki', '1', '125'),
('nagasaki', '2', '125'),
('tokyo', '1', '250'),
('tokyo', '2', '150');
```

## 解答

詳しい解説は書籍を参照してください。

```sql
SELECT sex,
       SUM(population) AS total,
       SUM(CASE WHEN pref_name = 'tokushima' THEN population ELSE 0 END) AS tokushima,
       SUM(CASE WHEN pref_name = 'kagawa' THEN population ELSE 0 END) AS kagawa,
       SUM(CASE WHEN pref_name = 'ehime' THEN population ELSE 0 END) AS ehime,
       SUM(CASE WHEN pref_name = 'kouti' THEN population ELSE 0 END) AS kouti, 
       SUM(CASE WHEN pref_name IN ('tokushima', 'kagawa', 'ehime', 'kouti') THEN population ELSE 0 END) AS saikei
FROM PopTbl2
GROUP BY sex;
```
## 参考
- [達人に学ぶSQL徹底指南書/ミック著](https://www.amazon.co.jp/s?k=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6sql&crid=12AQ4NR599A4E&sprefix=%E9%81%94%E4%BA%BA%E3%81%AB%E5%AD%A6%E3%81%B6sql%2Caps%2C248&ref=nb_sb_noss_1)
HHKBキーボード初期設定（Mac用）



## やった内容
- 背面のスイッチ設定
- HHKBツール設定

- システム設定の修飾キーの設定
- KarabinerElements



## なぜ書いたか
- HHKBキーボードの初期設定を行ったところ、若干ハマったため
- 備忘録
- Macの純正キーボードに近づけることが目標

## 環境
- MacOS Monterey 12.4

# 本題

## 背面スイッチの設定
参考にしたURL：[公式サイト_背面スイッチについて](https://www.pfu.fujitsu.com/hhkeyboard/leaflet/hhkb_backview.html)
今回使用するPCはMacのため、背面スイッチを下記のように設定した。
ただ、後述のドライバの設定で、Mac用の配列に変更されていなかったため、うまく設定できているか甚だ疑問（Karabinerで解決）
| SW  | ON or OFF | 機能                   |
| --- | --------- | ---------------------- |
| SW1 | ON        | Mac                    |
| SW2 | OFF       | CtrlとFnのキー割り当て |
| SW3 | OFF       | BS                     |
| SW4 | OFF       | 矢印キー               |
| SW5 | OFF       | ♢キー                  |
| SW6 | ON        | 省電力モード           |




## HHKBツールの設定
- [Mac用ドライバ （HHKB Professionalズ専用）](https://www.pfu.fujitsu.com/hhkeyboard/macdownload.html)
  - Mac用の特有のキーを使用どおりに入力するために使用
  - MacOS Monterey 12.4のため、Ver5.1をDL、解凍
  - ただし、うまくキー配列が変更されなかったので、Karabinerで調整

- [Happy Hacking Keyboard キーマップ変更ツール](https://happyhackingkb.com/jp/download/)
  - 本来であればキーマップの変更に使えるツール
  - ただ、今回のProfessional JPではおそらく非対応で、アプリが正常に起動しなかった。

## システム設定の修飾キーの設定
Karabinerで変更してもよかったが、CapsやFnについて以下のように変更
![スクリーンショット 2022-07-22 19.43.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733517/453a11dd-4e18-5103-1655-4aa87e38d8ea.png)


## KarabinerElements
以下のように設定
![スクリーンショット 2022-07-22 18.56.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2733517/67932cab-8a7e-f21e-4f10-a69bc8e3d16e.png)


# 最後に
最後まで読んでいただきありがとうございます！
最初の投稿で拙い点も多いですが、今後投稿を頑張りま
ilasmでstack machine その15

# 概要
ilasmでstack machineやってみた。
練習問題やってみた。

# 練習問題
湯婆婆を実装せよ。

# サンプルコード

```
.assembly extern mscorlib {
}
.assembly yuba {
}
.method static void main() {
.entrypoint
.locals init (string[] str)
	newobj instance void [mscorlib]System.Random::.ctor()
	ldstr	 "契約書\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"甲は油屋当主として、乙を油屋に雇用することを契約し、\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"労働に伴う対価の支払いを右の通り、約定する。\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"なお、一日の労働の対価は金百円とする。\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"甲　油屋当主　湯婆婆\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"乙\r\n"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldstr	"契約書だよ。そこに名前を書きな。"
	call	void [mscorlib]System.Console::WriteLine(string)
	call	string [mscorlib]System.Console::ReadLine()
	dup
	dup
	dup
	dup
	stloc	str
	ldstr	"フン。"
	call	void [mscorlib]System.Console::Write(string)
	call	void [mscorlib]System.Console::Write(string)
	ldstr	"というのかい。贅沢な名だねぇ。"
	call	void [mscorlib]System.Console::WriteLine(string)
	ldc.i4	2
	callvirt instance int32 [mscorlib]System.Random::Next(int32)
	ldloc	str
	callvirt instance int32 [mscorlib]System.String::get_Length()
	rem
	ldc.i4	1
	callvirt instance string [mscorlib]System.String::Substring(int32, int32)
	dup
	dup
	dup
	ldstr	"今からお前の名前は"
	call	void [mscorlib]System.Console::Write(string)
	call	void [mscorlib]System.Console::Write(string)
	ldstr	"だ。いいかい、"
	call	void [mscorlib]System.Console::Write(string)
	call	void [mscorlib]System.Console::Write(string)
	ldstr	"だよ。分かったら返事をするんだ、"
	call	void [mscorlib]System.Console::Write(string)
	call	void [mscorlib]System.Console::Write(string)
	ldstr	"!!"
	call	void [mscorlib]System.Console::WriteLine(string)
	ret
}

```

# 実行結果

```
>iyuba
契約書

甲は油屋当主として、乙を油屋に雇用することを契約し、

労働に伴う対価の支払いを右の通り、約定する。

なお、一日の労働の対価は金百円とする。

甲　油屋当主　湯婆婆

乙

契約書だよ。そこに名前を書きな。
矢田亜希子
フン。矢田亜希子というのかい。贅沢な名だねぇ。
今からお前の名前は矢だ。いいかい、矢だよ。分かったら返事をするんだ、矢!!

>

```


以上。
Python3: DynamoDB の scan

次に記述してある制約条件を回避する方法です。
[scan(**kwargs)](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/dynamodb.html#DynamoDB.Client.scan)

```text
If the total number of scanned items exceeds
the maximum dataset size limit of 1 MB,
the scan stops 
```

```py:scan_id.py
#! /usr/bin/python
#
#	scan_id.py
#
#					Jul/22/2022
# --------------------------------------------------------------------
import	sys
import  json
import	boto3

# --------------------------------------------------------------------
def scan_all(table, scan_kwargs):
    items = []
    done = False
    start_key = None
    while not done:
        if start_key:
            scan_kwargs['ExclusiveStartKey'] = start_key
        response = table.scan(**scan_kwargs)
        items.extend(response.get('Items', []))
        start_key = response.get('LastEvaluatedKey', None)
        done = start_key is None
    return items
# --------------------------------------------------------------------
def list_id_proc(icount,unit):
    str_out = str(icount) + '\t'
    str_out += unit['id']
    print(str_out)
# --------------------------------------------------------------------
sys.stderr.write("*** 開始 ***\n")

dynamodb = boto3.resource('dynamodb')

name_table = 'cities'

table = dynamodb.Table(name_table)

icount = 0
#
data = scan_all(table, {})
for unit in data:
    list_id_proc(icount,unit)
    icount += 1
#
sys.stderr.write("icount = %d\n" % icount)
sys.stderr.write("len(data) = %d\n" % len(data))
sys.stderr.write("*** 終了 ***\n")
# --------------------------------------------------------------------
```

レコード数のカウント

```bash
aws dynamodb scan --table-name cities --select "COUNT"
```

参考ページ
[Python3: DynamoDB を使う](https://qiita.com/ekzemplaro/items/e7e566a079c677d4e0fc)
[aws cli で DynamoDB を使う](https://qiita.com/ekzemplaro/items/93c0aef433a2b633ab4a)
BVE 鉄道シミュレーターで自宅運転台を動かそう~メータを動かすPWMとDACって何？(番外編）

BVE 鉄道シミュレーターで自宅運転台を動かそうではメータをDACとPWMという方法で動かしています。

https://qiita.com/usashirou/items/4a57c976fb4771e29ca8

これはどういった方法なのでしょうか？
# DACとは
DACとはデジタル・アナログ・コンバータの略称で数値をアナログの電圧に変化させて出力させています。
EPS32では当初DACで動かしていましたが、4個のメータを動かしたいため、PWMに変更しています。
これは、ESP32のDAC出力が2個しか無いためです、マイコンによっては、DACが無いモノがあります。
波形を見てみましょう。
RaspberryPiPicoにＤ／Ａ変換モジュール　MCP4726を接続して50%の出力をした様子です。
乱れはありますが、一定の値が出力されていることが確認できます。
![IMG_4037.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/4c5a86e9-f181-3fa3-8012-2c09a03a62bd.jpeg)
# PWMとは
PWMは出力をオン・オフする事で見かけ上の電圧を変化させる方法です。
Highの時間が長いと電圧が高く、短いと電圧が低くなります。
以下の波形は25%,50%,75%の様子です。
![IMG_4034.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/7fb007b5-61c6-76c2-7bc9-dcad58b6a35e.jpeg)
![IMG_4035.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a605a39f-5210-4e73-ebb4-bb5409177823.jpeg)
![IMG_4038.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/03c88e33-c672-d148-a1ce-312457f53812.jpeg)
出力のデューティー比は、かなり正確ですね。
# どちらが良いのか？
ではどっちが良いのでしょうか？
当然ながらDACの方が良いです。
PWMはあくまでも疑似的に電圧を生成しているにすぎません、この為、DACで電圧を生成する方が良いのです。
ただし、PWMでもそう大きな問題は無いと私は思っています。
確認のために実際に動かしてみましょう。
# 実際に動作させた様子
製作の際の参考にしていただければと思います。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">東京メトロの電流計を<br>DACとPWMで動作させる<br><br>テスト環境<br>メインボード：Raspberry Pi Pico<br>DAコンバータ：MCP4726<a href="https://t.co/dqez6q9S23">https://t.co/dqez6q9S23</a> <a href="https://t.co/nGStxI474w">pic.twitter.com/nGStxI474w</a></p>&mdash; usashirou (@usashirou1) <a href="https://twitter.com/usashirou1/status/1550408303057874944?ref_src=twsrc%5Etfw">July 22, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
基本情報（タスク管理）

ジョブをジョブステップに分解された後にタスク管理に渡されることで、CPUの実行単位である**タスク**が生成されます。

コンピュータから見た仕事の単位が**タスク**です。
**プロセス**とも呼ばれます。

単純にいうと、コンピュータでコマンドを叩いたり、アプリケーションのアイコンをダブルクリックしてプログラムがメモリにロードされて実行状態に入ることです。そのように動いているプログラムは一つだけではないと思います。

CPUは決して複数のことを同時に処理できるわけではありません。タスク管理の働きによって、CPUの使用権をタスク間に持ち回りさせたり、割り込みを処理したりすることで実現できています。

## タスクの状態遷移
生成されたタスクには、次の3つの状態があります。

|   |説明  |
|---|---|
|実行可能状態(READY)  |いつでも実行が可能な、CPUの使用権が回ってくるのを持っている状態。生成直後のタスクは、この状態になってCPUの待ち行列に並んでいます  |
|実行状態(RUN) |CPUの使用権が与えられて、実行中の状態|
|待機状態(WAIT)　 | 入出力処理が発生したので、その終了を待っている状態

生成されたタスクは、即座に実行されるわけではありません。
プログラムの処理が実行されるためには、CPUの使用権が必要です。この使用権をタスク間で効率よく回すことができるように、各状態を行ったり来たりすることになります。

そのタスク図が下記となります。

![スクリーンショット 2022-07-22 15.21.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/542637/7b3e8afd-1aad-6227-10c0-64cd29599a94.png)

CPUの使用権は「実行可能状態」で待っているタスクしか得ることができません。入力出力処理で「待機状態」になったタスクが元の「実行状態」へ戻るためには、必ず一度「実行可能状態」を経由する必要があります。

## ディスパッチャとタスクスケジューリング
実行可能状態で順番待ちしているタスクにCPUの使用権を割り当てるのは**ディスパッチャ**という管理プログラムの役割です。
ディスパッチャを日本語に訳すと「（係などを）派遣する人」「（バスなどの）配車係」という意味になります。

タスクにCPUの使用権が割り当てられることを**ディスパッチ**と言います。

この時、「どのタスクに使用権を割り当てるのか」を決めるためには、タスクの実行順序を定める必要があります。これを**タスクスケジューリング**と呼びます。
タスクスケジューリングには様々な方式がありますが、中でも次の３つが代表的です。

### 到着順方式
実行可能状態になったタスク順に、CPUの使用権を割り当てる方式です。タスクに優先度の概念がないので、実行の途中でCPU使用権が奪われることはありません（これを**ノンプリエンプション**)と言います。
### 優先順（プライオリティ順）方式
タスクにそれぞれ優先度を設定し、その優先度が高いものから順に実行していく方式です。実行中のタスクよりも優先度の高いものが待ち行列に追加されると、実行の途中でCPU使用権が奪われます（これを**プリエンプション**)と言います。
### ラウンドロビン方式
CPUの使用権を、一定時間ごとに切り替える方式です。
実行可能状態になった順番でタスクにCPU使用権が与えられますが、規定の時間内に処理が終わらなかった場合は、次のタスクに使用権が与えられ、実行中だったタスクは待ち行列の最後に回されます。

## マルチプログラミング
タスク管理の役割は、**CPUの有効活用**につきます。つまりCPUの遊休時間を最小限にとどめることが重要です。
CPUがあそびの状態で使われていない時間のことを**アイドルタイム**といいます。

マルチプログラミングは複数のプログラムを見かけ上同時に実行して見せることで、遊休時間を減らし、CPUの利用効率を高めようとするものです。
一般的には**マルチタスク**と呼ばれています。

## 割込み処理
割込み処理は、実行中のプログラムが原因で生じる内部割込みと、プログラム外の要因で生じる外部割込みに分かれます。
|   |内部割り込み  |
|---|---|
|プログラム割り込み  |ゼロによる除算や桁あふれ（オーバーフロー）、仮想記憶において存在しないページのアクセス（ページデフォルト）が生じたり、書き込みできない主記憶装置に書き込もうとした記憶保護例外などの場合に生じる割込み。  |
|SVC（Super Visor Call）割込み |入出力処理を要求するなど、カーネル呼び出し命令が発令されたときに生じる割込み（Super Visorとはカーネルの意味）  |

|   |外部割り込み  |
|---|---|
|入出力割込み  |入出力装置の動作完了時や中断時に生じる割込み。  |
|機械チェック割込み  |電源の異常や主記憶装置の障害など、ハードウェアの異常発見時に生じる割込み。  |
|コンソール割込み　 | オペレータ（利用者）による介入が行われたときに生じる割込み。
|タイマ割込み |規定の時間を過ぎたときに生じる割り込み。|

## まとめ
基本ソフトウェアはボリュームがありますが、個人的には大事なとこだと思うのでここは重点的にやります。