0%

通过AIDA64可以获得大量的传感器数据,例如CPU频率、温度,显存、内存使用情况等。并且,软件还可以将这些数据输出到兼容的LCD或VFD屏幕上。对于大部分DIY爱好者,这个功能已经足够强大了。不过,如果你试图通过高级语言编程来收集和处理数据,就会遇到困难——AIDA64似乎并没有提供方便的接口。在设置项中苦苦搜寻了一番,博主只找到了一个基于HTTP长连接的网络接口,配置起来还比较复杂。
为了避免重复造轮子,博主转而前往GitHub搜索,发现了一个名为aida64-to-json的项目。它的原理非常简单:设置AIDA64将传感器数据写入注册表,然后读取注册表中的传感器参数并格式化。
Bingo!这正是一个完美的解决方案,之前居然没有想到。使用方法也很简单,需要进行一些设置:
文件 → 设置 → 外部程序 → 允许将监测数据写入注册表

然后就可以读取注册表信息了。aida64-to-json是基于Node.js的,博主又用Python重写了一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/usr/bin/env python3

import os, winreg

def query():
if os.name != "nt":
pass
db = {}
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, "Software\\FinalWire\\AIDA64\\SensorValues") as key:
for i in range(winreg.QueryInfoKey(key)[1]):
name, data, _type = winreg.EnumValue(key, i)
attr = name.split(".")
if (attr[0] == "Label"):
db[attr[1]] = {}
db[attr[1]]["label"] = data
else:
db[attr[1]]["value"] = data
return db

if __name__ == "__main__":
db = query()
print(db)

此外还有一个可行的方案:利用AIDA64的共享内存特性,用C++写一个Node.js或者Python的插件。其实Rivatuner也有共享内存可以用,可惜文档太少,不知从何下手。
博主随后又到AIDA64的社区中搜寻,发现了诸如「如何将传感器数据通过串口输出Arduino上」这样的问题,但都没有得到可靠的回复。这样比较下来,读注册表似乎确凿是一个很省事的方案了。

ssh连接远程服务器时,如果连接断开,那么当前的进程就会被杀死。运行系统备份或ftp传输这样耗时较长的任务,ssh不方便一直挂着,那该怎么办呢?这种情况的应对方法是GNU Screen,一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

在执行快速和简单的任务时,往往不会使用screen,因为这没有必要。但是,如果发现正在运行的任务花费的时间比预期的要长得多,或者只是单纯地忘记了在执行命令前进入screen,该怎么办呢?这时退出ssh就会导致前功尽弃。在这种情况下,我们剩下三个选择:

  • 一直保持ssh连接,但不知道要等到什么时候
  • 退出当前进程,丢失所有未保存的工作,并可能浪费大量的时间来处理,或者
  • 将正在运行的进程移至新的screen中。这是博主将在后文中描述的解决方案。

操作步骤如下。

挂起进程

我们需要做的第一件事是通过按Ctrl+Z挂起当前的进程。
这会向进程发送一个TSTP信号——停止执行进程,并且内核将不再为该进程安排更多的CPU时间。

在后台恢复进程

输入bg命令。这会将SIGCONT信号发送到该进程,现在它会在后台欢快地运行起来。

disown进程

现在,我们像这样运行disown命令:

1
disown %1

disown从活动作业表中删除该进程,从本质上允许该进程被另一个会话接管。

新开screen

执行screen即可,进入一个新的screen会话中。

查找进程的PID

现在,我们需要找到要接管的进程的PID。博主使用和推荐的方法是pgrep。例如,如果我们的进程称为myprogram,则可以运行pgrep myprogram命令,该命令将返回其PID。

使用reptyr接管进程

最后,我们将PID传递给reptyr来接管该进程。如果pgrep给我们的PID为1234,我们现在可以使用以下命令:

1
reptyr 1234

最后两步也可以和在一起:

1
reptyr $(pgrep myprogram)

本文翻译自:Move a running process to screen

你们可能不知道,用40血通杀全场是什么概念。我们一般只会用四个字来形容这种人——米尔菲斯。

我经常说一句话,当年卢本伟开自瞄爆头29杀,我巫妖巴兹亚尔锁1血不是问题。

埋伏他一手,这个牌不用捡,不能捡。他死定了。

扩展运算符是ES6语法,推出距今已有数年,但似乎并不常见。它有几种用例能让JavaScript代码更加有效使用,本文将作一个梳理。

不使用apply方法呼叫函数

