Ikeda's Blog

USB接続の外付けHDDを、ラズパイ使ってNAS化した

構築に用いたもの

  • 外付けHDD(BUFFALO製品x1、I-O DATA製品x1) > 家に転がってたやつ
    • 途中で初期化するので、中身のデータは退避させておく
  • サンワサプライ カテゴリ8メッシュフラットLANケーブル
    • 構築途中で有線LANは必須と痛感
      • 初期設定だと、ラズパイのWi-Fiは一定時間でスリープする
      • それ以前に、めちゃくちゃ遅いので大きいデータのやり取りに向いてない
  • Raspberry Pi 4 スターターキット
    • 必要なもの全部揃ってるので、ラズパイ初めてだから選択
  • microSDアダプタ > 家に転がってたやつ
    • WindowsPCから、microSDカードにデータの書き込みを行うために使用した

構築手順

1. microSDにOSを再インストール(自PC)

スターターキットのmicroSDには、最初からNOOBSがインストールされているのですが、このNOOBSがどうやら非推奨になったらしく。
Raspberry Pi Imagerが公式から配布されているので、こちらを利用しました。

インストーラを使ってインストールし、起動。
microSDカードをPCにつないで、初期化。
※ストレージは各環境に合わせてください

初期化完了後、OSを「Raspberry Pi OS (Other) > Raspberry Pi OS Lite (64-bit)」の順で選択。
※GUI環境でも動くらしいが必要ないので、CUI環境にしたい

2. ラズパイ組み立て(物理)

ラズパイは、スターターキットに説明書があるので、その通りに組み立てる。
上記1でOSをインストールしたmicroSDカードをセットするのを忘れずに(一敗)
諸々の設定を行うために、モニタとキーボードを繋いで、ひとまずデスクにでも置いておく。

3. SSH接続できるようにする(Raspberry Pi)

/etc/dhcpcd.conf に以下を記載してIPアドレスを固定。
※IPアドレスはそれぞれの環境にあわせて調整

interface eth0
static ip_address=192.168.10.111/24
static routers=192.168.10.1
static domain_name_servers=192.168.10.1

4. OpenMediaVaultをインストール(自PCからSSH接続)

インストール完了後、私の環境ではSSH接続できなくなりました。
後述する設定で解消できますが、念の為、SSH以外でもアクセスできる環境でこの作業はした方が面倒がなくてよろしいかと思います。(一敗)

インストール自体は、以下のコマンドで楽々。

wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash

5. 初期化や設定を行ってNAS化(自PC)

