firebaseのチャットで画像を扱うために

LINEのようなチャットツールでは、チャットしている時系列に画像を表示したり、それとは別に、写真だけを一覧表示することができる。 これがRDBMSでは頭を捻らなくても実装することができるが、firebaseのようなNoSQLでこれを実装するためにはどのようにすれ…

SequelizeでwhereHasを行う

include内のrequired値をtrueにすることでwhereHasと同じ挙動の動作をさせることができる。 falseの場合は、ORMのリレーションの結果が0件でも取得できる。 attributesを[]にすることで、whereHasだけを利用することも可能。 XXX.findAll({ where: findAllPa…

firebaseのAuthenticationとfirestoreを利用したセキュリティルール設定

ここではセキュリティルールを考えた際にfirestoreはどういったデータ構造にするか、ということを説明する。 詳細の設定については、 公式ブログ に譲る。 チャットアプリのような双方向の通信を実現する際は、 firebase を利用することで簡単に実装できる。…

H2Oを利用してFlaskをFastCGIとして動かすまで

とりあえず、Flaskは動くことを前提としている。 Flaskが動く環境が整ったら、UNIXドメインソケットを利用してFastCGIデーモンを動かすようにしてあげる。 UNIXドメインソケットは、以下のようにすることで作成される。以下をxxx.fcgiと、自分で名前を付けて…

ReactはNativeでtypescript対応したらしい

下記のQiita記事でReactをTSで開発する時の初期状態を作るコマンドが乗っていた。 ReactとTSの環境を整えるにはReactやTSのパッケージをいれたり、としないといけなかったのに、コマンド一つでプロジェクトを作成することができ、随分と楽になったんだなぁ、…

TypeScriptで"SyntaxError: Unexpected identifier "と言われたら

以下のようなエラーにさいなまれた際の対応方法。 SyntaxError: Unexpected identifier or SyntaxError: Unexpected * or SyntaxError: Unexpected token import この問題が発生する原因は、トランスパイルされた js ファイルをNodeが実行できないため。 試…

Use object destructuring prefer-destructuring

以下のような場合、eslintがエラーが報告してくる。 async post(req: Request, res: Response) { const body = req.body; } そのため、以下のように修正することでエラーがなくなる。 プロパティをドット区切りで取得するのではなく、変数を展開して格納して…

javascriptでプロトコル、ポート、ホスト名を取得

プロトコル+ポート+ホスト名をなんと呼ぶのかわかりませんが、 https://xxx.com:3000 みたいなものを出力する。 80番ポートの時は、ポート番号はつけないようにしている。 const protocol = window.location.protocol const port = window.location.port con…

API Gatewayで Authorizer が動かない

AWS

オーソライザーが動かない API Gatewayでオーソライザーが動かなかったのメモ。 動かないというより、そこまで到達していなかった、というだけの話だが、HTTPリクエストヘッダに Authorization を付与すればオーソラーザーが実行される。 Authorization に入…

Cognitoで Invalid phone number format. と言われる

AWS

Invalid phone number format.と言われる Cognitoでユーザを作成する際、電話番号を 00000000000 や 000-0000-0000 で入力しても、エラーが返ってくる。 電話番号の正しい(?)フォーマットは、+15555555555 だった。日本だと +81 かな。 参考 stackoverflow.c…

jsでテキストをclipboardにcopyする

javascriptで外部モジュールなしに、クリップボードへコピーする方法を紹介する。 以下の関数で動く。 copyToClipboard(text){ navigator.clipboard.writeText(text).then(function() { /* clipboard successfully set */ }, function() { /* clipboard writ…

Dockerfileで環境変数を設定する

ENVコマンドでOK 最初はRUNコマンドを実行してしまったが、ENVコマンドを利用するのが正しい。 # 正 ENV AAA BBB # 誤 RUN export AAA=BBB

AWSSESのSMTPを利用するとmessageIDが書き換わる

AWS

AWSSESのSMTPを利用してメール送信をすると、messageIDが上書きされてしまう。 そのため、以下のようなシステムは破綻することになる。 message_header_id を生成する 生成した message_header_id をDBに保存 返信メールの in_reply_to と突き合わせてどのメ…

Lambda関数が実行されない

AWS

Lambdaが実行されない 検証環境でLambdaの実行を確認したし、このロールを本番でも流用しちゃおう、と思って検証用のソースと本番用のソースで同じロールを利用すると、Lambdaが実行されなかった。 原因は、検証用のソースを作った時に作成されたロールに与…

lambdaからRDSに書き込みをする

AWS

VPCに入れる lambdaをRDSにリーチできるように、VPC内に入れることで、RDSに対して直接データを書き込めるようになる。 lambdaの「ネットワーク」の設定から設定することができる。 以下のサイトにエンドポイントの作成について参考になると思う。 VPC Endpo…

mailparserで `iso-2022-jp` を扱う

メールが文字化けをしてしまう 何も考えずに mailparser を利用すると、 iso-2022-jp の文字コードの日本語文字が文字化けしてしまう。 これを対処するには、 iconv を利用することで解決することができる。 まず、 iconv をinstallする。 npm i iconv MailP…

nodemailerとさくらのメールサーバからメールを送信

nodemailerからさくらのメールサーバ経由でメールを送信する 普通には送信できない 以下のような587ポートへの接続は失敗する。 port: 587, secure: true, メッセージは以下のようなものが表示される。 Error: 47437359817600:error:140770FC:SSL routines:S…

各種メールサービスプロバイダのSMTP設定

各種メールサービスプロバイダのSMTP設定 GmailのSMTP設定 送信は安定している。 GmailをSMTP利用する際は、同時に最大5件までのメールしか送れなかったので注意。 TLS の場合はポート587を利用する。 host: 'smtp.gmail.com', port: 465, user: 'gmailのア…

Laravelでパスワードが正しかを比較する

概要 Laravelでパスワードが正しかを比較する 詳細 Laravelでパスワードの整合性を確かめるために、以下のことを行った。 現在DBに保存されているpasswordを取得(これはHashされている) 入力されたパスワードをDBにパスワードを格納させる際のHash関数でHash…

error: cannot open .git/FETCH_HEAD: Permission denied

error: cannot open .git/FETCH_HEAD: Permission denied と言われたら、 sudo chown -R your_user:your_user .git を実行しましょう

Laravel+Nginx+Dockerでpublicファイルを出すために

本題 Dockerを使っていると、NginxとLaravelのコンテナはもちろん分割するものと思う。 だが、このときLaravelからpublicファイルを出すためには、少しコツがいる。 なぜならば、Nginxから /api にアクセスが来た際は容易にLaravelをFastCGI起動することがで…

AWSLambdaにnodeパッケージを入れる

本題 AWSLambdaにnodeパッケージを入れるには、Layersというものを利用する。 レイヤーについてはAWS Lambda レイヤーを参照。 レイヤーを作成して、そこに、zipしたnode_modulesを入れれば利用することができる。 参考記事にもあげたが、nodejsという名前で…

Qiitaからはてなブログに戻るはなし

本題 Qiitaでは、いいね、をもらうことで、自分の書いた記事の存在意義を示すことができたり、みんなが書いているから、という流行に乗っている感じがあり、イマドキのエンジニア感を醸し出せているので、自分のブランディングには良いのかも、という気がし…

LaravelでLogが出せなかったのでメモ

LaravelでLog::debug()をすればログが出ると思っていたのに、ログは出なかったのでメモ。 どのログファイルを使用するか宣言 Log::useFiles('ファイル名')を使用して明示的にどのログファイルを使用するか宣言をする。ファイルがない場合は作成される。 // …

firebase functions での環境変数設定

現在の環境変数の確認 環境変数は以下のコマンドで確認することができる。環境変数を利用するのであれば、プロジェクト毎に設定する必要がある。 $ firebase functions:config:get 変数のセット ドットで区切ると、階層を持つ環境変数を作成することができる…

ラジオボタンで改行が発生するとまわりこんでしまう現象への対処

ラジオボタンで改行されると、ポッチの下に文字が回り込んでしまう。 これだとかっこよくないので、以下で対応する。 flexboxをここで適用すると、要素が横並びになるので、ポッチの領域に侵入してくることはない。 margin-topを付けるのは、ラジオボタンの…

【Laravel】外部キー制約の部分でうまくいかない場合にやること

Laravelでphp artisan migrateを行なっても、以下のようなエラーが出るので、困ったのでメモ。 [Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `hogehoge` add constrain…

iCloudにiPhoneの写真をアップロードする

iCloudに写真を保存する iPhoneの [設定] アプリを開き、 [写真] を選択。その後、iCloud写真を有効にする。 この時、有料枠を超えると思うので、50GBにアップデートする。 50GBプランは130円/月だけなので、ケチらないで支払うほうが良い。 理由は新しいiPh…

react-routerでURLが変わるがコンポーネントが再描画されない

異なるRouterに属するコンポーネントは再描画されません。 App.ts の中で、以下のようにしているとします。 const App: React.FC = () => { return ( <div className="App"> <Header /> <Contents /> </div> ); } そして、 Header.tsx と Contents.tsx は以下のようだとします。 const Header: React.FC = () =…

【Python】正規表現を使ってヒットした文字に何かつっつけたい

python3でやっています。正規表現を使ってヒットした文字に、何かくっつけるメモです。つけ方の答えを先に言うと、以下のようになります。マッチした文字に「hogehoge」を足す場合です。 replaced_text = re.sub(r'(やりたい正規表現)', r'\1hogehoge', text…