IT技术博客大学习 共学习 共进步

发现

共 287 篇文章

IT 2014-08-15 14:06:44 / 累计浏览 2,110

教你如何在Windiws平台上创建以点(.)开头的文件名

Windows系统有个小脾气:当你想创建像.gitignore这样以点开头的配置文件时,如果直接输入文件名,系统会弹出“文件名不能以点开头”的错误提示。这给需要管理隐藏配置文件的开发者带来了困扰。 这篇教程分享了一个非常巧妙的解决方法:在命名时,在期望的文件名(例如.gitignore)末尾**再添加一个点**,将其输入为“.gitignore.”。这样,文件就能成功创建,并且系统会自动识别并保留真正的“.gitignore”这个文件名。这个技巧利用了Windows文件命名规则中的一个小盲区,虽然简单,却有效解决了实际问题。 需要注意的是,这个方法在Windows资源管理器中操作有效,但更适合需要看到文件扩展名的程序员用户。对于普通用户,通常可以通过命令行或其他方式达到目的。这个小技巧体现了在技术实践中,有时绕过表面限制、理解系统底层行为,能找到意想不到的简便解法。

IT 2014-07-28 12:45:00 / 累计浏览 3,389

那些让工作更美好的设备们

这篇文章分享了作者在办公室和家里使用各种设备的体验与推荐。作者从自己的办公桌面和家里环境出发,列举了包括DELL U2412m显示器、Noppoo Lolita机械键盘、罗技G1鼠标以及SteelSeries QcK+鼠标垫等在内的一系列日常装备,并详细解释了选择它们的理由。 核心观点在于:每天高频使用的设备,值得投资好一些的。作者认为,这能换来持续的高效率和好心情,这笔钱花得其所。比如,他盛赞了IPS屏幕的色彩与可视角度,以及可升降旋转支架带来的舒适姿势;在键盘选择上,则分享了对87键布局、红轴手感以及走线设计的个人偏好。 文章不仅是单纯的产品罗列,更融入了作者对于“好设备如何提升幸福感”的切身思考。例如,他提到一些功能“没用前不觉得,用了再退回没有时就会很不爽”,道出了升级体验的本质。对于那些觉得公司设备不佳的读者,作者也提出了务实的建议:如果是自己干活必需的,不妨自费购买,毕竟这些设备未来还能带走。 对于关注日常工作效率与幸福感的读者,这篇结合了个人实践与详细点评的分享,提供了许多具体而实用的升级思路。

IT 2014-07-15 22:43:44 / 累计浏览 1,040

文明上网,普及科学,传播价值

针对VPN连接不稳、频繁断开影响技术工作的痛点,作者从自身实践出发,分享了一套基于GRE隧道和策略路由的自建“科学上网”方案。核心思路是在国内服务器与海外服务器之间建立一条稳定的GRE隧道,并通过`iproute`策略路由,实现国内流量直接从国内网关出去、国际流量则经隧道从海外出去,从而在保障访问Google等资源速度的同时,避免了所有流量绕行海外的低效问题。 文章详细列出了从建立隧道、配置双向路由规则、通过APNIC数据自动生成中国IP路由表,到设置NAT和调整MTU以确保稳定的完整操作步骤。这套方案相比依赖第三方VPN,显著提升了连接的可靠性和上网速度,为有类似需求的读者提供了一套思路清晰、可落地的实现参考。

IT 2014-07-15 22:35:54 / 累计浏览 4,858

在程序员的眼里,用户是这样使用他们开发的软件的

