Electronic Joint Business

Solution for E-Business

编程语言

初识 Sinatra (四)

文章评价:

这是本系列文章的最后一部分。本教程的目标是带领从未用过 Sinatra 的用户从头开始创建一个应用,并将之最后发布。

到前三部分结束时,我们已经完成了 To Do List 应用的大部分功能。在本系列的最后一部分,我们将先看看如何用 Sass 来编写 CSS ,之后将本应用发布到 Heroku 云服务上。

Logo
每个上点档次的应用都应有一个 logo,所以我创建了一个简单的“tick” logo,你可以在 Github 上找到。我们用它来作为本应用的头条的背景图片。打开 Styles.css 并添加下列 CSS:

h1.logo{
  font-family: helvetica,arial,sans-serif;
  font-size: 24px;
  color: white;
  padding: 64px 0 0;
  margin: 0 auto;
  text-transform: uppercase;
  text-align: center;
  font-weight: normal;
  letter-spacing: 0.3em;
  background: transparent url(/logo.png) 50% 0 no-repeat;
  }

(注意 – 也许你还发现,你需要为 layout.slim 的 h1 元素添加一个 ‘logo’ 类,这段 CSS 才会起作用。)

>>> 阅读全文

 

, , , , , , , ,

SASS 使用介绍

简单地说: Sass 就是程序化的 CSS。 Sass (即 Syntactically Awesome StyleSheets 的缩写,意思是“相当迷人的样式表”) 是一种动态样式语言,它受到 Haml 的简洁精炼的语法的启发,提供了 变量、操作、嵌套选择器(selector)和 Mixin 等等功能来增强样式表,因此和单纯使用 CSS 语法相比,Sass 更容易编写,也更容易阅读。现在 Sass 是 Ruby 上的 Haml 插件的组件之一,我们可以用 Haml 来处理 HTML 标记,而用 Sass 来处理 CSS 标记。 其作者是这样介绍 Sass 的优点的:

“ Sass 是 CSS 之上的一种元语言 (meta-language),用于简洁、结构化地描述文档的样式,和普通 CSS 相比功能更强大。Sass 提供的更简洁、更优雅的 CSS 语法,同时还实现了许多特性,可以帮助创建更易于管理的样式表。”

Sass 的发展有两种语法规则( syntaxes )。。原先 Sass 采用了 Haml 的缩排语法,没有括号,分号,它使用行缩进的方式来指定 CSS 块,这对于习惯了 CSS 语法的页面设计师来说很不习惯,同时也不能兼容既有的 CSS,因此 Sass 3 就演变成了 Scss (Sassy CSS),它是 CSS3 语法的的拓展升级,摒弃了原来的缩进语法,而采用了 CSS 设计师的惯用的花括号 {}。 Scss 100% 兼容了CSS3, 因此在一个有效的 CSS3 文件同时可以被 Scss 所识别。除此之外,它还支持我们能够找到的所有扩展,甚至包括一些非标准语法,例如微软的 expression() 函数和 filter 属性。

为了加以区别, 使用缩进语法的文件以 .sass 为扩展名,而采用 Scss 语法的文件则以 .scss 作为扩展名

参考:
http://sass-lang.com/tutorial.html

 

, , ,

Rails3 技术手册 (一) 概述

英文原文
Ruby on Rails 是用于快速简洁地开发 Web 应用框架。它被 37signal 公司的项目管理工具 Basecamp 中剥离出来,其作者 David Heinemeier Hansson 率先用 Rails 着手解决手边的现实问题。 我们会发现用 Rails 进行开发时充满乐趣, Rails 负担起了开发中那些无聊的琐事,因此开发者能专注于所要解决的问题本身。

你如果不理解这些开发中的琐事,可以看一下下面的例子:编写过 Web 应用的开发者都不可避免地会用到字典结构、缓存、数据持久化、模板系统、测试框架、路由等等组件。Rails 自身就带了这堆让应用上线运行所必需的组件,而且作者在编写它们时充分考虑了彼此的适配问题。以往希望模板语言能和复杂的 ORM 层能在一起工作的麻烦现在再也没有了。一切将是如此简单。

现在开发者无需再为数据库等的组件编写大量繁琐的 XML 配置。Rails 基于约定而非配置,配置因而精简到最少。假如 Animal 类就是关联到数据库的 animals 数据表,为什么还要让开发者花时间写配置文件来链接它们? 这一切就让 Rails 来帮你吧。

简而言之,Rails 让 Web 开发充满乐趣。

