sas的TRANSPOSE过程详解

2010年8月16日 米店老板 没有评论

今天我第一次用到sas里面的TRANSPOSE过程,为此我查了一些资料,发现网上有些文章写的不是很清楚。下面我谈谈sas里面的TRANSPOSE过程。本文只在sas8.2下调试通过。
先看图,有些简陋。

sas transpose过程说明图

TRANSPOSE过程能实现sas数据集的转置,所谓转置,就是把观测(行)变成变量(列),变量变为观测,如上图中,从表1变成表3。该过程从读入的一个数据集中,创建一个新的数据集。具体用法格式如下:

PROC TRANSPOSE
DATA=input-data-set  LABEL=label LET NAME=name OUT=output-data-set PREFIX=prefix
;
BY  variable-1
... variable-n
;
COPY variable(s);
ID variable;
IDLABEL variable;
VAR variable(s);

sas里的所有过程,都分为选项/option和声明statement两部分,在格式上,选项与过程名是一条语句,而每个声明单独成语句,也就是用分号分隔开。在程序运行上也一样,过程与选项一次性读入后分析。
很多时候,我们也许只用到几个选项,或者几个声明就实现了自己的目的,不过如果你能确切的了解每个过程的选项和声明,会让你的程序更加简洁易读。
以下是从sas support翻译过来的,并加入我自己的解释。

选项/Options

选项1:

DATA=input-data-set

需要进行转置的数据集的名字。 默认情况下,转置最近新建的数据集。

选项2:

LABEL= label

英文的表述是:指定新输出的数据集中新观测的变量的标签,默认是_LABEL_,但是经过我的测试,这个选项没有任何意义,也就是设置与否不起任何作用。

选项3:

LET

允许重复的ID变量,并且当重复时,以最后一个为准,所谓的id变量,就是类上图中表1中name的作用,一般来讲,它的值不允许重复,因为如果重复,会导致生成重复变量。

选项4:

NAME= name

指定新转置生成的数据集里新变量的名称。比如上图中转置后的表2和表三的第一列,也就是第一个变量的名称,如果不设置,会以name of former variable命名,设置后,该变量的标签名依然是name of former variable。我认为前面的label选项,就是用来设置该变量的标签的,但是设置后居然没有变化,不知道是我sas问题还是版本的问题。在上图表3中,我设置name为tnew,所以显示为tnew。在sas9.2版本中,改默认变量为_name_。

选项5:

OUT= output-data-set

输出数据集,也就是转置后的数据集的名称,默认以data后面加数字来命名。

选项6:

PREFIX= prefix

前缀,原来观测变成变量后的前缀,不设置,也就是默认情况下,这些变量会以col1,col2排列下去,有的sas版本会以var1, var2排列下去。设置后,会以设置的字符串后加上数字1、2,并以此排列下去。为便于识别变量,这个选型经常与声明里的id混合使用,如表3,就是使用了id声明与前缀选项的结果。
例程如下,你可以copy到sas里查看运行结果。

data a;
input name $ test1 test2 test3;
cards;
wyt 98 99 97
ycy 78 45 34
ynn 78 90 87
;
run;
proc transpose data=a  name=tnew label=n  out=b  let  ;
run;
proc print data=a;
run;
proc print data=b;
run;

声明/statement

下面是transpose过程的声明。声明使用的例程如下,比上面多的就是在选项之后,与run之间的声明部分。

data c;
input name $ test1 test2 test3;
cards;
wyt 98 99 97
ycy 78 45 34
ynn 78 90 87
;
run;
proc transpose data=a  name=tnew label=n  out=d  prefix=t let  ;
id name;
var name test1 test2;
copy test3;
 
run;
proc print data=d;
run;
proc print data=c;
run;

声明1:

BY  variable-1
<... variable-n>
;

下面这张图,很清楚指明了分组转置是怎么样一个过程,其中的DESCENDING是以降序排列,而NOTSORTED,是不排序。此声明没在sas8.2下测试。

声明2:

ID variable(s);

在前面说过,prefix经常与此声明共同使用,该声明的作用就是,把新生成数据集里的变量用id的值表示出来,如上图中的表三,就是应用了id后把id的值一一指定。在sas的很多过程里均有id的概念,该值一般不重复,因此可以指定为变量,在sas数据集里,观测可以重复,变量不能重复。另外,这个声明还经常与下面的声明仪器出现。

声明3:

IDLABEL variable;

用来指定上面对应变量的label,标签。

声明4:

VAR variable(s);

指明那几个变量进行转置,在本例子中,只讲test1与test2进行了转置,生成如下图的sas数据集。

声明5:

COPY variable(s);

