DOS 内存粗解

今天搞明白了,为啥 dos 有个 A20 地址线,以及 DOS 所谓高位内存的技术了。原因出在那个段地址的计算上面,经常看到的段的计算方式,实际上不止可以访问到 1M 的内存,而是 1M 再多一些:

0xffff * 16 + 0xffff

可以访问到比 1M 高一点的 64k 内存。实际上不是 64k,而是 64k-16 字节。因为 ffff:0010 就是 1M

比较早的 DOS 程序,会利用 8086 的 bug,访问这段内存实际上是访问 0000:0000 这一段内存。后来 80286 出现,这个 bug 就失效了。

由此引申出 DOS 内存的几个概念。

类型:LinuxApp,创建时间:Oct. 18, 2022, 11:32 p.m. 点击查看完整内容。。。
在 openSUSE 底下跨平台编译 mingw64 程序

在 openSUSE Leap 15.3 底下跨平台编译 mingw64 程序,只要安装跨平台编译的安装包就行了:

sudo zypper in mingw64-cross-gcc-c++

接下来我们就来操作一下:

// main.c
#include <stdio.h>
void main() { printf("hello, world!\n"); }

然后运行:

$ x86_64-w64-mingw32-gcc -o test003.exe main.c
$ wine ./test003.exe

可以看到打印出结果。

类型:LinuxApp,C++ & Qt4,创建时间:March 8, 2022, 9:01 p.m. 点击查看完整内容。。。
bcache 的使用

下午花了一些时间测试 bcache 与 lvm cache 的使用。lvm cache 相对来说功能比较丰富,能够跟 raid1 一起组 lv,而 bcache 就只能简单地处理 cache。从安全性与性能的角度来看,我倒觉得 bcache 更为专业一些。接下来说一下 bcache 的基本使用:

首先要安装 bcache-tools

# zypper install bcache-tools

由两个设备创建 bcache 是很简单的事,假设 sda 是 ssd,而 sdb 是 hdd,

# make-bcache -w 4k -b 2m -C /dev/sda -B /dev/sdb

其中的-w参数指定底层设备的簇大小,而-b参数指定 bcache 管理的块大小。-C指定 cache 设备,-B指定 backend 设备。如果有多个 backend 设备可以写多个。

类型:LinuxApp,创建时间:Nov. 17, 2017, 2:50 p.m. 点击查看完整内容。。。
Linux 下超频 Ryzen 1700

下载与简单使用 ZenStates-Linux:

$ git clone https://github.com/r4m0n/ZenStates-Linux.git
$ cd ZenStates-Linux
$ sudo ./zenstates.py -l

上面这条命令会输出当前的 pstate 列表。正常可以看到 ryzen 1700 的 p0 是 3.0GHz

$ sudo ./zenstates.py -p 0 -f 94

上面这个命令设置 p0 state 的频率是 3.7GHz

类型:LinuxApp,创建时间:Nov. 14, 2017, 11:43 a.m. 点击查看完整内容。。。
可以启用 firefox 的多进程模式了

今天我的 opensuse 自动更新了 firefox 48。最重要的变化就是现在有了与 chrome 类似的多进程模式。但是看起来很奇怪,只有两个进程?一个 firefox ui 进程,我为 firefox,一个remote tab 进程,名为 web,居然不是每个 tab 一个进程。。

不管怎么样,总归是件好事,现在 ui 进程不至于卡到暴了。启用的方式是,当然是打开about:config

browser.tabs.remote.autostart改为trueextensions.e10sBlockedByAddons改为false

前者启用多进程,后者当你安装了第三方应用的时候也强制启动多进程。

类型:LinuxApp,创建时间:Aug. 6, 2016, 2:18 p.m. 点击查看完整内容。。。
systemd 的时间控制命令

以前使用 date/hwclock 来调整时间,以及自己弄个 /etc/localtime 的软链接到真正的时区文件里面。现在不用折腾这个了。 systemd 提供了一条命令叫做 timedatectl 处理这些事情。。它接收几条子命令:

  • timedatectl status

    打印出当前的状态。

  • timedatectl set-time [TIME]

    修改当前时间

  • timedatectl set-timezone [TIMEZONE]

    修改当前时区

  • timedatectl list-timezones

    列出所有时区的名字。

  • timedatectl set-local-rtc [BOOL]

    设置硬件时钟是否使用本地时间。一般设置为 0 表示不使用本地时钟。

  • timedatectl set-ntp [BOOL]

    设置是否开启 ntp 同步。使用前需要先安装 ntp

这些命令在 openSUSE 和 CentOS7 下面都测试过可行。

