「Rust」標準出力でメッセージ出力し、改行せず標準入力を受け付ける方法「std::io::stdin::read_line,print!」

今回はRustで標準出力でメッセージ出力し、改行せず標準入力を受け付ける方法を紹介したいと思います。

結論

print!でメッセージを表示「要求」後にstd::io::stdout::flushでフラッシュで表示を行い、その後std::io::stdin::read_lineで標準入力を受け付けます。

サンプルコード

std::io::Write;flush()を実行する際に必要です。

use std::io::{stdin, stdout, Write};

fn main() {
    print!("input please: ");
    stdout().flush().unwrap();

    let mut input = String::new();
    stdin().read_line(&mut input).unwrap();

    println!("input is {}", input);
}

解説

print!("input please: ");でメッセージ出力を要求しstdout().flush().unwrap();でフラッシュ(表示)させます。

その後stdin().read_line(&mut input).unwrap();で入力を受け付けます。

print!でメッセージ表示を行うため改行が入っていないため同じ行で入力を受け付けます。

実行結果

cargo run xxx
   
input please: hoge
input is hoge

「Mac」treeコマンドの導入方法「M1(arm64),Intel(i386,x86)対応」

今回はMacでtreeコマンドの導入方法を紹介したいと思います。

MacのCPUはM1に上がっているためM1でも動作するか確認してあります(M1(arm64),Intel(i386,x86)対応)

結論

brewでインストールします。アーキテクチャx86(i386)でインストールしたものでM1(arm64)も動作しました。

インストール方法

アーキテクチャの確認と設定

i386が出力されるのを確認。

arch


i386

arm64が出力される場合はアーキテクチャx86(i386)に変更します。

arch -x86_64 zsh
arch


i386

brewでインストール

brewでインストールします。

brew install tree

動作確認

i386

arch


i386

tree結果

tree
.
└── sample
    └── src
        └── app.js

2 directories, 1 file

arm64

arch


arm64

tree結果

tree
.
└── sample
    └── src
        └── app.js

2 directories, 1 file

「Rust」bin配下にアプリを配置しアプリ単体を実行する方法

今回はRustで開発する際にbin配下にアプリを配置しアプリ単体を実行する方法を紹介したいと思います。

結論

bin配下に作成したアプリをcargo run --bin アプリ名で対象のアプリ単体で実行できます。

アプリの作成

通常通りcargo new xxx(xxxは任意のアプリ名)でアプリを作成しその配下にbinディレクトリを作成していきます。

cargo new sample
cd sample
mkdir src/bin

treeでディレクトリ構成の確認

tree結果

tree

.
├── Cargo.toml
└── src
    ├── bin
    └── main.rs

サンプルコード

今回は動作確認のためbin配下に1から10を足すアプリsum_1_to_10.rsを作成します。

fn main() {
    let mut total = 0;

    for i in 1..=10 {
        total += i;
    }

    println!("total:{}", total);
}

bin配下のアプリを実行

cargo run --bin アプリ名で対象のアプリ単体で実行できます。

cargo run --bin sum_1_to_10


total:55

【React,Jest, testing library】ReferenceError: fetch is not definedエラーの解消方法【vite,webpack】

今回はReactアプリを作成する際にReferenceError: fetch is not definedエラーが出た際の解消方法をエントリーします。

ケースとしてはcreate react appではなくwebpackviteでアプリを作成しアプリ内でfetchを使いAPIなどを利用したケースをJest + Testing libraryでテストを行った際にReferenceError: fetch is not definedが発生しました。

エラー概要

コンポーネントで呼び出しているfetchでエラーとなっています。