这个声明用来原样拷贝源数据集中的某一个变量,原样不动的含义就是在新数据集里,改变量的值与源数据集中的一样,下面的例子,最后生成的数据集如下图所示,看着有点发懵,呵呵,在仔细看看就懂了

sas transpose statement


另外,当我要获取sas数据集的变量名并赋值给宏的时候,这篇文章帮了大忙,谢谢。具体内容转帖如下:
对一个数据集的变量进行分析,至少需要变量名,对吧。如果变量少,自已逐个输入也没问题,所谓忍一忍就和谐了。如果变量多呢,就无法忍受了–一个个地敲进去,不但麻烦,且易出错。解决之道有三种。

其一是读取表的dictionary.columns.Dictionary表里保存着库名及其成员的名字。以sashelp里的表class为例。

proc
sql;


create
table vars as

  
select varnum,name

  
from dictionary.columns

  
where memname=‘CLASS’;

quit;

其中varnum表示是第几个变量,name表示变量名。值得提醒的是,Dictionary里是以大写字母的形式保存表名。所以这里须要写CLASS

其二是读取SASHELP.VCOLUMN。以数据步读取的形式如下

data vars1;

set sashelp.vcolumn;

where memname=‘CLASS’;

keep varnum name;

run;

其三是利用过程proc contents。这个要来得比读取dictionary和sashelp.vcolumn灵活。

data vars1;

set sashelp.vcolumn;

where memname=‘CLASS’;

keep varnum name;

run;

如果需要将变量名赋给一个宏变量,以空格隔开。其例如下

proc
contents
data=sashelp.class


out=vars3(keep=varnum name)

     noprint;

run;

proc
sql

noprint;


select
distinct name

     into :classname separated by
‘ ‘

     from vars3

     order
by varnum;

quit;

可以用%put &classname;察看其宏变量。得到结果

Name Sex Age Height Weight

当然有时并不想所有的变量都赋给这个宏变量。比如只想取出第1个和第2个变量给宏变量。当然也好解决。

proc
sql
noprint;


select
distinct name

     into :classname separated by
‘ ‘

     from vars3

     where varnum in (1,2)

     order
by varnum;

quit;

注意加了行where varnum in (1,2).或者

proc
contents
data=sashelp.class(keep=Name Sex)


out=vars4(keep=varnum name)

     noprint;

run;

proc
sql
noprint;


select

distinct name

     into :classname separated by
‘ ‘

     from vars4    

     order
by varnum;

quit;

%put &classname;

也是一样的。

分类: 数据可视化 标签: ,

结婚2周年

2010年8月8日 米店老板 没有评论

这不是在结婚2周年写的,但是今天突然想写,因为我听到我们一位博导一句话,女博导,她说:

不要和女人讲道理。

我想,阿弥陀佛、老衲懂了。为了让人误以为是一个系列,格式与以前一样、八股文也没什么不好。

1、感情

我是学理的,我是搞科学的,虽然比不上搞理论物理的聪明,但是我还真没觉得自己不聪明,甚至还偶尔为解决科学或者技术中的小问题而沾沾自喜。为此,我有一个油然而生的习惯,讲道理。

首先、其次、在次;让我总结一下你刚才的说法;你首先就把你自己给反驳了;不对,你没有任何道理;首先我们假设你有道理,记住,我说的是假设,……你看,从假设为为真的道理都推导出错误的结论;你还狡辩?。

你知道,我一讲起道理,哪怕我有一点点道理的时候,我就气势如虹,从对方观点的世界观、人生观、什么鸟观,错误点、正确点、什么鸟点,然后举事实讲道理、反证、推导、总结、归纳、分类。不管有没有道理,驳倒你就是有道理。

于是,突然间,只要我和老婆一讨论,规规矩矩的自然科学乱了套了,老婆就像氢,氢不带一个电子了,又粘上一个电子,氢负我没商量,明明她已经同意的,认为对的,突然间改弦易辙,搞得我还要耐心重头开始阐述我的观点。“啊!天哪,你是天使妈妈派下来收拾我的吧!”有时候我不得不如此绝望的对她说。

后来虽然我很少和她辩论了,但是总是转弯抹角的讲故事、借寓说实,现在,我一切都放弃了。

其实我之前听过这个道理,但是从一位女博导的口里说出来,搞自然科学的女博导的口里说出来,我不得不心生感叹:

阿弥陀佛,老衲懂了!

2、吵架

嗯,你知道,打是亲骂是爱,有时候你还是要挑起一点战事来检验双方的武器装备的,就当军事演习了。当年美国人干过小日本,现在还一起联合军演呢,你说呢?

3、家务

多赚钱,雇保姆,我才不愿意干这个事情呢。