手順3で指定したIPに、ブラウザからアクセスします。(例ではhttp://192.168.10.111/
アカウントの初期設定は、

  • ID
    • admin
  • PASS
    • openmediavault

となっています。

5-1. パスワードの変更

初期パスワードから変更するのであれば、右上の人アイコンから可能です。

5-2. SSH接続設定

ユーザーの管理メニューから、ユーザーを作り、グループに「_ssh」を追加しておく。

5-3. 初期化

左メニューでストレージ > ディスクの順に選択。
HDDを選択して、ワイプをクリック。初期化します。

5-4. マウント

左メニューでストレージ > ファイルシステムの順に選択。
「+」アイコンをクリックして、「EXT4」を選択。
デバイスを指定し、保存ボタンを押す。
※完了まで時間がかかる場合があるので、小休止ポイント。

5-5. 共有フォルダ設定

左メニューでストレージ > 共有フォルダの順に選択。
「+」アイコンをクリックする。

各項目を入力/指定して保存する。

5-6. ユーザ作成

NASにアクセスしてファイルの読み書きをするユーザーを作成する。
左メニューで、ユーザー > ユーザーの順に選択。
「+」アイコンをクリックし、「作成」を選択。

ここで指定する名前とパスワードは、接続する際に求められるので、わかりやすくしておく方が良い。

5-7. 接続確認(自PC)

エクスプローラ等から、NASのIPを指定してアクセスする。
認証情報を入力してアクセスできれば成功。

6. 設置(物理)

部屋の隅に設置してHDD、LAN、電源を接続する。

ex. その他設定

Wi-Fiを無効化する

SSH接続し、以下のコマンドを実行する。

iwconfig wlan0 txpower off

定期リセット

OpenMediaVaultの管理画面にアクセスする。
左メニューで、システム > 電源管理 > スケジュールされたタスクの順に選択。
「+」アイコンをクリックし、スケジュールを登録する。

Webサーバも兼ねる

php8.2もあるので、例えば「動画を保存してあるディレクトリの中身を精査して、一覧表示するWEB画面」とか作れる。

1. OpenMediaVaultの管理画面を、別ポートで動かす

/etc/nginx/sites-enabled/openmediavault-webguiを開き、ポート部分を変更する

    listen *:80 default_server;
    listen [::]:80 default_server;

 ↓

    listen *:8000 default_server;
    listen [::]:8000 default_server;
2. NASの特定ディレクトリをWEBディレクトリとした設定ファイルを作成

/etc/nginx/sites-enabled/nas-serverを新規作成し、以下の内容で保存する
内容は、/etc/nginx/sites-enabled/openmediavault-webguiをコピーし、必要な部分だけ修正する。
※変更した箇所にコメントを追記しています。

server {
    # server_nameはもちろん変更
    server_name nas-server;
    # rootはNASの特定フォルダを指定。OpenMediaVaultの管理画面で、「ストレージ > 共有フォルダ」でアクセスすると、絶対パスが確認できる
    root /srv/dev-disk-by-uuid-4517deb2-270a-4da7-8cbb-a750d0acb5bd/NAS01/workspace/;
    index index.html;
    autoindex off;
    server_tokens off;
    sendfile on;
    large_client_header_buffers 4 32k;
    client_max_body_size 25M;
    # ログファイルは別になるよう変更
    error_log /var/log/nginx/nas-server_error.log error;
    access_log /var/log/nginx/nas-server_access.log combined;
    error_page 404 = $scheme://$host:$server_port/#/404;
    location / {
        try_files $uri $uri/ =404;
    }
    location ~* /index.html|\.json$ {
        add_header Cache-Control "no-cache, must-revalidate";
        add_header Pragma "no-cache";
        expires 0;
    }
    location ~* \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/run/php/php8.2-fpm-openmediavault-webgui.sock;
        fastcgi_index index.php;
        fastcgi_read_timeout 60s;
        include fastcgi.conf;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }
    # OpenMediaVaultの管理画面から貰い受けたポートを使う
    listen *:80 default_server;
    listen [::]:80 default_server;
}
3. nginx再起動

systemctl reload nginx

4. 動作確認

