Ubuntu上从源码编译chromium浏览器

Ubuntu不仅是一个免费且开源的操作系统,而且其平台也是开放且透明的。每个组件的源码都可以获取到,也可以从源码自己编译软件包。下面就探讨一下在ubuntu下如何获取chromium源码,并编译Chromium Web Browser。

要从ubuntu的仓库下载源码并编译软件包,最方便的就是使用apt-build实用工具。在ubuntu的发布版本中,该实用工具并没有安装,您可以用如下命令安装:

1
sudo apt-get install apt-build

接下来就可以使用如下命令下载并build chromium browser了:

1
sudo apt-build install chromium-browser

因为我的ubuntu是64位系统(ubuntu 11.04 LTS 64bit),所以出现了如下错误:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
E: There are problems and -y was used without --force-yes
E: Failed to process build dependencies
-----> Updating package lists <-----
Ign file: apt-build Release.gpg
Get:1 file: apt-build Release [107 B]                                                                                                                
Ign file: apt-build/main TranslationIndex                                                                                                            
Err file: apt-build/main i386 Packages                                                                                                               
  File not found
Ign file: apt-build/main Translation-en_US                                                                                                           
Ign file: apt-build/main Translation-en                                                                                                              
Get:2 http://mirrors.163.com precise-updates Release.gpg [198 B]                                                                                     
Get:3 http://mirrors.163.com precise Release.gpg [198 B]                                                                                             
Hit http://mirrors.163.com precise-updates Release                                                                                                   
Hit http://mirrors.163.com precise Release                                                                                                           
Hit http://mirrors.163.com precise-updates/restricted Sources                                                                                        
Get:4 http://dl.google.com stable Release.gpg [198 B]                                                                                                
Get:5 http://archive.ubuntu.com precise Release.gpg [198 B]                                                                                          
Hit http://mirrors.163.com precise-updates/main Sources                                                                                              
Hit http://mirrors.163.com precise-updates/universe Sources                                                                                          
Hit http://mirrors.163.com precise-updates/main amd64 Packages                                                                                       
Hit http://mirrors.163.com precise-updates/restricted amd64 Packages                                                                                 
Hit http://mirrors.163.com precise-updates/universe amd64 Packages                                                                                   
Get:6 http://ppa.launchpad.net precise Release.gpg [316 B]                                                                                           
Get:7 http://extras.ubuntu.com precise Release.gpg [72 B]                                                                                            
Hit http://mirrors.163.com precise-updates/main i386 Packages                                                                                        
Hit http://mirrors.163.com precise-updates/restricted i386 Packages                                                                                  
Hit http://mirrors.163.com precise-updates/universe i386 Packages                                                                                    
Hit http://mirrors.163.com precise-updates/main TranslationIndex                                                                                     
Hit http://mirrors.163.com precise-updates/restricted TranslationIndex                                                                               
Hit http://mirrors.163.com precise-updates/universe TranslationIndex                                                                                 
Hit http://mirrors.163.com precise/universe amd64 Packages                                                                                           
Hit http://mirrors.163.com precise/universe i386 Packages                                                                                            
Hit http://dl.google.com stable Release                                                                                                              
Hit http://mirrors.163.com precise/universe TranslationIndex                                                                                         
Hit http://mirrors.163.com precise-updates/main Translation-en                                                                                       
Hit http://mirrors.163.com precise-updates/restricted Translation-en                                                                                 
Hit http://mirrors.163.com precise-updates/universe Translation-en                                                                                   
Hit http://mirrors.163.com precise/universe Translation-en                                                                                           
Hit http://dl.google.com stable/main amd64 Packages                                                                                                  
Hit http://archive.ubuntu.com precise Release                                                                                                        
Hit http://dl.google.com stable/main i386 Packages                                                                                                   
Hit http://ppa.launchpad.net precise Release                                                                                                         
Ign http://dl.google.com stable/main TranslationIndex                                                                                                
Hit http://extras.ubuntu.com precise Release                                                                                                         
Get:8 http://security.ubuntu.com precise-security Release.gpg [198 B]                                                                                
Hit http://archive.ubuntu.com precise/main Sources                                                                                                   
Get:9 http://cn.archive.ubuntu.com precise Release.gpg [198 B]                                                                                       
Hit http://ppa.launchpad.net precise/main Sources                                                                                                    
Hit http://extras.ubuntu.com precise/main Sources                                                                                                    
Hit http://security.ubuntu.com precise-security Release                                                                                              
Hit http://archive.ubuntu.com precise/restricted Sources                                                                                             
Hit http://ppa.launchpad.net precise/main amd64 Packages                                                                                    
Hit http://ppa.launchpad.net precise/main i386 Packages                                                                              
Ign http://ppa.launchpad.net precise/main TranslationIndex                                                                           
Hit http://extras.ubuntu.com precise/main amd64 Packages                                                                             
Hit http://extras.ubuntu.com precise/main i386 Packages                                                                              
Ign http://extras.ubuntu.com precise/main TranslationIndex                                                                           
Hit http://security.ubuntu.com precise-security/restricted Sources                                                
Hit http://security.ubuntu.com precise-security/main Sources                                                      
Hit http://security.ubuntu.com precise-security/universe Sources                                                                   
Hit http://cn.archive.ubuntu.com precise Release                                                                                   
Hit http://security.ubuntu.com precise-security/main amd64 Packages                                                
Hit http://security.ubuntu.com precise-security/restricted amd64 Packages                                                                            
Hit http://security.ubuntu.com precise-security/universe amd64 Packages                                                                              
Hit http://security.ubuntu.com precise-security/main i386 Packages                                                                                   
Hit http://security.ubuntu.com precise-security/restricted i386 Packages                                                                             
Hit http://security.ubuntu.com precise-security/universe i386 Packages                                                                               
Hit http://security.ubuntu.com precise-security/main TranslationIndex                                                                                
Hit http://security.ubuntu.com precise-security/restricted TranslationIndex                                                                          
Hit http://security.ubuntu.com precise-security/universe TranslationIndex                                                                            
Ign http://dl.google.com stable/main Translation-en_US                                                                                               
Hit http://security.ubuntu.com precise-security/main Translation-en                                                                                  
Ign http://dl.google.com stable/main Translation-en                                                                                                  
Hit http://cn.archive.ubuntu.com precise/main Sources                                                                                                
Hit http://security.ubuntu.com precise-security/restricted Translation-en                                                                            
Hit http://cn.archive.ubuntu.com precise/restricted Sources                                                                                          
Hit http://cn.archive.ubuntu.com precise/main amd64 Packages                                                                                         
Hit http://security.ubuntu.com precise-security/universe Translation-en                                                                              
Hit http://cn.archive.ubuntu.com precise/restricted amd64 Packages                                                                                   
Hit http://cn.archive.ubuntu.com precise/main i386 Packages                                                                                          
Hit http://cn.archive.ubuntu.com precise/restricted i386 Packages                                                                                    
Hit http://cn.archive.ubuntu.com precise/main TranslationIndex                                                                                       
Hit http://cn.archive.ubuntu.com precise/restricted TranslationIndex                                                                                 
Ign http://ppa.launchpad.net precise/main Translation-en_US                                                                                          
Hit http://cn.archive.ubuntu.com precise/main Translation-en                                                                                         
Ign http://extras.ubuntu.com precise/main Translation-en_US                                                                                          
Ign http://extras.ubuntu.com precise/main Translation-en                                                                                             
Hit http://cn.archive.ubuntu.com precise/restricted Translation-en                                                                                   
Ign http://ppa.launchpad.net precise/main Translation-en                                                                                             
Fetched 1,576 B in 10s (147 B/s)                                                                                                                     
W: Failed to fetch file:/var/cache/apt-build/repository/dists/apt-build/main/binary-i386/Packages  File not found