4、购物

2周年的时候,还不会过日子呢,天天逛,月月净,钱袋子虽然不鼓,快乐很满。
2年了,啊,老衲四年后才懂。


这里还有结婚三周年可以阅读。

分类: 幸福生活 标签: ,

乳品分析-非蛋白氮及硝盐测定中的问题

2010年8月6日 米店老板 没有评论

以下是回答的一些问题,希望有用,如有问题,敬请提出。另外,欢迎任何人给我email咨询乳品分析方面的问题,我将竭尽所能的回答。我的email地址在这里。你要告诉我你采用的具体步骤,至少要告诉我用的哪一个标准的那一个方法,更详细的告诉我您操作中与国标有何不同。近日非常忙,邮件回复不及时见谅。

    1 国标非蛋白氮含量测定方法中为什么用蔗糖做空白样?

采用凯氏定氮法测定蛋白时,有一个不可避免的问题就是那些难以消化的物质,如硝酸盐、亚硝酸盐、生物碱、吡啶、喹啉化合物、氨基比林等,这个问题在测定非蛋白氮的时候更为突出,而蔗糖具有还原性,能够把这些难以消化的氮转换成可以滴定的铵。具有还原性的物质很多,而之所以选择蔗糖,一是因为其稳定的性质,不受盐浓度和酸浓度的影响,二是蔗糖是植物提取物,含氮较低,不易造成空白值偏高的问题。除蔗糖外,还可以选择水杨酸、铬、锌、硫酸铁等具有还原性而又不影响滴定的物质。

    2牛奶中非蛋白氮含量多少为合格范围?

牛奶中非蛋白氮含量受很多因素影响,牛的品种、饲料的种类(比如喂饲含三聚氰胺和高硝酸盐含量的饲料)、饲养条件、牛乳中体细胞数量影响,而且影响较大,并没有一个统一的数值。衡量非蛋白氮含量(掺假除外),经常用非蛋白氮占总氮的比值来衡量,因为如果加上牛乳密度、干物质含量等因素就更难以得出一个稳定的数值。也就是(非蛋白氮NPN/总氮TN)这一比值,非蛋白氮占总氮的百分比,具有一定的指导意义。这个值目前比较常见的是:5.75,考虑到各种影响因素,大约从4.8%-5.8%都是可以接受的范围。

    3 以下为硝酸亚硝酸盐的问题。

1)因为还原率的计算方法是通过还原硝酸盐的来测量的,所以,当你使用过量的的硝酸盐的时候,可能会有部分硝酸不能还原,可以降低硝酸盐的量,比如用10ml标准液进行测量,当然,后面的换算关系要变动一下。如果此时还原效率提高,说明镀铜镉粒有问题。以后可以减量测定。或者自己按照GB的方法在镉粒上电镀铜。

2)镉是起还原作用的,而铜以及铜离子在氧化还原作用中起催化作用。因此,如果铜度的量过多或者过少,都会影响还原效率。一般,镀铜镉粒应该是灰黑色的才对。

3)测定中,氨缓冲液有两个作用,一是用来去除附着在镉表面由于铜产生的沉淀,二是提供稳定的pH环境。因此,氨缓冲液的浓度及质量也很重要,测定氨缓冲液的pH,或者新配缓冲液。

4)镀铜镉粒在保存、运送过程中不能接触空气,所以你见到的一般都是放到水里的。而且在装柱过程中也不能暴露在空气中,否则影响性能。

5)镉柱装好后需用较高浓度的硝酸盐溶液进行激活,也就是标准所说的新制备柱的处理。此步骤也必须做好。
6)过柱流速的问题,什么叫做适合的流速?就是能够让溶液中的硝酸盐或者其他需要反应的物质充分接触镉粒的流速,流量和流速是一个意思,因此,如果你采用和标准一致(柱子内径和高度及镉粒的颗粒大小)的柱子,建议使用标准推荐的流速。

在GB5009.33-2010应用中,有几位同仁向我反映第三法稳定性,我没做,也可能是测定习惯问题,仅供参考。
以后我陆续把我回答的问题贴出来。

结婚四周年

2010年7月18日 米店老板 8 条评论


好久没有更新博客,今天寻思打开看看,随机显示的文章里是结婚三周年,我猛然想起,我的四周年居然已经过去了,我也突然想起,很久之前有一天,老婆趴我耳朵边上,嗲声嗲气:老公,快到结婚纪念日了,你打算给我买什么呀?我坐这里仔细想了想,我忘记当时买给她什么东西了,呵呵。但是这篇文章不能落下,即使再忙,也争取继续下去。而且每年的格式都要一样。

    1、感情

