如何批量去除EXCEL单元格中的空格字符?

http://zhidao.baidu.com/question/16594150 用查找替换即可,查找内容处输入一个空格,替换为那个地方什么都不填,然后选择全部替换即可。有时可能还有空格,那个空格可能是全角空格,再替换一次全角空格就可以。

索引失效造成的ORA-01502

ORA-01502: 索引'TSTUSER.IDXT'或这类索引的分区处于不可用状态 这个错误是由于索引失效造成的,重建索引后,问题就解决了。 为了搞清楚索引为什么会失效,以及如何解决,做个测试: MOVE 表后会引启索引失效,会出现此问题。 SQL> drop table t; 表已删除。 SQL> create table t(a number); 表已创建。 SQL> select tablespace_name from user_segments where segment_name='T'; TABLESPACE_NAME ------------------------------------------------------------ USED_TEST 创建一个普通索引 SQL> create index idxt on t(a); 索引已创建。 SQL> insert into t values(10); 已创建 1 行。 SQL> set linesize 200 SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDXT'; INDEX_NAME INDEX_TY TABLESPACE_NAME TABLE_TYPE STATUS --------------- -------- ------------------------------------------------------------ --------------- ---------------- IDXT NORMAL USED_TEST TABLE VALID 模拟索引是失效的情况: SQL> alter table t move tablespace tools 2 ; 表已更改。 SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where index_name='IDXT'; INDEX_NAME INDEX_TY TABLESPACE_NAME TABLE_TYPE STATUS --------------- -------- ------------------------------------------------------------ --------------- --------------- IDXT NORMAL USED_TEST TABLE UNUSABLE SQL> select * from t; A ---------- 10 SQL> insert into t values(11); insert into t values(11) * 第 1 行出现错误: ORA-01502: 索引'TSTUSER.

PHP-chr函数 对应的AscII码

ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)、chr(... chr(9) tab空格 chr(10) 换行 chr(13) 回车 Chr(13)&chr(10) 回车换行 chr(32) 空格符 chr(34) 双引号 chr(39) 单引号 chr(33) ! chr(34) " chr(35) # chr(36) $ chr(37) % chr(38) & chr(39) ' chr(40) ( chr(41) ) chr(42) * chr(43) + chr(44) , chr(45) - chr(46) . chr(47) / Chr(48) 0 Chr(49) 1 Chr(50) 2 Chr(51) 3 Chr(52) 4 Chr(53) 5 Chr(54) 6 Chr(55) 7 Chr(56) 8 Chr(57) 9 chr(58) chr(59) ; chr(60) < chr(61) = chr(62) > chr(63) ?

AJAX的刷新和前进后退问题解决

使用AJAX开发分页功能的时候,用户跳转到第5页,但是刷新以后又显示第一页了,能不能刷新后还显示第5页?还有能不能用浏览器的前进后退按钮来浏览AJAX历次的变化。 因为Javascript对dom的操作是不持久化的,刷新后就恢复原状,而且也不保存历史记录,也就无法前进后退来查看历史了。但是可以采用“地址栏加hash”技术来解决。 地址栏中敲入“页面地址#aaa”就表示跳转到“页面地址 ”的“aaa”这个页内锚点(英文叫做hash)。只要改变“aaa”这个锚点内容,浏览器就认为URL变化,也就会放入浏览历史,这样前进后退问题就解决了。我们只要把不同的AJAX状态通过不同的hash写到地址栏就可以了,当页面加载的时候检测是否有hash值,有的话就读取hash进行相应的ajax还原操作。 location.hash可以取到或者设置hash的值,当hash改变的时候window.onhashchange事件会被触发,但是页面加载的时候哪怕有hash值,onhashchange事件也不会触发,因此需要在onload事件中也读取hash进行同样的处理,保证刷新页面也能恢复ajax的页面显示。 下面是例子代码,为了简单的突出问题,这里没有使用ajax,只是通过dom来修改页面状态。点击文本框,文本框的内容会加1(注意观察地址栏),刷新页面后值也还是增加后的值,而且页面可以前进后退。 代码如下: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <script src="jquery-1.4.1.js"></script> <script type="text/javascript"> var processHash = function () { var hashStr = location.hash.replace("#", ""); if (hashStr) $("#txt1").val(hashStr); } $(function () { $("#txt1").click(function () { var i = parseInt($("#txt1").val()); i++; $("#txt1").text(i); location.hash = "#" + i; }); window.onload = processHash; window.onhashchange = processHash; }); </script> </head> <body> <input type="text" id="txt1" value="1" /> </body> </html>

html <a>去掉下划线

//所有情况都没有下划线 a { text-decoration: none;} //在正常显示下没有,但访问后会出现 a:link{ text-decoration: none;}

DirectX

DirectX(全称:Direct eXtension,简称DX)是由微软公司创建的多媒体编程接口。由C++编程语言实现,遵循COM。其API包含DirectX Graphics、DirectPlay、DirectSound、DirectInput、DirectSetup等部分(Direct3D 与DirectDraw已集成成DirectX Graphics)、DirectMusic、DirectPlay。被广泛使用于Microsoft Windows、Microsoft Xbox和Microsoft Xbox 360电子游戏开发,并且只能支持这些平台。目前最新版本为DirectX 11,创建在最新的Windows 7及Windows Vista操作系统之上。 DirectX 6之前,在Windows 3.1至Windows 98SE之间,曾有WinGAPI的出现。而DirectShow亦已自原本的DirectX SDK中移到Windows平台SDK了。Redist Package是媒体开发底层API,通过它可以开发游戏和其它多媒体应用程序。 组件 DirectX组成的组件有: DirectX Graphics,包含二组APIs(DirectX 8.0 onwards): DirectDraw:用于绘制2D Graphics(en:raster graphics)(不建议使用,虽然目前仍有大量的用户)现开始被Direct2D取代。Direct3D(简称D3D):用于绘制3D图形(3D graphics) DirectInput:用于结合键盘、鼠标、摇杆,或其它的游戏控制器(Not updated since 8 except for XInput,专门提供给Xbox360的控制器。并建议以WM INPUT取代键盘与鼠标。)DirectPlay:用于网络游戏连接沟通(配合DirectInput使用,上次的更新版本是version 8.目前已不建议使用)DirectSound:用于录音,并且记录波形音效(waveform sound) DirectSound3D(简称DS3D):用于3D音效(3D sounds)的录音。 DirectMusic:用于DirectMusic Producer的录音。DirectX Media:包含DirectAnimation可用于2D的网页动画(web animation),DirectShow可支持多媒体录音(multimedia playback)以及数据流媒体(en:streaming media),DirectX在网页上的转换,还有Direct3D可保留3D graphics更清晰的解析。DirectShow亦包含有en:DirectX plugins用于en:audio signal processing以及DirectX Video Acceleration加速影音音效(video playback)。DirectX Media Objects:支持数据流对象(streaming objects),像是编码(encoders)、解码(decoder)以及效果(effects)。DirectSetup:用于DirectX组件的安装,并非完全是API。DirectCompute:通用计算API。Direct2D:为DirectDraw的替代者,主要提供2D 动画的硬件加速(浏览器内) (只支持于Windows Vista/7以上)。现使用于Internet Explorer 9及Mozilla FireFox 4DirectWrite:主要字体显示API,提供使用GPU令字体显示更为平滑,类似CleanType(只支持于Windows Vista/7以上) 历史 1994年末,微软即将推出新一代操作系统Windows 95。决定新操作系统的最终价值的因素在于究竟新系统能运行哪些程序。微软的三个员工:Craig Eisler、Alex St. John、Eric Engstrom十分关心这个问题,因为不少游戏程序员更喜欢在DOS系统下编写游戏,这意味着,没有多少人愿意为WIN95编写游戏,新操作系统不会获得多少成功。

关于DM、PQ和PM不得不说的事

2010-11-21 18:32 提起PQ,就算没用过的也应该听过,PowerQuest PartitionMagic是它的全名,容易混淆的词还有个Norton PartitionMagic。 在网上流传着一些说法,有些不求甚解,有的不懂装懂,我个人听过一些错误说法,比如说PowerQuest PartitionMagic和Norton PartitionMagic是分区工具中不同的两款软件,但一个是PowerQuest自己出的,一个是Norton自己出的。 网络上谬误一大堆,面对此种情况,我更觉得有查实的必要了。 Norton是Symantec(赛门铁克公司)出的一项服务体系,其中包括杀毒(Norton杀毒软件,注意不是诺顿)、数据备份(有名的ghost)、硬盘管理(Norton PartitionMagic),但是Norton PartitionMagic并不是赛门铁克公司自己研发的,而是于2003 年12 月收购了PowerQuest 公司而获得的。(详细证明请点击)。 PowerQuest PartitionMagic是PowerQuest 公司自己研发的,所以名字是PowerQuest PartitionMagic(简称PQ),后来公司被Symantec公司收购,Symantec公司就把PowerQuest PartitionMagic整合到自己的Norton体系中。改名叫Norton PartitionMagic。后来人们沿用简称,还是称Norton PartitionMagic为“PQ ”,这是叫法上的一种谬误,因为Norton PartitionMagic中丝毫没有Q这个字母。 Norton PartitionMagic最新版本是 8.05 (Build 1371) 2004-5-5,也就是说,至今6年多一直未更新。 而我所得到的一个 PowerQuest PartitionMagic显示版本是8.0 (Build 1242) 2002-9-16。 这一年半期间具体出版本的情况不详,但是可以肯定Norton 自从2003 年12 月收购PowerQuest 到2004-5-5的最新8.05版之间几乎没有更新,只是象征性地出了一两个版本。 因此单就8.0版本而言,就有两个名称,其中因为同是8.0版,界面基本一样,所以很容易混淆。用户基本不需要区分。 PowerQuest PartitionMagic和Norton PartitionMagic重大区别 对于PowerQuest PartitionMagic和Norton PartitionMagic而言,界面几乎一样,但两者有个很大的不同,个人特别对8.05 (Build 1371) 2004-5-5和PowerQuest PartitionMagic 8.0 (Build 1242) 2002-9-16两个版本进行测试,发现: PowerQuest PartitionMagic版本分区操作之后进行“应用”,就会提示重启,重启后windows界面蓝屏,显示正在分区的英文提示。分区结束后,进入windows。需要重启,重启执行bat文件进行分区。 Norton PartitionMagic版本执行“应用”后,会马上有执行进度条,执行完毕,打开资源管理器,就看到分区已经分好了,不需要重启。 不重启比重启的好处是:重启过程会出现不可预测的物理因素(断电,强制重启等等),会造成数据的丢失。 由于我自己曾经因为不熟悉,使用了PowerQuest PartitionMagic,出现重启的蓝屏后害怕造成硬盘损坏,强制重启电脑,最后造成数据丢失遗憾,现在想想痛恨自己当初的无知。 早听过说PQ可以不需要重启就分区,而实际山,不是所有的8.0版本的都不需要重启,对于中终极版本8.05的Norton PartitionMagic是可以的,但有的需要重启。所以在此敬告各位读者:请慎重选择PQ版本,这也是笔者在此不厌其烦纠正PQ的各种谬称的原因,我个人也是深受其害。请选择Norton PartitionMagic版本(点击下载)。 关于PM 由于PowerQuest PartitionMagic和Norton PartitionMagic容易混淆,所以后有人干脆为了统一,将两个称为PM,取自后半部分PartitionMagic。但是发现公司Paragon也有了一款分区软件叫Paragon Partition Manager ,也可以叫成PM。而事实上,PM只是分区软件的统称,根源自英文 Partition Manager。

Silverlight应用

参考资料《银光志》《silverlight之美》 silverlight给我最直接震撼就是User Experience和out of browser. 用户体验也分等级的,比如你看看黑白电影的体验,彩色电影的体验,3D电影的体验,3DMax体验。毫无疑问Silverlight属于3DMax体验 下面是我在网上找的例子大家可以身临其境的感受一下 腾讯Silverlight QQ: slqq.qq.com/ 微软Silverlight数码学校宿舍: www.microsoft.com/student/en-US/digitaldorm/def... 微软SQL Server团队计算工具——SQL Server Value Tool: www.microsoft.com/sqlserver/2008/en/us/value-ca... 微软在线医疗解决方案 http://pjd.mscui.net/default.htm 新浪财经Silverlight版: vip.stock.finance.sina.com.cn/silverpulse/ 国外的Silverlight航空订票系统: www.preiskombirechner.ch/Preis_Kombi_Rechner.eb... Silverlight版商业CRM系统: labs.cas.de/silverlight/CASCRMSL3/ 台湾旅游网站,以皮夹式的书签作为交互方式: eservice2.evaair.com/EABcsPage.aspx 那这些体验是怎么出来的这依靠Silverlight强大的体验又是 转载于:https://www.cnblogs.com/sunxi/archive/2012/09/18/2691193.html

一个简单的加载模块弹出ProgressBar 加载进度条

效果图: import mx.managers.PopUpManager; import mx.modules.IModuleInfo; import mx.modules.Module; import mx.modules.ModuleLoader; import mx.modules.ModuleManager; import mx.controls.ProgressBar; import mx.events.FlexEvent; private var myProgressBar:ProgressBar; private var _group:Group; private var m1:ModuleLoader; private function init():void{ inits("widgets/Leftbox/Disaster.swf");//模块生成swf的路径。 } private function inits(_url:String):void{ m1 = new ModuleLoader(); m1.url = _url; m1.addEventListener(FlexEvent.LOADING,popUpProgressBar); m1.addEventListener(ModuleEvent.PROGRESS,loading); m1.addEventListener(ModuleEvent.READY,getModule); m1.loadModule(); } private function popUpProgressBar(event:Event):void{ //制作进度条的背景图 _group = new Group(); _group.width = 400; _group.height = 93; var biap:BitmapFill = new BitmapFill(); biap.source = "@Embed('icos/rightbg.png')"; var rect:Rect = new Rect(); rect.

QT SQL链接

1、新建工程: 打开Qt Creator,File -> New File or Project,左边选择 Qt Widget Project,右边选择Qt Gui Application 单击Choose;填写工程名称(这里是1)及选择目录 -> Next -> Next -> Next -> Finish,工程顺利生成并自动回到了主界面,单击一下左边的绿色小三角,就会编译运行这个空白的程序。 2、连接数据库: 要连接数据库,就要手工向工程里面的相关文件添加代码,具体如下: 1.pro:添加一行 QT += sql main.cpp:添加引用 #include <QtGui/QApplication> #include "mainwindow.h" //以下是手工添加的引用 #include <QSqlDatabase> #include <QSqlError> #include <QMessageBox> //这个是手工添加的函数 void OpenDatabase() { QSqlDatabase db=QSqlDatabase::addDatabase("QODBC"); db.setDatabaseName(QString("DRIVER={SQL SERVER};" "SERVER=%1;" //服务器名称 "DATABASE=%2;"//数据库名 "UID=%3;" //登录名 "PWD=%4;" //密码 ).arg("192.168.1.252") .arg("数据库名") .arg("登录名") .arg("密码") ); if (!db.open()) { QMessageBox::critical(0, qApp->tr("Cannot open database"), db.lastError().databaseText(), QMessageBox::Cancel); } } int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.

亚洲文字编码范围

双字节字符编码范围: 1. GBK (GB2312/GB18030) \x00-\xff GBK双字节编码范围 \x20-\x7f ASCII \xa1-\xff 中文gb2312 \x80-\xff 中文 gbk 2. UTF-8 (Unicode) \u4e00-\u9fa5 (中文) \x3130-\x318F (韩文) \xAC00-\xD7A3 (韩文) \u0800-\u4e00 (日文) http://rnd-oj/exam/HomePage http://3ms.******.com/iPage/homepage/homepage.do?method=showHomepage&language=cn

简易数据库

use Text --Text为数据库 go create table student_table( --student_table为表 id_num int identity(1,1), num nvarchar(20), use_name nvarchar(20), constraint pk_student primary key clustered ( id_num ASC --id_num为主键升序 ) )

Windows Server 2008(WINDOWS 7) 自动登录

不少用户由于某种需要要求 Windows Server 2008(WINDOWS 7) 自动登录,作如下设置即可实现: 1、单击Windows 的“开始”按钮, 输入 cmd,窗口上方出现 “cmd.exe”程序图标,在图标上单击鼠标右键,选择“以管理员身份运行”,系统弹出DOS命令窗口。 2、在命令窗口输入 control userpasswords2 ,系统弹出“用户账户”管理窗口,取消勾选“要使用本机,用户必须输入用户名和密码”,单击应用,此时系统弹出“自动登 录”窗口,在此指定自动登录的用户及其相应的用户名即可(注意,此用户必须是存在的,否则自动登录失败)。 原文:http://blog.csdn.net/hiyavip/article/details/6902552

fso OpenTextFile 方法

OpenTextFile 方法 语法:object.OpenTextFile(filename[, iomode[, create[, format]]]) 作用:打开一个指定的文件并返回一个 TextStream 对象,该对象可用于对文件进行读、写、追加操作。 说明: ·iomode 参数可为下面设置值中的任何值: ForReading 1 打开一个只读文件,不能对此文件进行写操作。 ForWriting 2 打开一个用于写操作的文件。如果和此文件同名的文件已存在,则覆盖以前内容。 ForAppending 8 打开一个文件并写到文件的尾部。 注意:在VBA帮助里是没有ForWriting的,其实是有的,VBA帮助也是有错误的。另外,这些常数在使用前要先声明,或者直接用数值。 ·create 可选的,它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件,其值为 True。若不创建文件其值为 False。缺省值为 False。 ·Format 参数可为下面设置值中的任何值: TristateUseDefault –2 使用系统缺省打开文件。 TristateTrue –1 以 Unicode 格式打开文件。 TristateFalse 0 以 ASCII 格式打开文件。 示例: Dim f Set f = fso.OpenTextFile("c:\testfile.txt", 2, True) 或者: Const ForWriting = 2 Set f = fso.OpenTextFile("c:\testfile.txt", ForWriting, True) 这两者功能是一样的,一个声明了常量,一个直接用数值。都是在C盘创建文件testfile.txt(如不存在),或以写的方式打开(如存在)。

简单的比较C语言下交换a,b数值的代码效率

以下几个语句都能交换a,b的值 1) a^=b^=a^=b; 2) temp = a; a = b; b = temp; 3) a = a^b; b = a^b; a = a^b; 效率为2) > 3) > 1) 验证代码如下:(linux下GCC和win下codeblocks通过编译) #include <stdio.h> #include <sys/time.h> #include <unistd.h> void speed_1() { long i = 100000000; while(i){ int a = 10; int b = 20; a^=b^=a^=b; i--; } } void speed_2() { long i = 100000000; int temp = 0; while(i){ int a = 10; int b = 20; temp = a; a = b; b = temp; i--; } } void speed_3() { long i = 100000000; while(i) { int a = 10; int b = 20; a = a^b; b = a^b; a = a^b; i--; } } int main(void) { struct timeval start; struct timeval end; unsigned long diff_1; //此处的1,2,3数字代表的代码与上面所列一致 unsigned long diff_2; unsigned long diff_3; gettimeofday(&start, NULL); //gettimeofday()是C语言获得精确时间函数 speed_1(); gettimeofday(&end, NULL); diff_1 = 1000000 * (end.

