OmniAICreator/Qiita-1.07M huggingface dataset:
プログラミング学習を学ぶ前に知っておきたいこと~メモ編~

## 初めに
この記事は**プログラミング学習を学ぶ前に知っておきたいこと**と題したシリーズの一つです。
このシリーズは各テーマごとに連日投稿予定です。

## このシリーズ記事の対象者
- プログラミングに興味を持って、学習を検討している方
- 学習したいけど、何から手をつけたらいいのかわからない方

[前回の記事](https://qiita.com/MPrg2011/items/f87814559328a38eb6fd)の続きです。

https://qiita.com/MPrg2011/items/f87814559328a38eb6fd

## 自分の思いは書き留めておこう

今までご紹介した教材のサイトやPCの設定などしていると次のような思いが浮かんでくるかと思います。

**「インストールしたソフトの拡張機能の追加がわからなくて、調べながらどうにか終えることができた」**
**「教材やドキュメントには説明がなかったけど、どうしても理解ができなくて自分で調べてようやく納得できた」**

ここでアウトプットに慣れている方であればブログやQiitaさんなど誰でも見られる媒体に記述できると思いますが、こんなことで記事を公開するのは気が引ける、など一歩踏み出せない方もいらっしゃるかと思います。

その時は**メモアプリで書きましょう。** 自分で公開しない限りは他の人に見られることはないのでお作法も気にせず思うがままに書くことができます。
### メモを書くことのメリット
- 文章を書く技術力がUP
- タイピングの練習になる(ホームポジションは確認しておきましょう)
- 思考の整理ができ、本当に知りたかったこと、伝えたいことがわかるようになる

## 何に書くか

以前の記事で少し記述したことがありますが、Notionを愛用しています。

https://www.notion.so

プログラミング学習を始める際に、手書きではないメモのとり方を模索していました。
選んだ理由としては
- コード専用の書式があり、ワンクリックでコピーができる
- 設定を変更すれば他人と共有することも可能
- 画像やファイルの埋め込みが可能
- 書式が豊富で見やすく書くことができる

Notionはそれらを全て叶えてくれるので、2年ほど使用しています。2021年10月から日本語のBeta版の提供が始まり、2022年11月に正式版がリリースされました。

### 私のメモ方法をご紹介
https://rose-et-ciel.notion.site/Progate-Path-74e4fceebdfa48ddb5245f4ffdacbd67

![スクリーンショット 2022-12-07 21.04.04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051129/a3270649-c967-11c2-5629-b7f7dd076933.jpeg)

右上の`共有`から`Webで公開`をONにすると、URLを知っている人がブラウザで見ることができます。
デフォルトだと編集はOFFになっているので、他人に編集されてしまうこともありません。(編集をONにすればURLを共有している人でも編集が可能になります)

ページの中にページを作成し、タグでまとめ、見え方を変更すると、画像のようにジャンルごとで記事をまとめることができます。
![スクリーンショット 2022-12-07 21.08.47.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1051129/cd63345c-d433-fe6b-8507-4212377a1138.jpeg)

もしこの記事をみて使ってみたいと思った方は、ハンズオンで学べるこちらの動画か、公式のドキュメントをおすすめします。

https://youtube.com/playlist?list=PLwM1-TnN_NN6QW5mVzpMfYFt4a3D3RKv7

https://www.notion.so/ja-jp/help/guides

### 最後に
短い記事でしたが最後まで見ていただきありがとうございました。

明日は学習スケジュールの立て方について投稿予定です。
Wiresharkで特定IPアドレスの通信のみをキャプチャ

# やり方

『このフィルタを利用』で ```host IPアドレス``` 。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/85d1275f-8d11-ae39-784e-154c61d67038.png)

フィルターは保存可能。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/f1d7c018-ee07-d5f8-1245-32f844613604.png)


# 特定IPの通信を除外したい時

```not host IPアドレス```
のように ```not``` を付ける。

# 参考サイトさん

https://hirotanoblog.com/wireshark-capture-filter/11116/#toc5

# バージョン

Windows 10 Pro 21H2 OSビルド 19045.2311
Wireshark Version 4.0.1


TODO:特定『端末』の通信を完全に除外したい時などはデータリンク層のフィルターも多分必要だからそのあたりも知識整理。
laravelでcreateした時の戻り値にidがない、idが取得できない

# 結論
モデルの中の下記が原因
```php:laravel
class ProductFile extends Model
{
    /**
    * @var bool
    */
    public $incrementing = false;


}
```
コマンドで作成する時にデフォルトで入っている？
glowの改造

「instantNeRFで遊ぶ Advent Calendar 2022」の5日目です。

今日はエフェクトのglowを改造します。

:::note
業務外の個人的な検討活動です。
:::

:::note alert
警告
環境や入力内容によっては現在使用できている状況が壊れることがあります。
あなたの責任と判断で試してください。私は責任を取りません。
:::

#### glow
Debug visualizationにあるglow modeとglow posを変更すると、再生空間を横切るように光らせたりクロップしたりします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/978160e6-85bc-a7fc-333f-686330f95917.png)

#### testbed_nerf.cu
各軸に4段階の繰り返し周波数で線を描画しているようです。
また、この前の部分を見ると、5つの種類のエフェクトを組み合わせて表示するようでした。
![11-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/60b723a1-e734-e4f3-4798-b2f71b40adbb.png)
このrgb.x, y, zの割合を変更すると色が変わりました。

#### testbed.exe
![11-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/bea5abf6-9634-2ebf-f80d-191e6a13b953.png)
![11-4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/d48a8f50-f082-551a-21b8-b4eecddc57ce.png)
![11-5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/103446/dc003354-1566-5675-288c-b9a334401c6e.png)
カメラパスの設定部分に調整のパラメータを渡すと、色を変更出来て楽しそうです。
【Linux】現在使用しているシェルを確認する方法

## はじめに

以下の方法では現ユーザーのログインシェルが出力されます。  

```terminal
$ bash
$ echo $SHELL
/bin/bash
$ zsh
$ echo $SHELL  
/bin/bash
```

使用するシェルを`zsh`に変更しても`$SHELL`にはログインシェルである`bash`のフルパスが出力されます。 

https://linux.die.net/man/1/bash#:~:text=is%20%27%27%2B%20%27%27.-,SHELL,-The%20full%20pathname

> SHELL
>
> The full pathname to the shell is kept in this environment variable. If it is not set when the shell starts, bash assigns to it the full pathname of the current user's login shell.

`bash`から`zsh`へ変更した際に`zsh`であることを確認する方法について記載します。  

## 確認方法

### `echo $0`

ターミナルでコマンドを実行する際には次のように`echo $0`を実行することで確認できます。  

```terminal
$ bash
$ echo $0
bash
$ zsh
$ echo $0
zsh
```

ただしシェルスクリプトの中で使用すると期待しない結果になります。  

```sample.sh
echo $0

```

```terminal
$ bash sample.sh
sample.sh
```

シェルではなく実行時のコマンド名が出力されます。  

### `readlink "/proc/$$/exe"`

シェルスクリプトでも現在使用しているシェルを確認するためには次のコマンドを実行します。  

```terminal
$ bash
$ readlink "/proc/$$/exe"
/bin/bash
$ zsh
$ readlink "/proc/$$/exe"
/bin/zsh
```

```sample.sh
readlink "/proc/$$/exe"
```

```terminal
$ bash sample.sh
/bin/bash
$ zsh sample.sh
/bin/zsh
```

シェル名のみ取得する場合には次のように実行します。  

```terminal
$ basename "$(readlink "/proc/$$/exe")"
zsh
```
インフラ運用保守のとても面倒くさいお話

# 前書き
こちらの記事をお開きいただきありがとうございます。
当記事では、現役でインフラ運用保守に参画する私が、身バレや機密漏洩しない程度に色々めんどくさいお話をするだけの記事となります。

一応、誤解の無いようにしておきたいのですが、得られるものもちゃんとあります。
今回は、
#### 面倒くさいポイント→得られるもの
というような構成で話を進めていきたいと思いますので、下記スペックをお持ちの方、
どうぞゆったりとお読みください。

##### 当記事を読む必須スペック
駄文を温かく見守る心

##### 推奨スペック
Linuxコマンドの知識(最高でもLPIC1程度、かじっただけ、初学者でも可)
文章から情景を想像し、共感してくれる方

# 障害発生時(面倒くさいレベル1)
大丈夫です。大抵は2重3重の冗長があるので、すぐにお亡くなりコースはありません。
一概に障害＝ダウンというわけでも無いですし。
ただし、原因の切り分けはしなきゃいけません。
ls,cd,ls,したのち、catもしくはmoreやtail等でログ確認。
何しろターミナル画面なので、ブワーっとログが出てきますが、だいたい見るところなんか限られてます。
え？その見るところがわからんから大変だ？ごもっともです。。。面倒くさいですよね。
時と場合によってはgrepしたりもしますが。
####  この話の得られるもの
ログと仲良くなれます。さらには即興でコマンド+引数という実戦経験
も積めます。わあい！

# ベンダ修理必要時(面倒くさいレベル2)
障害発生のなんやかんやの末、例えばストレージとか、その他部品を変えなきゃいけないケースも出てきます。
修理そのものは手順書がありますが、こういう部品交換系の場合、部品そのものを変えるのはベンダだったりするので、ベンダ調整が必要です。
それでも修理が溜まってて、昨今の有給消化義務やコロナ影響もあり互いの体制が手薄な場合もあるので、
ベンダ調整の際は、自分たちの稼働状況+ベンダの状況も加味して調整しなければなりませぬ。
さらには冗長の都合もありますので、
「放っとくともう一個死んだらアウト、これはまだまだ大丈夫」
「これは監視系だからまだいいけど、こっちは実サービス系だから早く直さないと」
もちゃんと知っておかなければなりません。
面倒くさいですねえ。
####  この話の得られるもの
諸々の条件を加味した上での人員調整スキル(結構、汎用スキルかも？)

