Linux 下使用 Nvidia 显卡和 Virtualbox 遇到的一些坑

Like
Like Love Haha Wow Sad Angry
31

nouveau 显卡驱动,并不好。

Virtualbox 的问题

Virtualbox 安装完毕 Windows 10,却莫名其妙卡在了登陆之后应该出现桌面的地方。而且它不仅仅是客户机卡死,宿主机也一并卡死了。

我没太注意这个问题。大不了暂时不用 QQ 好了。

Nvidia 显卡

无独有偶,另一个问题的出现使整个事情出现了转机。

使用 Linux 后不久,就发现了问题。桌面环境(xfce4)经常无故完全卡死,甚至连 Ctrl+Alt+Fn 切换 tty 都没有用。偶尔出现还能忍,但是在短短的两三天就数次出现,呈现一定规律。我决定一探究竟。还好直接看日志就能发现问题——journalctl -xe里面出现了红红的nouveau sched_error ctxsw_timeout,几乎能让人确信是 nouveau显卡驱动的问题。

查了一下,貌似是一个普遍的问题:Bug 93629 – [NVE6] complete system freeze, PGRAPH engine fault on channel 2, SCHED_ERROR [ CTXSW_TIMEOUT ],而且看不到被解决的趋势。

对症下药,我赶紧卸载 nouveau,切换了 Nvidia 的官方驱动,至今运行良好:

sudo pacman -S nvidia

Virtualbox 和 Nvidia 显卡

这时我突然想起,会不会 Virtualbox 的问题,也是 nouveau显卡驱动的问题呢?我激动地打开了 Virtualbox,登陆,一切如期。看来真的是缘起这个显卡驱动。

我还没激动多久,又出现了一个问题。用 Windows 的目的之一,是测试 Angular 对 IE11/Edge 的 polyfill 管不管用。所以我打开 Edge,加载最近在写的 www.zjuqsc.com/m,却发现整个图形界面都在不停闪烁。起初我以为是 UWP 的 bug,然而换了 IE 之后依然如此,安装了 QQ 之后依然如此。我又一次失望起来——这事情就搞不好了吗?

还好,搜索 “virtualbox windows10 flickering” 直接给出了答案:SCREEN FLICKERING IN VIRTUALBOX WITH 3D ENABLED [UPDATED SEP 21, 2017]

看起来,是 Nvidia 显卡的 3D 加速驱动的问题。根据文中内容,虽然只要改动一行代码,但是由于会「破坏一位付费用户用的某些功能」,所以官方不会修改,只能用户自己动手。

好在作者和一位评论者,分别提供了 5.1.85.1.30 编译好的、要打补丁的那个文件VBoxOGLrenderspu.so,只要用它替换/usr/lib/virtualbox/里的同名文件就行了。后者经过我测试,是可以在 ArchLinux 下的 Virtualbox 5.2.* 下正常工作的。

后记

Linux 下的桌面环境,还存在种种问题。还好这些问题现在基本是可以修复的。尤其是相比 Windows 下不可忍受的效率问题,还是早日切换到 Linux 的好。

Like
Like Love Haha Wow Sad Angry
31

什么是 Haskell 中的 GADT(广义代数数据类型)?

Like
Like Love Haha Wow Sad Angry
3612

先看看没有 GADT 的时候我们在做啥。最简单的,比如定义一个列表:

List a = Nil | Cons a (List a)

它是在做啥呢?

  • 先看等号左边,它首先定义了一个叫 List 的 type constructor,它接受一个类型,并返回一个新的类型。其实就是类型的函数。
  • 再看右边,它告诉我们有两种方式获得一个类型为 List a 的值,一个叫 Nil,一个叫 Cons a (List a)。
    • Nil 的话,你直接写 Nil,它就是一个 List a 类型的值,至于这个 a 具体是啥,需要结合上下文推导才知道。
    • 而 Cons a (List a) 呢,它是接受两个参数,一个类型是 a,一个类型是 List a,然后返回一个 List a 类型的值。至于这个 a 是啥,我们同样是需要推导才能知道的,不过是这里的推导比较显著罢了,因为直接就是第一个参数的类型。

那么我们可以用函数形式给这俩表示出来: Continue reading “什么是 Haskell 中的 GADT(广义代数数据类型)?”

Like
Like Love Haha Wow Sad Angry
3612

例说 C 语言类型声明

Like
Like Love Haha Wow Sad Angry
621
C 语言的类型声明,由于某些历史局限性,在某些情况下显得相当复杂。下面让我们来渐渐深入 C 语言类型声明的谜团,一探究竟。

 

指针和数组

一重声明

以下这些问题,我相信即使是最基本的初学者也不会有太大困难:

你会声明数组吗?

int a[5]; // 包含 5 个元素。

你会声明指针吗?

int *a;

二重声明

你会声明双重指针吗?

Continue reading “例说 C 语言类型声明”

Like
Like Love Haha Wow Sad Angry
621