Soul Orbit

I'll take a quiet life. A handshake of carbon monoxide.

0%

说明啊说明:本人纯属小菜,对Objective-C神马的完全的不懂,这篇文章纯属扯淡,各位大大路过,欢迎各种指教~

今天一个同事对我说,他花了两个晚上的时间,啃完了Objective-C。我表示非常震惊,这种速度,应该是为了避免跟不上工作进度,穿越回来的时候选早了几天。于是接着我们就围着Objective-C侃了起来。

他说他看到Objective-C里面的一些特性非常好玩,于是说给我听,比如:

这是一个很神奇的特性,虽然我完全没有看过Objective-C,但是听大致的描述是这个意思:只要我们拥有某个类的头文件和其对应的静态链接库,那么我们就可以对这个类进行扩展,比如,给这个类加一个成员函数。

这种用法,对于基本只在C++里面转圈的我来说,确实也是第一次听到,觉得相当新鲜,于是就开始想了:C++里面是不是也能做到这件事情呢?

让我们来开始尝试吧!给一个名为Test的类添加名为Func1的成员函数。

Read more »

这篇文章是接着上篇文章继续聊的,Chrome的代码实在太多,每一个东西单拿出来都可以说很很多,单就一个breakpad都说了两篇。恩,不过也许是我太啰嗦了。

1. UI控件库(Control)简介

我们知道Chrome做这一套皮肤引擎是为了替换掉Windows原生的控制UI的方式,所以这个皮肤引擎上怎么能没有控件呢?所以在建立好各种基础的UI元素和默认处理之后,Chrome在上面开始封装各种基础的控件,比如button等等。

其相关代码主要分布在src/ui/views/control目录下。

为了进一步的方便开发,Chrome的UI控件库中包括了很多基础的控件,这些控件现在包括如下几种:

  • button:基本的按钮控件和其常用的变种,类似于CButton。
  • combobox:下拉列表和原生的下拉列表,类似于CComboBox。
  • menu:菜单。
  • scrollbar:滚动条。
  • tabbed_pane:封装了自绘的和系统原生的Tab分页控件,类似于CTabCtrl。
  • table:封装列表控件,类似于CListCtrl。
  • textfield:封装输入控件,类似于CEdit。
  • tree:树形控件,类似于CTreeCtrl。
  • 其他:Label,进度条,分栏等等等等。

这些控件中有一些并不一定是全部自绘的,而是使用系统原生的控件,比如tabbed_pane,tree和table。按照Chrome的文档来看,Chrome团队应该并不喜欢使用系统原生的控件,所以从长远来看,这些代码应该是中间代码,毕竟很好的实现一个这样的控件还是比较复杂的,所以Chrome就暂时使用着原生的控件。

另外还有一种我们在控件库中找不到,但是却十分重要的控件:容器。

Chrome的皮肤引擎有一个特点:万物皆容器。所有的控件都继承于一个同一个基类:View,所以所有的控件都可以有子元素。在Chrome里面,你可以建立一个其他什么都不做的View,只用它来排布他的子元素。用过GTK的朋友们肯定对GtkHBoxGtkVBox这个类有一定的印象,这两个类对辅助控件的布局是很有帮助的。在Chrome里面,你也可以使用类似的用法来辅助控件的布局,而且在UI里面还提供了几种基础的布局方法来帮助大家开发。

Read more »

Chrome的UI是很奇妙的,因为看起来能很好的跨平台,而且可以很好的兼容各个平台的特性,比如在Mac下最小化和关闭按钮在左侧,还兼容全屏的特性,在Linux上,也能加载GTK的外框,外加现在Chrome在推的Aura,更是直接接管了桌面合成器。。。这一切让人不得不想去弄清楚Chrome到底是怎么来实现这么强大的UI呢?有一句话我非常喜欢:“源码面前,了无秘密”,读了几天的源代码,也总结些东西,以免后面忘记。

对使用比较感兴趣的朋友也可以先看看如何使用这套皮肤引擎,再来回头看实现。

1. 基本概念

由于Chrome不满Windows没有自带好用的皮肤引擎,所以在一顿折腾之后,就自己设计了一套平台无关的皮肤引擎:Views。它是一个典型的DirectUI,关于它,Chromium的网站上有三篇文章对其的设计进行了阐述:Views frameworkviews Windowing systemNativeControls。这三篇文章虽然是在09年的时候写的,但是后面的设计基本没有太大的改动,所以还是比较有用的,感兴趣的童鞋可以先看看。

在Chrome皮肤引擎里面两个非常重要的概念:WidgetView