# 自分たちだけでやる修理の場合(面倒くさいレベル3)
部品交換が絡まなければ、自分たちでできます。
え？だったらさっさとやればいいじゃん、って？
ところがそうもいかないのがインフラ。(インフラも様々ですけどね)
自部署、他部署の偉い人たちに、
「ワイらの作業がどれだけ安全、リスクヘッジバッチリか」
を説明しなければなりません。
そんなのが一堂に会する中で、**私たちよりも遥かに化物スキル**
であったが為に出世した偉い人たちの前で精一杯の説明をし、一緒に問題ないかを考え、承認を得なければならないのです。
ここで厄介なのが他部署の偉い人。他部署だけどちょっと知ってるが故に思わぬ角度からいろいろな質問をして頭を悩ませます。
その人を納得させられれば、勝ったも同然。(勝ち負けじゃない)

半ば余談ですが、最近、私ばっかりその説明やってるのですが、毎回やりたく無いと思ってます。ホントに。
無事に切り抜けたらその日の仕事は終了と思ってるぐらいです。
####  この話の得られるもの
他部署の~~モンスター~~偉い人相手に説明するメンタルと技能
さらに説明資料を作るパワポやExcelスキル(この辺も汎用スキルかも？)

# 最後に
色々言いましたけど、**ログを嫌がらずに見れるようになって、人員調整もできて、
作業説明を偉い人たちにできて、面倒くさいことに耐えるメンタル**
という素敵なスキルが身につくのが運用保守です。
決してキラキラしちゃいませんし、なんならナーバスなことの方が多いですが、
コーディング案件と違って未経験者には謎多き案件であるとも思うので、
これで少しでも想像できたら幸いです。

~~さあ、運用保守現場を抜ける為の勉強でもしますかね。~~
SCIMとSAMLについて調べてみた

AZ400の勉強しててごっちゃになったのでメモ

# SAMLとは
Security Assertion Markup Languageの略。
異なるインターネットドメイン間でユーザ認証を行うための標準規格。
複数のクラウドサービスへのシングルサインオンが可能。
XMLベース。

# SCIMとは
System for Cross-domain Identity Managementの略。
複数ドメイン間でユーザ情報IDをやりとりするための規格。
2.0からJSON＋HTTPベース。（XMLに関する仕様は2.0で削除された）

# 違い
SAMLは「認証」をメインとしたプロトコル。複数システム間でのSSO（シングルサインオン）に使われる。
SCIMはユーザ認証情報の同期をメインとしたプロトコル。認証、認可の仕様は定義されていない。推奨はOAuth2.0。
※字面が似ているから間違えやすいが、そもそもプロトコルの目的が違うんだよー、というところがポイント。


# （おまけ）Microsoft SSO と Azure SAML サインオンの違い
どちらもAzureポータル上で管理される。
SAMLはSAML2.0プロトコルを使用し、Microsoft SSOはOAuth2.0 OpenIDを使用する。
問い合わせ対応でJIRAを使って良かったこと3選！

※この記事は[モチベーションクラウドシリーズ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/mcs) の8日目の記事です。

## はじめに
初めまして、CRE（Customer Reliability Engenieering）チームでテクニカルサポートとプロダクトマネジャーを担っている粟田です。CREチームではお客様からの問い合わせのうち、技術的に解決する必要がある内容について、JIRA Service Management（以下JIRA）を使って管理をしています。

本記事では、JIRAを使ってきたからできた、よかったことを紹介していきたいと思います。

## 問い合わせ対応の体制
前提として、弊社におけるお客様からの問い合わせの対応は、以下のように、
- 一次対応はカスタマーサポートが応対
- カスタマーサポートにて解決できない問題が発生した場合に、カスタマーサポートよりCREに依頼

という体制をとっております。

![問い合わせ対応体制.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331984/14b90df1-c3ed-378f-e24f-3373761e2cb9.png)


上記における、カスタマーサポート⇆CRE間で、JIRAを用いております。

## JIRAを用いてよかったこと
それまではメールを用いて行っていた問い合わせ管理でしたが、
- カスタマーサポートがメールに問い合わせを記載するのに一定のコストがかかる
- 受信した依頼を、開発チームが利用するツールに転記する不要な作業が必要になる
- 問い合わせ応対に対してのデータが取得できない
といった課題があったため、去年の7月ごろにJIRAを導入しました。

![JIRA.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331984/48d5f280-5031-3a54-711a-cf0513e3efa4.png)


その後JIRAを継続的に利用していますが、結果として、以下の３点に価値を感じました。
1. 問い合わせ応対品質をSLOとして計測可能に
2. 問い合わせ対応の工数削減を目的とした分析が容易に
3. 必要な情報を摺り合わせるための依頼フォームの修正が容易に

具体的な設計方法を含めて説明いたします。

### 問い合わせ応対品質をSLOとして計測可能に
JIRAを導入する以前のメールでの問い合わせ受付を行っていた際、問い合わせ対応における目標設定は、一件ごとに設ける返信までの期日ルールが遵守できているかどうか、カスタマーサポートの方々へのアンケートでの定性的な評価を元に行っておりました。
しかし、
- 1件でも期日を漏らしてしまうと、その期間の目標は未達となり、改善が不可能
- 評価のために一定のコストがかかるため、頻度高い振り返りが実施できない
といった課題をはらんでおりました。

そのため、JIRAを用いて
- 初回応答速度（=カスタマーサポートの方からの依頼を受信してから、一次応答するまでの時間）
- 平均解決時間（=チケットが解決されるまでの平均時間）
の２点が測定されるようにし、過去平均をもとに目標とすることで、問い合わせ応対の品質に対して継続的に改善を行うことができるようになりました。


### 問い合わせ対応の工数削減を目的とした分析が容易に
問い合わせ対応をやっている部署は、日々増え続ける問い合わせをなんとか改善して減らさなければと思いながらも、何に時間を使っているのかを測定するのに時間がかかるため、結局課題を明確にできず、打ち手も打てないような状況に陥ることがあるのではないでしょうか。
自チームでもよくどの機能に対しての問い合わせが多いのだろう、調査対応に時間がかかっているのだろうと考えるものの、それら情報を全ての問い合わせに付与しようと思うと時間がとられるため改善に手が回せない状況が発生しておりました。

そこで、問い合わせをクローズする処理の中で、
- JIRAのラベルで機能種別
- チケットの解決までの調査対応にかかった時間
を入力項目として用意し、負荷のない範囲で分類/測定できるようにしました。

![スクリーンショット 2022-12-07 20.57.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331984/24ca27bd-ae58-e084-ef14-d3fad45f270f.png)
※画像は少し古いため、機能種別の入力項目はありませんが、現在は選択できるよう修正しています

結果として、定期的に機能分類や依頼種別ごとに、件数や対応時間がかかっているのかが容易に閲覧可能になり、課題や改善策の検討も容易にすることができています。


### 必要な情報を摺り合わせるための依頼フォームの修正が容易に
問い合わせ対応の中で、発生している問題を調査をするためには、原因究明のため、さまざまな情報が必要になります。また自チームの場合は、機能として提供できていない特定のデータの出力等の作業も依頼をいただき対応しておりますが、その際も対象の認識の齟齬を生まないために、具体的な情報のすり合わせは必須でした。

JIRAを用いた利点として、上記のような必要な情報の取得をフォームを用いて行うことができ、またその入力フォームを容易に改善できる点がありました。

![問い合わせフォーム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/331984/565e7a65-9759-947b-233e-f84425728969.png)


この観点は依頼をもらってから確認し直すことが多いため入力フォームに追加する、このデータ出しをよく相談もらうため依頼フォームを作成しくり返す情報のすり合わせを不要とする、など改善が促進されるようになりました。


## まとめ
今回は、問い合わせ対応のうち、利用しているJIRAについて、改善に向けた利用の観点や活用方法について説明させていただきました。
どの企業でも、問い合わせ対応は必要でありつつも、その難易度などから改善が後回しになってしまったり、改善に時間が割けなくなったりすることがよくあるのではないかと想像しています。
そんな方々に、少しでも改善の観点をご共有できたら幸いです。

また、こんなこと聞いてみたい、などの質問や、もっと良い方法知ってるよ、などの情報共有も、もしありましたら是非コメントいただけると幸いです！
リゾルバーがLambdaのAppSync（Query編）

# 概要
この記事では、リゾルバーにLambdaを設定したAppSyncのQueryパターンを紹介します。

# 前提
- DynamoDBにテーブルが用意されていること
- AppSyncのスキーマを作成済みであること

# Lambda
まず、AppSyncに紐づけるLambdaを作成します。
ここでは、DynamoDBのデータを取得するコードを使用します。