从网上找到了答案,解决方法就是指定配置文件中的架构:修改/etc/apt/sources.list.d/apt-build.list文件,将其中的

1
deb file:/var/cache/apt-build/repository apt-build main

替换为:

1
deb [arch=amd64] file:/var/cache/apt-build/repository apt-build main

接下来就是下载源码,再经过漫长的build过程,生成并安装Chromium Web Browser。版本信息如下图:

chrome://version

下载的源码位于/var/cache/apt-build/build/下:

从上图中可以看到源码包的大小只有200多M,而我们从chromium开源项目下的源码通常有7、8个G,主要原因是这里下的源码是不带git和svn信息的,是纯粹的源代码。

在本地服务器上建立chromium镜像

Android 5.0发布了好长时间,一直都没有来得及研究。前两周终于将android 5.0源码下载了下来,大致看了一下代码。我所关注的并非Material Design,而是Android 5.0的web引擎。从Android 4.4开始,采用了chromium/blink内核,Android 5.0自然也不例外,只是chromium的版本升级到了37.0.2062.116。想到我的chromium webview项目,仍然采用的是34.0.1847,因此打算也将chromium版本进行一次升级。

因为可恶的GFW,下载代码及其不顺利,虽然有VPN,但是对于几十G的chromium下载量,下载速度太慢,而且git不支持断点续传。在折腾了两三个星期之后,决定在公司的服务器上建立chromium的镜像。不知道从哪个版本开始,gclient开始全面转向git。由于git的天然的分布式特点,这为完全镜像chromium源码库提供了便利。