架构
Rails 应用开发是基于模型-视图-控制器模式的 (MVC) 的。想了解 Rails 是如何使用 MVC 的, 最简单的办法是透过了解 Rails 请求的生命周期。如图1-1所示:

>>> 阅读全文

 

, , , , , , ,

初识 Sinatra (三)

文章评分:
在本教程的第二部分,我们利用 DataMapper 将任务保存到后台数据库,同时我们还用 Sinatra 创建了 web 前端以便显示、添加、删除和结束任务。现在这个 Just do it 应用功能齐备,但是样子还有点丑陋。

在本章中,我们继续对这个应用做些美化修饰,并增加一些功能,让你能够创建多个任务列表。

添加样式
现在我们用样式表来对应用进行美化修饰。在你的 “layout.slim” 中添加下面这行代码:

<link rel="stylesheet" media="screen, projection" href="/styles.css">

现在创建一个名为” styles.css”的文件,并保存在”public”文件夹中,将下面 CSS 内容添加到该文件中:

.completed{
  text-decoration: line-through;
  }
.tasks{
  padding:0;
  list-style:none;
  width:400px;
  }
.task{
  position:relative;
  padding:2px 0 2px 28px;
  border-bottom: dotted 1px #ccc;
}
form.update{
  position:absolute;
  bottom:2px;
  left:0;
  }
form.update input{
  background:white;
  color:white;
  padding:0 2px;
  border:solid 1px gray;
  cursor:pointer;
}
.tasks li.completed form.update input{
  color:#47FD6B;
  }
form.delete{
  display:inline;
  }
form.delete input{
  background:none;
  cursor:pointer;
  border:none;
  }

刷新页面,现在页面是不是看起来好多了,也更像一个真正的任务列表了。你也许注意到,该样式表中有个 ‘completed’ 类。 到目前为止,我们显示已完成的任务的方法是为它添加完成的时间,这样看起来不怎么样。我们来修改一下 task 视图,添加 ‘completed’ 类。这样利用样式表,已完成的任务看起来就是完全不同的风格。打开 “task.slim” 做如下修改:

>>> 阅读全文

 

, , , , , ,

初识 Sinatra (二)

文章评价:
在本文的第一部分,我们演示如何配置 Sinatra 并显示了几个页面。现在是真正有趣的部分,在本节中,我们将演示如何用数据库来保存任务。

这里我们会使用 SQLite 作为本地数据库,正如它的名字说表述的,这是一个轻量级的文件数据库,无需任何配置。如果你没有安装过这个数据库,可以参考本页的一些简单介绍。

为了和数据库交互,我们会使用 DataMapper。这个 ORM 的工作方式和 Active Record 类似,但在方法和语法上略有不同。

为了配合 SQLite 使用 DataMapper,下面的 Gem包需要被安装:

gem install data_mapper dm-sqlite-adapter sqlite3

我们需在 main.rb 文件的头部添加 DataMapper的请求:

>>> 阅读全文

 

, , , , ,

初识 Sinatra (一)

文章评价:

Sinatra 是一个基于 Ruby 语言,以最小精力为代价快速创建 web 应用为目的的 DSL。如果您对日渐庞大的 Rails,感到厌倦,不如通过本教程来学习一下轻盈的 Sinatra。本系列教程有四个部分,它将带着你一步一步用 Sinatra 和 DataMap 创建一个功能齐备的线上代办事项的应用,我们称它为“Just Do It”。希望读者能通过本文了解到利用 Sinatra 创建应用是多么的简单而快速。

首先我们先进行开发 Sinatra 应用的准备工作。

安装 Sinatra
要让 Sinatra 能工作,你首先必须安装 Ruby。这里我建议您使用 RVM 来安装。( 你可以参考 Glenn Goodrich 的教程)。一旦你安装好了 Ruby 和 Rubygems,你就可以安装 Sinatra 了。用 Rubygems 来安装 Sinatra 不过是小菜一碟,你只需要打开命令行并输入:

gem install sinatra

如此简单,你就可以做好一切准备工作了。

>>> 阅读全文

 

, , , ,

Ruby Slim 模板语言

Slim 是一个快速的轻量级的模板引擎,其设计目的是通过精简视图端语法,让开发者更专注于内容的本质。Slim 支持 Rails3,在 Ruby 1.9.2和 Ruby/REE 1.8.7 上都能正常工作。

