ソースに絡まるエスカルゴ

貧弱プログラマの外部記憶装置です。

【Wi-Fiルータ】回線速度改善のためにv6プラス対応のルータに置き換えてみた

 自分が家で使っているインターネット固定回線はVDSLという古のものなのですが、昨今の情勢からかただでさえ遅い回線速度が致命的なまでに遅くなっていました。
 どれぐらい遅いかというとこちらのページで計測した結果、ひどい時で以下のような感じでした。
f:id:rikoubou:20201117181529p:plain

 具体的にはYoutubeのようなIPv6での接続ならそれなりに快適なのですが、IPv4での接続であるTwitterの画像ですらクリックして読み込むのに時間がかかると言った具合でした。

 流石にどうにかしたいと自分なりに調べたり知り合いに相談したりしたところ、「v6プラス」というサービスが利用できれば回線速度が速くなる可能性があるということでした。

 ということで、今回はv6プラス対応のルータに置き換えてみた時の備忘録というか日記みたいな内容になります。


 では、始めます。


1:v6プラスのサービスを有効にする
 v6プラスの提供有無や有効化の方法はプロバイダによって異なりますが、基本的にはプロバイダに電話をして有効にしてもらうか、会員ページのようなところで操作をして有効にする場合が多いと思います。詳しいやり方は各自で調べて行ってください。

 自分の場合はSo-net光なのですが、マイページの「ご契約サービスのご利用状況」の中にv6プラスの項目で有効になっていることを確認できます。
f:id:rikoubou:20201119230417p:plain

 v6プラスが有効になっていないと、対応しているルータを購入しても使えないのでちゃんと有効にしておくようにしましょう。


2:v6プラス対応のWi-Fiルータを入手する
 v6プラスが有効になっていることを確認したら、次はv6プラスに対応しているルータを購入またはレンタルします。

 v6プラスを提供しているプロバイダの多くは対応ルータのレンタルを行っているかと思います。例えばSo-net光だと以下のような対応ルータのレンタルページが存在します。

 別途月額料金がかかったり違約金が発生したりと値段が高いと思うので、個人的には「ルータは購入する」のをオススメします。

 ではどのルータを買えばいいのかという話ですが、レンタルページに型番が掲載されているのでその型番と同じ商品を購入するのが一番確実で楽です。例えば先のSo-net光のレンタルルータの型番で調べてみると価格.comで以下の商品ページが出てきます。

 大体4000円台で買えるようなので、1年以上使うのであれば購入した方がお得かもしれません。

 この他にも例えば「BUFFALO」にはv6プラスに対応したルータ商品一覧があるので、ここから探してもいいかもしれません。他のメーカーにもおそらく同様のページがあるはずです。

 いろいろとv6プラス対応ルータがある中で自分が購入したのは以下の商品です。

 購入理由としては、今まで使っていたルータがBUFFALO製品だったのと価格が購入時点で4000円以下と安かったからという2点です。

 とにかくv6プラスに対応していればなんでもいい、という人は安いルータを探して購入しましょう。


3:既存のWi-Fiルータと置き換える
 v6プラス対応ルータに置き換える作業ですが、購入した「BUFFALO WiFi 無線LAN ルーター WSR-1166DHPL2/N」の説明書通りにやれば自分はすんなり置換ができました。
 既存ルータの設定の引越し機能があり、新しいルータで設定しなおすという手間が省けてとても便利でした。

 ただし、デフォルトでv6プラスの設定が有効にはなっていないので、ルータ内にログインして自分で設定する必要があります。


4:ルータのv6プラス設定を有効にする
 ルータを置き換えてインターネットに繋がることが確認できたら、ルータ側でv6プラス設定を有効にする必要があります。

 基本的には以下のページの方法に沿ってやっていけばOKです。


「BUFFALO WiFi 無線LAN ルーター WSR-1166DHPL2/N」の場合、以下のアドレスをブラウザに入力することでルータのログイン画面を表示できます。

 アクセスすると以下のようなログイン画面が表示されるので、購入した箱の中にあるユーザ名とパスワードを入力してログインします。
f:id:rikoubou:20201119232835p:plain

 ログインするとホーム画面が表示されるので「詳細設定」をクリックします。
f:id:rikoubou:20201119233125p:plain

 左側のメニューにある「Internet」→「Internet」をクリックして「v6プラスを使用する」にチェックを入れます。
f:id:rikoubou:20201119233545p:plain

「v6プラスを使用する」にチェックが入った状態で「設定」ボタンをクリックします。
f:id:rikoubou:20201119234009p:plain

 するとインターネットが一度切断され、v6プラスで接続できるかどうかの確認をした後にv6プラスでインターネットに接続されます。この処理には数分かかる場合があるので「接続成功」の表示が出るまで気長に待ちます。

 一度設定すればPCやスマホ側でインターネットを切断、再接続をしてもv6プラスでインターネットに接続してくれます。

 ちなみにv6プラスを有効にした結果、夜でも以下のようにIPv6とほぼ変わらない速度が出るようになりました。しかもアップロードに関してはIPv6よりも速くなっていたりしています。
f:id:rikoubou:20201119234551p:plain


 以上がv6プラス対応のルータに置き換えた内容になります。

 IPv4での速度がストレスに感じていたので、ルータを買い換えるだけで快適になって本当に良かったです。