这篇讲的是程序员与普通用户之间那条意想不到的认知鸿沟。作者从程序员的视角切入,描述了当用户“另辟蹊径”使用他们开发的软件时,程序员眼中那种既好气又好笑的场景。 文章举了两个生动的例子:客户找不到桌面的IE图标,只会说“大e不见了”;另一位客户则在页面上找不到他想要的搜索,其实他需要的只是浏览器自带的Ctrl+F功能。这些真实案例凸显了一个核心矛盾:程序员容易高估用户对软件的掌控能力,同时低估了自己所构建逻辑的复杂度,最终导致自认为完美的程序在用户手里变得“极其难用”。 不过文章也指出,尽管过程充满挫折,但用户的满意正是程序员成就感的来源。文中穿插的多幅幽默图片,形象描绘了用户使用软件时的懵懂与程序员视角下的“灾难现场”,让整个讨论在调侃中不失共鸣。 最后,文章延伸到了与程序员沟通的实用建议:因为他们对逻辑因果极其敏感,与他们对话最好遵循清晰的“If…Then…Else”结构,主语明确,以免产生误解。整篇文章既是一次对“开发者思维”的幽默解构,也提醒着所有技术从业者:理解用户的局限性,是打造好软件不可或缺的一课。

IT 2014-07-15 22:32:33 / 累计浏览 2,755

如果代码审查时你忘记了拿近视眼镜

这篇讲的是代码审查中那些破坏可读性的常见“坏味道”。作者用了一个有趣的比喻:当你忘记戴近视眼镜时,看代码就只能依赖整体的“形态”和“结构”。这恰恰点出了代码审查的本质——我们有时需要暂时忽略实现细节,去审视代码的骨架是否健康。 文章通过六个生动的代码片段示例,具体演示了哪些设计会让“模糊的你”一眼就觉得不对劲。比如,把 `UserCreator` 的职责过分简化,导致创建一个简单的对象都需要在一堆小文件中寻觅;或者反其道而行之,让一个类塞进太多无关的方法,伪装成一个“全能”类。再比如,方法被拆得过于碎片化,使得逻辑追踪令人头疼;以及命名空间嵌套深达六层,让代码定位变得曲折。 作者指出,这些做法虽然在技术上可能“能运行”,却为人脑的理解设置了不必要的障碍。一个拥有8个参数的方法、一段需要长篇注释才能理解的逻辑,都在无声地增加协作与维护的成本。 最终,文章的落点在于:清爽、简洁、结构良好的代码是高效团队协作的基石。忽视代码的“可读性设计”,无论初衷多么良好,终将反噬项目本身。

IT 2014-05-27 23:00:55 / 累计浏览 2,669

RSA 算法是如何诞生的

这篇讲的是RSA算法背后那段堪比励志小说的诞生史。作者从三个性格迥异的发明者说起:痴迷新技术的Rivest、学啥都快的Shamir,以及起初只想当“泼冷水”评委的Adleman。 故事的核心冲突在于,他们为Diffie提出的公钥密码概念寻找可行的单向函数。从1976年底开始,Rivest和Shamir构想,Adleman负责破解,这个循环竟重复了42次。每一次方案被Adleman击破,都是一次挫折,但也排除了一条错误路径。 直到1977年逾越节派对后,Rivest在深夜获得关键灵感,一气呵成完成了最终方案,这次Adleman终于无法破解。更有趣的细节是,论文署名按字母顺序排列,若非Adleman的坚持,这个后来改变互联网安全的技术或许就叫“ARS”了。 文章还揭示了历史的另一个面貌:早在1973年,英国数学家Clifford Cocks在半小时内就得出了几乎相同的算法,却因政府保密协议,其成果被尘封了二十多年。这让RSA的荣耀与一段无名英雄的遗憾交织在一起,也让算法的诞生故事更显厚重。

IT 2014-05-27 23:00:16 / 累计浏览 3,071

客服趣事

这篇讲的是技术团队成员临时顶替客服岗位时遇到的那些令人啼笑皆非的真实片段。作者从一次团队内部的人员轮换出发,记录了技术“门外汉”代班客服时,与形形色色的淘宝卖家沟通中产生的各种误会与趣事。 文中细节颇有趣味:有客户把“在吗”打成“阿紫”让人联想到武侠剧;有客户执着于让“美艳艳”的男性技术员证明价格;有使用疑似Windows 2000古老系统却质疑浏览器过时的卖家;更有妈妈卖家在沟通中因孩子放学而突然中断的日常。这些片段不仅展现了客服工作的多面性,也揭示了技术支持中一个常见的现象:很多问题根源在于用户端的环境(如过时的浏览器、缺失的字库)或对系统规则的误解。 最生动的是,作者描述了一位爱钻研的卖家花费一周时间分析对手的“价格显示玄学”,而最终很可能只是系统的一个显示bug。这些看似琐碎的互动,实则勾勒出电商技术支持生态中,技术思维与用户日常操作之间的有趣落差,以及一线沟通中不可或缺的耐心与幽默感。

