OmniAICreator/Qiita-1.07M huggingface dataset:
ChatGPTはプログラミング初学者の助けになるか？

# はじめに
エンジニアの前中です。
季節の変わり目で体調がイマイチなのに、花粉症でKO寸前です。
それはさておき、ChatGPTが話題になっています。
そしてエンジニアの間ではChatGPTにお題を出して、ソースコードを生成してもらうという、~~暴挙を試みる~~チャレンジをする人が続出しています。
まだまだ我々の仕事がなくなるレベルの回答は返ってこないようですが、油断できませんね。
そしてふと思ったのですが、プログラミングに挑戦したい人にとっては良いツールになるのでしょうか？
ということで、ちょっと試してみました。

## とりあえずお題を投げてみる
とりあえずChatGPTにお題を投げてみましょう。
プログラミングに挑戦といっても、やりたいこと（目標）があったほうが続けやすいので、それっぽいものをでっち上げます。
![スクリーンショット 2023-03-20 111715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/97ceb265-615f-644f-772c-8bbc3fb5828a.png)
別に十二国記でなくても良いのですが、小説の用語集というお題ですね。
生成された回答がこちら。
![スクリーンショット 2023-03-20 122542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/0780ff76-76ac-0094-5ef8-fdd1d4b59b85.png)
一気に表示されるわけではなく、誰かがタイピングしているのをリアルタイムで見ているような表示の仕方が良いですね。
しかし、インストールから案内してくれるとは親切です。
コードをコピーすることもできます。
初学者の先生として考えると良いですね。

そして、順調に出力されていくのですが……
![スクリーンショット 2023-03-20 122624.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/ed732f88-2052-a3ad-6adc-5f0a04e08653.png)
途中で止まってしまいました。
文字数の上限に引っ掛かってしまったようです。
これでは先生、尻切れトンボです。
ちゃんと最後まで教えてくれないのでしょうか？
続きを要求してみましょう。
![スクリーンショット 2023-03-20 123107.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/4fae7db9-dcd8-d96c-c737-f70e736c502b.png)
これでいけるかな？
![スクリーンショット 2023-03-20 123241.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/25e0960a-26b1-59f7-2ac0-191a86cdd723.png)
いけましたね。

## 感想
予想よりも親切な回答が返ってきました。
とりあえずひな形を作って、中身を確認して勉強する、そこから自分の好みに改変していくという使い方をする分には問題なさそうです。
初学者にとっても、最初の取っ掛かりでつまづくことは多いと思いますので、こうやって自分向けの手順を教えてくれるのはありがたいですね。
もっとも、内容的にはLaravelのチュートリアルに書かれているものと大差はありません。
それでも、自分が考えているものに沿った内容を返してくれるというのは非常に助かるんじゃないでしょうか。
下手な入門書を買うよりも、最初はこれで初めてわからないところを調べたり、さらにChatGPTに質問したりすれば効率的に学べそうです。
プログラミングを始めたい人にとっては、かなり使えるツールだと思います。
注意点としては、AIが間違った学習をしている可能性が常に付きまとうということです。
回答内容を実際に動かしてみたら動かなかった、なんてことも起こりえます。
頼りきるのはダメだと思いますが、簡単な内容については正解が返ってくるようですので、取っ掛かりには使えるでしょう。
専門知識を質問した場合は、結構な確率で間違いが入るという話も聞きますので、資格試験の勉強に使うのは危険です。

玄人向けの内容（お題に対してRDBとNoSQLのどちらが適しているかの考察など）については、少しずつ検証していきたいと思います。

## おまけ
「AIのべりすと」というサイトがあります。

https://ai-novel.com/index.php

ここは小説の書き出しを入力すると、続きをAIが書いてくれます。
反応はChatGPTよりもかなり重いです。
![スクリーンショット 2023-03-20 125022.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/13e1e8a7-2236-4b99-44ca-760d84864e4e.png)
こんな感じになろう系っぽいのを適当に書いて、「続きの文を書く」をクリックすると……
![スクリーンショット 2023-03-20 125115.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2656687/e80f1144-df4e-38ea-43de-98d56d542916.png)
続きを書いてくれます。
青字の部分がAIが生成してくれた文章ですね。
あんまり長くないですが続きの文をどんどん追加していけます。
……誰が使うんでしょうね？
個人的には面白いサービスだと思います。
……出来上がった小説が面白いかどうかは別ですが。
ではまた。
Cygwin で sudo

# 背景
cygwin shell で sudo が使いたい

# 結論

https://github.com/Chronial/cygwin-sudo

# 導入手順
```
> git clone https://github.com/Chronial/cygwin-sudo.git
> cd cygwin-sudo
> cp cygwin-sudo.py /usr/bin
```
# 結果
```
[warp# cygwin-sudo]$ alias
alias sudo='python3 /usr/bin/cygwin-sudo.py'

[warp# cygwin-sudo]$ ps -saf
    PID  TTY        STIME COMMAND
   1812 cons0    08:23:35 /usr/bin/ssh
   1917 pty6     12:46:02 /usr/bin/ps
   1801 cons0    08:23:35 /usr/bin/sh
   1839 pty6     12:32:48 /usr/bin/bash
   1838 ?        12:32:48 /usr/bin/mintty

[warp# cygwin-sudo]$ sudo ps -saf
    PID  TTY        STIME COMMAND
   1812 cons0    08:23:35 /usr/bin/ssh
   1573 ?          Mar 17 /usr/sbin/sshd
   1920 cons1    12:46:32 /usr/bin/python3.9
   1801 cons0    08:23:35 /usr/bin/sh
   1839 pty6     12:32:48 /usr/bin/bash
   1918 pty6     12:46:32 /usr/bin/python3.9
   1572 ?          Mar 17 /usr/bin/cygrunsrv
   1838 ?        12:32:48 /usr/bin/mintty
   1921 pty0     12:46:32 /usr/bin/ps
```

# shell 内では
```
sudo="python3 /usr/bin/cygwin-sudo.py"
$sudo rm -rf .
```
とかやれば良い。
色々と試したが、これが最近のベスト解。
AWS IAM設定時 プログラムによるアクセス

<h1>AWS IAM設定時 プログラムによるアクセスと選択がありませんでした😭</h1>

プログラムによるアクセスという選択肢がなかったので、四苦八苦してしまった^^;

○解決策

①まず、IAMユーザーをそのまま作成

②作成したユーザー名をクリック

③ユーザ詳細画面の「セキュリティ認証情報」タブをクリック

④タイプは「AWS の外部で実行されるアプリケーション」を選択

これで、アクセスキー、シークレットキーを作成できました👏
デプロイしてサービスを公開②

<h1>AWS S3の設定</h1>
アプリを公開するにあたりクラウドストレージを使っていきます。

AWS（Amazon Web Service）とは、Amazonが提供する開発者向けのクラウドサービスです。大昔のことですが、アプリケーションを開発してそれを公開するには、サーバー（大きなコンピュータ）を用意してそこにアプリケーションをインストールする必要がありました。

AWSは、開発者がサーバーを気軽に利用できるようにするサービスです。クラウド上にサーバーが用意されており、すぐにサーバーを利用できます。詳しくは以下の公式動画を確認してください。
https://youtu.be/RrdwaCG8xjU

AWS のアカウントを作成
https://portal.aws.amazon.com/billing/signup#/start
[ゲノム解析] 二つ以上のゲノムファイルの内容が同一であるか，高速に調べてみよう

# これ同じファイルかな？
コマンド上でゲノムファイル（FASTAなど）をプログラムにかけたり，コピーを繰り返していくと，多くのゲノムファイルが生成されますね．
そうすると、「あれ、こいつら同じファイルだっけ・・・？、お前らはいったい・・・？」ってなる時があると思います。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/fa1ce29e-08d1-1c10-d2fd-5d1ab82049a5.png" width="250">

そこで、使えるコマンドがあります。それは`md5sum`です。

# `md5sum`で何ができるの？
`md5sum`はファイルのハッシュ値を出力します。
*ハッシュ値とは、文字列から、ある決まった計算手法によって導かれる値です。
決まった計算手法なので、同じ文字列からは必ず同じ値が導かれます。
すなわち、ファイル内容の同一性を確かめるには、各ファイルに書かれた文字列（アルファベット、漢字、数字、0/1など何でも）のハッシュ値を照合すれば良いのです。
*こちらより引用元

コマンドは簡単で`md5sum <file>`となります。
例えば、約6MBとFASTAファイル『genome.fasta』のハッシュ値を調べるとします。
以下のコマンドによって、ハッシュ値が出力されました。
```
#コマンド
md5sum genome.fasta
#結果
46c83544630fe4ad3e88f03e661e7a3b genome.fasta
```

## 利点：ハッシュ値の算出には時間がかからない
ゲノムファイルのデータ量は基本大きいです。
そのままファイルの内容を目視や`awk`等で比較しようとすると、多大な計算時間が必要です。
ハッシュ値の導出にはそこまで時間は掛からないです。そこに、`md5sum`の利点があります。

例えば、約6MBとFASTAファイル『genome.fasta』を使った時、筆者のM1Macでは以下の計算時間となりました。
```
#コマンド
time md5sum genome.fasta
#結果
md5sum genome.fasta 0.02s user 0.01s system 24% cpu 0.122 total
```

しっかり早いですね。

# 実際にどうやって調べるの？
まとめて`md5sum`にかけて、ハッシュ値を目視で確かめれば良いです。
例えば、2つのゲノムファイル、『genome.fasta』『genome_2.fasta』があったとします。
それぞれ以下のように、コピーするとします。
```
cp genome.fasta A.fasta
cp genome.fasta B.fasta
cp genome_2.fasta C.fasta
```
A.fasta=B.fastaとなって、C.fastaは別ものとなりますね。
では3つのfastaを`md5sum`にかけて、ハッシュ値比較してみましょう。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2519906/27d2c0bb-0e34-5896-cc47-8d0229f6b51f.png" width="400">


```
#コマンド
md5sum A.fasta B.fasta C.fasta
#結果
46c83544630fe4ad3e88f03e661e7a3b  A.fasta
46c83544630fe4ad3e88f03e661e7a3b  B.fasta
7a88a5226499829572539e27b0a4bc7d  C.fasta
```
このようになりました。
どのファイルが同じものからコピーされたかわかりますね。

