Author Archives: pipitu

Protected: 尘埃落定

This post is password protected. To view it please enter your password below:


手欠的结果阿….

├── Anime
│   ├── タッチ
│   │   ├── [TOUCH.-.Cross.Road~風のゆくえ.OST].专辑.(mp3)
│   │   ├── [TOUCH.-.Jam.Trip.1800.タッチ].专辑.(mp3)
│   │   ├── [TOUCH.-.Miss.Lonely.Yesterday.OST].专辑.(mp3)
│   │   ├── [TOUCH.-.ORIGINAL.SONG.BOOK.1].专辑.(mp3)
│   │   ├── [TOUCH.-.ORIGINAL.SONG.BOOK.2].专辑.(mp3)
│   │   ├── [TOUCH.-.ORIGINAL.SONG.BOOK.3].专辑.(mp3)
│   │   ├── [TOUCH.-.上杉達也.Touch.in.Memory].专辑.(mp3)
│   │   ├── [TOUCH.-.浅倉南.Touch.in.Memory].专辑.(mp3)
│   │   └── 棒球英豪.Music Flavor 2
│   ├── フラクテール
│   │   └── ハリネズミ
│   ├── EVA
│   │   ├── 1995 – CLAIRE·Fly Me To The Moon
│   │   │   └── BOOKLET
│   │   ├── 1995 – NEON GENESIS EVANGELION I
│   │   ├── 1995 – 残酷な天使のテーゼ & Fly Me To The Moon
│   │   ├── 1995 – 残酷な天使のテーゼ & 月の迷宮
│   │   ├── 1996 – Neon Genesis Evangelion – Addition
│   │   │   └── BOOKLET
Read more »

Daily Log 2011/05/03

今天完成了twilc的filter display部分,添加了三个filter:mention(黄色),RT(红色分行)和URL(蓝色),效果如下:
clit filter display

不过这张图里面urxvt的配色没调,显示效果有点囧_,=||

filter机制的实现主要使用到C函数指针,

typedef struct filter{
    char *pattern;
    char *(*get_pattern_end)(char *);
    void (*before_filter)(WINDOW *);
    void (*after_filter)(WINDOW *);
} display_filter;

