第一篇:基于Struts2 Result Type为chain 的Action之间数据传递
chain:基本用途是构造成一条动作链。前一个Action将控制权转交给后一个Action,而前一个Action的状态在后一个Action里仍然保持着。
我现在有一个场景,FirstAction 通过chain的方式,将控制权交给 SecondAction。FirstAction对应的页面代码为first.ftl,SecondAction对应的页面代码为second.ftl。假设我们的FirstAction如下定义:
public class SecondAction extends ActionSupport{ private CustomUser user = null;
public String execute()throws Exception { // 利用user做事情或显示在页面上 }
// getter setter }
意思很明确了,通过first.ftl的输入,到DB中或其他,生成了我们的CustomUser对象,这个CustomUser对象将要在SecondAction使用。
于是我们想到了要配置FirstAction 的 name为toSecond的 Result type为 chain,将 生成的CustomUser对象传递到 SecondAction中,我们也这样做了,但是 经过调试,发现在SecondAction中没有得到 FirstAction中的CustomUser对象。
SecondAction是这样实现的:
public class SecondAction extends ActionSupport{ private CustomUser user = null;
public String execute()throws Exception { // 利用user做事情或显示在页面上 }
// getter setter }
看一下ChainingInterceptor.java的实现,发现有这样的注释:
An interceptor that copies all the properties of every object in the value stack to the currently executing object
.在 FirstAction 中CustomUser user 并没有在 value stack 中,所以没有拷贝到SecondAction中。
知道了问题所在,就要解决。首先是想换一种方式去做,将我们要传递的参数通过 其他 Result type 如redirectAction去传递。例如:
SecondAction execute ${user}
但这样做的缺点是,1.我们要在浏览器上看到很长很乱的URL(如果超过URL长度限制那就更悲剧了)。2.暴露这些参数总感觉很不爽。
3.自定义的对象不能用这种方式传递,要么传String、或JsonObject等。
另外一个解决办法:
因为Result type为chain时,在执行SecondAction时,它的上一个Action,也就是FirstAction的实例并没有被销毁,FirstAction的实例被加入到了ValueStack中。所以,实现的思路就是,增加一个拦截器,在执行Actioin前判断一下,当前Action是否需要从前面的Action实例中获取数据。
这个可以通过注解的方式告诉拦截器,当前的action需要什么样的对象。思路明确了,来看看代码: 注解类:ChainTransParam.java import java.lang.annotation.Documented;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;
@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)@Documented public @interface ChainTransParam { String fieldName()default “";}
拦截器实现:ChainParameterInterceptor.java /** * Result type 为chain时 可通过注解的方式实现参数传递 此参数为前置Action的成员变量、并提供getter方法
* 此参数并不要求一定要在值栈中 * * @author liming */
public class ChainParameterInterceptor extends AbstractInterceptor {
private static final long serialVersionUID =-***6358L;
@Override public String intercept(ActionInvocation invocation)throws Exception { ValueStack stack = invocation.getStack();CompoundRoot root = stack.getRoot();
// 值栈不为null 且已经有前置Action // 栈最顶层(index = 0)为当前Action、紧接着(index = 1)为前置Action if(root == null || root.size()<= 2){ return invocation.invoke();}
// 当前Action对象
Object target = invocation.getAction();
Field[] fields = target.getClass().getDeclaredFields();
// 遍历此Action对象的属性 是否有RecieveData注解
for(Field field : fields){ if(field.isAnnotationPresent(ChainTransParam.class)){ ChainTransParam rData = field.getAnnotation(ChainTransParam.class);// 取得源数据字段名
String fromName = rData.fieldName();fromName = StringUtils.isEmpty(fromName)? field.getName(): fromName;
// 取得最近的前置Action Object srcAction = root.get(1);
// 取得对应字段的值
Object value = ReflectionUtils.getFieldValue(srcAction, srcAction.getClass(), field.getName());// 设定值
ReflectionUtils.setFieldValue(target, field.getName(), field.getType(), value);} }
return invocation.invoke();}
@SuppressWarnings(”unused“)private Object findFieldValue(CompoundRoot root, Field field){ Object value = null;
int size = root.size();
// 按顺序遍历前置Action for(int index = 1;index < size;index++){ Object srcAction = root.get(index);
Object tmp = ReflectionUtils.getFieldValue(srcAction, srcAction.getClass(), field.getName());// 取得对应字段的值 则返回
// 问题:如果前置Action中该字段本身就为null 则无法处理 if(tmp!= null){ break;} }
return value;} }
在拦截器的实现中,我是只取得前一个Action中的数据,并没有迭代寻找整个ValueStack的Action,也是可以这样实现的,请看我的findFieldValue方法的实现,但这个方法在此拦截器中并没有使用上。因为我不想这样做。代码完毕之后,配置好拦截器,我们只要在 SecondAction中 这样定义即可:
public class SecondAction extends ActionSupport{ @ChainTransParam private CustomUser user = null;
public String execute()throws Exception { // 利用user做事情或显示在页面上 }
// getter setter }
当在执行SecondAction之前,拦截器会去查找FirstAction,是否有 user 对象,有则将值拷贝到 SecondAction 中。
ChainTransParam 注解 允许输入参数名,没有输入则默认根据变量名去查找。
注:Struts2 Reference里的意思是不提倡使用Result Type Chain。
另:ReflectionUtils.java 实现: import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;
import org.apache.commons.lang.StringUtils;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;
public abstract class ReflectionUtils { private static final Log logger = LogFactory.getLog(ReflectionUtils.class);
public static void setFieldValue(Object target, String fname, Class> ftype, Object fvalue){ setFieldValue(target, target.getClass(), fname, ftype, fvalue);}
public static void setFieldValue(Object target, Class> clazz, String fname, Class> ftype, Object fvalue){ if(target == null || fname == null || ”“.equals(fname)||(fvalue!= null &&!ftype.isAssignableFrom(fvalue.getClass()))){ return;}
try { Method method = clazz.getDeclaredMethod(”set“ + Character.toUpperCase(fname.charAt(0))+ fname.substring(1), ftype);//if(!Modifier.isPublic(method.getModifiers())){ method.setAccessible(true);//} method.invoke(target, fvalue);} catch(Exception me){ if(logger.isDebugEnabled()){ logger.debug(me);}
try { Field field = clazz.getDeclaredField(fname);//if(!Modifier.isPublic(field.getModifiers())){ field.setAccessible(true);//} field.set(target, fvalue);} catch(Exception fe){ if(logger.isDebugEnabled()){ logger.debug(fe);} } } }
public static Object getFieldValue(Object target, String fname){ return getFieldValue(target, target.getClass(), fname);}
public static Object getFieldValue(Object target, Class> clazz, String fname){ if(target == null || fname == null || ”“.equals(fname)){ return null;}
boolean exCatched = false;try { String methodname = ”get" + StringUtils.capitalize(fname);Method method = clazz.getDeclaredMethod(methodname);//if(!Modifier.isPublic(method.getModifiers())){ method.setAccessible(true);//} return method.invoke(target);} catch(NoSuchMethodException e){ exCatched = true;} catch(InvocationTargetException e){ exCatched = true;} catch(IllegalAccessException e){ exCatched = true;}
if(exCatched){ try { Field field = clazz.getDeclaredField(fname);//if(!Modifier.isPublic(field.getModifiers())){ field.setAccessible(true);//} return field.get(target);} catch(Exception fe){ if(logger.isDebugEnabled()){ logger.debug(fe);} } } return null;} }
第二篇:工地数据传递流程规定
工作流程规定
为确保各部门、各项目部数据信息上报渠道畅通,做到信息资源共享,特制定工作流程规定如下:
一、数据信息传输渠道
项目部数据信息传输及原始单据和凭证,可采取邮件、短信及邮寄等方式。一是所有生产施工数据信息,传公司经营部造价员处;二是所有工程内业资料信息,传经营部资料员处;三是所有物资采购申请与消耗数据信息,传经营部物资助理处;四是所有行政、人事信息资料,传综合部人力资源助理处;五是所有原始单据和凭证,邮寄财务部出纳处。
二、数据信息传输时间规定
(一)生产日报表
项目部出纳(或指定人员),每天的产值、点工及运输等日报表,务于次日12点前上传公司经营部;同时,将现金日记帐上传财务部。
(二)票据报送
项目部出纳(或指定人员)每月3号、15号、25号前,将所有原始单据和凭证(包括费用报销单、供应商送货单、与甲方有关业务单据、出入库单及相关统计报表等),寄回公司财务部。
(三)验工计价单
项目部出纳(或指定人员)每月28号前,将甲方验工计价单及班组、点工结算单上传公司经营部。
(四)材料消耗表与物资计划、采购申请单
每周一,项目部出纳(或指定人员)将生产消耗主、辅材料统计表上传公司经营部;每月15号、30号前,项目部出纳(或指定人员)将物资计划、采购申请单上传经营部。
(五)考勤表与请假单
每月3号前,项目部出纳(或指定人员)将项目负责人审核签字的上月考勤表及请假单一并上传公司综合部;每月10号前,综合部统计核实完毕各部门及项目部考勤,一并交到财务部,作为发放工资的依据。
(六)会议记录
项目部每周必须召开一次工作例会,出纳(或指定人员)务于次日12点前,将会议记录上传公司综合部。
(七)考核表(具体考核目标,视各项目而定)
每月30日前,分管副总负责对所属项目负责人(项目经理、副经理)当月完成目标产值、安全文明施工等情况进行考核,项目负责人对所属现场管理人员履行职责、生产施工监管等情况进行考核,并于次月3号前将考核结果上传公司综合部。
(八)用工协议与离职报告
项目用工需与项目部负责人签订用工协议,辞职需写离职报告并经项目负责人签字同意,并在第一时间将当事人用工协议、身份证件、离职报告等人事资料,扫描上传公司综合部。
上述报送内容,不按规定时间报送的,延误一天/项处罚50元。此规定自二0一四年元月一日起执行,执行中若有不妥之处,请各部门、各项目部及时提出,以便修订和完善。
综合部
二0一三年十二月三十一日
第三篇:不同数据库之间数据转移经验总结
不同数据库之间数据转移经验总结 http://
不知道是不是自己幸运还是不幸,工作就一年的时间,我却接触了两次程序改版,而且是之间将其他语言写的程序改成php的。我其实觉得这是幸运。第一个是.net写的一个导医系统,使用的access数据库,第二个是.net写的一个内容管理系统,使用的sqlsever数据库。都要改为php+mysql的。从这两次经验中,我的确是学到了不少东西。并且也千万不要以为是多么复杂的事情,虽然是有点复杂。
既然是程序改版,当然就要涉及到原来数据的转移,虽然时下有不少所谓的数据转移工具,但是我们学习程序的人也知道,不同的数据库结构设置等等肯定有差别,而且还有令很多人头疼的编码问题,对于编码问题,我也是有一些研究的,过几天会写一个有关程序编码的问题的总结。今天我主要是说说我们怎么来做不同数据库之间的数据转移。授人以鱼不如授人以渔。相信对要做类似功能(比如数据处理、往期数据分析、数据转移等)的程序员有一定的帮助。
首先的前提是,不要奢望有最便捷成型的现成程序或软件来帮你,最好就是通过自己熟悉的语言,自己动手写程序来转移。
程序数据转移以我的方式来分的话可以分为两大类,当然可以更加细分。第一类是:由其他程序转移到自己专业的开源程序;第二类是由其他程序转移到自己专业的自己开发或自己团队开发的私有程序。不要小看,这有很大的不同。如果是转移到开源程序,虽然人家是开源的,但是不见得我们就完全熟悉人家的每个功能与设计吧,尤其是数据库字段的设计。那么我们在数据转移前就要仔细分析其数据库、表设计,而如果是自己的程序,就相对从容了许多。而来源数据因为是自己不熟悉,甚至是根本不知道的程序写的,那更要分析了,这就不用说了。
那么首先就先说说分析数据,1是分析旧版程序,程序都是相通的,有的时候我们转移数据并一定是说有数据,可能有的你只要转移文章表,转移较之采集(虽然也可以用采集实现)的好处就是可以保证数据的高度一致,就是id这个字段也一样,因为文章很多都是用id组合的文件名、路径,这样我们就可以通过配合栏目目录保证文章的路径不变。如果是内容管理系统类的旧程序,最好也是往自己熟悉的开源程序上转,以为这些开源程序历经时间的考验真的是相当的完善,至少要比你自己考虑的要全面很多,比如织梦、帝国这样的开源程序,其巧妙的模型设计几乎可以让我们实现任何功能。而一些系统类、功能类的程序,可能用一些这样的内容管理开源程序就不合适了,最好就是自己开发了。而分析旧版程序也没有必要让你直接学会另一门语言,我们只需要通过后台、数据库、前端,来弄清楚数据的结构,展示、分类、等等。比如文章类的,我们要找清楚对应的分类,对应的表在哪里,是单独的表还是所有分类都是用的一个表(这个很重要),就足够了,因为内容类的,我们几乎就是需要其文章内容;而系统类的,就比较麻烦一点,人家可能要求尽可能保证原来所有的数据,那我们在没有旧版程序开发说明书的情况下就要自己摸索了,最好能自己装个测试版,一个功能一个功能的来分析,今天操作,记录数据库数据变化,结合其字段注释,自己的尝试经验等来分析各个字段的意义。弄清楚了这个就好办了,一个系统真正复杂的表其实也没几个,先从简单的入手,因为表直接可能是有联系的,你简单的不明白是不可能弄懂其在别的表作为外键时的意义的。并且最好是有测试人员或辅助人员,因为自己很容易就弄乱。
2是分析新版系统,新版系统针对的是我们使用的开源系统,最重要的一点就是要添加测
试数据测试,因为一般情况下我们都知道数据库设计的时候都是有一些默认或初始值的,在我们搞不清楚字段初始值是怎样的情况下,可以在开源程序中加一个默认数据,根据这条数据,来判断默认值,这样在转移的时候一定注意给这些需要加初始值的字段添加正确的初始值(虽然数据设计中可能有的会自动加初始值,但是在一些特殊情况下回不起作用,所以要注意)。
分析数据是一个比较繁琐的事情,但是,我们在分析数据的时候其实可以和转移程序开发同时进行,这个转移程序是数据转移的重点,只是单纯的分析,永远也搞不清楚,有的时候做事情要先着手去做,做的过程中就会有了思路。下面就说说如何做转移程序。
我是学php的,当然做的这两个项目都是改成php程序,但是无论什么程序,基本都会有操作不同数据库的接口,类库或者扩展等等,php就有很多,几乎可以操作所有类型的数据库,不过,其操作不同数据库的能力是不同的,比如,php对mysql的操作几乎是最方便的,而对sqlsever和access的操作就弱了一些,虽然有一些类库,但是有的时候因为版本的不同而无法使用,所以我们要尽量的从底层代码来写转移程序,有的时候,我们也可以通过一些中间手段,就比如字符编码一样,所有编码都可以和utf-8进行转换,我要在另外两者间转换,可以通过utf-8作为中间人。数据转移也是一样,有的时候我们通过自己的程序很难操作人家的数据库,但是他可以转换为一个你可以操作的数据库也可以。以mysql来说,mysql可以存储为sql文件,或者是任何的文件,只需要在里面存储sql语句,用程序读取执行就可以。其他程序也是一样,我们就通过读取出原始数据,用php或你的专业语言,进行sql重组。然后执行插入,而中间要注意的就是一些编码、特殊字符、已经一些字段类型!尽量的让自己写的转移程序体验好一些、也就是智能一些,有比较好的扩张性,可以节省大量代码!其实就是提取封装一下!
任何程序的操作,其实都是对数据的操作!
第四篇:MATLAB GUI数据传递总结
Matlab的GUI参数传递方式总结
其实Matlab提供了很多种直接或间接方法实现多fig中的数据共享,只是大家没有注意
罢了:
1、全局变量
2、作为函数的参数传递
3、利用控件的userdata数据
4、为handles结构体添加新字段
5、setappdata函数为句柄添加数据
6、跨空间计算evalin和赋值assignin
7、将数据保存到文件,需要时读取
8、带参数调用GUI的M文件
9、嵌套函数(不适用于GUIDE中,只适用纯命令是的GUI)
一、全局变量
运用global定义全局变量传递参数,适用于gui内控件间以及不同gui间。这种方式恐怕是最简单的方式,是很省心!但是,简单的问题就在于有时你会很头疼!因为在每一个要到该全局变量的地方,你都要添一句gloal x,还有就是如果你在一个地方修改了 x的值,那么所有x的值就都变了!有的时候恐怕会出现紊乱。另一个更重要的问题在于,套用C++的一句话,全局变量破坏了程序的封装性!所以,全局变量是能少用尽量少用。
以下创造一个简单的GUI给大家说明一下,建一个GUI,包含两个按钮,一个坐标系,一个用来画y=sin(x),一个用来画y=cos(x);eg:在GUI的OpeningFcn函数中写: global x y1 y2 x=0:.1:2*pi;y1=sin(x);y2=cos(x);在pushbutton1_Callback函数中写 Global x y1 Plot(x,y1)在pushbutton1_Callback函数中写 Global x y2 Plot(x,y2)全局变量是比较方便的,但全局变量会破坏封闭性,如果不是有大量数据要传递,建议不要使用。
二、运用gui本身的varain{}、varaout{}传递参数
这种方式仅适用于gui间传递数据,且只适合与主子结构,及从主gui调用子gui,然后关掉子gui,而不适合递进结构,即一步一步实现的方式。输入参数传递(主要在子gui中设置):
比如子GUI的名称为subGUI, 设想的参数输入输出为:[out1, out2] = subGUI(in1, in2)在subGUI的m文件中(由GUIDE自动产生):
1.第一行的形式为:function varargout = subGUI(varargin)该行不用做任何修改;varargin 和 varargout 分别是一个可变长度的cell型数组。输入参数in1和in2保存在varargin中,输出参数out1,out2包含在varargout中; 2.在subGUI的OpeningFcn中,读入参数,并用guidata保存,即: handles.in1 = varargin{1};handles.in2 = varargin{2};guidata(hObject, handles);返回参数的设置:
1.在主GUI的OpeningFcn函数中加上[out1, out2] = subGUI(in1, in2),用于调用子gui,并在结尾加上uiwait(handles.figure1);figure1是subGUI的Tag,主要是等待调用子gui的过程,从而获得子gui的输出参数out1、out2;
2.subGUI中控制程序结束(如“OK”和”Cancel"按钮)的callback末尾加上uiresume(handles.figure1),注意是主gui的窗口handles.figure1,不要将delete命令放在这些callback中;
3.在子GUI的OutputFcn中设置要传递出去的参数,如 varargout{1} = handles.out1;varargout{2} = handles.out2;末尾添加 delete(handles.figure1);结束程序。
在GUI的OpenFcn中,如果不加uiwait,程序会直接运行到下面,执行OutputFcn。也就是说程序一运行,返回值就确定了,再在其它部分对handles.output作更改也没有效果了。
加上uiwait后,只有执行了uiresume后,才会继续执行到OutputFcn,在此之前用户有充分的时间设置返回值。
通过以上设置以后,就可以通过 [out1, out2] = subGUI(in1, in2)的形式调用该子程序。
在一个GUI中调用另一个GUI时,主GUI不需要特别的设置,同调用普通的函数一样。在打开子GUI界面的同时,主程序还可以响应其它的控件。不需要担心子GUI的返回值被传错了地方。
三、userdata数据
直接通过对象的userdata属性进行各个callback之间的数据存取操作,主要适用于gui内。首先必须将数据存储到一个特定的对象中,假设对象的句柄值为ui_handle,需要存储的值为value,则输入以下程序即可:
set('ui_handle','UserData',Value);此时,value数据就存在句柄值为ui_handle的对象内,在执行的过程中若要取回变量可以通过以下方式在任意callback中获取该数据值 :
value=get(''ui_handle,'UserData');虽然使用这种方法简单,但是每个对象仅能存取一个变量值,因此当同一对象存储两次变量时,先前的变量值就会被覆盖掉,因此都用UserData存储简单与单一的数据。如下面有两个gui函数,myloadfn加载mydata.mat文件,该文件内存储XYData变量,其值为m*2的绘图矩阵,加载后将该变量值存储到 当前的窗口的UserData属性中。另一个myplotfcn函数则是用以获取该UserData属性中存取的绘图数据,然后绘图。代码如下:
function myloadfcn load mydata;set(gcbf,'UserData',XYdata)
function myplotfcn XYdata=get(gcbf,'UserData');x=XYData(:,1);y=XYData(:,2);plot(x,y);userdata的缺点就是一个句柄只能放一个Userdata。
四、GUI数据(handles)
结合handles和guidata函数,适用于gui内,如果你在pushbutton1中得到一个变量X,相传出去,那么在pushbutton1的callback中,在得到X后添加如下代码: handles.X=X;guidata(hObject,handles)(注意,一定是两行连写)在pushbutton2中要用到X是,在其callback先添加 X=handles.X; 即可得到X的值。注:
1.guidata(object_handle,data);如果object_handle不是figure型句柄,那么会将data保存在object_handle的父figure对象中。这样不必担心在一个pushbutton的callback中存储的变量在其他对象中无法提取。
2.data = guidata(object_handle);获取当前object_handle的handles数据,最后一次guidata(object_handle,data)保存的数据。
一个简单的GUI给大家说明一下,建一个GUI,包含两个按钮,一个坐标系,一个用来画y=sin(x),一个用来画y=cos(x);eg:在GUI的OpeningFcn函数中写: x=0:.1:2*pi;y1=sin(x);y2=cos(x);handles.x=x;handles.y1=y1;handles.y2=y2;guidata(hObject, handles);%注意,在OpeningFcn函数中这句是本身存在的,若在其它函数中,务必加上这句
在pushbutton1_Callback函数中写 x=handles.x;y1=handles.y1;plot(x,y1)在pushbutton2_Callback函数中写 x=handles.x;y2=handles.y2;plot(x,y2)
五、Application数据
应用setappdatagetappdata与rmappdata函数,适用于gui间和gui内。使用上面三个函数最有弹性处理数据的传送问题,与UserData的方式相类似,但是克服UserData的缺点,使一个对象能存取多个变量值。
(1)getappdata函数
value=getappdata(h,name)(2)setappdata函数
setappdata(h,name,value)(3)rmappdata函数 rmappdata(h,name)首先在matlab命令窗口输入magic(3)数据,因此当前的工作空间就存储了magic(3)这组数据了,然后建立一个按钮来获取并显示magic(3)数据。A=magic(3);setappdata(gcf,'A',A);%save uicontrol('String','显示矩阵
A','callback','A=getappdata(gcf,''A'')');A =
1 6 3 5 7 4 9 2 当在主、子gui内调用时,可以如下设置
fig1调用fig2时,使用fig2指令来打开fig2, 在fig2的m文件中,在回调函数中用setappdata(fig1,'A',A);实现返回fig1,并将参数A传递给fig1 然后在fig1的使用A的地方添加A=getappdata(fig1,‘A’)。
但这种方式的一个问题就是每调用一次,fig1的数据就得初始化一次,这是因为setappdata(fig1,'A',A)中出现了fig1,调用一次setappdata就得运行一次fig1的缘故,解决方案就是把setappdata(fig1,'A',A)改为setappdata(0,'A',A),这样把A读入matlab workspace,相当于一个全局变量了,但当然比直接用global定义全局变量好!同样的例子:
eg:在GUI的OpeningFcn函数中写: x=0:.1:2*pi;y1=sin(x);y2=cos(x);setappdata(handles.figure1,'x',x)%在figure1下创建’x’,包含数据x,也可以放在其它句柄下,如setappdata(handles.pushbutton1,'x',x),不过一般放在figure1下,记起来方便…… setappdata(handles.figure1,'y1',y1)setappdata(handles.figure1,'y2',y2)在pushbutton1_Callback函数中写
x=getappdata(handles.figure1,'x');%提取,当然用get了…… y1=getappdata(handles.figure1,'y1');plot(x,y1)在pushbutton1_Callback函数中写
x=getappdata(handles.figure1,'x');y2=getappdata(handles.figure1,'y2');plot(x,y2)
六、跨空间计算evalin和赋值assignin 适用于gui间和gui内 Assignin函数基本语法
assignin(ws, 'var', val)其中'base' or 'caller',分别表示基本工作空间和调用函数(caller function)工作空间,Assinin函数将值val指定给工作空间ws中的变量var,若变量var不存在,则创建一个变量var。从一个函数function向MATLAB工作空间中输入数据; 在一个函数function内部,需要改变一个在caller function函数工作空间中定义的变量,例如函数形参列表中的变量。例子:
%向基本工作空间中传输数据变量 Function assignin_test1 prompt = {'Enter image name:','Enter colormap name:'};title = 'Image display-assignin example';lines = 1;def = {'my_image','hsv'};answer = inputdlg(prompt,title,lines,def);assignin('base','imfile',answer{1});assignin('base','cmap',answer{2});
evalin函数基本语法
evalin(ws, expression)[a1, a2, a3,...] = evalin(ws, expression)在特定的工作空间执行MATLAB语句,expression的形式如
expression = [string1, int2str(var), string2,...] [a1, a2, a3,...] = evalin(ws, expression),将返回值赋予变量a1,a2,a3,...evalin(ws,'[a1, a2, a3,...] = function(var)')注:
evalin('caller', expression),只能指定callerfunction函数中的变量为expression的语句,而不能是subfunction 该函数不可嵌套使用,evalin('caller', 'evalin(''caller'', ''x'')')是错误的
例子:
如果在figure1中有个变量a1 则传入时assignin('base','a1',data)%data是workplace中的变量 在figure2传出时a2=evalin('base','data');%a2是figure2中的变量
七、将数据保存到文件,需要时读取
运用save和load(importdata)传递参数,适用于gui间和gui内。将某变量x的值先存到磁盘,用的时候在调用。格式如下:save('*.mat','x');用的时候就用load('*.mat'),但这样只是把x读到了matlab workspace,不会用显示,你还要再去查看这个变量名, 然后才能用,建议使用p=importdata('*.mat'),p是一个结构体,可以随意使用了。当然,这种方式涉及到磁盘读写,速度当然会有影响的,一般情况不用,通常用在保存以及导入某个变量时!
八、带参数调用GUI的M文件
这个相信大家都很熟悉了,适用于gui间和gui内。
总结几点:
① 如果变量数据量很大,需要占用大量内存,不要将变量存储为handles的变量,因为每个控件每次调用callback function都会使用handles,增加不必要的内存开销。若改变量存取不频繁,可以考虑UserData数据或者Application数据;若存取比较频繁,建议使用Global变量和Application结构体,这里的Application要定义为setappdata(0,'var',val)以及getappdata(0,'var',val)。② 对于GUI界面之间的数据传递,可以考虑以下几种方法: 方法1:采用global函数。可以采用这种方法共享数据;
方法2:采用findobj和findall函数查找对象句柄 findall(0, 'Type', 'figure', 'Tag', 'figure1')查找标签为figure1的窗口,无论该窗口是否隐藏。
方法3:采用handles结构。
假设我们在窗口1的Opening函数中,采用函数创建了一个子窗口2: h_fig = figure('Visible', 'off',...);h_btn1 = uicontrol('Parent', h_fig, ‘Tag', 'btn1',...);h_btn2 = uicontrol('Parent', h_fig, ‘Tag', 'btn2',...);h_btn3 = uicontrol('Parent', h_fig, ‘Tag', 'btn3',...);
如果我们要在窗口1的任何回调函数中,直接访问子窗口2的任意控件,可以在上述语句后紧跟着写下如下语句:
handles.btn1 = h_btn1;handles.btn2 = h_btn2;handles.btn3 = h_btn3;最后,需要一个guidata语句。当然,Opening函数最后有guidata语句,所以不用自己添加。
方法4:将要共享的数据使用save函数存入mat文件;或者使用文件I/O函数,存入文本文件中。
第五篇:IBM POWER8为大数据而生
IBM POWER8为大数据而生
“POWER8全面走向开放,这将给整个IT产业带来崭新的机遇。”IBM大中华区副总裁、系统与科技部总经理郭仁声在2014年IBM POWER全新一代系统平台发布盛典上这样总结POWER8带来的意义。
开放
在发布盛典上,IBM正式发布POWER8技术并推出一系列全新的Power Systems服务器。据介绍,IBM为最新Power Systems投入24亿美元,历经3年研发,利用数百种IBM专利创新技术。这些系统基于IBM POWER8芯片,该芯片大小仅有一平方英寸,嵌入了超过40亿个微型晶体管、交换机和超过11英里的高速铜线。
IBM通过OpenPOWER基金会向业内开放了具有数十年技术积累的POWER相关技术,包括工艺、处理器、I/O、固件、操作系统和软件等各个层级的技术,这为企业打造自主、安全、可控的IT产业链提供重要技术基础。
IBM Power系统的实时分析能力将极大地提升业务创新的可能性,如银行的反欺诈分析、证券交易实时分析,可提升业务风险防范能力。
FIS是一家支付处理和银行解决方案提供商,其解决方案采用新一代POWER8系统和IBM FlashSystem全闪存阵列。FIS分析认为,利用IBM POWER8和IBM FlashSystem存储阵列相结合的功能和性能,实现了更高的利用率和性能,同时获得灵活的计算资源,从而满足客户的应用处理和业务交付需求。POWER8能够提供安全秘钥加密加速和加密协处理器功能,FlashSystems能够提供企业级的超高性能和超低的应用时延,两者结合为FIS提供了一种对当前核心银行应用环境来说至关重要的基础架构。
同时,IBM将继续在Power Systems产品线中提供Red Hat和SUSE Linux操作系统配置。
用户更多选择
新一代Power系统是一个全面为大数据设计的系统,首批5个基于POWER8的全新Power系统,专为大规模的scale out计算环境设计,利用率可达65%,分析速度比最新的x86系统快50倍,成为超越x86服务器的更好选择。
在利用率和经济性上,本次发布的S Class服务器极大程度降低了数据中心占地空间、电力和冷却等方面的成本。据IBM方面测试,一台高效利用的 S Class服务器可以取代10台或更多x86服务器(按照业内平均利用率计算)。全新Power Systems的数据吞吐量是x86服务器的2倍,从而使数据中心占用空间减半。Power8系统更具有内置的加密引擎技术,突破性的安全能力,使关键应用和数据可以放心地放到云上。
另外,超大规模云数据中心也在寻求x86以外的技术,以实现更完整的自主性。IBM的测试表明,新的1&2插槽Power Systems具有为云提供向外扩张的经济优势。同时,加密内置于基础架构中,安全性更高。Power技术的各种传统优势和开放创新结合,为企业需求提供了更多的选择,而企业将成为良性竞争的最终受益者。
此外,IBM还将推出一系列针对合作伙伴的举措,以推动POWER8的落地和应用,包括注资华胜天成旗下子公司―北京新云系统科技有限责任公司,实现基于 Linux on Power相关的硬件和软件产品的开发及销售,打造企业级的应用商店。