Author Archives: pipitu - Page 2

给mp3批量嵌入专辑封面

鉴于本人素ID3 tag严重洁癖者,之前有用easytag手动给几千个mp3改过tag= = easytag的界面不错,就是不能批量修改,导致那两天改的我手都酸的不行了….入了n1以后有一点不爽的就是不管啥音乐软件,听歌的时候就是抓不到一张封面,那个默认的灰色封面实在让我火大,就用python写了个从豆瓣抓封面图片直接嵌入ID3 tag的程序,一劳永逸了~~

读写ID3 tag信息

对ID3信息的读取和修改依赖了mutagen库,当然用之前还是要对ID3标准有一个基本的了解。

from mutagen.mp3 import MP3
from mutagen.id3 import ID3, APIC, error

audio = MP3(self.filename, ID3=ID3)
try:
    audio.add_tags()
except error:
    pass

有可能音乐文件一开始并没有tag(虽然机率比较小),所以调用add_tags()方法初始化一下,一般情况下都会抛出个error,提示已经有tag了。

album = self.audio['TALB'][0]
frames = self.audio.tags.getall("APIC")
for frame in frames:
    ext = ".img"
    if frame.mime == "image/jpeg" or frame.mime == "image/jpg":
        ext = ".jpg"
    elif frame.mime == "image/png":
        ext = ".png"
    elif frame.mime == "image/gif":
        ext = ".gif"

如果tag中已经包含唱片标题信息,那么audio.keys()的返回结果中就会包含”TALB”这一项,其他还有比如”TLE1″(表演者),“TCON”(流派)等等。ID3标准中规定代表唱片封面信息的帧结构如下:

audio.tags.add(APIC(encoding = 3,mime = "image/jpeg",type = 3,
desc = u'Cover',data=imagedata))
audio.save()

encoding = 3表示utf8编码,mime可以为”image/jpeg”(“image/jpg”)或者”image/png”格式,type=3表示写入的是front cover,desc是描述信息,data是图片的二进制数据,可以从某个uri读取,也可以从本地读取。

Read more »

Nexus One入手之软件篇(一)

好吧我承认我懒得更新= =五一在宿舍宅了两天看了一堆电影,我就不忏悔了。昨天夜里11点左右下雨了,下之前还轰隆隆的打了一阵雷,要不是爬上床之后听见雨声我还以为我之前是幻听。这两天实验室正下方不知道施工在干啥,整天的拿电钻钻天花板,时不时的来场震动的惊喜(正写着呢又来了…)。

废话说完了来进入正题。以下是android app之五星赞美list~

1. Live Wallpaper

snap20100407_203736 snap20100504_173722
N1自带的这两个动态壁纸都非常的不错,加上后来更新的gmaps动态壁纸,算起来只有这三款支持触摸反馈。左边是默认的Nexus,触摸时会在触摸点生成新的射线;右边是Water,水面会在触摸点处向外扩散生成波纹。

2. 3D Gallery

snap20100504_175805 snap20100504_175611
Gallery的3D效果基本上和Firefox上的Cooliris差不多,很炫目。我喜欢的几个小特性一是在触摸相册中的某个图片时,整个galley的背景就会变成该图片的模糊化色调;二是长按选定功能。总的来说它确实是一个既美观又实用的app。

3. Widget

桌面上怎么能少了漂亮又方便的widget呢,我用的widget主要有以下几款:

  • Google search,必备,平时都通过它来启动app或定位文件
  • Agenda Widget,这个日历widget比默认的Google Calendar更漂亮,并且有多种size可供选择
  • Google buzz,虽然不常用buzz,但是这个widget做的实在让人流口水啊….
  • Google Latitude,列出最近更新了latitude的好友位置
  • Digital Clock,默认的Clock widget上面不显示数字的,这是一个iphone风格的数字时钟
  • Power Control,必备,可控制wifi,gps,sync,bluetooth等的开关
  • Mini Info Widget,3*1,显示目前系统信息,如电池剩余量,ROM和SD卡使用状况等
  • Seesmic,Seesmic什么时候开始支持widget的我都不知道,今天才发现= =。
  • APNDroid,APN开关,控制流量使用
  • AdvancedTaskKiller,系统缓慢的时候按一下释放内存。