IT 2014-05-27 22:55:18 / 累计浏览 4,307

推荐几本 Unix/Linux 经典书

这是一份从入门到内核的 Unix/Linux 经典书单。作者结合自身阅读经验,为不同阶段的学习者梳理了那些历经时间考验的“案头必备”。他认为,在信息爆炸的今天,与其浪费时间在平庸的书籍上,不如直接啃透经典。 对于初学者,文章推荐了《Running Linux》和《Linux in a Nutshell》作为起步。而系统管理方面,两部“大部头”——《UNIX and Linux System Administration Handbook》与《Essential System Administration》被形容为该领域的百科全书。网络原理则首推《TCP/IP Illustrated, Volume 1》,无论职位是运维还是开发,理解底层协议都至关重要。 进入编程领域,从 Kernighan 与 Pike 合著、体现 Unix 哲学的《The UNIX Programming Environment》,到 Richard Stevens 的《APUE》和《Unix Network Programming》这两部巨著,构成了进阶路径。最后,针对渴望深入内核的读者,《Operating Systems: Design and Implementation》与《Understanding the Linux Kernel》是绕不开的经典,尽管后者被坦言“学习过程痛苦”,但能帮助构建完整的内核图景。 作者的核心观点是:阅读这些英文经典,不仅能更高效地掌握技术,更是为职业生涯打下坚实基础。这些书是真正能放在手边反复翻阅的伙伴。

IT 2014-05-11 21:26:53 / 累计浏览 2,244

chrome对代理服务器的支持情况

这篇深入探讨了Chrome浏览器对代理服务器的支持情况,清晰梳理了它支持的两大类协议:SOCKS和HTTP。作者指出,SOCKS下实际涵盖了SOCKS4、SOCKS4a和SOCKS5,但Chrome并未明确支持SOCKS4a的远程域名解析,且所有SOCKS协议都不支持身份验证。 在对比关键差异时,文章分析得非常细致。例如,在连接建立的开销上,HTTP、SOCKS4、SOCKS5三者并不相同:SOCKS4需要1次往返,SOCKS5需要2次,而HTTP代理虽然也需要1次往返,但Chrome处理带认证的HTTP代理时机制比较特别(先收到407再补发头信息),且新版本浏览器会尝试记忆认证信息,不过底层部分请求如更新程序依然不支持。 文章还揭示了两个值得开发者注意的实用细节:一是Chrome的DNS预取功能在配置代理后仍可能尝试本地解析,存在隐私泄露风险;二是用户社区长期呼吁为Chrome的SOCKS5代理增加身份验证功能,但官方尚未有实质性进展。这些内容不仅对比了协议特性,也点出了实际使用中可能遇到的坑。

IT 2014-05-10 21:21:33 / 累计浏览 1,812

移动应用开发工具:PhoneGap与Titanium的比较

这篇讲的是跨平台移动开发工具 PhoneGap 和 Titanium 的“道”与“术”之别。 PhoneGap 的核心是“包装”,它把 HTML/CSS/JS 写就的 Web 应用,用原生代码包裹起来,再通过一个“桥接”层让 Web 页面能调用摄像头、联系人等设备功能。它的优点是门槛极低,任何前端开发者都能快速上手,但缺点也明显:界面完全依赖移动设备的浏览器视图渲染,性能和体验参差不齐,且很难与真正的原生 UI 组件深度集成。 Titanium 的思路则截然不同,它是“生成”。开发者用 JavaScript 编写的代码,会通过其 SDK 在编译时转换成真正的原生应用指令和 UI 控件。运行时,JavaScript 与原生代码通过“代理对象”并行交互。这带来了接近原生的性能和体验,但代价是开发者需要理解原生应用的构建逻辑,且添加新平台支持的难度较大。 因此,二者的选择归根结底是场景和理念的选择:PhoneGap 更像一个快速的“Web 应用转生器”,适合已有 Web 项目或对原生体验要求不高的场景;而 Titanium 则是一个能用 JS 驱动原生开发的“利器”,更适合追求性能和原生交互体验的移动应用开发。

