Node.js・npm・Yarnのバージョン確認方法

Web開発を始めるとき、Node.js やパッケージマネージャ(npm、Yarn)が正しくインストールされているか確認することは非常に大切です。 この記事では、初心者向けに 簡単にバージョンを確認する方法 をまとめました。

Node.js のバージョン確認

Node.js はサーバーサイド JavaScript を動かすための環境です。 インストールされている Node.js のバージョンは以下のコマンドで確認できます。

コマンドで確認する方法

node -v

または

node --version

出力例

$ node -v
v20.5.1

npm のバージョン確認

npm は Node.js に付属するパッケージ管理ツールです。 npm が使えるか確認するには以下のコマンドを実行します。

npm -v

または

npm --version

出力例

$ npm -v
10.1.0

npm が正しく表示されれば、Node.js と一緒に環境が整っていることがわかります。

Yarn のバージョン確認

Yarn は npm の代替として人気のあるパッケージ管理ツールです。 インストールされているか、バージョンを確認するには以下を実行します。

yarn -v

または

yarn --version

出力例

$ yarn -v
1.37.0

Yarn がインストールされていない場合

以下のコマンドで Yarn をインストールできます。

npm install -g yarn

まとめ

Node.js のバージョン確認 → node -v

npm のバージョン確認 → npm -v

Yarn のバージョン確認 → yarn -v

開発環境を整えるときは、まずこの3つを確認しておくと安心です。 バージョンが古い場合はアップデートして最新環境で開発を始めましょう。

GitHubで特定ファイルの特定文字列を変更したコミットとPRを特定する方法

GitHub上で、特定のファイルに加えた「特定の文字列」の変更を追跡したい場合があります。例えば、config.yaml 内の API_KEY の変更や、README.md 内のある文言の修正などです。

ここでは、その手順を解説します。

1. 特定文字列を含む変更を探す

方法1:Git CLI を使う

Git では -S オプションで、指定した文字列を追加・削除したコミットを探せます。

git log -S "検索したい文字列" --

"検索したい文字列": ファイル内で探したい内容

: 対象ファイル

例:

git log -S "API_KEY" -- config.yaml

これで、config.yaml 内で "API_KEY" を追加・削除したコミットが一覧で出ます。

方法2:GitHub Web UI を使う

リポジトリページで Code タブを開く

