深度桌面操作系统架构设计

今天就结合深度桌面操作系统给大家讲讲桌面操作系统的架构设计和原理细节,一来向外界讲讲深度这么多年都做了哪些工作,二来希望通过客观公正的事实向中国新一代的开源爱好者讲述怎么用正确的三观去贡献自己的力量。

什么是桌面操作系统?

简而言之,桌面操作系统就是大家平常个人电脑里面用的操作系统。
桌面操作系统应该是所有操作系统类型中最为复杂、研发技术难度最高的一种操作系统了。
世界上非常优秀的桌面操作系统有微软的Windows和苹果的Mac OS,其他的Linux桌面操作系统,比如Fedora、Suse、Ubuntu包括我们自己的deepin操作系统,虽然这十几年取得了长足的进步,但是相对于Windows和Mac OS,不论技术先进性、交互设计还是产品质量方面都还有非常大的差距。

桌面操作系统都有哪些部分组成?

一个普通用户使用的桌面操作系统的组成部分主要包括:

  • 内核、驱动以及固件:主要用于驱动硬件可以正常工作,除了CPU、内存、磁盘外,最主要的是要广泛兼容不同的网卡、显卡、声卡和外设等硬件设备
  • 软件仓库及众多开发库:如果没有开源社区众多大神打包好的软件仓库和各种开发库,要基于Linux来开发一个操作系统甭说开源爱好者,甚至就是一个中型公司都很难做起来,可以说开源软件仓库从本质上改变了操作系统和开源软件的开发模式,丰富的软件仓库使开源开发者、组织和公司能够使用最新技术的同时开发成本也降低了很多
  • 桌面环境:这里说的桌面环境就是大家平常一开机就用到的桌面、任务栏和开始菜单等,可以说一个高质量和交互设计极佳的桌面环境可以极大降低用户使用新的桌面操作系统的门槛,具体表现在哪些方面,我后面会详细讲 ;)
  • 应用商店:对于用户来说,绝对不仅仅是一个好玩的桌面环境(比如原来的compiz) 就能留下的,没有好的应用商店带来的海量应用和方便易用的安装操作,普通用户用几天就会放弃,可以说应用商店是留住普通用户的最基本要求
  • 预装应用:在国内来看,至少需要解决QQ、Office、网银和一系列方便易用的多媒体应用才能算是一个好用的桌面操作系统

桌面操作系统所用编程语言介绍

桌面操作系统都需要那些编程语言呢?
就以深度桌面操作系统为例:

  • 服务型的后端都用golang语言: golang语言能够完美调用大量C语言编写的底层库,同时开发效率和运行效率都俱佳,写出来的程序很少会出错,深度桌面系统的后端主要使用的就是golang语言来编写的。
  • 前端界面主要用 Qt/C++ 来编写,因为Qt相对于Gtk有更好的技术支持、代码质量以及API延续性都要比Gtk+3好很多,深度采用C++来编写包括桌面环境和深度系列应用的前端界面

深度在2014年之前,自己做了一个WebKit/Html5的本地渲染引擎,可以直接用CoffeeScript像网页开发一样来编写桌面环境的界面,但是最后因为WebKit对于常驻性的桌面环境进程来并不适合,长时间不关机非常容易引起内存泄露和性能问题。包括2014年之前,采用的Python/QML来开发的应用都全部由 QtWidget/C++ 替换掉,主要是因为Python在国产CPU平台(龙芯、申威)上运行很慢,QML的解释特性和默认OpenGL渲染的机制都导致软件实际运行的性能不好。

深度这么多年几乎把所有的界面编程语言(Python、C、C++、CoffeeScript/JS、Golang)和几乎所有的图形界面库(wx、GTK+、Qt、WebKit、QML)都折腾过了。
最后停留在 Golang、C++、QtWidget 的技术选型上,因为这些技术不论从稳定性、兼容性还是性能都非常好。

什么是桌面环境?

桌面环境简单来说,就是在内核和X Server之上,写一批程序让用户登录后就可以直觉性、流畅的使用桌面、任务栏、开始菜单、文件操作和系统设置。

这个世界上从功能完整性和产品质量来看主要有四个桌面环境:

  • RedHat主导开发的Gnome, Gnome2的稳定性和性能都非常好,包括后面的Mint桌面都是衍生于Gnome2, Gnome3是我作为个人开发者来看最失望的桌面环境,Gnome3完全抛弃了Gnome2的稳定和性能,Gnome3除了性能和内存控制不好以外,API的胡乱修改导致这5年几乎没有任何重大的进步
  • Suse主导开发的KDE:可以说功能最为丰富的桌面环境,包括产品质量以及性能每年都在飞速进步,但从个人看比较适合技术折腾党,功能和交互做的太复杂不适合普通用户(比如那个超级复杂的主题设置)
  • Ubuntu主导开发的Unity: Unity身上还是可以看到很多Gnome2的影子,产品质量和性能都不错,Ubuntu自己独立开发了Mir、Unity桌面环境和一些全局菜单等独特特性,虽然很多开发者很喜欢,但是整体视觉都聚焦在左上角(默认看着很想一把转角直尺)的设计,个人觉得并不符合中国人的使用习惯
  • Deepin主导开发的DDE: 作为DDE的开发者,客观的评价,产品质量、设计视觉都符合中国人的习惯,很多地方的交互设计细节要比其他桌面环境做的更加精致和简单,主要面向开箱即用的非技术型用户,从功能设计上并不适合技术高手和那些本来就喜欢折腾的技术型用户

其他轻量型的桌面环境,比如LXDE、XFCE、Enlightenment虽然性能极佳,但是从桌面环境的功能完整性和交互设计的精致性上都不够,比较适合有一定技术深度,追求性能和自己配置多于开箱即用的技术型用户。

剩下的就是一堆平铺类窗口管理器,比如大家熟知的:awesome, i3, xmonad, dwm, stumpwm等等,这些窗口管理器型的桌面环境有300多个,我曾经为了研究所有桌面环境的特性,把这些窗口管理器都用过,最喜欢的是xmonad。这类窗口管理器的可以把个人的工作环境内存和性能消耗降到极低,而且可定制性极强,甚至可以通过编程来打造自己独一无二的工作环境。这类窗口管理器型的桌面环境比较适合开发人员和黑客,当然也不乏国内一大批装X用户。 ;)