IT 2014-04-29 22:34:12 / 累计浏览 2,647

Ctrl+S导致Putty或Xterm命令行无响应问题

这篇讲的是一个让很多用命令行的人都会心头一紧的瞬间:在PuTTY或Xterm里习惯性地按下Ctrl+S想保存什么,结果终端突然毫无反应,好像死机了。作者一针见血地指出了问题的根因——Ctrl+S在终端环境下默认触发了XOFF流控制,这会暂停终端的一切输出,但其实按键和命令都在后台默默执行。 文章给出了解决这个“假死”问题的三个层次方案。最直接的是立刻按下Ctrl+Q,重新打开流控制,就能“唤醒”终端。想从根源上杜绝,可以在.bashrc配置文件中通过stty命令禁用这个快捷键的XOFF功能。而最巧妙的是“一箭双雕”的方案:不仅禁用了Ctrl+S的终端控制功能,还能通过额外的配置,让它在VIM编辑器里重新变回保存文件的快捷键,完美契合了用户的手指肌肉记忆。 对于经常在命令行和编辑器之间切换的工程师来说,这篇文章提供了从急救到根治,再到功能自定义的全套思路,能有效解决这个烦人的操作习惯冲突。

IT 2014-04-13 22:47:58 / 累计浏览 2,996

使用Node.js、Twilio实现手机控制门锁

这篇教程解决了一个很实际的场景:忘带钥匙或需要远程为访客开门时,如何用手机控制家里的门锁。作者从自己在Makerland大会的演讲出发,手把手展示了一套不需要破坏原有门锁的DIY方案。 硬件核心是使用Arduino Uno微控制器驱动一个伺服电机,再通过物理结构(比如纸板和胶带)将电机的转动与门锁的旋钮联动起来,实现开锁与闭锁的机械动作。软件层面则构建了一个完整的通信链路:Node.js脚本通过Express框架搭建本地Web服务,利用Twilio API接收特定号码发来的短信指令;随后,脚本再通过串口通信向Arduino发送控制信号,驱动电机完成操作。整个系统通过ngrok实现内网穿透,让外网的Twilio能够访问到你的本地服务。 文章最巧妙的地方在于,它清晰地拆解了从物理组装到软件集成的全流程,让一个听起来有点科幻的想法,变成了一个有具体零件清单、接线图、代码示例的可复现实验。对于喜欢折腾硬件和Node.js的开发者来说,这是一个将软件能力延伸到物理世界的小而完整的范例。

IT 2014-04-07 22:51:39 / 累计浏览 4,627

关于程序员的59条搞笑但却真实无比的编程语录

这篇整理了59条来自行业先驱与匿名程序员的经典编程语录,主题横跨开发生活、软件设计、调试纠错到产品交付。它并非技术教程,而是一次对程序员共同经历与职业哲学的幽默盘点。 从“过马路要往两边看”的谨慎,到“软件就像做爱,一次犯错,你需用余生维护”的犀利比喻,这些语录用自嘲的方式道尽了行业的真相。比如比尔·盖茨说“按代码行数评估进度,如同按重量评估飞机建造”,直指项目管理的荒谬;而“拷贝-粘贴是一种设计错误”则严肃提醒着代码质量的重要性。 文章的价值在于,这些段子与警句并非单纯搞笑。它们凝练了无数项目中的血泪教训与智慧闪光,比如对“未注明的功能特征”(即bug)的经典辩解,或是对“理论与实践差异”的精辟总结。对于从业者而言,阅读过程会不断产生“太真实了”的共鸣,仿佛与一群懂行的老友会心一笑,同时也能在笑声中反思自己的开发实践。