也许是太忙的缘故,我们的感情依然没什么变化,没有变深,也没有变浅,深深浅浅的过的还算舒服。也许生活本来如此,波澜不惊,平平淡淡。见到帅哥,她赞美几句,遇到美女,老婆不在的时候,俺也没让我这眼睛白长。从去年到今天,我不知道什么时候开始有打鼾的毛病,尤其是喝酒以后,愈发的响,为此屡次被老婆撵到另外一个房间睡觉,可是不到一周,她又把我叫回去了,说是没我睡得不踏实。生活太平淡,但是似乎还没有到摸她的手像左手摸右手的感觉。其实很多时候爱情就是一种习惯,就像左手摸右手,摸不到的时候,也心慌。

    2、吵架

感情依旧,吵架依旧。三年的时候,打架基本是我告负,四年这档,打架我基本没赢。看着三周年时信心满满的写上“我还有未来”,此时我的心情真是灰暗一篇,唉!不过,打不过,俺还躲不过吗?在此精神的指导下,发扬一不怕吵,二不怕累的精神,我成功躲过几次核威胁。在此,容我向布置“TMD”反导系统(此TMD可不是骂人哦)的美国和北约朋友说几句,对于一个善于躲藏,以出其不意攻击对手弱点的对手来说,你那个玩意真是小儿科。说的更具体点,就是JB用都没有,你有张良计,我有过墙梯,魔高一尺道高一丈这句话在现代战争中,已经不能奉为金科玉律了。婚姻生活也是如此,我躲,嗯哼,让Y失去准头。虽然有时候我老婆常常没有敌人,创造敌人也要吵,但一个“躲”字总能让我平安无事。当然了,被动挨打岂有出头之日?我经常蓄积力量,瞅准对方系统运行的弱点,进行准确、垂直打击,说的更具体一点,就是举一反三,总有同样的事情,因为她心情好而不跟我吵,此时我和颜悦色,满脸堆笑,说:宝贝,唇枪舌剑虽然能打跑我的肉体,但是不能摧垮我的精神,糖衣炮弹虽然不能摧残我的肉体,但是能够摧垮我的精神。你说你选哪样呢?为此,我老婆总用糖衣炮弹对付我,比如端洗脚水,剪指甲多干家务之类的,不过我现在有些对这些伎俩有些发怵。

    3、家务

家务问题仍然是我们婚姻中最为棘手的问题,这不是重复,仍然、依然、确实还是个棘手的问题。你知道,老婆的收拾你的智商是不断增长的,三年前用的招数今天已经彻底不能用了。现在我老老实实的告诉我老婆:老婆,今天试验很多,我很累,不想擦地。老婆虽然有时会柳眉倒竖,不同意我的意见,但是更多的时候,会主动爬到地上,看老婆干活,但凡我不太累,我都会抢着干下,这样一来,老婆对我更为殷勤,这有点让我始料未及。

    4、购物

赚钱的问题,嗯,这是一个我持续努力的问题,这也不是一个着急的问题,枕戈待旦,尽心尽力。不会是什么问题,毕竟,现在我的生活还算可以。我有房,虽然不大;我有车,虽然两个轱辘…..。你跟我比钱,我就跟你比幸福,你跟我比幸福,我就跟你比钱?哼哼!

分类: 幸福生活 标签: ,

SAS变量输入输出格式控制

2010年7月18日 米店老板 4 条评论

读朱世武老师的《SAS编程技术教程》,的确是一本不错的书籍,至少很适合我。因为对于我,对SAS算初窥门径,经常在编程的时候忘记一些函数,或者寻找软件的一些功能,这本书恰恰就是如此,作为刚刚入门的书籍并不好,但是作为参考书,很好,至少把很多函数和命令分门别类清晰的表述清楚了。其实国内的书籍都很少能够达到这个层次。这本书相对于SAS帮助文档来说,查阅比较方便,因为sas帮助文档不能搜索,而这本书更体现参考书的价值。

最近要处理大量的日期、和会计(带千位符)的数字,以前处理这类数据都是从excell导入的,操作之后发现,导入的数据有时会出现一些小问题,而且还要用insight一个个的编辑变量,比较麻烦,希望能够通过cards一次性录入。方便以后存储和备份,因为随着SAS应用越来越多,我更倾向于用SAS来创建、管理我的研究数据。为此,我阅读了朱老师关于变量输入与输出格式控制的内容,笔记如下:

    1、输入格式

输入格式是SAS系统用来读入数据值的一个指令。

输入格式形式

<$>  INFORMAT<W>.<D>

选项说明:

$ 字符格式
W 输入数据的列数
D 数值输入格式中保留小数的位数
Informat 用来规定数据的输入格式