おまけ:v6プラス(IPv4 over IPv6)について
「v6プラス」という名称の他に「IPv6オプション」や「transix」というようにプロバイダによって色々呼び方は違いますが、やっていることは同じで「IPv4 over IPv6」というものです。

 IPv4IPv6では接続経路が違っており、一般的にIPv4の方が混雑、IPv6の方が空いているというような状況です。一番最初に挙げているあの画像がまさしくその通りの速度で、IPv4は混雑しているから遅い、IPv6は空いているから速いということになります。IPv4が一般道、IPv6が高速道路みたいなイメージです。

 このIPv4の速度を改善するために出てきたIPv4 over IPv6というサービスですが、簡単に言うと「IPv6でいけるところまで行ってIPv4でないといけないところだけIPv4を使う」という感じです。要は目的地まで一般道しか通らないのが従来のIPv4での接続経路でしたが、IPv4 over IPv6では途中できる限り高速道路であるIPv6の経路を通って行くというイメージです。

 これにより回線速度向上が見込めるということです(ただしVDSLは上限100Mbpsなのでそれ以上の速度は出ませんが…)。


・参考資料

【Windows】Reactの環境を構築する

 今までWeb系の方には手を出していなかったのですが、そろそろ挑戦してもいいかもしれないと思うようになってきました。

 開発環境は色々ありますが、Reactを使ってみようと思ったのでその環境構築の備忘録です。
 ちなみにブラウザ上でReactのコードを書くこともできますが、ローカル環境構築になります。
 基本的には公式ページのチュートリアルのままなので、詳しいことを知りたい方はそちらを参照してください。


 では、始めます。


1:node.jsのインストール
 Reactを使うためにはNode.jsをインストールしておく必要があります。

 以下の公式のダウンロードページを開きます。

 環境に合ったインストーラを選択してクリックし、ファイルをダウンロードします(今回はLTSのWindows 64bit msiを選択しました)。
f:id:rikoubou:20201112135438p:plain

 ダウンロードしたインストーラを起動させると、インストールできるかどうかのチェックが走るので少し待ちます。
f:id:rikoubou:20201112135606p:plain

 チェックが終わるとインストールを進められるようになるので「Next」をクリックします。
f:id:rikoubou:20201112135643p:plain

 ライセンスが表示されるので読み、同意するのところにチェックを入れて「Next」をクリックします。
f:id:rikoubou:20201112135840p:plain

 インストール場所が表示されるので、デフォルトのままで「Next」をクリックします。
f:id:rikoubou:20201112140010p:plain

 カスタムインストールもデフォルトのままで「Next」をクリックします。
f:id:rikoubou:20201112140208p:plain

 Nativeモジュールの追加が尋ねられますが、デフォルトでチェックを外したままで「Next」をクリックします。
f:id:rikoubou:20201112140718p:plain

 インストールの準備ができたので「Install」をクリックします。
f:id:rikoubou:20201112140801p:plain

 PCに変更を加えるか尋ねられるので「はい」を選択します。

 インストールが始まるので終わるまで待ちます。
f:id:rikoubou:20201112140925p:plain

 インストールが終わったら「Finish」をクリックします。
f:id:rikoubou:20201112141120p:plain

 次にちゃんとNode.jsがインストールされているかを確認していきます。

 コマンドプロンプトPowerShellを起動させて以下のコマンドを実行します。

$ node --version

 以下のようにバージョンが表示されていればNode.jsのインストールは完了です。
f:id:rikoubou:20201112141712p:plain


2:Reactのチュートリアル
 Node.jsのインストールができたのでReactを使ってチュートリアルにある空の3×3のマスを表示させてみます。

 まずはどこでもいいのでReact用の空フォルダを作成します。自分はドキュメント配下に「react」という空フォルダを作成しました。

 コマンドプロンプトPowerShellを立ち上げて以下のコマンドでそのフォルダに移動します。

$ cd [React用空フォルダパス]

 フォルダに移動したら、以下のコマンドを実行します。

$ npx create-react-app my-app

 必要なパッケージのインストールやテンプレートのダウンロードが開始されるので、終わるまで待ちます。

 ちなみにコマンドが終了すると「my-app」というフォルダが作成されます。
f:id:rikoubou:20201112143445p:plain

 先ほどのコマンドが終了したら、以下の4つのコマンドを順に実行します。

$ cd my-app # my-appフォルダへ移動
$ cd src # srcフォルダへ移動
$ del * # 現在いるのフォルダ内をすべて削除
$ cd .. # my-appフォルダへ戻る

 srcフォルダ内をすべて削除したら、そのsrcフォルダ内に以下のファイルを新規作成します。

・index.css

body {
    font: 14px "Century Gothic", Futura, sans-serif;
    margin: 20px;
  }
  
  ol, ul {
    padding-left: 30px;
  }
  
  .board-row:after {
    clear: both;
    content: "";
    display: table;
  }
  
  .status {
    margin-bottom: 10px;
  }
  
  .square {
    background: #fff;
    border: 1px solid #999;
    float: left;
    font-size: 24px;
    font-weight: bold;
    line-height: 34px;
    height: 34px;
    margin-right: -1px;
    margin-top: -1px;
    padding: 0;
    text-align: center;
    width: 34px;
  }
  
  .square:focus {
    outline: none;
  }
  
  .kbd-navigation .square:focus {
    background: #ddd;
  }
  
  .game {
    display: flex;
    flex-direction: row;
  }
  
  .game-info {
    margin-left: 20px;
  }

・index.js

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';