chromium源码库是由chromium本身加上一堆第三方开源库组成,极其庞大。为此我写了一个脚本,放到了github上,有兴趣的可以访问chromium_mirror_script项目,其中chromium_git_list.txt为所有的源码库列表,来自https://chromium.googlesource.com/,随着时间的推移,这个列表也可能发生变化。

有了内部的chromium镜像后,我们可以修改.DEPS.git文件,将其中的git_url值替换为本地git地址,这样通过gclient下载,就是从本地镜像服务器上获取代码了。

我的macos编程之旅-AutoLayout

开始了Mac OS编程之后,仿佛又回到了Visual Basic编程年代,拖拖拽拽几个控件,app的UI就设计好了。但我至今还记得当年面临一个头疼的问题,就是应用程序在不同分辨率下的展现问题。为什么会头疼呢?那时主流的屏幕分辨率是800x600,但有些更好的显示器分辨率为1024x768,如果我们按照1024x768的分辨率设计UI,那么在800x600的分辨率下就显示不全,如果按照800x600的分辨率设计UI,那在1024x768下就没法充分利用屏幕空间。所以当时的app通常会指定最佳分辨率,低了显示不全,高了就只利用屏幕的一部分空间。

回到365看图软件上来,按照IKImageViewDemo设计的UI,存在一个问题:当我拉大窗口,图片显示区域并不会随之变大,整个界面变得很不协调。原因呢在于UI采用了绝对布局,控件的大小和位置是固定的。当然我也可以通过编程的方式,根据窗口的大小,计算图片显示区域的大小,然后动态的设置大小和位置,但这比较繁琐。在Android中,通过设计出线性布局、相对布局等布局方式来解决这一问题,而绝对布局是不推荐使用的。Mac OS是如何解决这一难题的呢?答案就是AutoLayout。

AutoLayout [1]

自动布局系统通过数学化描述元素之间的关系来布局应用程序用户界面。这种关系称作约束,可以定义在单个的元素上,也可以定义在元素之间。使用自动布局,您可以创建动态灵活的界面来适应窗口大小的改变、设备横竖屏变化,还可以应对本地化带来的麻烦。

约束是自动布局的基础,它描述了界面元素布局的规则,比如您可以创建一个约束指定元素的宽度,或者与另一个元素的水平距离。您也可以添加或者删除约束,甚至修改约束的属性,来改变界面布局。

当您添加了多个约束后,不可避免的可能会存在冲突。所以,在计算用户界面上元素的运行时位置时,自动布局系统会综合考虑所有的约束,然后找出一种最大满足所有约束的布局。

自动布局从XCode 5开始引入,适用于ios 6.0和mac os 10.7及以上系统。当一个新工程创建时,自动布局缺省是开启的。

添加约束