Slim 的语法的设计思想是,“够用即可- What’s the minimum required to make this work” 。 在后面的例子中,我们将会看到 Slim 的语法是多么简洁。随着越来越多的人参与到 Slim 项目里,现在 Slim 也可以支持 Haml 和 Jade 的语法附加。 Slim 团队很欢迎这些扩展,因为对编程语言的审美观是因人而异的。

Slim 使用 Temple 来进行解析/编译,它也被集成到 Tilt,因此 Slim 可以很好地和 Sinatra 或者单纯的 Rack 一起工作。

为什么需要 Slim?
在 Rails 社区,Erb 和 Haml 无疑是两大最流行的模板引擎,但是 Erb 的语法相当累赘而 Haml 的语法则含糊不清难以接受。 Slim 采用的是非常简化且高效的语法,就执行效率而言,用户是无需顾虑的。

没错,Slim 非常之快。在本文的最后你可以找到基准测试的结果,如果你对测试结果持保留意见,那我们也提供了进行基准测试的 rake 任务,你可以自己动手测试来查看结果。

>>> 阅读全文

 

, , ,

编译Python源代码 为嵌入Python做准备

在上面几篇文章我们已经详细介绍如何在 C/C++ 程序中嵌入 Python 解释器,或者是利用 C/C++ 来扩展 Python 的功能。如果你从网上下载 Python 的 MSI 安装包中的类库和 Dll 文件来运行例子,很有可能你会遇到 access violation 异常,导致宿主程序崩溃。这是因为宿主程序和 Python 的 Dll 文件依赖于不同的 C 语言运行时。

为了提高应用的稳定性,建议应该采用目标编译器从头编译 Python 源代码。本文将详细介绍如何用 VC++ 8.0 和 VC++ 10.0 从头编译 Python 源代码,这里选用的是最新的 Python 2.7.2 版本。(Python 3.x 版本因为与 Python 2.X 版本语法不兼容,而未曾普遍使用)

Python 的标准库内置了许多功能, 如要完整的编译, 需要下载一些第三方的开源程序:

Python 2.7.2 对各软件的版本在 Python-2.7.2\PC\VS8.0\pyproject.props 中有定义,如果需要不同的版本,只需要修改pypoject.props 里的版本号即可,不过注意,高版本的软件包未必兼容于 Python 2.7.2。

这些源文件下载后需要解压到和 Python 2.7.2 同层的目录, 如下图所示,并需将文件夹的名字改为和图中一致:

>>> 阅读全文

 

,

GCC 4.6.0 编译优化选项

应该谨记在心的是,:“使用编译器优化得到的小幅度性能提升,与它带来的风险相比微不足道” — 源自 LFS-Book.

追求极致的优化是一件既耗时又麻烦的事情,你会陷入无止尽的测试、测试、再测试…所以优化应当适可而止为好,将精力留出来用在程序算法的优化上会有更有意义。此本文的主旨是针对 GCC 4.6.0 的优化选项给出一个完整和清晰的脉络,仅仅作为参考。

GCC 编译的基本过程
在 Unix 环境下(包括 Unix、Linux、MSYS 和 Cygwin 等等),软件源代码大多提供了 configure 脚本,该脚本一般都会有许多配置选项,其中有不少选项是与性能息息相关的。对于每个特定的软件包,在编译前应该使用 configure –help 查看所有选项,并精心选择有关选项。运行 configure 脚本后会生成有关项目的 Makefile。将源代码编译为二进制文件是在 Makefile 文件的指导下,由 make 程序调用一条条编译命令完成的。而将源代码编译为二进制文件又需要经过以下四个步骤:预处理(cpp) → 编译(gcc或g++) → 汇编(as) → 连接(ld) ;括号中表示每个阶段所使用的程序,它们分别属于 GCC 和 Binutils 软件包。

尽管将源代码编译为二进制文件的四个步骤由不同的程序( cpp,gcc/g++,as,ld)完成,但是事实上 cpp, as, ld 都是由 gcc/g++ 进行间接调用的。换句话说,控制了 gcc/g++ 就等于控制了所有四个步骤。

显然的,优化应当从编译工具自身的选择以及控制编译工具的行为入手。本文以 Binutils-2.21.1 和 GCC-4.6.1为例进行说明。

>>> 阅读全文

 

,

在多线程C/C++应用中使用嵌入式Python