通用规则:
所有输入格式必须包含一个点(.)作为名字的一部分;
对于省略W和D值的输入格式,使用系统缺省值。

    2、列格式输入
input @6 date ddmmyy10.  @+1 stocd $ 8.  oppr 8.2;

说明:从第6列开始以DDMMYY10.格式读入变量DATE, 第7列开始以长度为8的字符格式读入变量STOCD,然后以数值格式8.2读入变量OPPR。
查看都安装了那些模块,和一些系统信息。

    3、数值与字符相互转换的方法

字符转换数值

1
2
3
4
5
data;
x='98.6';
y=input(x, 4.);
put x= y=;
run;

说明:INPUT函数和w.d输入格式将X的字符值转换为一个数值Y。还有一个更简单的,将字符值转换为数值的方法。

1
2
3
4
5
data;
x='98.6';
y=x-0;
put x= y=;
run;

数值转换为字符

1
2
3
4
5
data;
x=2557898;
y=put(x, $8.);
put y;
run;

例中,用PUT函数得到正确结果,即字符型2557898.

1
2
3
4
5
data;
x=2557898;
y=put(x, $3.);
put y;
run;

例中,Y的结果为3E6.

4、读入会计格式字符
读入类似11,222.11格式的字符。

1
2
3
4
5
6
7
8
data a;
input x;
informat x comma12.4;
cards;
12,345.1234
22,345.1234
;
run;

当然,你可以按照下表,更换不同的输入格式以读入不同格式的数据。

其中,COMMAw.d 用于输入格式读入包含字符的数值,这些字符包括: 逗号、空格、 $、%、破折号、圆括号等。
5、输入输出日期
SAS系统存贮日期值为1960年1月1日到这个日期之间的天数。

1
2
3
4
5
6
7
data a;
input date mmddyy10.;
cards;
10-01-2002
10/01/2002
;
run;

此时,日期中存储的是天数,当使用insight等的时候,不直观,所以一般用下面的程序录入数据。

1
2
3
4
5
6
7
8
data a;
input date mmddyy10.;
format date yymmdd10.;
cards;
10-01-2002
10/01/2002
;
run;

当然,你还可以根据下表,输入不同格式的日期数据。

此时,存储的虽然仍然是天数,但是是根据您的要求显示了。还可以根据下面的表,设置具体的显示形式。

    5、PUT函数

PUT函数可将数值转换为字符(如前所述),但最常用的是改变变量的字符输出格式。
例1: 转换数值变量cc的值为三个字符的十六进制表达式。

1
2
3
4
5
data;
cc=16;
cchex=put(cc,hex3.);
put cc hex3.;
run;

结果为010.
例2: 将数值CC转换为字符值。

1
2
3
4
data;
cc=16;
cc=put(cc,3.);
run;

例3: 输出时美元符号放在数值前面,中间加上千分号。

1
2
3
4
data;
Netpay=1254.71;
put @53 netpay  dollar10.2;
run;

输出值为$1,254.71.

字符变量的输出格式可以查阅下表。

再一次感谢朱世武老师的总结。

分类: 数据可视化 标签: , ,

会费公平分摊计算工具

2010年7月12日 米店老板 没有评论

王建硕的博客看到一个很好的分账表格工具,用excell做的,用于解决几个人一起出去,不同收费项目由不同的人付账,如何分摊的问题。很优秀的一个小工具,虽然简单,但是解决了本来很复杂的问题。本着学习的精神,把小工具下载下来研究了一番,很有收获。然后我利用所学的东西,做了一个会费分摊的工具。:)

    问题描述

总和和单位几位爱好羽毛球的同事玩,时间久了,因为每次支付的钱不多,不可能次次分账,而且也不方便。大家就提议凑一笔钱用于支付水费、场地费、球费等支出,于是我们几个人每个人拿了100元,权作会费,统一购买球票和羽毛球。玩了几次之后发现,有些同事往往缴了会费就玩了一次,有的次次去,这样对那些偶尔才玩一次的同事就不公平。为了体现公平,让多玩的多分摊会费,少玩的少分摊,当某人缴纳的会费用光之后,自动提示该会员充值。我用excell做了这个会费公平分摊的计算工具。用了一段时间,感觉还行,希望大家多多提意见。

    用法:

