小编nat*_*iix的帖子

在 GitHub Actions 工作流程中缓存 APT 包

我将以下 Github Actions 工作流程用于我的 C 项目。工作流在大约 40 秒内完成,但其中超过一半的时间用于安装valgrind包及其依赖项。

我相信缓存可以帮助我加快工作流程。我不介意多等几秒钟,但这似乎是对 GitHub 资源的毫无意义的浪费。

name: C Workflow

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1

    - name: make
      run: make

    - name: valgrind
      run: |
        sudo apt-get install -y valgrind
        valgrind -v --leak-check=full --show-leak-kinds=all ./bin
Run Code Online (Sandbox Code Playgroud)

运行sudo apt-get install -y valgrind会安装以下软件包:

  • gdb
  • gdbserver
  • libbabeltrace1
  • libc6-dbg
  • libipt1
  • valgrind

我知道 Actions 支持缓存特定目录(并且已经有几个已回答的 SO 问题和关于此的文章),但我不确定 apt 安装的所有不同软件包最终在哪里。我假设/bin//usr/bin/不是唯一受安装软件包影响的目录。

是否有一种优雅的方法来缓存已安装的系统包以供将来运行工作流?

apt github-actions

21
推荐指数
4
解决办法
6616
查看次数

具有相同自定义模板/样式但不同绑定/上下文的多个 DataGrid 列

我想创建一个自定义DataGrid列(或DataGridCell样式),最好是在 XAML 中,并多次使用它,而不需要任何代码重复。它应该包含多个不同的控件,每个控件访问数据对象的不同属性。

似乎有两种方法可以做到这一点:

  • DataGridTemplateColumn使用自定义CellTemplate(请参阅此处的示例
  • 自定义DataGridCell样式(类似这样这样

这两种解决方案都遇到相同的问题。DataGrid当指定内部控件的绑定时,它们似乎总是与整行而不是单元格相关。

DataGridTemplateColumn没有Binding属性,因此它CellTemplate绑定到整行,从而无法为多个列重用相同的模板,每个列访问行对象的不同属性。

同样,我可以以覆盖via的DataGridTextColumn样式访问的内容(请参阅此处),但我找不到访问内容属性的方法,因此我认为这是不可能的。Template{TemplateBinding Content}

这是一个虚拟示例DataGrid来说明我的情况:

public class Name
{
    public string First { get; set; }
    public string Last { get; set; }

    public override string ToString() => $"{First} {Last}";
}

public class Team
{
    public Name First { get; set; }
    public Name …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml datagrid

5
推荐指数
0
解决办法
1017
查看次数

x86 保护模式下的键盘中断导致处理器错误

我正在开发一个简单的内核,并且一直在尝试实现一个键盘中断处理程序来摆脱端口轮询。我一直在-kernel模式下使用 QEMU (为了减少编译时间,因为使用生成 isogrub-mkrescue需要相当长的时间)并且它工作得很好,但是当我想切换到-cdrom模式时它突然开始崩溃。我不知道为什么。

最终我意识到,当它从 ISO 引导时,它还会在引导内核本身之前运行 GRUB 引导加载程序。我发现 GRUB 可能会将处理器切换到保护模式,这会导致问题

问题:通常我会简单地初始化中断处理程序,每当我按下一个键时,它就会被处理。但是,当我使用 iso 运行内核并按下一个键时,虚拟机就崩溃了。这发生在 qemu 和 VMWare 中,所以我认为我的中断一定有问题。

请记住,只要我不使用 GRUB,代码就可以正常工作。 interrupts_init()(见下文)是main()内核函数中调用的第一件事。

本质上的问题是:有没有办法让它在保护模式下工作?.

我的内核的完整副本可以在我的GitHub 存储库中找到。一些相关文件:

lowlevel.asm

section .text

global keyboard_handler_int
global load_idt

extern keyboard_handler

keyboard_handler_int:
    pushad
    cld
    call keyboard_handler
    popad
    iretd

load_idt:
    mov edx, [esp + 4]
    lidt [edx]
    sti
    ret
Run Code Online (Sandbox Code Playgroud)

interrupts.c

#include <assembly.h> // defines inb() and outb()

#define IDT_SIZE 256
#define …
Run Code Online (Sandbox Code Playgroud)

c x86 interrupt osdev multiboot

4
推荐指数
1
解决办法
982
查看次数

Go 中使用动态类型(空接口)的 XML Unmarshal

我需要解析具有动态元素的 XML 消息,因此我使用了 type 元素interface{}在 Message 结构中表示它。

一旦我知道了这个动态元素的类型(在运行时),我就会初始化一个消息结构,然后尝试解组 XML 消息。然而,动态元素的内容并未被解组。

这是一个 Go Playground,其中包含我想要实现的目标,以及评论和实际输出与预期输出:https://play.golang.org/p/eKVetUPmVI2

我尝试了几种变体,但无法使解组按预期工作。谁能帮助我理解为什么会出现这种行为以及如何使其发挥作用?提前致谢。

代码(以防有一天 Go Playground 链接中断):

package main

import "fmt"
import "encoding/xml"

// XML root
type Message struct {
    XMLName   xml.Name  `xml:"message"`
    Operation Operation `xml:"operation"`
}

// An Operation can contain either a Create or an Update element
type Operation struct {
    Create *Create `xml:"create"`
    Update *Update `xml:"update"`
}

// Doesn't matter...
type Create struct{}

// Update contains a Color element or Any other element …
Run Code Online (Sandbox Code Playgroud)

go

2
推荐指数
1
解决办法
2420
查看次数

标签 统计

apt ×1

c ×1

c# ×1

datagrid ×1

github-actions ×1

go ×1

interrupt ×1

multiboot ×1

osdev ×1

wpf ×1

x86 ×1

xaml ×1