Typescript/Javascript

JSとデータベースでの時刻の取り扱い

JSのDate型について気になったので改めて確認した。 JSのDateはTimezoneを持っている。 const date = new Date() このdateをコンソールで確認すると以下になる。 Wed May 01 2024 21:53:33 GMT+0900 (日本標準時) Dateインスタンスをシリアライズする場合は…

Next.JS App RouterにおいてSVGをAPIから出力する方法

SVGを最近よく活用している。CanvasよりReactとの相性はよいし、ベクターなのも好み。 (Three.jsを使えると面白いけど、、その機会はなかなかない。) だいたいの場合は、HTMLに埋め込んで使えばいいので、特別なことをする必要はない。 ただ、たまに画像と…

DeepL APIの試用

APIを試してみたのでメモ。 import 'dotenv/config' const API_KEY = process.env.DEEPL_API_KEY; const API_DOMAIN = process.env.DEEPL_API_DOMAIN; if (API_KEY == null || API_DOMAIN == null) { throw new Error(); } const API_ENDPOINT = `https://${…

画像を返すAPIの作成

Azure Static Web Appではstaticなファイルにはmiddlewareが機能しないっぽいので、 画像にも認証をかけたい場合はAPIで画像を返すようにする必要がある。 Static Web Appってそういうものだよなーと思っているので仕方ない気がするし、 そもそも認証が必要…

Azure Static Web App ServiceにNext.js(App Router)をデプロイする。

以前にAzure Web App Serviceへのデプロイについての記事を書きました。 ma38su.hatenablog.com 今回はこのデプロイをブラッシュアップして、Azure Pipelineからstatic web appへもデプロイできるようにしました。 2024/2/10 追記 Next.JSのmiddlewareうまく…

NextAuth.jsでAutodeskアカウントでセッション管理するカスタムプロバイダーを作ってみた。

NextJsの認証を簡単に実現するモジュールのひとつであるNextAuth.jsについて、Autodeskアカウントを使ってみようということで、 今回はカスタムプロバイダーとしてAutodesk Platform ServicesのOAuthを試してみたので、その結果を残しておきます。 いまauth.…

GraphQLのサーバサイド認証とその実装のためのContext

新しい技術を試すにあたって、面倒ではあるが、認証までは一通り使いこなせる必要があると感じている。ただ、認証は結構めんどくさいし、すぐ忘れてしまいがちなので、メモを残しておく。 GraphQLサーバに、認証機能を付与するにあたって、Contextを定義する…

GraphQLの型定義をスキーマから自動生成する。

GraphQL、型定義をスキーマから自動生成するところまで試してみた。 やってみて気づいたこととして、自動生成する型定義はサーバとクライアントの2種類があるということ。それぞれ必要。 サーバ サーバの方はschema.graphqlというようなスキーマ定義ファイル…

GraphQLのクライアントを試してみる。

GraphQLの理解のため、まずはライブラリなど使わずfetchでGraphQLのクエリを発行してみる。 const query = gql`{ books { id } }`; async function queryByFetch() { const res = await fetch('http://localhost:4000/graphql', { method: 'POST', headers: …

viteのサーバ用にリバースプロキシのミドルウェアを書いた。

expressを使うと楽に実装できた。 まだ試行錯誤しているので、とりあえずvite.config.tsにべた書き。 import { ViteDevServer, PluginOption, defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' import express from 'express'; imp…

SuspenseをNextJSで使う。

追記:NextJS(AppRouter)でSuspenseを使うときはCSRにしようと書いたのだが、CSRだとNextJSのRouter Cacheと相性がわるそう。というか、最近NextJSはオーバースペックだなぁと感じている。 Viteで作っていたReactのプロトをNextjsに移植したところ、Suspense…

Next.JSをAzureのWeb App Serviceにデプロイする

最近、新しいアプリを作ってみたらデプロイに苦労したのでメモを残しておく。 2023.9.13時点で、Next.JSのアプリは、VSCodeの拡張機能や、Web App Serviceから自動設定できるGitHub連携のデフォルトのGitHub Actionでは、Next.JSのデプロイに時間がかかりす…

npmのpackageを作る?

いくつかのPJで共通した処理があり、それぞれで書き直すのもめんどくさいので、packageを作りたくなったのだが、そこでふと、packageってどうつくればいいのか?と思い調べてみた。 publicに運用したい場合 npmやgithub packageなどが選択肢になる。 ただし…

React自作

少し前に話題になっていたReact自体の自作をやってみた。 一日かからないくらいの時間で、実装できるし、Reactの動作をかなりこまかく理解できるようになったので、React書く人にはお勧めしたい。 zenn.dev 自分が書いたのは以下。ほぼ写経。 github.com 気…

ts-nodeのエラーの原因

Typescriptをビルドせずに実行するために、久々にts-nodeを使ってみたらエラーが出た。 $ npx ts-node script.ts TypeError [ERR_UNKNOWN_FILE_EXTENSION]: Unknown file extension ".ts" for /home/xxxx/.../script.ts ... 以下の2点を対処したら解決した。…

Javascriptのプロジェクトに段階的にTypescriptを導入したい。

Javascriptが標準のプロジェクトにおいて、Typescriptに移行したいとする。 一気に移行するのはリスクも大きいし、成功する気がしない。 なので、現実的には、Javascriptをできるだけ小さくTypescriptに切り出すのを繰り返して、段階的に移行していくのがよ…

ArcGIS Javascript APIでのLat, LngとXYZとの相互変換

距離を考慮した計算が必要なときは、XY座標系に直してから計算しないと多分だめなので、 現在表示している地図上のXY座標系と、Lat, Lng(緯度経度)とを相互変換する方法を調べてみました。 緯度経度からXY座標へ import * as webMercatorUtils from "@arcg…

Viteに乗り換えるときのメモ

環境変数の扱いが変わる。 process.env ではなく、 import.meta.env で定義する。 また、Prefixは、VITE_APP_になる。 vitejs.dev

Viteでthreejsを使うときのメモ

Viteはthreejsで使うときも、基本、そのまま使えますが、 多少のご作法は理解しておく必要がありましたので、メモを残しておきます。 JSのコード中で読み込むアセットの取り扱い jsでimportなどせずにパスやURLを指定して読み込むテクスチャやフォントなどで…

Amazon RDS Proxy(MySQL)にTLSで接続する。

RDS ProxyでTLS接続を試した。 TLSを有効にすると、証明書を設定する必要がある。 Lambdaの場合は以下のようなコードになるかな。 const fs = require('fs'); const mysql('mysql2/promise'); exports.handler = async (event) => { let con; try { con = aw…

distrolessを試す。

軽量なコンテナを作るにはdistrolessのイメージをベースにするのがよいらしい。 distrolessは、Googleが管理しているイメージで、Google Container Registryで管理されているっぽい。 github.com 当たり前だけどdockerhubで検索してもでてこない。 とりあえ…

グローバルインストールせずにexpress-generatorを使う

express-generatorは、パッケージ名とコマンド名が異なるので、npxでインストールせずに使うのがちょっとめんどくさい。 npx --package express-generator -- express -h ただ、インストールするか?と確認されるので、どこかにはインストールされているのか…

passport/expressのサーバとOIDCプロバイダーの間にProxyを通す

インターネットへのアクセスにプロキシが必要な社内ネットに、Webサーバを立てて、Auth Code FlowでOIDCの認証を利用しようとすると、 Webサーバ(OIDCのクライアント)とOIDCプロバイダーの間にもProxyを通しておく必要がある。 例えば、expressでAzureADのOI…

Javascriptで任意の変数名に分割代入する

変数名が重複する場合とか変数名を変えて分割代入したいときは以下でできる。 const data = { month: '10', year: '2020' } const { month: thisMonth, year: thisYear } = data; console.log({ thisMonth, thisYear }); さらに初期値も設定できる。 const r…

Sequelizeを簡単に試せる環境を構築する。

Sequelizeはnode用のORマッパー。expressでWebアプリを組むときには選択肢に上がってくる。 このSequelize(に限らないが)、手を動かさないとよくわからないところがあったりするので、お手軽に試せる環境を作った。 github.com docker-composeを使って、my…

手っ取り早くTypescript環境を作って実行する。

ちょっとした動作を手元で試したいときに。 nodeとかyarnはインストール済みの前提です。 環境構築 Yarn mkdir ts-study cd ts-study yarn init -y yarn add -D typescript ts-node @types/node npmの場合 mkdir ts-study cd ts-study npm init -y npm insta…

Typescriptの型の扱いのメモ

Typescriptの型関連の演算子、?とか!とかググらビリティがあまりよくないので、ちょっとメモしておく。 Type Assertion asは型アノテーション。キャストと違うのはコンパイラ向けの情報のみで、それ自体は実行環境に影響を与えないことが違いのよう。 型アノ…

React Hooksでカウンターを実装してみる。

とりあえず実装すると以下のような形か。 import React from 'react'; const Counter = () => { const [count, setCount] = React.useState(0); const handleClick = React.useCallback((e: React.MouseEvent<HTMLInputElement, MouseEvent>) => { setCount(c => c + 1); }, []); return ( <div> <p></p></div></htmlinputelement,>…

React Hooksでタイマーを実装してみる。

状態が頻繁に更新されるコンポーネントということで、タイマーを実装してみる。とりあえず、実装すると以下のようになる。 import React from 'react'; const Timer = () => { const [time, setTime] = React.useState(0); React.useEffect(() => { const id…

threejs + typescript + webpackの環境構築

threejsで大規模なモデル操作とか始めるとTypescriptの型サポートはとても助かる。 以前にも書いていたことがあったが、古かったので消して、代わりに2020年度時点の環境設定を残しておく。 package.json { "name": "threejs-tutorial", "version": "0.0.1",…