設定したrootディレクトリに合わせた場所にindex.htmlを作成して、アクセスしてみる。
(私の環境ではhttp://192.168.10.111/
OpenMediaVaultの管理画面ではなく、index.htmlの内容が表示されれば成功。

ノイズキャンセリング・ヘッドセット WH-CH720Nのレビュー

はじめに

あくまで、個人の感想になります。

概要

【SONY】ワイヤレス ノイズキャンセリングステレオヘッドセット WH-CH720N

価格

価格com
2023年3月現在、2~2.2万円あたり。

ざっくり結論

★★★★☆(5点中、4点)

買って良かった……!

良かった点

つけ心地

頭の大きめな人ならわかってもらえると思うが、オーバーヘッド型と呼ばれる形のヘッドホンって、締め付けがきつく感じてしまうことがあります。
私はそれが苦手なのでイヤホン型を愛用していましたが、様々な理由から、今回は本製品を購入。
この製品独自か、それとも全体的なものかは分かりませんが、数年前に比べて非常にクッションが柔らかくなったように感じます。
在宅勤務中の9時間ずっとつけていても、嫌な感じはありませんでした。

音質

これは、本当に個人の感覚というか、私はそんなに耳が良くないことを前提においてください。
作業用BGMとして、アイルランドの伝統音楽を演奏するグループ「Lúnasa」のCDをよく聞いています。
普段は気にならなかったフルートなどの楽器の"息継ぎ"が、クリアに聞こえるようになりました。
(これはこれで集中できないので、別のCDを聞くようになりましたが)
低音だ高音だといったところはわかりませんが、細かな音がしっかり聞き取りやすいのは良いと思っています。

重量

軽ぅい……。
192gだそうで、これも長時間使用する上ではありがたい。

ノイズキャンセル・外音取り込み

稼働中の換気扇近くで、音楽などは再生せずに実験。
ノイズキャンセリングをON → ほぼ無音。
ノイズキャンセリングをOFF(外音取り込み) → 換気扇の稼働音がちゃんと聞こえる
ボタンひとつでこれらの状態が切り替わるのは、ノイズキャンセル初心者にとっては感動ものでした。
それぞれの機能には満足。

音ズレ

ワイヤレス状態で、アニメ1本(20分強)を視聴しましたが、音ズレはほとんどなし。

ダメな点

マニュアル

ついてません。
公式サイトから見ようと思っても、商品ページにはそれらしいリンク無し。
あっちこっち探して、ようやく見つけました。
コチラ

充電用ケーブル

ケーブル長は約20cm。短い。

LaravelでDBから取得した主キーがおかしい

前提条件

以下のような設定でテーブルを作成していた。
先に言ってしまうと、主キーが文字列なことが問題点。

Schema::create('members', function (Blueprint $table) {
    $table->string('id', 50)->primary();
    $table->text('name');
    $table->timestamps();
    $table->softDeletes();
});

データ内容

id name
a.ikeda Ikeda A
b.ikeda Ikeda B

データを取得し、内容を表示すると……

dump(Member::all()->toArray());
array:2 [▼
  0 => array:5 [▼
    "id" => 0
    "memo" => "Ikeda A"
  ]
  1 => array:5 [▼
    "id" => 0
    "memo" => "Ikeda B"
  ]
]

idが「0」になってしまう。

原因

ドキュメントの Eloquent ORM > Eloquentの準備にある、「主キー」

さらに、Eloquentは、主キーが増分整数値であることも想定しています。これは、Eloquentが主キーを自動的に整数にキャストすることを意味します。

そのまま書いてありました。主キーを整数にキャストしてしまうため、文字列だけ入れていると「0」になってしまうのでした。
そして、解決方法も同じように書いてあります。

非インクリメントまたは非数値の主キーを使用する場合は、モデルにpublicの$incrementingプロパティを定義し、falseをセットする必要があります。

モデルの主キーが整数でない場合は、モデルにprotectedな$keyTypeプロパティを定義する必要があります。このプロパティの値はstringにする必要があります。

の2箇所です。

対策

app\Models\*****.phpに、以下の記述を追加することで解決します。

<?php

class Member extends Model
{
    public $incrementing = false; // モデルのIDを自動増分するか
    protected $keyType = 'string'; // IDのデータ型

    // 以下省略
}

CSSだけでスムーススクロールさせる

とても簡単

html {
    scroll-behavior: smooth;
}

これだけ

下へスクロールします。



































余談(スクロール実験のため)

以前にスムーススクロールを実装しようとしたら、JavaScriptで結構しっかり作るか、ライブラリを使うか、みたいな選択肢しかなかった。
便利になったもんだなぁ、としみじみ思いました。

PHPで数値文字参照

はじめに

「PHP 数値文字参照」なんかで検索すると出てくる手法が不完全なので、備忘録。
mb_convert_encodingを利用する方法を記載する記事が多いが、記号が変換できない。

mb_convert_encodingで変換してみる

以下のコードの結果で、ひらがなや全角アルファベットは変換できているが、「$%&」などの記号がそのままになってしまっているのがわかる。
※𪘂𪘚𪚲は、UTF-8の4バイト文字。

$before = '$%&あいうABC𪘂𪘚𪚲';
$after = mb_convert_encoding($before, 'HTML-ENTITIES', 'UTF-8');
var_dump($after); // string(78) "$%&&#12354;&#12356;&#12358;&#65313;&#65314;&#65315;&#173570;&#173594;&#173746;"

mb_encode_numericentityで変換してみる

mb_encode_numericentity
こちらであれば、記号も無事に数値文字参照へと変換できる。

$before = '$%&あいうABC𪘂𪘚𪚲';
$map = [0, 0x10FFFF, 0, 0xFFFFFF];
$after = mb_encode_numericentity($before, $map, 'UTF-8');
var_dump($after); // string(90) "&#36;&#37;&#38;&#12354;&#12356;&#12358;&#65313;&#65314;&#65315;&#173570;&#173594;&#173746;"

変換結果をHTMLで表示すれば、うまくいったことがわかる

■ source

&#36;&#37;&#38;&#12354;&#12356;&#12358;&#65313;&#65314;&#65315;&#173570;&#173594;&#173746;

■ result
$%&あいうABC𪘂𪘚𪚲