Android UI でアプリ毎の電池の最適化設定ができない場合2021/11/09 00:00

なぜか NEC Lavie TAB T11 (Android 10)で UI での個別設定ができない。

「adb で電池の最適化ホワイトリストを操作する」
https://qiita.com/usagimaru/items/8b0e9c1c51b8942ee7c0

$ adb shell dumpsys deviceidle whitelist +パッケージ名

@usagimaru様に感謝!

Asustor 廉価版 NAS AS1xx4T の省エネ化 - その22021/09/18 00:00

事前準備
- NAS に、admin 権限のアカウントを作っておく(例えば adminx). admin アカウントを使ってもいいが、この目的専用の password にしておきたかった、というだけの理由。
- NAS の ssh サービスを有効にしておく
- 同じネットワーク上に常時動作してある linux を使う (Raspberry PI など)

下記 5 つのファイルを作成し、Linux host で crontab 設定する。

NASをリモート起動する場合は、WOL を使用(NAS の WOL 設定をお忘れなく)。

1) auto_poweroff.sh - NAS 上で動かすスクリプト
#!/bin/sh
PASSWD="adminx アカウントのパスワード平文"
SMBLOG="./smbstatus.log"
NSLOG="./netstat.log"
LOCKFILE="./auto_poweroff.lock"

## RAID scrubbing check
ps -ef | grep  "\[md1_resync\]"
if [ $? -eq 0 ]; then exit 0; fi
## RAID scrubbing check -- end

## established session check (UPNP, ftp, sftp, ssh)
netstat -ut > $NSLOG
M=`cat $NSLOG | wc -l`
while [ $M -gt 0 ]; do
        LINESTR=`sed -n $M\P $NSLOG`
        echo $LINESTR | grep -E "^(tcp|udp)" > /dev/null
        if [ $? -eq 0 ]; then
                SESSION=`echo $LINESTR | awk -F' ' '{print $6}'`
                if [ $SESSION = "ESTABLISHED" ]; then
                        IPPORT=`echo $LINESTR | awk -F' ' '{print $4}'`
                        echo $IPPORT | grep -E ":(5001|2222|ftp)$" > /dev/null
                        if [ $? -eq 0 ]; then break; fi
                        echo $IPPORT | grep -E ":ssh$" > /dev/null
                        if [ $? -eq 0 ]; then
                                CLIENT=`echo $LINESTR | awk -F' ' '{print $5}'`
                                CLIENTNAME=`echo $CLIENT | sed -e "s/^\(.\+\):[0-9]\+$/\1/g"`
                                IPADDR=`nslookup $CLIENTNAME | grep "Address" | tail -n 1 | sed -e "s/^Address.*:[ \t]\+\([0-9a-fA-F.:]\+\).*/\1/g"`
                                IPPORT="$IPADDR:`echo $CLIENT | sed -e "s/^.\+:\([0-9]\+\)$/\1/g"`"
                                SSHCLIENT="`echo $SSH_CLIENT | awk -F ' ' '{print $1}'`:`echo $SSH_CLIENT | awk -F ' ' '{print $2}'`"
                                if [ $IPPORT != $SSHCLIENT ]; then break; fi
                        fi
                fi
        fi
        M=`expr "$M" - 1`
done

if [ $M -gt 0 ]; then
        echo "$LINESTR"
        rm -f $LOCKFILE
        exit 0
fi
## UPNP session check -- end

## samba session check
echo $PASSWD | sudo -S /usr/builtin/bin/smbstatus -A > $SMBLOG
N=`cat $SMBLOG | wc -l`
while [ $N -gt 0 ]; do
        IPADDR=`sed -n $N\P $SMBLOG | awk -F' ' '{print $5}'`
        echo $PASSWD | sudo -S ping -c 1 -W 3 $IPADDR > /dev/null
        if [ $? -eq 0 ]; then break; fi
        N=`expr "$N" - 1`
done

if [ $N -gt 0 ]; then
        echo "IP $IPADDR is alive."
        rm -f $LOCKFILE
        exit 0
fi

if [ -e $LOCKFILE ]; then
        echo 'Execute poweroff'
        rm -f $LOCKFILE
        echo $PASSWD | sudo -S poweroff
        exit 2
else
        echo 'Check one more time later'
        echo -n > $LOCKFILE
fi