snap20100504_192453 snap20100504_192443 snap20100504_192447

Read more »

Nexus One入手一月小记——硬件篇

N1入手快一个月了,对入手过程感兴趣的童鞋请看这里。想必大家都比较关心使用情况,我就分以下几个方面说一说吧~

  1. 触摸屏
    在入手之前最关心的就是触摸屏问题了,估计大家对N1屏幕的负面新闻已经能倒背如流了= =
    入手之后第一件事情就是给它贴膜,对于几种贴膜的好坏机锋网论坛上有讨论,综合个方面因素选择了BENKS的AR膜,前面和后边镜头都贴上了,当然不贴估计也没啥问题,这个看个人习惯了。
    从灵敏度上来说,N1的屏幕真的是perfect,基本上轻轻一touch就ok了,而且屏又大,touch起来真的不是一般的爽,多点触摸也很正常,没有网上传的这样那样的问题。对于传说中的屏幕漂移(就是touch到屏幕边上会反飘到另一边),我只在一种情况下经历过,就是躺床上玩机的时候。说到卧着玩N1,我真的是不推荐,理由有如下几个:1. N1真的是太大了,平时站着单手玩都嫌费劲,不要谈躺着了,但是躺着双手玩,必定有一只胳膊会很酸,这个实在是没有办法> < 2. 躺着的情况下屏幕灵敏度会降低很多,经常出现touch半天没反应的状况。经过我多次把玩发现,N1的屏幕不仅对接触到面上touch的力度敏感,它对整机的握力也很敏感,躺着玩的时候,必定在机身边缘会多着力,在这种情况下触屏的功能就明显受到影响,屏幕漂移只是其中表现的比较明显的一个问题而已,重力感应也经常不起作用。当然如果你直接趴着玩是不会有什么问题的= =
    那么站着玩N1是否屏幕就百分百没有失常的时候了呢?答案是否定的,在某些时候会出现touch感应下漂的状况,比如你按的明明是上边一个icon,它给感应成下边那个了,这时候只要锁屏再解锁就ok了。但是我想强调一下这种情况只是偶然发生,并不影响正常使用。
  2. 轨迹球
    平时基本不用轨迹球,但是看电子书翻页的时候用它还是很方便的。结果有几天用多了,然后向下的那个方向不灵光了,囧。然后某天由于解锁bootloader和取Root权限的时候长按了几下,结果发现轨迹球又回复正常了,大囧。所以大家如果发现不灵光了可以试试长按这个办法….
  3. 耳机
    这个耳机+线控真的很鸡肋,不过好在是通用的3.5mm插孔,所以大家可以随便配自己喜欢的耳机就OK啦。不过我真的不明白为什么线控没有调节音量功能(听说G3的也没有),还有就是话筒为什么是分离开来的,那个话筒那么小,也太容易丢失了,所以我直接搁盒子里没有用过。

总体来说对于硬件方面还算满意,尤其是屏幕尺寸,因为偶的手比较大,所以就想要一个屏大的,厚度也很薄,虽说颜色不太适合MM用,不过就当作别样的帅气好啦,而且白色也容易脏的说。就是虚拟键盘不太习惯,我一般打字的时候还是喜欢横屏,因为横屏的键比竖屏的时候要大一些,不容易按错,其实还是因为手大=.=

今天先就写硬件篇吧,敬请期待软件篇^^

Wifi Setup under Archlinux

实验室有wifi,上次以为是wep加密,结果弄了半天都invalid arguments,这次仔细看了下原来是WPA,参照ArchWiki搞定。
1. Check wpa_supplicant

# wpa_supplicant
...
drivers:
  wext = Linux wireless extensions (generic)
  nl80211 = Linux nl80211/cfg80211
  wired = wpa_supplicant wired Ethernet driver

2. Configure WPA with ssid(here mywireless) and key(here secretpassphrase)

