Cap'n Proto 初探

Cap’n Proto 发布到 Beta 版了,进展速度还是很快的。

做后端服务,序列化是一个重要的问题, capn proto 可以说是 pb 的改进,在各方面都有所进步。

Read More …

Revel 学习笔记(三)

控制器

Revel 遵循 MVC 模式,所有的网站运行逻辑都放置在控制器中。

控制其范例如下:

// app/controllers/app.go
package controllers

import "github.com/robfig/revel"

type App struct {
	*revel.Controller
}

func (c App) Index() revel.Result {
	return c.Render()
}

其中 App 结构体即为控制器实体,属于其的方法(Index等),接收请求处理并返回结果,一般与 URL 对应。

视图

Revel 框架的 view 层也就是网站的模板,范例如下:

<!-- app/views/App/Index.html -->
{{set . "title" "Home"}}
{{template "header.html" .}}

<header class="hero-unit" style="background-color:#A9F16C">
  <div class="container">
    <div class="row">
      <div class="hero-text">
        <h1>It works!</h1>
        <p></p>
      </div>
    </div>
  </div>
</header>

<div class="container">
  <div class="row">
    <div class="span6">
      {{template "flash.html" .}}
    </div>
  </div>
</div>

{{template "footer.html" .}}

Revel 使用 Go 的 template 模板引擎,使用方法与其他模板引擎大同小异。

API

无需多言:
http://robfig.github.io/revel/docs/godoc/index.html

Revel 学习笔记(二)

Revel 运行逻辑

## 项目结构

|
|-app # 主要逻辑代码
|-conf # 网站配置
|-messages # 多语言支持
|-public # 静态资源文件
|-test # 单元测试

## 配置

配置主要分为网站配置,与路由表:

网站配置
conf/app.conf

路由表
conf/routes

配置文件结构非常清晰,一看便知。路由表中,主要配置 url 与 controller 的映射关系。

## 主逻辑

项目主要逻辑代码放置在 app 目录下,其中 controllers 目录存放控制器, views 目录存放模板。

Python 多版本管理工具

虽然在多版本问题上 Python 的蛋疼度要比 Ruby 轻很多,但是多版本的问题总归是存在的,尤其是在当前 Python 由2.*过渡3.*的大环境下,很多时候不得不面对版本问题,为了让这个问题解决的轻松,解放我们的双手,我们需要工具的帮助。

Read More …

Boost.Python 简单范例

利用 Boost.Python 做 C++ 与 Python 之间的粘合剂是不错的选择:

#include

using namespace boost::python;

std::string foo_func()
{
      return std::string("Hello, World");
}

std::string bar_func(const std::string& str, int n)
{
      std::string tmp;
      for(int i = 0; i < n; ++i)
      {
            tmp += str;
      }
      return tmp;
}

class foo_class
{
private:
      std::string foo;
public:
      static std::string bar;
      foo_class():foo("I am foo"){}
      std::string f(int n = 1)
      {
            std::string tmp;
            for(int i = 0; i < n; i++)
            {
                  tmp += foo;
            }
            return tmp;
      }

};

std::string foo_class::bar = "I am bar";

//定义名为boostpy的python模块
BOOST_PYTHON_MODULE(boostpy)
{
      // 导出foo和bar两个模块全局函数
      def("foo", foo_func, "foo function");
      def("bar", bar_func, (arg("str"), "n"));

      // 导出foo_class类,类中选择性导出f成员方法和s_bar静态变量
      class_("foo_class", "I have nothing to say")
            .def("f", &foo_class::f, arg("n")=1)
            .def_readwrite("s_bar", &foo_class::bar);
}

Yeoman 学习笔记

# 官网

yeoman.io

# 安装

需要 ruby
需要 compass # http://compass-style.org/install/
需要 npm

#ubuntu源中的nodejs版本过低,从ppa安装nodejs

sudo apt-get update
sudo apt-get install python-software-properties python g++ make
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

npm install -g yo grunt-cli bower

# 使用

yeoman 有很多 generator ,需要自行安装, 具体可以在 npm 资源列表中查询。

# 安装 webapp 生成器
npm install -g generator-webapp

– 建立项目目录

mkdir myapp
cd myapp

# 运行 yo 生成器,可以直接键入 yo 查看已经存在的生成器。

yo webapp

# 系统会进行交互式提问配置具体模块

这样就建立好一个开发项目

使用

grunt server

可以建立开发服务器,会自动监控代码的变动,实时编译刷新浏览器,大大延长了F5按键的寿命。

想要在项目中引入其他组件可以使用

bower install *

开发完成以后运行

grunt

会打包至 dist 目录,优化压缩一次搞定。

什么是元编程?

什么是元编程呢?

在我理解,简单的说,元编程就是将程序本身也当做程序数据而进行的编程。

我们知道,有句话是这么说的,程序等于数据加算法。所以当我们将程序本身也当做数据的时候,事情一下子就变得玄妙起来了。于此类似,还有一句话是这么说的,理解递归首先要理解递归。

参照一下我们的现实生活,这就像,人类基因+克隆技术,人类自己主动改变自己本身,这是一个非常严肃的问题,不只是科学与技术上,在伦理学的问题上尤其难解。

所以说,元编程是软件工程师的黑魔法。

那么,一个语言是否可以进行元编程,最大的特性在于什么的呢?

在我理解,就是在于,文本与代码的对应。因为对于编程语言而言,其程序本身就是源代码,当源代码可以映射为程序中的文本时,那么将程序本身也当做程序就可以成立了。

Lapis 小记

大概看了一下 Lapis 的文档,整体上挺不错的,但是有一点非常让人不爽。

就是,它没有选择使用通常的模板渲染方式来做 view 层。而是自己实现了一个可以算是 DSL 的 Html Generater 。

现在的网页前端本身越来越复杂,设计思路应该是和中后端尽量解耦,中间使用 json 、 msgpack 这些序列化做数据桥梁,但是 Html Generater 显然违反了这个原则,而且 DSL 到实际 HTML 中间有一部转化,而 DSL 提供的特性很难完全涵盖 HTML 的所有语义,这给前端留下了巨大的设计隐患。

所以我还是希望能有一套类似于 mustache 那样的模板引擎来解决问题。

关于 COS 新站项目

做了 COS 的新站项目,最大的感受是,网站开发这块基本摸熟了,当然,各种语言有各种语言的实现,前端也有各种坑点。总之,以后就不再碰了,除了与语言有关东西以外,比如 Flask 、 Sinatra 这些。当然还有一大块知识其实也可以算此范畴,而且不能不了解,就是 js 框架,比如 backbone 这些。这个需要找其中一个框架花时间突破一下。