我开发了一个基于 Beancount 的账本托管服务 HostedBeans,欢迎大家来了解纯文本复式记账并试用我的服务。
标签 #技术

展望 RootPanel 3

昨天 hk1 低调上线,用的依然是 RootPanel 2.0.

本来是打算稍微做点更新,然后在 hk1 上装 RootPanel 2.2 的,但是一方面是因为 hk1 的服务器已经闲置了一个月了,实在等不起了,一方面是我又有了些新的想法。

总之 RootPanel 2.2 算是坑掉了,准备今年 12 月份,RP 主机一周年的时候,直接上 RootPanel 3.

定位

为什么会有 RootPanel 3 呢,因为我觉得到现在,RP 主机的目标定位已经比较明确了,我也希望把 RootPanel 做成一个通用的虚拟主机管理系统。

现在的 RootPanel 2, 虽然我做了很多努力,但是我当然相信不会有任何人在自己的服务器来用,因为现在的 RootPanel 根本就是为 RP 主机设计的嘛。

RootPanel 3 的定位是一个轻量级的,通用的,透明的,充分利用 Linux 机制的,基于 Linux 和 Nginx 的多用户虚拟主机管理系统,一定要简单和 KISS.

我瞧过几个类型的虚拟主机管理系统,比如 Usermin, AMH.

前者过于复杂,中文本地化支持不是很好,UI 不咋样,后者似乎是专为 PHP 优化的,Linux 和 Nginx 的很多功能都无法使用。

RootPanel 3 要简单,只加入必须的功能。

至于压缩文件,一键安装,备份什么的,一概不管,自己用 SSH 跑就是了。

相比于目前的 RootPanel, 我要删掉 PPTP 支持,删掉「试用版」和「额外技术支持版」。

至于 RP 主机需要的一些功能,比如首页的宣传页面,今后要加入的支付宝担保交易接口,我一定要以插件的形式来实现。

RootPanel 3 还要 KISS.

最乱的部分就是 Nginx 的配置文件设置,如何才叫 KISS 呢?

当然是让用户手工来写配置文件,RootPanel 来做检查。

我也希望借此对 RP 主机的用户做一个细分,目前的有些用户不够 Geek, 我认为 RP 主机不适合他们。

这样的 RootPanel 3, 我觉得在 Geek 中间,尤其是多人合用一台服务器的情况下,是非常适用的。

功能

  • 中文英文双版本——我真的想成功做一个国际化的项目
  • 集成 PHP-FPM 和 MySQL 的管理——太常用了
  • 两大核心——工单系统和 Nginx 配置文件解析
  • UI 继续使用 Bootstrap 2.x 分支
  • 完整的邮件通知和 Markdown 支持

其他细节

  • 当然会用 LightPHP v6
  • 打算尝试一下 Jade 的 PHP 版本,以及 Markdown 的 PHP 版本
  • 授权可能要改成 GPL
  • 初步只打算支持 Debain 系
  • 关于支持的 Nginx 指令列表可以参考 https://gist.github.com/jysperm/6479965

笔记:函数和栈

从入门编程开始,我们一直在和函数打交道,但直到今天,我才勉强敢谈一谈对函数的认识。

在以C为代表的,绝大多数“正常”的编程语言中,函数都 是组织代码和组成程序的基本单位,甚至在CPU中也内建了对函数(过程)调用的支持。其他所谓面向对象风格 不过是对函数的进一步封装而已。

程序执行时的控制流,也是以函数为基本单位来进行调度的,每一次函数调用,就标志着一次控制流的转移。在经典的模型中,一个函数可以调用包括自己(调用自身的行为被称为递归)在内的任何函数,被调用的函数也可以再调用其他函数。函数间通过参数和返回值来传递信息,前者用于调用者向被调用信息发送信息,后者用于被调用函数向调用者返回信息。

那么我们如何在脑中构建一幅函数间互相调用的景象呢?这里我就不得不提到栈这个概念。栈是最简单最基础的数据结构之一,栈是一种线性的容器,但其特殊之处在于只能从其中一端插入或取出数据,这一端被称为栈顶。这使得栈具有这样的特征:先被插入栈的数据,要最后被取出;后加入栈的数据,将先被取出,即LIFO(Last In First Out, 后进先出).

函数调用存在着类似的性质:在某一时刻的同一调用树(而不是多个并行执行的函数)上,最先被调用的函数将最后被返回,因为它需要等待所有之后被调用的函数返回才行。 于是在计算机中,我们通过栈来维护函数间的调用状态,这种栈,也被称为运行栈,线程栈,函数栈。

栈上为单个函数所分配的区域,被称为栈帧。栈顶由一个栈顶指针来指示,栈顶指针在函数执行时会随时改变,因此还有另外一个帧指针指向当前栈帧的起始处,函数通常通过帧指针来访问数据。栈指针和帧指针被保存在单独的寄存器上。

函数执行时所定义的局部变量都将被分配在栈上,这些局部变量(和函数参数)决定了函数的执行状态。

当函数调用另一个函数时,首先要保存寄存器的值。因为寄存器是被多个函数所共享的自由,为了防止被调函数覆盖寄存器,主调函数必须负责将部分寄存器的值保存在栈上。然后将要传递给被调函数的参数插入栈中,在参数较少的情况下,也可能直接使用寄存器来传递参数。然后再插入下一条指令的地址,即被调函数返回时要返回到的地址。最后将控制权移交到被调函数的首地址。

被调函数开始执行,这也标志着调用者的栈帧已经结束。被调函数首先在栈上保存当前旧的帧指针,然后将帧指针甚至为栈指针减去1,即当前栈帧的第一项是旧的帧指针。 然后被调函数也开始保存寄存器,调用者和被调函数分别负责保存哪些寄存器是有约定的。

