文章分类 » soft

有B格的写作软件Desk

  博客是很久没有更新了,不过wordpress却是一直跟随升级到最新的4.1版本,界面越来越好,新特性也越来越多,写blog的欲望却没了。。每次登陆后台,无非是删下垃圾评论,升级下插件。人也越来越懒,对酒的热情已经高过写垃圾代码。

于是为了提高写blog的兴致,入手了一款专门用于写作的mac软件:Desk。额,话说我对这类软件要求很低了,只要满足2点就够了:1.界面够简单,能贴图 2.可以发布到wordpress。至于排版,我是没有什么要求了,如果写东西还要关注字号粗细,那还有tmd神马乐趣。。

木有看错,就一块简单的编辑区,类似之前用过的一款叫zenwriter的软件(截图黑漆漆是开了夜间模式)。

OK,发出去看看效果。。

NPAPI插件开发备忘

1 . 如何在NPClass中存储自己的自定义数据?

只要实现NPClass的allocate和deallocate两个方法,并定义自己的扩展NPClass结构便可

static struct NPClass nativeScriptablePluginClass = {
    NP_CLASS_STRUCT_VERSION,
    JSCLASS_alloc,
    JSCLASS_free,
    NULL,
    JSCLASS_hasMethod,
    JSCLASS_invoke,
    NULL,
    JSCLASS_hasProperty,
    JSCLASS_getProperty,
    NULL,
    NULL,
};

//定义自己的扩展结构体
typedef struct MyScriptPluginClass MyScriptPluginClass;
struct MyScriptPluginClass {
    NPClass nativeClass;
    NPUTF8 *someStringData; //这是我们的自定义数据
};

//在自定义的alloc方法中返回为自定义NPClass申请的内存
NPObject* JSCLASS_alloc(NPP inst, NPClass *aClass) {
    return (NPObject *)malloc(sizeof(struct MyScriptPluginClass));
}

//相应的释放
void JSCLASS_free(NPObject *nobj) {
    //之后都可以通过种类型强转得到我们自定义的结构体
    MyScriptPluginClass *obj = (MyScriptPluginClass *)nobj;
    free(obj->someStringData);
    free(obj);
}

2 . 如何在插件中调用页面中的js方法?

//这里我们将实现一个可以调用window.eval的方法
void JSAPI_methodImpl_getLocation(NPObject *o) {
    NPString rt;
    MyScriptPluginClass *obj = (MyScriptPluginClass *)o;
    NPP _npp = obj->instance;
    NPObject *window = NULL;
    //static NPNetscapeFuncs* browser;
    //获取window对象
    browser->getvalue(_npp, NPNVWindowNPObject, &window);
    NPIdentifier eval = browser->getstringidentifier("eval");
    NPVariant evalResponse;
    NPVariant evalCode;
    
    //初始化我们需要eval的代码
    char *c_javascriptCode = calloc(2048, 1);
    sprintf(c_javascriptCode, "(function(){"
            "return window.location.href;\n"
            "})();");
    STRINGZ_TO_NPVARIANT(c_javascriptCode, evalCode);
    NPVariant args[] = {evalCode};
    
    //window.eval(mycode);
    browser->invoke(_npp, window, eval, args, 1, &evalResponse);
    
    free(c_javascriptCode);
    
    //判断一下js的返回值是否为我们期望的字符串类型
    if (NPVARIANT_IS_STRING(evalResponse)) {
        //得到我们想要的返回值
        rt = NPVARIANT_TO_STRING(evalResponse);
        fprintf(stdout, "window.location = %.*s", rt.UTF8Length, rt.UTF8Characters);
    }
    
    browser->releaseobject(window);
    browser->releasevariantvalue(&evalResponse);
}

3 . 如何管理内存
http://colonelpanic.net/2009/12/memory-management-in-npapi/

使用phantomjs抓取ITC和android market的安装统计数据