添加约束的最简单方法就是通过拖拽来完成,方法如下:按住Ctrl键,然后拖动画布上的控件,类似于创建outlet连接。您可以拖拽元素到自身、到容器,或者到另一个元素。

autolayout

如上图中,您可以根据需要选择”保持在容器垂直方向的中央“,也可以选择”尾部与容器保持一定的距离“。

365看图中,我选择将IKImageView的四边与容器保持一定的距离,这样,当窗口放大和缩小时,IKImageView就能同步放大与缩小。

更多

关于约束,还有许多地方值得探讨:比如编辑/删除约束,多条约束出现冲突该如何处理,如何通过编程的方法增加约束,等等。现在我只使用了一个基础的用法,更多的资料,可以参考apple的一篇官方文档:Auto Layout Guide

[1] https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/Introduction/Introduction.html

我的macos编程之旅-应用程序关联

对objective-c做了基础的入门之后,我就开始了365看图的开发。我个人偏好通过实战来掌握新知识,碰到问题后再来阅读相关的资料并解决问题。从苹果开发者网站找到了一个IKImageViewDemo示例,这个例子足够简单,也满足我要开发的365看图的基本功能。以IKImageViewDemo作为模板,365看图就有了显示、放大、缩小、旋转图片等功能。接下来需要实现一个功能:关联应用程序到图片类型。简单的说,就是在Finder中鼠标右键点击图片文件,能够选择365看图打开图片,或者将图片文件拖拽到365看图即打开。

注册文档类型

在Windows系统中,有一个叫做注册表的东东来集中管理文档类型和能够打开文档的应用程序列表,在Mac系统中,则是通过应用程序包中的info.plist。在info.plist中,声明应用程序能够处理的文档类型(通过文件名后缀)。在365看图项目中有一个ImageViewer-Info.plist的文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>CFBundleDevelopmentRegion</key>
  <string>zh_CN</string>
    <key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>jpg</string>
                <string>png</string>
            </array>
            <key>CFBundleTypeIconFile</key>
            <string></string>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
        </dict>
    </array>
  <key>CFBundleExecutable</key>
  <string>${EXECUTABLE_NAME}</string>
  <key>CFBundleIconFile</key>
  <string></string>
  <key>CFBundleIdentifier</key>
  <string>com.mogoweb.${PRODUCT_NAME:rfc1034identifier}</string>
  <key>CFBundleInfoDictionaryVersion</key>
  <string>6.0</string>
  <key>CFBundleName</key>
  <string>${PRODUCT_NAME}</string>
  <key>CFBundlePackageType</key>
  <string>APPL</string>
  <key>CFBundleShortVersionString</key>
  <string>1.0</string>
  <key>CFBundleSignature</key>
  <string>????</string>
  <key>CFBundleVersion</key>
  <string>1</string>
  <key>LSApplicationCategoryType</key>
  <string>public.app-category.photography</string>
  <key>LSMinimumSystemVersion</key>
  <string>${MACOSX_DEPLOYMENT_TARGET}</string>
  <key>NSHumanReadableCopyright</key>
  <string>Copyright © 2014年 mogoweb. All rights reserved.</string>
  <key>NSMainNibFile</key>
  <string>MainMenu</string>
  <key>NSPrincipalClass</key>
  <string>NSApplication</string>
</dict>
</plist>

其中关键的地方在于:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<key>CFBundleDocumentTypes</key>
    <array>
        <dict>
            <key>CFBundleTypeExtensions</key>
            <array>
                <string>jpg</string>
                <string>png</string>
            </array>
            <key>CFBundleTypeIconFile</key>
            <string></string>
            <key>CFBundleTypeRole</key>
            <string>Viewer</string>
        </dict>
    </array>

指明了应用程序能够处理jpg, png为后缀的文件。

获取文件名

通过右键点击开启应用程序,app是如何得到这个文件名呢?请看下面的代码:

1
2
3
4
5
- (BOOL) application : (NSApplication*) sender openFile : (NSString*) pathname
{
    NSLog(@"application is asking to open %@", pathname);
    return YES;
}

调试技巧