先在“软件设定”表格里输入场地费的单价,比如我们羽毛球场地费是每小时15元,然后在第一个表格内输入会员姓名以及每次玩的时间,玩的小时数,每次的花销,我们的花销是买水、买羽毛球及有时会有的车费,在第一个表姓名下面,输入0表示此人没有参加此次活动,输入1表示这次此人参加本次活动,输入2表示带了一个人参加本次活动,加上自己是2个人,3表示带了2个人参加活动,加上自己是3个人,以此类推。输入好之后,在第二个表格支出明细里,在“缴纳会费”一行,输入缴纳会费的累加值,比如某人第一次缴纳100元,当会费用完之后,他又缴纳100元,则该人下的缴纳会费单元格内就应该输入200元。输入好之后,软件就可以用了,当某人的会费被花光,在第二个表格里,该人下面的单元格会变成红色,并标志处该人欠多少会费。

点击这里下载。分账工具下载地址点这里

分类: IT技术 标签: , ,

SAS8.2安装及学习笔记

2010年7月11日 米店老板 没有评论

最近一直要用SAS分析数据,以前一直用SAS6.12,这次下载了SAS8.2,借这个机会把8.2给搞定。

    安装问题

安装很容易,只是在破解时间限制的时候,总是提示:

sashost.dll missing or has been opened

google了半天没有结果,后来到安全模式下运行,嗯,搞定。后来在搜索别的什么东西的时候,发现一个破解时间限制的办法,摘录如下,原文点这里

由于原来提供的SAS8.2破解方法是针对SP1的,所以导致现在用SP2的很多朋友无法成功破解时间限制,现经过测试将方法提供给大家。
本人不提倡使用盗版软件,但有时为了学习的方便或了解某个软件的目的,偶尔使用一下盗版还是可以的:

1. XP+SP1:
将时间调到2002年8月1日前—->安装,licence就指向这个setinit.sss—>完后,运行Patcher,时间限制就可以取消了。