同事用python抓各大andriod市场的页面分析软件下载量,发现andriod market的数据是通过ajax加载的,而且貌似加密过了,没法直接解析。后来俺发现了phantomjs这个命令行的webkit,在可以在命令行渲染网页,这样不论数据怎么加载,怎么加密,对于标准的浏览器都无能为力了。软件的原理跟以前介绍的一个命令行web截图工具一样,内嵌一个qt4的webkit,然后渲染到xvfb虚拟出的xserver上。不同是这个提供了js的api,用起来方便,可以用来做爬虫,站点监控,服务端截图。

使用方法:
第一步,安装phantomjs
Mac os & windows:
直接下载.dmg或.exe安装包即可:http://code.google.com/p/phantomjs/downloads/list
mac下安装完闭,可执行文件的路径:/Applications/phantomjs.app/Contents/MacOS/phantomjs
ubuntu:

sudo add-apt-repository ppa:jerome-etienne/neoip
sudo apt-get update
sudo apt-get install phantomjs

centos 5.3:
折腾开始了。。由于phantomjs的linux版本是通过pyqt4实现的,所以装起来比较麻烦
首先我们需要安装qt4.7.而yum默认安装的是4.1

rpm -ivh http://software.freivald.com/centos/software.freivald.com-1.0.0-1.noarch.rpm
yum update fontconfig fontconfig-devel
yum install qt4 qt4-devel
#如果已经安装过qt4则执行 yum update qt4 qt4-devel

安装Xvfb

yum install xorg-x11-server-Xvfb xorg-x11-server-Xorg xorg-x11-fonts*

安装python 2.7,自带的为2.4,没法用

wget http://python.org/ftp/python/2.7.2/Python-2.7.2.tar.bz2
tar jxvf Python-2.7.2.tar.bz2
cd Python-2.7.2
./configure --prefix=/opt/python27
make
make install
cd ..

安装setup tools

wget http://pypi.python.org/packages/source/s/setuptools/setuptools-0.6c11.tar.gz#md5=7df2a529a074f613b509fb44feefe74e
tar zxvf setuptools-0.6c11.tar.gz
cd setuptools-0.6c11
/opt/python27/bin/python setup.py install
cd ..

安装sip

wget http://www.riverbankcomputing.com/static/Downloads/sip4/sip-4.12.4.tar.gz
tar zxvf sip-4.12.4.tar.gz
cd sip-4.12.4
/opt/python27/bin/python configure.py
make
make install
cd ..

安装pyqt4

wget http://www.riverbankcomputing.com/static/Downloads/PyQt4/PyQt-x11-gpl-4.8.5.tar.gz
tar zxvf PyQt-x11-gpl-4.8.5.tar.gz
cd PyQt-x11-gpl-4.8.5
/opt/python27/bin/python configure.py -q /usr/lib/qt4/bin/qmake
#对于64位系统
#/opt/python27/bin/python configure.py -q /usr/lib64/qt4/bin/qmake
make 
make install
cd ..

最后安装pyphantomjs

mkdir pyphantomjs
cd pyphantomjs
wget http://phantomjs.googlecode.com/files/pyphantomjs-1.2.0-source.zip
unzip pyphantomjs-1.2.0-source.zip
/opt/python27/bin/python setup.py install

折腾到这里,pyphantomjs已经安装到了/opt/python27/bin/pyphantomjs
直接执行/opt/python27/bin/pyphantomjs –help,会发现报错

sip.setapi('QString', 2)
ValueError: API 'QString' has already been set to version 1

解决方法
编辑/opt/python27/bin/pyphantomjs,在开始追加几句

#!/opt/python27/bin/python
# EASY-INSTALL-ENTRY-SCRIPT: 'PyPhantomJS==1.2.0','console_scripts','pyphantomjs'
#fix start
import sip
sip.setapi('QString', 2)
sip.setapi('QVariant', 2)
#fix end
__requires__ = 'PyPhantomJS==1.2.0'