class Square extends React.Component {
  render() {
    return (
      <button className="square">
        {/* TODO */}
      </button>
    );
  }
}

class Board extends React.Component {
  renderSquare(i) {
    return <Square />;
  }

  render() {
    const status = 'Next player: X';

    return (
      <div>
        <div className="status">{status}</div>
        <div className="board-row">
          {this.renderSquare(0)}
          {this.renderSquare(1)}
          {this.renderSquare(2)}
        </div>
        <div className="board-row">
          {this.renderSquare(3)}
          {this.renderSquare(4)}
          {this.renderSquare(5)}
        </div>
        <div className="board-row">
          {this.renderSquare(6)}
          {this.renderSquare(7)}
          {this.renderSquare(8)}
        </div>
      </div>
    );
  }
}

class Game extends React.Component {
  render() {
    return (
      <div className="game">
        <div className="game-board">
          <Board />
        </div>
        <div className="game-info">
          <div>{/* status */}</div>
          <ol>{/* TODO */}</ol>
        </div>
      </div>
    );
  }
}

// ========================================

ReactDOM.render(
  <Game />,
  document.getElementById('root')
);

 この2つのファイルの作成ができたら以下のコマンドを実行して起動させます。

$ npm start

 ちなみに実行すると以下のようになります。
f:id:rikoubou:20201112145429p:plain

 起動後になんでも良いのでブラウザを開き「http://localhost:3000/」にアクセスすると、以下のような3×3のマス目が表示されます。
f:id:rikoubou:20201112145545p:plain

 終了させたい場合は、「npm start」コマンドを実行している画面で「Ctrl + C」を連打していると「バッチジョブを終了しますか (Y/N)?」と尋ねられるので「y」と入力してEnterキーを押下することで終了できます。
f:id:rikoubou:20201112150013p:plain

 終了させた状態で再度「http://localhost:3000/」にアクセスしても、マス目は表示されなくなります。
f:id:rikoubou:20201112150151p:plain


 以上がWindowsでのReactの環境構築方法になります。

 まだ環境を導入したというだけなので、これからちょっとずつでもReactを勉強していきたいですね…。


・参考資料

【https化】このブログをhttps化してみました

 かなり前から「このはてなブログhttps化をしないとなぁ」と思いながらも面倒そうなのでやってませんでした。

 しかし最近になって記事単体のページから編集できなくなったり、はてなのトップページ以外からログインできなくなったりと不便になってきたので、ついにhttps化をする決意をしました。

 が、実際にやってみるとかなり簡単だった上に、懸念だったリンクの貼り替えもどうやら発生しなかったようでした。

 https化は一度やってしまえばやらなくていいものですが、一応備忘録として残しておこうとおもった次第です。


 では、始めます。


1:バックアップを取る
 ほとんどの場合、特に問題は発生しないと思いますが、https化をすると元に戻せなくなるのでブログのバックアップを取っておきます。

 管理画面の「設定」→「詳細設定」を開きます。
f:id:rikoubou:20201111160437p:plain

 開いたページをスクロースした先にある「記事のバックアップと製本サービス」をクリックします。
f:id:rikoubou:20201111160618p:plain

 エクスポートするボタンがあるので、それをクリックします。

 しばらくすると以下のような表示になるので「ダウンロードする」をクリックします。
f:id:rikoubou:20201111160746p:plain

 するとブログのバックアップファイルがダウンロードされます。


2:https化をする
 https化をするために、もう一度管理画面の「設定」→「詳細設定」を開きます。
f:id:rikoubou:20201111160437p:plain

 項目の中に「https配信」があり、その項目が「無効」となってるはずなので、その横にある「HTTPS配信の状況を確認する」をクリックします。
f:id:rikoubou:20201111161117p:plain

 以下のような画面になるので「有効にする」をクリックします。
f:id:rikoubou:20201111161551p:plain

 chromeの場合、以下のようなポップアップが出てくるので「OK」をクリックします。
f:id:rikoubou:20201111161645p:plain

 これでブログのhttps化は完了です。


 以上がはてなブログhttps化の手順になります。

 https化した後色々確認したのですが、自分の別記事をリンクしたもの(記述内容はhttp)でも問題なくhttpsに変更されたページを開くことができます。
 また画像に関してもhttpでアップロードされたものでも表示はできており、その画像のみのリンクを開くとhttpとなっているというだけでエラーで表示されないといったことはないようでした。画像は恐らく2016年の8月以前まではhttpとなっていたらしいので、気になる方は画像をダウンロードして再度アップロードしてリンクを貼り直せばhttpsに差し替えることができます。

 自分のブログは割と記事の数が多いので全部チェックということまではできないので、https化したことで何かおかしな表示などがありましたらコメント等いただければと思います。


・参考資料

【Raspberry Pi】Raspberry PiにSambaを入れてNASにする

 最近作った自作PCのデータ保存容量を増やそう思い内蔵HDDを購入しました。ですが「組んだPCをまた開けてHDDを増設するのが面倒だし、他のPCと共通で使えるようにしたい」と考え何か良い方法はないかと思っていたところNAS(Network Attached Storage)」というものがあると知りました。NASは簡単に言うと同じネットワーク内で接続できるファイルサーバみたいなものです。特に自宅などのWi-Fiネットワーク内にNASを構築すれば、無線でファイルサーバにアクセスできるのでケーブル要らずで便利です。さらに調べていくとRaspberry Piで簡単にNASを作れるということもわかりました。

 前置きが長々となりましたが、そんな理由で今回はRaspberry Piを使ってNASを作ってみた備忘録になります。


 では、始めます。


