ともブロ。

Rails, Vue.js, React.js, JavaScript等、日々学んだ技術・知識を備忘録的に記していきます。

【Laravel 8.x】LocalでPostgreSQL に接続

LaravelでPostgreSQLを利用してDB接続に当たってのメモを残します。

ユーザー作成

DBを作成するにあたり、ユーザーを作っていない人は作成します。

createuser -P hogesan

DB作成

Laravelでpostgresに接続するに当たり、先にデータベースを作成します。

以下はhogesanというユーザーで、DB名:todo で作成する場合のコマンドです。

createdb todo -O hogesan

上記で作成後、DBeaverなどGUIツールで接続すると分かり易いです。

Laravel側の設定

以上でPostgresSQLの使用準備が整ったので、Laravelのアプリ側で設定に入ります。

database.php

デフォルトのままでOKです

.env

少し弄ります。

DB_CONNECTION=pgsql
DB_HOST=127.0.0.1
DB_PORT=5432
DB_DATABASE=todo
DB_USERNAME=hogesan
DB_PASSWORD=

デフォルトでDBはmysqlになっているので、使用する pgsql に変更。

DB_PORTも 5432 に変更。

DB_DATABASE  こちらは先程したDBの名前(todo)に変更。

DB_USERNAME こちらも自分のusernameに変更。

DB_PASSWORD こちらはDB作成時に空でenterしていれば空欄でOKです。

完了

以上で設定が上手くいっていれば、php artisan migrateなどDB周りのコマンドも通るかと思います。 当然ですが、DBをローカルで先に作成しておかないと、↑コマンド(~migrate)が通らないので気を付ける。

【Vue3】ViteでVue3 + TypeScript + Tailwind CSS + Vue Routerの環境をサクッと作成

ビルドツールとしてVue CLIではなくViteを利用してアプリ作成する際のメモ。

VueCLIよりもViteの方がbuildやホットリローディングが早いため、積極的に個人開発で利用していくことにしました。 (後、ミーハーな自分としては新しい技術が使いたいなと...。)

ViteはVueの創作者であるEvan You氏が生み出したビルドツールです。

github.com

ViteでVue3 + TypeScriptの環境を作り、Tailwind CSSとVue Routerを導入するまでの手順をメモとして残します。 厳密に言えばViteでTailwindCSSとVueRouterを導入はしませんがご了承ください。

※各種必要なツールは既にinstall済みとして書きます。

1 ビルドコマンドを入力

npm init vite

2 プロジェクト名を入力

✔ Project name: … hoge_app

3 使用するFWを選択

? Select a framework: › - Use arrow-keys. Return to submit.
    vanilla
 >  vue
    react
    preact
    lit-element
    svelte

4 JSかTSか選択

? Select a variant: › - Use arrow-keys. Return to submit.
    vue
❯   vue-ts

5 Done!

Done. Now run:

  cd hoge_app
  npm install
  npm run dev

6 TailwindCSSを導入

npm install -D tailwindcss@latest postcss@latest autoprefixer@latest
npx tailwindcss init -p
Created Tailwind CSS config file: tailwind.config.js
Created PostCSS config file: postcss.config.js

↑でtailwindcssで必要なtailwindcss.config.js postcss.configの2つのconfig fileが作成される。

・tailwind.cssを作成(@/src/assets/styles/tailwind.css)

// tailwind.css
@tailwind base;
@tailwind components;
@tailwind utilities;

・main.tsでtailwindcssをimportする。

import { createApp } from "vue";
import App from "./App.vue";
import "./assets/styles/tailwind.css";

createApp(App).mount("#app");

・tailwind.config.jsを書き換える

  // tailwind.config.js
  module.exports = {
   - purge: [],
   + purge: ['./index.html', './src/**/*.{vue,js,ts,jsx,tsx}'],
    darkMode: false, // or 'media' or 'class'
    theme: {
      extend: {},
    },
    variants: {
      extend: {},
    },
    plugins: [],
  }

7 Vue-Routerの導入

 npm install vue-router@next

ここの注意点ですが、Vue3では@nextでinstallします。 npm install vue-routerですと、正常に動作しません。

package.jsonを確認

  "dependencies": {
    "vue": "^3.2.6",
    "vue-router": "^4.0.11" ⇦追加されました
  },

