ぱっそ あ ぱっそ

個人的なメモをだらだらと。無保証。記事は随時書き直しています。

Airstationを毎日再起動する(go言語/go-rod)。最初の一歩編

概要

今回はログイン画面を取得し、ログインを完了するところまでを行う。

ステップ1:ブラウザの呼び出し、ページの取得と確認

まずはログイン画面を取得するところから始める。今後、プログラムからページを操作するにしても、中身が見れないと進めるのが困難なので、取得したデータを確認できるよう取得したデータを表示するところまで進める。

step1.go

Package main

import (
        "fmt"

        "github.com/go-rod/rod"
        "github.com/go-rod/rod/lib/launcher"
)

func main() {
    url := launcher.New().MustLaunch()
    browser := rod.New().ControlURL(url).MustConnect()
    defer browser.MustClose()
    page := browser.MustPage("http://192.168.11.1/login.html")
    page.MustWaitStable()

    html, err := page.HTML()
    fmt.Println(html,err)
    Info, _ := page.Info()
    fmt.Println("URL:", Info.URL, " Title:", Info.Title)
}

対象の機器のipは192.168.11.1を想定。初めて実行する前にはgo mod init step1.go/go mod tidyしてモジュールを利用できるようにする。 参考:go mod完全に理解した

1行目と2行目でヘッドレスのブラウザを読み出し、4行目で指定したURLの内容を読み込む。後半では読み込んだ変数pageのHTML(テキスト本体)と、ページの情報(URLとタイトル)を表示するもの。実行するとログイン画面の内容が確認できる。 3行目のdefer文はGo言語の遅延関数というもので、今回ならmain関数が終了される際になって実行されるもの。今回の例では気にしなくていいが、途中で処理が中断してしまうような場合でもこれを使うことで確実にclose処理を行うことができる。

MustWaitStableはページの読み込みを待つために記載。この点については後日詳細に書きたい。

ステップ2:要素へのアクセス。テキストボックスへの値の代入。クリック処理

ステップ1で取得したデータをもとに、パスワードを入れるテキストボックス(ID='id_nosave_Password')とログインの際のボタン(id='id_login'])を確認、MustElementを使ってElementを取得しつつ、値を代入したりクリックしたりしてログイン処理をプログラムで行う。うまくいけば、二回目のpage.HTML()とpage.Info()はログイン後のものを返すはず(もちろんパスワードはダミー)

step2.go

Package main

import (
        "fmt"

        "github.com/go-rod/rod"
        "github.com/go-rod/rod/lib/launcher"
)

func main() {
        url := launcher.New().MustLaunch()
        browser := rod.New().ControlURL(url).MustConnect()
        defer browser.MustClose()

        page := browser.MustPage("http://192.168.11.1/login.html")
        page.MustWaitStable()

    html, err := page.HTML()
    fmt.Println(html,err)
    Info, _ := page.Info()
    fmt.Println("URL:", Info.URL, " Title:", Info.Title)

        page.MustElement("[id='id_nosave_Password'").MustInput("acecat")
        page.MustElement("[id='id_login']").MustClick()
        page.MustWaitStable()

        html, err = page.HTML()
        fmt.Println(html,err)
        Info, _ = page.Info()
        fmt.Println("URL:", Info.URL, " Title:", Info.Title)
}

これでログイン後の画面を表示できた。 次回でいったん再起動ができるところまで進める予定

Airstationを毎日再起動する(go言語/go-rod)。環境準備編

概要

Go言語と、Go言語でのWebスクレイピングライブラリのrodの勉強として、無線LANの親機のAirStation(株式会社バッファロー)を再起動するプログラムを作成する

作成の目標

Airstationは無線LAN機器としてメジャーな製品で、そのなかで安いもの(WSR-1500AX2S)を使っているのだけれど、手持ちの機器では定期的にwifiがつながらないor極端に遅くなる。というような症状がでる。
この予防のため、定期的な機器の再起動を行いたいのだけど、AirStatinシリーズの結構致命的な問題点として、インタフェースがWebUIしかなく、コマンドラインでコマンド一発で再起動!とはいかない。なので、Webスクレイピングプログラムにより再起動の画面操作を自動的に行うことで実現する。

環境の用意

今回は以下の環境で行う。今回はubuntuまではある前提で、環境の整備手順をまとめる。

OS:Ubuntu 22.04.4 LTS
GO:go version go1.18.1 linux/amd64

chromeとchromedriverをインストール

1.chromeのインストール
curl -O https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb

dpkg: **error** processing package google-chrome-stable (--install):
などと表示される場合はパッケージの整合性をとるために

sudo apt install -f

としてから再度コマンド実行する。

2. chromedriverのインストール(unzipパッケージが必要)
curl -O https://chromedriver.storage.googleapis.com/114.0.5735.90/chromedriver_linux64.zip
unzip chromedriver_linux64.zip
sudo mv chromedriver /usr/local/bin/
rm chromedriver_linux64.zip