使用Loadrunner进行文件的上传和下载

最近使用loadrunner中需要录制文件的上传和下载,上传功能模块利用录制可以直接实现,下载无法实现,在网上找到了一段代码,自己动手试验了下,发现没有用 辛苦找到的,还是记录下吧 (1)LoadRunner上传文件 web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Referer=https://testserver/console/displayStudentList.do", "Snapshot=t12.inf", "Mode=HTTP", ITEMDATA, "Name=uploadFile", "Value=D://Excel//data161955.zip", "File=yes", ENDITEM, LAST); 注:脚本录制使用Http/Html协议或Click and Script协议均可,以上是使用Http/Html录制的的脚本。需要特别注意的是,无论使用哪种协议录制,待上传的文件路径及文件名称只能为英文字符,而不能为中文字符。否则,可能将文件上传的二进制流同时录制到LR的脚本中。 这个问题同时也说明,LR对中文的支持还远不够。 下面是该应用更详细的示例。 Action() { //定义double类型的变量trans_time,用来保存事务的执行时间。 double trans_time; //定义int类型的变量status,用来保存事务执行的返回的值。 int status; lr_start_transaction("测试"); //使用内置函数lr_get_transaction_duration获取事务的执行时间。 trans_time=lr_get_transaction_duration("测试"); status= web_submit_data("importStudent.do", "Action=https://testserver/console/importStudent.do", "Method=POST", "EncType=multipart/form-data", "RecContentType=text/html", "Referer=https://testserver/console/displayStudentList.do", "Snapshot=t12.inf", "Mode=HTTP", ITEMDATA, "Name=uploadFile", "Value=E://datafile//data01.zip", "File=yes", ENDITEM, LAST); //增加手工事务,如果该测试事务执行返回值为0,则事务执行成功,否则执行失败。 if (status == 0) lr_end_transaction("测试", LR_PASS); else lr_end_transaction("测试", LR_FAIL); //打印事务执行时间。 if (trans_time) lr_output_message("事务执行时间为:%f 秒",trans_time); else lr_output_message("事务执行时间未知!"); return 0; } 以下是LR的帮助文档中的web_submit_data函数的一个应用示例,从该示例中也可见一斑。

电脑玩游戏花屏怎么办,显卡花屏解决方法

