上一篇文章(http://www.javaeye.com/topic/219826)发出之后,很多人表示对这个案例很感兴趣,要求我再深入地谈谈。应大家之邀, 我对上一篇内容进行一些补充,谈谈如何在一个传统的嵌入式领域项目中为了拥抱变化而引入web技术,以及用定制的rails框架解决非web应用问题,最后简要地谈谈一般性应用的思考。 在上一篇中,我轻描淡写地描述了由于客户对W设备赋予更多角色而导致W设备功能需求暴涨,最终选择web技术来解决问题,其实这里并非一蹴而就。 首先我们来分析一下要迎接的挑战: (1) 增加很多复杂的操作界面(超出了W设备的现有资源能力) (2) 功能变化快 (3) ...
我不是Web程序员,也从来未开发过用户超过10个人的'web'项目:-),但这并不意味着web技术对我无用,正相反,我开发过许多和web技术有关的程序和库,web架构和思想对我的设计和开发有着很大的帮助。 例如我经常碰到要设计通讯协议以适应不可靠的传输,web的无状态特性正是克服不可靠传输的法宝,屡试屡爽:-) 最近一段时间用ruby作了不少东西,也有用rails,但是从来没有对rails内部进行深究.直到最近碰到一个项目,促使我不得不到rails里面去挖掘,以借鉴rails一些优秀的东西。 这个项目非常有趣,是一套用于农场的自动化系统(所以使用者大多是奶牛,哈哈~),包含用于工人们佩戴 ...
我们知道, 对于 a = 100 这样的一条语句, a是一个指向 "100" 这个对象的引用. 那么, 如何根据a得到它的名字"a"或者符号:a ? 我现在实现了一个'swap'函数,它的作用是交换两个变量的值, 由于Ruby没有类似C的'指针',所以这个swap实现起来还真有点麻烦: a = 100 b = 200 def swap(x, y, &block) bind = block.binding vx = eval("lambda { #{x} }", bind).call vy = eval("lambda { #{y} }", bind).call ...
前一段时间,我在这里http://rubynroll.javaeye.com/blog/192547展示了一个空格带来的'陷阱', 今天又见到另一个'陷阱'(http://dablog.rubypal.com/2008/3/25/a-short-circuit-edge-case by David). 之所以为陷阱加引号, 是因为大部分情况下我们都没有机会掉进去 :) 大多数Ruby教科书在解释 "a ||= b" 这个复合操作时,都说她等效于: "a = a || b", 实际上真的如此么? 让我们在irb里面来看看: h = Hash.new(1) # 生成一个新的Hash,缺省 ...
2008-06-13

SVN+GIT=鱼与熊掌兼得

关键字: svn git
使用git已经有一段时间了,从使用git的第一天开始,就计划逐步放弃svn. svn有的功能,git都能做到,而且做得更出色,况且git还有很多特性svn望尘莫及,还有什么理由继续使用svn呢? well,理由很多. 比如,git在windows上的性能问题, TortoiseGIT还没有开发出来(或者根本没有这个计划?),团队中其它人员不习惯用git....等等. 那么,鱼与熊掌,能否兼得? === SVN 之痛与痒 === svn的最大问题是不支持分布式开发. 分布式并不一定就是指象Linux Kernel那样的大型协作开发场景. 例如,你想把没做完的工作带回家做,但是家里 ...
2008-06-12

动态模块加载和ELF Loader

关键字: embedded elf 动态模块加载
很早很早以前就想在嵌入式系统上实现动态模块加载的功能了,期间走了些弯路,直到最近,才完整地在嵌入式系统上实现动态模块加载。 === 动态模块加载的好处 === 动态模块加载的好处很多,例如,当你升级一个系统的时候,可以只升级一个模块,而不必升级整个系统。你可以把不同的模块放在不同的介质上,并实施不同等级的保护,例如BIOS部分进行写保护。 有些系统允许用户进行二次开发,这个时候几乎一定是需要动态加载功能的,因为你不希望用户需要链接整个系统才能够进行二次开发,而且你可能希望支持多个用户模块,彼此不相互依赖,彼此不干扰。 === Background === 一般来说,C的编译器编译出来 ...
2008-05-21

嵌入式Linux下常用的交叉编译方法

关键字: embedded linux
要在嵌入式Linux下使用动态语言,首先要解决的是语言解释器或执行引擎的交叉编译问题。 交叉编译通常有以下几种途径: 1. 直接通过交叉编译工具,手工配置交叉编译。交叉编译工具可以利用这个脚本来自动生成: http://kegel.com/crosstool/ 此方法的好处是简便快捷,一旦crosstool做好以后,需要什么包直接编译即可,而且可控性很强。缺点是对各种配置参数要很了解,而且自己需要考虑包依赖,以及包安装问题。对于要编译包依赖比较多的软件,比如我要编译ruby解释器,以及许多ext包,那就比较麻烦了,一般不推荐。 2. 利用scratchbox工具:http://www.s ...
Telit 是一家专业设计和生产无线模块产品的公司,值得注意的是,它几乎在所有的最新产品中集成了嵌入式Python解释器,这样使用者就可以使用Python脚本快速地开发应用,这些Python脚本可以保存在模块内部运行,而不用另外的MCU去和模块进行AT命令交互。 想起以前在WaveCom的OpenAT平台上开发应用,那个叫郁闷.... 以下链接是Telit的一个4频GSM/GPRS模块的flyer: http://www.telit.com/module/infopool/download.php?id=166
2008-05-13