# 終わりに
ドライ解析でついついファイルがメチャクチャになった時、`md5sum`を使いましょう！
Amazon Route 53とは？

Amazon Route 53　よくある質問の内容を確認し、
主な項目について、整理しました。 
--


https://aws.amazon.com/jp/route53/faqs/

Amazon Route53は、主に、次のようなDNS、ドメイン名登録を管理します。

ドメイン名とは、インターネット上の「住所」になります。
https://www.subxxxxx.example.com　を読み解くと、
「example.com」が「住所」ドメイン名になります。
ネットワークやコンピューターを、インターネット上で一意に特定するための識別子の一つです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/1203c0f3-baa7-5c9c-3829-1253b829a6f2.png)

Route 53で提供される主要な機能
--
__1.	ドメイン登録__
Route 53では、ドメイン名の登録が可能です。ドメイン名を登録することで、インターネット上で一意の名前を使用して、自分のウェブサイトやアプリケーションを識別できるようになります。Route 53は、多数のトップレベルドメイン（TLD）をサポートしており、.com、.org、.netなどの一般的なTLDを含みます。また、Route 53を使用してドメイン名をAWS内の各種サービスと統合することができます。例えば、EC2インスタンスやS3バケットなどのAWSのリソースにドメイン名を割り当てることができます。EC2インスタンスにドメイン名を割り当てたい場合は、Route 53でAレコードを作成して、EC2インスタンスのパブリックIPアドレスを関連付けます。S3バケットにドメイン名を割り当てる場合は、Route 53でCNAMEレコードを作成して、バケットのエンドポイントを関連付けます。

__2.	DNSホスティング__
 Route 53は、DNSホスティングを提供しています。「example.com」というドメイン名を持っている場合、このドメイン名に関連付けられたIPアドレスを公開することができます。自分自身でDNSサーバーを運用する必要がなくなり、ドメイン名を所有しているだけでWebサイトやメールサーバーなどのインターネットサービスを提供することができます。

__3.ヘルスチェック__
 Route 53は、ヘルスチェック機能を提供しています。この機能を使用することで、ウェブサイトやアプリケーションが正常に動作しているかどうかを定期的に監視することができます。ヘルスチェックは、HTTP、HTTPS、TCP、ICMPなどのプロトコルを使用して行われ、異常が検出された場合には、自動的にトラフィックを別のエンドポイントにルーティングすることができます。

__4.	トラフィックルーティング__
 Route 53は、トラフィックルーティング機能を提供しています。この機能を使用することで、複数のエンドポイントに対してトラフィックを分散させることができます。例えば、異なる地域に配置された複数のエンドポイントに対して、ユーザーからのトラフィックを適切に分散させることができます。また、異なるエンドポイントに対して重み付けを行うことで、特定のエンドポイントに対する負荷を調整することもできます。

ルーティングポリシー
--
__1.	重み付きルーティング__
 重み付きルーティングは、複数のエンドポイントに対するトラフィックを、事前に指定したウェイトに基づいて分配することができます。たとえば、異なる地理的地域に配置されたエンドポイントのうち、東京にあるエンドポイントに70％のウェイトを設定し、シンガポールにあるエンドポイントに30％のウェイトを設定することができます。この場合、トラフィックの70％は東京のエンドポイントに送信され、30％はシンガポールのエンドポイントに送信されます。
__2.	レイテンシベースのルーティング__
レイテンシベースのルーティングは、最も低いレイテンシを持つエンドポイントにトラフィックをルーティングすることができます。Route 53は、各リージョンの全エンドポイントの平均レイテンシを監視し、最も低いレイテンシを持つエンドポイントにトラフィックをルーティングします。
__3.	ジオロケーションルーティング__
 ジオロケーションルーティングは、ユーザーがアクセスしている場所に基づいて、最も近いエンドポイントにトラフィックをルーティングすることができます。Route 53は、ユーザーのIPアドレスを使用して、ユーザーがどの地域にいるのかを判断し、その地域に最も近いエンドポイントにトラフィックをルーティングします。
__4.	フェイルオーバールーティング__
 フェイルオーバールーティングは、メインのエンドポイントがダウンした場合に、代替のエンドポイントにトラフィックをルーティングすることができます。Route 53は、定期的にメインエンドポイントのヘルスチェックを行い、メインエンドポイントがダウンした場合には、代替のエンドポイントにトラフィックを自動的にルーティングします。これにより、高可用性を維持することができます。

少しでも、学習の参考にして頂ければ、と思います。
--
AWS WAFとAWS Shieldの違い

よくAWSの試験で出題される
AWS WAFとAWS Shieldに関する情報を整理しました。
--
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2920213/eb2fe08b-d6cc-c8b1-b10c-1d2a3c48e808.png)

__AWS WAFとAWS Shieldは、Amazon Web Services (AWS)のセキュリティサービスですが、目的や提供される機能に違いがあります。皆さんは、この違いを明確に説明出来るでしょうか? 
最近、お客様に説明する機会がありましたので、整理してみました。__

WAF（Web Application Firewall）は、__Webアプリケーションの脆弱性や攻撃から保護するためのセキュリティサービスです。__ WAFは、HTTP / HTTPSリクエストを監視し、指定されたルールに基づいてトラフィックを許可またはブロックします。WAFは、XSS（クロスサイトスクリプティング）、SQLインジェクション、CSRF（クロスサイトリクエストフォージェリ）などのWebアプリケーション攻撃を検出および防止するための機能を提供します。

一方、Shieldは、AWSリソースを __DDoS（分散型サービス拒否）攻撃から保護するためのサービスです。__ Shieldは、レイヤー3およびレイヤー4の攻撃（IP、TCP、UDPレベルでの攻撃）を自動的に検出および防止し、AWSのグローバルネットワークに統合されており、ネットワークレベルの保護を提供します。これには、TCP SYN Flood、UDP Flood、ICMP Floodなどが含まれます。

つまり、WAFはWebアプリケーションの脆弱性から保護し、ShieldはDDoS攻撃から保護します。
--

AWS WAFの主な機能
--
__Webアプリケーションの脆弱性から保護__
__1.	Webトラフィックのフィルタリング__
AWS WAFは、Webトラフィックを監視し、指定されたルールに基づいてトラフィックを許可またはブロックすることで、Webアプリケーション攻撃を検出および防止する機能を提供します。一般的なWebアプリケーション攻撃を検出し、ブロックするため、XSS（クロスサイトスクリプティング）、SQLインジェクション、CSRF（クロスサイトリクエストフォージェリ）、パストラバーサルなどの攻撃に対処できます。
__2.	AWSの他のサービスとの統合__
AWS WAFは、AWSの他のサービスと簡単に統合できます。AWS CloudFront、Application Load Balancer、またはAPI Gatewayを使用するWebアプリケーションに適用できます。
__3.	監視と通知__
AWS WAFは、攻撃が検出された場合にログに記録し、管理者に通知することができます。

AWS Shieldの主な機能
--
__AWSリソースをDDoS（分散型サービス拒否）攻撃から保護__
AWS Shieldは、DDoS攻撃からWebアプリケーションを保護するためのサービスです。

__1.	AWS Shield Standard__
ネットワーク層でのDDoS攻撃からWebアプリケーションを保護するためのサービスです。
__2.	AWS Shield Advanced__
AWS Shield Advancedは、追加料金が必要ですが、より高度なカスタマイズが可能であり、24時間体制でAWSのセキュリティ専門家によるサポートが提供されます。AWS Shield Advancedには、ネットワーク層およびアプリケーション層でのDDoS攻撃からWebアプリケーションを保護するための機能があります。
__3.	AWS Shield Advancedのアクセス制御__
AWS Shield Advancedでは、アクセス制御をカスタマイズすることができます。特定のIPアドレスやリージョンからのアクセスを許可することができ、特定のアプリケーションレイヤの攻撃に対する保護も提供されます。
__4.	AWS WAF統合__
AWS Shield Advancedは、AWS WAFと統合することができます。AWS WAFは、Webアプリケーションの攻撃から保護するためのサービスであり、AWS Shield Advancedを使用してWebアプリケーションのDDoS攻撃から保護することができます。

__AWS Shield Advancedの設定__
AWS Shield Advancedコンソールで、対象のリソースを選択します。
「Protection settings」を選択し、DDoS攻撃を検知するための防御機能を有効にします。
「Web ACL associations」を選択し、AWS WAFで作成したルールをWeb ACLに関連付けます。
「Advanced DDoS」を選択し、DDoS攻撃からWebアプリケーションを保護するための設定を行います。設定には、トラフィックのリダイレクト、プロトコルの調整、トラフィックの限定などがあります。

少しでも、学習の参考にして頂ければ、と思います。
--
関西ビギナーズハッカソンにメンターとして参加してきた話