Widget对应着一个原生的窗口,而View对应着窗口里面的一个控件,如容器,Button,Tab等等。这样在Widget和View之上,Chrome搭建起了自己跨平台的皮肤引擎。

关于跨平台,这里可能大家需要注意的一点是:这个皮肤引擎并不会封装的非常的完善,这里从Chromium的文档上对于Views framework的定义可以看出来:Our UI layout layer used on Windows/Chrome OS,能在Windows和ChromeOS上用用就可以了。而且Chrome团队也在文档中坦言,支持跨平台会遇到很多问题,如不好处理特殊的窗口消息等等。

Read more »

这两天重新下了个最新的Chrome的源代码,想编译一下,结果发现怎么都编译不过,在编译webcore的工程时,报了一大堆与如下类似的错误:

error C1083: Cannot open include file: 'EventInterfaces.h': No such file or directory
error C1083: Cannot open include file: 'CSSValueKeywords.h': No such file or directory

1. 问题原因

找了很久终于找到了问题的原因:

EventInterface.h和CSSValueKeywords.h这些文件本身是不存在在代码中的,而是根据对应的idl文件的描述,系统在对应的平台下动态生成的。大家可以在src/third_party/WebKit/Source下搜索到这些idl文件。

而在windows下,由于没有自带的perl环境,所以chromium会在third_party下加入cygwin的目录,并利用cygwin来执行perl和相关的脚本。

由于chromium运行cygwin的方式是将其bin目录设置到PATH环境变量中,从而运行其脚本,所以其中一些目录环境就没有配置,比如/usr/lib文件夹是对应的windows的哪个文件夹。而chromium编译时依赖的perl就在这个文件夹内。

所以总的来说,就是在现在的代码在编译的时候无法找到当前需要的perl脚本,所以就无法正常编译。

2. 解决方法

既然已经找到问题的原因了,那么问题也就很好解决了。

在src/third_party/cygwin目录下,有一个setup_mount.bat的文件,运行这个文件,他会将cygwin相关的目录配置全部导入注册表内。这样perl就可以被正常执行了,那些文件也就可以被生成出来了,这个问题就算是初步解决了。

当然这只是一个临时的解决方案,因为这个修改是无法提交回chromium的,在原来的chromium的代码中,是存在一个叫做cygwin的工程来帮我们在每次编译前都自动运行setup_mount.bat的脚本的,但是现在这个工程消失了。

所以最好的方法其实应该是修改其gyp文件,修复windows下的工程信息,然后提交回chromium,但是我暂时还没有太看懂gyp文件,不知道怎么完全还原cygwin工程的配置,所以这个想法就暂时这么搁浅了。

chromium的网站上也有一个关于这个问题的issue,不知道什么时候才能有结果。现在看来只能静待佳音了。

原创文章,转载请标明出处:Soul Orbit
本文链接地址:解决Chromium编译出现无法找到DOM和CSS相关文件的问题

Spotlight是一个让人又爱又恨的东西,一方面他确实相当好用,但是另外一方面,他也确实占用了不少系统资源,在进行大量文件操作的时候,经常将CPU占满,可以将我可怜的macbook pro烧到80度左右,所以不能不好好的折腾他一下了,这里总结一些这两天摸索出来的Spotlight调优的方法,希望能对大家也有些帮助。

本人使用Mac现在总时间还不超过一周,所以很多东西理解的可能是不对的(什么可能啊,是应该吧),有不正确的地方,还请大家多多指正。

以下优化是在Mac OS X Lion 10.7.2 的系统上实践出来的,其他版本的系统可能有一些不一样,大家可以Google一下具体的方法,但是基本步骤应该是差不多的。

如果没有大量的文件操作,Spotlight对系统的影响还是不大的,占用CPU一般是3% - 5%左右,没有太大必要进行优化。但是如果发现最近电脑温度很高,或者电池消耗很快,就可以检查一下Spotlight,参照这篇文章进行优化了。

Read more »

我们用VS编译出来的QT程序,经常会遇见中文乱码,其实解决方法很简单:

在main函数所在文件的包含如下文件:

1
2
##include <QtCore/QTextCodec>

然后,在main函数的开头加入这么一句话就可以了。

1
QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));

之后在调用的时候,所有的字符串记得使用tr()函数包裹起来。比如:

1
QMessageBox::warning(this, tr("出错啦!"), errorInfo, tr("OK"));

这个是因为VS默认的编码是GB2312,而函数tr的作用,是将默认的字符串转换成QT内部的编码:Unicode,所以我们这里只需要设置好编码即可。

