IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

最新文章

采集自各技术站点的近期文章。

IT DevOps/ 2015-01-25 22:26:39 / 累计浏览 4,585

以Facebook为案例剖析科技公司应有的工具文化

这是Facebook早期员工王淮Harry哥分享的一篇关于“工具文化”的深度见解。文章以Facebook的内部实践为案例,阐述了一个核心观点:优秀的技术公司应当将内部工具的开发和维护视为至关重要的战略投资。 文章详细介绍了Facebook如何通过两个核心工具组(研发工具组与网站支持工具组)来支撑其工程效率。例如,从新员工快速获取开发环境,到代码提交前的自动化规范检查、可视化的代码审查(Phabricator),再到无需改代码即可配置的灰度发布系统和多线程更新机制。这些工具的设计哲学是将优秀实践自动化、固化,以“不要让我思考”的方式提升整体效率。文章还提到,这种文化甚至延伸至用户客服、招聘面试和绩效评估等环节。 作者强调,工具文化的益处是“杠杆效应”的累积,能显著提升人均产出、降低协调成本(如用户达1亿时客服团队仍不到20人)。然而,最大的挑战在于如何吸引顶尖工程师加入工具团队。为此,公司需要用具体效率数据说话,并在企业文化中反复强调工具的战略价值。文章最终指出,对于度过初创期的公司,持续打造优秀的内部工具,其重要性甚至不亚于寻找下一个伟大的创意。

本机暂存
IT 设计/ 2015-01-25 21:45:20 / 累计浏览 8,362

为什么现在那么多人应聘产品经理岗位?

这篇文章探讨了当下互联网行业一个有趣的现象:为何产品经理岗位吸引了大量求职者,甚至被戏称为“技术岗的归宿”。 作者从一组真实的职位要求(JD)对比切入,生动地展现了原因。相比于程序员岗位要求明确掌握C++/Java、熟悉算法与数据结构、甚至需要硕士学历等“硬核”门槛,产品经理的职位描述则更侧重于沟通协作、需求理解、逻辑思维等“软实力”。许多求职者在排除了自己不擅长的开发、测试、运维、销售、设计等岗位后,发现产品经理的任职要求仿佛是为自己量身定做——尤其是“愿意吐槽和抱怨”都被幽默地归为这项能力。 这其实揭示了一个深层现象:一些对技术基础不扎实、但渴望进入互联网核心岗位的求职者,可能将产品经理视为一个综合性的、更侧重“软技能”的入口。文章用略带讽刺的笔调,点明了这种“产品经理遍地爬”的局面背后,是岗位认知与个人能力匹配过程中的一种自我选择。对于正在择业或招聘的读者而言,这或许能引发一些关于岗位真实要求与自我定位的冷静思考。

本机暂存
IT 开发者/ 2015-01-25 21:42:37 / 累计浏览 2,187

谈谈选择

作者从自己的高中时期讲起,对物理和化学的热爱最终因高考分数与专业选择的现实考量,转向了新兴的软件工程专业。文章梳理了从高考填志愿、大学毕业考研还是工作,到城市与公司风格转换的一系列重要人生节点,并由此展开对“选择”的思考。 作者的核心观点是,专业选择在很大程度上决定了职业赛道,其长期影响远超第一份工作或学校背景,因为换行业比跳槽的代价大得多。他结合亲身经历强调,在职业早期主动接触多样性的环境和项目,短期未必立刻见效,但长远来看价值非凡,这比盲目追求成功学或宏观规划更为实际。 文中也坦诚地讨论了决策过程中的信息局限性,并以科普作家卢昌海从物理转向计算机为例,说明当事人做出的选择往往有其合理性。最终,作者将视角落回日常,认为培养良好的思维与工作习惯,是应对未来无数个大小选择的基础。

本机暂存
IT 后端/ 2015-01-25 21:39:22 / 累计浏览 7,729

XML和JSON