qiita.com

次回は実際のプログラムを作成し、データとの取得、プログラムからの操作できるところまで行う。

この頃切り替えたサービスを書く。ノート共有アプリ(EvernoteからJoplin)

Evernoteをメモ帳+ウェブクリップのために利用してたけど、
無償版の制約がいよいよ不便に感じてきたので代替サービスに乗り換え。
アプリの機能等には問題がないのだけど、デバイス数2までというのがどうにも不便すぎた。

メモの共有はOneNoteやNotion、その他のクラウドメモソフトで
問題ないんだけど、webクリップが思った感じにならなくて停滞していたが、Joplinでいったん確定

見た目そのまま、とはいかないが、崩れたレイアウトはmarkdownでおおむね整えることが可能
Evernoteのエクスポートデータを取り込めるので、いっきに移行が完了できたのもよい。

joplinapp.org

この頃切り替えたサービスを書く。IP電話(LINEOUTからKeepCalling)

格安でないキャリアの通話プランは割高+知人等にはLINE電話で済ますので、たまにお店などに電話するぐらいで通話し放題は不要。という人へのご案内

基本料無料のIP電話としてずっと使っていたLINE OUTがサービス終了、Smartalkも新規入会ができなくなっていて困っていたのですが、やっと切り替え先を見つけることができました。

KeepCalling
日本語の紹介ページ(https://moshimoshi81.com/)

決め手となったのは、paypalが使えるという点。

基本料無料なサービスがいくつか見つかるとはいえ、課金のためにクレジットカード情報を登録するのは入れるのはちょっと。と思うところ、paypalでチャージすれば安心。
電話代も3.15円/分なので、このチャージを使いきるのにも時間かかりそうです。

powershell(というかC#)で、クリップボードデータのメディアタイプの一覧を取得する。

evernote移行の検討中のメモ、webブラウザからコピペしたデータがどのような形で保持しているかを確認したくて実行

Add-Type -AssemblyName System.Windows.Forms

$clipboardData = [System.Windows.Forms.Clipboard]::GetDataObject()

$clipboardData.GetFormats()

後ろ2行は以下の通りまとめてもOK

 [System.Windows.Forms.Clipboard]::GetDataObject()

 

vmware ESXi 7 を導入した(DS57U)

以前からブログの記事にしていたDS57UでのESXi、ついにESXi 5.5から ESXi 7にアップグレードした。

実際にはアップグレードはNG(5.5のときににカスタムISOを使っていたのが原因と思われる)
まったくの新規インストールとなったが、標準インストーラNICも2つとも見えていて問題なし。
当初はファイルサーバとして利用していたが移行しようとしたらリードエラーが多発
(COLORFUL SL500だから?ネットではあまりいい記事は見つけられなかった)
冷や汗をかいたが、veeamで差分バックアップと取っていたのが幸い、破損前のファイルを移行できた。

家庭用なので、SSDを最大限利用するための設定をしてインストールしたので記事を紹介

tech-mmmm.blogspot.com

この機械、何年利用しているんだろう、そろそろ寿命になるかも。

dperson/sambaでユーザ情報を一致させる方法

DockerでSambaサーバを立てるためにdperson/sambaを利用し、かつローカルのフォルダをマッピングすることで永続化させているとき、SMB経由で作成・編集したファイルの、オーナー情報・グループ情報が自身のアカウントと全然関係ないものになるときの対処方法メモ
(sambaサーバとしては動作に問題ないけど、ファイルの書き込みの有無によって元のオーナー・変なオーナーとバラバラになって気持ち悪い。)

原因は「コンテナ内のSambaユーザ」と「Dockerホスト側のID情報」が紐づいていないのが原因。このページの説明が判りやすかった。

blog.amedama.jp

「Dockerホスト側の紐づけたいアカウント」の情報を「コンテナ内のSambaユーザ」の情報として扱うようにしてSambaサーバを作成すれば解決する。

dperson/sambaの場合、環境変数によりuid/gidを引き継げるので、まずはホスト側で紐づけたいアカウントのuid/gidを確認

pi@ubuntu:~$ id
uid=1000(pi) gid=1000(pi) groups=1000(pi),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)

uid/gidが判れば、docker起動時のパラメータに追加する。

修正前(一部省略)

sudo docker run --name samba --restart=always -p 139:139 -p 445:445 -v /home/pi/share:/mnt/pub -d dperson/samba -s "share;/mnt/pub;yes;no;yes"

修正後

sudo docker run -e USERID=1000 -e GROUPID=1000 --name samba --restart=always -p 139:139 -p 445:445 -v /home/pi/share:/mnt/pub -d dperson/samba -s "share;/mnt/pub;yes;no;yes"