0:Raspberry PiとHDDの準備
 Raspberry Piを普通に使うためにSDカードにOSを書き込んで最低限の環境を構築しておきます。以下の記事の内容を行っている前提で進めていきます。

 またIPアドレスを固定していた方が何かと便利なので、以下の記事に沿ってIPアドレスを固定しておきます。

 Raspberry Piに繋げるHDDはexFATでフォーマットしたいので、以下の記事に沿ってexFATでフォーマットしておきます。


1:マウント用ディレクトリの作成とHDDの認識確認
 最初にHDDのマウント用ディレクトリを作成しておきます。

「/mnt」ディレクトリ配下であればなんでもよいと思いますが、自分の場合は「hdd01」というディレクトリ名にして作成しました。

$ mkdir /mnt/hdd01

 
 以降は「/mnt/hdd01」に外付けHDDをマウントするという前提で進めます。

 次にHDDをUSBケーブルでRaspberry Piに接続した状態で以下のコマンドを実行します。

$ sudo fdisk -l

 このコマンドを実行すると色々出てきますが「/dev/sda1」や「/dev/sda2」と書かれているものが認識されているHDDになります。

 以降は「/dev/sda1」のHDDをファイルサーバにするという前提で進めていきます。


2:exFATのHDDをマウントする
 Raspberry PiでマウントさせたいHDDがexFATでフォーマットされたもの場合、そのままマウントコマンドを実行してもエラーになります。なので以下のコマンドを実行してexFATをマウントできるようにします。

$ sudo apt-get install exfat-fuse exfat-utils

 上記コマンド実行後に以下のマウントコマンドを実行するとエラーなくマウントされます。

$ sudo mount /dev/sda1 /mnt/hdd01

 これで「/mnt/hdd01」ディレクトリ配下にファイルを作成するとHDDに保存されるようになります。

 HDDをラズパイから取り外したいときは、以下のコマンドでアンマウントさせてから取り外します。

$ sudo umount /mnt/hdd01


3:Sambaのインストール
 いよいよ本題のファイルサーバの準備に入ります。

 ファイルサーバにするために、今回はSambaをインストールします。

 Sambaのインストールは以下のコマンドを実行します。

$ sudo apt install samba samba-common-bin

 インストール途中で以下のような画面が出てきますが「いいえ」を選択します(参考ページより引用)。
f:id:rikoubou:20201021053758j:plain

 これでSambaのインストールは完了です。


4:Sambaの設定ファイルの編集
 最初に以下のコマンドでデフォルトのSamba設定ファイルのバックアップを取っておきます。

$ sudo cp /etc/samba/smb.conf /etc/samba/smb.conf_backup

 エディタはなんでもいいですが、今回はnanoを使って設定ファイルを編集していきます。

$ sudo nano /etc/samba/smb.conf

 以下の記述をファイルの最後に追記します。

[nas_hdd1]
comment = nas
path = /mnt/hdd01
public = no
read only = no
browsable = yes
force user = pi

 少し解説しておくと、各項目は以下のような意味になっています。
[nas_hdd1]:外部からアクセスした時に表示されるディレクトリ名。括弧の中の文字列は任意。
comment:アクセスした時に表示されるディレクトリ名にマウスカーソルを合わせた時に出てくる説明。
path:ファイルサーバにするディレクトリパス。
public:yesだとパスワードなしのゲストユーザでも利用可能。
read only:yesだと読み込みのみ。noだと書き込み可能。
browsable:yesだと利用可能な共有の一覧に表示。noだと非表示。
force user:ファイル操作をする時のUNIX上でのユーザ。

 詳しい説明は以下のページを参照してください。

 編集が完了したらファイルを上書き保存してエディタを終了させます。

 次に以下のコマンドでSambaを再起動させ、更新した設定ファイルを有効にします。

$ sudo systemctl restart smbd


5:Sambaのユーザとパスワード設定
 Samba用のユーザとパスワードを設定します。

「pi」という名前のユーザでSambaのパスワードを設定するコマンドは以下の通りです。これはSamba用のユーザとパスワードなのでRaspberry Piのユーザとパスワードとは関係ありません。なので別のパスワードにしておくのが良いです。

$ sudo smbpasswd -a pi

 パスワードを設定したらSambaを再起動させます。

$ sudo systemctl restart smbd

 パスワードが設定されているユーザ一覧は以下のコマンドで確認できます。今回であれば「pi:1000:」というように表示されるはずです。

$ sudo pdbedit -L

 これでSambaの設定は全て終了です。

 ちなみにRaspberry Piが起動すると自動的にSambaも起動されます。

 Sambaが起動しているかどうかは以下のコマンドで確認できます。

$ ps aux | grep smbd
root       679  7.3  3.8  44888 16824 ?        Ss   07:17   0:01 /usr/sbin/smbd --foreground --no-process-group
root       724  0.0  1.2  41964  5720 ?        S    07:17   0:00 /usr/sbin/smbd --foreground --no-process-group
root       726  0.0  1.1  41956  5272 ?        S    07:17   0:00 /usr/sbin/smbd --foreground --no-process-group
root       739  0.0  1.3  44888  6016 ?        S    07:17   0:00 /usr/sbin/smbd --foreground --no-process-group
pi         814  0.0  0.4   3900  2096 pts/0    S+   07:17   0:00 grep --color=auto smbd

 ちなみにSambaを止めるコマンドは以下の通りです。