这篇文章从社区中一个常见的争论出发,客观对比了XML和JSON这两种数据交换格式。作者没有简单地断言谁更优越,而是通过具体代码示例,细致地分析了两者在体积、表达直观性和功能特性上的关键差异。 文章指出,JSON在数据类型区分(如数字与字符串)、数组表示(用[]更直观)以及处理特殊字符(如换行)时更为简洁自然,这些特性使其在JavaScript生态中拥有原生支持的优势。然而,XML也并非没有强项:它支持声明和编码信息,可通过命名空间灵活组合不同定义,并且其DTD和XML Schema提供的验证能力远强于JSON Schema,能实现更严格的自描述和自校验。 在对象转换方面,JSON的解析和序列化在许多语言中已成为基础操作,而XML则通常需要依赖额外的类库和注解配置。文章还介绍了在线转换工具作为实用补充。总的来说,作者的分析平衡而深入,帮助读者理解两种格式各自的适用场景——JSON更轻便直观,适合Web API和前端交互;XML则在需要复杂验证、命名空间管理和文档自解释性的企业级或配置场景中更显稳固。

本机暂存
IT 算法/ 2015-01-25 21:38:28 / 累计浏览 3,506

STL笔记之hashtable

这篇讲的是SGI STL中经典hashtable容器的源码实现。作者从自己动手实现一个简单hashtable的经历切入,发现与STL源码的思路惊人相似,由此展开对底层机制的剖析。 文章深入讲解了SGI版本hashtable的核心设计:它采用开链法解决冲突,节点通过链表串联在bucket中。关键实现的巧妙之处体现在两处:一是迭代器逻辑,当前bucket遍历完毕后,能自动跳转到下一个非空bucket,保证了前向遍历的连贯性;二是容器容量的管理,预置了一张精心计算的素数表来动态选择桶的数量,这能有效降低哈希冲突概率,提升查找效率。 通过拆解节点定义、迭代器操作符和容器初始化等关键源码,文章清晰地展现了hashtable从数据结构到算法选择的完整实现脉络,有助于读者真正理解这个高效容器背后的工程权衡与精巧构思。

本机暂存
IT 算法/ 2015-01-25 21:37:04 / 累计浏览 4,138

STL笔记之二叉查找树

这篇讲的是STL关联容器(如map和set)背后的核心数据结构——二叉查找树及其变体。作者从SGI STL的实现出发,系统梳理了三种关键树结构的区别与联系。 文章首先剖析了基础的二叉查找树(BST),说明了它通过键值左小右大的规则实现对数时间操作,但也指出了其退化为链表导致效率骤降至O(N)的风险。为了解决平衡问题,文章对比了AVL树和红黑树:AVL树是严格的平衡树,任何节点的左右子树高度差不超过1,通过旋转保持平衡,保证了稳定的O(log n)性能;而红黑树通过着色规则和局部调整,在不过分追求严格平衡的前提下,同样实现了高效的查找与动态操作。 最后,文章将理论落地,解释了为何红黑树凭借其在插入和删除场景下更少的旋转次数,成为SGI STL中map、set等容器的底层选择,而不只是理想中“更平衡”的AVL树。这种从原理到工程实现的脉络,对于理解标准库的设计哲学很有帮助。

本机暂存
IT 数据库/ 2015-01-25 21:36:02 / 累计浏览 3,808

Redis编程小技巧拾遗

这篇讲的是作者在阅读Redis源码时,特意“拾遗”的几个精妙的C语言编程技巧。作者从Redis简洁的1.0版本入手,并未重复大众熟知的源码剖析,而是聚焦于那些能让代码更健壮、更高效的小细节。 最典型的是“空数组”技巧:在`sdshdr`和`zskiplistNode`结构体的末尾定义一个空数组成员(如`char buf[]`和`level[]`)。这允许在动态内存分配时,根据实际需要的数据长度(如字符串长度、跳表层数)一次性申请合适大小的内存,实现了结构体内可变长数据的紧凑存储。 另一个常见但重要的技巧是使用 `do { } while(0)` 来包裹宏定义中的多条语句。这不仅能确保宏在if等控制流中像单条语句一样安全执行,文章还展示了将其用于简化流程控制的用法,使代码逻辑更清晰。 此外,文章还介绍了Redis中定制化的断言宏`redisAssert`和分级日志系统`redisLog`,前者在条件失败时能输出详尽的上下文信息,后者则允许根据日志级别进行过滤。这些实现虽小,却体现了生产级项目对可调试性和可观测性的重视。 这些从顶级项目中提炼出的技巧,对任何C/C++开发者都有直接的借鉴意义。

