pslaboが試したことの記録

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

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

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


SORDのPIPSが2020年11月で公開終了となるらしいので、サイトコンテンツのバックアップを試みる

SORDの簡易言語PIPSで構築されたアプリケーションの今後のメンテナンスについて相談を受けている件の調査のために https://www.sord.co.jp/archives/pips/ にアクセスしてみたら、2020年11月でPIPS関連のページを公開終了する旨が表示されていたので、コンテンツをローカルにバックアップする方法を試みた際の記録です。

バックアップ方法

今回は wget を使用します。

ただし。単に wget -r -np で一括取得を試みると失敗することがわかったので、それを回避するために次のディレクリと空ファイルの作成を行っておきます。

mkdir -p www.sord.co.jp//archives/pips/sitemap/
mkdir -p www.sord.co.jp//archives/pips/tool/index2.html
touch www.sord.co.jp//archives/pips/sitemap/index.html
touch  www.sord.co.jp//archives/pips/tool/

wget は次のオプションをつけて実行します。

wget -c -nc -np -w 1 --random-wait -r https://www.sord.co.jp/archives/pips/

なぜこのような方法が必要なのか?

www.sord.co.jp のサイトを単純に wgetミラーリングしようとすると途中で失敗しました。しかも、その後しばらくアクセスできなくなリました。そこでインターネット接続を固定回線からスマートフォンでのテザリングに切り替えてみたものの、同じ現象が発生しました。この理由は、おそらく次のような設定が行われているためだと考えられます。

  1. 同一IPアドレスのクライアントから短時間に多数のリクエストをかけると、そのクライアントのIPアドレスからのアクセスをブロックする
  2. 404 Not Found が発生すると、そのクライアントのIPアドレスからのアクセスをブロックする

1 への対策は、Webサーバにリクエストを送る頻度を適切に下げることです。このために -w 1 --random-wait の2つのパラメータを指定します。

2 への対策は、ミラーリング操作による取得を試みた際にリンク切れしているURLへのアクセスを抑止することです。このために、リンク切れしているページと同じファイル名のファイルを保存先に予め作成しておきます(mkdir, touch)。また、すでに取得済みのコンテンツは再取得しない(-nc)ように指定します。さらに、ダウンロードを始めるURLよりも上位側のコンテンツへのリンクを無視し(-np)、必要最小限のファイルだけをミラーリグします。

このようにして wget を別のモバイル回線で実行したところ、ミラーリングの操作でブロックされることなくダウンロードを進めることができました。

モバイルSuicaの退会に関するメモ

iPhoneに設定したモバイルSuicaの退会がなんとなく分かりづらかったのでメモしておく。

単に端末からSuicaを削除したい場合

Walletで「このカードを削除」すれば端末からは削除され、サーバにカード情報が退避される。

ただしこれはSuica自体を完全に解約するわけではなく、退避しているだけなので残額の払い戻しは行われない。

Suicaを解約してSuicaの利用自体を停止するには、モバイルSuicaアプリで会員登録してからの退会手続きが必要。

不要になったSuicaの払戻しをしてほしい。 | Suica Apple Pay よくあるご質問

手元の端末でモバイルSuicaを一つだけ設定している場合

モバイルSuicaアプリで端末側で対象のSuicaを選択し、「チケット購入・Suica管理」のメニューから払い戻しを行えば退会できる。退会完了した時点でモバイルSuicaは端末から削除されている。

Suicaの残額を0にしてから手続きすれば、払い戻しに伴う残額の銀行口座振り込みの手続きは不要。

Suicaの利用をやめて退会したい。 | Suica Apple Pay よくあるご質問

手元の端末で複数のSuicaを設定している場合

個々のSuicaについて、すべてモバイルSuicaアプリで払い戻しを実施すれば退会が完了する。

Suicaを端末から削除していて、サーバに退避している場合

Walletで端末にSuicaを再設定したのち、モバイルSuicaアプリからの払い戻しにより退会完了。

削除/再発行/復元されたSuicaを端末に再設定したい。 | Suica Apple Pay よくあるご質問

端末側での退会が行えない場合(Suicaを設定した端末を紛失した場合など)

端末側で退会処理が行えない場合は、専用のフォームからの申請により退会できる。

Apple PayのSuica/モバイルSuica「会員専用退会・払戻し」申請フォーム | Suica Apple Pay よくあるご質問

いまさら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