$ sudo systemctl stop smbd


6:Macからのアクセス
  まずSambaを起動させた状態のRaspberry Piと同じWi-FiMacのPCを接続します。

 その後Finderを立ち上げて「移動」→「サーバへ接続」を選択します。
f:id:rikoubou:20201021162340p:plain

「サーバへ接続」のウインドウが表示されるので「smb://IPアドレス」を入力して「接続」ボタンをクリックします。
f:id:rikoubou:20201021163659p:plain

 ユーザ名とパスワードを要求されるので「Samba用のユーザとパスワード」を入力して「接続」ボタンをクリックします。ちなみにSambaの設定ファイルで「public = no」と設定しているのでゲストユーザでの接続はできません。
f:id:rikoubou:20201021163818p:plain

 ボリューム一覧が表示されるので、今回設定した「nas_hdd1」を選択してOKをクリックします。
f:id:rikoubou:20201021164319p:plain

 これでMacから普通のフォルダのようにアクセスできるようになります。


7:Windowsからのアクセス
  まずSambaを起動させた状態のRaspberry Piと同じWi-FiWindowsのPCを接続します。

 エクスプローラーを開いてネットワークをクリックします。
f:id:rikoubou:20201022102632p:plain

 初めてネットワークを開くと以下のように表示されますが「OK」をクリックします。
f:id:rikoubou:20201022102738p:plain

 するとエクスプローラーの上の方に赤枠で囲ったメッセージが表示されるので、この部分をクリックします。
f:id:rikoubou:20201022102843p:plain

「ネットワーク探索とファイル共有の有効化」をクリックします。
f:id:rikoubou:20201022102948p:plain

 以下の表示が出るので「はい」の方を選択します。
f:id:rikoubou:20201022103359p:plain

 エクスプローラーの右上にある更新ボタンをクリックすると現在のネットワーク上から見える機器が表示されるので、その中にある「RASPBERRYPI」をダブルクリックします。
f:id:rikoubou:20201022105305p:plain

 Macの時と同じようにユーザ名とパスワードを要求されるので「Samba用のユーザとパスワード」を入力して「OK」ボタンをクリックします。
f:id:rikoubou:20201022105502p:plain

 アクセスできるフォルダ一覧が出てくるので、今回設定した「nas_hdd1」をダブルクリックすれば普通のフォルダと同じように使うことができます。
f:id:rikoubou:20201022110340p:plain


 以上がRaspberry PiにSambaを入れてNASにする方法です。


 割と長い内容になってしまいましたが、基本的には「Sambaを入れて、ファイルサーバにするディレクトリの設定をして、ユーザを作成して、Sambaを起動させる」だけです。
 初めてSambaを触ったので戸惑った部分もありますが、コマンドを叩ける程度の知識の自分でも簡単にNASを構築できました。

 自分はRaspberry Pi Zero Wを使っており、上りは1.5MB/s、下りは4MB/sぐらいなのでちょっと遅い気もしますが、そんなに重くないファイルであれば問題なく使えます。
 もう少し速度にこだわりたいならRaspberry Pi 4を使用するのもいいかもしれません。


・参考資料

【Raspberry Pi】IPアドレスの固定

 Raspberry Pisshなどを有効にしている場合、IPアドレスを確認してからリモートログインしますが、IPアドレスを固定していないと毎回IPアドレスが変更してないかチェックしてから接続するという手間が発生します。Raspberry PiIPアドレスを固定させておけば、そのチェックの手間を減らすことができます。

 なので、今回はRaspberry PiIPアドレスの固定方法の備忘録になります。

 基本的には参考資料に挙げたページ様の通りになるので、詳しい方法はそちらを参照してください。

 またIPアドレスがぶつかっていると色々と問題が起こるので、固定したいIPアドレスが使われていないことを確認してから行うようにしてください。

 では、始めます。


1:同一ネットワーク内で使われているIPアドレスを確認する
 IPアドレスを固定する前に現在接続しているネットワーク内で使われているIPアドレス一覧を出して確認します。

 MacWindows両方とも以下のコマンドを実行すると確認できます。

$ arp -a

 以下はMacでの例です。

$ arp -a
? (192.168.1.1) at 64:3:bd:35:2f:c0 on en0 ifscope [ethernet]
? (192.168.1.3) at 7c:22:fb:d3:7d:4f on en0 ifscope permanent [ethernet]
? (220.0.0.251) at 2:0:5e:0:0:ff on en0 ifscope permanent [ethernet]
? (220.0.0.252) at 2:0:5e:0:0:ff on en0 ifscope permanent [ethernet]
? (230.255.255.250) at 8:0:5e:7f:ff:ff on en0 ifscope permanent [ethernet]

 ここに出てくる「192.168.〜」のものがローカルで使用されているIPアドレスになります。なので固定したいIPアドレスは「192.168.〜」で表示されていないものから任意に選択します。


2:Raspberry PiIPアドレス固定方法
 まずはRaspberry Piの今のIPアドレスを確認します。

$ ip a

 実行すると以下のように表示されます。
f:id:rikoubou:20201021065917p:plain

 色々出てきますが、Wi-Fiで通信している場合は「wlan0」の「inet」と書かれている「192.168.0.0/24」などと書かれている部分です。この場合はIPアドレスは「192.168.0.0」になります。

 IPアドレスが確認できたら、以下のコマンドを実行してエディタを開きます。