1、接触不良问题 (1)显卡与主板PCI-E接口接触不良,导致花屏。 解决方法:关机拔插显卡,清理显卡的金手指和PCI-E插槽的灰尘和异物。 (2)显示线与显示接口接触不良导致花屏,显示器信号线问题造成偏色,请更换信号线。信号线与VGA或DVI接口接触不良引起花屏,请重新连接并将接头上的螺丝拧紧。 2、驱动问题: 显卡驱动安装不完整或驱动本身不稳定都会导致花屏。 解决方法:请依次进入开始->设置->控制面板->添加/删除程序,卸载Nvidia Drivers(部分驱动包含Nvidia PhysX驱动,重新安装或更换其他版本的驱动(推荐安装一些通过WHQL认证的驱动,如178.24等等)。 3、电源问题: 电源功率不足或电源品质不良导致花屏。 解决方法:检查系统是否已满足显卡的功耗要求: (1)对于9500系列,单卡设计功率为50W,建议电源额定功率250W,推荐300或更高。 (2)对于9600系列,单卡设计功率为90W,建议电源额定功率300W,推荐350或更高。 (3)对于9800GT系列,单卡设计功率为105W,建议电源额定功率350W,推荐400或更高。 (4)对于9800GTX+/GTS250系列,单卡设计功率为145W,建议电源额定功率400W,推荐450W或更高。 (5)对于GTX260系列,单卡设计功率为223,建议电源额定功率460W,推荐500或更高。 (6)对于GTX275系列,单卡设计功率为235W,建议电源额定功率500W,推荐550或更高。 (7)对于GTX285系列,单卡设计功率为254W,建议电源额定功率550W,推荐600W或更高。 建议尽量使用一些品质优良的品牌电源,以保证系统供电稳定性。 4、超频不稳定: 对显卡、CPU、内存进行超频后导致花屏。 解决方法:(1)进入主板BIOS设置程序,恢复BIOS默认设置或将CPU和内存恢复为默认值。 (2)检查显卡是否已超频使用,请恢复为出厂默认频率。 5、显卡温度过高: 显卡或显存温度过高,导致花屏。一般显卡温度过高可能因风扇有灰尘等异物干涉使风扇转速变慢或停转引起。 解决方法: 使用软件(如Xtreme Tuner、ATI tool、RivaTuner等)或其它设备(如红外温度探测仪)检测或显存温度(部分3D游戏,将游戏特效全部打开或性能设置过高,GPU温度达到95 ℃左右都算正常)。 检查风扇是否灰尘过多造成风扇转速慢或停转,建议定期清理风扇和PCB表面的灰尘。 6、系统或软件兼容问题: 系统或软件问题,导致花屏。 解决方法: 建议不要使用Ghost版系统,重新安装Windows原版系统和显卡驱动。安装系统补丁,更新显卡驱动。 7、游戏程序问题: 解决方法: 重新安装游戏。建议从游戏官方网下载最新的游戏客户端安装并安装游戏补丁,更新显卡驱动。如果仍有问题,建议更换平台测试或将卡送当地经销商处检测。 8、主板与显卡的兼容性问题 显卡与主板不兼容导致花屏。 解决方法: 有条件可更换同型号显卡或其他厂商同型号显卡检查。如果仍然出现问题,请联系主板厂商协助解决。

数据库设计经验谈(2)设计表和字段

上一部分介绍了设计数据库之前12个基本技巧,包括命名规范和明确业务需求等( 数据库设计经验谈[1])。本次第二部分介绍设计数据库表24个指南性技巧,涵盖表内字段设计以及应该避免的常见问题等。 第 2 部分 - 设计表和字段 检查各种变化 我在设计数据库的时候会考虑到哪些数据字段将来可能会发生变更。比方说,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,我倾向于在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。 采用有意义的字段名 有一回我参加开发过一个项目,其中有从其他程序员那里继承的程序,那个程序员喜欢用屏幕上显示数据指示用语命名字段,这也不赖,但不幸的是,她还喜欢用一些奇怪的命名法,其命名采用了匈牙利命名和控制序号的组合形式,比如 cbo1、txt2、txt2_b 等等。 除非你在使用只面向你的缩写字段名的系统,否则请尽可能地把字段描述的清楚些。当然,也别做过头了,比如 Customer_Shipping_Address_Street_Line_1,虽然很富有说明性,但没人愿意键入这么长的名字,具体尺度就在你的把握中。 采用前缀命名 如果多个表里有好多同一类型的字段(比如 FirstName),你不妨用特定表的前缀(比如 CusLastName)来帮助你标识字段。 时效性数据应包括“最近更新日期/时间”字段。时间标记对查找数据问题的原因、按日期重新处理/重载数据和清除旧数据特别有用。 标准化和数据驱动 数据的标准化不仅方便了自己而且也方便了其他人。比方说,假如你的用户界面要访问外部数据源(文件、XML 文档、其他数据库等),你不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。预先安排总需要付出努力,但如果这些过程采用数据驱动而非硬编码的方式,那么策略变更和维护都会方便得多。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。 标准化不能过头 对那些不熟悉标准化一词(normalization)的人而言,标准化可以保证表内的字段都是最基础的要素,而这一措施有助于消除数据库中的数据冗余。标准化有好几种形式,但 Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方面达到了最好平衡。简单来说,3NF 规定: * 表内的每一个值都只能被表达一次。 * 表内的每一行都应该被唯一的标识(有唯一键)。 * 表内不应该存储依赖于其他键的非键信息。 遵守 3NF 标准的数据库具有以下特点:有一组表专门存放通过键连接起来的关联数据。比方说,某个存放客户及其有关定单的 3NF 数据库就可能有两个表:Customer 和 Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向 Customer 表里包含该客户信息的那一行。 更高层次的标准化也有,但更标准是否就一定更好呢?答案是不一定。事实上,对某些项目来说,甚至就连 3NF 都可能给数据库引入太高的复杂性。 为了效率的缘故,对表不进行标准化有时也是必要的,这样的例子很多。曾经有个开发餐饮分析软件的活就是用非标准化表把查询时间从平均 40 秒降低到了两秒左右。虽然我不得不这么做,但我绝不把数据表的非标准化当作当然的设计理念。而具体的操作不过是一种派生。所以如果表出了问题重新产生非标准化的表是完全可能的。 Microsoft Visual FoxPro 报表技巧 如果你正在使用 Microsoft Visual FoxPro,你可以用对用户友好的字段名来代替编号的名称:比如用 Customer Name 代替 txtCNaM。这样,当你用向导程序 [Wizards,台湾人称为‘精灵’] 创建表单和报表时,其名字会让那些不是程序员的人更容易阅读。 不活跃或者不采用的指示符 增加一个字段表示所在记录是否在业务中不再活跃挺有用的。不管是客户、员工还是其他什么人,这样做都能有助于再运行查询的时候过滤活跃或者不活跃状态。同时还消除了新用户在采用数据时所面临的一些问题,比如,某些记录可能不再为他们所用,再删除的时候可以起到一定的防范作用。 使用角色实体定义属于某类别的列[字段] 在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。

表空间创建格式及属性说明

今天看了很多关于创建表空间的帖子,但是觉得都不全面,所以决定结合自己的开发经验和网上资源总结一下。 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方存放,Oracle会提示:没有存储配额. 因此,在创建对象之前,首先要分配存储空间。 一、创建表空间完整的格式 CREATE [UNDO|TEMPORARY] TABLESPACE tablespace_name DATAFILE 'path/filename' [SIZE INTEGER[K| M]] [REUSE] [AUTOEXTEND [OFF | ON ] ] [NEXT INTEGER[K | M]] [MAXSIZE [UNLIMITED | INTEGER[K | M]]] [MINIMUM EXTENT INTEGER[K | M]] [BLOCKSIZE integer [k]] [DEFAULT STORAGE storage_clause] [ONLINE | OFFLINE] [LOGGING | NOLOGGING] [FORCE LOGGING] [EXTENT MANAGEMENT [DICTIONARY | LOCAL]] [AUTOALLOCATE | UNIFORM [SIZE INTEGER[K | M]]] [SEGMENT SPACE MANAGEMENT [AUTO | MANUAL]] 二、表空间格式说明 1、UNDO 说明系统将创建一个回滚表空间。 在9i中数据库管理员可以不必管理回滚段,只有建立了undo表空间,系统就会自动管理回滚段的分配,回收的工作。当然,也可以创建一般的表空间,在上 面创建回滚段.

LR常见问题整理

首先要感谢群友的无私分享,才能得到这篇好的学习资料,整理得太好了,所以收藏保存,方便以后学习。 一:LoadRunner常见问题整理 1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消掉 2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen.exe文件. 有可能是由于录制的URL地址采用的是localhost的问题,改成分配的IP地址或127.0.0.1试试。 3、插入文本检查点步骤时,使用web_reg_find,通常TextPfx和TextSfx中会包含双引号,需要进行转义(用斜杠),例如: web_reg_find("Search=Body", "SaveCount=Welcome", "TextPfx=欢迎<a class=\"drop\" id=\"viewpro\" onMouseOver=\"showMenu(this.id)\">", "TextSfx=</a>", LAST) 遇到flight界面为空的解决的可能方法: 1、如果安装了IE以外的浏览器,并且IE不是默认浏览器,则无法生成录制脚本 2、如果录制脚本时IE不能打开,则需要将浏览器的IE工具高级选项中,将“启用第三方浏览器扩展”的 勾选去掉 3、lr自带的webtours系统,如果点击Flights选项,出现空白页面,请检查本机oracle的 PERL5LIB环境 2.LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决。 启动浏览器,打开Internet选项对话框,切换到高级标签,去掉“启用第三方浏览器扩展(需要重启动)”的勾选,然后再次运行VuGen即可解决问题 提示:通常安装Firefox等浏览器后,都会勾选上面得选项,导致不能正常录制。因此建议运行LoadRunner得主机上保持一个干净的测试环境。 3.HTML-based script与URL-based script的脚本有什么区别? 使用“HTML-based script”的模式录制脚本,VuGen为用户的每个HTML操作生成单独的步骤,这种脚本看上去比较直观; 使用“URL-based script”模式录制脚本时,VuGen可以捕获所有作为用户操作结果而发送到服务器的HTTP请求,然后为用户的每个请求分别生成对应方法。 通常,基于浏览器的Web应用会使用“HTML-based script”模式来录制脚本;而没有基于浏览器的Web应用、Web应用中包含了与服务器进行交互的Java Applet、基于浏览器的应用中包含了向服务器进行通信的JavaScript/VBScript代码、基于浏览器的应用中使用了HTTPS安全协议,这时使用“URL-based script”模式进行录制。 4.运行时的Pacing设置主要影响什么? Pacing主要用来设置重复迭代脚本的间隔时间。共有三种方法:A:上次迭代结束后立刻开始、 B:上次迭代结束后等待固定时间、C:按固定或随机的时间间隔开始执行新的迭代。 根据实际需要设置迭代即可。通常,没有时间间隔会产生更大的压力。 5.运行时设置Log标签中,如果没有勾选“Enable logging”,则手工消息可以发送吗? Enable logging选项仅影响自动日志记录和通过lr_log_message发送的消息。即使没有勾选,虚拟用户脚本中如果使用lr_message、lr_output_message、lr_error_message,仍然会记录其发出的消息。 6.VuGen支持Netscape的客户证书吗? 不支持。目前的VuGen 8.0版本中仅支持Internet Explorer的客户端证书。录制脚本时可以先从Netscape中导出所需的证书,然后将其导入到Internet Explorer中,并确保以相同的顺序导出和导入这些证书。而且,在每台将要录制或运行需要证书的Web Vuser脚本的计算机上都要重复执行前面的过程。 7.VuGen会修改录制浏览器中的代理服务器设置吗? 会修改。在开始录制基于浏览器的Web Vuser脚本时,VuGen首先会启动指定的浏览器。然后,VuGen会指示浏览器访问VuGen代理服务器。为此,VuGen会修改录制浏览器上的代理服务器设置。默认情况下,VuGen会立即将代理服务器设置更改为Localhost:7777。录制之后,VuGen会将原始代理服务器设置还原到该录制浏览器中。因此,在VuGen进行录制的过程中,不可以更改代理服务器设置,否则将无法正常进行。 8.在LoadRunner脚本如何输出当前系统时间? LoadRunner提供了char *ctime(const time_t *time)函数,调用参数为一个Long型的整数指针,用于存放返回时间的数值表示。 调用语句与返回值如下示例: typedef long time_t; Action() { time_t t; lr_message(“Time in seconds since 1/1/70: %ld\n”,time(&t));

剪不断,理不乱——数据库中主外键的关系

在做机房收费系统时,考虑到了主外键,所以学习了一下,下面我们一起来探究一下它们的关系。 主键Primary key,唯一标示一个实体。是保证数据库的实体完整性,保证数据中数据的正确性和合理性,取值非空唯一。 外键Foreign,是用来使表与表之间联系。用来保证数据库的参照完整性,外键的取值必须来自参照表参照列的值,可以为空也可不为空。 外键的作用: 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据。 使两张表形成关联,外键只能引用外表中的列的值! 主外键的关系结构: 1,一对一,不用引用主外键,把它们放一个表中即可 例如:一个学生只能有一个卡号,那么学生跟卡号放在一个表中即可 2,一对多,引用主外键,‘一’相当于主键,‘多’即是引用主键的外键。 例如:一个班级可以有多个学生,并且一个学生只能属于一个班级,这就是一对多的关系; 3,多对多关系,需要创建一个表,表中需要两个字段,分别是引用,两个多对多字段主键的外键。 例如: 学生表(学号,姓名,…………)主键:学号 课程表(课程号,课程名,…………)主键:课程号 一个学生能选多门课,一个课可以由多个学生选,即是多对多关系, 那么成绩表就是它们之间关系的体, 即引用成绩表(学号,课程号,成绩)。这里学号和课程号,分别是学生表和课程表中学号和课程号的外键 在我们现在这个阶段中,主要还是使用,主外键间的一对多的关系 下面一起来简单看一下大概建成的表结构 --建班级表 create table class( classid int primary key,--定义班级ID为主键 classname varchar(15) ) --建学生表 create table students( studentid int primary key,--定义学生ID为主键 classid int ,--外键值,跟班级表classid 属性类型相同 stuname varchar(20),--学生姓名 ---定义外键 foreign key(classid) references class(classid) --本表classid是基于class表classid的外键 ) 如上定义了主外键后,两个表间的关系就是一对多的关系了,并且学生表内的classid必须依托班级表的classid存在,也就是说外键必须要主键存在的时候才能创建, 例如: --在班级表为空的情况往学生表插入一条记录是不允许的: insert intostudents(studentid,classid,stuname)values(1,1,'小明') 系统会抛出异常提示主键表班级表内班级ID不存在这样是不允许插入的; 必须要先往班级表内插入一条记录: insert into class(classid,classname)values(1,'一班') 后才能执行插入前面一条往学生表插入信息的语句.. 解释: 对于机房收费系统来说,如图: 只有当学生注册了信息,有了卡号,在学生信息表中存在了,才可以进行充值,退卡,上下机等,主外键的作用也就是当没有学生信息时,我们不可以进行充值等操作,而且想要删除学生信息表中的数据,必须先将充值表,退卡表,上下机表中此卡号的人删除之后才可以删除学生信息表中的数据,这样就避免了当学生未注册时,就可以充值的情况 也就是说,如果主键表中数据的更改使之与外键表中数据的链接失效,则这种更改是不能实现的,从而确保了引用完整性。如果试图删除主键表中的行或更改主键值,而该主键值与另一个表的 FOREIGN KEY 约束值相关,则该操作不可实现。若要成功更改或删除 FOREIGN KEY 约束的行,可以先在外键表中删除外键数据或更改外键数据,然后将外键链接到不同的主键数据上去。

如何向Android的framework里添加新类

google对于所有的类和API,分为开放式和不开放式两种。所谓的开放式就是值javadoc所包含的,并不是java中有public和private,而是跟javadoc有关系,代码 没有关系。 在开放式的类中增加了一个变量,而又没隐藏,导致和原API的doc不一致造成的就会有错。 通过提示,有2个方法可以解决 该问题: 1、将新增加的变量或方法加上"@hide" 的注释,注意一点,加"@hide" 不是简简单单的/*@hide */就行了,标准的javadoc要这样 /** */ 而且对于 format 变量 应该加上 { },也就是/**{@hide}*/ 2、如果想在生成的doc中增加该变量或方法的话,必须输入: make update-api 这样的话,系统 自动 将新增加的API添加到current.xml中了。 所以如果要加方法就是按上面的方法加。 如果需要加进新的类 这时候又分2种 一种是原有的包下面加类 这个最简单 加完之后直接make update-api就好了 还有一种是加在framework/base下面 这个时候你make update-api是不会在current。xml里生成你的类的。 看了Android。mk才知道 原来需要修改android源码根目录下的build/core/pathmap.mk把你的目录加进去。然后就好了。

C/C++优秀书籍

《Imperfect C++中文版》 《C++代码设计与重用》 《C和指针》 《C专家编程》 《C陷阱与缺陷》 《C++沉思录》 《C++代码设计与重用》 《Imperfect C++中文版》 《C++面向对象高效编程(第2版)》 《C++实践之路》 《C和C++代码精粹》 《C++编程惯用法——高级程序员常用方法和技巧》 《C++编程风格》 《软件艺匠》

Eclipse中更改默认java代码格式

在写代码时常常有2种代码样式习惯,如下图。由于一直习惯了第一种代码格式,而看第二种代码格式时感觉代码很乱,总找不到“{ }”对称的感觉。Eclipse自动格式化代码的快捷方式是Ctrl+Shift+F ,其默认是第二种样式,下面将通过设置eclipse来达到第一种代码样式。 启动eclipse →window→ preferences → Java→ Code Style → Formatter ,如图 可以选择New新建一个样式然后Edit进行编辑,主要是做如下修改,即把类和方法在声明时进行换行,如图,修改后保存退出即可。 参考博客:http://blog.sina.com.cn/s/blog_4d96ee050100w29e.html

mysql show profiles 使用分析sql 性能

Show profiles是5.0.37之后添加的,要想使用此功能,要确保版本在5.0.37之后。 查看一下我的数据库版本 mysql> Select version(); +---------------------+ | version() | +---------------------+ | 5.0.82-community-nt | +---------------------+ 1 row in set (0.00 sec) 版本是支持show profiles功能的。接下来进入mysql性能跟踪诊断的世界 查看是否打开了profiles功能,默认是关闭的 mysql> use test; Database changed mysql> show profiles; Empty set (0.00 sec) 显示为空,说明profiles功能是关闭的。下面开启 mysql> set profiling=1; Query OK, 0 rows affected (0.00 sec) 执行下面的查询 mysql> explain select distinct player_idfrom task limit 20; mysql> select distinct player_id from task ; 然后执行 show profiles mysql> show profiles;

SQL Server 2000本地系统账户和域用户账户的选择

我们在安装SQL Server 2000数据库的时候,需要对服务进行设置,如下图所示:使用本地系统账户和使用域用户账户,该怎么选择呢?本地系统账户和域用户账户的区别在哪里呢?本文我们主要就介绍这些内容,接下来我们就开始介绍。 我们先看熟悉一下两个相关概念。 什么是凭据? Windows凭据(Credential)其实就是指用户帐户和口令,我们调用一些API,如WTSOpenServer,QueryServiceStatus,NetUserEnum等等涉及到RPC的,只要当前用户存储有目标远程机的权限合适的凭据,则这些API就不会因产生ERROR_ACCESS_DENIED而执行失败。 不好理解么?那么我们来看一下访问别的计算机的情形,加深理解。访问远程计算机必然用到rpc。 上图就是我们连接到IP为172.16.100.1计算时的情形,这个时候是需要我们输入用户帐户与密码的。这里的用户帐户与密码就是所谓的凭据。 当我们输入用户帐户与密码后,并把“记住我的密码”打上勾,点确定。那么我们的凭据(即这个用户帐户与密码)被存储了,以后再访问的时候就无须再输入。 安全上下文 安全上下文(Security context)是指在一个系统中有效的安全属性或规则。 下面我们来看SQLSERVER2000服务的两种登录方式:本地系统帐户和域用户帐户 本地系统帐户: 该帐户是对本地计算机具有管理员权限的预定义本地帐户。在本地系统帐户的安全上下文中运行的服务向远程服务器提供本地计算机的凭据。在本地系统帐户的安全上下文中运行的服务不能建立身份验证会话,因为本地系统帐户不属于域中的Everyone组。因此,使用该帐户的服务只能通过空会话(没有凭据)来访问网络资源。(这个访问指的是为了完成某项任务服务的自动访问,和我们的连接SQL服务器不一概念) 域用户帐户: 使用专用域用户帐户作为登录帐户 域用户帐户是指在Active Directory目录服务中创建的用户帐户。该帐户是域中Authenticated Users组的成员。在域用户帐户的安全上下文中运行的服务向远程服务器提供域用户帐户的 Kerberos 票证。在域用户帐户的安全上下文中运行的服务可以访问经过身份验证的用户或特定用户帐户有权访问的远程服务器上的资源。 使用本地用户帐户作为登录帐户 本地用户帐户是指在本地计算机上创建的Windows用户帐户。在本地用户帐户的安全上下文中运行的服务向远程服务器提供本地用户帐户的访问标记。如果在远程服务器上配置了匹配用户名和密码,则使用本地用户帐户的服务将能够访问同名帐户有权访问的远程服务器上的资源。虽然此方案行之有效,但是维护这些单独的帐户并保持帐户密码同步将增加管理开销。 如果你没有加入域,但又需要连接到网络资源,那么可以使用本地用户帐户作为登录帐户。 由此可见使用域用户帐户可以使用凭据来访问远程计算机,并使用相应的资源。 例如SQLSERVER服务,当它进行以下操作时,是需要访问远程计算机的。 远程过程调用。 复制。 备份到网络驱动器。 涉及远程数据源的异类联接。 SQL Server 代理邮件功能和 SQL 邮件。 在这几种情况下是无法不使用凭证去访问远程计算机,并使用其资源的。所以必须得把登录类型改为“域用户帐户”,并输入在远程计算机上配置好的,存在的“用户名”和“密码”。 如果只是装在本机进行开发或学习,完全没必要使用域用户帐户登录模式,因为有时候因为切换不同用户而导致服务不能启动。 修改SQLSERVER服务的登录类型 服务的登录类型是随时可以改变的。可以需要的时候通过以下两种方法修改SQLSERVER服务的登录类型。 1. 通过企业管理器修改 右击SQLSERVER服务器---“属性”---“安全性”下的“启动服务帐户” 2.通过服务修改 “控制面板”---“服务”----“MSSQLSERVER”,右击---“属性”---“登录” 装SQLSERVER时遇到的一些问题 1.在安装时出现提示"command line option syntax error!type command /? for help" 这是因为你可能把SQLSERVER的安装文件放在了中文目录下,可以你它改为英文目录即可。每一级目录都不能含有中文。 2.出现提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重启计算机" 打开注册表编辑器(或在命令行输入:regedit),在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到PendingFileRenameOperations项目,并删除它。然后进行安装。 关于SQL Server 2000数据库的本地系统账户和域用户账户的知识就介绍到这里了,希望本地的介绍能够给您带来一些收获,谢谢! 出处:http://database.51cto.com/art/201108/280438.htm 

视频和图片的相互转换

原文地址:opencv提取视频每一帧 作者:岳麓迷魂 // // test3.cpp // // 该程序实现视频和图片的相互转换. // Image_to_video()函数将一组图片合成AVI视频文件. // Video_to_image()函数将AVI视频文件读入,将每一帧存储为jpg文件. // #include <stdlib.h> #include <stdio.h> #include <math.h> #include <cv.h> #include <highgui.h> #define NUM_FRAME 300 //只处理前300帧,根据视频帧数可修改 void Video_to_image(char* filename) { printf("------------- video to image ... ----------------n"); //初始化一个视频文件捕捉器 CvCapture* capture = cvCaptureFromAVI(filename); //获取视频信息 cvQueryFrame(capture); int frameH = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT); int frameW = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH); int fps = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FPS); int numFrames = (int) cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_COUNT); printf("tvideo height : %dntvideo width : %dntfps : %dntframe numbers : %dn"

播放器适配经验总结——IOS

IOS平台统一使用HLS协议,包括M3U8文件和分段TS文件 1、抖屏 现象:播放中画面动作抖动,好像画面的顺序错乱 范围:Mp4文件转成TS,没有问题,ASF转成TS文件,有该现象 原因:ASF没有cts_delta字段,TS(PES)中的PTS直接使用DTS,H.264中帧的顺序是DTS顺序,与显示顺序是不同的,B帧会出现在P帧前面,但是在后面显示 方案:自己根据帧率和帧的顺序,计算PTS,或者恢复出cts_delta值 帧率可以通过SPS中获取: frame_rate = sps.vui_parameters.num_units_in_tick.time_scale / sps.vui_parameters.num_units_in_tick 当然前提是 sps.vui_parameters_present_flag && sps.vui_parameters.timing_info_present_flag && sps.vui_parameters.fixed_frame_rate_flag 前提不满足的时候,可以用前后两个帧的dts差来计算: frame_rate = time_scale / dts_diff 帧的顺序在每个帧内部有字段表示,根据sps.pic_order_cnt_type有不同算法,现在只考虑sps.pic_order_cnt_type == 0的情况,这时候slice.slice_header.pic_order_cnt_lsb表示顺序 cts = (dts of idr) + slice.slice_header.pic_order_cnt_lsb / 2 * time_scale / frame_rate 或者直接使用num_units_in_tick: cts = (dts of idr) + slice.slice_header.pic_order_cnt_lsb / 2 * sps.vui_parameters.num_units_in_tick 2、爆音 现象:播放过程中声音异常,夹杂着轻微爆炸的声音 范围:Mp4文件转成TS,没有问题,ASF、FLV转成TS文件,有该现象 原因:ASF、FLV时间戳是毫秒级精度,TS文件是90000分之一秒,相差90倍,直接乘以90转换,精度不够。IOS播放TS的时候,完全依赖TS时间戳。 比如采样率22050的音频,1024的采样点一个Sample,那么前三个Sample的时间戳情况是: Sample号精确时间戳(秒)ASF时间戳误差TS时间戳误差000011024/22050-0.00043990.00000453522048/220500.0001202-0.000002041 方案:自己根据采样率计算TS的时间戳,问题完整解决。 音频sample n的TS(PES)时间戳为n * 90000 * 1024 / 采样率 备注:一开始没有找到这个原因,采用合并音频帧的方法,几十个音频帧合并起来,基本能解决问题,其中原因是合并之后误差减少,用上面的原因分析也是说得通的。 3、绿屏 现象:播放刚开始,会出现瞬间绿色画面

Svchost.exe进程详解及Svchost.exe病毒清除方法

这几天在宿舍上网的时候其他的舍友反映网络特别的卡。不知道是什么原因。然后我就发现自己的电脑有一个程序,自己走流量而且每秒能达100kb以上对于宿舍8个人共用的一个4M的网线来说已经算是占了好大一部分网速了。在金山流量监控上发现这个程序叫Svchost.exe。 这是一个什么程序呢。然后我就尝试禁用。但我发现win7的任务管理器的进程中是找不到这个进程的。然后我通过上网了解了这个进程。 svchost.exe是nt核心系统的非常重要的进程,对于2000、xp来说,不可或缺。很多病毒、木马也会调用它。所以,深入了解这个程序,是玩电脑的必修课之一。 大家对windows操作系统一定不陌生,但你是否注意到系统中“svchost.exe”这个文件呢?细心的朋友会发现windows中存在多个 “svchost”进程,为什么会这样呢?下面就来揭开它神秘的面纱。 发现 在基于nt内核的windows操作系统家族中,不同版本的windows系统,存在不同数量的“svchost”进程,用户使用“任务管理器”可查看其进程数目。一般来说,win2000有两个svchost进程,winxp中则有四个或四个以上的svchost进程(以后看到系统中有多个这种进程,千万别立即判定系统有病毒了哟),而win2003 server中则更多。这些svchost进程提供很多系统服务,如:rpcss服务(remote procedure call)、dmserver服务(logical disk manager)、dhcp服务(dhcp client)等。 如果要了解每个svchost进程到底提供了多少系统服务,可以在win2000的命令提示符窗口中输入“tlist -s”命令来查看,该命令是win2000 support tools提供的。在winxp则使用“tasklist /svc”命令。 svchost中可以包含多个服务 深入: windows系统进程分为独立进程和共享进程两种,“svchost.exe”文件存在于“%systemroot% system32”目录下,它属于共享进程。随着windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 svchost.exe进程来启动。但svchost进程只作为服务宿主,并不能实现任何服务功能,即它只能提供条件让其他服务在这里被启动,而它自己却不能给用户提供任何服务。那这些服务是如何实现的呢? 原来这些系统服务是以动态链接库(dll)形式实现的,它们把可执行程序指向 svchost,由svchost调用相应服务的动态链接库来启动服务。那svchost又怎么知道某个系统服务该调用哪个动态链接库呢?这是通过系统服务在注册表中设置的参数来实现。下面就以rpcss(remote procedure call)服务为例,进行讲解从启动参数中可见服务是靠svchost来启动的。 实例: 以windows xp为例,点击“开始”/“运行”,输入“services.msc”命令,弹出服务对话框,然后打开“remote procedure call”属性对话框,可以看到rpcss服务的可执行文件的路径为“c:\windows\system32\svchost -k rpcss”,这说明rpcss服务是依靠svchost调用“rpcss”参数来实现的,而参数的内容则是存放在系统注册表中的。 在运行对话框中输入“regedit.exe”后回车,打开注册表编辑器,找到[hkey_local_machine -system-currentcontrolset-services-rpcss]项,找到类型为“reg_expand_sz”的键“magepath”,其键值为“%systemroot%system32svchost -k rpcss”(这就是在服务窗口中看到的服务启动命令),另外在“parameters”子项中有个名为“servicedll”的键,其值为“% systemroot%system32rpcss.dll”,其中“rpcss.dll”就是rpcss服务要使用的动态链接库文件。这样 svchost进程通过读取“rpcss”服务注册表信息,就能启动该服务了。 解惑: 因为svchost进程启动各种服务,所以病毒、木马也想尽办法来利用它,企图利用它的特性来迷惑用户,达到感染、入侵、破坏的目的(如冲击波变种病毒“w32.welchia.worm”)。但windows系统存在多个svchost进程是很正常的,在受感染的机器中到底哪个是病毒进程呢?这里仅举一例来说明。 假设windows xp系统被“w32.welchia.worm”感染了。正常的svchost文件存在“c:\windows\system32”目录下,如果发现该文件出现在其他目录下就要小心了。“w32.welchia.worm”病毒存在于“c:\windows\system32wins”目录中,因此使用进程管理器查看svchost进程的执行文件路径就很容易发现系统是否感染了病毒。windows系统自带的任务管理器不能够查看进程的路径,可以使用第三方进程管理软件,如“windows优化大师”进程管理器,通过这些工具就可很容易地查看到所有的svchost进程的执行文件路径,一旦发现其执行路径为不平常的位置就应该马上进行检测和处理。 Svchost病毒清除办法: 1、删除类似于C:SysDayN6这样的文件夹:例如C:Syswm1i、C:SysAd5D等等,这些文件夹有个共同特点,就是名称为 Sys*** (***是三到五位的随机字母),这样的文件夹有几个就删几个。 2、开始——运行——输入“regedit”——打开注册表,展开注册表到以下位置: HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerRun 删除右边所有用纯数字为名的键,如 <66> <333> <50> <4> 3、重新启动计算机,病毒清除完毕。 如何解决占用网速过多的问题呢: 右击我的电脑,点管理,然后选择服务与应用程序,找到Background Intelligent Transfer Service禁止它,就可以了,可以放心将它禁止掉,不会有事. 这是微软搞的后台自动传输数据的服务,默认设置是手动,如果是停掉当前在的流量需要关闭Background Intelligent Transfer Service服务,如果只是设为禁用,那么当前服务还是在运行,只有在下次开机的时候后才会重新使用更新的设置.如果开机时出现了“background intelligent transferservice不能禁用”的提示问题是这样的。这个服务我们是禁止了的,但是我们只让系统开机不自动启动他,(并不管开机以后是否会有程序或者人工的启动他),系统启动后,如果你开启了windows自动更新服务,而且恰巧windows更新的某个程序需要background intelligent transfer service他的支持,那么这个程序就会启动他。整个过程是:background intelligent transfer service不开机自动启动了,但是系统自动启动了windows自动升级服务,windows自动升级服务又启动自动更新的相关程序,自动更新的相关程序又需要background intelligent transfer service这个服务,所以启动了这个服务,如果你没有开启windows自动更新服务,或者windows自动更新正在运行的程序不需要background intelligent transfer service这个服务,background intelligent transfer service就不会再开启了。所以可以禁止windows自动试试看。 不过这个情况出现的概率是比较低的。

OpenInventor zoom in & zoom out实现方法

最近一直在研究如何用OpenInventor来实现对场景的放大缩小,自己的一些想法,最终都被否定,原因主要是我对SoCamera的一些域了解不是很深入。下面的代码是我看了OIV的源码后才搞定的,嘿嘿,虽然理解的不是很好,但是起码功能搞定了,很开心! SoCamera* myCamera =myViewer->getCamera();float focalDistance = myCamera->focalDistance.getValue();float newFocalDist = focalDistance /percent;// finally reposition the cameraSbMatrix mx= myCamera->orientation.getValue();SbVec3f forward(-mx[2][0], -mx[2][1], -mx[2][2]);myCamera->position = myCamera->position.getValue() + (focalDistance - newFocalDist) * forward;myCamera->focalDistance = newFocalDist; 下面对代码里做简单解释,myViewer_是一个SoXtViewer或者SoQtViewer,percent是放大缩小的比率,调整percent的大小可以干什么就不用我说了吧。这里我把percent设置为1.2,那么除percent就是进行放大,乘以percent就是进行缩小。 http://hi.baidu.com/hnulilei/blog/item/2720aa3600e08cd7a3cc2be0.html

AVI文件格式解析2

AVI文件格式 2011-09-04 09:51:06| 分类: H264 | 标签: |字号大中小 订阅 AVI格式是音频视频交错(Audio Video Interleaved)的英文缩写,它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式,原先用于Microsoft Video for Windows (简称VFW)环境,现在已被Windows 95/98、OS/2等多数操作系统直接支持。AVI格式允许视频和音频交错在一起同步播放,支持256色和RLE压缩,但AVI文件并未限定压缩标准,因此,AVI文件格式只是作为控制界面上的标准,不具有兼容性,用不同压缩算法生成的AVI文件,必须使用相应的解压缩算法才能播放出来。常用的AVI播放驱动程序,主要是Microsoft Video for Windows或Windows 95/98中的Video 1,以及Intel公司的Indeo Video。 在介绍AVI文件前,我们要先来看看RIFF文件结构。AVI文件采用的是RIFF文件结构方式,RIFF(Resource Interchange File Format,资源互换文件格式)是微软公司定义的一种用于管理windows环境中多媒体数据的文件格式,波形音频wave,MIDI和数字视频AVI都采用这种格式存储。构造RIFF文件的基本单元叫做数据块(Chunk),每个数据块包含3个部分, 1、4字节的数据块标记(或者叫做数据块的ID) 2、数据块的大小 3、数据 整个RIFF文件可以看成一个数据块,其数据块ID为RIFF,称为RIFF块。一个RIFF文件中只允许存在一个RIFF块。RIFF块中包含一系列的子块,其中有一种字块的ID为"LIST",称为LIST,LIST块中可以再包含一系列的子块,但除了LIST块外的其他所有的子块都不能再包含子块。 RIFF和LIST块分别比普通的数据块多一个被称为形式类型(Form Type)和列表类型(List Type)的数据域,其组成如下: 1、4字节的数据块标记(Chunk ID) 2、数据块的大小 3、4字节的形式类型或者列表类型 4、数据 下面我们看看AVI文件的结构。AVI文件是目前使用的最复杂的RIFF文件,它能同时存储同步表现的音频视频数据。AVI的RIFF块的形式类型是AVI,它包含3个子块,如下所述: 1、信息块,一个ID为"hdrl"的LIST块,定义AVI文件的数据格式。 2、数据块,一个ID为 "movi"的LIST块,包含AVI的音视频序列数据。 3、索引块,ID为 "idxl"的子块,定义 "movi"LIST块的索引数据,是可选块。 AVI文件的结构如下图所示,下面将具体介绍AVI文件的各子块构造。 1、信息块,信息块包含两个子块,即一个ID为 avih 的子块和一个ID 为 strl 的LIST块。 AVI文件结构 "avih"子块的内容可由如下的结构定义: "strl" LIST块用于记录AVI数据流,每一种数据流都在该LIST块中占有3个子块,他们的ID分别是"strh","strf", "strd"; "strh"子块由如下结构定义。 "strf"子块紧跟在"strh"子块之后,其结构视"strh"子块的类型而定,如下所述;如果 strh子块是视频数据流,则 strf子块的内容是一个与windows设备无关位图的BIMAPINFO结构,如下: 如果 strh子块是音频数据流,则strf子块的内容是一个WAVEFORMAT结构,如下: "strd"子块紧跟在strf子块后,存储供压缩驱动程序使用的参数,不一定存在,也没有固定的结构。 "strl" LIST块定义的AVI数据流依次将 "hdrl " LIST 块中的数据流头结构与"

Python 与IronPython 简介与资源

python是什么? Python,是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大而完善的通用型语言,已经具有十多年的发展历史,成熟且稳定。Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。这种语言具有非常简捷而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的操作系统中运行。目前,基于这种语言的相关技术正在飞速的发展,用户数量急剧扩大,相关的资源非常多。 更多介绍: http://baike.baidu.com/view/21087.htm 官方网站: http://www.python.org/ python能做什么? 我比较关注的web领域开发,python就可以做.其他的cs程序,相信也不出成问题. 为什么要学python? 按照我的理解,python是和现在流行的java c# c等相比都不同的语言.多学点不同的东西,不仅可以开拓视野,也会帮助你现在使用的语言(比如我在用c#).而且,说不定一发不可收拾,你的下一份工作就是python! 如何安装python. 到官方网站 http://www.python.org/ 来下载最新版本的python(我下的是2.5),根据你的操作系统(我是windows xp)选择相应的下载点.下载完成后安装. 安装的包括python的运行环境,库,和其他组件.其中比较重要的是一个用来编写python的ide,IDLE,在开始-程序-python2.5下可以看到它. 学习python 这里有一个很好的教程,可以帮助你快速的掌握python 简明Python教程: http://www.woodpecker.org.cn:908 ... /chinese/index.html 这是稍微复杂些的 Dive Into Python: http://www.woodpecker.org.cn/diveintopython/toc/index.html 我昨天下午看了看简明Python教程,python的一些语法非常的有意思! 怎么运行python? 最简单的是用IDLE进行python程序的编写,完成后按F5就会打开python shell看到程序的结果. 打开IDLE后,File-New Window,就可以开始一个新python程序的编写. 编写python的IDE都有哪些? 除了上面提到的IDLE,还有一个比较好的选择是Active Python,这个也是免费下载的软件.你可以到这里来下载 Active Pytho: http://www.activestate.com/Products/activepython/ 想要多一些关于python的资源 Python chm版电子书籍列表 http://bound0.xinwen365.com/python/ 到这里,基本上就可以开始python的学习与实践了.实际上,大体了解了语法后,你肯定想知道怎么用python来编写一个更复杂的程序. 怎么用python开发网站? 现在有一些支持python开发网站的框架可选. 入门级的Karrigell: http://karrigell.sourceforge.net/en/front.htm 高级的Django: http://www.woodpecker.org.cn/obp ... bystep/newtest/doc/ 我现在是做.net开发的,所以也比较关注python和.net的一些结合.现在python在.net上通过ironpython实现.下面是这个的一些问题. ironpython是什么? 简单理解就是一个.net可用的组件,或者说是.net框架下和c#等平行的另一种语言.(这样理解其实有问题,但可以帮助你快速的进入ironpython的世界). 官方网站: http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython 但是,如果抛去vs和.net,ironpython和python没有什么特别的不同.我们可以把此时的vs看成一个开发python程序的IDE或框架. 怎么在.net环境下使用ironpython? 使用ironpython当然是指用visual studio.net进行开发.要使用ironpython,需要给你的vs打个补丁. 下载这个Microsoft ASP.NET Futures安装,可以让你的vs支持ironpython http://www.microsoft.com/downloa ... &displaylang=en 通过下面的介绍,可以简单的了解如何在vs中使用ironpython http://quickstarts.

VS2010 下C#调用与整合python函数

1.下载IronPython2.7(http://ironpython.codeplex.com/) 2.安装IronPython2.7 3.VS2010创建Console程式,参考引用C:/Program Files/IronPython 2.7/IronPython*.dll,Microsoft.*.dll 如: 4.Console代码如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using IronPython.Hosting; using IronPython.Compiler; using IronPython.Modules; using IronPython.Runtime; using Microsoft.Scripting; using Microsoft.Scripting.Hosting; namespace PythonConsole { class Program { static void Main(string[] args) { var engine = Python.CreateEngine(); var scope = engine.CreateScope(); //注意要有空格 否则会导致缩进对不上位置 即expected an indented block 错误 var py = "def adder(arg1,arg2):\n"+" return arg1 + arg2 \n"+"\n"+"def hello(arg1):\n"+" return 'hello'+arg1 \n"+"\n"+"class MyClass(object):\n"+" def __init__(self,value):\n"

复习struts2之配置action范围国际化资源文件

为某个action单独指定资源文件,方法如下: 在Action类所在的路径,放置ActionClassName_language_country.properties资源文件,ActionClassName为action类的简单名称。 当查找指定key的消息时,系统会先从ActionClassName_language_country.properties资源文件查找,如果没有找到对应的key,然后沿着当前包往上查找基本名为package 的资源文件,一直找到最顶层包。如果还没有找到对应的key,最后会从常量(既全局的资源文件)struts.custom.i18n.resources指定的资源文件中寻找。 实例: struts.xml <constant name="struts.custom.i18n.resources" value="csdn" /> <package name="itcast" namespace="/test" extends="struts-default"> <action name="manage" class="cn.csdn.action.ManageAction"> <result name="message">/WEB-INF/page/message.jsp</result> </action> </package> Action方法 public class ManageAction extends ActionSupport{ @Override public String execute() throws Exception { ActionContext.getContext().put("message", this.getText("welcome",new String[]{"小明","玩"})) ; return "message"; } } 资源文件 ManageAction_zh_CN.properties welcome= action:{0}\uFF0C\u6B22\u8FCE\u6765\u5230\u4F20\u667A\u64AD\u5BA2{1} jsp页面message.jsp ${message} 访问路径: http://localhost:8080/native/test/manage.action 浏览器输出结果: action:小明,欢迎来到传智播客玩

循环队列rear==front 无法判断 空 还是满 问题解决

此问题 有两种处理方法: (1) 另设一个标志符 区分队列空还是满; (2)少用一个元素空间,约定队头在队尾指针的下一位置时作为队满的标志; 本人知实验了第二种:若SqQueue队列初始化为有size=10,则此队列实际只有9个元素; 另外:循环队列 队头有元素 rear 没指向任何元素 ;而链队列 队头无元素 ,队尾有元素;

复习struts2之配置国际化全局资源文件、输出国际化信息

准备资源文件,资源文件的命名格式如下: baseName_language_country.properties baseName_language.properties baseName.properties 其中baseName是资源文件的基本名,我们可以自定义,但language和country必须是java支持的语言和国家。如: 中国大陆: baseName_zh_CN.properties 美国: baseName_en_US.properties 现在为应用添加两个资源文件: 第一个存放中文:csdn_zh_CN.properties 内容为:welcome=欢迎来到传智播客 (myEclipse会自动将中文转换为unicode编码) 第二个存放英语(美国): csdn_en_US.properties 内容为: welcome=welcome to itcast 当准备好资源文件之后,我们可以在struts.xml中通过struts.custom.i18n.resources常量把资源文件定义为全局资源文件,如下: <constant name="struts.custom.i18n.resources" value=“csdn" /> csdn为资源文件的基本名。 在页面中访问: 想要使用<s:text name=“”/>标签在JSP页面中输出国际化信息,首先要进行如下配置: <%@ taglib uri="/struts-tags" prefix="s" %> 在body中输出: <s:text name="welcome"/> 注:name为资源文件中的key 在action中访问: 在Action类中,可以继承ActionSupport,使用getText()方法得到国际化信息,该方法的第一个参数用于指定资源文件中的key。 在struts.xml 文件中配置 <package name="itcast" namespace="/test" extends="struts-default"> <action name="manage" class="cn.csdn.action.ManageAction"> <result name="message">/WEB-INF/page/message.jsp</result> </action> </package> Action中的方法: public class ManageAction extends ActionSupport{ @Override public String execute() throws Exception { ActionContext.getContext().put("message", this.getText("welcome")) ; return "

C++函数参数中的省略号

转自:http://waterday.blog.51cto.com/1032892/329079 C++允许定义形参个数和类型不确定的函数。例如,C语言中的标准函数printf便使用这种机制。在声明不确定形参的函数时,形参部分可以使用省略号“…”代替。“…”告诉编译器,在函数调用时不检查形参类型是否与实参类型相同,也不检查参数个数。 例如: void ConnectData(int i,...) 在上面的代码中,编译器只检查第一个参数是否为整型,而不对其他参数进行检查。 对于可变参数的函数,需要进行特殊的处理。首先需要引用 <stdarg.h> 头文件,然后利用va_list类型和va_start、va_arg、va_end 3个宏读取传递到函数中的参数值。 这几个宏的定义如下(在 ANSI C 中): type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); void va_start( va_list arg_ptr, prev_param ); 说明如下: va_start sets arg_ptr to the first optional argument in the list of arguments passed to the function. The argument arg_ptr must have va_list type. The argument prev_param is the name of the required parameter immediately preceding the first optional argument in the argument list.

C++中的mutable和const

声明:这里讨论的const是用来修饰函数的const,而不是用来修饰变量的const。虽然是同一个关键字,但yayv还是觉得把他们当作2个关键字来理解更好一些。 C++中const关键字用来表示一个常量,同时const也用来修饰函数。yayv在这个要明确的概念是:const所修饰的函数只能是类的成员函数,因为const所修饰的函数中,要由编译器负责保护类的成员变量不被修改。而相对的,mutable则是用来修饰类的成员变量,让该变量在const所修饰的成员函数中可以被修改。而且const修饰的函数只能是类的成员函数,mutable修饰的变量只能是类的成员变量。简直就是一对冤家对头~ 这里出现了3个问题: 第一:为什么要保护类的成员变量不被修改 第二:为什么用const保护了成员变量,还要再定义一个mutable关键字来突破const的封锁线? 第三:到底有没有必要使用const 和 mutable这两个关键字? yayv对这三个问题的看法是:保护类的成员变量不在成员函数中被修改,是为了保证模型的逻辑正确,通过用const关键字来避免在函数中错误的修改了类对象的状态。并且在所有使用该成员函数的地方都可以更准确的预测到使用该成员函数的带来的影响。而mutable则是为了能突破const的封锁线,让类的一些次要的或者是辅助性的成员变量随时可以被更改。没有使用const和mutable关键字当然没有错,const和mutable关键字只是给了建模工具更多的设计约束和设计灵活性,而且程序员也可以把更多的逻辑检查问题交给编译器和建模工具去做,从而减轻程序员的负担(yayv觉得这只不过是把负担移交给了设计人员~, :(,并没有降低任何工作量 )。如果开发过程有比较严格的迭代过程,使用这两个关键字应该更能体现出他们的作用。 出处:http://www.wangchao.net.cn/bbsdetail_35638.html

GDAL源码剖析(十一)之OGR投影说明

一、简介 本文参考英文地址:http://www.gdal.org/ogr/osr_tutorial.html。 OGRSpatialReference类和OGRCoordinateTransformation类主要用来提供定义坐标系统(投影和水准面)和转换坐标。这两个类都基于OpenGIS的坐标转换说明,并且使用Well Known Text格式来进行表述坐标系统。 一些关于OpenGIS坐标系统的资料,以及空间参考坐标抽象模型文件可以在OGC(Open Geospatial Consortium)的网站上找到。GeoTIFF投影转换列表(GeoTIFF Projections Transform List)网页可以更好的帮助你理解WKT的规则,同时EPSG的网站也是很有用的资料。 二、定义地理坐标系统 坐标系统使用OGRSpatialReference类来进行封装。这里提供了数种初始化OGRSpatialReference类的方式。这里有两类主要的坐标系统,第一种是地理坐标系统(位置信息使用经纬度来表示的),第二种是投影坐标系统(比如UTM-通用横轴墨卡托投影,位置信息使用米或者英尺来表示)。 一个地理坐标系统包含的信息有一个大地基准(里面含有一个使用长半轴和扁率的倒数来表示的托球体),一个中央经线(通常是本初子午线,也就是0度经线Greenwich), 此外还有一个角度的度量单位,使用度而不是弧度。如果含有这些信息,就可以构造一个有效的地理坐标系统。 OGRSpatialReference oSRS; oSRS.SetGeogCS( "Mygeographic coordinate system", "WGS_1984", "My WGS84 Spheroid", SRS_WGS84_SEMIMAJOR, SRS_WGS84_INVFLATTENING, "Greenwich", 0.0, "degree", SRS_UA_DEGREE_CONV ); 在上面的代码中,名称为“My geographic coordinate system”,“My WGS84 Spheroid”,“Greenwich”和“degree”的并不是关键词,这些主要是用来给用户进行说明的。然而,“WGS_1984”是一个定义大地基准的关键词,注意:这里的大地基准必须是一个有效的大地基准!(这句话的意思,前面的那些字符串就是随便指定的,用来显示的,后面的WGS_1984这个位置的字符串,必须是一个有效的,不能随便命名,具体后面会说到)。 OGRSpatialReference可以使用一些常用的字符串来进行建立一个常用的坐标系统,这些字符串包括“NAD27”、“NAD83”,“WGS72”和“WGS84”等,使用的函数是SetWellKnownGeogCS(),使用方式见下面。 oSRS.SetWellKnownGeogCS( "WGS84" ); 而且,还可以使用EPSG数据库定义的GCS代码来定义一个地理坐标系统,如: oSRS.SetWellKnownGeogCS( "EPSG:4326" ); 为了方便的和其他库进行关联,这里可以转换为OpenGIS的WKT格式。同样OGRSpatialReference可以使用一个WKT来进行初始化,或者将里面的信息导出为WKT格式。 char *pszWKT =NULL; SRS.SetWellKnownGeogCS( "WGS84" ); oSRS.exportToWkt( &pszWKT ); printf( "%s\n", pszWKT ); 上面的语句会输出下面的内容: GEOGCS["WGS84",DATUM["WGS_1984",SPHEROID["WGS84",6378137,298.257223563,AUTHORITY["EPSG",7030]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG",6326]],PRIMEM["Greenwich",0,AUTHORITY["EPSG",8901]],UNIT["DMSH",0.0174532925199433,AUTHORITY["EPSG",9108]],AXIS["Lat",NORTH],AXIS["Long",EAST],AUTHORITY["EPSG",4326]] 将上面的字符串格式调整成更好看的样子: GEOGCS["WGS 84", DATUM["WGS_1984", SPHEROID["WGS 84",6378137,298.257223563, AUTHORITY["EPSG",7030]], TOWGS84[0,0,0,0,0,0,0], AUTHORITY["

Linux驱动修炼之道-混杂设备

原文地址链接 在Linux驱动中把无法归类的五花八门的设备定义为混杂设备(用miscdevice结构体表述)。miscdevice共享一个主设备号MISC_MAJOR(即10),但次设备号不同。 所有的miscdevice设备形成了一个链表,对设备访问时内核根据次设备号查找对应的miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。 在内核中用struct miscdevice表示miscdevice设备,然后调用其file_operations结构中注册的文件操作接口进行操作。miscdevice的API实现在drivers/char/misc.c中。 下边是描述这个设备的结构体: C-sharp代码 struct miscdevice { int minor; //次设备号 const char *name; //设备的名称 const struct file_operations *fops; //文件操作 struct list_head list; //misc_list的链表头 struct device *parent; //父设备(Linux设备模型中的东东了,哈哈) struct device *this_device; //当前设备,是device_create的返回值,下边会看到 }; 然后来看看misc子系统的初始化函数: C-sharp代码 static int __init misc_init(void) { int err; #ifdef CONFIG_PROC_FS /*创建一个proc入口项*/ proc_create("misc", 0, NULL, &misc_proc_fops); #endif /*在/sys/class/目录下创建一个名为misc的类*/ misc_class = class_create(THIS_MODULE, "misc"); err = PTR_ERR(misc_class); if (IS_ERR(misc_class)) goto fail_remove; err = -EIO; /*注册设备,其中设备的主设备号为MISC_MAJOR,为10。设备名为misc,misc_fops是操作函数的集合*/ if (register_chrdev(MISC_MAJOR,"

程序员很少上《非诚勿扰》电视节目相亲之分析

程序员很少上《非诚勿扰》电视节目相亲之分析 偶观看有线电视32频道的江苏卫视《非诚勿扰》电视相亲节目,半年有余。 问题 为什么程序员很少上《非诚勿扰》节目进行相亲呢?难道是程序员当中,很少有大龄的剩男剩女。难道是程序员群体不够庞大。北京、上海、广州、大连,应该生活着很多程序员。 概述 《非诚勿扰》首先是一档电视节目,她的首要目的是要有很高的节目收视率,商业是目的,相亲是内容,是载体,娱乐是本质,是核心。没有很高的收视率,栏目很难开办下去。节目收入率是直接和广告收入、赞助费相挂钩的。哪么节目就需要有很强的可观赏性、可娱乐性、可表现性、可互动性。需要男女嘉宾具备很好台上的表现能力,譬如:语言表达能力、良好的外形(男的潇洒、高富帅,女的漂亮、有才华)、具备强大的可争议性(如女嘉宾马诺,一句“宁可在宝马车上哭,也不在自行车上笑”,让社会引起争议,毕竟与社会主流价值观发生重大偏离),现场可以调动观众的情绪,吸引观众眼球。此外,也需要嘉宾有比较充裕的时间,可以自由支配,参加VCR短片的录制,节目的彩排与录制。也就是说《非诚勿扰》是一档基于男女相亲的全民娱乐节目。 原因分析 基于以上立论基础,偶的分析是: 1.时间 程序员,手头的工作都忙不过来,加班多,时间上根本无法保证及时参加节目的排练与录制。 2.理性 程序员,太过理智,太过理性,不太相信,台上短短10分钟,就能争取到爱情,能够争取到一生一世的爱情,伴随自己到老的人生伴侣,因为爱情需要相识、相知、相恋、相爱以及相守等一系列的过程。软件工程的强调3大要素:方法、工具和过程。所以,爱情也需要一定的过程,如相知到相恋。一见钟情的爱情,在程序员的眼中总有点神话。不是不相信,而是考虑太多。程序员思维模式里,有太多的逻辑推理,严格验证,有太多的IF Else条件判断。 3.舞台表现力 要程序员,做一道数学题,或者讲讲技术话题哪是滔滔不绝,口若悬河,或者碰到熟人、朋友讲个笑话,开个玩笑,一点也不怵。但是要讲点娱乐八卦、明星影视等公众话题,确实不是很在行,会表现的有点木讷,有点语无伦次,结结巴巴。舞台上的表现欲望不够强烈,自我展示与把握控制能力都还欠火候,况且还要面对全国亿万观众,确实一下子还放不开,毕竟缺少在镁光灯、舞台上表现自我的机会,或者说锻炼的机会。 4.从业人员数量 IT行业的从业人员,确实不少,但是要具体到真正的程序员这个群体,还真的不是很多,况且还是剩男剩女。作为女的程序员,本来就很稀少,尤其年龄越大,软件开发的女孩更是凤毛麟角。况且女程序员,很理性,一看年龄有点偏大,就着急把自己嫁出去了,不会漫天要价,不会一心想着高富帅。女孩做程序员,本身就说明很聪明,而且还很勤奋,否则无法适应如今快速变化的IT行业,她有自知之明,她知道,女人的年龄对一个女人意味着什么,过了这个村,就没有这个店,所以女性程序员都会见好就收。此外,女程序员本身就生活在一个僧多粥少的男性工作的圈子里,更显得弥足珍贵,鹤立鸡群,万绿从中一点红,找到意中人着实是机会一大把。 5.经济收入 程序员中,高富帅的确实不是很多,高富帅的男生,也没有心思整天对着冷冰冰的电脑,殚尽心思编码,捉虫,毕竟搞技术来不得半点虚假,写程序以及问题诊断,讲究的是严格的逻辑思辨的,有着车子、房子的未婚的程序员,确实不多见,毕竟程序员这个职业群体还只是靠技术、靠脑力劳动的工作的一个群体,不是公司的管理层,更不是公司的决策层,仅仅是一个写字楼里的高级的工匠而已。 6.VCR短片录制 想通过VCR来充分展示自我的才能、才华、素质和形象,其实对程序员来说,是一个很大的挑战,毕竟程序员大部分时间面对的是电脑,满屏满屏的一大段一大段的代码。 7.心理承受能力 不想站在舞台上,被全国观众评头论足,指手划脚,甚至被全国人民批评,或者谩骂祖宗十八代,他觉得太不值了。他深知,人怕出名猪怕壮的道理。程序员没有做好承受全国人民赞扬与批评的心理准备。 8.明星梦想 也没有想过通过非诚勿扰的这个舞台,一夜成名,成为一个明星,因为他知道,明星不过是过往云烟,昙花一现,他的特长是技术,而不是脸蛋,长相。 9.价值观念 程序员的爱情观、婚姻观、人生观以及财富观等等形形色色的价值观念,太中规中矩,也就是说,非常与社会主流价值观念想吻合。波澜不惊的言语没有,说出来不会引起极大争议,或者引起观众的关注,仿佛就是邻居家小孩,太熟悉不过了。 10.低调务实 程序员都很低调,务实。讲究的是:钉是钉铆是铆。不愿意上电视相亲,不太爱抛头露面。也不愿意把自己的感情,爱情,暴露于大庭广众之下。程序员的感情是细腻的、内敛的和含蓄的。不善于表达,不善于张扬。情感不善于外露。是哪种“润物细无声”的感觉。爱埋在心底,默默的。可能就是传说中的大爱之简吧!(End) 后记: 针对很多同道中人,觉得偶对程序员这个职业群体有误解和偏见。但是偶一直认为,程序员群体,是一个聪明机智、多才多艺、活泼开朗和个性十足的职业群体!有梦想!有执着!有困惑!有欢乐!因为身处其中一员,还算比较了解。 先特将2011年9月8日,写的一篇文章附上,以正视听。谢谢! 《找个程序员做老公,挺好!》 大家如果意犹未尽,可以根据自己的现状和喜好,阅读下面的文章。谢谢! if 没有女朋友的程序员 then 《程序员如何找女朋友》 else 《程序员与女朋友相处之道》 if 喜欢在技术有所造诣和发展的童靴 then 《一个技术工作者的四大核心价值理念》 每个人的人生经历、人生感悟、个人喜好以及口味轻重等等差异,让偶很难一一满足大家的期望,我也很为难,正所谓众口难调。但正因为个体之间的差异性,造就一个五彩缤纷、绚丽多姿的世界,需要我们理解、包容、欣赏。最后,我要真挚地感谢大家对偶支持与鼓励!谢谢!谢谢!祝福你们工作顺利!生活幸福!(End)。

C 语言的可变参数表函数的设计

首先在介绍可变参数表函数的设计之前,我们先来介绍一下最经典的可变参数表printf函数的实现原理。 一、printf函数的实现原理 在C/C++中,对函数参数的扫描是从后向前的。C/C++的函数参数是通过压入堆栈的方式来给函数传参数的(堆栈是一种先进后出的数据结构),最先压入的参数最后出来,在计算机的内存中,数据有2块,一块是堆,一块是栈(函数参数及局部变量在这里),而栈是从内存的高地址向低地址生长的,控制生长的就是堆栈指针了,最先压入的参数是在最上面,就是说在所有参数的最后面,最后压入的参数在最下面,结构上看起来是第一个,所以最后压入的参数总是能够被函数找到,因为它就在堆栈指针的上方。printf的第一个被找到的参数就是那个字符指针,就是被双引号括起来的那一部分,函数通过判断字符串里控制参数的个数来判断参数个数及数据类型,通过这些就可算出数据需要的堆栈指针的偏移量了,下面给出printf("%d,%d",a,b);(其中a、b都是int型的)的汇编代码 .section .data string out = "%d,%d" push b push a push $out call printf 你会看到,参数是最后的先压入栈中,最先的后压入栈中,参数控制的那个字符串常量是最后被压入的,所以这个常量总是能被找到的。 二、可变参数表函数的设计 标准库提供的一些参数的数目可以有变化的函数。例如我们很熟悉的printf,它需要有一个格式串,还应根据需要为它提供任意多个“其他参数”。这种函数被称作“具有变长度参数表的函数”,或简称为“变参数函数”。我们写程序中有时也可能需要定义这种函数。要定义这类函数,就必须使用标准头文件<stdarg.h>,使用该文件提供的一套机制,并需要按照规定的定义方式工作。本节介绍这个头文件提供的有关功能,它们的意义和使用,并用例子说明这类函数的定义方法。 C中变长实参头文件stdarg.h提供了一个数据类型va-list和三个宏(va-start、va-arg和va-end),用它们在被调用函数不知道参数个数和类型时对可变参数表进行测试,从而为访问可变参数提供了方便且有效的方法。va-list是一个char类型的指针,当被调用函数使用一个可变参数时,它声明一个类型为va-list的变量,该变量用来指向va-arg和va-end所需信息的位置。下面给出va_list在C中的源码: typedef char * va_list; void va-start(va-list ap,lastfix)是一个宏,它使va-list类型变量ap指向被传递给函数的可变参数表中的第一个参数,在第一次调用va-arg和va-end之前,必须首先调用该宏。va-start的第二个参数lastfix是传递给被调用函数的最后一个固定参数的标识符。va-start使ap只指向lastfix之外的可变参数表中的第一个参数,很明显它先得到第一个参数内存地址,然后又加上这个参数的内存大小,就是下个参数的内存地址了。下面给出va_start在C中的源码: #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) //得到可变参数中第一个参数的首地址 type va-arg(va-list ap,type)也是一个宏,其使用有双重目的,第一个是返回ap所指对象的值,第二个是修改参数指针ap使其增加以指向表中下一个参数。va-arg的第二个参数提供了修改参数指针所必需的信息。在第一次使用va-arg时,它返回可变参数表中的第一个参数,后续的调用都返回表中的下一个参数,下面给出va_arg在C中的源码: #define va_arg(ap,type) ( *(type *)((ap += _INTSIZEOF(type)) - _INTSIZEOF(type)) ) //将参数转换成需要的类型,并使ap指向下一个参数 在使用va-arg时,要注意第二个参数所用类型名应与传递到堆栈的参数的字节数对应,以保证能对不同类型的可变参数进行正确地寻址,比如实参依次为char型、char * 型、int型和float型时,在va-arg中它们的类型则应分别为int、char *、int和double.

动软代码生成器,出现”添加服务器配置失败,请检查是否有写入权限或文件是否存在“的错误的解决办法

动软代码生成器,出现”添加服务器配置失败,请检查是否有写入权限或文件是否存在“的错误的解决办法: 找到安装动软的目录,如果装在C盘时,默认为C:\Program Files\Maticsoft\Codematic2,给此文件夹的安全属性中当前用户添加全部权限; 或添加Everyone用户,给Everyone角色添加全部权限。

C++语言中helloworld程序的详细执行过程

int main(void) { cout <<"Hello World"<<endl; } 1.用户告诉操作系统执行hello程序 2.操作系统找到该程序,检查其类型 3.检查程序首部,找出正文和数据的地址 4.文件系统找到第一个磁盘块 5.父进程需要创建一个新的子进程,执行hello程序 6.操作系统需要将执行文件映射到进程结构 7.操作系统设置CPU上下文环境,并跳到程序开始处 8.程序的第一条指令执行,失败,缺页中断发生 9.操作系统分配一页内存,并将代码从磁盘读入,继续执行 10.更多的缺页中断,读入更多的页面 11.程序执行系统调用,在文件描述符中写一字符串 12.操作系统检查字符串的位置是否正确 13.操作系统找到字符串被送往的设备 14.设备是一个伪终端,由一个进程控制 15.操作系统将字符串送给该进程 16.该进程告诉窗口系统它要显示字符串 17.窗口系统确定这是一个合法的操作,然后将字符串转换成像素 18.窗口系统将像素写入存储映像区 19.视频硬件将像素表示转换成一组模拟信号控制显示器(重画屏幕) 20.显示器发射电子束 21.你在屏幕上看到hello world 出处:c++语言中helloworld程序的详细执行过程 http://cdzm.ccsu.cn/forum.php?mod=viewthread&tid=2586

【原创文章】JAVA-POI实现EXCEL下拉框的级联(POI生成Excel中带有可级联的下拉框)

原创文章,转载请注明原作者及出处链接,谢谢! http://blog.csdn.net/wed840313 【实现思路】 首先我们来看一下Excel中是怎么实现下拉框的级联的: 1. 假设我们的Excel有两个sheet,第一个sheet需要有两个下拉框:地市、区县——其中区县作为地市的二级下拉框级联。下面是具体实现步骤: 2. 首先我们在“数据字典”这个sheet页中的B列为地市下拉框提供数据: 3. 然后我们继续在E列为区县的下拉框提供数据:(注意是所有的数据) 4. 下拉框数据准备好之后,我们需要在名称管理器中创建所谓的“名称”: 为地市下拉框创建名称:打开名称管理器,点击“新建”按钮,输入名称为“city”,引用的位置选择B列我们为地市下拉框提供的数据: 然后为区县下拉框创建名称:继续新建名称,名称起名为地市下拉框的第一个值“江苏”,引用的位置为E列中属于江苏的数据 继续新建名称,名称起名为地市下拉框的第二个值“宿迁”,引用位置为E列中属于宿迁的数据 如此反复,直到所有的地市名称与它所对应的区县数据关联起来。 5. 回到第一个sheet页中,选中需要添加“地市”下拉框的单元格 点击“数据”选项卡中的“数据有效性” 在允许一项中选择“序列”,来源中如图填写,与city名称关联起来 点击“确定”,我们可以看到地市的下拉框已经加上了: 6. 然后选中需要添加区县下拉框的单元格,点击“数据有效性” 允许一项选择“序列”,来源我们输入“INDIRECT”,后面括号中填写级联的父级下拉框,即这一行中的地市名称那个单元格 点击确定,级联工作至此完成 【POI实现】 有了Excel的实现方式,我们可以用同样的方式,在java后台生成这样的带有级联下拉框的EXCEL 我们准备如下方法: 在名称管理器中创建名称的方法: /** * 创建名称 * @param wb * @param name * @param expression * @return */ public static HSSFName createName(HSSFWorkbook wb, String name, String expression){ HSSFName refer = wb.createName(); refer.setRefersToFormula(expression); refer.setNameName(name); return refer; } 设置数据有效性的方法: /** * 设置数据有效性(通过名称管理器级联相关) * @param name * @param firstRow * @param endRow * @param firstCol * @param endCol * @return */ public static HSSFDataValidation setDataValidation(String name, int firstRow, int endRow, int firstCol, int endCol){ //设置下拉列表的内容 log.

不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接

net use \\机器名或IP\ipc$ /del 用net use来删除前一个用户的连接 net session这条命令看看你的共享文件夹的电脑上有几个连接 =================================================================================== 1.问题描述: 在连接VSS时要用到ipc连接,在断开连接后再次使用命令 net use \\10.11.1.2\ipc$ /user:dmnm\usr "pwd" 连接有时会出现下面的错误提示: 不允许一个用户使用一个以上用户名与服务器或共享资源的多重连接。中断与此服务器或共 享资源的所有连接,然后再试一次。 2.发生原因: 这前曾与主机10.11.1.2有过连接,连接断开后操作系统未将连接状态清除 3.解决方法: 用命令: net use * /del /y 中断开所有连接,再使用命令: net use \\10.11.1.2\ipc$ /user:dmnm\usr "pwd" 连接时就不会出现上述问题了。 转载于:https://blog.51cto.com/qingyun/856028

ORACLE 中 VARRAY的用法

看到同事写的存储过程里面有这样一句: TYPE ARRAY_TYPE IS VARRAY(10000) OF VARCHAR2(60); 感到很茫然,幸好还有网络可以求助,我理解成是:长度为10000的数组,其每个为长度为最大长度为60的varchar2类型。不知是否准确? 1. 声明和初始化VARRAY变量 你不可以直接声明一个VARRAY变量。必须先声明一个包含这个数组最大容量的类型: TYPE MY_ARRAY_TYPE IS VARRAY(10) OF NUMBER; 然后,你就可以用这个类型声明VARRAY变量: V MY_ARRAY_TYPE; 在你对这个数组进行操作以前,必须先初始化该数组。你既可以在声明它的时候对其初始化,也可以在声明后对其赋值。下面展示了在声明的同时对其进行初始化: V MY_ARRAY_TYPE := MY_ARRAY_TYPE (); 2. 从指定的条目处取值 把条目的数目作为下标。下标可以是返回整数值(该值小于或等于数组条目数)的任意表达式,如: K := V(3); I := 2; L := V(I+1); 3. 得到数组的容量 对VARRAY变量使用COUNT()方法。注意,你不需要指定圆括号,因为这个方法没有输入参数: N_ENTRIES := V.COUNT(); 这告诉你这个数组中正在使用的条目数。当VARRAY类型被声明的时候,其最大的容量也就被定义了。你可以用LIMIT()方法得到该容量: ARRAY_CAPACITY := V.LIMIT(); 4. 遍历VARRAY中的值 你可以使用多种技术。最简单的是使用FOR循环: FOR I IN 1..V.COUNT() LOOP DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I)); END LOOP; 你也可以使用FIRST()和LAST()方法。FIRST()返回数组的第一个条目的下标(总是1),LAST()返回数组的最后一个条目的下标(与COUNT方法相同)。 FOR I IN V.FIRST()..V.LAST() LOOP DBMS_OUTPUT.PUT_LINE('V('||I||')=' || V(I)); END LOOP; 你也可以使用PRIOR(n)和NEXT(n)方法,这两个方法分别返回给定条目的前一个和后一个条目的下标。例如,下面的代码用来向后遍历整个数组:

信息抽取,自然语言处理之谈

接触了一些,自己有些感慨 ,感觉在这些领域的人不简单,每天都做着自己都心里明白的一件无法达到的事情,自然语言处理,名字叫的太好听了,每次准确率都提高一点,都激动的跳起来,可以理解,但是大家心里似乎都知道,当前这种框架下,自然语言处理绝对无法达到正常人的这种理解能力,充其量就是一个智商只有20多的小孩罢了,试图通过大量的训练来达到在识别与理解上的准确率有所提高的做法是愚蠢的,可笑的,如果,世界的信息抽取任就以当前这种框架走下去,我觉得是没有前途的,很失望,自己没有那么聪明的头脑,不能改变信息抽取领域之基本方法。我一直坚信,这个过程不是这么一种做法,我认为,人类首先应该研究出自己的思维过程以及自己的学习过程,人类处理信息及理解存储的过程,只有将这些都搞明白了,才能将信息抽取出来,当前的这些,就是在绕眼子,哪怕在发展个十年百年的,也还是这样,所谓的准确率达到多少,难道真的就有意思吗?

发布一个jquery插件--在Web下输入密码时提示大写锁定键(2012-01-21 16:21最后修改) ...

//=============== 大写锁定键打开提示 ============================================// /* 使用:$("#txtPWD").capsLockTip(); */ (function ($) { $.fn.extend({ capsLockTip: function (divTipID) { return this.each(function () { //创建对象实例并保存。 //获取实例对象:var api = $("#txtPWD").data("txtPWD"); var ins = new $.CapsLockTip($(this)); $(this).data(this.id, ins); }); } }); //创建一个实例。 //___target jq目标对象。 //___divTipID 显示提示文本的div。 $.CapsLockTip = function (___target) { //设置当前实例的配置参数。 this.target = ___target; var _this = this; $(document).ready(function () { //创建显示大写锁定的div。 if(null == $.fn.capsLockTip.divTip){ $("body").append("<div id='divTip__985124855558842555' style='width:100px; height:15px; padding-top:3px; display:none; position:absolute; z-index:9999999999999; text-align:center; background-color:#FDF6AA; color:Red; font-size:12px; border:solid 1px #DBC492; border-bottom-color:#B49366; border-right-color:#B49366;'>大写锁定已打开</div>"

gtk中对文字高亮显示的部分函数总结

有通常用的 void gtk_widget_modify_style (GtkWidget *widget,GtkRcStyle *style); void gtk_widget_modify_fg (GtkWidget *widget,GtkStateType state,const GdkColor *color); void gtk_widget_modify_bg (GtkWidget *widget,GtkStateType state,const GdkColor *color); void gtk_widget_modify_text (GtkWidget *widget,GtkStateType state,const GdkColor *color); void gtk_widget_modify_base (GtkWidget *widget,GtkStateType state,const GdkColor *color); void gtk_widget_modify_font (GtkWidget *widget,PangoFontDescrīption *font_desc); 序列,它们主要是针对一个整的gtkwidgetobjet来处理的 还在我在前面几篇中提到的 GtkTextView控件的tag函数,可以对html操作一样的处理 GtkTextTag* gtk_text_buffer_create_tag (GtkTextBuffer *buffer,const gchar *tag_name,const gchar *first_property_name,...); 最后就是还有 GtkCList控件 void gtk_clist_set_foreground (GtkCList *clist,gint row,const GdkColor *color); void gtk_clist_set_background (GtkCList *clist,gint row,const GdkColor *color); 这两个函数针对的是GtkCList控件中的某一行的前景和后景色