ページ

2021年11月23日火曜日

オフライン環境でDockerを使う.コンテナイメージをエクスポート・インポートする方法

今更だが最近,Dockerを使い始めた.
便利という話は聞いていたが,予想以上の代物でもっと早く使えば良かったと思う今日この頃.

しかし,世の中にはネットに繋がっていない(繋げられない)残念な開発環境も少なくない.
そんな環境でもDockerを使うため,コンテナのイメージをエクスポート/インポートする方法を調べた.

我が家のDebianでイメージを作成し,それをRedHat に取り込んで問題なく動いたので,
大抵のディストリビューションで可能な方法だと思う.

2021年10月24日日曜日

Linux サーバーでOpenVPN を構築する

Debianで作成した自作ルーターにOpenVPN を立てたので手順を残す.

今回参考にさせて頂いたのは以下のページ.非常にわかり易い.投稿者様に感謝.
OpenVPNのインストールとセットアップからインターネット接続までのガイドブック - Qiita

手順としては大きく分けて3段階あり,はじめにEasy-RSAで証明書を生成し,次にサーバー用の設定ファイルを作成してOpenVPN を起動する.最後にクライアント用の設定ファイルを作成して,クライアントからVPN 接続できれば完了だ.

まずは,実行環境の確認.Debian 系なら大差ないと思うが,適宜環境に合わせて欲しい.
 $ cat /etc/debian_version 
 11.1
 $ uname -srvmo
 Linux 5.10.0-9-amd64 #1 SMP Debian 5.10.70-1 (2021-09-30) x86_64 GNU/Linux


以降,具体的な手順に移る.

2021年7月11日日曜日

Echo Auto の設置に百円均一のマグネットが最適でした

プライムデーで990円という破格で手に入れたEcho Auto.

デバイス自体はとても気に入っていたのですが,標準のマウントは何となくズングリムックリしている.
しかも,私の愛車のデミオ(DJ系)にはこういった類のデバイスを設置できる箇所がとても少ない.

そのため,使い始めてからずっと設置方法を模索していましたが,ひとつの答えをYouTubeで発見しました.

2021年6月16日水曜日

Celeron J3455 1.5GHz メモリ8GB SSD 128GB のミニPC ACEPC AK1を購入

タイムセールで安くなっていたのでACEPC という中華系メーカーのミニパソコン(AK1 シリーズ)を購入しました.

128 x 128 x 52 mm の小型PC.

CPU は Intel の Celeron(R) CPU J3455 1.5GHz
メモリは 8.0GB
補助記憶は 128GB の SSD

台座のようになっている下部に2.5インチのHDD/SSD を装着でき,最大2TB までストレージを拡張可能です.

2021年6月11日金曜日

Debian のブータブル USBメモリを作成する

いままでOSのインストールにはDVDを使ってきましたが,最近購入したミニPCにドライブが搭載されておらず,外付けのドライブを使うと読み込み速度が低下するので,USBメモリでブータブルディスクを作成した.

あまりにも簡単に作れて,読み込み速度もDVDの比にならないくらい早いので,もっと早く実践しておけば良かったと後悔.

ということで,ブータブルUSBメモリの作り方.Debianでしか試していないため,他のディストリビューションでも同様の手順で作成できるかは未確認.

まずはISOイメージを取得.もちろんブラウザからアクセスしても問題ない.
 $ get https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-10.9.0-amd64-netinst.iso

ダウンロードが完了したら念の為,ハッシュ値を確認.
 $ sha256sum debian-10.9.0-amd64-netinst.iso 
8660593d10de0ce7577c9de4dab886ff540bc9843659c8879d8eea0ab224c109  debian-10.9.0-amd64-netinst.iso

rootユーザになって,catコマンドでUSBメモリのデバイスファイルに吐き出し.最後にsyncコマンドを実行
 # su
 # cat debian-10.9.0-amd64-netinst.iso > /dev/sdb
 # sync


これだけ.あとはパソコンにUSBメモリ挿して,ブートすればOSのインストール画面が開く.ビックリするほど簡単だった.

2021年4月25日日曜日

NETGEAR製スマートスイッチ GS308T を使用して,NIC が1つしかない PC でルーターを自作する

我が家ではRaspberry Pi にUSB-NIC を接続することで,LAN ポート(NIC)を増設してルーター化していますが,以下のサイトで紹介されているようにタグVLAN を使用することで,LAN ポートを増設すること無く Linux PC をルーター化できることが判ったので,早速試してみました.

