Ruby 语言 思想驱动生活

Ruby,Rails,编程是一种乐趣。

这段话有问题吗?

在看Ralf Wirdemann 和Thomas Baustert的《RESTful Rails Development》,1.2节的why REST的时候说道:
Clean URLs. REST URLs represent resources and not actions. URLs always have the
same format: first comes the controller and then the id of the referenced esource.
The requested manipulation is independent of the URL and is expressed with the help of HTTP verbs.
说REST有着清楚简洁的URL风格,URL里不表示(带)action,是controller/:id这样形式的,至于对这个资源进行何种操作,是通过http header里的动词来指定的。
我是对这句话很有疑问,http header 里就4中操作,如果处理CRUD以外的action的话,怎么办?
Map.resources 的时候可以指定collection或者member的action,就是说url里还是会出现action的,比如users;top10,可以列出排名前十的用户,这个top10就是collection指定的users控制器的一个action。
这句话说的即使不错,也是不严谨的。对于刚接触REST这个词的人来说,很容易误解,误入歧途。
我觉得,不是说/projects/1就比/projects/show/1更RESTful了。
本来,URL就是RESTful的东西。

推荐个diff工具

WinMerge,非常好用,最基本的能比较两个文件或者两个文件夹,随便选中两个文件点右键就可以比较。
界面也非常好看,diff出来不同的一行,改变的和没变的用不同的颜色表示。
当然从名字来看,它还是一个merge工具。
去看看吧http://winmerge.org/

pTAL,TAL,EpTAL,TNS,TNS/R,TNS/E

HP的这些东西太faint了,没人教,只能自己看,都是英文文档,根本看不过来。
这些概念也模模糊糊似懂非懂的。
pTAL 基于TAL HP Transaction Application Language。可以用pTAL 或 EpTAL 来编译pTAL源程序。
EpTAL 编译出来的代码都是TNS/E 的。
pTAL 编译出来的代码都是TNS/R 的。
TAL 编译出来的代码都是TNS的。
TNS architecture. NonStop 系列体系结构。HP计算机(NS系列)基于CISC技术,TNS体系结构实现了TNS指令集。
TNS/E architecture. NonStop Series/Itanium architecture.这是HP基于Itanium技术的计算机系统。
TNS/E体系实现了Itanium的EPIC(explicitly parallel instruction set computing)指令集,而且向上兼容TNS和TNS/R系统级别的体系结构。
TNS/E native object code. 由支持Intel Itanium 指令编译器编译成的对象,TNS/E native object code只能在TNS/E系统上运行,不能在TNS和TNS/R上运行。
TNS/R architecture. NonStop Series/RISC 结构,如R所示,这是基于RISC指令集的HP计算机系统。向上兼容TNS系统。
TNS/R native object code. 由支持MIPS RISC 指令集的编译器编译成的代码,同样,他也只能运行在TNS/R系统上,而不能运行在TNS或者TNS/E系统上。
release version update (RVU).一组对NonStop OS系统软件的修正,用RVU ID来标识,以这为单位发售和提供支持。RVU包括对象文件,支持文件,文档等。

TAL的Hello World程序

The Transaction Application Language (TAL) 是hp NSK上一种编程语言,如果分类,应该算过程式。
,而且也需要编译为可执行文件。
Tal不区分大小写,但是在C语言里调用Tal过程时过程名(函数名)一定要全用大写。
注释有两种,一个是两个横线–,直到行末有效,另一个是感叹号!,直到行末有效,或者到下一个感叹号,比如
CALL PROC1(p1,!p2!,p3) –p2 is not provided
这个调用和 PROC1(p1,,p3)是等价的,但是如果在第二个参数出写个那样的注释,非常好理解。
下面来写个Hello World
其实无论是c,java,ruby,都很简单,但是Tal可就复杂了。
首先,需要定义一个主过程,着类似c的main函数。
PROC myproc MAIN;
这个myproc是名字,PROC标识他是一个过程,MAIN表示是程序开始执行的入口点。
然后就可以打印了。Printf,没找到个函数。当然,人家凭什么给你。
最后找了一下,发现是这样的。
首先,执行编译好的程序是从TACL启动的,注意是TACL,不是Tal,完全不同的东西。
如果要打印,则需要往TACL进程里写东西,TACL才能打印到标准输出。也可以把我们要执行的程序看作TACL的子程序。
TACL用RUN启动一个程序的时候,会有一个500多个字节(word?)的message送给被启动的进程,包括id,卷标,输入输出,参数等,我们就可以从这个message里取得输出的。