通过拖拽打开应用程序如何调试(比如在application:openFile中打断点)呢?方法如下:

  1. 在Xcode中点击菜单 Product > Scheme > Edit Scheme ,在 Info 页修改 Lauch 选项为:Wait for executable to be launched
  2. 在 application:openFile 方法中设置断点。
  3. 打开 Finder, 将图片文件拖拽到您的应用程序上。[注:您可以在XCode的Project Navigator中右键点击Porducts节点下的xxx.app,然后点击Show in Finder菜单项来定位你的app可执行文件的位置]

我的macos编程之旅-Objective C入门

<>这本书属于基础入门书,Part I和Part II的内容是C语言基础,直接略过,直接跳到“Part III Objective-C and Foundation”。由于已经有C/C++编程经验,看书时着重于Objective C和C++的不同之处。

Objective-C是在C语言的基础上添加面向对象特性发展而来,下面就看看Objective-C中的面向对象三大要素。

1. 封装

和C++、Java等面向对象语言不同,Objective-C中并没有定义private, protected, public关键字,所有数据成员(instance variable) 都是私有的,无法直接访问。例如如下类定义中,x是不能直接被外部访问的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@interface Foo : NSObject
{
    double x;
}

@property int y;

-(int) f:(int)x;
-(int) g:(int)x:(int)y;

@end

@implementation Foo
@synthesize y;
-(int) f:(int)x
{
}

-(int) g:(int)x:(int)y
{
}

@end

要访问类的数据成员,必须通过类的成员方法,最常见的就是称之为getter和setter的方法。为了简化存取方法,Objective-C引入了property概念。比如上面的代码中:

1
@property int y;

定义了属性y,并在实现文件中使用如下代码:

1
@synthesize y;

上面的语句相当于为y定义了getter和setter方法,比如你可以通过y()返回属性值,setY()设置属性值。

同样的,成员方法也没有共有私有之分,所有成员方法都可以被外部访问。上述代码中成员方法前的“-”表示这是一个实例方法,如果为“+”表示类方法,等价于C++中的静态成员函数。如果要为类定义一个方法,又不希望被外部调用,该如何做到呢?解决的方法是不在头文件(.h)中定义,直接在实现文件(.m)中加入成员函数。是的,没错,Objective-C并不要求在头文件中列出所有的成员方法。

2. 继承

和C++不同的是,Objective-C是单根继承体系,所有的类都直接或间接继承自NSObject(注:Objective-C语言规范并没有规定这个根类的名字),这一点和Java类似。同样的,Objective-C不支持多继承。和Java语言中的接口类似的东西在Objective-C中被称作协议(protocol)。协议是一个方法声明的列表,有些方法是必须实现的,有些方法可以定义为可选的。和类一样,协议可以继承其它的协议。一个Objective-C类可以实现多个协议。值得一提的是,协议的名字可以和类名一样,比如NSObject是一个类,同时还存在一个名为NSObject的协议。因为采用了不同的关键字,所以编译器能够区分。比如下面的代码中,Foo继承NSObject类,同时实现了NSObject协议:

1
@interface Foo : NSObject <NSObject>

在C++和Java中,父类可以控制成员方式是否被子类覆盖(通过virtual/final关键字),在Objective-C中,只要子类的成员方法和父类完全一样(包括参数个数及类型),就会覆盖父类的成员方法。

3. 多态

Objective-C支持多态,而且不像C++那么复杂,比如C++中,如果使用栈变量实例,是无法达到多态效果的。关于Objective-C的多态,可通过下面的代码实例说明:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@interface Person : NSObject {
    NSString *name;
}
-(void)setName:(NSString*)name;
@end

@implementation Person
-(void)setName:(NSString*)nameValue {
    name = nameValue;
    NSLog(@"Person's name:%@", name);
}
@end

@interface Student : Person
@end

@implementation Student
-(void)setName:(NSString*)nameValue {
    name = nameValue;
    NSLog(@"Student's name:%@", name);
}
@end

int main(int argc, const char* argv[]) {
    @autoreleasepool {
        Person* person = [[Student alloc]init];
        [person setName:@"Student A"];
    }

    return 0;
}

4. 小结