本机暂存
IT 前端/ 2015-01-24 23:46:35 / 累计浏览 2,781

再说iconfont和font-face

这篇讲的是CSS3字体属性中一个让人“蛋疼”又离不开的话题:iconfont和@font-face。作者从网页内容的主体——文字说起,直指@font-face这个能让你彻底摆脱用户系统字体限制的关键属性。文章没有停留在浅层介绍,而是深入拆解了@font-face的语法,逐项解释了font-family、src、unicode-range等参数,并用一个清晰的表格展示了IE、Firefox、Chrome等主流浏览器对不同字体格式(如.eot, .ttf, .woff)的支持情况。更关键的是,它厘清了@font-face与iconfont之间相辅相成的关系:一个负责引入自定义字体,一个负责将图标集打包成字体以便调用。文中提供的兼容性写法代码,对处理多浏览器环境下的字体加载问题直接提供了实用参考。

本机暂存
IT 前端/ 2015-01-24 23:45:27 / 累计浏览 6,987

webapp网页调试工具Chrome Devtools

这篇讲的是如何告别只能拉窄电脑屏幕来模拟手机页面的“土办法”,转用Chrome DevTools中专业的移动设备调试功能。文章指出,简单拉宽电脑窗口并不能真实还原手机屏幕的显示效果,因为手机采用“每英寸像素点”衡量清晰度,与PC端标准不同。 作者将焦点引向Chrome DevTools的“webapp调试界面”,详细拆解了其中几个核心功能。比如,通过“Device”选项可以直接选择iPhone 6等具体设备进行预览,无需手动调整浏览器窗口;“Network”面板允许模拟从离线、GPRS到WiFi的各种网络环境及其延迟,帮助开发者针对不同地区网络条件优化页面加载速度;此外,文章还解释了“分辨率”、“device pixel ratio”(设备像素比)以及视图比例(viewport scale)等关键参数的设置与含义。 对于需要精准还原移动端设计稿、或希望在不同网络条件下测试性能的前端开发者而言,掌握这些调试工具是提升工作效率和页面质量的关键一步。

本机暂存
IT 数据库/ 2015-01-24 23:42:54 / 累计浏览 2,326

关于oracle ebs系统apps的一些故事

这篇讲的是Oracle E-Business Suite(通常叫Oracle ERP)为何被业内亲切地称为“Apps”的技术源流。作者从这个有趣的命名问题出发,回顾了APPS schema的进化史,解答了一个许多开发者都好奇的细节。 文章指出,在早期版本(如EBS 10.6)中,系统每个功能模块(采购PO、应收AR等)都有独立的数据库schema。这导致了一个历史遗留的“小麻烦”:跨模块访问数据时,SQL语句里总得带上冗长的Schema前缀,比如`po.po_headers_all`,写起来颇为繁琐。 为了解决这个问题,Oracle引入了统一的APPS schema。它的设计非常巧妙:APPS schema本身不直接存储表,而是通过为其他所有模块的表创建“同义词”,从而让开发者只需连接到APPS,就能像访问本地表一样,简洁地查询全系统所有模块的数据,无需再写任何前缀。 文章最后总结了几条关键的开发实践原则,比如PL/SQL包和视图都应在APPS下创建,而客户化表则建议放在独立的schema中。这个故事不仅解释了一个称呼的由来,更清晰地展示了Oracle EBS在架构上为简化开发所做的一次重要演进。

