微信公众号服务:将用户发来的图变成海报

这个想法是草地音乐某次活动海报做得非常简单,直接用了一张往期的照片,贴上了活动地点的文字。于是想到其实可以让大家用自己的照片做成海报来玩。

想到最直接的交互就是从微信公众号了,不需要写什么专门网页,你发我一张图,我回你一张图,非常简单高效。后来用python写一个flask服务,图像处理就用PIL,写出来也非常快。

再后来发现可以有更多有趣的玩法,比如除了海报,还可以生成一些比如LOMO风格、黑白风格等照片,或者加上你的二维码等等,后来也做了一些。随便贴一张示例,毕竟一图胜万言嘛。

 

再到后来圣诞节想到,可以用人脸识别,在图片里找出脸的位置,然后在上方贴上圣诞帽的图层,也会非常有喜感,这个和最近比较火的很多自拍类软件自动加上猫胡须什么的其实原理是一样的。

代码已经开源了,点击这里可以看到,后面可以发挥想象力再做一些有趣的东西,不限于图片的交互,可能声音啊视频啊都可以有趣起来。

Audacity音频编辑器简介

Audacity是一款跨平台的开源软件,主要功能是多轨音频录制和编辑,适合日常的音频剪辑比如截取手机铃声、制作Podcast,同样也适合简单的音乐录制和处理,虽然比不上录音棚里的专业软件,但是平时简单录一些demo,或者卡拉OK贴唱什么的还是能够胜任的。下面简单介绍一下安装方法,以windows和mac os x为例,linux用户请根据自己的发行版自行安装。安装大概是三个步骤:安装主程序、安装解码器、安装插件。

项目主页: http://audacity.sourceforge.net   可先行围观一下……好,开始!

1、安装主程序

Windows用户请点这里下载安装包,Mac用户点这里,安装完成后则可以正常使用,不过,还有一些额外的功能需要安装一些其他东西,比如解码器和插件。

2、安装解码器

Audacity默认只支持导入导出WAV格式的文件,原因简单解释一下:因为audacity是根据GPL协议发布的自由软件,而有些解码器(比如用于mp3的lame)是有专利的,和GPL协议冲突,所以发布的时候不能把解码器打包进去,用户需要的话必须自行下载。

如果需要支持mp3格式,则需下载lame解码器,windows用户请点这里下载,mac用户请点这里,安装好后即可支持mp3文件的导入导出。

如果需要更多格式支持,比如wma、m4a、ac3等等,则需下载ffmpeg解码器,windows用户请点击这里,mac用户请点这里下载,然后安装即可。

注意,在安装解码器的时候,请不要更改默认的安装路径,安装完成后重新打开audacity应该就可以正常使用。

3、安装插件

很多功能是通过插件实现的,audacity主要支持三种格式的插件,具体说明请查看官方的指南(英文),这里简单介绍一下LADSPA格式插件的安装。Windows用户请点击这里,下载后直接安装即可,mac用户请点这里下载,下载后将压缩包中的Archive文件夹里的所有文件解压到 Mac Hard Disk > Applications > Audacity > Plug-Ins 目录里。再次打开audacity即可发现“效果”菜单多出很多选项。

好了,有这么些基本上够用了,折腾起来吧!大多数问题可以去官网上查阅用户手册。掌握基本操作和功能后,可以尝试各种插件各种效果,后面好玩的主要就是这些,网上各种插件琳琅满目,有得折腾的。当然别忘了,工具还是要为了音乐服务,不能本末倒置了。

用Android手机遥控电脑上的Clementine播放器

Clementine一直没停止过给我惊喜!!

用手机控制电脑播放这个功能真是太赞了,且不论是不是因为人懒。假设你躺在床上看书,电脑在放音乐,然后你想换歌或者暂停什么的,但是冬天天冷不想下床,怎么办?

或者你像我这样的整天不关电脑,然后出门了,突然想听你电脑里收藏的一些歌,怎么办?直接用clementine遥控,从你电脑的曲库里下载音乐

好,我们来看看怎么设置吧!前提是你有一部android手机和一台电脑。

首先你需要在电脑上安装clementine 1.2版本以上,直接去官网下即可,咱们跨平台小橘子,管你是土豪mac、屌丝win、极客linux,都有对应版本。

然后手机去play store搜索一个app叫clementine remote,如果由于各种原因装不了,直接点这里去官方下载apk包(在页面最下方),然后自行安装。

