Arch Linux, 折腾2012年1月17日zhtlancer
最近在PCManFM中用SMplayer打开媒体文件时,经常遇到不能正常播放的现象,开始以为mplayer和smplayer的配合问题,后来在一个存在问题的文件上查了下mplayer的log,发现mplayer没有找到打开的媒体文件,而且文件名被转换为URI形式,中文被转换成%格式化的形式。查了一些资料后,发现Arch Wiki上有提到一个Mplayer打开文件名带空格的问题的解决方案,就用类似方法对SMplayer做了下修改,将/usr/share/applications/smplayer.desktop(注:最好先检查一下~/.local/share/applications/中有没有对应文件,如果有的话应该是改这个文件)中的”Exec=smplayer %U”改为”Exec=smplayer %F”,问题解决。
Reference
https://wiki.archlinux.org/index.php/Mplayer#Mplayer_fails_to_open_files_with_spaces
Arch Linux, Linux, 折腾2012年1月10日zhtlancer
这个问题从开始用Awesome以来一直困扰着我,wibox上的所有中文都诡异得奇丑无比,但都一直没时间收拾这个。今天终于痛下决心折腾了一下,事实证明还是自己太二了……
首先,如果在Awesome配置中设定具体的字体名称的话,应该是无法设置多个字体的,也就没法设置独立的西文+中文或其它CJK字体作为fallback(欢迎大家关于这点提出异议,那本文后面的话就可以直接忽略之了…)。这样如果指定了一个英文字体名称的话,也不知道Awesome用了什么样的fallback策略,wibox上显示的中文貌似居然都不是同一种字体的……
其实要在Awesome中独立设置西文和中文字体很简单,只要回归本质即可——利用fontconfig的配置机制。在~/.fonts.conf(针对自己的用户)或/etc/fonts/local.conf(针对系统全局,不推荐)文件中,对sans、serif、monospace等字体族的字体进行设置,以字体先后顺序的形式调整好优先级。需要注意一般将要设置的英文字体放在中文字体前面才能生效。然后在Awesome配置中,将字体改为要用的字体族的名字即可,比如”serif 8″,这样wibox中的字体就是按照serif字体族中的优先级渲染了。
另外,对于fontconfig配置,推荐一个不错的自动配置生成网站:http://wenq.org/cloud/fcdesigner.html,可以很直观地对几个常用字体优先级调整效果进行预览,然后生成样例fontconfig内容,可以直接粘来使用,非常方便。这个工具是文泉驿项目提供的,再次感谢文泉驿为我们提供了这么好的开源字体和工具!
Reference
https://wiki.archlinux.org/index.php/Fonts_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)
http://wenq.org/cloud/fcdesigner.html
BTalk, 黑莓(BlackBerry)2011年10月20日zhtlancer
最近有不少用户反映BTalk无法刷出GTalk的好友列表,并且有热心网友sh li查到了原因和解决方法,在此对这位网友表示感谢
这次出现的问题主要是由于Google对GTalk的好友查询方式进行了一些小小的变更,导致BTalk无法正常取得好友信息数据。具体的问题描述可以参考这里(provided by [sh li])。
此版本相比170版本应该是仅仅进行了上述问题的修复。不过一方面由于今天晚上测试时发现GTalk又换回了以前的协议,所以没有办法正式进行测试,另外一方面很长时间没有维护BTalk代码了,而且中间断断续续改动过一些东西,不能确定此版本是否完全可靠,所以发布为测试版。
该测试版不会覆盖以前版本,可与0.5.170版共存,名称暂时改为”BTalk_beta”,以方便大家进行测试。以下是OTA下载地址以及打包下载地址。
BTalk_beta 0.5.186: OTA ; ZIP
最近在用QEMU做关于x86平台最小化相关的项目,需要用到QEMU的”无PCI总线模式”,即”ISA总线模式”,相关的执行命令为
qemu -M isapc …
但是用上述命令启动qemu后,立即报Segmentation fault,即段错误,然后终止。调查一番后,发现原来是QEMU 0.13.0的一个bug,是由于ISA模式下,i440fx_state指针未初始化导致的。
解决方法很简单,可以自己编辑hw/pc_piix.c文件,在大概105行的位置,”pci_bus = NULL;”和”isa_bus_new(NULL);”两句之间加入”i440fx_state = NULL;”,然后重新编译即可。另外提供patch如下
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 812ddfd..34c65d5 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -103,6 +103,7 @@ static void pc_init1(ram_addr_t ram_size,
pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq, ram_size);
} else {
pci_bus = NULL;
+ i440fx_state = NULL;
isa_bus_new(NULL);
}
isa_bus_irqs(isa_irq);
参考文献
http://www.mail-archive.com/qemu-devel@nongnu.org/msg39372.html
Linux, 折腾2010年9月24日zhtlancer
Ubuntu 10.04的官方源中没有Dell Mini 10的GMA500显卡的驱动,导致系统没法识别出其最佳显示分辨率。这样我们需要手动为它安装合适的驱动。
先在网上调查一番,发现GMA500有独立的开源驱动——poulsbo,并且在ppa上已经有提供针对ubuntu 10.04的poulsbo相关包,那就好说啦~
首先修改软件源,在/etc/apt/sources.list中添加以下两个源:
deb http://ppa.launchpad.net/gma500/ppa/ubuntu lucid main
deb-src http://ppa.launchpad.net/gma500/ppa/ubuntu lucid main
然后添加新源的GPG公钥,在终端执行以下命令:
sudo apt-key adv –recv-keys –keyserver keyserver.ubuntu.com 34BA7AE9
完成后依次执行以下命令安装poulsbo驱动即可:
sudo apt-get update
sudo apt-get install xserver-xorg-video-psb psb-firmware
sudo apt-get install poulsbo-config (此步会提示要卸载compiz,可能poulsbo还不能支持compiz,没啥需要就卸了compiz吧)
sudo apt-get install poulsbo-driver-3d
如果以上步骤都没有报错的话,poulsbo驱动应该已经安装好了,重启一下,就可以享受正常的宽屏分辨率了~
昨天帮同学折腾他的Dell Mini 10小本,装完Linux看Dell官网有这个本的新BIOS,我手欠就下下来准备顺便给更新一下。没想到Dell的Mini系列网本的BIOS更新机制设计如此之NC,同学的本光荣地变砖了……(关于Dell Mini系列上网本的BIOS更新注意事项请见本文末尾),然后就开始了艰难的急救过程……(如果你遇到了同样的问题,希望通过本文救活你的Mini,请一定耐心看完本文全文,确定没有什么不懂的再开始动手,以免使情况更糟)
Dell Mini系列网本的BIOS在更新失败后,开机时除了电源灯会亮,再没有其它任何反应,屏幕一片黑暗。话说除了n多年前的老古董台式机,已经很久没有见过刷BIOS能把机子彻底刷死的了(再次BS一下DELL,这整个就是个半成品啊)。
第一步先在网上搜了一圈,发现国内的用户基本没有人反应过类似问题,当然也就没有相应的解决方案了……
然后去国外相关论坛,终于在mydellmini论坛上看到有相关的讨论,终于找到了一根救命草啊!果然,在论坛里面有大牛根据Mini 9系列上网本的BIOS刷新失败恢复方法,给出了针对Mini 10的方法。基本的方法跟以前古董台式机盲刷BIOS类似,主要通过一个定制的软盘(没错,是软盘,这个方法必须借助外置软驱实现,再次BS下Dell!),启动网本到DOS环境下,自动执行BIOS刷新程序直接刷新BIOS,以达到unbrick的目的。
前期准备
所以大家要注意一下,这个恢复过程中,必须要用到外置USB软驱(提供方法那位老兄特别说明过,不过我没有验证,如果你真有心的话可以尝试一下是否可以用U盘替代)。但是为了避免不必要的浪费,我建议大家首先简单验证一下自己的Mini还有没有恢复的希望,如果没有的话,就不要花冤枉钱去买USB软驱了,直接找Dell报修吧……验证的方法很简单,有如下几步(本步骤主要针对Mini 10):
- 拔掉本本的电池和外接电源
- 同时按住Fn键和End键不放,插上外接电源(这个动作难度可能大点,可以找个人来帮忙,不过一个人其实也能搞定: D),这时本本的电源指示灯会闪一下
- 这时,还是一直按住Fn和End,再按下电源开关,这时本本会Beep响一声,然后就持续嘀嘀响,电源灯常亮
PS1:在2,3步中,Fn键和End键一直不要松开
PS2:据说Mini 9机型中,对应的键位不同,不是Fn和End,而是Fn和B键,不过我没有验证过,Mini 9的用户可以试试
如果你在上述步骤中观察到了2,3中描述的现象,那么恭喜你,你还有亲手救活你的Mini的可能(注意,只是可能)。没有的话,建议就不用再往下走了,报修吧,bless~
准备启动软盘
首先,要恭喜你走到这一步,要继续往下走,你先得弄来一个USB软驱和一张空闲的软盘来制作启动软盘(小声说一句,身边没有的话,淘宝上有很多的,不是打广告啊……)
然后,将USB软驱接到一个正常的windows PC上,插入软盘。下载这个工具:
I1010_A04 BIOS Recovery
解压这个zip包后,里面是一个自解包执行文件,执行这个文件后,按照提示操作,可以自动格式化软盘,并制作BIOS更新软盘(Win7好象要用管理员方式运行这个文件)。
拯救行动
启动软盘制作完成后,就可以开始拯救Mini了。(下面步骤针对Mini 10,Mini 9注意看说明)
- 同样,先拔掉电池和外接电源,插上USB软驱,插入上面制作好的启动软盘
- 还是上面的方法,按住Fn+End(保持按住不放,一直到第四步再放),插入电源(Mini 9应该和上面一样,改为Fn+B),电源灯闪一下
- 保持按住Fn+End的同时,按下电源开关键,本本应该会Beep响一声
- 这时软驱灯应该会开始闪,说明Mini已经开始通过软驱启动进入BIOS刷新了,这时可以松开Fn+End了
- 后面就需要耐心了,Mini会一直嘀嘀响,软驱也会一直闪。后面有一段软驱没有反应,但本本还在响,这段时间应该是在对新刷的BIOS进行验证,这时还是要耐心等待,千万不要拔电源线或关机。最后,本本会发出一段奇怪的叫声后,自动重启,如果一切顺利的话,你应该可以看到Dell的Logo了~
整个流程基本就是上面这些了,不过再这个过程中我有些个人经验可以供大家参考一下。首先,这个过程可能一次并不能成功,如果在启动后过了很长时间没有重启,也没有任何动静了,重新按照上面的流程再做一遍就行,注意一定要耐心等足够长的时间,而且确实没有什么动静了(软驱不闪,本也不响)再重新做。另外USB口的选择也可能有一定影响,我开始一直用右侧的USB口插软驱,一直没有成功,最后换左侧的口,一次就成功了,但没有验证究竟是否真的是USB口的影响,大家可以参考一下。
后记
最后恭喜大家的Mini死而复生,同时为了避免以后出现同样的问题,另外也算是提醒还没有中招的用户,下面总结一下Dell Mini系列上网本的BIOS更新注意事项(大多其它各种本也一样的呵呵)。
附:Dell Mini系列上网本的BIOS更新注意事项(此事项为个人经验总结,非官方资料,仅供参考,一切后果自负):
- 首先,要确定自己是否真的必须要刷新BIOS,请根据Dell的更新说明和自己的需求决定,如果仅仅是为了一个更高的版本号……还是先去把自己拍醒吧……
- 这点对Dell Mini系列用户尤其重要!由于Dell Mini官方的BIOS更新程序设计极其NC,大家一定要小心。那个更新程序在你点了Start后会弹出另外一个窗口,上面有很多选项和几个按钮(具体内容记不清了),而且这个窗口会一直是忙碌状态(不可点击),让人感觉好象是程序崩溃了。而实际上BIOS的刷新流程已经开始了,这时千万不要误以为这个程序挂了直接强行中止它,更不要强行关机,否则你会得到一块非常漂亮而昂贵的砖头……这个BIOS更新过程结束后,机子将会自动重启,所以这时最明智的方法就是,不要管它,直到它重启。
- 最后,告诫大家一点,不管是什么型号的本,什么型号的BIOS,更新的时候一定要有耐心……
Arch Linux, Linux2010年6月6日zhtlancer
今天重装Arch时发现最新的2010.05安装镜像只提供了光盘ISO版本,而没有原来的USB镜像版本了,所以只能放弃USB安装的方案。但是为了一次重装系统刻张盘实在浪费,所以就研究了下如何利用这个ISO镜像来实现硬盘安装。
查看了一下ArchWiki,刚好有一篇文章介绍利用ISO镜像安装Arch的方法,主要是利用grub将ISO镜像映射到内存中以供安装使用。不过这篇文章是在2009.08的安装镜像基础上的,在2010.05镜像上有些地方需要做些改动。下面是我的详细的安装过程。
首先要有一个可用的grub。我这里用的grub4dos,需要注意的一点是,我最先用grub4dos 0.4.3没成功,换到0.4.4版本顺利安装。然后将arch的安装镜像放在grub可读的分区内,如(hd1,0)/archlinux-2010.05-core-i686.iso。在启动进入grub时,按“c”进入grub的命令行模式。依次执行以下命令:
grub> map –mem –heads=0 –sectors-per-track=0 (hd0,1)/archlinux-2010.05-core-i686.iso (0xff)
grub> map –hook
grub> chainloader (0xff)
grub> boot
如果以上命令执行过程均没有问题,执行boot后应该就进入ISO镜像的启动流程了,按照正常方式选择arch的live方式,进入安装环境。
安装环境启动过程中,会提示没有找到安装光盘,然后提供了一个shell让用户解决这个问题,其原因在于arch的安装环境是通过光盘的label去找安装光盘的,也就是/dev/disk/by-label/ARCH_201005。所以我们还是需要手动将硬盘上的ISO文件链接到这个位置。当然首先要挂载ISO镜像所在的硬盘分区。这里需要特别注意一点,在Arch安装环境中,不要把任何分区挂载到/mnt目录下,Arch安装环境会将/mnt挂载为安装目标。可以执行下面的命令完成ISO镜像的链接工作:
#mkdir /tmp_mnt
#mount –r –t vfat /dev/sdb1 /tmp_mnt
#modprobe loop
#losetup /dev/loop6 /tmp_mnt/archlinux-2010.05-core-i686.iso
#ln –s /dev/loop6 /dev/disk/by-label/ARCH_201005
#exit
如果没有问题的话,exit后arch会继续安装流程。后面的安装就与正常的光盘安装无异了。
以前用debian的时候,debian的ISO镜像中会提供用于硬盘安装的内核和ramdisk镜像,可以用grub手动加载,安装环境启动后中debian会自动检测ISO镜像位置,挂载ISO镜像继续安装。看了一下arch的ISO镜像内容,感觉arch应该也可以用这种方式进行安装,有兴趣的tx可以尝试一下~
接着扫四道水题
#4 Find the largest palindrome made from the product of two 3-digit numbers.
A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
Find the largest palindrome made from the product of two 3-digit numbers.
#!/usr/bin/env python
biggest = 0
def isPalindromic(num):
num_str = str(num)
num_halflen = len(num_str)/2
for idx in range(0, num_halflen):
if num_str[idx] != num_str[-(idx+1)]:
return False
return True
for x in range(100, 999):
for y in range(100, 999):
if isPalindromic(x*y) and x*y > biggest:
biggest = x*y
print biggest
#5 What is the smallest number divisible by each of the numbers 1 to 20?
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?
#!/usr/bin/env python
def isPrimeUnder20(num):
for tmp in range(2, num):
if num%tmp == 0:
return False
return True
factor_list = []
for x in range(2, 20):
if isPrimeUnder20(x):
power_x = 1
while x**power_x <= 20:
power_x += 1
factor_list.append(x**(power_x-1))
print x,power_x-1
prod = 1
for x in factor_list:
prod *= x
print prod
#6 What is the difference between the sum of the squares and the square of the sums?
The sum of the squares of the first ten natural numbers is,
1^(2) + 2^(2) + ... + 10^(2) = 385
The square of the sum of the first ten natural numbers is,
(1 + 2 + ... + 10)^(2) = 55^(2) = 3025
Hence the difference between the sum of the squares of the first ten natural numbers and the square of the sum is 3025 − 385 = 2640.
Find the difference between the sum of the squares of the first one hundred natural numbers and the square of the sum.
#!/usr/bin/env python
sum_of_square = 0
for x in range(1, 101):
sum_of_square += x**2
sum_tmp = 0
for x in range(1, 101):
sum_tmp += x
square_of_sum = sum_tmp**2
delta = square_of_sum - sum_of_square
print delta
Project Eular, Python2010年1月30日zhtlancer
好久没有动这个了,今天再扫一道水题。
Find the largest prime factor of a composite number.
The prime factors of 13195 are 5, 7, 13 and 29.
What is the largest prime factor of the number 600851475143 ?
题目的数据规模很小,所以可以直接偷懒穷举,so…
#!/usr/bin/env python
num = 600851475143
seg_size = 10000
base_factor = 0
prime_factors = []
while base_factor*seg_size < num:
for tmp in range(seg_size*base_factor, seg_size*(base_factor+1)):
if tmp>1 and num%tmp == 0:
prime_factors.append(tmp)
while num%tmp == 0:
num = num / tmp
print "num:",num," ",tmp
base_factor = base_factor + 1
print prime_factors
BTalk, 黑莓(BlackBerry)2010年1月26日zhtlancer
今后BTalk的更新信息将移至感触黑莓(feelberry),感谢大家对BTalk开发的关注和支持。
相信将BTalk更新信息转移到专业黑莓站点,将给大家带来更好的使用体验。同时感谢feelberry的创始人sanren、疯子和十六人为大家带来这么好的一个发挥平台,同时在感触黑莓的BBS中,会为大家开辟BTalk专区,欢迎大家在那里发表相关看法: )
近期评论