JavaScript関連のことを調べてみた2022年02月19日

JavaScript関連のことを調べてみた2022年02月19日

GoogleスプレッドシートでAssociationを扱うO/Rマッパーもどき SheetQuery

Googleスプレッドシートをデータベース代わりに使うときに、関連付け(Association)も扱いたいですよね。

https://railsguides.jp/association_basics.html

Apps Scriptから使えるQuery専用のO/Rマッパーもどき [SheetQuery](https://script.google.com/d/1qcppOv1DeiBBzUgiwo2yHm0rKld5nndxHI5cw_u1iFC3xUbyFAT5jc6J/edit?usp=sharing) を作ってみました。

# 使い方

Apps Scriptのスクリプトエディターで、ライブラリーを追加します。

スクリプトID
`1qcppOv1DeiBBzUgiwo2yHm0rKld5nndxHI5cw_u1iFC3xUbyFAT5jc6J`

## openByUrl(url).from(sheetName).toJson()

スプレッドシートのURL`url`とシート名`sheetName`を指定して、JSON形式でデータを取得します。

“`javascri

元記事を表示

Recoilで簡単なフィルター機能を実装

## デモ(codesandbox)

今回使用したコードです → [Demo](https://codesandbox.io/s/infallible-bassi-d42u0?file=/src/App.tsx)

## Recoilとは

meta社が開発したグローバルな状態管理をできるライブラリです。

正式リリースされたばかりだが、シンプルに状態管理をしていけるので最近注目度が高いです。
実際コードが少なく書けるので見通しもよいかと思います。
初学者でRedux使っていないので、どこがどう違って、なにが良くてなにが良くないか分からないですが。。。

## インストール

まずパッケージのインストールをします。typescriptの場合は型定義もインストール忘れずに。

“`tsx
npm i recoil
npm i @types/recoil
“`

## RecoilRootでコンポーネントをwrapする

Recoilで状態管理する場合、そのグローバルな状態管理をする範囲をRecoilRootで囲む必要があります。プロジェクト全体を範囲とする場合、大元の

元記事を表示

Select2で1つだけしか選択できないようにする

# はじめに
今まで複数選択OKの利用シーンでのみSelect2を使っていたが、単一選択のケースでも利用する要件がありそうなので、調べたメモ

# 環境
– Select2 4.0.X

# 方法
[jQuery Select2 で上限ありの複数選択](
https://r17n.page/2019/11/11/jquery-select2-multiple-select-with-limit/) に従って“`maximumSelectionLength“`プロパティに1を設定すればよいかと思ったが、難しく考えず [Single select boxes](https://select2.org/getting-started/basic-usage) のようにmultiple=”multiple” の設定を**しなければよい**だけであった。

ただ、Singleの場合、“` allowClear: true “`の設定をした際に表示される X ボタンが**なぜか利かない**現象に見舞われたので、クリアさせたい場合、自前でクリアボタンをつける等しよう。

# サンプル
以下

元記事を表示

ApolloClientのベストプラクティスがあったので自分でまとめてみた

## 全てのオペレーションに名前をつける

– 利点
– 意図したオペレーションをフロントとバックエンドで共有ができる
– 予期せぬエラーの回避
– デバックでフロントとバックエンドのどちらに原因があるかを特定するのに役だつ

“`graphql
# 推奨 ✅
query GetBooks {
books {
title
}
}

# 非推奨 ❌
query {
books {
title
}
}
“`

## 変数を利用して引数を提供する
– 実行するuseQueryからvariavlesオプションを利用することで変数を提供することが可能

“`javascript
// 推奨 ✅
query GetDog($dogId: ID!) {
dog(id: $dogId) {
name
breed
}
}

// 非推奨 ❌
query GetDog {
dog(id: “5”) {
name
breed
}
}

function Dog({ id }) {
const { loadi

元記事を表示

Objectのコピーについて(Javascript)

javascrptのオブジェクトは単純な代入だと参照が渡されてしまいプロパティに対する編集が共有されてしまう。

“`Javascript
const hoge = { name: ‘hoge’};
let hogehoge = hoge;

hogehoge.name = ‘hogehoge’;

console.log(hoge)//{name: ‘hogehoge’}が表示される
“`

1階層のオブジェクトであれば新規の配列を作成するmapを使い、参照を共有しないオブジェクトを取得できる。

“`Javascript
const hoge = { name: ‘hoge’};
let hogehoge = [hoge].map( val => ({…val}))[0];

hogehoge.name = ‘hogehoge’;

console.log(hoge, hogehoge)//{name: ‘hoge’} {name: ‘hogehoge’}が表示される

“`

しかしオブジェクトがプロパティとしてオブジェクトを持っている場合、ネストされたオブジェクト

元記事を表示

console.logでネストが深くてログが見れない時の対処法

## はじめに

検証ツールのConsoleでconsole.logの結果を見る時は、問題なくログを見れると思います。ですが、出力したいログのネストが深いとターミナルで出力されないケースがあります。

#### 見れませんね…
[Object]と出力されてしまってます。この中身を見れるようにしたいと思います。

![スクリーンショット 2022-02-18 23.38.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/396152/412dc7f5-be93-92d5-55b4-87e40a2e7faf.png)

#### ネストが深い場合、出力したいログをJSON形式にしましょう
“`
console.log(JSON.stringify(‘出力したいログ’, null, 2))
“`

実行結果
![スクリーンショット 2022-02-18 23.38.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0

元記事を表示

FontAwesomeでアイコンを挿入する

#はじめに

学習記録アプリを開発中で、学習履歴を一覧表示していました。そこに削除用のアイコンをつけたいと思い、今回FontAwesomeを導入していきます。

#環境
– rails 6.0.4.4
– ruby 2.6.5

#FontAwesomeの導入
FontAwesomeアカウントを登録したのちに、公式サイトのヘッダー部分の「Kits」をクリックします。
その後、自分専用コードをクリックすると埋め込み用のコードが表示されます。

“` application.html.erb

“`

これをHTMLファイルのhead要素内に記述します。
(今回はRailsなのでapplication.html.erbのhead要素内に記述する。)

補足
ちなみに登録はEmailとpasswordだけ入力すればすぐにできます。
FontAwesome公式 https://fontawesome.com/

# F

元記事を表示

Canvg v4を使ってブラウザ上でSVGをCanvasに変換する

# はじめに

2022年2月17日にCanvgのメジャーアップデートであるv4.0.0がリリースされました。

https://github.com/canvg/canvg/releases/tag/v4.0.0

[前回の記事](https://qiita.com/wm-ytakano/items/d33c3822aa84d695f8e6)では、Canvg v3を使ったSVGからCanvasへの変換方法に説明しましたが、今回はCanvg v4を使った方法について説明します。

https://qiita.com/wm-ytakano/items/d33c3822aa84d695f8e6

とはいえ、破壊的な変更は`Canvg`がデフォルトエクスポートから、名前付きエクスポートに変更されたことが主で、v2からv3への移行時ほどの違いはありません。以下のようにインポート部分を書き換えるだけでよさそうです。

“`javascript:canvg_v3.js
import Canvg from “canvg”;
“`

“`javascript:canvg_v4.js
import

元記事を表示

JavaScriptでゲームを作る? その1

# はじめに
– JavaScript(JS)でゲームを作ります
– 生のJSで作ります
– TypeScriptなどは使用しません
– 同じようなことをやろうと思った人たちの敷居を上げないため
– HTMLやJS自体の説明はしません
– ゲーム用のライブラリ等は使用しません
– 2Dで作ります
– ブラウザで動かします
– 環境差異は気にしません
– 最新のChromeでのみ動作確認します
– ゲーム内容はとりあえず未定です
– コントローラーを使いたいので、アクション系にはしようかなと考え中

# 今回の目次 ?
1. ゲームループを作る ?
1. オブジェクト制御を作る ?
1. FPSを画面に表示する ?
1. ゲームパッドからの入力を作る ?
1. ゲームパッドからの入力を画面に表示する ?
1. プレイヤーキャラを作る ?

# ゲームループを作る ?

## 概要

まず初めに、ゲームループを作ります。

ゲームループとは、要は単なる無限ループなのですが、唯一の機能として「一定時間に決まった回数だけ繰り返す」というものがあります。1秒間に6

元記事を表示

ReactとNode.js(express)でAPIの通信を確立する

## 概要
サーバーを立ち上げてAPIを叩くという一連の流れを確認してみたかったので、ローカルでフロントエンドとしてReact, バックエンドとしてNode.js(express)を立ち上げてAPI(Fetch)叩いてみる。
フロント側としてはわざわざReactでやる意味はないが慣れているため採用しました。

## 1. Node.js(Express)でサーバーを立ち上げる

1. `cd backend`
2. `yarn init`でpackage.jsonを初期化。色々質問されるけど、とりあえずデフォルトでok
2. `yarn add express`でexpressのパッケージをインストール
2. index.jsをbackend配下に作成する
2. index.jsは以下のように記述する

“`js
const express = require(“express”);
const app = express(); //express のインスタンス
const port = 3001; // listenするport番号

app.get(“/”, (

元記事を表示

フロントエンド開発言語まとめ(JavaScript多め)

## はじめに
フロントエンドの勉強をする上で、言語やフレームワークなど多く存在し、名前は知っているけど詳しくは知らない、1つの言語は深い知識・経験はあるが、幅広い知識がないということがあるかと思います。

今回はHTML、CSS、JavaScriptの基本からJavaScriptのツールやライブラリなどについて、幅広く調べてまとめてみました。

## まずはHTMLからおさらい
– HTML
– Webページのコンテンツ構造を作るための言語
– タグと呼ばれるコンテンツを階層的に組み合わせることでWebページとなる
– 10年ほど前にHTML5が登場し主流となっていたが2021年に廃止され、現在はHTML Living Standardが標準となっている
– HTML5とHTML Living Standardに大きな違いはないが、使い勝手の良い仕様が追加されている
– 参考:[どうしてHTML5が廃止されたのか](https://future-architect.github.io/articles/20210621a/)

– CS

元記事を表示

javascript69_GC

GC(garbage collection)
一つのオブジェクトについて、変数や属性から使われない場合は、
Garbageとなります。

例:
var obj1 = new Object();
obj1 = null;
ここでobj1はgarbageです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/13be74ef-1791-634c-af6c-a66dede0ade2.png)

このようなGarbageオブジェクトに対しては、整理しないとPCの運用スピードが落ちます。

ただし、JSは使わないオブジェクトを自動的に回収してくれるシステムがあるため、人間は何も操作しなくても楽チンです!

そして、var obj= new Object();の中に、変数に使われいているオブジェクトについてJSが自動的に整理してくれなく、人間がもう使わないオブジェクトをnullに設定する必要があります。
そうしたらPCがGarbageを気づいてくれます。

元記事を表示

javaScript68_toString()

ブラウザ何を出力するときは、実はtoString()関数の戻り値を出力しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/fcb4eba9-443d-24db-2334-d77d8b82d927.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/84c61e51-4aed-560e-f6db-62877e3c5da9.png)
上記の例だと、toStringはperの中にだけ追加されている。
全て生成されたインスタンスの中に同じtoStringをアクセスしたければ、toStringをクラスのインスタンスに追加すればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/619e26d5-b906-5643-6b0b-687efb

元記事を表示

【Docker x Dredd】 hookファイルをJS以外で書く場合の注意点 / Cognitoのトークンを使ってテストを行う

https://qiita.com/ItsukiN32/items/4a92ab911d0e49c21de5

前回の記事でDockerを使ってDreddを動かすところまで書きましたが、あれから、いくつかやってみたいことが出てきました。

テストの制御はhookファイルで行いますが、前回はJavaScriptで書きました。
管理するバックエンドはJavaScripitよりもPHPやRubyの方が慣れているメンバーの方が多いという状況。
そこで、やってみたいこととして、

– **このhookファイルをPHPで書き変えたい。**

また、Cognitoなどの外部認証サービスを使ってトークンを取得する場合、hookファイルにあらかじめその取得 + セットする処理を記述する必要があり、
AWS SDK が使えるようにする必要があります。
LaravelをAPIとして扱っていて、特にJSのパッケージを利用していない場合、それだけのためにpackage.jsonに追加するのも不自然です。
そこで、次のやってみたいこととして、

– **package.jsonを汚さずにAWS SDKを導入した

元記事を表示

【JavaScript】デフォルト引数について

JavaScriptにおけるデフォルト引数についてメモしておく。

# デフォルト引数
デフォルト引数は、仮引数に対応する引数が指定されない場合、デフォルトで代入される値を指定することができる。もしデフォルト値が指定されていない仮引数に値が渡さなかった場合、その引数は“`undefined“`になる。

## 基本的な書き方
デフォルト引数は、“`<仮引数> = <デフォルト値>“`で指定することができる。

“`javascript
function sample (<仮引数> = <デフォルト値>, <仮引数> = <デフォルト値>,…){
// 処理内容
}
“`

## サンプル
処理を確認する簡単なサンプルを書いてみた。

“`javascript
function sum(a, b = 5, c = 2) {
return a + b + c;
}

console.log(sum()); // NaN
console.log(sum(2)); // 9
console.log(sum(2, 1));

元記事を表示

javaScript67_prototype属性

hasOwnPropertyの使い方:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/b509168e-d18e-7c21-77d0-7be6870283d4.png)

prototypeオブジェクトもオブジェクトです。そのため、指向先のオブジェクトがあります。
属性あるいは方法にアクセスする時、下記の手順になります。
自分の中で探す、自分の中になければ、prototypeのオブジェクトで探す。prototypeオブジェクトの中にもなかれば、prototypeオブジェクトのオブジェクトで探す。
そちらもなければ、undefinedを返す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/44c36694-e6c4-584b-0824-f99edf34fc26.png)

コードで書くと、こんな感じです。
![image.png](https://qiita-

元記事を表示

Vueでお手軽にGithubの芝をWebアプリに実装できるツールがあったので紹介する

# 初めに
今回は自分が開発に参加したプロジェクトのメンバーに教えていただいたツールの中で、手軽に扱えるかつ高性能なツールがあったので、この記事ではそのツールの紹介をしていきます!

# 詳解するツールについて
今回紹介するツールは、**vue-calendar-heatmap**です。

https://github.com/julienr114/vue-calendar-heatmap

このツールはGithubのContributionに似たグラフをSVG形式で描画してくれます。このツールはグラフをただ描画してくれるだけではなく、使用者がいくらかカスタムできるようになっています。ということで、次は実際にこのツールを使いながらこのツールの機能を見ていきます。

# 使ってみる
実行環境(この項目ではすでに以下の開発環境が構築していることを前提に進めていきます。)

|開発ツール|バージョン|
|:–|:–|
|Vue|2.6.14|
|npm|7.5.4|

※install及び使用までの手順については[**vue-calendar-heatmap**のリポジトリ](https

元記事を表示

javascript66_prototype属性

私たちが作っている全ての関数に対して、パソコンが該当関数の中にprototype属性を入れます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/65e2cec5-1bbd-dae0-a3f9-d1f7f9373da9.png)
関数ごとに原型対象は違います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067004/af236435-f2a5-913e-a6a0-0f3ef361d0b8.png)

普通の関数がprototypeを呼び出しても意味ありません。
関数が構造関数としてprototypeを呼び出す時、構造関数(クラス)から生成された全てのインスタンスには一つの隠された属性はクラスのprototype対象を指しています。
その隠された属性については__proto__でアクセスすることができます。
![image.png](https://qiita-image

元記事を表示

Index signature(インデックス型)~あのObjectの型を使いたい~

# Index signature(インデックス型)とは
参考: https://typescript-jp.gitbook.io/deep-dive/type-system/index-signatures
> JavaScript(TypeScript)のObjectは、他のJavaScriptオブジェクトへの参照を保持し、文字列でアクセスできます。

コードで実際に見てみましょう

#### 通常
“`ts
export default class Test {
public static id: number = 1
}

const id: number = Test.id
“`

#### index signatureを使う場合
“`ts
export default class Test {
public static id: number = 1
}

const id: Test[‘id’] = Test.id
“`

このように`object[property名]`でそのオブジェクトのプロパティーの型を使うことができます。

# Object.pr

元記事を表示

Voicy.jpの再生スピードを、任意のショートカットキー押下でUP・DOWNできる様にするスクリプト

“`javascript
/*
2022/02/18
Voicy.jpの再生スピードを、任意のショートカットキー押下でUP・DOWNできる様にするスクリプト。
by rtyaoke

chrome拡張の「ScriptAutoRunner」等での使用がおすすめ。
https://chrome.google.com/webstore/detail/scriptautorunner/gpgjofmpmjjopcogjgdldidobhmjmdbm?hl=ja-jp
*/
window.onload=function(){

// shortcut.jsのインポート用に、DOM要素を作成
let script = document.createElement(‘script’);
script.src = ‘https://www.openjs.com/scripts/events/keyboard_shortcuts/shortcut.js’;

// shortcut.jsが読み込み完了してからショートカット登録
script.onload = f

元記事を表示

OTHERカテゴリの最新記事