桌面环境和那些换主题的工作差别在哪里?

可以说,桌面操作系统的核心技术和产品功力都聚焦在桌面环境上。
只有掌握了桌面环境这个古老而又深奥的核心技术,才能说在桌面操作系统上可以任意修改和改进,才能给用户带来更好的用户体验。

因为桌面环境强调的是从上至下全栈技术攻克,不论技术深度、技术全面性和代码工程量来说都是巨大的,开发一个功能完备的桌面环境需要20+人以上的团队工作最少2年以上才能打造出来,而且桌面环境的技术核心全部都依赖一批古老的协议,比如:x11、xcb、composite等基础技术,互联网上几乎没有文档教你怎么一步一步的构建桌面环境,现成的桌面环境因为发展多年,代码已经非常复杂,最多只能从核心代码片段有所学习。一个人要自上而下框架式的学习桌面环境核心技术并实现一套功能完备的桌面环境几乎不可能。

所以,大部分的Linux发行版都是基于Gnome、KDE改的,大多数都是在网上找一批主题(Gtk+主题、图标主题、光标主题、窗口边框主题、DM主题、锁屏主题)再配上一张好看的壁纸就可以做一套自己DIY的桌面环境。很多Linux社区的用户说,你看我自己都可以做桌面环境,甚至很多国内的Linux发行版厂商也是拿着社区的桌面环境然后换一套皮肤就去骗政府的钱,说自己是自主研发的操作系统(很可悲,这个世界上骗子永远比正直的人多)。

既然换套主题也可以很好,那么桌面环境和那些换主题的工作差别在哪里?
在我看来,主要在几个方面:

  • 核心技术能力:如果没有掌握桌面环境的核心技术,所有的修改能力仅仅限于修改主题、logo、字符串替换的能力
  • 产品质量无法保障:特别是有很多隐蔽性的bug,如果不掌握核心技术,连问题发生的原因都不知道,更不用提怎么解决
  • 设计细节:如果大家仔细看那些只是套用主题的桌面环境,就会发现外面看着还可以,但是很多按钮的颜色、留白以及控件的对齐都是有问题的,甚至是粗糙的,为什么?这是由GTK+的主题设计导致的,GTK+强调的是一套原生控件打天下,但是面对无穷的应用和需求,不是所有的交互都能靠一套控件才能满足的,在大多数Linux社区开发者不具备控件自绘的能力前提下,大多数开发者都选择套用不合适的控件和控件主题去拼装,而GTK+主题的作者不可能在制作主题的时候测试所有软件,而且从GTK+先天限制也做不到,最后导致不论怎么套用主题,各种软件拼装在一起,就像各种质量参差不齐的补丁拼在一起一样的,大多数开源社区开发者被虐很多年可以忍受粗糙的设计细节(我看到很多开发者喜欢黑色主题也是因为黑成一片就看不出来了,哈哈哈),但是对于普通用户来说,这种拼装的设计细节就像拿着当年的诺基亚和现在的iPhone7放一块的感觉那么强烈
  • 统一的操作接口:比如右键菜单、文件打开对话框、认证对话框等等,只有从深层次统一这些底层接口,才不会看到不同风格的右键菜单、文件打开对话框、认证对话框,这些都对于统一的桌面操作系统体验非常重要,想一想如果你自己买的iPhone各处都粗糙不一样,你会不会砸了它?但是为啥这么多开源爱好者就能忍受这些粗糙的东西?(因为自己没有花钱,花了钱你看他不把客服电话打爆...)

深度桌面环境是怎么构建的?

在说怎么构建桌面环境之前,先放三张深度桌面环境的图:

深度截图20170202162735.png
094325u3k3lym0yu034nc1.png
launcher5.jpg

是不是美哭了? 这就是自己从头构建桌面环境和只换皮肤主题的差别。

好了,前方专业技术高能, 请各位抓紧扶好,我要开始讲桌面环境架构了。
讲之前先放一张架构图:

深度桌面操作系统架构设计 (3).png

一个完整的桌面系统从技术剖面看,从下到上主要分这几层:

  • 内核驱动层:前面已经说了,主要是保障硬件的基本功能和兼容性,所有的Linux发行版都大同小异,差别就是内核补丁集不一样,或者集成的驱动和固件多少的差异
  • 显示服务层:从内核引导到plymouth(我们俗称的开机动画)后,只要你见到登录界面输入密码的时候,这时候X Server已经起来了, X Server简单来理解就是Linux系统中掌握着绘制图形界面生杀大权的“天神”,所有程序要绘制图形的时候都要发送消息到 X Server, X Server才会给你画出来。同时X Server也是事件输入(键盘鼠标)输出(显示器)的抽象层,开发者可以不用考虑底层驱动和显卡驱动细节,直接就可以使用X11/XCB的API进行应用开发,只不过更多的开发者是使用Gtk+/Qt这些在X11/XCB更上层的API进行应用开发
  • 显示管理器:简单的理解就是你看到的登录界面提示你输入密码的那个地方
  • 资源管理器:这一层主要由一系列的底层守护程序来监控硬件的状态,并汇报给上层的桌面环境和应用进一步操作,比如常见的就有网络、电源、磁盘、蓝牙、声音、键盘、打印等
  • 桌面环境: 以深度桌面环境为例,主要包括桌面环境后台服务和守护进程、桌面环境对外提供图形开发工具库、二进制工具、DBus API服务和桌面环境UI界面层几个部分组成的,后面我会详细讲每一个细节
  • 应用商店:主要提供系统的软件安装、卸载、升级等操作,保证用户可以安全易用的进行软件管理,同时提供了商店的评论和评分等功能
  • 应用程序:主要包括深度开发的系列应用、合作开发的国内应用、Android应用、Windows应用和网页应用,为什么在Linux可以直接运行Android和Windows应用? 我也后面再讲,嘿嘿

简单来说,桌面环境的设计和实现就是把所有底层抽象的硬件、库和各种各样的状态进行管理,最后通过界面的方式和合理的交互设计与用户进行交互,让用户可以自然、流畅的使用各种应用完成自己的工作。