次に、router/index.tsを作成します。

import { createRouter, createWebHistory } from "vue-router";
import Home from "../views/Home.vue";

const routes = [
    {
        path: "/home",
        name: "Home",
        component: Home,
    }
];

const router = createRouter({
    history: createWebHistory(),
    routes,
});

export default router;

こちらで完了です。最後にrouter確認。

App.vue

<template>
  <router-link to="/" class="px-2">HOME</router-link> |
  <router-link to="/" class="px-2">ABOUT</router-link>
</template>

f:id:tomoyuki_en:20210912213523p:plain
vue-router導入後のトップページ

以上でViteでVue3 + TypeScript + Tailwind CSSの環境をサクッと作成することができました。 個人的にこの環境はVueですとモダンで好みです。

【GitHub】GitHubアカウントを2段階認証にした後、pushできなくなった際の対処

GitHubアカウントを2段階認証にした後、いつも通りgit pushすると、

$ git push
remote: Invalid username or password.
fatal: Authentication failed for 'https://github.com/***/***.git/'

のように、usernameかpasswordが違うと怒られるようになったのでその際の対処を備忘録として記す。

解決方法

恐らくこのエラーを調べると既に対処法が対処法がたくさん出て来ると思われるが、自分の場合は最終的に

git remote -v

でリモートレポジトリを確認する。

origin  https://<username>:<githubパスワード>@github.com/***/***.git (fetch)
origin  https://<username>:<githubパスワード>@github.com/***/***.git  (push)

username後がgithubパスワードになっており、これを2段階認証登録時のtoken(ghp_***)をに変更すると、正常にpushできるようになった。 passwordが2段階認証登録時のtokenに置き換わったと考えられる。

変更方法

git remote set-url origin  https://<username>:ghp_***@github.com/***/***.git

以上でtokenがurlに入る。環境によって一概には言えないが、2段階認証後も正常にpushできるようになると思われる。

【JavaScript】switch文による条件分岐について

JSのswitch文についてのメモ。

条件分岐というと、通常if文が用いられているが、switch文を用いた方がスマートに見える場合も多い。

使用例として、今回は3色(金銀白)おみくじで使用してみる。

例1

