pslaboが試したことの記録

はてなダイヤリーからはてなブログに引っ越してきました

この日記は現在実行中の減量記録を含む個人的なメモとして始めましたが、最近はコンピュータやガジェット、ハック、セキュリティネタのほうがメインになっております。

はてなダイヤリー時代はカテゴリ分けが適当だったのですが、これはそのうち直します。


いまさらPIPSのことを調べる必要が出てきたのでメモる

PIPSといってもFXの用語ではなく、SORDという会社が過去に販売していた簡易言語の話です。

いまさら調べねばならなくなった理由は、知人から PIPS のマイグレーションについて相談を受けたため。

ja.wikipedia.org

SORDは東芝に買収されて社名も東芝系列の名前に変更されましたが、その後、他の会社に売却され、再度社名をSORDに戻しています。

PIPSは1980年にSORDの独自ハードウェア向けの最初のバージョンがリリースされ、その後、Windowsに移植された The PIPS がリリースされています。

しかし、The PIPS は 1999年にフリーソフトウェアになり、その後、新しいバージョンはリリースされていない。

Windows10で動くとは思えないけれど、Windows7にはインストールできるという話があり、さらにそのインストールディレクトリをWindows10にコピーすれば、Windows10でも動くらしい。

自分自身はPIPSはPIPS-Ⅲや漢字PIPS、日本語PIPSをちょっとだけ触った程度。The PIPS は全くしらん。

インストーラやマニュアルはSORDのサイトからダウンロード可能。

www.sord.co.jp

ユーザーコミュニティはまだ存在しているようです。

www.pips.gr.jp

しかし、マイグレーションするにしても、データはどのようにエクスポートできるのか、さっぱりわからない。レジ連動の売上管理、在庫管理、顧客管理で用いていると聞いているけど、画面数、帳票数など、不明点が多すぎ。

管理しているデータがどのように設計されていて、どのようにエクスポートできるかも良く分からない。

とりあえず、インストールして環境作ろうと思います。。。

タブ区切りテキストをJSONに変換するスクリプトをawkで書く

CSVやタブ区切りテキストをJSONに変換しようとすると、意外にスマートな方法が見当たらなかったので、タブ区切りテキストをJSONに変換するawkスクリプトを書いてみた。jqを使って工夫する例もあったけど、シンプルなデータをJSONに変換したいだけならこれで事足ります。

たとえば次のように先頭行にカラム名が入っているタブ区切りのデータがあったとして、

% cat test.txt 
id  name
1   foo
2   bar
3   bang

こんなふうに実行するだけで JSON になります。

% cat test.txt | ./tsv2json.awk 
[
  {
    "id": "1",
    "name": "foo"
  },
  {
    "id": "2",
    "name": "bar"
  },
  {
    "id": "3",
    "name": "bang"
  }
]

出力結果は jq でパースできることを確認済みなので、フォーマットは多分問題ないはず。

コードは、わりとやっつけ仕事な感じで書いたので、いけてない部分は残っていると思います。

#!/usr/bin/awk -f

BEGIN {
    FS="\t"
}

NR == 1 {
    for ( field = 1 ; field <= NF ; field++ ) {
        fieldname[field] = $field
    }
    next
}

{
    for ( field = 1 ; field <= NF ; field++ ) {
        data[NR, field]=$field
    }
}


END {
    print "["
    for ( record = 2 ; record <= NR ; record++ ) {
        print "  {"
        for ( field = 1 ; field < NF ; field++ ) {
            printf "    \"%s\": \"%s\",\n", fieldname[field], data[record, field]
        }
        printf "    \"%s\": \"%s\"\n", fieldname[NF], data[record, NF]

        if ( record != NR ) {
            print "  },"
        } else {
            print "  }"
        }
    }
    print "]"
}

エンバカデロのブログサイトが移転したのでRSS feedのURLを確認しておく

Delphi/C++Builderのツールベンダーであるエンバカデロのブログサイトが、今年9月になってサイトが移転したそうです。 blogs.embarcadero.com

community.embarcadero.com が community.idera.com に移転したのは2年くらい前だったと思うのですが、community.idera.com は多言語対応していないサイトだったのでコンテンツが入り乱れていました。

今回、blogs.embarcadero.com に移転し、言語ごとに異なる記事が掲載、閲覧できるようになったみたいです。

そこで、RSS feed のURLを調べてみたのですが、日本語ページの場合はこちらのURLでよいようです。 https://blogs.embarcadero.com/ja/feed/

英語記事の新着情報を知りたい場合はこちら。 https://blogs.embarcadero.com/feed/

最近は、新しい情報は twitter で拾うケースも増えていると思いますが、一覧を参照したい場合は RSS feed のほうが便利ですよね。