现在,打开电脑上的clementine,找到偏好设置,网络遥控这一项

2014-01-12-224636_832x749_scrot

 

1、把“Use a network remote control”勾上

2、Port(端口)可以不用改,但是如果你的电脑装了防火墙,别忘了把对应端口开放。

3、“Only allow connections from the local network”选项:如果你只想在内网范围内使用,即电脑和手机都在一个网络里(比如都接入校园网、或者在同一个路由器后面等等),那么就勾上,相应也更安全一点。但是有些情况,比如你出门在外了,想要从自己电脑里下载音乐,那就去掉这个勾。

4、“Require authentication code”选项:为了安全,勾上,输入几个数字,一会儿连接时候需要这个数字来做验证。

5、“Allow downloads”选项:如果你想用手机下载电脑里的音乐,就勾上。

你的IP地址就显示在选项里,一会儿连接的时候就输入这个IP。但是注意,如果你的电脑在内网(校园网、路由器后面等等),手机则必须也在同一个内网(即通过wifi连接这个网络),否则不能连接。如果你的手机直接用流量上网,那就是在公网了,这时候你的电脑也必须在公网(即拥有公网IP,一般宽带拨号上网没用路由器的都是在公网)。

现在,打开手机上的遥控app,输入刚刚选项里显示的IP地址,然后输入authentication code那边你写的数字验证码,不出意外的话,就可以连接上电脑的clementine了,操作手机就和操作电脑上的播放器一样。

播放!尽情享受吧!!

Screenshot_2014-01-12-22-48-55

用Python批量下载豆瓣小站的音乐

原理很简单,豆瓣小站的网页HTML看了一下,每首歌的名字和地址都写好了在里面,只是每次载入地址是不一样的而已。用urllib读取一下,分析出里面的名字和地址,然后下载即可。我用的是python3.2,代码如下:

import urllib.request
from urllib.request import urlopen
import re,os