$ sudo nano /etc/dhcpcd.conf

 ファイルの末尾に以下の記述を追加します(以下のIPアドレスは例であり各自のものに合わせてください)。

interface wlan0
static ip_address=192.168.1.5/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

「interface wlan0」はwlan0の設定を表しています。static ip_addressは固定したいIPアドレス、static routersはルータのIPアドレス、static domain_name_serversはDNSサーバのIPアドレスを記述します。
 記述できたらファイルを上書き保存してエディタを終了させます。

 ちなみにWindowsでルータとDNSサーバのIPアドレスを確認したい場合は、コマンドプロンプトを起動させて以下のコマンドを入力すれば確認できます。

$ ipconfig /all

 このコマンドを実行した結果にある、デフォルトゲートウェイがstatic routersのIPアドレスDHCPサーバーがstatic domain_name_serversのIPアドレスになります。

 IPアドレスの固定の設定が終了したらRaspberry Piを再起動させ、もう一度以下のコマンドを実行します。

$ ip a

 これで固定したIPアドレスになっていることが確認できます。


 以上がRaspberry PiIPアドレスを固定する方法です。

 IPアドレスが固定されているので、Raspberry Piの起動さえ確認できればディスプレイなしでもsshで接続できるので何かと便利です。


・参考資料

【Windows】HDDをexFATでフォーマットする方法

 最近データ保存用にHDDを購入しました。自分はMacWindowsどちらも使うので両方のOSに対応したフォーマットをする必要があります。

 調べると両方のOSに対応しているフォーマットは「exFAT」形式だとわかったので、今回はWindows 10でのexFATのフォーマット方法の備忘録になります。


 では、始めます。


Windows 10でexFATでフォーマットする方法
 まず最初にフォーマットしたいHDDをWindow 10のPCに接続して認識させます。

 HDDを認識した状態で、Windowsのスタートアイコンを右クリックして「ディスクの管理」または「コンピューターの管理」をクリックします。
f:id:rikoubou:20201021050346p:plain

「コンピューターの管理」を開いた場合は記憶域の中にある「ディスクの管理」をクリックします。これでディスクの管理画面が表示されます。
f:id:rikoubou:20201021050431p:plain

 新品のHDDの場合は「未割り当て」というディスクが表示されているはずなので、そこにマウスカーソルを合わせた状態で右クリックして「新しいシンプルボリューム」を選択します。
f:id:rikoubou:20201021050659p:plain

 ウィザード画面が立ち上がるので「次へ」をクリックします。
f:id:rikoubou:20201021050849p:plain

 ボリュームサイズは最大がデフォルトで設定されているはずなので、最大サイズでフォーマットする場合はそのままで「次へ」をクリックします。
f:id:rikoubou:20201021051019p:plain

 今回は外付けHDDとして使用したいので「ドライブ文字またはドライブパスを割り当てない」を選択して「次へ」をクリックします。
f:id:rikoubou:20201021051325p:plain

 ここでフォーマットが選択できるので、ファイルシステムで「exFAT」を選択します。ボリュームラベルは名前なので適当につけておきます。またクイックフォーマットにチェックを入れるのを忘れないでください。チェックを外すとフォーマットに数時間かかる場合があります。設定したら「次へ」をクリックします。
f:id:rikoubou:20201021051814p:plain

 これでフォーマットが開始されます。

 フォーマットが終了すると以下のような画面になるので「完了」をクリックして終了させます。
f:id:rikoubou:20201021052112p:plain

 未割り当てだった部分がフォーマットされ、ちゃんと「exFAT」になっていることが確認できたら終了です。
f:id:rikoubou:20201021052258p:plain


 以上がWindowsでHDDをexFATでフォーマットする方法です。

 これでMacWindows両方で使えるHDDとなったので、便利に使えそうです。


おまけ:
 すでに使用しているHDDの場合、EFIというシステム領域などが残っている場合があります。その場合は以下のページ様にあるように「Win+R」キーで「diskpart」を起動させてから削除させて容量を確保します。


・参考資料

【Raspberry Pi】Raspberry Piでカメラのライブストリーミングをやってみる

 ラズパイについて色々調べていたら、カメラを使ったライブストリーミング環境を構築している記事を見つけたのでそれをやってみた備忘録です。

 ほぼこちらの記事そのままなので、詳しい方法などはそちらを参照してください。

 では始めます。


1:Raspberry Piとカメラ
 今回自分が使ったRaspberry Piとカメラは以下の通りです。

Raspberry Pi 4 2GBモデル
 Raspberry Pi 4で一番安いモデルです。

Raspberry Pi カメラモジュール Rev 1.3
 リボンケーブルで接続するタイプのRaspberry Pi用のカメラモジュールです。今買うとしたらV2という新しいバージョンのカメラになっていると思いますが、古いこのタイプでもちゃんとカメラとして映るので大丈夫でした。
 ちなみにRaspberry Pi用のカメラモジュールを使っていますが、市販されているUSBで接続するタイプのカメラでも大丈夫だと思います。

 あとはディスプレイやマウス、キーボードなどを用意します。


2:カメラの確認
 まずはカメラがちゃんと認識されているかを確認します。以下のコマンドを実行して接続されているデバイスを確認します。

$ v4l2-ctl --list-device

 このコマンドが使えない場合は、以下のコマンドを実行してインストールします。

$ sudo apt-get install v4l-utils

「v4l2-ctl --list-device」を実行すると、以下のように接続されているデバイス一覧が表示されます。