Linuxルータのタコ足配線を解消しよう ~ タグVLAN(IEEE 802.1Q)の活用
http://dsas.blog.klab.org/archives/50391881.html
LinuxとVLANで作る、シンプル&スケーラブルネットワークの極意
https://www.irori.org/doc/infra/wd41.html

VLAN に対応したスイッチングハブを所持していなかったため,NETGEAR 製の GS308T を購入しました.5,000 円ちょっとでこれだけ高機能な代物が手に入るのは本当に凄いことだと思います.

近い将来,ネットワークカメラも導入したいと考えているので,PoE 対応製品にすることも考えましたが,GS308T と比べてだいぶ値段が上がってしまうことと,配線の関係から結局ネットワークカメラもWi-Fi 接続になるような気がしたので,PoE については見送ることにしました.

2021年3月23日火曜日

Raspberry Pi ルーターでポートフォワーディングして,LAN 内の VPN に接続する.

最近,自作ルーターの話題ばかりですが今回はポートフォワーディングする話.

なお,これまでのルーターの設定は以下の記事に纏めてある.
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする
Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる
Raspberry Pi ルーターに Dynamic DNS を導入する

ざっくり言うと,ラズパイをIPv4 over IPv6接続に対応したルーターに設定することで,回線の混雑を避けて通信速度を維持しつつ,PPPoE接続も共存させることで外部からのアクセスを可能にし,Dynamic DNSによってホスト名による外部からのアクセスを可能にしている.


今回はさらに,ポートフォワーディング機能を追加する.

2021年3月18日木曜日

Raspberry Pi ルーターに Dynamic DNS を導入する

IPv4 over IPv6 接続した Raspberry Pi ルーターに PPPoE 接続を共存させ外部から IPv4 で接続することができるようになったので,Dynamic DNS を導入した.


これまでの設定は以下の記事に纏めてあるので,最初から読みたい方はどうぞ.
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする
Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる

今回は無料で使える No-IP を利用する.

初めに,https://www.noip.com/ にアクセスしてアカウントの作成とホスト名の取得を完了したら,以下の記事に従ってクライアントソフトをビルドする.ただし,ルート権限の取得と make install はしないようにする.

2021年3月14日日曜日

Raspberry Pi ルーターで DS-Lite と PPPoE 接続を共存させる

先日,楽天ひかりのIPv4 over IPv6 を利用するための設定方法をまとめたが,(下記参照)
Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする

今回はその続きとして,PPPoE による接続も共存させる方法.

なぜ,こんなことが必要かというと,DS-Lite方式の接続では,結局のところ,dgw.xpass.jp に対して作成したトンネルの出口をゲートウェイとして使っているので,ルーターがネットの世界と直接繋がっているわけではなく,SSH でルーターにログインしたり,Apacheを立ててHTTPでアクセスしたりすることができない.(正確にはIPv6を使えば接続可能だけど,できれば慣れ親しんだIPv4で接続したい)

これを実現するには,PPPoE の接続が必要になるが,ルーティングテーブルを適切に設定しないと,PPPoE 接続と,DS-Lite 接続のどちらを優先すべきかルーターが判断できなくなってしまう.

これを踏まえ今回は,DS-Liteと共存させるための,PPPoE 接続の方法及びルーティングテーブルの設定方法を記載する.

2021年3月7日日曜日

Raspberry Pi を楽天ひかりのIPv4 over IPv6(DS-Lite・Xpass)に対応したルーターにする

光回線の契約をソフトバンク光から楽天ひかりに乗り換えた.(一年無料なので,ソフトバンクに解約金を払っても十分にお釣りが来る.)

ソフトバンク時代は,IPv4 over IPv6を利用するのに光BBユニットのレンタルが必須だったが,楽天ひかりでは対応したルーターを用いれば専用機器をレンタルする必要はないので,Raspberry PiをDS-Lite・Xpassに対応させてルーターとして可動させた.

同時に,DHCP,RADVD,DNS,さらに,2.4GHz帯/5.0GHz帯のマルチSSD無線LANとしても可動させているので,その設定手順を備忘録として記録する.

