谈谈 Qt 程序安装包的大小,以及简要打包指南

经常看到网上有些论调说 Qt 程序无比庞大,甚至拿 .NET 程序来比,说 Qt 程序打包以后跟 .NET 安装包差不多大。由此影响了很多人对 Qt 的选择。我觉得有必要对此做一些澄清——

显然这个说法是错误的!!

很容易理解,虽然 Qt 提供了很多组件,但并非所有的组件都会被程序使用,也并非所有的组件都需要打包到程序安装包里面。以 Qt 5.7 为例,一个可以正常使用的 helloworld.exe 程序未压缩不过 20M,使用 lzma 压缩算法,压缩率 25%,压缩完才 6M!

那盛传的 Qt 上百 M 的容量又是怎么回事呢?

这事从头说起。

类型:C++ & Qt4,创建时间:三月 2, 2017, 7:52 p.m. 点击查看完整内容。。。
Windows GDI加速的详细支持情况

自从 Vista 以后,Windows 对于 GDI 加速发生了很大的变化。简单地说,在 Vista 出现时,为了支持 Desktop Window Manager(DWM), GDI 是不加速的。为啥 DWM 不支持 GDI 加速呢。因为 DWM 是使用 DirectX 进行渲染的,它调用 DirectX 将显存里面的两个窗口内容合并渲染出来。不幸地是在 WINXP 的架构里面,GDI 是和 DirectX 分开的,两者没有一致的内存空间。所以 DWM 只好舍弃 GDI 的所有加速功能,让 GDI 程序把内容渲染到内存区域,再把这块内存复制到显存里面进行渲染。Windows 7 做了一些改进,要求驱动程序支持一个特殊的内存区域,能够让 GPU 和 CPU 都同时读取到的内存区域。GDI操作都写入到这个内存区域。这样的话,就不需要再做一次复制了,而且因为那个内存区域也是 GPU 可读的,于是 GDI 又可以支持 GPU 加速了。然而 Windows 7 并不像以前的 GDI 那样子,要求显卡驱动程序支持各种 2D 加速命令,而只要支持 BltBit, AlphaBlend 等几个命令就够了。

类型:C++ & Qt4,创建时间:一月 23, 2017, 1:20 p.m. 点击查看完整内容。。。
可以启用 firefox 的多进程模式了

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

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

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

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

类型:LinuxApp,创建时间:八月 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,创建时间:五月 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,创建时间:一月 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,创建时间:三月 2, 2015, 12:12 a.m. 点击查看完整内容。。。
为什么不要使用QThread

之前我在Python中使用线程的技巧一文中提到,尽量不要在 PyQt 里面使用QThread,但是当时没有给出示例程序。这里补上一个会引起Python崩溃的代码。其实主要原因是QThread被强制关闭的时候会引起Python崩溃。

代码请见正文。

类型:Python,C++ & Qt4,创建时间:一月 6, 2015, 5:08 p.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,创建时间:九月 9, 2014, 1:52 p.m. 点击查看完整内容。。。
使用Qt作为C++的标准库

目前大家都使用cpp的stl和boost作为cpp的标准库。不过个人觉得stl和boost用起来不是很爽。不如用Qt。

很多人觉得Qt这个库太大,而且如果不打算使用Qt的GUI也需要安装一大堆没用的dll。其实这都不是问题,我们可以在编译Qt的时候使用no-gui选项,告诉Qt我们只对它的非GUI部分感兴趣,避免编译与安装大量无用的Qt组件。最终我们可以得到一个

请点击进入正文,查看详细的操作步骤。

类型:C++ & Qt4,创建时间:七月 31, 2014, 11:17 a.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,创建时间:六月 19, 2014, 5:54 p.m. 点击查看完整内容。。。
在终端下面使用transmission下载bittorrent

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

sudo zypper install transmission #安装
transmission pathtobt.torrent #开始下载一个bt文件
transmission-remote -a pathtobt2.torrent #同时下载第二个bt文件
类型:LinuxApp,创建时间:六月 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,创建时间:六月 19, 2014, 5:47 p.m. 点击查看完整内容。。。
YY一个适合普通家庭使用的PC。

硬件方面,

  1. CPU仍然以双核CPU为主流,因为现有的软件对多核的支持实在太差了。
  2. 芯片的集成度越来越高,除了集成GPU之外,还集成了各种控制器以及协处理器,甚至有可能出现专门执行js的 芯片为网页应用加速。
  3. SSD将会成为PC的主流,但是不是拿来作为主存储器,而是集成在主板上面作为机械硬盘的缓存。这个加速将交 由硬件来完成。
  4. 从上面就可以看出来,现有的大机箱式的PC将成为少数发烧玩家的玩物。平板、只有平板才是以后家庭PC的核心 。整个PC将会是拥有8寸屏幕集成以上配置的平板。
  5. 机械硬盘可以放在平板上面,并且没有1T以下的硬盘了。
  6. 能够使用无线网络接入大的电视以及显示器上面。
  7. 当用户需要办公的时候接入无线键鼠。需要游戏的时候接入无线的游戏手柄。

