生活是一门学问

理解与被理解很难,生活真的是一门学问!

Posted in Life | Leave a comment

关于C++ Plugin in QML

在QML文档中导入C++ Plugin时需要有一个qmldir文件,qmldir文件中声明plugin的动态库的库名及库所在的路径。由于QML viewer对插件是以dlopen方式加载,所以路径的指定是很重要的。如果路径不对,QML viewer加载使用这个插件的QML文档时就会报错,指示类型不存在的错误。

qmldir文件声明plugin的格式如下:

plugin qmlplugin  ../plugins

以上格式声明了插件库 libqmlplugin.so(linux系统中)所在路径 ../plugins (qmldir文件所在路径的相对路径)

如果插件库跟qmldir文件在同一路径中,那么 路径可以不用指定。

对于以上情况,只要直接指定库名即可 plugin qmlplugin

 

QML文档中如何使用这个插件库?可以有以下几种使用方法:

1. 把qmldir文件放到与使用这个插件的QML文档同一目录下,这个qmldir文件会自动被qml viewer加载,qmldir文件指定了插件的所在路径,那么qml文档中不需要任何的import声明就可以直接使用插件中的类型了。

2. 把qmldir文件放到与插件所在的同一路径下,那么qmldir文件中就不需要指定插件的所在路径了。但是在使用这个插件的qml文档中需要import插件所在的路径。如 import “../plugins”

3. 这种方法也是我推荐的方法,把所有的插件放到同一个路径下,然后把这个路径在qml viewer启动时使用函数view.engine()->addPluginPath(path)把这个路径加入到plugin查找的路径列表中。 这样在qmldir文件中只需要列出所有的插件库名即可,然后把这个qmldir文件放到与使用这些插件的qml文档同一路径下。这种方法方便又便于管理各插件库。

注意:如果插件库又以 -l 的形式链接了其他的动态库,则这个被链接的动态库必须在LD_LIBRARY_PATH所指定的路径下。否则使用这个插件的qml文件也会出现类型没定义的错误。具体可以用ldd来查看各动态库的链接关系。

 

 

Posted in QML | Leave a comment

C++与QML文档之间传复杂数据结构(如结构体)

如何从C++传复杂数据结构, 如结构体, 给qml文档

如有如下结构体:
typedef struct
{
pid_t pid;
char    logical_name[AMS_MAX_APP_NAME_LEN];
char full_name[AMS_MAX_APP_NAME_LEN];
AMS_AppState_e state;
int     kbd_fd;
}AMS_AppInfo_t;

用C++封装一个类如下:
class AppInfo : public QObject
{
Q_OBJECT
Q_PROPERTY(int pid READ read_pid WRITE write_pid)
Q_PROPERTY(QString logical_name READ read_logical_name WRITE write_logical_name)
Q_PROPERTY(QString full_name READ read_full_name WRITE write_full_name)
Q_PROPERTY(AppState state READ read_state WRITE write_state)
Q_PROPERTY(int kbd_fd READ read_kbd WRITE write_kbd)

public:
AppInfo(QObject *parent = 0);

int read_pid() const;
void write_pid(int pid);

QString read_logical_name() const;
void write_logical_name(const QString &name);

QString read_full_name() const;
void write_full_name(const QString &name);

enum AppState { IDLE, ACTIVE, STOPPED };
AppState read_state() const;
void write_state(AppState state);
Q_ENUMS(AppState)

int read_kbd() const;
void write_kbd(int kbd_fd);

private:
int m_pid;
QString m_logical_name;
QString m_full_name;
AppState m_state;
int m_kbd_fd;
};

设置invokable函数
class CAmsClient : public QObject

{
    Q_OBJECT

public:
    CAmsClient(QObject *parent = 0);

Q_INVOKABLE AppInfo *read_appinfo(const QString &app_name);
};

AppInfo *CAmsClient::read_appinfo(const QString &app_name)
{

AppInfo *appinfo = new AppInfo;
appinfo->write_pid(1);
appinfo->write_logical_name(app_name);
appinfo->write_full_name(“amsclient full name”);
appinfo->write_state(AppInfo::ACTIVE);
appinfo->write_kbd(10);

return appinfo;
}

对以上两个类进行注册于声明,使得可以在qml中使用
qmlRegisterType<AppInfo>(uri, 1, 0, “AppInfo”);
qmlRegisterType<CAmsClient>(uri, 1, 0, “Ams”);
QML_DECLARE_TYPE(AppInfo)
QML_DECLARE_TYPE(CAmsClient)

我们以插件的方式在qml中进行调用
Q_EXPORT_PLUGIN2(qmlamsplugin, AmsPlugin)

在qml中javascript进行如下调用:

var appinfo = ams.read_appinfo(“stb.qml”);
console.log(“app pid: ” + appinfo.pid);
console.log(“app logical name: ” + appinfo.logical_name);
console.log(“app state: ” + appinfo.state);
console.log(“app full name: ” + appinfo.full_name);
console.log(“app kbd: ” + appinfo.kbd_fd);

Posted in QML | Leave a comment

新的里程