本机暂存
IT 数据库/ 2015-01-24 23:41:22 / 累计浏览 2,915

怎么查看oracle ebs的系统版本号以及各模块的版本号

这篇讲的是如何快速定位Oracle EBS的版本信息,这是系统管理和升级时的一个基础但关键的步骤。作者没有绕弯子,直接切入核心需求:如何查看系统整体版本号,以及如何深入查看每个应用模块的具体版本、安装状态和补丁级别。 文章提供了两个现成的SQL查询,分别用于获取系统级版本(从`fnd_product_groups`表)和模块级详情(关联`fnd_product_installations`与`fnd_application`表)。作者特意点明,这类信息查询的关键线索通常在于以`fnd_`为前缀的系统表。对于需要进行版本核对、补丁安装前检查或环境排查的EBS顾问与DBA来说,这几行查询能直接给出准确答案,避免了在界面上层层点击的繁琐。

本机暂存
IT 移动开发/ 2015-01-24 23:40:04 / 累计浏览 2,846

Android利用webView调用JavaScript

在Android混合开发中,WebView是连接Java与JavaScript的桥梁。这篇文章具体演示了实现双向调用的四个核心场景:首先是Android端如何主动执行网页脚本,只需一行代码启用JavaScript并调用`loadUrl`;接着是网页如何触发Java方法,关键在于`addJavascriptInterface`创建可交互的对象;文章进一步深入到参数传递,比如Java向JS函数传参,以及JS向Java方法传参时,需要注意参数应为final类型或使用中间变量处理。 这些示例清晰地展示了交互的基本模式。值得注意的是,自Android 4.2起,`addJavascriptInterface`方法已引入安全更新,以防止潜在漏洞。对于需要频繁进行原生与Web内容交互的开发者来说,掌握这些基础调用方式是构建复杂混合应用的第一步,能为后续的架构设计打下坚实基础。

本机暂存
IT 前端/ 2015-01-24 23:38:58 / 累计浏览 3,711

网页字体排印指南

这篇讲的是网页上那95%的文字,到底该怎么排才好看又专业。作者从“阅读”这个最核心的用户行为出发,把字体排印清晰地分为偏向设计的Creative Typography和偏向技术的Technical Typography,并聚焦于后者,为前端工程师提供一套有迹可循的实践规则。 文章直面了中文网页排版的核心痛点:由于系统预置字体稀少且WebFont体积庞大,我们只能在有限的“系统安全字体”里做选择。为此,作者详细梳理了桌面端(Mac、Windows、Linux)与移动端(iOS、Android)上,中西文字体的推荐组合,并解释了宋体与黑体在内文与标题上的不同角色。 更进阶的是,文章将排版提升到了“旋律”的层面。它借鉴《字体排印的风格要素》中的理念,将字号大小类比为音乐的音阶,提出了以16px内文为基础,对标题字号进行同比例递减的具体方案,旨在构建视觉上的和谐韵律。文末直接提供了两套经过考量的`font-family`代码,分别用于内文和标题,极具实操参考价值。对于任何希望提升页面文字可读性与质感的开发者而言,这都是一份扎实的指南。

本机暂存
IT 开发者/ 2015-01-24 23:30:28 / 累计浏览 5,598

GitHub中的README.MD文件编写语法

这篇讲的是如何用Markdown语法快速上手编写GitHub项目的README文件。文章开篇点明了README采用Markdown格式的最大优势:语法简洁,学习成本低,因此被WordPress、Joomla等众多内容管理平台和博客系统广泛支持。 文章主体并非泛泛而谈,而是聚焦于编写README时最常用、最实用的语法。它详细演示了如何设置大、中、小各级标题,使用星号或下划线实现斜体与加粗。对于展示代码片段,介绍了通过制表符缩进形成单行或多行文本框的方法。此外,还讲解了用大于号实现层级引用,以及灵活创建无序和有序列表的方式。文末也触及了行内式和参考式超链接的基本写法。 对于想快速为项目添加一份清晰、美观说明文档的开发者而言,这篇文章提供了直接可用的语法速查和入门指引,能帮助新手在短时间内掌握README的核心编写技巧。