exit 1
2) sendscript.sh - 上記実行ファイルの転送と実行を host 上で行う script
#!/bin/bash
if [ $# -ne 1 ]; then
        echo "Usage: $0 [nas_server_address]"
        exit 2
fi

THIS_FILE_PATH=`dirname $0`
PASSWD="adminx アカウントのパスワード平文\n"

echo "["`date "+%Y%m%d_%H%M"`"]"

ping -c 1 -W 3 $1 > /dev/null
if [ $? -ne 0 ]; then
        echo "Target $1 in power-off. Quitting..."
        exit 1
fi

expect -c "
        set timeout 30
        spawn $THIS_FILE_PATH/chkfile.sh $1
        expect \"Password:\"
        send $PASSWD
        expect eof
        catch wait result; exit [lindex \$result 3]
"

if [ $? -ne 0 ]; then
        expect -c "
                set timeout 30
                spawn $THIS_FILE_PATH/scp.sh $1
                expect \"Password:\"
                send $PASSWD
                expect eof
                catch wait result; exit [lindex \$result 3]
        "
fi

expect -c "
        set timeout 30
        spawn $THIS_FILE_PATH/ssh.sh $1
        expect \"Password:\"
        send $PASSWD
        expect eof
        catch wait result; exit [lindex \$result 3]
"
3) scp.sh - 実行ファイル転送サブ・スクリプト
#!/bin/bash
THIS_FILE_PATH=`dirname $0`
scp -p $THIS_FILE_PATH/auto_poweroff.sh adminx@$1:./
4) ssh.sh - 転送スクリプトを実行させるサブ・スクリプト
#!/bin/bash
ssh adminx@$1 "./auto_poweroff.sh" 
5) chkfile.sh - 実行ファイルが NAS に存在するかを調べるサブ・スクリプト
#!/bin/bash
ssh adminx@$1 "ls ./auto_poweroff.sh"
exit $?
6) 上記 5 つのファイルをホスト Linux 上の同じディレクトリに置き(例では、~/nasctrl/)、chmod 750 としておく. Root である必要はなく、単なる 1 ユーザアカウントで OK.

7) ホスト Linux での crontab -e
NAS の I{P が 192.168.1.91 だった場合の例
*/15 * * * * ./nasctrl/sendscript.sh 192.168.1.91 >> ./nasctrl/nas01.log 2>&1

今回仕掛けた自動 poweroff 機構を簡単に一時停止したい場合の手段として、NAS での ssh session を開いていれば poweroff しない、という細工をしたのだが、poweroff を司るスクリプトの実行自体 NAS への ssh なので、永遠に poweroff しないというおマヌケな自体に陥った。とりあえず、の対策部がなんともイケてない。。。

Asustor 廉価版 NAS AS1xx4T の省エネ化2021/09/17 12:00

Buffalo の Linkstation NAS は、PC にソフトをインストールすれば、PC 立ち上げで NAS も立ち上がり、PC 終了で NAS もシャットダウンしてくれ、PC が複数台あっても対応できるし、非常に省エネな NAS でした。

ところが、Asustor の廉価版 NAS AS1xx4T は、HDDが停止する機能はあるが、15W 程度の消費があり(フル動作だと 30W くらいは消費している模様)、NAS 2 台つけていると常に 30W も消費していることになる。これは我が家の夜間消費電力の 10% を遥かに超えており、ちょっと嬉しくない。

Asustor の Intel CPU を使っている NAS の場合は、システム スリープ モード (S3)というものを持っていて、1.4W くらいに抑えることができるらしい。はやく言ってよ。もう2万出してこれ買っておけばよかった。。。
でもこの 2万をこの機能で償却できるのか、という疑問もある。

そこで、廉価版の NAS でも自動的にシャットダウンする仕組みを組めないか考えてみた。

幸いなことに、Asustor NAS には ssh が使える。

どの条件で自動シャットダウンしたいか、だが
1) Windows のファイル共有 (smb 接続)が存在しない
2) UPNP メディアサーバーでの配信が無い
は必須で、あと簡単に自動シャットダウンをさせない機構もほしいので
3) ssh セッションが生きていないこと(自動シャットダウンさせないときは、どこからか ssh terminal を開いておくことにする)
あと、
4) RAID scrubbing が実行されていないこと
も入れたい。

上記条件を検知して、条件を満たした状態が例えば15分続いたら自らを poweroff するスクリプトを書き、NAS shell で定期的に実行させればいいかも。と思っていたのだが、残念ながら NAS の cron が使えない。
/etc 以下にあるファイルを編集しても、NAS を再起動するといじれるシステム環境は初期化されてしまうという、よくある実装でした。

さて、それなら ssh を使って 外部から poweroff をしてあげればいい。家に低消費電力な常時通電 Linux も動いている (Raspberry pi の初期のもの)。

admin パスワードのやり取りが必要なので、セキュリティー的に心配だが、家庭内だし、マシン間通信がセキュアならまあいいか。

実装概要としては
a) poweroff 条件をチェックして自らを poweroff する NAS 上で動作する sh スクリプトを書く
b) a) を外部(Host) Linux から NAS にロードして、定期的に NAS 上での実行をかける (Host Linix の cron を使う)

その2へ続く。。。

一台の UPS と NAS と PC をすべて連携してシャットダウンさせたい - Asustor + APC 編2021/09/17 00:00

ASUSTOR NAS
近頃、SDE (Silent Data Error) という言葉をよく聞き、RAM等のソフトエラーだけでなく、HDD でも自然とデータ化けが起きることがあるとか。
確かにありえるし、気がついたらファイルがおかしくなっていた、というのも悲しいので、対策を考えた。