const omikuji = "silver";
switch(omikuji) {
    case "gold":
        console.log("世界一周旅行券")
    break;
    case "silver":
        console.log("世界一周旅行券")
 break;
    case "white":
        console.log("ティッシュ")
    break;

if文を使うと以下の通り

例2

if (omikuji === 'gold'){
  console.log('世界一周旅行券');
}else if (omikuji === 'silver'){
  console.log('世界一周旅行券');
}else{
  console.log('ティッシュ');
}

比べると、条件分岐と演算子が多い場合、switchを使用した方が可読性が高くスマートに見える。

注意点

switch文で条件分岐させる場合、必ずcase句の最後にbreakを記述する。

そうしないと、switch文の最後まで実行されてしまいバグになる為、基本的にcaseとbreakはセットで使うもの覚える。

defaultについて

defaultをswitch文に組み込むことで、例1で言うと金銀白どの色にも該当しなかった場合(赤)の条件も分岐させることができる。

例3

const omikuji = "silver";
switch(omikuji) {
    case "gold":
        console.log("世界一周旅行券")
    break;
    case "silver":
        console.log("世界一周旅行券")
 break;
    case "white":
        console.log("ティッシュ")
    break;
    default "red":
        console.log("ハズレです")
)

defaultは通常switch文の最後で書くため、breakを記述する必要がない(以下に続くコードがないため)。

【JavaScript】残余引数について Rest parameters

JSの残余引数についてのメモ。

残余引数とは

ES2015から追加された機能。使用することでより柔軟な関数を作ることができる。 通常、関数において引数は指定した数のみ渡すことができるが、 残余引数を使用すると、不定数の引数を渡すことができる。

使用方法

例1

const book = (...pages) => {
    console.log(pages);
}

book(1, 2, 3, 4, 5); // => [1, 2, 3, 4, 5]

通常の引数と併用できる

残余引数は通常の引数と併用可能。

例2

const book = (title, ...pages) => {
    console.log(title);
    console.log(pages);
}

book("ハリーポッター",1, 2, 3, 4);

上記では、titleがハリーポッター、pagesに1,2,3,4という配列が渡される。 残余という意味合いでは、単独で利用するより理解しやすい。

注意点

残余引数を利用する場合、単独であれば問題ないが、例2のように複数の引数と併用する場合は、必ず最後の引数で残余引数を指定する必要がある。

つまり、

不可の例

const book = (...pages, title) => {
    console.log(title);
    console.log(pages);
} // ×

というように、第一引数に残余引数を持ってくることはできない。

【React】Hooksについてカウントアプリを作成して学ぶ

ReactはHooksの扱い方が重要だと感じた。 Railsからweb開発に入っている為、状態管理についてイメージしにくいため、学んだことを記事化する。

React Hooksとは?

version 16.8から新たに追加されたAPI。 Hooksを利用することで、関数コンポーネント(functional component)においても状態管理を行うことができる。

状態管理はカウントアプリを想像すると理解しやすい。 ボタンをクリックすると、数値が1ずつ上がっていく。 Hooksの中の機能の一つである、useStateを利用することで容易に作成できる。

以下がカウントアプリのコード例(component)。

import { React, useState, Fragment } from "react";

const Caluclator = () => {
  const [count, setCount] = useState(0);

  const countUp = () => {
    setCount(count + 1);
  };

  const countDown = () => {
    setCount(count - 1);
  };
  const countReset = () => {
    setCount(0);
  };

  return (
    <Fragment>
      <h1>{count}</h1>
      <button onClick={countUp}> + </button>
      <button onClick={countDown}> - </button>
      <button onClick={countReset}> RESET </button>
    </Fragment>
  );
};

export default Caluclator;

FunctionalComponent, アロー関数で書いている。

const [count, setCount] = useState(0);

これにより、count, setCount共に初期値は0と明示的に宣言している。 ちなみに、count はカウント数、setCountはカウント数を更新する関数だ。

なぜ引数を2つ(count, setCount)入れているかというと、useStateにおいては、state,stateを更新する関数をペアにするからだ。 つまり、今回のアプリではstate=count, stateを更新する関数=setCountとなる。

  const countUp = () => {
    setCount(count + 1);
  };

  const countDown = () => {
    setCount(count - 1);
  };
  const countReset = () => {
    setCount(0);
  };

こちらはカウントアップ(+)、カウントダウン(-)、カウントリセット(RESET)の関数。 setCountの引数にcount+1, count-1と入れることで、現在のcountの数値からそれぞれプラス、マイナスされる。 countResetではsetCount(0)とすることで、強制的に0に戻す。

  return (
    <Fragment>
      <h1>{count}</h1>
      <button onClick={countUp}> + </button>
      <button onClick={countDown}> - </button>
      <button onClick={countReset}> RESET </button>
    </Fragment>
  );

こちらのコードはreturnにより返却されるモノ。 countUp, countDown, countResetを呼び出し、ボタンを表示させる。

以上がHooksを利用したカウントアプリが完成した。

小ネタ:コード末尾のexport文を消す?

上記コード例では、末尾で

export default Caluclator

と、exportしているが、これは消すことができる。

const Caluclator = () => {
...

を、

export default function Caluclator {
...

と、予め宣言することで、末尾にexportを書く必要がなくなる。

【React】Fragmentで不要なdivタグを消す

Reactではreturnの後で必ず一つのタグでwrapsされている必要がある。

example)

import React from 'react';

export const Users = () => {
  <div>
    <h1>Hello, world!</h1>
  </div>
}

このようにdivでラップすると、html上でもdivタグが表示され、スマートではないと思っていた。

調べたところ、「Fragment」という便利な機能がやはり備わっていた。 使用方法としては単純で、Fragmentでwrapするだけ。こうすることで、HTML上で不要なタグ(div)が表示されず、よりスマートになる。

import React from 'react';

export const Users = () => {
  <Fragment>
     <h1>Hello, world!</h1>
  </Fragment>
}

Fragmentは短縮できる

Fragmentは更に短縮できる。と言っても

<Fragment>
</Fragment>

を、

<>
</>

にするだけだ。

しかし、個人的には知らない人がコードを見ると何じゃこれってなる為、で良いような気もした。