- 投稿日:2020-07-08T21:57:36+09:00
$ npm run watch しようとしたら Sorry, there's a problem with nodist. Couldn't resolve node version ~~~と出たときの対処法
課題
$ npm run watchしようとしたら
Sorry, there's a problem with nodist. Couldn't resolve node version spec %s: %s 4.5.0 Couldn't find any matching version
と怒られた。なんでだろうと調べたりいろいろ試したりしましたが小1時間ほどハマり心優しい同僚に助けてもらったので覚書しておきます。
池田さんありがと。対処法
1. nodeのバージョンを確認する
node -v v0.0.02. .node-version(node-dev-env.node-version)を開いて記載されているバージョンを確認する
私の場合「v11.13.0」と記載されていました。
このバージョンとnode-v したときのバージョンを合わせてやります。3. 今適用されているnode.jsのバージョンを確認
$ nodist (x64) > 4.5.0 (C:\xampp\htdocs\hogehoge.jp\node-dev-env\.node-version: v4.5.0) 10.15.1 (global: 10.15.1) 11.0.0 11.13.0つまり現在のnode.jsのバージョンが4.5.0になってしまっている。(私の場合11.13.0も一応存在はしました)
4. v11.13.0がなければインストール
$ nodist + v11.13.05. v11.13.0がインストール済になったので切り替える
$ nodist v11.13.0 v11.13.0 v11.13.0 (global)6. node.jsのバージョンが切り替わったか確認しましょ
$ node -v v11.13.0これで切り替え完了!
7. 頼む、動いてくれ!
$ npm run watch8. それでも動かなかったとき
魔法の呪文
(使用中の node にあったバージョンの npm をインストールしてくれます)$ nodist npm match9. それでもまだ動かなかったとき
おまじない
(npm config スクリプトの設定でパスを先頭に追加)$ npm config set scripts-prepend-node-path trueからの
npm config listで
; userconfig C:\Users\whatthehell\.npmrc scripts-prepend-node-path = trueが追加されていることを確認します。
そしてnmp run watch終わり
ここまでの手順でわたしは動きました。
参考:
nodist 環境下で npm script 使用時にエラー – blog
https://www.namu-ws.com/blog/dev/nodist-npm-script-errornpm がどうしてもエラーになってしまったら - Qiita
https://qiita.com/tana08/items/d50212a1919308cc1480Laravel-Mixコンパイル時のcode ELIFECYCLEエラーに対応する - Qiita
https://qiita.com/ishizukih/items/9673e709832dacaa5155nodistでnode.jsのバージョン管理をする | IT王子の技術ブログ
https://www.it-ouji.com/2019/10/26/nodist%E3%81%A7node-js%E3%81%AE%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%92%E3%81%99%E3%82%8B/
- 投稿日:2020-07-08T19:01:45+09:00
Node.jsで動くオンライン対戦リバーシを作ってみた
ソース
https://github.com/inari2019/osero
正直かなり醜いコードだと思ってます。実際に作ったもの
http://pocketmikan.ml:3000/
※予期なくリンクが変わったり、封鎖している可能性があります。環境
バックエンド:Node.js(Express.js)
ソケット通信:socket.io
フロントエンド:javascript
描画:HTML5 Canvas構成
コードの解説
大体のことはgithubのコードに書いてるので割愛
実行の流れとしては
プレイヤーから駒を置く場所を受け取る(index,js)
↓
駒を置けるか確認したのち駒を置く(modules/gameclass.jsのput関数)
↓
置いた後の盤面データなどをプレイヤーに送信(index.js)リバーシのアルゴリズム
https://techacademy.jp/magazine/22767
まんまこれですすみませんでした終わりに
自分でもわかるぐらいひどいコードです。改善の余地しかありませんが、テストがあるので改善出来てません。
- 投稿日:2020-07-08T17:27:36+09:00
AWSサーバーレス連絡フォームの作り方?(AWS Lambda、API Gateway、SES】)
AWS S3にサイトを安くて簡単にホスティングできますが、S3は静的なサイトしかホスティングできないですので、従来ならバックエンド処理が必要となるフォーム送信の実装などは難しそうですね。しかし、クラウド時代ではそんな心配はありません!ソリューションはサーバーレスアーキテクチャです!AWSはすでに色々なサーバーレス構築のツールを提供しています。
今回はユーザからお問い合わせやフィードバックを送信するたびに、任意な宛先に通知メールを送信するシンプルなサーバーレスメールサービスを一緒に作ります。AWS LambdaとAPI Gatewayを利用し、簡単なAWSサーバーレス構築を紹介します。
処理の流れとしては、ユーザーから連絡フォームより入力した情報を収集し、クライアント側のブラウザからAmazon API Gateway RESTfulサービスに投稿します。Amazon API Gatewayは、収集されたユーザー情報をAWS lambda関数に渡します。AWS Lambda関数は、Eメールを自動生成し、Amazon SESを使用してメールサーバーに転送します。
1.フォームを作成
index.html
ファイルを作成し、下記のコードを貼り付けます。index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>連絡フォーム</title> <script src="script.js"></script> <link rel="stylesheet " href="style.css "> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js "></script> </head> <body> <h1>連絡フォーム</h1> <form id="contact-form" method="post"> <h4>名前:</h4> <input type="text" id="name-input" placeholder="お名前を入力してください。" class="form-control" /><br /> <h4>件名:</h4> <input type="subject " id="subject " " placeholder="お名前を入力してください。 " class="form-control " /><br /> <h4>メール:</h4> <input type="email " id="email-input " placeholder="メールを入力してください。 " class="form-control " /><br /> <h4>メッセージ:</h4> <textarea id="description-input " rows="3 " placeholder="メッセージを入力してください。 " class="form-control "></textarea><br /> <div class="button-wrapper "><button type="button " onClick="submitToAPI(event) " class="btn btn-lg ">送信</button></div> </form> </body> </html>
- 見た目はあまり良くないですので、改善しましょう。
style.css
を同じフォルダ内で作成し、下記のコードを貼り付けます。style.css* { box-sizing: border-box; } body { text-align: center; color: rgb(255, 255, 255); background-color: #194680; padding-top: 20px; } #contact-form { margin: auto; text-align: left; padding: 20px; max-width: 430px; border: white solid 2px; border-radius: 10px; } button { text-align: center; margin-top: 20px; font-size: 18px; border: white solid 2px; background-color: white; border-radius: 5px; } .button-wrapper { text-align: center; } input, textarea { width: 380px; } textarea { height: 200px; padding: 10px; } input { height: 35px; }2. AWS Lambda関数の定義
次の画面の
関数コード
に下記のコードを切り替えます。index.jsvar AWS = require('aws-sdk'); var ses = new AWS.SES(); //宛先のメールアドレスを入力してください。 var RECEIVER = 'example-receiver@gmail.com'; //送信先のメールアドレスを入力してください。 //送信先のメールはAWSに認証登録する必要があります。 var SENDER = 'example-sender@gmail.com'; //クライアントへのレスポンスヘッダーを設定 var response = { "isBase64Encoded": false, "headers": { "Content-Type": 'application/json', "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Accept", "Access-Control-Allow-Methods": "POST,GET,OPTIONS", "Access-Control-Allow-Origin": "*", }, "statusCode": 200, "body": "{\"result\": \"テスト成功です!\"}" }; exports.handler = function(event, context, callback) { console.log('受理したイベント:', event); sendEmail(event, function(err, data) { context.done(err, null); }); callback(null, response); }; //メール送信処理 function sendEmail(event, done) { var params = { Destination: { ToAddresses: [ RECEIVER ] }, Message: { Body: { Text: { Data: '● お名前: ' + event.name + '\n● 件名: ' + event.subject + '\n● メール: \n' + event.email + '\n● 内容: \n' + event.desc, Charset: 'UTF-8' } }, Subject: { Data: event.name + 'からの連絡フォームが来ました!', Charset: 'UTF-8' } }, Source: SENDER }; ses.sendEmail(params, done); return { response, body: JSON.stringify(params), statusCode: 200 } }
- 同じ
Lambda管理
画面で、上にスクロールし、アクセス権限
のタブに切り替え、ロール名
のリンクをクリックします。
- 当関数のIAMポリシーをSES権限を追加します。IAM画面で該当ポリシーをクリックし
ポリシーを編集
->JSON
のフォーマットに切り替えし、下記のコードを追加します。{ "Sid": "FormPolicy", "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" }3. APIゲートウェイでAPI構築
- 次の画面はREST APIの選択のままで、API名前を任意に付けます。
- 次の画面は上にある
アクション
をクリックし、メッソド作成
をクリック、POST
を選択します。
- 右側の設定画面では、
統合タイプ
はLambda
で、Lambda関数
は先ほど作成したものを選択します。
- CORSエラーにならないように、CORS機能も有効にします。
アクション
のドロップダウンをCORS有効化
をクリックし、設定はそのままで保存します。
- API Gatewayの最新アップデートでは、ゲートウェイのレスポンスも設定しないと、CORSエラーが発生するため、設定しましょう。右の
ゲートウェイレスポンス
→DEFAULT 4XX
→編集
の順番にナビゲートします
- レスポンスヘッダーに下記の値を追加し、保存します。
Access-Control-Allow-Origin: '*'これでAPIの構築は完了です。
4. SES送信用のメール検証登録
スパームなどの悪用を防ぐため、AWSよりメール送信機能を利用するには、検証登録が必要です。下記の手順を従って、送信用のメールをAWSに検証登録します:
verified
の状態になったら、OKです!{ "name": "value1", "subject": "value2", "email": "test@test.com", "desc": "value3" }5.全コンポーネントを連携する
- 最後のステップではすべてを繋ぎます!
index.html
と同じいフォルダでscript.js
を作成し、下記のコードを貼り付け、var URL
とurl
の2ヶ所に先ほど設定したAPI GatewayのエンドポイントURLを差し替えます。script.jsfunction submitToAPI(e) { e.preventDefault(); //設定したAPI GatewayのエンドポイントURLをここに入れます。 var URL = "API-GATEWAY-ENDPOINT-URL"; //フォームの入力値をチェック var name = /[A-Za-z]{1}[A-Za-z]/; if (!name.test($("#name-input").val())) { alert("2文字以上記入してください。"); return; } var subject = /[A-Za-z]{1}[A-Za-z]/; if (!subject.test($("#subject").val())) { alert("2文字以上記入してください。"); return; } if ($("#email-input").val() == "") { alert("メールを入力してください。"); return; } var email = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,6})?$/; if (!email.test($("#email-input").val())) { alert("メールアドレスは正しくありません。"); return; } var name = $("#name-input").val(); var subject = $("#subject").val(); var email = $("#email-input").val(); var desc = $("#description-input").val(); var data = { name: name, subject: subject, email: email, desc: desc }; $.ajax({ type: "POST", //設定したAPI GatewayのエンドポイントURLをここに入れます。 url: "API-GATEWAY-ENDPOINT-URL", dataType: "json", crossDomain: "true", contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function() { // フォームをクリアし、送信成功のメッセージを表示する alert("メッセージが送信されました!"); document.getElementById("contact-form").reset(); location.reload(); }, error: function() { // 送信エラーのメッセージを表示する alert("メッセージ送信失敗!"); } }); }6. 結論
これでAmazon S3で静的Webサイトをホストしても、AWSアーキテクチャを利用し、ユーザよりサイト管理者へフォーム送信機能を実装できました!
初投稿です、、いかがでしょうか、、(´・ω・`)
コメント、フィードバックなど大変モチベーションになりますので、
是非よろしくお願いいたします!
それでは、また今度! (`・∀・´)ノ
- 投稿日:2020-07-08T17:27:36+09:00
AWSサーバーレス連絡フォームの作り方?(AWS Lambda、API Gateway、SES)
AWS S3にサイトを安くて簡単にホスティングできますが、S3は静的なサイトしかホスティングできないですので、従来ならバックエンド処理が必要となるフォーム送信の実装などは難しそうですね。しかし、クラウド時代ではそんな心配はありません!ソリューションはサーバーレスアーキテクチャです!AWSはすでに色々なサーバーレス構築のツールを提供しています。
今回はユーザからお問い合わせやフィードバックを送信するたびに、任意な宛先に通知メールを送信するシンプルなサーバーレスメールサービスを一緒に作ります。AWS LambdaとAPI Gatewayを利用し、簡単なAWSサーバーレス構築を紹介します。
処理の流れとしては、ユーザーから連絡フォームより入力した情報を収集し、クライアント側のブラウザからAmazon API Gateway RESTfulサービスに投稿します。Amazon API Gatewayは、収集されたユーザー情報をAWS lambda関数に渡します。AWS Lambda関数は、Eメールを自動生成し、Amazon SESを使用してメールサーバーに転送します。
1.フォームを作成
index.html
ファイルを作成し、下記のコードを貼り付けます。index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>連絡フォーム</title> <script src="script.js"></script> <link rel="stylesheet " href="style.css "> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js "></script> </head> <body> <h1>連絡フォーム</h1> <form id="contact-form" method="post"> <h4>名前:</h4> <input type="text" id="name-input" placeholder="お名前を入力してください。" class="form-control" /><br /> <h4>件名:</h4> <input type="subject " id="subject " " placeholder="お名前を入力してください。 " class="form-control " /><br /> <h4>メール:</h4> <input type="email " id="email-input " placeholder="メールを入力してください。 " class="form-control " /><br /> <h4>メッセージ:</h4> <textarea id="description-input " rows="3 " placeholder="メッセージを入力してください。 " class="form-control "></textarea><br /> <div class="button-wrapper "><button type="button " onClick="submitToAPI(event) " class="btn btn-lg ">送信</button></div> </form> </body> </html>
- 見た目はあまり良くないですので、改善しましょう。
style.css
を同じフォルダ内で作成し、下記のコードを貼り付けます。style.css* { box-sizing: border-box; } body { text-align: center; color: rgb(255, 255, 255); background-color: #194680; padding-top: 20px; } #contact-form { margin: auto; text-align: left; padding: 20px; max-width: 430px; border: white solid 2px; border-radius: 10px; } button { text-align: center; margin-top: 20px; font-size: 18px; border: white solid 2px; background-color: white; border-radius: 5px; } .button-wrapper { text-align: center; } input, textarea { width: 380px; } textarea { height: 200px; padding: 10px; } input { height: 35px; }2. AWS Lambda関数の定義
次の画面の
関数コード
に下記のコードを切り替えます。index.jsvar AWS = require('aws-sdk'); var ses = new AWS.SES(); //宛先のメールアドレスを入力してください。 var RECEIVER = 'example-receiver@gmail.com'; //送信先のメールアドレスを入力してください。 //送信先のメールはAWSに認証登録する必要があります。 var SENDER = 'example-sender@gmail.com'; //クライアントへのレスポンスヘッダーを設定 var response = { "isBase64Encoded": false, "headers": { "Content-Type": 'application/json', "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Accept", "Access-Control-Allow-Methods": "POST,GET,OPTIONS", "Access-Control-Allow-Origin": "*", }, "statusCode": 200, "body": "{\"result\": \"テスト成功です!\"}" }; exports.handler = function(event, context, callback) { console.log('受理したイベント:', event); sendEmail(event, function(err, data) { context.done(err, null); }); callback(null, response); }; //メール送信処理 function sendEmail(event, done) { var params = { Destination: { ToAddresses: [ RECEIVER ] }, Message: { Body: { Text: { Data: '● お名前: ' + event.name + '\n● 件名: ' + event.subject + '\n● メール: \n' + event.email + '\n● 内容: \n' + event.desc, Charset: 'UTF-8' } }, Subject: { Data: event.name + 'からの連絡フォームが来ました!', Charset: 'UTF-8' } }, Source: SENDER }; ses.sendEmail(params, done); return { response, body: JSON.stringify(params), statusCode: 200 } }
- 同じ
Lambda管理
画面で、上にスクロールし、アクセス権限
のタブに切り替え、ロール名
のリンクをクリックします。
- 当関数のIAMポリシーをSES権限を追加します。IAM画面で該当ポリシーをクリックし
ポリシーを編集
->JSON
のフォーマットに切り替えし、下記のコードを追加します。{ "Sid": "FormPolicy", "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" }3. APIゲートウェイでAPI構築
- 次の画面はREST APIの選択のままで、API名前を任意に付けます。
- 次の画面は上にある
アクション
をクリックし、メッソド作成
をクリック、POST
を選択します。
- 右側の設定画面では、
統合タイプ
はLambda
で、Lambda関数
は先ほど作成したものを選択します。
- CORSエラーにならないように、CORS機能も有効にします。
アクション
のドロップダウンをCORS有効化
をクリックし、設定はそのままで保存します。
- API Gatewayの最新アップデートでは、ゲートウェイのレスポンスも設定しないと、CORSエラーが発生するため、設定しましょう。右の
ゲートウェイレスポンス
→DEFAULT 4XX
→編集
の順番にナビゲートします
- レスポンスヘッダーに下記の値を追加し、保存します。
Access-Control-Allow-Origin: '*'これでAPIの構築は完了です。
4. SES送信用のメール検証登録
スパームなどの悪用を防ぐため、AWSよりメール送信機能を利用するには、検証登録が必要です。下記の手順を従って、送信用のメールをAWSに検証登録します:
verified
の状態になったら、OKです!{ "name": "value1", "subject": "value2", "email": "test@test.com", "desc": "value3" }5.全コンポーネントを連携する
- 最後のステップではすべてを繋ぎます!
index.html
と同じいフォルダでscript.js
を作成し、下記のコードを貼り付け、var URL
とurl
の2ヶ所に先ほど設定したAPI GatewayのエンドポイントURLを差し替えます。script.jsfunction submitToAPI(e) { e.preventDefault(); //設定したAPI GatewayのエンドポイントURLをここに入れます。 var URL = "API-GATEWAY-ENDPOINT-URL"; //フォームの入力値をチェック var name = /[A-Za-z]{1}[A-Za-z]/; if (!name.test($("#name-input").val())) { alert("2文字以上記入してください。"); return; } var subject = /[A-Za-z]{1}[A-Za-z]/; if (!subject.test($("#subject").val())) { alert("2文字以上記入してください。"); return; } if ($("#email-input").val() == "") { alert("メールを入力してください。"); return; } var email = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,6})?$/; if (!email.test($("#email-input").val())) { alert("メールアドレスは正しくありません。"); return; } var name = $("#name-input").val(); var subject = $("#subject").val(); var email = $("#email-input").val(); var desc = $("#description-input").val(); var data = { name: name, subject: subject, email: email, desc: desc }; $.ajax({ type: "POST", //設定したAPI GatewayのエンドポイントURLをここに入れます。 url: "API-GATEWAY-ENDPOINT-URL", dataType: "json", crossDomain: "true", contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function() { // フォームをクリアし、送信成功のメッセージを表示する alert("メッセージが送信されました!"); document.getElementById("contact-form").reset(); location.reload(); }, error: function() { // 送信エラーのメッセージを表示する alert("メッセージ送信失敗!"); } }); }6. 結論
これでAmazon S3で静的Webサイトをホストしても、AWSアーキテクチャを利用し、ユーザよりサイト管理者へフォーム送信機能を実装できました!
初投稿です、、いかがでしょうか、、(´・ω・`)
コメント、フィードバックなど大変モチベーションになりますので、
是非よろしくお願いいたします!
それでは、また今度! (`・∀・´)ノ
- 投稿日:2020-07-08T17:27:36+09:00
AWS Lambda、Amazon API Gateway、Amazon SESを使用し、S3静的ウェブサイトの動的な連絡フォームを作りましょう!?
AWS S3にサイトを安く簡単にホスティングできますが、S3は静的なサイトしかホスティングできないですので、従来ならバックエンド処理が必要になるフォーム送信の実装などは難しそうですね。しかし、クラウド時代ではそんな心配はありません!それははサーバーレスアーキテクチャです!AWSはすでに色々なサーバーレス構築のツールを提供しています。
この投稿ではユーザからお問い合わせやフィードバックを送信するたびに、任意な宛先に通知メルを送信するシンプルなサーバーレスメールサービスを一緒に作ります。AWS Lambdaと API Gatewayを利用し、AWSサーバーレスの構築を学びましょう!
処理の流れとしては、ユーザーから連絡フォームより入力した情報を収集し、クライアント側のブラウザからAmazon API Gateway RESTfulサービスに投稿します。Amazon API Gatewayは、収集されたユーザー情報をAWS lambda関数に渡します。AWS Lambda関数は、Eメールを自動生成し、Amazon SESを使用してメールサーバーに転送します。
1.フォームを作成
index.html
ファイルを作成し、下記のコードを貼り付けます。index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>連絡フォーム</title> <script src="script.js"></script> <link rel="stylesheet " href="style.css "> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js "></script> </head> <body> <h1>連絡フォーム</h1> <form id="contact-form" method="post"> <h4>名前:</h4> <input type="text" id="name-input" placeholder="お名前を入力してください。" class="form-control" /><br /> <h4>件名:</h4> <input type="subject " id="subject " " placeholder="お名前を入力してください。 " class="form-control " /><br /> <h4>メール:</h4> <input type="email " id="email-input " placeholder="メールを入力してください。 " class="form-control " /><br /> <h4>メッセージ:</h4> <textarea id="description-input " rows="3 " placeholder="メッセージを入力してください。 " class="form-control "></textarea><br /> <div class="button-wrapper "><button type="button " onClick="submitToAPI(event) " class="btn btn-lg ">送信</button></div> </form> </body> </html>
- 見た目はあまり良くないですので、改善しましょう。
style.css
を同じフォルダ内で作成し、下記のコードを貼り付けます。style.css* { box-sizing: border-box; } body { text-align: center; color: rgb(255, 255, 255); background-color: #194680; padding-top: 20px; } #contact-form { margin: auto; text-align: left; padding: 20px; max-width: 430px; border: white solid 2px; border-radius: 10px; } button { text-align: center; margin-top: 20px; font-size: 18px; border: white solid 2px; background-color: white; border-radius: 5px; } .button-wrapper { text-align: center; } input, textarea { width: 380px; } textarea { height: 200px; padding: 10px; } input { height: 35px; }2. AWS Lambda関数の定義
次の画面の
関数コード
に下記のコードを切り替えます。index.jsvar AWS = require('aws-sdk'); var ses = new AWS.SES(); //宛先のメールアドレスを入力してください。 var RECEIVER = 'example-receiver@gmail.com'; //送信先のメールアドレスを入力してください。 //送信先のメールはAWSに認証登録する必要があります。 var SENDER = 'example-sender@gmail.com'; //クライアントへのレスポンスヘッダーを設定 var response = { "isBase64Encoded": false, "headers": { "Content-Type": 'application/json', "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Accept", "Access-Control-Allow-Methods": "POST,GET,OPTIONS", "Access-Control-Allow-Origin": "*", }, "statusCode": 200, "body": "{\"result\": \"テスト成功です!\"}" }; exports.handler = function(event, context, callback) { console.log('受理したイベント:', event); sendEmail(event, function(err, data) { context.done(err, null); }); callback(null, response); }; //メール送信処理 function sendEmail(event, done) { var params = { Destination: { ToAddresses: [ RECEIVER ] }, Message: { Body: { Text: { Data: '● お名前: ' + event.name + '\n● 件名: ' + event.subject + '\n● メール: \n' + event.email + '\n● 内容: \n' + event.desc, Charset: 'UTF-8' } }, Subject: { Data: event.name + 'からの連絡フォームが来ました!', Charset: 'UTF-8' } }, Source: SENDER }; ses.sendEmail(params, done); return { response, body: JSON.stringify(params), statusCode: 200 } }
- 同じ
Lambda管理
画面で、上にスクロールし、アクセス権限
のタブに切り替え、ロール名
のリンクをクリックします。
- 当関数のIAMポリシーをSES権限を追加します。IAM画面で該当ポリシーをクリックし
ポリシーを編集
->JSON
のフォーマットに切り替えし、下記のコードを追加します。{ "Sid": "FormPolicy", "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" }3. APIゲートウェイでAPI構築
- 次の画面はREST APIの選択のままで、API名前を任意に付けます。
- 次の画面は上にある
アクション
をクリックし、メッソド作成
をクリック、POST
を選択します。
- 右側の設定画面では、
統合タイプ
はLambda
で、Lambda関数
は先ほど作成したものを選択します。
- CORSエラーにならないように、CORS機能も有効にします。
アクション
のドロップダウンをCORS有効化
をクリックし、設定はそのままで保存します。
- API Gatewayの最新アップデートでは、ゲートウェイのレスポンスも設定しないと、CORSエラーが発生するため、設定しましょう。右の
ゲートウェイレスポンス
→DEFAULT 4XX
→編集
の順番にナビゲートします
- レスポンスヘッダーに下記の値を追加し、保存します。
Access-Control-Allow-Origin: '*'これでAPIの構築は完了です。
4. SES送信用のメール検証登録
スパームなどの悪用を防ぐため、AWSよりメール送信機能を利用するには、検証登録が必要です。下記の手順を従って、送信用のメールをAWSに検証登録します:
verified
の状態になったら、OKです!5.全コンポーネントを連携する
- 最後のステップではすべてを繋ぎます!
index.html
と同じいフォルダでscript.js
を作成し、下記のコードを貼り付け、var URL
とurl
の2ヶ所に先ほど設定したAPI GatewayのエンドポイントURLを差し替えます。script.jsfunction submitToAPI(e) { e.preventDefault(); //設定したAPI GatewayのエンドポイントURLをここに入れます。 var URL = "API-GATEWAY-ENDPOINT-URL"; //フォームの入力値をチェック var name = /[A-Za-z]{1}[A-Za-z]/; if (!name.test($("#name-input").val())) { alert("2文字以上記入してください。"); return; } var subject = /[A-Za-z]{1}[A-Za-z]/; if (!subject.test($("#subject").val())) { alert("2文字以上記入してください。"); return; } if ($("#email-input").val() == "") { alert("メールを入力してください。"); return; } var email = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,6})?$/; if (!email.test($("#email-input").val())) { alert("メールアドレスは正しくありません。"); return; } var name = $("#name-input").val(); var subject = $("#subject").val(); var email = $("#email-input").val(); var desc = $("#description-input").val(); var data = { name: name, subject: subject, email: email, desc: desc }; $.ajax({ type: "POST", //設定したAPI GatewayのエンドポイントURLをここに入れます。 url: "API-GATEWAY-ENDPOINT-URL", dataType: "json", crossDomain: "true", contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function() { // フォームをクリアし、送信成功のメッセージを表示する alert("メッセージが送信されました!"); document.getElementById("contact-form").reset(); location.reload(); }, error: function() { // 送信エラーのメッセージを表示する alert("メッセージ送信失敗!"); } }); }6. 結論
これでAmazon S3で静的Webサイトをホストしても、AWSアーキテクチャを利用し、ユーザよりサイト管理者へフォーム送信機能を実装できました!
初投稿です、、いかがでしょうか(´・ω・`)
コメント、フィードバックなど是非よろしくお願いいたします!
それでは、また今度! (`・∀・´)ノ
- 投稿日:2020-07-08T17:27:36+09:00
AWS Lambda、API Gateway、SESを使用し、S3静的ウェブサイトの動的な連絡フォームを作りましょう!?
AWS S3にサイトを安くて簡単にホスティングできますが、S3は静的なサイトしかホスティングできないですので、従来ならバックエンド処理が必要となるフォーム送信の実装などは難しそうですね。しかし、クラウド時代ではそんな心配はありません!ソリューションはサーバーレスアーキテクチャです!AWSはすでに色々なサーバーレス構築のツールを提供しています。
今回はユーザからお問い合わせやフィードバックを送信するたびに、任意な宛先に通知メールを送信するシンプルなサーバーレスメールサービスを一緒に作ります。AWS LambdaとAPI Gatewayを利用し、簡単なAWSサーバーレス構築を紹介します。
処理の流れとしては、ユーザーから連絡フォームより入力した情報を収集し、クライアント側のブラウザからAmazon API Gateway RESTfulサービスに投稿します。Amazon API Gatewayは、収集されたユーザー情報をAWS lambda関数に渡します。AWS Lambda関数は、Eメールを自動生成し、Amazon SESを使用してメールサーバーに転送します。
1.フォームを作成
index.html
ファイルを作成し、下記のコードを貼り付けます。index.html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>連絡フォーム</title> <script src="script.js"></script> <link rel="stylesheet " href="style.css "> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js "></script> </head> <body> <h1>連絡フォーム</h1> <form id="contact-form" method="post"> <h4>名前:</h4> <input type="text" id="name-input" placeholder="お名前を入力してください。" class="form-control" /><br /> <h4>件名:</h4> <input type="subject " id="subject " " placeholder="お名前を入力してください。 " class="form-control " /><br /> <h4>メール:</h4> <input type="email " id="email-input " placeholder="メールを入力してください。 " class="form-control " /><br /> <h4>メッセージ:</h4> <textarea id="description-input " rows="3 " placeholder="メッセージを入力してください。 " class="form-control "></textarea><br /> <div class="button-wrapper "><button type="button " onClick="submitToAPI(event) " class="btn btn-lg ">送信</button></div> </form> </body> </html>
- 見た目はあまり良くないですので、改善しましょう。
style.css
を同じフォルダ内で作成し、下記のコードを貼り付けます。style.css* { box-sizing: border-box; } body { text-align: center; color: rgb(255, 255, 255); background-color: #194680; padding-top: 20px; } #contact-form { margin: auto; text-align: left; padding: 20px; max-width: 430px; border: white solid 2px; border-radius: 10px; } button { text-align: center; margin-top: 20px; font-size: 18px; border: white solid 2px; background-color: white; border-radius: 5px; } .button-wrapper { text-align: center; } input, textarea { width: 380px; } textarea { height: 200px; padding: 10px; } input { height: 35px; }2. AWS Lambda関数の定義
次の画面の
関数コード
に下記のコードを切り替えます。index.jsvar AWS = require('aws-sdk'); var ses = new AWS.SES(); //宛先のメールアドレスを入力してください。 var RECEIVER = 'example-receiver@gmail.com'; //送信先のメールアドレスを入力してください。 //送信先のメールはAWSに認証登録する必要があります。 var SENDER = 'example-sender@gmail.com'; //クライアントへのレスポンスヘッダーを設定 var response = { "isBase64Encoded": false, "headers": { "Content-Type": 'application/json', "Access-Control-Allow-Headers": "Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token,Accept", "Access-Control-Allow-Methods": "POST,GET,OPTIONS", "Access-Control-Allow-Origin": "*", }, "statusCode": 200, "body": "{\"result\": \"テスト成功です!\"}" }; exports.handler = function(event, context, callback) { console.log('受理したイベント:', event); sendEmail(event, function(err, data) { context.done(err, null); }); callback(null, response); }; //メール送信処理 function sendEmail(event, done) { var params = { Destination: { ToAddresses: [ RECEIVER ] }, Message: { Body: { Text: { Data: '● お名前: ' + event.name + '\n● 件名: ' + event.subject + '\n● メール: \n' + event.email + '\n● 内容: \n' + event.desc, Charset: 'UTF-8' } }, Subject: { Data: event.name + 'からの連絡フォームが来ました!', Charset: 'UTF-8' } }, Source: SENDER }; ses.sendEmail(params, done); return { response, body: JSON.stringify(params), statusCode: 200 } }
- 同じ
Lambda管理
画面で、上にスクロールし、アクセス権限
のタブに切り替え、ロール名
のリンクをクリックします。
- 当関数のIAMポリシーをSES権限を追加します。IAM画面で該当ポリシーをクリックし
ポリシーを編集
->JSON
のフォーマットに切り替えし、下記のコードを追加します。{ "Sid": "FormPolicy", "Effect": "Allow", "Action": "ses:SendEmail", "Resource": "*" }3. APIゲートウェイでAPI構築
- 次の画面はREST APIの選択のままで、API名前を任意に付けます。
- 次の画面は上にある
アクション
をクリックし、メッソド作成
をクリック、POST
を選択します。
- 右側の設定画面では、
統合タイプ
はLambda
で、Lambda関数
は先ほど作成したものを選択します。
- CORSエラーにならないように、CORS機能も有効にします。
アクション
のドロップダウンをCORS有効化
をクリックし、設定はそのままで保存します。
- API Gatewayの最新アップデートでは、ゲートウェイのレスポンスも設定しないと、CORSエラーが発生するため、設定しましょう。右の
ゲートウェイレスポンス
→DEFAULT 4XX
→編集
の順番にナビゲートします
- レスポンスヘッダーに下記の値を追加し、保存します。
Access-Control-Allow-Origin: '*'これでAPIの構築は完了です。
4. SES送信用のメール検証登録
スパームなどの悪用を防ぐため、AWSよりメール送信機能を利用するには、検証登録が必要です。下記の手順を従って、送信用のメールをAWSに検証登録します:
verified
の状態になったら、OKです!5.全コンポーネントを連携する
- 最後のステップではすべてを繋ぎます!
index.html
と同じいフォルダでscript.js
を作成し、下記のコードを貼り付け、var URL
とurl
の2ヶ所に先ほど設定したAPI GatewayのエンドポイントURLを差し替えます。script.jsfunction submitToAPI(e) { e.preventDefault(); //設定したAPI GatewayのエンドポイントURLをここに入れます。 var URL = "API-GATEWAY-ENDPOINT-URL"; //フォームの入力値をチェック var name = /[A-Za-z]{1}[A-Za-z]/; if (!name.test($("#name-input").val())) { alert("2文字以上記入してください。"); return; } var subject = /[A-Za-z]{1}[A-Za-z]/; if (!subject.test($("#subject").val())) { alert("2文字以上記入してください。"); return; } if ($("#email-input").val() == "") { alert("メールを入力してください。"); return; } var email = /^([\w-\.]+@([\w-]+\.)+[\w-]{2,6})?$/; if (!email.test($("#email-input").val())) { alert("メールアドレスは正しくありません。"); return; } var name = $("#name-input").val(); var subject = $("#subject").val(); var email = $("#email-input").val(); var desc = $("#description-input").val(); var data = { name: name, subject: subject, email: email, desc: desc }; $.ajax({ type: "POST", //設定したAPI GatewayのエンドポイントURLをここに入れます。 url: "API-GATEWAY-ENDPOINT-URL", dataType: "json", crossDomain: "true", contentType: "application/json; charset=utf-8", data: JSON.stringify(data), success: function() { // フォームをクリアし、送信成功のメッセージを表示する alert("メッセージが送信されました!"); document.getElementById("contact-form").reset(); location.reload(); }, error: function() { // 送信エラーのメッセージを表示する alert("メッセージ送信失敗!"); } }); }6. 結論
これでAmazon S3で静的Webサイトをホストしても、AWSアーキテクチャを利用し、ユーザよりサイト管理者へフォーム送信機能を実装できました!
初投稿です、、いかがでしょうか(´・ω・`)
コメント、フィードバックなど是非よろしくお願いいたします!
それでは、また今度! (`・∀・´)ノ
- 投稿日:2020-07-08T15:06:05+09:00
GitHub Pagesを使った自前無料ブログの作り方(Hexo)
本文の前に
この記事はまどれーぬさんの公開された記事ゼロからわかる!GitHub Pagesを使った自前無料ブログの作り方(Jekyll)からインスパイアを受けています。ぜひ読んでみてください。とてもわかり易くまとまっています。
※今回の記事はLinux(Ubuntu)で操作を行っています。それ以外のOSをお使いの方は少しやり方が異なる場合があります。ご了承ください。
この記事でわかること
HexoというNode.js.製の静的サイトジェネレーターを使ったサイトの制作方法
Github Pagesでの公開方法
余談と事前準備
余談ですがなぜJekyllではなくHexoを使うのかについてです。理由は唯一つ
私がRubyを使ったことがなくJSのほうが使いやすかったから
これだけです(笑)
はい、では事前に準備するものです
- PC(今回はLinuxを使用しています)
- GitHubアカウント
- テキストエディタ(今回はVSCodeを使用しています。)
環境構築
ではまずNode.jsとHexoの環境構築をしていきましょう。
まずはNode.jsです。こちらの記事を参考にしてみてください。
そして次はYarnというパッケージ管理システムをインストールしていきます。
コンソールにcurl -o- -L https://yarnpkg.com/install.sh | bashと入力してください。
最後の方に export PATH~という文字列があるのでそれをコピーして実行してください。そうするとPATHが通り、yarnを使用することができるようになります。
次に今回の目的であるHexoをインストールしていきます。
コンソールに
yarn global add hexo-cliと打ち込んでください。
ディレクトリを作成します。
hexo init {ファイル名}作成されたディレクトリに移動して、モジュールをインストールします
cd {ファイル名} yarn installサーバーを起動します。
hexo serverhttp://localhost:4000/ にアクセスするとページが表示されます。
ここまでできれば環境構築は完了です。
初期設定
ブログの詳細な設定は
_config.yml
で行います。
ここではブログタイトルや言語、URLの設定などを行います。テーマ設定やGitへのデプロイ設定などもここで行います。テーマ選びと設定
では、今度は好きなテーマを設定してみましょう。今回はicarusというテーマを設定していきます。テーマに関してはこちらにまとまっています。
ほとんどのテーマには独自の設定項目が存在するためHexoと別に管理する必要があります。そのために
git
のsubmodule
という機能を使用します。まずは既存のテーマをForkしていきましょう。
icarusテーマのGithubページです。こちらの右上にForkというボタンがあるのでクリックしてください。そうするとリポジトリをForkすることができます。Forkが完了するとページが切り替わると思います。自身のForkができたら再びLinuxのコンソールに戻り、作成したディレクトリに移動します。そして
git submodule add {フォークしたリポジトリのURL} themes/{テーマ名}を入力します。そうするとtheme/{テーマ名}にフォークしたリポジトリが追加されます。
Hexoのテーマ設定を行う
作成したディレクトリの
_config.yml
に設定を行っていきます。私の場合テーマ名をtheme-icarus
にしたのでtheme:theme-icarusと設定をしました。
テーマの詳細設定
では今度はテーマの詳細設定を行っていきます。theme/{テーマ名}の
_config.yml
に設定を書いていきます。
少し長いのでGithubのURLを貼っておきます_config.yml記事を書く
さぁではお待ちかね記事を書いていきましょう!と、その前に少し設定をしなければなりません。
Hexoのルートディレクトリの_config.yml
のpost_asset_folder
という設定をtrueにします。
これをしないと記事内に画像を埋め込むのが面倒になります。
次に記事を管理するフォルダを作っていきます。hexo new {記事の名前}これで記事の画像などの管理フォルダと記事のmarkdownファイルが作成されます。
markdownファイルはこんな感じです。
では細かいところを説明していきます。
一番上の部分--- title: タイマーアプリを作ってみた date: 2020-03-26 tags: ---この部分は記事のタイトル、更新日時、タグなどの概要を設定する部分です。
この部分はレイアウトとしてhexo newを打ったときに同時に生成されます。
そして重要なポイント<!--more-->
というタグについて説明します。
このタグはHexo独自のタグであり、これを設定しないと記事一覧ページで全文が表示されてしまいます。
moreタグあり
このようになってしまうのでmoreタグはとりあえず付けておきましょう。(中にはmoreタグに対応していないテーマもあるのでmoreタグに対応しているかもテーマを選ぶ基準にするといいと思います。)
GitHub Pagesを使って全世界に公開
Gitへのデプロイ設定
こちらの記事にとても良くまとまっているのでご覧ください。
終わりに
お疲れさまでした!これでブログを作って公開する環境を整えることができましたね!
これからは記事を書いたらhexo deployで公開することができます。
- 投稿日:2020-07-08T13:22:07+09:00
csv-parser モジュールでCSV文字列を処理したい場合の方法
csv-parser で CSV文字列をパースする。
https://www.npmjs.com/package/csv-parser
上のモジュールで単純なCSV文字列をパースしたい場合はリーダブルストリームを
一旦生成することで csv-parserのインターフェイスを合わせる事ができる。
(もっと簡単な方法がありそうimport csvParser from "csv-parser" import { Readable } from "stream" //CSVが格納された文字列 const csvString = `col1,col2,col3 row1,row2,row3 row1,row2,row3` // Readable Stream を作成 const readable = new Readable({ read:(size) => { //この処理の記述の必要性が実は良く分からない return true } }) readable.on("data",(chunk) => { //parse されたデータ console.log(chunk) }) .on("err",(err) => { //error 時の処理 }) .on("end",() => { //終了時の処理 }) .write(csvString,(err) => { //CSV文字列をストリームに書き込む //close イベントを emit する readable.emit("end") })Promiseが必要であれば end コールバックでResolveすれば多分OK。