这里指的是Function.prototype.apply,它允许我们将实参以数组形式传入函数并依次对应到形参上。

1
2
3
4
function doStuff (x, y, z) {}
var args = [0, 1, 2];
// Call the function, passing args
doStuff.apply(null, args);

通过扩展运算符我们可以避免使用apply并且轻松地使用它呼叫函数。

1
doStuff(...args);

代码更少,更干净,而且不需要使用多余的null

作用于数组

扩展运算符可以用来代替concatslice这些数组函数。

1
2
3
4
5
6
// joining arrays
const odd = [1, 3, 5];
const nums = [2 ,4 , 6].concat(odd);
// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = arr.slice()

简写:

1
2
3
4
5
6
7
// joining arrays
const odd = [1, 3, 5];
const nums = [2 ,4 , 6, ...odd];
console.log(nums); // [ 2, 4, 6, 1, 3, 5 ]
// cloning arrays
const arr = [1, 2, 3, 4];
const arr2 = [...arr];

不像concat函数,可以使用扩展运算符来在一个数组中任意处插入另一个数组。

1
2
const odd = [1, 3, 5 ];
const nums = [2, ...odd, 4 , 6];

展开NodeList

此外,在前端还有一个应用场景。通过document.querySelectorAll选择的元素,返回的是一个NodeList对象而非Array。这意味着你不能直接调用forEach方法来遍历它,而是需要一些额外的代码。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var targets = document.querySelectorAll("p");

[].forEach.call(targets, function(target) {
target.style.color = "red";
});

for (var i = 0; i < targets.length; ++i) {
targets[i].style.color = "green";
}

for (var target of targets) {
target.style.color = "blue";
}

Array.from(targets).forEach(function(target) {
target.style.color = "orange";
});

这时,也可以直接使用扩展运算符展开NodeList

1
2
3
[...document.querySelectorAll("p")].forEach(function(target) {
target.style.color = "black";
});

在Hexo的NexT主题中,就多次使用了这一技巧。

解构对象

也可以使用扩展运算符解构:

1
2
3
4
const { a, b, ...z } = { a: 1, b: 2, c: 3, d: 4 };
console.log(a) // 1
console.log(b) // 2
console.log(z) // { c: 3, d: 4 }

拆分字符串

一个典型的例子是:

1
2
const str = "hello";
[...str]; // => ['h', 'e',' l',' l', 'o']

就连Emoji也能扩展

很多Emoji字符不是独立的Unicode字符,而是由多个Emoji组合而成。最常见的就是家庭Emoji和有肤色的Emoji,例如👪和👨‍👩‍👧‍👧。这点在前面的文章Unicode字符与颜文字表情中也有提到。
神奇的事情是,如果使用扩展运算符的话,它们是可以拆散的!

这些复合emoji字符甚至还允许做替换,形成新的emoji字符。

不得不说这是一种绝妙的使用方式。


拓展阅读:[译] 6 种 JavaScript 展开操作符的绝妙使用

Boot Loader,或「引导程序」,是微控制器中烧录的固件。对于Arduino而言,每次按下复位键,或者编译上传新的程序时,都会先加载Boot Loader;随后Boot Loader再来执行程序,或者根据电脑的指令,将新程序的代码写入闪存中。
在正常情况下,Boot Loader是预置好的,用户只需要写程序然后上传,而不用关心其它的问题。但在有些情况下,还是需要用户自己来烧录Boot Loader。例如,根据Arduino开源的电路图制造和焊接的开发版,使用前需要烧录Boot Loader才能正常工作。而一些国产的寨版,可能出现各种奇怪的问题,这时也可以尝试通过刷Boot Loader来解决。
烧录Boot Loader的方式有很多种。在Arduino IDE的菜单中,选择「工具」 → 「编程器」,即可查看官方支持的方法:

本文将介绍其中的一种方法:使用另一块Arduino开发版,作为ISP(即in-system programmer),来进行烧录。为了避免歧义,我们将功能正常的版称为「ISP板」,而需要烧录Boot Loader的版称为「坏板」。在具体的例子中,将一块「Arduino Leonardo」作为「ISP板」,一块「Arduino Mega 2560」作为「坏板」。

上传程序

将「ISP板」连接到电脑,并移除其它所有线缆。打开Arduino IDE,在菜单中选择「文件」 → 「示例」 → 「11.ArduinoISP」 → 「ArduinoISP」。这是一个将Arduino变为AVRISP的程序,将其编译上传到「ISP板」即可。

阅读全文 »