本文将介绍如何通过arcgisserver10.1动态图层添加栅格影像。与添加矢量数据不同的是,天际栅格用到了RasterDataSource接口,如下所示
<esri:DynamicLayerInfoid="lakesDynamicLayerInfo" layerId="0"defaultVisibility="true">
<esri:LayerDataSource>
<esri:RasterDataSourcedataSourceName="FRaster.tif" workspaceId="MyRasterWorkspaceID"/>
</esri:LayerDataSource>
</esri:DynamicLayerInfo>
工作空间添加和注册的过程与之前《ArcGISServer10.1动态图层》一文中介绍的过程相同,唯有一点需要注意的是添加工作空间类型选择栅格如下图所示
运行效果如下图所示
从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发。Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎。chrome浏览器就基于V8,同时打开20-30个网页都很流畅。Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低。非常适合小型网站,个性化网站,我们自己的Geek网站!!
关于作者
张丹(Conan), 程序员Java,R,PHP,Javascriptweibo:@Conan_Zblog: http://blog.fens.meemail: bsspirit@gmail.com 转载请注明出处:
http://blog.fens.me/nodejs-browserify/
前言
Nodejs的出现,为Javascript开辟了一条新的大路,让Javascript获得了新生。虽然Nodejs也基于Javascript语法和解释器,但是前后端各自有各自的库,无法重用真的很不舒服。
Browserify 通过预编译的方法,让Javascript前端可以直接使用Node后端的程序。我们可以用一套代码完成前后端,不仅工作量变少了,程序重用性增强,还可以直接在浏览器中使用大量的NPM第三方开源库的功能。
Web时代,将是我们创新与创造的新起点。
目录
Browserify介绍Browserify安装Browserify命令行参数在浏览器中运行Nodejs程序在浏览器中模块化调用Nodejs程序 1. Browserify介绍 Browserify的出现可以让Nodejs模块跑在浏览器中,用require()的语法格式来组织前端的代码,加载npm的模块。在浏览器中,调用browserify编译后的代码,同样写在<script>标签中。
用 Browserify 的操作,分为3个步骤。
1. 写node程序或者模块2. 用Browserify 预编译成 bundle.js3. 在HTML页面中加载bundle.js Browserify 的发布页:http://browserify.org/
2. Browserify安装 系统环境
win7 64bitNodejs:v0.10.5Npm:1.2.19 Browserify安装
~ D:\workspace\javascript>mkdir nodejs-browserify && cd nodejs-browserify browserify@2.36.1 node_modules\browserify ├── inherits@1.0.0 ├── deep-equal@0.1.0 ├── duplexer@0.1.1 ├── shell-quote@0.0.1 ├── parents@0.0.2 ├── through@2.3.4 ├── stream-combiner@0.0.2 (duplexer@0.0.4) ├── deps-sort@0.1.1 (minimist@0.0.5) ├── optimist@0.5.2 (wordwrap@0.0.2) ├── browser-resolve@1.2.1 (resolve@0.6.1) ├── JSONStream@0.6.4 (jsonparse@0.
设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有一下几点注意: 1,创建索引 对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加 索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下 降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。 2,复合索引 比如有一条语句是这样的:select * from users where area=’beijing’ and age=22; 如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效 率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀 特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。 3,索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。 4,使用短索引 对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。 5,排序的索引问题 mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。 6,like语句操作 一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。 7,不要在列上进行运算 select * from users where YEAR(adddate) 8,不使用NOT IN和操作 NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id
javascript中定时器setTimeout无法调用局部变量,只需要将setTimeout的第一个参数改成函数对象,而不是字符串,就可以了
javascript中定时器setTimeout的用法一般如下,调用beginrotate之后就进入定时执行rotateloop的一个过程,如下代码: 复制代码代码如下: var angle = 0; function rotateloop() { if (angle < 360) { angle++; //use angle //...... setTimeout("rotateloop()", 100); } } function beginrotate() { //do something //...... setTimeout("rotateloop()", 100); } 这段代码有一个问题,就是产生了一个全局变量angle,这显然不是好的编程习惯,所以我们想到使用内嵌函数的方式,将代码改成如下: 复制代码代码如下: function beginrotate() { var angle = 0; function rotateloop() { if (angle < 360) { www.jbxue.com angle++; www.jbxue.com //use angle //...... setTimeout("rotateloop()", 100); } } //do something //...... setTimeout("rotateloop()", 100); } 这样子改了之后,发现 javascript报错了,rotateloop找不到,显然setTimeout没有找到rotateloop这个局部内嵌函数,这里只要稍微改一下就可以解决这个问题了,代码如下: 复制代码代码如下: function beginrotate() { var angle = 0; function rotateloop() { if (angle < 360) { angle++; //use angle //.
1)正常安装你的Oracle11g 64位数据库,不太建议在win7上安装Oracle10g了,会报一些错误,网上有很多这方面的解决方法,就不说了。 2)单独安装32位Oracle客户端,注意“32位”,附件中有下载链接。将其解压至Oracle安装目录的Product下,可以随意命名,但要记住喽 3)拷贝原先Oracle11g 64位安装目录下network的文件覆盖到你32位Oracle客户端里的network. 4)安装pl/sql developer 安装 PL/SQL Developer,在perference->Connection里面设置OCI Library和Oracle_Home,例如本机设置为: Oracle Home :D:\Oracle\app\YM\product\elvis_client OCI Library : D:\Oracle\app\YM\product\elvis_client\oci.dll 5)设置环境变量(修改PATH和TNS_ADMIN环境变量) 对于NLS_LANG环境变量, 最好设置成和数据库端一致, 首先从数据库端查询字符集信息: SQL> select userenv('language') nls_lang from dual; NLS_LANG ---------------------------------------------------- SIMPLIFIED CHINESE_CHINA.ZHS16GBK 右击"我的电脑" - "属性" - "高级" - "环境变量" - "系统环境变量": 1>.选择"Path" - 点击"编辑", 把 "D:\Oracle\app\YM\product\elvis_client;" 加入; 2>.点击"新建", 变量名设置为"TNS_ADMIN", 变量值设置为"D:\Oracle\app\YM\product\elvis_client;", 点击"确定"; 3>.点击"新建", 变量名设置为"NLS_LANG", 变量值设置为"SIMPLIFIED CHINESE_CHINA.ZHS16GBK", 点击"确定"; 最后点击"确定"退出. 然后正常启动Pl/sql软件就可以了。
附件地址:点击打开链接
本文转载自http://hi.baidu.com/wzc1989/blog/item/c7d0e0065667e3ca7a8947c4.html
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 sprintf 是个变参函数,定义如下:
int sprintf( char *buffer, const char *format [, argument] ... );
除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:
格式化字符串上。
printf 和sprintf 都使用格式化字符串来指定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要的字符串。
格式化数字字符串
sprintf 最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf 在大多数场合可以替代
itoa。
如:
//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"
可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"
当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"
也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐
这样,一个整数的16 进制字符串就很容易得到,但我们在打印16 进制内容时,通常想要一种左边补0 的等宽格式,那该怎么做呢?很简单,在表示宽度的数字前面加个0 就可以了。
任何人对本文进行引用都要标明作者是Nicolai M.Josuttis ///
C++ 语言是个十分优秀的语言,但优秀并不表示完美。还是有许多人不愿意使用C或者C++,为什么?原因众多,其中之一就是C/C++的文本处理功能太麻烦,用起来很不方便。以前没有接触过其他语言时,每当别人这么说,我总是不屑一顾,认为他们根本就没有领会C++的精华,或者不太懂C++,现在我接触 perl, php, 和Shell脚本以后,开始理解了以前为什么有人说C++文本处理不方便了。
举例来说,如果文本格式是:用户名 电话号码,文件名name.txt
Tom 23245332
Jenny 22231231
Heny 22183942
Tom 23245332
…
现在我们需要对用户名排序,且只输出不同的姓名。
那么在shell 编程中,可以这样用:
awk '{print $1}' name.txt | sort | uniq 简单吧?
如果使用C/C++ 就麻烦了,他需要做以下工作:
先打开文件,检测文件是否打开,如果失败,则退出。
声明一个足够大得二维字符数组或者一个字符指针数组
读入一行到字符空间
然后分析一行的结构,找到空格,存入字符数组中。
关闭文件
写一个排序函数,或者使用写一个比较函数,使用sort()排序
遍历数组,比较是否有相同的,如果有,则要删除,copy…
输出信息
你可以用C++或者C语言去实现这个流程。如果一个人的主要工作就是处理这种类似的文本(例如做apache的日志统计和分析),你说他会喜欢C/C++么?
当然,有了STL,这些处理会得到很大的简化。我们可以使用 fstream来代替麻烦的fopen fread fclose, 用vector来代替数组。最重要的是用 string来代替char * 数组,使用sort排序算法来排序,用unique 函数来去重。听起来好像很不错。看看下面代码(例程1):
[cpp] view plain copy #include <string> #include <iostream> #include <algorithm> #include <vector> #include <fstream> using namespace std; int main() { ifstream in("
目录(?)[-]
内容第一步IO 数据库流式 IOBOM 值常量和全局变量数据类型Platform SDK字符串处理APICRT字符串处理API使你的CC代码支持Unicode的第一步文件 IO 数据库 传输协议等因素流式 IO国际化Unicode高级技术平台和其它因素Unicode字节序标记BOM 值常量和全局变量数据类型Platform SDK字符串处理APICRT字符串处理API 本文摘自I18nGuy主页的一篇内容,原文地址:http://www.i18nguy.com/unicode/c-unicode.zh-CN.html 文档在线看:http://www.docin.com/p-37841375.html 这份文档简要的说明了如何修改你的C/C++代码使之支持Unicode。在这里并不准备解释太多相关的技术细节并且我得假定你已经基本熟悉Microsoft支持Unicode的方式。它的主要目的是方便你查询相关的数据类型和函数,以及修正相应的拼写错误。 内容
第一步
I/O, 数据库
流式 I/O
BOM 值
常量和全局变量
数据类型
Platform SDK字符串处理API
CRT字符串处理API
使你的C/C++代码支持Unicode的第一步 定义宏 _UNICODE, 如果定义了宏 _MBCS 则取消它的定义(undefine)。在字符串前添加 L 标记或者用 _T宏修饰字符串。使用 Wide 或者 TCHAR 版本的字符串处理函数。确定API中的字符串长度是按字节计数还是按字符个数计数。因为基于字符的显示和打印(与此不同的是,GUI是基于像素的)使用列数,而不是字节数或者字符个数。在字符串指针相关的计算中使用GetNext格式,因为一个字符可能包含多于一个Unicode字符单元。注意缓冲区的大小以及防止缓冲区溢出。
改变编码方式可能需要增大缓冲区或者限制字符串的最大长度。假设单个字符的大小从1个字节变为4个字节,并且字符串本来20个字符占用20字节,那么你需要将字符串缓冲区扩大为80字节或者将字符串长度限制为5个字符(字符串缓 冲区仍为20字节)。注意缓冲区的扩大可能被限制到一个最大值(比如65KB)。减少字符串长度到一个固定值可能破坏现有的程序,限制字符串长度到固定 值可能是危险的。比如,限制到20字节,将字符串转化为大写形式就可能导致字符串变长并且超过限制。 将接受或者返回单字符参数的函数替换为使用字符串的版本。 (在一些语言中) 对于单个字符的操作可能导致返回多个代码点。例如,upper('ß')将返回"SS"。 使用 wmain 代替 main。环境变量也由_environ变为_wenviron 。
wmain(int argc, wchar_t *argv[], wchar_t *envp[]) MFC Unicode 程序使用 wWinMain 作为程序入口点(VC++ 6.0)。 project->settings->Link,选择output选项卡
在Entry point symbol一行加上 wWinMainCRTStartup 。字体的因素,分清使用的字体用于渲染各种语言的字符还是用于脚本中。 文件 I/O, 数据库, 传输协议等因素 考虑是否需要读写文件、数据库中的 UTF-8 或者 UTF-16 字符,以及是否进行数据交换。考虑 UTF-16 格式文件中的字节序。 读写网络传输的数据总是使用 Big-Endian ,如果你没有产生 BOM 也使用 Big-Endian。
yum install ntp
a.修改/etc/sysconfig/clock文件的内容为:
ZONE="Asia/Shanghai" b.执行“cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime”(这一步我刚才没做)
c.ntpdate ntp.api.bz
在这篇博文中我们讨论一下Amazon Simple Storage Service(简称S3),这是亚马逊AWS服务在2006年第一个正式对外推出的云计算服务,所以在我们博客中的服务介绍中就从它开始介绍吧,以“纪念”它的历史地位 :-) 。
S3为开发人员提供了一个高度扩展(Scalability)、高持久性(Durability)和高可用(Availability)的分布式数据存储服务。它是一个完全针对互联网的数据存储服务,应用程序可以通过一个简单的Web服务接口就可以通过互联网在任何时候访问S3上的数据。当然你存放在S3上的数据可以进行访问控制以保障数据安全性。这里所说的访问S3包括读、写、删除等多种操作。在刚开始接触S3时要把S3与我们日常所说的网盘区分开来:虽然都属于云存储范畴,但是S3是针对开发人员、主要通过API编程使用的的一个服务,而网盘这样的云存储服务则提供了一个给最终用户使用的服务界面。虽然S3也可以通过AWS的Web管理控制台或命令行使用,但是S3主要是针对开发人员,在理解上可以看成是云存储的后台服务。比如,Dropbox是很多人都喜欢使用的云存储服务,它就是一个典型的AWS客户,其所有的用户文件就是保存在S3存储中的。我们在上一篇博文中提到看到越来越多的客户在加快采用云计算的步伐,一个实际的例子就是S3的使用量。下图显示了S3在过去几年中所存储的数据对象数量增长情况。
图1:S3的增长
可以看到S3达到第一个万亿对象花费了大约6年时间,而实现第二个万亿对象仅仅用了一年时间!
S3的基本数据结构 S3的数据存储结构非常简单,就是一个扁平化的两层结构:一层是存储桶(Bucket,又称存储段),另一层是存储对象(Object,又称数据元)。存储桶是S3中用来归类数据的一个方式,它是数据存储的容器。每一个存储对象都需要存储在某一个存储桶中。存储桶是S3命名空间的最高层,它会成为用户访问数据的域名的一部分,因此存储桶的名字必须是唯一的,而且需要保持DNS兼容,比如采用小写、不能用特殊字符等。例如,你创建了一个名为:zhangsan的存储桶,那么对应的域名就是zhangsan.s3.amazonaws.com,以后你可以通过http://zhangsan.s3.amazonaws.com/来访问其中存储的数据。由于数据存储的地理位置有时对用户来说挺重要,因此在创建存储桶的时候S3会提示选择区域(Region)信息。存储对象就是用户实际要存储的内容,其构成就是对象数据内容再加上一些元数据信息。这里的对象数据通常是一个文件,而元数据就是描述对象数据的信息,比如数据修改的时间等。如果你在zhangsan的存储桶中存放了一个文件picture.jpg,那么你可以通过http://zhangsan.s3.amazonaws.com/picture.jpg这个URL来访问这个文件。从这个URL访问我们可以看到,存储桶名称需要全球唯一,而存储对象的命名则需要在存储桶中唯一。只有这样你才能通过一个全球唯一的URL访问到你指定的数据。S3的数据存储结构如下图所示:
图2:S3的基本存储结构
S3存储对象中的数据大小可以从1个字节到5TB。在缺省情况下每个AWS账号最多能创建100个存储桶。不过用户可以在一个存储桶中存放任意多存储对象。理论上存储桶中的对象数是没有限制的,因为S3完全是按照分布式存储方式设计。除了在容量上S3具有很到的扩展性,S3的性能上也具有高度扩展性,允许多个客户端和应用线程并发访问数据。
可能有人会把S3的存储结构与一般的文件系统进行比较,要注意的是S3在架构上只有两层结构,并不支持多层次的树形目录结构。不过你可以通过设计带“/”的存储对象名称来模拟出一个树形结构来。例如有些S3工具就提供了一个操作选项是“创建文件夹”,其实际上就是通过控制存储对象的名称来实现的。
S3的几个特点 作为云存储的典型代表,Amazon S3在扩展性、持久性和性能等几个方面有自己明显的特点。
1. 耐久性和可用性
保存在S3上的数据会自动的在选定地理区域中进行多个设施(数据中心)和多个设备中进行同步存储。 S3 存储提供了 AWS 平台中最高级别的数据持久性和可用性。除了分布式的数据存储方式之外,S3还内置了数据一致性检查机制来提供错误更正功能。S3 的设计不存在单点故障,可以承受两个设施同时出现数据丢失,因此非常适合用作任务关键型数据的主要数据存储。实际上,Amazon S3 旨在为每个存储对象提供 99.999999999%(“11 个 9”)的年持久性和 99.99% 的年可用性。除了内置冗余外,S3 还可通过使用 S3 版本控制功能使数据免遭应用程序故障和意外删除造成的损坏。对于可以根据需要轻松复制的非关键数据(如转码生成的媒体文件、镜像缩略图等),你可以使用 Amazon S3 中的降低冗余存储 (RRS,ReducedRedundancy Storage) 选项。RRS的持久性为99.99%,当然它存储费用也更低。尽管 RRS 的持久性稍逊于标准 S3,但仍高出一般磁盘驱动器约400 倍。
2. 弹性和可扩展性
Amazon S3 的设计能够自动提供高水平的弹性和扩展性。一般的文件系统可能会在一个目录中存储大量文件时遇到问题,但是S3 能够支持在任何存储桶中无限量的存储文件。另外,与磁盘不同的是,磁盘大小会限制可存储的数据总量,而 Amazon S3 存储桶可以存储无限量的数据。在数据大小方面目前S3的唯一限制是单个存储对象的大小不能超过5TB,但是你可以存储任意数量的存储对象,S3会自动将数据的冗余副本扩展和分发到同一地区内其他位置的服务器中,这一切完全通过 AWS 的高性能基础设施来实现。
3. 良好的性能
S3是针对互联网的一种存储服务,因此它的数据访问速度不能与本地硬盘的文件访问相比。但是,从同一区域内的 Amazon EC2 可以快速访问 Amazon S3。如果你同时使用多个线程、多个应用程序或多个客户端访问 S3,那S3 累计总吞吐量往往远远超出单个服务器可以生成或消耗的吞吐量。S3在设计上能够保证服务端的访问延时与互联网的延时相比要小很多。
为了加快相关数据的访问速度,许多开发人员将 Amazon S3 与 Amazon DynamoDB或Amazon RDS 配合使用。由S3 存储实际信息,而 DynamoDB或RDS 则充当关联元数据(如存储对象名称、大小、关键字等)的存储。数据库提供索引和搜索的功能,而通过元数据搜索高效地找出存储对象的引用信息。然后,用户可以借助该结果准确定位存储对象本身并从 S3 中获取它。当然,为提高最终用户访问S3中数据的性能,你还可以使用Amazon CloudFront这样的CDN服务。
遇到这么个情况:
比如:
Msql里面的某个表的某个字段里面存储的是一个人的地址,有一天这个地址的里面的某个地
名变了,那么他的地址也就要变:
比如:
原来是:
number addr 01 四川省成都市XXXXXX街道05号 02 四川省成都市XXXXXX街道07号 03 四川省成都市XXXXXX街道09号 04 四川省成都市XXXXXX街道04号 现在这个成都市变为了 “天府”市··· 所以,addr字段里面的所有的值,都要把成都市改为 天府市
解决方法:
sql语句:
update 表名 set 字段名=REPLACE (字段名,'原来的值','要修改的值') 当然,也可以添加条件:
update user_item set addr=REPLACE (addr,'成都','天府') where time<'2013-11--5' 最后的效果:
number addr 01 四川省天府市XXXXXX街道05号 02 四川省天府市XXXXXX街道07号 03 四川省天府市XXXXXX街道09号 04 四川省天府市XXXXXX街道04号
小白生活中就被朋友戏称为“不靠谱青年”,在工作上,屡次的事故也让我很受挫,故决定养成遇到错误,要写下来,然后隔一段时间看看,自己是否已经改正的习惯。
昨天是星期天,小白大晚上被领导拉来加班,主要原因:填自己坑。
小白的脚本里面涉及到交互模式,使用者需要填写相应的环境信息,OK,功能就是这样,小白也就做成了这样,结果悲剧了,使用者在填写的时候,填错了,由于小白的脚本里没有对使用者输入的数据进行任何的检测,告警,接下来执行时,脚本的一切功能都乱套了,于是,小白的世界灰了。。。
领导对小白还是很好的,意味深长的教导:我们程序员(媛),写的代码一定要具有健壮性,一定要让客户无论怎么瞎搞,都会有明确的提醒,指导,最终让客户去把软件成功的安装上,不能因为一时糊涂,我们就装不上了..."
小白在领导的一大段耳提面命中发现,小白还是世界观太窄了,考虑问题太不全面了,小白的20个脚本里面,对于所用的文件,文件的属主和属组,文件的非空与空,文件的权限都没有任何的判断与检测,还有些临时文件我也没有在用完之后进行删除。。。
其实,在心底里,小白是有侥幸心理的,这次不出问题就不修改,什么时候出问题什么时候修改~现在想来,做好一件事其实不简单,我需要对所有场景都要有所考虑,所有可能的异常也能兼容,可是我现在却被自己阻挡在这个高质量门外。
2013-11-25 补充:
对于一个命令执行的后果也需要判断,比如说命令会生成一个文件,这时候需要对于是否有这个文件,有这个文件是否为空进行判断。
总结: 1. 对于所用的文件,文件的属主和属组,文件的非空与空,文件的权限都没有任何的判断与检测,对于一个命令执行的后果也需要判断.
2. 对场景的兼容 3. 不要存侥幸心理,成为一个top程序员肯定不需要这个特质。
来自于 网络:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Runtime.InteropServices; using System.Threading; using System.Windows.Forms; using System.IO; namespace Basic { public class VideoAPI //视频API类 { // 视频API调用 [DllImport("avicap32.dll")]//包含了执行视频捕获的函数,它给AVI文件I/O和视频、音频设备驱动程序提供一个高级接口 public static extern IntPtr capCreateCaptureWindow(string lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hwndParent, int nID); [DllImport("AVICAP32.dll", CharSet = CharSet.Unicode)] public static extern bool capGetDriverDescription(int wDriverIndex, StringBuilder lpszName, int cbName, StringBuilder lpszVer, int cbVer); [DllImport("
运行一个msi的安装程序时,总是报错,说什么没有权限写入注册表···
原因就是权限不够嘛··没有用管理员身份运行···
可是,我右键的时候 没有 我擦·····
这个时候 就这样:
1、已管理员身份 命令提示符```
2、在cmd里面 找到你的安装包路径
3、输入 msiexec /i 程序的完整路径(msiexec /i 9.6.1.msi)
MySQL日志:
主要包含:错误日志、查询日志、慢查询日志、事务日志、二进制日志;
日志是mysql数据库的重要组成部分。日志文件中记录着mysql数据库运行期间发生的变化;也就是说用来记录mysql数据库的客户端连接状况、SQL语句的执行情况和错误信息等。当数据库遭到意外的损坏时,可以通过日志查看文件出错的原因,并且可以通过日志文件进行数据恢复。
错误日志
在mysql数据库中,错误日志功能是默认开启的。并且,错误日志无法被禁止。默认情况下,错误日志存储在mysql数据库的数据文件中。错误日志文件通常的名称为hostname.err。其中,hostname表示服务器主机名。
错误日志信息可以自己进行配置的,错误日志所记录的信息是可以通过log-error和log-warnings来定义的,其中log-err是定义是否启用错误日志的功能和错误日志的存储位置,log-warnings是定义是否将警告信息也定义至错误日志中。默认情况下错误日志大概记录以下几个方面的信息:服务器启动和关闭过程中的信息(未必是错误信息,如mysql如何启动InnoDB的表空间文件的、如何初始化自己的存储引擎的等等)、服务器运行过程中的错误信息、事件调度器运行一个事件时产生的信息、在从服务器上启动服务器进程时产生的信息。
下面我们来定义mysql错误日志的功能:
一般而言,日志级别的定义没有回话变量都只是在全局级别下进行定义。
mysql> SHOW GLOBAL VARIABLES LIKE '%log%'; +-----------------------------------------+-----------------------------------+ | Variable_name | Value | +-----------------------------------------+-----------------------------------+ | back_log | 50 | | binlog_cache_size | 32768 | | binlog_direct_non_transactional_updates | OFF | | binlog_format | MIXED | | binlog_stmt_cache_size | 32768 | | expire_logs_days | 0 | | general_log | OFF | | general_log_file | /mydata/data/stu18.log | | innodb_flush_log_at_trx_commit | 1 | | innodb_locks_unsafe_for_binlog | OFF | | innodb_log_buffer_size | 8388608 | | innodb_log_file_size | 5242880 | | innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | .
登录密码保存在CRT的session配置文件中,不过是加密保存的,看不懂
也不知道它的加密算法,没法解密. 所以如果能让CRT自己显示出来就好了
首先修改要登录的主机的IP地址,改成另外一台机器, 这台的登录密码要跟原来机器的不一样
然后连接,这时因为登录密码错误,会弹出一个窗口,显示了用户名和密码,密码是用一串星号表示的
随便下一个星号密码查看软件,查看一下就行了。
原文地址:https://www.exchen.net/%E6%9F%A5%E7%9C%8Bsecurecrt%E4%BF%9D%E5%AD%98%E7%9A%84%E5%AF%86%E7%A0%81.html
普通sting类型 转UTF-8编码格式字符串 std::string ofDewarServer::string_To_UTF8(const std::string & str) { int nwLen = ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0); wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴 ZeroMemory(pwBuf, nwLen * 2 + 2); ::MultiByteToWideChar(CP_ACP, 0, str.c_str(), str.length(), pwBuf, nwLen); int nLen = ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, -1, NULL, NULL, NULL, NULL); char * pBuf = new char[nLen + 1]; ZeroMemory(pBuf, nLen + 1); ::WideCharToMultiByte(CP_UTF8, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL); std::string retStr(pBuf); delete []pwBuf; delete []pBuf; pwBuf = NULL; pBuf = NULL; return retStr; } // UTF-8编码格式字符串 转普通sting类型
is_format=$(ls -l $HOME/software >/dev/null 2>&1 && echo yes || echo no) # software是个目录
if [ "${is_format}" == "yes" ]; then
export JRE_HOME=$HOME/software/jdk1.6.0_34/jre
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
fi
若少了/dev/null 2>&1,执行‘ls -l $HOME/software’的结果是:
drwxr-xr-x 12 wo wo 4096 2013-10-28 13:35 test
drwxrw-r-- 8 wo wo 4096 2013-07-01 15:20 jdk1.6.0_34
yes
加了之后的结果是:
yes
总的结果就为:
OK
总结: 在使用command && echo yes || echo no 的时候,一定要在command之后加上过滤作用的>/dev/null 2>&1,使得command的结果为如何多不会影响只想变量is_format为yes或者no的效果。
禁用网卡:SetNetworkAdapter(false,"本地连接1");
//需要引用:C:\windows\system32\shell32.dll;
private static bool SetNetworkAdapter(bool status,string networkConnection)
{ const string discVerb = "停用(&B)"; // "停用(&B)"; const string connVerb = "启用(&A)"; // "启用(&A)"; const string network = "网络连接"; //"网络连接"; string sVerb = null; if (status) { sVerb = connVerb; } else { sVerb = discVerb; } Shell32.Shell sh = new Shell32.Shell(); Shell32.Folder folder = sh.NameSpace(Shell32.ShellSpecialFolderConstants.ssfCONTROLS); try { //进入控制面板的所有选项 foreach (Shell32.FolderItem myItem in folder.Items()) { //进入网络连接 if (myItem.Name == network) { Shell32.
因为系统开了selinux,导致sqlplus lsnrctl启动报错,报错信息如下:error while loading shared libraries: /app/oracle/app/oracle/lib/libclntsh.so.11.1: cannot restore segment prot after reloc: Permission denied
网上很多方法说关掉selinux。我因为用的是别人的机器,关掉是不现实的。所以找了下面这一种方法
在root用户下执行 chcon -t texrel_shlib_t /app/oracle/app/oracle/lib/*.so (/app/oracle/app/oracle是oracle_home这目录挺蛋疼的。)
1、PCB规则
是PCB设计中至关重要的一个环节;保证PCB符合电气要求、机械加工(精度)要求;为自动布局、布线和部分手动布局、布线操作提供依据
为规则检查提供依据,PCB编辑期间,AD会实时地进行一些规则检查,违规的地方会作标记(亮绿色),也可通过“T - D - R”进行全面的批量规则检查
2、PCB规则分类
Electrical(电气规则):安全间距、线网连接等
Routing(布线):线宽、过孔形状尺寸、布线拓扑、布线层、封装出线等
SMT(表面贴装(贴片)):贴片元件焊盘的一些要求
Mask(掩膜):阻焊和焊膏的扩展
Plane(内电层和铺铜):内电层和铺铜与焊盘的连接方式
Testpoint(测试点)
Manufacturing(加工):孔、焊盘、丝印和阻焊的尺寸及相关关系
HighSpeed(高速信号):串扰、线长、配长、过孔数量等与高速信号相关的
Placement(放置):元件放置和元件间距等
SignalIntegrity(信号完整新):走线阻抗及高速信号的过冲、摆率等
Electrical(电气规则)
Clearance:安全间距规则
Short Circuit:短路规则
UnRouted Net:未布线网络规则
UnConnected Pin:未连线引脚规则
Routing(布线规则)
Width:走线宽度规则
Routing Topology:走线拓扑布局规则
Routing Priority:布线优先级规则
Routing Layers:布线板层线规则
Routing Corners:导线转角规则
Routing Via Style:布线过孔形式规则
Fan out Control:布线扇出控制规则
Differential Pairs Routing:差分对布线规则
SMT(表贴焊盘规则)
SMD To Corner:SMD焊盘与导线拐角处最小间距规则
SMD To Plane:SMD焊盘与电源层过孔最小间距规则
SMD Neck Down:SMD焊盘颈缩率规则
Mask(阻焊层规则)
Solder Mask Expansion:阻焊层收缩量规则
Paste Mask Expansion:助焊层收缩量规则
Plane(电源层规则)
Power Plane Connect Style:电源层连接类型规则
Power Plane Clearance:电源层安全间距规则
想看某些人的状态,但是ta又不是我的好友,也不敢申请加为好友
只好这么办了:
步骤一:在地址栏上输入http://www.renren.com/home#//status/status?id=
步骤二:搜索你想查看的那个人,点进ta的主页,如果ta设置了权限,就会出现以下页面
步骤三:将步骤二中的地址栏末尾那串数字复制到步骤一的地址栏末尾,回车,ok!
Look,已将OK了!
java.lang.ClassNotFoundException: org.apache.commons.lang.exception.NestableRuntimeException
总之,共需要下面的 jars,json-lib方可使用:
commons-logging-1.0.4.jar commons-lang-2.3.jar commons-collections-3.2.jar commons-beanutils-1.7.0.jar json-lib-2.2.1-jdk15.jar ezmorph-1.0.4.jar
以下的randN代表随机产生0~N的数,每个数出现的概率相等。
从rand7产生rand5比较简单,当rand7得到6或者7时再次运行rand7,直到小于6时输出。
但是从rand5产生rand7就没有这么方便了。
可以考虑rand5产生更大的rand。
考虑另一个问题,如果有个rand9的程序,要随机产生0~999的数,这时思路很清晰,先rand百位,然后rand十位,然后rand个位。这样得到得数的概率都相同。
此时就可以联想到rand5产生一个6进制的2位数,即rand5 * 6 + rand5,得到rand35,然后就容易得到rand7了。
本机与服务器的共享资源访问时,需要用户身份时,有时多个不同的文件夹设有不同的用户权限,分别访问时,有时候会有参与进程,
报错:
不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接。中断与此服务器
或共享资源的所有连接,然后再试一次...
开始==》运行==》 输入 net use * /del /y 提示你当前存在的连接进程,有过有 并且想要删除,再次运行下 就会删除了
具体如下:
C:\Documents and Settings\dwm>net use * /del /y
您有以下的远程连接:
\\192.168.50.11\Test
继续运行会取消连接。
命令成功完成。
C:\Documents and Settings\dwm>net use * /del /y
列表是空的。
C:\Documents and Settings\dwm>
OK 可以打开共享文件了
经过各种笔试面试,终于拿到了人人和阿里的offer,人生的前两个offer,庆幸之情溢于言表,仿佛自己像《当幸福来敲门》里的克里斯在被应聘后的喜悦之情。这一刻,幸福真的敲了我的门。
之前曾各种面试被拒,加上被学院所坑(这部分也只能怪自己不小心),已无退路,几近考研,对自己的前途一直做着最坏的打算,一度悔恨自己大学三年没有把哪门技术精通,秒杀面试官,别人安慰我说我很优秀,谁又能知道我内心的苦衷。在这一切都还没有成功之前我不曾向父母提起,直至老爸问我保研出结果没,我才简单的透漏了下我在找工作。不想让他们担心。前段时间面试,曾有一天面了5场,当然不是同一个公司,但也已够累。我要感谢那天最后一场面试官,是人人的一个面试官,他看着我的简历说本科生可以做到这样已经很优秀了,面过还是很有希望的。得到面试官的认可,我很欣喜,原来我还是优秀的。那个说我怎么不继续做输入法的面试官,不让我过是他的错,我调整回了心态。
千里马常有而伯乐不常有,被埋没的人才是多么可怜和可惜。人总是渴望得到别人的认可,但是人的性格又各不相同,面试有时候真的不适合所有人。
大四一年,我真的要好好钻深一门技术。这个博客,我希望我会更新一些高质量的博文。
之后还有一些公司的笔试面试,我会继续更新这篇博文。
oldman的校招旅程终于结束。
最终战绩:
成功拿下阿里、百度、人人、新浪offer,最后选择去阿里。
被腾讯、金山、去哪儿拒了。
没什么值得炫耀的,都不是special offer。只能说明这几年没白学。
XBMC插件addon.xml编写说明 翻译自http://wiki.xbmc.org/index.php?title=Addon.xml ,不完全翻译。
====================================
1. 引言 XBMC中每一个皮肤或脚本(或插件)都要包含一个addon.xml文件,它会设置扩展的总体信息(开发人员,版本信息和依赖库)。下面我们会讲解如何书写一个这样的文件,另外会给出皮肤和脚本(插件)版本的不同。
2. 总体结构 Addon.xml有以下需要注意的:
l 必须出现<addon>标签,它是整个文件的顶层标签。
l <addon>标签中包含<requires>标签,它列出这个扩展运行所需的组件。
l 然后有一个或多个<extension>标签,每一个标签都会说明扩充的功能。
l 最后,有一个特别的<extension>标签为用户描述这个扩展的整体信息。
必须包含的内容 <addon> 标签
有四个属性:id、version、name和provider-name。
标签名
说明
id
该扩展的唯一标识,必须独一无二,并且必须由小写字符、点号、下划线、破折线和数字组成,XBMC将把它的名字作为目录名,因此建议写成<类型>.<标识符>的形式。
version
写成X.Y.Z(主版本号.次版本号.补丁号)的形式。一般来讲,进行测试开发时写为0.y.z形式,正式发布时为1.0.0的形式。只有在beta版或发布版才使用字母,其他情况下应只包含数字。
name
扩展在XBMC界面中显示的名字。注意它必须是英文,而且不能被翻译。
Provider-name
该信息出现在“开发者”一栏中,可以是独立开发者也可以是一个团队,如果有多人开发,使用逗号隔开。
示例:<addon id="script.hello.world" name="Hello World" version="0.0.1" provider-name="Dev1, Dev2">
<requires>标签
包含一个或多个<import>标签,它表示这个扩展所需要的其他扩展的名称和版本号。这些扩展可以是XBMC本身的一部分,也可以是第三方扩展。XBMC只会运行那些依赖正确的扩展,即版本号正确。当用户从仓库中安装你的扩展时,XBMC会试图解析依赖,安装依赖的扩展。必须提供依赖正确的最低版本号。
当设置optional属性为true时将使对应的扩展为可选,这将会在真正需要它的时候再安装。如果依赖丢失,依赖的扩展仍然会被安装。
如果你的扩展依赖于第三方模块,必须由用户先安装后者再安装前者。如果在已知仓库中存在,则XBMC会自动安装,否则需要你在代码中自行获取,因为XBMC不知道在<requires>中做什么。
示例:
<requires>
<import addon="xbmc.python" version="2.1.0"/>
<import addon="script.module.elementtree" version="1.2.7"/>
<import addon="script.module.simplejson" version="2.0.10" optional="true"/>
</requires>
下面的扩展只会在OPENELEC上安装:
</requires>
<import addon="os.openelec.tv" version="2.0" optional="false"/>
</requires>
可选的标签:
<import addon="script.module.simplejson" version="2.0.10" optional="true"/>
依赖版本
作者:朱金灿
来源:http://blog.csdn.net/clever101
最近使用gdal库比较多,就谈谈gdal库的一些使用心得。
第一个是GDALOpen的访问权限参数会影响图像的创建金字塔方式。比如你是这样打开图像和创建金字塔:
std::string strImgPath = _T(“C:\\1.tif”); GDALDataset* mGdalDataset=(GDALDataset*)(GDALOpen(strImgPath.c_str(),GA_Update)); mGdalDataset ->BuildOverviews(_T("NEAREST"),nLevel,pBandList,0,NULL,GdalBuildPyramidProgress,NULL); 运行完这段代码之后你会奇怪地发现在图像文件所在的文件夹并没有ovr文件或rrd文件出现,那么究竟有没有金字塔生成呢?实际上是有的。那么图像金字塔数据究竟存储在哪里,我猜测是存储在图像文件本身去了。为何这么说呢?因为我试着把第一行代码的GA_Update改为GA_ReadOnly,结果出现了ovr文件,也就是说当设置为GA_Update,金字塔数据是有可能放在图像文件的,当然我没有确认。这里还有一些疑问:如果金字塔数据是存储在文件里,那么对于tif文件具体是存储在哪里?对于其它图像文件又是存储在哪里呢?
第二个在调用完RasterIO函数对图像进行写入操作之后只是保留在缓存,需要再调用FlushCache函数才能真正把数据写到磁盘去。
第三个是网上有一篇关于坐标转换的教程:GDAL库学习笔记(五):坐标系之间的转化。其中有一段代码是这样的:
OGRSpatialReference oUTM, *poLatLong; OGRCoordinateTransformation *poTransform; oUTM.SetProjCS("UTM 17 / WGS84"); oUTM.SetWellKnownGeogCS( "WGS84" ); oUTM.SetUTM( 17 ); poLatLong = oUTM.CloneGeogCS(); poTransform = OGRCreateCoordinateTransformation( &oUTM, poLatLong ); if( poTransform == NULL ) { ... } ... if( !poTransform->Transform( nPoints, x, y, z ) ) ... 我试过多次,OGRCreateCoordinateTransformation总是执行失败。后来看了gdal的源码,发现ogr集成prj4库进行投影坐标转换颇有些坑爹的地方。我们看一些OGRCreateCoordinateTransformation函数大致是怎么做的:
OGRCreateCoordinateTransformation函数大致是怎么做的: OGRCoordinateTransformation* OGRCreateCoordinateTransformation( OGRSpatialReference *poSource, OGRSpatialReference *poTarget ) { OGRProj4CT *poCT; if( !
利用LoadRunner判断HTTP服务器的返回状态
第一种方法:是利用LR的内置函数web_get_int_property。 举例: #include "web_api.h" Action() { int HttpRetCode; web_url("网易", "URL=http://www.163.com", "TargetFrame=_TOP", LAST); HttpRetCode = web_get_int_property(HTTP_INFO_RETURN_CODE); if (HttpRetCode == 200) lr_log_message("The Vuser successfully accessed the 网易 page"); else lr_log_message("The Vuser failed to access the 网易 page "); return 0; } 第二种方法:另外一种就是最原始的办法,自己取HTTP服务器的数据,然后利用关联函数分析啊. 其实所有的东西都可以通过关联函数从服务器的返回数据中取,然后自己动手解析,呵呵. 举个不太恰当的例子: 你需要一套家具,可以去家具市场挑,当然也可以自己买木材原料和工具,动手加工. 那才是最合乎自己需要的. 关于动态参数化的问题分析; 其实第一次看到这个问题,我没有马上反应过来,后来仔细想想, 明白了. 就是需要参数化的数据不是静态的,是动态的. 比如从数据库中选出来的.
针对这个问题,应该提前从数据源(比如数据库)把数据选取出来,然后在执行的时候直接进行参数化的选取. 反之,如果在程序执行期间,进行数据的选取,将可能带来数据库服务器的强大压力,因为参加并发执行的每个虚拟用户都去数据库搜刮一下,对数据库将是多么严峻的考验啊.
朋友或者同事之间的探讨是加深对问题理解和增加知识面,扩展视野最直接的途径和方法,加强沟通,keep in touch.
参考文章地址:http://www.rickyzhu.com/2007/03/23/case-one-of-loadrunner/
CPU地址空间 (一)地址的概念 1)物理地址:CPU地址总线传来的地址,由硬件电路控制其具体含义。物理地址中很大一部分是留给内存条中的内存的,但也常被映射到其他存储器上 (如显存、BIOS等)。在程序指令中的虚拟地址经过段映射和页面映射后,就生成了物理地址,这个物理地址被放到CPU的地址线上。 物理地址空间,一部分给物理RAM(内存)用,一部分给总线用,这是由硬件设计来决定的,因此在32 bits地址线的x86处理器中,物理地址空间是2的32次方,即4GB,但物理RAM一般不能上到4GB,因为还有一部分要给总线用(总线上还挂着别的 许多设备)。在PC机中,一般是把低端物理地址给RAM用,高端物理地址给总线用。 2)总线地址:总线的地址线或在地址周期上产生的信号。外设使用的是总线地址,CPU使用的是物理地址。 物理地址与总线地址之间的关系由系统的设计决定的。在x86平台上,物理地址就是总线地址,这是因为它们共享相同的地址空间——这句话有点难理解,详见下 面的“独立编址”。在其他平台上,可能需要转换/映射。比如:CPU需要访问物理地址是0xfa000的单元,那么在x86平台上,会产生一个PCI总线 上对0xfa000地址的访问。因为物理地址和总线地址相同,所以凭眼睛看是不能确定这个地址是用在哪儿的,它或者在内存中,或者是某个卡上的存储单元, 甚至可能这个地址上没有对应的存储器。
(二)编址方式 1)外设都是通过读写设备上的寄存器来进行的,外设寄存器也称为“I/O端口”,而IO端口有两种编址方式:独立编址和统一编制。 统一编址:外设接口中的IO寄存器(即IO端口)与主存单元一样看待,每个端口占用一个存储单元的地址,将主存的一部分划出来用作IO地址空间,如,在 PDP-11中,把最高的4K主存作为IO设备寄存器地址。端口占用了存储器的地址空间,使存储量容量减小。 统一编址也称为“I/O内存”方式,外设寄存器位于“内存空间”(很多外设有自己的内存、缓冲区,外设的寄存器和内存统称“I/O空间”)。 如,Samsung的S3C2440,是32位ARM处理器,它的4GB地址空间被外设、RAM等瓜分: 0x8000 1000 LED 8*8点阵的地址 0x4800 0000 ~ 0x6000 0000 SFR(特殊暂存器)地址空间 0x3800 1002 键盘地址 0x3000 0000 ~ 0x3400 0000 SDRAM空间 0x2000 0020 ~ 0x2000 002e IDE 0x1900 0300 CS8900 独立编址(单独编址):IO地址与存储地址分开独立编址,I/0端口地址不占用存储空间的地址范围,这样,在系统中就存在了另一种与存储地址无关的IO地 址,CPU也必须具有专用与输入输出操作的IO指令(IN、OUT等)和控制逻辑。独立编址下,地址总线上过来一个地址,设备不知道是给IO端口的、还是 给存储器的,于是处理器通过MEMR/MEMW和IOR/IOW两组控制信号来实现对I/O端口和存储器的不同寻址。如,intel 80x86就采用单独编址,CPU内存和I/O是一起编址的,就是说内存一部分的地址和I/O地址是重叠的。 独立编址也称为“I/O端口”方式,外设寄存器位于“I/O(地址)空间”。 对于x86架构来说,通过IN/OUT指令访问。PC架构一共有65536个8bit的I/O端口,组成64K个I/O地址空间,编号从 0~0xFFFF,有16位,80x86用低16位地址线A0-A15来寻址。连续两个8bit的端口可以组成一个16bit的端口,连续4个组成一个 32bit的端口。I/O地址空间和CPU的物理地址空间是两个不同的概念,例如I/O地址空间为64K,一个32bit的CPU物理地址空间是4G。 如,在Intel 8086+Redhat9.0 下用“more /proc/ioports”可看到: 0000-001f : dma1 0020-003f : pic1 0040-005f : timer 0060-006f : keyboard 0070-007f : rtc 0080-008f : dma page reg 00a0-00bf : pic2 00c0-00df : dma2 00f0-00ff : fpu 0170-0177 : ide1 …… 不过Intel x86平台普通使用了名为内存映射(MMIO)的技术,该技术是PCI规范的一部分,IO设备端口被映射到内存空间,映射后,CPU访问IO端口就如同访 问内存一样。看Intel TA 719文档给出的x86/x64系统典型内存地址分配表: 系统资源 占用 ------------------------------------------------------------------------ BIOS 1M 本地APIC 4K 芯片组保留 2M IO APIC 4K PCI设备 256M PCI Express设备 256M PCI设备(可选) 256M 显示帧缓存 16M TSEG 1M
aabkx.com aapun.com abmrw.com abnks.com acphq.com acsgq.com actcL.com aderz.com adjni.com adojj.com adyjy.com afabd.com afcfx.com afrhi.com afubd.com ahscp.com aihtt.com aimfp.com aimij.com airyh.com ajfsi.com aLozg.com aLswL.com amabh.com amcfp.com amjer.com amsga.com amtxt.com andhp.com animt.com anndj.com ansge.com aobdv.com apkgk.com aqhpb.com aquec.com arnfs.com asffz.com askcq.com asmmw.com asqap.com aufrp.com axhzs.com axLai.com ayvpn.com azbek.com azsdz.com baoof.com batbv.com bbssu.com bcapu.com bcfiy.com bcpow.com bcrib.com bcyzc.com bdagj.com bevpm.com bezLa.com bfahr.com bfect.com bhLLa.com bhyyc.com bjdmr.com bjjLq.com bLkck.com bLsvw.com bmabs.com bmham.com bnfsj.com bogip.
一、System.in(最笨的方法) 首先看jdk的API.
System的静态方法in返回的是一个InputStream类型的对象,则我们可以用读取输入流的方式对其进行读取。
按API的说法“此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。”键盘上按下的任何一个键都会被当做是输入值。
如何回显输入值?
我们就用读取输入流的方式进行读取,还是看API
InputStream包含方法read();read(byte[] b);read(byte[] b, int off, int len) ;
1、read(); 看API从输入流中读取数据的下一个字节。返回 0 到 255 范围内的 int 字节值。
返回一个整型字节数据,该数据表示的是字节因此是Unicode的第一个字节或是字符的ASCII码值。该方法是从一个流中一个一个的读取数据,因此是一个迭代的过程。
如果到达流的末尾,则返回 -1
重复调用System.in.read()实际上是在遍历该流中的每一个字节数据。最常见的流是键盘输入流。以下为例:
import java.io.IOException; public class Test1 { public static void main(String[] args) throws IOException { System.out.println("请输入:"); int i = 0; while(i!=-1){//读取输入流中的字节直到流的末尾返回1 i = System.in.read(); System.out.println(i); } } } 如图我们输入ABCD则返回了其ASCII值 如果System.out.println(i);改为System.out.println((char)i);强制转换为char字符,则输出ABCD
这里的13和10是读取的键盘的回车,我们在键盘上按一下回车键,实际上读取到的是两个字符,即“\r”(13)和“\n”(10)。字符“\r”表示回车,即光标回到当前行的行首而不换行;字符“\n”表示换行,即光标移到当前行的下一行行首。
(这里还要PS下回车的来历:
回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return 换行 \n 本义是光标往下一行(不一定到下一行行首),n的英文newline,控制字符可以写成LF,即Line Feed 在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。 后来,计算机发明了,这两个概念也就被般到了计算机上。那时,存储器很贵,一些科学家认为在每行结尾加两个字符太浪费了,加一个就可以。于是,就出现了分歧。 /*======================================*/ \n: UNIX 系统行末结束符 \n\r: window 系统行末结束符 \r: MAC OS 系统行末结束符 /*======================================*/ 一个直接后果是,Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;而Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号 有兴趣可以去查看相关资料 )
工作项目有个需求,需要向第三方提供的接口发生http请求,参数是json字符串,要求是UTF-8编码,我在网上找了好多解决办法,都没有解决。问同事,他提醒我看httpclient的API,我没有去看,结果他通过看API找到了问题的解决办法。代码如下:
主要是在创建HttpClient对象时,可以传入一个参数,该参数可以设定编码(默认的是iso8859-1),设定为UTF-8即可。同时需要注意json字符串的编码。代码如下:
//通过http请求获得相应的字符串
public static String getResponseTextByHttpRequest(String interfaceUrl, JSONObject obj) throws IllegalStateException, IOException {
log.info("准备进行http请求:"+interfaceUrl);
HttpParams httpParams = new BasicHttpParams();
httpParams.setParameter("charset", "UTF-8");
//在创建httpclient时就设置好编码
HttpClient httpclient = new DefaultHttpClient(httpParams);
HttpPost httppost = new HttpPost(interfaceUrl);
HttpResponse response = null;
String text = null;//响应的字符串
if(obj != null){
StringEntity reqEntity = new StringEntity(obj.toString(),"UTF-8");
reqEntity.setContentType("application/json");
httppost.setEntity(reqEntity);
System.out.println("------reqEntity--------"+obj.toString()+"------------------------");
log.info("请求"+interfaceUrl+"时的附加参数"+obj.toString());
}
response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
System.out.println(response.getStatusLine());
log.info(response.getStatusLine());
if (entity != null) {
System.out.println("Response content length: "
Description
Alice and Bob often play games on chessboard. One day, Alice draws a board with size M * N. She wants Bob to use a lot of cards with size 1 * 2 to cover the board. However, she thinks it too easy to bob, so she makes some holes on the board (as shown in the figure below). We call a grid, which doesn’t contain a hole, a normal grid.
argparse - 命令行选项与参数解析(译)Mar 30, 2013 原文:argparse – Command line option and argument parsing
译者:youngsterxyf
argparse模块作为optparse的一个替代被添加到Python2.7。argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库。
与optparse相比较 argparse的API类似于optparse,甚至在很多情况下通过更新所使用的类名和方法名,使用argparse作为一个简单的替代。然而,有些地方在添加新特性时不能保持直接兼容性。
你必须视情况决定是否升级已有的程序。如果你已编写了额外的代码以弥补optparse的局限,也许你想升级程序以减少你需要维护的代码量。若argparse在所有部署平台上都可用,那么新的程序应尽可能使用argparse。
设置一个解析器 使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。
解析器类是 ArgumentParser 。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。
import argparse parser = argparse.ArgumentParser(description='This is a PyMOTW sample program') 定义参数 argparse是一个全面的参数处理库。参数可以触发不同的动作,动作由 add_argument() 方法的 action 参数指定。 支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。
默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。
解析一个命令行 定义了所有参数之后,你就可以给 parse_args() 传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:] 中获取,但你也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。
parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数 dest 是 "myoption",那么你就可以args.myoption 来访问该值。
简单示例 以下简单示例带有3个不同的选项:一个布尔选项(-a),一个简单的字符串选项(-b),以及一个整数选项(-c)。
import argparse parser = argparse.ArgumentParser(description='Short sample app') parser.add_argument('-a', action="store_true", default=False) parser.
今天在看汇编的时候,突然想起变量交换的问题来,记得原来老郭跟我说过一种变量交换的方法——异或。也不知道是怎么会突然产生这种怨念,于是就上网查了一下,这种方式究竟好不好,结果是这种“技巧”除了糊弄面试官以外,基本上没有啥实用性……
void swap(int *a, int *b) { int tmp; tmp = *a; *a = *b; *b = tmp; } void swap2(int *a, int *b) { *a ^= *b; *b ^= *a; *a ^= *b; } 上面的swap就是“正常思维”的交换,下面的swap2就是“异或思维”的交换,本着不相信一切牛鬼蛇神的原则,我是一定要看到汇编代码才肯罢休的……
通过将C程序变为汇编程序以后(至少-O1优化),得到以下的汇编代码:
swap: .LFB35: .cfi_startproc movl (%rdi), %eax movl (%rsi), %edx movl %edx, (%rdi) movl %eax, (%rsi) ret .cfi_endproc swap2: .LFB36: .cfi_startproc movl (%rsi), %eax xorl (%rdi), %eax movl %eax, (%rdi) xorl (%rsi), %eax movl %eax, (%rsi) xorl %eax, (%rdi) ret .
关于C# 调用java的方法吗,我在网上找了很多资源,但是 用 IKVM 的居多。
于是 我也就顺着搞了一下:
关于C# 调用java的方法如下:
1.将已经编译后的java中Class文件进行打包;打包命令JAR
2.到IKVM官网中去下载需要的组件:下载地址 http://www.ikvm.net/download.html
3.在环境变量中将 IKVM添加到 path中,如:D:\ikvm-7.2.4630.5\bin 将这一路径添加到 环境变量的Path中
4.将刚刚打包好的jar编译成dll。使用IKVM
1.使用cmd命令进入doc窗口
2.进入你的IKVM的安装目录。如:D:\ikvm-7.2.4630.5>
3.使用命令编译dll: ikvmc -out:d\javaMethod.dll d:\test.jar(d\javaMethod.dll 新生成的DLL,d:\test.jar 是你刚刚打包好的jar包)
现在 就已经把刚刚写的java程序打包了DLL。现在就是要建立一个C# 程序来调用java了。
1.建立一个C#项目
2.首先添加IKVM的组件引用:(下面的DLL)
D:\ikvm-7.2.4630.5\bin\IKVM.OpenJDK.Core.dll (这就是DLL的文件路径,在C#项目里面添加这个三个文件的引用) 3.把刚刚生成好的新的 javaMethod.dll 也添加到这个C#项目的引用里。 4.测试 namespace CallJava
{
class Program
{
static void Main(string[] args) {
Test test = new Test(); // 这个Test就是刚刚在java里面的写的一个类
Console.WriteLine(test.javaMethod()); // javaMethod() 是Test类中的一个方法。
Console.ReadKey();
}
}
}
有2中方式:
1、在MyEclipse下,选中项目右击属性propertis弹出一个框,选择MyEclipse——>web,修改Web-root folder修改其中名称就好.
2、在web 根目录下有一个.mymetadata打开修改里面content-root="XXX"就OK。
昨天我们一起学习了一部分jquery mobile的知识,今天我们继续。
这些是些很基础的东西,有朋友觉得这个没有其它的好,但是学习下不吃亏嘛,我反正也不会一起学习基础啦。
例子请使用手机查看哦
网格布局 jquery mobile提供一种多列布局功能,由于移动设备的屏幕大小原因,一般情况还是不要使用多列布局啦。
jquery mobile提供一种css样式规则来定义多列布局,对应css为ui-block,每列的样式是通过定义前缀+“-a”等方式对网格的列进行布局,a字母根据网格的列数而定。
例如两列布局CSS为:ui-block-a与ui-block-b
两列网格布局
1 <!DOCTYPE html> 2 <html xmlns="http://www.w3.org/1999/xhtml"> 3 <head> 4 <title></title> 5 <meta name="viewport" content="width=device-width, initial-scale=1"> 6 <link id="jquerymobile_120" rel="stylesheet" type="text/css" class="library" 7 href="/js/sandbox/jquery-mobile/jquery.mobile-1.2.0/jquery.mobile-1.2.0.css"> 8 <script id="jquery_182" type="text/javascript" class="library" 9 src="/js/sandbox/jquery/jquery-1.8.2.min.js"></script> 10 <script id="jquerymobile_120" type="text/javascript" class="library" 11 src="/js/sandbox/jquery-mobile/jquery.mobile-1.2.0/jquery.mobile-1.2.0.min.js"></script> 12 </head> 13 <body> 14 <div class="ui-grid-a"> 15 <div class="ui-block-a"> 16 <input type="button" value="确定" /> 17 </div> 18 <div class="ui-block-b"> 19 <input type="
如果vi支持鼠标操作,你会选择vi吗?
这个问题就好像如果Linux有图形界面,你会选择Linux吗?
在进入vi以后,在命令模式下,输入“:set mouse=a”,回车,这样,我们可爱的小vi就支持鼠标操作了……
包括光标定位,字符选择,滚轮等等,基本上可以模仿notepad的一切操作……
这里给vi新手一点常识性的提醒:
vi的光标不像notepad一样,在两个字符中间,而是在某个字符上面,对于绝大多数windows爱好者来说,这种设定非常蛋疼,但是如果你打算使用命令行界面,那么请你慢慢习惯这种设定,因为即使是Windows下的cmd也是这种设定……在任何情况下,不要试图按下ctrl+z,这个windows环境下默认的“撤销”功能,在linux下会让你无比迷茫,如果你不小心按下了,请在退出后的命令行界面输入“fg 1”,然后回车在任何情况下,不要试图按下ctrl+c,这个组合键表示中止程序。命令行下的复制和粘贴是ctrl+shift+c,ctrl+shift+v,一定要记住这一点,这个特性可以用在一切默认的命令行操作中一旦vi开启了鼠标支持,ctrl+shift+c,ctrl+shift+v的模式就失效了,此时不要再试图使用这两个组合键,而是采用vi自己的赋值粘贴方式:y复制、p粘贴
不知道有多少linuxer在敲命令的时候,由于不得不按shift而十分蛋疼,今天无意中google了一下,终于找到了解决方案:“.inputrc“文件
一般情况是,在我们的home目录下是没有这个文件的,所以我们就自己建一个“.inputrc”文件,然后把以下文字粘贴过去,就ok了:
# 关掉 match-hidden-files 不显示隐藏文件,特别是当你在 home 目录时,你会觉得眼前好干净。 set match-hidden-files off # 默认情况下,按下两次 <tab> 才会出现提示,show-all-if-ambiguous 开启后,只需要一次了。 set show-all-if-ambiguous on # 开启 completion-ignore-case 忽略大小写 set completion-ignore-case on(以上内容引自: http://www.phpvim.net/os/mac/auto-complete-ignoring-case-in-bash.html )通过以上设置,我们就可以看到这样的改变:1、命令行变成了大小写不敏感的,也就是说,当我们的目录下有一个叫Public的目录,我们输入cd pub然后按下tab,系统一样可以自动补全,并适当的替换大小写2、一次按下tab就可以打印匹配列表,即当我们在home目录下,输入:ls然后按下一次tab时,就可以显示所有目录(默认是有隐藏目录的,现在都没有了)。以前需要按下两次tab键,现在按一次就行了,不过有些人已经养成了习惯的话,就自便了3、所有的隐藏文件不会再提示,即我们在home目录下输入:ls然后按下tab时,只会显示不以“.”开头的所有文件,果然清爽了很多。当我们需要为当前的隐藏文件生成提示时,只需要输入:ls .然后按下tab就可以了
前两天跟“专家”讨论const能不能强制类型转换的问题,像专家这样的内存使用高手,基本上不在乎什么const不const,拿来就用,强转一下就行,事实证明确实强转成非const,毫无压力,不过我一直觉得有问题,所以今天自己做了个实验,证实了一下。
程序非常的简单,写一个这样的函数:
void foo(const char *p) { const char *a = "foo"; printf("%p\n%p\n", p, a); } 打印一下结果,可以发现两个地址明显不同,当然,前提是我们在调用函数的时候,给一个普通的char*,而不是const char*。这样,在函数里,我们可以强转p,而不能强转a。(编译不会报错,运行就崩)
在Linux中,a的地址明显是一个低地址,而p是一个高地址,根据一般的装载原则,代码段一般会放在低地址,而数据段一般会放在高地址,所以我们可以猜想“foo”这个字符串是和代码放在了一起,而p是和数据放在了一起。了解过32位保护模式的同学应该会知道,在32位虚地址环境下,地址在转换的过程中,是有“只读”标记控制的,代码段显然是“只读”的,而数据段是“可写”的,所以,我们可以正常的方位foo,但是却不能修改它,一切的修改动作都会被操作系统截获,然后抛出“段错误”。
所以,我们今后在使用const强转的时候,其实更应该关心的是我们究竟使用的是哪块内存,做到这一点,就可以各种强转无压力了……
转载自:http://blog.sina.com.cn/s/blog_6c14c17e0100ln87.html 在XBMC中,有不少libraries没用过,在研究XBMC框架前,先把它们过一遍。 在XBMC中,扩展功能模块采用了c-pluff,c-pluff是一个用于访问扩展功能和管理插件依赖关系的框架。 下面来介绍一下常用的函数: 1) Call cp_init to initializing the plug-in framework #include <cpluff.h> ctx = cp_init(); if (ctx == NULL) { ... } 2) Call cp_create_context to creating a plug-in context #include <cpluff.h> ctx = cp_create_context(&status); if (ctx == NULL) { ... } 3) Loading plug-ins the main program can load individual plug-ins from known locations using cp_load_plugin_descriptor and cp_install_plugin. #include <stdio.h> #include <cpluff.h> extern cp_context_t *ctx; static char *plugindir[] = { "
一、客户端浏览器到服务器端传参的编码总结 <%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=UTF-8" %>
1.pageEncoding为jsp文件本身的编码。jsp编译成.java时,它会根据pageEncoding的设定读取jsp。如果pageEncoding设定错了,或没有设定,出来的就是中文乱码。 (如果pageEncoding不为UTF-8,eclipse会提示不能保存带有中文的jsp页面文件,哪怕小写的utf-8也不行)。
2.contentType的charset是指服务器发送给客户端时的内容编码。设定错了,或没有设定,出来的就是中文乱码。
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
3.告诉浏览器显示页面需要的字符集,如果浏览器缺少该字符集则需要下载对应字符集。详见附A。
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
4.保持和第2点的编码一致,通常写filter解决,需要放在最前面。前者用于客户端提交数据,后者用户服务器返回数据。
String encvalue = new String(value.getBytes("ISO8859-1"),"UTF-8");
5.如果是post传入,则无需上面的代码,如果是get传入,则比较麻烦,因为url的编码未定。方法有2种,一种为在程序上修改。以上为tomcat,url编码是ISO8859-1,转成UTF-8。另一种方法为修改tomcat配置件,在此不做详解。
SqlServer抓取sql语句方法
方法1:SqlServer在运行场景后抓取消耗时间和资源较多的sql语句(备注:每次执行场景前续清空数据库缓存):
(1)先清除缓存:dbcc freeProcCache
(2)SELECT DB_ID(DB.dbid) '数据库名'
, OBJECT_ID(db.objectid) '对象'
, QS.creation_time '编译计划的时间'
, QS.last_execution_time '上次执行计划的时间'
, QS.execution_count '执行的次数'
, QS.total_elapsed_time / 1000 '占用的总时间(毫秒)'
, QS.total_physical_reads '物理读取总次数'
, QS.total_worker_time / 1000 'CPU 时间总量(毫秒)'
, QS.total_logical_writes '逻辑写入总次数'
, QS.total_logical_reads N'逻辑读取总次数'
, QS.total_elapsed_time / 1000 N'总花费时间(毫秒)'
, SUBSTRING(ST.text, ( QS.statement_start_offset / 2 ) + 1,
( ( CASE statement_end_offset
WHEN -1 THEN DATALENGTH(st.text)
ELSE QS.statement_end_offset
END - QS.statement_start_offset ) / 2 ) + 1) AS '执行语句'
做了很多项目,很多项目都用到子父窗体之间的传值。。
父窗体传入子窗体都比较简单,而子窗体传入父窗体因为有很多不通道的需求,所以·搞起来有点头大。
先说父窗体传入子窗体:
将父窗体控件上的值传入子窗体的控件上:
Form1为父窗体
Form2为子窗体
Form1 单击按钮打开Form2,Form2关闭的时候把值传到Form1的控件上
代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace WindowsFormsApplication3 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form2 f2 = new Form2(this.textBox1.Text); if (f2.ShowDialog() == DialogResult.OK) { this.textBox1.Text = f2.TextBoxValue; f2.Close(); } } } } Form2的代码: using System; using System.
这个问题一直让我自己写的class类无法再hadoop平台运行,困惑好几天了,看权威指南的进度直接无进展。
解决方法是在 conf/hadoop-env.sh添加hadoop的类路径
# Extra Java CLASSPATH elements. Optional.
# export HADOOP_CLASSPATH=
export HADOOP_CLASSPATH=.
还有用javac编译hadoop平台的java代码要用到好多的hadoop的class类,一直写 javac -classpath ...
很麻烦,可以在 ~/.bashrc 中添加如下语句:
export CLASSPATH="$CLASSPATH:$HADOOP_HOME/hadoop-core-0.20.203.0.jar:$HADOOP_HOME/lib/commons-cli-1.2.jar"
------------------------------------------------------------------------------------
一下转载自:http://blog.163.com/yaoyiyan_3y/blog/static/186083580201223115636805/
第一个问题是:
当启动hadoop时,会报如下错误:
starting namenode, logging to /home/june/hadoop-0.21.0/bin/../logs/hadoop-root-namenode-june-bjtu.out
localhost: Error: JAVA_HOME is not set.
localhost: Error: JAVA_HOME is not set.
starting jobtracker, logging to /home/june/hadoop-0.21.0/bin/../logs/hadoop-root-jobtracker-june-bjtu.out
localhost: Error: JAVA_HOME is not set.
解决办法是:
在hadoop-0.21.0/conf/文件夹里有个hadoop-env.sh的文件,它的作用是配置与hadoop运行环境相关的变量,其中有一个变量是JAVA_HOME,将它修改为你安装java的路径。具体操作如下:
vim hadoop-env.sh
# The java implementation to use. Required.
# export JAVA_HOME=/usr/lib/j2sdk1.6-sun
没有implements Serializable,你就不能通过rmi(包括ejb)提供远程调用。 serialization 允许你将实现了Serializable接口的对象转换为字节序列,这些字节序列可以被完全存储以备以后重新生成原来的对象。 serialization不但可以在本机做,而且可以经由网络操作(就是猫小说的RMI)。这个好处是很大的----因为它自动屏蔽了操作系统的差异,字节顺序等。比如,在Window平台生成一个对象并序列化之,然后通过网络传到一台Unix机器上,然后可以在这台Unix机器上正确地重构这个对象。 Object serialization主要用来支持2种主要的特性: 1。Java的RMI(remote method invocation).RMI允许象在本机上一样操作远程机器上的对象。当发送消息给远程对象时,就需要用到serializaiton机制来发送参数和接收返回直。 2。Java的JavaBeans. Bean的状态信息通常是在设计时配置的。Bean的状态信息必须被存起来,以便当程序运行时能恢复这些状态信息。这也需要serializaiton机制。 总之如果在网络的环境下做类传输,应该还是implements Serializable。
例子:
import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; import java.net.ServerSocket; import java.net.Socket;
//定义序列化(object)
class Student implements Serializable { private int sno; private String sname; public Student(int sno, String sname) { this.sno = sno; this.sname = sname; } public int getSno() { return sno; } public void setSno(int sno) { this.sno = sno; } public String getSname() { return sname; } public void setSname(String sname) { this.
在Silverlight没有像HTML中的table标签,如果我们想创建一个类似表格的界面或者说想创建一个类似Excel表格,那该如何创建呢,对于一般的可以使用DataGrid控件实现表格的显示,但是如果出现跨行跨列需要合并的表格,那DataGrid就无法实现了。接下来,我就介绍,如何使用Grid控件实现这样的功能。
首先,对于Gird布局控件,我们知道它有行和列的属性,以及可以在每行每列的单元格中放入控件。首先我们需要知道我们创建的表格有多少行或多少列,然后我们在动态创建行和列。 /// <summary> /// 创建Grid,实现表格的主体 /// </summary> protected void CreateGrid(int rows,int columns) { grid = new Grid() { Background = null, HorizontalAlignment = HorizontalAlignment.Stretch, VerticalAlignment = VerticalAlignment.Top, Margin = new Thickness(10, 0, 10, 0) }; for (int i = 0; i < rows; i++) { RowDefinition row = CreateRow(); grid.RowDefinitions.Add(row); } for (int i = 0; i < columns; i++) { ColumnDefinition column = CreateColumn(); grid.ColumnDefinitions.Add(column); } } 自定义创建行和列的方法:CreateRow()和CreateColumn():
引言 一谈到“遥感”,我们总觉得是如同火箭、导弹之类的高科技,似乎与我们距离很遥远,随着科技的发展,遥感的应用已经慢慢与我们的生活更近了,就像2000年前很多人还是电脑盲,现在已经非常普及了,所以我们也应该了解一些遥感的知识,以便与时俱进。比如,现在我们现在用到的百度地图、导航地图是遥感的二维影像的软件应用,Google earth是遥感的三维影像软件应用。再如,我们以前使用的地图(如中国分省、市区的地图),是考人工测绘制作出来的,随着时间变化,各个建筑地标、路线等都发生了很大变化,地图也不够准确了,人工测绘成本很大,地图的更新往往几年、几十年才更新一次,跟不上日益发展变化的趋势,而利用卫星遥感生成的地图,可以16天就可以生成一个最新的世界、中国各个行政区的地图。
遥感基本知识 遥感技术是指利用飞机、飞艇、飞船、卫星等航空器对地球表面所有物体进行探测感知,以取得目标物体的几何特性(空间信息)、物理特性(颜色、状态等信息)的一门先进技术。基本原理是利用地物对电磁波的反射和辐射特性,通过接收电磁波的反射和辐射信息获取地物的特性,包含一种反推反演的过程。可以应用于国土资源、气象、林业、矿产、农业、水文、海洋、考古、地震等领域。随着科技的发展进步,遥感技术越来越成熟了。其中航空遥感(利用航空飞行器)、卫星遥感(利用卫星)的区别如下:航空遥感机动灵活,针对性强;卫星遥感能够短时间内对大范围的地面情况整体性了解,但不够详细。比如,近期的雅安地震,可以通过卫星遥感数据获取地面整体范围的灾情,针对严重灾情的地方,派遣飞机去实地探测更详细的灾情,整体与局部结合,以便充分了解灾情,为抢险救灾工作提供有用的决策信息。这是我们接触到的比较贴近的遥感应用。
遥感卫星应用 我国发射了许多卫星,其中应用于遥感领域的遥感小卫星,如北京1号、北京2号、实践9号等,我国有专门机构“国家遥感中心”统一管理遥感领域的资源及应用。遥感卫星有专门的地面接收站,负责卫星信息的接收与处理,还有相关的研发中心,负责信息的解译与分析(有些敏感信息、国家机密是需要被过滤掉的),生成遥感的各种数据,为各种遥感应用提供支持。遥感小卫星运行在距离地球900km以上,能够探测到地球3万多平方公里的范围,16天就能够拍摄覆盖地球全部范围。小卫星上面安装有各种传感器,可见光、红外线、紫外线、微波等探测,利用物体发射或辐射的电磁波来识别物体的各种特征。
遥感应用由支持军事、政府等领域,逐渐发展到支持农业、林业、矿业、环境等领域,慢慢会普及到民用、商用领域。遥感信息的服务产业化,是遥感技术科学发展的必然趋势,我国的“十二五”863计划提出的课题中包含综合定量遥感产品服务及运营,说明了国家对遥感应用的政策导向。