# mv /etc/wpa_supplicant.conf /etc/wpa_supplicant.conf.original
# wpa_passphrase mywireless "secretpassphrase" > /etc/wpa_supplicant.conf
# vim /etc/wpa_supplicant.conf
network={
        ssid="mywireless"
        #psk="secretpassphrase"
        psk=****************************
}

Add this line to the conf file

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=wheel

3. Start WLAN

# ifconfig wlan0 up
# iwconfig wlan0 essid mywireless
# wpa_supplicant -B -Dwext -i wlan0 -c /etc/wpa_supplicant.conf
# dhcpcd wlan0

4. Check wlan0

# ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr 00:22:FA:5F:7F:66
          inet addr:192.168.1.122  Bcast:255.255.255.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:576  Metric:1
          RX packets:73529 errors:0 dropped:0 overruns:0 frame:0
          TX packets:59186 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:39228330 (37.4 Mb)  TX bytes:6663024 (6.3 Mb)

然后ping外面ping不通,发现是从eth0 ping出去的,执行/etc/rc.d/network stop把eth0上的网络关掉就可以了.

@————————————————我是泪的分割线—————————————@

SteamedFish童鞋的教导下,我学习了netcfg的用法,深深地认识到了自己的错误。。。。

1. 创建netcfg profile

# cp /etc/network.d/examples/wireless-wpa /etc/network.d/
# vim /etc/network.d
CONNECTION='wireless'
DESCRIPTION='A simple WPA encrypted wireless connection'
INTERFACE='wlan0'
SECURITY='wpa'
ESSID='mywireless'
KEY='secretpassphrase'
IP='dhcp'
# move /etc/network.d/wireless-wpa /etc/network.d/[profilename]

2. Start network

# netcfg [profilename]

Nexus One 飘洋过海入手记

觊觎小机器人系统很久了,这次主要在Hero和Nexus One之间纠结了一把,最后选择Nexus One的原因,一是现在Hero翻新机很多了,去实体店买怕被骗(基于偶的属性,这个还是很可能发生的……),而在Google web store下单订n1就不用担心这个了,二是Nexus One整体配置比Hero高了一大截,价格上多了1K,性价比来说还是选Nexus One,看Desire的价格就知道了。虽然n1好像也爆出了很多问题,俺们本着对Google品牌的信赖和Linus大神的推介,狠狠心,咬咬牙,下手了=w=

能省则省,参照N1 DIY购买攻略,一步一步完成下单过程。

Google Checkout记录

  • Feb 27 You placed an order with Google Phone Webstore on Feb 27
  • Feb 28 Google Phone Webstore charged your VISA for $529.00. “GOOGLE *Nexus One” will appear on your billing statement.
  • Feb 28 Google Phone Webstore has added new tracking data to your order.
  • Google Phone Webstore shipped your order.

Fedex 追踪
fedex tracking

OneNow 追踪

  • New waybill No.:顺丰 – *********
  • 2010/3/6 8:48:50 Departing from Portland warehouse
  • 2010/3/9 11:57:50 Arrive Beijing, Customs clearance
  • 2010/3/9 16:12:09 Out for delivery

估计他们没有小盒子了,给我弄的这个盒子比较大,算体积重量是3kg,比别人的1.5kg多了1.5kg,结果多花了20刀的运费。用的是招行young卡,总共花费人民币(529+51.74)*汇率*(1+1.5%),差不多4000多一点。就是这样还是比代购要便宜的。
今天早上九点多拿到手,刚刚充电完毕,哈哈。下面奉送开箱照数枚~
图像0220图像0219
图像0215图像0216
图像0217图像0218

Linux下教育网访问国外网站