2010年10月29号,我正式结束了在Bleum的日子,也正式结束了在上海生活的日子。

2008.3.19到2010.10.29,算算我在Bleum呆了两年7个月零10天。在Bleum的两年多来,收获也不少,工作上得到了我的老板Roger的肯定,在这里非常的感谢他。比较可惜的是随着自己的离职,手里的一部分公司的期权也就没有了。公司这两年发展比较快,并打算4年内在NASDAQ上市。有得必有失,大概上天注定我要失去发这笔小财的机会。

找工作的过程还是比较戏剧性的。一开始我们都觉得还是回老东家比较好,在杭州我们原来的那两个老东家都还算比较好的公司了。最后Mindy顺利地拿到了 老东家的offer,她8月底就拿到了offer,商定11月初到公司报道。而我在8月底还要进行PMP考试,所以整个8月我没有采取行动。考完 PMP当天我就联系了我原来在三星的老板Lumin,表达了想回去的愿望。Lumin表达了他们开发组强烈的欢迎我回去,但是人事上还得从HR部门过一 下。最后三星还是没有考虑要我,理由是前三星员工一旦离开了就不准回来,这里要非常的感谢Lumin,他得知这个消息以后又帮我争取了一番。从这一点上也 看出日韩企业跟欧美的企业文化还是有不少差别的,日韩企业就是比较看重员工的忠诚度。我还依稀记得我当年在三星时,我们的部长半开玩笑半严肃的问我们“对 公司来说,员工最重要的品质是什么”,他自问自答的说”loyalty”。然后他跟我们说了他在三星的工作史,那时他已经在三星整整干了19年,他在三星 全球的好多个分支机构待过,做过洗衣机,做过电视机,从小兵一直做到了现在的部长。

知道了三星不要我以后,我就开始投简历。最后有三家公 司给了我面试的机会,一家是UT,去做IPTV,一家是威盛,去做手机平台的驱动,另外一家就是给我offer的这家。其实找工作确实心态很重要,因为急 着想回去,所以投了简历以后就天天盼怎么没有一家公司让我去面试呢,有时候还开始怀疑了自己,难道自己真的这么没有竞争力,还是我的简历写得一塌糊涂?期 间Mindy比我还急,因为她老早就拿到了offer,之所以要在11月份才去上班就是为了等我,而我如果在9月份拿不到offer的话,很有可能我们的 人生之路又要通向另一个方向。投了简历后大概过来10来天,面试电话陆续过来了。先是UT,然后是威盛,由于两家面试时间相差了2天,索性我请了假在杭州 待了3天。

其实早知道UT现在已经不敌当年了,但因为杭州好公司确实不多,所以当他们的HR通知我去面试时,我还是很重视对待,并试图一 举拿下的。前期也在网上做了一点功课,知道现在UT的核心业务是IPTV,而且他们的IPTV在国内还是做得很不错的。以前在杭州上班的时候,每次经过一 桥都会看到趴在钱塘江畔像个大乌龟似的UT研发中心,很是气派,(其实世博会里面那个日本馆跟它很像,只是更小一点,再加几个出气孔),那时候UT如日中 天啊,这个楼据说是亚洲最大的单顶建筑(去面试的时候大堂的保安说的)。时过境迁,现在这个大楼已经卖掉了,现在UT也只是里面的一个租客而已了。约好3 点面试,我大概2:50到达他们研发楼的。到达那以后,给了HR打了个电话,居然要我自己打,UT现在连前台都省得招了,研发楼下面那个前台貌似公用的, 现在这个研发楼里入驻了一个做卡通的公司,那天刚好有一个湖北过来的考察团来参观这个卡通公司,所有的保安还有前台都忙上忙下的。跟着HR进入办公区域, 眼前的一切更是让人匪夷所思,整个办公区域没有一个座位上有人,灯也是昏昏暗暗的,也就是我在UT只看到3个人,就是那3个面试我的人,一个HR,两个技术人员。面试的过程就是4个人一起聊,感觉不是很好,特别那个HR的问题比较aggressive.

接下来是威盛的面试。威盛就是原来三星所在办公楼的楼下几层,所以对那边还是比较熟悉的。笔试做得比较顺利,整个面试的过程也比较顺利,相信那个面我的主管对我还是比较满意的。从中午跟他一起吃饭的谈话中得知这里是威盛的独资子公司,也打算近期在国内的创业板单独上市。威盛是一个注重技术的公司,对我来说是一个很好的选择。可能我要价过高,最后他们没有给我offer。

最后这个公司也是这三个公司中我最看重的一个offer,很幸运愿望能够实现。祝愿自己能在新的平台新的岗位有个更好的发展。

就这样我们来上海转了一圈,又回杭州啦。

Posted in Life | 1 Comment

Hello world!

Welcome to WordPress.com. This is your first post. Edit or delete it and start blogging!

Posted in Uncategorized | 1 Comment

一道算法题

记录一下这道算法题,因为觉得思路比较巧妙。
 