IT 2013-11-20 23:55:45 / 累计浏览 4,593

防止表单重复提交的几种策略

这篇讲的是多用户Web应用中一个经典问题:表单重复提交。从用户误点两次按钮、刷新页面,到使用浏览器前进/后退,甚至网络层的重复请求,都可能导致同一数据被多次处理,带来数据不一致或资源浪费。 文章梳理了四种常见的应对策略。前端层面,可以暂时禁用提交按钮,但这依赖客户端JavaScript,不够稳健。更推荐的做法是采用Post/Redirect/Get模式——提交后立即重定向到结果页,从根本上避免刷新或回退带来的重复提交。后端控制上,可以在session中为每次生成的表单嵌入一个一次性令牌,服务器处理时立即核验并删除,这是一种结合了安全考虑的有效方案。最后,从数据源头兜底,在数据库层面设置唯一约束或索引,确保即使重复数据到达也能被拦截。 这些方法各有侧重,从用户交互、请求流转、会话状态到数据存储形成了多层次的防御。实际开发中,往往会根据应用的安全要求和复杂度,选择组合使用这些策略。

IT 2013-11-20 00:17:15 / 累计浏览 3,468

程序员的18个有趣的事实

这是一篇充满黑色幽默与职业共鸣的程序员文化观察。作者从开发日常中提炼出18条令人会心一笑的“真理”,精准捕捉了程序员群体在自嘲中展现的独特智慧。 文中的事实从多个角度切入:有对版本迭代的幽默解构(“如果第一次运行不成功,那就叫它1.0版吧”),有对bug的哲学化开脱(“那些只是开发出来的随机的功能特征”),还有对编程本质的尖锐洞察(“编程是10%的科学,20%的创造力,和70%的让这创造力符合科学”)。这些看似玩笑的语句,实际映射着调试的挫败感、对完美的执着、以及咖啡与代码间的生化反应。 文章没有停留在单纯的趣味列举。它像一面镜子,照见了程序员在理性框架下的感性挣扎:既抱怨被用户“不够友好”地对待,又承认自己或许“没有源代码”去改变世界;既明白代码错误需用一生维护,又依然享受着编译通过瞬间的纯粹快乐。这种矛盾恰恰揭示了这个职业最真实的核心——在严谨的逻辑系统中,依然保有鲜活的人性与创造力。 读罢这些事实,你或许会笑,但更会思考:在那些看似怪诞的幽默背后,藏着多少深夜调试时的心照不宣,又定义着怎样一种用逻辑丈量世界的浪漫。

IT 2013-11-19 23:18:48 / 累计浏览 2,570

两两接触的等粗且无限长的圆柱体

这篇文章从一个生活化的场景——多人碰杯时的接触难题——出发,引出了一个经典的几何学谜题:最多能让多少个等粗且完全相同的圆柱体实现“两两接触”?对于有顶面和底面的圆柱体,Martin Gardner 记录过5个和6个的经典构造,而 George Rybicki 等人更早指出了7个的可能性。 然而,问题的真正难点在于一个更严苛的版本:如果圆柱体是**无限长**的,无法借助任何端面进行接触,情况会如何?这个由 John Littlewood 在1968年提出的挑战,在近期由 Sándor Bozóki 等三位研究者通过数学手段攻克了。他们建立了一个包含20个未知数与20个方程的庞大方程组,并通过数值计算成功找到了两组不同的解,从而证明在无限长的情况下,7个单位半径的圆柱体依然能够实现两两接触。 这篇短文清晰梳理了该问题从有限长到无限长的探索脉络,并展示了现代数学工具如何为解决经典猜想提供新路径。当然,如文中末尾所言,关于不同高径比下的限制情况,探索或许仍在继续。

IT 2013-11-05 23:26:58 / 累计浏览 4,759

个人订阅的10佳博客与相关介绍