ファイル内で文字列を検索(t キーでファイル検索、または / キーで全文検索

目的の文字列が含まれるコミットを探す場合、History を確認して関連コミットを特定

CLI の方が確実で速いです。

2. 文字列を変更したコミットのPRを確認

文字列を含むコミットが特定できたら、前回の記事と同様にPRを確認できます。

方法1:Web UI

コミットページの右サイドバーで This commit is part of pull request #xxx を確認

方法2:GitHub CLI

gh pr view <commit-sha>

方法3:GraphQL API

{
  repository(owner: "org", name: "repo") {
    object(expression: "commit-sha") {
      ... on Commit {
        associatedPullRequests(first: 10) {
          nodes {
            number
            title
            url
          }
        }
      }
    }
  }
}

3. 実務での流れ(文字列単位)

文字列を含むコミットを特定 → git log -S "文字列" -- ファイルパス

コミットページでPRを確認 → Web UI or CLI or GraphQL

必要に応じて差分を確認 → git show <commit-sha> で、変更箇所を詳しく確認

4. 注意点

-S は文字列の 追加・削除 を検知するので、単純に文字列があるだけではヒットしません

squash merge で取り込まれた場合、個別コミットではなくまとめられたコミットでしか追えない

文字列が複数ファイルにまたがる場合はファイルごとに確認が必要

こうしておくと、「誰がいつ、どのPRで特定文字列を変更したのか」を簡単に追跡可能です。

「JavaScript」Setを用いてArray(配列)データの重複排除(ユニークに)する方法

今回は「JavaScript」Setを用いてArray(配列)データの重複排除(ユニークに)する方法をエントリーしたいと思います。

サンプルデータ

適当に数値が重複したArrayを用意します。

const numbers = [1, 1, 1, 5, 5, 5, 3, 2, 10, 9]

Setで重複排除

Setに用意したサンプルデータを渡します。

const uniqueNumbers = new Set(numbers)

確認

console.logで出力し確認してみましょう。重複が除かれた数値が出力されることが確認できます。並び順についてはSetでは昇順、降順などのソートはできないので注意しましょう。

console.log(uniqueNumbers)

Set(6) { 1, 5, 3, 2, 10, 9 }

「JavaScript」Array.prototype.sort()で複数データ(Array、配列)ソートする方法

今回は「JavaScript」Array.prototype.sort()で複数データ(Array、配列、数値、文字列)ソートする方法について解説したいと思います。

注意

今回はArray.sortを使ってソートを数値、文字列を降順、昇順でソートしますがArray.sortは破壊的な関数なため注意して使いましょう。

サンプルデータ

配列["数学点数","国語点数","理科点数","名前"]入れ子で配列でもったデータのソートを解説します。

// ["数学点数","国語点数","理科点数","名前"]
const grades = [
  [80, 50, 70, 'a'],
  [80, 60, 70, 'b'],
  [80, 60, 80, 'bb'],
  [80, 60, 80, 'bbb'],
  [80, 60, 80, 'bbbb'],
  [80, 60, 80, 'bbc'],
  [70, 70, 70, 'aba'],
  [70, 50, 70, 'cab'],
  [90, 70, 70, 'az'],
  [90, 70, 70, 'ab'],
  [90, 70, 70, 'abb'],
  [90, 50, 70, 'aa'],
  [90, 50, 60, 'baaa'],
  [90, 50, 60, 'baa'],
  [60, 50, 70, 'aaa'],
]

ソートその1

数学の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
})
console.log(grades)

[
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 80, 50, 70, 'a' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその2

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (a[1] > b[1]) return 1
  if (a[1] < b[1]) return -1
})
console.log(grades)

[
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 80, 50, 70, 'a' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 70, 50, 70, 'cab' ],
  [ 70, 70, 70, 'aba' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその3

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (b[1] > a[1]) return 1
  if (b[1] < a[1]) return -1
  if (b[2] > a[2]) return 1
  if (b[2] < a[2]) return -1
})

console.log(grades)

[
  [ 90, 70, 70, 'az' ],
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 90, 50, 60, 'baa' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 50, 70, 'a' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

ソートその4

数学の点数が高い順(降順)、次に国語の点数が高い順(降順)、次に理科の点数が高い順(降順)、次に名前順(昇順)

grades.sort((a, b) => {
  if (b[0] > a[0]) return 1
  if (b[0] < a[0]) return -1
  if (b[1] > a[1]) return 1
  if (b[1] < a[1]) return -1
  if (b[2] > a[2]) return 1
  if (b[2] < a[2]) return -1
  if (b[3] < a[3]) return 1
  if (b[3] > a[3]) return -1
})

console.log(grades)

[
  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 70, 70, 'az' ],
  [ 90, 50, 70, 'aa' ],
  [ 90, 50, 60, 'baa' ],
  [ 90, 50, 60, 'baaa' ],
  [ 80, 60, 80, 'bb' ],
  [ 80, 60, 80, 'bbb' ],
  [ 80, 60, 80, 'bbbb' ],
  [ 80, 60, 80, 'bbc' ],
  [ 80, 60, 70, 'b' ],
  [ 80, 50, 70, 'a' ],
  [ 70, 70, 70, 'aba' ],
  [ 70, 50, 70, 'cab' ],
  [ 60, 50, 70, 'aaa' ]
]

出力結果の最初の3行に注目しましょう。文字列では'ab','abb','az'と少ない文字数を優先し次の文字が出現した場合それ(今回は'az')に推移します。

  [ 90, 70, 70, 'ab' ],
  [ 90, 70, 70, 'abb' ],
  [ 90, 70, 70, 'az' ],

「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