开学了,又回到了教育网,访问国外网站的问题依然头疼。下面介绍几种在Linux下轻松访问国外网的方法。

  1. 搜狗浏览器

    最广为使用的就是搜狗浏览器的全网加速功能了,当然,在Linux下必须要使用wine运行搜狗浏览器。然后设置代理服务器为127.0.0.1:8081就可以使用搜狗浏览器的教育网代理来访问国外网站了。
    该方法的优点是支持https加密连接,缺点是速度慢,天生不兼容于Linux环境,容易死机等等。

  2. ipv6 + google cache

    教育网默认是开通了ipv6的,Linux下ipv6配置见 Linux IPV6 HowTo。使用http://ipv6.google.com访问google,搜索结果的页面可以直接从网页快照中读取,在搜索一些问题的答案时十分方便。

  3. ipv6 gateway — sixxs.org

    配置好ipv6后即可直接访问sixxs.net/gateway,找到How to use IPV6 gateway,在此处
    sixxs ipv6 gateway
    输入要访问的网址即可。需要注意的是该方法并不支持https。

  4. Opera Turbo

    Opera10.10及以后版本开始提供Opera Turbo功能。 无论是教育网还是联通电信,Opera Turbo 都通过服务器压缩提速,加快网络体验。由于国内有Opera Turbo服务器,因此开启Turbo之后可以直接访问国外网站。开启方法是点击左下方的Opera Turbo图标,设置Turbo状态为On。
    opera turbo
    由于对图片进行压缩,因此在加快浏览速度的同时图片分辨率会变小,此时右击图片,选择Reload Image in Full Quality即可浏览原始图片了。
    此方法由于采用Turbo技术压缩数据,访问速度非常快,但遗憾的是也不支持https。

List performance: Python vs Java

这篇post的主要由来是某次算法作业误用Python做了无用功,性能完全达不到要求,后来换用Java才搞定。作业是一个经典的算法问题:求最近点对,要求的输入数量级达到百万。Java做出来的结果大约是5秒左右,Python的话就完全废了,原因是其中涉及到庞大的list的new操作。

Python list VS Java array

首先做一个简单的实验,分别计算用Python和Java新建一个list的时间。

Python代码:

li = []
for i in range(size):
    li.append(0)

Java代码:

int[] li = new int[size];

结果对比如下:
[table id=1 /]
二者的时间复杂度都是O(n),但在常数上相差两个数量级。究其原因,
The time needed to append an item to the list is “amortized constant”; whenever the list needs to allocate more memory, it allocates room for a few items more than it actually needs, to avoid having to reallocate on each call (this assumes that the memory allocator is fast; for huge lists, the allocation overhead may push the behaviour towards O(n*n)).
也就是说,Python中list的append操作仅当空间不够时才另分配一块新的空间,根据平摊分析(Amortized Analysis)原理,创建一个长度为n的list的时间为c*n(c为平摊常数)。而Java的数组的new操作是一次分配一整快空间,这就不难解释为何两者的性能差异如此之大了。

Read more »

Install MoinMoin under ArchLinux

MoinMoin is a Python WikiClone, based on PikiPiki. To install it on ArchLinux and run it with apache httpd, follow these steps:

  1. Install MoinMoin and dependencies:
    $ pacman -S moinmoin mod_python
  2. Look into the SHARE directory, usually /usr/share/moin – this is where the templates are located
    • data directory (wiki pages, users, etc.) – only MoinMoin should access this
    • underlay directory (wiki pages) – only MoinMoin should access this
    • htdocs directory with html support files – the web server will need to access this
    • server – MoinMoin example startup files (like moin.cgi for CGI)
    • config – MoinMoin example configuration files (like wikiconfig.py)
  3. Choose a wiki name (Here I choose the default ‘mywiki’) and create a directory for the wiki
     $ mkdir /home/http/mywiki
  4. Copy the files.
    $ cp -R /usr/share/moin/data /home/http/mywiki
    $ cp -R /usr/share/moin/underlay /home/http/mywiki
    $ cp /usr/share/moin/config/wikiconfig.py /home/http/mywiki
  5. Install moin.cgi
    $ mkdir /home/http/mywiki/cgi-bin
    $ cp /usr/share/moin/server/moin.cgi /home/http/mywiki/cgi-bin/
  6. Change permissions
    $ chown -R http:http /home/http/mywiki
    $ chmod -R ug+rwX /home/http/mywiki/
    $ chmod -R o-rwx /home/http/mywiki
  7. Configure moin.cgi: insert this line after the import sentences
    sys.path.insert(0, '..')
  8. Configure Apache.
    $ vim /etc/httpd/conf/httpd.conf

    First, load the mod_python module

    LoadModule python_module /usr/lib/httpd/modules/mod_python.so

    Next, setup Alias and ScriptAlias

    Alias /wiki/ "/usr/share/moin/htdocs/"
    ScriptAlias /mywiki "/home/http/mywiki/cgi-bin/moin.cgi"

    Finally, setup access permissions.

     <Directory /usr/share/moin/htdocs>
        Order deny,allow
        Allow from all
    </Directory>
  9. Configure MoinMoin
    $ vim /home/http/mywiki/wikiconfig.py
    

    Modify these parameters.

    data_dir = '../data/'
    data_underlay_dir = '../underlay/'
    url_prefix = '/wiki'
    

    Uncomment this line.

     url_prefix_static = '/mywiki' + url_prefix_static
    
  10. Restart the apache server
    $ /etc/rc.d/httpd restart
    or
    $ apachectl restart
    
  11. Test the wiki
    Start the browser and access the URL http://127.0.0.1/mywiki/