OpenWRT+Raspberry PiでIPv6 IPoE + DS-Lite (transix接続)のルータを作る

OpenWRTを使えばIPv6 IPoE接続 + DS-Liteのルータを作成するのは容易ですが、GUIからチマチマ設定するのはめんどくさいので、スクリプト一発で設定できるように作成したスクリプトをログとして残します。スクリプトは RasPi 向けに作成しています。

OpenWRTを焼いたSDカードでRaspberry Piを起動後、このスクリプトを実行すれば自動で必要なパッケージのインストールを行い、自動で IPoE + DS-Lite 接続の設定が適用されるはずです。

事前準備としては、フレッツ光でIPoE を有効にしておくことと、IPoE DS-Lite 対応のプロバイダと契約しておくこと。光コラボは使ったことないのでよくわからない。

準備ができていたら、つぎのように実行すれば IPoE IPv6 + DS-Lite によるルータが出来上がります。OpenWRTのサイトは IPv6 reachable のため、IPv6 IPoE がフレッツ光で利用可能な状態になっていれば、OpenWRTデバイスフレッツ光ONUにぶら下げるだけでパッケージのインストールが行えます。

  1. OpenWRT のファームウェアをSDカードに焼く(19.07.4 で動作確認しています)
  2. このスクリプトを initconfig.sh などの名前でSDカードにコピーする
  3. Raspberry Piを起動する
  4. スクリプトを実行すると、NICを DHCPv4 および DHCPv6 クライアントに変更し、外部への疎通がとおるまで待ち状態になります
  5. NICフレッツ光ONUをLANケーブルでつなぎ、IPoEでIPv6アドレスが割り当てられると、必要なパッケージのインストールや設定の適用が自動的に進みます
  6. スクリプトの実行が完了したらOpenWRTを再起動すれば、IPoE IPv6 + DS-Lite が使えるようになっているはず

なお、スクリプト自体は Raspbery Pi2 に Buffalo の 2.4GHz USB dongle を装着する想定で作成しています。Raspberry Pi3 以降で使う場合は PKG_USB_WIFI のインストールが不要なので opkg の実行箇所をコメントアウトするなどしてください。

また、Raspberry Pi 以外の場合は eth0 を WAN 向けに設定している箇所を変更すると、スクリプトがそのまま使えるかもしれません、が、未検証です。とはいえ、uci コマンドによる設定内容は参考になるはずです。

#!/bin/sh -x

# config(必要に応じて変更します)
LAN_ADDR=192.168.4.1
LAN_MASK=255.255.255.0
WIFI_SSID=[SSID]
WIFI_PASS=[passphrase]
DSLITE_AFTR=gw.transix.jp
PKG_USB_WIFI='kmod-mac80211 kmod-rt2800-lib kmod-rt2800-usb usbutils'

MACADDR=$( /sbin/ifconfig eth0 | head -1 | awk '{print $5}' | sed 's/://g' )
uci set system.@system[0].hostname=OpenWrt-${MACADDR}

# IPv6 を有効にするかどうか。true 以外の場合は IPv4 による、単なるトラベルルータとしてセットアップします。
ENABLE_IPV6=true

# Rapsberry PiのLANポートをDHCPクライアントにするための設定を書き込む
uci del network.lan.ipaddr
uci del network.lan.netmask
uci del network.lan.ip6assign
uci set network.lan.proto='dhcp'

if [ ${ENABLE_IPV6} == true ]; then
    # Rapsberry PiのLANポートをIPoE DHCPv6クライアントにするための設定を書き込む
    uci set network.wan6=interface
    uci set network.wan6.ifname='eth0'
    uci set network.wan6.proto='dhcpv6'
    uci set network.wan6.reqaddress='try'
    uci set network.wan6.reqprefix='auto'

    uci set dhcp.wan6=dhcp
    uci set dhcp.wan6.interface='wan6'
    uci set dhcp.wan6.dhcpv6='relay'
    uci set dhcp.wan6.ra='relay'
    uci set dhcp.wan6.ndp='relay'
    uci set dhcp.wan6.master='1'

    uci set firewall.@zone[1].network='wan wan6'
fi

uci commit
/etc/init.d/network restart

# 外部向けの疎通が確保できたらパッケージのインストールを行う
while :
do
  ping -c 1 www.google.com > /dev/null 2>&1
  result_v4=$?

  ping6 -c 1 www.google.com > /dev/null 2>&1
  result_v6=$?
  if [ ${result_v4} == 0 ] || [ ${result_v6} == 0 ]; then
    opkg update
    opkg install ds-lite luci-proto-ipv6 luci-i18n-base-ja
    opkg install ${PKG_USB_WIFI}
    break
  else
    sleep 1
  fi