空格的 ”陷阱“

关键字: ruby
今天无意中碰到一个空格带来的“陷阱”: def a 10 end b = a+1 => 11 b = a + 1 => 11 b = a+ 1 => 11 b = a +1 ArgumentError: wrong number of arguments (1 for 0) from (irb):8:in `a' from (irb):8
一提到Ruby就Rails,你大概腻了吧? 没关系,看看除了Web开发,Ruby还能作点什么 :) === 如果你熟悉嵌入式开发,如果你用C/C++的话,估计离开不了交叉编译工具。虽然网上能下载到编译好的交叉编译工具,但是不一定能满足你的需求,经常不得不自己手动从源代码开始自己编译交叉工具。虽然这不是什么难题,但是就我自己而言,每每碰到这样的问题,都需要到网上google一番,参考一些别人写好的脚本,然后按自己的需要修改,然后再编译...由于步骤有好几步,一一修改配置参数....输错了参数还要重来...太烦人了! === 一直很怕写shell脚本,简单的任务尚可,一旦碰到复杂些的,可就犯难 ...
虽然工作中在用Ruby,却也想在业余的时候用Ruby作点什么东西。 以前用C/C++写东西的时候就有过困扰,一个产品系列总是有那么些差异,需要对一个基础软件进行定制,这个型号的要把这个功能编译进去,那个型号的,需要把另外一个功能编译进去...很羡慕Linux内核有一个好用的基于菜单配置的工具,要是在我的项目中也能用它来管理不同模块的配置该多好啊.....不过要想把Linux内核配置那一套拿出来用,并不简单。 看过一些Ruby DSL方面的文章,觉得用Ruby来作这个东西真是在合适不过了,于是便有了Rbuild. Rbuild刚刚发布了第一个版本,0.1.0,已经可以用了,内部实现丑陋了些 ...
2007-12-29

A simple inter-process lock

关键字: ruby
Linux程序员通常喜欢用文件锁来做进程间的同步,或简单地用文件锁指示程序进程是否还健在。在ruby里面可以很简单的实现文件锁: =begin file lock for inter-process sync. usage: FSLock('mylock') do # protected by lock, # do your job here ... end =end class FSLock def initialize(name=nil) name ||= 'global' @fname = name + '.lo ...
2007-12-24

A Simple pseudo keyboard driver for Linux

关键字: linux driver c
如果你想把从串口或者其他地方接收到的数据当作是从键盘输入,该如何实现? 我最近写了个简单的Pseudo Keyboard (称之为:伪键盘)内核模块来实现这个功能,很简单但很有趣 :) 把以下代码存成pkbd.c,编译成模块pkbd.ko,然后用insmod pkbd.ko插入内核。 模块插入成功后,会在/proc下建立pkbd文件,以及在/dev下自动建立输入设备(如果你用udev的话)。 用法: 比如我想让从/dev/ttyS1来的数据模拟成键盘输入,最简单的方法是运行: cp /dev/ttyS1 /proc/pkbd & 当然,更正式点的用法是按需要 ...
2007-12-24

OO Programing in C (3)

关键字: c oo
OO Programing in C is not only POSSIBLE but also PRACTICAL -------------------------------------------------------------------------------- OO的一个亮点是类的"继承",通过"继承",可以重用许多代码。而且"继承"也是现实生活中非常自然的一种关系。但是很不幸,C没有class,更没有提供"继承"的表达方式。既然能用C的struct来仿真class, 那能不能继续来仿真"继承"呢?答案是:possible。就像<<Inside the C++ ...
2007-12-24

OO Programing in C (2)

关键字: c oo
OO Programing in C is not only POSSIBLE, but also PRACTICAL. -------------------------------------------------------------------------------- “class“是很多OO编程语言里的关键字,它来源于OO鼻祖Smalltalk。class(类),是对一群有相同特性的对象的抽象概括,对象称为类的实例。在class里面可以存放有状态(变量),行为(函数/方法)....有关OO概念、方法的文章太多了,不再啰嗦。在C里面,唯一可以实现自定义类型的是struct,st ...
2007-12-24

OO Programing in C (1)

关键字: c oo
OO Programing in C is not only POSSIBLE but also PRACTICAL. -------------------------------------------------------------------------------- 经常看到关于OO编程的讨论,C++, Java, C#...还有最近很流行的动态语言Python,Ruby等,但很少看到有C的份。 在我看来,OO编程的核心是OO的思想,用什么语言倒是其次。但是,不可否认,那些专门为OO编程设计的语言可以比较方便和自然地表达OO思想,有些语言甚至强制使用OO特性。 C, ...
2007-12-14

Ruby: GUI编程的利器

关键字: ruby gtk gui closure
ruby语言由于其灵活优雅的表达方式和优秀的OO的特性,是GUI编程语言的有力竞争者。特别是其Closure特性,能够使GUI编程时遇到的很多头痛的问题迎刃而解。 最近手上的一个项目刚好需要做一个Windows平台的GUI程序,以前是用VB,虽然VB是Windows GUI的经典工具,能够快速进行GUI原型开发,但是一旦GUI元素多起来,且UI元素存在复杂关系,就很难维护....特别在后期,一旦需求有什么变化,再去调整UI,那个叫痛苦啊。因此就想用ruby试试,加上此次项目设计很多网络通讯方面的需求,因此更加坚定了使用ruby的决心。现在项目基本完工,再回过头看,以前用VB开发时碰到的种种 ...
rubynroll
搜索本博客
存档
最新评论