这一章我只讲桌面环境的细节,像内核以及X Server的技术又是一个非常长的历史和篇幅, 请看官们自行Google内核以及X Server (X11、XCB)相关的文章来看,我就不展开叙述了。

关于应用商店和应用后面会详细讲, 所以这里我们就向大家详细描述一下从显示管理器到桌面环境都做了哪些事情?为了方便大家理解,全程不讲源代码,有开发经验的朋友可以直接去 github 上面查看我们的代码: https://github.com/linuxdeepin/ , 深度所有项目的源代码都是按照 GPL3 许可证实时开源的(只要内部代码审查机器人通过代码质量审查以后就会由机器人自动推送到 github )

深度截图20170202165633.png

首先看一下显示管理器,当X Server启动以后,根据系统启动服务的顺序,显示管理器就在 X Server 之后启动,深度系统使用的是由Ubuntu开发的LightDM, 其他主流的显示管理器还有 Gnome 的 GDM 和 KDE 的 KDM, 使用LightDM的原因主要是 LightDM 非常的轻量,不绑定任何桌面环境,而且提供Gtk+、Qt、Html5等各种前端界面的定制接口,非常方便。
显示管理器主要是根据系统中安装的用户的权限对正在登录的用户提供权限认证和多用户切换功能,一旦认证通过后就从 greeter (LightDM 定制的配置接口)中执行下一步启动程序(通常是桌面环境的初始化程序),以显示桌面环境。
Deepin 开发了一个基于Qt5的前端界面程序, deepin-greeter 主要长这样:

深度截图20170202170531.png

除了基本的用户认证、多用户切换、日期和关机功能以外,还会提供:

  • 多媒体的控制接口(右下角),方便用户锁屏和切换用户的时候切换音乐和暂停音乐
  • 当系统使用多屏幕时,启动和解锁时,会根据用户的鼠标位置切换锁屏主界面
  • 在用户输入密码的时候,就直接启动一些系统级的服务,比如电源、账户、亮度等守护程序,这样用户输入密码的过程很多系统服务就加载好了,可以相对于其他桌面环境同等服务缩短30%以上的登录时间
深度截图20170202170942.png

当显示管理器认证成功以后,就会调用 greeter 的 exec 参数,深度桌面环境就是 startdde, startdde 从名字看很容易理解,就是启动深度桌面环境的引导程序,为了让深度桌面环境可以正常启动和显示,startdde调用时会执行以下操作:

  • 基本的桌面会话管理,比如大家熟知的注销、重启等操作
  • 按照 xsettings 主题规范设置整个系统的主题,保证桌面环境以及桌面环境的应用,不论Gtk+还是Qt可以正常的加载用户设置的主题。屏幕DPI设置也是在这个阶段初始化完成的
  • 根据 freedesktop 的各种规范,规范应用程序的启动方法, 包括执行 *.desktop 文件的命令,启动提醒等
  • 多屏的管理,保障桌面环境在多屏情况下,可以在正常的主屏显示任务栏和桌面程序
  • 开机启动服务的顺序管理,比如会优先启动 dde 核心组件, 才运行启动其他应用程序,防止所有开机程序在登录的一瞬间同时启动,而这时候往往很多系统服务(比如DBus) 都还没准备好,大家一团乱抢CPU资源不但无法快速启动,还会导致其他程序都无法启动,想象一下3个人同时挤一个公交车门是什么状态? ;) 这时候startdde 就是登录后到dde守护进程启动之前的裁判,只有它授权的程序才能启动, 没有授权的都进入暂缓状态,直到更优先的程序启动完毕

startdde 启动以后,首先会启动 dde-session-initializer 这个进程,这个进程的主要目的是提供给任务栏和启动器后台服务,主要包括:

  • 任务栏和启动器都有那些常驻程序
  • 所有应用程序的启动状态维护
  • 应用程序所在工作区和位置的状态维护
  • 当前系统中所有安装应用程序的图标、启动状态维护

dde-session-initializer 就相当于任务栏和启动器的后台守护进程,提供了任务栏和启动器的核心功能,如果没有这个程序,我们日常的应用图标点击、开机启动包括程序窗口的切换都无法进行。
dde-session-initializer 本来是 dde-session-daemon 的一部分,为了加快用户的登录到桌面的速度,从 dde-session-daemon 中分离出来,用以加速任务栏和启动器的显示。

dde-session-daemon 和 dde-system-daemon 就是整个桌面操作系统的后台守护程序,这两个进程维护了所有硬件的状态,包括前面说的网络、电源、磁盘、蓝牙、声音、打印、授权、共享文件、键盘鼠标等,相当于对资源管理器的各种守护进程进行了更高层次的代码封装,把面向底层硬件的状态的接口转换成面向用户设计导向的接口。
根据Linux的最小权限划分,又把所有的后台服务分成 dde-session-daemon 和 dde-system-daemon 两个进程,dde-session-daemon 只掌握那些不需要超级权限的功能模块,比如声音、键盘鼠标、日期时区等。dde-system-daemon 掌握那些需要超级权限的功能模块,比如电源、账户、文件操作、亮度等。通过超级权限的不同进程沙箱的划分,保证执行超级权限的进程被限制在最小化的范围,避免因系统权限传导而导致的很多安全事件。

dde-session-daemon 和 dde-system-daemon 做的事情我简单列举一下吧:

  • 提供用户的创建、删除和管理功能
  • 管理多个屏幕的不同状态,包括位置、方向、分辨率和亮度等
  • 管理不同文件类型的默认程序和主题设置
  • 管理网络的有线、无线、VPN、DSL等网络设置
  • 管理蓝牙、声音、日期、时间时区等设置
  • 管理电源、键盘鼠标设置
  • 管理系统的升级和grub设置
  • 提供多点触摸板手势的服务

dde-sessin-initalizer、dde-session-daemon以及dde-system-daemon从功能上,相当于Gnome的 gnome-session-daemon 所做的事情,只不过深度团队根据用户的需要以及很多优化加速设计,用 golang 重写了整个后台守护进程的代码。可以说 DDE 和 Gnome以及KDE一样,都是调用底层的库(network-manager、upower、udisk、bluez、pluseaudio、cups、polkitd、gvfsd) 对桌面环境和应用提供更为抽象和高级的服务。