类型:LinuxApp,创建时间:May 3, 2016, 5:50 p.m. 点击查看完整内容。。。
监视redis服务器的数据变化

在某些情况下,我们往redis服务器里面存储了大量的数据。这么大量的数据,我们怎么样看到数据发生了哪些变化呢?新版本的redis提供了事件监听,可以把数据内所有的事件变化都打印出来。它的使用方法很简单。

  1. 首先打开发送数据事件。这个特性会额外消耗CPU,所以一般不要用。推荐使用命令行打开这个功能:

    $ redis-cli
    redis> config set notify-keyspace-events KA
    

    关于参数KA的作用,请见正文。

  2. 开始监听事件。redis-cli会把接下来的所有变化都打印出来。

    redis> psubscribe '__key*__:*'
    
  3. 想要结束了,按Ctrl+C就行。不过似乎也会把redis-cli也直接关掉。最好是重新运行一下redis-cli,然后禁用这个特性:

    redis > config set notify-keyspace-events ""
    
类型:LinuxApp,创建时间:Jan. 26, 2016, 5:38 p.m. 点击查看完整内容。。。
vmware/firefox 在 opensuse 13.2 里面会卡住的问题

最近经常发现 vmware/firefox 在切换页面的时候会卡住一会,导致整个系统没有响应。忘了怎么回事看到这个东西:http://neilstechdocs.blogspot.com/2013/09/fun-with-opensuse-vmware-and-firefox.html,只要禁用 transparent_hugepage 就可以解决问题了。办法是:

echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
echo never > /sys/kernel/mm/transparent_hugepage/defrag

不过我不知道要怎么样把这两条语句优雅地写入到系统启动脚本里面。所以我干脆在内核里面禁用了 transparent_hugepage,开启 yast 的引导加载器配置,在内核参数里面写上:

transparent_hugepage=never

重启搞定。

类型:LinuxApp,创建时间:March 2, 2015, 12:12 a.m. 点击查看完整内容。。。
安装Trac

Trac是开源世界一个很流行的BUG管理系统。类似的系统还有BugZilla这样的东西。各自详细的特性我还没有做比较。有空再研究一下。

要搭建Trac的话,首先要安装Python。然后下载Trac的安装包,解压之后:

setup.py install

它会自动地下载genshi,所以,虽然INSTALL文件说明了要依赖于genshi这个包,实际上并不需要安装。

安装之后,首先类似于SVN或者MoinMoin那样,创建一个工程项。命令是:

C:\Python26\Scripts\trac-admin.exe testproj initenv

其中testproj是工程名字。

接下来还要创建用户名与密码。因为Trac使用Apache的htpasswd文件,所以必须使用Apache的工具来生成用户名与密码。或者用在线生成器Online password generation and encryption for .htpasswd files生成用户名和密码。密码必须使用SHA1(或者MD5?没有仔细看文档)。把生成的数据填入users.txt里面,每项一行。比如:

goldfish:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=
panda:{SHA}fEqNCco3Yq9h5ZUglD3CZJT4lBs=

接下来还要给其中一个用户分配管理员权限,命令如下:

trac-admin testproj permission add goldfish TRAC_ADMIN

最后就是启动Web服务器了。Trac可以和各种服务器配合使用,支持mod_wsgi或者fastcgi。不过我这里用最简单的内置的tracd来启动。

tracd --port 8000 --basic-auth "*,users.txt,anything" testproj
类型:LinuxApp,创建时间:Sept. 9, 2014, 1:52 p.m. 点击查看完整内容。。。
在OpenSUSE和Ubuntu里面怎么配置一个smb服务器

微软的smb服务与nfs一样,真是一个很好的发明。它们都能够方便地让客户端直接访问文件内容,而不需要把文件内容传回客户端。

因为做服务器的时候我默认使用linux,所以接下来我打算安装一个Samba服务,实现简单的文件共享,要求必须输入密码才能连接到这个服务器。不提供默认用户的使用。其它的如WINS、NETBIOS服务这些东西都不需要,因为我们只需要一个类似于NFS这样的文件系统。

首先当然是安装samba服务。

zypper install samba

接下来修改一个samba服务器的配置文件,把目录共享出来。按照samba书上面的做法,可以有两种方案来提供服务,一是明确定义要共享的目录,并配置好它的路径、权限等信息。另一种做法是配置homes目录,把所有用户的目录都共享出来。我选择了后者。无他,刚好需要而已。

openSUSE果然是个尽职的女仆,安装完samba以后这件事情基本就搞定了。只要我们把goldfish这个系统已有的帐号加入到它的帐号数据库里面。