本机暂存
IT 后端/ 2015-01-24 23:28:37 / 累计浏览 3,318

解决nginx session共享的问题

这篇讲的是在Nginx集群环境下如何解决Session共享这个经典难题。作者从几个不同的维度给出了应对思路。 最直接的办法是“不用”,也就是把状态信息从Session迁移到Cookie,从而绕开分布式带来的挑战,适用于系统改动成本较低的情况。如果必须用Session,应用层面可以借助数据库或Memcached来实现高可用的Session存储,不过这对性能有一定损耗。 文章的重点落在了Nginx自身的两种策略上。一是利用内置的`ip_hash`模块,通过客户端IP将请求始终定向到同一台后端服务器,实现起来简单,但要求Nginx必须处于最前端,且后端不能有其他负载均衡,否则哈希依据会失准。 为了弥补`ip_hash`的不足,作者介绍了更灵活的`upstream_hash`第三方模块。它可以通过自定义的因子(如`X-Forwarded-For`头,甚至Cookie值`jsessionid`)来做哈希,适应了复杂网络拓扑下对会话保持的精细控制需求。 整篇文章梳理了从应用层到网关层的几种主流方案,清晰对比了它们的实现原理、优缺点和适用场景,为在不同约束条件下选择最合适的Session共享策略提供了实用参考。

本机暂存
IT DevOps/ 2015-01-24 23:17:38 / 累计浏览 1,876

怎么清除Windows远程桌面连接的历史记录

这篇讲的是如何彻底清除Windows系统中远程桌面的连接历史记录。问题的根源在于,系统为了方便会记住我们连接过的主机IP和端口,这些信息其实都存储在注册表的特定路径下。对于注重隐私的用户来说,这可能会带来不必要的顾虑。 作者提供了一个清晰直接的解决方法:通过“运行”打开注册表编辑器,导航至“HKEY_CURRENT_USER/Software/Microsoft/Terminal Server Client/Default”这个分支。在这个位置下,所有用过的连接记录都会以MRU0、MRU1这样的字符串值形式存在,它们对应的数值就是具体的地址和端口。只需将这些条目全部删除,下次打开远程桌面连接时,那个历史下拉列表就会变得干干净净。 文章不仅说清了操作路径,还贴心地附上了每一步的截图指引,让不熟悉注册表操作的用户也能跟着做,避免误删其他关键数据。对于那些需要管理多台远程服务器、又想保持连接列表清爽的运维人员或IT管理者来说,这是一个实用且有效的清理技巧。

本机暂存
IT 前端/ 2015-01-24 23:16:57 / 累计浏览 3,250

围住神经猫 1步玩法-”作弊”

这篇讲的是如何通过“破解”微信分享机制,来实现游戏“围住神经猫”分享链接的“作弊”。作者从被朋友圈刷屏后自己试玩出发,发现分享链接的击败百分比与步骤数直接相关,于是产生了一个“纯娱乐”的技术念头:能否自己伪造一个分享页面,让好友看到夸张的“1步通关”战绩? 核心实现思路很直接:分享的只是一个网页URL,因此可以自己生成一个静态HTML页面,自定义页面的`title`(例如“我用了1步围住神经猫”),并引用原游戏的图片作为缩略图,以便微信抓取。关键的巧妙之处在于,为了不让好友点进这个“假”页面,利用浏览器`onload`事件直接通过`location.href`跳转到原游戏网址。 文章进一步深入,指出微信提供了更规范的分享JS-SDK。通过调用`WeixinJSBridge.invoke`接口,可以一站式设置缩略图、标题、描述以及跳转链接,使得这个“小恶作剧”的实现更加优雅和可控。作者附上了相关的JavaScript代码片段,展示了如何配置`shareTitle`和`link`等参数,为想了解微信网页分享机制的朋友提供了一个生动有趣的实现案例。