备注: 很多社区的开发者经常质疑DDE就是基于Gnome的UI壳,没有自己的核心技术,希望懂编程的朋友查看深度的源代码 https://github.com/linuxdeepin/dde-daemon , 看看是否只是一个 Gnome 的壳。我非常尊重每一位技术开发者,但是真的对于那些完全不基于调查,只是简简单单基于对国内开发团队鄙视而轻言下结论的人感到痛心,这也是我今天写这篇文章的原因之一,希望国人基于事实支持好的产品和团队,停止一切不实的攻击和乱喷。

深度截图20170203103240.png

在深度桌面环境的后台守护进程基础之上,桌面环境会对外提供一个API层,包括图形开发工具库、二进制工具和DBus API接口,供桌面环境和应用程序直接调用,而不用自己重头开发,其中DBus API部分都通过DBus总线在应用调用特定的接口时动态唤醒(默认不常驻内存),任何语言编写的应用都可以轻松调用,根据上面图所示,从左到右分别进行介绍。

DTK:
DTK (deepin tool kit) 是基于Qt5开发的一整套UI图形库,方便统一的编写深度桌面和深度系列应用,主要的功能有:

  • 提供单实例的接口,方便直接使用,不用造轮子
  • 提供XCB窗口移动、缩放等一系列函数,无边框的窗口不用自己折腾几大本X11/XCB 的书了,开发者全部都做好了
  • 提供一大票美观的自绘控件,不用自己造Qt控件了,拉着直接用

感兴趣的开发者自己看源代码吧: https://github.com/linuxdeepin/deepin-tool-kit , 基于我们的DTK比直接基于Qt5开发,能够更快的开发出美轮美奂的产品, 同时也欢迎社区开发者大神吐槽和提交补丁。 ;)

dde-api binary utils:
这一层主要是 dde-session-daemon 和 dde-system-daemon 在开发过程中发展出来的二进制工具,方便深度桌面环境以外的应用可以直接使用这些工具,减少核心技术的重复开发:

  • greeter-helper: 提供锁屏界面的语言, 键盘布局, 主题等内容的设置接口
  • image-blur-helper: 提供壁纸模糊服务,你可以通过这个服务快速模糊一张图片,而不需要自己编写模糊算法,深度团队做的模糊算法,即使在龙芯芯片上都只需30ms的时间,要远远快于社区的模糊代码的性能
  • lunar-calendar: 提供日历查询服务
  • powersupply: 对电源接口的更高层封装, 使用 udev 来获取电源状态以及电池信息
  • soundutils: 提供了播放桌面音效的相关接口
  • validator: 用户名正确验证器,不用自己编写一大堆正则表达式来做这件枯燥的事情
  • cursor-helper: 提供了光标主题的设置接口
  • drandr: 对 x11 randr api 更高级的接口封装, 提供显示器的详细信息
  • dxinput: 对 x11 xi/xi2 api 更高级的接口封装, 提供输入输出设备的属性获取及设置功能
  • 后面还有很多其他高级服务,都是由 dde-api https://github.com/linuxdeepin/dde-api 提供的,欢迎各位社区开发者研究,扩展其玩法

dde-daemon dbus API:
这一部分主要是由dde-session-daemon和dde-system-daemon提供的DBus接口给深度控制中心前端界面使用的,外部应用程序也可以直接使用这部分API来快速开发,而不用自己研究和编写与系统底层软硬件打交到的代码,简单的说几个功能,感兴趣的朋友可以直接查看深度控制中心的界面代码来玩(https://github.com/linuxdeepin/dde-control-center):

  • 查询当前系统有几个屏幕,哪些屏幕是主屏,分辨率是多少?
  • 查询当前系统的语言、亮度、音量等设置
  • 查询当前系统的网络链接状态:连接的是无线还是有线,有没有开启VPN?
  • 查询当前系统的日期时间、时区、键盘鼠标等外设的状态
    只要控制中心界面显示的所有硬件状态,都可以通过dde-api提供的DBus接口服务查询到,而这些DBus API后面的源代码都是深度操作系统研发人员经过非常多的时间打磨好的,不用自己痛苦的去裸写底层库(network-manager、pluseaudio、bluez、upower、udisk等)代码,大大节约了应用开发者编写高级功能的时间和投入成本。

说到用户体验的一致性,包括右键菜单、对话框、认证密码框这些看是小的地方(也是90% linux开发者不屑的地方),给用户带来的体验是最深刻的,一个产品的质量不光是你大老远一看很美或者主题很美,很多小细节的地方做好,才能得到用户的尊重。用户用到这些小细节的时候,会知道后面是一群用心的人在做事情,而不仅仅只是写个功能丢在那里就完事。

深度截图20170203101157.png

深度桌面环境的最后一部分就是深度桌面环境的UI展示层,主要有:

  • dde-wm: 窗口管理器,我们写了两个窗口管理器,根据用户的硬件性能和显卡驱动情况自动使用2D窗口管理器还是3D窗口管理器,像Gnome的话,你还要手动注销(关闭所有窗口)才能在3D和classic模式中切换,而深度桌面环境完全是自动的。每个工作区可以单独设置不同壁纸:
174415o3zi1puiuz1ede2i.png
  • dde-desktop: 桌面模块,基本的文件网格对齐功能,拖动文件会自动进行网格对齐,很多桌面就是简单的一个壁纸然后还要费劲的人工对齐,还有下面这种换壁纸的方式,轻轻一点就行了, linux最简单的换壁纸操作:
深度截图20170202180050.png
  • dde-dock: 不论你喜欢Mac还是Windows风格的任务栏,都可以随时切换
  • dde-launcher: 不论你喜欢Mac还是Windows风格的开始菜单,都可以随时切换
深度截图20170202162735.png
launcher5.jpg
  • dde-control-center: 深度控制中心,到底有多方便, 我一会在下面说 ;)
  • dde-osd: 当按下音量、亮度等多媒体按键时在屏幕中间显示快速提示
  • dde-lock: 提供系统的锁屏服务
  • deepin-menu: 统一所有软件右键菜单的UI细节
  • deepin-notificaiton: 通过右上角提供系统的通知服务,根据不同应用显示不同的快速跳转按钮
  • deepin-policykit-agent: 主要按照深度的UI设计规范做个了密码认证对话框,保证所有程序,不论是Gtk+还是Qt写的,在密码验证的时候都弹出UI细节一模一样的对话框
  • deepin-icon-theme: 世界上风格最统一,数量最多的图标,我们把应用商店上千款应用的图标全部画了一遍,不要拼装图标,不要拼装图标,不要拼装图标,欢迎围观: https://github.com/linuxdeepin/deepin-icon-theme/tree/master/deepin
  • deepin-gtk-theme: 主要是针对深度自己的设计规范来重新制作的整套窗口主题(Gtk+2、Gtk+3、Qt4、Qt5)
  • deepin-default-settings: 深度桌面环境默认的设置,比如默认的壁纸、图标主题等默认设置
  • qt5-integration: 给Gtk+和Qt源码编写了补丁,保证所有程序弹出的文件打开对话框都是完全一致的体验(如下图所示),不论是Gtk+还是Qt编写的程序,再也不用为不同图形库开发的程序弹出不同风格的文件打开对话框这种事情烦恼了
