2022年8月26日金曜日

linux で sleep が失敗する

同じラップトップでLinuxでも同じ症状だったので、こちらも対応。

やはりsleep直後にwakeupしているようだ。 こことか こことか ここを 参考にいろいろ試してみた。

> cat /sys/bus/usb/devices/*/power/wakeup
とやったところ1−2がenableになっていることを発見。 これを強制的にdisableに書き換えたところ、安定してsleepするようになったようだ。 めでたい。

ただ、電源ボタンがどうもIME ON/OFFに割り当てられているっぽいんだよな。そんなことできるの?

windows でsleepが失敗する

 Windowsのノートでいつからかsleepがうまく行かなくなっていた。厳密にはsleepすると同時にsleepが解除されて起きてしまう、という症状。

いろいろ調べてみた結果、どうもタッチパッドやキーボードからの入力を拾ってsleepが解除されていたようだ。デバイスマネージャのタッチパッドとキーボードのペインの「電源管理」タブで「このデバイスでスリープを解除する」を無効にしたら治ったようだ。

2022年7月15日金曜日

emacs mac gnupg

macのemacsのepgでなぜかminibufferからのパスワード入力ができなくなった。 ~/.gnupg/gpg-agent.confに下記を追加したら別ウィンドウから入力できるようになった。 pinentry-macはbrewではいる。
pinentry-program /opt/homebrew/bin/pinentry-mac

2022年7月12日火曜日

Google functions とdatastore

App Engineからfunctionsに乗り換えるためにテスト。 調べてみるといろいろと新しいシステムデータベースはあるのだけど、 結局われわれの用途にはdatastoreが一番適しているという結論。つまらん。

datastoreの認証がどうなっているのか心配だったのだが、GCPのプロジェクト内では 認証が不要っぽい感じ。逆にプロジェクト外部からは触れなさそう。 この辺、AWSのIAM Roleですべての認証を切り分けていくというのとは好対照だな。

このブログを参考に試してみた。 データはdatastoreのWebサイトから直接データをいれていて、それをfunctionsから 取りに行く形。

const functions = require('@google-cloud/functions-framework');
const Datastore = require('@google-cloud/datastore');
const datastore = Datastore();

functions.http('helloHttp', (req, res) => {
   const key = datastore.key([req.body.kind, req.body.key]);
   console.log(req.body.kind, req.body.key);
   return datastore.get(key)
     .then(([entity]) => {
       res.status(200).send(entity);
     });
});
jsonをアップロードすると、自動的にパースしてくれるのね。便利。 package.jsonでdatastoreを参照する。最新版がいくつなのかわからないが、1.0.0だと 動かなかった。
{
  "dependencies": {
    "@google-cloud/functions-framework": "^2.1.0",
    "@google-cloud/datastore": "1.4.1"
  }
}
アクセスはこんなかんじ。謎の文字列は、datastore上のentityのID。
% curl -H "Content-type: application/json" -X POST -d '{"kind":"User", "key": 5634161670881280}' https://xxxx.xxxxx.x.run.app/

{"name":"john"}
返り値もjsonになってるけど、誰がやってくれてるんだろう。。不思議。

2022年7月7日木曜日

Julia のコードをssh越しにプッシュする

Juliaには-eというオプションがあって、同じことができる。 方針は同じで、ダブルクォートをエスケープして、前後にダブルクォートをつける。 これは3行ぐらいのコードでしか試してないのでどのくらいいけるのかわからない。
function read_and_process(filename) 
    open(filename, "r") do f
        l = join(readlines(f), "\n")
        "\"" * replace(l, "\"" => "\\\"") * "\""
    end
end

l = read_and_process("remote-test.jl")
println(l)

proc = My.open(`ssh localhost julia -e $l`, read=true)
println(readlines(proc.out))

python のコードをsshごしにプッシュする

Python には-cというオプションがあり、これを使うとコードを引数として与える事ができる。例えば、test.py というファイルがあった場合、
python -c "`cat test.py`"
などとやれば、test.pyを実行できる。ではこれをSSH越しにできるかというとちょっと難しい。
ssh REMOTE python -c "`cat.test.py`"
とやれば良さそうなものだが、コード部分がリモートのシェルで一旦解釈されてしまうので、エスケープする必要がある。 色々試行錯誤してできたのがこんなコード。要するに、全体をダブルクォートで囲み、中のダブルクォートはバックスラッシュで エスケープする、というだけ。全体をシングルクォートで囲むと中のシングルクォートをエスケープする方法が無いので詰む。 要するにシェルから渡す引数にプログラムを全部乗っけるので、限界がありそうだが、 このページを参考に調べてみると、 ubuntu 22.04では2M、macosで1Mなので、そう簡単には破綻しなさそう。
def load_and_preprocess(filename):
    with open(filename) as f:
        p = [l for l in f.readlines()]
        prog = "".join(p)
    prog = prog.replace('"', '\\"')
    prog = '"' + prog + '"'
    return prog


proc = subprocess.Popen(
    ['ssh', 'localhost',
        'python',
    '-c',
        load_and_preprocess('src/rjupyter_server.py')
    ],
    stdout=subprocess.PIPE
)

2022年3月16日水曜日

ABCIでjulia multi node

ABCIではマルチノードを確保して、相互にsshできる。
qrsh -g XXXX -I USE_SSH=1 -v SSH_PORT=2222 -l rt_F=2
とかやる。すると環境変数SGE_JOB_HOSTLISTに書かれたファイルにホストのリストが 入るので、Juliaのジョブの中で下のような関数を実行してやれば、 workerを追加することができる。
using Distributed

function invoke_hosts(port)
    hosts = open(ENV["SGE_JOB_HOSTLIST"]) do f
        readlines(f)
    end
    pairs = map(hosts) do h
        "$h:$port"
    end
    addprocs(pairs; sshflags="-o StrictHostKeyChecking=no")
end