最終構成は以下の通り.
 eth0   :ラズパイにある有線LANポート.スイッチングハブと接続する.
 eth1   :USB-NICで拡張した有線LANポート.ONUと接続する.
 wlan0  :ラズパイにある無線LANポート.5.0GHz 帯無線LANアクセスポイントとして動作させる.
 wlan1  :USBドングルで拡張した無線LANポート.2.4GHz 帯無線LANアクセスポイントとして動作させる.
 br0    :eth0,wlan0,wlan1をつなぐブリッジ.192.168.100.1/24に設定する.
 ds-lite:IPv4 over IPv6用のトンネル.

 br0 に DPCP及びRADVD を設定し,接続した機器には自動でIPv4アドレス及びIPv6アドレスを振るように設定.

2021年2月27日土曜日

Bash でプロセスの死活チェックをスマートにやる方法

プロセス名を hogehoge としたとき,

よく見かけるのはこんな感じ.
#!/bin/bash

ProcessName=hogehoge

IsActive=`ps aux | grep ${ProcessName} | grep -v grep | wc -l`

if [ ${IsActive} -gt 0 ]; then
  echo "${ProcessName} is Active."
else
  echo "${ProcessName} is Disactive."
fi

exit 0


ps aux で全てのプロセスを表示して,それをプロセス名でgrep し,ただし grep 自身もヒットしてしまうので,それを grep -v で除き,最後に wc でライン数を数える.そのライン数が0よりも大きければプロセスが存在する.と判定する.

やっていることはよく判ります.でもパイプで色々繋いだりすると,想定外の例外で引っかかることが多い...

(例えばプロセス名自体が,どこかに「grep」を含んでいる場合,この方法では検出できない)

これをもうちょっとスマートにやる方法を紹介します

2021年2月22日月曜日

Linux でGUI を自動操作するツール【自作】

GUI の自動ツールとしては,xdotool などが有名だが,そういったツールを使用できない場合は自作するのもひとつの手段.

マウスポインターを指定した座標に動かして,クリックするだけのプログラムならば,数行のコードで実現できる.

click.c
--------------------------------------------------------------------------------
#include <stdlib.h>
#include <X11/extensions/XTest.h>

int main ( int argc, char ** argv )
{
  // Arguments 1 is Point of X, Argument 2 is Point of Y
  int position[2] = {atoi ( argv[1] ), atoi ( argv[2] ) };

  // Open Default Display
  Display * display = XOpenDisplay ( NULL );

  if ( display != NULL )
  {
    // Open 'Virtual core XTEST pointer'
    XDevice * device = XOpenDevice ( display, 4 );

    if ( device != NULL )
    {
      // Move Poitner
      XTestFakeDeviceMotionEvent ( display, device, False, 0, position, 2, 0 );

      // Press & Release Left Button
      XTestFakeDeviceButtonEvent ( display, device, Button1, True, NULL, 0, 0 );
      XTestFakeDeviceButtonEvent ( display, device, Button1, False, NULL, 0, 0 );

      XCloseDevice ( display, device );
    }

    XCloseDisplay ( display );
  }

  return 0;
}


 $ gcc -lX11 -lXi -lXtst click.c -o click
 $ ./click 100 500

2021年2月15日月曜日

Subversionの接続先のURLを変更する

サーバーの老朽化や,VPSの引っ越し,その他設定の見直し等々,Subversion のホストが変更になることは珍しいことではない.

接続先が変更された場合,ローカルのチェックアウトを無かったことにしてしまうのも一つの手だが,コミットする前の変更ファイルを引き継ぎたい場合などは,接続先を変更すると良い.

といっても,とても簡単で,svn switch --relocate [変更前の接続先] [変更後の接続先] とするだけ.

2021年2月10日水曜日

【MySQL】 ソートで NULL を一番最後にするとき,IS NULL ASC としてはいけない理由.

少々挑戦的なタイトルですが,本当は IS NULL ASC で全然構いません.(笑)

ただ私が言いたいのは,魔法の呪文のように意味も分からず IS NULL ASC とするのはやめたほうが良い.
より厳密には,それだけ覚えてしまうのは勿体無い.ということです.

IS NULL ASC のように ORDER BY 句を用いれば,様々な条件でソートすることができるので,この記事では,
なぜ IS NULL ASC で NULL を後ろにできるのか実演しながら,より汎用的な条件付きソートについて考えていきます.