然后被调函数开始执行真正的代码,并通过帧指针来访问参数,参数在栈中的顺序是由调用约定决定的。在函数执行的过程中,函数也可能在栈上创建和销毁局部变量,但均遵循栈的后入先出原则。在函数执行即将结束时,将返回值保存在特定的寄存器中。

当被调函数返回时,首先恢复已保存的寄存器的值,然后将帧指针赋值给栈指针,即丢弃当前栈帧除了已保存的旧的帧指针的全部数据。然后从栈恢复旧的帧指针,至此被调函数已经完成了全部清理工作,帧指针指向调用者的栈帧头部,栈指针指向调用者栈帧的尾部。被调函数将控制权移交给当前栈指针指向的返回地址。

现在控制权回到了调用者,调用者首先弹出栈中的返回地址和参数,然后恢复寄存器的值,接着执行剩下的代码,被调函数的返回值在特定的寄存器中。

本文从栈的角度描述了一个函数的执行过程,着重介绍了4个关键的时间点:调用者调用被调函数、被调函数开始执行、被调函数返回前的清理工作、控制权返回到调用者。

可以看到函数的执行和栈的使用本来就是密不可分的。

试着给自己写了一份简历

写在前

只是试着写一份,没找工作的意思~

简历

王子亭,男,辽宁沈阳,1995.11.25

C++ (2010-2013)

熟悉C++的绝大部分语法,对C++11有些许了解,对boost有些许了解,能熟练使用STL,Qt等库,了解过openssl.

零毫秒1.x:基于Qt的,一个C/S结构的,在Internet上支持百人规模的即时通讯系统,规模约3000行代码。

零毫秒后续:计划基于DHT构建一个去中心化的网络模型,正在进行设计,目前有约千行代码。

PHP与Web前端 (2011-2013)

对PHP的语法特征有深入了解,包括最新的PHP5.5,使用过PHPDoc, PHPUnit等工具,对ThinkPHP,Zend等框架有些许了解。

Web前端方面,熟悉HTML和CSS,包括HTML5,喜欢Bootstrap;能用jQuery完成简单的DOM操作,能够使用浏览器的开发人员工具进行调试。

配合PHP使用过MySQL,Mongo,SQLite等数据库。

LightPHP:一个具有模版,路由,数据库模型,验证,国际化,类构造器等功能的简单PHP框架,设计时参考了ThinkPHP,Zend等框架,规模约1500行代码。

RootPanel:一个虚拟主机管理系统,前台包括工单系统,创建和编辑站点设置等等,后台会生成对应的配置文件,规模约3000行(不计前端部分).

Linux (2010-2013)

两年服务器维护经验,目前有5台Linux VPS,独立经营一个百人左右的虚拟主机服务(用上面自己写的管理系统).

日常使用Linux进行开发和娱乐三年左右。

互联网/生活

常年GoAgent,能阅读技术方面的英文资料。

熟练使用git并用Github分享代码,试用过Travis-CI.

关注/喜欢:Android,比特币,Markdown,开源,魔方,维基百科。

社区

混于V2EX,OSChina,SegmentFault,知乎,果壳网等社区。

自2011年创建了一个博客,目前有高质量原创文章110篇,其中技术文章40篇。

自2009年起经营一个论坛,虽然用户不多,但也一直坚持了下来。

计算机科学

对TCP/IP架构,密码学基础,Web安全有一定了解。

除此之外曾接触过ASP.Net, VB6, 还有众多小规模项目没有一一列出。

写在后

这么看来,我的资历还有很多需要丰富的地方,希望能在高中毕业之前做到吧。

C++方面,应该仔细研究一下作为准标准库的boost, 看一看平台相关的API(Linux syscall和Win API), 多少了解一下MFC.

另外算法方面,一个奖都没拿到算一个遗憾,最近的一次是去年百度之星,只差一个监测点进复赛 … 现在对百度之星失望了,打算拿到一个Google Code Jam的成绩,至少也得进复赛。

还有就是零毫秒木有完成,加快进度吧 …

PHP方面,我应该真正地使用一下CodeIgniter, Yii, CakePHP, ThinkPHP, Zend这些框架,不用深入,但也应该用过。这样的话在设计自己的框架(LightPHP)的时候也许会有新的想法。

感觉搞Web, 不造一个论坛或者博客的轮子,真的很遗憾。现在的JyBBS不过百来行代码,上不得台面,我得好好完善下。

前端方面,要认真学一学js的语法,调研一下jQuery的更多高级功能。

Linux方面,对于Linux的神器,如vim, awk之类的,用得还是太少,以至于我只能强调我用了Linux多少年,没多少硬东西。一直在用Ubuntu, 我一定要尝试一下Arch Linux.

Python和Go还是值得学习一下的,Python我打算只是搞到了解的程度就好了,我想认真地学习一下Go.

理论方面,感觉操作系统原理这方面,还有库的链接和装载是需要补充的,前一阵已经买了几本书,正在看。

英语水平是需要提高的,我的博客应该算是我很满意的,文章一直都在保持相当的高质量,以后继续保持。

2013.6.15补充:

我还打算在维基百科参与翻译一些技术方面的词条,混一混StackOverflow.

参与知名的开源项目似乎是个很大的加分项,不过这对目前的我来说好像有点遥遥无期的样子 …

精子生于 1995 年,英文 ID jysperm.

订阅推送

通过 Telegram Channel 订阅我的博客日志、产品和项目的动态:

王子亭的博客 @ Telegram


通过邮件订阅订阅我的博客日志、产品和项目的动态(历史邮件):

该博客使用基于  Hexo  的  simpleblock  主题。博客内容使用  CC BY-NC-ND  授权发布。最后生成于 2023-12-20.