文章评价:
脚本语言是快速编写富有弹性的代码的重要方法之一,在 Unix 系统自动化管理中已经应用了多种脚本语言。现在,在许多应用开发中,也提供了脚本层,这大大方便用户实现通用任务自动处理或者编写应用扩展,许多成功的应用,诸如 GIMP、Emacs、MS Office、PhotoShop、AutoCAD 等都应用了脚本技术。在某种意义上,一切皆可脚本化。

在另一篇文章中,我们已经介绍了如何在 C 应用中嵌入 Python 语言,通过这项技术,可以让应用的高级用户来修改或定制化他们的程序,你可以充分利用 Python 的语言能力而不用自己去实现嵌入语言。Python 是一个不错的的选择,因为它提供了干净直观的 C 语言 API。关于如何在 C 应用中嵌入 Python 解释器,你可以参考:让 Python 成为嵌入式语言一文。

现在我们来更深入地探讨一些问题。 鉴于许多复杂的应用都会利用多线程技术,本文将着重介绍如何创建线程安全的界面来调用 Python 解释器。

这里的所有例子都是用 Python 2.7.2,所有的 Python 函数都以 extern “C” 定义,因此对于 C 和 C++,其使用是别无二致的。

Python C 和线程
在C程序中创建执行线程是很简单的。在 Linux 中,通常的做法是使用 POSIX 线程(pthread) API 并调用 pthread_create 函数。关于如何使用 pthreads,你可以参考 Felix Garcia 和Javier Fernandez 著的 “POSIX Thread Libraries”一文。为了支持多线程, Python 使用了互斥使访问内部数据结构串行化。这种互斥即 “全局解释器锁 – global interpreter lock”,当某个线程想使用 Python 的 C API 的时候,它必须获得全局解释器锁,这避免了会导致解析器状态崩溃的竞争条件(race condition)。

>>> 阅读全文

 

, ,

利用C语言扩展Python模块

文章评价:
Pyton 和 C 分别有着各自的优缺点,用 Python 开发程序速度快,可靠性高,并且有许多现成模块可供使用,但执行速度相对较 慢;C 语言则正好相反,其执行速度快,但开发效率低。为了充分利用两种语言各自的优点,比较好的做法是用 Python 开发整个软件框架,而用 C 语言实现其关键模块。本文介绍如何利用 C 语言来扩展 Python 的功能,并辅以具体的实例讲述如何编写Python的扩展模块。

与其它普通脚本语言有所不同,程序员可以借助 Python 语言提供的 API,使用 C 或者 C++ 来对 Python 进行功能性扩展,从而即可以利用 Python 方便灵活的语法和功能,又可以获得与 C 或者 C++ 几乎相同的执行性能。执行速度慢是几乎所有脚本语言都具有的共性,也是倍受人们指责的一个重要因素,Python 则通过与 C 语言的有机结合巧妙地解决了这一问题,从而使脚本语言的应用范围得到了很大扩展。

在用 Python 开发实际软件系统时,很多时候都需要使用 C/C++ 来对 Python 进行扩展。最常见的情况是目前已经存在一个用 C 编写的库,需要在 Python 语言中使用该库的某些功能,此时就可以借助 Python 提供的扩展功能来实现。此外,由于 Python 从本质上讲还是一种脚本语言,某些功能用 Python 实现可能很难满足实际软件系统对执行效率的要求,此时也可以借助 Python 提供的扩展功能,将这些关键代码段用 C 或者 C++ 实现,从而提 供程序的执行性能。

本文主要介绍 Python 提供的 C 语言扩展接口,以及如何使用这些接口和 C/C++ 语言来对 Python 进行功能性扩展,并辅以具体的实例讲述如何实现 Python 的功能扩展。

Python 的 C 语言接口

>>> 阅读全文

 

,

让Python成为嵌入式语言

文章评价:
C 和 C++ 这两种强大的语言可以创建高性能本地编译代码,其缺点也比较明显,即运行时的灵活性差。一旦 C/C++ 应用编译完成,代码基本是静态的,有时这会成为大问题。例如,如果想要通过创建插件来扩展应用的功能,就不得不处理复杂的动态链接问题,这一个大麻烦。而且还要求用户必须对 C/C++ 有所了解,这大大限制了编写应用扩展的人群。

更好的方法是用某种脚本语言来扩展应用。使用脚本语言,你可以获得更多运行时的灵活性,同时缩短开发时间,降低开发扩展的学习曲线。不幸的是,创建一种脚本语言是个艰巨的任何甚至本身就可能成为一个大问题。不过,我们可以利用现成的脚本语言。比如 Python,你可以将解释器直接嵌入在应用中,无需在应用中添加太多代码就能获得 Python 的强大功能和灵活性。