Objective-C支持面向对象的编程,同时又没有C++的多继承、虚继承等复杂的概念,如果之前有过C++/Java等编程经验,会很容易就能理解Objective-C中的面向对象编程,学起来也会非常轻松。

我的macos编程之旅

自从购入iMac后,这台水果机一直就是我的专属机。女人天生就对电脑这种科技产品心存畏惧,老婆一看这台电脑不是熟悉的Windows系统,就摸都不想摸。直到有一天,老婆拿了一个拷贝有儿子照片的U盘,要用这台iMac浏览一下照片,因为这台iMac的屏幕够大,显示效果也好。于是我就让位让她操作一下。我指点了一下如何插入U盘,如何打开U盘里的内容,剩下的就交给老婆大人操作了。带着Windows下的操作方式,老婆双击打开了一张图片。嗯,不错,打开了第一张照片,效果相当清晰细腻,色彩鲜艳,不禁赞叹了一句:苹果电脑还是不错的。然后…下一张,怎么浏览下一张图片?按右箭头没有用,界面上也没有浏览下一张的按钮。(注:默认是系统自带的“预览”程序)

我解释,苹果电脑要这么用:首先将要照片导入iPhoto,然后通过iPhoto浏览。老婆睁大眼睛,为什么要导入,我仅仅想浏览一下照片而已。我意识到,和她解释苹果软件的设计理念、照片管理的理论是徒劳的,于是我又告诉她一个新方法:选择所有照片,然后从右键菜单选择“打开”。老婆还是瞪着我:为什么要先选择所有照片?看到照片,第一反应就是双击打开它。我哑口无言…至此,老婆对苹果电脑的一点好感荡然无存。

我有点不服气,mac下的软件那么多,总有一款适合Mac新手,于是到mac appstore上去找图形图像类软件。本来苹果电脑就是以优秀的图形处理能力见长,所以各种图像处理软件琳琅满目,但很遗憾没找到一款功能足够简单,满足我的需求的软件。我在windows下常用的“光影看图”也没出Mac版。作为一个多年的程序员,当然不满足于这样一种结果。既然找不到这样的软件,就自己动手,风衣足食,好歹自己也是写程序维生的。某位国外大神级人物曾经有一个惊人的论调:每半年就要学习一门新的语言。对此我很惭愧,已经有多年围着C++/Java打转,没有去尝试学一门新的语言了。正好以此为契机,开始掌握一门新的技能吧。

Mac OS下开发,Objective-C是当仁不让的No.1,当然今年的兵器普上出现了新面孔Swift。考虑到我在C/C++圈子摸爬滚打了这么多年,估计用Objective C会更称手一些吧。而且Objective C发展了二十多年,一直由苹果独立支撑,竟然在编程语言兵器普上排在前几位,自然有其过人之处。好吧,就选它了。学习一门新的语言,一本经典的入门书籍那是必须的,经过大牛的推荐,我选择了<>。

下面就开始我的mac os编程之旅吧!

读『MacTalk.人生元编程』

最先我是在多看上购买的电子版<<MacTalk.人生元编程>>,不久印刷版本也出来了。出于对这本书的喜爱,毫不犹豫的购买了印刷版本。为什么喜欢这本书,因为这本书写的有趣,我也希望我的博文写的有趣一点,可是翻出我以前和现在写的文章,都干巴巴的。不由的感叹,没有平日的文学修养,要将文章写的好真难。平日就欣赏那些语句优美的文章,碰上有文采、技术又出众的双料王,更是打心底佩服,自然要支持一下作者。

<<MacTalk.人生元编程>>是一本既有趣,又有不少干货的一本书。这本书的内容提要是这样概括这本书的:

『作者以一个70后程序员的笔触,立于Mac之上,讲述技术与人文的故事,有历史,有明天,有技术,有人生。70多篇文章划分为六大主题:Mac、程序员与编程、科技与人文、人物、工具、职场。篇篇独立成文,可拆可合,随时阅读。』

