Sections:
|
面向对象的三个基本特征 UML图例说明对象的关系
参考知识: 4.1、关于Syncml
SyncML是一种唯一行业通用的移动数据同步化协议,由SyncML initiative发行,是一种开放性协议。SyncML协议的目的是解决移动设备和网络之间的数据同步和设备管理问题。在SyncML之前,数据同步 和设备管理是基于各种私有协议实现的,每种协议只能支持有限的设备和数据类型。各种协议间不能互通,这就限制了用户的数据访问、传输和移动性。 SyncML的主要目的有两方面:
4.3、SyncML Protocol Architecture ![]() Web 前端优化最佳实践之 JavaScript 篇
作者: Fenng | 可以转载, 转载时务必以超链接形式标明文章原始出处和作者信息及版权声明
网址: http://www.dbanotes.net/web/best_practices_for_speeding_up_your_web_site_javascript.html Web 前端优化最佳实践之 JavaScript 篇,这部分有 6 条规则,和 CSS 篇 重复的有几条。前端优化最佳实践,最重要的还是"实践",要理解这东西容易得很,关键是要去"实践",去"执行",去"反馈",去获取受益。 1. 脚本放到 HTML 代码页底部 (Put Scripts at the Bottom)当一个脚本在下载的时候,浏览器干不了其它的事儿(串行了)。所以,把它扔到最后面去处理。对于一些功能性的脚本,可能实现起来有些两难。不过对于国内网站来说,有很多使用 Google Analytics 服务进行网站数据分析的。这这一点来说,绝对可行的建议,放到页面最底下。 2. Make JavaScript and CSS External参见 CSS 篇的描述 3. 精简 JavaScript 与 CSS (Minify JavaScript and CSS)参见 CSS 篇的描述 4. 移除重复脚本 (Remove Duplicate Scripts)对于一些历史遗留站点或是论坛类的网站来说,这倒是比较常见的。接手维护人前后变化过多,每个人都有自己的一套。这就会带来一些潜在的麻烦。 5. 减少 DOM 访问 (Minimize DOM Access)有三条指导建议:
6. Develop Smart Event Handlers除了英文解释外,这里也提醒一下注意关于 Java Script 内存泄漏的问题。 另外推荐一篇《如何优化 JavaScript 脚本的性能》,关于 Ajax 优化指导原则,可以参见 提高 Ajax 应用程序性能,避开 Web 服务漏洞。 后记1) :整理得差不多之后,发现网络上已经有一篇 《Yahoo!网站性能最佳体验的34条黄金守则》,是翻译稿。看来我做了一部分重复劳动。 后记 2):CSS / JavaScript 都有优化规则。但似乎缺少了对 Flash 的优化实践。 --EOF-- #ifconfig eth0:0 192.168.0.1 netmask 255.255.255.0 up
#ifconfig eth0:1 192.168.0.2 netmask 255.255.255.0 up #ping 192.168.0.1 #ping 192.168.0.2 ping测试通过,就完成了单网卡配置多ip的功能。reboot以后发现ip地址变了回去。 所以必须设置启动时自动激活ip设置 第一种: 将上边的命令ifconfig加入到rc.local中去 第二种: 就是仿照/etc/sysconfig/network-scripts/ifcfg-eth0增加一文件根据网络虚拟接口的名字进行命名 例如ifcfg-eth0:0或者ifcfg-eth0:1等等 #下边看下ifcfg-eth0:0文件里面的配置信息 DEVICE=eth0:0 #网络虚拟接口eth0:0 ONBOOT=yes #启动的时候激活 BOOTPROTO=static #使用静态ip地址 IPADDR=192.168.0.1 #分配ip地址 NETMASK=255.255.255.0 #子网掩码 其他配置文件类似。重启ping测试,配置成功。 今天看了别人的没看明白自己试了试才知道具体如何操作。 如何关闭一个ip呢则使用 #ifconfig eth*[:x] down(*代表的是网卡编号,x代表虚拟接口号0-255) 查看ip配置信息: #ifconfig btw:用netconfig更方便啊!!!!!!!!!!!! 请问斑竹设置这样的多个IP有什么用处?
评论让Java程序作为linux的Daemon后台运行 - log4deng - BlogJava
www.blogjava.net/qiyadeng/archive/2008/04/11/29171... 因为需要对网络环境进行监控,做了个Java程序在linux服务器上运行。但是每次重新启动的时候都要手动的运行,这样就不太现实。所以想到把Java程序做成像Windows的系统服务那样,开机就会自动在后台运行。以前使用过一个工具http://javaservice.objectweb.org/,可以把Java程序注册成为Windows的系统服务,而且使用起来很简单,但是遗憾的是该工具不能注册linux的后台服务。所以不得不另外寻找工具。
最后找到了JavaService Wrapper(http://wrapper.tanukisoftware.org/doc/english/introduction.html),该工具能在很多中平台下面注册为系统服务(查看支持平台)。该工具使用方法有三种模式,我用的是第一种WrapperSimpleApp帮助类,另外的两种方式都需要在原来的程序上进行适当的编码。下面就用我的程序NetWatchDog为例子说明下大概的配置步骤。(其实文档中已经用Jboss进行了演示)
1.建立一个目录名为NetWatchDog,并在该目录下建立bin,lib,conf,logs目录。以下把NetWatchDog目录称为$DOG_HOME。 2.把下载来的文件解压,把$WRAPPER_HOME/bin/wrapper,$WRAPPER_HOME/src/bin/sh.script.in文件copy到$DOG_HOME/bin目录中。 3.把sh.script.in文件该名为你的服务名称,这里改为NetWatchDog。 4.编辑NetWatchDog,把Application的相关信息改为如下:
5.把你的程序的打包成jar文件,拷贝到$DOG_HOME/lib目录下,并把$WRAPPER_HOME/lib/libwrapper.so,$WRAPPER_HOME/lib/wrapper.jar文件也拷贝到$DOG_HOME/lib目录下面。 6.这步比较重要是成败的关键,把$WRAPPER_HOME/conf/wrapper.conf文件拷贝到$DOG_HOME/conf目录下(文档上面说的是wrapper.conf.in文件,但是我下载来的文件就是wrapper.conf,所以步需要改名的)。 7.编辑wrapper.conf文件:
8.这样基本就大功告成了,现在可以运行命令./NetWatchDog start,如果提示权限不够就用chmod 755 NetWatchDog命令改变权限。如果没出现错误提示,这样基本上就正确了。 3
通过蓝牙在Ubuntu上同步Palm Treo650 - Ubuntu - 红联Linux论坛 全球Linux人网上交流平台 - 天下没有难学的Linux
www.linuxdiyf.com/bbs/redirect.php?tid=82406&goto=... 通过蓝牙在Ubuntu上同步Palm Treo650我在自己的Thinkpad T43本子上装了内置蓝牙芯片BMDC3,并且在Ubuntu Gusty操作系统上将蓝牙配置成功。购买蓝牙芯片的主要目的是——装酷!恩,就类似于不用一次性打火机而非要买个ZIPPO努力表现的很小资一样(嘿嘿,说的也是我自己)。其次的原因是,我爱死这台treo 650了,对treo 650深深的爱恋和对中国移动的刻骨仇恨促使我入手BMDC芯片——我的计划是,用t43笔记本以wi-fi功能连接办公室的无线路由,再用treo的蓝牙功能连t43的蓝牙适配器,在treo上安装skype软件,通过skype给老爸老妈打长途,费用大概是0.17RMB/min,若是购买套餐的话就更加便宜了,每分钟要比17951拨打国内长途足足便宜0.03RMB!(当然,这个理由你千万别相信,恩) 前面的拆开T43机器卸下moden芯片、安装bmdc3蓝牙芯片、调整数据线之类的工作就不多做介绍了,会在以后心情好的时候介绍一下。现在只是假设如下的情况: 笔记本上已经安装了蓝牙硬件,并且在ubuntu下配置成功; t43的蓝牙和treo的蓝牙都已经打开 那么,下面开始乱入正题: 一、在ubuntu笔记本上的设置: 首先是要修改蓝牙属性: sduo vim /etc/default/bluetooth (我搜索的一些资料中提示这个文件应该是在 /etc/default/bluez-utils。但无论如何都找不到,看了更多的文档之后才知道,原来现在已经变成/etc/default/bluetooth了) 将其中这两段代码修改如下: DUND_ENABLED=1 DUND_OPTIONS="--listen --persist --msdun call treo" 其中的treo是我们假设将要在ubuntu系统中给手机连接起的名字,它可以是符合linux系统明明规则的任何名字,你可以按照自己的喜好来设置,比如chenshuibian之类的。 然后是修改/etc/ppp/peers/treo文件,其作用是建立一个拨号连接treo650和t43笔记本的脚本,如果你在前面将手机连接命名为chenshuibian,那么这里就是指向/etc/ppp/peers/chenshuibian 我们可以看到如下几行: 115200 192.168.1.1:192.168.1.2 local ms-dns 202.120.190.208 noauth debug 其中,115200是该连接允许的最大流量,192.168.1.1是计算机的网关ip地址,192.168.1.2是为treo设置的ip地址,诸位可以根据自己的喜好来设置,只要确保它们二者处于同一个网端就可以了。ms-dns和t43设置使用的dns一样就可以,这里我填写的是我所在网络的地址 再看看这个文件,$sudo cat /etc/bluetooth/hcid.conf 如果其中有auth enable和encrypt enable的,就将这两行注释掉。 重新起动t43的蓝牙服务 sudo /etc/init.d/bluetooth restart 二、好,随后进入到在treo上的设置: 控制台——参数设定——其他——连接(假设你已经将treo汉化了)——新增 “名称”随意起吧,我用的是BT,bluetooth的简称(或者变态?) “连接到”PC “经由”bluetooth “设备”地方按一下屏幕,进入搜索界面,在“选一个设备”中选择这台打开了蓝牙功能的笔记本,确定 “详情”——“速度”设置为115.200bps,“流量控制”设“自动”即可 确定 确定 还是在控制台中,通讯——网络,打开“修改”,即让屏幕左下方红色锁住模样的锁头变成绿色打开模样的锁头。 “连接”处选择BT “用户名称”BT “密码”不要设置 详情——“后备”一定要设置成无,免得treo到时候一旦连接蓝牙失败,跳过wifi直接gprs或wap上网去了,白白给移动联通送钱。“闲置间断时间”1或3分钟均可。再选择“高级”——在“IP地址”和“查询DNS”后面都选上勾,这样连接到t43的时候就会自动被/etc/ppp/peers/treo脚本授予192.168.1.2的ip地址和202.120.190.208的dns。 确定,确定,在“服务”处随便填个名字,容易区分即可。我写的是“Notebook”。 “连接”一下,看看能否成功。若出现“连接建立”的字样,表示这一步也成功了。 三、在treo上设置hotsync: 打开hotsync,“选项”部分中: 调制解调器同步参数设定——选择“网络” 局域网同步参数设定——本机HotSync 主PC机设定:名字留空,地址填入192.168.1.1,子网掩码255.255.255.0 连线设定:BT 回到hotsync的主界面,选择“调制解调器”,在大图标下方选择”Notebook”,按一下大图标试试看? treo屏幕上跳出“与桌上设备连线使用Notebook”字样。。。。。。 。。。。。。。。。 。。。。。。。。 连不上??!! 当然了,笔记本上还没装同步软件呢:) 四、t43上安装jpilot: 没什么可说的,jpilot还算不错,欢迎使用:) 若是此前ubuntu没有安装jpilot的话 sudo apt-get install jpilot alt+f2,输入jpilot,回车,进入jpilot界面 文件——用户名输入Handspring,没办法,很多软件都是用这个名字安装的,如果用其他名字,同步完成后treo里的软件还要一个个的重新注册,太麻烦 文件——首选项。字符集选择UTF:Simplified Chinese (GBK)。否则Jpilot同步后会变成乱码。捎带着说一句,建议把联系人中的名字都设置成英文,比如王小二在联系人中保存为Wang Xiaoer,在备注里输入他的中文名字王小二即可。这样可以省去很多英文软件中无法正常显示中问的麻烦。 还是在文件——首选项中,设置——串行接口部分填入net:any,以使jpilot通过蓝牙网络寻找treo 其他jpilot设置就自己看着玩吧 五、连接T43和treo: 在jpilot上点一下hotsync按钮(快捷键ctrl+y),jpilot的命令行中出现如下字样 **************************************** 正在与设备 net:any 同步 现在请按 HotSync 键 **************************************** 此时再回到手机上,按hotsync同步之 若Jpilot出现如下字样: 用户名是“Handspring”" 用户 ID 是 1490960081 上次同步的PC = 773979359 这部 PC = 773979359 正在进行快速同步。 treo上也有同步时的音乐声和“正在同步***”的字样,那么恭喜,你得到它了! 明天再研究一下如果让treo通过t43的wifi网络上网 谷歌李开复:我的传奇人生源于十句箴言
一个成功的人如何定义成功?一个成功的人如何从成功中获得启发?这个命题无疑会让许多人充满了悬念与期待.2008年11月30日下午,北京青年报大厦的 20层大会议室迎来了北青教育大讲堂活动开办以来最爆满的盛况,谷歌全球副总裁、大中华区总裁李开复的到来,让许多人对于成功的定义有了崭新的认识.
在 这个下午,谷歌大中华区总裁李开复用平实而不失幽默的语言,讲述了自己成长中的很多故事.和许多人的成长经历相似,他的成长中也有儿时的淘气顽皮,学生时 代的疑问与困惑,有获得成功时的泪水与喜悦,也有经历困难与挫折时的蹉跎与彷徨.甚至有经历人生最低潮时期的痛苦与煎熬.但是与众不同的是,李开复在成功 中收获了经验,在失败中得到了成长.他把富有传奇的人生经历浓缩成为十句具有启发性的箴言,在如同与你交谈般的娓娓道来中,将这种宝贵的人生经验像冬日暖 阳一样,洒满了整个房间. ●成功箴言之一: 自信不失谦虚 谦虚不失自信 李 开复1961年出生于台湾,母亲在43岁高龄时生下他前,被医生数次劝阻.因为医生透露,如此高龄的产妇很可能生下白痴.但是母亲不顾一切劝阻生下了这个 幺儿.这个幺儿在母亲的极度宠爱下自由自在地成长着,喜欢做很多恶作剧.把家里所有的钟表调慢一小时以便晚上床睡觉.把邻居池塘里的水放干以证实邻居池塘 里并没有100条鱼.这一切母亲都只是报以宽容的一笑.但是母亲不允许孩子傲慢和目中无人. 当5岁的李开复得意洋洋地对邻居阿姨表示“上 小学以后就没有见过99分”后.母亲不允许这样的狂放存在于孩子身上,有史以来第一次打了开复.母亲告诉他,“不只要好好学习,还要改掉骄傲的毛病.自夸 是要不得的.谦虚是中国人的美德.”母亲总是不失时机地把做人的道理告诉开复.这一次强烈的记忆,使得开复懂得如何在谦虚和自信中保持平衡,而不会在自卑 或自负中跌倒. ●成功箴言之二: 天赋就是兴趣 兴趣就是天赋 李 开复11岁留学美国之后,一直在美国成长.1972年,他进入了美国哥伦比亚大学学习“政治科学” 专业.然而两年的学习让他知道自己的兴趣并非在政治方面.学习的枯燥经常让他在课堂上昏昏欲睡,学习成绩也不尽如人意.但是,他发现他在选修的计算机课 上,有着惊人的天赋.往往是别人还在苦思冥想如何写出程序时,他早就把程序写完而无所事事.后来,他发现他像发疯一样爱上了这门学科.因此,在大学二年级 时,他自己做出了一个惊人的决定,“转系!”这意味着他将从一个全美排名第3的专业转到一个毫无名气可言的专业.但是,他听从了内心的选择,还是选择了计 算机专业.而这个决定,改写了他一生的轨迹. ●成功箴言之三: 思考比传道重要 观点比解惑重要 李 开复以哥伦比亚大学计算机专业第一名的成绩毕业以后,顺利进入匹兹堡的卡内基·梅隆大学就读计算机专业的博士.在读博士之前,他的系主任Haberman 就告诉他,读博士的目的,就是要做出世界上一流的博士论文.至少在本领域是世界顶尖的.这句话让李开复十分震撼.然而,下面一句话,让他受益更 深,Haberman说,“做出一流的博士论文,也不是读博士的最终目的.而是你在读博士的过程中,获得一种思考的方法,而这种方法将使你在任何一个领 域,都获得顶尖的成功!”而李开复的努力证实了这种说法.李开复关于统计学方法做出的语音识别博士论文至今还是语音识别产品的理论基础.而李开复也在博士 生涯中,学会了解决问题,拥有了战胜困难的勇气. ●成功箴言之四: 我不同意你 但我支持你 李 开复在读博士期间选择的研究方向是“语音识别”.师从博士生导致罗迪.罗迪教授鼓励李开复用专家统计的方法来研究语音识别,而李开复在这个领域经过了一番 研究后,发现语音识别用这个方法可以获得特定语者95%的语音识别率.李开复把整个研究过程写了一篇论文.一经发表,得到了很正面的回馈.但是他最终发 现,专家系统是有严重局限性的,无法延伸到做不特定语者的语音识别.他认为有数据的支持的统计模式是唯一的希望.当他把想法告诉导师,罗迪告诉他,“我不 同意你,但是我支持你!”这样的说法让李开复备受感动,成就了李开复博士论文的成功.他的论文当年被评为《商业周刊》最杰出创新. ●成功箴言之五: 挫折不是惩罚 而是学习的机会 李 开复在博士生生涯里,成绩依然优秀.他用统计学做出的语音识别率大大地提高了,而博士论文发表在国际期刊上,让全美的科技界震惊.这样一个明星学生可以说 在卡内基·梅隆里没有什么忧愁可言.然而,一次暑期课程让他经历了不小的挫折.1983年暑假,李开复得到了暑期工的工作. 其任务就是教宾夕法尼亚州60个最聪明的高中生计算机课程.李开复自己对那段时光非常享受,每天忙碌地备课,还想出各种教学方法.但是,他领取薪水的那一瞬间看到学生的评语,才知道学生认为,“李老师的教学就像催眠曲!”这样的评价无疑使得李开复备受打击. 然而,李开复并没有气馁.他把失败当成了学习的机会,因此获得了成功.他在此后的生涯里,尤其是回到中国以后,做了上千场的演讲.这无疑得益于学生时代的练习. ●成功箴言之六: 创新不重要 有用的创新才重要 在 苹果和SGI李开复度过了八年科学家到产品副总裁的路程.在这段路程上,他有许多成功,例如苹果的QuickTime,但是在SGI他碰到了巨大的挫折. 他的团队发明的三维浏览器,在市场上失败,整个团队和产品被公司廉价卖掉.这时,他又发挥了“从挫折中学习”的反省.他理解了,仅仅有科学家的“新”、“ 酷”的创新是不够的.创新必须是针对用户的,必须是有用的.做产品的管理,必须把用户放在第一位.李开复1998年夏天回到中国,在中国开创微软中国研究 院.这时,他把这个教训带入中国团队. ●成功箴言之七: 完美的工作 成长兴趣 影响力 2000 年,李开复被调回微软总部成为微软全球副总裁.几年工作后,他深深地体会了一个完美工作的标准,那就是自己有浓厚的兴趣,能有成长的空间,并具备一定的影 响力.他怀念着在中国研究院的兴趣,还有在刚调回美国的学习,但是他期望着有更大的影响力.当他发现谷歌将开始在中国创建时,他主动找到了谷歌CEO施密 特,并表示愿意加入谷歌.而施密特十分高兴,在一个月之后就给了李开复OFFER.李开复说,当你遇到喜欢的工作机会,不需要任何的迟疑,而需要积极主动 来争取.因为这样的机会往往炙手可热,一秒钟的犹豫你就可能与之失之交臂. ●成功箴言之八: 用勇气改变可以改变的事情 2005年,是李开复的转折年.他没有想到,一次普通换工作的经历引发了一次地震.微软的诉讼使他陷入了人生最低的低谷.对他的虚假负面报道铺天盖地而来.但是,他想到了他一生的座右铭:用勇气改变可以改变的事情,用胸怀接受不能改变的事情,用智慧分辨两者的不同. 于 是,他全力以赴地投入了这场战斗,不再理会那些不能改变的谣言.将从微软提取的30万份邮件资料中找寻有利的证据以证明自己的清白.经过两个月的努力,法 庭同意李开复到谷歌工作.最后,当李开复回到媒体面前开始工作时,他发现,没有一个记者还提问与诉讼有关的问题,因为作为官司的胜利者,媒体不再相信那些 谣言. ●成功箴言之九: 做最好的领导 让员工做有兴趣的事 谷 歌公司聚集着世界上最天才的工程师们.如何管理这些“天才”,是摆在李开复面前的另一个课题.李开复非常推崇“放权”式的管理,他深知在以创意为主要生产 力的公司里,不能严格地恪守那些死板的规定.他可以让员工自己提出研究的方向.大家讨论决定.也可以让员工用20%的时间做自己喜欢的项目.他甚至可以让 员工对公司提出建议.如果合理就采纳.谷歌里自由的环境非常有名.作为管理者,他主要是在公司战略、每年的目标、合作伙伴、总部沟通上努力,其他的时间, 他更是一个企业文化的维护者、公司的发言人、员工的教练. ●成功箴言之十: 价值不是你拥有多少 而是你留下多少 什么是成功?是否拥有了名利就算成功.对此,李开复回答,你的价值不是你拥有多少,而是你留下多少.当他的一个同事赚够了钱而发现失去人生目标时,才意识到,人生的价值在于贡献,和对他人的影响. 李 开复曾经有过一个独特的梦想,就是在中国创建一所一流的,有世界影响力的私立大学.他甚至身体力行地为此多方奔走.但是最终因为种种原因没有成功.但是他 并没有气馁,而是用另外的方式实践梦想.他说:“我不能改变教育,但是我可以帮助学生.” 他给中国的大学生写信,写书,办了“我学网”,每年面对十万学生做演讲.在帮助学生的过程中,李开复看到中国大学生的成长.他说,他曾经想过自己的墓志铭 应该有科学家或者企业家的注脚.但是,他说他现在已经没有这种想法,如果他的墓志铭上有热心教育者的字样,他会感觉到内心的温暖. How To Optimize Your Site With GZIP Compression | BetterExplained
betterexplained.com/articles/how-to-optimize-your-... How To Optimize Your Site With GZIP CompressionCompression is a simple, effective way to save bandwidth and speed up your site. I hesitated when recommending gzip compression when speeding up your javascript because of problems in older browsers. But it’s 2007. Most of my traffic comes from modern browsers, and quite frankly, most of my users are fairly tech-savvy. I don’t want to slow everyone else down because somebody is chugging along on IE 4.0 on Windows 95. Google and Yahoo use gzip compression. A modern browser is needed to enjoy modern web content and modern web speed — so gzip encoding it is. Here’s how to set it up. Wait, wait, wait: Why are we doing this?Before we start I should explain what content encoding is. When you request a file like
1. Browser: Hey, GET me /index.html Of course, the actual headers and protocols are much more formal (monitor them with Live HTTP Headers if you’re so inclined). But it worked, and you got your file. So what’s the problem?Well, the system works, but it’s not that efficient. 100KB is a lot of text, and frankly, HTML is redundant. Every And what’s the plan when a file’s too big? Zip it! If we could send a .zip file to the browser (index.html.zip) instead of plain old index.html, we’d save on bandwidth and download time. The browser could download the zipped file, extract it, and then show it to user, who’s in a good mood because the page loaded quickly. The browser-server conversation might look like this:
1. Browser: Hey, can I GET index.html? I’ll take a compressed version if you’ve got it. The formula is simple: Smaller file = faster download = happy user. Don’t believe me? The HTML portion of the yahoo home page goes from 101kb to 15kb after compression: The (not so) hairy detailsThe tricky part of this exchange is the browser and server knowing it’s ok to send a zipped file over. The agreement has two parts
If the server doesn’t send the content-encoding response header, it means the file is not compressed (the default on many servers). The “Accept-encoding” header is just a request by the browser, not a demand. If the server doesn’t want to send back compressed content, the browser has to make do with the heavy regular version. Setting up the serverThe “good news” is that we can’t control the browser. It either sends the Our job is to configure the server so it returns zipped content if the browser can handle it, saving bandwidth for everyone (and giving us a happy user). In Apache, enabling output compression is fairly straightforward. Add the following to your .htaccess file:
Apache actually has two compression options:
Deflate is quick and works, so I use it; use mod_gzip if that floats your boat. In either case, Apache checks if the browser sent the “Accept-encoding” header and returns the compressed or regular version of the file. However, some older browsers may have trouble (more below) and there are special directives you can add to correct this. If you can’t change your .htaccess file, you can use PHP to return compressed content. Give your HTML file a .php extension and add this code to the top:
We check the “Accept-encoding” header and return a gzipped version of the file (otherwise the regular version). This is almost like building your own webserver (what fun!). But really, try to use Apache to compress your output if you can help it. You don’t want to monkey with your files. Verify Your CompressionOnce you’ve configured your server, check to make sure you’re actually serving up compressed content.
Be prepared to marvel at the results. The instacalc homepage shrunk from 36k to 10k, a 75% reduction in size. Try Some ExamplesI’ve set up some pages and a downloadable example:
Feel free to download the files, put them on your server and tweak the settings. CaveatsAs exciting as it may appear, HTTP Compression isn’t all fun and games. Here’s what to watch out for:
Enabling compression is one of the fastest ways to improve your site’s performance. Go forth, set it up, and let your users enjoy the benefits. Hello.World » Injecting JavaScript and CSS into Iframes » The Weblog of Matthew Delmarter
matthew.delmarters.com/weblog/injecting-javascript... Apache Solr : 基于Lucene的可扩展集群搜索服务器作者 Ryan Slobojan译者 崔康 发布于 2008年11月13日 上午7时27分
Apache Solr项目,是一款基于Apache Lucene的开源企业搜索服务器,最近发布了1.3版。InfoQ采访了Solr的创建者Yonik Seeley,了解了新版本的更多信息和Solr提供给最终用户的功能。 Seeley首先描述了目标用户:“需要搜索框、分面浏览(导航)或者两者结合的任何人”,Solr的关键特性包括:
Seeley同时谈到了该版本中的主要新功能:
详细的更新日志可以这里获得。 Seeley谈到了更多Solr在伸缩性、功能和实用性方面的细节: Solr已经部署过数以百万计容量的文档,如果借助分布式搜索,Solr应该能够处理数十亿的文档集合。 关于Solr的未来计划,Seeley提到了更多的可扩展性、对大集群更方便的配置和管理、基于区域和实时的搜索、重构以使用Spring配置插件。Seeley同时提供了一个邮件列表,在那里他详细讨论了Solr未来、特别是2.0版的计划。 Bash Shell脚本学习小结
今天需要写一个Shell脚本。很简单,判断一个日志文件是否大大于2G,如果大于2G则删除。久了没有写bash,竟然一点都想不起来写了。于是复习了一下,下面对今天的学习做个小结: 1.字符截断: 如果是一般路径的字符截断可以用basename和dirname这两个工具: basename可以从一个文件路径中截一个文件名 例如: $ basename /home/file.tar file.tar dirname可以从一个文件路径中截到一个目录路径 例如: $ dirname /home/file.tar /home 不使用外部工具进行字符截断 bash有自带的功能来对变量进行字符截断,一般使用"##", "#", "%%", "%", "*" 组合来实现。例如: $ string=hellowbashshell $ echo ${string##*sh} ell $ echo ${string#*sh} shell $ echo ${string%%sh*} hellowba $ echo ${string%sh*} hellowbash "#"表示从字符开始部分除去,一旦匹配则立即除去 "##"表示从字符开始部分除去,会搜整个字符串最长的和的匹配来除去 "%"表示从字符结束的部分除去,一旦匹配成公则立即除去 "%%"表示从字符结束的部分开始除去,会搜寻整个字符穿中最长的匹配来除去 "*"统配符,一般与“##”或"#"联用时放在搜索字符串的左边,例如:${String#*sh}(在sh的左边),与"%%"或"%"联用时会放在匹配字符串的右边,例如:${String%%sh*} 常用技巧: 在路径中取文件名:${path##*/}(与basename相同功能)2.自变量的接收 接收来自命令行传入的参数,第一个参数用$1表示,第二个参数$2表示,。。。以此类推。注意:$0表示脚本文件名。另外一个在shell编程中经常用到的是“$@”这个代表所有的参数,。你可以用一个循环来遍历这个参数。如果用java来类比的话,可以把$@看作是man函数中定义的那个数组 3.if语句: 格式: if [ condition ] then action fi conditon测试类型对照表
感觉bash 中的if相比其他的一些语言智能多了,在bash中,测试一个文件的存在跟比较两个数字的大小没有什么两样 ;) 4.for语句 bash里的语句总是那么的人性化,十分的接近自然语言,在for语句中几乎可以迭代任何类似与集合的数据类型(或许这样个说法不对,但我确实想不到更好的词来代替)。 看一个例子: #!/bin/bash 把上面这段代码录入保存为showargs.sh设置为可执行(chmod +x showargs.sh)执行:for args in $@ do echo $args done $ ./showargs.sh arg1 arg2 arg3 arg4 这个例子中,我们用到了之“$@”,它代表了所有的命令行参数。在这里用for对其进行遍历,系统迭代地从$@中取出命令行参数把他放到args中,最后使用echo $args进行输出。arg1 arg2 arg3 arg4 for更经常用到的是遍历目录,下面的例子用于列出当前目录下的所有文件和文件夹的名称 $ for file in * 这里用*代表当前目录,列出的是所有的文件和文件夹的名称,在这里,文件夹和文件你是分不出来的,如果你需要,你应该用if [-d ${file}]来做一下判断。> do > echo $file > done 对于文件遍历,更有趣的是,你可以在 “in” 后面接上多个表达式。也就是说,你可以一次在遍历多个目录。 下面这段代码能把当前目录下go文件夹和do文件夹里的文件复制到fo文件夹下 #!/bin/bash for args in ./go/* ./do/* do cp ${args} ./fo echo "copying ${args} to ./fo/${args}" done Eclipse 修改 EXTjs的风格
在Eclipse中新建一个文件名称是: new_style.theme (注意一定要是.theme的) eclipse如果有spket的插件, 会自动打开EXT theme的风格 编辑器, 然后选择ext的resource的folder: /data/joopen/ext-2.1/resources 然后会显示出对应的图片folder列表 然后在Effect的选项中增加你想要的风格, 选择export,就可以导出你想要的style 过profile可以对用户会话进行一定的限制,比如IDLE时间。
将IDLE超过一定时间的会话断开,可以减少数据库端的会话数量,减少资源耗用。 使用这些资源限制特性,需要设置resource_limit为TRUE: [oracle@test126 udump]$ sqlplus "/ as sysdba" 该参数可以动态修改: SQL> alter system set resource_limit=true; 数据库缺省的PROFILE设置为: SQL> SELECT * FROM DBA_PROFILES; 创建一个允许3分钟IDLE时间的PROFILE: SQL> CREATE PROFILE KILLIDLE LIMIT IDLE_TIME 3; 新创建PROFILE的内容: SQL> col limit for a10 测试用户: SQL> select username,profile from dba_users where username='EYGLE'; 修改eygle用户的PROFILE使用新建的PROFILE: SQL> alter user eygle profile killidle; 进行连接测试: [oracle@test126 admin]$ sqlplus eygle/eygle@eygle 当IDLE超过限制时间时,连接会被断开: SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; 专访Restlet框架首席开发者Jérome Louvel作者 Stefan Tilkov译者 宋玮 发布于 2007年6月14日 下午10时26分 最近Restlet框架发布了它的1.0版。Jérome Louve是Java框架Restlet的领导开发者,InfoQ的编辑Stefan Tikov有机会和Jérome Louvel进行了一次对话,本次谈话的主题讨论了Restlet存在的原因、在Java Web服务框架中的REST支持、Ruby on Rails、对JSR 311的期望以及Restlet的路线图。 InfoQ:你能给我们简单地介绍下Restlet的目标吗? Jérome Louvel(以下简称JL):Restlet是一个Java下的轻量级REST框架。通过拥抱REST(REST是一种Web架构风格)它模糊了Web站点和Web服务之间的界限,从而帮助开发人员构建Web应用。每一个主要的REST概念(REST concept)都有一个对应的Java类。你的REST化的Web设计和你的代码之间的映射是非常简单直接的。 Restlet是一个以CDDL或GPL发布的开源项目。该项目包含一个Restlet API,一个引用实现(Noelios Restlet引擎)以及一套扩展。 InfoQ:你为什么会觉得有必要创建另一种框架?难道Servlet API还不够好用吗? JL:Servlet AIP在1998年发布,从那个时候起它的核心设计一直没有很大的变化。它是Java EE的众多API中最成功的一个,但是它的几个设计缺陷和一些限制损害了它。举个例子,URI模式和它的处理者(handler)之间的映射是受限制的,而且其配置都集中在一个配置文件中。还有,他把socket流的控制直接交给了应用系统开发人员,Servlet容器阻碍了我们充分使用NIO特性对IO操作进行优化。最后,他对一些HTTP特性,例如缓存、内容协商以及内容压缩支持的不好。这对开发人员来说是件痛苦的事,因为这阻碍了他们将精力集中在应用系统相关的代码上。 另一个主要问题是,Java EE Stack中新的HTTP客户端API的缺少。JDK的HttpURLConnection类很难用,而且许多HTTP特性都不支持,比如为内容协商而表达的客户端选择等。人们经常需要依赖第三方HTTP客户端API突破这些限制。但是,HttpURLConnection不支持NIO。 2005年,我看到了超越这些限制的机会:在REST原则下设计一个新的API。第一次,我们有了统一Web应用客户端和服务器端的机会,这个API完全支持NIO并能让开发人员编程控制Web容器、连接器(connector)等,而且不需要经常性的依赖XML描述符就能部署应用系统。 InfoQ:你怎么看在别的框架中对REST的支持(例如Axis2,或者CXF/XFire)? JL:我想这些支持非常有效,但是作用非常有限。我的主要观点是设计这些项目是为了符合WS-*/SOAP Stack,它们与REST世界并不非常契合。在REST世界里,定义了一个全新的范例:面向资源的设计,而非通过远程方法调用这样的范例。 例如Axis2仅仅支持GET和POST两种HTTP方法,它需要远程方法的传递需要一个URI参数。这在REST中式不允许的,这种做法也不能被称之为REST化。 XFire1.2不支持REST,但是它发布了一个项目用于将POJO映射到REST化的Web服务。这有点类似最近发布的JSR-311,此JSR试图基于一套annotation和助手类标准化这种映射。 InfoQ:你是JSR 311专家组的成员,能否对JSR 311做一下展望? JL:我期望它能在REST资源和POJO领域对象之间实现一个完好的映射。就像JPA在关系数据库和POJO之间实现了很好的映射那样,我们也希望这个JSR能做到像JPA那样。我希望以annotation为中心的API能够相当符合(complimentary)Restlet API,后者已经是一个将REST资源映射到POJO的以类为中心的API了。 这些annotation也能被像Axis2和XFire这样的项目实现,我认为这个JSR给了REST和WS-*阵营一个达成和解的机会。 InfoQ:你能告诉我们一些基于Restlet的项目吗? JL:有几个不同规模的组织已经部署并应用了这样的应用系统,包括Overstock.com,这是一个在线购物方面的Internet领导者。Restlet项目也被作为支持技术用在覆盖REST构架风格的不同软件构架类别中。例如在加州Irvine大学,以及在INSA Rouen工程学院的使用。 我们自己的网站也是用Restlet引擎构建的。考虑到我们受到拒绝服务(denial of service)的攻击量,我们对我们系统的可伸缩性很自信。最近我们还发布了一个公用基准以证明了其性能品质。我们与流行的Servlet容器处在同一水平线上,而且有望在下一个加入完全的NIO优化的连接器(基于Glassfish的Grizzly NIO框架)的版本中比后者表现更为优异。 InfoQ:在构建REST化的应用系统中,能否比较一下Java和其他语言有何不同? JL:流行的REST化技术,例如Rails或者Django这些技术的经验告诉我们,Java/Restlet这样的技术在支持REST化的应用中会有更好更高的性能表现。Rails和Django开始的设计并没有考虑到REST,REST的这些概念只是在后来被加进去的。相比Restlet,这导致了很多做作的(contrived)代码。以Django为例,它并不天然支持在URI和资源之间映射的URI模板。而Rails强迫在关系数据库和对数据的CRUD操作间使用一种不自然的映射,REST/HTTP方法导致一种令人不满意的结果:开发人员不得不在各种限制下工作,或者采用自己的面向资源的设计去迎合Rails。而Restlet不强迫你使用任何持久化技术,它让你自由的定义你的资源及其特定的表现形式(representation),以及它们怎么被映射到你的领域对象或你的数据库。 InfoQ:你能更详细的解释下你刚才对Rails的批评吗? 你认为它的CRUD映射什么地方不够自然? JL:除了GET和DETLET这样的HTTP方法可以很好的映射到SQL的SELECT和DELETE外,我还发现Rails将HTTP的POST方法用来进行创建行为,这很不幸。在REST中,对于创建行为最好的方法是使用PUT,它也可以用于更新。PUT比POST优越的地方是如果操作行为失败了,它可以很安全的重复操作,而POST不行。 还有,资源列表是基于表名和行记录的数字型id映射的,在实践中这并不总是可行的。你不想失去对你的URI的控制,而URI既是应用系统用户界面的一部分,又是REST最基本的概念之一。在Restlet中,我们并不对你的URI强加任何限制,你可以自由的使用任一持久化技术(例如JPA的annotation化POJO,纯JDBC调用,对象数据库等等)在你的资源和表现形式(representation)之间进行映射。 我对Rails的另一个小小的批评是,Rails鼓励使用笨拙的“;edit”后缀访问一个资源的编辑Web页面。这有点误导,REST并不鼓励使用URI参数的非一致方法,应该使用分隔的Web表单资源,这样浏览器可以使用GET、POST或者PUT方法。 InfoQ:你好像在Restlet上花了不少时间。这个业余项目占用了你多少时间,你的公司期望能从这个项目中得到多大的商业成就? JL:从开始这个项目就不是作为一个业余产品启动的。当我构建另一个很重要的私人项目是我就感觉到了对它的需要。我相信专业的开源项目,也希望Noelios Consulting能提供的专业服务(如支持计划,顾问服务)能让我们继续投入更多的精力。 InfoQ:第一版发布之后的路线图是什么? JL:除了维护1.0版修改bug外,我们还将很快启动1.1版。一些我们曾想过的对WAR包(不再需要XML描述符)的增强将被加进来。用户可以选择通过一个XML描述符配置Restlet组件(可移植的应用系统和虚拟主机容器)从而简化管理员的工作。我们还有几个连接器原型要实现,一个是基于Grizzly NIO框架的HTTP服务器连接器,它将带来更多的可伸缩性和响应(responsiveness)。另外两个HTTP连接器是基于JXTA的虚拟socket(一个客户机和一个服务器)。 我们还想更深入的支持HTTP特性,例如内容范围(content range),Digest和WSSE授权。我们还计划在2008年将Restlet API提交给JCP。这有利于逐渐替代Servlet API。 InfoQ:谢谢你抽出时间接受我们的采访。 作者简介:Jérome Louvel是一位软件架构师,它是Noelios Consulting公司的创始人。在软件版本(Software edition)和咨询方面有超过8年的工作经验,它常年工作在欧洲和北美洲。他对Java、REST、语义网以及商业过程集成有浓厚的兴趣。
译者简介:宋玮,有多年软件开发经验,从2002年开始就使用Java,在各个项目开发过程中先后使用过Struts、Oracle ADF、AspectJ等。最近正在使用Spring及Ruby on Rails,对敏捷方法有比较大的兴趣并做过一些尝试。他的blog为http://www.donews.net/victorsong。参与InfoQ中文站内容建设,请邮件至china-editorial@infoq.com。 Restlet指南[Matrix社区试读版]cleverpig 发表于 2007-11-30 15:15:48作者:cleverpig 来源:Matrix 评论数:8 点击数:2,116 投票总得分:5 投票总人次:1 关键字:Restlet,REST,指南,入门 摘要:当复杂核心化模式日趋强大之时,面向对象设计范例已经不总是Web开发中的最佳选择,Java开发者需要认识到这一点,并且在开发新的Web服务端或是 AJAX Web客户端时开始思考更加RESTfully的设计。Restlet这个开源项目为那些要采用REST结构体系来构建应用程序的Java开发者提供了一个具体的解决方案。朋友们,下面就让我们开始Restlet探索之旅吧!作者:cleverpig 关于本指南 本指南的翻译工作经过了Restlet社区的官方授权,cleverpig作为贡献者完成了本文的翻译和整理工作。在此发布Matrix社区试读版的目的是为了让更多的技术爱好者阅读并提出翻译中的不足之处,以提高本指南的质量,以期修改后正式发布。 Servlet的限制 在2003年末,Jetty Web容器的作者、Servlet规范的贡献者:Greg Wilkins在其博客上对Servlet的问题进行了如下总计: * 没有对协议与应用之间的关系进行清洗的划分。 * 由于在设计Servlet时存在对阻塞IO的假设,因此不能充分利用非阻塞NIO机制。 * 所有的Servlet Web容器对于某些应用来讲是过度设计的。 他提出构思新的API规范,使其能够真实地脱离协议,并定义能够暴露内容和元数据的contentlets。这些想法就是Restlet项目创建的灵感源泉。在之后的文章中,Greg Wilkins解释了为什么当前Servlet API限制非阻塞NIO API得到高效使用的详细理由:这种传统的用法针对每个HTTP请求都创建独立的线程进行处理。并提出了他对下一代Servlet技术的设想。 另一个主要问题就是Servlet API鼓励应用开发者在应用或者用户会话级别直接将session状态保存于内存中,尽管这看上去不错,但它造成了Servlet容器扩展性和高可用性的主要问题。为了克服这些问题,就必须实现复杂的负载均衡、session复制、持久化机制。这导致了可扩展性必然成为灾难。 Restlet简介 当复杂核心化模式日趋强大之时,面向对象设计范例已经不总是Web开发中的最佳选择,Java开发者需要认识到这一点,并且在开发新的Web服务端或是AJAX Web客户端时开始思考更加RESTfully的设计。Restlet这个开源项目为那些要采用REST结构体系来构建应用程序的Java开发者提供了一个具体的解决方案。它的非常简单易用的功能和RESTfully的Web框架,这使其成为了Web2.0开发中的又一利器。好吧,朋友们,下面就让我们开始Restlet探索之旅吧! 1. 注册一个Restlet实现 Restlet框架由两部分构成。第一部分是"Restlet API", 这个中立的API完美地实现了REST概念并简化了客户端和服务端应用的调用处理。在使用它之前,我们还需要一个支持此API的Restlet实现。Restlet的诸多实现可以通过开源项目或者商业产品获得。 ![]() API与实现的分离和Servlet API与web容器的分离(就像Jetty或Tomcat)、JDBC API与相应JDBC驱动的分离非常类似。目前,"Noelios Restlet Engine" (缩写为NRE)是Restle tAPI的参考实现之一。当下载Restlet发布版本时,API和NRE就绑定在一起,以备随时使用。如果你需要使用不同的实现,那么只需要添加JAR 文件到classpath,并删除com.noelios.restlet.jar这个NRE的JAR文件即可。 API实现的注册过程是完全自动的,如果你对此存在疑问,那么请参考JAR规范。当完成实现装载工作后,它将自动回调org.restlet.util.Engine.setInstance()方法,来进行自注册。 2. 接收Web页面的内容 正如我们在Restlet介绍中所提到的,Restlet框架即是一个客户端,又是一个服务端框架。例如,NRE能够简单地通过它的HTTP客户端 connector(连接器)访问远程资源。在REST中,connector是一种软件元素,它使两个component(组件)之间能够进行通讯,其典型的实现方式是通过某种网络协议完成通讯。NRE提供了多种客户端connector实现,这些实现都基于现存的开源项目。在connector一节中,列举出了所有可用的客户端、服务端connector,并解释了如何使用和配置它们。 下面,我们将获取一个现存资源的表示法(representation )并将其输出在JVM控制台: // Outputting the content of a Web page 请注意上面的示例使用了最简单的方式:通过通用的客户端类(generic Client class)调用。更加灵活的方式是创建一个新的Request对象,然后请求客户端去处理它。下面的示例展示了如何在调用时设置首选项(例如 referrer URI)。当然,也可以是接收回应时的首选语言或者媒体类型: // Prepare the request 3. 侦听浏览器 现在,我们将了解一下Restlet框架是如何侦听客户端请求并作出回应的。这里,我们选用了NRE HTTP服务端connector(例如基于Jetty的HTTP服务端connector),返回简单的字符串表达式“Hello World!”。请注意在更加实际的应用中,我们可以创建一个独立的类,此类继承自Restlet类,而不依靠这里的匿名内部类。 Restlet类与Servlet非常相似,并且在RESTful应用中处理调用时提供了有限的帮助。我们后面将看到一个提供了一些特定子类的框架,它能够更抽象、简单地进行处理。下面让我们先看一个简单的示例: // Creating a minimal Restlet returning "Hello World" 如果你运行并启动服务端,那么你可以打开浏览器输入http://localhost:8182。实际上,输入任何的URI都可以工作,你也可以尝试一下http://localhost:8182/test/tutorial。值得注意的是,如果你从另一台服务器上测试服务端,那么就需要将localhost替换为服务器的IP地址或者它的域名。 4. REST架构概述 让我们先从REST的视角审视一下典型的web架构。在下面的图表中,端口代表了connector,而后者负责component之间的通讯(组件在图中被表示为大盒子)。链接代表了用于实际通讯的特定协议(HTTP,SMTP等)。 ![]() 请注意,同一个component能够具有任何数量的客户端/服务端connector。例如,Web服务器B就具有一个用于回应用户代理组件(User Agent component)的服务端connector,和多个发送请求到其它服务端的客户端connector。 5. Component、virtual hosts和applications 另外,为了支持前面所表述的标准REST软件架构元素,Restlet框架也提供了一套类:它们极大地简化了在单一JVM中部署多个应用的工作。其目的在于提供一种RESTful、可移植的、比现存的Servlet API更加灵活的框架。在下面的图表中,我们将看到三种Restlet,它们用于管理上述复杂情况:Components能够管理多个Virtual Hosts和Applications。Virtual Hosts支持灵活的配置,例如同一个IP地址能够分享多个域名、使用同一个域名实现跨越多个IP地址的负载均衡。最后,我们使用应用去管理一套相关的 Restlet、Resource、Representations。另外,应用确保了在不同Restlet实现、不同Virtual Hosts之上的可移植性和可配置性。这三种Restlet的协助为我们提供了众多的功能:譬如访问日志、请求自动解码、配置状态页设置等。 ![]() 为了展示这些类,让我们尝试一个简单的示例。首先,我们创建一个component,然后在其上添加一个HTTP服务端connector,并侦听 8182端口。接着创建一个简单的、具有追踪功能的Restlet,将它放置到组件默认的Virtual Hosts上。这个默认的主机将捕捉那些没有路由到指定Virtual Hosts的请求(详见Component.hosts属性)。在后面的一个示例中,我们还将介绍应用类的使用方法。请注意,目前你并不能在控制台输出中看到任何的访问日志。 // Create a new Restlet component and add a HTTP server connector to it 让我们通过在浏览器中输入http://localhost:8182/trace/abc/def?param=123来进行测试,得到测试结果如下: Resource URI : http://localhost:8182/trace/abc/def?param=123 6. 为静态文件提供服务 你遇到过提供静态页面(类似Javadocs)服务的web应用?如果正在使用,那么可以直接编写一个Directory类,而无需为它建立Apache服务。请见下面如何使用: // Create a component 正如你所注意到的,我们通过传递应用的父组件上下文(context)的方式来实例化应用,而不是在第5章中提到的代码那样简单。而其主要原因是应用在分配客户端请求时,请求的分配工作需要客户端connector来完成,而后者被component所控制,并在所有被包含其中的应用之间贡献。 为了运行此示例,你需要为ROOT_URI提供一个有效值,该值依赖于你的Restlet安装路径。默认情况下,它被设置为"file:///D: /Restlet/www/docs/api/"。请注意,这里不需要任何附加的配置。如果你希望自定义在文件扩展名和元数据(metadata,包括媒体类型、语言、编码等)之间的映射,或是提供一个与众不同的索引名,你可以使用应用的“metadataService”属性。 7. 访问日志 有目的地记录web应用的活动是一种常见的需求。Restlet组件能够在默认的情况下生成类似Apache风格的日志、甚至自定义日志。通过使用 JDK内置的日志功能,logger能够配置为像任何标准JDK日志那样过滤信息、对它们进行重新格式化或者发送它们到指定位置。并且支持日志的循环(rotation);细节请查看java.util.logging包。 值得注意的是,你能够通过修改component的"logService"属性来为java.util.logging框架自定义logger名。如果希望完全掌控日志的配置,你需要通过设置系统属性来声明一个配置文件: System.setProperty("java.util.logging.config.file", "/your/path/logging.config");关于配置文件格式的细节,请查看JDK的LogManager类。 8. 显示错误页 另外一个常见的需求是:在调用处理过程中某些期望结果没有出现时,能够自定义返回的状态页面。也许它是某个资源没有找到或者一个可接受的表示是无效的。在这种情况下,或者遇到任何无法处理的异常时,Application或者Component将自动提供一个默认的状态页面。此服务与 org.restlet.util.StatusService类相关联,并可以作为被称为“statusService”的Application或者 Component的属性而被访问。 为了自定义默认的信息,你只需要简单地创建StatusService类的子类,并覆盖其getRepresentation(Status, Request, Response)方法。然后设置这个类的实例为指定的“statusService”属性即可。 9. 对敏感资源的访问保护 当你需要保护对某些Restlet的访问时,可以使用下面的方法:一种通用的方法是依靠cookie来识别客户端(或者客户端session),并根据你的应用状态检查给定的用户ID或者session ID,从而判断次访问是否被允许。Restlet通过访问Request或者Response中的Cookie和CookieSetting对象支持cookie。 另一种方法是基于标准HTTP认证机制。Neolios Restlet引擎目前允许基于简单HTTP方案的证书发送、接收和基于Amazon Web服务方案的证书发送。 当接收到调用时,开发者能够通过Request.challengeResponse.identifier/secret类中的Guard filter(保护过滤器)使用已经解析好的证书。过滤器是一种特殊的Restlet,它能够在调用相应Restlet之前进行预处理,或者在相应 Restlet调用返回后进行后期处理。如果你熟知Servlet API,这里的过滤器概念和Servlet API中的Filter接口非常接近。看一下我们如何修改从前的代码来对目录访问进行访问保护: // Create a Guard ![]() 请注意:认证和授权的最终结果是完全可定制的,这只需要通过authenticate()和authorize()方法便可完成。任何自定义的机制都能够被用来检查给定的证书是否有效、通过认证的用户是否被授权继续访问相应Restlet。下面是我们简单地硬编码了用户、密码对。为了测试,我们使用了客户端Restlet API: // Prepare the request 你可以修改这里的user ID或者password,来检查服务端返回的response。请别忘记了在启动客户端之前,先执行Restlet服务端程序。请注意,如果你从另一台机器上测试服务端,那么在浏览器中输入URI时需要将"localhost"替换为服务器的IP地址或者域名。由于使用了默认接收任何类型URI的 VirtualHost,因此服务端无需任何修改。 10. URI重写和重定向 Restlet框架的另一个优点是对cool URI的内建支持。Jacob Nielsen在他的AlertBox中给出了对URI设计的重要性的绝佳描述。 首先介绍的工具是Redirector,它能够将cool URI重写为另一个URI,并接着进行相应的自动重定向。这里支持一些重定向类型:通过客户端/浏览器的外部重定向、类似代理行为的connector重定向。在下面的例子中,我们将基于Google为名为"mysite.org"的站点定义一个检索服务。与URI相关的"/search"就是检索服务,它通过"kwd"参数接收一些检索关键字: // Create an application 请注意,Redirector只需要三个参数。第一个参数是父级上下文,第二个参数定义了如何基于URI模板重写URI。这里的URI模板将被Template类处理。第三个参数定义了重定向类型:出于简化的目的,我们选择了客户端重定向。 同时,当调用被传递给application时,我们使用了Route类从request中提取查询参数“kwd”。如果发现参数,参数将被复制到request的“keywords”属性中,以便Redirector在格式化目标URI时使用。 11. 路由器和分层URI 作为Redirector的补充,我们还具有另一个管理cool URI的工具:Router(路由器)。它们是一种特殊的Restlet,能够使其它Restlet(例如Finder和Filter)依附于它们,并基于URI模板进行自动委派调用(delegate call)。通常,你可以将Router设置为Application的根。 这里,我们将解释一下如何处理下面的URI模板: 1. /docs/ 用于显示静态文件 2. /users/{user} 用于显示用户帐号 3. /users/{user}/orders 用于显示特定用户的所有订单 4. /users/{user}/orders/{order} 用于显示特定的订单 实际上,这些URI包含了可变的部分(在大括号中)并且没有文件扩展名,这在传统的web容器中很难处理。而现在,你只需要做的只是使用URI模板将目标Restlet附着到Router上。在Restlet框架运行时,与request的URI最为匹配的Route将接收调用,并调用它所附着的 Restlet。同时,request的属性表也将自动更新为URI模板变量。 ![]() 请看下面的具体实现代码。在真实的应用中,你可能希望创建单独的子类来代替我们这里使用的匿名类: // Create a component 请注意,变量的值是直接从URI中提取的,因此这是没有精确解码的。为了实现这样的工作,请查看手册中的decode(String)方法。 12. 抵达目标资源 在前面的示例中,在从目标URI中提取那些有趣部分时,我们利用了Restlet框架非常灵活的路由特性对request进行路由。但是,我们没有注意request方法和客户端对于它所期望的response的偏好。于是,我们如何才能将Restlet处理器和后台系统、域对象联系在一起呢? 到目前为止,我们已经介绍了一些在Restlet中超越传统Servlet API的特性。但我们并没有在"Restlet"这个框架名称中使用"REST"。如果你还没有做的话,我推荐你学习一些关于REST架构风格和将其应用于Web应用的最佳实践。这里提供了相关的FAQ记录,希望能给你一些启示,同时我们也运营着很有用的REST搜索引擎(基于Google)。如果你对传统MVC框架有一定了解,那么你可以阅读一下另一个FAQ记录,它提供了对MVC与Restlet关系的详细说明。 ![]() 总结一下,request中含有标识目标资源的URI,而目标资源就是调用的主旨。这种资源信息被保存在Request.resourceRef属性中,并能够像我们之前所见那样服务于路由机制。因此在处理request时的首要目标就是发现目标资源。。。Resource类的实例或者其子类中的某个。为了帮助我们完成此项任务,我们可以使用专用的Finder,一个Restlet子类,它将Resource类引用作为参数并在request到来时自动实例化它。然后Finder将动态将调用分配给最新创建的实例,实际上就是根据request方法调用它的handle*()方法中的某一个(handleGet,handleDelete等)。当然,我们可以自定义这种行为,甚至使用Router的attach()方法,将URI模板和 Resource类作为其参数透明地创建Finder!现在,让我们看一下展示了示例中主框架类之间关系的全景图表: 回到代码中,我们在这里重构了Application.createRoot()方法。出于简化目的,我们没有提供具有静态文件的目录。你可以发现将Resource类直接指派给Router的方法。 // Create a router 我们最后将重审一下UserResource类。这个类继承自org.restlet.resource.Resource类,因此它覆盖了具有三个参数的构造方法。此方法初始化了"context"、"request"和"response"属性。接着,我们使用从"/users/{user} "URI模板中提取出的"user"属性,将它的值保存在一个方便使用的成员变量中。然后,我们便可以在整个application中查找与"user" 相关的域对象了。最终,我们声明了用于暴露给用户的表示变量(representation variants),在这个简单的例子中只是文字而已。它将用于在运行时透明地完成一些内容导航,以便为每个request选择适合的变量,所有这些工作都是透明的。 public class UserResource extends Resource {你可以查看本指南中提供的代码包并对应用进行测试,并能够以仅接受Get请求的方式获得在第十一章中的相同行为。如果你希望使用PUT方法,那么就需要在UserResource中创建一个"allowPut()"方法并简单地返回"true",并且添加一个"put (Representation)"方法来处理调用。关于详细内容请查阅Restlet的Javadocs。 结论 我们已经涵盖了Restlet框架的许多方面。在你打算行动之前,让我们先回顾一下展示了本指南的主要概念和它们之间关系的两个层次图表: ![]() 这里是核心表示类: ![]() 除了本指南,你最好的信息来源就是Restlet API的Javadocs、Restlet扩展和NRE。还可以阅读一下connector一节,它列举出了客户端和服务端connector,并解释了如何使用、配置它们。集成一节列出了提供可插入特性的所有可用扩展:例如与servlet容器的集成、动态表示的生成等。你还可以在我们的讨论组中提出问题并帮助别人。 相关资源: http://www.restlet.org/documentation/1.0/tutorial http://www.restlet.org/about/introduction 全面介绍:Oracle数据库日期处理
作者: 2008-01-13 22:38 来源:
在oracle中处理日期大全 TO_DATE格式
24小时格式下时间范围为: 0:00:00 - 23:59:59.... 12小时格式下时间范围为: 1:00:00 - 12:59:59 .... 1.日期和字符转换函数用法(to_date,to_char) 2.select to_char( to_date(222,'J'),'Jsp') from dual 显示Two Hundred Twenty-Two 3.求某天是星期几
设置日期语言
也可以这样
4.两个日期间的天数
5. 时间为null的用法
注意要用TO_DATE(null) 6.a_date between to_date('20011201','yyyymmdd') and to_date('20011231','yyyymmdd') 那么12月31号中午12点之后和12月1号的12点之前是不包含在这个范围之内的。 所以,当时间需要精确的时候,觉得to_char还是必要的 7. 日期格式冲突问题 输入的格式要看你安装的ORACLE字符集的类型, 比如: US7ASCII, date格式的类型就是:
或者在to_date中写
注意我这只是举了NLS_DATE_LANGUAGE,当然还有很多, 可查看
8.
查找2002-02-28至2002-02-01间除星期一和七的天数 在前后分别调用DBMS_UTILITY.GET_TIME, 让后将结果相减(得到的是1/100秒, 而不是毫秒). 9.
10. Next_day的用法
11.select to_char(sysdate,'hh:mi:ss') TIME from all_objects 注意:第一条记录的TIME 与最后一行是一样的 可以建立一个函数来处理这个问题
12.获得小时数
获取年月日与此类似 13.年月日的处理
14.处理月份天数不定的办法
15.找出今年的天数
闰年的处理方法
如果是28就不是闰年 Gmail - 我心目中的编程高手(完整版) - zhaojinzhong@gmail.com
mail.google.com/mail/?zx=ld9f29v26rt7&shva=1#searc... ![]()
之前也有一些介绍大型网站架构演变的文章,例如LiveJournal的、ebay的,都是非常值得参考的,不过感觉他们讲的更多的是每次演变的结果,而没有很详细的讲为什么需要做这样的演变,再加上近来感觉有不少同学都很难明白为什么一个网站需要那么复杂的技术,于是有了写这篇文章的想法,在这篇文章中
将阐述一个普通的网站发展成大型网站过程中的一种较为典型的架构演变历程和所需掌握的知识体系,希望能给想从事互联网行业的同学一点初步的概念,:),文中的不对之处也请各位多给点建议,让本文真正起到抛砖引玉的效果。 架构演变第一步:物理分离webserver和数据库 最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候 已经是托管了一台主机,并且有一定的带宽了,这个时候由于网站具备了一定的特色,吸引了部分人访问,逐渐你发现系统的压力越来越高,响应速度越来越慢,而这个时候比较明显的是数据库和应用互相影响,应用出问题了,数据库也很容易出现问题,而数据库出问题的时候,应用也容易出问题,于是进入了第一步演变阶段:将应用和数据库从物理上分离,变成了两台机器,这个时候技术上没有什么新的要求,但你发现确实起到效果了,系统又恢复到以前的响应速度了,并且支撑住了更高的流量,并且不会因为数据库和应用形成互相的影响。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 这一步架构演变对技术上的知识体系基本没有要求。 架构演变第二步:增加页面缓存 好景不长,随着访问的人越来越多,你发现响应速度又开始变慢了,查找原因,发现是访问数据库的操作太多,导致数据连接竞争激烈,所以响应变慢,但数据库连 接又不能开太多,否则数据库机器压力会很高,因此考虑采用缓存机制来减少数据库连接资源的竞争和对数据库读的压力,这个时候首先也许会选择采用squid 等类似的机制来将系统中相对静态的页面(例如一两天才会有更新的页面)进行缓存(当然,也可以采用将页面静态化的方案),这样程序上可以不做修改,就能够 很好的减少对webserver的压力以及减少数据库连接资源的竞争,OK,于是开始采用squid来做相对静态的页面的缓存。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 前端页面缓存技术,例如squid,如想用好的话还得深入掌握下squid的实现方式以及缓存的失效算法等。
架构演变第三步:增加页面片段缓存 增加了squid做缓存后,整体系统的速度确实是提升了,webserver的压力也开始下降了,但随着访问量的增加,发现系统又开始变的有些慢了,在尝 到了squid之类的动态缓存带来的好处后,开始想能不能让现在那些动态页面里相对静态的部分也缓存起来呢,因此考虑采用类似ESI之类的页面片段缓存策略,OK,于是开始采用ESI来做动态页面中相对静态的片段部分的缓存。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 页面片段缓存技术,例如ESI等,想用好的话同样需要掌握ESI的实现方式等;
架构演变第四步:数据缓存 在采用ESI之类的技术再次提高了系统的缓存效果后,系统的压力确实进一步降低了,但同样,随着访问量的增加,系统还是开始变慢,经过查找,可能会发现系 统中存在一些重复获取数据信息的地方,像获取用户信息等,这个时候开始考虑是不是可以将这些数据信息也缓存起来呢,于是将这些数据缓存到本地内存,改变完毕后,完全符合预期,系统的响应速度又恢复了,数据库的压力也再度降低了不少。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 缓存技术,包括像Map数据结构、缓存算法、所选用的框架本身的实现机制等。
架构演变第五步: 增加webserver 好景不长,发现随着系统访问量的再度增加,webserver机器的压力在高峰期会上升到比较高,这个时候开始考虑增加一台webserver,这也是为了同时解决可用性的问题,避免单台的webserver down机的话就没法使用了,在做了这些考虑后,决定增加一台webserver,增加一台webserver时,会碰到一些问题,典型的有: 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 负载均衡技术(包括但不限于硬件负载均衡、软件负载均衡、负载算法、linux转发协议、所选用的技术的实现细节等)、主备技术(包括但不限于ARP欺骗、linux heart-beat等)、状态信息或缓存同步技术(包括但不限于Cookie技术、UDP协议、状态信息广播、所选用的缓存同步技术的实现细节等)、共享文件技术(包括但不限于NFS等)、存储技术(包括但不限于存储设备等)。
架构演变第六步:分库 享受了一段时间的系统访问量高速增长的幸福后,发现系统又开始变慢了,这次又是什么状况呢,经过查找,发现数据库写入、更新的这些操作的部分数据库连接的 资源竞争非常激烈,导致了系统变慢,这下怎么办呢,此时可选的方案有数据库集群和分库策略,集群方面像有些数据库支持的并不是很好,因此分库会成为比较普遍的策略,分库也就意味着要对原有程序进行修改,一通修改实现分库后,不错,目标达到了,系统恢复甚至速度比以前还快了。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 这一步更多的是需要从业务上做合理的划分,以实现分库,具体技术细节上没有其他的要求; 但同时随着数据量的增大和分库的进行,在数据库的设计、调优以及维护上需要做的更好,因此对这些方面的技术还是提出了很高的要求的。
架构演变第七步:分表、DAL和分布式缓存 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 分表更多的同样是业务上的划分,技术上涉及到的会有动态hash算法、consistent hash算法等; DAL涉及到比较多的复杂技术,例如数据库连接的管理(超时、异常)、数据库操作的控制(超时、异常)、分库分表规则的封装等;
架构演变第八步:增加更多的webserver 在做完分库分表这些工作后,数据库上的压力已经降到比较低了,又开始过着每天看着访问量暴增的幸福生活了,突然有一天,发现系统的访问又开始有变慢的趋势
了,这个时候首先查看数据库,压力一切正常,之后查看webserver,发现apache阻塞了很多的请求,而应用服务器对每个请求也是比较快的,看来 是请求数太高导致需要排队等待,响应速度变慢,这还好办,一般来说,这个时候也会有些钱了,于是添加一些webserver服务器,在这个添加 webserver服务器的过程,有可能会出现几种挑战: 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 到了这一步,随着机器数的不断增长、数据量的不断增长和对系统可用性的要求越来越高,这个时候要求对所采用的技术都要有更为深入的理解,并需要根据网站的需求来做更加定制性质的产品。
架构演变第九步:数据读写分离和廉价存储方案 突然有一天,发现这个完美的时代也要结束了,数据库的噩梦又一次出现在眼前了,由于添加的webserver太多了,导致数据库连接的资源还是不够用,而这个时候又已经分库分表了,开始分析数据库的压力状况,可能会发现数据库的读写比很高,这个时候通常会想到数据读写分离的方案,当然,这个方案要实现并不 容易,另外,可能会发现一些数据存储在数据库上有些浪费,或者说过于占用数据库资源,因此在这个阶段可能会形成的架构演变是实现数据读写分离,同时编写一些更为廉价的存储方案,例如BigTable这种。 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 数据读写分离要求对数据库的复制、standby等策略有深入的掌握和理解,同时会要求具备自行实现的技术; 廉价存储方案要求对OS的文件存储有深入的掌握和理解,同时要求对采用的语言在文件这块的实现有深入的掌握。
架构演变第十步:进入大型分布式应用时代和廉价服务器群梦想时代 经过上面这个漫长而痛苦的过程,终于是再度迎来了完美的时代,不断的增加webserver就可以支撑越来越高的访问量了,对于大型网站而言,人气的重要毋
庸置疑,随着人气的越来越高,各种各样的功能需求也开始爆发性的增长,这个时候突然发现,原来部署在webserver上的那个web应用已经非常庞大 了,当多个团队都开始对其进行改动时,可真是相当的不方便,复用性也相当糟糕,基本是每个团队都做了或多或少重复的事情,而且部署和维护也是相当的麻烦,
因为庞大的应用包在N台机器上复制、启动都需要耗费不少的时间,出问题的时候也不是很好查,另外一个更糟糕的状况是很有可能会出现某个应用上的bug就导 致了全站都不可用,还有其他的像调优不好操作(因为机器上部署的应用什么都要做,根本就无法进行针对性的调优)等因素,根据这样的分析,开始痛下决心,将
系统根据职责进行拆分,于是一个大型的分布式应用就诞生了,通常,这个步骤需要耗费相当长的时间,因为会碰到很多的挑战: 看看这一步完成后系统的图示:
这一步涉及到了这些知识体系: 这一步涉及的知识体系非常的多,要求对通信、远程调用、消息机制等有深入的理解和掌握,要求的都是从理论、硬件级、操作系统级以及所采用的语言的实现都有清楚的理解。 运维这块涉及的知识体系也非常的多,多数情况下需要掌握分布式并行计算、报表、监控技术以及规则策略等等。 说起来确实不怎么费力,整个网站架构的经典演变过程都和上面比较的类似,当然,每步采取的方案,演变的步骤有可能有不同,另外,由于网站的业务不同,会有不同的专业技术的需求,这篇blog更多的是从架构的角度来讲解演变的过程,当然,其中还有很多的技术也未在此提及,像数据库集群、数据挖掘、搜索等,但在真实的演变过程中还会借助像提升硬件配置、网络环境、改造操作系统、CDN镜像等来支撑更大的流量,因此在真实的发展过程中还会有很多的不同,另外一个大型网站要做到的远远不仅仅上面这些,还有像安全、运维、运营、服务、存储等,要做好一个大型的网站真的很不容易,写这篇文章更多的是希望能够引出更多大型网站架构演变的介绍,:)。 ps:最后附上几篇LiveJournal架构演变的文章: 从LiveJournal后台发展看大规模网站性能优化方法 http://blog.zhangjianfeng.com/article/743 另外从这里:http://www.danga.com/words/大家可以找到更多关于现在LiveJournal网站架构的介绍。 假设你所在的小组要做一个重要的公司报告。芝加哥的Mary负责写任务报告,西雅图的Sam加入销售情况报表,加里福尼亚的Charles制作精彩的图片,还有其它各地区办公室的负责人用文字将这些部分连接在一起。最后生成的文件将是完美协作的成果,展现了公司的实力和富于创新的精神。但是稍等一下,这个特别的文件是有许多部分组成,在该文件完成之前每个部分要经过大量的修改,校正和更新。如何与其他人一起共享这些改动呢?如何跟踪文件中的每一处的变动呢?到底要持续多长时间?
直到最近,类似的项目仍然是一个工作统筹方面的恶梦:因为它意味着无休止地不断地查阅文件,或是并行查阅哪里的更新需要仔细地校对整理。Web甚至都不能提供多少帮助,因为它的用于协作的工具都不适合制作共享文件。
但是,计算机科学家经过一段时间的研究,将超文本传输协议(HTTP)扩展到在分布式的网络环境中,实现了协作的文件制作和编辑。这种扩展被称为基于Web的分布式创作和控制协议,即WebDAV,业内人士简称之为DAV(发音与DAVE相同)。WebDAV的开发源自1998年,现在Adobe、IBM、Microsoft以及Oracle等许多大公司的相关产品已经支持这一协议了。
为什么这一协议正在成为主流呢?原因之一可能是在这个技术背后的技术:它是Microsoft Internet Information Server中的机制:允许你浏览Web文件夹。同时,它也并入到像Microsoft Windows 2000 、Windows XP以及Mac OS X Server这样的操作系统中。WebDAV也进入到例如Xerox's DocuShare这样的文件管理系统和Microsoft Office 2000以及Adobe Photoshop这样的套件中。简言之,WebDAV了改变我们在Web上协同式工作的方式。
从HTTP到WebDAV
大家都知道,HTTP是网络服务器和客户端(例如浏览器) 进行通信时使用的协议。当你单击网页中一个文件链接时, 浏览器将发送请求消息,这个消息包含消息头和方法参考。一般情况下,浏览器消息是:“使用GET方法访问位于在www.mysite.com/myPage.html的文件”。我们不必仔细研究技术细节, 记住请求的消息头包含的各种信息即可:发出请求的客户浏览器,被请求文件的名称和位置等等。服务器的工作是处理这个请求, 激活要求的方法(GET),并在响应信息中将结果发送给客户。这样的话,响应是回流到浏览器的HTML文件。浏览器显示此 HTML,然后与服务器的连接被释放。
HTTP是一个特别简单的协议。消息传输的模型直观。此外,HTTP仅支持可数的几个方法来连接服务器,发送请求消息并接收响应。HTTP的简单使得WEB获得了极大的成功。但是,简单也导致了它的局限性。例如,HTTP是一个无状态的协议,用一句易于理解的话说就是:“当你最后离开我们的站点时,我们不记得你做了些什么,因此你必须从断开处重建你的搜索”。
此外HTTP还有更多的局限,例如它不提供向远程服务器写文件的方法。短言之,仅仅使用HTTP是不够的,内容管理和真正的合作仍需要专用的方案。而WebDAV协议看上去似乎可以解决这些问题。
扩展的HTTP
WebDAV扩展了HTTP的基本请求/响应模型,新的方法使创作者能够在远程服务器上直接创建和修改基于WEB的文件。从我们已知的消息来看,WebDAV标准如HTTP一样不受WWW (World Wide Web)联盟的控制。相反地,WebDAV被Internet Engineering Task Force (IETF)中的一个网络工作组Network Working Groups所管理。其规范是一个IETF的请求说明,并列为RFC2518。
依据此规范,WebDAV的目标是提供一种让客户能够远程的创作WEB内容的标准;DAV-分布式创作和控制—在WebDAV中表明了一个创造交互式与协作应用的框架。正是这些特性使得WebDAV激动人心。
目前WebDAV的功能分为三类:命名空间管理、锁和所有权管理。WebDAV增加了基本的操作(拷贝和移动方法),允许应用程序拷贝和移动单个的文件。另外,WebDAV提供mkcol方法,使得工具能收集文件并提取文件的分级信息(例如,传统文件系统中的目录列表)。技术上讲,这些方法属于命名空间管理类。他们通过允许创建目录和文件来实现基本的创作目标。
分布式创作的一个重要方面是协作。为了支持这个特征,WebDAV采用了两个方法(加锁和解锁),以使一个用户在编辑文件时将其锁住以防止并发问题,并避免多个协作者相互覆盖其他人的改动。
WebDAV的所有权机制是它最有用的特征之一。本质上讲,在WebDAV中,所有权是元信息—表明谁创建这个文件、谁最后修改了这个文件等等。但是,在分布式创作环境中,问题会变得更加复杂。例如,你想编辑的资源是否可以获得,创作者是否有权限删除这个文件?通过所有权,可以发现和管理资源,并且,所有权可以使你实现更加高级的特性。该规范建议创建一个“主题” 所有权,允许以这些“主题”来检索所有的资源。
为支持这些特征,WebDAV提供了“Propfind”方法来查寻文件的各种所有权。同样有一个“Proppatch”方法,允许客户端工具设置,修改和删除一个所有权。一旦所有权被设置,一种被称为“DASL(DAV查找和定位协议)”的辅助技术允许应用根据所有权值来查找Web资源。
对于互操作性,一个分布式创作应用应当既独立于服务器平台——不管它是IIS、Apache或是其它的服务器,同时也应独立于浏览器——不管它是微软的IE,Netscape的Navigator或是PALM的Pilot。因为WebDAV基于HTTP,所以它必定独立于平台。通过保留旧的HTTP的消息格式和增加新的HTTP消息头WebDAV保留了平台独立的体系结构。这些消息头携带支持新的WebDAV应用的信息参数,以允许应用访问和设置所有权信息等等。而且,请求和响应消息以XML格式编码,此编码易于在以后增加新的特征,如所有权域。
支持软件
为了寻找WebDAV的支持,你可能从三个层次入手:操作系统层、WEB服务器层和包括WEB创作工具的应用层。在操作系统层,WebDAV通常提供基于Web联接的分布式文件共享服务。例如,微软利用WebDAV的优点实现了在Windows Explore上包含Web文件夹。Windows 2000和Windows XP提供了浏览远端目录、创建和操作文件的能力。同样地,苹果公司的MacOS X Server现在也包括了一个单独的WebDAV模块来为Mac客户提供文件服务。苹果甚至在将来想以WebDAV代替苹果文件共享。
由于Web服务器将可能提供巨多的分布式文件,你可能会看到WebDAV将在这个层次上实现得更加完备:方法就是安装WebDAV。对于Apache,最通用的方法是安装名为mod_dav的开放源代码模块。作为一个首先实现WebDAV协议的参照,mod_dav完全支持RFC2518。而且,mod_dav是Apache中八个最流行的模块。依据2001年11月Apache模块报告(在www.securityspace.com/s_survey/data/man.200110/apachemods.html 中可以查到),接近2%的公共站点已经安装了它。
IBM在其IBM HTTP服务器和WebSphere产品中使用mod_dav,表明WebDAV 同样可用于Intranet环境中。IBM Alphaworks同样允许Java开发者通过它的Dav4J项目来试着创建WebDAV应用。Dav4J是一个WebDAV客户的Java实现,它可以和Apache(通过mod_dav)或IBM WebSphere一起工作。
WebDAV的应用广泛:包括创作工具、内容管理系统和大量企业软件。当前的应用经常相互集成,例如,一个最流行的Web创作工具:Macromedia的Dreamweaver,依赖WebDAV来集成其领先的使用WebDAV协议的内容管理系统。Dreamweaver当前集成了Vignette、Documentum、BroadVision和ATG。
这个协议的最大的支持者之一Adobe在Adobe Acrobat 5.0 和 GoLive中集成了WebDAV。Acrobat利用WebDAV的优点来让多个检查者同时对在线的Adobe PDF文件增加说明。GoLive 5.0是Adobe的专业Web站点创作、制作和管理工具,它包括一个WebDAV浏览器,以允许Web设计者按工作组的方式进行工作:浏览远端文件夹或编辑远端文件。为了流水化协作,这个工具允许你登录、检查、锁定文件,以使你正在工作的文件不会由于同组的成员的误操作而被修改。
现在有无数其它的商业程序支持WebDAV。例如,Oracle使用一种定制的版本mod_dav来支持到本公司的内容管理系统的Web接口。Rational使用mod_dav的一种定制的版本来支持WebDAV用于ClearCase存贮。支持该标准的商用和开放源代码软件的部分目录可以在WebDAV站点找到。(见下文中的资源工具条。)
结论
与WebDAV用途一样,RFC2518具有DAV协议的第一部分:分布式创作。第二部分关于控制的规范还没有出台。有关控制的工作正在进行中,并且也处在由Delta/V项目(www1.ietf.org/mail-archive/ietf-announce/Current/msg14617.html)赞助的开发之中。这就意味着支持WebDAV的工具必需依靠版本管理产品来管理这方面的协作。例如,Dreamweaver 与Microsoft的Visual SourceSafe结合在一起来提供版本管理的功能。显然,这不是一个通用的解决方案。
最后,WebDAV没有考虑安全性的问题。但是同XML在一起,你应该遵守常识规则,并且注意使用现有的基础设施来保护。例如,在允许一个客户浏览,打开以及修改一个资源之前,你应该对这个客户进行身份认证。通常使用的方法是口令认证。由于基本的认证能够在一个不安全的通道内被截获,所以建议您使用安全连接机制,例如传输层安全。 Trackback: http://tb.donews.net/TrackBack.aspx?PostId=1045428 关闭apache的文件list功能, 文件列表
make sure you remove option indexes between <Directory "/usr/local/apache/htdocs">; option indexes ... ... </Directory>; 下面是最常用的40个CSS/JS风格和功能技术处理表单元素,真是收集的很全。
1-Styling dropdown select boxes- 修饰下拉列表。 2-<select> Something New, Part 1- 使用一点 DOM scripting 和一些有创意的CSS,你能让下拉列表好看的多。 3-Styling even more form controls- 这是对HTML表单元素的控制,通过CSS能控制checkbox选择的不同显示效果。 4-Check it, don’t select it- 当多选框选择元素太多,让选择项可以滚动的效果。demo代码在这里: here. 5-DropDown - xHTML/CSS/Javascript replacement of classic selectbox- 这是一个替代传统下拉列表的demo。 6-Masked Input Plugin- 这是对jQuery库进行修改后的效果,提供给用户更方便输入和进行验证。代码在 Internet Explorer 6/7, Firefox 1.5/2, Safari, 和 Opera上测试通过. 7-Custom Checkbox with jQuery- 提供定制化的checkbox效果。有 Safari skin 和 default skin两种皮肤供选择。 8-LiveValidation- LiveValidation 是一个小开源 javascript 库,提供客户端输入验证。 9-FancyForm- FancyForm 是一个强大的checkbox替代脚本,在外观和功能方面提供最强的灵活性。
10-Styling disabled text inputs- 一个不可输入的文本输入框。查看demo代码: Styling disabled form controls with CSS 11-PrettyCheckboxes- 一个简单的 jQuery 插件 来定制checkbox和radio buttons的外观。 12- Building a better web forms: Context highlighting using jQuery- 当用户输入焦点变化时,输入框效果变化,demo代码在这里:here 13-Control.SelectMultiple 这是下拉列表和checkbox同时使用的例子,很酷。
14- Justify elements using jQuery and CSS- 创建一个表单,内部元素需要精确定位对齐,你可以使用jQuery轻松做到这一点. 15-jQuery Form Input Example Plugin- 一个 jQuery 插件,在用户输入焦点进入后提示文字消失,很多网站用这一招。demo代码在这里: here. 16-Jquery-Autotab- 自动tab跳转,也是一个 jQuery 插件。
17-jquery-asmselect- 下拉列表的增强版。demo代码这里: here and here. 18-jQuery.AddToList- 一个非常方便定制的jQuery插件,下拉显示更多内容,通过AJAX方式新增内容,如果新增成功,成为下拉菜单的选项之一。很有用的技巧,Demo代码这里: here. 19-Easy Multi Select Transfer with jQuery- 一个jQuery完美的菜单选择例子。 20-fValidator- fValidator 是一个开源免费 javascript 工具,提供简单表单验证。例子在这里: examples . 21-Grow a textarea- 提供重新定义textarea框大小的功能。
22-jQuery selectbox replacement- 一个 jQuery 插件,提供更好界面替换HTML下拉列表。demo代码在这里: here. 23-Unobtrusive Slider Control V2- 通过输入值滑动块定位,以及改变颜色等。demo例子在这里: here. 24- jQuery Field Plug-in- jQuery插件,提供强大的form表单控制功能,比如文件上传类型等。
25-jquery.combobox- jquery.combobox是一个有用的创建HTML风格combobox工具。 demo代码在这里: here.
26-Checkboxes, Radio Buttons, Select Lists, Custom HTML Form Elements- 这个 JavaScript 和 CSS 提供可定制的图片作为背景给checkbox, radio buttons 和 select lists. 27-ToggleFormText plug-in example- ToggleFormText 是一个 jQuery 插件提供输入框帮助文字显示。
28-Password field with strength meter- extjs库,显示密码强度。
29-STYLING FILE INPUTS WITH CSS AND THE DOM- 优美的文件输入框设计。
30-Pin plugin for Prototype, Remember Field’s Values- prototype 的 Pin 插件提供记录某个输入框值的功能。demo代码: here. 31-accessible, javascript-enhanced, css-able form elements for mootools- 一个mootools javascript-class 客户定制元素,能够通过CSS定制你的 checkboxes 和 radiobuttons 。 32-Resizeable Textboxes- 重定义text输入框的大小。 33-Resizeable Textboxes- 用图片代替按钮,用 JavaScript 和 jQuery写的. demo 这里:here. 34-jQuery AlphaNumeric- jQuery AlphaNumeric 是一个 javascript控制插件,限制textboxes 或者 textareas输入字符长度。 35-Mootools Form Hints- Mootools/Javascript Form 提供输入框在线帮助。
36-MultiSelect- 下拉选择框+checkbox效果。例子在这里: here. 37- Watermark Input Plugin- 这是一个jQuery插件,显示附加信息的输入框。 40-Autohelp 每位用户都拥有“魔盘”上的网络空间。您可以阅览、共享文件夹及各种类型的文件。照片、图片、Word文档等,都不在话下。您更可以用手机安全地访问您电脑中的文件资料,也可将文件直接下载到手机中。 要使用远程访问这个功能请下载并安装魔橙桌面端软件,并在“文件功能”中选择 “允许远程访问”。
JDBC ConnectionThanks to Guo Meng. What is JDBC/SQLJJDBC是什么不用说了,关键是SQLJ.直接扒拉讲义。 JDBC is an application programming interface (API) that Java applications use to access relational databases. SQLJ provides support for embedded static SQL in Java applications. In general, Java applications use :
However, because SQLJ can inter-operate with JDBC, an application program can use JDBC and SQLJ within the same unit of work. 如何写JDBC程序照抄吧,用的太多了。 In general, you need to do the following things:
如何写SQLJ程序好像和JDBC区别不是太大。 In general, you need to do the following things:
如何实现JDBC/SQLJ的驱动程序其实归根到底就是按照JDBC的标准,把规定要实现的接口都实现了。 JDBC有4种driver架构: JDBC Driver Type 1Drivers that implement the JDBC API as a mapping to another data access API, such as Open Database Connectivity (ODBC). Drivers of this type are generally dependent on a native library, which limits their portability. The JDBC-ODBC Bridge driver is an example of a type 1.JDBC Driver Type 2Drivers that are written partly in the Java programming language and partly in native code. The drivers use a native client library specific to the data source to which they connect. Because of the native code, their portability is limited. JDBC Driver Type 3Drivers that use a pure Java client and communicate with a server using a database-independent protocol. The server then communicates the client's requests to the data source.JDBC Driver Type 4Drivers that are pure Java and implement the network protocol for a specific data source. The client connects directly to the data source.DB2的实现DB2 Universal JDBC Driver提供了上述Type2和Type4的接口,还实现了SQLJ的function. DB2 Universal JDBC Driver 的其他名字还包括:
JDBC/SQLJ Driver for OS/390 and z/OS 提供了上述Type 2的接口,其他名字包括:
The JDBC/SQLJ Driver for OS/390 and z/OS 在以后的DB2版本中不会被支持了。 如何选择以上Type对于Type 2
对于Type 4
因此:Driver selection based on data souce property or URL 对以上的总结:
Top 10 Concepts That Every Software Engineer Should Know - ReadWriteWeb
www.readwriteweb.com/archives/top_10_concepts_that... Top 10 Concepts That Every Software Engineer Should Know
Written by Alex Iskold / July 22, 2008 8:21 PM
/ 55 Comments
These days, a couple of engineers who know what they are doing can deliver complete systems. In this post, we discuss the top 10 concepts software engineers should know to achieve that. A successful software engineer knows and uses design patterns, actively refactors code, writes unit tests and religiously seeks simplicity. Beyond the basic methods, there are concepts that good software engineers know about. These transcend programming languages and projects - they are not design patterns, but rather broad areas that you need to be familiar with. The top 10 concepts are:
10. Relational Databases
At the core of the relational database is the concept of representing information in records. Each record is added to a table, which defines the type of information. The database offers a way to search the records using a query language, nowadays SQL. The database offers a way to correlate information from multiple tables. The technique of data normalization is about correct ways of partitioning the data among tables to minimize data redundancy and maximize the speed of retrieval. 9. Security
Authentication is about verifying user identity. A typical website prompts for a password. The authentication typically happens over SSL (secure socket layer), a way to transmit encrypted information over HTTP. Authorization is about permissions and is important in corporate systems, particularly those that define workflows. The recently developed OAuth protocol helps web services to enable users to open access to their private information. This is how Flickr permits access to individual photos or data sets. Another security area is network protection. This concerns operating systems, configuration and monitoring to thwart hackers. Not only network is vulnerable, any piece of software is. Firefox browser, marketed as the most secure, has to patch the code continuously. To write secure code for your system requires understanding specifics and potential problems. 8. Cloud Computing
Cloud computing grew out of parallel computing, a concept that many problems can be solved faster by running the computations in parallel. After parallel algorithms came grid computing, which ran parallel computations on idle desktops. One of the first examples was SETI@home project out of Berkley, which used spare CPU cycles to crunch data coming from space. Grid computing is widely adopted by financial companies, which run massive risk calculations. The concept of under-utilized resources, together with the rise of J2EE platform, gave rise to the precursor of cloud computing: application server virtualization. The idea was to run applications on demand and change what is available depending on the time of day and user activity. Today's most vivid example of cloud computing is Amazon Web Services, a package available via API. Amazon's offering includes a cloud service (EC2), a database for storing and serving large media files (S3), an indexing service (SimpleDB), and the Queue service (SQS). These first blocks already empower an unprecedented way of doing large-scale computing, and surely the best is yet to come. 7. Concurrency
Concurrency is about parallelism, but inside the application. Most modern languages have an in-built concept of concurrency; in Java, it's implemented using Threads. A classic concurrency example is the producer/consumer, where the producer generates data or tasks, and places it for worker threads to consume and execute. The complexity in concurrency programming stems from the fact Threads often needs to operate on the common data. Each Thread has its own sequence of execution, but accesses common data. One of the most sophisticated concurrency libraries has been developed by Doug Lea and is now part of core Java. 6. Caching
Caching comes with a cost. Only some subsets of information can be stored in memory. The most common data pruning strategy is to evict items that are least recently used (LRU). The prunning needs to be efficient, not to slow down the application. A lot of modern web applications, including Facebook, rely on a distributed caching system called Memcached, developed by Brad Firzpatrick when working on LiveJournal. The idea was to create a caching system that utilises spare memory capacity on the network. Today, there are Memcached libraries for many popular languages, including Java and PHP. 5. Hashing
Beyond the basic storage of data, hashes are also important in distributed systems. The so-called uniform hash is used to evenly allocate data among computers in a cloud database. A flavor of this technique is part of Google's indexing service; each URL is hashed to particular computer. Memcached similarly uses a hash function. Hash functions can be complex and sophisticated, but modern libraries have good defaults. The important thing is how hashes work and how to tune them for maximum performance benefit. 4. Algorithmic Complexity
Your code should (almost) never have multiple nested loops (a loop inside a loop inside a loop). Most of the code written today should use Hashtables, simple lists and singly nested loops. Due to abundance of excellent libraries, we are not as focused on efficiency these days. That's fine, as tuning can happen later on, after you get the design right. Elegant algorithms and performance is something you shouldn't ignore. Writing compact and readable code helps ensure your algorithms are clean and simple. 3. Layering
Lakos contended a good software follows the shape of a pyramid; i.e., there's a progressive increase in the cummulative complexity of each component, but not in the immediate complexity. Put differently, a good software system consists of small, reusable building blocks, each carrying its own responsibility. In a good system, no cyclic dependencies between components are present and the whole system is a stack of layers of functionality, forming a pyramid. Lakos's work was a precursor to many developments in software engineering, most notably Refactoring. The idea behind refactoring is continuously sculpting the software to ensure it'is structurally sound and flexible. Another major contribution was by Dr Robert Martin from Object Mentor, who wrote about dependecies and acyclic architectures Among tools that help engineers deal with system architecture are Structure 101 developed by Headway software, and SA4J developed by my former company, Information Laboratory, and now available from IBM. 2. Conventions and Templates
Naming conventions enable software automation. For example, Java Beans framework is based on a simple naming convention for getters and setters. And canonical URLs in del.icio.us: http://del.icio.us/tag/software take the user to the page that has all items tagged software. Many social software utilise naming conventions in a similar way. For example, if your user name is johnsmith then likely your avatar is johnsmith.jpg and your rss feed is johnsmith.xml. Naming conventions are also used in testing, for example JUnit automatically recognizes all the methods in the class that start with prefix test. The templates are not C++ or Java language constructs. We're talking about template files that contain variables and then allow binding of objects, resolution, and rendering the result for the client. Cold Fusion was one of the first to popularize templates for web applications. Java followed with JSPs, and recently Apache developed handy general purpose templating for Java called Velocity. PHP can be used as its own templating engine because it supports eval function (be careful with security). For XML programming it is standard to use XSL language to do templates. From generation of HTML pages to sending standardized support emails, templates are an essential helper in any modern software system. 1. Interfaces
Among the many books, Agile Programming by Dr Robert Martin stands out because of focus on modeling correct interfaces. In modeling, there are ways you can iterate towards the right solution. Firstly, never add methods that might be useful in the future. Be minimalist, get away with as little as possible. Secondly, don't be afraid to recognize today that what you did yesterday wasn't right. Be willing to change things. Thirdly, be patient and enjoy the process. Ultimately you will arrive at a system that feels right. Until then, keep iterating and don't settle. ConclusionModern software engineering is sophisticated and powerful, with decades of experience, millions of lines of supporting code and unprecidented access to cloud computing. Today, just a couple of smart people can create software that previously required the efforts of dozens of people. But a good craftsman still needs to know what tools to use, when and why. In this post we discussed concepts that are indispensible for software engineers. And now tell us please what you would add to this list. Share with us what concepts you find indispensible in your daily software engineering journeys. Image credit: cbtplanet.com
Posted in
and tagged with
随机带礼包:(含原装包,OEM鼠标,内胆包,清洁套装,转接头,网线),不要礼包可以减100元 详细配置:
給 Windows 使用者:你不該轉換到 Linux 的理由相信有人看到這個標題,一定會覺得我是不是吃錯藥了。為什麼一個使用 Linux 處理日常事務已經七八年的傢伙,會想寫這樣的東西阻止更多人跳進來用 Linux? 在我開始構思「我要怎麼讓人知道 Linux 的好?」這個問題時,我一直在思考著幾個重點:使用者的習慣、操作哲學、應用程式等等。因此以一個只「敢」用 Windows,卻可以順利地從 Windows 95, 98 一路升級使用到 Windows XP 的一般使用者角度來寫這篇,相信能有一定的公正度。只是我有一個先天不利點,很有可能讓這篇看起來沒那麼中肯實用:我是個使用 Linux 很久的使用者,而且我個人是反 M$ 商業行為的,雖然我在公司上班時都還是用 Windows。(順帶一提:這篇是我將我安裝 Ubuntu 7.10 的 Asus NB 帶到公司裡打的) 以一個使用 Windows XP 的使用者角度,我建議不要使用 Linux 的原因如下:
這點真的是無與倫比的大不利。在 Windows 下可以正常使用的 BisonCam(ASUS Notebook 有不少款都附加這個 Webcam),在 Linux 下仍然沒有可用的驅動程式!這樣一來,既使最新的 Linux 版 Skype 已經支援視訊,仍然無法使用視訊交談。另外,一些 USB 電視棒也沒支援。我如果正好買到 Linux 目前不支援的電視棒,那錢不就白花了? 也許有人會問:這些廠商怎麼不出支援 Linux 的驅動程式呢?這我也不知道,只有廠商自己知道。當然,我們都已經看到許多有遠見的廠商正式將自己的硬體產品加入 Linux 的支援行列,而那些打死不支援的廠商,是他們短視近利、是他們沒有開發非 Windows 平台 driver 的能力、還是他們背後有 M$ 的金援而受限,只有廠商自己知道。
這也是另外一個痛,尤其是好不容易「抓」到了 M$ Office 2007、Adobe Photoshop CS3 等等高級軟體時,卻不能在 Linux 下直接安裝使用(哦,我知道有 Wine,但使用者總是懶惰的,不能放入光碟片自動裝好的就不會裝。) 好啦,不酸了,我以正常的角度,先來說 Office 的問題:一般公家機關行號使用的 Office 系統,清一色都是 M$ Office 系列,釋出的公開檔案、在部內部外流通的檔案也都是 M$ DOC 格式。這已經是公家機關上班族的「習慣」,因此既使部份人士強調 M$ DOC 格式並非開放格式,應當將對外開放的文件以開放格式釋出時,他們不是不願意,而是不「懂」:什麼是開放格式?大家都在用 M$ Office,不用 M$ DOC 格式的人才是應該要自我反省的人,因為這些人並未配合政府機關,購入 M$ Office,統一使用 M$ DOC 格式。 而以一個美工人員身份來說...不提 Mac 上的軟體,單就 Windows 上的 Adobe Photoshop 來說就好了,這是絕大多數美工人員在學校上課時使用、熟悉的軟體,因此不論以什麼方式取得 Adobe Photoshop,滿足他們理由只有一個:「我只要 Adobe Photoshop,其他軟體我不要,因為我不會用,而且沒有軟體比 Adobe Photoshop 來得好用、來得強大。」有些人可能聽過 GIMP 或 GimpShop(Gimp 仿 Adobe Photoshop 外觀的變種),但因為「那不是 Adobe Photoshop」,所以他們不用。
排除使用應用軟體處理日常事務的部份,因為絕大部份的遊戲都以 DirectX 當底層進行開發,在 Windows 上自然有許多重量級的遊戲可玩。但 Linux 呢?在台灣,絕大多數遊戲都只支援 DIrectX,廠商也「只」支援 Windows 上的各項服務,自然不可能去照顧其他平台的使用者(只有一個例外:魔獸世界的 Mac 支援),更遑論 Linux 了。就算要自己來,有什麼遊戲是可以讓我直接放入光碟片就直接安裝在 Linux 上面,也不用調整什麼就能直接跑的?幾乎沒有。
我沒開玩笑,這真的是一個大問題。許多人使用電腦的經驗,大多建立在螢幕左下方的「開始」那個鈕。M$ 將這個鈕命名為「開始」真是一個人性化的設計:所有要使用的功能都可以透過這個「開始」鈕,逐步找到自己需要的功能。也因此,Linux 上大部份流行的桌面系統上面沒有「開始」這個鈕是一項重大的失敗,因為使用者根本不知道自己如何「開始」使用自己需要的軟體。 也許會有 Linux 使用者會說「可是 Gnome 有大腳丫,KDE 有大齒輪,功能也跟『開始』鈕一樣呀!」那是完全不一樣的使用者經驗:大腳丫與大齒輪代表的意義,與「開始」這兩個字毫不相關,使用者根本不知道那就是在 Gnome 桌面與 KDE 桌面上的「開始」,怎麼可能知道「原來我按下大腳丫或是大齒輪就有跟『開始』一樣的功能了。」也許有人看到這裡已經笑出來了,但這是很實際的人機介面設計概念,而且 M$ 的確在這裡成功建立起使用者的習慣。
上述林林總總的抱怨,都是一個正常的 Windows 使用者會遇到的習慣問題。我們都知道「積習難改」,若一個新的作業系統沒辦法滿足我們在常用軟體上的操作習慣,既使這個軟體再怎麼安全、好用、易學,使用者仍然不可能去試著改變習慣。
回想一下第一次使用 Windows 的時候,滑鼠在圖示上面要點兩下才能去使用這個檔案;滑鼠移到畫面左下方的「開始」點一下滑鼠左鍵,就可以顯示功能表,然後使用滑鼠操作鼠標在功能表中移動,移到功能表上有三角形指向右邊的,這就是子項目...找到你要的功能之後,在那項功能上面點一下滑鼠左鍵,就可以開始使用這個功能了... 當使用者第一次操作系統時,大多是在摸索階段。而在摸索階段時,不論是什麼平台,都會有相當類似的操作與學習經驗。(這裡我提的「類似」是指 Linux 桌面環境,而非 Linux 的文字介面。我不可能拿文字介面跟 Windows 比較啦。)M$ 很成功地讓 Windows 使用者快速征服了摸索階段,讓使用者發現他要做的可以用很簡單的方式達成,建立起使用者的成功經驗,讓使用者在透過使用 Windows 的過程更加為自己的成就感到興奮與安心。 現在的 Linux 辦得到嗎?辦得到,但 Windows 的使用經驗跟 Linux 的畢竟不同。在使用習慣上面永遠都是「先佔先贏」,Windows 的勝利是必然的,既使 Linux 後來居上也是一樣。
在這個電腦隨時可能被人入侵、植入木馬竊取資料的網路時代,沒有防廣告、防木馬與防毒軟體,的確是令人不安。因此使用 Windows 的使用者莫不花費許多時間在防堵這類情事發生,比方說為了找到卡巴斯基的「永久有效」金鑰花費不少時間在網路上搜尋,好不容易找到後安裝起來才發現這組金鑰已經被官方封鎖失效了,於是又花時間開始一樣的過程... Linux 上面不需要這些東西,因為 Linux 不會被植入「Windows 平台上的」廣告軟體、木馬與病毒,也因此不需要像卡巴斯基一樣強大的軟體來保護電腦。但也因為沒有這些軟體,反而造成一些已經習慣 Windows 平台的使用者的隱憂:真的不會中毒嗎?真的不會被植入木馬?我安裝 Linux 之後,不會跟以前一樣,還沒開完電腦就看到一大堆 IE 視窗,上面滿滿的賭博、色情跟借貸網站訊息,而且怎麼關也關不完?這是 Linux 的原罪:因為不需要這樣的軟體,反而造成「不信任」,因為一般使用者已經相當習慣且依賴防毒、防廣告、防木馬程式的存在了。因此,為了讓自己心安,不要考慮用 Linux。 當然堅持不轉換平台的理由還有很多,像是「我就已經花錢買了,何必轉換平台?」「別人都幫我裝好了,我何必找自己麻煩轉換平台?」「講那麼多做什麼啦,反正 Linux 就是有一堆 Windows 辦不到的,我才不要轉換平台咧!」我自己沒使用過 Windows Vista,所以我不說轉換到 Windows Vista 上面的問題,相信「願意學習 Windows Vista 平台的 Windows 使用者」,既使知道 Windows Vista 跟 Windows XP 有相當多的不同,比方說系統管理哲學啦、操作介面的改變啦、越來越高的系統需求啦等等,但就是願意由 Windows XP 轉換到 Windows Vista,原因是:「當 Windows Vista 更好用的時候,我就會跳到 Windows Vista,因為 Windows 是主流。我們一定要跟上主流!」讓我們為 Windows 使用者鼓掌吧!你們的堅持是對的,根本沒有必要轉換平台呀,要換也是從 Windows XP 換到 Windows Vista,因為「都是 M$ Windows 嘛,我信任 M$。」 說一句中肯的話作為本篇的結尾:無論如何,電腦是拿來解決問題的,若目前的作業系統環境已經解決自己的問題,的確不需要考慮轉換平台。 PS. 我反覆看過這篇,也承認我自己還是帶著「酸 Windows 使用者」的態度在寫,不過我仍然希望閱讀本篇的 Windows 使用者能提供更多「支持 Windows」的正面意見,也期望我們能在這些意見中得到更多的想法與啟發。
原作者: Robert Strohmeyer 译者: sctronlin... (Blog) 原文链接
![]() 如果您是位狂热的 Gentoo 或者 Slackware 粉丝,请离开,不要继续读下去。您可能不会像我说的那样。(但是向您保证,我尊敬并欣赏您的目标,致力于运行您自己可以完成的简单的 GNU/Linux 安装。我会注意保护您选择的自由。)而现在,我开始说我的。 如果这两年,您才开始使用 Linux,就很可能使用 Ubuntu。如果您第一次考虑尝试 Linux时遇到困难,,您无疑应该考虑 Ubuntu。这儿是为什么。 选择 Ubuntu 有以下两类理由:快速上手以及长久的生存能力。快速上手,是指使用 Ubuntu 无需指导。花几分钟安装,立刻识别大部分硬件,隐藏 root(根)用户,避免有人弄乱它。接着预设配置,让您马上开始工作。Ubuntu 提供不错的开发者联合平台,OEM 顾客不断增长以及——最重要的——全球庞大的用户基础。 第一,上手部分。 实际上,几乎没有人喜欢安装操作系统。如果您碰到过最多数量的电脑,这可能意味着您在电脑里,那您或许是个例外。但是对于大部分人来说,操作系统安装是个无聊的,有时甚至烦躁的过程,这是绝大多数最终用户都希望避免的。不像大多数其他的发行版*,你可以从 Dell(戴尔)等电脑品牌商得到预装的 Ubuntu,意味着您可以跳过所有安装的障碍,马上在运行的电脑上开始工作。(最近传闻指出 HP 惠普马上也要加入安装 Ubuntu 客户行列。) 如果您选择自己安装 Ubuntu,您可能希望最流行的安装流程之一可以用于任何操作系统。当 Ubuntu 安装过程让您选择自定义硬盘分区时,您也可以马上点击下一步,只需要停下来输入时区、用户名和密码,直到安装完成。您体验到的与 Windows Vista 和 Mac OS X 几乎完全相同。 硬件兼容方面,Ubuntu 牢不可破。这些年来,我安装 Ubuntu 从基于 Power PC 的 Mac 到高端的游戏桌面电脑和一些笔记本。我也找到了一个它不能很容易支持的系统。我个人测试硬件兼容性平台是低端的 Gateway MX3228 笔记本,我经常使用其作为测试系统。(我刚才顺便在上面打字。)它集成 Via UniChrome GPU(图形处理器)、WXGA 显示器、Broadcom 4318 无线网卡、Via 集成声卡以及 Texas Instruments(德州仪器)多媒体读卡器。几乎每次我安装系统,都会碰到点小问题,包括 Windows Vista。花十多分钟从 Gateway 网站下载并安装正确 Vista 驱动,许多 Linux 发行版本也不能够直接显示。即使最新的 Sabayon 版本,其对于硬件支持方面自吹自擂,但对于我这种冷门笔记本也束手无策。但当我为此重装了 Ubuntu,极其少见地花了30多分钟配置所有硬件部分,终于现在机器完美运行。大部分要感谢所有 Ubuntu 论坛上乐于助人的朋友,他们慷慨地分享自己的经验。对于每一个疑难杂症简单地跟随一步一步指令做即可。 因为 Ubuntu 隐藏了 root(根)用户,运行管理员命令需使用 sudo。Ubuntu 保护了新用户自己。这很像 Windows Vista 的用户管理,只有较少的麻烦和更高的安全性。许多其他发行版本仍旧允许用户以 root 登录,对于喜欢乱弄的新手来说可能会带来一场灾难。 安装操作系统只是小部分的电脑经验。事实上,大多数电脑用户从来没有过那样的经历。一旦您第一次启动 Ubuntu,准备狂欢,做些真正的事情。Ubuntu 已经建立了一个高规格的平台带有预先配置好的软件,其中为您提供一个专业规格的办公软件包、强大的图形编辑软件、多功能的相片管理软件、智能的音乐播放器和其它普通人可能需要的软件——一起都准备好,可以马上运行。现在所有主要发行版本都做得同样出色,但我相信 Ubuntu 会掌握好安装所有软件包和避免不必要软件包之间的平衡。如果您遇到想要的软件没有安装,选择 Applications(应用软件) > Add/Remove...(添加/删除...),然后点击它。(或者如果更高级的用户,您可以在 Synaptic Package Manager(新立得软件包管理器)找到继续全部主要开源 Linux 应用软件。)买一台新 Mac 或者 Windows 电脑。在实际开始做事前,您还需要花费数小时安装所有经常用的软件。购买一台预装 Ubuntu 的电脑,您5分钟内就可以开始工作。 但是老实说,我认为 Ubuntu 拥有长期的生存能力重要于其短期的实用主义。最近几年来,对于改进 Linux 桌面方面,Ubuntu 做得比其他发行版本要多。这就是我已详细讨论的,其带来的实际好处,但它也有许多不明确的地方。感谢用户和主流科技媒体流露出值得纪念的表扬, Ubuntu 现在甚至比 Red Hat 在最终用户中更为流行。所有这些流言对于 Ubuntu 产生巨大的动力,让它成为家用桌面历史上支持最棒的 Linux 发行版。在完全一致的呼声中,最终用户使得 Ubuntu 成为 Dell 预装 Linux 系统的第一选择。鉴于流行广泛的影响,Ubuntu 开始克服所有 Linux 发行版面临的最大障碍之一:不为人所知。 历史上,支持 Linux 对于硬件开发者来说,是个麻烦的问题。令人怯步的任务是需要一系列的打包系统,这会让提供者感到惊愕。很难决定支持哪个发行版本,如果有的话。往往,提供者简单地放弃而不是解决这个问题。Ubuntu 倍受瞩目的状态给了开发者一个作为他们在 Linux 世界冒险的明显起始点,显著降低这个关键入门障碍。因为 Ubuntu 立足于家用桌面用户而不只是管理员与超级奇客。在高端图形硬件上更多可能有飞速发展,潜在地引领 Linux 游戏体验上需要的更多改进。 这里恰当的说,对于 Linux 来看,Ubuntu 总体上在桌面上是成功。它必须打造一个有别于其他落伍的、专业的操作系统的声誉。作为常识,它必然会得到大量批评。主要 GNU/Linux 世界出现分裂和潜在用户、开发者、提供者,类似大量批评是难以避免的。从我的角度看,Ubuntu 最有希望统一 Linux 社区,去邀请——而不是威胁——主要的软硬件提供者,满足非技术的最终用户。如果在未来一两年内 Ubuntu 控制住所面临的混乱增长,它有可能上升为世界桌面操作系统领域主要的第三种选择。目前没有一个其他的 Linux 发行版本能做到。 现在,那些有经验的 Linux 用户不理会我这种大胆的说法,或许会回避所有 Ubuntu 话题。但有一件事:Ubuntu 的成功也帮助了您的发行版。Ubuntu 易用且流行,对于用户及提供者,它都可以作为入门的发行版。人们一旦数量使用 Ubuntu,他们可能会转而尝试 Fedora。提供者一开始支持 Ubuntu,支持 PCLinuxOS 也很容易了。希望任何提供者提供对于所有发行版本支持是不明智的,循序渐进的支持有助于整个 Linux 的发展。虽然不可想像 Linux 会成为主流,但没有任何东西可以阻止300多个发行版本的出现(而且每天还在诞生更多版本),以及千百万程序员为此奋斗。 如果你刚刚进入 Linux 社区,你可能是激动的。现在所有的东西对你来说似乎都是新的、陌生的,但是如果你有兴趣,使用大量论坛和其它社区资源。你一会儿就成为了高手。一旦你掌握了现象的本质和使用过发行版的不同功能,你会发现自己的电脑有无限可能。 坦白说,任意两个 Linux 发行版本之间的差异是很小的。而且不知从何开始不会阻止人们进来。这就是我从这里开始,我推荐新手使用 Ubuntu。如果你感兴趣于进入更具技术挑战的领域,那请尝试 Gentoo 或者 Slackware,甚至某些开源的 BSD 版本。重要的是满足自己的需求,尝试新事物,让电脑自由。 太容易了。那就来吧。 Ubuntu 8.04为我们节省多少电能?
当今,计算机操作系统也谈是否“节能”。大家都知道,笔记本电脑耗电的多少,是一个比较头疼的问题。近日,世界权威性测试机构Phoronix(被称为“ 书呆子气”,意思是说,办事“刻板”,斤斤计较)对Ubuntu8.04和VistaUltimate耗电性能进行了严格“比较”。结果怎样 呢? 4月25日,MichaelLarabel在“Ubuntu8.04 vs. Windows Vista Power Usage”一文指出:在LenovoThinkPad T60笔记本电脑(1GB内存、80GB硬盘、Intel双核处理器)上,在“待机”(加电,不工作)状态下,Ubuntu8.04耗电38瓦,而 Vista耗电43瓦,两者相差5瓦!前者比后者“节电”10%以上。这是什么原因呢?一是Intel的CPU节电性能(PowerTOP)的提高;二是 Linux内核的“tick-less”(“无滴答”)性能改进。非常明显的是,这是一项节电的“硬指标”,无论你怎么说(不管从哪方面来看)。 4月24日,“TheVARGuy”(组织名称)发表文章,题为“FiveReasons Ubuntu Server Revolution BeginsToday”,指出:“从此以后的十年中,历史学家将会说,4月24日这一天将是Ubuntu服务器到达“尖点 ”(“TippingPoint”)的一天”。文章的主题思想非常明确:Ubuntu8.04(LTS)服务器版本的发布,因其性能和使用许可方式(绝对 的自由软件)的优异性,必将对整个Linux生态系统产生非常深远的影响。文章指出,当今,Ubuntu所缺少的是分销商、集成商和增值服务商,人们(一 特别是指那些笃信红帽和Novell“商业模式”的人群)还不完全理解Ubuntu给他们带来的商业机遇。如同“软件矿泉水”的Ubuntu,“本体”绝 对免费,难道还有商机吗?4月14日,Canonical推出的“Ubuntu桌面课程”(网络教学),每一个人的“学费”为100美元。假定在“结业” 之后,还能发给一份“Ubuntu(电子)证书”,我看,这是一个不错的“选择”嘛! (注:今后,我想写点“Ubuntu经营业务经”,给那些勇敢创业者出一些“馊主意”。)
Ubuntu 基本技巧
http://linux.blogbus.com/logs/13826439.html #安装 查看软件xxx安装内容 dpkg -L xxx #查找软件 apt-cache search 正则表达式 #查找文件属于哪个包 dpkg -S filename apt-file search filename #查询软件xxx依赖哪些包 apt-cache depends xxx # 查询软件xxx被哪些包依赖 apt-cache rdepends xxx # 增加一个光盘源 sudo apt-cdrom add # 系统升级 sudo apt-get update sudo apt-get dist-upgrade # 清除所有已删除包的残馀配置文件 dpkg -l |grep ^rc|awk '{print $2}' |tr ["\n"] [" "]|sudo xargs dpkg -P - # 编译时缺少h文件的自动处理 sudo auto-apt run ./configure # 查看安装软件时下载包的临时存放目录 ls /var/cache/apt/archives # 备份当前系统安装的所有包的列表 dpkg --get-selections | grep -v deinstall > ~/somefile # 从上面备份的安装包的列表文件恢复所有包 dpkg --set-selections < ~/somefile sudo dselect # 清理旧版本的软件缓存 sudo apt-get autoclean # 清理所有软件缓存 sudo apt-get clean # 删除系统不再使用的孤立软件 sudo apt-get autoremove # 查看包在服务器上面的地址 apt-get -qq --print-uris install ssh | cut -d\' -f2 # 系统 # 查看内核 uname -a # 查看Ubuntu版本 cat /etc/issue 或者 lsb_release -a # 查看内核加载的模块 lsmod # 查看PCI设备 lspci # 查看USB设备 lsusb # 查看网卡状态 sudo ethtool eth0 # 查看CPU信息 cat /proc/cpuinfo # 显示当前硬件信息 sudo lshw # 硬盘 # 查看硬盘的分区 sudo fdisk -l # 查看IDE硬盘信息 sudo hdparm -i /dev/hda # 查看STAT硬盘信息 sudo hdparm -I /dev/sda 或 sudo apt-get install blktool sudo blktool /dev/sda id # 查看硬盘剩馀空间 df -h df -H # 查看目录占用空间 du -hs 目录名 # 优盘没法卸载 sync fuser -km /media/usbdisk # 内存 # 查看当前的内存使用情况 free -m # 进程 # 查看当前有哪些进程 ps -A # 中止一个进程 kill 进程号(就是ps -A中的第一列的数字) 或者 killall 进程名 # 强制中止一个进程(在上面进程中止不成功的时候使用) kill -9 进程号 或者 killall -9 进程名 # 图形方式中止一个程序 xkill 出现骷髅标志的鼠标,点击需要中止的程序即可 # 查看当前进程的实时状况 top # 查看进程打开的文件 lsof -p # ADSL # 配置 ADSL sudo pppoeconf # ADSL手工拨号 sudo pon dsl-provider # 激活 ADSL sudo /etc/ppp/pppoe_on_boot # 断开 ADSL sudo poff # 查看拨号日志 sudo plog # 如何设置动态域名 #首先去 http://www.3322.org 申请一个动态域名 #然後修改 /etc/ppp/ip-up 增加拨号时更新域名指令 sudo vim /etc/ppp/ip-up #在最後增加如下行 w3m -no-cookie -dump 'http://username:password@members.3322.org/dyndns/update?system=dyndns&hostname=yourdns.3322.org' # 网络 # 根据IP查网卡地址 arping IP地址 # 根据IP查电脑名 nmblookup -A IP地址 # 查看当前IP地址 ifconfig eth0 |awk '/inet/ {split($2,x,":");print x[2]}' # 查看当前外网的IP地址 w3m -no-cookie -dump www.ip138.com|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' w3m -no-cookie -dump www.123cha.com|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' w3m -no-cookie -dump ip.loveroot.com|grep -o '[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}' # 查看当前监听80端口的程序 lsof -i :80 # 查看当前网卡的物理地址 arp -a | awk '{print $4}' ifconfig eth0 | head -1 | awk '{print $5}' # 立即让网络支持nat echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward sudo iptables -t nat -I POSTROUTING -j MASQUERADE # 查看路由信息 netstat -rn sudo route -n # 手工增加删除一条路由 sudo route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 sudo route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1 # 修改网卡MAC地址的方法 sudo ifconfig eth0 down #关闭网卡 sudo ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE #然後改地址 sudo ifconfig eth0 up #然後启动网卡 # 统计当前IP连接的个数 netstat -na|grep ESTABLISHED|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n netstat -na|grep SYN|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n # 统计当前20000个IP包中大于100个IP包的IP地址 tcpdump -tnn -c 20000 -i eth0 | awk -F "." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr | awk ' $1 > 100 ' # 屏蔽IPV6 echo "blacklist ipv6" | sudo tee /etc/modprobe.d/blacklist-ipv6 # 服务 # 添加一个服务 sudo update-rc.d 服务名 defaults 99 # 删除一个服务 sudo update-rc.d 服务名 remove # 临时重启一个服务 /etc/init.d/服务名 restart # 临时关闭一个服务 /etc/init.d/服务名 stop # 临时启动一个服务 /etc/init.d/服务名 start # 设置 # 配置默认Java使用哪个 sudo update-alternatives --config java # 修改用户资料 sudo chfn userid # 给apt设置代理 export http_proxy=http://xx.xx.xx.xx:xxx # 修改系统登录信息 sudo vim /etc/motd # 使用eclipse等其他自带java编译器的软件,换回sun的编译器方法 sudo update-java-alternatives -s java-1.5.0-sun (jdk1.5) sudo update-java-alternatives -s java-6-sun (jdk6) # 中文 # 转换文件名由GBK为UTF8 sudo apt-get install convmv convmv -r -f cp936 -t utf8 --notest --nosmart * # 批量转换src目录下的所有文件内容由GBK到UTF8 find src -type d -exec mkdir -p utf8/{} \; find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} \; mv utf8/* src rm -fr utf8 # 转换文件内容由GBK到UTF8 iconv -f gbk -t utf8 $i > newfile # 转换 mp3 标签编码 sudo apt-get install python-mutagen find . -iname “*.mp3” -execdir mid3iconv -e GBK {} \; # 控制台下显示中文 sudo apt-get install zhcon 使用时,输入zhcon即可 # 文件 # 快速查找某个文件 whereis filename find 目录 -name 文件名 # 查看文件类型 file filename # 显示xxx文件倒数6行的内容 tail -n 6 xxx # 让tail不停地读地最新的内容 tail -n 10 -f /var/log/apache2/access.log 或者 tailf /var/log/apache2/access.log # 查看文件中间的第五行(含)到第10行(含)的内容 sed -n '5,10p' /var/log/apache2/access.log # 查找包含xxx字符串的文件 grep -l -r xxx . # 查找关于xxx的命令 apropos xxx man -k xxx # 通过ssh传输文件 scp -rp /path/filename username@remoteIP:/path #将本地文件拷贝到服务器上 scp -rp username@remoteIP:/path/filename /path #将远程文件从服务器下载到本地 tar cvzf - /path/ | ssh username@remoteip "cd /some/path/; cat -> path.tar.gz" #压缩传输 tar cvzf - /path/ | ssh username@remoteip "cd /some/path/; tar xvzf -" #压缩传输一个目录并解压 # 查看某个文件被哪些应用程序读写 lsof 文件名 # 把所有文件的後辍由rm改为rmvb rename 's/.rm$/.rmvb/' * # 把所有文件名中的大写改为小写 rename 'tr/A-Z/a-z/' * # 删除特殊文件名的文件,如文件名:--help.txt rm -- --help.txt 或者 rm ./--help.txt # 查看当前目录的子目录 ls -d */. 或 echo */. # 将当前目录下最近30天访问过的文件移动到上级back目录 find . -type f -atime -30 -exec mv {} ../back \; # 将当前目录下最近2小时到8小时之内的文件显示出来 find . -mmin +120 -mmin -480 -exec more {} \; # 删除修改时间在30天之前的所有文件 find . -type f -mtime +30 -mtime -3600 -exec rm {} \; # 删除创建时间在30天之前的所有文件 find . -type f -ctime +30 -ctime -3600 -exec rm {} \; # 查找guest用户的以avi或者rm结尾的文件并删除掉 find . -name '*.avi' -o -name '*.rm' -user 'guest' -exec rm {} \; # 查找的不以java和xml结尾,并7天没有使用的文件删除掉 find . ! -name *.java ! -name ‘*.xml’ -atime +7 -exec rm {} \; # 统计当前文件个数 ls /usr/bin|wc -w # 统计当前目录个数 ls -l /usr/bin|grep ^d|wc -l # 显示当前目录下2006-01-01的文件名 ls -l |grep 2006-01-01 |awk '{print $8}' # 压缩 # 解压缩 xxx.tar.gz tar -zxvf xxx.tar.gz # 解压缩 xxx.tar.bz2 tar -jxvf xxx.tar.bz2 # 压缩aaa bbb目录为xxx.tar.gz tar -zcvf xxx.tar.gz aaa bbb # 压缩aaa bbb目录为xxx.tar.bz2 tar -jcvf xxx.tar.bz2 aaa bbb # Nautilus # 显示隐藏文件 Ctrl+h # 显示地址栏 Ctrl+l # 特殊 URI 地址 * computer:/// - 全部挂载的设备和网络 * network:/// - 浏览可用的网络 * burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录 * smb:/// - 可用的 windows/samba 网络资源 * x-nautilus-desktop:/// - 桌面项目和图标 * file:/// - 本地文件 * trash:/// - 本地回收站目录 * ftp:// - FTP 文件夹 * ssh:// - SSH 文件夹 * fonts:/// - 字体文件夹,可将字体文件拖到此处以完成安装 * themes:/// - 系统主题文件夹 # 查看已安装字体 在nautilus的地址栏里输入”fonts:///“,就可以查看本机所有的fonts # 程序 # 详细显示程序的运行信息 strace -f -F -o outfile <cmd> # 日期和时间 # 显示日历 cal # 显示当月日历 cal 2 2007 # 显示2007年2月的日历 # 设置日期 date -s mm/dd/yy # 设置时间 date -s HH:MM # 将时间写入CMOS hwclock --systohc # 读取CMOS时间 hwclock --hctosys # 从服务器上同步时间 sudo ntpdate time.nist.gov sudo ntpdate time.windows.com # 工作区 # 不同工作区间切换 Ctrl + ALT + ← Ctrl + ALT + → 或者,将滚轮鼠标放在工作区图标上滚动 # 控制台 # 指定控制台切换 Ctrl + ALT + Fn(n:1~7) # 控制台下滚屏 SHIFT + pageUp/pageDown # 控制台抓图 setterm -dump n(n:1~7) # 数据库 # mysql的数据库存放在地方 /var/lib/mysql # 从mysql中导出和导入数据 mysqldump 数据库名 > 文件名 #导出数据库 mysqladmin create 数据库名 #建立数据库 mysql 数据库名 < 文件名 #导入数据库 # 忘了mysql的root口令怎么办 sudo /etc/init.d/mysql stop sudo mysqld_safe --skip-grant-tables & sudo mysqladmin -u user password 'newpassword sudo mysqladmin flush-privileges # 修改mysql的root口令 sudo mysqladmin -u root -p password '你的新密码' # 控制 # 如何使用命令关闭显示器 xset dpms force off # 如何使用命令关闭笔记本的触摸板 synclient touchpadoff=1 那么开启触摸板就是: synclient touchpadoff=0 # 统计 # 统计最常用的10条命令 history | awk '{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] " " CMD[a]/count*100 "% " a;}' | grep -v "./" | column -c3 -s " " -t | sort -nr | nl | head -n10 # 统计80端口的连接个数并按照从大到小排列 netstat -na|grep :80|awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -r -n # 其它 # 如何禁用/启用某个帐户 sudo usermod -L username #锁定用户 sudo usermod -U username #解锁 # 下载网站文档 wget -r -p -np -k http://www.21cn.com · -r:在本机建立服务器端目录结构; · -p: 下载显示HTML文件的所有图片; · -np:只下载目标站点指定目录及其子目录的内容; · -k: 转换非相对链接为相对链接。 # 如何多线程下载 sudo apt-get install axel axel -n 5 http://xxx.xxx.xxx.xxx/xxx.zip 或者 lftp -c "pget -n 5 http://xxx.xxx.xxx.xxx/xxx.zip“ # 如何删除Totem电影播放机的播放历史记录 rm ~/.recently-used # 如何更换gnome程序的快捷键 点击菜单,鼠标停留在某条菜单上,键盘输入任意你所需要的键,可以是组合键,会立即生效; 如果要清除该快捷键,请使用backspace # vim 如何显示彩色字符 sudo cp /usr/share/vim/vimcurrent/vimrc_example.vim /usr/share/vim/vimrc 《全新memcache client发布,提速20倍》的相关内容相关讨论memcache_engine + memcachedb = 高性能分布式内存数据库memcachedb是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。
memcachedb给memcac ...
by robbin 2008-01-22 浏览 (2759) 回复 (18) 关键字: memcachedb
使用Filter方式实现用Memcached储存Session这两天看到了帖子《扩展Tomcat 6.x,使用memcached存放session信息》,挺有意思,以前我也有采用Memcached管理Session的想法,就是一直没有实践,这两天就实践了一下,codeutil提供的采用扩展Tomcat的方式不错,不过我更喜欢用Resin,所以还是实现一个通用的模块吧,大家可以下载附件,里面有整个工程,如果要使用的话,参照web.xml,把Filter加入你自 ...
by laoer 2007-05-24 浏览 (4687) 回复 (10) 关键字: web
关于memcached client的选择Memcached(http://www.danga.com/memcached/)是被广泛使用的分布式缓存技术,javaeye也使用memcached做对象缓存。
不同的语言有不同的memcached客户端程序,对于java客户端来说,memcached网站给了两个选择:
引用
1. A Java API is maintained by Greg Whalin from Meetup.com. ...
by andyao 2008-01-10 浏览 (1195) 回复 (8) 关键字: java memcached client
ruby on rails应用性能优化之道这是一篇我们运营JavaEye网站将近半年时间所得到经验的总结。目前在整个rails社区,都极少有运营rails大访问量网站经验的人详细的谈这个话题。至于国内,rails应用都停留在学习和尝试阶段,真正投入商业运营的基本找不到,所以谈这个话题为时太早,颇有对牛弹琴的感觉。所以权当是个人的总结性文章吧,也不会很详细的展开谈论,能对大家有所启发就好。
一、硬件
1、CPU
ruby解析器相对于JV ...
by robbin 2007-02-01 浏览 (15097) 回复 (15) 关键字: rails performance
关于实现一个rails smart cache 的思路草稿。最近研究了一下 rails的cache设计,发现其中一些不尽如人意的地方:
* cache expiry 编写繁琐
* 分页缓存的清除,现有cache实现的支持都不是很完善
* 在一次清除大量缓存的时候,脏数据读的问题。
我查阅了一些blog以及相关的文章,从他们的抱怨和设计中得到一些启发,我觉得cache可以做得更好,更智能,更能够减少开发人员的工作量。 下面是我设计思路的一些草稿,如 ...
by firebody 2007-12-10 浏览 (3046) 回复 (12) 关键字:
相关博客memcache_engine + memcachedb = 高性能分布式内存数据库memcachedb是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。
memcachedb给memcac ...
by robbin 2008-01-22 浏览 (3932) 回复 (18) 关键字: memcachedb
实战web2.0技术篇-MemCache深度分析 - ztMemcached是“分布式”的内存对象缓存系统,那么就是说,那些不需要“分布”的,不需要共享的,或者干脆规模小到只有一台服务器的应用,memcached不会带来任何好处,相反还会拖慢系统效率,因为网络连接同样需要资源,即使是UNIX本地连接也一样。 在我之前的测试数据中显示,memcached本地读写速度要比直接PHP内存数组慢几十倍,而APC、共 ...
by huangxx 2008-03-29 浏览 (25) 回复 (0) 关键字:
Memcached在大型网站中应用 memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同 ...
by weiwu83 2007-06-12 浏览 (564) 回复 (1) 关键字: Memcache
memcached安装【memcached安装】memcached 官方网站 http://www.danga.com/memcached/PHP memcached client http://wikipedia.sourceforge.net/doc ...
by yanwenhan 2008-02-01 浏览 (138) 回复 (0) 关键字:
Memcached简介 转自:http://hi.baidu.com/bydv/blog/item/2a223d7f47d8860829388a89.html
memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJo ...
by VerRan 2007-05-08 浏览 (795) 回复 (0) 关键字:
相关圈子讨论关于海航股份和翔鹏团队系统单点登陆的实现起因源于,翔鹏系统和海航股份系统业务相近,因此。翔鹏的用户希望能够在股份团队和翔鹏团队之间实现单点登陆,也就是在股份团队系统中登陆之后就可以在翔鹏系统不用再次登陆。鉴于用户上面的需求,项目组决定参考第三方的方案实现单点登陆。
最后我们选用CAS(Central Authentication Service) ,它是 Yale 大学发起的一个开源项目。据统计,大概每 10 个采用开源构建 Web ...
by wyyhzc 2007-09-25 浏览 (259) 回复 (0)
颓然忙了一天,却坚定了3.0早日上线的想法今天是四月份的最后一天,我没有去上班,计划在家里好好的修改网站代码。我知道JavaEye网站的访问速度已经很慢了,即使排除爬虫的原因,也比以前慢多了,另外bug也非常多非常多,令人难以忍受。
我个人参与JavaEye网站代码编写基本上是阶段性的。在最早期写了一部分,中间集中精力运营网站则脱离了一段时间。到去年11月份又写了一段时间的代码,今年年初为了优化性能又写了一段时间,春节期间也写了一段时间 ...
by robbin 2007-04-30 浏览 (11187) 回复 (55)
打算建立一个小团队,收集点民意通过这几天的讨论我感觉有必要组织一个小团队,合作一个项目,通过它来学习D语言。
这个帖子用来收集大家的想法,看看都想做哪些方面的项目,持续讨论一周时间吧。
by qiezi 2007-04-05 浏览 (3206) 回复 (94)
相关新闻libmemcached发布了,ruby访问memcached提速20倍1月13号一个全新的C写的memcached客户端libmemcached发布了,libmemcached不同于老的apr_memcache,他是一个全新设计的客户端,能够以更快的速度,更好的内存消耗来和memcached server通讯。
在libmemcached发布以后的,两个封装libmemcached的ruby软件包就先后发布了:
1、Caffeine
将近100%兼容目前纯ru ...
by robbin 2008-01-21 浏览 (1167) 回复 (1) 关键字: libmemcached
memcache_engine + memcachedb = 高性能分布式内存数据库memcachedb是一个由新浪网的开发人员开放出来的开源项目,给memcached分布式缓存服务器添加了Berkeley DB的持久化存储机制和异步主辅复制机制,让memcached具备了事务恢复能力、持久化能力和分布式复制能力,非常适合于需要超高性能读写速度,但是不需要严格事务约束,能够被持久化保存的应用场景,例如memcachedb被应用在新浪博客上面。
memcachedb给memcac ...
by robbin 2008-01-22 浏览 (2703) 回复 (16) 关键字: memcached
基于memcached的分布式数据库缓存系统dbcacheddbcached是新浪的开发团队最近新发布的一个基于memcached的开源项目:
http://code.google.com/p/dbcached/
dbcached和新浪另外一个开源项目memcached比较像,都是支持memcached协议,利用memcached进行内存缓存的产品。dbcached的架构图:
根据作者的博客介绍:
● 兼容:Memcached 能做的,db ...
by robbin 2008-03-24 浏览 (675) 回复 (2) 关键字: dbcached 启动memcached
# /usr/local/bin/memcached -d -m 2048 -l 172.18.19.250 -p 11211 -u system_u -d选项是启动一个守护进程, -m是分配给Memcache使用的内存数量,单位是MB, -u是运行Memcache的用户,我这里是system_u, -l是监听的服务器IP地址,如果有多个地址的话,可以用多个 -l YOU_IP -p是设置Memcache监听的端口,最好是1024以上的端口, -c选项是最大运行的并发连接数,默认是1024,按照你服务器的负载量来设定, -P是设置保存Memcache的pid文件 如果要结束Memcache进程,执行: 用# ps -e 查看进程 # kill pid memcached的进程号 运行后有些系统还会提示-bash: kill: pid: arguments must be process or job IDs ,但是用# ps -e查看进程,已经没有memcached的进程了。
最近公司一直在招人,我作为主考官之一 。经常会提问的一个问题,就是让用户介绍自己在缓存方面的经验和心得。绝大多数的面试者只能说ASP.net的页面缓存和局部缓存,稍稍有点经验的,会提到企业库的缓存,只有很少的人会知道Memcached(一个分布式的缓存)。而对于缓存的一些基本思想,却没有一个人能说出来。 现在的技术人员,很多时候,不管三七二十一,把一个个实体丢到缓存中,然后在用的时候,就从缓存中去找这个实体。而不会考虑缓存的其他方面因素。所以他们在提到缓存时,想到的才只能是一个个的缓存实现的方法,而不是缓存的思想。 那么,肯定就有人问,蝈蝈俊,那你理解的缓存思想是如何的呢?下面我就一一来说出我理解的缓存。 Q:什么样的缓存才是好缓存? 能解决问题的缓存就是好缓存。这句话简直就是废话,相当于白猫、黑猫,抓住老鼠的就是好猫。 那在解决问题前提下,哪个缓存才是好缓存呢? 这个问题我的答案是:缓存命中率高的缓存是好缓存。 在解决问题前提下,命中率高的缓存比命中率低的缓存,在硬件投入上可能会比较小,同时缓存的数量比命中率低的缓存数量也可能少,这样寻址的速度肯定比较快。所以命中率高的缓存是好缓存。
缓存的命中率 一个缓存的实体在被丢到缓存中后,在这个实体被缓存的期间(这个实体被缓存的生命周期内),如果外部一次都没有使用过它,这个缓存实体的命中率就是0。这个实体被请求的次数越多,它的缓存命中率越高。 上面说的是缓存中一个实体的命中率。对于缓存整体来说,它的命中率则是上面各个被缓存的个体的命中率分布图。 对于缓存来说:通常最常使用的个体之占总体的很小一部分。最不常使用的占整体的很大一部分。如下图所示:
所以我们经常会看到类似这样的数据: 缓存的1万个元素中,有100个被频繁的使用,几乎每分钟都会被使用一次。2000个数据,每小时被请求一次。3000个数据,每天被请求一次,剩下的数据,被丢到缓存中后一次都没有被使用过。 现在硬件发展很快,如果我们只是需要缓存1万个数据的话,我们完全可以做到不管这1万个数据是否被使用到,全部丢到缓存,这样只要找数据,肯定缓存中有这个数据。而不需要作额外的运算,或者不需要向数据库发出请求。 但是:硬件发展快,数据量发展也快。小型的网站,缓存1万条数据,也就全部缓存了。但是大型网站最少也是上百万的数据量或者上T级别的数据,这些数据量显然不能都丢到缓存。这时候设计一个合理的缓存方案,提高缓存的命中率,就非常重要。而且是必须的。
提高缓存命中率的一些常见方法 纯技术的角度来说,我们只有记录了用户的单位时间的请求数,并依照这个信息来把最常被使用的数据缓存起来。 但更多的时候,我们是根据业务逻辑来提高缓存命中率的。比如:去年,前年发表的博客,这类文章的浏览请求,一般一天至少可怜的几次。一般不应该缓存到内存中。 又比如,回复数多的帖子,一般被请求数会比回复数少的帖子会被更多人次看到。 我们应该通过上面逻辑,根据我们实际业务逻辑,提供一个缓存算法,提高缓存的命中率。让在我们硬件允许的条件下,缓存适当的数据,而不是所有数据。
一个反面的例子就是:不管三七二十一,一个大型的博客站点,一篇文章被用户请求的时候,发现不在内存缓存中,就从数据库中读出,然后丢到缓存。 要知道,现在爬虫程序很多的。另外,博客这类搜索引擎友好的站点,决大多数的访问压力是搜索引擎搜索过来的。而这些访问一般都是1小时,或者1天之内,对某篇文章只有几次甚至1次请求,之后再也没有了。上面作缓存的方法,命中率会非常低的。 这里也许就有人会问,郭红俊,既然你不建议我缓存这些博客的内容,但是我如何提高我站点的性能呀,我至少得保证我博客站点不会速度慢的无法响应用户请求呀。 这个问题的解决方案有很多,一个最简单的方法就是把这些博客做成静态Html页面,也就是文件系统的缓存,文件系统因为硬盘的原因,可以简单理解成可以无限扩容,这样就可以把很多命中率低的内容进行缓存。 如果你的页面需要一些动态逻辑判断,你可以把数据缓存成XML文件,然后服务器段整合这些XML文件,或者是包含文件。这也是种不错的方法。
说了这么多缓存命中率的问题,简单汇总一下缓存命中率的观点:
下面我们看看缓存的其他几个不那么重要的方面:
缓存的生命周期内的活动 永久不过期,永久不变更的内容,这类东西就不应该放在缓存。缓存是临时的存储,而不是永久的,所以缓存的生命周期是有限的。 它依次可能会经历如下活动:
缓存的过期策略 一般我会问,你所接触的缓存中,碰到过那些缓存过期策略? 最常见的几种过期策略如下: 多长时间没有被请求,则过期,最典型的就是ASP和ASP.net 提供的 Section 功能。其实它就是一个缓存。 依赖于文件变更的缓存,一旦文件被修改,缓存则过期,典型的是 WEB站点的 Web.config ,一旦这个文件变更,不但缓存重起,IIS进程也会进行一次释放工作。 在此基础上,可能看到很多依赖关系的缓存过期策略。比如依赖于数据库的缓存过期策略。 当然,业务逻辑里可能会有更复杂的过期策略,必须CSDN新版积分制论坛中,帖子列表缓存会在列表数据缓存达到600时,把它清理到550条数据。 又比如新积分制论坛帖子的缓存过期,则是没有任何列表引用这个帖子后,则这个帖子过期。
缓存的同步问题 使用缓存,则意味着同样的数据,可能有多份并存。如果你的代码没有考虑某种情况,导致了这两份数据不一致了。这时候就会有问题发生。 解决方法很简单,把你的业务逻辑,代码触发情况都考虑清楚,不要遗留没有触底的地方。 简单的方法会导致你的代码逻辑变得非常复杂。 这也就是有些人,在非必要的时候,建议你不要用缓存的原因。一旦开始使用缓存,你就应该准备增加大量的代码来处理数据同步的问题。
初始化填充缓存数据 有时候在缓存被初始化后,还需要预先填充一些数据到缓存中。这就是缓存数据的初始化操作。 缓存数据的初始化操作需要考虑以下问题:
总结: 本文介绍了我对缓存的一些观点,而没有深入涉及到具体的缓存技术。希望通过本文的讲述,让只会缓存用法不懂缓存思想的人有初步的了解。 What is Danga?Danga Interactive was Brad Fitzpatrick's company that developed LiveJournal and by necessity the backend software to drive it all. Since Danga's acqusition by Six Apart, the meaning of "Danga" is somewhat undefined. It mostly represents this website and this software. A lot of the contributors to this software, both old and new, work for SixApart, but just as many are from the larger community.... people like you. SoftwareAll Open Source, because we love Freedom.
The SourceTo get the source for any project: $ svn co http://code.sixapart.com/svn/<whatever>/trunk/ <directory> Memcached在大型网站中应用Category: PHP, Author: jiading memcached是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。最初为了加速 LiveJournal 访问速度而开发的,后来被很多大型的网站采用。起初作者编写它可能是为了提高动态网页应用,为了减轻数据库检索的压力,来做的这个缓存系统。它的缓存是一种分布式的,也就是可以允许不同主机上的多个用户同时访问这个缓存系统, 这种方法不仅解决了共享内存只能是单机的弊端, 同时也解决了数据库检索的压力,最大的优点是提高了访问获取数据的速度!基于memcached作者对分布式cache的理解和解决方案。memcached完全可以用到其他地方 比如分布式数据库, 分布式计算等领域。 » 你可能感兴趣的文章 PHP & memcached 一、memcached 简介
在很多场合,我们都会听到 memcached 这个名字,但很多同... YouTube 的架构扩展在西雅图扩展性的技术研讨会上,YouTube 的 Cuong Do 做了关于 YouTube Scalability �... memcached安装+php使用手记本文简要介绍一下安装的情况,以及PHP模块memcache使用情况:
提要:
1。安... 可中止的线程池发布日期: 2006-6-15 | 更新日期: 2006-6-15 下载本文的代码: NETMatters0603.exe (118KB) 问:在 2005 年 7 月的专栏 (.NET Matters: StringStream, Methods with Timeouts) 中,您演示了如何使用 Thread.Abort 来取消一个长期运行的操作。我知道您对该方法的可靠性提出了警告,但是我认为,就我目前的情况而言,这种风险是可接受的。我对将在线程池中执行的一长串工作项进行了排队。不久后,我需要取消其中一个操作(实际上,是一个手动超时),如果该操作尚未执行,则让它出列;如果该操作当前正在执行,则中止它。这种情况下,ThreadPool 好像并未公开任何功能。是否我只能编写自己的 ThreadPool 代码? 答:这是个不错的问题。回答问题的第一部分,ThreadPool 不公开让项目从其内部队列中出列的功能(尽管还有其他办法,您很快就能看到)。问题的第二部分经常以下面这种普通得不能再普通的形式出现:您如何决定排队工作项将在哪个线程上执行?当然,答案是:除非该线程已经执行,否则您不可能知道。毕竟,一个线程池的全部问题在于允许其中的任意线程完成请求的工作。这意味着,要想发现工作项在哪个线程上执行,最好的方法是让工作项一开始运行就通知您。例如,工作项方法的首要任务是对回调进行排序,并根据当前 Thread 对象的信息进行传递。在您描述的情况中,掌握工作项的 Thread,之后即可轻松地中止它。 但这种方法是很危险的。此时,接收通知并中止线程,最初的工作项可能已经结束了,以至于线程池中的线程已经移动到其他工作项。您将中止次要而不是想要中止的工作项,这会让您处于危险境地。另外,这需要您在每个排队进入线程池的方法中都有适当的回调逻辑。 相反,将向您传递回 cookie 的线程池实现视为排队工作项的分类。然后,线程池还将提供一个 Cancel 方法,用于获取其中一个 cookie 并取消相关的工作项,从队列中移除该工作项,或根据情况中止正在执行的工作项。执行该任务的一个自定义的线程池也许不是最好的主意,但是还有其他办法。(注意,执行自定义线程池是可能的;有关这一示例,请参阅我在 2005 年 2 月专栏中的文章 .NET Matters: File Copy Progress, Custom Thread Pools。) 在我的 2004 年 10 月、11 月和 12 月的专栏中,我解释了如何执行 ThreadPool 的静态包装,其中每一个包装完成不同的任务(等待已排队的工作项完成,优先某些已排队的项目,截断线程池的使用)。使用相同的技术可以创建线程池的包装,以允许取消工作项。图 1 显示所涉及处理的高级图示,图 2 显示其实现。 ![]() 图 1 高级处理 要使用该类,只需在使用 ThreadPool 排队要取消的工作项的任意位置替换 AbortableThreadPool 即可。在使用 AbortableThreadPool 期间,仍旧对 ThreadPool.QueueUserWorkItem 进行调用虽然很好,但这些工作项不能被取消。一个典型的调用序列如下所示: WorkItem item = AbortableThreadPool.QueueUserWorkItem(
new WaitCallback(YourWorkMethod));
... // do other stuff here
WorkItemStatus status = AbortableThreadPool.Cancel(item, false);
Console.WriteLine("Status from Cancel: " + status);
对于以前的包装,这次我要做的是存储提供给 ThreadPool.QueueUserWorkItem 方法的信息,并且我已经创建了 WorkItem 类(依旧如图 2所示)。该类的一个实例存储了三段信息,其中包括两段由用户提供的信息(执行 WaitCallback,并将对象状态作为该方法的一个参数进行传递)。第三段信息是在调用 QueueUserWorkItem 时捕获的 ExecutionContext。 ExecutionContext 是 Microsoft® 的身份;它的同步上下文,它允许进行同步和异步操作以实现与适当的同步模型保持一致,例如在 Windows 窗体应用程序中使用 Control.Invoke 或 Control.BeginInvoke;它的逻辑调用上下文;还包括它的宿主执行上下文。ExecutionContext 的优点是,您可以捕获当前线程的 ExecutionContext,然后当运行任意代码时,使用该 ExecutionContext,尽管该代码不在最初捕获其上下文的线程中运行。 为什么说它是件好事?考虑发生以下情况,在线程池中排入队列中一个工作项,或使用 Control.Invoke 封送处理对 Windows 窗体应用程序的 GUI 线程的调用,或调用 Thread.Start 执行新线程中的一个方法,或异步调用一个委托。本质上是,一个线程请求另一个线程代表自己完成工作。由于两个线程不能共有任意基于线程的状态,如果未向目的线程传递任何有关源线程的内容,会发生断开连接并出现各种各样的问题。其中的一些问题会导致功能上的错误,例如,存储在源代码的线程本地存储中的数据在执行期间不可用,其他一些问题会导致安全性漏洞,例如,在不同的 Windows 身份下执行。 通过允许捕获以及从一个线程到另一个线程的执行上下文流程,.NET Framework 2.0 解决了这一断开连接问题。事实上,在大部分情况下,由于 ExecutionContext 在线程转换点(ThreadPool.QueueUserWorkItem、Thread.Start、委托异步调用等)之间是自动流动的,您将不能直接处理 ExecutionContext。当执行一些操作而引起该自动流程停止时,才能直接进行处理。鉴于此,WorkItem 存储 ExecutionContext 的原因就显而易见了。 图 2 所示的 AbortableThreadPool 类中有一些信息的集合。一个集合是 WorkItem 实例的一个链表,它包括利用尚未有机会执行的 AbortableThreadPool.QueueUserWorkItem 进行排队的工作项。另一个集合是字典,它将 WorkItem 实例映射到 Thread 对象;该集合用于跟踪工作项正在其中执行的线程池线程。 AbortableThreadPool.QueueUserWorkItem 是该类最简单的方法。它创建一个 WorkItem,用于存储提供的 WaitCallback 和用户状态对象,以及当前的 ExecutionContext。然后,该 WorkItem 进入到等待执行的工作项链表队列中。此外,将一个占位符回调插入到实际的 .NET ThreadPool 之中。该占位符不包含要执行的实际工作的信息,且仅指回 AbortableThreadPool.HandleItem 方法。由于当且仅当调用 AbortableThreadPool、QueueUserWorkItem 方法时对 HandleItem 的一个委托进行排队,因此,链表中的每个工作项都在实际的线程池中有一个相应的排队工作项。作为 cookie 的 WorkItem(本专栏以前讨论过)将返回给用户。 调用 HandleItem 时,它从工作项链表中删除下一个 WorkItem。然后,该 WorkItem 与当前的 Thread 实例(从 Thread.CurrentThread 检索)一起插入到运行工作项(WorkItem 作为字典中的键)表中。此时,从 WorkItem 检索 ExecutionContext,并用于执行排队的委托,为其提供相应的用户状态对象。委托完成执行后,WorkItem 到 Thread 的映射将从运行工作项的表中删除。 该系统使得无需考虑线程池中的工作项当前状态即可将其取消。具有从 QueueUserWorkItem 返回的 WorkItem 的用户可将实例传递给 Cancel 方法。Cancel 方法首先查看 WorkItems 链表;如果 WorkItem 未开始执行,它将插入该链表。如果找到项目,它将从队列中删除。这将导致链表中的 WorkItems 数和在托管线程池中排队的工作项数变成离散的,但是没关系。当 HandleItem 试图从队列中检索下一项时,如果没有更多项可用,则返回它。 然而,这种情况是您必需将 ExecutionContext 存储在 WorkItem 中,并在上下文中执行委托的原因之一。默认情况下,执行上下文的流方向为从将委托排入到线程池队列的线程到该委托的执行。但是,以这种方式取消一个工作项(托管线程池完全忽略该工作项)将导致工作项和流动的上下文无法保持同步。结果,一个工作项将在流动的上下文中为另一个工作项而执行。 尽管不能取消这些项,但仍需要存储带有工作项的执行上下文。每次从 ThreadPool 调用 HandleItem 时,将从队列中删除下一个 WorkItem。但实际情况是,线程池执行 HandleItem 方法,以便您无需考虑任何顺序问题即可对它们进行排队,这其中将执行这些 HandleItem 调用中的各种指令。对于在其他调用之前开始一个 HandleItem 调用而言,这相当可行;但对于第二个调用,则先要移除一个等待的 WorkItems。如果这再次发生,则在执行上下文的流中出现断开连接,此时您必需手工操作。 如果 Cancel 方法在链表中没有找到从 QueueUserWorkItem 返回的 WorkItem,那么只有其他两种可能。第一,工作项当前可能正在执行,在这种情况下,它将以键的形式在字典中显示,将 WorkItem 实例映射到 Thread 实例。此外,如果它在您可以轻松地检索 Thread 的表(委托在该表中执行)中,则您可根据需要将其中止。如果 WorkItem 不是该字典中的键,则它必需已经完成执行,因而没有可取消的内容。阻挡工作项执行并隔离对 Abort 调用的锁防止了中止不正确的线程;如果线程池中的 Thread 对象只返回到 AbortableThreadPool 用户,这将不会受到阻拦。 鉴于我在 2005 年 7 月刊中提供了方法超时示例,请您小心使用 Thread.Abort 控制线程的生命周期,特别是在您了解了一些中止代码实现的情况下。尽管单纯的中止会显著降低窗口灾难的可能性,但临界区内的中止会招致整个 AppDomain 的灾难,一次超出 1,000 可导致死锁或资源匮乏,或者更糟。根据工作负荷和中止率,这可能(或不会)随时间变化而迅速增长。有关其危险的原因以及解决方法的更多信息,请参阅我于 2005 年 10 月发表的有关可靠性的文章 (High Availability: Keep Your Code Running with the Reliability Features of the .NET Framework)。 也就是说,对于方法超时示例,恰好可以发挥 Thread.Abort 的强大功能。对于这些情况,AbortableThreadPool 很方便。既然实现了用 Cancel 方法接受指示当前执行的工作项是否应该中止的参数,当然就可以选择该代码来取消挂起的工作项,而不是取消已经开始的工作项。
Stephen Toub 是MSDN Magazine 的一位技术编辑。 Ubuntu 7.04系统上安装Apache PHP MySQL - Ubuntu 7.04 - 技术应用 - 豆豆网
tech.ddvip.com/2007-09/119022106635023.html 1、安装 Apache2+PHP5+MySQL sudo apt-get install apache2 libapache2-mod-php5 php5 php5-gd mysql-server php5-mysql phpmyadmin joelhy 提醒 这一步可以使用新立得来安装,同样效果。 打开新立得,编辑 –> 使用任务分组标记软件包 –> 勾选 LAMP Server 然后再单独安装 phpmyadmin sudo apt-get install phpmyadmin 2、启用 mod_rewrite 模块 sudo a2enmod rewrite 3、配置 apache2.conf sudo gedit /etc/apache2/apache2.conf 去掉 AddHandler cgi-script .cgi 前的注释 “#”。 然后在任意地方添加这么一段: &<60;&<60; &<60;DocumentRoot /var/www/ &<60;&<60; &<60; &<60;&<60; &<60; &<60; &<60;Options FollowSymLinks &<60;&<60; &<60; &<60; &<60;AllowOverride all &<60;&<60; &<60; &<60;&<60; &<60; &<60;&<60; &<60; &<60; &<60;Options ExecCGI &<60;&<60; &<60; 重启服务器 sudo /etc/init.d/apache2 restart 搞定。 说明:PHP 程序放 /var/www/ 下面都可以,CGI 程序放 /var/www/cgi-bin/ 下面。 是不是太简单了,除去下载的时间,要不了一分钟就可以完成配置,在 Ubuntu 上还需要 APM 包吗?还是记住以下几个命令和位置就行了。 sudo /etc/init.d/apache2 restart (重启 apache) sudo gedit /etc/php5/apache2/php.ini (配置 php.ini) sudo gedit /etc/apache2/apache2.conf (配置 apache2.conf) /var/www/(主目录位置) 以上服务器配置,经测试可以正常运行 WordPress、Habari、Movable Type。 满江红开放技术研究组织发布Seam 2.0中文文档RC版 - redsaga-notify | Google Groups
groups.google.com/group/redsaga-notify/browse_thre... "你得知道,我想的比做的更多。如果你要做一个开源项目,必须设想好它的道路,它才会成功。"Gavin King这么说过。那时候他已经在新天地luna酒吧灌下大杯的法国葡萄酒,还要装作若无其事。不得不承认这个家伙相当聪明且自负。他做出的决定是深思熟虑的。 B/S程序和C/S不同,Request/Response模型让程序冗长的像裹脚布。你同时要处理多种数据失配:服务器端的RDBMS和浏览器展示出来的HTML之间,需要Servlet的渲染,数据经历了RDBMS Row ,ResultSet, 若有若无的DTO和浏览器Form数据这几个步骤,让数据变得支离破碎。实际上所有的Java框架的核心都是解决不同层面的这些破碎。Hibernate解决的是DTO和ResultSet之间的破碎。和大多数初学者认为的Hibernate是一种面向对象的ResultSet包装器的字面理解不同,Hibernate的目的是对RDBMS数据的便于进行缓存的细粒度切割,"面向对象"只是工具而非目的,缓存才是一切的本质,它让Hibernate真正成为了具有强大战斗力的武器而非可笑的对象封装器。 解决了这一失配后,Gavin King把目光放到了HTML Form和服务器对象之间的失配上。这一次的目的是简化,尽可能的简化,因为对Web编程而言,最大的瓶颈是开发效率,因此Seam的目的就是最大限度的简化复杂性。这一次的战线要比Hibernate宽广的多,Seam的好处因而也更加让人看得明白:它提升JSF的实力,让快速开发效果丰富的Web应用程序成为可能。从双向注入到Annotation,目的都是为了尽量减少服务器端的代码量,而RichFaces和JSF编辑器,则是为了让Seam的产出变得效果丰富。 因此,你应该花些时间来看看Seam。 2007/12/30,发布对应Seam 2.0GA的中文文档RC版本: ……
Oracle关于时间/日期的操作
在oracle中有很多关于日期的函数,如:
1、add_months()用于从一个日期值增加或减少一些月份 date_value:=add_months(date_value,number_of_months) 例: SQL> select add_months(sysdate,12) "Next Year" from dual; Next Year ---------- 13-11月-04 SQL> select add_months(sysdate,112) "Last Year" from dual; Last Year ---------- 13-3月 -13 SQL> 2、current_date()返回当前会放时区中的当前日期 date_value:=current_date SQL> column sessiontimezone for a15 SQL> select sessiontimezone,current_date from dual; SESSIONTIMEZONE CURRENT_DA --------------- ---------- +08:00 13-11月-03 SQL> alter session set time_zone='-11:00' 2 / 会话已更改。 SQL> select sessiontimezone,current_timestamp from dual; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ------------------------------------ -11:00 12-11月-03 04.59.13.668000 下午 -11: 00 SQL> 3、current_timestamp()以timestamp with time zone数据类型返回当前会放时区中的当前日期 timestamp_with_time_zone_value:=current_timestamp([timestamp_precision]) SQL> column sessiontimezone for a15 SQL> column current_timestamp format a36 SQL> select sessiontimezone,current_timestamp from dual; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ------------------------------------ +08:00 13-11月-03 11.56.28.160000 上午 +08: 00 SQL> alter session set time_zone='-11:00' 2 / 会话已更改。 SQL> select sessiontimezone,current_timestamp from dual; SESSIONTIMEZONE CURRENT_TIMESTAMP --------------- ------------------------------------ -11:00 12-11月-03 04.58.00.243000 下午 -11: 00 SQL> 4、dbtimezone()返回时区 varchar_value:=dbtimezone SQL> select dbtimezone from dual; DBTIME ------ -07:00 SQL> 5、extract()找出日期或间隔值的字段值 date_value:=extract(date_field from [datetime_value|interval_value]) SQL> select extract(month from sysdate) "This Month" from dual; This Month ---------- 11 SQL> select extract(year from add_months(sysdate,36)) "3 Years Out" from dual; 3 Years Out ----------- 2006 SQL> 6、last_day()返回包含了日期参数的月份的最后一天的日期 date_value:=last_day(date_value) SQL> select last_day(date'2000-02-01') "Leap Yr?" from dual; Leap Yr? ---------- 29-2月 -00 SQL> select last_day(sysdate) "Last day of this month" from dual; Last day o ---------- 30-11月-03 SQL> 7、localtimestamp()返回会话中的日期和时间 timestamp_value:=localtimestamp SQL> column localtimestamp format a28 SQL> select localtimestamp from dual; LOCALTIMESTAMP ---------------------------- 13-11月-03 12.09.15.433000 下午 SQL> select localtimestamp,current_timestamp from dual; LOCALTIMESTAMP CURRENT_TIMESTAMP ---------------------------- ------------------------------------ 13-11月-03 12.09.31.006000 13-11月-03 12.09.31.006000 下午 +08: 下午 00 SQL> alter session set time_zone='-11:00'; 会话已更改。 SQL> select localtimestamp,to_char(sysdate,'DD-MM-YYYY HH:MI:SS AM') "SYSDATE" from dual; LOCALTIMESTAMP SYSDATE ---------------------------- ------------------------ 12-11月-03 05.11.31.259000 13-11-2003 12:11:31 下午 下午 SQL> 8、months_between()判断两个日期之间的月份数量 number_value:=months_between(date_value,date_value) SQL> select months_between(sysdate,date'1971-05-18') from dual; MONTHS_BETWEEN(SYSDATE,DATE'1971-05-18') ---------------------------------------- 389.855143 SQL> select months_between(sysdate,date'2001-01-01') from dual; MONTHS_BETWEEN(SYSDATE,DATE'2001-01-01') ---------------------------------------- 34.4035409 SQL> 9、next_day()给定一个日期值,返回由第二个参数指出的日子第一次出现在的日期值(应返回相应日子的名称字符串) 说明: 单行日期函数 单行日期函数操作data数据类型,绝大多数都有data数据类型的参数,绝大多数返回的也是data数据类型的值。 add_months(,) 返回日期d加上i个月后的结果。i可以使任意整数。如果i是一个小数,那么数据库将隐式的他转换成整数,将会截去小数点后面的部分。 last_day() 函数返回包含日期d的月份的最后一天 months_between(,) 返回d1和d2之间月的数目,如果d1和d2的日的日期都相同,或者都使该月的最后一天,那么将返回一个整数,否则会返回的结果将包含一个分数。 new_time(,,) d1是一个日期数据类型,当时区tz1中的日期和时间是d时,返回时区tz2中的日期和时间。tz1和tz2时字符串。 next_day(,) 返回日期d后由dow给出的条件的第一天,dow使用当前会话中给出的语言指定了一周中的某一天,返回的时间分量与d的时间分量相同。 select next_day(''01-jan-2000'',''monday'') "1st monday",next_day(''01-nov-2004'',''tuesday'')+7 "2nd tuesday") from dual;1st monday 2nd tuesday03-jan-2000 09-nov-2004 round([,]) 将日期d按照fmt指定的格式舍入,fmt为字符串。 syadate 函数没有参数,返回当前日期和时间。 trunc([,]) 返回由fmt指定的单位的日期d. 单行转换函数 单行转换函数用于操作多数据类型,在数据类型之间进行转换。 chartorwid() c 使一个字符串,函数将c转换为rwid数据类型。 select test_id from test_case where rowid=chartorwid(''aaaa0saacaaaaliaaa'') convert(,[,]) c尾字符串,dset、sset是两个字符集,函数将字符串c由sset字符集转换为dset字符集,sset的缺省设置为数据库的字符集。 hextoraw() x为16进制的字符串,函数将16进制的x转换为raw数据类型。 rawtohex() x是raw数据类型字符串,函数将raw数据类转换为16进制的数据类型。 rowidtochar() 函数将rowid数据类型转换为char数据类型。 to_char([[,) x是一个data或number数据类型,函数将x转换成fmt指定格式的char数据类型,如果x为日期nlsparm=nls_date_language 控制返回的月份和日份所使用的语言。如果x为数字nlsparm=nls_numeric_characters 用来指定小数位和千分位的分隔符,以及货币符号。 nls_numeric_characters ="dg", nls_currency="string" to_date([,[,) c表示字符串,fmt表示一种特殊格式的字符串。返回按照fmt格式显示的c,nlsparm表示使用的语言。函数将字符串c转换成date数据类型。 to_multi_byte() c表示一个字符串,函数将c的担子截字符转换成多字节字符。 to_number([,[,) c表示字符串,fmt表示一个特殊格式的字符串,函数返回值按照fmt指定的格式显示。nlsparm表示语言,函数将返回c代表的数字。 to_single_byte() 将字符串c中得多字节字符转化成等价的单字节字符。该函数仅当数据库字符集同时包含单字节和多字节字符时才使用。 Oracle关于时间/日期的操作 1.日期时间间隔操作 当前时间减去7分钟的时间 select sysdate,sysdate - interval '7' MINUTE from dual 当前时间减去7小时的时间 select sysdate - interval '7' hour from dual 当前时间减去7天的时间 select sysdate - interval '7' day from dual 当前时间减去7月的时间 select sysdate,sysdate - interval '7' month from dual 当前时间减去7年的时间 select sysdate,sysdate - interval '7' year from dual 时间间隔乘以一个数字 select sysdate,sysdate - 8 *interval '2' hour from dual 2.日期到字符操作 select sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual select sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss') from dual select sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss') from dual select sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss') from dual 参考oracle的相关关文档(ORACLE901DOC/SERVER.901/A90125/SQL_ELEMENTS4.HTM#48515) 3. 字符到日期操作 select to_date('2003-10-17 21:15:37','yyyy-mm-dd hh24:mi:ss') from dual 具体用法和上面的to_char差不多。 4. trunk/ ROUND函数的使用 select trunc(sysdate ,'YEAR') from dual select trunc(sysdate ) from dual select to_char(trunc(sysdate ,'YYYY'),'YYYY') from dual 5.oracle有毫秒级的数据类型 --返回当前时间 年月日小时分秒毫秒 select to_char(current_timestamp(5),'DD-MON-YYYY HH24:MI:SSxFF') from dual; --返回当前 时间的秒毫秒,可以指定秒后面的精度(最大=9) select to_char(current_timestamp(9),'MI:SSxFF') from dual; 6.计算程序运行的时间(ms) declare type rc is ref cursor; l_rc rc; l_dummy all_objects.object_name%type; l_start number default dbms_utility.get_time; begin for I in 1 .. 1000 loop open l_rc for 'select object_name from all_objects '|| 'where object_id = ' || i; fetch l_rc into l_dummy; close l_rc; end loop; dbms_output.put_line ( round( (dbms_utility.get_time-l_start)/100, 2 ) || ' seconds...' ); end;
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||