ReferenceError: fetch is not defined

      26 |   const handleClick = async (user: User) => {
      27 |     
    > 28 |     const response = await fetch('http://localhost:8080/xxxx', {
         |                      ^
      29 |       method: 'POST',
      30 |       mode: 'cors',
      31 |       cache: 'no-cache',

解消方法

cross-fetch/polyfillを用いて解消します。

npm install --save-dev cross-fetch

テストコードサンプル

import 'cross-fetch/polyfill'でポリフィルをimport

<Sample />コンポーネントが今回fetchを利用しているコンポーネントです。

import { render, screen } from '@testing-library/react'
import 'cross-fetch/polyfill'

describe('Sample', () => {
  it('test', async () => {
    render(
      <Sample />
    )
    expect(screen.getByText('テストコード')).toBeInTheDocument()
  }
}

SMARTフレームワークとは

SMARTフレームワークとは5つの要素「具体的」「測定可能」「行動指向」「関連がある」「時間制約」を含んだ問いかけや目標設定です。

5つの要素

具体的

その問いかけ(目標設定)は具体的か?

測定可能

その問いかけ(目標設定)は測定可能か?

行動指向

その問いかけ(目標設定)の答えは何かしらの行動計画を立てるのに意味があるか?

関連がある

その問いかけ(目標設定)は解決しようとしている特定の課題に関連しているか?

時間制約

その問いかけ(目標設定)の答え(達成条件)は調査対象(達成対象)となる特定の期間のものであるか?

避けた方が良い問いかけ

SMARTフレームワークにて問いかける際に避けた方が良い代表的な問いかけ例

誘導尋問

質問の中に回答を示唆している。

「このサービスは高いと思いますよね?」

選択式(クローズドエンド)

回答から一言しか得られず有益な情報になりえない。

「このサービスに満足していただけましたか?」

漠然、曖昧

具体的ではないケースやコンテキストがあってないケース

「このサービスはあなたにあってますか?」

Node.js Express QueryString(クエリストリング)の取得方法

今回はNode.js Express QueryString(クエリストリング)の取得方法についてエントリーします。

req.query.xxx(xxxはリクエスト時に指定したパラメータ名)で取得できます。

コード例

http://localhost:xxxx/sample?num=10とした場合res.json(req.query.num);eq.query.numには文字列の10が渡ってきます。

const express = require("express");
const app = express();
const PORT = process.env.PORT || 5000;

app.get("/sample", (req, res) => {
  res.json(req.query.num);
});

app.listen(PORT, () => {
  console.log(`Listening *: ${PORT}`);
});

Node.js Expressでパスパラメータの取得方法

Node.js Expressでパスパラメータの取得方法

http://localhost:5000/sample/123でパスパラメータの123を取得したい場合"/sample/:id"でエンドポイントを定義しreq.params.idで取得できる。また123は文字列なのでabc,1b3なども取得できる。ただし/sample/123/abcのように更に追加された場合はエラーとなる。

コード例

const express = require("express");
const app = express();
const PORT = process.env.PORT || 5000;

app.get("/sample/:id", (req, res) => {
  res.json(req.params.id);
});

app.listen(PORT, () => {
  console.log(`Listening *: ${PORT}`);
});

id?

/sample/:idと違い名前付きオプションとなりhttp://localhost:5000/sample,http://localhost:5000/sample/も追加でundefinedで取得できる。

const express = require("express");
const app = express();
const PORT = process.env.PORT || 5000;

app.get("/sample/:id?", (req, res) => {
  res.json(req.params.id);
});

app.listen(PORT, () => {
  console.log(`Listening *: ${PORT}`);
});

id*

"/sample/:id"に加えて/sample/123/abcのように更に追加されたケースでも取得できる(この場合は123が取得される)

const express = require("express");
const app = express();
const PORT = process.env.PORT || 5000;

app.get("/sample/:id*", (req, res) => {
  res.json(req.params.id);
});

app.listen(PORT, () => {
  console.log(`Listening *: ${PORT}`);
});

正規表現

"/sample/:id(\\d+)"で数字のみ許可できる

const express = require("express");
const app = express();
const PORT = process.env.PORT || 5000;

app.get("/sample/:id(\\d+)", (req, res) => {
  res.json(req.params.id);
});

app.listen(PORT, () => {
  console.log(`Listening *: ${PORT}`);
});