我已经彻底了解了 lua,但我不明白的最后一件事是协程。
现在摆在我面前的任务是:我的主脚本连接一个在安全环境中运行的第三方模块。攻击者不能对这个模块做任何错事,因为他没有可用的函数或变量。但他唯一能做的肮脏伎俩就是挂起:while true do end
. 因此,我必须用一个带有计时器的协程包装该函数,该计时器只是倒计时几秒钟,如果在此期间该函数尚未完成,则将其杀死并抛出错误。请帮帮我。
我已经彻底了解了 lua,但我不明白的最后一件事是协程。
现在摆在我面前的任务是:我的主脚本连接一个在安全环境中运行的第三方模块。攻击者不能对这个模块做任何错事,因为他没有可用的函数或变量。但他唯一能做的肮脏伎俩就是挂起:while true do end
. 因此,我必须用一个带有计时器的协程包装该函数,该计时器只是倒计时几秒钟,如果在此期间该函数尚未完成,则将其杀死并抛出错误。请帮帮我。
我想安全地加载一个返回表的不受信任的 lua 模块,以便模块除了表之外没有其他副作用 - 即 使其无法执行任何功能,也无法在全局范围内更改变量。任何想法如何实现这一点?
这是一个例子:
local t1 = {a = 1}
local t2 = {b = 2}
setmetatable(t1, {__index = t2})
assert(t1.a == 1) -- true
assert(t1.b == 2) -- true
for k, v in pairs(t1) do
print(k, v) -- печатает "a 1"
-- не хочет печатать "b 2"
end
如何在不调用 __index 的情况下迭代表?
我想让Textadept成为 Xubuntu 中的默认编辑器 - 视觉和终端。
所以我下载了它并解压到/opt
.
然后我为 c 创建了一个启动器/opt/textadept/textadept
并将其与 c 关联text/plain
,因此它thunar
使用此编辑器打开文本文件。这里没有问题。
现在我还需要将mc
他视为编辑,我不知道该怎么做。
当我运行sudo select-editor
or命令sudo update-alternatives --config editor
时(似乎它们没有什么不同),我可以在那里选择,例如nano
,mc
并将使用nano
,但我不知道如何指定我自己的。
我试图从 to 创建一个符号链接/opt/textadept/textadept-curses
,/bin/editor
现在该命令editor
没有运行nano
,但是我textadept
的,但mc
仍然通过nano
.
我也试过这个:
#!/bin/bash
E_NAME=Textadept
E_PATH=/opt/textadept/textadept-curses
sudo update-alternatives --install $E_NAME $E_PATH 1111
sudo update-alternatives --config editor
sudo select-editor
该脚本注册了我的编辑器,它出现在可用编辑器列表中,但由于某种奇怪的原因select-editor
它没有选择它,它只是忽略了我的选择!
如果我去MC面板中的某些路径然后退出它,那么下次我启动退出时没有光标的面板状态时,它会恢复,并且光标被重置的面板到主目录。
这种行为让我很生气!这是我不能习惯使用这个经理的唯一原因。谁曾想出退出时需要监控光标位置的想法?在什么情况下,对谁方便!?是否可以解决此问题,以便 MC 记住两个面板?
我的电脑整体运行良好,我对磁盘没有任何抱怨,但是今天我安装了 Steam 并且其中的游戏定期崩溃,当我启动大画面模式时,硬盘停止了,然后我决定运行诊断程序这就是它所显示的:
其实steam在Linux下工作不稳定,尤其是在老硬件上,是正常现象。我只是删除它,问题就解决了。任何其他程序都运行良好,但这些数字让我感到困惑。这里说检测到2.08亿个读取错误和8.13亿个位置错误,而磁盘被认为是健康的并且状态是OK的?
function spam()
return 1, 2, 3
end
function collectSpam(...)
print(...)
end
--- почему-то печатает 1,1,1,2,3 вместо 1,2,3,1,2,3,1,2,3
collectSpam(spam(), spam(), spam())
我正在研究 lua 中的元表,现在我有这样一个任务:有一个t
带有字段pos
和的表size
,它们分别是两个数字的数组 -[x, y]
和[width, height]
。实际上,没有t.x
/ ,但我想实现某种语法糖,以便/t.y
可以访问表。这是我的做法:t.x
t.y
local t = {
pos = {2, 4},
size = {8, 16}
}
setmetatable(t, {
__index = function(table, key)
if key == "x" then return table.pos[1]
elseif key == "y" then return table.pos[2]
elseif key == "w" then return table.size[1]
elseif key == "h" then return table.size[2]
end
end,
__newindex = function(table, key, value)
if key == "x" then table.pos[1] = value
elseif key == "y" then table.pos[2] = value
elseif key == "w" then table.size[1] = value
elseif key == "h" then table.size[2] = value
end
end
})
print(t.x) -- 2
t.x = 222
print(t.pos[1]) -- 222
...一切都很好!我对上面的代码没有任何问题,但是当我尝试使用 OOP 在我的代码中实现这个方案时,问题就开始了。如您所知,lua 中没有开箱即用的 OOP,但有一些方法可以使用元方法自己实现。为了不重复造轮子,我拿了现成的Classic库。很简单(表面上看),不到100行代码,你可以看一下源码。
实际上,我对此感到困惑:我有一个“类”(实际上是库中的一个表,其中的字段__index
就是它本身);“类”有一个扩展方法,它创建自己的副本,添加方法、元方法,并将自己分配为该副本的元表。现在我有一个这样的类的实例。我不知道如何附加上面显示的内容。如何在没有我参与的情况下将您的元方法分配(添加)到已经自动创建元方法的表。
下面是使用 OOP 的示例代码。他是个工人!我设法做我想做的事,但是 Classic 库的功能被破坏了,因为我覆盖了现有的 metamethod __index
。
local Object = require "classic"
local T = Object:extend()
function T:new()
self.pos = {2, 4}
self.size = {8, 16}
setmetatable(self, {
__index = function(table, key)
if key == "x" then return table.pos[1]
elseif key == "y" then return table.pos[2]
elseif key == "w" then return table.size[1]
elseif key == "h" then return table.size[2]
end
end,
__newindex = function(table, key, value)
if key == "x" then table.pos[1] = value
elseif key == "y" then table.pos[2] = value
elseif key == "w" then table.size[1] = value
elseif key == "h" then table.size[2] = value
end
end
})
end
local t = T()
print(t.x) -- 2
t.x = 222
print(t.pos[1]) -- 222
print(t:is(Object)) -- error! функционал Classic нарушен!
很抱歉,这个问题变得相当混乱和令人困惑。我的问题是我很困惑。
UPD:我试图self.__index()
在我的新函数中添加__index()
,希望先执行旧函数,然后执行新函数,但一切都比我想要的复杂,结果我得到堆栈溢出:)
当我在我的项目上运行 luacheck 时,它给了我数百条关于无法识别的全局变量的警告。以下是此类警告的示例:
accessing undefined variable _G
mutating non-standard global variable _G
accessing undefined variable pairs
accessing undefined variable ipairs
accessing undefined variable math
accessing undefined variable assert
accessing undefined variable print
......等等无止境。粗略来说,luacheck 根本不明白 lua 是什么,我也不输入,这是 bug 还是特性!?我应该如何调整以防止这种情况发生?
原则上,我可以通过将整个排除列表添加到 .luacheckrc 来解决这个问题,但这显然是一个 hack。
我正在编写一个脚本来为自己自动配置 Manjaro,但遇到了一个问题:
如果我需要安装软件包,我运行以下命令:
sudo pacman -Syu --需要的包列表
结果,如果已经安装了其中一个包,那么没关系,安装仍然会完成。
但我不明白如何编写类似的卸载命令,以便删除列表中的所有包,即使此列表包括已删除或尚未安装的包,这样就不会出现“这样的包是未找到”。
我希望在分配给它们的单独工作场所上启动各种后台应用程序,例如服务器。有可能这样做吗?
加载 Xubuntu 18.04 时,一条红线 (FAILED) 开始滑落。这种情况发生得如此之快,以至于我不得不为屏幕拍照,但我在日志中没有找到它。我使用系统没有问题,但我想更正错误。
它说我应该跑去systemctl status systemd-tmpfiles-setup.service
找出错误的详细信息,实际上它们是:
● systemd-tmpfiles-setup.service - Create Volatile Files and Directories
Loaded: loaded (/lib/systemd/system/systemd-tmpfiles-setup.service; static; vendor preset: enabled)
Active: failed (Result: exit-code) since Sat 2018-11-24 05:04:49 EET; 2min 24s ago
Docs: man:tmpfiles.d(5)
man:systemd-tmpfiles(8)
Process: 526 ExecStart=/bin/systemd-tmpfiles --create --remove --boot --exclude-prefix=/dev (code=exited, status=1/FAI
Main PID: 526 (code=exited, status=1/FAILURE)
Nov 24 05:04:49 MAINFRAME systemd[1]: Starting Create Volatile Files and Directories...
Nov 24 05:04:49 MAINFRAME systemd-tmpfiles[526]: Unsafe symlinks encountered in /var/lib/colord/icc, refusing.
Nov 24 05:04:49 MAINFRAME systemd-tmpfiles[526]: Unsafe symlinks encountered in /var/lib/systemd/coredump, refusing.
Nov 24 05:04:49 MAINFRAME systemd[1]: systemd-tmpfiles-setup.service: Main process exited, code=exited, status=1/FAILURE
Nov 24 05:04:49 MAINFRAME systemd[1]: systemd-tmpfiles-setup.service: Failed with result 'exit-code'.
Nov 24 05:04:49 MAINFRAME systemd[1]: Failed to start Create Volatile Files and Directories.
这些日志并没有告诉我太多。可能需要用真实路径替换符号链接?但我没有创建这些符号链接。你永远不知道它们是干什么用的。
UPD:我刚刚经历了这些路径 - /var/lib/colord/icc
,/var/lib/systemd/coredump
结果发现这些是普通的空文件夹,而不是符号链接。所以我不知道他想从我这里得到什么。
UPD:谷歌搜索了这个错误,这就是我发现的- 似乎有人设法用命令解决了同样的问题chown root.root /
,但它没有帮助我。
有时,当我运行一些厚重的应用程序(通常是游戏)时,它会耗尽所有可用的 RAM(通常是由于泄漏或端口弯曲)。同时,滞后开始,因此即使鼠标实际上也停止响应,唯一的出路是重新启动。我有一个交换,但感觉它没有一点用处。我分配了一个键盘快捷键来调用任务管理器,但是当可用内存为零时,它要么根本不打开,要么由于滞后而无法在其上使用 alt-tab。其实这不是什么大问题,这种情况也不会经常发生,但是我还是想问一下有没有人知道一种方法可以用一个命令杀死占用最多内存的进程?谢谢你。
您能告诉我自定义词典在哪里,您可以在其中添加新单词以在浏览器中进行拼写检查吗?
我使用 Xubuntu 17.10 很长时间,其中的一切都完全适合我,但是随着 18.04 的发布,我遇到了一些小麻烦。我目前有这两个系统使用相同的主分区,并且仅在 18.04 上出现问题,因此这与本地用户设置无关,而是系统本身。
首先,安装后,我立即爬上安装显卡驱动程序(nvidia)。在 17.10 最新版本是 384,我没有问题。在 18.04 版本 390 中,它似乎可以工作,但安装后ForceCompositionPipeline = On
(此选项解决了撕裂问题),系统在第一次启动时死机,为了让它挂起,你必须锁定会话并再次解锁(使用命令xflock4
)。第二个奇怪的地方来了。
锁屏没有标准分辨率(1920x1080),但有一些其他的。google了半天如何更改锁屏分辨率,只找到了关于在系统启动时更改此屏幕分辨率的文章,但事实是,该错误仅在锁定屏幕的情况下出现!
总的来说,我通过安装一个较旧的驱动程序(340)解决了冻结问题,但锁屏的分辨率仍然是一场噩梦。
我有一个包含许多不同类的表。我想直接从连接这个表的模块中使用这些类,而不是参考父母(Window
而不是app.gui.Window
)。
这是我需要的最简单的示例:
t = {
a = 1,
b = 2,
c = 3
}
function f(t)
print(t.b) -- так работает
print(b) -- как заставить работать так?
end
f(t)
UPD:当然,最简单的方法是以这种方式解决问题:b = t.b
,但是让我们同意我事先不知道表 t 中的键的名称(更准确地说,它们是我知道的,当然,但这a = t.a; b = t.b; c = t.c ... z = t.z
是某种狗屎代码)。
这是我刚刚提出的解决方案:
function f(t)
print(t.b) -- так работает
for k, v in pairs(t) do _G[k] = v end
print(b) -- и так работает!
end
...但是,正如您所看到的,它会影响全局范围,而不是本地范围,这是不允许的!我需要_G的本地类似物,某种_L。
有一个想法是创建这样一个变量并将其注册到元方法debug.getlocal
和debug.setlocal
中,虽然我并没有真正理解这些函数的语法并且我对元方法的能力也不强,但我会尝试。