※ 本来、DynamoDBのデータを取得するだけであれば、マッピングテンプレートで完結します。
　 詳しくは、[こちら](https://qiita.com/inoue-mn/items/e8134356c216ed4015d3)を参照ください。

```python
import boto3
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):
    id = event['id']
    
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('Radio')
    response = table.query(
         KeyConditionExpression = Key('id').eq(id)
    )
    
    return response['Items'][0]
```

# AppSync
## データソース
AppSyncのコンソールから``データソース``を選択し、作成したLambdaを設定します。

作成後、``タイプ``が``AWS_LAMBDA``になっていることを確認してください。

## スキーマ
ここでは、[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の1日目から5日目で作成したものと同様のスキーマを使用します。

## リゾルバー
リゾルバーは、
データソースに先ほど作成したLambdaのデータソースを選択し、
- Enable request mapping template
- Enable response mapping template

を、それぞれONにし、出力されたものを使用することで実現可能です。

### リクエストマッピングテンプレート
```
{
  "version" : "2017-02-28",
  "operation": "Invoke",
  "payload": $util.toJson($context.args)
}
```

### レスポンスマッピングテンプレート
```
$util.toJson($context.result)
```

# 実行
AppSyncでクエリを実行し正しい値が返ってくることを確認します。
![7-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318120/1f860438-09a4-14b6-0094-a4aa31192e53.png)

正しく動くことを確認できました。
NPF(NetBSD Packet Filter)を紹介してみる

[NetBSD Advent Calendar 2022](https://qiita.com/advent-calendar/2022/netbsd) 1日目の記事です。今年もNetBSDの記事を増やして行きましょう！
今日は[npf(7)](https://man.netbsd.org/npf.7)の紹介をしようと思います。

## NPFとは？

[NPF](https://github.com/rmind/npf)(NetBSD Packet Filter)とは、NetBSDで利用可能なレイヤ3パケットフィルタで、高いパフォーマンスとスケーラビリティ、モジュール性にフォーカスして開発が行われています。NPFは2009年にC99でスクラッチから作成されており、ライセンスは2条項BSDとなっています。

基本的に、パケットフィルタはユーザランド側から操作するためのコマンドが提供されますが、NPFではこれに加え、[libnpf(3)](https://man.netbsd.org/NetBSD-9.0/libnpf.3)というNPF操作用のライブラリも提供しています。そのため、[DPDK](https://www.dpdk.org)(Data Plane Development Kit)やnetmapと組み合わせて使用されたりもします。

## BSD系ってパケットフィルタの実装がいくつかありますよね？

BSD系OSでパケットフィルタを使う際、ちょっと悩ましいのが「どのパケットフィルタを使えば良いの？」という点があるかと思います。
以下のように、FreeBSD,NetBSD,OpenBSDで使用されるパケットフィルタはそれぞれ異なっています。

| OS | 実装 | 名称 |
| --- | --- | --- |
| FreeBSD | [ipf(5)](https://www.freebsd.org/cgi/man.cgi?query=ipf&sektion=5&format=html) | IP Filter |
| NetBSD | [npf(7)](https://man.netbsd.org/npf.7) | NetBSD Packet Filter |
| OpenBSD | [pf(4)](https://man.openbsd.org/OpenBSD-6.2/pf) | Packet Filter |

ただ、それぞれ相互に移植されていたりするので、基本的には使い慣れているパケットフィルタの実装を利用すれば良いのですが、NetBSDでは他のBSDで実装されたパケットフィルタの取り込み(メンテナンス)に手が回っていないという現状があります。

少し前の記事ですが、2019年の時点でNetBSDではOpenBSD由来のpfサポートが取り除かれています。

 * [NetBSD、メンテナンスの負担を理由にOpenBSD由来のファイアーウォールを廃止](https://opensource.srad.jp/story/19/04/03/0642253/)

そのため、現時点(2022年時点)でパケットフィルタを使用する場合、NetBSDでは[npf(7)](https://man.netbsd.org/npf.7)または[ipf(5)](https://www.freebsd.org/cgi/man.cgi?query=ipf&sektion=5&format=html)のどちらかを選択する形になります。

## NPFを使ってみよう！

### NPFの操作コマンド

NPFの操作は[npfctl(8)](https://man.netbsd.org/NetBSD-7.0/npfctl.8)というコマンドを用いて行います。基本的な操作例は以下になります。

```
# npfctl reload npf.conf  # NPF設定ファイルを読み込む
# npfctl stats            # パケットフィルタの統計情報を表示
#
# npfctl show             # パケットフィルタリングの設定を表示
#
# npfctl start            # パケットフィルタリングを有効化する
# npfctl stop             # パケットフィルタリングを無効化する
```

また、NetBSD起動時にNPFによるパケットフィルタを有効化する場合は、 `/etc/rc.conf` に以下を追記します。

```sh
npf=YES
```

### NPFの設定ファイル

NPFの設定は `/etc/npf.conf` に記載します。任意の場所に設定ファイルを用意しておくことも可能で、その場合は `npfctl reload` で設定を読み込ませます。

簡単なサンプルでNPFの設定例を見てみます。例としてICMP(ping)をブロックする設定例を以下に示します。
この例では、インタフェース `wm0` から入ってくるICMPパケットは全てブロックされます。

```
group "block icmp" {
  block in  on wm0 proto 1 all
  block out on wm0 proto 1 all
}
```

上記と同等のフィルタルールを[ipf(5)](https://www.freebsd.org/cgi/man.cgi?query=ipf&sektion=5&format=html)で記述する場合は以下のようになります。NPFではルールのグルーピングなどでより分かりやすい記述になることが見て取れます。

```
block in  log quick proto icmp all group 100
block out log quick proto icmp all group 100
```

## まとめ

NetBSDで利用できるパケットフィルタであるNPFについて簡単な概要を紹介してみました。
2日目以降はNPFを実際に使用する際の設定例やipfからNPFに置き換える場合のフィルタルール読み替えなどを紹介できればと思います。
Node.jsからDiscordに通知を送るメモ（Fetch API）


前書いた記事のFetch版です。

https://qiita.com/n0bisuke/items/264ba2b79a0c5ed72678

基本は一緒

```js
'use strict'

const URL = `DISCORD_WEBHOOK_URL`;

//送信するデータ
const postData = {
    username: 'n0bisuke BOT',
    content: 'Node.js Fetch APIからポスト'
}

const main = async () => {
    const response = await fetch(URL, {
        method: 'POST',
        headers: {
            'Accept': 'application/json',
            'Content-Type': 'application/json',
        },
        body: JSON.stringify(postData)
    });

    // const json = await response.json();
    console.log(response.status);
}

main();
```

![スクリーンショット 2022-12-07 20.51.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/35387/0edfeb69-1682-f9ea-7779-036c2446121e.png "スクリーンショット 2022-12-07 20.51.44.png")
AWS Application Composer を使ってみた


# AWS Application Composer とは

AWS Application Composer はサーバレスアプリケーションの構築をサポートするツールです。
AWSサービスをドラッグ&ドロップで配置・接続することができ、それをCloudFormationのテンプレートとして自動生成することが出来ます。

アーキテクチャ図の作成とCloudFormationのテンプレート作成が同時に進行するので非常に便利なツールだと思います。

2022/12/08 時点ではまだプレビューとなっており、対応しているサービスは以下の通りです。

- API Gateway
- Cognito UserPool
- Cognito UserPoolClient
- DynamoDB Table
- EventBridge Event Rule
- EventBridge Schedule
- Kinesis Stream
- Lambda Function
- Lambda Layer
- S3 Bucket
- SNS Topic
- SQS Queue
- Step Functions State machine

AWSのサービス数を考えると決して多くはないですが、現時点でも主要なサービスには対応しており充分実用的だと思います。

# プロジェクトを作成する

Step.1 「Create project」をクリックしてプロジェクトを生成します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/d7733ce2-952c-ca63-c281-14baf7c4fb34.png)

Step.2 「Select folder」をクリックし、テンプレートファイルを保存する場所を選択します

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/bc57e9a2-9170-8a31-d656-d001fe37fc32.png)

Step.3 保存する場所を選択すると許可を求めるダイアログが表示されるので、「ファイルを表示する」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/ad97498f-d41d-1769-2e8e-aca449db22b9.png)

Step.4 「Create」をクリックし、今度は編集の許可を求めるダイアログが表示されるので「変更の保存」をクリックします

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/0edcf313-bdce-9fd6-1e47-b1d372518fd5.png)

これにてプロジェクトの作成が完了し、ブラウザ上にはアプリケーションを構築するためのキャンバスが表示されていると思います。
また、キャンバス上の変更は接続をしているフォルダにリアルタイムに保存されていくと思います。便利ですね！

# Composer tour

実際に使いながらスクリーンショットを取って説明を書くのも良いのですが、ここは手抜きをして最初に表示されるツアーガイドを翻訳していきます。

## 1. リソースをドラッグ&ドロップする

![step1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/a49779bd-d45d-421d-ff2c-1fda04c4e729.gif)

リソースパレットでリソースを探し、キャンバスにドラッグ&ドロップすることでアーキテクチャを拡張します。

## 2. リソースのプロパティを設定する

![step2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/874c7775-146a-3b7e-b390-8a8c27560e31.gif)

リソースをダブルクリックすると、そのリソースのプロパティパネルが表示されます。ここでは、リソースの命名と設定を行うことが出来ます。

:::note warn
注意
リソースの全てのプロパティが編集可能なわけではありません
:::

## 3. リソースを接続する

![step3.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/c9e67bf2-5a05-47af-195a-73c84b8e46e0.gif)

リソースファセットをクリックし、別のリソースファセットまでドラッグすることでリソースを接続します。
この操作によって、リソースが相互に作用するための権限が自動的に構成されます。

## 4. テンプレートの表示と編集

![step4.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/b62b45b0-10be-5929-d65e-47668df170d1.gif)

`Template` を選択するとインフラのコードを表示および編集することができます。
変更はキャンバスビューに自動的に反映されます。

## 5. IDE との併用

![step5.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/314315/cedc35a0-9740-917e-eea9-81c27308a39d.gif)

`Connected mode` では IDE のようなローカルのツールで Application Composer を使うことが出来ます。
ローカルでの変更は自動的に反映されます。

# まとめ

本記事では re:Invent 2022 で発表された AWS Application Composer をさっそく触ってみました。
シンプルに開発体験の向上につながるサービスで良いなと感じましたし、どんどん対応するサービスが増えてくると嬉しいなと思いました。

個人的には GUI の変更がすぐにテンプレートファイルに反映されるのが気持ちよく、Connected mode の優秀さが際立つサービスだなと感じています。

すぐにでも業務で活用できるツールなので是非積極的に使っていきたいと思います。
「ユーザーがこのNFTを持ってるかどうか判定したい！」って時【ERC721/1155】

これは[no plan inc.の Advent Calendar 2022](https://qiita.com/advent-calendar/2022/noplan_inc)の10日目の記事です。

このNFTを買ってくれた人だけ来れる特設サイトを作りたい！って時ありますよね。。
そんな時にどうやって持ってるかどうか判定するかって話です。

結論から言うと、コントラクトのview関数叩くでもある程度作れますが、ちゃんとやるならAPI使った方がいいです。
view関数でやる場合、ERC721ならownerOf、ERC1155ならbalanceOfを使う事になります。
ただ、どっちのメソッドも引数にtokenIdをとります。ここで**問題発生**です。ユーザーが買ってきてくれたNFTのtokenIdが分かりません。

これの対処法としては、
* ユーザーに買ってきたNFTのtokenIdを入力してもらう！
* 全部のtokenIdでownerOf/balanceOfを呼ぶ...
のどちらかですがどっちも辛いです...

前者はユーザーにとってめんどくさいですし、後者はリクエスト量がとんでもないことになって時間もお金もかかります。。
自前でデプロイしたNFTでない場合、全tokenIdを把握することすら難しいこともあります。
以下、無理矢理ownerOfでやろうとした場合のサンプルです、

## 全idにownerOfして所持判定する場合のサンプル
```typescript
import { ethers } from "ethers";

const checkIfHaving = async () => {
  const provider = new ethers.providers.StaticJsonRpcProvider(
    "RPCエンドポイント"
  );

  const contract = new ethers.Contract(
    "所持確認したいNFTのコントラクトアドレス",
    "ABI",
    provider
  );

  //そのNFTの全tokenId
  const tokenIds = [1, 2, 3];

  const owners: { [key: string]: boolean } = {};

  await Promise.all(
    tokenIds.map(async (tokenId) => {
      const owner = await contract.ownerOf(tokenId);
      owners[owner] = true;
    })
  );

  if (owners["ユーザーのウォレットアドレス"] === true) {
    console.log("持ってる！");
  } else {
    console.log("持ってない！");
  }
};
```

## そこで便利なのが～～～NFT APIです！
* [TIUS](https://tius.dev) など

TIUSなどのNFT APIを使えば、
コントラクトアドレスからowner一覧を取得、ウォレットアドレスから所持しているNFT一覧取得など自由自在にできます。
TIUSは無料で使えます。

## TIUSを使ったNFTの所持判定
```typescript
import { createClient } from "@urql/core";
import fetch from "cross-fetch";
import {
  FindByContractAddressDocument,
  FindByContractAddressQuery,
  FindByContractAddressQueryVariables,
} from "./generated/graphql";

const client = createClient({
  url: "TIUSのエンドポイント",
  fetch,
  requestPolicy: "network-only",
  fetchOptions: () => {
    return { headers: { "X-API-KEY": "TIUSのAPIキー" } };
  },
});

const checkIfHaving = async () => {
      //この一回のリクエストだけで全tokenIdの情報取得！
  const results = await client
    .query<FindByContractAddressQuery, FindByContractAddressQueryVariables>(
      FindByContractAddressDocument,
      { contractAddress: "所持確認したいNFTのコントラクトアドレス" }
    )
    .toPromise();

  const owners: { [key: string]: boolean } = {};

  results.data?.erc721ByContractAddress.tokens.forEach((token) => {
    owners[token.ownerAddress] = true;
  });
  if (owners["ユーザーのウォレットアドレス"] === true) {
    console.log("持ってる！");
  } else {
    console.log("持ってない！");
  }
};
```
・TIUSを使った場合はこんな風に一回のリクエストだけで特定のNFTの所有全一覧を取得して判定することができます。
・詳しくは[こちら](https://docs.tius.dev/docs/intro)

# no plan株式会社について
- no plan株式会社は、ブロックチェーン技術、Webサイト開発、ネイティブアプリ開発、チーム育成、などWebサービス全般の開発から運用や教育、支援などを行っています。よくわからない、ふわふわしたノープラン状態でも大丈夫！ご一緒にプランを立てていきましょう！
- [no plan株式会社について](https://noplan-inc.com)
- [no plan株式会社 | ブロックチェーン実績](https://noplan-inc.com/blockchain)
- [no plan株式会社 | ブログ一覧](https://noplan-inc.com/blog)
Ruby on RailsでDeviseを導入する手順

# 概要
Ruby on RailsでDeviseを導入したので、その手順をメモします。

# 手順
・gemfileに追記
`gem 'devise'　`

・`bundle install`　
rails sで再起動すること

・`rails g devise:install`
→設定関連に使用するファイルを自動で生成

・`rails g devise user`
→routes.rbに  devise_for :users　が自動追加される、db/migrateも生成

・`rails db:migrate`
rails sで再起動すること

・`rails g devise:views`


# 備忘録
・以下の項目に関しては、モデルで新たにバリデーションを実装する必要はない（Deviseにデフォルトでバリデーションが備わっているため）。しかし、単体テストコードを書き、バリデーションが働いているかの検証は必要。
　・メールアドレスが必須であること。
　・メールアドレスが一意性であること。
　・メールアドレスは、@を含む必要があること。
　・パスワードが必須であること。
　・パスワードは、6文字以上での入力が必須であること。
　・パスワードとパスワード（確認）は、値の一致が必須であること。
　・Deviseによるカスタムコントローラの生成は不要（rails g devise:controllersのコマンドは、必須機能実装においては入力不要）。

・選択肢を設けるものはActive Hashを利用するとよい
・ユーザープロフィールは、ActiveStorageとimagemagickを利用する
　・アソシエーションを記述（has_one_attached :image）
　・ストロングパラメーターにimageを忘れずに
　・image_tagを利用して表示
・ユーザーページ(show)が必要になるのでusers controllerも作成（index, newの為だけだったら不要）

・ URL直うち禁止・ログアウトユーザーのアクセスはログイン画面へ・ユーザー本人以外は編集ボタン非表示 はそれぞれ以下を追記しておけばOK


```users_controller.rb
class UsersController < ApplicationController

 before_action :authenticate_user!, except: [:show]
 before_action :set_user, only: [:show, :edit, :update, :destroy]
 before_action :prevent_url, only: [:edit, :destroy]
```
Power Automateのフローの所有者を変更する

Power Apps、Power Automateの管理で気になる、所有者権限について調べました。

Power AppsのアプリはPowerShellのコマンドで所有者権限をはく奪して、他の人を所有者にすることができます。
では、Power Automateの所有者は変更できるのでしょうか。

結論、一部できます。
詳しく説明していきます。

# キーワードはソリューション
Power Automateのフローを作る際、ソリューションの外から作る場合と中から作る場合があるかと思います。
所有者権限を変えられるのは、**ソリューションの中から作ったときだけ**になります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/26ea3726-77a8-92a7-9b46-9ba573b8c9f8.png)


# 所有者の変更方法
WebAPIを使用する方法やPowreShellコマンドでもできるのですが、今回は一番簡単な方法をご紹介します。
対象のフローの詳細画面を開きます。
この画面でこのフローに関する情報、所有者が「Shiori Kuramoto」で、ソリューション「質問ナレッジ管理」に含まれていることがわかります。
詳細セクションの右上の[編集]を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/feb98b4d-1437-7dda-039c-b1f86205620c.png)

右のメニューから所有者の設定ができるようになっています。
名前の横の×を押します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/d300dd69-bda1-254e-bbff-3ca1cabd0d5e.png" width=30%>

変えたい所有者を入力して保存します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/8e21fbf8-d77f-99b5-1e77-0cb424cd2b12.png" width=30%>
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ff761d9a-5d71-792d-b3e9-3057ff76302e.png" width=30%>

ポップアップが出てくるのでここで[所有者の変更]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/ae7a6789-fd9f-bf20-cf08-fe42571d01d7.png)

右のメニューの上側に「所有者を変更しました」の通知が表示されます。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f2bb5109-78de-e81c-c2be-3655241403f9.png" width=30%>

所有者が変更されましたが、右の所有者セクションで見ると元のユーザーが残っています。
その為、所有者セクションの[編集]からもう一度削除してください。（最初からこちらで設定するともともとの所有者を変更できなくなるので、この順番でやっていただくのがいいかと思います。）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/b4391140-11d2-76ff-1643-bc878469b4bf.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/deb87ff6-ceda-cc5b-8c63-0af9fa5c4ef6.png)

無事に変更できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/f41e2812-05f6-6a92-1d35-bd3dd526cb94.png)


# ちなみにソリューションの外からフローを作った場合
ちなみにソリューションの外から作ったフローの場合、
所有者のところに「非ソリューションフローのため、変更できない」旨が書かれています。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2883014/0fdba0cb-9f99-b1bf-c5b1-463146a36ec7.png" width=50%>

# 一度ソリューションの中から作成し、ソリューションから削除した場合
この場合は最初にソリューションから作っているので、所有者を変更できます。


# まとめ
Power Automateの所有者権限を変更する方法を記述しました。
今回は新規でフローを作る場合を考えましたが、もし、もうすでにソリューションの外からフローを作ってしまって、そのフローについて所有者を変更したい場合は以下の記事を参考にしてください。変更はやはりできないのですが、代わりの方法が書いてあります。


https://qiita.com/kumukai/items/ed7db592cee388e872e1
キーボードのキー入力をカスタマイズしてできるだけ楽をする

みなさんこんにちは yuni と申します！

今回はキーボードのキー入力をカスタマイズしてできるだけ楽をしていこうと思います。

## 必要な環境
* Windows
## 理想のキーボード

ほぼ毎日キーボードには触れるので、ちょっとでも使いづらい部分はだんだんと誇張されて次のキーボードを探してしまいたくなりますよね。

そんな日々とは別れ、理想のキーボードを作り上げるためにも、まずは今までの不満点を挙げていきます。

### 不満点① : 矢印キーの位置が遠い
プログラミングをする際にも矢印キーはよく使うものなのですが、その位置が扱いにくいと日頃感じていました。

ホームポジションにある指を一度右下までもっていき、もう一度ホームポジションに戻すときに指の位置がずれていてミスタッチという流れが頻発していました。

慣れの問題という一面もあると思いますが、ここで「ホームポジションに指を置いたまま矢印キーを使えたら楽だろうな。自由にカスタマイズしたい」という欲求が目覚めてしまいます。

### 不満点② : ショートカットキーが押しずらい
[ Shift + Alt + , ] : タブ移動
[ Win + Alt + Tab ] : ウィンドウ切り替え（右）
[ Win + Alt + Shift + Tab ] : ウィンドウ切り替え（左）

このように修飾キーをたくさん使うショートカットは、覚えにくい・押しにくいの二重苦でした。

ソフト側でショートカットキーの割り当てを変えられるものも多くあるのですが、変えた先のショートカットキーが別のショートカットとかぶってしまう事があるためできるだけ編集しない方が楽だと思います。

ソフト側のショートカットの競合は無視して、自分が使いたいと思ったものだけ、簡単に押せるところに配置したいところです。

### 不満点③ : マウスとキーボードの反復移動を減らしたい
GUI 操作ではマウス操作とキーボード操作を反復して行う場面も多々あります。

できるだけキーボードだけで済ませたい私は tabキーと矢印キーによる移動でできるだけマウスを使わないようにがんばるのですが、割とすぐに限界が来ます。

「ああ、ここはtabで移動できないんだ」という微小なストレスを避けるためにも、何かいい策を見つけたいところです。

しかしここまでくると、素直に手を反復させるか、トラックパットを用意した方が早いと思います。

## 発見した解決策

[AutoHotKey](https://www.autohotkey.com/) がすべてを解決してくれました。

こちらのソフトは Windows 限定ですが、無料でかなり高度なキーボードのカスタマイズができるものです。

.ahk 形式のファイルを作成して AutoHotKey.exe を起動させることでキー入力の上書きをしてくれます。

### 単純な入れ替え

「入力A」を「入力B」に置き換える構文です。


```置換
; a を b に置換
a::b

; a と b の同時押しを c に置換
a & b::c

; Control + j を Left に置換
^j::Left

; a を Control + a に置換
a::Send,^{a}
```

置換前のキーと置換後のキーを"::"でつなぐことで動作しています。修飾キーとの同時押しは「対応する記号 + 使いたいキー」で表現します。記号の対応は下のリストに載っている通りです。

* \# : Windows
* ! : Alt
* ^ : Control
* \+ : Shift

逆に修飾キーとの組み合わせを出力したいときは、"Send,"の後に続けて、修飾キー以外を "{}" の内側に記述します。
また、"Send,"以降に{Blind}と入れることで、キーの同時押しに対応させることもできます。逆にこの記述がないと修飾キーも無効になるので注意です。

### コメントをつける
すでに使っていましたが、.ahk ファイル内では";"の後ろの文字をコメント化することができます。

```コメントの追加
; ここにコメント！
```

### キーの無効化
CapsLock や Numlock を封印したい時には、キー入力を Return に変換します。

```キー入力の無効化
CapsLock::Return
```
これで Capslock が無効化されます。
ちなみに、改行キーは Return ではなく Enter で表現されています。

## 自分で試してみた例

上で上げた不満点をすべて解決できる .ahk ファイルは以下のようなものになりました。

```
;カーソル
;無変換キー + ijkl -> カーソルキー
vk1D & h::Send,{Blind}{Left}
vk1D & l::Send,{Blind}{Right}
vk1D & k::Send,{Blind}{Up}
vk1D & j::Send,{Blind}{Down}

;共通
;リネーム
vk1D & r::Send,{Blind}{F2}
;デリート & バックスペース
vk1D & d::Send,{Blind}{Del}
vk1D & b::Send,{Blind}{BS}
;エンター
vk1D & f::Send,{Blind}{Enter}

;メディア再生一時停止
vk1D & m::Media_Play_Pause

;ウィンドウ切り替え
vk1D & x::Send,{Blind}#!{Tab}
vk1D & z::Send,{Blind}#!+{Tab}
;タブ切り替え
vk1D & z::Send,{Blind}^{Tab}
vk1D & z::Send,{Blind}+^{Tab}
;戻る/進む
vk1D & c::Send,{Blind}!{Left}
vk1D & v::Send,{Blind}!{Right}

;マウス操作
;左クリック
vk1C & ,::MouseClick, Left,,,,,D
;右クリック
vk1C & .::MouseClick,　Right
;カーソル移動
vk1C & j::MouseMove -10, 0, 0, R
return
vk1C & l::MouseMove 10, 0, 0, R
return
vk1C & i::MouseMove 0, -10, 0, R
return
vk1C & k::MouseMove 0, 10, 0, R
return
```

vk1D は無変換キー、vk1Cは変換キーです。ちょうど親指の位置にあるので他のキーとの同時押しやすいです。

簡単にセットアップできて、ほかのコードのコピペもしやすいということで、カスタマイズは楽に進められました。

指を動かすことが面倒な方は、ぜひ試してみてください！


## 参考にした記事
https://netwiz.jp/autohotkey/
https://fuchiaz.com/usage-autohotkey/#i-6
http://ahkwiki.net/KeyList
https://www.autohotkey.com/docs/Tutorial.htm
setViewportOfが微妙すぎる件から考える、Elmとの向き合いかた

※これはElm中級者向けの小ネタ記事です

# `setViewportOf`が動かない(嗚咽)

先日、Elmで書かれたアプリケーションで、押すとスクロールするはずのボタンが動かないというバグに遭遇しました。コンソールには何のエラーメッセージも出てません。周辺のコードも特に変更されていません。他の人から引き継いだコードなので、いつから混入したのかもわかりません。ブラウザの仕様変更も疑ったのですが、とくに思い当たることはありません。関連しそうなGitHubのIssueなんかも見つかりません。

なかなか原因特定に戸惑って、Elmのコアライブラリの中身まで調べてようやく原因がわかりました。**Elmの`setViewportOf`とCSSの`scroll-behavior: smooth;`を併用したときに起こるバグ**でした。デザイナーの人があとからCSSだけを更新したときに入ったようです。

`setViewportOf`は次のような実装になっています。

```js
var _Browser_setViewportOf = F3(function(id, x, y)
{
	return _Browser_withNode(id, function(node)
	{
		node.scrollLeft = x;
		node.scrollTop = y;
		return __Utils_Tuple0;
	});
});
 ```

https://github.com/elm/browser/blob/master/src/Elm/Kernel/Browser.js#L392

常に`node.scrollLeft`と`node.scrollTop`の両方を同時に設定していることがわかります。これは、`scroll-behavior: smooth;`が設定されていなければ問題なく動くのですが、`scroll-behavior: smooth;`が設定されると、


1. `node.scrollLeft = x;`が実行され、滑らかスクロールアニメーションがスケジュールされる
1. でも、アニメーションなのでスクロールまだ動かない
1. その直後、`node.scrollTop = y;`が実行され、次の新たなアニメーションがスケジュールされる。このとき、直前に1でスケジュールされたアニメーションが、まだまったく進まないままキャンセルされて上書きされてしまう

というわけです[^ff]。

[^ff]: ちなみに、ここでChromeとFirefoxで振る舞いが微妙に異なっていました。Chromeではまったく動かないのに、Firefoxだと`node.scrollLeft = y;`にブレイクポイントを仕掛けてステップ実行すると、`node.scrollLeft = x;`だけが適用されてブラウザに制御が戻るらしくスクロールが動きます。


そして、Elmのコアライブラリには`scrollLeft`のみを設定する関数は存在しません。**Elmではこういう場合は基本的にElm単体では解決できず、JavaScriptを書いてそれをポートから呼び出すしかありません**。今回私は`setScrollLeft`というポートを作ってそれを呼び出すことで対応しました[^sm]。

[^sm]: まあ、スクロールがスムースかどうかという演出だけなので、プロジェクトによっては`scroll-behavior: smooth;`のほうを切るという手もありましたが、ぬるっと動くのがデザイナーの希望ならそれを叶えるしかありません。


# 謎のslideViewportOf関数

ところで、この問題自体は認識されているようで、実はこの問題の解決策の案？がすでに検討されていることに気付きました。**Elmのコアライブラリのソースコードにはこのスムーススクロールの問題を解決するための関数 `slideViewportOf`が存在しているのですが、コメントアウトされています**（中身は`Debug.todo`ですが）。

https://github.com/elm/browser/blob/master/src/Browser/Dom.elm#L317

たしかに、このスムーススクロールの問題を解決するためだけに関数を増やすというのは、あまりに姑息な対応に思えます。Elmはシンプルさが売りなのに、そんなその場しのぎの関数ばかり追加していたらシンプルさが台無しになってしまいます。

もしブラウザの細かい挙動まで細かく制御できるAPIを用意するなら、それは須らくブラウザ本来のAPIの混乱を受け継ぐことになります。しかしElmは、歴史的経緯でグチャグチャになりつづけているブラウザの膨大でAPIを追いかけるのはやめ、よりシンプルで洗練された、Elmにとって使いやすく安全で安定したAPIを用意する道を選びました。slideViewportOf関数を入れないのも、そうした姿勢の現れだと思われます[^ts]。

[^ts]: TypeScriptはブラウザAPIの混沌を受け入れ、それを手懐けるための超複雑な型システムを導入し、とてつもない労力をかけて信じられないほど膨大な型注釈ライブラリを揃えることで成功した言語ですね。DartやPureScriptなどの言語は、ブラウザのAPIを簡単にラップできるFFIによって安全性と自由、使いやすさを両立させています。

# Elmとどう向き合うべきか

Elmでブラウザの細かい動作まで制御するには、結局のところポートを使うしかありません。逆にいえば、ポートを避けるにはポートが必要ないようなアーキテクチャを選択したり、ただのHTMLの描画を超えるような特殊な機能を意図的に省く必要が出てきます。筆者の経験上は、現実のウェブサービス開発ではどうしても様々な思惑や都合からElmのみでは対応しきれない要求が数多く生まれ、少なくない量のJavaScriptを書くとともに多数のポートを追加するはめになることが多いです。これには、「**ポートを書けば解決できるんだからそれでいいじゃないか、何か問題が？**」と捉える人と、「**ポートを使いまくったらElmの良さが半減するじゃないか……**」と捉える人の二通りがいるんじゃないかと思います。

Elmは以前は破壊的変更を頻繁に繰り返していましたが、現在は極めて安定した状態にあります。開発が中止したわけではないとのことですが、言語やコアライブラリの仕様は**ほぼ凍結**されたと言えるかも知れません。言語のバージョンアップに追われるだとか、先行きが不透明で不安だということはない一方で、このあたりのポートで解決しないといけない面倒な部分はまだ解決の目処が立たないというか、もはや諦めるしかないという感じです。個人的には、Elmを採用するかどうかの分かれ目は、ポートをどれだけ使うか、ポートの多用をどれだけ受け入れるかにあると思っています。
ChatGPTを使ってAIにプログラムを書かせる

AIでプログラムを書けることが話題になっていた、chatGPTを使ったプログラムの自動生成を試したメモです。
https://chat.openai.com/chat

■入力文章
```
重力を考慮した、ボールが飛び跳ねるprocessingのプログラムは？
```

ChatGPTの回答プログラムが途中で途切れてしまいますが、
回答の最後の一文字を入力すると、続きを表示することが可能です。

出力結果のうち62行目の文頭の
List
を
ArrayList
に変更しています。

■出力結果
```java:chatGPT.pde
// 重力を表す変数を定義します
float gravity = 0.1;

// ボールを表すクラスを作成します
class Ball {
  // ボールの位置を表す変数を定義します
  float x;
  float y;

  // ボールの速度を表す変数を定義します
  float vx;
  float vy;

  // ボールの半径を表す変数を定義します
  float r;

  // コンストラクタを定義します
  Ball(float x, float y, float vx, float vy, float r) {
    this.x = x;
    this.y = y;
    this.vx = vx;
    this.vy = vy;
    this.r = r;
  }

  // ボールを描画するメソッドを定義します
  void draw() {
    // ボールを描画します
    ellipse(x, y, r * 2, r * 2);
  }

  // ボールを動かすメソッドを定義します
  void move() {
    // 重力の影響を受けるよう、速度に重力を加算します
    vy += gravity;

    // 速度に応じて位置を更新します
    x += vx;
    y += vy;

    // 画面からはみ出ないように、画面内での反射処理を行います
    if (x < r) {
      x = r;
      vx *= -1;
    }
    if (x > width - r) {
      x = width - r;
      vx *= -1;
    }
    if (y < r) {
      y = r;
      vy *= -1;
    }
    if (y > height - r) {
      y = height - r;
      vy *= -1;
    }
  }
}

// ボールを格納するリストを定義します
ArrayList<Ball> balls = new ArrayList<Ball>();

void setup() {
  // 画面の設定を行います
  size(640, 480);
  background(0);

  // ボールを追加します
  balls.add(new Ball(100, 100, 2, -5, 10));
  balls.add(new Ball(200, 200, 3, -4, 15));
  balls.add(new Ball(300, 300, 1, -3, 20));
}

void draw() {
  // 背景を再描画します
  background(0);

  // ボールを描画します
  for (Ball ball : balls) {
    ball.draw();
  }

  // ボールを動かします
  for (Ball ball : balls) {
    ball.move();
  }
}
```

しっかり動きます。
確かに、こりゃすごい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/510257/074847cc-138c-66d0-9ced-5b2e349d4e3e.png)
初学者が仮想環境を理解する

今回は雑談的なゆるい内容で書いていく。

ちょうど一年前の今頃、Javascriptの基礎を終え次に何をやろうか考えてた頃。
仕事を得るのにポートフォリオは必須だろうと思いwebアプリの制作に取り掛かった。

早速ドットインストールでPHPの基礎からお勉強。そこで推奨されたのがdockerを使った環境構築。

Javascriptはブラウザですぐ使えるし、pythonは（色々やり方はあるけど）公式からインストールして即利用可能。でもPHPってそんなに準備が必要なのって感じた。

この頃はまだ環境構築という概念すら分かってなかった私にはdockerなど理解できるはずもなく・・

色々理由があるが２ヶ月で挫折。その後しばらくプログラミングから離れてました。

（後にpythonで復活するのだが、あまりの使いやすさに感動）

もちろんdockerだけが挫折の理由ではないが、ここを理解できなかったのはデカかったと思う。

以下、私がどのように仮想環境と向き合い、どうやってこんな記事👇を書けるくらいに成長したのかをメモしていきたいと思う。

https://qiita.com/sasao-genmaicha/items/369f76d9c60f728c745b





まず理解できなかった理由を探る。
このモヤモヤした気持ちを深掘りするとまず最初に感じること。

### 仮想環境、実態がねぇ！

これに尽きる。
パソコンの中にもう一つのパソコン？マトリョーシカかよ

![スクリーンショット 2022-12-07 10.49.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2980135/d292856f-8639-8fb6-89a1-9fa926dfe081.png)

しかも設定をするのにコマンド操作ってのも地味にくる・・

私「コマンド入力（キーボードカタカタ）エンターぽち」
パソコン「仮想環境が作成されました」
私「アクティベートぽち」
パソコン「仮想環境が実行されました」
私「はぁ・・」

### で？

って感じでした。去年の今頃。

私の想像力ではこのマトリョーシカは理解できません。でもねパソコンさん、物質世界にどっぷり浸かって生きてるこの愚民にはヴァーチャルってのはSFのおとぎ話なのよ。

さらにこのモヤモヤした気持ちを擁護するかのように感じたこと。

### 仮想環境無くても動くじゃん・・

必要性がいまいち感じられなかった要因。
結局初学者はここにハマるんですよね。（それか私だけ？汗）

今思えばとんでもない罠だったんですが、この時の自分は後のエラー祭りの惨状を知る由もなかった。


しかしその後どうやって私が仮想環境を理解し使いこなすようになったかを振り返ってみる。

## エラーは偉大な先生。

PHPのあとpythonに乗り換えたが充実したフレームワークに感動。何よりStreamlitなどで簡単にアプリが作れる。
（Laravelがあるじゃんと言われるがよく知らん）
なのでまたアプリ制作に向き合おうと思ってみた。

しかし案の定、何かしらエラーは発生する。
本当にこれと向き合う時間って辛いんです。

解決するのに色々調べたり試したり、その繰り返し。具体的な内容は前の記事にも書いたけど大体はデータベースとデプロイの時。

しかし試行錯誤の末、解決できた時の喜びって何事にも変え難い。

その助けとなってくれたのがanacondaとvirtualenv。


その瞬間に全てのエラーの原因と結果と対処法が知識となり私の頭に定着する。

#### 腑に落ちる

この言葉を本当の意味で理解しました。

実態がないから手に取る感覚がない。実際にそうなんですが、苦悩しもがいた挙句に勝ち取る成功体験って強烈に脳に作用するというか・・


エラーの後には実際に手を動かし１からちゃんと仮想環境を立ち上げてみる。
今は調べればいろんな教材が無料で見れるので助かる。

こちらのサイト👇が非常にわかりやすかった。

https://hombre-nuevo.com/python/anaconda0002/


いつもお世話になってます。はたやす先生の動画。
こちらはtodoアプリの動画ですがvirtualennvの立ち上げ方も解説してます。実際この動画のやり方で難なくFlaskの基本は学べた。

https://www.youtube.com/watch?v=jP7p2okKdJA



結局dockerではなくanacondaを使ってるが、別にこの選択肢でも良かったと思う。
多分今ならdockerも導入できると思うがanacondaに謎の愛着も湧いてるしvirtualenvもなんだかんだ使いやすい。

自分なりに、自分が納得できればよしとする。




かなり時間はかかったがこの一年で仮想環境を理解しアプリを公開したのは大きな進歩だと感じる。

自分から動かないと現実は変わらないよ。昔は受動的だったから挫折したのかな、と振り返ってみる。



この調子で着実に進み、目標にさらに一歩近づきたいと思う。
processingで簡単なアート作品を作ってみた

# はじめに
「最近印象に残ったことって何だろう？」と考えたときに、パッと思い浮かんだことは先日東京で体験したteamLab Planetsのアート作品でした。「デジタル技術でこんなアート作品ができるんだ！」ととても感動しました。ということで今回は、前から気になっていたprocessingというものでデジタルアートを作ってみたいと思います。
# processingとは
processingとはJava をベースにしたプログラミング言語です。プログラミング初心者でも容易に習得可能な言語となるよう開発され、グラフィックや音を使ったプログラミングが手軽に作成できます。イラストやアニメーション、画像処理など幅広いアート作品を作ることができます。
# 実際に作ってみた
私は今回が初めてなので、今回は簡単なプログラムを作ってみました。
![スクリーンショット 2022-12-07 194712.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982408/8ae2e6b5-4112-bfd5-76f0-c1a3400cd062.png)
![スクリーンショット 2022-12-07 201343.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982408/2a5f9fa2-a489-ced2-bd24-ced5eba896ed.png)
for文を使って円を縦方向と横方向に繰り返し表示させました。
![スクリーンショット 2022-12-07 195606.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982408/fe8bfb5e-2887-09ff-42b9-a57a67c365bb.png)
![スクリーンショット 2022-12-07 195639　プログラム.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2982408/e5f1ab2c-d931-6bc0-f8ac-b2ddd0942fe8.png)
調べていてrandom()が気になったので、random()を使って円と色を表示させてみました。とても短い文で先ほどとは全く印象が違うイラストができました。
# 使ってみて
processingのインストールからイラスト作成まで、とても手軽にできました。ネットを見ているとこんな手軽だと思えないほど完成度の高い作品がいくつもあったので、もっと練習して作品の幅を広げていきたいです。
皆さんもぜひ、体験してみてください。
リゾルバーがLambdaのAppSync（Mutation編）

# 概要
この記事では、リゾルバーにLambdaを設定したAppSyncのMutationパターンを紹介します。

# 前提
- DynamoDBにテーブルが用意されていること
- AppSyncのスキーマを作成済みであること

# Lambda
まず、AppSyncに紐づけるLambdaを作成します。
ここでは、DynamoDBのデータを更新するコードを使用します。

※ 本来、DynamoDBのデータを更新するだけであれば、マッピングテンプレートで完結します。
　 詳しくは、[こちら](https://qiita.com/inoue-mn/private/6532c55c715f8024a2b4)を参照ください。

```python
import boto3
from boto3.dynamodb.conditions import Key, Attr

def lambda_handler(event, context):
    id = event['input']['id']
    favorite = event['input']['favorite']
    
    dynamodb = boto3.resource('dynamodb')
    table = dynamodb.Table('Radio')
    response = table.update_item(
        Key={
          'id': id
        },
        UpdateExpression='SET favorite = :val1',
        ExpressionAttributeValues={
        ':val1': bool(favorite)
        }
    )
    
    return {"id": id, "favorite": favorite}
```

# AppSync
## データソース
AppSyncのコンソールから``データソース``を選択し、作成したLambdaを設定します。

作成後、``タイプ``が``AWS_LAMBDA``になっていることを確認してください。

## スキーマ
ここでは、[アドベントカレンダー](https://qiita.com/advent-calendar/2022/inoue-mn)の1日目から5日目で作成したものと同様のスキーマを使用します。

## リゾルバー
リゾルバーは、
データソースに先ほど作成したLambdaのデータソースを選択し、
- Enable request mapping template
- Enable response mapping template

を、それぞれONにし、出力されたものを使用することで実現可能です。

### リクエストマッピングテンプレート
```
{
  "version" : "2017-02-28",
  "operation": "Invoke",
  "payload": $util.toJson($context.args)
}
```

### レスポンスマッピングテンプレート
```
$util.toJson($context.result)
```

# 実行
AppSyncでクエリを実行し正しい値が返ってくることを確認します。
![7-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318120/a2609f56-925e-a2fc-4472-7db0df400cba.png)

DBの値も確認します。
![7-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2318120/9e2ce9d2-343f-af85-d61f-6ef77c86e9e0.png)

正しく動くことを確認できました。
AWS 認定ソリューションアーキテクト – アソシエイト（SAA-C03）合格体験記

2022年12月に、AWS 認定ソリューションアーキテクト – アソシエイト（SAA-C03）に合格したので合格体験記を書きます！

# 受験しようと思ったきっかけ
半年前に、AWSを使った新規システム開発のプロジェクトに配属され、AWSの環境構築からやることになったのですが、
AZって何？
VPCって何？
CloudFormationって何？
DBってどうやって作るの？
S3にあげたWebアプリってどうやってブラウザから見れるようにするの？
・・・と、わからないことだらけだったため、まずは基礎知識を勉強して理解したうえでAWSを使いたい、と思ったことがきっかけで勉強し始めました。




# これまでのAWS実務経験
エンジニア歴は3年、AWS歴は1年です。
個人でもAWSを触ったことはなく、1年前に別のプロジェクトで初めてAWSを触りました。
そのプロジェクトではすでにAWS環境が整っていて、CodeCommitにソースコードを上げるだけで自動的にデプロイされるようになっていたので、AWSの各サービスを自分でいじったりすることはほとんどなく、各サービスの概要だけぼんやり理解している状態でした。

そして半年前に冒頭で述べたプロジェクトに入り、実際にAWS環境の構築をすることになりました。
実際に各サービスを触って試行錯誤したため、それまでぼんやりしていた理解がしっかりしてきました。

これらの実務経験から、以下のサービスについては、実際に触ってみて概要を理解した上で試験に臨むことができました。
* EC2
* VPC
* Aurora
* DynamoDB
* S3
* CloudFront
* Lambda
* APIGateway
* SQS
* SNS
* CloudFormation
* CloudWatch
* CodePipeline
* CodeCommit
* CodeBuild


# 試験申し込み
受験しようと思い立ったのは6月頃だったのですが、なかなか行動に移せず、実際に申し込んだのは11月でした。。。
「12月15日までに受ければ再受験無料キャンペーン」があると聞き、1回目は様子見、2回目での合格を狙おうと思ったら期間の猶予ができたので、軽い気持ちで申し込みました。


# 勉強方法
私は紙の本で勉強したいタイプなので、とりあえず参考書を買いました。
受験しようと思い立ったのが6月頃だったので、当時のバージョンC02の参考書を買いました。
[AWS認定資格試験テキスト AWS認定ソリューションアーキテクト - アソシエイト 改訂第2版](https://amzn.asia/d/4lFVFQx)

机に向かってしっかり勉強しよう！と思うとなかなか勉強する気になれないので、勉強するときは
 **「「毎日参考書を1行以上読む」を8割以上実行する」** をモットーにしています。
1行でも良いんだと思えば、スキマ時間に寝転がりながらでもすぐに読めますし、「毎日必ずやる」ではないので、たまに勉強できなかった日があっても落ち込むことなく、また翌日から勉強を続けることができるのでおすすめです！

そんな感じでのんびりと勉強を進め、半年でやっと参考書を1周読み終わりました。
わからないところは都度調べつつ読み進めたので、理解が深まりましたし、知らなかったサービスを知ることもできました。

試験直前になって、「C03はC02より難易度が上がっている」という噂を聞いたのですが、
そんなに大きく変わらないだろう！再受験も無料だし！と楽観的な気持ちで、特にC03のための追加の対策はしませんでした。


# 試験の感想
噂の通り、やはりC02の参考書に載っていた問題よりも難しく感じました。
参考書に載っていた問題では、質問文に適したサービス名を選択する問題や、特定のサービスの特徴を選択する問題が多かったのですが、C03の試験では、選択肢の文章が複数サービスの組み合わせになっている問題が多かったです。

具体的には、「〜のような条件を満たしたいとき、どのように実現すればよいか？」という質問文に対して、
選択肢が「Aのサービスを〜のように設定して、Bのサービスに連携する」といった感じで、選択肢の文章が長く、読むのも理解するのも大変でした。。。

あまり手応えはなかったのですが、参考書をしっかり読んで各サービスの概要をおさえていたからか、誇れる点数ではないですが一発で合格することができました！

もっと余裕を持って合格するには、各サービスの概要を勉強するだけでなく、実際に自分で触ったりして、複数サービスを組み合わせた実践的な使い方を理解することが必要だなと感じました。

個人的に、もっと勉強しておけばよかったなと思うサービスを以下に列挙しておきます。
* EC2
* ELB
* S3
* WAF
* SQS


# おわりに
資格勉強を始める前と比べると、AWSの中心的なサービスへの理解が深まり、実際にシステムを構築するにはこうしたらよさそうだな〜というイメージがしやすくなったので、勉強してよかったです。

資格取得はスキルアップへの近道であってゴールではないので、今回得た知識をしっかり実務に活かしていきたいと思います！
Salaseforce　拡張ドメイン適応とは？

# 拡張ドメインとは
簡単に言うと、SalesforceのURLが変わりますよということ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/bcc3e74f-329c-1821-3458-d93a2d7bbd3d.png)
（Salesforce Helpページより）
ほとんどのページのURLはそのままですが、特に**エクスペリエンスサイト関係のURLが大幅に変わります**

# 拡張ドメイン適応するとどんな影響があるのか
Salesforceを使ってコミュニティーサイトなどを作成している場合、
サイトのURLが変わってしまうということです
サイトをブックマークしている場合、そのブックマークは使えなくなりますし、
サイト内に、ほかのページへ遷移するためのURLを仕込んでいる場合、それも機能しなくなってしまいます。

# いつ頃適応になるのか
Salesforceでは2023年2月ごろに、拡張ドメインの適応がされます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/f6d7c8a1-ae9c-6d36-bc2c-f90a28609101.png)
一方でこのようなお知らせも来ていたので、実際いつ拡張ドメインが適応されてしまうのかはわからない
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/8584d08a-d960-5a91-271b-b88d02f0c5a5.png)

まあとにかく、早くて23年の2月、遅くとも24年の冬頃には拡張ドメインが適応になってしまうということなので、
早めに手を打った方がよさそうです。

# 解決方法は？
1. おとなしく拡張ドメインを適応して、すべてのURL変更に対応する
    - 上記影響範囲に対して、1つ1つURLを変更して対応する方法です
1. カスタムドメインを適応する
    - 拡張ドメインのように。Salesforce側から、「あなた方の新しいURLはこれですよ」と指定されたものではなく、<br>自分たちで好きに決めた（新しいドメインを自分たちで買って）ドメインを使用する方法です
    - URL変更に対応しなくてはならないという点は変わりませんが、
        - 自分たちで好きにドメインを決められる
        - 今後同じような変更が行われたときにいちいち対応しなくてもよい、
        - 万が一Salesforce組織を新しくするとなった時にも、同じドメインを使い続けられる
        というメリットがあります
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/19304022-b710-673f-3cf7-a1c39592322e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/acb4e991-451e-d4b2-da69-fe7635dd017f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/968569/b5ac45a3-a350-1ce0-e1c3-ad9968ddcd6d.png)
【Xcode】DerivedDataによるストレージ圧迫に気をつけろ！

# はじめに
MacBookのストレージがパンパンになっている原因がわかったので記録しておきます。

# 原因
![スクリーンショット 2022-12-07 19.47.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/5efbccdc-b5ff-07e8-40be-5fd09ef28a3a.png)

こいつでした。

自分のXcodeの設定だとプロジェクトごとにDerivedDataが作成されるようになっていました。

# 修正方法
### まず削除
いま作成されているDerivedDataを全て削除します。

### プロジェクトごとに作成されないようにする
① 「Xcode」を選択します。
② 「Settings...」を選択します。
![スクリーンショット 2022-12-07 19.52.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/1f238fe8-7d8b-1e76-c2cc-89c97d402609.png)
③ 「Locations」を選択します。
④ 「Derived Data」のピッカーが`Relative`であれば`Default`に変更します。
![スクリーンショット 2022-12-07 19.54.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/6c45e1e3-b0c7-1228-287f-b57c2c668593.png)

OK
![スクリーンショット 2022-12-07 19.57.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/36239b8b-d7b8-b207-925c-66e42bce9297.png)

# おわり
容量がかなり減った！！
DerivedDataは削除しても問題なさそうです。
プロジェクトごとに生成されていない場合でも定期的に削除するといいかもしれませんね
「たのしいRuby」オブジェクトと変数・定数

Rubyの本、買ってきた。たのしいRuby、勉強しながらtwitterに投稿した文を加筆訂正してQiitaに投稿する。「たのしいRuby」の続き。
Twitter、Green_helmet@bethlehem4099
Qiita、@dosaidon
## 参考文献
この記事は以下の情報を参考にして執筆しました。
-[たのしいRuby、高橋征義、後藤裕蔵著、 まつもとゆきひろ監修、SBクリエイティブ株式会社、第6版2019年](https://www.amazon.co.jp/%E3%81%9F%E3%81%AE%E3%81%97%E3%81%84Ruby-%E7%AC%AC6%E7%89%88-%E9%AB%98%E6%A9%8B-%E5%BE%81%E7%BE%A9-ebook/dp/B07PNN3TYF/ref=tmm_kin_swatch_0?_encoding=UTF8&qid=1671278506&sr=8-1)
-[『たのしいRuby 第6版』サポートページ、ソースコード](https://tanoshiiruby.github.io/6/index.html)


### オブジェクトとクラス
「クラスはオブジェクトの種類を表すものです。」うーん？
「クラスはメソッド（メンバ関数）と変数などをまとめたものです。」では？
例えば、


~~~Ruby:simple_class.rb
# simple_class.rb
class SimpleClass     #クラスSimpleClass始まり
    def initialize(a) #initializeメソッド、初期値aを与える。別名コンストラクタ
       @x = a         #変数@x、@で始まる変数はクラスの中なら自由に使える
    end               #initializeメソッド終わり

    def q             #qメソッドを定義する
        p @x          #変数@xを印刷する
    end               #qメソッド終わり
end                   #クラスSimpleClass終わり

y0=SimpleClass.new(10)#オブジェクト（インスタンス）y0を新しく作る
y0.q                  #オブジェクトy0のメソッドqを実行する
y1=SimpleClass.new(100.0)#オブジェクト（インスタンス）y1を新しく作る
y1.q                  #オブジェクトy1のメソッドqを実行する
y2=SimpleClass.new('猫が鳴く、にゃー')#オブジェクト（インスタンス）y2を新しく作る
y2.q                  #オブジェクトy2のメソッドqを実行する
~~~
自分の思うオブジェクト指向というのはこんなやつ。
クラスSimpleClassの中にメソッドinitializeとメソッドq、変数@xがまとまっている。 
そしてポリモーフィズム、整数も実数も文字列も同じクラスで処理できる。
あと、変数の隠蔽。変数@xはデフォルトでは外部から変更も取り出すことも出来ない。
~~~shell:command_line
~ % ruby simple_class.rb
10
100.0
"猫が鳴く、にゃー"
~~~ 
***オブジェクトとクラスの対応表***
|オブジェクト|クラス|
|:------:|:------:|
|数值|Numeric|
|文字列|String|
|配列|Array|
|ハッシュ|Hash|
|正規表現|Regexp|
|ファイル|File|
|シンボル|Symbol|

つぎ行こう。
***Green_helmet@bethlehem4099·7月10日***
### Rubyの変数
|名称|規則|
|:------:|:------:|
|ローカル変数| 先頭がアルファベットの小文字か「_」で始まる|
|グローバル変数| 先頭が「＄」で始まる|
|インスタンス変数|先頭が「＠」で始まる|
|クラス変数|先頭が「＠＠」で始まる|

＠はpythonのself. か？ ＠＠は何だろう？
***Green_helmet@bethlehem4099·7月10日***
### ローカル変数とグローバル変数
変数のスコープはい。
### 定数：先頭が大文字で始まる
Rubyist const.rb
>TEST=1
>TEST=2   # エラー

iPhone用のRubyの実行環境Rubyistではエラーにならないが？
~~~Ruby:➜  ruby const.rb
const.rb:2: warning: already initialized constant TEST
const.rb:1: warning: previous definition of TEST was here
~~~
MacのRubyだと警告だね
***Green_helmet@bethlehem4099·7月11日***
### つぎ予約語
~~~
__ENCODING__, __LINE__, __FILE__, BEGIN, END, alias, and, begin,
 break, case, class, def, defined?, do, else, elsif, end, ensure,
 false, for, if, in, module, next, nil, not, or, redo, rescue,
 retry, return, self, super, then, TRUE, undef, unless, until,
 when, while, yield
~~~
意外に少ない
***Green_helmet@bethlehem4099·7月11日***

### 多重代入

> \# multiple_substitution.rb
>a, b, c = 1, 2, 3
>puts a, b, c
>c, b, a = a, b, c
>puts a, b, c
~~~command_line:
➜  ruby multiple_substitution.rb
1
2
3
3
2
1
~~~
これは良いな
C言語だとマクロを組んでも難しいかも

いくつか飛ばしたが、これでオブジェクトと変数・定数はおしまい。どっとはらい。
***Green_helmet@bethlehem4099·7月11日***
cronの基本コマンド

### cronとは
多くのUNIX系OSで標準的に利用される常駐プログラム（デーモン）の一つ。
設定したスケジュールに従って指定されたプログラムを定期的に起動してくれる。

### コマンド

crontabファイルの内容を表示
```
$ crontab -l
```
crontabファイルを編集
```
$ crontab -e
```
（※viエディタが開くので編集）

crontabの書式
```
# 「分」「時」「日」「月」「曜日」「コマンド」を半角スペース区切りで書く
# 毎月1日、15日の3:30に/home/test01/test.shのシェルスクリプトを実行する場合
30 3 1,15 * * /home/test01/test.sh
```

ログの確認
```
$ less /var/log/cron
```
VC++インラインアセンブリとMASMとのリンク

# はじめに

https://learn.microsoft.com/ja-jp/cpp/assembler/inline/writing-functions-with-inline-assembly?view=msvc-170

を実際に動かしてみた。

# 環境
Windows 11 Pro (64bit)
Visual Studio Community 2022

# インラインアセンブリ

## ソースなど

```dev.bat
@echo off
path %path%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\bin\Hostx64\x86
set include=%include%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\include
set include=%include%;C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\ucrt
set lib=%lib%;D:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.34.31933\lib\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\ucrt\x86
set lib=%lib%;C:\Program Files (x86)\Windows Kits\10\Lib\10.0.19041.0\um\x86
cmd
```

```power2.cpp
/*
cl /Wall /FAscu power2.cpp
*/
#include <stdio.h>

int power2(int num, int power)
{
	__asm {
	mov	eax, num
	mov	ecx, power
	shl	eax, cl
	}
}

int main(void)
{
	printf("3 * 2^5 = %d\n", power2(3, 5));
}
```

## 実行例

```
D:\Projects\msvc>cl /Wall /FAscu power2.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.34.31935 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

power2.cpp
Microsoft (R) Incremental Linker Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:power2.exe
power2.obj

D:\Projects\msvc>power2
3 * 2^5 = 96

D:\Projects\msvc>
```

# MASMとのリンク

## ソースなど

```powera.asm
comment *
ml /c /Fl /Sa powera.asm
*
.model flat
.code
num$ = 8
power$ = 12
power2 proc c
	push	ebp
	mov	ebp, esp
	mov	eax, num$[ebp]
	mov	ecx, power$[ebp]
	shl	eax, cl
	pop	ebp
	ret
power2 endp
end
```

```powerc.cpp
/*
cl /Wall /FAscu powerc.cpp powera.obj
*/
#include <stdio.h>

extern "C" int power2(int, int);

int main(void)
{
	printf("3 * 2^4 = %d\n", power2(3, 4));
}
```

## 実行例

```
D:\Projects\msvc>ml /c /Fl /Sa powera.asm
Microsoft (R) Macro Assembler Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

 Assembling: powera.asm

D:\Projects\msvc>cl /Wall /FAscu powerc.cpp powera.obj
Microsoft(R) C/C++ Optimizing Compiler Version 19.34.31935 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

powerc.cpp
Microsoft (R) Incremental Linker Version 14.34.31935.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:powerc.exe
powerc.obj
powera.obj

D:\Projects\msvc>powerc
3 * 2^4 = 48

D:\Projects\msvc>
```