深度截图20170203104130.png

为什么要自己写桌面环境?

很多人都在问我, 为什么深度要自己写桌面环境,其实回答很简单:

  • 我希望给用户提供交互细节最简洁的操作体验,傻瓜式操作,不需要长时间学习
  • 我希望用户会因为UI细节精致的Wow一声, 就像第一次看到iPhone一样
  • 我希望用户看到很多贴心的小细节时,会觉得操作系统后面有一群人关心他们,贴心的功能会让他们会心一笑,而不是面对一台冰冷冷的机器

如果不自己写桌面环境,就达不到这些严苛的要求:

  • 我要能改每一像素,只要用户觉得不爽,一切都是用户为向导,而不是以开发者的个人喜好为导向
  • 快速改进,很多社区开发者都说你应该给Gnome或KDE提交补丁,对不起,明明可以10分钟做一个用户喜欢的功能的时候, 却要和各种专家开发者讨论1个月才合并补丁或者上游开发者根本就不理,Linux桌面就死在改一个功能慢的要死,最后大多数用户失去耐心,不陪你玩无奈的离开了
  • 统一的交互体验,统一的设计语言, 不要拼装,很多linux老用户除了宣扬开源文化和民主的决策(其实每个项目都是由创建者独裁)外,甚至拿着一大堆各式各样的社区demo作品美曰“社区协作”,深度只想系统和所有应用是能够堪比Windows/Mac的产品质量的艺术品

当很多社区开发者数以十年的只赞扬开源文化和协作的时候,我真想说,世界要让更多普通用户接触和认可Linux的情况下,开源文化才能更快更广泛的推广, 而不是偏执的自虐以后,自欺欺人拿着质量参差不齐的应用去洗脑那些不认同的普通用户,洗脑不行就开始鄙视和嘲讽。

其实做一个简单的类比,如果有人让你买一部丑到爆,难用到要死的手机,但是告诉你这手机里的每行代码都开源的,有多少人会真正买?我想大多数开源爱好者自己都不会买

很多时候,往往简单的换位思考就会认清开源社区的种种问题...

深度桌面环境的交互细节以及横向对比

下面我只简单的举一些深度桌面的小细节来说明为什么做桌面环境的必要性,以下这些特性不是什么黑科技,也不是深度才独有的,但都是研发团队通过用心思考,研究用户的痛点,通过简单的设计就能解决用户的问题,而不是浪费用户几小时甚至几天的时间去“忍受”系统。

  • 默认折腾好QQ、字体设置、解码器:不用装好系统满世界折腾Wine、粘贴xorg配置和下载不知道包名叫啥的解码器
  • 屏幕旋转不用歪着头逆天的移动鼠标:注意看下图,系统进行屏幕方向设置的时候,会弹出一个全屏界面,向左旋转就点一下鼠标左键,继续旋转的话就继续点鼠标左键,什么时候旋转好了,点击鼠标右键确认。旋转屏幕的时候,全程不需要歪着头,也不用拿着鼠标晕头转向的找“确定”按钮,这个问题,即使Windows和Mac都做的非常不好, 其他linux系统也一样,有人仔细研究了这个二十多年的非人类痛点了吗?我始终认为,这才是一个桌面研发团队应该关注的,通过小小的创新就可以解决用户的大痛苦
2LTt1RD0Hv0IXlhD.jpeg
  • 边界值的时候要有吸附功能: 注意看下图,当选择声音左右平衡时,不论左、右还是中间平衡那点,只要在周围 -5px ~ 5px 的范围都会自动吸附到左、右、中间的那个点,用户即使触摸板或鼠标不好用,都不会发生在平衡点左右差一点的位置来回晃(同时拖住不放就可以精确调整),这也不是什么大功能, 但是每个用户都会遇到这种不爽的操作


    7声音.png
  • 设置时区的时候显示白天黑夜:当你添加其他时区时,除了提示比当前快还是慢,一眼就可以通过表盘判断当地时间是黑夜还是晚上


  • 不要在世界地图上费劲的找一个点:注意看哈,当你在欧洲那一块选择城市时,因为欧洲的城市在地图太密了(比如梵蒂冈),根本就无法快速选择,这时候你随便一点,当发现鼠标周围太多城市时,就会弹出一个菜单列表,把鼠标范围的城市都弹出来让你选择,你只需要轻轻松松两下鼠标就可以选择时区城市,再也不用辛苦的去找蚂蚁那么大点的城市, 这种事情我好像没有发现别的系统在关心用户


    1T90d6RoIDc3CJ5D.jpg
  • 打字时禁用触摸板: 国内好多性价比高的笔记本触摸板很容易误碰,手掌一不小心就碰到触摸板导致光标乱飞,你只要开了这个开关,打字的时候触摸板就不响应,你打字一停马上就可以响应,这样就可以解决硬件的问题,当然你也可以写一段脚本然后添加到开机服务中折腾半天,而在深度桌面环境,只需要一个开关的事情


    16SHzxnm3SsIWyZY.png
  • 开机画面轻轻一拖就更换了: 在深度控制中心中,看到你喜欢的壁纸自动拖拽一下就可以自动设置,想象一下你打开 grub-customizer, 首先要求壁纸的分辨率是对的,然后宽高比也要对,否则设置出来就是各种黑边。为啥深度里面一拖就可以? 控制中心发现你的图片和屏幕宽高比不一样的时候会自动裁剪上下或者左右的部分,然后设置一张分辨率和宽高比和屏幕一模一样的壁纸,一个要折腾10分钟,一个只需要5秒钟


    e4CGn9wNoBklLqVy.png

