5934
原文:http://tieba.baidu.com/p/3150844258随着刀剑二的完结 有种莫名的感动。有一种坚持,叫黑白共舞。有一种守护,叫刀剑神域。有一种挚爱,叫心的温度。刀剑两年,有些东西已经根深蒂固无法改变。那些片段总是若有若无的闪现,提醒着不能复刻的感动。两年里,最悲壮的一次死亡,在第一层,迪亚布尔为了让大家能够攻略,独自一人牺牲从那以后再也没有这样一位骑士,无愧王者之名。两年里,最昂贵的一份礼物,在圣诞夜里,桐人收到幸的留言水晶,致使了桐人感到了十分后悔两年里,最伟大的一种友谊,在月夜黑猫团里,即使并不强大,但大家都为了同一个目标奋斗着两年里,最勇敢的同归于尽,雷根为了桐人能够攻略世界树寻找亚斯娜,而使用了自爆招数,即使胆小但也有以图大局。两年里,最痛惜的一次离别,桐人答应好药保护好幸,但最后当他发现只是陷阱时已经晚了,最后两人也就真正的告别了。两年里,最豁达的一次选择,桐人为了亚斯娜而接受了茅场晶彦的挑战,但为了能与亚斯娜在一起,他不得不这么做。两年里,最心酸的一次亲情,桐人由于知道了自己的身份后,对直叶一直很冷清,但最后发现自己的冷淡太过分后,决定好好对待妹妹两年里,最逼真的一场戏剧,黄金苹果的两位成员为了调查事情的真相,而利用一些招数。使其发生了圈内事件。两年里,最遗憾的一场爱情,铁匠师莉兹贝特喜欢上了桐人,但发现桐人真正爱的人是亚斯娜后。也只好无奈得祝福她们,两年里,最旷世的一份大爱无疆,桐人为了自己的爱人,而奋不顾身地保护好她,此所谓大爱无疆。一定要说为什么的话,大概这些,就是我爱刀剑的理由。那些活灵活现的人物们,红色头发的宅男,黑发的剑士少年,健壮的光头大叔,栗色头发的副队闪光,为了自己的梦想的游戏执照者,祝福自己所爱的粉色头发铁匠师,有只宠物陪伴的小萝莉。很多时候只要说出一两个相关的词,就能想到是谁,能在脑海里勾勒出是一个怎么样的人,有着怎么样感动人心的事迹。有一句话我很喜欢,是说,从现在开始我将为你而活,亚斯娜。我觉得那些说着刀剑变了的人真的很不负责任啊,怎么就变了?你在看着它的每一集都在变,它哪里变了?它不让你感动了?以前为了桐人的执着会感动,现在也会为了那些逝去的人而感动。难道你们看着的迪亚布尔离开都不会感动吗?曾经那么固执的一个骑士,不相信任何人,却在最后选择了相信桐人。在桐人高兴的以为每个人都可以活下来的时候你们哭了吗?茅场这个傻子,这世上怎么可能有这样方式?可是这样残忍的离别,它用深入骨髓的刻画给我们的是什么?是感动,还有更多的深思和缅怀。我一直觉得,有些事情是没办法去衡量和比较的。就算它衰败到只是两三个人守着,可世界上总有那么一些人,会为之疯狂。所谓的刀剑迷,大概就是这样的吧。真正的刀剑迷,应该是不会被任何事物所击败的。我做事情,从不半途而废!懂得刀剑神域的刀剑迷就该明白,既然坚持了一件自己所认可的事情,就一定要相信下去。我一直相信着,刀剑没有变。感动不离开,他们一直在。那些日日夜夜里对着自己说话微笑的人们,不会被丢弃。我相信总有一天所有人都会把过去甩进记忆的最角落,不经天雷地火再也不会复燃。但总有一天它会彻彻底底的燃烧我们,彻底复苏。那些是不能复刻的感动回忆,边刃暗藏锋利,全是一点一点的片段,却携着两年的岁月呼啸而来。如果还记得最初的感动,如果还能在第一时间叫出那些人的名字,如果时隔多年想起那些画面仍然眼眶泛红。记住,我们的名字,刀剑迷,永远的刀剑迷。川原,请让我真心的说一句,一直以来,谢谢你了
5899
原文转载自:https://www.zhihu.com/question/27971703 作者:pezy根据 Appending Binary Files Using the COPY Command 可粗略的认为,就是以二进制的方式合并两个文件到一个新文件中。举例说明:echo Hello > 1.txt
echo World > 2.txt
copy /b 1.txt+2.txt 3.txt
那么此刻 3.txt 中应该是Hello
World
如果仅仅实现上述例子中的基本功能,使用几个系统的 API 就可以搞定。代码如下:#include <windows.h>
#include <stdio.h>
void main()
{
HANDLE hFile;
HANDLE hAppend;
DWORD dwBytesRead, dwBytesWritten, dwPos;
BYTE buff[4096];
// Copy the existing file.
BOOL bCopy = CopyFile(TEXT("1.txt"), TEXT("3.txt"), TRUE);
if (!bCopy)
{
printf("Could not copy 1.txt to 3.txt.");
return;
}
// Open the existing file.
hFile = CreateFile(TEXT("2.txt"), // open 2.txt
GENERIC_READ, // open for reading
0, // do not share
NULL, // no security
OPEN_EXISTING, // existing file only
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hFile == INVALID_HANDLE_VALUE)
{
printf("Could not open 2.txt.");
return;
}
// Open the existing file, or if the file does not exist,
// create a new file.
hAppend = CreateFile(TEXT("3.txt"), // open 3.txt
FILE_APPEND_DATA, // open for writing
FILE_SHARE_READ, // allow multiple readers
NULL, // no security
OPEN_ALWAYS, // open or create
FILE_ATTRIBUTE_NORMAL, // normal file
NULL); // no attr. template
if (hAppend == INVALID_HANDLE_VALUE)
{
printf("Could not open 3.txt.");
return;
}
// Append the first file to the end of the second file.
// Lock the second file to prevent another process from
// accessing it while writing to it. Unlock the
// file when writing is complete.
while (ReadFile(hFile, buff, sizeof(buff), &dwBytesRead, NULL)
&& dwBytesRead > 0)
{
dwPos = SetFilePointer(hAppend, 0, NULL, FILE_END);
LockFile(hAppend, dwPos, 0, dwBytesRead, 0);
WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL);
UnlockFile(hAppend, dwPos, 0, dwBytesRead, 0);
}
// Close both files.
CloseHandle(hFile);
CloseHandle(hAppend);
}
将代码中的 1.txt, 2.txt, 3.txt 改为任何别的文件,是一样的。如题主补充的要求,做如下替换即可:1.txt -> a.jpg2.txt -> b.txt3.txt -> c.txt (文本),c.jpg(更改后缀,成为图片)诸如 jpg 之类的格式,依然是二进制文件,经过渲染,表现为图片而已。
6243
本篇内容,用编程思想自制空调,包括完整的软件开发阶段,同时针对此设计进行总结与优化。开发背景——停电了,不能编程,空调也不能用。这……不能编程可以,不吹空调简直不能忍啊,怎么处理?需求分析——使用现有的工具,以及技术完成小型空调的设计,要能够制冷。框架:使用某宝的小风扇(JDK源代码),以及制冷核心物品:冰块(JDK工厂函数)。开发工具:螺丝刀套件(eclipse),生产冰块的工具(工厂模式)开发平台:桌子(Java)多线程:在设计小空调的同时,首先使用别的开发工具(冰箱)冻冰块。疑问:空调还需要冰块,冰块还得去冰箱冻,不是更浪费资源么?并非如此,即使冻冰块使用电量,小空调运作需要电量,但是加起来也远不止真正的空调运行需要的电量。所以,此物十足就是小型空调啊,只是内部机理不同。软件设计和编码1.首先准备材料,风扇,载体,剪刀,胶带,螺丝刀……2.首先要继承“小风扇”这个类,只需要找出其中的方法进行重写,方法使用。3.将空调外壳(显示层)和内核层之间做做个接口。4.接口做好了,但是最简单的接口,必须进行修改才能使用。5.修改接口,加固衔接部分。6.使用重写的方法进行交互,使用方法实现类中成员属性螺丝拧上去。7.核心电机做好了,进行显示层包装,对显示层进行修改,让冷风能够按要求吹出去。8.进行简单的修改以后发现前端松松垮垮,不会按照我们的需求输出内容,所以给输出口加个CSS样式。软件测试加好CSS样式以后,放入冰块进行测试:结果发现:电机漏风严重!马上追加补丁修复漏洞。nice!完成总结于展望总结:使用工具类进行程序设计,基本功能已经完成。虽然还是多余的使用冰块,但是最终用的电量还是比空调少,自然能力也比空调弱,就是小的空调。展望:风力不够,需要修改硬件。系统的耦合度太高,不便于维护,今后的开发一定要控制好耦合度!!
15598
对于ps怎么抠公章,也是很多photoshop用户询问的一个问题。ps抠公章通常会使用色彩范围或者通道来抠公章。下面截图,左边是扫描稿里面一份合同里面加盖的公章。我们使用photoshop将公章抠取出来,然后调色稍微修补之后的效果,如右边所示。由于不是实际使用,只是做教程演示,因此细节部分没有做精细处理,旨在介绍其方法。下面是具体的ps抠公章操作步骤。1.在photoshop打开需要抠公章的图像文件。2.按下CTRL+J,复制背景图层,得到图层1.3.执行“选择——色彩范围”,用吸管单击红色公章部分,如果第一次选取红色不够,再次单击右边的“+”吸管,再增加红色范围,边吸取边看中间的预览,直到合适为止。 附:色彩范围的详细使用方法教程:http://www.ittribalwo.com/article/1760.html4.按下CTRL+J,将选区内的图像,复制到新图层,得到图层2。5.单击图层1,新建一个图层,得到图层3,填充白色。放在图层1和2中间。 公章大概轮廓抠取出来了,还需要进一步处理颜色和修补公章右下方的圆形。6.现在PS抠出来的公章,很淡,因此使用一个小技巧,单击图层2,反复按下CTRL+J,复制图层2,得到N个图层。最后将这些图层合并,使用让公章轮廓更加清晰。前后对比如下: 7.新建色相饱和度调整图层,选择红色,进行如下图调整。此时,公章的色彩得到了校正。 8.最后的细节,将一些杂色或者公章缺少细节的地方,使用仿制图章或者修补类工具进行修补。ps抠公章步骤到此就结束了。如果觉得此文对自己有所启发,可以收藏或者分享。附图片版:如何用ps做公章的方法和步骤截图
5903
转载自:http://www.cnblogs.com/leadzen/archive/2008/09/06/1285764.html你知道世界上有多少种浏览器吗?除了我们熟知的IE, Firefox, Opera, Safari四大浏览器之外,世界上还有近百种浏览器。 几天前,浏览器家族有刚诞生了一位小王子,就是Google推出的Chrome浏览器。由于Chrome出生名门,尽管他还是个小家伙,没有人敢小看他。以后,咱们常说浏览器的“四大才子”就得改称为“五朵金花”了。 在网站前端开发中,浏览器兼容性问题本已让我们手忙脚乱,Chrome的出世不知道又要给我们添多少乱子。浏览器兼容性是前端开发框架要解决的第一个问题,要解决兼容性问题就得首先准确判断出浏览器的类型及其版本。 JavaScript是前端开发的主要语言,我们可以通过编写JavaScript程序来判断浏览器的类型及版本。JavaScript判断浏览器类型一般有两种办法,一种是根据各种浏览器独有的属性来分辨,另一种是通过分析浏览器的userAgent属性来判断的。在许多情况下,值判断出浏览器类型之后,还需判断浏览器版本才能处理兼容性问题,而判断浏览器的版本一般只能通过分析浏览器的userAgent才能知道。 我们先来分析一下各种浏览器的特征及其userAgent。 IE 只有IE支持创建ActiveX控件,因此她有一个其他浏览器没有的东西,就是ActiveXObject函数。只要判断window对象存在ActiveXObject函数,就可以明确判断出当前浏览器是IE。而IE各个版本典型的userAgent如下: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2) Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Mozilla/4.0 (compatible; MSIE 5.0; Windows NT) 其中,版本号是MSIE之后的数字。 Firefox Firefox中的DOM元素都有一个getBoxObjectFor函数,用来获取该DOM元素的位置和大小(IE对应的中是getBoundingClientRect函数)。这是Firefox独有的,判断它即可知道是当前浏览器是Firefox。Firefox几个版本的userAgent大致如下: Mozilla/5.0 (Windows; U; Windows NT 5.2) Gecko/2008070208 Firefox/3.0.1 Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070309 Firefox/2.0.0.3 Mozilla/5.0 (Windows; U; Windows NT 5.1) Gecko/20070803 Firefox/1.5.0.12 其中,版本号是Firefox之后的数字。 Opera Opera提供了专门的浏览器标志,就是window.opera属性。Opera典型的userAgent如下: Opera/9.27 (Windows NT 5.2; U; zh-cn) Opera/8.0 (Macintosh; PPC Mac OS X; U; en) Mozilla/5.0 (Macintosh; PPC Mac OS X; U; en) Opera 8.0 其中,版本号是靠近Opera的数字。 Safari Safari浏览器中有一个其他浏览器没有的openDatabase函数,可做为判断Safari的标志。Safari典型的userAgent如下: Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Version/3.1 Safari/525.13 Mozilla/5.0 (iPhone; U; CPU like Mac OS X) AppleWebKit/420.1 (KHTML, like Gecko) Version/3.0 Mobile/4A93 Safari/419.3 其版本号是Version之后的数字。 Chrome Chrome有一个MessageEvent函数,但Firefox也有。不过,好在Chrome并没有Firefox的getBoxObjectFor函数,根据这个条件还是可以准确判断出Chrome浏览器的。目前,Chrome的userAgent是: Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13 其中,版本号在Chrome只后的数字。 有趣的是,Chrome的userAgent还包含了Safari的特征,也许这就是Chrome可以运行所有Apple浏览器应用的基础吧。 只要了解了以上信息,我们就可以根基这些特征来判断浏览器类型及其版本了。我们会将判断的结果保存在Sys名字空间中,成为前端框架的基本标志信息,供今后的程序来读取。如果判断出谋种浏览器,Sys名字空间将有一个该浏览器名称的属性,其值为该浏览器的版本号。例如,如果判断出IE 7.0,则Sys.ie的值为7.0;如果判断出Firefox 3.0,则Sys.firefox的值为3.0。下面是判断浏览器的代码:<script type="text/javascript">
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
if (window.ActiveXObject)
Sys.ie = ua.match(/msie ([\d.]+)/)[1]
else if (document.getBoxObjectFor)
Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1]
else if (window.MessageEvent && !document.getBoxObjectFor)
Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1]
else if (window.opera)
Sys.opera = ua.match(/opera.([\d.]+)/)[1]
else if (window.openDatabase)
Sys.safari = ua.match(/version\/([\d.]+)/)[1];
//以下进行测试
if(Sys.ie) document.write('IE: '+Sys.ie);
if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
if(Sys.opera) document.write('Opera: '+Sys.opera);
if(Sys.safari) document.write('Safari: '+Sys.safari);
</script> 我们把对IE的判断放在第一,因为IE的用户最多,其次是判断Firefox。按使用者多少的顺序来判断浏览器类型,可以提高判断效率,少做无用功。之所以将Chrome放在第三判断,是因为我们预测Chrome很快会成为市场占有率第三的浏览器。其中,在分析浏览器版本时,用到了正则表达式来析取其中的版本信息。 如果你的JavaScript玩得很高,你还可以将前面的判断代码写成这样:<script type="text/javascript">
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
window.ActiveXObject ? Sys.ie = ua.match(/msie ([\d.]+)/)[1] :
document.getBoxObjectFor ? Sys.firefox = ua.match(/firefox\/([\d.]+)/)[1] :
window.MessageEvent && !document.getBoxObjectFor ? Sys.chrome = ua.match(/chrome\/([\d.]+)/)[1] :
window.opera ? Sys.opera = ua.match(/opera.([\d.]+)/)[1] :
window.openDatabase ? Sys.safari = ua.match(/version\/([\d.]+)/)[1] : 0;
//以下进行测试
if(Sys.ie) document.write('IE: '+Sys.ie);
if(Sys.firefox) document.write('Firefox: '+Sys.firefox);
if(Sys.chrome) document.write('Chrome: '+Sys.chrome);
if(Sys.opera) document.write('Opera: '+Sys.opera);
if(Sys.safari) document.write('Safari: '+Sys.safari);
</script> 这样可以使JavaScript代码更精简些。当然,可读性稍差一些,就看你是重视效率还是重视可维护性了。 使用不同特征来判断浏览器的方法,虽然在速度上比用正则表达式分析userAgent要来的快,不过这些特征可能会随浏览器版本而变化。比如,一种浏览器本来独有的特性取得了市场上的成功,其他浏览器也就可能跟着加入该特性,从而使该浏览器的独有特征消失,导致我们的判断失败。因此,相对比较保险的做法是通过解析userAgent中的特征来判断浏览器类型。何况,反正判断版本信息也需要解析浏览器的userAgent的。 通过分析各类浏览器的userAgent信息,不难得出分辨各类浏览器及其版本的正则表达式。而且,对浏览器类型的判断和版本的判断完全可以合为一体地进行。于是,我们可以写出下面的代码:<script type="text/javascript">
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
//以下进行测试
if (Sys.ie) document.write('IE: ' + Sys.ie);
if (Sys.firefox) document.write('Firefox: ' + Sys.firefox);
if (Sys.chrome) document.write('Chrome: ' + Sys.chrome);
if (Sys.opera) document.write('Opera: ' + Sys.opera);
if (Sys.safari) document.write('Safari: ' + Sys.safari);
</script> 其中,采用了“... ? ... : ...”这样的判断表达式来精简代码。判断条件是一条赋值语句,既完成正则表达式的匹配及结果复制,又直接作为条件判断。而随后的版本信息只需从前面的匹配结果中提取即可,这是非常高效的代码。 以上的代码都是为了打造前端框架所做的预研,并在五大浏览器上测试通过。今后,判断某种浏览器只需用if(Sys.ie)或if(Sys.firefox)等形式,而判断浏览器版本只需用if(Sys.ie == '8.0')或if(Sys.firefox == '3.0')等形式,表达起来还是非常优雅的。 前端框架项目已经启动,一切就看过程和结果了...IE11(转载自:http://keenwon.com/851.html) : $(function () {
var Sys = {};
var ua = navigator.userAgent.toLowerCase();
var s;
(s = ua.match(/rv:([\d.]+)\) like gecko/)) ? Sys.ie = s[1] :
(s = ua.match(/msie ([\d.]+)/)) ? Sys.ie = s[1] :
(s = ua.match(/firefox\/([\d.]+)/)) ? Sys.firefox = s[1] :
(s = ua.match(/chrome\/([\d.]+)/)) ? Sys.chrome = s[1] :
(s = ua.match(/opera.([\d.]+)/)) ? Sys.opera = s[1] :
(s = ua.match(/version\/([\d.]+).*safari/)) ? Sys.safari = s[1] : 0;
if (Sys.ie) $('span').text('IE: ' + Sys.ie);
if (Sys.firefox) $('span').text('Firefox: ' + Sys.firefox);
if (Sys.chrome) $('span').text('Chrome: ' + Sys.chrome);
if (Sys.opera) $('span').text('Opera: ' + Sys.opera);
if (Sys.safari) $('span').text('Safari: ' + Sys.safari);
});
在线演示:http://keenwon.com/demo/201402/js-check-browser.html
4964
转载:http://pcedu.pconline.com.cn/966/9669884.html 【PConline 杂谈】SSD已经日渐流行,现在买电脑不挑带SSD的,都不好意思说自己真懂用户体验。和传统HDD相比,SSD由闪存构成,闪存低延迟的特性,令SSD在随机读写性能方面大幅超越HDD,这也是SSD能带来流畅操作体验的关键。但是,SSD又不仅仅只是闪存的简单组装,仅仅把闪存堆砌起来,并不能称作是SSD。调用闪存的软件算法,同样对SSD的寿命、稳定性、性能等方方面面起着重大作用。SSD中的软件算法你都了解吗?今天,就一起来谈谈SSD中有哪些软件算法吧!SSD可不是把闪存焊在一起就能做出来的 FTL:没它SSD就无法识别 我们都知道SSD的硬件构成和HDD完全不同,因此操作系统识别HDD的很多机制,并不适用于SSD。例如,硬盘是由盘片来构成的,盘片是同心圆,把圆分成一个个小小的扇形,数据在这些扇形中储存,这些扇形就被称之为扇区。操作系统把扇区组织起来,构成FAT32、NTFS等文件系统,用户才得以访问文件/文件夹而不是一个个的扇区物理地址。基本上,操作系统建立文件系统的基础就是扇区。HDD硬盘盘片上的扇区,SSD没有这个结构 SSD由闪存构成,没有盘片,自然也没有扇区。SSD的闪存颗粒基础单位是数据容量4KB的Page(页),Page组成Block(区),Block组成Plane(平面),最后Plane组成Die(晶片),这就是闪存的硬件架构。可见SSD没有扇区,怎么办?这就得靠一些算法来进行转换了。SSD使用的是闪存,闪存结构和HDD不同,需要FTL层和文件系统对话 把SSD的架构虚拟成HDD的算法,叫做“FTL”(Flash Translation Lay)。FTL算法是由SSD主控提供的,比操作系统更加底层。FTL作为一个软件中间层,可以把SSD基于Page的硬件架构映射成HDD基于扇区的硬件架构。操作系统为SSD建立文件系统的时候,有了FTL,操作系统看到的东西和HDD没啥两样,就可以用传统的方法对SSD进行分区、格式化等操作,不需要使用专为SSD而生的文件系统。得益于FTL软件算法,SSD才能无缝接班HDD,没它SSD就无法识别。 GC垃圾回收:没它SSD就巨慢无比 闪存的机制是比较独特的,当你向闪存写入数据的时候,必须先把闪存中的数据擦除掉,才能写入。同时,闪存的最小读写单位是Page,但最小的擦除单位是Block。一个Block中包含了多个Page,SSD工作一段时间后,就没有哪个Block中的Page都是空白的了。如果要擦除某个Block,就必须先把这个Block中存在有效数据的Page复制备份到其他地方,接而进行擦除,这样一来才不会丢数据。每个Page都可以写入数据,但覆盖写入需要先擦除原先的数据,一擦除整个Block都会被擦除 有效数据的Page要复制到什么地方进行备份呢?一些比较烂的产品,会把这些Page的数据复制到缓存,待到Block擦除后,再把数据写回去,这样一来SSD的写入速度就更加悲剧了——既要写原来的数据,又要写新数据。解决这个问题的,就是SSD中的GC(Gabage Collection),也就是垃圾回收算法。 GC垃圾回收算法看着有点类似碎片整理,它可以把某个Block中的存在有效数据的Page,移动到其他Block中,从而让操作系统得以擦除这整一个Block。接着再往该Block写数据,就不需要把备份到其他地方的Page也写回去了。CG发生在FTL层,不同的SSD的GC算法是不一样的,GC算法的不同,深切影响着SSD的性能。 Trim:大大提高垃圾回收效率 Trim是一种用来增加GC垃圾回收效率的算法。没有Trim的话,会出现这样一种情况:在操作系统删除一个文件,实际上数据在物理层面上并没有被删除。于是,SSD的某个Block所有Page都会被填满,待到真正写入数据的时候,才被迫进行GC垃圾回收,主控才开始把有效数据的Page移动到其他Block上,进而擦除该Block。如此一来,速度就很慢,SSD用久了每次写入数据都得先GC,用户体验非常不好。CMD中查询“fsutil behavior QUERY DisableDeleteNotify”,如图显示就是开启了Trim Trim就可以大大缓解这种情况。操作系统删除数据后,Trim会告诉SSD主控哪些Page的数据对应着删除的数据,这些Page会被标记成为无效Page。接着,在闲暇时段,SSD主控就会主动进行CG,把有效数据的Page移走,然后擦除这些Block的数据,提前为操作系统的数据写入准备好足够多的Block。如此一来,就算是长期使用,只要SSD不是装得太满,性能都不会有太过明显的下滑,大大提升了用户体验。Trim算法是由操作系统提供的,Win7、Android 4.3以后的操作系统都支持Trim。 磨损平衡:保证闪存寿命被均匀消耗 我们知道闪存是有擦写寿命的,例如MLC闪存只能够擦写数千次,TLC闪存只能够擦写数百次等等。其实以现在的SSD容量,总擦写数据量是非常惊人的,例如256G的SSD,寿命是500次擦写(P/E)的话,那么就需要写入125TB的数据,闪存才寿终正寝——就算你每天写入10G数据,也需要用三十多年才能把闪存给写挂,更何况很少人每天往SSD中写10G数据。TLC的擦写次数不尽如人意,但正常使用其实也很难挂掉 但是很多朋友仍不信任SSD的寿命,理由是SSD的这个寿命,是根据全盘容量来估算的。有的朋友认为,平时读写数据,会集中读写SSD的其中一部分闪存,这部分的闪存寿命就会损耗得特别快。一旦这部分闪存挂了,那么整块SSD也就挂了。然而事实真的是这样吗? 事实当然并非如此。实际上,SSD拥有磨损平衡(Wear Leveling)算法,令所有闪存磨损度尽可能保持一致。SSD的磨损平衡算法大致分为动态和静态两种。动态的算法就是当写入新数据的时候,会自动往比较新的Block中去写,老的闪存就放在一旁歇歇;而静态的算法就更加先进,就算没有数据写入,SSD监测到某些闪存Block比较老,会自动进行数据分配,让比较老的闪存Block承担不需要写数据的储存任务,同时让较新的闪存Block腾出空间,平日的数据读写就在比较新的Block中进行——如此一来,各个Block的寿命损耗,就都差不多了。 总结 SSD绝不是把闪存堆在一起就能做成的,要让SSD稳定、快速地运行,还有赖于种种软件算法。在选用SSD的时候,可以多关注一下该SSD所使用的主控方案,关注该主控的算法是否靠谱;在使用SSD时,要选择适合的操作系统,并及时更新SSD的固件和驱动。如此一来,才会得到更好的体验。
6803
UTF-8 页面在IE显示中文乱码解决方案 将 <meta. http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 写在title前面。起因 这个问题要从浏览器解析html的方式讲起。浏览器读取了页面的html代码后开始进行解析。解析前浏览器要先知道页面的编码方式,然后根据编码方式进行解码,然后才能开始解析。我大概想了一下,浏览器可以从下面3个方面得到页面编码方式:HTTP Header中的"Content-Type"项、返回的html代码开头是否有BOM、html代码中的meta标签。 浏览器(无论是IE还是Firefox)在解析页面时,首先取HTTP Header中的Content-Type项,如果有写明charset的话就认定页面的编码方式为charset指定的值。如果没有指明,则认定为默认值。根据上表,IE中文版的默认值是GB2312,Firefox中文版的默认值是GBK,不过IE的GB2312好像和GBK没啥区别。然后,浏览器会看一下有没有BOM。一旦发现有UTF-8的3字节BOM,则重新认定页面的编码方式为UTF-8。 然后是解码阶段,解码完成后是解析html的阶段。解析html的过程中,当解析到head部分的meta标签时,浏览器会根据<meta. http-equiv="Content-Type" content="text/html; charset=UTF-8" />这个语句中的说明,重新认定编码方式为charset后面的方式,中断html解析过程,返回到解码步骤重新解码。 知道了这个步骤,再来看这个表:在加了Header语句设置了HTTP Header后,两个浏览器解析所有页面都是用的UTF-8方式,包括GBK编码的页面。(当然要正常解析GBK编码的文件,可以在title前加上个meta标签标明编码方式。)在上表的下半部分可以清楚的看到这一点。再来看上半部分,在没有加Header语句的页面里,首先浏览器认定页面编码方式为默认值GBK。 检测有无UTF-8的3字节BOM,检测到的,认定页面编码方式为UTF-8,解码再解析html,一切正常。如上表所示,上半部分带BOM的页面都能正常显示。如果没有BOM,页面可能是GBK或者UTF-8(no BOM)格式,浏览器会先按照默认的GBK方式开始解码。页面为GBK格式时,无meta时正常,有meta时浏览器解析到meta标签会回头重现按UTF-8方式解码,所以GBK,meta在前或后,无论IE还是FF都是乱码。再看UTF-8(no BOM)的页面,无meta时FF用GBK方式解码下去,最终显示乱码,IE则解码出错,形成空白页。有meta时,Firefox找到meta后回头重新按UTF-8方式解码,所以无论meta在前或在后都是正常;IE则是在meta在前时能够和Firefox一样回头重新解码,当meta在后时,又是解析到title出错,返回空白页。
5628
对自己落井下石的人 新浪微博宋涵 @ 2015-01-13 ★ 8064 人为什么难以获得持久的幸福?除了在欲求不足的痛苦和满足后的无聊间摇摆之外,他们还几乎不懂得珍惜自己,而总是热衷于对自己落井下石——受到伤害以后,许多人最本能的反应不是安慰和爱抚自己,而是和那些伤害自己的势力一起,责备、嘲笑、看轻自己,甚至再一次践踏自己,这就是人心常常做的事。 1 人为什么难以获得持久的幸福?叔本华认为是人的本性使然:“生命是一团欲望,欲望不能满足便痛苦,满足便无聊,人生就在痛苦和无聊之间摇摆。” 这句话的魔力在于,你盯着它看很多遍,还是找不到可供反驳的漏洞。这么普通的牢笼,我们竟然就是逃脱不了。看来只有能克服这种天然本性的人,才能比大多数人获得更长久一点的幸福。 所以,人心是多么矛盾的东西啊,既不顾一切地追求快乐,又不由自主跳到沼泽之中,像一个滑稽的小丑,竭尽全力还是停止不前;而它自己还意识不到,还以为在追寻快乐的大道上一往无前。 然而,阻碍人们获得幸福的本性还不止这一点,如果我们花一点时间,跳出我们习以为常的世界——对,有个好方法是想象自己是外星人,第一次来到地球上,第一次观察到人类(你不妨试一试),就会发现人类行为的另一个奇特之处:他们几乎不懂得珍惜自己,而总是热衷于对自己落井下石,这种狂热甚至到了令一个外星生物心惊肉跳的地步。 对自己落井下石的人Give Yourself a Bear Hug, by Lim Heng Swee. 2 为什么这么说呢?请耐心一点,我会将“外星人”看到的现象一一道来: 降落到地球上的生命,是幸运的,因为这是一个温暖、壮美、丰富、有趣的星球;同时也充满着不幸的可能,因为这个星球上无时不刻在上演淘汰、灾难和毁灭。至于人类社会,就更复杂了,他们有精巧的文明,也有厚重的愚昧和满满的恶意。 一个人从出生到地球上的那一刻起,就身处这样既有好又有坏的环境中。人是如此脆弱,如此容易受到“坏”的伤害。活着的人,总会有些伤害在等待他们:严重的,被人杀害、虐待或羞辱,普通的,被人漠视、嘲弄或误解;看得见的,是淤青流血的肉体,看不见的,是崩溃破碎的灵魂。人不仅要面对大自然的变化无常,还有身边人举着那愚钝粗糙的大锯子、有意或无意切割自己的伤害与痛苦。 任何一个心怀正义和悲悯的人(哪怕是一个“外星人”),看到这样受苦的现象,都会忍不住同情那无辜的受害者,如果有条件,还会给予一点慰藉和一点帮助。 可是,当人自己受到伤害以后,最本能的反应不是安慰和爱抚自己,而是和那些伤害自己的势力一起,责备、嘲笑、看轻自己,甚至再一次践踏自己,这不是太奇怪了吗?可这就是人心常常做的事。 3 不信吗?你去看那些自卑的、佝偻着精神脊椎的人,那些胆怯的、躲避着幸福的人,那些绝望的、放弃任何努力的人,都是源自于他们在毫无反抗力的时候,受到了世界的恶意与伤害。 因为被人不断地说:“你丑得像个怪胎”、“怎么会有你这么笨的小孩”、“为什么要把你生出来”,人就会相信这些话,相信自己是毫无价值的,他/她就再不敢奢望幸福。 因为被人打骂、侮辱、遗弃,人在短暂的愤怒之后,就会怀疑自己活着的意义,“不值得活下去”的念头就会像幽灵一样总是缠着他/她; 哪怕因为最普通的求爱失败、或者错爱了一个人,就怀疑再也不会有人爱自己,于是扔掉仅有的勇气,再不去追寻;或者相信自己只能配得上坏人,心甘情愿地依附着伤害自己的人。——这些都是人心常常做的事啊。 4 这种行为是什么呢?就是在跌落井底之后,人不会拍掉身上的污浊,也不会包扎疼痛的伤口,更不会锻炼力气重回光明之地,而是下意识地搬起石头,狠狠砸自己的腿,让自己再也走不出这样的境地。 人在不知不觉中,也成为了加害者的同盟。 5 伤害发生过后,人对自己的“落井下石”,是如此快速、隐蔽而强大的本能反应,以至于本该有的理解、安慰、鼓励都毫无立足之地。 作为一个外星人,你会看到,人是一个悲哀的物种,因为他们的基因密码里,没有“自爱”的默认设置,他们好像天生就不会自爱。 他们的自爱,都来源于他人的爱,只有被真爱包围时,他们内心的“自爱”才会苏醒和启动。 如果遇到伤害,他们的认知系统,就会自动认同伤害传递的信息,形成顽强的暗示,化为第二次更旷日持久的伤害。 当别人说他/她丑,他/她就要用尽一切办法证明自己不丑;当父母忽视他/她,他/她就要拼命成为一个耀眼的人,要被父母看见和重视;当整个世界都曾苛刻地对待过他/她,他/她就会用玩世不恭的桀骜态度来表达无法爱上任何一个人的绝望。在这一切的“努力”深处,藏着惶恐和恐惧,正是他们在认同那些声音:“你就是丑”、“你就是个失败者”、“你就是没人爱”。给自己一个温柔的拥抱,肯定自己的存在,竟是这么难。 对自己落井下石的人 6 外星人会感叹,这是一个多么悲哀的循环:“自爱”要有“他爱”才能启动,可是,没有“自爱”的人又无法给予“他爱”,那么他/她身边的人,也无法启动“自爱”。 等等,外星人不要急着离开。我们再重新审问一下这个论断:人的基因密码里,真的没有“自爱”的默认设置吗? 如果没有,那么最初的、来自他人的“爱”是怎么来的?真的是来自“上帝”吗?假若真的是“上帝”的爱启动了人类的爱,那么每一个个体的内心中不正是有了“自爱”的种子? 看来之前的结论是太武断了。聪明的外星人得修正一下,“自爱”只是习惯沉睡而已,在许多人的一生中很少发挥作用,但也有罕见的案例:无论受到怎样的伤害,这些人永远是自己的支持者;他们绝不对自己落井下石。 曾经有大学生被拍到全裸洗澡的照片,受不了舆论的压力而跳楼自杀;但是,也有一个叫珍妮弗·劳伦斯的女人,在卷入“艳照门”事件后,选择为自己撑腰,对着全世界的恶意大声说:“我不知道我有什么好道歉的。”从外星人的角度看,珍妮弗·劳伦斯的做法明显更合理;为了他人的恶意而惩罚自己,不是不可理喻吗?但从人类的历史来看,珍妮弗·劳伦斯反而是个奇葩。 对自己落井下石的人 还有一个叫奥普拉·温弗瑞的女人,从小就被虐待和性侵,14岁就生下了第一个孩子,可是她没有像大多数人那样,被伤害所毁灭,她只需要简单地告诉自己一件事:“这些都不是我的错”,就能一步一步接近她想要的正常生活。 如果你仔细辨认,你一定能在茫茫人海中认出这些人。 这些人被称为“坚强”或“英雄”,可是他们只是懂得温柔地爱自己而已。他们就是坚定一个信念:即使全世界都不爱你(事实上,全世界都不爱你,这只是某一种绝望境地中的狭隘错觉),你总有一个坚定的拥护者:你自己。 神奇的事情是,当一个人在无论如何的情况下,都能突破恐惧与绝望,去珍惜自己时,残酷的世界也会呈现出温柔的一面。 7 “不爱自己”是人类的死穴,虽然一部分人整天嚷着要“爱别人”,还有一部分有觉醒的人呼吁要“爱自己”,然而真正做到能爱自己的,非常罕见。我们总是不自觉地,在伤害我们的外在势力上,补上最关键的一刀。 爱自己,是知行合一,这个难度级别估计仅次于克服叔本华的“钟摆定律”。 无论如何,活着就是要活得更智慧和更幸福。我们无法完全克服本能,但我们可以在本能冲动之前,留一点迟疑和观察。世界辽阔无常,有些路总要一个人走,在这条路上,我们可以尽量去做:少一点对自己“落井下石”,多给自己一点理解的拥抱。■
4937
一个较经典的PHP文件上传类代码,虽然很老,但用的人还是挺多的,当初自己在用PHP做站的时候,就用了这个类。包括有调用的例子,对新手也友好,这个类可以上传图片和其它格式的文件,看你怎么设置了。另外这个上传类可对文件上传大小限制,可自动创建文件上传目录,类中的方法用好了,可以扩展较多的功能。<?php
// $Id: upload.class.php,v 1.0 2001/10/14 14:06:57 whxbb Exp $
$UPLOAD_CLASS_ERROR = array( 1 => '不允许上传该格式文件',
2 => '目录不可写',
3 => '文件已存在',
4 => '不知名错误',
5 => '文件太大'
);
/**
* Purpose
* 文件上传
* Example
*
$fileArr['file'] = $file;
$fileArr['name'] = $file_name;
$fileArr['size'] = $file_size;
$fileArr['type'] = $file_type;
// 所允许上传的文件类型
$filetypes = array('gif','jpg','jpge','png');
// 文件上传目录
$savepath = "/usr/htdocs/upload/";
// 没有最大限制 0 无限制
$maxsize = 0;
// 覆盖 0 不允许 1 允许
$overwrite = 0;
$upload = new upload($fileArr, $file_name, $savepath, $filetypes, $overwrite, $maxsize);
if (!$upload->run())
{
echo $upload->errmsg();
}
*
* @author whxbb(whxbb@21cn.com)
* @version 0.1
*/
class upload
{
var $file;
var $file_name;
var $file_size;
var $file_type;
/** 保存名 */
var $savename;
/** 保存路径 */
var $savepath;
/** 文件格式限定 */
var $fileformat = array();
/** 覆盖模式 */
var $overwrite = 0;
/** 文件最大字节 */
var $maxsize = 0;
/** 文件扩展名 */
var $ext;
/** 错误代号 */
var $errno;
/**
* 构造函数
* @param $fileArr 文件信息数组 'file' 临时文件所在路径及文件名
'name' 上传文件名
'size' 上传文件大小
'type' 上传文件类型
* @param savename 文件保存名
* @param savepath 文件保存路径
* @param fileformat 文件格式限制数组
* @param overwriet 是否覆盖 1 允许覆盖 0 禁止覆盖
* @param maxsize 文件最大尺寸
*/
function upload($fileArr, $savename, $savepath, $fileformat, $overwrite = 0, $maxsize = 0) {
$this->file = $fileArr['file'];
$this->file_name = $fileArr['name'];
$this->file_size = $fileArr['size'];
$this->file_type = $fileArr['type'];
$this->get_ext();
$this->set_savepath($savepath);
$this->set_fileformat($fileformat);
$this->set_overwrite($overwrite);
$this->set_savename($savename);
$this->set_maxsize($maxsize);
}
/** 上传 */
function run()
{
/** 检查文件格式 */
if (!$this->validate_format())
{
$this->errno = 1;
return false;
}
/** 检查目录是否可写 */
if(!@is_writable($this->savepath))
{
$this->errno = 2;
return false;
}
/** 如果不允许覆盖,检查文件是否已经存在 */
if($this->overwrite == 0 && @file_exists($this->savepath.$this->savename))
{
$this->errno = 3;
return false;
}
/** 如果有大小限制,检查文件是否超过限制 */
if ($this->maxsize != 0 )
{
if ($this->file_size > $this->maxsize)
{
$this->errno = 5;
return false;
}
}
/** 文件上传 */
if(!@copy($this->file, $this->savepath.$this->savename))
{
$this->errno = 4;
return false;
}
/** 删除临时文件 */
$this->destory();
return true;
}
/**
* 文件格式检查
* @access protect
*/
function validate_format()
{
if (!is_array($this->fileformat)) // 没有格式限制
return true;
$ext = strtolower($this->ext);
reset($this->fileformat);
while(list($var, $key) = each($this->fileformat))
{
if (strtolower($key) == $ext)
return true;
}
reset($this->fileformat);
return false;
}
/**
* 获取文件扩展名
* access public
*/
function get_ext()
{
$ext = explode(".", $this->file_name);
$ext = $ext[count($ext) - 1];
$this->ext = $ext;
}
/**
* 设置上传文件的最大字节限制
* @param $maxsize 文件大小(bytes) 0:表示无限制
* @access public
*/
function set_maxsize($maxsize)
{
$this->maxsize = $maxsize;
}
/**
* 设置覆盖模式
* @param 覆盖模式 1:允许覆盖 0:禁止覆盖
* @access public
*/
function set_overwrite($overwrite)
{
$this->overwrite = $overwrite;
}
/**
* 设置允许上传的文件格式
* @param $fileformat 允许上传的文件扩展名数组
* @access public
*/
function set_fileformat($fileformat)
{
$this->fileformat = $fileformat;
}
/**
* 设置保存路径
* @param $savepath 文件保存路径:以 "/" 结尾
* @access public
*/
function set_savepath($savepath)
{
$this->savepath = $savepath;
}
/**
* 设置文件保存名
* @savename 保存名,如果为空,则系统自动生成一个随机的文件名
* @access public
*/
function set_savename($savename)
{
if ($savename == '') // 如果未设置文件名,则生成一个随机文件名
{
srand ((double) microtime() * 1000000);
$rnd = rand(100,999);
$name = date('Ymdhis') + $rnd;
$name = $name.".".$this->ext;
} else {
$name = $savename;
}
$this->savename = $name;
}
/**
* 删除文件
* @param $file 所要删除的文件名
* @access public
*/
function del($file)
{
if(!@unlink($file))
{
$this->errno = 3;
return false;
}
return true;
}
/**
* 删除临时文件
* @access proctect
*/
function destory()
{
$this->del($this->file);
}
/**
* 得到错误信息
* @access public
* @return error msg string or false
*/
function errmsg()
{
global $UPLOAD_CLASS_ERROR;
if ($this->errno == 0)
return false;
else
return $UPLOAD_CLASS_ERROR[$this->errno];
}
}
?>
6248
文章转自:http://itbbs.pconline.com.cn/office/11962710.html#Jfastreply 买不起投影机?没事,花上千元左右自己DIY一台即可,虽然效果无法和1080p家庭影院级投影机相比,但绝对比老式的CRT电视机要震撼很多。 没钱照样享受大画面震撼,众多的网友正依靠自己勤劳且富有创造性的双手DIY了一台台属于自己的投影机。找一块废弃的液晶板,网上淘个驱动板,五金店里再买个灯泡,再加上一些其他的小配件,花上几天的时间在家制作一个外壳,一台属于自己的DIY投影机就大功告成了。 从技术原理来看,这样的单片式LCD液晶投影机无疑太过于“山寨”。从效果来看,DIY投影机在分辨率、色彩、噪音等方面都存在较多的缺陷。但是不可否认的是,这样的产品正在形成自己的独特产业,让更多的基层消费者享受了百吋大画面的震撼,功不可没。 不过对于大多数用户来说,DIY产品固然廉价简单,但是却不知从何下手,空有美好的愿景却无法实施,这的确是一种痛苦。为了方便广大网友DIY出自己的大画面梦想,笔者就此为大家提供一些DIY投影机成功案例、原理、技巧等,供发烧友参考学习。国外网友DIY投影机视频全程 上面的这个视频国外某网友制作的,从其能够了解DIY投影机的全程。不过需要指出的是,此网友购买的DIY投影机为半成品,只需组装完工即可,技术含量并不高。不过我们还能从此视频中得到另外一个信息:DIY投影机并不仅仅是国内的产物,国外的网友同样钟爱于这种“山寨”产品。 DIY并不代表低质,对于发烧友来说,也要有一定的底线,切不可因为便宜而放弃原则。笔者认为,首先DIY投影机的亮度不能低于500流明,否则亮度太低对视力等有一定的影响;其次,DIY投影机的物理分辨率不能低于640×480,目前VCD的分辨率为352×288;数字电视机顶盒的输出分辨率为640×480,720p、1080p的电影更是层出不穷,太低的分辨率已经没有了存在的意义;还有就是投影机的分辨率不能低于40吋,目前便宜的32吋的电视机价格仅为2000余元,如果DIY投影机的尺寸仅仅和电视机类似,显然得不偿失。 好了,了解了这些信息之后,我们就开始动手了。下面我们就和大家分享以为成功的DIY发烧友的经典案例,希望能够为入门级DIY用户提供一定的帮助。相对于普通的入门级DIY用户,今天我们和大家分享的这位DIY用户可谓是骨灰级的玩家。凭借众多的成功作品,其在DIY投影机圈内享有盛名。 对于用户来说,如果有能力的话,最好前期就做好设计草图。 诚然,对于大部分用户来说,制作和看懂上面这几张图片有一定的困难。如果的确看不懂也无妨,大致了解一下DIY投影机的原理和部件即可。如果连这些也看不懂,下面就一步步看网友的作品,肯定也是有一定的帮助。 某骨灰级网友DIY投影机配件:1、LCD屏 LTN121XF-L01,零售价300元左右;2、4合1驱动板;3、欧司朗150W光源套件(灯+灯座+电感镇流器等),零售价250元左右;4、68mm冷膜反光碗,零售价40元左右;5、90mmF130耐高温非球面聚光镜,零售价40元左右;6、113*138吸热型隔热玻璃,零售价20元左右;7、灯室盒;8、12.1寸用F220/330菲涅尔透镜,零售价50元左右;9、12.1寸用镀膜反射镜,零售价60元左右;10、焦距320口径70镜头,零售价200元左右,总价不足千元。DIY投影机所购置的部分零配件将购买的LCD液晶屏点亮测试,一切良好用金属边框等将液晶屏固定,以免震动等造成的损伤购置的欧司朗150W光源套件(灯+灯座+电感镇流器等)经过测试,光源套件工作状态良好 DIY投影机主要包括两部分:机箱和液晶屏。相对来说,液晶屏属于电子部分,DIYer需要懂一些简单的电路;机箱部分则对制作者的木工等水平有一定的要求。下面我们首先来了解下液晶显示部分的设计制作。切割菲涅尔透镜,用普通的钢锯条即可用螺丝等固定好液晶屏通电点亮进行测试点亮测试效果由于目前没有制作外壳机箱,所以有一定程度的漏光显示效果还是较为理想的 对于玩家来做,在开工之前应该对所购买的产品进行仔细认真的测试。否则,一旦某个部件出现问题,一切又要全部推倒重来,费时费力,DIY的效果也往往不太理想。 光源显示部分经测试没问题后,下面就开始机箱的制作。在这里,该玩家使用的所有板料都是中密度纤维板,这样更容易加工成型。由于前期都已经做好了设计图,下一步就是根据设计图对板材进行开孔。DIY投影机机箱所需要的中密度纤维板在中密度纤维板上做好规划开始加工制作加工制作后的中密度纤维板对纤维板进行合并大致成型的机箱在机箱内部做好固定液晶屏的部件 当然,装配箱体也是有技巧的。笔者建议使用乳白胶或者指接胶,此类产品属于乳化类木材粘合剂,板材吸收水分后即有一定强度,固化后不溶于水,耐潮能力较好。在铁皮上钻孔,用于安装灯泡套件安装上灯泡组件之后的效果在灯泡套件外加上菲镜在机箱上安装投影镜头将灯泡套件部分固定液晶屏、散热风扇、灯泡组件等均安装完毕效果测试 和普通DIY用户所不同的是,该玩家将灯泡组件部分和显示屏部分进行了分开设计安装,对投影机的散热、稳定等显示有了更好的帮助。 至此,DIY投影机已经初步成型。接下来,就要开始进行对细节的调整和修饰,消除浓厚的“山寨味”,达到更为理想的效果。DIY投影机的测试效果将机箱内部涂黑 DIY投影机内部采用的都是高透光液晶屏,内部无规则的杂散光线不仅不能提升亮度,反而还会降低投影机的对比度,所以建议用户将其内部进行涂黑处理。将机箱内部涂黑后重新安装固定各部件成型后的DIY投影机 至此,基本上可以宣告大功告成。如果制作者对现有作品仍然不满意,可以适时对外壳进行喷漆等装饰,但是投影性能基本上已经稳定了。下面我们就来看看DIY投影机的效果。当然,该玩家是将投影机显示的画面投射到白墙上的,毕竟一块普通的幕布价格往往也在五百元以上。DIY投影机效果展示DIY投影机效果展示 从整体来看,效果还是较为理想的。虽然无法和1080p高清投影机相提并论,但是投影机的物理分辨率也达到了1024×768,远远高于普通3000元价位投影机800×600的分辨率。 其实DIY投影机的原理很简单,就是废旧笔记本的显示屏拆下来,然后通过光学原理对画面进行放大,然后即可得到投影大画面效果。而传统的投影机则是光机电一体化产品,对各方面都有着很高的要求,所以不可相提并论。有兴趣的读者也可以通过拆解了解3LCD和DLP投影机的内部结构:点击进入3LCD投影机拆解 点击进入DLP投影机拆解 在两年前,DIY投影机还一度风光无限,但是随着大量3000元DLP投影机的上市,DIY投影机市场近来已经萎缩的较为严重。从技术原理来看,DIY投影机和品牌有着本质上的区别。另外,品牌投影机的品质保证、售后等也要远远强于DIY投影机。DIY迟迟没有火起来还有一个很重要的因素就是普通读者根本不知道这样产品的存在,更谈不上制作属于自己的DIY投影机。