サンプルとして以下のようなテーブルを用意しました.(例によってラズパイを使っているので MariaDBですが,基本的に MySQL でも同じです)
 MariaDB [sample]> SELECT * FROM SAMPLE;
 +------+-------+
 | id   | value |
 +------+-------+
 |    1 |     0 |
 |    2 |    10 |
 |    3 |     4 |
 |    4 |  NULL |
 |    5 |     8 |
 |    6 |     1 |
 |    7 |     3 |
 |    8 |     2 |
 |    9 |  NULL |
 |   10 |    -5 |
 +------+-------+

2021年2月7日日曜日

【MySQL,MariaDB】 レプリケーションを設定する

データベースでマスタースレーブ型のレプリケーションを設定する方法を示す.
手元のラズパイ2台を使用するため,MariaDBで設定するが,基本的にはMySQLも同様の方法でできるはずだ.

データベースの初期設定手順は以下のエントリーを参照されたし.
WM×LI: Raspberry Pi にデータベースを構築する【MySQL,MariaDB】

Raspberry Pi のモデル名を確認する

性能が段違いなので,基本的なことはラズパイ4 にやらせているが,敢えてラズパイ4 からは切り離して可動させているサービスもあったりするので,我が家ではラズパイ3,ラズパイ2 もまだまだ現役だ.

基本,ホスト名で判別しているが,どのラズパイがどのモデルだったか分からなくなることが時々ある.

そんなときは,/proc/device-tree/mode を確認すると,モデル名が表示される.

2021年2月6日土曜日

Raspberry Pi で初回起動時からsshでアクセスする方法

何番煎じかわからないけれど,Raspberry Pi用のmicro SDカードにRaspberry Pi OSをインストールした直後の初回起動時からsshでアクセスできるようにする方法.

結論から言うと,/boot/ 直下に ssh という名前のファイルを置くだけ.

それでは細かい手順を解説します.

2021年2月4日木曜日

マルチスレッドなプログラムをgdbでデバッグする

たまにはエンジニアらしくソフトウェアのお話を.

マルチスレッドなプログラムを書くとき, 常に念頭に置きながら設計しなければならないのが排他制御だが,そんなとき,どの処理がどのスレッドで実施されているか表示できることは非常に有効なテクニックだ.

そこで次のようなコードで実験する.

<サンプルコード:test.cpp>
test.cpp
--------------------------------------------------------------------------------
#include <iostream>
#include <thread>
#include <unistd.h>

void a( void )
{
  for( int i = 0; i < 30; i++ )
  {
    std::cout << "i : " << i << std::endl;
    sleep( 1 );
  }
}

void b( void )
{
  for( int j = 0; j < 10; j++ )
  {
    std::cout << "j : " << j << std::endl;
    sleep( 3 );
  }
}

int main( void )
{
  std::thread * _a = new std::thread( a );
  std::thread * _b = new std::thread( b );
  _a->join();
  _b->join();
  return 0;
}

※本来は,coutする前後でmutexを貼る必要があるが,今回は可読性重視で割愛する.

これをコンパイルして,gdbで実行する
 $ g++ -g -pthread test.cpp -o test
 $ gdb ./test

2021年1月17日日曜日

理想の手帳が無かったので自作してみた.一冊から製本できるオンデマンド印刷サービス"製本直送.com"が便利.

年が明けてから2週間以上も過ぎてしまいましたが,ようやく今年の手帳が届きました.


ここ数年は取引先の会社から頂いた手帳を使わせてもらっていましたが,いつまでも同じ会社と取引が続くとも限らないし,他社のロゴが入った手帳を持ち歩くのもなんだか虚しい...そこで昨年の12月,「来年はちゃんと自分で買った手帳を使おう」と,本屋の手帳コーナーで色々と手にとってみたのですが,理想の手帳は見つかりませんでした.

2021年1月13日水曜日

svnsync で定期的にSubversion のバックアップを取得する

これまでSubversion については,何度か取り上げてきたが,

WM×LI: Raspberyy Pi を Subversion のリポジトリサーバにして,systemd で自動起動するように設定する.
WM×LI: 【svnadmin dump】Subversionのリポジトリを別のサーバーに移行する.
WM×LI: Subversionで直前のコミットを取り消す.

今回はsvnsync コマンドを使用して,リモートで定期的にSubversion をバックアップを取るお話.

先日,WebArena IndigoでレンタルしているVPSをアップデート(apt upgrade)していたら,途中で突然停止し,その後アクセス不可,再起動不能になり,Subversionのリポジトリデータが全部吹っ飛んだので,やり方を調べた.