url = input('Please enter the URL of the douban site.\n(E.g., http://site.douban.com/quinta-diminuita/)\n')
content = urlopen(url).read().decode('utf-8')
#分析音乐人名称并创建相应目录
site_name = ''.join(re.findall('', content, re.DOTALL))
artist = site_name.replace('的小站\n(豆瓣音乐人)','')
print('Preparing to download all the songs by '+artist+'...')
if os.path.exists('./'+artist) == False:
os.mkdir('./'+artist)
#分析出所有房间地址
roomlist = re.findall('

(.*?)<\/div>', content, re.DOTALL)
roomurl = re.findall('href=\"(.*?)\"', roomlist[0])
#对于每个房间,如果有播放列表,则分析每个列表中的歌曲名和对应地址,然后下载
for h in roomurl:
content = urlopen(h).read().decode('utf-8')
playlist = re.findall('song_records\s=\s\[(.*?)\]\;\n', content, re.DOTALL)
if playlist != []:
for i in playlist:
playlist_spl = re.split(r'},{', i)
for j in playlist_spl:
song_title = ''.join(re.findall('\"name\"\:\"(.*?)\"', j))
song_title = ''.join(song_title).replace('\\','')
song_title = ''.join(song_title).replace('/','.')
song_url = re.findall('\"rawUrl\"\:\"(.*?)\"', j)
song_url_str = ''.join(song_url).replace('\\','')
filepath = './'+artist+'/'+song_title+'.mp3'
if os.path.isfile(filepath) == False:
print('Downloading '+song_title+'...')
urllib.request.urlretrieve(song_url_str, filepath)
else:
print(song_title+' alreadly exists. Skipped.')
print('All the songs have been downloaded (if there are any). Enjoy!')

最后附图一张,上面是命令行的运行结果,左边是代码,右边是拖回来的文件,成就感满满!
Screenshot - 061013 - 21:53:00

乐透中奖号码预测算法一则

很显然,谁都不能准确预测号码,本文的方法只是凭借个人可怜的概率知识、直觉、执念、灵感混合而得出,本人对结果的准确性不负任何责任。

英国的lotto规则是,从1-49这些数字里选6个,每期中奖号码为6个主号加1个额外号码,中5+1要比6个全中奖金少很多。我的算法是,从历史中奖号码里统计出每个数次的出现频率,不考虑顺序,因为每次的中奖号码都是从小到大排列的。统计出最高的6个和最低的6个,将最高的数字减去最低的,取绝对值,然后将各自的频率相减取绝对值再处以历史开奖次数,最后将这两个计算结果相乘,加到最低的数字上去。对于第二高和第二低的也是如此,以此类推。简单说就是取最低频率的数字,用最高频率的数字对其作微调。

其实这个算法比较简陋,没考虑中间的数字,这次写的比较草,以后会慢慢补充更复杂的算法,先上代码。

import operator
import math

#将历届数据读入列表
f = open('./lotto')
main_num_list = []
bonus_num_list = []
draws = 0
for line in f:
	main_num = (line.split('\t'))[0]
	main_num = main_num.split(' - ')
	for i in range(0,6):
		main_num[i] = (int(main_num[i]))
	main_num_list.append(main_num)
	bonus_num = int((line.split('\t'))[1])
	bonus_num_list.append(bonus_num)
	draws += 1

#生成一个key为1-49的字典,value记录该数字出现次数
candidate_main = {}
candidate_bonus = {}
for i in range(1,50):
	candidate_main[i] = 0
	candidate_bonus[i] = 0
for item in main_num_list:
	for number in item:
		candidate_main[number] += 1
for item in bonus_num_list:
	candidate_bonus[item] += 1

#分析历史中奖号码中各数字出现的频率,并降序输出
print("Analysis of Main Numbers:\nNumber\tOccurrance")
counter = 0
high_freq_num = []
high_freq_occur = []
low_freq_num = []
low_freq_occur = []
for num in sorted(candidate_main, key=candidate_main.get, reverse=True):
	print("{0}\t{1}".format(num,candidate_main[num]))
	counter += 1
	if 1 <= counter <= 6:
		high_freq_num.append(num)
		high_freq_occur.append(candidate_main[num])
	if 44 <= counter <= 49:
		low_freq_num.append(num)
		low_freq_occur.append(candidate_main[num])

#计算预测的号码
predictions = []
for i in range(0,6):
	prediction = round(low_freq_num[5-i]+(math.fabs(high_freq_num[i]-low_freq_num[5-i])*(math.fabs((high_freq_occur[i]-low_freq_occur[5-i])/draws))))
	predictions.append(prediction)
print("Probably the next draw result would be:")
print(sorted(predictions))

#可以用同样方法处理Bonus Number,但是没有必要,因为只作开奖号码,不可挑选

历史数据来自官方网站,懒得用bs4分析html了,手动复制下来,稍微处理了一下,留下中奖号码,放在文本文件里,样例:

6 - 24 - 33 - 38 - 42 - 43     11
12 - 15 - 24 - 36 - 45 - 49     32
3 - 9 - 10 - 16 - 20 - 22     35
16 - 24 - 27 - 39 - 45 - 49     44
15 - 27 - 31 - 40 - 41 - 49     1
7 - 13 - 25 - 31 - 34 - 45     4

运行结果我就不贴出来了,很长。大家自己运行吧,万一我贴出来预测号码,结果中了那就太招摇了哈哈哈……

用Python批量抓取豆瓣日志

昨天在豆瓣看到有人发状态问如何把豆瓣日志保存到本地,正好最近在学python,就想到用python写一段小程序,练练手。

解析HTML用的是BeautifulSoup库,看了一下文档,还算简单,但是有些奇怪的问题我一时弄不清楚为什么,所以部分功能是用了比较曲折的方法实现的……

好了,少废话,上代码:

from bs4 import BeautifulSoup
import urllib2
import re
import sys
	
def get_each_blog(url):
	content = urllib2.urlopen(url)
	soup = BeautifulSoup(content)
		
	header = soup.find_all("div", attrs={"class": "note-header"})
	title = header[0].h1.get_text()
	date = header[0].span.get_text()
	print(title.encode("UTF-8"))
	print(date.encode("UTF-8"))
	print('\n')
	
	body = soup.find_all("div", attrs={"class": "note"})
	body = str(body[1])
	body = body.replace("""", "") 
	body = body.replace("\n", "") body = body.replace(" ", "\n") 
	print(body) print('\n') print('\n') 

def link_list(pageurl): 
	content = urllib2.urlopen(pageurl) 
	soup = BeautifulSoup(content) 
	urllist = soup.find_all("div", attrs={"class": "rr"}) 
	for i in urllist: 
		blog_url= ('http://www.douban.com/note/'+(i['id'].split('-'))[1])
		get_each_blog(blog_url) 

baseurl = "http://www.douban.com/people/{0}/notes/".format(sys.argv[1]) 
content = urllib2.urlopen(baseurl) 
soup = BeautifulSoup(content) 
link_list(baseurl) 
page_list = soup.find_all("link", rel="next") 
while page_list != []: 
	pageurl = page_list[0]['href'] 
	link_list(pageurl) 
	page_list = BeautifulSoup(urllib2.urlopen(pageurl)).find_all("link", rel="next")

用法:运行这段程序时,将用户名作为参数,如果你没有设置豆瓣的用户名,那就是一串数字,也就是你个人主页的网址里“people”后面那一串,例如(以当初提问的这位同学为例):

~$ python crawl.py duanzhang >> blogbackup.txt

效果如下:
2013-07-16-221457_532x740_scrot

有个功能缺陷是,如果日记里有图片,只能抓到那部分的HTML代码,有兴趣的同学可以继续扩充,但是估计就要想着保存为网页文件了,以便原貌呈现图文混排,当然,也可以仅仅作为备份,把图片抓下来保存在同一个目录里,大家根据自己需求修改吧。

补充一下:windows和mac用户下载和运行python方法请参考官方网站,linux用户没必要说了,太简单了。

国外购买的kindle阅读中国亚马逊电子书的方法

万年不更新的博主今天终于找到了个话题。

最近kindle在中国亚马逊(以下简称中亚)有售了,但是只有paperwhite和fire HD,官网说,如果你有在国外购买的这两款机器,那么可以重新注册到z.cn来购买阅读中亚的电子书,但是如果是其他型号的阅读器,则暂时不可注册,只能使用阅读软件(for android、mac、pc等等)。

不巧,我买的是kindle(这是啥型号,后面啥词都没有,就是那种最原始的),但是又想看中亚的书,怎么办?方法如下(适用于windows和mac系统,linux可能要wine实现):

1、安装中亚官方的kindle阅读器,然后有中亚帐号登录,注意,如果你是卓越老用户,可能用户名不是邮箱地址,需要先在amazon.cn登录界面选择更改邮箱地址才行。

2、在阅读器里将你在中亚购买的书下载到本地,文件会保存在你的文档里一个叫My Kindle Content的文件夹里,格式是azw的。

3、由于这个文件是有保护的(DRM),所以现在还没法随意转换格式或拷贝到其他机器。接下来安装calibre电子书管理器,安装好后运行并设置kindle相关的帐号和邮箱啥的,主要用来向自己设备上推送(也可以跳过设置)。然后去下载calibre的deDrm插件,用来移除DRM保护,在tools_v6.0.7.zip压缩包里能找到这个插件,在calibre界面,点选项,然后点插件,再点“从文件导入插件”,选择那个压缩包里的插件的那个zip包,导入之后重启calibre软件即可。

4、在calibre里添加书籍,把第三部里找到的azw文件导入进去,期间会自动移除DRM保护,然后就可以看到书名在列表里了,选中之后转换为mobi格式,通过usb拷贝到你的kindle里(或者通过个人文档服务推送)即可正常阅读。

在Arch下获得Lenovo A60手机的Root权限

手里有个联通充花费送的联想A60,虽然配置低端,但是搭载Android系统,功能还是齐全的,打算先用一阵子。不过有很多联通制定的软件,需要删掉的话必须有root权限,于是折腾开始了。

一、安装Android SDK,可以通过aur搞定,装这两个包:android-sdk和android-sdk-platform-tools,当然也可以去官方网站下载,手动安装。

二、修改udev的规则,让其识别手机(参考arch wiki)。

1、通过USB连接手机,执行lsusb命令,得到一行类似下面的信息:

Bus 002 Device 006: ID 0bb4:0c8d High Tech Computer Corp.

其中“0bb4:0c8d”前四位是[VENDOR ID]后四位是[PRODUCT ID]

2、根据以上信息修改/etc/udev/rules.d/51-android.rules文件(如果没有则新建一个),加入下面三行内容(将其中的ID部分按照上一步的信息替换掉):

SUBSYSTEM==”usb”, ATTR{idVendor}==”[VENDOR ID]”, MODE=”0666″
SUBSYSTEM==”usb”,ATTR{idVendor}==”[VENDOR ID]”,ATTR{idProduct}==”[PRODUCT ID]”,SYMLINK+=”android_adb”
SUBSYSTEM==”usb”,ATTR{idVendor}==”[VENDOR ID]”,ATTR{idProduct}==”[PRODUCT ID]”,SYMLINK+=”android_fastboot”

3、保存之后运行 sudo udevadm control –reload-rules 来使其生效。

三、准备破解工具,到这里下载一个包,里面用到的是zergRush, Superuser.apk, su-v2, busybox这些文件,将它们找出来,然后找个地方放一下,这里以放在我的home里为例。

还有,在手机上打开USB调试:设置——应用程序——开发——USB调试,勾上即可。

四、开始破解

1、进入SDK的工具目录(我不知道为何aur安装的这玩意儿路径不对)

cd /opt/android-sdk/platform-tools

2、通过USB连接手机,运行 adb devices 命令,看结果是不是类似(如果不能连接,参见wiki)

List of devices attached
0123456789ABCDEF    device

3、开始了!

$ sudo su (自己的电脑先取得root权限)
# adb push /home/me/zergRush /data/local/tmp  (拷入zergRush)
# adb shell chmod 777 /data/local/tmp/zergRush   (修改权限)
# adb shell /data/local/tmp/zergRush  (执行它开始破解)
接下来会看到闪过一些字,最后成功:
[+] Rush did it ! It’s a GG, man !
[+] Killing ADB and restarting as root… enjoy!

继续执行下面的命令:

# adb shell  (进入手机的shell)
# mount    (查看挂载信息)
/dev/block/mtdblock11 /system yaffs2 ro,relatime 0 0   (其中一行:/system的挂载位置)
# mount -o remount,rw -t yaffs2 /dev/block/mtdblock11 /system   (将其重新挂载为可写)
# exit (退出手机终端)

# adb push /home/me/Superuser.apk /system/app/Superuser.apk  (拷入三个文件,下同)
# adb push /home/me/su-v2 /system/bin/su
# adb push /home/me/busybox /system/bin/busybox
# adb shell chmod 4755 /system/bin/su   (修改su的权限)
# mount -o remount,ro -t yaffs2 /dev/block/mtdblock11 /system  (重新挂载为只读)
# reboot (重启手机)

大功告成!

参考链接:
https://www.deleak.com/blog/2010/12/17/android-root-on-linux
http://jbakshi.50webs.com/Linux_tutorial/rootA60/rootA60.html
https://wiki.archlinux.org/index.php/Android-sdk
http://www.kunli.info/2009/08/22/archlinux-android-adb-recognize-device/
http://products.mobileuncle.com/thread-68318-1-1.html  (查看哪些可刪哪些不可刪)

Arch Gnome 3 下编译 Eva 未遂

上次写过一篇在ubuntu 10.10下编译eva,比较简单,因为那个时候源里是有eva的,况且我安装过,所以运行需要的环境是有了,然后就是build-dep这个好东西可以自动安装好编译所依赖的包,很遗憾,ubuntu 11.04源里不再有eva,至于arch,那就更没有了,AUR里有一个比较旧的版本,我没有尝试,而是直接去sourceforge下了比较新的源码。

首先是./autogen.sh生成configure脚本,然后就开始简单的./configure,当然,也是在这里走不动了。

事先知道装两个包,kdelibs和qt,然后发现说找不到kde-config,后来知道是因为现在这个包叫kde4-config了,于是ln -s建立一个软链接,过去了。

接着是Qt的问题,说是找不到lib和header,后来装了个qt-private-headers这个包,不起作用,然后网上搜一下,说qt库在/opt/qt/lib/,因为我是64位,我甚至还建立的一个叫lib64的软链接到lib,仍然无效,后来加了一个后缀,./configure –with-qt-dir=/opt/qt/,终于通过。

接着有来了个KDE的问题,我加了–prefix=`kde-config –prefix`,但是却不能找到KDE的库,我也学着上面建立了个kde的软链接到kde4,仍然无效,最后卡死在这:

checking for KDE… configure: error:
in the prefix, you’ve chosen, are no KDE libraries installed. This will fail.
So, check this please and use another prefix!

考虑的明天要早起去学校,也就没了耐心,就此作罢,但是我感觉隐约中学到了一些东西,有了新的体会,实际上编译就是把源码make成bin,但是源码太复杂,所依赖的lib也太复杂,各个distro上这些lib版本不一样,位置不一样,于是有了configure之类的东西,问题是这个程序是很多年前的,估计configure里面写的东西和现在不太符合了,实际上这个东西还是可以编译的,我觉得如果是对系统和变成了解很多的人甚至可以不用这个东西,一条一条敲命令编译好,当然没人会这样做。估计是可以根据自己的系统,改改confugure,把依赖的包位置都找准确,就能顺利编译。

Update:后来又做了尝试,原因应该是因为我的系统是64位的。

逃叛笔记——从Ubuntu 11.04 到 Arch

记得前些日子刚刚升级到Ubuntu 11.04的时候还是觉得Unity没有想象中那么差,而且我也很习惯那样的操作方式。问题是整个系统太不流畅了,CPU经常居高不下,偶尔莫名卡住或者死机。Ubuntu 11.04真的不给力,不是因为Unity,而是因为本身,我觉得这个正式版顶多能算是Beta版。

于是乎,果断逃叛到Arch,为此我还专门买了个U盘来作为安装盘,可让我等了不少天。好了,闲话少说,正题开始,主要是一些粗略的过程和注意点,希望对受不了11.04而准备上Arch的童鞋有点帮助。

准备工作

至少你要有一个安装介质吧,虽说硬盘安装肯定是有方法的,但是那样很折腾,不如传统方法方便。你可以刻光盘,也可以用U盘。这些wiki上写的很详细,不再熬述。顺便说一下,我选择的是64位的系统,我的配置并不高,奔腾双核,2G内存,但是用起来没问题。

还有一件事情非常重要:备份数据!主要是你的/home目录。我的情况是一共/和/home还有swap三个分区。安装后/的分区全部抹掉,/home保留不动,swap随便它怎么搞,反正里面没东西,浮云。

开始安装

主要还是参考wiki,可以事先读几遍,把主要步骤写在纸上(如果你没有打印机),当然,还有就是在安装的时候你可以按Alt+F2切换到tty2然后运行less /usr/share/aif/docs/official_installation_guide_en查看安装指南。

时区稍微留意一下,如果你设置UTC,然后发现时间不对了,不要手动修改,那样会同步到CMOS,导致win的时间乱掉,所以应该选择localtime才对。

前面的步骤很简单,如果你以前用文本方式安装过linux,那就是小case,主要注意的地方是分区设置,/的分区需要(re)create分区,也就是格式化神马的,但是/home的分区千万不能(re)create,至于swap,随便,挂载上去就行。

安装包的时候把base和base-devel全选上,后者以后你要编译程序会用上。

后面配置比较重要一点,一个是/etc/rc.conf,里面有一些地方要修改,比如LOCALE,HOSTNAME,DAEMONS。关于LOCALE说一下,如果你用英文界面,想显示中文并能输入中文,根本不需要设置LC_CTYPE,也就是说保持默认的LOCALE为en_US.UTF-8就可以。不过在/etc/local.gen里面最好把zh_CN开头的几个都取消注释。

还有一个是/etc/pacman.d/mirrorlist,设置源的,我这里lupaworld奇快,基本都是满速。

后续配置

除了上面说的一些,其他自行搞定了然后重启(别忘了拔掉安装盘)就可以使用了。刚刚装好的Arch是没有图形界面的,而是一个CLI的很干净的系统。这里我要感慨一下命令行的强大。当时还没装X(别误解,是指X11)的时候,出了一些问题,我随便装了个叫freetalk的东东,直接就上了Gtalk然后向del童鞋请教去了……当然命令行能做的远不只这些,浏览网页,听歌甚至看电影都可以。不可思议。

动手之前运行一下pacman -Syu更新系统,之后可以参照wiki,安装显卡驱动和X,还有要添加一个日常的用户,不要用root。安装sudo和gksu,还有要把它加入一些用户组,这个用户的名字最好和你之前的系统里的一样,这样home里面的个人文件夹也不要改名字麻烦了,这些都可以在wiki查到。

然后我装了Gnome 3,注意,要把dbus添加到/etc/rc.conf的DAEMONS里面,不然会出问题无法启动。还有要装一些你喜欢的中文字体。然后装一下gdm(同上,也要放进DAEMONS,放在最后一个),如果你喜欢用它登录的话。当然也可以自己敲命令或者其他方法登录到GNOME 3。

之后重启应该就可以进入桌面了。然后随便折腾把,说一下终端中文乱码的问题,在菜单上点Terminal –> Set Character Encoding –> Unicode (UTF-8) 就好了,不需要设置LOCALE那么麻烦。

总结

虽然折腾了两天,但是感觉这一次安装,对linux又有了更深的了解。