这里pattern是该filter的特征字符串(比如mention是”@”, URL就是”http://”),get_pattern_end用于返回该filter的显示效果生效的终止位置,before_filter和after_filter函数配合使用开启和关闭显示效果。
下面是mention filter的实现:

void before_mention(WINDOW *win){
    init_pair(1, COLOR_YELLOW, COLOR_BLACK);
    wattron(win,COLOR_PAIR(1));
}
void after_mention(WINDOW *win){
    wattroff(win, COLOR_PAIR(1));
}
char *get_mention_end(char *begin){
    if((*begin) != '@')
        return 0;
    char *p = begin + 1;
    int x = *p;
    while(x != '�' && ((x>='a' && x<='z')||(x>='A' && x<='Z')
           || (x >= '0' && x <= '9')|| x=='_'))
         x = *(++p);
     return p;
}

这样要增加filter的话就比较方便了。

struct filter *mention_filter = malloc(sizeof(struct filter));                
mention_filter->pattern = "@";
mention_filter->get_pattern_end = get_mention_end;
mention_filter->before_filter = before_mention;
mention_filter->after_filter = after_mention;

另外昨天注册了SegmentFault,貌似是推友做的StackOverflow的中文版本,感觉还不错。试着用GAS回答了一下猫猫姑娘提的用各种编程语言写HelloWorld的问题才发现GAS几乎都忘光了_,=
再PS,Gnome3进Arch的extra了,上两张图:
gnome3
gnome3



Posted from Beijing, Beijing, China.

M9——这货不是Android

本来想给老妈入个M9的,摸了几个小时室友刚入的九妹,我这丝念头立马闪的无影无踪。Android的牛逼之处通通没了我TM要怎么跟母上介绍高新科技给人类生活带来的革命性进步啊!!作为一个到现在已为期十个月的Android用户,我表示现在脑中的吐槽堆起来可以跟喜马拉雅的高度相媲美,与桃花潭水的深度堪比肩!但是,人类的理性告诉我现在不是发泄情绪的时候,就让我们来看一下这款魅族深度定制的Android系统的内里乾坤吧!

M9

Read more »

Posted from Beijing, Beijing, China.

Deal with endianness in cross-platform network programming

关于跨平台网络编程中传输数据的字节序问题,Linux中提供了四个函数:

#include <arpa /inet.h>

uint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

这四个函数分别用于16位和32位整型在主机字节序和网络字节序之间的转换。在应用中,比如16位整数,在传输前调用htons转为网络字节序后发送,接收方在收到数据后先调用ntohs转换为接收端的主机字节序。

那么若是要传输浮点数(如32位的float类型),又应该怎么办呢?
维基百科上对于浮点数的字节序有如下一段描述:
“On some machines, while integers are represented in little-endian form, floating point numbers are represented in big-endian form. Because there are many floating point formats, and because there is an absence of a “network” standard representation for them, no endianness standard for transferring floating point values between heterogeneous systems has become universally accepted. This means that floating point data written on one machine may not be readable on another, and this is the case even if both use IEEE 754 floating point arithmetic since the endianness of the memory representation is not part of the IEEE specification.“
在某些机器上,存在整型数据以little-endian形式存储而浮点型数据以big-endian形式存储的情况。对于浮点数来说并不存在一个通用的网络字节序标准。因此若需要传输浮点数,为了保证能够解析,必须自己手动做字节序的处理。

Read more »

Data alignment in cross-platform C programming

在跨平台C语言编程中,数据对齐是一个要着重注意的问题。对于结构体(struct)中数据的对齐方式一般来说大家都已经很熟悉了,这里要讨论的是不同编译器对数组字节的对齐问题。
先看一段代码:

#include <stdio.h>
#include <stdint.h>
#include <string.h>

int main(){
    uint8_t data[3];

    memset(data,0,3);
    uint16_t *data_odd = (uint16_t *)(data+1);
    *data_odd = 0x5566;
    printf("%x %x %x n",data[0],data[1],data[2]);
}

这段代码执行的是一个数据填充的功能,将数组的后两个字节填充为一个16位的数据0×5566。在PC上用GCC编译运行上面的代码,得到的输出为:

0 66 55

这个输出是符合期望的。(注:0×5566以little endian方式存储于内存中)

然而,用arm-linux-gcc编译运行以上代码时,得到了不同的输出:

66 55 0

出现这种情况的原因是,由于效率上的考虑,某些编译器会对一些特定数据会从特定地址进行存取,比如在这里对16位类型的数据编译器必须从偶数地址开始存取,若不是偶数地址会默认采取前挪的动作。因此数据往前移了一个字节。这种错误比较隐蔽往往难以发现,解决方法就是严格按字节进行存取。
在跨平台C语言编程中,对字节的存取应尤其小心,力求准确,否则就会像我一样调这种bug调了一天(望天

Embedcover-0.1 released

Embedcover is a command tool to automatically embed album cover images into music files. It now only supports MP3 audio files and grabs album arts from Douban(http://www.douban.com) using Douban API.

Requires
2.3 <= Python < 3.0
mutagen (a Python module to handle audio metadata.)

Install
Make sure you have Python 2.x and mutagen installed.


   $ sudo python setup.py install

How to use:

  Usage: embedcover [options]
  Options:
    -h, --help            show this help message and exit
    -v, --verbose         be verbose(the default)
    -q, --quiet           be quiet
    -r, --recursive       deal with directories recursively
    -d DIRECTORY, --dir=DIRECTORY
                          the directory with music files to deal with

Example


  $ embedcover -r -d ~/music

Handle all MP3 files under ~/music and subdirectories

Note
To grab the correct album art, you’d better have the album titles specified in the ID3 tag of the music files.

The project is hosted at http://github.com/pipitu/embedcover/ . If any issues or bugs, please feel free to contact me:)

Gentoo配置手记(10/08/07)

我又开始折腾了-___,-

1. 不小心删除了Python
按Gentoo handbook折腾了一天把系统安装好了,于是我就决定emerge一下Python,结果把Python3也给装上了。想删除Python3结果直接把Python2.6一并咔嚓了。彼时还没有认识到问题的严重性,结果后来发现emerge命令执行之后完全没反应,问题严重了。翻开Portage Introduction:

Portage is completely written in Python and Bash.

Gentoo的Portage系统是依赖于Python的,so don’t ever unmerge Python completely!
问题解决方法就是重新编译安装Python:

# cd
# tar xzf /usr/portage/distfiles/Python-2.6.5.tgz
# cd Python-2.6.5
# ./configure --with-fpectl --infodir=/usr/share/info/ --mandir=/usr/share/man
# make
# make install prefix=/usr
# rm /usr/bin/python 2>/dev/null
# ln -s /usr/bin/python2 /usr/bin/python

Reference: [Gentoo Forums] I unmerged python… ensuing problems….

Read more »

Setup GDM 2.28 and above

gdm自从升级到2.28以后就不能设置主题神马的了,而且gdm的background还是一坨非常恶心的绿色,更杯具的是awesome下不知为啥urxvt设置透明背景用的background居然是这个绿色的图,恶心了我很长时间。上次通过设置rc.lua里一个透明选项搞定的,这次awesome升级以后好像又不管用了,一打开urxvt就把我嚇到了….

去查了ArchWiki的Gnome 2.28 Changes,找到了这个命令:


# gksu -u gdm dbus-launch gnome-appearance-properties

终于改过来了。本来想再不行就degrade到2.20的,嗯,可以不用降级了~

Nexus One入手之软件篇(二)

嗯,这次的主题是吐槽,虽然也有一些推荐啦。

吐槽一:Froyo 今天木OTA更新

Google I/O大会放出了Froyo,偶本来也木有对近期的更新抱太大期望,结果今天早上正在自习的时候看到了@junyu 老师的推说N1的2.2OTA更新出了,搅乱了偶那平静的心湖。偏偏手机发推发没电了,又跑回宿舍充了一个多小时的电,然后骑车去实验室连wifi开同步。结果同步了半天都没有提示我有更新哪。我找到check updates,显示your system is up to date。我不甘心,连上vpn再check,还是那句up to date。我悲愤地暴走了!!!白激动了一个多小时阿~~多浪费感情阿~~~!

吐槽二:软件崩溃引起的故障

这周还出了个妖蛾子。有天运行程序太多了,我正开着evernote同步一个图,结果刚一保存屏幕就黑了,只看得见最上方那个状态栏。我touch了半天,出来一个对话框告诉我seesmic崩溃了,点了force close以后屏幕继续没反应,我急躁地锁屏了,然后开锁就完全没有反应,啥都看不见。

偶想大概死机了,拿实验室电话给手机打电话,轨迹球还亮了,嗡嗡的震动,可是屏幕就是黑的!偶慌了,心想不是屏幕坏了吧,真坏了我就杯具了。连忙发了个推求助,@CJie 同学立刻回复了,万分感谢阿:

2010-05-22-173050_554x90_scrot

我立刻插拔电池重启,果然好了….长出一口气阿….
android虽然有GC机制管理不活动的activity,但是明显做的不到位,程序一开多了就慢的很。尤其seesmic的用来更新的后台service貌似经常崩溃。所以我觉得在这种不完善的情况下,app是不是最好提供一个exit的菜单让用户可以选择关闭程序而不是在后台运行。不过听说2.2的速度有2-5倍提升,让我们期待一下它的表现会如何吧~

Read more »