第二步:
下载我们用来解析数据的js脚本:android_itc_daliy_report

修改里面的变量:

TIMEOUT = 120;//脚本执行超时时间
ACCOUNT = '';//登陆账号
PASSWORD = '';//密码

第三步:执行抓取脚本
对于Mac os:

#抓取andriod market的安装总量
/Applications/phantomjs.app/Contents/MacOS/phantomjs --load-images=no AndroidMarketDailyReport.js
#抓取ITC的每天的安装量,需要制定日期,而且日期必须是web页面里的日期选择框里有的日期
/Applications/phantomjs.app/Contents/MacOS/phantomjs --load-images=no ITCDailyReport.js 09/06/2011

对于Centos:

#首先保证Xvfb已经启动
Xvfb :0 -screen 0 1024x768x24 &
#抓取andriod market的安装量
DISPLAY=:0 /opt/python27/bin/pyphantomjs --load-images=no --ignore-ssl-errors=yes AndroidMarketDailyReport.js
#抓取ITC的每天的安装量,需要制定日期,而且日期必须是web页面里的日期选择框里有的日期
DISPLAY=:0 /opt/python27/bin/pyphantomjs --load-images=no --ignore-ssl-errors=yes ITCDailyReport.js 09/06/2011

获取输出结果,以Mac os为例:

/Applications/phantomjs.app/Contents/MacOS/phantomjs –load-images=no ITCDailyReport.js 09/06/2011|grep REPORT
REPORT: soft_name 0000
REPORT: soft_name 0000

/Applications/phantomjs.app/Contents/MacOS/phantomjs –load-images=no AndroidMarketDailyReport.js |grep REPORT
REPORT: total 0000
REPORT: real 0000

如果没有输出结果,则说明有异常,账号错误,超时,等等。。

VimiTunesList for vim on Mac OS X

2011.4.18更新
增加了一个选项,可以指定一个播放列表
let g:vim_itunes_playlist = “音乐”
——————-
本来用automator为itunes添加了一个全局搜索的快捷键,无奈快捷键不快捷,点击到激活延迟严重,从itunes选完不能自动返回vim,跟我ubuntu上自己写的mpd搜索不能比。so,写了一个vim插件,效果看我用quicktime录的屏幕(唉,ubuntu上完全没有好用的屏幕录像工具)

第一次加载列表慢点,以后有缓存就瞬间了,刷新缓存用 ctrol+r

安装方法:
下载两个文件
vimiTunesList.vim
vimitunes
将vimiTunesList.vim放到 ~/.vim/plugin/目录
将vimitunes放入$PATH里面随便一个目录,比如我的~/bin

使用方法:
开vim或macvim,输入:IT,会加载一次列表,在想要播放的曲目上回车播放,可以vim的搜索方式搜索。

一个vpn越墙用的路由表修改工具

刚换到mac,昨天搞定翻墙这事,自己有个vpn,但是几乎没用,因为开了vpn所有连接就都走vpn了,与内网测试机无缘。不过直到昨天发现,路由表可以搞定这事。。
原理是:默认网关不选vpn,把需要访问网站的ip添加到路由表,路由到vpn网关即可~
工具:autovpnconf
下载之后用文本编辑器修改一下里面需要使用vpn的网站列表,我只加了几个

前提:连接vpn,并且vpn不是默认网关
mac下只要不选“通过vpn连接发送所有通信”即可
ubuntu下,连接vpn之后就成默认网关了,可以手动改回来

sudo route del default
#xx.xx.xx.xx是网关ip eth0是有线网卡设备名,如果用无线就是 wlan0
sudo route add default gw xx.xx.xx.xx dev eth0

之后执行:

sudo ./autovpnconf

OK了,这样以来只有指定的网站才会走vpn。
!!!每次连接vpn都需要执行一下~~!