发布两个我做的chrome应用

这一段时间由于工作环境换成了linux,饱受了各种折腾的阵痛之后,哥决定下手实现一些急切的需求,最迫切的就属印象笔记和qq了,这两个常用的东西都没有linux版的客户端,不过两者都有网页版的,但网页版的终归纠结于要先打开浏览器,而且也不能做一些定制,于是乎,哥瞄准了chrome的packaged app这个狂野酷拽吊炸天的东西和chrome本身的跨平台特性,搞了两个chrome应用终于几本解决了燃眉之急~鼓掌~~撒花儿~~!

首先是印象笔记啦,先放上安装地址:
https://chrome.google.com/webstore/detail/%E5%8D%B0%E8%B1%A1%E7%AC%94%E8%AE%B0/lgeofkgcdepmadnmoendmocgolpbkfmp?utm_source=chrome-ntp-launcher

话说印象笔记后来升级了一下,界面更小清新了,好喜欢的赶脚哦~
evernote preview3.png

话说短短两个月就有1200+用户了,哥是不是可以嘚瑟一下呢?嘻嘻~
然后是ChromeQQ,今天首发,很激动有木有!配上elementary os的界面效果真的好美有木有!
screenshot2

screenshot4

忍不住的话就安装一下吧:
https://chrome.google.com/webstore/detail/chromeqq/pjkebmlmkppdjcdcilfcjdkifljollfd?gl=CN&utm_source=chrome-ntp-icon

Node-Webkit研究

收集入门文档,找到入门步骤

http://damoqiongqiu.iteye.com/blog/2010720

下载对应node-webkit版本:https://github.com/rogerwang/node-webkit

Create index.html:

1
2
3
4
5
6
7
8
9
<html>
<head>
<title>Hello World!</title>
</head>
<body>
<h1>Hello World!</h1>
We are using node.js <script>document.write(process.version)</script>.
</body>
</html>

Create package.json:

1
2
3
4
{
"name": "nw-demo",
"main": "index.html"
}

Run:
$ /path/to/nw . (suppose the current directory contains ‘package.json’)

Note: on Windows, you can drag the folder containing package.json to nw.exe to open it.

研究官方文档,了解具体架构

https://github.com/rogerwang/node-webkit

运行应用

直接在命令行参数中加上文件夹路径
把文件夹打成zip包改后缀名为nw再运行

下载代码,开发实例

Ruby编码问题

Ruby 1.93对中文似乎不大友好,特别是碰到中文路径,如果碰到incompatible encoding regexp match (GBK regexp with UTF-8 string)的错误,可能是由于中文路径的问题,因为rb源文件是utf-8的,而一旦涉及中文路径,实际上导入的是GBK的编码,所以可能报错,解决方法有
1、 rb源文件头部加上#encoding utf-8,然后在对应地方采用Encoding.default_external =’gbk’Encoding.default_internal =’utf-8’的方法将外部路径名转换成utf-8的编码
2、 采用encode(‘utf-8’)来对相应变量进行转码,如果用force_encoding的话转的码会是utf8编码的十六进制表示

goagent+的OSX安装和Cubieboard安装

OSX安装:

1.修改python文件夹权限

1
sudo chmod 777 /Library/Python/2.7/site-packages/
  1. 安装brew:在终端执行
1
ruby -e “$(curl -fsSkL raw.github.com/mxcl/homebrew/go)”  –请注意都是半角英文双引号
  1. 安装libevent:在终端执行
1
brew install libevent

(Homebrew 缓存路径:/Library/Cache/Homebrew/下,如果下不下来,就手动下载并把压缩包放到这里即可)

  1. 安装pip:在终端执行
1
easy_install pip
  1. 安装cython:在终端执行
1
pip install cython
  1. 安装dnslib: 在终端执行
1
pip install dnslib
  1. 安装greenlet:在终端执行
1
sudo pip install greenlet

