在线系统经常需要存储用户名和密码等认证信息,以便在用户登录的时候认证密码。但存储密码的时候其实有很多学问。在原始的互联网时期,使用明文存储密码。在经历了多次严重的泄露事件以后,没过几年即使是最蠢的程序员都知道得在存储前使用 MD5 哈希一下。
现在我们已经知道使用 MD5 存储也不靠谱了。拿着 MD5 哈希后后的一串代码放到搜索引擎里面搜一下(彩虹表攻击),密码就出来了。对抗这种攻击的办法是给密码加盐,就是每次哈希前都带上一段随机字符串,并且和密码一起存储起来,这大大提高了破解的难度,即使你使用的是 123456 这么简单的密码,也不容易一眼就看出来了。
类型:Python,C++ & Qt4,创建时间:Aug. 9, 2018, 11:11 p.m. 点击查看完整内容。。。跟我打交道过的人都知道我一直在唱衰桌面端 Qt,但是又一直在推荐大家使用 Qt 作为服务端开发的标准库。服务端开发除了完成功能之外,还需要考虑到服务端运维。一般希望布署的程序越简单越好,只好不依赖于特定的系统,一个文件复制到服务端就搞定。这时候静态编译就用上了。
简而言之,静态编译 Qt 不过是使用特殊的参数配置 Qt 而已:
./configure -release -opensource -static -no-gui -no-icu -no-glib -no-iconv -nomake examples
更详细的步骤请看原文吧。
类型:C++ & Qt4,创建时间:March 8, 2018, 11:07 a.m. 点击查看完整内容。。。下午花了一些时间测试 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 设备可以写多个。
下载与简单使用 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. 点击查看完整内容。。。PyQt 现在还不支持从pip
下载安装,习惯virtualenv
开发的时候会比较麻烦,总不能为了一个 PyQt 就放弃了virtualenv
吧。
有多种方案可以实现这个目标。我这里从源代码开始安装 PyQt,好像是不同的项目可以使用不同的版本。编译的时候我只编译了QtCore
, QtGui
, QtWidgets
三个模块。
具体的步骤与命令看正文吧。
类型:Python,C++ & Qt4,创建时间:May 5, 2017, 10:23 a.m. 点击查看完整内容。。。经常看到网上有些论调说 Qt 程序无比庞大,甚至拿 .NET 程序来比,说 Qt 程序打包以后跟 .NET 安装包差不多大。由此影响了很多人对 Qt 的选择。我觉得有必要对此做一些澄清——
显然这个说法是错误的!!
很容易理解,虽然 Qt 提供了很多组件,但并非所有的组件都会被程序使用,也并非所有的组件都需要打包到程序安装包里面。以 Qt 5.7 为例,一个可以正常使用的 helloworld.exe 程序未压缩不过 20M,使用 lzma 压缩算法,压缩率 25%,压缩完才 6M!
那盛传的 Qt 上百 M 的容量又是怎么回事呢?
这事从头说起。
类型:C++ & Qt4,创建时间:March 2, 2017, 7:52 p.m. 点击查看完整内容。。。自从 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,创建时间:Jan. 23, 2017, 1:20 p.m. 点击查看完整内容。。。今天我的 opensuse 自动更新了 firefox 48。最重要的变化就是现在有了与 chrome 类似的多进程模式。但是看起来很奇怪,只有两个进程?一个 firefox ui 进程,我为 firefox,一个remote tab 进程,名为 web,居然不是每个 tab 一个进程。。
不管怎么样,总归是件好事,现在 ui 进程不至于卡到暴了。启用的方式是,当然是打开about:config
把browser.tabs.remote.autostart
改为true
把extensions.e10sBlockedByAddons
改为false
前者启用多进程,后者当你安装了第三方应用的时候也强制启动多进程。
类型:LinuxApp,创建时间:Aug. 6, 2016, 2:18 p.m. 点击查看完整内容。。。以前使用 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提供了事件监听,可以把数据内所有的事件变化都打印出来。它的使用方法很简单。
首先打开发送数据事件。这个特性会额外消耗CPU,所以一般不要用。推荐使用命令行打开这个功能:
$ redis-cli
redis> config set notify-keyspace-events KA
关于参数KA
的作用,请见正文。
开始监听事件。redis-cli
会把接下来的所有变化都打印出来。
redis> psubscribe '__key*__:*'
想要结束了,按Ctrl+C
就行。不过似乎也会把redis-cli
也直接关掉。最好是重新运行一下redis-cli
,然后禁用这个特性:
redis > config set notify-keyspace-events ""
最近经常发现 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. 点击查看完整内容。。。之前我在Python中使用线程的技巧一文中提到,尽量不要在 PyQt 里面使用QThread
,但是当时没有给出示例程序。这里补上一个会引起Python崩溃的代码。其实主要原因是QThread
被强制关闭的时候会引起Python崩溃。
代码请见正文。
类型:Python,C++ & Qt4,创建时间:Jan. 6, 2015, 5:08 p.m. 点击查看完整内容。。。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
目前大家都使用cpp的stl和boost作为cpp的标准库。不过个人觉得stl和boost用起来不是很爽。不如用Qt。
很多人觉得Qt这个库太大,而且如果不打算使用Qt的GUI也需要安装一大堆没用的dll。其实这都不是问题,我们可以在编译Qt的时候使用no-gui
选项,告诉Qt我们只对它的非GUI部分感兴趣,避免编译与安装大量无用的Qt组件。最终我们可以得到一个
请点击进入正文,查看详细的操作步骤。
类型:C++ & Qt4,创建时间:July 31, 2014, 11:17 a.m. 点击查看完整内容。。。微软的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. 点击查看完整内容。。。本文简单介绍了如何安装、使用与配置bt下载软件。简而言之,
sudo zypper install transmission #安装 transmission pathtobt.torrent #开始下载一个bt文件 transmission-remote -a pathtobt2.torrent #同时下载第二个bt文件
今天在我的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. 点击查看完整内容。。。硬件方面,
软件方面,
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/
其实也没啥。如果不肯折腾的话,直接安装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. 点击查看完整内容。。。