done

# WiFiルータにするための設定を書き込む
uci set system.@system[0].zonename='Asia/Tokyo'

uci set dropbear.@dropbear[0].Interface=lan

uci set network.lan.proto='static'
uci set network.lan.ipaddr=$LAN_ADDR
uci set network.lan.netmask=$LAN_MASK
uci set network.lan.ifname='wlan0'

uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.ifname='eth0'

uci set wireless.radio0.disabled='1'
uci set wireless.radio0.country='JP'
uci set wireless.radio0.txpower='10'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.network='lan'
uci set wireless.default_radio0.ssid=$WIFI_SSID
uci set wireless.default_radio0.key=$WIFI_PASS
uci set wireless.default_radio0.wpa_disable_eapol_key_retries='1'
uci delete wireless.radio0.disabled='1'

if [ ${ENABLE_IPV6} == true ]; then
    # IPv6 DHCP を LAN 側に relay する設定
    uci set dhcp.lan.ra='relay'
    uci set dhcp.lan.dhcpv6='relay'
    uci set dhcp.lan.ndp='relay'

    # IPoE DS-Lite を有効にするための設定を書き込む```
    uci set network.transix=interface
    uci set network.transix.proto='dslite'
    uci set network.transix.encaplimit='ignore'
    uci set network.transix.peeraddr=${DSLITE_AFTR}
    uci set firewall.@zone[1].network='wan wan6 transix'
fi

uci commit
/etc/init.d/network restart

#reboot

設定内容については下記記事を参考にしていますので、このスクリプトでうまくいかない場合はそちらに目を通すとよいのではと思います。

hirokon0521.hatenablog.com

hirokon0521.hatenablog.com

OpenWrt 19.07.4 がリリースされてます

ルーターWiFiアクセスポイントなどの組み込みデバイス向けLinuxディストリビューションのOpenWrtの最新安定版 19.07.4 がリリースされてます。

forum.openwrt.org