像这种贴心的设置,在深度桌面环境中随处可见,而这些交互细节的背后需要的是对用户场景的思考、换位思考理解用户痛苦以及完全掌控所有代码才能做到。
我一直都相信:好的系统是让用户觉得不多不少,刚刚好,而且很贴心。而不是堆砌满屏的开关选项,让用户看着就头疼,再天书文案纠结半天都不知道怎么做。

深度商店


深度商店是Linux下第一款有产品质量和交互体验优秀的应用商店,以前的社区的都只能叫软件管理工具。
这里你可以看到的所有高质量的软件都可以搜索,一键安装使用,再也不用自己折腾 myeclipse、sublime、 shadowsocks-qt5、迅雷、RTX等各种应用,所有软件都默认打包好放到软件仓库,也不用担心添加了哪个质量不佳的ppa把系统搞死了,所有的依赖默认就调好了,装完就用。

除了支持深度系列应用, 还通过 deepin-wine 支持50+多款Windows应用,通过内置 Android runtime支持200+多款Android应用(比如愤怒小鸟,各种视频客户端),通过和Intel合作开发 deepin-xwalk 直接支持html5应用(比如Gliffy等)还可以自己记住窗口大小(而不是打开一个贼大的浏览器)

所有deepin对Wine上游的代码级贡献大家都可以在 https://www.google.com.hk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#newwindow=1&safe=strict&q=deepin.com+site:winehq.orghttp://source.winehq.org/git/wine.git/?a=search&h=HEAD&st=commit&s=deepin 公开查询到
很多社区开发者说,我们用社区的Wine也能跑QQ, 为啥要用Deepin? 我只能说的是,社区版的Wine如果没有deepin这几年的贡献,你啥都跑不了,不管你换什么linux发行版。

这么多年deepin自己开发了几百万行GPL3的源代码,向上游贡献了无数的 commit, 我们更在意用户体验和功能更新,不想去比什么commit刷屏,但是一次又一次的被喷子们用各种逻辑瞎喷,希望这些喷子看看我们的代码再来喷我们。

深度截图20170203101553.png

深度应用商店从技术架构上,主要分为lastore-daemon、lastore-session-helper、deepin-appstore三个部分:

  • lastore-daemon: 应用商店的核心部分,主要负责所有软件的安装程序的下载、哈希安全校验、依赖分析、本地缓存管理、软件安装、软件卸载和软件升级等工作,这个守护进程会和深度的软件仓库智能的通信,在后台保障整个操作系统应用的更新和安全守护。lastore-daemon同时会在 apt/dpkg 程序中加入钩子,不论用户是从应用商店还是终端中安装的程序都会被商店守护进程管理和保护,避免一些高级用户从终端安装以后把系统的依赖弄坏
  • lastore-session-helper: 上面说的lastore-daemon默认就会有超级权限以进行软件包的管理,但是一些普通的用户会话级的操作,比如安装成功以后通过右上角通知提醒用户,本地化管理这些操作都是不需要超级权限的,为了最小化超级权限代码的执行范围,最大程度保证用户安装软件的安全,开发者就从 lastore-daemon 中剥离了这部分代码放到lastore-session-helper中以普通权限来执行
  • deepin-appstore: 这个就是大家上面看到客户端部分的代码,简单来说就是一个CEF框架基础上构建的应用程序壳,处理客户端本地的用户交互然后嵌入一个网页,商店的服务器一旦更新了新的软件后,就会通知deepin-appstore进行页面刷新。还包括评论、评分等操作的界面接口。从技术的角度来形容,deepin-appstore就是一个具有本地客户端操作和样子的简易浏览器

深度造了哪些应用?

除了深度桌面环境和应用商店,我们自己截止到2017年1月,深度自己还造了15个精品应用和3款厂商联合开发应用,下面我只说每个应用的关键亮点,更多的细节只能感兴趣的用户自己体会了 https://www.deepin.org/original/

深度安装器:

w5lHLhyRd1IgMUL1.png
EkpcTsDu8vE3doxo.png
bk4SJmc6hHwbQPHQ.png
  • 如果你在有wifi的地方,安装器不用连接网络,自动从路由器中找出国家码设置时区,不需要网络连接和GPS就可以准确知道用户在哪个时区,不需要让用户手动设置时区
  • 安装linux不需要知道分区知识,不需要知道 /、/var、/boot、/home、swap啥概念,选择任意空白分区即可安装,还可以根据内存大小自动选择是否设置swapfile(大内存不设置加速读取,小内存自动算swapfile最佳大小,当然也可以手动设置swap分区)
  • 安装错误了,扫描二维码的时候就自动上传错误日志了,不需要来回倒腾错误日志

深度启动盘制作工具

深度启动盘制作工具
  • 不需要研究各种U盘参数、引导参数,选择ISO文件,选择U盘就可以直接制作U盘启动安装盘
  • 系统安装盘里包含了Windows安装器,可以直接安装在windows xp/windows 7/windows 8/windows 10的NTFS分区安装深度操作系统

深度文件管理器

  • 经典的文件操作方式, 没有坑爹的设计
  • 基于rlocate开发了内核模块,2TB的文件名2秒中搜索完毕,而且会根据文件添加删除启动实时维护搜索索引,不用手动定期更新索引
  • 内置avfs模块,所有压缩格式文件管理器秒开,而不用等漫长的解压时间和额外解压的磁盘空间
  • 未来版本直接扫描二维码下载文件到手机(或者反过来玩),不用连上USB后在不同目录来回穿梭