在应用中使用Python
在程序包含 Python 解释器是相当简单的。Ptyhon 提供了单一的头文件Python.h,包括了在应用中嵌入解释器的所有定义。其中包含很多内容,包括一些标准头文件。为了高效地编译,如果仅包括你用到的那部分接口固然不错,不过 Python 并未提供这个选项。如果你看过Python.h,你可以看到它定义了多个重要的宏,包括相当数量的公用头文件,这些都是文件后续的独立组件所需要的。

要将应用和 Python 解释器链接在一起,你需要运行python-config程序来获得链接选项,并将之传递给编译器。在我的系统上,参数是

-lpython27 -lm -L/usr/local/python27/libs

一个非常简单的嵌入应用

>>> 阅读全文

 

,

Scala语言编程指南 (一)

文章评分:

Scala设计初衷
Java 语言已经是有一定年头的语言了,随着 C#,Ruby 等新的语言的出现,Java 的语法显得臃肿且平庸,和这些新兴语言相比,其开发效率并不十分突出。程序开发者想要一种更精炼和更灵活的语言去提高他们的生产效率。这也是如今所谓的 Ruby, Python 这样的脚本(Script)语言大行其道的原因之一。

当 Java 开始老朽不堪的时候,其虚拟机(JVM)的性能却得到大众的认可,JVM 的性能优化做得较为到位,因此许多程序开发者相信使用基于 JVM 的新语言是正确的前进道路。为此 Sun 雇佣了 JRuby 和 Jython (Ruby 和 Python 在 JVM 上的实现)的主要开发者。而 Scala 的出现对于 Java 开发者来说提供了一门更加新式的语言。

值得一提的是 Scala 开始为针对 JVM 设计的,但是随着 Scala 的发展,它也可以运行在 .NET 的 CLR 虚拟机上。当我们讨论有关 Scala 语法时,它们大致也能应用于 .NET 之上。

Scala 简介
Scala 是一种多范式的语言,因为 Scala 既支持面向对象编程,也支持函数式编程。它在拥有简洁,优雅,灵活的语法的同时,也提供了一个久经考验的静态类型系统和惯用语法,所以从小巧的解释性脚本到大型的复杂系统它都可以胜任。无独有偶,Microsoft 资助的大学项目 Nemerle 也走了同一条道路。

>>> 阅读全文

 

, , , , ,

了解Linux操作系统 (二)Linux内存架构

文章评分:

为了执行进程,Linux 内核会为请求的进程分配一段内存区域。进程用这段内存作为工作区来执行所请求的工作。这就像你申请了一张办公桌,你可以在桌面上摆放工作所需的纸张、文件和备忘录。不同之处是 Linux 内核采用动态的方法来分配内存空间。在内存大小通常是有限的情况下有时进程的数量会达到数万个,Linux 内核必须有效地来管控内存。在本章节中,我们会介绍内存的结构、地址分布,以及Linux是怎样有效地管理内存空间的。

物理内存与虚拟内存

如今我们面临选择 32 位系统或者 64 位系统的问题。对于企业级用户来说,最重要的区别就是虚拟内存地址是否可以超过 4GB。从性能角度来看,弄明白32 位和64 位 Linux 内核是怎么样将物理内存映射到虚拟内存是非常有意思的。

在图1-10中,你可以很明显的看出 32 位系统和 64 位系统在内存地址分配上的不同之处。关于物理内存映射到虚拟内存的详细内容已超出本文的范畴,本文将只着重介绍Linux内存结构的部分细节。

>>> 阅读全文

 

,

Gnu Binutils 命令小结

我们知道, gcc(gnu collect compiler)是一组编译工具的总称,包括c,c++等等,它主要完成的工作任务是“预处理”和“编译”,以及提供了与编译器紧密相关的运行库的支持,如libgcc_s.so、libstdc++.so等。

而binutils提供了一系列用来创建、管理和维护二进制目标文件的工具程序,binutils与gcc是紧密相集成的,没有binutils的话,gcc是不能正常工作的。 Binutils提供了一下的工具,主要有:
addr2line 把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。

ar建立、修改、提取归档文件。归档文件是包含多个文件内容的一个大文件,其结构保证了可以恢复原始文件内容。

as主要用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。

c++filt 连接器使用它来过滤 C++ 和 Java 符号,防止重载函数冲突。

>>> 阅读全文

 

, ,

Previous Posts Next posts