(以上命令如果运行不了就要切换到root再试,sudo su)

  1. 安装gevent

下载goagent所需的gevent-1.0的OSX版本:https://code.google.com/p/goagent/downloads/list 下载gevent-1.0dev-macosx-intel.egg,然后用easy_install 安装:

1
easy_install ~/gevent-1.0dev-macosx-intel.egg

即可,如果下载源码编译,方法是:

1
curl -O [http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz](http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz) && tar xvzpf gevent-1.0b4.tar.gz && cd gevent-1.0b4 && python [setup.py](http://setup.py/) install

但编译不过,提示:clang: error: unsupported option ‘-static-libgcc’,估计是Xcode没用gcc,用clang的缘故

  1. 安装GoAgentMac.dmg然后修改GoAgentMac包下的/Contents/Info.plist将GoAgentPath改为GoAgent+的proxy.py的完整路径即可

附:
python包的通用安装方法:Python的包管理工具 - - ITeye技术网站

Cubieboard/Ubuntu安装:

1
2
3
4
sudo apt-get install python-dev libevent python-pip curl
sudo apt-get install build-essential gcc
pip install dnslib
curl -O [http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz](http://gevent.googlecode.com/files/gevent-1.0b4.tar.gz) && tar xvzpf gevent-1.0b4.tar.gz && cd gevent-1.0b4 && python [setup.py](http://setup.py/) install

Putty乱码解决

打开putty主程序,选择window-〉Appearance-〉Font settings-〉Change…,选择Fixedsys字体,字符集选择CHINESE_GB2312。

在window-〉Appearance -〉Translation中,修改Received data assumed to be in which character set 中和Linux中的字符集,把Use font encoding改为UTF-8。

如果经常使用,把这些设置保存在session里面. 现在打开putty,登录成功后,在shell中输入:export LC_ALL=’zh_CN.utf8’ ,中文显示就正常了 。

nano /etc/profile
加入:

1
export LC_ALL='zh_CN.utf8‘

DspLink问题记录

编译TI的Dsp库的话,需要在dsplink下加入如下bat脚本,来进行编译环境设置

1
2
3
4
5
6
7
8
9
10
11
12
13
@echo off
set BASE_PERL = C:\Perl
set TI_TOOLS_BASE_DIR = D:\CCStudio_v3.3
set BIOS_INSTALL_DIR = %TI_TOOLS_BASE_DIR%\bios_5_33_06
set XDC_INSTALL_DIR = %BIOS_INSTALL_DIR%\xdctools
set CODEGEN_INSTALL_DIR = %TI_TOOLS_BASE_DIR%\C6000\cgtools
set PATH = %XDC_INSTALL_DIR%;%CODEGEN_INSTALL_DIR%\bin;%PATH%
cd etc\host\scripts\msdos
call dsplinkenv.bat
call dsplinkcfg.bat --platform=OMAP3530 --nodsp=1 --dspcfg_0=OMAP3530SHMEM  -dspos_0=DSPBIOS5XX --gppos=WINCE --comps=ponslrmc --DspTskMode=1
cd ..\..\..\
cmd

然后就可以编译dsplink库了:
在dsplink目录下:

1
2
cd dsp\src
gmake [-s] all VERBOSE=1

加VERBOSE=1可以看到调试输出
dsplink1.64版编译会失败,因为有个makefile有点问题,错误的加上了引号:
dsplink\make\DspBios\c64xxp_5.xx_windows.mk文件中去掉BASE_INSTALL,BASE_SABIOS,XDCTOOLS_DIR,BASE_CGTOOLS等号右边的路径的引号。
编译dsplink基本通信库之后就可以编译dsp端的例子程序了(gpp端无法编译,需要使用编译好的dsplinkapi.lib库)
在dsplink目录下:

1
2
cd dsp\src\samples\
gmake all

注意:这里的gmake是位于XDC_INSTALL_DIR下的gmake工具,是CCStudio带的,用GNU的make是不行的。另外,编译例子程序是依赖于基本库的

Windows高精度时间函数

这个计时函数主要是通过tick数和tick频率来进行时间测量的。

1
2
3
4
5
6
7
8
9
10
11
12
LARGE_INTEGER secfreq;
QueryPerformanceFrequency(&secfreq); //获取每秒的tick,即tick频率
double msfreq;
msfreq = secfreq.QuadPart / 1000.0; //每毫秒的tick数
LARGE_INTEGER lastTick;
QueryPerformanceCounter(&lastTick); //获得最后一次tick计数
// do something...
LARGE_INTEGER curTick;
QueryPerformanceCounter(&curTick); //获得最后一次tick计数
printf("%lf ms", (curTick.QuadPart-lastTick.QuadPart) / msfreq);

GTK电台开发问题

ubuntu 13.04,webkit里面显示的都是宋体,而且启动程序时xterm里面显示Fontconfig warning: “/etc/fonts/conf.d/50-user.conf”, line 9: reading configurations from ~/.fonts.conf is deprecated.的错误,解决方法

1
2
mkdir ~/.config/fontconfig
mv ~/.fonts.conf ~/.config/fontconfig/

Failed to load module “overlay-scrollbar”问题
是由于overlay-scrollbar引起的,可以通过卸载overlay-scrollbar解决,不过对程序不影响
GTK窗口的显示问题:

1
2
gtk_window_present (GTK_WINDOW(appViewHandle));
gtk_widget_show_all(appViewHandle);

两个必须连用,否则可能出现窗口不能在最上层显示的问题,有可能是最小化后不能恢复显示,有可能是窗口被其他窗口覆盖不能在顶端显示
另外,gtk_widget_present不要与以下函数一起用,如果一起用,也会出现上述问题

1
2
gtk_window_deiconify (GTK_WINDOW(appViewHandle));
gtk_widget_activate(appViewHandle);

至于flash的问题,先下载nspluginwrapper,还有32位的库,即:

1
2
sudo apt-get install nspluginwrapper
sudo apt-get install ia32-libs ia32-libs-gtk linux32 lib32asound2

然后把32位的libflashplayer.so移到~/.mozilla/plugins/libflashplayer.so
然后运行

1
nspluginwrapper -i ~/.mozilla/plugins/libflashplayer.so

autogen时出错:HAVE_INTROSPECTION does not appear in AM_CONDITIONAL解决方法:

1
sudo apt-get install gobject-introspection

gtkdocize: not found错误,解决方法:

1
sudo apt-get install gtk-doc-tools

configure.ac checks: GOBJECT_INTROSPECTION_CHECK错误,解决方法:
重新构建工程即可

this macro does not exist if GObject Introspection is not installed.
in ubuntu 10.04, can install gobject-introspection (0.9.3-0ubuntu4),
if also failed, use autogen.sh to regenerate.

容易忽略的基础问题

今天遇到一个很基础的问题,如果一个函数要传出一个结构体,用值形式的返回值传出,与用引用加赋值的形式传出,与用指针然后memcpy的形式拷贝传出,与用引用形式的返回值,与用指针形式的返回值传出,与用指针不memcpy的形式传出传出的区别。得出以下结论:

  1. 用值形式的返回值传出会在栈中留有一份结构体的拷贝。
  2. 用引用和赋值的形式传出和用指针然后memcpy的形式拷贝传出基本等价,但用指针和memcpy的形式的话,需要知道外界的缓冲区大小,而引用由于有类型,所以事先已经知道了外界缓冲区的大小,不会发生缓冲区溢出等问题。
  3. 用引用或指针形式的返回值传出会暴露对象内部的内容,破坏了封装性
  4. 所以设计接口的时候,对于基本类型,尽量通过返回值的形式传出,而对于结构体,尽量用引用的形式传出,对于OOP,除非有特殊需要,都要保证以值的形式传出。

又一个基础问题,即memset的使用,memset第二个参数为int型的,只能给字符型的数据赋值,也就0-255。所以不要期望通过memset给一个float型的数组幅值,否则将得不到期望的结果。而且就算是给一个int型幅值,也只能赋0-255之间的值。

对于程序调试,当逻辑上找不到错误时,很有可能是类型上出现了错误。比如一个这样的循环:

1
2
3
4
5
INT8 i=0;
for(i=0; i<256; i++)
{
printf("hello world");
}

这会导致什么呢?一个死循环!!!
c语言函数中所有的定义必须在函数开头!
在函数外部只能定义变量是不能运行代码的!

linux托盘菜单(或indicator)开发

在Gnome2时代,托盘菜单广泛采用GtkStatusIcon,但在gnome3时代好像也可以,但ubuntu13.04之后unity不支持GtkStatusIcon了(ubuntu12可以通过白名单的形式解除这一限制),所以在ubuntu13.04的unity下使用GtkStatusIcon会没有任何显示,所以得用libappindicator来显示托盘菜单,实际上ubuntu并没有去除托盘菜单这个东西,只不过把托盘菜单改了个名为indicator applet,规范了些,不过差不多,加了点限制而已,使用还是挺方便的。

之后研究了些高级菜单,就是说菜单项里面包含一些其他控件,比如一个播放器想要托盘菜单控制音量,如果只是简单的菜单,可想而知控制音量多么不方便,显然应该在菜单中加个滑块嘛。所以这个需求咋整呢,把ubuntu的系统indicator的源码down下来研究了一下,找到一种继承GtkMenuItem的自定义控件类的方法,即做一个GtkMenuItem的子类,不过这个子类里面包含了一些其他控件,如滑块啊,切换按钮啊,日历啊什么的。这些自定义控件在一个libido库里面(真爽,不用自己费心了)。这样按说使用这个自定义MenuItem来替换之前的MenuItem就能达到高级控件的效果了,而且还可以捕获事件信号,但libappindicator这个库真TMD让人无语,替换自定义的MenuItem之后,托盘菜单上所有原始的MenuItem都能正常显示,而自定义的MenuItem貌似只能显示出原始MenuItem的元素,控件那些都不见了,妹的。可是如果不用libappindicator,用原生的GtkMenuBar来显示菜单,却是可以的。真是奇葩啊。而且在xfce和kde,gnome3环境下貌似也是可以的?(需要再次验证一下),为啥呢?

没办法,对于这种奇葩的问题,目前有点免疫力,另辟蹊径了罢。不用libappindicator罢,于是找到了libinidcator和dbus-menu这两个高端货,libindicator文档缺乏,研究麻烦,转战到dbus-menu,找到一些文章,dbus是linux下的一个进程间通信的东东,很强大,可以实现gtk,qt进程间通信。dbus-menu自然就能共享菜单了。不过呢,今天down了一个indicator-applet的代码,又被我发现了一个最TMD简单的解决方案(需要验证一下),就是呢,GtkMenuItem是GtkContainter的子类!我擦!直接gtk_container_add完事!亏我搞了这么久真是没想到啊。不过对于dbus-menu确实也可以研究一下,多进程共享菜单还是挺诱人的嘛,君不见ubuntu的那个很爽的音量indicator吗?可以集成多个播放器哦亲!

说到dbus,还有高级货,mpris和osd-lyrics!mpris是一个播放器控制接口,如果要集成自己的播放器到音量indicator中,就得实现这个,更重要的是,实现这个之后还能通过osd-lyrics来显示歌词哦亲啊,我的亲啊,这尼玛又免去了一大堆代码啊,有木有,开源的世界就是协作啊,各种拼接啊。哈哈。所以,对播放器来说,必须得搞定mpris这货,加油!