$ v4l2-ctl --list-device
bcm2835-codec-decode (platform:bcm2835-codec):
        /dev/video10
        /dev/video11
        /dev/video12

mmal service 16.1 (platform:bcm2835-v4l2):
        /dev/video0

 カメラを1台接続している場合は上記の「/dev/video0」がそのカメラのデバイスになっています。この表示がなければラズパイ側でカメラが認識されていないので、もう一度接続を確認してみてください。


3:FFmpeg、Nginxなどのインストール
 今回のカメラ映像ライブストリーミングの流れを簡単に言うと「カメラ映像→FFmpegH.264に変換→RTMPプロトコルでNginxサーバに送る→WebページでHLS形式で配信」という感じになっています。

 なのでRaspberry PiFFmpeg、Nginxをラズパイにインストールする必要があります。

 これらをインストールするために、以下のコマンドを実行します。

・パッケージリストの更新

$ sudo apt-get update

FFmpegのインストール

$ sudo apt-get install ffmpeg

・Nginxのインストール

$ sudo apt-get install nginx

・NginxにRTMPを対応させるモジュールをインストール

$ sudo apt-get install libnginx-mod-rtmp

 先にapt-get updateをやっておかないとインストールできない場合があるので、実行しておくのを忘れないようにしてください。


4:HLS配信の設定
 必要なもののインストールができたので、次は配信用の設定ファイルを記述していきます。

 以下のコマンドを実行してconfファイルをエディタで開きます。

$ sudo nano /etc/nginx/modules-available/rtmp-live.conf

 rtmp-live.confファイルの中身は以下のように記述します。各設定項目の詳しい説明はこの公式wikiを参照してください。

rtmp-live.conf

rtmp {                            # RTMPでの設定
        server {
                listen 1935;      # ポート番号
                chunk_size 4096;  # チャンクサイズ
                allow play all;   # 許可。play allなので全て再生を許可している。
                access_log /var/log/nginx/rtmp_access.log;  # アクセスログの保存パス

                application live {          # applicationの後の文字が名称がURLの一部になる。つまりrtmp://<ip address>/liveのようになる。
                        live on;            # ライブ配信を受け取る
                        hls on;             # ストリーミング形式をHLSにする
                        record off;         # 録画しない 
                        hls_path /tmp/live; # 配信用ファイル(.tsファイル)保存先
                        hls_fragment 1s;    # .tsファイルに区切る秒数
                }
        }
}

 ファイルの記述が終了したら、今度はシンボリックリンクを作成します。こうすることでNginxを起動させる毎に「rtmp-live.conf」ファイルが読み込まれるようになります。

$ cd /etc/nginx/modules-enabled
$ sudo ln -s ../modules-available/rtmp-live.conf ./99-rtmp-live.conf

 これでHLS配信の設定は完了です。


5:配信ファイルの保存場所をRAMにする
 4までの設定でも問題なく配信はできますが、今のままでは配信用の動画ファイルの一時保存先は「/tmp」になっています。つまりはSDカードに保存されるようになっているので、配信をすると配信用動画の一時保存と削除が大量に行われます。これではSDカードの寿命を縮めることにもなってしまうので、ラズパイ本体のメモリー領域であるRAMに保存するように設定します。

 まず以下のコマンドでfstabファイルをエディタで開きます。

$ sudo nano /etc/fstab

 エディタを開いたら以下の一文を追記します。

tmpfs    /tmp    tmpfs   defaults,noatime,mode=1777    0    0

 追記したらファイルを上書き保存します。

 ちなみに各項目は以下のようになっています。

1.device:マウントされるパーティション/デバイス。tmpfsはRAMディスク。
2.dir:マウントポイント。/tmpを指定。
3.type:ファイルシステムタイプ。RAMディスクなのでtmpfsを指定。
4.options:マウントオプション。mode=1777はファイル操作を行う設定。
5.dump:dumpでバックアップを取るかどうか。0はバックアップなし。
6.fsckfsckによるチェックの順番。0はチェックなし。

 これで/tmpファイルがRAM上に保存されるようになります。ちなみにラズパイを再起動させると自動的に削除されます。


6:Webページの準備
 続いて配信ファイルを表示させるWebページの準備をします。

 Webページは「/var/www/html」配置します。「cd /var/www/html」で移動して、そのディレクトリからライブ配信しているHLS動画を参照できるようシンボリックリンクを設定します。

$ cd /var/www/html
$ sudo ln -s /tmp/live live

 そして「/var/www/html」ディレクトリ内にindex.htmlファイルを作成します。

$ sudo nano /var/www/html/index.html

 HLSを表示させるライブラリはhls.jsなど色々ありますが、今回はVideo.jsというライブラリを使用します。index.htmlファイルの中身は以下のように記述します。

・index.html

<!DOCTYPE html>
<html lang="ja">
	<head>
		<title>Streaming Test</title>
		<!-- このスタイルシートを読み込まないと再生ボタンなどが表示されない -->
		<link href="https://vjs.zencdn.net/7.6.6/video-js.css" rel="stylesheet" />
	  </head>
	  <body>
		<h1>Movie Title</h1>
		<p>description</p>
		<video-js	
		  id="my-video"
		  controls
		  liveui="true"
		  preload="auto"
		  width="1280"
		  height="720"
		  data-setup="{responsive: true}"
		>
		  <source src="/live/stream.m3u8" type="application/x-mpegURL" />
		  <p class="vjs-no-js">
			To view this video please enable JavaScript, and consider upgrading to a web browser that
			<a href="https://videojs.com/html5-video-support/" target="_blank">supports HTML5 video</a>
		  </p>
		</video-js>
		<script src="https://vjs.zencdn.net/7.6.6/video.js"></script>
	  </body>