作者从自己长期订阅的200多个涵盖数据库、编程、分布式系统等领域的技术博客中,根据更新频率、文章质量及对自身实际帮助等标准,精心挑选并介绍了10个“宝藏级”博客。 这些推荐并非简单罗列,而是作者多年深度阅读后的经验沉淀。例如,ACM Queue上的文章被形容为“顶级论文水准”,尤其在并发与性能领域极具价值;Amazon CTO Werner Vogels的个人博客,则展现了技术领袖坚持写作与阅读论文的独特实践。此外,还介绍了系统性能优化专家Brendan Gregg的技术博客等。 这篇文章的核心在于分享一套经过实践验证的优质信息源筛选方法。对于面临信息过载的技术人而言,这10个博客提供了一个高质量的阅读起点,其筛选思路本身也比清单更具参考意义。

IT 2013-10-29 23:03:22 / 累计浏览 3,210

代码审查不是用来……

这篇文章讲的是代码审查在实践中常被误用的几个典型姿势。作者从自己公司的长期实践出发,总结了四个容易让代码审查变味的陷阱。 首先,别把代码审查当成控制代码的流程关卡。在团队内部,信任比强制审批更重要,流于形式的审查只会引发抵触。其次,它不该是追究责任的审判厅,揪出某个审查者来背锅会彻底摧毁团队的信任。第三,不要将其变为程序员必须完成的枯燥任务,这会扼杀其作为学习与交流机会的乐趣。最后,对代码的批评应当对事不对人,避免演变成互相讽刺的人身攻击。 文章指出,代码审查的真正价值在于促进学习、获得反馈与团队交流。作者通过具体场景描述了这些误区如何发生,旨在提醒团队避开这些坑,让审查回归提升代码质量与团队协作的正途。

IT 2013-10-17 12:30:06 / 累计浏览 7,204

一张图让你看懂各开源License

对于许多开发者来说,开源协议(License)那精炼却晦涩的条款读起来颇为费劲,而且像GPL、MIT、Apache这些常见的名称,它们之间的关键区别又在哪?这篇内容就聚焦于此。它没有进行冗长的文字解读,而是直接引用了一张广为流传的清晰图表,直观地拆解了各类主流开源协议的核心限制点。 图表将不同协议在“是否必须开源衍生作品”、“是否允许闭源商业使用”、“是否要求保留原作者版权”等几个关键维度上进行了横向对比。比如,MIT协议最为宽松,几乎不做限制;而GPL则有着强烈的“传染性”,要求任何修改或衍生作品都必须以相同协议开源;Apache 2.0则在提供明确专利授权的同时,也对保留修改声明有清晰要求。 通过这张图,开发者能迅速根据项目的具体需求(是希望最大程度推广,还是希望保护自身专利,或是要求回馈社区),来选择最适合的开源协议,避免了因理解偏差而带来的法律风险。它将复杂的法律文本,转化成了可直接参考的技术决策工具。

IT 2013-10-15 13:59:04 / 累计浏览 4,212

用TAB缩进, 用SPACE对齐

这篇讨论聚焦于一个经典争议:编程时到底该用TAB键还是空格键来缩进?作者没有简单地站队,而是提出了一个清晰且实用的区分原则。 他指出,大部分情况下TAB和空格都能正常工作,但关键在于用途。对于代码的**缩进**,即行首的空白,TAB是更优解——只需按一次键就能统一缩进层级,避免了数空格的麻烦,也终结了“用两个空格还是四个”的无谓争论。 然而,文章真正的点睛之笔在于强调“对齐”的场景。为了代码的竖直对齐(比如让等号、注释在列上整齐),**必须使用空格**。作者展示了一段代码,清晰地说明了空格在此处的不可替代性,而这与缩进是两码事。 因此,文章最终给出了一个干脆利落的结论:**用TAB缩进,用SPACE对齐**。这相当于为TAB和空格找到了各自最合适的岗位,各司其职,既提升了编写效率,又保证了代码在需要精确对齐时的美观与可读性。对于被这个小问题困扰过的开发者,这篇文章提供了一个清晰的操作指南。