深度显卡管理工具

1.png
2.png

Linux 的私有显卡驱动如果安装失败,会导致图形环境直接崩溃,无法输入密码进入桌面,如果不是Linux技术专家,普通的用户完全没法正常卸载私有驱动和清理内核动态模块,甚至还需要修改一些Xorg配置才能修复好系统重新进入桌面。

深度显卡管理工具的做了几个核心的功能:

  • 提供开源驱动、私有驱动等不同的显卡驱动方案,供用户快速选择
  • 利用文件系统的 overlay 技术,如果私有显卡驱动安装后,会自动对图形进行测试,如果失败,会自动把文件系统恢复到安装私有显卡驱动之前的状态,即使显卡驱动安装失败都可以快速恢复到正常的系统状态进行使用,大大提高了私有显卡驱动的切换成功率和自动恢复的能力,在没有彻底解决显卡驱动硬件兼容性的前提下,可以最大程度的帮助用户安全的切换显卡驱动

深度演示助手

deepin-presentation-assistant-cn1.png
deepin-presentation-assistant-cn2.png
deepin-presentation-assistant-cn3.png
  • 提供了图片分享、PPT演示(手机变成翻页器)、手机屏幕投屏的功能
  • 在企业开会或者老师上课的时候,都可以快速分享手机的内容到电脑屏幕上

深度备份还原工具

1-1.png
2 (1).png
  • Linux下易用性最佳的备份还原工具,基于 libclone 库(CloneZilla也是用这个库实现的),基于磁盘扇区来备份和还原
  • 提供了磁盘、分区的备份和还原功能
  • 如果备份系统分区,会自动重启进入 Live 系统进行系统分区的备份和还原操作

深度截图工具

project-screenshot-1.png
  • 类似QQ截图体验的截图工具,Linux下最好用的截图工具,不解释

深度录屏工具

deepin-screen-recorder2_zh.jpg

深度录音工具

2-cn.jpg
  • 即使一个小小的录音程序,每一个交互流程和细节都要做的精致

深度影院


deepin-movie-1.png
  • 无边框沉浸式观看影片, 只有鼠标移动到顶部或底部才显示控件,看电影最重要的是内容
  • 窗口跟随视频比例缩放,永远没有黑边
  • 最小化窗口切换到其他应用时自动暂停,切换回来后继续播放

深度音乐

project-music-3.png
  • 简洁的音乐播放器,可以放无损音乐
  • 自动解决歌曲乱码,不用自己折腾
  • 自动下载歌曲歌词和封面,专心听音乐就好

深度看图

deepin-imageviewer-3.png
  • 自动同步图片目录,不用在目录树中眼花缭乱的找,自动根据图片拍摄时间按时光机排序
  • 简单美观看图功能,其他乱七八糟功能没有

深度终端

deepin-terminal-1.png
  • 同等功能的终端,启动速度最快、内存占用最小
  • 类似Chrome的沉浸式体验,除了标签以外每一像素都只显示终端的内容,内容至上,不用无谓的控件喧宾夺主,让用户更加专注
  • 当发现后台工作区的任务完成后, 会通过标签的颜色及时通知我们, 只需要瞟一眼终端标签就可以知道后台任务是否完成, 彻底告别人肉轮询命令的时代了。 ;)
  • 自动识别光标下的连接地址, 只需右键就可以快速复制光标下的连接地址, 当然也可以 Ctrl + 左键快速用浏览器打开连接
  • 内置分屏,不用学习tmux/screen也可享受分屏的高效
  • 内置远程服务器管理功能, 更方便的管理数千太台远程服务器,linux运维人员的福音
  • 支持点阵字体显示

深度系统监视器

5957-85f90ad9b3de39b2.png
  • 系统资源监控和进程列表放在一个页面中,用户不用为了找最占资源的进程来回在两个标签中切换
  • 除了监听CPU、内存外,对每个进程的网络IO和磁盘IO都进行监控,最快的速度查找出后台占用带宽的进程
  • 把图形化应用程序、我的进程和所有进程用三个标签分出来,平常使用的时候只用查看第一个标签就可以管理图形化应用程序,不用在进程的汪洋大海中来回滚屏
  • 提供图形化的进程终止功能,点哪杀哪,再也不用看着僵尸的应用,不知道进程列表中叫啥的那种不知所措了
  • 智能的分析进程命令所在的位置,轻松知道各种程序安装在什么地方

更多关于深度系统监视器的技术细节可以查看:http://www.jianshu.com/p/deb0ed35c1c2

深度远程协助

project-remoteassistance-1.png
project-remoteassistance-2.png
  • 6位数字就可以快速帮助别人和寻求别人帮助,没有比这更简单的远程帮助工具了

深度手册

deepin-manual2.png
  • 图文并茂,markdown的语法,方便社区协作,美观易度

深度云打印/深度云扫描