useradd -m goldfish #添加一个UNIX用户,如果有不用加了。
smbpasswd -a goldfish #添加相同名称的samba用户
systemctl restart smb #重启samba服务

至此,我们可以访问这个共享了。

smbclient --user goldfish //hostname/homes/

Ubuntu的配置稍微麻烦一些,请看正文。

类型:LinuxApp,创建时间:June 19, 2014, 5:54 p.m. 点击查看完整内容。。。
在终端下面使用transmission下载bittorrent

本文简单介绍了如何安装、使用与配置bt下载软件。简而言之,

sudo zypper install transmission #安装
transmission pathtobt.torrent #开始下载一个bt文件
transmission-remote -a pathtobt2.torrent #同时下载第二个bt文件
类型:LinuxApp,创建时间:June 19, 2014, 5:52 p.m. 点击查看完整内容。。。
在OpenSUSE上面安装nginx+php+mysql

今天在我的opensuse 13.1虚拟机上面安装nginx+php+mysql整了好久。碰到几个问题,纪录一下。

首先是安装必要的软件。

zypper install nginx php5 php5-fpm php5-mysql mysql-community-server

安装完还跑不起来。需要进行一系列的配置。

首先需要配置一下nginx,在/etc/nginx/nginx.conf里面写个配置:

location ~ \.php$ {
    root           /srv/www/htdocs/;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include        fastcgi_params;
}

这个配置最重要的部分是fastcgi_param SCRIPT_FILENAME,因为这个参数决定了真正执行的php文件的路径。如果直接使用nginx的默认配置会有问题。

那接下来就是配置php的fastcgi服务了。默认配置一样有问题,跑不起来,缺少配置文件。先复制一个配置文件过来:

cd /etc/php5/fpm
cp php-fpm.conf.default php-fpm.conf

然后修改/etc/php5/fpm/php-fpm.conf这个配置文件,把里面一行:

error_log = log/php-fpm.log

修改成为

error_log = /var/log/php-fpm.log

不然php-fpm服务就跑不起来了,会报日志文件错误。因为默认配置里面的/usr/var/log/这个目录是不存在的。

这两个东西配置好之后启动三个服务

systemctl enable mysql nginx php-fpm systemctl start mysql nginx php-fpm

类型:LinuxApp,创建时间:June 19, 2014, 5:47 p.m. 点击查看完整内容。。。
怎么使用dd命令以及windows光盘映像创建一个可启动的U盘

windows的安装光盘映像本身是一个可以启动的光盘映像,理论上只要使用直接写入到u盘就可以启动了,就好像linux的live cd一样。不过windows不行,后来了解了一下,说是主板必须把这个U盘识别为USB-CDROM才行。大概是因为BIOS需要的引导纪录在windows光盘映像里面不存在。所以我们这里需要为u盘安装一个引导纪录。几个步骤,首先为U盘分区。然后创建启动纪录,再把ISO映像里面的文件复制到U盘。

# fdisk /dev/sdb
# mkfs.ntfs -f /dev/sdb1
# ms-sys /dev/sdb
# mount -o loop windows7.iso /mnt/iso
# mount /dev/sdb1 /mnt/usb
# cp -r /mnt/iso/* /mnt/usb/
类型:LinuxApp,创建时间:Feb. 25, 2014, 3:41 p.m. 点击查看完整内容。。。
在OpenSUSE 13.1 64位系统里面解压安装WPS

其实也没啥。如果不肯折腾的话,直接安装WPS提供的RPM包就行了。

使用压缩包的话,如果安装的是32位系统的话,直接下载回来就可以用。不过现在大家的电脑都不错,至少4G内存杠杠的,很多人会选择安装64位系统。这个时候需要安装一些依赖库。。

依赖库的名称我记在这里。

sudo zypper install libX11-6-32bit libgthread-2_0-0-32bit libpng12-0-32bit libfreetype6-32bit libgobject-2_0-0-32bit libSM6-32bit libXrender1-32bit fontconfig-32bit libXext6-32bit

貌似还缺一个libGLU,但是我发现如果安装这个东西会连wayland一起装,反正也不影响启动,只是缺少一个导出PDF的功能。所以就没有加到上面去了。之前发现WPS的RPM包依赖于wayland,比较奇怪才开始折腾这个。

装完WPS的依赖之后就下载压缩包,回来解压缩,运行里面的WPS搞定。

类型:LinuxApp,创建时间:Dec. 2, 2013, 10:43 a.m. 点击查看完整内容。。。
在OpenSUSE下关闭笔记本的触摸板

