2014年值得关注的9项技术
Andrew C. Oliver是一位专业的软件咨询师。他从8岁起开始编程,从Basic与dBase III+开始。他最为人所熟知的就是创建了POI项目,该项目现在托管在Apache上。在Red Hat收购JBoss之前,他还是JBoss的早期开发者之一。Andrew是Open Source Initiative的前董事会成员以及现在的顾问。除此之外,Andrew还是Open Software Integrators的董事长与创建者,这是一家专业的服务机构,分布在达拉谟、北卡罗来纳州以及芝加哥。近日,Andrew撰写了一篇文章,谈到了2014年值得关注的9项技术。 2014年充满了各种预测,我们无法控制世界未来的样子,不过我们可以成为自身命运的主人。下面就是2014年值得关注的9项技术,与你一同分享。 1. 文档数据库 很多IT系统基本上都包含了将数据结构写到结构化存储这一部分,同时又要求高并发的性能。文档数据库出现已经有很多年了,其中就有Lotus Domino的Notes Storage Facility,不过NoSQL与大数据革命又燃起了新的领域,其中MongoDB与Couchbase就是其中的佼佼者。 2. 键值存储 有时,你有一张很大的表,可以放到内存中。如果是网格,那么你就可以将内存中的表分发到多个结点上以加快写的速度。如果是个读多写少的小表,那么你可以将其复制到所有结点上,这样读就是个内存中的事情了。无论采用哪种方式,键值存储都值得你好好学习一下。几乎所有的键值存储都可以创建自定义的缓存负载器或是缓存存储,从而实现对RDBMS或是其他数据源的读与写。很多键值存储采用了“稍后写”或是队列写来实现对数据库的写操作。这个领域的典型代表是Couchbase、Memcached、Infinispan与GemFire。 3. 图数据库 从推荐引擎到社交网络和地理分析,再到生物分析,图数据库都带来了极大的便利性。对于传统的RDBMS来说,朋友的朋友这种查询是非常低效的,即便利用最新的特性也没有太大的起色,这是因为其结构就不对。虽然图数据库已经出现了很多年,不过只是最近的数据爆发以及个性推荐等领域才使其变得更加流行。这个领域的典型代表是Neo4j与Apache Giraph。 4. Google Drive/Apps Google Apps是个办公效率套件。我无法想象再回到原来的通过邮件发送附件的那种方式。最近,我们通过基于JavaScript的宏实现了越来越好的自动化。所有的一切都存储在云端,因此我们可以放心地睡觉。除此之外,可扩展性特性意味着只要我们能够访问云端,那么我们就可以将文档直接与其集成,反之亦然。 5. On-premises搜索 我现在还是能看到有很多人在编写着大量的and/or/like等SQL查询,其实这么做不仅会导致严重的性能问题,还会产生不清晰的代码以及不易使用的接口。这时可以看看Google的服务,无论是数据库、文档还是各种文件系统都行。Apache Solr值得你好好看看。 6. PaaS 无论是公有云还是自己的私有云,你都需要手工安装各种操作系统、应用服务器与应用,然后提前选择好将要部署的服务器与VM数量,这是十几年前的做法。PaaS是未来的趋势,能够做到实时伸缩,自动完成重复性的任务。我们所广泛使用的平台有CloudFoundry、CloudBees与OpenShift。 7. 云IDE 前不久,我们全家在打扫壁橱,我9岁的孩子不认识壁橱里面的一个很大的金属盒子到底是什么,那是什么呢?我们在隔壁房间看着我们的孩子。“我不知道,好像是个Dell的什么东西”。我们发现他确实不知道塔式机箱到底是什么,因为自从他出生以来,我们就一直在使用着笔记本(不过他看到过一台1U服务器,因为我们用它做过Hadoop的测试)。我觉得云IDE可以做到一点,那就是让下一代不知道笔记本到底是什么。为何要在硬盘上安装IDE呢?为什么不打开浏览器,然后就开始编码呢?比如说Codenvy或是Cloud9。 8. Hadoop 无论是使用MapReduce进行复杂的分析,抑或只是想做些日志分析和审计日志,Hadoop都是这个行业中最为火热的一个选择。如果你尚未使用Hadoop做过一些试点项目,那么今年就要考虑做做了。如果已经使用过Hadoop,那么我希望你能在今年对Hadoop有更好的了解与掌握。 9. 集群/分布式文件系统 从集群到HDFS,可伸缩性存储是关键。今年,你要重新思考SAN了。至少,如果还没有尝试过可以先做个试水。我预测会有很多混合方式出现。 转自:http://www.infoq.com/cn/news/2014/01/9-popular-technologies-2014
View Details为网页设计师准备的10个在线的HTML5设计工具
1) Google – Web Designer 2) SpriteBox 3) Xray 4) Chrome – Ajax Animation 一个 HTML5 的强大的基于 Web 的动画套件,原本是考虑作为可在线使用的 Flash 替代品,但目前其已经完全支持离线模式。 5) Wix 6) Dunked 7) HTML5 Audio Maker 8) Speakker 9) Sketchtoy 10) SVG to Canvas 转自:http://www.oschina.net/news/47880/great-online-html5-tools-for-web-designers
View Details(转)CSS3 @font-face
http://www.fontsquirrel.com/fontface @font-face是CSS3中的一个模块,他主要是把自己定义的Web字体嵌入到你的网页中,随着@font-face模块的出现,我们在Web的开发中使用字体不怕只能使用Web安全字体,你们当中或许有许多人会不自然的问,这样的东西IE能支持吗?当我告诉大家@font-face这个功能早在IE4就支持了你肯定会感到惊讶。我的Blog就使用了许多这样的自定义Web字体,比如说首页的Logo,Tags以及页面中的手写英文体,很多朋友问我如何使用,能让自己的页面也支持这样的自定义字体,一句话这些都是@font-face实现的,为了能让更多的朋友知道如何使用他,今天我主要把自己的一点学习过程贴上来和大家分享。 首先我们一起来看看@font-face的语法规则: @font-face { font-family: <YourWebFontName>; src: <source> [<format>][,<source> [<format>]]*; [font-weight: <weight>]; [font-style: <style>]; } 取值说明 YourWebFontName:此值指的就是你自定义的字体名称,最好是使用你下载的默认字体,他将被引用到你的Web元素中的font-family。如“font-family:"YourWebFontName";” source:此值指的是你自定义的字体的存放路径,可以是相对路径也可以是绝路径; format:此值指的是你自定义的字体的格式,主要用来帮助浏览器识别,其值主要有以下几种类型:truetype,opentype,truetype-aat,embedded-opentype,avg等; weight和style:这两个值大家一定很熟悉,weight定义字体是否为粗体,style主要定义字体样式,如斜体。 兼容浏览器 说到浏览器对@font-face的兼容问题,这里涉及到一个字体format的问题,因为不同的浏览器对字体格式支持是不一致的,这样大家有必要了解一下,各种版本的浏览器支持什么样的字体,前面也简单带到了有关字体的几种格式,下面我就分别说一下这个问题,让大家心里有一个概念: 一、TureTpe(.ttf)格式: .ttf字体是Windows和Mac的最常见的字体,是一种RAW格式,因此他不为网站优化,支持这种字体的浏览器有【IE9+,Firefox3.5+,Chrome4+,Safari3+,Opera10+,iOS Mobile Safari4.2+】; 二、OpenType(.otf)格式: .otf字体被认为是一种原始的字体格式,其内置在TureType的基础上,所以也提供了更多的功能,支持这种字体的浏览器有【Firefox3.5+,Chrome4.0+,Safari3.1+,Opera10.0+,iOS Mobile Safari4.2+】; 三、Web Open Font Format(.woff)格式: .woff字体是Web字体中最佳格式,他是一个开放的TrueType/OpenType的压缩版本,同时也支持元数据包的分离,支持这种字体的浏览器有【IE9+,Firefox3.5+,Chrome6+,Safari3.6+,Opera11.1+】; 四、Embedded Open Type(.eot)格式: .eot字体是IE专用字体,可以从TrueType创建此格式字体,支持这种字体的浏览器有【IE4+】; 五、SVG(.svg)格式: .svg字体是基于SVG字体渲染的一种格式,支持这种字体的浏览器有【Chrome4+,Safari3.1+,Opera10.0+,iOS Mobile Safari3.2+】。 这就意味着在@font-face中我们至少需要.woff,.eot两种格式字体,甚至还需要.svg等字体达到更多种浏览版本的支持。 为了使@font-face达到更多的浏览器支持,Paul Irish写了一个独特的@font-face语法叫Bulletproof @font-face:
1 2 3 4 5 |
@font-face { font-family: 'YourWebFontName'; src: url('YourWebFontName.eot?') format('eot');/*IE*/ src:url('YourWebFontName.woff') format('woff'), url('YourWebFontName.ttf') format('truetype');/*non-IE*/ } |
但为了让各多的浏览器支持,你也可以写成:
1 2 3 4 5 6 7 8 |
@font-face { font-family: 'YourWebFontName'; src: url('YourWebFontName.eot'); /* IE9 Compat Modes */ src: url('YourWebFontName.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('YourWebFontName.woff') format('woff'), /* Modern Browsers */ url('YourWebFontName.ttf') format('truetype'), /* Safari, Android, iOS */ url('YourWebFontName.svg#YourWebFontName') format('svg'); /* Legacy iOS */ } |
说了这么多空洞的理论知识,大家一定有点心痒痒了,那么我们先来看看W3CPLUS首页中导航部分的兰色字体是如何实现的,假如我们有一个这样的DOM标签,需要应用自定义字体: HTML Code: <h2 class="neuesDemo">Neues Bauen Demo</h2> 通过@font-face来定义自己的Web Font: @font-face { font-family: 'NeuesBauenDemo'; src: url('../fonts/neues_bauen_demo-webfont.eot'); src: url('../fonts/neues_bauen_demo-webfont.eot?#iefix') format(’embedded-opentype'), url('../fonts/neues_bauen_demo-webfont.woff') format('woff'), url('../fonts/neues_bauen_demo-webfont.ttf') format('truetype'), url('../fonts/neues_bauen_demo-webfont.svg#NeuesBauenDemo') format('svg'); font-weight: normal; font-style: normal; } 我在这里采用的是相对路径,当然大家也可以使用绝路径。到这里我们就需要把定义好的字体应用到我们实际页面中去: h2.neuesDemo { font-family: 'NeuesBauenDemo' } 效果: 看到上面的效果,我想大家会感到@font-face很神奇,同时也想争着做做看,可是一动手才发现,特殊字体我要怎样才能得到,那些.eot,.woff,.ttf,.svg这些字体格式又怎么获取呢?有些朋友可能就不知道如何运手了,那么我们就带着这些问题来一个全程完成的实例吧: 一、获取特殊字体: […]
View Details2014 年十大网页设计趋势和预测
新的一年刚刚开启, Zing 设计团队认为这是一个很好的时间来回顾 2013 年 web 的设计场景,同时也对 2014 的 web 设计趋势做了些分析,总结出了十大网页设计趋势和预测,希望能给大家一些启发:) 1. 大背景图片 大背景图片(Large hero areas),是从印刷设计中借来的专业术语,指包含少量文字内容、位于网站顶部的图片。在很多网站上,你可以发现现 在 web 设计师们放弃曾经喜欢滑块轮播设计风格,转向了大背景图片设计风格,以大标题为中心,并配以简单模糊的图片为背景,有的则是精心设计的插图,可以前往Lateral inc 和 Focus Lab 查看漂亮的典型示例。 从滑块轮播到大背景图片的转换最大的原因就是大背景图片更能抓住用户的注意力,吸引他们继续探索网站的其他页面。这个趋势越来越流行,并且没有丝毫停顿的节奏,这必将是 2014 年 web 设计的潮流与大趋势! 2. 更多视频内容 越来越多的网页使用视频替代文字去诠释新技术新概念,随着 YouTube 和 Kickstarter 越来越流行,互联网用户也更倾向于观看视频而不是阅览文字。有更好的方式为什么不去使用?视频提供独特的文字和图片组合,能在短时间内更好的传达新的想 法。很重要的一点,视频也能帮助提升在搜索引擎的排名,例如 Google。 有人会说,视频会消耗很多内存空间和流量,但是当今科技发展迅速,带宽限制在不断提高,允许快速的下载和提供大量的流量。所以就目前而言,视频绝对是 2014 年持续增长的趋势。同时,另外一个有趣的地方是,很多网站已经趋向于自己保管,管理和控制视频,而不再是依赖于 youtube 上面的视频了。 3. 扁平化 UI 设计 她的大名就是摇晃,这么说当然有充分的理由。扁平化 UI 设计拿到了 skeuomorphic design 的宝座,这是一个新数字世界的入门指引。现在我们理解了庞大的互联网世界是怎么工作的,我们就需要抛开废弃的东西——现在是时候抛开一切外物来单纯的讨论根源了。 扁平化 UI 也许是跳过 skeuomorphic 时期的开发者第一次接触的 web 设计风格。大多数是通过 iPad 或者是电子阅读器来接触扁平化 UI 设计的,也可能是当他们拿到他们的第一部智能手机的时候,就如同 UX 和 UI 设计者知道也确信新用户可以在应用商店接触到扁平化的设计。 去年,曾预测Apple将会动摇其拟真设计(Skeuomorphism)。iOS7的发布带来了所谓的“扁平化设计”,该设计丢弃了阴影及渐变效果,使 某些元素获得了视觉上的升级。 长期以来,Apple一直引领着设计的时代潮流,它所做的任何事情,都会引来世界的追随。iOS7发布不久,每天都会有很多具有“扁平化设计”风格的网站 上线。早期的扁平化 UI 设计开始时有很多创新的空间,所以在 2014 年,我们预测 web 设计风格将会更直观,简单,界面平面化! 4. 更简单的导航和空白使用 扁平化 UI 设计的引入给网站创建了空白的区域,没错,就是空白。空白空间提供了清晰简洁的风格,使网页更容易保留,而且提高可读性。这里是一些很受欢迎的空白使用示例: Exposure, Hello Monday 和FoundryCo. 创建这些空白空间的时候,我们也注意到了页面导航和侧边栏。页面导航会变得更简单,侧边栏可能会在某些时候被放弃。设想一下:你正在阅读一篇整齐、悦目, 没有任何其他干扰信息的文章。设计师通过去除那些分散用户注意力及扩展性的内容,努力打造更愉悦的阅读体验。这种是一种极受欢迎的改变,一种用户期望继续 保持的趋势。在 2014 年,我们预测更多的网页将会变得更简洁并且会更好的使用空白区域。 FoundryCo 的白色空间使用 5. 朴素的视差效果 web 视差效果设计创建了一种 […]
View Detailsjs数学函数
Math.ceil求最小的整数但不小于本身. Math.round求本身的四舍五入。 Math.floor求最大的整数但不大于本身. js全屏代码:window.open("full_window.htm","","fullscreen,scrollbars") Math.E 自然对数的底(为常数) 2.718 Math.LN10 10的自然对数 2.302 Math.LN2 2的自然对数 0.693 Math.PI 圆周率 3.1415 Math.SQRT1_2 1/2的平方根 0.707 Math.SQRT2 2的平方根 1.414 Math.sqrt(x) X的平方根 更X的值有关 Math.pow(x, n) 返回x的n次方的数值 参数为x和n Math.log(n) 返回n的自然对数 参数为n Math.exp(n) 返回e的n次方的数值 参数为n 三角函数 Math.cos(x) X的余弦函数 Math.sin(x) X的正弦函数 Math.tan(x) X的正切函数 Math.acos(y) X的反余弦函数 Math.asin(y) X的反正弦函数 Math.atan(y) X的反正切函数 这里注意:参数x和以及反函数的返回数值的单位都为弧度(比如 PI弧度=180度) 舍入函数和随机数字 Math.random() 产生从0到1的随机数 Math.round(x) 取最接近整数x的数值 Math.floor(x) 取最接近整数x并且比x小的数值 Math.ceil(x) 取最接近整数x并且比x大的数值 Math.min(a, b, c) 返回参数列表中最小的数值 Math.max(a, b, c) 返回参数列表中最大的数值
View Details亚马逊公有云落地中国 阿里、腾讯等迅速降价
亚马逊公有云落地中国 阿里、腾讯等迅速降价 本报记者纪佳鹏北京报道 12月18日,亚马逊公有云服务AWS(AmazonWebServices)宣布即将推出中国云计算平台。中国是AWS在亚太地区的第4个区域,全球的第10个区域。这意味着长期传闻入华的亚马逊AWS正式在国内落地。 而就在AWS落地中国的同一天,IBM也宣布与世纪互联合作将其云计算基础架构服务SCE+((SmartCloudEnterprise+)正式引入中国。 12月18日,微软也正式宣布联想成为中国首家微软CloudOS战略合作伙伴,联想将使用基于微软WindowsServer及Hyper-V、SystemCenter和WindowsAzurePack的微软云平台对外提供服务,成为中国首家微软CloudOS战略合作伙伴。 国内本地云计算服务提供商也坐不住了。 阿里云当天推出了“阿里云1218”活动,阿里云全线产品降价,最高降幅50%。金山推出了挖矿云主机,限量免费送,12月18日11点开抢。 12月19日,腾讯云的年终大促即将盛大开启。据消息人士透露,腾讯云此次会在云服务器、IDC带宽等服务上给予开发者前所未有的惊喜折扣,这意味着开发者可以用更低的成本去使用腾讯云。 一时间,云服务市场好不热闹。 亚马逊AWS落地中国 亚马逊方面表示,为了更好地落地中国,并遵守中国的相关法律和监管要求,亚马逊AWS中国采用了“多伙伴策略”来提供云计算服务。 一方面,北京市政府、宁夏自治区政府和亚马逊AWS、宽带资本旗下的云基地签署合作谅解备忘录,通过位于北京和宁夏的云计算基础设施为中国各地客户提供云服务;另一方面,亚马逊AWS也已经和光环新网和网宿科技合作,将为亚马逊提供必要的互联网数据中心服务和互联网接入服务,包括基础架构、带宽和网络功能。 亚马逊方面负责AWS在中国的业务发展的全球副总裁容永康表示,通过与北京和宁夏两地政府合作,亚马逊成为第一个参与到“前店后厂”的云服务厂商。容永康称,AWS是最早实践云计算服务的厂商,会将优质的技术资源带入中国,并会在中国市场长期扎根发展。 据了解,亚马逊AWS入华的消息此前一直都有传闻,但是每次都没有真正得到落实。最近一次是在今年年初,据了解当时亚马逊在中国招聘的AWS员工,而且开始游说一些企业购买亚马逊AWS服务,不过这些服务只能通过亚马逊位于海外的数据中心提供。 据介绍,包括小米、奇虎360、金山软件等数千家中国企业的海外分公司已经开始使用AWS服务。“客户在开拓在国际市场的同时,亚马逊也在不断加强对中国市场的客户需求的理解。”容永康说。 国外成熟的公有云服务提供商一直垂涎于中国市场,但是由于资质、监管等问题一直无法真正落地中国。直到去年11月1日,微软宣布与国内互联网基础设施服务提供商世纪互联达成合作,实现微软企业级云服务——Office365和WindowsAzure在中国的落地,这是国外云服务上落地中国的首个案例。据悉,其合作方式是,微软向世纪互联授权技术,由后者运营这两项服务。 紧接着,SAP和IBM也同样借道进入中国,提供公有云服务。虽然此次亚马逊方面没有透露更多的落地细节,孙永杰表示,基于国内对外资企业进入中国进行公有云服务,政策方面监管严格,亚马逊方面或许也是像其他国外等云服务提供商入华一样的路径。 国内云计算将激战 事实上,自从2006年推出云计算服务以来,由于竞争策略出色,亚马逊在此项业务中规模扩张迅速,并在行业中遥遥领先,硅谷创业公司中约90%使用亚马逊的云计算服务。 据市场研究公司Synergy估计,亚马逊第四季度云计算的营收将超过7亿美元,这意味着亚马逊将比其他所有主要云计算服务提供商,包括微软、IBM、谷歌等的营收总和还高15%。 “作为一个在行业内重量级的云计算服务提供商,AWS入华将让国内其他企业也加速发展,这有利于市场更加良性发展。”AWS在中国的合作伙伴——网宿科技(300017.SZ)副总裁刘洪涛接受21世纪经济报道记者独家专访时表示,网宿科技与亚马逊合作的谈判前后持续了三四年。网宿科技主要为AWS等云计算平台的客户提供CDN服务和IDC服务,保证云平台良好的用户体验。 在AWS宣布落地中国的同时,IBM、微软、阿里巴巴等竞争对手也在同一天推出了不同的促销策略以及宣布与其他企业的战略合作,有分析认为,各大厂商都在阻击亚马逊入华。 IT产业分析师孙永杰表示,目前国内企业真正将大多数预算放到云计算上面还比较少,市场的接受度目前还比较低,这对于对所有企业而言大家的机会基本上是均等的。 业内人士告诉21世纪经济报道记者,AWS所提供的是大而全的公有云服务,其服务产品丰富;而国内的云服务提供商包括腾讯、百度、阿里等公司都基于自己的公司特点搭建生态圈,腾讯是依赖庞大的高黏度客户,帮助合作伙伴进行推广,纵深发展客户;而百度终端客户流量大,云盘做得出色,阿里云则是基于自己建立的电商体系下的平台,通过技术的积累而发展。 “AWS落地中国也需要与其他企业同台竞技,包括价格竞争、市场教育和宣传营销的落实等。”孙永杰说,亚马逊的云服务有价格优势,性价比强,但是作为一家互联网企业,对于有些企业对更加复杂的云服务的需求,不是像IBM这种精于服务企业级的IT公司那样在行。 “AWS产品大而全,但是无法覆盖中国这么大的市场,大家都是同一起跑线上竞争,挖掘这个市场。”上述业内人士对21世纪经济报道记者说。(编辑卢爱芳) 转自:http://www.chinaz.com/news/2013/1219/331826.shtml
View DetailsJAVA坏境变量中的JAVA_HOME path classpath 的设置与作用
今天再次设置java的环境变量,突然发现每次设置都只是按照步骤一步步将其设置完,并不了解为啥要设置,于是上网找了找,找到遍文章,觉得不错,就留下了。 仅供记录学习。转自:http://bbs.tech.163.com/bbs/tech_0ik1/147645925.html 在把jdk安装到计算机中之后,我们来进行设置使java环境能够使用。 首先右键点我的电脑。打开属性。然后选择“高级”里面的“环境变量”,在新的打开界面中的系统变量需要设置三个属性“JAVA_HOME”、 “path”、“classpath”,其中在没安装过jdk的环境下。path属性是本来存在的。而JAVA_HOME和classpath是不存在 的。 一:点“新建”,然后在变量名写上JAVA_HOME,顾名其意该变量的含义就是java的安装路径,呵呵,然后在变量值写入刚才 安装的路径“C:\jdk1.6”。(注:如果安装的路径不是磁盘C或者不是在jdk1.6这个文件夹,可对应修改。以下文字都是假定安装在C: \jdk1.6里面。) 二:其次在系统变量里面找到path,然后点编辑,path变量的含义就是系统在任何路径下都可以识别java命令,则 变量值为“.;%JAVA_HOME%\bin”,(其中“%JAVA_HOME%”的意思为刚才设置JAVA_HOME的值),也可以直接写上“C: \jdk1.6\bin” 三: 最后再点“新建”,然后在变量名上写classpath,该变量的含义是为java加载类(class or lib)路径,只有类在classpath中,java命令才能识别。其值为“.;%JAVA_HOME%\lib \dt.jar;%JAVA_HOME%\lib\toos.jar (要加.表示当前路径)”,与相同“%JAVA_HOME%有相同意思” 以 上三个变量设置完毕,则按“确定”直至属性窗口消失,下来是验证看看安装是否成功。先打开“开始”-> “运行”,打入“cmd”,进入dos系统界面。然后打“java -version”,如果安装成功。系统会显示java version jdk"1.6.0"。 确保安装在C盘文件名为jdk1.6,环境变量直接复制就可以了,在dos界面中输入javac来查看该命令是否合法,同样输入java来查看该命令是否合法 这样环境变量就设置好了,下面进行对PATH,CLASSPTH,JAVA_HOME的讲解 以下为设置JAVA_HOME,CLASSPATH,PATH的目的: 1.设置JAVA_HOME: 一、为了方便引用,比如,你JDK安装在C:\Program Files\Java\jdk1.6.0目录里,则设置JAVA_HOME为该目录路径, 那么以后你要使用这个路径的时候, 只需输入%JAVA_HOME%即可, 避免每次引用都输入很长的路径串; 二、归一原则, 当你JDK路径被迫改变的时候, 你仅需更改JAVA_HOME的变量值即可, 否则,你就要更改任何用绝对路径引用JDK目录的文档, 要是万一你没有改全, 某个程序找不到JDK, 后果是可想而知的—-系统崩溃! 三、第三方软件会引用约定好的JAVA_HOME变量, 不然, 你将不能正常使用该软件, 以后用JAVA久了就会知道, 要是某个软件不能正常使用, 不妨想想是不是这个问题. 2.设置CLASSPATH: 这 是一个很有趣,当然也比较折磨初学者的问题, 这个变量设置的目的是为了程序能找到相应的".class"文件, 不妨举个例子: 你编译一个JAVA程序—A.java, 会得到一个A.class的类文件,你在当前目录下执行java A, 将会得到相应的结果(前提是你已经设置CLASSPATH为"."). 现在, 你把A.class移到别的目录下(例如:"e:\"), 执行java A, 将会有NoClassDefFindError的异常,原因就是找不到.class文件, 现在你把CLASSPATH增加为:".;e:\"再运行java A, 看看会有什么结果~~:)~~~, 一切正常, java命令通过CLASSPATH找到了.class文件! 3.设置PATH: 道理很简单, 你想在任何时候都使用%JAVA_HOME%\bin\java 等来执行java命令吗, 当然不会, 于是, 你可以选择把 %JAVA_HOME%\bin添加到PATH路径下, 这样, 我们在任何路径下就可以仅用java来执行命令了.(当你在命令提示符窗口输入你个代码时,操作系统会在当前目录和PATH变量目录里查找相应的应用程 序, 并且执行. 转自:http://www.cnblogs.com/kevinlocn/archive/2009/10/12/1581855.html
View Details在Access中执行SQL语句
Access在小型系统开发中等到了广泛使用。虽然Access提供了可视化的操作方法,但许多开发人员还是喜欢直接用SQL语句操作数据表。如何在Access中打开SQL视图,对于初次使用Access的程序员可得费点时间呢。 1、ACESS2007 (1)点击“创建”--点击 “查询设计” (2)点击关闭 (3)点击左上角的"SQL视图"就可以打开SQL窗口了 2、ACCESS 2003 (1)点击对象里的“查询” (2)点击 “在设计视图创建查询” ,再点击“关闭” (3)再点击 左上角的"sql" (4)就可以输入sql语句了 3、Access里like语句通配符 Access里like的通配符用法是这样:“?”表示任何单一字符;“*”表示零个或多个字符;“#”表示任何一个数字。如: select * from tablename where fieldname like '*沙洲*' 拣尽寒枝不肯栖,寂寞沙洲。 转自:http://www.cnblogs.com/zhouhb/archive/2011/07/22/2114344.html
View DetailsWinForm UI 多线程 (线程间操作无效)
一个简单的Form, 按钮btnTest是enabled=false。在btnEnable的Click事件中 创建线程,在线程中尝试设置btnTest.Enabled = true; 发生异常:线程间操作无效: 从不是创建控件“btnTest”的线程访问它。 代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
1 using System; 2 using System.Threading; 3 using System.Windows.Forms; 4 5 namespace TestingUIThread 6 { 7 public partial class Form1 : Form 8 { 9 Thread thread = null; 10 11 public Form1() 12 { 13 InitializeComponent(); 14 } 15 16 private void btnEnable_Click(object sender, EventArgs e) 17 { 18 thread = new Thread(new ParameterizedThreadStart(EnableButton)); 19 thread.Start(null); 20 } 21 22 private void EnableButton(object o) 23 { 24 // following line cause exception, details as below: 25 //Cross-thread operation not valid: Control 'btnTest' accessed from a thread other than the thread it was created on. 26 btnTest.Enabled = true; 27 btnTest.Text = "Enabled"; 28 } 29 } 30 } |
在默认情况下,C#不准许在一个线程中直接访问或操作另一线程中创建的控件,这是因为访问windows窗体控件本质上是不安全的。 线程之间是可以同时运行的,那么如果有两个或多个线程同时操作某一控件的某状态,尝试将一个控件变为自己需要的状态时, 线程的死锁就可能发生。 为了区别是否是创建该控件的线程访问该控件,Windows窗体控件中的每个控件都有一个InvokeRequired属性,这个属性就是用来检查本控件是否被其他线程调用的属性,当被创建该线程外的线程调用的时候InvokeRequired就为true。有了这个属性我们就可以利用它来做判断了。 光判断出是否被其他线程调用是没有用的,所以windows窗体控件中还有一个Invoke方法可以帮我们完成其他线程对控件的调用。结合代理的使用就可以很好的完成我们的目标。 上面问题的解决方法: 方法一: public Form1() { InitializeComponent(); CheckForIllegalCrossThreadCalls = false; } // // Summary: // Gets or sets a value indicating whether to catch calls on the wrong thread // that access a control’s System.Windows.Forms.Control.Handle property when // an application is being debugged. // // Returns: // true if calls on the wrong thread are caught; otherwise, false. [EditorBrowsable(EditorBrowsableState.Advanced)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] [SRDescription("ControlCheckForIllegalCrossThreadCalls")] [Browsable(false)] public static bool CheckForIllegalCrossThreadCalls { get; set; } 方法二:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
1 using System; 2 using System.Threading; 3 using System.Windows.Forms; 4 5 namespace TestingUIThread 6 { 7 public partial class Form1 : Form 8 { 9 Thread thread = null; 10 11 public Form1() 12 { 13 14 InitializeComponent(); 15 } 16 17 private void btnEnable_Click(object sender, EventArgs e) 18 { 19 thread = new Thread(new ParameterizedThreadStart(EnableButton)); 20 thread.Start(null); 21 } 22 23 private void EnableButton(object o) 24 { 25 EnableButton(); 26 } 27 28 private delegate void EnableButtonCallBack(); 29 30 private void EnableButton() 31 { 32 if (this.btnTest.InvokeRequired) 33 { 34 this.Invoke(new EnableButtonCallBack(EnableButton)); 35 } 36 else 37 { 38 btnTest.Enabled = true; 39 btnTest.Text = "Enabled"; 40 } 41 } 42 } 43 } |
方法三: 通过ISynchronizeInvoke和MethodInvoker.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
1 using System; 2 using System.ComponentModel; 3 using System.Threading; 4 using System.Windows.Forms; 5 6 namespace TestingUIThread 7 { 8 public partial class Form1 : Form 9 { 10 Thread thread = null; 11 12 public Form1() 13 { 14 InitializeComponent(); 15 } 16 17 private void btnEnable_Click(object sender, EventArgs e) 18 { 19 thread = new Thread(new ParameterizedThreadStart(MyEnableButton)); 20 thread.Start(null); 21 } 22 23 private void MyEnableButton(object sender) 24 { 25 ISynchronizeInvoke synchronizer = this; 26 27 if (synchronizer.InvokeRequired) 28 { 29 MethodInvoker minvoker = new MethodInvoker(this.EnableButton); 30 synchronizer.Invoke(minvoker, null); 31 } 32 else 33 { 34 this.EnableButton(); 35 } 36 } 37 38 private void EnableButton() 39 { 40 btnTest.Enabled = true; 41 btnTest.Text = "Enabled"; 42 } 43 } 44 } |
[…]
View DetailsC#多线程退出程序C#程序的几种退出
C#程序的几种退出 1.Application.Exit(); //好像只在主线程可以起作用,而且当有线程,或是阻塞方法的情况下,很容易失灵 2.System.Environment.Exit(0); //无论在主线程和其它线程,只要执行了这句,都可以把程序结束干净 3.this.Close(); 4.Application.ExitThread(); msdn 对前台线程和后台线程的解释:托管线程或者是后台线程,或者是前台线程。后台线程不会使托管执行环境处于活动状态,除此之外,后台线程与前台线程是一样的。一旦所有前台线程在托管进程(其中 .exe 文件是托管程序集)中被停止,系统将停止所有后台线程并关闭。通过设置 Thread.IsBackground 属性,可以将一个线程指定为后台线程或前台线程。例如,通过将 Thread.IsBackground 设置为 true,就可以将线程指定为后台线程。同样,通过将 IsBackground 设置为 false,就可以将线程指定为前台线程。从非托管代码进入托管执行环境的所有线程都被标记为后台线程。通过创建并启动新的 Thread 对象而生成的所有线程都是前台线程。如果要创建希望用来侦听某些活动(如套接字连接)的前台线程,则应将 Thread.IsBackground 设置为 true,以便进程可以终止。 所以解决办法就是在主线程初始化的时候,设置: Thread.CurrentThread.IsBackground = true; 这样,主线程就是后台线程,在关闭主程序的时候就会关闭主线程,从而关闭所有线程。 但是这样的话,就会强制关闭所有正在执行的线程,所以在关闭的时候要对线程工作的结果保存。
View Details