![project-cloudscan-2.png](http://upload-images.jianshu.io/upload_images/5957-309a61d3871ab835.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
  • 企业用户,内网直接支持所有打印机和扫描仪

深度取色器

01-255x150.jpg
02-255x150.jpg
  • Linux 下操作最简单的屏幕取色器
  • 可以高性能实时取色,比如光标下有

深度开源字体

deepin-opensymbol1.jpg
  • 社区中吵了十几年的Office排版字体,要不就是吐槽,要不就是拷贝微软版权字体,没有人站出来解决问题。5个版权字体,上千个符号,我们一个一个字体,自己重新画了一遍,然后开源给大家免费使用,行动才能推动开源,而不是靠嘴

deepin-emacs

deepin-emacs2-1.png
f60d05d0-8c1e-11e3-98c7-a14fa75e3ff7.png
  • 我十几年的Emacs插件和贴心配置,那时候还没有 spacemacs 存在呢: 那些鄙视deepin只会开发图形应用的喷子, 命令行操作先超过我再来喷吧, https://www.emacswiki.org/emacs/AndyStewart , 我Emacs做任何事情全程不用一下鼠标

对上游社区的贡献

深度操作系统的发展是站在上游社区的基础之上才能走到今天,除了我们自己开发了数百万行代码的原创开源项目外,我们深知只有秉承 “取之于开源,回馈予开源” 的开源理念,才能将我们自己的代码和功能改进回馈予上游开源社区,才能更好的推动全世界的开源运动向前不断发展。

深度团队对于上游社区,比如Wine、Emacs、Gtk+、Miracast都做了非常多的贡献,比如Miracast电脑向电视投射的功能就是Deepin团队主导开发的。

更多对上游社区的代码贡献可以查看https://www.deepin.org/developer-community/community-contributions/ 所有代码都是在GPL3的协议下进行贡献。

国内生态应用

推动国内开源社区的发展,光靠自己开发系统和应用远远不够,还要联合国内顶尖的软件厂商开发Linux版应用才是未来,下面举一下deepin在应用生态的贡献:

  • 2013年联合搜狗开发了搜狗输入法 for Linux
  • 2015年联合网易开发了有道词典 for linux
  • 2016年联合网易开发了网易云音乐 for linux
11293849zi444azmi33e9g.jpg
7fe698e9d1c9f041fc1bc9b8c899fb60_b.png

开发这些应用,深度投入了巨大的财力人力不求回报,只求国内的linux用户能够更加幸福一点,我们未来会联合国内的厂商开发更多的Linux应用,我们坚信Linux生态普及的那一天。

为什么开源的轮子不能用?

深度造了那么多轮子,为什么不用社区的?

  • 社区技术大拿很多,但是技术强大的同时能把一个应用的UI和交互细节做好的开发者鲜有
  • 社区大部分软件都是面向开发者,功能确实强大,但是对于小白用户来说太复杂了
  • 深度希望十年之内解决linux桌面的问题,我们内部每天几百个commit的快速迭代,社区主导开发完了花都谢了
  • 希望做出来再吹牛,不想天天在社区打嘴泡

十几年开源社区为什么做不好桌面?

  • 主要用户群体是开发者,大多数开发者喜欢黑客般的各种功能堆在一起,而普通用户只需要简单易用的产品
  • 太过于碎片化:大家不齐心,每个人都造半成品互相打压,没有形成合力,最后社区除了大量的半成品,并没有多少应用能够比Windows软件更好(真正能和Windows平台堪比的应用不超过50个)
  • 鄙视小白的氛围不好,技术稍微好一点的人就打击小白用户,大量真正的桌面小白用户走了以后,最后导致大家都不关心桌面的细节体验
  • 做的太少,说的太多,有行动,10年就是翻天覆地变化,而不是大家时间长了都失望了

开源社区擅长什么?

  • 开源社区适合做远程协助,碎片化的事情,比如文档和翻译,深度社区全世界的翻译贡献者就超过300多名: https://www.transifex.com/linuxdeepin/public/ , 曾经创造西班牙语一星期就翻译完整个系统的奇迹
  • 开源社区适合吐槽, 我说的是客观的吐槽,https://bbs.deepin.org/ 各种用户帮助开发团队发现更多测试版的bug和非常非常好的反馈建议
  • 开源社区适合打包移植, https://www.deepin.org/dde/desktop-transplantation/ 目前深度桌面已经移植到 Arch, Manjaro, SparkyLinux, openSuse, Ubuntu, Gentoo, Fedora 等发行版

国内技术圈偏见

我在开源社区十几年看到国内技术圈很多偏见,最主要的有几个:

  • 拿着自己的平铺式窗口管理器装X,鄙视小白用户:其实玩过的人都知道,就是一些配置,花一些耐心和毅力就能搞定,这些只能证明你比较能折腾,但折腾并不代表你的学识渊博和能力高超,更不是鄙视和嘲笑别人的资本
  • 认为只有玩内核才是技术高手: 不懂linux的人这样认为,很多开发者也这样认为,真正开发内核的开发者都知道,内核开发和应用开发和其他任何开发都一样,唯一的不同就是更难调试,更复杂。不是只会内核开发的开发者才是最厉害的人,很多内核的开发都要和应用以及现实场景配合才有意义。更不是自己会编译内核就开始了不起了
  • 认为做UI和桌面环境很容易: 其实很多嘲笑做UI的人,即使是一些开发者,我相信大部分人连XCB以及窗口移动,甚至窗口阴影都绘制不出来,在国内看到太多拿着无知当权威的喷子了,希望这些人长大以后学会谦虚。其实大家都是看着功成名就来评判的,苹果应该是这个世界上折腾UI细节最多的公司,但是没有人说苹果只会UI,为什么?国人就喜欢打压还没有成功的公司,然后跟风吹捧成功的公司和产品
  • Linux就是应该折腾: Linux早期的折腾对于开发者来说是非常有帮助的,但是人都有会老,都会累的那一天(要不是为什么达拉斯黑客大会那么多大牛最后用Mac, 是因为他们折腾没有你多吗?),一旦折腾完Linux就应该花更多时间去学习新的知识或享受生活, 而不是一直都在折腾,然后鄙视不会折腾的人

前途漫漫,还需努力

深度从2004年到现在已经努力了13年了,未来还有很长路要走,希望最终的努力可以达到两个目标:

  • 让国内喜欢开源的开发者能够做自己喜欢的事情,养活自己,养活家人
  • 功能像Windows那样丰富,界面像Mac那样美观,而且源代码还全部开源, 帮助更多人学习开源技术

希望对中国的开源社区做出更多贡献

希望大家看了我的文章,好好努力,多多为开源社区做力所能及的贡献!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,544评论 25 707
  • 这几天看到 Ubuntu 放弃 Unity 和 Mir 开发,转向 Gnome 作为默认桌面环境的新闻,作为一个L...
    ManateeLazyCat阅读 67,284评论 97 277
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,595评论 4 59
  • 还没开学,就忙碌了一天。从清早醒来去上班,到现在晚上十点半,盘点一整天工作,听了初中教职工大会,年级会,班主任会。...
    枫儿a阅读 966评论 8 23
  • 恍惚间,我都毕业两年了,两年来我也换了好几份工作了。我的学历是大专,新闻采编与制作专业,我梦想成为一名journa...
    空灵的雪阅读 219评论 0 0