很简单,在命令行下输入如下命令synclient TouchpadOff=1即可。

类型:LinuxApp,创建时间:Nov. 29, 2013, 11:31 a.m. 点击查看完整内容。。。
介绍一下KDE/Qt程序的QtCurve皮肤

推荐KDE的程序皮肤(样式)QtCurve。它可以同时支持KDE3、KDE4和GNOME环境的皮肤,方便我们统一整个Linux桌面的外观。还支持非常多的细节调整,让我们每个人都可以有自己独特的外观。

因为它支持在Windows下编译,我在Besteam里面也应用了QtCurve。非常好用!

类型:LinuxApp,C++ & Qt4,创建时间:May 7, 2012, 7:48 p.m. 点击查看完整内容。。。
使用非对称密钥登录SSH服务器

通常登录SSH服务器都使用用户名与密码。每次都输入用户名和密码比较麻烦,特别是有很多台机器的时候。Windows下的putty支持大多数的SSH认证方式,其中就包含了非对称密钥登录。步骤其实很简单,

  1. 使用puttygen.exe生成非对称密钥,将私钥保存起来,将公钥传输到远程主机上,假定保存到~/id_rsa.pub。然后用下面这台命令放到认证文件里:

    cat ~/id_rsa.pub >> ~/ssh/authorized_keys
    
  2. 运行putty.exe,首先载入Session

  3. 在putty配置对话框的Connection->Data页的Auto-login username里填上登录所使用用户名,比如root

  4. 在配置对话框的Connection->SSH->Atuh页的Private key file for authentication内添入私钥所在的路径。

  5. 保存Session。下次登录的时候就不需要输入用户名和密码了

类型:LinuxApp,创建时间:Jan. 1, 2012, 6:59 p.m. 点击查看完整内容。。。
debian6.0修改Grub2支持高分辨率console

以前配置grub1的方法是修改/etc/grub.conf,而grub2则是修改/etc/grub.d/里面的脚本。里面的脚本过于深奥,我稍微查看了一下,改分辨率的方法是修改/etc/default/grub的内容:

在GRUB_CMDLINE_LINUX里面增加内核参数:

GRUB_CMDLINE_LINUX="vga=792"

注意要注释掉:

# GRUB_TERMINAL=console

默认这一行是注释掉的,不然vga就没用了。

做完调用grub-mkconfig -o /boot/grub/grub.cfg刷新一下配置。

类型:LinuxApp,创建时间:Jan. 1, 2012, 6:53 p.m. 点击查看完整内容。。。
异端,去死吧(转载)

一个人走过海旁,看见另一个人想跳海自杀。

他走上前去劝说「先生,不要跳下去!」

那人问道:「为甚么?」

他说:「生命是美好的嘛!你是无神论者还是有宗教信仰?」

那人答:「我有宗教信仰。」

「佛教、道教、回教还是基督教?」

「基督教」

「罗马天主教还是新教?」

「新教」

「我也是新教呢!圣公会还是浸信会?」

「浸信会」

「太好啦!我也是浸信会,你是Baptist Church of God还是Baptist Church of the

Lord? 」

「Baptist Church of God. 」

「真是太奇妙啦!我也是,那你是原教旨的Baptist Church of God还是改革派的?」

「改革派的」

「1879年的改革派还是1915年的?」

「1915年的改革派。」

那人朝他屁股一脚把他踢进海里:「异端!去死吧!」

类型:LinuxApp,随感,创建时间:Jan. 1, 2012, 4:36 p.m. 点击查看完整内容。。。
小技巧:让Win键在KDE中更有用(转载)

http://blog.gmsh.pp.ru/2009/08/tips-make-win-key-useful-in-kde/

从 Windows迁移到 Linux 上的用户,可能保持着按 WindowsKey(Windows键,标准键盘最下一行的那个视窗键)打开Windows开始菜单的习惯。但是在 某些 Linux 发行版上(比如笔者的openSUSE 11.1,KDE 4.3环境)上 WindowsKey 并没有绑定到 KickOff 菜单上。可以尝试在 KDE 控制中心 (KDE control panel)里面修改,而 KDE 的快捷键只允许非修饰键(Modifier Key)和 组合键,WindowsKey 恰恰是修饰键,直接绑定 WindowsKey 是不可行的。下面,笔者介绍一个技巧,使 WindowsKey 绑定到 KDE 4.3 的 KickOff 菜单上。这里用了更改键盘映射的方法。

详细过程请点击查看正文。

类型:LinuxApp,创建时间:Jan. 1, 2012, 8:45 p.m. 点击查看完整内容。。。