arr[N]的数组,  元素是0或者1,N是一个宏, 如何设计一个算法对这个数组进行排序,使得所有的0都在1之前。
要求算法的时间复杂度为 O(n), 空间复杂度为 O(1).
void arrSort(void)
{
 int base[2];
 int i, j, k;
 
 memset(base, 0, sizeof(base));
 for (i = 0; i < N; i++)
 {
  base[arr[i]]++;
 }
 k = 0;
 for (i = 0; i < 2; i++)
 {
  for (j = 0; j < base[i]; j++)
  {
   arr[k++] = i;
  }
 }
}
base数组的大小是个常量,所以空间复杂度是O(1). 在两次遍历中,对arr数组的遍历的时间复杂度为O(n),对base的遍历时间复杂度为O(1),所以最后的时间复杂度是O(n)
引申开来,其实对于原始数组的要求不一定限制于0和1,可以是某个一定的范围,比如考试成绩0~100之间,所以以上的算法可以改成更通用一点的。
const int MAX_VALUE = 100;
void arrSort(int *orig_array, int arrayLen)
{
 int base[MAX_VALUE];
 int i, j, k;
 memset(base, 0, sizeof(base));
 for (i = 0; i < arrayLen; i++)
 {
  base[orig_array[i]]++;
 }
 k = 0;
 for (i = 0; i < MAX_VALUE; i++)
 {
  for (j = 0; j < base[i]; j++)
  {
   orig_array[k++] = i;
  }
 }
}
MIT 的Introduction to Algorithm (8.2小节)中称这个算法为counting sort,也就是计数排序法,里面的排序算法更是通用,直接先遍历原始数组,得到数组中的最小值与最大值,然后根据最大值与最小值算出base数组的大小,也就是base数组是动态分配的。很是巧妙。wiki上的链接如下:
http://en.wikipedia.org/wiki/Counting_sort
Posted in work | Leave a comment

PMP certified

早上无意中打开邮箱,看到title为Congratulations开头,又是PMI发来的邮件,知道自己已经通过了PMP的考试,小开心一把。成绩是2个P,4个M,不算太好,也不差。项目管理关键还是要实践,理论只有在不断的实践中才能得到升华。
Posted in PMP | Leave a comment

PMP考试结束

从5月30号报名到8月28号考试考完,整整3个月的时间备考,还是花了不少时间在上面,自从大学毕业以后已经很久没有为一门考试而忙碌的这种感觉了。

考完了终于可以轻松一下,现在等待成绩中….

整个备考过程如下:
报的是清晖的PMP考前培训班,公司里有不少人是在这里上的,据说不错,网上口碑也不错。
事实证明清晖的骆老师的确不错,这次考试中的考点基本上在课堂上覆盖到了,还有不少题也被他猜中了。

既然是PMP考试,当然得把这个考试的准备过程也当作一个项目来做,得列出一个粗略的进度里程碑计划。
原计划如下,后来计划一改再改,发觉时间根本不够用,原计划的看6遍PMBOK最后只完成了3遍。当然另一个原因是,随着培训班的开始,发觉其实根本不用看这么多遍书,理解最关键。PMBOK属于工具书,工具书的一大特点是看起来枯燥,光自己看的话确实不容易理解,而且这么多内容也不知道哪些是重点。题目也不需要做很多,我后来ESI的和金英勋的书都没做,因为PMP的题目本来就没有公开过,书中的有些题目也是他们自己想出来的,答案到底是不是PMI所要的也不是很确定的。如骆老师所说,把三套模拟题以及课堂练习册中的所有题目都搞懂的话,确实已经足够了。关键还是要理解PMI的项目管理理念。

贴上我的原计划复习过程,是在6月4号订的:
准备看6遍PMBOK,上课前(即7/17/2010前)3遍, 8/28/2010考试前3遍

5/31/2010 ~ 6/16/2010  第一, 二周
1. 粗读PMBOK, 快速过一遍,力求记住PMBOK整体框架; 对项目管理知识体系有一个总体把握,大处着眼,小处着手;

6/17/2010 ~ 6/27/2010  第三,四周
2. 粗读PMBOK第二遍,理清知识结构,脉络,摘出重要知识点; (6/17/2010 ~ 7/6/2010)

6/28/2010 ~ 7/11/2010 第五,六周  (7/7/2010 ~ )
3. 精度一遍英文原版的PMBOK,
  深入理解术语,做配套练习题 (《如何准备PMP考试第四版》)
 
7/12/2010 ~ 7/25/2010 第七,八周
4. 精读PMBOK第三遍,一个知识领域一个知识领域的进行推进,深入理解术语,做配套练习题 (《如何准备PMP考试第四版》);
    重点,难点笔记

7/26/2010 ~ 8/8/2010 第九,十周
5.  《ESI PMP考试全真模拟试题》

6. 把讲义中打五角星的内容单独摘抄,并加强记忆

Posted in PMP | Leave a comment

小宝系列之-拳击手

Posted in 小宝 | Leave a comment

备战PMP(2010-8-28)

据说把自己的目标公诸于众,会让自己觉得时刻受到大家的监督,可以更加自觉的实现既定目标。
Posted in PMP | Leave a comment