软件方面,

  1. 操作系统不会是windows。
  2. 首先,它是一个平板操作系统。
  3. 不存在360之类的软件。操作系统支持沙盒。这是为什么不会是windows的原因,因为旧的win32api已经过时了。 而不支持win32api的话,windows屁都不是。
  4. 越来越多的软件存在两个版本,一个是touch版本,主要面向显示区域受限的触屏操作。另外一个版本是pc版本 ,支持键盘与鼠标、很大的显示器。
类型:随感,创建时间:四月 12, 2014, 2:39 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,创建时间:二月 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,创建时间:十二月 2, 2013, 10:43 a.m. 点击查看完整内容。。。
在OpenSUSE下关闭笔记本的触摸板

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

类型:LinuxApp,创建时间:十一月 29, 2013, 11:31 a.m. 点击查看完整内容。。。
Python与C++联合编程的简介

作为Python程序员,应该能够正视Python的优点与缺点。众所周之,Python的运行速度是很慢的,特别是大数据量的运算时,Python会慢得让人难以忍受。对于这种情况,“专业”的解决方案是用上numpy或者opencl。不过有时候为了一点小功能用上这种重型的解决方案很不划算,或者有时候想要实现的操作在numpy里面没有,需要我们自己用C语言来编写。总之,我们使用Python与C++的混合编程能够加快程序热点的运算速度。

还有些情况,Python程序员们想要使用操作系统或者外部模块提供的函数。这些模块一般是为C/C++程序员提供的。这时候也是Python与C++联合编程的用武之地。

Python语言可以说是最好的胶水语言。仅就与C++联合编程这个问题来讲,依使用难度与功能来排列,Python社区提供了以下几种解决方案:

  1. 使用标准库ctypes直接调用C/C++编写的动态链接库。
  2. 如果你使用的是Jython或者IronPython的话,它们也提供了类似于ctypes之类的模块,能够直接访问Java或者.Net语言编写的模块。
  3. 使用Cython语言,一种类似于Python语言的一种新型语言编写预定功能的代码,然后将这些代码转换成为C语言编译成为Python语言可以直接调用的二进制模块。
  4. 使用boost.python。供熟练的C++程序员操作Python的数据类型,调用Python解释器。
  5. 使用SWIG或者SIP,通过编写一个接口文件,使用类似于C/C++语法——声明函数、类型的信息,然后使用特殊的工具为C/C++的代码生成Python的接口代码。
  6. 直接使用Python的API,可以称之为最终解决方案。
类型:Python,创建时间:三月 22, 2013, 8:47 p.m. 点击查看完整内容。。。
三则vmware的使用技巧

本文介绍两则vmware的使用技巧:

  1. 设置vmware虚拟机的显存
  2. 让vmware虚拟机使用千兆网卡
  3. 禁用vmware的vmem文件
类型:随感,创建时间:三月 21, 2013, 8:49 p.m. 点击查看完整内容。。。
Coroutine在PyQt中的简单应用

在PyQt程序内操纵网络连接是一个非常常见的需求。目前,纯粹的单机程序已经非常的少见。解决这个问题,习惯于C++的Qt开发者第一个反应可能是QtNetwork,而习惯于Python的开发者第一个反应则是Python的标准库socket, urllib2或者第三方模块requests等。

本文提供了另外一种解决方案,基于coroutine的UI编程。与基于threading的同步编程方案相比,第三种方案能够免去同步的麻烦,非常适合天生线程不安全的UI编程。与signal/slot, 回调式的编程相比,第三方案的控制结构更清晰,资源管理更高效,非常适合复杂的逻辑UI操作。

本文还可作为eventlet-pyqt的编程指导。

类型:Python,创建时间:三月 12, 2013, 5:33 p.m. 点击查看完整内容。。。
Python 代码优化常见技巧(转载)

代码优化能够让程序运行更快,它是在不改变程序运行结果的情况下使得程序的运行效率更高,根据 80/20 原则,实现程序的重构、优化、扩展以及文档相关的事情通常需要消耗 80% 的工作量。优化通常包含两方面的内容:减小代码的体积,提高代码的运行效率。本文介绍:

  • 改进算法,选择合适的数据结构
  • 对循环优化
  • 充分利用 Lazy if-evaluation 的特性
  • 字符串优化
  • 其他优化技巧
  • 定位程序性能瓶颈
  • 使用PyPy或者Cython
类型:Python,创建时间:九月 17, 2012, 6:18 p.m. 点击查看完整内容。。。