2.XP+SP2:
将时间调到2002年8月1日前—->安装,licence就指向这个setinit.sss—>完后,必须进入SAFE MODE模式,然后运行Patcher,才可以成功破解日期限制。

  • 我在这里加上一句,有条件请使用正版软件。
    • 2、SAS几种常见的图形操作界面

    分析员(Analyst):和SPSS操作类似,有助于学习SAS语句;
    SAS/INSIGHT: 可视化的数据探索工具,将统计方法与交互式图形显示融合在一起;
    SAS/ASSIST: 全面的图形操作界面,包括SAS在数据管理、统计分析、绘图等方面常见的功能;
    SAS/LAB: 半自动化图形操作界面,可帮助初学者快速熟悉SAS系统。

      3、SAS的solutions菜单

    相比SAS6.2,新版本增加了solutions菜单,其集成了许多SAS的模块入口,比如Analyst, Design of experiments et al.而且,这里的Accessories里面有六个有趣的小游戏。

      4、其他小东西

    Length一般出现在变量定义之前;
    Format指定格式要在input之前;

    分类: 数据可视化 标签:

    弗朗茨.冯.索氏(Franz Von Soxhlet)

    2010年7月9日 米店老板 没有评论

    franz-von-soxhlet

    弗朗茨.冯.索氏(Franz Von Soxhlet),是索氏提取法的发明者,后人在此基础上设计了许多改进的脂肪提取仪,如Soxhtherm, Soxtec, Butt, Goldfish, Bailey-Walker, Rohrig等。

    弗朗茨.冯.索氏(Franz Von Soxhlet)1848年1月12日出生于布尔诺(Brnn)摩拉维亚(Mhren,波希米亚的一部分),1926年5月5日逝于慕尼黑(德国)。他的父亲是比利时的移民。

    1872年,弗朗茨.冯.索氏在莱比锡获得化学博士后,同时成为莱比锡农业和动物化学研究所的研究助理。1873年,他来到维也纳,担任农业化学科研工作站的助理。1879年,成为慕尼黑动物生理学和奶制品农业高等学校教授,并一直工作到1913年。1894年,他获得哈雷大学(the university of hale)的医学博士学位。

    索氏的主要研究成果,都发表在”Münschener Medizinische Wochenschrift”这一杂志上。

    索氏发表有关牛奶的生理特性(1873年)和黄油的生成机制的(1876年)论文后,发表了他在脂技术研究领域中一项最为重要的成果(1879):他发明了一种新的用于从乳中提取脂肪,后来在全世界广泛应用于从生物材料中提取脂肪的仪器,索氏提取器。这个装置大大的改进了脂类的研究,但当时,仅在几个实验室有所应用。后来,他又发明了一个简单直接测量牛奶脂肪含量的装置(1881年)。他还研究了人造黄油的化学性质(1887年)。在乳品化学领域,他提出了糖分析(1880年,1892年)方法,酸度(1897)的概念。他在婴儿乳消毒工作(1886年)方面的研究,促使他发明了一个简单的家庭设备消毒(巴氏消毒)奶瓶(1891年)。在德国,当时索氏被认为是婴幼儿喂养“改革者”。
    1893年,他发表人乳与牛乳的化学差异的论文。而且他也是第一个把牛乳蛋白分成酪蛋白,清蛋白、球蛋白和乳蛋白的科学家,他还首次说明牛乳中存在的糖–乳糖。1900年,他调查了牛奶中的钙盐含量和佝偻病频率的关系。1912年,作为他的最后几项研究之一,建立了人与牛的铁含量与婴儿贫血关系。

    售后培训页面的建立方法

    2010年7月5日 米店老板 2 条评论

    讲课,不可避免的学生向你要ppt和各种资料,用U盘copy?病毒很危险,怎么办呢?这个东西又不能随意分发。最近新学了php,讲课的时候灵光一闪,想到了解决思路。

    建立一个页面,学院输入姓名后转到下载页面,然后再用文件记录到访日志,学员姓名用遍历数组的方法确认。这个主意导致我讲课突然中断,和各位学员面面相觑。

    最近我总有这样的毛病,正讲课呢,脑子里就突然出现了另外一件事情的解决办法,大概因为这节课讲的东西我太过熟悉了吧。

    言归正传,说说这个培训售后服务是如何写好的,这也算是我学习php的一个学习作品吧。您可以先到www.wangyutang.com/sh/体验下先。
    首先,建立登陆界面,很简单,就是一个带form的php文档,代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    
    <html>
    <title>王玉堂培训售后服务网</title>
    <body>
    <center>
      <h1>王玉堂培训"售后服务网"</h1>
      <p>
      	<h3>输入姓名后,就可以下载教师在课堂上的所有课件及资料</h3>
      	<br>姓名必须和通讯录上的一致方可下载<br>
      <form action="sh.php" method="post">
       <table>
          <tr>
           <td>学员姓名</td>
          <td><input type="text" name="name"></td>
         </tr>
          <tr>
           <td><input type="submit" value="登陆"></td>
           <td><input type="reset" value="重置"></td>
          </tr>
        </table>
       </form>
     
    </center>
     
    <p>
    <center>Copyright &copy Wang Yutang 2007, 2008, 2009, 2010<center>
    </body>

    登陆后的post的提交页面叫做sh.php,这个页面首先用数组存入学员的姓名,然后使用for循环遍历数组,当提交的学院姓名与数组中的某个学员姓名一致的时候,给出下载地址,并打开日志文件aa.txt讲登陆的学员姓名记录下来。下载地址本来计划使用header跳转的,可最近没时间研究。以后再说。如果数组遍历后,没有一致的学员姓名,则给出提示。这个本来用一个if语句来写,但是我觉得if语句太长了怕以后看不懂,就在一致的时候给一个变量赋值,然后再判断这个变量是否得到了该值,没有得到,则给出出错提示。
    看代码,我已经给出了详细的解释。我之所以没用数据库,是因为用到数据库更为麻烦,还不如如此。我之所以用for循环来进行数组遍历,只是我习惯用for循环,不晓得和foreach之间的效率差别,这不是我考虑的问题了,我只是要实现我的目的。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    
    <?php  
    $name = $_POST["name"];
    define("GREETING","很高兴与您共同度过5天时间,祝您工作顺利,万事如意,有事情可以随时拨打售后电话或者发送email。地址是:");
    define("email","king@gmail.com");
    define("mobilephone","137XXXXXXXX");
    //访问日志,访问文件是1log.txt,2log.txt是输入错误学员姓名的记录。
    $filename = '1log.txt';
    $filenameall = '2log.txt';
    //2010.6.26日班名单,共计19人。
    $a = array("张三","李四");
    $num = count($a);
    if ($name)
    { 
    for ($i=0;$i<$num;$i++)
    {
        if ($a[$i]==$name)
       {
    ?>
    <center>
    	<center><h1>中国XXXX<br>国家XXX<br>XXXX售后服务网</h1><br>2010年6月26日-2010年6月30日</center>
    <?php
          echo "<h1>" . "欢迎:" . $name . "</h1" . "<p>";
    	    echo "<center>" . constant("GREETING") . "<p>" . constant("email") . "<br>" . constant("mobilephone") . "</center>";
    	    echo "下载地址“
    	   //用判断是否输入正确学员姓名,
                  $good = "1";
    	 //写入日志文件,查看都谁下载了课件。   
    	if (is_writable($filename)) {
     
        if (!$handle = fopen($filename, 'a')) {
             //echo "无法打开日志文件 ($filename)";
             exit;
        }
     
        // Write $somecontent to our opened file.
        if (fwrite($handle, "$name\n") === FALSE) {
            //echo "无法写入日志 ($filename)";
            exit;
        }
     
        //echo "成功将 ($name) 写入日志文件 ($filename)";
     
        fclose($handle);
       exit;
    	} else {
        exit;
        //echo "无法记录到日志文件: $filename ,日志文件不可写!";
    	}
    ?>
    </center>
    <?php	 }
    }
    }
     
    if ($good <> "1")
    {
    	echo "您输入了错误的姓名,或者您并非我班学员!";
    	echo "<a href=\"index.htm\">重新登录</a>";
    	echo "<br>";
    // 把输入错误的也记录到日志文件。
    	if (is_writable($filenameall)) {
        if (!$handle = fopen($filenameall, 'a')) {
             echo "无法打开日志文件 ($filenameall)";
             exit;
        }
     
        // Write $somecontent to our opened file.
        if (fwrite($handle, "$name\n") === FALSE) {
            echo "无法写入日志 ($filenameall)";
            exit;
        }
        echo "成功将 ($name) 写入日志文件 ($filenameall)";
     
        fclose($handle);
       exit;
    	} else { 
        exit;
        echo "无法记录到日志文件: $filename ,日志文件不可写!";   
    	}
    }
     
    include("footer.php");    	
     
    ?>

    简单吧,php真的很简单,至少上手比较容易。以后会改正下载方式,隐藏下载地址。这个程序总计花了我5个多小时的时间。前期调试wamp半天,后来调试cookie半天,本来想让用户反复登录,判断用户是否登录,如登录自动跳转,没太弄明白,而且要把登录页面也改成php的,为了节省时间,就没弄。以后把第二个培训班的名单也登陆上。

    在记录趣事一件。前几天看荷兰和巴西的比赛,这是我世界杯开赛以来我看的第一场足球赛,虽然我是个十足的伪球迷,而且最近忙的一直很累,但是还是贪心的想看一场完整的世界杯比赛。这场球看得精彩,开场十分钟,巴西就用一个精准的直塞搞定荷兰一个球,我想,我不太相信荷兰不进球,罗比的脚法我还是蛮信任的,就这样看到半场打平,半场后我就有点迷迷糊糊,后来听见欢呼声又进了一个球,此时我已睡意沉沉,不知觉间进了梦乡,待我凌晨3点醒来,揉揉眼睛,奇迹出现了,场上居然变成了0:0,我当时的感觉那真是千头万绪,看了半天我没整明白这到底是怎么回事,难道不算了?这个世界好神奇,呵呵,当我有这种想法的时候,我看到了屏幕右上角的时间,又看到了对阵双方,我才想起来,都第二场了。呵呵。当时我真是懵(这个词我念了N年的糟了)了,想起我们神奇的国度,以为南非也和谐了。呵呵。现在想起来我都得儿呵呵笑一笑。

    分类: IT技术 标签: ,

    念想

    2010年5月25日 米店老板 2 条评论
      黑幕
      我一直在骨子里认为自己是个蛮纯洁的那么一个人,可是现在我越来越不自信。很多同事跟我谈非常勿扰,跟我谈快乐男声出了伪娘,这些我一点都不感兴趣,因为我知道那里面都有黑幕。记得我当年很纯洁的时候,朋友和我讲,你想想,他们选秀是为了什么?为了赚钱,要想赚钱,就得按照主办方既定好的路子走,否则万一出了差头,或者没有像主办方设想的那样赚个盆满钵满,下一次他能不吸取教训搞黑幕吗?我低头想想真是那么一回事,人家提供一舞台,先生女士们本着娱乐自己的精神上台蹦蹦跳跳,这就足够了,关心那劳什子黑幕。
      优雅
      什么叫做绅士?优雅,什么叫做优雅?平静。我不得不承认,有时候我还是着急。万一那件事情没有按照我的思路走,我就一阵火气,事后屡屡后悔。其实这我在很多年前就开始修炼了,有位和尚朋友曾经和我说,有才而性缓,你缺的就是平静。当时我看着他一坨肉嘟嘟的脸,满脸的不屑。现在看来,无论我有没有才,都要性缓。基本上我从参加工作以来就意识到了这个问题,但是修炼起来真TM挺难的。嗯,优雅!!!
      总之,最近我的心得是:
      1、做事需要时间,别着急;
      2、着急也没用;
      3、慢一点说话有好处;
      4、别想着做贡献,先想着生活;
      5、生活就是做贡献。

    想告诉朋友的是:
    1、不能像怨妇那样活着;
    2、活着就不能像个怨妇;
    3、我不知道现代有没有祥林嫂;
    4、更不理解为嘛我们把祥林嫂理解的那么深刻,还硬往社会上赖;
    5、祥林嫂就是怨妇。

    分类: 幸福生活 标签: ,