同样作为70后程序员,阅读这本随笔文笔容易引起共鸣(虽然地位悬殊,人家已经是院长,我还战斗在第一线)。有时读了某篇文章,不禁假想,要是我早几年读了它,是不是会走上另外一条路线。谈到这里,大家千万不要认为这是一本心灵鸡汤,作者只是以自己的经历、体会娓娓道来,从来不会将自己的观点强加于人。处在互联网这个乌烟瘴气的环境下,看到太多的争论与谩骂,不由令人心生悲观。好在还有池老师这样的技术专家,给浮躁的互联网吹进一丝清爽的凉风。本书最吸引我的地方在于文风幽默,我读过多个多个版本的Mac历史,这里是唯一写的既有趣,又让人涨见识的。关于职场与人生等话题,就如同一位老大哥在与你促膝长谈,不会给你讲为了祖国、为了人民这样的大道理,风趣而又能点中要害。

当然,这本书并非仅仅是一本IT人文书,中间还穿插了不少知识,主要是与Mac有关,此君也自称Mac君,算得上一名苹果公司免费的Mac布道师。文章并未涉及具体的编程知识,而是介绍一些提高效率的知识点。读了此书,Mac功力至少可以精进三层。另外,本文集还收录了VIM、Shell系列,同样适合linux程序员。在此书的发布会上,三表(微信公众号:三表龙门阵的作者)就打趣说,这本数应该拆成两本的,一本人文,一本技术,各取所需。

印刷版比电子版增加了职场系列、编程与写作等内容,这也算的上一份惊喜。印刷版的封面和正文版式都设计的简洁大方,并非仅仅将电子版印刷到纸张上。所以说,即使购买了电子版,再购买印刷版,丝毫不觉得吃亏,反而觉得物超所值。另外,如果您既不想花钱买印刷版,也不想花钱买电子版,可以上http://macshuo.com,可以免费阅读。

关于Chromium WebView项目的源代码管理

chromium项目可谓开源项目集大成者,里面使用的第三方开源库数目高达60+。为了应对庞大的代码库管理问题,chromium项目引入了gclient,一套开源的代码管理方案。gclient是一套python脚本,用来简化多个git/svn源码库的管理。本文不探讨gclient的使用、配置,而是谈谈chromium webview项目是如何组织源码库的。

由于历史原因,chromium项目本身及许多第三方开源库采用的是SVN源码管理系统。SVN采用的是集中式管理,不如git那样能否方便的clone代码库。虽然google后来使用了git-svn等手段,为chromium和所有第三方开源库都做了git镜像库,但是如果需要获取某个release分支的代码,还是需要走svn(google也在不断改进,期望不久的将来,可以通过git获取某个release版本的源码)。

阅读全文 →

使用pandoc和markdown书写文档

公司决定以后使用markdown+pandoc书写文档,于是就研究了一下markdown的写作(补充一下:markdown是一种标记语言,而pandoc则是转化工具)。虽然使用word书写文档得到大多数程序员的鄙视,但不得不承认,Word书写文档最直观,门槛最低。使用markdown+pandoc,各种问题层出不穷,以至于无法参照某一个文档搞定所有问题。在折腾了一天、google了各种中英文资料后,终于打通各路神仙。特此撰文一篇,如有雷同,纯属复制。

阅读全文 →

关于chromium_webview项目

chromium_webview的目标是在chromium核心的基础上提供Android WebView API全兼容的接口,希望达到的效果是基于Android WebView API开发的应用程序,只需将android.webkit包名替换为com.mogoweb.chrome即可完成从WebKit内核到Chromium内核的迁移。目标支持平台为Android 4.0以上。项目地址:https://github.com/mogoweb/chromium_webview

项目的起源

从2011年开始,我转向从事chromium的定制化工作。2012年在移动手机平台上开发了一款浏览器Browser1.0,基于WebKit内核和Android WebView API。2012年下半年开始进行chromium的移植工作,其时google发布了Chrome for Android的第一个版本V0.16,还是beta版本。虽然浏览器的内核发生了很大的变化,但是我们期望上层的代码不需要做修改,于是在Content API的基础上,按照Android WebView API进行接口封装。最后做出来的浏览器美其名曰“双内核”,也就是WebKit加Chromium双内核。

阅读全文 →