</html>

 
 index.htmlを保存すればWebページの準備は完了です。

 Webページがちゃんと表示されるかはNginxを起動させてから確認します。

 以下のコマンドでNginxを再起動させます。

$ sudo systemctl restart nginx.service

 Nginxのプロセスがちゃんと動いているかは「ps aux | grep nginx」コマンドで確認します。

$ ps aux | grep nginx
root      3778  0.0  0.0  57776  1324 ?        Ss   14:56   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data  3779  0.5  0.3  58036  4716 ?        S    14:56   0:01 nginx: worker process
www-data  3780  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3781  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3782  0.0  0.1  57916  2844 ?        S    14:56   0:00 nginx: worker process
www-data  3783  0.0  0.1  57908  2908 ?        S    14:56   0:00 nginx: cache manager process
pi        3870  0.0  0.0   3916   560 pts/1    S+   15:00   0:00 grep --color=auto nginx

 Nginxの起動時にエラーが出たりプロセスが確認できない場合は「/var/log/nginx/error.log」を開いてエラーを確認してみてください。

$ cat /var/log/nginx/error.log

 Nginxの起動を確認できたらRaspberry Piのブラウザを開いてURLに「127.0.0.1」と打ち込みます。以下のような画面が表示されればOKです。
f:id:rikoubou:20200930150946p:plain


7:ライブ配信の確認
 ようやくライブ配信の確認です。

 ライブ配信をするにはffmpegを使いますが、コマンドが長くなるのでシェルファイルを記述し、そのファイルを実行するようにします。

 どこでも良いですが、homeディレクトリ直下に「mystreaming.sh」ファイルを作成します。

$ cd
$ nano mystreaming.sh

 シェルファイルの内容は以下のように記述して保存します。

・mystreaming.sh

#!/bin/bash
if pidof -x ffmpeg > /dev/null; then
    echo "FFmpeg is already running."
    exit 1
fi

ffmpeg \
    -f v4l2 -thread_queue_size 8192 -input_format yuyv422 \
    -video_size 1280x720 -framerate 30 \
    -i /dev/video0 \
    -c:v h264_omx -b:v 768k \
    -bufsize 768k -vsync 1 -g 10 \
    -f flv rtmp://localhost/live/stream

 簡単に説明すると、最初のif文ですでにffmpegが実行されているかを確認します。すでに他で実行されていた場合は何もせずに終了します。ffmpegライブ配信部分については、1280×720のサイズでフレームレートを30に設定しています。

 ここまで準備ができたら以下のコマンドでシェルファイルを実行します。ライブ配信を止めたい場合は「Ctrl+C」で終了させます。

$ sh mystreaming.sh

 エラーがなければffmpegのコマンドが実行されるので、その状態でもう一度Raspberry Piのブラウザを開いてURLに「127.0.0.1」と打ち込みます。

 再生ボタンが表示されるので、そのボタンをクリックするとカメラ映像のライブ配信が表示されます。ただ10秒ぐらい遅延があるかと思います。

 また「ip a」コマンドでRaspberry PiIPアドレスを確認してそのアドレスにアクセスすることで別のPCなどからでもライブ配信を確認できます。

$ ip a

 ちなみにライブ配信中に「/tmp/live/」ディレクトリの中を見てみると、以下のように.tsファイルがどんどん作成されています。この.tsファイルが「rtmp-live.conf」の「hls_fragment 」で設定した秒数で細切れになった動画ファイルとなっています。

$ sudo ls /tmp/live/
stream-339.ts  stream-347.ts  stream-355.ts  stream-363.ts  stream-371.ts  stream-379.ts  stream-387.ts  stream-395.ts
stream-340.ts  stream-348.ts  stream-356.ts  stream-364.ts  stream-372.ts  stream-380.ts  stream-388.ts  stream-396.ts
stream-341.ts  stream-349.ts  stream-357.ts  stream-365.ts  stream-373.ts  stream-381.ts  stream-389.ts  stream-397.ts
stream-342.ts  stream-350.ts  stream-358.ts  stream-366.ts  stream-374.ts  stream-382.ts  stream-390.ts  stream-398.ts
stream-343.ts  stream-351.ts  stream-359.ts  stream-367.ts  stream-375.ts  stream-383.ts  stream-391.ts  stream-399.ts
stream-344.ts  stream-352.ts  stream-360.ts  stream-368.ts  stream-376.ts  stream-384.ts  stream-392.ts  stream-400.ts
stream-345.ts  stream-353.ts  stream-361.ts  stream-369.ts  stream-377.ts  stream-385.ts  stream-393.ts  stream-401.ts
stream-346.ts  stream-354.ts  stream-362.ts  stream-370.ts  stream-378.ts  stream-386.ts  stream-394.ts  stream.m3u8


 以上がRaspberry Piでカメラのライブストリーミングをやる方法です。

 ほぼ参考資料のページ様の内容と同じですが、割と簡単にできて驚きました。

 HLSやVideo.js、ffmpegについては何もわかっていないのでそのあたりも掘り下げて色々カスタマイズできるようになるともっと色々面白いことができそうです。


・参考資料