19.07.4 の主な修正点は次のとおりだそうです。

  • libuboxのリグレッションを修正し、一部のサービスを開始できない問題に対処
  • LuCI Webインターフェースのリグレッションを修正:メニューに新しくインストールされたopkgパッケージが表示されない問題に対処
  • まれな状況でアプリケーションをクラッシュさせる可能性があるmuslのバグの修正。 たとえばVPNデーモンであるFastdがこのバグの影響を受ける。
  • 起動に失敗したいくつかのデバイスのサポートを修正
  • その他の多くの修正とデバイスサポートの改善
  • コアコンポーネントの更新(Linuxカーネル、mac80211、ath10k-ct-firmware

もうちょっと詳しい readme はこちらに。

openwrt.org

Windows上からBIOSのバージョンを確認する

HP のデスクトップ機のBIOSをアップデートしたはずなのに、HP Support Assistant からの更新プログラム通知が消えない状況が発生しました。バージョンは起動時にも確認することはできますが、たかがバージョン確認のために再起動するのは面倒なので、コマンドを実行してBIOSの情報を取得することにしました。

Linuxの場合は dmidecode コマンドでハードウェア情報を調査できますが、Windows の場合はwmic bios get /value と実行するとBIOSに関する詳細情報を確認できます。手元のPCでは、次のような結果が表示され、02.48がインストールされていることが確認できました。

C:>wmic bios get /value


BiosCharacteristics={7,8,11,12,15,16,19,26,27,28,29,32,33,40,41,42,43}
BIOSVersion={"HPQOEM - 0","N01 Ver. 02.48","HP - 20030"}
BuildNumber=
Caption=N01 Ver. 02.48
CodeSet=
CurrentLanguage=enUS
Description=N01 Ver. 02.48
EmbeddedControllerMajorVersion=5
EmbeddedControllerMinorVersion=57
IdentificationCode=
InstallableLanguages=14
InstallDate=
LanguageEdition=
ListOfLanguages={"enUS","daDK","nlNL","fiFI","frFR","deDE","itIT","jaJP","noNO","ptPT","esES","svSE","zhCN","zhTW"}
Manufacturer=HP
Name=N01 Ver. 02.48
OtherTargetOS=
PrimaryBIOS=TRUE
ReleaseDate=20200714000000.000000+000
SerialNumber=xxxxxxxxxx
SMBIOSBIOSVersion=N01 Ver. 02.48
SMBIOSMajorVersion=2
SMBIOSMinorVersion=7
SMBIOSPresent=TRUE
SoftwareElementID=N01 Ver. 02.48
SoftwareElementState=3
Status=OK
SystemBiosMajorVersion=2
SystemBiosMinorVersion=48
TargetOperatingSystem=0
Version=HPQOEM - 0

OpenWRTで追加パッケージのインストールと設定作業を自動化してRaspberry Piでトラベルルータを作る

OpenWRTでRaspberry Piをルータ化する場合、Raspberry Pi2だとUSB WiFiドングルのドライバが標準イメージに含まれていないため、個別にインストールする必要があります。 しかしRaspberry PiNICポートはデフォルトでは192.168.1.1の固定アドレスがふられていて、DHCPサーバも動作していますので、以下のように設定変更する必要があります。

  • NICポートのIPアドレスを変更し、DHCPアドレスを無効化する
  • USB WiFiドングルを装着してドライバをインストールし、利用できる状態にする
  • USB WiFiドングルをWiFi APに設定し、LAN側に設定する
  • NICポートをWAN側に変更し、DHCPクライアントやPPPoEなどの設定に変更する

この作業自体は大した手間はかかりませんが、それでも意外にめんどくさいものです。そこで、この作業を自動化するスクリプトを書いてみました。以前の記事で作成していた手順では、追加パッケージは予めサイトからダウンロードする方法を紹介していましたが、この方法の場合は事前にダウンロードしておく必要はなく、指定したパッケージをスクリプトで自動的にインストールでき、手間なく環境構築できます。

スクリプトによって行われる操作

このスクリプトは以下の操作を自動的に実施します。

  1. 追加パッケージを動的に行うためにLAN(NICポート)をDHCPクライアントに設定する。
  2. NICポートがインターネットと疎通可能な状況になり次第、パッケージの追加インストールを行う。
  3. WAN側はDHCPクライアントに設定し、NICの接続先をWANに変更する
  4. WiFi APの設定を行い、LAN側のDHCP設定を固定IPアドレス割り当て+DHCPサーバにする

このため、OpenWRTのRaspberry Pi向けイメージをmicroSDHCに焼いて起動したのち、このスクリプトを実行すればすべての設定調整が完了します。 WiFi USBドングルのドライバは BUFFALO WLI-UC-GNM2 向けのドライバを opkg install でインストールしていますが、他のドングルを使っている場合はドライバを適切なものに変更してください。 Raspberry Pi3 以降の機種ではドライバのインストールは不要ですが、luci-i18n-base-ja を入れておくとUIが日本語になるので、これだけは入れておいて良いでしょう。

作成したスクリプト

設定調整が必要な箇所はスクリプト前半にまとめてあるので、ここを適切に書き換えるだけです。これを initconfig.sh などの名前で microSDHCに焼いておけば、OpenWRT起動後に /boot/initconifig.sh を実行してNICをLANに接続するだけで、すべての設定が完了します。

#!/bin/sh -x

# 設定内容
LAN_ADDR=192.168.4.1
LAN_MASK=255.255.255.0
WIFI_SSID=[設定するSSID名]
WIFI_PASS=[WPA-PSKのパスフレーズ]

# Rapsberry PiのLANポートをDHCPクライアントにするための設定を書き込む
uci set dhcp.lan.ra_management='1'
uci del network.lan.ipaddr
uci del network.lan.netmask
uci del network.lan.ip6assign
uci set network.lan.proto='dhcp'

uci commit
/etc/init.d/network restart

# 外部向けの疎通が確保できたらパッケージのインストールを行う
while :
do
  ping -c 1 www.google.com > /dev/null 2>&1
  if [ $? == 0 ]; then
    opkg update
    opkg install \
      kmod-mac80211 \
      kmod-rt2800-lib \
      kmod-rt2800-usb \
      kmod-rt2x00-lib \
      kmod-rt2x00-usb \
      rt2800-usb-firmware \
      libusb \
      usbutils \
      luci-i18n-base-ja
    break
  fi
done

# WiFiルータにするための設定を書き込む
uci set system.@system[0].zonename='Asia/Tokyo'

uci set dropbear.@dropbear[0].Interface=lan

uci set dhcp.lan.ra_management='1'
uci set network.lan.proto='static'
uci set network.lan.ipaddr=$LAN_ADDR
uci set network.lan.netmask=$LAN_MASK
uci set network.lan.ifname='wlan0'

uci set network.wan=interface
uci set network.wan.proto='dhcp'
uci set network.wan.ifname='eth0'

uci set wireless.radio0.disabled='1'
uci set wireless.radio0.country='JP'
uci set wireless.radio0.txpower='10'
uci set wireless.default_radio0.encryption='psk2'
uci set wireless.default_radio0.network='lan'
uci set wireless.default_radio0.ssid=$WIFI_SSID
uci set wireless.default_radio0.key=$WIFI_PASS
uci set wireless.default_radio0.wpa_disable_eapol_key_retries='1'
uci delete wireless.radio0.disabled='1'

uci commit
/etc/init.d/network restart

reboot