References

迟来的Post

都买了两个月了,才第一篇post,lightory同学都懒得催我写了……真是惭愧啊= =

1. 青春美丽疙瘩痘

本姑娘已经很久不长痘了,即使长了也会在一周内被自然规律无情的消灭。可是自从来到北京,我的脸就开始与痘痘大军结下了不解之缘,她们不断的袭来,却不愿在各种护肤品的淫威下撤退T T,以至于某MM认为偶的本来形象就是这个样子,太桑心了,泪奔~

偶怎么也不甘心,于是在水木的beauty版发帖求助,结果只有一位好心的姐妹回复了我的疑问,她说,原因可能是多方面滴,可能是水土不服,可能是熬夜太多,也有可能是枕巾老长时间没洗太脏了(囧,确实很长时间没洗了,回家前狠狠地搓了一通)

回家后,老娘对偶的脸表示了极大的关怀、愤慨和抨击,并表达了誓与顽痘抗争到底的决心。毅然决然地让偶扔掉了洗面奶、爽肤水、保湿霜、睡眠面膜等一系列瓶瓶罐罐(我的荷包啊T_T),换用孩儿面(囧)。每天晚上10点睡觉,早上11点起床,终于,偶的痘痘开始结疤了(撒花~~~祈祷~~~~)

2. 杯具的成绩

未语泪先流啊,课选太多的下场,墙角画圈圈……

3. 曲折的回家路

首先,学校提供的网上订票根本就没有我回家的车次,打击;然后,一直以为火车站是提前5天售票,事实是提前10天就卖学生票的,结果只买到了硬座(幸好有老乡MM)|||;接着,没有预估到上车的严峻形势,进站比较迟,造成了被堵在车厢门口的悲惨后果。同行的MM前方开路,终于在一场大战之后艰难地爬到了偶们的座位上安顿下来。

血淋淋的教训阿!!!

4. 窝在家中

每天睡了吃,吃了折腾电脑,折腾完了再吃,吃了再折腾,折腾完了睡。

这几天折腾了一下conky配置(默认的也太丑了……)废话不多说,上图
conky-screenshot
左边放不下了,所以把mpd部分单独放在了右上角= =|||

首先是参考了一下conky官网的配置示例,显示的信息还是比较全的,就是不够PP

继续找漂漂的screenshot= =,主要参考了以下两个:OpenArch Part1 和ubuntu论坛上的一篇文章(电信抽,暂时找不着了,这篇的conky配置效果是仿windows边栏的),使用了前者的配色方案的创意(这个DodgerBlue的配色和桌面背景真是相得益彰啊)和后者的背景图片(右下角的嵌套环)。

需要注意的方面有以下几点:1. conky使用的配色的名字列表位于/usr/share/X11/rgb.txt,当然也可以用#rrggbb的格式表示(见man conky)。 2. 要画出漂亮的conky,就要有漂亮的字体支持,这里使用的有Poky,Weather,OpenLogos等等。 3. 调整文字布局是用${offset}和${voffset}来实现的,偏移量可以是负值,很灵活~

配置文件见这里。天气预报的脚本使用的是conkyForecast

话说conky现在有Lua Programming API了,前些天看到有人用这个画仿钢弹system界面的风格,很华丽阿~~