KindEditor编辑器无法获得提交的数据

以下列举KindEditor4X几处问题及解决方法: PS:标红处为重点。 1. 使用A标签提交表单: <form name="frm" action="demo.php" method="post"> 详细 内容:<textarea name="content" style="width:800px;height:400px;visibility:hidden;"></textarea><br> <a href="#" οnclick="Javascript:frm.submit()">提交</a> </form> 把上面A标签代码改成下列即可, 提交前需要执行editor.sync(),editor是K.create返回的对象。 <a href="#" onclick="Javascript:editor.sync();frm.submit();">提交</a> 注意:提交表单的命名(标蓝色处)要一致。 2.检查form标签放在table和tr之间,如果是这样的话form自动绑定事件可能有问题。解决方法是,提交时请执行一下editor.sync()。 具体实例如下: <link rel="stylesheet" href="kindeditor/themes/default/default.css" /> <link rel="stylesheet" href="kindeditor/plugins/code/prettify.css" /> <script charset="utf-8" src="kindeditor/kindeditor.js"></script> <script charset="utf-8" src="kindeditor/lang/zh_CN.js"></script> <script charset="utf-8" src="kindeditor/plugins/code/prettify.js"></script> <script> KindEditor.ready(function(K) { var editor = K.create('#content', { cssPath : 'kindeditor/plugins/code/prettify.css', uploadJson : 'kindeditor/php/upload_json.php', fileManagerJson : 'kindeditor/php/file_manager_json.php', allowFileManager : true, afterCreate : function() { var self = this;

lsnrctl command not found,sqlplus commend not found

在linux安装完oracle时,当你遇到lsnrctl command not found或者sqlplus commend not found等命令都不能用时,会有几种情况 1,首先你先查看下环境变量里面有没有加入oracle的配置 执行 echo $ORACLE_HOME 没有的话,你执行 export ORACLE_HOME=<your Oracle Home> . 比如your orcal home是/db/product/11.2.0/dbhome_1 然后再执行 export PATH=$ORACLE_HOME/bin;$PATH 重起profile source profile 2,当配置完环境变量后,还是不行,可以执行如下操作 cd / su - root su - oracle 这样基本上是可以解决了,如果还不行的话,把电脑搬到楼顶,你懂的. source /home/oracle/.bash_profile

手机网页点击链接触发手机自动拨打或保存电话的代码

通过网页拨打电话 <p><a href=”wtai://wp/mc;135xxxxxxxx ”>拨打电话</a></p> 注: 135xxxxxxxx是号码, 你可以换成你想拨打的号码. 通过网页存储电话号码 <p><a href=”wtai://wp/ap;1860;中国移动”>存储号码</a></p> 注: 这种方法可以直接调出手机的保存电话号码的界面. 以上方法在Dopod机器上验证过. 其他机器不保证是否实现了WTAI. 最后摘录一段WTAI的介绍: WTAI: wireless Telephony applications interface. It defines a set of WTA-related functions in a wireless device that can be invoked via WML or WMLScript. 无线电话应用接口,它定义了一系列的无线设备上的与WTA相关的功能函数,这些功能函数能被WML或WMLScript调用. WTAI 函数只能在WAP1.2以上的版本用. 拨打电话我在nokia s60 V3上测试的,其他的无保证。。 前面发的这文,经过测试这段拨号代码<a href=”wtai://wp/mc;110 ”>拨打电话</a>只在塞班与安卓上支持,而iphone是不支持的,现在有更新的方法如下: <a href=”tel://110 ”>拨打电话</a> 这种方式塞班、安卓与iphone都支持。

FF下innerHTML获取不到input标签中value的值解决办法

页面代码: <div id="divid"> <input type="text" value="" id="testid" /> </div> 很多时候,,,页面上input标签中的value需要通过javascript动态设置其值:document.getElementById('testid').value='test value'; 通过document.getElementById(‘divid’).innerHTML: IE下:<input type="text" value="test value" id="testid" /> FF下:<input type="text" value="" id="testid" /> 这就达不到我们想要的效果。。。。。 解决办法: document.getElementById('testid').value='test value'; 修改为: var testid = document.getElementById('testid'); testid.value = "test value"; testid.setAttribute("value", testid.value); 这样就通过innerHTML在FF下就可以获取和IE下一样的效果了。。。。。

jQuery.cookie.js中cookie设置遇到的问题

jQuery.cookie.js文件内容相信看到这的朋友都有了: jQuery.cookie = function(name, value, options) { if (typeof value != 'undefined') { // name and value given, set cookie options = options || {}; if (value === null) { value = ''; options.expires = -1; } var expires = ''; if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) { var date; if (typeof options.expires == 'number') { date = new Date(); date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));

不共线三点确定圆心的简便算法

平面上三点圆的外心,或者空间中三点所确定平面上过此三点圆的圆心的计算公式如下: If the vertices of a triangle are A(x1, y1, z1), B(x2, y2, z2) & C(x3, y3, z3), then circum-centre x = (x1Sin2A + x2Sin2B + x3Sin2C)/ (Sin2A + sin2B + sin2C) similar for y-coordinate, z-coordinate 虽然我没有想过如何推导,但是在计算机上测试,三维情况下是正确的。 外接圆半径为R=abc/(4S), S 是三角形的面积。

『业务知识』关于条码、SKU、款号

条码(Barcode):用于唯一标识某一组具有相同特定规格等的商品 款号(Style):用于标识某一款商品,具体这一款商品有多少个条码、SKU,就要看商家的了 库存盘点单位(SKU,Stock Keeping Unit):用于库存管理,一般为「款号+颜色+尺寸」 一般我们在做系统的时候,都是用的款号与SKU来进行标识一件商品,而不是使用Barcode。 当然,一般从扫描枪中扫描出的是Barcode,然后我们需要进行一些处理才会得到SKU。 我们也可以再对SKU进行处理,从而得到款号。 至于一个商品的价格应该定位在哪一个层次上,这个就要看具体的商家了。我做过按款号(一般个体差别不大的采用这个)定价的,也有按SKU的(比如:当IPhone4S是一个款号时,白色的、黑色的就可能分别是两个SKU,而白色的与黑色的价格不同,所以可能是按SKU定价的)。 参考: BarcodeSku 转载于:https://www.cnblogs.com/sitemanager/archive/2012/03/15/2398312.html

file.length()方法返回0字节

今天测试告诉我说上次的图片大小显示为0,而在硬盘上看是有大小的,自己检查代码发现:该文件是自己新生成的,流没有及时关闭,在关闭前调用的file.length()方法,故出现了此问题,但有的时候也可以得到文件大小的。

Android Broadcast 和 BroadcastReceiver的权限限制

在Android应用开发中,有时会遇到以下两种情况, 1. 一些敏感的广播并不想让第三方的应用收到 ; 2. 要限制自己的Receiver接收某广播来源,避免被恶意的同样的ACTION的广播所干扰。 在这些场景下就需要用到广播的权限限制。 第一种场景: 谁有权收我的广播? 在这种情况下,可以在自己应用发广播时添加参数声明Receiver所需的权限。 首先,在Androidmanifest.xml中定义新的权限RECV_XXX,例如: <permission android:name = "com.android.permission.RECV_XXX"/> 然后,在Sender app发送广播时将此权限作为参数传入,如下: sendBroadcast("com.android.XXX_ACTION", "com.android.permission.RECV_XXX"); 这样做之后就使得只有具有RECV_XXX权限的Receiver才能接收此广播要接收该广播,在Receiver应用的AndroidManifest.xml中要添加对应的RECV_XXX权限。 例如: <uses-permission android:name="com.android.permission.RECV_XXX"></uses-permission> 第二种场景: 谁有权给我发广播? 在这种情况下,需要在Receiver app的<receiver> tag中声明一下Sender app应该具有的权限。 首先同上,在AndroidManifest.xml中定义新的权限SEND_XXX,例如: <permission android:name="com.android.SEND_XXX"/> 然后,在Receiver app的Androidmanifest.xml中的<receiver>tag里添加权限SEND_XXX的声明,如下: <receiver android:name=".XXXReceiver" android:permission="com.android.permission.SEND_XXX"> <intent-filter> <action android:name="com.android.XXX_ACTION" /> </intent-filter> </receiver> 这样一来,该Receiver便只能接收来自具有该SEND_XXX权限的应用发出的广播。 要发送这种广播,需要在Sender app的AndroidManifest.xml中也声明使用该权限即可,如下: <uses-permission android:name="com.android.permission.SEND_XXX"></uses-permission> 如此,可以用来对广播的来源与去处进行简单的控制。 同样,对Activity 和 ContentProvider的访问权限控制也类似。

相对路径 绝对路径

1、首先文件分隔符一般用/ ,\ 是转义符这个应该要熟悉。 2、然后绝对路径和相对路径的表示方法大多数情况下都相似的: /开头表示根目录, ./表示当前目录, ../上级目录, 直接用文件名不带/也表示同一目录,这些都是相对于当前文件的位置来说的。 3、绝对路径的话就是写全了

用Java编写你自己的简单HTTP服务器

HTTP是个大协议,完整功能的HTTP服务器必须响应资源请求,将URL转换为本地系统的资源名。响应各种形式的HTTP请求(GET、POST等)。处理不存在的文件请求,返回各种形式的状态码,解析MIME类型等。但许多特定功能的HTTP服务器并不需要所有这些功能。例如,很多网站只是想显示“建设中“的消息。很显然,Apache对于这样的网站是大材小用了。这样的网站完全可以使用只做一件事情的定制服务器。Java网络类库使得编写这样的单任务服务器轻而易举。 定制服务器不只是用于小网站。大流量的网站如Yahoo,也使用定制服务器,因为与一般用途的服务器相比,只做一件事情的服务器通常要快得多。针对某项任务来优化特殊用途的服务器很容易;其结果往往比需要响应很多种请求的一般用途服务器高效得多。例如,对于重复用于多页面或大流量页面中的图标和图片,用一个单独的服务器处理会更好(并且还可以避免在请求时携带不必要的Cookie,因而可以减少请求/响应数据,从而减少下载带宽,提升速度);这个服务器在启动时把所有图片文件读入内存,从RAM中直接提供这些文件,而不是每次请求都从磁盘上读取。此外,如果你不想在包含这些图片的页面请求之外单独记录这些图片,这个单独服务器则会避免在日志记录上浪费时间。 本篇为大家简要演示三种HTTP服务器: (1) 简单的单文件服务器 (2) 重定向服务器 (3) 完整功能的HTTP服务器 简单的单文件服务器 该服务器的功能:无论接受到何种请求,都始终发送同一个文件。这个服务器命名为SingleFileHTTPServer,文件名、本地端口和内容编码方式从命令行读取。如果缺省端口,则假定端口号为80。如果缺省编码方式,则假定为ASCII。 import java.io.*; import java.net.ServerSocket; import java.net.Socket; public class SingleFileHTTPServer extends Thread { private byte[] content; private byte[] header; private int port=80; private SingleFileHTTPServer(String data, String encoding, String MIMEType, int port) throws UnsupportedEncodingException { this(data.getBytes(encoding), encoding, MIMEType, port); } public SingleFileHTTPServer(byte[] data, String encoding, String MIMEType, int port)throws UnsupportedEncodingException { this.content=data; this.port=port; String header="HTTP/1.0 200 OK\r\n"+ "Server: OneFile 1.0\r\n"+ "

C中static的作用

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。 (1)先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性。为理解这句话,我举例来说明。我们要同时编译两个源文件,一个是a.c,另一个是main.c。 下面是a.c的内容 char a = 'A'; // global variable void msg() { printf("Hello\n"); } 下面是main.c的内容 int main(void) { extern char a; // extern variable must be declared before use printf("%c ", a); (void)msg(); return 0; } 程序的运行结果是: A Hello 你可能会问:为什么在a.c中定义的全局变量a和函数msg能在main.c中使用?前面说过,所有未加static前缀的全局变量和函数都具有全局可见性,其它的源文件也能访问。此例中,a是全局变量,msg是函数,并且都没有加static 前缀,因此对于另外的源文件main.c是可见的。 如果加了static,就会对其它源文件隐藏。例如在a和msg的定义前加上 static,main.c就看不到它们了。利用这一特性可以在不同的文件中定义同名函数和同名变量,而不必担心命名冲突。Static可以用作函数和变量的前缀,对于函数来讲,static的作用仅限于隐藏,而对于变量,static还有下面两个作用。(2)static的第二个作用是保持变量内容的持久。存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,说到底static还是用来隐藏的。虽然这种用法不常见,但我还是举一个例子。 #include <stdio.h> int fun(void){ static int count = 10; // 事实上此赋值语句从来没有执行过 return count--; } int count = 1; int main(void) { printf("global\t\tlocal static\n"); for(; count <= 10; ++count) printf("

PHP文件上传至另一台服务器

PHP程序上传文件时,想指定上传到另一台服务器。 move_uploaded_file这个方法第二个参数指定的存放路径需要和php程序文件一个服务器,没办法指定其他服务器的地址,本人才疏学浅,哪位大哥会的还请赐教下。 既然不能这样实现,肯定有其他办法的,想着ftp也可以实现文件传输的哇,继而朝ftp方向入手。 首先,在自己台式机和笔记本上都开通了ftp,这个不会的同学可以网上查serv-u,相关教程肯定不少的。 然后在台式机本地做了个测试: $ftp_server = "192.168.1.100"; $ftp_user_name = "laohu"; $ftp_user_pass = "123456"; $conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server"); $file = 'test.txt'; $remote_file = '/test/a.txt'; $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass); if (ftp_put($conn_id, $remote_file, $file, FTP_BINARY)) { echo "文件移动成功\n"; } else { echo "移动失败\n"; } ftp_close($conn_id); 运行后:文件移动成功。 要的就是这个效果了,之后用台式机做程序服务器,上传附件时全用ftp方法上传至笔记本上,笔记本ip是105,相应代码如下: if (is_uploaded_file($_FILES['uploadfile']['tmp_name'])) { $ftp_server = "192.168.1.105"; $ftp_user_name = "lesley"; $ftp_user_pass = "123456"; $conn_id = ftp_connect($ftp_server) or die("Couldn't connect to $ftp_server"

Transform【变形】属性

来源:http://www.w3cplus.com/content/css3-transform 今天开始我们一起来学习有关于CSS3制作动画的几个属性:变形(transform)、转换(transition)和动画(animation)等更高级的CSS3技术。本文主要介绍的是这三个属性之中的第一个──变形transform。 Transform字面上就是变形,改变的意思。在CSS3中transform主要包括以下几种:旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix。下面我们一起来看看CSS3中transform的旋转rotate、扭曲skew、缩放scale和移动translate具体如何实现,老样子,我们就从transform的语法开始吧。 语法: transform : none | <transform-function> [ <transform-function> ]* 也就是: transform: rotate | scale | skew | translate |matrix; none:表示不进行变换;<transform-function>表示一个或多个变换函数,以空格分开;换句话说就是我们同时对一个元素进行transform的多种属性操作,例如rotate、scale、translate三种,但这里需要提醒大家的,以往我们叠加效果都是用逗号(“,”)隔开,但transform中使用多个属性时却需要有空格隔开。大家记住了是空格隔开。 取值: transform属性实现了一些可用SVG实现的同样的功能。它可用于内联(inline)元素和块级(block)元素。它允许我们旋转、缩放和移动元素 ,他有几个属性值参数:rotate;translate;scale;skew;matrix。下面我们分别来介绍这几个属性值参数的具体使用方法: 一、旋转rotate rotate(<angle>) :通过指定的角度参数对原元素指定一个2D rotation(2D 旋转),需先有transform-origin属性的定义。transform-origin定义的是旋转的基点,其中angle是指旋转角度,如果设置的值为正数表示顺时针旋转,如果设置的值为负数,则表示逆时针旋转。如:transform:rotate(30deg): 二、移动translate 移动translate我们分为三种情况:translate(x,y)水平方向和垂直方向同时移动(也就是X轴和Y轴同时移动);translateX(x)仅水平方向移动(X轴移动);translateY(Y)仅垂直方向移动(Y轴移动),具体使用方法如下: 1、translate(<translation-value>[, <translation-value>]) :通过矢量[tx, ty]指定一个2D translation,tx 是第一个过渡值参数,ty 是第二个过渡值参数选项。如果 未被提供,则ty以 0 作为其值。也就是translate(x,y),它表示对象进行平移,按照设定的x,y参数值,当值为负数时,反方向移动物体,其基点默认为元素 中心点,也可以根据transform-origin进行改变基点。如transform:translate(100px,20px): 2、translateX(<translation-value>) : 通过给定一个X方向上的数目指定一个translation。只向x轴进行移动元素,同样其基点是元素中心点,也可以根据transform-origin改变基点位置。如:transform:translateX(100px): 3、translateY(<translation-value>) :通过给定Y方向的数目指定一个translation。只向Y轴进行移动,基点在元素心点,可以通过transform-origin改变基点位置。如:transform:translateY(20px): 三、缩放scale 缩放scale和移动translate是极其相似,他也具有三种情况:scale(x,y)使元素水平方向和垂直方向同时缩放(也就是X轴和Y轴同时缩放);scaleX(x)元素仅水平方向缩放(X轴缩放);scaleY(y)元素仅垂直方向缩放(Y轴缩放),但它们具有相同的缩放中心点和基数,其中心点就是元素的中心位置,缩放基数为1,如果其值大于1元素就放大,反之其值小于1,元素缩小。下面我们具体来看看这三种情况具体使用方法: 1、scale(<number>[, <number>]):提供执行[sx,sy]缩放矢量的两个参数指定一个2D scale(2D缩放)。如果第二个参数未提供,则取与第一个参数一样的值。scale(X,Y)是用于对元素进行缩放,可以通过transform-origin对元素的基点进行设置,同样基点在元素中心位置;基中X表示水平方向缩放的倍数,Y表示垂直方向的缩放倍数,而Y是一个可选参数,如果没有设置Y值,则表示X,Y两个方向的缩放倍数是一样的。并以X为准。如:transform:scale(2,1.5): 2、scaleX(<number>) : 使用 [sx,1] 缩放矢量执行缩放操作,sx为所需参数。scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1),其基点一样是在元素的中心位置,我们同样是通过transform-origin来改变元素的基点。如:transform:scaleX(2): 3、scaleY(<number>) : 使用 [i,sy] 缩放矢量执行缩放操作,sy为所需参数。scaleY表示元素只在Y轴(垂直方向)缩放元素,其基点同样是在元素中心位置,可以通过transform-origin来改变元素的基点。如transform:scaleY(2): 四、扭曲skew 扭曲skew和translate、scale一样同样具有三种情况:skew(x,y)使元素在水平和垂直方向同时扭曲(X轴和Y轴同时按一定的角度值进行扭曲变形);skewX(x)仅使元素在水平方向扭曲变形(X轴扭曲变形);skewY(y)仅使元素在垂直方向扭曲变形(Y轴扭曲变形),具体使用如下: 1、skew(<angle> [, <angle>]) :X轴Y轴上的skew transformation(斜切变换)。第一个参数对应X轴,第二个参数对应Y轴。如果第二个参数未提供,则值为0,也就是Y轴方向上无斜切。skew是用来对元素进行扭曲变行,第一个参数是水平方向扭曲角度,第二个参数是垂直方向扭曲角度。,其中第二个参数是可选参数,如果没有设置第二个参数,那么X轴和Y轴以同样的角度进行变形。同样是以元素中心为基点,我们也可以通过transform-origin来改变元素的基点位置。如:transform:skew(30deg,10deg):

C# 自定义控件固定大小

今天做自定义,需要固定控件大小,一共找到了三种方法: 设置最大与最小值相等在resize事件中指定大小通过自定义设计器来禁止修改大小

Matlab Figure 调整大小、字号、线宽

绘图窗口菜单File | Export Setup里很方便的改变这些属性 特别是Expand axes to fit figure,会更好减少空白边。 设置好可以保存模板,下次调用。 也可以将这个功能写到m文件中,自动执行吧 用matlab画了一张图,投稿时要缩小,缩小后字体就会过小或者发虚。 解决办法 % figure resize set(gcf,'Position',[100 100 260 220]); set(gca,'Position',[.13 .17 .80 .74]); %调整 XLABLE和YLABLE不会被切掉 figure_FontSize=8; set(get(gca,'XLabel'),'FontSize',figure_FontSize,'Vertical','top'); set(get(gca,'YLabel'),'FontSize',figure_FontSize,'Vertical','middle'); set(findobj('FontSize',10),'FontSize',figure_FontSize); set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2); 解释: set(gcf,'Position',[100 100 260 220]); 这句是设置绘图的大小,不需要到word里再调整大小。我给的参数,图的大小是7cm set(gca,'Position',[.13 .17 .80 .74]); 这句是设置xy轴在图片中占的比例,可能需要自己微调。 figure_FontSize=8; set(get(gca,'XLabel'),'FontSize',figure_FontSize,'Vertical','top'); set(get(gca,'YLabel'),'FontSize',figure_FontSize,'Vertical','middle'); set(findobj('FontSize',10),'FontSize',figure_FontSize); 这4句是将字体大小改为8号字,在小图里很清晰 set(findobj(get(gca,'Children'),'LineWidth',0.5),'LineWidth',2); 这句是将线宽改为2

HTML5 实现小车动画效果(Canvas/CSS3/JQuery)

HTML5正在变得越来越流行。在这个移动设备日益增长的时代,对来自Adobe的Flash插件的改造需求也正在快速增长。因为就在最近,Adobe宣布Flash将不再支持移动设备。这意味着,Adobe自身也认为对移动设备来讲HTML5是一项重要的技术。而桌面系统的改变也是迟早的事。 HTML的一大劣势就是对于多媒体技术支持的缺乏。在HTML中,你无法直接显示一个视频或在屏幕上绘画。在HTML5中,随着<video>与<canvas>元素的引进。这些元素给予开发者直接使用“纯粹的”HTML来实现多媒体技术的可能性——仅需要写一些Javascript代码来配合HTML。在多媒体技术中,有一个基本的技术应该被支持——动画。在HTML5中,有不少方式能够实现该功能。 在这篇文章中,我仅将最新的<canvas>元素与即将到来的CSS3动画技术进行比较。其他的可能性包括DOM元素或SVG元素的创建和动画。这些可能性将不在本文中进行讨论。从开始就应该注意到canvas技术在当前发布的大部分主流浏览器都给予了支持,而CSS3动画仅在最新的FireFox与Chrome浏览器中才有实现的可能,下一个版本的IE也将提供对CSS3动画的支持。(所以本文中所有演示代码的效果,在Win 7系统下当前最新版的Chrome浏览器中都可实现,但在其他操作系统与其他浏览器中,并不一定能看到所有演示代码的效果)。 这里我选择了一个比较简单的动画: PS:由于显卡、录制的帧间隔,以及可能你电脑处理器的原因,播放过程可能有些不太流畅或者失真! 分三种方式实现: (1) canvas元素结合JS (2) 纯粹的CSS3动画(暂不被所有主流浏览器支持,比如IE) (3) CSS3结合Jquery实现 知道如何使用CSS3动画比知道如何使用<canvas>元素更重要:因为浏览器能够优化那些元素的性能(通常是他们的样式,比如CSS),而我们使用canvas自定义画出来的效果却不能被优化。原因又在于,浏览器使用的硬件主要取决于显卡的能力。目前,浏览器没有给予我们直接访问显卡的权力,比如,每一个绘画操作都不得不在浏览器中先调用某些函数。 让我们从Canvas开始 HTML代码: <html> <head> <meta charset="UTF-8" /> <title>Animation in HTML5 using the canvas element</title> </head> <body οnlοad="init();"> <canvas id="canvas" width="1000" height="600">Your browser does not support the <code><canvas></code>-element.Please think about updating your brower!</canvas> <div id="controls"> <button type="button" οnclick="speed(-0.1);">Slower</button> <button type="button" οnclick="play(this);">Play</button> <button type="button" οnclick="speed(+0.1)">Faster</button> </div> </body> </html> JS代码: 定义一些变量: var dx=5, //当前速率 rate=1, //当前播放速度 ani, //当前动画循环 c, //画图(Canvas Context) w, //汽车[隐藏的](Canvas Context) grassHeight=130, //背景高度 carAlpha=0, //轮胎的旋转角度 carX=-400, //x轴方向上汽车的位置(将被改变) carY=300, //y轴方向上汽车的位置(将保持为常量) carWidth=400, //汽车的宽度 carHeight=130, //汽车的高度 tiresDelta=15, //从一个轮胎到最接近的汽车底盘的距离 axisDelta=20, //汽车底部底盘的轴与轮胎的距离 radius=60; //轮胎的半径 为了实例化汽车canvas(初始时被隐藏),我们使用下面的自执行的匿名函数

获得文件头编辑框中多行文本

//获得文件头编辑框中多行文本 //文本行数 int nLineCount; //当前行 int nLine; //当前行的字符串长度 int nLength; //保存字符串 char szBuf[MAX_PATH];; nLineCount = -1; nLine = -1; nLength = -1; nLineCount = ((CEdit*)GetDlgItem(IDC_HEADER_EDIT))->GetLineCount(); for (nLine = 0; nLine <nLineCount; nLine++) { nLength = ((CEdit*)GetDlgItem(IDC_HEADER_EDIT)) ->LineLength(((CEdit*)GetDlgItem(IDC_HEADER_EDIT))->LineIndex(nLine)); ((CEdit*)GetDlgItem(IDC_HEADER_EDIT))->GetLine(nLine,szBuf,MAX_PATH); szBuf[nLength]='\0'; MessageBox(szBuf); } Edit编辑框需要设置一下属性: Multiline 多行 TURE Want Return 回车 TURE Vertical Scroll 竖起滚动条 TRUE

Mysql jar包bug: Unknown type '14 in column 5 of 10 in binary-encoded

2012-01-05 11:34:17,638 ERROR [SummaryDaoImpl.java] -com.kargo.points.exception.KargoPointsException: ingetSummarysByTransactionDate error clause by :Unknown type '14 in column 5 of10 in binary-encoded result set. 以上错误是由于Mysql-connector.jar本身有bug, http://bugs.mysql.com/bug.php?id=14609 解决方法:将原来的mysql-connector-java-5.0.4-bin.jar替换成mysql-connector-java-3.0.14-production-bin.jar

SQL 中的LTRIM()和RTTIM()的用法

LTRIM删除起始空格后返回字符表达式。 语法 LTRIM ( character_expression ) 参数 character_expression 是字符或二进制数据表达式。character_expression 可以是常量、变量或列。character_expression 必须是可以隐性转换为 varchar 的数据类型。否则,使用 CAST 显式转换 character_expression。 返回类型 varchar 注释 兼容级别可能影响返回值。有关兼容级别的更多信息,请参见 sp_dbcmptlevel。 示例 下例使用 LTRIM 字符删除字符变量中的起始空格。 DECLARE @string_to_trim varchar(60)SET @string_to_trim = '' Five spaces are at the beginning of this string.''SELECT ''Here is the string without the leading spaces: '' + LTRIM(@string_to_trim)GO 下面是结果集: ------------------------------------------------------------------------Here is the string without the leading spaces: Five spaces are at the beginning of this string. (1 row(s) affected)

Lotusscript代理调用正则表达式过滤掉<html>代码,获取notesRichTextItem内容信息的方法...

前段时间用lotus写了个内容发布系统,使用notesRichTextItem保存内容。首页有个栏目块需要抽取文章的摘要信息(也就前多少个字符),手动输入的内容没问题,可以正常抽取;可是用户有时候在文档的前面插了个图片,或是从Word、网页上复制下来的信息贴进去保存之后,notesRichTextItem里面的内容就会带有<html>代码格式,抽取数据时数据、格式的问题就来了,晕啊。 在网上找到一个解决办法,就是在Lotusscript代理中调用正则将得到的内容先替换,然后再截取内容片断。 具体代码如下(用于window平台): Class RegExp ' RegExp -- use VBScript RegExp object to provide regular expressions ' 2004-06-03 David Phillips, rfdinc.com First version. Public matches As Variant Public oRegExp As Variant ' VBScript RegExp properties Public Pattern As String Public IgnoreCase As Boolean ' default = False Public Global As Boolean ' default = False Sub new () Set oRegExp = CreateObject ("VBScript.RegExp") End Sub Public Function Match (source As String, pattern As String) As Boolean ' RegEx.

memcpy()详解

相关函数: bcopy(), memccpy(), memmove(), strcpy(), strncpy() 表头文件: #include <string.h> 定义函数: void *memcpy(void *dest, const void *src, size_t n) 函数说明: memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'\0'而结束 返回值: 返回指向dest的指针 附加说明: 指针src和dest所指的内存区域不可重叠 ------------------------------------------------------- #include <string.h> #include <stdio.h> int main() { char a[30] = "string (a)"; char b[30] = "hi\0zengxiaolong"; int i; strcpy(a, b); //a[30] = "hi\0ing (a)" printf("strcpy():"); for(i = 0; i < 30; i++) printf("%c", a[i]); //hi ing (a) memcpy(a, b, 30); //a[30] = "hi\0zengxiaolong" printf("\nmemcpy():"); for(i = 0; i < 30; i++) printf("

Spark快速入门指南

- Spark是什么? Spark is a MapReduce-like cluster computing framework designed to support low-latency iterative jobs and interactive use from an interpreter. It is written in Scala, a high-level language for the JVM, and exposes a clean language-integrated syntax that makes it easy to write parallel jobs. Spark runs on top of the Mesos cluster manager. - Spark下载地址? git clone git://github.com/mesos/spark.git - Spark编译与运行? 1)scala 2.9 +(将bin添加到PATH中或者设定了SCALA_HOME环境变量) 2) spark支持local模式和cluster模式, local不需要安装mesos 3) 如果需要将spark运行在cluster上,需要安装mesos 4)使用spark自带的sbt编译/打包: sbt/sbt compile, sbt/sbt assembly 5)使用spark自带的run脚本运行spark程序 - 验证spark环境是否OK?

关于对话框DoModal()函数调用失败的原因分析

对话框DoModal()函数调用失败一般而言有两种表现形式:一是对话框弹不出来,但是没有错误提示;二是对话框弹不出来,同时伴随内存访问错误的提示框出现。 第一种表现主要是因为没有对资源句柄进行切换造成的,以在DLL中弹出对话框中最为常见。解决办法是:如果是MFC规则DLL,可以使用所有导出函数的开始处添加 AFX_MANAGE_STATE宏,具体代码为:AFX_MANAGE_STATE(AfxGetStaticModuleState( )),如果是MFC扩展DLL,具体做法是: 1. 在DLL中定义两个全局变量, HINSTANCE hResOld; // 旧的资源句柄 HINSTANCE hDll; // DLL资源句柄 2. 在DllMain函数里初始化hDll hDll = hInstance; 3. 在调用对话框DoModal()函数之前进行资源句柄切换 HINSTANCE hResOld = AfxGetResourceHandle(); AfxSetResourceHandle(hDll); …… CYourDlg dlg; dlg.DoModal(); …… AfxSetResourceHandle(hResOld); 若是第二种表现,即对话框弹不出来,同时伴随内存访问错误的提示框出现,那么问题很可能出现在初始化对话框界面的代码方面,具体是在OnInitDialog函数,即使它是在DLL中弹出对话框。事实上在在DLL中弹出对话框如果不进行资源句柄切换,顶多是弹不出对话框,并不会出现内存访问方面的错误。在解决这方面的错误,一个误区是单步进入DoModal()函数调试,直至定位DoModal函数内部哪一句出错。后来我发现这纯粹是浪费时间,就算定位了在DoModal函数内部哪一句出错,你依然不知道为什么会出错。实际上调用DoModal()函数,激发的却是OnInitDialog函数。因此你只需确定OnInitDialog函数哪一句出错了(这里的OnInitDialog函数是指派生对话框类的OnInitDialog函数)。

SQL语句实现定制化查询

最近在看一本讲技术的书,讲到sql时,有一个比较有趣的例子,在数据库中的material表存储格式如下,mclass是材料类型,mdosage是材料用量 Id mclass mdosage 1 A 66 2 B 56 3 C 46 4 D 36 5 E 26 现在想查询出如下形式的结果 Id A B C D E 1 66 2 56 3 46 4 36 5 26 在sqlserver中可以利用case语句来实现上述的效果,代码如下 select id, case mclass when 'A' then cast(mdosage as varchar) else ' ' end as 'A', case mclass when 'B' then cast(mdosage as varchar) else ' ' end as 'B ', case mclass when 'C' then cast(mdosage as varchar) else ' ' end as 'C ',

GBK编码表

GBK编码表 全国信息技术标准化技术委员会 汉字内码扩展规范(GBK) Chinese Internal Code Specification 来源:http://blog.sina.com.cn/s/blog_677f52210100o0oq.html GBK编码表 基本简介 GB码,全称是GB2312-80《信息交换用汉字编码字符集基本集》,1980年发布,是中文信息处理的国家标准,在大陆及海外使用简体中文的地区(如新加坡等)是强制使用的唯一中文编码。P-Windows3.2和苹果OS就是以GB2312为基本汉字编码,Windows95/98则以GBK为基本汉字编码、但兼容支持GB2312。GB码共收录6763个简体汉字、682个符号,其中汉字部分:一级字3755,以拼音排序,二级字3008,以偏旁排序。该标准的制定和应用为规范、推动中文信息化进程起了很大作用。 GBK编码是中国大陆制订的、等同于UCS的新的中文编码扩展国家标准。GBK工作小组于1995年10月,同年12月完成GBK规范。该编码标准兼容GB2312,共收录汉字21003个、符号883个,并提供1894个造字码位,简、繁体字融于一库。 读者指正 这个编码表,不是GBK编码表,而是GB2312编码表……而且还不包含符号部分,只能称作“GB2312汉字编码表”…… 就现在来看GB2312-80不是大陆强制使用的唯一标准(这句话在十年前是对的)……当前国家强制使用的编码是GB18030-2000(2001年的1月正式强制执行)……GB18030俗称GBK 2.0,有两个版本GB18030-2000和GB18030-2005,GB18030-2005不强制…… ●GB2312与GBK的区别 ・GB2312 :前面的一个字节(高字节)从0xA1用到 0xF7,后面一个字节(低字节)从0xA1到0xFE,这样就可以组合出大约7000多个简体汉字了 ・GBK: 不再要求低字节一定是127号之后的内码,只要第一个字节是大于127就固定表示这是一个汉字的开始, GBK 包括了 GB2312 的所有内容,同时又增加了近20000个新的汉字(包括繁体字)和符号。 --- https://blog.csdn.net/sxzlc/article/details/106203495 --- https://blog.csdn.net/sxzlc/article/details/106084402 天 低字节是EC CC EC --- 这个是GB2312编码表,可以看到,低字节都是从A1开始的。 B0 0 1 2 3 4 5 6 7 8 9 A B C D E F A 啊 阿 埃 挨 哎 唉 哀 皑 癌 蔼 矮 艾 碍 爱 隘

Eclipse 自动补全快捷键失效使用Eclipse

使用Eclipse,输入sysout,使用快捷键Alt+/进行代码自动补齐突然没有反应,修复方法如下。 1.选择Eclipse菜单栏中的Window->preferences; 2.选择General->keys; 3.在右侧中间的窗体中点击word completion后再点击remove binding,在下方的binding中随便(例如"Alt+.")输入一个快捷键; 4.然后选择Content Assist点击Remove binding,在binding中输入Alt+/; 5.点击Ok就可以了。

Visio中如何画聚合关系

1. 先拖一条复合组件进来。 2. 双击复合组件。 3. 点击关联端下面的属性按钮 4. 在聚合里选择“共享” 聚合关系就出来了~

[Android实例] 48个android程序源码贡献!!!值得收藏!!!

Android PDF 阅读器 http://sourceforge.net/projects/andpdf/files/ 个人记账工具 OnMyMeans http://sourceforge.net/projects/onmymeans/develop Android电池监控 Android Battery Dog http://sourceforge.net/projects/andbatdog/ RSS阅读软件 Android RSS http://code.google.com/p/android-rss/ Android的PDF阅读器 DroidReader http://code.google.com/p/droidreader/ Android Scripting Environment http://code.google.com/p/android-scripting/ Android小游戏 Android Shapes http://sourceforge.net/projects/shapes/ Android JSON RPC http://code.google.com/p/android-json-rpc/ Android VNC http://code.google.com/p/android-vnc/ 魅族M8的Android移植 M8 Android http://code.google.com/p/m8-android-kernel/ Android 游戏 Amazed http://code.google.com/p/apps-for-android/ Android的社交网络 HelloWorld goes mobile http://sourceforge.net/projects/helloworldgm/ 手机聊天程序 Android jChat http://code.google.com/p/jchat4android/ Android的GPS轨迹记录 MyTracks http://code.google.com/p/mytracks/ Android国际象棋游戏 Honzovy achy http://sourceforge.net/projects/honzovysachy/ Android旅行记录软件 AndTripLog http://sourceforge.net/projects/andtriplog/ 音乐播放器 Ambient http://sourceforge.net/projects/ambientmp/ Android的邮件客户端 K9mail http://code.google.com/p/k9mail/ 多平台应用开发库 QuickConnect http://sourceforge.

CFile写入中文,正常显示并换行

CFile 正常写入中文 CFile myFile; BOOL isopen=myFile.Open(filename, CFile::modeReadWrite|CFile::modeCreate | CFile::typeBinary|CFile::shareDenyNone); if(!isopen) AfxMessageBox("不能打开文件!"); CFile myFile(); CString EditContent; m_EditText->GetWindowText(EditContent); LPCTSTR str = EditContent.GetBuffer( EditContent.GetLength()); myFile.Write(str,EditContent.GetLength()*sizeof(CHAR)); myFile.Close(); 例子: //Exception Handling //打开文件是一件可能产生许多exception的动作 #include <afx.h> #include <iostream.h> int main(){ CString str1="中国人\r\n"; LPCTSTR s1=str1.GetBuffer(str1.GetLength()); CString str2="你好吗\r\n"; LPCTSTR s2=str2.GetBuffer(str2.GetLength()); CString str3="自强不息方能成事\r\n"; LPCTSTR s3=str3.GetBuffer(str3.GetLength()); TRY { CFile file("hello.txt",CFile::modeCreate|CFile::modeWrite|CFile::typeBinary); file.Write(s1,str1.GetLength()*sizeof(CHAR)); file.Write(s2,str2.GetLength()*sizeof(CHAR)); file.Write(s3,str3.GetLength()*sizeof(CHAR)); file.Close(); } CATCH (CFileException, e) { switch (e->m_cause) { case CFileException::accessDenied: TRACE("File Access Denied\n"); break; case CFileException::badPath: TRACE("

VC Double类型显示两位小数

"%.1f" double数据只显示一位小数 "%.2f" double数据只显示两位小数 Large=((m_a*(2-0.33))/m_z2); Small=((m_a*(2-0.38))/m_z2); if (Large<m_mt || Small>m_mt) { str.Format(_T("输入范围为(%.2f~%.2f),请重新输入!"),Small,Large); MessageBox(str); } //控制小数点后位数 inline double roundingup(double number,double digit) { double k = pow(10.0,digit); double f = number * k; f = f > 0.0 ? floor(f+0.5) : ceil(f-0.5); f /= k; return f; } //测试代码: int main(int argc, char* argv[]) { cout << roundingup(10.123,2.0) << endl;; return 0; } 需要包含#include <cmath>头文件 编译环境 VS2010

批处理文件&多文件改名

::不懂 查 eho /? -> 为解答 ::行注释 还有可能会被当成命令 进行检查的,大家注意第12行 :: for之中不要写注释,不然运行的时候会出错 @echo off ::ver beat1.0[20111120] setlocal enabledelayedexpansion ::->变量延迟 mode con lines=26 ::->设置窗口大小 color 1f for /f "delims=" %%i in ("%0") do ( set cdname=%%~dpi ) ::delims是关键字,拆分用怎么用?这里的dpi是什么意思?? -> % ~dpI (这里要加空格不然注释被当成命令了) ->仅将%I扩充到一个驱动器号和路径 这句注释不能写 :star cls title 批量文件改名 ::作用是什么 汇编中的标题作用?->显示到标题框的地方 echo. :: 这里的 echo. 又是什么意思?是打一空行?对相当于 回车 。在批处理命令中有,使原本在屏幕下方显示的提示画面,出现在屏幕上方。??? echo ============================================================== echo. echo 批量文件改名 测试版 echo. echo 欢迎使用,请选择选项(1,2,3,4,5,6,7,8) echo. echo 1.简单改名 echo 2.剔除字符 echo 3.

动态创建CEdit类对象

//this 为parent窗口的指针 //pEdt为类的成员变量,类型为CEdit*,在构造函数中初始化为NULL // m_EdtCreated为类的成员变量,类型为BOLL,在构造函数中初始化为FALSE if (!m_EdtCreated){ //为第三个编辑区添加编辑控件 pEdt=new CEdit; pEdt->Create(ES_MULTILINE|WS_CHILD|WS_VISIBLE|WS_TABSTOP|WS_BORDER,CRect(0,301,250,800),this,1); m_EdtCreated=TRUE; }

viewdidload viewload init 等简单解释

当一个view载入时 往往会调用这些函数 init:方法 在init方法中实例化必要的对象(遵从LazyLoad思想) init方法中初始化ViewController本身 loadView:方法 loadView 此方法在控制器的view为nil的时候被调用 没有通过调用xib的时候,一般适合手动实现代码 viewDidLoad:方法 viewDidLoad 不论是从xib中加载视图,还是从loadview生成视图,都会被调用。 现在3.0以后大家一般习惯在viewdidload里面初始化界面 详解: 如果是在代码中创建的视图加载器,他将会在loadView方法后被调用; 如果是从nib视图页面输出,他将会在视图设置好后后被调用。 viewDidUnload:方法 当系统内存吃紧的时候会调用该方法(注:viewController没有被dealloc) 内存吃紧时,在iPhone OS 3.0之前didReceiveMemoryWarning是释放无用内存的唯一方式,但是OS 3.0及以后viewDidUnload方法是更好的方式 在该方法中将所有IBOutlet(无论是property还是实例变量)置为nil(系统release view时已经将其release掉了) 一般认为viewDidUnload是viewDidLoad的镜像,因为当view被重新请求时,viewDidLoad还会重新被执行 dealloc:方法 viewDidUnload和dealloc方法没有关联,dealloc还是继续做它该做的事情(不用多说) viewWillAppear: 方法 Called when the view is about to made visible. Default does nothing 视图即将可见时调用。默认情况下不执行任何操作 viewDidAppear: Called when the view has been fully transitioned onto the screen. Default does nothing 视图已完全过渡到屏幕上时调用 viewWillDisappear: Called when the view is dismissed, covered or otherwise hidden. Default does nothing

CString,int,string,char*之间的转换

vs2010 中 MFC::CString 如何和int相互转化 CString ---->int CString str = _T("123"); int i = _ttoi(str); int ---->CString =============== int i = 123; CString str ; str.Format(_T("%d"), i); CString 转换成 int float --VS2010,UNICODE下 float percentageFill,percentageFill_1,percentageFill_2; int a1,a2,a3,a4; a1 = (float)_ttoi(strVarTest); a2 = (float)_ttoi(strVarST); a3 = (float)_ttoi(strVarSP); a4 = (float)_ttoi(strVarST); 用atoi,可以通过,但是strA = L"100",atoi(strA);的转换结果是1,显示错误。所以用上面的方法。 VC6.0中转换,不能保证vs2010中同样凑效。 1 CString,int,string,char*之间的转换 string 转 CString CString.format("%s", string.c_str()); char 转 CString CString.format("%s", char*); char 转 string string s(char *);

设计模式之——生产者模式(Builder)和原型模式(Prototype)

在创建型模式里面还有两个就是builder 和 prototype 1 生成器模式 生成者模式和工厂模式有点像,都是封装了创建对象的过程,创建出对象,但builder模式强调一步步创建,不同的输入参数,同样的创建过程而创建出不同的对象,在builder里面,对象一般是比较复杂并由很多对象组成的,每一步创建出其中的一部分;另外创建者模式不像工厂模式一样直接返回对象,而是提供一个接口来得到对象。其类关系图如下 其中Director提供一个调用Builder里面各个BuildX的函数,创建出Product对象,但并不直接返回,而是调用Builder类里面的GetProduct函数返回对象。另外,Director虽然调用BuildeX的顺序一样,但是具体的ConcreteBuilder不一样,创建出来的对象是不一样的。 2 原型模式(prototype) 原型模式其实很简单,那就是提供接口,克隆一个和自己一样的对象。其类关系图如下 其实在C++里面,这个功能可以通过拷贝构造函数或重载赋值运算符来实现

软件开发过程包括哪几个阶段?

Boehm:运用现代科学技术知识来设计并构造计算机程序及为开发、运行和维护这些程序所必需的相关文件资料。 IEEE:软件工程是开发、运行、维护和修复软件的系统方法。 Fritz Bauer:建立并使用完善的工程化原则,以较经济的手段获得能在实际机器上有效运行的可靠软件的一系列方法。 软件工程学的内容 软件工程学的主要内容是软件开发技术和软件工程管理. 软件开发技术包含软件工程方法学、软件工具和软件开发环境;软件工程管理学包含软件工程经济学和软件管理学。 软件工程基本原理 著名软件工程专家B.Boehm综合有关专家和学者的意见并总结了多年来开发软件的经验,于1983年在一篇论文中提出了软件工程的七条基本原理。 (1)用分阶段的生存周期计划进行严格的管理。 (2)坚持进行阶段评审。 (3)实行严格的产品控制。 (4)采用现代程序设计技术。 (5)软件工程结果应能清楚地审查。 (6)开发小组的人员应该少而精。 (7)承认不断改进软件工程实践的必要性。 B.Boehm指出,遵循前六条基本原理,能够实现软件的工程化生产;按照第七条原理,不仅要积极主动地采纳新的软件技术,而且要注意不断总结经验。 软件工程(SoftWare Engineering)的框架可概括为:目标、过程和原则。 (1)软件工程目标:生产具有正确性、可用性以及开销合宜的产品。正确性指软件产品达到预期功能的程度。可用性指软件基本结构、实现及文档为用户可用的程度。开销合宜是指软件开发、运行的整个开销满足用户要求的程度。这些目标的实现不论在理论上还是在实践中均存在很多待解决的问题,它们形成了对过程、过程模型及工程方法选取的约束。 (2)软件工程过程:生产一个最终能满足需求且达到工程目标的软件产品所需要的步骤。软件工程过程主要包括开发过程、运作过程、维护过程。它们覆盖了需求、设计、实现、确认以及维护等活动。需求活动包括问题分析和需求分析。问题分析获取需求定义,又称软件需求规约。需求分析生成功能规约。设计活动一般包括概要设计和详细设计。概要设计建立整个软件系统结构,包括子系统、模块以及相关层次的说明、每一模块的接口定义。详细设计产生程序员可用的模块说明,包括每一模块中数据结构说明及加工描述。实现活动把设计结果转换为可执行的程序代码。确认活动贯穿于整个开发过程,实现完成后的确认,保证最终产品满足用户的要求。维护活动包括使用过程中的扩充、修改与完善。伴随以上过程,还有管理过程、支持过程、培训过程等。 (3)软件工程的原则是指围绕工程设计、工程支持以及工程管理在软件开发过程中必须遵循的原则。 软件工程必须遵循什么原则 围绕工程设计、工程支持以及工程管理已提出了以下四条基本原则: (1)选取适宜的开发模型 该原则与系统设计有关。在系统设计中,软件需求、硬件需求以及其它因素间是相互制约和影响的,经常需要权衡。因此,必需认识需求定义的易变性,采用适当的开发模型,保证软件产品满足用户的要求。 (2)采用合适的设计方法 在软件设计中,通常需要考虑软件的模块化、抽象与信息隐蔽、局部化、一致性以及适应性等特征。合适的设计方法有助于这些特征的实现,以达到软件工程的目标。 (3)提供高质量的工程支撑 工欲善其事,必先利其器。在软件工程中,软件工具与环境对软件过程的支持颇为重要。软件工程项目的质量与开销直接取决于对软件工程所提供的支撑质量和效用。 (4)重视软件工程的管理 软件工程的管理直接影响可用资源的有效利用,生产满足目标的软件产品以及提高软件组织的生产能力等问题。因此,仅当软件过程予以有效管理时,才能实现有效的软件工程。 软件工程是指导计算机软件开发和维护的工程学科。 采用工程的概念、原理、 技术和方法来开发与维护软件,把经过时间考验而证明正确的管理技术和当前能够 得到的最好的技术方法结合起来,这就是软件工程。 软件工程强调使用生存周期方法学和各种结构分析及结构设计技术。它们是在七十年代为了对付应用软件日益增长的复杂程度、漫长的开发周期以及用户对软件产品经常不满意的状况而发展起来的。人类解决复杂问题时普遍采用的一个策略就是“各个击破”,也就是对问题进行分解然后再分别解决各个子问题的策略。软件工程采用的生存周期方法学就是从时间角度对软件开发和维护的复杂问题进行分解,把软件生存的漫长周期依次划分为若干个阶段,每个阶段有相对独立的任务,然后逐步完成每个阶段的任务。采用软件工程方法论开发软件的时候,从对任务的抽象逻辑分析开始,一个阶段一个阶段地进行开发。前一个阶段任务的完成是开始进行后一个阶段工作的前提和基础,而后一阶段任务的完成通常是使前一阶段提出的解法更进一步具体化,加进了更多的物理细节。每一个阶段的开始和结束都有严格标准,对于任何两个相邻的阶段而言,前一阶段的结束标准就是后一阶段的开始标准。在每一个阶段结束之前都必须进行正式严格的技术审查和管理复审,从技术和管理两方面对这个阶段的开发成果进行检查,通过之后这个阶段才算结束;如果检查通不过,则必须进行必要的返工,并且返工后还要再经过审查。审查的一条主要标准就是每个阶段都应该交出“最新式的”(即和所开发的软件完全一致的)高质量的文档资料,从而保证在软件开发工程结束时有一个完整准确的软件配置交付使用。文档是通信的工具,它们清楚准确地说明了到这个时候为止,关于该项工程已经知道了什么,同时确立了下一步工作的基础。此外,文档也起备忘录的作用,如果文档不完整,那么一定是某些工作忘记做了,在进入生存周期的下一阶段之前,必须补足这些遗漏的细节。在完成生存周期每个阶段的任务时,应该采用适合该阶段任务特点的系统化的技术方法——结构分析或结构设计技术。 把软件生存周期划分成若干个阶段,每个阶段的任务相对独立,而且比较简单,便于不同人员分工协作,从而降低了整个软件开发工程的困难程度;在软件生存周期的每个阶段都采用科学的管理技术和良好的技术方法,而且在每个阶段结束之前都从技术和管理两个角度进行严格的审查,合格之后才开始下一阶段的工作,这就使软件开发工程的全过程以一种有条不紊的方式进行,保证了软件的质量,特别是提高了软件的可维护性。总之,采用软件工程方法论可以大大提高软件开发的成功率,软件开发的生产率也能明显提高。 目前划分软件生存周期阶段的方法有许多种,软件规模、种类、开发方式、开发环境以及开发时使用的方法论都影响软件生存周期阶段的划分。在划分软件生存周期的阶段时应该遵循的一条基本原则就是使各阶段的任务彼此间尽可能相对独立,同一阶段各项任务的性质尽可能相同,从而降低每个阶段任务的复杂程度,简化不同阶段之间的联系,有利于软件开发工程的组织管理。一般说来,软件生存周期由软件定义、软件开发和软件维护三个时期组成,每个时期又进一步划分成若干个阶段。下面的论述主要针对应用软件,对系统软件也基本适用。 软件定义时期的任务是确定软件开发工程必须完成的总目标;确定工程的可行性,导出实现工程目标应该采用的策略及系统必须完成的功能;估计完成该项工程需要的资源和成本,并且制定工程进度表。这个时期的工作通常又称为系统分析,由系统分析员负责完成。软件定义时期通常进一步划分成三个阶段,即问题定义、可行性研究和需求分析。 开发时期具体设计和实现在前一个时期定义的软件,它通常由下述四个阶段组成:总体设计,详细设计,编码和单元测试,综合测试。 维护时期的主要任务是使软件持久地满足用户的需要。具体地说,当软件在使用过程中发现错误时应该加以改正;当环境改变时应该修改软件以适应新的环境;当用户有新要求时应该及时改进软件满足用户的新需要。通常对维护时期不再进一步划分阶段,但是每一次维护活动本质上都是一次压缩和简化了的定义和开发过程。 下面扼要介绍软件生存周期每个阶段的基本任务和结束标准。 1问题定义 问题定义阶段必须回答的关键问题:“要解决的问题是什么?”如果不知道问题是什么就试图解决这个问题,显然是盲目的,只会白白浪费时间和金钱,最终得出的结果很可能是毫无意义的。尽管确切地定义问题的必要性是十分明显的,但是在实践中它却可能是最容易被忽视的一个步骤。 通过问题定义阶段的工作,系统分析员应该提出关于问题性质、工程目标和规模的书面报告。通过对系统的实际用户和使用部门负责人的访问调查,分析员扼要地写出他对问题的理解,并在用户和使用部门负责人的会议上认真讨论这份书面报告,澄清含糊不精的地方,改正理解不正确的地方,最后得出一份双方都满意的文档。 问题定义阶段是软件生存周期中最简短的阶段,一般只需要一天甚至更少的时间。 2可行性研究 这个阶段要回答的关键问题:“对于上一个阶段所确定的问题有行得通的解决办法吗?”为了回答这个问题,系统分析员需要进行一次大大压缩和简化了的系统分析和设计的过程,也就是在较抽象的高层次上进行的分析和设计的过程。 可行性研究应该比较简短,这个阶段的任务不是具体解决问题,而是研究问题的范围,探索这个问题是否值得去解,是否有可行的解决办法。 在问题定义阶段提出的对工程目标和规模的报告通常比较含糊。可行性研究阶段应该导出系统的高层逻辑模型(通常用数据流图表示),并且在此基础上更准确、更具体地确定工程规模和目标。然后分析员更准确地估计系统的成本和效益,对建议的系统进行仔细的成本/效益分析是这个阶段的主要任务之一。 可行性研究的结果是使用部门负责人做出是否继续进行这项工程的决定的重要依据,一般说来,只有投资可能取得较大效益的那些工程项目才值得继续进行下去。可行性研究以后的那些阶段将需要投入要多的人力物力。及时中止不值得投资的工程项目,可以避免更大的浪费。 3需求分析 这个阶段的任务仍然不是具体地解决问题,而是准确地确定“为了解决这个问题,目标系统必须做什么”,主要是确定目标系统必须具备哪些功能。 用户了解他们所面对的问题,知道必须做什么,但是通常不能完整准确地表达出他们的要求,更不知道怎样利用计算机解决他们的问题;软件开发人员知道怎样使用软件实现人们的要求,但是对特定用户的具体要求并不完全清楚。因此系统分析员在需求分析阶段必须和用户密切配合,充分交流信息,以得出经过用户确认的系统逻辑模型。通常用数据流图、数据字典和简要的算法描述表示系统的逻辑模型。 在需求分析阶段确定的系统逻辑模型是以后设计和实现目标系统的基础,因此必须准确完整地体现用户的要求。系统分析员通常都是计算机软件专家,技术专家一般都喜欢很快着手进行具体设计,然而,一旦分析员开始谈论程序设计的细节,就会脱离用户,使他们不能继续提出他们的要求和建议。较件工程使用的结构分析设计的方法为每个阶段都规定了特定的结束标准,需求分析阶段必须提供完整准确的系统逻辑模型,经过用户确认之后才能进入下一个阶段,这就可以有效地防止和克服急于着手进行具体设计的倾向。 4总体设计 这个阶段必须回答的关键问题是:“概括地说,应该如何解决这个问题?” 首先,应该考虑几种可能的解决方案。列如,目标系统的一些主要功能是用计算机自动完成还是用人工完成;如果使用计算机,那么是使用批处理方式还是人机交互方式;信息存储使用传统的文件系统还是数据库……。通常至少应该考虑下述几类可能的方案: 低成本的解决方案。系统只能完成最必要的工作,不能多做一点额处的工作。 中等成本的解决方案。这样的系统不仅能够很好地完成预定的任务,使用起来很方便,而且可能还具有用户没有具体指定的某些功能和特点。虽然用户没有提出这些具体要求,但是系统分析员根据自己的知识和经验断定,这些附加的能力在实践中将证明是很有价值的。 高成本的“十全十美”的系统。这样的系统具有用户可能希望有的所有功能和特点。 系统分析员应该使用系统流程图或其他工具描述每种可能的系统,估计每种方案的成本和效益,还应该在充分权衡各种方案的利弊的基础上,推荐一个较好的系统 (最佳方案),并且制定实现所推荐的系统的详细计划。如果用户接受分析员推荐的系统,则可以着手完成本阶段的另一项主要工作。 上面的工作确定了解决问题的策略以及目标系统需要哪些程序,但是,怎样设计这些程序呢?结构设计的一条基本原理就是程序应该模块化,也就是一个大程序应该由许多规模适中的模块按合理的层次结构组织而成。总体设计阶段的第二项主要任务就是设计软件的结构,也就是确定程序由哪些模块组成以及模块间的关系。通常用层次图或结构图描绘软件的结构。 5详细设计 总体设计阶段以比较抽象概括的方式提出了解决问题的办法。详细设计阶段的任务就是把解法具体化,也就是回答下面这个关键问题:“应该怎样具体地实现这个系统呢?” 这个阶段的任务还不是编写程序,而是设计出程序的详细规格说明。这种规格说明的作用很类似于其他工程领域中工程师经常使用的工程蓝图,它们应该包含必要的细节,程序员可以根据它们写出实际的程序代码。 通常用HIPO图(层次图加输入/处理/输出图)或PDL语言(过程设计语言)描述详细设计的结果。 6编码和单元测试 这个阶段的关键任务是写出正确的容易理解、容易维护的程序模块。 程序员应该根据目标系统的性质和实际环境,选取一种适当的高级程序设计语言(必要时用汇编语言),把说细设计的结果翻译成用选定的语言书写的程序,并且仔细测试编写出的每一个模块。 7综合测试 这个阶段的关键任务是通过各种类型的测试(及相应的调试)使软件达到预定的要求。 最基本的测试是集成测试和验收测试。所谓集成测试是根据设计的软件结构,把经过单元测试检验的模块按某种选定的策略装配起来,在装配过程中对程序进行必要的测试。所谓验收测试则是按照规格说明书的规定(通常在需求分析阶段确定),由用户(或在用户积极参加下)对目标系统进行验收。 必要时还可以再通过现场测试或平行运行等方法对目标系统进一步测试检验。 为了使用户能够积极参加验收测试,并且在系统投入生产性运行以后能够正确有效地使用这个系统,通常需要以正式的或非正式的方式对用户进行培训。 通过对软件测试结果的分析可以预测软件的可靠性;反之,根据对软件可靠性的要求也可以决定测试和调试过程什么时候可以结束。 应该用正式的文档资料把测试计划、详细测试方案以及实际测试结果保存下来,做为软件配置的一个组成成分。 8软件维护 维护阶段的关键任务是,通过各种必要的维护活动使系统持久地满足用户的需要。 通常有四类维护活动:改正性维护,也就是诊断和改正在使用过程中发现的软件错误;适应性维护,即修改软件以适应环境的变化;完善性维护,即根据用户的要求改进或扩充软件使它更完善;预防性维护,即修改软件为将来的维护活动预先做准备。 虽然没有把维护阶段进一步划分成更小的阶段,但是实际上每一项维护活动都应该经过提出维护要求(或报告问题),分析维护要求,提出维护要求,提出维护方案,审批维护方案,确定维护计划,修改软件设计,修改程序,测试程序,复查验收等一系列步骤,因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。 都应该经过提出维护要求(或报告问题),分析维护要求,提出维护要求,提出维护方案,审批维护方案,确定维护计划,修改软件设计,修改程序,测试程序,复查验收等一系列步骤,因此实质上是经历了一次压缩和简化了的软件定义和开发的全过程。

Java web中,当表单含有文件上传时,提交数据的如何读取

当提交表单里包含文件上传的时候,即Form的enctype属性值为multipart/form-data时,后台是无法像普通表单那样通过request.getParameter来获取用户提交的数据的。 这时候,当然可以通过解析提交到服务器的数据流来得到数据了,但是这样不但麻烦而且容易出错。 最好的方式是使用第三方的jar包获取数据,这方面有很多现成的成熟优秀的jar包。最常用的时以下三个: apache的commons-fileupload : http://commons.apache.org/fileupload/ O'Reilly的cos: http://www.servlets.com/cos/index.html jspsmart的SmartUpload:官方不提供下载了,google搜吧。 其中,据评测效率最高的是COS,最慢的是SmartUpload;最常用的是common-upload;文件太大时SmartUpland会崩溃。 1. common-upload示例代码: view plain copy to clipboard print ? // 判断enctype属性是否为multipart/form-data boolean isMultipart = ServletFileUpload.isMultipartContent(request); // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // 当上传文件太大时,因为虚拟机能使用的内存是有限的,所以此时要通过临时文件来实现上传文件的保存 // 此方法是设置是否使用临时文件的临界值(单位:字节) factory.setSizeThreshold(yourMaxMemorySize); // 与上一个结合使用,设置临时文件的路径(绝对路径) factory.setRepository(yourTempDirectory); // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // 设置上传内容的大小限制(单位:字节) upload.setSizeMax(yourMaxRequestSize); // Parse the request List<?> items = upload.parseRequest(request); Iterator iter = items.

SSH 登录太慢的解决方法

2019独角兽企业重金招聘Python工程师标准>>> SSH 登录太慢可能是 DNS 解析的问题,默认配置下 sshd 初次接受 ssh 客户端连接的时候会自动反向解析客户端 IP 以得到 ssh 客户端的域名或主机名。如果这个时候 DNS 的反向解析不正确,sshd 就会等到 DNS 解析超时后才提供 ssh 连接,这样就造成连接时间过长、ssh 客户端等待的情况,一般为10-30秒左右。有个简单的解决办法就是在 sshd 的配置文件(sshd_config)里取消 sshd 的反向 DNS 解析。 # vi /etc/ssh/sshd_config 找到UseDNS,修改为no UseDNS no 重启SSH服务 # /etc/init.d/sshd restart 转载于:https://my.oschina.net/u/187928/blog/34601

麻省理工学院(MIT)研究生学习指导怎样做研究生

本文的主旨是解释如何做研究。我们提供的这些建议,对于研究本身(阅读、写作和程序设计)、理解研究过程以及开始研究(方法论、选题、选导师和情感因素),都是极具价值的。 1. 简介 这是什么? 并没有什么神丹妙药可以保证在研究中取得成功,本文只是列举了一些可能会对研究有所帮助的非正式意见。 目标读者是谁? 本文主要是为新入学的研究生而写。 如何使用? 要精读完本文,太长了一些,最好是采用浏览的方式。很多人觉得下面的方法很有效:先快速通读一遍,然后选取其中与自己当前研究项目有关的部分仔细研究。 本文被粗略地分为两部分。第一部分涉及研究者所需具备的各种技能:如阅读,写作和程序设计等等。第二部分讨论研究过程本身:即研究究竟是怎么回事,如何做研究,如何选题和选导师,如何考虑研究中的情感因素。很多读者反映,从长远看,第二部分比第一部分更有价值,也更让人感兴趣。 本文的主要内容包括: 一、掌握一些阅读的诀窍。 二、如何成为研究领域的一员:与相关人员保持联系,他们可以使你保持对研究前沿的跟踪,知道应该读什么材料。 三、学习相关领域的知识:对几个领域都有基本的理解,对于一个或者两个领域要精通。 四、如何做研究笔记。 五、如何写期刊论文和毕业论文。如何为草稿写评审意见,如何利用别人的评审意见。如何发表论文。 六、如何做研究报告及演讲。 七、掌握和自己相关领域的程序设计。 八、有关研究生涯最重要的问题,如何选导师。不同的导师具有不同的风格,导师是你必须了解如何利用的资源。 九、关于毕业论文。毕业论文将占据研究生生涯的大部分时间,本部分涉及如何选题,以及如何避免浪费时间。 十、研究方法论。 十一、或许是最重要的一节:涉及研究过程中的情感因素,包括如何面对失败,如何设定目标,如何避免不安全感,保持自信,享受快乐。 一、阅读 很多研究人员花一半的时间阅读文献,可以很快地从别人的工作中学到很多东西。阅读文献,始于今日。一旦你开始写作论文,就没有多少时间了,那时的阅读主要集中于论文主题相关的文献。在研究生的头两年,大部分的时间要用于做课程作业和打基础。此时,阅读课本和出版的期刊文章就可以了。 在自己研究领域打下坚实的基础所需要的阅读量,是令人望而止步的。 一个有用的小技巧是:首先找出那些最本质的论文。此时可以参考一些有用的书目:例如研究生课程表,其他学校(主要是斯坦福大学)研究生录取程序的建议阅读列表,这些可以让你有一些初步的印象。如果你对自己研究的某个子领域感兴趣,向该领域的高年级研究生请教本领域最重要的十篇论文是什么,如果可以,借过来复印。 回顾最近几年的出版物,将那些非常感兴趣的复制下来。这不仅是由于其中很多都是意义重大的论文,对于了解实验室成员的工作进展也是很重要的。每年都应该去所在学校的计算机科学图书馆,翻阅其他院校出版的和自己相关领域技术报告,并选出自己感兴趣的仔细加以阅读。 阅读论文是需要练习的技能。不可能完整地阅读所有的论文。阅读论文可分为三个阶段:第一阶段是:看论文中是否有感兴趣的东西。论文可能含有摘要,其中可能有内容的介绍,但是也有可能没有或者总结得不好,因此需要你跳读,这看一点那看一点,了解作者究竟做了些什么。内容目录(the table of contents)、结论部分(conclusion)和简介(introduction)是三个重点。如果这些方法都不行,就只好顺序快速浏览了。一旦搞清楚了论文的大概和创新点,就可以决定是否需要进行第二阶段了。 在第二阶段,要找出论文真正具有内容的部分。很多15页的论文可以重写为一页左右的篇幅;因此需要你寻找那些真正激动人心的地方,这经常隐藏于某个地方。论文作者从其工作中所发现的感兴趣的地方,未必是你感兴趣的,反之亦然。最后,如果觉得该论文确实有价值,返回去通篇精读。读论文时要牢记一个问题,“我应该如何利用该论文?”“真的像作者宣称的那样么?”“如果..会发生什么?”。理解论文得到了什么结论并不等同于理解了该论文。理解论文,就要了解论文的目的,作者所作的选择(很多都是隐含的),假设和形式化是否可行,论文指出了怎样的方向,论文所涉及领域都有哪些问题,作者的研究中持续出现的难点模式是什么,论文所表达的策略观点是什么,诸如此类。将阅读与程序设计联系在一起是很有帮助的。如果读者对某个领域感兴趣,在阅读了一些论文后,试试实现论文中所描述程序的“玩具”版本。这无疑会加深理解。要知道,其他的机构具有不同的思考问题的方式,值得去阅读,严肃对待,并引用它们的工作,即使你认为自己明晓他们的错误所在。 在第三阶段,经常会有人递给你一本书或者一篇论文并告诉你应该读读,因为其中有闪光的地方或可以应用到你的研究工作中。但等你阅读完了,你发现没什么特别闪光的地方,仅仅是勉强可用而已。于是,困惑就来了,“我哪不对啊?我漏掉什么了吗?”实际上,这是因为你的朋友在阅读书或论文时,在头脑中早已形成的一些想法的催化下,看出了其中对你的研究课题有价值的地方。 二、建立关系 研究生一两年后,对自己准备从事的子领域已经有了一些想法。一般而言,引导所在领域潮流的工作最终会变成正式发表的论文,但至少在领域高手(领先者)完全明白一年之后,也就是说,高手的工作至少领先一年。 高 手是如何发现新思路的?可能是来自某次会议,也可能来自于与别人的交流。下面是从新思路产生到发表的一般流程。Jo Cool有了一个好想法,她将尚不完整的实现与其他一些工作融合在一起,写了一份草稿论文。她想知道这个想法究竟怎么样,因此她将论文的拷贝发送给十位朋友并请他们进行评论。朋友们觉得这个想法很棒,同时也指出了其中的错误之处,然后这些朋友又把论文拷贝给他们各自的一些朋友,如此继续。几个月后,Jo对之进行了大量修订,并送交给AAAI(the Association for the Advancement of Artificial Intelligence)。六个月后,该论文以五页的篇幅正式发表(这是AAAI会议录允许的最大篇幅)。最后Jo开始整理相关的程序,并写了一个更长的论文(基于在AAAI发表论文得到的反馈),然后送交给某某期刊。某某刊要花大约两年的时间,包括对论文进行评审,作者对论文修改所花费的时间,以及相应的出版延迟。因此,理想情况下,Jo的思想最终发表在期刊上需要大约三年时间。所以潮人很少能从本领域出版的期刊文章中学到什么东西,来得太迟了。 你,也可以成为一个高手。下面是建立学术关系网的一些诀窍:有很多讨论某个自己研究的子领域(如机器视觉)的邮件列表,选择自己感兴趣的列表加入。当与很熟悉本领域的人讨论自己的思想时,他们很可能不直接评价你的想法,而是说:“你读过某某吗?”这并不是一个设问,而是建议你去阅读某份文献,它很可能与你的想法有关。如果你还没有读过该文献,从跟你交谈的高手那里得到该文献的详细信息,或者直接从他那里借一份拷贝下来。当你读到某份让你感到很兴奋的论文,复印五份送交给对之感兴趣的其他五个人,他们可能会反馈回来很好的建议。 有的实验室每星期或每两星期聚会一次,对大家阅读完的论文进行讨论。有些人并不介意别人去翻看他们的书桌,也就是说,去翻阅他们堆在书桌上的不久要阅读或者经常翻阅的论文。你可以去翻翻看,有没有自己感兴趣的。当然了,首先要得到主人的许可,要知道有些人确实反感别人翻自己的东西。去试试那些平易近人的人。同样,有些人也并不介意你翻看他们的文件柜。实验室中可是有很多学问精深的人,他们的文件柜里也是有好多宝贝。与利用学校图书馆相比,这通常是更快更可靠的寻找论文的方式。把自己写出的草稿的拷贝分发给那些可能感兴趣的人(这也有一个潜在的问题:虽然所在领域的剽窃很少,但也确实有。你可以在第一页写上 “请不要影印或者引用”的字样以做部分防范)。大部分人不会阅读自己收到的大部分论文,因此如果只有少数人返回评论给你,也不用太在意。你可以如此反复几次——这是期刊论文所必需的。注意,除了自己的导师,一般很少将两次以上的草稿送给同一个人。 当你写完一篇论文后,将论文的拷贝送给那些可能感兴趣的人。别以为人家自然而然地就会去阅读发表论文的期刊或者会议录。如果是内部的出版物(备忘录和技术报告)就更不容易读到了。 你保持联系的人越是各式各样,效果就越好。尝试与不同研究组、实验室人员、不同学术领域的人交换论文,使自己成为没有联系的两个科研组交流的桥梁,这样,很快的,你的桌子上就会冒出一大摞相关的论文。 如果某篇论文引用了自己感兴趣的某些东西,做好笔记。维护一份自己感兴趣参考文献的日志。到图书馆去看看能不能找到这些论文。如果要了解某个主题的发展轨迹,可以有意地去做一张引用的“参考文献”图。所谓的参考文献图,是指引用文献组成的网:论文A引用B和C,B引用C和D,C引用D,等等。注意那些被经常引用的论文,这通常是值得阅读的。参考文献图有奇妙的性质,由于经常研究同一主题的研究组可能相互并不了解,当你搜索该图时,会突然发现进入另一部分的方式,这通常出现于不同学校或者采用不同方法的研究组。尽可能了解多种方法是很有价值的,这比非常深入的了解某一种方法更好。 跟别人交谈,告诉他们你在做什么,并询问人家在做什么。(如果你对与别的学生讨论自己的想法感到害羞,也要坚持交谈,即使自己没有什么想法,与他们讨论自己认为确实优秀的论文。这将很自然地引导到下一步做什么的讨论。)当然也可以参加一些非正式的讨论会,比如在午餐时。 从某个时间开始,你将会开始参加学术会议。如果你确实参加了,你会发现一个事实,几乎所有的会议论文都令人生厌或者愚蠢透顶(这其中的理由很有意思,但与本文无关,不做讨论)。那还去参加会议干吗?主要是为了结识实验室之外的人。外面的人会传播有关你的工作的新闻,邀请你作报告,告知你某地的学术风气和研究者的特点,把你介绍给其他人,帮助你找到一份暑期工作,获得到别的实验室工作的机会,诸如此类。如何与别人结识呢?如果觉得某人的论文有价值,就跑上去,说:“我非常欣赏您的论文”,并提问一个问题。这样你会结识另外一群人,或许还会学到另外一种看待事物的方式。可以去问高年级同学如何获取这样的机会,他们或许已经在你想去的地方工作过了,能帮你联系。 三、学习其他领域 通常的情况,你只能做自己研究领域的事情,对自己研究领域之外的事情一无所知,好像有些人现在也仍然这么认为。但是,现在要求好的研究者对几个相关的领域都了解颇深。计算的可行性本身并没有对什么是智能提供足够的约束,其他的领域给出了其他形式的约束,例如心理学获得的经验数据。更重要的是,其他的研究领域给了你思考的新工具,看待智能的新方法。学习其他领域的另外一个原因是自己研究的领域本身并没有评价研究价值的标准,全是借自于其他领域。数学将定理作为进展;工程会问某个对象是否工作可靠;心理学要求可重复的试验;哲学有严格的思辨;等等。所有这些标准有时都在自己研究领域中起作用,熟悉这些标准有助于你评价他人的工作,深入自己的工作以及保护自己的工作。 下面是如何学习自己所知甚少领域的一些方法: 选修一门研究生课程,这很牢靠,但通常不是最有效的方法。 阅读课本。这方法还算不错,不过课本的知识经常是过时的,一般还有很高比例的与内容无关的修辞。 找出该领域最棒的期刊是什么,向该领域的高人请教。然后找出最近几年值得阅读的文章,并跟踪相关参考文献。这是最快的感受该领域的方法,但有时候你也许会有错误的理解。 找出该领域最著名的学者,阅读他们所著的书籍。 跟该领域的研究生泡在一起。 参看外校研究该领域的系的课程表。拜访那里的研究生院办公室,挑选有用的文献。 下面是一些需要了解的我们研究领域相关的科目(可能与我们的研究方向有出入,供大家参考): 计算机科学是我们所使用的技术。你需要选修的初级研究生课程肯定不能让你对计算机科学有足够的了解,因此你必须通过阅读学习更多的知识。计算机科学所有的领域——理论体系结构,系统,语言等等——都是必须学习的。 数学可能是接下来需要了解的最重要的学科。对于工作在视觉或者医学图像处理的人来说更关键。对于以系统为中心的工作,表面上看,并不相关,但数学会教你有用的思维方式。你需要能阅读定理,如果具有证明定理的能力将会给本领域的大多数人留下深刻的印象。很少有人能自学数学,光做个听众是不够的,还得做习题集。尽可能早地选修尽可能多的数学课,其他领域的课程以后选也很容易。计算机科学是以离散数学为基础的:代数,图论,等等。如果你要从事推理方面的工作,逻辑是很重要的。逻辑是认识思维的主流方法。所以你必须具备足够的逻辑知识,这样你才能保护自己的观点。 每一个人都需要知道认知心理学的某些知识。如果你想做有关学习的工作,那么发展心理学是很重要的。发展心理学从一般意义上讲也是很有用的,它能告诉你对于人类来说,哪些事情难哪些容易。它还给出了有关认知体系结构的认知模型。例如,有关儿童语言学习的工作就对语言处理理论施加了坚实的约束。 心理学中更“软”的部分,例如心理分析和社会心理学,对自己研究领域的影响看似很小,但具有潜在的重大意义。它们会给你非常不同的理解人是什么的方式。像社会学和人类学这样的社会科学可以起相似的作用。具有多种观点是很有用的。上述学科你有可能需要自学,不幸的是,很难区分出这些领域哪些是优秀的成果哪些是垃圾。 物理学对于我们某些研究领域也具有极大的影响。 哲学是某些研究领域看不见的框架。哲学也能帮助你运用或者读懂很多自己研究领域论文中用到的观点。有关思维和语言的哲学与自己研究领域更相关。哲学存在着多种学派,从比较大的范围来分,哲学可分为分析哲学和大陆哲学。大陆哲学则对我们习以为常的很多东西有非常不同的看待方式。

计算机视觉文献与代码资源及资料

下面是前端时间搜集整理的一些和计算机视觉、模式识别的资源,拿出来与大家分享下。 标题 作者 主题 关键字 类别 来源 备注 nipsfast.ppt Nando de Freitas N-Body problems in learning Fast N-Body Learning Ppt http://www.cs.ubc.ca/~nando/nipsfast/schedule.html nipsfgtf.ppt Ramani Duraiswami Fast Multipole Methods Fast Gaussian Transform FM and FGT ppt http://www.cs.ubc.ca/~nando/nipsfast/schedule.html Gray.pdf/ppt Alex Gray Statistical N-Body/Proximity Data Structures N-Body and Data Structures Ppt/pdf http://www.cs.ubc.ca/~nando/nipsfast/schedule.html dt-nips04.pdf/ppt Dan Huttenlocher Fast Distance Transforms FDT Ppt/pdf http://www.cs.ubc.ca/~nando/nipsfast/schedule.html High.pdf/ppt Alexander Gray Fast high-dimensional function integration Fast integration Ppt/pdf http://www.cs.ubc.ca/~nando/nipsfast/schedule.html Fast04.pdf/ppt

matlab中图像函数4

Matlab中如何读出写入图像文件以及对图像的简单处理 MATLAB图像处理工具箱支持四种基本图像类型:索引图像、灰度图像、二进制图像和RGB图像。MATLAB直接从图像文件中读取的图像为RGB图像。它存储在三维数组中。这个三维数组有三个面,依次对应于红(Red)、绿(Green)、蓝(Blue)三种颜色,而面中的数据则分别是这三种颜色的强度值,面中的元素对应于图像中的像素点。设所得矩阵为X三维矩阵(256,256,3) ,X(:,:,1)代表红颜色的2维矩阵 X(:,:,2)代表绿颜色的2维矩阵, X(:,:,3)代表兰颜色的2维矩阵。[X, map]=imread('34.bmp');r=double(X(:,:,1)); %r是256 x 256的红色信息矩阵g=double(X(:,:,2)); %g是256 x 256的绿色信息矩阵b=double(X(:,:,3)); %b是256 x 256的兰色信息矩阵 索引图像数据包括图像矩阵X与颜色图数组map,其中颜色图map是按图像中颜色值进行排序后的数组。对于每个像素,图像矩阵X包含一个值,这个值就是颜色图数组map中的索引。颜色图map为m×3双精度矩阵,各行分别指定红、绿、蓝(R、G、B)单色值,map=[RGB],R、G、B为值域为[0,1]的实数值,m为索引图像包含的像素个数。 对于相同的数据,采用uint8格式比双精度格式节省内存空间,从而更经济。在MATLAB中 如果索引图像的颜色图小于256行,则它的图像矩阵以uint8格式存储,否则以双精度格式存储。 一:imread:从图像文件夹中读取图像。 A = imread(FILENAME,FMT) 读取图像到A,如果文件是包含一灰度图像,A是一二维矩阵,如果文件是包含一真彩色图像(RGB),A是一三维矩阵(M-by-N-by-3)。FILENAME :图像文件名;FMT:图像文件格式; 文件必须在当前目录下,或在Matlab的一路径上。如果 imread不能够找到一名称为FILENAME的文件,那么它将找一名为FILENAME.FMT的文件 [X,MAP] = imread(FILENAME,FMT) 把图像FILENAME读入与它相关的图像色彩信息写入MAP,图像色彩信息值在范围[0,1]中自动地重新调整. [...] = imread(FILENAME)这种方式是试图得到文件的格式从文件所包含的信息。 [...] = imread(URL,...)从一Internet URL上读图像 URL 必须包含协议(即: "http://"). 1.2数据类型: TIFF的特殊语法: [...] = imread(...,IDX) 从很多图像TIFF文件中读一个图像;IDX是一个整数值,它显示了所读图像在文件中的顺序,例如:如果 IDX是 3, imread将读文件中的第三个图像。如果省略了这个变量, imread将读文件中的第一个图像. IMREAD支持的图像文件格式:JPEG TIFF GIF BMP PNG HDF PCX XWD ICO CUR RAS PBM PGM PPM 相关信息也可在Matlab中查看: imfinfo, imwrite, imformats, fread,

C#——SQLite速成

为什么我需要 SQLite * 轻巧灵活,基于单个数据库文件,方便创建、移动,能方便的进行数据的分类存储(按业务、按功能、按日期、按客户等),非常适合与灵活的系统搭配使用。 * 部署容易,.NET环境只需一个dll文件(Access可能需要安装MDAC)。 * 开源。 SQLite开发环境与开发资料的准备 .Net SQLite数据库驱动:System.Data.SQLite.dll以及文档 SQLite GUI数据库工具:SQLite Expert PersonalEdition(个人版免费,够用了) .Net SQLite数据库驱动源码:sqlite-netFx-source-1.0.76.0 C#动态创建SQLite数据库 调用SQLiteConnection. CreateFile静态方法创建 SQLiteConnection.CreateFile(path) path测试路径:Data目录存在,Data2目录不存在 var path1 = "dummy1.db";//成功 var path2 = "Data/dummy2.db";//成功 var path3 = "Data\\dummy3.db";//成功 var path4 = "c:\\Data\\dummy4.db";//成功 var path5 = "Data2//dummy5.db";//错误,Data2目录不存在 var path6 = "C:\\Data2\\dummy6.db";//错误,Data2目录不存在 SQLiteConnection. CreateFile内部的实现源码:使用了File.Create创建0字节文件 /// <summary> /// Creates a database file. This just creates a zero-byte file whichSQLite /// will turn into a database when the file is openedproperly.

注意 c++ vector中的erase()

#include <iostream> #include <vector> using namespace std; int main() { vector<int> arr; arr.push_back(6); arr.push_back(7); arr.push_back(8); arr.push_back(9); for(vector<int>::iterator it=arr.begin(); it!=arr.end(); ) { if(* it == 8) { it = arr.erase(it); } else { ++it; } } //注意上面不能写成 /* for(vector<int>::iterator it=arr.begin(); it!=arr.end(); it ++) { if(* it == 8) { arr.erase(it); //在erase后,it失效,并不是指向vector的下一个元素,it成了一个“野指针”。 } } */ cout << "After remove 8:\n"; for(vector<int>::iterator it = arr.begin(); it < arr.end(); ++it) { cout << * it << "

最简单的“从65码高度落下但不摔死”的方法

最简单,几分钟搞定。 首先得装个插件,能够显示与目标距离的那种。还得有飞行坐骑。 找一个不移动的NPC,选中,此时应该能够显示与其距离(但显示的是大概值,好像暴雪并没有提供准确的计算距离的接口)。上坐骑,飞到这个NPC正上方,并提升高度,当显示的距离正好进入“60~80”区间时,再快速按两下空格,使高度再提高一点,以保证在65码多一点。此时点掉坐骑就行了,大约落地后剩下3%的血。

建立有序双向循环链表

#include "stdafx.h" #include <iostream> //建立有序双向循环链表 using namespace std; typedef struct Dbnode{ int data; //节点数据 Dbnode *left; //前驱结点指针 Dbnode *right; //后继节点指针 }Dbnode; void Print(Dbnode *head); //根据数据创建节点 Dbnode *CreateNode(int data){ Dbnode *pnode=new Dbnode;// if (pnode==NULL){ //如果内存申请失败,返回NULL return NULL; } pnode->data=data; pnode->left=pnode;//新节点的前驱和后继指针都指向自身 pnode->right=pnode; return pnode; } //建立有向循环链表,返回表头节点 void InsertNode(Dbnode **head,int data){ if (head==NULL){ return; } Dbnode *phead=*head; Dbnode *pnode=CreateNode(data);//创建一个新节点 Dbnode *node=NULL; if (phead==NULL){ //如果链表为空 phead=pnode; } else if (phead->data>data){ //如果比头节点值小,插入头节点前 phead->left->right=pnode; pnode->left=phead->left; pnode->right=phead; phead->left=pnode; phead=pnode; }else{ //如果值大于等于头节点,插入头节点后面 node=phead; phead=phead->right; while (*head!

atan函数与atan2函数的一点区别

atan 和 atan2 都是求反正切函数,如:有两个点 point(x1,y1), 和 point(x2,y2); 那么这两个点形成的斜率的角度计算方法分别是: float angle = atan( (y2-y1)/(x2-x1) ); 或 float angle = atan2( y2-y1, x2-x1 ); atan 和 atan2 区别: 1:参数的填写方式不同; 2:atan2 的优点在于 如果 x2-x1等于0 依然可以计算,但是atan函数就会导致程序出错; 结论: atan 和 atan2函数,建议用 atan2函数;

浅谈HTTP中Get与Post的区别

http://www.cnblogs.com/hyddd/archive/2009/03/31/1426026.html 浅谈HTTP中Get与Post的区别 Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。URL全称是资源描述符,我们可以这样认为:一个URL地址,它用于描述一个网络上的资源,而HTTP中的GET,POST,PUT,DELETE就对应着对这个资源的查,改,增,删4个操作。到这里,大家应该有个大概的了解了,GET一般用于获取/查询资源信息,而POST一般用于更新资源信息。 1.根据HTTP规范,GET用于信息获取,而且应该是安全的和幂等的。 (1).所谓安全的意味着该操作用于获取信息而非修改信息。换句话说,GET 请求一般不应产生副作用。就是说,它仅仅是获取资源信息,就像数据库查询一样,不会修改,增加数据,不会影响资源的状态。 * 注意:这里安全的含义仅仅是指是非修改信息。 (2).幂等的意味着对同一URL的多个请求应该返回同样的结果。这里我再解释一下幂等这个概念: 幂等(idempotent、idempotence)是一个数学或计算机学概念,常见于抽象代数中。 幂等有一下几种定义: 对于单目运算,如果一个运算对于在范围内的所有的一个数多次进行该运算所得的结果和进行一次该运算所得的结果是一样的,那么我们就称该运算是幂等的。比如绝对值运算就是一个例子,在实数集中,有abs(a) = abs(abs(a))。 对于双目运算,则要求当参与运算的两个值是等值的情况下,如果满足运算结果与参与运算的两个值相等,则称该运算幂等,如求两个数的最大值的函数,有在在实数集中幂等,即max(x,x) = x。 看完上述解释后,应该可以理解GET幂等的含义了。 但在实际应用中,以上2条规定并没有这么严格。引用别人文章的例子:比如,新闻站点的头版不断更新。虽然第二次请求会返回不同的一批新闻,该操作仍然被认为是安全的和幂等的,因为它总是返回当前的新闻。从根本上说,如果目标是当用户打开一个链接时,他可以确信从自身的角度来看没有改变资源即可。 2.根据HTTP规范,POST表示可能修改变服务器上的资源的请求。继续引用上面的例子:还是新闻以网站为例,读者对新闻发表自己的评论应该通过POST实现,因为在评论提交后站点的资源已经不同了,或者说资源被修改了。 上面大概说了一下HTTP规范中GET和POST的一些原理性的问题。但在实际的做的时候,很多人却没有按照HTTP规范去做,导致这个问题的原因有很多,比如说: 1.很多人贪方便,更新资源时用了GET,因为用POST必须要到FORM(表单),这样会麻烦一点。 2.对资源的增,删,改,查操作,其实都可以通过GET/POST完成,不需要用到PUT和DELETE。 3.另外一个是,早期的Web MVC框架设计者们并没有有意识地将URL当作抽象的资源来看待和设计,所以导致一个比较严重的问题是传统的Web MVC框架基本上都只支持GET和POST两种HTTP方法,而不支持PUT和DELETE方法。 * 简单解释一下MVC:MVC本来是存在于Desktop程序中的,M是指数据模型,V是指用户界面,C则是控制器。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式。 以上3点典型地描述了老一套的风格(没有严格遵守HTTP规范),随着架构的发展,现在出现REST(Representational State Transfer),一套支持HTTP规范的新风格,这里不多说了,可以参考《RESTful Web Services》。 说完原理性的问题,我们再从表面现像上面看看GET和POST的区别: 1.GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL和传输数据,参数之间以&相连,如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0%E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则直接把字符串用BASE64加密,得出如:%E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。 POST把提交的数据则放置在是HTTP包的包体中。 2."GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据,IIS4中最大为80KB,IIS5中为100KB"??! 以上这句是我从其他文章转过来的,其实这样说是错误的,不准确的: (1).首先是"GET方式提交的数据最多只能是1024字节",因为GET是通过URL提交数据,那么GET可提交的数据量就跟URL的长度有直接关系了。而实际上,URL不存在参数上限的问题,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器及服务器对它的限制。IE对URL长度的限制是2083字节(2K+35)。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统的支持。 注意这是限制是整个URL长度,而不仅仅是你的参数值数据长度。[见参考资料5] (2).理论上讲,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,说“POST数据量存在80K/100K的大小限制”是不准确的,POST数据是没有限制的,起限制作用的是服务器的处理程序的处理能力。 对于ASP程序,Request对象处理每个表单域时存在100K的数据长度限制。但如果使用Request.BinaryRead则没有这个限制。 由这个延伸出去,对于IIS 6.0,微软出于安全考虑,加大了限制。我们还需要注意: 1).IIS 6.0默认ASP POST数据量最大为200KB,每个表单域限制是100KB。 2).IIS 6.0默认上传文件的最大大小是4MB。 3).IIS 6.0默认最大请求头是16KB。 IIS 6.0之前没有这些限制。[见参考资料5] 所以上面的80K,100K可能只是默认值而已(注:关于IIS4和IIS5的参数,我还没有确认),但肯定是可以自己设置的。由于每个版本的IIS对这些参数的默认值都不一样,具体请参考相关的IIS配置文档。 3.在ASP中,服务端获取GET请求参数用Request.QueryString,获取POST请求参数用Request.Form。在JSP中,用request.getParameter(\"XXXX\")来获取,虽然jsp中也有request.getQueryString()方法,但使用起来比较麻烦,比如:传一个test.jsp?name=hyddd&password=hyddd,用request.getQueryString()得到的是:name=hyddd&password=hyddd。在PHP中,可以用$_GET和$_POST分别获取GET和POST中的数据,而$_REQUEST则可以获取GET和POST两种请求中的数据。值得注意的是,JSP中使用request和PHP中使用$_REQUEST都会有隐患,这个下次再写个文章总结。 4.POST的安全性要比GET的安全性高。注意:这里所说的安全性和上面GET提到的“安全”不是同个概念。上面“安全”的含义仅仅是不作数据修改,而这里安全的含义是真正的Security的含义,比如:通过GET提交数据,用户名和密码将明文出现在URL上,因为(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了,除此之外,使用GET提交数据还可能会造成Cross-site request forgery攻击。 总结一下,Get是向服务器发索取数据的一种请求,而Post是向服务器提交数据的一种请求,在FORM(表单)中,Method默认为"GET",实质上,GET和POST只是发送机制不同,并不是一个取一个发! 纯属hyddd个人总结,如有错漏请指出。:> 参考资料: [1].http://hi.baidu.com/liuzd003/blog/item/7bfecbfa6ea94ed8b58f318c.html [2].http://www.blogjava.net/onlykeke/archive/2006/08/23/65285.aspx [3].http://baike.baidu.com/view/2067025.htm [4].http://www.chxwei.com/article.asp?id=373 [5].http://blog.csdn.net/somat/archive/2004/10/29/158707.aspx 转载请说明出处,谢谢[hyddd(http://www.cnblogs.com/hyddd/)]

指针数组和数组指针的使用

指针数组:指针的数组,表示一个数组,并且数组的每一个元素都是指针类型。 数组指针:数组的指针,表示一个指针,并且是指向数组的指针。 不运行程序,问下面代码的输出是什么? 1#include<iostream> 2 using namespace std; 3 int main() 4 { 5 char *str[]={"welcome","to","Fortemedia","Nanjing"}; 6 char**p=str+1; 7 str[0]=(*p++)+2; 8 str[1]=*(p+1); 9 str[2]=p[1]+3; 10 str[3]=p[0]+(str[2]-str[1]); 11 cout<<str[0]<<endl; 12 cout<<str[1]<<endl; 13 cout<<str[2]<<endl; 14 cout<<str[3]<<endl; 15 system("pause"); 16} 指针是c/c++语言中一个重要的语言特性,但对于c/c++的初学者来说,却不是那么好理解。总起来说指针一个特殊的变量,这个变量能合法的使用*操作符对指针的变量内容进行提领(dereference)和成员访问。对于指针变量在它四个字节(32位平台)的内存里存储的数据是一个内存的地址值,也就是我们平时说的指向一个地址,而指针变量的类型则决定着对指针变量的所指向的地址里的数据的访问方式和从指向的地址开始往下所涵盖的范围。举例来说: #include<iostream> using namespace std; int main() { int i[2]={1073741824,-1073741824}; int *p1=&i[0]; char *p2=(char*)&i[0]; float *p3=(float*)&i[0]; printf("%d->%d/n",p1,*p1); printf("%d->%d/n",p2,*p2); printf("%d->%f/n",p3,*p3); p1++; p2++; p3++; printf("%d->%d/n",p1,*p1); printf("%d->%d/n",p2,*p2); printf("%d->%f/n",p3,*p3); system("pause"); } 上述代码中指针变量p1,p2,p3指向相同的地址值,都是i[0]所标识的内存的地址值,但由于指针的类型不同,导致用*运算符进行提领时,*p1,*p2,*p3的值不一样。当p1用*提领p1所指向的内存里的数据时,由于p1是int*型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(int))的内存,然后把里面的数据安照int变量的存储方式解析成一个int型数值。1073741824在内存&i[0]~&i[0]+3中存储是0x00,0x00,0x00,0x40,(小段机 补码存储),所以*p1的值是1073741824。而p2是char*型的,所以仅从地址值为&i[0](sizeof(char))的内存把里面的数据按照char变量的存储方式解析成一个char型数值,由于地址值为&[i]的内存里是0x00,所以*p2为0.同样由于p3是float*型的,所以会从地址值为&i[0]开始,往下涵盖四个字节(sizeof(float))的内存,然后把里面的数据安照float变量的存储方式解析成一个float型数值。由于float型变量的存储方式不同于整型,c/c++浮点数存储遵循ieee标准,按照标准*p3的值为2.0(具体请参见本博客里一篇关于float内存布局的博文,不再赘述)。另外从上述代码我们可以看到,指针变量的类型还影响着指针变量算术运算时的跨度,即指针变量+1时,指针变量的值会增加sizeof(指针所指向变量的类型)。 弄明白上面所分析的是掌握指针的关键(个人是这么看的),基于刚才的分析来看开始的笔试题: #include <iostream> using namespace std; int main ( ) { char *str[]={"

mysql驱动配置:解决java.lang.ClassNotFoundException: com.mysql.jdbc.Driver

今天运行一个连接mysql数据库的程序总是出错,以前都是在MyEclipse环境下,今天是在DOS环境下,总出现classnotfoundException. 出现这种错误肯定是驱动配置有问题,后来才知道忘了设置classpath,设置如下: 在“我的电脑”---->"属性"---->"高级"---->"环境变量"---->"系统变量"中进行设置classpath(C:Program Flles\mysql\mysql-connector-java-5.1.17\mysql-connector-java-5.1.17-bon.jar)。