# 目次
[1.はじめに](#1-はじめに)
[2.関西ビギナーズハッカソンとは](#2-関西ビギナーズハッカソンとは)
[3.なぜ私がメンターとして参加したのか](#3-なぜ私がメンターとして参加したのか)
[4.3日間について](#4-3日間について)
[5.メンターとして感じたこと](#5-メンターとして感じたこと)
[6.最後に](#6-最後に)

# 1. はじめに
こんにちは！京都の大学生mapleです。
久しぶりの投稿になってしましました。
今回、私は関西ビギナーズハッカソンというイベントにメンターとして参加してきました！3日間を通して私が感じたことを備忘録として残しておきます。また、会場の熱量などをこの記事を通して感じてもらえたらと思っております。

# 2.関西ビギナーズハッカソンとは
「関西を拠点とする情報系学生団体のビギナーズが一同に会し、開発・交流を促進するための宿泊型ハッカソンイベント」です！
参加団体は、`STECH`, `プログラミング研究会Tech.Uni `, `watnow`, `Do'er`, `あまてく`の以上5団体です。
そして、スポンサー様として、`キャリアセレクト`, `カラビナテクノロジー株式会社`, `株式会社PLAID`, `TechBowl`, `Tomosuba`(敬称略)
以上の企業様にご協力いただきました。
詳しくは[関西ビギナーズハッカソンサイト](https://kansai-hackathon.com/event/vol1/) をご覧ください。

# 3. なぜ私がメンターとして参加したのか
私は[あまてく](https://twitter.com/amatech1006)という京都にある大学のエンジニアコミュニティを運営しております。そして、STECHというエンジニアコミュニティにも所属しており、今回のイベントの運営の方から「あまてくもぜひ参加しないか？」と声をかけていただいたのがきっかけです。
イベント名にもあるように、ビギナーズな学生を対象としているため、ハッカソン未経験者や開発経験があまりない学生が参加することになりました。そこで、あまてくに所属している学生たちが数名参加者として参加することになったので、私は保護者兼メンターとして参加することになりました。
しかし、私は開発経験1年未満そしてハッカソンでの受賞歴もないという状況で不安ばかりでした。

# 4. 3日間について
## 1日目
```
10:30~ 開会式
12:00~ ハッカソン開始
~19:00 1日目終了
```
運営・参加者・メンター・企業様ほとんどが初対面の方ばかりで緊張していました。
メンター自己紹介の時間では、他のメンターさんの経歴がすごすぎて余計に自分がここにいていいのかと不安に駆られました。技術力では圧倒的に足りないと感じていたので、コミュニケーションをより多くとって参加者との交流をしていこうと思い動いてました。実際できていたのかわからないですが、、、
1日目の印象としては、メンターのほとんどがすごく暇そうにしていたということですね笑


## 2日目
```
14:00~ 中間発表
~19:00 2日目終了
```

2日目になると、環境構築も終わりそれぞれの機能の実装に取り掛かっているチームが多い印象でした。
また、中間発表時の審査員からの激励のおかげで、メンター全員が引っ張りだこでいっそう会場の熱量が上がっていました。おかげさまで私にも質問してくれる子が増えたのが嬉しかったです。
各自ホテルに戻ってからも開発を進めていたチームも多くあったようです。



## 3日目
```
15:30~ 最終発表
17:30~ 結果発表
18:00~ 交流会
19:00 解散
```
徹夜で開発していたという参加者も多く、ほとんどの参加者・メンターが寝不足になりながら3日目を迎えました。私も朝までつきっきりでメンターをしていたので、睡魔との戦いでした笑
そして待ちに待った最終発表の時間です。事前開発を含め約3週間のハッカソンがついに終幕です。
中には、TestFlightにアプリをリリースしているチームやデプロイしているチームがあり驚きです。また、本当にビギナーか？と疑うようなクオリティの高いプロダクトばかりでメンターや審査員の皆さんも驚いていました。全チームが動くところまで完成できたのが印象的でした。詳しい結果については、冒頭に記載した関西ビギナーズハッカソンのサイトをご覧ください。
交流会では、ハッカソンを終えた参加者たちの安堵の表情が印象的でした。同時に私も無事メンターをやりきれて達成感を味わいました。


# 5. メンターとして感じたこと
質問に対して解決策を教え、うまく行った時に一緒に喜べた瞬間は非常に嬉しい気持ちでした。中には、実装方法を聞くのではなく、`この機能を実装をするためにこの方法を考えたのですが、どう思いますか？`と確認のためにメンターを活用している子もいました。
メンターの使い方は人それぞれではあるが、参加者にとってメンターがいるのといないのとでは安心感が全然違うんだなと思いました。

自分が普段何気なく扱っている操作であっても参加者にとっては初めて扱うものばかりだったため、誰でも理解できるように噛み砕きながら説明するのに苦労しました。例えば、Git操作においてなぜmainブランチで作業してはいけないか、ブランチを切る必要があるのか、commitとは？、pushって何？などなど
自分の中ではなんとなくわかっているつもりでもいざ言語化するとなかなか説明できませんでした。そこで言語能力や言語化するための知識不足を実感しました。

また、私は普段Swiftを使ったiOSアプリを中心に行なっているが、今回の参加者はFlutterやReactNativeでのモバイル開発はあったもののSwiftを使ったチームがありませんでした。なので、私にとってはどの言語も初めて見る状態でのメンターでした。
しかし、コードをきちんと読むとやっていることがなんとなくわかったので新鮮な気持ちでした。メンターをすることで慣れない言語にも半強制的に触れることができるのでいい機会でした。
小さいミスにも気付けないことが多かったので、自分の爪の甘さも感じました。

# 6. 最後に
初めてオフラインのハッカソンに参加しましたが、会場の熱量を直に感じることができ、非常に楽しかったです！私自身初めてのメンターで不安ばかりでしたが、頼ってくれる参加者も多く、無事に3日間過ごすことができて大変満足です！そして、滅多にできない他大学や他団体の方達と交流ができて、新しいつながりの楽しさを実感しています。
あまてくとしては初めての大きなイベントだったので、メンバーの子たちがそれぞれ学びを得ていたら嬉しいです。

# おまけ
私が携わっているあまてくはこれからも多くのイベントを開催します！！
そこでもし一緒に盛り上げていきたいという方がいらっしゃいましたら、[こちら](https://twitter.com/amatech1006)からDMを送っていただけると幸いです！
MySQL8でutf8mb4_general_ciをdefaultのCOLLATIONに指定する。

下記を実施

SET PERSIST collation_server=utf8mb4_general_ci;
SET PERSIST default_collation_for_utf8mb4=utf8mb4_general_ci;

■ 参考
https://mita2db.hateblo.jp/entry/2020/12/07/000000
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0157
https://gihyo.jp/dev/serial/01/mysql-road-construction-news/0094
海外IPからのアクセスを検知したい！！

海外IPからのアクセスを検知して分岐処理を書く機会があったので、調査結果を備忘録がてらまとめてみました。
この方法を採用することで、特定の国や地域からのアクセスを識別することができます。
海外IPからのアクセスを再現する方法と、海外IPからのアクセスを検知する方法に分けてそれぞれ解説していきます。
************************************************************
# 海外IPからのアクセスを再現する方法
### 1. [VPN Free – Betternet Unlimited VPN Proxy](https://chrome.google.com/webstore/detail/vpn-free-betternet-unlimi/gjknjjomckknofjidppipffbpoekiipm/related?hl=ja)

再現方法は色々あったのですが、この拡張機能を使うやり方がお手軽かつページ遷移まで再現できるので圧倒的におすすめです。
拡張機能をインストールし下記画像の「CONNECT」ボタンを押せば海外IPからのアクセスを再現できます。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576629/f2ffc7d3-a23b-c876-bcd9-efcf9dbf12de.png"></img>

### 2. [WebPageTest](https://www.webpagetest.org/)
登録不要で、簡単に海外IPからのアクセスを再現できるサイトです。
<img width="600" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1576629/9380cdbc-4dbf-4009-8006-1f79af415181.png"></img>
画像の「Enter a website URL…」と表示されているinputフォームに、アクセスしたいURLを入れて「Start Test」ボタンをクリックすれば海外IPからのアクセスを再現できます。
アクセスした結果の画面が表示されます。
# 海外IPからのアクセスを検知する方法
## 1. API
リクエスト元のIPアドレスを送ることで、どの国からのアクセスかを判定できるAPIが世界にはたくさんあるのでそれらを使いましょう。適当にいくつか紹介します。

:::note warn
有料なものもあるので使用する際は自己責任でお願いします
:::
### dbip

https://db-ip.com/api/

### ipgeolocation

https://ipgeolocation.io/

### IPWHOIS.IO

https://ipwhois.io/

## 2. MaxMind DB
MaxMind DBとは、MAXMIND社が提供しているIPアドレスから位置情報を検索するためのデータベースで、IPアドレスから、国や地域、市、郵便番号といった情報を取得することができます。
MaxMind DBは、オープンソースのGeoLite2というデータベースを提供する他、有料のデータベースも提供しています。

仕様についての詳しい説明は下記公式ドキュメントを参考にしてください。

https://maxmind.github.io/MaxMind-DB/

また、実際に採用する場合は下記GitHubのREADMEを参考にしてください(Rubyで採用する場合のGitHubです)。

https://github.com/maxmind/MaxMind-DB-Reader-ruby

# 最後に
様々な外部サービスを使うことで海外IPアクセスの再現とその判定を簡単に行えることがわかりました。ただ、これから実際にどのサービスを使うか決めるって段階に入るとお金が絡んできて急に難しくなりますよね…

どのサービスが使えるか調査するのは楽しくても、実際に決める段階は嫌いって人意外と多そうです（偏見）。コストとサービスクオリティのバランスは悩まざるを得ないなって改めて感じました。
(x2+1)^(-1/2)「[演習]重積分4(体系大学数学)」をwolframalphaとsympyでやってみたい。

3Dプロットしたい。
wolframでわけて、実行しました。
sympyでわかりません。

オリジナル

https://youtu.be/gzoM8YpKBsk

# wolframで

https://www.wolframalpha.com/input?i=y%3D%28x2%2B1%29%5E%28-1%2F2%29%E3%81%AEx%3D2%E3%81%AE%E6%8E%A5%E7%B7%9A&lang=ja

結果
y = 9/(5 sqrt(5)) - (2 x)/(5 sqrt(5))

https://www.wolframalpha.com/input?i=%28x2%2B1%29%5E%28-1%2F2%29%E3%81%A89%2F%285+sqrt%285%29%29+-+%282+x%29%2F%285+sqrt%285%29%29%E3%81%A7%E5%9B%B2%E3%81%BE%E3%82%8C%E3%81%9F%E9%A0%98%E5%9F%9F&lang=ja

結果
integral_(-1/2)^2 (1/25 (-9 sqrt(5) + 2 sqrt(5) x) + 1/sqrt(1 + x^2)) dx = -(3 sqrt(5))/4 + sinh^(-1)(1/2) + sinh^(-1)(2)≈0.247796

https://www.wolframalpha.com/input?i=integral_%28-1%2F2%29%5E2+integral_%28%289+-+2+x%29%2F%285+sqrt%285%29%29%29%5E%28%28x%5E2+%2B+1%29%5E%28-1%2F2%29%29+x+dy+dx+&lang=ja


https://www.wolframalpha.com/input?i=2%E9%87%8D%E7%A9%8D%E5%88%86&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart2%22%7D+-%3E%22%289-2x%29%2F%285%E2%88%9A5%29+%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend1%22%7D+-%3E%222%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangestart1%22%7D+-%3E%22-1%2F2%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22integrand%22%7D+-%3E%22x%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable2%22%7D+-%3E%22y%22&assumption=%7B%22C%22%2C+%222%E9%87%8D%E7%A9%8D%E5%88%86%22%7D+-%3E+%7B%22Calculator%22%7D&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22intvariable1%22%7D+-%3E%22x%22&assumption=%7B%22F%22%2C+%22DoubleIntegral%22%2C+%22rangeend2%22%7D+-%3E%22%28x2%2B1%29%5E%28-1%2F2%29%22&lang=ja

定積分
integral_(-1/2)^2 integral_((9 - 2 x)/(5 sqrt(5)))^((x^2 + 1)^(-1/2)) x dy dx = sqrt(5)/24≈0.093169

# sympyで
わかりません。

# 参考
SPF

# SPF
SMTPを利用したメール送受信において、```送受信者のドメイン偽装を防ぎ、正当性を検証する仕組み```。
電子メールを受信したメールサーバが、送信元メールアドレスの```ドメインのDNSサーバからメールサーバーのIPアドレス```を取得し、```SMTP接続元のサーバのIPアドレス```と比較することで正規サーバーからのメールであることを検証する。

# 出典
https://gihyo.jp/book/2022/978-4-297-12375-8

# 感想
送信元のドメイン名を基にIPアドレスを取得する
SMTPサーバーに接続されたIPアドレスを比較することで偽装しているかどうかを調べるのか。
Flexboxを学び直す

FlexboxはFlexコンテナーとFlexアイテムで構成されている。コンテナーの中にアイテムが複数ある感じ。
display:flexをCSSで記述して、範囲を決めると縦並びになっているHTMLを横並びにできる

Flexboxの６つの基本プロパティ
・flex-direction　
ー　rowは初期の。左から右並び
ー　row-reverseは逆に右から左並び
ー columnを上から下へ
ー　column-reverseは下から上へ

・flex-wrap
ー　nowrapは初期値。ページが狭まる時折り返さない
ー　wrapはページが狭まる時折り返す。上から下へ。
ーwrap-reverseはページが狭まる時下から上へ折り返す(使い道わからん)

・justify-content
ー　flex-startは初期値。左詰め
ー　flex-endは右詰め
ー　centerは真ん中揃え
ー　space-betweenは両端を端っこに。それ以外を均等に
ー　space-aroundは↑の端っこにスペースがあるバージョン
ー　space-evenlyは↑の隅っこにさらにスペースがあるバージョン

・align-items
ー　stretchは小要素の範囲内全て。初期値
ー　flex-startは上揃え
ー　flex-endは下揃え
ー　centerは真ん中揃え
ー　bacelineは小要素のベースラインで揃える。文字の大きさとかバラバラでも１ラインで揃ってる的な

・align-content
ーstrechは初期値。親要素の範囲内全て
ー　flex-startは上揃え
ー　flex-endは下揃え
ー　centerは真ん中揃え
ー　space-betweenは最初と最後は端っこに。それ以外は均等に


・flex-flow
ー　flex-flow:row(flex-direction) nowrap(flex-wrap);という風にまとめてできる
Cygwin 64bit 版へ乗り換え (32bit版より)

# 背景
cygwin がとうとう、32bit版を使用することが出来なくなったようだ。

setup-2.925.x86.exe をゲットして実行しようとしても、
「Cygwin is not supported on 32-bit Windows」と言われてお終い。
net work tools とかが 32bit 版でないとまともに動かなかったので、あえて 32bit 版を使い続けて来たのだが、install不能になってしまったので、諦めて 64bit 版へ移行した。その手順をメモしておく

# 手順
1. HOME folder が C:\Cygwin 以下にはないことを確認する
1. 既存の cygwin を止める。
  コントロールパネル -> 「管理ツール」->「サービス」->[CYGWIN cygsshd] を停止
1. cygsshd を削除
  DOS 窓を「管理者として実行」
    ```
    > sc delete cygsshd
    ```
    だったり
    ```
    > sc delete sshd 
    ```
    だったりする
1. C:\Cygwin　(旧32版)フォルダーをごっそり削除する
 フォルダー・プロパティ->「セキュリティ」->Everyone にフルコントロールを追加
 削除を実行

1. cygwin64 を install
   setup-2.925.x86_64.exe  を実行して、C:\cygwin64 へ
   欲しいものを install すればよい
   openssh, openssl, inetutil, python3, php, wget, curl, git, tmux, screen, emacs-w32,... etc

1. Cygwin64 環境初期設定
    terminal を起動して、
    ```
    cd /etc
    mkpasswd -c > passwd
    ```
     vi passwd  等にて username を自分の名前に、HOME フォルダーを設定編集する
    ```
    warp:*:1053150:1049089:NNN\usexxx,S-1-5-21-1841757738-1251100470-2179745601-4574:/cygdrive/c/home/warp:/bin/bash
    ```
    こんな感じ
    terminal を再起動すれば HOME で立ち上がるはず

1. shell path の変更
  「PC」->プロパティ->「システム詳細設定」->「環境変数」-> Path 
   C:\cygwin\bin を C:\cygwin64\bin; へ変更

1. sshd 登録、起動
  「管理者として実行」cygwin terminal を開く
    ```
    > ssh-host-config
    ```
    を実行。
    restrict だけ no で、他は yes で設定. 終わったら、
    cygrunsrv -S cygsshd  をやれと言われるので、言われた通りやる
    .ssh を設定して ssh 動作を確認

1. firewall の変更
 自分のPCへ ssh トンネルを開けておくので sshd を許可しておく
 「Windows ファイアーウォールによるアプリケーションの許可」->「設定の変更」
    - sshd (C:\cygwin\usr\bin\sbin\sshd) を削除
    - 新たに、sshd (C:\cygwin64\usr\sbin\sshd) を登録

以上、意外とあっさりと出来ます。
【IT中国語】ネットワーク編

あ行

| 日本語         | 中国語           | 
| -------------- | ---------------- | 
| IPアドレス     | IP地址               |
| OSI参照モデル   |  OSI参考模型(七层模型)      |
| インターネット | 互联网（因特网） | 
| イーサネット   | 以太网           | 

か行

| 日本語                 | 中国語                     | 
| ---------------------- | -------------------------- | 
| ギガビットイーサネット | 千兆比以太网               | 
| 共通鍵暗号方式         | 共享密钥加密(对称秘钥加密) | 
| グローバルIPアドレス   | 公网IP地址(全球IP地址)     | 
| ゲートウェイ   | 网关     | 
| 公開鍵暗号方式         | 公开密钥加密               | 
| 広域イーサネット       | 广域以太网                 | 

さ行

| 日本語           | 中国語   | 
| ---------------- | -------- | 
| サブネット | 子网 | 
| サブネットマスク | 子网掩码 | 
| サーバ           | 服务器   | 
| スイッチ         | 交换机   | 

た行

| 日本語           | 中国語   | 
| ---------------- | -------- | 
| デジタル署名 | 数字签名 | 
| デフォルトゲートウェイ | 默认网关（缺省网关） | 
| ドメイン名           | 域名   | 

は行

| 日本語           | 中国語   | 
| ---------------- | -------- | 
| バケット | 包（数据包） | 
| ハブ           | 集线器 | 
| プライベートIPアドレス           | 私网IP地址 | 
| ブリッジ           | 网桥 | 
| フレームリレー           | 帧中继 | 
| ブロードバンド           | 宽带 | 
| ブロードバンドルータ           | 宽带路由器 | 

ま行

| 日本語           | 中国語   | 
| ---------------- | -------- | 
| マルチキャスト | 组播（多播）| 
| 無線LAN           |  无线局LAN（无线局域网）| 

ら行

| 日本語           | 中国語   | 
| ---------------- | -------- | 
| ルータ | 路由器 | 
| ルーティング           | 路径选择 | 
| ルーティングテーブル           |  路由表  |
[macOS]コマンドラインからWebブラウザを開く方法

# やりたいこと
MacOS(v13.2)でコマンドラインから、Google ChromeなどのWebブラウザを起動したい、あるいは指定したURLを開きたい。

# 方法
## アプリの絶対パスから起動する
         
```
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome
```

URLを引数に指定するとそのURLを開くことも可能。
         
```
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome https://www.google.com
```

新しいウィドウで開きたい場合は--args --new-windowオプションを指定する。

```
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --args --new-window https://www.google.com
```
※既存プロセスがない場合は、コマンドの実行後ターミナルを閉じたりCtrl+Cでコマンドを中止すると、Chromeが終了する。

## 「open」コマンドを使う
「open」コマンドの「-a」オプションで指定したアプリを開くことが可能。
```
open -a "Google Chrome" 
```

URLを引数に指定するとそのURLを開くことも可能。

```
open -a "Google Chrome" https://www.google.com
```

新しいウィドウで開きたい場合は-nと--args --new-windowオプションを指定する。

```
open -na "Google Chrome" --args --new-window https://www.google.com
```

# aliasを作成する
頻繁に使用する場合はaliasを作成しておくと便利。

```
alias chrome='open -a "Google Chrome"'
```

上記の方法で-a（アプリ名）の引数を変更することで他のブラウザを起動することも可能。

```
open -a "Firefox" 
```

オプションなしで、URLのみ「open」コマンドの引数として指定した場合は、デフォルトブラウザが使われる。

```
open https://www.google.com/ 
```

ローカルにあるhtmlファイルを開き場合は引数としてファイルのパスを指定する。

```
open -a "Google Chrome" index.html
```
ループ処理

次の要件を満たすプログラムを実装

・1~10の数値を順番に足し合わせる
・足し算の合計値がターミナルに出力される
・ループ処理を用いて実装


sum = 0

10.times do |i|
  sum += i + 1
end

puts sum
#1から10まで順番に足していくルプ処理を使った
mandalas.world

Number counting and coloring are two of the useful activities for children, especially for preschool and kindergarten. Color by number is a good way that helps children have both these experiences. 
Website: https://mandalas.world/
Gmail: mandalasworld123@gmail.com
Address: 400 40th St, Oakland, CA 94609, USA
https://www.facebook.com/webmandalasworld/
https://www.pinterest.com/webmandalasworld/
https://www.instagram.com/webmandalasworld/
https://www.youtube.com/channel/UCrB3V4dKpnGCyvRybeDUhNA
https://twitter.com/webmandalas
https://qooh.me/mandalasworld
https://www.twitch.tv/mandalasworld
https://www.linkedin.com/in/mandalasworld/
https://www.tumblr.com/webmandalasworld
https://webmandalasworld.wordpress.com/
https://about.me/mandalasworld/
https://blip.fm/mandalasworld
https://www.beatstars.com/mandalasworld
RubyのFiddleで確保した構造体のメモリを解放する方法

Fiddleとは、Rubyに標準添付されている、ffiのライブラリである。最も普及しているRuby-FFIとは別だが、標準でインストールされている確率が非常に高いので、かんたんにC言語のライブラリを呼びたいときは役に立つ。

Fiddleで構造体のメモリを確保した場合に、どう解放するかについての情報がネット上にそれほどないのでまとめる。

```ruby
require "fiddle/import"

module FFI
  extend Fiddle::Importer
  A = struct(["int a", "int b"])
end

a = FFI::A.malloc
```

として構造体Aを定義して、Aのメモリを確保した場合、ローカル変数 `a` がRubyのGCによって回収されても、Rubyが終了するまで、確保されたメモリは残っている。

一方で、最近のFiddleでは

```ruby
a = FFI::A.malloc(Fiddle::RUBY_FREE)
```

古いFiddleでは

```
a.to_ptr.free = Fiddle::RUBY_FREE
```

とすることで、GCで `a` が回収されるタイミングで、確保されたメモリが解放される。

したがって、一定時間ののちに終了することがわかっているRubyスクリプトは、メモリを確保しっぱなしでも実害はないと思うが、長時間実行するRubyのコードの場合には、適切なタイミングでメモリが解放されるように気をつけたい。
Puttyで公開鍵認証しかできない踏み台経由での多段SSHをする

# 目的

Puttyでは、多段SSH時におけるProxyログインにはパスワード認証しか使えない。  
しかし、踏み台サーバは通常、公開鍵認証なので具合が悪い。

OpenSSHのProxyJmp機能と似たような設定をすることで、これを解決する。

# 前提

- Windows
- Putty
- 踏み台サーバは公開鍵認証しかできない
- 最終接続サーバは公開鍵認証でもパスワード認証でもどちらでもよい

# 手順

## 踏み台サーバへ接続するセッションを作成する

- セッション
  - ホスト名： 踏み台サーバのIPアドレス（グローバルIP）
- 接続
  - データ：
    - 自動ログインのユーザー名： 踏み台サーバのユーザー名
	- SSH：
	  - 認証：
	    - クレデンシャル：
		  - 認証のための秘密鍵ファイル： 踏み台サーバに接続するための秘密鍵

接続できることを試しておく。（特に、ホストキーを受け入れるかどうかのダイアログが表示されない状態にしておくことが重要です）
接続出来たら、puttyは終了しておく。

## 最終接続サーバへ接続するセッションを作成する（パターン１）

おすすめ。puttyインストール時に、plinkコマンドも一緒にインストールされていて、利用可能な場合。

- セッション
  - ホスト名： 最終接続サーバのIPアドレス（踏み台サーバから見たIPアドレス。通常はプライベートIPアドレスとなる）
- 接続
  - データ
    - 自動ログインのユーザー名： 最終接続サーバのユーザー名
	- SSH
	  - 認証
	    - クレデンシャル
		  - 認証のための秘密鍵ファイル： 最終接続サーバに接続するための秘密鍵（踏み台サーバ上ではなく、Windows上に保存しておく必要があります）
  - プロキシ
    - プロキシの種類： ローカル（サブプログラムを実行し接続）
	- プロキシホスト名： 踏み台サーバのセッション名
	- ユーザー名： 空白
	- パスワード： 空白
	- プロキシ送信するコマンド： `plink.exe -load %proxyhost -nc %host:%port`
	- プロキシの診断をターミナルに表示する： はい（正常に接続できることが確認できたら、「いいえ」等に変更してもよい）
  
接続できることを試す。

## 最終接続サーバへ接続するセッションを作成する（パターン２）

踏み台サーバにncコマンドがインストールされている場合。（パターン1よりはポータビリティーが低下するので、パターン1のほうがおすすめ）

- セッション
  - ホスト名： 最終接続サーバのIPアドレス（踏み台サーバから見たIPアドレス。通常はプライベートIPアドレスとなる）
- 接続
  - データ
    - 自動ログインのユーザー名： 最終接続サーバのユーザー名
	- SSH
	  - 認証
	    - クレデンシャル
		  - 認証のための秘密鍵ファイル： 最終接続サーバに接続するための秘密鍵（踏み台サーバ上ではなく、Windows上に保存しておく必要があります）
  - プロキシ
    - プロキシの種類： プロキシにSSH接続してコマンド実行
	- プロキシホスト名： 踏み台サーバのセッション名
	- ユーザー名： 空白
	- パスワード： 空白
	- プロキシ送信するコマンド： `nc %host %port`
	- プロキシの診断をターミナルに表示する： はい（正常に接続できることが確認できたら、「いいえ」等に変更してもよい）
  
接続できることを試す。

# トラブルシュート

## `Incoming packet was garbled on decryption` ダイアログボックスが表示される

ターミナル画面にデバッグメッセージが表示されているので確認しましょう。


# 参考
- [コマンドラインの接続ツール Plink を使う](https://www.ranvis.com/doc/putty/man/plink.html#plink-usage-batch)
- [SSH/多段接続/PuTTYのローカルProxyCommandを使う - yanor.net/wiki](https://yanor.net/wiki/?SSH/%E5%A4%9A%E6%AE%B5%E6%8E%A5%E7%B6%9A/PuTTY%E3%81%AE%E3%83%AD%E3%83%BC%E3%82%AB%E3%83%ABProxyCommand%E3%82%92%E4%BD%BF%E3%81%86)
ポートに関して

ポートに関して今までlocalhost:8080とやったり
docker run -p 8080:80 -d nginxとやっていて調べた事が無かったので調べてみた


```
docker run -p 8080:80 -d nginx
8080(ローカルで動かしているアプリケーションにアクセスする際のポート：外部に公開した際に受け付けるポート)
```

>ロン（:）で区切ることで、IPアドレスやドメイン名とポート番号を分けています。たとえば、ローカルホストで実行されているWebアプリケーションにアクセスする場合、IPアドレスやドメイン名は「localhost」であり、ポート番号は「8080」であるため、「localhost:8080」というアドレスが使用されます。一方、外部のWebサーバーにアクセスする場合、IPアドレスやドメイン名はWebサーバーのものに置き換え、ポート番号が「80」であるため、「example.com:80」などのアドレスが使用されます。

>外部からWebサーバーにアクセスする場合は、通常、80番ポートが使用されます。一方、ローカルで実行されているアプリケーションにアクセスする場合、ローカルホストに対してアクセスを行い、通常は別のポート番号が使用されます。8080番ポートは、一般的に、Web開発者やアプリケーション開発者などがローカル環境でWebアプリケーションを開発・テストするために使用されることが多いです。
elm-spa と electron でデスクトップアプリ作ろうとしたけど諦めた話

# elm-spa と electron でデスクトップアプリ作りたい

いい感じのアイディアを思いついたので Electron でデスクトップアプリを作りたいと思った

elm でデスクトップアプリを作れるなら楽しそう！と思ったりして Electron を触ってみたかったりして思い立ったが

今回は諦めました。。

# 諦めた理由

elm-spa で使用している [Browser](https://package.elm-lang.org/packages/elm/browser/latest/Browser) のライブラリとどうやら相性が悪そうで

elm-spa ではルーティングをうまくやってくれるのですがそこで使用している application で問題がありました。

```elm
application :
    { init : flags -> Url -> Key -> ( model, Cmd msg )
    , view : model -> Document msg
    , update : msg -> model -> ( model, Cmd msg )
    , subscriptions : model -> Sub msg
    , onUrlRequest : UrlRequest -> msg
    , onUrlChange : Url -> msg
    }
    -> Program flags model msg
```

application ないの `Url` という型の　`Protcol` という型がどうやら、`Http` と `Https` しか対応していないみたいです。

```elm
-- URL


{-| In [the URI spec](https://tools.ietf.org/html/rfc3986), Tim Berners-Lee
says a URL looks like this:

  https://example.com:8042/over/there?name=ferret#nose
  \___/   \______________/\_________/ \_________/ \__/
    |            |            |            |        |
  scheme     authority       path        query   fragment

When you are creating a single-page app with [`Browser.fullscreen`][fs], you
use the [`Url.Parser`](Url-Parser) module to turn a `Url` into even nicer data.
If you want to create your own URLs, check out the [`Url.Builder`](Url-Builder)
module as well!
[fs]: /packages/elm/browser/latest/Browser#fullscreen
**Note:** This is a subset of all the full possibilities listed in the URI
spec. Specifically, it does not accept the `userinfo` segment you see in email
addresses like `tom@example.com`.
-}
type alias Url =
  { protocol : Protocol
  , host : String
  , port_ : Maybe Int
  , path : String
  , query : Maybe String
  , fragment : Maybe String
  }

{-| Is the URL served over a secure connection or not?
-}
type Protocol = Http | Https
```

どうやら electron では `file:///` というパスを参照しているみたいで
以下のようなエラーを吐きました

Browser.application ではその URL はハンドリングできないよって言ってます

```console
Uncaught Error: Browser.application programs cannot handle URLs like this:

file:///xxxx/public/index.html
```


Github でも結構前からこの会話されてるみたいです。

https://github.com/elm/url/issues/10
Googleデジタルマーケティング＆Eコマース：メール・マーケティングにおける「やるべきこと」「やってはいけないこと」

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# 「やるべきこと」「やってはいけないこと」

メール・マーケティング戦略を立てる際、多くの場合、誰をターゲットにするか、彼らにとって何が一番効果的かによって、決定すべきことが変わってきます。しかし、そのような情報を得る前に、全てのメールマーケティング担当者が実践している「やるべきこと」と「やってはいけないこと」を紹介します。

### <font color="MediumBlue">Do:量より質を優先させる</font>

まず、世界にはどれだけのメールユーザーがいるのかを説明しました。1日にどれだけのメールが送信されていると思いますか？ある専門家は、毎日3,000億通以上のメールが送信されていると推定しています。これだけの数のメールが毎日送信されているのですから、量より質を優先させることがブランドにとって重要なのです。

あなたのブランドやチームにとって、「質」とは何かということを明確にし、その基準を守りましょう。もし、あなたのメールの内容が気に入れば、たとえ週に1回しか送らなくても、楽しみにしてくれるでしょう。あなたにとって品質とは、その人の生活を豊かにすることかもしれません。もしかしたら、顧客や読者に面白い画像や美しい画像を提供したいだけで、それがあなたにとってのクオリティに相当するのかもしれません。

- もしあなたの会社がメンタルヘルスにフォーカスしているなら、毎週月曜日の朝に、クライアントや顧客に新しいリソースやエクササイズを提供することもできます。量より質を優先させることで、読者や顧客を圧倒することはありません。

### <font color="Darkcyan">Don't:スパムメール</font>

スパムとは、広範囲の受信者リストに対して大量に送信される迷惑メールのことを指します。常にスパムのように見せたり、聞こえるようにしたりすることは避けましょう。スパムは、しばしば大げさなフレーズや、事実であるにはあまりにも良いオファーを使用します。そのような言葉を使うと、スパムフォルダに入ってしまい、メールが届かなくなる可能性があります。

### <font color="MediumBlue">Do:リストをセグメントする</font>

セグメンテーションとは、購読者リストを、興味や地域、購入履歴などの基準に基づいて、より小さなグループに分けることを指します。基本的にセグメンテーションは、特定の人に合わせたメールを配信することで、確実にお客様に喜んでもらえるようにするための素晴らしい戦略です。

- 例えば、ある商品を販売する際、特定の性別の人によく売れることが分かった場合、購読者の性別でリストをセグメントすることができます。例えば、女性、男性、ノンバイナリ、その他の自称性別などです。
- また、誕生日プレゼントとして、お客様に10％の割引を提供したいとします。月別にリストをセグメントし、その月に誕生日を迎えるお客様にメールを送ることも簡単にできます。

セグメンテーションの一種として、時間帯によるセグメンテーションも非常に人気があります。メールマーケティング担当者の中には、顧客の受信箱に朝一番に届くのがベストだと考える人もいます。しかし、すべての顧客が同じ地域に住んでいるわけではありません。そのため、最適な時間帯に受信できるように、時間帯別にリストをセグメントすることもできます。


### <font color="Darkcyan">Don’t:同じメールを全ての購読者に送る</font>

同じようなメールを送り続けることは、貴重な購読者を無駄にしてしまうことになりかねません。完璧なメールは自分で作れるものではありません。時間、精度、編集、デザイン、そして最も重要なのは、テストを行うことです。

### <font color="MediumBlue">Do:様々なフォーマットでテストする</font>

メールのフォーマット、長さ、リンク、画像など、様々なテストを行いましょう。一回ですべてをうまくいくことはほとんど不可能です。また、ハイパーリンクを設定しても、読者はほとんどクリックしないかもしれません。そこで、次のメールでは、別のコンテンツへのリンクや、リンクの背景をもう少し詳しく説明してみるのもいいかもしれません。

### <font color="Darkcyan">Don't: 新しいことを試さずに同じ形式に固執する</font>

何が効果的かを見極め、新しいことに挑戦することを恐れないでください。ただひとつ、新しいことを試さずに同じ形式に固執するのは、やめたほうがいいでしょう。

# メール・キャンペーンのベストプラクティス

メール戦略を考える上で最も重要なことは、常にテストを行うことです。ネットで読んだり、友人から聞いたりしたベストプラクティスがあったとしても、それは特定のターゲット層には有効かもしれませんが、ほとんどの人は、リーチしようとしている相手が少し違っていて、そのベストプラクティスがあなたのターゲット層にはあまり響かないかもしれないのです。

常にやっておきたいことは、ABテスト、メールやキャンペーンの様々なバリエーションを用意し、定義したキャンペーンの成功指標をよく見て、どれが一番効果的かを把握し、将来に向けてその土台を築くことです。

また、メールの内容が古くなったり、陳腐化したりしないように注意しましょう。たとえ効果的なメールを見つけたとしても、常に新しい技術やイノベーションを試して統合し、常に最先端を行くことで、リーチするユーザーにとって最高の選択肢と最高のコンテンツを用意できるようにしたいものです。
デプロイしてサービスを公開①

<h1>デプロイしてサービスを公開</h1>

・デプロイとは、アプリを公開すること
・本番環境とは、ユーザーが使っている環境
→環境の種類：本番環境（Production）、ステージング環境（Staging）、開発環境（Development）

アプリを公開する方法
①ローカル環境開発
自分たちのパソコンの中に、rails,dbがある状態

②クラウドに公開する
自分のパソコンから、クラウドにアップロードする。そうすると、外部のユーザーが見ることができる。

クラウドにアップロードすることを、デプロイという

③クラウドの中身
クラウドの設定が大変
これを簡単にできるサービスHeroku

Herokuにデプロイする前に以下の2つの設定を行う必要がある
・画像をアップロードするためにクラウドストレージの設定
・データベースの設定
【データ基盤構築/Snowflake】外部ストレージのファイルでテーブルを生成する

# 今回の課題
AWSのS3に格納している`tsv`形式のファイルを使って、
Snowflakeにてテーブルを作成する流れを理解したい。

## 実装する流れ

`tsv`形式のファイルでSnowflakeにテーブルを作成する流れを簡単にまとめる。

### 1)S3バケットを指し示すステージを作成する
外部ストレージのファイルからSnowflakeのテーブルにデータをロードしたり、
テーブルから外部ストレージにデータをアンロードするためのステージを作成しておく。
```sql
create stage [database名].[schema名].[S3のbucket名]
url = 's3://******' -- S3のURL名
;
```

### 2)S3にあるファイルを確認してみる
ワークシートにて下記を実行する。
```sql
list @[database名].[schema名].[S3のbucket名];
```
結果、**ファイル名,ファイルのサイズ,MD5のハッシュ,最終更新日**が出力される。
抽出したいファイル名などを確認することができる。

### 3)外部ステージのファイルをクエリする。
ワークシートにて、下記のようなクエリを実行することで、
外部ストレージのファイルに対してクエリを実行してデータを抽出することができる。
ファイルにどんなデータが格納されているか事前に確認することができる。
```sql
select
    $1   -- ファイルの1列目
    , $2 -- ファイルの2列目
from
    @[database名].[schema名].[bucket名]/[ファイル名(例:「〜.tsv」)] -- クエリしたいファイルを指定
;
```
### 4)外部ストレージのファイルのデータを格納するテーブルを作っておく
下記のクエリを実行して、Snowflake内に外部ストレージのデータを格納するテーブルを生成しておく。
```sql
create or replace table sample_table(
    ID number, -- カラム名 データ型を指定している
    NAME varchar(15)
);
```
### 5)読み込む外部ストレージのファイルの形式を指定しておく
外部ストレージから読み込むファイルがどんな形式でデータを保持しているのか、下記のクエリを実行することで指定しておく。

今回は`tsv`形式のファイルなので、下記のように設定した。
```sql
create or replace file format sample_format
    type = csv
    field_delimiter = '\t' -- tab区切りの.tsvファイルを読み込むため
;
```
### 6)Snowflakeのテーブルに外部ストレージのデータを格納する
```sql
copy into sample_table
from @[database名].[schema名].[S3のbucket名]/[ファイル名(例:「〜.tsv」)]
file_format = sample_format -- 5)で指定したフォーマットを指定する
```

以上のような流れでクエリを実行して、
外部ストレージのファイルを使って、Snowflakeにテーブルを生成することができた。
就活のときに聞いた「主体性」とは何だったのか？

そろそろ、新卒の新入社員が入ってくる時期になりました。そして、就職活動が本格化する時期にもなりました。時々、社員座談会に出席して、思ったことがありました。就職活動をしているときに見たり聞いたりした「主体性」って結局なんだったのだとう？と。

就活の企業説明会では、求める人物像に必ずといっていいほど、「主体性がある人」「能動的な人」「自ら進んで行動する人」が掲げられていました。さらに、社員の方とお話をして、活躍している人の特徴を質問すると、だいたい「主体性のある人（意訳）」のような回答をもらいました。当時、「主体性って何だろう？」って思っていました。嚙み砕いて理解できていなかったように思います。

自分が社会人になって少し経験を積み、就活をしていた時とは別の景色を見ているので、あの就活のときの疑問の答え合わせをしてみしょうと思います。

※あくまで、個人的な意見となります。

# 就職活動をしていたときに考えていた「主体性」

就活当時「主体性」とは、**「積極性」** のことだと思っていました。
「自分から発言すること」のようなイメージでした。極端に言えば、「会議で自分の考えが言えて、発言回数が多いこと」です。

「能動的」、「自ら進んで～」などの言葉もそうですが、主体的な行動で一番イメージしやすかったのが「会議中の発言」だったからかもしれません。（ドラマの見過ぎですかね、、）

自分から行動を起こすイメージはあったのですが、もう少し正確にとらえる言葉やイメージをもっていませんでした。

# 社会人を少し経験した今の自分が考える「主体性」

社会人を少し経験して、就職活動の景色とは別の景色を見るようになりました。その自分が考えてみると、、

「主体性」とは、**「タスクを自分事に捉えて、最適解を探し続け、最後までやりきること」** です。

まず、「タスクを自分事に捉える」とは、その後の部分の前提です。タスクや役割を自分事に捉える、つまり、他人や環境のせいにするのではなく、自分にベクトルを向ける意味です。自分がやりきるぞ！って覚悟を決めることでもあります。

また、「最適解を探し続け」とは、行動を指します。ポイントなのは、「解答」ではなく、「最適解」であることです。結論は誰から与えられるものではなく、限りある制約の中でもっともベターな解決策だからです。そして、地味な作業だとしても、コツコツと進めることも大事なので、「探し続ける」という表現をしました。

さらに、「最後までやりきる」とは、結果を出すということです。過程が評価されることはあまりなく、お客様との約束を守れるなどの結果が求められるからです。

# 答え合わせ

**就活時に思い描いた「主体性」を採点すると、△です。**

社会人になって思う「主体性」にも「積極性」という要素は入っていると思いますが、「積極性」だけでは十分に説明しきれていないように思います。また、言うだけではなく、「最後までやりきる」という要素も欲しいです。

ただ、「自分から行動を起こす」というイメージを持てているのは、とてもよいです。活躍している社会人への解像度が上がると、具体的な言葉がはまるようになりますね。

# なぜ主体性のある人が活躍できているのか？

次の疑問です。なぜ主体性のある人が活躍できているのでしょうか？

それは、最適解を探し続け、最後までやりきる人は、質の高いアウトプットを出すからです。また、よい結果を出すので、周りからの信頼も高く、周りに良い影響を与えるからです。

例えば、主体性のある人は次のような動きをします。
リーダーが説明をして、主体性のある人にタスクを渡すときと仮定します。そのとき、↓の図のような事態が発生します。

![スライド1.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/6744ab91-6564-f1fc-0182-93c4fdc33901.jpeg)

言った/言ってない　はリーダーがタスクの内容を適切に言えているかです。また、聞けた/聞けていないはメンバーがタスクを適切に聞けているかを指します。この図に少し解釈を加えると、↓のようになります。

![スライド2.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/605915/c05aa0da-c3b1-5ec6-6655-cf1667b359d6.jpeg)

タスクを渡すときは、「言った/聞けた」状態になるのがあるべき姿です。ですが、実際、毎回過不足なく適切にタスクを渡せないことも多々あります。

主体性のある人は、この「あるべき姿」以外の事態を素早く察知して、自分から「あるべき姿」に近づける行動をします。だから、アウトプットの精度も高く、スピード感も早いです。この行動ができる人───主体性のあるにタスクを任せるのは、安心感があります。思うに、コミュニケーション能力が高いかどうかはあまり関係なく、目標に向かって、周囲を巻き込んで、前向きに取り組めているかどうかが鍵です。

# 主体性のある人がよくやっていること
次に、主体性のある人がよくやっていることをみていきましょう。
大きく分けると2点あります。1点目は、「報連相」がきちんとできていることです。就活時に思っていた「発言回数が多いこと」はあながち間違えではないようです。

主体性のある人は、聞かれる前に発信をしていることが多いです。その最たる例が報連相です。「進捗は大丈夫？」と聞かれる前に「質問いいですか？」といいますし、リーダーから進捗を聞かれなくても、「○○が完了しました。レビューをお願いします。」と連絡してきます。リーダーからすると、だいぶ助けられますね。

2点目は、気遣いができることです。気遣いは先読みができるから、必要なちょっとした心遣いができます。受け取った人のことまで考えていることが主体性のある人の特徴です。視野も広く、次のアクションまで気が配れますね。

＊

立場が変わると、考えってだいぶ変わるものなんですね。時間が経ってこのブログを見返したとき、どう変わっているか楽しみです。また、考えを整理してみると、「主体性」が就活の求める人物像に入っているのは納得しますね。

「主体性」のある人が、ずっと「主体性」ある状態でいられるかというと、疑問がつきます。生活リズムや、環境の影響を受けて、受け身になってしまうこともありそうです。次このテーマを書くなら、このあたりを整理してみたいです。

このありたいという姿はいつもイメージしておきたいですね。

最後まで読んでいただいた方、ありがとうございました。
Googleデジタルマーケティング＆Eコマース：メール・マーケティングにおけるSMARTゴール

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# メール・マーケティングにおけるSMARTゴール

マーケティングキャンペーン全体に対してSMARTゴールを設定することができます。しかし、より具体的に、ソーシャル、SEO、メール・マーケティングなどの目標を設定することもできます。では、メール・マーケティングにおけるSMARTゴールとはどのようなものでしょうか？

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/c5bde1ca-fb46-2570-0c4e-dfad4fa1d197.png" width="500">

### <font color="MediumBlue">具体的</font>

目標が具体的であれば、おそらく以下の質問にいくつか答えているはずです。

- 何を達成したいのか？
- なぜ、その目標なのか？
- 具体的な理由、目的、利益があるか？
- 誰が関わっているのか？受け手は誰か？
- ゴールはどこに届けられるべきか？
- 要件や制約は何か？

目標は、達成できたかどうかがわかるほど具体的でなければなりません。

- 例えば、アプリを開発している技術系企業のメールキャンペーンを作成するとします。あなたのチームはブランドを成長させたいと考えています。しかし、ブランドを成長させるというのは具体的な目標ではありません。
    - ブランドを成長させるとはどういうことでしょうか？
    - そもそも目標が具体的でない場合、ブランドを成長させたかどうかをどうやって判断するのでしょうか？
    - ***「メール・マーケティング・キャンペーンの期間中に、購読者リストに一定数の名前を追加すること」*** が目標になるのかもしれません。

### <font color="MediumBlue">測定可能</font>

目標が測定可能かどうかということでは、これが成功したかどうかを証明する根拠は何かと自問自答してみてください。

- 例えば、あなたのチームが、自社製品のニーズを証明するために、アプリのダウンロード数を増やす必要があると判断したとします。何回ダウンロードされれば十分でしょうか？100? 1,000? 10,000? 途中で追跡して測定できる数字を選びましょう。

### <font color="MediumBlue">達成可能</font>

目標は現実的なものでなければなりません。ただし、ポジティブな進歩や変化を確認したいので、ある程度チャレンジングな目標にしたいものです。

- アプリを開発しているハイテク企業の例に戻りましょう。あなたの会社のダウンロード数は通常週に300程度で、メールマーケティング・キャンペーンでさらにダウンロード数を増やしたいと考えている場合、あと何回のダウンロードが達成可能で、なおかつ挑戦的な目標でしょうか？ 達成不可能な目標とは、キャンペーン開始の最初の月に週間ダウンロード数を3倍にすることかもしれません。実現する可能性はありますが、現在の数字からすると、あなたの会社ではあまりありえないかもしれません。では、より達成可能な目標とは何でしょうか？
    - 例えば、***「キャンペーン開始1ヶ月で1.5倍、つまり1週間あたり450ダウンロードの成長を目指す」*** とします。

### <font color="MediumBlue">関連性</font>

具体的で、測定可能な、達成可能な目標ができたところで、その目標が適切かどうかを確認する必要があります。つまり、この目標を達成することに意味があるのでしょうか？メールマーケティングのゴールは、会社の価値観や全社的なゴールとどのように結びついているかを考える必要があります。

- この目標は、企業として何をしようとしているのかに合致していますか？
- 組織のニーズや優先順位に合っているか？

### <font color="MediumBlue">時間的制約</font>

これは、目標に期限があることを意味します。期限がなければ、自分が良いペースで前進しているかどうかを知る方法がありません。また、時間も指標として使用できるため、時間と指標は互いに密接に関係していることに留意してください。目標に期限をつけるとどうなるか見てみましょう。

- ここまでは、1週間あたりのアプリのダウンロード数を1.5倍、つまり450ダウンロード増やすことが目標であることがわかっています。この目標を達成するために、メールマーケティング・キャンペーンを実施し、購読者にまだアプリを持っていない場合はダウンロードするように呼びかけるとします。そして、このメールをまだ持っていない友人にもシェアしてもらう。このキャンペーンを3ヶ月間実施するとすると、今度は期限が追加されます。
    - ***「3カ月間でアプリの週間ダウンロード数を450件増やすこと」*** が目標です。


3ヶ月が終わるころには、1週間のダウンロード数が450件増えたかどうかがわかります。なぜなら、この目標は、具体的で、測定可能で、達成可能で、関連性があり、期限付きだからです。
記事投稿　アイキャッチ作成

<h1>アイキャッチの設定</h1>

①app/models/article.rb

      has_one_attached :eyecatch
②app/controllers/articles_controller.rb

      def article_params
        params.require(:article).permit(:title, :content, :eyecatch)
      end
eyecatchを追加
③app/views/articles/_form.html.haml

    %div
      = f.label :eyecatch, 'アイキャッチ'
    %div
      = f.file_field :eyecatch
④app/views/commons/_article.html.haml

    .card
        - if article.eyecatch.attached?
          .card_image
            = image_tag article.eyecatch

⑤app/views/articles/show.html.haml

      - if @article.eyecatch.attached?
        .article_image
          = image_tag @article.eyecatch
⑥app/assets/stylesheets/article.scss

    $container-padding: 16px;
    
    .article {
      background-color: white;
      margin: 16px 16px;
      padding: $container-padding $container-padding;
      box-shadow: 0px 4px 10px rgba(0, 0, 0, 0.25);
      position: relative;
    
      &_image {
        height: 180px;
        position: relative;
        overflow: hidden;
        margin: $container-padding * -1 $container-padding * -1 16px;
    
        img {
          position: absolute;
          top: 50%;
          left: 50%;
          -webkit-transform: translate(-50%, -50%);
          -ms-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
          width: 100%;
        }
      }
これで、画像も枠内に表示されるようになりました
いいねした記事一覧を表示

<h1>「いいね」した記事一覧を表示</h1>
①config/routes.rb

      resources :favorites, only: [:index]
②app/models/user.rb

      has_many :favorites_articles, through: :likes, source: :article

これで、自分がいいねした記事だけを取得できる！！
③app/controllers/favorites_controller.rb
作成

    Class FavoritesController < ApplicationController
      before_action :authenticate_user!
    
      def index
        @articles = current_user.favorites_articles
      end
    end
④app/views/favorites/index.html.haml
作成

    .container 
      %h2
        お気に入りの記事
      - @articles.each do |article|
        = render 'commons/article', article: article
        
⑤app/views/layouts/application.html.haml

      = link_to 'お気に入り', favorites_path
これで、お気に入りの一覧を表示できるようになりました👏
ChatGPTでSimulinkモデルを作ってみた (1)まずは簡単なモデルから

# はじめに
OpenAIのChatGPTを使ったプログラミングを試しています。
自然言語で要件を伝えれば、MATLABのサンプルプログラム程度は、簡単に作れるようです。(これはすごい❕）
それでは、Simulinkのブロック図をMATLABのコマンドを介して作ることができるのか❓、試してみます。

# ChatGPTへのプロンプト入力

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/323e50f9-6155-3ccd-c7a2-fd7f34941283.png)

~~~
MATLABで次の処理をするSimulinkモデルを作ってください
・コマンド文だけで作成する
・chatgpt2simlink.mdlで保存する
入力:x1,x2
出力:y=(x1+x2)*2
~~~

# ChatGPTの出力結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/decba087-69f6-2a19-385a-4dfc72956477.png)

~~~ MATLAB:Answer by GPT-4
% 新しいSimulinkモデルを作成
new_system('chatgpt2simulink');

% 入力ポートを追加
add_block('simulink/Ports & Subsystems/In1', 'chatgpt2simulink/X1');
add_block('simulink/Ports & Subsystems/In1', 'chatgpt2simulink/X2');

% 各入力ポートの位置を設定
set_param('chatgpt2simulink/X1', 'Position', [50, 50, 80, 70]);
set_param('chatgpt2simulink/X2', 'Position', [50, 130, 80, 150]);

% 加算ブロックを追加
add_block('simulink/Math Operations/Add', 'chatgpt2simulink/Add');
set_param('chatgpt2simulink/Add', 'Position', [150, 75, 190, 125]);

% 接続を作成
add_line('chatgpt2simulink', 'X1/1', 'Add/1');
add_line('chatgpt2simulink', 'X2/1', 'Add/2');

% 係数ブロック（Gain）を追加
add_block('simulink/Math Operations/Gain', 'chatgpt2simulink/Gain');
set_param('chatgpt2simulink/Gain', 'Position', [250, 85, 290, 115]);
set_param('chatgpt2simulink/Gain', 'Gain', '2');

% 接続を作成
add_line('chatgpt2simulink', 'Add/1', 'Gain/1');

% 出力ポートを追加
add_block('simulink/Ports & Subsystems/Out1', 'chatgpt2simulink/Y');
set_param('chatgpt2simulink/Y', 'Position', [350, 90, 380, 110]);

% 接続を作成
add_line('chatgpt2simulink', 'Gain/1', 'Y/1');

% モデルを保存
save_system('chatgpt2simulink', 'chatgpt2simulink.mdl');
~~~

# 実行結果
生成した Simulinkモデルを開いてみます。
もちろん実行することも可能です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329764/bf98fce3-3f35-6d3c-7498-4ad2c88b8ed1.png)

# さいごに
今回は、簡単なSimulinkモデルですが、ChatGPTで、MATLABを介してSimulinkモデルも作れそうなことがわかりました。😮
Puppeteerで特定のドメインだけ通信する方法

# 発端

最近とあるスクレイピンングが失敗するようになったのでヘッドレスをfalseにして画面を確認してみました
どうやら外部ソースの読み込みに時間がかかっており、そのせいで10秒のタイムアウトに引っかかっていた模様

今回の対象はHTMLをロードした時点で必要な情報は抜き出せる状態だったので、余計なドメインのリクエストを行わないようにしようと考えました

# 対処方法

元々画像のリクエストは行わないようにしていたので、特定ドメイン以外のリクエストも行わないような処理を追加しました
ソースはこんな感じになります

```javascript
  await page.setRequestInterception(true);
  page.on("request", request => {
    if (request.resourceType() === "image") {
      request.abort();
    } else if (!request.url().includes("example.com")) {
      request.abort();
    } else {
      request.continue();
    }
  });
```

`request.url().includes("example.com")` でURLに(この場合は) `example.com` が含まれているかチェックしています

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/String/includes

含まれている場合はtrueが返るので反転させて含まれない場合にabortするようにしています

# 結果

爆速でスクレイピング完了するようになりました
今後は他のスクレイピングのコードも不要なリクエストをなるべく行わないように直していきたいです

---

それでは良いスクレイピングライフを
Googleデジタルマーケティング＆Eコマース：メール・マーケティングとは

# はじめに

”Googleデジタルマーケティング＆Eコマース プロフェッショナル認定証"　の受講が完了しました(2022/3/3)。私がこのコースから得られた素晴らしい体験を、テーマごとに分割して、わかりやすくご紹介しています。興味を持たれた方は、是非下記を受講してみてください。

https://jp.coursera.org/professional-certificates/google-digital-marketing-ecommerce

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/bc50df6f-2af4-4c58-96fb-829e0752d0af.png" width="800">

# メール・マーケティングとは

世界人口の半分以上にあたる40億人以上がEメールを使っています。世界人口の50％がやっていることは、他にあまりありません。だから、メール・マーケティングがこれほど効果的なのです。また、メール・マーケティングは1ドル使うごとに42ドルの投資収益率（ROI）があるので、1ドル使えば、平均42ドルが戻ってくることになります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/42b4d4a4-45e7-57ce-b9ba-497c53fd6a1d.png" width="500">

メール・マーケティングとは、企業が

- 情報提供
- 販売促進
- 自社ブランドのコミュニティ形成

のために、ブランドのメールメッセージをメール購読者のリストに配信することです。

- 潜在顧客
- 新規顧客
- 既存顧客

にサービス、製品、商品、ストーリーをアピールするのに非常に有効なツールであり、メール・マーケティングキャンペーンを作成するのも実に楽しいものです。

# メール・マーケティングの効果

メールマーケティングの効果を明確にするために、少し数字の話をしましょう。

デジタルマーケティングやeコマースの専門家として、投資収益率やROIという言葉をよく耳にすることでしょう。ROIとは、純利益または儲けたお金と、投資または使ったお金の比率のことで、ROIは投資の効率性を評価するために使われます。

ROIが高いということは、使ったお金よりも稼いだお金の方が多く、キャンペーンが効果的だったということでしょう。つまり、1ドル使うごとに42ドル稼いだとすると、推定ROIは4,200%ということになります。メールマーケティングは非常に効果的であることが証明されています。

# メール・マーケティングが効果的である理由

### <font color="MediumBlue">メールの寿命</font>

インターネットユーザーの多さもさることながら、メール・マーケティングがこれほどまでに効果的であることを証明したもう一つの理由は、メールの寿命です。Eメールは半世紀近く前から存在しており、最初のEメールが送信された1978年当時とは少し様子が違うかもしれませんが、一般的なコンセプトは変わっていません。

Data and Marketing Associationの調査によると、51％の人が10年以上同じメールを使い続けていることが分かっています。つまり、マーケティング担当者としては、一度購読者リストに登録した人は、10年間顧客であり続ける可能性があるのです。

### <font color="MediumBlue">メールから得られるインサイト</font>

メール・マーケティングでもう一つ効果的だと思うのは、キャンペーン中やキャンペーン後に収集したインサイトを活用することです。インサイトとは、リサーチやデータ分析によって発見された情報のことで、メール戦略に直接役立つアクションを起こすことができます。

MailchimpやHubSpotなどのメールマーケティングオートメーションプラットフォームを使用している場合、数クリックでインサイトを収集、分析、学習することが可能です。


### <font color="MediumBlue">使いやすさ</font>

メール・マーケティングに関しては、多くのプラットフォームやプログラム、ツールがあなたのために多くの仕事をこなしてくれます。

# メール・マーケティングのツール

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2358573/6098db59-5b3b-b4f4-e1ab-d589c7eaf321.png" width="500">


HubSpot、Mailchimp、Salesforceなどのツールは、プロセスを自動化するので、デザイン、フォーマット、ハイパーリンクについてすべてを知っておく必要はありません。

ですから、30年前からメールのエキスパートだった人も、数週間前に初めてメールを受け取ったばかりの人も、優れたメールマーケティング担当者になるために必要な指導を受けることができ、しかもそれは時間が経つにつれて自動化されていくだけなのです。
記事に「いいね」機能③

<h1>いいねを解除する機能</h1>
①config/routes.rb
テーブルから削除すれば、いいねが解除できるのでは？

    resource :like, only: [:create, :destroy]
destroy追加

②app/controllers/likes_controller.rb

      def destroy
        article =Article.find(params[:article_id])
        like = article.likes.find_by!(user_id: current_user.id)
        like.destroy!
        redirect_to article_path(article)
      end

③app/views/articles/show.html.haml

    = link_to article_like_path(@article), data: { method: 'delete' } do
を追加
これで、削除機能が追加できました👏
【Java SE 7】bufferedreader/writerを使用した後はclose処理を挟もう

「close処理最後に挟まないとだめだよ」と指摘を受けたので調べがてらメモに📝

### bufferedreader/writerとは？
Javaにあるクラスの一つ、テキストファイルやCSVファイル取り込みや書きこみをやってくれる。

### 使用例
CSVからファイルを取り込んで1行ずつ処理する例
~~~Java
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        BufferedReader br = null;
        try {
            br = new BufferedReader(new FileReader("example.csv"));
            String line;
            while ((line = br.readLine()) != null) {
                String[] values = line.split(",");
                String A = values[0];
                String B = values[1];
                String C = values[2];
                //処理
                //・・・
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (br != null) {
                br.close();
            }
        }
    }
}

~~~

でました最後の
~~~Java
br.close();
~~~
これを挟まないと最悪メモリリークを起こしてクラッシュしてしまうとか・・・

### どうしてこんなことに？
bufferedreader/writerは自動でクローズ処理を行ってくれないのが原因らしい

**外部ファイルを参照してそのまま開きっぱなし**
→
**他のプログラムが呼び出せない/メモリも枯渇する**
→
🔥

### おわりに

調べたところJava8からはtry-with-resources文ができ、そちらを使えばクローズ処理も自動で勝手にやってくれるのでコンパクトに書けるみたい。

きっともっと便利なライブラリとかいろいろあるだろうしもう少し調べてみたいね