SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

【JavaScript】Promiseって何かを知らない。

自分なりの理解メモ

JSでは、処理の順番が書いた順番に担保されない、という問題がある。

下記記事からコードをお借りしました。 https://qiita.com/YoshikiNakamura/items/732ded26c85a7f771a27

処理を待って欲しいが待ってくれない

個人的にすごく理解しやすかった例がこれ。

console.log(1);
setTimeout(function(){console.log(2)}, 1000);
console.log(3);

処理のイメージとしては、 1, 2, 3の順番に出力して欲しい、と思いながら書くケースが多いと思う。

実際に、そういう書き方をしてしまう。

この例だと、さすがにしないっしょって思うかもしれないが、chrome拡張の chrome.tabs.sendMessage( }, function(response){ なんかを使っているとあるあるだと思う。

上記のような場合を処理を待たせて順番に処理するようにできる

Promiseを利用すると順番を担保、処理を待ってから次の処理に移らせることができる。

なので、処理をまってから実行させたい場合などは以下。

関数に切り出して、 return new Promise()させておいて、

test().then( () => {})と書いていく方法もあり。

    new Promise(function(resolve, reject) {
      chrome.tabs.sendMessage(tab.id, { target: "test" }, function(response){
        ... // 条件分岐で成功、失敗など。
        if (成功) {
          resolve();
        } else {
          reject();
        }
      }).then(() => {
         次の処理
      })

うまく動いたかどうか?

処理の順番を追うには、 console.logを適所に仕込んで追ってみるとよかったり。

ref

https://qiita.com/ysk_1031/items/888a84cb259cec4e0625

http://www.tohoho-web.com/ex/promise.html

【AWS lambda】環境変数を利用して実行環境によって処理を切り替える方法

AWS lambdaで開発をしていると、localと本番環境の時に処理だったりpathを切り替えたい時があると思います。

例) layerを利用していて本番の時は /opt配下をみたい

環境変数を利用する

結論から書くと、環境変数に ENVIRONMENT: production などを追加して処理を切り替えるメソッドを追加しました。

ちょっとこれがベストプラクティスではない気がしますが、思いついた限りでまずは動かしたいので、こちらで対応します。

Rubyのcodeのイメージは以下です。

def path
  ENV['ENVIRONMENT'] == 'production' ? '/opt/bin' : 'bin/'
end

ドキュメントはこちら。 https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-envvars.html

【Ruby on Rails】SendGridのAPIを使ってメールを送信する

Ruby on Railsでメールを飛ばすのを利用するときに SendGridを検討することは多いと思います。

結構本番環境で飛ばしたり、API使ってやるにあたってハマったところが多かったので残します。

smtpの設定で飛ばす方法の記事は多いのですが、APIを利用する記事が少なかったのもあり。

Ruby on RailsでSendGrid APIを使う概要

SendGridを利用してメールを飛ばす際に、SMTPを利用して設定してMailerからメールを送る方法が一般的(よく検索ヒットする)ですが、
SendGridには便利なAPIが提供されています。

Ruby on Railsを利用しつつ、SendGrid APIを利用するメリットとしては、以下がありますかね。

  • API Keyのみの設定で良い。 usernameやpasswordの設定が不要
  • イベントの設定ができる(API経由の方がイベントなどを設定できたりするぽい?です。)

まずはSendGridのAPIドキュメントを見よう

公式のドキュメントはこちら。
Rubyもちゃんとあります。

https://sendgrid.kke.co.jp/docs/API_Reference/Web_API_v3/index.html

ほぼメールのclassを利用する箇所をみれば、まぁなるほどとはなると思います。

事前設定をしてからrequestするってイメージですね。

README(github)
https://github.com/sendgrid/sendgrid-ruby

https://github.com/sendgrid/sendgrid-ruby#with-mail-helper-class

が、これをRailsのActionMailerと一緒に使おうと思うとちょっとうまく噛み合わせる必要がありそうです。

いい感じにSendGridのAPIをRuby on Railsで利用する

で、便利な記事がこちら。

https://techracho.bpsinc.jp/yamada/2018_12_22/67222

ほぼ上記のコードをコピペしたら動きます。

が、少し修正点が必要だったりしたので。

fromのドメインをきちんと設定する

fromで送られるメールの送信元は、sendgridの方できちんと設定しておく必要があります。 ドメインの問題ですね。

sendgridのサイトで登録しましょう。

mail.body.raw_source

この部分ですが、Railsのメールの設定によっては、空白で返されてしまいます。

APIからのレスポンスを見ると、content部分は空白では飛ばせないようです。

f:id:Saku-Saku:20200428202101p:plain

そのため、raw_sourceをうまくとれるようにしてあげます。

    content = SendGrid::Content.new(type: 'text/plain', value: mail.body.parts[0].body.raw_source)

plainのtext.haml(.erb)と htmlのメールのテンプレートがあった場合、選択できるようになっているため、 .parts[0] が必要になるようです。

Rails6のwarningがでる

lib/配下においたりすることで、RspecでエラーがでたりRails6でのエラーが生じてました。

以下の記事で対応しました。

lib配下において、requireすると警告は消えてうまく動作してくれます。

一応、 models配下や mailers配下でも動くのは動くみたいです。 ただ、initializeのメソッドが呼ばれていたりすると警告がでるみたい。

https://qiita.com/jnchito/items/b8f40e7fe82b07bc3de8

また、ファイル名によって読み込みがうまくされない、ということもあったので、そこも注意しましょう。

meilの送信に関する独自のメソッドを適用することについて

Action Mailerのdelivery_methodに独自の配信方法を追加する場合、なぜそのように書くのかの理解が深まりました。

https://qiita.com/sheepland/items/0bbf5c6f9fba08caf0a6

【Chrome拡張】DOMの表示を待ってからクリックさせたい

【Chrome拡張】編です。

今回はタブが新しく開けたりした場合にDOMの表示を待ってからjsでクリックさせたい時のノウハウを書きます。

結論から書くと以下です。

const jsInitCheckTimer = setInterval(jsLoaded, 1000);


function jsLoaded() {
      if (document.querySelector('.xxx') != null) {
          clearInterval(jsInitCheckTimer);
          $(".xxx").click();

...
    

setIntervalによって、その時間毎に実行させます。 loadがされていればif文の分岐から処理がされます。 この時にintervalが終了するコードを差し込んでいますね。

色々settimeoutなども試しましたが、これがうまく動作してそうなので。

参考にさせてもらった記事

コードはこちらから書かせてもらいました。 https://qiita.com/3mc/items/c3c580ca5de4a2d3990d