如果碰到一些2312里面没有的生僻字,我们也可以尝试使用Windows默认的多字符编码GB18030来解决。

原创文章,转载请标明出处:Soul Orbit
本文链接地址:解决QT在VS下中文乱码的问题

一年一度的公司旅游,结果去的地方我已经去过了,于是抓住机会请了三天年假,想在家里好好休息休息。当然MM还要上课,所以去不了什么远的地方,于是,打算这几天在北京逛逛,然后听听音乐会就这么休息过去吧。
中央音乐学院真是一个好地方,时不时就有演出可以看,有时候还是大师来演出,质量也是相当的高,最后外加一个双休,五天听了五场,很爽很震撼。

第一天是一场几米的漫画主题音乐会,开场比较搞,为了和几米的漫画造成反差,居然用了德国战车的Engel当开头,不过后面真的很感人,期间有一首德彪西的音乐,基本上改变了我极度不喜欢他的看法,后面在看《蓝石头》+ 《空顶之光》的时候,居然被感动到流泪了,没有办法,那样干净的旋律,配上蓝石头这么煽情的剧情,再加上一个杯具的北漂程序猿,怎么不感动。当然最后被MM狂笑了一顿。。。。。一个爷们,感情神马的,哪来这么丰富。。。。。
day1-jimmy-comic

Read more »

C++多重继承一直是一个让人搞不太清楚的一个问题,但是有时候为了实现多个接口,多重继承是基本不可避免,当然在Windows下我们有强大的COM来帮我们搞定这个事情,不过如果你想自己实现一套类似于COM的东西出来的时候,麻烦事情就来了。

在COM里面,有两个很基础的,而且我们都会用到的特性:

  1. 纯虚接口:一般使用一个只有纯虚函数的类来作为接口
  2. 引用计数:在C++中一般都使用引用计数来管理对象的生命周期

这两个功能在一般设计C++接口的时候也经常用到。其实说到底,上面这两个特性牵扯到的是多重继承的二个表现:

  1. 多重继承中的数据存储
  2. 多重继承中的虚函数

在COM中,纯虚接口是使用的interface来定义的,引用计数是通过IUnknown接口来实现的,所有的接口都是从IUnknown这种接口中派生出来的。当我们需要某一个类实现多个接口的时候,就经常会遇见这样的多重继承:
multi-inheritance-com

哦?!是不是很眼熟,ios,istream,ostream,iostream。。各种C++书籍最喜欢用的一个示例。好吧,现在我们先自己实现一个吧,看看到底要怎么使用多重继承。

Read more »

看Chrome已经有一段时间了,但是一直都没有沉淀些内容下来,是该写写笔记什么的了,免得自己忘记了。看的都是Windows平台下的代码,所以记录也都是记录的。。。废话。。

那么首先,先从最基础的东西记录起吧:Chrome的线程模型和消息循环。

1. 多线程的麻烦

多线程编程一直是一件麻烦的事情,线程执行的不确定性,资源的并发访问,一直困扰着众多程序员们。为了解决多线程编程的麻烦,大家想出了很多经典的方案:如:对资源直接加锁,角色模型CSPFP等等。他们的思想基本分为两类:一类是对存在并发访问资源直接加锁,第二类是避免资源被并发访问。前者存在许多问题,如死锁,优先级反转等等,而相对来说,后者会好很多,角色模型,CSP和FP就都属于后者,Chrome也是使用后者的思想来实现多线程的。

Read more »

快四月份了,传说中的樱花终于盛开了,于是和MM一起跑到玉渊潭,准备来一场浪漫的樱花之旅。结果。。。

这是我幻想中的樱花节:
河河路花花路路路花花路河河
河河路花花路路路花花路河河
河河路花花路人人花花路河河
河河路花花路路路花花人河河
河河路花花路路路花花路河河
河河人花花路路路花花路河河
河河路花花路路路花花路河河
河河路花花路路路花花人河河
河河路花花路路人花花路河河
河河路花花路路人花花路河河

结果现实中的樱花节是这样的:
土土土土土土土土人土土土土
人土树土土树树土土土土人土
土人树土土土土土土树土土土
土土土土土树树人人土人土土
土土树树土人土人人人人人土
人土土土土土人树树人树人土
土土土土树土人人人花人人土
土人树土土土土人人树人人土
土土人土土人土人人人人土土
土土土树土土树土树土树土土
土土人土土土土土土土土土土

=。=||| 真是坑爹啊!不过,凑近了看,看是有好看的景色的。。嗯。。凑近了看。。近了看。。了看。。看。。
yyt-sakura