本机暂存
IT 开发者/ 2015-01-24 23:15:57 / 累计浏览 2,439

C++ 传参时传内置类型时用传值(pass by value)方式效率较高

这篇文章从《Effective C++》的经典条款出发,深入探讨了一个C++开发者常感困惑的问题:函数传参时,应该用传值(pass by value)还是传引用(pass by reference)?作者指出,这个选择并非一概而论,而是取决于参数的类型——文章特别对比了内置类型(如int、指针)与自定义类型之间的行为差异。 为了验证这一结论,文章提供了清晰的代码示例和关键的汇编代码对比。核心发现在于:对于int这类内置类型,传值(`int f(int i)`)编译生成的x86汇编指令更简洁,参数直接通过寄存器传递,效率最高;而传常量引用(`int g(const int &i)`)则多了一次内存间接访问的步骤,尽管微小但在极热路径上可能产生影响。文章也点明了反向情况:当面对存在构造与析构开销的自定义类型时,传引用才能避免不必要的复制成本。此外,STL中的迭代器与函数对象本质上是指针,因此遵循内置类型的规则。 作者通过这次代码级的验证,不仅重申了一个有效的实践准则,更通过底层视角加深了理解:效率的考量必须结合类型特性。这提醒我们,在追求代码“优雅”的同时,也不应忽视特定场景下符合硬件行为的朴素写法所带来的切实性能收益。

本机暂存
IT 开发者/ 2015-01-24 23:14:56 / 累计浏览 4,995

struct与class区别联系

这篇讲的是C和C++中`struct`这个看似相同的关键字,其实内核大不相同。作者开篇就指出了核心区别:C中的`struct`是“原生”的,仅仅用来将一组属性打包成一个整体,没有任何面向对象(OO)的特性。而C++中的`struct`则是在此基础上做了深度扩展,它完全兼容C的用法,但更重要的是具备了OO特性——事实上,C++中`class`能干的事情,`struct`几乎都能干,包括继承和多态。 文章通过一个直观的代码示例验证了这一点:如果在纯C环境下(例如用GCC的C模式编译),在`struct`内部直接定义成员函数会导致编译报错;但同样的代码在C++中则毫无问题。这生动地说明了“原生”与“扩展”的差异。 那么,在C++中`struct`和`class`到底还有何区别?唯一的、关键的不同在于默认的访问权限:`struct`默认是`public`,而`class`默认是`private`。这个细微差别决定了代码风格和设计意图。通常,我们用`struct`来封装纯数据的聚合体,而用`class`来定义那些需要隐藏实现细节、提供接口的抽象数据类型。这篇小文通过对比和代码解析,清晰地帮你厘清了这个C++程序员常会遇到的疑惑。

本机暂存
IT 算法/ 2015-01-23 23:56:07 / 累计浏览 5,919

位运算小结(按位与、按位或、按位异或、取反、左移、右移)

这篇讲的是位运算的基础知识系统梳理。作者从计算机底层表示数字的“补码”概念讲起,为后续运算奠定了基础,然后逐一拆解了按位与、或、异或、取反、左移、右移这六种核心操作。 文章没有停留在理论定义,而是用同一个数字(10与-10)作为贯穿始终的例子,详细演示了每种运算的二进制计算过程与最终结果。这种对比式的呈现方式,让不同运算符之间的逻辑差异(比如“与”是“都真才真”,“或”是“有真就真”)变得一目了然。 文中还特别提到了异或运算的一个巧妙应用:利用其“任何数与0异或结果不变”的特性,可以实现两个变量的交换而不借助临时变量。这个经典的算法小技巧,为实用的运算知识增添了工程色彩。 对于需要回顾计算机底层操作、或在实际编程(如权限管理、标志位处理、算法优化)中直接使用位运算的开发者,这篇文章提供了一份清晰、直观的参考手册。

本机暂存