tag:blogger.com,1999:blog-66233408196460006002023-11-16T18:36:59.272+08:00SkyCloud's BlogInterest of StudyUnknownnoreply@blogger.comBlogger80125tag:blogger.com,1999:blog-6623340819646000600.post-68903933663847554292013-03-22T00:06:00.001+08:002013-03-22T00:09:23.665+08:00测试Android客户端<p>测试一下。还会强制关闭......<br>
测试<a href="http://g.cn">链接</a>。</p>
<div class='separator' style='clear: both; text-align: center;'> <a href='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhv8_P3INHkzZrXQMOxI0JybBjTC9CINslKTWqp60Ijz5gEAEFA3QFxKKDXFAEadc1dxvWJ0p_nh9nbJ89xsaiadsfvKfqoeF-j2lgkbNTSXXSkQUqhFQNFjzI11NtFuZilnRSRtQ7vKU/s1600/4fbf584dedd6a91cf800098f.jpg' imageanchor='1' style='margin-left: 1em; margin-right: 1em;'> <img border='0' src='https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhv8_P3INHkzZrXQMOxI0JybBjTC9CINslKTWqp60Ijz5gEAEFA3QFxKKDXFAEadc1dxvWJ0p_nh9nbJ89xsaiadsfvKfqoeF-j2lgkbNTSXXSkQUqhFQNFjzI11NtFuZilnRSRtQ7vKU/s640/4fbf584dedd6a91cf800098f.jpg' /> </a> </div><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-6623340819646000600.post-48446801320262565572011-06-05T19:50:00.001+08:002011-06-27T19:57:48.086+08:00Windows7 32位/64位镜像合并一、先了解下基本知识 <br />
微软的Windows 7分x86和X64(即32位和64位)两大系列,每个系列又有数个版本<br />
x86镜像中有5个版本: <br />
Starter --------- 简易版,对应编号为1<br />
HomeBasic ------- 家庭普通版,对应编号为2<br />
HomePremium ----- 家庭高级版,对应编号为3<br />
Professional ---- 专业版,对应编号为4<br />
Ultimate -------- 旗舰版,对应编号为5<br />
以5个分卷的形式存在于x86镜像中的install.wim安装文件中<br />
x64的有4个版本(无简易版): <br />
HomeBasic ------- 家庭普通版,对应编号为1<br />
HomePremium ----- 家庭高级版,对应编号为2<br />
Professional ---- 专业版,对应编号为3<br />
Ultimate -------- 旗舰版,对应编号为4<br />
以4个分卷的形式存在于x64镜像中的install.wim安装文件中<br />
对于32位系统,各版本的installi.wim安装文件是一样的,其它文件除了ei.cfg外,也是一样的,ei.cfg的作用是让安装程序自动安装指定的版本。 对于64位亦是如此。wim格式安装包还有个特性,就是可继续添加或删减分卷。因此,我们可以利用这个特性,把x64的分卷添加到x86的install.wim文件,从而达到合盘的目的,做成9合1光盘。如果想添加更多的版本如企业版,也可以将其中的install文件一同整合进去,制作X合一的win7安装镜像,哈哈,方法相同,不再赘述。 <a href="" name="more"></a><br />
<a name='more'></a><br />
二、所需工具和文件 <br />
1、32位和64位的MSDN版的Windows7 With Sp1简体中文版(可以是任意版本,如旗舰版) <br />
2、ISO编辑软件UltraISO,也可以用其它编辑iso文件的软件,如Poweriso。 <br />
3、wim文件编辑工具imagex.exe ,本贴附件里提供,也可以从网上搜索下载。 <br />
三、制作步骤 <br />
(一)制作9合1安装文件install.wim <br />
1、下载附件中的imagex.exe,解压出来放入windows/system32文件夹中。<br />
2、提取文件。用UltraISO打开64位Win7 with sp1的ISO,提取sources文件夹下install.wim文件到硬盘的某个分区中(该分区的剩余空间要在10G以上),并改名为installx64.wim,再打开32位的ISO,提取install.wim到该分区中。 <br />
3、整合文件。将64位镜像中安装文件install.wim中的四个分卷整合到32位install.wim中,打开CMD窗口,依次运行以下命令, <br />
imagex /export x:\installx64.wim 1 x:\install.wim "Windows 7 HomeBasic X64" <br />
imagex /export x:\installx64.wim 2 x:\install.wim "Windows 7 HomePremium X64" <br />
imagex /export x:\installx64.wim 3 x:\install.wim "Windows 7 Professional X64" <br />
imagex /export x:\installx64.wim 4 x:\install.wim "Windows 7 Ultimate X64" <br />
注:①命令一定要按顺序运行,否则导致版本“编号”顺序改变。<br />
②上述命令中,installx64.wim 、install.wim存放路径在x盘根目录下 <br />
4、修改各版本(分卷)的“描述”信息。因64位的各版本已经整合到了32位的install.wim中,HomeBasic、HomePremium、Professional、Ultimate版本的编号依次为6、7、8、9。因为64位的各版本原来的“描述”跟32位的一样,为了避免在安装时选错,所以这里改一下各分卷的“描述”。<br />
在CMD窗口里分别运行以下命令: <br />
imagex /info x:\install.wim 1 "Windows 7 Starter X86" "Windows 7 With Sp1 简易版 32位" <br />
imagex /info x:\install.wim 2 "Windows 7 HomeBasic X86" "Windows 7 With Sp1 家庭基础版 32位" <br />
imagex /info x:\install.wim 3 "Windows 7 HomePremium X86" "Windows 7 With Sp1 家庭高级版 32位" <br />
imagex /info x:\install.wim 4 "Windows 7 Professional X86" "Windows 7 With Sp1 高级版 32位" <br />
imagex /info x:\install.wim 5 "Windows 7 Ultimate X86" "Windows 7 With Sp1 旗舰版 32位" <br />
imagex /info x:\install.wim 6 "Windows 7 HomeBasic X64" "Windows 7 With Sp1 家庭基础版 64位" <br />
imagex /info x:\install.wim 7 "Windows 7 HomePremium X64" "Windows 7 With Sp1 家庭高级版 64位" <br />
imagex /info x:\install.wim 8 "Windows 7 professional X64" "Windows 7 With Sp1 专业版 64位" <br />
imagex /info x:\install.wim 9 "Windows 7 Ultimate X64" "Windows 7 With Sp1 旗舰版 64位" <br />
上面命令中也可以只修改6、7、8、9号分卷,只要和32位分卷的名字不同即可,到此,9合1的install.wim就整合好了。<br />
二)制作9合1安装盘 <br />
1、提取64位的clg文件。打开64位光盘镜像,提取sources文件夹下的4个版本的clg文件即install_Windows 7 HOMEBASIC.clg等提取到硬盘中,并分别重命名为install_Windows 7 HOMEBASIC x64.clg等。 <br />
2、打开32位win7的ISO文件,定位到sources文件夹。<br />
A、删除ei.cfg文件;(原本我们安装时只有一个版本的选项,在删了这个文件后再次安装就会出现9个选项) <br />
B、将5个版本的clg文件即install_Windows 7 HOMEBASIC.clg等重命名为install_Windows 7 HOMEBASIC x86.clg等; <br />
C、将刚才提取出来并重命名的64位的install_Windows 7 HOMEBASIC x64.clg等文件添加到sources文件夹中; <br />
D、在sources文件夹里加入整合后的install.wim替换旧文件,保存ISO 。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com2中国34.244765636388678 108.9867369689330916.464078636388678 78.350038968933092 52.025452636388678 139.62343496893308tag:blogger.com,1999:blog-6623340819646000600.post-59867969760864673402011-05-28T14:43:00.003+08:002011-05-29T15:05:24.233+08:00拿福能千人挑战活动开始啦最近SkyCloud看到很多博客主在推荐一种新的网站营销工具——拿福能,而且我的邮箱也收到了拿福能发来的邀请信,原来拿福能刚刚进入中国,为了打开市场,宣传自身价值,举办了一次《拿福能中国千人挑战活动》。看他们介绍感觉还是比较靠谱的,大家可以尝试一下啦。<br />
<br />
“Nuff Nang”是Jafaikan语,意思是“非常好,非常酷”。拿福能是一个致力于把博客社区化的广告平台,为广大博主们提供了一个更开阔更真实更有收获的交流机会和平台。<br />
<br />
<a name='more'></a><br />
<br />
拿福能在国外已经有过一些成功案例, 此次进入中国也希望有所作为, 所以搞这么一个活动, 招募 1,000 名博主加盟. 参加活动的博主注册拿福能帐号, 放上广告代码, 并写一篇拿福能相关的介绍, 附上千人活动页面链接,然后提交文章链接地址到拿福能,通过审核后既可以参加千人挑战活动。 直到参加博主数量到达 1000, 所有参加活动的博主将平分 50000 元, 也就是每人 50 元。<br />
<br />
有兴趣参加 "千人挑战活动" 的朋友可以查看以下活动页面.<br />
<a href="http://www.nuffnang.com.cn/blog/2011/05/23/challenge-1000/" rel="external nofollow">http://www.nuffnang.com.cn/blog/2011/05/23/challenge-1000/</a><br />
<br />
<a href="http://www.nuffnang.com.cn/blog/2011/05/23/challenge-1000/" rel="external nofollow"><img alt="千人挑战活动" class="sided" src="http://www.nuffnang.com.cn/wp-content/uploads/2011/05/C1000.jpg" /></a><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-28481043658073345082011-05-19T16:20:00.003+08:002011-05-29T13:10:17.549+08:00当前主流浏览器及其内核简介以下为目前主流的桌面浏览器及内核介绍:<br />
<strong><span style="font-size: large;">Trident</span></strong> <br />
Trident: IE使用的内核,该内核程序在1997年的IE4中首次被采用,Trident实际上是一款开放的内核,其接口内核设计的相当成熟,因此才有许多采用IE内核而非IE的浏览器涌现(如 Maxthon、The World 、TT、GreenBrowser、AvantBrowser等)。 <br />
<strong><span style="font-size: large;">Gecko</span></strong> <br />
Gecko: Netscape6开始采用的内核,后来的Mozilla FireFox (火狐浏览器) 也采用了该内核,Gecko的特点是代码完全公开,因此,其可开发程度很高,全世界的程序员都可以为其编写代码,增加功能。因为这是个开源内核,因此受到许多人的青睐,Gecko内核的浏览器也很多,这也是Geckos内核虽然年轻但市场占有率能够迅速提高的重要原因。 <br />
<a name='more'></a><br />
<strong><span style="font-size: large;">Presto</span></strong><br />
Presto:目前Opera采用的内核,该内核在2003年的Opera7中首次被使用,该款引擎的特点就是渲染速度的优化达到了极致,也是目前公认网页浏览速度最快的浏览器内核,然而代价是牺牲了网页的兼容性。 <br />
<strong><span style="font-size: large;">Webkit</span></strong> <br />
Webkit:苹果公司自己的内核,也是苹果的Safari浏览器使用的内核。 Webkit引擎包含WebCore排版引擎及JavaScriptCore解析引擎,均是从KDE的KHTML及KJS引擎衍生而来,它们都是自由软件,在GPL条约下授权,同时支持BSD系统的开发。所以Webkit也是自由软件,同时开放源代码。在安全方面不受IE、Firefox的制约,所以Safari浏览器在国内还是很安全的。<br />
<br />
以下为各浏览器简单对照表格。<br />
<table cellpadding="0" cellspacing="0" class="cnblogs_code" id="browserinfo"><thead>
<tr> <th></th><th>内核(排版引擎)</th><th>脚本引擎</th><th>主要浏览器</th><th>备注</th> </tr>
</thead> <tbody style="border: 1px solid rgb(170, 170, 170);">
<tr> <td>1.</td> <td>Trident </td> <td></td> <td>Internet Explorer for Windows </td> <td>mshtml.dll</td> </tr>
<tr> <td>2.</td> <td>Tasman </td> <td></td> <td>Internet Explorer for Mac</td> <td></td> </tr>
<tr> <td>3.</td> <td>Gecko </td> <td>SpiderMonkey - FireFox<br />
TraceMonkey - FireFox 3.1+</td> <td>FireFox<br />
Netscape 6.0+</td> <td>原本名为NGLayout</td> </tr>
<tr> <td>4.</td> <td>KHTML<br />
WebCore<br />
Webkit </td> <td><br />
V8 - chrome</td> <td>Konqueror<br />
Safari<br />
chrome(google浏览器)</td> <td></td> </tr>
<tr> <td>5.</td> <td>Opera</td> <td></td> <td>Opera</td> <td></td> </tr>
<tr> <td>6.</td> <td>Presto</td> <td>Futhark</td> <td>Opera 7.0+</td> <td>JS引擎Carakan未应用</td> </tr>
</tbody> </table><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-63274179467188626082011-04-15T12:44:00.003+08:002011-05-29T12:48:37.396+08:00手动为windows7添加显示桌面按钮1、在桌面新建一个文本文档<span style="display: none;"> </span>,将以下内容复制进去: <br />
<br />
[Shell] <br />
Command=2<br />
IconFile=explorer.exe,3 <br />
[Taskbar] <br />
Command=ToggleDesktop <br />
2、将该文档重命名为showdesktop.exe 并保存在C:\Windows目录下。 <br />
3、到Windows目录下找到该文件<span style="display: none;"> </span>,用拖曳的方式将其附着在任务栏中<span style="display: none;"> </span>,左右位置可自行调整。 <br />
4、重命名文件夹中的showdesktop.exe为showdesktop.scf <br />
5、在已附着在任务栏的showdesktop.exe上点鼠标右键<span style="display: none;"> </span>,在弹出来的该图标上面继续右键<span style="display: none;"> </span>,选择属性<span style="display: none;"> </span>,在目标一栏里改为C:\Windows\showdesktop.scf <span style="display: none;"></span>,然后点确定。<br />
<a name='more'></a><br />
至此<span style="display: none;"> </span>,点击此按钮即可实现显示桌面的目标功能<span style="display: none;"> </span>,同时Win7右下角的Aero式显示桌面功能仍然可以使用。建议将此按钮的图标修改得更直观一些<span style="display: none;"> </span>,也可以说更漂亮、更符合win7的风格。 <br />
6、在按钮上右键<span style="display: none;"> </span>,弹出来的该图标上继续右键<span style="display: none;"> </span>,点属性<span style="display: none;"> </span>,更改图标<span style="display: none;"> </span>,弹出的框直接点确定即可<span style="display: none;"> </span>,然后可以选择你认为更合适的图标。修改完之后<span style="display: none;"> </span>,并不能立即显示效果<span style="display: none;"> </span>,注销或重启一下系统即可。<span style="display: none;"> </span> <br />
下面附上将3d桌面窗口切换按钮设置到超级任务栏的方法,这是一种更炫更酷的窗口切换方式<span style="display: none;"> </span>,它的快捷键是WIN+Tab<span style="display: none;"> </span> <br />
1.桌面上新建一个快捷方式<span style="display: none;"> </span>,在要求输入项目位置中输入:X:\Windows\system32\rundll32.exe DwmApi #105(X为系统盘)<span style="display: none;"> </span>,下一步<span style="display: none;"> </span>,随便输入一个名字<span style="display: none;"> </span>,完成。 <br />
2.在该快捷图标上右键--属性--更改图标--在该文件夹中查找图标中输入:%SystemRoot%\System32\imageres.dll。选择自己喜欢的图标--确定--拖到任务栏。 <br />
3.现在可以删除桌面的快捷方式<span style="display: none;"> </span>,任务栏的按钮照常使用。<span style="display: none;"> </span><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-50626000069044887722011-03-23T13:58:00.003+08:002011-04-10T14:02:22.769+08:00不只是Times和Arial字体 – 全新的网页安全字体在过去,当你创建了一个网址或者一个网络应用,你却在很大程度上局限于选择某些“网络安全”字体,比如Times和Arial字体。如果你不使用这些字体,则需要用Adobe Flash或者将文本嵌入图像中,那又会带来一整套新的利弊权衡方式。比如,图像是非语义的,不能自动地翻译成其它语言,且它的文件大小要比文本大得多。同时,图像中的文本不能复制到用户的剪贴板上,不能通过屏幕阅读软件阅读,也不能很容易地被搜索引擎收录。<br />
<br />
好消息是,有了<a href="http://www.google.com/webfonts" target="_blank">Google网络字体</a>,你的网页现在可以使用成百上千的网络安全字体。在去年五月推出的Google网络字体让你轻松选择你想在你的网页、博客或者网页应用上使用的字体,并将此功能嵌入到HTML和CSS中。在三十秒内,你的网页上就会出现漂亮的字体,完美地呈现在大多数<a href="http://code.google.com/apis/webfonts/faq.html#Browsers_Supported" target="_blank">流行的网络浏览器</a>中。你再也不需要使用图像或者Flash来嵌入你想使用的字体。<br />
<br />
<a name='more'></a><br />
不像Times和Arial这两种安装在用户本地计算机上的字体,网络字体通过浏览器请求来供应(和图像提供的方式相似)。那意味着你可以在用户计算机上载入任何网络字体。用户会非常高兴地发现这些字体就像Arial字体一样在文本中正确呈现。<br />
<br />
<img alt="" border="0" id="BLOGGER_PHOTO_ID_5574519771104164530" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFpti8Iby668smCXJFPHnCC72g_yhjaOeqjEg-KuOFDaFkSwIhdS3vBi4m6056XNLRh8dlJjTvzC0c9a4XpYlBMdD5EMoaW4g1VYX9KsbAttG2K28YCgxcf1-kAVF-dYaMLfGgiPRMZzVH//" style="cursor: pointer; float: left; height: 166px; margin: 0pt 10px 10px 0pt; width: 400px;" /><br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
网络字体技术被迅速采用。Google网络字体现在每天处理约五千万个请求[1],覆盖大约八十万个独特网站[2],并以每月约30%的速度增长。在Google,我们对于网络字体改变网络结构的潜能感到十分激动。漂亮的印刷字体使网络浏览变得更加愉悦、有表现力、富有趣味。<br />
<br />
这里能通往美丽的网站!<br />
<br />
[1]“请求”即向Google字体应用程序界面(API)提出的需求,以获得一种或多种字体。<br />
<br />
[2]我们将一个独特的域名计算为一个独特的网站,但不计算“www”子域名。比如,www.myblog.com 和 myblog.com只会算作一个域名;而sam.myblog.com和sally.myblog.com则会计算成两个域名。<br />
<em>转载自<a href="http://googlechinablog.blogspot.com/2011/03/timesarial.html">Google 黑板报 : 不只是Times和Arial字体 – 全新的网络安全字体</a></em><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-10667219181086494222010-11-25T17:47:00.001+08:002010-11-25T17:47:05.811+08:00微软称最新IE9更新并非第二个测试版<p>微软表示,此次的IE9更新并不能够称得上是一个build版本,只不过是根据用户反馈意见而发布的两个解决浏览器内部问题的修复程序。迄今为止,微软仅发布了一个IE9 Beta版本以及第七个开发者预览build。</p> <p>据国外媒体报道,周三,微软针对IE9浏览器发布了两个更新,其中包括一个针对整个浏览器中各种问题的稳定性修复补丁,还包括一个修复运行Windows Live Essentials 2011的64位计算机中问题的补丁。</p> <p>据了解,开启“自动更新”的用户将能够自动获得此次的IE9更新,而那些没有开启“自动更新”的用户只能手动执行此次更新。 </p> <a name='more'></a> <p>微软是通过Windows Update(KB2448827)将IE9的首个更新推送至所有IE9用户的,这个更新修复了IE9中所包含的各种稳定性问题。 </p> <p>IE9的第二个更新修复了IE9浏览器中内置的反馈工具,之前,运行Windows Live Essentials 2011的64位计算机的用户不能够运行IE9中的反馈工具。 </p> <p>微软表示,此次的IE9更新并不能够称得上是一个build版本,只不过是根据用户反馈意见而发布的两个解决浏览器内部问题的修复程序。迄今为止,微软仅发布了一个IE9 Beta版本以及第七个开发者预览build。</p> <div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-6623340819646000600.post-33922394365164807922010-11-08T22:13:00.001+08:002010-11-08T22:13:48.401+08:00新单词诞生:ungelivable(不给力)记不住成千上万的英语单词,不如自己创造一个好记又好玩的新单词吧。昨日,“生活周刊”发出的一条微博,在短短几个小时内被转发上万次。一看,原来这条微博自信地宣告:“有一个新单词诞生了 :ungelivable(不给力)!”会心而笑的网友们纷纷转载,“不转的话,就太unge-livable了!”<br />
<br />
ungeliable这个词,虽然看上去是英语,却体现了中西合璧的造词逻辑。前缀“un-”在英语中表示否定,可翻译为“不”;后缀“-able”在英语中表示单词为形容词;而中间的“geli”却是直接音译自中文的“给力(geili)”。与其他英文单词相比,这一“中式英语”单词基本上符合了英语造词规则,唯一不同之处则在于——老外绝对看不懂。<br />
<a name='more'></a><br />
虽然老外看不懂,但是ungeli-able在中国网友中却大受欢迎。“昂给力围脖!”网友们不仅第一时间就弄懂了它的发音,而且举一反三,“不给力是ungelivable,给力就是gelivable。”“哈哈,这单词实在太gelivable了!”昨日,各知名微博对此进行纷纷转载,转发量很快破万。网友戏称,ungeliable可能是有史以来传播速度最快的英文单词。<br />
<strong> 流行源于网络动画</strong><br />
如果gelivable真被收录进英语词典,那首先要归功于中文原词“不给力”。据介绍,“给力”一词可能源自东北或闽南方言,有很棒、很精彩的意思,现多用来形容事物“够劲”、“使人振奋”、“感到力量”等。<br />
<br />
2010年,“给力”一词突然流行起来,并在世界杯期间被广泛使用。究其根源,竟是一部由网友进行中文配音的动画片《搞笑漫画日和》。在其中一集《西游记:旅程的终点》中,唐僧师徒历经磨难到达天竺,发现所谓终点只是一面写有“天竺”二字的小旗子,孙悟空便对唐僧抱怨说:“这就是天竺吗?不给力啊老湿。”由于动画本身对《西游记》进行了大胆解构,同时配音组的本土化翻译极具创造性,因此该动画受到网民热烈追捧。“不给力”和“老湿”等新词也由此流行开来,不仅成为众多网民的口头禅,而且在现实生活中的使用频率也在急剧上升。 <br />
早报记者雍兴中<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-63242588482786693062010-10-30T22:33:00.003+08:002010-11-12T22:41:17.889+08:007 Favorite Things About Windows 7Few days ago it was a year anniversary of Windows 7, here is a list of 7 favorite Windows 7 things:<br />
<br />
<em>1. I love the new taskbar. It helps keep my work organized and looking good while at it! </em><br />
<br />
<em>2. Aero snap simply helps you keep organized whatever you are doing in your virtual workspace and it does it well. </em><br />
<br />
<em>3. I absolutely love the devices and printers folder which helps me manage not only all of my connected devices but also my shared network printer. I also love this feature to quickly access some system settings, as your computer is listed as a device.</em><br />
<br />
<em>4. One feature that I love, not so much because it helps me but it helps me help others, is the "Troubleshooting" feature in the control panel. It's great for people who don't know much about computers to help get their pc in order.</em><br />
<br />
<em>5. The "show desktop" button I find is a great little feature. I like working in an organized space, so having too many windows open sometimes can be frustrating. It's nice to know I can minimize them all with one click.</em><br />
<em>6. Libraries are another one of my favorite features because of how easy it is to keep like-file types together. For example, in previous versions of Windows If I wanted to separate my personal music collection from say my sisters music collection I'd make a separate folder or sub-folder to put her music in, but in never felt cohesive with the rest of the music on the computer. Libraries help make the experience cohesive since you can have all music accessible under a single outlet.</em><br />
<br />
<em>7. One of the most awesome features is XP Mode. There's several programs that I use that won't work in Windows 7 - even in compatibility mode. This feature sort of "bridges the gap" between the old and the new and makes the continued use of an out of date program possible.</em><br />
These features are just a few of the many awesome features found in Windows 7. I could never go back to previous versions of Windows. Microsoft, you got me hooked! =)<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-23230295015699619772010-10-27T13:57:00.001+08:002010-10-27T21:59:06.768+08:00Microsoft sends out invites to Office 2010 and SharePoint 2010 SP1 BetaToday, Microsoft have begun sending out emails inviting lucky participants to the limited, exclusive Office 2010 and SharePoint 2010 beta program. The emails read as follows:<br />
<blockquote>Hello Valued Microsoft Customer,<br />
We are contacting you about an opportunity to participate in an upcoming Beta testing program. You may be a previous tester of Microsoft products, or someone who has been nominated. Beta programs are unique ways to experience product updates and provide feedback to the development teams. Later this calendar year we will begin an invitation-only beta testing of the Service Pack 1 for Office 2010 and SharePoint 2010. Service Packs contain product updates since the product released. We would like to invite you to participate in the private testing of that service pack.<br />
<strong>Call to action</strong><br />
If you are interested in participating in this Beta, and if you are already using Office 2010 or SharePoint 2010, please complete the application survey by following the link below. Upon completing the survey, your participation status will be set to ‘pending’, while we review your submission. If you are selected to participate, you will receive a formal invitation to join the program. Due to the limited number of seats in this private Beta, we may not be able to accommodate all interested testers.<br />
If you are already registered on Microsoft Connect, make sure to sign in with your existing registered Windows Live ID account to submit this survey. If you are not registered yet, you will be prompted to do so.<br />
<snip></snip><br />
or copy the following URL and paste it into your Web browser’s address bar: <snip></snip><br />
Thank you for your interest, and we look forward to hearing from you!<br />
Sincerely,<br />
The Microsoft Office Customer Programs Team</blockquote>If you participated in the Office 2010 Technical Beta and/or Microsoft likes you enough, keep an eye out on your inbox for an invite to this program.<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-83817782138548096382010-08-18T10:54:00.002+08:002010-08-29T11:01:00.569+08:00Windows 7局域网共享设置WIN7系统的网络功能比XP有了进一步的增强,使用起来也相对清晰。但是由于做了很多表面优化的工作,使得底层的网络设置对于习惯了XP系统的人来说变得很不适应,其中局域网组建就是一个很大的问题。默认安装系统后不但同组内的WIN7系统互相不能共享访问,而且最头疼的问题是组内的XP系统计算机更难互访。针对这个问题,从网络上收集了一些这方面的资料,结合自己在调试过程中的情况,通过以下步骤基本能够解决XP与WIN7局域网共享设置的问题。不到之处请网友谅解指正。<br />
一:必要点<br />
<br />
1、需要是管理员权限的帐户<br />
<br />
2、所有入网的计算机都要在相同的IP段,比如都为192.168.1.X(2≤X≤255)<br />
<br />
3、所有入网的计算机都要在相同的工作组,比如都在WORKGROUP组<br />
<br />
4、所有入网的计算机都要开启来宾账户,默认账户名为:guest。<br />
<br />
5、关闭任何第三方的防火墙软件,或者进行一些相关设置(很重要Windows自带的防火墙。如果没有把它关闭的话,也需要进行一些设置才可以。打开Windows防火墙---例外---勾选 文件和打印机共享---确定---保存。 XP系统,在 常规 选项卡中,要去掉不允许例外 前面的勾。<br />
<br />
6、所有入网的计算机的操作系统必须有正确的权限设置(这是重点)<br />
<br />
7、XP,是指Windows XP Professional 版本。其中所述的部分方法,并不适用于Windows XP Home Edition。<br />
<br />
8、WIN7,是指Windows 7。不同版本的WIN7可能存在一定的差异。如果你用的是Home Basic版本,就不要再往下看了,因为Home Basic不提供文件共享功能。。<br />
<a name='more'></a><br />
二:必须开启的服务<br />
<br />
右键点击我的电脑 或计算机—管理----服务和应用程序,打开服务或者用WIN+R打开 运行---输入services.msc回车,打开服务设置<br />
<br />
将以下服务的[启动类型]选为[自动],并确保[服务状态]为[已启动]<br />
<br />
Server<br />
<br />
Workstation<br />
<br />
Computer Browser<br />
<br />
DHCP Client<br />
<br />
Remote Procedure Call<br />
<br />
Remote Procedure Call (RPC) Locator<br />
<br />
DNS Client<br />
<br />
Function Discovery Resource Publication<br />
<br />
UPnP Device Host<br />
<br />
SSDP Discovery<br />
<br />
TIP/IP NetBIOSHelper //这个很重要,其他的条件即使都满足了,没有这个也不行。<br />
<br />
<br />
三:基本设置<br />
<br />
A: XP系统:<br />
<br />
下载XP局域网一键共享,按里边的操作设置后,重启即可。<br />
<br />
XP系统文件共享:右键单击要共享的文件夹,选择[共享和安全],勾选 在网络上共享这个文件夹。<br />
<br />
B:Win7系统:<br />
<br />
1.网络和共享中心---点击 网络 右边的 自定义---将网络类型设置为 专用网络<br />
<br />
2.共享和发现---启用 网络发现、文件共享、打印机共享。密码保护的共享则可以设置为关闭。<br />
<br />
3. 跨操作系统的打印机共享涉及到驱动的问题,为了避免麻烦,建议不要跨操作系统共享打印机。<br />
<br />
4.访问策略设置<br />
<br />
用WIN+R打开 运行---输入secpol.msc回车,打开本地安全设置<br />
<br />
安全设置----本地策略----安全选项<br />
<br />
帐户: 使用空白密码的本地帐户只允许进行控制台登录,设置为 已禁用。<br />
<br />
此选项默认为 已启用。这是很关键的一步,因为很多人的电脑都是没有加密码的的。如果你当前使用的帐号没有密码的话,只允许控制台登录,就无法通过 网上邻居(XP)或网络(Vista来访问了。所以此处需要禁用。<br />
<br />
网络访问: 不允许 SAM 帐户和共享的匿名枚举] ,设置为 已禁用。<br />
<br />
此选项默认为 已禁用。Windows 允许匿名用户执行某些活动,如枚举域帐户和网络共享的名称。这提供了方便,也带来潜在的风险。有的版本的系统(比如GhostXP电脑公司版)为了安全起见,将其设置为启用,但这样一来,局域网其它电脑就会无法查看你共享的内容了。<br />
<br />
网络访问: 本地帐户的共享和安全模型,设置为 仅来宾。<br />
<br />
此选项对加入了域的计算机默认为经典],对独立的计算机默认为[仅来宾]。这是一个共享安全的辅助选项。小规模局域网内部的计算机彼此之间都是信任的,不存在非法访问的问题,为了方便起见,建议使用 仅来宾 方式。而使用 经典 模式可以更好地划定共享资源的访问权限,对于规模稍大的局域网,为了防止共享的资源被非法访问,就可以使用这种方式。<br />
<br />
安全设置---本地策略---用户权利指派<br />
<br />
从网络访问此计算机: 查看有没有本机来宾帐户即guest,如果没有就加上。<br />
<br />
拒绝从网络访问这台计算机:查看有没有本机来宾帐户名,如果有就删除。<br />
<br />
5. Win7系统文件共享设置<br />
<br />
文件夹右键---共享---选择要与其共享的用户---点击黑色的小三角箭头---在下拉菜单中选择---everyone(这个列表中的所有用户)。<br />
<br />
注意:在进行以上设置之前共享过的文件夹,可能需要重新共享后才能被正常访问。比如说以前使用 经典 模式共享了该文件夹,改为 仅来宾 模式后再访问就会出错,提示没权限。解决的办法就是先取消共享,再重新共享。<br />
<br />
<br />
—————————————————————————————————————————————<br />
<br />
ps:防火墙没必要关闭,毕竟开方共享不是开放黑客!安全依然重要,在享有共享的时候,不能丢弃安全。<br />
防火墙只要设定开放端口139和445的TCP口,还有137和138的UDP口就可以了。<br />
<br />
另外,在服务中,确保TCP/IP NetBIOSHelper服务是自动的没错,但是并不等于这个功能在WINS下启用了,必须还得到网卡的TCP/IP设置里,WINS里面打开TCP/IP上的NETBIOS启用勾勾,这才能真正生效!没这玩艺,就算前面所有工作都做到家了,还是不容易通!就算偶尔通了,也是暂时通,时而通时而不通,通通断断、断断通!只要这个小勾勾打上,就能稳稳地通!<br />
另外再补充<br />
对于刚刚玩共享的人,有时会找不到该开什么窗口该按哪个钮才能看到对方,WIN7和XP还有蛮大的区别。<br />
XP下,一切设置好了,是点网上邻居进去的,或我的电脑文件夹里左边的按钮中,也有网上邻居。不过因为各种复杂的原因,并不是每个XP电脑都能在这里看到共享的WIN7电脑,概率只有50%,原因非常复杂,若没看到,可以点网上邻居左边的查看”工作组计算机“,如果WIN7端设定好的话,那一定会在”工作组计算机“中列出,然后就可以进行操作了。<br />
<br />
WIN7下,很多很多人会直接去点家庭网络的自动发现按钮,玩命地点,结果只有一个,”未找到共享计算机“,这种事情我碰到不少了,别往这方向努力了,这是给WIN7和WIN7之间家庭内网搞的按钮,就算两个WIN7都未必能通,白费力!<br />
真正顶用的,直接点开桌面的”计算机“文件夹,左边的一排按钮里就有”网络“二字,直接点这玩艺儿,一切共享的机机统统跑出来。<br />
<br />
这些是经历过多次实战的经验而已,哈哈!<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-6623340819646000600.post-15336433201408108072010-08-05T08:44:00.003+08:002010-08-29T10:53:22.410+08:00Windows7 快捷键必看点任何的操作系统、软件、游戏,只有熟练使用快捷键,才能最大效率的工作、娱乐,我们不能把所有的时间都浪费在一台机器上,这是不行的。快捷键带给我们的不只是快速,还能感受到机器带来的快感。很难想象一个不用键盘的魔兽争霸玩家。<br />
<br />
<strong>1. Ctrl + Shift + N – 创建一个新的文件夹</strong><br />
你需要在文件夹窗口中按 <strong>Ctrl + Shift + N</strong> 才行,在 <strong>Chrome</strong> 中是打开隐身窗口的快捷键。<br />
<strong>2. Ctrl + Shift + 左键 – 用管理员权限打开程序 (Ctrl+Shift+Click to Open a Program As Administrator)</strong><br />
有些程序,需要右键选择 Windows7 的管理员权限才可以正常运行,而这个蛋疼的快捷键我没有测试成功。在受限制帐户下测试的软件 AirVideoServer 可以在 Touch 上成功连接 AirVideoServer 并播放视频。<br />
<strong>3. Shift+ 鼠标右键 – 增强版右键发送到</strong><br />
<strong>右键发送到</strong> 是一个很常用的功能,一般情况下可以发送到:桌面快捷方式、邮件联系人、压缩文档、移动设备等等。而通过 <strong>Shift+ 鼠标右键</strong> 的发送到,增加了 Windows7 个人文件夹内的所有内容,包括:我的文档、我的照片、我的音乐、桌面等等<br />
<br />
<strong>4. Shift + 右键 – 在当前文件夹用命令行打开。</strong><br />
<br />
开始 “ 运行” cmd 就是命令行界面,传说中的 DOS 命令。最常用的可能就是 ping 了吧?用命令行来修改文件扩展名也是好办法,<strong>ren name.txt name.bat</strong> 就可以把一个文本文件改成批处理文件了。而 <strong>Shift + 右键</strong> 在当前文件夹用命令行打开的作用就是不用频繁的 cd 打开各级文件夹了。<br />
<strong>5. Win + 空格 – 闪现桌面</strong><br />
效果与鼠标停留在任务栏最右端相同,松开 Win 键即恢复窗口。恩,你可以用来看看桌面背景的美女。<br />
<strong>6. Win+ 上/下/左/右 – 移动当前激活窗口</strong><br />
其中,Win +左/右 为移动窗口到屏幕两边,占半屏,Win + 上 为最大化当前窗口,下为恢复当前窗口<br />
<a name='more'></a><br />
<strong>7. 针对双显示器: Win + Shift + 左 – 移动当前窗口到左边的显示器上</strong><br />
针对让人羡慕的双显示器,可以很方便的移动当前窗口到另外一个显示器上,比如把视频窗口移到一边去,还可以继续上网。<br />
<strong>8. 针对双显示器: Win + Shift + 右 – 移动当前窗口到右边的显示器上</strong><br />
我认为是老外为了凑数才把这个快捷键单独列出来的。<br />
<strong>9. Win + T – 显示任务栏窗口微缩图并回车切换</strong><br />
<br />
多按几次 T 可以在不同的任务栏窗口中显示,回车则切换。很方便的快捷键。切换窗口还可以用 Win + Tab。<br />
<strong>10. Shift + 左键 – 在任务栏对已打开的程序/文件夹再打开一次</strong><br />
话比较绕,比如你对着任务栏里的 Chrome <strong>Shift + 左键</strong> 则会新打开一个窗口。而对着<strong>记事本</strong>按也会再打开一个记事本。<br />
<strong>11. Win + B – 移动光标到系统托盘</strong><br />
针对键盘爱好者,不需要在狂按 TAB 键才切换到系统托盘了。<strong>Win + B</strong> 直达托盘,之后就可以用方向键控制了,也可以控制时间区域。<br />
<strong>12. Win + P – 在显示器与投影间相互切换</strong><br />
<strong>13. Win + 1, Win + 2 – 在任务栏中快速切换程序</strong><br />
任务栏从左到右 1,2,3,快速切换用的。对当前窗口的作用是最小化,另外一个最小化快捷键是 <strong>Win + M</strong>。<br />
<strong>14. Win + Pause – 打开系统属性</strong><br />
通过开始菜单 > 计算机右键属性,是一个东西<br />
<strong>15. Ctrl + Shift + Esc – 快速打开 Windows 任务管理器</strong><br />
俗话说最好的留在最后,自从升级 Windows7 后,想调用任务管理器,需要先 <strong>Ctrl + Alt + Del</strong> 标准快捷键,再点击任务管理器,并且屏幕还会被锁定。而今天才知道的 <strong>Ctrl + Shift + Esc</strong> 让我泪流满面啊。。。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-90152783113066946392010-07-29T11:43:00.005+08:002010-08-29T10:48:54.244+08:00计算机Numlock的秘密一般来说电脑开机启动时NumLock键是启动的。我们可以在Bios中修改相应的设置。<br />
<b><br />
NumLock键启动就亮的原理</b><br />
在Windows系统启动时,它会从注册表下面读一个键值,然后根据这个键值的内容来决定是否启动NumLock键、CapsLK键、ScrLock键等。<br />
这个键值是:<br />
<blockquote>InitialKeyboardIndicators</blockquote>它是REG_SZ类型,内容的含义是:<br />
0 - Turn all indicators Off (NumLock, CapsLock, ScrollLock) <br />
1 - Turn CapsLock On <br />
2 - Turn NumLock On <br />
3 - Turn CapsLock and NumLock On <br />
4 - Turn ScrollLock On <br />
5 - Turn CapsLock and ScrollLock On <br />
6 - Turn NumLock and ScrollLock On <br />
7 - Turn all indicators On (NumLock, CapsLock, ScrollLock)<br />
<br />
也就是说:<strong><span style="color: red;">设置为0 则关闭NumLock键,设置为2则开启NumLock键</span></strong>。<br />
<a name='more'></a><br />
<strong>但是这个键值在用户登录前和登录后读取的路径是不一样的。</strong><br />
<br />
<b><br />
用户登录前的NumLock</b><br />
在登录用户前,Windows是根据<br />
<blockquote>HKEY_USERS\.Default\Control Panel\Keyboard 下InitialKeyboardIndicators</blockquote>的内容来决定是否开启这些键值的。<br />
注意:有些Win机器上是2147483648,即十六进制的0x80000000,最后一个位有效,即表示0的意思。<br />
<br />
<h3>用户登录后的NumLock</h3>在一个用户登录后,Windows是根据<br />
<blockquote>HKEY_CURRENT_USER\Control Panel\Keyboard 下InitialKeyboardIndicators</blockquote>的内容来决定是否开启这些键值的。<br />
<br />
注意:<span style="color: red;"><strong>Windows7在关机时会自动保存当前NumLock键的状态的,也就是你自己改无效,反正关机时它会再根据NumLock键的状态覆盖你设置的内容。</strong></span><br />
<br />
<b><br />
解决方案: 开机打开NumLock键</b><br />
1.设置 HKEY_USERS\.Default\Control Panel\Keyboard 下InitialKeyboardIndicators 为2<br />
2.关机前打开NumLock键<br />
3.重启<br />
<br />
<b><br />
解决方案: 开机不打开NumLock键</b><br />
1.设置 HKEY_USERS\.Default\Control Panel\Keyboard 下InitialKeyboardIndicators 为0<br />
2.关机前关闭NumLock键<br />
3.重启<br />
<br />
<b><br />
NumLockZ</b><br />
为了方便设置,我写了一个NumLockZ的命令行程序。大家可以从这里下载:<br />
<blockquote><a href="http://www.box.net/shared/gxv5mqze5j" title="http://www.box.net/shared/gxv5mqze5j">http://www.box.net/shared/gxv5mqze5j</a></blockquote>使用也很简单:<br />
<blockquote>numlockz /on 打开numLockz键<br />
numlockz /off 关闭numlockz键<br />
numlockz /print 显示注册表键值</blockquote>设置后需要大家按下numlock键并重启机器。<br />
<br />
<b><br />
参考资源:</b><br />
<a href="http://social.answers.microsoft.com/Forums/en-US/w7hardware/thread/7b48ae6f-fa9c-4bc2-8359-81e0c5e5d6a2" title="http://social.answers.microsoft.com/Forums/en-US/w7hardware/thread/7b48ae6f-fa9c-4bc2-8359-81e0c5e5d6a2">http://social.answers.microsoft.com/Forums/en-US/w7hardware/thread/7b48ae6f-fa9c-4bc2-8359-81e0c5e5d6a2</a><br />
<a href="http://www.askvg.com/force-capslock-numlock-and-scrolllock-keys-behavior-using-windows-registry/" title="http://www.askvg.com/force-capslock-numlock-and-scrolllock-keys-behavior-using-windows-registry/">http://www.askvg.com/force-capslock-numlock-and-scrolllock-keys-behavior-using-windows-registry/</a><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-25235496024718688722010-07-10T10:13:00.005+08:002010-08-29T10:46:02.590+08:00如何在你的站点上使用HTML5已经有许多文章是关于HTML5的了,例如“HTML5有什么期待?”和“HTML5会如何改变网络”之类的,但是对于Web开发人员来说,最主要需要知道的是:我现在可以用上HTML5来做些什么,我怎么开始使用它?好消息是现在已经有不少的HTML5里的东西可以使用了。但是,开始你就必须要明白一件事情,你需要知道你的受众如何,否则的话你就不该使用HTML5。假如你的站点的访问大部分人都是在使用IE6,那么你完全没有任何理由使用HTML5。另一方面,如果你站点的访问者都是使用手机浏览器,如iPhone和iPad,那么你还在等什么呢?马上就可以开始动手了!等等,这里有一些准则,看完再动手不迟。<br />
<br />
你现在可以使用哪些HTML5特性?<br />
<br />
虽然HTML5标准现在仍然是个草案,在标准化组织手里依然还在商讨,但是重要的部分已经被许多现代的浏览器实现了。Apple Safari, Google Chrome, Mozilla Firefox, Opera和Microsoft IE9都已经很好的支持了HTML5的部分特性。<br />
<a name='more'></a><br />
先来看看各浏览器在HTML5TEST网站上的得分如何:<br />
* Apple Safari 5.0: 208<br />
<br />
* Google Chrome 5.03: 197<br />
<br />
* Microsoft IE7: 12<br />
<br />
* Microsoft IE8: 27<br />
<br />
* Mozilla Firefox 3.66: 139<br />
<br />
* Opera 10.6: 159<br />
<br />
看起来很明显,非IE核心的主流浏览器大部分都对HTML5支持良好,它们可以使“使用了HTML5草案的网站”工作得很好。<br />
<br />
回到开始,你现在就可以使用HTML5的doctype了,没有理由不使用,你甚至可以在整个网站里进行查询和替换:<br />
<br />
<!--DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”</P--><br />
<br />
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”><br />
变为:<br />
<br />
<!--DOCTYPE html--><br />
<br />
下面这部分代码看起来更简洁和直接,不是吗?如果浏览器用一个标准兼容的方式来渲染你的网页,那么他们现在仍然会这么做。<br />
<br />
说说视频吧。许多关于HTML5的出版物都会提及到目前的竞争者,一共四个:Flash, H.264, OGG和WebM。所有这些在未来都有可能成为一个标准格式,而且没有一个可以在所有平台所有浏览器上正确播放,很悲哀吧,看起来,浏览器的赞助商们在短 时间内还没有为这个特性准备一个公共的格式。<br />
<br />
所以,显而易见的是,Video标签现在还没有到可以应用的阶段。但是等下,人们应该期待HTML5的视频标签是与格式无关的。事实上,因为视频可 以包含多个Source标签,它也必须得这样工作。如果你的浏览器不支持第一个选项,那么就会去尝试第二个,再第三个,四个,五个……<br />
<br />
处理这样的情况的HTML是一个开源项目,支持基于网络的视频,不使用任何脚本和浏览器嗅探,可以在这里找到。<br />
<br />
从语义上讲,HTML5的一个大的改变就是那些语义明确化的标签。可以看到的改变是,目前你的站点上充满了类似于这样的代码:<br />
<br />
<div id="”header”"><br />
<span class="”nav”"><br />
<br />
而在HTML5中,你可以这样表示:<br />
<br />
<header><nav><br />
<br />
是不是语义更明确?当然,我们还是要用CSS[层叠样式表]来格式化这些元素。但是等等,没有一个IE版本可以支持这些标签!这对于人们来说是一个 巨大的问题!我们真的这么倒霉吗?谢天谢地,我们还有一个解决方案:所有你需要做的事情就是把下面的代码粘贴到你的页面的HEAD标签里:<br />
<br />
<!--if lt IE --><br />
<script src="</P"><br />
<p><br />
</P><p>"http://html5shiv.googlecode.com/svn/trunk/html5.js"> </P><p><br />
</P><p><br />
</script><br />
<!--ndif--><br />
<br />
HTML5 Shiv是一个开源的项目,基于一个简单的发现:如果你在IE里创建了一个DOM元素,那么你就可以用那个名字在样式里使用。例如,如果你使用<br />
<br />
document.createElement(“foo”)<br />
<br />
创建了一个DOM元素,那么你就可以在当前页面里加入任意数量的foo标签,而且IE会格式化它们。HTML5 Shiv里包含了一些IE不能识别的HTML5元素,然后一个一个的去创建它们。这样你就可以使用这些HTML5标签了,例如:<br />
<br />
Article, Section, Header, Footer, Nav<br />
<br />
智能表单,另一个使HTML5更聪明的特性。如果你对于每次写同样的脚本去检查邮件地址的合法性或者类似于电话号码、网络地址之类的感到厌烦的话,那么你不是一个人!有理由去让浏览器去完成这些烦人的工作,不是吗?相当正确。<br />
<br />
下面是语法:<br />
<br />
<input type="email" /> <br />
<br />
<input type="url" /> <br />
<br />
<input type="number" /> <br />
<br />
<input type="tel" /><br />
<br />
那些旧的浏览器会如何处理?比较聪明的部分:如果它们看到一个TYPE属性有个值不认识的话, 那么它们就会用默认值Text去渲染这个元素,这正是我们所期望的向下兼容的结果。支持HTML5的浏览器会自动去验证这个字段类型,但是,你最好还是不 要把以前的脚本扔掉,至少——也要在IE9普及以后。<br />
<br />
如果你还想知道除了验证之外,支持这些类型的浏览器还做了些什么事情,那么你可以在iPhone上试试这些表单。你会注意到与表单关联的键盘类型都 会发生变化,有的时候是数字类型的,有的时候是字母类型但附加了一个@符号,还有的甚至直接有一个按键.com,这就是这些元素的魔力。所有你需要做的就 是改变这个type的属性值而已。<br />
<br />
还可以更智能一点,这里还有个新属性:<br />
<br />
placehoder<br />
<br />
这个值可以简单地指定一段文本,你经常在网上看到的效果,没值的时候显示此文本,单击的时候值变成空,离开又恢复成该文本,以前要用到Javascript处理,现在浏览器会为你做这个事情了。<br />
<input placeholder="Your email address" type="email" /><br />
<br />
<br />
有哪些HTML5特性你马上就可以使用?<br />
<br />
不是所有的HTML5元素都已经准备好可以使用了,因为种种原因(这些原因是没有一个缩写为 IE 的),浏览器支持马上就要来了,在不远的未来,你马上就有两个元素可以使用了。<br />
魔幻字体,每个设计师都有一个梦想,希望站点的访问者们都安装了他们在设计时所需要的字体,为此,以前可谓手段 百出,用图片,Flash等等不一而足,现在,他们拥有了这个权利,你可以强制你的访问者安装你指定的字体了。这就是CSS3的支持: @font-face属性。Firefox 3.5以前的版本和Safari的移动版本(iOS 4之前)不支持这个属性,如果你的站点有很多这样类似的访问,那么你可能就得等等了。<br />
<br />
无论如何,其实没有真正的理由,让所有的浏览器都使用同一种字体的。如果你想提供给那些支持此属性的浏览器以自定义字体,然后让不支持此属性的浏览器有一个可替代的字体也是一个不错的解决方案,这个时候,Font Squirrel’s @font-face 生成器 是个不错的去处。<br />
<br />
阴影和圆角,让很多设计师高兴的东西来了,文本阴影、区块阴影,区块圆角特性等现在都CSS3支持的标准了。再说一次,如果你不想用像素级别的完美来衡量在不同浏览器中的渲染的话,那么你现在就可以开始使用这些特性了。CSS3 生成器 会帮助你做好这事。<br />
<br />
圆角 (Firefox 3+, Safari 3.1+, Opera 10.5+, Chrome 4+, IE 9+)<br />
<br />
-webkit-border-radius: 10px; <br />
<br />
-moz-border-radius: 10px; <br />
<br />
border-radius: 10px;<br />
<br />
文本阴影 (Firefox 3.5+, Safari 1.1+, Opera 9.6+, Chrome 4+)<br />
<br />
text-shadow: 5px 5px 3px #CCC;<br />
<br />
区块阴影(Firefox 3.5+, Safari 3+, Opera 10.5+, Chrome 4+):<br />
<br />
-webkit-box-shadow: 10px 10px 5px #666; <br />
<br />
-moz-box-shadow: 10px 10px 5px #666; <br />
<br />
box-shadow: 10px 10px 5px #666;<br />
<br />
哪些特性有一天你会用到?<br />
<br />
这个目录里包含了开发人员和设计师已经想了很多年的特性。可惜的是,在它们能够在现实世界真正使用之前,可能还得再等上几年时间。<br />
<br />
智能表单,前面已经提到过了,但是其实还有很多更好用的元素没有提及,但在更广泛的支持之前,是没有办法使用的。<br />
滑动选择器:<br />
<br />
<input max="100" min="0" step="2" type="range" value="50" /><br />
<br />
颜色选择器:<br />
<br />
<input type="color" /><br />
<br />
日期选择器:<br />
<br />
<input type="date" /><br />
<br />
带有正则验证的输入框:<br />
<br />
<input pattern="[0-9]{13,16}" type="text" /><br />
<br />
必须输入的输入框:<br />
<br />
<input required="" type="text" /><br />
<br />
所有这些标签都没有跨浏览器,跨平台实现支持,不过当那天到来的时候,你一定会很向往使用这些标签的。<br />
<br />
打印式布局,另一个CSS3的特性,全面实施尚需好几年的时间。给设计师们提供了多列布局的特性。目前只能在Firefox和Safari的测试用例里实现。<br />
<br />
-moz-column-count: 3; <br />
<br />
-moz-column-gap: 20px; <br />
<br />
-webkit-column-count: 3; <br />
<br />
-webkit-column-gap: 20px;<br />
<br />
地理位置检测,随着基于位置的服务增长,例如Gowalla和Foursquare,对于浏览器来说,知道用户 在哪里是很有用的。所以,基于手机的移动浏览器率先实现这个特性也就不足为奇了,Firefxo 3.5和Safari 5已经开始提供地理定位的支持了。(Chrome的类似服务是通过Gears实现的,不过正在逐步转向到HTML5上面)。<br />
<br />
离线工作和本地存储,在你没发现你没有网络连接的时候,将数据存储在云端是非常伟大的主意;或者你有一个应用程 序,需要处理大量的数据,这样就不得不频繁地在服务端和客户端之间往来,比你想像得到的还要多;又或者你的移动数据流量有限,你想在手机上存储更多的数据 以避免太多的流量损耗,这个时候的答案就是,使用本地储存来使应用程序离线工作,当连线的时候再同步到云端的功能。<br />
<br />
支持此功能的浏览器有:Firefox 3.5+, Safari Mobile 3.1+, Safari 4+, Chrome 4+。<br />
<br />
画板、动画和变换效果,HTML5的承诺之一使用Canvas元素和一些CSS3属性可以实现是全说明和全动画的网站。这来自2010年7月12号的标准。<br />
<br />
规范 说明 IE Firefox Safari Chrome <br />
<br />
Canvas 动态图形 9 3 3.2 3 <br />
<br />
Canvas 文本API 动态文本 9 3.5 4 3 <br />
<br />
变换 <br />
<br />
Transitions 简单的属性变换 ? 4 3.2 3 <br />
<br />
动画 <br />
<br />
Animation 高级的属性变换 ? ? 4 3 <br />
<br />
3D Canvas图形/WebGL 硬件加速的动态3D图形 ? 4 5 5 <br />
<br />
变形 <br />
<br />
Transforms 旋转和元素缩放 ? 3.5 3.2 3 <br />
<br />
3D变形 <br />
<br />
3D Transform 通过第三维进行变换 ? ? 5 ? <br />
<br />
<br />
绿色=已实现,红色=没有已经计划<br />
<br />
使用最尖端的HTML5的捷径<br />
<br />
如果你已经迫不及待地想IE8老死掉,那么,有很多种方法可以跳过它继续往前——再说一次,依然取决于你的访客。查看一下你的站点的访问日志,看看 访问量最多的浏览器标头是什么。这其中有一种方法就是,例如,使用Google的Chrome Frame,给IE嵌入了一个Chrome实例,如果你明白你站点的访问者可能已经安装了GCF[Google Chrome Frame],那么你可以在你的HEAD里加上一行META标签,强制IE浏览器使用GCF来显示你的网站:<br />
<br />
<meta content="chrome=1" http-equiv="X-UA-Compatible"><br />
<br />
[编者:不过提醒你的就是,这样做会使得原来的IE=7的IE7兼容模式失效,如果选择请自己权衡。]<br />
<br />
列举在本篇文章里的元素只是当前HTML5和CSS3草案中的一小部分,如果你不得不使用另外的一些新特性,那么去检查一下现有的开源项目是很有必要的,这样可以将浏览器兼容性的问题降到最低。<br />
<br />
许多媒体在报道HTML的时候都把焦点放在立场上面,什么“不到2022年”,什么“Flash杀手”之类的。现实是,HTML5是长期以来的需要和对久未更新的HTML4的一次全新升级——所以,今天你就可以开始使用它了。<br />
<br />
</span></div><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-28152533153517501742010-06-27T18:58:00.002+08:002010-06-27T19:01:23.115+08:00Windows7时间同步频率调整<p>今天发现时间不对,同步时间后看到Windows系统默认是一周才同步一次时间,频率太低了。查找了一下资料,找到了两种调整Win7时间同步频率的方法。 </p> <h5>方法一:注册表法</h5> <p>这种方法是通过修改注册表中的键值来达到同步目的。 </p> <p>注册表键值:</p> <pre>HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Services\\W32Time\\</pre><br /><br /><pre>TimeProviders\NtpClient</pre><br /><br /><pre>下修改两个键值:</pre><br /><a name='more'></a><br /><br /><pre><strong>SpecialPollInterval</strong> 从604800改为86400。</pre><br /><br /><pre>这个键值意思是时间同步的间隔,单位为秒。 原来7天就是7*24*3600=604800秒。</pre><br /><br /><pre>一天就是24*3600=86400秒。</pre><br /><br /><pre>然后创建一个DWORD值,名称为“<strong>SpecialInterval</strong>”,值为1</pre><br /><br /><pre>第3步是重启Windows Times服务即可</pre><br /><br /><pre>检查设置是否有效:</pre><br /><br /><p>方法二:计划任务法 </p><br /><br /><p>在Windows系统中,有一个w32tm.exe,通过该程序的一个参数就可以同步时间: </p><br /><br /><p>w32tm /resync </p><br /><br /><p>检查一下: </p><br /><br /><p>所以我们可以新建一个计划任务,然后每天执行一遍该任务即可。</p> <div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-6623340819646000600.post-6483428878749971892010-06-07T17:30:00.002+08:002011-05-15T21:50:30.617+08:00Blogger反向链接什么是反向链接?如何使用反向链接?打印 反向链接使您可以跟踪网络中链接到您帖子的其他网页。例如,假设 Alice 写了一个 Bob 感兴趣的 Blog 帖子。然后,Bob 到自己的 Blog 上写了一个关于它的帖子,并反向链接到 Alice 的原始帖子。Alice 的帖子就会自动显示 Bob 已与它建立链接,它将提供一小段 Bob 帖子的文字以及指向该帖子的链接。它所实现的是对评论功能的扩展,这样,对某个帖子的定期评论就可以与其他网站上的相关讨论汇集到一起。<br />
在"设置 <br />
评论"标签下可以找到反向链接设置。通过一个简易的选项可以进行功能开关转换<br />
<a name='more'></a><br />
同时您还可以选择是否将新帖子设为默认反向链接: <br />
<br />
我们的默认模板已经用反向链接所必需的代码进行了设置。但是,如果您使用的是自定义模板,或者是此功能推出之前我们提供的模板之一,则需要自行添加该代码。<br />
测试链接<br />
<a href="http://www.tangblog.info/2010/05/7/solve-View-Page-Source-window-placed-back-and-Developer-Tools-cant-open-questions-in-internet-explorer-8-Windows-7.html">http://www.tangblog.info/2010/05/7/solve-View-Page-Source-window-placed-back-and-Developer-Tools-cant-open-questions-in-internet-explorer-8-Windows-7.html</a><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-43636577349187573152010-03-27T18:06:00.000+08:002010-03-29T21:08:39.331+08:00联发科(MTK)也出智能机了看来智能机的门槛会越来越低呀。<br />
<br />
MTK采用的是WM6.5的系统,产品是MTK6516。基于ARM9处理器的。<br />
配置如下:<br />
<br />
<br />
MTK6516<br />
<br />
手机主要参数;<br />
<br />
操作系统:windows6.5<br />
<br />
CPU: 双核结构-应用处理器(ARM9)+MODEM (ARM7) 主频460MHZ+280MHZ<br />
<br />
内存:ROM256+RAM256<br />
<br />
LCD:3.2寸 WVGA 240X400:<br />
<br />
传输:WIFI , EDGE, 蓝牙<br />
<br />
导航: 内置STARSIVF3代导航芯片<br />
<br />
频率:850/900/1800/1900<br />
<br />
摄像头:320万+130万双摄像头<br />
<br />
多媒体:万能播放器+硬件加速器<br />
<br />
语言: 18国语言<br />
<a name='more'></a><br />
<br />
特色:<br />
<br />
1 首款支持定时开关机的WM系统 智能手机<br />
<br />
2 支持重力感应游戏和JAVA游戏<br />
<br />
3 支持OFFICE (OUTLOOK-POWER POINT-WODR-EXCEL-PDF)<br />
<br />
4 双卡双待,WM是正版的哦 有版权税的<br />
<br />
<br />
MTK一向以价格低著称,现在还没有看到有公布的价格,估计一下这个配置不外加存储卡的话,800(+-50)左右应该不错。<br />
联发科(MediaTek)终于公开发布它的智能手机SoC芯片MT6516,正如之前业界很多人猜测的一样,它选择了支持微软(Microsoft)的Windows Mobile,而没有支持目前如日中天的Android。笔者去年北展后也写过文章,猜测它会采用WM来打开智能手机之门。<br />
不过,笔者仍有较多疑问,比如为什么联发科在这么晚进入智慧手机的情况下,不选择开放的Android平台,而要选择授权费颇高的WM?他与微软的合作方式怎样,之前有人传微软为联发科的平台专写了精简版的WM,以使它能跑在较低的主频上,占有较少的资源,当然还有更低的收费,不知这些是真是假?联发科在它的官方新闻中,这些细节全都没有提及。<br />
机会来了,前几日联发科财务长兼新闻发言人喻铭铎,以及联发科中国首席代表廖庆丰等一行三人到深圳,专门” 召见”了我,我也弄明白了其中的道理。<br />
「我们董事长的想法是要让中国老百姓用到更实惠的功能,微软的WM能给中国广大的用户带来他们需要的更实惠的功能。」喻铭铎这样对我解释道:「WM目前最稳定、最成熟,有几百家公司为他们写应用软件。」<br />
不得不服联发科,目标从来没有动摇过。即使在它如日中天、即使在它占有了中国市场近7成的比例之后。为广大的老百姓服务永远是它的使命。去年,联发科手机芯片出货2.2亿片,中国手机内需大约2.5亿,当然,联发科这2.2亿片的出货量中,借由中国品牌厂商与杂牌厂商出口到亚非拉以及东欧等国的比例也越来越大,已快接近40%,有分析人士这样估算。<br />
微软得到联发科如雪中送炭,因为联发科潜在的巨大出货量对于目前受到Android阵营不断挑战的微软来说如沐春风;联发科到得微软如锦上添花,当联发科的 feature phone走到2.2亿片出货量的时候,往智慧手机走已是必须之路,而微软的助阵将帮助联发科在智慧手机市场快速起跑,因为它毕竟是目前生态链最完善的 OS。<br />
不过,MT6516毕竟跑在ARM9上面,200~400MHz的主频能支援WM6.5吗?「没有问题,我们在实验室已做过很多测试,性能都很流畅。因为我们对芯片架构进行了最佳化,很多功能通过硬核来完成。」据介绍,MT6516上可以支持WVGA等级的LCD分辨率、支持 H.264解碼标准。这些多媒体功能都是基于硬IP来完成的。<br />
昨天笔者恰巧在上海国际集成电路展(IIC)上遇到了一家韩国IP公司 ──Chips & Media,他们的H.264和MPEG4解碼IP授给了很多厂商,其中就包括联发科。笔者估计,MT6516中的H.264硬核也来自于该韩国公司。<br />
虽然目前铁定支持微软的WM,但是,联发科也没有完全拒绝Android。喻铭铎表示:「我们也会看Android,密切关注它的生态链的发展,其上能有多少软件开发商是最重要的。我们认为目前这个市场还是太成熟,我们的下一代智能手机芯片也有可能支持Android,这要看事态的发展,现在还不好说。」<br />
不过,从与他的交流中笔者分析道,联发科下一代智能手机芯片一定不会是基于ARM9了,或者是ARM11,或者是 A8,还在还未知。<br />
MT6516今年下半年可以实现商用和量产。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com3tag:blogger.com,1999:blog-6623340819646000600.post-12445713929186548592010-03-26T20:01:00.000+08:002010-03-29T21:06:03.826+08:00操作系统并发和互斥:哲学家进餐问题在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份共享的磁带驱动器。稍后,这个问题被托尼·霍尔重新表述为哲学家就餐问题。这个问题可以用来解释死锁和资源耗尽。<br />
<br />
<br />
问题描述<br />
<br />
<br />
<br />
设有5个哲学家,共享一张放有5把椅子的桌子,每人分得一把椅子,但是,桌子上共有5只筷子,在每人两边各放一只,哲学家们在肚子饥饿时才试图分两次从两边拿起筷子就餐。<br />
<br />
条件:<br />
<br />
1)拿到两只筷子时哲学家才开始吃饭。<br />
<br />
2)如果筷子已在他人手上,则该哲学家必须等他人吃完之后才能拿到筷子。<br />
<br />
3)任一哲学家在自己未拿到两只筷子前却不放下自己手中的筷子。<br />
<br />
试:<br />
<br />
1)描述一 个保证不会出现两个邻座同时要求吃饭的通信算法。<br />
<br />
2)描述一个即没有两个邻座同时吃饭,有没有饿死(永远拿不到筷子)的算法<br />
<br />
<br />
<br />
<br />
哲学家就餐问题可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。吃东西的时候,他们就停止思考,思考的时候也停止吃东西。餐桌中间有一大碗意大利面,每两个哲学家之间有一只餐叉。因为用一只餐叉很难吃到意大利面,所以假设哲学家必须用两只餐叉吃东西。他们只能使用自己左右手边的那两只餐叉。哲学家就餐问题有时也用米饭和筷子而不是意大利面和餐叉来描述,因为很明显,吃米饭必须用两根筷子。<br />
<br />
<br />
<br />
哲学家就餐问题的演示哲学家从来不交谈,这就很危险,可能产生死锁,每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反)。<br />
<br />
<a name='more'></a><br />
<br />
即使没有死锁,也有可能发生资源耗尽。例如,假设规定当哲学家等待另一只餐叉超过五分钟后就放下自己手里的那一只餐叉,并且再等五分钟后进行下一次尝试。这个策略消除了死锁(系统总会进入到下一个状态),但仍然有可能发生“活锁”。如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边的餐叉,那么这些哲学家就会等待五分钟,同时放下手中的餐叉,再等五分钟,又同时拿起这些餐叉。<br />
<br />
<br />
<br />
在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。一种常用的计算机技术是资源加锁,用来保证在某个时刻资源只能被一个程序或一段代码访问。当一个程序想要使用的资源已经被另一个程序锁定,它就等待资源解锁。当多个程序涉及到加锁的资源时,在某些情况下就有可能发生死锁。例如,某个程序需要访问两个文件,当两个这样的程序各锁了一个文件,那它们都在等待对方解锁另一个文件,而这永远不会发生。<br />
<br />
<br />
<br />
哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步时产生的问题。<br />
<br />
<br />
<br />
考虑了四种实现的方式(A、B、C、D):<br />
<br />
A.原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释<br />
<br />
放出他所使用过的两支筷子,从而可使更多的哲学家进餐。以下将room 作为信号量,只允<br />
<br />
许4 个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入<br />
<br />
餐厅的哲学家进入room 的等待队列,根据FIFO 的原则,总会进入到餐厅就餐,因此不会<br />
<br />
出现饿死和死锁的现象。<br />
<br />
伪码:<br />
<br />
semaphore chopstick[5]={1,1,1,1,1};<br />
<br />
semaphore room=4;<br />
<br />
void philosopher(int i)<br />
<br />
{<br />
<br />
while(true)<br />
<br />
{<br />
<br />
think();<br />
<br />
wait(room); //请求进入房间进餐<br />
<br />
wait(chopstick[i]); //请求左手边的筷子<br />
<br />
wait(chopstick[(i+1)%5]); //请求右手边的筷子<br />
<br />
eat();<br />
<br />
signal(chopstick[(i+1)%5]); //释放右手边的筷子<br />
<br />
signal(chopstick[i]); //释放左手边的筷子<br />
<br />
signal(room); //退出房间释放信号量room<br />
<br />
}<br />
<br />
}<br />
<br />
B.原理:仅当哲学家的左右两支筷子都可用时,才允许他拿起筷子进餐。<br />
<br />
方法1:利用AND 型信号量机制实现:根据课程讲述,在一个原语中,将一段代码同时需<br />
<br />
要的多个临界资源,要么全部分配给它,要么一个都不分配,因此不会出现死锁的情形。当<br />
<br />
某些资源不够时阻塞调用进程;由于等待队列的存在,使得对资源的请求满足FIFO 的要求,<br />
<br />
因此不会出现饥饿的情形。<br />
<br />
伪码:<br />
<br />
semaphore chopstick[5]={1,1,1,1,1};<br />
<br />
void philosopher(int I)<br />
<br />
{<br />
<br />
while(true)<br />
<br />
{<br />
<br />
think();<br />
<br />
Swait(chopstick[(I+1)]%5,chopstick[I]);<br />
<br />
eat();<br />
<br />
Ssignal(chopstick[(I+1)]%5,chopstick[I]);<br />
<br />
}<br />
<br />
}<br />
<br />
方法2:利用信号量的保护机制实现。通过信号量mutex对eat()之前的取左侧和右侧筷<br />
<br />
子的操作进行保护,使之成为一个原子操作,这样可以防止死锁的出现。<br />
<br />
伪码:<br />
<br />
semaphore mutex = 1 ;<br />
<br />
semaphore chopstick[5]={1,1,1,1,1};<br />
<br />
void philosopher(int I)<br />
<br />
{<br />
<br />
while(true)<br />
<br />
{<br />
<br />
think();<br />
<br />
wait(mutex);<br />
<br />
wait(chopstick[(I+1)]%5);<br />
<br />
wait(chopstick[I]);<br />
<br />
signal(mutex);<br />
<br />
eat();<br />
<br />
signal(chopstick[(I+1)]%5);<br />
<br />
signal(chopstick[I]);<br />
<br />
}<br />
<br />
}<br />
<br />
C. 原理:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号<br />
<br />
的哲学家则相反.按此规定,将是1,2号哲学家竞争1 号筷子,3,4号哲学家竞争3号筷子.即<br />
<br />
五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获<br />
<br />
得两支筷子而进餐。而申请不到的哲学家进入阻塞等待队列,根FIFO原则,则先申请的哲<br />
<br />
学家会较先可以吃饭,因此不会出现饿死的哲学家。<br />
<br />
伪码:<br />
<br />
semaphore chopstick[5]={1,1,1,1,1};<br />
<br />
void philosopher(int i)<br />
<br />
{<br />
<br />
while(true)<br />
<br />
{<br />
<br />
think();<br />
<br />
if(i%2 == 0) //偶数哲学家,先右后左。<br />
<br />
{<br />
<br />
wait (chopstick[ i + 1 ] mod 5) ;<br />
<br />
wait (chopstick[ i]) ;<br />
<br />
eat();<br />
<br />
signal (chopstick[ i + 1 ] mod 5) ;<br />
<br />
signal (chopstick[ i]) ;<br />
<br />
}<br />
<br />
Else //奇数哲学家,先左后右。<br />
<br />
{<br />
<br />
wait (chopstick[ i]) ;<br />
<br />
wait (chopstick[ i + 1 ] mod 5) ;<br />
<br />
eat();<br />
<br />
signal (chopstick[ i]) ;<br />
<br />
signal (chopstick[ i + 1 ] mod 5) ;<br />
<br />
}<br />
<br />
}<br />
<br />
D.利用管程机制实现(最终该实现是失败的,见以下分析):<br />
<br />
原理:不是对每只筷子设置信号量,而是对每个哲学家设置信号量。test()函数有以下作<br />
<br />
用:<br />
<br />
a. 如果当前处理的哲学家处于饥饿状态且两侧哲学家不在吃饭状态,则当前哲学家通过<br />
<br />
test()函数试图进入吃饭状态。<br />
<br />
b. 如果通过test()进入吃饭状态不成功,那么当前哲学家就在该信号量阻塞等待,直到<br />
<br />
其他的哲学家进程通过test()将该哲学家的状态设置为EATING。<br />
<br />
c. 当一个哲学家进程调用put_forks()放下筷子的时候,会通过test()测试它的邻居,<br />
<br />
如果邻居处于饥饿状态,且该邻居的邻居不在吃饭状态,则该邻居进入吃饭状态。<br />
<br />
由上所述,该算法不会出现死锁,因为一个哲学家只有在两个邻座都不在进餐时,才允<br />
<br />
许转换到进餐状态。<br />
<br />
该算法会出现某个哲学家适终无法吃饭的情况,即当该哲学家的左右两个哲学家交替<br />
<br />
处在吃饭的状态的时候,则该哲学家始终无法进入吃饭的状态,因此不满足题目的要求。<br />
<br />
但是该算法能够实现对于任意多位哲学家的情况都能获得最大的并行度,因此具有重要<br />
<br />
的意义。<br />
<br />
伪码:<br />
<br />
#define N 5 /* 哲学家人数*/<br />
<br />
#define LEFT (i-1+N)%N /* i的左邻号码 */<br />
<br />
#define RIGHT (i+1)%N /* i的右邻号码 */<br />
<br />
typedef enum { THINKING, HUNGRY, EATING } phil_state; /*哲学家状态*/<br />
<br />
monitor dp /*管程*/<br />
<br />
{<br />
<br />
phil_state state[N];<br />
<br />
semaphore mutex =1;<br />
<br />
semaphore s[N]; /*每个哲学家一个信号量,初始值为0*/<br />
<br />
void test(int i)<br />
<br />
{<br />
<br />
if ( state[i] == HUNGRY &&state[LEFT(i)] != EATING &&<br />
<br />
state[RIGHT(i)] != EATING )<br />
<br />
{<br />
<br />
state[i] = EATING;<br />
<br />
V(s[i]);<br />
<br />
}<br />
<br />
}<br />
<br />
void get_forks(int i)<br />
<br />
{<br />
<br />
P(mutex);<br />
<br />
state[i] = HUNGRY;<br />
<br />
test(i); /*试图得到两支筷子*/<br />
<br />
V(mutex);<br />
<br />
P(s[i]); /*得不到筷子则阻塞*/<br />
<br />
}<br />
<br />
void put_forks(int i)<br />
<br />
{<br />
<br />
P(mutex);<br />
<br />
state[i]= THINKING;<br />
<br />
test(LEFT(i)); /*看左邻是否进餐*/<br />
<br />
test(RIGHT(i)); /*看右邻是否进餐*/<br />
<br />
V(mutex);<br />
<br />
}<br />
<br />
}<br />
<br />
哲学家进程如下:<br />
<br />
void philosopher(int process)<br />
<br />
{<br />
<br />
while(true)<br />
<br />
{<br />
<br />
think();<br />
<br />
get_forks(process);<br />
<br />
eat();<br />
<br />
put_forks(process);<br />
<br />
}<br />
<br />
}<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-37140040282659564212010-03-24T20:34:00.002+08:002010-03-29T20:51:48.339+08:00C++ sizeof 用法总结1. 定义: <br />
<br />
sizeof是何方神圣?<br />
<br />
sizeof乃C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数。 <br />
<br />
MSDN上的解释为: <br />
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. <br />
其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为 typedef unsigned int size_t; <br />
世上编译器林林总总,但作为一个规范,它们都会保证char、signed char和unsigned char的sizeof值为1,毕竟char是我们编程能用的最小数据类型。 <br />
<a name='more'></a><br />
<br />
2. 语法: <br />
sizeof有三种语法形式,如下: <br />
1) sizeof( object ); // sizeof( 对象 ); <br />
2) sizeof( type_name ); // sizeof( 类型 ); <br />
3) sizeof object; // sizeof 对象; <br />
所以, <br />
int i; <br />
sizeof( i ); // ok <br />
sizeof i; // ok <br />
sizeof( int ); // ok <br />
sizeof int; // error <br />
既然写法3可以用写法1代替,为求形式统一以及减少我们大脑的负担,第3种写法,忘掉它吧! <br />
实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的 不同对象其sizeof值都是一致的。这里,对象可以进一步延伸至表达式,即sizeof可以对一个表达式求值,编译器根据表达式的最终结果类型来确定大小,一般不会对表达式 进行计算。如: <br />
sizeof( 2 );// 2的类型为int,所以等价于 sizeof( int ); <br />
sizeof( 2 + 3.14 ); // 3.14的类型为double,2也会被提升成double类型,所以等价 于 sizeof( double ); <br />
sizeof也可以对一个函数调用求值,其结果是函数返回类型的大小,函数并不会被调用,我们来看一个完整的例子: <br />
char foo() <br />
{ <br />
printf(foo() has been called.\n); <br />
return a; <br />
} <br />
int main() <br />
{ <br />
size_t sz = sizeof( foo() ); // foo() 的返回值类型为char,所以sz = sizeof(char ),foo()并不会被调用 <br />
printf(sizeof( foo() ) = %d\n, sz); <br />
} <br />
C99标准规定,函数、不能确定类型的表达式以及位域(bit-field)成员不能被计算s <br />
izeof值,即下面这些写法都是错误的: <br />
sizeof( foo );// error <br />
void foo2() { } <br />
sizeof( foo2() );// error <br />
struct S <br />
{ <br />
unsigned int f1 : 1; <br />
unsigned int f2 : 5; <br />
unsigned int f3 : 12; <br />
}; <br />
<br />
sizeof( S.f1 );// error <br />
<br />
<br />
<br />
3. sizeof的常量性 <br />
sizeof的计算发生在编译时刻,所以它可以被当作常量表达式使用,如: <br />
char ary[ sizeof( int ) * 10 ]; // ok <br />
最新的C99标准规定sizeof也可以在运行时刻进行计算,如下面的程序在Dev-C++中可以 <br />
正确执行: <br />
int n; <br />
n = 10; // n动态赋值 <br />
char ary[n]; // C99也支持数组的动态定义 <br />
printf(%d\n, sizeof(ary)); // ok. 输出10 <br />
但在没有完全实现C99标准的编译器中就行不通了,上面的代码在VC6中就通不过编译。 <br />
所以我们最好还是认为sizeof是在编译期执行的,这样不会带来错误,让程序的可移植 <br />
<br />
性强些。 <br />
<br />
<br />
<br />
4. 基本数据类型的sizeof <br />
这里的基本数据类型指short、int、long、float、double这样的简单内置数据类型, <br />
由于它们都是和系统相关的,所以在不同的系统下取值可能不同,这务必引起我们的注 <br />
<br />
意,尽量不要在这方面给自己程序的移植造成麻烦。 一般的,在32位编译环境中,sizeof(int)的取值为4。<br />
<br />
<br />
<br />
5. 指针变量的sizeof <br />
学过数据结构的你应该知道指针是一个很重要的概念,它记录了另一个对象的地址。既然是来存放地址的,那么它当然等于计算机内部地址总线的宽度。所以在32位计算机中 ,一个指针变量的返回值必定是4(注意结果是以字节为单位),可以预计,在将来的64位系统中指针变量的sizeof结果为8。 <br />
char* pc = abc; <br />
int* pi; <br />
string* ps; <br />
char** ppc = &pc; <br />
void (*pf)();// 函数指针 <br />
sizeof( pc ); // 结果为4 <br />
sizeof( pi ); // 结果为4 <br />
sizeof( ps ); // 结果为4 <br />
sizeof( ppc ); // 结果为4 <br />
sizeof( pf );// 结果为4 <br />
指针变量的sizeof值与指针所指的对象没有任何关系,正是由于所有的指针变量所占内 存大小相等,所以MFC消息处理函数使用两个参数WPARAM、LPARAM就能传递各种复杂的消息结构(使用指向结构体的指针)。 <br />
<br />
<br />
<br />
6. 数组的sizeof <br />
<br />
数组的sizeof值等于数组所占用的内存字节数,如: <br />
char a1[] = abc; <br />
int a2[3]; <br />
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符 <br />
sizeof( a2 ); // 结果为3*4=12(依赖于int) <br />
一些朋友刚开始时把sizeof当作了求数组元素的个数,现在,你应该知道这是不对的, 那么应该怎么求数组元素的个数呢Easy,通常有下面两种写法: <br />
int c1 = sizeof( a1 ) / sizeof( char ); // 总长度/单个元素的长度 <br />
int c2 = sizeof( a1 ) / sizeof( a1[0] ); // 总长度/第一个元素的长度 <br />
写到这里,提一问,下面的c3,c4值应该是多少呢 <br />
void foo3(char a3[3]) <br />
{ <br />
int c3 = sizeof( a3 ); // c3 == <br />
} <br />
void foo4(char a4[]) <br />
{ <br />
int c4 = sizeof( a4 ); // c4 == <br />
} <br />
<br />
也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不 再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我 们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为 4。 <br />
<br />
<br />
<br />
7. 结构体的sizeof <br />
这是初学者问得最多的一个问题,所以这里有必要多费点笔墨。让我们先看一个结构体 <br />
: <br />
struct S1 <br />
{ <br />
char c; <br />
int i; <br />
}; <br />
问sizeof(s1)等于多少聪明的你开始思考了,char占1个字节,int占4个字节,那么加起来就应该是5。是这样吗你在你机器上试过了吗也许你是对的,但很可能你是错 <br />
的!VC6中按默认设置得到的结果为8。 Why为什么受伤的总是我 请不要沮丧,我们来好好琢磨一下sizeof的定义——sizeof的结果等于对象或者类型所 占的内存字节数,好吧,那就让我们来看看S1的内存分配情况: <br />
S1 s1 = { a, 0xFFFFFFFF }; <br />
定义上面的变量后,加上断点,运行程序,观察s1所在的内存,你发现了什么 <br />
以我的VC6.0为例,s1的地址为0x0012FF78,其数据内容如下: <br />
0012FF78: 61 CC CC CC FF FF FF FF <br />
发现了什么怎么中间夹杂了3个字节的CC看看MSDN上的说明: <br />
When applied to a structure type or variable, sizeof returns the actual siz <br />
e, which may include padding bytes inserted for alignment. <br />
原来如此,这就是传说中的字节对齐啊!一个重要的话题出现了。 <br />
为什么需要字节对齐计算机组成原理教导我们这样有助于加快计算机的取数速度,否则就得多花指令周期了。为此,编译器默认会对结构体进行处理(实际上其它地方的数据变量也是如此),让宽度为2的基本数据类型(short等)都位于能被2整除的地址上,让宽度为4的基本数据类型(int等)都位于能被4整除的地址上,以此类推。这样,两个数中间就可能需要加入填充字节,所以整个结构体的sizeof值就增长了。 <br />
让我们交换一下S1中char与int的位置: <br />
struct S2 <br />
{ <br />
int i; <br />
char c; <br />
}; <br />
看看sizeof(S2)的结果为多少,怎么还是8再看看内存,原来成员c后面仍然有3个填 <br />
充字节,这又是为什么啊别着急,下面总结规律。 <br />
<br />
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则: <br />
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; <br />
2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding); <br />
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。 <br />
<br />
对于上面的准则,有几点需要说明: <br />
1) 前面不是说结构体成员的地址是其大小的整数倍,怎么又说到偏移量了呢因为有了第1点存在,所以我们就可以只考虑成员的偏移量,这样思考起来简单。想想为什么。 <br />
<br />
结构体某个成员相对于结构体首地址的偏移量可以通过宏offsetof()来获得,这个宏也 <br />
在stddef.h中定义,如下: <br />
#define offsetof(s,m) (size_t)&(((s *)0)->m) <br />
例如,想要获得S2中c的偏移量,方法为 <br />
size_t pos = offsetof(S2, c);// pos等于4 <br />
2) 基本类型是指前面提到的像char、short、int、float、double这样的内置数据类型,这里所说的“数据宽度”就是指其sizeof的大小。由于结构体的成员可以是复合类型 <br />
,比如另外一个结构体,所以在寻找最宽基本类型成员时,应当包括复合类型成员的子成员,而不是把复合成员看成是一个整体。但在确定复合类型成员的偏移位置时则是将 复合类型作为整体看待。 这里叙述起来有点拗口,思考起来也有点挠头,还是让我们看看例子吧(具体数值仍以 <br />
VC6为例,以后不再说明): <br />
struct S3 <br />
{ <br />
char c1; <br />
S1 s; <br />
char c2 <br />
}; <br />
S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整 除,整个sizeof(S3)的值也应该被4整除。 c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补 上3个填充字节。最后得到sizeof(S3)的值为16。 <br />
通过上面的叙述,我们可以得到一个公式: <br />
结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即: <br />
<br />
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) + sizeof( tr <br />
ailing padding ) <br />
<br />
到这里,朋友们应该对结构体的sizeof有了一个全新的认识,但不要高兴得太早,有 一个影响sizeof的重要参量还未被提及,那便是编译器的pack指令。它是用来调整结构 体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以 直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐 数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么 该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值, 公式如下: <br />
offsetof( item ) = min( n, sizeof( item ) ) <br />
再看示例: <br />
#pragma pack(push) // 将当前pack设置压栈保存 <br />
#pragma pack(2)// 必须在结构体定义之前使用 <br />
struct S1 <br />
{ <br />
char c; <br />
int i; <br />
}; <br />
struct S3 <br />
{ <br />
char c1; <br />
S1 s; <br />
char c2 <br />
}; <br />
#pragma pack(pop) // 恢复先前的pack设置 <br />
计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i) 等于6,能够被2整除,所以整个S1的大小为6。 <br />
同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等于9,不能被2整除,添加一个填充字节,所以sizeof(S3)等于10。 <br />
现在,朋友们可以轻松的出一口气了,:) <br />
还有一点要注意,“空结构体”(不含数据成员)的大小不为0,而是1。试想一个“不占空间”的变量如何被取地址、两个不同的“空结构体”变量又如何得以区分呢于是 <br />
,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个字节的空间用于占位了。如下: <br />
struct S5 { }; <br />
sizeof( S5 ); // 结果为1 <br />
<br />
8. 含位域结构体的sizeof <br />
前面已经说过,位域成员不能单独被取sizeof值,我们这里要讨论的是含有位域的结构体的sizeof,只是考虑到其特殊性而将其专门列了出来。 <br />
C99规定int、unsigned int和bool可以作为位域类型,但编译器几乎都对此作了扩展, 允许其它类型类型的存在。 <br />
使用位域的主要目的是压缩存储,其大致规则为: <br />
1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字 段将紧邻前一个字段存储,直到不能容纳为止; <br />
2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍; <br />
3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,VC6采取不压缩方 式,Dev-C++采取压缩方式; <br />
4) 如果位域字段之间穿插着非位域字段,则不进行压缩; <br />
5) 整个结构体的总大小为最宽基本类型成员大小的整数倍。 <br />
<br />
还是让我们来看看例子。 <br />
示例1: <br />
struct BF1 <br />
{ <br />
char f1 : 3; <br />
char f2 : 4; <br />
char f3 : 5; <br />
}; <br />
其内存布局为: <br />
|_f1__|__f2__|_|____f3___|____| <br />
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_| <br />
0 3 7 8 1316 <br />
位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只 <br />
能从下一个字节开始。因此sizeof(BF1)的结果为2。 <br />
示例2: <br />
struct BF2 <br />
{ <br />
char f1 : 3; <br />
short f2 : 4; <br />
char f3 : 5; <br />
}; <br />
由于相邻位域类型不同,在VC6中其sizeof为6,在Dev-C++中为2。 <br />
示例3: <br />
struct BF3 <br />
{ <br />
char f1 : 3; <br />
char f2; <br />
char f3 : 5; <br />
}; <br />
<br />
非位域字段穿插在其中,不会产生压缩,在VC6和Dev-C++中得到的大小均为3。 <br />
<br />
<br />
<br />
9. 联合体的sizeof <br />
结构体在内存组织上是顺序式的,联合体则是重叠式,各成员共享一段内存,所以整个 <br />
联合体的sizeof也就是每个成员sizeof的最大值。结构体的成员也可以是复合类型,这 <br />
里,复合类型成员是被作为整体考虑的。 <br />
所以,下面例子中,U的sizeof值等于sizeof(s)。 <br />
union U <br />
{ <br />
int i; <br />
char c; <br />
S1 s; <br />
<br />
};<br />
<br />
<br />
<br />
1,基本数据类型的sizeof<br />
<br />
cout<<sizeof(char)<<endl; 结果是1<br />
cout<<sizeof(int)<<endl; 结果是4<br />
cout<<sizeof(unsigned int)<<endl; 结果是4 <br />
cout<<sizeof(long int)<<endl; 结果是4<br />
cout<<sizeof(short int)<<endl; 结果是2<br />
cout<<sizeof(float)<<endl; 结果是4<br />
cout<<sizeof(double)<<endl; 结果是8<br />
<br />
2,指针变量的sizeof<br />
char *pc =abc;<br />
<br />
sizeof( pc ); // 结果为4<br />
<br />
sizeof(*pc); // 结果为1<br />
<br />
int *pi;<br />
<br />
sizeof( pi ); //结果为4<br />
<br />
sizeof(*pi); //结果为4<br />
<br />
char **ppc = &pc;<br />
<br />
sizeof( ppc ); // 结果为4 <br />
<br />
sizeof( *ppc ); // 结果为4 <br />
<br />
sizeof( **ppc ); // 结果为1<br />
<br />
void (*pf)();// 函数指针<br />
<br />
sizeof( pf );// 结果为4<br />
<br />
<br />
3,数组的sizeof<br />
数组的sizeof值等于数组所占用的内存字节数,如:<br />
char a1[] = abc;<br />
int a2[3];<br />
sizeof( a1 ); // 结果为4,字符 末尾还存在一个NULL终止符<br />
sizeof( a2 ); // 结果为3*4=12(依赖于int)<br />
<br />
写到这里,提一问,下面的c3,c4值应该是多少呢<br />
void foo3(char a3[3])<br />
{<br />
int c3 = sizeof( a3 ); // c3 == 4<br />
}<br />
void foo4(char a4[])<br />
{<br />
int c4 = sizeof( a4 ); // c4 == 4<br />
}<br />
也许当你试图回答c4的值时已经意识到c3答错了,是的,c3!=3。这里函数参数a3已不再是数组类型,而是蜕变成指针,相当于char* a3,为什么仔细想想就不难明白,我们调用函数foo1时,程序会在栈上分配一个大小为3的数组吗不会!数组是“传址”的,调用者只需将实参的地址传递过去,所以a3自然为指针类型(char*),c3的值也就为4。<br />
<br />
4,结构体的sizeof<br />
<br />
struct MyStruct<br />
{<br />
double dda1;<br />
char dda;<br />
int type<br />
};<br />
//结果为16,为上面的结构分配空间的时候,VC根据成员变量出现的顺序和对齐方式,先为第一个成员dda1分配空间,其起始地址跟结构的起始地址相同(刚好偏移量0刚好为sizeof(double)的倍数),该成员变量占用sizeof(double)=8个字节;接下来为第二个成员dda分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为8,是sizeof(char)的倍数,所以把dda存放在偏移量为8的地方满足对齐方式,该成员变量占用sizeof(char)=1个字节;接下来为第三个成员type分配空间,这时下一个可以分配的地址对于结构的起始地址的偏移量为9,不是sizeof(int)=4的倍数,为了满足对齐方式对偏移量的约束问题,VC自动填充3个字节(这三个字节没有放什么东西),这时下一个可以分配的地址对于结构的起始地址的偏移量为12,刚好是sizeof(int)=4的倍数,所以把type存放在偏移量为12的地方,该成员变量占用sizeof(int)=4个字节;这时整个结构的成员变量已经都分配了空间,总的占用的空间大小为:8+1+3+4=16,刚好为结构的字节边界数(即结构中占用最大空间的类型所占用的字节数sizeof(double)=8)的倍数,所以没有空缺的字节需要填充。所以整个结构的大小为:sizeof(MyStruct)=8+1+3+4=16,其中有3个字节是VC自动填充的,没有放任何有意义的东西。<br />
<br />
<br />
5,含位域结构体的sizeof<br />
<br />
示例1:<br />
struct BF1<br />
{<br />
char f1 : 3;<br />
char f2 : 4;<br />
char f3 : 5;<br />
};<br />
其内存布局为:<br />
|_f1__|__f2__|_|____f3___|____|<br />
|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|_|<br />
0 3 7 8 1316<br />
位域类型为char,第1个字节仅能容纳下f1和f2,所以f2被压缩到第1个字节中,而f3只能从下一个字节开始。因此sizeof(BF1)的结果为2。<br />
<br />
6,含有联合体的结构体的sizeof<br />
struct s1<br />
{<br />
char *ptr,ch; //有指针变成4+4<br />
union A //后面跟了A定义了一个类型,不占内存,而后面不跟A,是声明了结构体的一个成员,占内存,<br />
{<br />
short a,b;<br />
unsigned int c:2, d:1;<br />
};<br />
struct s1* next; //指针占4<br />
};//这样是8+4=12个字节<br />
<br />
struct s1<br />
{<br />
char *ptr,ch; <br />
union //联合体是结构体的成员,占内存,并且最大类型是unsigned int,占4<br />
{<br />
short a,b;<br />
unsigned int c:2, d:1;<br />
};<br />
struct s1* next; <br />
};//这样是8+4+4=16个字节<br />
<br />
7,结构体体含有结构体的sizeof<br />
<br />
struct S1<br />
{<br />
char c;<br />
int i;<br />
};<br />
struct S3<br />
{<br />
char c1;<br />
S1 s;<br />
char c2;<br />
};<br />
cout<<sizeof(S3); //S3=16<br />
<br />
S1的最宽简单成员的类型为int,S3在考虑最宽简单类型成员时是将S1“打散”看的,<br />
所以S3的最宽简单类型为int,这样,通过S3定义的变量,其存储空间首地址需要被4整<br />
除,整个sizeof(S3)的值也应该被4整除。<br />
c1的偏移量为0,s的偏移量呢这时s是一个整体,它作为结构体变量也满足前面三个<br />
准则,所以其大小为8,偏移量为4,c1与s之间便需要3个填充字节,而c2与s之间就不需<br />
要了,所以c2的偏移量为12,算上c2的大小为13,13是不能被4整除的,这样末尾还得补<br />
上3个填充字节。最后得到sizeof(S3)的值为16。<br />
<br />
8,带有#pragma pack的sizeof<br />
<br />
它是用来调整结构体对齐方式的,不同编译器名称和用法略有不同,VC6中通过#pragma pack实现,也可以直接修改/Zp编译开关。#pragma pack的基本用法为:#pragma pack( n ),n为字节对齐<br />
数,其取值为1、2、4、8、16,默认是8,如果这个值比结构体成员的sizeof值小,那么该成员的偏移量应该以此值为准,即是说,结构体成员的偏移量应该取二者的最小值,<br />
<br />
再看示例:<br />
#pragma pack(push) // 将当前pack设置压栈保存<br />
#pragma pack(2)// 必须在结构体定义之前使用<br />
struct S1<br />
{<br />
char c;<br />
int i;<br />
};<br />
struct S3<br />
{<br />
char c1;<br />
S1 s;<br />
char c2<br />
};<br />
#pragma pack(pop) // 恢复先前的pack设置<br />
计算sizeof(S1)时,min(2, sizeof(i))的值为2,所以i的偏移量为2,加上sizeof(i)<br />
等于6,能够被2整除,所以整个S1的大小为6。<br />
同样,对于sizeof(S3),s的偏移量为2,c2的偏移量为8,加上sizeof(c2)等于9,不能<br />
被2整除,添加一个填充字节,所以sizeof(S3)等于10。<br />
<br />
9,空结构体的sizeof<br />
<br />
struct S5 { };<br />
sizeof( S5 ); // 结果为1<br />
<br />
<br />
10,类的sizeof<br />
<br />
类的sizeof值等于类中成员变量所占用的内存字节数。如:<br />
<br />
****************************************************************<br />
<br />
class A<br />
{<br />
public:<br />
int b;<br />
float c;<br />
char d;<br />
};<br />
<br />
int main(void)<br />
{<br />
A object;<br />
cout << sizeof(object) is << sizeof(object) << endl;<br />
return 0 ;<br />
}<br />
<br />
************************************************************<br />
<br />
<br />
输出结果为12(我的机器上sizeof(float)值为4,字节对其前面已经讲过)。<br />
<br />
不过需要注意的是,如果类中存在静态成员变量,结果又会是什么样子呢?<br />
<br />
************************************************************<br />
<br />
class A<br />
{<br />
public:<br />
static int a;<br />
int b;<br />
float c;<br />
char d;<br />
};<br />
<br />
int main()<br />
{<br />
A object;<br />
cout << sizeof(object) is << sizeof(object) << endl;<br />
return 0 ;<br />
}<br />
<br />
************************************************************<br />
<br />
<br />
16?不对。结果仍然是12.<br />
<br />
因为在程序编译期间,就已经为static变量在静态存储区域分配了内存空间,并且这块内存在程序的整个运行期间都存在。<br />
<br />
而每次声明了类A的一个对象的时候,为该对象在堆上,根据对象的大小分配内存。<br />
<br />
如果类A中包含成员函数,那么又会是怎样的情况呢?看下面的例子<br />
<br />
************************************************************<br />
<br />
class A<br />
{<br />
public:<br />
static int a;<br />
int b;<br />
float c;<br />
char d;<br />
int add(int x,int y)<br />
{<br />
return x+y;<br />
}<br />
};<br />
<br />
int main()<br />
{<br />
A object;<br />
cout << sizeof(object) is << sizeof(object) << endl;<br />
b = object.add(3,4);<br />
cout << sizeof(object) is << sizeof(object) << endl;<br />
return 0 ;<br />
}<br />
<br />
************************************************************<br />
<br />
结果仍为12。<br />
<br />
因为只有非静态类成员变量在新生成一个object的时候才需要自己的副本。<br />
所以每个非静态成员变量在生成新object需要内存,而function是不需要的。<br />
<br />
<br />
<br />
<br />
<br />
2、 sizeof用法总结<br />
<br />
在C中,sizeof有着许多的用法,而且很容易引起一些错误。下面根据sizeof后面的参数对sizeof的用法做个总结。<br />
<br />
A. 参数为数据类型或者为一般变量。例如sizeof(int),sizeof(long)等等。这种情况要注意的是不同系统系统或者不同编译器得到的结果可能是不同的。例如int类型在16位系统中占2个字节,在32位系统中占4个字节。<br />
<br />
B. 参数为数组或指针。下面举例说明.<br />
<br />
int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小<br />
<br />
int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针<br />
<br />
//的大小,在32位系统中,当然是占4个字节。<br />
<br />
C. 参数为结构或类。Sizeof应用在类和结构的处理情况是相同的。但有两点需要注意,第一、结构或者类中的静态成员不对结构或者类的大小产生影响,因为静态变量的存储位置与结构或者类的实例地址无关。第二、没有成员变量的结构或类的大小为1,因为必须保证结构或类的每一个实例在内存中都有唯一的地址。<br />
<br />
下面举例说明,<br />
<br />
Class Test{int a;static double c};//sizeof(Test)=4.<br />
<br />
Test *s;//sizeof(s)=4,s为一个指针。<br />
<br />
Class test1{ };//sizeof(test1)=1;<br />
<br />
D. 参数为其他。下面举例说明。<br />
<br />
int func(char s[5]);<br />
<br />
{<br />
<br />
cout<<sizeof(s);//这里将输出4,本来s为一个数组,但由于做为函<br />
<br />
//数的参数在传递的时候系统处理为一个指针,所<br />
<br />
//以sizeof(s)实际上为求指针的大小。<br />
<br />
return 1;<br />
<br />
}<br />
<br />
sizeof(func(“1234”))=4//因为func的返回类型为int,所以相当于<br />
<br />
//求sizeof(int).<br />
<br />
<br />
以上为sizeof的基本用法,在实际的使用中要注意分析gcc的分配变量的分配策略,这样的话可以避免一些错误。<br />
<br />
<br />
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。<br />
<br />
例如,下面的结构各成员空间分配情况:<br />
struct test <br />
{<br />
char x1;<br />
short x2;<br />
float x3;<br />
char x4;<br />
};<br />
结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。<br />
<br />
更改C编译器的缺省字节对齐方式<br />
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:<br />
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。<br />
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。<br />
<br />
另外,还有如下的一种方式:<br />
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。<br />
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。<br />
<br />
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。<br />
<br />
应用实例<br />
<br />
在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。其协议结构定义如下:<br />
<br />
#pragma pack(1) // 按照1字节方式进行对齐<br />
struct TCPHEADER <br />
{<br />
short SrcPort; // 16位源端口号<br />
short DstPort; // 16位目的端口号<br />
int SerialNo; // 32位序列号<br />
int AckNo; // 32位确认号<br />
unsigned char HaderLen : 4; // 4位首部长度<br />
unsigned char Reserved1 : 4; // 保留6位中的4位<br />
unsigned char Reserved2 : 2; // 保留6位中的2位<br />
unsigned char URG : 1;<br />
unsigned char ACK : 1;<br />
unsigned char PSH : 1;<br />
unsigned char RST : 1;<br />
unsigned char SYN : 1;<br />
unsigned char FIN : 1;<br />
short WindowSize; // 16位窗口大小<br />
short TcpChkSum; // 16位TCP检验和<br />
short UrgentPointer; // 16位紧急指针<br />
}; <br />
#pragma pack() // 取消1字节对齐方式<br />
<br />
Intel和微软和本公司同时出现的面试题<br />
<br />
#pragma pack(8)<br />
<br />
struct s1{<br />
short a;<br />
long b;<br />
};<br />
<br />
struct s2{<br />
char c;<br />
s1 d;<br />
long long e;<br />
};<br />
<br />
#pragma pack()<br />
<br />
问 <br />
1.sizeof(s2) = ?<br />
2.s2的s1中的c后面空了几个字节接着是d?<br />
<br />
正确答案:<br />
如果代码:<br />
#pragma pack(8)<br />
struct S1{<br />
char a;<br />
long b;<br />
};<br />
struct S2 {<br />
char c;<br />
struct S1 d;<br />
long long e;<br />
};<br />
#pragma pack()<br />
sizeof(S2)结果为24.<br />
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.<br />
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.<br />
<br />
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;<br />
<br />
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.<br />
<br />
a b<br />
S1的内存布局:11**,1111,<br />
c S1.a S1.b d<br />
S2的内存布局:1***, 11**, 1111, ****11111111<br />
<br />
这里有三点很重要:<br />
1.每个成员分别按自己的方式对齐,并能最小化长度<br />
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度<br />
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐<br />
<br />
<br />
补充一下,对于数组,比如:<br />
char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.<br />
如果写: typedef char Array3[3];<br />
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.<br />
不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个.<br />
<br />
结构对齐是基础知识,这种问题只有一个目的,就是看你对语言细节的了解程度.<br />
在网络通讯,多个模块交互的应用中这种东西是很常见.这一类的东西还有像__stdcall,__cdecl,volatile,mutable这些东西.平常学习中很难遇到,但实际工作中却会用.__stdcall, __cdecl参数传入的顺序从右到左,不同是前者修改的函数的参数stack从被调用者清除,而后者由调用者清除。所以后者编译出来的二进制代码比较前者大。volatile 定义的变量防止被编译器优化掉。<br />
<br />
<br />
mutable定义的变量一般都非静态或者非常量类成员。它允许常量类成员对其赋值。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-16651622292008131542010-03-23T13:52:00.001+08:002010-03-25T20:33:07.648+08:00Official Google Blog: 关于谷歌中国的最新声明关于谷歌中国的最新声明<br />
<br />
<br />
今年1月12日,我们在本博客上宣布,Google及另外二十余家美国公司受到了来自中国的、复杂的网络攻击,在对这些攻击进 行深入调查的过程中,通过我们所收集到的证据表明,几十个与中国有关的人权人士的Gmail帐号定期受到第三方的侵入,而这大部分侵入是通过安装在他们电脑上的钓鱼软件或恶意软件进行的。这些攻击以及它们所暴露的网络审查问题,加上去年以来中国进一步限制网络言论自由,包括 对FaceBook、Twitter、YouTube、Google Docs 和 Blogger 等网站的持续屏蔽,使我们做出结论:我们不能继续在Google.cn搜索结果上进行自我审查。<br />
<br />
从今天早上开始,我们已停止了在Google.cn搜索服务上的自我审查,包括 Google Search (网页搜索)、Google News(资讯搜索)和Google Images (图片搜索)。 访问 Google.cn 的用 户从现在开始将被指向Google.com.hk,在这个域名上,我们将提供未经审查的简体中文搜索结果,这些为中国大陆用户设计的服务将通过我们在香港的服务器实现。香港地区的用户还将继续通过Google.com.hk获得跟现在一样的、未经审查的繁体中文搜索服务。在我们进行迁移的过程中,由于香港服务器负荷的增加以及这些变化的复杂程度,用户可能会发现搜索速度变慢,或发现某些产品暂时不能访问。<br />
<br />
实施我们做出的在Google.cn上停止审查搜索结果的承诺是一个十分艰难的过程。我们希望全球尽可能多的用户都能访问到我们的服务,包括在中国大陆的用户。中国政府在与我们讨论的过程中已经十分明确地表示,自我审查是一个不可谈判的法律要求。为此,我们相信,一个解决我们所面临挑战的可行方案是在Google.com.hk上提供未经审查的简体中文搜索结果——它完全符合法律要求,同时也有助于提高中国大陆用户对信息的访问。我们十分希望中国政府尊重我们的这一决定,尽管我们知道,用户对Google服务的访问有可能随时被阻止。为此,我们将密切监测网址访问问题,并制作了一个新页面,用户可以实时地了解到在中国哪些Google服务是可用的。<br />
<br />
至于Google的广泛的业务运营,我们计划继续在中国的研发工作,并将保留销售团队,然而销售团队的规模显然部分取决于中国大陆用户能否访问Google.com.hk 。最后,我们要清楚表明:所有这些决定都是由美国的管理团队做出和实施的,没有任何一位中国员工能够、或者应该为这些决定负责。自我们在1月份发布博客以 来,尽管面临着众多的不确定性和困难,他们仍然坚守在工作岗位,专注于服务我们的中国用户和客户。我们为拥有这样的员工感到深深的骄傲。<br />
<br />
<br />
转载自<a href="http://googleblog.blogspot.com/2010/03/new-approach-to-china-update.html">Official Google Blog: A new approach to China: an update</a><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-25680729240718778732010-03-20T17:29:00.002+08:002010-03-29T20:30:52.451+08:00windows7 桌面快捷图标显示不正常 解决办法windows7 桌面快捷方式图标显示不正常,可按下面的方法恢复:<br />
<br />
<br />
先打开IE浏览器;<br />
<br />
打开任务管理器,结束正在运行的Explorer.exe进程;<br />
<br />
在任务管理器中打开“新任务”,运行CMD,执行以下命令:<br />
CD /d %userprofile%\AppData\Local(回车)<br />
DEL IconCache.db /a(回车)<br />
EXIT(回车)<br />
<br />
然后在IE浏览器地址中输入C:\Windows\Explorer.exe(回车),重新运行Explorer.exe。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-50376014062620639332010-02-27T16:57:00.001+08:002010-03-29T20:59:06.745+08:00制作USB系统启动盘USB启动盘还是比较常用的,因为在平时,重装系统是避免不了的,如果没有启动启动光盘的话,制作USB启动盘不失为一种非常可行的方法,记得在我上一次重装系统时,就遇到过这种情况。自己因为下载了一个莫名其妙的压缩包,解压出来后运行-->安装,在我的桌面上多了一个快捷方式图标,右键该图标,右键选项中只有“属性”和“创建快捷方式”两个选项,根本删除不了,而且把我的IE首页给篡改了,修改注册表里的信息都没用,一怒之下,重装系统。我的个性比较急的,直接到楼下购买了光盘,回来后,刻盘-->重装。但不想,光盘被刻坏了,无奈只得另找方法。在光盘被我刻坏之后,就尝试着制作USB启动盘的方式来重装系统。 <br />
<br />
制作USB启动盘,首先你要进入到你的计算机的BIOS界面,查看“BOOT”选项卡中的开机启动项提供几种方式重装系统。以我的笔记本为例,里面提供的USB启动项,分别提供了“USB HDD”、“USB FDD”、“USB KEY”、“USB ODD”这么几种第一启动项。下面简单介绍一下这几种启动方式。“USB HDD”是把USB接口模拟成为硬盘的形式,来作为第一启动项的,“USB FDD”则是把USB接口模拟成为软驱的形式,“USB KEY”是把USB接口模拟成USB KEY数字证书的形式来作为第一启动项的。清楚了这些第一启动项的形式,那就得了解模拟出这些第一启动项的方法,这一类的软件有很多,我就以我的为例来说明,我用的是UltraISO,版本是UltraISO Premium 9.35。第一步打开UltraISO,呈现的系统界面:<br />
<br />
<br />
<br />
在界面的左下方可以看到“本地目录”,接下来要做的就是打开系统镜像所在的目录,找到系统镜像文件后,双击将其打开,如下图:<br />
<br />
<br />
在界面上找到“启动”菜单,并在他的下拉菜单中找到“写入硬盘映像”选项,选择此项,出现如下界面:<br />
<br />
<br />
我们可以看到在“映像文件”的右边已经显示出了我们刚刚选择的系统镜像的路径了,首先选择“格式化”按钮,将U盘格式化,格式化之后,注意了,打开“写入方式”的下拉菜单,<br />
这时,我们可以看到一共有四种形式,这得根据你的计算机中Bios的第一启动项选择的,以你的计算机中的第一启动项为基准,启动项里有哪些启动项就可以选择哪种启动方式,一般都可以选择“USB-HDD”硬盘形式写入,因为硬盘形式比较大众化,如果你的计算机的BIOS里没有“USB-HDD”选项,就选择另外在你的计算机的Bios选项中存在的选项。这些完成后,就可以选择“写入”按钮,对U盘进行写入操作了,等待写入完成后,进到计算机的Bios设置第一启动项,在“Boot”选项卡里选择你刚刚在”写入方式“中选择的那一项就行了。按”F10“保存,就进入了重装系统的界面了。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6623340819646000600.post-2043386000680424782010-02-19T16:03:00.000+08:002010-03-29T20:04:11.610+08:00升级ubuntu 9.10内核后无法进入系统的解决方法(Wubi安装)今天早上开始摆弄起自己用wubi安装的linux ubuntu 9.10系统,在查找更新中看到内核升级到2.31-17了,我就选择更新,但在更新过程终有一个任务一直没有完成更新,我就直接按“Ctrl+C”给取消了,当我在重启系统时就遇到GRUB黑屏问题了。<br />
<br />
<br />
屏幕上显示:<br />
<br />
GNU GRUB version 1.97~bea4<br />
<br />
[minimal BASH-like lin editing is supported For the first word,TAB licts possible command completions Anywhere elso TAB lists possible device/file completions]<br />
<br />
sh:grub> (光标,让你输入东西)<br />
<br />
按下TAB后<br />
<br />
Possible commands are:<br />
<br />
[badram boot cat chainloader configfile cupid dump echo exit export halt help initrd insmod linux list_env load _env loopback Is Ismod parser.rescue parser.sh reader.normal reader.resue reboot rmmod root save_env search ser sleep source terminal_input.console terminal_output.console test unset]<br />
<br />
sh:grub> (光标,让你输入东西)<br />
<br />
<br />
<a name='more'></a><br />
经过我在网上不懈的搜索查找,以下为解决办法:<br />
<br />
<br />
<br />
<br />
<br />
代码:<br />
<br />
grub>ls<br />
<br />
grub>ls (hd0,x)/ #找出WUBI安装的盘,里面有ubuntu/这个目录。<br />
<br />
grub>insmod ntfs #加载ntfs模块,因为WUBI将ubuntu安装到了我分的ntfs盘上<br />
<br />
grub>set root=(hd0,5) #这里(hd0,5)就是我找到的ubuntu安装的分区<br />
<br />
grub>ls $Boot #找到我们BOOT分区的UUID,下一步要用到,我这里显示出来的是2250018e50016a3d<br />
<br />
grub>search --no-floppy --fs-uuid --set 2250018e50016a3d #这里的UUID就是上一定找出来的那个<br />
<br />
grub>loopback loop0 /ubuntu/disks/root.disk #设loop0,WUBI装ubuntu安装成了一个root.disk文件<br />
<br />
grub>set root=(loop0) #重设root<br />
<br />
grub>linux /boot/vmlinuzxxxxxxxxx (tab补全即可) root=/dev/sda5 loop=/ubuntu/disks/root.disk ro quiet splash #加载内核<br />
<br />
grub>initrd /boot/initrd.imgxxxxxxxxxxxx(tab 补全即可) #不用说大家都知道<br />
<br />
gurb>boot<br />
<br />
<br />
<br />
<br />
<br />
ENTER就可以启动了。进入熟悉的系统,打开终端<br />
<br />
代码:<br />
<br />
#update-grub2<br />
<br />
#reboot<br />
<br />
<br />
<br />
<br />
<br />
这样grub就修复好了。不用再这样麻烦地整了。(在修复你自己grub的时候随机应变即可)<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-6623340819646000600.post-71118898392216061502010-02-15T14:25:00.002+08:002010-03-29T20:08:09.464+08:00酒酿煮蛋的做法--增肥秘方康熙来了第091228期。潘迎紫说 饰演武则天年老的时候为了增肥试用了各种方法都不行,最后别人介绍临睡前吃酒酿+冰糖+鸡蛋就很快胖起来了。<br />
<br />
<br />
<br />
<br />
下面整理收藏其做法。<br />
<br />
////////////////////////////////<br />
<br />
酒酿也有的地方叫甜酒.<br />
<br />
我们那的叫这道甜品叫甜酒鸡蛋.<br />
<br />
做法:1、先把甜酒参水加糖烧开,(糖根据个人口味来放)<br />
<br />
2、烧沸以后直接把鸡蛋敲开倒入锅中<br />
<br />
3、喜欢吃嫩一点的话就煮3分钟,喜欢吃老一点的话可以多煮一下,<br />
<br />
个人建议:最好不要放太多的酒酿,多放点水。<br />
<br />
<br />
<br />
//////////////////////////////<br />
<br />
<br />
<br />
酒酿煮蛋的正确做法<br />
<br />
<br />
<br />
一、酒酿炖蛋 A(鹌鹑蛋)<br />
<br />
<br />
<br />
枸杞+酒酿+鹌鹑蛋丰胸<br />
<br />
原料:枸杞子、酒酿、鹌鹑蛋、冰糖、淀粉<br />
<a name='more'></a><br />
做法:<br />
<br />
1、 鹌鹑蛋煮熟、去皮,枸杞子用温水泡胀,待用。<br />
<br />
2、 将酒酿放入砂锅,加适量冰糖,下入枸杞子、鹌鹑蛋一起煮开,勾芡后即成。<br />
<br />
功效:酒酿鸡蛋是非常传统的丰胸食品,其中发酵产生的酶类、活性物质和B族维生素有利于乳腺发育。鹌鹑蛋当中含有丰富的蛋白质、B族维生素和维生素A、E 等。枸杞子则是滋补肝肾的佳品,也是美容药膳中常用的原料,维生素A含量特别丰富。除去美胸效果,这些食物还能促进营养吸收,让女性的脸色更加滋润动人。鹌鹑蛋的滋补作用强于鸡蛋,但若有特殊情况,也可以使用鸡蛋。蛋黄比蛋白效用更好,其中的胆固醇对乳房发育有利。因此决不可弃去蛋黄部分。<br />
<br />
二、酒酿炖蛋 B(鸡蛋)<br />
<br />
<br />
<br />
材料:酒酿3大匙、鸡蛋蛋1个、清水适量、红糖适 量、生姜末1茶匙。<br />
<br />
<br />
<br />
做法<br />
<br />
<br />
<br />
1、在滚水中加入红糖、生姜,然后打进鸡蛋,跟着即可熄火。<br />
<br />
<br />
<br />
2、将蛋与汤盛入碗中,放入酒酿即可食用。<br />
<br />
<br />
<br />
贴士<br />
<br />
<br />
<br />
鸡蛋不要煮得太老,酒酿是不用煮的。<br />
<br />
<br />
<br />
功能<br />
<br />
<br />
<br />
月经来之前,早晚各一碗,滋阴养颜又丰胸,一举数得。<br />
<br />
<br />
<br />
三、酒酿炖蛋 C(花蛋)<br />
<br />
<br />
<br />
材料:鸽蛋12只、白糖175克、酒酿50克、玫瑰花5瓣、糖桂花适量、清水1000克、青梅半颗。<br />
<br />
<br />
<br />
做法<br />
<br />
<br />
<br />
1、炒锅置中火上,加水烧沸后端离火,取小碗1个,将鸽蛋磕在碗中,下入锅,其余按此法将鸽蛋逐个磕入下锅,然后将锅移中火上,稍带一会,用手勺轻轻推动,水沸后离火,氽至鸽蛋外层呈玉白色时,撇去浮沫。<br />
<br />
<br />
<br />
2、另取锅置水上加水、白糖烧沸,撇去泡沫。放入酒酿搅散,出锅盛入荷叶碗内,再捞入鸽蛋,撒上糖、桂花、青梅及玫瑰花瓣即可。<br />
<br />
<br />
<br />
特点<br />
<br />
<br />
<br />
汤清色雅、醇香扑鼻,鸽蛋甜嫩,营养丰富。<br />
<br />
<br />
<br />
<br />
<br />
///////////////////////////////////////<br />
<br />
酒酿有很好的丰胸效果,客家授乳的妇女,如果乳汁不通畅,吃个甜酒酿蛋,就有意想不到的效果。<br />
<br />
<br />
<br />
酒酿鸡蛋<br />
<br />
材料:酒酿3大匙、鸡蛋蛋1 个、清水适量、红糖适量、生姜末1茶匙。<br />
<br />
做法<br />
<br />
1、在滚水中加入红糖、生姜,然后打进鸡蛋,跟着即可熄火。<br />
<br />
2、将蛋与汤盛入碗中,放入酒酿即可食用。<br />
<br />
贴士<br />
<br />
鸡蛋不要煮得太老,酒酿是不用煮的。<br />
<br />
功能<br />
<br />
月经来之前,早晚各一碗,滋阴养颜又丰胸,一举数得。<br />
<br />
<br />
<br />
酒酿花蛋<br />
<br />
材料:鸽蛋12只、白糖175克、酒酿50克、玫瑰花5瓣、糖桂花适量、清水1000克、青梅半颗。<br />
<br />
做法<br />
<br />
1、炒锅置中火上,加水烧沸后端离火,取小碗1个,将鸽蛋磕在碗中,下入锅,其余按此法将鸽蛋逐个磕入下锅,然后将锅移中火上,稍带一会,用手勺轻轻推动,水沸后离火,氽至鸽蛋外层呈玉白色时,撇去浮沫。<br />
<br />
2、另取锅置水上加水、白糖烧沸,撇去泡沫。放入酒酿搅散,出锅盛入荷叶碗内,再捞入鸽蛋,撒上糖、桂花、青梅及玫瑰花瓣即可。<br />
<br />
特点<br />
<br />
汤清色雅、醇香扑鼻,鸽蛋甜嫩,营养丰富。<br />
<br />
<br />
<br />
选购酒酿<br />
<br />
● 超市有酒酿卖酒酿在超市买得到,用一小瓶玻璃罐装着的。<br />
<br />
●酒酿有新旧酒酿有新有旧,选购的时候,可以看玻璃罐中的米,米的中央有一个洞,洞大的比较老,洞小的是新发酵的。<br />
<br />
此外,老酒酿的米也比较膨涨,所以也使得米粒间的空隙比较紧。相反的,“年轻”酒酿的米看起来就不是发得很大,米粒间的空隙也比较松。选择时,最好用老一点的酒酿,因为老酒酿的味道较浓、较香。第一次吃酒酿的人可能会不习惯那种味道,可以先买新一点的酒酿试试。<br />
<br />
<br />
<br />
酒酿营养<br />
<br />
酒酿甘辛温,含糖、有机酸、维生素B1、B2等,可益气、生津、活血、散结、消肿。不仅利于孕妇利水消肿,也适合哺乳期妇女通利乳汁。<br />
<br />
//////////////////////////<br />
<br />
一只碗,注入开水,将鸡蛋磕入开水中,随后放到微波炉里加热一分钟。<br />
<br />
放入酒酿,冰糖,再放到微波炉里加热一分钟<br />
<br />
/////////////////////////<br />
<br />
锅中加2碗水,煮至沸腾,打入蛋,再加酒酿、冰糖煮沸即成<br />
<br />
////////////////////////<br />
<br />
酒酿(sweet ferment rice )是蒸熟的江米(糯米)拌上酒酵(一种特殊的微生物酵母)发酵而成的一种甜米酒在我国全国各地称呼不同又叫醪糟、酒娘、米酒、甜酒、甜米酒、糯米酒、江米酒、酒糟。<br />
<br />
////////////////////////////<br />
<br />
酒酿蛋也称醪糟鸡蛋<br />
<br />
做法:<br />
<br />
醪糟(酒酿、酒娘、米酒、甜酒、甜米酒、糯米酒、江米酒)3大匙、鸡蛋1个、清水适量、红糖适量、生姜末1茶匙。<br />
<br />
步骤 :1、在滚水中加入红糖、生姜,然后打进鸡蛋,跟着即可熄火。<br />
<br />
2、将蛋与汤盛入碗中,放入酒酿即可食用。<br />
<br />
<br />
<br />
注:////分割的是不同人的说法,来源不详。 <br />
<span style="color: #cccccc;">转载来自 HOUKAI.COM</span><div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com6tag:blogger.com,1999:blog-6623340819646000600.post-54487334173693100342010-01-19T20:54:00.002+08:002010-03-29T20:55:08.222+08:00C#面试题1, 请你说说.NET中类和结构的区别? <br />
<br />
<br />
答:结构和类具有大体的语法,但是结构受到的限制比类要多。结构不能申明有默认的构造函数,为结构的副本是又编译器创建和销毁的,所以不需要默 认的构造函数和析构函数。结构是值类型,所以对结构变量所做的改变不会影响其的原值,而类是应用类型,改变其变量的值会改变其原值。申明结构用 Struck关键字,申明类用class关键字,向方法传递结构是时是通过值传递的,而不是通过引用。与类不同,结构的实例化可以不使用New关键字。类 可以实现接口。<br />
<br />
<br />
<a name='more'></a><br />
2, 死锁的必要条件?怎么克服?<br />
<br />
<br />
<br />
答:系统的资源不足,进程的推进的顺序不合适,资源分配不当,一个资源每次只能被一个进程使用,一个资源请求资源时,而此时这个资源已阻塞,对已获得资源不放,进程获得资源时,未使用完前,不能强行剥夺。<br />
<br />
<br />
<br />
3, 接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承实体类?<br />
<br />
<br />
<br />
答:接口是可以继承接口的,抽象类是可以实现接口的,抽象类可以继承实体类,但是有个条件,条件是,实体类必须要有明确的构造函数。<br />
<br />
<br />
<br />
4, 构造器Constructor是否可以被继承?是否可以被Override?<br />
<br />
<br />
<br />
答:Constructor不可以被继承,因此不能被重写(Overriding),但可以被重载(Overloading).<br />
<br />
<br />
<br />
5, 当一个线程进入一个对象的方法后,其它线程是否可以进入该对象的方法?<br />
<br />
<br />
<br />
答:不可以,一个对象的方法只能由一个线程访问。<br />
<br />
<br />
<br />
6, 用最有效的方法算出等已8对于几?<br />
<br />
<br />
<br />
答:2<<3.<br />
<br />
<br />
<br />
7, C#是否可以对内存直接进行操作?<br />
<br />
<br />
<br />
答:这个问题比较难回答,也是个很大的问题。但是可以这样问答。C#是可以对内存进行直接操作的,虽然很少用到指针,但是C#是可以使用指针 的,在用的时候需要在前边加unsafe,,在.net中使用了垃圾回收机制(GC)功能,它替代了程序员,不过在C#中不可以直接使用finalize 方法,而是在析构函数中调用基类的finalize()方法。<br />
<br />
<br />
<br />
8, Error和Exception有是区别?<br />
<br />
<br />
<br />
答:error表示恢复不是不可能,但是很困难,exception表示一种实际或实现问题,它表示程序运行正常不可以发生的。<br />
<br />
<br />
<br />
9, 谈谈final,finally,finallize的区别?<br />
<br />
<br />
<br />
答:final用于申明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。<br />
<br />
<br />
<br />
Finally是异常处理语句结构中,表示总是执行的部分。<br />
<br />
<br />
<br />
Finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。<br />
<br />
<br />
<br />
10, HashMap和Hashtable区别?<br />
<br />
<br />
<br />
答:HashMap是Hashtable的轻量级实现,非线程安全的实现他们都实现了map接口,主要区别是HashMap键值可以为空null,效率可以高于Hashtable。<br />
<br />
<br />
<br />
11,Collection和Collections的区别?<br />
<br />
<br />
<br />
答:Collection是集合类的上级接口,Collections是针对集合类的一个帮助类,它提供一系列静态方法来实现对各种集合的搜索,排序,线程安全化操作。<br />
<br />
<br />
<br />
12,C#中委托是什么?事件是不是一种委托?<br />
<br />
<br />
<br />
答:委托是一种安全的类似与函数指针,但是她比指针要安全的多,它可以把方法作为一个参数传递给另一个方法,可以理解为指向函数的引用。事件是一种消息机制,它是一种委托,委托不带方法体。<br />
<br />
<br />
<br />
13,Override, Overload,的区别?<br />
<br />
<br />
<br />
答:Override是重写的意思,它表示重写基类的方法,而且方法的名称,返回类型,参数类型,参数个数要与基类相同。<br />
<br />
<br />
<br />
Overload是重载是意思,它也表示重写基类的方法,但是只要方法名相同,别的可以不同。<br />
<br />
具体请参考地址:/cnweb/0/106/article/<br />
<br />
14,在一个BS结构中需要传递变量值时,不能使用session,coolke,application,你有几中方法?<br />
<br />
<br />
<br />
答:this.server.Transfer,Querystring.<br />
<br />
<br />
<br />
15, C#种索引器实现过程,是否只能根据数字索引?<br />
<br />
<br />
<br />
答:不是的,可以是任意类型。<br />
<br />
<br />
<br />
16,New有种用法?<br />
<br />
<br />
<br />
答:有3种,第一种是,实例化如:New Class()<br />
<br />
<br />
<br />
第二种是,public new 隐藏基类的方法<br />
<br />
<br />
<br />
第三种是,在泛型类申明中的任何类型参数都必须有公共的无参构造函数。<br />
<br />
<br />
<br />
17,任何把一个Array复制到Arraylist中?<br />
<br />
<br />
<br />
答:Foreach (object o in Array), ArrayList.Add (0)<br />
<br />
<br />
<br />
等有好多中种方法。自己想。<br />
<br />
<br />
<br />
18,概述反射和序列化? <br />
<br />
<br />
<br />
答:反射:要给发射下一个定义还是比较难的,这里先说说我的理解。反射提供了封装程序集,模块和类型对象,可以用反射动态地创建类型的实例,将类型绑定到现有对象,或者从现有对象类型里获取类型,然后调用类型的方法或访问字段和属性。<br />
<br />
<br />
<br />
序列化:将对象转换为另一种媒介传输的格式过程。如,序列化一个对象,用Http通过internet在客户端和服务器之间传递该对象,在另一端用反序列化从该流中重新得到对象。<br />
<br />
<br />
<br />
19,Const和ReadOnly?<br />
<br />
<br />
<br />
答:Const用来申明编程时申明常量,ReadOnly用来申明运行时常量。<br />
<br />
<br />
<br />
20,UDP和TCP连接有和异同?<br />
<br />
<br />
<br />
答:TCP是传输控制协议,提供的是面向连接的,是可靠的,字节流服务,当用户和服务器彼此进行数据交互的时候,必须在他们数据交互前要进行 TCP连接之后才能传输数据。TCP提供超时重拨,检验数据功能。UDP是用户数据报协议,是一个简单的面向数据报的传输协议,是不可靠的连接。<br />
<br />
<br />
<br />
21,进程和线程分别该怎么理解?<br />
<br />
<br />
<br />
答:进程是比线程大的程序运行单元,都是由操作系统所体会的系统运行单元,一个程序中至少要有一个进程,有一个进程中,至少要有一个线程,线程 的划分尺度要比进程要小,进程拥有独立的内存单元,线程是共享内存,从而极大的提高了程序的运行效率同一个进程中的多个线程可以并发执行。<br />
<br />
<br />
<br />
22,ASP.NET页面之间传递值的几种方式?<br />
<br />
<br />
<br />
答:QueryString,session,cookies,application,server.Transfer,respose.redictor.<br />
<br />
<br />
<br />
23. 什么叫应用程序域?什么是托管代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释?<br />
<br />
<br />
<br />
答:应用程序域:就是为安全性,可靠性,隔离性,和版本控制,及卸载程序提供的隔离边界。它通常由运行库宿主创建,应用程序域提供了一个更安全,用途更广的处理单元。<br />
<br />
<br />
<br />
托管代码:使用CLR编译语言编辑器开发编写的代码就叫托管代码。<br />
<br />
<br />
<br />
装箱和拆箱:是把值类型转换为引用类型的过程,是隐式的,相反的过程就是拆箱,是显式的。<br />
<br />
<br />
<br />
CTS是公共类型系统,CLS是公共语言规范,CLR公共语言运行库。<br />
<br />
<br />
<br />
强类型系统:每个变量和对象都必须具有申明类型。<br />
<br />
<br />
<br />
24. 值类型和引用类型的区别?<br />
<br />
<br />
<br />
答:值类型的值是存放在堆栈中的,改变其值,不改变变量原有的值,而引用类型的值是存放在栈中的,其引用的地址是存放在堆栈中的,改变其值也就改变了变量原有的值。值类型不允许包含null值,然而可空类型可以将null赋值给值类型l。<br />
<br />
<br />
<br />
25. ASP.net的身份验证方式有哪些?<br />
<br />
<br />
<br />
答:windows,forms,passport<br />
<br />
<br />
<br />
26. 解释一下UDDI、WSDL的意义及其作用?<br />
<br />
<br />
<br />
答:UDDI是统一描述集成协议,是一套基于Web的,分布式的,为WEB服务提供的信息注册的实现标准规范,同时为也是为企业本身提供的 Web服务注册以让别的企业能够发现并访问的协议标准。提供了基于标准的规范,用于描述和发现服务,还提供了一组基于因特网的实现。<br />
<br />
<br />
<br />
WSDL这是一个基于XML的描述WEB服务的接口。<br />
<br />
<br />
<br />
27. 什么是SOAP?<br />
<br />
<br />
<br />
答:是简单访问协议。是在分布式环境中,交换信息并实现远程调用的协议。是一个基于XML的协议。使用SOAP,可以不考虑任何传输协议,但通常还是HTTP协议,可以允许任何类型的对象或代码,在任何平台上,以任一种语言相互通信。它是一种轻量级协议。<br />
<br />
<br />
<br />
28. 如何部署一个ASP.net页面?<br />
<br />
<br />
<br />
答:vs2003,vs2005里边都有发表机制,vs2003可以发布然后在复制部署。<br />
<br />
<br />
<br />
Vs2005可以直接部署到对应的位置。<br />
<br />
<br />
<br />
29. 如何理解.net中的垃圾回收机制?<br />
<br />
<br />
<br />
答:.NET中的垃圾回收机制是引用程序对内存的回收和释放。当每次用new关键字创建一个对象时,运行库都要从托管堆中为其分配内存,因为空间是有限的,最终垃圾回收机制是要回收不用的内存的。已释放内存,重新使用。<br />
<br />
<br />
<br />
30. 面向对象的三大基本原则?<br />
<br />
<br />
<br />
答:封装,继承,多态。<br />
<br />
<br />
<br />
31. 在.NET中所有类的基类是?<br />
<br />
<br />
<br />
答:object。<br />
<br />
<br />
<br />
32. 能用foreach遍历访问的对象需要实现?<br />
<br />
<br />
<br />
答:需要实现IEnumerable接口和GetEnumerator ()方法。<br />
<br />
<br />
<br />
33. Heap与stack的差别?<br />
<br />
<br />
<br />
答:Heap是堆,空间是由手动操作分配和释放的,它的存储区很大的自由存储区。<br />
<br />
<br />
<br />
Stack是栈,是由是操作系统自动分配和释放的,栈上的空间是有限的。程序在编译期间变量和函数分配内存都是在栈上进行的,且在运行时函数调用时的参数的传递也是在栈上进行的。<div class="blogger-post-footer">© 2011 Tangblog.Info</div>Unknownnoreply@blogger.com0