给lilina加上历史存档的功能

lilina是一个用php写的web新闻聚合器,他非常简单但是非常强大.不需要数据库支持,这个比较方便,但是可能也会带来速度上的问题,我有时候login都要很半天,也许不是读写文件的问题。
默认的lilina只有4个页面,index24,index48,index168还有index-1
index-1是所有的数据,时间长了或者数据多了,这个文件会很大,所以在想是不是给lilina加个存档功能?
简单的想法就是每个星期一个文件存档,所以只需要拷贝index168这个文件就行了。
打算将存单的文件都放在lilina的根目录下的weeks目录,所以
首先在index.php里面加一个链接到weeks/index.php,当然,目录可以自己换。
然后编译weeks/index.php源文件
<?
//
// author liubin
// last modify: 2007.7.14
// http://liubin.nanshapo.com
//
error_reporting(0);
 
$fn1 = date("Y-W",time() - 7 * 86400);
$fn1 = $fn1.".html";
if (!file_exists($fn1)) {
    copy("../index168.html",$fn1);
}
 
date_default_timezone_set(’PRC’);
header("Content-Type: text/html; charset=utf-8");
header("Pragma: no-cache");
 
//$dir    = $root;
$dir    = ".";
$files = scandir($dir);
foreach ($files as $file) {
    if(eregi("^[0-9]{4}-[0-9]{1,2}\.html$",$file)){
        echo "<a href =\"/weeks/".$file."\">".$file."</a><br/>\n";
    }
}
 
?>
每次这个页面被浏览的时候,都会判断指定格式的文件(yyyy-w.html)是不是存在,
如果上个星期(time() - 7 * 86400)的存档还没有,就将index168.html拷贝过来。
这个过程是当这个页面被浏览的时候才会执行,如果一个月都没人看这个网页,那么存档肯定是不会被保存的。
这个转存过程也可以放到根目录的index.php下,大概放在callback的rebuild部分处理,不过我还是放在了另外这个页面里,
把工作交给搜索引擎不知道会不会有什么问题。
这是历史记录的链接:http://ruby.nanshapo.com/weeks/

随机数是怎么产生的

最近在研究彩票,为什么人们那么在乎历史数据呢,虽然说简单的rand之类的函数不是很随机,但是彩票摇奖是像摇元宵那样从桶里摇出来的。
言归正传,买彩票还没中过什么奖呢。
刚才搜索了一下,原来是有一定的算法的,至于算法的理论基础,我就不知道了,也许是数学能证明的吧。
这里是一个类似glibc的实现的算法:
http://www.mscs.dal.ca/~selinger/random/

Sql/mp的Numeric和Decimal

Sql/mp是hp的NSK系统上的数据库,应该是老版本的了,新的叫SQL/MX。
SQL/mp里为什么要弄这么多的数值型的数据类型:NUMERIC,SMALLINT,INTEGER,LARGEINT,FLOAT,REAL,DOUBLE PRECISION,DECIMAL等。
而且这些类型好像还都能用在DDL语句里,而有些又是互相重合的,真的有点混。
今天主要看了一下NUMERIC和DECIMAL这两个类型。
这两个光看字面很难区分,numeric就是数字的意思,decimal是十进制的意思,不像int和float那样有没有小数点那么区别明显。
其实这两个类型的区别应该是在内部存贮上:
Numeric就是binary的,也就是内部形式。比如1,会存为0×0001
Decimal是基于ascii的,比如1会存为0×0031