すると、いくつかの NAS で、RAID5 などパリティー型修復機構を持つ RAID 機構の場合、RAID scrubbing といってチェックをして再書き込みして修正してしまおう、という仕組みがあることがわかった。
でも、残念ながら古い Buffalo Linkstation には RAID scrubbing は無いらしい。

そこで、NAS を Buffalo Linkstation から、廉価な Asustor の 4 HDD 版に変えました。

ところが手持ちの Omron の UPS には対応していないので、UPS も APC 製に変更(APCは今シュナイダーエレクトリックなんですね)。

さらに、UPS/NAS と PC を連携してシャットダウンする自作プログラム "B-NAS Utils" も ASUSTOR+APC に対応させました。

B-NAS utils bnasupsc v1.6.0
http://www.ne.jp/asahi/net/pockey/program/bnasutils-1.6.0.zip

後で気がついたのですが、この RAID scrubbing、ASUSTOR の廉価版の場合は、毎回マニュアルで scrubbing をスタートさせる必要があり、定期的には実行してくれない。Asus のサポートに問い合わせると、自動実行機能は検討中だがいつ実装されるかはわからないとのこと。
Synology 社のはできる的なことが web にあるので、Synology 社のにすればよかったか、、、頑張れ Asus

Fujitsu STYLISTIC Q550/C Windows102021/04/28 00:00

10年前に購入した Atom Z670 を載せた Windows Tablet,
Fujitsu STYLISTIC Q550/C.

Windows マシンとしてはほぼ実用をなさなくなってしまったが、売り払うにもヤフオクで1000円でたくさん出ている次第で、売るのもしのびなく、使いみちを考えていたところ、Windows 10 の WiFi Display で拡張画面として使うため、Windows 10 のインストールをしてみた。

事前調査として、Web でいろいろ調べてみたが、具体事例は過去のみ。
http://monthly100h.blogspot.com/2018/04/stylistic-q550c-windows10.html
(出典: 1/2592000Hz - 100H 様)

USB起動での Windows10 クリーンインストールを考えたが、どの Windows10 release を使ってもブートが完了しない。起動後、Windows ロゴが出た後、その下に出るはずの、クルクル回るドット円が全く出てこない。

そこで、標準インストールの Windows 7 状態からの upgrade を試みることにした。
先程の Web にある事例の通り、確かに新し目の upgrade release では途中でハングアップ(アップデート進行中に例のクルクル円ドットが固まったまま停止)してしまうので、比較的若い version で upgrade してみる。

ここで、古い release の MediaCreationTool.exe の入手が問題だが、所望の release のをダウンロードして実行してくれるツールを配布しているサイトが有る。素晴らしい。
"Universal MediaCreationTool wrapper"
(https://gist.github.com/AveYo/c74dc774a8fb81a332b5d65613187b15)
まぁ、古い release のを未だに Web にとどめてくれている Microsoft にも感謝だが。

このサイトにある、"MediaCreationTool.bat" の Window の右にある "Raw" ボタンを右クリックから save するとバッチファイルがダウンロードできる。うまく動作しない場合は、改行コードが適切でないことがあるので、テキストエディタで開き、改行コードを CR LF にしておくと改善することがある。

これでなんとか Windows10 release 1151 にできた。
ところが、この release では WiFi Display 対応でなく、指紋認証の Windows Hello 対応もないため、さらなる upgrade が必要。ちょっとづつ release up を試みるも、 Bluescreen的な error 画面で止まってもとに戻されてしまう。若い順に片っ端から release version を変えて試したところ、1709 はかなり最後の upgrade process まで進み、かなり有望。でも似たようなところでいつも Bluescreen。二度試して、どちらも Bluescreen を出しているドライバーが Intel GMA600 の graphics driver であるとのこと。Intel のドライバーを uninstall して再度 release upgrade を行ったら、やっと最後まで進み release 1709 完成。

待望のWiFi Display は機能したが、指紋認証等の Windows Hello は機能せず。。。

これ以上の release up はリスキーだが、Windows Update が 20H2 のダウンロードを開始してしまうので、update が進む前にとりあえず Knoppix の partimage で SSD image backup。
Clonezilla 使いたかったが、なぜか起動画面後先に進まなかった。

先程 Intel GMA600 の Graphics driver をもとに戻す。Windows7 用しか無いが、インストールはでき、1280 x 800 の画面を取り戻すが、Windows10 操作中、画面が真っ暗になり復活しないことが多発する。これは hang-up はしていないようで、VNC Server を入れておけば、画面が真っ暗な状態でもリモート操作はできるが、かなり不便な状態。

色々と試してわかったが、なにも MediaCreationTool 経由で upgrade しなくても、Windows10 インストール iso を SD Card に展開しておき、setup.exe を実行する方法での upgrade でもできるようだ。ただし、私の Q550/C の個体の問題か、upgrade処理の途中で止まってしまい、差し戻しが起きてしまうことがあるので、もし upgrade処理が滞る場所がランダムなのであれば、どちらかの upgrade 方法で、うまく通るまで粘り強くやる必要があるかもしれない。
upgrade 処理が滞るところが毎回同じ場合は、何かを修正しない限り、諦めたほうがいいようだ。