NSK中进程管理的两个命令

status是显示进程信息,类似ps,status *,user表示显示所有当前用户的进程
status *,term表示由当前term启动的进程。
stop则是停止一进程,类似kill
还有一个命令就是run,用来启动一个程序,而且能启动时候会给进程付与一个名字,比如下面的$y4s5。

$VOL2 LIU 58> status *,user
Process Pri PFR %WT Userid Program file Hometerm
$Y4RZ 0,241 150 R 000 […]

用FUP建立结构化文件

File Utility Program 的缩写
简称FUP,非常强大的文件管理工具。
可以参考File Utility Program (FUP) Reference Manual
或本blog的其它文章:tag->FUP
关于什么是结构化文件,可以参考本地其它文件,tag NSK
先看看表的结构:
(前面的小横线是FUP的提示符)
-info table1,detail

TYPE K

REC 28

KEY ( COLUMN 0, OFFSET 0, LENGTH 4, ASC )

table1是一个表,在NSK中基本上就是一个文件,REC 28表示每个记录的最大长度,KEY是第一个列,offset为0,长度是4,为int型。

HP NSK系统简介

NSK 是NonStopKernel的略称。狭义上理解的话就是HP的NonStop Server上运行的操作系统。但是NSK所依存的硬件除了NonStop Server以外没有别的了,所以广义上来说NSK也可以包含硬件部分。一般都使用广义上的意义。
为了实现所谓的NonStop,NSK几乎把所有的组件都做了2重化,即使发生了故障,立刻可以从主设备迁移到副设备上去,从而实现不停机。
一个NSK一般由若干个NODE构成,而一个Node的CPU一般为2-16个。Node之间是通过高速的ServerNet技术互联的。每个node节点都有一个node id和node名,在一个系统中是不允许重复的。
Node内的各个CPU都是在同一个OS下运行的,不同的Node则可以运行不同版本的OS(我猜101%windows2000是不行的)。各个CPU可以运行不同的进程,而不像SMP那样所有的CPU一同运行同一个进程。
进程主要用进程名来标识(当然NSK中也有pid的概念)。进程名在同一个Node里不能重复(进程对除外)。不同的节点之间的进程名则可以重复。所以一般进程的标识也都附带节点标识:
节点名.进程名
进程对(Process Pair)。为了确保高可用性,你可以启动一个程序的两个进程,这两个进程就是一组进程对:Primary进程和Backup进程。业务处理主要由主进程来完成,副进程则监视主进程,如果万一主进程死掉了,业务处理则移到副进程来进行。
要编写进程对程序,需要使用NSK特殊的技术NonStopCoding。而且,进程对中的兄弟俩不能在同一个CPU上运行。
再简单说说文件系统。
不像UNIX那样存在唯一一个根目录,有点像windows,以volume为单位管理,volume就类似windows的c,d,e盘等。然而,NSK目录结构最多为两层(volume,subvolume)。
比如$data01是一个volume,下面有一个sub volume liubin,则liubin的下面只能建立文件,不能建立文件夹(NSK中好像也没有文件夹,目录这种说法。)。所以一个文件的全路径可能是这样的:
\nodeid.$volume.subvol.file
由节点名,卷名,子卷名,文件名这四部分组成。
在FORMAT1的情况下,文件最大只能到2gb,不过在FORMAT2的情况下,可以建立更大的文件了。有点类似oracle的数据文件结构,NSK的文件也是以extent为单位进行分配的,一个文件的第一个extent为primary extent,剩下的都是secondary extent。每个extent用page(2048byte)来声明。

« Previous Entries  Next Entries »

Locations of visitors to this page


Recent Comments